top | item 39416558

Tailwind CSS marketing and misinformation engine

128 points| todsacerdoti | 2 years ago |nuejs.org

117 comments

order
[+] oxidant|2 years ago|reply
One thing I would like to see is a re-implementation of the button in your style of CSS to strengthen your position. I'm not siding with either approach, I just think it would make the article better.

Your, "don't make things cleaner"/"make clean things", images show part of the Tailwind classes used to make the black button on one side and the class "primary" on the other. Elsewhere in the article you define "primary" as only setting the text color to white.

I believe the specific example is a strawperson argument - you're asserting that semantic CSS (as you've defined in the article) is better than Tailwind's approach. However, you don't show an alternative.

---

On a personal note, I've never seen custom (S)CSS written in a maintainable way in my ~decade writing it professionally.

Encapsulating styles by colocating them with the markup (Button.jsx and button.css, styled-components, Tailwind, etc) is the most maintainable way.

I think Tailwind works really well because it eliminates collisions at the global level and makes it really easy to see what a piece of markup will look like without having to change contexts.

As a fan of Tailwind's approach, I like to hear the other side.

[+] tipiirai|2 years ago|reply
Hey. Thanks for the comment. I could add that, but wanted to focus on the title of the article: the technological origin, vendor lock-in, and their messaging scheme.

I have written a different article about Tailwind vs semantic CSS, which compares the amount of code needed to implement the same thing and how the resulting site is order of magnitude smaller with the semantic approach:

https://nuejs.org/blog/tailwind-vs-semantic-css/

[+] M4v3R|2 years ago|reply
Like many I was initially skeptical of Tailwind because I thought it made the code look “ugly”. But then I started using and almost immediately noticed the productivity boost. Two things that I noticed while using it was 1) I never knew how much I disliked naming things before I didn’t need to do that anymore and 2) how big of a mental burden it was to keep the mapping between the id/classes and the CSS, not mentioning the whole cascading part where you could never actually be sure just from glancing at the code what will be the resulting css. That second point is probably the most understated feature of Tailwind - you never have to wonder about the styling of an element again, because everything is right there in the classnames. The added benefit is that it basically forces you to write your UI code using components to prevent repetition - it encourages the best practice (note that this is where I think the OP went wrong when they asked “How to clean things up?” - the “@apply” keyword exists but it’s not meant to be overused as a replacement to proper code refactoring).

It’s not without its flaws - you have to learn a new syntax (which is in most cases very intoitive, e.g. “align-items: center” becomes “items-center”, “margin: 0” becomes “m-0” etc.) and it has its gotchas (for example it generates the css at build time by scanning your code and extracting classes you use to prevent generating unused css, which makes it impossible to construct a classname dynamically e.g. `gap-${value}`) but I take these issues over having to write CSS in any other way.

One point where I 100% do agree with the author though - you should first learn CSS before learning Tailwind. Not only because Tailwind could go away some day, but because this will give you a deeper understanding how and why stuff works.

[+] fabiospampinato|2 years ago|reply
> 1) I never knew how much I disliked naming things before I didn’t need to do that anymore

I never understood this argument about naming. You need to name the component anyway just to be able to reference it somewhere? You need to give the folder or the file where this component is defined a unique name anyway? Internal nodes technically don't need to be named when using Tailwind, but if for example I'm writing a Slider component, do I not want to name the "handle" thing that can be dragged anyway? How was finding the "handle" word a non-insignificant hurdle? And if I need to talk about this element with a colleague what would you call it anyway?

[+] tipiirai|2 years ago|reply
Naming things is notoriously hard, but it's a skill you need to master to make reusable things. You name things that repeat. Think of function names in JavaScript, class names in object-oriented languages, or component names in Figma.
[+] nrk9819|2 years ago|reply
Unlike many, I was never skeptical of Tailwind. A few years ago, I'd chase whatever the "cool" and "trendy" thing in the market. So I started using tailwind in 2021. Initially it felt very productive especially for personal projects. Then over time, as utilities increased, so did my cognitive overhead.

Also I'll never be able to understand to point of having extremely atomic utils like `bg-color-green-100`, `pb-40` and such. We have custom properties for that and for a large design system, maintaining variables in a css file is more ergonomic than editing a tailwind config.

