¿Por qué Neobrutalism para STACKR?

STACKR es un SaaS B2B para equipos de desarrollo indie que necesita diferenciarse de Notion y Linear con una identidad visual cruda, honesta y de alto rendimiento. El sistema de diseño neobrutalism aporta legibilidad extrema, jerarquía visual inmediata y personalidad sin ambigüedades.

Intención de diseño: Toda la UI de STACKR debe sentirse como un sistema construido para productividad máxima — sin decoración superflua, sin ambigüedad en los estados interactivos, y con contraste que funcione en pantallas de baja calidad y modo oscuro.

Raw & Honest High Contrast Keyboard-first WCAG 2.2 AA

Design Tokens
Color Tokens
Aa
Primary #FDC800 CTAs, highlights, marcadores activos
Aa
Secondary #432DD7 Acciones secundarias, links, focus rings
Aa
Success #16A34A Confirmaciones, tareas completadas
Aa
Warning #D97706 Alertas, deadlines próximos
Aa
Danger #DC2626 Errores, acciones destructivas
Aa
Surface #FBFBF9 Background páginas, canvas
Aa
Text #1C293C Texto, bordes, sombras offset
Token CSS Valor Uso semántico Nunca usar para
--color-primary #FDC800 CTA principal, estado activo, marcador de foco alternativo Texto sobre blanco (ratio insuficiente)
--color-secondary #432DD7 Botones secundarios, links, focus rings Background de cards completas
--color-text #1C293C Todo el texto, bordes, sombras offset Fondos de pantalla completa
--color-surface #FBFBF9 Fondos de página, headers de cards Texto o labels
Typography Scale
--text-2xl
35px / weight 900
Display — Lanza proyectos
--text-xl
27px / weight 800
Heading 1 — Panel de tareas
--text-lg
21px / weight 700
Heading 2 — Sprint activo
--text-md
17px / weight 600
Heading 3 — Backlog refinement
--text-sm
15px / weight 400
Body — Gestiona tu equipo con claridad y velocidad desde el día uno.
--text-xs
13px / JetBrains Mono
LABEL — STATUS · METADATA · BADGES

Regla: Inter para todo el texto UI. JetBrains Mono SOLO para labels de categoría, badges de estado, bloques de código y metadatos técnicos. Nunca mezclar pesos dentro de un mismo bloque de párrafo.

Spacing Scale
sp-1 · 4px
4px
sp-2 · 8px
8px
sp-3 · 12px
12px
sp-4 · 16px
16px
sp-6 · 24px
24px
sp-8 · 32px
32px

Base: 4px. Usar exclusivamente múltiplos del scale. Sin valores ad-hoc.

Borders & Shadows
TokenValorAplicar en
--border2px solid #1C293CTODOS los elementos interactivos
--radius-sm4pxButtons, badges, inputs
--radius-md8pxCards, modales, panels
--shadow-sm3px 3px 0 #1C293CBadges, elementos pequeños
--shadow-md4px 4px 0 #1C293CBotones, inputs
--shadow-lg6px 6px 0 #1C293CCards hover, botones large

Las sombras SIEMPRE son offset (nunca blur/difusas). El color de sombra SIEMPRE es --color-text. Sin box-shadow con blur.


Component Library
Button — Anatomía, Variantes y Estados

Anatomía: [icon?] + label + [icon-trailing?] · Padding horizontal siempre ≥ sp-4 · Nunca texto en minúsculas en CTA primario.

EstadoBackgroundSombraTransformAccesibilidad
Default--color-primary--shadow-mdnonerole="button", aria-label si solo icono
Hover--color-primary--shadow-lgtranslate(-1px,-1px)cursor:pointer
Active / Pressed--color-primarynonetranslate(4px,4px)Visual imita presión física
Focus-visible--color-primary--shadow-mdnoneoutline: 3px solid --color-secondary, offset 2px
Disabled--color-primary @ 40%nonenonearia-disabled="true", pointer-events:none
Badge — Estados de Tarea
En progreso Revisión Completado Bloqueado Crítico Backlog

Regla: siempre border: var(--border). Texto en MAYÚSCULAS con font-family: var(--font-mono). Mínimo 2px de padding lateral. No usar más de 4 badges distintos en una misma card.

Input — Variantes y Estados
Máximo 60 caracteres
⚠ Email inválido. Formato: nombre@dominio.com

Focus ring: box-shadow: 0 0 0 3px var(--color-secondary). Error ring: 0 0 0 3px var(--color-danger). Label siempre encima del campo. Placeholder: color #aaa. La sombra offset se mantiene en todos los estados.

Card — Variantes de Proyecto
💻
STACKR Mobile
SPRINT 4 · 2 semanas
App móvil para iOS y Android con sincronización en tiempo real del tablero kanban.
📈
Dashboard v3
SPRINT 3 · Completado
Rediseño completo del panel de analíticas con nuevas métricas de velocidad de equipo.
🔒
API Integrations
PLANIFICADO · Q3 2026
Conectores nativos con GitHub, Linear y Figma para flujo de trabajo unificado.

