<?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>Forem: Ignacio Cuadra</title>
    <description>The latest articles on Forem by Ignacio Cuadra (@ignacio_cuadra).</description>
    <link>https://forem.com/ignacio_cuadra</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1055855%2F6e15f333-2793-4ca0-867e-292e2007c4c1.png</url>
      <title>Forem: Ignacio Cuadra</title>
      <link>https://forem.com/ignacio_cuadra</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/ignacio_cuadra"/>
    <language>en</language>
    <item>
      <title>ITCSS - Arquitectura CSS</title>
      <dc:creator>Ignacio Cuadra</dc:creator>
      <pubDate>Wed, 26 Apr 2023 02:45:51 +0000</pubDate>
      <link>https://forem.com/ignacio_cuadra/itcss-arquitectura-css-3p4b</link>
      <guid>https://forem.com/ignacio_cuadra/itcss-arquitectura-css-3p4b</guid>
      <description>&lt;p&gt;En un artículo anterior escribí sobre &lt;a href="https://dev.to/ignacio_cuadra/css-convenciones-de-nombres-bem-suit-css-y-title-css-365o"&gt;la importancia de las convenciones de nombre en CSS&lt;/a&gt;, haciendo especial mención a BEM, SUIT CSS y Title CSS. Hoy quiero seguir explorando el tema de la organización del código CSS, centrándome en las arquitecturas de estilo. Es esencial escribir código limpio y ordenado en proyectos grandes, y sin embargo, a menudo se pasa por alto cómo abordar el CSS en la arquitectura general del software.&lt;/p&gt;

&lt;p&gt;En particular, me gustaría presentar la arquitectura ITCSS, que ha demostrado ser muy eficaz para organizar el CSS en proyectos grandes y complejos. Con ITCSS, el CSS se organiza en capas según su especificidad y su alcance, de forma que se pueda mantener una jerarquía clara y coherente. &lt;/p&gt;

&lt;p&gt;A lo largo del artículo, exploraremos cada una de las capas de ITCSS y cómo se relacionan entre sí, así como los beneficios de su implementación. Espero que este artículo sirva como un recurso útil para aquellos que buscan mejorar la organización y mantenibilidad de su código CSS.&lt;/p&gt;

&lt;h2&gt;
  
  
  El triángulo
&lt;/h2&gt;

&lt;p&gt;El triángulo invertido &lt;em&gt;(&lt;strong&gt;I&lt;/strong&gt;nverted &lt;strong&gt;T&lt;/strong&gt;riangle &lt;strong&gt;CSS&lt;/strong&gt;)&lt;/em&gt; de ITCSS  es el que le da el nombre a esta metodología.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6k6a8kb14u40uns2cfks.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6k6a8kb14u40uns2cfks.png" alt="Triángulo invertido de ITCSS"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;La arquitectura ITCSS nos indica que la organización del código CSS debe ser planteada en base a un triángulo invertido, según la especificidad. Esto significa que las reglas de estilo más generales y básicas se agregan primero, y las reglas específicas que sobrescriben el comportamiento como las clases de utilidad &lt;em&gt;(utility classes)&lt;/em&gt; se agregan al final.&lt;/p&gt;

&lt;p&gt;Cabe señalar que si bien puedes implementar esta metodología con CSS puro, ya sea en un archivo o multiples archivos, es recomendable el uso de preprocesadores como SASS o alguna herramienta de empaquetado que facilite la separación de cada una de las capas y componentes en documentos independientes para luego ser compilados.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conceptos
&lt;/h2&gt;

&lt;p&gt;Si te preguntas el por qué de un triangulo invertido, bueno, es por lo siguiente:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2kl6nsjemmhtl92i4nq6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2kl6nsjemmhtl92i4nq6.png" alt="Alcance (Reach), Explecitidad (Explicitness) y Especificidad (Specificity)"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Como se especifica en la imagen, mientras mas grande es la sección, el alcance es mayor. Y de manera contraria, Mientras mas pequeña es la sección el CSS debe ser mas explicito y especifico.&lt;/p&gt;

