In a nutshell: Basecoat is a port of shadcn/ui to HTML and Tailwind CSS. It's a modern, themeable component library; everything from buttons to comboboxes and dialogs.<p>Why? Well, I got sick of React and moved over to a more "old school" stack (Python, HTMX, Alpine.js and Tailwind).<p>The one thing I missed was shadcn/ui [1]. Nice defaults, well thought out design system, easy to theme and great to build your own component library with.<p>I didn't find the alternatives compelling: Flowbite, Preline and the likes encourage you to copy/paste dozens of classes for each element.<p>That's not how I use Tailwind. I love the utility-first approach, but I don't want walls of classes for each button, form element or tooltip I have in my app.<p>I had been building my own component library for a project I’m working on (a Vercel for Python apps) and realized it may be worth my time to firm things up.<p>Why I think it's cool? Well:<p>- No React. Just Tailwind CSS (with a tiny bit of Alpine.js if you choose to). You can use that with whatever stack you want.<p>- Jinja and Nunjucks macros. I hope to support more template engines.<p>- 100% compatible with shadcn/ui themes (you can play with the theme select box on the site).<p>- Super easy to install and use (there's even a CLI).<p>- Accessible, with ARIA support.<p>- Did I mention no React?<p>Hope some of you find it useful.<p>[1]: <a href="https://ui.shadcn.com/" rel="nofollow">https://ui.shadcn.com/</a><p>[2]: <a href="https://v4.shadcn.com/" rel="nofollow">https://v4.shadcn.com/</a> (this is actually the new/upcoming version of shadcn/ui).
Not working in Safari. Did you, perchance, test this only in Chrome?<p>A sampling of error messages:<p>- Failed to load resource: Load cannot follow more than 20 redirections<p>- Cross-origin script load denied by Cross-Origin Resource Sharing policy.<p>- TypeError: window.basecoat.registerDialog is not a function. (In 'window.basecoat.registerDialog(Alpine)', 'window.basecoat.registerDialog' is undefined)<p>- Alpine Expression Error: Can't find variable: sidebar<p>and so on and so forth. It just goes downhill from there.