@parto-system-design/ui 1.1.11 → 1.1.16

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 (411) hide show
  1. package/dist/components/brand/parto-logo.cjs +130 -0
  2. package/dist/components/brand/parto-logo.cjs.map +1 -0
  3. package/dist/components/brand/parto-logo.d.cts +38 -0
  4. package/dist/components/brand/parto-logo.d.ts +38 -0
  5. package/dist/components/brand/parto-logo.js +108 -0
  6. package/dist/components/brand/parto-logo.js.map +1 -0
  7. package/dist/components/charts/PartoAreaChart.cjs +579 -7
  8. package/dist/components/charts/PartoAreaChart.cjs.map +1 -1
  9. package/dist/components/charts/PartoAreaChart.js +564 -4
  10. package/dist/components/charts/PartoAreaChart.js.map +1 -1
  11. package/dist/components/charts/PartoBarChart.cjs +616 -7
  12. package/dist/components/charts/PartoBarChart.cjs.map +1 -1
  13. package/dist/components/charts/PartoBarChart.js +601 -4
  14. package/dist/components/charts/PartoBarChart.js.map +1 -1
  15. package/dist/components/charts/PartoLineChart.cjs +584 -7
  16. package/dist/components/charts/PartoLineChart.cjs.map +1 -1
  17. package/dist/components/charts/PartoLineChart.js +569 -4
  18. package/dist/components/charts/PartoLineChart.js.map +1 -1
  19. package/dist/components/charts/PartoPieChart.cjs +566 -7
  20. package/dist/components/charts/PartoPieChart.cjs.map +1 -1
  21. package/dist/components/charts/PartoPieChart.js +551 -4
  22. package/dist/components/charts/PartoPieChart.js.map +1 -1
  23. package/dist/components/ui/accordion.cjs +97 -0
  24. package/dist/components/ui/accordion.cjs.map +1 -0
  25. package/dist/components/ui/accordion.d.cts +22 -0
  26. package/dist/components/ui/accordion.d.ts +22 -0
  27. package/dist/components/ui/accordion.js +72 -0
  28. package/dist/components/ui/accordion.js.map +1 -0
  29. package/dist/{chunk-MMC6M35Q.cjs → components/ui/alert-dialog.cjs} +216 -22
  30. package/dist/components/ui/alert-dialog.cjs.map +1 -0
  31. package/dist/components/ui/alert-dialog.d.cts +17 -0
  32. package/dist/components/ui/alert-dialog.d.ts +17 -0
  33. package/dist/{chunk-3QYYPPFJ.js → components/ui/alert-dialog.js} +175 -10
  34. package/dist/components/ui/alert-dialog.js.map +1 -0
  35. package/dist/components/ui/alert-rule-card.cjs +289 -8
  36. package/dist/components/ui/alert-rule-card.cjs.map +1 -1
  37. package/dist/components/ui/alert-rule-card.d.cts +1 -1
  38. package/dist/components/ui/alert-rule-card.d.ts +1 -1
  39. package/dist/components/ui/alert-rule-card.js +271 -4
  40. package/dist/components/ui/alert-rule-card.js.map +1 -1
  41. package/dist/components/ui/alert.cjs +81 -0
  42. package/dist/components/ui/alert.cjs.map +1 -0
  43. package/dist/components/ui/alert.d.cts +11 -0
  44. package/dist/components/ui/alert.d.ts +11 -0
  45. package/dist/components/ui/alert.js +57 -0
  46. package/dist/components/ui/alert.js.map +1 -0
  47. package/dist/components/ui/app-bar.cjs +67 -0
  48. package/dist/components/ui/app-bar.cjs.map +1 -0
  49. package/dist/components/ui/app-bar.d.cts +22 -0
  50. package/dist/components/ui/app-bar.d.ts +22 -0
  51. package/dist/components/ui/app-bar.js +44 -0
  52. package/dist/components/ui/app-bar.js.map +1 -0
  53. package/dist/components/ui/avatar.cjs +66 -14
  54. package/dist/components/ui/avatar.cjs.map +1 -1
  55. package/dist/components/ui/avatar.js +47 -2
  56. package/dist/components/ui/avatar.js.map +1 -1
  57. package/dist/components/ui/badge.cjs +113 -9
  58. package/dist/components/ui/badge.cjs.map +1 -1
  59. package/dist/components/ui/badge.d.cts +1 -1
  60. package/dist/components/ui/badge.d.ts +1 -1
  61. package/dist/components/ui/badge.js +96 -2
  62. package/dist/components/ui/badge.js.map +1 -1
  63. package/dist/components/ui/breadcrumb.cjs +100 -0
  64. package/dist/components/ui/breadcrumb.cjs.map +1 -0
  65. package/dist/components/ui/breadcrumb.d.cts +35 -0
  66. package/dist/components/ui/breadcrumb.d.ts +35 -0
  67. package/dist/components/ui/breadcrumb.js +92 -0
  68. package/dist/components/ui/breadcrumb.js.map +1 -0
  69. package/dist/components/ui/button.cjs +304 -11
  70. package/dist/components/ui/button.cjs.map +1 -1
  71. package/dist/components/ui/button.d.cts +3 -3
  72. package/dist/components/ui/button.d.ts +3 -3
  73. package/dist/components/ui/button.js +306 -3
  74. package/dist/components/ui/button.js.map +1 -1
  75. package/dist/components/ui/calendar.cjs +401 -8
  76. package/dist/components/ui/calendar.cjs.map +1 -1
  77. package/dist/components/ui/calendar.js +404 -4
  78. package/dist/components/ui/calendar.js.map +1 -1
  79. package/dist/components/ui/card.cjs +154 -30
  80. package/dist/components/ui/card.cjs.map +1 -1
  81. package/dist/components/ui/card.js +131 -2
  82. package/dist/components/ui/card.js.map +1 -1
  83. package/dist/{chunk-CAJKSTXX.cjs → components/ui/checkbox.cjs} +10 -5
  84. package/dist/components/ui/checkbox.cjs.map +1 -0
  85. package/dist/components/ui/checkbox.d.cts +6 -0
  86. package/dist/components/ui/checkbox.d.ts +6 -0
  87. package/dist/{chunk-5JJSRGJD.js → components/ui/checkbox.js} +9 -4
  88. package/dist/components/ui/checkbox.js.map +1 -0
  89. package/dist/components/ui/concept-card.cjs +728 -11
  90. package/dist/components/ui/concept-card.cjs.map +1 -1
  91. package/dist/components/ui/concept-card.d.cts +2 -2
  92. package/dist/components/ui/concept-card.d.ts +2 -2
  93. package/dist/components/ui/concept-card.js +710 -7
  94. package/dist/components/ui/concept-card.js.map +1 -1
  95. package/dist/components/ui/data-table.cjs +1553 -10
  96. package/dist/components/ui/data-table.cjs.map +1 -1
  97. package/dist/components/ui/data-table.js +1537 -7
  98. package/dist/components/ui/data-table.js.map +1 -1
  99. package/dist/components/ui/dialog.cjs +119 -42
  100. package/dist/components/ui/dialog.cjs.map +1 -1
  101. package/dist/components/ui/dialog.js +92 -2
  102. package/dist/components/ui/dialog.js.map +1 -1
  103. package/dist/components/ui/dropdown-menu.cjs +268 -0
  104. package/dist/components/ui/dropdown-menu.cjs.map +1 -0
  105. package/dist/components/ui/dropdown-menu.d.cts +73 -0
  106. package/dist/components/ui/dropdown-menu.d.ts +73 -0
  107. package/dist/components/ui/dropdown-menu.js +232 -0
  108. package/dist/components/ui/dropdown-menu.js.map +1 -0
  109. package/dist/components/ui/filter-provider.cjs +70 -13
  110. package/dist/components/ui/filter-provider.cjs.map +1 -1
  111. package/dist/components/ui/filter-provider.js +51 -1
  112. package/dist/components/ui/filter-provider.js.map +1 -1
  113. package/dist/components/ui/form.cjs +169 -0
  114. package/dist/components/ui/form.cjs.map +1 -0
  115. package/dist/components/ui/form.d.cts +46 -0
  116. package/dist/components/ui/form.d.ts +46 -0
  117. package/dist/components/ui/form.js +139 -0
  118. package/dist/components/ui/form.js.map +1 -0
  119. package/dist/components/ui/input.cjs +135 -15
  120. package/dist/components/ui/input.cjs.map +1 -1
  121. package/dist/components/ui/input.d.cts +15 -0
  122. package/dist/components/ui/input.d.ts +15 -0
  123. package/dist/components/ui/input.js +116 -3
  124. package/dist/components/ui/input.js.map +1 -1
  125. package/dist/components/ui/iran-province-heat.cjs +328 -5
  126. package/dist/components/ui/iran-province-heat.cjs.map +1 -1
  127. package/dist/components/ui/iran-province-heat.js +312 -2
  128. package/dist/components/ui/iran-province-heat.js.map +1 -1
  129. package/dist/components/ui/label.cjs +52 -0
  130. package/dist/components/ui/label.cjs.map +1 -0
  131. package/dist/components/ui/label.d.cts +10 -0
  132. package/dist/components/ui/label.d.ts +10 -0
  133. package/dist/components/ui/label.js +30 -0
  134. package/dist/components/ui/label.js.map +1 -0
  135. package/dist/components/ui/page-card.cjs +627 -8
  136. package/dist/components/ui/page-card.cjs.map +1 -1
  137. package/dist/components/ui/page-card.d.cts +3 -2
  138. package/dist/components/ui/page-card.d.ts +3 -2
  139. package/dist/components/ui/page-card.js +611 -5
  140. package/dist/components/ui/page-card.js.map +1 -1
  141. package/dist/components/ui/page-header.cjs +299 -0
  142. package/dist/components/ui/page-header.cjs.map +1 -0
  143. package/dist/components/ui/page-header.d.cts +21 -0
  144. package/dist/components/ui/page-header.d.ts +21 -0
  145. package/dist/components/ui/page-header.js +277 -0
  146. package/dist/components/ui/page-header.js.map +1 -0
  147. package/dist/components/ui/password-input.cjs +168 -0
  148. package/dist/components/ui/password-input.cjs.map +1 -0
  149. package/dist/components/ui/password-input.d.cts +48 -0
  150. package/dist/components/ui/password-input.d.ts +48 -0
  151. package/dist/components/ui/password-input.js +146 -0
  152. package/dist/components/ui/password-input.js.map +1 -0
  153. package/dist/components/ui/popover.cjs +51 -18
  154. package/dist/components/ui/popover.cjs.map +1 -1
  155. package/dist/components/ui/popover.js +30 -2
  156. package/dist/components/ui/popover.js.map +1 -1
  157. package/dist/components/ui/progress.cjs +95 -0
  158. package/dist/components/ui/progress.cjs.map +1 -0
  159. package/dist/components/ui/progress.d.cts +18 -0
  160. package/dist/components/ui/progress.d.ts +18 -0
  161. package/dist/components/ui/progress.js +72 -0
  162. package/dist/components/ui/progress.js.map +1 -0
  163. package/dist/components/ui/radio-card.cjs +84 -0
  164. package/dist/components/ui/radio-card.cjs.map +1 -0
  165. package/dist/components/ui/radio-card.d.cts +12 -0
  166. package/dist/components/ui/radio-card.d.ts +12 -0
  167. package/dist/components/ui/radio-card.js +58 -0
  168. package/dist/components/ui/radio-card.js.map +1 -0
  169. package/dist/components/ui/radio-group.cjs +62 -0
  170. package/dist/components/ui/radio-group.cjs.map +1 -0
  171. package/dist/components/ui/radio-group.d.cts +7 -0
  172. package/dist/components/ui/radio-group.d.ts +7 -0
  173. package/dist/components/ui/radio-group.js +38 -0
  174. package/dist/components/ui/radio-group.js.map +1 -0
  175. package/dist/components/ui/saved-query-card.cjs +409 -7
  176. package/dist/components/ui/saved-query-card.cjs.map +1 -1
  177. package/dist/components/ui/saved-query-card.js +394 -4
  178. package/dist/components/ui/saved-query-card.js.map +1 -1
  179. package/dist/components/ui/scroll-area.cjs +79 -0
  180. package/dist/components/ui/scroll-area.cjs.map +1 -0
  181. package/dist/components/ui/scroll-area.d.cts +14 -0
  182. package/dist/components/ui/scroll-area.d.ts +14 -0
  183. package/dist/components/ui/scroll-area.js +56 -0
  184. package/dist/components/ui/scroll-area.js.map +1 -0
  185. package/dist/components/ui/select.cjs +242 -0
  186. package/dist/components/ui/select.cjs.map +1 -0
  187. package/dist/components/ui/select.d.cts +29 -0
  188. package/dist/components/ui/select.d.ts +29 -0
  189. package/dist/components/ui/select.js +210 -0
  190. package/dist/components/ui/select.js.map +1 -0
  191. package/dist/components/ui/separator.cjs +105 -6
  192. package/dist/components/ui/separator.cjs.map +1 -1
  193. package/dist/components/ui/separator.js +87 -2
  194. package/dist/components/ui/separator.js.map +1 -1
  195. package/dist/components/ui/sheet.cjs +134 -38
  196. package/dist/components/ui/sheet.cjs.map +1 -1
  197. package/dist/components/ui/sheet.js +109 -2
  198. package/dist/components/ui/sheet.js.map +1 -1
  199. package/dist/{chunk-D2EBLE2B.cjs → components/ui/skeleton.cjs} +21 -16
  200. package/dist/components/ui/skeleton.cjs.map +1 -0
  201. package/dist/components/ui/skeleton.d.cts +90 -0
  202. package/dist/components/ui/skeleton.d.ts +90 -0
  203. package/dist/{chunk-SB5DSYR5.js → components/ui/skeleton.js} +8 -3
  204. package/dist/components/ui/skeleton.js.map +1 -0
  205. package/dist/components/ui/slider.cjs +129 -0
  206. package/dist/components/ui/slider.cjs.map +1 -0
  207. package/dist/components/ui/slider.d.cts +10 -0
  208. package/dist/components/ui/slider.d.ts +10 -0
  209. package/dist/components/ui/slider.js +107 -0
  210. package/dist/components/ui/slider.js.map +1 -0
  211. package/dist/components/ui/social-platform-badge.cjs +120 -0
  212. package/dist/components/ui/social-platform-badge.cjs.map +1 -0
  213. package/dist/components/ui/social-platform-badge.d.cts +21 -0
  214. package/dist/components/ui/social-platform-badge.d.ts +21 -0
  215. package/dist/components/ui/social-platform-badge.js +97 -0
  216. package/dist/components/ui/social-platform-badge.js.map +1 -0
  217. package/dist/components/ui/sonner.cjs +51 -0
  218. package/dist/components/ui/sonner.cjs.map +1 -0
  219. package/dist/components/ui/sonner.d.cts +13 -0
  220. package/dist/components/ui/sonner.d.ts +13 -0
  221. package/dist/components/ui/sonner.js +45 -0
  222. package/dist/components/ui/sonner.js.map +1 -0
  223. package/dist/components/ui/sparkline.cjs +159 -6
  224. package/dist/components/ui/sparkline.cjs.map +1 -1
  225. package/dist/components/ui/sparkline.js +142 -2
  226. package/dist/components/ui/sparkline.js.map +1 -1
  227. package/dist/components/ui/switch.cjs +96 -0
  228. package/dist/components/ui/switch.cjs.map +1 -0
  229. package/dist/components/ui/switch.d.cts +13 -0
  230. package/dist/components/ui/switch.d.ts +13 -0
  231. package/dist/components/ui/switch.js +73 -0
  232. package/dist/components/ui/switch.js.map +1 -0
  233. package/dist/components/ui/table.cjs +188 -0
  234. package/dist/components/ui/table.cjs.map +1 -0
  235. package/dist/components/ui/table.d.cts +59 -0
  236. package/dist/components/ui/table.d.ts +59 -0
  237. package/dist/components/ui/table.js +178 -0
  238. package/dist/components/ui/table.js.map +1 -0
  239. package/dist/components/ui/tabs.cjs +140 -0
  240. package/dist/components/ui/tabs.cjs.map +1 -0
  241. package/dist/components/ui/tabs.d.cts +21 -0
  242. package/dist/components/ui/tabs.d.ts +21 -0
  243. package/dist/components/ui/tabs.js +115 -0
  244. package/dist/components/ui/tabs.js.map +1 -0
  245. package/dist/components/ui/textarea.cjs +56 -0
  246. package/dist/components/ui/textarea.cjs.map +1 -0
  247. package/dist/components/ui/textarea.d.cts +5 -0
  248. package/dist/components/ui/textarea.d.ts +5 -0
  249. package/dist/components/ui/textarea.js +34 -0
  250. package/dist/components/ui/textarea.js.map +1 -0
  251. package/dist/components/ui/toggle-group.cjs +123 -0
  252. package/dist/components/ui/toggle-group.cjs.map +1 -0
  253. package/dist/components/ui/toggle-group.d.cts +7 -0
  254. package/dist/components/ui/toggle-group.d.ts +7 -0
  255. package/dist/components/ui/toggle-group.js +99 -0
  256. package/dist/components/ui/toggle-group.js.map +1 -0
  257. package/dist/components/ui/tooltip.cjs +77 -18
  258. package/dist/components/ui/tooltip.cjs.map +1 -1
  259. package/dist/components/ui/tooltip.js +56 -2
  260. package/dist/components/ui/tooltip.js.map +1 -1
  261. package/dist/{concept-card-RwPbqJ06.d.cts → concept-card-BXra9mr0.d.cts} +2 -2
  262. package/dist/{concept-card-CcOBb2Nz.d.ts → concept-card-BoJ5gIJD.d.ts} +2 -2
  263. package/dist/hooks/use-hotkey-registry.cjs +201 -14
  264. package/dist/hooks/use-hotkey-registry.cjs.map +1 -1
  265. package/dist/hooks/use-hotkey-registry.js +182 -2
  266. package/dist/hooks/use-hotkey-registry.js.map +1 -1
  267. package/dist/hooks/use-hotkeys.cjs +144 -9
  268. package/dist/hooks/use-hotkeys.cjs.map +1 -1
  269. package/dist/hooks/use-hotkeys.js +126 -1
  270. package/dist/hooks/use-hotkeys.js.map +1 -1
  271. package/dist/{i18n-CAd9wGOr.d.cts → i18n-BfRhV5aw.d.cts} +5 -3
  272. package/dist/{i18n-ArS3mqj0.d.ts → i18n-ewyqbKM-.d.ts} +5 -3
  273. package/dist/index.cjs +20906 -15706
  274. package/dist/index.cjs.map +1 -1
  275. package/dist/index.css +396 -69
  276. package/dist/index.d.cts +49 -490
  277. package/dist/index.d.ts +49 -490
  278. package/dist/index.js +7704 -2032
  279. package/dist/index.js.map +1 -1
  280. package/dist/{page-card-CmShVqG-.d.cts → page-card-C9XXXOVr.d.cts} +3 -20
  281. package/dist/{page-card-HBn-cy4J.d.ts → page-card-DAnbez_f.d.ts} +3 -20
  282. package/dist/toggle-group-B8r4LOQw.d.cts +26 -0
  283. package/dist/toggle-group-B8r4LOQw.d.ts +26 -0
  284. package/package.json +132 -2
  285. package/tailwind.config.ts +45 -0
  286. package/dist/chunk-2ACKKPWA.cjs +0 -112
  287. package/dist/chunk-2ACKKPWA.cjs.map +0 -1
  288. package/dist/chunk-2UD3LGVX.cjs +0 -316
  289. package/dist/chunk-2UD3LGVX.cjs.map +0 -1
  290. package/dist/chunk-3QYYPPFJ.js.map +0 -1
  291. package/dist/chunk-4SVQNEVH.js +0 -173
  292. package/dist/chunk-4SVQNEVH.js.map +0 -1
  293. package/dist/chunk-4WONHORR.cjs +0 -152
  294. package/dist/chunk-4WONHORR.cjs.map +0 -1
  295. package/dist/chunk-5HCXH6GS.js +0 -409
  296. package/dist/chunk-5HCXH6GS.js.map +0 -1
  297. package/dist/chunk-5JJSRGJD.js.map +0 -1
  298. package/dist/chunk-5K6E4ZSW.cjs +0 -77
  299. package/dist/chunk-5K6E4ZSW.cjs.map +0 -1
  300. package/dist/chunk-5NY26ULO.js +0 -89
  301. package/dist/chunk-5NY26ULO.js.map +0 -1
  302. package/dist/chunk-7RVPG3LE.cjs +0 -231
  303. package/dist/chunk-7RVPG3LE.cjs.map +0 -1
  304. package/dist/chunk-AYEK3WOM.js +0 -207
  305. package/dist/chunk-AYEK3WOM.js.map +0 -1
  306. package/dist/chunk-BRMBLIQG.js +0 -53
  307. package/dist/chunk-BRMBLIQG.js.map +0 -1
  308. package/dist/chunk-CAJKSTXX.cjs.map +0 -1
  309. package/dist/chunk-CKFWMHQU.js +0 -401
  310. package/dist/chunk-CKFWMHQU.js.map +0 -1
  311. package/dist/chunk-CV3N3HVK.js +0 -672
  312. package/dist/chunk-CV3N3HVK.js.map +0 -1
  313. package/dist/chunk-D2EBLE2B.cjs.map +0 -1
  314. package/dist/chunk-GCZ6YATL.js +0 -940
  315. package/dist/chunk-GCZ6YATL.js.map +0 -1
  316. package/dist/chunk-GKRAZGDI.cjs +0 -84
  317. package/dist/chunk-GKRAZGDI.cjs.map +0 -1
  318. package/dist/chunk-GPYJ66CG.js +0 -45
  319. package/dist/chunk-GPYJ66CG.js.map +0 -1
  320. package/dist/chunk-HF6XU5NI.js +0 -84
  321. package/dist/chunk-HF6XU5NI.js.map +0 -1
  322. package/dist/chunk-HJPDZOMJ.cjs +0 -87
  323. package/dist/chunk-HJPDZOMJ.cjs.map +0 -1
  324. package/dist/chunk-HS3XI3CC.cjs +0 -69
  325. package/dist/chunk-HS3XI3CC.cjs.map +0 -1
  326. package/dist/chunk-HUCC3QH5.cjs +0 -53
  327. package/dist/chunk-HUCC3QH5.cjs.map +0 -1
  328. package/dist/chunk-HYZ6BQPS.cjs +0 -425
  329. package/dist/chunk-HYZ6BQPS.cjs.map +0 -1
  330. package/dist/chunk-ISCSZMYW.cjs +0 -106
  331. package/dist/chunk-ISCSZMYW.cjs.map +0 -1
  332. package/dist/chunk-IXFEFIDO.js +0 -82
  333. package/dist/chunk-IXFEFIDO.js.map +0 -1
  334. package/dist/chunk-JCJLN437.js +0 -108
  335. package/dist/chunk-JCJLN437.js.map +0 -1
  336. package/dist/chunk-JMKNNH63.cjs +0 -982
  337. package/dist/chunk-JMKNNH63.cjs.map +0 -1
  338. package/dist/chunk-JUBHQAA2.js +0 -53
  339. package/dist/chunk-JUBHQAA2.js.map +0 -1
  340. package/dist/chunk-K6G63EED.cjs +0 -41
  341. package/dist/chunk-K6G63EED.cjs.map +0 -1
  342. package/dist/chunk-KCWRCSI7.js +0 -62
  343. package/dist/chunk-KCWRCSI7.js.map +0 -1
  344. package/dist/chunk-KYM7NIJO.cjs +0 -433
  345. package/dist/chunk-KYM7NIJO.cjs.map +0 -1
  346. package/dist/chunk-L2L5CKC2.js +0 -291
  347. package/dist/chunk-L2L5CKC2.js.map +0 -1
  348. package/dist/chunk-M5CHZ5BA.js +0 -124
  349. package/dist/chunk-M5CHZ5BA.js.map +0 -1
  350. package/dist/chunk-MEK4RSGC.js +0 -65
  351. package/dist/chunk-MEK4RSGC.js.map +0 -1
  352. package/dist/chunk-MEKWH3GS.js +0 -89
  353. package/dist/chunk-MEKWH3GS.js.map +0 -1
  354. package/dist/chunk-MFTX2DDQ.js +0 -27
  355. package/dist/chunk-MFTX2DDQ.js.map +0 -1
  356. package/dist/chunk-MMC6M35Q.cjs.map +0 -1
  357. package/dist/chunk-NMH43BDC.js +0 -130
  358. package/dist/chunk-NMH43BDC.js.map +0 -1
  359. package/dist/chunk-NORDUD2T.cjs +0 -135
  360. package/dist/chunk-NORDUD2T.cjs.map +0 -1
  361. package/dist/chunk-NV4JOKWL.cjs +0 -197
  362. package/dist/chunk-NV4JOKWL.cjs.map +0 -1
  363. package/dist/chunk-O2JG7WY5.cjs +0 -121
  364. package/dist/chunk-O2JG7WY5.cjs.map +0 -1
  365. package/dist/chunk-ONO2FTV4.cjs +0 -68
  366. package/dist/chunk-ONO2FTV4.cjs.map +0 -1
  367. package/dist/chunk-OQB6HIUL.cjs +0 -108
  368. package/dist/chunk-OQB6HIUL.cjs.map +0 -1
  369. package/dist/chunk-OS6CMYAS.cjs +0 -79
  370. package/dist/chunk-OS6CMYAS.cjs.map +0 -1
  371. package/dist/chunk-PYURPUTV.js +0 -402
  372. package/dist/chunk-PYURPUTV.js.map +0 -1
  373. package/dist/chunk-RJ3HYZ7S.js +0 -44
  374. package/dist/chunk-RJ3HYZ7S.js.map +0 -1
  375. package/dist/chunk-RZNRIOLT.js +0 -128
  376. package/dist/chunk-RZNRIOLT.js.map +0 -1
  377. package/dist/chunk-S3T2L6NA.js +0 -38
  378. package/dist/chunk-S3T2L6NA.js.map +0 -1
  379. package/dist/chunk-S5IPJQZ3.cjs +0 -161
  380. package/dist/chunk-S5IPJQZ3.cjs.map +0 -1
  381. package/dist/chunk-SB5DSYR5.js.map +0 -1
  382. package/dist/chunk-SFXV2DUH.js +0 -106
  383. package/dist/chunk-SFXV2DUH.js.map +0 -1
  384. package/dist/chunk-SXEPGD4Z.cjs +0 -152
  385. package/dist/chunk-SXEPGD4Z.cjs.map +0 -1
  386. package/dist/chunk-SXWSOU3Y.js +0 -89
  387. package/dist/chunk-SXWSOU3Y.js.map +0 -1
  388. package/dist/chunk-SZMVOHT7.cjs +0 -107
  389. package/dist/chunk-SZMVOHT7.cjs.map +0 -1
  390. package/dist/chunk-TWJXOV4C.js +0 -145
  391. package/dist/chunk-TWJXOV4C.js.map +0 -1
  392. package/dist/chunk-U3ADRIVO.cjs +0 -434
  393. package/dist/chunk-U3ADRIVO.cjs.map +0 -1
  394. package/dist/chunk-U5FLLCGC.cjs +0 -151
  395. package/dist/chunk-U5FLLCGC.cjs.map +0 -1
  396. package/dist/chunk-UOZN45G4.cjs +0 -130
  397. package/dist/chunk-UOZN45G4.cjs.map +0 -1
  398. package/dist/chunk-VHLDOG74.cjs +0 -167
  399. package/dist/chunk-VHLDOG74.cjs.map +0 -1
  400. package/dist/chunk-YC5KLN6I.js +0 -139
  401. package/dist/chunk-YC5KLN6I.js.map +0 -1
  402. package/dist/chunk-YENXXYUV.cjs +0 -111
  403. package/dist/chunk-YENXXYUV.cjs.map +0 -1
  404. package/dist/chunk-YFQWC2PW.js +0 -113
  405. package/dist/chunk-YFQWC2PW.js.map +0 -1
  406. package/dist/chunk-Z2TY4A75.cjs +0 -700
  407. package/dist/chunk-Z2TY4A75.cjs.map +0 -1
  408. package/dist/chunk-Z56O7UEU.cjs +0 -136
  409. package/dist/chunk-Z56O7UEU.cjs.map +0 -1
  410. package/dist/chunk-ZBZDR4ZC.js +0 -106
  411. package/dist/chunk-ZBZDR4ZC.js.map +0 -1
