Design System: bootstrap tokens + paleta brand El Día #13

Merged
dmolinari merged 9 commits from chore/design-system-tokens into main 2026-04-16 15:00:27 +00:00
Owner

Summary

Bootstrap del Design System antes de empezar el trabajo de UI/UX/responsive.

index.css reescrito:

  • Migración de tokens HSL → OKLCH (Tailwind 4 native, mejor manipulación de color)
  • Paleta brand escalada desde #008fbe (logo El Día) a brand-50..950
  • Paleta neutral cool slate (complementa el brand-blue)
  • Semantic tokens: --success, --warning, --destructive
  • Background off-white tinted brand (no pure white) — warmth sutil
  • Dark mode usa neutral-950 (no pure black) — menos cansancio visual
  • Brand utilities expuestos via @theme inlinebg-brand-500, text-brand-700, etc.
  • Focus rings con --ring = brand-500 (light) / brand-400 (dark)
  • ::selection con brand-200/800
  • Personality: sobrio profesional (Linear/Vercel/Stripe Dashboard)
  • Density compact (botones 32-36px, inputs 36px, table rows 40px)
  • Light + Dark default = system preference (useTheme() ya lo soporta)

.atl/skill-registry.md: agregada sección "Design System (frontend)" con compact rules para auto-inyección en sub-agents.

Documentación completa (en Obsidian, gitignored localmente): 02-ARQUITECTURA-y-TECH-STACK/2.14 🎨 Design System.md — tabla completa de OKLCH shades, principios, patrones (forms, tables, toasts), workflow de cambios, referencias.

Engram: topic_key sig-cm2/design-system con TL;DR y reglas no negociables para recall rápido en futuras sesiones.

Pointer en INSTRUCCIONES_IA.md: nueva sección "Regla de Diseño Visual" obliga a leer 2.14 antes de cualquier cambio frontend.

Test plan

  • cd src/web && npx vitest run — 136/136 verde
  • Visual smoke en dev (npm run dev): verificar contraste botones primary, hover sidebar con brand tint, focus rings, dark mode toggle
  • Verificar que componentes shadcn existentes (Button, Card, Input, Tabs, Dropdown) se ven bien con la nueva paleta sin cambios

Próximos pasos (post-merge)

  1. Setup shadcn MCP server (decisión 3.1) → Claude instala componentes on-demand
  2. Instalar componentes faltantes priorizados: table + TanStack Table, select, combobox, popover, tooltip, pagination, breadcrumb, alert-dialog
  3. Refactor incremental de UsersTable con priority columns + tap-to-expand
  4. Refactor de forms con grid responsive según regla (≥5 campos = 2-col)
## Summary Bootstrap del Design System antes de empezar el trabajo de UI/UX/responsive. **`index.css` reescrito**: - Migración de tokens HSL → **OKLCH** (Tailwind 4 native, mejor manipulación de color) - Paleta **brand** escalada desde `#008fbe` (logo El Día) a `brand-50..950` - Paleta **neutral** cool slate (complementa el brand-blue) - **Semantic** tokens: `--success`, `--warning`, `--destructive` - Background **off-white tinted** brand (no pure white) — warmth sutil - Dark mode usa `neutral-950` (no pure black) — menos cansancio visual - Brand utilities expuestos via `@theme inline` → `bg-brand-500`, `text-brand-700`, etc. - Focus rings con `--ring` = brand-500 (light) / brand-400 (dark) - `::selection` con brand-200/800 - Personality: sobrio profesional (Linear/Vercel/Stripe Dashboard) - Density compact (botones 32-36px, inputs 36px, table rows 40px) - Light + Dark default = system preference (`useTheme()` ya lo soporta) **`.atl/skill-registry.md`**: agregada sección "Design System (frontend)" con compact rules para auto-inyección en sub-agents. **Documentación completa** (en Obsidian, gitignored localmente): `02-ARQUITECTURA-y-TECH-STACK/2.14 🎨 Design System.md` — tabla completa de OKLCH shades, principios, patrones (forms, tables, toasts), workflow de cambios, referencias. **Engram**: topic_key `sig-cm2/design-system` con TL;DR y reglas no negociables para recall rápido en futuras sesiones. **Pointer en `INSTRUCCIONES_IA.md`**: nueva sección "Regla de Diseño Visual" obliga a leer 2.14 antes de cualquier cambio frontend. ## Test plan - [x] `cd src/web && npx vitest run` — 136/136 verde - [x] Visual smoke en dev (`npm run dev`): verificar contraste botones primary, hover sidebar con brand tint, focus rings, dark mode toggle - [x] Verificar que componentes shadcn existentes (Button, Card, Input, Tabs, Dropdown) se ven bien con la nueva paleta sin cambios ## Próximos pasos (post-merge) 1. Setup **shadcn MCP server** (decisión 3.1) → Claude instala componentes on-demand 2. Instalar componentes faltantes priorizados: `table` + TanStack Table, `select`, `combobox`, `popover`, `tooltip`, `pagination`, `breadcrumb`, `alert-dialog` 3. Refactor incremental de UsersTable con priority columns + tap-to-expand 4. Refactor de forms con grid responsive según regla (≥5 campos = 2-col)
dmolinari added 1 commit 2026-04-16 13:46:35 +00:00
- Reemplazo de tokens HSL por OKLCH (Tailwind 4 native)
- Brand color #008fbe escalado a brand-50..950
- Neutral cool slate (complementa brand)
- Semantic: success/warning/destructive como tokens
- Background tinted off-white (no pure white) para warmth
- Dark mode usa neutral-950 (no pure black)
- Brand utilities expuestos via @theme inline (bg-brand-500, etc)
- Focus rings con ring brand color
- Selection con brand-200/800