&lt;p&gt;Estos conceptos describen como debe ir organizado nuestro código en un archivo &lt;code&gt;.css&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg6ltg04nsx7t9cd6ex8a.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg6ltg04nsx7t9cd6ex8a.png" alt="Especificidad vs número de linea"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Como te habrás dado cuenta, en esencia, los tres conceptos presentados en la imagen son similares y uno es consecuencia del otro. Con una explicación, todo será mas fácil:&lt;/p&gt;

&lt;h3&gt;
  
  
  De genérico a explícito
&lt;/h3&gt;

&lt;p&gt;Se debe empezar escribiendo CSS genérico de bajo nivel y progresivamente escribir CSS más especifico y explicito. Osea, podríamos empezar con un reinicio o normalización de CSS, continuar reglas del tipo &lt;code&gt;h1&lt;/code&gt;, &lt;code&gt;h2&lt;/code&gt;, &lt;code&gt;h3&lt;/code&gt;, etc. E ir progresando hasta llegar a reglas tan explicitas como &lt;code&gt;.text-center&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  De baja especificidad a alta especificidad
&lt;/h3&gt;

&lt;p&gt;Empezaremos con reglas de baja especificidad y progresivamente se codificarán reglas de alta especificidad. Con esto evitaremos conflictos y con ello, evitaremos el uso de la clausula &lt;code&gt;!important&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  De amplio alcance a corto alcance (localizado)
&lt;/h3&gt;

&lt;p&gt;Inicialmente, las reglas CSS afectaran directamente al DOM y a medida que se avance en el documento CSS, nos encontraremos con reglas mas localizadas por medio de clases.&lt;/p&gt;

&lt;h2&gt;
  
  
  Capas
&lt;/h2&gt;

&lt;p&gt;Habiendo entendido la generalidad de la idea, es momento de abordar cada una de las capas que nos presenta ITCSS.&lt;/p&gt;

&lt;h3&gt;
  
  
  Settings
&lt;/h3&gt;

&lt;p&gt;La primera capa y con mayor alcance es la capa de Settings. Esta solo debe ser utilizada si haces uso de un preprocesador como lo es SASS, y es donde definimos las variables o configuraciones globales de nuestro proyecto. El tamaño base de letra, paletas de colores, etc.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tools
&lt;/h3&gt;

&lt;p&gt;La siguiente capa hace referencia a todas esas herramientas (mixins o funciones) que puedan ser utilizados por las siguientes capas.&lt;/p&gt;

&lt;h3&gt;
  
  
  Generic
&lt;/h3&gt;

&lt;p&gt;Esta es la primera que realmente produce CSS. Alberga todos los estilos de alto nivel y amplio alcance que buscan eliminar u homologar el estilo entre navegadores, o también, establecer una configuración estándar que será base en todo el proyecto. El típico código de ejemplo es el siguiente:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;

&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;box-sizing&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;border-box&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;margin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&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;Esta capa por lo regular es estándar y puede ser reutilizada en multiples proyectos. Aprovecho de listar algunos ejemplos que ha elaborado la comunidad para que puedas utilizar en tus proyectos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/jgthms/minireset.css" rel="noopener noreferrer"&gt;MiniReset.css&lt;/a&gt;- Un pequeño reinicio de CSS moderno.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/necolas/normalize.css" rel="noopener noreferrer"&gt;Normalize.css&lt;/a&gt; - Un conjunto de reglas CSS que brindan una mejor coherencia entre navegadores en el estilo predeterminado de los elementos HTML.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/csstools/sanitize.css" rel="noopener noreferrer"&gt;Sanitize.css&lt;/a&gt; - Un conjunto de reglas CSS que se adaptan a las mejores prácticas de hoy en día listas para usar.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;En algún futuro artículo pretendo hablar mas extensamente de la diferencia entre un normalize y un reset y cual es mejor a mi parecer. Spoiler: Normalize casi el 100% de las veces.&lt;/p&gt;

&lt;h3&gt;
  
  
  Elements
&lt;/h3&gt;

&lt;p&gt;Estos son elementos HTML sin clases. ¿Cómo se ve un &lt;code&gt;h1&lt;/code&gt; sin una clase en él? ¿Cómo se ve un &lt;code&gt;a&lt;/code&gt; sin una clase? La capa de elementos solo usa selectores de tipo. Es un poco más explícito que la capa anterior en el sentido de que ahora decimos "haz que cada &lt;code&gt;h1&lt;/code&gt; sea así de grande", o "haz que cada &lt;code&gt;a&lt;/code&gt; sea de un cierto color".&lt;/p&gt;

