<?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: Franklin</title>
    <description>The latest articles on DEV Community by Franklin (@ortizfranklindev).</description>
    <link>https://dev.to/ortizfranklindev</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2493878%2F8821e986-c182-499a-92e4-d91e7e960256.png</url>
      <title>DEV Community: Franklin</title>
      <link>https://dev.to/ortizfranklindev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ortizfranklindev"/>
    <language>en</language>
    <item>
      <title>La mejor arquitectura CSS comienza al decidir qué no debe hacer CSS jamás</title>
      <dc:creator>Franklin</dc:creator>
      <pubDate>Tue, 25 Aug 2026 10:36:43 +0000</pubDate>
      <link>https://dev.to/ortizfranklindev/la-mejor-arquitectura-css-comienza-al-decidir-que-no-debe-hacer-css-jamas-1a7k</link>
      <guid>https://dev.to/ortizfranklindev/la-mejor-arquitectura-css-comienza-al-decidir-que-no-debe-hacer-css-jamas-1a7k</guid>
      <description>&lt;p&gt;&lt;em&gt;También disponible en&lt;/em&gt; &lt;a href="https://dev.to/ortizfranklindev/the-best-css-architecture-starts-by-deciding-what-css-should-never-do-1d5o"&gt;Inglés&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  El problema
&lt;/h2&gt;

&lt;p&gt;Un sistema de tokens de diseño comienza limpio. Colores, espaciado, escala tipográfica; todos valores, todos legítimos. Luego, alguien necesita una forma rápida de rastrear si un modal está abierto, y una propiedad personalizada está justo ahí, sintácticamente idéntica a cada token a su alrededor. Se usa. Nadie se detiene a preguntar si debería haberse usado.&lt;/p&gt;

&lt;p&gt;Una hoja de estilo comienza siendo solo para presentación. Luego aparece un selector que solo se aplica si el usuario ha iniciado sesión; una decisión que CSS no tiene por qué tomar, codificada en CSS de todos modos, porque en ese momento era el camino de menor resistencia.&lt;/p&gt;

&lt;p&gt;Ninguna de las dos opciones parece incorrecta cuando se toma. El patrón en ambas es el mismo: nada en el sistema tenía argumentos para decir no.&lt;/p&gt;

&lt;h2&gt;
  
  
  Por qué existe el problema
&lt;/h2&gt;

&lt;p&gt;Las conversaciones sobre arquitectura casi siempre comienzan con la misma pregunta: qué debe hacer este sistema. Es una pregunta natural y generativa, pero no tiene un punto de parada natural. Cada capacidad que alguien pueda imaginar es candidata para ser incluida, y rara vez hay un momento obvio para decir no, categóricamente, independientemente de lo conveniente que sea esto en este momento.&lt;/p&gt;

&lt;p&gt;El resultado son sistemas que acumulan permisos por defecto. La restricción solo aparece de manera reactiva, después de que algo ya ha salido mal y alguien tiene que escribir la autopsia explicando cómo un booleano terminó viviendo dentro de un token de diseño.&lt;/p&gt;

&lt;h2&gt;
  
  
  El primer principio
&lt;/h2&gt;

&lt;p&gt;Un sistema sin exclusiones declaradas eventualmente será requerido para hacerlo todo, porque nada dentro de él tiene argumentos para negarse.&lt;/p&gt;

&lt;p&gt;Vale la pena decirlo claramente, porque invierte la forma en que la mayoría de la gente piensa sobre el diseño: las exclusiones no son la ausencia de arquitectura. Son su parte más resistente. Este es el mismo principio mencionado anteriormente en esta serie: un límite es una garantía, no una limitación, llevado un nivel más profundo. No solo dónde termina CSS y comienza JavaScript, sino lo que CSS se niega a convertirse mientras permanece por completo dentro de su propio dominio.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demostración del principio
&lt;/h2&gt;

&lt;p&gt;Sintaxis idéntica. Validez idéntica, en lo que respecta al navegador. Uno es un valor. El otro es estado de la aplicación, vestido de token, porque nada en la plataforma los distingue y nada en el diseño del sistema decidió hacerlo. El navegador nunca rechazará esto. El rechazo tiene que provenir de una decisión tomada de antemano; no de una limitación que la plataforma entregue gratis a nadie.&lt;/p&gt;

&lt;h2&gt;
  
  
  quell como caso de estudio
&lt;/h2&gt;

&lt;p&gt;La capa de tokens de quell contiene valores, y solo valores. No porque la plataforma lo imponga, sino porque el sistema decidió, de antemano, no permitir que nada que se asemeje a estado o lógica viva allí.&lt;/p&gt;

&lt;h2&gt;
  
  
  La lección más amplia
&lt;/h2&gt;

&lt;p&gt;Los sistemas más fuertes, tanto en el desarrollo de software como fuera de él, suelen definirse tanto por lo que han declarado que no harán como por lo que pueden hacer. Qué no debería hacer esto nunca es una pregunta más difícil que qué debería hacer esto, precisamente porque exige una decisión tomada de antemano, una que la conveniencia seguirá tentando silenciosamente a romper más tarde.&lt;/p&gt;

&lt;p&gt;Esa es la diferencia entre un sistema que simplemente funciona hoy y uno construido para seguir teniendo sentido después de que la persona que lo escribió ya no sea quien responda las preguntas al respecto.&lt;/p&gt;

</description>
      <category>css</category>
      <category>arquitectura</category>
      <category>desarrolloweb</category>
      <category>frontend</category>
    </item>
    <item>
      <title>The Best CSS Architecture Starts by Deciding What CSS Should Never Do</title>
      <dc:creator>Franklin</dc:creator>
      <pubDate>Tue, 25 Aug 2026 10:34:55 +0000</pubDate>
      <link>https://dev.to/ortizfranklindev/the-best-css-architecture-starts-by-deciding-what-css-should-never-do-1d5o</link>
      <guid>https://dev.to/ortizfranklindev/the-best-css-architecture-starts-by-deciding-what-css-should-never-do-1d5o</guid>
      <description>&lt;p&gt;&lt;em&gt;Also available in &lt;a href="https://dev.to/ortizfranklindev/la-mejor-arquitectura-css-comienza-al-decidir-que-no-debe-hacer-css-jamas-1a7k"&gt;Español&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;A design token system starts clean. Colors, spacing, type scale all values, all legitimate. Then someone needs a quick way to track whether a modal is open, and a custom property is right there, syntactically identical to every token around it. It gets used. Nobody stops to ask whether it should have been.&lt;/p&gt;

&lt;p&gt;A stylesheet starts as presentation-only. Then a selector shows up that only applies &lt;code&gt;if the user is logged in&lt;/code&gt; a decision CSS has no business making, encoded into CSS anyway, because in the moment it was the path of least resistance.&lt;/p&gt;

&lt;p&gt;Neither choice looks wrong when it's made. The pattern across both is the same: nothing in the system had grounds to say no.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the Problem Exists
&lt;/h2&gt;

&lt;p&gt;Architecture conversations almost always start with the same question: what should this system do. It's a natural question, and a generative one but it has no natural stopping point. Every capability someone can imagine is a candidate for inclusion, and there's rarely an obvious moment to say "no, categorically, regardless of how convenient this would be right now."&lt;/p&gt;

&lt;p&gt;The result is systems that accumulate permission by default. Restriction only shows up reactively, after something has already gone wrong and someone has to write the postmortem explaining how a boolean ended up living inside a design token.&lt;/p&gt;

&lt;h2&gt;
  
  
  The First Principle
&lt;/h2&gt;

&lt;p&gt;A system with no declared exclusions will eventually be asked to do everything, because nothing inside it has grounds to refuse.&lt;/p&gt;

&lt;p&gt;This is worth stating plainly, because it inverts how most people think about design: exclusions aren't the absence of architecture. They're the most load-bearing part of it. This is the same principle named earlier in this series a boundary is a guarantee, not a limitation, pushed one level deeper. Not just where CSS ends and JavaScript begins, but what CSS refuses to become while staying entirely inside its own domain.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demonstrating the Principle
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nt"&gt;--spacing-md&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="err"&gt;1&lt;/span&gt;&lt;span class="nt"&gt;rem&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="nt"&gt;--is-modal-open&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="err"&gt;1&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Identical syntax. Identical validity, as far as the browser is concerned. One is a value. The other is application state, wearing a token's clothing, because nothing about the platform distinguishes them and nothing about the system's design decided to. The browser will never refuse this. The refusal has to come from a decision made in advance not a limitation the platform hands anyone for free.&lt;/p&gt;

&lt;h2&gt;
  
  
  quell as the Case Study
&lt;/h2&gt;

&lt;p&gt;quell's token layer holds values, and only values. Not because the platform enforces it, but because the system decided, in advance, not to let anything resembling state or logic live there.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Broader Lesson
&lt;/h2&gt;

&lt;p&gt;The strongest systems, in software and well outside it, are usually defined as much by what they've declared they won't do as by what they can. "What should this never do" is a harder question than "what should this do," precisely because it asks for a decision made in advance, one that convenience will keep quietly tempting someone to break later.&lt;/p&gt;

&lt;p&gt;That's the difference between a system that merely works today and one built to still make sense after the person who wrote it is no longer the one answering questions about it.&lt;/p&gt;

