ucol-ui 0.1.23 → 0.1.36

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 CHANGED
@@ -1,31 +1,498 @@
1
- # CalvosTsx
1
+ # ucol-ui
2
2
 
3
- CalvosTsx es una librería de componentes para la creación de interfaces de usuario.
3
+ <div align="center">
4
4
 
5
- ## Instalación
5
+ ![Version](https://img.shields.io/badge/version-0.1.23-blue.svg)
6
+ ![React](https://img.shields.io/badge/react-19.0.0-61dafb.svg)
7
+ ![TypeScript](https://img.shields.io/badge/typescript-5.7.3-blue.svg)
8
+ ![Ant Design](https://img.shields.io/badge/antd-5.24.0-1890ff.svg)
9
+ ![TailwindCSS](https://img.shields.io/badge/tailwindcss-4.1.11-38bdf8.svg)
6
10
 
7
- Para instalar la librería, ejecute el siguiente comando:
11
+ **Una librería completa de componentes React para crear interfaces de usuario modernas y dinámicas**
12
+
13
+ [Demo en vivo](https://kamey-components.netlify.app/) | [Documentación](https://github.com/8Wada/ucol-ui) | [Reportar un error](https://github.com/8Wada/ucol-ui/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
8
50
 
9
51
  ```bash
10
52
  npm install ucol-ui
11
53
  ```
12
54
 
13
- o
55
+ ### Usando pnpm
14
56
 
15
57
  ```bash
16
58
  pnpm install ucol-ui
17
59
  ```
18
60
 
19
- ## Peer Dependencies
61
+ ### Usando yarn
20
62
 
21
- La librería requiere que tengas instaladas las siguientes dependencias:
63
+ ```bash
64
+ yarn add ucol-ui
65
+ ```
66
+
67
+ ## 📚 Peer Dependencies
68
+
69
+ La librería requiere las siguientes dependencias instaladas en tu proyecto:
22
70
 
23
71
  ```json
24
72
  {
25
- "antd": "^5.24.4",
26
- "axios": "^1.8.4",
73
+ "antd": "^5.24.0",
74
+ "axios": "^1.7.9",
27
75
  "dayjs": "^1.11.13",
28
- "react": "^18.3.1",
29
- "react-dom": "^18.3.1"
76
+ "react": "19.0.0",
77
+ "react-dom": "19.0.0"
30
78
  }
31
79
  ```
80
+
81
+ ### Instalación de Peer Dependencies
82
+
83
+ ```bash
84
+ npm install antd axios dayjs react react-dom
85
+ ```
86
+
87
+ ### Importar estilos
88
+
89
+ No olvides importar los estilos CSS en tu aplicación:
90
+
91
+ ```tsx
92
+ import 'ucol-ui/dist/style.css';
93
+ ```
94
+
95
+ ## 🧩 Componentes Principales
96
+
97
+ ### 🎯 DynamicCrud
98
+
99
+ Componente completo CRUD con tabla, formulario modal y acciones personalizables.
100
+
101
+ ```tsx
102
+ import { DynamicCrud } from 'ucol-ui';
103
+
104
+ <DynamicCrud
105
+ title="Gestión de Usuarios"
106
+ description="Administra los usuarios del sistema"
107
+ columns={[
108
+ { title: 'Nombre', dataIndex: 'name', key: 'name' },
109
+ { title: 'Email', dataIndex: 'email', key: 'email' },
110
+ ]}
111
+ fields={[
112
+ { name: 'name', label: 'Nombre', type: 'text', required: true },
113
+ { name: 'email', label: 'Email', type: 'email', required: true },
114
+ ]}
115
+ data={users}
116
+ onCreate={handleCreate}
117
+ onEdit={handleEdit}
118
+ onDelete={handleDelete}
119
+ />
120
+ ```
121
+
122
+ ### 📝 DynamicForm
123
+
124
+ Formulario dinámico generado a partir de configuración JSON.
125
+
126
+ ```tsx
127
+ import { DynamicForm } from 'ucol-ui';
128
+
129
+ <DynamicForm
130
+ mode="create"
131
+ title="Nuevo Usuario"
132
+ layout="vertical"
133
+ cols={2}
134
+ fields={[
135
+ { name: 'name', label: 'Nombre', type: 'text', required: true },
136
+ { name: 'email', label: 'Email', type: 'email', required: true },
137
+ { name: 'age', label: 'Edad', type: 'number' },
138
+ { name: 'active', label: 'Activo', type: 'switch' },
139
+ ]}
140
+ onSubmit={handleSubmit}
141
+ />
142
+ ```
143
+
144
+ ### 📊 DynamicTable
145
+
146
+ Tabla configurable con búsqueda, filtros, paginación y exportación.
147
+
148
+ ```tsx
149
+ import { DynamicTable } from 'ucol-ui';
150
+
151
+ <DynamicTable
152
+ title="Lista de Productos"
153
+ columns={columns}
154
+ data={products}
155
+ loading={isLoading}
156
+ showCreateButton
157
+ onCreate={handleCreate}
158
+ onEdit={handleEdit}
159
+ onDelete={handleDelete}
160
+ exportToExcel={{
161
+ fileName: 'productos',
162
+ sheetName: 'Productos',
163
+ data: products,
164
+ columns: columns
165
+ }}
166
+ searchConfig={{
167
+ searchableFields: ['name', 'category', 'price']
168
+ }}
169
+ />
170
+ ```
171
+
172
+ ### 🔘 Btn (Button)
173
+
174
+ Botón versátil con presets, variantes de color e iconos.
175
+
176
+ ```tsx
177
+ import { Btn } from 'ucol-ui';
178
+
179
+ // Botón con preset
180
+ <Btn preset="save" variant="success">Guardar</Btn>
181
+ <Btn preset="delete" variant="danger">Eliminar</Btn>
182
+ <Btn preset="edit" variant="info">Editar</Btn>
183
+
184
+ // Botón personalizado
185
+ <Btn
186
+ icon={<CustomIcon />}
187
+ variant="warning"
188
+ size="large"
189
+ >
190
+ Acción Personalizada
191
+ </Btn>
192
+
193
+ // Solo icono
194
+ <Btn preset="add" iconOnly />
195
+ ```
196
+
197
+ ### 🔐 PermissionsProvider
198
+
199
+ Sistema de gestión de permisos basado en roles.
200
+
201
+ ```tsx
202
+ import { PermissionsProvider, usePermissions } from 'ucol-ui';
203
+
204
+ // Configurar permisos
205
+ const permissionsConfig = {
206
+ users: {
207
+ admin: ['create', 'read', 'update', 'delete'],
208
+ user: ['read'],
209
+ }
210
+ };
211
+
212
+ // Envolver tu aplicación
213
+ <PermissionsProvider role="admin" config={permissionsConfig}>
214
+ <App />
215
+ </PermissionsProvider>
216
+
217
+ // Usar en componentes
218
+ function UserActions() {
219
+ const { canCreate, canDelete } = usePermissions('users');
220
+
221
+ return (
222
+ <>
223
+ {canCreate && <Btn preset="add">Crear</Btn>}
224
+ {canDelete && <Btn preset="delete">Eliminar</Btn>}
225
+ </>
226
+ );
227
+ }
228
+ ```
229
+
230
+ ### 📤 BulkUploadModal
231
+
232
+ Modal para carga masiva de datos con validación.
233
+
234
+ ```tsx
235
+ import { BulkUploadModal } from 'ucol-ui';
236
+
237
+ <BulkUploadModal
238
+ title="Importar Usuarios"
239
+ visible={showModal}
240
+ config={{
241
+ allowedFormats: ['xlsx', 'csv'],
242
+ maxFileSize: 5,
243
+ templateFields: [
244
+ { name: 'name', label: 'Nombre', required: true },
245
+ { name: 'email', label: 'Email', required: true },
246
+ ]
247
+ }}
248
+ onValidateData={validateUsers}
249
+ onFinish={importUsers}
250
+ onCancel={() => setShowModal(false)}
251
+ />
252
+ ```
253
+
254
+ ### 🔍 SharedField
255
+
256
+ Campo de formulario compartido con validación y tipos múltiples.
257
+
258
+ ```tsx
259
+ import { SharedField } from 'ucol-ui';
260
+
261
+ <SharedField
262
+ name="username"
263
+ label="Usuario"
264
+ type="text"
265
+ required={true}
266
+ placeholder="Ingresa tu usuario"
267
+ validations={{
268
+ minLength: 3,
269
+ maxLength: 20,
270
+ pattern: /^[a-zA-Z0-9]+$/
271
+ }}
272
+ />
273
+ ```
274
+
275
+ ## 🎣 Hooks Personalizados
276
+
277
+ ### useCrudOperations
278
+
279
+ Hook para operaciones CRUD con React Query integrado.
280
+
281
+ ```tsx
282
+ import { useCrudOperations } from 'ucol-ui';
283
+
284
+ function UserManagement() {
285
+ const {
286
+ data: users,
287
+ isLoading,
288
+ createItemAsync,
289
+ updateItemAsync,
290
+ deleteItemAsync,
291
+ refetch
292
+ } = useCrudOperations({
293
+ getAll: () => api.getUsers(),
294
+ create: (user) => api.createUser(user),
295
+ update: (user) => api.updateUser(user),
296
+ delete: (user) => api.deleteUser(user.id),
297
+ idField: 'id',
298
+ entityName: 'usuario'
299
+ });
300
+
301
+ const handleCreate = async (values) => {
302
+ await createItemAsync(values);
303
+ };
304
+
305
+ return <DynamicTable data={users} loading={isLoading} />;
306
+ }
307
+ ```
308
+
309
+ ### useFetchQuery
310
+
311
+ Hook wrapper de React Query con configuración predeterminada.
312
+
313
+ ```tsx
314
+ import { useFetchQuery } from 'ucol-ui';
315
+
316
+ const { data, isLoading, error } = useFetchQuery({
317
+ queryKey: ['users'],
318
+ queryFn: fetchUsers,
319
+ config: {
320
+ onSuccess: (data) => console.log('Datos cargados:', data),
321
+ onError: (error) => console.error('Error:', error)
322
+ }
323
+ });
324
+ ```
325
+
326
+ ### useNotification
327
+
328
+ Hook para mostrar notificaciones del sistema.
329
+
330
+ ```tsx
331
+ import { openNotification } from 'ucol-ui';
332
+
333
+ openNotification('success', 'Operación exitosa', 'Los datos se guardaron correctamente');
334
+ openNotification('error', 'Error', 'No se pudo completar la operación');
335
+ openNotification('warning', 'Advertencia', 'Revisa los datos ingresados');
336
+ openNotification('info', 'Información', 'Proceso en curso');
337
+ ```
338
+
339
+ ### useAsync
340
+
341
+ Hook para manejar operaciones asíncronas.
342
+
343
+ ```tsx
344
+ import { useAsync } from 'ucol-ui';
345
+
346
+ function DataDisplay() {
347
+ const { data, loading, error } = useAsync(
348
+ async () => await fetchData(),
349
+ [dependency]
350
+ );
351
+
352
+ if (loading) return <Spin />;
353
+ if (error) return <Alert type="error" message={error.message} />;
354
+
355
+ return <div>{JSON.stringify(data)}</div>;
356
+ }
357
+ ```
358
+
359
+ ## ⚙️ API y Configuración
360
+
361
+ ### Configuración de API en DynamicForm
362
+
363
+ ```tsx
364
+ <DynamicForm
365
+ apiConfig={{
366
+ url: 'https://api.example.com/users',
367
+ method: 'POST',
368
+ headers: {
369
+ 'Authorization': 'Bearer token',
370
+ 'Content-Type': 'application/json'
371
+ },
372
+ responseDataPath: 'data.user'
373
+ }}
374
+ />
375
+ ```
376
+
377
+ ### Tipos de Campos de Formulario
378
+
379
+ - `text` - Campo de texto
380
+ - `textarea` - Área de texto
381
+ - `number` - Número
382
+ - `email` - Email
383
+ - `password` - Contraseña
384
+ - `select` - Lista desplegable
385
+ - `multiselect` - Selección múltiple
386
+ - `checkbox` - Casilla de verificación
387
+ - `radio` - Botones de radio
388
+ - `switch` - Interruptor
389
+ - `date` - Selector de fecha
390
+ - `daterange` - Rango de fechas
391
+ - `time` - Selector de hora
392
+ - `upload` - Carga de archivos
393
+ - `slider` - Deslizador
394
+ - `color` - Selector de color
395
+
396
+ ### Validaciones
397
+
398
+ ```tsx
399
+ {
400
+ required: true,
401
+ minLength: 5,
402
+ maxLength: 50,
403
+ min: 0,
404
+ max: 100,
405
+ pattern: /^[A-Z]/,
406
+ email: true,
407
+ url: true,
408
+ customValidator: (value) => value !== 'admin' || 'No se permite este valor'
409
+ }
410
+ ```
411
+
412
+ ## 🛠️ Desarrollo
413
+
414
+ ### Clonar el repositorio
415
+
416
+ ```bash
417
+ git clone https://github.com/8Wada/ucol-ui.git
418
+ cd ucol-ui
419
+ ```
420
+
421
+ ### Instalar dependencias
422
+
423
+ ```bash
424
+ pnpm install
425
+ ```
426
+
427
+ ### Iniciar el entorno de desarrollo
428
+
429
+ ```bash
430
+ pnpm dev
431
+ ```
432
+
433
+ ### Ejecutar Storybook
434
+
435
+ ```bash
436
+ pnpm storybook
437
+ ```
438
+
439
+ ## 📜 Scripts Disponibles
440
+
441
+ | Script | Descripción |
442
+ |--------|-------------|
443
+ | `pnpm dev` | Inicia el servidor de desarrollo con Vite |
444
+ | `pnpm build` | Construye la librería para producción |
445
+ | `pnpm lint` | Ejecuta ESLint para revisar el código |
446
+ | `pnpm preview` | Previsualiza la build de producción |
447
+ | `pnpm storybook` | Inicia Storybook en el puerto 6006 |
448
+ | `pnpm build-storybook` | Construye Storybook para producción |
449
+
450
+ ## 🚀 Tecnologías
451
+
452
+ - **React 19** - Librería de UI
453
+ - **TypeScript 5.7** - Tipado estático
454
+ - **Vite 6** - Build tool y dev server
455
+ - **Ant Design 5** - Framework de componentes UI
456
+ - **Tailwind CSS 4** - Framework de utilidades CSS
457
+ - **TanStack Query (React Query)** - Gestión de estado del servidor
458
+ - **Storybook 8** - Desarrollo y documentación de componentes
459
+ - **React Icons** - Iconos
460
+ - **Axios** - Cliente HTTP
461
+ - **Day.js** - Manejo de fechas
462
+ - **jsPDF & jsPDF-AutoTable** - Generación de PDFs
463
+ - **XLSX** - Manejo de archivos Excel
464
+ - **AJV** - Validación de esquemas JSON
465
+
466
+ ## 🤝 Contribuir
467
+
468
+ Las contribuciones son bienvenidas. Por favor:
469
+
470
+ 1. Fork el proyecto
471
+ 2. Crea tu rama de características (`git checkout -b feature/AmazingFeature`)
472
+ 3. Commit tus cambios (`git commit -m 'Add some AmazingFeature'`)
473
+ 4. Push a la rama (`git push origin feature/AmazingFeature`)
474
+ 5. Abre un Pull Request
475
+
476
+ ## 📄 Licencia
477
+
478
+ Este proyecto está bajo la licencia que especifique el repositorio.
479
+
480
+ ## 👥 Autores
481
+
482
+ - **@RKamey** - *Colaborador*
483
+ - **@8Wada** - *Colaborador*
484
+
485
+ ## 🔗 Enlaces
486
+
487
+ - [Repositorio en GitHub](https://github.com/8Wada/ucol-ui)
488
+ - [Demo en vivo](https://kamey-components.netlify.app/)
489
+ - [Reportar Issues](https://github.com/8Wada/ucol-ui/issues)
490
+ - [NPM Package](https://www.npmjs.com/package/ucol-ui)
491
+
492
+ ---
493
+
494
+ <div align="center">
495
+
496
+ **Hecho con ❤️ por el equipo de calvos-tsx**
497
+
498
+ </div>
package/dist/ucol-ui.css CHANGED
@@ -1 +1 @@
1
- /*! tailwindcss v4.1.13 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-space-y-reverse:0;--tw-border-style:solid;--tw-font-weight:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial}}}@layer theme{:root,:host{--font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--color-red-500:oklch(63.7% .237 25.331);--color-red-700:oklch(50.5% .213 27.518);--color-orange-600:oklch(64.6% .222 41.116);--color-yellow-50:oklch(98.7% .026 102.212);--color-yellow-500:oklch(79.5% .184 86.047);--color-yellow-700:oklch(55.4% .135 66.442);--color-green-50:oklch(98.2% .018 155.826);--color-sky-500:oklch(68.5% .169 237.323);--color-sky-700:oklch(50% .134 242.749);--color-blue-50:oklch(97% .014 254.604);--color-blue-500:oklch(62.3% .214 259.815);--color-blue-600:oklch(54.6% .245 262.881);--color-gray-50:oklch(98.5% .002 247.839);--color-gray-100:oklch(96.7% .003 264.542);--color-gray-200:oklch(92.8% .006 264.531);--color-gray-500:oklch(55.1% .027 264.364);--color-gray-700:oklch(37.3% .034 259.733);--color-white:#fff;--spacing:.25rem;--text-sm:.875rem;--text-sm--line-height:calc(1.25/.875);--text-lg:1.125rem;--text-lg--line-height:calc(1.75/1.125);--font-weight-medium:500;--font-weight-semibold:600;--radius-md:.375rem;--radius-lg:.5rem;--radius-2xl:1rem;--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){-webkit-appearance:button;-moz-appearance:button;appearance:button}::file-selector-button{-webkit-appearance:button;-moz-appearance:button;appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}*,:after,:before,::backdrop{border-color:var(--color-gray-200,currentColor)}::file-selector-button{border-color:var(--color-gray-200,currentColor)}}@layer components;@layer utilities{.visible{visibility:visible}.static{position:static}.my-4{margin-block:calc(var(--spacing)*4)}.mt-2{margin-top:calc(var(--spacing)*2)}.mt-4{margin-top:calc(var(--spacing)*4)}.mt-6{margin-top:calc(var(--spacing)*6)}.\!mb-4{margin-bottom:calc(var(--spacing)*4)!important}.mb-3{margin-bottom:calc(var(--spacing)*3)}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.table{display:table}.flex-shrink-0{flex-shrink:0}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.gap-2{gap:calc(var(--spacing)*2)}.gap-4{gap:calc(var(--spacing)*4)}.gap-6{gap:calc(var(--spacing)*6)}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*6)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*6)*calc(1 - var(--tw-space-y-reverse)))}.overflow-x-auto{overflow-x:auto}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.border{border-style:var(--tw-border-style);border-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-b-2{border-bottom-style:var(--tw-border-style);border-bottom-width:2px}.border-blue-500{border-color:var(--color-blue-500)}.\!bg-blue-600{background-color:var(--color-blue-600)!important}.\!bg-orange-600{background-color:var(--color-orange-600)!important}.\!bg-red-500{background-color:var(--color-red-500)!important}.\!bg-sky-500{background-color:var(--color-sky-500)!important}.\!bg-yellow-500{background-color:var(--color-yellow-500)!important}.bg-blue-50{background-color:var(--color-blue-50)}.bg-blue-500{background-color:var(--color-blue-500)}.bg-gray-50{background-color:var(--color-gray-50)}.bg-gray-100{background-color:var(--color-gray-100)}.bg-green-50{background-color:var(--color-green-50)}.bg-white{background-color:var(--color-white)}.bg-yellow-50{background-color:var(--color-yellow-50)}.p-2{padding:calc(var(--spacing)*2)}.p-4{padding:calc(var(--spacing)*4)}.p-6{padding:calc(var(--spacing)*6)}.px-4{padding-inline:calc(var(--spacing)*4)}.px-6{padding-inline:calc(var(--spacing)*6)}.py-2{padding-block:calc(var(--spacing)*2)}.py-4{padding-block:calc(var(--spacing)*4)}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.\!text-white{color:var(--color-white)!important}.text-blue-500{color:var(--color-blue-500)}.text-gray-500{color:var(--color-gray-500)}.text-white{color:var(--color-white)}.capitalize{text-transform:capitalize}.shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a),0 8px 10px -6px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.filter{filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}@media (hover:hover){.hover\:\!bg-red-700:hover{background-color:var(--color-red-700)!important}.hover\:\!bg-sky-700:hover{background-color:var(--color-sky-700)!important}.hover\:\!bg-yellow-700:hover{background-color:var(--color-yellow-700)!important}.hover\:text-gray-700:hover{color:var(--color-gray-700)}}@media (min-width:64rem){.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}}.dynamic-table .ant-table{background:0 0}.dynamic-table .ant-table-thead>tr>th{background:#f8fafc;border-bottom:1px solid #e2e8f0}.dynamic-table .ant-table-tbody>tr>td{border-bottom:1px solid #e2e8f0}.dynamic-table .ant-table-tbody>tr:hover>td{background:#f8fafc}.dynamic-table .ant-table-pagination{margin:16px 24px}.action-button{border-radius:6px;padding:4px 8px}button.ant-btn-warning,button.ant-btn-info,button.ant-btn-danger,button.ant-btn-dangerous,button.ant-btn-primary,button.ant-btn-success,button.ant-btn-reload,button.ant-btn-download{background-color:#fff;border:2px solid;font-weight:bolder;box-shadow:0 0}button.ant-btn-warning{color:#ffca2c;border-color:#ffca2c}button.ant-btn-danger,button.ant-btn-dangerous{color:#dc3545;border-color:#dc3545}button.ant-btn-warning:hover{color:#ffca2c;border-color:#ffca2c}button.ant-btn-danger:hover,button.ant-btn-dangerous:hover{color:#dc3545;border-color:#dc3545}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}
1
+ @layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-space-y-reverse:0;--tw-border-style:solid;--tw-font-weight:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial}}}@layer theme{:root,:host{--font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--color-red-500:oklch(63.7% .237 25.331);--color-red-700:oklch(50.5% .213 27.518);--color-orange-600:oklch(64.6% .222 41.116);--color-yellow-50:oklch(98.7% .026 102.212);--color-yellow-500:oklch(79.5% .184 86.047);--color-yellow-700:oklch(55.4% .135 66.442);--color-green-50:oklch(98.2% .018 155.826);--color-sky-500:oklch(68.5% .169 237.323);--color-sky-700:oklch(50% .134 242.749);--color-blue-50:oklch(97% .014 254.604);--color-blue-500:oklch(62.3% .214 259.815);--color-blue-600:oklch(54.6% .245 262.881);--color-gray-50:oklch(98.5% .002 247.839);--color-gray-100:oklch(96.7% .003 264.542);--color-gray-200:oklch(92.8% .006 264.531);--color-gray-500:oklch(55.1% .027 264.364);--color-gray-700:oklch(37.3% .034 259.733);--color-white:#fff;--spacing:.25rem;--text-sm:.875rem;--text-sm--line-height:calc(1.25/.875);--text-lg:1.125rem;--text-lg--line-height:calc(1.75/1.125);--font-weight-medium:500;--font-weight-semibold:600;--radius-md:.375rem;--radius-lg:.5rem;--radius-2xl:1rem;--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}*,:after,:before,::backdrop{border-color:var(--color-gray-200,currentColor)}::file-selector-button{border-color:var(--color-gray-200,currentColor)}}@layer components;@layer utilities{.visible{visibility:visible}.static{position:static}.my-4{margin-block:calc(var(--spacing)*4)}.mt-2{margin-top:calc(var(--spacing)*2)}.mt-4{margin-top:calc(var(--spacing)*4)}.mt-6{margin-top:calc(var(--spacing)*6)}.\!mb-4{margin-bottom:calc(var(--spacing)*4)!important}.mb-3{margin-bottom:calc(var(--spacing)*3)}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.table{display:table}.flex-shrink-0{flex-shrink:0}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.gap-2{gap:calc(var(--spacing)*2)}.gap-4{gap:calc(var(--spacing)*4)}.gap-6{gap:calc(var(--spacing)*6)}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*6)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*6)*calc(1 - var(--tw-space-y-reverse)))}.overflow-x-auto{overflow-x:auto}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.border{border-style:var(--tw-border-style);border-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-b-2{border-bottom-style:var(--tw-border-style);border-bottom-width:2px}.border-blue-500{border-color:var(--color-blue-500)}.\!bg-blue-600{background-color:var(--color-blue-600)!important}.\!bg-orange-600{background-color:var(--color-orange-600)!important}.\!bg-red-500{background-color:var(--color-red-500)!important}.\!bg-sky-500{background-color:var(--color-sky-500)!important}.\!bg-yellow-500{background-color:var(--color-yellow-500)!important}.bg-blue-50{background-color:var(--color-blue-50)}.bg-blue-500{background-color:var(--color-blue-500)}.bg-gray-50{background-color:var(--color-gray-50)}.bg-gray-100{background-color:var(--color-gray-100)}.bg-green-50{background-color:var(--color-green-50)}.bg-white{background-color:var(--color-white)}.bg-yellow-50{background-color:var(--color-yellow-50)}.p-2{padding:calc(var(--spacing)*2)}.p-4{padding:calc(var(--spacing)*4)}.p-6{padding:calc(var(--spacing)*6)}.px-4{padding-inline:calc(var(--spacing)*4)}.px-6{padding-inline:calc(var(--spacing)*6)}.py-2{padding-block:calc(var(--spacing)*2)}.py-4{padding-block:calc(var(--spacing)*4)}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.\!text-white{color:var(--color-white)!important}.text-blue-500{color:var(--color-blue-500)}.text-gray-500{color:var(--color-gray-500)}.text-white{color:var(--color-white)}.capitalize{text-transform:capitalize}.shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a),0 8px 10px -6px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.filter{filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}@media (hover:hover){.hover\:\!bg-red-700:hover{background-color:var(--color-red-700)!important}.hover\:\!bg-sky-700:hover{background-color:var(--color-sky-700)!important}.hover\:\!bg-yellow-700:hover{background-color:var(--color-yellow-700)!important}.hover\:text-gray-700:hover{color:var(--color-gray-700)}}@media (min-width:64rem){.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}}.dynamic-table .ant-table{background:0 0}.dynamic-table .ant-table-thead>tr>th{background:#f8fafc;border-bottom:1px solid #e2e8f0}.dynamic-table .ant-table-tbody>tr>td{border-bottom:1px solid #e2e8f0}.dynamic-table .ant-table-tbody>tr:hover>td{background:#f8fafc}.dynamic-table .ant-table-pagination{margin:16px 24px}.action-button{border-radius:6px;padding:4px 8px}button.ant-btn-warning,button.ant-btn-info,button.ant-btn-danger,button.ant-btn-dangerous,button.ant-btn-primary,button.ant-btn-success,button.ant-btn-reload,button.ant-btn-download{background-color:#fff;border:2px solid;font-weight:bolder;box-shadow:0 0}button.ant-btn-warning{color:#ffca2c;border-color:#ffca2c}button.ant-btn-danger,button.ant-btn-dangerous{color:#dc3545;border-color:#dc3545}button.ant-btn-warning:hover{color:#ffca2c;border-color:#ffca2c}button.ant-btn-danger:hover,button.ant-btn-dangerous:hover{color:#dc3545;border-color:#dc3545}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}
package/dist/ucol-ui.d.ts CHANGED
@@ -596,10 +596,11 @@ declare type SortFunction<T> = (a: T, b: T) => number;
596
596
 
597
597
  /**
598
598
  * Función para ordenar un arreglo de objetos por una propiedad específica.
599
+ * Soporta notación de punto para propiedades anidadas (ej: "user.first_name").
599
600
  * @param key Propiedad por la que se va a ordenar.
600
601
  * @returns Función de comparación para usar en el método `sort` de un arreglo.
601
602
  */
602
- export declare const sortOrder: <T extends object>(key: keyof T) => SortFunction<T>;
603
+ export declare const sortOrder: <T extends object>(key: keyof T | string) => SortFunction<T>;
603
604
 
604
605
  export declare interface TemplateConfig {
605
606
  entityName: string;
@@ -653,6 +654,20 @@ declare interface UploadConfig {
653
654
  renderPreview?: (value: string) => React.ReactNode;
654
655
  }
655
656
 
657
+ /**
658
+ * Custom hook to handle asynchronous operations.
659
+ *
660
+ * @template T - The type of the data returned by the async function.
661
+ * @param {() => Promise<T>} asyncFunction - The asynchronous function to execute.
662
+ * @param {unknown[]} [dependencies] - Optional array of dependencies for the useEffect hook.
663
+ * @returns {{ data: T | undefined, error: Error | null, loading: boolean }} - An object containing the data, error, and loading state.
664
+ */
665
+ export declare const useAsync: <T>(asyncFunction: () => Promise<T>, dependencies?: unknown[]) => {
666
+ data: T | undefined;
667
+ error: Error | null;
668
+ loading: boolean;
669
+ };
670
+
656
671
  export declare function useCrudOperations<T extends {
657
672
  [key: string]: any;
658
673
  }, CreateT = Omit<T, 'id'>>({ getAll, create, update, delete: deleteItem, idField, entityName, }: CrudOperations<T, CreateT>): {