&lt;h3&gt;
  
  
  Objects
&lt;/h3&gt;

&lt;p&gt;A partir de aquí empezamos a usar selectores de clases. Los objetos son elementos reutilizables con una mayor especificidad que los descritos en la capa Elements. Ejemplos concretos serían los típicos &lt;code&gt;.button&lt;/code&gt;, &lt;code&gt;.wrapper&lt;/code&gt; o &lt;code&gt;.table&lt;/code&gt;. Es estilo que no nos sentimos cómodos colocandolo por medio de un selector de tipo como &lt;code&gt;button&lt;/code&gt; debido a que en algún contexto puede que queramos utilizar el mismo tipo de elemento pero con otro estilo como por ejemplo, un botón que parezca un link.&lt;/p&gt;

&lt;p&gt;En este punto también incluimos los modificadores de dichos objeto como lo sería &lt;code&gt;.button--danger&lt;/code&gt; o &lt;code&gt;.button--outline&lt;/code&gt;. Sin embargo, acá &lt;strong&gt;no&lt;/strong&gt; debemos colocar modificadores globales (clases de utilidad) como &lt;code&gt;.--text-center&lt;/code&gt;. Estos últimos forman parte de la capa "Trumps".&lt;/p&gt;

&lt;h3&gt;
  
  
  Components
&lt;/h3&gt;

&lt;p&gt;Los componentes son las secciones independientes de nuestro sitio web. Acá nos podemos encontrar con el típico .header o .card que se componen de un conjunto de elementos y objetos. También es aquí donde pondremos modificadores de componente como &lt;code&gt;.card--dark&lt;/code&gt; y elementos desentiendes como &lt;code&gt;.card__title&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Trumps
&lt;/h3&gt;

&lt;p&gt;Por ultimo tenemos la capa Trumps, la capa que "triunfa" sobre el resto. En esta capa podemos sobre escribir todo, y es donde seguramente estén todos nuestros &lt;code&gt;!importants&lt;/code&gt;. Es aquí donde están nuestras clases de utilidad como &lt;code&gt;--text-center&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Partials
&lt;/h2&gt;

&lt;p&gt;Por último nos queda abordar los Parciales (Partials). Cada capa tiene sus parciales, aquellas partes de código que, por temas de orden, preferimos colocarlos en archivos independientes. Por convención, Harry Roberts (el creado de esta metodología) propone usar los nombres &lt;code&gt;_&amp;lt;capa&amp;gt;.&amp;lt;parcial&amp;gt;.scss&lt;/code&gt; (por ejemplo: _settings.colors.scss, _elements.headings.scss o _components.tabs.scss).&lt;/p&gt;

&lt;h2&gt;
  
  
  Resultados
&lt;/h2&gt;

&lt;p&gt;Para concluir, de usar esta metodología con un preprocesador, deberías terminar con un &lt;code&gt;styles.scss&lt;/code&gt; como el siguiente:&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;@import&lt;/span&gt; &lt;span class="s1"&gt;"settings.global"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;@import&lt;/span&gt; &lt;span class="s1"&gt;"settings.colors"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;@import&lt;/span&gt; &lt;span class="s1"&gt;"tools.functions"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;@import&lt;/span&gt; &lt;span class="s1"&gt;"tools.mixins"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;@import&lt;/span&gt; &lt;span class="s1"&gt;"generic.box-sizing"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;@import&lt;/span&gt; &lt;span class="s1"&gt;"generic.normalize"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;@import&lt;/span&gt; &lt;span class="s1"&gt;"elements.headings"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;@import&lt;/span&gt; &lt;span class="s1"&gt;"elements.links"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;@import&lt;/span&gt; &lt;span class="s1"&gt;"objects.wrappers"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;@import&lt;/span&gt; &lt;span class="s1"&gt;"objects.grid"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;@import&lt;/span&gt; &lt;span class="s1"&gt;"components.site-nav"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;@import&lt;/span&gt; &lt;span class="s1"&gt;"components.buttons"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;@import&lt;/span&gt; &lt;span class="s1"&gt;"components.carousel"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;@import&lt;/span&gt; &lt;span class="s1"&gt;"trumps.clearfix"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;@import&lt;/span&gt; &lt;span class="s1"&gt;"trumps.utilities"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;@import&lt;/span&gt; &lt;span class="s1"&gt;"trumps.ie8"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Código extraído de &lt;a href="https://www.creativebloq.com/web-design/manage-large-css-projects-itcss-101517528" rel="noopener noreferrer"&gt;Manage large CSS projects with ITCSS&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusiones
&lt;/h2&gt;

