@lesterarte/sefin-ui 0.0.1
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 +296 -0
- package/package.json +60 -0
package/README.md
ADDED
|
@@ -0,0 +1,296 @@
|
|
|
1
|
+
# @sefin/sefin-ui
|
|
2
|
+
|
|
3
|
+
Una librería de sistema de diseño Angular completa basada en principios de Atomic Design y design tokens de la Secretaría de Finanzas.
|
|
4
|
+
|
|
5
|
+
## Resumen
|
|
6
|
+
|
|
7
|
+
`@sefin/sefin-ui` es una librería UI Angular lista para producción diseñada para aplicaciones empresariales a gran escala. Proporciona:
|
|
8
|
+
|
|
9
|
+
- **Design Tokens**: Variables CSS y constantes TypeScript para temas consistentes
|
|
10
|
+
- **Estructura Atomic Design**: Componentes organizados (atoms, molecules, organisms)
|
|
11
|
+
- **Múltiples Temas**: Temas light, dark y brand (colores de Secretaría de Finanzas)
|
|
12
|
+
- **Integración con Angular Material**: Tema Material personalizado basado en design tokens
|
|
13
|
+
- **Componentes Type-Safe**: Soporte completo de TypeScript
|
|
14
|
+
- **Testing Completo**: Tests unitarios con Jest
|
|
15
|
+
- **Documentación Storybook**: Documentación visual de componentes con cambio de temas
|
|
16
|
+
|
|
17
|
+
## Estructura del Proyecto
|
|
18
|
+
|
|
19
|
+
```
|
|
20
|
+
sefin-ui/
|
|
21
|
+
├── src/
|
|
22
|
+
│ ├── atoms/ # Bloques básicos (Button, Icon, Input)
|
|
23
|
+
│ ├── molecules/ # Componentes compuestos (FormField, Dropdown, Card)
|
|
24
|
+
│ ├── organisms/ # Bloques UI complejos (Header, LoginForm, Toolbar)
|
|
25
|
+
│ ├── tokens/ # Design tokens (colors, spacing, typography, etc.)
|
|
26
|
+
│ ├── themes/ # Configuraciones de temas (light, dark, brand)
|
|
27
|
+
│ ├── utils/ # Utilidades (ThemeLoader)
|
|
28
|
+
│ ├── shared/ # Tipos e interfaces compartidos
|
|
29
|
+
│ ├── styles/ # Estilos globales y resets
|
|
30
|
+
│ └── public-api.ts # Exportaciones de la API pública
|
|
31
|
+
├── .storybook/ # Configuración de Storybook
|
|
32
|
+
├── ng-package.json # Configuración de build
|
|
33
|
+
└── package.json # Configuración del paquete
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## Instalación
|
|
37
|
+
|
|
38
|
+
### Construir la Librería
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
npm run build
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
Esto creará el paquete distribuible en `dist/`.
|
|
45
|
+
|
|
46
|
+
### Publicar en NPM
|
|
47
|
+
|
|
48
|
+
1. Actualiza la versión en `package.json`
|
|
49
|
+
2. Construye la librería: `npm run build`
|
|
50
|
+
3. Navega a dist: `cd dist`
|
|
51
|
+
4. Publica: `npm publish --access public`
|
|
52
|
+
|
|
53
|
+
### Instalar en Tu Aplicación
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
npm install @sefin/sefin-ui
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
## Uso
|
|
60
|
+
|
|
61
|
+
> 📖 **Guía Completa**: Para una guía detallada de cómo usar la librería, consulta [GUIA_CONSUMO.md](./GUIA_CONSUMO.md)
|
|
62
|
+
|
|
63
|
+
### Inicio Rápido
|
|
64
|
+
|
|
65
|
+
### 1. Importar Estilos
|
|
66
|
+
|
|
67
|
+
En tu `styles.scss` o `angular.json`:
|
|
68
|
+
|
|
69
|
+
```scss
|
|
70
|
+
@import '@sefin/sefin-ui/styles';
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
O en `angular.json`:
|
|
74
|
+
|
|
75
|
+
```json
|
|
76
|
+
{
|
|
77
|
+
"styles": [
|
|
78
|
+
"node_modules/@sefin/sefin-ui/styles/index.scss"
|
|
79
|
+
]
|
|
80
|
+
}
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
### 2. Cargar Tema
|
|
84
|
+
|
|
85
|
+
En tu `app.component.ts`:
|
|
86
|
+
|
|
87
|
+
```typescript
|
|
88
|
+
import { Component, OnInit } from '@angular/core';
|
|
89
|
+
import { ThemeLoader } from '@sefin/sefin-ui';
|
|
90
|
+
|
|
91
|
+
@Component({
|
|
92
|
+
selector: 'app-root',
|
|
93
|
+
// ...
|
|
94
|
+
})
|
|
95
|
+
export class AppComponent implements OnInit {
|
|
96
|
+
ngOnInit(): void {
|
|
97
|
+
// Cargar tema brand (colores de Secretaría de Finanzas)
|
|
98
|
+
ThemeLoader.loadTheme('brand');
|
|
99
|
+
|
|
100
|
+
// O cargar tema light
|
|
101
|
+
// ThemeLoader.loadTheme('light');
|
|
102
|
+
|
|
103
|
+
// O cargar tema dark
|
|
104
|
+
// ThemeLoader.loadTheme('dark');
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
### 3. Usar Componentes
|
|
110
|
+
|
|
111
|
+
Todos los componentes son standalone y se pueden importar directamente:
|
|
112
|
+
|
|
113
|
+
```typescript
|
|
114
|
+
import { Component } from '@angular/core';
|
|
115
|
+
import { ButtonComponent, CardComponent } from '@sefin/sefin-ui';
|
|
116
|
+
|
|
117
|
+
@Component({
|
|
118
|
+
selector: 'app-example',
|
|
119
|
+
standalone: true,
|
|
120
|
+
imports: [ButtonComponent, CardComponent],
|
|
121
|
+
template: `
|
|
122
|
+
<sefin-card variant="elevated">
|
|
123
|
+
<h2>Hola Mundo</h2>
|
|
124
|
+
<sefin-button variant="primary" (clicked)="handleClick()">
|
|
125
|
+
Haz Clic
|
|
126
|
+
</sefin-button>
|
|
127
|
+
</sefin-card>
|
|
128
|
+
`,
|
|
129
|
+
})
|
|
130
|
+
export class ExampleComponent {
|
|
131
|
+
handleClick() {
|
|
132
|
+
console.log('¡Botón clickeado!');
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
## Componentes Disponibles
|
|
138
|
+
|
|
139
|
+
### Atoms
|
|
140
|
+
|
|
141
|
+
- **Button**: `sefin-button` - Múltiples variantes (primary, secondary, outline, ghost, danger) y tamaños
|
|
142
|
+
- **Icon**: `sefin-icon` - Componente contenedor de iconos
|
|
143
|
+
- **Input**: `sefin-input` - Input de formulario con soporte ControlValueAccessor
|
|
144
|
+
|
|
145
|
+
### Molecules
|
|
146
|
+
|
|
147
|
+
- **FormField**: `sefin-form-field` - Campo de formulario completo con label, input, hint y error
|
|
148
|
+
- **Dropdown**: `sefin-dropdown` - Componente de selección dropdown
|
|
149
|
+
- **Card**: `sefin-card` - Contenedor de tarjeta con variantes (default, elevated, outlined)
|
|
150
|
+
|
|
151
|
+
### Organisms
|
|
152
|
+
|
|
153
|
+
- **Header**: `sefin-header` - Encabezado de aplicación con logo, título y menú de usuario
|
|
154
|
+
- **LoginForm**: `sefin-login-form` - Componente de formulario de login completo
|
|
155
|
+
- **Toolbar**: `sefin-toolbar` - Barra de herramientas con título y botones de acción
|
|
156
|
+
|
|
157
|
+
## Design Tokens
|
|
158
|
+
|
|
159
|
+
### Paleta de Colores - Secretaría de Finanzas
|
|
160
|
+
|
|
161
|
+
- **Dark Gray**: `#383838`
|
|
162
|
+
- **Light Gray**: `#cecece`
|
|
163
|
+
- **Light Blue**: `#55C3D8`
|
|
164
|
+
- **White**: `#ffffff`
|
|
165
|
+
|
|
166
|
+
### Usando Variables CSS
|
|
167
|
+
|
|
168
|
+
Todos los design tokens están disponibles como variables CSS:
|
|
169
|
+
|
|
170
|
+
```scss
|
|
171
|
+
.mi-componente {
|
|
172
|
+
color: var(--sefin-color-primary);
|
|
173
|
+
padding: var(--sefin-spacing-md);
|
|
174
|
+
border-radius: var(--sefin-radius-md);
|
|
175
|
+
font-size: var(--sefin-font-size-base);
|
|
176
|
+
box-shadow: var(--sefin-shadow-md);
|
|
177
|
+
}
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
### Usando Constantes TypeScript
|
|
181
|
+
|
|
182
|
+
```typescript
|
|
183
|
+
import { COLOR_TOKENS, SPACING_TOKENS } from '@sefin/sefin-ui';
|
|
184
|
+
|
|
185
|
+
const primaryColor = COLOR_TOKENS.brand.lightBlue;
|
|
186
|
+
const mediumSpacing = SPACING_TOKENS.md;
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
## Temas
|
|
190
|
+
|
|
191
|
+
### Temas Disponibles
|
|
192
|
+
|
|
193
|
+
- **brand**: Tema con colores exactos de Secretaría de Finanzas (por defecto)
|
|
194
|
+
- **light**: Tema claro
|
|
195
|
+
- **dark**: Tema oscuro
|
|
196
|
+
|
|
197
|
+
### Cambiar Temas
|
|
198
|
+
|
|
199
|
+
```typescript
|
|
200
|
+
import { ThemeLoader } from '@sefin/sefin-ui';
|
|
201
|
+
|
|
202
|
+
// Cambiar a tema brand
|
|
203
|
+
ThemeLoader.loadTheme('brand');
|
|
204
|
+
|
|
205
|
+
// Cambiar a tema dark
|
|
206
|
+
ThemeLoader.loadTheme('dark');
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
## Tipografía
|
|
210
|
+
|
|
211
|
+
La librería usa la fuente **Pluto** de Secretaría de Finanzas:
|
|
212
|
+
- **Pluto-Light** (300)
|
|
213
|
+
- **Pluto-Regular** (400)
|
|
214
|
+
- **Pluto-Bold** (700)
|
|
215
|
+
|
|
216
|
+
Nota: Debes incluir los archivos de fuente Pluto en tu proyecto.
|
|
217
|
+
|
|
218
|
+
## Desarrollo
|
|
219
|
+
|
|
220
|
+
### Ejecutar Tests
|
|
221
|
+
|
|
222
|
+
```bash
|
|
223
|
+
npm test
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
### Ejecutar Tests en Modo Watch
|
|
227
|
+
|
|
228
|
+
```bash
|
|
229
|
+
npm run test:watch
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
### Generar Reporte de Cobertura
|
|
233
|
+
|
|
234
|
+
```bash
|
|
235
|
+
npm run test:coverage
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
### Ejecutar Storybook
|
|
239
|
+
|
|
240
|
+
```bash
|
|
241
|
+
npm run storybook
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
Esto iniciará Storybook en `http://localhost:6006` con:
|
|
245
|
+
- Documentación de componentes
|
|
246
|
+
- Playground interactivo de componentes
|
|
247
|
+
- Cambio de temas
|
|
248
|
+
- Testing de accesibilidad
|
|
249
|
+
|
|
250
|
+
### Construir la Librería
|
|
251
|
+
|
|
252
|
+
```bash
|
|
253
|
+
npm run build
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
## Versionado
|
|
257
|
+
|
|
258
|
+
Este proyecto sigue [Semantic Versioning](https://semver.org/):
|
|
259
|
+
|
|
260
|
+
- **MAJOR**: Cambios que rompen compatibilidad
|
|
261
|
+
- **MINOR**: Nuevas características (compatibles hacia atrás)
|
|
262
|
+
- **PATCH**: Correcciones de bugs (compatibles hacia atrás)
|
|
263
|
+
|
|
264
|
+
## Flujo de Publicación
|
|
265
|
+
|
|
266
|
+
1. Actualiza la versión en `package.json`
|
|
267
|
+
2. Actualiza CHANGELOG.md
|
|
268
|
+
3. Construye la librería: `npm run build`
|
|
269
|
+
4. Prueba el build localmente
|
|
270
|
+
5. Publica: `cd dist && npm publish --access public`
|
|
271
|
+
|
|
272
|
+
## Mejores Prácticas
|
|
273
|
+
|
|
274
|
+
### Para Mantenedores de la Librería
|
|
275
|
+
|
|
276
|
+
1. **Siempre prueba antes de publicar**: Ejecuta tests y Storybook
|
|
277
|
+
2. **Actualiza documentación**: Mantén README y stories de Storybook actualizados
|
|
278
|
+
3. **Sigue Atomic Design**: Mantén los componentes organizados por jerarquía
|
|
279
|
+
4. **Usa design tokens**: Nunca hardcodees colores, spacing, etc.
|
|
280
|
+
5. **Escribe tests**: Mantén alta cobertura de tests
|
|
281
|
+
|
|
282
|
+
### Para Consumidores
|
|
283
|
+
|
|
284
|
+
1. **Importa solo lo que necesites**: Usa imports amigables con tree-shaking
|
|
285
|
+
2. **Carga el tema temprano**: Inicializa el tema en AppComponent
|
|
286
|
+
3. **Usa variables CSS**: Prefiere variables CSS sobre constantes TypeScript en estilos
|
|
287
|
+
4. **Sigue las APIs de componentes**: Usa los componentes como están documentados
|
|
288
|
+
5. **Extiende, no modifiques**: Crea componentes wrapper para personalización
|
|
289
|
+
|
|
290
|
+
## Soporte
|
|
291
|
+
|
|
292
|
+
Para problemas, preguntas o contribuciones, por favor abre un issue en el repositorio.
|
|
293
|
+
|
|
294
|
+
## Licencia
|
|
295
|
+
|
|
296
|
+
MIT
|
package/package.json
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@lesterarte/sefin-ui",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"description": "Sefin Design System - A comprehensive Angular UI library based on Atomic Design and design tokens",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"angular",
|
|
7
|
+
"design-system",
|
|
8
|
+
"ui-library",
|
|
9
|
+
"components",
|
|
10
|
+
"atomic-design",
|
|
11
|
+
"design-tokens"
|
|
12
|
+
],
|
|
13
|
+
"author": "Sefin",
|
|
14
|
+
"license": "MIT",
|
|
15
|
+
"repository": {
|
|
16
|
+
"type": "git",
|
|
17
|
+
"url": "https://github.com/sefin/sefin-ui.git"
|
|
18
|
+
},
|
|
19
|
+
"peerDependencies": {
|
|
20
|
+
"@angular/common": "^21.0.0",
|
|
21
|
+
"@angular/core": "^21.0.0",
|
|
22
|
+
"@angular/forms": "^21.0.0",
|
|
23
|
+
"@angular/material": "^21.0.0",
|
|
24
|
+
"@angular/cdk": "^21.0.0",
|
|
25
|
+
"@angular/animations": "^21.0.0"
|
|
26
|
+
},
|
|
27
|
+
"dependencies": {
|
|
28
|
+
"tslib": "^2.3.0"
|
|
29
|
+
},
|
|
30
|
+
"sideEffects": [
|
|
31
|
+
"**/*.scss",
|
|
32
|
+
"**/*.css"
|
|
33
|
+
],
|
|
34
|
+
"main": "./dist/sefin-ui/fesm2022/sefin-ui.mjs",
|
|
35
|
+
"module": "fesm2022/lesterarte-sefin-ui.mjs",
|
|
36
|
+
"es2022": "./dist/sefin-ui/fesm2022/sefin-ui.mjs",
|
|
37
|
+
"esm2022": "./dist/sefin-ui/esm2022/sefin-ui.mjs",
|
|
38
|
+
"fesm2022": "./dist/sefin-ui/fesm2022/sefin-ui.mjs",
|
|
39
|
+
"typings": "types/lesterarte-sefin-ui.d.ts",
|
|
40
|
+
"exports": {
|
|
41
|
+
".": {
|
|
42
|
+
"types": "./types/lesterarte-sefin-ui.d.ts",
|
|
43
|
+
"esm2022": "./dist/sefin-ui/esm2022/sefin-ui.mjs",
|
|
44
|
+
"es2022": "./dist/sefin-ui/fesm2022/sefin-ui.mjs",
|
|
45
|
+
"default": "./fesm2022/lesterarte-sefin-ui.mjs"
|
|
46
|
+
},
|
|
47
|
+
"./styles": {
|
|
48
|
+
"default": "./dist/sefin-ui/styles.css"
|
|
49
|
+
},
|
|
50
|
+
"./package.json": {
|
|
51
|
+
"default": "./package.json"
|
|
52
|
+
}
|
|
53
|
+
},
|
|
54
|
+
"files": [
|
|
55
|
+
"dist/sefin-ui"
|
|
56
|
+
],
|
|
57
|
+
"publishConfig": {
|
|
58
|
+
"access": "public"
|
|
59
|
+
}
|
|
60
|
+
}
|