</description>
      <category>css</category>
      <category>webdev</category>
      <category>architecture</category>
      <category>frontend</category>
    </item>
    <item>
      <title>Notas de campo: la resolución de la cascada, de principio a fin</title>
      <dc:creator>Franklin</dc:creator>
      <pubDate>Sat, 22 Aug 2026 11:41:28 +0000</pubDate>
      <link>https://dev.to/ortizfranklindev/notas-de-campo-la-resolucion-de-la-cascada-de-principio-a-fin-34jh</link>
      <guid>https://dev.to/ortizfranklindev/notas-de-campo-la-resolucion-de-la-cascada-de-principio-a-fin-34jh</guid>
      <description>&lt;p&gt;El artículo del jueves describió el orden en que el navegador resuelve los conflictos de CSS: primero origen e importancia, luego el orden de las capas, después la especificidad y, por último, el &lt;em&gt;source order&lt;/em&gt;, con la herencia por debajo de todo. Describir un orden es una cosa. Verlo funcionar en un conflicto real es otra. Esto es eso.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;También disponible en&lt;/em&gt; &lt;a href="https://dev.to/ortizfranklindev/field-notes-watching-the-cascade-resolve-start-to-finish-7jo"&gt;Inglés&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  La preparación (The Setup)
&lt;/h2&gt;

&lt;p&gt;Un botón. Seis declaraciones. Todas compiten por la misma propiedad, abarcando cada etapa de la secuencia de resolución:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="c"&gt;/* UA stylesheet — browser default */&lt;/span&gt;
&lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;buttontext&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;/* Author, @layer base (declared first) */&lt;/span&gt;
&lt;span class="k"&gt;@layer&lt;/span&gt; &lt;span class="n"&gt;base&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nc"&gt;.btn&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;black&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;/* Author, @layer utilities (declared after base) */&lt;/span&gt;
&lt;span class="k"&gt;@layer&lt;/span&gt; &lt;span class="n"&gt;utilities&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nc"&gt;.text-blue&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;blue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;/* Author, unlayered */&lt;/span&gt;
&lt;span class="nf"&gt;#submit&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;red&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;/* Author, !important */&lt;/span&gt;
&lt;span class="k"&gt;@layer&lt;/span&gt; &lt;span class="n"&gt;base&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nc"&gt;.btn&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;purple&lt;/span&gt; &lt;span class="cp"&gt;!important&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;/* User stylesheet — e.g. a browser accessibility override */&lt;/span&gt;
&lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;green&lt;/span&gt; &lt;span class="cp"&gt;!important&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"submit"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"btn text-blue"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Submit&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;¿Qué color gana? &lt;/p&gt;

&lt;h2&gt;
  
  
  Etapa uno: Origen e importancia
&lt;/h2&gt;

&lt;p&gt;Esta etapa se comprueba antes de consultar cualquier otra regla de la lista y termina el conflicto de inmediato: gana el color verde (&lt;em&gt;green&lt;/em&gt;).&lt;/p&gt;

&lt;p&gt;No ocurre por ser el selector más específico. No lo es; un selector simple como &lt;code&gt;button&lt;/code&gt; es tan poco específico como se pueda imaginar. Gana porque un &lt;code&gt;!important&lt;/code&gt; con origen de usuario (&lt;em&gt;user-origin&lt;/em&gt;) supera a un &lt;code&gt;!important&lt;/code&gt; con origen de autor (&lt;em&gt;author-origin&lt;/em&gt;). Es el único punto donde la lógica habitual el autor supera al usuario se invierte.&lt;/p&gt;

&lt;p&gt;Cabe preguntarse por qué la plataforma está construida así. La razón es breve y sólida: el usuario a veces necesita una forma de sobrescribir los estilos del autor que le perjudican. Un sitio que define un texto demasiado pequeño para leerse, o una combinación de colores que no cumple con sus necesidades de contraste. Si el &lt;code&gt;!important&lt;/code&gt; del autor siempre superara al &lt;code&gt;!important&lt;/code&gt; del usuario, esa sobrescritura sería imposible de aplicar, sin importar la configuración del navegador o de la tecnología de asistencia. Los ajustes de accesibilidad deben mantener su autoridad. Por eso la cascada otorga la última palabra al &lt;code&gt;!important&lt;/code&gt; de usuario, específicamente para garantizar que esa regla se cumpla.&lt;/p&gt;

&lt;p&gt;No es un caso extremo oculto en la especificación. Es la razón de ser de esta etapa del algoritmo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Etapa dos: Orden de capas (Layer Order)
&lt;/h2&gt;

&lt;p&gt;Elimina las dos declaraciones &lt;code&gt;!important&lt;/code&gt; la sobrescritura del usuario y la del autor y observa lo que queda: cuatro declaraciones de importancia normal, distribuidas en la hoja de estilo del agente de usuario (&lt;em&gt;UA stylesheet&lt;/em&gt;), dos capas de autor (&lt;em&gt;authored layers&lt;/em&gt;) y una regla sin capa (&lt;em&gt;unlayered&lt;/em&gt;).&lt;/p&gt;

&lt;p&gt;El orden de las capas resuelve esto antes de llegar a la especificidad. La regla sin capa &lt;code&gt;#submit { color: red; }&lt;/code&gt; supera a cualquier regla con capa, sin condiciones. Los estilos sin capa siempre ganan a los estilos con capa, sin importar cuán pesado o ligero sea el selector dentro de ella. El color rojo (&lt;em&gt;red&lt;/em&gt;) gana esta ronda. &lt;/p&gt;

&lt;p&gt;Deja de lado la regla sin capa por un momento. La comparación se vuelve más interesante: &lt;code&gt;.btn&lt;/code&gt; en &lt;code&gt;base&lt;/code&gt; contra &lt;code&gt;.text-blue&lt;/code&gt; en &lt;code&gt;utilities&lt;/code&gt;. &lt;code&gt;utilities&lt;/code&gt; se declaró después de &lt;code&gt;base&lt;/code&gt;, por lo que &lt;code&gt;.text-blue&lt;/code&gt; habría ganado. No porque el color azul (&lt;em&gt;blue&lt;/em&gt;) tenga un selector más específico que el negro (&lt;em&gt;black&lt;/em&gt;) no es así, ambos son clases individuales, sino porque la capa en la que reside se declaró más tarde. Este es el mecanismo exacto descrito en el artículo sobre &lt;em&gt;Cascade Layers&lt;/em&gt;, operando ahora frente a otras etapas reales en lugar de analizarse de forma aislada.&lt;/p&gt;

&lt;h2&gt;
  
  
  Etapa tres: Source Order, en aislamiento
&lt;/h2&gt;

&lt;p&gt;Simplifica el ejemplo una vez más. Misma capa, misma especificidad, dos declaraciones que solo difieren en cuál aparece más abajo en el archivo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="k"&gt;@layer&lt;/span&gt; &lt;span class="n"&gt;base&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nc"&gt;.btn&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;black&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="nc"&gt;.btn&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;navy&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El color azul marino (&lt;em&gt;navy&lt;/em&gt;) gana. No había nada más disponible para decidir misma capa, misma especificidad, por lo que el algoritmo cae en la última etapa: la regla que aparece más tarde en el orden del código (&lt;em&gt;source order&lt;/em&gt;). Esta es la etapa que el artículo 6 mencionó pero nunca demostró. Aquí está, aislada, haciendo exactamente lo que indica la especificación y nada más.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lo que esto realmente demuestra
&lt;/h2&gt;

&lt;p&gt;Seis declaraciones. Cinco etapas distintas de una sola secuencia. Cada una solo se consulta porque las anteriores no lograron producir una decisión. En el momento en que el origen y la importancia resolvieron el ejemplo externo, las capas, la especificidad y el &lt;em&gt;source order&lt;/em&gt; no fueron consultados. Resultaron irrelevantes en el instante en que el color verde (&lt;em&gt;green&lt;/em&gt;) ganó. Esa es la estructura real del algoritmo: no una secuencia de desempate, sino una serie de compuertas de eliminación. La mayoría de los conflictos nunca superan la primera compuerta aplicable.&lt;/p&gt;

</description>
      <category>css</category>
      <category>arquitectura</category>
      <category>desarrolloweb</category>
      <category>frontend</category>
    </item>
    <item>
      <title>Field Notes: Watching the Cascade Resolve, Start to Finish</title>
      <dc:creator>Franklin</dc:creator>
      <pubDate>Sat, 22 Aug 2026 11:39:45 +0000</pubDate>
      <link>https://dev.to/ortizfranklindev/field-notes-watching-the-cascade-resolve-start-to-finish-7jo</link>
      <guid>https://dev.to/ortizfranklindev/field-notes-watching-the-cascade-resolve-start-to-finish-7jo</guid>
      <description>&lt;p&gt;Thursday's piece described the order the browser resolves conflicting CSS in: origin and importance first, then layer order, then specificity, then source order, with inheritance underneath all of it. Describing an order is one thing. Watching it actually run, on a real conflict, is another. This is that.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Also available in &lt;a href="https://dev.to/ortizfranklindev/notas-de-campo-la-resolucion-de-la-cascada-de-principio-a-fin-34jh"&gt;Español&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Setup
&lt;/h2&gt;

