FlowtitudeFlowtitude

Tokens de Diseño

Variables CSS que controlan todo el sistema. ~35 knobs editables generan 50+ valores derivados vía clamp().

Colores (OKLCH)

FDS usa el espacio de color OKLCH para todas sus paletas. OKLCH ofrece uniformidad perceptual: dos colores con el mismo valor de lightness se perciben igual de luminosos, algo que no ocurre con hex o RGB. Esto permite generar escalas de color consistentes cambiando solo el hue.

Cada paleta tiene 11 pasos (50-950) que cubren desde fondos claros hasta textos oscuros. Los colores comparten la misma estructura de lightness y chroma, variando unicamente el angulo de hue.

Primary (hue 27.19)

50
100
200
300
400
500
600
700
800
900
950

Secondary (hue 18.01)

50
100
200
300
400
500
600
700
800
900
950

Definición en CSS

CSS theme/flowtitude.css
@theme { /* Primary — hue 27.19 */ --color-primary-50: oklch(0.9700 0.0255 27.19); --color-primary-100: oklch(0.9400 0.0428 27.19); --color-primary-200: oklch(0.8700 0.0765 27.19); --color-primary-300: oklch(0.8000 0.1056 27.19); --color-primary-400: oklch(0.7000 0.1432 27.19); --color-primary-500: oklch(0.5365 0.1984 27.19); --color-primary-600: oklch(0.4963 0.1938 27.19); --color-primary-700: oklch(0.4517 0.1884 27.19); --color-primary-800: oklch(0.3916 0.1805 27.19); --color-primary-900: oklch(0.3192 0.1698 27.19); --color-primary-950: oklch(0.2505 0.1579 27.19); /* Secondary — hue 18.01 */ --color-secondary-50: oklch(0.969 0.002 18.01); --color-secondary-100: oklch(0.927 0.007 17.53); --color-secondary-200: oklch(0.862 0.01 17.51); --color-secondary-300: oklch(0.786 0.017 17.61); --color-secondary-400: oklch(0.719 0.022 17.74); --color-secondary-500: oklch(0.64 0.031 18.02); --color-secondary-600: oklch(0.569 0.036 18.28); --color-secondary-700: oklch(0.493 0.029 18.21); --color-secondary-800: oklch(0.42 0.025 18.21); --color-secondary-900: oklch(0.292 0.015 18.07); --color-secondary-950: oklch(0.23 0.011 18.02); }

Personalizar colores

Para cambiar la paleta primaria, modifica el valor de hue (tercer parámetro de oklch). Los valores de lightness y chroma están calibrados para que cualquier hue produzca una escala visualmente equilibrada. Por ejemplo, cambiar 27.19 a 210 convierte la paleta primaria de naranja a azul.

💡 OKLCH usa tres ejes: L (lightness 0-1), C (chroma / saturación) y H (hue 0-360). Puedes usar herramientas como oklch.com para explorar el espacio de color.

Espaciado Semántico

FDS define 7 niveles de spacing semántico. Cada nivel tiene un propósito claro y un multiplicador fijo sobre la escala fluida base. Esto garantiza proporciones consistentes en cualquier viewport.

Escala visual — tamaños reales

Las barras muestran la altura real del valor en desktop (viewport 1280px). Pasa el cursor para ver el tamaño exacto.

--spacing-inner
≈ 0.4rem · 0.5×
--spacing-content
≈ 0.6rem · 0.75×
--spacing-stack
≈ 0.9rem · 1×
--spacing-block
≈ 1.35rem · 1×
--spacing-columns
≈ 2rem · 1.5×
--spacing-section
≈ 4.5rem · 3×
--spacing-hero
≈ 7rem · 4.5×

Cálculo fluido

Todos los valores de spacing se calculan con clamp(), interpolando fluidamente entre el viewport mínimo (410px) y el máximo (1280px). No se usan media queries.

La formula base es:

CSS Formula simplificada
/* Factor de interpolacion (0 en 410px, 1 en 1280px) */ --ft-fluid-t: calc( (100vw - var(--viewport-min)) / (var(--viewport-max) - var(--viewport-min)) ); /* Valor base fluido */ --ft-space-value: clamp( var(--ft-space-min), /* 0.5rem en mobile */ calc(var(--ft-space-min) + (var(--ft-space-max) - var(--ft-space-min)) * var(--ft-fluid-t)), var(--ft-space-max) /* 1.5rem en desktop */ ); /* Spacing semantico = base escalado * multiplicador */ --spacing-section: calc(var(--spacing-fluid-xl) * var(--ft-space-factor-section)); /* 3x */ --spacing-hero: calc(var(--spacing-fluid-2xl) * var(--ft-space-factor-hero)); /* 4.5x */

