@parto-system-design/ui 1.1.5 → 1.1.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (301) hide show
  1. package/AGENTS.md +233 -0
  2. package/LICENSE +21 -0
  3. package/README.md +96 -43
  4. package/dist/chunk-2ACKKPWA.cjs +112 -0
  5. package/dist/chunk-2ACKKPWA.cjs.map +1 -0
  6. package/dist/chunk-2UD3LGVX.cjs +316 -0
  7. package/dist/chunk-2UD3LGVX.cjs.map +1 -0
  8. package/dist/chunk-3QYYPPFJ.js +269 -0
  9. package/dist/chunk-3QYYPPFJ.js.map +1 -0
  10. package/dist/chunk-4SVQNEVH.js +173 -0
  11. package/dist/chunk-4SVQNEVH.js.map +1 -0
  12. package/dist/chunk-4WONHORR.cjs +152 -0
  13. package/dist/chunk-4WONHORR.cjs.map +1 -0
  14. package/dist/chunk-5HCXH6GS.js +409 -0
  15. package/dist/chunk-5HCXH6GS.js.map +1 -0
  16. package/dist/chunk-5JJSRGJD.js +31 -0
  17. package/dist/chunk-5JJSRGJD.js.map +1 -0
  18. package/dist/chunk-5K6E4ZSW.cjs +77 -0
  19. package/dist/chunk-5K6E4ZSW.cjs.map +1 -0
  20. package/dist/chunk-5NY26ULO.js +89 -0
  21. package/dist/chunk-5NY26ULO.js.map +1 -0
  22. package/dist/chunk-7RVPG3LE.cjs +231 -0
  23. package/dist/chunk-7RVPG3LE.cjs.map +1 -0
  24. package/dist/chunk-AYEK3WOM.js +207 -0
  25. package/dist/chunk-AYEK3WOM.js.map +1 -0
  26. package/dist/chunk-BRMBLIQG.js +53 -0
  27. package/dist/chunk-BRMBLIQG.js.map +1 -0
  28. package/dist/chunk-CAJKSTXX.cjs +54 -0
  29. package/dist/chunk-CAJKSTXX.cjs.map +1 -0
  30. package/dist/chunk-CKFWMHQU.js +401 -0
  31. package/dist/chunk-CKFWMHQU.js.map +1 -0
  32. package/dist/chunk-CV3N3HVK.js +672 -0
  33. package/dist/chunk-CV3N3HVK.js.map +1 -0
  34. package/dist/chunk-D2EBLE2B.cjs +220 -0
  35. package/dist/chunk-D2EBLE2B.cjs.map +1 -0
  36. package/dist/chunk-GCZ6YATL.js +940 -0
  37. package/dist/chunk-GCZ6YATL.js.map +1 -0
  38. package/dist/chunk-GKRAZGDI.cjs +84 -0
  39. package/dist/chunk-GKRAZGDI.cjs.map +1 -0
  40. package/dist/chunk-GPYJ66CG.js +45 -0
  41. package/dist/chunk-GPYJ66CG.js.map +1 -0
  42. package/dist/chunk-HF6XU5NI.js +84 -0
  43. package/dist/chunk-HF6XU5NI.js.map +1 -0
  44. package/dist/chunk-HJPDZOMJ.cjs +87 -0
  45. package/dist/chunk-HJPDZOMJ.cjs.map +1 -0
  46. package/dist/chunk-HS3XI3CC.cjs +69 -0
  47. package/dist/chunk-HS3XI3CC.cjs.map +1 -0
  48. package/dist/chunk-HUCC3QH5.cjs +53 -0
  49. package/dist/chunk-HUCC3QH5.cjs.map +1 -0
  50. package/dist/chunk-HYZ6BQPS.cjs +425 -0
  51. package/dist/chunk-HYZ6BQPS.cjs.map +1 -0
  52. package/dist/chunk-ISCSZMYW.cjs +106 -0
  53. package/dist/chunk-ISCSZMYW.cjs.map +1 -0
  54. package/dist/chunk-IXFEFIDO.js +82 -0
  55. package/dist/chunk-IXFEFIDO.js.map +1 -0
  56. package/dist/chunk-JCJLN437.js +108 -0
  57. package/dist/chunk-JCJLN437.js.map +1 -0
  58. package/dist/chunk-JMKNNH63.cjs +982 -0
  59. package/dist/chunk-JMKNNH63.cjs.map +1 -0
  60. package/dist/chunk-JUBHQAA2.js +53 -0
  61. package/dist/chunk-JUBHQAA2.js.map +1 -0
  62. package/dist/chunk-K6G63EED.cjs +41 -0
  63. package/dist/chunk-K6G63EED.cjs.map +1 -0
  64. package/dist/chunk-KCWRCSI7.js +62 -0
  65. package/dist/chunk-KCWRCSI7.js.map +1 -0
  66. package/dist/chunk-KYM7NIJO.cjs +433 -0
  67. package/dist/chunk-KYM7NIJO.cjs.map +1 -0
  68. package/dist/chunk-L2L5CKC2.js +291 -0
  69. package/dist/chunk-L2L5CKC2.js.map +1 -0
  70. package/dist/chunk-M5CHZ5BA.js +124 -0
  71. package/dist/chunk-M5CHZ5BA.js.map +1 -0
  72. package/dist/chunk-MEK4RSGC.js +65 -0
  73. package/dist/chunk-MEK4RSGC.js.map +1 -0
  74. package/dist/chunk-MEKWH3GS.js +89 -0
  75. package/dist/chunk-MEKWH3GS.js.map +1 -0
  76. package/dist/chunk-MFTX2DDQ.js +27 -0
  77. package/dist/chunk-MFTX2DDQ.js.map +1 -0
  78. package/dist/chunk-MMC6M35Q.cjs +272 -0
  79. package/dist/chunk-MMC6M35Q.cjs.map +1 -0
  80. package/dist/chunk-NMH43BDC.js +130 -0
  81. package/dist/chunk-NMH43BDC.js.map +1 -0
  82. package/dist/chunk-NORDUD2T.cjs +135 -0
  83. package/dist/chunk-NORDUD2T.cjs.map +1 -0
  84. package/dist/chunk-NV4JOKWL.cjs +197 -0
  85. package/dist/chunk-NV4JOKWL.cjs.map +1 -0
  86. package/dist/chunk-O2JG7WY5.cjs +121 -0
  87. package/dist/chunk-O2JG7WY5.cjs.map +1 -0
  88. package/dist/chunk-ONO2FTV4.cjs +68 -0
  89. package/dist/chunk-ONO2FTV4.cjs.map +1 -0
  90. package/dist/chunk-OQB6HIUL.cjs +108 -0
  91. package/dist/chunk-OQB6HIUL.cjs.map +1 -0
  92. package/dist/chunk-OS6CMYAS.cjs +79 -0
  93. package/dist/chunk-OS6CMYAS.cjs.map +1 -0
  94. package/dist/chunk-PYURPUTV.js +402 -0
  95. package/dist/chunk-PYURPUTV.js.map +1 -0
  96. package/dist/chunk-RJ3HYZ7S.js +44 -0
  97. package/dist/chunk-RJ3HYZ7S.js.map +1 -0
  98. package/dist/chunk-RZNRIOLT.js +128 -0
  99. package/dist/chunk-RZNRIOLT.js.map +1 -0
  100. package/dist/chunk-S3T2L6NA.js +38 -0
  101. package/dist/chunk-S3T2L6NA.js.map +1 -0
  102. package/dist/chunk-S5IPJQZ3.cjs +161 -0
  103. package/dist/chunk-S5IPJQZ3.cjs.map +1 -0
  104. package/dist/chunk-SB5DSYR5.js +211 -0
  105. package/dist/chunk-SB5DSYR5.js.map +1 -0
  106. package/dist/chunk-SFXV2DUH.js +106 -0
  107. package/dist/chunk-SFXV2DUH.js.map +1 -0
  108. package/dist/chunk-SXEPGD4Z.cjs +152 -0
  109. package/dist/chunk-SXEPGD4Z.cjs.map +1 -0
  110. package/dist/chunk-SXWSOU3Y.js +89 -0
  111. package/dist/chunk-SXWSOU3Y.js.map +1 -0
  112. package/dist/chunk-SZMVOHT7.cjs +107 -0
  113. package/dist/chunk-SZMVOHT7.cjs.map +1 -0
  114. package/dist/chunk-TWJXOV4C.js +145 -0
  115. package/dist/chunk-TWJXOV4C.js.map +1 -0
  116. package/dist/chunk-U3ADRIVO.cjs +434 -0
  117. package/dist/chunk-U3ADRIVO.cjs.map +1 -0
  118. package/dist/chunk-U5FLLCGC.cjs +151 -0
  119. package/dist/chunk-U5FLLCGC.cjs.map +1 -0
  120. package/dist/chunk-UOZN45G4.cjs +130 -0
  121. package/dist/chunk-UOZN45G4.cjs.map +1 -0
  122. package/dist/chunk-VHLDOG74.cjs +167 -0
  123. package/dist/chunk-VHLDOG74.cjs.map +1 -0
  124. package/dist/chunk-YC5KLN6I.js +139 -0
  125. package/dist/chunk-YC5KLN6I.js.map +1 -0
  126. package/dist/chunk-YENXXYUV.cjs +111 -0
  127. package/dist/chunk-YENXXYUV.cjs.map +1 -0
  128. package/dist/chunk-YFQWC2PW.js +113 -0
  129. package/dist/chunk-YFQWC2PW.js.map +1 -0
  130. package/dist/chunk-Z2TY4A75.cjs +700 -0
  131. package/dist/chunk-Z2TY4A75.cjs.map +1 -0
  132. package/dist/chunk-Z56O7UEU.cjs +136 -0
  133. package/dist/chunk-Z56O7UEU.cjs.map +1 -0
  134. package/dist/chunk-ZBZDR4ZC.js +106 -0
  135. package/dist/chunk-ZBZDR4ZC.js.map +1 -0
  136. package/dist/components/charts/PartoAreaChart.cjs +15 -0
  137. package/dist/components/charts/PartoAreaChart.cjs.map +1 -0
  138. package/dist/components/charts/PartoAreaChart.d.cts +53 -0
  139. package/dist/components/charts/PartoAreaChart.d.ts +53 -0
  140. package/dist/components/charts/PartoAreaChart.js +6 -0
  141. package/dist/components/charts/PartoAreaChart.js.map +1 -0
  142. package/dist/components/charts/PartoBarChart.cjs +15 -0
  143. package/dist/components/charts/PartoBarChart.cjs.map +1 -0
  144. package/dist/components/charts/PartoBarChart.d.cts +61 -0
  145. package/dist/components/charts/PartoBarChart.d.ts +61 -0
  146. package/dist/components/charts/PartoBarChart.js +6 -0
  147. package/dist/components/charts/PartoBarChart.js.map +1 -0
  148. package/dist/components/charts/PartoLineChart.cjs +15 -0
  149. package/dist/components/charts/PartoLineChart.cjs.map +1 -0
  150. package/dist/components/charts/PartoLineChart.d.cts +57 -0
  151. package/dist/components/charts/PartoLineChart.d.ts +57 -0
  152. package/dist/components/charts/PartoLineChart.js +6 -0
  153. package/dist/components/charts/PartoLineChart.js.map +1 -0
  154. package/dist/components/charts/PartoPieChart.cjs +15 -0
  155. package/dist/components/charts/PartoPieChart.cjs.map +1 -0
  156. package/dist/components/charts/PartoPieChart.d.cts +52 -0
  157. package/dist/components/charts/PartoPieChart.d.ts +52 -0
  158. package/dist/components/charts/PartoPieChart.js +6 -0
  159. package/dist/components/charts/PartoPieChart.js.map +1 -0
  160. package/dist/components/ui/alert-rule-card.cjs +15 -0
  161. package/dist/components/ui/alert-rule-card.cjs.map +1 -0
  162. package/dist/components/ui/alert-rule-card.d.cts +38 -0
  163. package/dist/components/ui/alert-rule-card.d.ts +38 -0
  164. package/dist/components/ui/alert-rule-card.js +6 -0
  165. package/dist/components/ui/alert-rule-card.js.map +1 -0
  166. package/dist/components/ui/avatar.cjs +21 -0
  167. package/dist/components/ui/avatar.cjs.map +1 -0
  168. package/dist/components/ui/avatar.d.cts +18 -0
  169. package/dist/components/ui/avatar.d.ts +18 -0
  170. package/dist/components/ui/avatar.js +4 -0
  171. package/dist/components/ui/avatar.js.map +1 -0
  172. package/dist/components/ui/badge.cjs +17 -0
  173. package/dist/components/ui/badge.cjs.map +1 -0
  174. package/dist/components/ui/badge.d.cts +16 -0
  175. package/dist/components/ui/badge.d.ts +16 -0
  176. package/dist/components/ui/badge.js +4 -0
  177. package/dist/components/ui/badge.js.map +1 -0
  178. package/dist/components/ui/button.cjs +18 -0
  179. package/dist/components/ui/button.cjs.map +1 -0
  180. package/dist/components/ui/button.d.cts +37 -0
  181. package/dist/components/ui/button.d.ts +37 -0
  182. package/dist/components/ui/button.js +5 -0
  183. package/dist/components/ui/button.js.map +1 -0
  184. package/dist/components/ui/calendar.cjs +15 -0
  185. package/dist/components/ui/calendar.cjs.map +1 -0
  186. package/dist/components/ui/calendar.d.cts +17 -0
  187. package/dist/components/ui/calendar.d.ts +17 -0
  188. package/dist/components/ui/calendar.js +6 -0
  189. package/dist/components/ui/calendar.js.map +1 -0
  190. package/dist/components/ui/card.cjs +37 -0
  191. package/dist/components/ui/card.cjs.map +1 -0
  192. package/dist/components/ui/card.d.cts +18 -0
  193. package/dist/components/ui/card.d.ts +18 -0
  194. package/dist/components/ui/card.js +4 -0
  195. package/dist/components/ui/card.js.map +1 -0
  196. package/dist/components/ui/concept-card.cjs +18 -0
  197. package/dist/components/ui/concept-card.cjs.map +1 -0
  198. package/dist/components/ui/concept-card.d.cts +5 -0
  199. package/dist/components/ui/concept-card.d.ts +5 -0
  200. package/dist/components/ui/concept-card.js +9 -0
  201. package/dist/components/ui/concept-card.js.map +1 -0
  202. package/dist/components/ui/data-table.cjs +18 -0
  203. package/dist/components/ui/data-table.cjs.map +1 -0
  204. package/dist/components/ui/data-table.d.cts +181 -0
  205. package/dist/components/ui/data-table.d.ts +181 -0
  206. package/dist/components/ui/data-table.js +9 -0
  207. package/dist/components/ui/data-table.js.map +1 -0
  208. package/dist/components/ui/dialog.cjs +49 -0
  209. package/dist/components/ui/dialog.cjs.map +1 -0
  210. package/dist/components/ui/dialog.d.cts +22 -0
  211. package/dist/components/ui/dialog.d.ts +22 -0
  212. package/dist/components/ui/dialog.js +4 -0
  213. package/dist/components/ui/dialog.js.map +1 -0
  214. package/dist/components/ui/filter-provider.cjs +20 -0
  215. package/dist/components/ui/filter-provider.cjs.map +1 -0
  216. package/dist/components/ui/filter-provider.d.cts +49 -0
  217. package/dist/components/ui/filter-provider.d.ts +49 -0
  218. package/dist/components/ui/filter-provider.js +3 -0
  219. package/dist/components/ui/filter-provider.js.map +1 -0
  220. package/dist/components/ui/input.cjs +22 -0
  221. package/dist/components/ui/input.cjs.map +1 -0
  222. package/dist/components/ui/input.d.cts +16 -0
  223. package/dist/components/ui/input.d.ts +16 -0
  224. package/dist/components/ui/input.js +5 -0
  225. package/dist/components/ui/input.js.map +1 -0
  226. package/dist/components/ui/iran-province-heat.cjs +13 -0
  227. package/dist/components/ui/iran-province-heat.cjs.map +1 -0
  228. package/dist/components/ui/iran-province-heat.d.cts +64 -0
  229. package/dist/components/ui/iran-province-heat.d.ts +64 -0
  230. package/dist/components/ui/iran-province-heat.js +4 -0
  231. package/dist/components/ui/iran-province-heat.js.map +1 -0
  232. package/dist/components/ui/page-card.cjs +16 -0
  233. package/dist/components/ui/page-card.cjs.map +1 -0
  234. package/dist/components/ui/page-card.d.cts +6 -0
  235. package/dist/components/ui/page-card.d.ts +6 -0
  236. package/dist/components/ui/page-card.js +7 -0
  237. package/dist/components/ui/page-card.js.map +1 -0
  238. package/dist/components/ui/popover.cjs +25 -0
  239. package/dist/components/ui/popover.cjs.map +1 -0
  240. package/dist/components/ui/popover.d.cts +9 -0
  241. package/dist/components/ui/popover.d.ts +9 -0
  242. package/dist/components/ui/popover.js +4 -0
  243. package/dist/components/ui/popover.js.map +1 -0
  244. package/dist/components/ui/saved-query-card.cjs +15 -0
  245. package/dist/components/ui/saved-query-card.cjs.map +1 -0
  246. package/dist/components/ui/saved-query-card.d.cts +41 -0
  247. package/dist/components/ui/saved-query-card.d.ts +41 -0
  248. package/dist/components/ui/saved-query-card.js +6 -0
  249. package/dist/components/ui/saved-query-card.js.map +1 -0
  250. package/dist/components/ui/separator.cjs +13 -0
  251. package/dist/components/ui/separator.cjs.map +1 -0
  252. package/dist/components/ui/separator.d.cts +9 -0
  253. package/dist/components/ui/separator.d.ts +9 -0
  254. package/dist/components/ui/separator.js +4 -0
  255. package/dist/components/ui/separator.js.map +1 -0
  256. package/dist/components/ui/sheet.cjs +45 -0
  257. package/dist/components/ui/sheet.cjs.map +1 -0
  258. package/dist/components/ui/sheet.d.cts +44 -0
  259. package/dist/components/ui/sheet.d.ts +44 -0
  260. package/dist/components/ui/sheet.js +4 -0
  261. package/dist/components/ui/sheet.js.map +1 -0
  262. package/dist/components/ui/sparkline.cjs +13 -0
  263. package/dist/components/ui/sparkline.cjs.map +1 -0
  264. package/dist/components/ui/sparkline.d.cts +36 -0
  265. package/dist/components/ui/sparkline.d.ts +36 -0
  266. package/dist/components/ui/sparkline.js +4 -0
  267. package/dist/components/ui/sparkline.js.map +1 -0
  268. package/dist/components/ui/tooltip.cjs +25 -0
  269. package/dist/components/ui/tooltip.cjs.map +1 -0
  270. package/dist/components/ui/tooltip.d.cts +17 -0
  271. package/dist/components/ui/tooltip.d.ts +17 -0
  272. package/dist/components/ui/tooltip.js +4 -0
  273. package/dist/components/ui/tooltip.js.map +1 -0
  274. package/dist/concept-card-CcOBb2Nz.d.ts +83 -0
  275. package/dist/concept-card-RwPbqJ06.d.cts +83 -0
  276. package/dist/hooks/use-hotkey-registry.cjs +21 -0
  277. package/dist/hooks/use-hotkey-registry.cjs.map +1 -0
  278. package/dist/hooks/use-hotkey-registry.d.cts +65 -0
  279. package/dist/hooks/use-hotkey-registry.d.ts +65 -0
  280. package/dist/hooks/use-hotkey-registry.js +4 -0
  281. package/dist/hooks/use-hotkey-registry.js.map +1 -0
  282. package/dist/hooks/use-hotkeys.cjs +16 -0
  283. package/dist/hooks/use-hotkeys.cjs.map +1 -0
  284. package/dist/hooks/use-hotkeys.d.cts +66 -0
  285. package/dist/hooks/use-hotkeys.d.ts +66 -0
  286. package/dist/hooks/use-hotkeys.js +3 -0
  287. package/dist/hooks/use-hotkeys.js.map +1 -0
  288. package/dist/i18n-ArS3mqj0.d.ts +344 -0
  289. package/dist/i18n-CAd9wGOr.d.cts +344 -0
  290. package/dist/index.cjs +12195 -13224
  291. package/dist/index.cjs.map +1 -1
  292. package/dist/index.css +490 -34
  293. package/dist/index.d.cts +1635 -1263
  294. package/dist/index.d.ts +1635 -1263
  295. package/dist/index.js +10693 -12364
  296. package/dist/index.js.map +1 -1
  297. package/dist/page-card-CmShVqG-.d.cts +100 -0
  298. package/dist/page-card-HBn-cy4J.d.ts +100 -0
  299. package/dist/utils-DlXWmDZ-.d.cts +35 -0
  300. package/dist/utils-DlXWmDZ-.d.ts +35 -0
  301. package/package.json +160 -4
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/ui/filter-provider.tsx"],"names":["React","jsx"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AA2BA,IAAM,aAAA,GAAsBA,+BAAyC,IAAI,CAAA;AAqBlE,SAAS,cAAA,CAA2C;AAAA,EACzD,YAAA;AAAA,EACA,KAAA,EAAO,eAAA;AAAA,EACP,aAAA;AAAA,EACA;AACF,CAAA,EAA2B;AACzB,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAUA,0BAAY,YAAY,CAAA;AACxE,EAAA,MAAM,eAAe,eAAA,KAAoB,MAAA;AACzC,EAAA,MAAM,KAAA,GAAQ,eAAe,eAAA,GAAkB,aAAA;AAI/C,EAAA,MAAM,UAAA,GAAmBA,wBAAO,YAAY,CAAA;AAE5C,EAAA,MAAM,GAAA,GAAYA,gBAAA,CAAA,WAAA;AAAA,IAChB,CAAC,IAAA,KAAY;AACX,MAAA,IAAI,CAAC,YAAA,EAAc,gBAAA,CAAiB,IAAI,CAAA;AACxC,MAAA,aAAA,GAAgB,IAAI,CAAA;AAAA,IACtB,CAAA;AAAA,IACA,CAAC,cAAc,aAAa;AAAA,GAC9B;AAEA,EAAA,MAAM,KAAA,GAAcA,gBAAA,CAAA,WAAA;AAAA,IAClB,CAAC,OAAA,KAAwB;AACvB,MAAA,MAAM,IAAA,GAAO,EAAE,GAAG,KAAA,EAAO,GAAG,OAAA,EAAQ;AACpC,MAAA,IAAI,CAAC,YAAA,EAAc,gBAAA,CAAiB,IAAI,CAAA;AACxC,MAAA,aAAA,GAAgB,IAAI,CAAA;AAAA,IACtB,CAAA;AAAA,IACA,CAAC,YAAA,EAAc,aAAA,EAAe,KAAK;AAAA,GACrC;AAEA,EAAA,MAAM,KAAA,GAAcA,6BAAY,MAAM;AACpC,IAAA,MAAM,OAAO,UAAA,CAAW,OAAA;AACxB,IAAA,IAAI,CAAC,YAAA,EAAc,gBAAA,CAAiB,IAAI,CAAA;AACxC,IAAA,aAAA,GAAgB,IAAI,CAAA;AAAA,EACtB,CAAA,EAAG,CAAC,YAAA,EAAc,aAAa,CAAC,CAAA;AAEhC,EAAA,MAAM,KAAA,GAAcA,gBAAA,CAAA,OAAA,CAA+B,OAAO,EAAE,OAAO,GAAA,EAAK,KAAA,EAAO,KAAA,EAAM,CAAA,EAAI,CAAC,KAAA,EAAO,GAAA,EAAK,KAAA,EAAO,KAAK,CAAC,CAAA;AAEnH,EAAA,uBAAOC,cAAA,CAAC,aAAA,CAAc,QAAA,EAAd,EAAuB,OAAqC,QAAA,EAAS,CAAA;AAC/E;AAeO,SAAS,cAAA,GAAuF;AACrG,EAAA,MAAM,GAAA,GAAYD,4BAAW,aAAa,CAAA;AAC1C,EAAA,IAAI,CAAC,GAAA,EAAK;AACR,IAAA,MAAM,IAAI,MAAM,uDAAuD,CAAA;AAAA,EACzE;AACA,EAAA,OAAO,GAAA;AACT;AAGO,SAAS,sBAAA,GAAsG;AACpH,EAAA,MAAM,GAAA,GAAYA,4BAAW,aAAa,CAAA;AAC1C,EAAA,OAAQ,GAAA,IAAiC,IAAA;AAC3C","file":"chunk-5K6E4ZSW.cjs","sourcesContent":["'use client'\n\nimport * as React from 'react'\n\n/* -------------------------------------------------------------------------- */\n/* Types */\n/* -------------------------------------------------------------------------- */\n\n/**\n * Generic, type-erased filter state. Consumers cast at the `useFilterState`\n * call-site for a typed view. We deliberately do not parameterize the\n * Context itself — a single provider serves the whole tree, and the type\n * lives at the read-site (call as `useFilterState<MyFilters>()`).\n */\nexport type FilterStateShape = Record<string, unknown>\n\nexport interface FilterContextValue<T extends FilterStateShape = FilterStateShape> {\n /** Current filter state. */\n state: T\n /** Replace the entire filter state (full reset to a new shape). */\n set: (next: T) => void\n /** Shallow-merge a partial update. Use this for most edits. */\n patch: (partial: Partial<T>) => void\n /** Reset state to the initial value passed to the Provider. */\n reset: () => void\n}\n\nconst FilterContext = React.createContext<FilterContextValue | null>(null)\n\n/* -------------------------------------------------------------------------- */\n/* Provider */\n/* -------------------------------------------------------------------------- */\n\nexport interface FilterProviderProps<T extends FilterStateShape> {\n /** Initial filter state on first mount. */\n initialState: T\n /**\n * Controlled state. When supplied, `state` becomes a pure projection of\n * this prop and updates flow back through `onStateChange`. Use this when\n * the consumer manages state externally (e.g. via Redux / Zustand /\n * useState in a parent).\n */\n state?: T\n /** Called on every state change in both controlled and uncontrolled modes. */\n onStateChange?: (next: T) => void\n children: React.ReactNode\n}\n\nexport function FilterProvider<T extends FilterStateShape>({\n initialState,\n state: controlledState,\n onStateChange,\n children,\n}: FilterProviderProps<T>) {\n const [internalState, setInternalState] = React.useState<T>(initialState)\n const isControlled = controlledState !== undefined\n const state = isControlled ? controlledState : internalState\n\n // Stable initial-state ref so reset() always returns to the prop's first value\n // even if the prop reference changes between renders.\n const initialRef = React.useRef(initialState)\n\n const set = React.useCallback(\n (next: T) => {\n if (!isControlled) setInternalState(next)\n onStateChange?.(next)\n },\n [isControlled, onStateChange]\n )\n\n const patch = React.useCallback(\n (partial: Partial<T>) => {\n const next = { ...state, ...partial } as T\n if (!isControlled) setInternalState(next)\n onStateChange?.(next)\n },\n [isControlled, onStateChange, state]\n )\n\n const reset = React.useCallback(() => {\n const next = initialRef.current\n if (!isControlled) setInternalState(next)\n onStateChange?.(next)\n }, [isControlled, onStateChange])\n\n const value = React.useMemo<FilterContextValue<T>>(() => ({ state, set, patch, reset }), [state, set, patch, reset])\n\n return <FilterContext.Provider value={value as FilterContextValue}>{children}</FilterContext.Provider>\n}\n\n/* -------------------------------------------------------------------------- */\n/* Hook */\n/* -------------------------------------------------------------------------- */\n\n/**\n * Read + update the filter state from any descendant of `<FilterProvider>`.\n * Cast `T` at the call site to get a typed view of the state shape.\n *\n * @example\n * interface MyFilters { q: string; severity: 'low' | 'high' | null }\n * const { state, patch } = useFilterState<MyFilters>()\n * patch({ q: 'tehran' })\n */\nexport function useFilterState<T extends FilterStateShape = FilterStateShape>(): FilterContextValue<T> {\n const ctx = React.useContext(FilterContext)\n if (!ctx) {\n throw new Error('useFilterState must be used within a <FilterProvider>')\n }\n return ctx as FilterContextValue<T>\n}\n\n/** Internal — used by `useFilterParams` / `useFilterPresets` to opt-in to the context, returning null when absent. */\nexport function useFilterStateOptional<T extends FilterStateShape = FilterStateShape>(): FilterContextValue<T> | null {\n const ctx = React.useContext(FilterContext)\n return (ctx as FilterContextValue<T>) ?? null\n}\n"]}
@@ -0,0 +1,89 @@
1
+ import { cn } from './chunk-4SVQNEVH.js';
2
+ import * as React from 'react';
3
+ import * as DialogPrimitive from '@radix-ui/react-dialog';
4
+ import { X } from 'lucide-react';
5
+ import { jsx, jsxs } from 'react/jsx-runtime';
6
+
7
+ var Dialog = DialogPrimitive.Root;
8
+ var DialogTrigger = DialogPrimitive.Trigger;
9
+ var DialogPortal = DialogPrimitive.Portal;
10
+ var DialogClose = React.forwardRef(({ ...props }, ref) => /* @__PURE__ */ jsx(DialogPrimitive.Close, { ref, "data-slot": "dialog-close", ...props }));
11
+ DialogClose.displayName = DialogPrimitive.Close.displayName;
12
+ var DialogOverlay = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
13
+ DialogPrimitive.Overlay,
14
+ {
15
+ ref,
16
+ "data-slot": "dialog-overlay",
17
+ className: cn(
18
+ "fixed inset-0 z-50 bg-black/50 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
19
+ className
20
+ ),
21
+ ...props
22
+ }
23
+ ));
24
+ DialogOverlay.displayName = DialogPrimitive.Overlay.displayName;
25
+ var DialogContent = React.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ jsxs(DialogPortal, { children: [
26
+ /* @__PURE__ */ jsx(DialogOverlay, {}),
27
+ /* @__PURE__ */ jsxs(
28
+ DialogPrimitive.Content,
29
+ {
30
+ ref,
31
+ "data-slot": "dialog-content",
32
+ className: cn(
33
+ "fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border border-default bg-dialog text-foreground p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg",
34
+ className
35
+ ),
36
+ ...props,
37
+ children: [
38
+ children,
39
+ /* @__PURE__ */ jsxs(DialogPrimitive.Close, { className: "absolute end-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-brand-default focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-selection data-[state=open]:text-foreground-muted", children: [
40
+ /* @__PURE__ */ jsx(X, { className: "h-4 w-4" }),
41
+ /* @__PURE__ */ jsx("span", { className: "sr-only", children: "Close" })
42
+ ] })
43
+ ]
44
+ }
45
+ )
46
+ ] }));
47
+ DialogContent.displayName = DialogPrimitive.Content.displayName;
48
+ var DialogHeader = ({ className, ...props }) => /* @__PURE__ */ jsx(
49
+ "div",
50
+ {
51
+ "data-slot": "dialog-header",
52
+ className: cn("flex flex-col space-y-1.5 text-center sm:text-start", className),
53
+ ...props
54
+ }
55
+ );
56
+ DialogHeader.displayName = "DialogHeader";
57
+ var DialogFooter = ({ className, ...props }) => /* @__PURE__ */ jsx(
58
+ "div",
59
+ {
60
+ "data-slot": "dialog-footer",
61
+ className: cn("flex flex-col-reverse sm:flex-row sm:justify-end sm:gap-2", className),
62
+ ...props
63
+ }
64
+ );
65
+ DialogFooter.displayName = "DialogFooter";
66
+ var DialogTitle = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
67
+ DialogPrimitive.Title,
68
+ {
69
+ ref,
70
+ "data-slot": "dialog-title",
71
+ className: cn("text-lg font-semibold leading-none tracking-tight text-foreground", className),
72
+ ...props
73
+ }
74
+ ));
75
+ DialogTitle.displayName = DialogPrimitive.Title.displayName;
76
+ var DialogDescription = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
77
+ DialogPrimitive.Description,
78
+ {
79
+ ref,
80
+ "data-slot": "dialog-description",
81
+ className: cn("text-sm text-foreground-light", className),
82
+ ...props
83
+ }
84
+ ));
85
+ DialogDescription.displayName = DialogPrimitive.Description.displayName;
86
+
87
+ export { Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger };
88
+ //# sourceMappingURL=chunk-5NY26ULO.js.map
89
+ //# sourceMappingURL=chunk-5NY26ULO.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/ui/dialog.tsx"],"names":[],"mappings":"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","file":"chunk-5NY26ULO.js","sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport * as DialogPrimitive from '@radix-ui/react-dialog'\nimport { X } from 'lucide-react'\n\nimport { cn } from '@/lib/utils'\n\nconst Dialog = DialogPrimitive.Root\n\nconst DialogTrigger = DialogPrimitive.Trigger\n\nconst DialogPortal = DialogPrimitive.Portal\n\nconst DialogClose = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Close>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Close>\n>(({ ...props }, ref) => <DialogPrimitive.Close ref={ref} data-slot=\"dialog-close\" {...props} />)\nDialogClose.displayName = DialogPrimitive.Close.displayName\n\nconst DialogOverlay = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Overlay\n ref={ref}\n data-slot=\"dialog-overlay\"\n className={cn(\n 'fixed inset-0 z-50 bg-black/50 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0',\n className\n )}\n {...props}\n />\n))\nDialogOverlay.displayName = DialogPrimitive.Overlay.displayName\n\nconst DialogContent = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content>\n>(({ className, children, ...props }, ref) => (\n <DialogPortal>\n <DialogOverlay />\n <DialogPrimitive.Content\n ref={ref}\n data-slot=\"dialog-content\"\n className={cn(\n 'fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border border-default bg-dialog text-foreground p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg',\n className\n )}\n {...props}\n >\n {children}\n <DialogPrimitive.Close className=\"absolute end-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-brand-default focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-selection data-[state=open]:text-foreground-muted\">\n <X className=\"h-4 w-4\" />\n <span className=\"sr-only\">Close</span>\n </DialogPrimitive.Close>\n </DialogPrimitive.Content>\n </DialogPortal>\n))\nDialogContent.displayName = DialogPrimitive.Content.displayName\n\nconst DialogHeader = ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n data-slot=\"dialog-header\"\n className={cn('flex flex-col space-y-1.5 text-center sm:text-start', className)}\n {...props}\n />\n)\nDialogHeader.displayName = 'DialogHeader'\n\nconst DialogFooter = ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n data-slot=\"dialog-footer\"\n className={cn('flex flex-col-reverse sm:flex-row sm:justify-end sm:gap-2', className)}\n {...props}\n />\n)\nDialogFooter.displayName = 'DialogFooter'\n\nconst DialogTitle = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Title\n ref={ref}\n data-slot=\"dialog-title\"\n className={cn('text-lg font-semibold leading-none tracking-tight text-foreground', className)}\n {...props}\n />\n))\nDialogTitle.displayName = DialogPrimitive.Title.displayName\n\nconst DialogDescription = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Description\n ref={ref}\n data-slot=\"dialog-description\"\n className={cn('text-sm text-foreground-light', className)}\n {...props}\n />\n))\nDialogDescription.displayName = DialogPrimitive.Description.displayName\n\nexport {\n Dialog,\n DialogPortal,\n DialogOverlay,\n DialogTrigger,\n DialogClose,\n DialogContent,\n DialogHeader,\n DialogFooter,\n DialogTitle,\n DialogDescription,\n}\n"]}
@@ -0,0 +1,231 @@
1
+ 'use strict';
2
+
3
+ var chunkGKRAZGDI_cjs = require('./chunk-GKRAZGDI.cjs');
4
+ var chunkNV4JOKWL_cjs = require('./chunk-NV4JOKWL.cjs');
5
+ var React = require('react');
6
+ var lucideReact = require('lucide-react');
7
+ var SwitchPrimitive = require('@radix-ui/react-switch');
8
+ var classVarianceAuthority = require('class-variance-authority');
9
+ var jsxRuntime = require('react/jsx-runtime');
10
+
11
+ function _interopNamespace(e) {
12
+ if (e && e.__esModule) return e;
13
+ var n = Object.create(null);
14
+ if (e) {
15
+ Object.keys(e).forEach(function (k) {
16
+ if (k !== 'default') {
17
+ var d = Object.getOwnPropertyDescriptor(e, k);
18
+ Object.defineProperty(n, k, d.get ? d : {
19
+ enumerable: true,
20
+ get: function () { return e[k]; }
21
+ });
22
+ }
23
+ });
24
+ }
25
+ n.default = e;
26
+ return Object.freeze(n);
27
+ }
28
+
29
+ var React__namespace = /*#__PURE__*/_interopNamespace(React);
30
+ var SwitchPrimitive__namespace = /*#__PURE__*/_interopNamespace(SwitchPrimitive);
31
+
32
+ var switchRootVariants = classVarianceAuthority.cva(
33
+ "peer inline-flex shrink-0 cursor-pointer items-center rounded-full border transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-brand data-[state=checked]:hover:bg-brand-600/90 data-[state=unchecked]:bg-control data-[state=unchecked]:hover:bg-border",
34
+ {
35
+ variants: {
36
+ size: {
37
+ sm: "h-[16px] w-[28px]",
38
+ md: "h-[20px] w-[34px]",
39
+ lg: "h-[24px] w-[44px]",
40
+ /** @deprecated Use sm */
41
+ small: "h-[16px] w-[28px]",
42
+ /** @deprecated Use md */
43
+ medium: "h-[20px] w-[34px]",
44
+ /** @deprecated Use lg */
45
+ large: "h-[24px] w-[44px]"
46
+ }
47
+ },
48
+ defaultVariants: {
49
+ size: "sm"
50
+ }
51
+ }
52
+ );
53
+ var switchThumbVariants = classVarianceAuthority.cva(
54
+ "pointer-events-none block rounded-full bg-foreground-lighter data-[state=checked]:bg-white shadow-lg ring-0 transition-transform",
55
+ {
56
+ variants: {
57
+ size: {
58
+ sm: "size-3",
59
+ md: "size-4",
60
+ lg: "size-[18px]",
61
+ /** @deprecated Use sm */
62
+ small: "size-3",
63
+ /** @deprecated Use md */
64
+ medium: "size-4",
65
+ /** @deprecated Use lg */
66
+ large: "size-[18px]"
67
+ }
68
+ },
69
+ defaultVariants: {
70
+ size: "sm"
71
+ }
72
+ }
73
+ );
74
+ var Switch = React__namespace.forwardRef(
75
+ ({ className, size, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
76
+ SwitchPrimitive__namespace.Root,
77
+ {
78
+ "data-slot": "switch",
79
+ className: chunkNV4JOKWL_cjs.cn(switchRootVariants({ size }), className),
80
+ ...props,
81
+ ref,
82
+ children: /* @__PURE__ */ jsxRuntime.jsx(SwitchPrimitive__namespace.Thumb, { "data-slot": "switch-thumb", className: chunkNV4JOKWL_cjs.cn(switchThumbVariants({ size })) })
83
+ }
84
+ )
85
+ );
86
+ Switch.displayName = SwitchPrimitive__namespace.Root.displayName;
87
+ var CHANNEL_META = {
88
+ email: {
89
+ icon: lucideReact.Mail,
90
+ label: { fa: "\u0627\u06CC\u0645\u06CC\u0644", ar: "\u0628\u0631\u064A\u062F", en: "Email" }
91
+ },
92
+ sms: {
93
+ icon: lucideReact.MessageSquare,
94
+ label: { fa: "\u067E\u06CC\u0627\u0645\u06A9", ar: "\u0631\u0633\u0627\u0644\u0629", en: "SMS" }
95
+ },
96
+ telegram: {
97
+ icon: lucideReact.Send,
98
+ label: { fa: "\u062A\u0644\u06AF\u0631\u0627\u0645", ar: "\u062A\u064A\u0644\u064A\u062C\u0631\u0627\u0645", en: "Telegram" }
99
+ },
100
+ "in-app": {
101
+ icon: lucideReact.Bell,
102
+ label: { fa: "\u062F\u0631\u0648\u0646\u200C\u0628\u0631\u0646\u0627\u0645\u0647\u200C\u0627\u06CC", ar: "\u062F\u0627\u062E\u0644 \u0627\u0644\u062A\u0637\u0628\u064A\u0642", en: "In-app" }
103
+ },
104
+ webhook: {
105
+ icon: lucideReact.Send,
106
+ label: { fa: "\u0648\u0628\u200C\u0647\u0648\u06A9", ar: "\u0648\u064A\u0628 \u0647\u0648\u0643", en: "Webhook" }
107
+ }
108
+ };
109
+ var STRINGS = {
110
+ fa: {
111
+ trigger: "\u0634\u0631\u0637 \u0641\u0639\u0627\u0644\u200C\u0633\u0627\u0632\u06CC",
112
+ threshold: "\u0622\u0633\u062A\u0627\u0646\u0647",
113
+ channels: "\u06A9\u0627\u0646\u0627\u0644\u200C\u0647\u0627",
114
+ lastFired: "\u0622\u062E\u0631\u06CC\u0646 \u0641\u0639\u0627\u0644\u200C\u0633\u0627\u0632\u06CC",
115
+ fireCount: "\u062A\u0639\u062F\u0627\u062F \u0641\u0639\u0627\u0644\u200C\u0633\u0627\u0632\u06CC",
116
+ active: "\u0641\u0639\u0627\u0644"
117
+ },
118
+ ar: {
119
+ trigger: "\u0634\u0631\u0637 \u0627\u0644\u062A\u0634\u063A\u064A\u0644",
120
+ threshold: "\u0627\u0644\u0639\u062A\u0628\u0629",
121
+ channels: "\u0627\u0644\u0642\u0646\u0648\u0627\u062A",
122
+ lastFired: "\u0622\u062E\u0631 \u062A\u0634\u063A\u064A\u0644",
123
+ fireCount: "\u0639\u062F\u062F \u0627\u0644\u0645\u0631\u0627\u062A",
124
+ active: "\u0646\u0634\u0637"
125
+ },
126
+ en: {
127
+ trigger: "Trigger",
128
+ threshold: "Threshold",
129
+ channels: "Channels",
130
+ lastFired: "Last fired",
131
+ fireCount: "Fire count",
132
+ active: "Active"
133
+ }
134
+ };
135
+ var AlertRuleCard = React__namespace.forwardRef(
136
+ ({
137
+ className,
138
+ name,
139
+ trigger,
140
+ threshold,
141
+ severity,
142
+ channels,
143
+ active,
144
+ onActiveChange,
145
+ lastFired,
146
+ fireCount,
147
+ locale = "fa",
148
+ ...props
149
+ }, ref) => {
150
+ const t = STRINGS[locale] ?? STRINGS.fa;
151
+ return /* @__PURE__ */ jsxRuntime.jsxs(
152
+ "div",
153
+ {
154
+ ref,
155
+ "data-slot": "alert-rule-card",
156
+ "data-active": active || void 0,
157
+ "data-severity": severity,
158
+ className: chunkNV4JOKWL_cjs.cn(
159
+ "flex flex-col gap-3 rounded-lg border border-border bg-background p-4",
160
+ !active && "opacity-70",
161
+ className
162
+ ),
163
+ ...props,
164
+ children: [
165
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-start gap-3", children: [
166
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex-1 min-w-0", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
167
+ active ? /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Bell, { className: "size-4 text-brand-default", "aria-hidden": "true" }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.BellOff, { className: "size-4 text-foreground-lighter", "aria-hidden": "true" }),
168
+ /* @__PURE__ */ jsxRuntime.jsx("h3", { className: "text-sm font-semibold text-foreground truncate", children: name })
169
+ ] }) }),
170
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2 shrink-0", children: [
171
+ severity && /* @__PURE__ */ jsxRuntime.jsx(chunkGKRAZGDI_cjs.SeverityBadge, { severity, size: "sm", locale }),
172
+ /* @__PURE__ */ jsxRuntime.jsx(Switch, { checked: active, onCheckedChange: onActiveChange, "aria-label": t.active })
173
+ ] })
174
+ ] }),
175
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-1.5", children: [
176
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-2xs text-foreground-lighter", children: t.trigger }),
177
+ /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-foreground leading-relaxed", children: trigger })
178
+ ] }),
179
+ threshold && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2 text-xs", children: [
180
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-foreground-lighter", children: [
181
+ t.threshold,
182
+ ":"
183
+ ] }),
184
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-mono tabular-nums text-foreground", "data-slot": "alert-rule-card-threshold", children: threshold })
185
+ ] }),
186
+ channels && channels.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2 flex-wrap pt-2 border-t border-border", children: [
187
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "text-2xs text-foreground-lighter", children: [
188
+ t.channels,
189
+ ":"
190
+ ] }),
191
+ channels.map((ch) => {
192
+ const meta = CHANNEL_META[ch];
193
+ const Icon = meta.icon;
194
+ return /* @__PURE__ */ jsxRuntime.jsxs(
195
+ "span",
196
+ {
197
+ className: "inline-flex items-center gap-1 rounded-full bg-surface-200 px-2 py-0.5 text-2xs text-foreground",
198
+ "data-slot": "alert-rule-card-channel",
199
+ "data-channel": ch,
200
+ children: [
201
+ /* @__PURE__ */ jsxRuntime.jsx(Icon, { className: "size-3", "aria-hidden": "true" }),
202
+ meta.label[locale] ?? meta.label.fa
203
+ ]
204
+ },
205
+ ch
206
+ );
207
+ })
208
+ ] }),
209
+ (lastFired || typeof fireCount === "number") && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between gap-2 text-2xs text-foreground-lighter pt-1", children: [
210
+ lastFired && /* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
211
+ t.lastFired,
212
+ ": ",
213
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-foreground", children: lastFired })
214
+ ] }),
215
+ typeof fireCount === "number" && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "tabular-nums", children: [
216
+ t.fireCount,
217
+ ": ",
218
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-foreground font-medium", children: fireCount })
219
+ ] })
220
+ ] })
221
+ ]
222
+ }
223
+ );
224
+ }
225
+ );
226
+ AlertRuleCard.displayName = "AlertRuleCard";
227
+
228
+ exports.AlertRuleCard = AlertRuleCard;
229
+ exports.Switch = Switch;
230
+ //# sourceMappingURL=chunk-7RVPG3LE.cjs.map
231
+ //# sourceMappingURL=chunk-7RVPG3LE.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/ui/switch.tsx","../src/components/ui/alert-rule-card.tsx"],"names":["cva","React","jsx","SwitchPrimitive","cn","Mail","MessageSquare","Send","Bell","React2","jsxs","BellOff","SeverityBadge"],"mappings":"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","file":"chunk-7RVPG3LE.cjs","sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport * as SwitchPrimitive from '@radix-ui/react-switch'\nimport { VariantProps, cva } from 'class-variance-authority'\n\nimport { cn } from '@/lib/utils'\n\nconst switchRootVariants = cva(\n 'peer inline-flex shrink-0 cursor-pointer items-center rounded-full border transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-brand data-[state=checked]:hover:bg-brand-600/90 data-[state=unchecked]:bg-control data-[state=unchecked]:hover:bg-border',\n {\n variants: {\n size: {\n sm: 'h-[16px] w-[28px]',\n md: 'h-[20px] w-[34px]',\n lg: 'h-[24px] w-[44px]',\n /** @deprecated Use sm */ small: 'h-[16px] w-[28px]',\n /** @deprecated Use md */ medium: 'h-[20px] w-[34px]',\n /** @deprecated Use lg */ large: 'h-[24px] w-[44px]',\n },\n },\n defaultVariants: {\n size: 'sm',\n },\n }\n)\n\n// data-[state=checked]:bg-white intentional: --foreground-contrast is near-black in .dark theme,\n// which would produce a near-black thumb on the colored track — bad. White thumb on brand-colored track is the design intent.\nconst switchThumbVariants = cva(\n 'pointer-events-none block rounded-full bg-foreground-lighter data-[state=checked]:bg-white shadow-lg ring-0 transition-transform',\n {\n variants: {\n size: {\n sm: 'size-3',\n md: 'size-4',\n lg: 'size-[18px]',\n /** @deprecated Use sm */ small: 'size-3',\n /** @deprecated Use md */ medium: 'size-4',\n /** @deprecated Use lg */ large: 'size-[18px]',\n },\n },\n defaultVariants: {\n size: 'sm',\n },\n }\n)\n\nexport interface SwitchProps\n extends React.ComponentPropsWithoutRef<typeof SwitchPrimitive.Root>, VariantProps<typeof switchRootVariants> {}\n\nconst Switch = React.forwardRef<React.ElementRef<typeof SwitchPrimitive.Root>, SwitchProps>(\n ({ className, size, ...props }, ref) => (\n <SwitchPrimitive.Root\n data-slot=\"switch\"\n className={cn(switchRootVariants({ size }), className)}\n {...props}\n ref={ref}\n >\n <SwitchPrimitive.Thumb data-slot=\"switch-thumb\" className={cn(switchThumbVariants({ size }))} />\n </SwitchPrimitive.Root>\n )\n)\nSwitch.displayName = SwitchPrimitive.Root.displayName\n\nexport { Switch }\n","'use client'\n\nimport * as React from 'react'\nimport { Bell, BellOff, Mail, MessageSquare, Send } from 'lucide-react'\nimport { cn, type SupportedLocale } from '@/lib/utils'\nimport { Switch } from './switch'\nimport { SeverityBadge } from './severity-badge'\nimport type { SeverityKey } from '@/lib/i18n'\n\n/**\n * AlertRuleCard — saved alert-rule definition. Shows trigger summary,\n * threshold, severity tag, target channels, and an active/inactive toggle.\n *\n * Designed for \"Alert Rules\" management pages — a list of these cards lets\n * an analyst quickly scan + tweak which alerts are running.\n */\n\nexport type AlertChannel = 'email' | 'sms' | 'telegram' | 'in-app' | 'webhook'\n\nconst CHANNEL_META: Record<\n AlertChannel,\n {\n icon: React.ComponentType<React.SVGAttributes<SVGElement>>\n label: Record<SupportedLocale, string>\n }\n> = {\n email: {\n icon: Mail,\n label: { fa: 'ایمیل', ar: 'بريد', en: 'Email' },\n },\n sms: {\n icon: MessageSquare,\n label: { fa: 'پیامک', ar: 'رسالة', en: 'SMS' },\n },\n telegram: {\n icon: Send,\n label: { fa: 'تلگرام', ar: 'تيليجرام', en: 'Telegram' },\n },\n 'in-app': {\n icon: Bell,\n label: { fa: 'درون‌برنامه‌ای', ar: 'داخل التطبيق', en: 'In-app' },\n },\n webhook: {\n icon: Send,\n label: { fa: 'وب‌هوک', ar: 'ويب هوك', en: 'Webhook' },\n },\n}\n\nexport interface AlertRuleCardProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Rule name (e.g., \"افزایش ناگهانی منفی\") */\n name: React.ReactNode\n /** Trigger description in plain language (e.g., \"هرگاه نرخ منفی > ۲۰٪ شد\") */\n trigger: React.ReactNode\n /** Threshold value display (e.g., \"≥ ۲۰٪\", \"> ۱۰۰۰ mentions\") */\n threshold?: React.ReactNode\n /** Severity that this alert raises */\n severity?: SeverityKey\n /** Channels this rule fires through */\n channels?: AlertChannel[]\n /** Active state (master switch) */\n active: boolean\n /** Called when the user toggles the switch */\n onActiveChange: (next: boolean) => void\n /** Last-fired timestamp display (e.g., \"۲ ساعت پیش\") */\n lastFired?: React.ReactNode\n /** Optional total fire count */\n fireCount?: number\n /** Locale @default 'fa' */\n locale?: SupportedLocale\n}\n\nconst STRINGS: Record<\n SupportedLocale,\n { trigger: string; threshold: string; channels: string; lastFired: string; fireCount: string; active: string }\n> = {\n fa: {\n trigger: 'شرط فعال‌سازی',\n threshold: 'آستانه',\n channels: 'کانال‌ها',\n lastFired: 'آخرین فعال‌سازی',\n fireCount: 'تعداد فعال‌سازی',\n active: 'فعال',\n },\n ar: {\n trigger: 'شرط التشغيل',\n threshold: 'العتبة',\n channels: 'القنوات',\n lastFired: 'آخر تشغيل',\n fireCount: 'عدد المرات',\n active: 'نشط',\n },\n en: {\n trigger: 'Trigger',\n threshold: 'Threshold',\n channels: 'Channels',\n lastFired: 'Last fired',\n fireCount: 'Fire count',\n active: 'Active',\n },\n}\n\nconst AlertRuleCard = React.forwardRef<HTMLDivElement, AlertRuleCardProps>(\n (\n {\n className,\n name,\n trigger,\n threshold,\n severity,\n channels,\n active,\n onActiveChange,\n lastFired,\n fireCount,\n locale = 'fa',\n ...props\n },\n ref\n ) => {\n const t = STRINGS[locale] ?? STRINGS.fa\n return (\n <div\n ref={ref}\n data-slot=\"alert-rule-card\"\n data-active={active || undefined}\n data-severity={severity}\n className={cn(\n 'flex flex-col gap-3 rounded-lg border border-border bg-background p-4',\n !active && 'opacity-70',\n className\n )}\n {...props}\n >\n {/* Header */}\n <div className=\"flex items-start gap-3\">\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2\">\n {active ? (\n <Bell className=\"size-4 text-brand-default\" aria-hidden=\"true\" />\n ) : (\n <BellOff className=\"size-4 text-foreground-lighter\" aria-hidden=\"true\" />\n )}\n <h3 className=\"text-sm font-semibold text-foreground truncate\">{name}</h3>\n </div>\n </div>\n <div className=\"flex items-center gap-2 shrink-0\">\n {severity && <SeverityBadge severity={severity} size=\"sm\" locale={locale} />}\n <Switch checked={active} onCheckedChange={onActiveChange} aria-label={t.active} />\n </div>\n </div>\n\n {/* Trigger description */}\n <div className=\"space-y-1.5\">\n <div className=\"text-2xs text-foreground-lighter\">{t.trigger}</div>\n <p className=\"text-sm text-foreground leading-relaxed\">{trigger}</p>\n </div>\n\n {/* Threshold display */}\n {threshold && (\n <div className=\"flex items-center gap-2 text-xs\">\n <span className=\"text-foreground-lighter\">{t.threshold}:</span>\n <span className=\"font-mono tabular-nums text-foreground\" data-slot=\"alert-rule-card-threshold\">\n {threshold}\n </span>\n </div>\n )}\n\n {/* Channels */}\n {channels && channels.length > 0 && (\n <div className=\"flex items-center gap-2 flex-wrap pt-2 border-t border-border\">\n <span className=\"text-2xs text-foreground-lighter\">{t.channels}:</span>\n {channels.map((ch) => {\n const meta = CHANNEL_META[ch]\n const Icon = meta.icon\n return (\n <span\n key={ch}\n className=\"inline-flex items-center gap-1 rounded-full bg-surface-200 px-2 py-0.5 text-2xs text-foreground\"\n data-slot=\"alert-rule-card-channel\"\n data-channel={ch}\n >\n <Icon className=\"size-3\" aria-hidden=\"true\" />\n {meta.label[locale] ?? meta.label.fa}\n </span>\n )\n })}\n </div>\n )}\n\n {/* Footer — last fired + fire count */}\n {(lastFired || typeof fireCount === 'number') && (\n <div className=\"flex items-center justify-between gap-2 text-2xs text-foreground-lighter pt-1\">\n {lastFired && (\n <span>\n {t.lastFired}: <span className=\"text-foreground\">{lastFired}</span>\n </span>\n )}\n {typeof fireCount === 'number' && (\n <span className=\"tabular-nums\">\n {t.fireCount}: <span className=\"text-foreground font-medium\">{fireCount}</span>\n </span>\n )}\n </div>\n )}\n </div>\n )\n }\n)\nAlertRuleCard.displayName = 'AlertRuleCard'\n\nexport { AlertRuleCard }\n"]}
@@ -0,0 +1,207 @@
1
+ import { SeverityBadge } from './chunk-KCWRCSI7.js';
2
+ import { cn } from './chunk-4SVQNEVH.js';
3
+ import * as React from 'react';
4
+ import { Bell, BellOff, Send, MessageSquare, Mail } from 'lucide-react';
5
+ import * as SwitchPrimitive from '@radix-ui/react-switch';
6
+ import { cva } from 'class-variance-authority';
7
+ import { jsx, jsxs } from 'react/jsx-runtime';
8
+
9
+ var switchRootVariants = cva(
10
+ "peer inline-flex shrink-0 cursor-pointer items-center rounded-full border transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-brand data-[state=checked]:hover:bg-brand-600/90 data-[state=unchecked]:bg-control data-[state=unchecked]:hover:bg-border",
11
+ {
12
+ variants: {
13
+ size: {
14
+ sm: "h-[16px] w-[28px]",
15
+ md: "h-[20px] w-[34px]",
16
+ lg: "h-[24px] w-[44px]",
17
+ /** @deprecated Use sm */
18
+ small: "h-[16px] w-[28px]",
19
+ /** @deprecated Use md */
20
+ medium: "h-[20px] w-[34px]",
21
+ /** @deprecated Use lg */
22
+ large: "h-[24px] w-[44px]"
23
+ }
24
+ },
25
+ defaultVariants: {
26
+ size: "sm"
27
+ }
28
+ }
29
+ );
30
+ var switchThumbVariants = cva(
31
+ "pointer-events-none block rounded-full bg-foreground-lighter data-[state=checked]:bg-white shadow-lg ring-0 transition-transform",
32
+ {
33
+ variants: {
34
+ size: {
35
+ sm: "size-3",
36
+ md: "size-4",
37
+ lg: "size-[18px]",
38
+ /** @deprecated Use sm */
39
+ small: "size-3",
40
+ /** @deprecated Use md */
41
+ medium: "size-4",
42
+ /** @deprecated Use lg */
43
+ large: "size-[18px]"
44
+ }
45
+ },
46
+ defaultVariants: {
47
+ size: "sm"
48
+ }
49
+ }
50
+ );
51
+ var Switch = React.forwardRef(
52
+ ({ className, size, ...props }, ref) => /* @__PURE__ */ jsx(
53
+ SwitchPrimitive.Root,
54
+ {
55
+ "data-slot": "switch",
56
+ className: cn(switchRootVariants({ size }), className),
57
+ ...props,
58
+ ref,
59
+ children: /* @__PURE__ */ jsx(SwitchPrimitive.Thumb, { "data-slot": "switch-thumb", className: cn(switchThumbVariants({ size })) })
60
+ }
61
+ )
62
+ );
63
+ Switch.displayName = SwitchPrimitive.Root.displayName;
64
+ var CHANNEL_META = {
65
+ email: {
66
+ icon: Mail,
67
+ label: { fa: "\u0627\u06CC\u0645\u06CC\u0644", ar: "\u0628\u0631\u064A\u062F", en: "Email" }
68
+ },
69
+ sms: {
70
+ icon: MessageSquare,
71
+ label: { fa: "\u067E\u06CC\u0627\u0645\u06A9", ar: "\u0631\u0633\u0627\u0644\u0629", en: "SMS" }
72
+ },
73
+ telegram: {
74
+ icon: Send,
75
+ label: { fa: "\u062A\u0644\u06AF\u0631\u0627\u0645", ar: "\u062A\u064A\u0644\u064A\u062C\u0631\u0627\u0645", en: "Telegram" }
76
+ },
77
+ "in-app": {
78
+ icon: Bell,
79
+ label: { fa: "\u062F\u0631\u0648\u0646\u200C\u0628\u0631\u0646\u0627\u0645\u0647\u200C\u0627\u06CC", ar: "\u062F\u0627\u062E\u0644 \u0627\u0644\u062A\u0637\u0628\u064A\u0642", en: "In-app" }
80
+ },
81
+ webhook: {
82
+ icon: Send,
83
+ label: { fa: "\u0648\u0628\u200C\u0647\u0648\u06A9", ar: "\u0648\u064A\u0628 \u0647\u0648\u0643", en: "Webhook" }
84
+ }
85
+ };
86
+ var STRINGS = {
87
+ fa: {
88
+ trigger: "\u0634\u0631\u0637 \u0641\u0639\u0627\u0644\u200C\u0633\u0627\u0632\u06CC",
89
+ threshold: "\u0622\u0633\u062A\u0627\u0646\u0647",
90
+ channels: "\u06A9\u0627\u0646\u0627\u0644\u200C\u0647\u0627",
91
+ lastFired: "\u0622\u062E\u0631\u06CC\u0646 \u0641\u0639\u0627\u0644\u200C\u0633\u0627\u0632\u06CC",
92
+ fireCount: "\u062A\u0639\u062F\u0627\u062F \u0641\u0639\u0627\u0644\u200C\u0633\u0627\u0632\u06CC",
93
+ active: "\u0641\u0639\u0627\u0644"
94
+ },
95
+ ar: {
96
+ trigger: "\u0634\u0631\u0637 \u0627\u0644\u062A\u0634\u063A\u064A\u0644",
97
+ threshold: "\u0627\u0644\u0639\u062A\u0628\u0629",
98
+ channels: "\u0627\u0644\u0642\u0646\u0648\u0627\u062A",
99
+ lastFired: "\u0622\u062E\u0631 \u062A\u0634\u063A\u064A\u0644",
100
+ fireCount: "\u0639\u062F\u062F \u0627\u0644\u0645\u0631\u0627\u062A",
101
+ active: "\u0646\u0634\u0637"
102
+ },
103
+ en: {
104
+ trigger: "Trigger",
105
+ threshold: "Threshold",
106
+ channels: "Channels",
107
+ lastFired: "Last fired",
108
+ fireCount: "Fire count",
109
+ active: "Active"
110
+ }
111
+ };
112
+ var AlertRuleCard = React.forwardRef(
113
+ ({
114
+ className,
115
+ name,
116
+ trigger,
117
+ threshold,
118
+ severity,
119
+ channels,
120
+ active,
121
+ onActiveChange,
122
+ lastFired,
123
+ fireCount,
124
+ locale = "fa",
125
+ ...props
126
+ }, ref) => {
127
+ const t = STRINGS[locale] ?? STRINGS.fa;
128
+ return /* @__PURE__ */ jsxs(
129
+ "div",
130
+ {
131
+ ref,
132
+ "data-slot": "alert-rule-card",
133
+ "data-active": active || void 0,
134
+ "data-severity": severity,
135
+ className: cn(
136
+ "flex flex-col gap-3 rounded-lg border border-border bg-background p-4",
137
+ !active && "opacity-70",
138
+ className
139
+ ),
140
+ ...props,
141
+ children: [
142
+ /* @__PURE__ */ jsxs("div", { className: "flex items-start gap-3", children: [
143
+ /* @__PURE__ */ jsx("div", { className: "flex-1 min-w-0", children: /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
144
+ active ? /* @__PURE__ */ jsx(Bell, { className: "size-4 text-brand-default", "aria-hidden": "true" }) : /* @__PURE__ */ jsx(BellOff, { className: "size-4 text-foreground-lighter", "aria-hidden": "true" }),
145
+ /* @__PURE__ */ jsx("h3", { className: "text-sm font-semibold text-foreground truncate", children: name })
146
+ ] }) }),
147
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 shrink-0", children: [
148
+ severity && /* @__PURE__ */ jsx(SeverityBadge, { severity, size: "sm", locale }),
149
+ /* @__PURE__ */ jsx(Switch, { checked: active, onCheckedChange: onActiveChange, "aria-label": t.active })
150
+ ] })
151
+ ] }),
152
+ /* @__PURE__ */ jsxs("div", { className: "space-y-1.5", children: [
153
+ /* @__PURE__ */ jsx("div", { className: "text-2xs text-foreground-lighter", children: t.trigger }),
154
+ /* @__PURE__ */ jsx("p", { className: "text-sm text-foreground leading-relaxed", children: trigger })
155
+ ] }),
156
+ threshold && /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 text-xs", children: [
157
+ /* @__PURE__ */ jsxs("span", { className: "text-foreground-lighter", children: [
158
+ t.threshold,
159
+ ":"
160
+ ] }),
161
+ /* @__PURE__ */ jsx("span", { className: "font-mono tabular-nums text-foreground", "data-slot": "alert-rule-card-threshold", children: threshold })
162
+ ] }),
163
+ channels && channels.length > 0 && /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 flex-wrap pt-2 border-t border-border", children: [
164
+ /* @__PURE__ */ jsxs("span", { className: "text-2xs text-foreground-lighter", children: [
165
+ t.channels,
166
+ ":"
167
+ ] }),
168
+ channels.map((ch) => {
169
+ const meta = CHANNEL_META[ch];
170
+ const Icon = meta.icon;
171
+ return /* @__PURE__ */ jsxs(
172
+ "span",
173
+ {
174
+ className: "inline-flex items-center gap-1 rounded-full bg-surface-200 px-2 py-0.5 text-2xs text-foreground",
175
+ "data-slot": "alert-rule-card-channel",
176
+ "data-channel": ch,
177
+ children: [
178
+ /* @__PURE__ */ jsx(Icon, { className: "size-3", "aria-hidden": "true" }),
179
+ meta.label[locale] ?? meta.label.fa
180
+ ]
181
+ },
182
+ ch
183
+ );
184
+ })
185
+ ] }),
186
+ (lastFired || typeof fireCount === "number") && /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between gap-2 text-2xs text-foreground-lighter pt-1", children: [
187
+ lastFired && /* @__PURE__ */ jsxs("span", { children: [
188
+ t.lastFired,
189
+ ": ",
190
+ /* @__PURE__ */ jsx("span", { className: "text-foreground", children: lastFired })
191
+ ] }),
192
+ typeof fireCount === "number" && /* @__PURE__ */ jsxs("span", { className: "tabular-nums", children: [
193
+ t.fireCount,
194
+ ": ",
195
+ /* @__PURE__ */ jsx("span", { className: "text-foreground font-medium", children: fireCount })
196
+ ] })
197
+ ] })
198
+ ]
199
+ }
200
+ );
201
+ }
202
+ );
203
+ AlertRuleCard.displayName = "AlertRuleCard";
204
+
205
+ export { AlertRuleCard, Switch };
206
+ //# sourceMappingURL=chunk-AYEK3WOM.js.map
207
+ //# sourceMappingURL=chunk-AYEK3WOM.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/ui/switch.tsx","../src/components/ui/alert-rule-card.tsx"],"names":["React2","jsx"],"mappings":"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","file":"chunk-AYEK3WOM.js","sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport * as SwitchPrimitive from '@radix-ui/react-switch'\nimport { VariantProps, cva } from 'class-variance-authority'\n\nimport { cn } from '@/lib/utils'\n\nconst switchRootVariants = cva(\n 'peer inline-flex shrink-0 cursor-pointer items-center rounded-full border transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-brand data-[state=checked]:hover:bg-brand-600/90 data-[state=unchecked]:bg-control data-[state=unchecked]:hover:bg-border',\n {\n variants: {\n size: {\n sm: 'h-[16px] w-[28px]',\n md: 'h-[20px] w-[34px]',\n lg: 'h-[24px] w-[44px]',\n /** @deprecated Use sm */ small: 'h-[16px] w-[28px]',\n /** @deprecated Use md */ medium: 'h-[20px] w-[34px]',\n /** @deprecated Use lg */ large: 'h-[24px] w-[44px]',\n },\n },\n defaultVariants: {\n size: 'sm',\n },\n }\n)\n\n// data-[state=checked]:bg-white intentional: --foreground-contrast is near-black in .dark theme,\n// which would produce a near-black thumb on the colored track — bad. White thumb on brand-colored track is the design intent.\nconst switchThumbVariants = cva(\n 'pointer-events-none block rounded-full bg-foreground-lighter data-[state=checked]:bg-white shadow-lg ring-0 transition-transform',\n {\n variants: {\n size: {\n sm: 'size-3',\n md: 'size-4',\n lg: 'size-[18px]',\n /** @deprecated Use sm */ small: 'size-3',\n /** @deprecated Use md */ medium: 'size-4',\n /** @deprecated Use lg */ large: 'size-[18px]',\n },\n },\n defaultVariants: {\n size: 'sm',\n },\n }\n)\n\nexport interface SwitchProps\n extends React.ComponentPropsWithoutRef<typeof SwitchPrimitive.Root>, VariantProps<typeof switchRootVariants> {}\n\nconst Switch = React.forwardRef<React.ElementRef<typeof SwitchPrimitive.Root>, SwitchProps>(\n ({ className, size, ...props }, ref) => (\n <SwitchPrimitive.Root\n data-slot=\"switch\"\n className={cn(switchRootVariants({ size }), className)}\n {...props}\n ref={ref}\n >\n <SwitchPrimitive.Thumb data-slot=\"switch-thumb\" className={cn(switchThumbVariants({ size }))} />\n </SwitchPrimitive.Root>\n )\n)\nSwitch.displayName = SwitchPrimitive.Root.displayName\n\nexport { Switch }\n","'use client'\n\nimport * as React from 'react'\nimport { Bell, BellOff, Mail, MessageSquare, Send } from 'lucide-react'\nimport { cn, type SupportedLocale } from '@/lib/utils'\nimport { Switch } from './switch'\nimport { SeverityBadge } from './severity-badge'\nimport type { SeverityKey } from '@/lib/i18n'\n\n/**\n * AlertRuleCard — saved alert-rule definition. Shows trigger summary,\n * threshold, severity tag, target channels, and an active/inactive toggle.\n *\n * Designed for \"Alert Rules\" management pages — a list of these cards lets\n * an analyst quickly scan + tweak which alerts are running.\n */\n\nexport type AlertChannel = 'email' | 'sms' | 'telegram' | 'in-app' | 'webhook'\n\nconst CHANNEL_META: Record<\n AlertChannel,\n {\n icon: React.ComponentType<React.SVGAttributes<SVGElement>>\n label: Record<SupportedLocale, string>\n }\n> = {\n email: {\n icon: Mail,\n label: { fa: 'ایمیل', ar: 'بريد', en: 'Email' },\n },\n sms: {\n icon: MessageSquare,\n label: { fa: 'پیامک', ar: 'رسالة', en: 'SMS' },\n },\n telegram: {\n icon: Send,\n label: { fa: 'تلگرام', ar: 'تيليجرام', en: 'Telegram' },\n },\n 'in-app': {\n icon: Bell,\n label: { fa: 'درون‌برنامه‌ای', ar: 'داخل التطبيق', en: 'In-app' },\n },\n webhook: {\n icon: Send,\n label: { fa: 'وب‌هوک', ar: 'ويب هوك', en: 'Webhook' },\n },\n}\n\nexport interface AlertRuleCardProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Rule name (e.g., \"افزایش ناگهانی منفی\") */\n name: React.ReactNode\n /** Trigger description in plain language (e.g., \"هرگاه نرخ منفی > ۲۰٪ شد\") */\n trigger: React.ReactNode\n /** Threshold value display (e.g., \"≥ ۲۰٪\", \"> ۱۰۰۰ mentions\") */\n threshold?: React.ReactNode\n /** Severity that this alert raises */\n severity?: SeverityKey\n /** Channels this rule fires through */\n channels?: AlertChannel[]\n /** Active state (master switch) */\n active: boolean\n /** Called when the user toggles the switch */\n onActiveChange: (next: boolean) => void\n /** Last-fired timestamp display (e.g., \"۲ ساعت پیش\") */\n lastFired?: React.ReactNode\n /** Optional total fire count */\n fireCount?: number\n /** Locale @default 'fa' */\n locale?: SupportedLocale\n}\n\nconst STRINGS: Record<\n SupportedLocale,\n { trigger: string; threshold: string; channels: string; lastFired: string; fireCount: string; active: string }\n> = {\n fa: {\n trigger: 'شرط فعال‌سازی',\n threshold: 'آستانه',\n channels: 'کانال‌ها',\n lastFired: 'آخرین فعال‌سازی',\n fireCount: 'تعداد فعال‌سازی',\n active: 'فعال',\n },\n ar: {\n trigger: 'شرط التشغيل',\n threshold: 'العتبة',\n channels: 'القنوات',\n lastFired: 'آخر تشغيل',\n fireCount: 'عدد المرات',\n active: 'نشط',\n },\n en: {\n trigger: 'Trigger',\n threshold: 'Threshold',\n channels: 'Channels',\n lastFired: 'Last fired',\n fireCount: 'Fire count',\n active: 'Active',\n },\n}\n\nconst AlertRuleCard = React.forwardRef<HTMLDivElement, AlertRuleCardProps>(\n (\n {\n className,\n name,\n trigger,\n threshold,\n severity,\n channels,\n active,\n onActiveChange,\n lastFired,\n fireCount,\n locale = 'fa',\n ...props\n },\n ref\n ) => {\n const t = STRINGS[locale] ?? STRINGS.fa\n return (\n <div\n ref={ref}\n data-slot=\"alert-rule-card\"\n data-active={active || undefined}\n data-severity={severity}\n className={cn(\n 'flex flex-col gap-3 rounded-lg border border-border bg-background p-4',\n !active && 'opacity-70',\n className\n )}\n {...props}\n >\n {/* Header */}\n <div className=\"flex items-start gap-3\">\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2\">\n {active ? (\n <Bell className=\"size-4 text-brand-default\" aria-hidden=\"true\" />\n ) : (\n <BellOff className=\"size-4 text-foreground-lighter\" aria-hidden=\"true\" />\n )}\n <h3 className=\"text-sm font-semibold text-foreground truncate\">{name}</h3>\n </div>\n </div>\n <div className=\"flex items-center gap-2 shrink-0\">\n {severity && <SeverityBadge severity={severity} size=\"sm\" locale={locale} />}\n <Switch checked={active} onCheckedChange={onActiveChange} aria-label={t.active} />\n </div>\n </div>\n\n {/* Trigger description */}\n <div className=\"space-y-1.5\">\n <div className=\"text-2xs text-foreground-lighter\">{t.trigger}</div>\n <p className=\"text-sm text-foreground leading-relaxed\">{trigger}</p>\n </div>\n\n {/* Threshold display */}\n {threshold && (\n <div className=\"flex items-center gap-2 text-xs\">\n <span className=\"text-foreground-lighter\">{t.threshold}:</span>\n <span className=\"font-mono tabular-nums text-foreground\" data-slot=\"alert-rule-card-threshold\">\n {threshold}\n </span>\n </div>\n )}\n\n {/* Channels */}\n {channels && channels.length > 0 && (\n <div className=\"flex items-center gap-2 flex-wrap pt-2 border-t border-border\">\n <span className=\"text-2xs text-foreground-lighter\">{t.channels}:</span>\n {channels.map((ch) => {\n const meta = CHANNEL_META[ch]\n const Icon = meta.icon\n return (\n <span\n key={ch}\n className=\"inline-flex items-center gap-1 rounded-full bg-surface-200 px-2 py-0.5 text-2xs text-foreground\"\n data-slot=\"alert-rule-card-channel\"\n data-channel={ch}\n >\n <Icon className=\"size-3\" aria-hidden=\"true\" />\n {meta.label[locale] ?? meta.label.fa}\n </span>\n )\n })}\n </div>\n )}\n\n {/* Footer — last fired + fire count */}\n {(lastFired || typeof fireCount === 'number') && (\n <div className=\"flex items-center justify-between gap-2 text-2xs text-foreground-lighter pt-1\">\n {lastFired && (\n <span>\n {t.lastFired}: <span className=\"text-foreground\">{lastFired}</span>\n </span>\n )}\n {typeof fireCount === 'number' && (\n <span className=\"tabular-nums\">\n {t.fireCount}: <span className=\"text-foreground font-medium\">{fireCount}</span>\n </span>\n )}\n </div>\n )}\n </div>\n )\n }\n)\nAlertRuleCard.displayName = 'AlertRuleCard'\n\nexport { AlertRuleCard }\n"]}