&lt;p&gt;One button. Six declarations, all fighting over the same property, spanning every stage of the resolution sequence:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="c"&gt;/* UA stylesheet — browser default */&lt;/span&gt;
&lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;buttontext&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;/* Author, @layer base (declared first) */&lt;/span&gt;
&lt;span class="k"&gt;@layer&lt;/span&gt; &lt;span class="n"&gt;base&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nc"&gt;.btn&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;black&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;/* Author, @layer utilities (declared after base) */&lt;/span&gt;
&lt;span class="k"&gt;@layer&lt;/span&gt; &lt;span class="n"&gt;utilities&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nc"&gt;.text-blue&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;blue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;/* Author, unlayered */&lt;/span&gt;
&lt;span class="nf"&gt;#submit&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;red&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;/* Author, !important */&lt;/span&gt;
&lt;span class="k"&gt;@layer&lt;/span&gt; &lt;span class="n"&gt;base&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nc"&gt;.btn&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;purple&lt;/span&gt; &lt;span class="cp"&gt;!important&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;/* User stylesheet — e.g. a browser accessibility override */&lt;/span&gt;
&lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;green&lt;/span&gt; &lt;span class="cp"&gt;!important&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"submit"&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"btn text-blue"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Submit&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Which color wins?&lt;/p&gt;

&lt;h2&gt;
  
  
  Stage One: Origin and Importance
&lt;/h2&gt;

&lt;p&gt;This stage is checked before anything else on the list is even consulted, and it ends the conflict immediately: &lt;code&gt;green&lt;/code&gt; wins.&lt;/p&gt;

&lt;p&gt;Not because it's the most specific selector. It isn't &lt;code&gt;button&lt;/code&gt; alone is about as unspecific as a selector gets. It wins because user-origin &lt;code&gt;!important&lt;/code&gt; outranks author-origin &lt;code&gt;!important&lt;/code&gt;, which is the one place the usual assumption author beats user inverts.&lt;/p&gt;

&lt;p&gt;Worth asking why the platform is built this way at all, because the reasoning is short and solid: a user sometimes needs a way to override author styles that work against them a site that sets text too small to read, or a color combination that fails their contrast needs. If author &lt;code&gt;!important&lt;/code&gt; could always beat user &lt;code&gt;!important&lt;/code&gt;, that override would be permanently unenforceable, no matter how the user's browser or assistive technology was configured. Accessibility settings need to stay authoritative. So the cascade gives user &lt;code&gt;!important&lt;/code&gt; the final word, specifically so that guarantee holds.&lt;/p&gt;

&lt;p&gt;That's not an edge case buried in the spec. It's the entire reason this stage of the algorithm exists.&lt;/p&gt;

&lt;h2&gt;
  
  
  Stage Two: Layer Order
&lt;/h2&gt;

&lt;p&gt;Remove the two &lt;code&gt;!important&lt;/code&gt; declarations the user override and the author override and look at what's left: four normal-importance declarations, spread across the UA stylesheet, two authored layers, and one unlayered rule.&lt;/p&gt;

&lt;p&gt;Layer order settles this before specificity is ever reached. The unlayered &lt;code&gt;#submit { color: red; }&lt;/code&gt; beats every layered rule, unconditionally unlayered styles always win over layered ones, regardless of how heavy or light the selector inside a layer happens to be. &lt;code&gt;red&lt;/code&gt; wins this round.&lt;/p&gt;

