@axzydev/axzy_ui_system 1.2.16 → 1.3.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.
Files changed (65) hide show
  1. package/dist/index.cjs +3349 -1457
  2. package/dist/index.cjs.map +1 -1
  3. package/dist/index.css +1 -1
  4. package/dist/index.d.cts +719 -54
  5. package/dist/index.d.ts +719 -54
  6. package/dist/index.js +3283 -1387
  7. package/dist/index.js.map +1 -1
  8. package/package.json +1 -1
  9. package/src/App.tsx +32 -0
  10. package/src/components/atoms/badget/badget.tsx +2 -4
  11. package/src/components/atoms/chip/chip.doc.mdx +47 -0
  12. package/src/components/atoms/chip/chip.props.ts +32 -0
  13. package/src/components/atoms/chip/chip.stories.tsx +64 -0
  14. package/src/components/atoms/chip/chip.tsx +112 -0
  15. package/src/components/atoms/grid/grid.tsx +1 -2
  16. package/src/components/molecules/accordion/accordion.doc.mdx +47 -0
  17. package/src/components/molecules/accordion/accordion.props.ts +35 -0
  18. package/src/components/molecules/accordion/accordion.stories.tsx +68 -0
  19. package/src/components/molecules/accordion/accordion.tsx +123 -0
  20. package/src/components/molecules/calendar/calendar.doc.mdx +2 -1
  21. package/src/components/molecules/calendar/calendar.tsx +102 -24
  22. package/src/components/molecules/chip-input/chip-input.doc.mdx +44 -0
  23. package/src/components/molecules/chip-input/chip-input.props.ts +42 -0
  24. package/src/components/molecules/chip-input/chip-input.stories.tsx +52 -0
  25. package/src/components/molecules/chip-input/chip-input.tsx +205 -0
  26. package/src/components/molecules/date-picker/datePicker.tsx +45 -56
  27. package/src/components/molecules/dropdown-menu/dropdown-menu.doc.mdx +46 -0
  28. package/src/components/molecules/dropdown-menu/dropdown-menu.props.ts +41 -0
  29. package/src/components/molecules/dropdown-menu/dropdown-menu.stories.tsx +41 -0
  30. package/src/components/molecules/dropdown-menu/dropdown-menu.tsx +219 -0
  31. package/src/components/molecules/field/field.doc.mdx +43 -0
  32. package/src/components/molecules/field/field.props.ts +23 -0
  33. package/src/components/molecules/field/field.stories.tsx +42 -0
  34. package/src/components/molecules/field/field.tsx +54 -0
  35. package/src/components/molecules/masked-input/masked-input.doc.mdx +78 -0
  36. package/src/components/molecules/masked-input/masked-input.props.ts +58 -0
  37. package/src/components/molecules/masked-input/masked-input.stories.tsx +126 -0
  38. package/src/components/molecules/masked-input/masked-input.tsx +244 -0
  39. package/src/components/molecules/multi-select/multi-select.doc.mdx +55 -0
  40. package/src/components/molecules/multi-select/multi-select.props.ts +65 -0
  41. package/src/components/molecules/multi-select/multi-select.stories.tsx +59 -0
  42. package/src/components/molecules/multi-select/multi-select.tsx +386 -0
  43. package/src/components/molecules/search-select/search-select.doc.mdx +5 -0
  44. package/src/components/molecules/search-select/search-select.props.ts +10 -1
  45. package/src/components/molecules/search-select/search-select.stories.tsx +18 -0
  46. package/src/components/molecules/search-select/search-select.tsx +102 -28
  47. package/src/components/molecules/time-picker/timePicker.tsx +14 -26
  48. package/src/components/molecules/wysiwyg/wysiwyg.props.ts +51 -0
  49. package/src/components/molecules/wysiwyg/wysiwyg.stories.tsx +95 -0
  50. package/src/components/molecules/wysiwyg/wysiwyg.tsx +609 -0
  51. package/src/components/organisms/form-builder/fieldRenderer.tsx +144 -27
  52. package/src/components/organisms/form-builder/formBuilder.context.tsx +77 -15
  53. package/src/components/organisms/form-builder/formBuilder.doc.mdx +213 -86
  54. package/src/components/organisms/form-builder/formBuilder.props.ts +118 -36
  55. package/src/components/organisms/form-builder/formBuilder.stories.tsx +694 -96
  56. package/src/components/organisms/form-builder/formBuilder.tsx +152 -69
  57. package/src/components/organisms/form-builder/useFormBuilder.ts +59 -21
  58. package/src/hooks/useFloatingPanel.ts +100 -0
  59. package/src/index.ts +26 -4
  60. package/src/showcases/DataShowcases.tsx +76 -0
  61. package/src/showcases/FormShowcases.tsx +574 -10
  62. package/src/showcases/HomeShowcase.tsx +6 -6
  63. package/src/showcases/NavigationShowcases.tsx +72 -2
  64. package/src/showcases/StructureShowcases.tsx +64 -0
  65. package/src/types/chip.types.ts +13 -0
