Design System — Showcase

Sergio Forés · actualizado 2026-04-12

Esta página muestra todos los tokens y componentes del sistema en un solo lugar. Sirve como referencia visual y como canario de regresiones: si algo del sistema cambia y rompe algo, aquí se verá antes que en ningún otro sitio.

No editar componentes desde este archivo. Solo sirve para visualizarlos.

Familias tipográficas

Dos familias en el sistema

--font-primary — Montserrat
ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz 0123456789
--font-secondary — Helvetica Neue / Avenir Next
ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz 0123456789
--font-mono — JetBrains Mono / SF Mono
ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz 0123456789

Montserrat es la fuente principal del sistema. La secundaria es un stack de sistema para contextos que requieran contraste tipográfico.

Tipografía — 4 base + display

4 tamaños base + display especial para heros y contextos editoriales

--text-display — Hero, editorial dramático
--text-large — Titulares principales (H1)
--text-medium — Subtítulos, navegación, blockquotes (H2-H3)
--text-base — Párrafos, texto de lectura
--text-small — UI, labels, texto auxiliar

Aliases semánticos

--font-size-display apunta a --text-display. heading a medium, body a base.

--font-size-display → var(--text-display)
--font-size-heading → var(--text-medium)
--font-size-body → var(--text-base)

Letter spacing display

SERGIO FORÉS
--letter-spacing-display: 0.35em — para uppercase display

Los cuatro tamaños base usan clamp() con progresión áurea — escalan fluidamente entre móvil y desktop.

Colores de marca

4 colores de marca · nombres genéricos, valores intercambiables

Nombres genéricos (brand-a/b/c) para poder cambiar los valores sin renombrar variables. Uso: fondos, fills, gestos decorativos, marca.

--color-yellow #FFFF00
--color-brand-a #ce704f
--color-brand-b #6cc1c0
--color-brand-c #7cee95

Marca sobre fondo oscuro

Yellow sobre negro

Brand A sobre negro

Brand B sobre negro

Brand C sobre negro

Neutros

Blanco, negro y escala de grises 50-900

white#FFFFFF
black#000000
gray-50#fafafa
gray-100#f5f5f5
gray-200#e5e5e5
gray-300#d4d4d4
gray-400#a3a3a3
gray-500#737373
gray-600#525252
gray-700#404040
gray-800#262626
gray-900#171717

Colores de acento funcional

Estados UI con dos variantes: bright (fills/fondos oscuros) y text (texto legible sobre blanco)

Para texto sobre fondo claro — usar --accent-*-text

Versiones oscurecidas con ratio AA (6:1+ sobre blanco). Usar siempre que el color sea texto legible.

Error: campo obligatorio

--accent-error-text
#c41134 · 6.04:1

Info: sesión caduca

--accent-info-text
#1666a5 · 6.04:1

Aviso: irreversible

--accent-warning-text
#825b00 · 6.09:1

OK: guardado

--accent-secondary-text
#007061 · 6.02:1

Para fills, iconos y fondos oscuros — usar --accent-*

Versiones brillantes. Solo para fills, backgrounds, iconos grandes o texto sobre fondo oscuro. No como texto sobre blanco.

accent-primary#0055ff
accent-secondary#00bfa6
accent-warning#ffb300
accent-error#ff1744
accent-info#2196f3

Error brillante sobre gray-900

Info brillante sobre gray-900

Warning brillante sobre gray-900

Secondary brillante sobre gray-900

