@parto-system-design/ui 1.1.5 → 1.1.7

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-2UD3LGVX.cjs +316 -0
  5. package/dist/chunk-2UD3LGVX.cjs.map +1 -0
  6. package/dist/chunk-34JUCX2G.cjs +43 -0
  7. package/dist/chunk-34JUCX2G.cjs.map +1 -0
  8. package/dist/chunk-3AIJKXBV.cjs +242 -0
  9. package/dist/chunk-3AIJKXBV.cjs.map +1 -0
  10. package/dist/chunk-4SVQNEVH.js +173 -0
  11. package/dist/chunk-4SVQNEVH.js.map +1 -0
  12. package/dist/chunk-53QY4PD3.js +908 -0
  13. package/dist/chunk-53QY4PD3.js.map +1 -0
  14. package/dist/chunk-5JJSRGJD.js +31 -0
  15. package/dist/chunk-5JJSRGJD.js.map +1 -0
  16. package/dist/chunk-5K6E4ZSW.cjs +77 -0
  17. package/dist/chunk-5K6E4ZSW.cjs.map +1 -0
  18. package/dist/chunk-5NY26ULO.js +89 -0
  19. package/dist/chunk-5NY26ULO.js.map +1 -0
  20. package/dist/chunk-7RVPG3LE.cjs +231 -0
  21. package/dist/chunk-7RVPG3LE.cjs.map +1 -0
  22. package/dist/chunk-7Y4V3R3Y.cjs +120 -0
  23. package/dist/chunk-7Y4V3R3Y.cjs.map +1 -0
  24. package/dist/chunk-AXAY64KL.js +39 -0
  25. package/dist/chunk-AXAY64KL.js.map +1 -0
  26. package/dist/chunk-AYEK3WOM.js +207 -0
  27. package/dist/chunk-AYEK3WOM.js.map +1 -0
  28. package/dist/chunk-BRMBLIQG.js +53 -0
  29. package/dist/chunk-BRMBLIQG.js.map +1 -0
  30. package/dist/chunk-CAJKSTXX.cjs +54 -0
  31. package/dist/chunk-CAJKSTXX.cjs.map +1 -0
  32. package/dist/chunk-CKFWMHQU.js +401 -0
  33. package/dist/chunk-CKFWMHQU.js.map +1 -0
  34. package/dist/chunk-CV3N3HVK.js +672 -0
  35. package/dist/chunk-CV3N3HVK.js.map +1 -0
  36. package/dist/chunk-D2EBLE2B.cjs +220 -0
  37. package/dist/chunk-D2EBLE2B.cjs.map +1 -0
  38. package/dist/chunk-D5XCQDFS.js +92 -0
  39. package/dist/chunk-D5XCQDFS.js.map +1 -0
  40. package/dist/chunk-GDHRYKVM.js +45 -0
  41. package/dist/chunk-GDHRYKVM.js.map +1 -0
  42. package/dist/chunk-GKRAZGDI.cjs +84 -0
  43. package/dist/chunk-GKRAZGDI.cjs.map +1 -0
  44. package/dist/chunk-HEYMLQOV.cjs +94 -0
  45. package/dist/chunk-HEYMLQOV.cjs.map +1 -0
  46. package/dist/chunk-HF6XU5NI.js +84 -0
  47. package/dist/chunk-HF6XU5NI.js.map +1 -0
  48. package/dist/chunk-HJPDZOMJ.cjs +87 -0
  49. package/dist/chunk-HJPDZOMJ.cjs.map +1 -0
  50. package/dist/chunk-HUCC3QH5.cjs +53 -0
  51. package/dist/chunk-HUCC3QH5.cjs.map +1 -0
  52. package/dist/chunk-HYZ6BQPS.cjs +425 -0
  53. package/dist/chunk-HYZ6BQPS.cjs.map +1 -0
  54. package/dist/chunk-IQHKJ4SS.js +213 -0
  55. package/dist/chunk-IQHKJ4SS.js.map +1 -0
  56. package/dist/chunk-ISCSZMYW.cjs +106 -0
  57. package/dist/chunk-ISCSZMYW.cjs.map +1 -0
  58. package/dist/chunk-IXFEFIDO.js +82 -0
  59. package/dist/chunk-IXFEFIDO.js.map +1 -0
  60. package/dist/chunk-JUBHQAA2.js +53 -0
  61. package/dist/chunk-JUBHQAA2.js.map +1 -0
  62. package/dist/chunk-KCWRCSI7.js +62 -0
  63. package/dist/chunk-KCWRCSI7.js.map +1 -0
  64. package/dist/chunk-L2L5CKC2.js +291 -0
  65. package/dist/chunk-L2L5CKC2.js.map +1 -0
  66. package/dist/chunk-LLJR7FV3.js +135 -0
  67. package/dist/chunk-LLJR7FV3.js.map +1 -0
  68. package/dist/chunk-LZMCMZZF.js +118 -0
  69. package/dist/chunk-LZMCMZZF.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-MBCTRNTG.js +89 -0
  73. package/dist/chunk-MBCTRNTG.js.map +1 -0
  74. package/dist/chunk-MEK4RSGC.js +65 -0
  75. package/dist/chunk-MEK4RSGC.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-MKYVQQBV.cjs +114 -0
  79. package/dist/chunk-MKYVQQBV.cjs.map +1 -0
  80. package/dist/chunk-MQGQVI3W.cjs +950 -0
  81. package/dist/chunk-MQGQVI3W.cjs.map +1 -0
  82. package/dist/chunk-NEFZJHE4.cjs +157 -0
  83. package/dist/chunk-NEFZJHE4.cjs.map +1 -0
  84. package/dist/chunk-NEML6RCV.js +405 -0
  85. package/dist/chunk-NEML6RCV.js.map +1 -0
  86. package/dist/chunk-NV4JOKWL.cjs +197 -0
  87. package/dist/chunk-NV4JOKWL.cjs.map +1 -0
  88. package/dist/chunk-O2JG7WY5.cjs +121 -0
  89. package/dist/chunk-O2JG7WY5.cjs.map +1 -0
  90. package/dist/chunk-OEVMKFFL.cjs +140 -0
  91. package/dist/chunk-OEVMKFFL.cjs.map +1 -0
  92. package/dist/chunk-ONO2FTV4.cjs +68 -0
  93. package/dist/chunk-ONO2FTV4.cjs.map +1 -0
  94. package/dist/chunk-OS6CMYAS.cjs +79 -0
  95. package/dist/chunk-OS6CMYAS.cjs.map +1 -0
  96. package/dist/chunk-P5XHPNJG.cjs +430 -0
  97. package/dist/chunk-P5XHPNJG.cjs.map +1 -0
  98. package/dist/chunk-QJ7UB2ZQ.js +98 -0
  99. package/dist/chunk-QJ7UB2ZQ.js.map +1 -0
  100. package/dist/chunk-RA5KZNG5.js +269 -0
  101. package/dist/chunk-RA5KZNG5.js.map +1 -0
  102. package/dist/chunk-RJ3HYZ7S.js +44 -0
  103. package/dist/chunk-RJ3HYZ7S.js.map +1 -0
  104. package/dist/chunk-RZNRIOLT.js +128 -0
  105. package/dist/chunk-RZNRIOLT.js.map +1 -0
  106. package/dist/chunk-S5IPJQZ3.cjs +161 -0
  107. package/dist/chunk-S5IPJQZ3.cjs.map +1 -0
  108. package/dist/chunk-SB5DSYR5.js +211 -0
  109. package/dist/chunk-SB5DSYR5.js.map +1 -0
  110. package/dist/chunk-SCGW2BH4.cjs +69 -0
  111. package/dist/chunk-SCGW2BH4.cjs.map +1 -0
  112. package/dist/chunk-SCX6AR53.cjs +108 -0
  113. package/dist/chunk-SCX6AR53.cjs.map +1 -0
  114. package/dist/chunk-SFXV2DUH.js +106 -0
  115. package/dist/chunk-SFXV2DUH.js.map +1 -0
  116. package/dist/chunk-SXEPGD4Z.cjs +152 -0
  117. package/dist/chunk-SXEPGD4Z.cjs.map +1 -0
  118. package/dist/chunk-SZMVOHT7.cjs +107 -0
  119. package/dist/chunk-SZMVOHT7.cjs.map +1 -0
  120. package/dist/chunk-U5FLLCGC.cjs +151 -0
  121. package/dist/chunk-U5FLLCGC.cjs.map +1 -0
  122. package/dist/chunk-VO3B75F6.cjs +111 -0
  123. package/dist/chunk-VO3B75F6.cjs.map +1 -0
  124. package/dist/chunk-YAJWTNOX.js +106 -0
  125. package/dist/chunk-YAJWTNOX.js.map +1 -0
  126. package/dist/chunk-YC5KLN6I.js +139 -0
  127. package/dist/chunk-YC5KLN6I.js.map +1 -0
  128. package/dist/chunk-YE477L2H.cjs +272 -0
  129. package/dist/chunk-YE477L2H.cjs.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-ZZFNJR2E.js +71 -0
  135. package/dist/chunk-ZZFNJR2E.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 +51 -0
  139. package/dist/components/charts/PartoAreaChart.d.ts +51 -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 +55 -0
  145. package/dist/components/charts/PartoBarChart.d.ts +55 -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 +49 -0
  151. package/dist/components/charts/PartoLineChart.d.ts +49 -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 +44 -0
  157. package/dist/components/charts/PartoPieChart.d.ts +44 -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 +7383 -10955
  291. package/dist/index.cjs.map +1 -1
  292. package/dist/index.css +157 -0
  293. package/dist/index.d.cts +726 -1144
  294. package/dist/index.d.ts +726 -1144
  295. package/dist/index.js +6735 -10912
  296. package/dist/index.js.map +1 -1
  297. package/dist/page-card-CO92oXkc.d.ts +100 -0
  298. package/dist/page-card-DOl50DqJ.d.cts +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,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"]}
