@parto-system-design/ui 1.1.16 → 1.1.18

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 (294) hide show
  1. package/AGENTS.md +2 -2
  2. package/README.md +1 -1
  3. package/dist/components/brand/parto-logo.cjs +0 -2
  4. package/dist/components/brand/parto-logo.js +0 -2
  5. package/dist/components/charts/PartoAreaChart.cjs +2 -4
  6. package/dist/components/charts/PartoAreaChart.d.cts +1 -1
  7. package/dist/components/charts/PartoAreaChart.d.ts +1 -1
  8. package/dist/components/charts/PartoAreaChart.js +2 -4
  9. package/dist/components/charts/PartoBarChart.cjs +2 -4
  10. package/dist/components/charts/PartoBarChart.d.cts +1 -1
  11. package/dist/components/charts/PartoBarChart.d.ts +1 -1
  12. package/dist/components/charts/PartoBarChart.js +2 -4
  13. package/dist/components/charts/PartoLineChart.cjs +2 -4
  14. package/dist/components/charts/PartoLineChart.d.cts +1 -1
  15. package/dist/components/charts/PartoLineChart.d.ts +1 -1
  16. package/dist/components/charts/PartoLineChart.js +2 -4
  17. package/dist/components/charts/PartoPieChart.cjs +2 -4
  18. package/dist/components/charts/PartoPieChart.d.cts +1 -1
  19. package/dist/components/charts/PartoPieChart.d.ts +1 -1
  20. package/dist/components/charts/PartoPieChart.js +2 -4
  21. package/dist/components/ui/accordion.cjs +0 -2
  22. package/dist/components/ui/accordion.d.cts +4 -5
  23. package/dist/components/ui/accordion.d.ts +4 -5
  24. package/dist/components/ui/accordion.js +0 -2
  25. package/dist/components/ui/alert-dialog.cjs +0 -2
  26. package/dist/components/ui/alert-dialog.d.cts +9 -10
  27. package/dist/components/ui/alert-dialog.d.ts +9 -10
  28. package/dist/components/ui/alert-dialog.js +1 -3
  29. package/dist/components/ui/alert-rule-card.cjs +149 -12
  30. package/dist/components/ui/alert-rule-card.d.cts +2 -2
  31. package/dist/components/ui/alert-rule-card.d.ts +2 -2
  32. package/dist/components/ui/alert-rule-card.js +149 -12
  33. package/dist/components/ui/alert.cjs +3 -5
  34. package/dist/components/ui/alert.js +3 -5
  35. package/dist/components/ui/app-bar.cjs +0 -2
  36. package/dist/components/ui/app-bar.js +0 -2
  37. package/dist/components/ui/avatar.cjs +0 -2
  38. package/dist/components/ui/avatar.d.cts +3 -4
  39. package/dist/components/ui/avatar.d.ts +3 -4
  40. package/dist/components/ui/avatar.js +0 -2
  41. package/dist/components/ui/badge.cjs +0 -2
  42. package/dist/components/ui/badge.js +0 -2
  43. package/dist/components/ui/breadcrumb.cjs +0 -2
  44. package/dist/components/ui/breadcrumb.d.cts +7 -8
  45. package/dist/components/ui/breadcrumb.d.ts +7 -8
  46. package/dist/components/ui/breadcrumb.js +0 -2
  47. package/dist/components/ui/button.cjs +0 -2
  48. package/dist/components/ui/button.js +1 -3
  49. package/dist/components/ui/calendar.cjs +0 -2
  50. package/dist/components/ui/calendar.d.cts +1 -2
  51. package/dist/components/ui/calendar.d.ts +1 -2
  52. package/dist/components/ui/calendar.js +1 -3
  53. package/dist/components/ui/card.cjs +0 -2
  54. package/dist/components/ui/card.js +0 -2
  55. package/dist/components/ui/checkbox.cjs +0 -2
  56. package/dist/components/ui/checkbox.js +0 -2
  57. package/dist/components/ui/concept-card.cjs +179 -61
  58. package/dist/components/ui/concept-card.d.cts +3 -3
  59. package/dist/components/ui/concept-card.d.ts +3 -3
  60. package/dist/components/ui/concept-card.js +179 -61
  61. package/dist/components/ui/data-table.cjs +129 -3
  62. package/dist/components/ui/data-table.d.cts +1 -1
  63. package/dist/components/ui/data-table.d.ts +1 -1
  64. package/dist/components/ui/data-table.js +130 -4
  65. package/dist/components/ui/dialog.cjs +0 -2
  66. package/dist/components/ui/dialog.d.cts +2 -3
  67. package/dist/components/ui/dialog.d.ts +2 -3
  68. package/dist/components/ui/dialog.js +0 -2
  69. package/dist/components/ui/dropdown-menu.cjs +0 -2
  70. package/dist/components/ui/dropdown-menu.d.cts +15 -16
  71. package/dist/components/ui/dropdown-menu.d.ts +15 -16
  72. package/dist/components/ui/dropdown-menu.js +0 -2
  73. package/dist/components/ui/filter-provider.cjs +0 -2
  74. package/dist/components/ui/filter-provider.d.cts +1 -2
  75. package/dist/components/ui/filter-provider.d.ts +1 -2
  76. package/dist/components/ui/filter-provider.js +0 -2
  77. package/dist/components/ui/form.cjs +0 -2
  78. package/dist/components/ui/form.d.cts +7 -8
  79. package/dist/components/ui/form.d.ts +7 -8
  80. package/dist/components/ui/form.js +0 -2
  81. package/dist/components/ui/input.cjs +0 -2
  82. package/dist/components/ui/input.js +0 -2
  83. package/dist/components/ui/iran-province-heat.cjs +1 -3
  84. package/dist/components/ui/iran-province-heat.d.cts +1 -1
  85. package/dist/components/ui/iran-province-heat.d.ts +1 -1
  86. package/dist/components/ui/iran-province-heat.js +1 -3
  87. package/dist/components/ui/label.cjs +0 -2
  88. package/dist/components/ui/label.d.cts +1 -2
  89. package/dist/components/ui/label.d.ts +1 -2
  90. package/dist/components/ui/label.js +0 -2
  91. package/dist/components/ui/page-card.cjs +170 -33
  92. package/dist/components/ui/page-card.d.cts +3 -3
  93. package/dist/components/ui/page-card.d.ts +3 -3
  94. package/dist/components/ui/page-card.js +170 -33
  95. package/dist/components/ui/page-header.cjs +128 -2
  96. package/dist/components/ui/page-header.d.cts +1 -1
  97. package/dist/components/ui/page-header.d.ts +1 -1
  98. package/dist/components/ui/page-header.js +128 -2
  99. package/dist/components/ui/password-input.cjs +0 -2
  100. package/dist/components/ui/password-input.js +0 -2
  101. package/dist/components/ui/popover.cjs +0 -2
  102. package/dist/components/ui/popover.js +0 -2
  103. package/dist/components/ui/progress.cjs +1 -3
  104. package/dist/components/ui/progress.js +1 -3
  105. package/dist/components/ui/radio-card.cjs +0 -2
  106. package/dist/components/ui/radio-card.js +0 -2
  107. package/dist/components/ui/radio-group.cjs +0 -2
  108. package/dist/components/ui/radio-group.js +0 -2
  109. package/dist/components/ui/saved-query-card.cjs +0 -2
  110. package/dist/components/ui/saved-query-card.d.cts +1 -1
  111. package/dist/components/ui/saved-query-card.d.ts +1 -1
  112. package/dist/components/ui/saved-query-card.js +1 -3
  113. package/dist/components/ui/scroll-area.cjs +0 -2
  114. package/dist/components/ui/scroll-area.d.cts +2 -3
  115. package/dist/components/ui/scroll-area.d.ts +2 -3
  116. package/dist/components/ui/scroll-area.js +0 -2
  117. package/dist/components/ui/select.cjs +0 -2
  118. package/dist/components/ui/select.d.cts +1 -2
  119. package/dist/components/ui/select.d.ts +1 -2
  120. package/dist/components/ui/select.js +0 -2
  121. package/dist/components/ui/separator.cjs +0 -2
  122. package/dist/components/ui/separator.js +0 -2
  123. package/dist/components/ui/sheet.cjs +0 -2
  124. package/dist/components/ui/sheet.d.cts +9 -10
  125. package/dist/components/ui/sheet.d.ts +9 -10
  126. package/dist/components/ui/sheet.js +0 -2
  127. package/dist/components/ui/skeleton.cjs +0 -2
  128. package/dist/components/ui/skeleton.d.cts +8 -9
  129. package/dist/components/ui/skeleton.d.ts +8 -9
  130. package/dist/components/ui/skeleton.js +0 -2
  131. package/dist/components/ui/slider.cjs +0 -2
  132. package/dist/components/ui/slider.d.cts +1 -2
  133. package/dist/components/ui/slider.d.ts +1 -2
  134. package/dist/components/ui/slider.js +0 -2
  135. package/dist/components/ui/social-platform-badge.cjs +0 -2
  136. package/dist/components/ui/social-platform-badge.js +1 -3
  137. package/dist/components/ui/sonner.cjs +4 -6
  138. package/dist/components/ui/sonner.d.cts +2 -2
  139. package/dist/components/ui/sonner.d.ts +2 -2
  140. package/dist/components/ui/sonner.js +4 -6
  141. package/dist/components/ui/sparkline.cjs +3 -5
  142. package/dist/components/ui/sparkline.d.cts +1 -1
  143. package/dist/components/ui/sparkline.d.ts +1 -1
  144. package/dist/components/ui/sparkline.js +3 -5
  145. package/dist/components/ui/switch.cjs +0 -2
  146. package/dist/components/ui/switch.js +0 -2
  147. package/dist/components/ui/table.cjs +0 -2
  148. package/dist/components/ui/table.d.cts +9 -10
  149. package/dist/components/ui/table.d.ts +9 -10
  150. package/dist/components/ui/table.js +0 -2
  151. package/dist/components/ui/tabs.cjs +0 -2
  152. package/dist/components/ui/tabs.js +0 -2
  153. package/dist/components/ui/textarea.cjs +0 -2
  154. package/dist/components/ui/textarea.js +0 -2
  155. package/dist/components/ui/toggle-group.cjs +0 -2
  156. package/dist/components/ui/toggle-group.d.cts +1 -2
  157. package/dist/components/ui/toggle-group.d.ts +1 -2
  158. package/dist/components/ui/toggle-group.js +0 -2
  159. package/dist/components/ui/tooltip.cjs +0 -2
  160. package/dist/components/ui/tooltip.js +0 -2
  161. package/dist/{concept-card-BoJ5gIJD.d.ts → concept-card-BU8JL-gj.d.cts} +5 -5
  162. package/dist/{concept-card-BXra9mr0.d.cts → concept-card-D7PfDkNR.d.ts} +5 -5
  163. package/dist/hooks/use-hotkey-registry.cjs +0 -2
  164. package/dist/hooks/use-hotkey-registry.d.cts +1 -2
  165. package/dist/hooks/use-hotkey-registry.d.ts +1 -2
  166. package/dist/hooks/use-hotkey-registry.js +0 -2
  167. package/dist/hooks/use-hotkeys.cjs +0 -2
  168. package/dist/hooks/use-hotkeys.js +0 -2
  169. package/dist/{i18n-BfRhV5aw.d.cts → i18n-DD3DMY8O.d.cts} +94 -5
  170. package/dist/{i18n-ewyqbKM-.d.ts → i18n-UEClNsBy.d.ts} +94 -5
  171. package/dist/index.cjs +1321 -1169
  172. package/dist/index.css +8010 -5445
  173. package/dist/index.d.cts +245 -991
  174. package/dist/index.d.ts +245 -991
  175. package/dist/index.js +1283 -1149
  176. package/dist/{page-card-C9XXXOVr.d.cts → page-card-DjztZrFM.d.cts} +4 -4
  177. package/dist/{page-card-DAnbez_f.d.ts → page-card-sIE4lvnb.d.ts} +4 -4
  178. package/dist/server-FTUA8opZ.d.cts +829 -0
  179. package/dist/server-m6tiB6DB.d.ts +829 -0
  180. package/dist/server.cjs +1565 -0
  181. package/dist/server.d.cts +8 -0
  182. package/dist/server.d.ts +8 -0
  183. package/dist/server.js +1483 -0
  184. package/dist/theme.css +50 -0
  185. package/dist/{toggle-group-B8r4LOQw.d.cts → toggle-group-Bis6suuR.d.cts} +3 -4
  186. package/dist/{toggle-group-B8r4LOQw.d.ts → toggle-group-Bis6suuR.d.ts} +3 -4
  187. package/dist/{utils-DlXWmDZ-.d.cts → utils-Czyp5Ned.d.cts} +1 -1
  188. package/dist/{utils-DlXWmDZ-.d.ts → utils-Czyp5Ned.d.ts} +1 -1
  189. package/package.json +455 -187
  190. package/tailwind.config.ts +184 -183
  191. package/dist/components/brand/parto-logo.cjs.map +0 -1
  192. package/dist/components/brand/parto-logo.js.map +0 -1
  193. package/dist/components/charts/PartoAreaChart.cjs.map +0 -1
  194. package/dist/components/charts/PartoAreaChart.js.map +0 -1
  195. package/dist/components/charts/PartoBarChart.cjs.map +0 -1
  196. package/dist/components/charts/PartoBarChart.js.map +0 -1
  197. package/dist/components/charts/PartoLineChart.cjs.map +0 -1
  198. package/dist/components/charts/PartoLineChart.js.map +0 -1
  199. package/dist/components/charts/PartoPieChart.cjs.map +0 -1
  200. package/dist/components/charts/PartoPieChart.js.map +0 -1
  201. package/dist/components/ui/accordion.cjs.map +0 -1
  202. package/dist/components/ui/accordion.js.map +0 -1
  203. package/dist/components/ui/alert-dialog.cjs.map +0 -1
  204. package/dist/components/ui/alert-dialog.js.map +0 -1
  205. package/dist/components/ui/alert-rule-card.cjs.map +0 -1
  206. package/dist/components/ui/alert-rule-card.js.map +0 -1
  207. package/dist/components/ui/alert.cjs.map +0 -1
  208. package/dist/components/ui/alert.js.map +0 -1
  209. package/dist/components/ui/app-bar.cjs.map +0 -1
  210. package/dist/components/ui/app-bar.js.map +0 -1
  211. package/dist/components/ui/avatar.cjs.map +0 -1
  212. package/dist/components/ui/avatar.js.map +0 -1
  213. package/dist/components/ui/badge.cjs.map +0 -1
  214. package/dist/components/ui/badge.js.map +0 -1
  215. package/dist/components/ui/breadcrumb.cjs.map +0 -1
  216. package/dist/components/ui/breadcrumb.js.map +0 -1
  217. package/dist/components/ui/button.cjs.map +0 -1
  218. package/dist/components/ui/button.js.map +0 -1
  219. package/dist/components/ui/calendar.cjs.map +0 -1
  220. package/dist/components/ui/calendar.js.map +0 -1
  221. package/dist/components/ui/card.cjs.map +0 -1
  222. package/dist/components/ui/card.js.map +0 -1
  223. package/dist/components/ui/checkbox.cjs.map +0 -1
  224. package/dist/components/ui/checkbox.js.map +0 -1
  225. package/dist/components/ui/concept-card.cjs.map +0 -1
  226. package/dist/components/ui/concept-card.js.map +0 -1
  227. package/dist/components/ui/data-table.cjs.map +0 -1
  228. package/dist/components/ui/data-table.js.map +0 -1
  229. package/dist/components/ui/dialog.cjs.map +0 -1
  230. package/dist/components/ui/dialog.js.map +0 -1
  231. package/dist/components/ui/dropdown-menu.cjs.map +0 -1
  232. package/dist/components/ui/dropdown-menu.js.map +0 -1
  233. package/dist/components/ui/filter-provider.cjs.map +0 -1
  234. package/dist/components/ui/filter-provider.js.map +0 -1
  235. package/dist/components/ui/form.cjs.map +0 -1
  236. package/dist/components/ui/form.js.map +0 -1
  237. package/dist/components/ui/input.cjs.map +0 -1
  238. package/dist/components/ui/input.js.map +0 -1
  239. package/dist/components/ui/iran-province-heat.cjs.map +0 -1
  240. package/dist/components/ui/iran-province-heat.js.map +0 -1
  241. package/dist/components/ui/label.cjs.map +0 -1
  242. package/dist/components/ui/label.js.map +0 -1
  243. package/dist/components/ui/page-card.cjs.map +0 -1
  244. package/dist/components/ui/page-card.js.map +0 -1
  245. package/dist/components/ui/page-header.cjs.map +0 -1
  246. package/dist/components/ui/page-header.js.map +0 -1
  247. package/dist/components/ui/password-input.cjs.map +0 -1
  248. package/dist/components/ui/password-input.js.map +0 -1
  249. package/dist/components/ui/popover.cjs.map +0 -1
  250. package/dist/components/ui/popover.js.map +0 -1
  251. package/dist/components/ui/progress.cjs.map +0 -1
  252. package/dist/components/ui/progress.js.map +0 -1
  253. package/dist/components/ui/radio-card.cjs.map +0 -1
  254. package/dist/components/ui/radio-card.js.map +0 -1
  255. package/dist/components/ui/radio-group.cjs.map +0 -1
  256. package/dist/components/ui/radio-group.js.map +0 -1
  257. package/dist/components/ui/saved-query-card.cjs.map +0 -1
  258. package/dist/components/ui/saved-query-card.js.map +0 -1
  259. package/dist/components/ui/scroll-area.cjs.map +0 -1
  260. package/dist/components/ui/scroll-area.js.map +0 -1
  261. package/dist/components/ui/select.cjs.map +0 -1
  262. package/dist/components/ui/select.js.map +0 -1
  263. package/dist/components/ui/separator.cjs.map +0 -1
  264. package/dist/components/ui/separator.js.map +0 -1
  265. package/dist/components/ui/sheet.cjs.map +0 -1
  266. package/dist/components/ui/sheet.js.map +0 -1
  267. package/dist/components/ui/skeleton.cjs.map +0 -1
  268. package/dist/components/ui/skeleton.js.map +0 -1
  269. package/dist/components/ui/slider.cjs.map +0 -1
  270. package/dist/components/ui/slider.js.map +0 -1
  271. package/dist/components/ui/social-platform-badge.cjs.map +0 -1
  272. package/dist/components/ui/social-platform-badge.js.map +0 -1
  273. package/dist/components/ui/sonner.cjs.map +0 -1
  274. package/dist/components/ui/sonner.js.map +0 -1
  275. package/dist/components/ui/sparkline.cjs.map +0 -1
  276. package/dist/components/ui/sparkline.js.map +0 -1
  277. package/dist/components/ui/switch.cjs.map +0 -1
  278. package/dist/components/ui/switch.js.map +0 -1
  279. package/dist/components/ui/table.cjs.map +0 -1
  280. package/dist/components/ui/table.js.map +0 -1
  281. package/dist/components/ui/tabs.cjs.map +0 -1
  282. package/dist/components/ui/tabs.js.map +0 -1
  283. package/dist/components/ui/textarea.cjs.map +0 -1
  284. package/dist/components/ui/textarea.js.map +0 -1
  285. package/dist/components/ui/toggle-group.cjs.map +0 -1
  286. package/dist/components/ui/toggle-group.js.map +0 -1
  287. package/dist/components/ui/tooltip.cjs.map +0 -1
  288. package/dist/components/ui/tooltip.js.map +0 -1
  289. package/dist/hooks/use-hotkey-registry.cjs.map +0 -1
  290. package/dist/hooks/use-hotkey-registry.js.map +0 -1
  291. package/dist/hooks/use-hotkeys.cjs.map +0 -1
  292. package/dist/hooks/use-hotkeys.js.map +0 -1
  293. package/dist/index.cjs.map +0 -1
  294. package/dist/index.js.map +0 -1
