Centinela · Design System
Catálogo navegable de tokens y componentes canónicos. Esto es el "Storybook" del proyecto: si vas a diseñar o codear UI nueva, parte de aquí. Si necesitas algo que no existe, propónlo antes de implementarlo.
Fuente de verdad markdown: docs/design-system/
Colores
Brand (Silvano deep teal + mid teal). Escala de grises 50–900 (sustituye los hex Tailwind hardcoded). Status colors con variantes light/bright.
Brand
Grays
Status
Tipografía
Familia display Red Rose 700 para titulares. Helvetica Neue para body. Escala de 9 tamaños (--text-xs a --text-4xl). Mínimo legible: 12 px.
--text-xs · 11px --text-sm · 12px --text-base · 14px --text-md · 15px --text-lg · 16px --text-xl · 18px --text-2xl · 22px --text-3xl · 28px --text-4xl · 48px Spacing
Escala base 4 px. Usa estos tokens en padding, margin, gap. Nunca números mágicos.
--space-14 px · gap mínimo--space-28 px · gap pequeño, padding badges--space-312 px · padding inputs--space-416 px · spacing base--space-520 px · padding modal--space-624 px · margin entre cards--space-832 px · page sections--space-1040 px · padding hero--space-1248 px · bloques distintos--space-1664 px · hero spacingRadius & Shadow
6 radios canónicos, 3 elevaciones de sombra.
Border radius
Shadow
Inputs
Form controls canónicos.
Cards
Contenedor canónico para agrupar contenido. Variants: clickable, light (Cotos).
EXTERIOR 2
3 zonasEdge node M4
Offline 4 hBadges
Pequeños indicadores de estado.
Tabs
Tables
Sin zebra. Hover sutil. Columnas numéricas alineadas a la derecha.
Modals
Patrón canónico único. Sin scroll global — sólo el body interno scrollea si el contenido excede el viewport. Backdrop oscuro con blur. ESC + click backdrop cierran.
Editar finca
Los cambios se aplican al confirmar.
Toasts
Notificaciones efímeras. Auto-dismiss tras 5 s.
Empty states
Cuando una lista, tabla o tab está vacía, NUNCA dejar silencio. Mostrar contexto + CTA.
Sin grabaciones todavía
Cuando una cámara grabe, aparecerá aquí.
Antes / Después
Ejemplos concretos de mejoras en uso real del panel actual.
Botón inline → componente canónico
❌ Antes (inline hardcoded)
<button style="padding:8px 14px;
background:var(--emerald);color:white;border:none;
border-radius:6px;font-size:13px;
cursor:pointer;">Guardar</button>
✓ Después (canónico)
<button class="btn btn-primary">
Guardar cambios
</button>
Texto pequeño ilegible → tamaño mínimo legible
❌ Antes (font-size: 12px)
Última actualización: hace 3 minutos · Polling cada 30 s · Próximo check en 14 segundos
10 px sobre fondo claro y color var(--gray-300) (gray-300) → contraste 1.4 : 1, invisible.
✓ Después (12 px, --gray-600)
Última actualización: hace 3 minutos · Polling cada 30 s · Próximo check en 14 segundos
12 px + gray-600 → contraste 7.5 : 1 sobre fondo claro. Legible.
Modal con scroll del documento → body interno scrollea
❌ Antes (scroll global)
<div class="modal" style="
height: 800px; /* no cabe en viewport */
overflow: auto;
">...</div>
Body de la página entera scrollea junto al modal. Pierdes contexto al desplazarte.
✓ Después (sólo modal-body scrollea)
<div class="modal">
<header class="modal-header">...</header>
<div class="modal-body">
/* SÓLO esto scrollea */
</div>
<footer class="modal-footer">...</footer>
</div>
Modal header y footer siempre visibles. Sólo el contenido interno scrollea cuando es largo.