<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Sergio Azócar</title>
    <description>The latest articles on DEV Community by Sergio Azócar (@sergioazoc).</description>
    <link>https://dev.to/sergioazoc</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F408563%2F4bdfda32-bbf0-404c-bf33-3c1c550d5152.jpg</url>
      <title>DEV Community: Sergio Azócar</title>
      <link>https://dev.to/sergioazoc</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sergioazoc"/>
    <language>en</language>
    <item>
      <title>oxlint-tailwindcss: the linting plugin Tailwind v4 needed</title>
      <dc:creator>Sergio Azócar</dc:creator>
      <pubDate>Mon, 23 Mar 2026 21:38:08 +0000</pubDate>
      <link>https://dev.to/sergioazoc/oxlint-tailwindcss-the-linting-plugin-tailwind-v4-needed-fm2</link>
      <guid>https://dev.to/sergioazoc/oxlint-tailwindcss-the-linting-plugin-tailwind-v4-needed-fm2</guid>
      <description>&lt;h2&gt;
  
  
  From problem to open-source: the perfect opportunity to contribute
&lt;/h2&gt;

&lt;p&gt;The day the oxc team opened the alpha for native oxlint plugins, it was the perfect excuse to solve a problem I'd been having at my current job for a while — linting Tailwind CSS classes with oxlint.&lt;/p&gt;

&lt;p&gt;If you use Tailwind CSS v4 with oxlint, the existing linting options aren't built for that combo. &lt;code&gt;eslint-plugin-tailwindcss&lt;/code&gt; is solid but lives in the ESLint world and its v4 support is still partial. &lt;code&gt;eslint-plugin-better-tailwindcss&lt;/code&gt; works in oxlint through the jsPlugins compatibility layer, and it gets the job done — but it's not a native plugin and its rules are more limited. Neither was designed specifically for oxlint + Tailwind CSS v4.&lt;/p&gt;

&lt;p&gt;So I built it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is oxlint-tailwindcss
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;native&lt;/strong&gt; oxlint plugin with 22 linting rules designed exclusively for Tailwind CSS v4. It's not an ESLint port or a wrapper — it uses the &lt;code&gt;@oxlint/plugins&lt;/code&gt; API directly.&lt;/p&gt;

&lt;p&gt;This matters because being native means it shares the same parsing cycle as oxlint. There's no interoperability overhead, no translation layer. It's as fast as oxlint itself, and it shows.&lt;/p&gt;

&lt;h3&gt;
  
  
  Zero configuration
&lt;/h3&gt;

&lt;p&gt;The plugin auto-detects your Tailwind CSS entry point. If your file is called &lt;code&gt;app.css&lt;/code&gt;, &lt;code&gt;globals.css&lt;/code&gt;, &lt;code&gt;main.css&lt;/code&gt;, &lt;code&gt;tailwind.css&lt;/code&gt; (or any of the conventional names) and contains &lt;code&gt;@import "tailwindcss"&lt;/code&gt;, it finds it automatically. No configuration needed.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"jsPlugins"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"oxlint-tailwindcss"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"rules"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"tailwindcss/no-unknown-classes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"error"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"tailwindcss/no-conflicting-classes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"error"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"tailwindcss/enforce-sort-order"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"warn"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The design system is loaded once and shared across all rules. Efficient.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If you have a non-conventional entry point you can still configure it.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  22 rules in four categories
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Correctness — Catch real bugs
&lt;/h3&gt;

&lt;p&gt;Correctness rules catch bugs before they reach the browser.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;no-unknown-classes&lt;/code&gt;&lt;/strong&gt; detects classes that don't exist in your design system and suggests fixes for typos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"flex itms-center bg-blu-500"&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="c1"&gt;//                   ^^^^^^^^^^^&lt;/span&gt;
&lt;span class="c1"&gt;// "itms-center" is not a valid Tailwind CSS class.&lt;/span&gt;
&lt;span class="c1"&gt;// Did you mean "items-center"?&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;&lt;code&gt;no-conflicting-classes&lt;/code&gt;&lt;/strong&gt; tells you exactly which CSS property is conflicting and which class wins:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"text-red-500 text-blue-500"&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="c1"&gt;// "text-red-500" and "text-blue-500" affect "color".&lt;/span&gt;
&lt;span class="c1"&gt;// "text-blue-500" takes precedence (appears later).&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;&lt;code&gt;no-dark-without-light&lt;/code&gt;&lt;/strong&gt; detects when you use &lt;code&gt;dark:&lt;/code&gt; without a base class, something that often causes missing styles in light mode:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// ❌ — what background does it have in light mode?&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"dark:bg-gray-900"&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;

&lt;span class="c1"&gt;// ✅&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"bg-white dark:bg-gray-900"&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;&lt;code&gt;no-contradicting-variants&lt;/code&gt;&lt;/strong&gt; catches redundant variants where the base class already applies unconditionally:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// ❌ — dark:flex is redundant, flex already applies always&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"flex dark:flex"&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Also included: &lt;strong&gt;&lt;code&gt;no-duplicate-classes&lt;/code&gt;&lt;/strong&gt; (with autofix), &lt;strong&gt;&lt;code&gt;no-deprecated-classes&lt;/code&gt;&lt;/strong&gt; (with autofix and v4 mapping), and &lt;strong&gt;&lt;code&gt;no-unnecessary-whitespace&lt;/code&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Style — Team consistency
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;enforce-sort-order&lt;/code&gt;&lt;/strong&gt; sorts classes according to the official Tailwind CSS order (with autofix). It has a strict mode that also groups by variant.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;enforce-shorthand&lt;/code&gt;&lt;/strong&gt; converts &lt;code&gt;mt-2 mr-2 mb-2 ml-2&lt;/code&gt; to &lt;code&gt;m-2&lt;/code&gt;, &lt;code&gt;w-full h-full&lt;/code&gt; to &lt;code&gt;size-full&lt;/code&gt;, and many more combinations. All with autofix.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;enforce-logical&lt;/code&gt;&lt;/strong&gt; converts physical properties to logical ones for LTR/RTL support: &lt;code&gt;ml-4&lt;/code&gt; → &lt;code&gt;ms-4&lt;/code&gt;, &lt;code&gt;left-0&lt;/code&gt; → &lt;code&gt;start-0&lt;/code&gt;. Its inverse, &lt;strong&gt;&lt;code&gt;enforce-physical&lt;/code&gt;&lt;/strong&gt;, does the opposite for projects that are LTR-only and prefer consistency with physical properties. Both with autofix.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;enforce-consistent-variable-syntax&lt;/code&gt;&lt;/strong&gt; normalizes CSS variable syntax between &lt;code&gt;bg-[var(--primary)]&lt;/code&gt; and v4's shorthand &lt;code&gt;bg-(--primary)&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;And four more rules: &lt;strong&gt;&lt;code&gt;enforce-canonical&lt;/code&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;code&gt;enforce-consistent-important-position&lt;/code&gt;&lt;/strong&gt; (default suffix, v4's canonical form), &lt;strong&gt;&lt;code&gt;enforce-negative-arbitrary-values&lt;/code&gt;&lt;/strong&gt;, and &lt;strong&gt;&lt;code&gt;consistent-variant-order&lt;/code&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Complexity — Keep code manageable
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;max-class-count&lt;/code&gt;&lt;/strong&gt; warns when an element exceeds 20 classes (configurable). It's the signal that it's time to extract a component.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;enforce-consistent-line-wrapping&lt;/code&gt;&lt;/strong&gt; controls the class string length by print width or by number of classes per line.&lt;/p&gt;

