@arolariu/components 0.4.2 → 1.0.0
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/{changelog.md → CHANGELOG.md} +36 -0
- package/CONTRIBUTING.md +344 -265
- package/DEBUGGING.md +185 -103
- package/EXAMPLES.md +470 -345
- package/{readme.md → README.md} +306 -203
- package/dist/components/ui/accordion.d.ts +157 -5
- package/dist/components/ui/accordion.d.ts.map +1 -1
- package/dist/components/ui/accordion.js +100 -22
- package/dist/components/ui/accordion.js.map +1 -1
- package/dist/components/ui/accordion.module.js +12 -0
- package/dist/components/ui/accordion.module.js.map +1 -0
- package/dist/components/ui/accordion_module.css +72 -0
- package/dist/components/ui/accordion_module.css.map +1 -0
- package/dist/components/ui/alert-dialog.d.ts +321 -18
- package/dist/components/ui/alert-dialog.d.ts.map +1 -1
- package/dist/components/ui/alert-dialog.js +145 -52
- package/dist/components/ui/alert-dialog.js.map +1 -1
- package/dist/components/ui/alert-dialog.module.js +13 -0
- package/dist/components/ui/alert-dialog.module.js.map +1 -0
- package/dist/components/ui/alert-dialog_module.css +89 -0
- package/dist/components/ui/alert-dialog_module.css.map +1 -0
- package/dist/components/ui/alert.d.ts +109 -6
- package/dist/components/ui/alert.d.ts.map +1 -1
- package/dist/components/ui/alert.js +12 -21
- package/dist/components/ui/alert.js.map +1 -1
- package/dist/components/ui/alert.module.js +11 -0
- package/dist/components/ui/alert.module.js.map +1 -0
- package/dist/components/ui/alert_module.css +59 -0
- package/dist/components/ui/alert_module.css.map +1 -0
- package/dist/components/ui/aspect-ratio.d.ts +24 -2
- package/dist/components/ui/aspect-ratio.d.ts.map +1 -1
- package/dist/components/ui/aspect-ratio.js +14 -3
- package/dist/components/ui/aspect-ratio.js.map +1 -1
- package/dist/components/ui/aspect-ratio.module.js +7 -0
- package/dist/components/ui/aspect-ratio.module.js.map +1 -0
- package/dist/components/ui/aspect-ratio_module.css +10 -0
- package/dist/components/ui/aspect-ratio_module.css.map +1 -0
- package/dist/components/ui/async-boundary.js +17 -0
- package/dist/components/ui/async-boundary.js.map +1 -0
- package/dist/components/ui/avatar.d.ts +97 -4
- package/dist/components/ui/avatar.d.ts.map +1 -1
- package/dist/components/ui/avatar.js +50 -21
- package/dist/components/ui/avatar.js.map +1 -1
- package/dist/components/ui/avatar.module.js +9 -0
- package/dist/components/ui/avatar.module.js.map +1 -0
- package/dist/components/ui/avatar_module.css +35 -0
- package/dist/components/ui/avatar_module.css.map +1 -0
- package/dist/components/ui/background-beams.d.ts +21 -3
- package/dist/components/ui/background-beams.d.ts.map +1 -1
- package/dist/components/ui/background-beams.js +22 -11
- package/dist/components/ui/background-beams.js.map +1 -1
- package/dist/components/ui/background-beams.module.js +8 -0
- package/dist/components/ui/background-beams.module.js.map +1 -0
- package/dist/components/ui/background-beams_module.css +22 -0
- package/dist/components/ui/background-beams_module.css.map +1 -0
- package/dist/components/ui/badge.d.ts +79 -6
- package/dist/components/ui/badge.d.ts.map +1 -1
- package/dist/components/ui/badge.js +19 -23
- package/dist/components/ui/badge.js.map +1 -1
- package/dist/components/ui/badge.module.js +11 -0
- package/dist/components/ui/badge.module.js.map +1 -0
- package/dist/components/ui/badge_module.css +63 -0
- package/dist/components/ui/badge_module.css.map +1 -0
- package/dist/components/ui/breadcrumb.d.ts +158 -13
- package/dist/components/ui/breadcrumb.d.ts.map +1 -1
- package/dist/components/ui/breadcrumb.js +39 -30
- package/dist/components/ui/breadcrumb.js.map +1 -1
- package/dist/components/ui/breadcrumb.module.js +14 -0
- package/dist/components/ui/breadcrumb.module.js.map +1 -0
- package/dist/components/ui/breadcrumb_module.css +90 -0
- package/dist/components/ui/breadcrumb_module.css.map +1 -0
- package/dist/components/ui/bubble-background.d.ts +38 -10
- package/dist/components/ui/bubble-background.d.ts.map +1 -1
- package/dist/components/ui/bubble-background.js +33 -35
- package/dist/components/ui/bubble-background.js.map +1 -1
- package/dist/components/ui/bubble-background.module.js +20 -0
- package/dist/components/ui/bubble-background.module.js.map +1 -0
- package/dist/components/ui/bubble-background_module.css +99 -0
- package/dist/components/ui/bubble-background_module.css.map +1 -0
- package/dist/components/ui/button-group.d.ts +88 -8
- package/dist/components/ui/button-group.d.ts.map +1 -1
- package/dist/components/ui/button-group.js +35 -32
- package/dist/components/ui/button-group.js.map +1 -1
- package/dist/components/ui/button-group.module.js +11 -0
- package/dist/components/ui/button-group.module.js.map +1 -0
- package/dist/components/ui/button-group_module.css +79 -0
- package/dist/components/ui/button-group_module.css.map +1 -0
- package/dist/components/ui/button.d.ts +82 -7
- package/dist/components/ui/button.d.ts.map +1 -1
- package/dist/components/ui/button.js +69 -34
- package/dist/components/ui/button.js.map +1 -1
- package/dist/components/ui/button.module.js +17 -0
- package/dist/components/ui/button.module.js.map +1 -0
- package/dist/components/ui/button_module.css +137 -0
- package/dist/components/ui/button_module.css.map +1 -0
- package/dist/components/ui/calendar.d.ts +39 -5
- package/dist/components/ui/calendar.d.ts.map +1 -1
- package/dist/components/ui/calendar.js +72 -61
- package/dist/components/ui/calendar.js.map +1 -1
- package/dist/components/ui/calendar.module.js +35 -0
- package/dist/components/ui/calendar.module.js.map +1 -0
- package/dist/components/ui/calendar_module.css +245 -0
- package/dist/components/ui/calendar_module.css.map +1 -0
- package/dist/components/ui/card-skeleton.js +41 -0
- package/dist/components/ui/card-skeleton.js.map +1 -0
- package/dist/components/ui/card-skeleton.module.js +15 -0
- package/dist/components/ui/card-skeleton.module.js.map +1 -0
- package/dist/components/ui/card-skeleton_module.css +54 -0
- package/dist/components/ui/card-skeleton_module.css.map +1 -0
- package/dist/components/ui/card.d.ts +162 -7
- package/dist/components/ui/card.d.ts.map +1 -1
- package/dist/components/ui/card.js +13 -13
- package/dist/components/ui/card.js.map +1 -1
- package/dist/components/ui/card.module.js +13 -0
- package/dist/components/ui/card.module.js.map +1 -0
- package/dist/components/ui/card_module.css +43 -0
- package/dist/components/ui/card_module.css.map +1 -0
- package/dist/components/ui/carousel.d.ts +127 -3
- package/dist/components/ui/carousel.d.ts.map +1 -1
- package/dist/components/ui/carousel.js +63 -36
- package/dist/components/ui/carousel.js.map +1 -1
- package/dist/components/ui/carousel.module.js +17 -0
- package/dist/components/ui/carousel.module.js.map +1 -0
- package/dist/components/ui/carousel_module.css +82 -0
- package/dist/components/ui/carousel_module.css.map +1 -0
- package/dist/components/ui/chart.d.ts +323 -13
- package/dist/components/ui/chart.d.ts.map +1 -1
- package/dist/components/ui/chart.js +158 -53
- package/dist/components/ui/chart.js.map +1 -1
- package/dist/components/ui/chart.module.js +27 -0
- package/dist/components/ui/chart.module.js.map +1 -0
- package/dist/components/ui/chart_module.css +159 -0
- package/dist/components/ui/chart_module.css.map +1 -0
- package/dist/components/ui/checkbox-group.d.ts +31 -0
- package/dist/components/ui/checkbox-group.d.ts.map +1 -0
- package/dist/components/ui/checkbox-group.js +25 -0
- package/dist/components/ui/checkbox-group.js.map +1 -0
- package/dist/components/ui/checkbox-group.module.js +7 -0
- package/dist/components/ui/checkbox-group.module.js.map +1 -0
- package/dist/components/ui/checkbox-group_module.css +11 -0
- package/dist/components/ui/checkbox-group_module.css.map +1 -0
- package/dist/components/ui/checkbox.d.ts +33 -2
- package/dist/components/ui/checkbox.d.ts.map +1 -1
- package/dist/components/ui/checkbox.js +37 -12
- package/dist/components/ui/checkbox.js.map +1 -1
- package/dist/components/ui/checkbox.module.js +8 -0
- package/dist/components/ui/checkbox.module.js.map +1 -0
- package/dist/components/ui/checkbox_module.css +45 -0
- package/dist/components/ui/checkbox_module.css.map +1 -0
- package/dist/components/ui/collapsible.d.ts +87 -3
- package/dist/components/ui/collapsible.d.ts.map +1 -1
- package/dist/components/ui/collapsible.js +46 -32
- package/dist/components/ui/collapsible.js.map +1 -1
- package/dist/components/ui/collapsible.module.js +8 -0
- package/dist/components/ui/collapsible.module.js.map +1 -0
- package/dist/components/ui/collapsible_module.css +26 -0
- package/dist/components/ui/collapsible_module.css.map +1 -0
- package/dist/components/ui/command.d.ts +284 -51
- package/dist/components/ui/command.d.ts.map +1 -1
- package/dist/components/ui/command.js +391 -50
- package/dist/components/ui/command.js.map +1 -1
- package/dist/components/ui/command.module.js +20 -0
- package/dist/components/ui/command.module.js.map +1 -0
- package/dist/components/ui/command_module.css +194 -0
- package/dist/components/ui/command_module.css.map +1 -0
- package/dist/components/ui/context-menu.d.ts +414 -21
- package/dist/components/ui/context-menu.d.ts.map +1 -1
- package/dist/components/ui/context-menu.js +190 -68
- package/dist/components/ui/context-menu.js.map +1 -1
- package/dist/components/ui/context-menu.module.js +19 -0
- package/dist/components/ui/context-menu.module.js.map +1 -0
- package/dist/components/ui/context-menu_module.css +114 -0
- package/dist/components/ui/context-menu_module.css.map +1 -0
- package/dist/components/ui/copy-button.d.ts +41 -0
- package/dist/components/ui/copy-button.d.ts.map +1 -0
- package/dist/components/ui/copy-button.js +51 -0
- package/dist/components/ui/copy-button.js.map +1 -0
- package/dist/components/ui/copy-button.module.js +8 -0
- package/dist/components/ui/copy-button.module.js.map +1 -0
- package/dist/components/ui/copy-button_module.css +37 -0
- package/dist/components/ui/copy-button_module.css.map +1 -0
- package/dist/components/ui/counting-number.d.ts +28 -2
- package/dist/components/ui/counting-number.d.ts.map +1 -1
- package/dist/components/ui/counting-number.js +31 -27
- package/dist/components/ui/counting-number.js.map +1 -1
- package/dist/components/ui/counting-number.module.js +7 -0
- package/dist/components/ui/counting-number.module.js.map +1 -0
- package/dist/components/ui/counting-number_module.css +7 -0
- package/dist/components/ui/counting-number_module.css.map +1 -0
- package/dist/components/ui/dialog.d.ts +287 -17
- package/dist/components/ui/dialog.d.ts.map +1 -1
- package/dist/components/ui/dialog.js +129 -52
- package/dist/components/ui/dialog.js.map +1 -1
- package/dist/components/ui/dialog.module.js +13 -0
- package/dist/components/ui/dialog.module.js.map +1 -0
- package/dist/components/ui/dialog_module.css +114 -0
- package/dist/components/ui/dialog_module.css.map +1 -0
- package/dist/components/ui/dot-background.d.ts +25 -35
- package/dist/components/ui/dot-background.d.ts.map +1 -1
- package/dist/components/ui/dot-background.js +31 -22
- package/dist/components/ui/dot-background.js.map +1 -1
- package/dist/components/ui/dot-background.module.js +8 -0
- package/dist/components/ui/dot-background.module.js.map +1 -0
- package/dist/components/ui/dot-background_module.css +15 -0
- package/dist/components/ui/dot-background_module.css.map +1 -0
- package/dist/components/ui/drawer.d.ts +287 -18
- package/dist/components/ui/drawer.d.ts.map +1 -1
- package/dist/components/ui/drawer.js +117 -40
- package/dist/components/ui/drawer.js.map +1 -1
- package/dist/components/ui/drawer.module.js +14 -0
- package/dist/components/ui/drawer.module.js.map +1 -0
- package/dist/components/ui/drawer_module.css +86 -0
- package/dist/components/ui/drawer_module.css.map +1 -0
- package/dist/components/ui/dropdown-menu.d.ts +414 -21
- package/dist/components/ui/dropdown-menu.d.ts.map +1 -1
- package/dist/components/ui/dropdown-menu.js +189 -68
- package/dist/components/ui/dropdown-menu.js.map +1 -1
- package/dist/components/ui/dropdown-menu.module.js +19 -0
- package/dist/components/ui/dropdown-menu.module.js.map +1 -0
- package/dist/components/ui/dropdown-menu_module.css +114 -0
- package/dist/components/ui/dropdown-menu_module.css.map +1 -0
- package/dist/components/ui/dropdrawer.d.ts +313 -17
- package/dist/components/ui/dropdrawer.d.ts.map +1 -1
- package/dist/components/ui/dropdrawer.js +423 -159
- package/dist/components/ui/dropdrawer.js.map +1 -1
- package/dist/components/ui/dropdrawer.module.js +43 -0
- package/dist/components/ui/dropdrawer.module.js.map +1 -0
- package/dist/components/ui/dropdrawer_module.css +307 -0
- package/dist/components/ui/dropdrawer_module.css.map +1 -0
- package/dist/components/ui/empty.d.ts +129 -10
- package/dist/components/ui/empty.d.ts.map +1 -1
- package/dist/components/ui/empty.js +32 -47
- package/dist/components/ui/empty.js.map +1 -1
- package/dist/components/ui/empty.module.js +13 -0
- package/dist/components/ui/empty.module.js.map +1 -0
- package/dist/components/ui/empty_module.css +85 -0
- package/dist/components/ui/empty_module.css.map +1 -0
- package/dist/components/ui/error-boundary.js +61 -0
- package/dist/components/ui/error-boundary.js.map +1 -0
- package/dist/components/ui/error-boundary.module.js +10 -0
- package/dist/components/ui/error-boundary.module.js.map +1 -0
- package/dist/components/ui/error-boundary_module.css +41 -0
- package/dist/components/ui/error-boundary_module.css.map +1 -0
- package/dist/components/ui/field.d.ts +225 -0
- package/dist/components/ui/field.d.ts.map +1 -0
- package/dist/components/ui/field.js +76 -86
- package/dist/components/ui/field.js.map +1 -1
- package/dist/components/ui/field.module.js +24 -0
- package/dist/components/ui/field.module.js.map +1 -0
- package/dist/components/ui/field_module.css +185 -0
- package/dist/components/ui/field_module.css.map +1 -0
- package/dist/components/ui/fireworks-background.d.ts +27 -3
- package/dist/components/ui/fireworks-background.d.ts.map +1 -1
- package/dist/components/ui/fireworks-background.js +36 -35
- package/dist/components/ui/fireworks-background.js.map +1 -1
- package/dist/components/ui/fireworks-background.module.js +8 -0
- package/dist/components/ui/fireworks-background.module.js.map +1 -0
- package/dist/components/ui/fireworks-background_module.css +17 -0
- package/dist/components/ui/fireworks-background_module.css.map +1 -0
- package/dist/components/ui/flip-button.d.ts +27 -3
- package/dist/components/ui/flip-button.d.ts.map +1 -1
- package/dist/components/ui/flip-button.js +27 -17
- package/dist/components/ui/flip-button.js.map +1 -1
- package/dist/components/ui/flip-button.module.js +11 -0
- package/dist/components/ui/flip-button.module.js.map +1 -0
- package/dist/components/ui/flip-button_module.css +47 -0
- package/dist/components/ui/flip-button_module.css.map +1 -0
- package/dist/components/ui/focus-scope.js +70 -0
- package/dist/components/ui/focus-scope.js.map +1 -0
- package/dist/components/ui/focus-scope.module.js +7 -0
- package/dist/components/ui/focus-scope.module.js.map +1 -0
- package/dist/components/ui/focus-scope_module.css +6 -0
- package/dist/components/ui/focus-scope_module.css.map +1 -0
- package/dist/components/ui/form-skeleton.js +32 -0
- package/dist/components/ui/form-skeleton.js.map +1 -0
- package/dist/components/ui/form-skeleton.module.js +11 -0
- package/dist/components/ui/form-skeleton.module.js.map +1 -0
- package/dist/components/ui/form-skeleton_module.css +30 -0
- package/dist/components/ui/form-skeleton_module.css.map +1 -0
- package/dist/components/ui/form.d.ts +143 -13
- package/dist/components/ui/form.d.ts.map +1 -1
- package/dist/components/ui/form.js +55 -21
- package/dist/components/ui/form.js.map +1 -1
- package/dist/components/ui/form.module.js +10 -0
- package/dist/components/ui/form.module.js.map +1 -0
- package/dist/components/ui/form_module.css +22 -0
- package/dist/components/ui/form_module.css.map +1 -0
- package/dist/components/ui/gradient-background.d.ts +21 -3
- package/dist/components/ui/gradient-background.d.ts.map +1 -1
- package/dist/components/ui/gradient-background.js +8 -4
- package/dist/components/ui/gradient-background.js.map +1 -1
- package/dist/components/ui/gradient-background.module.js +7 -0
- package/dist/components/ui/gradient-background.module.js.map +1 -0
- package/dist/components/ui/gradient-background_module.css +9 -0
- package/dist/components/ui/gradient-background_module.css.map +1 -0
- package/dist/components/ui/gradient-text.d.ts +23 -2
- package/dist/components/ui/gradient-text.d.ts.map +1 -1
- package/dist/components/ui/gradient-text.js +8 -6
- package/dist/components/ui/gradient-text.js.map +1 -1
- package/dist/components/ui/gradient-text.module.js +9 -0
- package/dist/components/ui/gradient-text.module.js.map +1 -0
- package/dist/components/ui/gradient-text_module.css +24 -0
- package/dist/components/ui/gradient-text_module.css.map +1 -0
- package/dist/components/ui/highlight-text.d.ts +24 -2
- package/dist/components/ui/highlight-text.d.ts.map +1 -1
- package/dist/components/ui/highlight-text.js +7 -10
- package/dist/components/ui/highlight-text.js.map +1 -1
- package/dist/components/ui/highlight-text.module.js +7 -0
- package/dist/components/ui/highlight-text.module.js.map +1 -0
- package/dist/components/ui/highlight-text_module.css +16 -0
- package/dist/components/ui/highlight-text_module.css.map +1 -0
- package/dist/components/ui/hole-background.d.ts +23 -2
- package/dist/components/ui/hole-background.d.ts.map +1 -1
- package/dist/components/ui/hole-background.js +155 -118
- package/dist/components/ui/hole-background.js.map +1 -1
- package/dist/components/ui/hole-background.module.js +10 -0
- package/dist/components/ui/hole-background.module.js.map +1 -0
- package/dist/components/ui/hole-background_module.css +85 -0
- package/dist/components/ui/hole-background_module.css.map +1 -0
- package/dist/components/ui/hover-card.d.ts +85 -4
- package/dist/components/ui/hover-card.d.ts.map +1 -1
- package/dist/components/ui/hover-card.js +52 -10
- package/dist/components/ui/hover-card.js.map +1 -1
- package/dist/components/ui/hover-card.module.js +8 -0
- package/dist/components/ui/hover-card.module.js.map +1 -0
- package/dist/components/ui/hover-card_module.css +23 -0
- package/dist/components/ui/hover-card_module.css.map +1 -0
- package/dist/components/ui/input-group.d.ts +132 -13
- package/dist/components/ui/input-group.d.ts.map +1 -1
- package/dist/components/ui/input-group.js +62 -66
- package/dist/components/ui/input-group.js.map +1 -1
- package/dist/components/ui/input-group.module.js +20 -0
- package/dist/components/ui/input-group.module.js.map +1 -0
- package/dist/components/ui/input-group_module.css +150 -0
- package/dist/components/ui/input-group_module.css.map +1 -0
- package/dist/components/ui/input-otp.d.ts +110 -30
- package/dist/components/ui/input-otp.d.ts.map +1 -1
- package/dist/components/ui/input-otp.js +24 -15
- package/dist/components/ui/input-otp.js.map +1 -1
- package/dist/components/ui/input-otp.module.js +17 -0
- package/dist/components/ui/input-otp.module.js.map +1 -0
- package/dist/components/ui/input-otp_module.css +89 -0
- package/dist/components/ui/input-otp_module.css.map +1 -0
- package/dist/components/ui/input.d.ts +31 -1
- package/dist/components/ui/input.d.ts.map +1 -1
- package/dist/components/ui/input.js +21 -8
- package/dist/components/ui/input.js.map +1 -1
- package/dist/components/ui/input.module.js +7 -0
- package/dist/components/ui/input.module.js.map +1 -0
- package/dist/components/ui/input_module.css +40 -0
- package/dist/components/ui/input_module.css.map +1 -0
- package/dist/components/ui/item.d.ts +221 -19
- package/dist/components/ui/item.d.ts.map +1 -1
- package/dist/components/ui/item.js +66 -90
- package/dist/components/ui/item.js.map +1 -1
- package/dist/components/ui/item.module.js +22 -0
- package/dist/components/ui/item.module.js.map +1 -0
- package/dist/components/ui/item_module.css +143 -0
- package/dist/components/ui/item_module.css.map +1 -0
- package/dist/components/ui/kbd.d.ts +43 -2
- package/dist/components/ui/kbd.d.ts.map +1 -1
- package/dist/components/ui/kbd.js +12 -12
- package/dist/components/ui/kbd.js.map +1 -1
- package/dist/components/ui/kbd.module.js +8 -0
- package/dist/components/ui/kbd.module.js.map +1 -0
- package/dist/components/ui/kbd_module.css +35 -0
- package/dist/components/ui/kbd_module.css.map +1 -0
- package/dist/components/ui/label.d.ts +30 -3
- package/dist/components/ui/label.d.ts.map +1 -1
- package/dist/components/ui/label.js +7 -8
- package/dist/components/ui/label.js.map +1 -1
- package/dist/components/ui/label.module.js +7 -0
- package/dist/components/ui/label.module.js.map +1 -0
- package/dist/components/ui/label_module.css +17 -0
- package/dist/components/ui/label_module.css.map +1 -0
- package/dist/components/ui/list-skeleton.js +35 -0
- package/dist/components/ui/list-skeleton.js.map +1 -0
- package/dist/components/ui/list-skeleton.module.js +12 -0
- package/dist/components/ui/list-skeleton.module.js.map +1 -0
- package/dist/components/ui/list-skeleton_module.css +39 -0
- package/dist/components/ui/list-skeleton_module.css.map +1 -0
- package/dist/components/ui/loading-overlay.js +21 -0
- package/dist/components/ui/loading-overlay.js.map +1 -0
- package/dist/components/ui/loading-overlay.module.js +9 -0
- package/dist/components/ui/loading-overlay.module.js.map +1 -0
- package/dist/components/ui/loading-overlay_module.css +22 -0
- package/dist/components/ui/loading-overlay_module.css.map +1 -0
- package/dist/components/ui/menubar.d.ts +422 -22
- package/dist/components/ui/menubar.d.ts.map +1 -1
- package/dist/components/ui/menubar.js +199 -100
- package/dist/components/ui/menubar.js.map +1 -1
- package/dist/components/ui/menubar.module.js +21 -0
- package/dist/components/ui/menubar.module.js.map +1 -0
- package/dist/components/ui/menubar_module.css +145 -0
- package/dist/components/ui/menubar_module.css.map +1 -0
- package/dist/components/ui/meter.d.ts +101 -0
- package/dist/components/ui/meter.d.ts.map +1 -0
- package/dist/components/ui/meter.js +71 -0
- package/dist/components/ui/meter.js.map +1 -0
- package/dist/components/ui/meter.module.js +10 -0
- package/dist/components/ui/meter.module.js.map +1 -0
- package/dist/components/ui/meter_module.css +31 -0
- package/dist/components/ui/meter_module.css.map +1 -0
- package/dist/components/ui/navigation-menu.d.ts +242 -11
- package/dist/components/ui/navigation-menu.d.ts.map +1 -1
- package/dist/components/ui/navigation-menu.js +135 -49
- package/dist/components/ui/navigation-menu.js.map +1 -1
- package/dist/components/ui/navigation-menu.module.js +18 -0
- package/dist/components/ui/navigation-menu.module.js.map +1 -0
- package/dist/components/ui/navigation-menu_module.css +112 -0
- package/dist/components/ui/navigation-menu_module.css.map +1 -0
- package/dist/components/ui/number-field.d.ts +144 -0
- package/dist/components/ui/number-field.d.ts.map +1 -0
- package/dist/components/ui/number-field.js +111 -0
- package/dist/components/ui/number-field.js.map +1 -0
- package/dist/components/ui/number-field.module.js +15 -0
- package/dist/components/ui/number-field.module.js.map +1 -0
- package/dist/components/ui/number-field_module.css +125 -0
- package/dist/components/ui/number-field_module.css.map +1 -0
- package/dist/components/ui/pagination.d.ts +150 -24
- package/dist/components/ui/pagination.d.ts.map +1 -1
- package/dist/components/ui/pagination.js +41 -38
- package/dist/components/ui/pagination.js.map +1 -1
- package/dist/components/ui/pagination.module.js +14 -0
- package/dist/components/ui/pagination.module.js.map +1 -0
- package/dist/components/ui/pagination_module.css +66 -0
- package/dist/components/ui/pagination_module.css.map +1 -0
- package/dist/components/ui/popover.d.ts +133 -5
- package/dist/components/ui/popover.d.ts.map +1 -1
- package/dist/components/ui/popover.js +68 -14
- package/dist/components/ui/popover.js.map +1 -1
- package/dist/components/ui/popover.module.js +9 -0
- package/dist/components/ui/popover.module.js.map +1 -0
- package/dist/components/ui/popover_module.css +28 -0
- package/dist/components/ui/popover_module.css.map +1 -0
- package/dist/components/ui/progress.d.ts +34 -2
- package/dist/components/ui/progress.d.ts.map +1 -1
- package/dist/components/ui/progress.js +22 -14
- package/dist/components/ui/progress.js.map +1 -1
- package/dist/components/ui/progress.module.js +8 -0
- package/dist/components/ui/progress.module.js.map +1 -0
- package/dist/components/ui/progress_module.css +20 -0
- package/dist/components/ui/progress_module.css.map +1 -0
- package/dist/components/ui/radio-group.d.ts +44 -3
- package/dist/components/ui/radio-group.d.ts.map +1 -1
- package/dist/components/ui/radio-group.js +38 -16
- package/dist/components/ui/radio-group.js.map +1 -1
- package/dist/components/ui/radio-group.module.js +10 -0
- package/dist/components/ui/radio-group.module.js.map +1 -0
- package/dist/components/ui/radio-group_module.css +44 -0
- package/dist/components/ui/radio-group_module.css.map +1 -0
- package/dist/components/ui/resizable.d.ts +79 -6
- package/dist/components/ui/resizable.d.ts.map +1 -1
- package/dist/components/ui/resizable.js +23 -13
- package/dist/components/ui/resizable.js.map +1 -1
- package/dist/components/ui/resizable.module.js +10 -0
- package/dist/components/ui/resizable.module.js.map +1 -0
- package/dist/components/ui/resizable_module.css +70 -0
- package/dist/components/ui/resizable_module.css.map +1 -0
- package/dist/components/ui/ripple-button.d.ts +23 -2
- package/dist/components/ui/ripple-button.d.ts.map +1 -1
- package/dist/components/ui/ripple-button.js +26 -11
- package/dist/components/ui/ripple-button.js.map +1 -1
- package/dist/components/ui/ripple-button.module.js +9 -0
- package/dist/components/ui/ripple-button.module.js.map +1 -0
- package/dist/components/ui/ripple-button_module.css +38 -0
- package/dist/components/ui/ripple-button_module.css.map +1 -0
- package/dist/components/ui/scratcher.d.ts +25 -2
- package/dist/components/ui/scratcher.d.ts.map +1 -1
- package/dist/components/ui/scratcher.js +85 -87
- package/dist/components/ui/scratcher.js.map +1 -1
- package/dist/components/ui/scratcher.module.js +8 -0
- package/dist/components/ui/scratcher.module.js.map +1 -0
- package/dist/components/ui/scratcher_module.css +13 -0
- package/dist/components/ui/scratcher_module.css.map +1 -0
- package/dist/components/ui/scroll-area.d.ts +46 -3
- package/dist/components/ui/scroll-area.d.ts.map +1 -1
- package/dist/components/ui/scroll-area.js +44 -19
- package/dist/components/ui/scroll-area.js.map +1 -1
- package/dist/components/ui/scroll-area.module.js +14 -0
- package/dist/components/ui/scroll-area.module.js.map +1 -0
- package/dist/components/ui/scroll-area_module.css +51 -0
- package/dist/components/ui/scroll-area_module.css.map +1 -0
- package/dist/components/ui/select.d.ts +269 -11
- package/dist/components/ui/select.d.ts.map +1 -1
- package/dist/components/ui/select.js +152 -67
- package/dist/components/ui/select.js.map +1 -1
- package/dist/components/ui/select.module.js +20 -0
- package/dist/components/ui/select.module.js.map +1 -0
- package/dist/components/ui/select_module.css +134 -0
- package/dist/components/ui/select_module.css.map +1 -0
- package/dist/components/ui/separator.d.ts +36 -2
- package/dist/components/ui/separator.d.ts.map +1 -1
- package/dist/components/ui/separator.js +20 -10
- package/dist/components/ui/separator.js.map +1 -1
- package/dist/components/ui/separator.module.js +9 -0
- package/dist/components/ui/separator.module.js.map +1 -0
- package/dist/components/ui/separator_module.css +17 -0
- package/dist/components/ui/separator_module.css.map +1 -0
- package/dist/components/ui/sheet.d.ts +297 -23
- package/dist/components/ui/sheet.d.ts.map +1 -1
- package/dist/components/ui/sheet.js +121 -63
- package/dist/components/ui/sheet.js.map +1 -1
- package/dist/components/ui/sheet.module.js +18 -0
- package/dist/components/ui/sheet.module.js.map +1 -0
- package/dist/components/ui/sheet_module.css +136 -0
- package/dist/components/ui/sheet_module.css.map +1 -0
- package/dist/components/ui/sidebar.d.ts +491 -23
- package/dist/components/ui/sidebar.d.ts.map +1 -1
- package/dist/components/ui/sidebar.js +214 -143
- package/dist/components/ui/sidebar.js.map +1 -1
- package/dist/components/ui/sidebar.module.js +50 -0
- package/dist/components/ui/sidebar.module.js.map +1 -0
- package/dist/components/ui/sidebar_module.css +569 -0
- package/dist/components/ui/sidebar_module.css.map +1 -0
- package/dist/components/ui/skeleton.d.ts +30 -1
- package/dist/components/ui/skeleton.d.ts.map +1 -1
- package/dist/components/ui/skeleton.js +7 -7
- package/dist/components/ui/skeleton.js.map +1 -1
- package/dist/components/ui/skeleton.module.js +8 -0
- package/dist/components/ui/skeleton.module.js.map +1 -0
- package/dist/components/ui/skeleton_module.css +18 -0
- package/dist/components/ui/skeleton_module.css.map +1 -0
- package/dist/components/ui/slider.d.ts +48 -2
- package/dist/components/ui/slider.d.ts.map +1 -1
- package/dist/components/ui/slider.js +44 -17
- package/dist/components/ui/slider.js.map +1 -1
- package/dist/components/ui/slider.module.js +11 -0
- package/dist/components/ui/slider.module.js.map +1 -0
- package/dist/components/ui/slider_module.css +55 -0
- package/dist/components/ui/slider_module.css.map +1 -0
- package/dist/components/ui/sonner.d.ts +137 -4
- package/dist/components/ui/sonner.d.ts.map +1 -1
- package/dist/components/ui/sonner.js +450 -18
- package/dist/components/ui/sonner.js.map +1 -1
- package/dist/components/ui/sonner.module.js +34 -0
- package/dist/components/ui/sonner.module.js.map +1 -0
- package/dist/components/ui/sonner_module.css +233 -0
- package/dist/components/ui/sonner_module.css.map +1 -0
- package/dist/components/ui/spinner.d.ts +20 -1
- package/dist/components/ui/spinner.d.ts.map +1 -1
- package/dist/components/ui/spinner.js +29 -11
- package/dist/components/ui/spinner.js.map +1 -1
- package/dist/components/ui/spinner.module.js +10 -0
- package/dist/components/ui/spinner.module.js.map +1 -0
- package/dist/components/ui/spinner_module.css +28 -0
- package/dist/components/ui/spinner_module.css.map +1 -0
- package/dist/components/ui/stepper.d.ts +48 -0
- package/dist/components/ui/stepper.d.ts.map +1 -0
- package/dist/components/ui/stepper.js +41 -0
- package/dist/components/ui/stepper.js.map +1 -0
- package/dist/components/ui/stepper.module.js +12 -0
- package/dist/components/ui/stepper.module.js.map +1 -0
- package/dist/components/ui/stepper_module.css +75 -0
- package/dist/components/ui/stepper_module.css.map +1 -0
- package/dist/components/ui/switch.d.ts +29 -2
- package/dist/components/ui/switch.d.ts.map +1 -1
- package/dist/components/ui/switch.js +21 -9
- package/dist/components/ui/switch.js.map +1 -1
- package/dist/components/ui/switch.module.js +8 -0
- package/dist/components/ui/switch.module.js.map +1 -0
- package/dist/components/ui/switch_module.css +45 -0
- package/dist/components/ui/switch_module.css.map +1 -0
- package/dist/components/ui/table-skeleton.js +34 -0
- package/dist/components/ui/table-skeleton.js.map +1 -0
- package/dist/components/ui/table-skeleton.module.js +11 -0
- package/dist/components/ui/table-skeleton.module.js.map +1 -0
- package/dist/components/ui/table-skeleton_module.css +32 -0
- package/dist/components/ui/table-skeleton_module.css.map +1 -0
- package/dist/components/ui/table.d.ts +170 -8
- package/dist/components/ui/table.d.ts.map +1 -1
- package/dist/components/ui/table.js +17 -17
- package/dist/components/ui/table.js.map +1 -1
- package/dist/components/ui/table.module.js +15 -0
- package/dist/components/ui/table.module.js.map +1 -0
- package/dist/components/ui/table_module.css +71 -0
- package/dist/components/ui/table_module.css.map +1 -0
- package/dist/components/ui/tabs.d.ts +114 -5
- package/dist/components/ui/tabs.d.ts.map +1 -1
- package/dist/components/ui/tabs.js +71 -20
- package/dist/components/ui/tabs.js.map +1 -1
- package/dist/components/ui/tabs.module.js +10 -0
- package/dist/components/ui/tabs.module.js.map +1 -0
- package/dist/components/ui/tabs_module.css +89 -0
- package/dist/components/ui/tabs_module.css.map +1 -0
- package/dist/components/ui/textarea.d.ts +24 -1
- package/dist/components/ui/textarea.d.ts.map +1 -1
- package/dist/components/ui/textarea.js +2 -2
- package/dist/components/ui/textarea.js.map +1 -1
- package/dist/components/ui/textarea.module.js +7 -0
- package/dist/components/ui/textarea.module.js.map +1 -0
- package/dist/components/ui/textarea_module.css +33 -0
- package/dist/components/ui/textarea_module.css.map +1 -0
- package/dist/components/ui/timeline.d.ts +111 -0
- package/dist/components/ui/timeline.d.ts.map +1 -0
- package/dist/components/ui/timeline.js +34 -0
- package/dist/components/ui/timeline.js.map +1 -0
- package/dist/components/ui/timeline.module.js +10 -0
- package/dist/components/ui/timeline.module.js.map +1 -0
- package/dist/components/ui/timeline_module.css +47 -0
- package/dist/components/ui/timeline_module.css.map +1 -0
- package/dist/components/ui/toggle-group.d.ts +81 -10
- package/dist/components/ui/toggle-group.d.ts.map +1 -1
- package/dist/components/ui/toggle-group.js +32 -23
- package/dist/components/ui/toggle-group.js.map +1 -1
- package/dist/components/ui/toggle-group.module.js +7 -0
- package/dist/components/ui/toggle-group.module.js.map +1 -0
- package/dist/components/ui/toggle-group_module.css +8 -0
- package/dist/components/ui/toggle-group_module.css.map +1 -0
- package/dist/components/ui/toggle.d.ts +60 -11
- package/dist/components/ui/toggle.d.ts.map +1 -1
- package/dist/components/ui/toggle.js +29 -29
- package/dist/components/ui/toggle.js.map +1 -1
- package/dist/components/ui/toggle.module.js +12 -0
- package/dist/components/ui/toggle.module.js.map +1 -0
- package/dist/components/ui/toggle_module.css +62 -0
- package/dist/components/ui/toggle_module.css.map +1 -0
- package/dist/components/ui/toolbar.d.ts +127 -0
- package/dist/components/ui/toolbar.d.ts.map +1 -0
- package/dist/components/ui/toolbar.js +85 -0
- package/dist/components/ui/toolbar.js.map +1 -0
- package/dist/components/ui/toolbar.module.js +12 -0
- package/dist/components/ui/toolbar.module.js.map +1 -0
- package/dist/components/ui/toolbar_module.css +115 -0
- package/dist/components/ui/toolbar_module.css.map +1 -0
- package/dist/components/ui/tooltip.d.ts +119 -5
- package/dist/components/ui/tooltip.d.ts.map +1 -1
- package/dist/components/ui/tooltip.js +48 -13
- package/dist/components/ui/tooltip.js.map +1 -1
- package/dist/components/ui/tooltip.module.js +9 -0
- package/dist/components/ui/tooltip.module.js.map +1 -0
- package/dist/components/ui/tooltip_module.css +35 -0
- package/dist/components/ui/tooltip_module.css.map +1 -0
- package/dist/components/ui/typewriter.d.ts +48 -13
- package/dist/components/ui/typewriter.d.ts.map +1 -1
- package/dist/components/ui/typewriter.js +46 -49
- package/dist/components/ui/typewriter.js.map +1 -1
- package/dist/components/ui/typewriter.module.js +16 -0
- package/dist/components/ui/typewriter.module.js.map +1 -0
- package/dist/components/ui/typewriter_module.css +102 -0
- package/dist/components/ui/typewriter_module.css.map +1 -0
- package/dist/components/ui/visually-hidden.d.ts +38 -0
- package/dist/components/ui/visually-hidden.d.ts.map +1 -0
- package/dist/components/ui/visually-hidden.js +13 -0
- package/dist/components/ui/visually-hidden.js.map +1 -0
- package/dist/components/ui/visually-hidden.module.js +7 -0
- package/dist/components/ui/visually-hidden.module.js.map +1 -0
- package/dist/components/ui/visually-hidden_module.css +14 -0
- package/dist/components/ui/visually-hidden_module.css.map +1 -0
- package/dist/hooks/useAnnounce.js +46 -0
- package/dist/hooks/useAnnounce.js.map +1 -0
- package/dist/hooks/useBreakpoint.d.ts +17 -0
- package/dist/hooks/useBreakpoint.d.ts.map +1 -0
- package/dist/hooks/useBreakpoint.js +16 -0
- package/dist/hooks/useBreakpoint.js.map +1 -0
- package/dist/hooks/useColorScheme.d.ts +14 -0
- package/dist/hooks/useColorScheme.d.ts.map +1 -0
- package/dist/hooks/useColorScheme.js +9 -0
- package/dist/hooks/useColorScheme.js.map +1 -0
- package/dist/hooks/useFocusManager.js +51 -0
- package/dist/hooks/useFocusManager.js.map +1 -0
- package/dist/hooks/useFocusVisible.d.ts +50 -0
- package/dist/hooks/useFocusVisible.d.ts.map +1 -0
- package/dist/hooks/useFocusVisible.js +35 -0
- package/dist/hooks/useFocusVisible.js.map +1 -0
- package/dist/hooks/useIsMobile.d.ts +5 -11
- package/dist/hooks/useIsMobile.d.ts.map +1 -1
- package/dist/hooks/useIsMobile.js +2 -13
- package/dist/hooks/useIsMobile.js.map +1 -1
- package/dist/hooks/useMediaQuery.d.ts +14 -0
- package/dist/hooks/useMediaQuery.d.ts.map +1 -0
- package/dist/hooks/useMediaQuery.js +20 -0
- package/dist/hooks/useMediaQuery.js.map +1 -0
- package/dist/hooks/usePrefersContrast.d.ts +19 -0
- package/dist/hooks/usePrefersContrast.d.ts.map +1 -0
- package/dist/hooks/usePrefersContrast.js +8 -0
- package/dist/hooks/usePrefersContrast.js.map +1 -0
- package/dist/hooks/useReducedMotion.d.ts +19 -0
- package/dist/hooks/useReducedMotion.d.ts.map +1 -0
- package/dist/hooks/useReducedMotion.js +2 -0
- package/dist/index.css +104 -5355
- package/dist/index.css.map +1 -1
- package/dist/index.d.ts +40 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +89 -70
- package/dist/lib/color-conversion-utilities.d.ts +82 -0
- package/dist/lib/color-conversion-utilities.d.ts.map +1 -0
- package/dist/lib/color-conversion-utilities.js +94 -0
- package/dist/lib/color-conversion-utilities.js.map +1 -0
- package/dist/lib/utilities.d.ts +5 -4
- package/dist/lib/utilities.d.ts.map +1 -1
- package/dist/lib/utilities.js +1 -2
- package/dist/lib/utilities.js.map +1 -1
- package/dist/motion/Collapse.js +19 -0
- package/dist/motion/Collapse.js.map +1 -0
- package/dist/motion/Collapse.module.js +8 -0
- package/dist/motion/Collapse.module.js.map +1 -0
- package/dist/motion/Collapse_module.css +25 -0
- package/dist/motion/Collapse_module.css.map +1 -0
- package/dist/motion/Presence.js +14 -0
- package/dist/motion/Presence.js.map +1 -0
- package/dist/motion/index.js +5 -0
- package/dist/motion/presets.js +117 -0
- package/dist/motion/presets.js.map +1 -0
- package/dist/motion/tokens.js +41 -0
- package/dist/motion/tokens.js.map +1 -0
- package/package.json +159 -65
- package/src/components/ui/accordion.module.css +70 -0
- package/src/components/ui/accordion.tsx +278 -44
- package/src/components/ui/alert-dialog.module.css +87 -0
- package/src/components/ui/alert-dialog.tsx +474 -99
- package/src/components/ui/alert.module.css +57 -0
- package/src/components/ui/alert.tsx +136 -43
- package/src/components/ui/aspect-ratio.module.css +7 -0
- package/src/components/ui/aspect-ratio.tsx +38 -3
- package/src/components/ui/async-boundary.tsx +56 -0
- package/src/components/ui/avatar.module.css +31 -0
- package/src/components/ui/avatar.tsx +146 -36
- package/src/components/ui/background-beams.module.css +20 -0
- package/src/components/ui/background-beams.tsx +173 -134
- package/src/components/ui/badge.module.css +60 -0
- package/src/components/ui/badge.tsx +100 -32
- package/src/components/ui/breadcrumb.module.css +87 -0
- package/src/components/ui/breadcrumb.tsx +256 -74
- package/src/components/ui/bubble-background.module.css +97 -0
- package/src/components/ui/bubble-background.tsx +92 -52
- package/src/components/ui/button-group.module.css +76 -0
- package/src/components/ui/button-group.tsx +135 -46
- package/src/components/ui/button.module.css +138 -0
- package/src/components/ui/button.tsx +159 -41
- package/src/components/ui/calendar.module.css +250 -0
- package/src/components/ui/calendar.tsx +133 -103
- package/src/components/ui/card-skeleton.module.css +50 -0
- package/src/components/ui/card-skeleton.tsx +69 -0
- package/src/components/ui/card.module.css +41 -0
- package/src/components/ui/card.tsx +175 -22
- package/src/components/ui/carousel.module.css +80 -0
- package/src/components/ui/carousel.tsx +184 -43
- package/src/components/ui/chart.module.css +164 -0
- package/src/components/ui/chart.tsx +444 -102
- package/src/components/ui/checkbox-group.module.css +8 -0
- package/src/components/ui/checkbox-group.tsx +54 -0
- package/src/components/ui/checkbox.module.css +43 -0
- package/src/components/ui/checkbox.tsx +73 -19
- package/src/components/ui/collapsible.module.css +24 -0
- package/src/components/ui/collapsible.tsx +139 -3
- package/src/components/ui/command.module.css +193 -0
- package/src/components/ui/command.tsx +877 -113
- package/src/components/ui/context-menu.module.css +113 -0
- package/src/components/ui/context-menu.tsx +616 -157
- package/src/components/ui/copy-button.module.css +34 -0
- package/src/components/ui/copy-button.tsx +116 -0
- package/src/components/ui/counting-number.module.css +4 -0
- package/src/components/ui/counting-number.tsx +69 -31
- package/src/components/ui/dialog.module.css +113 -0
- package/src/components/ui/dialog.tsx +427 -81
- package/src/components/ui/dot-background.module.css +12 -0
- package/src/components/ui/dot-background.tsx +134 -126
- package/src/components/ui/drawer.module.css +85 -0
- package/src/components/ui/drawer.tsx +408 -80
- package/src/components/ui/dropdown-menu.module.css +113 -0
- package/src/components/ui/dropdown-menu.tsx +616 -159
- package/src/components/ui/dropdrawer.module.css +322 -0
- package/src/components/ui/dropdrawer.tsx +850 -398
- package/src/components/ui/empty.module.css +84 -0
- package/src/components/ui/empty.tsx +176 -52
- package/src/components/ui/error-boundary.module.css +36 -0
- package/src/components/ui/error-boundary.tsx +127 -0
- package/src/components/ui/field.module.css +179 -0
- package/src/components/ui/field.tsx +345 -139
- package/src/components/ui/fireworks-background.module.css +13 -0
- package/src/components/ui/fireworks-background.tsx +89 -51
- package/src/components/ui/flip-button.module.css +44 -0
- package/src/components/ui/flip-button.tsx +59 -28
- package/src/components/ui/focus-scope.module.css +3 -0
- package/src/components/ui/focus-scope.tsx +160 -0
- package/src/components/ui/form-skeleton.module.css +28 -0
- package/src/components/ui/form-skeleton.tsx +62 -0
- package/src/components/ui/form.module.css +20 -0
- package/src/components/ui/form.tsx +244 -33
- package/src/components/ui/gradient-background.module.css +6 -0
- package/src/components/ui/gradient-background.tsx +27 -5
- package/src/components/ui/gradient-text.module.css +23 -0
- package/src/components/ui/gradient-text.tsx +36 -9
- package/src/components/ui/highlight-text.module.css +14 -0
- package/src/components/ui/highlight-text.tsx +37 -15
- package/src/components/ui/hole-background.module.css +84 -0
- package/src/components/ui/hole-background.tsx +290 -162
- package/src/components/ui/hover-card.module.css +21 -0
- package/src/components/ui/hover-card.tsx +142 -21
- package/src/components/ui/input-group.module.css +148 -0
- package/src/components/ui/input-group.tsx +222 -98
- package/src/components/ui/input-otp.module.css +92 -0
- package/src/components/ui/input-otp.tsx +159 -33
- package/src/components/ui/input.module.css +37 -0
- package/src/components/ui/input.tsx +56 -14
- package/src/components/ui/item.module.css +143 -0
- package/src/components/ui/item.tsx +331 -104
- package/src/components/ui/kbd.module.css +31 -0
- package/src/components/ui/kbd.tsx +60 -17
- package/src/components/ui/label.module.css +13 -0
- package/src/components/ui/label.tsx +38 -14
- package/src/components/ui/list-skeleton.module.css +35 -0
- package/src/components/ui/list-skeleton.tsx +70 -0
- package/src/components/ui/loading-overlay.module.css +19 -0
- package/src/components/ui/loading-overlay.tsx +72 -0
- package/src/components/ui/menubar.module.css +144 -0
- package/src/components/ui/menubar.tsx +605 -192
- package/src/components/ui/meter.module.css +32 -0
- package/src/components/ui/meter.tsx +170 -0
- package/src/components/ui/navigation-menu.module.css +110 -0
- package/src/components/ui/navigation-menu.tsx +375 -101
- package/src/components/ui/number-field.module.css +126 -0
- package/src/components/ui/number-field.tsx +254 -0
- package/src/components/ui/pagination.module.css +64 -0
- package/src/components/ui/pagination.tsx +250 -72
- package/src/components/ui/popover.module.css +26 -0
- package/src/components/ui/popover.tsx +207 -25
- package/src/components/ui/progress.module.css +15 -0
- package/src/components/ui/progress.tsx +53 -16
- package/src/components/ui/radio-group.module.css +41 -0
- package/src/components/ui/radio-group.tsx +91 -34
- package/src/components/ui/resizable.module.css +67 -0
- package/src/components/ui/resizable.tsx +106 -26
- package/src/components/ui/ripple-button.module.css +35 -0
- package/src/components/ui/ripple-button.tsx +55 -21
- package/src/components/ui/scratcher.module.css +9 -0
- package/src/components/ui/scratcher.tsx +129 -99
- package/src/components/ui/scroll-area.module.css +47 -0
- package/src/components/ui/scroll-area.tsx +96 -34
- package/src/components/ui/select.module.css +131 -0
- package/src/components/ui/select.tsx +435 -124
- package/src/components/ui/separator.module.css +14 -0
- package/src/components/ui/separator.tsx +59 -18
- package/src/components/ui/sheet.module.css +138 -0
- package/src/components/ui/sheet.tsx +424 -95
- package/src/components/ui/sidebar.module.css +594 -0
- package/src/components/ui/sidebar.tsx +899 -425
- package/src/components/ui/skeleton.module.css +14 -0
- package/src/components/ui/skeleton.tsx +39 -9
- package/src/components/ui/slider.module.css +48 -0
- package/src/components/ui/slider.tsx +89 -16
- package/src/components/ui/sonner.module.css +246 -0
- package/src/components/ui/sonner.tsx +769 -25
- package/src/components/ui/spinner.module.css +25 -0
- package/src/components/ui/spinner.tsx +51 -12
- package/src/components/ui/stepper.module.css +72 -0
- package/src/components/ui/stepper.tsx +95 -0
- package/src/components/ui/switch.module.css +42 -0
- package/src/components/ui/switch.tsx +53 -20
- package/src/components/ui/table-skeleton.module.css +29 -0
- package/src/components/ui/table-skeleton.tsx +79 -0
- package/src/components/ui/table.module.css +66 -0
- package/src/components/ui/table.tsx +235 -61
- package/src/components/ui/tabs.module.css +89 -0
- package/src/components/ui/tabs.tsx +192 -45
- package/src/components/ui/textarea.module.css +30 -0
- package/src/components/ui/textarea.tsx +30 -10
- package/src/components/ui/timeline.module.css +43 -0
- package/src/components/ui/timeline.tsx +153 -0
- package/src/components/ui/toggle-group.module.css +5 -0
- package/src/components/ui/toggle-group.tsx +116 -35
- package/src/components/ui/toggle.module.css +57 -0
- package/src/components/ui/toggle.tsx +89 -33
- package/src/components/ui/toolbar.module.css +112 -0
- package/src/components/ui/toolbar.tsx +210 -0
- package/src/components/ui/tooltip.module.css +39 -0
- package/src/components/ui/tooltip.tsx +181 -24
- package/src/components/ui/typewriter.module.css +101 -0
- package/src/components/ui/typewriter.tsx +130 -128
- package/src/components/ui/visually-hidden.module.css +11 -0
- package/src/components/ui/visually-hidden.tsx +50 -0
- package/src/css-modules.d.ts +9 -0
- package/src/hooks/useAnnounce.tsx +73 -0
- package/src/hooks/useBreakpoint.tsx +41 -0
- package/src/hooks/useColorScheme.tsx +23 -0
- package/src/hooks/useFocusManager.tsx +89 -0
- package/src/hooks/useFocusVisible.tsx +88 -0
- package/src/hooks/useIsMobile.tsx +7 -28
- package/src/hooks/useMediaQuery.tsx +34 -0
- package/src/hooks/usePrefersContrast.tsx +24 -0
- package/src/hooks/useReducedMotion.tsx +20 -0
- package/src/index.css +127 -65
- package/src/index.ts +223 -16
- package/src/lib/color-conversion-utilities.ts +165 -0
- package/src/lib/utilities.ts +7 -6
- package/src/motion/Collapse.module.css +22 -0
- package/src/motion/Collapse.tsx +52 -0
- package/src/motion/Presence.tsx +44 -0
- package/src/motion/index.ts +13 -0
- package/src/motion/presets.ts +77 -0
- package/src/motion/tokens.ts +37 -0
|
@@ -1,21 +1,19 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
|
|
3
|
-
/* eslint-disable */
|
|
4
|
-
|
|
5
|
-
import {Slot} from "@radix-ui/react-slot";
|
|
6
|
-
import {VariantProps, cva} from "class-variance-authority";
|
|
7
3
|
import {PanelLeft} from "lucide-react";
|
|
8
4
|
import * as React from "react";
|
|
5
|
+
import {createPortal} from "react-dom";
|
|
9
6
|
|
|
10
7
|
import {Button} from "@/components/ui/button";
|
|
11
8
|
import {Input} from "@/components/ui/input";
|
|
12
9
|
import {Separator} from "@/components/ui/separator";
|
|
13
|
-
import {Sheet, SheetContent, SheetDescription, SheetHeader, SheetTitle} from "@/components/ui/sheet";
|
|
14
10
|
import {Skeleton} from "@/components/ui/skeleton";
|
|
15
11
|
import {Tooltip, TooltipContent, TooltipProvider, TooltipTrigger} from "@/components/ui/tooltip";
|
|
16
12
|
import {useIsMobile} from "@/hooks/useIsMobile";
|
|
17
13
|
import {cn} from "@/lib/utilities";
|
|
18
14
|
|
|
15
|
+
import styles from "./sidebar.module.css";
|
|
16
|
+
|
|
19
17
|
const SIDEBAR_COOKIE_NAME = "sidebar_state";
|
|
20
18
|
const SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7;
|
|
21
19
|
const SIDEBAR_WIDTH = "16rem";
|
|
@@ -23,6 +21,11 @@ const SIDEBAR_WIDTH_MOBILE = "18rem";
|
|
|
23
21
|
const SIDEBAR_WIDTH_ICON = "3rem";
|
|
24
22
|
const SIDEBAR_KEYBOARD_SHORTCUT = "b";
|
|
25
23
|
|
|
24
|
+
type SidebarDataAttributes = Record<`data-${string}`, string | boolean | undefined>;
|
|
25
|
+
type SidebarCloneableDivProps = React.ComponentProps<"div"> & SidebarDataAttributes & {ref?: React.Ref<HTMLDivElement>};
|
|
26
|
+
type SidebarCloneableButtonProps = React.ComponentProps<"button"> & SidebarDataAttributes & {ref?: React.Ref<HTMLButtonElement>};
|
|
27
|
+
type SidebarCloneableAnchorProps = React.ComponentProps<"a"> & SidebarDataAttributes & {ref?: React.Ref<HTMLAnchorElement>};
|
|
28
|
+
|
|
26
29
|
type SidebarContextProps = {
|
|
27
30
|
state: "expanded" | "collapsed";
|
|
28
31
|
open: boolean;
|
|
@@ -35,8 +38,23 @@ type SidebarContextProps = {
|
|
|
35
38
|
|
|
36
39
|
const SidebarContext = React.createContext<SidebarContextProps | null>(null);
|
|
37
40
|
|
|
38
|
-
|
|
41
|
+
/**
|
|
42
|
+
* Returns the active sidebar context and enforces provider usage.
|
|
43
|
+
*
|
|
44
|
+
* @remarks
|
|
45
|
+
* Must be called from within {@link SidebarProvider}. Exposes desktop and mobile
|
|
46
|
+
* open state along with the shared toggle helper used by sidebar primitives.
|
|
47
|
+
*
|
|
48
|
+
* @example
|
|
49
|
+
* ```tsx
|
|
50
|
+
* const {open, toggleSidebar} = useSidebar();
|
|
51
|
+
* ```
|
|
52
|
+
*
|
|
53
|
+
* @see {@link https://react.dev/reference/react/useContext | React useContext Docs}
|
|
54
|
+
*/
|
|
55
|
+
function useSidebar(): SidebarContextProps {
|
|
39
56
|
const context = React.useContext(SidebarContext);
|
|
57
|
+
|
|
40
58
|
if (!context) {
|
|
41
59
|
throw new Error("useSidebar must be used within a SidebarProvider.");
|
|
42
60
|
}
|
|
@@ -44,183 +62,298 @@ function useSidebar() {
|
|
|
44
62
|
return context;
|
|
45
63
|
}
|
|
46
64
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
} else {
|
|
68
|
-
_setOpen(openState);
|
|
69
|
-
}
|
|
65
|
+
/**
|
|
66
|
+
* Props for the sidebar provider.
|
|
67
|
+
*/
|
|
68
|
+
interface SidebarProviderProps extends React.ComponentProps<"div"> {
|
|
69
|
+
/**
|
|
70
|
+
* Initial uncontrolled open state for desktop layouts.
|
|
71
|
+
* @default true
|
|
72
|
+
*/
|
|
73
|
+
defaultOpen?: boolean;
|
|
74
|
+
/**
|
|
75
|
+
* Controlled open state for desktop layouts.
|
|
76
|
+
* @default undefined
|
|
77
|
+
*/
|
|
78
|
+
open?: boolean;
|
|
79
|
+
/**
|
|
80
|
+
* Callback invoked when the desktop open state changes.
|
|
81
|
+
* @default undefined
|
|
82
|
+
*/
|
|
83
|
+
onOpenChange?: (open: boolean) => void;
|
|
84
|
+
}
|
|
70
85
|
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
86
|
+
/**
|
|
87
|
+
* Provides shared sidebar state, keyboard shortcuts, and responsive behavior.
|
|
88
|
+
*
|
|
89
|
+
* @remarks
|
|
90
|
+
* - Renders a `<div>` element
|
|
91
|
+
* - Built on shared React context and tooltip primitives
|
|
92
|
+
* - Persists desktop collapse state to a cookie for cross-page continuity
|
|
93
|
+
*
|
|
94
|
+
* @example
|
|
95
|
+
* ```tsx
|
|
96
|
+
* <SidebarProvider>
|
|
97
|
+
* <Sidebar />
|
|
98
|
+
* </SidebarProvider>
|
|
99
|
+
* ```
|
|
100
|
+
*
|
|
101
|
+
* @see {@link https://react.dev/reference/react/useContext | React Context Docs}
|
|
102
|
+
*/
|
|
103
|
+
const SidebarProvider = React.forwardRef<HTMLDivElement, SidebarProviderProps>(
|
|
104
|
+
({defaultOpen = true, open: openProp, onOpenChange: setOpenProp, className, style, children, ...props}, ref) => {
|
|
105
|
+
const isMobile = useIsMobile();
|
|
106
|
+
const [openMobile, setOpenMobile] = React.useState(false);
|
|
107
|
+
const [internalOpen, setInternalOpen] = React.useState(defaultOpen);
|
|
108
|
+
const open = openProp ?? internalOpen;
|
|
76
109
|
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
}, [isMobile, setOpen, setOpenMobile]);
|
|
110
|
+
const setOpen = React.useCallback(
|
|
111
|
+
(value: boolean | ((value: boolean) => boolean)) => {
|
|
112
|
+
const nextValue = typeof value === "function" ? value(open) : value;
|
|
81
113
|
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
114
|
+
if (setOpenProp) {
|
|
115
|
+
setOpenProp(nextValue);
|
|
116
|
+
} else {
|
|
117
|
+
setInternalOpen(nextValue);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// eslint-disable-next-line unicorn/no-document-cookie -- persistent sidebar state matches V1 behavior
|
|
121
|
+
document.cookie = `${SIDEBAR_COOKIE_NAME}=${nextValue}; path=/; max-age=${SIDEBAR_COOKIE_MAX_AGE}`;
|
|
122
|
+
},
|
|
123
|
+
[open, setOpenProp],
|
|
124
|
+
);
|
|
125
|
+
|
|
126
|
+
const toggleSidebar = React.useCallback(() => {
|
|
127
|
+
if (isMobile) {
|
|
128
|
+
setOpenMobile((currentOpen) => !currentOpen);
|
|
129
|
+
return;
|
|
88
130
|
}
|
|
89
|
-
};
|
|
90
131
|
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
}, [toggleSidebar]);
|
|
94
|
-
|
|
95
|
-
// We add a state so that we can do data-state="expanded" or "collapsed".
|
|
96
|
-
// This makes it easier to style the sidebar with Tailwind classes.
|
|
97
|
-
const state = open ? "expanded" : "collapsed";
|
|
98
|
-
|
|
99
|
-
const contextValue = React.useMemo<SidebarContextProps>(
|
|
100
|
-
() => ({
|
|
101
|
-
state,
|
|
102
|
-
open,
|
|
103
|
-
setOpen,
|
|
104
|
-
isMobile,
|
|
105
|
-
openMobile,
|
|
106
|
-
setOpenMobile,
|
|
107
|
-
toggleSidebar,
|
|
108
|
-
}),
|
|
109
|
-
[state, open, setOpen, isMobile, openMobile, setOpenMobile, toggleSidebar],
|
|
110
|
-
);
|
|
132
|
+
setOpen((currentOpen) => !currentOpen);
|
|
133
|
+
}, [isMobile, setOpen]);
|
|
111
134
|
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
135
|
+
React.useEffect(() => {
|
|
136
|
+
const handleKeyDown = (event: KeyboardEvent) => {
|
|
137
|
+
if (event.key === SIDEBAR_KEYBOARD_SHORTCUT && (event.metaKey || event.ctrlKey)) {
|
|
138
|
+
event.preventDefault();
|
|
139
|
+
toggleSidebar();
|
|
140
|
+
}
|
|
141
|
+
};
|
|
142
|
+
|
|
143
|
+
globalThis.window.addEventListener("keydown", handleKeyDown);
|
|
144
|
+
|
|
145
|
+
return () => {
|
|
146
|
+
globalThis.window.removeEventListener("keydown", handleKeyDown);
|
|
147
|
+
};
|
|
148
|
+
}, [toggleSidebar]);
|
|
149
|
+
|
|
150
|
+
const state = open ? "expanded" : "collapsed";
|
|
151
|
+
|
|
152
|
+
const contextValue = React.useMemo<SidebarContextProps>(
|
|
153
|
+
() => ({
|
|
154
|
+
isMobile,
|
|
155
|
+
open,
|
|
156
|
+
openMobile,
|
|
157
|
+
setOpen,
|
|
158
|
+
setOpenMobile,
|
|
159
|
+
state,
|
|
160
|
+
toggleSidebar,
|
|
161
|
+
}),
|
|
162
|
+
[isMobile, open, openMobile, setOpen, state, toggleSidebar],
|
|
163
|
+
);
|
|
164
|
+
|
|
165
|
+
return (
|
|
166
|
+
<SidebarContext.Provider value={contextValue}>
|
|
167
|
+
<TooltipProvider>
|
|
168
|
+
<div
|
|
169
|
+
ref={ref}
|
|
170
|
+
style={
|
|
171
|
+
{
|
|
172
|
+
"--ac-sidebar-width": SIDEBAR_WIDTH,
|
|
173
|
+
"--ac-sidebar-width-icon": SIDEBAR_WIDTH_ICON,
|
|
174
|
+
...style,
|
|
175
|
+
} as React.CSSProperties
|
|
176
|
+
}
|
|
177
|
+
className={cn(styles.wrapper, className)}
|
|
178
|
+
{...props}>
|
|
179
|
+
{children}
|
|
180
|
+
</div>
|
|
181
|
+
</TooltipProvider>
|
|
182
|
+
</SidebarContext.Provider>
|
|
183
|
+
);
|
|
184
|
+
},
|
|
185
|
+
);
|
|
186
|
+
SidebarProvider.displayName = "SidebarProvider";
|
|
187
|
+
|
|
188
|
+
/**
|
|
189
|
+
* Props for the root sidebar panel.
|
|
190
|
+
*/
|
|
191
|
+
type SidebarProps = React.ComponentProps<"div"> & {
|
|
192
|
+
/**
|
|
193
|
+
* Edge of the screen where the sidebar is rendered.
|
|
194
|
+
* @default "left"
|
|
195
|
+
*/
|
|
196
|
+
side?: "left" | "right";
|
|
197
|
+
/**
|
|
198
|
+
* Visual presentation style used for desktop rendering.
|
|
199
|
+
* @default "sidebar"
|
|
200
|
+
*/
|
|
201
|
+
variant?: "sidebar" | "floating" | "inset";
|
|
202
|
+
/**
|
|
203
|
+
* Desktop collapse behavior for the sidebar.
|
|
204
|
+
* @default "offcanvas"
|
|
205
|
+
*/
|
|
206
|
+
collapsible?: "offcanvas" | "icon" | "none";
|
|
207
|
+
};
|
|
208
|
+
|
|
209
|
+
/**
|
|
210
|
+
* Renders the responsive sidebar panel for desktop and mobile layouts.
|
|
211
|
+
*
|
|
212
|
+
* @remarks
|
|
213
|
+
* - Renders a `<div>` element on desktop and a dialog portal on mobile
|
|
214
|
+
* - Built on the shared sidebar context
|
|
215
|
+
*
|
|
216
|
+
* @example
|
|
217
|
+
* ```tsx
|
|
218
|
+
* <Sidebar>
|
|
219
|
+
* <SidebarContent />
|
|
220
|
+
* </Sidebar>
|
|
221
|
+
* ```
|
|
222
|
+
*
|
|
223
|
+
* @see {@link https://developer.mozilla.org/docs/Web/Accessibility/ARIA/Roles/dialog_role | ARIA Dialog Role}
|
|
224
|
+
*/
|
|
225
|
+
const Sidebar = React.forwardRef<HTMLDivElement, SidebarProps>(
|
|
226
|
+
({side = "left", variant = "sidebar", collapsible = "offcanvas", className, children, ...props}, ref) => {
|
|
227
|
+
const {isMobile, openMobile, setOpenMobile, state} = useSidebar();
|
|
228
|
+
|
|
229
|
+
if (collapsible === "none") {
|
|
230
|
+
return (
|
|
115
231
|
<div
|
|
116
|
-
style={
|
|
117
|
-
{
|
|
118
|
-
"--sidebar-width": SIDEBAR_WIDTH,
|
|
119
|
-
"--sidebar-width-icon": SIDEBAR_WIDTH_ICON,
|
|
120
|
-
...style,
|
|
121
|
-
} as React.CSSProperties
|
|
122
|
-
}
|
|
123
|
-
className={cn("group/sidebar-wrapper has-[[data-variant=inset]]:bg-sidebar flex min-h-svh w-full", className)}
|
|
124
232
|
ref={ref}
|
|
233
|
+
className={cn(styles.staticSidebar, className)}
|
|
125
234
|
{...props}>
|
|
126
235
|
{children}
|
|
127
236
|
</div>
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
);
|
|
131
|
-
});
|
|
132
|
-
SidebarProvider.displayName = "SidebarProvider";
|
|
237
|
+
);
|
|
238
|
+
}
|
|
133
239
|
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
240
|
+
if (isMobile) {
|
|
241
|
+
return (
|
|
242
|
+
<MobileSidebarPortal
|
|
243
|
+
className={className}
|
|
244
|
+
open={openMobile}
|
|
245
|
+
side={side}
|
|
246
|
+
onOpenChange={setOpenMobile}
|
|
247
|
+
{...props}>
|
|
248
|
+
{children}
|
|
249
|
+
</MobileSidebarPortal>
|
|
250
|
+
);
|
|
251
|
+
}
|
|
143
252
|
|
|
144
|
-
if (collapsible === "none") {
|
|
145
253
|
return (
|
|
146
254
|
<div
|
|
147
|
-
className={cn("bg-sidebar text-sidebar-foreground flex h-full w-[--sidebar-width] flex-col", className)}
|
|
148
255
|
ref={ref}
|
|
149
|
-
{
|
|
150
|
-
{
|
|
256
|
+
className={styles.desktopRoot}
|
|
257
|
+
data-state={state}
|
|
258
|
+
data-collapsible={state === "collapsed" ? collapsible : ""}
|
|
259
|
+
data-variant={variant}
|
|
260
|
+
data-side={side}>
|
|
261
|
+
<div className={styles.gap} />
|
|
262
|
+
<div
|
|
263
|
+
className={cn(styles.panelWrap, className)}
|
|
264
|
+
{...props}>
|
|
265
|
+
<div
|
|
266
|
+
data-sidebar='sidebar'
|
|
267
|
+
className={styles.panel}>
|
|
268
|
+
{children}
|
|
269
|
+
</div>
|
|
270
|
+
</div>
|
|
151
271
|
</div>
|
|
152
272
|
);
|
|
153
|
-
}
|
|
273
|
+
},
|
|
274
|
+
);
|
|
275
|
+
Sidebar.displayName = "Sidebar";
|
|
154
276
|
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
277
|
+
type MobileSidebarPortalProps = React.ComponentProps<"div"> & {
|
|
278
|
+
open: boolean;
|
|
279
|
+
side: "left" | "right";
|
|
280
|
+
onOpenChange: (open: boolean) => void;
|
|
281
|
+
};
|
|
282
|
+
|
|
283
|
+
function MobileSidebarPortal({
|
|
284
|
+
open,
|
|
285
|
+
side,
|
|
286
|
+
onOpenChange,
|
|
287
|
+
className,
|
|
288
|
+
children,
|
|
289
|
+
...props
|
|
290
|
+
}: Readonly<MobileSidebarPortalProps>): React.ReactPortal | null {
|
|
291
|
+
React.useEffect(() => {
|
|
292
|
+
if (!open) {
|
|
293
|
+
return;
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
const previousOverflow = document.body.style.overflow;
|
|
297
|
+
const handleKeyDown = (event: KeyboardEvent) => {
|
|
298
|
+
if (event.key === "Escape") {
|
|
299
|
+
onOpenChange(false);
|
|
300
|
+
}
|
|
301
|
+
};
|
|
302
|
+
|
|
303
|
+
document.body.style.overflow = "hidden";
|
|
304
|
+
globalThis.window.addEventListener("keydown", handleKeyDown);
|
|
305
|
+
|
|
306
|
+
return () => {
|
|
307
|
+
document.body.style.overflow = previousOverflow;
|
|
308
|
+
globalThis.window.removeEventListener("keydown", handleKeyDown);
|
|
309
|
+
};
|
|
310
|
+
}, [onOpenChange, open]);
|
|
311
|
+
|
|
312
|
+
if (!open || typeof document === "undefined") {
|
|
313
|
+
return null;
|
|
179
314
|
}
|
|
180
315
|
|
|
181
|
-
return (
|
|
182
|
-
<div
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
data-side={side}>
|
|
189
|
-
{/* This is what handles the sidebar gap on desktop */}
|
|
190
|
-
<div
|
|
191
|
-
className={cn(
|
|
192
|
-
"relative w-[--sidebar-width] bg-transparent transition-[width] duration-200 ease-linear",
|
|
193
|
-
"group-data-[collapsible=offcanvas]:w-0",
|
|
194
|
-
"group-data-[side=right]:rotate-180",
|
|
195
|
-
variant === "floating" || variant === "inset"
|
|
196
|
-
? "group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)_+_theme(spacing.4))]"
|
|
197
|
-
: "group-data-[collapsible=icon]:w-[--sidebar-width-icon]",
|
|
198
|
-
)}
|
|
316
|
+
return createPortal(
|
|
317
|
+
<div className={styles.mobilePortal}>
|
|
318
|
+
<button
|
|
319
|
+
type='button'
|
|
320
|
+
aria-label='Close sidebar'
|
|
321
|
+
className={styles.mobileOverlay}
|
|
322
|
+
onClick={() => onOpenChange(false)}
|
|
199
323
|
/>
|
|
200
324
|
<div
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
variant === "floating" || variant === "inset"
|
|
208
|
-
? "p-2 group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)_+_theme(spacing.4)_+2px)]"
|
|
209
|
-
: "group-data-[collapsible=icon]:w-[--sidebar-width-icon] group-data-[side=left]:border-r group-data-[side=right]:border-l",
|
|
210
|
-
className,
|
|
211
|
-
)}
|
|
325
|
+
role='dialog'
|
|
326
|
+
aria-modal='true'
|
|
327
|
+
aria-label='Sidebar'
|
|
328
|
+
data-sidebar='sidebar'
|
|
329
|
+
className={cn(styles.mobilePanel, side === "right" ? styles.mobilePanelRight : styles.mobilePanelLeft, className)}
|
|
330
|
+
style={{"--ac-sidebar-width": SIDEBAR_WIDTH_MOBILE} as React.CSSProperties}
|
|
212
331
|
{...props}>
|
|
213
|
-
<div
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
{children}
|
|
332
|
+
<div className={styles.srOnly}>
|
|
333
|
+
<h2>Sidebar</h2>
|
|
334
|
+
<p>Displays the mobile sidebar.</p>
|
|
217
335
|
</div>
|
|
336
|
+
<div className={styles.mobileContent}>{children}</div>
|
|
218
337
|
</div>
|
|
219
|
-
</div
|
|
338
|
+
</div>,
|
|
339
|
+
document.body,
|
|
220
340
|
);
|
|
221
|
-
}
|
|
222
|
-
Sidebar.displayName = "Sidebar";
|
|
341
|
+
}
|
|
223
342
|
|
|
343
|
+
/**
|
|
344
|
+
* Renders the primary button used to toggle the sidebar.
|
|
345
|
+
*
|
|
346
|
+
* @remarks
|
|
347
|
+
* - Renders the shared `Button` component
|
|
348
|
+
* - Built on the shared sidebar context
|
|
349
|
+
*
|
|
350
|
+
* @example
|
|
351
|
+
* ```tsx
|
|
352
|
+
* <SidebarTrigger />
|
|
353
|
+
* ```
|
|
354
|
+
*
|
|
355
|
+
* @see {@link https://developer.mozilla.org/docs/Web/HTML/Element/button | HTML button element}
|
|
356
|
+
*/
|
|
224
357
|
const SidebarTrigger = React.forwardRef<React.ComponentRef<typeof Button>, React.ComponentProps<typeof Button>>(
|
|
225
358
|
({className, onClick, ...props}, ref) => {
|
|
226
359
|
const {toggleSidebar} = useSidebar();
|
|
@@ -231,20 +364,34 @@ const SidebarTrigger = React.forwardRef<React.ComponentRef<typeof Button>, React
|
|
|
231
364
|
data-sidebar='trigger'
|
|
232
365
|
variant='ghost'
|
|
233
366
|
size='icon'
|
|
234
|
-
className={cn(
|
|
367
|
+
className={cn(styles.trigger, className)}
|
|
235
368
|
onClick={(event) => {
|
|
236
369
|
onClick?.(event);
|
|
237
370
|
toggleSidebar();
|
|
238
371
|
}}
|
|
239
372
|
{...props}>
|
|
240
|
-
<PanelLeft />
|
|
241
|
-
<span className=
|
|
373
|
+
<PanelLeft className={styles.triggerIcon} />
|
|
374
|
+
<span className={styles.srOnly}>Toggle Sidebar</span>
|
|
242
375
|
</Button>
|
|
243
376
|
);
|
|
244
377
|
},
|
|
245
378
|
);
|
|
246
379
|
SidebarTrigger.displayName = "SidebarTrigger";
|
|
247
380
|
|
|
381
|
+
/**
|
|
382
|
+
* Renders a slim rail button used to toggle the sidebar collapsed state.
|
|
383
|
+
*
|
|
384
|
+
* @remarks
|
|
385
|
+
* - Renders a `<button>` element
|
|
386
|
+
* - Built on the shared sidebar context
|
|
387
|
+
*
|
|
388
|
+
* @example
|
|
389
|
+
* ```tsx
|
|
390
|
+
* <SidebarRail />
|
|
391
|
+
* ```
|
|
392
|
+
*
|
|
393
|
+
* @see {@link https://developer.mozilla.org/docs/Web/HTML/Element/button | HTML button element}
|
|
394
|
+
*/
|
|
248
395
|
const SidebarRail = React.forwardRef<HTMLButtonElement, React.ComponentProps<"button">>(({className, ...props}, ref) => {
|
|
249
396
|
const {toggleSidebar} = useSidebar();
|
|
250
397
|
|
|
@@ -254,359 +401,656 @@ const SidebarRail = React.forwardRef<HTMLButtonElement, React.ComponentProps<"bu
|
|
|
254
401
|
data-sidebar='rail'
|
|
255
402
|
aria-label='Toggle Sidebar'
|
|
256
403
|
tabIndex={-1}
|
|
404
|
+
title='Toggle Sidebar'
|
|
257
405
|
type='button'
|
|
406
|
+
className={cn(styles.rail, className)}
|
|
258
407
|
onClick={toggleSidebar}
|
|
259
|
-
title='Toggle Sidebar'
|
|
260
|
-
className={cn(
|
|
261
|
-
"hover:after:bg-sidebar-border absolute inset-y-0 z-20 hidden w-4 -translate-x-1/2 transition-all ease-linear group-data-[side=left]:-right-4 group-data-[side=right]:left-0 after:absolute after:inset-y-0 after:left-1/2 after:w-[2px] sm:flex",
|
|
262
|
-
"[[data-side=left]_&]:cursor-w-resize [[data-side=right]_&]:cursor-e-resize",
|
|
263
|
-
"[[data-side=left][data-state=collapsed]_&]:cursor-e-resize [[data-side=right][data-state=collapsed]_&]:cursor-w-resize",
|
|
264
|
-
"group-data-[collapsible=offcanvas]:hover:bg-sidebar group-data-[collapsible=offcanvas]:translate-x-0 group-data-[collapsible=offcanvas]:after:left-full",
|
|
265
|
-
"[[data-side=left][data-collapsible=offcanvas]_&]:-right-2",
|
|
266
|
-
"[[data-side=right][data-collapsible=offcanvas]_&]:-left-2",
|
|
267
|
-
className,
|
|
268
|
-
)}
|
|
269
408
|
{...props}
|
|
270
409
|
/>
|
|
271
410
|
);
|
|
272
411
|
});
|
|
273
412
|
SidebarRail.displayName = "SidebarRail";
|
|
274
413
|
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
}
|
|
414
|
+
/**
|
|
415
|
+
* Renders the inset main content region adjacent to the sidebar.
|
|
416
|
+
*
|
|
417
|
+
* @remarks
|
|
418
|
+
* - Renders a `<main>` element
|
|
419
|
+
* - Built as a layout helper for inset sidebar variants
|
|
420
|
+
*
|
|
421
|
+
* @example
|
|
422
|
+
* ```tsx
|
|
423
|
+
* <SidebarInset>Main content</SidebarInset>
|
|
424
|
+
* ```
|
|
425
|
+
*
|
|
426
|
+
* @see {@link https://developer.mozilla.org/docs/Web/HTML/Element/main | HTML main element}
|
|
427
|
+
*/
|
|
428
|
+
const SidebarInset = React.forwardRef<HTMLDivElement, React.ComponentProps<"main">>(({className, ...props}, ref) => (
|
|
429
|
+
<main
|
|
430
|
+
ref={ref}
|
|
431
|
+
className={cn(styles.inset, className)}
|
|
432
|
+
{...props}
|
|
433
|
+
/>
|
|
434
|
+
));
|
|
288
435
|
SidebarInset.displayName = "SidebarInset";
|
|
289
436
|
|
|
437
|
+
/**
|
|
438
|
+
* Renders a styled input inside sidebar layouts.
|
|
439
|
+
*
|
|
440
|
+
* @remarks
|
|
441
|
+
* - Renders the shared `Input` component
|
|
442
|
+
* - Built for sidebar search and filtering affordances
|
|
443
|
+
*
|
|
444
|
+
* @example
|
|
445
|
+
* ```tsx
|
|
446
|
+
* <SidebarInput placeholder='Search...' />
|
|
447
|
+
* ```
|
|
448
|
+
*
|
|
449
|
+
* @see {@link https://developer.mozilla.org/docs/Web/HTML/Element/input | HTML input element}
|
|
450
|
+
*/
|
|
290
451
|
const SidebarInput = React.forwardRef<React.ComponentRef<typeof Input>, React.ComponentProps<typeof Input>>(
|
|
291
|
-
({className, ...props}, ref) =>
|
|
292
|
-
|
|
293
|
-
<Input
|
|
294
|
-
ref={ref}
|
|
295
|
-
data-sidebar='input'
|
|
296
|
-
className={cn(
|
|
297
|
-
"focus-visible:ring-sidebar-ring h-8 w-full bg-white shadow-none focus-visible:ring-2 dark:bg-neutral-950",
|
|
298
|
-
className,
|
|
299
|
-
)}
|
|
300
|
-
{...props}
|
|
301
|
-
/>
|
|
302
|
-
);
|
|
303
|
-
},
|
|
304
|
-
);
|
|
305
|
-
SidebarInput.displayName = "SidebarInput";
|
|
306
|
-
|
|
307
|
-
const SidebarHeader = React.forwardRef<HTMLDivElement, React.ComponentProps<"div">>(({className, ...props}, ref) => {
|
|
308
|
-
return (
|
|
309
|
-
<div
|
|
452
|
+
({className, ...props}, ref) => (
|
|
453
|
+
<Input
|
|
310
454
|
ref={ref}
|
|
311
|
-
data-sidebar='
|
|
312
|
-
className={cn(
|
|
455
|
+
data-sidebar='input'
|
|
456
|
+
className={cn(styles.input, className)}
|
|
313
457
|
{...props}
|
|
314
458
|
/>
|
|
315
|
-
)
|
|
316
|
-
|
|
459
|
+
),
|
|
460
|
+
);
|
|
461
|
+
SidebarInput.displayName = "SidebarInput";
|
|
462
|
+
|
|
463
|
+
/**
|
|
464
|
+
* Renders the header region of the sidebar.
|
|
465
|
+
*
|
|
466
|
+
* @remarks
|
|
467
|
+
* - Renders a `<div>` element
|
|
468
|
+
* - Built as a layout helper for branding or primary controls
|
|
469
|
+
*
|
|
470
|
+
* @example
|
|
471
|
+
* ```tsx
|
|
472
|
+
* <SidebarHeader>Workspace</SidebarHeader>
|
|
473
|
+
* ```
|
|
474
|
+
*
|
|
475
|
+
* @see {@link https://developer.mozilla.org/docs/Web/HTML/Element/div | HTML div element}
|
|
476
|
+
*/
|
|
477
|
+
const SidebarHeader = React.forwardRef<HTMLDivElement, React.ComponentProps<"div">>(({className, ...props}, ref) => (
|
|
478
|
+
<div
|
|
479
|
+
ref={ref}
|
|
480
|
+
data-sidebar='header'
|
|
481
|
+
className={cn(styles.header, className)}
|
|
482
|
+
{...props}
|
|
483
|
+
/>
|
|
484
|
+
));
|
|
317
485
|
SidebarHeader.displayName = "SidebarHeader";
|
|
318
486
|
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
487
|
+
/**
|
|
488
|
+
* Renders the footer region of the sidebar.
|
|
489
|
+
*
|
|
490
|
+
* @remarks
|
|
491
|
+
* - Renders a `<div>` element
|
|
492
|
+
* - Built as a layout helper for actions or account controls
|
|
493
|
+
*
|
|
494
|
+
* @example
|
|
495
|
+
* ```tsx
|
|
496
|
+
* <SidebarFooter>Footer content</SidebarFooter>
|
|
497
|
+
* ```
|
|
498
|
+
*
|
|
499
|
+
* @see {@link https://developer.mozilla.org/docs/Web/HTML/Element/div | HTML div element}
|
|
500
|
+
*/
|
|
501
|
+
const SidebarFooter = React.forwardRef<HTMLDivElement, React.ComponentProps<"div">>(({className, ...props}, ref) => (
|
|
502
|
+
<div
|
|
503
|
+
ref={ref}
|
|
504
|
+
data-sidebar='footer'
|
|
505
|
+
className={cn(styles.footer, className)}
|
|
506
|
+
{...props}
|
|
507
|
+
/>
|
|
508
|
+
));
|
|
329
509
|
SidebarFooter.displayName = "SidebarFooter";
|
|
330
510
|
|
|
511
|
+
/**
|
|
512
|
+
* Renders a separator between sidebar regions or menu groups.
|
|
513
|
+
*
|
|
514
|
+
* @remarks
|
|
515
|
+
* - Renders the shared `Separator` component
|
|
516
|
+
* - Built as a lightweight structural divider
|
|
517
|
+
*
|
|
518
|
+
* @example
|
|
519
|
+
* ```tsx
|
|
520
|
+
* <SidebarSeparator />
|
|
521
|
+
* ```
|
|
522
|
+
*
|
|
523
|
+
* @see {@link https://developer.mozilla.org/docs/Web/HTML/Element/hr | HTML thematic break}
|
|
524
|
+
*/
|
|
331
525
|
const SidebarSeparator = React.forwardRef<React.ComponentRef<typeof Separator>, React.ComponentProps<typeof Separator>>(
|
|
332
|
-
({className, ...props}, ref) =>
|
|
333
|
-
|
|
334
|
-
<Separator
|
|
335
|
-
ref={ref}
|
|
336
|
-
data-sidebar='separator'
|
|
337
|
-
className={cn("bg-sidebar-border mx-2 w-auto", className)}
|
|
338
|
-
{...props}
|
|
339
|
-
/>
|
|
340
|
-
);
|
|
341
|
-
},
|
|
342
|
-
);
|
|
343
|
-
SidebarSeparator.displayName = "SidebarSeparator";
|
|
344
|
-
|
|
345
|
-
const SidebarContent = React.forwardRef<HTMLDivElement, React.ComponentProps<"div">>(({className, ...props}, ref) => {
|
|
346
|
-
return (
|
|
347
|
-
<div
|
|
526
|
+
({className, ...props}, ref) => (
|
|
527
|
+
<Separator
|
|
348
528
|
ref={ref}
|
|
349
|
-
data-sidebar='
|
|
350
|
-
className={cn(
|
|
529
|
+
data-sidebar='separator'
|
|
530
|
+
className={cn(styles.separator, className)}
|
|
351
531
|
{...props}
|
|
352
532
|
/>
|
|
353
|
-
)
|
|
354
|
-
|
|
533
|
+
),
|
|
534
|
+
);
|
|
535
|
+
SidebarSeparator.displayName = "SidebarSeparator";
|
|
536
|
+
|
|
537
|
+
/**
|
|
538
|
+
* Renders the scrollable content region of the sidebar.
|
|
539
|
+
*
|
|
540
|
+
* @remarks
|
|
541
|
+
* - Renders a `<div>` element
|
|
542
|
+
* - Built as a layout helper for menu groups and custom content
|
|
543
|
+
*
|
|
544
|
+
* @example
|
|
545
|
+
* ```tsx
|
|
546
|
+
* <SidebarContent>
|
|
547
|
+
* <SidebarMenu />
|
|
548
|
+
* </SidebarContent>
|
|
549
|
+
* ```
|
|
550
|
+
*
|
|
551
|
+
* @see {@link https://developer.mozilla.org/docs/Web/HTML/Element/div | HTML div element}
|
|
552
|
+
*/
|
|
553
|
+
const SidebarContent = React.forwardRef<HTMLDivElement, React.ComponentProps<"div">>(({className, ...props}, ref) => (
|
|
554
|
+
<div
|
|
555
|
+
ref={ref}
|
|
556
|
+
data-sidebar='content'
|
|
557
|
+
className={cn(styles.content, className)}
|
|
558
|
+
{...props}
|
|
559
|
+
/>
|
|
560
|
+
));
|
|
355
561
|
SidebarContent.displayName = "SidebarContent";
|
|
356
562
|
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
563
|
+
/**
|
|
564
|
+
* Renders a logical grouping container inside the sidebar.
|
|
565
|
+
*
|
|
566
|
+
* @remarks
|
|
567
|
+
* - Renders a `<div>` element
|
|
568
|
+
* - Built as a layout helper for related navigation sections
|
|
569
|
+
*
|
|
570
|
+
* @example
|
|
571
|
+
* ```tsx
|
|
572
|
+
* <SidebarGroup>
|
|
573
|
+
* <SidebarGroupLabel>Projects</SidebarGroupLabel>
|
|
574
|
+
* </SidebarGroup>
|
|
575
|
+
* ```
|
|
576
|
+
*
|
|
577
|
+
* @see {@link https://developer.mozilla.org/docs/Web/HTML/Element/div | HTML div element}
|
|
578
|
+
*/
|
|
579
|
+
const SidebarGroup = React.forwardRef<HTMLDivElement, React.ComponentProps<"div">>(({className, ...props}, ref) => (
|
|
580
|
+
<div
|
|
581
|
+
ref={ref}
|
|
582
|
+
data-sidebar='group'
|
|
583
|
+
className={cn(styles.group, className)}
|
|
584
|
+
{...props}
|
|
585
|
+
/>
|
|
586
|
+
));
|
|
367
587
|
SidebarGroup.displayName = "SidebarGroup";
|
|
368
588
|
|
|
369
|
-
|
|
370
|
-
(
|
|
371
|
-
|
|
589
|
+
function cloneSidebarChild<TProps extends {className?: string}>(children: React.ReactNode, mergedProps: TProps): React.JSX.Element | null {
|
|
590
|
+
if (!React.isValidElement(children)) {
|
|
591
|
+
return null;
|
|
592
|
+
}
|
|
372
593
|
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
594
|
+
const child = children as React.ReactElement<TProps>;
|
|
595
|
+
|
|
596
|
+
// eslint-disable-next-line react-x/no-clone-element -- replaces Radix Slot while preserving asChild prop merging
|
|
597
|
+
return React.cloneElement(child, {
|
|
598
|
+
...mergedProps,
|
|
599
|
+
className: cn(mergedProps.className, child.props.className),
|
|
600
|
+
});
|
|
601
|
+
}
|
|
602
|
+
|
|
603
|
+
/**
|
|
604
|
+
* Props for the sidebar group label.
|
|
605
|
+
*/
|
|
606
|
+
interface SidebarGroupLabelProps extends React.ComponentProps<"div"> {
|
|
607
|
+
/**
|
|
608
|
+
* Whether to merge props into the single child element instead of rendering a wrapper `<div>`.
|
|
609
|
+
* @default false
|
|
610
|
+
*/
|
|
611
|
+
asChild?: boolean;
|
|
612
|
+
}
|
|
613
|
+
|
|
614
|
+
/**
|
|
615
|
+
* Renders the heading label for a sidebar group.
|
|
616
|
+
*
|
|
617
|
+
* @remarks
|
|
618
|
+
* - Renders a `<div>` element by default
|
|
619
|
+
* - Supports `asChild` composition for custom markup
|
|
620
|
+
*
|
|
621
|
+
* @example
|
|
622
|
+
* ```tsx
|
|
623
|
+
* <SidebarGroupLabel>Projects</SidebarGroupLabel>
|
|
624
|
+
* ```
|
|
625
|
+
*
|
|
626
|
+
* @see {@link https://react.dev/reference/react/cloneElement | React cloneElement Docs}
|
|
627
|
+
*/
|
|
628
|
+
const SidebarGroupLabel = React.forwardRef<HTMLDivElement, SidebarGroupLabelProps>(
|
|
629
|
+
({className, asChild = false, children, ...props}, ref) => {
|
|
630
|
+
const mergedProps: SidebarCloneableDivProps = {
|
|
631
|
+
...props,
|
|
632
|
+
children,
|
|
633
|
+
className: cn(styles.groupLabel, className),
|
|
634
|
+
"data-sidebar": "group-label",
|
|
635
|
+
ref,
|
|
636
|
+
};
|
|
637
|
+
|
|
638
|
+
if (asChild) {
|
|
639
|
+
const clonedChild = cloneSidebarChild(children, mergedProps);
|
|
640
|
+
|
|
641
|
+
if (clonedChild) {
|
|
642
|
+
return clonedChild;
|
|
643
|
+
}
|
|
644
|
+
}
|
|
645
|
+
|
|
646
|
+
return <div {...mergedProps} />;
|
|
385
647
|
},
|
|
386
648
|
);
|
|
387
649
|
SidebarGroupLabel.displayName = "SidebarGroupLabel";
|
|
388
650
|
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
651
|
+
/**
|
|
652
|
+
* Props for the sidebar group action button.
|
|
653
|
+
*/
|
|
654
|
+
interface SidebarGroupActionProps extends React.ComponentProps<"button"> {
|
|
655
|
+
/**
|
|
656
|
+
* Whether to merge props into the single child element instead of rendering a wrapper `<button>`.
|
|
657
|
+
* @default false
|
|
658
|
+
*/
|
|
659
|
+
asChild?: boolean;
|
|
660
|
+
}
|
|
661
|
+
|
|
662
|
+
/**
|
|
663
|
+
* Renders a secondary action aligned with a sidebar group heading.
|
|
664
|
+
*
|
|
665
|
+
* @remarks
|
|
666
|
+
* - Renders a `<button>` element by default
|
|
667
|
+
* - Supports `asChild` composition for custom controls
|
|
668
|
+
*
|
|
669
|
+
* @example
|
|
670
|
+
* ```tsx
|
|
671
|
+
* <SidebarGroupAction aria-label='Add project'>+</SidebarGroupAction>
|
|
672
|
+
* ```
|
|
673
|
+
*
|
|
674
|
+
* @see {@link https://react.dev/reference/react/cloneElement | React cloneElement Docs}
|
|
675
|
+
*/
|
|
676
|
+
const SidebarGroupAction = React.forwardRef<HTMLButtonElement, SidebarGroupActionProps>(
|
|
677
|
+
({className, asChild = false, children, ...props}, ref) => {
|
|
678
|
+
const mergedProps: SidebarCloneableButtonProps = {
|
|
679
|
+
...props,
|
|
680
|
+
children,
|
|
681
|
+
className: cn(styles.groupAction, className),
|
|
682
|
+
"data-sidebar": "group-action",
|
|
683
|
+
ref,
|
|
684
|
+
type: props.type ?? "button",
|
|
685
|
+
};
|
|
686
|
+
|
|
687
|
+
if (asChild) {
|
|
688
|
+
const clonedChild = cloneSidebarChild(children, mergedProps);
|
|
689
|
+
|
|
690
|
+
if (clonedChild) {
|
|
691
|
+
return clonedChild;
|
|
692
|
+
}
|
|
693
|
+
}
|
|
392
694
|
|
|
393
695
|
return (
|
|
394
|
-
<
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
className={cn(
|
|
398
|
-
"text-sidebar-foreground ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground absolute top-3.5 right-3 flex aspect-square w-5 items-center justify-center rounded-md p-0 transition-transform outline-none focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0",
|
|
399
|
-
// Increases the hit area of the button on mobile.
|
|
400
|
-
"after:absolute after:-inset-2 after:md:hidden",
|
|
401
|
-
"group-data-[collapsible=icon]:hidden",
|
|
402
|
-
className,
|
|
403
|
-
)}
|
|
404
|
-
{...props}
|
|
696
|
+
<button
|
|
697
|
+
type={props.type === "submit" ? "submit" : props.type === "reset" ? "reset" : "button"}
|
|
698
|
+
{...mergedProps}
|
|
405
699
|
/>
|
|
406
700
|
);
|
|
407
701
|
},
|
|
408
702
|
);
|
|
409
703
|
SidebarGroupAction.displayName = "SidebarGroupAction";
|
|
410
704
|
|
|
705
|
+
/**
|
|
706
|
+
* Renders the content container for a sidebar group.
|
|
707
|
+
*
|
|
708
|
+
* @remarks
|
|
709
|
+
* - Renders a `<div>` element
|
|
710
|
+
* - Built as a structural wrapper for nested menu items or custom content
|
|
711
|
+
*
|
|
712
|
+
* @example
|
|
713
|
+
* ```tsx
|
|
714
|
+
* <SidebarGroupContent>
|
|
715
|
+
* <SidebarMenu />
|
|
716
|
+
* </SidebarGroupContent>
|
|
717
|
+
* ```
|
|
718
|
+
*
|
|
719
|
+
* @see {@link https://developer.mozilla.org/docs/Web/HTML/Element/div | HTML div element}
|
|
720
|
+
*/
|
|
411
721
|
const SidebarGroupContent = React.forwardRef<HTMLDivElement, React.ComponentProps<"div">>(({className, ...props}, ref) => (
|
|
412
722
|
<div
|
|
413
723
|
ref={ref}
|
|
414
724
|
data-sidebar='group-content'
|
|
415
|
-
className={cn(
|
|
725
|
+
className={cn(styles.groupContent, className)}
|
|
416
726
|
{...props}
|
|
417
727
|
/>
|
|
418
728
|
));
|
|
419
729
|
SidebarGroupContent.displayName = "SidebarGroupContent";
|
|
420
730
|
|
|
731
|
+
/**
|
|
732
|
+
* Renders the root sidebar navigation list.
|
|
733
|
+
*
|
|
734
|
+
* @remarks
|
|
735
|
+
* - Renders a `<ul>` element
|
|
736
|
+
* - Built as the primary menu container for sidebar navigation
|
|
737
|
+
*
|
|
738
|
+
* @example
|
|
739
|
+
* ```tsx
|
|
740
|
+
* <SidebarMenu>
|
|
741
|
+
* <SidebarMenuItem />
|
|
742
|
+
* </SidebarMenu>
|
|
743
|
+
* ```
|
|
744
|
+
*
|
|
745
|
+
* @see {@link https://developer.mozilla.org/docs/Web/HTML/Element/ul | HTML ul element}
|
|
746
|
+
*/
|
|
421
747
|
const SidebarMenu = React.forwardRef<HTMLUListElement, React.ComponentProps<"ul">>(({className, ...props}, ref) => (
|
|
422
748
|
<ul
|
|
423
749
|
ref={ref}
|
|
424
750
|
data-sidebar='menu'
|
|
425
|
-
className={cn(
|
|
751
|
+
className={cn(styles.menu, className)}
|
|
426
752
|
{...props}
|
|
427
753
|
/>
|
|
428
754
|
));
|
|
429
755
|
SidebarMenu.displayName = "SidebarMenu";
|
|
430
756
|
|
|
757
|
+
/**
|
|
758
|
+
* Renders a single list item within the sidebar menu.
|
|
759
|
+
*
|
|
760
|
+
* @remarks
|
|
761
|
+
* - Renders an `<li>` element
|
|
762
|
+
* - Built as a structural wrapper for menu buttons and actions
|
|
763
|
+
*
|
|
764
|
+
* @example
|
|
765
|
+
* ```tsx
|
|
766
|
+
* <SidebarMenuItem>
|
|
767
|
+
* <SidebarMenuButton>Dashboard</SidebarMenuButton>
|
|
768
|
+
* </SidebarMenuItem>
|
|
769
|
+
* ```
|
|
770
|
+
*
|
|
771
|
+
* @see {@link https://developer.mozilla.org/docs/Web/HTML/Element/li | HTML li element}
|
|
772
|
+
*/
|
|
431
773
|
const SidebarMenuItem = React.forwardRef<HTMLLIElement, React.ComponentProps<"li">>(({className, ...props}, ref) => (
|
|
432
774
|
<li
|
|
433
775
|
ref={ref}
|
|
434
776
|
data-sidebar='menu-item'
|
|
435
|
-
className={cn(
|
|
777
|
+
className={cn(styles.menuItem, className)}
|
|
436
778
|
{...props}
|
|
437
779
|
/>
|
|
438
780
|
));
|
|
439
781
|
SidebarMenuItem.displayName = "SidebarMenuItem";
|
|
440
782
|
|
|
441
|
-
const
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
variant: {
|
|
446
|
-
default: "hover:bg-sidebar-accent hover:text-sidebar-accent-foreground",
|
|
447
|
-
outline:
|
|
448
|
-
"bg-white shadow-[0_0_0_1px_hsl(var(--sidebar-border))] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground hover:shadow-[0_0_0_1px_hsl(var(--sidebar-accent))] dark:bg-neutral-950",
|
|
449
|
-
},
|
|
450
|
-
size: {
|
|
451
|
-
default: "h-8 text-sm",
|
|
452
|
-
sm: "h-7 text-xs",
|
|
453
|
-
lg: "h-12 text-sm group-data-[collapsible=icon]:!p-0",
|
|
454
|
-
},
|
|
455
|
-
},
|
|
456
|
-
defaultVariants: {
|
|
457
|
-
variant: "default",
|
|
458
|
-
size: "default",
|
|
459
|
-
},
|
|
460
|
-
},
|
|
461
|
-
);
|
|
783
|
+
const sidebarMenuButtonVariantStyles = {
|
|
784
|
+
default: styles.menuButtonDefault,
|
|
785
|
+
outline: styles.menuButtonOutline,
|
|
786
|
+
} as const;
|
|
462
787
|
|
|
463
|
-
const
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
tooltip?: string | React.ComponentProps<typeof TooltipContent>;
|
|
469
|
-
} & VariantProps<typeof sidebarMenuButtonVariants>
|
|
470
|
-
>(({asChild = false, isActive = false, variant = "default", size = "default", tooltip, className, ...props}, ref) => {
|
|
471
|
-
const Comp = asChild ? Slot : "button";
|
|
472
|
-
const {isMobile, state} = useSidebar();
|
|
473
|
-
|
|
474
|
-
const button = (
|
|
475
|
-
<Comp
|
|
476
|
-
ref={ref}
|
|
477
|
-
data-sidebar='menu-button'
|
|
478
|
-
data-size={size}
|
|
479
|
-
data-active={isActive}
|
|
480
|
-
className={cn(sidebarMenuButtonVariants({variant, size}), className)}
|
|
481
|
-
{...props}
|
|
482
|
-
/>
|
|
483
|
-
);
|
|
788
|
+
const sidebarMenuButtonSizeStyles = {
|
|
789
|
+
default: styles.menuButtonSizeDefault,
|
|
790
|
+
sm: styles.menuButtonSizeSm,
|
|
791
|
+
lg: styles.menuButtonSizeLg,
|
|
792
|
+
} as const;
|
|
484
793
|
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
794
|
+
/**
|
|
795
|
+
* Props for the sidebar menu button.
|
|
796
|
+
*/
|
|
797
|
+
interface SidebarMenuButtonProps extends React.ComponentProps<"button"> {
|
|
798
|
+
/**
|
|
799
|
+
* Whether to merge props into the single child element instead of rendering a wrapper `<button>`.
|
|
800
|
+
* @default false
|
|
801
|
+
*/
|
|
802
|
+
asChild?: boolean;
|
|
803
|
+
/**
|
|
804
|
+
* Whether the menu item should be styled as active.
|
|
805
|
+
* @default false
|
|
806
|
+
*/
|
|
807
|
+
isActive?: boolean;
|
|
808
|
+
/**
|
|
809
|
+
* Tooltip content displayed when the sidebar is collapsed on desktop.
|
|
810
|
+
* @default undefined
|
|
811
|
+
*/
|
|
812
|
+
tooltip?: string | React.ComponentProps<typeof TooltipContent>;
|
|
813
|
+
/**
|
|
814
|
+
* Visual style variant for the menu button.
|
|
815
|
+
* @default "default"
|
|
816
|
+
*/
|
|
817
|
+
variant?: keyof typeof sidebarMenuButtonVariantStyles;
|
|
818
|
+
/**
|
|
819
|
+
* Size preset for the menu button.
|
|
820
|
+
* @default "default"
|
|
821
|
+
*/
|
|
822
|
+
size?: keyof typeof sidebarMenuButtonSizeStyles;
|
|
823
|
+
}
|
|
488
824
|
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
825
|
+
/**
|
|
826
|
+
* Renders the primary interactive element for a sidebar menu item.
|
|
827
|
+
*
|
|
828
|
+
* @remarks
|
|
829
|
+
* - Renders a `<button>` element by default
|
|
830
|
+
* - Supports `asChild` composition and contextual tooltips when collapsed
|
|
831
|
+
*
|
|
832
|
+
* @example
|
|
833
|
+
* ```tsx
|
|
834
|
+
* <SidebarMenuButton isActive>Dashboard</SidebarMenuButton>
|
|
835
|
+
* ```
|
|
836
|
+
*
|
|
837
|
+
* @see {@link https://react.dev/reference/react/cloneElement | React cloneElement Docs}
|
|
838
|
+
*/
|
|
839
|
+
const SidebarMenuButton = React.forwardRef<HTMLButtonElement, SidebarMenuButtonProps>(
|
|
840
|
+
({asChild = false, isActive = false, variant = "default", size = "default", tooltip, className, children, ...props}, ref) => {
|
|
841
|
+
const {isMobile, state} = useSidebar();
|
|
842
|
+
const mergedProps: SidebarCloneableButtonProps = {
|
|
843
|
+
...props,
|
|
844
|
+
children,
|
|
845
|
+
className: cn(styles.menuButton, sidebarMenuButtonVariantStyles[variant], sidebarMenuButtonSizeStyles[size], className),
|
|
846
|
+
"data-active": isActive,
|
|
847
|
+
"data-sidebar": "menu-button",
|
|
848
|
+
"data-size": size,
|
|
849
|
+
ref,
|
|
850
|
+
type: props.type ?? "button",
|
|
492
851
|
};
|
|
493
|
-
|
|
852
|
+
const clonedChild = asChild ? cloneSidebarChild(children, mergedProps) : null;
|
|
494
853
|
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
side='right'
|
|
500
|
-
align='center'
|
|
501
|
-
hidden={state !== "collapsed" || isMobile}
|
|
502
|
-
{...tooltip}
|
|
854
|
+
const button = clonedChild ?? (
|
|
855
|
+
<button
|
|
856
|
+
type={props.type === "submit" ? "submit" : props.type === "reset" ? "reset" : "button"}
|
|
857
|
+
{...mergedProps}
|
|
503
858
|
/>
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
859
|
+
);
|
|
860
|
+
|
|
861
|
+
if (!tooltip) {
|
|
862
|
+
return button;
|
|
863
|
+
}
|
|
864
|
+
|
|
865
|
+
const resolvedTooltip = typeof tooltip === "string" ? {children: tooltip} : tooltip;
|
|
866
|
+
|
|
867
|
+
return (
|
|
868
|
+
<Tooltip>
|
|
869
|
+
<TooltipTrigger render={button as React.ReactElement} />
|
|
870
|
+
<TooltipContent
|
|
871
|
+
hidden={state !== "collapsed" || isMobile}
|
|
872
|
+
{...resolvedTooltip}
|
|
873
|
+
/>
|
|
874
|
+
</Tooltip>
|
|
875
|
+
);
|
|
876
|
+
},
|
|
877
|
+
);
|
|
507
878
|
SidebarMenuButton.displayName = "SidebarMenuButton";
|
|
508
879
|
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
880
|
+
/**
|
|
881
|
+
* Props for the sidebar menu action button.
|
|
882
|
+
*/
|
|
883
|
+
interface SidebarMenuActionProps extends React.ComponentProps<"button"> {
|
|
884
|
+
/**
|
|
885
|
+
* Whether to merge props into the single child element instead of rendering a wrapper `<button>`.
|
|
886
|
+
* @default false
|
|
887
|
+
*/
|
|
888
|
+
asChild?: boolean;
|
|
889
|
+
/**
|
|
890
|
+
* Whether the action should remain hidden until its parent item is hovered.
|
|
891
|
+
* @default false
|
|
892
|
+
*/
|
|
893
|
+
showOnHover?: boolean;
|
|
894
|
+
}
|
|
517
895
|
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
896
|
+
/**
|
|
897
|
+
* Renders a secondary action button aligned within a sidebar menu item.
|
|
898
|
+
*
|
|
899
|
+
* @remarks
|
|
900
|
+
* - Renders a `<button>` element by default
|
|
901
|
+
* - Supports `asChild` composition for custom controls
|
|
902
|
+
*
|
|
903
|
+
* @example
|
|
904
|
+
* ```tsx
|
|
905
|
+
* <SidebarMenuAction showOnHover>⋯</SidebarMenuAction>
|
|
906
|
+
* ```
|
|
907
|
+
*
|
|
908
|
+
* @see {@link https://react.dev/reference/react/cloneElement | React cloneElement Docs}
|
|
909
|
+
*/
|
|
910
|
+
const SidebarMenuAction = React.forwardRef<HTMLButtonElement, SidebarMenuActionProps>(
|
|
911
|
+
({className, asChild = false, showOnHover = false, children, ...props}, ref) => {
|
|
912
|
+
const mergedProps: SidebarCloneableButtonProps = {
|
|
913
|
+
...props,
|
|
914
|
+
children,
|
|
915
|
+
className: cn(styles.menuAction, showOnHover && styles.menuActionShowOnHover, className),
|
|
916
|
+
"data-sidebar": "menu-action",
|
|
917
|
+
ref,
|
|
918
|
+
type: props.type ?? "button",
|
|
919
|
+
};
|
|
920
|
+
|
|
921
|
+
if (asChild) {
|
|
922
|
+
const clonedChild = cloneSidebarChild(children, mergedProps);
|
|
923
|
+
|
|
924
|
+
if (clonedChild) {
|
|
925
|
+
return clonedChild;
|
|
926
|
+
}
|
|
927
|
+
}
|
|
928
|
+
|
|
929
|
+
return (
|
|
930
|
+
<button
|
|
931
|
+
type={props.type === "submit" ? "submit" : props.type === "reset" ? "reset" : "button"}
|
|
932
|
+
{...mergedProps}
|
|
933
|
+
/>
|
|
934
|
+
);
|
|
935
|
+
},
|
|
936
|
+
);
|
|
538
937
|
SidebarMenuAction.displayName = "SidebarMenuAction";
|
|
539
938
|
|
|
939
|
+
/**
|
|
940
|
+
* Renders a badge alongside a sidebar menu item.
|
|
941
|
+
*
|
|
942
|
+
* @remarks
|
|
943
|
+
* - Renders a `<div>` element
|
|
944
|
+
* - Built as a lightweight presentational helper for counts and statuses
|
|
945
|
+
*
|
|
946
|
+
* @example
|
|
947
|
+
* ```tsx
|
|
948
|
+
* <SidebarMenuBadge>3</SidebarMenuBadge>
|
|
949
|
+
* ```
|
|
950
|
+
*
|
|
951
|
+
* @see {@link https://developer.mozilla.org/docs/Web/HTML/Element/div | HTML div element}
|
|
952
|
+
*/
|
|
540
953
|
const SidebarMenuBadge = React.forwardRef<HTMLDivElement, React.ComponentProps<"div">>(({className, ...props}, ref) => (
|
|
541
954
|
<div
|
|
542
955
|
ref={ref}
|
|
543
956
|
data-sidebar='menu-badge'
|
|
544
|
-
className={cn(
|
|
545
|
-
"text-sidebar-foreground pointer-events-none absolute right-1 flex h-5 min-w-5 items-center justify-center rounded-md px-1 text-xs font-medium tabular-nums select-none",
|
|
546
|
-
"peer-hover/menu-button:text-sidebar-accent-foreground peer-data-[active=true]/menu-button:text-sidebar-accent-foreground",
|
|
547
|
-
"peer-data-[size=sm]/menu-button:top-1",
|
|
548
|
-
"peer-data-[size=default]/menu-button:top-1.5",
|
|
549
|
-
"peer-data-[size=lg]/menu-button:top-2.5",
|
|
550
|
-
"group-data-[collapsible=icon]:hidden",
|
|
551
|
-
className,
|
|
552
|
-
)}
|
|
957
|
+
className={cn(styles.menuBadge, className)}
|
|
553
958
|
{...props}
|
|
554
959
|
/>
|
|
555
960
|
));
|
|
556
961
|
SidebarMenuBadge.displayName = "SidebarMenuBadge";
|
|
557
962
|
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
963
|
+
/**
|
|
964
|
+
* Props for the sidebar menu skeleton.
|
|
965
|
+
*/
|
|
966
|
+
interface SidebarMenuSkeletonProps extends React.ComponentProps<"div"> {
|
|
967
|
+
/**
|
|
968
|
+
* Whether to render a leading skeleton icon placeholder.
|
|
969
|
+
* @default false
|
|
970
|
+
*/
|
|
971
|
+
showIcon?: boolean;
|
|
972
|
+
}
|
|
973
|
+
|
|
974
|
+
/**
|
|
975
|
+
* Renders a loading placeholder for sidebar menu items.
|
|
976
|
+
*
|
|
977
|
+
* @remarks
|
|
978
|
+
* - Renders a `<div>` element
|
|
979
|
+
* - Built from shared `Skeleton` primitives
|
|
980
|
+
*
|
|
981
|
+
* @example
|
|
982
|
+
* ```tsx
|
|
983
|
+
* <SidebarMenuSkeleton showIcon />
|
|
984
|
+
* ```
|
|
985
|
+
*
|
|
986
|
+
* @see {@link https://developer.mozilla.org/docs/Web/HTML/Element/div | HTML div element}
|
|
987
|
+
*/
|
|
988
|
+
const SidebarMenuSkeleton = React.forwardRef<HTMLDivElement, SidebarMenuSkeletonProps>(({className, showIcon = false, ...props}, ref) => {
|
|
989
|
+
const width = React.useMemo(() => `${Math.floor(Math.random() * 40) + 50}%`, []);
|
|
568
990
|
|
|
569
991
|
return (
|
|
570
992
|
<div
|
|
571
993
|
ref={ref}
|
|
572
994
|
data-sidebar='menu-skeleton'
|
|
573
|
-
className={cn(
|
|
995
|
+
className={cn(styles.menuSkeleton, className)}
|
|
574
996
|
{...props}>
|
|
575
|
-
{showIcon && (
|
|
997
|
+
{Boolean(showIcon) && (
|
|
576
998
|
<Skeleton
|
|
577
|
-
className=
|
|
999
|
+
className={styles.menuSkeletonIcon}
|
|
578
1000
|
data-sidebar='menu-skeleton-icon'
|
|
579
1001
|
/>
|
|
580
1002
|
)}
|
|
581
1003
|
<Skeleton
|
|
582
|
-
className=
|
|
1004
|
+
className={styles.menuSkeletonText}
|
|
583
1005
|
data-sidebar='menu-skeleton-text'
|
|
584
|
-
style={
|
|
585
|
-
{
|
|
586
|
-
"--skeleton-width": width,
|
|
587
|
-
} as React.CSSProperties
|
|
588
|
-
}
|
|
1006
|
+
style={{"--ac-skeleton-width": width} as React.CSSProperties}
|
|
589
1007
|
/>
|
|
590
1008
|
</div>
|
|
591
1009
|
);
|
|
592
1010
|
});
|
|
593
1011
|
SidebarMenuSkeleton.displayName = "SidebarMenuSkeleton";
|
|
594
1012
|
|
|
1013
|
+
/**
|
|
1014
|
+
* Renders a nested menu list within the sidebar.
|
|
1015
|
+
*
|
|
1016
|
+
* @remarks
|
|
1017
|
+
* - Renders a `<ul>` element
|
|
1018
|
+
* - Built for multi-level navigation structures
|
|
1019
|
+
*
|
|
1020
|
+
* @example
|
|
1021
|
+
* ```tsx
|
|
1022
|
+
* <SidebarMenuSub>
|
|
1023
|
+
* <SidebarMenuSubItem />
|
|
1024
|
+
* </SidebarMenuSub>
|
|
1025
|
+
* ```
|
|
1026
|
+
*
|
|
1027
|
+
* @see {@link https://developer.mozilla.org/docs/Web/HTML/Element/ul | HTML ul element}
|
|
1028
|
+
*/
|
|
595
1029
|
const SidebarMenuSub = React.forwardRef<HTMLUListElement, React.ComponentProps<"ul">>(({className, ...props}, ref) => (
|
|
596
1030
|
<ul
|
|
597
1031
|
ref={ref}
|
|
598
1032
|
data-sidebar='menu-sub'
|
|
599
|
-
className={cn(
|
|
600
|
-
"border-sidebar-border mx-3.5 flex min-w-0 translate-x-px flex-col gap-1 border-l px-2.5 py-0.5",
|
|
601
|
-
"group-data-[collapsible=icon]:hidden",
|
|
602
|
-
className,
|
|
603
|
-
)}
|
|
1033
|
+
className={cn(styles.menuSub, className)}
|
|
604
1034
|
{...props}
|
|
605
1035
|
/>
|
|
606
1036
|
));
|
|
607
1037
|
SidebarMenuSub.displayName = "SidebarMenuSub";
|
|
608
1038
|
|
|
609
|
-
|
|
1039
|
+
/**
|
|
1040
|
+
* Renders a single nested sidebar menu list item.
|
|
1041
|
+
*
|
|
1042
|
+
* @remarks
|
|
1043
|
+
* - Renders an `<li>` element
|
|
1044
|
+
* - Built as a structural wrapper for nested menu links
|
|
1045
|
+
*
|
|
1046
|
+
* @example
|
|
1047
|
+
* ```tsx
|
|
1048
|
+
* <SidebarMenuSubItem />
|
|
1049
|
+
* ```
|
|
1050
|
+
*
|
|
1051
|
+
* @see {@link https://developer.mozilla.org/docs/Web/HTML/Element/li | HTML li element}
|
|
1052
|
+
*/
|
|
1053
|
+
const SidebarMenuSubItem = React.forwardRef<HTMLLIElement, React.ComponentProps<"li">>((props, ref) => (
|
|
610
1054
|
<li
|
|
611
1055
|
ref={ref}
|
|
612
1056
|
{...props}
|
|
@@ -614,34 +1058,64 @@ const SidebarMenuSubItem = React.forwardRef<HTMLLIElement, React.ComponentProps<
|
|
|
614
1058
|
));
|
|
615
1059
|
SidebarMenuSubItem.displayName = "SidebarMenuSubItem";
|
|
616
1060
|
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
1061
|
+
/**
|
|
1062
|
+
* Props for the sidebar nested menu button.
|
|
1063
|
+
*/
|
|
1064
|
+
interface SidebarMenuSubButtonProps extends React.ComponentProps<"a"> {
|
|
1065
|
+
/**
|
|
1066
|
+
* Whether to merge props into the single child element instead of rendering a wrapper `<a>`.
|
|
1067
|
+
* @default false
|
|
1068
|
+
*/
|
|
1069
|
+
asChild?: boolean;
|
|
1070
|
+
/**
|
|
1071
|
+
* Size preset for the nested menu link.
|
|
1072
|
+
* @default "md"
|
|
1073
|
+
*/
|
|
1074
|
+
size?: "sm" | "md";
|
|
1075
|
+
/**
|
|
1076
|
+
* Whether the nested menu item should be styled as active.
|
|
1077
|
+
* @default undefined
|
|
1078
|
+
*/
|
|
1079
|
+
isActive?: boolean;
|
|
1080
|
+
}
|
|
626
1081
|
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
1082
|
+
/**
|
|
1083
|
+
* Renders a nested sidebar menu link.
|
|
1084
|
+
*
|
|
1085
|
+
* @remarks
|
|
1086
|
+
* - Renders an `<a>` element by default
|
|
1087
|
+
* - Supports `asChild` composition for custom link components
|
|
1088
|
+
*
|
|
1089
|
+
* @example
|
|
1090
|
+
* ```tsx
|
|
1091
|
+
* <SidebarMenuSubButton href='/settings/profile'>Profile</SidebarMenuSubButton>
|
|
1092
|
+
* ```
|
|
1093
|
+
*
|
|
1094
|
+
* @see {@link https://react.dev/reference/react/cloneElement | React cloneElement Docs}
|
|
1095
|
+
*/
|
|
1096
|
+
const SidebarMenuSubButton = React.forwardRef<HTMLAnchorElement, SidebarMenuSubButtonProps>(
|
|
1097
|
+
({asChild = false, size = "md", isActive, className, children, ...props}, ref) => {
|
|
1098
|
+
const mergedProps: SidebarCloneableAnchorProps = {
|
|
1099
|
+
...props,
|
|
1100
|
+
children,
|
|
1101
|
+
className: cn(styles.menuSubButton, size === "sm" ? styles.menuSubButtonSm : styles.menuSubButtonMd, className),
|
|
1102
|
+
"data-active": isActive,
|
|
1103
|
+
"data-sidebar": "menu-sub-button",
|
|
1104
|
+
"data-size": size,
|
|
1105
|
+
ref,
|
|
1106
|
+
};
|
|
1107
|
+
|
|
1108
|
+
if (asChild) {
|
|
1109
|
+
const clonedChild = cloneSidebarChild(children, mergedProps);
|
|
1110
|
+
|
|
1111
|
+
if (clonedChild) {
|
|
1112
|
+
return clonedChild;
|
|
1113
|
+
}
|
|
1114
|
+
}
|
|
1115
|
+
|
|
1116
|
+
return <a {...mergedProps}>{children}</a>;
|
|
1117
|
+
},
|
|
1118
|
+
);
|
|
645
1119
|
SidebarMenuSubButton.displayName = "SidebarMenuSubButton";
|
|
646
1120
|
|
|
647
1121
|
export {
|