Referencia de tokens

Token Multiplicador Uso recomendado
--spacing-inner 0.5x Padding interno muy ajustado (dentro de badges, tags)
--spacing-content 0.75x Gaps entre elementos de contenido (texto, iconos)
--spacing-stack 1x Apilar elementos verticalmente (párrafos, listas)
--spacing-block 1x Separación entre bloques de contenido
--spacing-columns 1.5x Gaps en grids y columnas
--spacing-section 3x Padding vertical de secciones
--spacing-hero 4.5x Padding de heroes y secciones destacadas

Definición CSS

CSS theme/flowtitude.css
@theme { /* Escala fluida base (computed) */ --spacing-fluid-md: calc(var(--ft-space-value) * var(--ft-space-factor)); --spacing-fluid-sm: calc(var(--spacing-fluid-md) / var(--ft-space-step)); --spacing-fluid-xs: calc(var(--spacing-fluid-sm) / var(--ft-space-step)); --spacing-fluid-lg: calc(var(--spacing-fluid-md) * var(--ft-space-step)); --spacing-fluid-xl: calc(var(--spacing-fluid-lg) * var(--ft-space-step)); --spacing-fluid-2xl: calc(var(--spacing-fluid-xl) * var(--ft-space-step)); /* Semantic spacing (computed) */ --spacing-inner: calc(var(--spacing-fluid-xs) * var(--ft-space-factor-inner)); /* 0.5x */ --spacing-content: calc(var(--spacing-fluid-sm) * var(--ft-space-factor-content)); /* 0.75x */ --spacing-stack: calc(var(--spacing-fluid-sm) * var(--ft-space-factor-stack)); /* 1x */ --spacing-block: calc(var(--spacing-fluid-md) * var(--ft-space-factor-block)); /* 1x */ --spacing-columns: calc(var(--spacing-fluid-md) * var(--ft-space-factor-columns)); /* 1.5x */ --spacing-section: calc(var(--spacing-fluid-xl) * var(--ft-space-factor-section)); /* 3x */ --spacing-hero: calc(var(--spacing-fluid-2xl) * var(--ft-space-factor-hero)); /* 4.5x */ }

Escala Tipográfica

La escala tipográfica de FDS es completamente fluida. Usa un step ratio que interpola entre 1.125 (Major Second, en mobile) y 1.2 (Minor Third, en desktop). Esto significa que la escala se comprime en pantallas pequeñas y se expande en pantallas grandes, manteniendo siempre las proporciones correctas.

Cómo funciona

El sistema parte de un tamaño base (--text-base) y multiplica o divide por el step ratio para generar cada nivel de la escala:

  • Hacia arriba: --text-lg = base * step, --text-xl = lg * step, y así sucesivamente hasta --text-9xl.
  • Hacia abajo: --text-sm = base / step, --text-xs = sm / step.
CSS theme/flowtitude.css
/* Step ratio: interpola entre 1.125 (mobile) y 1.2 (desktop) */ --ft-type-step: clamp( var(--ft-type-step-min), /* 1.125 */ calc(var(--ft-type-step-min) + (var(--ft-type-step-max) - var(--ft-type-step-min)) * var(--ft-fluid-t)), var(--ft-type-step-max) /* 1.2 */ ); /* Base text size: fluid entre 1rem (mobile) y 1.125rem (desktop) */ --ft-text-value: clamp( var(--ft-text-min), calc(var(--ft-text-min) + (var(--ft-text-max) - var(--ft-text-min)) * var(--ft-fluid-t)), var(--ft-text-max) ); @theme { /* Scale generada por multiplicacion / division del step */ --text-base: calc(var(--ft-text-value) * var(--ft-text-factor)); --text-sm: calc(var(--text-base) / var(--ft-type-step)); --text-xs: calc(var(--text-sm) / var(--ft-type-step)); --text-lg: calc(var(--text-base) * var(--ft-type-step)); --text-xl: calc(var(--text-lg) * var(--ft-type-step)); --text-2xl: calc(var(--text-xl) * var(--ft-type-step)); --text-3xl: calc(var(--text-2xl) * var(--ft-type-step)); --text-4xl: calc(var(--text-3xl) * var(--ft-type-step)); --text-5xl: calc(var(--text-4xl) * var(--ft-type-step)); --text-6xl: calc(var(--text-5xl) * var(--ft-type-step)); --text-7xl: calc(var(--text-6xl) * var(--ft-type-step)); --text-8xl: calc(var(--text-7xl) * var(--ft-type-step)); --text-9xl: calc(var(--text-8xl) * var(--ft-type-step)); }