Skill registry actualizado con compact rules de design system para auto-inyeccion en sub-agents.

Source of truth: Obsidian/02-ARQUITECTURA-y-TECH-STACK/2.14 Design System.md
Engram: sig-cm2/design-system
dmolinari added 1 commit 2026-04-16 14:03:00 +00:00
Cambios principales:
- Agregado violet accent (oklch 0.62 0.20 280) para combo tech con brand cyan
- Neutrals con shift sutil hacia hue 250 (slate-violet)
- Dark mode con bg oklch(0.135 0.018 252) — no pure black, feel mas tech
- Inputs con token --input propio (white en light, elevado en dark) y --input-border mas prominente. Fixea problema de input gris feo
- Card soporta variant glass/elevated/default
- Multi-layer shadows reales (shadow-sm/md/lg/xl/glow)
- Gradient mesh utility (.gradient-mesh + token --gradient-mesh)
- Clase .glass para glassmorphism (backdrop-blur 20px + saturate 180%)
- Border radius default 10px (era 8px) — mas moderno
- Headings con tracking-tight -0.015em

LoginPage redesigned:
- PublicLayout con gradient mesh + 2 glow blobs (brand+violet) + grid sutil
- Card variant glass para el form
- Logo mark con bg-gradient-to-br from-brand-500 to-violet-500
- Inputs con bg propio + ring brand glow al focus

Tests: 136/136 verde.
Doc Obsidian 2.14 actualizado v2.0. Engram sig-cm2/design-system actualizado.
dmolinari added 1 commit 2026-04-16 14:05:41 +00:00
El ThemeToggle solo vivia en AppHeader (ProtectedLayout), por lo que
desde /login era imposible cambiar el tema. Movido a esquina superior
derecha con z-index 20 sobre el gradient mesh.

useTheme defaultea a system preference, pero el usuario tiene que poder
override desde cualquier pantalla — incluido el login.
dmolinari added 1 commit 2026-04-16 14:10:09 +00:00
Cambios:
- index.css: fix de browser autofill (Chrome/Safari forzaba bg amarillo +
  texto blanco que rompia contraste). Override -webkit-text-fill-color
  + box-shadow inset para mantener tokens del DS. Esta era la causa real
  de las 'letras blancas en gris' que se veian en login.
- index.css: utility .grid-bg global (7% opacity light, 10% dark) — para
  usar como fondo cuadriculado en todos los layouts.
- PublicLayout: agrego .grid-bg layer + bg-background explicito + glow
  blobs mas intensos (25%/20% en light vs 10% antes). Light ahora
  tiene la misma profundidad visual que dark.
- ProtectedLayout: agrego .grid-bg + glow blobs sutiles en corners para
  dar profundidad al dashboard y todas las secciones internas. Resalta
  futuros componentes glass.

Tests: 136/136 verde.
dmolinari added 1 commit 2026-04-16 14:15:38 +00:00
Cambios de tokens:
- Light --background: 0.988 -> 0.962 (slate cool, hace pop el card white)
- Dark --background: 0.135 -> 0.130 (mas oscuro)
- Dark --card: 0.180 -> 0.220 (salto +0.090 vs bg, antes solo +0.045)
- Dark --popover: 0.200 -> 0.245 (popovers/dropdowns aun mas elevados)
- Dark --secondary/muted/accent/input: bumpeados al nivel correspondiente
  para que la jerarquia visual mantenga proporciones

Card variants:
- default: shadow-sm -> shadow-md (mas elevacion default)
- nuevo variant 'flat' (sin shadow) para cuando se necesite

Nueva utility .surface:
- Mismo treatment visual que <Card variant='default'> pero como clase
  CSS — para contenedores que no usan el componente Card (ej: tablas,
  listas custom). bg-card + border + radius + shadow-md.

UsersTable refactorizado para usar .surface en lugar de border manual.
Cualquier futura tabla/lista usa .surface por consistencia.

Tests 136/136 verde.
dmolinari added 1 commit 2026-04-16 14:21:43 +00:00
Cambios:
- Nuevo hook useSidebar() con persistencia en localStorage
  ('sidebar-collapsed' = '1'/'0').
- SidebarNav refactorizado:
  - Width controlled internamente (w-60 expanded, w-[68px] collapsed)
  - Toggle button al pie con PanelLeftClose/Open icon
  - Brand mark con gradient brand+violet (consistencia con login)
  - Active indicator: barra vertical sutil a la izquierda cuando expanded,
    bg accent cuando collapsed
  - SectionLabel se reemplaza por divider sutil cuando collapsed
