Volver al UI Kit

sistema-de-diseno.md

Sistema de Diseño — v1.3

Estética: minimalista tipo Apple (superficies limpias, blur, transiciones sutiles). Modo: solo claro. Tecnología: agnóstico — los tokens están en variables CSS y valen para HTML puro, React, Vue o lo que elijas. Este documento es la fuente de verdad. La página interactiva (UI Kit) debe implementar exactamente lo aquí definido. UI Kit en vivo: https://style.pgrhub.es (el propio documento se sirve en https://style.pgrhub.es/sistema).


1. Principios

  1. Contenido primero. El diseño desaparece; lo que destaca es el dato o la acción.
  2. Jerarquía por peso y espacio, no por color. El color se reserva para acciones y estados.
  3. Un solo acento. El azul es la única voz de acción en toda la app.
  4. Movimiento con propósito. Toda animación responde a una interacción; nada se mueve solo.
  5. Profundidad por material, no por bordes. Se usan blur y sombras suaves en lugar de líneas duras.

2. Tokens de color

Definidos como variables CSS en :root.

2.1 Neutros (fondos y texto)

Token Valor Uso
--bg-page #F5F5F7 Fondo general de la aplicación
--bg-surface #FFFFFF Tarjetas, tablas, paneles, modales
--bg-surface-2 #FAFAFC Superficies secundarias (cabecera de tabla, filas alternas)
--bg-material rgba(255,255,255,0.72) Superficies translúcidas (header, sidebar) — siempre con blur
--text-primary #1D1D1F Texto principal
--text-secondary #6E6E73 Texto de apoyo, descripciones, labels
--text-tertiary #AEAEB2 Placeholders, texto deshabilitado
--border #E5E5EA Separadores y bordes por defecto
--border-strong #D2D2D7 Bordes de inputs y controles

2.2 Acento y semánticos

Token Valor Hover Pressed Uso
--accent #0071E3 #0077ED #006EDB Acciones, enlaces, selección, focus
--accent-soft #EAF3FE Fondo de elementos activos (ítem de sidebar, chip seleccionado)
--success #34C759 Confirmaciones, estados OK
--warning #FF9500 Avisos
--danger #FF3B30 #FF453A #E0342B Errores, acciones destructivas
--danger-soft #FEECEB Fondo de mensajes de error

Reglas de uso del color: - Nunca dos acentos distintos compitiendo en la misma vista. - Los semánticos solo comunican estado; no se usan como decoración. - El texto sobre acento o semánticos es siempre blanco #FFFFFF.


3. Tipografía

Fuente: stack del sistema — así en Mac/iOS se renderiza SF Pro (la de Apple) automáticamente.

font-family: -apple-system, BlinkMacSystemFont, "SF Pro Text",
             "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;

Alternativa si se quiere idéntica en todas las plataformas: Inter (Google Fonts).

Escala tipográfica

Rol Tamaño / línea Peso Tracking Uso
Display 34 / 40 px 700 −0.02em Título de página principal
Título 1 28 / 34 px 700 −0.015em Secciones grandes
Título 2 22 / 28 px 600 −0.01em Cabeceras de tarjeta / modal
Título 3 17 / 24 px 600 0 Subsecciones
Cuerpo 15 / 22 px 400 0 Texto general, celdas de tabla
Cuerpo fuerte 15 / 22 px 600 0 Énfasis dentro del cuerpo
Caption 13 / 18 px 400 0 Labels, ayudas, metadatos
Micro 11 / 14 px 500 +0.01em Badges
Micro caps 11 / 14 px 500 +0.06em Micro compuesto en MAYÚSCULAS: cabecera de tabla, labels de grupo de sidebar, labels de estado

Micro caps (añadido en v1.1): cuando Micro se compone en mayúsculas, el tracking sube a +0.06em para compensar la caja alta. Los badges (caja mixta) mantienen +0.01em.


4. Espaciado, radios y sombras

4.1 Espaciado — base 4 px

