@parto-system-design/ui 1.1.11 → 1.1.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/brand/parto-logo.cjs +130 -0
- package/dist/components/brand/parto-logo.cjs.map +1 -0
- package/dist/components/brand/parto-logo.d.cts +38 -0
- package/dist/components/brand/parto-logo.d.ts +38 -0
- package/dist/components/brand/parto-logo.js +108 -0
- package/dist/components/brand/parto-logo.js.map +1 -0
- package/dist/components/charts/PartoAreaChart.cjs +579 -7
- package/dist/components/charts/PartoAreaChart.cjs.map +1 -1
- package/dist/components/charts/PartoAreaChart.js +564 -4
- package/dist/components/charts/PartoAreaChart.js.map +1 -1
- package/dist/components/charts/PartoBarChart.cjs +616 -7
- package/dist/components/charts/PartoBarChart.cjs.map +1 -1
- package/dist/components/charts/PartoBarChart.js +601 -4
- package/dist/components/charts/PartoBarChart.js.map +1 -1
- package/dist/components/charts/PartoLineChart.cjs +584 -7
- package/dist/components/charts/PartoLineChart.cjs.map +1 -1
- package/dist/components/charts/PartoLineChart.js +569 -4
- package/dist/components/charts/PartoLineChart.js.map +1 -1
- package/dist/components/charts/PartoPieChart.cjs +566 -7
- package/dist/components/charts/PartoPieChart.cjs.map +1 -1
- package/dist/components/charts/PartoPieChart.js +551 -4
- package/dist/components/charts/PartoPieChart.js.map +1 -1
- package/dist/components/ui/accordion.cjs +97 -0
- package/dist/components/ui/accordion.cjs.map +1 -0
- package/dist/components/ui/accordion.d.cts +22 -0
- package/dist/components/ui/accordion.d.ts +22 -0
- package/dist/components/ui/accordion.js +72 -0
- package/dist/components/ui/accordion.js.map +1 -0
- package/dist/{chunk-MMC6M35Q.cjs → components/ui/alert-dialog.cjs} +216 -22
- package/dist/components/ui/alert-dialog.cjs.map +1 -0
- package/dist/components/ui/alert-dialog.d.cts +17 -0
- package/dist/components/ui/alert-dialog.d.ts +17 -0
- package/dist/{chunk-3QYYPPFJ.js → components/ui/alert-dialog.js} +175 -10
- package/dist/components/ui/alert-dialog.js.map +1 -0
- package/dist/components/ui/alert-rule-card.cjs +289 -8
- package/dist/components/ui/alert-rule-card.cjs.map +1 -1
- package/dist/components/ui/alert-rule-card.d.cts +1 -1
- package/dist/components/ui/alert-rule-card.d.ts +1 -1
- package/dist/components/ui/alert-rule-card.js +271 -4
- package/dist/components/ui/alert-rule-card.js.map +1 -1
- package/dist/components/ui/alert.cjs +81 -0
- package/dist/components/ui/alert.cjs.map +1 -0
- package/dist/components/ui/alert.d.cts +11 -0
- package/dist/components/ui/alert.d.ts +11 -0
- package/dist/components/ui/alert.js +57 -0
- package/dist/components/ui/alert.js.map +1 -0
- package/dist/components/ui/app-bar.cjs +67 -0
- package/dist/components/ui/app-bar.cjs.map +1 -0
- package/dist/components/ui/app-bar.d.cts +22 -0
- package/dist/components/ui/app-bar.d.ts +22 -0
- package/dist/components/ui/app-bar.js +44 -0
- package/dist/components/ui/app-bar.js.map +1 -0
- package/dist/components/ui/avatar.cjs +66 -14
- package/dist/components/ui/avatar.cjs.map +1 -1
- package/dist/components/ui/avatar.js +47 -2
- package/dist/components/ui/avatar.js.map +1 -1
- package/dist/components/ui/badge.cjs +113 -9
- package/dist/components/ui/badge.cjs.map +1 -1
- package/dist/components/ui/badge.js +96 -2
- package/dist/components/ui/badge.js.map +1 -1
- package/dist/components/ui/breadcrumb.cjs +100 -0
- package/dist/components/ui/breadcrumb.cjs.map +1 -0
- package/dist/components/ui/breadcrumb.d.cts +35 -0
- package/dist/components/ui/breadcrumb.d.ts +35 -0
- package/dist/components/ui/breadcrumb.js +92 -0
- package/dist/components/ui/breadcrumb.js.map +1 -0
- package/dist/components/ui/button.cjs +304 -11
- package/dist/components/ui/button.cjs.map +1 -1
- package/dist/components/ui/button.d.cts +1 -1
- package/dist/components/ui/button.d.ts +1 -1
- package/dist/components/ui/button.js +306 -3
- package/dist/components/ui/button.js.map +1 -1
- package/dist/components/ui/calendar.cjs +401 -8
- package/dist/components/ui/calendar.cjs.map +1 -1
- package/dist/components/ui/calendar.js +404 -4
- package/dist/components/ui/calendar.js.map +1 -1
- package/dist/components/ui/card.cjs +154 -30
- package/dist/components/ui/card.cjs.map +1 -1
- package/dist/components/ui/card.js +131 -2
- package/dist/components/ui/card.js.map +1 -1
- package/dist/{chunk-CAJKSTXX.cjs → components/ui/checkbox.cjs} +10 -5
- package/dist/components/ui/checkbox.cjs.map +1 -0
- package/dist/components/ui/checkbox.d.cts +6 -0
- package/dist/components/ui/checkbox.d.ts +6 -0
- package/dist/{chunk-5JJSRGJD.js → components/ui/checkbox.js} +9 -4
- package/dist/components/ui/checkbox.js.map +1 -0
- package/dist/components/ui/concept-card.cjs +728 -11
- package/dist/components/ui/concept-card.cjs.map +1 -1
- package/dist/components/ui/concept-card.d.cts +2 -2
- package/dist/components/ui/concept-card.d.ts +2 -2
- package/dist/components/ui/concept-card.js +710 -7
- package/dist/components/ui/concept-card.js.map +1 -1
- package/dist/components/ui/data-table.cjs +1553 -10
- package/dist/components/ui/data-table.cjs.map +1 -1
- package/dist/components/ui/data-table.js +1537 -7
- package/dist/components/ui/data-table.js.map +1 -1
- package/dist/components/ui/dialog.cjs +119 -42
- package/dist/components/ui/dialog.cjs.map +1 -1
- package/dist/components/ui/dialog.js +92 -2
- package/dist/components/ui/dialog.js.map +1 -1
- package/dist/components/ui/dropdown-menu.cjs +268 -0
- package/dist/components/ui/dropdown-menu.cjs.map +1 -0
- package/dist/components/ui/dropdown-menu.d.cts +73 -0
- package/dist/components/ui/dropdown-menu.d.ts +73 -0
- package/dist/components/ui/dropdown-menu.js +232 -0
- package/dist/components/ui/dropdown-menu.js.map +1 -0
- package/dist/components/ui/filter-provider.cjs +70 -13
- package/dist/components/ui/filter-provider.cjs.map +1 -1
- package/dist/components/ui/filter-provider.js +51 -1
- package/dist/components/ui/filter-provider.js.map +1 -1
- package/dist/components/ui/form.cjs +169 -0
- package/dist/components/ui/form.cjs.map +1 -0
- package/dist/components/ui/form.d.cts +46 -0
- package/dist/components/ui/form.d.ts +46 -0
- package/dist/components/ui/form.js +139 -0
- package/dist/components/ui/form.js.map +1 -0
- package/dist/components/ui/input.cjs +135 -15
- package/dist/components/ui/input.cjs.map +1 -1
- package/dist/components/ui/input.d.cts +15 -0
- package/dist/components/ui/input.d.ts +15 -0
- package/dist/components/ui/input.js +116 -3
- package/dist/components/ui/input.js.map +1 -1
- package/dist/components/ui/iran-province-heat.cjs +328 -5
- package/dist/components/ui/iran-province-heat.cjs.map +1 -1
- package/dist/components/ui/iran-province-heat.js +312 -2
- package/dist/components/ui/iran-province-heat.js.map +1 -1
- package/dist/components/ui/label.cjs +52 -0
- package/dist/components/ui/label.cjs.map +1 -0
- package/dist/components/ui/label.d.cts +10 -0
- package/dist/components/ui/label.d.ts +10 -0
- package/dist/components/ui/label.js +30 -0
- package/dist/components/ui/label.js.map +1 -0
- package/dist/components/ui/page-card.cjs +627 -8
- package/dist/components/ui/page-card.cjs.map +1 -1
- package/dist/components/ui/page-card.d.cts +3 -2
- package/dist/components/ui/page-card.d.ts +3 -2
- package/dist/components/ui/page-card.js +611 -5
- package/dist/components/ui/page-card.js.map +1 -1
- package/dist/components/ui/page-header.cjs +299 -0
- package/dist/components/ui/page-header.cjs.map +1 -0
- package/dist/components/ui/page-header.d.cts +21 -0
- package/dist/components/ui/page-header.d.ts +21 -0
- package/dist/components/ui/page-header.js +277 -0
- package/dist/components/ui/page-header.js.map +1 -0
- package/dist/components/ui/password-input.cjs +168 -0
- package/dist/components/ui/password-input.cjs.map +1 -0
- package/dist/components/ui/password-input.d.cts +48 -0
- package/dist/components/ui/password-input.d.ts +48 -0
- package/dist/components/ui/password-input.js +146 -0
- package/dist/components/ui/password-input.js.map +1 -0
- package/dist/components/ui/popover.cjs +51 -18
- package/dist/components/ui/popover.cjs.map +1 -1
- package/dist/components/ui/popover.js +30 -2
- package/dist/components/ui/popover.js.map +1 -1
- package/dist/components/ui/progress.cjs +95 -0
- package/dist/components/ui/progress.cjs.map +1 -0
- package/dist/components/ui/progress.d.cts +18 -0
- package/dist/components/ui/progress.d.ts +18 -0
- package/dist/components/ui/progress.js +72 -0
- package/dist/components/ui/progress.js.map +1 -0
- package/dist/components/ui/radio-card.cjs +84 -0
- package/dist/components/ui/radio-card.cjs.map +1 -0
- package/dist/components/ui/radio-card.d.cts +12 -0
- package/dist/components/ui/radio-card.d.ts +12 -0
- package/dist/components/ui/radio-card.js +58 -0
- package/dist/components/ui/radio-card.js.map +1 -0
- package/dist/components/ui/radio-group.cjs +62 -0
- package/dist/components/ui/radio-group.cjs.map +1 -0
- package/dist/components/ui/radio-group.d.cts +7 -0
- package/dist/components/ui/radio-group.d.ts +7 -0
- package/dist/components/ui/radio-group.js +38 -0
- package/dist/components/ui/radio-group.js.map +1 -0
- package/dist/components/ui/saved-query-card.cjs +409 -7
- package/dist/components/ui/saved-query-card.cjs.map +1 -1
- package/dist/components/ui/saved-query-card.js +394 -4
- package/dist/components/ui/saved-query-card.js.map +1 -1
- package/dist/components/ui/scroll-area.cjs +79 -0
- package/dist/components/ui/scroll-area.cjs.map +1 -0
- package/dist/components/ui/scroll-area.d.cts +14 -0
- package/dist/components/ui/scroll-area.d.ts +14 -0
- package/dist/components/ui/scroll-area.js +56 -0
- package/dist/components/ui/scroll-area.js.map +1 -0
- package/dist/components/ui/select.cjs +242 -0
- package/dist/components/ui/select.cjs.map +1 -0
- package/dist/components/ui/select.d.cts +29 -0
- package/dist/components/ui/select.d.ts +29 -0
- package/dist/components/ui/select.js +210 -0
- package/dist/components/ui/select.js.map +1 -0
- package/dist/components/ui/separator.cjs +105 -6
- package/dist/components/ui/separator.cjs.map +1 -1
- package/dist/components/ui/separator.js +87 -2
- package/dist/components/ui/separator.js.map +1 -1
- package/dist/components/ui/sheet.cjs +134 -38
- package/dist/components/ui/sheet.cjs.map +1 -1
- package/dist/components/ui/sheet.js +109 -2
- package/dist/components/ui/sheet.js.map +1 -1
- package/dist/{chunk-D2EBLE2B.cjs → components/ui/skeleton.cjs} +21 -16
- package/dist/components/ui/skeleton.cjs.map +1 -0
- package/dist/components/ui/skeleton.d.cts +90 -0
- package/dist/components/ui/skeleton.d.ts +90 -0
- package/dist/{chunk-SB5DSYR5.js → components/ui/skeleton.js} +8 -3
- package/dist/components/ui/skeleton.js.map +1 -0
- package/dist/components/ui/slider.cjs +129 -0
- package/dist/components/ui/slider.cjs.map +1 -0
- package/dist/components/ui/slider.d.cts +10 -0
- package/dist/components/ui/slider.d.ts +10 -0
- package/dist/components/ui/slider.js +107 -0
- package/dist/components/ui/slider.js.map +1 -0
- package/dist/components/ui/social-platform-badge.cjs +120 -0
- package/dist/components/ui/social-platform-badge.cjs.map +1 -0
- package/dist/components/ui/social-platform-badge.d.cts +21 -0
- package/dist/components/ui/social-platform-badge.d.ts +21 -0
- package/dist/components/ui/social-platform-badge.js +97 -0
- package/dist/components/ui/social-platform-badge.js.map +1 -0
- package/dist/components/ui/sonner.cjs +51 -0
- package/dist/components/ui/sonner.cjs.map +1 -0
- package/dist/components/ui/sonner.d.cts +13 -0
- package/dist/components/ui/sonner.d.ts +13 -0
- package/dist/components/ui/sonner.js +45 -0
- package/dist/components/ui/sonner.js.map +1 -0
- package/dist/components/ui/sparkline.cjs +159 -6
- package/dist/components/ui/sparkline.cjs.map +1 -1
- package/dist/components/ui/sparkline.js +142 -2
- package/dist/components/ui/sparkline.js.map +1 -1
- package/dist/components/ui/switch.cjs +96 -0
- package/dist/components/ui/switch.cjs.map +1 -0
- package/dist/components/ui/switch.d.cts +13 -0
- package/dist/components/ui/switch.d.ts +13 -0
- package/dist/components/ui/switch.js +73 -0
- package/dist/components/ui/switch.js.map +1 -0
- package/dist/components/ui/table.cjs +188 -0
- package/dist/components/ui/table.cjs.map +1 -0
- package/dist/components/ui/table.d.cts +59 -0
- package/dist/components/ui/table.d.ts +59 -0
- package/dist/components/ui/table.js +178 -0
- package/dist/components/ui/table.js.map +1 -0
- package/dist/components/ui/tabs.cjs +140 -0
- package/dist/components/ui/tabs.cjs.map +1 -0
- package/dist/components/ui/tabs.d.cts +21 -0
- package/dist/components/ui/tabs.d.ts +21 -0
- package/dist/components/ui/tabs.js +115 -0
- package/dist/components/ui/tabs.js.map +1 -0
- package/dist/components/ui/textarea.cjs +56 -0
- package/dist/components/ui/textarea.cjs.map +1 -0
- package/dist/components/ui/textarea.d.cts +5 -0
- package/dist/components/ui/textarea.d.ts +5 -0
- package/dist/components/ui/textarea.js +34 -0
- package/dist/components/ui/textarea.js.map +1 -0
- package/dist/components/ui/toggle-group.cjs +123 -0
- package/dist/components/ui/toggle-group.cjs.map +1 -0
- package/dist/components/ui/toggle-group.d.cts +7 -0
- package/dist/components/ui/toggle-group.d.ts +7 -0
- package/dist/components/ui/toggle-group.js +99 -0
- package/dist/components/ui/toggle-group.js.map +1 -0
- package/dist/components/ui/tooltip.cjs +77 -18
- package/dist/components/ui/tooltip.cjs.map +1 -1
- package/dist/components/ui/tooltip.js +56 -2
- package/dist/components/ui/tooltip.js.map +1 -1
- package/dist/{concept-card-RwPbqJ06.d.cts → concept-card-BXra9mr0.d.cts} +2 -2
- package/dist/{concept-card-CcOBb2Nz.d.ts → concept-card-BoJ5gIJD.d.ts} +2 -2
- package/dist/hooks/use-hotkey-registry.cjs +201 -14
- package/dist/hooks/use-hotkey-registry.cjs.map +1 -1
- package/dist/hooks/use-hotkey-registry.js +182 -2
- package/dist/hooks/use-hotkey-registry.js.map +1 -1
- package/dist/hooks/use-hotkeys.cjs +144 -9
- package/dist/hooks/use-hotkeys.cjs.map +1 -1
- package/dist/hooks/use-hotkeys.js +126 -1
- package/dist/hooks/use-hotkeys.js.map +1 -1
- package/dist/{i18n-CAd9wGOr.d.cts → i18n-BfRhV5aw.d.cts} +5 -3
- package/dist/{i18n-ArS3mqj0.d.ts → i18n-ewyqbKM-.d.ts} +5 -3
- package/dist/index.cjs +21003 -15720
- package/dist/index.cjs.map +1 -1
- package/dist/index.css +412 -71
- package/dist/index.d.cts +82 -490
- package/dist/index.d.ts +82 -490
- package/dist/index.js +6727 -976
- package/dist/index.js.map +1 -1
- package/dist/{page-card-CmShVqG-.d.cts → page-card-C9XXXOVr.d.cts} +3 -20
- package/dist/{page-card-HBn-cy4J.d.ts → page-card-DAnbez_f.d.ts} +3 -20
- package/dist/toggle-group-B8r4LOQw.d.cts +26 -0
- package/dist/toggle-group-B8r4LOQw.d.ts +26 -0
- package/package.json +132 -2
- package/tailwind.config.ts +45 -0
- package/dist/chunk-2ACKKPWA.cjs +0 -112
- package/dist/chunk-2ACKKPWA.cjs.map +0 -1
- package/dist/chunk-2UD3LGVX.cjs +0 -316
- package/dist/chunk-2UD3LGVX.cjs.map +0 -1
- package/dist/chunk-3QYYPPFJ.js.map +0 -1
- package/dist/chunk-4SVQNEVH.js +0 -173
- package/dist/chunk-4SVQNEVH.js.map +0 -1
- package/dist/chunk-4WONHORR.cjs +0 -152
- package/dist/chunk-4WONHORR.cjs.map +0 -1
- package/dist/chunk-5HCXH6GS.js +0 -409
- package/dist/chunk-5HCXH6GS.js.map +0 -1
- package/dist/chunk-5JJSRGJD.js.map +0 -1
- package/dist/chunk-5K6E4ZSW.cjs +0 -77
- package/dist/chunk-5K6E4ZSW.cjs.map +0 -1
- package/dist/chunk-5NY26ULO.js +0 -89
- package/dist/chunk-5NY26ULO.js.map +0 -1
- package/dist/chunk-7RVPG3LE.cjs +0 -231
- package/dist/chunk-7RVPG3LE.cjs.map +0 -1
- package/dist/chunk-AYEK3WOM.js +0 -207
- package/dist/chunk-AYEK3WOM.js.map +0 -1
- package/dist/chunk-BRMBLIQG.js +0 -53
- package/dist/chunk-BRMBLIQG.js.map +0 -1
- package/dist/chunk-CAJKSTXX.cjs.map +0 -1
- package/dist/chunk-CKFWMHQU.js +0 -401
- package/dist/chunk-CKFWMHQU.js.map +0 -1
- package/dist/chunk-CV3N3HVK.js +0 -672
- package/dist/chunk-CV3N3HVK.js.map +0 -1
- package/dist/chunk-D2EBLE2B.cjs.map +0 -1
- package/dist/chunk-GCZ6YATL.js +0 -940
- package/dist/chunk-GCZ6YATL.js.map +0 -1
- package/dist/chunk-GKRAZGDI.cjs +0 -84
- package/dist/chunk-GKRAZGDI.cjs.map +0 -1
- package/dist/chunk-GPYJ66CG.js +0 -45
- package/dist/chunk-GPYJ66CG.js.map +0 -1
- package/dist/chunk-HF6XU5NI.js +0 -84
- package/dist/chunk-HF6XU5NI.js.map +0 -1
- package/dist/chunk-HJPDZOMJ.cjs +0 -87
- package/dist/chunk-HJPDZOMJ.cjs.map +0 -1
- package/dist/chunk-HS3XI3CC.cjs +0 -69
- package/dist/chunk-HS3XI3CC.cjs.map +0 -1
- package/dist/chunk-HUCC3QH5.cjs +0 -53
- package/dist/chunk-HUCC3QH5.cjs.map +0 -1
- package/dist/chunk-HYZ6BQPS.cjs +0 -425
- package/dist/chunk-HYZ6BQPS.cjs.map +0 -1
- package/dist/chunk-ISCSZMYW.cjs +0 -106
- package/dist/chunk-ISCSZMYW.cjs.map +0 -1
- package/dist/chunk-IXFEFIDO.js +0 -82
- package/dist/chunk-IXFEFIDO.js.map +0 -1
- package/dist/chunk-JCJLN437.js +0 -108
- package/dist/chunk-JCJLN437.js.map +0 -1
- package/dist/chunk-JMKNNH63.cjs +0 -982
- package/dist/chunk-JMKNNH63.cjs.map +0 -1
- package/dist/chunk-JUBHQAA2.js +0 -53
- package/dist/chunk-JUBHQAA2.js.map +0 -1
- package/dist/chunk-K6G63EED.cjs +0 -41
- package/dist/chunk-K6G63EED.cjs.map +0 -1
- package/dist/chunk-KCWRCSI7.js +0 -62
- package/dist/chunk-KCWRCSI7.js.map +0 -1
- package/dist/chunk-KYM7NIJO.cjs +0 -433
- package/dist/chunk-KYM7NIJO.cjs.map +0 -1
- package/dist/chunk-L2L5CKC2.js +0 -291
- package/dist/chunk-L2L5CKC2.js.map +0 -1
- package/dist/chunk-M5CHZ5BA.js +0 -124
- package/dist/chunk-M5CHZ5BA.js.map +0 -1
- package/dist/chunk-MEK4RSGC.js +0 -65
- package/dist/chunk-MEK4RSGC.js.map +0 -1
- package/dist/chunk-MEKWH3GS.js +0 -89
- package/dist/chunk-MEKWH3GS.js.map +0 -1
- package/dist/chunk-MFTX2DDQ.js +0 -27
- package/dist/chunk-MFTX2DDQ.js.map +0 -1
- package/dist/chunk-MMC6M35Q.cjs.map +0 -1
- package/dist/chunk-NMH43BDC.js +0 -130
- package/dist/chunk-NMH43BDC.js.map +0 -1
- package/dist/chunk-NORDUD2T.cjs +0 -135
- package/dist/chunk-NORDUD2T.cjs.map +0 -1
- package/dist/chunk-NV4JOKWL.cjs +0 -197
- package/dist/chunk-NV4JOKWL.cjs.map +0 -1
- package/dist/chunk-O2JG7WY5.cjs +0 -121
- package/dist/chunk-O2JG7WY5.cjs.map +0 -1
- package/dist/chunk-ONO2FTV4.cjs +0 -68
- package/dist/chunk-ONO2FTV4.cjs.map +0 -1
- package/dist/chunk-OQB6HIUL.cjs +0 -108
- package/dist/chunk-OQB6HIUL.cjs.map +0 -1
- package/dist/chunk-OS6CMYAS.cjs +0 -79
- package/dist/chunk-OS6CMYAS.cjs.map +0 -1
- package/dist/chunk-PYURPUTV.js +0 -402
- package/dist/chunk-PYURPUTV.js.map +0 -1
- package/dist/chunk-RJ3HYZ7S.js +0 -44
- package/dist/chunk-RJ3HYZ7S.js.map +0 -1
- package/dist/chunk-RZNRIOLT.js +0 -128
- package/dist/chunk-RZNRIOLT.js.map +0 -1
- package/dist/chunk-S3T2L6NA.js +0 -38
- package/dist/chunk-S3T2L6NA.js.map +0 -1
- package/dist/chunk-S5IPJQZ3.cjs +0 -161
- package/dist/chunk-S5IPJQZ3.cjs.map +0 -1
- package/dist/chunk-SB5DSYR5.js.map +0 -1
- package/dist/chunk-SFXV2DUH.js +0 -106
- package/dist/chunk-SFXV2DUH.js.map +0 -1
- package/dist/chunk-SXEPGD4Z.cjs +0 -152
- package/dist/chunk-SXEPGD4Z.cjs.map +0 -1
- package/dist/chunk-SXWSOU3Y.js +0 -89
- package/dist/chunk-SXWSOU3Y.js.map +0 -1
- package/dist/chunk-SZMVOHT7.cjs +0 -107
- package/dist/chunk-SZMVOHT7.cjs.map +0 -1
- package/dist/chunk-TWJXOV4C.js +0 -145
- package/dist/chunk-TWJXOV4C.js.map +0 -1
- package/dist/chunk-U3ADRIVO.cjs +0 -434
- package/dist/chunk-U3ADRIVO.cjs.map +0 -1
- package/dist/chunk-U5FLLCGC.cjs +0 -151
- package/dist/chunk-U5FLLCGC.cjs.map +0 -1
- package/dist/chunk-UOZN45G4.cjs +0 -130
- package/dist/chunk-UOZN45G4.cjs.map +0 -1
- package/dist/chunk-VHLDOG74.cjs +0 -167
- package/dist/chunk-VHLDOG74.cjs.map +0 -1
- package/dist/chunk-YC5KLN6I.js +0 -139
- package/dist/chunk-YC5KLN6I.js.map +0 -1
- package/dist/chunk-YENXXYUV.cjs +0 -111
- package/dist/chunk-YENXXYUV.cjs.map +0 -1
- package/dist/chunk-YFQWC2PW.js +0 -113
- package/dist/chunk-YFQWC2PW.js.map +0 -1
- package/dist/chunk-Z2TY4A75.cjs +0 -700
- package/dist/chunk-Z2TY4A75.cjs.map +0 -1
- package/dist/chunk-Z56O7UEU.cjs +0 -136
- package/dist/chunk-Z56O7UEU.cjs.map +0 -1
- package/dist/chunk-ZBZDR4ZC.js +0 -106
- package/dist/chunk-ZBZDR4ZC.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"data-table.cjs"}
|
|
1
|
+
{"version":3,"sources":["../../../src/lib/utils.ts","../../../src/lib/i18n.ts","../../../src/components/ui/checkbox.tsx","../../../src/components/ui/skeleton.tsx","../../../src/components/ui/table.tsx","../../../src/lib/constants.ts","../../../src/components/ui/button.tsx","../../../src/components/ui/pagination.tsx","../../../src/components/ui/pagination-controlled.tsx","../../../src/hooks/use-infinite-scroll.ts","../../../src/components/ui/spinner.tsx","../../../src/components/ui/data-table.tsx"],"names":["twMerge","clsx","React","jsx","CheckboxPrimitive","CheckIcon","cva","jsxs","forwardRef","Slot","isValidElement","cloneElement","Loader2","Fragment","React2","isRTL","ChevronRightIcon","ChevronLeftIcon","MoreHorizontalIcon","React3","React4","React5","React6","ChevronRight","ChevronDown"],"mappings":"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","file":"data-table.cjs","sourcesContent":["import { type ClassValue, clsx } from 'clsx'\nimport { twMerge } from 'tailwind-merge'\nimport { formatJalaliDate } from '@/lib/jalali-utils'\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n\nexport type SupportedLocale = 'fa' | 'ar' | 'en'\n\n/**\n * Convert digits in a string to Persian/Arabic numerals based on locale.\n * @example convertToLocalNumbers('123', 'fa') => '۱۲۳'\n * @example convertToLocalNumbers('123', 'en') => '123'\n */\nexport function convertToLocalNumbers(text: string | number, locale: SupportedLocale): string {\n if (locale === 'fa' || locale === 'ar') {\n const persianDigits = ['۰', '۱', '۲', '۳', '۴', '۵', '۶', '۷', '۸', '۹']\n return String(text).replace(/\\d/g, (digit) => persianDigits[parseInt(digit)])\n }\n return String(text)\n}\n\n/**\n * Format large numbers with locale-aware suffixes (K/M/B).\n * @example formatLargeNumber(1500, 'fa') => '۱.۵ هزار'\n * @example formatLargeNumber(1500, 'en') => '1.5K'\n */\nexport function formatLargeNumber(num: number, locale: SupportedLocale): string {\n if (num >= 1_000_000_000) {\n const formatted = (num / 1_000_000_000).toFixed(1).replace(/\\.0$/, '')\n return convertToLocalNumbers(formatted, locale) + (locale === 'en' ? 'B' : ' میلیارد')\n }\n if (num >= 1_000_000) {\n const formatted = (num / 1_000_000).toFixed(1).replace(/\\.0$/, '')\n return convertToLocalNumbers(formatted, locale) + (locale === 'en' ? 'M' : ' میلیون')\n }\n if (num >= 1_000) {\n const formatted = (num / 1_000).toFixed(1).replace(/\\.0$/, '')\n return convertToLocalNumbers(formatted, locale) + (locale === 'en' ? 'K' : ' هزار')\n }\n return convertToLocalNumbers(num.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, ','), locale)\n}\n\n/**\n * Format number to Instagram-style short format (English only).\n * @example formatNumber(123456, 'short') => '123K'\n * @example formatNumber(123456, 'exact') => '123,456'\n */\nexport function formatNumber(num: number | undefined, format: 'exact' | 'short' = 'exact'): string {\n if (num === undefined || num === null) return '0'\n\n if (format === 'exact') {\n return num.toLocaleString('en-US')\n }\n\n // Short format (Instagram style)\n if (num >= 1_000_000_000) {\n return `${(num / 1_000_000_000).toFixed(1).replace(/\\.0$/, '')}B`\n }\n if (num >= 1_000_000) {\n return `${(num / 1_000_000).toFixed(1).replace(/\\.0$/, '')}M`\n }\n if (num >= 1_000) {\n return `${(num / 1_000).toFixed(1).replace(/\\.0$/, '')}K`\n }\n return num.toString()\n}\n\n/**\n * Format date to relative time with absolute on hover (Persian)\n * @example formatRelativeTime(new Date()) => '۲ ساعت پیش'\n */\nexport function formatRelativeTime(date: Date | string | number): string {\n const now = new Date()\n const then = new Date(date)\n const diffInSeconds = Math.floor((now.getTime() - then.getTime()) / 1000)\n\n if (diffInSeconds < 60) {\n return 'همین الان'\n }\n\n const diffInMinutes = Math.floor(diffInSeconds / 60)\n if (diffInMinutes < 60) {\n return `${convertToLocalNumbers(diffInMinutes, 'fa')} دقیقه پیش`\n }\n\n const diffInHours = Math.floor(diffInMinutes / 60)\n if (diffInHours < 24) {\n return `${convertToLocalNumbers(diffInHours, 'fa')} ساعت پیش`\n }\n\n const diffInDays = Math.floor(diffInHours / 24)\n if (diffInDays < 7) {\n return `${convertToLocalNumbers(diffInDays, 'fa')} روز پیش`\n }\n\n const diffInWeeks = Math.floor(diffInDays / 7)\n if (diffInWeeks < 4) {\n return `${convertToLocalNumbers(diffInWeeks, 'fa')} هفته پیش`\n }\n\n const diffInMonths = Math.floor(diffInDays / 30)\n if (diffInMonths < 12) {\n return `${convertToLocalNumbers(diffInMonths, 'fa')} ماه پیش`\n }\n\n const diffInYears = Math.floor(diffInDays / 365)\n return `${convertToLocalNumbers(diffInYears, 'fa')} سال پیش`\n}\n\n/**\n * Format date to absolute format (Persian / Jalali)\n * Uses date-fns-jalali for accurate Jalali conversion.\n * @example formatAbsoluteTime(new Date()) => '۱۵ دی ۱۴۰۳، ۱۵:۳۰'\n */\nexport function formatAbsoluteTime(date: Date | string | number): string {\n const d = new Date(date)\n return formatJalaliDate(d, 'd MMMM yyyy، HH:mm')\n}\n","import type { SupportedLocale } from './utils'\n\n// Re-export SupportedLocale as Locale for public API convenience.\n// SupportedLocale is the canonical type; Locale is an alias.\nexport type Locale = SupportedLocale\n\n/**\n * Returns true for RTL locales (fa, ar).\n */\nexport function isRTL(locale: SupportedLocale): boolean {\n return locale === 'fa' || locale === 'ar'\n}\n\n// NOTE: TIER_LABELS and GROUP_LABELS already live in engagement-utils.ts.\n// This file only houses UI-layer translations that are not part of the domain model.\n\n/**\n * UI string translations used by the EngagementRate component.\n * Centralised here to avoid duplication between components.\n */\nexport const engagementUiTranslations: Record<\n SupportedLocale,\n {\n yourCategory: string\n influencer: string\n followers: string\n over: string\n to: string\n and: string\n lessThan: string\n you: string\n criteria: string\n }\n> = {\n fa: {\n yourCategory: 'دسته شما:',\n influencer: 'اینفلوئنسر',\n followers: 'فالوور',\n over: 'بیش از',\n to: 'تا',\n and: 'و بالاتر',\n lessThan: 'کمتر از',\n you: 'شما',\n criteria: 'معیارهای دسته',\n },\n ar: {\n yourCategory: 'فئتك:',\n influencer: 'مؤثر',\n followers: 'متابع',\n over: 'أكثر من',\n to: 'إلى',\n and: 'وأعلى',\n lessThan: 'أقل من',\n you: 'أنت',\n criteria: 'معايير فئة المؤثر',\n },\n en: {\n yourCategory: 'Your Category:',\n influencer: 'Influencer',\n followers: 'followers',\n over: 'Over',\n to: 'to',\n and: 'and above',\n lessThan: 'Less than',\n you: 'You',\n criteria: 'Category Criteria',\n },\n}\n\n/**\n * Sentiment label translations used by the SentimentBadge component.\n */\nexport const sentimentLabels: Record<\n SupportedLocale,\n {\n positive: string\n negative: string\n neutral: string\n mixed: string\n }\n> = {\n fa: { positive: 'مثبت', negative: 'منفی', neutral: 'خنثی', mixed: 'ترکیبی' },\n ar: { positive: 'إيجابي', negative: 'سلبي', neutral: 'محايد', mixed: 'مختلط' },\n en: { positive: 'Positive', negative: 'Negative', neutral: 'Neutral', mixed: 'Mixed' },\n}\n\n/**\n * Canonical emotion keys — 9-class advanced sentiment scale used in افکارسنجی\n * deep analysis. Coexists with the simple 3-class `Sentiment` above; they are\n * NOT interchangeable. Choose the scale based on view density.\n */\nexport type EmotionKey =\n | 'anger'\n | 'anticipation'\n | 'joy'\n | 'trust'\n | 'fear'\n | 'surprise'\n | 'sadness'\n | 'disgust'\n | 'neutral'\n\nexport const EMOTION_KEYS: readonly EmotionKey[] = [\n 'anger',\n 'anticipation',\n 'joy',\n 'trust',\n 'fear',\n 'surprise',\n 'sadness',\n 'disgust',\n 'neutral',\n] as const\n\n/** Emotion label translations used by EmotionBadge / EmotionDistribution. */\nexport const emotionLabels: Record<SupportedLocale, Record<EmotionKey, string>> = {\n fa: {\n anger: 'خشم',\n anticipation: 'انتظار',\n joy: 'شادی',\n trust: 'اعتماد',\n fear: 'ترس',\n surprise: 'شگفتی',\n sadness: 'غم',\n disgust: 'انزجار',\n neutral: 'خنثی',\n },\n ar: {\n anger: 'غضب',\n anticipation: 'ترقّب',\n joy: 'فرح',\n trust: 'ثقة',\n fear: 'خوف',\n surprise: 'دهشة',\n sadness: 'حزن',\n disgust: 'اشمئزاز',\n neutral: 'محايد',\n },\n en: {\n anger: 'Anger',\n anticipation: 'Anticipation',\n joy: 'Joy',\n trust: 'Trust',\n fear: 'Fear',\n surprise: 'Surprise',\n sadness: 'Sadness',\n disgust: 'Disgust',\n neutral: 'Neutral',\n },\n}\n\n/**\n * Stance keys — 5-class audience-stance classification used in clustering.\n * A concept / post / page belongs to exactly one primary stance, but usually\n * also has a secondary composition expressed as percentages. Keys are kept\n * short and historical; display labels are framed as audience stance toward\n * a tracked topic/brand (supporter ↔ detractor + undecided).\n */\nexport type FlowKey = 'pro-gov' | 'internal-critic' | 'internal-opponent' | 'external-opponent' | 'grey'\n\nexport const FLOW_KEYS: readonly FlowKey[] = [\n 'pro-gov',\n 'internal-critic',\n 'internal-opponent',\n 'external-opponent',\n 'grey',\n] as const\n\nexport const flowLabels: Record<SupportedLocale, Record<FlowKey, string>> = {\n fa: {\n 'pro-gov': 'حامی',\n 'internal-critic': 'منتقد سازنده',\n 'internal-opponent': 'مخالف',\n 'external-opponent': 'مخالف جدی',\n grey: 'خنثی',\n },\n ar: {\n 'pro-gov': 'مؤيد',\n 'internal-critic': 'منتقد بنّاء',\n 'internal-opponent': 'معارض',\n 'external-opponent': 'معارض شديد',\n grey: 'محايد',\n },\n en: {\n 'pro-gov': 'Supporter',\n 'internal-critic': 'Constructive Critic',\n 'internal-opponent': 'Detractor',\n 'external-opponent': 'Strong Detractor',\n grey: 'Undecided',\n },\n}\n\n/** Operational status — visual state of a tracked entity. */\nexport type StatusKey = 'critical' | 'warning' | 'normal'\n\nexport const statusLabels: Record<SupportedLocale, Record<StatusKey, string>> = {\n fa: { critical: 'بحرانی', warning: 'هشدار', normal: 'عادی' },\n ar: { critical: 'حرج', warning: 'تحذير', normal: 'طبيعي' },\n en: { critical: 'Critical', warning: 'Warning', normal: 'Normal' },\n}\n\n/** Severity — urgency level. Independent from status. */\nexport type SeverityKey = 'urgent' | 'high' | 'medium' | 'low'\n\nexport const severityLabels: Record<SupportedLocale, Record<SeverityKey, string>> = {\n fa: { urgent: 'فوری', high: 'بالا', medium: 'متوسط', low: 'پایین' },\n ar: { urgent: 'عاجل', high: 'مرتفع', medium: 'متوسط', low: 'منخفض' },\n en: { urgent: 'Urgent', high: 'High', medium: 'Medium', low: 'Low' },\n}\n\n/**\n * Job lifecycle — canonical states for async work (analyses, campaigns,\n * evaluation runs, imports, exports, report generation).\n *\n * Terminal states: completed / failed / cancelled.\n * Active states: queued / running / paused.\n */\nexport type JobStatusKey = 'queued' | 'running' | 'paused' | 'completed' | 'failed' | 'cancelled'\n\nexport const JOB_STATUS_KEYS: readonly JobStatusKey[] = [\n 'queued',\n 'running',\n 'paused',\n 'completed',\n 'failed',\n 'cancelled',\n] as const\n\nexport const jobStatusLabels: Record<SupportedLocale, Record<JobStatusKey, string>> = {\n fa: {\n queued: 'در صف',\n running: 'در حال اجرا',\n paused: 'متوقف',\n completed: 'تکمیل شد',\n failed: 'ناموفق',\n cancelled: 'لغو شد',\n },\n ar: {\n queued: 'في الطابور',\n running: 'قيد التنفيذ',\n paused: 'متوقف',\n completed: 'مكتمل',\n failed: 'فشل',\n cancelled: 'ملغى',\n },\n en: {\n queued: 'Queued',\n running: 'Running',\n paused: 'Paused',\n completed: 'Completed',\n failed: 'Failed',\n cancelled: 'Cancelled',\n },\n}\n\n/** True iff a job is still active (not in a terminal state). */\nexport function isActiveJobStatus(s: JobStatusKey): boolean {\n return s === 'queued' || s === 'running' || s === 'paused'\n}\n\n/**\n * Action status — discrete outcome for a single completed (or in-flight)\n * action in an activity feed / audit timeline. Distinct from the richer\n * job/stage lifecycles above: each event is atomic, so no \"paused\" here.\n */\nexport type ActionStatusKey = 'success' | 'failed' | 'pending' | 'warning' | 'info'\n\nexport const ACTION_STATUS_KEYS: readonly ActionStatusKey[] = [\n 'success',\n 'failed',\n 'pending',\n 'warning',\n 'info',\n] as const\n\nexport const actionStatusLabels: Record<SupportedLocale, Record<ActionStatusKey, string>> = {\n fa: {\n success: 'موفق',\n failed: 'ناموفق',\n pending: 'در حال انجام',\n warning: 'هشدار',\n info: 'اطلاع',\n },\n ar: {\n success: 'ناجح',\n failed: 'فشل',\n pending: 'قيد التنفيذ',\n warning: 'تحذير',\n info: 'معلومات',\n },\n en: {\n success: 'Success',\n failed: 'Failed',\n pending: 'Pending',\n warning: 'Warning',\n info: 'Info',\n },\n}\n\n/**\n * Locale-aware relative time label producer. Used by ActionTimeline and any\n * other component that wants trilingual \"n minutes ago\" strings. For absolute\n * formatting see `formatAbsoluteTime`/`formatJalaliDate` in lib/utils.ts.\n */\nexport function formatRelativeLocaleTime(date: Date | string | number, locale: SupportedLocale): string {\n const then = new Date(date).getTime()\n const now = Date.now()\n const diffSec = Math.floor((now - then) / 1000)\n\n const fmt = (n: number) => (locale === 'en' ? String(n) : n.toLocaleString(locale === 'ar' ? 'ar-EG' : 'fa-IR'))\n\n if (diffSec < 0) {\n // Future time — rare in feeds. Fall through to absolute below.\n return new Date(then).toISOString()\n }\n if (diffSec < 60) {\n if (locale === 'fa') return 'همین الان'\n if (locale === 'ar') return 'الآن'\n return 'just now'\n }\n const diffMin = Math.floor(diffSec / 60)\n if (diffMin < 60) {\n if (locale === 'fa') return `${fmt(diffMin)} دقیقه پیش`\n if (locale === 'ar') return `قبل ${fmt(diffMin)} دقيقة`\n return `${diffMin}m ago`\n }\n const diffHr = Math.floor(diffMin / 60)\n if (diffHr < 24) {\n if (locale === 'fa') return `${fmt(diffHr)} ساعت پیش`\n if (locale === 'ar') return `قبل ${fmt(diffHr)} ساعة`\n return `${diffHr}h ago`\n }\n const diffDay = Math.floor(diffHr / 24)\n if (diffDay < 7) {\n if (locale === 'fa') return `${fmt(diffDay)} روز پیش`\n if (locale === 'ar') return `قبل ${fmt(diffDay)} يوم`\n return `${diffDay}d ago`\n }\n const diffWk = Math.floor(diffDay / 7)\n if (diffWk < 4) {\n if (locale === 'fa') return `${fmt(diffWk)} هفته پیش`\n if (locale === 'ar') return `قبل ${fmt(diffWk)} أسبوع`\n return `${diffWk}w ago`\n }\n const diffMon = Math.floor(diffDay / 30)\n if (diffMon < 12) {\n if (locale === 'fa') return `${fmt(diffMon)} ماه پیش`\n if (locale === 'ar') return `قبل ${fmt(diffMon)} شهر`\n return `${diffMon}mo ago`\n }\n const diffYr = Math.floor(diffDay / 365)\n if (locale === 'fa') return `${fmt(diffYr)} سال پیش`\n if (locale === 'ar') return `قبل ${fmt(diffYr)} سنة`\n return `${diffYr}y ago`\n}\n\n/**\n * Locale-aware \"time remaining\" label — forward-looking companion to\n * `formatRelativeLocaleTime`. Used by RateLimitBanner and any countdown UI.\n *\n * Input can be a Date, ISO string, or epoch ms. Past/zero remaining returns\n * the locale-specific \"now\" / \"any moment\" marker.\n */\nexport function formatTimeRemaining(target: Date | string | number, locale: SupportedLocale): string {\n const then = new Date(target).getTime()\n const now = Date.now()\n const diffSec = Math.max(0, Math.floor((then - now) / 1000))\n\n const fmt = (n: number) => (locale === 'en' ? String(n) : n.toLocaleString(locale === 'ar' ? 'ar-EG' : 'fa-IR'))\n\n if (diffSec <= 0) {\n if (locale === 'fa') return 'هماکنون'\n if (locale === 'ar') return 'الآن'\n return 'any moment'\n }\n if (diffSec < 60) {\n if (locale === 'fa') return `${fmt(diffSec)} ثانیه دیگر`\n if (locale === 'ar') return `بعد ${fmt(diffSec)} ثانية`\n return `in ${diffSec}s`\n }\n const totalMin = Math.floor(diffSec / 60)\n if (totalMin < 60) {\n if (locale === 'fa') return `${fmt(totalMin)} دقیقه دیگر`\n if (locale === 'ar') return `بعد ${fmt(totalMin)} دقيقة`\n return `in ${totalMin}m`\n }\n const hours = Math.floor(totalMin / 60)\n const mins = totalMin % 60\n if (hours < 24) {\n if (mins === 0) {\n if (locale === 'fa') return `${fmt(hours)} ساعت دیگر`\n if (locale === 'ar') return `بعد ${fmt(hours)} ساعة`\n return `in ${hours}h`\n }\n if (locale === 'fa') return `${fmt(hours)} ساعت و ${fmt(mins)} دقیقه دیگر`\n if (locale === 'ar') return `بعد ${fmt(hours)} ساعة و${fmt(mins)} دقيقة`\n return `in ${hours}h ${mins}m`\n }\n const days = Math.floor(hours / 24)\n const remHours = hours % 24\n if (remHours === 0) {\n if (locale === 'fa') return `${fmt(days)} روز دیگر`\n if (locale === 'ar') return `بعد ${fmt(days)} يوم`\n return `in ${days}d`\n }\n if (locale === 'fa') return `${fmt(days)} روز و ${fmt(remHours)} ساعت دیگر`\n if (locale === 'ar') return `بعد ${fmt(days)} يوم و${fmt(remHours)} ساعة`\n return `in ${days}d ${remHours}h`\n}\n\n/**\n * Stage status — for multi-stage pipeline visualizations (StatusFlow).\n *\n * Distinct from `JobStatusKey`: a job has ONE status; a pipeline of stages has\n * a status PER stage. A `running` stage means that stage is currently active;\n * a `warning` stage completed but with caveats; `skipped` means it was bypassed.\n */\nexport type StageStatusKey = 'pending' | 'running' | 'completed' | 'failed' | 'skipped' | 'warning' | 'paused'\n\nexport const STAGE_STATUS_KEYS: readonly StageStatusKey[] = [\n 'pending',\n 'running',\n 'completed',\n 'failed',\n 'skipped',\n 'warning',\n 'paused',\n] as const\n\nexport const stageStatusLabels: Record<SupportedLocale, Record<StageStatusKey, string>> = {\n fa: {\n pending: 'در انتظار',\n running: 'در حال اجرا',\n completed: 'تکمیل شد',\n failed: 'ناموفق',\n skipped: 'رد شد',\n warning: 'با هشدار',\n paused: 'متوقف',\n },\n ar: {\n pending: 'في الانتظار',\n running: 'قيد التنفيذ',\n completed: 'مكتمل',\n failed: 'فشل',\n skipped: 'تم تخطيه',\n warning: 'مع تحذير',\n paused: 'متوقف',\n },\n en: {\n pending: 'Pending',\n running: 'Running',\n completed: 'Completed',\n failed: 'Failed',\n skipped: 'Skipped',\n warning: 'Warning',\n paused: 'Paused',\n },\n}\n\n/**\n * Action type — canonical set of social-media actions a worker/user can\n * execute. Maps 1:1 to a CSS token family (`--action-type-*`) so each action\n * has a distinct recognizable colour + icon across activity feeds, audit\n * timelines, and rate-limit dashboards.\n *\n * The 7 canonical keys cover current افکارسنجی + Booster + future SRR use:\n * - `like` / `comment` / `save` / `follow` / `unfollow` — Booster OPERATION_TYPES\n * - `dm` — direct message (future bulk-DM, notification replies)\n * - `share` — cross-post / retweet (future multi-platform)\n */\nexport type ActionTypeKey = 'like' | 'comment' | 'save' | 'follow' | 'unfollow' | 'dm' | 'share'\n\nexport const ACTION_TYPE_KEYS: readonly ActionTypeKey[] = [\n 'like',\n 'comment',\n 'save',\n 'follow',\n 'unfollow',\n 'dm',\n 'share',\n] as const\n\nexport const actionTypeLabels: Record<SupportedLocale, Record<ActionTypeKey, string>> = {\n fa: {\n like: 'پسندیدن',\n comment: 'نظر',\n save: 'ذخیره',\n follow: 'دنبال کردن',\n unfollow: 'لغو دنبال',\n dm: 'پیام مستقیم',\n share: 'اشتراکگذاری',\n },\n ar: {\n like: 'إعجاب',\n comment: 'تعليق',\n save: 'حفظ',\n follow: 'متابعة',\n unfollow: 'إلغاء المتابعة',\n dm: 'رسالة مباشرة',\n share: 'مشاركة',\n },\n en: {\n like: 'Like',\n comment: 'Comment',\n save: 'Save',\n follow: 'Follow',\n unfollow: 'Unfollow',\n dm: 'Direct Message',\n share: 'Share',\n },\n}\n\n/**\n * Short-form verb labels for past-tense activity phrasing (\"worker X پسندید Y\").\n * When composing \"subject action object\" sentences in ActivityFeed / ActionTimeline,\n * prefer these over `actionTypeLabels` which are noun-form.\n */\nexport const actionTypeVerbs: Record<SupportedLocale, Record<ActionTypeKey, string>> = {\n fa: {\n like: 'پسندید',\n comment: 'نظر گذاشت',\n save: 'ذخیره کرد',\n follow: 'دنبال کرد',\n unfollow: 'لغو دنبال کرد',\n dm: 'پیام داد',\n share: 'اشتراک گذاشت',\n },\n ar: {\n like: 'أعجب',\n comment: 'علّق على',\n save: 'حفظ',\n follow: 'تابع',\n unfollow: 'ألغى متابعة',\n dm: 'راسل',\n share: 'شارك',\n },\n en: {\n like: 'liked',\n comment: 'commented on',\n save: 'saved',\n follow: 'followed',\n unfollow: 'unfollowed',\n dm: 'DMd',\n share: 'shared',\n },\n}\n\n/**\n * Entity health — 6-tier severity narrative for long-lived entities like\n * workers, tracked pages, data sources, monitored feeds. Ordered most-critical\n * to most-positive so components can sort \"worst first\" deterministically.\n *\n * `banned` — entity is permanently disabled / blocked upstream.\n * `pending` — not yet evaluated (new, awaiting verification, in setup).\n * `at-risk` — immediate intervention needed (failed checks, violations).\n * `warning` — degrading signals, needs monitoring.\n * `growing` — improving trajectory but not yet healthy.\n * `healthy` — stable, all checks pass.\n *\n * Distinct from `StatusKey` (critical/warning/normal — short-lived operational)\n * and `SeverityKey` (urgent/high/medium/low — urgency of an action item).\n */\nexport type EntityHealthKey = 'banned' | 'pending' | 'at-risk' | 'warning' | 'growing' | 'healthy'\n\nexport const ENTITY_HEALTH_KEYS: readonly EntityHealthKey[] = [\n 'banned',\n 'pending',\n 'at-risk',\n 'warning',\n 'growing',\n 'healthy',\n] as const\n\nexport const entityHealthLabels: Record<SupportedLocale, Record<EntityHealthKey, string>> = {\n fa: {\n banned: 'مسدود',\n pending: 'در انتظار بررسی',\n 'at-risk': 'در خطر',\n warning: 'هشدار',\n growing: 'در حال بهبود',\n healthy: 'سالم',\n },\n ar: {\n banned: 'محظور',\n pending: 'قيد الانتظار',\n 'at-risk': 'في خطر',\n warning: 'تحذير',\n growing: 'ينمو',\n healthy: 'صحي',\n },\n en: {\n banned: 'Banned',\n pending: 'Pending',\n 'at-risk': 'At Risk',\n warning: 'Warning',\n growing: 'Growing',\n healthy: 'Healthy',\n },\n}\n\n/**\n * Priority rank of each entity health state — higher number = more severe.\n * Use to sort entity lists \"worst first\" without ad-hoc comparisons.\n */\nexport const entityHealthPriority: Record<EntityHealthKey, number> = {\n banned: 5,\n 'at-risk': 4,\n warning: 3,\n pending: 2,\n growing: 1,\n healthy: 0,\n}\n\n/** True iff the entity needs immediate human attention. */\nexport function isCriticalEntityHealth(s: EntityHealthKey): boolean {\n return s === 'banned' || s === 'at-risk'\n}\n\n/**\n * Default UI strings for components that need localized text.\n * Persian (fa) is the default locale for backward compatibility.\n */\nexport const UI_STRINGS = {\n fa: {\n // Autocomplete\n noResults: 'نتیجهای یافت نشد',\n suggestions: 'پیشنهادها',\n\n // MultiSelect\n select: 'انتخاب کنید',\n noOptionsFound: 'موردی یافت نشد',\n search: 'جستجو...',\n clearAll: 'پاک کردن همه',\n\n // DatePicker / DateRangePicker\n selectDate: 'انتخاب تاریخ',\n selectDateRange: 'انتخاب بازه تاریخ',\n\n // ErrorState\n errorLoadingData: 'خطا در بارگذاری دادهها',\n retry: 'تلاش مجدد',\n\n // FilterChip\n remove: 'حذف',\n\n // UserAutocomplete\n noUsersFound: 'کاربری یافت نشد',\n\n // Pagination\n goToPreviousPage: 'رفتن به صفحه قبلی',\n goToNextPage: 'رفتن به صفحه بعدی',\n previous: 'قبلی',\n next: 'بعدی',\n\n // ProfileInfo\n actions: 'عملیات',\n\n // CopyButton\n copy: 'کپی',\n copied: 'کپی شد',\n\n // ConfirmDialog\n confirm: 'تایید',\n cancel: 'انصراف',\n areYouSure: 'آیا مطمئن هستید؟',\n\n // Stepper\n stepperLabel: 'مراحل',\n stepCompleted: 'تکمیل شده',\n stepCurrent: 'مرحله فعلی',\n stepPending: 'در انتظار',\n\n // FilterBar / FilterPanel\n clearFilters: 'پاک کردن فیلترها',\n activeFilters: 'فیلترهای فعال',\n filters: 'فیلترها',\n applyFilters: 'اعمال',\n resetFilters: 'پیشفرض',\n noFiltersActive: 'فیلتر فعالی نیست',\n clearSection: 'پاک کردن این بخش',\n\n // PageHeader\n goBack: 'بازگشت',\n\n // ViewToggle\n gridView: 'نمای شبکهای',\n listView: 'نمای لیستی',\n\n // PageLoader\n loading: 'در حال بارگذاری...',\n\n // ErrorBoundary\n unexpectedError: 'خطای غیرمنتظرهای رخ داد',\n\n // DataTable\n selectAll: 'انتخاب همه',\n selectRow: 'انتخاب ردیف',\n noDataToDisplay: 'دادهای برای نمایش وجود ندارد',\n\n // InstagramPost\n likesCount: 'تعداد لایک',\n commentsCount: 'تعداد کامنت',\n viewsCount: 'تعداد بازدید',\n sharesCount: 'تعداد اشتراک',\n postTypeLabel: 'نوع پست',\n postTypePhoto: 'عکس',\n postTypeVideo: 'ویدیو',\n postTypeCarousel: 'اسلاید',\n showMore: 'بیشتر',\n showLess: 'کمتر',\n noMediaAvailable: 'رسانهای موجود نیست',\n commentAnalysis: 'تحلیل کامنتها',\n commentAnalysisDisabled: 'تحلیل کامنتها (غیرفعال)',\n booster: 'بوستر',\n boosterDisabled: 'بوستر (غیرفعال)',\n aiAnalysis: 'تحلیل هوش مصنوعی',\n aiAnalysisDisabled: 'تحلیل هوش مصنوعی (غیرفعال)',\n openOnInstagram: 'باز کردن در اینستاگرام',\n openOnInstagramDisabled: 'باز کردن در اینستاگرام (غیرفعال)',\n },\n ar: {\n noResults: 'لم يتم العثور على نتائج',\n suggestions: 'اقتراحات',\n select: 'اختر',\n noOptionsFound: 'لم يتم العثور على خيارات',\n search: 'بحث...',\n clearAll: 'مسح الكل',\n selectDate: 'اختر تاريخ',\n selectDateRange: 'اختر نطاق التاريخ',\n errorLoadingData: 'خطأ في تحميل البيانات',\n retry: 'إعادة المحاولة',\n remove: 'حذف',\n noUsersFound: 'لم يتم العثور على مستخدمين',\n goToPreviousPage: 'الانتقال إلى الصفحة السابقة',\n goToNextPage: 'الانتقال إلى الصفحة التالية',\n previous: 'السابق',\n next: 'التالي',\n actions: 'إجراءات',\n\n // CopyButton\n copy: 'نسخ',\n copied: 'تم النسخ',\n\n // ConfirmDialog\n confirm: 'تأكيد',\n cancel: 'إلغاء',\n areYouSure: 'هل أنت متأكد؟',\n\n // Stepper\n stepperLabel: 'الخطوات',\n stepCompleted: 'مكتمل',\n stepCurrent: 'الخطوة الحالية',\n stepPending: 'قيد الانتظار',\n\n // FilterBar / FilterPanel\n clearFilters: 'مسح الفلاتر',\n activeFilters: 'الفلاتر النشطة',\n filters: 'الفلاتر',\n applyFilters: 'تطبيق',\n resetFilters: 'الافتراضي',\n noFiltersActive: 'لا توجد فلاتر نشطة',\n clearSection: 'مسح هذا القسم',\n\n // PageHeader\n goBack: 'رجوع',\n\n // ViewToggle\n gridView: 'عرض شبكي',\n listView: 'عرض قائمة',\n\n // PageLoader\n loading: 'جارٍ التحميل...',\n\n // ErrorBoundary\n unexpectedError: 'حدث خطأ غير متوقع',\n\n // DataTable\n selectAll: 'تحديد الكل',\n selectRow: 'تحديد الصف',\n noDataToDisplay: 'لا توجد بيانات للعرض',\n\n // InstagramPost\n likesCount: 'عدد الإعجابات',\n commentsCount: 'عدد التعليقات',\n viewsCount: 'عدد المشاهدات',\n sharesCount: 'عدد المشاركات',\n postTypeLabel: 'نوع المنشور',\n postTypePhoto: 'صورة',\n postTypeVideo: 'فيديو',\n postTypeCarousel: 'شرائح',\n showMore: 'المزيد',\n showLess: 'أقل',\n noMediaAvailable: 'لا توجد وسائط',\n commentAnalysis: 'تحليل التعليقات',\n commentAnalysisDisabled: 'تحليل التعليقات (معطل)',\n booster: 'تعزيز',\n boosterDisabled: 'تعزيز (معطل)',\n aiAnalysis: 'تحليل الذكاء الاصطناعي',\n aiAnalysisDisabled: 'تحليل الذكاء الاصطناعي (معطل)',\n openOnInstagram: 'فتح في إنستاجرام',\n openOnInstagramDisabled: 'فتح في إنستاجرام (معطل)',\n },\n en: {\n noResults: 'No results found',\n suggestions: 'Suggestions',\n select: 'Select',\n noOptionsFound: 'No options found',\n search: 'Search...',\n clearAll: 'Clear all',\n selectDate: 'Select date',\n selectDateRange: 'Select date range',\n errorLoadingData: 'Error loading data',\n retry: 'Retry',\n remove: 'Remove',\n noUsersFound: 'No users found',\n goToPreviousPage: 'Go to previous page',\n goToNextPage: 'Go to next page',\n previous: 'Previous',\n next: 'Next',\n actions: 'Actions',\n\n // CopyButton\n copy: 'Copy',\n copied: 'Copied',\n\n // ConfirmDialog\n confirm: 'Confirm',\n cancel: 'Cancel',\n areYouSure: 'Are you sure?',\n\n // Stepper\n stepperLabel: 'Steps',\n stepCompleted: 'Completed',\n stepCurrent: 'Current step',\n stepPending: 'Pending',\n\n // FilterBar / FilterPanel\n clearFilters: 'Clear filters',\n activeFilters: 'Active filters',\n filters: 'Filters',\n applyFilters: 'Apply',\n resetFilters: 'Reset',\n noFiltersActive: 'No active filters',\n clearSection: 'Clear this section',\n\n // PageHeader\n goBack: 'Go back',\n\n // ViewToggle\n gridView: 'Grid view',\n listView: 'List view',\n\n // PageLoader\n loading: 'Loading...',\n\n // ErrorBoundary\n unexpectedError: 'An unexpected error occurred',\n\n // DataTable\n selectAll: 'Select all',\n selectRow: 'Select row',\n noDataToDisplay: 'No data to display',\n\n // InstagramPost\n likesCount: 'Likes',\n commentsCount: 'Comments',\n viewsCount: 'Views',\n sharesCount: 'Shares',\n postTypeLabel: 'Post type',\n postTypePhoto: 'Photo',\n postTypeVideo: 'Video',\n postTypeCarousel: 'Carousel',\n showMore: 'More',\n showLess: 'Less',\n noMediaAvailable: 'No media available',\n commentAnalysis: 'Comment Analysis',\n commentAnalysisDisabled: 'Comment Analysis (disabled)',\n booster: 'Booster',\n boosterDisabled: 'Booster (disabled)',\n aiAnalysis: 'AI Analysis',\n aiAnalysisDisabled: 'AI Analysis (disabled)',\n openOnInstagram: 'Open on Instagram',\n openOnInstagramDisabled: 'Open on Instagram (disabled)',\n },\n} as const\n\nexport type UIStringKeys = keyof (typeof UI_STRINGS)['fa']\nexport type UIStrings = Record<UIStringKeys, string>\n\n/**\n * Get UI strings for a given locale.\n * Falls back to 'fa' for unknown locales.\n */\nexport function getUIStrings(locale: SupportedLocale = 'fa'): UIStrings {\n return (UI_STRINGS[locale] ?? UI_STRINGS.fa) as UIStrings\n}\n","'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-on-brand 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","'use client'\n\nimport * as React from 'react'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { cn } from '@/lib/utils'\n\nconst skeletonVariants = cva('bg-accent animate-pulse', {\n variants: {\n shape: {\n rect: 'rounded-md',\n line: 'rounded-full h-4 w-full',\n circle: 'rounded-full',\n text: 'rounded h-4',\n },\n size: {\n sm: '',\n md: '',\n lg: '',\n },\n },\n compoundVariants: [\n { shape: 'circle', size: 'sm', class: 'size-8' },\n { shape: 'circle', size: 'md', class: 'size-10' },\n { shape: 'circle', size: 'lg', class: 'size-14' },\n ],\n defaultVariants: {\n shape: 'rect',\n size: 'md',\n },\n})\n\nexport interface SkeletonProps extends React.HTMLAttributes<HTMLDivElement>, VariantProps<typeof skeletonVariants> {\n /**\n * تعداد عناصر skeleton برای نمایش (برای shape های line و text)\n * Number of skeleton elements to repeat (for line/text shapes)\n */\n count?: number\n}\n\nfunction Skeleton({ className, shape, size, count, ...props }: SkeletonProps) {\n if (count && count > 1) {\n return (\n <div role=\"status\" aria-busy=\"true\" aria-label=\"Loading\" className=\"space-y-2\">\n {Array.from({ length: count }).map((_, i) => (\n <div\n key={i}\n data-slot=\"skeleton\"\n aria-hidden=\"true\"\n className={cn(skeletonVariants({ shape, size }), className)}\n />\n ))}\n </div>\n )\n }\n\n return (\n <div\n data-slot=\"skeleton\"\n role=\"status\"\n aria-busy=\"true\"\n aria-label=\"Loading\"\n {...props}\n className={cn(skeletonVariants({ shape, size }), className)}\n />\n )\n}\n\nSkeleton.displayName = 'Skeleton'\n\n/* -------------------------------------------------------------------------- */\n/* Named Skeleton Presets */\n/* -------------------------------------------------------------------------- */\n\nexport interface MetricCardSkeletonProps {\n className?: string\n}\n\nfunction MetricCardSkeleton({ className }: MetricCardSkeletonProps) {\n return (\n <div\n data-slot=\"metric-card-skeleton\"\n role=\"status\"\n aria-busy=\"true\"\n aria-label=\"Loading metric\"\n className={cn('rounded-lg border border-border bg-card p-4 space-y-3', className)}\n >\n <Skeleton shape=\"line\" className=\"h-3 w-1/3\" aria-hidden=\"true\" />\n <Skeleton shape=\"rect\" className=\"h-8 w-1/2\" aria-hidden=\"true\" />\n <Skeleton shape=\"line\" className=\"h-3 w-1/4\" aria-hidden=\"true\" />\n </div>\n )\n}\nMetricCardSkeleton.displayName = 'MetricCardSkeleton'\n\nexport interface ChartSkeletonProps {\n className?: string\n}\n\nfunction ChartSkeleton({ className }: ChartSkeletonProps) {\n return (\n <div\n data-slot=\"chart-skeleton\"\n role=\"status\"\n aria-busy=\"true\"\n aria-label=\"Loading chart\"\n className={cn('w-full rounded-md overflow-hidden', className)}\n >\n <Skeleton shape=\"rect\" className=\"w-full h-full min-h-[200px]\" aria-hidden=\"true\" />\n </div>\n )\n}\nChartSkeleton.displayName = 'ChartSkeleton'\n\nexport interface TableSkeletonProps {\n rows?: number\n className?: string\n}\n\nfunction TableSkeleton({ rows = 5, className }: TableSkeletonProps) {\n return (\n <div\n data-slot=\"table-skeleton\"\n role=\"status\"\n aria-busy=\"true\"\n aria-label=\"Loading table\"\n className={cn('w-full rounded-md border border-border overflow-hidden', className)}\n >\n <div className=\"flex gap-4 bg-muted/50 px-4 py-3 border-b border-border\" aria-hidden=\"true\">\n <Skeleton shape=\"line\" className=\"h-4 flex-1\" />\n <Skeleton shape=\"line\" className=\"h-4 flex-1\" />\n <Skeleton shape=\"line\" className=\"h-4 flex-1\" />\n <Skeleton shape=\"line\" className=\"h-4 w-16\" />\n </div>\n {Array.from({ length: rows }).map((_, i) => (\n <div\n key={i}\n aria-hidden=\"true\"\n className={cn('flex gap-4 px-4 py-3', i !== rows - 1 && 'border-b border-border')}\n >\n <Skeleton shape=\"line\" className=\"h-4 flex-1\" />\n <Skeleton shape=\"line\" className=\"h-4 flex-1\" />\n <Skeleton shape=\"line\" className=\"h-4 flex-1\" />\n <Skeleton shape=\"line\" className=\"h-4 w-16\" />\n </div>\n ))}\n </div>\n )\n}\nTableSkeleton.displayName = 'TableSkeleton'\n\n/* -------------------------------------------------------------------------- */\n/* TableRowSkeleton — a single row inside an existing table */\n/* -------------------------------------------------------------------------- */\n\nexport interface TableRowSkeletonProps {\n /** Number of cells in the row */\n cells?: number\n className?: string\n}\n\nfunction TableRowSkeleton({ cells = 4, className }: TableRowSkeletonProps) {\n // Don't assign role=\"status\" to <tr> — it's a table-row element and\n // ARIA disallows that combination. The cell <td>s carry aria-hidden so\n // screen readers stay quiet during the brief loading window.\n return (\n <tr data-slot=\"table-row-skeleton\" aria-busy=\"true\" className={className}>\n {Array.from({ length: cells }).map((_, i) => (\n <td key={i} className=\"px-3 py-2.5\" aria-hidden=\"true\">\n <Skeleton shape=\"line\" className=\"h-3.5 w-full max-w-[140px]\" />\n </td>\n ))}\n </tr>\n )\n}\nTableRowSkeleton.displayName = 'TableRowSkeleton'\n\n/* -------------------------------------------------------------------------- */\n/* CardSkeleton — typical card with title + body lines + optional image */\n/* -------------------------------------------------------------------------- */\n\nexport interface CardSkeletonProps {\n /** Show a leading image/thumbnail block @default false */\n withImage?: boolean\n /** Aspect ratio of the image (when withImage) @default 'video' */\n imageAspect?: 'video' | 'square' | 'wide'\n /** Number of body lines @default 2 */\n bodyLines?: number\n /** Show a footer row (button-shaped placeholder) @default false */\n withFooter?: boolean\n className?: string\n}\n\nfunction CardSkeleton({\n withImage = false,\n imageAspect = 'video',\n bodyLines = 2,\n withFooter = false,\n className,\n}: CardSkeletonProps) {\n const aspectClass =\n imageAspect === 'square' ? 'aspect-square' : imageAspect === 'wide' ? 'aspect-[21/9]' : 'aspect-video'\n return (\n <div\n data-slot=\"card-skeleton\"\n role=\"status\"\n aria-busy=\"true\"\n aria-label=\"Loading card\"\n className={cn('rounded-lg border border-border bg-card overflow-hidden flex flex-col', className)}\n >\n {withImage && <Skeleton shape=\"rect\" className={cn('w-full', aspectClass)} aria-hidden=\"true\" />}\n <div className=\"p-4 space-y-3 flex-1\">\n <Skeleton shape=\"line\" className=\"h-4 w-3/5\" aria-hidden=\"true\" />\n <div className=\"space-y-2\">\n {Array.from({ length: bodyLines }).map((_, i) => (\n <Skeleton\n key={i}\n shape=\"line\"\n className={cn('h-3', i === bodyLines - 1 ? 'w-2/3' : 'w-full')}\n aria-hidden=\"true\"\n />\n ))}\n </div>\n </div>\n {withFooter && (\n <div className=\"p-4 border-t border-border flex items-center justify-between gap-2\">\n <Skeleton shape=\"line\" className=\"h-3 w-1/4\" aria-hidden=\"true\" />\n <Skeleton shape=\"rect\" className=\"h-8 w-20\" aria-hidden=\"true\" />\n </div>\n )}\n </div>\n )\n}\nCardSkeleton.displayName = 'CardSkeleton'\n\n/* -------------------------------------------------------------------------- */\n/* AvatarTextSkeleton — circle avatar + 2 text lines (list/comment style) */\n/* -------------------------------------------------------------------------- */\n\nexport interface AvatarTextSkeletonProps {\n /** Avatar size @default 'md' */\n size?: 'sm' | 'md' | 'lg'\n /** Number of text lines beside the avatar @default 2 */\n lines?: number\n className?: string\n}\n\nfunction AvatarTextSkeleton({ size = 'md', lines = 2, className }: AvatarTextSkeletonProps) {\n return (\n <div\n data-slot=\"avatar-text-skeleton\"\n role=\"status\"\n aria-busy=\"true\"\n aria-label=\"Loading user\"\n className={cn('flex items-center gap-3', className)}\n >\n <Skeleton shape=\"circle\" size={size} aria-hidden=\"true\" />\n <div className=\"flex-1 min-w-0 space-y-2\">\n {Array.from({ length: lines }).map((_, i) => (\n <Skeleton\n key={i}\n shape=\"line\"\n className={cn('h-3', i === 0 ? 'w-1/3' : i === lines - 1 ? 'w-1/2' : 'w-full')}\n aria-hidden=\"true\"\n />\n ))}\n </div>\n </div>\n )\n}\nAvatarTextSkeleton.displayName = 'AvatarTextSkeleton'\n\n/* -------------------------------------------------------------------------- */\n/* FormRowSkeleton — label + input placeholder for forms */\n/* -------------------------------------------------------------------------- */\n\nexport interface FormRowSkeletonProps {\n /** Field shape — 'input' (one-line), 'textarea' (3-line), 'select' (input + chevron) */\n field?: 'input' | 'textarea' | 'select'\n /** Show help text line below input @default false */\n withHelp?: boolean\n className?: string\n}\n\nfunction FormRowSkeleton({ field = 'input', withHelp = false, className }: FormRowSkeletonProps) {\n const inputClass = field === 'textarea' ? 'h-20' : field === 'select' ? 'h-9' : 'h-9'\n return (\n <div\n data-slot=\"form-row-skeleton\"\n role=\"status\"\n aria-busy=\"true\"\n aria-label=\"Loading form field\"\n className={cn('space-y-2', className)}\n >\n <Skeleton shape=\"line\" className=\"h-3 w-1/4\" aria-hidden=\"true\" />\n <Skeleton shape=\"rect\" className={cn('w-full', inputClass)} aria-hidden=\"true\" />\n {withHelp && <Skeleton shape=\"line\" className=\"h-2.5 w-1/3\" aria-hidden=\"true\" />}\n </div>\n )\n}\nFormRowSkeleton.displayName = 'FormRowSkeleton'\n\nexport {\n Skeleton,\n MetricCardSkeleton,\n ChartSkeleton,\n TableSkeleton,\n TableRowSkeleton,\n CardSkeleton,\n AvatarTextSkeleton,\n FormRowSkeleton,\n}\n","'use client'\n\nimport * as React from 'react'\n\nimport { cn } from '@/lib/utils'\n\n/* -------------------------------------------------------------------------- */\n/* Table */\n/* -------------------------------------------------------------------------- */\n\ninterface TableProps extends React.ComponentProps<'table'> {\n /** Size variant affecting cell padding and font size */\n size?: 'sm' | 'md' | 'lg'\n /** Zebra-striped rows */\n striped?: boolean\n /** Bordered cells */\n bordered?: boolean\n /** Sticky header that stays visible when scrolling */\n stickyHeader?: boolean\n}\n\nfunction Table({\n className,\n size = 'md',\n striped = false,\n bordered = false,\n stickyHeader = false,\n ...props\n}: TableProps) {\n return (\n <div data-slot=\"table-container\" className=\"relative w-full overflow-x-auto\">\n <table\n data-slot=\"table\"\n data-size={size}\n data-striped={striped || undefined}\n data-bordered={bordered || undefined}\n data-sticky-header={stickyHeader || undefined}\n className={cn('w-full caption-bottom', className)}\n {...props}\n />\n </div>\n )\n}\n\n/* -------------------------------------------------------------------------- */\n/* TableHeader */\n/* -------------------------------------------------------------------------- */\n\nfunction TableHeader({ className, ...props }: React.ComponentProps<'thead'>) {\n return (\n <thead\n data-slot=\"table-header\"\n className={cn(\n // 1.1.16 — internal row dividers use --border-muted (subtle), same\n // rationale as Card. The page-level rule of thumb: borders that\n // separate sections of one surface should whisper, not shout.\n '[&_tr]:border-b [&_tr]:border-muted bg-surface-75',\n '[[data-sticky-header]_&]:sticky [[data-sticky-header]_&]:top-0 [[data-sticky-header]_&]:z-[9] [[data-sticky-header]_&]:bg-surface-75',\n className\n )}\n {...props}\n />\n )\n}\n\n/* -------------------------------------------------------------------------- */\n/* TableBody */\n/* -------------------------------------------------------------------------- */\n\nfunction TableBody({ className, ...props }: React.ComponentProps<'tbody'>) {\n return (\n <tbody\n data-slot=\"table-body\"\n className={cn(\n '[&_tr:last-child]:border-0',\n '[[data-striped]_&_tr:nth-child(even)]:bg-surface-75 [[data-striped]_&_tr:nth-child(even):hover]:bg-surface-200',\n className\n )}\n {...props}\n />\n )\n}\n\n/* -------------------------------------------------------------------------- */\n/* TableFooter */\n/* -------------------------------------------------------------------------- */\n\nfunction TableFooter({ className, ...props }: React.ComponentProps<'tfoot'>) {\n return (\n <tfoot\n data-slot=\"table-footer\"\n className={cn('bg-muted/50 border-t font-medium [&>tr]:last:border-b-0', className)}\n {...props}\n />\n )\n}\n\n/* -------------------------------------------------------------------------- */\n/* TableRow */\n/* -------------------------------------------------------------------------- */\n\nfunction TableRow({ className, ...props }: React.ComponentProps<'tr'>) {\n return (\n <tr\n data-slot=\"table-row\"\n // 1.1.16 — see TableHeader: row dividers use --border-muted so the\n // table reads as a continuous list, not a fence of bright lines.\n className={cn(\n 'hover:bg-surface-200 data-[state=selected]:bg-selection border-b border-muted transition-colors',\n className\n )}\n {...props}\n />\n )\n}\n\n/* -------------------------------------------------------------------------- */\n/* TableHead */\n/* -------------------------------------------------------------------------- */\n\ninterface TableHeadProps extends React.ComponentProps<'th'> {\n /** Sort direction — sets aria-sort on the <th> element */\n sortDirection?: 'asc' | 'desc' | 'none'\n}\n\nfunction TableHead({ className, sortDirection, ...props }: TableHeadProps) {\n const ariaSort =\n sortDirection === 'asc'\n ? 'ascending'\n : sortDirection === 'desc'\n ? 'descending'\n : sortDirection === 'none'\n ? 'none'\n : undefined\n\n return (\n <th\n data-slot=\"table-head\"\n aria-sort={ariaSort}\n className={cn(\n 'text-foreground-lighter text-start align-middle font-semibold whitespace-nowrap [&:has([role=checkbox])]:pe-0 [&>[role=checkbox]]:translate-y-[2px]',\n // Size variants (inherited from parent table)\n '[[data-size=sm]_&]:h-8 [[data-size=sm]_&]:px-2 [[data-size=sm]_&]:text-xs',\n '[[data-size=md]_&]:h-10 [[data-size=md]_&]:px-3 [[data-size=md]_&]:text-sm',\n '[[data-size=lg]_&]:h-12 [[data-size=lg]_&]:px-4 [[data-size=lg]_&]:text-base',\n // Bordered variant\n '[[data-bordered]_&]:border [[data-bordered]_&]:border-border',\n className\n )}\n {...props}\n />\n )\n}\n\n/* -------------------------------------------------------------------------- */\n/* TableCell */\n/* -------------------------------------------------------------------------- */\n\nfunction TableCell({ className, ...props }: React.ComponentProps<'td'>) {\n return (\n <td\n data-slot=\"table-cell\"\n className={cn(\n 'align-middle whitespace-nowrap [&:has([role=checkbox])]:pe-0 [&>[role=checkbox]]:translate-y-[2px]',\n // Size variants (inherited from parent table)\n '[[data-size=sm]_&]:px-2 [[data-size=sm]_&]:py-1.5 [[data-size=sm]_&]:text-xs',\n '[[data-size=md]_&]:px-3 [[data-size=md]_&]:py-2 [[data-size=md]_&]:text-sm',\n '[[data-size=lg]_&]:px-4 [[data-size=lg]_&]:py-3 [[data-size=lg]_&]:text-base',\n // Bordered variant\n '[[data-bordered]_&]:border [[data-bordered]_&]:border-border',\n className\n )}\n {...props}\n />\n )\n}\n\n/* -------------------------------------------------------------------------- */\n/* TableCaption */\n/* -------------------------------------------------------------------------- */\n\nfunction TableCaption({ className, ...props }: React.ComponentProps<'caption'>) {\n return (\n <caption data-slot=\"table-caption\" className={cn('text-foreground-muted mt-4 text-sm', className)} {...props} />\n )\n}\n\n/* -------------------------------------------------------------------------- */\n/* TableSortHeader — clickable sort indicator for table headers */\n/* -------------------------------------------------------------------------- */\n\ninterface TableSortHeaderProps extends React.ComponentProps<'button'> {\n /** Current sort direction */\n sorted?: 'asc' | 'desc' | false\n}\n\nfunction TableSortHeader({ className, children, sorted, ...props }: TableSortHeaderProps) {\n return (\n <button\n data-slot=\"table-sort-header\"\n className={cn(\n 'inline-flex items-center gap-1.5 cursor-pointer select-none hover:text-foreground transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1 rounded-sm',\n sorted && 'text-foreground',\n className\n )}\n {...props}\n >\n {children}\n <span className=\"inline-flex flex-col -space-y-0.5\">\n <svg\n width=\"8\"\n height=\"5\"\n viewBox=\"0 0 8 5\"\n className={cn('transition-colors', sorted === 'asc' ? 'text-foreground' : 'text-foreground-muted')}\n >\n <path d=\"M4 0L8 5H0L4 0Z\" fill=\"currentColor\" />\n </svg>\n <svg\n width=\"8\"\n height=\"5\"\n viewBox=\"0 0 8 5\"\n className={cn('transition-colors', sorted === 'desc' ? 'text-foreground' : 'text-foreground-muted')}\n >\n <path d=\"M4 5L0 0H8L4 5Z\" fill=\"currentColor\" />\n </svg>\n </span>\n </button>\n )\n}\n\nTable.displayName = 'Table'\nTableHeader.displayName = 'TableHeader'\nTableBody.displayName = 'TableBody'\nTableFooter.displayName = 'TableFooter'\nTableHead.displayName = 'TableHead'\nTableRow.displayName = 'TableRow'\nTableCell.displayName = 'TableCell'\nTableCaption.displayName = 'TableCaption'\nTableSortHeader.displayName = 'TableSortHeader'\n\nexport { Table, TableHeader, TableBody, TableFooter, TableHead, TableRow, TableCell, TableCaption, TableSortHeader }\n","/**\n * Standard size scale used across the design system.\n * Components should accept these values for their `size` prop.\n */\nexport type StandardSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n\n/** @deprecated Use `StandardSize` instead — legacy names have been removed */\nexport type LegacySize = StandardSize\n\n/** @deprecated Use `StandardSize` instead */\nexport type SizeWithLegacy = StandardSize\n\n/**\n * Normalizes a size value to standard names.\n * @deprecated All sizes are standard now — this function is a no-op passthrough.\n */\nexport function normalizeSize(size: StandardSize): StandardSize {\n return size\n}\n\nexport const SIZE = {\n text: {\n xs: 'text-xs',\n sm: 'text-sm leading-4',\n md: 'text-sm',\n lg: 'text-base',\n xl: 'text-base',\n },\n padding: {\n xs: 'px-2.5 py-1',\n sm: 'px-3 py-2',\n md: 'px-4 py-2',\n lg: 'px-4 py-2',\n xl: 'px-6 py-3',\n },\n height: {\n xs: 'h-[26px]',\n sm: 'h-[34px]',\n md: 'h-[38px]',\n lg: 'h-[42px]',\n xl: 'h-[50px]',\n },\n}\n\n/** Inner sizes for nested elements (badges inside buttons, multi-select items, etc.) */\nexport const SIZE_INNER = {\n text: {\n xs: 'text-xs',\n sm: 'text-sm leading-4',\n md: 'text-sm',\n lg: 'text-base',\n xl: 'text-base',\n },\n padding: {\n xs: 'px-2.5 py-1',\n sm: 'px-3 py-2',\n md: 'px-4 py-2',\n lg: 'px-4 py-2',\n xl: 'px-6 py-3',\n },\n height: {\n xs: 'h-[24px]',\n sm: 'h-[28px]',\n md: 'h-[32px]',\n lg: 'h-[36px]',\n xl: 'h-[44px]',\n },\n}\n\nexport const SIZE_VARIANTS = {\n xs: `${SIZE.text['xs']} ${SIZE.padding['xs']} ${SIZE.height['xs']}`,\n sm: `${SIZE.text['sm']} ${SIZE.padding['sm']} ${SIZE.height['sm']}`,\n md: `${SIZE.text['md']} ${SIZE.padding['md']} ${SIZE.height['md']}`,\n lg: `${SIZE.text['lg']} ${SIZE.padding['lg']} ${SIZE.height['lg']}`,\n xl: `${SIZE.text['xl']} ${SIZE.padding['xl']} ${SIZE.height['xl']}`,\n}\n\nexport const SIZE_VARIANTS_INNER = {\n xs: `${SIZE.text['xs']} ${SIZE.padding['xs']} ${SIZE_INNER.height['xs']}`,\n sm: `${SIZE.text['sm']} ${SIZE.padding['sm']} ${SIZE_INNER.height['sm']}`,\n md: `${SIZE.text['md']} ${SIZE.padding['md']} ${SIZE_INNER.height['md']}`,\n lg: `${SIZE.text['lg']} ${SIZE.padding['lg']} ${SIZE_INNER.height['lg']}`,\n xl: `${SIZE.text['xl']} ${SIZE.padding['xl']} ${SIZE_INNER.height['xl']}`,\n}\n\n/** @deprecated Use 'sm' instead */\nexport const SIZE_VARIANTS_DEFAULT = 'sm'\n","'use client'\n\nimport { Slot } from '@radix-ui/react-slot'\nimport { VariantProps, cva } from 'class-variance-authority'\nimport { Loader2 } from 'lucide-react'\nimport { cloneElement, forwardRef, isValidElement } from 'react'\nimport { SIZE_VARIANTS, type StandardSize } from '@/lib/constants'\nimport { cn } from '@/lib/utils'\n\nexport type ButtonVariantProps = VariantProps<typeof buttonVariants>\n\nconst DESTRUCTIVE_VARIANT = `\n text-foreground\n bg-destructive-300 dark:bg-destructive-400 hover:bg-destructive-400 dark:hover:bg-destructive-400/80\n border-destructive-500 hover:border-destructive\n hover:text-hi-contrast\n data-[state=open]:border-destructive\n data-[state=open]:bg-destructive-400 dark:data-[state=open]:bg-destructive-600/80\n`\n\nconst buttonVariants = cva(\n `inline-flex items-center justify-center\n relative\n cursor-pointer\n gap-2\n text-center\n font-normal\n ease-out\n duration-200\n rounded-md\n outline-none\n transition-all\n active:scale-[0.98]\n focus-visible:ring-2\n focus-visible:ring-ring\n focus-visible:ring-offset-2\n border\n disabled:pointer-events-none\n disabled:opacity-50\n [&_svg]:pointer-events-none\n [&_svg]:shrink-0\n `,\n {\n variants: {\n variant: {\n primary: `\n bg-brand-400 dark:bg-brand-500\n hover:bg-brand-300 dark:hover:bg-brand-500/80\n text-foreground\n border-brand-500/75 dark:border-brand/30\n hover:border-brand-600 dark:hover:border-brand-500\n data-[state=open]:bg-brand-400/80 dark:data-[state=open]:bg-brand-600/80\n `,\n default: `\n text-foreground\n bg-alternative dark:bg-muted hover:bg-selection\n border-strong hover:border-stronger\n data-[state=open]:bg-selection\n data-[state=open]:border-button-hover\n `,\n secondary: `\n bg-foreground\n text-background hover:text-border-stronger\n focus-visible:text-border-control\n border-foreground-light hover:border-foreground-lighter\n data-[state=open]:border-foreground-lighter\n `,\n outline: `\n text-foreground\n bg-transparent\n border-strong hover:border-foreground-muted\n data-[state=open]:border-stronger\n `,\n dashed: `\n text-foreground\n border\n border-dashed\n border-strong hover:border-stronger\n bg-transparent\n data-[state=open]:border-stronger\n `,\n link: `\n text-brand-600\n border\n border-transparent\n bg-transparent\n hover:bg-brand-400\n shadow-none\n data-[state=open]:bg-brand-400\n `,\n text: `\n text-foreground\n hover:bg-surface-300\n shadow-none\n data-[state=open]:bg-surface-300\n border-transparent\n `,\n danger: DESTRUCTIVE_VARIANT,\n warning: `\n text-foreground\n bg-warning-300 dark:bg-warning-400 hover:bg-warning-400 dark:hover:bg-warning-400/80\n border-warning-500 hover:border-warning\n hover:text-hi-contrast\n data-[state=open]:border-warning\n data-[state=open]:bg-warning-400 dark:data-[state=open]:bg-warning-600/80\n `,\n destructive: DESTRUCTIVE_VARIANT,\n ghost: `\n text-foreground\n hover:bg-surface-100 dark:hover:bg-surface-200\n border-transparent\n `,\n },\n block: {\n true: 'w-full flex items-center justify-center',\n },\n size: {\n ...SIZE_VARIANTS,\n default: SIZE_VARIANTS.sm,\n icon: 'size-9',\n // Compact icon-only button (24×24). Useful for dense rows in tables\n // and toolbars. Pair with a 14px lucide icon for a balanced look.\n 'icon-xs': 'size-6',\n 'icon-sm': 'size-7',\n 'icon-lg': 'size-10',\n },\n disabled: {\n true: 'opacity-50 cursor-not-allowed pointer-events-none',\n },\n rounded: {\n true: 'rounded-full',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'sm',\n },\n }\n)\n\nconst IconContainerVariants = cva('inline-flex items-center justify-center', {\n variants: {\n size: {\n xs: '[&_svg]:size-[14px]',\n sm: '[&_svg]:size-[18px]',\n md: '[&_svg]:size-[20px]',\n lg: '[&_svg]:size-[20px]',\n xl: '[&_svg]:size-[24px]',\n /** @deprecated */ tiny: '[&_svg]:size-[14px]',\n /** @deprecated */ small: '[&_svg]:size-[18px]',\n /** @deprecated */ medium: '[&_svg]:size-[20px]',\n /** @deprecated */ large: '[&_svg]:size-[20px]',\n /** @deprecated */ xlarge: '[&_svg]:size-[24px]',\n default: '[&_svg]:size-[18px]',\n icon: '[&_svg]:size-[18px]',\n },\n variant: {\n primary: 'text-brand-600',\n default: 'text-foreground-lighter',\n secondary: 'text-border-muted',\n outline: 'text-foreground-lighter',\n dashed: 'text-foreground-lighter',\n link: 'text-brand-600',\n text: 'text-foreground-lighter',\n danger: 'text-destructive-600',\n warning: 'text-warning',\n destructive: 'text-destructive-600',\n ghost: 'text-foreground-lighter',\n },\n },\n})\n\nexport type LoadingVariantProps = VariantProps<typeof loadingVariants>\nconst loadingVariants = cva('', {\n variants: {\n variant: {\n primary: 'text-brand-600',\n default: 'text-foreground-lighter',\n secondary: 'text-border-muted',\n outline: 'text-foreground-lighter',\n dashed: 'text-foreground-lighter',\n link: 'text-brand-600',\n text: 'text-foreground-muted',\n danger: 'text-destructive-600',\n warning: 'text-warning',\n destructive: 'text-destructive-600',\n ghost: 'text-foreground-lighter',\n },\n loading: {\n default: '',\n true: `animate-spin`,\n },\n },\n})\n\nexport interface ButtonProps\n extends\n Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'type'>,\n Omit<ButtonVariantProps, 'disabled'>,\n Omit<LoadingVariantProps, 'variant'> {\n asChild?: boolean\n type?: ButtonVariantProps['variant'] | React.ButtonHTMLAttributes<HTMLButtonElement>['type']\n htmlType?: React.ButtonHTMLAttributes<HTMLButtonElement>['type']\n icon?: React.ReactNode\n iconStart?: React.ReactNode\n iconEnd?: React.ReactNode\n /** @deprecated Use iconStart instead */\n iconLeft?: React.ReactNode\n /** @deprecated Use iconEnd instead */\n iconRight?: React.ReactNode\n isLoading?: boolean\n /** @deprecated Use `isLoading` instead */\n loading?: boolean\n block?: boolean\n rounded?: boolean\n}\n\nconst Button = forwardRef<HTMLButtonElement, ButtonProps>(\n (\n {\n asChild = false,\n variant,\n type,\n size = 'sm',\n children,\n isLoading,\n loading,\n block,\n icon,\n iconEnd,\n iconStart,\n iconRight,\n iconLeft,\n htmlType = 'button',\n rounded,\n className,\n ...props\n },\n ref\n ) => {\n if (process.env.NODE_ENV !== 'production') {\n const deprecatedSizes = ['tiny', 'small', 'medium', 'large', 'xlarge']\n if (size && deprecatedSizes.includes(size as string)) {\n console.warn(`[Parto UI] Button: size=\"${size}\" is deprecated. Use xs|sm|md|lg|xl instead.`)\n }\n }\n\n const Comp = asChild ? Slot : 'button'\n const { tabIndex } = props\n\n // Support both 'type' (Supabase style) and 'variant' (shadcn style)\n // If type is provided and it's not a button HTML type, use it as variant\n const buttonVariant =\n type && typeof type === 'string' && !['button', 'submit', 'reset'].includes(type)\n ? (type as ButtonVariantProps['variant'])\n : variant || 'default'\n\n const _loading = isLoading ?? loading\n // Support deprecated iconLeft/iconRight alongside new iconStart/iconEnd\n const resolvedIconStart = icon ?? iconStart ?? iconLeft\n const resolvedIconEnd = iconEnd ?? iconRight\n const showIcon = _loading || resolvedIconStart\n const disabled = _loading === true || props.disabled\n\n // Set default tabIndex for proper Safari focus handling\n // - Explicit tabIndex prop takes precedence\n // - If disabled, default to -1 (unless explicitly set)\n // - Otherwise, default to 0 for keyboard accessibility\n const computedTabIndex = tabIndex !== undefined ? tabIndex : disabled ? -1 : 0\n\n // Normalize size for IconContainerVariants. Icon-only Button variants\n // (\"icon\", \"icon-xs\", \"icon-sm\", \"icon-lg\") share the same SVG sizing\n // family — IconContainerVariants doesn't have those keys, so we collapse\n // each to the closest standard size for icon scaling.\n const iconSize: StandardSize | 'default' | 'icon' =\n size === 'default'\n ? 'sm'\n : size === 'icon' || size === 'icon-sm'\n ? 'sm'\n : size === 'icon-xs'\n ? 'xs'\n : size === 'icon-lg'\n ? 'lg'\n : (size ?? 'sm')\n\n return (\n <Comp\n ref={ref}\n data-slot=\"button\"\n data-size={size}\n type={htmlType}\n disabled={disabled}\n aria-busy={_loading || undefined}\n tabIndex={computedTabIndex}\n className={cn(buttonVariants({ variant: buttonVariant, size, disabled, block, rounded }), className)}\n onClick={(e) => {\n // Prevents redirecting if Button is used with a link-based child element\n if (disabled) return e.preventDefault()\n else props?.onClick?.(e)\n }}\n {...props}\n >\n {asChild ? (\n isValidElement(children) ? (\n cloneElement(\n children,\n undefined,\n showIcon &&\n (_loading ? (\n <div className={cn(IconContainerVariants({ size: iconSize, variant: buttonVariant }))}>\n <Loader2 className={cn(loadingVariants({ loading: _loading, variant: buttonVariant }))} />\n </div>\n ) : resolvedIconStart ? (\n <div className={cn(IconContainerVariants({ size: iconSize, variant: buttonVariant }))}>\n {resolvedIconStart}\n </div>\n ) : null),\n (children.props as { children?: React.ReactNode })?.children && (\n <span className=\"inline-flex items-center gap-2 truncate\">\n {(children.props as { children?: React.ReactNode }).children}\n </span>\n ),\n resolvedIconEnd && !_loading && (\n <div className={cn(IconContainerVariants({ size: iconSize, variant: buttonVariant }))}>\n {resolvedIconEnd}\n </div>\n )\n )\n ) : null\n ) : (\n <>\n {showIcon &&\n (_loading ? (\n <div className={cn(IconContainerVariants({ size: iconSize, variant: buttonVariant }))}>\n <Loader2\n aria-hidden=\"true\"\n className={cn(loadingVariants({ loading: _loading, variant: buttonVariant }))}\n />\n <span className=\"sr-only\">در حال بارگذاری...</span>\n </div>\n ) : resolvedIconStart ? (\n <div className={cn(IconContainerVariants({ size: iconSize, variant: buttonVariant }))}>\n {resolvedIconStart}\n </div>\n ) : null)}\n {children && <span className=\"inline-flex items-center gap-2 truncate\">{children}</span>}\n {resolvedIconEnd && !_loading && (\n <div className={cn(IconContainerVariants({ size: iconSize, variant: buttonVariant }))}>\n {resolvedIconEnd}\n </div>\n )}\n </>\n )}\n </Comp>\n )\n }\n)\n\nButton.displayName = 'Button'\n\nexport { Button, buttonVariants }\n","'use client'\n\nimport * as React from 'react'\nimport { ChevronLeftIcon, ChevronRightIcon, MoreHorizontalIcon } from 'lucide-react'\n\nimport { cn } from '@/lib/utils'\nimport { getUIStrings } from '@/lib/i18n'\nimport { Button, buttonVariants } from './button'\n\ntype Direction = 'ltr' | 'rtl'\n\nconst PaginationDirectionContext = React.createContext<Direction>('rtl')\n\nfunction usePaginationDirection() {\n return React.useContext(PaginationDirectionContext)\n}\n\nfunction Pagination({ className, dir, children, ...props }: React.ComponentProps<'nav'>) {\n const resolvedDir = (dir as Direction) ?? 'rtl'\n\n return (\n <PaginationDirectionContext.Provider value={resolvedDir}>\n <nav\n role=\"navigation\"\n aria-label=\"pagination\"\n data-slot=\"pagination\"\n dir={resolvedDir}\n className={cn('mx-auto flex w-full justify-center not-prose', className)}\n {...props}\n >\n {children}\n </nav>\n </PaginationDirectionContext.Provider>\n )\n}\n\nfunction PaginationContent({ className, ...props }: React.ComponentProps<'ul'>) {\n const dir = usePaginationDirection()\n\n return (\n <ul\n data-slot=\"pagination-content\"\n dir={dir}\n className={cn('flex flex-row items-center gap-1 list-none', className)}\n {...props}\n />\n )\n}\n\nfunction PaginationItem({ ...props }: React.ComponentProps<'li'>) {\n return <li data-slot=\"pagination-item\" {...props} />\n}\n\ntype PaginationLinkProps = {\n isActive?: boolean\n} & Pick<React.ComponentProps<typeof Button>, 'size'> &\n React.ComponentProps<'a'>\n\nfunction PaginationLink({ className, isActive, size = 'icon', dir, ...props }: PaginationLinkProps) {\n const contextDir = usePaginationDirection()\n const linkDir = dir ?? (contextDir === 'rtl' ? 'rtl' : 'ltr')\n\n return (\n <a\n aria-current={isActive ? 'page' : undefined}\n data-slot=\"pagination-link\"\n data-active={isActive}\n dir={linkDir}\n className={cn(\n buttonVariants({\n variant: 'outline',\n size,\n }),\n // Remove underline from links\n 'no-underline',\n // Active state styling with green color\n isActive && [\n 'border-brand-500 bg-brand/10 text-brand-600',\n 'dark:border-brand-600 dark:bg-brand/10 dark:text-brand-400',\n 'pointer-events-none',\n ],\n className\n )}\n {...props}\n />\n )\n}\n\nfunction PaginationPrevious({ className, ...props }: React.ComponentProps<typeof PaginationLink>) {\n const dir = usePaginationDirection()\n const isRTL = dir === 'rtl'\n const strings = getUIStrings(isRTL ? 'fa' : 'en')\n // PaginationLink hardcodes dir=\"ltr\" (page numbers like \"1 2 3 ... 10\" read LTR even\n // in Persian UI). That neutralizes Tailwind's `rtl:` variants, so we have to swap the\n // icon based on the JS-level pagination direction instead of CSS direction.\n const Icon = isRTL ? ChevronRightIcon : ChevronLeftIcon\n\n return (\n <PaginationLink\n aria-label={strings.goToPreviousPage}\n size=\"default\"\n className={cn('gap-1 ps-2.5 pe-2.5 no-underline flex items-center', className)}\n dir=\"ltr\"\n {...props}\n >\n <Icon className=\"size-4\" />\n <span className=\"hidden sm:inline no-underline\">{strings.previous}</span>\n </PaginationLink>\n )\n}\n\nfunction PaginationNext({ className, ...props }: React.ComponentProps<typeof PaginationLink>) {\n const dir = usePaginationDirection()\n const isRTL = dir === 'rtl'\n const strings = getUIStrings(isRTL ? 'fa' : 'en')\n // See PaginationPrevious — same reason for JS-level conditional rather than rtl: class.\n const Icon = isRTL ? ChevronLeftIcon : ChevronRightIcon\n\n return (\n <PaginationLink\n aria-label={strings.goToNextPage}\n size=\"default\"\n className={cn('gap-1 ps-2.5 pe-2.5 no-underline flex items-center', className)}\n dir=\"ltr\"\n {...props}\n >\n {isRTL ? (\n <>\n <Icon className=\"size-4\" />\n <span className=\"hidden sm:inline no-underline\">{strings.next}</span>\n </>\n ) : (\n <>\n <span className=\"hidden sm:inline no-underline\">{strings.next}</span>\n <Icon className=\"size-4\" />\n </>\n )}\n </PaginationLink>\n )\n}\n\nfunction PaginationEllipsis({ className, ...props }: React.ComponentProps<'span'>) {\n return (\n <span\n aria-hidden\n data-slot=\"pagination-ellipsis\"\n className={cn('flex size-9 items-center justify-center', className)}\n {...props}\n >\n <MoreHorizontalIcon className=\"size-4\" />\n <span className=\"sr-only\">More pages</span>\n </span>\n )\n}\n\nPagination.displayName = 'Pagination'\nPaginationContent.displayName = 'PaginationContent'\nPaginationItem.displayName = 'PaginationItem'\nPaginationLink.displayName = 'PaginationLink'\nPaginationPrevious.displayName = 'PaginationPrevious'\nPaginationNext.displayName = 'PaginationNext'\nPaginationEllipsis.displayName = 'PaginationEllipsis'\n\nexport {\n Pagination,\n PaginationContent,\n PaginationLink,\n PaginationItem,\n PaginationPrevious,\n PaginationNext,\n PaginationEllipsis,\n}\n","'use client'\n\nimport * as React from 'react'\nimport { cn, convertToLocalNumbers, type SupportedLocale } from '@/lib/utils'\nimport {\n Pagination,\n PaginationContent,\n PaginationEllipsis,\n PaginationItem,\n PaginationLink,\n PaginationNext,\n PaginationPrevious,\n} from './pagination'\n\nexport interface PaginationControlledProps {\n /**\n * شماره صفحه فعلی (شروع از 1)\n */\n currentPage: number\n /**\n * تعداد کل صفحات\n */\n totalPages: number\n /**\n * تابع callback برای تغییر صفحه\n */\n onPageChange: (page: number) => void\n /**\n * تعداد صفحات نمایش داده شده در هر طرف صفحه فعلی\n * @default 1\n */\n siblingCount?: number\n /**\n * نمایش دکمههای اول و آخر\n * @default false\n */\n showFirstLast?: boolean\n /**\n * نمایش دکمههای قبلی و بعدی\n * @default true\n */\n showPrevNext?: boolean\n /**\n * نمایش ellipsis برای صفحات مخفی\n * @default true\n */\n showEllipsis?: boolean\n /**\n * کلاسهای اضافی\n */\n className?: string\n /**\n * زبان برای تبدیل اعداد و جهت متن\n * @default \"fa\"\n */\n locale?: SupportedLocale\n}\n\n/**\n * کامپوننت صفحهبندی با props استاندارد\n *\n * @example\n * ```tsx\n * <PaginationControlled\n * currentPage={2}\n * totalPages={10}\n * onPageChange={(page) => console.log(page)}\n * />\n * ```\n */\nconst PaginationControlled = React.forwardRef<HTMLElement, PaginationControlledProps>(\n (\n {\n currentPage,\n totalPages,\n onPageChange,\n siblingCount = 1,\n showFirstLast = false,\n showPrevNext = true,\n showEllipsis = true,\n className,\n locale = 'fa',\n },\n ref\n ) => {\n const isRTL = locale === 'fa' || locale === 'ar'\n const localizeNumber = (n: number) => convertToLocalNumbers(String(n), locale)\n\n const handlePageChange = (page: number) => {\n if (page >= 1 && page <= totalPages && page !== currentPage) {\n onPageChange(page)\n }\n }\n\n const generatePageNumbers = () => {\n const pages: (number | 'ellipsis')[] = []\n const totalNumbers = siblingCount * 2 + 5 // siblingCount on each side + current + first + last + 2 ellipsis\n const totalBlocks = totalNumbers + 2 // +2 for first and last\n\n if (totalPages <= totalBlocks) {\n // Show all pages if total pages is less than or equal to total blocks\n for (let i = 1; i <= totalPages; i++) {\n pages.push(i)\n }\n } else {\n const leftSiblingIndex = Math.max(currentPage - siblingCount, 1)\n const rightSiblingIndex = Math.min(currentPage + siblingCount, totalPages)\n\n const shouldShowLeftEllipsis = leftSiblingIndex > 2\n const shouldShowRightEllipsis = rightSiblingIndex < totalPages - 1\n\n if (!shouldShowLeftEllipsis && shouldShowRightEllipsis) {\n const leftItemCount = 3 + 2 * siblingCount\n const leftRange: number[] = []\n for (let i = 1; i <= leftItemCount; i++) {\n leftRange.push(i)\n }\n pages.push(...leftRange)\n if (showEllipsis) pages.push('ellipsis')\n pages.push(totalPages)\n } else if (shouldShowLeftEllipsis && !shouldShowRightEllipsis) {\n pages.push(1)\n if (showEllipsis) pages.push('ellipsis')\n const rightItemCount = 3 + 2 * siblingCount\n const rightRange: number[] = []\n for (let i = totalPages - rightItemCount + 1; i <= totalPages; i++) {\n rightRange.push(i)\n }\n pages.push(...rightRange)\n } else if (shouldShowLeftEllipsis && shouldShowRightEllipsis) {\n pages.push(1)\n if (showEllipsis) pages.push('ellipsis')\n for (let i = leftSiblingIndex; i <= rightSiblingIndex; i++) {\n pages.push(i)\n }\n if (showEllipsis) pages.push('ellipsis')\n pages.push(totalPages)\n }\n }\n\n return pages\n }\n\n const pageNumbers = generatePageNumbers()\n\n // Don't show first/last if they're already in pageNumbers\n const showFirstButton = showFirstLast && !pageNumbers.includes(1) && currentPage > 1\n const showLastButton = showFirstLast && !pageNumbers.includes(totalPages) && currentPage < totalPages\n\n return (\n <Pagination ref={ref} data-slot=\"pagination-controlled\" className={cn(className)} dir={isRTL ? 'rtl' : 'ltr'}>\n <PaginationContent>\n {showFirstButton && (\n <PaginationItem>\n <PaginationLink\n href=\"#\"\n onClick={(e) => {\n e.preventDefault()\n handlePageChange(1)\n }}\n >\n {localizeNumber(1)}\n </PaginationLink>\n </PaginationItem>\n )}\n\n {showPrevNext && (\n <PaginationItem>\n <PaginationPrevious\n href=\"#\"\n onClick={(e) => {\n e.preventDefault()\n handlePageChange(currentPage - 1)\n }}\n className={currentPage === 1 ? 'pointer-events-none opacity-50' : ''}\n />\n </PaginationItem>\n )}\n\n {pageNumbers.map((page, index) => {\n if (page === 'ellipsis') {\n return (\n <PaginationItem key={`ellipsis-${index}`}>\n <PaginationEllipsis />\n </PaginationItem>\n )\n }\n\n return (\n <PaginationItem key={page}>\n <PaginationLink\n href=\"#\"\n isActive={page === currentPage}\n onClick={(e) => {\n e.preventDefault()\n handlePageChange(page)\n }}\n >\n {localizeNumber(page)}\n </PaginationLink>\n </PaginationItem>\n )\n })}\n\n {showPrevNext && (\n <PaginationItem>\n <PaginationNext\n href=\"#\"\n onClick={(e) => {\n e.preventDefault()\n handlePageChange(currentPage + 1)\n }}\n className={currentPage === totalPages ? 'pointer-events-none opacity-50' : ''}\n />\n </PaginationItem>\n )}\n\n {showLastButton && (\n <PaginationItem>\n <PaginationLink\n href=\"#\"\n onClick={(e) => {\n e.preventDefault()\n handlePageChange(totalPages)\n }}\n >\n {localizeNumber(totalPages)}\n </PaginationLink>\n </PaginationItem>\n )}\n </PaginationContent>\n </Pagination>\n )\n }\n)\n\nPaginationControlled.displayName = 'PaginationControlled'\n\nexport { PaginationControlled }\n","'use client'\n\nimport * as React from 'react'\n\nexport interface UseInfiniteScrollOptions {\n /** Called when the sentinel enters the viewport */\n onLoadMore: () => void\n /** Whether there are more items to load */\n hasMore: boolean\n /** Whether a load is currently in progress (prevents double-firing) */\n isLoading?: boolean\n /** IntersectionObserver rootMargin @default \"200px\" */\n rootMargin?: string\n /** IntersectionObserver threshold @default 0 */\n threshold?: number\n}\n\nexport interface UseInfiniteScrollReturn {\n /** Ref to attach to the sentinel element at the bottom of the list */\n sentinelRef: React.RefCallback<HTMLElement>\n}\n\n/**\n * Hook for infinite scroll using IntersectionObserver.\n *\n * Attach `sentinelRef` to an empty element at the bottom of your list.\n * When it enters the viewport, `onLoadMore` is called (unless `isLoading` or `!hasMore`).\n *\n * @example\n * ```tsx\n * const { sentinelRef } = useInfiniteScroll({\n * onLoadMore: () => fetchNextPage(),\n * hasMore: data.hasNextPage,\n * isLoading: isFetchingNextPage,\n * })\n *\n * return (\n * <div>\n * {items.map(item => <Card key={item.id} {...item} />)}\n * <div ref={sentinelRef} />\n * </div>\n * )\n * ```\n */\nexport function useInfiniteScroll({\n onLoadMore,\n hasMore,\n isLoading = false,\n rootMargin = '200px',\n threshold = 0,\n}: UseInfiniteScrollOptions): UseInfiniteScrollReturn {\n const observerRef = React.useRef<IntersectionObserver | null>(null)\n\n // Keep callbacks fresh without re-creating observer\n const callbackRef = React.useRef(onLoadMore)\n React.useEffect(() => {\n callbackRef.current = onLoadMore\n }, [onLoadMore])\n\n const hasMoreRef = React.useRef(hasMore)\n React.useEffect(() => {\n hasMoreRef.current = hasMore\n }, [hasMore])\n\n const isLoadingRef = React.useRef(isLoading)\n React.useEffect(() => {\n isLoadingRef.current = isLoading\n }, [isLoading])\n\n const sentinelRef = React.useCallback(\n (node: HTMLElement | null) => {\n // Disconnect previous observer\n if (observerRef.current) {\n observerRef.current.disconnect()\n observerRef.current = null\n }\n\n if (!node) return\n\n observerRef.current = new IntersectionObserver(\n (entries) => {\n const entry = entries[0]\n if (entry?.isIntersecting && hasMoreRef.current && !isLoadingRef.current) {\n callbackRef.current()\n }\n },\n { rootMargin, threshold }\n )\n\n observerRef.current.observe(node)\n },\n [rootMargin, threshold]\n )\n\n // Cleanup on unmount\n React.useEffect(() => {\n return () => {\n observerRef.current?.disconnect()\n }\n }, [])\n\n return { sentinelRef }\n}\n","'use client'\n\nimport * as React from 'react'\nimport { Loader2 } from 'lucide-react'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { cn } from '@/lib/utils'\n\nconst spinnerVariants = cva('animate-spin text-muted-foreground', {\n variants: {\n size: {\n xs: 'size-3',\n sm: 'size-4',\n md: 'size-5',\n lg: 'size-6',\n xl: 'size-8',\n },\n },\n defaultVariants: {\n size: 'sm',\n },\n})\n\nexport interface SpinnerProps extends React.HTMLAttributes<HTMLSpanElement>, VariantProps<typeof spinnerVariants> {}\n\nconst Spinner = React.forwardRef<HTMLSpanElement, SpinnerProps>(({ className, size, ...props }, ref) => (\n <span\n ref={ref}\n data-slot=\"spinner\"\n role=\"status\"\n aria-label=\"در حال بارگذاری...\"\n className={cn('inline-flex items-center justify-center', className)}\n {...props}\n >\n <Loader2 className={spinnerVariants({ size })} aria-hidden=\"true\" />\n </span>\n))\nSpinner.displayName = 'Spinner'\n\nexport { Spinner, spinnerVariants }\n","'use client'\n\nimport * as React from 'react'\nimport { ChevronDown, ChevronRight } from 'lucide-react'\nimport { cn, type SupportedLocale } from '@/lib/utils'\nimport { getUIStrings, isRTL } from '@/lib/i18n'\nimport { Checkbox } from '@/components/ui/checkbox'\nimport { Skeleton } from '@/components/ui/skeleton'\nimport { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, TableSortHeader } from '@/components/ui/table'\nimport { PaginationControlled } from '@/components/ui/pagination-controlled'\nimport { useInfiniteScroll } from '@/hooks/use-infinite-scroll'\nimport { Spinner } from '@/components/ui/spinner'\n\n/* -------------------------------------------------------------------------- */\n/* Types */\n/* -------------------------------------------------------------------------- */\n\nexport type SortDirection = 'asc' | 'desc'\n\n/** A single sort rule. In multi-sort mode, rules are ordered by priority. */\nexport interface SortRule {\n column: string\n direction: SortDirection\n}\n\nexport interface DataTableColumn<TData> {\n /** Unique key identifying the column — used for sort callbacks */\n id: string\n /** Column header label */\n header: React.ReactNode\n /** Render function for cell content */\n cell: (row: TData, rowIndex: number) => React.ReactNode\n /** Whether this column is sortable */\n sortable?: boolean\n /**\n * Render function for the footer cell (e.g. column total, average). When\n * defined for any column and `footer` is true on the table, a sticky\n * `<tfoot>` row is rendered.\n */\n footer?: () => React.ReactNode\n /** Additional className for both <th> and <td> */\n className?: string\n /** Column alignment */\n align?: 'start' | 'center' | 'end'\n /**\n * Pin the column to the start (logical, RTL-aware) or end of the visible\n * area. Pinned columns stay visible while horizontal scrolling. The\n * selection / expansion gutter columns are pinned automatically.\n */\n pinned?: 'start' | 'end'\n /** Optional fixed pixel width (used for pinning offset calculation) */\n width?: number\n /** Allow the user to drag the start/end edge of this column to resize it. */\n resizable?: boolean\n /** Min width when resizing (px). Default 60. */\n minWidth?: number\n /** Max width when resizing (px). Default 800. */\n maxWidth?: number\n /** When false, this column is hidden via the columnVisibility map */\n defaultVisible?: boolean\n}\n\nexport interface DataTableColumnVisibility {\n /** Map of column id → visible. Missing keys default to true. */\n visible: Record<string, boolean>\n /** Called when a column toggle changes. */\n onVisibilityChange: (next: Record<string, boolean>) => void\n}\n\nexport interface DataTableExpansion<TData> {\n /** Set of expanded row keys. */\n expandedRows: Set<number>\n /** Called when expansion toggles. */\n onExpandedRowsChange: (next: Set<number>) => void\n /** Render function for the expanded content (full-width row below). */\n renderExpandedRow: (row: TData, rowIndex: number) => React.ReactNode\n}\n\nexport interface DataTablePagination {\n currentPage: number\n totalPages: number\n onPageChange: (page: number) => void\n}\n\nexport interface DataTableSort {\n column: string | null\n direction: SortDirection | null\n onSort: (column: string, direction: SortDirection) => void\n}\n\n/**\n * Multi-column sort configuration. When supplied, takes precedence over the\n * single-column `sort` prop. Headers display a priority badge (۱، ۲، ۳…) and\n * Shift-click on a header toggles its rule without disturbing the others.\n * A bare click resets the active rules to a single column.\n */\nexport interface DataTableMultiSort {\n /** Active rules in priority order — first is the primary sort. */\n rules: SortRule[]\n onSortChange: (next: SortRule[]) => void\n /** Maximum rules allowed at once. @default 3 */\n maxRules?: number\n}\n\nexport interface DataTableSelection<TData> {\n selectedRows: Set<number>\n onSelectionChange: (selectedRows: Set<number>) => void\n /** Function to get a unique key for each row (defaults to index) */\n getRowKey?: (row: TData, index: number) => number\n}\n\nexport interface DataTableProps<TData> {\n /** Column definitions */\n columns: DataTableColumn<TData>[]\n /** Data rows */\n data: TData[]\n /** Table size variant */\n size?: 'sm' | 'md' | 'lg'\n /** Show loading skeleton */\n isLoading?: boolean\n /** Number of skeleton rows to show when loading */\n loadingRows?: number\n /** Content to show when data is empty (not loading) */\n emptyState?: React.ReactNode\n /** Pagination configuration */\n pagination?: DataTablePagination\n /** Sort configuration (single-column). Ignored when `multiSort` is set. */\n sort?: DataTableSort\n /** Multi-column sort configuration (Shift-click to add rules). */\n multiSort?: DataTableMultiSort\n /**\n * When a column has a `footer` render fn, render a sticky `<tfoot>` row.\n * Useful for column totals/averages.\n */\n footer?: boolean\n /** Stick the `<tfoot>` to the bottom of the scroll container. @default true when footer enabled */\n stickyFooter?: boolean\n /**\n * Fired with `(columnId, newWidth)` when the user finishes resizing a\n * column. Persist this on the consumer side and feed it back via\n * `column.width` for state to survive remounts.\n */\n onColumnResize?: (columnId: string, width: number) => void\n /** Row selection configuration */\n selection?: DataTableSelection<TData>\n /** Column visibility configuration (for show/hide column toggle) */\n columnVisibility?: DataTableColumnVisibility\n /** Expansion configuration (for inline detail row) */\n expansion?: DataTableExpansion<TData>\n /**\n * Infinite-scroll mode. The sentinel rendered after the last row triggers\n * `onLoadMore` when it enters the viewport. Pair with paged data\n * fetching: append the new rows to `data` on the consumer side. Not\n * compatible with `virtualize` (use one or the other).\n */\n infiniteScroll?: {\n onLoadMore: () => void\n /** When false, the sentinel is removed and no further loads fire. */\n hasMore: boolean\n /** Show a loading indicator in the sentinel row. */\n isLoadingMore?: boolean\n /** IntersectionObserver rootMargin. @default '200px' */\n rootMargin?: string\n /** Custom node to render in the sentinel while loading. */\n loadingMoreContent?: React.ReactNode\n /** Custom node to render when there are no more rows to load. */\n endContent?: React.ReactNode\n }\n /**\n * Opt-in row virtualization for very long lists (1000+ rows). When set,\n * the table is wrapped in a scroll container of `viewportHeight` and only\n * rows in the visible window + `overscan` are rendered. Rows must have a\n * predictable `rowHeight`; expanded rows + dynamic content are NOT\n * supported in virtualized mode.\n */\n virtualize?: {\n /** Pixel height of each row (must be uniform). */\n rowHeight: number\n /** Container scroll-area height in px. @default 480 */\n viewportHeight?: number\n /** Extra rows rendered above and below the viewport. @default 6 */\n overscan?: number\n }\n /** Zebra-striped rows */\n striped?: boolean\n /** Bordered cells */\n bordered?: boolean\n /** Sticky header */\n stickyHeader?: boolean\n /** Additional className for the root wrapper */\n className?: string\n /** Caption text below the table */\n caption?: string\n /** Total result count shown above table (e.g. \"۲۴ نتیجه\") */\n resultCount?: React.ReactNode\n /** Locale for UI strings @default 'fa' */\n locale?: SupportedLocale\n}\n\n/* -------------------------------------------------------------------------- */\n/* DataTable */\n/* -------------------------------------------------------------------------- */\n\nconst noop = () => {}\n\nfunction DataTableInner<TData>(\n {\n columns,\n data,\n size = 'md',\n isLoading = false,\n loadingRows = 5,\n emptyState,\n pagination,\n sort,\n multiSort,\n footer = false,\n stickyFooter = true,\n onColumnResize,\n selection,\n columnVisibility,\n expansion,\n infiniteScroll,\n virtualize,\n striped = false,\n bordered = false,\n stickyHeader = false,\n className,\n caption,\n resultCount,\n locale = 'fa',\n }: DataTableProps<TData>,\n ref: React.ForwardedRef<HTMLDivElement>\n) {\n const t = getUIStrings(locale)\n const hasSelection = !!selection\n const hasExpansion = !!expansion\n const rtl = isRTL(locale)\n\n // Filter columns by visibility map (explicit override) or defaultVisible\n // fallback. When no columnVisibility prop is supplied, columns marked\n // `defaultVisible: false` are still hidden — consumers can flip them on\n // by passing a columnVisibility prop with `{ id: true }`.\n const visibleColumns = React.useMemo(() => {\n return columns.filter((col) => {\n const explicit = columnVisibility?.visible[col.id]\n if (explicit !== undefined) return explicit\n return col.defaultVisible !== false\n })\n }, [columns, columnVisibility])\n\n const allColumnCount = visibleColumns.length + (hasSelection ? 1 : 0) + (hasExpansion ? 1 : 0)\n\n // Memoize the row-key resolver so it has a stable identity across renders\n // when consumer omits selection.getRowKey (the default identity function\n // would be a new ref every render and bust downstream useMemos).\n const getRowKey = React.useMemo(\n () => selection?.getRowKey ?? ((_: TData, index: number) => index),\n [selection?.getRowKey]\n )\n\n const allRowKeys = React.useMemo(() => data.map((row, i) => getRowKey(row, i)), [data, getRowKey])\n\n const allSelected = hasSelection && data.length > 0 && allRowKeys.every((key) => selection.selectedRows.has(key))\n\n const someSelected = hasSelection && !allSelected && allRowKeys.some((key) => selection.selectedRows.has(key))\n\n const handleSelectAll = () => {\n if (!selection) return\n if (allSelected) {\n selection.onSelectionChange(new Set())\n } else {\n selection.onSelectionChange(new Set(allRowKeys))\n }\n }\n\n const handleSelectRow = (key: number) => {\n if (!selection) return\n const next = new Set(selection.selectedRows)\n if (next.has(key)) {\n next.delete(key)\n } else {\n next.add(key)\n }\n selection.onSelectionChange(next)\n }\n\n const handleSort = (columnId: string, e?: React.MouseEvent | React.KeyboardEvent) => {\n // Multi-sort takes precedence — Shift-click toggles rule, plain click replaces all\n if (multiSort) {\n const isShift = !!e && 'shiftKey' in e && e.shiftKey\n const existing = multiSort.rules.find((r) => r.column === columnId)\n const maxRules = multiSort.maxRules ?? 3\n let next: SortRule[]\n if (!isShift) {\n // Plain click: cycle existing → flip / replace with this column ascending\n if (existing) {\n next = [{ column: columnId, direction: existing.direction === 'asc' ? 'desc' : 'asc' }]\n } else {\n next = [{ column: columnId, direction: 'asc' }]\n }\n } else {\n if (existing) {\n if (existing.direction === 'asc') {\n next = multiSort.rules.map((r) => (r.column === columnId ? { ...r, direction: 'desc' as const } : r))\n } else {\n // Already desc → remove the rule\n next = multiSort.rules.filter((r) => r.column !== columnId)\n }\n } else {\n // Append a new rule, capped at maxRules\n next = [...multiSort.rules, { column: columnId, direction: 'asc' as const }].slice(0, maxRules)\n }\n }\n multiSort.onSortChange(next)\n return\n }\n if (!sort) return\n const nextDirection: SortDirection = sort.column === columnId && sort.direction === 'asc' ? 'desc' : 'asc'\n sort.onSort(columnId, nextDirection)\n }\n\n const getSortDir = (columnId: string): 'asc' | 'desc' | 'none' => {\n if (multiSort) {\n const rule = multiSort.rules.find((r) => r.column === columnId)\n return rule ? rule.direction : 'none'\n }\n if (!sort || sort.column !== columnId || !sort.direction) return 'none'\n return sort.direction\n }\n\n /** Priority badge index for multi-sort (1-based). 0 = no rule. */\n const getSortPriority = (columnId: string): number => {\n if (!multiSort) return 0\n const idx = multiSort.rules.findIndex((r) => r.column === columnId)\n return idx === -1 ? 0 : idx + 1\n }\n\n const alignClass = (align?: 'start' | 'center' | 'end') => {\n if (align === 'center') return 'text-center'\n if (align === 'end') return 'text-end'\n return 'text-start'\n }\n\n /**\n * Pinned-column style — uses CSS logical inset properties so RTL is\n * automatic. We don't compute pixel offsets for stacked pinned columns\n * (those are rare); first pinned column on each side is enough for the\n * common case.\n */\n const pinClass = (pinned?: 'start' | 'end') => {\n if (!pinned) return ''\n const sideClass = pinned === 'start' ? 'sticky inset-inline-start-0 z-[1]' : 'sticky inset-inline-end-0 z-[1]'\n return `${sideClass} bg-background`\n }\n\n const handleToggleExpand = (rowKey: number) => {\n if (!expansion) return\n const next = new Set(expansion.expandedRows)\n if (next.has(rowKey)) next.delete(rowKey)\n else next.add(rowKey)\n expansion.onExpandedRowsChange(next)\n }\n\n /* ----------------------------- Column resize ---------------------------- */\n\n // Live override widths during drag — keyed by column id. Only applies while\n // dragging is active; on mouseup we surface the final width via callback\n // and the consumer is expected to push it back via `column.width`.\n const [resizeWidths, setResizeWidths] = React.useState<Record<string, number>>({})\n const dragRef = React.useRef<{\n columnId: string\n startX: number\n startWidth: number\n currentWidth: number\n minWidth: number\n maxWidth: number\n } | null>(null)\n\n const startResize = React.useCallback(\n (columnId: string, e: React.PointerEvent<HTMLDivElement>) => {\n const col = columns.find((c) => c.id === columnId)\n if (!col) return\n const headerCell = (e.currentTarget as HTMLElement).closest('th')\n const measured = headerCell?.getBoundingClientRect().width || 0\n const startWidth = typeof col.width === 'number' ? col.width : measured > 0 ? measured : 120\n dragRef.current = {\n columnId,\n startX: e.clientX,\n startWidth,\n currentWidth: startWidth,\n minWidth: col.minWidth ?? 60,\n maxWidth: col.maxWidth ?? 800,\n }\n // Capture pointer to keep receiving moves outside the divider\n ;(e.currentTarget as HTMLElement).setPointerCapture?.(e.pointerId)\n e.preventDefault()\n e.stopPropagation()\n },\n [columns]\n )\n\n const onResizePointerMove = React.useCallback(\n (e: React.PointerEvent<HTMLDivElement>) => {\n const drag = dragRef.current\n if (!drag) return\n // In RTL the visual drag direction reverses\n const dx = (rtl ? -1 : 1) * (e.clientX - drag.startX)\n const next = Math.max(drag.minWidth, Math.min(drag.maxWidth, drag.startWidth + dx))\n drag.currentWidth = next\n setResizeWidths((prev) => (prev[drag.columnId] === next ? prev : { ...prev, [drag.columnId]: next }))\n },\n [rtl]\n )\n\n const endResize = React.useCallback(\n (e: React.PointerEvent<HTMLDivElement>) => {\n const drag = dragRef.current\n if (!drag) return\n onColumnResize?.(drag.columnId, drag.currentWidth)\n dragRef.current = null\n ;(e.currentTarget as HTMLElement).releasePointerCapture?.(e.pointerId)\n },\n [onColumnResize]\n )\n\n const getColumnWidth = (col: DataTableColumn<TData>): number | undefined => {\n return resizeWidths[col.id] ?? col.width\n }\n\n // Keyboard resize — handles ArrowKeys/Home/End on a focused resize separator.\n // Logical end-ward arrow grows the column, logical start-ward shrinks.\n // In LTR: ArrowRight grows, ArrowLeft shrinks. In RTL: ArrowLeft grows, ArrowRight shrinks.\n // Shift bumps the nudge to 32px for faster keyboard resizing.\n const handleResizeKeyDown = React.useCallback(\n (columnId: string, e: React.KeyboardEvent<HTMLDivElement>) => {\n const isArrowGrow = rtl ? e.key === 'ArrowLeft' : e.key === 'ArrowRight'\n const isArrowShrink = rtl ? e.key === 'ArrowRight' : e.key === 'ArrowLeft'\n if (!isArrowGrow && !isArrowShrink && e.key !== 'Home' && e.key !== 'End') return\n const col = columns.find((c) => c.id === columnId)\n if (!col) return\n const headerCell = (e.currentTarget as HTMLElement).closest('th')\n const measured = headerCell?.getBoundingClientRect().width || 0\n const minWidth = col.minWidth ?? 60\n const maxWidth = col.maxWidth ?? 800\n const current =\n resizeWidths[columnId] ?? (typeof col.width === 'number' ? col.width : measured > 0 ? measured : 120)\n const step = e.shiftKey ? 32 : 8\n let next: number\n if (e.key === 'Home') next = minWidth\n else if (e.key === 'End') next = maxWidth\n else if (isArrowGrow) next = Math.min(maxWidth, current + step)\n else next = Math.max(minWidth, current - step)\n e.preventDefault()\n setResizeWidths((prev) => (prev[columnId] === next ? prev : { ...prev, [columnId]: next }))\n onColumnResize?.(columnId, next)\n },\n [columns, resizeWidths, rtl, onColumnResize]\n )\n\n /* ---------------------------- Infinite scroll --------------------------- */\n\n const { sentinelRef } = useInfiniteScroll({\n onLoadMore: infiniteScroll?.onLoadMore ?? noop,\n hasMore: !!infiniteScroll?.hasMore,\n isLoading: !!infiniteScroll?.isLoadingMore,\n rootMargin: infiniteScroll?.rootMargin ?? '200px',\n })\n\n /* ----------------------------- Virtualization --------------------------- */\n\n const virtRowHeight = virtualize?.rowHeight ?? 0\n const virtViewportHeight = virtualize?.viewportHeight ?? 480\n const virtOverscan = virtualize?.overscan ?? 6\n const virtScrollRef = React.useRef<HTMLDivElement | null>(null)\n const [virtScrollTop, setVirtScrollTop] = React.useState(0)\n\n const handleVirtScroll = React.useCallback((e: React.UIEvent<HTMLDivElement>) => {\n setVirtScrollTop(e.currentTarget.scrollTop)\n }, [])\n\n // When virtualize is set, compute the visible slice; otherwise use full data.\n const { virtStartIndex, virtEndIndex, virtTopSpacer, virtBottomSpacer } = React.useMemo(() => {\n if (!virtualize || data.length === 0) {\n return { virtStartIndex: 0, virtEndIndex: data.length, virtTopSpacer: 0, virtBottomSpacer: 0 }\n }\n const start = Math.max(0, Math.floor(virtScrollTop / virtRowHeight) - virtOverscan)\n const visibleCount = Math.ceil(virtViewportHeight / virtRowHeight) + virtOverscan * 2\n const end = Math.min(data.length, start + visibleCount)\n return {\n virtStartIndex: start,\n virtEndIndex: end,\n virtTopSpacer: start * virtRowHeight,\n virtBottomSpacer: (data.length - end) * virtRowHeight,\n }\n }, [virtualize, data.length, virtScrollTop, virtRowHeight, virtViewportHeight, virtOverscan])\n\n return (\n <div ref={ref} data-slot=\"data-table\" className={cn('flex flex-col gap-4', className)}>\n {resultCount && (\n <div data-slot=\"data-table-result-count\" className=\"text-sm text-foreground-muted\">\n {resultCount}\n </div>\n )}\n\n <div\n ref={virtualize ? virtScrollRef : undefined}\n onScroll={virtualize ? handleVirtScroll : undefined}\n style={virtualize ? { maxHeight: virtViewportHeight, overflowY: 'auto' } : undefined}\n data-slot={virtualize ? 'data-table-virtual-scroll' : undefined}\n >\n <Table size={size} striped={striped} bordered={bordered} stickyHeader={stickyHeader || !!virtualize}>\n {caption && <caption className=\"text-foreground-muted mt-4 text-sm\">{caption}</caption>}\n\n <TableHeader>\n <TableRow>\n {hasSelection && (\n <TableHead className={cn('w-[40px]', pinClass('start'))}>\n <Checkbox\n checked={allSelected ? true : someSelected ? 'indeterminate' : false}\n onCheckedChange={handleSelectAll}\n aria-label={t.selectAll}\n />\n </TableHead>\n )}\n {hasExpansion && <TableHead className={cn('w-[36px]', pinClass('start'))} aria-hidden=\"true\" />}\n {visibleColumns.map((col) => {\n const sortable = col.sortable && (sort || multiSort)\n const dir = sortable ? getSortDir(col.id) : 'none'\n const priority = getSortPriority(col.id)\n const liveWidth = getColumnWidth(col)\n return (\n <TableHead\n key={col.id}\n sortDirection={sortable ? dir : undefined}\n className={cn('relative', alignClass(col.align), pinClass(col.pinned), col.className)}\n style={liveWidth ? { width: liveWidth } : undefined}\n >\n {sortable ? (\n <TableSortHeader\n sorted={dir === 'none' ? false : dir}\n onClick={(e: React.MouseEvent) => handleSort(col.id, e)}\n >\n <span className=\"inline-flex items-center gap-1.5\">\n {col.header}\n {priority > 0 && multiSort && multiSort.rules.length > 1 && (\n <span\n data-slot=\"data-table-sort-priority\"\n className=\"inline-flex h-4 min-w-4 items-center justify-center rounded bg-overlay-active px-1 text-[10px] font-medium tabular-nums text-foreground-light\"\n aria-label={`اولویت مرتبسازی ${priority}`}\n >\n {priority}\n </span>\n )}\n </span>\n </TableSortHeader>\n ) : (\n col.header\n )}\n {col.resizable && (\n // role=\"separator\" + tabIndex + ArrowKey handler is the\n // WAI-ARIA windowsplitter pattern (resizable separator).\n // eslint-disable-next-line jsx-a11y/no-noninteractive-element-interactions\n <div\n data-slot=\"data-table-resize-handle\"\n role=\"separator\"\n aria-orientation=\"vertical\"\n aria-label=\"تغییر اندازه ستون\"\n tabIndex={0}\n aria-valuenow={getColumnWidth(col)}\n aria-valuemin={col.minWidth ?? 60}\n aria-valuemax={col.maxWidth ?? 800}\n onKeyDown={(e) => handleResizeKeyDown(col.id, e)}\n onPointerDown={(e) => startResize(col.id, e)}\n onPointerMove={onResizePointerMove}\n onPointerUp={endResize}\n onPointerCancel={endResize}\n className={cn(\n 'absolute inset-block-0 inset-inline-end-0 w-1.5 cursor-col-resize select-none touch-none',\n 'before:absolute before:inset-block-2 before:inset-inline-1/2 before:w-px before:-translate-x-1/2 before:bg-border-default before:opacity-0 before:transition-opacity',\n 'hover:before:opacity-100 focus:before:opacity-100 focus-visible:outline-none focus-visible:before:!bg-brand focus-visible:before:opacity-100',\n dragRef.current?.columnId === col.id && 'before:!bg-brand before:opacity-100'\n )}\n />\n )}\n </TableHead>\n )\n })}\n </TableRow>\n </TableHeader>\n\n <TableBody>\n {virtualize && !isLoading && data.length > 0 && virtTopSpacer > 0 && (\n <tr aria-hidden=\"true\" data-slot=\"data-table-virtual-spacer-top\">\n <td colSpan={allColumnCount} style={{ height: virtTopSpacer, padding: 0 }} />\n </tr>\n )}\n {isLoading ? (\n Array.from({ length: loadingRows }).map((_, rowIdx) => (\n <TableRow key={`skeleton-${rowIdx}`}>\n {hasSelection && (\n <TableCell className={pinClass('start')}>\n <Skeleton className=\"h-4 w-4\" />\n </TableCell>\n )}\n {hasExpansion && (\n <TableCell className={pinClass('start')}>\n <Skeleton className=\"h-4 w-4\" />\n </TableCell>\n )}\n {visibleColumns.map((col) => {\n const liveWidth = getColumnWidth(col)\n return (\n <TableCell\n key={col.id}\n className={cn(alignClass(col.align), pinClass(col.pinned), col.className)}\n style={liveWidth ? { width: liveWidth } : undefined}\n >\n <Skeleton className=\"h-4 w-full max-w-[120px]\" />\n </TableCell>\n )\n })}\n </TableRow>\n ))\n ) : data.length === 0 ? (\n <TableRow>\n <TableCell colSpan={allColumnCount}>\n {emptyState || (\n <div className=\"flex items-center justify-center py-10 text-foreground-muted text-sm\">\n {t.noDataToDisplay}\n </div>\n )}\n </TableCell>\n </TableRow>\n ) : (\n (virtualize ? data.slice(virtStartIndex, virtEndIndex) : data).map((row, sliceIdx) => {\n const rowIdx = virtualize ? virtStartIndex + sliceIdx : sliceIdx\n const rowKey = getRowKey(row, rowIdx)\n const isSelected = hasSelection && selection.selectedRows.has(rowKey)\n const isExpanded = hasExpansion && expansion.expandedRows.has(rowKey)\n // Collapsed row chevron points start-ward (logical). In LTR start = left → ChevronRight\n // visually points \"into\" the row; in RTL start = right → ChevronLeft does the same.\n // The mirror `rtl && rotate-180` already handles the visual flip on a single icon.\n const ChevronIcon = ChevronRight\n return (\n <React.Fragment key={rowKey}>\n <TableRow data-state={isSelected ? 'selected' : undefined}>\n {hasSelection && (\n <TableCell className={pinClass('start')}>\n <Checkbox\n checked={isSelected}\n onCheckedChange={() => handleSelectRow(rowKey)}\n aria-label={`${t.selectRow} ${(rowIdx + 1).toLocaleString(locale === 'fa' ? 'fa-IR' : locale === 'ar' ? 'ar-SA' : 'en-US')}`}\n />\n </TableCell>\n )}\n {hasExpansion && (\n <TableCell className={pinClass('start')}>\n <button\n type=\"button\"\n aria-label={isExpanded ? 'collapse' : 'expand'}\n aria-expanded={isExpanded}\n onClick={() => handleToggleExpand(rowKey)}\n className=\"inline-flex size-6 items-center justify-center rounded text-foreground-lighter hover:bg-surface-100 hover:text-foreground transition-colors\"\n >\n {isExpanded ? (\n <ChevronDown className=\"size-4\" aria-hidden=\"true\" />\n ) : (\n <ChevronIcon className={cn('size-4', rtl && 'rotate-180')} aria-hidden=\"true\" />\n )}\n </button>\n </TableCell>\n )}\n {visibleColumns.map((col) => {\n const liveWidth = getColumnWidth(col)\n return (\n <TableCell\n key={col.id}\n className={cn(alignClass(col.align), pinClass(col.pinned), col.className)}\n style={liveWidth ? { width: liveWidth } : undefined}\n >\n {col.cell(row, rowIdx)}\n </TableCell>\n )\n })}\n </TableRow>\n {hasExpansion && isExpanded && (\n <TableRow data-slot=\"data-table-expanded-row\">\n <TableCell colSpan={allColumnCount} className=\"bg-surface-100/50 border-t-0\">\n {expansion.renderExpandedRow(row, rowIdx)}\n </TableCell>\n </TableRow>\n )}\n </React.Fragment>\n )\n })\n )}\n {virtualize && !isLoading && data.length > 0 && virtBottomSpacer > 0 && (\n <tr aria-hidden=\"true\" data-slot=\"data-table-virtual-spacer-bottom\">\n <td colSpan={allColumnCount} style={{ height: virtBottomSpacer, padding: 0 }} />\n </tr>\n )}\n {infiniteScroll && !isLoading && data.length > 0 && infiniteScroll.hasMore && (\n <tr data-slot=\"data-table-infinite-sentinel\" aria-hidden={!infiniteScroll.isLoadingMore}>\n <td\n ref={sentinelRef as React.RefCallback<HTMLTableCellElement>}\n colSpan={allColumnCount}\n className=\"border-0\"\n >\n {infiniteScroll.isLoadingMore ? (\n (infiniteScroll.loadingMoreContent ?? (\n <div className=\"flex items-center justify-center gap-2 py-3 text-sm text-foreground-lighter\">\n <Spinner size=\"sm\" />\n <span>{t.loading ?? 'در حال بارگذاری'}</span>\n </div>\n ))\n ) : (\n <div aria-hidden=\"true\" className=\"h-px\" />\n )}\n </td>\n </tr>\n )}\n {infiniteScroll &&\n !isLoading &&\n data.length > 0 &&\n !infiniteScroll.hasMore &&\n infiniteScroll.endContent && (\n <tr data-slot=\"data-table-infinite-end\">\n <td colSpan={allColumnCount} className=\"border-0 py-3 text-center text-xs text-foreground-lighter\">\n {infiniteScroll.endContent}\n </td>\n </tr>\n )}\n </TableBody>\n\n {footer && visibleColumns.some((c) => !!c.footer) && !isLoading && data.length > 0 && (\n <tfoot\n data-slot=\"data-table-footer\"\n data-sticky={stickyFooter || undefined}\n className={cn(\n 'bg-surface-75 border-t border-border-default font-medium',\n stickyFooter && '[&>tr>td]:sticky [&>tr>td]:inset-block-end-0 [&>tr>td]:bg-surface-75 [&>tr>td]:z-[8]'\n )}\n >\n <tr>\n {hasSelection && <td className={pinClass('start')} aria-hidden=\"true\" />}\n {hasExpansion && <td className={pinClass('start')} aria-hidden=\"true\" />}\n {visibleColumns.map((col) => {\n const liveWidth = getColumnWidth(col)\n return (\n <td\n key={col.id}\n className={cn(\n alignClass(col.align),\n pinClass(col.pinned),\n col.className,\n '[[data-size=sm]_&]:px-2 [[data-size=sm]_&]:py-1.5 [[data-size=sm]_&]:text-xs',\n '[[data-size=md]_&]:px-3 [[data-size=md]_&]:py-2 [[data-size=md]_&]:text-sm',\n '[[data-size=lg]_&]:px-4 [[data-size=lg]_&]:py-3 [[data-size=lg]_&]:text-base'\n )}\n style={liveWidth ? { width: liveWidth } : undefined}\n >\n {col.footer ? col.footer() : null}\n </td>\n )\n })}\n </tr>\n </tfoot>\n )}\n </Table>\n </div>\n\n {pagination && pagination.totalPages > 1 && (\n <div data-slot=\"data-table-pagination\" className=\"flex justify-center\">\n <PaginationControlled\n currentPage={pagination.currentPage}\n totalPages={pagination.totalPages}\n onPageChange={pagination.onPageChange}\n />\n </div>\n )}\n </div>\n )\n}\n\nconst DataTable = React.forwardRef(DataTableInner) as <TData>(\n props: DataTableProps<TData> & { ref?: React.ForwardedRef<HTMLDivElement> }\n) => React.ReactElement\n\n;(DataTable as { displayName?: string }).displayName = 'DataTable'\n\nexport { DataTable }\n"]}
|