@axzydev/axzy_ui_system 1.4.7 → 1.5.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.
Files changed (226) hide show
  1. package/README.md +2 -11
  2. package/dist/index.cjs +2174 -1570
  3. package/dist/index.cjs.map +1 -1
  4. package/dist/index.css +1 -1
  5. package/dist/index.css.map +1 -1
  6. package/dist/index.d.cts +232 -19
  7. package/dist/index.d.ts +232 -19
  8. package/dist/index.js +1838 -1238
  9. package/dist/index.js.map +1 -1
  10. package/dist/layered.css +1 -1
  11. package/package.json +3 -16
  12. package/src/App.tsx +90 -73
  13. package/src/components/atoms/badget/badget.tsx +23 -5
  14. package/src/components/atoms/chip/chip.tsx +3 -1
  15. package/src/components/atoms/image/image.tsx +3 -1
  16. package/src/components/atoms/input/input.tsx +8 -5
  17. package/src/components/atoms/loader/loader.tsx +3 -1
  18. package/src/components/atoms/slide/slide.props.ts +12 -0
  19. package/src/components/atoms/slide/slide.tsx +3 -0
  20. package/src/components/molecules/alert/alert.tsx +3 -1
  21. package/src/components/molecules/breadcrumbs/breadcrumbs.tsx +3 -1
  22. package/src/components/molecules/calendar/calendar.tsx +9 -6
  23. package/src/components/molecules/card/card.tsx +5 -2
  24. package/src/components/molecules/chip-input/chip-input.tsx +9 -7
  25. package/src/components/molecules/date-picker/datePicker.tsx +9 -9
  26. package/src/components/molecules/dropdown-menu/dropdown-menu.props.ts +1 -1
  27. package/src/components/molecules/dropdown-menu/dropdown-menu.tsx +6 -3
  28. package/src/components/molecules/field/field.tsx +3 -1
  29. package/src/components/molecules/form-header/form-header.tsx +3 -1
  30. package/src/components/molecules/line-bar-chart/line-bar-chart.props.ts +2 -2
  31. package/src/components/molecules/line-bar-chart/line-bar-chart.tsx +20 -15
  32. package/src/components/molecules/masked-input/masked-input.tsx +3 -1
  33. package/src/components/molecules/multi-select/multi-select.tsx +12 -9
  34. package/src/components/molecules/pagination/pagination.tsx +11 -5
  35. package/src/components/molecules/search-select/search-select.tsx +11 -9
  36. package/src/components/molecules/select/select.tsx +6 -4
  37. package/src/components/molecules/stepper/stepper.tsx +6 -4
  38. package/src/components/molecules/table/table.props.ts +10 -2
  39. package/src/components/molecules/table/table.tsx +163 -114
  40. package/src/components/molecules/time-picker/timePicker.tsx +8 -6
  41. package/src/components/molecules/wysiwyg/wysiwyg.tsx +23 -12
  42. package/src/components/organisms/confirm-dialog/confirm-dialog.props.ts +4 -4
  43. package/src/components/organisms/confirm-dialog/confirm-dialog.tsx +16 -8
  44. package/src/components/organisms/data-table/dataTable.props.ts +3 -2
  45. package/src/components/organisms/data-table/dataTable.tsx +149 -81
  46. package/src/components/organisms/dialog/dialog.tsx +3 -0
  47. package/src/components/organisms/drawer/drawer.tsx +3 -0
  48. package/src/components/organisms/dropfile/dropfile.tsx +19 -17
  49. package/src/components/organisms/form-builder/fieldRenderer.tsx +4 -2
  50. package/src/components/organisms/navbar/navbar.tsx +4 -2
  51. package/src/components/organisms/page-header/page-header.tsx +3 -1
  52. package/src/components/organisms/searchTable/components/PaginationControls.tsx +8 -6
  53. package/src/components/organisms/searchTable/components/PaginationInfo.tsx +3 -1
  54. package/src/components/organisms/searchTable/components/SearchAndSortBar.tsx +7 -5
  55. package/src/components/organisms/searchTable/components/SearchInput.tsx +4 -2
  56. package/src/components/organisms/searchTable/components/SortButton.tsx +13 -11
  57. package/src/components/organisms/searchTable/components/TableEmptyState.tsx +4 -2
  58. package/src/components/organisms/searchTable/components/TableRow.tsx +6 -4
  59. package/src/components/organisms/searchTable/searchTable.tsx +4 -2
  60. package/src/components/organisms/sidebar/sidebar.props.ts +1 -1
  61. package/src/components/organisms/sidebar/sidebar.tsx +9 -4
  62. package/src/components/organisms/toast/toast.tsx +3 -1
  63. package/src/components/organisms/topbar/topbar.tsx +4 -2
  64. package/src/components/templates/page/page.props.ts +4 -4
  65. package/src/components/templates/page/page.tsx +6 -4
  66. package/src/components/theme-provider/themeProvider.tsx +28 -17
  67. package/src/dev.css +77 -2
  68. package/src/global.d.ts +10 -0
  69. package/src/i18n/context.ts +9 -0
  70. package/src/i18n/index.ts +22 -0
  71. package/src/i18n/locales/en.ts +163 -0
  72. package/src/i18n/locales/es.ts +165 -0
  73. package/src/i18n/provider.tsx +44 -0
  74. package/src/i18n/translator.ts +82 -0
  75. package/src/i18n/types.ts +54 -0
  76. package/src/i18n/useITTranslation.ts +20 -0
  77. package/src/index.css +0 -1
  78. package/src/index.ts +9 -3
  79. package/src/sandbox/LandingShowcase.tsx +224 -580
  80. package/src/sandbox/NotFoundShowcase.tsx +51 -36
  81. package/src/sandbox/TopbarSearch.tsx +6 -4
  82. package/src/sandbox/controls.tsx +180 -0
  83. package/src/sandbox/i18n.ts +1929 -0
  84. package/src/sandbox/icons.tsx +25 -0
  85. package/src/sandbox/locale.tsx +72 -0
  86. package/src/sandbox/ui.tsx +377 -0
  87. package/src/sandbox/useHashRoute.ts +46 -10
  88. package/src/showcases/DataShowcases.tsx +201 -80
  89. package/src/showcases/FeedbackShowcases.tsx +37 -30
  90. package/src/showcases/FormShowcases.tsx +302 -214
  91. package/src/showcases/GettingStartedShowcase.tsx +151 -145
  92. package/src/showcases/HelpShowcase.tsx +126 -128
  93. package/src/showcases/HomeShowcase.tsx +678 -482
  94. package/src/showcases/LayoutPrimitivesShowcases.tsx +129 -114
  95. package/src/showcases/NavigationShowcases.tsx +45 -37
  96. package/src/showcases/PageShowcases.tsx +171 -152
  97. package/src/showcases/ProductoDetalle.tsx +272 -129
  98. package/src/showcases/ShowcaseLayout.tsx +270 -216
  99. package/src/showcases/SizesShowcase.tsx +123 -64
  100. package/src/showcases/StructureShowcases.tsx +157 -131
  101. package/src/showcases/portfolioUi.tsx +153 -0
  102. package/src/showcases/techIcons.ts +3 -0
  103. package/src/types/table.types.ts +110 -0
  104. package/src/utils/table.utils.ts +10 -2
  105. package/src/components/atoms/avatar/avatar.doc.mdx +0 -48
  106. package/src/components/atoms/avatar/avatar.stories.tsx +0 -64
  107. package/src/components/atoms/badget/badget.doc.mdx +0 -46
  108. package/src/components/atoms/badget/badget.stories.tsx +0 -75
  109. package/src/components/atoms/button/button.doc.mdx +0 -59
  110. package/src/components/atoms/button/button.stories.tsx +0 -173
  111. package/src/components/atoms/checkbox/checkbox.doc.mdx +0 -54
  112. package/src/components/atoms/checkbox/checkbox.stories.tsx +0 -53
  113. package/src/components/atoms/chip/chip.doc.mdx +0 -47
  114. package/src/components/atoms/chip/chip.stories.tsx +0 -64
  115. package/src/components/atoms/divider/divider.doc.mdx +0 -42
  116. package/src/components/atoms/divider/divider.stories.tsx +0 -33
  117. package/src/components/atoms/flex/flex.doc.mdx +0 -59
  118. package/src/components/atoms/flex/flex.stories.tsx +0 -70
  119. package/src/components/atoms/grid/grid.doc.mdx +0 -54
  120. package/src/components/atoms/grid/grid.stories.tsx +0 -71
  121. package/src/components/atoms/image/image.doc.mdx +0 -44
  122. package/src/components/atoms/image/image.stories.tsx +0 -48
  123. package/src/components/atoms/input/input.doc.mdx +0 -70
  124. package/src/components/atoms/input/input.stories.tsx +0 -113
  125. package/src/components/atoms/input-number/input-number.doc.mdx +0 -74
  126. package/src/components/atoms/input-number/input-number.stories.tsx +0 -111
  127. package/src/components/atoms/loader/loader.doc.mdx +0 -43
  128. package/src/components/atoms/loader/loader.stories.tsx +0 -104
  129. package/src/components/atoms/popover/popover.doc.mdx +0 -53
  130. package/src/components/atoms/popover/popover.stories.tsx +0 -24
  131. package/src/components/atoms/progress/progress.doc.mdx +0 -48
  132. package/src/components/atoms/progress/progress.stories.tsx +0 -39
  133. package/src/components/atoms/radio/radio.doc.mdx +0 -62
  134. package/src/components/atoms/radio/radio.stories.tsx +0 -48
  135. package/src/components/atoms/segmented-control/segmented-control.doc.mdx +0 -60
  136. package/src/components/atoms/segmented-control/segmented-control.stories.tsx +0 -62
  137. package/src/components/atoms/skeleton/skeleton.doc.mdx +0 -43
  138. package/src/components/atoms/skeleton/skeleton.stories.tsx +0 -29
  139. package/src/components/atoms/slide/slide.doc.mdx +0 -46
  140. package/src/components/atoms/slide/slide.stories.tsx +0 -120
  141. package/src/components/atoms/slider/slider.doc.mdx +0 -49
  142. package/src/components/atoms/slider/slider.stories.tsx +0 -29
  143. package/src/components/atoms/stack/stack.doc.mdx +0 -126
  144. package/src/components/atoms/stack/stack.stories.tsx +0 -283
  145. package/src/components/atoms/text/text.doc.mdx +0 -41
  146. package/src/components/atoms/text/text.stories.tsx +0 -66
  147. package/src/components/atoms/textarea/textarea.doc.mdx +0 -64
  148. package/src/components/atoms/textarea/textarea.stories.tsx +0 -26
  149. package/src/components/atoms/tooltip/tooltip.doc.mdx +0 -47
  150. package/src/components/atoms/tooltip/tooltip.stories.tsx +0 -19
  151. package/src/components/isolation/isolation.stories.tsx +0 -202
  152. package/src/components/molecules/accordion/accordion.doc.mdx +0 -47
  153. package/src/components/molecules/accordion/accordion.stories.tsx +0 -68
  154. package/src/components/molecules/alert/alert.doc.mdx +0 -48
  155. package/src/components/molecules/alert/alert.stories.tsx +0 -40
  156. package/src/components/molecules/breadcrumbs/breadcrumbs.doc.mdx +0 -57
  157. package/src/components/molecules/breadcrumbs/breadcrumbs.stories.tsx +0 -20
  158. package/src/components/molecules/calendar/calendar.doc.mdx +0 -76
  159. package/src/components/molecules/calendar/calendar.stories.tsx +0 -90
  160. package/src/components/molecules/card/card.doc.mdx +0 -54
  161. package/src/components/molecules/card/card.stories.tsx +0 -57
  162. package/src/components/molecules/chip-input/chip-input.doc.mdx +0 -44
  163. package/src/components/molecules/chip-input/chip-input.stories.tsx +0 -52
  164. package/src/components/molecules/date-picker/date-picker.doc.mdx +0 -65
  165. package/src/components/molecules/date-picker/date-picker.stories.tsx +0 -88
  166. package/src/components/molecules/dropdown-menu/dropdown-menu.doc.mdx +0 -46
  167. package/src/components/molecules/dropdown-menu/dropdown-menu.stories.tsx +0 -41
  168. package/src/components/molecules/empty-state/empty-state.doc.mdx +0 -50
  169. package/src/components/molecules/empty-state/empty-state.stories.tsx +0 -19
  170. package/src/components/molecules/field/field.doc.mdx +0 -43
  171. package/src/components/molecules/field/field.stories.tsx +0 -42
  172. package/src/components/molecules/form-header/form-header.doc.mdx +0 -38
  173. package/src/components/molecules/form-header/form-header.stories.tsx +0 -52
  174. package/src/components/molecules/masked-input/masked-input.doc.mdx +0 -78
  175. package/src/components/molecules/masked-input/masked-input.stories.tsx +0 -126
  176. package/src/components/molecules/multi-select/multi-select.doc.mdx +0 -55
  177. package/src/components/molecules/multi-select/multi-select.stories.tsx +0 -59
  178. package/src/components/molecules/pagination/pagination.doc.mdx +0 -62
  179. package/src/components/molecules/pagination/pagination.stories.tsx +0 -110
  180. package/src/components/molecules/search-select/search-select.doc.mdx +0 -77
  181. package/src/components/molecules/search-select/search-select.stories.tsx +0 -146
  182. package/src/components/molecules/select/select.doc.mdx +0 -75
  183. package/src/components/molecules/select/select.stories.tsx +0 -85
  184. package/src/components/molecules/stat-card/stat-card.doc.mdx +0 -48
  185. package/src/components/molecules/stat-card/stat-card.stories.tsx +0 -40
  186. package/src/components/molecules/stepper/stepper.doc.mdx +0 -54
  187. package/src/components/molecules/stepper/stepper.stories.tsx +0 -154
  188. package/src/components/molecules/table/table.doc.mdx +0 -123
  189. package/src/components/molecules/table/table.stories.tsx +0 -402
  190. package/src/components/molecules/tabs/tabs.doc.mdx +0 -52
  191. package/src/components/molecules/tabs/tabs.stories.tsx +0 -31
  192. package/src/components/molecules/time-picker/timePicker.doc.mdx +0 -68
  193. package/src/components/molecules/time-picker/timePicker.stories.tsx +0 -130
  194. package/src/components/molecules/wysiwyg/wysiwyg.stories.tsx +0 -95
  195. package/src/components/organisms/confirm-dialog/confirm-dialog.doc.mdx +0 -60
  196. package/src/components/organisms/confirm-dialog/confirm-dialog.stories.tsx +0 -32
  197. package/src/components/organisms/data-table/ITDataTable.doc.mdx +0 -115
  198. package/src/components/organisms/data-table/ITDataTable.stories.tsx +0 -353
  199. package/src/components/organisms/dialog/dialog.doc.mdx +0 -54
  200. package/src/components/organisms/dialog/dialog.stories.tsx +0 -126
  201. package/src/components/organisms/drawer/drawer.doc.mdx +0 -59
  202. package/src/components/organisms/drawer/drawer.stories.tsx +0 -40
  203. package/src/components/organisms/dropfile/dropfile.doc.mdx +0 -74
  204. package/src/components/organisms/dropfile/dropfile.stories.tsx +0 -93
  205. package/src/components/organisms/form-builder/formBuilder.doc.mdx +0 -251
  206. package/src/components/organisms/form-builder/formBuilder.stories.tsx +0 -914
  207. package/src/components/organisms/navbar/navbar.doc.mdx +0 -77
  208. package/src/components/organisms/navbar/navbar.stories.tsx +0 -83
  209. package/src/components/organisms/page-header/page-header.doc.mdx +0 -54
  210. package/src/components/organisms/page-header/page-header.stories.tsx +0 -74
  211. package/src/components/organisms/searchTable/searchTable.doc.mdx +0 -79
  212. package/src/components/organisms/searchTable/searchTable.stories.tsx +0 -73
  213. package/src/components/organisms/sidebar/sidebar.doc.mdx +0 -176
  214. package/src/components/organisms/sidebar/sidebar.stories.tsx +0 -234
  215. package/src/components/organisms/toast/toast.doc.mdx +0 -50
  216. package/src/components/organisms/toast/toast.stories.tsx +0 -137
  217. package/src/components/organisms/topbar/topbar.doc.mdx +0 -72
  218. package/src/components/organisms/topbar/topbar.stories.tsx +0 -79
  219. package/src/components/organisms/triple-filter/tripleFilter.doc.mdx +0 -62
  220. package/src/components/organisms/triple-filter/tripleFilter.stories.tsx +0 -31
  221. package/src/components/templates/layout/layout.doc.mdx +0 -53
  222. package/src/components/templates/layout/layout.stories.tsx +0 -113
  223. package/src/components/templates/page/page.doc.mdx +0 -86
  224. package/src/components/templates/page/page.stories.tsx +0 -97
  225. package/src/components/theme-provider/themeProvider.doc.mdx +0 -85
  226. package/src/components/theme-provider/themeProvider.stories.tsx +0 -58