&lt;p&gt;Esta metodología es altamente efectiva para gestionar proyectos extensos y complejos. Al utilizarla, podrás mantener tu CSS organizado y fácil de mantener, y te despreocuparás de colisiones y redundancias. Sin embargo, como cualquier arquitectura, es importante considerar el costo que implica su implementación. Generar una arquitectura CSS no es algo que deba hacerse en todos los proyectos, ya que puede requerir un esfuerzo y tiempo excesivo si se trata de un sitio web pequeño o una página de presentación. En estos casos, es posible que sea más oportuno utilizar sistemas de diseño como Tailwind o Bootstrap.&lt;/p&gt;

&lt;p&gt;En un artículo futuro, presentaré un ejemplo práctico de cómo aplicar esta metodología a un proyecto en React.js o Solid.js, donde los objetos y componentes pueden tener su propio CSS modular.&lt;/p&gt;

&lt;h2&gt;
  
  
  Referencias
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.creativebloq.com/web-design/manage-large-css-projects-itcss-101517528" rel="noopener noreferrer"&gt;Manage large CSS projects with ITCSS&lt;/a&gt;&lt;/p&gt;

</description>
      <category>css</category>
      <category>frontend</category>
      <category>architecture</category>
    </item>
    <item>
      <title>CSS - Convenciones de nombres: BEM, SUIT CSS y Title CSS</title>
      <dc:creator>Ignacio Cuadra</dc:creator>
      <pubDate>Mon, 17 Apr 2023 16:45:01 +0000</pubDate>
      <link>https://forem.com/ignacio_cuadra/css-convenciones-de-nombres-bem-suit-css-y-title-css-365o</link>
      <guid>https://forem.com/ignacio_cuadra/css-convenciones-de-nombres-bem-suit-css-y-title-css-365o</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Hay solo dos cosas difíciles en Ciencias de la Computación: Invalidación de caché y nombrar las cosas.&lt;/p&gt;

&lt;p&gt;— &lt;cite&gt;Phil Karlton&lt;/cite&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;De aquí a un tiempo esa cita a tomado especial relevancia en mi vida como desarrollador. Los proyectos en los que trabajo cada vez se hacen mas grandes y complejos, y esto no se limita solo al back-end, sino que también el front-end y como no, a CSS.&lt;/p&gt;

&lt;p&gt;Afortunadamente hay guiás que nos ayudan a ponerle nombre a las cosas, estas guiás se denominan "Convenciones de Nombres" &lt;em&gt;(Naming Conventions)&lt;/em&gt; y son fundamentales para escribir código limpio, ordenado y fácil de mantener.&lt;/p&gt;

&lt;p&gt;Las convenciones de nombres nos ayudan a nombrar de forma consistente nuestras clases y a organizar nuestro código de manera coherente. BEM, SUIT CSS y Title CSS son algunas de las convenciones más populares que podemos utilizar para lograr esto.&lt;/p&gt;

&lt;h2&gt;
  
  
  BEM
&lt;/h2&gt;

&lt;p&gt;En mi opinión, BEM es la metodología más ampliamente utilizada de todas. Como se indica en &lt;a href="https://getbem.com/"&gt;getbem&lt;/a&gt;, independientemente de la metodología CSS que utilices (&lt;a href="https://www.smashingmagazine.com/2011/12/an-introduction-to-object-oriented-css-oocss/"&gt;OOCSS&lt;/a&gt;, &lt;a href="http://smacss.com/"&gt;SMACSS&lt;/a&gt; o &lt;a href="https://atomicdesign.bradfrost.com/chapter-2/"&gt;ATOMIC&lt;/a&gt;), BEM te será de gran utilidad para organizar tu código de una manera que sea fácil de entender a primera vista.&lt;/p&gt;

