@parto-system-design/ui 1.1.5 → 1.1.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 (301) hide show
  1. package/AGENTS.md +233 -0
  2. package/LICENSE +21 -0
  3. package/README.md +96 -43
  4. package/dist/chunk-2UD3LGVX.cjs +316 -0
  5. package/dist/chunk-2UD3LGVX.cjs.map +1 -0
  6. package/dist/chunk-34JUCX2G.cjs +43 -0
  7. package/dist/chunk-34JUCX2G.cjs.map +1 -0
  8. package/dist/chunk-3AIJKXBV.cjs +242 -0
  9. package/dist/chunk-3AIJKXBV.cjs.map +1 -0
  10. package/dist/chunk-4SVQNEVH.js +173 -0
  11. package/dist/chunk-4SVQNEVH.js.map +1 -0
  12. package/dist/chunk-53QY4PD3.js +908 -0
  13. package/dist/chunk-53QY4PD3.js.map +1 -0
  14. package/dist/chunk-5JJSRGJD.js +31 -0
  15. package/dist/chunk-5JJSRGJD.js.map +1 -0
  16. package/dist/chunk-5K6E4ZSW.cjs +77 -0
  17. package/dist/chunk-5K6E4ZSW.cjs.map +1 -0
  18. package/dist/chunk-5NY26ULO.js +89 -0
  19. package/dist/chunk-5NY26ULO.js.map +1 -0
  20. package/dist/chunk-7RVPG3LE.cjs +231 -0
  21. package/dist/chunk-7RVPG3LE.cjs.map +1 -0
  22. package/dist/chunk-7Y4V3R3Y.cjs +120 -0
  23. package/dist/chunk-7Y4V3R3Y.cjs.map +1 -0
  24. package/dist/chunk-AXAY64KL.js +39 -0
  25. package/dist/chunk-AXAY64KL.js.map +1 -0
  26. package/dist/chunk-AYEK3WOM.js +207 -0
  27. package/dist/chunk-AYEK3WOM.js.map +1 -0
  28. package/dist/chunk-BRMBLIQG.js +53 -0
  29. package/dist/chunk-BRMBLIQG.js.map +1 -0
  30. package/dist/chunk-CAJKSTXX.cjs +54 -0
  31. package/dist/chunk-CAJKSTXX.cjs.map +1 -0
  32. package/dist/chunk-CKFWMHQU.js +401 -0
  33. package/dist/chunk-CKFWMHQU.js.map +1 -0
  34. package/dist/chunk-CV3N3HVK.js +672 -0
  35. package/dist/chunk-CV3N3HVK.js.map +1 -0
  36. package/dist/chunk-D2EBLE2B.cjs +220 -0
  37. package/dist/chunk-D2EBLE2B.cjs.map +1 -0
  38. package/dist/chunk-D5XCQDFS.js +92 -0
  39. package/dist/chunk-D5XCQDFS.js.map +1 -0
  40. package/dist/chunk-GDHRYKVM.js +45 -0
  41. package/dist/chunk-GDHRYKVM.js.map +1 -0
  42. package/dist/chunk-GKRAZGDI.cjs +84 -0
  43. package/dist/chunk-GKRAZGDI.cjs.map +1 -0
  44. package/dist/chunk-HEYMLQOV.cjs +94 -0
  45. package/dist/chunk-HEYMLQOV.cjs.map +1 -0
  46. package/dist/chunk-HF6XU5NI.js +84 -0
  47. package/dist/chunk-HF6XU5NI.js.map +1 -0
  48. package/dist/chunk-HJPDZOMJ.cjs +87 -0
  49. package/dist/chunk-HJPDZOMJ.cjs.map +1 -0
  50. package/dist/chunk-HUCC3QH5.cjs +53 -0
  51. package/dist/chunk-HUCC3QH5.cjs.map +1 -0
  52. package/dist/chunk-HYZ6BQPS.cjs +425 -0
  53. package/dist/chunk-HYZ6BQPS.cjs.map +1 -0
  54. package/dist/chunk-IQHKJ4SS.js +213 -0
  55. package/dist/chunk-IQHKJ4SS.js.map +1 -0
  56. package/dist/chunk-ISCSZMYW.cjs +106 -0
  57. package/dist/chunk-ISCSZMYW.cjs.map +1 -0
  58. package/dist/chunk-IXFEFIDO.js +82 -0
  59. package/dist/chunk-IXFEFIDO.js.map +1 -0
  60. package/dist/chunk-JUBHQAA2.js +53 -0
  61. package/dist/chunk-JUBHQAA2.js.map +1 -0
  62. package/dist/chunk-KCWRCSI7.js +62 -0
  63. package/dist/chunk-KCWRCSI7.js.map +1 -0
  64. package/dist/chunk-L2L5CKC2.js +291 -0
  65. package/dist/chunk-L2L5CKC2.js.map +1 -0
  66. package/dist/chunk-LLJR7FV3.js +135 -0
  67. package/dist/chunk-LLJR7FV3.js.map +1 -0
  68. package/dist/chunk-LZMCMZZF.js +118 -0
  69. package/dist/chunk-LZMCMZZF.js.map +1 -0
  70. package/dist/chunk-M5CHZ5BA.js +124 -0
  71. package/dist/chunk-M5CHZ5BA.js.map +1 -0
  72. package/dist/chunk-MBCTRNTG.js +89 -0
  73. package/dist/chunk-MBCTRNTG.js.map +1 -0
  74. package/dist/chunk-MEK4RSGC.js +65 -0
  75. package/dist/chunk-MEK4RSGC.js.map +1 -0
  76. package/dist/chunk-MFTX2DDQ.js +27 -0
  77. package/dist/chunk-MFTX2DDQ.js.map +1 -0
  78. package/dist/chunk-MKYVQQBV.cjs +114 -0
  79. package/dist/chunk-MKYVQQBV.cjs.map +1 -0
  80. package/dist/chunk-MQGQVI3W.cjs +950 -0
  81. package/dist/chunk-MQGQVI3W.cjs.map +1 -0
  82. package/dist/chunk-NEFZJHE4.cjs +157 -0
  83. package/dist/chunk-NEFZJHE4.cjs.map +1 -0
  84. package/dist/chunk-NEML6RCV.js +405 -0
  85. package/dist/chunk-NEML6RCV.js.map +1 -0
  86. package/dist/chunk-NV4JOKWL.cjs +197 -0
  87. package/dist/chunk-NV4JOKWL.cjs.map +1 -0
  88. package/dist/chunk-O2JG7WY5.cjs +121 -0
  89. package/dist/chunk-O2JG7WY5.cjs.map +1 -0
  90. package/dist/chunk-OEVMKFFL.cjs +140 -0
  91. package/dist/chunk-OEVMKFFL.cjs.map +1 -0
  92. package/dist/chunk-ONO2FTV4.cjs +68 -0
  93. package/dist/chunk-ONO2FTV4.cjs.map +1 -0
  94. package/dist/chunk-OS6CMYAS.cjs +79 -0
  95. package/dist/chunk-OS6CMYAS.cjs.map +1 -0
  96. package/dist/chunk-P5XHPNJG.cjs +430 -0
  97. package/dist/chunk-P5XHPNJG.cjs.map +1 -0
  98. package/dist/chunk-QJ7UB2ZQ.js +98 -0
  99. package/dist/chunk-QJ7UB2ZQ.js.map +1 -0
  100. package/dist/chunk-RA5KZNG5.js +269 -0
  101. package/dist/chunk-RA5KZNG5.js.map +1 -0
  102. package/dist/chunk-RJ3HYZ7S.js +44 -0
  103. package/dist/chunk-RJ3HYZ7S.js.map +1 -0
  104. package/dist/chunk-RZNRIOLT.js +128 -0
  105. package/dist/chunk-RZNRIOLT.js.map +1 -0
  106. package/dist/chunk-S5IPJQZ3.cjs +161 -0
  107. package/dist/chunk-S5IPJQZ3.cjs.map +1 -0
  108. package/dist/chunk-SB5DSYR5.js +211 -0
  109. package/dist/chunk-SB5DSYR5.js.map +1 -0
  110. package/dist/chunk-SCGW2BH4.cjs +69 -0
  111. package/dist/chunk-SCGW2BH4.cjs.map +1 -0
  112. package/dist/chunk-SCX6AR53.cjs +108 -0
  113. package/dist/chunk-SCX6AR53.cjs.map +1 -0
  114. package/dist/chunk-SFXV2DUH.js +106 -0
  115. package/dist/chunk-SFXV2DUH.js.map +1 -0
  116. package/dist/chunk-SXEPGD4Z.cjs +152 -0
  117. package/dist/chunk-SXEPGD4Z.cjs.map +1 -0
  118. package/dist/chunk-SZMVOHT7.cjs +107 -0
  119. package/dist/chunk-SZMVOHT7.cjs.map +1 -0
  120. package/dist/chunk-U5FLLCGC.cjs +151 -0
  121. package/dist/chunk-U5FLLCGC.cjs.map +1 -0
  122. package/dist/chunk-VO3B75F6.cjs +111 -0
  123. package/dist/chunk-VO3B75F6.cjs.map +1 -0
  124. package/dist/chunk-YAJWTNOX.js +106 -0
  125. package/dist/chunk-YAJWTNOX.js.map +1 -0
  126. package/dist/chunk-YC5KLN6I.js +139 -0
  127. package/dist/chunk-YC5KLN6I.js.map +1 -0
  128. package/dist/chunk-YE477L2H.cjs +272 -0
  129. package/dist/chunk-YE477L2H.cjs.map +1 -0
  130. package/dist/chunk-Z2TY4A75.cjs +700 -0
  131. package/dist/chunk-Z2TY4A75.cjs.map +1 -0
  132. package/dist/chunk-Z56O7UEU.cjs +136 -0
  133. package/dist/chunk-Z56O7UEU.cjs.map +1 -0
  134. package/dist/chunk-ZZFNJR2E.js +71 -0
  135. package/dist/chunk-ZZFNJR2E.js.map +1 -0
  136. package/dist/components/charts/PartoAreaChart.cjs +15 -0
  137. package/dist/components/charts/PartoAreaChart.cjs.map +1 -0
  138. package/dist/components/charts/PartoAreaChart.d.cts +51 -0
  139. package/dist/components/charts/PartoAreaChart.d.ts +51 -0
  140. package/dist/components/charts/PartoAreaChart.js +6 -0
  141. package/dist/components/charts/PartoAreaChart.js.map +1 -0
  142. package/dist/components/charts/PartoBarChart.cjs +15 -0
  143. package/dist/components/charts/PartoBarChart.cjs.map +1 -0
  144. package/dist/components/charts/PartoBarChart.d.cts +55 -0
  145. package/dist/components/charts/PartoBarChart.d.ts +55 -0
  146. package/dist/components/charts/PartoBarChart.js +6 -0
  147. package/dist/components/charts/PartoBarChart.js.map +1 -0
  148. package/dist/components/charts/PartoLineChart.cjs +15 -0
  149. package/dist/components/charts/PartoLineChart.cjs.map +1 -0
  150. package/dist/components/charts/PartoLineChart.d.cts +49 -0
  151. package/dist/components/charts/PartoLineChart.d.ts +49 -0
  152. package/dist/components/charts/PartoLineChart.js +6 -0
  153. package/dist/components/charts/PartoLineChart.js.map +1 -0
  154. package/dist/components/charts/PartoPieChart.cjs +15 -0
  155. package/dist/components/charts/PartoPieChart.cjs.map +1 -0
  156. package/dist/components/charts/PartoPieChart.d.cts +44 -0
  157. package/dist/components/charts/PartoPieChart.d.ts +44 -0
  158. package/dist/components/charts/PartoPieChart.js +6 -0
  159. package/dist/components/charts/PartoPieChart.js.map +1 -0
  160. package/dist/components/ui/alert-rule-card.cjs +15 -0
  161. package/dist/components/ui/alert-rule-card.cjs.map +1 -0
  162. package/dist/components/ui/alert-rule-card.d.cts +38 -0
  163. package/dist/components/ui/alert-rule-card.d.ts +38 -0
  164. package/dist/components/ui/alert-rule-card.js +6 -0
  165. package/dist/components/ui/alert-rule-card.js.map +1 -0
  166. package/dist/components/ui/avatar.cjs +21 -0
  167. package/dist/components/ui/avatar.cjs.map +1 -0
  168. package/dist/components/ui/avatar.d.cts +18 -0
  169. package/dist/components/ui/avatar.d.ts +18 -0
  170. package/dist/components/ui/avatar.js +4 -0
  171. package/dist/components/ui/avatar.js.map +1 -0
  172. package/dist/components/ui/badge.cjs +17 -0
  173. package/dist/components/ui/badge.cjs.map +1 -0
  174. package/dist/components/ui/badge.d.cts +16 -0
  175. package/dist/components/ui/badge.d.ts +16 -0
  176. package/dist/components/ui/badge.js +4 -0
  177. package/dist/components/ui/badge.js.map +1 -0
  178. package/dist/components/ui/button.cjs +18 -0
  179. package/dist/components/ui/button.cjs.map +1 -0
  180. package/dist/components/ui/button.d.cts +37 -0
  181. package/dist/components/ui/button.d.ts +37 -0
  182. package/dist/components/ui/button.js +5 -0
  183. package/dist/components/ui/button.js.map +1 -0
  184. package/dist/components/ui/calendar.cjs +15 -0
  185. package/dist/components/ui/calendar.cjs.map +1 -0
  186. package/dist/components/ui/calendar.d.cts +17 -0
  187. package/dist/components/ui/calendar.d.ts +17 -0
  188. package/dist/components/ui/calendar.js +6 -0
  189. package/dist/components/ui/calendar.js.map +1 -0
  190. package/dist/components/ui/card.cjs +37 -0
  191. package/dist/components/ui/card.cjs.map +1 -0
  192. package/dist/components/ui/card.d.cts +18 -0
  193. package/dist/components/ui/card.d.ts +18 -0
  194. package/dist/components/ui/card.js +4 -0
  195. package/dist/components/ui/card.js.map +1 -0
  196. package/dist/components/ui/concept-card.cjs +18 -0
  197. package/dist/components/ui/concept-card.cjs.map +1 -0
  198. package/dist/components/ui/concept-card.d.cts +5 -0
  199. package/dist/components/ui/concept-card.d.ts +5 -0
  200. package/dist/components/ui/concept-card.js +9 -0
  201. package/dist/components/ui/concept-card.js.map +1 -0
  202. package/dist/components/ui/data-table.cjs +18 -0
  203. package/dist/components/ui/data-table.cjs.map +1 -0
  204. package/dist/components/ui/data-table.d.cts +181 -0
  205. package/dist/components/ui/data-table.d.ts +181 -0
  206. package/dist/components/ui/data-table.js +9 -0
  207. package/dist/components/ui/data-table.js.map +1 -0
  208. package/dist/components/ui/dialog.cjs +49 -0
  209. package/dist/components/ui/dialog.cjs.map +1 -0
  210. package/dist/components/ui/dialog.d.cts +22 -0
  211. package/dist/components/ui/dialog.d.ts +22 -0
  212. package/dist/components/ui/dialog.js +4 -0
  213. package/dist/components/ui/dialog.js.map +1 -0
  214. package/dist/components/ui/filter-provider.cjs +20 -0
  215. package/dist/components/ui/filter-provider.cjs.map +1 -0
  216. package/dist/components/ui/filter-provider.d.cts +49 -0
  217. package/dist/components/ui/filter-provider.d.ts +49 -0
  218. package/dist/components/ui/filter-provider.js +3 -0
  219. package/dist/components/ui/filter-provider.js.map +1 -0
  220. package/dist/components/ui/input.cjs +22 -0
  221. package/dist/components/ui/input.cjs.map +1 -0
  222. package/dist/components/ui/input.d.cts +16 -0
  223. package/dist/components/ui/input.d.ts +16 -0
  224. package/dist/components/ui/input.js +5 -0
  225. package/dist/components/ui/input.js.map +1 -0
  226. package/dist/components/ui/iran-province-heat.cjs +13 -0
  227. package/dist/components/ui/iran-province-heat.cjs.map +1 -0
  228. package/dist/components/ui/iran-province-heat.d.cts +64 -0
  229. package/dist/components/ui/iran-province-heat.d.ts +64 -0
  230. package/dist/components/ui/iran-province-heat.js +4 -0
  231. package/dist/components/ui/iran-province-heat.js.map +1 -0
  232. package/dist/components/ui/page-card.cjs +16 -0
  233. package/dist/components/ui/page-card.cjs.map +1 -0
  234. package/dist/components/ui/page-card.d.cts +6 -0
  235. package/dist/components/ui/page-card.d.ts +6 -0
  236. package/dist/components/ui/page-card.js +7 -0
  237. package/dist/components/ui/page-card.js.map +1 -0
  238. package/dist/components/ui/popover.cjs +25 -0
  239. package/dist/components/ui/popover.cjs.map +1 -0
  240. package/dist/components/ui/popover.d.cts +9 -0
  241. package/dist/components/ui/popover.d.ts +9 -0
  242. package/dist/components/ui/popover.js +4 -0
  243. package/dist/components/ui/popover.js.map +1 -0
  244. package/dist/components/ui/saved-query-card.cjs +15 -0
  245. package/dist/components/ui/saved-query-card.cjs.map +1 -0
  246. package/dist/components/ui/saved-query-card.d.cts +41 -0
  247. package/dist/components/ui/saved-query-card.d.ts +41 -0
  248. package/dist/components/ui/saved-query-card.js +6 -0
  249. package/dist/components/ui/saved-query-card.js.map +1 -0
  250. package/dist/components/ui/separator.cjs +13 -0
  251. package/dist/components/ui/separator.cjs.map +1 -0
  252. package/dist/components/ui/separator.d.cts +9 -0
  253. package/dist/components/ui/separator.d.ts +9 -0
  254. package/dist/components/ui/separator.js +4 -0
  255. package/dist/components/ui/separator.js.map +1 -0
  256. package/dist/components/ui/sheet.cjs +45 -0
  257. package/dist/components/ui/sheet.cjs.map +1 -0
  258. package/dist/components/ui/sheet.d.cts +44 -0
  259. package/dist/components/ui/sheet.d.ts +44 -0
  260. package/dist/components/ui/sheet.js +4 -0
  261. package/dist/components/ui/sheet.js.map +1 -0
  262. package/dist/components/ui/sparkline.cjs +13 -0
  263. package/dist/components/ui/sparkline.cjs.map +1 -0
  264. package/dist/components/ui/sparkline.d.cts +36 -0
  265. package/dist/components/ui/sparkline.d.ts +36 -0
  266. package/dist/components/ui/sparkline.js +4 -0
  267. package/dist/components/ui/sparkline.js.map +1 -0
  268. package/dist/components/ui/tooltip.cjs +25 -0
  269. package/dist/components/ui/tooltip.cjs.map +1 -0
  270. package/dist/components/ui/tooltip.d.cts +17 -0
  271. package/dist/components/ui/tooltip.d.ts +17 -0
  272. package/dist/components/ui/tooltip.js +4 -0
  273. package/dist/components/ui/tooltip.js.map +1 -0
  274. package/dist/concept-card-CcOBb2Nz.d.ts +83 -0
  275. package/dist/concept-card-RwPbqJ06.d.cts +83 -0
  276. package/dist/hooks/use-hotkey-registry.cjs +21 -0
  277. package/dist/hooks/use-hotkey-registry.cjs.map +1 -0
  278. package/dist/hooks/use-hotkey-registry.d.cts +65 -0
  279. package/dist/hooks/use-hotkey-registry.d.ts +65 -0
  280. package/dist/hooks/use-hotkey-registry.js +4 -0
  281. package/dist/hooks/use-hotkey-registry.js.map +1 -0
  282. package/dist/hooks/use-hotkeys.cjs +16 -0
  283. package/dist/hooks/use-hotkeys.cjs.map +1 -0
  284. package/dist/hooks/use-hotkeys.d.cts +66 -0
  285. package/dist/hooks/use-hotkeys.d.ts +66 -0
  286. package/dist/hooks/use-hotkeys.js +3 -0
  287. package/dist/hooks/use-hotkeys.js.map +1 -0
  288. package/dist/i18n-ArS3mqj0.d.ts +344 -0
  289. package/dist/i18n-CAd9wGOr.d.cts +344 -0
  290. package/dist/index.cjs +7383 -10955
  291. package/dist/index.cjs.map +1 -1
  292. package/dist/index.css +157 -0
  293. package/dist/index.d.cts +726 -1144
  294. package/dist/index.d.ts +726 -1144
  295. package/dist/index.js +6735 -10912
  296. package/dist/index.js.map +1 -1
  297. package/dist/page-card-CO92oXkc.d.ts +100 -0
  298. package/dist/page-card-DOl50DqJ.d.cts +100 -0
  299. package/dist/utils-DlXWmDZ-.d.cts +35 -0
  300. package/dist/utils-DlXWmDZ-.d.ts +35 -0
  301. package/package.json +160 -4
