Files
reformix-hackaton/design/design-system.md
2026-05-27 10:27:27 +02:00

487 lines
21 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Reformix — Design System
**Fecha:** 24-may-2026
**Fuente:** [specs.md](../specs.md) + [copy/COPY-GUIDE.md](../copy/COPY-GUIDE.md) + [negocio/modelo-negocio.md](../negocio/modelo-negocio.md)
**Stack:** Next.js 14 + Tailwind + shadcn/ui
> **Filosofía:** Cada decisión visual aquí tiene traducción directa a token de código en `design-tokens.css` y `tailwind.config.ext.js`. Si un color no está en los tokens, no existe. Si un espaciado no está en la escala, no se usa.
---
## 1. Contexto y personalidad de marca
### Proyecto
**Reformix***"Un mercado de reformas más justo. Para los profesionales que cumplen lo que prometen."*
SaaS B2B para empresas pequeñas de reformas en España, con captación de leads del cliente final a través de agente IA de voz + render + presupuesto entregado por WhatsApp.
### Audiencias visuales
| Audiencia | Perfil | Implicación visual |
|---|---|---|
| **Reformista** (paga el SaaS) | Hombre 35-55, técnico de obra, perfil tech medio-bajo, usa WhatsApp, no le impresiona el diseño chulo, le impresiona la utilidad clara | Cero hipsterismo, claridad brutal, jerarquía evidente, datos sobre estilo |
| **Cliente final** (usa el widget) | Hombre/mujer 30-65, propietario de vivienda, dispuesto a invertir 10-50 K€, tiene miedo de equivocarse | Tranquilizador, tipográficamente legible, tonos cálidos que no asusten, evitar agresividad visual |
### Personalidad de marca
| Eje | Valor | Por qué |
|---|---|---|
| **Adjetivo 1** | **Profesional** | Es una herramienta de trabajo, no de juego. Los reformistas dependen de su credibilidad. |
| **Adjetivo 2** | **Cercano** | El producto compite con marketplaces fríos (Habitissimo) y CRMs aburridos. La cercanía es diferencial. |
| **Adjetivo 3** | **Honesto** | El sector está "deshonesto" según la entrevista. Posicionarnos como árbitros justos exige una estética que respalde eso. |
| **NO somos** | **Corporativo frío · spammy · hipster techie** | Nada de azul corporativo genérico. Nada de "next-gen AI-powered platform". Nada de Comic Sans irónico ni gradientes psicodélicos. |
### Referencias visuales
- **Linear** — rigor tipográfico, jerarquía clara, dark mode sólido.
- **Notion** — calidez, accesibilidad, espacios generosos.
- **Stripe** — profesionalidad sin frialdad, tipografía con carácter.
- **Holded** (referencia española B2B) — confiable, claro, no innovador agresivo.
**NO referencia:** Habitissimo, Wallapop, idealista (demasiado marketplace/portal); cualquier "AI startup template" de Vercel; landings con animaciones 3D innecesarias.
---
## 2. Identidad verbal
> Reglas detalladas en [copy/COPY-GUIDE.md](../copy/COPY-GUIDE.md). Resumen aquí para alinear con visual.
### Tono
- **Tuteo** universal. Reformista y cliente final.
- **Frases cortas**, 2-3 líneas máximo por párrafo.
- **Honestidad explícita** sobre limitaciones: *"Es orientativo. Tu visita sigue siendo la que cierra."*
- **Lenguaje del sector** cuando aplique: showrooming, calidad básica/media/premium, ticket medio.
- **Sin jerga corporativa**: no "optimizar pipeline", no "next-gen", no "transformación digital".
### Naming
- **Producto:** Reformix (sin tilde, sin guión, una palabra).
- **Producto interno:** *Asistente IA* (cara visible del agente de voz) en vez de "voicebot" o "agente conversacional".
- **Métricas internas para reformista:** *Leads cualificados* (no "captados" ni "prospects"), *Visita gratuita*, *Presupuesto orientativo* (no "presupuesto").
- **Planes:** Starter / Pro / Business (estándar SaaS).
- **Sello futuro:** *Precio Justo Certificado* (sin "®" ni tipo corporativo). Mayúscula inicial siempre.
---
## 3. Color
### 3.1 Paleta primaria — "Architectural Warmth"
Decisión: rechazamos el azul SaaS genérico. Adoptamos una paleta inspirada en la cerámica y los acabados naturales — habla el lenguaje del sector sin caer en lo rústico.
#### Brand colors
| Token | Hex | Uso | Justificación |
|---|---|---|---|
| `--color-primary-900` | `#1F3A2E` | Texto en superficies claras, headings | Verde bosque oscuro: serio, sólido, asociado a "natural" sin ser ecológico panfletario |
| `--color-primary-700` | `#2F5C46` | Botones primarios, links activos | Verde oliva profundo: profesional, transmite "experiencia" |
| `--color-primary-500` | `#4D8A6D` | Acento medio, hover de botones | |
| `--color-primary-300` | `#A8C8B5` | Backgrounds suaves, badges | |
| `--color-primary-100` | `#E8F0EB` | Backgrounds muy suaves, hover states | |
| `--color-primary-50` | `#F4F8F5` | Background de sección destacada | |
#### Accent (terracota)
| Token | Hex | Uso |
|---|---|---|
| `--color-accent-900` | `#7A3517` | Énfasis muy fuerte (rara vez) |
| `--color-accent-600` | `#C25E33` | CTAs secundarios destacados, alertas no críticas, highlights |
| `--color-accent-400` | `#E08A5F` | Iconos decorativos, badges |
| `--color-accent-100` | `#FAEAE0` | Background de bloques destacados |
> El terracota se usa con **moderación**: el CTA principal es verde oliva (primary-700), el terracota es para llamar la atención sobre un solo elemento en cada vista.
### 3.2 Neutrales (Stone — warm gray con tinte oliva)
| Token | Hex | Uso |
|---|---|---|
| `--color-neutral-950` | `#161816` | Texto sobre fondo blanco — el negro más cálido |
| `--color-neutral-900` | `#262826` | Headings sobre fondo claro |
| `--color-neutral-700` | `#4A4E4A` | Texto body principal |
| `--color-neutral-500` | `#7A807A` | Texto secundario, placeholders |
| `--color-neutral-400` | `#9DA29D` | Texto disabled, separadores |
| `--color-neutral-300` | `#C4C9C4` | Bordes |
| `--color-neutral-200` | `#DDE0DD` | Bordes suaves, líneas divisorias |
| `--color-neutral-100` | `#EDEFED` | Backgrounds muy suaves, cards alternas |
| `--color-neutral-50` | `#F7F8F7` | Background secundario |
| `--color-white` | `#FFFFFF` | Background principal, surfaces |
### 3.3 Escala semántica
| Token | Hex | Uso |
|---|---|---|
| `--color-success-700` | `#2D7A4F` | Texto de success en badges |
| `--color-success-500` | `#4DAA73` | Iconos de success, bordes |
| `--color-success-100` | `#E0F0E6` | Background de mensajes de success |
| `--color-warning-700` | `#9A6B0E` | Texto warning |
| `--color-warning-500` | `#DA9A2C` | Iconos warning |
| `--color-warning-100` | `#FAEFD3` | Background warning (banner licencia urbanística) |
| `--color-danger-700` | `#A8331F` | Texto error |
| `--color-danger-500` | `#D85940` | Iconos error |
| `--color-danger-100` | `#FAE0DA` | Background error |
| `--color-info-700` | `#1F5C7A` | Texto info |
| `--color-info-500` | `#3D8AAA` | Iconos info |
| `--color-info-100` | `#DDEDF5` | Background info |
### 3.4 Surfaces y combinaciones validadas (WCAG AA)
| Combinación | Contraste | OK |
|---|---|---|
| `neutral-950` sobre `white` | 16.5:1 | ✅ AAA |
| `neutral-700` sobre `white` | 7.8:1 | ✅ AAA |
| `neutral-500` sobre `white` | 4.6:1 | ✅ AA |
| `white` sobre `primary-700` | 7.2:1 | ✅ AAA — botón primario |
| `white` sobre `accent-600` | 4.8:1 | ✅ AA — botón terracota |
| `primary-900` sobre `primary-50` | 12.4:1 | ✅ AAA — texto en bloques destacados |
| `danger-700` sobre `danger-100` | 6.1:1 | ✅ AA — mensajes de error |
> **Regla:** ningún texto debe usar `neutral-400` o más claro sobre fondo blanco (no pasa AA).
---
## 4. Tipografía
### 4.1 Selección
| Rol | Fuente | Por qué |
|---|---|---|
| **Display + Headings (H1, H2)** | **Instrument Serif** (Google Fonts) | Serif moderna con carácter. Da "peso editorial" que diferencia frente al SaaS-Inter genérico. Suena profesional sin ser corporativo. Pesa muy poco. |
| **Sub-headings (H3, H4, H5)** | **Inter** | Misma familia que el body para coherencia. Semibold da jerarquía sin cambio de fuente. |
| **Body + UI** | **Inter** | Estándar de legibilidad universal. Funciona en móvil. La conocen todos los devs. |
| **Mono (rara vez — código, ID, datos técnicos)** | **JetBrains Mono** | Estándar dev-friendly. Solo para panel de leads y debug. |
> **Decisión consciente:** evitar fuentes "techie" tipo Geist o IBM Plex. Inter es boring pero universal, y Instrument Serif aporta el carácter sin pedir permiso.
### 4.2 Escala tipográfica (modular ratio 1.25 — Major Third)
| Token | Tamaño | Line-height | Uso típico |
|---|---|---|---|
| `text-xs` | 12px / 0.75rem | 1.5 | Captions, footnotes, badges |
| `text-sm` | 14px / 0.875rem | 1.5 | Labels de form, secondary text, helper |
| `text-base` | 16px / 1rem | 1.6 | **Body por defecto** (mínimo legible móvil) |
| `text-lg` | 18px / 1.125rem | 1.5 | Body grande, intros, microcopy hero |
| `text-xl` | 20px / 1.25rem | 1.4 | H5, subhead pequeño |
| `text-2xl` | 24px / 1.5rem | 1.3 | H4 |
| `text-3xl` | 30px / 1.875rem | 1.3 | H3 |
| `text-4xl` | 36px / 2.25rem | 1.2 | H2 |
| `text-5xl` | 48px / 3rem | 1.1 | H1 mobile, headings de sección |
| `text-6xl` | 60px / 3.75rem | 1.05 | H1 desktop, hero |
| `text-7xl` | 72px / 4.5rem | 1.0 | Display hero desktop (raro) |
### 4.3 Pesos cargados
| Familia | Pesos | Justificación |
|---|---|---|
| Instrument Serif | 400 (regular), 400 italic | Diseñada para una sola weight, pero italic da énfasis en titulares |
| Inter | 400, 500, 600, 700 | Regular body, medium labels, semibold botones y H3-H5, bold solo para énfasis fuerte |
| JetBrains Mono | 400, 500 | Muy poco uso |
### 4.4 Reglas de uso
- **H1 hero (desktop):** Instrument Serif, `text-6xl`, regular. Sin negrita.
- **H1 hero (mobile):** Instrument Serif, `text-5xl`, regular.
- **H2 sección:** Instrument Serif, `text-4xl`, regular.
- **H3-H5:** Inter Semibold, `text-3xl` / `text-2xl` / `text-xl`.
- **Body por defecto:** Inter Regular, `text-base`, line-height 1.6, color `neutral-700`.
- **Labels de form:** Inter Medium, `text-sm`, color `neutral-900`.
- **Botones:** Inter Semibold, `text-base` (md) / `text-sm` (sm) / `text-lg` (lg).
- **Captions y helper text:** Inter Regular, `text-sm`, color `neutral-500`.
---
## 5. Espaciado y layout
### 5.1 Escala de espaciado (base 4px — coherente con Tailwind)
| Token | Valor | Uso típico |
|---|---|---|
| `space-1` | 4px / 0.25rem | Gaps mínimos entre iconos y texto |
| `space-2` | 8px / 0.5rem | Padding interno compacto (badges, pills) |
| `space-3` | 12px / 0.75rem | Gap entre elementos relacionados |
| `space-4` | 16px / 1rem | Padding estándar de inputs y cards pequeños |
| `space-6` | 24px / 1.5rem | Separación entre bloques de un mismo grupo |
| `space-8` | 32px / 2rem | Padding de cards grandes, márgenes de sección móvil |
| `space-12` | 48px / 3rem | Separación entre secciones móvil |
| `space-16` | 64px / 4rem | Separación entre secciones desktop |
| `space-24` | 96px / 6rem | Padding vertical del hero |
| `space-32` | 128px / 8rem | Separación generosa entre bloques desktop grandes |
### 5.2 Contenedores y grid
| Token | Valor | Uso |
|---|---|---|
| `container-narrow` | 720px | Bloques de lectura largos (FAQ, T&C) |
| `container-default` | 1200px | Landings, app general |
| `container-wide` | 1440px | Panel del reformista con muchas columnas |
| `gutter-mobile` | 24px | Padding lateral móvil |
| `gutter-desktop` | 48px | Padding lateral desktop |
### 5.3 Breakpoints (Tailwind defaults)
| Token | Valor | Dispositivo |
|---|---|---|
| `sm` | 640px | Móvil grande / phablet |
| `md` | 768px | Tablet portrait |
| `lg` | 1024px | Tablet landscape / desktop pequeño |
| `xl` | 1280px | Desktop estándar |
| `2xl` | 1536px | Desktop grande |
---
## 6. Componentes base
### 6.1 Border radius
| Token | Valor | Uso |
|---|---|---|
| `rounded-sm` | 4px | Tags, badges pequeños |
| `rounded-md` | 6px | Inputs, controles pequeños |
| `rounded-lg` | 10px | Botones, cards, contenedores |
| `rounded-xl` | 14px | Cards destacadas, hero blocks |
| `rounded-2xl` | 20px | Modales, popovers grandes |
| `rounded-full` | 9999px | Avatares, pills de estado, iconos circulares |
> **Personalidad:** redondeado generoso (10-14px en cards) — friendly, moderno, pero no infantil (evitamos 24px+ en bloques que no sean decorativos).
### 6.2 Sombras (warm, sutiles)
| Token | Valor | Uso |
|---|---|---|
| `shadow-xs` | `0 1px 2px rgba(22, 24, 22, 0.05)` | Bordes muy sutiles, divisores elevados |
| `shadow-sm` | `0 1px 3px rgba(22, 24, 22, 0.08), 0 1px 2px rgba(22, 24, 22, 0.04)` | Cards estáticos, inputs |
| `shadow-md` | `0 4px 6px rgba(22, 24, 22, 0.07), 0 2px 4px rgba(22, 24, 22, 0.04)` | Cards interactivos, hover |
| `shadow-lg` | `0 10px 15px rgba(22, 24, 22, 0.08), 0 4px 6px rgba(22, 24, 22, 0.05)` | Dropdowns, popovers |
| `shadow-xl` | `0 20px 25px rgba(22, 24, 22, 0.1), 0 10px 10px rgba(22, 24, 22, 0.04)` | Modales |
| `shadow-glow` | `0 0 0 4px rgba(47, 92, 70, 0.15)` | Focus ring (primary-700 al 15 %) |
> Sombras con base de `neutral-950` (no negro puro) para coherencia con la paleta cálida.
### 6.3 Botones
| Variante | Background | Texto | Border | Uso |
|---|---|---|---|---|
| **Primary** | `primary-700` | `white` | — | CTA principal único por vista. *"Empezar gratis 14 días"*, *"Quiero mi presupuesto"* |
| **Secondary** | `white` | `primary-700` | `primary-700` 1px | Acciones secundarias. *"Ver demo"* |
| **Accent** | `accent-600` | `white` | — | Solo para acciones de waitlist o "Próximamente". Máximo 1 por vista. |
| **Ghost** | `transparent` | `neutral-700` | — | Navegación, acciones de tercer nivel |
| **Danger** | `danger-500` | `white` | — | Eliminar lead, revocar consentimiento |
| **Link** | `transparent` | `primary-700` underline | — | Enlaces dentro de texto |
#### Estados
| Estado | Modificación |
|---|---|
| Default | Como tabla arriba |
| Hover | Background 10 % luminosidad / opacity 0.95 |
| Active | Background 15 % luminosidad / scale-95 |
| Disabled | Opacity 0.5, cursor not-allowed |
| Loading | Spinner inline, texto invisible o "Cargando..." |
| Focus | `shadow-glow` (focus ring 4px al 15 % primary) |
#### Tamaños
| Tamaño | Padding | Font | Height |
|---|---|---|---|
| `sm` | `px-3 py-1.5` | `text-sm` semibold | 32px |
| `md` (default) | `px-4 py-2.5` | `text-base` semibold | 44px |
| `lg` | `px-6 py-3.5` | `text-lg` semibold | 52px |
### 6.4 Inputs
| Atributo | Valor |
|---|---|
| Background | `white` |
| Border default | `neutral-300` 1px |
| Border focus | `primary-700` 2px + `shadow-glow` |
| Border error | `danger-500` 2px |
| Padding | `px-4 py-2.5` |
| Border radius | `rounded-md` |
| Font | `text-base` regular |
| Color texto | `neutral-900` |
| Color placeholder | `neutral-500` |
| Label | `text-sm` medium, `neutral-900`, `mb-1.5` |
| Helper | `text-sm` regular, `neutral-500`, `mt-1.5` |
| Error message | `text-sm` regular, `danger-700`, `mt-1.5` |
### 6.5 Cards
| Atributo | Valor |
|---|---|
| Background | `white` |
| Border | `neutral-200` 1px |
| Border radius | `rounded-xl` (14px) |
| Padding | `p-6` mobile · `p-8` desktop |
| Shadow default | `shadow-sm` |
| Shadow hover (si interactivo) | `shadow-md` + transición 200ms |
### 6.6 Badges y pills (estados de lead)
| Estado | Background | Texto | Icon |
|---|---|---|---|
| Nuevo | `primary-100` | `primary-900` | 🆕 |
| Contactado | `info-100` | `info-700` | 📞 |
| Visita agendada | `warning-100` | `warning-700` | 📅 |
| Ganado | `success-100` | `success-700` | ✅ |
| Perdido | `neutral-100` | `neutral-700` | ❌ |
Estilo: `rounded-full`, `px-2.5 py-0.5`, `text-xs` semibold.
### 6.7 Alerts / banners
| Tipo | Background | Border-left 4px | Texto | Uso |
|---|---|---|---|---|
| Info | `info-100` | `info-500` | `info-700` | Banner aviso |
| Warning | `warning-100` | `warning-500` | `warning-700` | **"Esta obra puede requerir licencia urbanística"** |
| Success | `success-100` | `success-500` | `success-700` | Confirmación de envío |
| Danger | `danger-100` | `danger-500` | `danger-700` | Error de submit |
Padding `p-4`, radius `rounded-lg`, icono 20px a la izquierda.
---
## 7. Iconografía
### Librería: **Lucide** (compatible nativamente con shadcn/ui)
- **Tamaño base inline:** 16px (junto a texto inline)
- **Tamaño base UI:** 20px (botones, alerts, badges)
- **Tamaño standalone:** 24px (hero, features destacadas)
- **Stroke width:** 1.75 (Lucide default — equilibrio entre fino y legible)
- **Color por defecto:** hereda `currentColor` (configurable por contexto)
### Iconos clave del proyecto (recurrentes)
| Concepto | Icono Lucide |
|---|---|
| Llamada / agente voz | `Phone`, `PhoneCall`, `Mic` |
| WhatsApp (custom SVG) | Icono WhatsApp oficial (no en Lucide) |
| Render / cámara | `Camera`, `ImageIcon` |
| Presupuesto / factura | `Receipt`, `FileText` |
| Lead nuevo | `Sparkles` |
| Visita | `Calendar`, `MapPin` |
| Licencia urbanística | `BookOpen`, `FileCheck2`, `Building2` |
| Reformista pro | `HardHat`, `Hammer` |
| Cliente final | `Home`, `User` |
| Sello Precio Justo | `BadgeCheck` |
| Configurador | `Settings2`, `SlidersHorizontal` |
---
## 8. Motion y transiciones
### Duraciones
| Token | Valor | Uso |
|---|---|---|
| `duration-fast` | 150ms | Hover, focus, micro-feedback |
| `duration-base` | 250ms | Transiciones estándar (cards, modales pequeños) |
| `duration-slow` | 400ms | Aparición de modales grandes, transiciones de sección |
### Easing
| Token | Valor | Uso |
|---|---|---|
| `ease-out` | `cubic-bezier(0.16, 1, 0.3, 1)` | Entradas (recomendado por defecto) |
| `ease-in` | `cubic-bezier(0.7, 0, 0.84, 0)` | Salidas |
| `ease-in-out` | `cubic-bezier(0.65, 0, 0.35, 1)` | Movimientos en ambos sentidos |
### Qué se anima
- Hover de botones (background)
- Focus de inputs (ring)
- Aparición de modales y popovers
- Cuenta atrás *"Te llamamos en 1:47"* (animación de los dígitos)
- Pasos del wizard (slide horizontal suave)
- Aparición del render generado (fade-in + ligero scale-up)
### Qué NO se anima
- Texto de lectura largo
- Tablas y datos del panel
- Logos
- Iconos estáticos
### Reduced motion
Respetar siempre `prefers-reduced-motion`: deshabilitar todas las animaciones excepto fade simples (opacity).
---
## 9. Imagery y fotografía
### Estilo de imagen
- **Fotografías reales** de cocinas y baños como base. Antes/después.
- **Renders IA** generados por el propio producto en hero y casos de uso.
- Tonos cálidos, luz natural, no demasiado pulcras (que parezcan casa real, no catálogo IKEA).
- Evitar stock genérico de "team handshake" o "businessman with laptop".
### Aspect ratios recomendados
- Hero principal: 16:9 desktop, 4:5 mobile
- Cards de testimonio: 1:1 o 4:5
- Antes/después: 1:1 con divisoria deslizante
---
## 10. Aplicación a las superficies de specs.md
### Landing B2B (superficie A)
- Hero: H1 Instrument Serif `text-6xl` en `neutral-950`, subtitle `text-xl` Inter en `neutral-700`, CTA primary verde oliva
- Sección "Lo que está roto hoy": background `neutral-50`, cards con icono terracota + texto neutral
- Demo del widget: contenedor con `shadow-xl` y `rounded-2xl` para destacarlo
- Pricing: 3 cards con tier Pro destacada (border `primary-700` 2px + ribbon "Recomendado")
- "Próximamente": bloque con background `accent-100`, textos `accent-900`, CTA accent-600
### Landing B2C (superficie B)
- Hero con imagen antes/después grande arriba
- Branding del reformista en header en card propio con `shadow-sm`
- Form: 3 pasos con progress bar arriba (verde oliva), inputs con `rounded-md` generoso
- Pantalla de cuenta atrás: dígitos grandes `text-7xl` Instrument Serif, fondo `primary-50`
### Panel reformista (superficie D)
- Sidebar oscuro (`primary-900` background, `primary-100` texto) con logo Reformix arriba
- Lista de leads tipo tabla con filas hover en `neutral-50`
- Detalle de lead: card con `shadow-md` mostrando todos los artefactos en tabs
- Botón "Marcar Ganado" en `success-500`
- Modal de "precio final firmado" enfocado y con focus trap
---
## 11. Checklist de calidad
- [x] Contraste WCAG AA verificado en todas las combinaciones críticas
- [x] La escala tipográfica respeta 16px como mínimo legible móvil
- [x] Cubrimos los 4 estados semánticos (success, warning, danger, info)
- [x] 10 niveles de neutrales con tinte cálido (no grays fríos genéricos)
- [x] Escala de espaciado consistente (base 4px, sin valores arbitrarios)
- [x] Border-radius coherente con personalidad (generoso pero no infantil)
- [x] Fuentes disponibles en Google Fonts gratis (Instrument Serif + Inter + JetBrains Mono)
- [x] Tokens con nombre semántico (`primary-700` no `green-medium`)
- [x] Iconografía con librería elegida (Lucide)
- [x] Identidad verbal documentada con tono claro y ejemplos
- [x] Decisiones justificadas con conexión a la personalidad de marca
- [x] Aplicación a superficies del producto descrita
---
## 12. Archivos asociados
- [`design-tokens.json`](design-tokens.json) — Tokens en formato estándar (importables en Figma Tokens o style-dictionary)
- [`design-tokens.css`](design-tokens.css) — CSS Custom Properties listas para `:root`
- [`tailwind.config.ext.js`](tailwind.config.ext.js) — Extensión de la config de Tailwind con los tokens
---
## Próximos pasos
1. **Validación visual rápida** con el equipo (15 min): proyectar la paleta y los 3-4 ejemplos de aplicación. Confirmar que verde-oliva + terracota encaja con la intuición del equipo.
2. **Generar mockups en Stitch o Figma** usando los tokens y el copy de [COPY-GUIDE.md](../copy/COPY-GUIDE.md) — sin lorem ipsum.
3. Instalar shadcn/ui con tema custom basado en los tokens, antes de empezar a programar.
4. Crear un Storybook ligero (post-MVP) con los componentes core para que el equipo no reinvente cada vez.