Guía del Framework CSS — Design System Surco
Sistema de diseño basado en CSS puro (sin dependencias de frameworks externos como Tailwind, Bootstrap o Material). Reutilizable en cualquier plataforma web.
1. Archivos del Framework
| Archivo | Rol |
design-system-surco.css | Núcleo de estilos: variables, reset, componentes, responsive |
design-system-surco.js | Lógica de interactividad (toasts, selects avanzados, firma digital) |
2. Integración en un Nuevo Proyecto
Paso 1: Copiar los archivos
Copia design-system-surco.css y design-system-surco.js al directorio de assets de tu proyecto.
Paso 2: Vincular en HTML
<!-- En el head -->
<link rel="stylesheet" href="ruta/design-system-surco.css">
<!-- Al final del body -->
<script src="https://unpkg.com/lucide@latest/dist/umd/lucide.min.js"></script>
<script src="ruta/design-system-surco.js"></script>
<script>lucide.createIcons()</script>
Paso 3: Inicializar íconos
Los íconos usan Lucide. Después de cargar el script de Lucide, llama lucide.createIcons() para renderizar los íconos con data-lucide.
3. Tokens de Diseño (Variables CSS)
Todas las variables están definidas en :root al inicio de design-system-surco.css.
Espaciado
| Variable | Valor | Equivale a |
--s1 | 4px | Espaciado mínimo |
--s2 | 8px | Pequeño |
--s3 | 12px | Medio-pequeño |
--s4 | 16px | Medio |
--s5 | 20px | Medio-grande |
--s6 | 24px | Grande |
--s8 | 32px | Extra-grande |
--s10 | 40px | Máximo |
Colores
| Variable | Descripción |
--wh | Blanco |
--g1 – --g9 | Escala de grises (1=oscuro, 9=claro) |
--cp | Color primario (verde Surco) |
--cpd | Color primario oscuro |
--cs | Color secundario |
--cd | Color danger (rojo) |
--cpl | Color primario claro (fondo hover) |
--csl | Color secundario claro |
Tipografía
| Variable | Descripción |
--f | Familia: 'Chivo', sans-serif |
--tsm | 13px |
--tb | 14px |
--tmd | 16px |
--txs | 11px |
Bordes y Sombras
| Variable | Descripción |
--rmd | 8px (radio medio) |
--rlg | 12px (radio grande) |
--rfl | 999px (radio completo) |
--shsm | Sombra pequeña |
--shmd | Sombra mediana |
4. Clases de Componentes
Layout
| Clase | Descripción |
.nav | Barra de navegación superior (flex, 60px de alto) |
.nav-logo | Logo (icono + texto, flex-shrink:0) |
.nav-search | Contenedor de búsqueda (flex:1, max-width:460px) |
.nav-links | Links de navegación (visible en desktop, hidden en ≤900px) |
.nav-toggle | Botón hamburguesa (visible en ≤600px) |
.main | Contenido principal (min-width:0, padding responsivo) |
.sidebar | Barra lateral (hidden en ≤900px) |
.layout | Contenedor flex de sidebar + main |
Cards
| Clase | Descripción |
.card | Tarjeta con fondo blanco, borde y sombra |
.ch2 | Cabecera de tarjeta (padding, border-bottom, flex) |
.cht | Título de cabecera de tarjeta |
.cb | Cuerpo de tarjeta |
.cf | Pie de tarjeta |
Botones
| Clase | Descripción |
.btn | Base de botón |
.bp | Botón primario (fondo var(--cp)) |
.bo | Botón outline |
.bg2 | Botón secundario/ghost |
.bmd | Botón mediano |
.bsm | Botón pequeño |
.wf | width: 100% |
Inputs y Formularios
| Clase | Descripción |
.inp | Input estándar |
.inp.err | Input con error |
.sel | Select estilizado |
.il | Label de input |
.ig | Input group |
Badges y Estados
| Clase | Descripción |
.bdg | Badge base |
.bdg.dng | Badge danger (rojo) |
.bdg.dwn | Badge warning (naranja) |
.bdg.dok | Badge success (verde) |
.bdg.dnt | Badge neutral (gris) |
.dot | Punto indicador |
Tabs
| Clase | Descripción |
.tabs | Contenedor de tabs (flex, overflow-x:auto) |
.tab | Tab individual (flex-shrink:0) |
.tab.act | Tab activo |
Tooltips
| Clase | Descripción |
.ttp-wrap | Contenedor relativo (inline-flex) |
.ttp | Tooltip (absoluto, fondo g9) |
.ttp.ttp-right | Tooltip a la derecha |
.ttp.ttp-bottom | Tooltip abajo |
Filter Bar
| Clase | Descripción |
.flt-bar | Barra de filtros (flex, flex-wrap) |
.flt-search | Campo de búsqueda |
.flt-group | Grupo label+select |
.flt-sel | Select de filtro |
.flt-chip | Chip de filtro activo |
.flt-results | Contador de resultados |
Header App
| Clase | Descripción |
.hdr-wrap | Wrapper del header |
.hdr | Header flex (64px, background var(--cp)) |
.hdr-brand | Marca (icon + texto) |
.hdr-nav | Navegación interna |
.hdr-actions | Acciones (iconos, avatar) |
.hdr-sub | Sub-nav |
.hdr-user | Usuario (avatar + nombre + rol) |
Dashboard
| Clase | Descripción |
.sc2 | Stat card (flex, min-width:190px) |
.si | Stat icon (48x48, flex-center) |
.sv | Stat value |
.sl | Stat label |
Tablas
| Clase | Descripción |
.tw | Table wrapper (overflow-x:auto, border) |
table | Tabla (width:100%, border-collapse) |
thead th | Header de tabla |
tbody tr | Fila (hover) |
td | Celda |
Upload Zone
| Clase | Descripción |
.upld-zone | Zona de drop (border dashed) |
.upld-list | Lista de archivos |
.upld-item | Item de archivo |
.upld-item-info | Info del archivo (flex:1) |
.upld-item-name | Nombre (ellipsis) |
.upld-progress | Barra de progreso |
Signature Pad
| Clase | Descripción |
.sig-pad-wrap | Wrapper del canvas |
.sig-canvas | Canvas de firma |
.sig-actions | Actions bar |
5. Utilidades de Layout
| Clase | Descripción |
.flex | display: flex |
.fw | flex-wrap: wrap |
.g2, .g3, .g4 | Gap (8px, 12px, 16px) |
.ic | align-items: center |
.is | align-items: flex-start |
.wf | width: 100% |
6. Breakpoints Responsive
| Breakpoint | Ancho | Comportamiento |
| > 900px | Desktop | Sidebar visible, nav-links visibles, búsqueda visible |
| ≤ 900px | Tablet | Sidebar oculto, nav-links ocultos, búsqueda visible |
| ≤ 720px | Tablet pequeño | Dashboard cards a 100%, header wrap, tabs scroll |
| ≤ 640px | Móvil grande | Tipography rows apiladas verticalmente |
| ≤ 600px | Móvil | Nav-toggle visible, búsqueda oculta, menú hamburguesa |
| ≤ 420px | Móvil pequeño | Logo texto oculto (solo icono) |
7. Personalización y Temas
Cambiar colores primarios
Sobrescribe las variables en tu CSS antes de importar el framework:
:root {
--cp: #YOUR_PRIMARY_COLOR;
--cpd: #DARKER_VARIANT;
--cpl: #LIGHTER_VARIANT;
}
Cambiar espaciado
:root {
--s4: 20px;
}
Tema oscuro
[data-theme="dark"] {
--wh: #1a1a2e;
--g1: #0f0f1a;
--g9: #e0e0e0;
--g5: #888;
}
8. Implementación por Plataforma
React / Next.js
// Copiar archivos
cp design-system-surco.css src/styles/
cp design-system-surco.js src/lib/
// En _app.js o layout.js
import 'styles/design-system-surco.css';
import 'lib/design-system-surco.js';
Vue / Nuxt
// nuxt.config.ts
export default defineNuxtConfig({
css: ['~/assets/css/design-system-surco.css'],
scripts: [
{ src: 'https://unpkg.com/lucide@latest/dist/umd/lucide.min.js', defer: true },
{ src: '~/assets/js/design-system-surco.js', defer: true }
]
})
Angular
// angular.json
"styles": ["src/styles/design-system-surco.css"],
"scripts": [
"https://unpkg.com/lucide@latest/dist/umd/lucide.min.js",
"src/assets/js/design-system-surco.js"
]
HTML Puro
<link rel="stylesheet" href="design-system-surco.css">
<script src="https://unpkg.com/lucide@latest/dist/umd/lucide.min.js"></script>
<script src="design-system-surco.js"></script>
<script>lucide.createIcons()</script>
9. Ejemplo Mínimo
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="design-system-surco.css">
</head>
<body>
<nav class="nav">
<a href="#" class="nav-logo">Mi App</a>
</nav>
<main class="main">
<div class="card">
<div class="ch2"><span class="cht">Bienvenido</span></div>
<div class="cb">
<p>Contenido de la tarjeta.</p>
<button class="btn bp bmd">Acción Principal</button>
</div>
</div>
</main>
<script src="https://unpkg.com/lucide@latest/dist/umd/lucide.min.js"></script>
<script src="design-system-surco.js"></script>
<script>lucide.createIcons()</script>
</body>
</html>
10. Notas de Mantenimiento
- No editar
design-system-surco.css directamente en proyectos derivados. Crea un archivo CSS de overrides.
- Variables CSS: todas las variables están en
:root, lo que permite sobrescribirlas fácilmente.
- Lucide Icons: el framework depende de Lucide para íconos. Si no necesitas íconos, usa SVG inline directamente.
- Responsive: los breakpoints están en el CSS. Para agregar nuevos, extiende los
@media existentes.
- Versionado: sigue versionado semántico (
major.minor.patch).
© 2026 Centro de Operaciones C4 — Municipalidad de Santiago de Surco.