[+] williamcotton|2 years ago|reply
The key point in this article is not Tailwind.

It is the endless susceptibility by software developers to marketing campaigns.

There are real costs to the use of any tool and these are completely glossed over by someone looking to sell you goods or services.

Here are some very real costs: technical attrition, maintenance, and training.

Technical attrition: Perhaps some people would use the terms amortization or depreciation, but I consider software to be in a separate class than intangible or tangible assets, the point being, there is a rather short shelf life for almost any technical product. CSS isn't going anywhere but tools like Bootstrap will come and go.

Maintenance: The old version of a CSS wrapper will stop receiving support and require upgrading to the new version which will take significant time and effort.

Training: There are orders of magnitude more individuals that know CSS than know Tailwind and they will be less productive for a given period of time.

[+] darkhorse13|2 years ago|reply
For me, Tailwind is great because it actually popularized utility classes. Sure, there were others that did it first, but the approach as a whole is widely accepted and seen as a productivity boost. I remember when this was thought of as a really bad idea when it's clearly not. Now I think I have written more CSS than a majority of the population[1], and for me, the most productive workflow is the following:

- Semantic class names for components like buttons, sidebars, etc.

- A wide range of utility classes to fill in the rest.

Utility classes (in my opinion) are absolutely the best way to handle different types of layouts, positioning, and spacing. Especially when it comes to overriding the component level ones from the semantic class names. This is not a novel approach by any means, I mean Bootstrap does it and it's still great.

[1] https://www.gethalfmoon.com

[+] tipiirai|2 years ago|reply
Makes sense. There are multiple reasons to group things and give them a semantic class name. And inline styling is a common practice to override parent styling. This is different from what Tailwind teaches us.
[+] JLehtinen|2 years ago|reply
Being a designer who does his work inside code, Tailwind is a nightmare. I hand off my design files, the developers do their thing. But then, maybe I want to tweak things after a review, or the design system changes, so I have to do a sweeping change to those buttons. Now I need to touch dozens of jsx/tsx files around the platform and make humongous pull requests, and the result is often dozens of merge conflicts. If I only touched CSS/SASS files, there might not even always be a need to have the files reviewed.

Another problem is readability. When things aren’t getting named, the files are often unreadable at first glance. And that’s what they are to external services like Pendo, which rely on classes to tie their thing into the UI. Which are now susceptible to change on a very regular basis, because when you change Tailwind styles “that only changes that particular instance”, or so the story goes.

[+] nrk9819|2 years ago|reply
I second this, as a designer. Maintaining atomic tokens in plain css as custom properties is much more ergonomic than having utility classes.
[+] oxidant|2 years ago|reply
> ...I have to do a sweeping change to those buttons.

Why aren't those buttons encapsulated in reusable components or templates?

What sorts of changes do you need to make where this is an issue?

[+] pcthrowaway|2 years ago|reply
> Now I need to touch dozens of jsx/tsx files around the platform and make humongous pull requests, and the result is often dozens of merge conflicts

This can be mitigated by enforcing one-classname-per-line, but it's admittedly not the standard

[+] unculture|2 years ago|reply
Option 1: Find a visual error, open devtools, find the nearest most descriptive class or id (.primary? Oh no…), open IDE, global search in styles folder structure (most likely but not the only place to find CSS) for “.primary”. 40 files returned. After 15 minutes find a file that looks like it might be the right one. 10 minutes to understand the CSS (lots of advanced CSS in here…). Find the cause of the visual error, make the 1 line change. 30 minutes - job done.

Option 2: Find a visual error, open e.g. React Devtools, find the component name, open the IDE, find the component source file, find the HTML, change the utility style class, job done - 5 minutes.

These are not contrived examples. I had a one liner take 40 minutes to find in a codebase a couple of weeks ago. Not an exaggeration.

I really used to believe in separation of concerns but I don’t any more, because of all the time I’ve had to spend fighting with “option 1” codebases over the years. Pretty much any big codebase with normal CSS is going to be an “option 1” eventually unless it’s the work of a single good CSS developer (rare skill), or a team where someone who’s a good leader also cares about CSS enough to enforce a convention like BEM in perpetuity (even rarer skill).

Anyone building anything complex these days is using some component abstraction - whether it’s client side or not - to manage complexity. May as well make use of it for styles if it’s already there.