@@ -0,0 +1,106 @@
1
+ import { cn } from './chunk-4SVQNEVH.js';
2
+ import * as SheetPrimitive from '@radix-ui/react-dialog';
3
+ import { XIcon } from 'lucide-react';
4
+ import { jsx, jsxs } from 'react/jsx-runtime';
5
+
6
+ function Sheet({ ...props }) {
7
+ return /* @__PURE__ */ jsx(SheetPrimitive.Root, { "data-slot": "sheet", ...props });
8
+ }
9
+ function SheetTrigger({ ...props }) {
10
+ return /* @__PURE__ */ jsx(SheetPrimitive.Trigger, { "data-slot": "sheet-trigger", ...props });
11
+ }
12
+ function SheetClose({ ...props }) {
13
+ return /* @__PURE__ */ jsx(SheetPrimitive.Close, { "data-slot": "sheet-close", ...props });
14
+ }
15
+ function SheetPortal({ ...props }) {
16
+ return /* @__PURE__ */ jsx(SheetPrimitive.Portal, { "data-slot": "sheet-portal", ...props });
17
+ }
18
+ function SheetOverlay({ className, ...props }) {
19
+ return /* @__PURE__ */ jsx(
20
+ SheetPrimitive.Overlay,
21
+ {
22
+ "data-slot": "sheet-overlay",
23
+ className: cn(
24
+ "data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/50",
25
+ className
26
+ ),
27
+ ...props
28
+ }
29
+ );
30
+ }
31
+ function SheetContent({
32
+ className,
33
+ children,
34
+ side = "right",
35
+ ...props
36
+ }) {
37
+ return /* @__PURE__ */ jsxs(SheetPortal, { children: [
38
+ /* @__PURE__ */ jsx(SheetOverlay, {}),
39
+ /* @__PURE__ */ jsxs(
40
+ SheetPrimitive.Content,
41
+ {
42
+ "data-slot": "sheet-content",
43
+ className: cn(
44
+ "bg-background data-[state=open]:animate-in data-[state=closed]:animate-out fixed z-50 flex flex-col gap-4 shadow-lg transition ease-in-out data-[state=closed]:duration-300 data-[state=open]:duration-300",
45
+ side === "right" && "data-[state=closed]:slide-out-to-right data-[state=closed]:rtl:slide-out-to-left data-[state=open]:slide-in-from-right data-[state=open]:rtl:slide-in-from-left inset-y-0 end-0 h-full w-3/4 border-s sm:max-w-sm",
46
+ side === "left" && "data-[state=closed]:slide-out-to-left data-[state=closed]:rtl:slide-out-to-right data-[state=open]:slide-in-from-left data-[state=open]:rtl:slide-in-from-right inset-y-0 start-0 h-full w-3/4 border-e sm:max-w-sm",
47
+ side === "top" && "data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top inset-x-0 top-0 h-auto border-b",
48
+ side === "bottom" && "data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom inset-x-0 bottom-0 h-auto border-t",
49
+ className
50
+ ),
51
+ ...props,
52
+ children: [
53
+ children,
54
+ /* @__PURE__ */ jsxs(SheetPrimitive.Close, { className: "absolute top-4 end-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-brand-default focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-selection data-[state=open]:text-foreground-muted", children: [
55
+ /* @__PURE__ */ jsx(XIcon, { className: "size-4" }),
56
+ /* @__PURE__ */ jsx("span", { className: "sr-only", children: "\u0628\u0633\u062A\u0646" })
57
+ ] })
58
+ ]
59
+ }
60
+ )
61
+ ] });
62
+ }
63
+ function SheetHeader({ className, ...props }) {
64
+ return /* @__PURE__ */ jsx("div", { "data-slot": "sheet-header", className: cn("flex flex-col gap-1.5 p-4", className), ...props });
65
+ }
66
+ function SheetBody({ className, ...props }) {
67
+ return /* @__PURE__ */ jsx("div", { "data-slot": "sheet-body", className: cn("flex-1 overflow-y-auto px-4 pb-4", className), ...props });
68
+ }
69
+ function SheetFooter({ className, ...props }) {
70
+ return /* @__PURE__ */ jsx("div", { "data-slot": "sheet-footer", className: cn("mt-auto flex flex-col gap-2 p-4", className), ...props });
71
+ }
72
+ function SheetTitle({ className, ...props }) {
73
+ return /* @__PURE__ */ jsx(
74
+ SheetPrimitive.Title,
75
+ {
76
+ "data-slot": "sheet-title",
77
+ className: cn("text-foreground font-semibold", className),
78
+ ...props
79
+ }
80
+ );
81
+ }
82
+ function SheetDescription({ className, ...props }) {
83
+ return /* @__PURE__ */ jsx(
84
+ SheetPrimitive.Description,
85
+ {
86
+ "data-slot": "sheet-description",
87
+ className: cn("text-muted-foreground text-sm", className),
88
+ ...props
89
+ }
90
+ );
91
+ }
92
+ Sheet.displayName = "Sheet";
93
+ SheetTrigger.displayName = "SheetTrigger";
94
+ SheetClose.displayName = "SheetClose";
95
+ SheetPortal.displayName = "SheetPortal";
96
+ SheetOverlay.displayName = "SheetOverlay";
97
+ SheetContent.displayName = "SheetContent";
98
+ SheetHeader.displayName = "SheetHeader";
99
+ SheetBody.displayName = "SheetBody";
100
+ SheetFooter.displayName = "SheetFooter";
101
+ SheetTitle.displayName = "SheetTitle";
102
+ SheetDescription.displayName = "SheetDescription";
103
+
104
+ export { Sheet, SheetBody, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetTitle, SheetTrigger };
105
+ //# sourceMappingURL=chunk-SFXV2DUH.js.map
106
+ //# sourceMappingURL=chunk-SFXV2DUH.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/ui/sheet.tsx"],"names":[],"mappings":"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","file":"chunk-SFXV2DUH.js","sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport * as SheetPrimitive from '@radix-ui/react-dialog'\nimport { XIcon } from 'lucide-react'\n\nimport { cn } from '@/lib/utils'\n\nfunction Sheet({ ...props }: React.ComponentProps<typeof SheetPrimitive.Root>) {\n return <SheetPrimitive.Root data-slot=\"sheet\" {...props} />\n}\n\nfunction SheetTrigger({ ...props }: React.ComponentProps<typeof SheetPrimitive.Trigger>) {\n return <SheetPrimitive.Trigger data-slot=\"sheet-trigger\" {...props} />\n}\n\nfunction SheetClose({ ...props }: React.ComponentProps<typeof SheetPrimitive.Close>) {\n return <SheetPrimitive.Close data-slot=\"sheet-close\" {...props} />\n}\n\nfunction SheetPortal({ ...props }: React.ComponentProps<typeof SheetPrimitive.Portal>) {\n return <SheetPrimitive.Portal data-slot=\"sheet-portal\" {...props} />\n}\n\nfunction SheetOverlay({ className, ...props }: React.ComponentProps<typeof SheetPrimitive.Overlay>) {\n return (\n <SheetPrimitive.Overlay\n data-slot=\"sheet-overlay\"\n className={cn(\n 'data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/50',\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SheetContent({\n className,\n children,\n side = 'right',\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Content> & {\n side?: 'top' | 'right' | 'bottom' | 'left'\n}) {\n return (\n <SheetPortal>\n <SheetOverlay />\n <SheetPrimitive.Content\n data-slot=\"sheet-content\"\n className={cn(\n 'bg-background data-[state=open]:animate-in data-[state=closed]:animate-out fixed z-50 flex flex-col gap-4 shadow-lg transition ease-in-out data-[state=closed]:duration-300 data-[state=open]:duration-300',\n side === 'right' &&\n 'data-[state=closed]:slide-out-to-right data-[state=closed]:rtl:slide-out-to-left data-[state=open]:slide-in-from-right data-[state=open]:rtl:slide-in-from-left inset-y-0 end-0 h-full w-3/4 border-s sm:max-w-sm',\n side === 'left' &&\n 'data-[state=closed]:slide-out-to-left data-[state=closed]:rtl:slide-out-to-right data-[state=open]:slide-in-from-left data-[state=open]:rtl:slide-in-from-right inset-y-0 start-0 h-full w-3/4 border-e sm:max-w-sm',\n side === 'top' &&\n 'data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top inset-x-0 top-0 h-auto border-b',\n side === 'bottom' &&\n 'data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom inset-x-0 bottom-0 h-auto border-t',\n className\n )}\n {...props}\n >\n {children}\n <SheetPrimitive.Close className=\"absolute top-4 end-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-brand-default focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-selection data-[state=open]:text-foreground-muted\">\n <XIcon className=\"size-4\" />\n <span className=\"sr-only\">بستن</span>\n </SheetPrimitive.Close>\n </SheetPrimitive.Content>\n </SheetPortal>\n )\n}\n\nfunction SheetHeader({ className, ...props }: React.ComponentProps<'div'>) {\n return <div data-slot=\"sheet-header\" className={cn('flex flex-col gap-1.5 p-4', className)} {...props} />\n}\n\nfunction SheetBody({ className, ...props }: React.ComponentProps<'div'>) {\n return <div data-slot=\"sheet-body\" className={cn('flex-1 overflow-y-auto px-4 pb-4', className)} {...props} />\n}\n\nfunction SheetFooter({ className, ...props }: React.ComponentProps<'div'>) {\n return <div data-slot=\"sheet-footer\" className={cn('mt-auto flex flex-col gap-2 p-4', className)} {...props} />\n}\n\nfunction SheetTitle({ className, ...props }: React.ComponentProps<typeof SheetPrimitive.Title>) {\n return (\n <SheetPrimitive.Title\n data-slot=\"sheet-title\"\n className={cn('text-foreground font-semibold', className)}\n {...props}\n />\n )\n}\n\nfunction SheetDescription({ className, ...props }: React.ComponentProps<typeof SheetPrimitive.Description>) {\n return (\n <SheetPrimitive.Description\n data-slot=\"sheet-description\"\n className={cn('text-muted-foreground text-sm', className)}\n {...props}\n />\n )\n}\n\nSheet.displayName = 'Sheet'\nSheetTrigger.displayName = 'SheetTrigger'\nSheetClose.displayName = 'SheetClose'\nSheetPortal.displayName = 'SheetPortal'\nSheetOverlay.displayName = 'SheetOverlay'\nSheetContent.displayName = 'SheetContent'\nSheetHeader.displayName = 'SheetHeader'\nSheetBody.displayName = 'SheetBody'\nSheetFooter.displayName = 'SheetFooter'\nSheetTitle.displayName = 'SheetTitle'\nSheetDescription.displayName = 'SheetDescription'\n\nexport {\n Sheet,\n SheetTrigger,\n SheetClose,\n SheetContent,\n SheetHeader,\n SheetBody,\n SheetFooter,\n SheetTitle,\n SheetDescription,\n}\n"]}
@@ -0,0 +1,152 @@
1
+ 'use strict';
2
+
3
+ var chunkNV4JOKWL_cjs = require('./chunk-NV4JOKWL.cjs');
4
+ var React = require('react');
5
+ var classVarianceAuthority = require('class-variance-authority');
6
+ var jsxRuntime = require('react/jsx-runtime');
7
+
8
+ function _interopNamespace(e) {
9
+ if (e && e.__esModule) return e;
10
+ var n = Object.create(null);
11
+ if (e) {
12
+ Object.keys(e).forEach(function (k) {
13
+ if (k !== 'default') {
14
+ var d = Object.getOwnPropertyDescriptor(e, k);
15
+ Object.defineProperty(n, k, d.get ? d : {
16
+ enumerable: true,
17
+ get: function () { return e[k]; }
18
+ });
19
+ }
20
+ });
21
+ }
22
+ n.default = e;
23
+ return Object.freeze(n);
24
+ }
25
+
26
+ var React__namespace = /*#__PURE__*/_interopNamespace(React);
27
+
28
+ var cardVariants = classVarianceAuthority.cva(
29
+ // A Card is a visual container, not a focusable surface. Do not apply
30
+ // focus-within rings to the base — that bleeds the ring of whatever
31
+ // input/button inside has focus onto the whole card. The `interactive`
32
+ // variant below opts into focus-visible explicitly because it IS clickable.
33
+ "overflow-hidden rounded-lg text-card-foreground transition-all duration-200",
34
+ {
35
+ variants: {
36
+ variant: {
37
+ default: "border bg-surface-100 shadow-sm",
38
+ outlined: "border-2 border-border bg-transparent",
39
+ elevated: "bg-surface-100 shadow-card hover:shadow-lg",
40
+ interactive: "border bg-surface-100 shadow-sm hover:-translate-y-0.5 hover:shadow-lg active:translate-y-0 active:shadow-md cursor-pointer focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2",
41
+ glass: "border border-border/50 bg-background/80 backdrop-blur-sm shadow-sm"
42
+ },
43
+ size: {
44
+ sm: "",
45
+ md: "",
46
+ lg: ""
47
+ }
48
+ },
49
+ defaultVariants: {
50
+ variant: "default",
51
+ size: "md"
52
+ }
53
+ }
54
+ );
55
+ var Card = React__namespace.forwardRef(({ className, variant, size = "md", ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
56
+ "div",
57
+ {
58
+ ref,
59
+ "data-slot": "card",
60
+ "data-size": size,
61
+ className: chunkNV4JOKWL_cjs.cn(cardVariants({ variant, size }), className),
62
+ ...props
63
+ }
64
+ ));
65
+ Card.displayName = "Card";
66
+ var CardHeader = React__namespace.forwardRef(
67
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
68
+ "div",
69
+ {
70
+ ref,
71
+ "data-slot": "card-header",
72
+ className: chunkNV4JOKWL_cjs.cn(
73
+ "flex flex-col space-y-1.5 border-b",
74
+ // Size variants inherited from Card
75
+ "[[data-size=sm]_&]:py-3 [[data-size=sm]_&]:px-4",
76
+ "[[data-size=md]_&]:py-4 [[data-size=md]_&]:px-6",
77
+ "[[data-size=lg]_&]:py-5 [[data-size=lg]_&]:px-8",
78
+ className
79
+ ),
80
+ ...props
81
+ }
82
+ )
83
+ );
84
+ CardHeader.displayName = "CardHeader";
85
+ var CardTitle = React__namespace.forwardRef(
86
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
87
+ "h3",
88
+ {
89
+ ref,
90
+ "data-slot": "card-title",
91
+ className: chunkNV4JOKWL_cjs.cn(
92
+ "font-semibold leading-tight tracking-tight",
93
+ "[[data-size=sm]_&]:text-sm",
94
+ "[[data-size=md]_&]:text-base",
95
+ "[[data-size=lg]_&]:text-lg",
96
+ className
97
+ ),
98
+ ...props
99
+ }
100
+ )
101
+ );
102
+ CardTitle.displayName = "CardTitle";
103
+ var CardDescription = React__namespace.forwardRef(
104
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx("p", { ref, "data-slot": "card-description", className: chunkNV4JOKWL_cjs.cn("text-sm text-foreground-muted", className), ...props })
105
+ );
106
+ CardDescription.displayName = "CardDescription";
107
+ var CardContent = React__namespace.forwardRef(
108
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
109
+ "div",
110
+ {
111
+ ref,
112
+ "data-slot": "card-content",
113
+ className: chunkNV4JOKWL_cjs.cn(
114
+ "border-b last:border-none",
115
+ "[[data-size=sm]_&]:py-3 [[data-size=sm]_&]:px-4",
116
+ "[[data-size=md]_&]:py-4 [[data-size=md]_&]:px-6",
117
+ "[[data-size=lg]_&]:py-5 [[data-size=lg]_&]:px-8",
118
+ className
119
+ ),
120
+ ...props
121
+ }
122
+ )
123
+ );
124
+ CardContent.displayName = "CardContent";
125
+ var CardFooter = React__namespace.forwardRef(
126
+ ({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
127
+ "div",
128
+ {
129
+ ref,
130
+ "data-slot": "card-footer",
131
+ className: chunkNV4JOKWL_cjs.cn(
132
+ "flex items-center",
133
+ "[[data-size=sm]_&]:py-3 [[data-size=sm]_&]:px-4",
134
+ "[[data-size=md]_&]:py-4 [[data-size=md]_&]:px-6",
135
+ "[[data-size=lg]_&]:py-5 [[data-size=lg]_&]:px-8",
136
+ className
137
+ ),
138
+ ...props
139
+ }
140
+ )
141
+ );
142
+ CardFooter.displayName = "CardFooter";
143
+
144
+ exports.Card = Card;
145
+ exports.CardContent = CardContent;
146
+ exports.CardDescription = CardDescription;
147
+ exports.CardFooter = CardFooter;
148
+ exports.CardHeader = CardHeader;
149
+ exports.CardTitle = CardTitle;
150
+ exports.cardVariants = cardVariants;
151
+ //# sourceMappingURL=chunk-SXEPGD4Z.cjs.map
152
+ //# sourceMappingURL=chunk-SXEPGD4Z.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/ui/card.tsx"],"names":["cva","React","jsx","cn"],"mappings":"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","file":"chunk-SXEPGD4Z.cjs","sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport { cva, type VariantProps } from 'class-variance-authority'\n\nimport { cn } from '@/lib/utils'\n\n/* -------------------------------------------------------------------------- */\n/* Card */\n/* -------------------------------------------------------------------------- */\n\nconst cardVariants = cva(\n // A Card is a visual container, not a focusable surface. Do not apply\n // focus-within rings to the base — that bleeds the ring of whatever\n // input/button inside has focus onto the whole card. The `interactive`\n // variant below opts into focus-visible explicitly because it IS clickable.\n 'overflow-hidden rounded-lg text-card-foreground transition-all duration-200',\n {\n variants: {\n variant: {\n default: 'border bg-surface-100 shadow-sm',\n outlined: 'border-2 border-border bg-transparent',\n elevated: 'bg-surface-100 shadow-card hover:shadow-lg',\n interactive:\n 'border bg-surface-100 shadow-sm hover:-translate-y-0.5 hover:shadow-lg active:translate-y-0 active:shadow-md cursor-pointer focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2',\n glass: 'border border-border/50 bg-background/80 backdrop-blur-sm shadow-sm',\n },\n size: {\n sm: '',\n md: '',\n lg: '',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'md',\n },\n }\n)\n\ninterface CardProps extends React.HTMLAttributes<HTMLDivElement>, VariantProps<typeof cardVariants> {}\n\nconst Card = React.forwardRef<HTMLDivElement, CardProps>(({ className, variant, size = 'md', ...props }, ref) => (\n <div\n ref={ref}\n data-slot=\"card\"\n data-size={size}\n className={cn(cardVariants({ variant, size }), className)}\n {...props}\n />\n))\nCard.displayName = 'Card'\n\n/* -------------------------------------------------------------------------- */\n/* CardHeader */\n/* -------------------------------------------------------------------------- */\n\nconst CardHeader = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n data-slot=\"card-header\"\n className={cn(\n 'flex flex-col space-y-1.5 border-b',\n // Size variants inherited from Card\n '[[data-size=sm]_&]:py-3 [[data-size=sm]_&]:px-4',\n '[[data-size=md]_&]:py-4 [[data-size=md]_&]:px-6',\n '[[data-size=lg]_&]:py-5 [[data-size=lg]_&]:px-8',\n className\n )}\n {...props}\n />\n )\n)\nCardHeader.displayName = 'CardHeader'\n\n/* -------------------------------------------------------------------------- */\n/* CardTitle */\n/* -------------------------------------------------------------------------- */\n\nconst CardTitle = React.forwardRef<HTMLParagraphElement, React.HTMLAttributes<HTMLHeadingElement>>(\n ({ className, ...props }, ref) => (\n <h3\n ref={ref}\n data-slot=\"card-title\"\n className={cn(\n 'font-semibold leading-tight tracking-tight',\n '[[data-size=sm]_&]:text-sm',\n '[[data-size=md]_&]:text-base',\n '[[data-size=lg]_&]:text-lg',\n className\n )}\n {...props}\n />\n )\n)\nCardTitle.displayName = 'CardTitle'\n\n/* -------------------------------------------------------------------------- */\n/* CardDescription */\n/* -------------------------------------------------------------------------- */\n\nconst CardDescription = React.forwardRef<HTMLParagraphElement, React.HTMLAttributes<HTMLParagraphElement>>(\n ({ className, ...props }, ref) => (\n <p ref={ref} data-slot=\"card-description\" className={cn('text-sm text-foreground-muted', className)} {...props} />\n )\n)\nCardDescription.displayName = 'CardDescription'\n\n/* -------------------------------------------------------------------------- */\n/* CardContent */\n/* -------------------------------------------------------------------------- */\n\nconst CardContent = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n data-slot=\"card-content\"\n className={cn(\n 'border-b last:border-none',\n '[[data-size=sm]_&]:py-3 [[data-size=sm]_&]:px-4',\n '[[data-size=md]_&]:py-4 [[data-size=md]_&]:px-6',\n '[[data-size=lg]_&]:py-5 [[data-size=lg]_&]:px-8',\n className\n )}\n {...props}\n />\n )\n)\nCardContent.displayName = 'CardContent'\n\n/* -------------------------------------------------------------------------- */\n/* CardFooter */\n/* -------------------------------------------------------------------------- */\n\nconst CardFooter = React.forwardRef<HTMLDivElement, React.HTMLAttributes<HTMLDivElement>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n data-slot=\"card-footer\"\n className={cn(\n 'flex items-center',\n '[[data-size=sm]_&]:py-3 [[data-size=sm]_&]:px-4',\n '[[data-size=md]_&]:py-4 [[data-size=md]_&]:px-6',\n '[[data-size=lg]_&]:py-5 [[data-size=lg]_&]:px-8',\n className\n )}\n {...props}\n />\n )\n)\nCardFooter.displayName = 'CardFooter'\n\nexport { Card, cardVariants, CardHeader, CardFooter, CardTitle, CardDescription, CardContent }\nexport type { CardProps }\n"]}
@@ -0,0 +1,107 @@
1
+ 'use strict';
2
+
3
+ var chunkNV4JOKWL_cjs = require('./chunk-NV4JOKWL.cjs');
4
+ var React = require('react');
5
+ var SeparatorPrimitive = require('@radix-ui/react-separator');
6
+ var jsxRuntime = require('react/jsx-runtime');
7
+
8
+ function _interopNamespace(e) {
9
+ if (e && e.__esModule) return e;
10
+ var n = Object.create(null);
11
+ if (e) {
12
+ Object.keys(e).forEach(function (k) {
13
+ if (k !== 'default') {
14
+ var d = Object.getOwnPropertyDescriptor(e, k);
15
+ Object.defineProperty(n, k, d.get ? d : {
16
+ enumerable: true,
17
+ get: function () { return e[k]; }
18
+ });
19
+ }
20
+ });
21
+ }
22
+ n.default = e;
23
+ return Object.freeze(n);
24
+ }
25
+
26
+ var React__namespace = /*#__PURE__*/_interopNamespace(React);
27
+ var SeparatorPrimitive__namespace = /*#__PURE__*/_interopNamespace(SeparatorPrimitive);
28
+
29
+ var Separator = React__namespace.forwardRef(
30
+ ({ className, orientation = "horizontal", decorative = true, children, ...props }, ref) => {
31
+ if (!children) {
32
+ return /* @__PURE__ */ jsxRuntime.jsx(
33
+ SeparatorPrimitive__namespace.Root,
34
+ {
35
+ ref,
36
+ "data-slot": "separator",
37
+ decorative,
38
+ orientation,
39
+ className: chunkNV4JOKWL_cjs.cn(
40
+ "shrink-0 bg-border",
41
+ orientation === "horizontal" ? "h-[1px] w-full" : "h-full w-[1px]",
42
+ className
43
+ ),
44
+ ...props
45
+ }
46
+ );
47
+ }
48
+ if (orientation === "horizontal") {
49
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { ref, "data-slot": "separator", className: chunkNV4JOKWL_cjs.cn("relative flex items-center w-full", className), ...props, children: [
50
+ /* @__PURE__ */ jsxRuntime.jsx(
51
+ SeparatorPrimitive__namespace.Root,
52
+ {
53
+ "data-slot": "separator-line",
54
+ decorative,
55
+ orientation: "horizontal",
56
+ className: "flex-1 h-[1px] bg-border"
57
+ }
58
+ ),
59
+ /* @__PURE__ */ jsxRuntime.jsx("span", { "data-slot": "separator-content", className: "px-3 text-sm text-muted-foreground whitespace-nowrap", children }),
60
+ /* @__PURE__ */ jsxRuntime.jsx(
61
+ SeparatorPrimitive__namespace.Root,
62
+ {
63
+ "data-slot": "separator-line",
64
+ decorative,
65
+ orientation: "horizontal",
66
+ className: "flex-1 h-[1px] bg-border"
67
+ }
68
+ )
69
+ ] });
70
+ }
71
+ return /* @__PURE__ */ jsxRuntime.jsxs(
72
+ "div",
73
+ {
74
+ ref,
75
+ "data-slot": "separator",
76
+ className: chunkNV4JOKWL_cjs.cn("relative flex flex-col items-center h-full", className),
77
+ ...props,
78
+ children: [
79
+ /* @__PURE__ */ jsxRuntime.jsx(
80
+ SeparatorPrimitive__namespace.Root,
81
+ {
82
+ "data-slot": "separator-line",
83
+ decorative,
84
+ orientation: "vertical",
85
+ className: "flex-1 w-[1px] bg-border"
86
+ }
87
+ ),
88
+ /* @__PURE__ */ jsxRuntime.jsx("span", { "data-slot": "separator-content", className: "py-3 text-sm text-muted-foreground", children }),
89
+ /* @__PURE__ */ jsxRuntime.jsx(
90
+ SeparatorPrimitive__namespace.Root,
91
+ {
92
+ "data-slot": "separator-line",
93
+ decorative,
94
+ orientation: "vertical",
95
+ className: "flex-1 w-[1px] bg-border"
96
+ }
97
+ )
98
+ ]
99
+ }
100
+ );
101
+ }
102
+ );
103
+ Separator.displayName = SeparatorPrimitive__namespace.Root.displayName;
104
+
105
+ exports.Separator = Separator;
106
+ //# sourceMappingURL=chunk-SZMVOHT7.cjs.map
107
+ //# sourceMappingURL=chunk-SZMVOHT7.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/ui/separator.tsx"],"names":["React","jsx","SeparatorPrimitive","cn","jsxs"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAWA,IAAM,SAAA,GAAkBA,gBAAA,CAAA,UAAA;AAAA,EACtB,CAAC,EAAE,SAAA,EAAW,WAAA,GAAc,YAAA,EAAc,UAAA,GAAa,IAAA,EAAM,QAAA,EAAU,GAAG,KAAA,EAAM,EAAG,GAAA,KAAQ;AAEzF,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,uBACEC,cAAA;AAAA,QAAoBC,6BAAA,CAAA,IAAA;AAAA,QAAnB;AAAA,UACC,GAAA;AAAA,UACA,WAAA,EAAU,WAAA;AAAA,UACV,UAAA;AAAA,UACA,WAAA;AAAA,UACA,SAAA,EAAWC,oBAAA;AAAA,YACT,oBAAA;AAAA,YACA,WAAA,KAAgB,eAAe,gBAAA,GAAmB,gBAAA;AAAA,YAClD;AAAA,WACF;AAAA,UACC,GAAG;AAAA;AAAA,OACN;AAAA,IAEJ;AAGA,IAAA,IAAI,gBAAgB,YAAA,EAAc;AAChC,MAAA,uBACEC,eAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAU,WAAA,EAAU,WAAA,EAAY,SAAA,EAAWD,oBAAA,CAAG,mCAAA,EAAqC,SAAS,CAAA,EAAI,GAAG,KAAA,EACtG,QAAA,EAAA;AAAA,wBAAAF,cAAA;AAAA,UAAoBC,6BAAA,CAAA,IAAA;AAAA,UAAnB;AAAA,YACC,WAAA,EAAU,gBAAA;AAAA,YACV,UAAA;AAAA,YACA,WAAA,EAAY,YAAA;AAAA,YACZ,SAAA,EAAU;AAAA;AAAA,SACZ;AAAA,uCACC,MAAA,EAAA,EAAK,WAAA,EAAU,mBAAA,EAAoB,SAAA,EAAU,wDAC3C,QAAA,EACH,CAAA;AAAA,wBACAD,cAAA;AAAA,UAAoBC,6BAAA,CAAA,IAAA;AAAA,UAAnB;AAAA,YACC,WAAA,EAAU,gBAAA;AAAA,YACV,UAAA;AAAA,YACA,WAAA,EAAY,YAAA;AAAA,YACZ,SAAA,EAAU;AAAA;AAAA;AACZ,OAAA,EACF,CAAA;AAAA,IAEJ;AAGA,IAAA,uBACEE,eAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,GAAA;AAAA,QACA,WAAA,EAAU,WAAA;AAAA,QACV,SAAA,EAAWD,oBAAA,CAAG,4CAAA,EAA8C,SAAS,CAAA;AAAA,QACpE,GAAG,KAAA;AAAA,QAEJ,QAAA,EAAA;AAAA,0BAAAF,cAAA;AAAA,YAAoBC,6BAAA,CAAA,IAAA;AAAA,YAAnB;AAAA,cACC,WAAA,EAAU,gBAAA;AAAA,cACV,UAAA;AAAA,cACA,WAAA,EAAY,UAAA;AAAA,cACZ,SAAA,EAAU;AAAA;AAAA,WACZ;AAAA,yCACC,MAAA,EAAA,EAAK,WAAA,EAAU,mBAAA,EAAoB,SAAA,EAAU,sCAC3C,QAAA,EACH,CAAA;AAAA,0BACAD,cAAA;AAAA,YAAoBC,6BAAA,CAAA,IAAA;AAAA,YAAnB;AAAA,cACC,WAAA,EAAU,gBAAA;AAAA,cACV,UAAA;AAAA,cACA,WAAA,EAAY,UAAA;AAAA,cACZ,SAAA,EAAU;AAAA;AAAA;AACZ;AAAA;AAAA,KACF;AAAA,EAEJ;AACF;AACA,SAAA,CAAU,cAAiCA,6BAAA,CAAA,IAAA,CAAK,WAAA","file":"chunk-SZMVOHT7.cjs","sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport * as SeparatorPrimitive from '@radix-ui/react-separator'\n\nimport { cn } from '@/lib/utils'\n\ninterface SeparatorProps extends React.ComponentPropsWithoutRef<typeof SeparatorPrimitive.Root> {\n children?: React.ReactNode\n}\n\nconst Separator = React.forwardRef<React.ElementRef<typeof SeparatorPrimitive.Root>, SeparatorProps>(\n ({ className, orientation = 'horizontal', decorative = true, children, ...props }, ref) => {\n // If there's no children, render the default separator\n if (!children) {\n return (\n <SeparatorPrimitive.Root\n ref={ref}\n data-slot=\"separator\"\n decorative={decorative}\n orientation={orientation}\n className={cn(\n 'shrink-0 bg-border',\n orientation === 'horizontal' ? 'h-[1px] w-full' : 'h-full w-[1px]',\n className\n )}\n {...props}\n />\n )\n }\n\n // If there are children (text), render separator with text\n if (orientation === 'horizontal') {\n return (\n <div ref={ref} data-slot=\"separator\" className={cn('relative flex items-center w-full', className)} {...props}>\n <SeparatorPrimitive.Root\n data-slot=\"separator-line\"\n decorative={decorative}\n orientation=\"horizontal\"\n className=\"flex-1 h-[1px] bg-border\"\n />\n <span data-slot=\"separator-content\" className=\"px-3 text-sm text-muted-foreground whitespace-nowrap\">\n {children}\n </span>\n <SeparatorPrimitive.Root\n data-slot=\"separator-line\"\n decorative={decorative}\n orientation=\"horizontal\"\n className=\"flex-1 h-[1px] bg-border\"\n />\n </div>\n )\n }\n\n // For vertical orientation with text (less common)\n return (\n <div\n ref={ref}\n data-slot=\"separator\"\n className={cn('relative flex flex-col items-center h-full', className)}\n {...props}\n >\n <SeparatorPrimitive.Root\n data-slot=\"separator-line\"\n decorative={decorative}\n orientation=\"vertical\"\n className=\"flex-1 w-[1px] bg-border\"\n />\n <span data-slot=\"separator-content\" className=\"py-3 text-sm text-muted-foreground\">\n {children}\n </span>\n <SeparatorPrimitive.Root\n data-slot=\"separator-line\"\n decorative={decorative}\n orientation=\"vertical\"\n className=\"flex-1 w-[1px] bg-border\"\n />\n </div>\n )\n }\n)\nSeparator.displayName = SeparatorPrimitive.Root.displayName\n\nexport { Separator }\n"]}
@@ -0,0 +1,151 @@
1
+ 'use strict';
2
+
3
+ var React = require('react');
4
+
5
+ function _interopNamespace(e) {
6
+ if (e && e.__esModule) return e;
7
+ var n = Object.create(null);
8
+ if (e) {
9
+ Object.keys(e).forEach(function (k) {
10
+ if (k !== 'default') {
11
+ var d = Object.getOwnPropertyDescriptor(e, k);
12
+ Object.defineProperty(n, k, d.get ? d : {
13
+ enumerable: true,
14
+ get: function () { return e[k]; }
15
+ });
16
+ }
17
+ });
18
+ }
19
+ n.default = e;
20
+ return Object.freeze(n);
21
+ }
22
+
23
+ var React__namespace = /*#__PURE__*/_interopNamespace(React);
24
+
25
+ // src/hooks/use-hotkeys.ts
26
+ function isMac() {
27
+ if (typeof navigator === "undefined") return false;
28
+ const ua = navigator.userAgentData?.platform;
29
+ const platform = ua ?? navigator.platform ?? "";
30
+ return /mac|darwin/i.test(platform);
31
+ }
32
+ var SPECIAL_KEY_MAP = {
33
+ " ": "space",
34
+ spacebar: "space",
35
+ esc: "escape",
36
+ del: "delete",
37
+ return: "enter",
38
+ arrowup: "up",
39
+ arrowdown: "down",
40
+ arrowleft: "left",
41
+ arrowright: "right"
42
+ };
43
+ function normalizeKey(raw) {
44
+ const lower = raw.toLowerCase();
45
+ return SPECIAL_KEY_MAP[lower] ?? lower;
46
+ }
47
+ function parseCombo(combo) {
48
+ const parts = combo.toLowerCase().split("+").map((s) => s.trim()).filter(Boolean);
49
+ const result = {
50
+ mod: false,
51
+ ctrl: false,
52
+ cmd: false,
53
+ shift: false,
54
+ alt: false,
55
+ meta: false,
56
+ key: ""
57
+ };
58
+ for (const p of parts) {
59
+ if (p === "mod") result.mod = true;
60
+ else if (p === "ctrl" || p === "control") result.ctrl = true;
61
+ else if (p === "cmd" || p === "command" || p === "win") result.cmd = true;
62
+ else if (p === "shift") result.shift = true;
63
+ else if (p === "alt" || p === "option" || p === "opt") result.alt = true;
64
+ else if (p === "meta") result.meta = true;
65
+ else result.key = normalizeKey(p);
66
+ }
67
+ return result;
68
+ }
69
+ function matches(parsed, event, mac) {
70
+ const requiredCmd = parsed.cmd || parsed.mod && mac;
71
+ const requiredCtrl = parsed.ctrl || parsed.mod && !mac;
72
+ if (requiredCmd !== event.metaKey) return false;
73
+ if (requiredCtrl !== event.ctrlKey) return false;
74
+ if (parsed.shift !== event.shiftKey) return false;
75
+ if (parsed.alt !== event.altKey) return false;
76
+ if (parsed.meta && !mac && !event.metaKey) return false;
77
+ if (!parsed.key) return true;
78
+ const eventKey = normalizeKey(event.key);
79
+ return eventKey === parsed.key;
80
+ }
81
+ function isEditable(el) {
82
+ if (!(el instanceof HTMLElement)) return false;
83
+ if (el.isContentEditable) return true;
84
+ const tag = el.tagName;
85
+ if (tag === "INPUT") {
86
+ const type = el.type;
87
+ return !["button", "submit", "reset", "checkbox", "radio", "range", "color", "file"].includes(type);
88
+ }
89
+ return tag === "TEXTAREA" || tag === "SELECT";
90
+ }
91
+ function hasModifier(event) {
92
+ return event.metaKey || event.ctrlKey || event.altKey;
93
+ }
94
+ function resolveTarget(target) {
95
+ if (!target) return typeof document !== "undefined" ? document : null;
96
+ if (target instanceof Document) return target;
97
+ if ("current" in target) return target.current ?? null;
98
+ return target;
99
+ }
100
+ function useHotkeys(combo, handler, options = {}) {
101
+ const { preventDefault = true, ignoreWhenTyping = true, enabled = true, target } = options;
102
+ const handlerRef = React__namespace.useRef(handler);
103
+ React__namespace.useEffect(() => {
104
+ handlerRef.current = handler;
105
+ }, [handler]);
106
+ React__namespace.useEffect(() => {
107
+ if (!enabled) return;
108
+ const resolvedTarget = resolveTarget(target);
109
+ if (!resolvedTarget) return;
110
+ const combos = (Array.isArray(combo) ? combo : [combo]).map(parseCombo);
111
+ const mac = isMac();
112
+ const listener = (event) => {
113
+ const keyboardEvent = event;
114
+ const matched = combos.find((parsed) => matches(parsed, keyboardEvent, mac));
115
+ if (!matched) return;
116
+ if (ignoreWhenTyping && isEditable(keyboardEvent.target) && !hasModifier(keyboardEvent)) {
117
+ return;
118
+ }
119
+ if (preventDefault) keyboardEvent.preventDefault();
120
+ handlerRef.current(keyboardEvent);
121
+ };
122
+ resolvedTarget.addEventListener("keydown", listener);
123
+ return () => {
124
+ resolvedTarget.removeEventListener("keydown", listener);
125
+ };
126
+ }, [Array.isArray(combo) ? combo.join("|") : combo, enabled, ignoreWhenTyping, preventDefault, target]);
127
+ }
128
+ function formatHotkey(combo) {
129
+ const mac = isMac();
130
+ return combo.split("+").map((p) => {
131
+ const t = p.trim().toLowerCase();
132
+ if (t === "mod") return mac ? "\u2318" : "Ctrl";
133
+ if (t === "cmd" || t === "meta") return mac ? "\u2318" : "Win";
134
+ if (t === "ctrl" || t === "control") return mac ? "\u2303" : "Ctrl";
135
+ if (t === "shift") return mac ? "\u21E7" : "Shift";
136
+ if (t === "alt" || t === "option" || t === "opt") return mac ? "\u2325" : "Alt";
137
+ if (t === "enter" || t === "return") return "\u21B5";
138
+ if (t === "escape" || t === "esc") return "Esc";
139
+ if (t === "space") return "Space";
140
+ if (t === "up") return "\u2191";
141
+ if (t === "down") return "\u2193";
142
+ if (t === "left") return "\u2190";
143
+ if (t === "right") return "\u2192";
144
+ return t.length === 1 ? t.toUpperCase() : t;
145
+ }).join(mac ? "" : "+");
146
+ }
147
+
148
+ exports.formatHotkey = formatHotkey;
149
+ exports.useHotkeys = useHotkeys;
150
+ //# sourceMappingURL=chunk-U5FLLCGC.cjs.map
151
+ //# sourceMappingURL=chunk-U5FLLCGC.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/hooks/use-hotkeys.ts"],"names":["React"],"mappings":"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","file":"chunk-U5FLLCGC.cjs","sourcesContent":["'use client'\n\nimport * as React from 'react'\n\n/**\n * Hotkey string grammar:\n *\n * <part>[+<part>]*\n *\n * where each <part> is one of:\n * mod — Cmd on macOS, Ctrl on everything else (recommended)\n * ctrl / cmd — explicit, cross-platform tokens\n * shift | alt | meta\n * <single key> — lowercase character, 'space', 'enter', 'escape', 'tab',\n * arrow{up,down,left,right}, 'slash', 'backspace', etc.\n *\n * Examples:\n * 'mod+k' — ⌘K on macOS, CtrlK elsewhere\n * 'mod+shift+p'\n * 'escape'\n * 'ctrl+k' — explicit Ctrl (no Cmd fallback on macOS)\n *\n * Passing an array of strings is treated as an OR — any combo fires the handler.\n */\nexport type HotkeyCombo = string | readonly string[]\n\nexport interface UseHotkeysOptions {\n /**\n * When true, `event.preventDefault()` is called on matched combos.\n * Default: true. Useful to allow the browser's native 'mod+k' (address bar)\n * to keep working — set to false if the handler only does something conditionally.\n */\n preventDefault?: boolean\n /**\n * Skip the handler when focus is inside an editable control (input, textarea,\n * contenteditable). The exception: combos that include a modifier (mod/ctrl/\n * cmd/alt) still fire — they are unambiguous shortcuts, not typing.\n * Default: true.\n */\n ignoreWhenTyping?: boolean\n /**\n * When false, the hook unregisters its listener. Useful for conditionally\n * enabling shortcuts (e.g., only while a panel is open).\n * Default: true.\n */\n enabled?: boolean\n /**\n * DOM target. Defaults to `document`. Pass a ref for scoped shortcuts (e.g.,\n * only when a specific panel has focus within).\n */\n target?: React.RefObject<HTMLElement | null> | HTMLElement | Document | null\n}\n\nfunction isMac(): boolean {\n if (typeof navigator === 'undefined') return false\n // `userAgentData.platform` is the modern API; fall back to platform string.\n // Accept 'darwin' (nodejs tests) and 'MacIntel'/'Mac OS X'.\n const ua = (navigator as Navigator & { userAgentData?: { platform?: string } }).userAgentData?.platform\n const platform = ua ?? navigator.platform ?? ''\n return /mac|darwin/i.test(platform)\n}\n\nconst SPECIAL_KEY_MAP: Record<string, string> = {\n ' ': 'space',\n spacebar: 'space',\n esc: 'escape',\n del: 'delete',\n return: 'enter',\n arrowup: 'up',\n arrowdown: 'down',\n arrowleft: 'left',\n arrowright: 'right',\n}\n\nfunction normalizeKey(raw: string): string {\n const lower = raw.toLowerCase()\n return SPECIAL_KEY_MAP[lower] ?? lower\n}\n\ntype ParsedCombo = {\n mod: boolean\n ctrl: boolean\n cmd: boolean\n shift: boolean\n alt: boolean\n meta: boolean\n key: string\n}\n\nfunction parseCombo(combo: string): ParsedCombo {\n const parts = combo\n .toLowerCase()\n .split('+')\n .map((s) => s.trim())\n .filter(Boolean)\n const result: ParsedCombo = {\n mod: false,\n ctrl: false,\n cmd: false,\n shift: false,\n alt: false,\n meta: false,\n key: '',\n }\n for (const p of parts) {\n if (p === 'mod') result.mod = true\n else if (p === 'ctrl' || p === 'control') result.ctrl = true\n else if (p === 'cmd' || p === 'command' || p === 'win') result.cmd = true\n else if (p === 'shift') result.shift = true\n else if (p === 'alt' || p === 'option' || p === 'opt') result.alt = true\n else if (p === 'meta') result.meta = true\n else result.key = normalizeKey(p)\n }\n return result\n}\n\nfunction matches(parsed: ParsedCombo, event: KeyboardEvent, mac: boolean): boolean {\n // `mod` resolves to Cmd on macOS, Ctrl elsewhere. Track both sides of the combo.\n const requiredCmd = parsed.cmd || (parsed.mod && mac)\n const requiredCtrl = parsed.ctrl || (parsed.mod && !mac)\n\n if (requiredCmd !== event.metaKey) return false\n if (requiredCtrl !== event.ctrlKey) return false\n if (parsed.shift !== event.shiftKey) return false\n if (parsed.alt !== event.altKey) return false\n // `meta` (plain) aliases Cmd on macOS — avoid double-matching when both mod+meta are specified.\n if (parsed.meta && !mac && !event.metaKey) return false\n\n if (!parsed.key) return true\n const eventKey = normalizeKey(event.key)\n return eventKey === parsed.key\n}\n\nfunction isEditable(el: EventTarget | null): boolean {\n if (!(el instanceof HTMLElement)) return false\n if (el.isContentEditable) return true\n const tag = el.tagName\n if (tag === 'INPUT') {\n const type = (el as HTMLInputElement).type\n // Buttons and checkboxes aren't \"typing\" — don't block.\n return !['button', 'submit', 'reset', 'checkbox', 'radio', 'range', 'color', 'file'].includes(type)\n }\n return tag === 'TEXTAREA' || tag === 'SELECT'\n}\n\nfunction hasModifier(event: KeyboardEvent): boolean {\n return event.metaKey || event.ctrlKey || event.altKey\n}\n\nfunction resolveTarget(target: UseHotkeysOptions['target']): EventTarget | null {\n if (!target) return typeof document !== 'undefined' ? document : null\n if (target instanceof Document) return target\n if ('current' in target) return target.current ?? null\n return target\n}\n\n/**\n * Register a keyboard shortcut. Handler fires when the combo matches, respecting\n * `ignoreWhenTyping` (default true) — except when a modifier is part of the combo,\n * which always wins. Returns nothing; cleanup is automatic.\n *\n * @example\n * useHotkeys('mod+k', () => setOpen((v) => !v))\n * useHotkeys(['escape', 'mod+w'], close, { enabled: open })\n */\nexport function useHotkeys(\n combo: HotkeyCombo,\n handler: (event: KeyboardEvent) => void,\n options: UseHotkeysOptions = {}\n): void {\n const { preventDefault = true, ignoreWhenTyping = true, enabled = true, target } = options\n\n // Keep latest handler in a ref so callers don't need to memoize.\n const handlerRef = React.useRef(handler)\n React.useEffect(() => {\n handlerRef.current = handler\n }, [handler])\n\n React.useEffect(() => {\n if (!enabled) return\n const resolvedTarget = resolveTarget(target)\n if (!resolvedTarget) return\n\n const combos = (Array.isArray(combo) ? combo : [combo]).map(parseCombo)\n const mac = isMac()\n\n const listener = (event: Event) => {\n const keyboardEvent = event as KeyboardEvent\n const matched = combos.find((parsed) => matches(parsed, keyboardEvent, mac))\n if (!matched) return\n\n if (ignoreWhenTyping && isEditable(keyboardEvent.target) && !hasModifier(keyboardEvent)) {\n return\n }\n\n if (preventDefault) keyboardEvent.preventDefault()\n handlerRef.current(keyboardEvent)\n }\n\n resolvedTarget.addEventListener('keydown', listener)\n return () => {\n resolvedTarget.removeEventListener('keydown', listener)\n }\n // `combo` is usually a stable string literal; if callers pass a new array every\n // render we join-stringify to avoid stale closures without surprising rerenders.\n }, [Array.isArray(combo) ? combo.join('|') : combo, enabled, ignoreWhenTyping, preventDefault, target])\n}\n\n/**\n * Render-helper: returns a platform-appropriate display string for a combo.\n * 'mod+k' → '⌘K' on macOS, 'Ctrl+K' elsewhere. Useful for `<CommandShortcut>`.\n */\nexport function formatHotkey(combo: string): string {\n const mac = isMac()\n return combo\n .split('+')\n .map((p) => {\n const t = p.trim().toLowerCase()\n if (t === 'mod') return mac ? '⌘' : 'Ctrl'\n if (t === 'cmd' || t === 'meta') return mac ? '⌘' : 'Win'\n if (t === 'ctrl' || t === 'control') return mac ? '⌃' : 'Ctrl'\n if (t === 'shift') return mac ? '⇧' : 'Shift'\n if (t === 'alt' || t === 'option' || t === 'opt') return mac ? '⌥' : 'Alt'\n if (t === 'enter' || t === 'return') return '↵'\n if (t === 'escape' || t === 'esc') return 'Esc'\n if (t === 'space') return 'Space'\n if (t === 'up') return '↑'\n if (t === 'down') return '↓'\n if (t === 'left') return '←'\n if (t === 'right') return '→'\n return t.length === 1 ? t.toUpperCase() : t\n })\n .join(mac ? '' : '+')\n}\n"]}