@parto-system-design/ui 1.1.5 → 1.1.8

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-2ACKKPWA.cjs +112 -0
  5. package/dist/chunk-2ACKKPWA.cjs.map +1 -0
  6. package/dist/chunk-2UD3LGVX.cjs +316 -0
  7. package/dist/chunk-2UD3LGVX.cjs.map +1 -0
  8. package/dist/chunk-3QYYPPFJ.js +269 -0
  9. package/dist/chunk-3QYYPPFJ.js.map +1 -0
  10. package/dist/chunk-4SVQNEVH.js +173 -0
  11. package/dist/chunk-4SVQNEVH.js.map +1 -0
  12. package/dist/chunk-4WONHORR.cjs +152 -0
  13. package/dist/chunk-4WONHORR.cjs.map +1 -0
  14. package/dist/chunk-5HCXH6GS.js +409 -0
  15. package/dist/chunk-5HCXH6GS.js.map +1 -0
  16. package/dist/chunk-5JJSRGJD.js +31 -0
  17. package/dist/chunk-5JJSRGJD.js.map +1 -0
  18. package/dist/chunk-5K6E4ZSW.cjs +77 -0
  19. package/dist/chunk-5K6E4ZSW.cjs.map +1 -0
  20. package/dist/chunk-5NY26ULO.js +89 -0
  21. package/dist/chunk-5NY26ULO.js.map +1 -0
  22. package/dist/chunk-7RVPG3LE.cjs +231 -0
  23. package/dist/chunk-7RVPG3LE.cjs.map +1 -0
  24. package/dist/chunk-AYEK3WOM.js +207 -0
  25. package/dist/chunk-AYEK3WOM.js.map +1 -0
  26. package/dist/chunk-BRMBLIQG.js +53 -0
  27. package/dist/chunk-BRMBLIQG.js.map +1 -0
  28. package/dist/chunk-CAJKSTXX.cjs +54 -0
  29. package/dist/chunk-CAJKSTXX.cjs.map +1 -0
  30. package/dist/chunk-CKFWMHQU.js +401 -0
  31. package/dist/chunk-CKFWMHQU.js.map +1 -0
  32. package/dist/chunk-CV3N3HVK.js +672 -0
  33. package/dist/chunk-CV3N3HVK.js.map +1 -0
  34. package/dist/chunk-D2EBLE2B.cjs +220 -0
  35. package/dist/chunk-D2EBLE2B.cjs.map +1 -0
  36. package/dist/chunk-GCZ6YATL.js +940 -0
  37. package/dist/chunk-GCZ6YATL.js.map +1 -0
  38. package/dist/chunk-GKRAZGDI.cjs +84 -0
  39. package/dist/chunk-GKRAZGDI.cjs.map +1 -0
  40. package/dist/chunk-GPYJ66CG.js +45 -0
  41. package/dist/chunk-GPYJ66CG.js.map +1 -0
  42. package/dist/chunk-HF6XU5NI.js +84 -0
  43. package/dist/chunk-HF6XU5NI.js.map +1 -0
  44. package/dist/chunk-HJPDZOMJ.cjs +87 -0
  45. package/dist/chunk-HJPDZOMJ.cjs.map +1 -0
  46. package/dist/chunk-HS3XI3CC.cjs +69 -0
  47. package/dist/chunk-HS3XI3CC.cjs.map +1 -0
  48. package/dist/chunk-HUCC3QH5.cjs +53 -0
  49. package/dist/chunk-HUCC3QH5.cjs.map +1 -0
  50. package/dist/chunk-HYZ6BQPS.cjs +425 -0
  51. package/dist/chunk-HYZ6BQPS.cjs.map +1 -0
  52. package/dist/chunk-ISCSZMYW.cjs +106 -0
  53. package/dist/chunk-ISCSZMYW.cjs.map +1 -0
  54. package/dist/chunk-IXFEFIDO.js +82 -0
  55. package/dist/chunk-IXFEFIDO.js.map +1 -0
  56. package/dist/chunk-JCJLN437.js +108 -0
  57. package/dist/chunk-JCJLN437.js.map +1 -0
  58. package/dist/chunk-JMKNNH63.cjs +982 -0
  59. package/dist/chunk-JMKNNH63.cjs.map +1 -0
  60. package/dist/chunk-JUBHQAA2.js +53 -0
  61. package/dist/chunk-JUBHQAA2.js.map +1 -0
  62. package/dist/chunk-K6G63EED.cjs +41 -0
  63. package/dist/chunk-K6G63EED.cjs.map +1 -0
  64. package/dist/chunk-KCWRCSI7.js +62 -0
  65. package/dist/chunk-KCWRCSI7.js.map +1 -0
  66. package/dist/chunk-KYM7NIJO.cjs +433 -0
  67. package/dist/chunk-KYM7NIJO.cjs.map +1 -0
  68. package/dist/chunk-L2L5CKC2.js +291 -0
  69. package/dist/chunk-L2L5CKC2.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-MEK4RSGC.js +65 -0
  73. package/dist/chunk-MEK4RSGC.js.map +1 -0
  74. package/dist/chunk-MEKWH3GS.js +89 -0
  75. package/dist/chunk-MEKWH3GS.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-MMC6M35Q.cjs +272 -0
  79. package/dist/chunk-MMC6M35Q.cjs.map +1 -0
  80. package/dist/chunk-NMH43BDC.js +130 -0
  81. package/dist/chunk-NMH43BDC.js.map +1 -0
  82. package/dist/chunk-NORDUD2T.cjs +135 -0
  83. package/dist/chunk-NORDUD2T.cjs.map +1 -0
  84. package/dist/chunk-NV4JOKWL.cjs +197 -0
  85. package/dist/chunk-NV4JOKWL.cjs.map +1 -0
  86. package/dist/chunk-O2JG7WY5.cjs +121 -0
  87. package/dist/chunk-O2JG7WY5.cjs.map +1 -0
  88. package/dist/chunk-ONO2FTV4.cjs +68 -0
  89. package/dist/chunk-ONO2FTV4.cjs.map +1 -0
  90. package/dist/chunk-OQB6HIUL.cjs +108 -0
  91. package/dist/chunk-OQB6HIUL.cjs.map +1 -0
  92. package/dist/chunk-OS6CMYAS.cjs +79 -0
  93. package/dist/chunk-OS6CMYAS.cjs.map +1 -0
  94. package/dist/chunk-PYURPUTV.js +402 -0
  95. package/dist/chunk-PYURPUTV.js.map +1 -0
  96. package/dist/chunk-RJ3HYZ7S.js +44 -0
  97. package/dist/chunk-RJ3HYZ7S.js.map +1 -0
  98. package/dist/chunk-RZNRIOLT.js +128 -0
  99. package/dist/chunk-RZNRIOLT.js.map +1 -0
  100. package/dist/chunk-S3T2L6NA.js +38 -0
  101. package/dist/chunk-S3T2L6NA.js.map +1 -0
  102. package/dist/chunk-S5IPJQZ3.cjs +161 -0
  103. package/dist/chunk-S5IPJQZ3.cjs.map +1 -0
  104. package/dist/chunk-SB5DSYR5.js +211 -0
  105. package/dist/chunk-SB5DSYR5.js.map +1 -0
  106. package/dist/chunk-SFXV2DUH.js +106 -0
  107. package/dist/chunk-SFXV2DUH.js.map +1 -0
  108. package/dist/chunk-SXEPGD4Z.cjs +152 -0
  109. package/dist/chunk-SXEPGD4Z.cjs.map +1 -0
  110. package/dist/chunk-SXWSOU3Y.js +89 -0
  111. package/dist/chunk-SXWSOU3Y.js.map +1 -0
  112. package/dist/chunk-SZMVOHT7.cjs +107 -0
  113. package/dist/chunk-SZMVOHT7.cjs.map +1 -0
  114. package/dist/chunk-TWJXOV4C.js +145 -0
  115. package/dist/chunk-TWJXOV4C.js.map +1 -0
  116. package/dist/chunk-U3ADRIVO.cjs +434 -0
  117. package/dist/chunk-U3ADRIVO.cjs.map +1 -0
  118. package/dist/chunk-U5FLLCGC.cjs +151 -0
  119. package/dist/chunk-U5FLLCGC.cjs.map +1 -0
  120. package/dist/chunk-UOZN45G4.cjs +130 -0
  121. package/dist/chunk-UOZN45G4.cjs.map +1 -0
  122. package/dist/chunk-VHLDOG74.cjs +167 -0
  123. package/dist/chunk-VHLDOG74.cjs.map +1 -0
  124. package/dist/chunk-YC5KLN6I.js +139 -0
  125. package/dist/chunk-YC5KLN6I.js.map +1 -0
  126. package/dist/chunk-YENXXYUV.cjs +111 -0
  127. package/dist/chunk-YENXXYUV.cjs.map +1 -0
  128. package/dist/chunk-YFQWC2PW.js +113 -0
  129. package/dist/chunk-YFQWC2PW.js.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-ZBZDR4ZC.js +106 -0
  135. package/dist/chunk-ZBZDR4ZC.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 +53 -0
  139. package/dist/components/charts/PartoAreaChart.d.ts +53 -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 +61 -0
  145. package/dist/components/charts/PartoBarChart.d.ts +61 -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 +57 -0
  151. package/dist/components/charts/PartoLineChart.d.ts +57 -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 +52 -0
  157. package/dist/components/charts/PartoPieChart.d.ts +52 -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 +12195 -13224
  291. package/dist/index.cjs.map +1 -1
  292. package/dist/index.css +490 -34
  293. package/dist/index.d.cts +1635 -1263
  294. package/dist/index.d.ts +1635 -1263
  295. package/dist/index.js +10693 -12364
  296. package/dist/index.js.map +1 -1
  297. package/dist/page-card-CmShVqG-.d.cts +100 -0
  298. package/dist/page-card-HBn-cy4J.d.ts +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,433 @@
