William Rafael
← Back to blog

Tailwind for scalable UX: patterns that prevent spaghetti CSS

Tailwind practices that preserve visual consistency and avoid design debt in fast-growing products.

2024-05-24 · By willsamy · English edition

Tailwind speeds up delivery, but without clear patterns the interface can deteriorate quickly. These are the rules I use to keep UX scalable.

1. Tokens first, utilities second

  • Standardize colors, spacing and typography in tailwind.config through theme and extend.
  • Avoid arbitrary values in everyday work; allow rare, documented exceptions.
  • Treat tokens as the language of the design system.

2. Components with style variants

  • Build variants for components such as Button, Card and Badge, using class-variance-authority or utility patterns.
  • Extract recurring patterns instead of rewriting the same utility classes.

3. Predictable layouts

  • Define standard max-width, container, grid and gap scales for each breakpoint.
  • Use consistent wrappers, such as container mx-auto px-4.

4. A deliberate dark mode

  • Use a class-based strategy and color tokens that work in both themes.
  • Test contrast and readability; avoid shades of gray that are too similar.

5. Built-in accessibility

  • Provide visible focus, aria states and semantic hierarchy.
  • Make components accessible by default instead of relying on developers to remember later.

6. Constraints and linting

  • Use ESLint and Tailwind lint rules to restrict arbitrary values outside the token system.
  • Require screenshots at the main breakpoints in pull requests.

Conclusion

Tailwind works best with a lightweight design system and discipline: defined tokens, component variants and processes that prevent inconsistency. The result is speed with predictable visuals.

Tailwind for scalable UX: patterns that prevent spaghetti CSS | William Rafael