&lt;p&gt;Las reglas de BEM son simples y se resumen en tres conceptos principales:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Bloque &lt;em&gt;(Block)&lt;/em&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Sintaxis&lt;/strong&gt;: &lt;code&gt;&amp;lt;component-name&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;El bloque encapsula una entidad independiente que es significativa por sí misma. Aunque los bloques se pueden anidar o interactuar, cada uno es independiente y tiene sentido por sí solo.&lt;/p&gt;

&lt;p&gt;Por ejemplo, la clase &lt;code&gt;.card&lt;/code&gt; es un bloque. Una &lt;code&gt;.card&lt;/code&gt; recibe este nombre porque es un elemento independiente y reutilizable (por lo tanto, se utilizan clases en lugar de IDs). Puedes anidarla o listarla, pero sigue siendo independiente y reutilizable.&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="nc"&gt;.card&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#eee&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;h3&gt;
  
  
  2. Elemento &lt;em&gt;(Element)&lt;/em&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Sintaxis&lt;/strong&gt;: &lt;code&gt;&amp;lt;component&amp;gt;__&amp;lt;element-name&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Los elementos son parte de un bloque y, por lo tanto, dependen de este. Un ejemplo concreto podría ser un título para el bloque &lt;code&gt;.card&lt;/code&gt;. La clase CSS se forma combinando el nombre del bloque con dos guiones bajos y el nombre del elemento:&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="nc"&gt;.card__title&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="m"&gt;#111&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;Cabe señalar que, debido a que los elementos ya indican en su nombre a qué bloque pertenecen, no es necesario indicar su dependencia en el código.&lt;/p&gt;

&lt;h4&gt;
  
  
  Mal
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.card&lt;/span&gt; &lt;span class="nc"&gt;.card__title&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="m"&gt;#111&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;h4&gt;
  
  
  Bien
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.card__title&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="m"&gt;#111&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;h3&gt;
  
  
  3. Modificador &lt;em&gt;(Modifier)&lt;/em&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Sintaxis&lt;/strong&gt;: &lt;code&gt;&amp;lt;component|element&amp;gt;--&amp;lt;modifier-name&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Los modificadores son todos aquellas clases que modifican o agregan estilo a un bloque o elemento. La clase CSS se forma como el nombre del bloque o elemento más dos guiones.&lt;/p&gt;

&lt;p&gt;Por ejemplo, en determinados contextos, es posible que deseemos cambiar el color de una &lt;code&gt;.card&lt;/code&gt;.&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="nc"&gt;.card--dark&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#111&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;Nuevamente, como su nombre lo indica, este modificador solo debe usarse en elementos de &lt;code&gt;.card&lt;/code&gt; y, por lo tanto, no es necesario añadir dicha restricción al CSS.&lt;/p&gt;

&lt;h4&gt;
  
  
  Mal
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.card&lt;/span&gt; &lt;span class="nc"&gt;.card--dark&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#111&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;h4&gt;
  
  
  Bien
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.card--dark&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#111&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;h3&gt;
  
  
  Nota sobre BEM
&lt;/h3&gt;

&lt;p&gt;Como habrás notado, tanto los elementos como los modificadores tienen un carácter que los identifica (&lt;code&gt;_&lt;/code&gt; o &lt;code&gt;-&lt;/code&gt;), y este carácter se repite dos veces. Esto es para diferenciar el uso de estos caracteres como una utilidad semántica en lugar de un separador de nombre común. Por lo tanto, es perfectamente aceptable usar cualquiera de estas dos opciones:&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="nc"&gt;.card__sub-title&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="m"&gt;#111&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;.card__sub_title&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="m"&gt;#111&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;La elección entre ellos dependerá de tu equipo y su preferencia. Lo importante es ser coherente y utilizar siempre la misma opción en tu código.&lt;/p&gt;

&lt;h2&gt;
  
  
  SUIT CSS
&lt;/h2&gt;

&lt;p&gt;SUIT CSS se basa en nombres de clase estructuradas y guiones significativos (es decir, no usar guiones simplemente para separar palabras). &lt;/p&gt;

