@sistemas-ucol-mx/ucol-dynamic 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 +445 -0
- package/package.json +113 -0
package/README.md
ADDED
|
@@ -0,0 +1,445 @@
|
|
|
1
|
+
# ucol-dynamic
|
|
2
|
+
|
|
3
|
+
<div align="center">
|
|
4
|
+
|
|
5
|
+

|
|
6
|
+

|
|
7
|
+

|
|
8
|
+

|
|
9
|
+

|
|
10
|
+
|
|
11
|
+
**Una librería completa de componentes React para crear interfaces de usuario modernas y dinámicas**
|
|
12
|
+
|
|
13
|
+
[Demo en vivo](https://ucol-dynamic.netlify.app/) | [Documentación](https://github.com/8Wada/ucol-dynamic) | [Reportar un error](https://github.com/8Wada/ucol-dynamic/issues)
|
|
14
|
+
|
|
15
|
+
</div>
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## 📋 Tabla de Contenidos
|
|
20
|
+
|
|
21
|
+
- [Características](#-características)
|
|
22
|
+
- [Instalación](#-instalación)
|
|
23
|
+
- [Componentes Principales](#-componentes-principales)
|
|
24
|
+
- [Guía de Inicio Rápido](#-guía-de-inicio-rápido)
|
|
25
|
+
- [Documentación de Componentes](#-documentación-de-componentes)
|
|
26
|
+
- [Hooks Personalizados](#-hooks-personalizados)
|
|
27
|
+
- [API y Configuración](#-api-y-configuración)
|
|
28
|
+
- [Desarrollo](#-desarrollo)
|
|
29
|
+
- [Scripts Disponibles](#-scripts-disponibles)
|
|
30
|
+
- [Tecnologías](#-tecnologías)
|
|
31
|
+
- [Contribuir](#-contribuir)
|
|
32
|
+
- [Licencia](#-licencia)
|
|
33
|
+
|
|
34
|
+
## ✨ Características
|
|
35
|
+
|
|
36
|
+
- 🎨 **Componentes Dinámicos**: Formularios, tablas y CRUD completamente configurables
|
|
37
|
+
- 🔐 **Sistema de Permisos**: Control granular de acceso basado en roles
|
|
38
|
+
- 📊 **Exportación de Datos**: Soporte para Excel y PDF
|
|
39
|
+
- 📤 **Carga Masiva**: Importación de datos mediante archivos Excel/CSV
|
|
40
|
+
- 🎯 **TypeScript First**: Totalmente tipado para mejor experiencia de desarrollo
|
|
41
|
+
- 🚀 **React Query**: Gestión de estado del servidor integrada
|
|
42
|
+
- 💅 **Estilos Modernos**: Combinación de Ant Design y Tailwind CSS
|
|
43
|
+
- 📱 **Responsive**: Diseño adaptable a todos los dispositivos
|
|
44
|
+
- 🎭 **Storybook**: Documentación interactiva de componentes
|
|
45
|
+
- ⚡ **Optimizado**: Bundle optimizado con Vite
|
|
46
|
+
|
|
47
|
+
## 📦 Instalación
|
|
48
|
+
|
|
49
|
+
### Usando npm
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
npm install @sistemas-ucol-mx/ucol-dynamic
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
### Usando pnpm
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
pnpm install @sistemas-ucol-mx/ucol-dynamic
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
o
|
|
62
|
+
|
|
63
|
+
```bash
|
|
64
|
+
pnpm add @sistemas-ucol-mx/ucol-dynamic
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
### Usando yarn
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
yarn add @sistemas-ucol-mx/ucol-dynamic
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
## 📚 Peer Dependencies
|
|
74
|
+
|
|
75
|
+
La librería requiere las siguientes dependencias instaladas en tu proyecto:
|
|
76
|
+
|
|
77
|
+
```json
|
|
78
|
+
{
|
|
79
|
+
"antd": "^5.24.0",
|
|
80
|
+
"axios": "^1.7.9",
|
|
81
|
+
"dayjs": "^1.11.13",
|
|
82
|
+
"react": "19.0.0",
|
|
83
|
+
"react-dom": "19.0.0"
|
|
84
|
+
}
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
### Instalación de Peer Dependencies
|
|
88
|
+
|
|
89
|
+
```bash
|
|
90
|
+
npm install antd axios dayjs react react-dom
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
### Importar estilos
|
|
94
|
+
|
|
95
|
+
No olvides importar los estilos CSS en tu aplicación:
|
|
96
|
+
|
|
97
|
+
```tsx
|
|
98
|
+
import '@sistemas-ucol-mx/ucol-dynamic/dist/style.css';
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
## 🧩 Componentes Principales
|
|
102
|
+
|
|
103
|
+
### 🎯 DynamicCrud
|
|
104
|
+
|
|
105
|
+
Componente completo CRUD con tabla, formulario modal y acciones personalizables.
|
|
106
|
+
|
|
107
|
+
```tsx
|
|
108
|
+
import { DynamicCrud } from '@sistemas-ucol-mx/ucol-dynamic';
|
|
109
|
+
|
|
110
|
+
<DynamicCrud
|
|
111
|
+
title="Gestión de Usuarios"
|
|
112
|
+
description="Administra los usuarios del sistema"
|
|
113
|
+
columns={[
|
|
114
|
+
{ title: 'Nombre', dataIndex: 'name', key: 'name' },
|
|
115
|
+
{ title: 'Email', dataIndex: 'email', key: 'email' },
|
|
116
|
+
]}
|
|
117
|
+
fields={[
|
|
118
|
+
{ name: 'name', label: 'Nombre', type: 'text', required: true },
|
|
119
|
+
{ name: 'email', label: 'Email', type: 'email', required: true },
|
|
120
|
+
]}
|
|
121
|
+
data={users}
|
|
122
|
+
onCreate={handleCreate}
|
|
123
|
+
onEdit={handleEdit}
|
|
124
|
+
onDelete={handleDelete}
|
|
125
|
+
/>
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
### 📝 DynamicForm
|
|
129
|
+
|
|
130
|
+
Formulario dinámico generado a partir de configuración JSON.
|
|
131
|
+
|
|
132
|
+
```tsx
|
|
133
|
+
import { DynamicForm } from '@sistemas-ucol-mx/ucol-dynamic';
|
|
134
|
+
|
|
135
|
+
<DynamicForm
|
|
136
|
+
mode="create"
|
|
137
|
+
title="Nuevo Usuario"
|
|
138
|
+
layout="vertical"
|
|
139
|
+
cols={2}
|
|
140
|
+
fields={[
|
|
141
|
+
{ name: 'name', label: 'Nombre', type: 'text', required: true },
|
|
142
|
+
{ name: 'email', label: 'Email', type: 'email', required: true },
|
|
143
|
+
{ name: 'age', label: 'Edad', type: 'number' },
|
|
144
|
+
{ name: 'active', label: 'Activo', type: 'switch' },
|
|
145
|
+
]}
|
|
146
|
+
onSubmit={handleSubmit}
|
|
147
|
+
/>
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
### 📊 DynamicTable
|
|
151
|
+
|
|
152
|
+
Tabla configurable con búsqueda, filtros, paginación y exportación.
|
|
153
|
+
|
|
154
|
+
```tsx
|
|
155
|
+
import { DynamicTable } from '@sistemas-ucol-mx/ucol-dynamic';
|
|
156
|
+
|
|
157
|
+
<DynamicTable
|
|
158
|
+
title="Lista de Productos"
|
|
159
|
+
columns={columns}
|
|
160
|
+
data={products}
|
|
161
|
+
loading={isLoading}
|
|
162
|
+
showCreateButton
|
|
163
|
+
onCreate={handleCreate}
|
|
164
|
+
onEdit={handleEdit}
|
|
165
|
+
onDelete={handleDelete}
|
|
166
|
+
exportToExcel={{
|
|
167
|
+
fileName: 'productos',
|
|
168
|
+
sheetName: 'Productos',
|
|
169
|
+
data: products,
|
|
170
|
+
columns: columns
|
|
171
|
+
}}
|
|
172
|
+
searchConfig={{
|
|
173
|
+
searchableFields: ['name', 'category', 'price']
|
|
174
|
+
}}
|
|
175
|
+
/>
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
### 🔘 Btn (Button)
|
|
179
|
+
|
|
180
|
+
Botón versátil con presets, variantes de color e iconos.
|
|
181
|
+
|
|
182
|
+
```tsx
|
|
183
|
+
import { Btn } from '@sistemas-ucol-mx/ucol-dynamic';
|
|
184
|
+
|
|
185
|
+
// Botón con preset
|
|
186
|
+
<Btn preset="save" variant="success">Guardar</Btn>
|
|
187
|
+
<Btn preset="delete" variant="danger">Eliminar</Btn>
|
|
188
|
+
<Btn preset="edit" variant="info">Editar</Btn>
|
|
189
|
+
|
|
190
|
+
// Botón personalizado
|
|
191
|
+
<Btn
|
|
192
|
+
icon={<CustomIcon />}
|
|
193
|
+
variant="warning"
|
|
194
|
+
size="large"
|
|
195
|
+
>
|
|
196
|
+
Acción Personalizada
|
|
197
|
+
</Btn>
|
|
198
|
+
|
|
199
|
+
// Solo icono
|
|
200
|
+
<Btn preset="add" iconOnly />
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
### 🔐 PermissionsProvider
|
|
204
|
+
|
|
205
|
+
Sistema de gestión de permisos basado en roles.
|
|
206
|
+
|
|
207
|
+
```tsx
|
|
208
|
+
import { PermissionsProvider, usePermissions } from '@sistemas-ucol-mx/ucol-dynamic';
|
|
209
|
+
|
|
210
|
+
// Configurar permisos
|
|
211
|
+
const permissionsConfig = {
|
|
212
|
+
users: {
|
|
213
|
+
admin: ['create', 'read', 'update', 'delete'],
|
|
214
|
+
user: ['read'],
|
|
215
|
+
}
|
|
216
|
+
};
|
|
217
|
+
|
|
218
|
+
// Envolver tu aplicación
|
|
219
|
+
<PermissionsProvider role="admin" config={permissionsConfig}>
|
|
220
|
+
<App />
|
|
221
|
+
</PermissionsProvider>
|
|
222
|
+
|
|
223
|
+
// Usar en componentes
|
|
224
|
+
function UserActions() {
|
|
225
|
+
const { canCreate, canDelete } = usePermissions('users');
|
|
226
|
+
|
|
227
|
+
return (
|
|
228
|
+
<>
|
|
229
|
+
{canCreate && <Btn preset="add">Crear</Btn>}
|
|
230
|
+
{canDelete && <Btn preset="delete">Eliminar</Btn>}
|
|
231
|
+
</>
|
|
232
|
+
);
|
|
233
|
+
}
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
### 📤 BulkUploadModal
|
|
237
|
+
|
|
238
|
+
Modal para carga masiva de datos con validación.
|
|
239
|
+
|
|
240
|
+
```tsx
|
|
241
|
+
import { BulkUploadModal } from '@sistemas-ucol-mx/ucol-dynamic';
|
|
242
|
+
|
|
243
|
+
<BulkUploadModal
|
|
244
|
+
title="Importar Usuarios"
|
|
245
|
+
visible={showModal}
|
|
246
|
+
config={{
|
|
247
|
+
allowedFormats: ['xlsx', 'csv'],
|
|
248
|
+
maxFileSize: 5,
|
|
249
|
+
templateFields: [
|
|
250
|
+
{ name: 'name', label: 'Nombre', required: true },
|
|
251
|
+
{ name: 'email', label: 'Email', required: true },
|
|
252
|
+
]
|
|
253
|
+
}}
|
|
254
|
+
onValidateData={validateUsers}
|
|
255
|
+
onFinish={importUsers}
|
|
256
|
+
onCancel={() => setShowModal(false)}
|
|
257
|
+
/>
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
### 🔍 SharedField
|
|
261
|
+
|
|
262
|
+
Campo de formulario compartido con validación y tipos múltiples.
|
|
263
|
+
|
|
264
|
+
```tsx
|
|
265
|
+
import { SharedField } from '@sistemas-ucol-mx/ucol-dynamic';
|
|
266
|
+
|
|
267
|
+
<SharedField
|
|
268
|
+
name="username"
|
|
269
|
+
label="Usuario"
|
|
270
|
+
type="text"
|
|
271
|
+
required={true}
|
|
272
|
+
placeholder="Ingresa tu usuario"
|
|
273
|
+
validations={{
|
|
274
|
+
minLength: 3,
|
|
275
|
+
maxLength: 20,
|
|
276
|
+
pattern: /^[a-zA-Z0-9]+$/
|
|
277
|
+
}}
|
|
278
|
+
/>
|
|
279
|
+
```
|
|
280
|
+
|
|
281
|
+
## 🎣 Hooks Personalizados
|
|
282
|
+
|
|
283
|
+
### useCrudOperations
|
|
284
|
+
|
|
285
|
+
Hook para operaciones CRUD con React Query integrado.
|
|
286
|
+
|
|
287
|
+
```tsx
|
|
288
|
+
import { useCrudOperations } from '@sistemas-ucol-mx/ucol-dynamic';
|
|
289
|
+
|
|
290
|
+
function UserManagement() {
|
|
291
|
+
const {
|
|
292
|
+
data: users,
|
|
293
|
+
isLoading,
|
|
294
|
+
createItemAsync,
|
|
295
|
+
updateItemAsync,
|
|
296
|
+
deleteItemAsync,
|
|
297
|
+
refetch
|
|
298
|
+
} = useCrudOperations({
|
|
299
|
+
getAll: () => api.getUsers(),
|
|
300
|
+
create: (user) => api.createUser(user),
|
|
301
|
+
update: (user) => api.updateUser(user),
|
|
302
|
+
delete: (user) => api.deleteUser(user.id),
|
|
303
|
+
idField: 'id',
|
|
304
|
+
entityName: 'usuario'
|
|
305
|
+
});
|
|
306
|
+
|
|
307
|
+
const handleCreate = async (values) => {
|
|
308
|
+
await createItemAsync(values);
|
|
309
|
+
};
|
|
310
|
+
|
|
311
|
+
return <DynamicTable data={users} loading={isLoading} />;
|
|
312
|
+
}
|
|
313
|
+
```
|
|
314
|
+
|
|
315
|
+
### useFetchQuery
|
|
316
|
+
|
|
317
|
+
Hook wrapper de React Query con configuración predeterminada.
|
|
318
|
+
|
|
319
|
+
```tsx
|
|
320
|
+
import { useFetchQuery } from '@sistemas-ucol-mx/ucol-dynamic';
|
|
321
|
+
|
|
322
|
+
const { data, isLoading, error } = useFetchQuery({
|
|
323
|
+
queryKey: ['users'],
|
|
324
|
+
queryFn: fetchUsers,
|
|
325
|
+
config: {
|
|
326
|
+
onSuccess: (data) => console.log('Datos cargados:', data),
|
|
327
|
+
onError: (error) => console.error('Error:', error)
|
|
328
|
+
}
|
|
329
|
+
});
|
|
330
|
+
```
|
|
331
|
+
|
|
332
|
+
### useNotification
|
|
333
|
+
|
|
334
|
+
Hook para mostrar notificaciones del sistema.
|
|
335
|
+
|
|
336
|
+
```tsx
|
|
337
|
+
import { openNotification } from '@sistemas-ucol-mx/ucol-dynamic';
|
|
338
|
+
|
|
339
|
+
openNotification('success', 'Operación exitosa', 'Los datos se guardaron correctamente');
|
|
340
|
+
openNotification('error', 'Error', 'No se pudo completar la operación');
|
|
341
|
+
openNotification('warning', 'Advertencia', 'Revisa los datos ingresados');
|
|
342
|
+
openNotification('info', 'Información', 'Proceso en curso');
|
|
343
|
+
```
|
|
344
|
+
|
|
345
|
+
### useAsync
|
|
346
|
+
|
|
347
|
+
Hook para manejar operaciones asíncronas.
|
|
348
|
+
|
|
349
|
+
```tsx
|
|
350
|
+
import { useAsync } from '@sistemas-ucol-mx/ucol-dynamic';
|
|
351
|
+
|
|
352
|
+
function DataDisplay() {
|
|
353
|
+
const { data, loading, error } = useAsync(
|
|
354
|
+
async () => await fetchData(),
|
|
355
|
+
[dependency]
|
|
356
|
+
);
|
|
357
|
+
|
|
358
|
+
if (loading) return <Spin />;
|
|
359
|
+
if (error) return <Alert type="error" message={error.message} />;
|
|
360
|
+
|
|
361
|
+
return <div>{JSON.stringify(data)}</div>;
|
|
362
|
+
}
|
|
363
|
+
```
|
|
364
|
+
|
|
365
|
+
## ⚙️ API y Configuración
|
|
366
|
+
|
|
367
|
+
### Configuración de API en DynamicForm
|
|
368
|
+
|
|
369
|
+
```tsx
|
|
370
|
+
<DynamicForm
|
|
371
|
+
apiConfig={{
|
|
372
|
+
url: 'https://api.example.com/users',
|
|
373
|
+
method: 'POST',
|
|
374
|
+
headers: {
|
|
375
|
+
'Authorization': 'Bearer token',
|
|
376
|
+
'Content-Type': 'application/json'
|
|
377
|
+
},
|
|
378
|
+
responseDataPath: 'data.user'
|
|
379
|
+
}}
|
|
380
|
+
/>
|
|
381
|
+
```
|
|
382
|
+
|
|
383
|
+
### Tipos de Campos de Formulario
|
|
384
|
+
|
|
385
|
+
- `text` - Campo de texto
|
|
386
|
+
- `textarea` - Área de texto
|
|
387
|
+
- `number` - Número
|
|
388
|
+
- `email` - Email
|
|
389
|
+
- `password` - Contraseña
|
|
390
|
+
- `select` - Lista desplegable
|
|
391
|
+
- `multiselect` - Selección múltiple
|
|
392
|
+
- `checkbox` - Casilla de verificación
|
|
393
|
+
- `radio` - Botones de radio
|
|
394
|
+
- `switch` - Interruptor
|
|
395
|
+
- `date` - Selector de fecha
|
|
396
|
+
- `daterange` - Rango de fechas
|
|
397
|
+
- `time` - Selector de hora
|
|
398
|
+
- `upload` - Carga de archivos
|
|
399
|
+
- `slider` - Deslizador
|
|
400
|
+
- `color` - Selector de color
|
|
401
|
+
|
|
402
|
+
### Validaciones
|
|
403
|
+
|
|
404
|
+
```tsx
|
|
405
|
+
{
|
|
406
|
+
required: true,
|
|
407
|
+
minLength: 5,
|
|
408
|
+
maxLength: 50,
|
|
409
|
+
min: 0,
|
|
410
|
+
max: 100,
|
|
411
|
+
pattern: /^[A-Z]/,
|
|
412
|
+
email: true,
|
|
413
|
+
url: true,
|
|
414
|
+
customValidator: (value) => value !== 'admin' || 'No se permite este valor'
|
|
415
|
+
}
|
|
416
|
+
```
|
|
417
|
+
|
|
418
|
+
## 🚀 Tecnologías
|
|
419
|
+
|
|
420
|
+
- **React 19** - Librería de UI
|
|
421
|
+
- **TypeScript 5.7** - Tipado estático
|
|
422
|
+
- **Vite 6** - Build tool y dev server
|
|
423
|
+
- **Ant Design 5** - Framework de componentes UI
|
|
424
|
+
- **Tailwind CSS 4** - Framework de utilidades CSS
|
|
425
|
+
- **TanStack Query (React Query)** - Gestión de estado del servidor
|
|
426
|
+
- **Storybook 8** - Desarrollo y documentación de componentes
|
|
427
|
+
- **React Icons** - Iconos
|
|
428
|
+
- **Axios** - Cliente HTTP
|
|
429
|
+
- **Day.js** - Manejo de fechas
|
|
430
|
+
- **jsPDF & jsPDF-AutoTable** - Generación de PDFs
|
|
431
|
+
- **XLSX** - Manejo de archivos Excel
|
|
432
|
+
- **AJV** - Validación de esquemas JSON
|
|
433
|
+
|
|
434
|
+
## 👥 Autores
|
|
435
|
+
|
|
436
|
+
- **@RKamey** - *Colaborador*
|
|
437
|
+
- **@8Wada** - *Colaborador*
|
|
438
|
+
|
|
439
|
+
---
|
|
440
|
+
|
|
441
|
+
<div align="center">
|
|
442
|
+
|
|
443
|
+
**Hecho con ❤️ por el equipo de Innovardix**
|
|
444
|
+
|
|
445
|
+
</div>
|
package/package.json
ADDED
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@sistemas-ucol-mx/ucol-dynamic",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Biblioteca de componentes React con Ant Design y Tailwind CSS",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"files": [
|
|
7
|
+
"dist"
|
|
8
|
+
],
|
|
9
|
+
"main": "./dist/ucol-dynamic.umd.cjs",
|
|
10
|
+
"module": "./dist/ucol-dynamic.js",
|
|
11
|
+
"types": "./dist/ucol-dynamic.d.ts",
|
|
12
|
+
"exports": {
|
|
13
|
+
".": {
|
|
14
|
+
"import": "./dist/ucol-dynamic.js",
|
|
15
|
+
"require": "./dist/ucol-dynamic.umd.cjs",
|
|
16
|
+
"types": "./dist/ucol-dynamic.d.ts"
|
|
17
|
+
},
|
|
18
|
+
"./style.css": "./dist/style.css"
|
|
19
|
+
},
|
|
20
|
+
"repository": {
|
|
21
|
+
"type": "git",
|
|
22
|
+
"url": "git+https://github.com/sistemas-ucol-mx/capi_ui.git"
|
|
23
|
+
},
|
|
24
|
+
"bugs": {
|
|
25
|
+
"url": "https://github.com/sistemas-ucol-mx/capi_ui/issues"
|
|
26
|
+
},
|
|
27
|
+
"homepage": "https://ucol-dynamic.netlify.app/",
|
|
28
|
+
"publishConfig": {
|
|
29
|
+
"access": "public",
|
|
30
|
+
"registry": "https://registry.npmjs.org/"
|
|
31
|
+
},
|
|
32
|
+
"keywords": [
|
|
33
|
+
"react",
|
|
34
|
+
"typescript",
|
|
35
|
+
"vite",
|
|
36
|
+
"tailwindcss",
|
|
37
|
+
"antd",
|
|
38
|
+
"components",
|
|
39
|
+
"ui-library"
|
|
40
|
+
],
|
|
41
|
+
"author": "Innovardix",
|
|
42
|
+
"license": "MIT",
|
|
43
|
+
"scripts": {
|
|
44
|
+
"dev": "vite",
|
|
45
|
+
"build": "tsc -b && vite build",
|
|
46
|
+
"lint": "eslint .",
|
|
47
|
+
"preview": "vite preview",
|
|
48
|
+
"storybook": "storybook dev -p 6006",
|
|
49
|
+
"build-storybook": "storybook build"
|
|
50
|
+
},
|
|
51
|
+
"peerDependencies": {
|
|
52
|
+
"antd": "6.3.0",
|
|
53
|
+
"axios": "^1.13.5",
|
|
54
|
+
"dayjs": "^1.11.13",
|
|
55
|
+
"react": "19.2.4",
|
|
56
|
+
"react-dom": "19.2.4"
|
|
57
|
+
},
|
|
58
|
+
"dependencies": {
|
|
59
|
+
"@ant-design/icons": "^6.1.0",
|
|
60
|
+
"@tailwindcss/vite": "^4.1.11",
|
|
61
|
+
"@tanstack/react-query": "^5.67.3",
|
|
62
|
+
"ajv": "^8.17.1",
|
|
63
|
+
"clsx": "^2.1.1",
|
|
64
|
+
"framer-motion": "^12.29.0",
|
|
65
|
+
"jspdf": "^2.5.2",
|
|
66
|
+
"jspdf-autotable": "^3.8.4",
|
|
67
|
+
"react-icons": "^5.4.0",
|
|
68
|
+
"xlsx": "^0.18.5"
|
|
69
|
+
},
|
|
70
|
+
"devDependencies": {
|
|
71
|
+
"@chromatic-com/storybook": "^3.2.6",
|
|
72
|
+
"@eslint/js": "^9.17.0",
|
|
73
|
+
"@storybook/addon-docs": "^8.6.14",
|
|
74
|
+
"@storybook/addon-essentials": "^8.6.14",
|
|
75
|
+
"@storybook/addon-interactions": "^8.6.14",
|
|
76
|
+
"@storybook/addon-onboarding": "^8.6.14",
|
|
77
|
+
"@storybook/addon-storysource": "^8.6.14",
|
|
78
|
+
"@storybook/addon-styling-webpack": "^1.0.1",
|
|
79
|
+
"@storybook/blocks": "^8.6.14",
|
|
80
|
+
"@storybook/react": "^8.6.14",
|
|
81
|
+
"@storybook/react-vite": "^8.6.14",
|
|
82
|
+
"@storybook/test": "^8.6.14",
|
|
83
|
+
"@tailwindcss/postcss": "^4.0.0",
|
|
84
|
+
"@types/react": "19.2.14",
|
|
85
|
+
"@types/react-dom": "19.2.3",
|
|
86
|
+
"@vitejs/plugin-react": "^5.1.4",
|
|
87
|
+
"antd": "^6.3.0",
|
|
88
|
+
"autoprefixer": "^10.4.20",
|
|
89
|
+
"axios": "^1.13.5",
|
|
90
|
+
"dayjs": "^1.11.19",
|
|
91
|
+
"eslint": "^9.17.0",
|
|
92
|
+
"eslint-plugin-react-hooks": "^5.0.0",
|
|
93
|
+
"eslint-plugin-react-refresh": "^0.4.16",
|
|
94
|
+
"eslint-plugin-storybook": "^0.11.6",
|
|
95
|
+
"globals": "^15.14.0",
|
|
96
|
+
"postcss": "^8.4.49",
|
|
97
|
+
"react": "19.2.4",
|
|
98
|
+
"react-dom": "19.2.4",
|
|
99
|
+
"storybook": "^8.6.14",
|
|
100
|
+
"storybook-addon-customize-antd-theme": "^1.1.0",
|
|
101
|
+
"tailwindcss": "^4.1.11",
|
|
102
|
+
"terser": "^5.37.0",
|
|
103
|
+
"typescript": "^5.7.3",
|
|
104
|
+
"typescript-eslint": "^8.18.2",
|
|
105
|
+
"vite": "^7.2.7",
|
|
106
|
+
"vite-plugin-dts": "^4.5.0"
|
|
107
|
+
},
|
|
108
|
+
"eslintConfig": {
|
|
109
|
+
"extends": [
|
|
110
|
+
"plugin:storybook/recommended"
|
|
111
|
+
]
|
|
112
|
+
}
|
|
113
|
+
}
|