benlime
I created a new library GitHub - benvp/ex_cva: Class Variance Authority for Elixir · GitHub which aims to make it very easy to define different variations of function components. I experimented and tweeted about it a bit and I really like how the api is looking now.
This library is heavily inspired by the amazing work of Joe Bell on GitHub - joe-bell/cva: Class Variance Authority · GitHub in the JS world. The approach reasonates so much with me, that I wanted to have something similar in the elixir world.
What do you guys think?
Trending in Announcing
Hi, I would like to tell about my initiative to further maintain and develop Waffle project which is the fork of Arc library.
The progre...
New
I fully migrated to my own harness from Anthropic/Gemini and I think it’s time to share it. Welcome DSH, the DeepSeek Harness, fully writ...
New
Localize is the next generation localisation library for Elixir. Think of it as ex_cldr version 3.0. The first version will be released ...
New
Beam Bots (or just BB for short) is a framework for building fault-tolerant robotics applications in Elixir using familiar OTP patterns. ...
New
ExRatatui lets you cook up rich terminal UIs in Elixir, powered by Rust’s ratatui via Rustler NIFs. Build interactive terminal applicatio...
New
I’ve moved the strategies out of PowAssent and created a multi-provider framework for Elixir. This way the strategies can be used in any ...
New
Aloha gang,
There’s a new class of AI model out from TypeSafe. Jev is their flagship model. You can learn about it here:
...
New
Other Trending Topics
Hey there,
I haven’t seen a list of useful Elixir specific skills for the popular AI tools yet so I’m starting one here with my first.
...
New
Hi everyone :waving_hand:
I wanted to share something I’ve been building — NowBlind, a random chat app designed to help people discover ...
New
(I just needed to vent somewhere and LinkedIn is full of hope, or hype, I’m not sure which exactly)
AI dream has many faces, but general...
New
With advancements in AI gathering pace and set to increasingly accelerate, perhaps it’s worth having an annual thread on the topic - feel...
New
If you haven’t tried Hologram yet, what’s stopped you?
Here’s why I’m asking. Building a framework turns out to be two jobs, the framewo...
New
Popcorn, the library that runs Elixir code in the browser, is now stable :popcorn:
This is possible because it now builds on a very stab...
New
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #library
- #deployment
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #elixirconf
- #channels
- #exunit
- #code-sync
- #discussion
- #podcasts
- #javascript
- #onsite
- #dialyzer
- #docker
- #authentication
- #ai
- #umbrella
- #elixirconf-us
- #full-time-contract
- #podcasts-by-brainlid
- #blog-post
- #ecto-query
- #elixir-ls
- #phoenix_html
- #iex
- #graphql
- #genstage
- #websockets
- #supervisor
- #advent-of-code
- #distillery
- #elixirconf-eu
- #processes
- #security
- #api
- #forms
- #performance











Showing Posts 1 to 6- Show Best Posts
- Show All (oldest first)
- Show All (newest first)
LostKobrakai
I just had a quick look at the readme, but wanted to leave a thank you for retaining the simple functional API. Macros are great, but I’d be worried wrapping
Phoenix.Componentthat things will break with future liveview versions, but I can see myself using the plain API.benlime
I separated the both apis because they are building upon each other. So the core logic is just constructing the proper class names and the declarative api is build upon it to make it a little more convenient.
I understand that something potentially could break on new LiveView versions but I’d argue that the risk is quite low. The macro based approach essentially
Phoenix.Component.attr/3calls withvaluesderived from the variant.Phoenix.Component.assign/2. This is the same approach which LiveView does internally for declarative components.I’m not touching LiveView internals and only use public apis.
Scenarios where it could potentially break:
attr/3api in a breaking manner.I think that’s both pretty unlikely. And even if it happens, as the cva macros api is very thin layer.
benlime
I just released version
0.1.2ofex_cvaand improved the docs a bit after receiving some feedback.The version fixes an issue which would always apply
classassigns if it was present, even if@classhas not been explicitly passed into the component. This could end up in having duplicate classes if a component configures variants and accepts aclassassign.jondelmil
Thanks for the very nice library!
I’m curious how you recommend dealing with variants that arise from the presence of HTML attributes. For instance,
vs
should be styled differently.
In my example above, the original CVA lib seems to recommend making
disabledanotherintentvariant which I’ve done for now, but do you have advice for composing these more easily?benlime
Thanks for bringing that up Jon. I found a few things in the library when using that approach.
In general I agree with the way the original CVA library recommends on handling things like
disabled. Adding a new boolean variant if the way to go. Otherwise you could also add classes with the:disabledcss pseudoclasses to style the button, when it’s disabled.Starting with
0.2.0of ex_cva you can do sth like the post recommended. Read below.benlime
I just release version
0.2.0of ex_cva.[v0.2.0] (2022-12-06)
Improvements
variant/2now properly supports boolean values. You can now do something like the following: