@axzydev/axzy_ui_system 1.2.0 → 1.2.2

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 (202) hide show
  1. package/dist/index.css +82 -197
  2. package/dist/index.css.map +1 -1
  3. package/package.json +2 -2
  4. package/src/App.tsx +354 -0
  5. package/src/assets/logo.png +0 -0
  6. package/src/assets/react.svg +1 -0
  7. package/src/components/alert/alert.props.ts +13 -0
  8. package/src/components/alert/alert.stories.tsx +41 -0
  9. package/src/components/alert/alert.tsx +53 -0
  10. package/src/components/avatar/avatar.props.ts +14 -0
  11. package/src/components/avatar/avatar.stories.tsx +46 -0
  12. package/src/components/avatar/avatar.tsx +53 -0
  13. package/src/components/badget/badget.props.ts +12 -0
  14. package/src/components/badget/badget.stories.tsx +76 -0
  15. package/src/components/badget/badget.tsx +61 -0
  16. package/src/components/breadcrumbs/breadcrumbs.props.ts +13 -0
  17. package/src/components/breadcrumbs/breadcrumbs.stories.tsx +21 -0
  18. package/src/components/breadcrumbs/breadcrumbs.tsx +34 -0
  19. package/src/components/button/button.props.ts +18 -0
  20. package/src/components/button/button.stories.tsx +174 -0
  21. package/src/components/button/button.tsx +117 -0
  22. package/src/components/calendar/calendar.props.ts +33 -0
  23. package/src/components/calendar/calendar.stories.tsx +91 -0
  24. package/src/components/calendar/calendar.tsx +608 -0
  25. package/src/components/calendar/index.ts +3 -0
  26. package/src/components/card/card.props.ts +13 -0
  27. package/src/components/card/card.stories.tsx +58 -0
  28. package/src/components/card/card.tsx +79 -0
  29. package/src/components/checkbox/checkbox.props.ts +11 -0
  30. package/src/components/checkbox/checkbox.stories.tsx +54 -0
  31. package/src/components/checkbox/checkbox.tsx +52 -0
  32. package/src/components/confirm-dialog/confirm-dialog.props.ts +14 -0
  33. package/src/components/confirm-dialog/confirm-dialog.stories.tsx +33 -0
  34. package/src/components/confirm-dialog/confirm-dialog.tsx +45 -0
  35. package/src/components/data-table/ITDataTable.stories.tsx +213 -0
  36. package/src/components/data-table/dataTable.props.ts +69 -0
  37. package/src/components/data-table/dataTable.tsx +313 -0
  38. package/src/components/date-picker/date-picker.props.ts +30 -0
  39. package/src/components/date-picker/date-picker.stories.tsx +90 -0
  40. package/src/components/date-picker/datePicker.tsx +307 -0
  41. package/src/components/dialog/dialog.props.ts +9 -0
  42. package/src/components/dialog/dialog.stories.tsx +80 -0
  43. package/src/components/dialog/dialog.tsx +88 -0
  44. package/src/components/divider/divider.props.ts +8 -0
  45. package/src/components/divider/divider.stories.tsx +34 -0
  46. package/src/components/divider/divider.tsx +21 -0
  47. package/src/components/drawer/drawer.props.ts +14 -0
  48. package/src/components/drawer/drawer.stories.tsx +41 -0
  49. package/src/components/drawer/drawer.tsx +53 -0
  50. package/src/components/dropfile/dropfile.stories.tsx +75 -0
  51. package/src/components/dropfile/dropfile.tsx +407 -0
  52. package/src/components/empty-state/empty-state.props.ts +9 -0
  53. package/src/components/empty-state/empty-state.stories.tsx +20 -0
  54. package/src/components/empty-state/empty-state.tsx +21 -0
  55. package/src/components/flex/flex.props.ts +22 -0
  56. package/src/components/flex/flex.stories.tsx +71 -0
  57. package/src/components/flex/flex.tsx +79 -0
  58. package/src/components/form-builder/fieldRenderer.tsx +218 -0
  59. package/src/components/form-builder/formBuilder.context.tsx +70 -0
  60. package/src/components/form-builder/formBuilder.props.ts +43 -0
  61. package/src/components/form-builder/formBuilder.stories.tsx +317 -0
  62. package/src/components/form-builder/formBuilder.tsx +186 -0
  63. package/src/components/form-builder/useFormBuilder.ts +80 -0
  64. package/src/components/form-header/form-header.props.ts +5 -0
  65. package/src/components/form-header/form-header.tsx +38 -0
  66. package/src/components/grid/grid.props.ts +17 -0
  67. package/src/components/grid/grid.stories.tsx +72 -0
  68. package/src/components/grid/grid.tsx +69 -0
  69. package/src/components/image/image.props.ts +7 -0
  70. package/src/components/image/image.tsx +38 -0
  71. package/src/components/input/input.props.ts +49 -0
  72. package/src/components/input/input.stories.tsx +115 -0
  73. package/src/components/input/input.tsx +615 -0
  74. package/src/components/layout/layout.props.ts +10 -0
  75. package/src/components/layout/layout.stories.tsx +114 -0
  76. package/src/components/layout/layout.tsx +80 -0
  77. package/src/components/loader/loader.props.ts +8 -0
  78. package/src/components/loader/loader.stories.tsx +105 -0
  79. package/src/components/loader/loader.tsx +108 -0
  80. package/src/components/navbar/navbar.props.ts +37 -0
  81. package/src/components/navbar/navbar.tsx +328 -0
  82. package/src/components/page/page.props.ts +19 -0
  83. package/src/components/page/page.stories.tsx +98 -0
  84. package/src/components/page/page.tsx +90 -0
  85. package/src/components/page-header/page-header.props.ts +11 -0
  86. package/src/components/page-header/page-header.stories.tsx +61 -0
  87. package/src/components/page-header/page-header.tsx +62 -0
  88. package/src/components/pagination/pagination.props.ts +53 -0
  89. package/src/components/pagination/pagination.stories.tsx +111 -0
  90. package/src/components/pagination/pagination.tsx +241 -0
  91. package/src/components/popover/popover.props.ts +12 -0
  92. package/src/components/popover/popover.stories.tsx +25 -0
  93. package/src/components/popover/popover.tsx +45 -0
  94. package/src/components/progress/progress.props.ts +12 -0
  95. package/src/components/progress/progress.stories.tsx +40 -0
  96. package/src/components/progress/progress.tsx +52 -0
  97. package/src/components/radio/radio.props.ts +16 -0
  98. package/src/components/radio/radio.stories.tsx +50 -0
  99. package/src/components/radio/radio.tsx +58 -0
  100. package/src/components/search-select/index.ts +2 -0
  101. package/src/components/search-select/search-select.props.ts +46 -0
  102. package/src/components/search-select/search-select.stories.tsx +129 -0
  103. package/src/components/search-select/search-select.tsx +229 -0
  104. package/src/components/searchTable/components/EditableCell.tsx +149 -0
  105. package/src/components/searchTable/components/PaginationControls.tsx +86 -0
  106. package/src/components/searchTable/components/PaginationInfo.tsx +20 -0
  107. package/src/components/searchTable/components/SearchAndSortBar.tsx +53 -0
  108. package/src/components/searchTable/components/SearchInput.tsx +33 -0
  109. package/src/components/searchTable/components/SortButton.tsx +50 -0
  110. package/src/components/searchTable/components/TableEmptyState.tsx +22 -0
  111. package/src/components/searchTable/components/TableHeader.tsx +35 -0
  112. package/src/components/searchTable/components/TableHeaderCell.tsx +43 -0
  113. package/src/components/searchTable/components/TableRow.tsx +144 -0
  114. package/src/components/searchTable/searchTable.props.ts +56 -0
  115. package/src/components/searchTable/searchTable.tsx +187 -0
  116. package/src/components/segmented-control/segmented-control.props.ts +18 -0
  117. package/src/components/segmented-control/segmented-control.stories.tsx +63 -0
  118. package/src/components/segmented-control/segmented-control.tsx +52 -0
  119. package/src/components/select/select.props.ts +25 -0
  120. package/src/components/select/select.stories.tsx +86 -0
  121. package/src/components/select/select.tsx +150 -0
  122. package/src/components/sidebar/sidebar.props.ts +28 -0
  123. package/src/components/sidebar/sidebar.stories.tsx +117 -0
  124. package/src/components/sidebar/sidebar.tsx +313 -0
  125. package/src/components/skeleton/skeleton.props.ts +12 -0
  126. package/src/components/skeleton/skeleton.stories.tsx +30 -0
  127. package/src/components/skeleton/skeleton.tsx +45 -0
  128. package/src/components/slide/slide.props.ts +45 -0
  129. package/src/components/slide/slide.stories.tsx +121 -0
  130. package/src/components/slide/slide.tsx +109 -0
  131. package/src/components/slider/slider.props.ts +10 -0
  132. package/src/components/slider/slider.stories.tsx +30 -0
  133. package/src/components/slider/slider.tsx +49 -0
  134. package/src/components/stack/stack.props.ts +19 -0
  135. package/src/components/stack/stack.stories.tsx +79 -0
  136. package/src/components/stack/stack.tsx +79 -0
  137. package/src/components/stat-card/stat-card.props.ts +13 -0
  138. package/src/components/stat-card/stat-card.stories.tsx +41 -0
  139. package/src/components/stat-card/stat-card.tsx +44 -0
  140. package/src/components/stepper/stepper.css +26 -0
  141. package/src/components/stepper/stepper.props.ts +29 -0
  142. package/src/components/stepper/stepper.stories.tsx +155 -0
  143. package/src/components/stepper/stepper.tsx +227 -0
  144. package/src/components/table/table.props.ts +43 -0
  145. package/src/components/table/table.stories.tsx +189 -0
  146. package/src/components/table/table.tsx +376 -0
  147. package/src/components/tabs/tabs.props.ts +18 -0
  148. package/src/components/tabs/tabs.stories.tsx +32 -0
  149. package/src/components/tabs/tabs.tsx +74 -0
  150. package/src/components/text/text.props.ts +9 -0
  151. package/src/components/text/text.tsx +20 -0
  152. package/src/components/textarea/textarea.props.ts +15 -0
  153. package/src/components/textarea/textarea.stories.tsx +27 -0
  154. package/src/components/textarea/textarea.tsx +55 -0
  155. package/src/components/theme-provider/themeProvider.props.ts +28 -0
  156. package/src/components/theme-provider/themeProvider.tsx +1854 -0
  157. package/src/components/time-picker/timePicker.props.ts +16 -0
  158. package/src/components/time-picker/timePicker.stories.tsx +131 -0
  159. package/src/components/time-picker/timePicker.tsx +317 -0
  160. package/src/components/toast/toast.css +32 -0
  161. package/src/components/toast/toast.props.ts +13 -0
  162. package/src/components/toast/toast.stories.tsx +138 -0
  163. package/src/components/toast/toast.tsx +87 -0
  164. package/src/components/tooltip/tooltip.props.ts +11 -0
  165. package/src/components/tooltip/tooltip.stories.tsx +20 -0
  166. package/src/components/tooltip/tooltip.tsx +55 -0
  167. package/src/components/topbar/topbar.props.ts +21 -0
  168. package/src/components/topbar/topbar.stories.tsx +80 -0
  169. package/src/components/topbar/topbar.tsx +205 -0
  170. package/src/components/triple-filter/tripleFilter.props.ts +15 -0
  171. package/src/components/triple-filter/tripleFilter.stories.tsx +32 -0
  172. package/src/components/triple-filter/tripleFilter.tsx +50 -0
  173. package/src/hooks/useClickOutside.ts +21 -0
  174. package/src/hooks/useDebouncedSearch.ts +55 -0
  175. package/src/hooks/useEditableRow.ts +157 -0
  176. package/src/hooks/useTableState.ts +122 -0
  177. package/src/index.css +168 -0
  178. package/src/index.ts +165 -0
  179. package/src/main.tsx +9 -0
  180. package/src/showcases/DataShowcases.tsx +260 -0
  181. package/src/showcases/FeedbackShowcases.tsx +268 -0
  182. package/src/showcases/FormShowcases.tsx +1159 -0
  183. package/src/showcases/HomeShowcase.tsx +324 -0
  184. package/src/showcases/LayoutPrimitivesShowcases.tsx +569 -0
  185. package/src/showcases/NavigationShowcases.tsx +193 -0
  186. package/src/showcases/PageShowcases.tsx +207 -0
  187. package/src/showcases/ShowcaseLayout.tsx +139 -0
  188. package/src/showcases/StructureShowcases.tsx +152 -0
  189. package/src/types/badget.types.ts +37 -0
  190. package/src/types/button.types.ts +16 -0
  191. package/src/types/colors.types.ts +3 -0
  192. package/src/types/field.types.ts +103 -0
  193. package/src/types/formik.types.ts +15 -0
  194. package/src/types/input.types.ts +14 -0
  195. package/src/types/loader.types.ts +9 -0
  196. package/src/types/sizes.types.ts +1 -0
  197. package/src/types/table.types.ts +15 -0
  198. package/src/types/toast.types.ts +8 -0
  199. package/src/types/yup.types.ts +11 -0
  200. package/src/utils/color.utils.ts +99 -0
  201. package/src/utils/styles.ts +120 -0
  202. package/src/utils/table.utils.ts +10 -0