&lt;p&gt;Set the unlayered rule aside for a moment, and the comparison gets more interesting: &lt;code&gt;.btn&lt;/code&gt; in &lt;code&gt;base&lt;/code&gt; versus &lt;code&gt;.text-blue&lt;/code&gt; in &lt;code&gt;utilities&lt;/code&gt;. &lt;code&gt;utilities&lt;/code&gt; was declared after &lt;code&gt;base&lt;/code&gt;, so &lt;code&gt;.text-blue&lt;/code&gt; would have won not because &lt;code&gt;blue&lt;/code&gt; has a more specific selector than &lt;code&gt;black&lt;/code&gt; (it doesn't; both are single classes), but because the layer it lives in was declared later. This is the exact mechanism from the Cascade Layers piece, now running against real other stages instead of standing on its own.&lt;/p&gt;

&lt;h2&gt;
  
  
  Stage Three: Source Order, in Isolation
&lt;/h2&gt;

&lt;p&gt;Strip the example down one more time same layer, same specificity, two declarations differing only in which one appears later in the file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="k"&gt;@layer&lt;/span&gt; &lt;span class="n"&gt;base&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nc"&gt;.btn&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;black&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="nc"&gt;.btn&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="no"&gt;navy&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;navy&lt;/code&gt; wins. Nothing else was available to decide it same layer, same specificity so the algorithm falls through to the last stage: whichever rule appears later in source order. This is the stage article 6 named but never demonstrated. Here it is, isolated, doing exactly what it's specified to do and nothing more.&lt;/p&gt;

&lt;h2&gt;
  
  
  What This Actually Shows
&lt;/h2&gt;

&lt;p&gt;Six declarations. Five different stages of one sequence, each one only getting consulted because everything before it failed to produce a decision. The moment origin and importance settled the outer example, layers, specificity, and source order never got asked anything at all they were irrelevant the instant &lt;code&gt;green&lt;/code&gt; won. That's the real shape of the algorithm: not a tiebreaker sequence, but a series of gates. Most conflicts never make it past the first one that actually applies.&lt;/p&gt;

</description>
      <category>css</category>
      <category>webdev</category>
      <category>frontend</category>
      <category>architecture</category>
    </item>
    <item>
      <title>El navegador ya tiene una arquitectura. La mayoría de los proyectos la ignoran.</title>
      <dc:creator>Franklin</dc:creator>
      <pubDate>Thu, 20 Aug 2026 10:50:29 +0000</pubDate>
      <link>https://dev.to/ortizfranklindev/el-navegador-ya-tiene-una-arquitectura-la-mayoria-de-los-proyectos-la-ignoran-1e65</link>
      <guid>https://dev.to/ortizfranklindev/el-navegador-ya-tiene-una-arquitectura-la-mayoria-de-los-proyectos-la-ignoran-1e65</guid>
      <description>&lt;p&gt;&lt;em&gt;También disponible en&lt;/em&gt; &lt;a href="https://dev.to/ortizfranklindev/the-browser-already-has-an-architecture-most-projects-ignore-it-2bap"&gt;Inglés&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  El problema
&lt;/h2&gt;

&lt;p&gt;Pregunta a la mayoría de los desarrolladores cómo funciona la especificidad; sabrán explicarlo. Pregunta sobre la herencia; también sabrán explicarla. El orden de declaración, el origen, !important — casi todo esto se aprende por separado, por lo general al depurar un error, y se olvida en cuanto se apaga el incendio inmediato.&lt;/p&gt;

&lt;p&gt;Casi nadie los aprende como un solo sistema.&lt;/p&gt;

&lt;p&gt;El cambio de perspectiva que importa es este: el navegador no tiene seis datos de CSS inconexos dispersos en su motor de renderizado. Tiene un algoritmo completo y especificado para la resolución de la cascada; una respuesta real y ordenada a la pregunta "qué regla se aplica aquí", resuelta etapa por etapa. La mayoría de los proyectos nunca han leído ese algoritmo de principio a fin. Solo se han encontrado con él ante un diseño roto.&lt;/p&gt;

&lt;h2&gt;
  
  
  Por qué existe el problema
&lt;/h2&gt;

&lt;p&gt;Estos mecanismos se enseñan por partes, porque así es como se necesitan. Un tutorial explica la especificidad porque la especificidad acaba de dar un problema a alguien. Una respuesta en Stack Overflow explica la herencia porque el tamaño de la fuente de alguien no se comportaba como debía. Cada explicación es precisa, acotada y está desconectada de las otras cinco etapas del mismo algoritmo que operan justo al lado.&lt;/p&gt;

&lt;p&gt;Es una forma rápida de corregir un error. Es una mala forma de aprender un sistema. Un equipo puede entender la especificidad a fondo y, aun así, no saber que el origen, la importancia y el orden de las capas se resuelven &lt;em&gt;antes&lt;/em&gt; de consultar la especificidad. Esto significa pasar horas luchando una batalla de especificidad que ya se había perdido, o ganado, en una etapa anterior que nadie pensó en verificar. Cuando esto ocurre con frecuencia, los equipos dejan de confiar en la cascada. En su lugar, construyen una arquitectura paralela encima de ella —convenciones de nomenclatura, herramientas de scoping, capas adicionales de abstracción— para resolver problemas que el propio algoritmo del navegador ya resuelve. Solo que no lo hace de manera visible, porque nadie leyó la secuencia completa.&lt;/p&gt;

&lt;h2&gt;
  
  
  El primer principio
&lt;/h2&gt;

&lt;p&gt;Este es el orden real, presentado como una secuencia en lugar de un glosario de términos independientes.&lt;/p&gt;

&lt;p&gt;El origen y la importancia se comprueban primero: estilos del navegador, estilos del autor, estilos del usuario y si !important está aplicado a alguno de ellos. Después, el orden de las capas (@layer) para cualquier declaración dentro de ellas; aunque cabe destacar que !important invierte este orden, haciendo que gane la primera capa declarada en lugar de la última. Luego se evalúa la especificidad, pero solo entre las reglas que sobrevivieron sin resolverse a las dos primeras etapas. Finalmente, el orden de declaración funciona como desempate cuando nada más lo ha solucionado. La herencia se ejecuta por debajo de toda la secuencia, proporcionando en silencio una respuesta para cualquier propiedad que los pasos anteriores no hayan abordado.&lt;/p&gt;

&lt;p&gt;El cambio de perspectiva: nunca fueron cinco datos para memorizar por separado. Es un solo algoritmo ordenado, y cada una de esas palabras familiares (origen, capas, especificidad, orden de declaración, herencia) nombra una fase dentro de él. Aprendidos de forma aislada, son datos de trivia. Aprendidos como una secuencia, constituyen un contrato de ingeniería sobre el cual un equipo puede diseñar a propósito.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demostración del principio
&lt;/h2&gt;

&lt;p&gt;Una regla dentro de una capa con alta especificidad aún puede perder frente a una regla sin capa con mucha menos especificidad. No es un error; es la secuencia funcionando según lo especificado. El orden de las capas se resuelve antes de llegar a la especificidad. Para estilos normales, las reglas sin capa tienen prioridad sobre todas las capas explícitas, ganando independientemente de la especificidad. Para estilos con !important, esa prioridad se invierte, otorgando la ventaja a las reglas con capa. Conocer dónde se sitúan las capas en la secuencia en relación con el origen y la importancia marca la diferencia entre una sobrescritura inesperada y un sistema de diseño predecible.&lt;/p&gt;

&lt;h2&gt;
  
  
  quell como caso de estudio
&lt;/h2&gt;

&lt;p&gt;La arquitectura de quell se mantiene de forma fiable en producción por una razón sencilla: fue diseñada con este orden de resolución completo en mente desde el principio, no armada mediante prueba y error contra reglas aisladas aprendidas de una en una.&lt;/p&gt;

&lt;h2&gt;
  
  
  La lección general
&lt;/h2&gt;

&lt;p&gt;La mayoría de los problemas de ingeniería que parecen deberse a la falta de características son, en realidad, falta de comprensión de un sistema que ya se había proporcionado. El navegador no falló al darle una arquitectura a CSS. Proporcionó una completa, especificada, estable y estandarizada, y la mayoría de los proyectos construyen en silencio una segunda arquitectura informal encima de ella, porque la primera nunca se leyó en su totalidad.&lt;/p&gt;

&lt;p&gt;Ese patrón no es exclusivo de CSS. Aparece en cualquier lugar donde un sistema se aprende en piezas desconectadas en lugar de como la secuencia única que realmente es: reinventar lo que ya existe, a un costo real, porque nadie se sentó a leer el conjunto de principio a fin.&lt;/p&gt;

</description>
      <category>css</category>
      <category>arquitectura</category>
      <category>desarrolloweb</category>
      <category>frontend</category>
    </item>
    <item>
      <title>The Browser Already Has an Architecture. Most Projects Ignore It.</title>
      <dc:creator>Franklin</dc:creator>
      <pubDate>Thu, 20 Aug 2026 10:49:19 +0000</pubDate>
      <link>https://dev.to/ortizfranklindev/the-browser-already-has-an-architecture-most-projects-ignore-it-2bap</link>
      <guid>https://dev.to/ortizfranklindev/the-browser-already-has-an-architecture-most-projects-ignore-it-2bap</guid>
      <description>&lt;p&gt;&lt;em&gt;Also available in &lt;a href="https://dev.to/ortizfranklindev/el-navegador-ya-tiene-una-arquitectura-la-mayoria-de-los-proyectos-la-ignoran-1e65"&gt;Español&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;Ask most developers to explain specificity, and they can. Ask about inheritance, and they can explain that too. Source order, origin, &lt;code&gt;!important&lt;/code&gt; — most of these get learned individually, usually while debugging something that broke, usually forgotten again once the immediate fire is out.&lt;/p&gt;

&lt;p&gt;Almost nobody learns them as one system.&lt;/p&gt;

&lt;p&gt;Here's the reframe that actually matters: the browser doesn't have six unrelated CSS facts scattered around its rendering engine. It has a complete, specified cascade resolution algorithm, an actual, ordered answer to "which rule applies here," worked out stage by stage. Most projects have never read that algorithm end to end. They've only ever met it one broken layout at a time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the Problem Exists
&lt;/h2&gt;

&lt;p&gt;These mechanisms get taught piecemeal, because that's how they get needed. A tutorial explains specificity because specificity is the thing that just bit someone. A Stack Overflow answer explains inheritance because someone's font size wasn't behaving. Each explanation is accurate, narrow, and disconnected from the five other stages of the same algorithm sitting right next to it.&lt;/p&gt;

&lt;p&gt;That's an efficient way to patch one bug. It's a poor way to learn a system. A team can understand specificity in real depth and still not realize that origin, importance, and layer order all get resolved &lt;em&gt;before&lt;/em&gt; specificity is ever consulted — which means hours can be spent fighting a specificity battle that was already lost, or won, at an earlier stage nobody thought to check. When that happens enough times, teams stop trusting the cascade at all. They build a parallel architecture on top of it instead — naming conventions, scoped tooling, extra layers of abstraction — to solve problems the browser's own algorithm already resolves, just not visibly, because nobody read the whole thing as one sequence.&lt;/p&gt;

&lt;h2&gt;
  
  
  The First Principle
&lt;/h2&gt;

&lt;p&gt;Here's the actual order, laid out as a sequence rather than a glossary of separate terms.&lt;/p&gt;

&lt;p&gt;Origin and importance are checked first: browser styles, author styles, user styles, and whether &lt;code&gt;!important&lt;/code&gt; is attached to any of them. Then layer order, for anything declared inside &lt;code&gt;@layer&lt;/code&gt; — though worth knowing, &lt;code&gt;!important&lt;/code&gt; flips that order, so the first declared layer wins instead of the last. Then specificity, but only among rules that have already survived the first two stages unresolved. Then source order, as the final tiebreaker when nothing else has settled it. Inheritance runs underneath the entire sequence, quietly supplying an answer for any property none of the above ever addressed.&lt;/p&gt;

&lt;p&gt;The reframe: this was never six facts to memorize separately. It's one ordered algorithm, and each of those familiar words (origin, layers, specificity, source order, inheritance) names a single stage inside it. Learned in isolation, they're trivia. Learned as a sequence, they're an engineering contract a team can design against on purpose.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demonstrating the Principle
&lt;/h2&gt;

&lt;p&gt;A layered rule with high specificity can still lose to an unlayered rule with far less specificity and that's not a bug, it's the sequence working as specified. Layer order is resolved before specificity is ever reached. For normal styles, unlayered rules sit above all explicit layers in precedence, winning over layered rules regardless of specificity. For !important styles, that priority flips, giving layered rules the advantage. Knowing where layers sit in the sequence relative to origin and importance is the difference between an unexpected override and a predictable design system.&lt;/p&gt;

&lt;h2&gt;
  
  
  quell as the Case Study
&lt;/h2&gt;

&lt;p&gt;quell's architecture holds up reliably in production for a plain reason: it was designed with this full resolution order in view from the start, not assembled by trial and error against isolated rules learned one at a time.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Broader Lesson
&lt;/h2&gt;

&lt;p&gt;Most engineering problems that feel like missing features are actually missing understanding of a system that was already provided. The browser didn't fail to give CSS an architecture. It gave one, fully specified, stable, standards-track, and most projects quietly build a second, informal one on top of it, because the first one was never read as a whole.&lt;/p&gt;

&lt;p&gt;That pattern isn't unique to CSS. It shows up anywhere a system gets learned in disconnected pieces instead of as the single sequence it actually is: reinventing what's already there, at real cost, because nobody ever sat down and read the whole thing end to end.&lt;/p&gt;

</description>
      <category>css</category>
      <category>architecture</category>
      <category>webdev</category>
      <category>frontend</category>
    </item>
    <item>
      <title>Las capas de cascada no reemplazaron la especificidad. Reemplazaron la negociación.</title>
      <dc:creator>Franklin</dc:creator>
      <pubDate>Tue, 18 Aug 2026 12:06:06 +0000</pubDate>
      <link>https://dev.to/ortizfranklindev/las-capas-de-cascada-no-reemplazaron-la-especificidad-reemplazaron-la-negociacion-6dg</link>
      <guid>https://dev.to/ortizfranklindev/las-capas-de-cascada-no-reemplazaron-la-especificidad-reemplazaron-la-negociacion-6dg</guid>
      <description>&lt;p&gt;&lt;em&gt;También disponible en &lt;a href="https://dev.to/ortizfranklindev/cascade-layers-didnt-replace-specificity-they-replaced-negotiation-4j8b"&gt;Inglés&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  El problema
&lt;/h2&gt;

&lt;p&gt;La última entrega terminó con una promesa: existe un mecanismo real para definir límites, nativo del navegador, sin necesidad de procesos de compilación.&lt;/p&gt;

&lt;p&gt;La mayoría de las explicaciones sobre este mecanismo lo describen como una herramienta de especificidad; una forma de escribir selectores más débiles y aun así ganar el conflicto. Es cierto. También es la lectura superficial.&lt;/p&gt;

&lt;p&gt;Esta es la lectura profunda. Antes de las Cascade Layers, los conflictos de estilos en cualquier equipo de tamaño considerable se resolvían de la misma forma: la gente hablaba entre sí. Alguien preguntaba si era seguro sobrescribir los estilos de un botón, y la respuesta venía de quien recordara la última vez que algo se rompió. Un ingeniero senior resolvía una discusión sobre qué selector debía ganar, de manera informal, en un hilo de conversación que nadie más volvería a encontrar. Eso es negociación. Y la negociación es lo que realmente se rompía al escalar, mucho antes que cualquier selector individual.&lt;/p&gt;

&lt;h2&gt;
  
  
  Por qué existe el problema
&lt;/h2&gt;

&lt;p&gt;La precedencia basada en la negociación parece razonable cuando unas pocas personas retienen todo el contexto en sus cabezas. "No usamos IDs". "No toques ese archivo sin preguntar primero". "Consulta con Sarah antes de sobrescribir nada en los componentes". Reglas como estas funcionan mientras las personas que las crearon sigan en la sala, sigan recordando y sigan disponibles para ser consultadas.&lt;/p&gt;

&lt;p&gt;No sobreviven al crecimiento, a la rotación de personal o al paso del tiempo. Es el mismo mecanismo de entropía mencionado anteriormente en esta serie, resurgiendo aquí de forma social en lugar de forma de código. La especificidad, bajo esta luz, no era realmente el campo de batalla. Era el síntoma: el lugar donde se luchaban los desacuerdos no resueltos sobre la propiedad y la intención, selector por selector, porque no había otro lugar para que ese desacuerdo existiera.&lt;/p&gt;

&lt;h2&gt;
  
  
  El primer principio
&lt;/h2&gt;

&lt;p&gt;Este es el cambio que vale la pena nombrar con precisión: las Cascade Layers no solo añaden una nueva regla de precedencia. Reemplazan un mecanismo social por uno declarado.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="k"&gt;@layer&lt;/span&gt; &lt;span class="n"&gt;theme&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tokens&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;base&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;layout&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;components&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;interactive&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;utilities&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;overrides&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Una línea. Declarada una vez. Aplicada por el navegador después, sin excepciones y sin dejar nada que nadie deba recordar, preguntar o negociar de nuevo. El orden deja de ser conocimiento tribal transmitido en conversaciones de integración o en el historial de Slack. Se convierte en código fuente: visible, versionado y real para cada colaborador, haya estado o no en la sala donde se tomó el acuerdo original.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demostración del principio
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="k"&gt;@layer&lt;/span&gt; &lt;span class="n"&gt;components&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;utilities&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;@layer&lt;/span&gt; &lt;span class="n"&gt;components&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nc"&gt;.card&lt;/span&gt; &lt;span class="nc"&gt;.title&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;font-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1.25rem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;@layer&lt;/span&gt; &lt;span class="n"&gt;utilities&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nc"&gt;.text-lg&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;font-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2rem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;.text-lg&lt;/code&gt; gana. No por escribir un selector más pesado o escalar a &lt;code&gt;!important&lt;/code&gt;; nadie tuvo que pedir permiso primero. El orden ya estaba establecido antes de escribir cualquiera de las dos reglas, porque se declaró una vez al principio del archivo.&lt;/p&gt;

&lt;h2&gt;
  
  
  quell-base.css como caso de estudio
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;quell-base.css&lt;/code&gt; es la base real sobre la que se construye esta tesis. Declara cinco capas, en este orden exacto:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="k"&gt;@layer&lt;/span&gt; &lt;span class="n"&gt;ghost_tokens&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;reset&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;baseline&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;forms&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;utilities&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cada capa no solo posee una categoría de estilo; resuelve de antemano una discusión que, de otro modo, tendría que negociarse cada vez que surgiera.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;ghost_tokens&lt;/strong&gt;: valores de respaldo totalmente resueltos, analizados por el navegador antes de la primera pintura. Resuelve, de antemano, si una llamada &lt;code&gt;var()&lt;/code&gt; queda apuntando a la nada mientras se carga una hoja de temas. No hay condiciones de carrera que negociar, porque el respaldo nunca estuvo en duda.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;reset&lt;/strong&gt;: inconsistencia del navegador borrada, con cero opinión visual. Esta es la distinción exacta del primer artículo, aplicada como política en lugar de ser discutida más tarde: la normalización vive aquí, y solo aquí, para que nadie tenga que preguntar si "reset" significa secretamente "el gusto de alguien".&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;baseline&lt;/strong&gt;: diseño visual mínimo, consumiendo &lt;strong&gt;tokens&lt;/strong&gt; en lugar de inventar valores propios. Establece, permanentemente, que esta capa renderiza decisiones tomadas en otro lugar; no toma decisiones nuevas.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;forms&lt;/strong&gt;: elementos de formulario aislados en su propia superficie, normalizados aparte de todo lo demás. Nadie tiene que negociar si el reset de un &lt;code&gt;&amp;lt;button&amp;gt;&lt;/code&gt; pertenece a la misma conversación que el de un &lt;code&gt;&amp;lt;input&amp;gt;&lt;/code&gt;; el límite ya está trazado.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;utilities&lt;/strong&gt;: intencionalmente vacía en el archivo central, reservada y con la prioridad más alta por declaración. Cualquier cosa que un equipo descendente añada aquí ganará a cada capa superior, automáticamente, porque eso se decidió de antemano y no se dejó para que alguien ganara después con un selector más pesado.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nada de esto requirió una reunión. Nada de esto requiere que el autor original siga en el equipo para que continúe funcionando. El archivo lo establece casi como una garantía propia: tres superficies de sobrescritura explícitas, clasificadas en poder ascendente. Redecleara un &lt;strong&gt;token&lt;/strong&gt; en &lt;code&gt;:root&lt;/code&gt;, fuera de cualquier capa, y gana. Abre de nuevo &lt;code&gt;@layer baseline {}&lt;/code&gt; en una hoja descendente, y la adición aterriza exactamente donde se pretendía. Escribe una regla sin capa y vencerá a cada capa mencionada anteriormente, sin condiciones. Las propias palabras del archivo para definir lo que esto ofrece: &lt;em&gt;"No se requiere !important."&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;El acuerdo es ahora la arquitectura, no un recuerdo que un puñado de personas debe mantener vivo.&lt;/p&gt;

&lt;h2&gt;
  
  
  La lección general
&lt;/h2&gt;

&lt;p&gt;Cualquier equipo, de cualquier tamaño, necesita eventualmente una forma de resolver reclamos en conflicto sobre la autoridad. La mayoría de los sistemas, en código o fuera de él, optan por la negociación: quien sea más senior en la sala, o simplemente más insistente en el momento, gana. Ese enfoque parece natural porque es como comienzan la mayoría de los sistemas humanos. Pero no escala, y no sobrevive a la partida de las personas que lo construyeron.&lt;/p&gt;

&lt;p&gt;El orden declarado y aplicado sí sobrevive. Eso es lo que las Cascade Layers realmente reemplazaron: no un selector más débil, sino una negociación que nadie quería seguir teniendo. La arquitectura es lo que permite que un acuerdo sobreviva a la reunión donde se creó.&lt;/p&gt;

</description>
      <category>css</category>
      <category>arquitectura</category>
      <category>desarrolloweb</category>
      <category>español</category>
    </item>
    <item>
      <title>Cascade Layers Didn't Replace Specificity — They Replaced Negotiation</title>
      <dc:creator>Franklin</dc:creator>
      <pubDate>Tue, 18 Aug 2026 12:04:07 +0000</pubDate>
      <link>https://dev.to/ortizfranklindev/cascade-layers-didnt-replace-specificity-they-replaced-negotiation-4j8b</link>
      <guid>https://dev.to/ortizfranklindev/cascade-layers-didnt-replace-specificity-they-replaced-negotiation-4j8b</guid>
      <description>&lt;p&gt;&lt;em&gt;Also available in &lt;a href="https://dev.to/ortizfranklindev/las-capas-de-cascada-no-reemplazaron-la-especificidad-reemplazaron-la-negociacion-6dg"&gt;Español&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;The last piece ended on a promise: a real mechanism for boundaries exists, native to the browser, no build step required.&lt;/p&gt;

&lt;p&gt;Most explanations of that mechanism describe it as a specificity tool — a way to write weaker selectors and still win the conflict. That's true. It's also the shallow read.&lt;/p&gt;

&lt;p&gt;Here's the deeper one. Before Cascade Layers, styling conflicts on any team of real size eventually got resolved the same way: people talked to each other. Someone asked whether it was safe to override the button styles, and word came back from whoever remembered the last time that broke something. A senior engineer settled an argument about whose selector should win, informally, in a thread nobody else will ever find again. That's negotiation. And negotiation is what actually broke down at scale — long before any individual selector did.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the Problem Exists
&lt;/h2&gt;

&lt;p&gt;Negotiation-based precedence looks reasonable when a handful of people hold all the context in their heads. "We don't use IDs." "Don't touch that file without asking first." "Check with Sarah before overriding anything in components." Rules like these work exactly as long as the people who made them are still in the room, still remembering, still available to be asked.&lt;/p&gt;

&lt;p&gt;They don't survive growth, turnover, or the ordinary passage of time — which is the same entropy mechanism named earlier in this series, resurfacing here in social form instead of code form. Specificity, in this light, wasn't really the battlefield. It was the proxy: the place where unresolved disagreements about ownership and intent got fought out, selector by selector, because there was nowhere else for that disagreement to live.&lt;/p&gt;

&lt;h2&gt;
  
  
  The First Principle
&lt;/h2&gt;

&lt;p&gt;Here's the shift worth naming precisely: Cascade Layers don't just add a new precedence rule. They replace a social mechanism with a declared one.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="k"&gt;@layer&lt;/span&gt; &lt;span class="n"&gt;theme&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tokens&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;base&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;layout&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;components&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;interactive&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;utilities&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;overrides&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One line. Stated once. Enforced by the browser afterward, with no exceptions and nothing left for anyone to remember, ask, or negotiate again. Order stops being tribal knowledge, passed down through onboarding conversations and Slack history. It becomes source code — visible, versioned, and true for every contributor whether or not they were ever in the room where the original agreement was made.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demonstrating the Principle
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="k"&gt;@layer&lt;/span&gt; &lt;span class="n"&gt;components&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;utilities&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;@layer&lt;/span&gt; &lt;span class="n"&gt;components&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nc"&gt;.card&lt;/span&gt; &lt;span class="nc"&gt;.title&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;font-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1.25rem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;@layer&lt;/span&gt; &lt;span class="n"&gt;utilities&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nc"&gt;.text-lg&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;font-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2rem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;.text-lg&lt;/code&gt; wins. Not by writing a heavier selector or escalating to &lt;code&gt;!important&lt;/code&gt; — nobody had to ask permission first, either. The order was already settled before either rule was written, because it was declared, once, at the top of the file.&lt;/p&gt;

&lt;h2&gt;
  
  
  quell-base.css as the Case Study
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;quell-base.css&lt;/code&gt; is the real, shipping foundation this thesis is built on. It declares five layers, in this exact order:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="k"&gt;@layer&lt;/span&gt; &lt;span class="n"&gt;ghost_tokens&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;reset&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;baseline&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;forms&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;utilities&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each layer doesn't just own a category of styling — it pre-resolves an argument that would otherwise have to be negotiated every time it came up.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ghost_tokens&lt;/strong&gt; — fully-resolved fallback values, parsed by the browser before the first paint. Settles, in advance, whether a &lt;code&gt;var()&lt;/code&gt; call is ever left pointing at nothing while a theme sheet is still loading. No race condition to negotiate, because the fallback was never in question.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;reset&lt;/strong&gt; — browser inconsistency erased, with zero visual opinion. This is article one's exact distinction, enforced as policy rather than argued about later: normalization lives here, and only here, so nobody has to ask whether "reset" secretly means "someone's taste."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;baseline&lt;/strong&gt; — minimal visual design, consuming tokens rather than inventing values of its own. Settles, permanently, that this layer renders decisions made elsewhere; it doesn't make new ones.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;forms&lt;/strong&gt; — form elements isolated into their own surface, normalized apart from everything else. Nobody has to negotiate whether a &lt;code&gt;&amp;lt;button&amp;gt;&lt;/code&gt; reset belongs in the same conversation as an &lt;code&gt;&amp;lt;input&amp;gt;&lt;/code&gt; reset; the boundary is already drawn.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;utilities&lt;/strong&gt; — intentionally empty in the core file, reserved and highest-priority by declaration. Whatever a downstream team appends here will beat every layer above it, automatically, because that was decided in advance and not left for someone to win later with a heavier selector.&lt;/p&gt;

&lt;p&gt;None of this required a meeting. None of it requires the original author to still be on the team for it to keep working — which the file states almost as a guarantee of its own: three explicit override surfaces, ranked in ascending power. Redeclare a token on &lt;code&gt;:root&lt;/code&gt;, outside any layer, and it wins. Reopen &lt;code&gt;@layer baseline {}&lt;/code&gt; in a downstream sheet, and the append lands exactly where intended. Write an unlayered rule at all, and it beats every layer listed above it, unconditionally. The file's own words for what that buys: &lt;em&gt;"No &lt;code&gt;!important&lt;/code&gt; required."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The agreement is the architecture now, not a memory a handful of people are responsible for keeping alive.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Broader Lesson
&lt;/h2&gt;

&lt;p&gt;Any team, of any size, eventually needs a way to resolve conflicting claims to authority. Most systems, in code or out of it, default to negotiation: whoever's most senior in the room, or simply most insistent in the moment, wins. That approach feels natural because it's how most human systems start. It also doesn't scale, and it doesn't survive the departure of the people who built it.&lt;/p&gt;

&lt;p&gt;Declared, enforced order does survive. That's what Cascade Layers actually replaced — not a weaker selector, but a negotiation nobody wanted to keep having: architecture is what lets an agreement outlive the meeting where it was made.&lt;/p&gt;

</description>
      <category>css</category>
      <category>architecture</category>
      <category>cascadelayers</category>
      <category>quell</category>
    </item>
    <item>
      <title>El CSS no necesita más poder — necesita mejores límites</title>
      <dc:creator>Franklin</dc:creator>
      <pubDate>Thu, 13 Aug 2026 11:05:46 +0000</pubDate>
      <link>https://dev.to/ortizfranklindev/el-css-no-necesita-mas-poder-necesita-mejores-limites-6fm</link>
      <guid>https://dev.to/ortizfranklindev/el-css-no-necesita-mas-poder-necesita-mejores-limites-6fm</guid>
      <description>&lt;p&gt;&lt;em&gt;También disponible en &lt;a href="https://dev.to/ortizfranklindev/css-doesnt-need-more-power-it-needs-better-boundaries-5c95"&gt;English&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  El problema
&lt;/h2&gt;

&lt;p&gt;Un equipo se enfrenta a un problema de estilos con el que el CSS no coopera. Algo debe cambiar basándose en un clic, una posición de desplazamiento o un estado de la aplicación. Entonces, buscan más poder.&lt;/p&gt;

&lt;p&gt;Un selector más pesado. Un &lt;code&gt;!important&lt;/code&gt;. A veces se ignora el CSS por completo: &lt;code&gt;element.style.display = 'none'&lt;/code&gt;, definido directamente desde un manejador de clics, porque se sentía más fiable que confiar en que la cascada hiciera lo pedido&lt;/p&gt;

&lt;p&gt;Ninguno de los últimos tres problemas de esta serie se resolvió dando más capacidad al CSS. Los resets no se rompieron porque el CSS fuera demasiado débil para normalizar navegadores; se rompieron porque la opinión y la normalización compartieron un límite que nunca debió compartirse. La especificidad no se rompió porque los selectores fueran débiles; se rompió por no tener forma de declarar la intención independientemente del peso del selector. La entropía no fue causada por la falta de alguna característica; fue causada porque nada marcaba el límite entre lo que es seguro eliminar y lo que no.&lt;/p&gt;

&lt;p&gt;Cada uno de esos fue un problema de límites. Ninguno fue un problema de poder.&lt;/p&gt;

&lt;h2&gt;
  
  
  Por qué existe el problema
&lt;/h2&gt;

&lt;p&gt;El CSS se ganó su reputación de impredecible de forma honesta — de eso tratan los últimos tres artículos. Y la respuesta natural ante algo impredecible es rodearlo. JavaScript está ahí. Imperativo, potente, dispuesto a definir exactamente el valor que quieres en el elemento exacto que quieres, en el instante en que lo quieres.&lt;/p&gt;

&lt;p&gt;Pero cada línea de lógica de presentación que se mueve a JavaScript es una línea que la cascada ya no puede ver ni razonar. Ahora es un valor compitiendo con reglas de CSS reales, de formas que la especificidad nunca fue construida para arbitrar y que las capas, una vez introducidas, tampoco podrán ver. La impredecibilidad no se arregla. Se traslada a un lugar aún menos estructurado: se dispersa entre manejadores de clics y ciclos de vida de componentes en lugar de estar contenida en una sola hoja de estilos donde, al menos, el problema era visible.&lt;/p&gt;

&lt;h2&gt;
  
  
  El primer principio
&lt;/h2&gt;

&lt;p&gt;Un límite no es una limitación. Es una garantía.&lt;/p&gt;

&lt;p&gt;El CSS ya posee cuatro cosas por derecho propio, con autoridad real otorgada por el navegador: presentación, transición, diseño (layout) y renderizado. No es una lista pequeña; el navegador entrega al CSS un control genuino sobre cómo se ve y se mueve casi todo en una página. El hecho menos valorado es que esto ya es suficiente. El instinto de buscar más allá del CSS no suele ser porque este carezca de capacidad en su función real. Es porque los bordes de esa función nunca se dibujaron explícitamente.&lt;/p&gt;

&lt;p&gt;El CSS no debería poseer el estado de la aplicación. No debería codificar lógica de negocio. En el momento en que cualquiera de los dos se cuela —un nombre de clase que secretamente representa un valor de datos, un selector elegido basado en lo que devolvió el backend en lugar de lo que el elemento es— la garantía se rompe. Y no solo se rompe para quien escribió ese cruce. Se rompe para todos los que toquen ese código después, porque ahora ya no se puede confiar en que la presentación viva en un solo lugar.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demostración del principio
&lt;/h2&gt;

&lt;p&gt;Un interruptor (toggle), hecho de dos maneras.&lt;/p&gt;

&lt;p&gt;Definido directamente desde un manejador de clics:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;button&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;click&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;panel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;display&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;panel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;display&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;none&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;block&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;none&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O la misma interacción, con el límite intacto — JavaScript cambia el estado, el CSS posee la presentación resultante:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;button&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;click&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;panel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;classList&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toggle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;is-open&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.panel&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;none&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.panel.is-open&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;block&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mismo resultado para el usuario. Pero en la segunda versión, la presentación sigue siendo plenamente legible solo desde la hoja de estilos. Nadie tiene que ir a cazar a través del JavaScript para entender cómo se comporta &lt;code&gt;.panel&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  quell como estudio de caso
&lt;/h2&gt;

&lt;p&gt;quell dibuja este límite explícitamente y lo trata como innegociable: el CSS posee la presentación, el JavaScript posee el comportamiento, el HTML posee la estructura. Nada en el sistema tiene permitido cruzar esa línea silenciosamente; una regla impuesta por convención tan firmemente como por arquitectur.&lt;/p&gt;

&lt;h2&gt;
  
  
  La lección general
&lt;/h2&gt;

&lt;p&gt;Esto cierra las primeras cuatro piezas de esta serie, y vale la pena nombrar la forma que subyace a todas ellas.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Resets&lt;/em&gt;: algo que reclamaba una neutralidad que no tenía. &lt;em&gt;Especificidad&lt;/em&gt;: algo calculando que debería haber estado declarando. &lt;em&gt;Entropía&lt;/em&gt;: algo creciendo que debería haber sido gobernable. Y &lt;strong&gt;ahora esto&lt;/strong&gt;: algo buscando poder cuando lo que realmente necesitaba era una línea que nadie había dibujado todavía&lt;br&gt;
.&lt;br&gt;
Cuatro síntomas diferentes. Una solución subyacente, nombrada claramente por primera vez aquí: &lt;strong&gt;límites&lt;/strong&gt;, no poder. El resto de esta serie existe para mostrar exactamente cómo el navegador te permite construir límites de verdad — empezando por el mecanismo que le da a la cascada un eje de orden explícito propio.&lt;br&gt;
.&lt;/p&gt;

</description>
      <category>css</category>
      <category>arquitectura</category>
      <category>desarrolloweb</category>
      <category>español</category>
    </item>
    <item>
      <title>CSS Doesn't Need More Power — It Needs Better Boundaries</title>
      <dc:creator>Franklin</dc:creator>
      <pubDate>Thu, 13 Aug 2026 11:05:12 +0000</pubDate>
      <link>https://dev.to/ortizfranklindev/css-doesnt-need-more-power-it-needs-better-boundaries-5c95</link>
      <guid>https://dev.to/ortizfranklindev/css-doesnt-need-more-power-it-needs-better-boundaries-5c95</guid>
      <description>&lt;p&gt;&lt;em&gt;Also available in &lt;a href="https://dev.to/ortizfranklindev/el-css-no-necesita-mas-poder-necesita-mejores-limites-6fm"&gt;Español&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;A team hits a styling problem that CSS won't cooperate with. Something needs to change based on a click, a scroll position, a piece of application state. So they reach for more power.&lt;/p&gt;

&lt;p&gt;A heavier selector. An &lt;code&gt;!important&lt;/code&gt;. Sometimes CSS gets skipped entirely — &lt;code&gt;element.style.display = 'none'&lt;/code&gt;, set directly from a click handler, because it felt more reliable than trusting the cascade to do what was asked.&lt;/p&gt;

&lt;p&gt;None of the last three problems in this series were solved by giving CSS more capability. Resets weren't broken by CSS being too weak to normalize browsers — they were broken by opinion and normalization sharing a boundary that should never have been shared. Specificity wasn't broken by selectors being too weak — it was broken by having no way to declare intent independent of selector weight. Entropy wasn't caused by CSS lacking some feature — it was caused by nothing marking the boundary between what's safe to remove and what isn't.&lt;/p&gt;

&lt;p&gt;Every one of those was a boundary problem. Not one of them was a power problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the Problem Exists
&lt;/h2&gt;

&lt;p&gt;CSS earned its reputation for unpredictability honestly — that's the last three articles. And the natural response to something unpredictable is to route around it. JavaScript is right there. Imperative, powerful, willing to set exactly the value you want on exactly the element you want, the instant you want it.&lt;/p&gt;

&lt;p&gt;But every line of presentation logic that moves into JavaScript is a line the cascade can no longer see or reason about. It's now a value competing with real CSS rules, in ways specificity was never built to arbitrate and layers, once they're introduced, won't be able to see either. The unpredictability doesn't get fixed. It gets relocated somewhere even less structured — spread across click handlers and component lifecycles instead of contained in one stylesheet where at least the problem was visible.&lt;/p&gt;

&lt;h2&gt;
  
  
  The First Principle
&lt;/h2&gt;

&lt;p&gt;A boundary is not a limitation. It's a guarantee.&lt;/p&gt;

&lt;p&gt;CSS already owns four things outright, with real browser-granted authority: presentation, transition, layout, rendering. That's not a small list — the browser hands CSS genuine control over how nearly everything on a page looks and moves. The undersold fact is that this is already enough. The instinct to reach past CSS for more power isn't usually because CSS lacks capability inside its actual job. It's because the edges of that job were never explicitly drawn.&lt;/p&gt;

&lt;p&gt;CSS shouldn't own application state. It shouldn't encode business logic. The moment either of those creep in — a class name that secretly represents a data value, a selector chosen based on what the backend returned rather than what the element is — the guarantee breaks. And it doesn't just break for the person who wrote the crossing. It breaks for everyone who touches that code afterward, because now presentation can no longer be trusted to live in exactly one place.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demonstrating the Principle
&lt;/h2&gt;

&lt;p&gt;One toggle, done two ways.&lt;/p&gt;

&lt;p&gt;Set directly from a click handler:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;button&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;click&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;panel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;display&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;panel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;display&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;none&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;block&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;none&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or the same interaction, with the boundary intact — JavaScript changes state, CSS owns the resulting presentation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;button&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;click&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;panel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;classList&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toggle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;is-open&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.panel&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;none&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nc"&gt;.panel.is-open&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;block&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Same outcome, from the user's side. But in the second version, presentation stays fully legible from the stylesheet alone. Nobody has to go hunting through JavaScript to understand how &lt;code&gt;.panel&lt;/code&gt; behaves.&lt;/p&gt;

&lt;h2&gt;
  
  
  quell as the Case Study
&lt;/h2&gt;

&lt;p&gt;quell draws this boundary explicitly, and treats it as non-negotiable: CSS owns presentation, JavaScript owns behavior, HTML owns structure. Nothing in the system is permitted to quietly cross that line — a rule enforced by convention as firmly as it's enforced by architecture.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Broader Lesson
&lt;/h2&gt;

&lt;p&gt;This closes the first four pieces of this series, and it's worth naming the shape underneath all of them.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Resets&lt;/em&gt;: something claiming neutrality that wasn't neutral. &lt;em&gt;Specificity&lt;/em&gt;: something calculating that should have been declaring. &lt;em&gt;Entropy&lt;/em&gt;: something growing that should have been governable. And &lt;strong&gt;now this&lt;/strong&gt;: something reaching for power when what it actually needed was a line nobody had drawn yet.&lt;/p&gt;

&lt;p&gt;Four different symptoms. One underlying fix, named plainly for the first time here: &lt;strong&gt;boundaries&lt;/strong&gt;, not power. The rest of this series exists to show exactly how the browser lets you build boundaries for real — starting with the mechanism that gives the cascade an explicit ordering axis of its own.&lt;/p&gt;

</description>
      <category>css</category>
      <category>webdev</category>
      <category>architecture</category>
      <category>quell</category>
    </item>
    <item>
      <title>Por qué toda hoja de estilos grande termina siendo impredecible</title>
      <dc:creator>Franklin</dc:creator>
      <pubDate>Tue, 11 Aug 2026 11:02:10 +0000</pubDate>
      <link>https://dev.to/ortizfranklindev/por-que-toda-hoja-de-estilos-grande-termina-siendo-impredecible-e3h</link>
      <guid>https://dev.to/ortizfranklindev/por-que-toda-hoja-de-estilos-grande-termina-siendo-impredecible-e3h</guid>
      <description>&lt;p&gt;&lt;em&gt;También disponible en &lt;a href="https://dev.to/ortizfranklindev/why-every-large-stylesheet-eventually-becomes-unpredictable-4cah"&gt;English&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  El problema
&lt;/h2&gt;

&lt;p&gt;Cada equipo hereda una hoja de estilos así, tarde o temprano.&lt;/p&gt;

&lt;p&gt;No está mal escrita. Nadie en el equipo original fue descuidado. Los selectores son razonables. El nombramiento es lo suficientemente consistente. Y aun así, nadie la toca sin miedo, porque nadie está seguro de cuáles de sus cuatro mil líneas son estructurales.&lt;/p&gt;

&lt;p&gt;Así que el instinto es siempre el mismo. Añadir una regla nueva. No eliminar la vieja — por si acaso. Un componente nuevo recibe su propio selector en lugar de reutilizar algo en lo que, de alguna manera, se podría estar confiando en otro lugar de formas que nadie documentó. El archivo crece. Nunca se reduce. No porque alguien decidiera que solo debería crecer — sino porque crecer se sentía seguro y reducirse nunca lo fue.&lt;/p&gt;

&lt;h2&gt;
  
  
  Por qué existe el problema
&lt;/h2&gt;

&lt;p&gt;Eliminar una regla requiere confianza. Añadir una no requiere ninguna.&lt;/p&gt;

&lt;p&gt;Esa asimetría es todo el mecanismo. El CSS es aditivo y permisivo por naturaleza — escribes una regla nueva y simplemente funciona, superpuesta a todo lo que vino antes, sin romper nada más en el proceso. Esa es una fortaleza genuina. También es exactamente por lo que nadie se siente seguro restando. Borrar una regla significa demostrar que nada depende de ella, en cada página, cada componente, cada ancho de navegador, cada estado — y el CSS no ofrece una forma fácil de demostrar eso.&lt;/p&gt;

&lt;p&gt;Así que se escriben selectores defensivos no porque se necesiten hoy, sino porque un desarrollador no está seguro de qué se rompe si simplemente confía en lo que ya está ahí. Las reglas muertas sobreviven indefinidamente, porque nada en el sistema le dice a nadie que están muertas.&lt;/p&gt;

&lt;p&gt;El intercambio tiene la misma forma que los dos últimos problemas de esta serie, con una cara diferente: la misma cualidad que hace al CSS accesible —siempre puedes simplemente añadir más— es la cualidad que hace que las hojas de estilos grandes sean ingobernables con el tiempo.&lt;/p&gt;

&lt;h2&gt;
  
  
  El primer principio
&lt;/h2&gt;

&lt;p&gt;Nómbralo claramente: el CSS no tiene un bucle de retroalimentación para la irrelevancia.&lt;/p&gt;

&lt;p&gt;Un lenguaje compilado marca una variable no utilizada. Una importación no utilizada recibe una advertencia, a veces un error. Las herramientas le dicen al autor, directamente: "esto no está haciendo nada — elimínalo". El CSS no tiene nada equivalente integrado en el propio lenguaje. Una regla que deja de importar no se anuncia. Simplemente se queda ahí, permanentemente ambigua — tal vez estructural, tal vez vestigial, indistinguible desde fuera, para siempre.&lt;/p&gt;

&lt;p&gt;Los equipos no crean este tipo de entropía por descuido. La crean porque el sistema nunca les dice cuándo es realmente seguro eliminar algo. Con suficiente tiempo y suficientes colaboradores, ese silencio se acumula. No por la negligencia de nadie — sino por la simple y repetida ausencia de una señal que nunca existió.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demostración del principio
&lt;/h2&gt;

&lt;p&gt;Un solo ejemplo silencioso lleva esto más lejos que un catálogo.&lt;/p&gt;

&lt;p&gt;En algún lugar de una hoja de estilos real: una regla apuntando a &lt;code&gt;.legacy-card-footer&lt;/code&gt;. La plantilla que usaba esa clase fue reconstruida hace ocho meses. Nadie eliminó la regla, porque nadie pudo demostrar, rápidamente, que nada más la referenciaba. Así que se sigue enviando. A cada visitante. En cada carga de página. Sin hacer nada, indefinidamente, porque borrarla se sentía más arriesgado que dejarla - y la propia hoja de estilos no ofrecía forma de notar la diferencia.&lt;/p&gt;

&lt;h2&gt;
  
  
  quell como estudio de caso
&lt;/h2&gt;

&lt;p&gt;Los límites de capa explícitos no hacen que el código muerto sea imposible. Lo hacen localizable. Una regla obsoleta dentro de componentes es un problema mucho más pequeño y fácil de buscar que una regla obsoleta enterrada en algún lugar de un archivo global indiferenciado, sin límites que digan siquiera por dónde empezar a buscar.&lt;/p&gt;

&lt;h2&gt;
  
  
  La lección general
&lt;/h2&gt;

&lt;p&gt;La entropía no es un fallo de disciplina. Ni en el CSS, ni en ningún otro lugar.&lt;/p&gt;

&lt;p&gt;Es lo que sucede, de forma fiable, siempre que un sistema recompensa la suma y no ofrece nada a cambio de la resta. El arreglo nunca fue "esforzarse más por eliminar cosas" - ese es el mismo instinto de disciplina-como-solución que esta serie ya ha dejado de lado dos veces. El arreglo es construir un sistema donde eliminar sea exactamente tan seguro, y exactamente tan visible, como siempre lo fue añadir.&lt;/p&gt;

&lt;p&gt;Ese es el hilo que recorre los tres artículos hasta ahora. No es una serie de quejas de CSS no relacionadas - es una forma recurrente, que se presenta de manera distinta cada vez: un sistema sin arquitectura eventualmente pedirá a la disciplina que haga un trabajo para el que la disciplina nunca fue construida.&lt;/p&gt;

</description>
      <category>css</category>
      <category>arquitectura</category>
      <category>desarrolloweb</category>
      <category>español</category>
    </item>
    <item>
      <title>Why Every Large Stylesheet Eventually Becomes Unpredictable</title>
      <dc:creator>Franklin</dc:creator>
      <pubDate>Tue, 11 Aug 2026 11:01:27 +0000</pubDate>
      <link>https://dev.to/ortizfranklindev/why-every-large-stylesheet-eventually-becomes-unpredictable-4cah</link>
      <guid>https://dev.to/ortizfranklindev/why-every-large-stylesheet-eventually-becomes-unpredictable-4cah</guid>
      <description>&lt;p&gt;&lt;em&gt;Also available in &lt;a href="https://dev.to/ortizfranklindev/por-que-toda-hoja-de-estilos-grande-termina-siendo-impredecible-e3h"&gt;Español&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;Every team inherits a stylesheet like this eventually.&lt;/p&gt;

&lt;p&gt;Not badly written. Nobody on the original team was careless. Selectors are reasonable. Naming is consistent enough. And still, nobody touches it without dread, because nobody's sure which of its four thousand lines are load-bearing.&lt;/p&gt;

&lt;p&gt;So the instinct is always the same. Add a new rule. Don't remove the old one — just in case. A new component gets its own selector rather than reusing something that might, somehow, be relied on elsewhere in ways nobody documented. The file grows. It never shrinks. Not because anyone decided it should only grow — because growing felt safe, and shrinking never did.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the Problem Exists
&lt;/h2&gt;

&lt;p&gt;Removing a rule requires confidence. Adding one requires none.&lt;/p&gt;

&lt;p&gt;That asymmetry is the whole mechanism. CSS is additive and forgiving by nature — write a new rule, and it just works, layered on top of everything that came before it, without breaking anything else in the process. That's a genuine strength. It's also exactly why nobody ever feels safe subtracting. Deleting a rule means proving nothing depends on it, across every page, every component, every browser width, every state — and CSS gives no easy way to prove that. So defensive selectors get written not because they're needed today, but because a developer isn't sure what breaks if they simply trust what's already there. Dead rules survive indefinitely, because nothing in the system ever tells anyone they're dead.&lt;/p&gt;

&lt;p&gt;The trade-off is the same shape as the last two problems in this series, wearing a different face: the very quality that makes CSS approachable — you can always just add more — is the quality that makes large stylesheets ungovernable over time.&lt;/p&gt;

&lt;h2&gt;
  
  
  The First Principle
&lt;/h2&gt;

&lt;p&gt;Naming it plainly: CSS has no feedback loop for irrelevance.&lt;/p&gt;

&lt;p&gt;A compiled language flags an unused variable. An unused import gets a warning, sometimes an error. The tooling tells the author, directly, "this isn't doing anything — remove it." CSS has nothing equivalent built into the language itself. A rule that stops mattering doesn't announce itself. It just sits there, permanently ambiguous — maybe load-bearing, maybe vestigial, indistinguishable from the outside, forever.&lt;/p&gt;

&lt;p&gt;Teams don't create this kind of entropy through carelessness. They create it because the system never tells them when it's actually safe to remove something. Given enough time and enough contributors, that silence compounds. Not through anyone's negligence — through the simple, repeated absence of a signal that never existed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demonstrating the Principle
&lt;/h2&gt;

&lt;p&gt;A single, quiet example carries this further than a catalog would.&lt;/p&gt;

&lt;p&gt;Somewhere in a real stylesheet: a rule targeting &lt;code&gt;.legacy-card-footer&lt;/code&gt;. The template that used that class was rebuilt eight months ago. Nobody removed the rule, because nobody could prove, quickly, that nothing else referenced it. So it still ships. To every visitor. On every page load. Doing nothing, indefinitely, because deleting it felt riskier than leaving it — and the stylesheet itself offered no way to tell the difference.&lt;/p&gt;

&lt;h2&gt;
  
  
  quell as the Case Study
&lt;/h2&gt;

&lt;p&gt;Explicit layer boundaries don't make dead code impossible. They make it findable. A stale rule sitting inside &lt;code&gt;components&lt;/code&gt; is a much smaller, more searchable problem than a stale rule buried somewhere in one undifferentiated global file with no boundary telling you where to even start looking.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Broader Lesson
&lt;/h2&gt;

&lt;p&gt;Entropy isn't a discipline failure. Not in CSS, not anywhere else.&lt;/p&gt;

&lt;p&gt;It's what happens, reliably, whenever a system rewards addition and offers nothing in return for subtraction. The fix was never "try harder to remove things" — that's the same discipline-as-solution instinct this series has already set aside twice. The fix is building a system where removal is exactly as safe, and exactly as visible, as addition always was.&lt;/p&gt;

&lt;p&gt;That's the thread running under all three articles so far. Not a series of unrelated CSS complaints — one recurring shape, worn differently each time: a system with no architecture will eventually ask discipline to do a job discipline was never built for.&lt;/p&gt;

</description>
      <category>css</category>
      <category>webdev</category>
      <category>architecture</category>
      <category>quell</category>
    </item>
  </channel>
</rss>