@@ -1,12 +1,14 @@
1
1
  import React, { useState } from "react";
2
- import { FaInfoCircle, FaSlidersH, FaRegBell, FaSync } from "react-icons/fa";
2
+ import { FaInfoCircle, FaSlidersH, FaRegBell, FaSync, FaEdit, FaCopy, FaTrash, FaDownload } from "react-icons/fa";
3
3
  import {
4
4
  ITTabs,
5
5
  ITStepper,
6
6
  ITPagination,
7
7
  ITTripleFilter,
8
8
  ITSelect,
9
- ITSlideToggle
9
+ ITSlideToggle,
10
+ ITDropdownMenu,
11
+ ITCard
10
12
  } from "../index";
11
13
  import { ShowcaseLayout } from "./ShowcaseLayout";
12
14
 
@@ -191,3 +193,71 @@ export const TripleFilterShowcase = () => {
191
193
  />
192
194
  );
193
195
  };
196
+
197
+ // ITDropdownMenu Showcase
198
+ export const DropdownMenuShowcase = () => {
199
+ const [lastAction, setLastAction] = useState<string>("—");
200
+
201
+ const items = [
202
+ { id: "edit", label: "Editar", icon: <FaEdit />, onClick: () => setLastAction("Editar") },
203
+ { id: "copy", label: "Duplicar", icon: <FaCopy />, shortcut: "⌘D", onClick: () => setLastAction("Duplicar") },
204
+ { id: "download", label: "Descargar", icon: <FaDownload />, disabled: true },
205
+ { id: "delete", label: "Eliminar", icon: <FaTrash />, danger: true, divider: true, onClick: () => setLastAction("Eliminar") },
206
+ ];
207
+
208
+ const code = `<ITDropdownMenu\n items={[\n { id: 'edit', label: 'Editar', icon: <FaEdit />, onClick: edit },\n { id: 'delete', label: 'Eliminar', icon: <FaTrash />, danger: true, divider: true, onClick: remove },\n ]}\n/>`;
209
+
210
+ return (
211
+ <ShowcaseLayout
212
+ title="ITDropdownMenu"
213
+ description="Menú de acciones con navegación por teclado y semántica ARIA. Se renderiza en portal, por lo que no lo recorta un ITCard ni ancestros con overflow: hidden."
214
+ code={code}
215
+ demo={
216
+ <div className="w-full max-w-md">
217
+ <ITCard title="Acciones de fila">
218
+ <div className="flex items-center justify-between">
219
+ <div>
220
+ <p className="text-sm font-semibold text-slate-700 dark:text-slate-200">Reporte Q3.pdf</p>
221
+ <p className="text-xs text-slate-500">Última acción: {lastAction}</p>
222
+ </div>
223
+ <ITDropdownMenu items={items} />
224
+ </div>
225
+ </ITCard>
226
+ </div>
227
+ }
228
+ controls={
229
+ <p className="text-xs text-slate-500">
230
+ Teclado: flechas para navegar, Enter para activar, Esc para cerrar. El menú se abre dentro del ITCard sin recortarse.
231
+ </p>
232
+ }
233
+ gallery={
234
+ <div className="grid grid-cols-1 md:grid-cols-2 gap-8">
235
+ <div className="w-full max-w-xs">
236
+ <p className="mb-3 text-[10px] font-bold uppercase tracking-wider text-slate-400">Trigger personalizado</p>
237
+ <ITDropdownMenu items={items} trigger={<span className="text-sm font-semibold px-1">Acciones</span>} triggerLabel="Acciones" placement="bottom-start" />
238
+ </div>
239
+ <div className="w-full max-w-xs">
240
+ <p className="mb-3 text-[10px] font-bold uppercase tracking-wider text-slate-400">Placement top-start</p>
241
+ <ITDropdownMenu items={items.slice(0, 3)} placement="top-start" />
242
+ </div>
243
+ </div>
244
+ }
245
+ doc={{
246
+ summary: "Menú de acciones accesible (role=menu) en portal, con teclado y flip automático.",
247
+ examples: [
248
+ "<ITDropdownMenu items={items} />",
249
+ "<ITDropdownMenu items={items} trigger={<span>Acciones</span>} placement=\"bottom-start\" />",
250
+ ],
251
+ props: [
252
+ { name: "items", type: "ITDropdownMenuItem[]", required: true, description: "Acciones { id, label, icon?, shortcut?, onClick?, disabled?, danger?, divider? }." },
253
+ { name: "trigger", type: "ReactNode", default: "icono elipsis", description: "Contenido del trigger." },
254
+ { name: "triggerLabel", type: "string", default: '"Abrir menú"', description: "Etiqueta accesible del trigger." },
255
+ { name: "placement", type: '"bottom-start" | "bottom-end" | "top-start" | "top-end"', default: '"bottom-end"', description: "Posición del menú." },
256
+ { name: "onSelect", type: "(id, item) => void", description: "Se dispara al activar un item." },
257
+ { name: "disabled", type: "boolean", default: "false", description: "Deshabilita el trigger." },
258
+ ],
259
+ notes: ["El panel voltea arriba cuando no hay espacio abajo.", "role=menu / menuitem + aria-haspopup / aria-expanded."],
260
+ }}
261
+ />
262
+ );
263
+ };
@@ -30,6 +30,7 @@ import {
30
30
  ITDivider,
31
31
  ITProgress,
32
32
  ITSelect,
33
+ ITAccordion,
33
34
  } from "../index";
