Making components take tailwind classes is a dicey proposition at best. You can’t just put a set of tailwind classes after another set and expect them to do the right thing, because later classes in the class string don’t override earlier ones, its all based on how “specific” the CSS that class applies. In looking for an example, I found a similar package for js that illustrates the need for it: https://www.npmjs.com/package/tailwind-merge.
I’m (slowly) building a set of utilities to help make more “tailwind-y” components, and also to be able to leverage tailwind in other ways. This library isn’t published to hex yet because it will need some more love, specifically it needs a lot more merge logic. It currently only handles some basic things.
Eventually, I could also see it supporting other kinds of directives to help overriding what a component does. For example, if a component sets something like bg-blue-500 hover:bg-blue-600
, but you want it to use bg-red-500
always we could support something like <Component class="all_directives:bg-red-500" />
. Or if you wanted to remove a class that the component adds, you could do so with <Component class="remove_class:bg-blue-500" />
.
The ideas above are dubious, not sure if they are a good idea, but the point is that the potential for them is there The part I am sure of is that having a class merger will allow us to write better components that can take tailwind classes and use them as overrides for their own classes.
It also handles merging a list, as well as conditional classes and nested lists, so in the end you might have something like this:
class={classes([
"inline-flex items-center justify-center gap-2 text-sm font-medium font-sans transition-colors duration-300 disabled:cursor-not-allowed flex-grow-0",
handle_button_hierarchy(@hierarchy),
handle_button_size(@size, @show_label),
[
"flex-row-reverse": slot_position == "trailing",
"w-full": @expanded
],
@class
])}
The other thing it currently does is defines functions that map to your tailwind colors, if configured with a tailwind.colors.json
file to use. For those trying out LiveViewNative, this means you can reuse any custom tailwind colors, i.e <text color={primary_light_600()}>{@text}</text>
. We could perhaps find other ways to make tailwind the “source of truth” that can be shared between web and LiveViewNative?
Curious to hear your thoughts! If we can get a few more people interested to help build out the class merging rules, and especially if we can make it more integrated with the tailwind config, that kind of thing.