--accent-*-bright son aliases de --accent-* (mismo valor, nombre explícito para uso sobre fondo oscuro). --accent-primary (#0055ff) pasa AA como texto — es el único que no necesita variante -text.

Aliases cromáticos directos

Atajos para los tokens semánticos más frecuentes

--color-bg → --color-surface-primary
--color-fg → --color-text-primary
--color-dim → --color-text-muted

Weights y line-heights

5 pesos con contraste real, 3 line-heights

Font weights

--font-weight-light (200) — Ultra light, solo display/large
--font-weight-normal (400) — UI, labels, general
--font-weight-medium (500) — Párrafos, texto de lectura
--font-weight-semibold (600) — Títulos, headings
--font-weight-bold (800) — Énfasis fuerte

Line heights

--line-height-tight (1.2)

Texto de ejemplo con line-height tight. Cada línea está más cercana a la siguiente, creando bloques densos de texto. Mayor densidad visual.

--line-height-normal (1.5)

Texto de ejemplo con line-height normal. Equilibrio entre densidad y legibilidad para textos corridos. El estándar del sistema.

--line-height-relaxed (1.8)

Texto de ejemplo con line-height relaxed. Máxima respiración vertical, ideal para bloques largos de lectura. Aire visible entre líneas.

Letter spacing

--letter-spacing-tight (-0.02em) — Tracking apretado
--letter-spacing-normal (0) — Tracking neutro
--letter-spacing-wide (0.02em) — Tracking abierto
--letter-spacing-display (0.35em) — DISPLAY UPPERCASE

Escala de espaciado (áurea)

Cada paso multiplica ~φ (1.618) · base 1rem = 16px

--space-1 · 0.309rem
--space-2 · 0.5rem
--space-3 · 0.618rem
--space-4 · 1rem
--space-5 · 1.309rem
--space-6 · 1.618rem
--space-8 · 2rem
--space-10 · 2.618rem
--space-12 · 3rem
--space-16 · 4.236rem
--space-20 · 5rem
--space-24 · 6.854rem

Tokens semánticos dimensionales: --space-card-padding (3.618rem), --space-card-image (13.708rem), --space-grid-min (15.326rem), --space-container-max (101.9rem). Los nombres antiguos en píxeles fueron eliminados en v3.0.0.

Botones

.btn + variantes modificadoras

Variantes

Especiales

Cards

.card con slots __header, __title, __body, __text

Card estándar

Contenido de ejemplo. Usa los tokens semánticos del sistema para texto, espaciado y fondos.

Card — warning

Variante modificadora .card--warning.

Sombras y radios

shadow-xs
shadow-sm
shadow-base
shadow-lg
shadow-xl

Spacing fluido

Tokens responsivos con clamp() para gaps y paddings

--gap · clamp(1.5rem, 4vw, 3.5rem)
--pad · clamp(1.2rem, 3vw, 2.5rem)

--gap para grids, --pad para contenedores. Escalan con el viewport, sin breakpoints.

Media tokens

Aspect ratios y object-fit como tokens del sistema

16 / 9

--aspect-ratio-landscape

1 / 1

--aspect-ratio-square

9 / 16

--aspect-ratio-reel

Scroll to Top

.c-scroll-top · componente flotante con animación

Fijado abajo-derecha. Clase .is-visible controla la aparición con fade + translateY. Animación bounce-up en el icono.

Slider

.c-slider · navegación horizontal por slides

Slide 1
Slide 2
Slide 3

Click izquierda/derecha para navegar. Transición: cubic-bezier(0.16, 1, 0.3, 1). JS: translateX(-N * slider.offsetWidth) por slide. Loop infinito con módulo.

Fade Scroll

.c-fade-scroll · opacidad controlada por scroll position

Patrón CSS + JS. El elemento desaparece gradualmente al hacer scroll.

data-fade-start="100" — scroll en px donde empieza el fade
data-fade-end="400" — scroll en px donde opacity llega a 0
opacity = 1 - (scrollY - start) / (end - start)

Usado en sergiofores para el hero section. La clase .c-fade-scroll aplica transition: opacity 0.1s linear y will-change: opacity.

Header y navegación

.pageheader + .menu · sistema completo de cabecera

Variantes: .pageheader--fixed, --sticky, --transparent, --dynamic. .menu--mobile-toggle para hamburger en mobile.

Hero

.hero-master · sección de impacto visual

Título Hero

Subtítulo con descripción breve del proyecto o servicio

Variantes: .hero-master--fullscreen (100svh), --image (background-image). .hero-title-master--inverse para texto claro sobre fondo oscuro.

Features Cards

.features__card · 8 variaciones para landing pages

Estándar

Categoría

Card estándar

Descripción del feature con texto de ejemplo.

Centered

Variante centrada sin categoría.

Color BG

Variante con fondo de color de marca.

Otras variantes: --bg-only (fondo imagen), --circular (aspect-ratio 1:1), --clickable (hover scale), --two-cols / --two-cols-reverse (imagen + texto).

Notificaciones

.notification · alertas y avisos

Aviso informativo

Contenido de la notificación con información relevante para el usuario.

Formularios

.form · campos, labels y estados de foco

Clases: .form (contenedor flex-column), .form--constrained (max-width áureo, centrado), .form__field (campo + label apilados), .form__label, .form__input. Estado :focus activa borde --color-accent-primary + sombra de halo. Funciona con input, textarea y select.

Dropdown

.dropdown · menú desplegable CSS puro, sin JS

Apertura por :focus-within en .dropdown — CSS puro, cero JavaScript. .dropdown__trigger contiene el label y la flecha SVG (.dropdown__arrow). .dropdown__content posicionado absolute bajo el trigger. .dropdown__list.dropdown__item.dropdown__link.

Iconos

.icon · SVG inline escalado en em, 4 tamaños

.icon 1em
.icon--sm 1.25em
.icon--lg 1.5em
.icon--xl 2em

Clase base .icon: 1em × 1em, stroke: currentColor, fill: none, stroke-width: 2. Escala relativa al font-size del contexto — coherente en cualquier tamaño de texto. Modificadores: --sm 1.25em · --lg 1.5em · --xl 2em.

Code Windows

.c-code · ventanas de código con syntax highlighting CSS puro

tokens.css
/* tokens.css */
:root {
  --text-large: clamp(2.618rem, calc(2.4rem + 1.09vw), 3.236rem);
  --color-brand-a: #00FFFF;
}
index.html
<section class="c-hero">
  <h1>Título principal</h1>
  <p>Subtítulo del proyecto</p>
</section>
slider.js
const slider = document.querySelector('[data-slider]');
// translateX en px absolutos
slider.style.transform = `translateX(-${offset}px)`;

Ventana de código estilo terminal con barra de título (3 dots + nombre de archivo). Syntax highlighting mediante clases semánticas CSS puro, sin JavaScript: .c-code__keyword (magenta) · .c-code__string (yellow) · .c-code__comment (gray-500, italic) · .c-code__property (cyan) · .c-code__value (accent-secondary) · .c-code__tag (accent-error). Fondo --color-gray-900, texto --color-gray-100, overflow-x: auto en pre para código largo.

Footer

.footer · pie de página con brand, links y social

Brand

Descripción breve del proyecto o empresa.

Enlaces

Social

Instagram · GitHub · YouTube

© 2026 Sergio Forés

Variantes: .footer--light, --accent, --tall.

Grid systems

Variantes de grid disponibles en layout.css

.grid--2-col

1/2
2/2

.grid--3-col

1/3
2/3
3/3

.grid--4-col

1
2
3
4

.grid--responsive-phi

auto-fit
minmax(250px, 1fr)
con gap áureo

Otras variantes: .grid--2-col-phi, --4-col-phi, --responsive-compact (gap: 0), --responsive-wide, .grid--cards, .grid--12-col. Column spans: .col-span-3/4/6/8/9.

.o-grid--breathing — respiración asimétrica

Grid editorial donde los hijos rompen el alineamiento rígido. Los offsets verticales y horizontales siguen la escala áurea inversa (φ⁻⁵ a φ⁻²) — misma proporción que el spacing, distinta unidad (% en vez de rem, porque el offset es proporcional al contenedor). Tokens: --offset-sm/md/lg/xl.

Escala de offset vertical (φ⁻⁵ → φ⁻²)

offset-top-sm
--offset-sm: 9%
φ⁻⁵ · sutil
offset-top-md
--offset-md: 14.6%
φ⁻⁴ · suave
offset-top-lg
--offset-lg: 23.6%
φ⁻³ · estándar
offset-top-xl
--offset-xl: 38.2%
φ⁻² · dramático

Offset en las 4 direcciones (con offset-lg)

↓ top
offset-top-lg
↑ bottom
offset-bottom-lg
→ left
offset-left-lg
← right
offset-right-lg

Tokens: --offset-sm (9%, φ⁻⁵), --offset-md (14.6%, φ⁻⁴), --offset-lg (23.6%, φ⁻³), --offset-xl (38.2%, φ⁻²).
Top: .o-grid__offset-top-sm/md/lg/xl. Bottom: .o-grid__offset-bottom-sm/md/lg/xl.
Left: .o-grid__offset-left-sm/md/lg/xl. Right: .o-grid__offset-right-sm/md/lg/xl.
Layout: .o-grid--breathing (55/45 en desktop, stack en mobile), .o-grid__span-rows, .o-grid__full.
Logical properties: top = block-start, bottom = block-end, left = inline-start, right = inline-end.

Posicionamiento de hijos en grid (place-self)

Grid 3×3 donde cada celda demuestra una combinación de justify-self + align-self. El elemento oscuro (~60×40px) se posiciona dentro de su celda de 120px de altura.

start start
center start
end start
start center
center center
end center
start end
center end
end end

Grid placement (grid-column / grid-row)

Grid de 3 columnas y 3 filas. Los hijos se posicionan con grid-column y grid-row explícitos — span de columnas, span de filas, ancho completo y celda concreta.

grid-column: 1 / 3
grid-row: 1
grid-column: 3
grid-row: 1 / 3
grid-column: 1
grid-row: 2
grid-column: 2
grid-row: 2
grid-column: 1 / -1 — ancho completo (≡ .o-grid__full)

Containers

.container-master · max-width con padding variants

.container-master — padding estándar
.container-master--compact — sin padding lateral
.container-master--wide — padding amplio

Section spacing

.section--spacing-* · ritmo vertical entre secciones

.section--spacing-sm
.section--spacing-md
.section--spacing-lg

Border radius

Escala de radios del sistema

none
sm
base
lg
full

Transitions

Duraciones y curvas de animación

Duraciones (hover para ver)

fast 0.15s
base 0.2s
slow 0.6s

Curvas (hover para ver)

linear
ease-out
custom

Utilities

Helpers atómicos de spacing

.p0
.p3
.m0
.mb0
.mb1

Cómo usar este showcase

  1. Ejecuta python3 -m http.server 8000 en la raíz de design-system/.
  2. Abre http://localhost:8000/showcase.html.
  3. Antes de cualquier cambio grande al sistema, abre el showcase y haz captura.
  4. Después del cambio, recarga y compara. Si algo se ve distinto no previsto, el cambio introdujo regresión.

Auditorías asociadas: docs/audit-design-system-2026-04-07.md, docs/audit-accessibility-2026-04-07.md, docs/audit-tech-debt-2026-04-07.md.