@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,161 @@
1
+ 'use strict';
2
+
3
+ var chunkNV4JOKWL_cjs = require('./chunk-NV4JOKWL.cjs');
4
+ var React = require('react');
5
+ var jsxRuntime = require('react/jsx-runtime');
6
+
7
+ function _interopNamespace(e) {
8
+ if (e && e.__esModule) return e;
9
+ var n = Object.create(null);
10
+ if (e) {
11
+ Object.keys(e).forEach(function (k) {
12
+ if (k !== 'default') {
13
+ var d = Object.getOwnPropertyDescriptor(e, k);
14
+ Object.defineProperty(n, k, d.get ? d : {
15
+ enumerable: true,
16
+ get: function () { return e[k]; }
17
+ });
18
+ }
19
+ });
20
+ }
21
+ n.default = e;
22
+ return Object.freeze(n);
23
+ }
24
+
25
+ var React__namespace = /*#__PURE__*/_interopNamespace(React);
26
+
27
+ var TREND_CLASSES = {
28
+ up: "text-[hsl(var(--sentiment-positive))]",
29
+ down: "text-[hsl(var(--sentiment-negative))]",
30
+ neutral: "text-[hsl(var(--sentiment-neutral))]"
31
+ };
32
+ function resolveTrend(data, trend) {
33
+ if (trend !== "auto") return trend;
34
+ if (data.length < 2) return "neutral";
35
+ const first = data[0];
36
+ const last = data[data.length - 1];
37
+ if (last > first) return "up";
38
+ if (last < first) return "down";
39
+ return "neutral";
40
+ }
41
+ var Sparkline = React__namespace.forwardRef(
42
+ ({
43
+ className,
44
+ data,
45
+ variant = "line",
46
+ trend = "auto",
47
+ width = 80,
48
+ height = 24,
49
+ strokeWidth = 1.5,
50
+ showEndDot = false,
51
+ padding = 2,
52
+ color,
53
+ barGap = 1,
54
+ "aria-label": ariaLabel,
55
+ ...props
56
+ }, ref) => {
57
+ const effectiveTrend = resolveTrend(data, trend);
58
+ const trendColorClass = color ? void 0 : TREND_CLASSES[effectiveTrend];
59
+ if (data.length === 0) {
60
+ return /* @__PURE__ */ jsxRuntime.jsx(
61
+ "div",
62
+ {
63
+ ref,
64
+ "data-slot": "sparkline",
65
+ "data-empty": "true",
66
+ "aria-hidden": "true",
67
+ className: chunkNV4JOKWL_cjs.cn("inline-block", className),
68
+ style: { width, height },
69
+ ...props
70
+ }
71
+ );
72
+ }
73
+ const min = Math.min(...data);
74
+ const max = Math.max(...data);
75
+ const range = max - min || 1;
76
+ const innerW = width - padding * 2;
77
+ const innerH = height - padding * 2;
78
+ const stepX = data.length > 1 ? innerW / (data.length - 1) : 0;
79
+ const yFor = (v) => padding + innerH - (v - min) / range * innerH;
80
+ const xFor = (i) => padding + i * stepX;
81
+ const points = data.map((v, i) => ({ x: xFor(i), y: yFor(v) }));
82
+ const linePath = points.map((p, i) => `${i === 0 ? "M" : "L"}${p.x.toFixed(2)} ${p.y.toFixed(2)}`).join(" ");
83
+ const areaPath = `${linePath} L${points[points.length - 1].x.toFixed(2)} ${(height - padding).toFixed(
84
+ 2
85
+ )} L${points[0].x.toFixed(2)} ${(height - padding).toFixed(2)} Z`;
86
+ const stroke = color ?? "currentColor";
87
+ return /* @__PURE__ */ jsxRuntime.jsx(
88
+ "div",
89
+ {
90
+ ref,
91
+ "data-slot": "sparkline",
92
+ "data-variant": variant,
93
+ "data-trend": effectiveTrend,
94
+ role: ariaLabel ? "img" : void 0,
95
+ "aria-label": ariaLabel,
96
+ "aria-hidden": ariaLabel ? void 0 : true,
97
+ className: chunkNV4JOKWL_cjs.cn("inline-block align-middle", trendColorClass, className),
98
+ style: { width, height },
99
+ ...props,
100
+ children: /* @__PURE__ */ jsxRuntime.jsxs(
101
+ "svg",
102
+ {
103
+ width,
104
+ height,
105
+ viewBox: `0 0 ${width} ${height}`,
106
+ preserveAspectRatio: "none",
107
+ focusable: "false",
108
+ children: [
109
+ variant === "area" && /* @__PURE__ */ jsxRuntime.jsx("path", { d: areaPath, fill: stroke, opacity: 0.18 }),
110
+ (variant === "line" || variant === "area") && /* @__PURE__ */ jsxRuntime.jsx(
111
+ "path",
112
+ {
113
+ d: linePath,
114
+ fill: "none",
115
+ stroke,
116
+ strokeWidth,
117
+ strokeLinecap: "round",
118
+ strokeLinejoin: "round",
119
+ vectorEffect: "non-scaling-stroke"
120
+ }
121
+ ),
122
+ variant === "bars" && data.map((v, i) => {
123
+ const gap = barGap;
124
+ const barW = Math.max(0, stepX - gap);
125
+ const y = yFor(v);
126
+ const barH = Math.max(1, height - padding - y);
127
+ const x = xFor(i) - barW / 2;
128
+ return /* @__PURE__ */ jsxRuntime.jsx(
129
+ "rect",
130
+ {
131
+ x: x.toFixed(2),
132
+ y: y.toFixed(2),
133
+ width: barW.toFixed(2),
134
+ height: barH.toFixed(2),
135
+ rx: Math.min(1, barW / 3),
136
+ fill: stroke
137
+ },
138
+ i
139
+ );
140
+ }),
141
+ showEndDot && variant !== "bars" && /* @__PURE__ */ jsxRuntime.jsx(
142
+ "circle",
143
+ {
144
+ cx: points[points.length - 1].x.toFixed(2),
145
+ cy: points[points.length - 1].y.toFixed(2),
146
+ r: strokeWidth + 0.5,
147
+ fill: stroke
148
+ }
149
+ )
150
+ ]
151
+ }
152
+ )
153
+ }
154
+ );
155
+ }
156
+ );
157
+ Sparkline.displayName = "Sparkline";
158
+
159
+ exports.Sparkline = Sparkline;
160
+ //# sourceMappingURL=chunk-S5IPJQZ3.cjs.map
161
+ //# sourceMappingURL=chunk-S5IPJQZ3.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/ui/sparkline.tsx"],"names":["React","jsx","cn","jsxs"],"mappings":"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","file":"chunk-S5IPJQZ3.cjs","sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport { cn } from '@/lib/utils'\n\nexport type SparklineTrend = 'up' | 'down' | 'neutral' | 'auto'\nexport type SparklineVariant = 'line' | 'area' | 'bars'\n\nexport interface SparklineProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Array of numeric data points. Must have at least 2 items to render line/area. */\n data: number[]\n /** Visual style @default \"line\" */\n variant?: SparklineVariant\n /**\n * Trend colour. `\"auto\"` compares first and last point:\n * last > first → up, last < first → down, equal → neutral.\n * Pass an explicit value to override.\n * @default \"auto\"\n */\n trend?: SparklineTrend\n /** Width in px. Also used as SVG viewBox width — output scales to parent when CSS overrides. @default 80 */\n width?: number\n /** Height in px @default 24 */\n height?: number\n /** Line / bar stroke width @default 1.5 */\n strokeWidth?: number\n /** Show a filled dot at the last point */\n showEndDot?: boolean\n /** Padding inside the viewBox so strokes/dots are not clipped @default 2 */\n padding?: number\n /** Override color with any CSS value (e.g. `\"hsl(var(--brand))\"`). Takes precedence over `trend`. */\n color?: string\n /** For bars variant — gap between bars in user units @default 1 */\n barGap?: number\n /** aria-label for screen readers — describe the trend / metric */\n 'aria-label'?: string\n}\n\nconst TREND_CLASSES: Record<Exclude<SparklineTrend, 'auto'>, string> = {\n up: 'text-[hsl(var(--sentiment-positive))]',\n down: 'text-[hsl(var(--sentiment-negative))]',\n neutral: 'text-[hsl(var(--sentiment-neutral))]',\n}\n\nfunction resolveTrend(data: number[], trend: SparklineTrend): Exclude<SparklineTrend, 'auto'> {\n if (trend !== 'auto') return trend\n if (data.length < 2) return 'neutral'\n const first = data[0]\n const last = data[data.length - 1]\n if (last > first) return 'up'\n if (last < first) return 'down'\n return 'neutral'\n}\n\nconst Sparkline = React.forwardRef<HTMLDivElement, SparklineProps>(\n (\n {\n className,\n data,\n variant = 'line',\n trend = 'auto',\n width = 80,\n height = 24,\n strokeWidth = 1.5,\n showEndDot = false,\n padding = 2,\n color,\n barGap = 1,\n 'aria-label': ariaLabel,\n ...props\n },\n ref\n ) => {\n const effectiveTrend = resolveTrend(data, trend)\n const trendColorClass = color ? undefined : TREND_CLASSES[effectiveTrend]\n\n if (data.length === 0) {\n return (\n <div\n ref={ref}\n data-slot=\"sparkline\"\n data-empty=\"true\"\n aria-hidden=\"true\"\n className={cn('inline-block', className)}\n style={{ width, height }}\n {...props}\n />\n )\n }\n\n const min = Math.min(...data)\n const max = Math.max(...data)\n const range = max - min || 1\n const innerW = width - padding * 2\n const innerH = height - padding * 2\n const stepX = data.length > 1 ? innerW / (data.length - 1) : 0\n const yFor = (v: number) => padding + innerH - ((v - min) / range) * innerH\n const xFor = (i: number) => padding + i * stepX\n\n const points = data.map((v, i) => ({ x: xFor(i), y: yFor(v) }))\n const linePath = points.map((p, i) => `${i === 0 ? 'M' : 'L'}${p.x.toFixed(2)} ${p.y.toFixed(2)}`).join(' ')\n const areaPath = `${linePath} L${points[points.length - 1].x.toFixed(2)} ${(height - padding).toFixed(\n 2\n )} L${points[0].x.toFixed(2)} ${(height - padding).toFixed(2)} Z`\n\n const stroke = color ?? 'currentColor'\n\n return (\n <div\n ref={ref}\n data-slot=\"sparkline\"\n data-variant={variant}\n data-trend={effectiveTrend}\n role={ariaLabel ? 'img' : undefined}\n aria-label={ariaLabel}\n aria-hidden={ariaLabel ? undefined : true}\n className={cn('inline-block align-middle', trendColorClass, className)}\n style={{ width, height }}\n {...props}\n >\n <svg\n width={width}\n height={height}\n viewBox={`0 0 ${width} ${height}`}\n preserveAspectRatio=\"none\"\n focusable=\"false\"\n >\n {variant === 'area' && <path d={areaPath} fill={stroke} opacity={0.18} />}\n {(variant === 'line' || variant === 'area') && (\n <path\n d={linePath}\n fill=\"none\"\n stroke={stroke}\n strokeWidth={strokeWidth}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n vectorEffect=\"non-scaling-stroke\"\n />\n )}\n {variant === 'bars' &&\n data.map((v, i) => {\n const gap = barGap\n const barW = Math.max(0, stepX - gap)\n const y = yFor(v)\n const barH = Math.max(1, height - padding - y)\n const x = xFor(i) - barW / 2\n return (\n <rect\n key={i}\n x={x.toFixed(2)}\n y={y.toFixed(2)}\n width={barW.toFixed(2)}\n height={barH.toFixed(2)}\n rx={Math.min(1, barW / 3)}\n fill={stroke}\n />\n )\n })}\n {showEndDot && variant !== 'bars' && (\n <circle\n cx={points[points.length - 1].x.toFixed(2)}\n cy={points[points.length - 1].y.toFixed(2)}\n r={strokeWidth + 0.5}\n fill={stroke}\n />\n )}\n </svg>\n </div>\n )\n }\n)\nSparkline.displayName = 'Sparkline'\n\nexport { Sparkline }\n"]}
@@ -0,0 +1,211 @@
1
+ import { cn } from './chunk-4SVQNEVH.js';
2
+ import { cva } from 'class-variance-authority';
3
+ import { jsx, jsxs } from 'react/jsx-runtime';
4
+
5
+ var skeletonVariants = cva("bg-accent animate-pulse", {
6
+ variants: {
7
+ shape: {
8
+ rect: "rounded-md",
9
+ line: "rounded-full h-4 w-full",
10
+ circle: "rounded-full",
11
+ text: "rounded h-4"
12
+ },
13
+ size: {
14
+ sm: "",
15
+ md: "",
16
+ lg: ""
17
+ }
18
+ },
19
+ compoundVariants: [
20
+ { shape: "circle", size: "sm", class: "size-8" },
21
+ { shape: "circle", size: "md", class: "size-10" },
22
+ { shape: "circle", size: "lg", class: "size-14" }
23
+ ],
24
+ defaultVariants: {
25
+ shape: "rect",
26
+ size: "md"
27
+ }
28
+ });
29
+ function Skeleton({ className, shape, size, count, ...props }) {
30
+ if (count && count > 1) {
31
+ return /* @__PURE__ */ jsx("div", { role: "status", "aria-busy": "true", "aria-label": "Loading", className: "space-y-2", children: Array.from({ length: count }).map((_, i) => /* @__PURE__ */ jsx(
32
+ "div",
33
+ {
34
+ "data-slot": "skeleton",
35
+ "aria-hidden": "true",
36
+ className: cn(skeletonVariants({ shape, size }), className)
37
+ },
38
+ i
39
+ )) });
40
+ }
41
+ return /* @__PURE__ */ jsx(
42
+ "div",
43
+ {
44
+ "data-slot": "skeleton",
45
+ role: "status",
46
+ "aria-busy": "true",
47
+ "aria-label": "Loading",
48
+ ...props,
49
+ className: cn(skeletonVariants({ shape, size }), className)
50
+ }
51
+ );
52
+ }
53
+ Skeleton.displayName = "Skeleton";
54
+ function MetricCardSkeleton({ className }) {
55
+ return /* @__PURE__ */ jsxs(
56
+ "div",
57
+ {
58
+ "data-slot": "metric-card-skeleton",
59
+ role: "status",
60
+ "aria-busy": "true",
61
+ "aria-label": "Loading metric",
62
+ className: cn("rounded-lg border border-border bg-card p-4 space-y-3", className),
63
+ children: [
64
+ /* @__PURE__ */ jsx(Skeleton, { shape: "line", className: "h-3 w-1/3", "aria-hidden": "true" }),
65
+ /* @__PURE__ */ jsx(Skeleton, { shape: "rect", className: "h-8 w-1/2", "aria-hidden": "true" }),
66
+ /* @__PURE__ */ jsx(Skeleton, { shape: "line", className: "h-3 w-1/4", "aria-hidden": "true" })
67
+ ]
68
+ }
69
+ );
70
+ }
71
+ MetricCardSkeleton.displayName = "MetricCardSkeleton";
72
+ function ChartSkeleton({ className }) {
73
+ return /* @__PURE__ */ jsx(
74
+ "div",
75
+ {
76
+ "data-slot": "chart-skeleton",
77
+ role: "status",
78
+ "aria-busy": "true",
79
+ "aria-label": "Loading chart",
80
+ className: cn("w-full rounded-md overflow-hidden", className),
81
+ children: /* @__PURE__ */ jsx(Skeleton, { shape: "rect", className: "w-full h-full min-h-[200px]", "aria-hidden": "true" })
82
+ }
83
+ );
84
+ }
85
+ ChartSkeleton.displayName = "ChartSkeleton";
86
+ function TableSkeleton({ rows = 5, className }) {
87
+ return /* @__PURE__ */ jsxs(
88
+ "div",
89
+ {
90
+ "data-slot": "table-skeleton",
91
+ role: "status",
92
+ "aria-busy": "true",
93
+ "aria-label": "Loading table",
94
+ className: cn("w-full rounded-md border border-border overflow-hidden", className),
95
+ children: [
96
+ /* @__PURE__ */ jsxs("div", { className: "flex gap-4 bg-muted/50 px-4 py-3 border-b border-border", "aria-hidden": "true", children: [
97
+ /* @__PURE__ */ jsx(Skeleton, { shape: "line", className: "h-4 flex-1" }),
98
+ /* @__PURE__ */ jsx(Skeleton, { shape: "line", className: "h-4 flex-1" }),
99
+ /* @__PURE__ */ jsx(Skeleton, { shape: "line", className: "h-4 flex-1" }),
100
+ /* @__PURE__ */ jsx(Skeleton, { shape: "line", className: "h-4 w-16" })
101
+ ] }),
102
+ Array.from({ length: rows }).map((_, i) => /* @__PURE__ */ jsxs(
103
+ "div",
104
+ {
105
+ "aria-hidden": "true",
106
+ className: cn("flex gap-4 px-4 py-3", i !== rows - 1 && "border-b border-border"),
107
+ children: [
108
+ /* @__PURE__ */ jsx(Skeleton, { shape: "line", className: "h-4 flex-1" }),
109
+ /* @__PURE__ */ jsx(Skeleton, { shape: "line", className: "h-4 flex-1" }),
110
+ /* @__PURE__ */ jsx(Skeleton, { shape: "line", className: "h-4 flex-1" }),
111
+ /* @__PURE__ */ jsx(Skeleton, { shape: "line", className: "h-4 w-16" })
112
+ ]
113
+ },
114
+ i
115
+ ))
116
+ ]
117
+ }
118
+ );
119
+ }
120
+ TableSkeleton.displayName = "TableSkeleton";
121
+ function TableRowSkeleton({ cells = 4, className }) {
122
+ return /* @__PURE__ */ jsx("tr", { "data-slot": "table-row-skeleton", "aria-busy": "true", className, children: Array.from({ length: cells }).map((_, i) => /* @__PURE__ */ jsx("td", { className: "px-3 py-2.5", "aria-hidden": "true", children: /* @__PURE__ */ jsx(Skeleton, { shape: "line", className: "h-3.5 w-full max-w-[140px]" }) }, i)) });
123
+ }
124
+ TableRowSkeleton.displayName = "TableRowSkeleton";
125
+ function CardSkeleton({
126
+ withImage = false,
127
+ imageAspect = "video",
128
+ bodyLines = 2,
129
+ withFooter = false,
130
+ className
131
+ }) {
132
+ const aspectClass = imageAspect === "square" ? "aspect-square" : imageAspect === "wide" ? "aspect-[21/9]" : "aspect-video";
133
+ return /* @__PURE__ */ jsxs(
134
+ "div",
135
+ {
136
+ "data-slot": "card-skeleton",
137
+ role: "status",
138
+ "aria-busy": "true",
139
+ "aria-label": "Loading card",
140
+ className: cn("rounded-lg border border-border bg-card overflow-hidden flex flex-col", className),
141
+ children: [
142
+ withImage && /* @__PURE__ */ jsx(Skeleton, { shape: "rect", className: cn("w-full", aspectClass), "aria-hidden": "true" }),
143
+ /* @__PURE__ */ jsxs("div", { className: "p-4 space-y-3 flex-1", children: [
144
+ /* @__PURE__ */ jsx(Skeleton, { shape: "line", className: "h-4 w-3/5", "aria-hidden": "true" }),
145
+ /* @__PURE__ */ jsx("div", { className: "space-y-2", children: Array.from({ length: bodyLines }).map((_, i) => /* @__PURE__ */ jsx(
146
+ Skeleton,
147
+ {
148
+ shape: "line",
149
+ className: cn("h-3", i === bodyLines - 1 ? "w-2/3" : "w-full"),
150
+ "aria-hidden": "true"
151
+ },
152
+ i
153
+ )) })
154
+ ] }),
155
+ withFooter && /* @__PURE__ */ jsxs("div", { className: "p-4 border-t border-border flex items-center justify-between gap-2", children: [
156
+ /* @__PURE__ */ jsx(Skeleton, { shape: "line", className: "h-3 w-1/4", "aria-hidden": "true" }),
157
+ /* @__PURE__ */ jsx(Skeleton, { shape: "rect", className: "h-8 w-20", "aria-hidden": "true" })
158
+ ] })
159
+ ]
160
+ }
161
+ );
162
+ }
163
+ CardSkeleton.displayName = "CardSkeleton";
164
+ function AvatarTextSkeleton({ size = "md", lines = 2, className }) {
165
+ return /* @__PURE__ */ jsxs(
166
+ "div",
167
+ {
168
+ "data-slot": "avatar-text-skeleton",
169
+ role: "status",
170
+ "aria-busy": "true",
171
+ "aria-label": "Loading user",
172
+ className: cn("flex items-center gap-3", className),
173
+ children: [
174
+ /* @__PURE__ */ jsx(Skeleton, { shape: "circle", size, "aria-hidden": "true" }),
175
+ /* @__PURE__ */ jsx("div", { className: "flex-1 min-w-0 space-y-2", children: Array.from({ length: lines }).map((_, i) => /* @__PURE__ */ jsx(
176
+ Skeleton,
177
+ {
178
+ shape: "line",
179
+ className: cn("h-3", i === 0 ? "w-1/3" : i === lines - 1 ? "w-1/2" : "w-full"),
180
+ "aria-hidden": "true"
181
+ },
182
+ i
183
+ )) })
184
+ ]
185
+ }
186
+ );
187
+ }
188
+ AvatarTextSkeleton.displayName = "AvatarTextSkeleton";
189
+ function FormRowSkeleton({ field = "input", withHelp = false, className }) {
190
+ const inputClass = field === "textarea" ? "h-20" : field === "select" ? "h-9" : "h-9";
191
+ return /* @__PURE__ */ jsxs(
192
+ "div",
193
+ {
194
+ "data-slot": "form-row-skeleton",
195
+ role: "status",
196
+ "aria-busy": "true",
197
+ "aria-label": "Loading form field",
198
+ className: cn("space-y-2", className),
199
+ children: [
200
+ /* @__PURE__ */ jsx(Skeleton, { shape: "line", className: "h-3 w-1/4", "aria-hidden": "true" }),
201
+ /* @__PURE__ */ jsx(Skeleton, { shape: "rect", className: cn("w-full", inputClass), "aria-hidden": "true" }),
202
+ withHelp && /* @__PURE__ */ jsx(Skeleton, { shape: "line", className: "h-2.5 w-1/3", "aria-hidden": "true" })
203
+ ]
204
+ }
205
+ );
206
+ }
207
+ FormRowSkeleton.displayName = "FormRowSkeleton";
208
+
209
+ export { AvatarTextSkeleton, CardSkeleton, ChartSkeleton, FormRowSkeleton, MetricCardSkeleton, Skeleton, TableRowSkeleton, TableSkeleton };
210
+ //# sourceMappingURL=chunk-SB5DSYR5.js.map
211
+ //# sourceMappingURL=chunk-SB5DSYR5.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/ui/skeleton.tsx"],"names":[],"mappings":"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","file":"chunk-SB5DSYR5.js","sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { cn } from '@/lib/utils'\n\nconst skeletonVariants = cva('bg-accent animate-pulse', {\n variants: {\n shape: {\n rect: 'rounded-md',\n line: 'rounded-full h-4 w-full',\n circle: 'rounded-full',\n text: 'rounded h-4',\n },\n size: {\n sm: '',\n md: '',\n lg: '',\n },\n },\n compoundVariants: [\n { shape: 'circle', size: 'sm', class: 'size-8' },\n { shape: 'circle', size: 'md', class: 'size-10' },\n { shape: 'circle', size: 'lg', class: 'size-14' },\n ],\n defaultVariants: {\n shape: 'rect',\n size: 'md',\n },\n})\n\nexport interface SkeletonProps extends React.HTMLAttributes<HTMLDivElement>, VariantProps<typeof skeletonVariants> {\n /**\n * تعداد عناصر skeleton برای نمایش (برای shape های line و text)\n * Number of skeleton elements to repeat (for line/text shapes)\n */\n count?: number\n}\n\nfunction Skeleton({ className, shape, size, count, ...props }: SkeletonProps) {\n if (count && count > 1) {\n return (\n <div role=\"status\" aria-busy=\"true\" aria-label=\"Loading\" className=\"space-y-2\">\n {Array.from({ length: count }).map((_, i) => (\n <div\n key={i}\n data-slot=\"skeleton\"\n aria-hidden=\"true\"\n className={cn(skeletonVariants({ shape, size }), className)}\n />\n ))}\n </div>\n )\n }\n\n return (\n <div\n data-slot=\"skeleton\"\n role=\"status\"\n aria-busy=\"true\"\n aria-label=\"Loading\"\n {...props}\n className={cn(skeletonVariants({ shape, size }), className)}\n />\n )\n}\n\nSkeleton.displayName = 'Skeleton'\n\n/* -------------------------------------------------------------------------- */\n/* Named Skeleton Presets */\n/* -------------------------------------------------------------------------- */\n\nexport interface MetricCardSkeletonProps {\n className?: string\n}\n\nfunction MetricCardSkeleton({ className }: MetricCardSkeletonProps) {\n return (\n <div\n data-slot=\"metric-card-skeleton\"\n role=\"status\"\n aria-busy=\"true\"\n aria-label=\"Loading metric\"\n className={cn('rounded-lg border border-border bg-card p-4 space-y-3', className)}\n >\n <Skeleton shape=\"line\" className=\"h-3 w-1/3\" aria-hidden=\"true\" />\n <Skeleton shape=\"rect\" className=\"h-8 w-1/2\" aria-hidden=\"true\" />\n <Skeleton shape=\"line\" className=\"h-3 w-1/4\" aria-hidden=\"true\" />\n </div>\n )\n}\nMetricCardSkeleton.displayName = 'MetricCardSkeleton'\n\nexport interface ChartSkeletonProps {\n className?: string\n}\n\nfunction ChartSkeleton({ className }: ChartSkeletonProps) {\n return (\n <div\n data-slot=\"chart-skeleton\"\n role=\"status\"\n aria-busy=\"true\"\n aria-label=\"Loading chart\"\n className={cn('w-full rounded-md overflow-hidden', className)}\n >\n <Skeleton shape=\"rect\" className=\"w-full h-full min-h-[200px]\" aria-hidden=\"true\" />\n </div>\n )\n}\nChartSkeleton.displayName = 'ChartSkeleton'\n\nexport interface TableSkeletonProps {\n rows?: number\n className?: string\n}\n\nfunction TableSkeleton({ rows = 5, className }: TableSkeletonProps) {\n return (\n <div\n data-slot=\"table-skeleton\"\n role=\"status\"\n aria-busy=\"true\"\n aria-label=\"Loading table\"\n className={cn('w-full rounded-md border border-border overflow-hidden', className)}\n >\n <div className=\"flex gap-4 bg-muted/50 px-4 py-3 border-b border-border\" aria-hidden=\"true\">\n <Skeleton shape=\"line\" className=\"h-4 flex-1\" />\n <Skeleton shape=\"line\" className=\"h-4 flex-1\" />\n <Skeleton shape=\"line\" className=\"h-4 flex-1\" />\n <Skeleton shape=\"line\" className=\"h-4 w-16\" />\n </div>\n {Array.from({ length: rows }).map((_, i) => (\n <div\n key={i}\n aria-hidden=\"true\"\n className={cn('flex gap-4 px-4 py-3', i !== rows - 1 && 'border-b border-border')}\n >\n <Skeleton shape=\"line\" className=\"h-4 flex-1\" />\n <Skeleton shape=\"line\" className=\"h-4 flex-1\" />\n <Skeleton shape=\"line\" className=\"h-4 flex-1\" />\n <Skeleton shape=\"line\" className=\"h-4 w-16\" />\n </div>\n ))}\n </div>\n )\n}\nTableSkeleton.displayName = 'TableSkeleton'\n\n/* -------------------------------------------------------------------------- */\n/* TableRowSkeleton — a single row inside an existing table */\n/* -------------------------------------------------------------------------- */\n\nexport interface TableRowSkeletonProps {\n /** Number of cells in the row */\n cells?: number\n className?: string\n}\n\nfunction TableRowSkeleton({ cells = 4, className }: TableRowSkeletonProps) {\n // Don't assign role=\"status\" to <tr> — it's a table-row element and\n // ARIA disallows that combination. The cell <td>s carry aria-hidden so\n // screen readers stay quiet during the brief loading window.\n return (\n <tr data-slot=\"table-row-skeleton\" aria-busy=\"true\" className={className}>\n {Array.from({ length: cells }).map((_, i) => (\n <td key={i} className=\"px-3 py-2.5\" aria-hidden=\"true\">\n <Skeleton shape=\"line\" className=\"h-3.5 w-full max-w-[140px]\" />\n </td>\n ))}\n </tr>\n )\n}\nTableRowSkeleton.displayName = 'TableRowSkeleton'\n\n/* -------------------------------------------------------------------------- */\n/* CardSkeleton — typical card with title + body lines + optional image */\n/* -------------------------------------------------------------------------- */\n\nexport interface CardSkeletonProps {\n /** Show a leading image/thumbnail block @default false */\n withImage?: boolean\n /** Aspect ratio of the image (when withImage) @default 'video' */\n imageAspect?: 'video' | 'square' | 'wide'\n /** Number of body lines @default 2 */\n bodyLines?: number\n /** Show a footer row (button-shaped placeholder) @default false */\n withFooter?: boolean\n className?: string\n}\n\nfunction CardSkeleton({\n withImage = false,\n imageAspect = 'video',\n bodyLines = 2,\n withFooter = false,\n className,\n}: CardSkeletonProps) {\n const aspectClass =\n imageAspect === 'square' ? 'aspect-square' : imageAspect === 'wide' ? 'aspect-[21/9]' : 'aspect-video'\n return (\n <div\n data-slot=\"card-skeleton\"\n role=\"status\"\n aria-busy=\"true\"\n aria-label=\"Loading card\"\n className={cn('rounded-lg border border-border bg-card overflow-hidden flex flex-col', className)}\n >\n {withImage && <Skeleton shape=\"rect\" className={cn('w-full', aspectClass)} aria-hidden=\"true\" />}\n <div className=\"p-4 space-y-3 flex-1\">\n <Skeleton shape=\"line\" className=\"h-4 w-3/5\" aria-hidden=\"true\" />\n <div className=\"space-y-2\">\n {Array.from({ length: bodyLines }).map((_, i) => (\n <Skeleton\n key={i}\n shape=\"line\"\n className={cn('h-3', i === bodyLines - 1 ? 'w-2/3' : 'w-full')}\n aria-hidden=\"true\"\n />\n ))}\n </div>\n </div>\n {withFooter && (\n <div className=\"p-4 border-t border-border flex items-center justify-between gap-2\">\n <Skeleton shape=\"line\" className=\"h-3 w-1/4\" aria-hidden=\"true\" />\n <Skeleton shape=\"rect\" className=\"h-8 w-20\" aria-hidden=\"true\" />\n </div>\n )}\n </div>\n )\n}\nCardSkeleton.displayName = 'CardSkeleton'\n\n/* -------------------------------------------------------------------------- */\n/* AvatarTextSkeleton — circle avatar + 2 text lines (list/comment style) */\n/* -------------------------------------------------------------------------- */\n\nexport interface AvatarTextSkeletonProps {\n /** Avatar size @default 'md' */\n size?: 'sm' | 'md' | 'lg'\n /** Number of text lines beside the avatar @default 2 */\n lines?: number\n className?: string\n}\n\nfunction AvatarTextSkeleton({ size = 'md', lines = 2, className }: AvatarTextSkeletonProps) {\n return (\n <div\n data-slot=\"avatar-text-skeleton\"\n role=\"status\"\n aria-busy=\"true\"\n aria-label=\"Loading user\"\n className={cn('flex items-center gap-3', className)}\n >\n <Skeleton shape=\"circle\" size={size} aria-hidden=\"true\" />\n <div className=\"flex-1 min-w-0 space-y-2\">\n {Array.from({ length: lines }).map((_, i) => (\n <Skeleton\n key={i}\n shape=\"line\"\n className={cn('h-3', i === 0 ? 'w-1/3' : i === lines - 1 ? 'w-1/2' : 'w-full')}\n aria-hidden=\"true\"\n />\n ))}\n </div>\n </div>\n )\n}\nAvatarTextSkeleton.displayName = 'AvatarTextSkeleton'\n\n/* -------------------------------------------------------------------------- */\n/* FormRowSkeleton — label + input placeholder for forms */\n/* -------------------------------------------------------------------------- */\n\nexport interface FormRowSkeletonProps {\n /** Field shape — 'input' (one-line), 'textarea' (3-line), 'select' (input + chevron) */\n field?: 'input' | 'textarea' | 'select'\n /** Show help text line below input @default false */\n withHelp?: boolean\n className?: string\n}\n\nfunction FormRowSkeleton({ field = 'input', withHelp = false, className }: FormRowSkeletonProps) {\n const inputClass = field === 'textarea' ? 'h-20' : field === 'select' ? 'h-9' : 'h-9'\n return (\n <div\n data-slot=\"form-row-skeleton\"\n role=\"status\"\n aria-busy=\"true\"\n aria-label=\"Loading form field\"\n className={cn('space-y-2', className)}\n >\n <Skeleton shape=\"line\" className=\"h-3 w-1/4\" aria-hidden=\"true\" />\n <Skeleton shape=\"rect\" className={cn('w-full', inputClass)} aria-hidden=\"true\" />\n {withHelp && <Skeleton shape=\"line\" className=\"h-2.5 w-1/3\" aria-hidden=\"true\" />}\n </div>\n )\n}\nFormRowSkeleton.displayName = 'FormRowSkeleton'\n\nexport {\n Skeleton,\n MetricCardSkeleton,\n ChartSkeleton,\n TableSkeleton,\n TableRowSkeleton,\n CardSkeleton,\n AvatarTextSkeleton,\n FormRowSkeleton,\n}\n"]}
@@ -0,0 +1,69 @@
1
+ 'use strict';
2
+
3
+ var chunk34JUCX2G_cjs = require('./chunk-34JUCX2G.cjs');
4
+ var chunkNV4JOKWL_cjs = require('./chunk-NV4JOKWL.cjs');
5
+ var classVarianceAuthority = require('class-variance-authority');
6
+ var React = require('react');
7
+ var jsxRuntime = require('react/jsx-runtime');
8
+
9
+ function _interopNamespace(e) {
10
+ if (e && e.__esModule) return e;
11
+ var n = Object.create(null);
12
+ if (e) {
13
+ Object.keys(e).forEach(function (k) {
14
+ if (k !== 'default') {
15
+ var d = Object.getOwnPropertyDescriptor(e, k);
16
+ Object.defineProperty(n, k, d.get ? d : {
17
+ enumerable: true,
18
+ get: function () { return e[k]; }
19
+ });
20
+ }
21
+ });
22
+ }
23
+ n.default = e;
24
+ return Object.freeze(n);
25
+ }
26
+
27
+ var React__namespace = /*#__PURE__*/_interopNamespace(React);
28
+
29
+ var inputVariants = classVarianceAuthority.cva(
30
+ chunkNV4JOKWL_cjs.cn(
31
+ "flex w-full rounded-md border border-control read-only:border-button bg-foreground/[.026] text-sm text-foreground file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-foreground-muted read-only:text-foreground-light",
32
+ "transition-colors duration-150",
33
+ "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:cursor-not-allowed disabled:opacity-50",
34
+ "aria-[invalid=true]:bg-destructive-200 dark:aria-[invalid=true]:bg-destructive/5 aria-[invalid=true]:border-destructive-400 dark:aria-[invalid=true]:border-destructive-default aria-[invalid=true]:focus:border-destructive aria-[invalid=true]:focus-visible:border-destructive"
35
+ ),
36
+ {
37
+ variants: {
38
+ size: {
39
+ ...chunk34JUCX2G_cjs.SIZE_VARIANTS
40
+ }
41
+ },
42
+ defaultVariants: {
43
+ size: chunk34JUCX2G_cjs.SIZE_VARIANTS_DEFAULT
44
+ }
45
+ }
46
+ );
47
+ var InputVariants = inputVariants;
48
+ var LTR_INPUT_TYPES = /* @__PURE__ */ new Set(["email", "url", "tel", "number", "password"]);
49
+ var Input = React__namespace.forwardRef(({ className, type, size = "sm", dir, ...props }, ref) => {
50
+ const resolvedDir = dir ?? (type && LTR_INPUT_TYPES.has(type) ? "ltr" : void 0);
51
+ return /* @__PURE__ */ jsxRuntime.jsx(
52
+ "input",
53
+ {
54
+ type,
55
+ ref,
56
+ "data-slot": "input",
57
+ dir: resolvedDir,
58
+ ...props,
59
+ className: chunkNV4JOKWL_cjs.cn(inputVariants({ size }), className)
60
+ }
61
+ );
62
+ });
63
+ Input.displayName = "Input";
64
+
65
+ exports.Input = Input;
66
+ exports.InputVariants = InputVariants;
67
+ exports.inputVariants = inputVariants;
68
+ //# sourceMappingURL=chunk-SCGW2BH4.cjs.map
69
+ //# sourceMappingURL=chunk-SCGW2BH4.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/ui/input.tsx"],"names":["cva","cn","SIZE_VARIANTS","SIZE_VARIANTS_DEFAULT","React","jsx"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAOO,IAAM,aAAA,GAAgBA,0BAAA;AAAA,EAC3BC,oBAAA;AAAA,IACE,0QAAA;AAAA,IACA,gCAAA;AAAA,IACA,0LAAA;AAAA,IACA;AAAA,GACF;AAAA,EACA;AAAA,IACE,QAAA,EAAU;AAAA,MACR,IAAA,EAAM;AAAA,QACJ,GAAGC;AAAA;AACL,KACF;AAAA,IACA,eAAA,EAAiB;AAAA,MACf,IAAA,EAAMC;AAAA;AACR;AAEJ;AAGO,IAAM,aAAA,GAAgB;AAK7B,IAAM,eAAA,uBAAsB,GAAA,CAAI,CAAC,SAAS,KAAA,EAAO,KAAA,EAAO,QAAA,EAAU,UAAU,CAAC,CAAA;AAE7E,IAAM,KAAA,GAAcC,gBAAA,CAAA,UAAA,CAAyC,CAAC,EAAE,SAAA,EAAW,IAAA,EAAM,IAAA,GAAO,IAAA,EAAM,GAAA,EAAK,GAAG,KAAA,EAAM,EAAG,GAAA,KAAQ;AAErH,EAAA,MAAM,cAAc,GAAA,KAAQ,IAAA,IAAQ,gBAAgB,GAAA,CAAI,IAAI,IAAI,KAAA,GAAQ,MAAA,CAAA;AACxE,EAAA,uBACEC,cAAA;AAAA,IAAC,OAAA;AAAA,IAAA;AAAA,MACC,IAAA;AAAA,MACA,GAAA;AAAA,MACA,WAAA,EAAU,OAAA;AAAA,MACV,GAAA,EAAK,WAAA;AAAA,MACJ,GAAG,KAAA;AAAA,MACJ,WAAWJ,oBAAA,CAAG,aAAA,CAAc,EAAE,IAAA,EAAM,GAAG,SAAS;AAAA;AAAA,GAClD;AAEJ,CAAC;AAED,KAAA,CAAM,WAAA,GAAc,OAAA","file":"chunk-SCGW2BH4.cjs","sourcesContent":["'use client'\n\nimport { VariantProps, cva } from 'class-variance-authority'\nimport * as React from 'react'\nimport { SIZE_VARIANTS, SIZE_VARIANTS_DEFAULT } from '@/lib/constants'\nimport { cn } from '@/lib/utils'\n\nexport const inputVariants = cva(\n cn(\n 'flex w-full rounded-md border border-control read-only:border-button bg-foreground/[.026] text-sm text-foreground file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-foreground-muted read-only:text-foreground-light',\n 'transition-colors duration-150',\n 'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:cursor-not-allowed disabled:opacity-50',\n 'aria-[invalid=true]:bg-destructive-200 dark:aria-[invalid=true]:bg-destructive/5 aria-[invalid=true]:border-destructive-400 dark:aria-[invalid=true]:border-destructive-default aria-[invalid=true]:focus:border-destructive aria-[invalid=true]:focus-visible:border-destructive'\n ),\n {\n variants: {\n size: {\n ...SIZE_VARIANTS,\n },\n },\n defaultVariants: {\n size: SIZE_VARIANTS_DEFAULT,\n },\n }\n)\n\n/** @deprecated Use inputVariants instead */\nexport const InputVariants = inputVariants\n\nexport interface InputProps\n extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size'>, VariantProps<typeof inputVariants> {}\n\nconst LTR_INPUT_TYPES = new Set(['email', 'url', 'tel', 'number', 'password'])\n\nconst Input = React.forwardRef<HTMLInputElement, InputProps>(({ className, type, size = 'sm', dir, ...props }, ref) => {\n // LTR content types: auto-set dir=\"ltr\" unless caller explicitly overrides\n const resolvedDir = dir ?? (type && LTR_INPUT_TYPES.has(type) ? 'ltr' : undefined)\n return (\n <input\n type={type}\n ref={ref}\n data-slot=\"input\"\n dir={resolvedDir}\n {...props}\n className={cn(inputVariants({ size }), className)}\n />\n )\n})\n\nInput.displayName = 'Input'\n\nexport { Input }\n"]}
@@ -0,0 +1,108 @@
1
+ 'use strict';
2
+
3
+ var chunkYE477L2H_cjs = require('./chunk-YE477L2H.cjs');
4
+ var chunkNV4JOKWL_cjs = require('./chunk-NV4JOKWL.cjs');
5
+ var lucideReact = require('lucide-react');
6
+ var reactDayPicker = require('react-day-picker');
7
+ var persian = require('react-day-picker/persian');
8
+ var locale = require('date-fns/locale');
9
+ var jsxRuntime = require('react/jsx-runtime');
10
+
11
+ function Calendar({
12
+ className,
13
+ classNames,
14
+ showOutsideDays = true,
15
+ usePersianCalendar = false,
16
+ ...props
17
+ }) {
18
+ const PickerComponent = usePersianCalendar ? persian.DayPicker : reactDayPicker.DayPicker;
19
+ const englishFormatters = !usePersianCalendar ? {
20
+ formatDay: (date) => {
21
+ if (!date || !(date instanceof Date)) {
22
+ return "";
23
+ }
24
+ const dayNumber = date.getDate();
25
+ return new Intl.NumberFormat("en-US", { useGrouping: false }).format(dayNumber);
26
+ },
27
+ formatWeekdayName: (date) => {
28
+ if (!date || !(date instanceof Date)) {
29
+ return "";
30
+ }
31
+ return new Intl.DateTimeFormat("en-US", { weekday: "short" }).format(date);
32
+ },
33
+ formatMonthCaption: (date) => {
34
+ if (!date || !(date instanceof Date)) {
35
+ return "";
36
+ }
37
+ return new Intl.DateTimeFormat("en-US", { month: "long", year: "numeric" }).format(date);
38
+ }
39
+ } : void 0;
40
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { "data-slot": "calendar", children: /* @__PURE__ */ jsxRuntime.jsx(
41
+ PickerComponent,
42
+ {
43
+ dir: usePersianCalendar ? "rtl" : "ltr",
44
+ locale: usePersianCalendar ? void 0 : locale.enUS,
45
+ formatters: englishFormatters,
46
+ showOutsideDays,
47
+ className: chunkNV4JOKWL_cjs.cn("p-6", usePersianCalendar ? "" : "font-sans", className),
48
+ classNames: {
49
+ months: "flex flex-col sm:flex-row gap-y-4 sm:gap-y-0",
50
+ month: "gap-y-4 mx-2",
51
+ month_caption: "flex justify-center pt-1 relative items-center h-7",
52
+ caption_label: "text-sm font-medium truncate",
53
+ button_previous: chunkNV4JOKWL_cjs.cn(
54
+ chunkYE477L2H_cjs.buttonVariants({ variant: "outline" }),
55
+ "absolute start-2 size-7 bg-transparent p-0 opacity-50 hover:opacity-100 border-0"
56
+ ),
57
+ button_next: chunkNV4JOKWL_cjs.cn(
58
+ chunkYE477L2H_cjs.buttonVariants({ variant: "outline" }),
59
+ "absolute end-2 size-7 bg-transparent p-0 opacity-50 hover:opacity-100 border-0"
60
+ ),
61
+ month_grid: "mt-4",
62
+ weekdays: "flex flex-row",
63
+ weekday: "text-muted-foreground rounded-md size-9 font-normal text-xs flex items-center justify-center",
64
+ week: "flex w-full mt-2",
65
+ day: chunkNV4JOKWL_cjs.cn("size-9 text-center text-sm p-0 relative", "focus-within:relative focus-within:z-20"),
66
+ day_button: chunkNV4JOKWL_cjs.cn(
67
+ "w-full cursor-pointer h-full p-0 font-normal rounded-md",
68
+ "aria-selected:opacity-100",
69
+ "border-0 shadow-none outline-none",
70
+ "transition-colors duration-150",
71
+ "hover:bg-accent hover:text-accent-foreground",
72
+ "focus-visible:ring-2 focus-visible:ring-primary focus-visible:ring-offset-2",
73
+ "flex items-center justify-center",
74
+ "text-foreground"
75
+ ),
76
+ range_start: "day-range-start",
77
+ range_end: "day-range-end",
78
+ selected: "bg-primary text-primary-foreground hover:bg-primary hover:text-primary-foreground focus:bg-primary focus:text-primary-foreground rounded-md",
79
+ today: "bg-accent text-accent-foreground",
80
+ outside: "day-outside text-muted-foreground aria-selected:bg-accent/50 aria-selected:text-muted-foreground",
81
+ disabled: "text-muted-foreground opacity-50",
82
+ range_middle: "aria-selected:bg-primary/20 aria-selected:text-foreground rounded-none",
83
+ hidden: "invisible",
84
+ ...classNames
85
+ },
86
+ components: {
87
+ Chevron: ({ orientation }) => {
88
+ if (usePersianCalendar) {
89
+ if (orientation === "left") {
90
+ return /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronRight, { className: "size-4" });
91
+ }
92
+ return /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronLeft, { className: "size-4" });
93
+ }
94
+ if (orientation === "left") {
95
+ return /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronLeft, { className: "size-4" });
96
+ }
97
+ return /* @__PURE__ */ jsxRuntime.jsx(lucideReact.ChevronRight, { className: "size-4" });
98
+ }
99
+ },
100
+ ...props
101
+ }
102
+ ) });
103
+ }
104
+ Calendar.displayName = "Calendar";
105
+
106
+ exports.Calendar = Calendar;
107
+ //# sourceMappingURL=chunk-SCX6AR53.cjs.map
108
+ //# sourceMappingURL=chunk-SCX6AR53.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/ui/calendar.tsx"],"names":["PersianDayPicker","DayPicker","jsx","enUS","cn","buttonVariants","ChevronRight","ChevronLeft"],"mappings":"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","file":"chunk-SCX6AR53.cjs","sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport { ChevronLeft, ChevronRight } from 'lucide-react'\nimport { DayPicker } from 'react-day-picker'\nimport { DayPicker as PersianDayPicker } from 'react-day-picker/persian'\nimport { enUS } from 'date-fns/locale'\n\nimport { cn } from '@/lib/utils'\nimport { buttonVariants } from './button'\n\nexport type CalendarProps = {\n usePersianCalendar?: boolean\n className?: string\n classNames?: Partial<Record<string, string>>\n showOutsideDays?: boolean\n} & (React.ComponentProps<typeof DayPicker> | React.ComponentProps<typeof PersianDayPicker>)\n\nfunction Calendar({\n className,\n classNames,\n showOutsideDays = true,\n usePersianCalendar = false,\n ...props\n}: CalendarProps) {\n const PickerComponent = usePersianCalendar ? PersianDayPicker : DayPicker\n\n // Formatters for English numbers in Gregorian calendar\n const englishFormatters = !usePersianCalendar\n ? {\n formatDay: (date: Date) => {\n // Force English numbers using Intl.NumberFormat with en-US locale\n if (!date || !(date instanceof Date)) {\n return ''\n }\n const dayNumber = date.getDate()\n return new Intl.NumberFormat('en-US', { useGrouping: false }).format(dayNumber)\n },\n formatWeekdayName: (date: Date) => {\n if (!date || !(date instanceof Date)) {\n return ''\n }\n return new Intl.DateTimeFormat('en-US', { weekday: 'short' }).format(date)\n },\n formatMonthCaption: (date: Date) => {\n if (!date || !(date instanceof Date)) {\n return ''\n }\n return new Intl.DateTimeFormat('en-US', { month: 'long', year: 'numeric' }).format(date)\n },\n }\n : undefined\n\n return (\n <div data-slot=\"calendar\">\n <PickerComponent\n dir={usePersianCalendar ? 'rtl' : 'ltr'}\n locale={usePersianCalendar ? undefined : enUS}\n formatters={englishFormatters}\n showOutsideDays={showOutsideDays}\n className={cn('p-6', usePersianCalendar ? '' : 'font-sans', className)}\n classNames={{\n months: 'flex flex-col sm:flex-row gap-y-4 sm:gap-y-0',\n month: 'gap-y-4 mx-2',\n month_caption: 'flex justify-center pt-1 relative items-center h-7',\n caption_label: 'text-sm font-medium truncate',\n button_previous: cn(\n buttonVariants({ variant: 'outline' }),\n 'absolute start-2 size-7 bg-transparent p-0 opacity-50 hover:opacity-100 border-0'\n ),\n button_next: cn(\n buttonVariants({ variant: 'outline' }),\n 'absolute end-2 size-7 bg-transparent p-0 opacity-50 hover:opacity-100 border-0'\n ),\n month_grid: 'mt-4',\n weekdays: 'flex flex-row',\n weekday: 'text-muted-foreground rounded-md size-9 font-normal text-xs flex items-center justify-center',\n week: 'flex w-full mt-2',\n day: cn('size-9 text-center text-sm p-0 relative', 'focus-within:relative focus-within:z-20'),\n day_button: cn(\n 'w-full cursor-pointer h-full p-0 font-normal rounded-md',\n 'aria-selected:opacity-100',\n 'border-0 shadow-none outline-none',\n 'transition-colors duration-150',\n 'hover:bg-accent hover:text-accent-foreground',\n 'focus-visible:ring-2 focus-visible:ring-primary focus-visible:ring-offset-2',\n 'flex items-center justify-center',\n 'text-foreground'\n ),\n range_start: 'day-range-start',\n range_end: 'day-range-end',\n selected:\n 'bg-primary text-primary-foreground hover:bg-primary hover:text-primary-foreground focus:bg-primary focus:text-primary-foreground rounded-md',\n today: 'bg-accent text-accent-foreground',\n outside: 'day-outside text-muted-foreground aria-selected:bg-accent/50 aria-selected:text-muted-foreground',\n disabled: 'text-muted-foreground opacity-50',\n range_middle: 'aria-selected:bg-primary/20 aria-selected:text-foreground rounded-none',\n hidden: 'invisible',\n ...classNames,\n }}\n components={{\n Chevron: ({ orientation }) => {\n // برای RTL (تقویم شمسی) فلش‌ها معکوس می‌شوند\n if (usePersianCalendar) {\n if (orientation === 'left') {\n return <ChevronRight className=\"size-4\" />\n }\n return <ChevronLeft className=\"size-4\" />\n }\n // برای LTR (تقویم میلادی) فلش‌ها طبیعی هستند\n if (orientation === 'left') {\n return <ChevronLeft className=\"size-4\" />\n }\n return <ChevronRight className=\"size-4\" />\n },\n }}\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n {...(props as any)}\n />\n </div>\n )\n}\nCalendar.displayName = 'Calendar'\n\nexport { Calendar }\n"]}