&lt;p&gt;SUIT CSS divide las clases en dos principales conceptos: utilidades &lt;em&gt;(utilities)&lt;/em&gt; y componentes &lt;em&gt;(components)&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Utilidades &lt;em&gt;(Utilities)&lt;/em&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Sintaxis&lt;/strong&gt;: &lt;code&gt;u-[sm-|md-|lg-]&amp;lt;utilityName&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Las utilidades son recursos de "bajo nivel estructural" que se pueden aplicar directamente a cualquier elemento dentro de un componente. En esencia, son modificadores globales. Si conoces TailwindCSS estarás familiarizado con las utilidades (TailwindCSS solo utiliza utilidades).&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Un marco CSS de &lt;em&gt;utility-first&lt;/em&gt; repleto de clases como &lt;code&gt;.flex&lt;/code&gt;, &lt;code&gt;.pt-4&lt;/code&gt;, &lt;code&gt;.text-center&lt;/code&gt; y &lt;code&gt;.rotate-90&lt;/code&gt; que se pueden componer para crear cualquier diseño, directamente en &lt;em&gt;markup&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;— &lt;cite&gt;TailwindCSS&lt;/cite&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;En SUIT CSS las utilidades deben partir con la letra u continuado por un guion y su nombre en &lt;em&gt;camelCase&lt;/em&gt;. A su vez, SUIT CSS hace la salvedad de que si hay un modificador de tamaño como &lt;code&gt;sm&lt;/code&gt;, &lt;code&gt;md&lt;/code&gt; o &lt;code&gt;lg&lt;/code&gt; se debe agregar entre la u y el nombre con otro guion extra de separación. Ejemplos de esto sería:&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="nc"&gt;.u-floatLeft&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;float&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;left&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.u-block&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;span class="nc"&gt;.u-md-block&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="c"&gt;/* ... */&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Si bien la documentación de SUIT CSS no lo indica, para las utility class puede ser útil agregar la clausula &lt;code&gt;!important&lt;/code&gt;. En mi opinión, este es el único contexto en donde está bien hacer uso de &lt;code&gt;!important&lt;/code&gt; dado que en ningún caso deberías utilizar dos clases de utilidad que sean contradictorias.&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="nc"&gt;.u-floatLeft&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;float&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;left&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="nc"&gt;.u-block&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="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;p&gt;Esto solo tiene sentido si utilizas clases de utilidad que sean atómicas, osea, que apliquen un solo estilo. Nuevamente, en mi opinión, las clases de utilidad deben ser atómicas.&lt;/p&gt;

&lt;h3&gt;
  
  
  Compoenentes &lt;em&gt;(Components)&lt;/em&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Sintaxis&lt;/strong&gt;: &lt;code&gt;[&amp;lt;namespace&amp;gt;-]&amp;lt;ComponentName&amp;gt;[-descendentName][--modifierName]&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;A diferencia de BEM en SUIT CSS los componentes pueden ser cualquier elemento al que queramos darle un nombre semántico sin importar si depende o no de otro componente.&lt;/p&gt;

&lt;p&gt;Todo componente debe tener un nombre en &lt;em&gt;PascalCase&lt;/em&gt;. Opcionalmente, separado por un guion &lt;code&gt;-&lt;/code&gt; puede tener de prefijo un &lt;code&gt;namespace&lt;/code&gt; en &lt;strong&gt;lowercase&lt;/strong&gt;.&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="nc"&gt;.twt-Button&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="c"&gt;/* ... */&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Los sub-componentes deben estar escritos en &lt;em&gt;camelCase&lt;/em&gt; deben tener de prefijo a su componente padre separado por un guion.&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="nc"&gt;.Card-title&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="c"&gt;/* ... */&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A su vez, los componentes pueden tener modificadores, descritos en &lt;em&gt;camelCase&lt;/em&gt; y separados por dos guiones.&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="nc"&gt;.Card--dark&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="c"&gt;/* ... */&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Un ejemplo de todos esto utilizado a la vez sería el siguiente:&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="nc"&gt;.twt-Card-title--bold&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="c"&gt;/* ... */&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Estados
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Sintaxis&lt;/strong&gt;: &lt;code&gt;&amp;lt;stateName&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Nota&lt;/em&gt;: Solo utilizar bajo el contexto de un componente (y por tanto, dependiente de este).&lt;/p&gt;

