6.9 KiB
6.9 KiB
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:
index.tsx— Componente React con props tipadas*.stories.tsx— Storybook stories (variantes, estados)*.test.tsx— Tests unitarios Jest*.cy.tsx— Tests de componentes Cypressstyle.scss— Estilos SCSS que usan los tokens
Pasos de Implementación
Fase 1: Configurar tokens de diseño
src/tokens/colors.ts— Todas las variables de color como constantes TypeScript + CSS variablessrc/tokens/typography.ts— Todas las tipografías como objetos con fontFamily, fontSize, fontWeight, lineHeightsrc/tokens/index.ts— Barrel export
Fase 2: Implementar componentes por categoría (orden de prioridad)
- Buttons (8 variantes) — Base de toda la UI interactiva
- Forms (5 componentes) — Inputs, selects, toggles
- Navigation (6 componentes) — Breadcrumbs, tabs, navbars
- Data Display (11 componentes) — Tablas, cards, badges, chips
- Feedback (4 componentes) — Alerts, modals, loader
- Charts (3 componentes) — Gráficas con Chart.js
- Layout (1 componente) — Footer
Fase 3: Export barrel y documentación
src/components/index.ts— Exportar todos los componentes- Storybook Introduction page con guía de uso y ejemplos
- README con instrucciones de instalación y uso
Fase 4: Testing
- Unit tests para cada componente (Jest + Testing Library)
- Component tests con Cypress
- Storybook visual regression (opcional)
Integración con blconsultores_app
package.json de blconsultores_app:
{
"dependencies": {
"@blconsultores/design-system": "file:../create-react-component-library"
}
}
Uso en componentes existentes:
// Antes (Bootstrap inline)
<div className="btn btn-primary" style={{...}}>
// Después (Design System)
import { Button } from '@blconsultores/design-system'
<Button variant="primary" size="md">Click</Button>
Verificación
- Storybook abre y muestra todos los componentes
- Todos los colores y tipografías coinciden con Penpot (verificar hex codes)
- Tests unitarios pasan (Jest)
- Tests de componentes pasan (Cypress)
npm linkfunciona y los componentes se importan en blconsultores_app- Export barrel funciona:
import { Button, Input, Table } from '@blconsultores/design-system'