34
35
  import { ShowcaseLayout, CodeViewer } from "./ShowcaseLayout";
35
36
 
@@ -1090,3 +1091,66 @@ export const LayoutShowcase = () => {
1090
1091
  />
1091
1092
  );
1092
1093
  };
1094
+
1095
+ // ─────────────────────────────────────────
1096
+ // ITAccordion Showcase
1097
+ // ─────────────────────────────────────────
1098
+ export const AccordionShowcase = () => {
1099
+ const [allowMultiple, setAllowMultiple] = useState(false);
1100
+
1101
+ const items = [
1102
+ { id: "what", title: "¿Qué es AXZY UI System?", content: "Una librería de componentes React + TypeScript con Tailwind CSS v4." },
1103
+ { id: "install", title: "¿Cómo lo instalo?", content: "pnpm add @axzydev/axzy_ui_system" },
1104
+ { id: "theme", title: "¿Puedo personalizar el tema?", content: "Sí, usa ITThemeProvider para definir la paleta y los tokens." },
1105
+ { id: "disabled", title: "Sección deshabilitada", content: "No se puede abrir.", disabled: true },
1106
+ ];
1107
+
1108
+ const code = `<ITAccordion\n allowMultiple={${allowMultiple}}\n defaultOpenIds={['what']}\n items={[\n { id: 'what', title: '¿Qué es AXZY?', content: '...' },\n { id: 'install', title: '¿Cómo lo instalo?', content: '...' },\n ]}\n/>`;
1109
+
1110
+ return (
1111
+ <ShowcaseLayout
1112
+ title="ITAccordion"
1113
+ description="Secciones plegables para FAQs, paneles de configuración y contenido largo. Controlado o no controlado, single o multiple, con animación CSS grid-rows."
1114
+ code={code}
1115
+ demo={
1116
+ <div className="w-full max-w-xl">
1117
+ <ITAccordion items={items} allowMultiple={allowMultiple} defaultOpenIds={["what"]} />
1118
+ </div>
1119
+ }
1120
+ controls={
1121
+ <div className="flex items-center justify-between">
1122
+ <span className="text-sm font-semibold text-gray-700">Permitir múltiples abiertas</span>
1123
+ <ITSlideToggle isOn={allowMultiple} onToggle={setAllowMultiple} size="sm" />
1124
+ </div>
1125
+ }
1126
+ gallery={
1127
+ <div className="grid grid-cols-1 md:grid-cols-2 gap-8">
1128
+ <div>
1129
+ <p className="mb-3 text-[10px] font-bold uppercase tracking-wider text-slate-400">Bordered</p>
1130
+ <ITAccordion items={items.slice(0, 3)} variant="bordered" defaultOpenIds={["install"]} />
1131
+ </div>
1132
+ <div>
1133
+ <p className="mb-3 text-[10px] font-bold uppercase tracking-wider text-slate-400">Separated (default)</p>
1134
+ <ITAccordion items={items.slice(0, 3)} defaultOpenIds={["theme"]} />
1135
+ </div>
1136
+ </div>
1137
+ }
1138
+ doc={{
1139
+ summary: "Secciones plegables (FAQ, settings) controladas o no controladas.",
1140
+ examples: [
1141
+ "<ITAccordion items={items} defaultOpenIds={['a']} />",
1142
+ "<ITAccordion items={items} allowMultiple variant=\"bordered\" />",
1143
+ ],
1144
+ props: [
1145
+ { name: "items", type: "ITAccordionItem[]", required: true, description: "Secciones { id, title, content, icon?, disabled? }." },
1146
+ { name: "allowMultiple", type: "boolean", default: "false", description: "Permite varias abiertas." },
1147
+ { name: "defaultOpenIds", type: "string[]", default: "[]", description: "Abiertas al inicio (no controlado)." },
1148
+ { name: "openIds", type: "string[]", description: "Abiertas (modo controlado)." },
1149
+ { name: "onChange", type: "(openIds: string[]) => void", description: "Devuelve las abiertas." },
1150
+ { name: "variant", type: '"default" | "separated" | "bordered"', default: '"separated"', description: "Estilo visual." },
1151
+ ],
1152
+ notes: ["Los headers exponen aria-expanded / aria-controls; el cuerpo es un region etiquetado."],
1153
+ }}
1154
+ />
1155
+ );
1156
+ };
@@ -0,0 +1,13 @@
1
+ /** Visual styles available for {@link ITChip}. */
2
+ export const chipVariants = {
3
+ soft: "soft",
4
+ filled: "filled",
5
+ outlined: "outlined",
6
+ } as const;
7
+
8
+ /** Padding / font-size scale shared by all chip sizes. */
9
+ export const chipSizes = {
10
+ sm: "text-[11px] px-2 py-0.5 gap-1",
11
+ md: "text-xs px-2.5 py-1 gap-1.5",
12
+ lg: "text-sm px-3 py-1.5 gap-2",
13
+ } as const;