@parto-system-design/ui 1.1.11 → 1.1.17

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 (409) 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.js +96 -2
  60. package/dist/components/ui/badge.js.map +1 -1
  61. package/dist/components/ui/breadcrumb.cjs +100 -0
  62. package/dist/components/ui/breadcrumb.cjs.map +1 -0
  63. package/dist/components/ui/breadcrumb.d.cts +35 -0
  64. package/dist/components/ui/breadcrumb.d.ts +35 -0
  65. package/dist/components/ui/breadcrumb.js +92 -0
  66. package/dist/components/ui/breadcrumb.js.map +1 -0
  67. package/dist/components/ui/button.cjs +304 -11
  68. package/dist/components/ui/button.cjs.map +1 -1
  69. package/dist/components/ui/button.d.cts +1 -1
  70. package/dist/components/ui/button.d.ts +1 -1
  71. package/dist/components/ui/button.js +306 -3
  72. package/dist/components/ui/button.js.map +1 -1
  73. package/dist/components/ui/calendar.cjs +401 -8
  74. package/dist/components/ui/calendar.cjs.map +1 -1
  75. package/dist/components/ui/calendar.js +404 -4
  76. package/dist/components/ui/calendar.js.map +1 -1
  77. package/dist/components/ui/card.cjs +154 -30
  78. package/dist/components/ui/card.cjs.map +1 -1
  79. package/dist/components/ui/card.js +131 -2
  80. package/dist/components/ui/card.js.map +1 -1
  81. package/dist/{chunk-CAJKSTXX.cjs → components/ui/checkbox.cjs} +10 -5
  82. package/dist/components/ui/checkbox.cjs.map +1 -0
  83. package/dist/components/ui/checkbox.d.cts +6 -0
  84. package/dist/components/ui/checkbox.d.ts +6 -0
  85. package/dist/{chunk-5JJSRGJD.js → components/ui/checkbox.js} +9 -4
  86. package/dist/components/ui/checkbox.js.map +1 -0
  87. package/dist/components/ui/concept-card.cjs +728 -11
  88. package/dist/components/ui/concept-card.cjs.map +1 -1
  89. package/dist/components/ui/concept-card.d.cts +2 -2
  90. package/dist/components/ui/concept-card.d.ts +2 -2
  91. package/dist/components/ui/concept-card.js +710 -7
  92. package/dist/components/ui/concept-card.js.map +1 -1
  93. package/dist/components/ui/data-table.cjs +1553 -10
  94. package/dist/components/ui/data-table.cjs.map +1 -1
  95. package/dist/components/ui/data-table.js +1537 -7
  96. package/dist/components/ui/data-table.js.map +1 -1
  97. package/dist/components/ui/dialog.cjs +119 -42
  98. package/dist/components/ui/dialog.cjs.map +1 -1
  99. package/dist/components/ui/dialog.js +92 -2
  100. package/dist/components/ui/dialog.js.map +1 -1
  101. package/dist/components/ui/dropdown-menu.cjs +268 -0
  102. package/dist/components/ui/dropdown-menu.cjs.map +1 -0
  103. package/dist/components/ui/dropdown-menu.d.cts +73 -0
  104. package/dist/components/ui/dropdown-menu.d.ts +73 -0
  105. package/dist/components/ui/dropdown-menu.js +232 -0
  106. package/dist/components/ui/dropdown-menu.js.map +1 -0
  107. package/dist/components/ui/filter-provider.cjs +70 -13
  108. package/dist/components/ui/filter-provider.cjs.map +1 -1
  109. package/dist/components/ui/filter-provider.js +51 -1
  110. package/dist/components/ui/filter-provider.js.map +1 -1
  111. package/dist/components/ui/form.cjs +169 -0
  112. package/dist/components/ui/form.cjs.map +1 -0
  113. package/dist/components/ui/form.d.cts +46 -0
  114. package/dist/components/ui/form.d.ts +46 -0
  115. package/dist/components/ui/form.js +139 -0
  116. package/dist/components/ui/form.js.map +1 -0
  117. package/dist/components/ui/input.cjs +135 -15
  118. package/dist/components/ui/input.cjs.map +1 -1
  119. package/dist/components/ui/input.d.cts +15 -0
  120. package/dist/components/ui/input.d.ts +15 -0
  121. package/dist/components/ui/input.js +116 -3
  122. package/dist/components/ui/input.js.map +1 -1
  123. package/dist/components/ui/iran-province-heat.cjs +328 -5
  124. package/dist/components/ui/iran-province-heat.cjs.map +1 -1
  125. package/dist/components/ui/iran-province-heat.js +312 -2
  126. package/dist/components/ui/iran-province-heat.js.map +1 -1
  127. package/dist/components/ui/label.cjs +52 -0
  128. package/dist/components/ui/label.cjs.map +1 -0
  129. package/dist/components/ui/label.d.cts +10 -0
  130. package/dist/components/ui/label.d.ts +10 -0
  131. package/dist/components/ui/label.js +30 -0
  132. package/dist/components/ui/label.js.map +1 -0
  133. package/dist/components/ui/page-card.cjs +627 -8
  134. package/dist/components/ui/page-card.cjs.map +1 -1
  135. package/dist/components/ui/page-card.d.cts +3 -2
  136. package/dist/components/ui/page-card.d.ts +3 -2
  137. package/dist/components/ui/page-card.js +611 -5
  138. package/dist/components/ui/page-card.js.map +1 -1
  139. package/dist/components/ui/page-header.cjs +299 -0
  140. package/dist/components/ui/page-header.cjs.map +1 -0
  141. package/dist/components/ui/page-header.d.cts +21 -0
  142. package/dist/components/ui/page-header.d.ts +21 -0
  143. package/dist/components/ui/page-header.js +277 -0
  144. package/dist/components/ui/page-header.js.map +1 -0
  145. package/dist/components/ui/password-input.cjs +168 -0
  146. package/dist/components/ui/password-input.cjs.map +1 -0
  147. package/dist/components/ui/password-input.d.cts +48 -0
  148. package/dist/components/ui/password-input.d.ts +48 -0
  149. package/dist/components/ui/password-input.js +146 -0
  150. package/dist/components/ui/password-input.js.map +1 -0
  151. package/dist/components/ui/popover.cjs +51 -18
  152. package/dist/components/ui/popover.cjs.map +1 -1
  153. package/dist/components/ui/popover.js +30 -2
  154. package/dist/components/ui/popover.js.map +1 -1
  155. package/dist/components/ui/progress.cjs +95 -0
  156. package/dist/components/ui/progress.cjs.map +1 -0
  157. package/dist/components/ui/progress.d.cts +18 -0
  158. package/dist/components/ui/progress.d.ts +18 -0
  159. package/dist/components/ui/progress.js +72 -0
  160. package/dist/components/ui/progress.js.map +1 -0
  161. package/dist/components/ui/radio-card.cjs +84 -0
  162. package/dist/components/ui/radio-card.cjs.map +1 -0
  163. package/dist/components/ui/radio-card.d.cts +12 -0
  164. package/dist/components/ui/radio-card.d.ts +12 -0
  165. package/dist/components/ui/radio-card.js +58 -0
  166. package/dist/components/ui/radio-card.js.map +1 -0
  167. package/dist/components/ui/radio-group.cjs +62 -0
  168. package/dist/components/ui/radio-group.cjs.map +1 -0
  169. package/dist/components/ui/radio-group.d.cts +7 -0
  170. package/dist/components/ui/radio-group.d.ts +7 -0
  171. package/dist/components/ui/radio-group.js +38 -0
  172. package/dist/components/ui/radio-group.js.map +1 -0
  173. package/dist/components/ui/saved-query-card.cjs +409 -7
  174. package/dist/components/ui/saved-query-card.cjs.map +1 -1
  175. package/dist/components/ui/saved-query-card.js +394 -4
  176. package/dist/components/ui/saved-query-card.js.map +1 -1
  177. package/dist/components/ui/scroll-area.cjs +79 -0
  178. package/dist/components/ui/scroll-area.cjs.map +1 -0
  179. package/dist/components/ui/scroll-area.d.cts +14 -0
  180. package/dist/components/ui/scroll-area.d.ts +14 -0
  181. package/dist/components/ui/scroll-area.js +56 -0
  182. package/dist/components/ui/scroll-area.js.map +1 -0
  183. package/dist/components/ui/select.cjs +242 -0
  184. package/dist/components/ui/select.cjs.map +1 -0
  185. package/dist/components/ui/select.d.cts +29 -0
  186. package/dist/components/ui/select.d.ts +29 -0
  187. package/dist/components/ui/select.js +210 -0
  188. package/dist/components/ui/select.js.map +1 -0
  189. package/dist/components/ui/separator.cjs +105 -6
  190. package/dist/components/ui/separator.cjs.map +1 -1
  191. package/dist/components/ui/separator.js +87 -2
  192. package/dist/components/ui/separator.js.map +1 -1
  193. package/dist/components/ui/sheet.cjs +134 -38
  194. package/dist/components/ui/sheet.cjs.map +1 -1
  195. package/dist/components/ui/sheet.js +109 -2
  196. package/dist/components/ui/sheet.js.map +1 -1
  197. package/dist/{chunk-D2EBLE2B.cjs → components/ui/skeleton.cjs} +21 -16
  198. package/dist/components/ui/skeleton.cjs.map +1 -0
  199. package/dist/components/ui/skeleton.d.cts +90 -0
  200. package/dist/components/ui/skeleton.d.ts +90 -0
  201. package/dist/{chunk-SB5DSYR5.js → components/ui/skeleton.js} +8 -3
  202. package/dist/components/ui/skeleton.js.map +1 -0
  203. package/dist/components/ui/slider.cjs +129 -0
  204. package/dist/components/ui/slider.cjs.map +1 -0
  205. package/dist/components/ui/slider.d.cts +10 -0
  206. package/dist/components/ui/slider.d.ts +10 -0
  207. package/dist/components/ui/slider.js +107 -0
  208. package/dist/components/ui/slider.js.map +1 -0
  209. package/dist/components/ui/social-platform-badge.cjs +120 -0
  210. package/dist/components/ui/social-platform-badge.cjs.map +1 -0
  211. package/dist/components/ui/social-platform-badge.d.cts +21 -0
  212. package/dist/components/ui/social-platform-badge.d.ts +21 -0
  213. package/dist/components/ui/social-platform-badge.js +97 -0
  214. package/dist/components/ui/social-platform-badge.js.map +1 -0
  215. package/dist/components/ui/sonner.cjs +51 -0
  216. package/dist/components/ui/sonner.cjs.map +1 -0
  217. package/dist/components/ui/sonner.d.cts +13 -0
  218. package/dist/components/ui/sonner.d.ts +13 -0
  219. package/dist/components/ui/sonner.js +45 -0
  220. package/dist/components/ui/sonner.js.map +1 -0
  221. package/dist/components/ui/sparkline.cjs +159 -6
  222. package/dist/components/ui/sparkline.cjs.map +1 -1
  223. package/dist/components/ui/sparkline.js +142 -2
  224. package/dist/components/ui/sparkline.js.map +1 -1
  225. package/dist/components/ui/switch.cjs +96 -0
  226. package/dist/components/ui/switch.cjs.map +1 -0
  227. package/dist/components/ui/switch.d.cts +13 -0
  228. package/dist/components/ui/switch.d.ts +13 -0
  229. package/dist/components/ui/switch.js +73 -0
  230. package/dist/components/ui/switch.js.map +1 -0
  231. package/dist/components/ui/table.cjs +188 -0
  232. package/dist/components/ui/table.cjs.map +1 -0
  233. package/dist/components/ui/table.d.cts +59 -0
  234. package/dist/components/ui/table.d.ts +59 -0
  235. package/dist/components/ui/table.js +178 -0
  236. package/dist/components/ui/table.js.map +1 -0
  237. package/dist/components/ui/tabs.cjs +140 -0
  238. package/dist/components/ui/tabs.cjs.map +1 -0
  239. package/dist/components/ui/tabs.d.cts +21 -0
  240. package/dist/components/ui/tabs.d.ts +21 -0
  241. package/dist/components/ui/tabs.js +115 -0
  242. package/dist/components/ui/tabs.js.map +1 -0
  243. package/dist/components/ui/textarea.cjs +56 -0
  244. package/dist/components/ui/textarea.cjs.map +1 -0
  245. package/dist/components/ui/textarea.d.cts +5 -0
  246. package/dist/components/ui/textarea.d.ts +5 -0
  247. package/dist/components/ui/textarea.js +34 -0
  248. package/dist/components/ui/textarea.js.map +1 -0
  249. package/dist/components/ui/toggle-group.cjs +123 -0
  250. package/dist/components/ui/toggle-group.cjs.map +1 -0
  251. package/dist/components/ui/toggle-group.d.cts +7 -0
  252. package/dist/components/ui/toggle-group.d.ts +7 -0
  253. package/dist/components/ui/toggle-group.js +99 -0
  254. package/dist/components/ui/toggle-group.js.map +1 -0
  255. package/dist/components/ui/tooltip.cjs +77 -18
  256. package/dist/components/ui/tooltip.cjs.map +1 -1
  257. package/dist/components/ui/tooltip.js +56 -2
  258. package/dist/components/ui/tooltip.js.map +1 -1
  259. package/dist/{concept-card-RwPbqJ06.d.cts → concept-card-BXra9mr0.d.cts} +2 -2
  260. package/dist/{concept-card-CcOBb2Nz.d.ts → concept-card-BoJ5gIJD.d.ts} +2 -2
  261. package/dist/hooks/use-hotkey-registry.cjs +201 -14
  262. package/dist/hooks/use-hotkey-registry.cjs.map +1 -1
  263. package/dist/hooks/use-hotkey-registry.js +182 -2
  264. package/dist/hooks/use-hotkey-registry.js.map +1 -1
  265. package/dist/hooks/use-hotkeys.cjs +144 -9
  266. package/dist/hooks/use-hotkeys.cjs.map +1 -1
  267. package/dist/hooks/use-hotkeys.js +126 -1
  268. package/dist/hooks/use-hotkeys.js.map +1 -1
  269. package/dist/{i18n-CAd9wGOr.d.cts → i18n-BfRhV5aw.d.cts} +5 -3
  270. package/dist/{i18n-ArS3mqj0.d.ts → i18n-ewyqbKM-.d.ts} +5 -3
  271. package/dist/index.cjs +21003 -15720
  272. package/dist/index.cjs.map +1 -1
  273. package/dist/index.css +412 -71
  274. package/dist/index.d.cts +82 -490
  275. package/dist/index.d.ts +82 -490
  276. package/dist/index.js +6727 -976
  277. package/dist/index.js.map +1 -1
  278. package/dist/{page-card-CmShVqG-.d.cts → page-card-C9XXXOVr.d.cts} +3 -20
  279. package/dist/{page-card-HBn-cy4J.d.ts → page-card-DAnbez_f.d.ts} +3 -20
  280. package/dist/toggle-group-B8r4LOQw.d.cts +26 -0
  281. package/dist/toggle-group-B8r4LOQw.d.ts +26 -0
  282. package/package.json +132 -2
  283. package/tailwind.config.ts +45 -0
  284. package/dist/chunk-2ACKKPWA.cjs +0 -112
  285. package/dist/chunk-2ACKKPWA.cjs.map +0 -1
  286. package/dist/chunk-2UD3LGVX.cjs +0 -316
  287. package/dist/chunk-2UD3LGVX.cjs.map +0 -1
  288. package/dist/chunk-3QYYPPFJ.js.map +0 -1
  289. package/dist/chunk-4SVQNEVH.js +0 -173
  290. package/dist/chunk-4SVQNEVH.js.map +0 -1
  291. package/dist/chunk-4WONHORR.cjs +0 -152
  292. package/dist/chunk-4WONHORR.cjs.map +0 -1
  293. package/dist/chunk-5HCXH6GS.js +0 -409
  294. package/dist/chunk-5HCXH6GS.js.map +0 -1
  295. package/dist/chunk-5JJSRGJD.js.map +0 -1
  296. package/dist/chunk-5K6E4ZSW.cjs +0 -77
  297. package/dist/chunk-5K6E4ZSW.cjs.map +0 -1
  298. package/dist/chunk-5NY26ULO.js +0 -89
  299. package/dist/chunk-5NY26ULO.js.map +0 -1
  300. package/dist/chunk-7RVPG3LE.cjs +0 -231
  301. package/dist/chunk-7RVPG3LE.cjs.map +0 -1
  302. package/dist/chunk-AYEK3WOM.js +0 -207
  303. package/dist/chunk-AYEK3WOM.js.map +0 -1
  304. package/dist/chunk-BRMBLIQG.js +0 -53
  305. package/dist/chunk-BRMBLIQG.js.map +0 -1
  306. package/dist/chunk-CAJKSTXX.cjs.map +0 -1
  307. package/dist/chunk-CKFWMHQU.js +0 -401
  308. package/dist/chunk-CKFWMHQU.js.map +0 -1
  309. package/dist/chunk-CV3N3HVK.js +0 -672
  310. package/dist/chunk-CV3N3HVK.js.map +0 -1
  311. package/dist/chunk-D2EBLE2B.cjs.map +0 -1
  312. package/dist/chunk-GCZ6YATL.js +0 -940
  313. package/dist/chunk-GCZ6YATL.js.map +0 -1
  314. package/dist/chunk-GKRAZGDI.cjs +0 -84
  315. package/dist/chunk-GKRAZGDI.cjs.map +0 -1
  316. package/dist/chunk-GPYJ66CG.js +0 -45
  317. package/dist/chunk-GPYJ66CG.js.map +0 -1
  318. package/dist/chunk-HF6XU5NI.js +0 -84
  319. package/dist/chunk-HF6XU5NI.js.map +0 -1
  320. package/dist/chunk-HJPDZOMJ.cjs +0 -87
  321. package/dist/chunk-HJPDZOMJ.cjs.map +0 -1
  322. package/dist/chunk-HS3XI3CC.cjs +0 -69
  323. package/dist/chunk-HS3XI3CC.cjs.map +0 -1
  324. package/dist/chunk-HUCC3QH5.cjs +0 -53
  325. package/dist/chunk-HUCC3QH5.cjs.map +0 -1
  326. package/dist/chunk-HYZ6BQPS.cjs +0 -425
  327. package/dist/chunk-HYZ6BQPS.cjs.map +0 -1
  328. package/dist/chunk-ISCSZMYW.cjs +0 -106
  329. package/dist/chunk-ISCSZMYW.cjs.map +0 -1
  330. package/dist/chunk-IXFEFIDO.js +0 -82
  331. package/dist/chunk-IXFEFIDO.js.map +0 -1
  332. package/dist/chunk-JCJLN437.js +0 -108
  333. package/dist/chunk-JCJLN437.js.map +0 -1
  334. package/dist/chunk-JMKNNH63.cjs +0 -982
  335. package/dist/chunk-JMKNNH63.cjs.map +0 -1
  336. package/dist/chunk-JUBHQAA2.js +0 -53
  337. package/dist/chunk-JUBHQAA2.js.map +0 -1
  338. package/dist/chunk-K6G63EED.cjs +0 -41
  339. package/dist/chunk-K6G63EED.cjs.map +0 -1
  340. package/dist/chunk-KCWRCSI7.js +0 -62
  341. package/dist/chunk-KCWRCSI7.js.map +0 -1
  342. package/dist/chunk-KYM7NIJO.cjs +0 -433
  343. package/dist/chunk-KYM7NIJO.cjs.map +0 -1
  344. package/dist/chunk-L2L5CKC2.js +0 -291
  345. package/dist/chunk-L2L5CKC2.js.map +0 -1
  346. package/dist/chunk-M5CHZ5BA.js +0 -124
  347. package/dist/chunk-M5CHZ5BA.js.map +0 -1
  348. package/dist/chunk-MEK4RSGC.js +0 -65
  349. package/dist/chunk-MEK4RSGC.js.map +0 -1
  350. package/dist/chunk-MEKWH3GS.js +0 -89
  351. package/dist/chunk-MEKWH3GS.js.map +0 -1
  352. package/dist/chunk-MFTX2DDQ.js +0 -27
  353. package/dist/chunk-MFTX2DDQ.js.map +0 -1
  354. package/dist/chunk-MMC6M35Q.cjs.map +0 -1
  355. package/dist/chunk-NMH43BDC.js +0 -130
  356. package/dist/chunk-NMH43BDC.js.map +0 -1
  357. package/dist/chunk-NORDUD2T.cjs +0 -135
  358. package/dist/chunk-NORDUD2T.cjs.map +0 -1
  359. package/dist/chunk-NV4JOKWL.cjs +0 -197
  360. package/dist/chunk-NV4JOKWL.cjs.map +0 -1
  361. package/dist/chunk-O2JG7WY5.cjs +0 -121
  362. package/dist/chunk-O2JG7WY5.cjs.map +0 -1
  363. package/dist/chunk-ONO2FTV4.cjs +0 -68
  364. package/dist/chunk-ONO2FTV4.cjs.map +0 -1
  365. package/dist/chunk-OQB6HIUL.cjs +0 -108
  366. package/dist/chunk-OQB6HIUL.cjs.map +0 -1
  367. package/dist/chunk-OS6CMYAS.cjs +0 -79
  368. package/dist/chunk-OS6CMYAS.cjs.map +0 -1
  369. package/dist/chunk-PYURPUTV.js +0 -402
  370. package/dist/chunk-PYURPUTV.js.map +0 -1
  371. package/dist/chunk-RJ3HYZ7S.js +0 -44
  372. package/dist/chunk-RJ3HYZ7S.js.map +0 -1
  373. package/dist/chunk-RZNRIOLT.js +0 -128
  374. package/dist/chunk-RZNRIOLT.js.map +0 -1
  375. package/dist/chunk-S3T2L6NA.js +0 -38
  376. package/dist/chunk-S3T2L6NA.js.map +0 -1
  377. package/dist/chunk-S5IPJQZ3.cjs +0 -161
  378. package/dist/chunk-S5IPJQZ3.cjs.map +0 -1
  379. package/dist/chunk-SB5DSYR5.js.map +0 -1
  380. package/dist/chunk-SFXV2DUH.js +0 -106
  381. package/dist/chunk-SFXV2DUH.js.map +0 -1
  382. package/dist/chunk-SXEPGD4Z.cjs +0 -152
  383. package/dist/chunk-SXEPGD4Z.cjs.map +0 -1
  384. package/dist/chunk-SXWSOU3Y.js +0 -89
  385. package/dist/chunk-SXWSOU3Y.js.map +0 -1
  386. package/dist/chunk-SZMVOHT7.cjs +0 -107
  387. package/dist/chunk-SZMVOHT7.cjs.map +0 -1
  388. package/dist/chunk-TWJXOV4C.js +0 -145
  389. package/dist/chunk-TWJXOV4C.js.map +0 -1
  390. package/dist/chunk-U3ADRIVO.cjs +0 -434
  391. package/dist/chunk-U3ADRIVO.cjs.map +0 -1
  392. package/dist/chunk-U5FLLCGC.cjs +0 -151
  393. package/dist/chunk-U5FLLCGC.cjs.map +0 -1
  394. package/dist/chunk-UOZN45G4.cjs +0 -130
  395. package/dist/chunk-UOZN45G4.cjs.map +0 -1
  396. package/dist/chunk-VHLDOG74.cjs +0 -167
  397. package/dist/chunk-VHLDOG74.cjs.map +0 -1
  398. package/dist/chunk-YC5KLN6I.js +0 -139
  399. package/dist/chunk-YC5KLN6I.js.map +0 -1
  400. package/dist/chunk-YENXXYUV.cjs +0 -111
  401. package/dist/chunk-YENXXYUV.cjs.map +0 -1
  402. package/dist/chunk-YFQWC2PW.js +0 -113
  403. package/dist/chunk-YFQWC2PW.js.map +0 -1
  404. package/dist/chunk-Z2TY4A75.cjs +0 -700
  405. package/dist/chunk-Z2TY4A75.cjs.map +0 -1
  406. package/dist/chunk-Z56O7UEU.cjs +0 -136
  407. package/dist/chunk-Z56O7UEU.cjs.map +0 -1
  408. package/dist/chunk-ZBZDR4ZC.js +0 -106
  409. package/dist/chunk-ZBZDR4ZC.js.map +0 -1
