@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,4 +1,111 @@
|
|
|
1
|
-
|
|
2
|
-
import '
|
|
1
|
+
'use client';
|
|
2
|
+
import * as SheetPrimitive from '@radix-ui/react-dialog';
|
|
3
|
+
import { XIcon } from 'lucide-react';
|
|
4
|
+
import { clsx } from 'clsx';
|
|
5
|
+
import { twMerge } from 'tailwind-merge';
|
|
6
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
7
|
+
|
|
8
|
+
function cn(...inputs) {
|
|
9
|
+
return twMerge(clsx(inputs));
|
|
10
|
+
}
|
|
11
|
+
function Sheet({ ...props }) {
|
|
12
|
+
return /* @__PURE__ */ jsx(SheetPrimitive.Root, { "data-slot": "sheet", ...props });
|
|
13
|
+
}
|
|
14
|
+
function SheetTrigger({ ...props }) {
|
|
15
|
+
return /* @__PURE__ */ jsx(SheetPrimitive.Trigger, { "data-slot": "sheet-trigger", ...props });
|
|
16
|
+
}
|
|
17
|
+
function SheetClose({ ...props }) {
|
|
18
|
+
return /* @__PURE__ */ jsx(SheetPrimitive.Close, { "data-slot": "sheet-close", ...props });
|
|
19
|
+
}
|
|
20
|
+
function SheetPortal({ ...props }) {
|
|
21
|
+
return /* @__PURE__ */ jsx(SheetPrimitive.Portal, { "data-slot": "sheet-portal", ...props });
|
|
22
|
+
}
|
|
23
|
+
function SheetOverlay({ className, ...props }) {
|
|
24
|
+
return /* @__PURE__ */ jsx(
|
|
25
|
+
SheetPrimitive.Overlay,
|
|
26
|
+
{
|
|
27
|
+
"data-slot": "sheet-overlay",
|
|
28
|
+
className: cn(
|
|
29
|
+
"data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/50",
|
|
30
|
+
className
|
|
31
|
+
),
|
|
32
|
+
...props
|
|
33
|
+
}
|
|
34
|
+
);
|
|
35
|
+
}
|
|
36
|
+
function SheetContent({
|
|
37
|
+
className,
|
|
38
|
+
children,
|
|
39
|
+
side = "right",
|
|
40
|
+
...props
|
|
41
|
+
}) {
|
|
42
|
+
return /* @__PURE__ */ jsxs(SheetPortal, { children: [
|
|
43
|
+
/* @__PURE__ */ jsx(SheetOverlay, {}),
|
|
44
|
+
/* @__PURE__ */ jsxs(
|
|
45
|
+
SheetPrimitive.Content,
|
|
46
|
+
{
|
|
47
|
+
"data-slot": "sheet-content",
|
|
48
|
+
className: cn(
|
|
49
|
+
"bg-background data-[state=open]:animate-in data-[state=closed]:animate-out fixed z-50 flex flex-col gap-4 shadow-lg transition ease-in-out data-[state=closed]:duration-300 data-[state=open]:duration-300",
|
|
50
|
+
side === "right" && "data-[state=closed]:slide-out-to-right data-[state=closed]:rtl:slide-out-to-left data-[state=open]:slide-in-from-right data-[state=open]:rtl:slide-in-from-left inset-y-0 end-0 h-full w-3/4 border-s sm:max-w-sm",
|
|
51
|
+
side === "left" && "data-[state=closed]:slide-out-to-left data-[state=closed]:rtl:slide-out-to-right data-[state=open]:slide-in-from-left data-[state=open]:rtl:slide-in-from-right inset-y-0 start-0 h-full w-3/4 border-e sm:max-w-sm",
|
|
52
|
+
side === "top" && "data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top inset-x-0 top-0 h-auto border-b",
|
|
53
|
+
side === "bottom" && "data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom inset-x-0 bottom-0 h-auto border-t",
|
|
54
|
+
className
|
|
55
|
+
),
|
|
56
|
+
...props,
|
|
57
|
+
children: [
|
|
58
|
+
children,
|
|
59
|
+
/* @__PURE__ */ jsxs(SheetPrimitive.Close, { className: "absolute top-4 end-4 rounded-sm text-foreground-light opacity-80 ring-offset-background transition-opacity hover:opacity-100 hover:text-foreground focus:outline-none focus:ring-2 focus:ring-brand-default focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-selection", children: [
|
|
60
|
+
/* @__PURE__ */ jsx(XIcon, { className: "size-4" }),
|
|
61
|
+
/* @__PURE__ */ jsx("span", { className: "sr-only", children: "\u0628\u0633\u062A\u0646" })
|
|
62
|
+
] })
|
|
63
|
+
]
|
|
64
|
+
}
|
|
65
|
+
)
|
|
66
|
+
] });
|
|
67
|
+
}
|
|
68
|
+
function SheetHeader({ className, ...props }) {
|
|
69
|
+
return /* @__PURE__ */ jsx("div", { "data-slot": "sheet-header", className: cn("flex flex-col gap-1.5 p-4", className), ...props });
|
|
70
|
+
}
|
|
71
|
+
function SheetBody({ className, ...props }) {
|
|
72
|
+
return /* @__PURE__ */ jsx("div", { "data-slot": "sheet-body", className: cn("flex-1 overflow-y-auto px-4 pb-4", className), ...props });
|
|
73
|
+
}
|
|
74
|
+
function SheetFooter({ className, ...props }) {
|
|
75
|
+
return /* @__PURE__ */ jsx("div", { "data-slot": "sheet-footer", className: cn("mt-auto flex flex-col gap-2 p-4", className), ...props });
|
|
76
|
+
}
|
|
77
|
+
function SheetTitle({ className, ...props }) {
|
|
78
|
+
return /* @__PURE__ */ jsx(
|
|
79
|
+
SheetPrimitive.Title,
|
|
80
|
+
{
|
|
81
|
+
"data-slot": "sheet-title",
|
|
82
|
+
className: cn("text-foreground font-semibold", className),
|
|
83
|
+
...props
|
|
84
|
+
}
|
|
85
|
+
);
|
|
86
|
+
}
|
|
87
|
+
function SheetDescription({ className, ...props }) {
|
|
88
|
+
return /* @__PURE__ */ jsx(
|
|
89
|
+
SheetPrimitive.Description,
|
|
90
|
+
{
|
|
91
|
+
"data-slot": "sheet-description",
|
|
92
|
+
className: cn("text-muted-foreground text-sm", className),
|
|
93
|
+
...props
|
|
94
|
+
}
|
|
95
|
+
);
|
|
96
|
+
}
|
|
97
|
+
Sheet.displayName = "Sheet";
|
|
98
|
+
SheetTrigger.displayName = "SheetTrigger";
|
|
99
|
+
SheetClose.displayName = "SheetClose";
|
|
100
|
+
SheetPortal.displayName = "SheetPortal";
|
|
101
|
+
SheetOverlay.displayName = "SheetOverlay";
|
|
102
|
+
SheetContent.displayName = "SheetContent";
|
|
103
|
+
SheetHeader.displayName = "SheetHeader";
|
|
104
|
+
SheetBody.displayName = "SheetBody";
|
|
105
|
+
SheetFooter.displayName = "SheetFooter";
|
|
106
|
+
SheetTitle.displayName = "SheetTitle";
|
|
107
|
+
SheetDescription.displayName = "SheetDescription";
|
|
108
|
+
|
|
109
|
+
export { Sheet, SheetBody, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetTitle, SheetTrigger };
|
|
3
110
|
//# sourceMappingURL=sheet.js.map
|
|
4
111
|
//# sourceMappingURL=sheet.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"sheet.js"}
|
|
1
|
+
{"version":3,"sources":["../../../src/lib/utils.ts","../../../src/components/ui/sheet.tsx"],"names":[],"mappings":"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","file":"sheet.js","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","'use client'\n\nimport * as React from 'react'\nimport * as SheetPrimitive from '@radix-ui/react-dialog'\nimport { XIcon } from 'lucide-react'\n\nimport { cn } from '@/lib/utils'\n\nfunction Sheet({ ...props }: React.ComponentProps<typeof SheetPrimitive.Root>) {\n return <SheetPrimitive.Root data-slot=\"sheet\" {...props} />\n}\n\nfunction SheetTrigger({ ...props }: React.ComponentProps<typeof SheetPrimitive.Trigger>) {\n return <SheetPrimitive.Trigger data-slot=\"sheet-trigger\" {...props} />\n}\n\nfunction SheetClose({ ...props }: React.ComponentProps<typeof SheetPrimitive.Close>) {\n return <SheetPrimitive.Close data-slot=\"sheet-close\" {...props} />\n}\n\nfunction SheetPortal({ ...props }: React.ComponentProps<typeof SheetPrimitive.Portal>) {\n return <SheetPrimitive.Portal data-slot=\"sheet-portal\" {...props} />\n}\n\nfunction SheetOverlay({ className, ...props }: React.ComponentProps<typeof SheetPrimitive.Overlay>) {\n return (\n <SheetPrimitive.Overlay\n data-slot=\"sheet-overlay\"\n className={cn(\n 'data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/50',\n className\n )}\n {...props}\n />\n )\n}\n\nfunction SheetContent({\n className,\n children,\n side = 'right',\n ...props\n}: React.ComponentProps<typeof SheetPrimitive.Content> & {\n side?: 'top' | 'right' | 'bottom' | 'left'\n}) {\n return (\n <SheetPortal>\n <SheetOverlay />\n <SheetPrimitive.Content\n data-slot=\"sheet-content\"\n className={cn(\n 'bg-background data-[state=open]:animate-in data-[state=closed]:animate-out fixed z-50 flex flex-col gap-4 shadow-lg transition ease-in-out data-[state=closed]:duration-300 data-[state=open]:duration-300',\n side === 'right' &&\n 'data-[state=closed]:slide-out-to-right data-[state=closed]:rtl:slide-out-to-left data-[state=open]:slide-in-from-right data-[state=open]:rtl:slide-in-from-left inset-y-0 end-0 h-full w-3/4 border-s sm:max-w-sm',\n side === 'left' &&\n 'data-[state=closed]:slide-out-to-left data-[state=closed]:rtl:slide-out-to-right data-[state=open]:slide-in-from-left data-[state=open]:rtl:slide-in-from-right inset-y-0 start-0 h-full w-3/4 border-e sm:max-w-sm',\n side === 'top' &&\n 'data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top inset-x-0 top-0 h-auto border-b',\n side === 'bottom' &&\n 'data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom inset-x-0 bottom-0 h-auto border-t',\n className\n )}\n {...props}\n >\n {children}\n {/* 1.1.16 — close button: removed open-state fade. */}\n <SheetPrimitive.Close className=\"absolute top-4 end-4 rounded-sm text-foreground-light opacity-80 ring-offset-background transition-opacity hover:opacity-100 hover:text-foreground focus:outline-none focus:ring-2 focus:ring-brand-default focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-selection\">\n <XIcon className=\"size-4\" />\n <span className=\"sr-only\">بستن</span>\n </SheetPrimitive.Close>\n </SheetPrimitive.Content>\n </SheetPortal>\n )\n}\n\nfunction SheetHeader({ className, ...props }: React.ComponentProps<'div'>) {\n return <div data-slot=\"sheet-header\" className={cn('flex flex-col gap-1.5 p-4', className)} {...props} />\n}\n\nfunction SheetBody({ className, ...props }: React.ComponentProps<'div'>) {\n return <div data-slot=\"sheet-body\" className={cn('flex-1 overflow-y-auto px-4 pb-4', className)} {...props} />\n}\n\nfunction SheetFooter({ className, ...props }: React.ComponentProps<'div'>) {\n return <div data-slot=\"sheet-footer\" className={cn('mt-auto flex flex-col gap-2 p-4', className)} {...props} />\n}\n\nfunction SheetTitle({ className, ...props }: React.ComponentProps<typeof SheetPrimitive.Title>) {\n return (\n <SheetPrimitive.Title\n data-slot=\"sheet-title\"\n className={cn('text-foreground font-semibold', className)}\n {...props}\n />\n )\n}\n\nfunction SheetDescription({ className, ...props }: React.ComponentProps<typeof SheetPrimitive.Description>) {\n return (\n <SheetPrimitive.Description\n data-slot=\"sheet-description\"\n className={cn('text-muted-foreground text-sm', className)}\n {...props}\n />\n )\n}\n\nSheet.displayName = 'Sheet'\nSheetTrigger.displayName = 'SheetTrigger'\nSheetClose.displayName = 'SheetClose'\nSheetPortal.displayName = 'SheetPortal'\nSheetOverlay.displayName = 'SheetOverlay'\nSheetContent.displayName = 'SheetContent'\nSheetHeader.displayName = 'SheetHeader'\nSheetBody.displayName = 'SheetBody'\nSheetFooter.displayName = 'SheetFooter'\nSheetTitle.displayName = 'SheetTitle'\nSheetDescription.displayName = 'SheetDescription'\n\nexport {\n Sheet,\n SheetTrigger,\n SheetClose,\n SheetContent,\n SheetHeader,\n SheetBody,\n SheetFooter,\n SheetTitle,\n SheetDescription,\n}\n"]}
|
|
@@ -1,9 +1,14 @@
|
|
|
1
|
+
'use client';
|
|
1
2
|
'use strict';
|
|
2
3
|
|
|
3
|
-
var chunkNV4JOKWL_cjs = require('./chunk-NV4JOKWL.cjs');
|
|
4
4
|
var classVarianceAuthority = require('class-variance-authority');
|
|
5
|
+
var clsx = require('clsx');
|
|
6
|
+
var tailwindMerge = require('tailwind-merge');
|
|
5
7
|
var jsxRuntime = require('react/jsx-runtime');
|
|
6
8
|
|
|
9
|
+
function cn(...inputs) {
|
|
10
|
+
return tailwindMerge.twMerge(clsx.clsx(inputs));
|
|
11
|
+
}
|
|
7
12
|
var skeletonVariants = classVarianceAuthority.cva("bg-accent animate-pulse", {
|
|
8
13
|
variants: {
|
|
9
14
|
shape: {
|
|
@@ -35,7 +40,7 @@ function Skeleton({ className, shape, size, count, ...props }) {
|
|
|
35
40
|
{
|
|
36
41
|
"data-slot": "skeleton",
|
|
37
42
|
"aria-hidden": "true",
|
|
38
|
-
className:
|
|
43
|
+
className: cn(skeletonVariants({ shape, size }), className)
|
|
39
44
|
},
|
|
40
45
|
i
|
|
41
46
|
)) });
|
|
@@ -48,7 +53,7 @@ function Skeleton({ className, shape, size, count, ...props }) {
|
|
|
48
53
|
"aria-busy": "true",
|
|
49
54
|
"aria-label": "Loading",
|
|
50
55
|
...props,
|
|
51
|
-
className:
|
|
56
|
+
className: cn(skeletonVariants({ shape, size }), className)
|
|
52
57
|
}
|
|
53
58
|
);
|
|
54
59
|
}
|
|
@@ -61,7 +66,7 @@ function MetricCardSkeleton({ className }) {
|
|
|
61
66
|
role: "status",
|
|
62
67
|
"aria-busy": "true",
|
|
63
68
|
"aria-label": "Loading metric",
|
|
64
|
-
className:
|
|
69
|
+
className: cn("rounded-lg border border-border bg-card p-4 space-y-3", className),
|
|
65
70
|
children: [
|
|
66
71
|
/* @__PURE__ */ jsxRuntime.jsx(Skeleton, { shape: "line", className: "h-3 w-1/3", "aria-hidden": "true" }),
|
|
67
72
|
/* @__PURE__ */ jsxRuntime.jsx(Skeleton, { shape: "rect", className: "h-8 w-1/2", "aria-hidden": "true" }),
|
|
@@ -79,7 +84,7 @@ function ChartSkeleton({ className }) {
|
|
|
79
84
|
role: "status",
|
|
80
85
|
"aria-busy": "true",
|
|
81
86
|
"aria-label": "Loading chart",
|
|
82
|
-
className:
|
|
87
|
+
className: cn("w-full rounded-md overflow-hidden", className),
|
|
83
88
|
children: /* @__PURE__ */ jsxRuntime.jsx(Skeleton, { shape: "rect", className: "w-full h-full min-h-[200px]", "aria-hidden": "true" })
|
|
84
89
|
}
|
|
85
90
|
);
|
|
@@ -93,7 +98,7 @@ function TableSkeleton({ rows = 5, className }) {
|
|
|
93
98
|
role: "status",
|
|
94
99
|
"aria-busy": "true",
|
|
95
100
|
"aria-label": "Loading table",
|
|
96
|
-
className:
|
|
101
|
+
className: cn("w-full rounded-md border border-border overflow-hidden", className),
|
|
97
102
|
children: [
|
|
98
103
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex gap-4 bg-muted/50 px-4 py-3 border-b border-border", "aria-hidden": "true", children: [
|
|
99
104
|
/* @__PURE__ */ jsxRuntime.jsx(Skeleton, { shape: "line", className: "h-4 flex-1" }),
|
|
@@ -105,7 +110,7 @@ function TableSkeleton({ rows = 5, className }) {
|
|
|
105
110
|
"div",
|
|
106
111
|
{
|
|
107
112
|
"aria-hidden": "true",
|
|
108
|
-
className:
|
|
113
|
+
className: cn("flex gap-4 px-4 py-3", i !== rows - 1 && "border-b border-border"),
|
|
109
114
|
children: [
|
|
110
115
|
/* @__PURE__ */ jsxRuntime.jsx(Skeleton, { shape: "line", className: "h-4 flex-1" }),
|
|
111
116
|
/* @__PURE__ */ jsxRuntime.jsx(Skeleton, { shape: "line", className: "h-4 flex-1" }),
|
|
@@ -139,16 +144,16 @@ function CardSkeleton({
|
|
|
139
144
|
role: "status",
|
|
140
145
|
"aria-busy": "true",
|
|
141
146
|
"aria-label": "Loading card",
|
|
142
|
-
className:
|
|
147
|
+
className: cn("rounded-lg border border-border bg-card overflow-hidden flex flex-col", className),
|
|
143
148
|
children: [
|
|
144
|
-
withImage && /* @__PURE__ */ jsxRuntime.jsx(Skeleton, { shape: "rect", className:
|
|
149
|
+
withImage && /* @__PURE__ */ jsxRuntime.jsx(Skeleton, { shape: "rect", className: cn("w-full", aspectClass), "aria-hidden": "true" }),
|
|
145
150
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "p-4 space-y-3 flex-1", children: [
|
|
146
151
|
/* @__PURE__ */ jsxRuntime.jsx(Skeleton, { shape: "line", className: "h-4 w-3/5", "aria-hidden": "true" }),
|
|
147
152
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "space-y-2", children: Array.from({ length: bodyLines }).map((_, i) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
148
153
|
Skeleton,
|
|
149
154
|
{
|
|
150
155
|
shape: "line",
|
|
151
|
-
className:
|
|
156
|
+
className: cn("h-3", i === bodyLines - 1 ? "w-2/3" : "w-full"),
|
|
152
157
|
"aria-hidden": "true"
|
|
153
158
|
},
|
|
154
159
|
i
|
|
@@ -171,14 +176,14 @@ function AvatarTextSkeleton({ size = "md", lines = 2, className }) {
|
|
|
171
176
|
role: "status",
|
|
172
177
|
"aria-busy": "true",
|
|
173
178
|
"aria-label": "Loading user",
|
|
174
|
-
className:
|
|
179
|
+
className: cn("flex items-center gap-3", className),
|
|
175
180
|
children: [
|
|
176
181
|
/* @__PURE__ */ jsxRuntime.jsx(Skeleton, { shape: "circle", size, "aria-hidden": "true" }),
|
|
177
182
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex-1 min-w-0 space-y-2", children: Array.from({ length: lines }).map((_, i) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
178
183
|
Skeleton,
|
|
179
184
|
{
|
|
180
185
|
shape: "line",
|
|
181
|
-
className:
|
|
186
|
+
className: cn("h-3", i === 0 ? "w-1/3" : i === lines - 1 ? "w-1/2" : "w-full"),
|
|
182
187
|
"aria-hidden": "true"
|
|
183
188
|
},
|
|
184
189
|
i
|
|
@@ -197,10 +202,10 @@ function FormRowSkeleton({ field = "input", withHelp = false, className }) {
|
|
|
197
202
|
role: "status",
|
|
198
203
|
"aria-busy": "true",
|
|
199
204
|
"aria-label": "Loading form field",
|
|
200
|
-
className:
|
|
205
|
+
className: cn("space-y-2", className),
|
|
201
206
|
children: [
|
|
202
207
|
/* @__PURE__ */ jsxRuntime.jsx(Skeleton, { shape: "line", className: "h-3 w-1/4", "aria-hidden": "true" }),
|
|
203
|
-
/* @__PURE__ */ jsxRuntime.jsx(Skeleton, { shape: "rect", className:
|
|
208
|
+
/* @__PURE__ */ jsxRuntime.jsx(Skeleton, { shape: "rect", className: cn("w-full", inputClass), "aria-hidden": "true" }),
|
|
204
209
|
withHelp && /* @__PURE__ */ jsxRuntime.jsx(Skeleton, { shape: "line", className: "h-2.5 w-1/3", "aria-hidden": "true" })
|
|
205
210
|
]
|
|
206
211
|
}
|
|
@@ -216,5 +221,5 @@ exports.MetricCardSkeleton = MetricCardSkeleton;
|
|
|
216
221
|
exports.Skeleton = Skeleton;
|
|
217
222
|
exports.TableRowSkeleton = TableRowSkeleton;
|
|
218
223
|
exports.TableSkeleton = TableSkeleton;
|
|
219
|
-
//# sourceMappingURL=
|
|
220
|
-
//# sourceMappingURL=
|
|
224
|
+
//# sourceMappingURL=skeleton.cjs.map
|
|
225
|
+
//# sourceMappingURL=skeleton.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/lib/utils.ts","../../../src/components/ui/skeleton.tsx"],"names":["twMerge","clsx","cva","jsx","jsxs"],"mappings":"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","file":"skeleton.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","'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"]}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import * as class_variance_authority_types from 'class-variance-authority/types';
|
|
3
|
+
import * as React from 'react';
|
|
4
|
+
import { VariantProps } from 'class-variance-authority';
|
|
5
|
+
|
|
6
|
+
declare const skeletonVariants: (props?: ({
|
|
7
|
+
shape?: "circle" | "rect" | "line" | "text" | null | undefined;
|
|
8
|
+
size?: "sm" | "md" | "lg" | null | undefined;
|
|
9
|
+
} & class_variance_authority_types.ClassProp) | undefined) => string;
|
|
10
|
+
interface SkeletonProps extends React.HTMLAttributes<HTMLDivElement>, VariantProps<typeof skeletonVariants> {
|
|
11
|
+
/**
|
|
12
|
+
* تعداد عناصر skeleton برای نمایش (برای shape های line و text)
|
|
13
|
+
* Number of skeleton elements to repeat (for line/text shapes)
|
|
14
|
+
*/
|
|
15
|
+
count?: number;
|
|
16
|
+
}
|
|
17
|
+
declare function Skeleton({ className, shape, size, count, ...props }: SkeletonProps): react_jsx_runtime.JSX.Element;
|
|
18
|
+
declare namespace Skeleton {
|
|
19
|
+
var displayName: string;
|
|
20
|
+
}
|
|
21
|
+
interface MetricCardSkeletonProps {
|
|
22
|
+
className?: string;
|
|
23
|
+
}
|
|
24
|
+
declare function MetricCardSkeleton({ className }: MetricCardSkeletonProps): react_jsx_runtime.JSX.Element;
|
|
25
|
+
declare namespace MetricCardSkeleton {
|
|
26
|
+
var displayName: string;
|
|
27
|
+
}
|
|
28
|
+
interface ChartSkeletonProps {
|
|
29
|
+
className?: string;
|
|
30
|
+
}
|
|
31
|
+
declare function ChartSkeleton({ className }: ChartSkeletonProps): react_jsx_runtime.JSX.Element;
|
|
32
|
+
declare namespace ChartSkeleton {
|
|
33
|
+
var displayName: string;
|
|
34
|
+
}
|
|
35
|
+
interface TableSkeletonProps {
|
|
36
|
+
rows?: number;
|
|
37
|
+
className?: string;
|
|
38
|
+
}
|
|
39
|
+
declare function TableSkeleton({ rows, className }: TableSkeletonProps): react_jsx_runtime.JSX.Element;
|
|
40
|
+
declare namespace TableSkeleton {
|
|
41
|
+
var displayName: string;
|
|
42
|
+
}
|
|
43
|
+
interface TableRowSkeletonProps {
|
|
44
|
+
/** Number of cells in the row */
|
|
45
|
+
cells?: number;
|
|
46
|
+
className?: string;
|
|
47
|
+
}
|
|
48
|
+
declare function TableRowSkeleton({ cells, className }: TableRowSkeletonProps): react_jsx_runtime.JSX.Element;
|
|
49
|
+
declare namespace TableRowSkeleton {
|
|
50
|
+
var displayName: string;
|
|
51
|
+
}
|
|
52
|
+
interface CardSkeletonProps {
|
|
53
|
+
/** Show a leading image/thumbnail block @default false */
|
|
54
|
+
withImage?: boolean;
|
|
55
|
+
/** Aspect ratio of the image (when withImage) @default 'video' */
|
|
56
|
+
imageAspect?: 'video' | 'square' | 'wide';
|
|
57
|
+
/** Number of body lines @default 2 */
|
|
58
|
+
bodyLines?: number;
|
|
59
|
+
/** Show a footer row (button-shaped placeholder) @default false */
|
|
60
|
+
withFooter?: boolean;
|
|
61
|
+
className?: string;
|
|
62
|
+
}
|
|
63
|
+
declare function CardSkeleton({ withImage, imageAspect, bodyLines, withFooter, className, }: CardSkeletonProps): react_jsx_runtime.JSX.Element;
|
|
64
|
+
declare namespace CardSkeleton {
|
|
65
|
+
var displayName: string;
|
|
66
|
+
}
|
|
67
|
+
interface AvatarTextSkeletonProps {
|
|
68
|
+
/** Avatar size @default 'md' */
|
|
69
|
+
size?: 'sm' | 'md' | 'lg';
|
|
70
|
+
/** Number of text lines beside the avatar @default 2 */
|
|
71
|
+
lines?: number;
|
|
72
|
+
className?: string;
|
|
73
|
+
}
|
|
74
|
+
declare function AvatarTextSkeleton({ size, lines, className }: AvatarTextSkeletonProps): react_jsx_runtime.JSX.Element;
|
|
75
|
+
declare namespace AvatarTextSkeleton {
|
|
76
|
+
var displayName: string;
|
|
77
|
+
}
|
|
78
|
+
interface FormRowSkeletonProps {
|
|
79
|
+
/** Field shape — 'input' (one-line), 'textarea' (3-line), 'select' (input + chevron) */
|
|
80
|
+
field?: 'input' | 'textarea' | 'select';
|
|
81
|
+
/** Show help text line below input @default false */
|
|
82
|
+
withHelp?: boolean;
|
|
83
|
+
className?: string;
|
|
84
|
+
}
|
|
85
|
+
declare function FormRowSkeleton({ field, withHelp, className }: FormRowSkeletonProps): react_jsx_runtime.JSX.Element;
|
|
86
|
+
declare namespace FormRowSkeleton {
|
|
87
|
+
var displayName: string;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
export { AvatarTextSkeleton, type AvatarTextSkeletonProps, CardSkeleton, type CardSkeletonProps, ChartSkeleton, type ChartSkeletonProps, FormRowSkeleton, type FormRowSkeletonProps, MetricCardSkeleton, type MetricCardSkeletonProps, Skeleton, type SkeletonProps, TableRowSkeleton, type TableRowSkeletonProps, TableSkeleton, type TableSkeletonProps };
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import * as class_variance_authority_types from 'class-variance-authority/types';
|
|
3
|
+
import * as React from 'react';
|
|
4
|
+
import { VariantProps } from 'class-variance-authority';
|
|
5
|
+
|
|
6
|
+
declare const skeletonVariants: (props?: ({
|
|
7
|
+
shape?: "circle" | "rect" | "line" | "text" | null | undefined;
|
|
8
|
+
size?: "sm" | "md" | "lg" | null | undefined;
|
|
9
|
+
} & class_variance_authority_types.ClassProp) | undefined) => string;
|
|
10
|
+
interface SkeletonProps extends React.HTMLAttributes<HTMLDivElement>, VariantProps<typeof skeletonVariants> {
|
|
11
|
+
/**
|
|
12
|
+
* تعداد عناصر skeleton برای نمایش (برای shape های line و text)
|
|
13
|
+
* Number of skeleton elements to repeat (for line/text shapes)
|
|
14
|
+
*/
|
|
15
|
+
count?: number;
|
|
16
|
+
}
|
|
17
|
+
declare function Skeleton({ className, shape, size, count, ...props }: SkeletonProps): react_jsx_runtime.JSX.Element;
|
|
18
|
+
declare namespace Skeleton {
|
|
19
|
+
var displayName: string;
|
|
20
|
+
}
|
|
21
|
+
interface MetricCardSkeletonProps {
|
|
22
|
+
className?: string;
|
|
23
|
+
}
|
|
24
|
+
declare function MetricCardSkeleton({ className }: MetricCardSkeletonProps): react_jsx_runtime.JSX.Element;
|
|
25
|
+
declare namespace MetricCardSkeleton {
|
|
26
|
+
var displayName: string;
|
|
27
|
+
}
|
|
28
|
+
interface ChartSkeletonProps {
|
|
29
|
+
className?: string;
|
|
30
|
+
}
|
|
31
|
+
declare function ChartSkeleton({ className }: ChartSkeletonProps): react_jsx_runtime.JSX.Element;
|
|
32
|
+
declare namespace ChartSkeleton {
|
|
33
|
+
var displayName: string;
|
|
34
|
+
}
|
|
35
|
+
interface TableSkeletonProps {
|
|
36
|
+
rows?: number;
|
|
37
|
+
className?: string;
|
|
38
|
+
}
|
|
39
|
+
declare function TableSkeleton({ rows, className }: TableSkeletonProps): react_jsx_runtime.JSX.Element;
|
|
40
|
+
declare namespace TableSkeleton {
|
|
41
|
+
var displayName: string;
|
|
42
|
+
}
|
|
43
|
+
interface TableRowSkeletonProps {
|
|
44
|
+
/** Number of cells in the row */
|
|
45
|
+
cells?: number;
|
|
46
|
+
className?: string;
|
|
47
|
+
}
|
|
48
|
+
declare function TableRowSkeleton({ cells, className }: TableRowSkeletonProps): react_jsx_runtime.JSX.Element;
|
|
49
|
+
declare namespace TableRowSkeleton {
|
|
50
|
+
var displayName: string;
|
|
51
|
+
}
|
|
52
|
+
interface CardSkeletonProps {
|
|
53
|
+
/** Show a leading image/thumbnail block @default false */
|
|
54
|
+
withImage?: boolean;
|
|
55
|
+
/** Aspect ratio of the image (when withImage) @default 'video' */
|
|
56
|
+
imageAspect?: 'video' | 'square' | 'wide';
|
|
57
|
+
/** Number of body lines @default 2 */
|
|
58
|
+
bodyLines?: number;
|
|
59
|
+
/** Show a footer row (button-shaped placeholder) @default false */
|
|
60
|
+
withFooter?: boolean;
|
|
61
|
+
className?: string;
|
|
62
|
+
}
|
|
63
|
+
declare function CardSkeleton({ withImage, imageAspect, bodyLines, withFooter, className, }: CardSkeletonProps): react_jsx_runtime.JSX.Element;
|
|
64
|
+
declare namespace CardSkeleton {
|
|
65
|
+
var displayName: string;
|
|
66
|
+
}
|
|
67
|
+
interface AvatarTextSkeletonProps {
|
|
68
|
+
/** Avatar size @default 'md' */
|
|
69
|
+
size?: 'sm' | 'md' | 'lg';
|
|
70
|
+
/** Number of text lines beside the avatar @default 2 */
|
|
71
|
+
lines?: number;
|
|
72
|
+
className?: string;
|
|
73
|
+
}
|
|
74
|
+
declare function AvatarTextSkeleton({ size, lines, className }: AvatarTextSkeletonProps): react_jsx_runtime.JSX.Element;
|
|
75
|
+
declare namespace AvatarTextSkeleton {
|
|
76
|
+
var displayName: string;
|
|
77
|
+
}
|
|
78
|
+
interface FormRowSkeletonProps {
|
|
79
|
+
/** Field shape — 'input' (one-line), 'textarea' (3-line), 'select' (input + chevron) */
|
|
80
|
+
field?: 'input' | 'textarea' | 'select';
|
|
81
|
+
/** Show help text line below input @default false */
|
|
82
|
+
withHelp?: boolean;
|
|
83
|
+
className?: string;
|
|
84
|
+
}
|
|
85
|
+
declare function FormRowSkeleton({ field, withHelp, className }: FormRowSkeletonProps): react_jsx_runtime.JSX.Element;
|
|
86
|
+
declare namespace FormRowSkeleton {
|
|
87
|
+
var displayName: string;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
export { AvatarTextSkeleton, type AvatarTextSkeletonProps, CardSkeleton, type CardSkeletonProps, ChartSkeleton, type ChartSkeletonProps, FormRowSkeleton, type FormRowSkeletonProps, MetricCardSkeleton, type MetricCardSkeletonProps, Skeleton, type SkeletonProps, TableRowSkeleton, type TableRowSkeletonProps, TableSkeleton, type TableSkeletonProps };
|
|
@@ -1,7 +1,12 @@
|
|
|
1
|
-
|
|
1
|
+
'use client';
|
|
2
2
|
import { cva } from 'class-variance-authority';
|
|
3
|
+
import { clsx } from 'clsx';
|
|
4
|
+
import { twMerge } from 'tailwind-merge';
|
|
3
5
|
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
4
6
|
|
|
7
|
+
function cn(...inputs) {
|
|
8
|
+
return twMerge(clsx(inputs));
|
|
9
|
+
}
|
|
5
10
|
var skeletonVariants = cva("bg-accent animate-pulse", {
|
|
6
11
|
variants: {
|
|
7
12
|
shape: {
|
|
@@ -207,5 +212,5 @@ function FormRowSkeleton({ field = "input", withHelp = false, className }) {
|
|
|
207
212
|
FormRowSkeleton.displayName = "FormRowSkeleton";
|
|
208
213
|
|
|
209
214
|
export { AvatarTextSkeleton, CardSkeleton, ChartSkeleton, FormRowSkeleton, MetricCardSkeleton, Skeleton, TableRowSkeleton, TableSkeleton };
|
|
210
|
-
//# sourceMappingURL=
|
|
211
|
-
//# sourceMappingURL=
|
|
215
|
+
//# sourceMappingURL=skeleton.js.map
|
|
216
|
+
//# sourceMappingURL=skeleton.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/lib/utils.ts","../../../src/components/ui/skeleton.tsx"],"names":[],"mappings":"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","file":"skeleton.js","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","'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"]}
|