@mdigital_ui/ui 0.2.5 → 0.2.7

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 (274) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +1023 -341
  3. package/dist/accordion/index.js +3 -3
  4. package/dist/avatar/index.js +4 -0
  5. package/dist/avatar/index.js.map +1 -0
  6. package/dist/badge/index.js +3 -3
  7. package/dist/breadcrumbs/index.js +5 -5
  8. package/dist/button/index.js +4 -4
  9. package/dist/button-group/index.js +2 -2
  10. package/dist/card/index.js +2 -2
  11. package/dist/carousel/index.js +2 -1
  12. package/dist/cascader/index.js +2 -2
  13. package/dist/chart/index.js +2 -2
  14. package/dist/checkbox/index.js +3 -3
  15. package/dist/checkbox-group/index.js +2 -2
  16. package/dist/chunk-27QEPVKU.js +115 -0
  17. package/dist/chunk-27QEPVKU.js.map +1 -0
  18. package/dist/{chunk-Y5A26EGR.js → chunk-2J57G7XG.js} +82 -24
  19. package/dist/chunk-2J57G7XG.js.map +1 -0
  20. package/dist/{chunk-FPOXTCYV.js → chunk-2NYVRAG4.js} +29 -20
  21. package/dist/chunk-2NYVRAG4.js.map +1 -0
  22. package/dist/chunk-2OUGJBXK.js +742 -0
  23. package/dist/chunk-2OUGJBXK.js.map +1 -0
  24. package/dist/{chunk-ROR4E6IE.js → chunk-2WZVD7P3.js} +38 -12
  25. package/dist/chunk-2WZVD7P3.js.map +1 -0
  26. package/dist/chunk-3UCZ4GMN.js +84 -0
  27. package/dist/chunk-3UCZ4GMN.js.map +1 -0
  28. package/dist/{chunk-RPAQAZTI.js → chunk-4LSKRZOT.js} +12 -7
  29. package/dist/chunk-4LSKRZOT.js.map +1 -0
  30. package/dist/{chunk-ASW7TEAN.js → chunk-4SQOFZ3N.js} +35 -18
  31. package/dist/chunk-4SQOFZ3N.js.map +1 -0
  32. package/dist/chunk-5PUATOLR.js +127 -0
  33. package/dist/chunk-5PUATOLR.js.map +1 -0
  34. package/dist/chunk-6TMOKYR7.js +75 -0
  35. package/dist/chunk-6TMOKYR7.js.map +1 -0
  36. package/dist/chunk-7UCNBMCV.js +261 -0
  37. package/dist/chunk-7UCNBMCV.js.map +1 -0
  38. package/dist/chunk-AQYOVYPS.js +237 -0
  39. package/dist/chunk-AQYOVYPS.js.map +1 -0
  40. package/dist/{chunk-BP434VYV.js → chunk-C5YO5VZS.js} +17 -17
  41. package/dist/chunk-C5YO5VZS.js.map +1 -0
  42. package/dist/{chunk-ZNJ7M5QK.js → chunk-CHGJX5F2.js} +69 -46
  43. package/dist/chunk-CHGJX5F2.js.map +1 -0
  44. package/dist/chunk-CK6A2R66.js +336 -0
  45. package/dist/chunk-CK6A2R66.js.map +1 -0
  46. package/dist/{chunk-I5ANSIDK.js → chunk-CMGCJXE5.js} +280 -100
  47. package/dist/chunk-CMGCJXE5.js.map +1 -0
  48. package/dist/chunk-CSRMVLPR.js +394 -0
  49. package/dist/chunk-CSRMVLPR.js.map +1 -0
  50. package/dist/chunk-DH7R6NBG.js +107 -0
  51. package/dist/chunk-DH7R6NBG.js.map +1 -0
  52. package/dist/{chunk-XMAH5PDW.js → chunk-FEMHXG2P.js} +28 -11
  53. package/dist/chunk-FEMHXG2P.js.map +1 -0
  54. package/dist/chunk-FIGSNRWY.js +382 -0
  55. package/dist/chunk-FIGSNRWY.js.map +1 -0
  56. package/dist/{chunk-C7SXY3ZV.js → chunk-FVTMKQUE.js} +5 -3
  57. package/dist/chunk-FVTMKQUE.js.map +1 -0
  58. package/dist/{chunk-UAMFKX6L.js → chunk-GBVIACYQ.js} +103 -42
  59. package/dist/chunk-GBVIACYQ.js.map +1 -0
  60. package/dist/chunk-H47C2ENJ.js +215 -0
  61. package/dist/chunk-H47C2ENJ.js.map +1 -0
  62. package/dist/chunk-HWFI4GJE.js +130 -0
  63. package/dist/chunk-HWFI4GJE.js.map +1 -0
  64. package/dist/chunk-IA42ELUP.js +72 -0
  65. package/dist/chunk-IA42ELUP.js.map +1 -0
  66. package/dist/{chunk-HUVXKOJC.js → chunk-INQI3UUI.js} +80 -22
  67. package/dist/chunk-INQI3UUI.js.map +1 -0
  68. package/dist/{chunk-BNILRB4T.js → chunk-J525ROGL.js} +12 -7
  69. package/dist/chunk-J525ROGL.js.map +1 -0
  70. package/dist/chunk-JLS4MBHN.js +205 -0
  71. package/dist/chunk-JLS4MBHN.js.map +1 -0
  72. package/dist/{chunk-SK5ECBBK.js → chunk-KTHWXHDN.js} +15 -6
  73. package/dist/chunk-KTHWXHDN.js.map +1 -0
  74. package/dist/{chunk-SOV4PE3P.js → chunk-LMR7TKDJ.js} +25 -7
  75. package/dist/chunk-LMR7TKDJ.js.map +1 -0
  76. package/dist/{chunk-NNSS366W.js → chunk-MRFCITKK.js} +53 -11
  77. package/dist/chunk-MRFCITKK.js.map +1 -0
  78. package/dist/chunk-MXDTUN3V.js +459 -0
  79. package/dist/chunk-MXDTUN3V.js.map +1 -0
  80. package/dist/{chunk-YNNAOXU5.js → chunk-NGYLRX6F.js} +3 -18
  81. package/dist/chunk-NGYLRX6F.js.map +1 -0
  82. package/dist/chunk-NTPWR57C.js +445 -0
  83. package/dist/chunk-NTPWR57C.js.map +1 -0
  84. package/dist/chunk-OWXQ45GS.js +276 -0
  85. package/dist/chunk-OWXQ45GS.js.map +1 -0
  86. package/dist/{chunk-75XESYGN.js → chunk-P6A75RAH.js} +7 -13
  87. package/dist/chunk-P6A75RAH.js.map +1 -0
  88. package/dist/{chunk-RMGIO27V.js → chunk-PXOHJJBE.js} +39 -10
  89. package/dist/chunk-PXOHJJBE.js.map +1 -0
  90. package/dist/{chunk-SAVE5ACL.js → chunk-Q57THXIU.js} +28 -10
  91. package/dist/chunk-Q57THXIU.js.map +1 -0
  92. package/dist/{chunk-J3G5WWGR.js → chunk-QDHGE7IF.js} +7 -15
  93. package/dist/chunk-QDHGE7IF.js.map +1 -0
  94. package/dist/{chunk-7PKVBUGL.js → chunk-QKSDVYKF.js} +4 -4
  95. package/dist/chunk-QKSDVYKF.js.map +1 -0
  96. package/dist/chunk-ROA7BYGB.js +123 -0
  97. package/dist/chunk-ROA7BYGB.js.map +1 -0
  98. package/dist/{chunk-DPOSWW22.js → chunk-RPIJ2KY7.js} +11 -4
  99. package/dist/chunk-RPIJ2KY7.js.map +1 -0
  100. package/dist/{chunk-R225A5II.js → chunk-RW4RW4DV.js} +80 -30
  101. package/dist/chunk-RW4RW4DV.js.map +1 -0
  102. package/dist/chunk-RYKVZFGB.js +607 -0
  103. package/dist/chunk-RYKVZFGB.js.map +1 -0
  104. package/dist/chunk-SAVEKACZ.js +552 -0
  105. package/dist/chunk-SAVEKACZ.js.map +1 -0
  106. package/dist/chunk-SDNT2JGC.js +143 -0
  107. package/dist/chunk-SDNT2JGC.js.map +1 -0
  108. package/dist/{chunk-DOKTHDG3.js → chunk-SGRACNBP.js} +12 -7
  109. package/dist/chunk-SGRACNBP.js.map +1 -0
  110. package/dist/{chunk-OALOWWO7.js → chunk-TTEBZZ3T.js} +55 -42
  111. package/dist/chunk-TTEBZZ3T.js.map +1 -0
  112. package/dist/{chunk-FCMVKFVV.js → chunk-US4ZCMNU.js} +26 -20
  113. package/dist/chunk-US4ZCMNU.js.map +1 -0
  114. package/dist/chunk-UUP7YGOS.js +299 -0
  115. package/dist/chunk-UUP7YGOS.js.map +1 -0
  116. package/dist/{chunk-QPJL66S7.js → chunk-VUBU7Y4F.js} +123 -55
  117. package/dist/chunk-VUBU7Y4F.js.map +1 -0
  118. package/dist/chunk-WUBMNJGC.js +141 -0
  119. package/dist/chunk-WUBMNJGC.js.map +1 -0
  120. package/dist/chunk-WVG3QQDN.js +283 -0
  121. package/dist/chunk-WVG3QQDN.js.map +1 -0
  122. package/dist/chunk-WZ2KDHFP.js +109 -0
  123. package/dist/chunk-WZ2KDHFP.js.map +1 -0
  124. package/dist/{chunk-FGWSUPVW.js → chunk-X5SCI7KH.js} +190 -137
  125. package/dist/chunk-X5SCI7KH.js.map +1 -0
  126. package/dist/{chunk-D3JWPGCA.js → chunk-XJCWPPMM.js} +10 -56
  127. package/dist/chunk-XJCWPPMM.js.map +1 -0
  128. package/dist/{chunk-LEKLQR4I.js → chunk-YAAV7FQG.js} +70 -45
  129. package/dist/chunk-YAAV7FQG.js.map +1 -0
  130. package/dist/chunk-YOG5GXIC.js +196 -0
  131. package/dist/chunk-YOG5GXIC.js.map +1 -0
  132. package/dist/chunk-Z5VJ6MJP.js +234 -0
  133. package/dist/chunk-Z5VJ6MJP.js.map +1 -0
  134. package/dist/{chunk-267WNY3E.js → chunk-ZC3E3PWH.js} +109 -73
  135. package/dist/chunk-ZC3E3PWH.js.map +1 -0
  136. package/dist/clipboard/index.js +2 -2
  137. package/dist/collapse/index.js +2 -2
  138. package/dist/command/index.js +3 -3
  139. package/dist/context-menu/index.js +4 -0
  140. package/dist/context-menu/index.js.map +1 -0
  141. package/dist/date-picker/index.js +4 -3
  142. package/dist/descriptions/index.js +2 -2
  143. package/dist/divider/index.js +4 -0
  144. package/dist/divider/index.js.map +1 -0
  145. package/dist/drawer/index.js +2 -2
  146. package/dist/dropdown/index.js +4 -3
  147. package/dist/empty/index.js +2 -2
  148. package/dist/fetching-overlay/index.js +4 -3
  149. package/dist/grid/index.js +2 -2
  150. package/dist/image/index.js +2 -2
  151. package/dist/index.d.ts +2494 -211
  152. package/dist/index.js +63 -186
  153. package/dist/index.js.map +1 -1
  154. package/dist/input/index.js +4 -3
  155. package/dist/input-group/index.js +2 -2
  156. package/dist/input-otp/index.js +2 -2
  157. package/dist/input-password/index.js +5 -4
  158. package/dist/kbd/index.js +3 -2
  159. package/dist/modal/index.js +2 -2
  160. package/dist/multi-select/index.js +4 -3
  161. package/dist/notification/index.js +3 -2
  162. package/dist/pagination/index.js +2 -2
  163. package/dist/popover/index.js +3 -2
  164. package/dist/progress/index.js +2 -2
  165. package/dist/radio/index.js +3 -2
  166. package/dist/radio-group/index.js +2 -2
  167. package/dist/rating/index.js +2 -2
  168. package/dist/ribbon/index.js +2 -2
  169. package/dist/select/index.js +5 -4
  170. package/dist/skeleton/index.js +3 -2
  171. package/dist/slider/index.js +2 -2
  172. package/dist/spinner/index.js +3 -2
  173. package/dist/stepper/index.js +2 -2
  174. package/dist/styles/base.css +2165 -1375
  175. package/dist/styles/global.css +2393 -1036
  176. package/dist/styles/themes/dark.css +3 -1
  177. package/dist/styles/themes/light.css +3 -1
  178. package/dist/styles/themes/presets/corporate.css +126 -0
  179. package/dist/styles/themes/presets/minimal.css +126 -0
  180. package/dist/styles/themes/presets/vibrant.css +126 -0
  181. package/dist/switch/index.js +3 -2
  182. package/dist/table/index.js +10 -10
  183. package/dist/tabs/index.js +3 -3
  184. package/dist/tag/index.js +5 -0
  185. package/dist/tag/index.js.map +1 -0
  186. package/dist/textarea/index.js +2 -2
  187. package/dist/theme/index.js +3 -0
  188. package/dist/theme/index.js.map +1 -0
  189. package/dist/toggle/index.js +2 -2
  190. package/dist/toggle-group/index.js +2 -2
  191. package/dist/tooltip/index.js +3 -2
  192. package/dist/transfer/index.js +4 -4
  193. package/dist/tree/index.js +2 -2
  194. package/dist/tree-select/index.js +5 -4
  195. package/dist/upload/index.js +2 -2
  196. package/package.json +460 -70
  197. package/dist/chunk-267WNY3E.js.map +0 -1
  198. package/dist/chunk-2EKAF6EJ.js +0 -128
  199. package/dist/chunk-2EKAF6EJ.js.map +0 -1
  200. package/dist/chunk-3PFA3YG6.js +0 -228
  201. package/dist/chunk-3PFA3YG6.js.map +0 -1
  202. package/dist/chunk-56IXGP5C.js +0 -56
  203. package/dist/chunk-56IXGP5C.js.map +0 -1
  204. package/dist/chunk-5UEWVFF6.js +0 -212
  205. package/dist/chunk-5UEWVFF6.js.map +0 -1
  206. package/dist/chunk-6V5I5HJ2.js +0 -39
  207. package/dist/chunk-6V5I5HJ2.js.map +0 -1
  208. package/dist/chunk-75XESYGN.js.map +0 -1
  209. package/dist/chunk-7PKVBUGL.js.map +0 -1
  210. package/dist/chunk-ASW7TEAN.js.map +0 -1
  211. package/dist/chunk-AWPKZYHT.js +0 -152
  212. package/dist/chunk-AWPKZYHT.js.map +0 -1
  213. package/dist/chunk-BFO3ARVJ.js +0 -104
  214. package/dist/chunk-BFO3ARVJ.js.map +0 -1
  215. package/dist/chunk-BNILRB4T.js.map +0 -1
  216. package/dist/chunk-BP434VYV.js.map +0 -1
  217. package/dist/chunk-C3MX5EXL.js +0 -95
  218. package/dist/chunk-C3MX5EXL.js.map +0 -1
  219. package/dist/chunk-C7SXY3ZV.js.map +0 -1
  220. package/dist/chunk-D3JWPGCA.js.map +0 -1
  221. package/dist/chunk-DOKTHDG3.js.map +0 -1
  222. package/dist/chunk-DPOSWW22.js.map +0 -1
  223. package/dist/chunk-FCMVKFVV.js.map +0 -1
  224. package/dist/chunk-FGWSUPVW.js.map +0 -1
  225. package/dist/chunk-FPOXTCYV.js.map +0 -1
  226. package/dist/chunk-FYHQDFKE.js +0 -164
  227. package/dist/chunk-FYHQDFKE.js.map +0 -1
  228. package/dist/chunk-G6TAVRTJ.js +0 -640
  229. package/dist/chunk-G6TAVRTJ.js.map +0 -1
  230. package/dist/chunk-GEWR5ROK.js +0 -102
  231. package/dist/chunk-GEWR5ROK.js.map +0 -1
  232. package/dist/chunk-HUVXKOJC.js.map +0 -1
  233. package/dist/chunk-I5ANSIDK.js.map +0 -1
  234. package/dist/chunk-J3G5WWGR.js.map +0 -1
  235. package/dist/chunk-JLTDJ3VZ.js +0 -452
  236. package/dist/chunk-JLTDJ3VZ.js.map +0 -1
  237. package/dist/chunk-KBCBVH7B.js +0 -51
  238. package/dist/chunk-KBCBVH7B.js.map +0 -1
  239. package/dist/chunk-KNQ7UQ2W.js +0 -143
  240. package/dist/chunk-KNQ7UQ2W.js.map +0 -1
  241. package/dist/chunk-KTAIRCOL.js +0 -100
  242. package/dist/chunk-KTAIRCOL.js.map +0 -1
  243. package/dist/chunk-LEKLQR4I.js.map +0 -1
  244. package/dist/chunk-MLDX3Z67.js +0 -470
  245. package/dist/chunk-MLDX3Z67.js.map +0 -1
  246. package/dist/chunk-NNSS366W.js.map +0 -1
  247. package/dist/chunk-OALOWWO7.js.map +0 -1
  248. package/dist/chunk-OOS3B7YZ.js +0 -94
  249. package/dist/chunk-OOS3B7YZ.js.map +0 -1
  250. package/dist/chunk-OQANRZPV.js +0 -197
  251. package/dist/chunk-OQANRZPV.js.map +0 -1
  252. package/dist/chunk-OW5A5IIF.js +0 -175
  253. package/dist/chunk-OW5A5IIF.js.map +0 -1
  254. package/dist/chunk-QPJL66S7.js.map +0 -1
  255. package/dist/chunk-R225A5II.js.map +0 -1
  256. package/dist/chunk-RMGIO27V.js.map +0 -1
  257. package/dist/chunk-ROR4E6IE.js.map +0 -1
  258. package/dist/chunk-RPAQAZTI.js.map +0 -1
  259. package/dist/chunk-S5XJXU52.js +0 -178
  260. package/dist/chunk-S5XJXU52.js.map +0 -1
  261. package/dist/chunk-SAVE5ACL.js.map +0 -1
  262. package/dist/chunk-SK5ECBBK.js.map +0 -1
  263. package/dist/chunk-SOV4PE3P.js.map +0 -1
  264. package/dist/chunk-UAMFKX6L.js.map +0 -1
  265. package/dist/chunk-XMAH5PDW.js.map +0 -1
  266. package/dist/chunk-XMKNYG7I.js +0 -181
  267. package/dist/chunk-XMKNYG7I.js.map +0 -1
  268. package/dist/chunk-Y5A26EGR.js.map +0 -1
  269. package/dist/chunk-YNNAOXU5.js.map +0 -1
  270. package/dist/chunk-YZ6V6BQ7.js +0 -134
  271. package/dist/chunk-YZ6V6BQ7.js.map +0 -1
  272. package/dist/chunk-YZVSDRJD.js +0 -253
  273. package/dist/chunk-YZVSDRJD.js.map +0 -1
  274. package/dist/chunk-ZNJ7M5QK.js.map +0 -1