&lt;h3&gt;
  
  
  Restrictions — Design system rules
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;no-hardcoded-colors&lt;/code&gt;&lt;/strong&gt; forbids hardcoded colors like &lt;code&gt;bg-[#ff5733]&lt;/code&gt; in arbitrary brackets — the typical shortcut that erodes your design system.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;no-arbitrary-value&lt;/code&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;code&gt;no-unnecessary-arbitrary-value&lt;/code&gt;&lt;/strong&gt; (with autofix) control the use of arbitrary values. The latter detects when you use &lt;code&gt;h-[auto]&lt;/code&gt; but &lt;code&gt;h-auto&lt;/code&gt; exists.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;no-restricted-classes&lt;/code&gt;&lt;/strong&gt; allows blocking specific classes by name or regex, with custom messages.&lt;/p&gt;

&lt;h2&gt;
  
  
  Class extraction
&lt;/h2&gt;

&lt;p&gt;The parser is what makes all of this work reliably. It's not a regex that looks for &lt;code&gt;className=&lt;/code&gt; and hopes for the best. It extracts classes from:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;JSX attributes (&lt;code&gt;className&lt;/code&gt;, &lt;code&gt;class&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Template literals with interpolation&lt;/li&gt;
&lt;li&gt;Ternaries&lt;/li&gt;
&lt;li&gt;Utility functions: &lt;code&gt;cn()&lt;/code&gt;, &lt;code&gt;clsx()&lt;/code&gt;, &lt;code&gt;cx()&lt;/code&gt;, &lt;code&gt;cva()&lt;/code&gt;, &lt;code&gt;twMerge()&lt;/code&gt;, &lt;code&gt;twJoin()&lt;/code&gt;, and more&lt;/li&gt;
&lt;li&gt;Full &lt;code&gt;cva()&lt;/code&gt; — base, variants, compoundVariants&lt;/li&gt;
&lt;li&gt;Full &lt;code&gt;tv()&lt;/code&gt; — base, slots, variants with slot objects, compoundSlots&lt;/li&gt;
&lt;li&gt;Tagged templates (&lt;code&gt;tw\&lt;/code&gt;...``)&lt;/li&gt;
&lt;li&gt;Variables by name (&lt;code&gt;className&lt;/code&gt;, &lt;code&gt;classes&lt;/code&gt;, &lt;code&gt;style&lt;/code&gt;, &lt;code&gt;styles&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It handles nested brackets, nested calc, arbitrary variants, quoted values, important modifier, negative values, and named groups/peers. The edge cases that break other parsers.&lt;/p&gt;

&lt;h2&gt;
  
  
  The story behind it
&lt;/h2&gt;

&lt;p&gt;I started by planning what I wanted, the stack I was going to use, and how I wanted everything to work. After planning the implementation with &lt;strong&gt;Claude Code&lt;/strong&gt;, the iteration began until reaching the current 22 rules. The repo includes a &lt;code&gt;CLAUDE.md&lt;/code&gt; and configured skills that allow any contributor to use the same workflow to write new rules — the same tool the plugin was built with. If you want to add a rule, Claude Code already knows how to do it in this project.&lt;/p&gt;

&lt;p&gt;The project runs entirely on the VoidZero tool ecosystem. &lt;a href="https://tsdown.dev/" rel="noopener noreferrer"&gt;tsdown&lt;/a&gt; for the build, &lt;a href="https://oxc.rs/#feature-formatter" rel="noopener noreferrer"&gt;oxfmt&lt;/a&gt; for formatting, &lt;a href="https://vitest.dev" rel="noopener noreferrer"&gt;vitest&lt;/a&gt; for testing, &lt;a href="https://github.com/microsoft/typescript-go" rel="noopener noreferrer"&gt;tsgo&lt;/a&gt; (native TypeScript 7 in Go) for type checking, and of course &lt;a href="https://oxc.rs/#feature-linter" rel="noopener noreferrer"&gt;oxlint&lt;/a&gt; for linting the plugin itself. Every tool in the chain is built on Rust or optimized for speed.&lt;/p&gt;

&lt;p&gt;It wasn't a cosmetic decision — it was deliberate dogfooding. If you're going to make a plugin for oxlint, it makes sense that the entire toolchain is from the same ecosystem. And if you're going to develop with an AI agent, it makes sense that the repo is prepared for it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting started
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;`bash&lt;br&gt;
pnpm add -D oxlint-tailwindcss&lt;br&gt;
`&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Add the plugin to your &lt;code&gt;.oxlintrc.json&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;`json&lt;br&gt;
{&lt;br&gt;
  "jsPlugins": ["oxlint-tailwindcss"],&lt;br&gt;
  "rules": {&lt;br&gt;
    "tailwindcss/no-unknown-classes": "error",&lt;br&gt;
    "tailwindcss/no-duplicate-classes": "error",&lt;br&gt;
    "tailwindcss/no-conflicting-classes": "error",&lt;br&gt;
    "tailwindcss/no-deprecated-classes": "error",&lt;br&gt;
    "tailwindcss/no-unnecessary-whitespace": "error",&lt;br&gt;
    "tailwindcss/enforce-sort-order": "warn",&lt;br&gt;
    "tailwindcss/enforce-shorthand": "warn",&lt;br&gt;
    "tailwindcss/no-hardcoded-colors": "warn"&lt;br&gt;
    //...&lt;br&gt;
  }&lt;br&gt;
}&lt;br&gt;
`&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Run oxlint. That's it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;The plugin is at v0.1.x — functional, tested, and ready for production use (some companies are already using it). But a linter gets better with real feedback from real projects.&lt;br&gt;
If you try it and find a case it doesn't handle well, open an &lt;a href="https://github.com/sergioazoc/oxlint-tailwindcss/issues" rel="noopener noreferrer"&gt;issue&lt;/a&gt;. If you want to contribute a rule, the repo is already set up so you can iterate with Claude Code from minute one. And if it was simply useful to you, a star on &lt;a href="https://github.com/sergioazoc/oxlint-tailwindcss" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; helps more people find it.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/sergioazoc/oxlint-tailwindcss" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/strong&gt; · &lt;strong&gt;&lt;a href="https://www.npmjs.com/package/oxlint-tailwindcss" rel="noopener noreferrer"&gt;npm&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>tooling</category>
      <category>tailwindcss</category>
      <category>opensource</category>
    </item>
    <item>
      <title>oxlint-tailwindcss: el plugin de linting que Tailwind v4 necesitaba</title>
      <dc:creator>Sergio Azócar</dc:creator>
      <pubDate>Mon, 23 Mar 2026 21:38:01 +0000</pubDate>
      <link>https://dev.to/sergioazoc/oxlint-tailwindcss-el-plugin-de-linting-que-tailwind-v4-necesitaba-41j9</link>
      <guid>https://dev.to/sergioazoc/oxlint-tailwindcss-el-plugin-de-linting-que-tailwind-v4-necesitaba-41j9</guid>
      <description>&lt;h2&gt;
  
  
  Del problema al open-source: la oportunidad perfecta para contribuir
&lt;/h2&gt;

&lt;p&gt;El día que el equipo de oxc abrió el alpha de plugins nativos para oxlint, fue la excusa perfecta para solucionar un problema que llevaba tiempo teniendo en mi trabajo actual, lintear las clases de Tailwind CSS con oxlint.&lt;/p&gt;

&lt;p&gt;Si usas Tailwind CSS v4 con oxlint, las opciones de linting existentes no están pensadas para ese combo. &lt;code&gt;eslint-plugin-tailwindcss&lt;/code&gt; es sólido pero vive en el mundo de ESLint y su soporte de v4 todavía es parcial. &lt;code&gt;eslint-plugin-better-tailwindcss&lt;/code&gt; funciona en oxlint a través de la capa de compatibilidad jsPlugins, y hace el trabajo — pero no es un plugin nativo y sus reglas son más acotadas. Ninguno fue diseñado específicamente para oxlint + Tailwind CSS v4.&lt;/p&gt;

&lt;p&gt;Así que lo construí.&lt;/p&gt;

&lt;h2&gt;
  
  
  Qué es oxlint-tailwindcss
&lt;/h2&gt;

&lt;p&gt;Un plugin &lt;strong&gt;nativo&lt;/strong&gt; de oxlint con 22 reglas de linting diseñadas exclusivamente para Tailwind CSS v4. No es un port de ESLint ni un wrapper — usa directamente la API de &lt;code&gt;@oxlint/plugins&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Esto importa porque al ser nativo, comparte el mismo ciclo de parseo que oxlint. No hay overhead de interoperabilidad, no hay capa de traducción. Es tan rápido como oxlint mismo y se nota.&lt;/p&gt;

&lt;h3&gt;
  
  
  Cero configuración
&lt;/h3&gt;

&lt;p&gt;El plugin auto-detecta tu entry point de Tailwind CSS. Si tu archivo se llama &lt;code&gt;app.css&lt;/code&gt;, &lt;code&gt;globals.css&lt;/code&gt;, &lt;code&gt;main.css&lt;/code&gt;, &lt;code&gt;tailwind.css&lt;/code&gt; (o cualquiera de los nombres convencionales) y contiene &lt;code&gt;@import "tailwindcss"&lt;/code&gt;, lo encuentra solo. No necesitas configurar nada.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"jsPlugins"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"oxlint-tailwindcss"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"rules"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"tailwindcss/no-unknown-classes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"error"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"tailwindcss/no-conflicting-classes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"error"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"tailwindcss/enforce-sort-order"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"warn"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El design system se carga una vez y se comparte entre todas las reglas. Eficiente.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Si tienes un entry point distinto a lo convencional igual puedes configurarlo.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  22 reglas en cuatro categorías
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Correctness — Evitar errores reales
&lt;/h3&gt;

&lt;p&gt;Las reglas de correctness atrapan bugs antes de que lleguen al navegador.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;no-unknown-classes&lt;/code&gt;&lt;/strong&gt; detecta clases que no existen en tu design system y sugiere correcciones para typos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"flex itms-center bg-blu-500"&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="c1"&gt;//                   ^^^^^^^^^^^&lt;/span&gt;
&lt;span class="c1"&gt;// "itms-center" is not a valid Tailwind CSS class.&lt;/span&gt;
&lt;span class="c1"&gt;// Did you mean "items-center"?&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;&lt;code&gt;no-conflicting-classes&lt;/code&gt;&lt;/strong&gt; te dice exactamente qué propiedad CSS está en conflicto y cuál clase gana:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"text-red-500 text-blue-500"&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="c1"&gt;// "text-red-500" and "text-blue-500" affect "color".&lt;/span&gt;
&lt;span class="c1"&gt;// "text-blue-500" takes precedence (appears later).&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;&lt;code&gt;no-dark-without-light&lt;/code&gt;&lt;/strong&gt; detecta cuando usas &lt;code&gt;dark:&lt;/code&gt; sin una clase base, algo que suele causar estilos faltantes en light mode:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// ❌ — ¿qué fondo tiene en light mode?&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"dark:bg-gray-900"&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;

&lt;span class="c1"&gt;// ✅&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"bg-white dark:bg-gray-900"&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;&lt;code&gt;no-contradicting-variants&lt;/code&gt;&lt;/strong&gt; atrapa variantes redundantes donde la clase base ya aplica incondicionalmente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// ❌ — dark:flex es redundante, flex ya aplica siempre&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"flex dark:flex"&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;También están &lt;strong&gt;&lt;code&gt;no-duplicate-classes&lt;/code&gt;&lt;/strong&gt; (con autofix), &lt;strong&gt;&lt;code&gt;no-deprecated-classes&lt;/code&gt;&lt;/strong&gt; (con autofix y mapping de v4), y &lt;strong&gt;&lt;code&gt;no-unnecessary-whitespace&lt;/code&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Style — Consistencia del equipo
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;enforce-sort-order&lt;/code&gt;&lt;/strong&gt; ordena las clases según el orden oficial de Tailwind CSS (con autofix). Tiene un modo strict que además agrupa por variante.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;enforce-shorthand&lt;/code&gt;&lt;/strong&gt; convierte &lt;code&gt;mt-2 mr-2 mb-2 ml-2&lt;/code&gt; en &lt;code&gt;m-2&lt;/code&gt;, &lt;code&gt;w-full h-full&lt;/code&gt; en &lt;code&gt;size-full&lt;/code&gt;, y muchas más combinaciones. Todo con autofix.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;enforce-logical&lt;/code&gt;&lt;/strong&gt; convierte propiedades físicas en lógicas para soporte LTR/RTL: &lt;code&gt;ml-4&lt;/code&gt; → &lt;code&gt;ms-4&lt;/code&gt;, &lt;code&gt;left-0&lt;/code&gt; → &lt;code&gt;start-0&lt;/code&gt;. Su inversa, &lt;strong&gt;&lt;code&gt;enforce-physical&lt;/code&gt;&lt;/strong&gt;, hace lo contrario para proyectos que son solo LTR y prefieren consistencia con propiedades físicas. Ambas con autofix.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;enforce-consistent-variable-syntax&lt;/code&gt;&lt;/strong&gt; normaliza la sintaxis de variables CSS entre &lt;code&gt;bg-[var(--primary)]&lt;/code&gt; y la shorthand de v4 &lt;code&gt;bg-(--primary)&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Y otras cuatro reglas más: &lt;strong&gt;&lt;code&gt;enforce-canonical&lt;/code&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;code&gt;enforce-consistent-important-position&lt;/code&gt;&lt;/strong&gt; (default suffix, la forma canónica de v4), &lt;strong&gt;&lt;code&gt;enforce-negative-arbitrary-values&lt;/code&gt;&lt;/strong&gt; y &lt;strong&gt;&lt;code&gt;consistent-variant-order&lt;/code&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Complexity — Mantener el código manejable
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;max-class-count&lt;/code&gt;&lt;/strong&gt; avisa cuando un elemento supera las 20 clases (configurable). Es la señal de que es hora de extraer un componente.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;enforce-consistent-line-wrapping&lt;/code&gt;&lt;/strong&gt; controla el largo del string de clases por print width o por cantidad de clases por línea.&lt;/p&gt;

&lt;h3&gt;
  
  
  Restrictions — Reglas del design system
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;no-hardcoded-colors&lt;/code&gt;&lt;/strong&gt; prohíbe colores hardcodeados como &lt;code&gt;bg-[#ff5733]&lt;/code&gt; en brackets arbitrarios — el típico atajo que erosiona tu design system.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;no-arbitrary-value&lt;/code&gt;&lt;/strong&gt; y &lt;strong&gt;&lt;code&gt;no-unnecessary-arbitrary-value&lt;/code&gt;&lt;/strong&gt; (con autofix) controlan el uso de valores arbitrarios. La segunda detecta cuando usas &lt;code&gt;h-[auto]&lt;/code&gt; pero existe &lt;code&gt;h-auto&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;no-restricted-classes&lt;/code&gt;&lt;/strong&gt; permite bloquear clases específicas por nombre o regex, con mensajes custom.&lt;/p&gt;

&lt;h2&gt;
  
  
  Extracción de clases
&lt;/h2&gt;

&lt;p&gt;El parser es lo que hace que todo esto funcione de manera confiable. No es un regex que busca &lt;code&gt;className=&lt;/code&gt; y reza. Extrae clases de:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Atributos JSX (&lt;code&gt;className&lt;/code&gt;, &lt;code&gt;class&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Template literals con interpolación&lt;/li&gt;
&lt;li&gt;Ternarios&lt;/li&gt;
&lt;li&gt;Funciones de utilidad: &lt;code&gt;cn()&lt;/code&gt;, &lt;code&gt;clsx()&lt;/code&gt;, &lt;code&gt;cx()&lt;/code&gt;, &lt;code&gt;cva()&lt;/code&gt;, &lt;code&gt;twMerge()&lt;/code&gt;, &lt;code&gt;twJoin()&lt;/code&gt;, y más&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;cva()&lt;/code&gt; completo — base, variants, compoundVariants&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;tv()&lt;/code&gt; completo — base, slots, variants con objetos de slots, compoundSlots&lt;/li&gt;
&lt;li&gt;Tagged templates (&lt;code&gt;tw\&lt;/code&gt;...``)&lt;/li&gt;
&lt;li&gt;Variables por nombre (&lt;code&gt;className&lt;/code&gt;, &lt;code&gt;classes&lt;/code&gt;, &lt;code&gt;style&lt;/code&gt;, &lt;code&gt;styles&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Maneja nested brackets, calc anidado, arbitrary variants, quoted values, important modifier, negative values y named groups/peers. Los edge cases que rompen otros parsers.&lt;/p&gt;

&lt;h2&gt;
  
  
  La historia detrás
&lt;/h2&gt;

&lt;p&gt;Partí planificando qué quería, el stack que iba a usar y cómo quería que funcionara todo. Después de planificar la implementación con &lt;strong&gt;Claude Code&lt;/strong&gt;, arrancó la iteración hasta conseguir las 22 reglas actuales. El repo incluye un &lt;code&gt;CLAUDE.md&lt;/code&gt; y skills configuradas que permiten a cualquier contribuidor usar el mismo workflow para escribir reglas nuevas — la misma herramienta con la que se construyó el plugin. Si quieres agregar una regla, Claude Code ya sabe cómo hacerlo en este proyecto.&lt;/p&gt;

&lt;p&gt;El proyecto corre completamente sobre el ecosistema de herramientas de VoidZero. &lt;a href="https://tsdown.dev/" rel="noopener noreferrer"&gt;tsdown&lt;/a&gt; para el build, &lt;a href="https://oxc.rs/#feature-formatter" rel="noopener noreferrer"&gt;oxfmt&lt;/a&gt; para el formateo, &lt;a href="https://vitest.dev" rel="noopener noreferrer"&gt;vitest&lt;/a&gt; para testing, &lt;a href="https://github.com/microsoft/typescript-go" rel="noopener noreferrer"&gt;tsgo&lt;/a&gt; (TypeScript 7 nativo en Go) para el type checking, y por supuesto &lt;a href="https://oxc.rs/#feature-linter" rel="noopener noreferrer"&gt;oxlint&lt;/a&gt; para el linting del propio plugin. Cada herramienta en la cadena está construida sobre Rust u optimizada para velocidad.&lt;/p&gt;

&lt;p&gt;No fue una decisión cosmética — fue dogfooding deliberado. Si vas a hacer un plugin para oxlint, tiene sentido que todo el toolchain sea del mismo ecosistema. Y si vas a desarrollar con un agente de IA, tiene sentido que el repo esté preparado para ello.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cómo empezar
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;`bash&lt;br&gt;
pnpm add -D oxlint-tailwindcss&lt;br&gt;
`&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Agrega el plugin a tu &lt;code&gt;.oxlintrc.json&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;`json&lt;br&gt;
{&lt;br&gt;
  "jsPlugins": ["oxlint-tailwindcss"],&lt;br&gt;
  "rules": {&lt;br&gt;
    "tailwindcss/no-unknown-classes": "error",&lt;br&gt;
    "tailwindcss/no-duplicate-classes": "error",&lt;br&gt;
    "tailwindcss/no-conflicting-classes": "error",&lt;br&gt;
    "tailwindcss/no-deprecated-classes": "error",&lt;br&gt;
    "tailwindcss/no-unnecessary-whitespace": "error",&lt;br&gt;
    "tailwindcss/enforce-sort-order": "warn",&lt;br&gt;
    "tailwindcss/enforce-shorthand": "warn",&lt;br&gt;
    "tailwindcss/no-hardcoded-colors": "warn"&lt;br&gt;
    //...&lt;br&gt;
  }&lt;br&gt;
}&lt;br&gt;
`&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Ejecuta oxlint. Eso es todo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pruébalo
&lt;/h2&gt;

&lt;p&gt;El plugin está en v0.1.x — funcional, testeado y listo para usar en producción (algunas empresas ya lo están usando). Pero un linter se hace mejor con feedback real de proyectos reales.&lt;br&gt;
Si lo pruebas y encuentras un caso que no maneja bien, abre un &lt;a href="https://github.com/sergioazoc/oxlint-tailwindcss/issues" rel="noopener noreferrer"&gt;issue&lt;/a&gt;. Si quieres contribuir una regla, el repo ya está preparado para que iteres con Claude Code desde el primer minuto. Y si simplemente te resultó útil, una estrella en &lt;a href="https://github.com/sergioazoc/oxlint-tailwindcss" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; ayuda a que más gente lo encuentre.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/sergioazoc/oxlint-tailwindcss" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/strong&gt; · &lt;strong&gt;&lt;a href="https://www.npmjs.com/package/oxlint-tailwindcss" rel="noopener noreferrer"&gt;npm&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>tooling</category>
      <category>tailwindcss</category>
      <category>opensource</category>
    </item>
    <item>
      <title>What I Learned Building Design Systems and What I Would Do Differently</title>
      <dc:creator>Sergio Azócar</dc:creator>
      <pubDate>Thu, 26 Jun 2025 01:04:03 +0000</pubDate>
      <link>https://dev.to/sergioazoc/what-i-learned-building-design-systems-and-what-i-would-do-differently-2l2a</link>
      <guid>https://dev.to/sergioazoc/what-i-learned-building-design-systems-and-what-i-would-do-differently-2l2a</guid>
      <description>&lt;h2&gt;
  
  
  What is a Design System?
&lt;/h2&gt;

&lt;p&gt;Simply put, it's a collection of &lt;strong&gt;rules&lt;/strong&gt;, &lt;strong&gt;components&lt;/strong&gt;, and &lt;strong&gt;guidelines&lt;/strong&gt; that act as a &lt;strong&gt;single source of truth&lt;/strong&gt; for designing and building interfaces.&lt;/p&gt;

&lt;p&gt;A good Design System defines everything from &lt;strong&gt;colors&lt;/strong&gt;, &lt;strong&gt;typography&lt;/strong&gt;, and &lt;strong&gt;spacing&lt;/strong&gt;, to how &lt;strong&gt;buttons&lt;/strong&gt;, &lt;strong&gt;forms&lt;/strong&gt;, &lt;strong&gt;alerts&lt;/strong&gt;, and more should behave. But it goes far beyond the visual: it also defines how design and development communicate, how patterns are documented, and how the product evolves consistently.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The goal is for the entire team to speak the same language, design faster, and build products that feel coherent—without reinventing the wheel on every screen.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It’s not just a component library. It’s a way of working that seeks to &lt;strong&gt;align design, code, and user experience&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I'll go into more detail about how I built mine and what I learned, but first I want to tell you what it was like to face this idea from scratch.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I Ended Up Building Design Systems
&lt;/h2&gt;

&lt;p&gt;After working on different projects and teams, I began to notice patterns that kept repeating:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The same button designed three different ways&lt;/li&gt;
&lt;li&gt;Inconsistent behavior in similar components&lt;/li&gt;
&lt;li&gt;Duplicated or hard-to-maintain code&lt;/li&gt;
&lt;li&gt;Misunderstandings between design and development&lt;/li&gt;
&lt;li&gt;Interfaces that looked great in Figma, but not in production&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every time a product grew, so did the visual and technical chaos. And with it, the time we lost solving the same problems over and over again.&lt;/p&gt;

&lt;p&gt;That’s when I realized we needed more than just a component library. We needed a &lt;strong&gt;shared way to build interfaces&lt;/strong&gt;, with clear rules, centralized decisions, and a source of truth for all teams.&lt;/p&gt;

&lt;h2&gt;
  
  
  Expectations vs. Reality
&lt;/h2&gt;

&lt;p&gt;Remember when you had to do group projects at school?&lt;br&gt;
Everyone did their part separately, put it all together at the end… and the result was a total "Frankenstein."&lt;/p&gt;

&lt;p&gt;Well, building a Design System often feels like that 😅.&lt;/p&gt;

&lt;p&gt;At first, you think it’s going to organize everything, magically uniting design and development. But in practice, misunderstandings, shortcuts, and crossed decisions appear, and what should be a coherent system starts to fall apart.&lt;/p&gt;

&lt;p&gt;Here are some of the biggest differences I experienced between what I imagined… and what actually happened:&lt;/p&gt;

&lt;h3&gt;
  
  
  🧠 Expectation:
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;“I'll create a reusable component library and the team will happily use it.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;🧱 Reality:&lt;/strong&gt;&lt;br&gt;
Some devs ignore it, others break it, and others don’t know how to use it.&lt;br&gt;
Without documentation, onboarding, and internal support, no one adopts it as you expected.&lt;/p&gt;

&lt;h3&gt;
  
  
  🎨 Expectation:
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;“The design is in Figma, I just have to replicate it.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;⚠️ Reality:&lt;/strong&gt;&lt;br&gt;
The design doesn’t consider states, errors, focus, interaction, loading...&lt;br&gt;
I ended up making a lot of technical decisions that weren’t defined.&lt;/p&gt;

&lt;h3&gt;
  
  
  🧪 Expectation:
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;“Once the components are done, we won’t need to touch them again.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;🔄 Reality:&lt;/strong&gt;&lt;br&gt;
Design evolves, new requirements come up, and each change affects multiple parts of the system.&lt;br&gt;
A Design System needs constant maintenance.&lt;/p&gt;

&lt;h3&gt;
  
  
  🧩 Expectation:
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;“I’ll create generic and reusable components for everything.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;🧨 Reality:&lt;/strong&gt;&lt;br&gt;
Overly flexible components end up being hard to maintain, test, or understand.&lt;br&gt;
Sometimes it’s better to have clear variants than a single component with 15 props.&lt;/p&gt;

&lt;h3&gt;
  
  
  👥 Expectation:
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;“Design and development will work as one team.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;📉 Reality:&lt;/strong&gt;&lt;br&gt;
Without clear processes and a common language, misunderstandings happen all the time.&lt;br&gt;
Collaboration isn’t automatic—you have to build those bridges intentionally.&lt;/p&gt;

&lt;h3&gt;
  
  
  📦 Expectation:
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;“With Tailwind, I can do everything without a Design System.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;🔍 Reality:&lt;/strong&gt;&lt;br&gt;
Tailwind helps, but without shared design decisions, tokens, and a clear structure, your project still becomes inconsistent.&lt;/p&gt;

&lt;h3&gt;
  
  
  ⏳ Expectation:
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;“I'll have the system ready in a few weeks.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;📆 Reality:&lt;/strong&gt;&lt;br&gt;
A Design System is never finished. It’s a living system that grows, adapts, and needs to evolve alongside your product.&lt;/p&gt;

&lt;p&gt;To understand it better, let’s break down the needs of each team:&lt;/p&gt;

&lt;h2&gt;
  
  
  Design and Development Needs
&lt;/h2&gt;

&lt;p&gt;When you set out to build a Design System—whether from scratch or based on an existing foundation—there are always two sides of the same coin: what &lt;strong&gt;Design&lt;/strong&gt; and &lt;strong&gt;Development&lt;/strong&gt; want and need. That’s where all the &lt;del&gt;problems&lt;/del&gt; challenges begin.&lt;/p&gt;

&lt;p&gt;Let’s take a look at what each team needs.&lt;/p&gt;

&lt;h3&gt;
  
  
  Design 🎨
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Visual consistency&lt;/strong&gt;: A unified visual language (colors, typography, spacing, iconography, etc.).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Speed and efficiency&lt;/strong&gt;: The ability to design interfaces without reinventing the same components every time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scalable designs&lt;/strong&gt;: What works on one screen should work on others (web, mobile, responsive...).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Clear, reusable design tokens&lt;/strong&gt;: Technical definitions for colors, sizes, fonts, z-index, etc.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Direct alignment with implementation&lt;/strong&gt;: What’s designed should look the same in production.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Development 💻
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;True component reuse&lt;/strong&gt;: A stable, well-documented, and easy-to-use library.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Functional and technical consistency&lt;/strong&gt;: Same prop patterns, slots, states, accessibility, validation, etc.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ease of maintenance&lt;/strong&gt;: Clean code, clear naming, tests, and no duplicated logic.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Living documentation&lt;/strong&gt;: Storybook (or similar), with real examples—not just theory.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Adaptability across contexts&lt;/strong&gt;: A button (for example) should work the same in all our applications.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each team has its own priorities, but for a Design System to work, they must &lt;strong&gt;collaborate&lt;/strong&gt;, making decisions based on shared definitions. That’s where the real intersection happens.&lt;/p&gt;

&lt;h3&gt;
  
  
  Shared Needs: The Balance Point 🤝
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Common language&lt;/strong&gt;: Tokens, component names, variants, states. Everyone should speak the same language.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Smooth design–development process&lt;/strong&gt;: Clear handoffs from Figma (or whatever tool is used), efficient handovers, mutual feedback.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Versioning and change control&lt;/strong&gt;: So that design changes can be implemented and communicated without breaking the system.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cross-team adoption&lt;/strong&gt;: It shouldn’t be stuck in one team. It has to be easy to understand and use by everyone.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;In short, a Design System needs to be strict enough to uphold design definitions and prevent undocumented visual changes, but flexible enough to extend and adapt without breaking things.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  How to Drive System Adoption
&lt;/h2&gt;

&lt;p&gt;Having a technically perfect Design System doesn’t mean much if no one uses it.&lt;/p&gt;

&lt;p&gt;One of the biggest challenges isn’t building the system—it’s getting the team to actually adopt it. And I don’t just mean “being aware it exists,” I mean &lt;strong&gt;integrating it into their daily workflow&lt;/strong&gt;, respecting it, questioning it, and keeping it alive.&lt;/p&gt;

&lt;p&gt;Here’s what helped me (and what I learned the hard way):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Involve people from the start&lt;/strong&gt;: If the system is built in isolation, it will generate resistance. The more voices involved early on, the more ownership it creates.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Show value quickly&lt;/strong&gt;: A useful, well-documented, easy-to-use component is worth more than a promise of “someday we’ll have everything tidy.”&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Document with empathy&lt;/strong&gt;: It’s not just about how to use a component, it’s about how someone new will understand it. Real examples, screenshots, use cases, FAQs—all of it helps.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Provide internal support&lt;/strong&gt;: If someone has a problem with a component, there should be a quick way to solve it. Slack, issues, pair programming… whatever it takes, just don’t let people feel alone—and have a clear way to report issues.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Celebrate usage&lt;/strong&gt;: When someone adopts a component, improves it, or reports a bug—celebrate it. Small recognitions help the system feel alive, collaborative, and valuable.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Adoption isn’t an event—it’s a process. It takes time, patience, and lots of communication.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Lessons Learned and Final Recommendations
&lt;/h2&gt;

&lt;p&gt;After all this, here are some takeaways I wish I had known earlier:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A Design System isn’t a project—it’s a product&lt;/strong&gt;. And like any product, it needs research, design, maintenance, communication, and evolution.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Start with what hurts the most&lt;/strong&gt;: Don’t try to solve everything from day one. Identify your biggest pain points and start there.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Perfection isn’t the goal&lt;/strong&gt;: There will always be debt, components to improve, and decisions to revisit. The goal is usefulness and evolution.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No adoption, no system&lt;/strong&gt;: If the team doesn’t use it, it’s just another folder in your repo.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Every team is different&lt;/strong&gt;: Don’t copy someone else’s system expecting it to work the same. Get inspired, sure—but adapt it to your context.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Anticipate problems&lt;/strong&gt;: Your Design System will break. Definitions will change. Plan for that. Build things modular and flexible.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use Atomic Design&lt;/strong&gt;: But use it wisely. Every component is a world of its own. The more atomic each one is, the easier it is to update or extend without breaking everything.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;A Design System is a long-term investment. It can be challenging, even frustrating at times, but once it starts working, &lt;strong&gt;the whole team benefits from speed, consistency, and confidence&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>designsystem</category>
      <category>frontend</category>
      <category>ux</category>
    </item>
    <item>
      <title>Lo que aprendí construyendo Design Systems y que haría diferente</title>
      <dc:creator>Sergio Azócar</dc:creator>
      <pubDate>Thu, 26 Jun 2025 01:02:54 +0000</pubDate>
      <link>https://dev.to/sergioazoc/lo-que-aprendi-construyendo-design-systems-y-que-haria-diferente-35ol</link>
      <guid>https://dev.to/sergioazoc/lo-que-aprendi-construyendo-design-systems-y-que-haria-diferente-35ol</guid>
      <description>&lt;h2&gt;
  
  
  ¿Qué es un Design System?
&lt;/h2&gt;

&lt;p&gt;En simple, es una colección de &lt;strong&gt;reglas&lt;/strong&gt;, &lt;strong&gt;componentes&lt;/strong&gt; y &lt;strong&gt;directrices&lt;/strong&gt; que actúan como una &lt;strong&gt;única fuente de la verdad&lt;/strong&gt; para diseñar y construir interfaces.&lt;/p&gt;

&lt;p&gt;Un buen Design System define desde los &lt;strong&gt;colores&lt;/strong&gt;, &lt;strong&gt;tipografías&lt;/strong&gt; y &lt;strong&gt;espaciados&lt;/strong&gt;, hasta cómo deben comportarse los &lt;strong&gt;botones&lt;/strong&gt;, &lt;strong&gt;formularios&lt;/strong&gt;, &lt;strong&gt;alertas&lt;/strong&gt;, y más. Pero va mucho más allá de lo visual: también establece cómo se comunican diseño y desarrollo, cómo se documentan los patrones y cómo evoluciona el producto de forma consistente.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;La idea es que todo el equipo hable el mismo idioma, diseñe más rápido y construya productos que se sientan coherentes, sin reinventar la rueda en cada pantalla.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;No es solo una librería de componentes. Es una forma de trabajar que busca &lt;strong&gt;alinear diseño, código y experiencia de usuario&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Más adelante voy a entrar en detalle sobre cómo lo construí y qué aprendí, pero primero quiero contarte cómo fue enfrentarme a esta idea desde cero.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cómo terminé construyendo Design Systems
&lt;/h2&gt;

&lt;p&gt;Después de trabajar en distintos proyectos y equipos, empecé a notar patrones que se repiten constantemente:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;El mismo botón diseñado de tres formas distintas
&lt;/li&gt;
&lt;li&gt;Comportamientos inconsistentes en componentes similares
&lt;/li&gt;
&lt;li&gt;Código duplicado o difícil de mantener
&lt;/li&gt;
&lt;li&gt;Malentendidos entre diseño y desarrollo
&lt;/li&gt;
&lt;li&gt;Interfaces que se veían bien en Figma, pero no en producción&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cada vez que un producto crecía, también lo hacía el caos visual y técnico. Y con él, el tiempo que perdíamos resolviendo los mismos problemas una y otra vez.&lt;/p&gt;

&lt;p&gt;Ahí fue cuando entendí que necesitábamos algo más que una librería de componentes. Necesitábamos una &lt;strong&gt;forma compartida de construir interfaces&lt;/strong&gt;, con reglas claras, decisiones centralizadas y una fuente de la verdad para todos los equipos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Expectativa versus realidad
&lt;/h2&gt;

&lt;p&gt;¿Te acuerdas cuando en el colegio te tocaba hacer un trabajo en grupo?&lt;br&gt;&lt;br&gt;
Cada uno hacía su parte por separado, lo juntaban todo al final… y el resultado era un verdadero "Frankenstein".&lt;/p&gt;

&lt;p&gt;Bueno, construir un Design System se siente muchas veces así 😅.&lt;/p&gt;

&lt;p&gt;Al principio crees que va a ordenar todo, que unirá diseño y desarrollo como por arte de magia. Pero en la práctica, aparecen los malentendidos, los atajos, las decisiones cruzadas, y lo que debería ser un sistema coherente empieza a desarmarse.&lt;/p&gt;

&lt;p&gt;Estas fueron algunas de las diferencias más marcadas que viví entre lo que imaginaba… y lo que realmente pasó:&lt;/p&gt;

&lt;h3&gt;
  
  
  🧠 Expectativa:
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;“Voy a crear una librería de componentes reutilizables y el equipo la va a usar feliz.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;🧱 Realidad:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Algunos devs la ignoran, otros la rompen, otros no saben cómo usarla.&lt;br&gt;&lt;br&gt;
Sin documentación, onboarding y soporte interno, nadie la adopta como esperás.&lt;/p&gt;

&lt;h3&gt;
  
  
  🎨 Expectativa:
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;“El diseño está en Figma, así que solo tengo que replicarlo.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;⚠️ Realidad:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
El diseño no contempla estados, errores, focus, interacción, loading...&lt;br&gt;&lt;br&gt;
Terminé tomando muchas decisiones técnicas que no estaban definidas.&lt;/p&gt;

&lt;h3&gt;
  
  
  🧪 Expectativa:
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;“Una vez que los componentes están hechos, no hay que tocarlos más.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;🔄 Realidad:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
El diseño evoluciona, aparecen nuevos requerimientos, y cada cambio afecta múltiples partes del sistema.&lt;br&gt;&lt;br&gt;
Un Design System necesita mantenimiento constante.&lt;/p&gt;

&lt;h3&gt;
  
  
  🧩 Expectativa:
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;“Voy a crear componentes genéricos y reutilizables para todo.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;🧨 Realidad:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Componentes ultra flexibles terminan siendo difíciles de mantener, testear o entender.&lt;br&gt;&lt;br&gt;
A veces es mejor tener variantes claras que un solo componente con 15 props.&lt;/p&gt;

&lt;h3&gt;
  
  
  👥 Expectativa:
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;“Diseño y desarrollo van a trabajar como un solo equipo.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;📉 Realidad:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Sin procesos claros y un lenguaje común, aparecen malentendidos todo el tiempo.&lt;br&gt;&lt;br&gt;
Colaborar no es automático: hay que construir puentes intencionalmente.&lt;/p&gt;

&lt;h3&gt;
  
  
  📦 Expectativa:
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;“Con Tailwind puedo hacer todo sin un Design System.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;🔍 Realidad:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Tailwind ayuda, pero sin decisiones de diseño compartidas, tokens y una estructura clara, tu proyecto igual se vuelve inconsistente.&lt;/p&gt;

&lt;h3&gt;
  
  
  ⏳ Expectativa:
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;“En unas semanas tengo el sistema listo.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;📆 Realidad:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Un Design System no se termina. Es un sistema vivo que crece, se adapta y necesita evolucionar junto a tu producto.&lt;/p&gt;

&lt;p&gt;Para entenderlo mejor, analicemos las necesidades de cada uno:&lt;/p&gt;

&lt;h2&gt;
  
  
  Necesidades de Diseño y Desarrollo
&lt;/h2&gt;

&lt;p&gt;Cuando te enfrentas a crear un Design System —ya sea desde cero o a partir de una base existente— siempre aparecen dos caras de la misma moneda: lo que quiere y necesita tanto &lt;strong&gt;Diseño&lt;/strong&gt; cómo &lt;strong&gt;Desarrollo&lt;/strong&gt;. Es ahí donde empiezan todos los &lt;del&gt;problemas&lt;/del&gt; desafíos.&lt;/p&gt;

&lt;p&gt;Para contextualizar un poco analicemos las necesidades de cada equipo.&lt;/p&gt;

&lt;h3&gt;
  
  
  Diseño 🎨
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Consistencia visual&lt;/strong&gt;: Un lenguaje visual unificado (colores, tipografías, espaciados, iconografía, etc.).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Velocidad y eficiencia&lt;/strong&gt;: Poder diseñar interfaces sin reinventar los mismos componentes cada vez.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Escalabilidad de diseños&lt;/strong&gt;: Que lo que funciona en una pantalla también funcione en otras (web, mobile, responsive...).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Tokens de diseño claros y reutilizables&lt;/strong&gt;: Definición técnica de colores, tamaños, fuentes, z-index, etc.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Relación directa con la implementación&lt;/strong&gt;: Que lo que diseñan se vea igual en producción.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Desarrollo 💻
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Reutilización real de componentes&lt;/strong&gt;: Librería estable, bien documentada y fácil de usar.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Consistencia funcional y técnica&lt;/strong&gt;: Mismos patrones de props, slots, estados, accesibilidad, validación, etc.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Facilidad de mantenimiento&lt;/strong&gt;: Código limpio, con nombres claros, tests, y sin lógica duplicada.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Documentación viva&lt;/strong&gt;: Storybook o similar, con ejemplos reales, no solo teoría.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Adaptabilidad a contextos distintos&lt;/strong&gt;: Que un botón (por ejemplo) funcione igual en cualquiera de las aplicaciones que tenemos.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cada equipo tiene sus propias necesidades y prioridades, pero para que un Design System funcione, &lt;strong&gt;deben trabajar en conjunto&lt;/strong&gt;, tomando decisiones basadas en definiciones compartidas. Ahí es donde deben aprovechar al máximo los puntos de unión entre ambos mundos.&lt;/p&gt;

&lt;h3&gt;
  
  
  Necesidades mutuas, el punto de equilibrio 🤝
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Lenguaje común&lt;/strong&gt;: Tokens, nombres de componentes, variantes, estados. Todos deben hablar el mismo idioma.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Proceso de diseño–desarrollo fluido&lt;/strong&gt;: Entregas claras desde Figma (o lo que usen), handoffs eficientes, feedback mutuo.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Versionado y control de cambios&lt;/strong&gt;: Para que los cambios en diseño se puedan implementar y comunicar sin romper el resto del sistema.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Adopción transversal del sistema&lt;/strong&gt;: Que no se quede en un equipo. Tiene que ser fácil de usar y entender por todos.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;En resumen, un Design System necesita ser lo suficientemente &lt;strong&gt;cerrado&lt;/strong&gt; como para respetar las definiciones de diseño sin permitir cambios visuales arbitrarios, pero también lo suficientemente &lt;strong&gt;flexible&lt;/strong&gt; como para extenderse y adaptarse sin romper nada.  &lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Cómo lograr la adopción del sistema
&lt;/h2&gt;

&lt;p&gt;Tener un Design System técnicamente impecable no sirve de mucho si nadie lo usa.&lt;/p&gt;

&lt;p&gt;Uno de los mayores desafíos no es construir el sistema, sino lograr que el equipo lo adopte de verdad. Y no me refiero solo a “que lo conozcan”, sino a que &lt;strong&gt;lo integren en su día a día&lt;/strong&gt;, lo respeten, lo cuestionen y lo mantengan vivo.&lt;/p&gt;

&lt;p&gt;Algunas cosas que me funcionaron (y otras que aprendí a la fuerza):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Involucrar desde el inicio&lt;/strong&gt;: Si el sistema se construye entre unos pocos, alejado del equipo, va a generar rechazo. Mientras más voces participen desde el comienzo, más pertenencia genera.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Mostrar valor rápidamente&lt;/strong&gt;: Un componente útil, bien documentado y fácil de usar vale más que una promesa de “algún día vamos a tener todo ordenado”.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Documentar con empatía&lt;/strong&gt;: No es solo escribir cómo usar un componente, es pensar en cómo lo entenderá alguien que llega por primera vez. Ejemplos reales, capturas, casos de uso, FAQs... todo suma.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Dar soporte interno&lt;/strong&gt;: Si alguien tiene un problema con un componente, tiene que haber una forma rápida de resolverlo. Slack, issues, pair programming... lo que sea, pero que no sientan que están solos y sobre todo, un flujo claro de como reportar los errores.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Celebrar el uso&lt;/strong&gt;: Cuando alguien adopta un componente, lo mejora o reporta un bug, hay que celebrarlo. Pequeños reconocimientos hacen que el sistema se vea como algo vivo, colaborativo y útil.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;La adopción no es un evento, es un proceso. Y requiere tiempo, paciencia y mucha comunicación.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Lecciones aprendidas y recomendaciones
&lt;/h2&gt;

&lt;p&gt;Después de todo este proceso, me quedo con varias ideas que ojalá hubiese sabido antes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Un Design System no es un proyecto, es un producto&lt;/strong&gt;. Y como todo producto, necesita investigación, diseño, mantenimiento, comunicación y evolución.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Empieza por lo que más duele&lt;/strong&gt;: No intentes resolver todo desde el día uno. Identifica qué está causando más fricción hoy y empieza por ahí.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;La perfección no es el objetivo&lt;/strong&gt;: Siempre va a haber deuda, componentes por mejorar y decisiones que se pueden cuestionar. La clave es que sea útil y evolucione.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Sin adopción, no hay sistema&lt;/strong&gt;: Si no lo usa el equipo, es solo una carpeta más en tu repo.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Cada equipo es distinto&lt;/strong&gt;: No copies un sistema de otro lado esperando que funcione igual. Inspírate, sí, pero adapta todo a tu contexto y necesidades reales.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Anticipa los problemas&lt;/strong&gt;: Tu Design System puede y va a fallar, habrán cambios de definiciones y de diseño. Ten eso en cuenta para que construyas todo de forma modular y flexible.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Utiliza Atomic Design&lt;/strong&gt;: Pero utilizalo bien, cada componente es un mundo por si mismo, mientras más atómico sea cada uno, más fácil es modificarlo o extenderlo sin romperlo todo.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Un Design System es una inversión a largo plazo. Puede ser desafiante, incluso frustrante a veces, pero cuando empieza a funcionar, &lt;strong&gt;todo el equipo gana en velocidad, consistencia y confianza&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>designsystem</category>
      <category>frontend</category>
      <category>ux</category>
    </item>
    <item>
      <title>Screaming Architecture: The Key to a Scalable Frontend</title>
      <dc:creator>Sergio Azócar</dc:creator>
      <pubDate>Thu, 19 Jun 2025 03:17:57 +0000</pubDate>
      <link>https://dev.to/sergioazoc/screaming-architecture-the-key-to-a-scalable-frontend-1e8l</link>
      <guid>https://dev.to/sergioazoc/screaming-architecture-the-key-to-a-scalable-frontend-1e8l</guid>
      <description>&lt;h2&gt;
  
  
  What is Screaming Architecture?
&lt;/h2&gt;

&lt;p&gt;When you open a project, do you instantly know what it's about, or do you have to dig into the code to understand it? If your answer is the latter, this article is for you.&lt;/p&gt;

&lt;p&gt;I'm going to tell you about &lt;strong&gt;Screaming Architecture&lt;/strong&gt;, a code organization approach that, instead of screaming the technology you use, screams the business's &lt;strong&gt;purpose&lt;/strong&gt; and its &lt;strong&gt;functionalities&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why use it in the frontend?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;🧭 &lt;strong&gt;Immediate clarity:&lt;/strong&gt; You understand the code's purpose just by looking at its structure.&lt;/li&gt;
&lt;li&gt;🧱 &lt;strong&gt;True scalability:&lt;/strong&gt; Each functionality grows in an isolated, orderly manner.&lt;/li&gt;
&lt;li&gt;👥 &lt;strong&gt;Faster onboarding:&lt;/strong&gt; New devs understand the project better and quicker.&lt;/li&gt;
&lt;li&gt;🧹 &lt;strong&gt;Safer refactorings:&lt;/strong&gt; Everything is more encapsulated.&lt;/li&gt;
&lt;li&gt;🚀 &lt;strong&gt;Facilitates testing, modularization, and team division.&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Problem with "Generic" Structures
&lt;/h2&gt;

&lt;p&gt;Most frontend projects, especially at the beginning, use a folder structure based on technical types: &lt;code&gt;components/&lt;/code&gt;, &lt;code&gt;views/&lt;/code&gt;, &lt;code&gt;services/&lt;/code&gt;, &lt;code&gt;utils/&lt;/code&gt;, &lt;code&gt;store/&lt;/code&gt;, etc.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;src/
├── components/
├── views/
├── services/
├── utils/
└── store/
└── ...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;While it's a starting point, this structure has its problems, especially as your application grows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Logic dispersion&lt;/strong&gt;: For a single functionality (e.g., "User Management"), its parts (UI components, store logic, API calls) are scattered throughout the entire project.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Navigation difficulty&lt;/strong&gt;: You have to jump between many folders to understand how a complete feature works.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Painful maintenance&lt;/strong&gt;: A change in one function might require modifying files in several folders, increasing the risk of introducing errors.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Infrastructure coupling&lt;/strong&gt;: The structure tells you &lt;em&gt;how&lt;/em&gt; it's built (with services, components), not &lt;em&gt;what&lt;/em&gt; your business does.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Imagine a house blueprint. You don't see a "bricks" section, another for "cement," and another for "windows." You see "kitchen," "bedroom," "bathroom." The blueprints "scream" the purpose and functions of each space.&lt;/p&gt;

&lt;p&gt;Screaming Architecture seeks the same for your code. Your high-level folder structure should "scream" the main features or business domains of your application, not the technologies you use.&lt;/p&gt;

&lt;h2&gt;
  
  
  Advantages of using Screaming Architecture
&lt;/h2&gt;

&lt;p&gt;Implementing this approach isn't just about aesthetics; it brings tangible benefits that allow you to scale your application and your team.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Instant understanding&lt;/strong&gt;: You open the project and, at a glance, you know what the business does.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Fast onboarding&lt;/strong&gt;: New developers understand the business structure much faster.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Simplified maintenance&lt;/strong&gt;: Changes to a functionality are kept localized within its own module.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Isolated changes, fewer errors&lt;/strong&gt;: You reduce the risk of breaking other parts of the system when modifying a feature.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;More scalable code&lt;/strong&gt;: You can add new functionalities (features) without affecting existing code.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Intuitive navigation&lt;/strong&gt;: You look for business functionalities, not generic file types.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Less coupling&lt;/strong&gt;: The core business logic is more independent of technical details.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Safer refactorings&lt;/strong&gt;: Moving or refactoring an entire feature is less risky.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Facilitates testing&lt;/strong&gt;: Functionalities are easier to isolate and test.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Your project becomes predictable&lt;/strong&gt;: Growth is organized and controlled.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Applying Screaming Architecture
&lt;/h2&gt;

&lt;p&gt;We'll use a Vue project as an example, but it's 100% applicable to any other technology.&lt;/p&gt;

&lt;p&gt;The key is to group code by &lt;strong&gt;features&lt;/strong&gt; or &lt;strong&gt;business domains&lt;/strong&gt;. Each feature folder will contain everything needed for that functionality.&lt;/p&gt;

&lt;p&gt;Here's a practical example of what the structure might look like in your project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;src/
├── modules/            # Could also be called "Features" or "Domain," something that groups
│   │                   # functionalities
│   ├── Auth/           # Everything related to authentication
│   │   ├── components/ # LoginButton.vue, RegisterForm.vue
│   │   ├── views/      # LoginView.vue, RegisterView.vue
│   │   ├── routes/     # Specific routes for this module
│   │   ├── store/      # auth.store.js (Pinia store for Auth)
│   │   └── services/   # auth.service.js (Auth API calls)
│   ├── Products/       # Everything related to products
│   │   ├── components/ # ProductCard.vue, ProductList.vue
│   │   ├── views/      # ProductsView.vue, ProductDetailView.vue
│   │   ├── routes/     # Specific routes for this module
│   │   ├── store/      # products.store.js
│   │   └── services/   # products.service.js
│   ├── Orders/         # Everything related to orders
│   │   ├── components/
│   │   ├── routes/
│   │   ├── views/
│   │   ├── store/
│   │   └── services/
│   └── Profile/        # And so on for other features...
│       ├── components/
│       └── ...
├── shared/             # Truly cross-cutting elements that don't belong to a
│   │                   # specific feature
│   ├── ui/
│   │   ├── components/ # BaseButton.vue, ModalBase.vue (generic UI components)
│   │   └── composables/# useModal.js, useDarkMode.js (composables that only affect
│   │                   # UI components)
│   ├── composables/    # useDebounce.js, useLocalStorage.js (reusable logic
│   │                   # without business state)
│   ├── utils/          # formatDate.js, validateEmail.js
│   └── assets/         # Global images, base styles
├── layouts/            # Layout templates (DefaultLayout.vue, AuthLayout.vue)
├── router/             # General application router
├── app.vue
├── main.js
└── vite.config.js      # Vite configuration
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;The structure mentioned is just an example; you can adapt it to your own needs.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The important thing is that each &lt;strong&gt;Module&lt;/strong&gt; has its own folder structure as you need it; you won't always have a "Store" or "Services" in every module, for example.&lt;/p&gt;

&lt;h2&gt;
  
  
  When to Use Screaming Architecture? (and when not to?)
&lt;/h2&gt;

&lt;p&gt;This approach is powerful, but it's not a silver bullet for all projects:&lt;/p&gt;

&lt;h3&gt;
  
  
  Ideal for:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Medium to large projects with complex business logic.&lt;/li&gt;
&lt;li&gt;Applications expected to grow significantly.&lt;/li&gt;
&lt;li&gt;Teams with multiple developers.&lt;/li&gt;
&lt;li&gt;When clarity and long-term maintenance are priorities.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Perhaps excessive for:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Very small projects or MVPs ("Minimum Viable Products") that you know won't scale much.&lt;/li&gt;
&lt;li&gt;Very simple CRUD (Create, Read, Update, Delete) applications where the logic is minimal.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Considerations:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;If your project has the potential to grow, adopting Screaming Architecture from the beginning, or at least in early stages, will save you a lot of headaches in the future.&lt;/li&gt;
&lt;li&gt;In an existing application, you can progressively adopt Screaming Architecture by migrating one module at a time.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion: Make Your Architecture Scream Its Purpose
&lt;/h2&gt;

&lt;p&gt;Screaming Architecture is more than just a way to organize folders; it's a mindset that prioritizes &lt;strong&gt;business cohesion&lt;/strong&gt; over technical infrastructure. By making your code scream its functionalities, you not only improve readability and maintainability but also lay a solid foundation for your &lt;strong&gt;frontend to scale&lt;/strong&gt; efficiently and in a controlled manner.&lt;/p&gt;

&lt;p&gt;Are you ready for your next project's architecture to start screaming?&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>frontend</category>
      <category>vue</category>
      <category>scalability</category>
    </item>
    <item>
      <title>Screaming Architecture: La Clave para un Frontend Escalable</title>
      <dc:creator>Sergio Azócar</dc:creator>
      <pubDate>Thu, 19 Jun 2025 03:16:03 +0000</pubDate>
      <link>https://dev.to/sergioazoc/screaming-architecture-la-clave-para-un-frontend-escalable-4po</link>
      <guid>https://dev.to/sergioazoc/screaming-architecture-la-clave-para-un-frontend-escalable-4po</guid>
      <description>&lt;h2&gt;
  
  
  ¿Qué es Screaming Architecture?
&lt;/h2&gt;

&lt;p&gt;Cuando abres un proyecto, ¿sabes al instante de qué trata, o tienes que bucear en el código para entenderlo? Si tu respuesta es lo segundo, este artículo es para ti.&lt;/p&gt;

&lt;p&gt;Te voy a contar sobre Screaming Architecture, un enfoque de organización de código que, en lugar de gritar la tecnología que usas, grita el &lt;strong&gt;propósito&lt;/strong&gt; del negocio y sus &lt;strong&gt;funcionalidades&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Por qué usarlo en el frontend?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;🧭 &lt;strong&gt;Claridad inmediata:&lt;/strong&gt; entendés el propósito del código con solo ver la estructura.&lt;/li&gt;
&lt;li&gt;🧱 &lt;strong&gt;Escalabilidad real:&lt;/strong&gt; cada funcionalidad crece de forma aislada y ordenada.&lt;/li&gt;
&lt;li&gt;👥 &lt;strong&gt;Onboarding más rápido:&lt;/strong&gt; nuevos devs entienden mejor y más rápido el proyecto.&lt;/li&gt;
&lt;li&gt;🧹 &lt;strong&gt;Refactorizaciones más seguras:&lt;/strong&gt; todo está más encapsulado.&lt;/li&gt;
&lt;li&gt;🚀 &lt;strong&gt;Facilita pruebas, modularización y división de equipo.&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  El Problema de la Estructura "Genérica"
&lt;/h2&gt;

&lt;p&gt;La mayoría de los proyectos frontend, especialmente al inicio, usan una estructura de carpetas basada en tipos técnicos: components/, views/, services/, utils/, store/, etc.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;src/
├── components/
├── views/
├── services/
├── utils/
└── store/
└── ...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Si bien es un punto de partida, esta estructura tiene sus problemas, especialmente a medida que tu aplicación crece:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Dispersión de la lógica&lt;/strong&gt;: Para una sola funcionalidad (ej. "Gestión de Usuarios"), sus partes (componentes de UI, lógica del store, llamadas a la API) están esparcidas por todo el proyecto.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Dificultad de navegación&lt;/strong&gt;: Tienes que saltar entre muchas carpetas para entender cómo funciona una característica completa.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Mantenimiento doloroso&lt;/strong&gt;: Un cambio en una función puede requerir modificar archivos en varias carpetas, aumentando el riesgo de introducir errores.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Acoplamiento a la infraestructura&lt;/strong&gt;: La estructura te dice cómo está hecho (con servicios, componentes), no qué hace tu negocio.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Imagina el plano de una casa. No ves una sección de "ladrillos", otra de "cemento" y otra de "ventanas". Ves "cocina", "dormitorio", "baño". Los planos "gritan" el propósito y las funciones de cada espacio.&lt;/p&gt;

&lt;p&gt;La Screaming Architecture busca lo mismo para tu código. Tu estructura de carpetas de alto nivel debería "gritar" las características principales o los dominios de negocio de tu aplicación, no las tecnologías que usas.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ventajas de usar Screaming Architecture
&lt;/h2&gt;

&lt;p&gt;Implementar este enfoque no es solo por estética, trae beneficios tangibles que te permiten escalar tu aplicación y tu equipo.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Entendimiento instantáneo&lt;/strong&gt;: Abres el proyecto y de un vistazo sabes que hace el negocio.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Onboarding veloz&lt;/strong&gt;: Nuevos desarrolladores entienden la estructura del negocio mucho más rápido.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Mantenimiento simplificado&lt;/strong&gt;: Los cambios en una funcionalidad se mantienen localizados en su propio módulo.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Cambios aislados, menos errores&lt;/strong&gt;: Reduces el riesgo de romper otras partes del sistema al modificar una feature.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Código más escalable&lt;/strong&gt;: Puedes añadir nuevas funcionalidades (features) sin afectar el código de las existentes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Navegación intuitiva&lt;/strong&gt;: Buscas funcionalidades de negocio, no tipos de archivos genéricos.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Menos acoplamiento&lt;/strong&gt;: La lógica de negocio central es más independiente de los detalles técnicos.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Refactorización más segura&lt;/strong&gt;: Mover o refactorizar una feature entera es menos arriesgado.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Facilita el testing&lt;/strong&gt;: Las funcionalidades son más fáciles de aislar y testear.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Tu proyecto se vuelve predecible&lt;/strong&gt;: El crecimiento es organizado y controlado.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Aplicando Screaming Architecture
&lt;/h2&gt;

&lt;p&gt;Tomaremos como ejemplo un proyecto de Vue, pero es 100% aplicable a cualquier otra tecnología.&lt;/p&gt;

&lt;p&gt;La clave es agrupar el código por features o dominios de negocio. Cada carpeta de feature contendrá todo lo necesario para esa funcionalidad.&lt;/p&gt;

&lt;p&gt;Aquí tienes un ejemplo práctico de cómo podría verse la estructura en tú proyecto:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;src/
├── modules/              # También podría llamarse "Features" o "Domain", algo que agrupe
│   │                       las funcionalidades
│   ├── Auth/             # Todo lo relacionado con autenticación
│   │   ├── components/   # LoginButton.vue, RegisterForm.vue
│   │   ├── views/        # LoginView.vue, RegisterView.vue
│   │   ├── routes/       # Rutas específicas de este módulo
│   │   ├── store/        # auth.store.js (store de Pinia para Auth)
│   │   └── services/     # auth.service.js (llamadas a la API de Auth)
│   ├── Products/         # Todo lo relacionado con productos
│   │   ├── components/   # ProductCard.vue, ProductList.vue
│   │   ├── views/        # ProductsView.vue, ProductDetailView.vue
│   │   ├── routes/       # Rutas específicas de este módulo
│   │   ├── store/        # products.store.js
│   │   └── services/     # products.service.js
│   ├── Orders/           # Todo lo relacionado con pedidos
│   │   ├── components/
│   │   ├── routes/
│   │   ├── views/
│   │   ├── store/
│   │   └── services/
│   └── Profile/          # Y así sucesivamente para otras features...
│       ├── components/
│       └── ...
├── shared/               # Elementos verdaderamente transversales que no pertenecen a una
│   │                       feature específica
│   ├── ui/
│   │   ├── components/   # BaseButton.vue, ModalBase.vue (componentes UI genéricos)
│   │   └── composables/  # useModal.js, useDarkMode,js (composables que afectan sólo a
│   │                       componentes de UI)
│   ├── composables/      # useDebounce.js, useLocalStorage.js (lógica reutilizable
│   │                       sin estado de negocio)
│   ├── utils/            # formatDate.js, validateEmail.js
│   └── assets/           # Imágenes globales, estilos base
├── layouts/              # Plantillas de layout (DefaultLayout.vue, AuthLayout.vue)
├── router/               # Router general de la aplicación
├── app.vue
├── main.js
└── vite.config.js        # Configuración de vite
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;La estructura mencionada es sólo un ejemplo, puedes adaptarla según tus propias necesidades.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Lo importante es que cada &lt;strong&gt;Module&lt;/strong&gt; tenga su propia estructura de carpetas según lo necesites, no siempre vas a tener un "Store" o "Services" en cada módulo, por ejemplo.&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Cuándo Usar Screaming Architecture? (¿y cuándo no?)
&lt;/h2&gt;

&lt;p&gt;Este enfoque es poderoso, pero no es la bala de plata para todos los proyectos:&lt;/p&gt;

&lt;h3&gt;
  
  
  Ideal para:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Proyectos medianos a grandes con lógica de negocio compleja.&lt;/li&gt;
&lt;li&gt;Aplicaciones que se espera que crezcan significativamente.&lt;/li&gt;
&lt;li&gt;Equipos con varios desarrolladores.&lt;/li&gt;
&lt;li&gt;Cuando la claridad y el mantenimiento a largo plazo son prioritarios.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Quizás excesivo para:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Proyectos muy pequeños o MVPs ("Minimum Viable Products") que sabes que no escalarán mucho.&lt;/li&gt;
&lt;li&gt;Aplicaciones CRUD (Crear, Leer, Actualizar, Borrar) muy simples donde la lógica es mínima.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Consideraciones:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Si tu proyecto tiene potencial de crecer, adoptar la Screaming Architecture desde el principio o al menos en fases tempranas, te ahorrará muchos dolores de cabeza en el futuro.&lt;/li&gt;
&lt;li&gt;En una aplicación existente, puedes ir adoptando Screaming Architecture de forma progesiva, migrando un módulo a la vez.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusión: Haz que tu Arquitectura Grite su Propósito
&lt;/h2&gt;

&lt;p&gt;La Screaming Architecture es más que una simple forma de organizar carpetas; es una mentalidad que prioriza la cohesión del negocio sobre la infraestructura técnica. Al hacer que tu código grite sus funcionalidades, no solo mejoras la legibilidad y la mantenibilidad, sino que defines una base sólida para que tu frontend escale de forma eficiente y controlada.&lt;/p&gt;

&lt;p&gt;¿Estás listo para que la arquitectura de tu próximo proyecto comience a gritar?&lt;/p&gt;

</description>
      <category>arquitectura</category>
      <category>frontend</category>
      <category>vue</category>
      <category>escalabilidad</category>
    </item>
  </channel>
</rss>