Escala visual — tamaños reales en desktop

El texto de muestra se renderiza al tamaño real de cada paso. La escala fluye entre mobile y desktop vía clamp().

--text-xs ≈ 0.78rem → 0.87rem
Texto extra pequeño — captions, labels
--text-sm ≈ 0.88rem → 1.04rem
Texto pequeño — notas, meta, UI compacta
--text-base ≈ 1rem → 1.125rem
Texto base — cuerpo de texto principal
--text-lg ≈ 1.125rem → 1.35rem
Texto grande — lead, intro, destacados
--text-xl ≈ 1.27rem → 1.62rem
Títulos pequeños — card headers
--text-2xl ≈ 1.42rem → 1.95rem
Subheading · h3 de sección
--text-3xl ≈ 1.6rem → 2.34rem
Heading · h2 de página
--text-4xl ≈ 1.8rem → 2.81rem
Heading grande · h1
--text-5xl ≈ 2rem → 3.37rem
Display · hero title
--text-6xl ≈ 2.25rem → 4rem
Display grande
--text-7xl ≈ 2.53rem → 4.8rem
Mega display

Efecto del step ratio

Cambiar el step ratio afecta la diferencia entre niveles de la escala:

  • Step más bajo (ej. 1.1): la escala se comprime y los tamaños son más uniformes. Ideal para interfaces densas.
  • Step más alto (ej. 1.25 o 1.333): la escala se expande y hay más contraste entre niveles. Ideal para landing pages y contenido editorial.

El default de FDS (1.125 a 1.2) ofrece un equilibrio entre legibilidad y jerarquía visual, con una progresión suave que se adapta al viewport.

⚠️ Cambiar --ft-type-step-min o --ft-type-step-max recalcula toda la escala tipográfica. Verifica los tamaños resultantes en ambos extremos del viewport antes de hacer deploy.

Referencia de Knobs

Estos son los ~35 valores editables (knobs) que controlan todo el sistema. Modificar cualquiera de ellos recalcula automáticamente los valores derivados que dependen de él.

