@codeplex-sac/formularios 0.1.2 → 0.1.5

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 ADDED
@@ -0,0 +1,442 @@
1
+ # @codeplex-sac/formularios
2
+
3
+ Biblioteca de componentes de formulario para aplicaciones React, basada en **Material UI**. Todos los inputs siguen la API en **Español** de la suite `@codeplex-sac/*`.
4
+
5
+ ## Instalación
6
+
7
+ ```bash
8
+ bun add @codeplex-sac/formularios @codeplex-sac/tema @mui/material @emotion/react @emotion/styled
9
+ ```
10
+
11
+ > [!IMPORTANT]
12
+ > Envuelve la aplicación con `CodeplexProveedorTema` de `@codeplex-sac/tema` para que los estilos funcionen correctamente.
13
+
14
+ ---
15
+
16
+ ## Componentes
17
+
18
+ ---
19
+
20
+ ### CodeplexCampoTexto
21
+
22
+ Entrada de texto con iconos, validación visual y soporte multilinea.
23
+
24
+ **Ejemplo:**
25
+ ```tsx
26
+ import { CodeplexCampoTexto } from '@codeplex-sac/formularios';
27
+
28
+ export const Ejemplo = () => (
29
+ <CodeplexCampoTexto
30
+ etiqueta="Correo electrónico"
31
+ marcador="usuario@empresa.com"
32
+ tipo="email"
33
+ anchoCompleto
34
+ />
35
+ );
36
+ ```
37
+
38
+ **Props:**
39
+ | Propiedad | Tipo | Por defecto | Descripción |
40
+ | :--- | :--- | :--- | :--- |
41
+ | `etiqueta` | `ReactNode` | — | Texto de la etiqueta superior. |
42
+ | `valor` | `string \| number` | — | Valor controlado del input. |
43
+ | `alCambiar` | `ChangeEventHandler` | — | Evento al cambiar el valor. |
44
+ | `marcador` | `string` | — | Texto placeholder. |
45
+ | `tipo` | `string` | `'text'` | Tipo HTML del input (`email`, `password`, `number`…). |
46
+ | `multilinea` | `boolean` | `false` | Activa modo textarea. |
47
+ | `filas` | `number` | — | Número fijo de filas en multilinea. |
48
+ | `filasMinimas` | `number` | — | Mínimo de filas en multilinea autoajustable. |
49
+ | `filasMaximas` | `number` | — | Máximo de filas en multilinea autoajustable. |
50
+ | `iconoInicio` | `ReactNode` | — | Icono al inicio del campo. |
51
+ | `iconoFin` | `ReactNode` | — | Icono al final del campo. |
52
+ | `error` | `boolean` | `false` | Activa estado de error. |
53
+ | `mensajeError` | `ReactNode` | — | Texto de error informativo. |
54
+ | `textoAyuda` | `ReactNode` | — | Texto de ayuda bajo el campo. |
55
+ | `deshabilitado` | `boolean` | `false` | Deshabilita la interacción. |
56
+ | `soloLectura` | `boolean` | `false` | Permite visualizar sin editar. |
57
+ | `anchoCompleto` | `boolean` | `false` | Ocupa el 100% del contenedor. |
58
+ | `alEnfocar` | `FocusEventHandler` | — | Evento al enfocar el campo. |
59
+ | `alDesenfocar` | `FocusEventHandler` | — | Evento al perder el foco. |
60
+
61
+ ---
62
+
63
+ ### CodeplexCampoNumero
64
+
65
+ Campo numérico con botones de incremento/decremento integrados.
66
+
67
+ **Ejemplo:**
68
+ ```tsx
69
+ import { CodeplexCampoNumero } from '@codeplex-sac/formularios';
70
+
71
+ export const Ejemplo = () => (
72
+ <CodeplexCampoNumero
73
+ etiqueta="Cantidad"
74
+ minimo={1}
75
+ maximo={100}
76
+ paso={1}
77
+ valor={5}
78
+ alCambiar={(val) => console.log(val)}
79
+ />
80
+ );
81
+ ```
82
+
83
+ **Props:**
84
+ | Propiedad | Tipo | Por defecto | Descripción |
85
+ | :--- | :--- | :--- | :--- |
86
+ | `etiqueta` | `string` | — | Texto descriptivo del campo. |
87
+ | `valor` | `number` | — | Valor controlado. |
88
+ | `alCambiar` | `(val: number) => void` | — | Callback al cambiar. |
89
+ | `minimo` | `number` | — | Valor mínimo permitido. |
90
+ | `maximo` | `number` | — | Valor máximo permitido. |
91
+ | `paso` | `number` | `1` | Incremento por clic en los controles. |
92
+ | `mostrarControles` | `boolean` | `true` | Muestra botones +/−. |
93
+ | `alineacion` | `'izquierda' \| 'centro' \| 'derecha'` | `'centro'` | Alineación del texto. |
94
+ | `deshabilitado` | `boolean` | `false` | Deshabilita el campo. |
95
+ | `anchoCompleto` | `boolean` | `false` | Ocupa el 100% del contenedor. |
96
+
97
+ ---
98
+
99
+ ### CodeplexSelector
100
+
101
+ Dropdown con búsqueda, selección múltiple y opción de crear nuevo elemento.
102
+
103
+ **Ejemplo:**
104
+ ```tsx
105
+ import { CodeplexSelector } from '@codeplex-sac/formularios';
106
+
107
+ const roles = [
108
+ { valor: 'admin', etiqueta: 'Administrador' },
109
+ { valor: 'usuario', etiqueta: 'Usuario' },
110
+ ];
111
+
112
+ export const Ejemplo = () => (
113
+ <CodeplexSelector
114
+ etiqueta="Rol"
115
+ opciones={roles}
116
+ buscable
117
+ alCambiar={(val) => console.log(val)}
118
+ />
119
+ );
120
+ ```
121
+
122
+ **Props:**
123
+ | Propiedad | Tipo | Por defecto | Descripción |
124
+ | :--- | :--- | :--- | :--- |
125
+ | `etiqueta` | `string` | — | Label del selector. |
126
+ | `opciones` | `{ valor, etiqueta, deshabilitado? }[]` | `[]` | Lista de opciones. |
127
+ | `valor` | `string \| number` | — | Valor seleccionado. |
128
+ | `alCambiar` | `SelectChangeEvent handler` | — | Evento de selección. |
129
+ | `buscable` | `boolean` | `false` | Activa filtro de búsqueda. |
130
+ | `marcador` | `string` | — | Placeholder del buscador. |
131
+ | `textoAyuda` | `ReactNode` | — | Texto informativo bajo el selector. |
132
+ | `mensajeError` | `string` | — | Texto de error. |
133
+ | `alCrearNuevo` | `() => void` | — | Muestra botón "Crear nuevo" al final. |
134
+ | `textoCrearNuevo` | `string` | `'Crear nuevo'` | Texto del botón de creación. |
135
+ | `anchoCompleto` | `boolean` | `false` | Ocupa el 100% del contenedor. |
136
+
137
+ ---
138
+
139
+ ### CodeplexAutocompletado
140
+
141
+ Selector con búsqueda en tiempo real y soporte para opciones asíncronas.
142
+
143
+ **Ejemplo:**
144
+ ```tsx
145
+ import { CodeplexAutocompletado } from '@codeplex-sac/formularios';
146
+
147
+ const paises = [
148
+ { etiqueta: 'Perú', valor: 'PE' },
149
+ { etiqueta: 'Chile', valor: 'CL' },
150
+ ];
151
+
152
+ export const Ejemplo = () => (
153
+ <CodeplexAutocompletado
154
+ etiqueta="País"
155
+ opciones={paises}
156
+ alCambiar={(val) => console.log(val)}
157
+ />
158
+ );
159
+ ```
160
+
161
+ **Props:**
162
+ | Propiedad | Tipo | Por defecto | Descripción |
163
+ | :--- | :--- | :--- | :--- |
164
+ | `opciones` | `any[]` | `[]` | Opciones disponibles. |
165
+ | `etiqueta` | `string` | — | Label del campo. |
166
+ | `valor` | `any` | — | Valor seleccionado. |
167
+ | `alCambiar` | `(valor: any) => void` | — | Evento al seleccionar. |
168
+ | `buscable` | `boolean` | `true` | Activa filtrado de opciones. |
169
+ | `multiple` | `boolean` | `false` | Permite selección múltiple. |
170
+ | `deshabilitado` | `boolean` | `false` | Deshabilita el campo. |
171
+ | `anchoCompleto` | `boolean` | `false` | Ocupa el 100% del contenedor. |
172
+
173
+ ---
174
+
175
+ ### CodeplexCasilla
176
+
177
+ Checkbox personalizado con estados indeterminado y múltiples variantes visuales.
178
+
179
+ **Ejemplo:**
180
+ ```tsx
181
+ import { CodeplexCasilla } from '@codeplex-sac/formularios';
182
+
183
+ export const Ejemplo = () => (
184
+ <CodeplexCasilla
185
+ etiqueta="Acepto los términos y condiciones"
186
+ seleccionado={false}
187
+ alCambiar={(_, val) => console.log(val)}
188
+ />
189
+ );
190
+ ```
191
+
192
+ **Props:**
193
+ | Propiedad | Tipo | Por defecto | Descripción |
194
+ | :--- | :--- | :--- | :--- |
195
+ | `etiqueta` | `ReactNode` | — | Texto lateral del checkbox. |
196
+ | `seleccionado` | `boolean` | — | Estado marcado. |
197
+ | `indeterminado` | `boolean` | `false` | Estado parcial (listas padre/hijo). |
198
+ | `tamano` | `'pequeno' \| 'mediano' \| 'grande'` | `'mediano'` | Tamaño visual. |
199
+ | `color` | `'primario' \| 'secundario' \| 'exito' \| 'error' \| 'info' \| 'advertencia'` | `'primario'` | Color al estar marcado. |
200
+ | `variante` | `'estandar' \| 'suave' \| 'borde'` | `'estandar'` | Estilo visual del cuadro. |
201
+ | `posicionEtiqueta` | `'derecha' \| 'izquierda' \| 'arriba' \| 'abajo'` | `'derecha'` | Posición del texto. |
202
+ | `deshabilitado` | `boolean` | `false` | Deshabilita la interacción. |
203
+ | `error` | `boolean` | `false` | Muestra estado de error. |
204
+ | `alCambiar` | `(e, seleccionado: boolean) => void` | — | Callback al cambiar. |
205
+
206
+ ---
207
+
208
+ ### CodeplexGrupoRadio
209
+
210
+ Conjunto de opciones mutuamente excluyentes con diseño personalizado.
211
+
212
+ **Ejemplo:**
213
+ ```tsx
214
+ import { CodeplexGrupoRadio } from '@codeplex-sac/formularios';
215
+
216
+ const opciones = [
217
+ { valor: 'mensual', etiqueta: 'Mensual' },
218
+ { valor: 'anual', etiqueta: 'Anual' },
219
+ ];
220
+
221
+ export const Ejemplo = () => (
222
+ <CodeplexGrupoRadio
223
+ etiqueta="Facturación"
224
+ opciones={opciones}
225
+ valor="mensual"
226
+ alCambiar={(val) => console.log(val)}
227
+ />
228
+ );
229
+ ```
230
+
231
+ **Props:**
232
+ | Propiedad | Tipo | Por defecto | Descripción |
233
+ | :--- | :--- | :--- | :--- |
234
+ | `etiqueta` | `string` | — | Título del grupo. |
235
+ | `opciones` | `{ valor, etiqueta, deshabilitado? }[]` | `[]` | Lista de radios. |
236
+ | `valor` | `any` | — | Valor seleccionado. |
237
+ | `alCambiar` | `(valor: any) => void` | — | Callback al cambiar. |
238
+ | `orientacion` | `'horizontal' \| 'vertical'` | `'vertical'` | Disposición de los radios. |
239
+ | `color` | `'primario' \| 'secundario' \| 'error' \| 'exito' \| 'advertencia' \| 'info'` | `'primario'` | Color del radio activo. |
240
+ | `deshabilitado` | `boolean` | `false` | Deshabilita todo el grupo. |
241
+
242
+ ---
243
+
244
+ ### CodeplexInterruptor
245
+
246
+ Control de encendido/apagado (Switch) con soporte de etiquetas y colores semánticos.
247
+
248
+ **Ejemplo:**
249
+ ```tsx
250
+ import { CodeplexInterruptor } from '@codeplex-sac/formularios';
251
+
252
+ export const Ejemplo = () => (
253
+ <CodeplexInterruptor
254
+ etiqueta="Notificaciones activas"
255
+ seleccionado={true}
256
+ color="exito"
257
+ alCambiar={(_, val) => console.log(val)}
258
+ />
259
+ );
260
+ ```
261
+
262
+ **Props:**
263
+ | Propiedad | Tipo | Por defecto | Descripción |
264
+ | :--- | :--- | :--- | :--- |
265
+ | `etiqueta` | `ReactNode` | — | Texto o elemento lateral. |
266
+ | `seleccionado` | `boolean` | — | Estado activo/inactivo. |
267
+ | `tamano` | `'pequeno' \| 'mediano'` | `'mediano'` | Tamaño visual. |
268
+ | `color` | `'primario' \| 'secundario' \| 'exito' \| 'error' \| 'advertencia' \| 'info'` | `'primario'` | Color al estar activo. |
269
+ | `posicionEtiqueta` | `'inicio' \| 'fin' \| 'arriba' \| 'abajo'` | `'fin'` | Posición de la etiqueta. |
270
+ | `alCambiar` | `(e, checked: boolean) => void` | — | Callback al cambiar estado. |
271
+ | `deshabilitado` | `boolean` | `false` | Deshabilita el interruptor. |
272
+ | `error` | `boolean` | `false` | Muestra estado de error. |
273
+ | `mensajeError` | `string` | — | Texto de error bajo el control. |
274
+
275
+ ---
276
+
277
+ ### CodeplexDeslizador
278
+
279
+ Selector de valor o rango numérico con etiqueta de valor flotante.
280
+
281
+ **Ejemplo:**
282
+ ```tsx
283
+ import { CodeplexDeslizador } from '@codeplex-sac/formularios';
284
+
285
+ export const Ejemplo = () => (
286
+ <CodeplexDeslizador
287
+ etiqueta="Porcentaje de descuento"
288
+ minimo={0}
289
+ maximo={100}
290
+ paso={5}
291
+ valor={25}
292
+ />
293
+ );
294
+ ```
295
+
296
+ **Props:**
297
+ | Propiedad | Tipo | Por defecto | Descripción |
298
+ | :--- | :--- | :--- | :--- |
299
+ | `etiqueta` | `string` | — | Título descriptivo del control. |
300
+ | `valor` | `number \| number[]` | — | Valor actual. |
301
+ | `alCambiar` | `(val: number \| number[]) => void` | — | Callback al mover el control. |
302
+ | `minimo` | `number` | `0` | Límite inferior del rango. |
303
+ | `maximo` | `number` | `100` | Límite superior del rango. |
304
+ | `paso` | `number` | `1` | Incremento mínimo. |
305
+ | `mostrarEtiquetaValor` | `'auto' \| 'siempre' \| 'nunca'` | `'auto'` | Control del globo de valor. |
306
+ | `orientacion` | `'horizontal' \| 'vertical'` | `'horizontal'` | Dirección del slider. |
307
+ | `deshabilitado` | `boolean` | `false` | Deshabilita la interacción. |
308
+
309
+ ---
310
+
311
+ ### CodeplexListaTransferencia
312
+
313
+ Dos columnas que permiten mover elementos entre listas con búsqueda integrada.
314
+
315
+ **Ejemplo:**
316
+ ```tsx
317
+ import { CodeplexListaTransferencia } from '@codeplex-sac/formularios';
318
+
319
+ const empleados = [
320
+ { id: 1, texto: 'Ana García' },
321
+ { id: 2, texto: 'Carlos López' },
322
+ ];
323
+
324
+ export const Ejemplo = () => (
325
+ <CodeplexListaTransferencia
326
+ izquierda={empleados}
327
+ tituloIzquierda="Disponibles"
328
+ tituloDerecha="Asignados al proyecto"
329
+ buscable
330
+ alCambiar={(izq, der) => console.log(izq, der)}
331
+ />
332
+ );
333
+ ```
334
+
335
+ **Props:**
336
+ | Propiedad | Tipo | Por defecto | Descripción |
337
+ | :--- | :--- | :--- | :--- |
338
+ | `izquierda` | `any[]` | `[]` | Elementos de la columna origen. |
339
+ | `derecha` | `any[]` | `[]` | Elementos de la columna destino. |
340
+ | `tituloIzquierda` | `string` | `'Izquierda'` | Cabecera de la lista origen. |
341
+ | `tituloDerecha` | `string` | `'Derecha'` | Cabecera de la lista destino. |
342
+ | `buscable` | `boolean` | `false` | Muestra filtro de búsqueda en ambas listas. |
343
+ | `alCambiar` | `(izq: any[], der: any[]) => void` | — | Se ejecuta al mover elementos. |
344
+
345
+ ---
346
+
347
+ ### CodeplexAreaTextoAjustable
348
+
349
+ Textarea que crece automáticamente con el contenido.
350
+
351
+ **Ejemplo:**
352
+ ```tsx
353
+ import { CodeplexAreaTextoAjustable } from '@codeplex-sac/formularios';
354
+
355
+ export const Ejemplo = () => (
356
+ <CodeplexAreaTextoAjustable
357
+ etiqueta="Descripción"
358
+ filasMinimas={3}
359
+ filasMaximas={8}
360
+ anchoCompleto
361
+ />
362
+ );
363
+ ```
364
+
365
+ **Props:**
366
+ | Propiedad | Tipo | Por defecto | Descripción |
367
+ | :--- | :--- | :--- | :--- |
368
+ | `etiqueta` | `string` | — | Label del campo. |
369
+ | `valor` | `string` | — | Valor controlado. |
370
+ | `alCambiar` | `ChangeEventHandler` | — | Evento al cambiar. |
371
+ | `filasMinimas` | `number` | `3` | Altura mínima en filas. |
372
+ | `filasMaximas` | `number` | — | Altura máxima antes de hacer scroll. |
373
+ | `marcador` | `string` | — | Texto placeholder. |
374
+ | `deshabilitado` | `boolean` | `false` | Deshabilita la edición. |
375
+ | `anchoCompleto` | `boolean` | `false` | Ocupa el 100% del contenedor. |
376
+
377
+ ---
378
+
379
+ ### CodeplexCargadorArchivos
380
+
381
+ Zona de carga de archivos con drag & drop, validación de tipo y tamaño, y lista de archivos cargados.
382
+
383
+ **Ejemplo:**
384
+ ```tsx
385
+ import { CodeplexCargadorArchivos } from '@codeplex-sac/formularios';
386
+
387
+ export const Ejemplo = () => (
388
+ <CodeplexCargadorArchivos
389
+ tiposAceptados={['image/*', '.pdf']}
390
+ tamanoMaximoMb={5}
391
+ multiple
392
+ alCargar={(archivos) => console.log(archivos)}
393
+ />
394
+ );
395
+ ```
396
+
397
+ **Props:**
398
+ | Propiedad | Tipo | Por defecto | Descripción |
399
+ | :--- | :--- | :--- | :--- |
400
+ | `tiposAceptados` | `string[]` | — | MIME types o extensiones permitidas. |
401
+ | `tamanoMaximoMb` | `number` | — | Tamaño máximo por archivo en MB. |
402
+ | `multiple` | `boolean` | `false` | Permite cargar múltiples archivos. |
403
+ | `variante` | `'zona' \| 'compacto' \| 'boton'` | `'zona'` | Presentación del componente. |
404
+ | `alCargar` | `(archivos: File[]) => void` | — | Callback con los archivos validados. |
405
+ | `deshabilitado` | `boolean` | `false` | Deshabilita la zona de carga. |
406
+
407
+ ---
408
+
409
+ ### CodeplexSelectorColor
410
+
411
+ Selector de color con paleta de swatches, input hex y selector nativo del navegador.
412
+
413
+ **Ejemplo:**
414
+ ```tsx
415
+ import { CodeplexSelectorColor } from '@codeplex-sac/formularios';
416
+
417
+ export const Ejemplo = () => (
418
+ <CodeplexSelectorColor
419
+ valor="#3B82F6"
420
+ alCambiar={(color) => console.log(color)}
421
+ />
422
+ );
423
+ ```
424
+
425
+ **Props:**
426
+ | Propiedad | Tipo | Por defecto | Descripción |
427
+ | :--- | :--- | :--- | :--- |
428
+ | `valor` | `string` | `'#000000'` | Color en formato hex. |
429
+ | `alCambiar` | `(color: string) => void` | — | Callback con el nuevo color. |
430
+ | `paleta` | `string[]` | — | Swatches predefinidos. |
431
+ | `variante` | `'emergente' \| 'fija'` | `'emergente'` | Muestra el panel inline o en popup. |
432
+ | `deshabilitado` | `boolean` | `false` | Deshabilita la selección. |
433
+
434
+ ---
435
+
436
+ ## Personalización
437
+
438
+ Todos los componentes heredan la configuración de `CodeplexProveedorTema`. Los colores, radios y sombras se toman del tema activo.
439
+
440
+ ## Licencia
441
+
442
+ Propiedad privada de **Codeplex SAC**. Todos los derechos reservados.