4 · 8 · 12 · 16 · 24 · 32 · 48 · 64

4.2 Radios

Token Valor Uso
--radius-sm 8 px Inputs, botones pequeños, chips
--radius-md 12 px Botones estándar, dropdowns
--radius-lg 16 px Tarjetas, tablas, modales
--radius-full 999 px Toggles, avatares, badges, pills

4.3 Sombras (elevación)

Token Valor Uso
--shadow-1 0 1px 3px rgba(0,0,0,0.06) Tarjetas en reposo
--shadow-2 0 4px 16px rgba(0,0,0,0.08) Dropdowns, tarjeta en hover
--shadow-3 0 12px 40px rgba(0,0,0,0.14) Modales, popovers

Las sombras son siempre neutras y difusas. Nunca sombras duras ni de color.

4.4 Material translúcido (blur)

Firma visual del sistema. Se aplica a header, sidebar y popovers:

background: var(--bg-material);
backdrop-filter: saturate(180%) blur(20px);
-webkit-backdrop-filter: saturate(180%) blur(20px);

5. Movimiento

Token Valor Uso
--ease cubic-bezier(0.25, 0.1, 0.25, 1) Curva por defecto
--ease-spring cubic-bezier(0.34, 1.56, 0.64, 1) Toggles y elementos que "rebotan" sutilmente
--dur-fast 150 ms Hover, cambios de color
--dur-med 250 ms Aparición de dropdowns, toasts
--dur-slow 350 ms Modales, colapso de sidebar

Reglas: - Solo se animan opacity, transform, color, background-color y box-shadow (rendimiento). - Efecto "pressed" universal: transform: scale(0.97) durante el clic. - Respetar prefers-reduced-motion: si está activo, las transiciones se reducen a cambios instantáneos de color.


6. Iconos

Estados de un icono interactivo (ej. botón de icono)

Estado Especificación
Default Color --text-secondary, fondo transparente
Hover Color --text-primary, fondo rgba(0,0,0,0.05), radio --radius-sm, transición 150 ms
Pressed Fondo rgba(0,0,0,0.09) + scale(0.94)
Activo/seleccionado Color --accent, fondo --accent-soft
Deshabilitado Color --text-tertiary, cursor: not-allowed, sin hover

Área táctil mínima: 40 × 40 px aunque el icono mida 20 px.


7. Botones

Altura estándar 40 px (compacto 32, grande 48). Padding horizontal 20 px. Radio --radius-md. Tipografía Cuerpo fuerte (15/600). Icono opcional a 20 px con gap de 8 px.

7.1 Primario

Estado Fondo Texto Extra
Default --accent blanco
Hover #0077ED blanco transición 150 ms
Pressed #006EDB blanco scale(0.97)
Focus (teclado) --accent blanco anillo: box-shadow: 0 0 0 4px rgba(0,113,227,0.25)
Deshabilitado #D2D2D7 blanco sin eventos
Cargando --accent al 80% spinner blanco 16 px, texto oculto, ancho fijo

7.2 Secundario

Fondo #F0F0F2 (gris relleno estilo Apple), texto --text-primary, sin borde. Hover #E8E8ED · Pressed #E0E0E5 + scale · Deshabilitado: texto --text-tertiary.

7.3 Terciario / Ghost

Fondo transparente, texto --accent. Hover: fondo --accent-soft. Pressed: #DCEBFD (accent-soft más saturado) + scale.

7.4 Destructivo

Igual que el primario pero con la escala --danger. Se reserva para acciones irreversibles y siempre va precedido de confirmación.


8. Formularios

8.1 Campo de texto

Estado Especificación
Hover Borde #B8B8BF
Focus Borde --accent + anillo 0 0 0 4px rgba(0,113,227,0.15), transición 150 ms
Error Borde --danger + anillo rojo suave; mensaje debajo en Caption --danger
Deshabilitado Fondo --bg-surface-2, texto --text-tertiary

8.2 Toggle (interruptor iOS)

8.3 Checkbox y radio

