@thangnqdev/ui 0.1.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 (253) hide show
  1. package/README.md +196 -0
  2. package/dist/Label-DWOlgSNW.d.cts +14 -0
  3. package/dist/Label-DWOlgSNW.d.ts +14 -0
  4. package/dist/bento/index.cjs +140 -0
  5. package/dist/bento/index.cjs.map +1 -0
  6. package/dist/bento/index.d.cts +4 -0
  7. package/dist/bento/index.d.ts +4 -0
  8. package/dist/bento/index.js +4 -0
  9. package/dist/bento/index.js.map +1 -0
  10. package/dist/bento/styles.css +46 -0
  11. package/dist/buttons/index.cjs +365 -0
  12. package/dist/buttons/index.cjs.map +1 -0
  13. package/dist/buttons/index.d.cts +4 -0
  14. package/dist/buttons/index.d.ts +4 -0
  15. package/dist/buttons/index.js +5 -0
  16. package/dist/buttons/index.js.map +1 -0
  17. package/dist/buttons/styles.css +6 -0
  18. package/dist/chunk-2OXZK6IP.js +514 -0
  19. package/dist/chunk-2OXZK6IP.js.map +1 -0
  20. package/dist/chunk-4S6L5V7X.js +15 -0
  21. package/dist/chunk-4S6L5V7X.js.map +1 -0
  22. package/dist/chunk-5FZ6ZFII.js +728 -0
  23. package/dist/chunk-5FZ6ZFII.js.map +1 -0
  24. package/dist/chunk-66VWUJEI.js +86 -0
  25. package/dist/chunk-66VWUJEI.js.map +1 -0
  26. package/dist/chunk-A7P3O5Z5.js +163 -0
  27. package/dist/chunk-A7P3O5Z5.js.map +1 -0
  28. package/dist/chunk-ATYGDTMK.js +257 -0
  29. package/dist/chunk-ATYGDTMK.js.map +1 -0
  30. package/dist/chunk-C4SUXMI3.js +138 -0
  31. package/dist/chunk-C4SUXMI3.js.map +1 -0
  32. package/dist/chunk-EU2LPUYP.js +25 -0
  33. package/dist/chunk-EU2LPUYP.js.map +1 -0
  34. package/dist/chunk-F5Q7BTMH.js +1991 -0
  35. package/dist/chunk-F5Q7BTMH.js.map +1 -0
  36. package/dist/chunk-GXI2H5XA.js +46 -0
  37. package/dist/chunk-GXI2H5XA.js.map +1 -0
  38. package/dist/chunk-H3LCNPMC.js +101 -0
  39. package/dist/chunk-H3LCNPMC.js.map +1 -0
  40. package/dist/chunk-IABPUCAQ.js +19 -0
  41. package/dist/chunk-IABPUCAQ.js.map +1 -0
  42. package/dist/chunk-KJRBRTQE.js +101 -0
  43. package/dist/chunk-KJRBRTQE.js.map +1 -0
  44. package/dist/chunk-LBUBXUYQ.js +40 -0
  45. package/dist/chunk-LBUBXUYQ.js.map +1 -0
  46. package/dist/chunk-LWFRUJRU.js +537 -0
  47. package/dist/chunk-LWFRUJRU.js.map +1 -0
  48. package/dist/chunk-NFVONJUK.js +882 -0
  49. package/dist/chunk-NFVONJUK.js.map +1 -0
  50. package/dist/chunk-PF4ZHGVW.js +284 -0
  51. package/dist/chunk-PF4ZHGVW.js.map +1 -0
  52. package/dist/chunk-WAFHC4DQ.js +366 -0
  53. package/dist/chunk-WAFHC4DQ.js.map +1 -0
  54. package/dist/chunk-X76KBH4Y.js +71 -0
  55. package/dist/chunk-X76KBH4Y.js.map +1 -0
  56. package/dist/core/index.cjs +103 -0
  57. package/dist/core/index.cjs.map +1 -0
  58. package/dist/core/index.d.cts +3 -0
  59. package/dist/core/index.d.ts +3 -0
  60. package/dist/core/index.js +4 -0
  61. package/dist/core/index.js.map +1 -0
  62. package/dist/core/styles.css +128 -0
  63. package/dist/data-display/index.cjs +1023 -0
  64. package/dist/data-display/index.cjs.map +1 -0
  65. package/dist/data-display/index.d.cts +4 -0
  66. package/dist/data-display/index.d.ts +4 -0
  67. package/dist/data-display/index.js +6 -0
  68. package/dist/data-display/index.js.map +1 -0
  69. package/dist/data-display/styles.css +4 -0
  70. package/dist/feedback/index.cjs +368 -0
  71. package/dist/feedback/index.cjs.map +1 -0
  72. package/dist/feedback/index.d.cts +4 -0
  73. package/dist/feedback/index.d.ts +4 -0
  74. package/dist/feedback/index.js +4 -0
  75. package/dist/feedback/index.js.map +1 -0
  76. package/dist/feedback/styles.css +4 -0
  77. package/dist/forms/index.cjs +2287 -0
  78. package/dist/forms/index.cjs.map +1 -0
  79. package/dist/forms/index.d.cts +5 -0
  80. package/dist/forms/index.d.ts +5 -0
  81. package/dist/forms/index.js +10 -0
  82. package/dist/forms/index.js.map +1 -0
  83. package/dist/forms/styles.css +6 -0
  84. package/dist/glass/index.cjs +165 -0
  85. package/dist/glass/index.cjs.map +1 -0
  86. package/dist/glass/index.d.cts +4 -0
  87. package/dist/glass/index.d.ts +4 -0
  88. package/dist/glass/index.js +4 -0
  89. package/dist/glass/index.js.map +1 -0
  90. package/dist/glass/styles.css +81 -0
  91. package/dist/index-BTvkbCIj.d.cts +146 -0
  92. package/dist/index-BTvkbCIj.d.ts +146 -0
  93. package/dist/index-BkRqGNG1.d.cts +201 -0
  94. package/dist/index-BkRqGNG1.d.ts +201 -0
  95. package/dist/index-BlPcGeW-.d.cts +45 -0
  96. package/dist/index-BlPcGeW-.d.ts +45 -0
  97. package/dist/index-BzOCqvC6.d.cts +32 -0
  98. package/dist/index-BzOCqvC6.d.ts +32 -0
  99. package/dist/index-CCeWYAvn.d.cts +83 -0
  100. package/dist/index-COQ7uwt9.d.cts +44 -0
  101. package/dist/index-COQ7uwt9.d.ts +44 -0
  102. package/dist/index-CenuF_P2.d.cts +221 -0
  103. package/dist/index-CenuF_P2.d.ts +221 -0
  104. package/dist/index-Cle6QzQl.d.ts +371 -0
  105. package/dist/index-D6fE7w-b.d.cts +90 -0
  106. package/dist/index-D6fE7w-b.d.ts +90 -0
  107. package/dist/index-DR8cfJUG.d.ts +83 -0
  108. package/dist/index-DzcWh1Hs.d.cts +131 -0
  109. package/dist/index-DzcWh1Hs.d.ts +131 -0
  110. package/dist/index-TyK-Ldpy.d.cts +371 -0
  111. package/dist/index-ugj5s6a3.d.cts +95 -0
  112. package/dist/index-ugj5s6a3.d.ts +95 -0
  113. package/dist/index.cjs +6400 -0
  114. package/dist/index.cjs.map +1 -0
  115. package/dist/index.d.cts +16 -0
  116. package/dist/index.d.ts +16 -0
  117. package/dist/index.js +21 -0
  118. package/dist/index.js.map +1 -0
  119. package/dist/layout/index.cjs +516 -0
  120. package/dist/layout/index.cjs.map +1 -0
  121. package/dist/layout/index.d.cts +4 -0
  122. package/dist/layout/index.d.ts +4 -0
  123. package/dist/layout/index.js +4 -0
  124. package/dist/layout/index.js.map +1 -0
  125. package/dist/layout/styles.css +8 -0
  126. package/dist/navigation/index.cjs +673 -0
  127. package/dist/navigation/index.cjs.map +1 -0
  128. package/dist/navigation/index.d.cts +2 -0
  129. package/dist/navigation/index.d.ts +2 -0
  130. package/dist/navigation/index.js +8 -0
  131. package/dist/navigation/index.js.map +1 -0
  132. package/dist/navigation/styles.css +4 -0
  133. package/dist/overlays/index.cjs +954 -0
  134. package/dist/overlays/index.cjs.map +1 -0
  135. package/dist/overlays/index.d.cts +4 -0
  136. package/dist/overlays/index.d.ts +4 -0
  137. package/dist/overlays/index.js +9 -0
  138. package/dist/overlays/index.js.map +1 -0
  139. package/dist/overlays/styles.css +8 -0
  140. package/dist/styles.css +333 -0
  141. package/dist/typography/index.cjs +311 -0
  142. package/dist/typography/index.cjs.map +1 -0
  143. package/dist/typography/index.d.cts +5 -0
  144. package/dist/typography/index.d.ts +5 -0
  145. package/dist/typography/index.js +6 -0
  146. package/dist/typography/index.js.map +1 -0
  147. package/dist/typography/styles.css +5 -0
  148. package/llms.txt +113 -0
  149. package/package.json +116 -0
  150. package/src/bento/BentoCard.tsx +140 -0
  151. package/src/bento/BentoGrid.tsx +50 -0
  152. package/src/bento/index.ts +2 -0
  153. package/src/bento/tokens.css +46 -0
  154. package/src/buttons/Button.tsx +104 -0
  155. package/src/buttons/ButtonGroup.tsx +43 -0
  156. package/src/buttons/IconButton.tsx +79 -0
  157. package/src/buttons/SplitButton.tsx +86 -0
  158. package/src/buttons/ToggleButton.tsx +157 -0
  159. package/src/buttons/index.ts +5 -0
  160. package/src/buttons/tokens.css +6 -0
  161. package/src/core/ThemeProvider.tsx +123 -0
  162. package/src/core/index.ts +2 -0
  163. package/src/core/tokens.css +128 -0
  164. package/src/data-display/Accordion.tsx +147 -0
  165. package/src/data-display/Avatar.tsx +134 -0
  166. package/src/data-display/Card.tsx +112 -0
  167. package/src/data-display/Carousel.tsx +130 -0
  168. package/src/data-display/Chip.tsx +74 -0
  169. package/src/data-display/DataTablePro.tsx +356 -0
  170. package/src/data-display/StatCard.tsx +60 -0
  171. package/src/data-display/Table.tsx +74 -0
  172. package/src/data-display/Timeline.tsx +62 -0
  173. package/src/data-display/TreeView.tsx +140 -0
  174. package/src/data-display/index.ts +10 -0
  175. package/src/data-display/tokens.css +4 -0
  176. package/src/feedback/Alert.tsx +80 -0
  177. package/src/feedback/EmptyState.tsx +45 -0
  178. package/src/feedback/ProgressBar.tsx +174 -0
  179. package/src/feedback/Skeleton.tsx +66 -0
  180. package/src/feedback/Spinner.tsx +65 -0
  181. package/src/feedback/index.ts +5 -0
  182. package/src/feedback/tokens.css +4 -0
  183. package/src/forms/Checkbox.tsx +69 -0
  184. package/src/forms/CheckboxGroup.tsx +29 -0
  185. package/src/forms/Combobox.tsx +368 -0
  186. package/src/forms/DatePicker.tsx +480 -0
  187. package/src/forms/FileUpload.tsx +222 -0
  188. package/src/forms/FormField.tsx +115 -0
  189. package/src/forms/Input.tsx +151 -0
  190. package/src/forms/MaskedInput.tsx +97 -0
  191. package/src/forms/NumberInput.tsx +248 -0
  192. package/src/forms/PasswordInput.tsx +35 -0
  193. package/src/forms/PinInput.tsx +125 -0
  194. package/src/forms/Radio.tsx +142 -0
  195. package/src/forms/RangeSlider.tsx +111 -0
  196. package/src/forms/SearchInput.tsx +34 -0
  197. package/src/forms/Select.tsx +103 -0
  198. package/src/forms/Slider.tsx +85 -0
  199. package/src/forms/Switch.tsx +95 -0
  200. package/src/forms/Textarea.tsx +114 -0
  201. package/src/forms/index.ts +18 -0
  202. package/src/forms/tokens.css +6 -0
  203. package/src/glass/GlassBadge.tsx +61 -0
  204. package/src/glass/GlassButton.tsx +59 -0
  205. package/src/glass/GlassCard.tsx +71 -0
  206. package/src/glass/index.ts +3 -0
  207. package/src/glass/tokens.css +81 -0
  208. package/src/index.ts +26 -0
  209. package/src/layout/AspectRatio.tsx +39 -0
  210. package/src/layout/Container.tsx +53 -0
  211. package/src/layout/Divider.tsx +61 -0
  212. package/src/layout/Flex.tsx +79 -0
  213. package/src/layout/Grid.tsx +124 -0
  214. package/src/layout/PageLayout.tsx +59 -0
  215. package/src/layout/ScrollArea.tsx +43 -0
  216. package/src/layout/Section.tsx +47 -0
  217. package/src/layout/Spacer.tsx +30 -0
  218. package/src/layout/Stack.tsx +88 -0
  219. package/src/layout/index.ts +10 -0
  220. package/src/layout/tokens.css +8 -0
  221. package/src/navigation/Breadcrumb.tsx +73 -0
  222. package/src/navigation/CommandPalette.tsx +142 -0
  223. package/src/navigation/DropdownMenu.tsx +160 -0
  224. package/src/navigation/Pagination.tsx +114 -0
  225. package/src/navigation/Stepper.tsx +93 -0
  226. package/src/navigation/Tabs.tsx +133 -0
  227. package/src/navigation/index.ts +6 -0
  228. package/src/navigation/tokens.css +4 -0
  229. package/src/overlays/AlertDialog.tsx +54 -0
  230. package/src/overlays/BottomSheet.tsx +123 -0
  231. package/src/overlays/ContextMenu.tsx +119 -0
  232. package/src/overlays/Drawer.tsx +145 -0
  233. package/src/overlays/FocusTrap.tsx +49 -0
  234. package/src/overlays/HoverCard.tsx +72 -0
  235. package/src/overlays/Modal.tsx +219 -0
  236. package/src/overlays/Popover.tsx +126 -0
  237. package/src/overlays/Portal.tsx +23 -0
  238. package/src/overlays/Toast.tsx +137 -0
  239. package/src/overlays/Tooltip.tsx +100 -0
  240. package/src/overlays/index.ts +11 -0
  241. package/src/overlays/tokens.css +8 -0
  242. package/src/styles/tokens.css +2 -0
  243. package/src/typography/Blockquote.tsx +32 -0
  244. package/src/typography/Code.tsx +89 -0
  245. package/src/typography/Heading.tsx +56 -0
  246. package/src/typography/Kbd.tsx +25 -0
  247. package/src/typography/Label.tsx +47 -0
  248. package/src/typography/Link.tsx +56 -0
  249. package/src/typography/Text.tsx +62 -0
  250. package/src/typography/index.ts +7 -0
  251. package/src/typography/tokens.css +5 -0
  252. package/src/utils/cn.ts +6 -0
  253. package/ui-contract.json +62 -0
