v1.0.0 — Perspective Design System

DepthSaaS
Design System

Directrices de sistema de diseño con estética Perspective — profundidad espacial isométrica, para plataforma B2B de analítica de marketing.

Poppins + Oswald Tipografía primaria + display
#00BD7D Color primario
WCAG 2.2 AA Nivel de accesibilidad
5 componentes Documentados
01. Tokens de Color
/* Design intent: high-contrast depth palette con profundidad visual isométrica */
Primary
--color-primary · #00BD7D
Primary Dark
--color-primary-dark · #009B67
Success
--color-success · #16A34A
Warning
--color-warning · #D97706
Danger
--color-danger · #DC2626
Background
--color-bg · #0F1923
Surface Card
--color-bg-card · #162030
Text
--color-text · #111827
Regla de uso: Usar siempre semantic tokens. Nunca hardcodear valores hex directamente en componentes. Los tokens de perspectiva (--shadow-iso, --shadow-btn) se aplican en capas para crear profundidad.
02. Tipografía
/* scale: 12/14/16/20/24/32 | fonts: Poppins, Oswald, JetBrains Mono */
Análisis de Campaña Q4 — Display Heading
Oswald 700 · 32px · uppercase · letter-spacing: 0.04em · token: --text-2xl
Rendimiento de Canales Digitales
Oswald 600 · 24px · token: --text-xl
Métricas de Conversión del Dashboard
Poppins 600 · 20px · token: --text-lg
El rendimiento de la campaña de paid media mostró un incremento del 23% en CTR durante la semana 3, con una reducción del CPA de 18€ a 14€. Los canales orgánicos mantuvieron estabilidad.
Poppins 400 · 16px · line-height: 1.6 · token: --text-base
Actualizado hace 5 min · Fuente: Google Analytics 4 + Meta Ads
Poppins 400 · 14px · color: --color-text-muted · token: --text-sm
const ctr = (clicks / impressions) * 100; // 3.42%
JetBrains Mono 400 · 12px · token: --text-xs · para: código, tokens, métricas
03. Botones
/* Perspective shadow crea profundidad en todos los estados interactivos */
Primary · sm / md / lg
Secondary · Ghost · Danger · Disabled
Estado
Descripción
Token aplicado
Default
Background + shadow-btn-primary
--shadow-btn-primary
Hover
translate(-1px,-1px) + shadow amplificado
transform + box-shadow
Focus
Ring verde 3px, visible en keyboard
--shadow-focus
Disabled
opacity: 0.5, cursor: not-allowed
opacity + cursor
04. KPI Cards
/* Efecto isométrico en hover: translate(-2,-3) + shadow depth */
📊
▲ +23.4%
€42,180
Revenue MRR
🎯
▲ +8.1%
3.42%
CTR promedio
⚡
▼ -4.2%
€14.80
CPA medio
📉
▼ -12.3%
68.4%
Tasa de retención
Anatomía: icon (40×40px, border-radius-md) · trend badge (mono font) · value (Oswald 700, 36px) · label (Poppins 14px, muted) · progress bar (4px, color por variante)
Variantes: kpi-primary · kpi-success · kpi-warning · kpi-danger — heredan el color del border y del bar-fill
05. Badges de Estado
/* Siempre JetBrains Mono · dot animado en live · uppercase + letter-spacing */
Live Atención Error Inactivo Nuevo
Regla must: El dot de badge-live debe incluir animación pulse-green para comunicar estado en tiempo real. El texto debe ser ≤ 2 palabras. No usar emojis como sustituto de badges de estado.
06. Inputs de Formulario
/* Focus ring = --shadow-focus · Error state = border-color danger + ring */
🔍
Default state — hover: border-opacity 0.15
📅
Populated state — valor formateado legible
⚠ Introduce un valor numérico válido (ej: 5000)
✓ Nombre disponible
Estado
Border
Ring / Shadow
Default
--color-border (8% white)
none
Focus
--color-border-focus (#00BD7D)
--shadow-focus (3px green ring)
Error
--color-danger (#DC2626)
ring rgba(220,38,38,0.2)
07. Navegación Lateral
/* Active indicator: 3px left border + subtle background */
Reglas de componente:
• Active: left-border 3px + background primary-subtle + color primary
• Hover: background rgba(255,255,255,0.04) + color surface
• Nav badges: Poppins 700, 10px, bg primary, color black
• Section labels: Mono 10px, uppercase, letter-spacing 0.1em
• Items: 9px vertical padding, height natural (no forzar 48px)

Responsive:
• Mobile (<768px): sidebar colapsa a bottom nav o hamburger
• Solo iconos en ancho <64px (modo colapsado)
• Tooltip en hover sobre iconos cuando colapsado
08. Elementos de Perspectiva
/* Técnicas de profundidad visual propias del Perspective Design */
📦
Hover para ver efecto perspectiva
perspective(800px) rotateX(-4deg)
Depth layers — box-shadow stack
--shadow-iso · --shadow-card
Spacing scale — 4px base grid
--space-1 4px
--space-2 8px
--space-4 16px
--space-6 24px
--space-8 32px
09. Accesibilidad — WCAG 2.2 AA
/* Ratio mínimo: 4.5:1 texto normal · 3:1 texto grande · 3:1 componentes UI */
#Aa
Primary (#00BD7D) sobre Background (#0F1923)
7.3:1
AAA
#Aa
Texto blanco (#FFF) sobre Surface Card (#162030)
15.1:1
AAA
#Aa
Warning (#D97706) sobre Background — texto grande
4.8:1
AA
#Aa
Muted text (#6B7280) sobre Background — solo decorativo, no info
3.1:1
DECORATIVO
Criterios testables:
[ ] Todos los botones accesibles por teclado (Tab, Enter, Space)
[ ] Focus ring visible en todos los elementos interactivos (--shadow-focus)
[ ] Los badges no transmiten info solo por color → siempre incluir texto o dot
[ ] Inputs de error tienen aria-invalid="true" y aria-describedby apuntando al mensaje
[ ] Sidebar tiene role="navigation" y aria-label="Navegación principal"
10. Anti-Patrones
/* Prohibiciones concretas para mantener coherencia del sistema */
✗ Dont
color: #009B67 — Hardcoded hex en componente

Botón con padding inconsistente: padding: 11px 22px (fuera del scale)
✓ Do
color: var(--color-primary-dark) — Semantic token

Padding correcto: padding: var(--space-3) var(--space-6)
✗ Dont
Badge que transmite estado solo con color (sin texto ni icono). El usuario daltónico no puede diferenciarlo.
✓ Do
Badge con dot + texto: Live — Color Y texto comunican estado.
✗ Dont
KPI card sin variante de color = pérdida de contexto semántico. Todas las cards iguales dificultan el escaneo visual rápido del dashboard.
✓ Do
Asignar variante según tipo de métrica: ingresos → primary, conversión → success, coste → warning, retención crítica → danger.
11. QA Checklist — Code Review
/* Ejecutar en cada PR que toque componentes del design system */
✓
¿Todos los colores usan semantic tokens (var(--color-*))?
✓
¿El spacing sigue el scale 4/8/12/16/24/32 (ningún valor intermedio sin justificación)?
✓
¿Los botones tienen los 4 estados: default, hover, focus-visible, disabled?
✓
¿El focus ring es visible y usa --shadow-focus? ¿Se puede navegar por teclado?
✓
¿Las KPI cards usan la variante de color semánticamente correcta para la métrica?
✓
¿Los efectos de perspectiva (hover transforms) tienen transition definido?
✓
¿Los inputs de error incluyen aria-invalid="true" y mensaje de error vinculado?
✓
¿La tipografía sigue: display → Oswald, cuerpo → Poppins, código/datos → JetBrains Mono?
✓
¿Contraste mínimo verificado con herramienta (4.5:1 texto normal, 3:1 texto grande)?
✓
¿Los badges transmiten información por texto, no solo por color?