@@ -0,0 +1,1565 @@
1
+ 'use strict';
2
+
3
+ var clsx = require('clsx');
4
+ var tailwindMerge = require('tailwind-merge');
5
+ var dateFnsJalali = require('date-fns-jalali');
6
+ var locale = require('date-fns-jalali/locale');
7
+ var lucideReact = require('lucide-react');
8
+
9
+ // src/lib/utils.ts
10
+ var PERSIAN_MONTHS = [
11
+ "\u0641\u0631\u0648\u0631\u062F\u06CC\u0646",
12
+ "\u0627\u0631\u062F\u06CC\u0628\u0647\u0634\u062A",
13
+ "\u062E\u0631\u062F\u0627\u062F",
14
+ "\u062A\u06CC\u0631",
15
+ "\u0645\u0631\u062F\u0627\u062F",
16
+ "\u0634\u0647\u0631\u06CC\u0648\u0631",
17
+ "\u0645\u0647\u0631",
18
+ "\u0622\u0628\u0627\u0646",
19
+ "\u0622\u0630\u0631",
20
+ "\u062F\u06CC",
21
+ "\u0628\u0647\u0645\u0646",
22
+ "\u0627\u0633\u0641\u0646\u062F"
23
+ ];
24
+ var PERSIAN_MONTHS_SHORT = ["\u0641\u0631\u0648", "\u0627\u0631\u062F", "\u062E\u0631\u062F", "\u062A\u06CC\u0631", "\u0645\u0631\u062F", "\u0634\u0647\u0631", "\u0645\u0647\u0631", "\u0622\u0628\u0627", "\u0622\u0630\u0631", "\u062F\u06CC", "\u0628\u0647\u0645", "\u0627\u0633\u0641"];
25
+ var PERSIAN_WEEKDAYS = ["\u06CC\u06A9\u0634\u0646\u0628\u0647", "\u062F\u0648\u0634\u0646\u0628\u0647", "\u0633\u0647\u200C\u0634\u0646\u0628\u0647", "\u0686\u0647\u0627\u0631\u0634\u0646\u0628\u0647", "\u067E\u0646\u062C\u200C\u0634\u0646\u0628\u0647", "\u062C\u0645\u0639\u0647", "\u0634\u0646\u0628\u0647"];
26
+ var PERSIAN_WEEKDAYS_SHORT = ["\u06CC", "\u062F", "\u0633", "\u0686", "\u067E", "\u062C", "\u0634"];
27
+ function toPersianDigits(num) {
28
+ const persianDigits = ["\u06F0", "\u06F1", "\u06F2", "\u06F3", "\u06F4", "\u06F5", "\u06F6", "\u06F7", "\u06F8", "\u06F9"];
29
+ return String(num).replace(/\d/g, (digit) => persianDigits[parseInt(digit)]);
30
+ }
31
+ function toEnglishDigits(str) {
32
+ const persianDigits = ["\u06F0", "\u06F1", "\u06F2", "\u06F3", "\u06F4", "\u06F5", "\u06F6", "\u06F7", "\u06F8", "\u06F9"];
33
+ const arabicDigits = ["\u0660", "\u0661", "\u0662", "\u0663", "\u0664", "\u0665", "\u0666", "\u0667", "\u0668", "\u0669"];
34
+ return str.replace(/[۰-۹]/g, (digit) => String(persianDigits.indexOf(digit))).replace(/[٠-٩]/g, (digit) => String(arabicDigits.indexOf(digit)));
35
+ }
36
+ function formatJalaliDate(date, formatStr = "yyyy/MM/dd") {
37
+ return dateFnsJalali.format(date, formatStr, { locale: locale.faIR });
38
+ }
39
+ function getPersianMonthName(date) {
40
+ const monthIndex = dateFnsJalali.getMonth(date);
41
+ return PERSIAN_MONTHS[monthIndex];
42
+ }
43
+ function getPersianMonthNameShort(date) {
44
+ const monthIndex = dateFnsJalali.getMonth(date);
45
+ return PERSIAN_MONTHS_SHORT[monthIndex];
46
+ }
47
+ function getPersianWeekdayName(date, short = false) {
48
+ if (short) return dateFnsJalali.format(date, "EEEEE", { locale: locale.faIR });
49
+ return dateFnsJalali.format(date, "EEEE", { locale: locale.faIR });
50
+ }
51
+ function getPersianYear(date) {
52
+ return dateFnsJalali.getYear(date);
53
+ }
54
+ function getPersianMonth(date) {
55
+ return dateFnsJalali.getMonth(date);
56
+ }
57
+ function getPersianDay(date) {
58
+ return dateFnsJalali.getDate(date);
59
+ }
60
+ function jalaliToGregorian(year, month, day) {
61
+ const dateStr = `${year}/${month + 1}/${day}`;
62
+ return dateFnsJalali.parse(dateStr, "yyyy/M/d", /* @__PURE__ */ new Date(), { locale: locale.faIR });
63
+ }
64
+ function formatPersianDateRange(from, to) {
65
+ const fromYear = dateFnsJalali.getYear(from);
66
+ const toYear = dateFnsJalali.getYear(to);
67
+ const fromMonth = dateFnsJalali.getMonth(from);
68
+ const toMonth = dateFnsJalali.getMonth(to);
69
+ const fromDay = dateFnsJalali.getDate(from);
70
+ const toDay = dateFnsJalali.getDate(to);
71
+ if (fromYear === toYear && fromMonth === toMonth && fromDay === toDay) {
72
+ return `${toPersianDigits(fromDay)} ${PERSIAN_MONTHS[fromMonth]} ${toPersianDigits(fromYear)}`;
73
+ }
74
+ if (fromYear === toYear && fromMonth === toMonth) {
75
+ return `${toPersianDigits(fromDay)} - ${toPersianDigits(toDay)} ${PERSIAN_MONTHS[fromMonth]} ${toPersianDigits(fromYear)}`;
76
+ }
77
+ if (fromYear === toYear) {
78
+ return `${toPersianDigits(fromDay)} ${PERSIAN_MONTHS[fromMonth]} - ${toPersianDigits(toDay)} ${PERSIAN_MONTHS[toMonth]} ${toPersianDigits(fromYear)}`;
79
+ }
80
+ return `${toPersianDigits(fromDay)} ${PERSIAN_MONTHS[fromMonth]} ${toPersianDigits(fromYear)} - ${toPersianDigits(toDay)} ${PERSIAN_MONTHS[toMonth]} ${toPersianDigits(toYear)}`;
81
+ }
82
+ function getPersianMonthsForDropdown() {
83
+ return PERSIAN_MONTHS.map((month, index) => ({
84
+ value: index,
85
+ label: month
86
+ }));
87
+ }
88
+ function getPersianYearsForDropdown(fromYear, toYear) {
89
+ const years = [];
90
+ for (let year = fromYear; year <= toYear; year++) {
91
+ years.push({
92
+ value: year,
93
+ label: toPersianDigits(year)
94
+ });
95
+ }
96
+ return years;
97
+ }
98
+
99
+ // src/lib/utils.ts
100
+ function cn(...inputs) {
101
+ return tailwindMerge.twMerge(clsx.clsx(inputs));
102
+ }
103
+ function convertToLocalNumbers(text, locale) {
104
+ if (locale === "fa" || locale === "ar") {
105
+ const persianDigits = ["\u06F0", "\u06F1", "\u06F2", "\u06F3", "\u06F4", "\u06F5", "\u06F6", "\u06F7", "\u06F8", "\u06F9"];
106
+ return String(text).replace(/\d/g, (digit) => persianDigits[parseInt(digit)]);
107
+ }
108
+ return String(text);
109
+ }
110
+ function formatLargeNumber(num, locale) {
111
+ if (num >= 1e9) {
112
+ const formatted = (num / 1e9).toFixed(1).replace(/\.0$/, "");
113
+ return convertToLocalNumbers(formatted, locale) + (locale === "en" ? "B" : " \u0645\u06CC\u0644\u06CC\u0627\u0631\u062F");
114
+ }
115
+ if (num >= 1e6) {
116
+ const formatted = (num / 1e6).toFixed(1).replace(/\.0$/, "");
117
+ return convertToLocalNumbers(formatted, locale) + (locale === "en" ? "M" : " \u0645\u06CC\u0644\u06CC\u0648\u0646");
118
+ }
119
+ if (num >= 1e3) {
120
+ const formatted = (num / 1e3).toFixed(1).replace(/\.0$/, "");
121
+ return convertToLocalNumbers(formatted, locale) + (locale === "en" ? "K" : " \u0647\u0632\u0627\u0631");
122
+ }
123
+ return convertToLocalNumbers(num.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ","), locale);
124
+ }
125
+ function formatNumber(num, format2 = "exact") {
126
+ if (num === void 0 || num === null) return "0";
127
+ if (format2 === "exact") {
128
+ return num.toLocaleString("en-US");
129
+ }
130
+ if (num >= 1e9) {
131
+ return `${(num / 1e9).toFixed(1).replace(/\.0$/, "")}B`;
132
+ }
133
+ if (num >= 1e6) {
134
+ return `${(num / 1e6).toFixed(1).replace(/\.0$/, "")}M`;
135
+ }
136
+ if (num >= 1e3) {
137
+ return `${(num / 1e3).toFixed(1).replace(/\.0$/, "")}K`;
138
+ }
139
+ return num.toString();
140
+ }
141
+ function formatRelativeTime(date) {
142
+ const now = /* @__PURE__ */ new Date();
143
+ const then = new Date(date);
144
+ const diffInSeconds = Math.floor((now.getTime() - then.getTime()) / 1e3);
145
+ if (diffInSeconds < 60) {
146
+ return "\u0647\u0645\u06CC\u0646 \u0627\u0644\u0627\u0646";
147
+ }
148
+ const diffInMinutes = Math.floor(diffInSeconds / 60);
149
+ if (diffInMinutes < 60) {
150
+ return `${convertToLocalNumbers(diffInMinutes, "fa")} \u062F\u0642\u06CC\u0642\u0647 \u067E\u06CC\u0634`;
151
+ }
152
+ const diffInHours = Math.floor(diffInMinutes / 60);
153
+ if (diffInHours < 24) {
154
+ return `${convertToLocalNumbers(diffInHours, "fa")} \u0633\u0627\u0639\u062A \u067E\u06CC\u0634`;
155
+ }
156
+ const diffInDays = Math.floor(diffInHours / 24);
157
+ if (diffInDays < 7) {
158
+ return `${convertToLocalNumbers(diffInDays, "fa")} \u0631\u0648\u0632 \u067E\u06CC\u0634`;
159
+ }
160
+ const diffInWeeks = Math.floor(diffInDays / 7);
161
+ if (diffInWeeks < 4) {
162
+ return `${convertToLocalNumbers(diffInWeeks, "fa")} \u0647\u0641\u062A\u0647 \u067E\u06CC\u0634`;
163
+ }
164
+ const diffInMonths = Math.floor(diffInDays / 30);
165
+ if (diffInMonths < 12) {
166
+ return `${convertToLocalNumbers(diffInMonths, "fa")} \u0645\u0627\u0647 \u067E\u06CC\u0634`;
167
+ }
168
+ const diffInYears = Math.floor(diffInDays / 365);
169
+ return `${convertToLocalNumbers(diffInYears, "fa")} \u0633\u0627\u0644 \u067E\u06CC\u0634`;
170
+ }
171
+ function formatAbsoluteTime(date) {
172
+ const d = new Date(date);
173
+ return formatJalaliDate(d, "d MMMM yyyy\u060C HH:mm");
174
+ }
175
+
176
+ // src/lib/engagement-utils.ts
177
+ var ENGAGEMENT_RANGES = {
178
+ nano: {
179
+ followers: [1e3, 1e4],
180
+ excellent: 6,
181
+ veryGood: [5, 6],
182
+ good: [4, 5],
183
+ average: [3, 4],
184
+ couldBeImproved: [1, 3],
185
+ low: 1
186
+ },
187
+ micro: {
188
+ followers: [1e4, 1e5],
189
+ excellent: 4,
190
+ veryGood: [3, 4],
191
+ good: [2, 3],
192
+ average: [1, 2],
193
+ couldBeImproved: [0.5, 1],
194
+ low: 0.5
195
+ },
196
+ mid: {
197
+ followers: [1e5, 5e5],
198
+ excellent: 3,
199
+ veryGood: [2.5, 3],
200
+ good: [1.5, 2.5],
201
+ average: [1, 1.5],
202
+ couldBeImproved: [0.5, 1],
203
+ low: 0.5
204
+ },
205
+ macro: {
206
+ followers: [5e5, 1e6],
207
+ excellent: 2,
208
+ veryGood: [1.5, 2],
209
+ good: [1, 1.5],
210
+ average: [0.5, 1],
211
+ couldBeImproved: [0.2, 0.5],
212
+ low: 0.2
213
+ },
214
+ mega: {
215
+ followers: [1e6, Infinity],
216
+ excellent: 1,
217
+ veryGood: [0.8, 1],
218
+ good: [0.5, 0.8],
219
+ average: [0.3, 0.5],
220
+ couldBeImproved: [0.1, 0.3],
221
+ low: 0.1
222
+ }
223
+ };
224
+ var TIER_LABELS = {
225
+ fa: {
226
+ excellent: "\u0639\u0627\u0644\u06CC",
227
+ veryGood: "\u062E\u06CC\u0644\u06CC \u062E\u0648\u0628",
228
+ good: "\u062E\u0648\u0628",
229
+ average: "\u0645\u062A\u0648\u0633\u0637",
230
+ couldBeImproved: "\u0642\u0627\u0628\u0644 \u0628\u0647\u0628\u0648\u062F",
231
+ low: "\u0636\u0639\u06CC\u0641"
232
+ },
233
+ ar: {
234
+ excellent: "\u0645\u0645\u062A\u0627\u0632",
235
+ veryGood: "\u062C\u064A\u062F \u062C\u062F\u0627\u064B",
236
+ good: "\u062C\u064A\u062F",
237
+ average: "\u0645\u062A\u0648\u0633\u0637",
238
+ couldBeImproved: "\u0642\u0627\u0628\u0644 \u0644\u0644\u062A\u062D\u0633\u064A\u0646",
239
+ low: "\u0636\u0639\u064A\u0641"
240
+ },
241
+ en: {
242
+ excellent: "Excellent",
243
+ veryGood: "Very Good",
244
+ good: "Good",
245
+ average: "Average",
246
+ couldBeImproved: "Could Be Improved",
247
+ low: "Low"
248
+ }
249
+ };
250
+ var GROUP_LABELS = {
251
+ fa: { nano: "\u0646\u0627\u0646\u0648", micro: "\u0645\u06CC\u06A9\u0631\u0648", mid: "\u0645\u062A\u0648\u0633\u0637", macro: "\u0645\u0627\u06A9\u0631\u0648", mega: "\u0645\u06AF\u0627" },
252
+ ar: { nano: "\u0646\u0627\u0646\u0648", micro: "\u0645\u064A\u0643\u0631\u0648", mid: "\u0645\u062A\u0648\u0633\u0637", macro: "\u0645\u0627\u0643\u0631\u0648", mega: "\u0645\u064A\u062C\u0627" },
253
+ en: { nano: "Nano", micro: "Micro", mid: "Mid", macro: "Macro", mega: "Mega" }
254
+ };
255
+ var TIER_COLORS = {
256
+ excellent: {
257
+ color: "var(--engagement-excellent)",
258
+ colorFaded: "color-mix(in srgb, var(--engagement-excellent) 10%, transparent)",
259
+ hoverColor: "var(--engagement-excellent-hover)",
260
+ contrastText: "#fff"
261
+ // hover bg lightness 14-19% — white OK
262
+ },
263
+ veryGood: {
264
+ color: "var(--engagement-very-good)",
265
+ colorFaded: "color-mix(in srgb, var(--engagement-very-good) 10%, transparent)",
266
+ hoverColor: "var(--engagement-very-good-hover)",
267
+ contrastText: "#fff"
268
+ // hover bg lightness 35% — white OK
269
+ },
270
+ good: {
271
+ color: "var(--engagement-good)",
272
+ colorFaded: "color-mix(in srgb, var(--engagement-good) 10%, transparent)",
273
+ hoverColor: "var(--engagement-good-hover)",
274
+ contrastText: "#fff"
275
+ // hover bg lightness 35% — white OK
276
+ },
277
+ average: {
278
+ color: "var(--engagement-average)",
279
+ colorFaded: "color-mix(in srgb, var(--engagement-average) 10%, transparent)",
280
+ hoverColor: "var(--engagement-average-hover)",
281
+ contrastText: "#000"
282
+ // hover bg lightness 42% amber — dark text for contrast
283
+ },
284
+ couldBeImproved: {
285
+ color: "var(--engagement-low)",
286
+ colorFaded: "color-mix(in srgb, var(--engagement-low) 10%, transparent)",
287
+ hoverColor: "var(--engagement-low-hover)",
288
+ contrastText: "#000"
289
+ // hover bg lightness 45% orange — dark text for contrast
290
+ },
291
+ low: {
292
+ color: "var(--engagement-poor)",
293
+ colorFaded: "color-mix(in srgb, var(--engagement-poor) 10%, transparent)",
294
+ hoverColor: "var(--engagement-poor-hover)",
295
+ contrastText: "#fff"
296
+ // hover bg lightness 51% red — white OK (high saturation red)
297
+ }
298
+ };
299
+ function getFollowerGroup(followers) {
300
+ for (const [key, value] of Object.entries(ENGAGEMENT_RANGES)) {
301
+ if (followers >= value.followers[0] && followers < value.followers[1]) {
302
+ return key;
303
+ }
304
+ }
305
+ return followers < 1e3 ? "nano" : "mega";
306
+ }
307
+ function getEngagementRanges(followers, locale) {
308
+ const group = getFollowerGroup(followers);
309
+ const r = ENGAGEMENT_RANGES[group];
310
+ const t = TIER_LABELS[locale];
311
+ const tiers = [
312
+ { tier: "excellent", min: r.excellent, max: Infinity, display: `>${r.excellent}%` },
313
+ { tier: "veryGood", min: r.veryGood[0], max: r.veryGood[1], display: `${r.veryGood[0]}% - ${r.veryGood[1]}%` },
314
+ { tier: "good", min: r.good[0], max: r.good[1], display: `${r.good[0]}% - ${r.good[1]}%` },
315
+ { tier: "average", min: r.average[0], max: r.average[1], display: `${r.average[0]}% - ${r.average[1]}%` },
316
+ {
317
+ tier: "couldBeImproved",
318
+ min: r.couldBeImproved[0],
319
+ max: r.couldBeImproved[1],
320
+ display: `${r.couldBeImproved[0]}% - ${r.couldBeImproved[1]}%`
321
+ },
322
+ { tier: "low", min: 0, max: r.low, display: `<${r.low}%` }
323
+ ];
324
+ return tiers.map(({ tier, min, max, display }) => ({
325
+ label: t[tier],
326
+ min,
327
+ max,
328
+ display,
329
+ ...TIER_COLORS[tier]
330
+ }));
331
+ }
332
+ function getCurrentRangeIndex(currentRate, ranges) {
333
+ const currentRatePercent = currentRate * 100;
334
+ return ranges.findIndex(
335
+ (range) => currentRatePercent >= range.min && (range.max === Infinity ? true : currentRatePercent <= range.max)
336
+ );
337
+ }
338
+
339
+ // src/lib/iran-provinces.ts
340
+ var IRAN_PROVINCES = [
341
+ {
342
+ slug: "east-azerbaijan",
343
+ iso: "IR-01",
344
+ 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" }
345
+ },
346
+ {
347
+ slug: "west-azerbaijan",
348
+ iso: "IR-02",
349
+ 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" }
350
+ },
351
+ { slug: "ardabil", iso: "IR-03", labels: { fa: "\u0627\u0631\u062F\u0628\u06CC\u0644", ar: "\u0623\u0631\u062F\u0628\u064A\u0644", en: "Ardabil" } },
352
+ { slug: "isfahan", iso: "IR-04", labels: { fa: "\u0627\u0635\u0641\u0647\u0627\u0646", ar: "\u0623\u0635\u0641\u0647\u0627\u0646", en: "Isfahan" } },
353
+ { slug: "ilam", iso: "IR-05", labels: { fa: "\u0627\u06CC\u0644\u0627\u0645", ar: "\u0625\u064A\u0644\u0627\u0645", en: "Ilam" } },
354
+ { slug: "bushehr", iso: "IR-06", labels: { fa: "\u0628\u0648\u0634\u0647\u0631", ar: "\u0628\u0648\u0634\u0647\u0631", en: "Bushehr" } },
355
+ { slug: "tehran", iso: "IR-07", labels: { fa: "\u062A\u0647\u0631\u0627\u0646", ar: "\u0637\u0647\u0631\u0627\u0646", en: "Tehran" } },
356
+ {
357
+ slug: "chaharmahal-bakhtiari",
358
+ iso: "IR-08",
359
+ 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" }
360
+ },
361
+ { 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" } },
362
+ { slug: "khuzestan", iso: "IR-10", labels: { fa: "\u062E\u0648\u0632\u0633\u062A\u0627\u0646", ar: "\u062E\u0648\u0632\u0633\u062A\u0627\u0646", en: "Khuzestan" } },
363
+ { slug: "zanjan", iso: "IR-11", labels: { fa: "\u0632\u0646\u062C\u0627\u0646", ar: "\u0632\u0646\u062C\u0627\u0646", en: "Zanjan" } },
364
+ { slug: "semnan", iso: "IR-12", labels: { fa: "\u0633\u0645\u0646\u0627\u0646", ar: "\u0633\u0645\u0646\u0627\u0646", en: "Semnan" } },
365
+ {
366
+ slug: "sistan-baluchestan",
367
+ iso: "IR-13",
368
+ 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" }
369
+ },
370
+ { slug: "fars", iso: "IR-14", labels: { fa: "\u0641\u0627\u0631\u0633", ar: "\u0641\u0627\u0631\u0633", en: "Fars" } },
371
+ { slug: "kerman", iso: "IR-15", labels: { fa: "\u06A9\u0631\u0645\u0627\u0646", ar: "\u0643\u0631\u0645\u0627\u0646", en: "Kerman" } },
372
+ { slug: "kurdistan", iso: "IR-16", labels: { fa: "\u06A9\u0631\u062F\u0633\u062A\u0627\u0646", ar: "\u0643\u0631\u062F\u0633\u062A\u0627\u0646", en: "Kurdistan" } },
373
+ { 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" } },
374
+ {
375
+ slug: "kohgiluyeh-boyer-ahmad",
376
+ iso: "IR-18",
377
+ 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" }
378
+ },
379
+ { slug: "gilan", iso: "IR-19", labels: { fa: "\u06AF\u06CC\u0644\u0627\u0646", ar: "\u062C\u064A\u0644\u0627\u0646", en: "Gilan" } },
380
+ { slug: "lorestan", iso: "IR-20", labels: { fa: "\u0644\u0631\u0633\u062A\u0627\u0646", ar: "\u0644\u0631\u0633\u062A\u0627\u0646", en: "Lorestan" } },
381
+ { 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" } },
382
+ { slug: "markazi", iso: "IR-22", labels: { fa: "\u0645\u0631\u06A9\u0632\u06CC", ar: "\u0645\u0631\u0643\u0632\u064A", en: "Markazi" } },
383
+ { slug: "hormozgan", iso: "IR-23", labels: { fa: "\u0647\u0631\u0645\u0632\u06AF\u0627\u0646", ar: "\u0647\u0631\u0645\u0632\u063A\u0627\u0646", en: "Hormozgan" } },
384
+ { slug: "hamadan", iso: "IR-24", labels: { fa: "\u0647\u0645\u062F\u0627\u0646", ar: "\u0647\u0645\u062F\u0627\u0646", en: "Hamadan" } },
385
+ { slug: "yazd", iso: "IR-25", labels: { fa: "\u06CC\u0632\u062F", ar: "\u064A\u0632\u062F", en: "Yazd" } },
386
+ { slug: "qom", iso: "IR-26", labels: { fa: "\u0642\u0645", ar: "\u0642\u0645", en: "Qom" } },
387
+ { slug: "golestan", iso: "IR-27", labels: { fa: "\u06AF\u0644\u0633\u062A\u0627\u0646", ar: "\u063A\u0648\u0644\u0633\u062A\u0627\u0646", en: "Golestan" } },
388
+ { slug: "qazvin", iso: "IR-28", labels: { fa: "\u0642\u0632\u0648\u06CC\u0646", ar: "\u0642\u0632\u0648\u064A\u0646", en: "Qazvin" } },
389
+ { 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" } },
390
+ { 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" } },
391
+ { slug: "alborz", iso: "IR-31", labels: { fa: "\u0627\u0644\u0628\u0631\u0632", ar: "\u0627\u0644\u0628\u0631\u0632", en: "Alborz" } }
392
+ ];
393
+ var SLUG_INDEX = new Map(IRAN_PROVINCES.map((p) => [p.slug, p]));
394
+ var ISO_INDEX = new Map(IRAN_PROVINCES.map((p) => [p.iso, p]));
395
+ function findProvince(codeOrSlug) {
396
+ return SLUG_INDEX.get(codeOrSlug) ?? ISO_INDEX.get(codeOrSlug);
397
+ }
398
+ function getProvinceLabel(codeOrSlug, locale = "fa") {
399
+ const p = findProvince(codeOrSlug);
400
+ if (!p) return codeOrSlug;
401
+ return p.labels[locale] ?? p.labels.fa;
402
+ }
403
+
404
+ // src/lib/countries.ts
405
+ function countryFlag(code) {
406
+ const upper = code.toUpperCase();
407
+ if (upper.length !== 2) return "";
408
+ const A = 127462;
409
+ const offset = (c) => A + (c.charCodeAt(0) - "A".charCodeAt(0));
410
+ return String.fromCodePoint(offset(upper[0])) + String.fromCodePoint(offset(upper[1]));
411
+ }
412
+ var COUNTRIES = [
413
+ // Iran + neighbors
414
+ { code: "IR", labels: { fa: "\u0627\u06CC\u0631\u0627\u0646", ar: "\u0625\u064A\u0631\u0627\u0646", en: "Iran" } },
415
+ { code: "IQ", labels: { fa: "\u0639\u0631\u0627\u0642", ar: "\u0627\u0644\u0639\u0631\u0627\u0642", en: "Iraq" } },
416
+ { code: "TR", labels: { fa: "\u062A\u0631\u06A9\u06CC\u0647", ar: "\u062A\u0631\u0643\u064A\u0627", en: "Turkey" } },
417
+ { code: "AF", labels: { fa: "\u0627\u0641\u063A\u0627\u0646\u0633\u062A\u0627\u0646", ar: "\u0623\u0641\u063A\u0627\u0646\u0633\u062A\u0627\u0646", en: "Afghanistan" } },
418
+ { code: "PK", labels: { fa: "\u067E\u0627\u06A9\u0633\u062A\u0627\u0646", ar: "\u0628\u0627\u0643\u0633\u062A\u0627\u0646", en: "Pakistan" } },
419
+ { code: "AZ", labels: { fa: "\u0622\u0630\u0631\u0628\u0627\u06CC\u062C\u0627\u0646", ar: "\u0623\u0630\u0631\u0628\u064A\u062C\u0627\u0646", en: "Azerbaijan" } },
420
+ { code: "AM", labels: { fa: "\u0627\u0631\u0645\u0646\u0633\u062A\u0627\u0646", ar: "\u0623\u0631\u0645\u064A\u0646\u064A\u0627", en: "Armenia" } },
421
+ { code: "TM", labels: { fa: "\u062A\u0631\u06A9\u0645\u0646\u0633\u062A\u0627\u0646", ar: "\u062A\u0631\u0643\u0645\u0627\u0646\u0633\u062A\u0627\u0646", en: "Turkmenistan" } },
422
+ // Gulf
423
+ { code: "SA", labels: { fa: "\u0639\u0631\u0628\u0633\u062A\u0627\u0646 \u0633\u0639\u0648\u062F\u06CC", ar: "\u0627\u0644\u0633\u0639\u0648\u062F\u064A\u0629", en: "Saudi Arabia" } },
424
+ { code: "AE", labels: { fa: "\u0627\u0645\u0627\u0631\u0627\u062A", ar: "\u0627\u0644\u0625\u0645\u0627\u0631\u0627\u062A", en: "United Arab Emirates" } },
425
+ { code: "QA", labels: { fa: "\u0642\u0637\u0631", ar: "\u0642\u0637\u0631", en: "Qatar" } },
426
+ { code: "KW", labels: { fa: "\u06A9\u0648\u06CC\u062A", ar: "\u0627\u0644\u0643\u0648\u064A\u062A", en: "Kuwait" } },
427
+ { code: "BH", labels: { fa: "\u0628\u062D\u0631\u06CC\u0646", ar: "\u0627\u0644\u0628\u062D\u0631\u064A\u0646", en: "Bahrain" } },
428
+ { code: "OM", labels: { fa: "\u0639\u0645\u0627\u0646", ar: "\u0639\u064F\u0645\u0627\u0646", en: "Oman" } },
429
+ { code: "YE", labels: { fa: "\u06CC\u0645\u0646", ar: "\u0627\u0644\u064A\u0645\u0646", en: "Yemen" } },
430
+ // Levant + North Africa
431
+ { code: "SY", labels: { fa: "\u0633\u0648\u0631\u06CC\u0647", ar: "\u0633\u0648\u0631\u064A\u0627", en: "Syria" } },
432
+ { code: "LB", labels: { fa: "\u0644\u0628\u0646\u0627\u0646", ar: "\u0644\u0628\u0646\u0627\u0646", en: "Lebanon" } },
433
+ { code: "JO", labels: { fa: "\u0627\u0631\u062F\u0646", ar: "\u0627\u0644\u0623\u0631\u062F\u0646", en: "Jordan" } },
434
+ { code: "PS", labels: { fa: "\u0641\u0644\u0633\u0637\u06CC\u0646", ar: "\u0641\u0644\u0633\u0637\u064A\u0646", en: "Palestine" } },
435
+ { code: "IL", labels: { fa: "\u0627\u0633\u0631\u0627\u0626\u06CC\u0644", ar: "\u0625\u0633\u0631\u0627\u0626\u064A\u0644", en: "Israel" } },
436
+ { code: "EG", labels: { fa: "\u0645\u0635\u0631", ar: "\u0645\u0635\u0631", en: "Egypt" } },
437
+ { code: "LY", labels: { fa: "\u0644\u06CC\u0628\u06CC", ar: "\u0644\u064A\u0628\u064A\u0627", en: "Libya" } },
438
+ { code: "TN", labels: { fa: "\u062A\u0648\u0646\u0633", ar: "\u062A\u0648\u0646\u0633", en: "Tunisia" } },
439
+ { code: "DZ", labels: { fa: "\u0627\u0644\u062C\u0632\u0627\u06CC\u0631", ar: "\u0627\u0644\u062C\u0632\u0627\u0626\u0631", en: "Algeria" } },
440
+ { code: "MA", labels: { fa: "\u0645\u0631\u0627\u06A9\u0634", ar: "\u0627\u0644\u0645\u063A\u0631\u0628", en: "Morocco" } },
441
+ { code: "SD", labels: { fa: "\u0633\u0648\u062F\u0627\u0646", ar: "\u0627\u0644\u0633\u0648\u062F\u0627\u0646", en: "Sudan" } },
442
+ // Sub-Saharan Africa (selected)
443
+ { code: "NG", labels: { fa: "\u0646\u06CC\u062C\u0631\u06CC\u0647", ar: "\u0646\u064A\u062C\u064A\u0631\u064A\u0627", en: "Nigeria" } },
444
+ { code: "KE", labels: { fa: "\u06A9\u0646\u06CC\u0627", ar: "\u0643\u064A\u0646\u064A\u0627", en: "Kenya" } },
445
+ { code: "ZA", labels: { fa: "\u0622\u0641\u0631\u06CC\u0642\u0627\u06CC \u062C\u0646\u0648\u0628\u06CC", ar: "\u062C\u0646\u0648\u0628 \u0623\u0641\u0631\u064A\u0642\u064A\u0627", en: "South Africa" } },
446
+ { code: "ET", labels: { fa: "\u0627\u062A\u06CC\u0648\u067E\u06CC", ar: "\u0625\u062B\u064A\u0648\u0628\u064A\u0627", en: "Ethiopia" } },
447
+ // Europe (major markets)
448
+ { code: "GB", labels: { fa: "\u0628\u0631\u06CC\u062A\u0627\u0646\u06CC\u0627", ar: "\u0628\u0631\u064A\u0637\u0627\u0646\u064A\u0627", en: "United Kingdom" } },
449
+ { code: "DE", labels: { fa: "\u0622\u0644\u0645\u0627\u0646", ar: "\u0623\u0644\u0645\u0627\u0646\u064A\u0627", en: "Germany" } },
450
+ { code: "FR", labels: { fa: "\u0641\u0631\u0627\u0646\u0633\u0647", ar: "\u0641\u0631\u0646\u0633\u0627", en: "France" } },
451
+ { code: "IT", labels: { fa: "\u0627\u06CC\u062A\u0627\u0644\u06CC\u0627", ar: "\u0625\u064A\u0637\u0627\u0644\u064A\u0627", en: "Italy" } },
452
+ { code: "ES", labels: { fa: "\u0627\u0633\u067E\u0627\u0646\u06CC\u0627", ar: "\u0625\u0633\u0628\u0627\u0646\u064A\u0627", en: "Spain" } },
453
+ { code: "NL", labels: { fa: "\u0647\u0644\u0646\u062F", ar: "\u0647\u0648\u0644\u0646\u062F\u0627", en: "Netherlands" } },
454
+ { code: "BE", labels: { fa: "\u0628\u0644\u0698\u06CC\u06A9", ar: "\u0628\u0644\u062C\u064A\u0643\u0627", en: "Belgium" } },
455
+ { code: "CH", labels: { fa: "\u0633\u0648\u0626\u06CC\u0633", ar: "\u0633\u0648\u064A\u0633\u0631\u0627", en: "Switzerland" } },
456
+ { code: "AT", labels: { fa: "\u0627\u062A\u0631\u06CC\u0634", ar: "\u0627\u0644\u0646\u0645\u0633\u0627", en: "Austria" } },
457
+ { code: "SE", labels: { fa: "\u0633\u0648\u0626\u062F", ar: "\u0627\u0644\u0633\u0648\u064A\u062F", en: "Sweden" } },
458
+ { code: "NO", labels: { fa: "\u0646\u0631\u0648\u0698", ar: "\u0627\u0644\u0646\u0631\u0648\u064A\u062C", en: "Norway" } },
459
+ { code: "DK", labels: { fa: "\u062F\u0627\u0646\u0645\u0627\u0631\u06A9", ar: "\u0627\u0644\u062F\u0646\u0645\u0627\u0631\u0643", en: "Denmark" } },
460
+ { code: "FI", labels: { fa: "\u0641\u0646\u0644\u0627\u0646\u062F", ar: "\u0641\u0646\u0644\u0646\u062F\u0627", en: "Finland" } },
461
+ { code: "IE", labels: { fa: "\u0627\u06CC\u0631\u0644\u0646\u062F", ar: "\u0623\u064A\u0631\u0644\u0646\u062F\u0627", en: "Ireland" } },
462
+ { code: "PT", labels: { fa: "\u067E\u0631\u062A\u063A\u0627\u0644", ar: "\u0627\u0644\u0628\u0631\u062A\u063A\u0627\u0644", en: "Portugal" } },
463
+ { code: "GR", labels: { fa: "\u06CC\u0648\u0646\u0627\u0646", ar: "\u0627\u0644\u064A\u0648\u0646\u0627\u0646", en: "Greece" } },
464
+ { code: "PL", labels: { fa: "\u0644\u0647\u0633\u062A\u0627\u0646", ar: "\u0628\u0648\u0644\u0646\u062F\u0627", en: "Poland" } },
465
+ { code: "CZ", labels: { fa: "\u0686\u06A9", ar: "\u0627\u0644\u062A\u0634\u064A\u0643", en: "Czechia" } },
466
+ { code: "HU", labels: { fa: "\u0645\u062C\u0627\u0631\u0633\u062A\u0627\u0646", ar: "\u0627\u0644\u0645\u062C\u0631", en: "Hungary" } },
467
+ { code: "RO", labels: { fa: "\u0631\u0648\u0645\u0627\u0646\u06CC", ar: "\u0631\u0648\u0645\u0627\u0646\u064A\u0627", en: "Romania" } },
468
+ { code: "RU", labels: { fa: "\u0631\u0648\u0633\u06CC\u0647", ar: "\u0631\u0648\u0633\u064A\u0627", en: "Russia" } },
469
+ { code: "UA", labels: { fa: "\u0627\u0648\u06A9\u0631\u0627\u06CC\u0646", ar: "\u0623\u0648\u0643\u0631\u0627\u0646\u064A\u0627", en: "Ukraine" } },
470
+ { code: "BY", labels: { fa: "\u0628\u0644\u0627\u0631\u0648\u0633", ar: "\u0628\u064A\u0644\u0627\u0631\u0648\u0633\u064A\u0627", en: "Belarus" } },
471
+ // North + South America
472
+ { code: "US", labels: { fa: "\u0627\u06CC\u0627\u0644\u0627\u062A \u0645\u062A\u062D\u062F\u0647", ar: "\u0627\u0644\u0648\u0644\u0627\u064A\u0627\u062A \u0627\u0644\u0645\u062A\u062D\u062F\u0629", en: "United States" } },
473
+ { code: "CA", labels: { fa: "\u06A9\u0627\u0646\u0627\u062F\u0627", ar: "\u0643\u0646\u062F\u0627", en: "Canada" } },
474
+ { code: "MX", labels: { fa: "\u0645\u06A9\u0632\u06CC\u06A9", ar: "\u0627\u0644\u0645\u0643\u0633\u064A\u0643", en: "Mexico" } },
475
+ { code: "BR", labels: { fa: "\u0628\u0631\u0632\u06CC\u0644", ar: "\u0627\u0644\u0628\u0631\u0627\u0632\u064A\u0644", en: "Brazil" } },
476
+ { code: "AR", labels: { fa: "\u0622\u0631\u0698\u0627\u0646\u062A\u06CC\u0646", ar: "\u0627\u0644\u0623\u0631\u062C\u0646\u062A\u064A\u0646", en: "Argentina" } },
477
+ { code: "CL", labels: { fa: "\u0634\u06CC\u0644\u06CC", ar: "\u062A\u0634\u064A\u0644\u064A", en: "Chile" } },
478
+ { code: "CO", labels: { fa: "\u06A9\u0644\u0645\u0628\u06CC\u0627", ar: "\u0643\u0648\u0644\u0648\u0645\u0628\u064A\u0627", en: "Colombia" } },
479
+ { code: "PE", labels: { fa: "\u067E\u0631\u0648", ar: "\u0628\u064A\u0631\u0648", en: "Peru" } },
480
+ // Asia-Pacific
481
+ { code: "CN", labels: { fa: "\u0686\u06CC\u0646", ar: "\u0627\u0644\u0635\u064A\u0646", en: "China" } },
482
+ { code: "JP", labels: { fa: "\u0698\u0627\u067E\u0646", ar: "\u0627\u0644\u064A\u0627\u0628\u0627\u0646", en: "Japan" } },
483
+ { code: "KR", labels: { fa: "\u06A9\u0631\u0647 \u062C\u0646\u0648\u0628\u06CC", ar: "\u0643\u0648\u0631\u064A\u0627 \u0627\u0644\u062C\u0646\u0648\u0628\u064A\u0629", en: "South Korea" } },
484
+ { code: "KP", labels: { fa: "\u06A9\u0631\u0647 \u0634\u0645\u0627\u0644\u06CC", ar: "\u0643\u0648\u0631\u064A\u0627 \u0627\u0644\u0634\u0645\u0627\u0644\u064A\u0629", en: "North Korea" } },
485
+ { code: "IN", labels: { fa: "\u0647\u0646\u062F", ar: "\u0627\u0644\u0647\u0646\u062F", en: "India" } },
486
+ { code: "BD", labels: { fa: "\u0628\u0646\u06AF\u0644\u0627\u062F\u0634", ar: "\u0628\u0646\u063A\u0644\u0627\u062F\u064A\u0634", en: "Bangladesh" } },
487
+ { code: "ID", labels: { fa: "\u0627\u0646\u062F\u0648\u0646\u0632\u06CC", ar: "\u0625\u0646\u062F\u0648\u0646\u064A\u0633\u064A\u0627", en: "Indonesia" } },
488
+ { code: "MY", labels: { fa: "\u0645\u0627\u0644\u0632\u06CC", ar: "\u0645\u0627\u0644\u064A\u0632\u064A\u0627", en: "Malaysia" } },
489
+ { code: "TH", labels: { fa: "\u062A\u0627\u06CC\u0644\u0646\u062F", ar: "\u062A\u0627\u064A\u0644\u0627\u0646\u062F", en: "Thailand" } },
490
+ { code: "VN", labels: { fa: "\u0648\u06CC\u062A\u0646\u0627\u0645", ar: "\u0641\u064A\u062A\u0646\u0627\u0645", en: "Vietnam" } },
491
+ { code: "PH", labels: { fa: "\u0641\u06CC\u0644\u06CC\u067E\u06CC\u0646", ar: "\u0627\u0644\u0641\u0644\u0628\u064A\u0646", en: "Philippines" } },
492
+ { code: "SG", labels: { fa: "\u0633\u0646\u06AF\u0627\u067E\u0648\u0631", ar: "\u0633\u0646\u063A\u0627\u0641\u0648\u0631\u0629", en: "Singapore" } },
493
+ { code: "AU", labels: { fa: "\u0627\u0633\u062A\u0631\u0627\u0644\u06CC\u0627", ar: "\u0623\u0633\u062A\u0631\u0627\u0644\u064A\u0627", en: "Australia" } },
494
+ { code: "NZ", labels: { fa: "\u0646\u06CC\u0648\u0632\u0644\u0646\u062F", ar: "\u0646\u064A\u0648\u0632\u064A\u0644\u0646\u062F\u0627", en: "New Zealand" } },
495
+ // Central Asia
496
+ { code: "KZ", labels: { fa: "\u0642\u0632\u0627\u0642\u0633\u062A\u0627\u0646", ar: "\u0643\u0627\u0632\u0627\u062E\u0633\u062A\u0627\u0646", en: "Kazakhstan" } },
497
+ { code: "UZ", labels: { fa: "\u0627\u0632\u0628\u06A9\u0633\u062A\u0627\u0646", ar: "\u0623\u0648\u0632\u0628\u0643\u0633\u062A\u0627\u0646", en: "Uzbekistan" } },
498
+ { code: "KG", labels: { fa: "\u0642\u0631\u0642\u06CC\u0632\u0633\u062A\u0627\u0646", ar: "\u0642\u064A\u0631\u063A\u064A\u0632\u0633\u062A\u0627\u0646", en: "Kyrgyzstan" } },
499
+ { code: "TJ", labels: { fa: "\u062A\u0627\u062C\u06CC\u06A9\u0633\u062A\u0627\u0646", ar: "\u0637\u0627\u062C\u064A\u0643\u0633\u062A\u0627\u0646", en: "Tajikistan" } },
500
+ { code: "GE", labels: { fa: "\u06AF\u0631\u062C\u0633\u062A\u0627\u0646", ar: "\u062C\u0648\u0631\u062C\u064A\u0627", en: "Georgia" } }
501
+ ];
502
+ var CODE_INDEX = new Map(COUNTRIES.map((c) => [c.code, c]));
503
+ function findCountry(code) {
504
+ return CODE_INDEX.get(code.toUpperCase());
505
+ }
506
+ function getCountryLabel(code, locale) {
507
+ const country = findCountry(code);
508
+ if (!country) return code.toUpperCase();
509
+ return country.labels[locale] ?? country.labels.fa;
510
+ }
511
+
512
+ // src/lib/i18n.ts
513
+ function isRTL(locale) {
514
+ return locale === "fa" || locale === "ar";
515
+ }
516
+ var engagementUiTranslations = {
517
+ fa: {
518
+ yourCategory: "\u062F\u0633\u062A\u0647 \u0634\u0645\u0627:",
519
+ influencer: "\u0627\u06CC\u0646\u0641\u0644\u0648\u0626\u0646\u0633\u0631",
520
+ followers: "\u0641\u0627\u0644\u0648\u0648\u0631",
521
+ over: "\u0628\u06CC\u0634 \u0627\u0632",
522
+ to: "\u062A\u0627",
523
+ and: "\u0648 \u0628\u0627\u0644\u0627\u062A\u0631",
524
+ lessThan: "\u06A9\u0645\u062A\u0631 \u0627\u0632",
525
+ you: "\u0634\u0645\u0627",
526
+ criteria: "\u0645\u0639\u06CC\u0627\u0631\u0647\u0627\u06CC \u062F\u0633\u062A\u0647"
527
+ },
528
+ ar: {
529
+ yourCategory: "\u0641\u0626\u062A\u0643:",
530
+ influencer: "\u0645\u0624\u062B\u0631",
531
+ followers: "\u0645\u062A\u0627\u0628\u0639",
532
+ over: "\u0623\u0643\u062B\u0631 \u0645\u0646",
533
+ to: "\u0625\u0644\u0649",
534
+ and: "\u0648\u0623\u0639\u0644\u0649",
535
+ lessThan: "\u0623\u0642\u0644 \u0645\u0646",
536
+ you: "\u0623\u0646\u062A",
537
+ criteria: "\u0645\u0639\u0627\u064A\u064A\u0631 \u0641\u0626\u0629 \u0627\u0644\u0645\u0624\u062B\u0631"
538
+ },
539
+ en: {
540
+ yourCategory: "Your Category:",
541
+ influencer: "Influencer",
542
+ followers: "followers",
543
+ over: "Over",
544
+ to: "to",
545
+ and: "and above",
546
+ lessThan: "Less than",
547
+ you: "You",
548
+ criteria: "Category Criteria"
549
+ }
550
+ };
551
+ var sentimentLabels = {
552
+ fa: { positive: "\u0645\u062B\u0628\u062A", negative: "\u0645\u0646\u0641\u06CC", neutral: "\u062E\u0646\u062B\u06CC", mixed: "\u062A\u0631\u06A9\u06CC\u0628\u06CC" },
553
+ ar: { positive: "\u0625\u064A\u062C\u0627\u0628\u064A", negative: "\u0633\u0644\u0628\u064A", neutral: "\u0645\u062D\u0627\u064A\u062F", mixed: "\u0645\u062E\u062A\u0644\u0637" },
554
+ en: { positive: "Positive", negative: "Negative", neutral: "Neutral", mixed: "Mixed" }
555
+ };
556
+ var EMOTION_KEYS = [
557
+ "anger",
558
+ "anticipation",
559
+ "joy",
560
+ "trust",
561
+ "fear",
562
+ "surprise",
563
+ "sadness",
564
+ "disgust",
565
+ "neutral"
566
+ ];
567
+ var emotionLabels = {
568
+ fa: {
569
+ anger: "\u062E\u0634\u0645",
570
+ anticipation: "\u0627\u0646\u062A\u0638\u0627\u0631",
571
+ joy: "\u0634\u0627\u062F\u06CC",
572
+ trust: "\u0627\u0639\u062A\u0645\u0627\u062F",
573
+ fear: "\u062A\u0631\u0633",
574
+ surprise: "\u0634\u06AF\u0641\u062A\u06CC",
575
+ sadness: "\u063A\u0645",
576
+ disgust: "\u0627\u0646\u0632\u062C\u0627\u0631",
577
+ neutral: "\u062E\u0646\u062B\u06CC"
578
+ },
579
+ ar: {
580
+ anger: "\u063A\u0636\u0628",
581
+ anticipation: "\u062A\u0631\u0642\u0651\u0628",
582
+ joy: "\u0641\u0631\u062D",
583
+ trust: "\u062B\u0642\u0629",
584
+ fear: "\u062E\u0648\u0641",
585
+ surprise: "\u062F\u0647\u0634\u0629",
586
+ sadness: "\u062D\u0632\u0646",
587
+ disgust: "\u0627\u0634\u0645\u0626\u0632\u0627\u0632",
588
+ neutral: "\u0645\u062D\u0627\u064A\u062F"
589
+ },
590
+ en: {
591
+ anger: "Anger",
592
+ anticipation: "Anticipation",
593
+ joy: "Joy",
594
+ trust: "Trust",
595
+ fear: "Fear",
596
+ surprise: "Surprise",
597
+ sadness: "Sadness",
598
+ disgust: "Disgust",
599
+ neutral: "Neutral"
600
+ }
601
+ };
602
+ var EMOTION_VALUE_MAP = {
603
+ 1: "anger",
604
+ 2: "fear",
605
+ 3: "sadness",
606
+ 4: "joy",
607
+ 5: "disgust",
608
+ 6: "surprise",
609
+ 7: "trust",
610
+ 8: "anticipation",
611
+ 9: "neutral"
612
+ };
613
+ var EMOTION_KEY_TO_VALUE = {
614
+ anger: 1,
615
+ fear: 2,
616
+ sadness: 3,
617
+ joy: 4,
618
+ disgust: 5,
619
+ surprise: 6,
620
+ trust: 7,
621
+ anticipation: 8,
622
+ neutral: 9
623
+ };
624
+ var EMOTION_LABEL_LOOKUP = (() => {
625
+ const map = {};
626
+ for (const key of EMOTION_KEYS) map[key] = key;
627
+ for (const locale of Object.keys(emotionLabels)) {
628
+ for (const key of EMOTION_KEYS) {
629
+ map[emotionLabels[locale][key].toLowerCase()] = key;
630
+ }
631
+ }
632
+ return map;
633
+ })();
634
+ function resolveEmotion(input) {
635
+ if (input == null) return null;
636
+ if (typeof input === "number") return EMOTION_VALUE_MAP[input] ?? null;
637
+ const raw = String(input).trim();
638
+ if (raw === "") return null;
639
+ if (/^\d+$/.test(raw)) return EMOTION_VALUE_MAP[Number(raw)] ?? null;
640
+ return EMOTION_LABEL_LOOKUP[raw.toLowerCase()] ?? null;
641
+ }
642
+ var FLOW_KEYS = [
643
+ "pro-gov",
644
+ "internal-critic",
645
+ "internal-opponent",
646
+ "external-opponent",
647
+ "grey"
648
+ ];
649
+ var flowLabels = {
650
+ fa: {
651
+ "pro-gov": "\u062D\u0627\u0645\u06CC\u0627\u0646 \u062D\u06A9\u0648\u0645\u062A",
652
+ "internal-critic": "\u0645\u0646\u062A\u0642\u062F\u0627\u0646 \u062F\u0627\u062E\u0644\u06CC",
653
+ "internal-opponent": "\u0645\u062E\u0627\u0644\u0641\u0627\u0646 \u062F\u0627\u062E\u0644\u06CC",
654
+ "external-opponent": "\u0645\u062E\u0627\u0644\u0641\u0627\u0646 \u062E\u0627\u0631\u062C\u06CC",
655
+ grey: "\u0642\u0634\u0631 \u062E\u0627\u06A9\u0633\u062A\u0631\u06CC"
656
+ },
657
+ ar: {
658
+ "pro-gov": "\u0645\u0624\u064A\u062F\u0648 \u0627\u0644\u062D\u0643\u0648\u0645\u0629",
659
+ "internal-critic": "\u0645\u0646\u062A\u0642\u062F\u0648\u0646 \u062F\u0627\u062E\u0644\u064A\u0648\u0646",
660
+ "internal-opponent": "\u0645\u0639\u0627\u0631\u0636\u0648\u0646 \u062F\u0627\u062E\u0644\u064A\u0648\u0646",
661
+ "external-opponent": "\u0645\u0639\u0627\u0631\u0636\u0648\u0646 \u062E\u0627\u0631\u062C\u064A\u0648\u0646",
662
+ grey: "\u0627\u0644\u0641\u0626\u0629 \u0627\u0644\u0631\u0645\u0627\u062F\u064A\u0629"
663
+ },
664
+ en: {
665
+ "pro-gov": "Pro-Government",
666
+ "internal-critic": "Internal Critic",
667
+ "internal-opponent": "Internal Opponent",
668
+ "external-opponent": "External Opponent",
669
+ grey: "Grey"
670
+ }
671
+ };
672
+ var FLOW_VALUE_MAP = {
673
+ 1: "pro-gov",
674
+ 2: "internal-critic",
675
+ 3: "internal-opponent",
676
+ 4: "external-opponent",
677
+ 5: "grey"
678
+ };
679
+ var FLOW_KEY_TO_VALUE = {
680
+ "pro-gov": 1,
681
+ "internal-critic": 2,
682
+ "internal-opponent": 3,
683
+ "external-opponent": 4,
684
+ grey: 5
685
+ };
686
+ var FLOW_LABEL_LOOKUP = (() => {
687
+ const map = {};
688
+ for (const key of FLOW_KEYS) map[key] = key;
689
+ for (const locale of Object.keys(flowLabels)) {
690
+ for (const key of FLOW_KEYS) {
691
+ map[flowLabels[locale][key].toLowerCase()] = key;
692
+ }
693
+ }
694
+ return map;
695
+ })();
696
+ function resolveFlow(input) {
697
+ if (input == null) return null;
698
+ if (typeof input === "number") return FLOW_VALUE_MAP[input] ?? null;
699
+ const raw = String(input).trim();
700
+ if (raw === "") return null;
701
+ if (/^\d+$/.test(raw)) return FLOW_VALUE_MAP[Number(raw)] ?? null;
702
+ return FLOW_LABEL_LOOKUP[raw.toLowerCase()] ?? null;
703
+ }
704
+ var STATUS_KEYS = ["critical", "warning", "middle", "low"];
705
+ var statusLabels = {
706
+ fa: { critical: "\u0628\u062D\u0631\u0627\u0646\u06CC", warning: "\u0647\u0634\u062F\u0627\u0631", middle: "\u0645\u062A\u0648\u0633\u0637", low: "\u067E\u0627\u06CC\u06CC\u0646" },
707
+ ar: { critical: "\u062D\u0631\u062C", warning: "\u062A\u062D\u0630\u064A\u0631", middle: "\u0645\u062A\u0648\u0633\u0637", low: "\u0645\u0646\u062E\u0641\u0636" },
708
+ en: { critical: "Critical", warning: "Warning", middle: "Middle", low: "Low" }
709
+ };
710
+ var STATUS_VALUE_MAP = {
711
+ 1: "critical",
712
+ 2: "warning",
713
+ 3: "middle",
714
+ 4: "low"
715
+ };
716
+ var STATUS_KEY_TO_VALUE = {
717
+ critical: 1,
718
+ warning: 2,
719
+ middle: 3,
720
+ low: 4
721
+ };
722
+ var STATUS_LABEL_LOOKUP = (() => {
723
+ const map = { normal: "low" };
724
+ for (const key of STATUS_KEYS) map[key] = key;
725
+ for (const locale of Object.keys(statusLabels)) {
726
+ for (const key of STATUS_KEYS) {
727
+ map[statusLabels[locale][key].toLowerCase()] = key;
728
+ }
729
+ }
730
+ return map;
731
+ })();
732
+ function resolveStatus(input) {
733
+ if (input == null) return null;
734
+ if (typeof input === "number") return STATUS_VALUE_MAP[input] ?? null;
735
+ const raw = String(input).trim();
736
+ if (raw === "") return null;
737
+ if (/^\d+$/.test(raw)) return STATUS_VALUE_MAP[Number(raw)] ?? null;
738
+ return STATUS_LABEL_LOOKUP[raw.toLowerCase()] ?? null;
739
+ }
740
+ var SEVERITY_KEYS = ["urgent", "high", "medium", "low"];
741
+ var severityLabels = {
742
+ fa: { urgent: "\u0641\u0648\u0631\u06CC", high: "\u0628\u0627\u0644\u0627", medium: "\u0645\u062A\u0648\u0633\u0637", low: "\u067E\u0627\u06CC\u06CC\u0646" },
743
+ ar: { urgent: "\u0639\u0627\u062C\u0644", high: "\u0645\u0631\u062A\u0641\u0639", medium: "\u0645\u062A\u0648\u0633\u0637", low: "\u0645\u0646\u062E\u0641\u0636" },
744
+ en: { urgent: "Urgent", high: "High", medium: "Medium", low: "Low" }
745
+ };
746
+ var SEVERITY_VALUE_MAP = {
747
+ 1: "urgent",
748
+ 2: "high",
749
+ 3: "medium",
750
+ 4: "low"
751
+ };
752
+ var SEVERITY_KEY_TO_VALUE = {
753
+ urgent: 1,
754
+ high: 2,
755
+ medium: 3,
756
+ low: 4
757
+ };
758
+ var SEVERITY_LABEL_LOOKUP = (() => {
759
+ const map = {};
760
+ for (const key of SEVERITY_KEYS) map[key] = key;
761
+ for (const locale of Object.keys(severityLabels)) {
762
+ for (const key of SEVERITY_KEYS) {
763
+ map[severityLabels[locale][key].toLowerCase()] = key;
764
+ }
765
+ }
766
+ return map;
767
+ })();
768
+ function resolveSeverity(input) {
769
+ if (input == null) return null;
770
+ if (typeof input === "number") return SEVERITY_VALUE_MAP[input] ?? null;
771
+ const raw = String(input).trim();
772
+ if (raw === "") return null;
773
+ if (/^\d+$/.test(raw)) return SEVERITY_VALUE_MAP[Number(raw)] ?? null;
774
+ return SEVERITY_LABEL_LOOKUP[raw.toLowerCase()] ?? null;
775
+ }
776
+ var JOB_STATUS_KEYS = [
777
+ "queued",
778
+ "running",
779
+ "paused",
780
+ "completed",
781
+ "failed",
782
+ "cancelled"
783
+ ];
784
+ var jobStatusLabels = {
785
+ fa: {
786
+ queued: "\u062F\u0631 \u0635\u0641",
787
+ running: "\u062F\u0631 \u062D\u0627\u0644 \u0627\u062C\u0631\u0627",
788
+ paused: "\u0645\u062A\u0648\u0642\u0641",
789
+ completed: "\u062A\u06A9\u0645\u06CC\u0644 \u0634\u062F",
790
+ failed: "\u0646\u0627\u0645\u0648\u0641\u0642",
791
+ cancelled: "\u0644\u063A\u0648 \u0634\u062F"
792
+ },
793
+ ar: {
794
+ queued: "\u0641\u064A \u0627\u0644\u0637\u0627\u0628\u0648\u0631",
795
+ running: "\u0642\u064A\u062F \u0627\u0644\u062A\u0646\u0641\u064A\u0630",
796
+ paused: "\u0645\u062A\u0648\u0642\u0641",
797
+ completed: "\u0645\u0643\u062A\u0645\u0644",
798
+ failed: "\u0641\u0634\u0644",
799
+ cancelled: "\u0645\u0644\u063A\u0649"
800
+ },
801
+ en: {
802
+ queued: "Queued",
803
+ running: "Running",
804
+ paused: "Paused",
805
+ completed: "Completed",
806
+ failed: "Failed",
807
+ cancelled: "Cancelled"
808
+ }
809
+ };
810
+ function isActiveJobStatus(s) {
811
+ return s === "queued" || s === "running" || s === "paused";
812
+ }
813
+ var ACTION_STATUS_KEYS = [
814
+ "success",
815
+ "failed",
816
+ "pending",
817
+ "warning",
818
+ "info"
819
+ ];
820
+ var actionStatusLabels = {
821
+ fa: {
822
+ success: "\u0645\u0648\u0641\u0642",
823
+ failed: "\u0646\u0627\u0645\u0648\u0641\u0642",
824
+ pending: "\u062F\u0631 \u062D\u0627\u0644 \u0627\u0646\u062C\u0627\u0645",
825
+ warning: "\u0647\u0634\u062F\u0627\u0631",
826
+ info: "\u0627\u0637\u0644\u0627\u0639"
827
+ },
828
+ ar: {
829
+ success: "\u0646\u0627\u062C\u062D",
830
+ failed: "\u0641\u0634\u0644",
831
+ pending: "\u0642\u064A\u062F \u0627\u0644\u062A\u0646\u0641\u064A\u0630",
832
+ warning: "\u062A\u062D\u0630\u064A\u0631",
833
+ info: "\u0645\u0639\u0644\u0648\u0645\u0627\u062A"
834
+ },
835
+ en: {
836
+ success: "Success",
837
+ failed: "Failed",
838
+ pending: "Pending",
839
+ warning: "Warning",
840
+ info: "Info"
841
+ }
842
+ };
843
+ function formatRelativeLocaleTime(date, locale) {
844
+ const then = new Date(date).getTime();
845
+ const now = Date.now();
846
+ const diffSec = Math.floor((now - then) / 1e3);
847
+ const fmt = (n) => locale === "en" ? String(n) : n.toLocaleString(locale === "ar" ? "ar-EG" : "fa-IR");
848
+ if (diffSec < 0) {
849
+ return new Date(then).toISOString();
850
+ }
851
+ if (diffSec < 60) {
852
+ if (locale === "fa") return "\u0647\u0645\u06CC\u0646 \u0627\u0644\u0627\u0646";
853
+ if (locale === "ar") return "\u0627\u0644\u0622\u0646";
854
+ return "just now";
855
+ }
856
+ const diffMin = Math.floor(diffSec / 60);
857
+ if (diffMin < 60) {
858
+ if (locale === "fa") return `${fmt(diffMin)} \u062F\u0642\u06CC\u0642\u0647 \u067E\u06CC\u0634`;
859
+ if (locale === "ar") return `\u0642\u0628\u0644 ${fmt(diffMin)} \u062F\u0642\u064A\u0642\u0629`;
860
+ return `${diffMin}m ago`;
861
+ }
862
+ const diffHr = Math.floor(diffMin / 60);
863
+ if (diffHr < 24) {
864
+ if (locale === "fa") return `${fmt(diffHr)} \u0633\u0627\u0639\u062A \u067E\u06CC\u0634`;
865
+ if (locale === "ar") return `\u0642\u0628\u0644 ${fmt(diffHr)} \u0633\u0627\u0639\u0629`;
866
+ return `${diffHr}h ago`;
867
+ }
868
+ const diffDay = Math.floor(diffHr / 24);
869
+ if (diffDay < 7) {
870
+ if (locale === "fa") return `${fmt(diffDay)} \u0631\u0648\u0632 \u067E\u06CC\u0634`;
871
+ if (locale === "ar") return `\u0642\u0628\u0644 ${fmt(diffDay)} \u064A\u0648\u0645`;
872
+ return `${diffDay}d ago`;
873
+ }
874
+ const diffWk = Math.floor(diffDay / 7);
875
+ if (diffWk < 4) {
876
+ if (locale === "fa") return `${fmt(diffWk)} \u0647\u0641\u062A\u0647 \u067E\u06CC\u0634`;
877
+ if (locale === "ar") return `\u0642\u0628\u0644 ${fmt(diffWk)} \u0623\u0633\u0628\u0648\u0639`;
878
+ return `${diffWk}w ago`;
879
+ }
880
+ const diffMon = Math.floor(diffDay / 30);
881
+ if (diffMon < 12) {
882
+ if (locale === "fa") return `${fmt(diffMon)} \u0645\u0627\u0647 \u067E\u06CC\u0634`;
883
+ if (locale === "ar") return `\u0642\u0628\u0644 ${fmt(diffMon)} \u0634\u0647\u0631`;
884
+ return `${diffMon}mo ago`;
885
+ }
886
+ const diffYr = Math.floor(diffDay / 365);
887
+ if (locale === "fa") return `${fmt(diffYr)} \u0633\u0627\u0644 \u067E\u06CC\u0634`;
888
+ if (locale === "ar") return `\u0642\u0628\u0644 ${fmt(diffYr)} \u0633\u0646\u0629`;
889
+ return `${diffYr}y ago`;
890
+ }
891
+ function formatTimeRemaining(target, locale) {
892
+ const then = new Date(target).getTime();
893
+ const now = Date.now();
894
+ const diffSec = Math.max(0, Math.floor((then - now) / 1e3));
895
+ const fmt = (n) => locale === "en" ? String(n) : n.toLocaleString(locale === "ar" ? "ar-EG" : "fa-IR");
896
+ if (diffSec <= 0) {
897
+ if (locale === "fa") return "\u0647\u0645\u200C\u0627\u06A9\u0646\u0648\u0646";
898
+ if (locale === "ar") return "\u0627\u0644\u0622\u0646";
899
+ return "any moment";
900
+ }
901
+ if (diffSec < 60) {
902
+ if (locale === "fa") return `${fmt(diffSec)} \u062B\u0627\u0646\u06CC\u0647 \u062F\u06CC\u06AF\u0631`;
903
+ if (locale === "ar") return `\u0628\u0639\u062F ${fmt(diffSec)} \u062B\u0627\u0646\u064A\u0629`;
904
+ return `in ${diffSec}s`;
905
+ }
906
+ const totalMin = Math.floor(diffSec / 60);
907
+ if (totalMin < 60) {
908
+ if (locale === "fa") return `${fmt(totalMin)} \u062F\u0642\u06CC\u0642\u0647 \u062F\u06CC\u06AF\u0631`;
909
+ if (locale === "ar") return `\u0628\u0639\u062F ${fmt(totalMin)} \u062F\u0642\u064A\u0642\u0629`;
910
+ return `in ${totalMin}m`;
911
+ }
912
+ const hours = Math.floor(totalMin / 60);
913
+ const mins = totalMin % 60;
914
+ if (hours < 24) {
915
+ if (mins === 0) {
916
+ if (locale === "fa") return `${fmt(hours)} \u0633\u0627\u0639\u062A \u062F\u06CC\u06AF\u0631`;
917
+ if (locale === "ar") return `\u0628\u0639\u062F ${fmt(hours)} \u0633\u0627\u0639\u0629`;
918
+ return `in ${hours}h`;
919
+ }
920
+ if (locale === "fa") return `${fmt(hours)} \u0633\u0627\u0639\u062A \u0648 ${fmt(mins)} \u062F\u0642\u06CC\u0642\u0647 \u062F\u06CC\u06AF\u0631`;
921
+ if (locale === "ar") return `\u0628\u0639\u062F ${fmt(hours)} \u0633\u0627\u0639\u0629 \u0648${fmt(mins)} \u062F\u0642\u064A\u0642\u0629`;
922
+ return `in ${hours}h ${mins}m`;
923
+ }
924
+ const days = Math.floor(hours / 24);
925
+ const remHours = hours % 24;
926
+ if (remHours === 0) {
927
+ if (locale === "fa") return `${fmt(days)} \u0631\u0648\u0632 \u062F\u06CC\u06AF\u0631`;
928
+ if (locale === "ar") return `\u0628\u0639\u062F ${fmt(days)} \u064A\u0648\u0645`;
929
+ return `in ${days}d`;
930
+ }
931
+ if (locale === "fa") return `${fmt(days)} \u0631\u0648\u0632 \u0648 ${fmt(remHours)} \u0633\u0627\u0639\u062A \u062F\u06CC\u06AF\u0631`;
932
+ if (locale === "ar") return `\u0628\u0639\u062F ${fmt(days)} \u064A\u0648\u0645 \u0648${fmt(remHours)} \u0633\u0627\u0639\u0629`;
933
+ return `in ${days}d ${remHours}h`;
934
+ }
935
+ var STAGE_STATUS_KEYS = [
936
+ "pending",
937
+ "running",
938
+ "completed",
939
+ "failed",
940
+ "skipped",
941
+ "warning",
942
+ "paused"
943
+ ];
944
+ var stageStatusLabels = {
945
+ fa: {
946
+ pending: "\u062F\u0631 \u0627\u0646\u062A\u0638\u0627\u0631",
947
+ running: "\u062F\u0631 \u062D\u0627\u0644 \u0627\u062C\u0631\u0627",
948
+ completed: "\u062A\u06A9\u0645\u06CC\u0644 \u0634\u062F",
949
+ failed: "\u0646\u0627\u0645\u0648\u0641\u0642",
950
+ skipped: "\u0631\u062F \u0634\u062F",
951
+ warning: "\u0628\u0627 \u0647\u0634\u062F\u0627\u0631",
952
+ paused: "\u0645\u062A\u0648\u0642\u0641"
953
+ },
954
+ ar: {
955
+ pending: "\u0641\u064A \u0627\u0644\u0627\u0646\u062A\u0638\u0627\u0631",
956
+ running: "\u0642\u064A\u062F \u0627\u0644\u062A\u0646\u0641\u064A\u0630",
957
+ completed: "\u0645\u0643\u062A\u0645\u0644",
958
+ failed: "\u0641\u0634\u0644",
959
+ skipped: "\u062A\u0645 \u062A\u062E\u0637\u064A\u0647",
960
+ warning: "\u0645\u0639 \u062A\u062D\u0630\u064A\u0631",
961
+ paused: "\u0645\u062A\u0648\u0642\u0641"
962
+ },
963
+ en: {
964
+ pending: "Pending",
965
+ running: "Running",
966
+ completed: "Completed",
967
+ failed: "Failed",
968
+ skipped: "Skipped",
969
+ warning: "Warning",
970
+ paused: "Paused"
971
+ }
972
+ };
973
+ var ACTION_TYPE_KEYS = [
974
+ "like",
975
+ "comment",
976
+ "save",
977
+ "follow",
978
+ "unfollow",
979
+ "dm",
980
+ "share"
981
+ ];
982
+ var actionTypeLabels = {
983
+ fa: {
984
+ like: "\u067E\u0633\u0646\u062F\u06CC\u062F\u0646",
985
+ comment: "\u0646\u0638\u0631",
986
+ save: "\u0630\u062E\u06CC\u0631\u0647",
987
+ follow: "\u062F\u0646\u0628\u0627\u0644 \u06A9\u0631\u062F\u0646",
988
+ unfollow: "\u0644\u063A\u0648 \u062F\u0646\u0628\u0627\u0644",
989
+ dm: "\u067E\u06CC\u0627\u0645 \u0645\u0633\u062A\u0642\u06CC\u0645",
990
+ share: "\u0627\u0634\u062A\u0631\u0627\u06A9\u200C\u06AF\u0630\u0627\u0631\u06CC"
991
+ },
992
+ ar: {
993
+ like: "\u0625\u0639\u062C\u0627\u0628",
994
+ comment: "\u062A\u0639\u0644\u064A\u0642",
995
+ save: "\u062D\u0641\u0638",
996
+ follow: "\u0645\u062A\u0627\u0628\u0639\u0629",
997
+ unfollow: "\u0625\u0644\u063A\u0627\u0621 \u0627\u0644\u0645\u062A\u0627\u0628\u0639\u0629",
998
+ dm: "\u0631\u0633\u0627\u0644\u0629 \u0645\u0628\u0627\u0634\u0631\u0629",
999
+ share: "\u0645\u0634\u0627\u0631\u0643\u0629"
1000
+ },
1001
+ en: {
1002
+ like: "Like",
1003
+ comment: "Comment",
1004
+ save: "Save",
1005
+ follow: "Follow",
1006
+ unfollow: "Unfollow",
1007
+ dm: "Direct Message",
1008
+ share: "Share"
1009
+ }
1010
+ };
1011
+ var actionTypeVerbs = {
1012
+ fa: {
1013
+ like: "\u067E\u0633\u0646\u062F\u06CC\u062F",
1014
+ comment: "\u0646\u0638\u0631 \u06AF\u0630\u0627\u0634\u062A",
1015
+ save: "\u0630\u062E\u06CC\u0631\u0647 \u06A9\u0631\u062F",
1016
+ follow: "\u062F\u0646\u0628\u0627\u0644 \u06A9\u0631\u062F",
1017
+ unfollow: "\u0644\u063A\u0648 \u062F\u0646\u0628\u0627\u0644 \u06A9\u0631\u062F",
1018
+ dm: "\u067E\u06CC\u0627\u0645 \u062F\u0627\u062F",
1019
+ share: "\u0627\u0634\u062A\u0631\u0627\u06A9 \u06AF\u0630\u0627\u0634\u062A"
1020
+ },
1021
+ ar: {
1022
+ like: "\u0623\u0639\u062C\u0628",
1023
+ comment: "\u0639\u0644\u0651\u0642 \u0639\u0644\u0649",
1024
+ save: "\u062D\u0641\u0638",
1025
+ follow: "\u062A\u0627\u0628\u0639",
1026
+ unfollow: "\u0623\u0644\u063A\u0649 \u0645\u062A\u0627\u0628\u0639\u0629",
1027
+ dm: "\u0631\u0627\u0633\u0644",
1028
+ share: "\u0634\u0627\u0631\u0643"
1029
+ },
1030
+ en: {
1031
+ like: "liked",
1032
+ comment: "commented on",
1033
+ save: "saved",
1034
+ follow: "followed",
1035
+ unfollow: "unfollowed",
1036
+ dm: "DMd",
1037
+ share: "shared"
1038
+ }
1039
+ };
1040
+ var ENTITY_HEALTH_KEYS = [
1041
+ "banned",
1042
+ "pending",
1043
+ "at-risk",
1044
+ "warning",
1045
+ "growing",
1046
+ "healthy"
1047
+ ];
1048
+ var entityHealthLabels = {
1049
+ fa: {
1050
+ banned: "\u0645\u0633\u062F\u0648\u062F",
1051
+ pending: "\u062F\u0631 \u0627\u0646\u062A\u0638\u0627\u0631 \u0628\u0631\u0631\u0633\u06CC",
1052
+ "at-risk": "\u062F\u0631 \u062E\u0637\u0631",
1053
+ warning: "\u0647\u0634\u062F\u0627\u0631",
1054
+ growing: "\u062F\u0631 \u062D\u0627\u0644 \u0628\u0647\u0628\u0648\u062F",
1055
+ healthy: "\u0633\u0627\u0644\u0645"
1056
+ },
1057
+ ar: {
1058
+ banned: "\u0645\u062D\u0638\u0648\u0631",
1059
+ pending: "\u0642\u064A\u062F \u0627\u0644\u0627\u0646\u062A\u0638\u0627\u0631",
1060
+ "at-risk": "\u0641\u064A \u062E\u0637\u0631",
1061
+ warning: "\u062A\u062D\u0630\u064A\u0631",
1062
+ growing: "\u064A\u0646\u0645\u0648",
1063
+ healthy: "\u0635\u062D\u064A"
1064
+ },
1065
+ en: {
1066
+ banned: "Banned",
1067
+ pending: "Pending",
1068
+ "at-risk": "At Risk",
1069
+ warning: "Warning",
1070
+ growing: "Growing",
1071
+ healthy: "Healthy"
1072
+ }
1073
+ };
1074
+ var entityHealthPriority = {
1075
+ banned: 5,
1076
+ "at-risk": 4,
1077
+ warning: 3,
1078
+ pending: 2,
1079
+ growing: 1,
1080
+ healthy: 0
1081
+ };
1082
+ function isCriticalEntityHealth(s) {
1083
+ return s === "banned" || s === "at-risk";
1084
+ }
1085
+ var UI_STRINGS = {
1086
+ fa: {
1087
+ // Autocomplete
1088
+ noResults: "\u0646\u062A\u06CC\u062C\u0647\u200C\u0627\u06CC \u06CC\u0627\u0641\u062A \u0646\u0634\u062F",
1089
+ suggestions: "\u067E\u06CC\u0634\u0646\u0647\u0627\u062F\u0647\u0627",
1090
+ // MultiSelect
1091
+ select: "\u0627\u0646\u062A\u062E\u0627\u0628 \u06A9\u0646\u06CC\u062F",
1092
+ noOptionsFound: "\u0645\u0648\u0631\u062F\u06CC \u06CC\u0627\u0641\u062A \u0646\u0634\u062F",
1093
+ search: "\u062C\u0633\u062A\u062C\u0648...",
1094
+ clearAll: "\u067E\u0627\u06A9 \u06A9\u0631\u062F\u0646 \u0647\u0645\u0647",
1095
+ // DatePicker / DateRangePicker
1096
+ selectDate: "\u0627\u0646\u062A\u062E\u0627\u0628 \u062A\u0627\u0631\u06CC\u062E",
1097
+ selectDateRange: "\u0627\u0646\u062A\u062E\u0627\u0628 \u0628\u0627\u0632\u0647 \u062A\u0627\u0631\u06CC\u062E",
1098
+ // ErrorState
1099
+ errorLoadingData: "\u062E\u0637\u0627 \u062F\u0631 \u0628\u0627\u0631\u06AF\u0630\u0627\u0631\u06CC \u062F\u0627\u062F\u0647\u200C\u0647\u0627",
1100
+ retry: "\u062A\u0644\u0627\u0634 \u0645\u062C\u062F\u062F",
1101
+ // FilterChip
1102
+ remove: "\u062D\u0630\u0641",
1103
+ // UserAutocomplete
1104
+ noUsersFound: "\u06A9\u0627\u0631\u0628\u0631\u06CC \u06CC\u0627\u0641\u062A \u0646\u0634\u062F",
1105
+ // Pagination
1106
+ goToPreviousPage: "\u0631\u0641\u062A\u0646 \u0628\u0647 \u0635\u0641\u062D\u0647 \u0642\u0628\u0644\u06CC",
1107
+ goToNextPage: "\u0631\u0641\u062A\u0646 \u0628\u0647 \u0635\u0641\u062D\u0647 \u0628\u0639\u062F\u06CC",
1108
+ previous: "\u0642\u0628\u0644\u06CC",
1109
+ next: "\u0628\u0639\u062F\u06CC",
1110
+ // ProfileInfo
1111
+ actions: "\u0639\u0645\u0644\u06CC\u0627\u062A",
1112
+ // CopyButton
1113
+ copy: "\u06A9\u067E\u06CC",
1114
+ copied: "\u06A9\u067E\u06CC \u0634\u062F",
1115
+ // ConfirmDialog
1116
+ confirm: "\u062A\u0627\u06CC\u06CC\u062F",
1117
+ cancel: "\u0627\u0646\u0635\u0631\u0627\u0641",
1118
+ areYouSure: "\u0622\u06CC\u0627 \u0645\u0637\u0645\u0626\u0646 \u0647\u0633\u062A\u06CC\u062F\u061F",
1119
+ // Stepper
1120
+ stepperLabel: "\u0645\u0631\u0627\u062D\u0644",
1121
+ stepCompleted: "\u062A\u06A9\u0645\u06CC\u0644 \u0634\u062F\u0647",
1122
+ stepCurrent: "\u0645\u0631\u062D\u0644\u0647 \u0641\u0639\u0644\u06CC",
1123
+ stepPending: "\u062F\u0631 \u0627\u0646\u062A\u0638\u0627\u0631",
1124
+ // FilterBar / FilterPanel
1125
+ clearFilters: "\u067E\u0627\u06A9 \u06A9\u0631\u062F\u0646 \u0641\u06CC\u0644\u062A\u0631\u0647\u0627",
1126
+ activeFilters: "\u0641\u06CC\u0644\u062A\u0631\u0647\u0627\u06CC \u0641\u0639\u0627\u0644",
1127
+ filters: "\u0641\u06CC\u0644\u062A\u0631\u0647\u0627",
1128
+ applyFilters: "\u0627\u0639\u0645\u0627\u0644",
1129
+ resetFilters: "\u067E\u06CC\u0634\u200C\u0641\u0631\u0636",
1130
+ noFiltersActive: "\u0641\u06CC\u0644\u062A\u0631 \u0641\u0639\u0627\u0644\u06CC \u0646\u06CC\u0633\u062A",
1131
+ clearSection: "\u067E\u0627\u06A9 \u06A9\u0631\u062F\u0646 \u0627\u06CC\u0646 \u0628\u062E\u0634",
1132
+ // PageHeader
1133
+ goBack: "\u0628\u0627\u0632\u06AF\u0634\u062A",
1134
+ // ViewToggle
1135
+ gridView: "\u0646\u0645\u0627\u06CC \u0634\u0628\u06A9\u0647\u200C\u0627\u06CC",
1136
+ listView: "\u0646\u0645\u0627\u06CC \u0644\u06CC\u0633\u062A\u06CC",
1137
+ // PageLoader
1138
+ loading: "\u062F\u0631 \u062D\u0627\u0644 \u0628\u0627\u0631\u06AF\u0630\u0627\u0631\u06CC...",
1139
+ // ErrorBoundary
1140
+ unexpectedError: "\u062E\u0637\u0627\u06CC \u063A\u06CC\u0631\u0645\u0646\u062A\u0638\u0631\u0647\u200C\u0627\u06CC \u0631\u062E \u062F\u0627\u062F",
1141
+ // DataTable
1142
+ selectAll: "\u0627\u0646\u062A\u062E\u0627\u0628 \u0647\u0645\u0647",
1143
+ selectRow: "\u0627\u0646\u062A\u062E\u0627\u0628 \u0631\u062F\u06CC\u0641",
1144
+ noDataToDisplay: "\u062F\u0627\u062F\u0647\u200C\u0627\u06CC \u0628\u0631\u0627\u06CC \u0646\u0645\u0627\u06CC\u0634 \u0648\u062C\u0648\u062F \u0646\u062F\u0627\u0631\u062F",
1145
+ // InstagramPost
1146
+ likesCount: "\u062A\u0639\u062F\u0627\u062F \u0644\u0627\u06CC\u06A9",
1147
+ commentsCount: "\u062A\u0639\u062F\u0627\u062F \u06A9\u0627\u0645\u0646\u062A",
1148
+ viewsCount: "\u062A\u0639\u062F\u0627\u062F \u0628\u0627\u0632\u062F\u06CC\u062F",
1149
+ sharesCount: "\u062A\u0639\u062F\u0627\u062F \u0627\u0634\u062A\u0631\u0627\u06A9",
1150
+ postTypeLabel: "\u0646\u0648\u0639 \u067E\u0633\u062A",
1151
+ postTypePhoto: "\u0639\u06A9\u0633",
1152
+ postTypeVideo: "\u0648\u06CC\u062F\u06CC\u0648",
1153
+ postTypeCarousel: "\u0627\u0633\u0644\u0627\u06CC\u062F",
1154
+ showMore: "\u0628\u06CC\u0634\u062A\u0631",
1155
+ showLess: "\u06A9\u0645\u062A\u0631",
1156
+ noMediaAvailable: "\u0631\u0633\u0627\u0646\u0647\u200C\u0627\u06CC \u0645\u0648\u062C\u0648\u062F \u0646\u06CC\u0633\u062A",
1157
+ commentAnalysis: "\u062A\u062D\u0644\u06CC\u0644 \u06A9\u0627\u0645\u0646\u062A\u200C\u0647\u0627",
1158
+ commentAnalysisDisabled: "\u062A\u062D\u0644\u06CC\u0644 \u06A9\u0627\u0645\u0646\u062A\u200C\u0647\u0627 (\u063A\u06CC\u0631\u0641\u0639\u0627\u0644)",
1159
+ booster: "\u0628\u0648\u0633\u062A\u0631",
1160
+ boosterDisabled: "\u0628\u0648\u0633\u062A\u0631 (\u063A\u06CC\u0631\u0641\u0639\u0627\u0644)",
1161
+ aiAnalysis: "\u062A\u062D\u0644\u06CC\u0644 \u0647\u0648\u0634 \u0645\u0635\u0646\u0648\u0639\u06CC",
1162
+ aiAnalysisDisabled: "\u062A\u062D\u0644\u06CC\u0644 \u0647\u0648\u0634 \u0645\u0635\u0646\u0648\u0639\u06CC (\u063A\u06CC\u0631\u0641\u0639\u0627\u0644)",
1163
+ openOnInstagram: "\u0628\u0627\u0632 \u06A9\u0631\u062F\u0646 \u062F\u0631 \u0627\u06CC\u0646\u0633\u062A\u0627\u06AF\u0631\u0627\u0645",
1164
+ openOnInstagramDisabled: "\u0628\u0627\u0632 \u06A9\u0631\u062F\u0646 \u062F\u0631 \u0627\u06CC\u0646\u0633\u062A\u0627\u06AF\u0631\u0627\u0645 (\u063A\u06CC\u0631\u0641\u0639\u0627\u0644)"
1165
+ },
1166
+ ar: {
1167
+ noResults: "\u0644\u0645 \u064A\u062A\u0645 \u0627\u0644\u0639\u062B\u0648\u0631 \u0639\u0644\u0649 \u0646\u062A\u0627\u0626\u062C",
1168
+ suggestions: "\u0627\u0642\u062A\u0631\u0627\u062D\u0627\u062A",
1169
+ select: "\u0627\u062E\u062A\u0631",
1170
+ noOptionsFound: "\u0644\u0645 \u064A\u062A\u0645 \u0627\u0644\u0639\u062B\u0648\u0631 \u0639\u0644\u0649 \u062E\u064A\u0627\u0631\u0627\u062A",
1171
+ search: "\u0628\u062D\u062B...",
1172
+ clearAll: "\u0645\u0633\u062D \u0627\u0644\u0643\u0644",
1173
+ selectDate: "\u0627\u062E\u062A\u0631 \u062A\u0627\u0631\u064A\u062E",
1174
+ selectDateRange: "\u0627\u062E\u062A\u0631 \u0646\u0637\u0627\u0642 \u0627\u0644\u062A\u0627\u0631\u064A\u062E",
1175
+ errorLoadingData: "\u062E\u0637\u0623 \u0641\u064A \u062A\u062D\u0645\u064A\u0644 \u0627\u0644\u0628\u064A\u0627\u0646\u0627\u062A",
1176
+ retry: "\u0625\u0639\u0627\u062F\u0629 \u0627\u0644\u0645\u062D\u0627\u0648\u0644\u0629",
1177
+ remove: "\u062D\u0630\u0641",
1178
+ noUsersFound: "\u0644\u0645 \u064A\u062A\u0645 \u0627\u0644\u0639\u062B\u0648\u0631 \u0639\u0644\u0649 \u0645\u0633\u062A\u062E\u062F\u0645\u064A\u0646",
1179
+ goToPreviousPage: "\u0627\u0644\u0627\u0646\u062A\u0642\u0627\u0644 \u0625\u0644\u0649 \u0627\u0644\u0635\u0641\u062D\u0629 \u0627\u0644\u0633\u0627\u0628\u0642\u0629",
1180
+ goToNextPage: "\u0627\u0644\u0627\u0646\u062A\u0642\u0627\u0644 \u0625\u0644\u0649 \u0627\u0644\u0635\u0641\u062D\u0629 \u0627\u0644\u062A\u0627\u0644\u064A\u0629",
1181
+ previous: "\u0627\u0644\u0633\u0627\u0628\u0642",
1182
+ next: "\u0627\u0644\u062A\u0627\u0644\u064A",
1183
+ actions: "\u0625\u062C\u0631\u0627\u0621\u0627\u062A",
1184
+ // CopyButton
1185
+ copy: "\u0646\u0633\u062E",
1186
+ copied: "\u062A\u0645 \u0627\u0644\u0646\u0633\u062E",
1187
+ // ConfirmDialog
1188
+ confirm: "\u062A\u0623\u0643\u064A\u062F",
1189
+ cancel: "\u0625\u0644\u063A\u0627\u0621",
1190
+ areYouSure: "\u0647\u0644 \u0623\u0646\u062A \u0645\u062A\u0623\u0643\u062F\u061F",
1191
+ // Stepper
1192
+ stepperLabel: "\u0627\u0644\u062E\u0637\u0648\u0627\u062A",
1193
+ stepCompleted: "\u0645\u0643\u062A\u0645\u0644",
1194
+ stepCurrent: "\u0627\u0644\u062E\u0637\u0648\u0629 \u0627\u0644\u062D\u0627\u0644\u064A\u0629",
1195
+ stepPending: "\u0642\u064A\u062F \u0627\u0644\u0627\u0646\u062A\u0638\u0627\u0631",
1196
+ // FilterBar / FilterPanel
1197
+ clearFilters: "\u0645\u0633\u062D \u0627\u0644\u0641\u0644\u0627\u062A\u0631",
1198
+ activeFilters: "\u0627\u0644\u0641\u0644\u0627\u062A\u0631 \u0627\u0644\u0646\u0634\u0637\u0629",
1199
+ filters: "\u0627\u0644\u0641\u0644\u0627\u062A\u0631",
1200
+ applyFilters: "\u062A\u0637\u0628\u064A\u0642",
1201
+ resetFilters: "\u0627\u0644\u0627\u0641\u062A\u0631\u0627\u0636\u064A",
1202
+ noFiltersActive: "\u0644\u0627 \u062A\u0648\u062C\u062F \u0641\u0644\u0627\u062A\u0631 \u0646\u0634\u0637\u0629",
1203
+ clearSection: "\u0645\u0633\u062D \u0647\u0630\u0627 \u0627\u0644\u0642\u0633\u0645",
1204
+ // PageHeader
1205
+ goBack: "\u0631\u062C\u0648\u0639",
1206
+ // ViewToggle
1207
+ gridView: "\u0639\u0631\u0636 \u0634\u0628\u0643\u064A",
1208
+ listView: "\u0639\u0631\u0636 \u0642\u0627\u0626\u0645\u0629",
1209
+ // PageLoader
1210
+ loading: "\u062C\u0627\u0631\u064D \u0627\u0644\u062A\u062D\u0645\u064A\u0644...",
1211
+ // ErrorBoundary
1212
+ unexpectedError: "\u062D\u062F\u062B \u062E\u0637\u0623 \u063A\u064A\u0631 \u0645\u062A\u0648\u0642\u0639",
1213
+ // DataTable
1214
+ selectAll: "\u062A\u062D\u062F\u064A\u062F \u0627\u0644\u0643\u0644",
1215
+ selectRow: "\u062A\u062D\u062F\u064A\u062F \u0627\u0644\u0635\u0641",
1216
+ noDataToDisplay: "\u0644\u0627 \u062A\u0648\u062C\u062F \u0628\u064A\u0627\u0646\u0627\u062A \u0644\u0644\u0639\u0631\u0636",
1217
+ // InstagramPost
1218
+ likesCount: "\u0639\u062F\u062F \u0627\u0644\u0625\u0639\u062C\u0627\u0628\u0627\u062A",
1219
+ commentsCount: "\u0639\u062F\u062F \u0627\u0644\u062A\u0639\u0644\u064A\u0642\u0627\u062A",
1220
+ viewsCount: "\u0639\u062F\u062F \u0627\u0644\u0645\u0634\u0627\u0647\u062F\u0627\u062A",
1221
+ sharesCount: "\u0639\u062F\u062F \u0627\u0644\u0645\u0634\u0627\u0631\u0643\u0627\u062A",
1222
+ postTypeLabel: "\u0646\u0648\u0639 \u0627\u0644\u0645\u0646\u0634\u0648\u0631",
1223
+ postTypePhoto: "\u0635\u0648\u0631\u0629",
1224
+ postTypeVideo: "\u0641\u064A\u062F\u064A\u0648",
1225
+ postTypeCarousel: "\u0634\u0631\u0627\u0626\u062D",
1226
+ showMore: "\u0627\u0644\u0645\u0632\u064A\u062F",
1227
+ showLess: "\u0623\u0642\u0644",
1228
+ noMediaAvailable: "\u0644\u0627 \u062A\u0648\u062C\u062F \u0648\u0633\u0627\u0626\u0637",
1229
+ commentAnalysis: "\u062A\u062D\u0644\u064A\u0644 \u0627\u0644\u062A\u0639\u0644\u064A\u0642\u0627\u062A",
1230
+ commentAnalysisDisabled: "\u062A\u062D\u0644\u064A\u0644 \u0627\u0644\u062A\u0639\u0644\u064A\u0642\u0627\u062A (\u0645\u0639\u0637\u0644)",
1231
+ booster: "\u062A\u0639\u0632\u064A\u0632",
1232
+ boosterDisabled: "\u062A\u0639\u0632\u064A\u0632 (\u0645\u0639\u0637\u0644)",
1233
+ aiAnalysis: "\u062A\u062D\u0644\u064A\u0644 \u0627\u0644\u0630\u0643\u0627\u0621 \u0627\u0644\u0627\u0635\u0637\u0646\u0627\u0639\u064A",
1234
+ aiAnalysisDisabled: "\u062A\u062D\u0644\u064A\u0644 \u0627\u0644\u0630\u0643\u0627\u0621 \u0627\u0644\u0627\u0635\u0637\u0646\u0627\u0639\u064A (\u0645\u0639\u0637\u0644)",
1235
+ openOnInstagram: "\u0641\u062A\u062D \u0641\u064A \u0625\u0646\u0633\u062A\u0627\u062C\u0631\u0627\u0645",
1236
+ openOnInstagramDisabled: "\u0641\u062A\u062D \u0641\u064A \u0625\u0646\u0633\u062A\u0627\u062C\u0631\u0627\u0645 (\u0645\u0639\u0637\u0644)"
1237
+ },
1238
+ en: {
1239
+ noResults: "No results found",
1240
+ suggestions: "Suggestions",
1241
+ select: "Select",
1242
+ noOptionsFound: "No options found",
1243
+ search: "Search...",
1244
+ clearAll: "Clear all",
1245
+ selectDate: "Select date",
1246
+ selectDateRange: "Select date range",
1247
+ errorLoadingData: "Error loading data",
1248
+ retry: "Retry",
1249
+ remove: "Remove",
1250
+ noUsersFound: "No users found",
1251
+ goToPreviousPage: "Go to previous page",
1252
+ goToNextPage: "Go to next page",
1253
+ previous: "Previous",
1254
+ next: "Next",
1255
+ actions: "Actions",
1256
+ // CopyButton
1257
+ copy: "Copy",
1258
+ copied: "Copied",
1259
+ // ConfirmDialog
1260
+ confirm: "Confirm",
1261
+ cancel: "Cancel",
1262
+ areYouSure: "Are you sure?",
1263
+ // Stepper
1264
+ stepperLabel: "Steps",
1265
+ stepCompleted: "Completed",
1266
+ stepCurrent: "Current step",
1267
+ stepPending: "Pending",
1268
+ // FilterBar / FilterPanel
1269
+ clearFilters: "Clear filters",
1270
+ activeFilters: "Active filters",
1271
+ filters: "Filters",
1272
+ applyFilters: "Apply",
1273
+ resetFilters: "Reset",
1274
+ noFiltersActive: "No active filters",
1275
+ clearSection: "Clear this section",
1276
+ // PageHeader
1277
+ goBack: "Go back",
1278
+ // ViewToggle
1279
+ gridView: "Grid view",
1280
+ listView: "List view",
1281
+ // PageLoader
1282
+ loading: "Loading...",
1283
+ // ErrorBoundary
1284
+ unexpectedError: "An unexpected error occurred",
1285
+ // DataTable
1286
+ selectAll: "Select all",
1287
+ selectRow: "Select row",
1288
+ noDataToDisplay: "No data to display",
1289
+ // InstagramPost
1290
+ likesCount: "Likes",
1291
+ commentsCount: "Comments",
1292
+ viewsCount: "Views",
1293
+ sharesCount: "Shares",
1294
+ postTypeLabel: "Post type",
1295
+ postTypePhoto: "Photo",
1296
+ postTypeVideo: "Video",
1297
+ postTypeCarousel: "Carousel",
1298
+ showMore: "More",
1299
+ showLess: "Less",
1300
+ noMediaAvailable: "No media available",
1301
+ commentAnalysis: "Comment Analysis",
1302
+ commentAnalysisDisabled: "Comment Analysis (disabled)",
1303
+ booster: "Booster",
1304
+ boosterDisabled: "Booster (disabled)",
1305
+ aiAnalysis: "AI Analysis",
1306
+ aiAnalysisDisabled: "AI Analysis (disabled)",
1307
+ openOnInstagram: "Open on Instagram",
1308
+ openOnInstagramDisabled: "Open on Instagram (disabled)"
1309
+ }
1310
+ };
1311
+ function getUIStrings(locale = "fa") {
1312
+ return UI_STRINGS[locale] ?? UI_STRINGS.fa;
1313
+ }
1314
+
1315
+ // src/lib/constants.ts
1316
+ function normalizeSize(size) {
1317
+ return size;
1318
+ }
1319
+
1320
+ // src/lib/post-metric-labels.ts
1321
+ var DEFAULT_LABELS_FA = {
1322
+ views: "\u0628\u0627\u0632\u062F\u06CC\u062F",
1323
+ likes: "\u067E\u0633\u0646\u062F",
1324
+ comments: "\u0646\u0638\u0631",
1325
+ shares: "\u0627\u0634\u062A\u0631\u0627\u06A9",
1326
+ reposts: "\u0628\u0627\u0632\u0646\u0634\u0631",
1327
+ quotes: "\u0646\u0642\u0644\u200C\u0642\u0648\u0644",
1328
+ saves: "\u0630\u062E\u06CC\u0631\u0647",
1329
+ reach: "\u062F\u0633\u062A\u0631\u0633\u06CC",
1330
+ engagementRate: "\u0646\u0631\u062E \u062A\u0639\u0627\u0645\u0644",
1331
+ audience: "\u0645\u062E\u0627\u0637\u0628",
1332
+ reads: "\u0645\u0637\u0627\u0644\u0639\u0647",
1333
+ domainAuthority: "\u0627\u0639\u062A\u0628\u0627\u0631 \u062F\u0627\u0645\u0646\u0647",
1334
+ reactions: "\u0648\u0627\u06A9\u0646\u0634"
1335
+ };
1336
+ var DEFAULT_LABELS_EN = {
1337
+ views: "Views",
1338
+ likes: "Likes",
1339
+ comments: "Comments",
1340
+ shares: "Shares",
1341
+ reposts: "Reposts",
1342
+ quotes: "Quotes",
1343
+ saves: "Saves",
1344
+ reach: "Reach",
1345
+ engagementRate: "Engagement",
1346
+ audience: "Audience",
1347
+ reads: "Reads",
1348
+ domainAuthority: "Domain Authority",
1349
+ reactions: "Reactions"
1350
+ };
1351
+ var FA_OVERRIDES = {
1352
+ instagram: { views: "\u0628\u0627\u0632\u062F\u06CC\u062F", likes: "\u0644\u0627\u06CC\u06A9" },
1353
+ twitter: { views: "\u0646\u0645\u0627\u06CC\u0634", likes: "\u0644\u0627\u06CC\u06A9", reposts: "\u0631\u06CC\u200C\u062A\u0648\u06CC\u06CC\u062A", quotes: "\u0646\u0642\u0644\u200C\u0642\u0648\u0644" },
1354
+ tiktok: { views: "\u062A\u0645\u0627\u0634\u0627", likes: "\u0644\u0627\u06CC\u06A9", saves: "\u0630\u062E\u06CC\u0631\u0647" },
1355
+ youtube: { views: "\u0628\u0627\u0632\u062F\u06CC\u062F", likes: "\u0644\u0627\u06CC\u06A9" },
1356
+ linkedin: { likes: "\u0644\u0627\u06CC\u06A9", reposts: "\u0628\u0627\u0632\u0646\u0634\u0631" },
1357
+ telegram: { views: "\u0628\u0627\u0632\u062F\u06CC\u062F", reposts: "\u0641\u0648\u0631\u0648\u0627\u0631\u062F" },
1358
+ threads: { likes: "\u0644\u0627\u06CC\u06A9", reposts: "\u0628\u0627\u0632\u0646\u0634\u0631", quotes: "\u0646\u0642\u0644\u200C\u0642\u0648\u0644" },
1359
+ facebook: { likes: "\u0644\u0627\u06CC\u06A9", shares: "\u0647\u0645\u200C\u0631\u0633\u0627\u0646\u06CC", views: "\u0628\u0627\u0632\u062F\u06CC\u062F" },
1360
+ tv: { audience: "\u0628\u06CC\u0646\u0646\u062F\u0647", views: "\u0628\u06CC\u0646\u0646\u062F\u0647", reach: "\u062F\u0633\u062A\u0631\u0633\u06CC \u067E\u062E\u0634" },
1361
+ radio: { audience: "\u0634\u0646\u0648\u0646\u062F\u0647", views: "\u0634\u0646\u0648\u0646\u062F\u0647", reach: "\u062F\u0633\u062A\u0631\u0633\u06CC \u067E\u062E\u0634" },
1362
+ press: { audience: "\u062E\u0648\u0627\u0646\u0646\u062F\u0647", reads: "\u0645\u0637\u0627\u0644\u0639\u0647", shares: "\u0627\u0634\u062A\u0631\u0627\u06A9\u200C\u06AF\u0630\u0627\u0631\u06CC" },
1363
+ web: { audience: "\u0628\u0627\u0632\u062F\u06CC\u062F\u06A9\u0646\u0646\u062F\u0647", reads: "\u0645\u0637\u0627\u0644\u0639\u0647", shares: "\u0627\u0634\u062A\u0631\u0627\u06A9\u200C\u06AF\u0630\u0627\u0631\u06CC" }
1364
+ };
1365
+ var EN_OVERRIDES = {
1366
+ twitter: { views: "Impressions", reposts: "Retweets" },
1367
+ tiktok: { views: "Plays" },
1368
+ telegram: { reposts: "Forwards" },
1369
+ tv: { audience: "Viewers", views: "Viewers" },
1370
+ radio: { audience: "Listeners", views: "Listeners" },
1371
+ press: { audience: "Readers" },
1372
+ web: { audience: "Visitors" }
1373
+ };
1374
+ function getMetricLabel(source, key, locale = "fa") {
1375
+ const overrides = locale === "fa" ? FA_OVERRIDES : EN_OVERRIDES;
1376
+ const defaults = locale === "fa" ? DEFAULT_LABELS_FA : DEFAULT_LABELS_EN;
1377
+ return overrides[source]?.[key] ?? defaults[key];
1378
+ }
1379
+ var SOCIAL_BRAND = { kind: "social-brand" };
1380
+ var SOURCE_CONFIG = {
1381
+ instagram: {
1382
+ label: "Instagram",
1383
+ labelFa: "\u0627\u06CC\u0646\u0633\u062A\u0627\u06AF\u0631\u0627\u0645",
1384
+ category: "social",
1385
+ colorVar: "--social-platform-instagram",
1386
+ icon: SOCIAL_BRAND,
1387
+ defaultMetrics: ["likes", "comments", "shares", "views"]
1388
+ },
1389
+ twitter: {
1390
+ label: "X",
1391
+ labelFa: "\u0627\u06CC\u06A9\u0633",
1392
+ category: "social",
1393
+ colorVar: "--social-platform-twitter",
1394
+ icon: SOCIAL_BRAND,
1395
+ defaultMetrics: ["views", "likes", "reposts", "quotes", "comments"]
1396
+ },
1397
+ tiktok: {
1398
+ label: "TikTok",
1399
+ labelFa: "\u062A\u06CC\u06A9\u200C\u062A\u0627\u06A9",
1400
+ category: "social",
1401
+ colorVar: "--social-platform-tiktok",
1402
+ icon: SOCIAL_BRAND,
1403
+ defaultMetrics: ["views", "likes", "comments", "shares"]
1404
+ },
1405
+ youtube: {
1406
+ label: "YouTube",
1407
+ labelFa: "\u06CC\u0648\u062A\u06CC\u0648\u0628",
1408
+ category: "social",
1409
+ colorVar: "--social-platform-youtube",
1410
+ icon: SOCIAL_BRAND,
1411
+ defaultMetrics: ["views", "likes", "comments"]
1412
+ },
1413
+ linkedin: {
1414
+ label: "LinkedIn",
1415
+ labelFa: "\u0644\u06CC\u0646\u06A9\u062F\u06CC\u0646",
1416
+ category: "social",
1417
+ colorVar: "--social-platform-linkedin",
1418
+ icon: SOCIAL_BRAND,
1419
+ defaultMetrics: ["likes", "comments", "reposts", "views"]
1420
+ },
1421
+ telegram: {
1422
+ label: "Telegram",
1423
+ labelFa: "\u062A\u0644\u06AF\u0631\u0627\u0645",
1424
+ category: "social",
1425
+ colorVar: "--social-platform-telegram",
1426
+ icon: SOCIAL_BRAND,
1427
+ defaultMetrics: ["views", "reposts", "comments"]
1428
+ },
1429
+ threads: {
1430
+ label: "Threads",
1431
+ labelFa: "\u062A\u0631\u062F\u0632",
1432
+ category: "social",
1433
+ colorVar: "--social-platform-threads",
1434
+ icon: SOCIAL_BRAND,
1435
+ defaultMetrics: ["likes", "comments", "reposts", "quotes"]
1436
+ },
1437
+ facebook: {
1438
+ label: "Facebook",
1439
+ labelFa: "\u0641\u06CC\u0633\u0628\u0648\u06A9",
1440
+ category: "social",
1441
+ colorVar: "--social-platform-facebook",
1442
+ icon: SOCIAL_BRAND,
1443
+ defaultMetrics: ["likes", "comments", "shares", "views"]
1444
+ },
1445
+ tv: {
1446
+ label: "TV",
1447
+ labelFa: "\u062A\u0644\u0648\u06CC\u0632\u06CC\u0648\u0646",
1448
+ category: "broadcast",
1449
+ colorVar: "--social-platform-tv",
1450
+ icon: { kind: "lucide", icon: lucideReact.Tv },
1451
+ defaultMetrics: ["audience", "reach"]
1452
+ },
1453
+ radio: {
1454
+ label: "Radio",
1455
+ labelFa: "\u0631\u0627\u062F\u06CC\u0648",
1456
+ category: "broadcast",
1457
+ colorVar: "--social-platform-radio",
1458
+ icon: { kind: "lucide", icon: lucideReact.Radio },
1459
+ defaultMetrics: ["audience", "reach"]
1460
+ },
1461
+ press: {
1462
+ label: "Press",
1463
+ labelFa: "\u0645\u0637\u0628\u0648\u0639\u0627\u062A",
1464
+ category: "editorial",
1465
+ colorVar: "--social-platform-press",
1466
+ icon: { kind: "lucide", icon: lucideReact.Newspaper },
1467
+ defaultMetrics: ["reads", "shares", "comments"]
1468
+ },
1469
+ web: {
1470
+ label: "Web",
1471
+ labelFa: "\u0648\u0628",
1472
+ category: "editorial",
1473
+ colorVar: "--social-platform-web",
1474
+ icon: { kind: "lucide", icon: lucideReact.Globe },
1475
+ defaultMetrics: ["reads", "shares", "comments"]
1476
+ }
1477
+ };
1478
+ function getPostSourceConfig(source) {
1479
+ return SOURCE_CONFIG[source];
1480
+ }
1481
+ function getSourceColorVar(source) {
1482
+ return `var(${SOURCE_CONFIG[source].colorVar})`;
1483
+ }
1484
+
1485
+ exports.ACTION_STATUS_KEYS = ACTION_STATUS_KEYS;
1486
+ exports.ACTION_TYPE_KEYS = ACTION_TYPE_KEYS;
1487
+ exports.COUNTRIES = COUNTRIES;
1488
+ exports.EMOTION_KEYS = EMOTION_KEYS;
1489
+ exports.EMOTION_KEY_TO_VALUE = EMOTION_KEY_TO_VALUE;
1490
+ exports.EMOTION_VALUE_MAP = EMOTION_VALUE_MAP;
1491
+ exports.ENGAGEMENT_RANGES = ENGAGEMENT_RANGES;
1492
+ exports.ENTITY_HEALTH_KEYS = ENTITY_HEALTH_KEYS;
1493
+ exports.FLOW_KEYS = FLOW_KEYS;
1494
+ exports.FLOW_KEY_TO_VALUE = FLOW_KEY_TO_VALUE;
1495
+ exports.FLOW_VALUE_MAP = FLOW_VALUE_MAP;
1496
+ exports.GROUP_LABELS = GROUP_LABELS;
1497
+ exports.IRAN_PROVINCES = IRAN_PROVINCES;
1498
+ exports.JOB_STATUS_KEYS = JOB_STATUS_KEYS;
1499
+ exports.PERSIAN_MONTHS = PERSIAN_MONTHS;
1500
+ exports.PERSIAN_MONTHS_SHORT = PERSIAN_MONTHS_SHORT;
1501
+ exports.PERSIAN_WEEKDAYS = PERSIAN_WEEKDAYS;
1502
+ exports.PERSIAN_WEEKDAYS_SHORT = PERSIAN_WEEKDAYS_SHORT;
1503
+ exports.SEVERITY_KEYS = SEVERITY_KEYS;
1504
+ exports.SEVERITY_KEY_TO_VALUE = SEVERITY_KEY_TO_VALUE;
1505
+ exports.SEVERITY_VALUE_MAP = SEVERITY_VALUE_MAP;
1506
+ exports.STAGE_STATUS_KEYS = STAGE_STATUS_KEYS;
1507
+ exports.STATUS_KEYS = STATUS_KEYS;
1508
+ exports.STATUS_KEY_TO_VALUE = STATUS_KEY_TO_VALUE;
1509
+ exports.STATUS_VALUE_MAP = STATUS_VALUE_MAP;
1510
+ exports.TIER_LABELS = TIER_LABELS;
1511
+ exports.UI_STRINGS = UI_STRINGS;
1512
+ exports.actionStatusLabels = actionStatusLabels;
1513
+ exports.actionTypeLabels = actionTypeLabels;
1514
+ exports.actionTypeVerbs = actionTypeVerbs;
1515
+ exports.cn = cn;
1516
+ exports.convertToLocalNumbers = convertToLocalNumbers;
1517
+ exports.countryFlag = countryFlag;
1518
+ exports.emotionLabels = emotionLabels;
1519
+ exports.engagementUiTranslations = engagementUiTranslations;
1520
+ exports.entityHealthLabels = entityHealthLabels;
1521
+ exports.entityHealthPriority = entityHealthPriority;
1522
+ exports.findCountry = findCountry;
1523
+ exports.findProvince = findProvince;
1524
+ exports.flowLabels = flowLabels;
1525
+ exports.formatAbsoluteTime = formatAbsoluteTime;
1526
+ exports.formatJalaliDate = formatJalaliDate;
1527
+ exports.formatLargeNumber = formatLargeNumber;
1528
+ exports.formatNumber = formatNumber;
1529
+ exports.formatPersianDateRange = formatPersianDateRange;
1530
+ exports.formatRelativeLocaleTime = formatRelativeLocaleTime;
1531
+ exports.formatRelativeTime = formatRelativeTime;
1532
+ exports.formatTimeRemaining = formatTimeRemaining;
1533
+ exports.getCountryLabel = getCountryLabel;
1534
+ exports.getCurrentRangeIndex = getCurrentRangeIndex;
1535
+ exports.getEngagementRanges = getEngagementRanges;
1536
+ exports.getFollowerGroup = getFollowerGroup;
1537
+ exports.getMetricLabel = getMetricLabel;
1538
+ exports.getPersianDay = getPersianDay;
1539
+ exports.getPersianMonth = getPersianMonth;
1540
+ exports.getPersianMonthName = getPersianMonthName;
1541
+ exports.getPersianMonthNameShort = getPersianMonthNameShort;
1542
+ exports.getPersianMonthsForDropdown = getPersianMonthsForDropdown;
1543
+ exports.getPersianWeekdayName = getPersianWeekdayName;
1544
+ exports.getPersianYear = getPersianYear;
1545
+ exports.getPersianYearsForDropdown = getPersianYearsForDropdown;
1546
+ exports.getPostSourceConfig = getPostSourceConfig;
1547
+ exports.getProvinceLabel = getProvinceLabel;
1548
+ exports.getSourceColorVar = getSourceColorVar;
1549
+ exports.getUIStrings = getUIStrings;
1550
+ exports.isActiveJobStatus = isActiveJobStatus;
1551
+ exports.isCriticalEntityHealth = isCriticalEntityHealth;
1552
+ exports.isRTL = isRTL;
1553
+ exports.jalaliToGregorian = jalaliToGregorian;
1554
+ exports.jobStatusLabels = jobStatusLabels;
1555
+ exports.normalizeSize = normalizeSize;
1556
+ exports.resolveEmotion = resolveEmotion;
1557
+ exports.resolveFlow = resolveFlow;
1558
+ exports.resolveSeverity = resolveSeverity;
1559
+ exports.resolveStatus = resolveStatus;
1560
+ exports.sentimentLabels = sentimentLabels;
1561
+ exports.severityLabels = severityLabels;
1562
+ exports.stageStatusLabels = stageStatusLabels;
1563
+ exports.statusLabels = statusLabels;
1564
+ exports.toEnglishDigits = toEnglishDigits;
1565
+ exports.toPersianDigits = toPersianDigits;