@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,151 @@
1
+ 'use strict';
2
+
3
+ var React = require('react');
4
+
5
+ function _interopNamespace(e) {
6
+ if (e && e.__esModule) return e;
7
+ var n = Object.create(null);
8
+ if (e) {
9
+ Object.keys(e).forEach(function (k) {
10
+ if (k !== 'default') {
11
+ var d = Object.getOwnPropertyDescriptor(e, k);
12
+ Object.defineProperty(n, k, d.get ? d : {
13
+ enumerable: true,
14
+ get: function () { return e[k]; }
15
+ });
16
+ }
17
+ });
18
+ }
19
+ n.default = e;
20
+ return Object.freeze(n);
21
+ }
22
+
23
+ var React__namespace = /*#__PURE__*/_interopNamespace(React);
24
+
25
+ // src/hooks/use-hotkeys.ts
26
+ function isMac() {
27
+ if (typeof navigator === "undefined") return false;
28
+ const ua = navigator.userAgentData?.platform;
29
+ const platform = ua ?? navigator.platform ?? "";
30
+ return /mac|darwin/i.test(platform);
31
+ }
32
+ var SPECIAL_KEY_MAP = {
33
+ " ": "space",
34
+ spacebar: "space",
35
+ esc: "escape",
36
+ del: "delete",
37
+ return: "enter",
38
+ arrowup: "up",
39
+ arrowdown: "down",
40
+ arrowleft: "left",
41
+ arrowright: "right"
42
+ };
43
+ function normalizeKey(raw) {
44
+ const lower = raw.toLowerCase();
45
+ return SPECIAL_KEY_MAP[lower] ?? lower;
46
+ }
47
+ function parseCombo(combo) {
48
+ const parts = combo.toLowerCase().split("+").map((s) => s.trim()).filter(Boolean);
49
+ const result = {
50
+ mod: false,
51
+ ctrl: false,
52
+ cmd: false,
53
+ shift: false,
54
+ alt: false,
55
+ meta: false,
56
+ key: ""
57
+ };
58
+ for (const p of parts) {
59
+ if (p === "mod") result.mod = true;
60
+ else if (p === "ctrl" || p === "control") result.ctrl = true;
61
+ else if (p === "cmd" || p === "command" || p === "win") result.cmd = true;
62
+ else if (p === "shift") result.shift = true;
63
+ else if (p === "alt" || p === "option" || p === "opt") result.alt = true;
64
+ else if (p === "meta") result.meta = true;
65
+ else result.key = normalizeKey(p);
66
+ }
67
+ return result;
68
+ }
69
+ function matches(parsed, event, mac) {
70
+ const requiredCmd = parsed.cmd || parsed.mod && mac;
71
+ const requiredCtrl = parsed.ctrl || parsed.mod && !mac;
72
+ if (requiredCmd !== event.metaKey) return false;
73
+ if (requiredCtrl !== event.ctrlKey) return false;
74
+ if (parsed.shift !== event.shiftKey) return false;
75
+ if (parsed.alt !== event.altKey) return false;
76
+ if (parsed.meta && !mac && !event.metaKey) return false;
77
+ if (!parsed.key) return true;
78
+ const eventKey = normalizeKey(event.key);
79
+ return eventKey === parsed.key;
80
+ }
81
+ function isEditable(el) {
82
+ if (!(el instanceof HTMLElement)) return false;
83
+ if (el.isContentEditable) return true;
84
+ const tag = el.tagName;
85
+ if (tag === "INPUT") {
86
+ const type = el.type;
87
+ return !["button", "submit", "reset", "checkbox", "radio", "range", "color", "file"].includes(type);
88
+ }
89
+ return tag === "TEXTAREA" || tag === "SELECT";
90
+ }
91
+ function hasModifier(event) {
92
+ return event.metaKey || event.ctrlKey || event.altKey;
93
+ }
94
+ function resolveTarget(target) {
95
+ if (!target) return typeof document !== "undefined" ? document : null;
96
+ if (target instanceof Document) return target;
97
+ if ("current" in target) return target.current ?? null;
98
+ return target;
99
+ }
100
+ function useHotkeys(combo, handler, options = {}) {
101
+ const { preventDefault = true, ignoreWhenTyping = true, enabled = true, target } = options;
102
+ const handlerRef = React__namespace.useRef(handler);
103
+ React__namespace.useEffect(() => {
104
+ handlerRef.current = handler;
105
+ }, [handler]);
106
+ React__namespace.useEffect(() => {
107
+ if (!enabled) return;
108
+ const resolvedTarget = resolveTarget(target);
109
+ if (!resolvedTarget) return;
110
+ const combos = (Array.isArray(combo) ? combo : [combo]).map(parseCombo);
111
+ const mac = isMac();
112
+ const listener = (event) => {
113
+ const keyboardEvent = event;
114
+ const matched = combos.find((parsed) => matches(parsed, keyboardEvent, mac));
115
+ if (!matched) return;
116
+ if (ignoreWhenTyping && isEditable(keyboardEvent.target) && !hasModifier(keyboardEvent)) {
117
+ return;
118
+ }
119
+ if (preventDefault) keyboardEvent.preventDefault();
120
+ handlerRef.current(keyboardEvent);
121
+ };
122
+ resolvedTarget.addEventListener("keydown", listener);
123
+ return () => {
124
+ resolvedTarget.removeEventListener("keydown", listener);
125
+ };
126
+ }, [Array.isArray(combo) ? combo.join("|") : combo, enabled, ignoreWhenTyping, preventDefault, target]);
127
+ }
128
+ function formatHotkey(combo) {
129
+ const mac = isMac();
130
+ return combo.split("+").map((p) => {
131
+ const t = p.trim().toLowerCase();
132
+ if (t === "mod") return mac ? "\u2318" : "Ctrl";
133
+ if (t === "cmd" || t === "meta") return mac ? "\u2318" : "Win";
134
+ if (t === "ctrl" || t === "control") return mac ? "\u2303" : "Ctrl";
135
+ if (t === "shift") return mac ? "\u21E7" : "Shift";
136
+ if (t === "alt" || t === "option" || t === "opt") return mac ? "\u2325" : "Alt";
137
+ if (t === "enter" || t === "return") return "\u21B5";
138
+ if (t === "escape" || t === "esc") return "Esc";
139
+ if (t === "space") return "Space";
140
+ if (t === "up") return "\u2191";
141
+ if (t === "down") return "\u2193";
142
+ if (t === "left") return "\u2190";
143
+ if (t === "right") return "\u2192";
144
+ return t.length === 1 ? t.toUpperCase() : t;
145
+ }).join(mac ? "" : "+");
146
+ }
147
+
148
+ exports.formatHotkey = formatHotkey;
149
+ exports.useHotkeys = useHotkeys;
150
+ //# sourceMappingURL=chunk-U5FLLCGC.cjs.map
151
+ //# sourceMappingURL=chunk-U5FLLCGC.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/hooks/use-hotkeys.ts"],"names":["React"],"mappings":"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","file":"chunk-U5FLLCGC.cjs","sourcesContent":["'use client'\n\nimport * as React from 'react'\n\n/**\n * Hotkey string grammar:\n *\n * <part>[+<part>]*\n *\n * where each <part> is one of:\n * mod — Cmd on macOS, Ctrl on everything else (recommended)\n * ctrl / cmd — explicit, cross-platform tokens\n * shift | alt | meta\n * <single key> — lowercase character, 'space', 'enter', 'escape', 'tab',\n * arrow{up,down,left,right}, 'slash', 'backspace', etc.\n *\n * Examples:\n * 'mod+k' — ⌘K on macOS, CtrlK elsewhere\n * 'mod+shift+p'\n * 'escape'\n * 'ctrl+k' — explicit Ctrl (no Cmd fallback on macOS)\n *\n * Passing an array of strings is treated as an OR — any combo fires the handler.\n */\nexport type HotkeyCombo = string | readonly string[]\n\nexport interface UseHotkeysOptions {\n /**\n * When true, `event.preventDefault()` is called on matched combos.\n * Default: true. Useful to allow the browser's native 'mod+k' (address bar)\n * to keep working — set to false if the handler only does something conditionally.\n */\n preventDefault?: boolean\n /**\n * Skip the handler when focus is inside an editable control (input, textarea,\n * contenteditable). The exception: combos that include a modifier (mod/ctrl/\n * cmd/alt) still fire — they are unambiguous shortcuts, not typing.\n * Default: true.\n */\n ignoreWhenTyping?: boolean\n /**\n * When false, the hook unregisters its listener. Useful for conditionally\n * enabling shortcuts (e.g., only while a panel is open).\n * Default: true.\n */\n enabled?: boolean\n /**\n * DOM target. Defaults to `document`. Pass a ref for scoped shortcuts (e.g.,\n * only when a specific panel has focus within).\n */\n target?: React.RefObject<HTMLElement | null> | HTMLElement | Document | null\n}\n\nfunction isMac(): boolean {\n if (typeof navigator === 'undefined') return false\n // `userAgentData.platform` is the modern API; fall back to platform string.\n // Accept 'darwin' (nodejs tests) and 'MacIntel'/'Mac OS X'.\n const ua = (navigator as Navigator & { userAgentData?: { platform?: string } }).userAgentData?.platform\n const platform = ua ?? navigator.platform ?? ''\n return /mac|darwin/i.test(platform)\n}\n\nconst SPECIAL_KEY_MAP: Record<string, string> = {\n ' ': 'space',\n spacebar: 'space',\n esc: 'escape',\n del: 'delete',\n return: 'enter',\n arrowup: 'up',\n arrowdown: 'down',\n arrowleft: 'left',\n arrowright: 'right',\n}\n\nfunction normalizeKey(raw: string): string {\n const lower = raw.toLowerCase()\n return SPECIAL_KEY_MAP[lower] ?? lower\n}\n\ntype ParsedCombo = {\n mod: boolean\n ctrl: boolean\n cmd: boolean\n shift: boolean\n alt: boolean\n meta: boolean\n key: string\n}\n\nfunction parseCombo(combo: string): ParsedCombo {\n const parts = combo\n .toLowerCase()\n .split('+')\n .map((s) => s.trim())\n .filter(Boolean)\n const result: ParsedCombo = {\n mod: false,\n ctrl: false,\n cmd: false,\n shift: false,\n alt: false,\n meta: false,\n key: '',\n }\n for (const p of parts) {\n if (p === 'mod') result.mod = true\n else if (p === 'ctrl' || p === 'control') result.ctrl = true\n else if (p === 'cmd' || p === 'command' || p === 'win') result.cmd = true\n else if (p === 'shift') result.shift = true\n else if (p === 'alt' || p === 'option' || p === 'opt') result.alt = true\n else if (p === 'meta') result.meta = true\n else result.key = normalizeKey(p)\n }\n return result\n}\n\nfunction matches(parsed: ParsedCombo, event: KeyboardEvent, mac: boolean): boolean {\n // `mod` resolves to Cmd on macOS, Ctrl elsewhere. Track both sides of the combo.\n const requiredCmd = parsed.cmd || (parsed.mod && mac)\n const requiredCtrl = parsed.ctrl || (parsed.mod && !mac)\n\n if (requiredCmd !== event.metaKey) return false\n if (requiredCtrl !== event.ctrlKey) return false\n if (parsed.shift !== event.shiftKey) return false\n if (parsed.alt !== event.altKey) return false\n // `meta` (plain) aliases Cmd on macOS — avoid double-matching when both mod+meta are specified.\n if (parsed.meta && !mac && !event.metaKey) return false\n\n if (!parsed.key) return true\n const eventKey = normalizeKey(event.key)\n return eventKey === parsed.key\n}\n\nfunction isEditable(el: EventTarget | null): boolean {\n if (!(el instanceof HTMLElement)) return false\n if (el.isContentEditable) return true\n const tag = el.tagName\n if (tag === 'INPUT') {\n const type = (el as HTMLInputElement).type\n // Buttons and checkboxes aren't \"typing\" — don't block.\n return !['button', 'submit', 'reset', 'checkbox', 'radio', 'range', 'color', 'file'].includes(type)\n }\n return tag === 'TEXTAREA' || tag === 'SELECT'\n}\n\nfunction hasModifier(event: KeyboardEvent): boolean {\n return event.metaKey || event.ctrlKey || event.altKey\n}\n\nfunction resolveTarget(target: UseHotkeysOptions['target']): EventTarget | null {\n if (!target) return typeof document !== 'undefined' ? document : null\n if (target instanceof Document) return target\n if ('current' in target) return target.current ?? null\n return target\n}\n\n/**\n * Register a keyboard shortcut. Handler fires when the combo matches, respecting\n * `ignoreWhenTyping` (default true) — except when a modifier is part of the combo,\n * which always wins. Returns nothing; cleanup is automatic.\n *\n * @example\n * useHotkeys('mod+k', () => setOpen((v) => !v))\n * useHotkeys(['escape', 'mod+w'], close, { enabled: open })\n */\nexport function useHotkeys(\n combo: HotkeyCombo,\n handler: (event: KeyboardEvent) => void,\n options: UseHotkeysOptions = {}\n): void {\n const { preventDefault = true, ignoreWhenTyping = true, enabled = true, target } = options\n\n // Keep latest handler in a ref so callers don't need to memoize.\n const handlerRef = React.useRef(handler)\n React.useEffect(() => {\n handlerRef.current = handler\n }, [handler])\n\n React.useEffect(() => {\n if (!enabled) return\n const resolvedTarget = resolveTarget(target)\n if (!resolvedTarget) return\n\n const combos = (Array.isArray(combo) ? combo : [combo]).map(parseCombo)\n const mac = isMac()\n\n const listener = (event: Event) => {\n const keyboardEvent = event as KeyboardEvent\n const matched = combos.find((parsed) => matches(parsed, keyboardEvent, mac))\n if (!matched) return\n\n if (ignoreWhenTyping && isEditable(keyboardEvent.target) && !hasModifier(keyboardEvent)) {\n return\n }\n\n if (preventDefault) keyboardEvent.preventDefault()\n handlerRef.current(keyboardEvent)\n }\n\n resolvedTarget.addEventListener('keydown', listener)\n return () => {\n resolvedTarget.removeEventListener('keydown', listener)\n }\n // `combo` is usually a stable string literal; if callers pass a new array every\n // render we join-stringify to avoid stale closures without surprising rerenders.\n }, [Array.isArray(combo) ? combo.join('|') : combo, enabled, ignoreWhenTyping, preventDefault, target])\n}\n\n/**\n * Render-helper: returns a platform-appropriate display string for a combo.\n * 'mod+k' → '⌘K' on macOS, 'Ctrl+K' elsewhere. Useful for `<CommandShortcut>`.\n */\nexport function formatHotkey(combo: string): string {\n const mac = isMac()\n return combo\n .split('+')\n .map((p) => {\n const t = p.trim().toLowerCase()\n if (t === 'mod') return mac ? '⌘' : 'Ctrl'\n if (t === 'cmd' || t === 'meta') return mac ? '⌘' : 'Win'\n if (t === 'ctrl' || t === 'control') return mac ? '⌃' : 'Ctrl'\n if (t === 'shift') return mac ? '⇧' : 'Shift'\n if (t === 'alt' || t === 'option' || t === 'opt') return mac ? '⌥' : 'Alt'\n if (t === 'enter' || t === 'return') return '↵'\n if (t === 'escape' || t === 'esc') return 'Esc'\n if (t === 'space') return 'Space'\n if (t === 'up') return '↑'\n if (t === 'down') return '↓'\n if (t === 'left') return '←'\n if (t === 'right') return '→'\n return t.length === 1 ? t.toUpperCase() : t\n })\n .join(mac ? '' : '+')\n}\n"]}
@@ -0,0 +1,130 @@
1
+ 'use strict';
2
+
3
+ var chunkKYM7NIJO_cjs = require('./chunk-KYM7NIJO.cjs');
4
+ var React = require('react');
5
+ var recharts = require('recharts');
6
+ var jsxRuntime = require('react/jsx-runtime');
7
+
8
+ function _interopNamespace(e) {
9
+ if (e && e.__esModule) return e;
10
+ var n = Object.create(null);
11
+ if (e) {
12
+ Object.keys(e).forEach(function (k) {
13
+ if (k !== 'default') {
14
+ var d = Object.getOwnPropertyDescriptor(e, k);
15
+ Object.defineProperty(n, k, d.get ? d : {
16
+ enumerable: true,
17
+ get: function () { return e[k]; }
18
+ });
19
+ }
20
+ });
21
+ }
22
+ n.default = e;
23
+ return Object.freeze(n);
24
+ }
25
+
26
+ var React__namespace = /*#__PURE__*/_interopNamespace(React);
27
+
28
+ var PartoAreaChart = React__namespace.forwardRef(function PartoAreaChart2({
29
+ data,
30
+ dataKeys,
31
+ xAxisKey = "name",
32
+ curve = "monotone",
33
+ strokeWidth = 2,
34
+ fillOpacity = 0.08,
35
+ showDots = false,
36
+ enableGridY = true,
37
+ enableGridX = false,
38
+ margin = { top: 20, right: 20, bottom: 50, left: 50 },
39
+ axisBottom,
40
+ axisLeft,
41
+ tooltipFormatter,
42
+ locale = "fa",
43
+ className,
44
+ isLoading = false,
45
+ ariaLabel,
46
+ chartProps,
47
+ legend = false
48
+ }, ref) {
49
+ const { chartColors, axisTickStyle, gridStyle, tooltipStyle, crosshairStyle } = chunkKYM7NIJO_cjs.useChartTheme();
50
+ const defaultXTick = React__namespace.useMemo(() => chunkKYM7NIJO_cjs.localeAwareCategoryTick(locale), [locale]);
51
+ const defaultYTick = React__namespace.useMemo(() => chunkKYM7NIJO_cjs.localeAwareNumberTick(locale), [locale]);
52
+ if (isLoading) {
53
+ return /* @__PURE__ */ jsxRuntime.jsx(chunkKYM7NIJO_cjs.ChartLoadingSkeleton, { className });
54
+ }
55
+ const legendItems = legend ? dataKeys.map((key, i) => ({
56
+ key,
57
+ label: key,
58
+ color: chartColors[i % chartColors.length],
59
+ shape: "line"
60
+ })) : [];
61
+ return /* @__PURE__ */ jsxRuntime.jsx(chunkKYM7NIJO_cjs.ChartContainer, { ref, className, dataSlot: "area-chart", ariaLabel, children: /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "flex", flexDirection: "column", width: "100%", height: "100%" }, children: [
62
+ /* @__PURE__ */ jsxRuntime.jsx("div", { style: { flex: 1, minHeight: 0 }, children: /* @__PURE__ */ jsxRuntime.jsx(recharts.ResponsiveContainer, { width: "100%", height: "100%", children: /* @__PURE__ */ jsxRuntime.jsxs(recharts.AreaChart, { data, margin, ...chartProps, children: [
63
+ /* @__PURE__ */ jsxRuntime.jsx("defs", { children: dataKeys.map((key, i) => /* @__PURE__ */ jsxRuntime.jsxs("linearGradient", { id: `area-gradient-${key}`, x1: "0", y1: "0", x2: "0", y2: "1", children: [
64
+ /* @__PURE__ */ jsxRuntime.jsx("stop", { offset: "0%", stopColor: chartColors[i % chartColors.length], stopOpacity: fillOpacity }),
65
+ /* @__PURE__ */ jsxRuntime.jsx("stop", { offset: "100%", stopColor: chartColors[i % chartColors.length], stopOpacity: 0 })
66
+ ] }, key)) }),
67
+ (enableGridX || enableGridY) && /* @__PURE__ */ jsxRuntime.jsx(
68
+ recharts.CartesianGrid,
69
+ {
70
+ horizontal: enableGridY,
71
+ vertical: enableGridX,
72
+ stroke: gridStyle.stroke,
73
+ strokeDasharray: gridStyle.strokeDasharray,
74
+ strokeOpacity: gridStyle.strokeOpacity
75
+ }
76
+ ),
77
+ axisBottom !== null && /* @__PURE__ */ jsxRuntime.jsx(
78
+ recharts.XAxis,
79
+ {
80
+ dataKey: xAxisKey,
81
+ tick: axisTickStyle,
82
+ tickLine: false,
83
+ axisLine: false,
84
+ tickMargin: 12,
85
+ tickFormatter: defaultXTick,
86
+ ...axisBottom
87
+ }
88
+ ),
89
+ axisLeft !== null && /* @__PURE__ */ jsxRuntime.jsx(
90
+ recharts.YAxis,
91
+ {
92
+ tick: axisTickStyle,
93
+ tickLine: false,
94
+ axisLine: false,
95
+ tickMargin: 12,
96
+ tickFormatter: defaultYTick,
97
+ ...axisLeft
98
+ }
99
+ ),
100
+ /* @__PURE__ */ jsxRuntime.jsx(
101
+ recharts.Tooltip,
102
+ {
103
+ cursor: crosshairStyle,
104
+ content: /* @__PURE__ */ jsxRuntime.jsx(chunkKYM7NIJO_cjs.ChartTooltip, { tooltipStyle, formatter: tooltipFormatter, locale })
105
+ }
106
+ ),
107
+ dataKeys.map((key, i) => /* @__PURE__ */ jsxRuntime.jsx(
108
+ recharts.Area,
109
+ {
110
+ type: curve,
111
+ dataKey: key,
112
+ stroke: chartColors[i % chartColors.length],
113
+ strokeWidth,
114
+ fill: `url(#area-gradient-${key})`,
115
+ dot: showDots,
116
+ activeDot: { r: 4, strokeWidth: 2 },
117
+ animationDuration: 800,
118
+ animationEasing: "ease-out"
119
+ },
120
+ key
121
+ ))
122
+ ] }) }) }),
123
+ legend && /* @__PURE__ */ jsxRuntime.jsx(chunkKYM7NIJO_cjs.ChartLegend, { items: legendItems, style: { paddingTop: 12 } })
124
+ ] }) });
125
+ });
126
+ PartoAreaChart.displayName = "PartoAreaChart";
127
+
128
+ exports.PartoAreaChart = PartoAreaChart;
129
+ //# sourceMappingURL=chunk-UOZN45G4.cjs.map
130
+ //# sourceMappingURL=chunk-UOZN45G4.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/charts/PartoAreaChart.tsx"],"names":["React","PartoAreaChart","useChartTheme","localeAwareCategoryTick","localeAwareNumberTick","jsx","ChartLoadingSkeleton","ChartContainer","jsxs","ResponsiveContainer","AreaChart","CartesianGrid","XAxis","YAxis","Tooltip","ChartTooltip","Area","ChartLegend"],"mappings":"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","file":"chunk-UOZN45G4.cjs","sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport { AreaChart, Area, XAxis, YAxis, CartesianGrid, Tooltip, ResponsiveContainer } from 'recharts'\n\nimport { useChartTheme } from '@/hooks/use-chart-theme'\nimport { type SupportedLocale } from '@/lib/utils'\nimport {\n ChartContainer,\n ChartLegend,\n ChartLoadingSkeleton,\n ChartTooltip,\n localeAwareCategoryTick,\n localeAwareNumberTick,\n type ChartLegendItem,\n} from './chart-utils'\n\nexport interface PartoAreaChartProps {\n /** Row-oriented data: [{ name: \"فروردین\", series1: 50, series2: 30 }] */\n data: Array<Record<string, any>>\n /** Keys for each area series (e.g. ['فروش', 'سود']) */\n dataKeys: string[]\n /** Field name for X axis (default: 'name') */\n xAxisKey?: string\n /** Curve type */\n curve?: 'monotone' | 'linear' | 'natural' | 'step'\n /** Line width */\n strokeWidth?: number\n /** Area fill opacity */\n fillOpacity?: number\n /** Show dots on data points */\n showDots?: boolean\n /** Show horizontal grid lines */\n enableGridY?: boolean\n /** Show vertical grid lines */\n enableGridX?: boolean\n /** Chart margins */\n margin?: { top?: number; right?: number; bottom?: number; left?: number }\n /** Custom X axis config */\n axisBottom?: Record<string, any> | null\n /** Custom Y axis config */\n axisLeft?: Record<string, any> | null\n /** Custom tooltip formatter */\n tooltipFormatter?: (name: string, value: number) => React.ReactNode\n /**\n * Locale for digit formatting in tooltips and axis ticks. fa/ar render\n * Persian/Arabic digits with locale suffixes; en uses Latin K/M/B.\n * Default: 'fa'.\n */\n locale?: SupportedLocale\n className?: string\n isLoading?: boolean\n ariaLabel?: string\n /** Additional Recharts AreaChart props */\n chartProps?: Record<string, any>\n /** Render a colored-marker legend below the chart. @default `false` */\n legend?: boolean\n}\n\nexport const PartoAreaChart = React.forwardRef<HTMLDivElement, PartoAreaChartProps>(function PartoAreaChart(\n {\n data,\n dataKeys,\n xAxisKey = 'name',\n curve = 'monotone',\n strokeWidth = 2,\n fillOpacity = 0.08,\n showDots = false,\n enableGridY = true,\n enableGridX = false,\n margin = { top: 20, right: 20, bottom: 50, left: 50 },\n axisBottom,\n axisLeft,\n tooltipFormatter,\n locale = 'fa',\n className,\n isLoading = false,\n ariaLabel,\n chartProps,\n legend = false,\n },\n ref\n) {\n const { chartColors, axisTickStyle, gridStyle, tooltipStyle, crosshairStyle } = useChartTheme()\n const defaultXTick = React.useMemo(() => localeAwareCategoryTick(locale), [locale])\n const defaultYTick = React.useMemo(() => localeAwareNumberTick(locale), [locale])\n\n if (isLoading) {\n return <ChartLoadingSkeleton className={className} />\n }\n\n const legendItems: ChartLegendItem[] = legend\n ? dataKeys.map((key, i) => ({\n key,\n label: key,\n color: chartColors[i % chartColors.length],\n shape: 'line',\n }))\n : []\n\n return (\n <ChartContainer ref={ref} className={className} dataSlot=\"area-chart\" ariaLabel={ariaLabel}>\n <div style={{ display: 'flex', flexDirection: 'column', width: '100%', height: '100%' }}>\n <div style={{ flex: 1, minHeight: 0 }}>\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n <AreaChart data={data} margin={margin} {...chartProps}>\n <defs>\n {dataKeys.map((key, i) => (\n <linearGradient key={key} id={`area-gradient-${key}`} x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n <stop offset=\"0%\" stopColor={chartColors[i % chartColors.length]} stopOpacity={fillOpacity} />\n <stop offset=\"100%\" stopColor={chartColors[i % chartColors.length]} stopOpacity={0} />\n </linearGradient>\n ))}\n </defs>\n\n {(enableGridX || enableGridY) && (\n <CartesianGrid\n horizontal={enableGridY}\n vertical={enableGridX}\n stroke={gridStyle.stroke}\n strokeDasharray={gridStyle.strokeDasharray}\n strokeOpacity={gridStyle.strokeOpacity}\n />\n )}\n\n {axisBottom !== null && (\n <XAxis\n dataKey={xAxisKey}\n tick={axisTickStyle}\n tickLine={false}\n axisLine={false}\n tickMargin={12}\n tickFormatter={defaultXTick}\n {...axisBottom}\n />\n )}\n\n {axisLeft !== null && (\n <YAxis\n tick={axisTickStyle}\n tickLine={false}\n axisLine={false}\n tickMargin={12}\n tickFormatter={defaultYTick}\n {...axisLeft}\n />\n )}\n\n <Tooltip\n cursor={crosshairStyle}\n content={<ChartTooltip tooltipStyle={tooltipStyle} formatter={tooltipFormatter} locale={locale} />}\n />\n\n {dataKeys.map((key, i) => (\n <Area\n key={key}\n type={curve}\n dataKey={key}\n stroke={chartColors[i % chartColors.length]}\n strokeWidth={strokeWidth}\n fill={`url(#area-gradient-${key})`}\n dot={showDots}\n activeDot={{ r: 4, strokeWidth: 2 }}\n animationDuration={800}\n animationEasing=\"ease-out\"\n />\n ))}\n </AreaChart>\n </ResponsiveContainer>\n </div>\n {legend && <ChartLegend items={legendItems} style={{ paddingTop: 12 }} />}\n </div>\n </ChartContainer>\n )\n})\nPartoAreaChart.displayName = 'PartoAreaChart'\n"]}
@@ -0,0 +1,167 @@
1
+ 'use strict';
2
+
3
+ var chunkKYM7NIJO_cjs = require('./chunk-KYM7NIJO.cjs');
4
+ var React = require('react');
5
+ var recharts = require('recharts');
6
+ var jsxRuntime = require('react/jsx-runtime');
7
+
8
+ function _interopNamespace(e) {
9
+ if (e && e.__esModule) return e;
10
+ var n = Object.create(null);
11
+ if (e) {
12
+ Object.keys(e).forEach(function (k) {
13
+ if (k !== 'default') {
14
+ var d = Object.getOwnPropertyDescriptor(e, k);
15
+ Object.defineProperty(n, k, d.get ? d : {
16
+ enumerable: true,
17
+ get: function () { return e[k]; }
18
+ });
19
+ }
20
+ });
21
+ }
22
+ n.default = e;
23
+ return Object.freeze(n);
24
+ }
25
+
26
+ var React__namespace = /*#__PURE__*/_interopNamespace(React);
27
+
28
+ var PartoBarChart = React__namespace.forwardRef(function PartoBarChart2({
29
+ data,
30
+ keys,
31
+ indexBy,
32
+ groupMode = "grouped",
33
+ layout = "vertical",
34
+ margin = { top: 20, right: 20, bottom: 50, left: 50 },
35
+ barCategoryGap = "35%",
36
+ barGap = 2,
37
+ radius = [6, 6, 0, 0],
38
+ enableGridY = true,
39
+ enableGridX = false,
40
+ enableLabel = false,
41
+ axisBottom,
42
+ axisLeft,
43
+ tooltipFormatter,
44
+ locale = "fa",
45
+ className,
46
+ isLoading = false,
47
+ ariaLabel,
48
+ chartProps,
49
+ legend = false
50
+ }, ref) {
51
+ const { chartColors, axisTickStyle, gridStyle, tooltipStyle } = chunkKYM7NIJO_cjs.useChartTheme();
52
+ const categoryTick = React__namespace.useMemo(() => chunkKYM7NIJO_cjs.localeAwareCategoryTick(locale), [locale]);
53
+ const numberTick = React__namespace.useMemo(() => chunkKYM7NIJO_cjs.localeAwareNumberTick(locale), [locale]);
54
+ if (isLoading) {
55
+ return /* @__PURE__ */ jsxRuntime.jsx(chunkKYM7NIJO_cjs.ChartLoadingSkeleton, { className });
56
+ }
57
+ const rechartsLayout = layout === "horizontal" ? "vertical" : "horizontal";
58
+ const stackId = groupMode === "stacked" ? "stack" : void 0;
59
+ const legendItems = legend ? keys.map((key, i) => ({
60
+ key,
61
+ label: key,
62
+ color: chartColors[i % chartColors.length],
63
+ shape: "bar"
64
+ })) : [];
65
+ return /* @__PURE__ */ jsxRuntime.jsx(chunkKYM7NIJO_cjs.ChartContainer, { ref, className, dataSlot: "bar-chart", ariaLabel, children: /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "flex", flexDirection: "column", width: "100%", height: "100%" }, children: [
66
+ /* @__PURE__ */ jsxRuntime.jsx("div", { style: { flex: 1, minHeight: 0 }, children: /* @__PURE__ */ jsxRuntime.jsx(recharts.ResponsiveContainer, { width: "100%", height: "100%", children: /* @__PURE__ */ jsxRuntime.jsxs(
67
+ recharts.BarChart,
68
+ {
69
+ data,
70
+ layout: rechartsLayout,
71
+ margin,
72
+ barCategoryGap,
73
+ barGap,
74
+ ...chartProps,
75
+ children: [
76
+ (enableGridX || enableGridY) && /* @__PURE__ */ jsxRuntime.jsx(
77
+ recharts.CartesianGrid,
78
+ {
79
+ horizontal: enableGridY,
80
+ vertical: enableGridX,
81
+ stroke: gridStyle.stroke,
82
+ strokeDasharray: gridStyle.strokeDasharray,
83
+ strokeOpacity: gridStyle.strokeOpacity
84
+ }
85
+ ),
86
+ rechartsLayout === "horizontal" ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
87
+ axisBottom !== null && /* @__PURE__ */ jsxRuntime.jsx(
88
+ recharts.XAxis,
89
+ {
90
+ dataKey: indexBy,
91
+ tick: axisTickStyle,
92
+ tickLine: false,
93
+ axisLine: false,
94
+ tickMargin: 12,
95
+ tickFormatter: categoryTick,
96
+ ...axisBottom
97
+ }
98
+ ),
99
+ axisLeft !== null && /* @__PURE__ */ jsxRuntime.jsx(
100
+ recharts.YAxis,
101
+ {
102
+ tick: axisTickStyle,
103
+ tickLine: false,
104
+ axisLine: false,
105
+ tickMargin: 12,
106
+ tickFormatter: numberTick,
107
+ ...axisLeft
108
+ }
109
+ )
110
+ ] }) : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
111
+ axisLeft !== null && /* @__PURE__ */ jsxRuntime.jsx(
112
+ recharts.YAxis,
113
+ {
114
+ dataKey: indexBy,
115
+ type: "category",
116
+ tick: axisTickStyle,
117
+ tickLine: false,
118
+ axisLine: false,
119
+ tickMargin: 12,
120
+ tickFormatter: categoryTick,
121
+ ...axisLeft
122
+ }
123
+ ),
124
+ axisBottom !== null && /* @__PURE__ */ jsxRuntime.jsx(
125
+ recharts.XAxis,
126
+ {
127
+ type: "number",
128
+ tick: axisTickStyle,
129
+ tickLine: false,
130
+ axisLine: false,
131
+ tickMargin: 12,
132
+ tickFormatter: numberTick,
133
+ ...axisBottom
134
+ }
135
+ )
136
+ ] }),
137
+ /* @__PURE__ */ jsxRuntime.jsx(
138
+ recharts.Tooltip,
139
+ {
140
+ cursor: { fill: "hsl(0 0% 50% / 0.05)" },
141
+ content: /* @__PURE__ */ jsxRuntime.jsx(chunkKYM7NIJO_cjs.ChartTooltip, { tooltipStyle, formatter: tooltipFormatter, locale })
142
+ }
143
+ ),
144
+ keys.map((key, i) => /* @__PURE__ */ jsxRuntime.jsx(
145
+ recharts.Bar,
146
+ {
147
+ dataKey: key,
148
+ fill: chartColors[i % chartColors.length],
149
+ radius,
150
+ stackId,
151
+ label: enableLabel ? { position: "top", style: axisTickStyle } : false,
152
+ animationDuration: 800,
153
+ animationEasing: "ease-out"
154
+ },
155
+ key
156
+ ))
157
+ ]
158
+ }
159
+ ) }) }),
160
+ legend && /* @__PURE__ */ jsxRuntime.jsx(chunkKYM7NIJO_cjs.ChartLegend, { items: legendItems, style: { paddingTop: 12 } })
161
+ ] }) });
162
+ });
163
+ PartoBarChart.displayName = "PartoBarChart";
164
+
165
+ exports.PartoBarChart = PartoBarChart;
166
+ //# sourceMappingURL=chunk-VHLDOG74.cjs.map
167
+ //# sourceMappingURL=chunk-VHLDOG74.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/charts/PartoBarChart.tsx"],"names":["React","PartoBarChart","useChartTheme","localeAwareCategoryTick","localeAwareNumberTick","jsx","ChartLoadingSkeleton","ChartContainer","jsxs","ResponsiveContainer","BarChart","CartesianGrid","Fragment","XAxis","YAxis","Tooltip","ChartTooltip","Bar","ChartLegend"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAmEO,IAAM,aAAA,GAAsBA,gBAAA,CAAA,UAAA,CAA+C,SAASC,cAAAA,CACzF;AAAA,EACE,IAAA;AAAA,EACA,IAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA,GAAY,SAAA;AAAA,EACZ,MAAA,GAAS,UAAA;AAAA,EACT,MAAA,GAAS,EAAE,GAAA,EAAK,EAAA,EAAI,OAAO,EAAA,EAAI,MAAA,EAAQ,EAAA,EAAI,IAAA,EAAM,EAAA,EAAG;AAAA,EACpD,cAAA,GAAiB,KAAA;AAAA,EACjB,MAAA,GAAS,CAAA;AAAA,EACT,MAAA,GAAS,CAAC,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AAAA,EACpB,WAAA,GAAc,IAAA;AAAA,EACd,WAAA,GAAc,KAAA;AAAA,EACd,WAAA,GAAc,KAAA;AAAA,EACd,UAAA;AAAA,EACA,QAAA;AAAA,EACA,gBAAA;AAAA,EACA,MAAA,GAAS,IAAA;AAAA,EACT,SAAA;AAAA,EACA,SAAA,GAAY,KAAA;AAAA,EACZ,SAAA;AAAA,EACA,UAAA;AAAA,EACA,MAAA,GAAS;AACX,CAAA,EACA,GAAA,EACA;AACA,EAAA,MAAM,EAAE,WAAA,EAAa,aAAA,EAAe,SAAA,EAAW,YAAA,KAAiBC,+BAAA,EAAc;AAC9E,EAAA,MAAM,YAAA,GAAqBF,yBAAQ,MAAMG,yCAAA,CAAwB,MAAM,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAClF,EAAA,MAAM,UAAA,GAAmBH,yBAAQ,MAAMI,uCAAA,CAAsB,MAAM,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AAE9E,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,uBAAOC,cAAA,CAACC,0CAAqB,SAAA,EAAsB,CAAA;AAAA,EACrD;AAGA,EAAA,MAAM,cAAA,GAAiB,MAAA,KAAW,YAAA,GAAe,UAAA,GAAa,YAAA;AAC9D,EAAA,MAAM,OAAA,GAAU,SAAA,KAAc,SAAA,GAAY,OAAA,GAAU,MAAA;AAEpD,EAAA,MAAM,cAAiC,MAAA,GACnC,IAAA,CAAK,GAAA,CAAI,CAAC,KAAK,CAAA,MAAO;AAAA,IACpB,GAAA;AAAA,IACA,KAAA,EAAO,GAAA;AAAA,IACP,KAAA,EAAO,WAAA,CAAY,CAAA,GAAI,WAAA,CAAY,MAAM,CAAA;AAAA,IACzC,KAAA,EAAO;AAAA,GACT,CAAE,IACF,EAAC;AAEL,EAAA,sCACGC,gCAAA,EAAA,EAAe,GAAA,EAAU,WAAsB,QAAA,EAAS,WAAA,EAAY,WACnE,QAAA,kBAAAC,eAAA,CAAC,KAAA,EAAA,EAAI,OAAO,EAAE,OAAA,EAAS,QAAQ,aAAA,EAAe,QAAA,EAAU,OAAO,MAAA,EAAQ,MAAA,EAAQ,QAAO,EACpF,QAAA,EAAA;AAAA,oBAAAH,cAAA,CAAC,KAAA,EAAA,EAAI,KAAA,EAAO,EAAE,IAAA,EAAM,CAAA,EAAG,SAAA,EAAW,CAAA,EAAE,EAClC,QAAA,kBAAAA,cAAA,CAACI,4BAAA,EAAA,EAAoB,KAAA,EAAM,MAAA,EAAO,QAAO,MAAA,EACvC,QAAA,kBAAAD,eAAA;AAAA,MAACE,iBAAA;AAAA,MAAA;AAAA,QACC,IAAA;AAAA,QACA,MAAA,EAAQ,cAAA;AAAA,QACR,MAAA;AAAA,QACA,cAAA;AAAA,QACA,MAAA;AAAA,QACC,GAAG,UAAA;AAAA,QAEF,QAAA,EAAA;AAAA,UAAA,CAAA,WAAA,IAAe,WAAA,qBACfL,cAAA;AAAA,YAACM,sBAAA;AAAA,YAAA;AAAA,cACC,UAAA,EAAY,WAAA;AAAA,cACZ,QAAA,EAAU,WAAA;AAAA,cACV,QAAQ,SAAA,CAAU,MAAA;AAAA,cAClB,iBAAiB,SAAA,CAAU,eAAA;AAAA,cAC3B,eAAe,SAAA,CAAU;AAAA;AAAA,WAC3B;AAAA,UAGD,cAAA,KAAmB,+BAClBH,eAAA,CAAAI,mBAAA,EAAA,EACG,QAAA,EAAA;AAAA,YAAA,UAAA,KAAe,IAAA,oBACdP,cAAA;AAAA,cAACQ,cAAA;AAAA,cAAA;AAAA,gBACC,OAAA,EAAS,OAAA;AAAA,gBACT,IAAA,EAAM,aAAA;AAAA,gBACN,QAAA,EAAU,KAAA;AAAA,gBACV,QAAA,EAAU,KAAA;AAAA,gBACV,UAAA,EAAY,EAAA;AAAA,gBACZ,aAAA,EAAe,YAAA;AAAA,gBACd,GAAG;AAAA;AAAA,aACN;AAAA,YAED,aAAa,IAAA,oBACZR,cAAA;AAAA,cAACS,cAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAM,aAAA;AAAA,gBACN,QAAA,EAAU,KAAA;AAAA,gBACV,QAAA,EAAU,KAAA;AAAA,gBACV,UAAA,EAAY,EAAA;AAAA,gBACZ,aAAA,EAAe,UAAA;AAAA,gBACd,GAAG;AAAA;AAAA;AACN,WAAA,EAEJ,oBAEAN,eAAA,CAAAI,mBAAA,EAAA,EACG,QAAA,EAAA;AAAA,YAAA,QAAA,KAAa,IAAA,oBACZP,cAAA;AAAA,cAACS,cAAA;AAAA,cAAA;AAAA,gBACC,OAAA,EAAS,OAAA;AAAA,gBACT,IAAA,EAAK,UAAA;AAAA,gBACL,IAAA,EAAM,aAAA;AAAA,gBACN,QAAA,EAAU,KAAA;AAAA,gBACV,QAAA,EAAU,KAAA;AAAA,gBACV,UAAA,EAAY,EAAA;AAAA,gBACZ,aAAA,EAAe,YAAA;AAAA,gBACd,GAAG;AAAA;AAAA,aACN;AAAA,YAED,eAAe,IAAA,oBACdT,cAAA;AAAA,cAACQ,cAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAK,QAAA;AAAA,gBACL,IAAA,EAAM,aAAA;AAAA,gBACN,QAAA,EAAU,KAAA;AAAA,gBACV,QAAA,EAAU,KAAA;AAAA,gBACV,UAAA,EAAY,EAAA;AAAA,gBACZ,aAAA,EAAe,UAAA;AAAA,gBACd,GAAG;AAAA;AAAA;AACN,WAAA,EAEJ,CAAA;AAAA,0BAGFR,cAAA;AAAA,YAACU,gBAAA;AAAA,YAAA;AAAA,cACC,MAAA,EAAQ,EAAE,IAAA,EAAM,sBAAA,EAAuB;AAAA,cACvC,yBAASV,cAAA,CAACW,8BAAA,EAAA,EAAa,YAAA,EAA4B,SAAA,EAAW,kBAAkB,MAAA,EAAgB;AAAA;AAAA,WAClG;AAAA,UAEC,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,EAAK,CAAA,qBACdX,cAAA;AAAA,YAACY,YAAA;AAAA,YAAA;AAAA,cAEC,OAAA,EAAS,GAAA;AAAA,cACT,IAAA,EAAM,WAAA,CAAY,CAAA,GAAI,WAAA,CAAY,MAAM,CAAA;AAAA,cACxC,MAAA;AAAA,cACA,OAAA;AAAA,cACA,OAAO,WAAA,GAAc,EAAE,UAAU,KAAA,EAAO,KAAA,EAAO,eAAc,GAAI,KAAA;AAAA,cACjE,iBAAA,EAAmB,GAAA;AAAA,cACnB,eAAA,EAAgB;AAAA,aAAA;AAAA,YAPX;AAAA,WASR;AAAA;AAAA;AAAA,OAEL,CAAA,EACF,CAAA;AAAA,IACC,MAAA,mCAAWC,6BAAA,EAAA,EAAY,KAAA,EAAO,aAAa,KAAA,EAAO,EAAE,UAAA,EAAY,EAAA,EAAG,EAAG;AAAA,GAAA,EACzE,CAAA,EACF,CAAA;AAEJ,CAAC;AACD,aAAA,CAAc,WAAA,GAAc,eAAA","file":"chunk-VHLDOG74.cjs","sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport { BarChart, Bar, XAxis, YAxis, CartesianGrid, Tooltip, ResponsiveContainer } from 'recharts'\n\nimport { useChartTheme } from '@/hooks/use-chart-theme'\nimport { type SupportedLocale } from '@/lib/utils'\nimport {\n ChartContainer,\n ChartLegend,\n ChartLoadingSkeleton,\n ChartTooltip,\n localeAwareCategoryTick,\n localeAwareNumberTick,\n type ChartLegendItem,\n} from './chart-utils'\n\nexport interface PartoBarChartProps {\n /** Chart data — row-oriented array of objects */\n data: Array<Record<string, any>>\n /** Data keys to render as bars (e.g. ['فروش', 'هزینه']) */\n keys: string[]\n /** Field name used for X axis categories (e.g. 'ماه') */\n indexBy: string\n /** Stacked or grouped layout */\n groupMode?: 'grouped' | 'stacked'\n /** Bar layout direction */\n layout?: 'vertical' | 'horizontal'\n /** Chart margins */\n margin?: { top?: number; right?: number; bottom?: number; left?: number }\n /** Gap between category groups as percentage */\n barCategoryGap?: string | number\n /** Gap between bars within a group */\n barGap?: number\n /** Border radius for bar tops [topLeft, topRight, bottomRight, bottomLeft] */\n radius?: [number, number, number, number]\n /** Show horizontal grid lines */\n enableGridY?: boolean\n /** Show vertical grid lines */\n enableGridX?: boolean\n /** Show labels inside bars */\n enableLabel?: boolean\n /** Custom X axis config */\n axisBottom?: Record<string, any> | null\n /** Custom Y axis config */\n axisLeft?: Record<string, any> | null\n /** Custom tooltip formatter */\n tooltipFormatter?: (name: string, value: number) => React.ReactNode\n /**\n * Locale for digit formatting in tooltips and axis ticks. fa/ar render\n * Persian/Arabic digits with locale suffixes; en uses Latin K/M/B.\n * Default: 'fa'.\n */\n locale?: SupportedLocale\n className?: string\n isLoading?: boolean\n ariaLabel?: string\n /** Additional Recharts BarChart props */\n chartProps?: Record<string, any>\n /**\n * Render a legend below the chart that names each series with a colored\n * marker. Strongly recommended for grouped or stacked layouts where\n * series identity is otherwise color-only. @default `false`\n */\n legend?: boolean\n}\n\nexport const PartoBarChart = React.forwardRef<HTMLDivElement, PartoBarChartProps>(function PartoBarChart(\n {\n data,\n keys,\n indexBy,\n groupMode = 'grouped',\n layout = 'vertical',\n margin = { top: 20, right: 20, bottom: 50, left: 50 },\n barCategoryGap = '35%',\n barGap = 2,\n radius = [6, 6, 0, 0],\n enableGridY = true,\n enableGridX = false,\n enableLabel = false,\n axisBottom,\n axisLeft,\n tooltipFormatter,\n locale = 'fa',\n className,\n isLoading = false,\n ariaLabel,\n chartProps,\n legend = false,\n },\n ref\n) {\n const { chartColors, axisTickStyle, gridStyle, tooltipStyle } = useChartTheme()\n const categoryTick = React.useMemo(() => localeAwareCategoryTick(locale), [locale])\n const numberTick = React.useMemo(() => localeAwareNumberTick(locale), [locale])\n\n if (isLoading) {\n return <ChartLoadingSkeleton className={className} />\n }\n\n // Recharts uses \"horizontal\" for standard vertical bars and \"vertical\" for horizontal bars\n const rechartsLayout = layout === 'horizontal' ? 'vertical' : 'horizontal'\n const stackId = groupMode === 'stacked' ? 'stack' : undefined\n\n const legendItems: ChartLegendItem[] = legend\n ? keys.map((key, i) => ({\n key,\n label: key,\n color: chartColors[i % chartColors.length],\n shape: 'bar',\n }))\n : []\n\n return (\n <ChartContainer ref={ref} className={className} dataSlot=\"bar-chart\" ariaLabel={ariaLabel}>\n <div style={{ display: 'flex', flexDirection: 'column', width: '100%', height: '100%' }}>\n <div style={{ flex: 1, minHeight: 0 }}>\n <ResponsiveContainer width=\"100%\" height=\"100%\">\n <BarChart\n data={data}\n layout={rechartsLayout}\n margin={margin}\n barCategoryGap={barCategoryGap}\n barGap={barGap}\n {...chartProps}\n >\n {(enableGridX || enableGridY) && (\n <CartesianGrid\n horizontal={enableGridY}\n vertical={enableGridX}\n stroke={gridStyle.stroke}\n strokeDasharray={gridStyle.strokeDasharray}\n strokeOpacity={gridStyle.strokeOpacity}\n />\n )}\n\n {rechartsLayout === 'horizontal' ? (\n <>\n {axisBottom !== null && (\n <XAxis\n dataKey={indexBy}\n tick={axisTickStyle}\n tickLine={false}\n axisLine={false}\n tickMargin={12}\n tickFormatter={categoryTick}\n {...axisBottom}\n />\n )}\n {axisLeft !== null && (\n <YAxis\n tick={axisTickStyle}\n tickLine={false}\n axisLine={false}\n tickMargin={12}\n tickFormatter={numberTick}\n {...axisLeft}\n />\n )}\n </>\n ) : (\n <>\n {axisLeft !== null && (\n <YAxis\n dataKey={indexBy}\n type=\"category\"\n tick={axisTickStyle}\n tickLine={false}\n axisLine={false}\n tickMargin={12}\n tickFormatter={categoryTick}\n {...axisLeft}\n />\n )}\n {axisBottom !== null && (\n <XAxis\n type=\"number\"\n tick={axisTickStyle}\n tickLine={false}\n axisLine={false}\n tickMargin={12}\n tickFormatter={numberTick}\n {...axisBottom}\n />\n )}\n </>\n )}\n\n <Tooltip\n cursor={{ fill: 'hsl(0 0% 50% / 0.05)' }}\n content={<ChartTooltip tooltipStyle={tooltipStyle} formatter={tooltipFormatter} locale={locale} />}\n />\n\n {keys.map((key, i) => (\n <Bar\n key={key}\n dataKey={key}\n fill={chartColors[i % chartColors.length]}\n radius={radius}\n stackId={stackId}\n label={enableLabel ? { position: 'top', style: axisTickStyle } : false}\n animationDuration={800}\n animationEasing=\"ease-out\"\n />\n ))}\n </BarChart>\n </ResponsiveContainer>\n </div>\n {legend && <ChartLegend items={legendItems} style={{ paddingTop: 12 }} />}\n </div>\n </ChartContainer>\n )\n})\nPartoBarChart.displayName = 'PartoBarChart'\n"]}