@@ -0,0 +1,67 @@
1
+ 'use client';
2
+ 'use strict';
3
+
4
+ var React = require('react');
5
+ var classVarianceAuthority = require('class-variance-authority');
6
+ var clsx = require('clsx');
7
+ var tailwindMerge = require('tailwind-merge');
8
+ var jsxRuntime = require('react/jsx-runtime');
9
+
10
+ function _interopNamespace(e) {
11
+ if (e && e.__esModule) return e;
12
+ var n = Object.create(null);
13
+ if (e) {
14
+ Object.keys(e).forEach(function (k) {
15
+ if (k !== 'default') {
16
+ var d = Object.getOwnPropertyDescriptor(e, k);
17
+ Object.defineProperty(n, k, d.get ? d : {
18
+ enumerable: true,
19
+ get: function () { return e[k]; }
20
+ });
21
+ }
22
+ });
23
+ }
24
+ n.default = e;
25
+ return Object.freeze(n);
26
+ }
27
+
28
+ var React__namespace = /*#__PURE__*/_interopNamespace(React);
29
+
30
+ function cn(...inputs) {
31
+ return tailwindMerge.twMerge(clsx.clsx(inputs));
32
+ }
33
+ var appBarVariants = classVarianceAuthority.cva("sticky top-0 z-sticky w-full border-b bg-background", {
34
+ variants: {
35
+ size: {
36
+ sm: "h-12",
37
+ md: "h-14",
38
+ lg: "h-16"
39
+ }
40
+ },
41
+ defaultVariants: {
42
+ size: "sm"
43
+ }
44
+ });
45
+ var AppBar = React__namespace.forwardRef(
46
+ ({ className, size, logo, nav, search, actions, user, children, ...props }, ref) => {
47
+ return /* @__PURE__ */ jsxRuntime.jsx("header", { ref, "data-slot": "app-bar", className: cn(appBarVariants({ size }), className), ...props, children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex h-full items-center gap-3 px-4", children: [
48
+ (logo || nav) && /* @__PURE__ */ jsxRuntime.jsxs("div", { "data-slot": "app-bar-start", className: "flex items-center gap-3 shrink-0", children: [
49
+ logo && /* @__PURE__ */ jsxRuntime.jsx("div", { "data-slot": "app-bar-logo", className: "shrink-0", children: logo }),
50
+ nav && /* @__PURE__ */ jsxRuntime.jsx("nav", { "data-slot": "app-bar-nav", "aria-label": "\u0646\u0627\u0648\u0628\u0631\u06CC \u0627\u0635\u0644\u06CC", children: nav })
51
+ ] }),
52
+ search && /* @__PURE__ */ jsxRuntime.jsx("div", { "data-slot": "app-bar-search", className: "flex-1 max-w-md mx-auto", children: search }),
53
+ !search && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex-1", "aria-hidden": true }),
54
+ (actions || user) && /* @__PURE__ */ jsxRuntime.jsxs("div", { "data-slot": "app-bar-end", className: "flex items-center gap-2 shrink-0", children: [
55
+ actions && /* @__PURE__ */ jsxRuntime.jsx("div", { "data-slot": "app-bar-actions", className: "flex items-center gap-1", children: actions }),
56
+ user && /* @__PURE__ */ jsxRuntime.jsx("div", { "data-slot": "app-bar-user", children: user })
57
+ ] }),
58
+ children
59
+ ] }) });
60
+ }
61
+ );
62
+ AppBar.displayName = "AppBar";
63
+
64
+ exports.AppBar = AppBar;
65
+ exports.appBarVariants = appBarVariants;
66
+ //# sourceMappingURL=app-bar.cjs.map
67
+ //# sourceMappingURL=app-bar.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/lib/utils.ts","../../../src/components/ui/app-bar.tsx"],"names":["twMerge","clsx","cva","React","jsxs","jsx"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAIO,SAAS,MAAM,MAAA,EAAsB;AAC1C,EAAA,OAAOA,qBAAA,CAAQC,SAAA,CAAK,MAAM,CAAC,CAAA;AAC7B;ACIA,IAAM,cAAA,GAAiBC,2BAAI,qDAAA,EAAuD;AAAA,EAChF,QAAA,EAAU;AAAA,IACR,IAAA,EAAM;AAAA,MACJ,EAAA,EAAI,MAAA;AAAA,MACJ,EAAA,EAAI,MAAA;AAAA,MACJ,EAAA,EAAI;AAAA;AACN,GACF;AAAA,EACA,eAAA,EAAiB;AAAA,IACf,IAAA,EAAM;AAAA;AAEV,CAAC;AAuBD,IAAM,MAAA,GAAeC,gBAAA,CAAA,UAAA;AAAA,EACnB,CAAC,EAAE,SAAA,EAAW,IAAA,EAAM,IAAA,EAAM,GAAA,EAAK,MAAA,EAAQ,OAAA,EAAS,IAAA,EAAM,QAAA,EAAU,GAAG,KAAA,IAAS,GAAA,KAAQ;AAClF,IAAA,sCACG,QAAA,EAAA,EAAO,GAAA,EAAU,aAAU,SAAA,EAAU,SAAA,EAAW,GAAG,cAAA,CAAe,EAAE,MAAM,CAAA,EAAG,SAAS,CAAA,EAAI,GAAG,OAC5F,QAAA,kBAAAC,eAAA,CAAC,KAAA,EAAA,EAAI,WAAU,qCAAA,EAEX,QAAA,EAAA;AAAA,MAAA,CAAA,IAAA,IAAQ,wBACRA,eAAA,CAAC,KAAA,EAAA,EAAI,WAAA,EAAU,eAAA,EAAgB,WAAU,kCAAA,EACtC,QAAA,EAAA;AAAA,QAAA,IAAA,mCACE,KAAA,EAAA,EAAI,WAAA,EAAU,cAAA,EAAe,SAAA,EAAU,YACrC,QAAA,EAAA,IAAA,EACH,CAAA;AAAA,QAED,uBACCC,cAAA,CAAC,KAAA,EAAA,EAAI,aAAU,aAAA,EAAc,YAAA,EAAW,iEACrC,QAAA,EAAA,GAAA,EACH;AAAA,OAAA,EAEJ,CAAA;AAAA,MAID,0BACCA,cAAA,CAAC,KAAA,EAAA,EAAI,aAAU,gBAAA,EAAiB,SAAA,EAAU,2BACvC,QAAA,EAAA,MAAA,EACH,CAAA;AAAA,MAID,CAAC,MAAA,oBAAUA,cAAA,CAAC,SAAI,SAAA,EAAU,QAAA,EAAS,eAAW,IAAA,EAAC,CAAA;AAAA,MAAA,CAG9C,WAAW,IAAA,qBACXD,eAAA,CAAC,SAAI,WAAA,EAAU,aAAA,EAAc,WAAU,kCAAA,EACpC,QAAA,EAAA;AAAA,QAAA,OAAA,mCACE,KAAA,EAAA,EAAI,WAAA,EAAU,iBAAA,EAAkB,SAAA,EAAU,2BACxC,QAAA,EAAA,OAAA,EACH,CAAA;AAAA,QAED,IAAA,oBAAQC,cAAA,CAAC,KAAA,EAAA,EAAI,WAAA,EAAU,gBAAgB,QAAA,EAAA,IAAA,EAAK;AAAA,OAAA,EAC/C,CAAA;AAAA,MAID;AAAA,KAAA,EACH,CAAA,EACF,CAAA;AAAA,EAEJ;AACF;AACA,MAAA,CAAO,WAAA,GAAc,QAAA","file":"app-bar.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 { cva, type VariantProps } from 'class-variance-authority'\nimport { cn } from '@/lib/utils'\n\n/* -------------------------------------------------------------------------- */\n/* Variants */\n/* -------------------------------------------------------------------------- */\n\nconst appBarVariants = cva('sticky top-0 z-sticky w-full border-b bg-background', {\n variants: {\n size: {\n sm: 'h-12',\n md: 'h-14',\n lg: 'h-16',\n },\n },\n defaultVariants: {\n size: 'sm',\n },\n})\n\n/* -------------------------------------------------------------------------- */\n/* Props */\n/* -------------------------------------------------------------------------- */\n\nexport interface AppBarProps extends React.HTMLAttributes<HTMLElement>, VariantProps<typeof appBarVariants> {\n /** Logo or brand mark — rendered at the inline-start */\n logo?: React.ReactNode\n /** Primary navigation links — rendered after logo */\n nav?: React.ReactNode\n /** Search input or trigger — rendered in the center area */\n search?: React.ReactNode\n /** Action buttons (notifications, help, etc.) — rendered before user slot */\n actions?: React.ReactNode\n /** User avatar / menu — rendered at the inline-end */\n user?: React.ReactNode\n}\n\n/* -------------------------------------------------------------------------- */\n/* Component */\n/* -------------------------------------------------------------------------- */\n\nconst AppBar = React.forwardRef<HTMLElement, AppBarProps>(\n ({ className, size, logo, nav, search, actions, user, children, ...props }, ref) => {\n return (\n <header ref={ref} data-slot=\"app-bar\" className={cn(appBarVariants({ size }), className)} {...props}>\n <div className=\"flex h-full items-center gap-3 px-4\">\n {/* Inline-start: logo + primary nav */}\n {(logo || nav) && (\n <div data-slot=\"app-bar-start\" className=\"flex items-center gap-3 shrink-0\">\n {logo && (\n <div data-slot=\"app-bar-logo\" className=\"shrink-0\">\n {logo}\n </div>\n )}\n {nav && (\n <nav data-slot=\"app-bar-nav\" aria-label=\"ناوبری اصلی\">\n {nav}\n </nav>\n )}\n </div>\n )}\n\n {/* Center: search — grows to fill available space */}\n {search && (\n <div data-slot=\"app-bar-search\" className=\"flex-1 max-w-md mx-auto\">\n {search}\n </div>\n )}\n\n {/* Spacer when no search */}\n {!search && <div className=\"flex-1\" aria-hidden />}\n\n {/* Inline-end: actions + user */}\n {(actions || user) && (\n <div data-slot=\"app-bar-end\" className=\"flex items-center gap-2 shrink-0\">\n {actions && (\n <div data-slot=\"app-bar-actions\" className=\"flex items-center gap-1\">\n {actions}\n </div>\n )}\n {user && <div data-slot=\"app-bar-user\">{user}</div>}\n </div>\n )}\n\n {/* Arbitrary children for full custom layouts */}\n {children}\n </div>\n </header>\n )\n }\n)\nAppBar.displayName = 'AppBar'\n\nexport { AppBar, appBarVariants }\n"]}
@@ -0,0 +1,22 @@
1
+ import * as class_variance_authority_types from 'class-variance-authority/types';
2
+ import * as React from 'react';
3
+ import { VariantProps } from 'class-variance-authority';
4
+
5
+ declare const appBarVariants: (props?: ({
6
+ size?: "sm" | "md" | "lg" | null | undefined;
7
+ } & class_variance_authority_types.ClassProp) | undefined) => string;
8
+ interface AppBarProps extends React.HTMLAttributes<HTMLElement>, VariantProps<typeof appBarVariants> {
9
+ /** Logo or brand mark — rendered at the inline-start */
10
+ logo?: React.ReactNode;
11
+ /** Primary navigation links — rendered after logo */
12
+ nav?: React.ReactNode;
13
+ /** Search input or trigger — rendered in the center area */
14
+ search?: React.ReactNode;
15
+ /** Action buttons (notifications, help, etc.) — rendered before user slot */
16
+ actions?: React.ReactNode;
17
+ /** User avatar / menu — rendered at the inline-end */
18
+ user?: React.ReactNode;
19
+ }
20
+ declare const AppBar: React.ForwardRefExoticComponent<AppBarProps & React.RefAttributes<HTMLElement>>;
21
+
22
+ export { AppBar, type AppBarProps, appBarVariants };
@@ -0,0 +1,22 @@
1
+ import * as class_variance_authority_types from 'class-variance-authority/types';
2
+ import * as React from 'react';
3
+ import { VariantProps } from 'class-variance-authority';
4
+
5
+ declare const appBarVariants: (props?: ({
6
+ size?: "sm" | "md" | "lg" | null | undefined;
7
+ } & class_variance_authority_types.ClassProp) | undefined) => string;
8
+ interface AppBarProps extends React.HTMLAttributes<HTMLElement>, VariantProps<typeof appBarVariants> {
9
+ /** Logo or brand mark — rendered at the inline-start */
10
+ logo?: React.ReactNode;
11
+ /** Primary navigation links — rendered after logo */
12
+ nav?: React.ReactNode;
13
+ /** Search input or trigger — rendered in the center area */
14
+ search?: React.ReactNode;
15
+ /** Action buttons (notifications, help, etc.) — rendered before user slot */
16
+ actions?: React.ReactNode;
17
+ /** User avatar / menu — rendered at the inline-end */
18
+ user?: React.ReactNode;
19
+ }
20
+ declare const AppBar: React.ForwardRefExoticComponent<AppBarProps & React.RefAttributes<HTMLElement>>;
21
+
22
+ export { AppBar, type AppBarProps, appBarVariants };
@@ -0,0 +1,44 @@
1
+ 'use client';
2
+ import * as React from 'react';
3
+ import { cva } from 'class-variance-authority';
4
+ import { clsx } from 'clsx';
5
+ import { twMerge } from 'tailwind-merge';
6
+ import { jsx, jsxs } from 'react/jsx-runtime';
7
+
8
+ function cn(...inputs) {
9
+ return twMerge(clsx(inputs));
10
+ }
11
+ var appBarVariants = cva("sticky top-0 z-sticky w-full border-b bg-background", {
12
+ variants: {
13
+ size: {
14
+ sm: "h-12",
15
+ md: "h-14",
16
+ lg: "h-16"
17
+ }
18
+ },
19
+ defaultVariants: {
20
+ size: "sm"
21
+ }
22
+ });
23
+ var AppBar = React.forwardRef(
24
+ ({ className, size, logo, nav, search, actions, user, children, ...props }, ref) => {
25
+ return /* @__PURE__ */ jsx("header", { ref, "data-slot": "app-bar", className: cn(appBarVariants({ size }), className), ...props, children: /* @__PURE__ */ jsxs("div", { className: "flex h-full items-center gap-3 px-4", children: [
26
+ (logo || nav) && /* @__PURE__ */ jsxs("div", { "data-slot": "app-bar-start", className: "flex items-center gap-3 shrink-0", children: [
27
+ logo && /* @__PURE__ */ jsx("div", { "data-slot": "app-bar-logo", className: "shrink-0", children: logo }),
28
+ nav && /* @__PURE__ */ jsx("nav", { "data-slot": "app-bar-nav", "aria-label": "\u0646\u0627\u0648\u0628\u0631\u06CC \u0627\u0635\u0644\u06CC", children: nav })
29
+ ] }),
30
+ search && /* @__PURE__ */ jsx("div", { "data-slot": "app-bar-search", className: "flex-1 max-w-md mx-auto", children: search }),
31
+ !search && /* @__PURE__ */ jsx("div", { className: "flex-1", "aria-hidden": true }),
32
+ (actions || user) && /* @__PURE__ */ jsxs("div", { "data-slot": "app-bar-end", className: "flex items-center gap-2 shrink-0", children: [
33
+ actions && /* @__PURE__ */ jsx("div", { "data-slot": "app-bar-actions", className: "flex items-center gap-1", children: actions }),
34
+ user && /* @__PURE__ */ jsx("div", { "data-slot": "app-bar-user", children: user })
35
+ ] }),
36
+ children
37
+ ] }) });
38
+ }
39
+ );
40
+ AppBar.displayName = "AppBar";
41
+
42
+ export { AppBar, appBarVariants };
43
+ //# sourceMappingURL=app-bar.js.map
44
+ //# sourceMappingURL=app-bar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/lib/utils.ts","../../../src/components/ui/app-bar.tsx"],"names":[],"mappings":";;;;;;AAIO,SAAS,MAAM,MAAA,EAAsB;AAC1C,EAAA,OAAO,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAC,CAAA;AAC7B;ACIA,IAAM,cAAA,GAAiB,IAAI,qDAAA,EAAuD;AAAA,EAChF,QAAA,EAAU;AAAA,IACR,IAAA,EAAM;AAAA,MACJ,EAAA,EAAI,MAAA;AAAA,MACJ,EAAA,EAAI,MAAA;AAAA,MACJ,EAAA,EAAI;AAAA;AACN,GACF;AAAA,EACA,eAAA,EAAiB;AAAA,IACf,IAAA,EAAM;AAAA;AAEV,CAAC;AAuBD,IAAM,MAAA,GAAe,KAAA,CAAA,UAAA;AAAA,EACnB,CAAC,EAAE,SAAA,EAAW,IAAA,EAAM,IAAA,EAAM,GAAA,EAAK,MAAA,EAAQ,OAAA,EAAS,IAAA,EAAM,QAAA,EAAU,GAAG,KAAA,IAAS,GAAA,KAAQ;AAClF,IAAA,2BACG,QAAA,EAAA,EAAO,GAAA,EAAU,aAAU,SAAA,EAAU,SAAA,EAAW,GAAG,cAAA,CAAe,EAAE,MAAM,CAAA,EAAG,SAAS,CAAA,EAAI,GAAG,OAC5F,QAAA,kBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,qCAAA,EAEX,QAAA,EAAA;AAAA,MAAA,CAAA,IAAA,IAAQ,wBACR,IAAA,CAAC,KAAA,EAAA,EAAI,WAAA,EAAU,eAAA,EAAgB,WAAU,kCAAA,EACtC,QAAA,EAAA;AAAA,QAAA,IAAA,wBACE,KAAA,EAAA,EAAI,WAAA,EAAU,cAAA,EAAe,SAAA,EAAU,YACrC,QAAA,EAAA,IAAA,EACH,CAAA;AAAA,QAED,uBACC,GAAA,CAAC,KAAA,EAAA,EAAI,aAAU,aAAA,EAAc,YAAA,EAAW,iEACrC,QAAA,EAAA,GAAA,EACH;AAAA,OAAA,EAEJ,CAAA;AAAA,MAID,0BACC,GAAA,CAAC,KAAA,EAAA,EAAI,aAAU,gBAAA,EAAiB,SAAA,EAAU,2BACvC,QAAA,EAAA,MAAA,EACH,CAAA;AAAA,MAID,CAAC,MAAA,oBAAU,GAAA,CAAC,SAAI,SAAA,EAAU,QAAA,EAAS,eAAW,IAAA,EAAC,CAAA;AAAA,MAAA,CAG9C,WAAW,IAAA,qBACX,IAAA,CAAC,SAAI,WAAA,EAAU,aAAA,EAAc,WAAU,kCAAA,EACpC,QAAA,EAAA;AAAA,QAAA,OAAA,wBACE,KAAA,EAAA,EAAI,WAAA,EAAU,iBAAA,EAAkB,SAAA,EAAU,2BACxC,QAAA,EAAA,OAAA,EACH,CAAA;AAAA,QAED,IAAA,oBAAQ,GAAA,CAAC,KAAA,EAAA,EAAI,WAAA,EAAU,gBAAgB,QAAA,EAAA,IAAA,EAAK;AAAA,OAAA,EAC/C,CAAA;AAAA,MAID;AAAA,KAAA,EACH,CAAA,EACF,CAAA;AAAA,EAEJ;AACF;AACA,MAAA,CAAO,WAAA,GAAc,QAAA","file":"app-bar.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 { cva, type VariantProps } from 'class-variance-authority'\nimport { cn } from '@/lib/utils'\n\n/* -------------------------------------------------------------------------- */\n/* Variants */\n/* -------------------------------------------------------------------------- */\n\nconst appBarVariants = cva('sticky top-0 z-sticky w-full border-b bg-background', {\n variants: {\n size: {\n sm: 'h-12',\n md: 'h-14',\n lg: 'h-16',\n },\n },\n defaultVariants: {\n size: 'sm',\n },\n})\n\n/* -------------------------------------------------------------------------- */\n/* Props */\n/* -------------------------------------------------------------------------- */\n\nexport interface AppBarProps extends React.HTMLAttributes<HTMLElement>, VariantProps<typeof appBarVariants> {\n /** Logo or brand mark — rendered at the inline-start */\n logo?: React.ReactNode\n /** Primary navigation links — rendered after logo */\n nav?: React.ReactNode\n /** Search input or trigger — rendered in the center area */\n search?: React.ReactNode\n /** Action buttons (notifications, help, etc.) — rendered before user slot */\n actions?: React.ReactNode\n /** User avatar / menu — rendered at the inline-end */\n user?: React.ReactNode\n}\n\n/* -------------------------------------------------------------------------- */\n/* Component */\n/* -------------------------------------------------------------------------- */\n\nconst AppBar = React.forwardRef<HTMLElement, AppBarProps>(\n ({ className, size, logo, nav, search, actions, user, children, ...props }, ref) => {\n return (\n <header ref={ref} data-slot=\"app-bar\" className={cn(appBarVariants({ size }), className)} {...props}>\n <div className=\"flex h-full items-center gap-3 px-4\">\n {/* Inline-start: logo + primary nav */}\n {(logo || nav) && (\n <div data-slot=\"app-bar-start\" className=\"flex items-center gap-3 shrink-0\">\n {logo && (\n <div data-slot=\"app-bar-logo\" className=\"shrink-0\">\n {logo}\n </div>\n )}\n {nav && (\n <nav data-slot=\"app-bar-nav\" aria-label=\"ناوبری اصلی\">\n {nav}\n </nav>\n )}\n </div>\n )}\n\n {/* Center: search — grows to fill available space */}\n {search && (\n <div data-slot=\"app-bar-search\" className=\"flex-1 max-w-md mx-auto\">\n {search}\n </div>\n )}\n\n {/* Spacer when no search */}\n {!search && <div className=\"flex-1\" aria-hidden />}\n\n {/* Inline-end: actions + user */}\n {(actions || user) && (\n <div data-slot=\"app-bar-end\" className=\"flex items-center gap-2 shrink-0\">\n {actions && (\n <div data-slot=\"app-bar-actions\" className=\"flex items-center gap-1\">\n {actions}\n </div>\n )}\n {user && <div data-slot=\"app-bar-user\">{user}</div>}\n </div>\n )}\n\n {/* Arbitrary children for full custom layouts */}\n {children}\n </div>\n </header>\n )\n }\n)\nAppBar.displayName = 'AppBar'\n\nexport { AppBar, appBarVariants }\n"]}
@@ -1,21 +1,73 @@
1
+ 'use client';
1
2
  'use strict';