@@ -0,0 +1,569 @@
1
+ import React, { useState, ReactNode } from "react";
2
+ import ITStack from "../components/stack/stack";
3
+ import ITFlex from "../components/flex/flex";
4
+ import ITGrid from "../components/grid/grid";
5
+ import ITCard from "../components/card/card";
6
+ import ITButton from "../components/button/button";
7
+ import ITStatCard from "../components/stat-card/stat-card";
8
+ import ITAvatar from "../components/avatar/avatar";
9
+ import ITSlider from "../components/slider/slider";
10
+ import ITSegmentedControl from "../components/segmented-control/segmented-control";
11
+ import ITSlideToggle from "../components/slide/slide";
12
+ import { ShowcaseLayout, CodeViewer } from "./ShowcaseLayout";
13
+
14
+ const DemoBox = ({ children, className = "" }: { children: ReactNode; className?: string }) => (
15
+ <div className={`bg-primary-100 dark:bg-primary-900/30 text-primary-700 dark:text-primary-300 rounded-lg p-3 text-center text-sm font-medium ${className}`}>
16
+ {children}
17
+ </div>
18
+ );
19
+
20
+ const DemoCard = ({ children, className = "" }: { children: ReactNode; className?: string }) => (
21
+ <div className={`bg-white dark:bg-slate-800 rounded-xl border border-slate-200 dark:border-slate-700 p-4 shadow-sm ${className}`}>
22
+ <div className="h-8 w-8 rounded-lg bg-primary-100 dark:bg-primary-900/50 mb-3" />
23
+ <p className="text-sm font-semibold text-slate-700 dark:text-slate-200">{children}</p>
24
+ <p className="text-xs text-slate-400 mt-1">Descripción del item</p>
25
+ </div>
26
+ );
27
+
28
+ // ─────────────────────────────────────────
29
+ // 1. ITStack Showcase
30
+ // ─────────────────────────────────────────
31
+ export const StackShowcase = () => {
32
+ const [direction, setDirection] = useState<"row" | "column">("column");
33
+ const [spacing, setSpacing] = useState(3);
34
+ const [withDivider, setWithDivider] = useState(false);
35
+
36
+ const code = `<ITStack direction="${direction}" spacing={${spacing}}${withDivider ? '\n divider={<div className="w-px h-8 bg-slate-200" />}' : ""}>\n <Demo>Item 1</Demo>\n <Demo>Item 2</Demo>\n <Demo>Item 3</Demo>\n</ITStack>`;
37
+
38
+ return (
39
+ <ShowcaseLayout
40
+ title="ITStack"
41
+ description="Layout basado en flexbox con dirección y spacing uniforme. Ideal para secciones verticales, toolbars horizontales, y listas de items."
42
+ code={code}
43
+ demo={
44
+ <div className="w-full max-w-lg">
45
+ <ITStack direction={direction} spacing={spacing} className="w-full" divider={withDivider ? <div className={`${direction === "row" ? "w-px h-8" : "h-px w-8"} bg-slate-200 dark:bg-slate-600 self-center`} /> : undefined}>
46
+ <DemoBox>Item 1</DemoBox>
47
+ <DemoBox>Item 2</DemoBox>
48
+ <DemoBox>Item 3</DemoBox>
49
+ </ITStack>
50
+ </div>
51
+ }
52
+ controls={
53
+ <>
54
+ <ITSegmentedControl
55
+ options={[
56
+ { value: "column", label: "Column" },
57
+ { value: "row", label: "Row" },
58
+ ]}
59
+ value={direction}
60
+ onChange={(v) => setDirection(v as "row" | "column")}
61
+ />
62
+ <ITSlider label="Spacing" value={spacing} onChange={setSpacing} min={0} max={10} />
63
+ <ITFlex justify="between" align="center">
64
+ <span className="text-sm font-semibold text-slate-700 dark:text-slate-300">Con Divisor</span>
65
+ <ITSlideToggle isOn={withDivider} onToggle={setWithDivider} size="sm" />
66
+ </ITFlex>
67
+ </>
68
+ }
69
+ gallery={
70
+ <ITStack spacing={4}>
71
+ {/* Row examples */}
72
+ <div>
73
+ <p className="text-xs font-semibold text-slate-400 mb-2 uppercase tracking-wider">Horizontal — spacing=2</p>
74
+ <ITStack direction="row" spacing={2}>
75
+ <DemoBox>Uno</DemoBox><DemoBox>Dos</DemoBox><DemoBox>Tres</DemoBox>
76
+ </ITStack>
77
+ </div>
78
+ {/* Center aligned row */}
79
+ <div>
80
+ <p className="text-xs font-semibold text-slate-400 mb-2 uppercase tracking-wider">Row + center alignment</p>
81
+ <ITStack direction="row" spacing={4} alignItems="center" justifyContent="center" className="bg-slate-50 dark:bg-slate-900/50 rounded-xl p-4">
82
+ <DemoBox className="!bg-emerald-100 !text-emerald-700">Item A</DemoBox>
83
+ <DemoBox className="!bg-purple-100 !text-purple-700">Item B</DemoBox>
84
+ <DemoBox className="!bg-amber-100 !text-amber-700">Item C</DemoBox>
85
+ </ITStack>
86
+ </div>
87
+ {/* Vertical with divider */}
88
+ <div>
89
+ <p className="text-xs font-semibold text-slate-400 mb-2 uppercase tracking-wider">Vertical + divider</p>
90
+ <ITStack spacing={2} divider={<div className="h-px bg-slate-200 dark:bg-slate-700" />}>
91
+ <DemoBox>Sección 1</DemoBox>
92
+ <DemoBox>Sección 2</DemoBox>
93
+ <DemoBox>Sección 3</DemoBox>
94
+ </ITStack>
95
+ </div>
96
+ </ITStack>
97
+ }
98
+ />
99
+ );
100
+ };
101
+
102
+ // ─────────────────────────────────────────
103
+ // 2. ITFlex Showcase
104
+ // ─────────────────────────────────────────
105
+ export const FlexShowcase = () => {
106
+ const [direction, setDirection] = useState<"row" | "column">("row");
107
+ const [justify, setJustify] = useState("start");
108
+ const [align, setAlign] = useState("center");
109
+ const [gap, setGap] = useState(3);
110
+
111
+ const justifyOptions = [
112
+ { value: "start", label: "Start" },
113
+ { value: "center", label: "Center" },
114
+ { value: "end", label: "End" },
115
+ { value: "between", label: "Between" },
116
+ { value: "around", label: "Around" },
117
+ ];
118
+
119
+ const code = `<ITFlex direction="${direction}" justify="${justify}" align="${align}" gap={${gap}}>\n <Box>Item 1</Box>\n <Box>Item 2</Box>\n <Box>Item 3</Box>\n</ITFlex>`;
120
+
121
+ return (
122
+ <ShowcaseLayout
123
+ title="ITFlex"
124
+ description="Contenedor flexbox completo con control total sobre alineación, distribución y gap. Para layouts complejos que requieren más control que ITStack."
125
+ code={code}
126
+ demo={
127
+ <div className="w-full">
128
+ <ITFlex direction={direction} justify={justify as any} align={align as any} gap={gap} className="bg-slate-50 dark:bg-slate-900/50 rounded-xl p-4 min-h-[100px] border border-dashed border-slate-200 dark:border-slate-700">
129
+ <DemoBox className="!bg-blue-100 !text-blue-700">Flex 1</DemoBox>
130
+ <DemoBox className="!bg-emerald-100 !text-emerald-700">Flex 2</DemoBox>
131
+ <DemoBox className="!bg-purple-100 !text-purple-700">Flex 3</DemoBox>
132
+ </ITFlex>
133
+ </div>
134
+ }
135
+ controls={
136
+ <ITStack spacing={4}>
137
+ <ITSegmentedControl
138
+ options={[
139
+ { value: "row", label: "Row" },
140
+ { value: "column", label: "Column" },
141
+ { value: "row-reverse", label: "Row Rev" },
142
+ { value: "column-reverse", label: "Col Rev" },
143
+ ]}
144
+ value={direction}
145
+ onChange={(v) => setDirection(v as any)}
146
+ size="sm"
147
+ />
148
+ <ITStack spacing={2}>
149
+ <span className="text-xs font-semibold text-slate-600">Justify</span>
150
+ <ITSegmentedControl
151
+ options={justifyOptions.map(o => ({ value: o.value, label: o.label }))}
152
+ value={justify}
153
+ onChange={setJustify}
154
+ />
155
+ </ITStack>
156
+ <ITStack spacing={2}>
157
+ <span className="text-xs font-semibold text-slate-600">Align</span>
158
+ <ITSegmentedControl
159
+ options={["start", "center", "end", "stretch"].map(a => ({ value: a, label: a.charAt(0).toUpperCase() + a.slice(1) }))}
160
+ value={align}
161
+ onChange={setAlign}
162
+ />
163
+ </ITStack>
164
+ <ITSlider label="Gap" value={gap} onChange={setGap} min={0} max={10} />
165
+ </ITStack>
166
+ }
167
+ gallery={
168
+ <ITStack spacing={6}>
169
+ <div>
170
+ <p className="text-xs font-semibold text-slate-400 mb-2 uppercase tracking-wider">Space-Between Row</p>
171
+ <ITFlex justify="between" className="bg-slate-50 dark:bg-slate-900/50 rounded-lg p-3">
172
+ <DemoBox className="!w-20">Left</DemoBox>
173
+ <DemoBox className="!w-20">Center</DemoBox>
174
+ <DemoBox className="!w-20">Right</DemoBox>
175
+ </ITFlex>
176
+ </div>
177
+ <div>
178
+ <p className="text-xs font-semibold text-slate-400 mb-2 uppercase tracking-wider">Grow Items</p>
179
+ <ITFlex gap={3}>
180
+ <ITFlex grow className="bg-blue-100 dark:bg-blue-900/30 rounded-lg p-3 text-center text-sm text-blue-700">Grow</ITFlex>
181
+ <ITFlex grow className="bg-emerald-100 dark:bg-emerald-900/30 rounded-lg p-3 text-center text-sm text-emerald-700">Grow</ITFlex>
182
+ <div className="bg-slate-100 dark:bg-slate-800 rounded-lg p-3 text-center text-sm text-slate-500">Fixed</div>
183
+ </ITFlex>
184
+ </div>
185
+ <div>
186
+ <p className="text-xs font-semibold text-slate-400 mb-2 uppercase tracking-wider">Column Layout</p>
187
+ <ITFlex direction="column" gap={2} className="bg-slate-50 dark:bg-slate-900/50 rounded-lg p-3">
188
+ <DemoBox className="!w-full">Stacked 1</DemoBox>
189
+ <DemoBox className="!w-full">Stacked 2</DemoBox>
190
+ <DemoBox className="!w-full">Stacked 3</DemoBox>
191
+ </ITFlex>
192
+ </div>
193
+ </ITStack>
194
+ }
195
+ />
196
+ );
197
+ };
198
+
199
+ // ─────────────────────────────────────────
200
+ // 3. ITGrid Showcase
201
+ // ─────────────────────────────────────────
202
+ export const GridShowcase = () => {
203
+ const [spacing, setSpacing] = useState(3);
204
+ const [columns, setColumns] = useState(3);
205
+
206
+ const code = `<ITGrid container spacing={${spacing}}>\n {items.map(item => (\n <ITGrid item xs={12} md={${12 / columns}}>\n <Card>{item.name}</Card>\n </ITGrid>\n ))}\n</ITGrid>`;
207
+
208
+ const items = Array.from({ length: columns * 2 }, (_, i) => `Item ${i + 1}`);
209
+
210
+ return (
211
+ <ShowcaseLayout
212
+ title="ITGrid"
213
+ description="Sistema de grid responsivo de 12 columnas. Ideal para dashboards, galerías, y layouts de página completos."
214
+ code={code}
215
+ demo={
216
+ <div className="w-full">
217
+ <ITGrid container spacing={spacing}>
218
+ {items.map((item, i) => (
219
+ <ITGrid key={i} item xs={12} md={Math.floor(12 / columns)}>
220
+ <DemoBox className="!bg-white dark:!bg-slate-800 !text-slate-700 dark:!text-slate-200 border border-slate-200 dark:border-slate-700">
221
+ {item}
222
+ </DemoBox>
223
+ </ITGrid>
224
+ ))}
225
+ </ITGrid>
226
+ </div>
227
+ }
228
+ controls={
229
+ <ITStack spacing={4}>
230
+ <ITSlider label="Columnas" value={columns} onChange={setColumns} min={1} max={6} />
231
+ <ITSlider label="Spacing" value={spacing} onChange={setSpacing} min={0} max={8} />
232
+ </ITStack>
233
+ }
234
+ gallery={
235
+ <ITStack spacing={6}>
236
+ {/* Sidebar + Content layout */}
237
+ <div>
238
+ <p className="text-xs font-semibold text-slate-400 mb-2 uppercase tracking-wider">Sidebar + Content (3/9)</p>
239
+ <ITGrid container spacing={3}>
240
+ <ITGrid item xs={12} md={3}>
241
+ <div className="bg-slate-100 dark:bg-slate-800 rounded-xl p-4 text-center text-sm text-slate-500">Sidebar</div>
242
+ </ITGrid>
243
+ <ITGrid item xs={12} md={9}>
244
+ <div className="bg-primary-50 dark:bg-primary-900/20 rounded-xl p-4 text-center text-sm text-primary-600">Main Content</div>
245
+ </ITGrid>
246
+ </ITGrid>
247
+ </div>
248
+ {/* Responsive cards */}
249
+ <div>
250
+ <p className="text-xs font-semibold text-slate-400 mb-2 uppercase tracking-wider">Responsive (xs=12 sm=6 md=4 lg=3)</p>
251
+ <ITGrid container spacing={2}>
252
+ {[1, 2, 3, 4].map((i) => (
253
+ <ITGrid key={i} item xs={12} sm={6} md={4} lg={3}>
254
+ <DemoCard>Card {i}</DemoCard>
255
+ </ITGrid>
256
+ ))}
257
+ </ITGrid>
258
+ </div>
259
+ {/* 2-column form layout */}
260
+ <div>
261
+ <p className="text-xs font-semibold text-slate-400 mb-2 uppercase tracking-wider">Form Layout (2 columnas)</p>
262
+ <ITGrid container spacing={3}>
263
+ <ITGrid item xs={12} md={6}>
264
+ <div className="bg-white dark:bg-slate-800 rounded-lg border border-slate-200 dark:border-slate-700 p-3">
265
+ <div className="h-3 w-1/3 bg-slate-200 dark:bg-slate-700 rounded mb-2" />
266
+ <div className="h-8 bg-slate-100 dark:bg-slate-700/50 rounded" />
267
+ </div>
268
+ </ITGrid>
269
+ <ITGrid item xs={12} md={6}>
270
+ <div className="bg-white dark:bg-slate-800 rounded-lg border border-slate-200 dark:border-slate-700 p-3">
271
+ <div className="h-3 w-1/3 bg-slate-200 dark:bg-slate-700 rounded mb-2" />
272
+ <div className="h-8 bg-slate-100 dark:bg-slate-700/50 rounded" />
273
+ </div>
274
+ </ITGrid>
275
+ <ITGrid item xs={12}>
276
+ <div className="bg-white dark:bg-slate-800 rounded-lg border border-slate-200 dark:border-slate-700 p-3">
277
+ <div className="h-3 w-1/4 bg-slate-200 dark:bg-slate-700 rounded mb-2" />
278
+ <div className="h-20 bg-slate-100 dark:bg-slate-700/50 rounded" />
279
+ </div>
280
+ </ITGrid>
281
+ </ITGrid>
282
+ </div>
283
+ </ITStack>
284
+ }
285
+ />
286
+ );
287
+ };
288
+
289
+ // ─────────────────────────────────────────
290
+ // 4. Composite Screen Examples
291
+ // ─────────────────────────────────────────
292
+ const SectionTitle = ({ children }: { children: string }) => (
293
+ <h3 className="text-lg font-bold text-slate-800 dark:text-white mb-1">{children}</h3>
294
+ );
295
+
296
+ const SectionDesc = ({ children }: { children: string }) => (
297
+ <p className="text-sm text-slate-500 dark:text-slate-400 mb-4">{children}</p>
298
+ );
299
+
300
+ export const ScreenDashboardShowcase = () => {
301
+ const code = `// Dashboard completo en 30 líneas
302
+ <ITStack spacing={6}>
303
+ {/* Header row */}
304
+ <ITFlex justify="between" align="center">
305
+ <div>
306
+ <h1 className="text-2xl font-bold">Dashboard</h1>
307
+ <p className="text-sm text-slate-500">Resumen de actividad</p>
308
+ </div>
309
+ <ITButton label="Exportar" variant="outlined" />
310
+ </ITFlex>
311
+
312
+ {/* Stats cards grid */}
313
+ <ITGrid container spacing={4}>
314
+ {stats.map(stat => (
315
+ <ITGrid item xs={12} sm={6} lg={3} key={stat.title}>
316
+ <ITCard>
317
+ <StatCard {...stat} />
318
+ </ITCard>
319
+ </ITGrid>
320
+ ))}
321
+ </ITGrid>
322
+
323
+ {/* Charts section */}
324
+ <ITGrid container spacing={4}>
325
+ <ITGrid item xs={12} lg={8}>
326
+ <ITCard title="Gráfico Principal">...</ITCard>
327
+ </ITGrid>
328
+ <ITGrid item xs={12} lg={4}>
329
+ <ITCard title="Actividad Reciente">
330
+ <ITStack spacing={3}>
331
+ {items.map(item => <ActivityRow key={item.id} {...item} />)}
332
+ </ITStack>
333
+ </ITCard>
334
+ </ITGrid>
335
+ </ITGrid>
336
+ </ITStack>`;
337
+
338
+ return (
339
+ <div className="space-y-6 animate-fadeIn">
340
+ <div>
341
+ <h1 className="text-3xl font-extrabold text-slate-800 dark:text-white tracking-tight">Pantallas Compuestas</h1>
342
+ <p className="text-slate-500 mt-1.5 text-sm md:text-base">
343
+ Ejemplos reales combinando ITStack + ITFlex + ITGrid para construir pantallas completas en minutos.
344
+ </p>
345
+ </div>
346
+
347
+ {/* Dashboard Example */}
348
+ <ITCard title="Dashboard de Métricas" className="overflow-hidden">
349
+ <ITStack spacing={6}>
350
+ <ITFlex justify="between" align="center">
351
+ <div>
352
+ <h2 className="text-xl font-bold text-slate-800 dark:text-white">Dashboard</h2>
353
+ <p className="text-xs text-slate-400">Resumen de actividad del sistema</p>
354
+ </div>
355
+ <ITButton label="Exportar" variant="outlined" size="small" />
356
+ </ITFlex>
357
+
358
+ <ITGrid container spacing={3}>
359
+ <ITGrid item xs={12} sm={6} lg={3}>
360
+ <ITStatCard label="Usuarios Activos" value="1,245" trend="+12%" trendDirection="up" />
361
+ </ITGrid>
362
+ <ITGrid item xs={12} sm={6} lg={3}>
363
+ <ITStatCard label="Ventas Hoy" value="$4,320" trend="+5.4%" trendDirection="up" color="bg-blue-50 dark:bg-blue-950/20" />
364
+ </ITGrid>
365
+ <ITGrid item xs={12} sm={6} lg={3}>
366
+ <ITStatCard label="Órdenes" value="89" trend="-2.1%" trendDirection="down" color="bg-amber-50 dark:bg-amber-950/20" />
367
+ </ITGrid>
368
+ <ITGrid item xs={12} sm={6} lg={3}>
369
+ <ITStatCard label="Tickets Abiertos" value="12" trend="-8%" trendDirection="down" color="bg-rose-50 dark:bg-rose-950/20" />
370
+ </ITGrid>
371
+ </ITGrid>
372
+
373
+ <ITGrid container spacing={3}>
374
+ <ITGrid item xs={12} lg={8}>
375
+ <div className="bg-slate-50 dark:bg-slate-900/50 rounded-xl p-6 border border-slate-100 dark:border-slate-800">
376
+ <ITFlex justify="between" align="center" className="mb-4">
377
+ <span className="text-sm font-bold text-slate-700 dark:text-slate-200">Gráfico de Ventas</span>
378
+ <span className="text-xs text-slate-400">Últimos 30 días</span>
379
+ </ITFlex>
380
+ <div className="h-48 flex items-end gap-2">
381
+ {[40, 65, 45, 80, 55, 90, 70, 85, 60, 95, 75, 50].map((h, i) => (
382
+ <div key={i} className="flex-1 bg-primary-500/60 dark:bg-primary-400/40 rounded-t-md hover:bg-primary-500 transition-all" style={{ height: `${h}%` }} />
383
+ ))}
384
+ </div>
385
+ </div>
386
+ </ITGrid>
387
+ <ITGrid item xs={12} lg={4}>
388
+ <div className="bg-slate-50 dark:bg-slate-900/50 rounded-xl p-6 border border-slate-100 dark:border-slate-800 h-full">
389
+ <span className="text-sm font-bold text-slate-700 dark:text-slate-200 mb-3 block">Actividad Reciente</span>
390
+ <ITStack spacing={3}>
391
+ {[
392
+ { user: "Ana López", action: "creó un reporte" },
393
+ { user: "Carlos Ruiz", action: "aprobó la orden #1234" },
394
+ { user: "María García", action: "actualizó el perfil" },
395
+ ].map((item, i) => (
396
+ <ITFlex key={i} gap={3} align="center">
397
+ <ITAvatar initials={item.user.split(" ").map(w => w[0]).join("")} size="sm" color="bg-primary-500" />
398
+ <div className="flex-1 min-w-0">
399
+ <p className="text-xs font-semibold text-slate-700 dark:text-slate-200 truncate">{item.user}</p>
400
+ <p className="text-[10px] text-slate-400 truncate">{item.action}</p>
401
+ </div>
402
+ </ITFlex>
403
+ ))}
404
+ </ITStack>
405
+ </div>
406
+ </ITGrid>
407
+ </ITGrid>
408
+ </ITStack>
409
+ </ITCard>
410
+
411
+ <CodeViewer code={code} />
412
+ </div>
413
+ );
414
+ };
415
+
416
+ export const ScreenFormShowcase = () => {
417
+ const formCode = `// Formulario responsivo en 20 líneas
418
+ <ITStack spacing={6}>
419
+ <div>
420
+ <h1 className="text-2xl font-bold">Nuevo Usuario</h1>
421
+ <p className="text-sm text-slate-500">Completa los campos</p>
422
+ </div>
423
+
424
+ <ITGrid container spacing={4}>
425
+ <ITGrid item xs={12} md={6}>
426
+ <Input label="Nombre" />
427
+ </ITGrid>
428
+ <ITGrid item xs={12} md={6}>
429
+ <Input label="Apellido" />
430
+ </ITGrid>
431
+ <ITGrid item xs={12}>
432
+ <Input label="Email" />
433
+ </ITGrid>
434
+ <ITGrid item xs={12} md={6}>
435
+ <Select label="Rol" />
436
+ </ITGrid>
437
+ <ITGrid item xs={12} md={6}>
438
+ <Select label="Departamento" />
439
+ </ITGrid>
440
+ <ITGrid item xs={12}>
441
+ <ITFlex justify="end" gap={3}>
442
+ <Button variant="outlined">Cancelar</Button>
443
+ <Button>Guardar</Button>
444
+ </ITFlex>
445
+ </ITGrid>
446
+ </ITGrid>
447
+ </ITStack>`;
448
+
449
+ return (
450
+ <ITCard title="Formulario Responsivo">
451
+ <ITStack spacing={6}>
452
+ <div>
453
+ <h2 className="text-xl font-bold text-slate-800 dark:text-white">Nuevo Usuario</h2>
454
+ <p className="text-xs text-slate-400">Completa los campos para registrar un nuevo usuario</p>
455
+ </div>
456
+
457
+ <ITGrid container spacing={4}>
458
+ <ITGrid item xs={12} md={6}>
459
+ <div>
460
+ <label className="text-xs font-semibold text-slate-600 dark:text-slate-400 mb-1 block">Nombre</label>
461
+ <input className="w-full border border-slate-200 dark:border-slate-700 rounded-lg px-3 py-2 text-sm bg-white dark:bg-slate-800 text-slate-800 dark:text-white outline-none focus:ring-2 focus:ring-primary-500" placeholder="Ej: Juan" />
462
+ </div>
463
+ </ITGrid>
464
+ <ITGrid item xs={12} md={6}>
465
+ <div>
466
+ <label className="text-xs font-semibold text-slate-600 dark:text-slate-400 mb-1 block">Apellido</label>
467
+ <input className="w-full border border-slate-200 dark:border-slate-700 rounded-lg px-3 py-2 text-sm bg-white dark:bg-slate-800 text-slate-800 dark:text-white outline-none focus:ring-2 focus:ring-primary-500" placeholder="Ej: Pérez" />
468
+ </div>
469
+ </ITGrid>
470
+ <ITGrid item xs={12}>
471
+ <div>
472
+ <label className="text-xs font-semibold text-slate-600 dark:text-slate-400 mb-1 block">Email</label>
473
+ <input className="w-full border border-slate-200 dark:border-slate-700 rounded-lg px-3 py-2 text-sm bg-white dark:bg-slate-800 text-slate-800 dark:text-white outline-none focus:ring-2 focus:ring-primary-500" placeholder="ej: usuario@correo.com" />
474
+ </div>
475
+ </ITGrid>
476
+ <ITGrid item xs={12} md={6}>
477
+ <div>
478
+ <label className="text-xs font-semibold text-slate-600 dark:text-slate-400 mb-1 block">Rol</label>
479
+ <select className="w-full border border-slate-200 dark:border-slate-700 rounded-lg px-3 py-2 text-sm bg-white dark:bg-slate-800 text-slate-800 dark:text-white outline-none focus:ring-2 focus:ring-primary-500">
480
+ <option>Seleccionar...</option>
481
+ <option>Admin</option>
482
+ <option>Editor</option>
483
+ <option>Usuario</option>
484
+ </select>
485
+ </div>
486
+ </ITGrid>
487
+ <ITGrid item xs={12} md={6}>
488
+ <div>
489
+ <label className="text-xs font-semibold text-slate-600 dark:text-slate-400 mb-1 block">Departamento</label>
490
+ <select className="w-full border border-slate-200 dark:border-slate-700 rounded-lg px-3 py-2 text-sm bg-white dark:bg-slate-800 text-slate-800 dark:text-white outline-none focus:ring-2 focus:ring-primary-500">
491
+ <option>Seleccionar...</option>
492
+ <option>Ingeniería</option>
493
+ <option>Diseño</option>
494
+ <option>Ventas</option>
495
+ </select>
496
+ </div>
497
+ </ITGrid>
498
+ <ITGrid item xs={12}>
499
+ <ITFlex justify="end" gap={3}>
500
+ <ITButton label="Cancelar" variant="outlined" size="small" />
501
+ <ITButton label="Guardar" size="small" />
502
+ </ITFlex>
503
+ </ITGrid>
504
+ </ITGrid>
505
+ </ITStack>
506
+ <div className="mt-6">
507
+ <CodeViewer code={formCode} />
508
+ </div>
509
+ </ITCard>
510
+ );
511
+ };
512
+
513
+ export const ScreenCardGridShowcase = () => {
514
+ const code = `// Grid de tarjetas 100% responsivo
515
+ <ITGrid container spacing={4}>
516
+ {products.map(product => (
517
+ <ITGrid item xs={12} sm={6} md={4} lg={3} key={product.id}>
518
+ <ITCard>
519
+ <img src={product.image} alt={product.name} />
520
+ <ITStack spacing={1}>
521
+ <h3 className="font-bold">{product.name}</h3>
522
+ <p className="text-sm text-slate-500">{product.price}</p>
523
+ <ITButton label="Ver más" fullWidth />
524
+ </ITStack>
525
+ </ITCard>
526
+ </ITGrid>
527
+ ))}
528
+ </ITGrid>`;
529
+
530
+ return (
531
+ <ITCard title="Grid de Tarjetas Responsivo">
532
+ <ITStack spacing={4}>
533
+ <div>
534
+ <h2 className="text-xl font-bold text-slate-800 dark:text-white">Productos</h2>
535
+ <p className="text-xs text-slate-400">Galería responsiva que pasa de 1 columna en mobile a 4 columnas en desktop</p>
536
+ </div>
537
+
538
+ <ITGrid container spacing={4}>
539
+ {[
540
+ { name: "Design Pro", color: "bg-blue-500" },
541
+ { name: "Dev Kit", color: "bg-emerald-500" },
542
+ { name: "UI Bundle", color: "bg-purple-500" },
543
+ { name: "Analytics", color: "bg-amber-500" },
544
+ { name: "Cloud Sync", color: "bg-rose-500" },
545
+ { name: "Security+", color: "bg-cyan-500" },
546
+ { name: "Data Viz", color: "bg-indigo-500" },
547
+ { name: "API Hub", color: "bg-teal-500" },
548
+ ].map((product, i) => (
549
+ <ITGrid key={i} item xs={12} sm={6} md={4} lg={3}>
550
+ <ITStack spacing={3} className="bg-white dark:bg-slate-800 rounded-xl border border-slate-200 dark:border-slate-700 p-4 hover:shadow-md transition-shadow">
551
+ <div className={`${product.color} h-24 rounded-lg flex items-center justify-center text-white text-2xl font-bold`}>
552
+ {product.name.charAt(0)}
553
+ </div>
554
+ <div>
555
+ <h3 className="font-bold text-slate-800 dark:text-white text-sm">{product.name}</h3>
556
+ <p className="text-xs text-slate-400 mt-0.5">A partir de $19.99/mes</p>
557
+ </div>
558
+ <ITButton label="Ver más" size="small" className="w-full" />
559
+ </ITStack>
560
+ </ITGrid>
561
+ ))}
562
+ </ITGrid>
563
+ </ITStack>
564
+ <div className="mt-6">
565
+ <CodeViewer code={code} />
566
+ </div>
567
+ </ITCard>
568
+ );
569
+ };