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