The reason that there’s a backlash against separation of concerns, the cascade, and (low) specificity is that each of these things is a complete disaster for maintainability in the long run.

One note in making an example of that Catalyst button. If you wrote out all the styles required to do the amount of work that button is doing it would also be extremely difficult to understand, and what’s more, it’d be in a completely different file to the single thing that gives it any meaning - the HTML.

[+] Timon3|2 years ago|reply
This is exactly my experience as well. CSS in bigger codebases becomes unmanagable pretty quickly, and making small changes can become a big pain point. Tailwind doesn't completely solve this problem, but it absolutely improves it by reducing the distance between related concepts - and that's always a good thing.
[+] jacurtis|2 years ago|reply
I have no idea how tailwind has gotten so popular.

Tailwind is a way to justify writing inline css in our HTML. This was once considered the cardinal sin of a frontend developer. You avoided inline-css at all costs.

But now Tailwind just makes a class for text-color-blue which simply abstracts the `text-color: blue;` css property away into its own class. But don't fool yourself, you are just writing inline css by a different name.

There is no way to explain how it is more maintainable to write `class="rounded button hover:bg-color-black-700 bg-color-black-400 active:bg-color-black-500 focus:bg-color-black-500 rounded-sm text-sm text-color-gray-300"` instead of just `class="btn btn-primary"` using the "old-school" semantic approach. I can list numerous advantages of the semantic approach here. The only advantages of the tailwind approach is that you can style as you go and you can see the resulting style in the HTML page.

Tailwind fanboys will say "it's easier to style in the html". But that's not true. Tailwind to be done right needs a fairly complex set of tooling to enable the hot-reloading, minification, and parsing into your pipeline. None of this is necessary with simple CSS. Semantic CSS "just works" with no tooling whatsoever.

Then again, I'm old enough to have contributed to the famous CSS Zen Garden back in the day. So maybe I am just an old curmudgeon. But like all things, I expect that Tailwind's popularity will wane. Remember that before Tailwind, everything was Bootstrap. The point is that whatever tool lets developers be lazy and avoid learning fundamentals will be the tool that prevails.

[+] solid_fuel|2 years ago|reply
I think the divide here is whether or not your stack includes the concept of components. I think it's perfectly maintainable to write `class="rounded button hover:bg-color-black-700 bg-color-black-400 active:bg-color-black-500 focus:bg-color-black-500 rounded-sm text-sm text-color-gray-300"` because I only write it once, in my Button component. Then everywhere else, I just write `<Button>Inner Text</Button>`.

The key difference is when I want to change how my site's Buttons look or behave, I only have to look in the `button.ex` file, instead of tracking down the relevant button classes in a mess of CSS files.

Tailwind is not a good solution if you're writing something for CSS Zen Garden or a my_blog.html type website. Of course the repetition will render it an unreadable mess. But it is a wonderful solution when you have a framework generating the HTML for you.

[+] Pwntheon|2 years ago|reply
I have a hard time articulating exactly why, but I believe tailwind is popular because it allows developers who are not designers to ignore design/css best practices and just write inline styles again like they used to, before everyone starting telling them that this was bad practice.

I had a rough road learning css, and have been in a few situations where my css/design skills were insufficient to the tasks I was expected to solve. Inline styling let me work more intuitively, and in large part skip learning a whole new paradigm/architecture "just to style some components".

As I eventually grew and had time to work on styling/design in a less stressful environment, I gradually got better at it. Not by practice so much as by learning a new way to frame the problems of styling differently from the problems of "pure" programming.

Had tailwind been around back then I'm sure I'd be a big proponent. It's a product that proposes to solve the cognitive dissonance for a programmer with lots of experience coding, but little experience designing being asked to structure and reason about their work in an uncomfortably different way.

I think tailwind solves a real problem, just not the one we're being told it does.

[+] porker|2 years ago|reply
Hey, I'm old enough to have learned CSS from CSS Zen Garden!

The one thing I appreciate from Tailwind CSS and I'd like to see added to CSS itself is that I don't have to write media queries everywhere.

Nothing destroys the readability of my CSS more than adding multiple media queries to adjust styling for different screen sizes. I wrote a component that used CSS Grid and needed to vary the layout as it resized, and over half of the CSS is now media query definitions.

