"At some point, hundreds of utilities later, the code you've written doesn't look pretty."
Personally I find diving through a bloat of identifiable tailwind classes allows me to review/change/adapt/create UI code MUCH QUICKER than having to re-learn some other abstraction or naming convention that some other developer came up with.
Complaining that lots of Tailwind classes "don't look pretty" makes me think the author has never worked on large projects/refactors using it.
To me Tailwind hits the perfect level of abstraction:
- not too low-level; allowing us to easily review/identify patterns in the code (p-0, leading-3, etc..)
- not too high-level; allowing us to not have to relearn a visual/naming pattern for every new project (.card, .button, etc..)
It boils down to being a search problem: how much of a language/DSL feature can I fit in my head? Reviewing a wall of CSS is harder for me to "search through". On the other hand a wall of Tailwind hits the right spot.