- Custom SidebarTooltip puro CSS (sin radix dep nuevo) que aparece
  a la derecha del item con animacion fade + slide al hover. Funciona
  con group-hover/item y group-hover/toggle (Tailwind named groups).
- Items disabled muestran badge 'Próx.' chico (era 'Próximamente' largo)
  y en tooltip cuando collapsed: 'Label · Próximamente'.
- Fix scroll horizontal: overflow-x-hidden en nav, truncate en spans,
  shrink-0 en iconos y badges. Layout robusto a labels largos.
- ProtectedLayout deja de hardcodear lg:w-60 — sidebar controla su width.
- AppHeader Sheet (mobile) usa <SidebarNav forceExpanded /> para que
  en mobile siempre se vea expanded sin importar el state desktop.

Tests 136/136 verde.
dmolinari added 1 commit 2026-04-16 14:26:42 +00:00
Cambios:
- Instalado @radix-ui/react-tooltip 1.2.8 (componente faltante de
  shadcn/ui que faltaba en el set inicial).
- Nuevo src/web/src/components/ui/tooltip.tsx (shadcn pattern):
  TooltipProvider, Tooltip, TooltipTrigger, TooltipContent con
  animaciones data-state (fade + zoom + slide direccional).
- App.tsx: TooltipProvider envuelve toda la app con delayDuration 150ms.
- AppSidebar refactorizado:
  - Toggle button MOVIDO al header (top), al lado izquierdo del nombre
    'SIG-CM 2.0'. Eliminado boton bottom (era redundante).
  - Cuando collapsed: solo el toggle visible centrado (68px width).
  - Cuando expanded: [Toggle] [SIG-CM 2.0] aligned left.
  - Quitado overflow-hidden del aside (era lo que impedia que los
    tooltips fueran visibles — los clipping containers padres tampoco
    importan ahora porque Radix portalea el tooltip a body).
  - Tooltips en TODOS los items collapsed (incluido el toggle) y en
    items disabled muestra 'Label · Próximamente'.
  - Eliminado el componente CSS-only SidebarTooltip (reemplazado por
    Radix que se renderiza fuera del DOM tree con Portal).

El bug original era que tanto el aside con overflow-hidden como el
ProtectedLayout con overflow-hidden clipean cualquier elemento que
intente escapar via absolute positioning. Radix Portal soluciona
eso renderizando el tooltip en document.body.

Tests 136/136 verde.
dmolinari added 1 commit 2026-04-16 14:32:10 +00:00
Sincroniza con doc Obsidian 2.14 v2.3 y engram sig-cm2/design-system:
- Agrega violet accent y nueva guidance
- Density bumpeada a 40px (input h-10), radius 10px base
- Utilities CSS (.glass/.gradient-mesh/.grid-bg/.surface/.focus-glow)
- Card variants ampliados
- Tooltip Radix obligatorio (no CSS absolute en sidebars)
- Sidebar colapsable con useSidebar
- TooltipProvider y Toaster ya en App.tsx
- Browser autofill fix mencionado
dmolinari added 1 commit 2026-04-16 14:54:17 +00:00
shadcn MCP server registrado globalmente (claude mcp add -s user shadcn -- npx -y shadcn@latest mcp). Disponible en cualquier sesion/proyecto.

8 componentes shadcn nuevos via CLI (cd src/web && npx shadcn@latest add ...):
- table, select, popover, pagination, breadcrumb, alert-dialog
- command, dialog (deps de combobox y alert-dialog)
Total instalados ahora: 22

Fix gotcha shadcn CLI: agregado compilerOptions.paths al root tsconfig.json
(sino crea folder literal '@/' en lugar de resolver el alias). Antes solo
estaba en tsconfig.app.json que el CLI no lee.

@tanstack/react-table 8.21 instalado.

Nuevo componente <DataTable> generico (src/web/src/components/ui/data-table.tsx):
- Wrapper sobre TanStack Table
- Priority columns: meta { priority: 'high' | 'medium' | 'low' }
  → hidden md:table-cell / hidden lg:table-cell automatico
- Tap-to-expand row mobile (chevron auto-aparece cuando hay cols hidden,
  click despliega panel con hidden cells como dl/dt/dd)
- Loading state con DataTableSkeleton
- Empty state customizable
- onRowClick callback con stop-propagation correcto en chevron
- 14 tests cubriendo todas las features

Refactor UsersTable a DataTable como dogfood (mismo output visual,
columnas con priority alta/media/baja). 150 tests frontend totales verde.

Doc Obsidian 2.14 v2.4 actualizado con seccion DataTable completa,
componentes ampliados a 22, MCP global, y gotcha del tsconfig.

Engram sig-cm2/design-system actualizado a v2.4.

Skill registry actualizado con compact rules de DataTable y MCP.
dmolinari merged commit d201d9e08e into main 2026-04-16 15:00:27 +00:00
Sign in to join this conversation.
No Reviewers
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: dmolinari/SIG-CM2.0#13