CSS theme/flowtitude.css — :root
:root { /* ── Viewport range ─────────────────────────── */ --viewport-min: 410px; --viewport-max: 1280px; /* ── Typography ─────────────────────────────── */ --ft-text-min: 1rem; /* Base text size en mobile */ --ft-text-max: 1.125rem; /* Base text size en desktop */ --ft-type-step-min: 1.125; /* Ratio en mobile (Major Second) */ --ft-type-step-max: 1.2; /* Ratio en desktop (Minor Third) */ --ft-text-factor: 1; /* Multiplicador global de texto */ /* ── Spacing ────────────────────────────────── */ --ft-space-min: 0.5rem; /* Base space en mobile */ --ft-space-max: 1.5rem; /* Base space en desktop */ --ft-space-step-min: 1.3; /* Ratio de escala en mobile */ --ft-space-step-max: 1.5; /* Ratio de escala en desktop */ --ft-space-factor: 1; /* Multiplicador global de spacing */ /* ── Semantic multipliers ───────────────────── */ --ft-space-factor-inner: 0.5; --ft-space-factor-content: 0.75; --ft-space-factor-stack: 1; --ft-space-factor-block: 1; --ft-space-factor-columns: 1.5; --ft-space-factor-section: 3; --ft-space-factor-hero: 4.5; /* ── Layout ─────────────────────────────────── */ --ft-container: min(var(--container-7xl), 90%); --ft-padding-content-x: 1rem; --ft-padding-content-y: var(--spacing-section); --ft-gap-content: var(--spacing-block); /* ── Colors ─────────────────────────────────── */ --ft-color-text: #000; --ft-color-background: #f9ecec; /* ── Card widths ────────────────────────────── */ --ft-card-xs: 12rem; --ft-card-sm: 14rem; --ft-card-md: 18rem; --ft-card-lg: 24rem; --ft-card-xl: 36rem; }

Grupos de knobs

Grupo Knobs Qué controla
Viewport --viewport-min, --viewport-max Rango donde clamp() interpola (410px a 1280px)
Typography --ft-text-min, --ft-text-max, --ft-type-step-min, --ft-type-step-max, --ft-text-factor Tamaño base, ratio de escala y multiplicador global de texto
Spacing --ft-space-min, --ft-space-max, --ft-space-step-min, --ft-space-step-max, --ft-space-factor Valor base, ratio de escala y multiplicador global de spacing
Multipliers --ft-space-factor-inner ... --ft-space-factor-hero Proporción de cada nivel semántico respecto a la escala base
Layout --ft-container, --ft-padding-content-x, --ft-padding-content-y, --ft-gap-content Ancho máximo del contenedor, padding y gap por defecto de secciones
Colors --ft-color-text, --ft-color-background Color de texto y fondo por defecto (body)
Card widths --ft-card-xs (12rem), --ft-card-sm (14rem), --ft-card-md (18rem), --ft-card-lg (24rem), --ft-card-xl (36rem) Anchos predefinidos para cards en grids auto-fill/fit

Otros Tokens

Tokens adicionales que complementan la escala tipográfica, de spacing y colores. Definidos en @theme para estar disponibles como utilidades de Tailwind.

Leading (line-height)

Seis niveles de interlineado semántico, de compacto a espacioso. Usables como leading-tight, leading-normal, etc. en Tailwind.

CSS theme/flowtitude.css
@theme { --leading-none: 1em; /* Sin interlineado extra */ --leading-tight: 1.2em; /* Titulares grandes */ --leading-snug: 1.375em; /* Subtitulos */ --leading-normal: 1.5em; /* Texto de cuerpo */ --leading-relaxed: 1.625em; /* Lectura confortable */ --leading-loose: 2em; /* Texto espacioso */ }
Token Valor Uso recomendado
--leading-none1emDisplay text, números grandes
--leading-tight1.2emTitulares h1-h3
--leading-snug1.375emSubtitulos, h4-h6
--leading-normal1.5emTexto de cuerpo (default)
--leading-relaxed1.625emProsa larga, artículos
--leading-loose2emTexto con mucho espacio, tooltips largos

Border Radius

Tres tokens de radio de borde semánticos que referencian los valores base de Tailwind (--radius-sm, --radius-md). Proporcionan consistencia al asignar radios a componentes concretos.

CSS theme/flowtitude.css
@theme { --radius-button: var(--radius-sm); /* Esquinas de botones */ --radius-card: var(--radius-md); /* Esquinas de cards */ --radius-section: var(--radius-md); /* Esquinas de secciones con fondo */ }
Token Valor base Uso
--radius-buttonvar(--radius-sm)Todos los botones (.btn)
--radius-cardvar(--radius-md)Cards, modals, popovers
--radius-sectionvar(--radius-md)Secciones con fondo/borde

Aspect Ratios

Ratios de aspecto predefinidos para imágenes, videos y contenedores. Usables con la utilidad aspect-[token] de Tailwind o directamente como valor de aspect-ratio.

CSS theme/flowtitude.css
@theme { --aspect-rrss: 1.91 / 1; /* Redes sociales (Facebook, Twitter) */ --aspect-wide: 18 / 8; /* Panoramico suave */ --aspect-ultrawide: 18 / 5; /* Ultra panoramico (heroes) */ --aspect-golden: 1.618 / 1; /* Proporcion aurea */ --aspect-portrait: 3 / 4; /* Retrato */ --aspect-landscape: 4 / 3; /* Paisaje clasico */ }
Token Ratio Uso recomendado
--aspect-rrss1.91 / 1Open Graph, Twitter cards, previews de RRSS
--aspect-wide18 / 8Banners horizontales, imágenes de sección
--aspect-ultrawide18 / 5Heroes full-width, sliders panorámicos
--aspect-golden1.618 / 1Composiciones equilibradas, thumbnails
--aspect-portrait3 / 4Fotos de personas, cards verticales
--aspect-landscape4 / 3Fotos generales, previews de video