8.4 Select / Dropdown

8.5 Segmented control (muy Apple)


9. Tabla

Estado de fila Especificación
Hover Fondo #F7F7F9, transición 150 ms
Seleccionada Fondo --accent-soft + checkbox marcado
Clicable cursor: pointer + chevron gris al final que se oscurece en hover

10. Sidebar

Estado de ítem Especificación
Default Texto e icono --text-secondary
Hover Fondo rgba(0,0,0,0.05), texto --text-primary
Activo Fondo --accent-soft, texto e icono --accent, peso 600
Pressed scale(0.98)

11. Header


12. Componentes de apoyo

Tarjeta

Fondo --bg-surface, radio --radius-lg, --shadow-1, padding 24 px. Si es clicable: hover --shadow-2 + translateY(-2px).

Modal

Toast

Badge / Chip

Variante Fondo Texto
Éxito #E8F8EC #1F7A34
Aviso #FFF4E5 #A05A00
Error --danger-soft #C0281E
Info --accent-soft #0059B4
Neutro #F0F0F2 --text-secondary

Tooltip

Fondo #1D1D1F, texto blanco Caption, radio --radius-sm, padding 6×10 px. Aparece tras 400 ms de hover con fade 150 ms.

Tabs

Texto Cuerpo --text-secondary; activa: --text-primary 600 + subrayado 2 px --accent que se desliza entre pestañas (250 ms).

Alert inline (añadido en v1.3)

Mensaje persistente dentro de la página (el toast es efímero; el alert se queda hasta que se resuelve o se cierra).

Menú contextual (añadido en v1.3)

Acciones secundarias desde un botón de icono (⋯) o cualquier disparador.

Breadcrumbs (añadido en v1.3)

Progreso (añadido en v1.3)

Skeleton (añadido en v1.3)

Tarjeta KPI (añadido en v1.3)

Lista de actividad (añadido en v1.3)


13. Accesibilidad (mínimos obligatorios)


14. La página UI Kit (el "template de prueba")

La página interactiva que quieres construir debe mostrar, en este orden:

  1. Fundamentos: muestras de todos los colores (con su hex al lado), escala tipográfica renderizada, radios y sombras aplicados a cajas de ejemplo, y demos de movimiento (duraciones y curvas reproducibles al clic, ida y vuelta).
  2. Botones: las 4 variantes × todos los estados. Los estados hover/pressed/focus se prueban en vivo, y además una fila "congelada" que los muestra forzados para poder compararlos.
  3. Iconos: grid con los 5 estados del §6, clicables para ver la transición real.
  4. Formularios: cada control en default, focus, error y disabled; el toggle y el segmented funcionando.
  5. Tabla completa: con orden, hover, selección, acciones en hover, paginación y estado vacío.
  6. Layout real: una demo con sidebar + header + contenido, donde se pueda colapsar la sidebar y hacer scroll para ver el blur del header.
  7. Apoyo: tarjeta, modal (botón que lo abre), toast (botón que lo dispara), badges, tooltip, tabs, y desde v1.3: alert inline, menú contextual, breadcrumbs, progreso, skeleton, tarjeta KPI y lista de actividad.
  8. Plantillas: tarjetas-enlace a las páginas de ejemplo completas de §15 (login, dashboard, ajustes, error).

Cada bloque lleva al pie sus tokens en chips copiables (etiqueta «Tokens de este bloque · clic para copiar»): al pulsar un chip se copia el valor exacto para pegarlo en el CSS del proyecto que se esté desarrollando.


15. Plantillas de página

Patrones de pantalla completa, montados solo con piezas de este documento. En el UI Kit viven bajo /plantillas/* y cada una lleva una píldora flotante «Volver al UI Kit» (material + blur, --shadow-2, inferior derecha).

15.1 Login

15.2 Dashboard

15.3 Ajustes

15.4 Página de error (404/500)


16. Registro de cambios

Cualquier componente nuevo debe definirse aquí antes de implementarse.