&lt;p&gt;Adicionalmente, los componentes pueden tener estados como un &lt;code&gt;.alert&lt;/code&gt; con &lt;code&gt;.is-danger&lt;/code&gt; para notificar un error, o una card con &lt;code&gt;.is-loading&lt;/code&gt; cuando su contenido esta cargando.&lt;/p&gt;

&lt;p&gt;Estas deben estar descritas en camelCase.&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="nc"&gt;.Commentary.is-expanded&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="c"&gt;/* ... */&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Variables
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Sintaxis&lt;/strong&gt;: &lt;code&gt;--ComponentName[-descendant|--modifier][-onState]-(cssProperty|variableName)&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;A su vez, SUIT CSS nos da un lineamiento de como definir nombres de variables. Estas se agrupan en dos tipos: Variables de componente y variables de tema.&lt;/p&gt;

&lt;h4&gt;
  
  
  Variables de Componente &lt;em&gt;(Component Variables)&lt;/em&gt;
&lt;/h4&gt;

&lt;p&gt;SUIT CSS bajo la premisa de que las propiedades son globales y los componentes no deben exponer su estructura interna, define que las variables de componente deben tener una estructura plana después de su namespace.&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="nd"&gt;:root&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="err"&gt;--ComponentName-backgroundColor&lt;/span&gt;
  &lt;span class="err"&gt;--ComponentName-descendant-backgroundColor&lt;/span&gt;
  &lt;span class="err"&gt;--ComponentName--modifier-backgroundColor&lt;/span&gt;
  &lt;span class="err"&gt;--ComponentName-onHover-backgroundColor&lt;/span&gt;
  &lt;span class="err"&gt;--ComponentName-descendant-onHover-backgroundColor&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;En mi opinión, el uso de variables de componente debe mantenerse al mínimo (o idealmente no usarse). Las variables en CSS pretenden ser una guía de estilos general. Requerir variables de componente puede ser que sea un síntoma de que nuestro diseño no es coherente.&lt;/p&gt;

&lt;h4&gt;
  
  
  Variables de Tema &lt;em&gt;(Theme Variables)&lt;/em&gt;
&lt;/h4&gt;

&lt;p&gt;Las variables que no son componentes deben escribirse en &lt;em&gt;camelCase&lt;/em&gt;. Para uso compartido, deben crearse en un archivo &lt;code&gt;theme.css&lt;/code&gt;.&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="nd"&gt;:root&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="py"&gt;--fontSize&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;16px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--fontFamily&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;sans-serif&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--lineHeight&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;1.4&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="py"&gt;--spaceSmall&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--spaceMedium&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;15px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="py"&gt;--spaceLarge&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;20px&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;h2&gt;
  
  
  Title CSS
&lt;/h2&gt;

&lt;p&gt;Title CSS nace con una premisa que se puede resumir en: BEM es útil, pero tiene nombres largos. Resumamoslo.&lt;/p&gt;

&lt;p&gt;Para ello define tres conceptos: &lt;code&gt;Title&lt;/code&gt; (lo mantendremos en ingles, puesto que le da el nombre a la convención), descendientes y modificadores.&lt;/p&gt;

&lt;h3&gt;
  
  
  Title
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Sintaxis&lt;/strong&gt;: &lt;code&gt;&amp;lt;TitleName&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Los titles (o títulos) son lo que en BEM conocemos como bloques. Deben ser descritos en &lt;em&gt;PascalCase&lt;/em&gt;&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="nc"&gt;.Title&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="c"&gt;/* ... */&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Modificadores
&lt;/h3&gt;

&lt;p&gt;Los modificadores, al igual que en BEM, son clases que modifican el estilo de un componente o descendiente. Deben ser descritos en &lt;em&gt;camelCase&lt;/em&gt;. De ser necesario que el modificador solo afecte a cierto tipo de componente o descendiente, simplemente se anida como se hace nativamente en CSS.&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="nc"&gt;.Title&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="c"&gt;/* ... */&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="nc"&gt;.Title.isModified&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="c"&gt;/* ... */&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Descendientes
&lt;/h3&gt;