@@ -0,0 +1,276 @@
1
+ import { componentColors } from './chunk-NTPWR57C.js';
2
+ import { cn } from './chunk-NGYLRX6F.js';
3
+ import { cva } from 'class-variance-authority';
4
+ import React, { useState, useRef, useId, useCallback } from 'react';
5
+ import { jsxs, jsx } from 'react/jsx-runtime';
6
+
7
+ var pillActiveClasses = {
8
+ default: "bg-background text-text-primary",
9
+ primary: "bg-primary text-white",
10
+ secondary: "bg-secondary text-white",
11
+ accent: "bg-accent text-white",
12
+ success: "bg-success text-white",
13
+ error: "bg-error text-white",
14
+ warning: "bg-warning text-white",
15
+ info: "bg-info text-white"
16
+ };
17
+ var defaultActiveClasses = {
18
+ default: "border-border text-text-primary",
19
+ primary: "border-primary text-primary",
20
+ secondary: "border-secondary text-secondary",
21
+ accent: "border-accent text-accent",
22
+ success: "border-success text-success",
23
+ error: "border-error text-error",
24
+ warning: "border-warning text-warning",
25
+ info: "border-info text-info"
26
+ };
27
+ var softActiveClasses = {
28
+ default: "border-border/50 text-text-primary",
29
+ primary: "border-primary/50 text-primary",
30
+ secondary: "border-secondary/50 text-secondary",
31
+ accent: "border-accent/50 text-accent",
32
+ success: "border-success/50 text-success",
33
+ error: "border-error/50 text-error",
34
+ warning: "border-warning/50 text-warning",
35
+ info: "border-info/50 text-info"
36
+ };
37
+ var createActiveTabVariants = (variant, classMap) => {
38
+ return componentColors.map((color) => ({
39
+ variant,
40
+ color,
41
+ active: true,
42
+ className: classMap[color] || classMap.default
43
+ }));
44
+ };
45
+ var tabListVariants = cva("flex", {
46
+ variants: {
47
+ size: {
48
+ xs: "gap-(--tabs-gap-xs)",
49
+ sm: "gap-(--tabs-gap-sm)",
50
+ md: "gap-(--tabs-gap-md)",
51
+ lg: "gap-(--tabs-gap-lg)"
52
+ },
53
+ variant: {
54
+ default: "border-b",
55
+ solid: "border-b",
56
+ soft: "border-b",
57
+ pill: "bg-surface p-0.5 rounded-lg border border-border gap-0 w-fit"
58
+ }
59
+ },
60
+ defaultVariants: {
61
+ size: "md",
62
+ variant: "default"
63
+ }
64
+ });
65
+ var tabItemVariants = cva(
66
+ "font-medium transition-all duration-200 ease-out cursor-pointer flex items-center gap-2",
67
+ {
68
+ variants: {
69
+ size: {
70
+ xs: "text-xs px-(--tabs-padding-x-xs) py-(--tabs-padding-y-xs)",
71
+ sm: "text-sm px-(--tabs-padding-x-sm) py-(--tabs-padding-y-sm)",
72
+ md: "text-base px-(--tabs-padding-x-md) py-(--tabs-padding-y-md)",
73
+ lg: "text-lg px-(--tabs-padding-x-lg) py-(--tabs-padding-y-lg)"
74
+ },
75
+ variant: {
76
+ default: "relative pb-2 border-b-2 -mb-px",
77
+ solid: "relative pb-2 border-b-2 -mb-px",
78
+ soft: "relative pb-2 border-b-2 -mb-px",
79
+ pill: "rounded-md"
80
+ },
81
+ color: {
82
+ default: "",
83
+ primary: "",
84
+ secondary: "",
85
+ accent: "",
86
+ success: "",
87
+ error: "",
88
+ warning: "",
89
+ info: ""
90
+ },
91
+ active: {
92
+ true: "",
93
+ false: ""
94
+ }
95
+ },
96
+ compoundVariants: [
97
+ // Inactive states (all variants)
98
+ ...componentColors.map((color) => ({
99
+ color,
100
+ active: false,
101
+ className: "border-transparent text-text-secondary hover:text-text-primary hover:border-border/30"
102
+ })),
103
+ // Active pill variant
104
+ ...createActiveTabVariants("pill", pillActiveClasses),
105
+ // Active default variant (border-bottom)
106
+ ...createActiveTabVariants("default", defaultActiveClasses),
107
+ // Active solid variant (border-bottom)
108
+ ...createActiveTabVariants("solid", defaultActiveClasses),
109
+ // Active soft variant (border-bottom with opacity)
110
+ ...createActiveTabVariants("soft", softActiveClasses),
111
+ // Inactive pill variant hover
112
+ ...componentColors.map((color) => ({
113
+ variant: "pill",
114
+ color,
115
+ active: false,
116
+ className: "bg-transparent hover:bg-background"
117
+ }))
118
+ ],
119
+ defaultVariants: {
120
+ size: "md",
121
+ variant: "default",
122
+ color: "primary",
123
+ active: false
124
+ }
125
+ }
126
+ );
127
+ var Tabs = React.memo(
128
+ ({
129
+ items,
130
+ defaultActiveKey,
131
+ activeKey: controlledActiveKey,
132
+ color = "primary",
133
+ size = "md",
134
+ variant = "default",
135
+ onChange,
136
+ className,
137
+ classNames
138
+ }) => {
139
+ const [internalActiveKey, setInternalActiveKey] = useState(
140
+ defaultActiveKey || items[0]?.key || ""
141
+ );
142
+ const tabListRef = useRef(null);
143
+ const uniqueId = useId();
144
+ const activeKey = controlledActiveKey !== void 0 ? controlledActiveKey : internalActiveKey;
145
+ const handleTabClick = useCallback(
146
+ (key, disabled) => {
147
+ if (disabled) return;
148
+ if (controlledActiveKey === void 0) {
149
+ setInternalActiveKey(key);
150
+ }
151
+ onChange?.(key);
152
+ },
153
+ [controlledActiveKey, onChange]
154
+ );
155
+ const handleKeyDown = useCallback(
156
+ (event, currentIndex) => {
157
+ const enabledIndices = items.map((item, i) => !item.disabled ? i : -1).filter((i) => i !== -1);
158
+ const currentEnabledIndex = enabledIndices.indexOf(currentIndex);
159
+ let newIndex;
160
+ switch (event.key) {
161
+ case "ArrowLeft":
162
+ case "ArrowUp":
163
+ event.preventDefault();
164
+ newIndex = enabledIndices[currentEnabledIndex > 0 ? currentEnabledIndex - 1 : enabledIndices.length - 1];
165
+ break;
166
+ case "ArrowRight":
167
+ case "ArrowDown":
168
+ event.preventDefault();
169
+ newIndex = enabledIndices[currentEnabledIndex < enabledIndices.length - 1 ? currentEnabledIndex + 1 : 0];
170
+ break;
171
+ case "Home":
172
+ event.preventDefault();
173
+ newIndex = enabledIndices[0];
174
+ break;
175
+ case "End":
176
+ event.preventDefault();
177
+ newIndex = enabledIndices[enabledIndices.length - 1];
178
+ break;
179
+ }
180
+ if (newIndex !== void 0) {
181
+ const newItem = items[newIndex];
182
+ if (newItem) {
183
+ handleTabClick(newItem.key);
184
+ const buttons = tabListRef.current?.querySelectorAll("button");
185
+ buttons?.[newIndex]?.focus();
186
+ }
187
+ }
188
+ },
189
+ [items, handleTabClick]
190
+ );
191
+ const activeItem = items.find((item) => item.key === activeKey);
192
+ return /* @__PURE__ */ jsxs(
193
+ "div",
194
+ {
195
+ "data-slot": "tabs_root",
196
+ className: cn("tabs_root w-full", classNames?.root, className),
197
+ children: [
198
+ /* @__PURE__ */ jsx(
199
+ "div",
200
+ {
201
+ ref: tabListRef,
202
+ role: "tablist",
203
+ "aria-orientation": "horizontal",
204
+ "data-slot": "tabs_list",
205
+ className: cn(
206
+ "tabs_list",
207
+ tabListVariants({ size, variant }),
208
+ variant !== "pill" && "border-border",
209
+ classNames?.list
210
+ ),
211
+ children: items.map((item, index) => {
212
+ const isActive = item.key === activeKey;
213
+ const tabId = `tab-${uniqueId}-${item.key}`;
214
+ const panelId = `panel-${uniqueId}-${item.key}`;
215
+ return /* @__PURE__ */ jsxs(
216
+ "button",
217
+ {
218
+ id: tabId,
219
+ role: "tab",
220
+ type: "button",
221
+ "aria-selected": isActive,
222
+ "aria-controls": panelId,
223
+ tabIndex: isActive ? 0 : -1,
224
+ "data-slot": "tabs_tab",
225
+ className: cn(
226
+ "tabs_tab",
227
+ tabItemVariants({
228
+ size,
229
+ variant,
230
+ color,
231
+ active: isActive
232
+ }),
233
+ item.disabled && "opacity-50 cursor-not-allowed",
234
+ classNames?.tab,
235
+ isActive && classNames?.tabActive
236
+ ),
237
+ onClick: () => handleTabClick(item.key, item.disabled),
238
+ onKeyDown: (e) => handleKeyDown(e, index),
239
+ disabled: item.disabled,
240
+ children: [
241
+ item.icon && /* @__PURE__ */ jsx("span", { "aria-hidden": "true", children: item.icon }),
242
+ item.label
243
+ ]
244
+ },
245
+ item.key
246
+ );
247
+ })
248
+ }
249
+ ),
250
+ activeItem?.content && /* @__PURE__ */ jsx(
251
+ "div",
252
+ {
253
+ id: `panel-${uniqueId}-${activeItem.key}`,
254
+ role: "tabpanel",
255
+ "aria-labelledby": `tab-${uniqueId}-${activeItem.key}`,
256
+ tabIndex: 0,
257
+ "data-slot": "tabs_panel",
258
+ className: cn(
259
+ "tabs_panel",
260
+ "py-4 animate-in fade-in slide-in-from-bottom-2 duration-300",
261
+ classNames?.panel
262
+ ),
263
+ children: activeItem?.content
264
+ }
265
+ )
266
+ ]
267
+ }
268
+ );
269
+ }
270
+ );
271
+ Tabs.displayName = "Tabs";
272
+ var tabs_default = Tabs;
273
+
274
+ export { tabs_default };
275
+ //# sourceMappingURL=chunk-OWXQ45GS.js.map
276
+ //# sourceMappingURL=chunk-OWXQ45GS.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/tabs/index.tsx"],"names":[],"mappings":"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","file":"chunk-OWXQ45GS.js","sourcesContent":["\"use client\";\n\nimport { cva } from \"class-variance-authority\";\nimport React, { useState, useId, useCallback, useRef } from \"react\";\n\nimport { cn } from \"../utils\";\nimport { componentColors } from \"../variants\";\nimport type { TabsColor, TabsProps, TabsVariant } from \"./types\";\n\n// Static class mappings for Tailwind JIT compatibility\nconst pillActiveClasses: Record<string, string> = {\n default: \"bg-background text-text-primary\",\n primary: \"bg-primary text-white\",\n secondary: \"bg-secondary text-white\",\n accent: \"bg-accent text-white\",\n success: \"bg-success text-white\",\n error: \"bg-error text-white\",\n warning: \"bg-warning text-white\",\n info: \"bg-info text-white\",\n};\n\nconst defaultActiveClasses: Record<string, string> = {\n default: \"border-border text-text-primary\",\n primary: \"border-primary text-primary\",\n secondary: \"border-secondary text-secondary\",\n accent: \"border-accent text-accent\",\n success: \"border-success text-success\",\n error: \"border-error text-error\",\n warning: \"border-warning text-warning\",\n info: \"border-info text-info\",\n};\n\nconst softActiveClasses: Record<string, string> = {\n default: \"border-border/50 text-text-primary\",\n primary: \"border-primary/50 text-primary\",\n secondary: \"border-secondary/50 text-secondary\",\n accent: \"border-accent/50 text-accent\",\n success: \"border-success/50 text-success\",\n error: \"border-error/50 text-error\",\n warning: \"border-warning/50 text-warning\",\n info: \"border-info/50 text-info\",\n};\n\n// Tab-specific variant generators for DRY\nconst createActiveTabVariants = (\n variant: TabsVariant,\n classMap: Record<string, string>,\n) => {\n return componentColors.map((color) => ({\n variant,\n color: color as TabsColor,\n active: true as const,\n className: classMap[color] || classMap.default,\n }));\n};\n\nconst tabListVariants = cva(\"flex\", {\n variants: {\n size: {\n xs: \"gap-(--tabs-gap-xs)\",\n sm: \"gap-(--tabs-gap-sm)\",\n md: \"gap-(--tabs-gap-md)\",\n lg: \"gap-(--tabs-gap-lg)\",\n },\n variant: {\n default: \"border-b\",\n solid: \"border-b\",\n soft: \"border-b\",\n pill: \"bg-surface p-0.5 rounded-lg border border-border gap-0 w-fit\",\n },\n },\n defaultVariants: {\n size: \"md\",\n variant: \"default\",\n },\n});\n\nconst tabItemVariants = cva(\n \"font-medium transition-all duration-200 ease-out cursor-pointer flex items-center gap-2\",\n {\n variants: {\n size: {\n xs: \"text-xs px-(--tabs-padding-x-xs) py-(--tabs-padding-y-xs)\",\n sm: \"text-sm px-(--tabs-padding-x-sm) py-(--tabs-padding-y-sm)\",\n md: \"text-base px-(--tabs-padding-x-md) py-(--tabs-padding-y-md)\",\n lg: \"text-lg px-(--tabs-padding-x-lg) py-(--tabs-padding-y-lg)\",\n },\n variant: {\n default: \"relative pb-2 border-b-2 -mb-px\",\n solid: \"relative pb-2 border-b-2 -mb-px\",\n soft: \"relative pb-2 border-b-2 -mb-px\",\n pill: \"rounded-md\",\n },\n color: {\n default: \"\",\n primary: \"\",\n secondary: \"\",\n accent: \"\",\n success: \"\",\n error: \"\",\n warning: \"\",\n info: \"\",\n },\n active: {\n true: \"\",\n false: \"\",\n },\n },\n compoundVariants: [\n // Inactive states (all variants)\n ...componentColors.map((color) => ({\n color: color as TabsColor,\n active: false as const,\n className:\n \"border-transparent text-text-secondary hover:text-text-primary hover:border-border/30\",\n })),\n\n // Active pill variant\n ...createActiveTabVariants(\"pill\", pillActiveClasses),\n\n // Active default variant (border-bottom)\n ...createActiveTabVariants(\"default\", defaultActiveClasses),\n\n // Active solid variant (border-bottom)\n ...createActiveTabVariants(\"solid\", defaultActiveClasses),\n\n // Active soft variant (border-bottom with opacity)\n ...createActiveTabVariants(\"soft\", softActiveClasses),\n\n // Inactive pill variant hover\n ...componentColors.map((color) => ({\n variant: \"pill\" as const,\n color: color as TabsColor,\n active: false as const,\n className: \"bg-transparent hover:bg-background\",\n })),\n ],\n defaultVariants: {\n size: \"md\",\n variant: \"default\",\n color: \"primary\",\n active: false,\n },\n },\n);\n\nconst Tabs = React.memo<TabsProps>(\n ({\n items,\n defaultActiveKey,\n activeKey: controlledActiveKey,\n color = \"primary\",\n size = \"md\",\n variant = \"default\",\n onChange,\n className,\n classNames,\n }) => {\n const [internalActiveKey, setInternalActiveKey] = useState(\n defaultActiveKey || items[0]?.key || \"\",\n );\n const tabListRef = useRef<HTMLDivElement>(null);\n\n // Generate unique IDs for accessibility\n const uniqueId = useId();\n\n const activeKey =\n controlledActiveKey !== undefined\n ? controlledActiveKey\n : internalActiveKey;\n\n const handleTabClick = useCallback(\n (key: string, disabled?: boolean) => {\n if (disabled) return;\n\n if (controlledActiveKey === undefined) {\n setInternalActiveKey(key);\n }\n onChange?.(key);\n },\n [controlledActiveKey, onChange],\n );\n\n // Handle keyboard navigation (arrow keys, Home, End)\n const handleKeyDown = useCallback(\n (event: React.KeyboardEvent<HTMLButtonElement>, currentIndex: number) => {\n const enabledIndices = items\n .map((item, i) => (!item.disabled ? i : -1))\n .filter((i): i is number => i !== -1);\n const currentEnabledIndex = enabledIndices.indexOf(currentIndex);\n\n let newIndex: number | undefined;\n\n switch (event.key) {\n case \"ArrowLeft\":\n case \"ArrowUp\":\n event.preventDefault();\n newIndex =\n enabledIndices[\n currentEnabledIndex > 0\n ? currentEnabledIndex - 1\n : enabledIndices.length - 1\n ];\n break;\n case \"ArrowRight\":\n case \"ArrowDown\":\n event.preventDefault();\n newIndex =\n enabledIndices[\n currentEnabledIndex < enabledIndices.length - 1\n ? currentEnabledIndex + 1\n : 0\n ];\n break;\n case \"Home\":\n event.preventDefault();\n newIndex = enabledIndices[0];\n break;\n case \"End\":\n event.preventDefault();\n newIndex = enabledIndices[enabledIndices.length - 1];\n break;\n }\n\n if (newIndex !== undefined) {\n const newItem = items[newIndex];\n if (newItem) {\n handleTabClick(newItem.key);\n // Focus the new tab\n const buttons = tabListRef.current?.querySelectorAll(\"button\");\n buttons?.[newIndex]?.focus();\n }\n }\n },\n [items, handleTabClick],\n );\n\n const activeItem = items.find((item) => item.key === activeKey);\n\n return (\n <div\n data-slot=\"tabs_root\"\n className={cn(\"tabs_root w-full\", classNames?.root, className)}\n >\n <div\n ref={tabListRef}\n role=\"tablist\"\n aria-orientation=\"horizontal\"\n data-slot=\"tabs_list\"\n className={cn(\n \"tabs_list\",\n tabListVariants({ size, variant }),\n variant !== \"pill\" && \"border-border\",\n classNames?.list,\n )}\n >\n {items.map((item, index) => {\n const isActive = item.key === activeKey;\n const tabId = `tab-${uniqueId}-${item.key}`;\n const panelId = `panel-${uniqueId}-${item.key}`;\n\n return (\n <button\n key={item.key}\n id={tabId}\n role=\"tab\"\n type=\"button\"\n aria-selected={isActive}\n aria-controls={panelId}\n tabIndex={isActive ? 0 : -1}\n data-slot=\"tabs_tab\"\n className={cn(\n \"tabs_tab\",\n tabItemVariants({\n size,\n variant,\n color,\n active: isActive,\n }),\n item.disabled && \"opacity-50 cursor-not-allowed\",\n classNames?.tab,\n isActive && classNames?.tabActive,\n )}\n onClick={() => handleTabClick(item.key, item.disabled)}\n onKeyDown={(e) => handleKeyDown(e, index)}\n disabled={item.disabled}\n >\n {item.icon && <span aria-hidden=\"true\">{item.icon}</span>}\n {item.label}\n </button>\n );\n })}\n </div>\n\n {/* Performance optimization: Removed key prop to prevent forced remount\n on tab change. Animation still works via CSS, but tab content state\n is preserved. This is especially important for tabs containing forms\n or expensive components. */}\n {activeItem?.content && (\n <div\n id={`panel-${uniqueId}-${activeItem.key}`}\n role=\"tabpanel\"\n aria-labelledby={`tab-${uniqueId}-${activeItem.key}`}\n tabIndex={0}\n data-slot=\"tabs_panel\"\n className={cn(\n \"tabs_panel\",\n \"py-4 animate-in fade-in slide-in-from-bottom-2 duration-300\",\n classNames?.panel,\n )}\n >\n {activeItem?.content}\n </div>\n )}\n </div>\n );\n },\n);\n\nTabs.displayName = \"Tabs\";\n\nexport type { TabsClassNames } from \"./types\";\nexport type * from \"./types\";\nexport default Tabs;\n"]}
@@ -1,4 +1,5 @@
1
- import { cn } from './chunk-YNNAOXU5.js';
1
+ import { bgSkeletonColorClasses } from './chunk-NTPWR57C.js';
2
+ import { cn } from './chunk-NGYLRX6F.js';
2
3
  import { cva } from 'class-variance-authority';
