# Plan: Crear el Design System de BL Consultores como Component Library React ## Context BL Consultores tiene un design system completo definido en Penpot (páginas Foundations, Components, Screens) con colores, tipografía, botones, formularios, navegación, tablas, gráficos, alertas y modales. El objetivo es exportar estos diseños desde Penpot y crear una librería de componentes React reutilizable usando `create-react-component-library` (aleleba/create-react-component-library), que ya soporta Storybook, testing y publicación npm. La librería se integrará en `blconsultores_app` como dependencia local o npm para estandarizar toda la UI del proyecto. ## Fundamentos del Design System (extraídos de Penpot) ### Paleta de Colores (12 tokens) | Token | Hex | Grupo | |---|---|---| | Blanco | `#FFFFFF` | Neutro | | Dorado Institucional | `#EABF2D` | Brand primario | | Ámbar | `#D4880F` | Brand secundario | | Azul Navy | `#1B2A4A` | Brand / texto oscuro | | Negro Profundo | `#1A1A2E` | Texto principal | | Gris Oscuro | `#2D2D3F` | Texto / bordes | | Gris Medio | `#6B6B7B` | Texto secundario | | Gris Claro | `#F5F5F7` | Fondos de sección | | Encuesta - Totalmente de Acuerdo | `#2CDEA3` | Semántica encuesta | | Encuesta - De Acuerdo | `#F5E53E` | Semántica encuesta | | Encuesta - En Desacuerdo | `#FAC132` | Semántica encuesta | | Encuesta - Totalmente en Desacuerdo | `#DE3626` | Semántica encuesta | ### Tipografía (11 tokens) | Token | Font | Size | Weight | Uso | |---|---|---|---|---| | Heading 50 | Montserrat | 50px | Bold | Hero titles | | Heading 25 | Montserrat | 25px | Bold | Page titles | | Heading 18 | Montserrat | 18px | Bold | Section headers | | Subheading 22 | Montserrat | 22px | Normal | Subheaders | | Montserrat Heading | Montserrat | 14px | Bold | Card titles | | Montserrat Subheading | Montserrat | 14px | Bold | Subtitles | | Montserrat SemiBold | Montserrat | 14px | Semibold | Labels | | Montserrat Body | Montserrat | 14px | Normal | Body text | | Montserrat Regular | Montserrat | 14px | Normal | Body text | | Noeteric Bold | Noeteric-Bold | 14px | Bold | Logo/branding | | Montserrat Bold | Montserrat | 14px | Bold | Emphasis | ### Tipografías del Library - `Montserrat` (Regular, SemiBold, Bold) - `Noeteric-Bold` ### Componentes definidos en Penpot (22 boards) **Buttons (8 variantes):** - Primary (Dorado bg, Azul Navy text) - Outline Gold (Dorado border) - Outline Dark Default / Hover - Outline Light BG - Ghost Default / Hover - Circular (icon button) - Icon Delete (rojo) - Icon Edit **Forms (5):** - Input/Text (default + focus states) - Input/Search - Select/Dropdown - Toggle Track - Button/File Upload **Navigation (6):** - Breadcrumb - Tabs - Navbar/Admin - Navbar/Admin Mobile (collapsed + overlay) - Navbar/Pública **Data Display (11):** - Table/Encuestados, Table/Climas, Table/Semáforo - Pagination - Card/Editor Section, Card/Servicio, Card/Login BG - Badge/Status Check, Badge/Order Number - Chip/Removable - ListItem/Factor **Feedback (4):** - Alert (Danger, Info, Success) - Modal/Content - Loader **Charts (3):** - Bar Comparative, Bar Single, Donut **Layout (1):** - Footer ## Arquitectura de la Library ``` create-react-component-library/ ├── src/ │ ├── components/ │ │ ├── Button/ │ │ │ ├── index.tsx # Componente React con props tipadas │ │ │ ├── Button.stories.tsx # Storybook stories (variantes, estados) │ │ │ ├── Button.test.tsx # Unit tests (Jest) │ │ │ ├── Button.cy.tsx # Component tests (Cypress) │ │ │ └── style.scss # Estilos SCSS usando tokens │ │ ├── Input/ │ │ ├── Select/ │ │ ├── Toggle/ │ │ ├── Navbar/ │ │ ├── Breadcrumb/ │ │ ├── Tabs/ │ │ ├── Table/ │ │ ├── Card/ │ │ ├── Alert/ │ │ ├── Modal/ │ │ ├── Badge/ │ │ ├── Chip/ │ │ ├── ListItem/ │ │ ├── Pagination/ │ │ ├── Loader/ │ │ ├── Footer/ │ │ ├── Chart/ │ │ └── index.tsx # Barrel export │ ├── tokens/ │ │ ├── colors.ts # Design tokens (colores) │ │ ├── typography.ts # Design tokens (tipografía) │ │ └── index.ts │ └── stories/ │ └── Introduction.mdx # Guía de uso ├── .storybook/ │ ├── main.js │ └── preview.js ├── package.json ├── tsconfig.json └── README.md ``` Cada componente sigue el patrón de `create-react-component-library`: 1. `index.tsx` — Componente React con props tipadas 2. `*.stories.tsx` — Storybook stories (variantes, estados) 3. `*.test.tsx` — Tests unitarios Jest 4. `*.cy.tsx` — Tests de componentes Cypress 5. `style.scss` — Estilos SCSS que usan los tokens ## Pasos de Implementación ### Fase 1: Configurar tokens de diseño 1. `src/tokens/colors.ts` — Todas las variables de color como constantes TypeScript + CSS variables 2. `src/tokens/typography.ts` — Todas las tipografías como objetos con fontFamily, fontSize, fontWeight, lineHeight 3. `src/tokens/index.ts` — Barrel export ### Fase 2: Implementar componentes por categoría (orden de prioridad) 1. **Buttons** (8 variantes) — Base de toda la UI interactiva 2. **Forms** (5 componentes) — Inputs, selects, toggles 3. **Navigation** (6 componentes) — Breadcrumbs, tabs, navbars 4. **Data Display** (11 componentes) — Tablas, cards, badges, chips 5. **Feedback** (4 componentes) — Alerts, modals, loader 6. **Charts** (3 componentes) — Gráficas con Chart.js 7. **Layout** (1 componente) — Footer ### Fase 3: Export barrel y documentación 1. `src/components/index.ts` — Exportar todos los componentes 2. Storybook Introduction page con guía de uso y ejemplos 3. README con instrucciones de instalación y uso ### Fase 4: Testing 1. Unit tests para cada componente (Jest + Testing Library) 2. Component tests con Cypress 3. Storybook visual regression (opcional) ## Integración con blconsultores_app ### package.json de blconsultores_app: ```json { "dependencies": { "@blconsultores/design-system": "file:../create-react-component-library" } } ``` ### Uso en componentes existentes: ```tsx // Antes (Bootstrap inline)