1
+ 'use strict';
2
+
3
+ var chunkD2EBLE2B_cjs = require('./chunk-D2EBLE2B.cjs');
4
+ var chunkNV4JOKWL_cjs = require('./chunk-NV4JOKWL.cjs');
5
+ var React2 = require('react');
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 React2__namespace = /*#__PURE__*/_interopNamespace(React2);
27
+
28
+ function useRootStyles() {
29
+ const [version, setVersion] = React2.useState(0);
30
+ React2.useEffect(() => {
31
+ if (typeof window === "undefined" || !document?.documentElement) {
32
+ return;
33
+ }
34
+ const target = document.documentElement;
35
+ const observer = new MutationObserver(() => {
36
+ setVersion((prev) => prev + 1);
37
+ });
38
+ observer.observe(target, {
39
+ attributes: true,
40
+ attributeFilter: ["class", "data-theme"]
41
+ });
42
+ const media = window.matchMedia("(prefers-color-scheme: dark)");
43
+ const mediaHandler = () => setVersion((prev) => prev + 1);
44
+ media.addEventListener("change", mediaHandler);
45
+ return () => {
46
+ observer.disconnect();
47
+ media.removeEventListener("change", mediaHandler);
48
+ };
49
+ }, []);
50
+ return React2.useMemo(() => {
51
+ if (typeof window === "undefined" || !document?.documentElement) {
52
+ return null;
53
+ }
54
+ return getComputedStyle(document.documentElement);
55
+ }, [version]);
56
+ }
57
+
58
+ // src/lib/theme.ts
59
+ var COLOR_VALUE_REGEX = /^(#|rgb|hsl|oklch)/i;
60
+ function resolveCssColor(styles, variable, fallback) {
61
+ if (!styles) return fallback;
62
+ const raw = styles.getPropertyValue(variable).trim();
63
+ if (!raw) return fallback;
64
+ if (COLOR_VALUE_REGEX.test(raw)) return raw;
65
+ if (raw.includes("%")) return `hsl(${raw})`;
66
+ return raw;
67
+ }
68
+
69
+ // src/hooks/use-chart-theme.ts
70
+ var FALLBACKS = {
71
+ foregroundMuted: "hsl(0 0% 50%)",
72
+ border: "hsl(0 0% 22%)",
73
+ popover: "hsl(0 0% 10%)",
74
+ popoverForeground: "hsl(0 0% 98%)",
75
+ chart1: "hsl(153 55% 42%)",
76
+ chart2: "hsl(198 50% 48%)",
77
+ chart3: "hsl(240 40% 54%)",
78
+ chart4: "hsl(310 38% 52%)",
79
+ chart5: "hsl(355 45% 52%)",
80
+ chart6: "hsl(35 52% 48%)",
81
+ chart7: "hsl(75 38% 46%)",
82
+ chart8: "hsl(118 35% 46%)"
83
+ };
84
+ var CHART_FONT_FAMILY = "Yekan Bakh, system-ui, -apple-system, sans-serif";
85
+ function useChartTheme() {
86
+ const styles = useRootStyles();
87
+ return React2__namespace.useMemo(() => {
88
+ const getColor = (variable, fallback) => resolveCssColor(styles, variable, fallback);
89
+ const chartColors = [
90
+ getColor("--chart-1", FALLBACKS.chart1),
91
+ getColor("--chart-2", FALLBACKS.chart2),
92
+ getColor("--chart-3", FALLBACKS.chart3),
93
+ getColor("--chart-4", FALLBACKS.chart4),
94
+ getColor("--chart-5", FALLBACKS.chart5),
95
+ getColor("--chart-6", FALLBACKS.chart6),
96
+ getColor("--chart-7", FALLBACKS.chart7),
97
+ getColor("--chart-8", FALLBACKS.chart8)
98
+ ];
99
+ const axisTickStyle = {
100
+ fontFamily: CHART_FONT_FAMILY,
101
+ fill: getColor("--foreground-lighter", FALLBACKS.foregroundMuted),
102
+ fontSize: 11,
103
+ fontWeight: 400
104
+ };
105
+ const gridStyle = {
106
+ stroke: getColor("--border", FALLBACKS.border),
107
+ strokeDasharray: "3 3",
108
+ strokeOpacity: 0.15
109
+ };
110
+ const tooltipStyle = {
111
+ fontFamily: CHART_FONT_FAMILY,
112
+ background: getColor("--background-overlay-default", FALLBACKS.popover),
113
+ color: getColor("--foreground-default", FALLBACKS.popoverForeground),
114
+ fontSize: 12,
115
+ lineHeight: "1.5",
116
+ borderRadius: "10px",
117
+ border: `1px solid ${getColor("--border-muted", FALLBACKS.border)}`,
118
+ boxShadow: "0 4px 24px -4px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.06)",
119
+ padding: "10px 14px",
120
+ backdropFilter: "blur(8px)",
121
+ WebkitBackdropFilter: "blur(8px)"
122
+ };
123
+ const crosshairStyle = {
124
+ stroke: getColor("--foreground-muted", FALLBACKS.foregroundMuted),
125
+ strokeWidth: 1,
126
+ strokeDasharray: "4 4",
127
+ strokeOpacity: 0.5
128
+ };
129
+ return {
130
+ chartColors,
131
+ getColor,
132
+ fontFamily: CHART_FONT_FAMILY,
133
+ axisTickStyle,
134
+ gridStyle,
135
+ tooltipStyle,
136
+ crosshairStyle
137
+ };
138
+ }, [styles]);
139
+ }
140
+ var ChartContainer = React2__namespace.forwardRef(
141
+ ({ className, dataSlot, ariaLabel, children }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
142
+ "div",
143
+ {
144
+ ref,
145
+ className,
146
+ dir: "ltr",
147
+ "data-slot": dataSlot,
148
+ role: "img",
149
+ "aria-label": ariaLabel ?? "\u0646\u0645\u0648\u062F\u0627\u0631",
150
+ style: { position: "relative", width: "100%", height: "100%" },
151
+ children
152
+ }
153
+ )
154
+ );
155
+ ChartContainer.displayName = "ChartContainer";
156
+ function ChartLoadingSkeleton({ className, shape = "rect" }) {
157
+ return /* @__PURE__ */ jsxRuntime.jsx(
158
+ "div",
159
+ {
160
+ "data-slot": "chart-loading-skeleton",
161
+ className,
162
+ dir: "ltr",
163
+ style: { position: "relative", width: "100%", height: "100%" },
164
+ role: "status",
165
+ "aria-label": "Loading chart",
166
+ children: /* @__PURE__ */ jsxRuntime.jsx(
167
+ chunkD2EBLE2B_cjs.Skeleton,
168
+ {
169
+ shape,
170
+ className: shape === "circle" ? "w-full h-full min-h-[200px] aspect-square mx-auto" : "w-full h-full min-h-[200px]"
171
+ }
172
+ )
173
+ }
174
+ );
175
+ }
176
+ var LOCALE_TO_BCP47 = {
177
+ fa: "fa-IR",
178
+ ar: "ar",
179
+ en: "en-US"
180
+ };
181
+ function ChartTooltip({ active, payload, label, tooltipStyle, formatter, locale = "fa" }) {
182
+ if (!active || !payload?.length) return null;
183
+ const bcp47 = LOCALE_TO_BCP47[locale] ?? "fa-IR";
184
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { "data-slot": "chart-tooltip", style: tooltipStyle, children: [
185
+ label && /* @__PURE__ */ jsxRuntime.jsx("div", { style: { fontWeight: 500, fontSize: 13, marginBottom: 6 }, children: label }),
186
+ payload.map((entry, i) => /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "flex", alignItems: "center", gap: 8, marginTop: i > 0 ? 4 : 0 }, children: [
187
+ /* @__PURE__ */ jsxRuntime.jsx(
188
+ "div",
189
+ {
190
+ style: {
191
+ width: 10,
192
+ height: 10,
193
+ borderRadius: 2,
194
+ backgroundColor: entry.color,
195
+ flexShrink: 0
196
+ }
197
+ }
198
+ ),
199
+ formatter ? formatter(entry.name, entry.value) : /* @__PURE__ */ jsxRuntime.jsxs("span", { style: { display: "flex", justifyContent: "space-between", width: "100%", gap: 16 }, children: [
200
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: { opacity: 0.7 }, children: entry.name }),
201
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: { fontWeight: 600, fontVariantNumeric: "tabular-nums" }, children: typeof entry.value === "number" ? entry.value.toLocaleString(bcp47) : entry.value })
202
+ ] })
203
+ ] }, i))
204
+ ] });
205
+ }
206
+ function localeAwareNumberTick(locale) {
207
+ return (value) => {
208
+ if (typeof value === "number") return chunkNV4JOKWL_cjs.formatLargeNumber(value, locale);
209
+ if (typeof value === "string") {
210
+ if (/^-?\d+(\.\d+)?$/.test(value)) return chunkNV4JOKWL_cjs.convertToLocalNumbers(value, locale);
211
+ return value;
212
+ }
213
+ return String(value ?? "");
214
+ };
215
+ }
216
+ function localeAwareCategoryTick(locale) {
217
+ return (value) => chunkNV4JOKWL_cjs.convertToLocalNumbers(String(value ?? ""), locale);
218
+ }
219
+ var PATTERN_DASHARRAY = {
220
+ solid: void 0,
221
+ dashed: "4 3",
222
+ dotted: "1 3",
223
+ "dash-dot": "4 2 1 2"
224
+ };
225
+ var ChartLegend = React2__namespace.forwardRef(
226
+ ({ className, items, orientation = "horizontal", swatchSize = 10, ...props }, ref) => {
227
+ const isVertical = orientation === "vertical";
228
+ return /* @__PURE__ */ jsxRuntime.jsx(
229
+ "div",
230
+ {
231
+ ref,
232
+ "data-slot": "chart-legend",
233
+ "data-orientation": orientation,
234
+ className,
235
+ style: {
236
+ display: "flex",
237
+ flexWrap: isVertical ? "nowrap" : "wrap",
238
+ flexDirection: isVertical ? "column" : "row",
239
+ gap: isVertical ? "6px" : "12px 16px",
240
+ fontSize: 12,
241
+ color: "hsl(var(--foreground-light))"
242
+ },
243
+ role: "list",
244
+ ...props,
245
+ children: items.map((item) => /* @__PURE__ */ jsxRuntime.jsxs(
246
+ "div",
247
+ {
248
+ role: "listitem",
249
+ "data-slot": "chart-legend-item",
250
+ style: { display: "inline-flex", alignItems: "center", gap: 6, lineHeight: 1.2 },
251
+ children: [
252
+ /* @__PURE__ */ jsxRuntime.jsx(
253
+ ChartLegendSwatch,
254
+ {
255
+ color: item.color,
256
+ shape: item.shape ?? "dot",
257
+ pattern: item.pattern ?? "solid",
258
+ size: swatchSize
259
+ }
260
+ ),
261
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: { fontWeight: 500 }, children: item.label }),
262
+ item.value !== void 0 && /* @__PURE__ */ jsxRuntime.jsx(
263
+ "span",
264
+ {
265
+ style: { marginInlineStart: 4, fontVariantNumeric: "tabular-nums", opacity: 0.7 },
266
+ "data-slot": "chart-legend-value",
267
+ children: item.value
268
+ }
269
+ )
270
+ ]
271
+ },
272
+ item.key
273
+ ))
274
+ }
275
+ );
276
+ }
277
+ );
278
+ ChartLegend.displayName = "ChartLegend";
279
+ function ChartLegendSwatch({
280
+ color,
281
+ shape,
282
+ pattern,
283
+ size
284
+ }) {
285
+ if (shape === "dot") {
286
+ return /* @__PURE__ */ jsxRuntime.jsx(
287
+ "span",
288
+ {
289
+ "aria-hidden": "true",
290
+ style: {
291
+ display: "inline-block",
292
+ width: size,
293
+ height: size,
294
+ borderRadius: "50%",
295
+ backgroundColor: color,
296
+ flexShrink: 0
297
+ }
298
+ }
299
+ );
300
+ }
301
+ if (shape === "bar") {
302
+ return /* @__PURE__ */ jsxRuntime.jsx(
303
+ "span",
304
+ {
305
+ "aria-hidden": "true",
306
+ style: {
307
+ display: "inline-block",
308
+ width: size + 4,
309
+ height: Math.max(3, Math.round(size / 2.5)),
310
+ borderRadius: 2,
311
+ backgroundColor: color,
312
+ flexShrink: 0
313
+ }
314
+ }
315
+ );
316
+ }
317
+ return /* @__PURE__ */ jsxRuntime.jsx(
318
+ "svg",
319
+ {
320
+ "aria-hidden": "true",
321
+ width: size + 8,
322
+ height: Math.max(8, Math.round(size / 1.5)),
323
+ viewBox: `0 0 ${size + 8} ${Math.max(8, Math.round(size / 1.5))}`,
324
+ style: { flexShrink: 0 },
325
+ children: /* @__PURE__ */ jsxRuntime.jsx(
326
+ "line",
327
+ {
328
+ x1: 1,
329
+ y1: Math.max(8, Math.round(size / 1.5)) / 2,
330
+ x2: size + 7,
331
+ y2: Math.max(8, Math.round(size / 1.5)) / 2,
332
+ stroke: color,
333
+ strokeWidth: 2,
334
+ strokeLinecap: "round",
335
+ strokeDasharray: PATTERN_DASHARRAY[pattern]
336
+ }
337
+ )
338
+ }
339
+ );
340
+ }
341
+ var ChartGradientLegend = React2__namespace.forwardRef(
342
+ ({
343
+ className,
344
+ startColor,
345
+ endColor,
346
+ startLabel,
347
+ endLabel,
348
+ caption,
349
+ width = 160,
350
+ height = 8,
351
+ "aria-label": ariaLabelProp,
352
+ ...props
353
+ }, ref) => {
354
+ const ariaLabel = ariaLabelProp ?? (typeof startLabel === "string" && typeof endLabel === "string" ? `${startLabel} \u062A\u0627 ${endLabel}` : "\u0645\u0642\u06CC\u0627\u0633 \u0631\u0646\u06AF");
355
+ return /* @__PURE__ */ jsxRuntime.jsxs(
356
+ "div",
357
+ {
358
+ ref,
359
+ "data-slot": "chart-gradient-legend",
360
+ className,
361
+ role: "img",
362
+ "aria-label": ariaLabel,
363
+ style: {
364
+ display: "inline-flex",
365
+ flexDirection: "column",
366
+ gap: 4,
367
+ fontSize: 12,
368
+ color: "hsl(var(--foreground-light))"
369
+ },
370
+ ...props,
371
+ children: [
372
+ caption && /* @__PURE__ */ jsxRuntime.jsx("div", { "data-slot": "chart-gradient-legend-caption", style: { fontWeight: 500 }, children: caption }),
373
+ /* @__PURE__ */ jsxRuntime.jsx(
374
+ "div",
375
+ {
376
+ "data-slot": "chart-gradient-legend-bar",
377
+ "aria-hidden": "true",
378
+ style: {
379
+ width,
380
+ height,
381
+ borderRadius: height / 2,
382
+ background: `linear-gradient(to right, ${startColor}, ${endColor})`
383
+ }
384
+ }
385
+ ),
386
+ (startLabel !== void 0 || endLabel !== void 0) && /* @__PURE__ */ jsxRuntime.jsxs(
387
+ "div",
388
+ {
389
+ style: {
390
+ display: "flex",
391
+ justifyContent: "space-between",
392
+ width,
393
+ fontVariantNumeric: "tabular-nums",
394
+ opacity: 0.85
395
+ },
396
+ children: [
397
+ /* @__PURE__ */ jsxRuntime.jsx("span", { "data-slot": "chart-gradient-legend-start", children: startLabel }),
398
+ /* @__PURE__ */ jsxRuntime.jsx("span", { "data-slot": "chart-gradient-legend-end", children: endLabel })
399
+ ]
400
+ }
401
+ )
402
+ ]
403
+ }
404
+ );
405
+ }
406
+ );
407
+ ChartGradientLegend.displayName = "ChartGradientLegend";
408
+ function transformNivoLineData(nivoData) {
409
+ const dataKeys = nivoData.map((s) => s.id);
410
+ const xValues = nivoData[0]?.data.map((d) => d.x) ?? [];
411
+ const data = xValues.map((x, xi) => {
412
+ const row = { name: x };
413
+ for (const series of nivoData) {
414
+ row[series.id] = series.data[xi]?.y ?? 0;
415
+ }
416
+ return row;
417
+ });
418
+ return { data, dataKeys };
419
+ }
420
+
421
+ exports.CHART_FONT_FAMILY = CHART_FONT_FAMILY;
422
+ exports.ChartContainer = ChartContainer;
423
+ exports.ChartGradientLegend = ChartGradientLegend;
424
+ exports.ChartLegend = ChartLegend;
425
+ exports.ChartLoadingSkeleton = ChartLoadingSkeleton;
426
+ exports.ChartTooltip = ChartTooltip;
427
+ exports.localeAwareCategoryTick = localeAwareCategoryTick;
428
+ exports.localeAwareNumberTick = localeAwareNumberTick;
429
+ exports.transformNivoLineData = transformNivoLineData;
430
+ exports.useChartTheme = useChartTheme;
431
+ exports.useRootStyles = useRootStyles;
432
+ //# sourceMappingURL=chunk-KYM7NIJO.cjs.map
433
+ //# sourceMappingURL=chunk-KYM7NIJO.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/hooks/use-root-styles.ts","../src/lib/theme.ts","../src/hooks/use-chart-theme.ts","../src/components/charts/chart-utils.tsx"],"names":["useState","useEffect","useMemo","React","React2","jsx","Skeleton","jsxs","formatLargeNumber","convertToLocalNumbers"],"mappings":"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","file":"chunk-KYM7NIJO.cjs","sourcesContent":["'use client'\n\nimport { useEffect, useMemo, useState } from 'react'\n\n/**\n * Returns a snapshot of the current document root computed styles and\n * re-renders when the theme class or OS color scheme changes.\n */\nexport function useRootStyles() {\n const [version, setVersion] = useState(0)\n\n useEffect(() => {\n if (typeof window === 'undefined' || !document?.documentElement) {\n return\n }\n\n const target = document.documentElement\n const observer = new MutationObserver(() => {\n setVersion((prev) => prev + 1)\n })\n\n observer.observe(target, {\n attributes: true,\n attributeFilter: ['class', 'data-theme'],\n })\n\n const media = window.matchMedia('(prefers-color-scheme: dark)')\n const mediaHandler = () => setVersion((prev) => prev + 1)\n media.addEventListener('change', mediaHandler)\n\n return () => {\n observer.disconnect()\n media.removeEventListener('change', mediaHandler)\n }\n }, [])\n\n return useMemo(() => {\n if (typeof window === 'undefined' || !document?.documentElement) {\n return null\n }\n\n return getComputedStyle(document.documentElement)\n }, [version])\n}\n","const COLOR_VALUE_REGEX = /^(#|rgb|hsl|oklch)/i;\n\nexport function resolveCssColor(\n styles: CSSStyleDeclaration | null,\n variable: string,\n fallback: string,\n) {\n if (!styles) return fallback;\n const raw = styles.getPropertyValue(variable).trim();\n if (!raw) return fallback;\n if (COLOR_VALUE_REGEX.test(raw)) return raw;\n if (raw.includes('%')) return `hsl(${raw})`;\n return raw;\n}\n\n","'use client'\n\nimport * as React from 'react'\nimport { useRootStyles } from './use-root-styles'\nimport { resolveCssColor } from '@/lib/theme'\n\n/**\n * Chart theme hook — reads CSS design tokens at runtime and produces\n * resolved colors and styles for Recharts + Visx chart components.\n * Inspired by Linear, Vercel, and Stripe data visualizations.\n */\n\nconst FALLBACKS = {\n foreground: 'hsl(0 0% 98%)',\n foregroundMuted: 'hsl(0 0% 50%)',\n border: 'hsl(0 0% 22%)',\n popover: 'hsl(0 0% 10%)',\n popoverForeground: 'hsl(0 0% 98%)',\n chart1: 'hsl(153 55% 42%)',\n chart2: 'hsl(198 50% 48%)',\n chart3: 'hsl(240 40% 54%)',\n chart4: 'hsl(310 38% 52%)',\n chart5: 'hsl(355 45% 52%)',\n chart6: 'hsl(35 52% 48%)',\n chart7: 'hsl(75 38% 46%)',\n chart8: 'hsl(118 35% 46%)',\n}\n\nexport const CHART_FONT_FAMILY = 'Yekan Bakh, system-ui, -apple-system, sans-serif'\n\nexport function useChartTheme() {\n const styles = useRootStyles()\n\n return React.useMemo(() => {\n const getColor = (variable: string, fallback: string) => resolveCssColor(styles, variable, fallback)\n\n const chartColors = [\n getColor('--chart-1', FALLBACKS.chart1),\n getColor('--chart-2', FALLBACKS.chart2),\n getColor('--chart-3', FALLBACKS.chart3),\n getColor('--chart-4', FALLBACKS.chart4),\n getColor('--chart-5', FALLBACKS.chart5),\n getColor('--chart-6', FALLBACKS.chart6),\n getColor('--chart-7', FALLBACKS.chart7),\n getColor('--chart-8', FALLBACKS.chart8),\n ]\n\n const axisTickStyle = {\n fontFamily: CHART_FONT_FAMILY,\n fill: getColor('--foreground-lighter', FALLBACKS.foregroundMuted),\n fontSize: 11,\n fontWeight: 400 as const,\n }\n\n const gridStyle = {\n stroke: getColor('--border', FALLBACKS.border),\n strokeDasharray: '3 3',\n strokeOpacity: 0.15,\n }\n\n const tooltipStyle: React.CSSProperties = {\n fontFamily: CHART_FONT_FAMILY,\n background: getColor('--background-overlay-default', FALLBACKS.popover),\n color: getColor('--foreground-default', FALLBACKS.popoverForeground),\n fontSize: 12,\n lineHeight: '1.5',\n borderRadius: '10px',\n border: `1px solid ${getColor('--border-muted', FALLBACKS.border)}`,\n boxShadow: '0 4px 24px -4px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.06)',\n padding: '10px 14px',\n backdropFilter: 'blur(8px)',\n WebkitBackdropFilter: 'blur(8px)',\n }\n\n const crosshairStyle = {\n stroke: getColor('--foreground-muted', FALLBACKS.foregroundMuted),\n strokeWidth: 1,\n strokeDasharray: '4 4',\n strokeOpacity: 0.5,\n }\n\n return {\n chartColors,\n getColor,\n fontFamily: CHART_FONT_FAMILY,\n axisTickStyle,\n gridStyle,\n tooltipStyle,\n crosshairStyle,\n }\n }, [styles])\n}\n","'use client'\n\nimport * as React from 'react'\nimport { Skeleton } from '@/components/ui/skeleton'\nimport { convertToLocalNumbers, formatLargeNumber, type SupportedLocale } from '@/lib/utils'\n\n// ─── Chart Container ─────────────────────────────────────────────────────────\n\ninterface ChartContainerProps {\n className?: string\n dataSlot: string\n ariaLabel?: string\n children: React.ReactNode\n}\n\nexport const ChartContainer = React.forwardRef<HTMLDivElement, ChartContainerProps>(\n ({ className, dataSlot, ariaLabel, children }, ref) => (\n <div\n ref={ref}\n className={className}\n dir=\"ltr\"\n data-slot={dataSlot}\n role=\"img\"\n aria-label={ariaLabel ?? 'نمودار'}\n style={{ position: 'relative', width: '100%', height: '100%' }}\n >\n {children}\n </div>\n )\n)\nChartContainer.displayName = 'ChartContainer'\n\n// ─── Chart Skeleton ──────────────────────────────────────────────────────────\n\ninterface ChartSkeletonProps {\n className?: string\n shape?: 'rect' | 'circle'\n}\n\nexport function ChartLoadingSkeleton({ className, shape = 'rect' }: ChartSkeletonProps) {\n return (\n <div\n data-slot=\"chart-loading-skeleton\"\n className={className}\n dir=\"ltr\"\n style={{ position: 'relative', width: '100%', height: '100%' }}\n role=\"status\"\n aria-label=\"Loading chart\"\n >\n <Skeleton\n shape={shape}\n className={\n shape === 'circle' ? 'w-full h-full min-h-[200px] aspect-square mx-auto' : 'w-full h-full min-h-[200px]'\n }\n />\n </div>\n )\n}\n\n// ─── Chart Tooltip ───────────────────────────────────────────────────────────\n\ninterface ChartTooltipProps {\n active?: boolean\n payload?: Array<{ name: string; value: number; color: string; dataKey?: string }>\n label?: string\n tooltipStyle: React.CSSProperties\n formatter?: (name: string, value: number) => React.ReactNode\n /** Locale for the default value formatter. fa/ar render Persian/Arabic digits with thousands separators; en uses Latin. */\n locale?: SupportedLocale\n}\n\nconst LOCALE_TO_BCP47: Record<SupportedLocale, string> = {\n fa: 'fa-IR',\n ar: 'ar',\n en: 'en-US',\n}\n\nexport function ChartTooltip({ active, payload, label, tooltipStyle, formatter, locale = 'fa' }: ChartTooltipProps) {\n if (!active || !payload?.length) return null\n\n const bcp47 = LOCALE_TO_BCP47[locale] ?? 'fa-IR'\n\n return (\n <div data-slot=\"chart-tooltip\" style={tooltipStyle}>\n {label && <div style={{ fontWeight: 500, fontSize: 13, marginBottom: 6 }}>{label}</div>}\n {payload.map((entry, i) => (\n <div key={i} style={{ display: 'flex', alignItems: 'center', gap: 8, marginTop: i > 0 ? 4 : 0 }}>\n <div\n style={{\n width: 10,\n height: 10,\n borderRadius: 2,\n backgroundColor: entry.color,\n flexShrink: 0,\n }}\n />\n {formatter ? (\n formatter(entry.name, entry.value)\n ) : (\n <span style={{ display: 'flex', justifyContent: 'space-between', width: '100%', gap: 16 }}>\n <span style={{ opacity: 0.7 }}>{entry.name}</span>\n <span style={{ fontWeight: 600, fontVariantNumeric: 'tabular-nums' }}>\n {typeof entry.value === 'number' ? entry.value.toLocaleString(bcp47) : entry.value}\n </span>\n </span>\n )}\n </div>\n ))}\n </div>\n )\n}\n\n// ─── Locale-aware tick formatter ─────────────────────────────────────────────\n\n/**\n * Default tickFormatter for numeric chart axes (Y axis on Line/Area/Bar, both\n * axes on Scatter, radial on Radar). Renders Persian/Arabic digits + locale\n * suffix (\"۱.۵ هزار\", \"1.5K\") for fa/ar, Latin K/M/B for en.\n *\n * Pass via `axisLeft={{ tickFormatter: localeAwareNumberTick('fa') }}`, or rely\n * on the chart wrapper's `locale` prop which wires this in by default.\n */\nexport function localeAwareNumberTick(locale: SupportedLocale): (value: unknown) => string {\n return (value) => {\n if (typeof value === 'number') return formatLargeNumber(value, locale)\n if (typeof value === 'string') {\n // Numeric strings: convert digits only (don't touch labels).\n if (/^-?\\d+(\\.\\d+)?$/.test(value)) return convertToLocalNumbers(value, locale)\n return value\n }\n return String(value ?? '')\n }\n}\n\n/**\n * Default tickFormatter for categorical chart axes — converts embedded digits\n * to the locale's numerals (e.g. \"۱۴۰۳-۰۱\" for \"1403-01\") without altering\n * letters. Use on date/time axes whose labels carry digits.\n */\nexport function localeAwareCategoryTick(locale: SupportedLocale): (value: unknown) => string {\n return (value) => convertToLocalNumbers(String(value ?? ''), locale)\n}\n\n// ─── Chart Legend ────────────────────────────────────────────────────────────\n\nexport interface ChartLegendItem {\n /** Unique identifier — typically the dataKey or series id. */\n key: string\n /** Display label. Strings preferred so AT can read it. */\n label: React.ReactNode\n /** Marker color. Pass the resolved value (hsl, hex, or `var(--token)`). */\n color: string\n /**\n * Marker shape. `dot` for categorical (Bar/Pie), `line` for series (Line/Area),\n * `bar` for stacked distributions. @default `dot`\n */\n shape?: 'dot' | 'line' | 'bar'\n /**\n * Optional stroke pattern when `shape=\"line\"`. Lets color-blind users\n * distinguish series by texture in addition to color. WCAG 1.4.1\n * (Use of Color) recommends adding a non-color signal.\n */\n pattern?: 'solid' | 'dashed' | 'dotted' | 'dash-dot'\n /** Optional trailing value (count, percent, etc.). */\n value?: React.ReactNode\n}\n\nexport interface ChartLegendProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Series to enumerate. */\n items: ChartLegendItem[]\n /** Layout — `horizontal` wraps, `vertical` stacks. @default `horizontal` */\n orientation?: 'horizontal' | 'vertical'\n /** Marker square/dot edge length in px. @default `10` */\n swatchSize?: number\n}\n\nconst PATTERN_DASHARRAY: Record<NonNullable<ChartLegendItem['pattern']>, string | undefined> = {\n solid: undefined,\n dashed: '4 3',\n dotted: '1 3',\n 'dash-dot': '4 2 1 2',\n}\n\n/**\n * Reusable chart legend. Pair with `PartoLineChart`, `PartoBarChart`, etc. by\n * passing `legend={[…]}` or rendering `<ChartLegend>` next to the chart. Each\n * line-shape entry can carry a stroke pattern so colorblind users can read\n * series identity without relying on color alone.\n *\n * The legend has no chart-aware behavior on its own — pass the same colors\n * (resolved via `useChartTheme`) you handed to the chart's `Cell`/series.\n */\nexport const ChartLegend = React.forwardRef<HTMLDivElement, ChartLegendProps>(\n ({ className, items, orientation = 'horizontal', swatchSize = 10, ...props }, ref) => {\n const isVertical = orientation === 'vertical'\n return (\n <div\n ref={ref}\n data-slot=\"chart-legend\"\n data-orientation={orientation}\n className={className}\n style={{\n display: 'flex',\n flexWrap: isVertical ? 'nowrap' : 'wrap',\n flexDirection: isVertical ? 'column' : 'row',\n gap: isVertical ? '6px' : '12px 16px',\n fontSize: 12,\n color: 'hsl(var(--foreground-light))',\n }}\n // role=list + role=listitem because we use inline elements for layout\n // (some browsers/AT strip implicit list semantics from non-li children).\n role=\"list\"\n {...props}\n >\n {items.map((item) => (\n <div\n key={item.key}\n role=\"listitem\"\n data-slot=\"chart-legend-item\"\n style={{ display: 'inline-flex', alignItems: 'center', gap: 6, lineHeight: 1.2 }}\n >\n <ChartLegendSwatch\n color={item.color}\n shape={item.shape ?? 'dot'}\n pattern={item.pattern ?? 'solid'}\n size={swatchSize}\n />\n <span style={{ fontWeight: 500 }}>{item.label}</span>\n {item.value !== undefined && (\n <span\n style={{ marginInlineStart: 4, fontVariantNumeric: 'tabular-nums', opacity: 0.7 }}\n data-slot=\"chart-legend-value\"\n >\n {item.value}\n </span>\n )}\n </div>\n ))}\n </div>\n )\n }\n)\nChartLegend.displayName = 'ChartLegend'\n\nfunction ChartLegendSwatch({\n color,\n shape,\n pattern,\n size,\n}: {\n color: string\n shape: NonNullable<ChartLegendItem['shape']>\n pattern: NonNullable<ChartLegendItem['pattern']>\n size: number\n}) {\n if (shape === 'dot') {\n return (\n <span\n aria-hidden=\"true\"\n style={{\n display: 'inline-block',\n width: size,\n height: size,\n borderRadius: '50%',\n backgroundColor: color,\n flexShrink: 0,\n }}\n />\n )\n }\n if (shape === 'bar') {\n return (\n <span\n aria-hidden=\"true\"\n style={{\n display: 'inline-block',\n width: size + 4,\n height: Math.max(3, Math.round(size / 2.5)),\n borderRadius: 2,\n backgroundColor: color,\n flexShrink: 0,\n }}\n />\n )\n }\n // Line shape — SVG so we can render a stroke-dasharray pattern\n return (\n <svg\n aria-hidden=\"true\"\n width={size + 8}\n height={Math.max(8, Math.round(size / 1.5))}\n viewBox={`0 0 ${size + 8} ${Math.max(8, Math.round(size / 1.5))}`}\n style={{ flexShrink: 0 }}\n >\n <line\n x1={1}\n y1={Math.max(8, Math.round(size / 1.5)) / 2}\n x2={size + 7}\n y2={Math.max(8, Math.round(size / 1.5)) / 2}\n stroke={color}\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeDasharray={PATTERN_DASHARRAY[pattern]}\n />\n </svg>\n )\n}\n\n// ─── Chart Gradient Legend ───────────────────────────────────────────────────\n\nexport interface ChartGradientLegendProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Color at the low end of the scale (e.g. background-muted). */\n startColor: string\n /** Color at the high end (e.g. brand). */\n endColor: string\n /** Optional left/start label (typically the minimum value). */\n startLabel?: React.ReactNode\n /** Optional right/end label (typically the maximum value). */\n endLabel?: React.ReactNode\n /** Optional caption above the bar (e.g. \"تراکم انتشار\"). */\n caption?: React.ReactNode\n /** Bar width in px @default 160 */\n width?: number\n /** Bar height in px @default 8 */\n height?: number\n}\n\n/**\n * Continuous-scale legend for charts whose data is encoded as color intensity\n * (HeatMap, choropleth, gradient density). Renders a horizontal gradient bar\n * with start/end labels, captioned for AT via `role=\"img\"` + `aria-label`.\n *\n * For discrete categorical legends (Line/Bar/Pie), use `<ChartLegend>` instead.\n */\nexport const ChartGradientLegend = React.forwardRef<HTMLDivElement, ChartGradientLegendProps>(\n (\n {\n className,\n startColor,\n endColor,\n startLabel,\n endLabel,\n caption,\n width = 160,\n height = 8,\n 'aria-label': ariaLabelProp,\n ...props\n },\n ref\n ) => {\n const ariaLabel =\n ariaLabelProp ??\n (typeof startLabel === 'string' && typeof endLabel === 'string' ? `${startLabel} تا ${endLabel}` : 'مقیاس رنگ')\n return (\n <div\n ref={ref}\n data-slot=\"chart-gradient-legend\"\n className={className}\n role=\"img\"\n aria-label={ariaLabel}\n style={{\n display: 'inline-flex',\n flexDirection: 'column',\n gap: 4,\n fontSize: 12,\n color: 'hsl(var(--foreground-light))',\n }}\n {...props}\n >\n {caption && (\n <div data-slot=\"chart-gradient-legend-caption\" style={{ fontWeight: 500 }}>\n {caption}\n </div>\n )}\n <div\n data-slot=\"chart-gradient-legend-bar\"\n aria-hidden=\"true\"\n style={{\n width,\n height,\n borderRadius: height / 2,\n background: `linear-gradient(to right, ${startColor}, ${endColor})`,\n }}\n />\n {(startLabel !== undefined || endLabel !== undefined) && (\n <div\n style={{\n display: 'flex',\n justifyContent: 'space-between',\n width,\n fontVariantNumeric: 'tabular-nums',\n opacity: 0.85,\n }}\n >\n <span data-slot=\"chart-gradient-legend-start\">{startLabel}</span>\n <span data-slot=\"chart-gradient-legend-end\">{endLabel}</span>\n </div>\n )}\n </div>\n )\n }\n)\nChartGradientLegend.displayName = 'ChartGradientLegend'\n\n// ─── Data Transform Utility ──────────────────────────────────────────────────\n\n/**\n * Transforms Nivo line/area data format to Recharts row-oriented format.\n * Useful for consumers migrating from Nivo data shape.\n *\n * @example\n * // Nivo: [{ id: \"فروش\", data: [{ x: \"فروردین\", y: 50 }] }]\n * // Recharts: [{ name: \"فروردین\", فروش: 50 }]\n */\nexport function transformNivoLineData(\n nivoData: Array<{ id: string; data: Array<{ x: string | number; y: number }> }>\n): { data: Array<Record<string, string | number>>; dataKeys: string[] } {\n const dataKeys = nivoData.map((s) => s.id)\n const xValues = nivoData[0]?.data.map((d) => d.x) ?? []\n\n const data = xValues.map((x, xi) => {\n const row: Record<string, string | number> = { name: x }\n for (const series of nivoData) {\n row[series.id] = series.data[xi]?.y ?? 0\n }\n return row\n })\n\n return { data, dataKeys }\n}\n"]}