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