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:36] – Botón: separar tokens de diseño (públicas) y estado (privadas, --boton-privateState-*) 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 **variables privadas** que no son tokens: son CSS que necesita el componente para funcionar y que no le interesan al diseñador. | + | Además, cada componente tiene un **estado privado**: variables |
| ===== Números mágicos ===== | ===== Números mágicos ===== | ||
| Línea 187: | 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 225: | Línea 233: | ||
| Pero aun se tiene que mejorar la legibilidad del código. En vez de usar directamente los tokens de sistema, el botón crea sus propias variables: | Pero aun se tiene que mejorar la legibilidad del código. En vez de usar directamente los tokens de sistema, el botón crea sus propias variables: | ||
| - | <sxh css; highlight: [2-15]> | + | <sxh css; highlight: [2-19]> |
| .c-boton { | .c-boton { | ||
| - | /* Parte pública: tokens | + | /* Tokens |
| - | --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: |
| + | --boton-color-peligrosa: | ||
| + | --boton-color-texto-primaria: var(--mlt-sys-color-blanco-9); | ||
| --boton-font-family: | --boton-font-family: | ||
| --boton-font-size: | --boton-font-size: | ||
| Línea 236: | Línea 247: | ||
| --boton-border-radius: | --boton-border-radius: | ||
| - | /* Parte privada: estado del botón */ | ||
| - | --boton-privateState-background-color: | ||
| - | --boton-privateState-border-color: | ||
| - | --boton-privateState-text-color: | ||
| - | /* Propiedades CSS: solo usan variables del botón | + | |
| + | --boton-privateState-color: | ||
| + | --boton-privateState-background-color: | ||
| + | --boton-privateState-border-color: | ||
| + | --boton-privateState-text-color: | ||
| + | |||
| + | | ||
| font-family: | font-family: | ||
| font-size: var(--boton-font-size); | font-size: var(--boton-font-size); | ||
| Línea 259: | Línea 272: | ||
| } | } | ||
| - | /* La función | + | /* La función |
| .c-boton--funcion-normal { | .c-boton--funcion-normal { | ||
| - | --boton-color-strong: var(--mlt-sys-color-principal-5); | + | --boton-privateState-color: var(--boton-color-normal); |
| } | } | ||
| .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 { | .c-boton--funcion-peligrosa { | ||
| - | --boton-color-strong: var(--mlt-sys-color-rojo-5); | + | --boton-privateState-color: var(--boton-color-peligrosa); |
| } | } | ||
| - | /* La importancia | + | /* La importancia |
| .c-boton--importancia-primaria { | .c-boton--importancia-primaria { | ||
| - | --boton-privateState-background-color: | + | --boton-privateState-background-color: |
| - | --boton-privateState-border-color: | + | --boton-privateState-border-color: |
| - | --boton-privateState-text-color: | + | --boton-privateState-text-color: |
| } | } | ||
| .c-boton--importancia-secundaria { | .c-boton--importancia-secundaria { | ||
| - | --boton-privateState-background-color: | + | --boton-privateState-background-color: |
| - | --boton-privateState-border-color: | + | --boton-privateState-border-color: |
| - | --boton-privateState-text-color: | + | --boton-privateState-text-color: |
| } | } | ||
| .c-boton--importancia-terciaria { | .c-boton--importancia-terciaria { | ||
| - | --boton-privateState-background-color: | + | --boton-privateState-background-color: |
| - | --boton-privateState-border-color: | + | --boton-privateState-border-color: |
| - | --boton-privateState-text-color: | + | --boton-privateState-text-color: |
| } | } | ||
| </ | </ | ||
| Línea 293: | Línea 306: | ||
| Dentro del botón hay dos tipos de variables: | Dentro del botón hay dos tipos de variables: | ||
| - | * **Públicas** ('' | + | * **Tokens de diseño** ('' |
| - | * '' | + | * **Estado privado** ('' |
| - | * '' | + | |
| - | * **Privadas** ('' | + | |
| - | Al diseñador le interesa | + | Para saber si una variable es un token o es estado: si su valor depende del modificador |
| - | ^ ^ Pública ^ Privada ^ | + | Por eso **los modificadores solo cambian el estado, nunca los tokens**: |
| - | ^ Qué es | Token de diseño | Estado del componente | | + | * **Función**: |
| - | ^ Nombre | '' | + | * **Importancia**: |
| - | ^ Quién la cambia | El diseñador, | + | |
| - | ^ Ejemplo | '' | + | |
| - | Las propiedades | + | '' |
| + | |||
| + | ^ ^ Token de diseño ^ Estado privado ^ | ||
| + | ^ Qué guarda | Una decisión del diseñador | Cómo está el botón | ||
| + | ^ 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> | <note important> | ||
| - | Nunca cambies una variable | + | 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: | 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: | ||
| + | --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 { | ||
| + | --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: | ||
| + | } | ||
| + | .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 { | ||
| + | --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: | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | 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, | ||
| + | |||
| + | <sxh css> | ||
| + | :root { | ||
| + | --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: | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | En el botón hay que pensar qué es token y qué es estado: | ||
| + | * **Token de diseño** '' | ||
| + | * **Estado privado** '' | ||
| + | * **Estado privado** '' | ||
| + | * **''< | ||
| + | |||
| + | Lo nuevo está resaltado: | ||
| + | |||
| + | <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: | ||
| + | |||
| + | --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 '' | ||
| </ | </ | ||
| Línea 321: | 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 331: | 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 343: | 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 353: | 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 366: | 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 381: | Línea 879: | ||
| <sxh sass> | <sxh sass> | ||
| .c-boton { | .c-boton { | ||
| - | // Parte pública: tokens | + | // Tokens |
| - | --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: |
| + | --boton-color-peligrosa: | ||
| + | --boton-color-texto-primaria: var(--mlt-sys-color-blanco-9); | ||
| --boton-font-family: | --boton-font-family: | ||
| - | --boton-font-size: | + | --boton-font-size-s: var(--mlt-sys-font-size-3); |
| - | --boton-padding: | + | --boton-font-size-m: var(--mlt-sys-font-size-4); |
| + | --boton-font-size-l: | ||
| + | --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: | --boton-border-width: | ||
| --boton-border-radius: | --boton-border-radius: | ||
| + | --boton-hover-oscurecimiento: | ||
| - | // Parte privada: estado del botón | ||
| - | --boton-privateState-background-color: | ||
| - | --boton-privateState-border-color: | ||
| - | --boton-privateState-text-color: | ||
| - | // Propiedades CSS: solo usan variables del botón | + | |
| + | --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: | ||
| + | |||
| + | | ||
| 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: | ||
| Línea 412: | Línea 928: | ||
| color: var(--boton-privateState-text-color); | color: var(--boton-privateState-text-color); | ||
| - | // La función | + | // La función |
| & | & | ||
| - | --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 | + | // La importancia |
| & | & | ||
| - | --boton-privateState-background-color: | + | --boton-privateState-background-color: |
| - | --boton-privateState-border-color: | + | --boton-privateState-border-color: |
| - | --boton-privateState-text-color: | + | --boton-privateState-text-color: |
| } | } | ||
| & | & | ||
| - | --boton-privateState-background-color: | + | --boton-privateState-background-color: |
| - | --boton-privateState-border-color: | + | --boton-privateState-border-color: |
| - | --boton-privateState-text-color: | + | --boton-privateState-text-color: |
| } | } | ||
| & | & | ||
| - | --boton-privateState-background-color: | + | --boton-privateState-background-color: transparent; |
| - | --boton-privateState-border-color: var(--boton-color-weak); | + | --boton-privateState-border-color: |
| - | --boton-privateState-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 446: | 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 466: | 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.1792791361.txt.gz · Última modificación: por claude