Todas las cards interactivas deben tener box-shadow: var(--shadow-md) en default y --shadow-lg en hover con transform: translate(-1px,-1px). El footer de card siempre se separa con border-top: var(--border) y fondo --color-surface.

Alert — Feedback del Sistema
ℹ️
Sprint iniciado Sprint 5 comenzado el 14 jun 2026. Revisa los tickets asignados antes del daily.
Deploy completado STACKR v1.4.2 desplegado en producción sin errores. Tiempo: 42s.
Deadline en 48h 3 tareas críticas sin asignar en el sprint actual. Revisa el backlog.
Error de sincronización La integración con GitHub falló. Comprueba tu token de acceso en Configuración → Integraciones.

Requisitos WCAG 2.2 AA
Tabla de Contraste
CombinaciónRatioTexto normalTexto grande
Text sobre Surface 14.3:1 PASS PASS
Text sobre Primary 10.8:1 PASS PASS
White sobre Secondary 7.2:1 PASS PASS
White sobre Danger 4.9:1 PASS PASS
White sobre Success 4.5:1 PASS PASS
Primary sobre White 1.9:1 FAIL FAIL

⚠ PROHIBIDO usar #FDC800 como color de texto sobre fondos claros. Solo usarlo como background con texto #1C293C.

Criterios de Aceptación Testables
Focus ring visible — Todo elemento interactivo debe mostrar outline ≥ 3px al recibir foco por teclado (Tab). Verificable con :focus-visible en DevTools.
Teclado-primero — Cualquier acción disponible con ratón debe ser ejecutable con Tab + Enter/Space. Sin trampas de foco.
No solo color — Los estados de error/éxito/advertencia nunca deben comunicarse SOLO con color. Siempre acompañados de icono + texto descriptivo.
ARIA labels — Botones de solo icono deben incluir aria-label descriptivo. Modales deben tener role="dialog" + aria-labelledby.
Área de toque ≥ 44×44px — Todos los elementos interactivos en versión móvil deben cumplir WCAG 2.2 SC 2.5.8.

Prohibido en STACKR UI
✖ Prohibido

Gradientes en botones:

Los gradientes eliminan el contraste predecible y rompen la estética raw. Usar siempre backgrounds planos de token.

✖ Prohibido

Border-radius > 8px:

Bordes muy redondeados ablandan la identidad neobrutalism. Máximo --radius-md (8px) en cards, --radius-sm (4px) en buttons.

✖ Prohibido

Texto primary sobre blanco:

Texto en amarillo — ilegible

Ratio 1.9:1. NUNCA usar #FDC800 como color de texto. Solo como background.

✖ Prohibido

Sombras con blur:

Card con blur shadow

Las sombras difusas son incompatibles con neobrutalism. Usar SOLO sombras offset sólidas var(--shadow-md).

✖ Prohibido

Icono sin label en CTA principal:

Los CTAs primarios siempre incluyen texto visible. Solo se aceptan botones de solo icono en toolbars secundarias con aria-label.

✓ Correcto

Patrón correcto completo:

Activo

Background plano + border + shadow offset + texto legible + badge con estado.


Checklist de Implementación
TOKEN Todos los colores referencian variables CSS (var(--color-*)), sin valores hex literales en estilos de componente.
VISUAL Ningún elemento interactivo carece de border: var(--border). Verificar con buscador de estilos.
VISUAL Todas las cards con hover tienen box-shadow: var(--shadow-lg) y transform: translate(-1px,-1px).
A11Y Tab navigation funciona en todos los flows principales: crear tarea, cambiar estado, abrir modal.
A11Y Contraste verificado con axe DevTools en todas las pantallas. 0 errores de contraste.
TOKEN Espaciado usa solo valores del scale (4/8/12/16/24/32px). Sin margin: 10px o valores ad-hoc.
INTERACT Botones muestran translate(4px,4px) en estado :active. Verificar manualmente click/tap.
A11Y Focus ring visible en todos los inputs, buttons y links. Sin outline: none sin alternativa.
VISUAL Ningún border-radius supera var(--radius-md) (8px). Grep: border-radius: [9-9][0-9]px.
VISUAL Sin gradientes (linear-gradient, radial-gradient) en elementos interactivos.
A11Y Buttons de solo icono tienen aria-label descriptivo. Verificado con lector de pantalla (VoiceOver/NVDA).
INTERACT En móvil, todos los targets táctiles son ≥ 44×44px. Verificar con Chrome DevTools device mode.
📄
Guía de migración Si migrando desde diseño anterior: (1) reemplaza todos los border-radius: 12px+ por var(--radius-md); (2) elimina box-shadow con blur; (3) reemplaza linear-gradient por tokens planos; (4) añade border: var(--border) a cada elemento interactivo que carezca de él; (5) verifica contraste de cada combinación texto/fondo con axe.