clase:daw:diw:sistema-diseno-tokens
Diferencias
Muestra las diferencias entre dos versiones de la página.
| Ambos lados, revisión anteriorRevisión previaPróxima revisión | Revisión previa | ||
| clase:daw:diw:sistema-diseno-tokens [2026/10/23 23:07] – Medios movidos de 1eval/2eval a clase:daw:diw claude | clase:daw:diw:sistema-diseno-tokens [2026/10/24 01:11] (actual) – Ejercicios 1 y 2 nuevos: paddings y márgenes calculados con @for y oscurecimiento al pulsar el botón claude | ||
|---|---|---|---|
| Línea 2: | Línea 2: | ||
| En el tema de BEM los componentes tenían los valores puestos directamente. En este tema vamos a hacer bien un componente usando **tokens**, que es lo mismo que hace Angular Material pero hecho por nosotros: | En el tema de BEM los componentes tenían los valores puestos directamente. En este tema vamos a hacer bien un componente usando **tokens**, que es lo mismo que hace Angular Material pero hecho por nosotros: | ||
| * **Tokens de sistema**: Variables CSS globales que usan todos los componentes. En nuestro sistema empiezan por '' | * **Tokens de sistema**: Variables CSS globales que usan todos los componentes. En nuestro sistema empiezan por '' | ||
| - | * **Tokens de diseño**: Variables CSS públicas de cada componente, por ejemplo '' | + | * **Tokens de diseño**: Variables CSS públicas de cada componente, por ejemplo '' |
| + | |||
| + | Además, cada componente tiene un **estado privado**: variables que no son tokens sino CSS que necesita el componente para funcionar y que no le interesan al diseñador. | ||
| ===== Números mágicos ===== | ===== Números mágicos ===== | ||
| Línea 185: | Línea 187: | ||
| --mlt-sys-width-10: | --mlt-sys-width-10: | ||
| --mlt-sys-width-11: | --mlt-sys-width-11: | ||
| + | |||
| + | --mlt-sys-oscurecimiento-0: | ||
| + | --mlt-sys-oscurecimiento-1: | ||
| + | --mlt-sys-oscurecimiento-2: | ||
| + | --mlt-sys-oscurecimiento-3: | ||
| + | --mlt-sys-oscurecimiento-4: | ||
| + | --mlt-sys-oscurecimiento-5: | ||
| + | --mlt-sys-oscurecimiento-6: | ||
| } | } | ||
| </ | </ | ||
| Línea 221: | Línea 231: | ||
| ===== Tokens de diseño ===== | ===== Tokens de diseño ===== | ||
| - | Pero aun se tiene que mejorar la legibilidad del código . En vez de usar directamente | + | Pero aun se tiene que mejorar la legibilidad del código. En vez de usar directamente |
| - | + | <sxh css; highlight: [2-19]> | |
| - | + | ||
| - | <sxh css; highlight: [2-15]> | + | |
| .c-boton { | .c-boton { | ||
| - | /* Parte pública | + | /* Tokens de diseño: decisiones |
| - | --boton-color-strong: | + | --boton-color-normal: var(--mlt-sys-color-principal-5); |
| - | --boton-color-weak: | + | --boton-color-alternativa: var(--mlt-sys-color-alternativo-5); |
| - | + | --boton-color-peligrosa: var(--mlt-sys-color-rojo-5); | |
| - | --boton-background-color:var(--boton-color-strong); | + | --boton-color-texto-primaria: var(--mlt-sys-color-blanco-9); |
| - | --boton-border-color: | + | |
| - | --boton-text-color: var(--boton-color-weak); | + | |
| --boton-font-family: | --boton-font-family: | ||
| --boton-font-size: | --boton-font-size: | ||
| - | |||
| --boton-padding: | --boton-padding: | ||
| - | --boton-width: | + | --boton-border-width: var(--mlt-sys-width-1); |
| - | --boton-border-radius: | + | --boton-border-radius: |
| + | /* Estado privado: por defecto, normal y primaria */ | ||
| + | --boton-privateState-color: | ||
| + | --boton-privateState-background-color: | ||
| + | --boton-privateState-border-color: | ||
| + | --boton-privateState-text-color: | ||
| - | /* Parte privada del componente | + | /* Propiedades CSS: solo usan el estado y los tokens |
| font-family: | font-family: | ||
| font-size: var(--boton-font-size); | font-size: var(--boton-font-size); | ||
| Línea 249: | Línea 260: | ||
| border-radius: | border-radius: | ||
| - | border-width: | + | border-width: |
| border-style: | border-style: | ||
| Línea 256: | Línea 267: | ||
| text-decoration: | text-decoration: | ||
| + | border-color: | ||
| + | background-color: | ||
| + | color: var(--boton-privateState-text-color); | ||
| + | } | ||
| - | border-color: var(--boton-border-color); | + | /* La función elige qué token de color se usa */ |
| - | | + | .c-boton--funcion-normal { |
| - | color: var(--boton-text-color); | + | --boton-privateState-color: var(--boton-color-normal); |
| + | } | ||
| + | .c-boton--funcion-alternativa { | ||
| + | | ||
| + | } | ||
| + | .c-boton--funcion-peligrosa { | ||
| + | | ||
| + | } | ||
| + | /* La importancia decide dónde va el color: fondo, borde o texto */ | ||
| + | .c-boton--importancia-primaria { | ||
| + | --boton-privateState-background-color: | ||
| + | --boton-privateState-border-color: | ||
| + | --boton-privateState-text-color: | ||
| } | } | ||
| + | .c-boton--importancia-secundaria { | ||
| + | --boton-privateState-background-color: | ||
| + | --boton-privateState-border-color: | ||
| + | --boton-privateState-text-color: | ||
| + | } | ||
| + | .c-boton--importancia-terciaria { | ||
| + | --boton-privateState-background-color: | ||
| + | --boton-privateState-border-color: | ||
| + | --boton-privateState-text-color: | ||
| + | } | ||
| + | </ | ||
| + | <sxh html> | ||
| + | <button class=" | ||
| + | </ | ||
| - | .c-boton--funcion-normal | + | Dentro del botón hay dos tipos de variables: |
| - | --boton-color-strong: | + | * **Tokens de diseño** ('' |
| + | * **Estado privado** ('' | ||
| + | |||
| + | Para saber si una variable es un token o es estado: si su valor depende del modificador que lleve el botón, es estado. '' | ||
| + | |||
| + | Por eso **los modificadores solo cambian el estado, nunca los tokens**: | ||
| + | * **Función**: | ||
| + | * **Importancia**: | ||
| + | |||
| + | '' | ||
| + | |||
| + | ^ ^ Token de diseño ^ Estado privado ^ | ||
| + | ^ Qué guarda | Una decisión del diseñador | Cómo está el botón ahora | | ||
| + | ^ Nombre | '' | ||
| + | ^ Su valor | Uno solo, por defecto un token de sistema | Depende de los modificadores | | ||
| + | ^ Quién lo cambia | El diseñador o quien personaliza el botón | Solo los modificadores del botón | | ||
| + | ^ Ejemplo | '' | ||
| + | |||
| + | <note important> | ||
| + | Para que los botones peligrosos sean de otro rojo se cambia el token '' | ||
| + | </ | ||
| + | |||
| + | < | ||
| + | Los nombres de las variables CSS distinguen mayúsculas de minúsculas: | ||
| + | </ | ||
| + | |||
| + | ===== Añadiendo el tamaño ===== | ||
| + | Ahora necesitamos botones de tres tamaños, con los modificadores '' | ||
| + | |||
| + | <sxh css; highlight: [9-14, 19, 24-25, 29-30, 73-85]> | ||
| + | .c-boton | ||
| + | /* Tokens de diseño: decisiones del diseñador, un valor cada uno */ | ||
| + | --boton-color-normal: var(--mlt-sys-color-principal-5); | ||
| + | --boton-color-alternativa: | ||
| + | --boton-color-peligrosa: | ||
| + | --boton-color-texto-primaria: | ||
| + | |||
| + | --boton-font-family: | ||
| + | --boton-font-size-s: | ||
| + | --boton-font-size-m: | ||
| + | --boton-font-size-l: | ||
| + | --boton-padding-s: | ||
| + | --boton-padding-m: | ||
| + | --boton-padding-l: | ||
| + | --boton-border-width: | ||
| + | --boton-border-radius: | ||
| + | |||
| + | |||
| + | /* Estado privado: por defecto, normal, primaria y tamaño m */ | ||
| + | --boton-privateState-color: | ||
| + | --boton-privateState-background-color: | ||
| + | --boton-privateState-border-color: | ||
| + | --boton-privateState-text-color: | ||
| + | --boton-privateState-font-size: | ||
| + | --boton-privateState-padding: | ||
| + | |||
| + | /* Propiedades CSS: solo usan el estado y los tokens */ | ||
| + | font-family: | ||
| + | font-size: var(--boton-privateState-font-size); | ||
| + | padding: var(--boton-privateState-padding); | ||
| + | |||
| + | border-radius: | ||
| + | border-width: | ||
| + | border-style: | ||
| + | |||
| + | display: inline-block; | ||
| + | cursor: pointer; | ||
| + | text-decoration: | ||
| + | |||
| + | border-color: | ||
| + | background-color: | ||
| + | color: var(--boton-privateState-text-color); | ||
| } | } | ||
| + | /* La función elige qué token de color se usa */ | ||
| + | .c-boton--funcion-normal { | ||
| + | --boton-privateState-color: | ||
| + | } | ||
| .c-boton--funcion-alternativa { | .c-boton--funcion-alternativa { | ||
| - | --boton-color-strong: var(--mlt-sys-color-alternativo-5); | + | --boton-privateState-color: var(--boton-color-alternativa); |
| + | } | ||
| + | .c-boton--funcion-peligrosa { | ||
| + | --boton-privateState-color: var(--boton-color-peligrosa); | ||
| } | } | ||
| + | /* La importancia decide dónde va el color: fondo, borde o texto */ | ||
| + | .c-boton--importancia-primaria { | ||
| + | --boton-privateState-background-color: | ||
| + | --boton-privateState-border-color: | ||
| + | --boton-privateState-text-color: | ||
| + | } | ||
| + | .c-boton--importancia-secundaria { | ||
| + | --boton-privateState-background-color: | ||
| + | --boton-privateState-border-color: | ||
| + | --boton-privateState-text-color: | ||
| + | } | ||
| + | .c-boton--importancia-terciaria { | ||
| + | --boton-privateState-background-color: | ||
| + | --boton-privateState-border-color: | ||
| + | --boton-privateState-text-color: | ||
| + | } | ||
| + | |||
| + | /* El tamaño elige qué tokens de font-size y padding se usan */ | ||
| + | .c-boton--size-s { | ||
| + | --boton-privateState-font-size: | ||
| + | --boton-privateState-padding: | ||
| + | } | ||
| + | .c-boton--size-m { | ||
| + | --boton-privateState-font-size: | ||
| + | --boton-privateState-padding: | ||
| + | } | ||
| + | .c-boton--size-l { | ||
| + | --boton-privateState-font-size: | ||
| + | --boton-privateState-padding: | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | <sxh html> | ||
| + | <button class=" | ||
| + | <button class=" | ||
| + | <button class=" | ||
| + | </ | ||
| + | |||
| + | Lo que ha cambiado: | ||
| + | * **Tokens de diseño**: '' | ||
| + | * **Estado privado**: '' | ||
| + | * **Propiedades CSS**: '' | ||
| + | * **Modificador '' | ||
| + | |||
| + | El tamaño no toca las variables de la función ni de la importancia, | ||
| + | |||
| + | <note important> | ||
| + | Si en '' | ||
| + | </ | ||
| + | |||
| + | ===== Padding vertical y horizontal ===== | ||
| + | El último extra: el padding vertical y el horizontal no tienen por qué ser iguales. Un botón queda mejor con más padding a los lados que arriba y abajo, así que cada tamaño necesita dos paddings. Otra vez el botón crece: más tokens de diseño y más estado privado, pero ningún modificador nuevo. Lo nuevo está resaltado: | ||
| + | |||
| + | <sxh css; highlight: [12-17, 28-29, 34, 80-81, 85-86, 90-91]> | ||
| + | .c-boton { | ||
| + | /* Tokens de diseño: decisiones del diseñador, un valor cada uno */ | ||
| + | --boton-color-normal: | ||
| + | --boton-color-alternativa: | ||
| + | --boton-color-peligrosa: | ||
| + | --boton-color-texto-primaria: | ||
| + | |||
| + | --boton-font-family: | ||
| + | --boton-font-size-s: | ||
| + | --boton-font-size-m: | ||
| + | --boton-font-size-l: | ||
| + | --boton-padding-vertical-s: | ||
| + | --boton-padding-vertical-m: | ||
| + | --boton-padding-vertical-l: | ||
| + | --boton-padding-horizontal-s: | ||
| + | --boton-padding-horizontal-m: | ||
| + | --boton-padding-horizontal-l: | ||
| + | --boton-border-width: | ||
| + | --boton-border-radius: | ||
| + | |||
| + | |||
| + | /* Estado privado: por defecto, normal, primaria y tamaño m */ | ||
| + | --boton-privateState-color: | ||
| + | --boton-privateState-background-color: | ||
| + | --boton-privateState-border-color: | ||
| + | --boton-privateState-text-color: | ||
| + | --boton-privateState-font-size: | ||
| + | --boton-privateState-padding-vertical: | ||
| + | --boton-privateState-padding-horizontal: | ||
| + | |||
| + | /* Propiedades CSS: solo usan el estado y los tokens */ | ||
| + | font-family: | ||
| + | font-size: var(--boton-privateState-font-size); | ||
| + | padding: var(--boton-privateState-padding-vertical) var(--boton-privateState-padding-horizontal); | ||
| + | |||
| + | border-radius: | ||
| + | border-width: | ||
| + | border-style: | ||
| + | |||
| + | display: inline-block; | ||
| + | cursor: pointer; | ||
| + | text-decoration: | ||
| + | |||
| + | border-color: | ||
| + | background-color: | ||
| + | color: var(--boton-privateState-text-color); | ||
| + | } | ||
| + | |||
| + | /* La función elige qué token de color se usa */ | ||
| + | .c-boton--funcion-normal { | ||
| + | --boton-privateState-color: | ||
| + | } | ||
| + | .c-boton--funcion-alternativa { | ||
| + | --boton-privateState-color: | ||
| + | } | ||
| .c-boton--funcion-peligrosa { | .c-boton--funcion-peligrosa { | ||
| - | --boton-color-strong: var(--mlt-sys-color-rojo-5); | + | --boton-privateState-color: var(--boton-color-peligrosa); |
| } | } | ||
| + | /* La importancia decide dónde va el color: fondo, borde o texto */ | ||
| .c-boton--importancia-primaria { | .c-boton--importancia-primaria { | ||
| - | --boton-background-color: | + | --boton-privateState-background-color: |
| - | --boton-border-color: | + | --boton-privateState-border-color: |
| - | --boton-text-color: | + | --boton-privateState-text-color: |
| } | } | ||
| .c-boton--importancia-secundaria { | .c-boton--importancia-secundaria { | ||
| - | --boton-background-color: | + | --boton-privateState-background-color: |
| - | --boton-border-color: | + | --boton-privateState-border-color: |
| - | --boton-text-color: | + | --boton-privateState-text-color: |
| } | } | ||
| .c-boton--importancia-terciaria { | .c-boton--importancia-terciaria { | ||
| - | --boton-background-color: | + | --boton-privateState-background-color: |
| - | --boton-border-color: | + | --boton-privateState-border-color: |
| - | --boton-text-color: | + | --boton-privateState-text-color: |
| } | } | ||
| + | /* El tamaño elige qué tokens de font-size y padding se usan */ | ||
| + | .c-boton--size-s { | ||
| + | --boton-privateState-font-size: | ||
| + | --boton-privateState-padding-vertical: | ||
| + | --boton-privateState-padding-horizontal: | ||
| + | } | ||
| + | .c-boton--size-m { | ||
| + | --boton-privateState-font-size: | ||
| + | --boton-privateState-padding-vertical: | ||
| + | --boton-privateState-padding-horizontal: | ||
| + | } | ||
| + | .c-boton--size-l { | ||
| + | --boton-privateState-font-size: | ||
| + | --boton-privateState-padding-vertical: | ||
| + | --boton-privateState-padding-horizontal: | ||
| + | } | ||
| + | </ | ||
| + | Lo que ha cambiado: | ||
| + | * **Tokens de diseño**: Cada '' | ||
| + | * **Estado privado**: '' | ||
| + | * **Propiedades CSS**: '' | ||
| + | * **Modificadores '' | ||
| + | El HTML no cambia: los botones se siguen usando igual que antes. Eso es lo bueno de separar tokens, estado y propiedades: | ||
| + | |||
| + | ===== Oscurecer al pasar el ratón ===== | ||
| + | Ahora, al pasar el ratón por encima, el color del botón se tiene que oscurecer un poco. Para oscurecer un color se mezcla con negro usando '' | ||
| + | |||
| + | <sxh css> | ||
| + | color-mix(in oklab, var(--boton-privateState-color), | ||
| </ | </ | ||
| + | Esta vez no basta con añadir tokens de diseño y estado privado: también hacen falta **tokens de sistema nuevos**. Para el tamaño y el padding ya había valores en el sistema, pero no hay ningún oscurecimiento, | ||
| - | La variable '' | + | <sxh css> |
| + | :root { | ||
| + | | ||
| + | --mlt-sys-oscurecimiento-1: | ||
| + | --mlt-sys-oscurecimiento-2: | ||
| + | --mlt-sys-oscurecimiento-3: | ||
| + | --mlt-sys-oscurecimiento-4: | ||
| + | --mlt-sys-oscurecimiento-5: | ||
| + | --mlt-sys-oscurecimiento-6: | ||
| + | } | ||
| + | </ | ||
| - | La variable | + | En el botón hay que pensar qué es token y qué es estado: |
| + | * **Token de diseño** | ||
| + | * **Estado privado** '' | ||
| + | * **Estado privado** '' | ||
| + | * **''< | ||
| - | Por otro lado, las variables '' | + | Lo nuevo está resaltado: |
| - | Estas variables se van a modificar según la importancia del botón (primaria, secundaria y terciaria) | + | |
| - | Es decir que dentro del componente creamos una serie de variables **publicas** que se puede modificar fácilmente por cualquiera y luego en las propiedades CSS se usan esas variable públicas. De esa forma cambiar el componente no afecta a la parte **pública** del componente. | + | <sxh css; highlight: [20, 23, 25-28, 65-66, 71-72, 77, 97-100]> |
| + | .c-boton { | ||
| + | /* Tokens de diseño: decisiones del diseñador, un valor cada uno */ | ||
| + | --boton-color-normal: | ||
| + | --boton-color-alternativa: | ||
| + | --boton-color-peligrosa: | ||
| + | --boton-color-texto-primaria: | ||
| - | Esas variables públicas son los **tokens de diseño** del componente. Su valor por defecto siempre | + | --boton-font-family: |
| + | --boton-font-size-s: | ||
| + | --boton-font-size-m: | ||
| + | --boton-font-size-l: | ||
| + | --boton-padding-vertical-s: | ||
| + | --boton-padding-vertical-m: | ||
| + | --boton-padding-vertical-l: | ||
| + | --boton-padding-horizontal-s: | ||
| + | --boton-padding-horizontal-m: | ||
| + | --boton-padding-horizontal-l: | ||
| + | --boton-border-width: | ||
| + | --boton-border-radius: | ||
| + | --boton-hover-oscurecimiento: | ||
| + | |||
| + | |||
| + | /* Estado privado: por defecto, normal, primaria, tamaño m y sin hover */ | ||
| + | --boton-privateState-color: | ||
| + | --boton-privateState-oscurecimiento: | ||
| + | --boton-privateState-color-final: | ||
| + | --boton-privateState-background-color: | ||
| + | --boton-privateState-border-color: | ||
| + | --boton-privateState-text-color: | ||
| + | --boton-privateState-font-size: | ||
| + | --boton-privateState-padding-vertical: | ||
| + | --boton-privateState-padding-horizontal: | ||
| + | |||
| + | /* Propiedades CSS: solo usan el estado y los tokens | ||
| + | font-family: | ||
| + | font-size: var(--boton-privateState-font-size); | ||
| + | padding: var(--boton-privateState-padding-vertical) var(--boton-privateState-padding-horizontal); | ||
| + | |||
| + | border-radius: | ||
| + | border-width: | ||
| + | border-style: | ||
| + | |||
| + | display: inline-block; | ||
| + | cursor: pointer; | ||
| + | text-decoration: | ||
| + | |||
| + | border-color: | ||
| + | background-color: | ||
| + | color: var(--boton-privateState-text-color); | ||
| + | } | ||
| + | |||
| + | /* La función elige qué token de color se usa */ | ||
| + | .c-boton--funcion-normal { | ||
| + | --boton-privateState-color: | ||
| + | } | ||
| + | .c-boton--funcion-alternativa { | ||
| + | --boton-privateState-color: | ||
| + | } | ||
| + | .c-boton--funcion-peligrosa { | ||
| + | --boton-privateState-color: | ||
| + | } | ||
| + | |||
| + | /* La importancia decide dónde va el color: fondo, borde o texto */ | ||
| + | .c-boton--importancia-primaria { | ||
| + | --boton-privateState-background-color: | ||
| + | --boton-privateState-border-color: | ||
| + | --boton-privateState-text-color: | ||
| + | } | ||
| + | .c-boton--importancia-secundaria { | ||
| + | --boton-privateState-background-color: | ||
| + | --boton-privateState-border-color: | ||
| + | --boton-privateState-text-color: | ||
| + | } | ||
| + | .c-boton--importancia-terciaria { | ||
| + | --boton-privateState-background-color: | ||
| + | --boton-privateState-border-color: | ||
| + | --boton-privateState-text-color: | ||
| + | } | ||
| + | |||
| + | /* El tamaño elige qué tokens de font-size y padding se usan */ | ||
| + | .c-boton--size-s { | ||
| + | --boton-privateState-font-size: | ||
| + | --boton-privateState-padding-vertical: | ||
| + | --boton-privateState-padding-horizontal: | ||
| + | } | ||
| + | .c-boton--size-m { | ||
| + | --boton-privateState-font-size: | ||
| + | --boton-privateState-padding-vertical: | ||
| + | --boton-privateState-padding-horizontal: | ||
| + | } | ||
| + | .c-boton--size-l { | ||
| + | --boton-privateState-font-size: | ||
| + | --boton-privateState-padding-vertical: | ||
| + | --boton-privateState-padding-horizontal: | ||
| + | } | ||
| + | |||
| + | /* Al pasar el ratón, el color se oscurece */ | ||
| + | .c-boton: | ||
| + | --boton-privateState-oscurecimiento: | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | El texto blanco de la primaria no se oscurece porque no usa el color final sino el token '' | ||
| + | |||
| + | <note important> | ||
| + | Lo primero que se le ocurre a cualquiera es '' | ||
| + | </ | ||
| ===== Comparación con Angular Material ===== | ===== Comparación con Angular Material ===== | ||
| Línea 314: | Línea 690: | ||
| ^ ^ Angular Material | ^ ^ Angular Material | ||
| ^ Token de sistema | '' | ^ Token de sistema | '' | ||
| - | ^ Token de diseño | '' | + | ^ Token de diseño | '' |
| - | ^ El token de diseño toma el valor de un token de sistema | '' | + | ^ El token de diseño toma el valor de un token de sistema | '' |
| - | ^ Cambiar un componente | mixin '' | + | ^ Cambiar un componente | mixin '' |
| ^ Cambiar todo el sistema | el tema ('' | ^ Cambiar todo el sistema | el tema ('' | ||
| ^ Variantes del componente | '' | ^ Variantes del componente | '' | ||
| Línea 324: | Línea 700: | ||
| ==== Tokens de sistema ==== | ==== Tokens de sistema ==== | ||
| - | Escribir a mano todos los tokens de sistema es largo y es fácil equivocarse. Con SASS se guardan los valores en listas y mapas y los tokens se generan con bucles. Así, para cambiar el sistema solo hay que cambiar las variables de SASS. Los colores se generan igual que en el [[clase: | + | Escribir a mano todos los tokens de sistema es largo y es fácil equivocarse. Con SASS se guardan los valores en listas y mapas y los tokens se generan con bucles. Así, para cambiar el sistema solo hay que cambiar las variables de SASS. Los colores se generan igual que en el [[clase: |
| <sxh sass> | <sxh sass> | ||
| @use " | @use " | ||
| + | @use " | ||
| $colores: ( | $colores: ( | ||
| Línea 336: | Línea 713: | ||
| ' | ' | ||
| ' | ' | ||
| + | ); | ||
| + | |||
| + | $fuentes: ( | ||
| + | ' | ||
| + | ' | ||
| + | ' | ||
| ); | ); | ||
| $font-sizes: | $font-sizes: | ||
| + | $paddings: (0px, 4px, 8px, 12px, 16px, 20px, 24px, 28px, 32px, 36px, 40px); | ||
| + | $border-radius: | ||
| + | $widths: (0px, 1px, 4px, 8px, 12px, 16px, 20px, 24px, 28px, 32px, 36px, 40px); | ||
| + | $oscurecimientos: | ||
| :root { | :root { | ||
| Línea 346: | Línea 733: | ||
| } | } | ||
| } | } | ||
| + | |||
| + | @each $nombre, $fuente in $fuentes { | ||
| + | --mlt-sys-font-# | ||
| + | } | ||
| + | --mlt-sys-font-default: | ||
| @for $i from 1 through list.length($font-sizes) { | @for $i from 1 through list.length($font-sizes) { | ||
| --mlt-sys-font-size-# | --mlt-sys-font-size-# | ||
| + | } | ||
| + | |||
| + | // Los paddings, los anchos y los oscurecimientos empiezan en 0 | ||
| + | @for $i from 0 through list.length($paddings) - 1 { | ||
| + | --mlt-sys-padding-# | ||
| + | } | ||
| + | |||
| + | @for $i from 1 through list.length($border-radius) { | ||
| + | --mlt-sys-border-radius-# | ||
| + | } | ||
| + | |||
| + | @for $i from 0 through list.length($widths) - 1 { | ||
| + | --mlt-sys-width-# | ||
| + | } | ||
| + | |||
| + | @for $i from 0 through list.length($oscurecimientos) - 1 { | ||
| + | --mlt-sys-oscurecimiento-# | ||
| } | } | ||
| } | } | ||
| Línea 359: | Línea 768: | ||
| --mlt-sys-color-principal-1: | --mlt-sys-color-principal-1: | ||
| --mlt-sys-color-principal-2: | --mlt-sys-color-principal-2: | ||
| - | | + | |
| + | --mlt-sys-color-principal-4: | ||
| + | --mlt-sys-color-principal-5: | ||
| + | --mlt-sys-color-principal-6: | ||
| + | --mlt-sys-color-principal-7: | ||
| + | --mlt-sys-color-principal-8: | ||
| + | --mlt-sys-color-principal-9: | ||
| + | --mlt-sys-color-alternativo-1: | ||
| + | --mlt-sys-color-alternativo-2: | ||
| + | --mlt-sys-color-alternativo-3: | ||
| + | --mlt-sys-color-alternativo-4: | ||
| + | --mlt-sys-color-alternativo-5: | ||
| + | --mlt-sys-color-alternativo-6: | ||
| + | --mlt-sys-color-alternativo-7: | ||
| + | --mlt-sys-color-alternativo-8: | ||
| + | --mlt-sys-color-alternativo-9: | ||
| + | --mlt-sys-color-rojo-1: | ||
| + | --mlt-sys-color-rojo-2: | ||
| + | --mlt-sys-color-rojo-3: | ||
| + | --mlt-sys-color-rojo-4: | ||
| + | --mlt-sys-color-rojo-5: | ||
| + | --mlt-sys-color-rojo-6: | ||
| + | --mlt-sys-color-rojo-7: | ||
| + | --mlt-sys-color-rojo-8: | ||
| + | --mlt-sys-color-rojo-9: | ||
| + | --mlt-sys-color-gris-1: | ||
| + | --mlt-sys-color-gris-2: | ||
| + | --mlt-sys-color-gris-3: | ||
| + | --mlt-sys-color-gris-4: | ||
| + | --mlt-sys-color-gris-5: | ||
| + | --mlt-sys-color-gris-6: | ||
| + | --mlt-sys-color-gris-7: | ||
| + | --mlt-sys-color-gris-8: | ||
| + | --mlt-sys-color-gris-9: | ||
| + | --mlt-sys-color-blanco-1: | ||
| + | --mlt-sys-color-blanco-2: | ||
| + | --mlt-sys-color-blanco-3: | ||
| + | --mlt-sys-color-blanco-4: | ||
| + | --mlt-sys-color-blanco-5: | ||
| + | --mlt-sys-color-blanco-6: | ||
| + | --mlt-sys-color-blanco-7: | ||
| + | --mlt-sys-color-blanco-8: | ||
| + | --mlt-sys-color-blanco-9: | ||
| + | --mlt-sys-color-amarillo-1: | ||
| + | --mlt-sys-color-amarillo-2: | ||
| + | --mlt-sys-color-amarillo-3: | ||
| + | --mlt-sys-color-amarillo-4: | ||
| + | --mlt-sys-color-amarillo-5: | ||
| + | --mlt-sys-color-amarillo-6: | ||
| + | --mlt-sys-color-amarillo-7: | ||
| + | --mlt-sys-color-amarillo-8: | ||
| --mlt-sys-color-amarillo-9: | --mlt-sys-color-amarillo-9: | ||
| + | --mlt-sys-font-sans-serif: | ||
| + | --mlt-sys-font-monospace: | ||
| + | --mlt-sys-font-serif: | ||
| + | --mlt-sys-font-default: | ||
| --mlt-sys-font-size-1: | --mlt-sys-font-size-1: | ||
| - | | + | |
| + | --mlt-sys-font-size-3: | ||
| + | --mlt-sys-font-size-4: | ||
| + | --mlt-sys-font-size-5: | ||
| + | --mlt-sys-font-size-6: | ||
| + | --mlt-sys-font-size-7: | ||
| + | --mlt-sys-font-size-8: | ||
| + | --mlt-sys-font-size-9: | ||
| + | --mlt-sys-font-size-10: | ||
| --mlt-sys-font-size-11: | --mlt-sys-font-size-11: | ||
| + | --mlt-sys-padding-0: | ||
| + | --mlt-sys-padding-1: | ||
| + | --mlt-sys-padding-2: | ||
| + | --mlt-sys-padding-3: | ||
| + | --mlt-sys-padding-4: | ||
| + | --mlt-sys-padding-5: | ||
| + | --mlt-sys-padding-6: | ||
| + | --mlt-sys-padding-7: | ||
| + | --mlt-sys-padding-8: | ||
| + | --mlt-sys-padding-9: | ||
| + | --mlt-sys-padding-10: | ||
| + | --mlt-sys-border-radius-1: | ||
| + | --mlt-sys-border-radius-2: | ||
| + | --mlt-sys-border-radius-3: | ||
| + | --mlt-sys-border-radius-4: | ||
| + | --mlt-sys-width-0: | ||
| + | --mlt-sys-width-1: | ||
| + | --mlt-sys-width-2: | ||
| + | --mlt-sys-width-3: | ||
| + | --mlt-sys-width-4: | ||
| + | --mlt-sys-width-5: | ||
| + | --mlt-sys-width-6: | ||
| + | --mlt-sys-width-7: | ||
| + | --mlt-sys-width-8: | ||
| + | --mlt-sys-width-9: | ||
| + | --mlt-sys-width-10: | ||
| + | --mlt-sys-width-11: | ||
| + | --mlt-sys-oscurecimiento-0: | ||
| + | --mlt-sys-oscurecimiento-1: | ||
| + | --mlt-sys-oscurecimiento-2: | ||
| + | --mlt-sys-oscurecimiento-3: | ||
| + | --mlt-sys-oscurecimiento-4: | ||
| + | --mlt-sys-oscurecimiento-5: | ||
| + | --mlt-sys-oscurecimiento-6: | ||
| } | } | ||
| </ | </ | ||
| - | El resto de tokens de sistema (márgenes, | + | Los márgenes, |
| ==== Tokens de diseño ==== | ==== Tokens de diseño ==== | ||
| Línea 374: | Línea 879: | ||
| <sxh sass> | <sxh sass> | ||
| .c-boton { | .c-boton { | ||
| - | // Parte pública | + | // Tokens de diseño: decisiones |
| - | --boton-color-strong: var(--mlt-sys-color-principal-5); | + | --boton-color-normal: var(--mlt-sys-color-principal-5); |
| - | --boton-color-weak: var(--mlt-sys-color-blanco-9); | + | --boton-color-alternativa: var(--mlt-sys-color-alternativo-5); |
| - | + | --boton-color-peligrosa: var(--mlt-sys-color-rojo-5); | |
| - | --boton-background-color: var(--boton-color-strong); | + | --boton-color-texto-primaria: var(--mlt-sys-color-blanco-9); |
| - | --boton-border-color: var(--boton-color-strong); | + | |
| - | --boton-text-color: var(--boton-color-weak); | + | |
| --boton-font-family: | --boton-font-family: | ||
| - | --boton-font-size: | + | --boton-font-size-s: var(--mlt-sys-font-size-3); |
| - | + | --boton-font-size-m: var(--mlt-sys-font-size-4); | |
| - | --boton-padding: | + | |
| - | --boton-width: | + | --boton-padding-vertical-s: |
| + | --boton-padding-vertical-m: | ||
| + | --boton-padding-vertical-l: var(--mlt-sys-padding-3); | ||
| + | --boton-padding-horizontal-s: | ||
| + | --boton-padding-horizontal-m: | ||
| + | --boton-padding-horizontal-l: | ||
| + | --boton-border-width: var(--mlt-sys-width-1); | ||
| --boton-border-radius: | --boton-border-radius: | ||
| + | --boton-hover-oscurecimiento: | ||
| - | | + | |
| + | | ||
| + | --boton-privateState-color: | ||
| + | --boton-privateState-oscurecimiento: | ||
| + | --boton-privateState-color-final: | ||
| + | --boton-privateState-background-color: | ||
| + | --boton-privateState-border-color: | ||
| + | --boton-privateState-text-color: | ||
| + | --boton-privateState-font-size: | ||
| + | --boton-privateState-padding-vertical: | ||
| + | --boton-privateState-padding-horizontal: | ||
| + | |||
| + | // Propiedades CSS: solo usan el estado y los tokens | ||
| font-family: | font-family: | ||
| - | font-size: var(--boton-font-size); | + | font-size: var(--boton-privateState-font-size); |
| - | padding: var(--boton-padding); | + | padding: var(--boton-privateState-padding-vertical) var(--boton-privateState-padding-horizontal); |
| border-radius: | border-radius: | ||
| - | border-width: | + | border-width: |
| border-style: | border-style: | ||
| Línea 402: | Línea 924: | ||
| text-decoration: | text-decoration: | ||
| - | border-color: | + | border-color: |
| - | background-color: | + | background-color: |
| - | color: var(--boton-text-color); | + | color: var(--boton-privateState-text-color); |
| - | // Modificadores: | + | // La función elige qué token de color se usa |
| & | & | ||
| - | --boton-color-strong: var(--mlt-sys-color-principal-5); | + | --boton-privateState-color: var(--boton-color-normal); |
| } | } | ||
| & | & | ||
| - | --boton-color-strong: var(--mlt-sys-color-alternativo-5); | + | --boton-privateState-color: var(--boton-color-alternativa); |
| } | } | ||
| & | & | ||
| - | --boton-color-strong: var(--mlt-sys-color-rojo-5); | + | --boton-privateState-color: var(--boton-color-peligrosa); |
| } | } | ||
| + | // La importancia decide dónde va el color: fondo, borde o texto | ||
| & | & | ||
| - | --boton-background-color: | + | --boton-privateState-background-color: |
| - | --boton-border-color: | + | --boton-privateState-border-color: |
| - | --boton-text-color: | + | --boton-privateState-text-color: |
| } | } | ||
| & | & | ||
| - | --boton-background-color: | + | --boton-privateState-background-color: |
| - | --boton-border-color: | + | --boton-privateState-border-color: |
| - | --boton-text-color: | + | --boton-privateState-text-color: |
| } | } | ||
| & | & | ||
| - | --boton-background-color: | + | --boton-privateState-background-color: transparent; |
| - | --boton-border-color: var(--boton-color-weak); | + | --boton-privateState-border-color: |
| - | --boton-text-color: var(--boton-color-strong); | + | --boton-privateState-text-color: var(--boton-privateState-color-final); |
| + | } | ||
| + | |||
| + | // El tamaño elige qué tokens de font-size y padding se usan | ||
| + | & | ||
| + | --boton-privateState-font-size: var(--boton-font-size-s); | ||
| + | --boton-privateState-padding-vertical: var(--boton-padding-vertical-s); | ||
| + | --boton-privateState-padding-horizontal: | ||
| + | } | ||
| + | & | ||
| + | --boton-privateState-font-size: | ||
| + | --boton-privateState-padding-vertical: | ||
| + | --boton-privateState-padding-horizontal: | ||
| + | } | ||
| + | & | ||
| + | --boton-privateState-font-size: | ||
| + | --boton-privateState-padding-vertical: | ||
| + | --boton-privateState-padding-horizontal: | ||
| + | } | ||
| + | |||
| + | // Al pasar el ratón, el color se oscurece | ||
| + | &:hover { | ||
| + | --boton-privateState-oscurecimiento: | ||
| } | } | ||
| } | } | ||
| Línea 439: | Línea 984: | ||
| ==== Ejercicio 1 ==== | ==== Ejercicio 1 ==== | ||
| - | Dadas las listas: | + | Los paddings y los márgenes van de 4 en 4, así que no hace falta escribirlos en una lista: se pueden calcular. |
| <sxh sass> | <sxh sass> | ||
| - | $paddings: (0px, 4px, 8px, 12px, 16px, 20px, 24px, 28px, 32px, 36px, 40px); | + | $paso: 4px; |
| - | $margins: (0px, 4px, 8px, 12px, 16px, 20px, 24px, 28px, 32px, 36px, 40px); | + | $numero-pasos: 10; |
| </ | </ | ||
| - | Genera los tokens de sistema de paddings y márgenes. Empiezan en 0: | + | Genera |
| <sxh css> | <sxh css> | ||
| Línea 459: | Línea 1004: | ||
| } | } | ||
| </ | </ | ||
| + | |||
| + | Cambia '' | ||
| ==== Ejercicio 2 ==== | ==== Ejercicio 2 ==== | ||
| - | Dado el mapa: | + | Al pulsar |
| + | * Di qué tokens de sistema, tokens de diseño y estados privados hacen falta, y cuáles de ellos son nuevos. | ||
| + | * Añádelo al botón en SASS sin tocar sus propiedades CSS ni los modificadores que ya tiene. | ||
| - | <sxh sass> | + | Comprueba en el navegador que el botón se oscurece un poco al pasar el ratón y más al pulsarlo, en las tres importancias. |
| - | $fuentes: ( | + | |
| - | ' | + | |
| - | ' | + | |
| - | ' | + | |
| - | ); | + | |
| - | </ | + | |
| - | Genera los tokens de sistema de las fuentes y el de la fuente por defecto, que es la '' | ||
| - | <sxh css> | + | ==== Ejercicio 3 ==== |
| - | :root { | + | Junta en un único fichero SASS todas las variables de SASS del sistema (colores, tamaños de fuente, márgenes, paddings, oscurecimientos, fuentes, border-radius y anchos) y genera con él todo el ''< |
| - | --mlt-sys-font-sans-serif: | + | |
| - | --mlt-sys-font-serif: Palatino, " | + | |
| - | --mlt-sys-font-monospace: | + | |
| - | --mlt-sys-font-default: | + | |
| - | } | + | |
| - | </sxh> | + | |
| + | Cambia ahora el color principal por un verde (genera sus 9 tonos con el [[https:// | ||
| - | ==== Ejercicio 3 ==== | ||
| - | Junta en un único fichero SASS todas las variables de SASS del sistema (colores, tamaños de fuente, márgenes, paddings, fuentes, border-radius y anchos) y genera con él todo el ''< | ||
| - | Cambia ahora el color principal por un verde (genera sus 9 tonos con el [[https://logongas.github.io/color-schemes-generator/|Color Scheme Generator]]) | + | ==== Ejercicio 4 ==== |
| + | Haz en SASS el componente '' | ||
| + | |||
| + | {{: | ||
| + | |||
| + | * Los tokens de diseño se llaman '' | ||
| + | * El color lo elige la función, con los modificadores '' | ||
| + | * Los elementos '' | ||
| + | |||
| + | Crea una página HTML con los 3 paneles | ||
clase/daw/diw/sistema-diseno-tokens.1792789653.txt.gz · Última modificación: por claude
