@cerca/design-system 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +390 -0
- package/fesm2022/cerca-design-system.mjs +831 -0
- package/fesm2022/cerca-design-system.mjs.map +1 -0
- package/package.json +25 -0
- package/types/cerca-design-system.d.ts +331 -0
package/README.md
ADDED
|
@@ -0,0 +1,390 @@
|
|
|
1
|
+
# @cerca/design-system
|
|
2
|
+
|
|
3
|
+
Librería compartida de componentes del Design System para el ecosistema Cerca. Implementa **Atomic Design** con componentes basados en ng-zorro-antd para mantener uniformidad visual en todas las aplicaciones.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 📦 Instalación
|
|
8
|
+
|
|
9
|
+
### Como Librería Local (Monorepo)
|
|
10
|
+
|
|
11
|
+
La librería ya está configurada en el monorepo. Solo necesitas configurar el path mapping en tu proyecto:
|
|
12
|
+
|
|
13
|
+
**tsconfig.json:**
|
|
14
|
+
```json
|
|
15
|
+
{
|
|
16
|
+
"compilerOptions": {
|
|
17
|
+
"paths": {
|
|
18
|
+
"@cerca/design-system": [
|
|
19
|
+
"../../libs/design-system/src/public-api.ts"
|
|
20
|
+
]
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
### Build de la Librería
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
# Desde la raíz del monorepo
|
|
30
|
+
cd libs
|
|
31
|
+
ng build design-system
|
|
32
|
+
|
|
33
|
+
# Output: libs/dist/design-system/
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
---
|
|
37
|
+
|
|
38
|
+
## 🎨 Estructura de Componentes
|
|
39
|
+
|
|
40
|
+
La librería sigue la metodología **Atomic Design**:
|
|
41
|
+
|
|
42
|
+
### Atoms (Componentes Básicos)
|
|
43
|
+
- `ButtonComponent` - Botones con variantes (primary, secondary, danger, etc.)
|
|
44
|
+
- `InputComponent` - Campos de entrada de texto
|
|
45
|
+
- `SelectComponent` - Selectores dropdown
|
|
46
|
+
- `BadgeComponent` - Insignias y etiquetas
|
|
47
|
+
- `LabelComponent` - Etiquetas de texto
|
|
48
|
+
- `IconComponent` - Iconos de Ant Design
|
|
49
|
+
|
|
50
|
+
### Molecules (Componentes Compuestos)
|
|
51
|
+
- `CardComponent` - Tarjetas de contenido
|
|
52
|
+
- `FormFieldComponent` - Campo de formulario con label + input + validación
|
|
53
|
+
- `SearchBarComponent` - Barra de búsqueda
|
|
54
|
+
|
|
55
|
+
### Organisms (Componentes Complejos)
|
|
56
|
+
- `DataTableComponent` - Tabla de datos con paginación, ordenamiento y filtros
|
|
57
|
+
- `HeaderComponent` - Encabezado de página
|
|
58
|
+
- `SidebarComponent` - Barra lateral de navegación
|
|
59
|
+
- `ModalComponent` - Ventanas modales
|
|
60
|
+
|
|
61
|
+
### Templates (Plantillas de Página)
|
|
62
|
+
- `AdminLayoutComponent` - Layout principal de administración
|
|
63
|
+
- `AuthLayoutComponent` - Layout para páginas de autenticación
|
|
64
|
+
- `DashboardTemplateComponent` - Plantilla de dashboard
|
|
65
|
+
- `FormPageTemplateComponent` - Plantilla para páginas de formularios
|
|
66
|
+
- `ListPageTemplateComponent` - Plantilla para páginas de listados
|
|
67
|
+
|
|
68
|
+
### Layout (Componentes de Disposición)
|
|
69
|
+
- `ContainerComponent` - Contenedor principal
|
|
70
|
+
- `GridComponent` - Sistema de grilla
|
|
71
|
+
- `StackComponent` - Apilamiento vertical/horizontal
|
|
72
|
+
- `InlineComponent` - Disposición en línea
|
|
73
|
+
|
|
74
|
+
### Tokens (Variables de Diseño)
|
|
75
|
+
- `_colors.scss` - Paleta de colores
|
|
76
|
+
- `_typography.scss` - Tipografía y fuentes
|
|
77
|
+
- `_spacing.scss` - Espaciados y márgenes
|
|
78
|
+
- `_shadows.scss` - Sombras y elevaciones
|
|
79
|
+
- `_radius.scss` - Bordes redondeados
|
|
80
|
+
- `_theme-strategy.scss` - Estrategia de temas
|
|
81
|
+
|
|
82
|
+
---
|
|
83
|
+
|
|
84
|
+
## 🚀 Uso
|
|
85
|
+
|
|
86
|
+
### Importar Componentes
|
|
87
|
+
|
|
88
|
+
```typescript
|
|
89
|
+
import {
|
|
90
|
+
ButtonComponent,
|
|
91
|
+
InputComponent,
|
|
92
|
+
CardComponent,
|
|
93
|
+
DataTableComponent,
|
|
94
|
+
AdminLayoutComponent
|
|
95
|
+
} from '@cerca/design-system';
|
|
96
|
+
|
|
97
|
+
@Component({
|
|
98
|
+
selector: 'app-my-page',
|
|
99
|
+
standalone: true,
|
|
100
|
+
imports: [
|
|
101
|
+
ButtonComponent,
|
|
102
|
+
InputComponent,
|
|
103
|
+
CardComponent
|
|
104
|
+
],
|
|
105
|
+
template: `
|
|
106
|
+
<cc-card>
|
|
107
|
+
<cc-input placeholder="Nombre" />
|
|
108
|
+
<cc-button type="primary">Guardar</cc-button>
|
|
109
|
+
</cc-card>
|
|
110
|
+
`
|
|
111
|
+
})
|
|
112
|
+
export class MyPageComponent {}
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
### Importar Tokens SCSS
|
|
116
|
+
|
|
117
|
+
```scss
|
|
118
|
+
// En tu archivo SCSS
|
|
119
|
+
@import '@cerca/design-system/tokens';
|
|
120
|
+
|
|
121
|
+
.my-component {
|
|
122
|
+
color: var(--color-primary);
|
|
123
|
+
padding: var(--spacing-md);
|
|
124
|
+
border-radius: var(--radius-md);
|
|
125
|
+
box-shadow: var(--shadow-md);
|
|
126
|
+
}
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
---
|
|
130
|
+
|
|
131
|
+
## 🎯 Componentes Disponibles
|
|
132
|
+
|
|
133
|
+
### ButtonComponent
|
|
134
|
+
|
|
135
|
+
**Selector:** `cc-button`
|
|
136
|
+
|
|
137
|
+
**Props:**
|
|
138
|
+
- `type`: `'primary' | 'secondary' | 'danger' | 'link'` (default: `'primary'`)
|
|
139
|
+
- `size`: `'small' | 'medium' | 'large'` (default: `'medium'`)
|
|
140
|
+
- `disabled`: `boolean` (default: `false`)
|
|
141
|
+
- `loading`: `boolean` (default: `false`)
|
|
142
|
+
- `icon`: `string` (nombre del icono de Ant Design)
|
|
143
|
+
|
|
144
|
+
**Ejemplo:**
|
|
145
|
+
```html
|
|
146
|
+
<cc-button type="primary" size="large" icon="save">
|
|
147
|
+
Guardar
|
|
148
|
+
</cc-button>
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
### InputComponent
|
|
152
|
+
|
|
153
|
+
**Selector:** `cc-input`
|
|
154
|
+
|
|
155
|
+
**Props:**
|
|
156
|
+
- `type`: `'text' | 'password' | 'email' | 'number'` (default: `'text'`)
|
|
157
|
+
- `placeholder`: `string`
|
|
158
|
+
- `disabled`: `boolean` (default: `false`)
|
|
159
|
+
- `required`: `boolean` (default: `false`)
|
|
160
|
+
- `prefix`: `string` (icono prefijo)
|
|
161
|
+
- `suffix`: `string` (icono sufijo)
|
|
162
|
+
|
|
163
|
+
**Ejemplo:**
|
|
164
|
+
```html
|
|
165
|
+
<cc-input
|
|
166
|
+
type="email"
|
|
167
|
+
placeholder="correo@ejemplo.com"
|
|
168
|
+
prefix="mail"
|
|
169
|
+
required
|
|
170
|
+
/>
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
### CardComponent
|
|
174
|
+
|
|
175
|
+
**Selector:** `cc-card`
|
|
176
|
+
|
|
177
|
+
**Props:**
|
|
178
|
+
- `title`: `string`
|
|
179
|
+
- `bordered`: `boolean` (default: `true`)
|
|
180
|
+
- `hoverable`: `boolean` (default: `false`)
|
|
181
|
+
- `loading`: `boolean` (default: `false`)
|
|
182
|
+
|
|
183
|
+
**Ejemplo:**
|
|
184
|
+
```html
|
|
185
|
+
<cc-card title="Información del Usuario" hoverable>
|
|
186
|
+
<p>Contenido de la tarjeta</p>
|
|
187
|
+
</cc-card>
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
### DataTableComponent
|
|
191
|
+
|
|
192
|
+
**Selector:** `cc-data-table`
|
|
193
|
+
|
|
194
|
+
**Props:**
|
|
195
|
+
- `data`: `any[]` (datos de la tabla)
|
|
196
|
+
- `columns`: `TableColumn[]` (configuración de columnas)
|
|
197
|
+
- `loading`: `boolean` (default: `false`)
|
|
198
|
+
- `pageSize`: `number` (default: `10`)
|
|
199
|
+
- `showPagination`: `boolean` (default: `true`)
|
|
200
|
+
|
|
201
|
+
**Ejemplo:**
|
|
202
|
+
```typescript
|
|
203
|
+
columns = [
|
|
204
|
+
{ title: 'Nombre', key: 'name', sortable: true },
|
|
205
|
+
{ title: 'Email', key: 'email' },
|
|
206
|
+
{ title: 'Rol', key: 'role', filterable: true }
|
|
207
|
+
];
|
|
208
|
+
|
|
209
|
+
data = [
|
|
210
|
+
{ name: 'Juan Pérez', email: 'juan@ejemplo.com', role: 'Admin' },
|
|
211
|
+
{ name: 'María García', email: 'maria@ejemplo.com', role: 'User' }
|
|
212
|
+
];
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
```html
|
|
216
|
+
<cc-data-table
|
|
217
|
+
[data]="data"
|
|
218
|
+
[columns]="columns"
|
|
219
|
+
[pageSize]="20"
|
|
220
|
+
/>
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
---
|
|
224
|
+
|
|
225
|
+
## 🎨 Tokens de Diseño
|
|
226
|
+
|
|
227
|
+
### Colores
|
|
228
|
+
|
|
229
|
+
```scss
|
|
230
|
+
// Primarios
|
|
231
|
+
--color-primary: #1890ff;
|
|
232
|
+
--color-secondary: #52c41a;
|
|
233
|
+
--color-danger: #ff4d4f;
|
|
234
|
+
--color-warning: #faad14;
|
|
235
|
+
--color-info: #13c2c2;
|
|
236
|
+
|
|
237
|
+
// Grises
|
|
238
|
+
--color-text-primary: #262626;
|
|
239
|
+
--color-text-secondary: #8c8c8c;
|
|
240
|
+
--color-border: #d9d9d9;
|
|
241
|
+
--color-background: #f5f5f5;
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
### Espaciados
|
|
245
|
+
|
|
246
|
+
```scss
|
|
247
|
+
--spacing-xs: 4px;
|
|
248
|
+
--spacing-sm: 8px;
|
|
249
|
+
--spacing-md: 16px;
|
|
250
|
+
--spacing-lg: 24px;
|
|
251
|
+
--spacing-xl: 32px;
|
|
252
|
+
--spacing-2xl: 48px;
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
### Tipografía
|
|
256
|
+
|
|
257
|
+
```scss
|
|
258
|
+
--font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
|
|
259
|
+
|
|
260
|
+
--font-size-xs: 12px;
|
|
261
|
+
--font-size-sm: 14px;
|
|
262
|
+
--font-size-md: 16px;
|
|
263
|
+
--font-size-lg: 18px;
|
|
264
|
+
--font-size-xl: 24px;
|
|
265
|
+
--font-size-2xl: 32px;
|
|
266
|
+
|
|
267
|
+
--font-weight-normal: 400;
|
|
268
|
+
--font-weight-medium: 500;
|
|
269
|
+
--font-weight-semibold: 600;
|
|
270
|
+
--font-weight-bold: 700;
|
|
271
|
+
```
|
|
272
|
+
|
|
273
|
+
### Sombras
|
|
274
|
+
|
|
275
|
+
```scss
|
|
276
|
+
--shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.05);
|
|
277
|
+
--shadow-md: 0 4px 6px rgba(0, 0, 0, 0.1);
|
|
278
|
+
--shadow-lg: 0 10px 15px rgba(0, 0, 0, 0.1);
|
|
279
|
+
--shadow-xl: 0 20px 25px rgba(0, 0, 0, 0.15);
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
---
|
|
283
|
+
|
|
284
|
+
## 🔧 Desarrollo
|
|
285
|
+
|
|
286
|
+
### Estructura del Proyecto
|
|
287
|
+
|
|
288
|
+
```
|
|
289
|
+
libs/design-system/
|
|
290
|
+
├── src/
|
|
291
|
+
│ ├── lib/
|
|
292
|
+
│ │ ├── atoms/
|
|
293
|
+
│ │ ├── molecules/
|
|
294
|
+
│ │ ├── organisms/
|
|
295
|
+
│ │ ├── templates/
|
|
296
|
+
│ │ ├── layout/
|
|
297
|
+
│ │ ├── tokens/
|
|
298
|
+
│ │ └── public-api.ts
|
|
299
|
+
│ └── public-api.ts
|
|
300
|
+
├── ng-package.json
|
|
301
|
+
├── package.json
|
|
302
|
+
├── tsconfig.lib.json
|
|
303
|
+
└── README.md
|
|
304
|
+
```
|
|
305
|
+
|
|
306
|
+
### Agregar Nuevo Componente
|
|
307
|
+
|
|
308
|
+
1. **Crear el componente en la carpeta correspondiente:**
|
|
309
|
+
```bash
|
|
310
|
+
cd libs/design-system/src/lib/atoms
|
|
311
|
+
ng generate component my-atom --standalone
|
|
312
|
+
```
|
|
313
|
+
|
|
314
|
+
2. **Exportar en `public-api.ts`:**
|
|
315
|
+
```typescript
|
|
316
|
+
// libs/design-system/src/lib/public-api.ts
|
|
317
|
+
export * from './atoms/my-atom/my-atom.component';
|
|
318
|
+
```
|
|
319
|
+
|
|
320
|
+
3. **Rebuild la librería:**
|
|
321
|
+
```bash
|
|
322
|
+
ng build design-system
|
|
323
|
+
```
|
|
324
|
+
|
|
325
|
+
### Testing
|
|
326
|
+
|
|
327
|
+
```bash
|
|
328
|
+
# Ejecutar tests de la librería
|
|
329
|
+
ng test design-system
|
|
330
|
+
```
|
|
331
|
+
|
|
332
|
+
---
|
|
333
|
+
|
|
334
|
+
## 📋 Peer Dependencies
|
|
335
|
+
|
|
336
|
+
La librería requiere las siguientes dependencias en el proyecto consumidor:
|
|
337
|
+
|
|
338
|
+
```json
|
|
339
|
+
{
|
|
340
|
+
"@angular/common": "^21.1.0",
|
|
341
|
+
"@angular/core": "^21.1.0",
|
|
342
|
+
"ng-zorro-antd": "^21.1.0",
|
|
343
|
+
"@ant-design/icons-angular": "^21.0.0"
|
|
344
|
+
}
|
|
345
|
+
```
|
|
346
|
+
|
|
347
|
+
---
|
|
348
|
+
|
|
349
|
+
## 📝 Versionado
|
|
350
|
+
|
|
351
|
+
La librería sigue [Semantic Versioning](https://semver.org/):
|
|
352
|
+
|
|
353
|
+
- **MAJOR** (1.x.x): Cambios incompatibles en la API
|
|
354
|
+
- **MINOR** (x.1.x): Nueva funcionalidad compatible
|
|
355
|
+
- **PATCH** (x.x.1): Correcciones de bugs
|
|
356
|
+
|
|
357
|
+
**Versión actual:** `1.0.0`
|
|
358
|
+
|
|
359
|
+
---
|
|
360
|
+
|
|
361
|
+
## 🤝 Contribuir
|
|
362
|
+
|
|
363
|
+
### Reglas de Contribución
|
|
364
|
+
|
|
365
|
+
1. **Atomic Design:** Todos los componentes deben seguir la metodología Atomic Design
|
|
366
|
+
2. **Standalone Components:** Usar componentes standalone de Angular
|
|
367
|
+
3. **ng-zorro-antd:** Basar componentes en ng-zorro cuando sea posible
|
|
368
|
+
4. **TypeScript Strict:** Código con tipado estricto
|
|
369
|
+
5. **SCSS Tokens:** Usar variables de diseño definidas en `tokens/`
|
|
370
|
+
|
|
371
|
+
### Proceso de Desarrollo
|
|
372
|
+
|
|
373
|
+
1. Crear rama feature: `git checkout -b feature/nuevo-componente`
|
|
374
|
+
2. Desarrollar componente siguiendo las reglas
|
|
375
|
+
3. Exportar en `public-api.ts`
|
|
376
|
+
4. Rebuild: `ng build design-system`
|
|
377
|
+
5. Commit: `git commit -m "feat: agregar nuevo componente"`
|
|
378
|
+
6. Push y crear PR
|
|
379
|
+
|
|
380
|
+
---
|
|
381
|
+
|
|
382
|
+
## 📄 Licencia
|
|
383
|
+
|
|
384
|
+
Propiedad de Cerca Ecosystem. Uso interno únicamente.
|
|
385
|
+
|
|
386
|
+
---
|
|
387
|
+
|
|
388
|
+
## 📞 Soporte
|
|
389
|
+
|
|
390
|
+
Para preguntas o problemas, contactar al equipo de desarrollo de Cerca.
|