2
3
 
3
- var chunkONO2FTV4_cjs = require('../../chunk-ONO2FTV4.cjs');
4
- require('../../chunk-NV4JOKWL.cjs');
4
+ var AvatarPrimitive = require('@radix-ui/react-avatar');
5
+ var clsx = require('clsx');
6
+ var tailwindMerge = require('tailwind-merge');
7
+ var jsxRuntime = require('react/jsx-runtime');
5
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
+ }
6
26
 
27
+ var AvatarPrimitive__namespace = /*#__PURE__*/_interopNamespace(AvatarPrimitive);
7
28
 
8
- Object.defineProperty(exports, "Avatar", {
9
- enumerable: true,
10
- get: function () { return chunkONO2FTV4_cjs.Avatar; }
11
- });
12
- Object.defineProperty(exports, "AvatarFallback", {
13
- enumerable: true,
14
- get: function () { return chunkONO2FTV4_cjs.AvatarFallback; }
15
- });
16
- Object.defineProperty(exports, "AvatarImage", {
17
- enumerable: true,
18
- get: function () { return chunkONO2FTV4_cjs.AvatarImage; }
19
- });
29
+ function cn(...inputs) {
30
+ return tailwindMerge.twMerge(clsx.clsx(inputs));
31
+ }
32
+ function Avatar({ className, ...props }) {
33
+ return /* @__PURE__ */ jsxRuntime.jsx(
34
+ AvatarPrimitive__namespace.Root,
35
+ {
36
+ "data-slot": "avatar",
37
+ className: cn(
38
+ "relative inline-flex size-8 shrink-0 overflow-hidden rounded-full align-middle text-[0px] leading-none",
39
+ className
40
+ ),
41
+ ...props
42
+ }
43
+ );
44
+ }
45
+ function AvatarImage({ className, ...props }) {
46
+ return /* @__PURE__ */ jsxRuntime.jsx(
47
+ AvatarPrimitive__namespace.Image,
48
+ {
49
+ "data-slot": "avatar-image",
50
+ className: cn("block size-full object-cover object-center", className),
51
+ ...props
52
+ }
53
+ );
54
+ }
55
+ function AvatarFallback({ className, ...props }) {
56
+ return /* @__PURE__ */ jsxRuntime.jsx(
57
+ AvatarPrimitive__namespace.Fallback,
58
+ {
59
+ "data-slot": "avatar-fallback",
60
+ className: cn("bg-muted flex size-full items-center justify-center rounded-full text-sm", className),
61
+ ...props
62
+ }
63
+ );
64
+ }
65
+ Avatar.displayName = "Avatar";
66
+ AvatarImage.displayName = "AvatarImage";
67
+ AvatarFallback.displayName = "AvatarFallback";
68
+
69
+ exports.Avatar = Avatar;
70
+ exports.AvatarFallback = AvatarFallback;
71
+ exports.AvatarImage = AvatarImage;
20
72
  //# sourceMappingURL=avatar.cjs.map