@@ -1,4 +1,314 @@
1
- export { IranProvinceHeat } from '../../chunk-L2L5CKC2.js';
2
- import '../../chunk-4SVQNEVH.js';
1
+ 'use client';
2
+ import * as React from 'react';
3
+ import { clsx } from 'clsx';
4
+ import { twMerge } from 'tailwind-merge';
5
+ import { jsx, jsxs } from 'react/jsx-runtime';
6
+
7
+ function cn(...inputs) {
8
+ return twMerge(clsx(inputs));
9
+ }
10
+ function convertToLocalNumbers(text, locale) {
11
+ if (locale === "fa" || locale === "ar") {
12
+ const persianDigits = ["\u06F0", "\u06F1", "\u06F2", "\u06F3", "\u06F4", "\u06F5", "\u06F6", "\u06F7", "\u06F8", "\u06F9"];
13
+ return String(text).replace(/\d/g, (digit) => persianDigits[parseInt(digit)]);
14
+ }
15
+ return String(text);
16
+ }
17
+ function formatLargeNumber(num, locale) {
18
+ if (num >= 1e9) {
19
+ const formatted = (num / 1e9).toFixed(1).replace(/\.0$/, "");
20
+ return convertToLocalNumbers(formatted, locale) + (locale === "en" ? "B" : " \u0645\u06CC\u0644\u06CC\u0627\u0631\u062F");
21
+ }
22
+ if (num >= 1e6) {
23
+ const formatted = (num / 1e6).toFixed(1).replace(/\.0$/, "");
24
+ return convertToLocalNumbers(formatted, locale) + (locale === "en" ? "M" : " \u0645\u06CC\u0644\u06CC\u0648\u0646");
25
+ }
26
+ if (num >= 1e3) {
27
+ const formatted = (num / 1e3).toFixed(1).replace(/\.0$/, "");
28
+ return convertToLocalNumbers(formatted, locale) + (locale === "en" ? "K" : " \u0647\u0632\u0627\u0631");
29
+ }
30
+ return convertToLocalNumbers(num.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ","), locale);
31
+ }
32
+
33
+ // src/lib/iran-provinces.ts
34
+ var IRAN_PROVINCES = [
35
+ {
36
+ slug: "east-azerbaijan",
37
+ iso: "IR-01",
38
+ labels: { fa: "\u0622\u0630\u0631\u0628\u0627\u06CC\u062C\u0627\u0646 \u0634\u0631\u0642\u06CC", ar: "\u0623\u0630\u0631\u0628\u064A\u062C\u0627\u0646 \u0627\u0644\u0634\u0631\u0642\u064A\u0629", en: "East Azerbaijan" }
39
+ },
40
+ {
41
+ slug: "west-azerbaijan",
42
+ iso: "IR-02",
43
+ labels: { fa: "\u0622\u0630\u0631\u0628\u0627\u06CC\u062C\u0627\u0646 \u063A\u0631\u0628\u06CC", ar: "\u0623\u0630\u0631\u0628\u064A\u062C\u0627\u0646 \u0627\u0644\u063A\u0631\u0628\u064A\u0629", en: "West Azerbaijan" }
44
+ },
45
+ { slug: "ardabil", iso: "IR-03", labels: { fa: "\u0627\u0631\u062F\u0628\u06CC\u0644", ar: "\u0623\u0631\u062F\u0628\u064A\u0644", en: "Ardabil" } },
46
+ { slug: "isfahan", iso: "IR-04", labels: { fa: "\u0627\u0635\u0641\u0647\u0627\u0646", ar: "\u0623\u0635\u0641\u0647\u0627\u0646", en: "Isfahan" } },
47
+ { slug: "ilam", iso: "IR-05", labels: { fa: "\u0627\u06CC\u0644\u0627\u0645", ar: "\u0625\u064A\u0644\u0627\u0645", en: "Ilam" } },
48
+ { slug: "bushehr", iso: "IR-06", labels: { fa: "\u0628\u0648\u0634\u0647\u0631", ar: "\u0628\u0648\u0634\u0647\u0631", en: "Bushehr" } },
49
+ { slug: "tehran", iso: "IR-07", labels: { fa: "\u062A\u0647\u0631\u0627\u0646", ar: "\u0637\u0647\u0631\u0627\u0646", en: "Tehran" } },
50
+ {
51
+ slug: "chaharmahal-bakhtiari",
52
+ iso: "IR-08",
53
+ labels: { fa: "\u0686\u0647\u0627\u0631\u0645\u062D\u0627\u0644 \u0648 \u0628\u062E\u062A\u06CC\u0627\u0631\u06CC", ar: "\u062A\u0634\u0647\u0627\u0631\u0645\u062D\u0627\u0644 \u0648\u0628\u062E\u062A\u064A\u0627\u0631\u064A", en: "Chaharmahal and Bakhtiari" }
54
+ },
55
+ { slug: "razavi-khorasan", iso: "IR-09", labels: { fa: "\u062E\u0631\u0627\u0633\u0627\u0646 \u0631\u0636\u0648\u06CC", ar: "\u062E\u0631\u0627\u0633\u0627\u0646 \u0631\u0636\u0648\u064A", en: "Razavi Khorasan" } },
56
+ { slug: "khuzestan", iso: "IR-10", labels: { fa: "\u062E\u0648\u0632\u0633\u062A\u0627\u0646", ar: "\u062E\u0648\u0632\u0633\u062A\u0627\u0646", en: "Khuzestan" } },
57
+ { slug: "zanjan", iso: "IR-11", labels: { fa: "\u0632\u0646\u062C\u0627\u0646", ar: "\u0632\u0646\u062C\u0627\u0646", en: "Zanjan" } },
58
+ { slug: "semnan", iso: "IR-12", labels: { fa: "\u0633\u0645\u0646\u0627\u0646", ar: "\u0633\u0645\u0646\u0627\u0646", en: "Semnan" } },
59
+ {
60
+ slug: "sistan-baluchestan",
61
+ iso: "IR-13",
62
+ labels: { fa: "\u0633\u06CC\u0633\u062A\u0627\u0646 \u0648 \u0628\u0644\u0648\u0686\u0633\u062A\u0627\u0646", ar: "\u0633\u064A\u0633\u062A\u0627\u0646 \u0648\u0628\u0644\u0648\u0634\u0633\u062A\u0627\u0646", en: "Sistan and Baluchestan" }
63
+ },
64
+ { slug: "fars", iso: "IR-14", labels: { fa: "\u0641\u0627\u0631\u0633", ar: "\u0641\u0627\u0631\u0633", en: "Fars" } },
65
+ { slug: "kerman", iso: "IR-15", labels: { fa: "\u06A9\u0631\u0645\u0627\u0646", ar: "\u0643\u0631\u0645\u0627\u0646", en: "Kerman" } },
66
+ { slug: "kurdistan", iso: "IR-16", labels: { fa: "\u06A9\u0631\u062F\u0633\u062A\u0627\u0646", ar: "\u0643\u0631\u062F\u0633\u062A\u0627\u0646", en: "Kurdistan" } },
67
+ { slug: "kermanshah", iso: "IR-17", labels: { fa: "\u06A9\u0631\u0645\u0627\u0646\u0634\u0627\u0647", ar: "\u0643\u0631\u0645\u0627\u0646\u0634\u0627\u0647", en: "Kermanshah" } },
68
+ {
69
+ slug: "kohgiluyeh-boyer-ahmad",
70
+ iso: "IR-18",
71
+ labels: { fa: "\u06A9\u0647\u06AF\u06CC\u0644\u0648\u06CC\u0647 \u0648 \u0628\u0648\u06CC\u0631\u0627\u062D\u0645\u062F", ar: "\u0643\u0647\u063A\u064A\u0644\u0648\u064A\u0629 \u0648\u0628\u0648\u064A\u0631 \u0623\u062D\u0645\u062F", en: "Kohgiluyeh and Boyer-Ahmad" }
72
+ },
73
+ { slug: "gilan", iso: "IR-19", labels: { fa: "\u06AF\u06CC\u0644\u0627\u0646", ar: "\u062C\u064A\u0644\u0627\u0646", en: "Gilan" } },
74
+ { slug: "lorestan", iso: "IR-20", labels: { fa: "\u0644\u0631\u0633\u062A\u0627\u0646", ar: "\u0644\u0631\u0633\u062A\u0627\u0646", en: "Lorestan" } },
75
+ { slug: "mazandaran", iso: "IR-21", labels: { fa: "\u0645\u0627\u0632\u0646\u062F\u0631\u0627\u0646", ar: "\u0645\u0627\u0632\u0646\u062F\u0631\u0627\u0646", en: "Mazandaran" } },
76
+ { slug: "markazi", iso: "IR-22", labels: { fa: "\u0645\u0631\u06A9\u0632\u06CC", ar: "\u0645\u0631\u0643\u0632\u064A", en: "Markazi" } },
77
+ { slug: "hormozgan", iso: "IR-23", labels: { fa: "\u0647\u0631\u0645\u0632\u06AF\u0627\u0646", ar: "\u0647\u0631\u0645\u0632\u063A\u0627\u0646", en: "Hormozgan" } },
78
+ { slug: "hamadan", iso: "IR-24", labels: { fa: "\u0647\u0645\u062F\u0627\u0646", ar: "\u0647\u0645\u062F\u0627\u0646", en: "Hamadan" } },
79
+ { slug: "yazd", iso: "IR-25", labels: { fa: "\u06CC\u0632\u062F", ar: "\u064A\u0632\u062F", en: "Yazd" } },
80
+ { slug: "qom", iso: "IR-26", labels: { fa: "\u0642\u0645", ar: "\u0642\u0645", en: "Qom" } },
81
+ { slug: "golestan", iso: "IR-27", labels: { fa: "\u06AF\u0644\u0633\u062A\u0627\u0646", ar: "\u063A\u0648\u0644\u0633\u062A\u0627\u0646", en: "Golestan" } },
82
+ { slug: "qazvin", iso: "IR-28", labels: { fa: "\u0642\u0632\u0648\u06CC\u0646", ar: "\u0642\u0632\u0648\u064A\u0646", en: "Qazvin" } },
83
+ { slug: "north-khorasan", iso: "IR-29", labels: { fa: "\u062E\u0631\u0627\u0633\u0627\u0646 \u0634\u0645\u0627\u0644\u06CC", ar: "\u062E\u0631\u0627\u0633\u0627\u0646 \u0627\u0644\u0634\u0645\u0627\u0644\u064A\u0629", en: "North Khorasan" } },
84
+ { slug: "south-khorasan", iso: "IR-30", labels: { fa: "\u062E\u0631\u0627\u0633\u0627\u0646 \u062C\u0646\u0648\u0628\u06CC", ar: "\u062E\u0631\u0627\u0633\u0627\u0646 \u0627\u0644\u062C\u0646\u0648\u0628\u064A\u0629", en: "South Khorasan" } },
85
+ { slug: "alborz", iso: "IR-31", labels: { fa: "\u0627\u0644\u0628\u0631\u0632", ar: "\u0627\u0644\u0628\u0631\u0632", en: "Alborz" } }
86
+ ];
87
+ var SLUG_INDEX = new Map(IRAN_PROVINCES.map((p) => [p.slug, p]));
88
+ var ISO_INDEX = new Map(IRAN_PROVINCES.map((p) => [p.iso, p]));
89
+ function findProvince(codeOrSlug) {
90
+ return SLUG_INDEX.get(codeOrSlug) ?? ISO_INDEX.get(codeOrSlug);
91
+ }
92
+ var SCALE_TO_VAR = {
93
+ brand: "--brand-default",
94
+ "sentiment-positive": "--sentiment-positive",
95
+ "sentiment-negative": "--sentiment-negative",
96
+ destructive: "--destructive-default",
97
+ warning: "--warning-default",
98
+ "severity-urgent": "--severity-urgent",
99
+ "severity-high": "--severity-high",
100
+ "flow-pro-gov": "--flow-pro-gov",
101
+ "flow-internal-critic": "--flow-internal-critic"
102
+ };
103
+ var LOCALE_STRINGS = {
104
+ fa: {
105
+ empty: "\u062F\u0627\u062F\u0647\u200C\u0627\u06CC \u0628\u0631\u0627\u06CC \u0627\u0633\u062A\u0627\u0646\u200C\u0647\u0627 \u062F\u0631 \u062F\u0633\u062A\u0631\u0633 \u0646\u06CC\u0633\u062A.",
106
+ more: (n) => `+${n} \u0627\u0633\u062A\u0627\u0646 \u062F\u06CC\u06AF\u0631`,
107
+ loading: "\u062F\u0631 \u062D\u0627\u0644 \u0628\u0627\u0631\u06AF\u0630\u0627\u0631\u06CC"
108
+ },
109
+ ar: {
110
+ empty: "\u0644\u0627 \u062A\u0648\u062C\u062F \u0628\u064A\u0627\u0646\u0627\u062A \u0644\u0644\u0645\u062D\u0627\u0641\u0638\u0627\u062A.",
111
+ more: (n) => `+${n} \u0645\u062D\u0627\u0641\u0638\u0629 \u0623\u062E\u0631\u0649`,
112
+ loading: "\u062C\u0627\u0631\u064D \u0627\u0644\u062A\u062D\u0645\u064A\u0644"
113
+ },
114
+ en: {
115
+ empty: "No province data available.",
116
+ more: (n) => `+${n} more`,
117
+ loading: "Loading"
118
+ }
119
+ };
120
+ var IranProvinceHeat = React.forwardRef(function IranProvinceHeat2({
121
+ data,
122
+ scale = "brand",
123
+ sort = "value-desc",
124
+ topN = 0,
125
+ showRank = false,
126
+ showValue = true,
127
+ hideMissing = false,
128
+ density = "comfortable",
129
+ valueSuffix,
130
+ valueFormatter,
131
+ onProvinceClick,
132
+ onUnknownCode,
133
+ locale = "fa",
134
+ isLoading = false,
135
+ emptyState,
136
+ className,
137
+ ...divProps
138
+ }, ref) {
139
+ const strings = LOCALE_STRINGS[locale] ?? LOCALE_STRINGS.fa;
140
+ const cssVar = SCALE_TO_VAR[scale];
141
+ const rows = React.useMemo(() => {
142
+ if (isLoading) return [];
143
+ const cells = Array.isArray(data) ? data : Object.entries(data).map(([code, value]) => ({ code, value }));
144
+ const valueByProvinceSlug = /* @__PURE__ */ new Map();
145
+ for (const cell of cells) {
146
+ const province = findProvince(cell.code);
147
+ if (!province) {
148
+ onUnknownCode?.(cell.code);
149
+ continue;
150
+ }
151
+ valueByProvinceSlug.set(province.slug, cell.value);
152
+ }
153
+ const candidates = [];
154
+ for (const province of IRAN_PROVINCES) {
155
+ const value = valueByProvinceSlug.get(province.slug) ?? 0;
156
+ if (hideMissing && value === 0) continue;
157
+ candidates.push({
158
+ slug: province.slug,
159
+ iso: province.iso,
160
+ label: province.labels[locale] ?? province.labels.fa,
161
+ value,
162
+ intensity: 0
163
+ // filled below
164
+ });
165
+ }
166
+ if (candidates.length === 0) return [];
167
+ const max = candidates.reduce((m, r) => Math.max(m, r.value), 0);
168
+ if (max > 0) {
169
+ for (const row of candidates) row.intensity = Math.min(1, Math.max(0, row.value / max));
170
+ }
171
+ if (sort === "value-desc") candidates.sort((a, b) => b.value - a.value);
172
+ else if (sort === "value-asc") candidates.sort((a, b) => a.value - b.value);
173
+ else candidates.sort((a, b) => a.label.localeCompare(b.label, locale === "en" ? "en" : "fa"));
174
+ return candidates;
175
+ }, [data, hideMissing, isLoading, locale, onUnknownCode, sort]);
176
+ const visibleRows = topN > 0 ? rows.slice(0, topN) : rows;
177
+ const hiddenCount = rows.length - visibleRows.length;
178
+ const formatValue = React.useCallback(
179
+ (value) => {
180
+ if (valueFormatter) return valueFormatter(value);
181
+ const base = formatLargeNumber(value, locale);
182
+ return valueSuffix ? `${base}${valueSuffix}` : base;
183
+ },
184
+ [locale, valueFormatter, valueSuffix]
185
+ );
186
+ if (isLoading) {
187
+ return /* @__PURE__ */ jsx(
188
+ "div",
189
+ {
190
+ ref,
191
+ "data-slot": "iran-province-heat",
192
+ "data-state": "loading",
193
+ role: "status",
194
+ "aria-label": strings.loading,
195
+ className: cn("flex flex-col gap-1.5 w-full", className),
196
+ ...divProps,
197
+ children: Array.from({ length: 6 }).map((_, i) => /* @__PURE__ */ jsxs(
198
+ "div",
199
+ {
200
+ "data-slot": "iran-province-heat-skeleton-row",
201
+ className: cn("flex items-center gap-2 animate-pulse", density === "compact" ? "h-7" : "h-9"),
202
+ children: [
203
+ /* @__PURE__ */ jsx("div", { className: "h-3.5 w-24 rounded bg-overlay-hover" }),
204
+ /* @__PURE__ */ jsx("div", { className: "h-2.5 flex-1 rounded bg-overlay-hover" }),
205
+ /* @__PURE__ */ jsx("div", { className: "h-3.5 w-10 rounded bg-overlay-hover" })
206
+ ]
207
+ },
208
+ i
209
+ ))
210
+ }
211
+ );
212
+ }
213
+ if (rows.length === 0) {
214
+ return /* @__PURE__ */ jsx(
215
+ "div",
216
+ {
217
+ ref,
218
+ "data-slot": "iran-province-heat",
219
+ "data-state": "empty",
220
+ className: cn("flex items-center justify-center text-sm text-foreground-muted py-8", className),
221
+ ...divProps,
222
+ children: emptyState ?? strings.empty
223
+ }
224
+ );
225
+ }
226
+ return /* @__PURE__ */ jsxs(
227
+ "div",
228
+ {
229
+ ref,
230
+ "data-slot": "iran-province-heat",
231
+ "data-density": density,
232
+ "data-scale": scale,
233
+ role: "list",
234
+ className: cn("flex flex-col w-full", density === "compact" ? "gap-0.5" : "gap-1", className),
235
+ ...divProps,
236
+ children: [
237
+ visibleRows.map((row, index) => {
238
+ const isInteractive = !!onProvinceClick;
239
+ const Tag = isInteractive ? "button" : "div";
240
+ const intensity = row.intensity;
241
+ const bgAlpha = 0.08 + intensity * 0.55;
242
+ const widthPct = `${Math.max(2, intensity * 100)}%`;
243
+ return /* @__PURE__ */ jsxs(
244
+ Tag,
245
+ {
246
+ type: isInteractive ? "button" : void 0,
247
+ role: "listitem",
248
+ "data-slot": "iran-province-heat-row",
249
+ "data-province": row.slug,
250
+ "data-iso": row.iso,
251
+ "data-rank": index + 1,
252
+ onClick: isInteractive ? () => onProvinceClick({ slug: row.slug, iso: row.iso, value: row.value }) : void 0,
253
+ className: cn(
254
+ "group relative flex items-center gap-2 rounded-md ps-2 pe-2 text-start transition-colors",
255
+ density === "compact" ? "h-7 text-xs" : "h-9 text-sm",
256
+ isInteractive && "hover:bg-overlay-hover focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-brand",
257
+ !isInteractive && "cursor-default"
258
+ ),
259
+ "aria-label": `${row.label}: ${formatValue(row.value)}`,
260
+ children: [
261
+ /* @__PURE__ */ jsx(
262
+ "div",
263
+ {
264
+ "data-slot": "iran-province-heat-bar",
265
+ "aria-hidden": "true",
266
+ className: "absolute inset-y-0 inset-inline-start-0 rounded-md transition-[width] duration-300",
267
+ style: {
268
+ width: widthPct,
269
+ backgroundColor: `hsl(var(${cssVar}) / ${bgAlpha.toFixed(3)})`
270
+ }
271
+ }
272
+ ),
273
+ showRank && /* @__PURE__ */ jsx(
274
+ "span",
275
+ {
276
+ "data-slot": "iran-province-heat-rank",
277
+ className: "relative z-[1] inline-flex h-5 min-w-5 items-center justify-center rounded bg-background-default px-1 text-[10px] font-medium tabular-nums text-foreground-light",
278
+ children: convertToLocalNumbers(index + 1, locale)
279
+ }
280
+ ),
281
+ /* @__PURE__ */ jsx(
282
+ "span",
283
+ {
284
+ "data-slot": "iran-province-heat-label",
285
+ className: "relative z-[1] flex-1 truncate font-medium text-foreground",
286
+ children: row.label
287
+ }
288
+ ),
289
+ showValue && /* @__PURE__ */ jsx("span", { "data-slot": "iran-province-heat-value", className: "relative z-[1] tabular-nums text-foreground-light", children: formatValue(row.value) })
290
+ ]
291
+ },
292
+ row.slug
293
+ );
294
+ }),
295
+ hiddenCount > 0 && /* @__PURE__ */ jsx(
296
+ "div",
297
+ {
298
+ "data-slot": "iran-province-heat-overflow",
299
+ className: cn(
300
+ "flex items-center justify-center rounded-md text-foreground-muted",
301
+ density === "compact" ? "h-7 text-[11px]" : "h-9 text-xs"
302
+ ),
303
+ children: strings.more(convertToLocalNumbers(hiddenCount, locale))
304
+ }
305
+ )
306
+ ]
307
+ }
308
+ );
309
+ });
310
+ IranProvinceHeat.displayName = "IranProvinceHeat";
311
+
312
+ export { IranProvinceHeat };
3
313
  //# sourceMappingURL=iran-province-heat.js.map
