Índice maestro: assets con sha384, contracts cross-manifest, versión actual.
Sistema de diseño observable, no un catálogo de swatches.
La identidad visual de la Compañía de Innovación de Santiago, documentada como infraestructura. Tokens versionados, componentes con contrato, manifests JSON públicos y consumidores monitoreados en producción.
Cinco principios que gobiernan todo lo que sigue.
Antes que componentes, decisiones. Antes que tokens, criterio. La identidad de la Compañía no se distingue por un color: se distingue por la disciplina con la que se aplica.
-
P · 01
Mono-ink antes que color.
La paleta base es zinc warm de 50 a 900. El accent existe pero se usa con disciplina: links, focus rings, deltas en KPI, CTAs primarios. Nunca como decoración.
Plataforma /v6/cis.min.css servida con SRI integrity y cache-control granular. -
P · 02
Tipografía como primer ciudadano.
La jerarquía se construye con escala, peso y tracking. No con cajas y colores. Plex Sans 800 para hero; 600 para cuerpo de párrafo; mono para datos.
Heading 800 / -0.025em Body Plex 400 con line-height 1.55, máximo 60ch. jetbrains-mono · tabular-nums · v6.2.0 -
P · 03
Grid riguroso, asimetría intencional.
Modernismo Suizo (Müller-Brockmann, Hofmann, Ruder). 12 columnas, splits 5/7, 4/8, 3/9. Nunca 6/6 a menos que la simetría sea el mensaje.
-
P · 04
Bordes finos antes que sombras.
1px solid var(--cis-border). Las sombras pesadas son ruido. La separación se construye con líneas y negative space, no con elevación simulada.
Negative space generoso. Padding mínimo entre secciones: 4rem. Máximo: 7rem. Nunca menos. -
P · 05
Datos reales, no lorem.
Los KPIs leen de manifests live. Las tablas usan consumers reales. Si fetch falla, fallback hardcodeado. Lo que se ve en este brand book es lo que está corriendo en producción.
fetch('/v6/manifest.json') → commit bb5c85c · built 2026-05-06
IBM Plex Sans + JetBrains Mono.
Dos familias. Una para humanos, otra para datos. La escala modular ratio 1.25 hace toda la jerarquía.
Plex Sans · escala display
JetBrains Mono · datos
Tabular nums · alineación vertical
| Brand | Sites | Δ7d | Uptime |
|---|---|---|---|
| cis | 4 | +0,12% | 99,82% |
| cochid | 5 | +0,04% | 99,71% |
| indieweb | 2 | −0,18% | 99,55% |
| portal | 1 | +0,21% | 99,90% |
| periodismo2 | 1 | +0,03% | 99,68% |
Italic · emphasis editorial
«Tecnología tratada como infraestructura.»
Plex Serif italic 500 · solo para hero quotes
Decisión arquitectónica
Self-hosted IBM Plex Sans (400/500/600/700/800) + JetBrains Mono (400/500/700) en
/v6/fonts/.
Cero requests a Google Fonts CDN — privacy + GDPR + reproducibilidad.
ADR · typography-001 · parent ADR-021
Escala primaria · ink (zinc warm)
Variables semánticas · superficies y texto
Accent · una sola variable, tres estados
Semantic · estado, nunca decoración
Success
Deploy completado, auth ok, métricas en verde.
--cis-c-green · #15803dWarn
Cert expira pronto, latencia elevada, deprecation próxima.
--cis-c-amber · #d97706Error
Servicio caído, build fallido, contrato roto.
--cis-c-red · #dc2626Info
Mantenimiento programado, nueva versión disponible.
--cis-c-blue · #2563ebBaseline 8pt · grid 12 columnas.
La métrica vertical es múltiplo de 8. La horizontal es 12 columnas. Sin excepciones.
Escala de espaciado
Grid 12 col · split sample
Líneas verticales: 1px solid var(--cis-accent), 12 divisiones del contenedor.
47 símbolos · stroke 1.5 · resolución brand-aware.
Subset Lucide consistente, más 2 marks legacy. <cis-icon> resuelve por data-brand con fallback al master.
Cinco familias.
Una galería viva.
Cada clase está documentada en /v6/components.json con stable_since y variantes.
Layout y primitives
cards, tablas, formularios, alerts, badges, pills, stat-cards
Display y feedback
tabs, accordion, stepper, empty, skeleton, hero, code, avatar, breadcrumb
Iconografía
47 símbolos Lucide · web component cis-icon
Shell · web components
cis-navbar, cis-footer, cis-modal, cis-toast, cis-drawer, cis-tabs
Code blocks
cis-code inline · cis-code-block con line-numbers · variant terminal
Observatorio
Monitor de drift en consumers · uptime checks cada 15 min
16 brand books, una sola disciplina.
Un master cis y 15 derivados que sobreescriben únicamente accent y voz. Tokens en /v6/brands/<slug>/tokens.css. Marcas en /brand/<slug>/mark.svg.
Layouts brand-agnostic, listos para Caddy.
6 templates Swiss verificados por el observatorio. Login, errores 401/403/404/500/503. El brand activo se inyecta vía data-brand en el <body>.
22 sitios usando este sistema en producción.
Cada uno declara su brand, versión y templates en registry/consumers.yaml. El observatorio chequea drift cada 15 minutos.
| Slug | URL | Brand | Versión | Status | Uptime 24h |
|---|---|---|---|---|---|
| Cargando consumidores en vivo desde /v6/consumers.json… | |||||
monitor_frequency_minutes: 15 · data: /v6/consumers.json · vista completa: observatory
8 manifests JSON públicos.
Cada manifest tiene $schema, version y generated_at. Cache: 300s con must-revalidate. Assets binarios traen SRI integrity sha384.
$ curl https://style.innovacionsantiago.cl/v6/manifest.json | jq { "version": "6.2.0", "channel": "stable", "commit": "bb5c85c", ... }
16 brands con accent, voice_tone, sites_using, parent_attribution.
CSS classes y web components con stable_since, deprecated_since y variantes.
Templates UX brand-agnostic con required_components y status.
22 sitios live: brand_used, version_pinned, expected_components, owner_team.
Releases con kind (major/minor/patch), summary y affected_components.
Support matrix v4/v5/v6, deprecation_window, breaking_change_policy.
Control plane dinámico: footer copyright, navbar announcements, deprecation warnings.
Additive only dentro de v6.
Support matrix
Breaking change policy
Dentro de /v6/ solo se permiten cambios additive (minor) o fixes (patch). Cualquier cambio breaking — renombrar selector público, modificar atributo de custom element, eliminar token público, cambiar semántica de slot — requiere bump a /v7/. CI valida la regla vía scripts/validate-changelog.py.