21
73
  //# sourceMappingURL=avatar.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"avatar.cjs"}
1
+ {"version":3,"sources":["../../../src/lib/utils.ts","../../../src/components/ui/avatar.tsx"],"names":["twMerge","clsx","jsx","AvatarPrimitive"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAIO,SAAS,MAAM,MAAA,EAAsB;AAC1C,EAAA,OAAOA,qBAAA,CAAQC,SAAA,CAAK,MAAM,CAAC,CAAA;AAC7B;ACCA,SAAS,MAAA,CAAO,EAAE,SAAA,EAAW,GAAG,OAAM,EAAsD;AAC1F,EAAA,uBACEC,cAAA;AAAA,IAAiBC,0BAAA,CAAA,IAAA;AAAA,IAAhB;AAAA,MACC,WAAA,EAAU,QAAA;AAAA,MACV,SAAA,EAAW,EAAA;AAAA,QACT,wGAAA;AAAA,QACA;AAAA,OACF;AAAA,MACC,GAAG;AAAA;AAAA,GACN;AAEJ;AAEA,SAAS,WAAA,CAAY,EAAE,SAAA,EAAW,GAAG,OAAM,EAAuD;AAChG,EAAA,uBACED,cAAA;AAAA,IAAiBC,0BAAA,CAAA,KAAA;AAAA,IAAhB;AAAA,MACC,WAAA,EAAU,cAAA;AAAA,MACV,SAAA,EAAW,EAAA,CAAG,4CAAA,EAA8C,SAAS,CAAA;AAAA,MACpE,GAAG;AAAA;AAAA,GACN;AAEJ;AAEA,SAAS,cAAA,CAAe,EAAE,SAAA,EAAW,GAAG,OAAM,EAA0D;AACtG,EAAA,uBACED,cAAA;AAAA,IAAiBC,0BAAA,CAAA,QAAA;AAAA,IAAhB;AAAA,MACC,WAAA,EAAU,iBAAA;AAAA,MACV,SAAA,EAAW,EAAA,CAAG,0EAAA,EAA4E,SAAS,CAAA;AAAA,MAClG,GAAG;AAAA;AAAA,GACN;AAEJ;AAEA,MAAA,CAAO,WAAA,GAAc,QAAA;AACrB,WAAA,CAAY,WAAA,GAAc,aAAA;AAC1B,cAAA,CAAe,WAAA,GAAc,gBAAA","file":"avatar.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 AvatarPrimitive from '@radix-ui/react-avatar'\n\nimport { cn } from '@/lib/utils'\n\nfunction Avatar({ className, ...props }: React.ComponentProps<typeof AvatarPrimitive.Root>) {\n return (\n <AvatarPrimitive.Root\n data-slot=\"avatar\"\n className={cn(\n 'relative inline-flex size-8 shrink-0 overflow-hidden rounded-full align-middle text-[0px] leading-none',\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AvatarImage({ className, ...props }: React.ComponentProps<typeof AvatarPrimitive.Image>) {\n return (\n <AvatarPrimitive.Image\n data-slot=\"avatar-image\"\n className={cn('block size-full object-cover object-center', className)}\n {...props}\n />\n )\n}\n\nfunction AvatarFallback({ className, ...props }: React.ComponentProps<typeof AvatarPrimitive.Fallback>) {\n return (\n <AvatarPrimitive.Fallback\n data-slot=\"avatar-fallback\"\n className={cn('bg-muted flex size-full items-center justify-center rounded-full text-sm', className)}\n {...props}\n />\n )\n}\n\nAvatar.displayName = 'Avatar'\nAvatarImage.displayName = 'AvatarImage'\nAvatarFallback.displayName = 'AvatarFallback'\n\nexport { Avatar, AvatarImage, AvatarFallback }\n"]}
@@ -1,4 +1,49 @@
1
- export { Avatar, AvatarFallback, AvatarImage } from '../../chunk-RJ3HYZ7S.js';
2
- import '../../chunk-4SVQNEVH.js';
1
+ 'use client';
2
+ import * as AvatarPrimitive from '@radix-ui/react-avatar';
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 Avatar({ className, ...props }) {
11
+ return /* @__PURE__ */ jsx(
12
+ AvatarPrimitive.Root,
13
+ {
14
+ "data-slot": "avatar",
15
+ className: cn(
16
+ "relative inline-flex size-8 shrink-0 overflow-hidden rounded-full align-middle text-[0px] leading-none",
17
+ className
18
+ ),
19
+ ...props
20
+ }
21
+ );
22
+ }
23
+ function AvatarImage({ className, ...props }) {
24
+ return /* @__PURE__ */ jsx(
25
+ AvatarPrimitive.Image,
26
+ {
27
+ "data-slot": "avatar-image",
28
+ className: cn("block size-full object-cover object-center", className),
29
+ ...props
30
+ }
31
+ );
32
+ }
33
+ function AvatarFallback({ className, ...props }) {
34
+ return /* @__PURE__ */ jsx(
35
+ AvatarPrimitive.Fallback,
36
+ {
37
+ "data-slot": "avatar-fallback",
38
+ className: cn("bg-muted flex size-full items-center justify-center rounded-full text-sm", className),
39
+ ...props
40
+ }
41
+ );
42
+ }
43
+ Avatar.displayName = "Avatar";
44
+ AvatarImage.displayName = "AvatarImage";
45
+ AvatarFallback.displayName = "AvatarFallback";
46
+
47
+ export { Avatar, AvatarFallback, AvatarImage };
3
48
  //# sourceMappingURL=avatar.js.map
4
49
  //# sourceMappingURL=avatar.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"avatar.js"}
1
+ {"version":3,"sources":["../../../src/lib/utils.ts","../../../src/components/ui/avatar.tsx"],"names":[],"mappings":";;;;;AAIO,SAAS,MAAM,MAAA,EAAsB;AAC1C,EAAA,OAAO,OAAA,CAAQ,IAAA,CAAK,MAAM,CAAC,CAAA;AAC7B;ACCA,SAAS,MAAA,CAAO,EAAE,SAAA,EAAW,GAAG,OAAM,EAAsD;AAC1F,EAAA,uBACE,GAAA;AAAA,IAAiB,eAAA,CAAA,IAAA;AAAA,IAAhB;AAAA,MACC,WAAA,EAAU,QAAA;AAAA,MACV,SAAA,EAAW,EAAA;AAAA,QACT,wGAAA;AAAA,QACA;AAAA,OACF;AAAA,MACC,GAAG;AAAA;AAAA,GACN;AAEJ;AAEA,SAAS,WAAA,CAAY,EAAE,SAAA,EAAW,GAAG,OAAM,EAAuD;AAChG,EAAA,uBACE,GAAA;AAAA,IAAiB,eAAA,CAAA,KAAA;AAAA,IAAhB;AAAA,MACC,WAAA,EAAU,cAAA;AAAA,MACV,SAAA,EAAW,EAAA,CAAG,4CAAA,EAA8C,SAAS,CAAA;AAAA,MACpE,GAAG;AAAA;AAAA,GACN;AAEJ;AAEA,SAAS,cAAA,CAAe,EAAE,SAAA,EAAW,GAAG,OAAM,EAA0D;AACtG,EAAA,uBACE,GAAA;AAAA,IAAiB,eAAA,CAAA,QAAA;AAAA,IAAhB;AAAA,MACC,WAAA,EAAU,iBAAA;AAAA,MACV,SAAA,EAAW,EAAA,CAAG,0EAAA,EAA4E,SAAS,CAAA;AAAA,MAClG,GAAG;AAAA;AAAA,GACN;AAEJ;AAEA,MAAA,CAAO,WAAA,GAAc,QAAA;AACrB,WAAA,CAAY,WAAA,GAAc,aAAA;AAC1B,cAAA,CAAe,WAAA,GAAc,gBAAA","file":"avatar.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 AvatarPrimitive from '@radix-ui/react-avatar'\n\nimport { cn } from '@/lib/utils'\n\nfunction Avatar({ className, ...props }: React.ComponentProps<typeof AvatarPrimitive.Root>) {\n return (\n <AvatarPrimitive.Root\n data-slot=\"avatar\"\n className={cn(\n 'relative inline-flex size-8 shrink-0 overflow-hidden rounded-full align-middle text-[0px] leading-none',\n className\n )}\n {...props}\n />\n )\n}\n\nfunction AvatarImage({ className, ...props }: React.ComponentProps<typeof AvatarPrimitive.Image>) {\n return (\n <AvatarPrimitive.Image\n data-slot=\"avatar-image\"\n className={cn('block size-full object-cover object-center', className)}\n {...props}\n />\n )\n}\n\nfunction AvatarFallback({ className, ...props }: React.ComponentProps<typeof AvatarPrimitive.Fallback>) {\n return (\n <AvatarPrimitive.Fallback\n data-slot=\"avatar-fallback\"\n className={cn('bg-muted flex size-full items-center justify-center rounded-full text-sm', className)}\n {...props}\n />\n )\n}\n\nAvatar.displayName = 'Avatar'\nAvatarImage.displayName = 'AvatarImage'\nAvatarFallback.displayName = 'AvatarFallback'\n\nexport { Avatar, AvatarImage, AvatarFallback }\n"]}
@@ -1,17 +1,121 @@
1
+ 'use client';
1
2
  'use strict';
2
3
 
3
- var chunk2ACKKPWA_cjs = require('../../chunk-2ACKKPWA.cjs');
4
- require('../../chunk-NV4JOKWL.cjs');
4
+ var React = require('react');
5
+ var classVarianceAuthority = require('class-variance-authority');
6
+ var clsx = require('clsx');
7
+ var tailwindMerge = require('tailwind-merge');
8
+ var jsxRuntime = require('react/jsx-runtime');
5
9
 
10
+ function _interopNamespace(e) {
11
+ if (e && e.__esModule) return e;
12
+ var n = Object.create(null);
13
+ if (e) {
14
+ Object.keys(e).forEach(function (k) {
15
+ if (k !== 'default') {
16
+ var d = Object.getOwnPropertyDescriptor(e, k);
17
+ Object.defineProperty(n, k, d.get ? d : {
18
+ enumerable: true,
19
+ get: function () { return e[k]; }
20
+ });
21
+ }
22
+ });
23
+ }
24
+ n.default = e;
25
+ return Object.freeze(n);
26
+ }
6
27
 
28
+ var React__namespace = /*#__PURE__*/_interopNamespace(React);
7
29
 
8
- Object.defineProperty(exports, "Badge", {
9
- enumerable: true,
10
- get: function () { return chunk2ACKKPWA_cjs.Badge; }
11
- });
12
- Object.defineProperty(exports, "badgeVariants", {
13
- enumerable: true,
14
- get: function () { return chunk2ACKKPWA_cjs.badgeVariants; }
30
+ function cn(...inputs) {
31
+ return tailwindMerge.twMerge(clsx.clsx(inputs));
32
+ }
33
+ var badgeVariants = classVarianceAuthority.cva(
34
+ "inline-flex items-center rounded-full font-normal whitespace-nowrap transition-colors duration-150",
35
+ {
36
+ variants: {
37
+ variant: {
38
+ default: "bg-surface-75 text-foreground-light border border-strong",
39
+ // 1.1.16 — was using --secondary-default (HSL hue 247° = purple),
40
+ // a vestigial Supabase token that never matched Parto's green
41
+ // brand. Replaced with neutral surface tokens so a "secondary"
42
+ // badge reads as quiet/inactive rather than as a foreign brand.
43
+ secondary: "bg-surface-200 text-foreground-light border border-default",
44
+ success: "bg-brand/10 text-brand-600 border border-brand-500",
45
+ warning: "bg-warning/10 text-warning-600 border border-warning-500",
46
+ destructive: "bg-destructive/10 text-destructive-600 border border-destructive-500",
47
+ brand: "bg-brand/10 text-brand-600 border border-brand-500",
48
+ outline: "bg-transparent text-foreground border border-foreground-muted"
49
+ },
50
+ size: {
51
+ xs: "px-1.5 py-[3px] text-2xs leading-none tracking-wide uppercase",
52
+ sm: "px-2 py-0.5 text-xs",
53
+ md: "px-2 py-0.5 text-xs",
54
+ lg: "px-3 py-0.5 text-sm",
55
+ /** @deprecated Use xs */
56
+ tiny: "px-1.5 py-[3px] text-2xs leading-none tracking-wide uppercase",
57
+ /** @deprecated Use sm */
58
+ small: "px-2 py-0.5 text-xs",
59
+ /** @deprecated Use lg */
60
+ large: "px-3 py-0.5 text-sm"
61
+ },
62
+ dot: {
63
+ true: ""
64
+ }
65
+ },
66
+ defaultVariants: {
67
+ variant: "default",
68
+ size: "sm"
69
+ }
70
+ }
71
+ );
72
+ var dotVariants = classVarianceAuthority.cva("size-2 rounded-full", {
73
+ variants: {
74
+ position: {
75
+ start: "-ms-0.5 me-1.5",
76
+ end: "ms-1.5 -me-0.5"
77
+ }
78
+ },
79
+ defaultVariants: {
80
+ position: "start"
81
+ }
15
82
  });
83
+ var Badge = React__namespace.forwardRef(
84
+ ({ className, variant, size, dot, dotPosition = "end", children, ...props }, ref) => {
85
+ if (process.env.NODE_ENV !== "production") {
86
+ const deprecatedSizes = ["tiny", "small", "large"];
87
+ if (size && deprecatedSizes.includes(size)) {
88
+ console.warn(`[Parto UI] Badge: size="${size}" is deprecated. Use xs|sm|md|lg instead.`);
89
+ }
90
+ }
91
+ return /* @__PURE__ */ jsxRuntime.jsxs("span", { ref, "data-slot": "badge", className: cn(badgeVariants({ variant, size }), className), ...props, children: [
92
+ dot && dotPosition === "start" && /* @__PURE__ */ jsxRuntime.jsx(
93
+ "svg",
94
+ {
95
+ "aria-hidden": "true",
96
+ className: cn(dotVariants({ position: "start" })),
97
+ fill: "currentColor",
98
+ viewBox: "0 0 8 8",
99
+ children: /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: "4", cy: "4", r: "3" })
100
+ }
101
+ ),
102
+ children,
103
+ dot && dotPosition === "end" && /* @__PURE__ */ jsxRuntime.jsx(
104
+ "svg",
105
+ {
106
+ "aria-hidden": "true",
107
+ className: cn(dotVariants({ position: "end" })),
108
+ fill: "currentColor",
109
+ viewBox: "0 0 8 8",
110
+ children: /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: "4", cy: "4", r: "3" })
111
+ }
112
+ )
113
+ ] });
114
+ }
115
+ );
116
+ Badge.displayName = "Badge";
117
+
118
+ exports.Badge = Badge;
119
+ exports.badgeVariants = badgeVariants;
16
120
  //# sourceMappingURL=badge.cjs.map