@@ -1,42 +0,0 @@
1
- import type { Meta, StoryObj } from "@storybook/react";
2
- import ITField from "@/components/molecules/field/field";
3
- import ITInput from "@/components/atoms/input/input";
4
-
5
- const meta: Meta<typeof ITField> = {
6
- title: "Components/Form Elements/ITField",
7
- component: ITField,
8
- parameters: { layout: "centered" },
9
- };
10
-
11
- export default meta;
12
- type Story = StoryObj<typeof ITField>;
13
-
14
- export const Default: Story = {
15
- render: () => (
16
- <div className="w-[360px]">
17
- <ITField label="Nombre completo" htmlFor="name" required helpText="Como aparece en tu identificación.">
18
- <ITInput name="name" value="" onChange={() => {}} onBlur={() => {}} />
19
- </ITField>
20
- </div>
21
- ),
22
- };
23
-
24
- export const WithError: Story = {
25
- render: () => (
26
- <div className="w-[360px]">
27
- <ITField label="Correo" htmlFor="email" required error="Ingresa un correo válido.">
28
- <ITInput name="email" value="correo-malo" onChange={() => {}} onBlur={() => {}} />
29
- </ITField>
30
- </div>
31
- ),
32
- };
33
-
34
- export const GenericError: Story = {
35
- render: () => (
36
- <div className="w-[360px]">
37
- <ITField label="RFC" htmlFor="rfc" required error>
38
- <ITInput name="rfc" value="" onChange={() => {}} onBlur={() => {}} />
39
- </ITField>
40
- </div>
41
- ),
42
- };
@@ -1,38 +0,0 @@
1
- import { Meta, Title, Description, Primary, Controls, Stories } from '@storybook/blocks';
2
- import * as StoriesData from './form-header.stories';
3
-
4
- <Meta of={StoriesData} />
5
-
6
- # ITFormHeader
7
-
8
- A colored header bar for modal dialogs and form containers. Displays a title centered on a primary-colored background, with an optional close (X) button on the right side.
9
-
10
- ## Props
11
-
12
- | Prop | Type | Default | Description |
13
- |------|------|---------|-------------|
14
- | `title` | `string` | required | Header title text, centered in the bar. |
15
- | `onClose` | `() => void` | `undefined` | Optional close button handler. When provided, an X button renders. |
16
- | `className` | `string` | `undefined` | Additional CSS classes applied to the container. |
17
-
18
- ## Usage
19
-
20
- ```tsx
21
- import { ITFormHeader } from '@axzydev/axzy_ui_system';
22
-
23
- <ITFormHeader title="Edit Record" />
24
- <ITFormHeader title="Confirm" onClose={() => handleClose()} />
25
- ```
26
-
27
- ## Notes
28
-
29
- - Uses the theme primary color as the background.
30
- - The title truncates with ellipsis when it overflows the available width.
31
- - Close button is only rendered when `onClose` is provided.
32
- - Intended for use inside modals, drawers, or form panels.
33
-
34
- ## Stories
35
-
36
- <Primary />
37
- <Controls />
38
- <Stories />
@@ -1,52 +0,0 @@
1
- import type { Meta, StoryObj } from '@storybook/react';
2
- import ITFormHeader from '@/components/molecules/form-header/form-header';
3
-
4
- const meta = {
5
- title: 'Components/Feedback/ITFormHeader',
6
- component: ITFormHeader,
7
- parameters: { layout: 'centered' },
8
- argTypes: {
9
- title: { control: 'text', description: 'The title displayed in the header' },
10
- onClose: { control: false, description: 'Optional close button handler' },
11
- className: { control: 'text', description: 'Additional CSS classes' },
12
- },
13
- } satisfies Meta<typeof ITFormHeader>;
14
-
15
- export default meta;
16
- type Story = StoryObj<typeof meta>;
17
-
18
- export const Default: Story = {
19
- args: { title: 'Form Header' },
20
- render: (args) => (
21
- <div className="w-80">
22
- <ITFormHeader {...args} />
23
- </div>
24
- ),
25
- };
26
-
27
- export const WithClose: Story = {
28
- args: { title: 'Editable Form' },
29
- render: (args) => (
30
- <div className="w-80">
31
- <ITFormHeader {...args} onClose={() => alert('Close clicked')} />
32
- </div>
33
- ),
34
- };
35
-
36
- export const LongTitle: Story = {
37
- args: { title: 'Confirmación de Auditoría de Expediente Clínico' },
38
- render: (args) => (
39
- <div className="w-80">
40
- <ITFormHeader {...args} />
41
- </div>
42
- ),
43
- };
44
-
45
- export const ShortTitle: Story = {
46
- args: { title: 'Edit' },
47
- render: (args) => (
48
- <div className="w-80">
49
- <ITFormHeader {...args} />
50
- </div>
51
- ),
52
- };
@@ -1,78 +0,0 @@
1
- import { Meta, Title, Description, Primary, Controls, Stories } from '@storybook/blocks';
2
- import * as StoriesData from './masked-input.stories';
3
-
4
- <Meta of={StoriesData} />
5
-
6
- # ITMaskedInput
7
-
8
- Input con máscara de formato: defines un patrón y el usuario solo escribe los caracteres útiles; los separadores se insertan solos y los huecos se pintan con un carácter de relleno.
9
-
10
- ## Props
11
-
12
- | Prop | Type | Default | Description |
13
- |------|------|---------|-------------|
14
- | `name` | `string` | required | Nombre del campo para formularios. |
15
- | `mask` | `string` | required | Patrón: `9`=dígito, `A`=letra (mayúscula), `a`=letra, `x`=alfanumérico, `*`=cualquiera. Cualquier otro carácter es un separador literal auto-insertado. |
16
- | `value` | `string` | — | Valor limpio (raw): solo caracteres útiles, sin separadores ni relleno. |
17
- | `onChange` | `(e) => void` | required | `e.target.value` es el valor raw. |
18
- | `onBlur` | `(e) => void` | — | Blur del input. |
19
- | `onComplete` | `(value) => void` | — | Dispara cuando la máscara queda llena. |
20
- | `pattern` | `RegExp` | — | Regex validada con full-match contra el raw en blur; si no cumple muestra error. |
21
- | `placeholderChar` | `string` | `"_"` | Carácter pintado en slots vacíos. |
22
- | `variant` | `ColorsTypes` | `"primary"` | Color de acento del tema. |
23
- | `size` | `"sm" \| "md" \| "lg"` | `"md"` | Tamaño del input. |
24
- | `label` | `string` | — | Etiqueta sobre el input. |
25
- | `disabled` | `boolean` | `false` | Desactiva el input. |
26
- | `required` | `boolean` | `false` | Marca el campo como requerido. |
27
- | `touched` | `boolean` | `false` | Indica si el campo fue tocado. |
28
- | `error` | `string \| boolean` | — | Estado de error. |
29
- | `className` | `string` | — | Clases del wrapper externo. |
30
- | `containerClassName` | `string` | — | Clases del contenedor del input. |
31
- | `iconLeft` / `iconRight` | `ReactNode` | — | Iconos laterales. |
32
- | `autoFocus` | `boolean` | `false` | Enfoca al montar. |
33
-
34
- ## Tokens del mask
35
-
36
- | Token | Acepta |
37
- |-------|--------|
38
- | `9` | un dígito |
39
- | `A` | una letra (se guarda en mayúsculas) |
40
- | `a` | una letra (tal cual) |
41
- | `x` | un carácter alfanumérico |
42
- | `*` | cualquier carácter |
43
- | cualquier otro | literal insertado solo (p.ej. `-`, `/`, `(`, `)`, espacio) |
44
-
45
- ## Usage
46
-
47
- ```tsx
48
- import { ITMaskedInput } from '@axzydev/axzy_ui_system';
49
-
50
- // Código de activación
51
- <ITMaskedInput
52
- name="code"
53
- mask="xxxx-xxxx-xxxx"
54
- label="Código"
55
- onChange={(e) => setCode(e.target.value)}
56
- />
57
-
58
- // Teléfono con validación regex sobre el valor limpio
59
- <ITMaskedInput
60
- name="phone"
61
- mask="(999) 999-9999"
62
- pattern={/^\d{10}$/}
63
- onChange={(e) => setPhone(e.target.value)}
64
- />
65
- ```
66
-
67
- ## Notes
68
-
69
- - ¿El valor? **Solo caracteres útiles**: escribir `ABC1-2345-6789` devuelve `ABC123456789` en `onChange`.
70
- - El cursor salta a huecos vacíos con selección automática; borrar un separador lo vuelve a insertar.
71
- - `pattern` valida contra el raw completo (full-match); el mensaje de error genérico es "Formato inválido" salvo que pases `error` como string.
72
- - `onComplete` es ideal para tarjetas, CVV o códigos de un solo uso.
73
-
74
- ## Stories
75
-
76
- <Primary />
77
- <Controls />
78
- <Stories />
@@ -1,126 +0,0 @@
1
- import type { Meta } from '@storybook/react';
2
- import { useState } from 'react';
3
- import ITMaskedInput from './masked-input';
4
-
5
- const meta = {
6
- title: 'Components/Form Elements/ITMaskedInput',
7
- component: ITMaskedInput,
8
- parameters: { layout: 'padded' },
9
- argTypes: {
10
- mask: { control: 'text' },
11
- placeholderChar: { control: 'text' },
12
- onChange: { action: 'changed' },
13
- onComplete: { action: 'completed' },
14
- disabled: { control: 'boolean' },
15
- error: { control: 'text' },
16
- variant: {
17
- control: 'select',
18
- options: ['primary', 'secondary', 'success', 'danger', 'warning', 'info', 'purple', 'gray'],
19
- },
20
- size: { control: 'select', options: ['sm', 'md', 'lg'] },
21
- },
22
- } satisfies Meta<typeof ITMaskedInput>;
23
-
24
- export default meta;
25
-
26
- function CodeMaskedWrapper(args: any) {
27
- const [value, setValue] = useState<string>('');
28
- return (
29
- <div className="w-full max-w-xs">
30
- <ITMaskedInput
31
- {...args}
32
- value={value}
33
- onChange={(e) => {
34
- setValue(e.target.value);
35
- args.onChange(e);
36
- }}
37
- />
38
- <p className="mt-2 text-xs font-mono text-slate-500">
39
- raw: {value || '(vacío)'}
40
- </p>
41
- </div>
42
- );
43
- }
44
-
45
- export const Alphanumeric: any = {
46
- render: CodeMaskedWrapper,
47
- args: {
48
- name: 'code',
49
- label: 'Código único',
50
- mask: 'xxxx-xxxx-xxxx',
51
- },
52
- };
53
-
54
- export const Phone: any = {
55
- render: CodeMaskedWrapper,
56
- args: {
57
- name: 'phone',
58
- label: 'Teléfono',
59
- mask: '(999) 999-9999',
60
- },
61
- };
62
-
63
- export const CreditCard: any = {
64
- render: CodeMaskedWrapper,
65
- args: {
66
- name: 'card',
67
- label: 'Número de tarjeta',
68
- mask: '9999-9999-9999-9999',
69
- onComplete: undefined,
70
- },
71
- };
72
-
73
- const PhoneValidatedWrapper = (args: any) => {
74
- const [value, setValue] = useState<string>('5512345678');
75
- const [complete, setComplete] = useState<string | null>(null);
76
- return (
77
- <div className="w-full max-w-xs">
78
- <ITMaskedInput
79
- {...args}
80
- value={value}
81
- onChange={(e) => {
82
- setValue(e.target.value);
83
- args.onChange(e);
84
- setComplete(null);
85
- }}
86
- onComplete={(v) => setComplete(v)}
87
- />
88
- {complete && (
89
- <p className="mt-2 text-xs font-mono text-emerald-600">
90
- ¡Completo! raw: {complete}
91
- </p>
92
- )}
93
- </div>
94
- );
95
- };
96
-
97
- export const WithPattern: any = {
98
- render: PhoneValidatedWrapper,
99
- args: {
100
- name: 'validated_phone',
101
- label: 'Teléfono válido (regex)',
102
- mask: '999-999-9999',
103
- pattern: /^\d{9}$/,
104
- },
105
- };
106
-
107
- export const Sizes: any = {
108
- render: () => (
109
- <div className="flex flex-col gap-4 w-full max-w-xs">
110
- <ITMaskedInput name="sz_sm" label="Small" mask="xxxx-xxxx" size="sm" onChange={() => {}} />
111
- <ITMaskedInput name="sz_md" label="Medium" mask="xxxx-xxxx" size="md" onChange={() => {}} />
112
- <ITMaskedInput name="sz_lg" label="Large" mask="xxxx-xxxx" size="lg" onChange={() => {}} />
113
- </div>
114
- ),
115
- };
116
-
117
- export const Disabled: any = {
118
- args: {
119
- name: 'disabled_code',
120
- label: 'Deshabilitado',
121
- mask: 'xxxx-xxxx',
122
- value: 'abcd',
123
- disabled: true,
124
- onChange: () => {},
125
- },
126
- };
@@ -1,55 +0,0 @@
1
- import { Meta, Title, Description, Primary, Controls, Stories } from '@storybook/blocks';
2
- import * as StoriesData from './multi-select.stories';
3
-
4
- <Meta of={StoriesData} />
5
-
6
- # ITMultiSelect
7
-
8
- Multi-value select with searchable dropdown, removable chips, and keyboard navigation.
9
-
10
- ## Props
11
-
12
- | Prop | Type | Default | Description |
13
- |------|------|---------|-------------|
14
- | `options` | `ITMultiSelectOption[]` | — | Available options `{ label, value, ...custom }`. |
15
- | `value` | `(string \| number)[]` | — | Selected values (controlled). |
16
- | `onChange` | `(values, options) => void` | — | Fired with the next selected values. |
17
- | `label` | `string` | — | Label above the control. |
18
- | `placeholder` | `string` | `"Selecciona opciones"` | Placeholder when empty. |
19
- | `valueField` | `string` | `"value"` | Field used as the option value. |
20
- | `labelField` | `string` | `"label"` | Field used as the option label. |
21
- | `size` | `"sm" \| "md" \| "lg"` | `"md"` | Control size. |
22
- | `maxVisibleChips` | `number` | `3` | Chips shown before collapsing into `+N`. |
23
- | `clearable` | `boolean` | `true` | Shows a clear-all (X) button. |
24
- | `searchable` | `boolean` | `true` | Enables the search input. |
25
- | `onSearch` | `(query) => void` | — | Server-side search callback. |
26
- | `isLoading` | `boolean` | `false` | Loading state for remote options. |
27
- | `noResultsMessage` | `string` | `"No se encontraron resultados"` | Empty-results message. |
28
- | `renderOption` | `(option, { isSelected, searchTerm }) => ReactNode` | — | Custom option template. |
29
- | `disabled` / `readOnly` / `required` / `touched` / `error` | — | — | Standard form states. |
30
-
31
- ## Usage
32
-
33
- ```tsx
34
- import { ITMultiSelect } from '@axzydev/axzy_ui_system';
35
-
36
- <ITMultiSelect
37
- label="Skills"
38
- options={skills}
39
- value={selected}
40
- onChange={(values) => setSelected(values)}
41
- maxVisibleChips={3}
42
- />
43
- ```
44
-
45
- ## Notes
46
-
47
- - Keyboard: `ArrowUp`/`ArrowDown` navigate, `Enter` toggles, `Backspace` removes the last chip, `Esc` closes.
48
- - `role="combobox"` + `role="listbox"` (`aria-multiselectable`) for accessibility.
49
- - The dropdown is portaled, so it is not clipped inside cards or `overflow: hidden` ancestors.
50
-
51
- ## Stories
52
-
53
- <Primary />
54
- <Controls />
55
- <Stories />
@@ -1,59 +0,0 @@
1
- import type { Meta, StoryObj } from "@storybook/react";
2
- import { useState } from "react";
3
- import ITMultiSelect from "@/components/molecules/multi-select/multi-select";
4
- import { ITMultiSelectOption } from "./multi-select.props";
5
-
6
- const meta: Meta<typeof ITMultiSelect> = {
7
- title: "Components/Form Elements/ITMultiSelect",
8
- component: ITMultiSelect,
9
- parameters: { layout: "centered" },
10
- };
11
-
12
- export default meta;
13
- type Story = StoryObj<typeof ITMultiSelect>;
14
-
15
- const options: ITMultiSelectOption[] = [
16
- { value: "mx", label: "México" },
17
- { value: "es", label: "España" },
18
- { value: "co", label: "Colombia" },
19
- { value: "ar", label: "Argentina" },
20
- { value: "pe", label: "Perú" },
21
- { value: "cl", label: "Chile" },
22
- ];
23
-
24
- const Wrapper = (args: any) => {
25
- const [value, setValue] = useState<(string | number)[]>(args.value ?? []);
26
- return (
27
- <div className="w-[400px]">
28
- <ITMultiSelect {...args} value={value} onChange={(v) => setValue(v)} />
29
- </div>
30
- );
31
- };
32
-
33
- export const Default: Story = {
34
- render: (args) => <Wrapper {...args} />,
35
- args: { name: "countries", label: "Países", options, value: [] },
36
- };
37
-
38
- export const WithPreselected: Story = {
39
- render: (args) => <Wrapper {...args} />,
40
- args: { name: "countries", label: "Países", options, value: ["mx", "es", "co", "ar"] },
41
- };
42
-
43
- export const WithError: Story = {
44
- render: (args) => <Wrapper {...args} />,
45
- args: {
46
- name: "countries",
47
- label: "Países",
48
- options,
49
- value: [],
50
- required: true,
51
- touched: true,
52
- error: true,
53
- },
54
- };
55
-
56
- export const Disabled: Story = {
57
- render: (args) => <Wrapper {...args} />,
58
- args: { name: "countries", label: "Países", options, value: ["mx"], disabled: true },
59
- };
@@ -1,62 +0,0 @@
1
- import { Meta, Title, Description, Primary, Controls, Stories } from '@storybook/blocks';
2
- import * as StoriesData from './pagination.stories';
3
-
4
- <Meta of={StoriesData} />
5
-
6
- # ITPagination
7
-
8
- Page navigation with current/total pages display, first/last buttons, sibling page count control, and an optional items-per-page selector with summary text.
9
-
10
- ## Props
11
-
12
- | Prop | Type | Default | Description |
13
- |------|------|---------|-------------|
14
- | `currentPage` | `number` | — | Current active page (1-indexed). |
15
- | `totalPages` | `number` | — | Total number of pages available. |
16
- | `onPageChange` | `(page: number) => void` | — | Callback fired when a page is clicked or prev/next is activated. |
17
- | `siblingCount` | `number` | `1` | Number of visible page siblings before and after the current page. |
18
- | `color` | `"primary" \| "secondary" \| "success" \| "danger" \| "warning" \| "info" \| "purple"` | `"primary"` | Semantic color for active page and buttons. |
19
- | `className` | `string` | — | Additional CSS classes for the container. |
20
- | `itemsPerPageOptions` | `number[]` | — | Available options for the items-per-page selector dropdown. |
21
- | `itemsPerPage` | `number` | — | Current items per page value. Required if `itemsPerPageOptions` is provided. |
22
- | `onItemsPerPageChange` | `(value: number) => void` | — | Callback fired when the items per page value is changed. |
23
- | `totalItems` | `number` | — | Total number of items across all pages. Used for the "1-10 of 50" summary text. |
24
-
25
- ## Usage
26
-
27
- ```tsx
28
- import { ITPagination } from '@axzydev/axzy_ui_system';
29
-
30
- <ITPagination
31
- currentPage={1}
32
- totalPages={5}
33
- onPageChange={(page) => setCurrentPage(page)}
34
- />
35
-
36
- <ITPagination
37
- currentPage={1}
38
- totalPages={50}
39
- siblingCount={2}
40
- color="primary"
41
- onPageChange={(page) => setCurrentPage(page)}
42
- itemsPerPageOptions={[10, 20, 30, 50]}
43
- itemsPerPage={10}
44
- onItemsPerPageChange={(val) => setItemsPerPage(val)}
45
- totalItems={500}
46
- />
47
- ```
48
-
49
- ## Notes
50
-
51
- - First and last page buttons are always visible for quick navigation.
52
- - Ellipsis indicators appear when sibling gaps exceed the page range.
53
- - The `siblingCount` prop controls how many page numbers appear around the current page.
54
- - All seven semantic colors are supported for the active page highlight.
55
- - When `itemsPerPageOptions` is provided, a dropdown and summary text render alongside pagination.
56
- - Compatible with server-side pagination via the `currentPage` and `onPageChange` controlled pattern.
57
-
58
- ## Stories
59
-
60
- <Primary />
61
- <Controls />
62
- <Stories />
@@ -1,110 +0,0 @@
1
- import type { Meta, StoryObj } from "@storybook/react";
2
- import ITPagination from "@/components/molecules/pagination/pagination";
3
- import { useState } from "react";
4
-
5
- const meta: Meta<typeof ITPagination> = {
6
- title: "Components/Data Display/ITPagination",
7
- component: ITPagination,
8
- parameters: {
9
- layout: "centered",
10
- },
11
- argTypes: {
12
- currentPage: { control: "number" },
13
- totalPages: { control: "number" },
14
- siblingCount: { control: "number" },
15
- color: {
16
- control: "select",
17
- options: ["primary", "secondary", "success", "danger", "warning", "info", "purple"],
18
- },
19
- },
20
- };
21
-
22
- export default meta;
23
- type Story = StoryObj<typeof ITPagination>;
24
-
25
- const PaginationWrapper = (args: any) => {
26
- const [currentPage, setCurrentPage] = useState(args.currentPage || 1);
27
-
28
- return (
29
- <ITPagination
30
- {...args}
31
- currentPage={currentPage}
32
- onPageChange={(page) => setCurrentPage(page)}
33
- />
34
- );
35
- };
36
-
37
- export const Default: Story = {
38
- render: (args) => <PaginationWrapper {...args} />,
39
- args: {
40
- currentPage: 1,
41
- totalPages: 5,
42
- color: "primary",
43
- },
44
- };
45
-
46
- export const ManyPages: Story = {
47
- render: (args) => <PaginationWrapper {...args} />,
48
- args: {
49
- currentPage: 1,
50
- totalPages: 50,
51
- siblingCount: 1,
52
- color: "primary",
53
- },
54
- };
55
-
56
- export const MiddlePageOpened: Story = {
57
- render: (args) => <PaginationWrapper {...args} />,
58
- args: {
59
- currentPage: 25,
60
- totalPages: 50,
61
- siblingCount: 1,
62
- color: "primary",
63
- },
64
- };
65
-
66
- export const WithItemsPerPage: Story = {
67
- render: (args) => {
68
- const [currentPage, setCurrentPage] = useState(1);
69
- const [itemsPerPage, setItemsPerPage] = useState(10);
70
- const totalItems = 500;
71
- const totalPages = Math.ceil(totalItems / itemsPerPage);
72
-
73
- return (
74
- <ITPagination
75
- {...args}
76
- currentPage={currentPage}
77
- totalPages={totalPages}
78
- onPageChange={(page) => setCurrentPage(page)}
79
- itemsPerPageOptions={[10, 20, 30, 50]}
80
- itemsPerPage={itemsPerPage}
81
- onItemsPerPageChange={(val) => {
82
- setItemsPerPage(val);
83
- setCurrentPage(1);
84
- }}
85
- totalItems={totalItems}
86
- />
87
- );
88
- },
89
- args: {
90
- color: "primary",
91
- className: "w-[600px]" // Make it wide enough to see the layout
92
- },
93
- };
94
-
95
- export const Colors: Story = {
96
- render: (args) => (
97
- <div className="flex flex-col gap-4">
98
- {(['primary', 'secondary', 'success', 'danger', 'warning', 'info', 'purple'] as const).map((color) => (
99
- <div key={color} className="flex gap-4 items-center">
100
- <span className="w-20 text-sm font-bold text-gray-500 capitalize">{color}</span>
101
- <PaginationWrapper {...args} color={color} />
102
- </div>
103
- ))}
104
- </div>
105
- ),
106
- args: {
107
- currentPage: 1,
108
- totalPages: 5,
109
- },
110
- };