Fundamentos de marca, tokens en tokens.css, tipografía y motion, criterios de uso y
catálogo de componentes en ui/ y patterns/.
Referencia del frontend L3: fundamentos (tokens), criterios de uso y catálogo de componentes. Colores
primitivos alineados con src/lib/tokens.ts para TypeScript, pruebas y documentación conjunta.
Criterios transversales para piezas institucionales y producto.
Priorizar comprensión inmediata: jerarquía tipográfica explícita, etiquetas legibles y carga de cognición baja en flujos críticos.
Reutilizar tokens y componentes del kernel; evitar hex, espaciados o radios ad hoc salvo casos documentados.
Identidad ING002 en color y degradados; extensiones digitales (azul, naranja, cobre) como capa de soporte, no como ruido visual.
La interfaz ordena el mensaje: titulares, datos y acciones siguen un orden lógico al escanear y al tabular con teclado.
Escala en múltiplos de 4px; en vistas densas (tablas, listas) mantener alineación y respiración mínima sin sacrificar legibilidad.
Toda pieza interactiva comunica reposo, foco, carga, error, éxito o vacío; el usuario nunca adivina si la acción sigue viva.
Resultados de API y validación: `Badge` (estado corto) o `Alert` / `.ui-feedback` (mensaje), nunca párrafos sin clase que parezcan labels.
Cada rol (paso, sección, etiqueta, control, hint) tiene tamaño, peso e interlineado fijos en `ui-form-composition.css`; no mezclar `Heading` de página con títulos de paso.
Diseñar primero para viewport estrecho (320–480px): una columna, botones y campos a ancho útil, `--layout-gutter` fluido; ampliar con `min-width: 48rem` (tablet), no con `max-width` salvo excepción documentada.
Términos legales y checkbox de aceptación al **principio** del flujo (nunca al final); enlace a página legible (`LEGAL_IDENTITY_TERMS_PATH` en `form-ux.ts`).
--radius-action (4px); pastilla lima conserva --radius-pill.--radius-surface (2px) en tarjetas, tablas y alertas.--control-height-md 48px; campos rectos vía --control-radius.--section-gap-*, --content-max 1088px, --layout-gutter, mobile-first (/ui#responsive).Variables CSS en :root. Cada muestra muestra token y valor activo.
Rojo energía
--coiirm-red Rojo hover
--coiirm-red-dark Blanco aluminio
--coiirm-white Blanco puro
--coiirm-white-pure Burdeos profundo
--coiirm-bordeaux Negro UI
--coiirm-black Verde sostenibilidad
--coiirm-lime Lima oscuro
--coiirm-lime-dark Lima profundo
--coiirm-lime-deep Texto sobre lima claro
--coiirm-lime-on-light Amarillo impulso
--coiirm-impulse Impulso (texto)
--coiirm-impulse-on-light Naranja digital
--coiirm-orange Extensión campaña
Azul institucional
--coiirm-blue Extensión digital
Noche 950
--coiirm-navy-950 Noche 900
--coiirm-navy-900 Noche 800
--coiirm-navy-800 Cobre
--coiirm-copper Cobre oscuro
--coiirm-copper-dark Cobre claro
--coiirm-copper-light Estado · OK
--state-full OK · texto suave
--state-full-on-soft Estado · degradado
--state-degraded Degradado · texto suave
--state-degraded-on-soft Estado · fallo
--state-failed Fallo · texto suave
--state-failed-on-soft --text-primary Burdeos corporativo para titulares y cuerpo.
--text-secondary Metadatos, ayudas y jerarquía reducida.
--text-link Acciones y navegación interactiva.
--text-on-brand Texto invertido en cabeceras y tarjetas oscuras.
Sobre lima plena: --text-on-surface-brand-lime. Sobre noche: --text-on-surface-brand-navy.
No usar texto claro sobre lima sólida ni burdeos sobre noche.
Lienzo
--surface-canvas Elevada
--surface-elevated Muted
--surface-muted Marca lima
--surface-brand-lime Marca noche
--surface-brand-navy Energía 2D
--gradient-energy Solo fondos; rojo dominante + verde + amarillo.
Energía hero
--gradient-energy-hero Radial para impacto / hero.
Franja ESG
--gradient-esg Institucional + digital.
Split marca
--gradient-brand-orange-navy Rojo → burdeos / noche.
Lima hero
--gradient-lime-hero Superficies verdes.
Familia Figtree en typography.css (pesos 300–800). Escala en --text-*.
Capa L3
--text-hero Título display
--text-2xl Sección
--text-xl Subtítulo
--text-lg Cuerpo estándar
--text-md Metadatos y UI densa
--text-sm Etiquetas · caps
--text-xs Light (300) — Ingenieros Murcia
Regular (400) — Ingenieros Murcia
Medium (500) — Ingenieros Murcia
Semibold (600) — Ingenieros Murcia
Bold (700) — Ingenieros Murcia
Extrabold (800) — Ingenieros Murcia
Un titular principal por vista; no saltar niveles. Usar componentes del DS.
El texto describe destino o acción (verbo + objeto). Evitar “clic aquí”.
Etiqueta visible por control; errores claros; acciones al final del bloque.
Orden de tabulación coherente; modales y acordeones gestionan foco.
Objetivo WCAG 2.1 AAA (≈7:1) en lienzo claro. No basar solo el estado en color.
Una columna y acciones apiladas en pantalla estrecha; ampliar layout en tablet+. Ver criterios en `/ui#responsive`.
Alt descriptivo; decorativas con alt vacío. Sin autoplay con sonido.
--state-*-on-soft.Section con clamp; gutter fluido; tabs y botones 48px.prefers-reduced-motion en motion.css; .font-tabular-nums para datos.Escala 4-based. Sección vertical: --section-gap-sm|md|lg.
--space-1 --space-2 --space-3 --space-4 --space-5 --space-6 --space-7 --space-8 --space-9 --space-10 --radius-sm 8px --radius-md 16px --radius-lg 24px --radius-xl 32px --radius-pill píldora --radius-action acción · 4px --radius-surface superficie · 2px --shadow-card --shadow-float --shadow-on-brand --border-subtle --border-default --border-strong Anillo de foco: --focus-ring-*. Prueba Tab sobre los botones.
--control-height-sm → 40px--control-height-md → 48px--control-height-lg → 56px--z-dropdown 40 · --z-sticky 80 · --z-modal 400 · --z-toast 500| Estado | Criterio |
|---|---|
| Reposo | Apariencia base sin interacción. |
| Hover | Retroalimentación al puntero; no sustituye el foco de teclado. |
| Foco | Anillo visible con tokens --focus-ring-*. |
| Pulsado / activo | Feedback breve al activar. |
| Deshabilitado | Sin acción; no confundir con solo lectura. |
| Carga | Indicador acotado; evitar bloquear contexto innecesariamente. |
| Error / inválido | Mensaje junto al control; color + texto. |
| Solo lectura | Diferenciado de deshabilitado. |
| Vacío | Mensaje orientativo y siguiente paso sugerido. |
Duraciones y curvas en motion.css. Keyframes con prefijo coiirm-.
| Token | Valor | Uso |
|---|---|---|
--motion-fast | 120ms | Hover, chips |
--motion-normal | 240ms | Transiciones UI |
--motion-slow | 480ms | Paneles, drawers |
--motion-admission | 680ms | Flujo admisión |
--motion-validation | 420ms | Validación |
--motion-degraded | 360ms | Estado degradado |
--motion-resync | 520ms | Resync |
--motion-replay | 640ms | Replay |
--ease-sentinel | cubic-bezier | Curva por defecto UI |
--ease-out-expo | cubic-bezier | Salidas largas |
--content-max 1088px--measure-prose 42rem--measure-wide 60rem| Nombre | px |
|---|---|
bp.mobile | 0 |
bp.tablet | 768 |
bp.desktop | 1280 |
bp.wide | 1600 |
--bp-phone 40rem (640px)--bp-tablet 48rem (768px)--bp-desktop 80rem (1280px)--bp-wide 100rem (1600px)
Criterio transversal UX/UI: estilos base para móvil; ampliaciones con @media (min-width: …)
en rem. Utilidades en src/styles/layout.css; shells con HubShell measure.
Reglas fijas de tipografía y ritmo vertical por rol. Implementación en
src/styles/ui-form-composition.css; pasos con FormStep.astro.
| Rol | Elemento | Clase | Tamaño | Peso | Interlineado | Casing |
|---|---|---|---|---|---|---|
| Paso multipaso | h2 | .ui-form-step__title | --form-step-title-size (1.25rem) | --form-step-title-weight (700) | --form-step-title-leading (1.3) | Frase («Paso 2»); sin uppercase |
| Bloque fieldset | legend | .ui-form-section__legend | --form-section-title-size (0.875rem) | --form-section-title-weight (600) | 1.3 | Frase; sin uppercase |
| Etiqueta de campo | label | .ui-label | --form-label-size (0.75rem) | --form-label-weight (600) | --form-label-leading (1.3) | MAYÚSCULAS + tracking-caps |
| Control (input) | input | .ui-input--md | --form-control-size (0.875rem) | 400 | --form-control-leading (1.5) | Tal cual el usuario escribe |
| Hint / error de campo | p | .ui-field__hint | .ui-field__error | --form-hint-size (0.75rem) | 400 | 600 (error) | --form-hint-leading (1.3) | Frase |
| Entrada esperada (máscara) | p | .ui-form-expected | --form-hint-size | 500 | 1.3 | Opcional; debajo del input; nunca PII sin enmascarar bien |
| Estado corto (API) | span | .ui-badge | --text-xs | 600 | 1.3 | MAYÚSCULAS (badge) |
| Mensaje inline (proceso) | p | .ui-feedback | --text-sm | 500 | 1.3 | Frase |
Lucide (ISC) vía icon-registry.ts y Icon.astro. Tamaños --icon-size-sm|md|lg.
2026-05-14
2026-05-16
public/favicon.svg es vector. PNG para Apple Touch y PWA desde coiirm-isotype-white.svg
(scripts/generate-brand-icons.mjs).
pnpm run icons:generatecoiirm-logo-white.svg / coiirm-logo-color.pngTexto sobre energía / hero — Titulares con `--text-on-energy-hero` y `--shadow-text-scrim-on-energy`. No usar lima #bdd339 como texto principal sobre degradados.
Heading — Preferir tono `onEnergyHero` sobre degradados; `limeOnEnergy` es alias retrocompatible.
NetworkBackground — Capa decorativa `aria-hidden`; opacidad baja; contenido significativo encima con z-index.
Lima plena — Usar `--text-on-surface-brand-lime`; no `--text-on-brand` (claro) sobre #bdd339.
SplitHeader e InfoBar — Texto `--text-on-brand`; badges sobre rojo/noche con `tone="onBrand"`, no `neutral`.
Lista generada desde src/styles/tokens.css (token-catalog.ts).
Regenerar con pnpm run tokens:catalog. Literales TS en src/lib/tokens.ts.
--accent-bar-esg --accent-bar-esg-width --border-default --border-on-brand --border-on-brand-strong --border-strong --border-subtle --border-width-hairline --border-width-strong --bp-desktop --bp-phone --bp-tablet --bp-wide --btn-danger-bg --btn-danger-bg-hover --btn-danger-fg --btn-ghost-on-lime-border --btn-ghost-on-lime-fg --btn-on-navy-bg --btn-on-navy-bg-hover --btn-on-navy-border --btn-on-navy-fg --btn-pill-on-lime-bg --btn-pill-on-lime-bg-hover --btn-pill-on-lime-border --btn-pill-on-lime-fg --btn-primary-bg --btn-primary-bg-hover --btn-primary-fg --card-padding-block --card-padding-inline --coiirm-black --coiirm-black-soft --coiirm-blue --coiirm-blue-soft --coiirm-bordeaux --coiirm-copper --coiirm-copper-dark --coiirm-copper-light --coiirm-impulse --coiirm-impulse-on-light --coiirm-impulse-soft --coiirm-lime --coiirm-lime-dark --coiirm-lime-deep --coiirm-lime-on-light --coiirm-lime-soft --coiirm-lime-wash --coiirm-navy-800 --coiirm-navy-900 --coiirm-navy-950 --coiirm-orange --coiirm-orange-dark --coiirm-orange-soft --coiirm-red --coiirm-red-dark --coiirm-red-soft --coiirm-white --coiirm-white-pure --content-max --control-bg --control-bg-muted --control-border --control-border-focus --control-border-hover --control-fg --control-height-lg --control-height-md --control-height-sm --control-on-navy-bg --control-on-navy-border --control-on-navy-fg --control-on-navy-placeholder --control-placeholder --control-radius --ds-vitrina-after-block-title --ds-vitrina-after-subhead --ds-vitrina-after-table --elevation-brand --elevation-floating --elevation-raised --figure-caption-fg --focus-ring-color --focus-ring-offset --focus-ring-width --form-error-fg --form-section-stack-gap --gallery-gap --gallery-radius --gradient-brand-orange-navy --gradient-energy --gradient-energy-hero --gradient-esg --gradient-esg-short --gradient-lime-hero --graph-node-on-lime-fill --graph-node-on-lime-stroke --graph-node-on-navy-stroke --graph-stroke-on-lime --graph-stroke-on-lime-strong --graph-stroke-on-navy --heading-underline-color-on-brand --heading-underline-color-on-canvas --heading-underline-height --hint-fg --hint-fg-on-brand --icon-size-lg --icon-size-md --icon-size-sm --icon-stroke --label-fg --label-fg-on-brand --layout-gutter --list-gap --list-marker-on-brand --list-marker-on-canvas --logo-strip-gap --measure-prose --measure-wide --page-padding-block --page-padding-block-lg --radius-action --radius-lg --radius-md --radius-pill --radius-sm --radius-surface --radius-xl --section-gap-lg --section-gap-md --section-gap-sm --separator-on-brand --separator-on-brand-subtle --shadow-card --shadow-float --shadow-on-brand --shadow-text-scrim-on-energy --space-1 --space-10 --space-2 --space-3 --space-4 --space-5 --space-6 --space-7 --space-8 --space-9 --split-header-min-height --state-degraded --state-degraded-on-soft --state-failed --state-failed-on-soft --state-full --state-full-on-soft --surface-brand-lime --surface-brand-lime-soft --surface-brand-navy --surface-brand-navy-mid --surface-canvas --surface-elevated --surface-energy-hero --surface-esg-band --surface-muted --table-border --table-header-bg --table-stripe --text-lime-on-energy --text-link --text-link-hover --text-on-brand --text-on-brand-muted --text-on-brand-strong --text-on-brand-subtle --text-on-energy-hero --text-on-lime-pressed --text-on-surface-brand-lime --text-on-surface-brand-lime-muted --text-on-surface-brand-navy --text-on-surface-brand-navy-muted --text-primary --text-secondary --timeline-line --timeline-node-border --timeline-node-fill --z-base --z-dropdown --z-modal --z-sticky --z-toast Icon.astro con name del catálogo. decorative o label según contexto.
Lista canvas
Lista sobre lima
Murcia
Presencial
Tarjeta con sombra.
Superficie muted.
Contorno sutil.
Texto inverso.
Texto burdeos.
Gradiente corporativo.
Composición fija en ui-form-composition.css · pasos con FormStep · bloques con
FormSection, FormLayout, FormProgress y FormSummary.
Ver roles tipográficos.
| Concepto | Valor |
|---|---|
| Capa | L3 Astro |
| Ledger | Sentinel L1 |
| L2 | Frappe |
Bloque rojo energía.
Bloque noche.
Capa NetworkBackground + contenido relativo. Texto con tokens de marca clara.
Columna ancha (2fr).
Barra lateral.