17
121
  //# sourceMappingURL=badge.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"badge.cjs"}
1
+ {"version":3,"sources":["../../../src/lib/utils.ts","../../../src/components/ui/badge.tsx"],"names":["twMerge","clsx","cva","React","jsx"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAIO,SAAS,MAAM,MAAA,EAAsB;AAC1C,EAAA,OAAOA,qBAAA,CAAQC,SAAA,CAAK,MAAM,CAAC,CAAA;AAC7B;ACCA,IAAM,aAAA,GAAgBC,0BAAA;AAAA,EACpB,oGAAA;AAAA,EACA;AAAA,IACE,QAAA,EAAU;AAAA,MACR,OAAA,EAAS;AAAA,QACP,OAAA,EAAS,0DAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAKT,SAAA,EAAW,4DAAA;AAAA,QACX,OAAA,EAAS,oDAAA;AAAA,QACT,OAAA,EAAS,0DAAA;AAAA,QACT,WAAA,EAAa,sEAAA;AAAA,QACb,KAAA,EAAO,oDAAA;AAAA,QACP,OAAA,EAAS;AAAA,OACX;AAAA,MACA,IAAA,EAAM;AAAA,QACJ,EAAA,EAAI,+DAAA;AAAA,QACJ,EAAA,EAAI,qBAAA;AAAA,QACJ,EAAA,EAAI,qBAAA;AAAA,QACJ,EAAA,EAAI,qBAAA;AAAA;AAAA,QACsB,IAAA,EAAM,+DAAA;AAAA;AAAA,QACN,KAAA,EAAO,qBAAA;AAAA;AAAA,QACP,KAAA,EAAO;AAAA,OACnC;AAAA,MACA,GAAA,EAAK;AAAA,QACH,IAAA,EAAM;AAAA;AACR,KACF;AAAA,IACA,eAAA,EAAiB;AAAA,MACf,OAAA,EAAS,SAAA;AAAA,MACT,IAAA,EAAM;AAAA;AACR;AAEJ;AAEA,IAAM,WAAA,GAAcA,2BAAI,qBAAA,EAAuB;AAAA,EAC7C,QAAA,EAAU;AAAA,IACR,QAAA,EAAU;AAAA,MACR,KAAA,EAAO,gBAAA;AAAA,MACP,GAAA,EAAK;AAAA;AACP,GACF;AAAA,EACA,eAAA,EAAiB;AAAA,IACf,QAAA,EAAU;AAAA;AAEd,CAAC,CAAA;AAOD,IAAM,KAAA,GAAcC,gBAAA,CAAA,UAAA;AAAA,EAClB,CAAC,EAAE,SAAA,EAAW,OAAA,EAAS,IAAA,EAAM,GAAA,EAAK,WAAA,GAAc,KAAA,EAAO,QAAA,EAAU,GAAG,KAAA,EAAM,EAAG,GAAA,KAAQ;AACnF,IAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,QAAA,KAAa,YAAA,EAAc;AACzC,MAAA,MAAM,eAAA,GAAkB,CAAC,MAAA,EAAQ,OAAA,EAAS,OAAO,CAAA;AACjD,MAAA,IAAI,IAAA,IAAQ,eAAA,CAAgB,QAAA,CAAS,IAAc,CAAA,EAAG;AACpD,QAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,wBAAA,EAA2B,IAAI,CAAA,yCAAA,CAA2C,CAAA;AAAA,MACzF;AAAA,IACF;AAEA,IAAA,uCACG,MAAA,EAAA,EAAK,GAAA,EAAU,WAAA,EAAU,OAAA,EAAQ,WAAW,EAAA,CAAG,aAAA,CAAc,EAAE,OAAA,EAAS,MAAM,CAAA,EAAG,SAAS,CAAA,EAAI,GAAG,KAAA,EAC/F,QAAA,EAAA;AAAA,MAAA,GAAA,IAAO,gBAAgB,OAAA,oBACtBC,cAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,aAAA,EAAY,MAAA;AAAA,UACZ,WAAW,EAAA,CAAG,WAAA,CAAY,EAAE,QAAA,EAAU,OAAA,EAAS,CAAC,CAAA;AAAA,UAChD,IAAA,EAAK,cAAA;AAAA,UACL,OAAA,EAAQ,SAAA;AAAA,UAER,yCAAC,QAAA,EAAA,EAAO,EAAA,EAAG,KAAI,EAAA,EAAG,GAAA,EAAI,GAAE,GAAA,EAAI;AAAA;AAAA,OAC9B;AAAA,MAED,QAAA;AAAA,MACA,GAAA,IAAO,gBAAgB,KAAA,oBACtBA,cAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,aAAA,EAAY,MAAA;AAAA,UACZ,WAAW,EAAA,CAAG,WAAA,CAAY,EAAE,QAAA,EAAU,KAAA,EAAO,CAAC,CAAA;AAAA,UAC9C,IAAA,EAAK,cAAA;AAAA,UACL,OAAA,EAAQ,SAAA;AAAA,UAER,yCAAC,QAAA,EAAA,EAAO,EAAA,EAAG,KAAI,EAAA,EAAG,GAAA,EAAI,GAAE,GAAA,EAAI;AAAA;AAAA;AAC9B,KAAA,EAEJ,CAAA;AAAA,EAEJ;AACF;AAEA,KAAA,CAAM,WAAA,GAAc,OAAA","file":"badge.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 { cva, type VariantProps } from 'class-variance-authority'\n\nimport { cn } from '@/lib/utils'\n\nconst badgeVariants = cva(\n 'inline-flex items-center rounded-full font-normal whitespace-nowrap transition-colors duration-150',\n {\n variants: {\n variant: {\n default: 'bg-surface-75 text-foreground-light border border-strong',\n // 1.1.16 — was using --secondary-default (HSL hue 247° = purple),\n // a vestigial Supabase token that never matched Parto's green\n // brand. Replaced with neutral surface tokens so a \"secondary\"\n // badge reads as quiet/inactive rather than as a foreign brand.\n secondary: 'bg-surface-200 text-foreground-light border border-default',\n success: 'bg-brand/10 text-brand-600 border border-brand-500',\n warning: 'bg-warning/10 text-warning-600 border border-warning-500',\n destructive: 'bg-destructive/10 text-destructive-600 border border-destructive-500',\n brand: 'bg-brand/10 text-brand-600 border border-brand-500',\n outline: 'bg-transparent text-foreground border border-foreground-muted',\n },\n size: {\n xs: 'px-1.5 py-[3px] text-2xs leading-none tracking-wide uppercase',\n sm: 'px-2 py-0.5 text-xs',\n md: 'px-2 py-0.5 text-xs',\n lg: 'px-3 py-0.5 text-sm',\n /** @deprecated Use xs */ tiny: 'px-1.5 py-[3px] text-2xs leading-none tracking-wide uppercase',\n /** @deprecated Use sm */ small: 'px-2 py-0.5 text-xs',\n /** @deprecated Use lg */ large: 'px-3 py-0.5 text-sm',\n },\n dot: {\n true: '',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'sm',\n },\n }\n)\n\nconst dotVariants = cva('size-2 rounded-full', {\n variants: {\n position: {\n start: '-ms-0.5 me-1.5',\n end: 'ms-1.5 -me-0.5',\n },\n },\n defaultVariants: {\n position: 'start',\n },\n})\n\nexport interface BadgeProps extends React.HTMLAttributes<HTMLSpanElement>, VariantProps<typeof badgeVariants> {\n dot?: boolean\n dotPosition?: 'start' | 'end'\n}\n\nconst Badge = React.forwardRef<HTMLSpanElement, BadgeProps>(\n ({ className, variant, size, dot, dotPosition = 'end', children, ...props }, ref) => {\n if (process.env.NODE_ENV !== 'production') {\n const deprecatedSizes = ['tiny', 'small', 'large']\n if (size && deprecatedSizes.includes(size as string)) {\n console.warn(`[Parto UI] Badge: size=\"${size}\" is deprecated. Use xs|sm|md|lg instead.`)\n }\n }\n\n return (\n <span ref={ref} data-slot=\"badge\" className={cn(badgeVariants({ variant, size }), className)} {...props}>\n {dot && dotPosition === 'start' && (\n <svg\n aria-hidden=\"true\"\n className={cn(dotVariants({ position: 'start' }))}\n fill=\"currentColor\"\n viewBox=\"0 0 8 8\"\n >\n <circle cx=\"4\" cy=\"4\" r=\"3\" />\n </svg>\n )}\n {children}\n {dot && dotPosition === 'end' && (\n <svg\n aria-hidden=\"true\"\n className={cn(dotVariants({ position: 'end' }))}\n fill=\"currentColor\"\n viewBox=\"0 0 8 8\"\n >\n <circle cx=\"4\" cy=\"4\" r=\"3\" />\n </svg>\n )}\n </span>\n )\n }\n)\n\nBadge.displayName = 'Badge'\n\nexport { Badge, badgeVariants }\n"]}