com

com

TL;DR: I feel that I am doing something really wrong, but don’t know what it is. <.button> color overrides using standard colors seem very Schrodinger to me, they come and they go, and it’s not clear why.

TL;DR working hack I’ve got a solution that means that button colors work by cloning the CoreComponents button function into uncolored_button, and removing the “bg-zinc-900 hover:bg-zinc-700” terms from the class list. This is a hacky work around, but good enough for production.

Problem

I needed to set background colors in the <.button> tag for a state machine driven interaction, graying out buttons, using something like “bg-gray-300”, changing button text etc

Due to the nature of the relatively complex business logic that I wanted to make explicit in the template, it was easier to repeat the tags in a set of HEEX <%= if %> structures than using {@variable} interpolation.

Challenge

Whenever I did a mix clean as part of a release process, the button backgrounds would no longer work.

If I changed the specific <.button> class to “bg-red-400” or something, they worked again. Until they didn’t and everything reverted to “bg-zinc-900”.

Tailwind class strings

I had assumed that Tailwind class attributes were like CSS, which is “last defined, wins”. Apparently not the case from doing some Internet research, which is genuinely a bit of a surprise.

Web inspection showed my bg-red-400 or whatever at the end, but it was bg-zinc-900 that seemed to happen.

Reversing the class list in <.button>

I tried putting @class in front of the CoreComponents defined class attributes list but that only sometimes worked.

Working hack solution

See above. It works, but isn’t very satisfying.

Questions

  1. Why does this happen?
  2. What - if any - relation does this have with tailwind interpolation?
  3. How can I fix my styled use of CoreComponents to actually work reliably?

Thanks!

Showing Posts 1 to 2

cschmatzler

cschmatzler

  1. Why does this happen?

Because “I had assumed that Tailwind class attributes were like CSS, which is “last defined, wins”.” is incorrect. It’s "last defined in the CSS file wins and that depends on Tailwind’s internal logic. Your “works until it doesn’t” situation specifically happens because:

  1. You first start the dev server, Tailwind generates existing classes.
  2. You add a new class with a new color while the dev server is running. Tailwind appends the new class to the CSS file. Now it’s last defined wins.
  3. You clean and rebuild from start. Now your class added in 2 will be put somewhere else in the file, not at the end anymore.

In particular, colors are defined alphabetically in the resulting stylesheet, and zinc is after red.

  1. How can I fix my styled use of CoreComponents to actually work reliably?

Wrap your component’s class attribute with Turboprop Merge (disclaimer: I built it) which removes conflicts like these and changes it to be like you expected: last defined wins.

com

com OP

Thanks! That’s great, it addresses the Schrodinger effects I see, which was driving me mad…!

Would you suggest just wrapping every class attribute list in CoreComponents through Turboprop Merge to get results that match developer intent?

— All posts loaded —

Where Next? Top

Trending in Questions Top

Blokh
Hey guys, I’ve got a huge CSV ( around 10 GB ) that needs to be processed hourly Do you guys have any suggestions what is the best prac...
New
RSP87
I’m working on a project that simulates the bumbl example in the programming phoenix book. It acts almost like an email client. We have a...
New
kszambelanczyk
Hello! Could someone please give me a help/sample code, how to delete a file from s3 using waffle/waffle_ecto from Phoenix app. I creat...
New
RemyXRenard
I’m seeing that a list inside a Kino.DataTable will be interpreted as a charlist, even if the Kino.configure() is set to charlists: :as_l...
New
velrest
So my question is quite simple and i have found no conclusive answer on forum, google or AI. Should we use :erlang.float for Integer to ...
New
samoloth
Hi, I’ve just set up an application with ash_authentication. There is only magic link strategy for now, so there is no confirmation add o...
New
FlyingNoodle
If a change or preparation module uses Ash.Changeset.get_argument/2 or Ash.Query.get_argument/2 (or any of the other get_argument functio...
New

Other Trending Topics Top

mudasobwa
I am happy to introduce the very α version of the new programming language compiled to BEAM. Welcome Cure. It has literally three kille...
New
garrison
Hobbes is a low-level distributed database for the Elixir programming language. Hobbes provides a simple, safe, and scalable storage lay...
New
marciok
Hi there! We created Gust: A task orchestrator inspired by Airflow. For those who have never heard about Aiflow, it’s a Python-based wor...
New
jimsynz
Beam Bots (or just BB for short) is a framework for building fault-tolerant robotics applications in Elixir using familiar OTP patterns. ...
New
Damirados
Hello everyone. After busy few months I am happy to announce v0.1.0 of Emerge &amp; Solve. They are GUI (Emerge) and State management (S...
New
netoum
Corex is an accessible, unstyled UI component library for Phoenix that integrates Zag.js state machines using Vanilla JavaScript and Live...
New

We're in Beta

About us Mission Statement

Options

Thread Display Mode




Thread Preview

Skip Thread Previews