Jon CeronDiseñador de producto sénior
ES

Sistema

Esta página muestra cómo funciona el design system de este sitio: una spec en Markdown por componente, el componente construido a partir de ella y las verificaciones que mantienen a ambos en sincronía. Para quien desarrolla, muestra a partir de qué construir: cada valor es un token y el build falla si un componente usa uno fijo. Para quien diseña, muestra el razonamiento detrás de las decisiones, como por qué cada rol de texto tiene un solo tamaño y cada espacio es múltiplo de 8px.

De la spec al componente verificado

Spec

design-system/components/button.md

# Button

## Props
| Prop | Values |
| --- | --- |
| `href` | string |
| `type` | `submit`, `button` |
| `variant` | `primary` (default), `secondary`, `ghost` |
| `external` | boolean |
| `download` | boolean |
| `size` | `default`, `large` |

## Tokens
`--cmp-button-*` (height, padding-x, radius, font-weight, primary and secondary colors), `--sys-motion-*`.

Verificación

Tema: oscuroclaroTokens usados: 21 de 21Valores fijos en el código: 0Texto de cuerpo sobre la página: 15.9:117.5:1

Calculado a partir del CSS del Button en cada build. El build falla si no es 0.

Escalas de color

Las primitivas detrás de los tokens: neutro para el tema oscuro, papel para el tema claro y el acento violeta.

Spec de tokensdesign-system/tokens.md

Neutro, 12 pasos

  • 1#1314161.0:1
  • 2#18191C1.0:1
  • 3#1E20241.1:1
  • 4#25272C1.2:1
  • 5#2C2F351.4:1
  • 6#3538401.6:1
  • 7#41454D1.9:1
  • 8#565B652.7:1
  • 9#7A808B4.6:1
  • 10#8A909B5.7:1
  • 11#B4B9C29.4:1
  • 12#EDEEF015.9:1

Papel, 12 pasos (tema claro)

  • 1#FCFCFD1.0:1
  • 2#F5F6F81.1:1
  • 3#ECEEF21.1:1
  • 4#E3E6EB1.2:1
  • 5#D9DDE31.3:1
  • 6#CDD2D91.5:1
  • 7#B9BFC81.8:1
  • 8#9AA1AD2.5:1
  • 9#7A808B3.9:1
  • 10#5C626C6.0:1
  • 11#3F444C9.6:1
  • 12#15171A17.5:1

Violeta, los pasos en uso

  • 9#6E56CF3.4:1
  • 10#644CCB3.0:1
  • 11#B9A8FF8.9:1
  • a316%
  • a740%

El contraste se mide contra el fondo de la página.

Por qué cada rol de texto tiene un solo tamaño

Cada rol es un conjunto de tokens: familia, tamaño, interlineado, peso y rastreo. Los títulos display y de sección son fluidos: se escalan entre dos tamaños según el ancho de la ventana. Todo lo demás es fijo, así que el texto de cuerpo respeta el tamaño de fuente del navegador de quien lee.

  • Display

    Familia
    Schibsted Grotesk
    Tamaño
    2.25rem–3rem (36px–48px), fluido
    Interlineado
    1.05
    Peso
    600
    Rastreo
    -0.035em
    Tokens
    --sys-type-display-size--sys-type-display-leading--sys-type-display-weight--sys-type-display-tracking--sys-font-sans
  • Título de sección

    Familia
    Schibsted Grotesk
    Tamaño
    1.75rem–2.5rem (28px–40px), fluido
    Interlineado
    1.15
    Peso
    600
    Rastreo
    -0.02em
    Tokens
    --sys-type-title-size--sys-type-title-leading--sys-type-title-weight--sys-type-title-tracking--sys-font-sans
  • Encabezado

    Familia
    Schibsted Grotesk
    Tamaño
    1.25rem (20px)
    Interlineado
    1.3
    Peso
    600
    Rastreo
    -0.01em
    Tokens
    --sys-type-heading-size--sys-type-heading-leading--sys-type-heading-weight--sys-type-heading-tracking--sys-font-sans
  • Entradilla

    Familia
    Schibsted Grotesk
    Tamaño
    1.25rem (20px)
    Interlineado
    1.65
    Peso
    400
    Rastreo
    0
    Tokens
    --sys-type-lede-size--sys-type-lede-leading--sys-type-body-weight--sys-font-sans
  • Cuerpo

    Familia
    Schibsted Grotesk
    Tamaño
    1rem (16px)
    Interlineado
    1.65
    Peso
    400
    Rastreo
    0
    Tokens
    --sys-type-body-size--sys-type-body-leading--sys-type-body-weight--sys-font-sans
  • Pequeño

    Familia
    Schibsted Grotesk
    Tamaño
    0.875rem (14px)
    Interlineado
    1.5
    Peso
    400
    Rastreo
    0
    Tokens
    --sys-type-small-size--sys-type-small-leading--sys-type-body-weight--sys-font-sans
  • Pie

    Familia
    Schibsted Grotesk
    Tamaño
    0.8125rem (13px)
    Interlineado
    1.5
    Peso
    400
    Rastreo
    0
    Tokens
    --sys-type-caption-size--sys-type-caption-leading--sys-type-body-weight--sys-font-sans
  • Cifra

    Familia
    JetBrains Mono
    Tamaño
    2.5rem (40px)
    Interlineado
    1.15
    Peso
    500
    Rastreo
    0
    Tokens
    --sys-type-stat-size--sys-type-stat-leading--sys-type-label-weight--sys-font-mono

Por qué cada espacio es múltiplo de 8px

Un paso mide 8px, escrito en rem. Medio paso (4px) se reserva para pares muy juntos, como un ícono y su etiqueta. Los componentes nunca usan un paso directamente: usan los nombres semánticos de la última columna.

PasorempxEscalaSe usa como
space.half0.25rem4pxspace.hairline-gap
space.10.5rem8pxspace.stack-xs
space.21rem16pxspace.gutterspace.stack-sm
space.31.5rem24pxspace.stack-mdsize.swatch
space.42rem32pxspace.gutterspace.stack-lg
space.52.5rem40pxsize.control-heightsize.mark-height
space.63rem48pxspace.sectionspace.stack-xlsize.logo-heightsize.chip-heightsize.control-height-large
space.73.5rem56pxspace.section
space.84rem64pxsize.header-height
space.105rem80pxNingún token semántico lo referencia
space.126rem96pxsize.scroll-offset
space.168rem128pxNingún token semántico lo referencia