Adam Aho

Adam Aho

@adamaho.com

working on https://winnie-ui.com (alpha)

9 followers35 following58 posts

All the shadcn peeps are sleeping on react aria. Devon and team continues to deliver incredible value. Its by far the most comprehensive react component library out there. That is the reason I have chosen it as the foundation for Winnie React.

I can see how cursor can cause you to stop thinking. I finally got around to trying it today. Once it learned my codebase, I found my self just tabbing to complete most things. I know I am just scratching the surface here, but I already miss typing lol.

Thanks to react aria, Winnie React can benefit from defining the tanstack router types on components that use `href`. This means Winnie's Link, ButtonLink, NavigationItem, and many others will have typesafe `href` props. Super cool stuff.

Decided to swap out the react aria disclosure for the base ui collapsible for NavigationDisclosure component in Winnie React. I needed an easier way to change the rendered elements to maintain accessibility. Still going to use react-aria for pretty much everything else.

Initial iteration of Menu component done for Winnie React. I am really really liking some of the abstractions Winnie affords. You can dive into the tools at any level and make them what you want. Winnie React just represents one way to do things.

I'm convinced that polymorphism in components is not needed when you have the right style abstractions. Need an anchor that looks like a button? In Winnie, just add `data-component="button"` to it, and now it looks like a button.

React Aria doesn't use polymorphism to transition behaviour across components, instead they use context. It takes a bit to get used to, but I think it is the right abstraction in this case if you lean heavily into using css to fill the gaps.

Winnie strikes a nice balance with the support of tailwind. Only works in v4 though thanks to the css only config. Get all the power of Winnie CSS with tailwind.

I like to use tailwind as the utility layer in application development. It is the best way to apply styles for layout to components that have been hand-crafted with raw css. The upcoming Winnie React will support this workflow out of the box.

PS. In the world of React components, React Aria really needs more love. It's the only unstyled library with almost everything you need. With the addition of Autocomplete, I think it might get even closer

winnie provides entry for developers on on different levels. Want total control over the system? use only Winnie css and integrate with any framework you want. Next step up is React. I’m currently working on a wrapper of Winnie components in react with the help of react aria.

View full thread

Or finally, you can use Winnie Themes. A thin layer on top of the React components that applies the colors and opinions for you, all you need to do is choose your accent color, radius and scale.

All of these things are the end goal of Winnie. I want people to be able choose whatever journey helps them get from 0-1 on their next project.

winnie provides entry for developers on on different levels. Want total control over the system? use only Winnie css and integrate with any framework you want. Next step up is React. I’m currently working on a wrapper of Winnie components in react with the help of react aria.

But remember, components in Winnie are spatial. They have no opinions on the color, borders, font weight, family, etc. So you can add your own skin on those components to match your brand.

Astro 5 update for the Winnie docs was pretty seamless. Although, I think I need to wait to upgrade to react 19. At least for now.

Update: manage to update to react 19. But needed to change client:load to client:only=react to get rid of the duplicate react error. Seems fine for now.

Excited to see how @base-ui.com implemented css transition support into their components. This is a super underrated feature imo. For the Winnie showcase, I spent a lot of time fine-tuning the layout sidebar component to support transitions.

Why are they great? They are cancelable. Which makes things feel more native. Imagine you had to wait for an animation complete before you were able to close or open the sidebar. The same is true for dropdowns, dialogs, popovers, etc.

Winnie Components: ✅ Tooltip 👨🏼‍🍳 Dialog? Or do I keep working on Showcase? I am still a little stuck on that.

Do people prefer to copy and paste code the shadcn way now, rather than installing from a registry as a lib? If so, how do you update your stuff when things change? How do updates work when you've made changes to the code you've copied?

Working on a tooltip component for Winnie. Should I support multi line styling? Typically tooltips should be a single line of concise, descriptive text. Also gets a little weird if you want to include keyboard shortcuts.

One thing I have noticed about other demo apps in the wild is that noneo of them support writes. They are all read only. To me I feel like that doesnt convey the value enough. I want to be able to use something real, even if just for 5 mins.

So for Winnie, I have decided to make the showcase app support mutations. Local only purely with local storage. That way people can see what it feels like to use an application built with Winnie for real, instead of just clicking around in read only mode

In my experience pure css thrives in design systems and libraries. Often times these use cases require many variants, sizes, colors, etc. something I find to be hard to read and quite verbose in other utility class type libraries.

However, I think utility classes have a place in application code. Where you use them to sprinkle styles on top of already existing components from your design system. This tends to be the balance I strike between pure css and something like tailwind.

And of course, each of these things should be on a different cascaded layer. For Winnie, I use the following layers in order of precedence. reset, base, component, ds, utilities

The showcase is definitely a work in progress right now, but I plan to use it as an example for how you can apply Winnie primitives in a real setting. Thinking about making it just a local first app where writes are persisted in localstorage or indexeddb. Stay tuned!

react-aria has been my go to recently. It feels like Devon has thought of everything. I just finished implementing an accessible drag handle with the help of useMove

that being said, I wonder if a command pallete type component is coming any time soon. cmdk is about the only component remaining for me to fully migrate over

You are up to date.