Killing our Alpine.js dependency
For a long time, the interactive bits of Petal Components rode on Alpine.js. Dropdowns, modals, anything that needed a little client-side behaviour reached for Alpine. It worked, and Alpine is genuinely lovely. But it always felt slightly off to ship a separate JS framework alongside a library that's meant to feel native to Phoenix.
Phoenix has its own answer now. LiveView.JS lets you express client-side behaviour, show and hide, toggle, transition, without leaving the framework. So we set about moving components over to it, so that Alpine becomes optional instead of required.
Most components were straightforward. One or two were not. The dropdown in particular gave us grief, because getting click-away behaviour right (close the menu when you click outside it) was fiddly to do cleanly without Alpine at the time. We weren't the only ones hitting it, and once the underlying pieces improved in LiveView itself, it got a lot easier. That's the quiet upside of building on Phoenix: the platform keeps moving under you, in a good way.
The payoff is a library that asks less of your project. If you want Alpine, you can still use it. But you no longer have to pull in a whole framework just to open a menu. Fewer dependencies, fewer surprises, and components that feel like they belong in the app they're living in.