====== 14. Sistema de diseño: Globales ======
Los modificadores globales (prefijo ''g--'') son clases que se pueden usar con cualquier componente y que solo cambian una cosa usando los tokens de sistema.
===== Utility Clases =====
Hemos visto como crear las variables para dejar de usar números en nuestras clases CSS pero actualmente para personalizar un componentes se usas unas clases llamadas //Utility clases//.
Veamos un ejemplo
¿Pero que pasa si queremos que un botón en concreto tenga un tamaño mayor? Deberemos añadir ''style''
El problema de usar ésto es doble:
* Es tedioso de escribir.
* NO permite valores responsivos.
Para evitar eso se han creado las //Utility clases//.
Estas clases tienen el código CSS que habíamos puesto en ''style''
.g--font-size-5 {
font-size:var(--mlt-sys-font-size-5) !important;
}
.g--padding-4 {
padding:var(--mlt-sys-padding-4) !important;
}
A estas clases //pequeñas// que solo hacen una única cosa se le llaman //Utility clases// y combinándolas se puede tener mucha versatilidad.
Sin embargo su uso debe ser usado sin excesos.
El framework CSS [[https://tailwindcss.com/|Tailwind CSS]] es un framework que solo usa //Utility clases//.
Por otro lado [[https://getbootstrap.com/|Bootstrap]] que está orientado a componentes también ha incorporado //Utility clases// en
[[https://getbootstrap.com/docs/5.3/utilities/api/|Utility API]] y un ejemplo es [[https://getbootstrap.com/docs/5.3/utilities/spacing/|Spacing]]
El uso de utility clases nos lleva a tener lo siguiente:
.g--font-size-1 {
font-size: var(--mlt-sys-font-size-1) !important;
}
.g--font-size-2 {
font-size: var(--mlt-sys-font-size-2) !important;
}
/* ... hasta .g--font-size-11 */
.g--margin-0 {
margin: var(--mlt-sys-margin-0) !important;
}
/* ... hasta .g--margin-10 */
.g--margin-horizontal-0 {
margin-left: var(--mlt-sys-margin-0) !important;
margin-right: var(--mlt-sys-margin-0) !important;
}
.g--margin-vertical-0 {
margin-top: var(--mlt-sys-margin-0) !important;
margin-bottom: var(--mlt-sys-margin-0) !important;
}
/* ... hasta .g--margin-horizontal-10 y .g--margin-vertical-10 */
.g--margin-top-0 {
margin-top: var(--mlt-sys-margin-0) !important;
}
/* ... y lo mismo con bottom, right y left, hasta el 10 */
/* Y las mismas clases con padding: .g--padding-0 ... .g--padding-left-10 */
Y muchas más clases CSS faltarían aun.
===== Mejorando los globales con SASS =====
Las clases ''g--'' son todas iguales cambiando el número, así que se generan con bucles en vez de escribirlas a mano. Además así no hay erratas al copiar y pegar números.
@use "sass:list";
$font-sizes: (10px, 12px, 14px, 16px, 18px, 20px, 22px, 24px, 26px, 28px, 30px);
$margins: (0px, 4px, 8px, 12px, 16px, 20px, 24px, 28px, 32px, 36px, 40px);
@for $i from 1 through list.length($font-sizes) {
.g--font-size-#{$i} {
font-size: var(--mlt-sys-font-size-#{$i}) !important;
}
}
@for $i from 0 through list.length($margins) - 1 {
.g--margin-#{$i} {
margin: var(--mlt-sys-margin-#{$i}) !important;
}
.g--margin-horizontal-#{$i} {
margin-left: var(--mlt-sys-margin-#{$i}) !important;
margin-right: var(--mlt-sys-margin-#{$i}) !important;
}
.g--margin-vertical-#{$i} {
margin-top: var(--mlt-sys-margin-#{$i}) !important;
margin-bottom: var(--mlt-sys-margin-#{$i}) !important;
}
@each $lado in (top, bottom, left, right) {
.g--margin-#{$lado}-#{$i} {
margin-#{$lado}: var(--mlt-sys-margin-#{$i}) !important;
}
}
}
* ''@for $i from 1 through'': Los tamaños de fuente empiezan en 1.
* ''@for $i from 0 through list.length($margins) - 1'': Los márgenes empiezan en 0 (el token ''--mlt-sys-margin-0''), así que se llega hasta la longitud menos uno.
* ''@each $lado in (top, bottom, left, right)'': Genera las cuatro clases de cada lado con el mismo código.
Los paddings se generan igual que los márgenes.
===== Globales responsivos =====
Pasemos ahora a ver como poder hacer las cosas responsivas con una simple arquitectura.
Las clases base ''g--font-size-N'' son las del apartado anterior. Para cada breakpoint se crea la misma clase con un sufijo, dentro de su media query:
@media (min-width: 576px) {
.g--font-size-1\@tablet {
font-size: var(--mlt-sys-font-size-1) !important;
}
.g--font-size-2\@tablet {
font-size: var(--mlt-sys-font-size-2) !important;
}
/* ... igual hasta .g--font-size-11\@tablet */
}
@media (min-width: 768px) {
.g--font-size-1\@desktop {
font-size: var(--mlt-sys-font-size-1) !important;
}
/* ... igual hasta .g--font-size-11\@desktop */
}
@media (min-width: 992px) {
.g--font-size-1\@fulldesktop {
font-size: var(--mlt-sys-font-size-1) !important;
}
/* ... igual hasta .g--font-size-11\@fulldesktop */
}
Hola mundo
En el ejemplo, por defecto el tamaño de la fuente será ''--mlt-sys-font-size-4'' (16px), pero en resoluciones mayores de 992px será ''--mlt-sys-font-size-8'' (24px).
Las clases responsivas también llevan ''!important'' y van **después** de las clases base. Como la base ya tiene ''!important'', si no lo llevan o van antes, gana siempre la base y la clase ''@fulldesktop'' no hace nada.
Lo que hacemos es crear todas los modificadores globales o modificadores de bloques para las distintas resoluciones pero añadiendo el sufijo ''@tablet'' , ''@desktop'' o ''@fulldesktop''. E indicando en el HTML que tamaño usar según la resolución de la pantalla.
Otro ejemplo de ello lo podemos ver en [[https://www.webstoemp.com/blog/notes-on-using-css-grid-in-production/|Notes on using CSS Grid in production]]
También Bootstrap permite clases responsivas: [[https://getbootstrap.com/docs/5.3/utilities/api/#responsive|Utility API]] indicando ''responsive: true''.
==== Mejorando los globales responsivos con SASS ====
Las clases ''@tablet'', ''@desktop'' y ''@fulldesktop'' son las mismas en cada media query, así que se generan con un mapa de breakpoints:
@use "sass:list";
$font-sizes: (10px, 12px, 14px, 16px, 18px, 20px, 22px, 24px, 26px, 28px, 30px);
$breakpoints: (
'tablet': 576px,
'desktop': 768px,
'fulldesktop': 992px
);
@each $nombre, $ancho in $breakpoints {
@media (min-width: $ancho) {
@for $i from 1 through list.length($font-sizes) {
.g--font-size-#{$i}\@#{$nombre} {
font-size: var(--mlt-sys-font-size-#{$i}) !important;
}
}
}
}
* Las clases base ''g--font-size-N'' ya se generan en «Mejorando los globales con SASS»; aquí solo las de cada breakpoint, que tienen que ir después.
* ''$breakpoints'': Cada breakpoint con su ancho mínimo. Para añadir uno nuevo basta con añadirlo al mapa.
* ''\@'': La ''@'' se escapa en el nombre de la clase, igual que en el CSS.
==== Resumen técnicas responsivas ====
En el tema [[clase:daw:diw:css-responsivo|CSS: Responsivo]] vimos varias formas de hacer las cosas responsivas; junto con los globales responsivos, son estas 4:
^ ^ Interno ^ Externo ^
^ Fluido | El propio componente decide como se hace responsivo y lo hace de forma fluida al tamaño del dispositivo. | El que usa el componente decide como se hace responsivo y lo hace de forma fluida al tamaño del dispositivo. |
^ Escalonado | El propio componente decide como se hace responsivo y lo hace solo para diversos tamaños de pantalla | El que usa el componente decide como se hace responsivo y lo hace solo para diversos tamaños de pantalla |
El tipo **Externo/Escalonado** es el mas normal y es el que usan frameworks como Tailwind o Bootstrap.
* Interno/Fluido: unidades ''vw'' o ''clamp()'' en el propio componente, o las tablas con scroll.
.titulo {
font-size: 10vw
}
Hola mundo
* Interno/Escalonado: Se usa en un menú responsivo con hamburguesa.
.titulo {
font-size: 40px;
}
@media (min-width: 768px) {
.titulo {
font-size: 55px;
}
}
Hola mundo
* Externo/Fluido: Se usa muy poco. Por ejemplo, con modificadores globales de ancho como los del ejercicio 5:
Author
Title
Year
ISBN-13
ISBN-10
* Externo/Escalonado: Es el que usamos con ''@tablet'' o ''@desktop'' , etc.
Hola mundo
===== Ejercicios =====
==== Ejercicio 1 ====
Usando el mapa ''$colores'' de los tokens de sistema, genera las clases globales de color de texto, fondo y borde para todos los colores y tonos:
.g--color-principal-1 {
color: var(--mlt-sys-color-principal-1) !important;
}
.g--background-color-principal-1 {
background-color: var(--mlt-sys-color-principal-1) !important;
}
.g--border-color-principal-1 {
border-color: var(--mlt-sys-color-principal-1) !important;
}
...
.g--border-color-amarillo-9 {
border-color: var(--mlt-sys-color-amarillo-9) !important;
}
==== Ejercicio 2 ====
Genera todas las clases globales de padding igual que las de margin del apartado «Mejorando los globales con SASS»: ''g--padding-N'', ''g--padding-horizontal-N'', ''g--padding-vertical-N'' y ''g--padding-top-N'', ''-bottom-'', ''-left-'' y ''-right-'', de 0 a 10.
==== Ejercicio 3 ====
Genera las clases globales de las fuentes a partir del mapa ''$fuentes'' del [[clase:daw:diw:sistema-diseno-tokens#ejercicio_2|ejercicio 2 de Sistema de diseño: Tokens]]:
.g--font-sans-serif {
font-family: var(--mlt-sys-font-sans-serif) !important;
}
.g--font-serif {
font-family: var(--mlt-sys-font-serif) !important;
}
.g--font-monospace {
font-family: var(--mlt-sys-font-monospace) !important;
}
==== Ejercicio 4 ====
Crea las siguientes clases css:
.g--bg-color-red {
background-color:#FF0000 !important;
}
.g--bg-color-green {
background-color:#00FF00 !important;
}
.g--bg-color-blue {
background-color:#0000FF !important;
}
.g--bg-color-orange {
background-color:#FFA500 !important;
}
Y modifícalas con el sufijo ''@tablet'', ''@desktop'' y ''@fulldesktop'' y repite el [[clase:daw:diw:css-responsivo#ejercicio_6|ejercicio 6 del tema CSS: Responsivo]] pero en vez de usar la clase ''.color-fondo-responsivo'' uses las clases que acabas de crear
==== Ejercicio 5 ====
Crea modificadores globales para las siguientes propiedades CSS:
* ''width''
* ''min-width''
* ''max-width''
Los posibles valores de cada uno de ellos serán: 100px, 150px , 200px, 250px, 300px, 350px, 400px, 450px, 500px, 550px, 600px
Crea también otro modificador global para ''overflow: auto;''
Crea una clase BEM para tablas HTML de forma que:
* La tabla tendrá alrededor un borde y un sombreado
* Las cabeceras de la tabla serán de otro color.
Con todo los anterior, haz una página HTML con una tabla en la que:
* Haya columnas que tengan un ancho mínimo y otro máximo
* Haya columnas que tengan un ancho fijo
* Haya una columna que tengan un ancho mínimo
* Que si la tabla no cabe, aparezcan las barras de scroll.
==== Ejercicio 6 ====
Modifica el ejercicio anterior de forma que ahora los modificadores globales se puedan usar de forma responsiva con
* @tablet
* @desktop
* @fulldesktop
Modifica el ejemplo de la tabla HTML de forma que las columnas ahora tengan siempre tamaños fijos (es decir no usar min o max), pero que cambien según la resolución de la pantalla.
==== Ejercicio 7 ====
Haz que las clases de BEM y los modificadores globales que has ido usando durante el curso se puedan usar de forma responsiva con:
* @tablet
* @desktop
* @fulldesktop