@@ -0,0 +1,1023 @@
1
+ 'use strict';
2
+
3
+ var React11 = require('react');
4
+ var classVarianceAuthority = require('class-variance-authority');
5
+ var clsx = require('clsx');
6
+ var tailwindMerge = require('tailwind-merge');
7
+ var jsxRuntime = require('react/jsx-runtime');
8
+ var lucideReact = require('lucide-react');
9
+
10
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
11
+
12
+ var React11__default = /*#__PURE__*/_interopDefault(React11);
13
+
14
+ // src/data-display/Card.tsx
15
+ function cn(...inputs) {
16
+ return tailwindMerge.twMerge(clsx.clsx(inputs));
17
+ }
18
+ var cardVariants = classVarianceAuthority.cva(
19
+ "relative overflow-hidden rounded-[var(--ui-radius-xl)] transition-all duration-200 border",
20
+ {
21
+ variants: {
22
+ variant: {
23
+ default: "bg-[var(--ui-bg-surface)] backdrop-blur-xl border-[var(--ui-border-default)] shadow-[var(--ui-shadow-md)] text-[var(--ui-text-primary)]",
24
+ bordered: "bg-transparent border-[var(--ui-border-strong)] text-[var(--ui-text-primary)]",
25
+ elevated: "bg-[var(--ui-bg-surface)] backdrop-blur-2xl border-[var(--ui-border-default)] shadow-[var(--ui-shadow-xl)] hover:shadow-2xl text-[var(--ui-text-primary)]",
26
+ interactive: "bg-[var(--ui-bg-surface)] backdrop-blur-xl border-[var(--ui-border-default)] shadow-[var(--ui-shadow-md)] hover:border-[var(--ui-primary)] cursor-pointer hover:-translate-y-1 hover:shadow-[0_12px_32px_rgba(99,102,241,0.15)] text-[var(--ui-text-primary)] active:translate-y-0",
27
+ glow: "bg-[var(--ui-bg-surface)] backdrop-blur-xl border-indigo-500/30 shadow-[0_0_30px_rgba(99,102,241,0.12)] text-[var(--ui-text-primary)]"
28
+ },
29
+ padding: {
30
+ none: "p-0",
31
+ sm: "p-4 sm:p-5",
32
+ md: "p-6 sm:p-7",
33
+ lg: "p-8 sm:p-10"
34
+ },
35
+ specular: {
36
+ true: "before:absolute before:inset-x-0 before:top-0 before:h-px before:bg-gradient-to-r before:from-transparent before:via-white/30 before:to-transparent before:pointer-events-none",
37
+ false: ""
38
+ }
39
+ },
40
+ defaultVariants: {
41
+ variant: "default",
42
+ padding: "md",
43
+ specular: true
44
+ }
45
+ }
46
+ );
47
+ var Card = React11.forwardRef(
48
+ ({ className, variant, padding, specular = true, children, ...props }, ref) => {
49
+ return /* @__PURE__ */ jsxRuntime.jsx(
50
+ "div",
51
+ {
52
+ ref,
53
+ className: cn(cardVariants({ variant, padding, specular }), className),
54
+ ...props,
55
+ children
56
+ }
57
+ );
58
+ }
59
+ );
60
+ Card.displayName = "Card";
61
+ var CardHeader = React11.forwardRef(
62
+ ({ className, children, ...props }, ref) => {
63
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { ref, className: cn("flex flex-col space-y-1.5 mb-5", className), ...props, children });
64
+ }
65
+ );
66
+ CardHeader.displayName = "CardHeader";
67
+ var CardTitle = React11.forwardRef(
68
+ ({ className, children, ...props }, ref) => {
69
+ return /* @__PURE__ */ jsxRuntime.jsx("h3", { ref, className: cn("text-lg sm:text-xl font-bold tracking-tight text-[var(--ui-text-primary)]", className), ...props, children });
70
+ }
71
+ );
72
+ CardTitle.displayName = "CardTitle";
73
+ var CardDescription = React11.forwardRef(
74
+ ({ className, children, ...props }, ref) => {
75
+ return /* @__PURE__ */ jsxRuntime.jsx("p", { ref, className: cn("text-xs sm:text-sm text-[var(--ui-text-muted)] font-normal leading-relaxed", className), ...props, children });
76
+ }
77
+ );
78
+ CardDescription.displayName = "CardDescription";
79
+ var CardContent = React11.forwardRef(
80
+ ({ className, children, ...props }, ref) => {
81
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { ref, className: cn("pt-0", className), ...props, children });
82
+ }
83
+ );
84
+ CardContent.displayName = "CardContent";
85
+ var CardFooter = React11.forwardRef(
86
+ ({ className, children, ...props }, ref) => {
87
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { ref, className: cn("flex items-center pt-4 mt-5 border-t border-[var(--ui-border-subtle)]", className), ...props, children });
88
+ }
89
+ );
90
+ CardFooter.displayName = "CardFooter";
91
+ var Table = React11.forwardRef(
92
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx("div", { className: "relative w-full overflow-auto rounded-[var(--ui-radius-lg)] border border-[var(--ui-border-default)] bg-[var(--ui-bg-surface)]", children: /* @__PURE__ */ jsxRuntime.jsx("table", { ref, className: cn("w-full caption-bottom text-sm text-left", className), ...props }) })
93
+ );
94
+ Table.displayName = "Table";
95
+ var TableHeader = React11.forwardRef(
96
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx("thead", { ref, className: cn("bg-[var(--ui-bg-secondary)] border-b border-[var(--ui-border-default)]", className), ...props })
97
+ );
98
+ TableHeader.displayName = "TableHeader";
99
+ var TableBody = React11.forwardRef(
100
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx("tbody", { ref, className: cn("[&_tr:last-child]:border-0", className), ...props })
101
+ );
102
+ TableBody.displayName = "TableBody";
103
+ var TableFooter = React11.forwardRef(
104
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx("tfoot", { ref, className: cn("bg-[var(--ui-bg-secondary)] font-medium border-t border-[var(--ui-border-default)]", className), ...props })
105
+ );
106
+ TableFooter.displayName = "TableFooter";
107
+ var TableRow = React11.forwardRef(
108
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
109
+ "tr",
110
+ {
111
+ ref,
112
+ className: cn(
113
+ "border-b border-[var(--ui-border-subtle)] transition-colors hover:bg-[var(--ui-bg-tertiary)]/50 data-[state=selected]:bg-[var(--ui-bg-tertiary)]",
114
+ className
115
+ ),
116
+ ...props
117
+ }
118
+ )
119
+ );
120
+ TableRow.displayName = "TableRow";
121
+ var TableHead = React11.forwardRef(
122
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
123
+ "th",
124
+ {
125
+ ref,
126
+ className: cn(
127
+ "h-11 px-4 text-left align-middle font-semibold text-xs text-[var(--ui-text-muted)] uppercase tracking-wider",
128
+ className
129
+ ),
130
+ ...props
131
+ }
132
+ )
133
+ );
134
+ TableHead.displayName = "TableHead";
135
+ var TableCell = React11.forwardRef(
136
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx("td", { ref, className: cn("p-4 align-middle text-sm text-[var(--ui-text-primary)]", className), ...props })
137
+ );
138
+ TableCell.displayName = "TableCell";
139
+ var TableCaption = React11.forwardRef(
140
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx("caption", { ref, className: cn("mt-4 text-xs text-[var(--ui-text-muted)]", className), ...props })
141
+ );
142
+ TableCaption.displayName = "TableCaption";
143
+ var avatarVariants = classVarianceAuthority.cva(
144
+ "relative inline-flex shrink-0 items-center justify-center overflow-hidden rounded-full bg-[var(--ui-bg-tertiary)] select-none border border-[var(--ui-border-subtle)]",
145
+ {
146
+ variants: {
147
+ size: {
148
+ xs: "h-6 w-6 text-[10px]",
149
+ sm: "h-8 w-8 text-xs",
150
+ md: "h-10 w-10 text-sm font-semibold",
151
+ lg: "h-12 w-12 text-base font-semibold",
152
+ xl: "h-16 w-16 text-lg font-bold"
153
+ }
154
+ },
155
+ defaultVariants: {
156
+ size: "md"
157
+ }
158
+ }
159
+ );
160
+ var statusVariants = classVarianceAuthority.cva(
161
+ "absolute bottom-0 right-0 rounded-full ring-2 ring-[var(--ui-bg-surface)]",
162
+ {
163
+ variants: {
164
+ status: {
165
+ online: "bg-[var(--ui-success)]",
166
+ offline: "bg-[var(--ui-text-muted)]",
167
+ busy: "bg-[var(--ui-error)]",
168
+ away: "bg-[var(--ui-warning)]"
169
+ },
170
+ size: {
171
+ xs: "h-1.5 w-1.5",
172
+ sm: "h-2 w-2",
173
+ md: "h-2.5 w-2.5",
174
+ lg: "h-3 w-3",
175
+ xl: "h-4 w-4"
176
+ }
177
+ },
178
+ defaultVariants: {
179
+ status: "online",
180
+ size: "md"
181
+ }
182
+ }
183
+ );
184
+ var Avatar = React11.forwardRef(
185
+ ({ className, size = "md", src, alt, name, status, children, ...props }, ref) => {
186
+ const [hasError, setHasError] = React11.useState(false);
187
+ const getInitials = (n) => {
188
+ if (!n) return "";
189
+ const parts = n.trim().split(" ");
190
+ if (parts.length === 1) return parts[0].slice(0, 2).toUpperCase();
191
+ return (parts[0][0] + parts[parts.length - 1][0]).toUpperCase();
192
+ };
193
+ const initials = name ? getInitials(name) : "";
194
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { ref, className: cn(avatarVariants({ size }), className), ...props, children: [
195
+ src && !hasError ? /* @__PURE__ */ jsxRuntime.jsx(
196
+ "img",
197
+ {
198
+ src,
199
+ alt: alt || name || "Avatar",
200
+ onError: () => setHasError(true),
201
+ className: "h-full w-full object-cover"
202
+ }
203
+ ) : initials ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-semibold text-[var(--ui-text-secondary)]", children: initials }) : children || /* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-semibold text-[var(--ui-text-muted)]", children: "?" }),
204
+ status && /* @__PURE__ */ jsxRuntime.jsx(
205
+ "span",
206
+ {
207
+ "aria-label": `Status: ${status}`,
208
+ className: cn(statusVariants({ status, size }))
209
+ }
210
+ )
211
+ ] });
212
+ }
213
+ );
214
+ Avatar.displayName = "Avatar";
215
+ var AvatarGroup = React11.forwardRef(
216
+ ({ className, max = 4, spacing = "tight", children, ...props }, ref) => {
217
+ const childArray = React11__default.default.Children.toArray(children);
218
+ const visibleChildren = childArray.slice(0, max);
219
+ const remainingCount = childArray.length - max;
220
+ return /* @__PURE__ */ jsxRuntime.jsxs(
221
+ "div",
222
+ {
223
+ ref,
224
+ role: "group",
225
+ className: cn(
226
+ "flex items-center",
227
+ spacing === "tight" ? "-space-x-3" : "-space-x-1.5",
228
+ className
229
+ ),
230
+ ...props,
231
+ children: [
232
+ visibleChildren.map((child, i) => /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ring-2 ring-[var(--ui-bg-surface)] rounded-full", children: child }, i)),
233
+ remainingCount > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative inline-flex h-10 w-10 shrink-0 items-center justify-center rounded-full bg-[var(--ui-bg-secondary)] border border-[var(--ui-border-default)] ring-2 ring-[var(--ui-bg-surface)] text-xs font-bold text-[var(--ui-text-secondary)] select-none", children: [
234
+ "+",
235
+ remainingCount
236
+ ] })
237
+ ]
238
+ }
239
+ );
240
+ }
241
+ );
242
+ AvatarGroup.displayName = "AvatarGroup";
243
+ var AccordionContext = React11.createContext(null);
244
+ function useAccordion() {
245
+ const context = React11.useContext(AccordionContext);
246
+ if (!context) throw new Error("AccordionItem components must be used within <Accordion />");
247
+ return context;
248
+ }
249
+ var Accordion = React11.forwardRef(
250
+ ({
251
+ className,
252
+ type = "single",
253
+ defaultValue,
254
+ value: controlledValue,
255
+ onValueChange,
256
+ children,
257
+ ...props
258
+ }, ref) => {
259
+ const [internalOpen, setInternalOpen] = React11.useState(() => {
260
+ if (Array.isArray(defaultValue)) return defaultValue;
261
+ if (typeof defaultValue === "string") return [defaultValue];
262
+ return [];
263
+ });
264
+ const openItems = controlledValue !== void 0 ? Array.isArray(controlledValue) ? controlledValue : [controlledValue] : internalOpen;
265
+ const toggleItem = (id) => {
266
+ let next;
267
+ if (type === "single") {
268
+ next = openItems.includes(id) ? [] : [id];
269
+ } else {
270
+ next = openItems.includes(id) ? openItems.filter((i) => i !== id) : [...openItems, id];
271
+ }
272
+ setInternalOpen(next);
273
+ onValueChange?.(type === "single" ? next[0] || "" : next);
274
+ };
275
+ return /* @__PURE__ */ jsxRuntime.jsx(AccordionContext.Provider, { value: { openItems, toggleItem }, children: /* @__PURE__ */ jsxRuntime.jsx("div", { ref, className: cn("divide-y divide-[var(--ui-border-subtle)] border-y border-[var(--ui-border-subtle)]", className), ...props, children }) });
276
+ }
277
+ );
278
+ Accordion.displayName = "Accordion";
279
+ var AccordionItemContext = React11.createContext(null);
280
+ var AccordionItem = React11.forwardRef(
281
+ ({ className, value, children, ...props }, ref) => {
282
+ return /* @__PURE__ */ jsxRuntime.jsx(AccordionItemContext.Provider, { value: { id: value }, children: /* @__PURE__ */ jsxRuntime.jsx("div", { ref, className: cn("w-full", className), ...props, children }) });
283
+ }
284
+ );
285
+ AccordionItem.displayName = "AccordionItem";
286
+ var AccordionTrigger = React11.forwardRef(
287
+ ({ className, children, ...props }, ref) => {
288
+ const { openItems, toggleItem } = useAccordion();
289
+ const item = React11.useContext(AccordionItemContext);
290
+ const isOpen = item ? openItems.includes(item.id) : false;
291
+ return /* @__PURE__ */ jsxRuntime.jsxs(
292
+ "button",
293
+ {
294
+ ref,
295
+ type: "button",
296
+ "aria-expanded": isOpen,
297
+ onClick: () => item && toggleItem(item.id),
298
+ className: cn(
299
+ "flex w-full items-center justify-between py-4 text-sm font-semibold text-[var(--ui-text-primary)] transition-all hover:text-[var(--ui-primary)] text-left",
300
+ className
301
+ ),
302
+ ...props,
303
+ children: [
304
+ children,
305
+ /* @__PURE__ */ jsxRuntime.jsx(
306
+ lucideReact.ChevronDown,
307
+ {
308
+ className: cn(
309
+ "h-4 w-4 shrink-0 text-[var(--ui-text-muted)] transition-transform duration-200",
310
+ isOpen && "rotate-180 text-[var(--ui-primary)]"
311
+ )
312
+ }
313
+ )
314
+ ]
315
+ }
316
+ );
317
+ }
318
+ );
319
+ AccordionTrigger.displayName = "AccordionTrigger";
320
+ var AccordionContent = React11.forwardRef(
321
+ ({ className, children, ...props }, ref) => {
322
+ const { openItems } = useAccordion();
323
+ const item = React11.useContext(AccordionItemContext);
324
+ const isOpen = item ? openItems.includes(item.id) : false;
325
+ if (!isOpen) return null;
326
+ return /* @__PURE__ */ jsxRuntime.jsx(
327
+ "div",
328
+ {
329
+ ref,
330
+ className: cn("pb-4 pt-0 text-sm text-[var(--ui-text-secondary)] animate-in fade-in duration-200", className),
331
+ ...props,
332
+ children
333
+ }
334
+ );
335
+ }
336
+ );
337
+ AccordionContent.displayName = "AccordionContent";
338
+ var chipVariants = classVarianceAuthority.cva(
339
+ "inline-flex items-center gap-1.5 rounded-full font-medium transition-colors select-none",
340
+ {
341
+ variants: {
342
+ variant: {
343
+ default: "bg-[var(--ui-bg-tertiary)] text-[var(--ui-text-primary)] border border-[var(--ui-border-default)]",
344
+ primary: "bg-[var(--ui-primary)]/15 text-[var(--ui-primary)] border border-[var(--ui-primary)]/30",
345
+ secondary: "bg-[var(--ui-secondary)]/15 text-[var(--ui-secondary)] border border-[var(--ui-secondary)]/30",
346
+ success: "bg-[var(--ui-success-subtle)] text-[var(--ui-success)] border border-[var(--ui-success)]/30",
347
+ warning: "bg-[var(--ui-warning-subtle)] text-[var(--ui-warning)] border border-[var(--ui-warning)]/30",
348
+ error: "bg-[var(--ui-error-subtle)] text-[var(--ui-error)] border border-[var(--ui-error)]/30"
349
+ },
350
+ size: {
351
+ sm: "h-6 px-2.5 text-xs",
352
+ md: "h-7 px-3 text-xs",
353
+ lg: "h-8 px-3.5 text-sm"
354
+ },
355
+ clickable: {
356
+ true: "cursor-pointer hover:opacity-80 active:scale-95",
357
+ false: ""
358
+ }
359
+ },
360
+ defaultVariants: {
361
+ variant: "default",
362
+ size: "md",
363
+ clickable: false
364
+ }
365
+ }
366
+ );
367
+ var Chip = React11.forwardRef(
368
+ ({ className, variant, size, clickable, onRemove, icon, children, onClick, ...props }, ref) => {
369
+ const isClickable = Boolean(clickable || onClick);
370
+ return /* @__PURE__ */ jsxRuntime.jsxs(
371
+ "div",
372
+ {
373
+ ref,
374
+ onClick,
375
+ className: cn(chipVariants({ variant, size, clickable: isClickable }), className),
376
+ ...props,
377
+ children: [
378
+ icon && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "flex-shrink-0", children: icon }),
379
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children }),
380
+ onRemove && /* @__PURE__ */ jsxRuntime.jsx(
381
+ "button",
382
+ {
383
+ type: "button",
384
+ onClick: (e) => {
385
+ e.stopPropagation();
386
+ onRemove();
387
+ },
388
+ "aria-label": "Remove chip",
389
+ className: "p-0.5 rounded-full hover:bg-black/10 dark:hover:bg-white/10 transition-colors -mr-1",
390
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.X, { className: "w-3 h-3" })
391
+ }
392
+ )
393
+ ]
394
+ }
395
+ );
396
+ }
397
+ );
398
+ Chip.displayName = "Chip";
399
+ var StatCard = React11.forwardRef(
400
+ ({ className, label, value, change, trend, trendLabel, icon, ...props }, ref) => {
401
+ return /* @__PURE__ */ jsxRuntime.jsxs(Card, { ref, className: cn("p-6", className), ...props, children: [
402
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between", children: [
403
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs font-semibold uppercase tracking-wider text-[var(--ui-text-muted)]", children: label }),
404
+ icon && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "p-2 rounded-[var(--ui-radius-md)] bg-[var(--ui-bg-secondary)] text-[var(--ui-text-secondary)]", children: icon })
405
+ ] }),
406
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-3 flex items-baseline gap-2", children: [
407
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-2xl sm:text-3xl font-extrabold tracking-tight text-[var(--ui-text-primary)]", children: value }),
408
+ change !== void 0 && /* @__PURE__ */ jsxRuntime.jsxs(
409
+ "div",
410
+ {
411
+ className: cn(
412
+ "inline-flex items-center gap-0.5 text-xs font-bold px-1.5 py-0.5 rounded-full",
413
+ trend === "up" && "text-[var(--ui-success)] bg-[var(--ui-success-subtle)]",
414
+ trend === "down" && "text-[var(--ui-error)] bg-[var(--ui-error-subtle)]",
415
+ trend === "neutral" && "text-[var(--ui-text-muted)] bg-[var(--ui-bg-tertiary)]"
416
+ ),
417
+ children: [
418
+ trend === "up" && /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ArrowUpRight, { className: "w-3.5 h-3.5" }),
419
+ trend === "down" && /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ArrowDownRight, { className: "w-3.5 h-3.5" }),
420
+ trend === "neutral" && /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Minus, { className: "w-3.5 h-3.5" }),
421
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: change })
422
+ ]
423
+ }
424
+ )
425
+ ] }),
426
+ trendLabel && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "mt-2 text-xs text-[var(--ui-text-muted)]", children: trendLabel })
427
+ ] });
428
+ }
429
+ );
430
+ StatCard.displayName = "StatCard";
431
+ var Timeline = React11.forwardRef(
432
+ ({ className, items, ...props }, ref) => {
433
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { ref, className: cn("relative pl-6 space-y-6", className), ...props, children: [
434
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute left-[11px] top-2 bottom-2 w-0.5 bg-[var(--ui-border-subtle)]" }),
435
+ items.map((item) => {
436
+ const isCompleted = item.status === "completed";
437
+ const isActive = item.status === "active";
438
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative flex items-start gap-4", children: [
439
+ /* @__PURE__ */ jsxRuntime.jsx(
440
+ "div",
441
+ {
442
+ className: cn(
443
+ "absolute -left-6 flex items-center justify-center w-6 h-6 rounded-full ring-4 ring-[var(--ui-bg-surface)] text-xs font-bold transition-all",
444
+ isCompleted && "bg-[var(--ui-primary)] text-[var(--ui-primary-fg)]",
445
+ isActive && "bg-[var(--ui-bg-surface)] border-2 border-[var(--ui-primary)] text-[var(--ui-primary)]",
446
+ (!item.status || item.status === "pending") && "bg-[var(--ui-bg-tertiary)] border border-[var(--ui-border-default)] text-[var(--ui-text-muted)]"
447
+ ),
448
+ children: item.icon || /* @__PURE__ */ jsxRuntime.jsx("span", { className: "w-1.5 h-1.5 rounded-full bg-current" })
449
+ }
450
+ ),
451
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex-1 space-y-1 pt-0.5", children: [
452
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between gap-2", children: [
453
+ /* @__PURE__ */ jsxRuntime.jsx("h4", { className: "text-sm font-semibold text-[var(--ui-text-primary)]", children: item.title }),
454
+ item.timestamp && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs text-[var(--ui-text-muted)] font-mono", children: item.timestamp })
455
+ ] }),
456
+ item.description && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-[var(--ui-text-secondary)] leading-relaxed", children: item.description })
457
+ ] })
458
+ ] }, item.id);
459
+ })
460
+ ] });
461
+ }
462
+ );
463
+ Timeline.displayName = "Timeline";
464
+ var buttonVariants = classVarianceAuthority.cva(
465
+ "relative inline-flex items-center justify-center font-medium transition-all duration-200 select-none cursor-pointer disabled:pointer-events-none disabled:opacity-40 focus-visible:outline-none focus-visible:ring-4 focus-visible:ring-[var(--ui-primary)]/30 active:scale-[0.97] overflow-hidden",
466
+ {
467
+ variants: {
468
+ variant: {
469
+ primary: "bg-[var(--ui-primary)] hover:bg-[var(--ui-primary-hover)] text-white shadow-sm hover:shadow-[0_4px_16px_rgba(0,113,227,0.35)] border border-white/20",
470
+ secondary: "bg-[var(--ui-bg-tertiary)] hover:bg-[var(--ui-bg-surface)] text-[var(--ui-text-primary)] border border-[var(--ui-border-subtle)] shadow-sm",
471
+ outline: "border border-[var(--ui-border-default)] bg-[var(--ui-bg-surface)]/60 backdrop-blur-xl text-[var(--ui-text-primary)] hover:bg-[var(--ui-bg-tertiary)] hover:border-[var(--ui-border-strong)] shadow-sm",
472
+ ghost: "bg-transparent text-[var(--ui-text-primary)] hover:bg-[var(--ui-bg-tertiary)]/70",
473
+ danger: "bg-[var(--ui-error)] hover:bg-[var(--ui-error)]/90 text-white shadow-sm hover:shadow-[0_4px_16px_rgba(255,59,48,0.35)] border border-white/15",
474
+ link: "bg-transparent text-[var(--ui-primary)] underline-offset-4 hover:underline p-0 h-auto active:scale-100 font-normal",
475
+ glass: "bg-white/10 dark:bg-white/10 backdrop-blur-2xl border border-white/20 dark:border-white/15 text-[var(--ui-text-primary)] hover:bg-white/20 dark:hover:bg-white/15 shadow-[0_8px_32px_rgba(0,0,0,0.12)] hover:shadow-[0_8px_32px_rgba(0,113,227,0.25)]"
476
+ },
477
+ size: {
478
+ xs: "h-7 px-2.5 text-xs rounded-[var(--ui-radius-sm)] gap-1",
479
+ sm: "h-8.5 px-3.5 text-xs rounded-[var(--ui-radius-md)] gap-1.5",
480
+ md: "h-10 px-4.5 text-sm rounded-[var(--ui-radius-md)] gap-2 font-semibold",
481
+ lg: "h-12 px-6 text-base rounded-[var(--ui-radius-lg)] gap-2.5 font-semibold",
482
+ xl: "h-14 px-8 text-lg rounded-[var(--ui-radius-xl)] gap-3 font-bold"
483
+ },
484
+ fullWidth: {
485
+ true: "w-full",
486
+ false: ""
487
+ }
488
+ },
489
+ defaultVariants: {
490
+ variant: "primary",
491
+ size: "md",
492
+ fullWidth: false
493
+ }
494
+ }
495
+ );
496
+ var Button = React11.forwardRef(
497
+ ({
498
+ className,
499
+ variant,
500
+ size,
501
+ fullWidth,
502
+ loading = false,
503
+ loadingText,
504
+ leftIcon,
505
+ rightIcon,
506
+ disabled,
507
+ children,
508
+ ...props
509
+ }, ref) => {
510
+ const isDisabled = disabled || loading;
511
+ return /* @__PURE__ */ jsxRuntime.jsxs(
512
+ "button",
513
+ {
514
+ ref,
515
+ disabled: isDisabled,
516
+ className: cn(buttonVariants({ variant, size, fullWidth }), className),
517
+ ...props,
518
+ children: [
519
+ /* @__PURE__ */ jsxRuntime.jsx(
520
+ "span",
521
+ {
522
+ "aria-hidden": "true",
523
+ className: "absolute inset-x-0 top-0 h-[1px] bg-gradient-to-r from-transparent via-white/35 to-transparent pointer-events-none"
524
+ }
525
+ ),
526
+ loading ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
527
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Loader2, { className: "w-4 h-4 animate-spin" }),
528
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: loadingText || children })
529
+ ] }) : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
530
+ leftIcon && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "flex-shrink-0 inline-flex items-center", children: leftIcon }),
531
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children }),
532
+ rightIcon && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "flex-shrink-0 inline-flex items-center", children: rightIcon })
533
+ ] })
534
+ ]
535
+ }
536
+ );
537
+ }
538
+ );
539
+ Button.displayName = "Button";
540
+ function DataTablePro({
541
+ data,
542
+ columns,
543
+ keyExtractor,
544
+ searchable = true,
545
+ searchPlaceholder = "Search all records...",
546
+ selectable = true,
547
+ onSelectionChange,
548
+ pageSize: initialPageSize = 10,
549
+ pageSizeOptions = [5, 10, 25, 50],
550
+ title,
551
+ description,
552
+ actions,
553
+ className
554
+ }) {
555
+ const [search, setSearch] = React11.useState("");
556
+ const [sortKey, setSortKey] = React11.useState(null);
557
+ const [sortDirection, setSortDirection] = React11.useState("asc");
558
+ const [currentPage, setCurrentPage] = React11.useState(1);
559
+ const [pageSize, setPageSize] = React11.useState(initialPageSize);
560
+ const [selectedKeys, setSelectedKeys] = React11.useState([]);
561
+ const filteredData = React11.useMemo(() => {
562
+ if (!search.trim()) return data;
563
+ const q = search.toLowerCase();
564
+ return data.filter((row) => {
565
+ return Object.values(row).some((val) => {
566
+ if (val === null || val === void 0) return false;
567
+ return String(val).toLowerCase().includes(q);
568
+ });
569
+ });
570
+ }, [data, search]);
571
+ const sortedData = React11.useMemo(() => {
572
+ if (!sortKey) return filteredData;
573
+ const col = columns.find((c) => c.key === sortKey);
574
+ return [...filteredData].sort((a, b) => {
575
+ const valA = col?.accessor ? col.accessor(a) : a[sortKey];
576
+ const valB = col?.accessor ? col.accessor(b) : b[sortKey];
577
+ if (valA === valB) return 0;
578
+ if (valA === null || valA === void 0) return 1;
579
+ if (valB === null || valB === void 0) return -1;
580
+ const comp = valA < valB ? -1 : 1;
581
+ return sortDirection === "asc" ? comp : -comp;
582
+ });
583
+ }, [filteredData, sortKey, sortDirection, columns]);
584
+ const totalPages = Math.max(1, Math.ceil(sortedData.length / pageSize));
585
+ const paginatedData = React11.useMemo(() => {
586
+ const start = (currentPage - 1) * pageSize;
587
+ return sortedData.slice(start, start + pageSize);
588
+ }, [sortedData, currentPage, pageSize]);
589
+ const handleSort = (key) => {
590
+ if (sortKey === key) {
591
+ if (sortDirection === "asc") {
592
+ setSortDirection("desc");
593
+ } else {
594
+ setSortKey(null);
595
+ setSortDirection("asc");
596
+ }
597
+ } else {
598
+ setSortKey(key);
599
+ setSortDirection("asc");
600
+ }
601
+ };
602
+ const toggleSelectAll = () => {
603
+ if (selectedKeys.length === paginatedData.length) {
604
+ setSelectedKeys([]);
605
+ onSelectionChange?.([]);
606
+ } else {
607
+ const allKeys = paginatedData.map(keyExtractor);
608
+ setSelectedKeys(allKeys);
609
+ onSelectionChange?.(allKeys);
610
+ }
611
+ };
612
+ const toggleSelectRow = (key) => {
613
+ const next = selectedKeys.includes(key) ? selectedKeys.filter((k) => k !== key) : [...selectedKeys, key];
614
+ setSelectedKeys(next);
615
+ onSelectionChange?.(next);
616
+ };
617
+ const exportCSV = () => {
618
+ const headers = columns.map((c) => typeof c.header === "string" ? c.header : c.key);
619
+ const rows = sortedData.map(
620
+ (row) => columns.map((c) => {
621
+ const val = c.accessor ? c.accessor(row) : row[c.key];
622
+ return `"${String(val ?? "").replace(/"/g, '""')}"`;
623
+ }).join(",")
624
+ );
625
+ const csvContent = "data:text/csv;charset=utf-8," + [headers.join(","), ...rows].join("\n");
626
+ const encodedUri = encodeURI(csvContent);
627
+ const link = document.createElement("a");
628
+ link.setAttribute("href", encodedUri);
629
+ link.setAttribute("download", `export_${Date.now()}.csv`);
630
+ document.body.appendChild(link);
631
+ link.click();
632
+ document.body.removeChild(link);
633
+ };
634
+ const isAllSelected = paginatedData.length > 0 && selectedKeys.length === paginatedData.length;
635
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("w-full space-y-4", className), children: [
636
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col sm:flex-row sm:items-center justify-between gap-4", children: [
637
+ (title || description) && /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
638
+ title && /* @__PURE__ */ jsxRuntime.jsx("h3", { className: "text-base font-bold tracking-tight text-[var(--ui-text-primary)]", children: title }),
639
+ description && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs text-[var(--ui-text-muted)]", children: description })
640
+ ] }),
641
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-wrap items-center gap-2.5", children: [
642
+ searchable && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative w-full sm:w-64", children: [
643
+ /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Search, { className: "absolute left-3 w-3.5 h-3.5 text-[var(--ui-text-muted)] pointer-events-none" }),
644
+ /* @__PURE__ */ jsxRuntime.jsx(
645
+ "input",
646
+ {
647
+ type: "text",
648
+ placeholder: searchPlaceholder,
649
+ value: search,
650
+ onChange: (e) => {
651
+ setSearch(e.target.value);
652
+ setCurrentPage(1);
653
+ },
654
+ className: "w-full h-8 pl-8 pr-3 text-xs rounded-xl bg-[var(--ui-bg-surface)] border border-[var(--ui-border-default)] hover:border-[var(--ui-border-strong)] focus:outline-none focus:ring-2 focus:ring-[var(--ui-primary)]/40 text-[var(--ui-text-primary)] placeholder:text-[var(--ui-text-muted)] transition-all shadow-inner"
655
+ }
656
+ )
657
+ ] }),
658
+ /* @__PURE__ */ jsxRuntime.jsx(Button, { size: "xs", variant: "outline", leftIcon: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Download, { className: "w-3 h-3" }), onClick: exportCSV, children: "Export CSV" }),
659
+ actions
660
+ ] })
661
+ ] }),
662
+ selectedKeys.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "px-4 py-2 rounded-xl bg-[var(--ui-primary)]/15 border border-[var(--ui-primary)]/30 flex items-center justify-between animate-in fade-in duration-200", children: [
663
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center gap-2 text-xs font-semibold text-[var(--ui-primary)]", children: /* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
664
+ "Selected ",
665
+ selectedKeys.length,
666
+ " of ",
667
+ sortedData.length,
668
+ " records"
669
+ ] }) }),
670
+ /* @__PURE__ */ jsxRuntime.jsx(
671
+ Button,
672
+ {
673
+ size: "xs",
674
+ variant: "ghost",
675
+ className: "text-xs text-rose-500 hover:text-rose-600 hover:bg-rose-500/10",
676
+ onClick: () => {
677
+ setSelectedKeys([]);
678
+ onSelectionChange?.([]);
679
+ },
680
+ children: "Clear Selection"
681
+ }
682
+ )
683
+ ] }),
684
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "relative w-full overflow-x-auto rounded-2xl border border-[var(--ui-border-default)] bg-[var(--ui-bg-surface)] shadow-sm", children: /* @__PURE__ */ jsxRuntime.jsxs(Table, { children: [
685
+ /* @__PURE__ */ jsxRuntime.jsx(TableHeader, { children: /* @__PURE__ */ jsxRuntime.jsxs(TableRow, { children: [
686
+ selectable && /* @__PURE__ */ jsxRuntime.jsx(TableHead, { className: "w-10 px-4", children: /* @__PURE__ */ jsxRuntime.jsx(
687
+ "input",
688
+ {
689
+ type: "checkbox",
690
+ checked: isAllSelected,
691
+ onChange: toggleSelectAll,
692
+ className: "rounded border-[var(--ui-border-default)] text-[var(--ui-primary)] focus:ring-[var(--ui-primary)] cursor-pointer"
693
+ }
694
+ ) }),
695
+ columns.map((col) => /* @__PURE__ */ jsxRuntime.jsx(
696
+ TableHead,
697
+ {
698
+ style: { width: col.width },
699
+ onClick: () => col.sortable !== false && handleSort(col.key),
700
+ className: cn(
701
+ col.sortable !== false && "cursor-pointer select-none hover:text-[var(--ui-text-primary)] transition-colors"
702
+ ),
703
+ children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-1.5", children: [
704
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: col.header }),
705
+ col.sortable !== false && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-[var(--ui-text-muted)]", children: sortKey === col.key ? sortDirection === "asc" ? /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronUp, { className: "w-3.5 h-3.5 text-[var(--ui-primary)] font-bold" }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronDown, { className: "w-3.5 h-3.5 text-[var(--ui-primary)] font-bold" }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronsUpDown, { className: "w-3 h-3 opacity-40" }) })
706
+ ] })
707
+ },
708
+ col.key
709
+ ))
710
+ ] }) }),
711
+ /* @__PURE__ */ jsxRuntime.jsx(TableBody, { children: paginatedData.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx(TableRow, { children: /* @__PURE__ */ jsxRuntime.jsx(TableCell, { colSpan: columns.length + (selectable ? 1 : 0), className: "h-32 text-center text-xs text-[var(--ui-text-muted)]", children: "No matching records found." }) }) : paginatedData.map((row, rowIdx) => {
712
+ const key = keyExtractor(row);
713
+ const isSelected = selectedKeys.includes(key);
714
+ return /* @__PURE__ */ jsxRuntime.jsxs(
715
+ TableRow,
716
+ {
717
+ "data-state": isSelected ? "selected" : void 0,
718
+ className: cn(isSelected && "bg-[var(--ui-primary)]/10"),
719
+ children: [
720
+ selectable && /* @__PURE__ */ jsxRuntime.jsx(TableCell, { className: "w-10 px-4", children: /* @__PURE__ */ jsxRuntime.jsx(
721
+ "input",
722
+ {
723
+ type: "checkbox",
724
+ checked: isSelected,
725
+ onChange: () => toggleSelectRow(key),
726
+ className: "rounded border-[var(--ui-border-default)] text-[var(--ui-primary)] focus:ring-[var(--ui-primary)] cursor-pointer"
727
+ }
728
+ ) }),
729
+ columns.map((col) => {
730
+ const cellContent = col.render ? col.render(row, rowIdx) : col.accessor ? col.accessor(row) : row[col.key];
731
+ return /* @__PURE__ */ jsxRuntime.jsx(TableCell, { children: cellContent }, col.key);
732
+ })
733
+ ]
734
+ },
735
+ key
736
+ );
737
+ }) })
738
+ ] }) }),
739
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col sm:flex-row sm:items-center justify-between gap-3 px-1 text-xs text-[var(--ui-text-muted)] font-mono", children: [
740
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
741
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: "Rows per page:" }),
742
+ /* @__PURE__ */ jsxRuntime.jsx(
743
+ "select",
744
+ {
745
+ value: pageSize,
746
+ onChange: (e) => {
747
+ setPageSize(Number(e.target.value));
748
+ setCurrentPage(1);
749
+ },
750
+ className: "px-2 py-1 rounded-lg bg-[var(--ui-bg-surface)] border border-[var(--ui-border-default)] text-[var(--ui-text-primary)] font-mono text-xs focus:outline-none",
751
+ children: pageSizeOptions.map((opt) => /* @__PURE__ */ jsxRuntime.jsx("option", { value: opt, children: opt }, opt))
752
+ }
753
+ ),
754
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-[var(--ui-text-muted)]", children: [
755
+ "Showing ",
756
+ Math.min((currentPage - 1) * pageSize + 1, sortedData.length),
757
+ "\u2013",
758
+ Math.min(currentPage * pageSize, sortedData.length),
759
+ " of ",
760
+ sortedData.length
761
+ ] })
762
+ ] }),
763
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-1.5", children: [
764
+ /* @__PURE__ */ jsxRuntime.jsx(
765
+ Button,
766
+ {
767
+ size: "xs",
768
+ variant: "outline",
769
+ disabled: currentPage === 1,
770
+ onClick: () => setCurrentPage((p) => Math.max(1, p - 1)),
771
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronLeft, { className: "w-3.5 h-3.5" })
772
+ }
773
+ ),
774
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "px-2 font-bold text-[var(--ui-text-primary)]", children: [
775
+ currentPage,
776
+ " / ",
777
+ totalPages
778
+ ] }),
779
+ /* @__PURE__ */ jsxRuntime.jsx(
780
+ Button,
781
+ {
782
+ size: "xs",
783
+ variant: "outline",
784
+ disabled: currentPage === totalPages,
785
+ onClick: () => setCurrentPage((p) => Math.min(totalPages, p + 1)),
786
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronRight, { className: "w-3.5 h-3.5" })
787
+ }
788
+ )
789
+ ] })
790
+ ] })
791
+ ] });
792
+ }
793
+ function TreeNode({ item, level, selectedId, onSelect }) {
794
+ const [isExpanded, setIsExpanded] = React11.useState(Boolean(item.defaultExpanded));
795
+ const hasChildren = Boolean(item.children && item.children.length > 0);
796
+ const isSelected = selectedId === item.id;
797
+ const handleClick = (e) => {
798
+ e.stopPropagation();
799
+ if (hasChildren) {
800
+ setIsExpanded(!isExpanded);
801
+ }
802
+ onSelect?.(item);
803
+ };
804
+ const getIcon = () => {
805
+ if (item.icon) return item.icon;
806
+ if (hasChildren) {
807
+ return isExpanded ? /* @__PURE__ */ jsxRuntime.jsx(lucideReact.FolderOpen, { className: "w-4 h-4 text-amber-500 shrink-0" }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Folder, { className: "w-4 h-4 text-amber-500 shrink-0" });
808
+ }
809
+ if (item.label.endsWith(".tsx") || item.label.endsWith(".ts") || item.label.endsWith(".js")) {
810
+ return /* @__PURE__ */ jsxRuntime.jsx(lucideReact.FileCode, { className: "w-4 h-4 text-blue-500 shrink-0" });
811
+ }
812
+ if (item.label.endsWith(".png") || item.label.endsWith(".jpg") || item.label.endsWith(".svg")) {
813
+ return /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Image, { className: "w-4 h-4 text-purple-500 shrink-0" });
814
+ }
815
+ return /* @__PURE__ */ jsxRuntime.jsx(lucideReact.FileText, { className: "w-4 h-4 text-[var(--ui-text-muted)] shrink-0" });
816
+ };
817
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "select-none text-xs", children: [
818
+ /* @__PURE__ */ jsxRuntime.jsxs(
819
+ "div",
820
+ {
821
+ onClick: handleClick,
822
+ style: { paddingLeft: `${level * 16 + 8}px` },
823
+ className: cn(
824
+ "flex items-center justify-between py-1.5 pr-2.5 rounded-xl cursor-pointer transition-colors group",
825
+ isSelected ? "bg-[var(--ui-primary)] text-white font-semibold shadow-xs" : "text-[var(--ui-text-primary)] hover:bg-[var(--ui-bg-tertiary)]"
826
+ ),
827
+ children: [
828
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2 truncate", children: [
829
+ hasChildren ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: cn("p-0.5 rounded transition-transform duration-200", isExpanded && "rotate-90"), children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronRight, { className: cn("w-3 h-3", isSelected ? "text-white" : "text-[var(--ui-text-muted)]") }) }) : /* @__PURE__ */ jsxRuntime.jsx("span", { className: "w-4" }),
830
+ getIcon(),
831
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "truncate", children: item.label })
832
+ ] }),
833
+ item.badge !== void 0 && /* @__PURE__ */ jsxRuntime.jsx(
834
+ "span",
835
+ {
836
+ className: cn(
837
+ "px-1.5 py-0.5 rounded-md text-[10px] font-mono",
838
+ isSelected ? "bg-white/20 text-white" : "bg-[var(--ui-bg-secondary)] text-[var(--ui-text-muted)]"
839
+ ),
840
+ children: item.badge
841
+ }
842
+ )
843
+ ]
844
+ }
845
+ ),
846
+ hasChildren && isExpanded && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative space-y-0.5 animate-in fade-in duration-150", children: [
847
+ /* @__PURE__ */ jsxRuntime.jsx(
848
+ "div",
849
+ {
850
+ className: "absolute left-[15px] top-0 bottom-0 w-[1px] bg-[var(--ui-border-subtle)]",
851
+ style: { left: `${level * 16 + 15}px` }
852
+ }
853
+ ),
854
+ item.children.map((child) => /* @__PURE__ */ jsxRuntime.jsx(
855
+ TreeNode,
856
+ {
857
+ item: child,
858
+ level: level + 1,
859
+ selectedId,
860
+ onSelect
861
+ },
862
+ child.id
863
+ ))
864
+ ] })
865
+ ] });
866
+ }
867
+ var TreeView = React11.forwardRef(
868
+ ({ data, selectedId, onSelect, className }, ref) => {
869
+ return /* @__PURE__ */ jsxRuntime.jsx(
870
+ "div",
871
+ {
872
+ ref,
873
+ className: cn(
874
+ "w-full p-2 rounded-2xl bg-[var(--ui-bg-surface)] border border-[var(--ui-border-default)] space-y-0.5 shadow-sm overflow-hidden",
875
+ className
876
+ ),
877
+ children: data.map((item) => /* @__PURE__ */ jsxRuntime.jsx(
878
+ TreeNode,
879
+ {
880
+ item,
881
+ level: 0,
882
+ selectedId,
883
+ onSelect
884
+ },
885
+ item.id
886
+ ))
887
+ }
888
+ );
889
+ }
890
+ );
891
+ TreeView.displayName = "TreeView";
892
+ var Carousel = React11.forwardRef(
893
+ ({
894
+ autoplay = false,
895
+ autoplayInterval = 4e3,
896
+ loop = true,
897
+ showArrows = true,
898
+ showDots = true,
899
+ children,
900
+ className,
901
+ ...props
902
+ }, ref) => {
903
+ const [currentIndex, setCurrentIndex] = React11.useState(0);
904
+ const totalSlides = React11__default.default.Children.count(children);
905
+ const timerRef = React11.useRef(null);
906
+ const nextSlide = () => {
907
+ setCurrentIndex((prev) => {
908
+ if (prev === totalSlides - 1) {
909
+ return loop ? 0 : prev;
910
+ }
911
+ return prev + 1;
912
+ });
913
+ };
914
+ const prevSlide = () => {
915
+ setCurrentIndex((prev) => {
916
+ if (prev === 0) {
917
+ return loop ? totalSlides - 1 : prev;
918
+ }
919
+ return prev - 1;
920
+ });
921
+ };
922
+ React11.useEffect(() => {
923
+ if (autoplay && totalSlides > 1) {
924
+ timerRef.current = setInterval(nextSlide, autoplayInterval);
925
+ return () => clearInterval(timerRef.current);
926
+ }
927
+ }, [autoplay, autoplayInterval, totalSlides, currentIndex]);
928
+ return /* @__PURE__ */ jsxRuntime.jsxs(
929
+ "div",
930
+ {
931
+ ref,
932
+ onMouseEnter: () => autoplay && clearInterval(timerRef.current),
933
+ onMouseLeave: () => {
934
+ if (autoplay && totalSlides > 1) {
935
+ timerRef.current = setInterval(nextSlide, autoplayInterval);
936
+ }
937
+ },
938
+ className: cn("relative w-full overflow-hidden rounded-3xl group", className),
939
+ ...props,
940
+ children: [
941
+ /* @__PURE__ */ jsxRuntime.jsx(
942
+ "div",
943
+ {
944
+ className: "flex transition-transform duration-500 ease-out",
945
+ style: { transform: `translateX(-${currentIndex * 100}%)` },
946
+ children: React11__default.default.Children.map(children, (child, idx) => /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-full flex-shrink-0", children: child }, idx))
947
+ }
948
+ ),
949
+ showArrows && totalSlides > 1 && /* @__PURE__ */ jsxRuntime.jsx(
950
+ "button",
951
+ {
952
+ type: "button",
953
+ onClick: prevSlide,
954
+ disabled: !loop && currentIndex === 0,
955
+ className: "absolute left-3 top-1/2 -translate-y-1/2 w-9 h-9 rounded-full bg-[var(--ui-bg-surface)]/80 hover:bg-[var(--ui-bg-surface)] backdrop-blur-xl border border-[var(--ui-border-default)] shadow-lg flex items-center justify-center text-[var(--ui-text-primary)] opacity-0 group-hover:opacity-100 transition-all disabled:opacity-0 cursor-pointer",
956
+ "aria-label": "Previous Slide",
957
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronLeft, { className: "w-5 h-5" })
958
+ }
959
+ ),
960
+ showArrows && totalSlides > 1 && /* @__PURE__ */ jsxRuntime.jsx(
961
+ "button",
962
+ {
963
+ type: "button",
964
+ onClick: nextSlide,
965
+ disabled: !loop && currentIndex === totalSlides - 1,
966
+ className: "absolute right-3 top-1/2 -translate-y-1/2 w-9 h-9 rounded-full bg-[var(--ui-bg-surface)]/80 hover:bg-[var(--ui-bg-surface)] backdrop-blur-xl border border-[var(--ui-border-default)] shadow-lg flex items-center justify-center text-[var(--ui-text-primary)] opacity-0 group-hover:opacity-100 transition-all disabled:opacity-0 cursor-pointer",
967
+ "aria-label": "Next Slide",
968
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronRight, { className: "w-5 h-5" })
969
+ }
970
+ ),
971
+ showDots && totalSlides > 1 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute bottom-4 inset-x-0 flex items-center justify-center gap-1.5 pointer-events-auto", children: Array.from({ length: totalSlides }).map((_, idx) => /* @__PURE__ */ jsxRuntime.jsx(
972
+ "button",
973
+ {
974
+ type: "button",
975
+ onClick: () => setCurrentIndex(idx),
976
+ className: cn(
977
+ "h-2 rounded-full transition-all cursor-pointer shadow-xs",
978
+ currentIndex === idx ? "w-6 bg-[var(--ui-primary)]" : "w-2 bg-white/40 dark:bg-white/30 hover:bg-white/60"
979
+ ),
980
+ "aria-label": `Go to slide ${idx + 1}`
981
+ },
982
+ idx
983
+ )) })
984
+ ]
985
+ }
986
+ );
987
+ }
988
+ );
989
+ Carousel.displayName = "Carousel";
990
+
991
+ exports.Accordion = Accordion;
992
+ exports.AccordionContent = AccordionContent;
993
+ exports.AccordionItem = AccordionItem;
994
+ exports.AccordionTrigger = AccordionTrigger;
995
+ exports.Avatar = Avatar;
996
+ exports.AvatarGroup = AvatarGroup;
997
+ exports.Card = Card;
998
+ exports.CardContent = CardContent;
999
+ exports.CardDescription = CardDescription;
1000
+ exports.CardFooter = CardFooter;
1001
+ exports.CardHeader = CardHeader;
1002
+ exports.CardTitle = CardTitle;
1003
+ exports.Carousel = Carousel;
1004
+ exports.Chip = Chip;
1005
+ exports.DataTablePro = DataTablePro;
1006
+ exports.StatCard = StatCard;
1007
+ exports.Table = Table;
1008
+ exports.TableBody = TableBody;
1009
+ exports.TableCaption = TableCaption;
1010
+ exports.TableCell = TableCell;
1011
+ exports.TableFooter = TableFooter;
1012
+ exports.TableHead = TableHead;
1013
+ exports.TableHeader = TableHeader;
1014
+ exports.TableRow = TableRow;
1015
+ exports.Timeline = Timeline;
1016
+ exports.TreeView = TreeView;
1017
+ exports.avatarVariants = avatarVariants;
1018
+ exports.cardVariants = cardVariants;
1019
+ exports.chipVariants = chipVariants;
1020
+ exports.statusVariants = statusVariants;
1021
+ exports.useAccordion = useAccordion;
1022
+ //# sourceMappingURL=index.cjs.map
1023
+ //# sourceMappingURL=index.cjs.map