So having a built-in way to streamline defining media queries, and a built-in way to select in line styling from breakpoints a la `py-2 md:py-6` are my 2 asks for CSS after using Tailwind.

(I would prefer to do away with many breakpoints and have a properly fluid design, but IME it's a lot more work and designers can't get their heads around it, let alone clients. And where images are involved it's easier to have a smaller range of possible sizes for the srcset)

[+] nrk9819|2 years ago|reply
> I have no idea how tailwind has gotten so popular

- marketing - influencers - novice developers who blindly follow infulencers - great documentation

[+] siva7|2 years ago|reply
The popularity of tailwind isn't because of their marketing. Many colleagues using tailwind don't even care or have heard about the claims in your article. It's popular because it solves a real world problem for small to medium sites. It challenges "best practices" by showing that those in fact are just very opinionated and don't solve real world problems for many sites. I've witnessed over 2 decades of css evolution and tailwind is by far the most elegant solution for developers just needing some style for their app that works.
[+] bamboozled|2 years ago|reply
100% agree with this, I wouldn't have got anywhere near as far as I have with some of my side projects if I didn't have tailwind.
[+] marcotm|2 years ago|reply
I think that a huge part of Tailwind‘s success is not so much the underlying concept but a combination of several aspects: You get a kind of generic design system (margins, paddings, matching colors, etc.) that are restrictive enough to help make things look good and consistent but flexible enough to not result in a every-site-looks-the-same situation (at least not to the extent many other CSS frameworks did); Tailwind sits at a low level of abstraction above raw CSS that is just enough to make some CSS concepts a little bit easier to use (flex, grid, etc.); the documentation is quite good and getting started is relatively easy; …

Given these (and probably some more) aspects, Tailwind makes it easy to get some good results quickly which helps to convince users that their whole approach is the right way to go. Add very good marketing and early traction and you are where we are now.

So I agree with the article that Tailwind‘s conceptual approach is not the holy grail it‘s often said to be, but it maybe also is not even the reason for its success compared to many auxiliary things it did/does right.

[+] Brajeshwar|2 years ago|reply
> “optimizing for reusable CSS was going to be the right choice”

That is what CSS is. In the melee of “CSS in everything but CSS,” people might have forgotten what CSS is for. CSS’s classes are what you use everywhere again and again.

CSS Utility classes have been there for a long time and were made easy and famous by the likes of Bourbon[1]. They even have pre-defined styles — Neat[2].

Even though Tailwind can and should have been used more as what it was destined to do — utility classes. In a larger team, it is easier to stick to the TailwindCSS as such and have specialty/custom classes based on its utility for your project.

I was checking it out during its early release and introduced Tailwind to a team in 2018 who were stuck in Bootstrap. I wanted to stop hearing, “This is not part of Bootstrap.” The good thing I realized then was that if I followed a custom class with utility based on Tailwind, the result could continue to be the same with someone doing a “button button-blue button-large text-xl text-white.”

Btw, this too shall pass. I suggest learning CSS from first principles — everything that comes later will be another syntactic sugar. Remember, we started our projects with our grid layout that we stole from A List Apart’s faux-column layout, then came blueprint[3], bootstrap[4], foundation[5], bourbon, and now Tailwind, and every other one in between.

There was even a paid service (or a few, I think) that just churns out custom CSS grid layout code based on your drag-n-drop sliders.

1. https://www.bourbon.io

2. https://neat.bourbon.io

3. https://github.com/joshuaclayton/blueprint-css

4. https://getbootstrap.com

5. https://get.foundation

[+] sktrdie|2 years ago|reply
"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.

[+] JLehtinen|2 years ago|reply
I’ve worked on some large projects including refactors with Tailwind and my view is opposite. I can see how Tailwind would work on small projects, or ones where the designer never touches the styling inside the code. But on the other hand, avoiding naming because it’s hard isn’t how I approach organising design, and it doesn’t sound like a good approach to coding either. But I can see how there may be a need to bypass it in projects where there is no designer, or a design system.
[+] orangepanda|2 years ago|reply
Tailwind is write only, you’re not supposed to read it or maintain in. Want to change some property? Delete the entire class=“” attribute and start anew. Take that primary button example from the article - no one is claiming that it’s readable, especially when there are hundreds of primary buttons throughout the app, each with a slight variation.

This works great for marketing or landing pages, or other use cases where it’s not you who maintains it after deployment; the next sucker will want to rewrite it all anyway.

[+] pcthrowaway|2 years ago|reply
> especially when there are hundreds of primary buttons throughout the app, each with a slight variation.

If you're repeating monstrous groups of styles like the one in the blog post, but with a slight variation for each, then you're tremendously far out in the weeds and almost definitely shouldn't be using tailwind

Tailwind really only works for a component-based framework (like React, Svelte, Solid, etc.), where you define a component representing a button, and give it props to map to the 'minor variation' you want.

That way if you need to support e.g. a new device class, you just add the relevant class names there and don't have to revisit your entire codebase.

This isn't apparent at all when inspecting the source of a site using tailwind, because as far as the rendered markup is concerned, these are getting repeated (and the verbosity of the output is absolutely a fair criticism)

But if you're writing it, and organizing your components in a sensible way, then the problem you mention doesn't exist.

[+] moltar|2 years ago|reply
How’s that different than just writing plain CSS?
[+] bamboozled|2 years ago|reply
I modify it all the time so I'm not sure what you're on about.

I have a feeling people hate Tailwind for making CSS accessible to the masses.

[+] unculture|2 years ago|reply
This is just demonstrably not true.
[+] tipiirai|2 years ago|reply
Author here: This is probably the most important content piece I've ever written. Curious to hear your thoughts. Thank you!
[+] WA|2 years ago|reply
I don’t like Tailwind. But you probably have it the wrong way. You claim malicious intent such as vendor lock-in. Your article sounds as if all this was planned as a cash grab from the beginning. The more likely development path of Tailwind was:

1. Create a utility CSS system, use it, feels nice, publish an article around it why it might make sense and why it feels nice (which is probably a hindsight explanation)

2. People start using it, way more than ever expected.

3. Iterate on the product

That’s it. I’m pretty sure nothing about this was planned, the vendor-lockin wasn’t planned and just happened.

While your arguments about inconsistencies about semantic components in Catalyst vs semantic class names are right, it is highly likely your assumptions are missing a critical piece, because there are clearly many happy users.

[+] MichaelMug|2 years ago|reply
I share your sentiment and position on Tailwind. My first introduction to programming was in 2003 as a 10 year old with HTML CSS and PHP. I think we will see Tailwind, like other frontend tech, fade into the sea of choices.

If I had to summarize this I'd say don't fall victim to hype cycle and marketing. Make technical choices based on the problems.

I've worked on teams where CSS was a mysterious language with many gotchas. So I can see how Tailwind can help with this.

[+] tylerchilds|2 years ago|reply
heyo- i made https://www.cutestrap.com/ and even though i haven't been using it much anymore, i share it to say I've thought a lot about CSS and I agree with your sentiments.

I think a lot of the complexity in CSS is accepted because of complexity in other parts of the stack. I've dug pretty deep into real-world use cases of many approaches to front end and ultimately, tailwind solves the #1 issue people encounter daily.

Fear Of Breaking Something Else Entirely

by never leaving the html tag for a secondary resource, confidence today is gained at the cost of future compound complexity.

as someone that specializes in design systems, tailwind breaks my heart because it it fairly reductive in expression. Truly white-labeling a product is not as simple as changing variables, it is more like a zen garden of css.

[+] DannyBee|2 years ago|reply
Advice from a professional arguer:

You seem to deliberately not present tailwinds strongest arguments. For example, you claim their is no next step to abstraction, but literally in the paragraphs before the ones you quoted they say to build reusable html+css components instead of trying to make css only abstractions. Which very clearly responds to your argument and complaint.

There are other places in your writing like this.

It's fine to think and claim they are wrong. But it would be a lot more persuasive if you take them at their best and knock them down, instead of being selective.

Overall take their absolute best case scenarios and reasons and show why you are still right.

[+] asimpletune|2 years ago|reply
I had a question for the author. Have you used Tailwind to build a project before? Or what has been your personal experience so far with the framework?
[+] seanwilson|2 years ago|reply
> At some point, hundreds of utilities later, the code you've written doesn't look pretty. You start wondering what comes next after the utility-first step. How to clean things up?

> Turns out there is no next step. Or it kind of exists, but it's called "premature abstraction". You can start extracting classes with @apply, but the documentation for reusing styles [link] describes it as a bad practice.

> But what should I use @apply for if not for cleaning up? The documentation does not say. It only tells me why it should not be used.

If you jump to the Tailwind section they link to here, the short section immediately before explains with an example you should be using HTML templates to reuse styles over @apply, which is really core to understanding Tailwind:

https://tailwindcss.com/docs/reusing-styles#compared-to-css-...

  Unless a component is a single HTML element, the information needed to define it can’t be captured in CSS alone. For anything even remotely complex, the HTML structure is just as important as the CSS.

  Even if you create classes for the different elements in a component like this, you still have to duplicate the HTML every time you want to use this component. Sure you can update the font-size for every instance in a single place, but what if you need to turn the title into a link?

  Components and template partials solve this problem much better than CSS-only abstractions because a component can encapsulate the HTML and the styles. Changing the font-size for every instance is just as easy as it is with CSS, but now you can turn all of the titles into links in a single place too.

  When you create components and template partials like this, there’s no reason to use anything other than utility classes because you already have a single source of truth for the styles.
[+] porker|2 years ago|reply
> Components and template partials solve this problem much better than CSS-only abstractions because a component can encapsulate the HTML and the styles.

One of the often overlooked dividers between those who like Tailwind and those who don't is whether your Web framework of choice has a concept of components.

Template partials with their lack of properties and a defined signature (hi autocomplete!) don't cut it in my experience.

[+] teddarific|2 years ago|reply
I agree with the overall sentiment of the article, but find it a bit harsh.

I honestly find the real debate to be inline styles vs stylesheets.

Tailwind is just fancy inline styles. Personally, every single time I've used stylesheets in a large production-grade project it's an absolute mess. Every project I start now I use inline styles. I'm pretty indifferent on Tailwind though, it's sometimes nice to get opinionated defaults.

[+] saasjosh|2 years ago|reply
The tech industry is full of thought leaders trying to sell us their inventions.

Adam should have said that Tailwind is a good solution for him. Instead, he said that Tailwind is better than everything else and piggy-backed on famous people in tech to sell his idea. Which created a cult-like following.

Cults are bad for tech because it prevents out-of-the-box thinking.

[+] AltruisticGapHN|2 years ago|reply
I think Tailwind appeals to « back of the front end » devs which is a role that didn’t exist until 2010 or so?

I think tailwind is valuable and as always middle way is the best approach but more difficult to structure and definitely not good for commercial purposes.

My favourite way is to put tw classes for spacing components and layout directly in the template while using bem-like naming for the component ‘s own appearance.

Having utilities like mb-2 that can override the default set in a component I think solves many headaches and is one of the strengths of having a full set of utilities.

However I also find a real strength is having a standard accross devs AND projects and so when tailwind advises to customise your project. Change the meaning of mb-4 or text-lg then I find it completely undermines the value of having a standard utility set.

[+] tipiirai|2 years ago|reply
Makes sense. It's likely more tempting to people without years of experience with vanilla CSS: its specificity rules, and how it cascades. I guess the people who value the separation of concerns pattern in frontend architectures and are super hesitant to apply inline styling.
[+] miragecraft|2 years ago|reply
This article ignores the fact that people actually used it and actually realized the benefits cited.

Traditional way of using CSS I feel is still advantageous for websites (instead of apps) with a limited set of highly reused styles.

Nowadays however there’s a general lack of restraint and self-control when it comes to web design, you must have a million variations of everything.

In that case utility-first CSS clearly wins because there’s almost no reuse except at the per-property level.

[+] jongjong|2 years ago|reply
I don't see the value in Tailwind. It gives you convenience but adds complexity, one more thing you have to learn and makes it easier to shoot yourself in the foot. Also, I like the no-bundling approach to application development with Web Components and Tailwind goes against that.

I prefer using plain CSS. I like semantic CSS and similar ideas of associating certain component class names with certain styles.

[+] 88913527|2 years ago|reply
While I agree with the principle of "clean markup", whenever I open up the DOM of websites I did not create (and I do so with regular frequency), I generally do not see what I'd consider clean. The author is correct but it's not that frequent of a practice; I wish it were so. Care for our craft is an uncommon thing.