4
314
  //# sourceMappingURL=iran-province-heat.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"iran-province-heat.js"}
1
+ {"version":3,"sources":["../../../src/lib/utils.ts","../../../src/lib/iran-provinces.ts","../../../src/components/ui/iran-province-heat.tsx"],"names":["IranProvinceHeat"],"mappings":"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","file":"iran-province-heat.js","sourcesContent":["import { type ClassValue, clsx } from 'clsx'\nimport { twMerge } from 'tailwind-merge'\nimport { formatJalaliDate } from '@/lib/jalali-utils'\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n\nexport type SupportedLocale = 'fa' | 'ar' | 'en'\n\n/**\n * Convert digits in a string to Persian/Arabic numerals based on locale.\n * @example convertToLocalNumbers('123', 'fa') => '۱۲۳'\n * @example convertToLocalNumbers('123', 'en') => '123'\n */\nexport function convertToLocalNumbers(text: string | number, locale: SupportedLocale): string {\n if (locale === 'fa' || locale === 'ar') {\n const persianDigits = ['۰', '۱', '۲', '۳', '۴', '۵', '۶', '۷', '۸', '۹']\n return String(text).replace(/\\d/g, (digit) => persianDigits[parseInt(digit)])\n }\n return String(text)\n}\n\n/**\n * Format large numbers with locale-aware suffixes (K/M/B).\n * @example formatLargeNumber(1500, 'fa') => '۱.۵ هزار'\n * @example formatLargeNumber(1500, 'en') => '1.5K'\n */\nexport function formatLargeNumber(num: number, locale: SupportedLocale): string {\n if (num >= 1_000_000_000) {\n const formatted = (num / 1_000_000_000).toFixed(1).replace(/\\.0$/, '')\n return convertToLocalNumbers(formatted, locale) + (locale === 'en' ? 'B' : ' میلیارد')\n }\n if (num >= 1_000_000) {\n const formatted = (num / 1_000_000).toFixed(1).replace(/\\.0$/, '')\n return convertToLocalNumbers(formatted, locale) + (locale === 'en' ? 'M' : ' میلیون')\n }\n if (num >= 1_000) {\n const formatted = (num / 1_000).toFixed(1).replace(/\\.0$/, '')\n return convertToLocalNumbers(formatted, locale) + (locale === 'en' ? 'K' : ' هزار')\n }\n return convertToLocalNumbers(num.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, ','), locale)\n}\n\n/**\n * Format number to Instagram-style short format (English only).\n * @example formatNumber(123456, 'short') => '123K'\n * @example formatNumber(123456, 'exact') => '123,456'\n */\nexport function formatNumber(num: number | undefined, format: 'exact' | 'short' = 'exact'): string {\n if (num === undefined || num === null) return '0'\n\n if (format === 'exact') {\n return num.toLocaleString('en-US')\n }\n\n // Short format (Instagram style)\n if (num >= 1_000_000_000) {\n return `${(num / 1_000_000_000).toFixed(1).replace(/\\.0$/, '')}B`\n }\n if (num >= 1_000_000) {\n return `${(num / 1_000_000).toFixed(1).replace(/\\.0$/, '')}M`\n }\n if (num >= 1_000) {\n return `${(num / 1_000).toFixed(1).replace(/\\.0$/, '')}K`\n }\n return num.toString()\n}\n\n/**\n * Format date to relative time with absolute on hover (Persian)\n * @example formatRelativeTime(new Date()) => '۲ ساعت پیش'\n */\nexport function formatRelativeTime(date: Date | string | number): string {\n const now = new Date()\n const then = new Date(date)\n const diffInSeconds = Math.floor((now.getTime() - then.getTime()) / 1000)\n\n if (diffInSeconds < 60) {\n return 'همین الان'\n }\n\n const diffInMinutes = Math.floor(diffInSeconds / 60)\n if (diffInMinutes < 60) {\n return `${convertToLocalNumbers(diffInMinutes, 'fa')} دقیقه پیش`\n }\n\n const diffInHours = Math.floor(diffInMinutes / 60)\n if (diffInHours < 24) {\n return `${convertToLocalNumbers(diffInHours, 'fa')} ساعت پیش`\n }\n\n const diffInDays = Math.floor(diffInHours / 24)\n if (diffInDays < 7) {\n return `${convertToLocalNumbers(diffInDays, 'fa')} روز پیش`\n }\n\n const diffInWeeks = Math.floor(diffInDays / 7)\n if (diffInWeeks < 4) {\n return `${convertToLocalNumbers(diffInWeeks, 'fa')} هفته پیش`\n }\n\n const diffInMonths = Math.floor(diffInDays / 30)\n if (diffInMonths < 12) {\n return `${convertToLocalNumbers(diffInMonths, 'fa')} ماه پیش`\n }\n\n const diffInYears = Math.floor(diffInDays / 365)\n return `${convertToLocalNumbers(diffInYears, 'fa')} سال پیش`\n}\n\n/**\n * Format date to absolute format (Persian / Jalali)\n * Uses date-fns-jalali for accurate Jalali conversion.\n * @example formatAbsoluteTime(new Date()) => '۱۵ دی ۱۴۰۳، ۱۵:۳۰'\n */\nexport function formatAbsoluteTime(date: Date | string | number): string {\n const d = new Date(date)\n return formatJalaliDate(d, 'd MMMM yyyy، HH:mm')\n}\n","/**\n * Iran's 31 provinces with trilingual labels and ISO 3166-2 codes.\n *\n * Use as a stable identifier source for `IranProvinceHeat`, `RegionPicker`,\n * and any public-opinion dashboard scoped by استان. The slug (`code`) is the\n * canonical key — never rely on label string equality, since labels are\n * locale-dependent and may evolve.\n *\n * Codes follow ISO 3166-2:IR (e.g. 'IR-07' for Tehran). The slug is the\n * lowercased, hyphenated English name without diacritics, suitable for URLs\n * and CSS selectors. Use `getProvinceLabel(code, locale)` to resolve a label.\n */\n\nimport type { SupportedLocale } from './utils'\n\nexport interface IranProvince {\n /** Stable URL-safe slug. The canonical key for province lookups. */\n slug: string\n /** ISO 3166-2:IR code (e.g. 'IR-07'). */\n iso: string\n /** Trilingual labels — fa is the canonical/native form. */\n labels: Record<SupportedLocale, string>\n}\n\nexport const IRAN_PROVINCES: readonly IranProvince[] = [\n {\n slug: 'east-azerbaijan',\n iso: 'IR-01',\n labels: { fa: 'آذربایجان شرقی', ar: 'أذربيجان الشرقية', en: 'East Azerbaijan' },\n },\n {\n slug: 'west-azerbaijan',\n iso: 'IR-02',\n labels: { fa: 'آذربایجان غربی', ar: 'أذربيجان الغربية', en: 'West Azerbaijan' },\n },\n { slug: 'ardabil', iso: 'IR-03', labels: { fa: 'اردبیل', ar: 'أردبيل', en: 'Ardabil' } },\n { slug: 'isfahan', iso: 'IR-04', labels: { fa: 'اصفهان', ar: 'أصفهان', en: 'Isfahan' } },\n { slug: 'ilam', iso: 'IR-05', labels: { fa: 'ایلام', ar: 'إيلام', en: 'Ilam' } },\n { slug: 'bushehr', iso: 'IR-06', labels: { fa: 'بوشهر', ar: 'بوشهر', en: 'Bushehr' } },\n { slug: 'tehran', iso: 'IR-07', labels: { fa: 'تهران', ar: 'طهران', en: 'Tehran' } },\n {\n slug: 'chaharmahal-bakhtiari',\n iso: 'IR-08',\n labels: { fa: 'چهارمحال و بختیاری', ar: 'تشهارمحال وبختياري', en: 'Chaharmahal and Bakhtiari' },\n },\n { slug: 'razavi-khorasan', iso: 'IR-09', labels: { fa: 'خراسان رضوی', ar: 'خراسان رضوي', en: 'Razavi Khorasan' } },\n { slug: 'khuzestan', iso: 'IR-10', labels: { fa: 'خوزستان', ar: 'خوزستان', en: 'Khuzestan' } },\n { slug: 'zanjan', iso: 'IR-11', labels: { fa: 'زنجان', ar: 'زنجان', en: 'Zanjan' } },\n { slug: 'semnan', iso: 'IR-12', labels: { fa: 'سمنان', ar: 'سمنان', en: 'Semnan' } },\n {\n slug: 'sistan-baluchestan',\n iso: 'IR-13',\n labels: { fa: 'سیستان و بلوچستان', ar: 'سيستان وبلوشستان', en: 'Sistan and Baluchestan' },\n },\n { slug: 'fars', iso: 'IR-14', labels: { fa: 'فارس', ar: 'فارس', en: 'Fars' } },\n { slug: 'kerman', iso: 'IR-15', labels: { fa: 'کرمان', ar: 'كرمان', en: 'Kerman' } },\n { slug: 'kurdistan', iso: 'IR-16', labels: { fa: 'کردستان', ar: 'كردستان', en: 'Kurdistan' } },\n { slug: 'kermanshah', iso: 'IR-17', labels: { fa: 'کرمانشاه', ar: 'كرمانشاه', en: 'Kermanshah' } },\n {\n slug: 'kohgiluyeh-boyer-ahmad',\n iso: 'IR-18',\n labels: { fa: 'کهگیلویه و بویراحمد', ar: 'كهغيلوية وبوير أحمد', en: 'Kohgiluyeh and Boyer-Ahmad' },\n },\n { slug: 'gilan', iso: 'IR-19', labels: { fa: 'گیلان', ar: 'جيلان', en: 'Gilan' } },\n { slug: 'lorestan', iso: 'IR-20', labels: { fa: 'لرستان', ar: 'لرستان', en: 'Lorestan' } },\n { slug: 'mazandaran', iso: 'IR-21', labels: { fa: 'مازندران', ar: 'مازندران', en: 'Mazandaran' } },\n { slug: 'markazi', iso: 'IR-22', labels: { fa: 'مرکزی', ar: 'مركزي', en: 'Markazi' } },\n { slug: 'hormozgan', iso: 'IR-23', labels: { fa: 'هرمزگان', ar: 'هرمزغان', en: 'Hormozgan' } },\n { slug: 'hamadan', iso: 'IR-24', labels: { fa: 'همدان', ar: 'همدان', en: 'Hamadan' } },\n { slug: 'yazd', iso: 'IR-25', labels: { fa: 'یزد', ar: 'يزد', en: 'Yazd' } },\n { slug: 'qom', iso: 'IR-26', labels: { fa: 'قم', ar: 'قم', en: 'Qom' } },\n { slug: 'golestan', iso: 'IR-27', labels: { fa: 'گلستان', ar: 'غولستان', en: 'Golestan' } },\n { slug: 'qazvin', iso: 'IR-28', labels: { fa: 'قزوین', ar: 'قزوين', en: 'Qazvin' } },\n { slug: 'north-khorasan', iso: 'IR-29', labels: { fa: 'خراسان شمالی', ar: 'خراسان الشمالية', en: 'North Khorasan' } },\n { slug: 'south-khorasan', iso: 'IR-30', labels: { fa: 'خراسان جنوبی', ar: 'خراسان الجنوبية', en: 'South Khorasan' } },\n { slug: 'alborz', iso: 'IR-31', labels: { fa: 'البرز', ar: 'البرز', en: 'Alborz' } },\n] as const\n\nexport type IranProvinceSlug = (typeof IRAN_PROVINCES)[number]['slug']\n\nconst SLUG_INDEX = new Map(IRAN_PROVINCES.map((p) => [p.slug, p]))\nconst ISO_INDEX = new Map(IRAN_PROVINCES.map((p) => [p.iso, p]))\n\n/** Look up a province by slug or ISO code. Returns undefined for unknown codes. */\nexport function findProvince(codeOrSlug: string): IranProvince | undefined {\n return SLUG_INDEX.get(codeOrSlug) ?? ISO_INDEX.get(codeOrSlug)\n}\n\n/**\n * Resolve the locale-appropriate label for a province slug or ISO code.\n * Falls back to fa for unknown locales and to the slug itself for unknown\n * provinces (so the row still renders something instead of crashing).\n */\nexport function getProvinceLabel(codeOrSlug: string, locale: SupportedLocale = 'fa'): string {\n const p = findProvince(codeOrSlug)\n if (!p) return codeOrSlug\n return p.labels[locale] ?? p.labels.fa\n}\n","'use client'\n\nimport * as React from 'react'\nimport { cn, convertToLocalNumbers, formatLargeNumber, type SupportedLocale } from '@/lib/utils'\nimport { findProvince, IRAN_PROVINCES } from '@/lib/iran-provinces'\n\n/* -------------------------------------------------------------------------- */\n/* Types */\n/* -------------------------------------------------------------------------- */\n\nexport interface IranProvinceCell {\n /** Province slug or ISO 3166-2:IR code (e.g. 'tehran' or 'IR-07'). */\n code: string\n /** Numeric value to compare across provinces (count, score, percentage…). */\n value: number\n}\n\nexport type IranProvinceHeatScale =\n | 'brand'\n | 'sentiment-positive'\n | 'sentiment-negative'\n | 'destructive'\n | 'warning'\n | 'severity-urgent'\n | 'severity-high'\n | 'flow-pro-gov'\n | 'flow-internal-critic'\n\nexport interface IranProvinceHeatProps extends React.HTMLAttributes<HTMLDivElement> {\n /**\n * Either an array of `{code, value}` cells, or a record map. Provinces not\n * in the dataset render with value 0 unless `hideMissing` is true. Cells\n * with unknown codes are skipped (and warned via `onUnknownCode` if set).\n */\n data: IranProvinceCell[] | Record<string, number>\n /**\n * Color token to use for the heat bars. Bars within the dataset are tinted\n * with progressively higher alpha based on `value / max`.\n * @default 'brand'\n */\n scale?: IranProvinceHeatScale\n /** Sort order for the rows. @default 'value-desc' */\n sort?: 'value-desc' | 'value-asc' | 'name'\n /**\n * Show only top-N rows (after sorting). When set, a \"+N more\" row collapses\n * the rest. Use 0 to show all 31 — that's the default.\n */\n topN?: number\n /** Display rank (۱، ۲، ۳، …) at the start of each row. @default false */\n showRank?: boolean\n /** Inline numeric value on each row. @default true */\n showValue?: boolean\n /** Hide rows with value 0 (or missing from dataset). @default false */\n hideMissing?: boolean\n /** Compact rows (28px) vs comfortable (36px). @default 'comfortable' */\n density?: 'compact' | 'comfortable'\n /**\n * Suffix on the inline value (e.g. ' نظر', ' %').\n * Useful when consumers don't want to write a custom valueFormatter.\n */\n valueSuffix?: string\n /** Custom value formatter; overrides the locale-aware default. */\n valueFormatter?: (value: number) => string\n /** Click handler — receives slug + ISO + value. Optional. */\n onProvinceClick?: (province: { slug: string; iso: string; value: number }) => void\n /** Called once per unknown code in `data`, useful for telemetry. */\n onUnknownCode?: (code: string) => void\n /** Locale for labels + digit formatting. @default 'fa' */\n locale?: SupportedLocale\n /** Loading skeleton while data fetches. */\n isLoading?: boolean\n /** Empty-state node when `data` is empty (or all-zero with hideMissing). */\n emptyState?: React.ReactNode\n}\n\n/* -------------------------------------------------------------------------- */\n/* Token mapping */\n/* -------------------------------------------------------------------------- */\n\nconst SCALE_TO_VAR: Record<IranProvinceHeatScale, string> = {\n brand: '--brand-default',\n 'sentiment-positive': '--sentiment-positive',\n 'sentiment-negative': '--sentiment-negative',\n destructive: '--destructive-default',\n warning: '--warning-default',\n 'severity-urgent': '--severity-urgent',\n 'severity-high': '--severity-high',\n 'flow-pro-gov': '--flow-pro-gov',\n 'flow-internal-critic': '--flow-internal-critic',\n}\n\nconst LOCALE_STRINGS: Record<SupportedLocale, { empty: string; more: (n: string) => string; loading: string }> = {\n fa: {\n empty: 'داده‌ای برای استان‌ها در دسترس نیست.',\n more: (n) => `+${n} استان دیگر`,\n loading: 'در حال بارگذاری',\n },\n ar: {\n empty: 'لا توجد بيانات للمحافظات.',\n more: (n) => `+${n} محافظة أخرى`,\n loading: 'جارٍ التحميل',\n },\n en: {\n empty: 'No province data available.',\n more: (n) => `+${n} more`,\n loading: 'Loading',\n },\n}\n\n/* -------------------------------------------------------------------------- */\n/* Component */\n/* -------------------------------------------------------------------------- */\n\ninterface ResolvedRow {\n slug: string\n iso: string\n label: string\n value: number\n intensity: number\n}\n\nconst IranProvinceHeat = React.forwardRef<HTMLDivElement, IranProvinceHeatProps>(function IranProvinceHeat(\n {\n data,\n scale = 'brand',\n sort = 'value-desc',\n topN = 0,\n showRank = false,\n showValue = true,\n hideMissing = false,\n density = 'comfortable',\n valueSuffix,\n valueFormatter,\n onProvinceClick,\n onUnknownCode,\n locale = 'fa',\n isLoading = false,\n emptyState,\n className,\n ...divProps\n },\n ref\n) {\n const strings = LOCALE_STRINGS[locale] ?? LOCALE_STRINGS.fa\n const cssVar = SCALE_TO_VAR[scale]\n\n const rows = React.useMemo<ResolvedRow[]>(() => {\n if (isLoading) return []\n\n const cells = Array.isArray(data) ? data : Object.entries(data).map(([code, value]) => ({ code, value }))\n\n // Resolve provinces, drop unknown (with optional callback for telemetry)\n const valueByProvinceSlug = new Map<string, number>()\n for (const cell of cells) {\n const province = findProvince(cell.code)\n if (!province) {\n onUnknownCode?.(cell.code)\n continue\n }\n // If duplicates exist for the same province, the later one wins —\n // consumers normalize upstream if needed.\n valueByProvinceSlug.set(province.slug, cell.value)\n }\n\n // Build rows for ALL 31 provinces unless hideMissing\n const candidates: ResolvedRow[] = []\n for (const province of IRAN_PROVINCES) {\n const value = valueByProvinceSlug.get(province.slug) ?? 0\n if (hideMissing && value === 0) continue\n candidates.push({\n slug: province.slug,\n iso: province.iso,\n label: province.labels[locale] ?? province.labels.fa,\n value,\n intensity: 0, // filled below\n })\n }\n\n if (candidates.length === 0) return []\n\n // Compute intensity = value / max (clamped to [0,1]); when all zero, all intensities are 0\n const max = candidates.reduce((m, r) => Math.max(m, r.value), 0)\n if (max > 0) {\n for (const row of candidates) row.intensity = Math.min(1, Math.max(0, row.value / max))\n }\n\n // Sort\n if (sort === 'value-desc') candidates.sort((a, b) => b.value - a.value)\n else if (sort === 'value-asc') candidates.sort((a, b) => a.value - b.value)\n else candidates.sort((a, b) => a.label.localeCompare(b.label, locale === 'en' ? 'en' : 'fa'))\n\n return candidates\n }, [data, hideMissing, isLoading, locale, onUnknownCode, sort])\n\n const visibleRows = topN > 0 ? rows.slice(0, topN) : rows\n const hiddenCount = rows.length - visibleRows.length\n\n const formatValue = React.useCallback(\n (value: number) => {\n if (valueFormatter) return valueFormatter(value)\n const base = formatLargeNumber(value, locale)\n return valueSuffix ? `${base}${valueSuffix}` : base\n },\n [locale, valueFormatter, valueSuffix]\n )\n\n /* --------------------------------- Render -------------------------------- */\n\n if (isLoading) {\n return (\n <div\n ref={ref}\n data-slot=\"iran-province-heat\"\n data-state=\"loading\"\n role=\"status\"\n aria-label={strings.loading}\n className={cn('flex flex-col gap-1.5 w-full', className)}\n {...divProps}\n >\n {Array.from({ length: 6 }).map((_, i) => (\n <div\n key={i}\n data-slot=\"iran-province-heat-skeleton-row\"\n className={cn('flex items-center gap-2 animate-pulse', density === 'compact' ? 'h-7' : 'h-9')}\n >\n <div className=\"h-3.5 w-24 rounded bg-overlay-hover\" />\n <div className=\"h-2.5 flex-1 rounded bg-overlay-hover\" />\n <div className=\"h-3.5 w-10 rounded bg-overlay-hover\" />\n </div>\n ))}\n </div>\n )\n }\n\n if (rows.length === 0) {\n return (\n <div\n ref={ref}\n data-slot=\"iran-province-heat\"\n data-state=\"empty\"\n className={cn('flex items-center justify-center text-sm text-foreground-muted py-8', className)}\n {...divProps}\n >\n {emptyState ?? strings.empty}\n </div>\n )\n }\n\n return (\n <div\n ref={ref}\n data-slot=\"iran-province-heat\"\n data-density={density}\n data-scale={scale}\n role=\"list\"\n className={cn('flex flex-col w-full', density === 'compact' ? 'gap-0.5' : 'gap-1', className)}\n {...divProps}\n >\n {visibleRows.map((row, index) => {\n const isInteractive = !!onProvinceClick\n const Tag = isInteractive ? 'button' : 'div'\n const intensity = row.intensity\n // The bar background scales alpha from 0.1 to 0.9; the bar itself\n // uses the full token color for a consistent darkest-shade signal.\n const bgAlpha = 0.08 + intensity * 0.55\n const widthPct = `${Math.max(2, intensity * 100)}%` // min 2% so a rendered row is visible\n\n return (\n <Tag\n key={row.slug}\n type={isInteractive ? 'button' : undefined}\n role=\"listitem\"\n data-slot=\"iran-province-heat-row\"\n data-province={row.slug}\n data-iso={row.iso}\n data-rank={index + 1}\n onClick={\n isInteractive ? () => onProvinceClick({ slug: row.slug, iso: row.iso, value: row.value }) : undefined\n }\n className={cn(\n 'group relative flex items-center gap-2 rounded-md ps-2 pe-2 text-start transition-colors',\n density === 'compact' ? 'h-7 text-xs' : 'h-9 text-sm',\n isInteractive &&\n 'hover:bg-overlay-hover focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-brand',\n !isInteractive && 'cursor-default'\n )}\n aria-label={`${row.label}: ${formatValue(row.value)}`}\n >\n {/* Heat bar — sits behind text, fills logical-start to right */}\n <div\n data-slot=\"iran-province-heat-bar\"\n aria-hidden=\"true\"\n className=\"absolute inset-y-0 inset-inline-start-0 rounded-md transition-[width] duration-300\"\n style={{\n width: widthPct,\n backgroundColor: `hsl(var(${cssVar}) / ${bgAlpha.toFixed(3)})`,\n }}\n />\n\n {/* Foreground content */}\n {showRank && (\n <span\n data-slot=\"iran-province-heat-rank\"\n className=\"relative z-[1] inline-flex h-5 min-w-5 items-center justify-center rounded bg-background-default px-1 text-[10px] font-medium tabular-nums text-foreground-light\"\n >\n {convertToLocalNumbers(index + 1, locale)}\n </span>\n )}\n\n <span\n data-slot=\"iran-province-heat-label\"\n className=\"relative z-[1] flex-1 truncate font-medium text-foreground\"\n >\n {row.label}\n </span>\n\n {showValue && (\n <span data-slot=\"iran-province-heat-value\" className=\"relative z-[1] tabular-nums text-foreground-light\">\n {formatValue(row.value)}\n </span>\n )}\n </Tag>\n )\n })}\n\n {hiddenCount > 0 && (\n <div\n data-slot=\"iran-province-heat-overflow\"\n className={cn(\n 'flex items-center justify-center rounded-md text-foreground-muted',\n density === 'compact' ? 'h-7 text-[11px]' : 'h-9 text-xs'\n )}\n >\n {strings.more(convertToLocalNumbers(hiddenCount, locale))}\n </div>\n )}\n </div>\n )\n})\n\nIranProvinceHeat.displayName = 'IranProvinceHeat'\n\nexport { IranProvinceHeat }\n"]}
@@ -0,0 +1,52 @@
1
+ 'use client';
2
+ 'use strict';
3
+
4
+ var LabelPrimitive = require('@radix-ui/react-label');
5
+ var clsx = require('clsx');
6
+ var tailwindMerge = require('tailwind-merge');
7
+ var jsxRuntime = require('react/jsx-runtime');
8
+
9
+ function _interopNamespace(e) {
10
+ if (e && e.__esModule) return e;
11
+ var n = Object.create(null);
12
+ if (e) {
13
+ Object.keys(e).forEach(function (k) {
14
+ if (k !== 'default') {
15
+ var d = Object.getOwnPropertyDescriptor(e, k);
16
+ Object.defineProperty(n, k, d.get ? d : {
17
+ enumerable: true,
18
+ get: function () { return e[k]; }
19
+ });
20
+ }
21
+ });
22
+ }
23
+ n.default = e;
24
+ return Object.freeze(n);
25
+ }
26
+
27
+ var LabelPrimitive__namespace = /*#__PURE__*/_interopNamespace(LabelPrimitive);
28
+
29
+ function cn(...inputs) {
30
+ return tailwindMerge.twMerge(clsx.clsx(inputs));
31
+ }
32
+ function Label({
33
+ className,
34
+ ...props
35
+ }) {
36
+ return /* @__PURE__ */ jsxRuntime.jsx(
37
+ LabelPrimitive__namespace.Root,
38
+ {
39
+ "data-slot": "label",
40
+ className: cn(
41
+ "flex items-center gap-2 text-sm leading-none font-medium select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50",
42
+ className
43
+ ),
44
+ ...props
45
+ }
46
+ );
47
+ }
48
+ Label.displayName = "Label";
49
+
50
+ exports.Label = Label;
51
+ //# sourceMappingURL=label.cjs.map
52
+ //# sourceMappingURL=label.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/lib/utils.ts","../../../src/components/ui/label.tsx"],"names":["twMerge","clsx","jsx","LabelPrimitive"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAIO,SAAS,MAAM,MAAA,EAAsB;AAC1C,EAAA,OAAOA,qBAAA,CAAQC,SAAA,CAAK,MAAM,CAAC,CAAA;AAC7B;ACCA,SAAS,KAAA,CAAM;AAAA,EACb,SAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAqD;AACnD,EAAA,uBACEC,cAAA;AAAA,IAAgBC,yBAAA,CAAA,IAAA;AAAA,IAAf;AAAA,MACC,WAAA,EAAU,OAAA;AAAA,MACV,SAAA,EAAW,EAAA;AAAA,QACT,qNAAA;AAAA,QACA;AAAA,OACF;AAAA,MACC,GAAG;AAAA;AAAA,GACN;AAEJ;AAEA,KAAA,CAAM,WAAA,GAAc,OAAA","file":"label.cjs","sourcesContent":["import { type ClassValue, clsx } from 'clsx'\nimport { twMerge } from 'tailwind-merge'\nimport { formatJalaliDate } from '@/lib/jalali-utils'\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n\nexport type SupportedLocale = 'fa' | 'ar' | 'en'\n\n/**\n * Convert digits in a string to Persian/Arabic numerals based on locale.\n * @example convertToLocalNumbers('123', 'fa') => '۱۲۳'\n * @example convertToLocalNumbers('123', 'en') => '123'\n */\nexport function convertToLocalNumbers(text: string | number, locale: SupportedLocale): string {\n if (locale === 'fa' || locale === 'ar') {\n const persianDigits = ['۰', '۱', '۲', '۳', '۴', '۵', '۶', '۷', '۸', '۹']\n return String(text).replace(/\\d/g, (digit) => persianDigits[parseInt(digit)])\n }\n return String(text)\n}\n\n/**\n * Format large numbers with locale-aware suffixes (K/M/B).\n * @example formatLargeNumber(1500, 'fa') => '۱.۵ هزار'\n * @example formatLargeNumber(1500, 'en') => '1.5K'\n */\nexport function formatLargeNumber(num: number, locale: SupportedLocale): string {\n if (num >= 1_000_000_000) {\n const formatted = (num / 1_000_000_000).toFixed(1).replace(/\\.0$/, '')\n return convertToLocalNumbers(formatted, locale) + (locale === 'en' ? 'B' : ' میلیارد')\n }\n if (num >= 1_000_000) {\n const formatted = (num / 1_000_000).toFixed(1).replace(/\\.0$/, '')\n return convertToLocalNumbers(formatted, locale) + (locale === 'en' ? 'M' : ' میلیون')\n }\n if (num >= 1_000) {\n const formatted = (num / 1_000).toFixed(1).replace(/\\.0$/, '')\n return convertToLocalNumbers(formatted, locale) + (locale === 'en' ? 'K' : ' هزار')\n }\n return convertToLocalNumbers(num.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, ','), locale)\n}\n\n/**\n * Format number to Instagram-style short format (English only).\n * @example formatNumber(123456, 'short') => '123K'\n * @example formatNumber(123456, 'exact') => '123,456'\n */\nexport function formatNumber(num: number | undefined, format: 'exact' | 'short' = 'exact'): string {\n if (num === undefined || num === null) return '0'\n\n if (format === 'exact') {\n return num.toLocaleString('en-US')\n }\n\n // Short format (Instagram style)\n if (num >= 1_000_000_000) {\n return `${(num / 1_000_000_000).toFixed(1).replace(/\\.0$/, '')}B`\n }\n if (num >= 1_000_000) {\n return `${(num / 1_000_000).toFixed(1).replace(/\\.0$/, '')}M`\n }\n if (num >= 1_000) {\n return `${(num / 1_000).toFixed(1).replace(/\\.0$/, '')}K`\n }\n return num.toString()\n}\n\n/**\n * Format date to relative time with absolute on hover (Persian)\n * @example formatRelativeTime(new Date()) => '۲ ساعت پیش'\n */\nexport function formatRelativeTime(date: Date | string | number): string {\n const now = new Date()\n const then = new Date(date)\n const diffInSeconds = Math.floor((now.getTime() - then.getTime()) / 1000)\n\n if (diffInSeconds < 60) {\n return 'همین الان'\n }\n\n const diffInMinutes = Math.floor(diffInSeconds / 60)\n if (diffInMinutes < 60) {\n return `${convertToLocalNumbers(diffInMinutes, 'fa')} دقیقه پیش`\n }\n\n const diffInHours = Math.floor(diffInMinutes / 60)\n if (diffInHours < 24) {\n return `${convertToLocalNumbers(diffInHours, 'fa')} ساعت پیش`\n }\n\n const diffInDays = Math.floor(diffInHours / 24)\n if (diffInDays < 7) {\n return `${convertToLocalNumbers(diffInDays, 'fa')} روز پیش`\n }\n\n const diffInWeeks = Math.floor(diffInDays / 7)\n if (diffInWeeks < 4) {\n return `${convertToLocalNumbers(diffInWeeks, 'fa')} هفته پیش`\n }\n\n const diffInMonths = Math.floor(diffInDays / 30)\n if (diffInMonths < 12) {\n return `${convertToLocalNumbers(diffInMonths, 'fa')} ماه پیش`\n }\n\n const diffInYears = Math.floor(diffInDays / 365)\n return `${convertToLocalNumbers(diffInYears, 'fa')} سال پیش`\n}\n\n/**\n * Format date to absolute format (Persian / Jalali)\n * Uses date-fns-jalali for accurate Jalali conversion.\n * @example formatAbsoluteTime(new Date()) => '۱۵ دی ۱۴۰۳، ۱۵:۳۰'\n */\nexport function formatAbsoluteTime(date: Date | string | number): string {\n const d = new Date(date)\n return formatJalaliDate(d, 'd MMMM yyyy، HH:mm')\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as LabelPrimitive from \"@radix-ui/react-label\"\n\nimport { cn } from \"@/lib/utils\"\n\nfunction Label({\n className,\n ...props\n}: React.ComponentProps<typeof LabelPrimitive.Root>) {\n return (\n <LabelPrimitive.Root\n data-slot=\"label\"\n className={cn(\n \"flex items-center gap-2 text-sm leading-none font-medium select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50\",\n className\n )}\n {...props}\n />\n )\n}\n\nLabel.displayName = \"Label\"\n\nexport { Label }\n\n"]}
@@ -0,0 +1,10 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import * as React from 'react';
3
+ import * as LabelPrimitive from '@radix-ui/react-label';
4
+
5
+ declare function Label({ className, ...props }: React.ComponentProps<typeof LabelPrimitive.Root>): react_jsx_runtime.JSX.Element;
6
+ declare namespace Label {
7
+ var displayName: string;
8
+ }
9
+
10
+ export { Label };
@@ -0,0 +1,10 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+ import * as React from 'react';
3
+ import * as LabelPrimitive from '@radix-ui/react-label';
4
+
5
+ declare function Label({ className, ...props }: React.ComponentProps<typeof LabelPrimitive.Root>): react_jsx_runtime.JSX.Element;
6
+ declare namespace Label {
7
+ var displayName: string;
8
+ }
9
+
10
+ export { Label };
@@ -0,0 +1,30 @@
1
+ 'use client';
2
+ import * as LabelPrimitive from '@radix-ui/react-label';
3
+ import { clsx } from 'clsx';
4
+ import { twMerge } from 'tailwind-merge';
5
+ import { jsx } from 'react/jsx-runtime';
6
+
7
+ function cn(...inputs) {
8
+ return twMerge(clsx(inputs));
9
+ }
10
+ function Label({
11
+ className,
12
+ ...props
13
+ }) {
14
+ return /* @__PURE__ */ jsx(
15
+ LabelPrimitive.Root,
16
+ {
17
+ "data-slot": "label",
18
+ className: cn(
19
+ "flex items-center gap-2 text-sm leading-none font-medium select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50",
20
+ className
21
+ ),
22
+ ...props
23
+ }
24
+ );
25
+ }
26
+ Label.displayName = "Label";
27
+
28
+ export { Label };
29
+ //# sourceMappingURL=label.js.map
30
+ //# sourceMappingURL=label.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/lib/utils.ts","../../../src/components/ui/label.tsx"],"names":[],"mappings":";;;;;AAIO,SAAS,MAAM,MAAA,EAAsB;AAC1C,EAAA,OAAO,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAC,CAAA;AAC7B;ACCA,SAAS,KAAA,CAAM;AAAA,EACb,SAAA;AAAA,EACA,GAAG;AACL,CAAA,EAAqD;AACnD,EAAA,uBACE,GAAA;AAAA,IAAgB,cAAA,CAAA,IAAA;AAAA,IAAf;AAAA,MACC,WAAA,EAAU,OAAA;AAAA,MACV,SAAA,EAAW,EAAA;AAAA,QACT,qNAAA;AAAA,QACA;AAAA,OACF;AAAA,MACC,GAAG;AAAA;AAAA,GACN;AAEJ;AAEA,KAAA,CAAM,WAAA,GAAc,OAAA","file":"label.js","sourcesContent":["import { type ClassValue, clsx } from 'clsx'\nimport { twMerge } from 'tailwind-merge'\nimport { formatJalaliDate } from '@/lib/jalali-utils'\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n\nexport type SupportedLocale = 'fa' | 'ar' | 'en'\n\n/**\n * Convert digits in a string to Persian/Arabic numerals based on locale.\n * @example convertToLocalNumbers('123', 'fa') => '۱۲۳'\n * @example convertToLocalNumbers('123', 'en') => '123'\n */\nexport function convertToLocalNumbers(text: string | number, locale: SupportedLocale): string {\n if (locale === 'fa' || locale === 'ar') {\n const persianDigits = ['۰', '۱', '۲', '۳', '۴', '۵', '۶', '۷', '۸', '۹']\n return String(text).replace(/\\d/g, (digit) => persianDigits[parseInt(digit)])\n }\n return String(text)\n}\n\n/**\n * Format large numbers with locale-aware suffixes (K/M/B).\n * @example formatLargeNumber(1500, 'fa') => '۱.۵ هزار'\n * @example formatLargeNumber(1500, 'en') => '1.5K'\n */\nexport function formatLargeNumber(num: number, locale: SupportedLocale): string {\n if (num >= 1_000_000_000) {\n const formatted = (num / 1_000_000_000).toFixed(1).replace(/\\.0$/, '')\n return convertToLocalNumbers(formatted, locale) + (locale === 'en' ? 'B' : ' میلیارد')\n }\n if (num >= 1_000_000) {\n const formatted = (num / 1_000_000).toFixed(1).replace(/\\.0$/, '')\n return convertToLocalNumbers(formatted, locale) + (locale === 'en' ? 'M' : ' میلیون')\n }\n if (num >= 1_000) {\n const formatted = (num / 1_000).toFixed(1).replace(/\\.0$/, '')\n return convertToLocalNumbers(formatted, locale) + (locale === 'en' ? 'K' : ' هزار')\n }\n return convertToLocalNumbers(num.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, ','), locale)\n}\n\n/**\n * Format number to Instagram-style short format (English only).\n * @example formatNumber(123456, 'short') => '123K'\n * @example formatNumber(123456, 'exact') => '123,456'\n */\nexport function formatNumber(num: number | undefined, format: 'exact' | 'short' = 'exact'): string {\n if (num === undefined || num === null) return '0'\n\n if (format === 'exact') {\n return num.toLocaleString('en-US')\n }\n\n // Short format (Instagram style)\n if (num >= 1_000_000_000) {\n return `${(num / 1_000_000_000).toFixed(1).replace(/\\.0$/, '')}B`\n }\n if (num >= 1_000_000) {\n return `${(num / 1_000_000).toFixed(1).replace(/\\.0$/, '')}M`\n }\n if (num >= 1_000) {\n return `${(num / 1_000).toFixed(1).replace(/\\.0$/, '')}K`\n }\n return num.toString()\n}\n\n/**\n * Format date to relative time with absolute on hover (Persian)\n * @example formatRelativeTime(new Date()) => '۲ ساعت پیش'\n */\nexport function formatRelativeTime(date: Date | string | number): string {\n const now = new Date()\n const then = new Date(date)\n const diffInSeconds = Math.floor((now.getTime() - then.getTime()) / 1000)\n\n if (diffInSeconds < 60) {\n return 'همین الان'\n }\n\n const diffInMinutes = Math.floor(diffInSeconds / 60)\n if (diffInMinutes < 60) {\n return `${convertToLocalNumbers(diffInMinutes, 'fa')} دقیقه پیش`\n }\n\n const diffInHours = Math.floor(diffInMinutes / 60)\n if (diffInHours < 24) {\n return `${convertToLocalNumbers(diffInHours, 'fa')} ساعت پیش`\n }\n\n const diffInDays = Math.floor(diffInHours / 24)\n if (diffInDays < 7) {\n return `${convertToLocalNumbers(diffInDays, 'fa')} روز پیش`\n }\n\n const diffInWeeks = Math.floor(diffInDays / 7)\n if (diffInWeeks < 4) {\n return `${convertToLocalNumbers(diffInWeeks, 'fa')} هفته پیش`\n }\n\n const diffInMonths = Math.floor(diffInDays / 30)\n if (diffInMonths < 12) {\n return `${convertToLocalNumbers(diffInMonths, 'fa')} ماه پیش`\n }\n\n const diffInYears = Math.floor(diffInDays / 365)\n return `${convertToLocalNumbers(diffInYears, 'fa')} سال پیش`\n}\n\n/**\n * Format date to absolute format (Persian / Jalali)\n * Uses date-fns-jalali for accurate Jalali conversion.\n * @example formatAbsoluteTime(new Date()) => '۱۵ دی ۱۴۰۳، ۱۵:۳۰'\n */\nexport function formatAbsoluteTime(date: Date | string | number): string {\n const d = new Date(date)\n return formatJalaliDate(d, 'd MMMM yyyy، HH:mm')\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as LabelPrimitive from \"@radix-ui/react-label\"\n\nimport { cn } from \"@/lib/utils\"\n\nfunction Label({\n className,\n ...props\n}: React.ComponentProps<typeof LabelPrimitive.Root>) {\n return (\n <LabelPrimitive.Root\n data-slot=\"label\"\n className={cn(\n \"flex items-center gap-2 text-sm leading-none font-medium select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50\",\n className\n )}\n {...props}\n />\n )\n}\n\nLabel.displayName = \"Label\"\n\nexport { Label }\n\n"]}