3
4
  import React from 'react';
4
5
  import { jsx } from 'react/jsx-runtime';
@@ -11,16 +12,7 @@ var skeletonVariants = cva("animate-pulse rounded", {
11
12
  md: "h-5",
12
13
  lg: "h-6"
13
14
  },
14
- color: {
15
- default: "bg-surface",
16
- primary: "bg-primary/50",
17
- secondary: "bg-secondary/50",
18
- accent: "bg-accent/50",
19
- success: "bg-success/50",
20
- error: "bg-error/50",
21
- warning: "bg-warning/50",
22
- info: "bg-info/50"
23
- }
15
+ color: bgSkeletonColorClasses
24
16
  },
25
17
  defaultVariants: {
26
18
  size: "md",
@@ -32,7 +24,9 @@ var Skeleton = React.memo(
32
24
  return /* @__PURE__ */ jsx(
33
25
  "div",
34
26
  {
27
+ "data-slot": "root",
35
28
  className: cn(
29
+ "skeleton_root",
36
30
  skeletonVariants({ size, color }),
37
31
  circle && "rounded-full aspect-square",
38
32
  className
@@ -45,5 +39,5 @@ Skeleton.displayName = "Skeleton";
45
39
  var skeleton_default = Skeleton;
46
40
 
47
41
  export { skeleton_default };
48
- //# sourceMappingURL=chunk-75XESYGN.js.map
49
- //# sourceMappingURL=chunk-75XESYGN.js.map
42
+ //# sourceMappingURL=chunk-P6A75RAH.js.map
43
+ //# sourceMappingURL=chunk-P6A75RAH.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/skeleton/index.tsx"],"names":[],"mappings":";;;;;;AAOA,IAAM,gBAAA,GAAmB,IAAI,uBAAA,EAAyB;AAAA,EACpD,QAAA,EAAU;AAAA,IACR,IAAA,EAAM;AAAA,MACJ,EAAA,EAAI,KAAA;AAAA,MACJ,EAAA,EAAI,KAAA;AAAA,MACJ,EAAA,EAAI,KAAA;AAAA,MACJ,EAAA,EAAI;AAAA,KACN;AAAA,IACA,KAAA,EAAO;AAAA,GACT;AAAA,EACA,eAAA,EAAiB;AAAA,IACf,IAAA,EAAM,IAAA;AAAA,IACN,KAAA,EAAO;AAAA;AAEX,CAAC,CAAA;AAED,IAAM,WAAW,KAAA,CAAM,IAAA;AAAA,EACrB,CAAC,EAAE,KAAA,GAAQ,SAAA,EAAW,OAAO,IAAA,EAAM,SAAA,EAAW,MAAA,GAAS,KAAA,EAAM,KAAM;AACjE,IAAA,uBACE,GAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,WAAA,EAAU,MAAA;AAAA,QACV,SAAA,EAAW,EAAA;AAAA,UACT,eAAA;AAAA,UACA,gBAAA,CAAiB,EAAE,IAAA,EAAM,KAAA,EAAO,CAAA;AAAA,UAChC,MAAA,IAAU,4BAAA;AAAA,UACV;AAAA;AACF;AAAA,KACF;AAAA,EAEJ;AACF,CAAA;AAEA,QAAA,CAAS,WAAA,GAAc,UAAA;AAGvB,IAAO,gBAAA,GAAQ","file":"chunk-P6A75RAH.js","sourcesContent":["import { cva } from 'class-variance-authority'\nimport React from 'react'\n\nimport { cn } from '../utils'\nimport { bgSkeletonColorClasses } from '../variants'\nimport type { SkeletonProps } from './types'\n\nconst skeletonVariants = cva('animate-pulse rounded', {\n variants: {\n size: {\n xs: 'h-3',\n sm: 'h-4',\n md: 'h-5',\n lg: 'h-6',\n },\n color: bgSkeletonColorClasses,\n },\n defaultVariants: {\n size: 'md',\n color: 'default',\n },\n})\n\nconst Skeleton = React.memo<SkeletonProps>(\n ({ color = 'default', size = 'md', className, circle = false }) => {\n return (\n <div\n data-slot=\"root\"\n className={cn(\n 'skeleton_root',\n skeletonVariants({ size, color }),\n circle && 'rounded-full aspect-square',\n className,\n )}\n />\n )\n },\n)\n\nSkeleton.displayName = 'Skeleton'\n\nexport type * from './types'\nexport default Skeleton\n"]}
@@ -1,7 +1,7 @@
1
- import { cn, iconSizes } from './chunk-YNNAOXU5.js';
1
+ import { cn, iconSizes } from './chunk-NGYLRX6F.js';
2
2
  import { cva } from 'class-variance-authority';
3
3
  import { Check, Copy } from 'lucide-react';
4
- import React, { useState } from 'react';
4
+ import React, { useState, useRef, useEffect } from 'react';
5
5
  import { jsxs, jsx } from 'react/jsx-runtime';
6
6
 
7
7
  var clipboardVariants = cva(
@@ -70,34 +70,63 @@ var Clipboard = React.memo(
70
70
  variant = "default",
71
71
  showValue = true,
72
72
  successDuration = 2e3,
73
+ disabled = false,
73
74
  onCopy,
74
- className
75
+ className,
76
+ classNames,
77
+ ref
75
78
  }) => {
76
79
  const [copied, setCopied] = useState(false);
80
+ const timerRef = useRef(null);
81
+ useEffect(() => {
82
+ return () => {
83
+ if (timerRef.current) {
84
+ clearTimeout(timerRef.current);
85
+ }
86
+ };
87
+ }, []);
77
88
  const handleCopy = async () => {
89
+ if (disabled) return;
78
90
  try {
79
91
  await navigator.clipboard.writeText(value);
80
92
  setCopied(true);
81
93
  onCopy?.();
82
- setTimeout(() => {
94
+ if (timerRef.current) {
95
+ clearTimeout(timerRef.current);
96
+ }
97
+ timerRef.current = setTimeout(() => {
83
98
  setCopied(false);
84
99
  }, successDuration);
85
- } catch (err) {
86
- console.error("Failed to copy:", err);
100
+ } catch {
101
+ }
102
+ };
103
+ const handleKeyDown = (e) => {
104
+ if (e.key === "Enter" || e.key === " ") {
105
+ e.preventDefault();
106
+ handleCopy();
87
107
  }
88
108
  };
89
109
  return /* @__PURE__ */ jsxs(
90
110
  "div",
91
111
  {
112
+ ref,
113
+ role: "button",
114
+ tabIndex: disabled ? -1 : 0,
92
115
  onClick: handleCopy,
116
+ onKeyDown: handleKeyDown,
117
+ "aria-label": copied ? "Copied to clipboard" : `Copy ${showValue ? value : "to clipboard"}`,
118
+ "aria-disabled": disabled,
93
119
  className: cn(
94
120
  clipboardVariants({ size }),
95
121
  colorStyles[color][variant],
122
+ disabled && "opacity-50 cursor-not-allowed",
123
+ "clipboard_root",
124
+ classNames?.root,
96
125
  className
97
126
  ),
98
127
  children: [
99
- showValue && /* @__PURE__ */ jsx("span", { className: "font-mono truncate", children: value }),
100
- copied ? /* @__PURE__ */ jsx(Check, { className: cn(iconSizes[size], "flex-shrink-0") }) : /* @__PURE__ */ jsx(Copy, { className: cn(iconSizes[size], "flex-shrink-0") })
128
+ showValue && /* @__PURE__ */ jsx("span", { className: cn("font-mono truncate clipboard_input", classNames?.input), children: value }),
129
+ copied ? /* @__PURE__ */ jsx(Check, { className: cn(iconSizes[size], "flex-shrink-0 clipboard_button", classNames?.button) }) : /* @__PURE__ */ jsx(Copy, { className: cn(iconSizes[size], "flex-shrink-0 clipboard_button", classNames?.button) })
101
130
  ]
102
131
  }
103
132
  );
@@ -107,5 +136,5 @@ Clipboard.displayName = "Clipboard";
107
136
  var clipboard_default = Clipboard;
108
137
 
109
138
  export { clipboard_default };
110
- //# sourceMappingURL=chunk-RMGIO27V.js.map
111
- //# sourceMappingURL=chunk-RMGIO27V.js.map
139
+ //# sourceMappingURL=chunk-PXOHJJBE.js.map
140
+ //# sourceMappingURL=chunk-PXOHJJBE.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/clipboard/index.tsx"],"names":[],"mappings":"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","file":"chunk-PXOHJJBE.js","sourcesContent":["'use client'\n\nimport { cva } from 'class-variance-authority'\nimport { Check, Copy } from 'lucide-react'\nimport React, { useState, useRef, useEffect } from 'react'\n\nimport { cn, iconSizes } from '../utils'\nimport type { ClipboardProps } from './types'\n\nconst clipboardVariants = cva(\n 'inline-flex items-center justify-between gap-2 rounded-md font-medium transition-all cursor-pointer border',\n {\n variants: {\n size: {\n xs: 'px-2 py-1 text-xs',\n sm: 'px-3 py-1.5 text-xs',\n md: 'px-4 py-2 text-sm',\n lg: 'px-5 py-2.5 text-lg',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n },\n)\n\nconst colorStyles = {\n default: {\n default: 'bg-background border-border text-text-primary hover:bg-surface',\n solid: 'bg-surface border-border text-text-primary hover:bg-surface/80',\n soft: 'bg-surface/50 border-border text-text-primary hover:bg-surface',\n },\n primary: {\n default: 'bg-background border-primary text-primary hover:bg-primary/10',\n solid: 'bg-primary border-primary text-background hover:bg-primary/90',\n soft: 'bg-primary/10 border-primary/30 text-primary hover:bg-primary/20',\n },\n secondary: {\n default:\n 'bg-background border-secondary text-secondary hover:bg-secondary/10',\n solid:\n 'bg-secondary border-secondary text-background hover:bg-secondary/90',\n soft: 'bg-secondary/10 border-secondary/30 text-secondary hover:bg-secondary/20',\n },\n accent: {\n default: 'bg-background border-accent text-accent hover:bg-accent/10',\n solid: 'bg-accent border-accent text-background hover:bg-accent/90',\n soft: 'bg-accent/10 border-accent/30 text-accent hover:bg-accent/20',\n },\n success: {\n default: 'bg-background border-success text-success hover:bg-success/10',\n solid: 'bg-success border-success text-background hover:bg-success/90',\n soft: 'bg-success/10 border-success/30 text-success hover:bg-success/20',\n },\n error: {\n default: 'bg-background border-error text-error hover:bg-error/10',\n solid: 'bg-error border-error text-background hover:bg-error/90',\n soft: 'bg-error/10 border-error/30 text-error hover:bg-error/20',\n },\n warning: {\n default: 'bg-background border-warning text-warning hover:bg-warning/10',\n solid: 'bg-warning border-warning text-background hover:bg-warning/90',\n soft: 'bg-warning/10 border-warning/30 text-warning hover:bg-warning/20',\n },\n info: {\n default: 'bg-background border-info text-info hover:bg-info/10',\n solid: 'bg-info border-info text-background hover:bg-info/90',\n soft: 'bg-info/10 border-info/30 text-info hover:bg-info/20',\n },\n}\n\nconst Clipboard = React.memo<ClipboardProps>(\n ({\n value,\n color = 'default',\n size = 'md',\n variant = 'default',\n showValue = true,\n successDuration = 2000,\n disabled = false,\n onCopy,\n className,\n classNames,\n ref,\n }) => {\n const [copied, setCopied] = useState(false)\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n\n // Cleanup timeout on unmount to prevent memory leak\n useEffect(() => {\n return () => {\n if (timerRef.current) {\n clearTimeout(timerRef.current)\n }\n }\n }, [])\n\n const handleCopy = async () => {\n if (disabled) return\n\n try {\n await navigator.clipboard.writeText(value)\n setCopied(true)\n onCopy?.()\n\n // Clear any existing timer before setting a new one\n if (timerRef.current) {\n clearTimeout(timerRef.current)\n }\n\n timerRef.current = setTimeout(() => {\n setCopied(false)\n }, successDuration)\n } catch {\n // Copy failed - user can try again\n }\n }\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n handleCopy()\n }\n }\n\n return (\n <div\n ref={ref}\n role=\"button\"\n tabIndex={disabled ? -1 : 0}\n onClick={handleCopy}\n onKeyDown={handleKeyDown}\n aria-label={copied ? 'Copied to clipboard' : `Copy ${showValue ? value : 'to clipboard'}`}\n aria-disabled={disabled}\n className={cn(\n clipboardVariants({ size }),\n colorStyles[color][variant],\n disabled && 'opacity-50 cursor-not-allowed',\n 'clipboard_root',\n classNames?.root,\n className,\n )}\n >\n {showValue && <span className={cn(\"font-mono truncate clipboard_input\", classNames?.input)}>{value}</span>}\n {copied ? (\n <Check className={cn(iconSizes[size], 'flex-shrink-0 clipboard_button', classNames?.button)} />\n ) : (\n <Copy className={cn(iconSizes[size], 'flex-shrink-0 clipboard_button', classNames?.button)} />\n )}\n </div>\n )\n },\n)\n\nClipboard.displayName = 'Clipboard'\n\nexport type * from './types'\nexport default Clipboard\n"]}
@@ -1,4 +1,4 @@
1
- import { cn } from './chunk-YNNAOXU5.js';
1
+ import { cn } from './chunk-NGYLRX6F.js';
2
2
  import { cva } from 'class-variance-authority';
3
3
  import { ChevronRight, Check, Minus } from 'lucide-react';
4
4
  import React from 'react';
@@ -55,7 +55,8 @@ var Tree = React.memo(
55
55
  showLine = false,
56
56
  showIcon = true,
57
57
  defaultExpandAll = false,
58
- className
58
+ className,
59
+ classNames
59
60
  }) => {
60
61
  const [internalExpandedKeys, setInternalExpandedKeys] = React.useState(defaultExpandAll ? getAllKeys(data) : defaultExpandedKeys);
61
62
  const [internalCheckedKeys, setInternalCheckedKeys] = React.useState(defaultCheckedKeys);
@@ -217,17 +218,23 @@ var Tree = React.memo(
217
218
  return /* @__PURE__ */ jsx(
218
219
  "div",
219
220
  {
220
- className: "relative animate-in fade-in slide-in-from-top-1 duration-200",
221
+ className: cn(
222
+ "tree_node",
223
+ "relative animate-in fade-in slide-in-from-top-1 duration-200",
224
+ classNames?.node
225
+ ),
221
226
  children: /* @__PURE__ */ jsxs(
222
227
  "div",
223
228
  {
224
229
  className: cn(
230
+ "tree_nodeContent",
225
231
  treeItemVariants({
226
232
  size,
227
233
  disabled: !!node.disabled,
228
234
  selected: isSelected
229
235
  }),
230
- className
236
+ className,
237
+ classNames?.nodeContent
231
238
  ),
232
239
  children: [
233
240
  Array.from({ length: level }).map((_, i) => {
@@ -249,7 +256,11 @@ var Tree = React.memo(
249
256
  e.stopPropagation();
250
257
  handleExpand(node.key);
251
258
  },
252
- className: "shrink-0 hover:text-primary transition-colors duration-200",
259
+ className: cn(
260
+ "tree_expandIcon",
261
+ "shrink-0 hover:text-primary transition-colors duration-200",
262
+ classNames?.expandIcon
263
+ ),
253
264
  disabled: disabled || node.disabled,
254
265
  children: /* @__PURE__ */ jsx(
255
266
  ChevronRight,
@@ -281,12 +292,18 @@ var Tree = React.memo(
281
292
  ]
282
293
  }
283
294
  ),
284
- showIcon && node.icon && /* @__PURE__ */ jsx("span", { className: "shrink-0", children: node.icon }),
295
+ showIcon && node.icon && /* @__PURE__ */ jsx(
296
+ "span",
297
+ {
298
+ className: cn("tree_icon", "shrink-0", classNames?.icon),
299
+ children: node.icon
300
+ }
301
+ ),
285
302
  /* @__PURE__ */ jsx(
286
303
  "span",
287
304
  {
288
305
  onClick: () => handleSelect(node),
289
- className: "flex-1 truncate",
306
+ className: cn("tree_label", "flex-1 truncate", classNames?.label),
290
307
  children: node.label
291
308
  }
292
309
  )
@@ -304,6 +321,7 @@ var Tree = React.memo(
304
321
  getCheckState,
305
322
  size,
306
323
  className,
324
+ classNames,
307
325
  disabled,
308
326
  handleExpand,
309
327
  handleCheck,
@@ -313,12 +331,12 @@ var Tree = React.memo(
313
331
  flatNodes
314
332
  ]
315
333
  );
316
- return /* @__PURE__ */ jsx("div", { className: cn("w-full", className), children: flatNodes.map((item, index) => renderNode(item, index)) });
334
+ return /* @__PURE__ */ jsx("div", { className: cn("tree_root", "w-full", className, classNames?.root), children: flatNodes.map((item, index) => renderNode(item, index)) });
317
335
  }
318
336
  );
319
337
  Tree.displayName = "Tree";
320
338
  var tree_default = Tree;
321
339
 
322
340
  export { tree_default };
323
- //# sourceMappingURL=chunk-SAVE5ACL.js.map
324
- //# sourceMappingURL=chunk-SAVE5ACL.js.map
341
+ //# sourceMappingURL=chunk-Q57THXIU.js.map
342
+ //# sourceMappingURL=chunk-Q57THXIU.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/tree/index.tsx"],"names":[],"mappings":"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","file":"chunk-Q57THXIU.js","sourcesContent":["'use client'\n\nimport { cva } from 'class-variance-authority'\nimport { Check, ChevronRight, Minus } from 'lucide-react'\nimport React from 'react'\n\nimport { cn } from '../utils'\nimport type { TreeNode, TreeProps } from './types'\n\nconst treeItemVariants = cva(\n 'flex items-center gap-2 px-2 rounded cursor-pointer select-none transition-all duration-200 ease-out',\n {\n variants: {\n size: {\n xs: 'text-xs',\n sm: 'text-sm',\n md: 'text-base',\n lg: 'text-lg',\n },\n disabled: {\n true: 'opacity-50 cursor-not-allowed',\n false: 'hover:bg-surface',\n },\n selected: {\n true: 'bg-primary/10 text-primary',\n false: 'text-text-primary',\n },\n },\n defaultVariants: {\n size: 'md',\n disabled: false,\n selected: false,\n },\n },\n)\n\nconst iconSizes = {\n xs: 'h-3 w-3',\n sm: 'h-3.5 w-3.5',\n md: 'h-4 w-4',\n lg: 'h-5 w-5',\n}\n\nconst Tree = React.memo<TreeProps>(\n ({\n data,\n defaultExpandedKeys = [],\n expandedKeys,\n onExpand,\n checkable = false,\n checkedKeys,\n defaultCheckedKeys = [],\n onCheck,\n selectable = true,\n selectedKeys,\n defaultSelectedKeys = [],\n onSelect,\n disabled = false,\n size = 'md',\n showLine = false,\n showIcon = true,\n defaultExpandAll = false,\n className,\n classNames,\n }) => {\n const [internalExpandedKeys, setInternalExpandedKeys] = React.useState<\n string[]\n >(defaultExpandAll ? getAllKeys(data) : defaultExpandedKeys)\n const [internalCheckedKeys, setInternalCheckedKeys] =\n React.useState<string[]>(defaultCheckedKeys)\n const [internalSelectedKeys, setInternalSelectedKeys] =\n React.useState<string[]>(defaultSelectedKeys)\n\n const currentExpandedKeys =\n expandedKeys !== undefined ? expandedKeys : internalExpandedKeys\n const currentCheckedKeys =\n checkedKeys !== undefined ? checkedKeys : internalCheckedKeys\n const currentSelectedKeys =\n selectedKeys !== undefined ? selectedKeys : internalSelectedKeys\n\n function getAllKeys(nodes: TreeNode[]): string[] {\n const keys: string[] = []\n const traverse = (items: TreeNode[]) => {\n items.forEach((item) => {\n keys.push(item.key)\n if (item.children) {\n traverse(item.children)\n }\n })\n }\n traverse(nodes)\n return keys\n }\n\n const getAllLeafKeys = React.useCallback((node: TreeNode): string[] => {\n const keys: string[] = []\n\n const traverse = (n: TreeNode) => {\n if (!n.children || n.children.length === 0 || n.isLeaf) {\n keys.push(n.key)\n } else {\n n.children.forEach((child) => traverse(child))\n }\n }\n\n traverse(node)\n return keys\n }, [])\n\n const getNodeByKey = React.useCallback(\n (key: string): TreeNode | null => {\n const traverse = (nodes: TreeNode[]): TreeNode | null => {\n for (const node of nodes) {\n if (node.key === key) return node\n if (node.children) {\n const found = traverse(node.children)\n if (found) return found\n }\n }\n return null\n }\n return traverse(data)\n },\n [data],\n )\n\n const getCheckedNodes = React.useCallback(\n (keys: string[]): TreeNode[] => {\n return keys\n .map((key) => getNodeByKey(key))\n .filter((node): node is TreeNode => node !== null)\n },\n [getNodeByKey],\n )\n\n const getCheckState = React.useCallback(\n (node: TreeNode): { checked: boolean; indeterminate: boolean } => {\n if (!node.children || node.children.length === 0 || node.isLeaf) {\n return {\n checked: currentCheckedKeys.includes(node.key),\n indeterminate: false,\n }\n }\n\n const leafKeys = getAllLeafKeys(node)\n const checkedCount = leafKeys.filter((key) =>\n currentCheckedKeys.includes(key),\n ).length\n\n return {\n checked: checkedCount === leafKeys.length && leafKeys.length > 0,\n indeterminate: checkedCount > 0 && checkedCount < leafKeys.length,\n }\n },\n [currentCheckedKeys, getAllLeafKeys],\n )\n\n const handleExpand = React.useCallback(\n (key: string) => {\n const newExpandedKeys = currentExpandedKeys.includes(key)\n ? currentExpandedKeys.filter((k) => k !== key)\n : [...currentExpandedKeys, key]\n\n if (expandedKeys === undefined) {\n setInternalExpandedKeys(newExpandedKeys)\n }\n onExpand?.(newExpandedKeys)\n },\n [currentExpandedKeys, expandedKeys, onExpand],\n )\n\n const handleCheck = React.useCallback(\n (node: TreeNode, checked: boolean) => {\n if (disabled || node.disabled) return\n\n const leafKeys = getAllLeafKeys(node)\n let newCheckedKeys: string[]\n\n if (checked) {\n // Add all leaf keys that aren't already checked\n const keysToAdd = leafKeys.filter(\n (key) => !currentCheckedKeys.includes(key),\n )\n newCheckedKeys = [...currentCheckedKeys, ...keysToAdd]\n } else {\n // Remove all leaf keys\n newCheckedKeys = currentCheckedKeys.filter(\n (key) => !leafKeys.includes(key),\n )\n }\n\n if (checkedKeys === undefined) {\n setInternalCheckedKeys(newCheckedKeys)\n }\n\n const checkedNodes = getCheckedNodes(newCheckedKeys)\n onCheck?.(newCheckedKeys, {\n checked,\n node,\n checkedNodes,\n })\n },\n [\n disabled,\n getAllLeafKeys,\n currentCheckedKeys,\n checkedKeys,\n onCheck,\n getCheckedNodes,\n ],\n )\n\n const handleSelect = React.useCallback(\n (node: TreeNode) => {\n if (disabled || node.disabled || !selectable) return\n\n const isSelected = currentSelectedKeys.includes(node.key)\n const newSelectedKeys = isSelected\n ? currentSelectedKeys.filter((k) => k !== node.key)\n : [...currentSelectedKeys, node.key]\n\n if (selectedKeys === undefined) {\n setInternalSelectedKeys(newSelectedKeys)\n }\n\n onSelect?.(newSelectedKeys, {\n selected: !isSelected,\n node,\n })\n },\n [disabled, selectable, currentSelectedKeys, selectedKeys, onSelect],\n )\n\n const flattenTree = React.useCallback(\n (\n nodes: TreeNode[],\n level: number = 0,\n ): Array<{ node: TreeNode; level: number }> => {\n const result: Array<{ node: TreeNode; level: number }> = []\n\n nodes.forEach((node) => {\n result.push({ node, level })\n\n const hasChildren =\n node.children && node.children.length > 0 && !node.isLeaf\n const isExpanded = currentExpandedKeys.includes(node.key)\n\n if (hasChildren && isExpanded) {\n result.push(...flattenTree(node.children!, level + 1))\n }\n })\n\n return result\n },\n [currentExpandedKeys],\n )\n\n const flatNodes = React.useMemo(\n () => flattenTree(data),\n [data, flattenTree],\n )\n\n const renderNode = React.useCallback(\n (\n item: { node: TreeNode; level: number },\n index: number,\n ): React.ReactNode => {\n const { node, level } = item\n const hasChildren =\n node.children && node.children.length > 0 && !node.isLeaf\n const isExpanded = currentExpandedKeys.includes(node.key)\n const isSelected = currentSelectedKeys.includes(node.key)\n const checkState = checkable ? getCheckState(node) : null\n\n return (\n <div\n key={node.key}\n className={cn(\n 'tree_node',\n 'relative animate-in fade-in slide-in-from-top-1 duration-200',\n classNames?.node,\n )}\n >\n <div\n className={cn(\n 'tree_nodeContent',\n treeItemVariants({\n size,\n disabled: !!node.disabled,\n selected: isSelected,\n }),\n className,\n classNames?.nodeContent,\n )}\n >\n {/* Indentation units with vertical lines */}\n {Array.from({ length: level }).map((_, i) => {\n // Check if this indent level should have a vertical line\n const shouldDrawLine =\n showLine &&\n flatNodes.slice(index + 1).some((n) => n.level === i)\n\n return (\n <span\n key={i}\n className=\"relative inline-block w-4 h-6 shrink-0\"\n >\n {/* Vertical line connecting siblings */}\n {shouldDrawLine && (\n <span className=\"absolute top-0 left-1/2 bottom-0 h-full border-l border-border -translate-x-px\" />\n )}\n </span>\n )\n })}\n\n {/* Expand/Collapse Icon */}\n {hasChildren ? (\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation()\n handleExpand(node.key)\n }}\n className={cn(\n 'tree_expandIcon',\n 'shrink-0 hover:text-primary transition-colors duration-200',\n classNames?.expandIcon,\n )}\n disabled={disabled || node.disabled}\n >\n <ChevronRight\n className={cn(\n iconSizes[size],\n 'transition-transform duration-300 ease-out',\n isExpanded && 'rotate-90',\n )}\n />\n </button>\n ) : (\n <span className={cn('shrink-0', iconSizes[size])} />\n )}\n\n {/* Checkbox */}\n {checkable && (\n <div\n onClick={(e) => {\n e.stopPropagation()\n handleCheck(node, !checkState?.checked)\n }}\n className={cn(\n 'w-4 h-4 border rounded flex items-center justify-center shrink-0 cursor-pointer transition-all duration-200',\n checkState?.checked\n ? 'bg-primary border-primary'\n : 'border-border',\n (disabled || node.disabled) &&\n 'opacity-50 cursor-not-allowed',\n )}\n >\n {checkState?.checked && (\n <Check className=\"h-3 w-3 text-background animate-in zoom-in-50 duration-200\" />\n )}\n {checkState?.indeterminate && !checkState?.checked && (\n <Minus className=\"h-3 w-3 text-primary animate-in zoom-in-50 duration-200\" />\n )}\n </div>\n )}\n\n {/* Icon */}\n {showIcon && node.icon && (\n <span\n className={cn('tree_icon', 'shrink-0', classNames?.icon)}\n >\n {node.icon}\n </span>\n )}\n\n {/* Label */}\n <span\n onClick={() => handleSelect(node)}\n className={cn('tree_label', 'flex-1 truncate', classNames?.label)}\n >\n {node.label}\n </span>\n </div>\n </div>\n )\n },\n [\n currentExpandedKeys,\n currentSelectedKeys,\n checkable,\n getCheckState,\n size,\n className,\n classNames,\n disabled,\n handleExpand,\n handleCheck,\n handleSelect,\n showIcon,\n showLine,\n flatNodes,\n ],\n )\n\n return (\n <div className={cn('tree_root', 'w-full', className, classNames?.root)}>\n {flatNodes.map((item, index) => renderNode(item, index))}\n </div>\n )\n },\n)\n\nTree.displayName = 'Tree'\n\nexport type * from './types'\nexport default Tree\n"]}