@@ -0,0 +1,53 @@
1
+ import * as React from 'react';
2
+ import { jsx } from 'react/jsx-runtime';
3
+
4
+ // src/components/ui/filter-provider.tsx
5
+ var FilterContext = React.createContext(null);
6
+ function FilterProvider({
7
+ initialState,
8
+ state: controlledState,
9
+ onStateChange,
10
+ children
11
+ }) {
12
+ const [internalState, setInternalState] = React.useState(initialState);
13
+ const isControlled = controlledState !== void 0;
14
+ const state = isControlled ? controlledState : internalState;
15
+ const initialRef = React.useRef(initialState);
16
+ const set = React.useCallback(
17
+ (next) => {
18
+ if (!isControlled) setInternalState(next);
19
+ onStateChange?.(next);
20
+ },
21
+ [isControlled, onStateChange]
22
+ );
23
+ const patch = React.useCallback(
24
+ (partial) => {
25
+ const next = { ...state, ...partial };
26
+ if (!isControlled) setInternalState(next);
27
+ onStateChange?.(next);
28
+ },
29
+ [isControlled, onStateChange, state]
30
+ );
31
+ const reset = React.useCallback(() => {
32
+ const next = initialRef.current;
33
+ if (!isControlled) setInternalState(next);
34
+ onStateChange?.(next);
35
+ }, [isControlled, onStateChange]);
36
+ const value = React.useMemo(() => ({ state, set, patch, reset }), [state, set, patch, reset]);
37
+ return /* @__PURE__ */ jsx(FilterContext.Provider, { value, children });
38
+ }
39
+ function useFilterState() {
40
+ const ctx = React.useContext(FilterContext);
41
+ if (!ctx) {
42
+ throw new Error("useFilterState must be used within a <FilterProvider>");
43
+ }
44
+ return ctx;
45
+ }
46
+ function useFilterStateOptional() {
47
+ const ctx = React.useContext(FilterContext);
48
+ return ctx ?? null;
49
+ }
50
+
51
+ export { FilterProvider, useFilterState, useFilterStateOptional };
52
+ //# sourceMappingURL=chunk-BRMBLIQG.js.map
53
+ //# sourceMappingURL=chunk-BRMBLIQG.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/ui/filter-provider.tsx"],"names":[],"mappings":";;;;AA2BA,IAAM,aAAA,GAAsB,oBAAyC,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,GAAU,eAAY,YAAY,CAAA;AACxE,EAAA,MAAM,eAAe,eAAA,KAAoB,MAAA;AACzC,EAAA,MAAM,KAAA,GAAQ,eAAe,eAAA,GAAkB,aAAA;AAI/C,EAAA,MAAM,UAAA,GAAmB,aAAO,YAAY,CAAA;AAE5C,EAAA,MAAM,GAAA,GAAY,KAAA,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,GAAc,KAAA,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,GAAc,kBAAY,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,GAAc,KAAA,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,uBAAO,GAAA,CAAC,aAAA,CAAc,QAAA,EAAd,EAAuB,OAAqC,QAAA,EAAS,CAAA;AAC/E;AAeO,SAAS,cAAA,GAAuF;AACrG,EAAA,MAAM,GAAA,GAAY,iBAAW,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,GAAY,iBAAW,aAAa,CAAA;AAC1C,EAAA,OAAQ,GAAA,IAAiC,IAAA;AAC3C","file":"chunk-BRMBLIQG.js","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,54 @@
1
+ 'use strict';
2
+
3
+ var chunkNV4JOKWL_cjs = require('./chunk-NV4JOKWL.cjs');
4
+ var React = require('react');
5
+ var CheckboxPrimitive = require('@radix-ui/react-checkbox');
6
+ var lucideReact = require('lucide-react');
7
+ var jsxRuntime = require('react/jsx-runtime');
8
+
9
+ function _interopNamespace(e) {
10
+ if (e && e.__esModule) return e;
11
+ var n = Object.create(null);
12
+ if (e) {
13
+ Object.keys(e).forEach(function (k) {
14
+ if (k !== 'default') {
15
+ var d = Object.getOwnPropertyDescriptor(e, k);
16
+ Object.defineProperty(n, k, d.get ? d : {
17
+ enumerable: true,
18
+ get: function () { return e[k]; }
19
+ });
20
+ }
21
+ });
22
+ }
23
+ n.default = e;
24
+ return Object.freeze(n);
25
+ }
26
+
27
+ var React__namespace = /*#__PURE__*/_interopNamespace(React);
28
+ var CheckboxPrimitive__namespace = /*#__PURE__*/_interopNamespace(CheckboxPrimitive);
29
+
30
+ var Checkbox = React__namespace.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsxRuntime.jsx(
31
+ CheckboxPrimitive__namespace.Root,
32
+ {
33
+ ref,
34
+ "data-slot": "checkbox",
35
+ className: chunkNV4JOKWL_cjs.cn(
36
+ "peer border-control bg-control data-[state=checked]:bg-brand data-[state=checked]:text-foreground-contrast data-[state=checked]:border-brand focus-visible:border-brand-default focus-visible:ring-brand-default/50 aria-invalid:ring-destructive/20 aria-invalid:border-destructive size-4 shrink-0 rounded-[4px] border shadow-xs transition-all duration-150 outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50",
37
+ className
38
+ ),
39
+ ...props,
40
+ children: /* @__PURE__ */ jsxRuntime.jsx(
41
+ CheckboxPrimitive__namespace.Indicator,
42
+ {
43
+ "data-slot": "checkbox-indicator",
44
+ className: "grid place-content-center text-current transition-none",
45
+ children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.CheckIcon, { className: "size-3.5" })
46
+ }
47
+ )
48
+ }
49
+ ));
50
+ Checkbox.displayName = "Checkbox";
51
+
52
+ exports.Checkbox = Checkbox;
53
+ //# sourceMappingURL=chunk-CAJKSTXX.cjs.map
54
+ //# sourceMappingURL=chunk-CAJKSTXX.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/ui/checkbox.tsx"],"names":["React","jsx","CheckboxPrimitive","cn","CheckIcon"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAQA,IAAM,QAAA,GAAiBA,4BAGrB,CAAC,EAAE,WAAW,GAAG,KAAA,IAAS,GAAA,qBAC1BC,cAAA;AAAA,EAAmBC,4BAAA,CAAA,IAAA;AAAA,EAAlB;AAAA,IACC,GAAA;AAAA,IACA,WAAA,EAAU,UAAA;AAAA,IACV,SAAA,EAAWC,oBAAA;AAAA,MACT,ubAAA;AAAA,MACA;AAAA,KACF;AAAA,IACC,GAAG,KAAA;AAAA,IAEJ,QAAA,kBAAAF,cAAA;AAAA,MAAmBC,4BAAA,CAAA,SAAA;AAAA,MAAlB;AAAA,QACC,WAAA,EAAU,oBAAA;AAAA,QACV,SAAA,EAAU,wDAAA;AAAA,QAEV,QAAA,kBAAAD,cAAA,CAACG,qBAAA,EAAA,EAAU,SAAA,EAAU,UAAA,EAAW;AAAA;AAAA;AAClC;AACF,CACD;AAED,QAAA,CAAS,WAAA,GAAc,UAAA","file":"chunk-CAJKSTXX.cjs","sourcesContent":["'use client'\n\nimport * as React from 'react'\nimport * as CheckboxPrimitive from '@radix-ui/react-checkbox'\nimport { CheckIcon } from 'lucide-react'\n\nimport { cn } from '@/lib/utils'\n\nconst Checkbox = React.forwardRef<\n React.ElementRef<typeof CheckboxPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof CheckboxPrimitive.Root>\n>(({ className, ...props }, ref) => (\n <CheckboxPrimitive.Root\n ref={ref}\n data-slot=\"checkbox\"\n className={cn(\n 'peer border-control bg-control data-[state=checked]:bg-brand data-[state=checked]:text-foreground-contrast data-[state=checked]:border-brand focus-visible:border-brand-default focus-visible:ring-brand-default/50 aria-invalid:ring-destructive/20 aria-invalid:border-destructive size-4 shrink-0 rounded-[4px] border shadow-xs transition-all duration-150 outline-none focus-visible:ring-[3px] disabled:cursor-not-allowed disabled:opacity-50',\n className\n )}\n {...props}\n >\n <CheckboxPrimitive.Indicator\n data-slot=\"checkbox-indicator\"\n className=\"grid place-content-center text-current transition-none\"\n >\n <CheckIcon className=\"size-3.5\" />\n </CheckboxPrimitive.Indicator>\n </CheckboxPrimitive.Root>\n))\n\nCheckbox.displayName = 'Checkbox'\n\nexport { Checkbox }\n"]}