&lt;p&gt;Los descendientes como su nombre lo dice son hijos de un Title, y por tanto dependen de este. Deben ser descritos en &lt;em&gt;camelCase&lt;/em&gt; y anidados en CSS.&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="nc"&gt;.Title&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="c"&gt;/* ... */&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="nc"&gt;.Title&lt;/span&gt; &lt;span class="nc"&gt;.descendant&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="c"&gt;/* ... */&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Problemas y soluciones
&lt;/h3&gt;

&lt;p&gt;Dos problemas que se nos vienen a la mente al usar esta metodología es: ¿Como distingo una modificación de un descendiente? y ¿Que pasa si tengo un modificador o descendiente anidado con el mismo nombre?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. ¿Como distingo una modificación de un descendiente?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;La respuesta es simple: Por el nombre que escojas. Esta metodología nos fuerza a escoger buenos nombres. Es fácil identificar cual es el modificador y cual es el descendiente entre estas dos opciones: &lt;code&gt;.isDark&lt;/code&gt; y &lt;code&gt;.title&lt;/code&gt;. El nombre debe ser descriptivo y no dar lugar a dudas.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. ¿Que pasa si tengo un modificador o descendiente anidado con el mismo nombre?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Un ejemplo respecto a este problema es el siguiente HTML.&lt;br&gt;
&lt;/p&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;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"Container"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;header&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"header"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/header&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;main&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"body"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;section&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"Title"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"header"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"body"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/section&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;section&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"Title"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"header"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"body"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/section&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/main&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pareciera que hay colisiones de nombre, pero si usamos CSS de la forma natural nos encontraríamos con algo como esto:&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="nc"&gt;.Container&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
    &lt;span class="nc"&gt;.Container&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;.header&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
    &lt;span class="nc"&gt;.Container&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;.body&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Por tanto &lt;code&gt;.header&lt;/code&gt; y &lt;code&gt;.body&lt;/code&gt; solo afectarían al descendiente directo y por tanto, ya no tenemos colisiones de nombre.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusiones
&lt;/h2&gt;

&lt;p&gt;Estas tres convenciones de nombre nos ayudan a tener un mayor dominio de nuestro código. Algunos de los beneficios que podemos encontrar en estas notaciones son:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Facilita la distinción de componentes, elementos y modificadores de forma clara (posiblemente, Title CSS un poco menos que otros).&lt;/li&gt;
&lt;li&gt;Mantiene baja la especificidad de los selectores (Nuevamente, Title CSS un poco menos que otros).&lt;/li&gt;
&lt;li&gt;Ayuda a desacoplar la semántica de presentación de la semántica de documentos (al hacer uso de clases con nombres coherentes y explicativos).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;BEM tiene sus beneficios, y a mi parecer, es la mas conocida de todas. Si bien no describe el uso de &lt;code&gt;utility classes&lt;/code&gt; se puede hacer uso de estas con ayuda de un prefijo &lt;code&gt;u-&lt;/code&gt; o como yo lo prefiero, con dos guiones &lt;code&gt;--&lt;/code&gt;&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="nt"&gt;--float-left&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;float&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;left&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;Sin embargo, aun cuando el uso de PascalCase o camelCase me &lt;em&gt;choco&lt;/em&gt; en un primer momento. Me decanto por SUIT CSS, es a mi parecer la mas completa, y si bien estoy totalmente de acuerdo con Title CSS respecto a lo "molesto" que puede ser clases tan extensas, creo que lo vale. Sobre todo si tienes un editor de código bien configurado que te auto completa, es una maravilla escribir &lt;code&gt;Card--&lt;/code&gt; y ver todas los modificadores que tiene Card.&lt;/p&gt;

&lt;p&gt;Por lo demás es decision de cada equipo definir que notación usar, ya sea alguna de estas, alguna otra o una definida por el mismo equipo. Siempre y cuando se sea consistente, todo irá bien.&lt;/p&gt;

&lt;h2&gt;
  
  
  Referencias
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://getbem.com/naming/"&gt;BEM Naming&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/suitcss/suit/blob/master/doc/naming-conventions.md#u-utilityname"&gt;SUIT CSS Naming&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/cuth/Title-CSS"&gt;Title CSS&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>css</category>
      <category>cleancode</category>
      <category>webdev</category>
      <category>frontend</category>
    </item>
  </channel>
</rss>
