Thanks for your input! I like that you gave a good amount of detail in the other side, and you brought up some valid points. Allow me to address a couple of them while explaining why I think Tailwind CSS is doing so well and is so much more than just "Bootstrap repackaged."
1. Utility Classes vs. Scoped Styles
You're spot on that CSS Modules shine at keeping styles scoped and avoiding specificity wars. Tailwind, on the other hand, brings a different kind of abstraction—that's not to replace CSS but speed up workflows and encourage consistency. Centralizing design tokens and rules in a configuration file can establish a shared design language, removing many subjective decisions from the individual developer level.
Utility classes are not the way to bypass CSS. They are about rapid iteration. They fit well within modern component-driven frameworks such as React, where styles more often need to be deeply coupled with components.
2. Modern CSS Features
Indeed, CSS has come a long way with Grid, Flexbox, clamp(), and container queries. Tailwind doesn't replace these features-it wraps them in a convenient, composable syntax. For instance, a utility like grid-cols-3 or flex is often faster and more readable than repeating the same declarations across files.
Another, for those preferring traditional CSS, is the @apply directive from Tailwind that still enables one to have utility-first benefits. This way, you will be on the middle ground that lets you be flexible with either.
3. Separation of Concerns
This is true, because utility classes do put style information in HTML, but also ensure that styles and logic stay close to the component. In modern development paradigms, components often contain behavior, appearance, and data in one place.
Long-term maintainability is always a concern, but Tailwind mitigates this through its robust JIT engine, configuration files, and tools like Prettier plugins for Tailwind. Overriding can happen, but with thoughtful configuration, it can be minimized.
4. Developer Growth
Talk me through the notion that Tailwind discourages developers to learn CSS. I have thought of it as somewhat of a learning accelerator—a repeatitive detail abstractor but still requiring an ultimate understanding of CSS concepts to create the utility classes that someone uses.
Mostly too teams are using Tailwind at that point with more advanced styles and techniques when they come to building more complex elements. It's not some sort of either-or or exclusive tool but a quite complementary one.
5. Why Tailwind?
The primary argument for Tailwind isn't that it "replaces CSS" but that it optimizes workflows for teams and individuals. It emphasizes convention over configuration, reduces context-switching, and allows developers to focus on building features rather than rethinking design tokens or CSS architecture for every project.
Let's Collaborate
Your points about CSS Modules and modern CSS tools are well-taken, and I agree that they are excellent solutions in many contexts. I'd love to hear if there are specific cases where you feel CSS Modules have provided a clear advantage over utility-based systems like Tailwind. Conversely, I'd be happy to share scenarios where Tailwind shines.
Looking forward to continuing the discussion