@object-ui/components 0.3.0 → 0.5.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/.turbo/turbo-build.log +47 -0
- package/CHANGELOG.md +10 -0
- package/README.md +32 -1
- package/README_SHADCN_SYNC.md +281 -0
- package/TESTING.md +335 -0
- package/dist/index.css +1 -1
- package/dist/index.js +45067 -34357
- package/dist/index.umd.cjs +54 -42
- package/dist/src/SchemaRenderer.d.ts +3 -0
- package/dist/src/{ui → custom}/button-group.d.ts +1 -1
- package/dist/src/custom/combobox.d.ts +22 -0
- package/dist/src/custom/date-picker.d.ts +15 -0
- package/dist/src/custom/field.d.ts +19 -0
- package/dist/src/{ui → custom}/filter-builder.d.ts +7 -0
- package/dist/src/custom/index.d.ts +12 -0
- package/dist/src/custom/input-group.d.ts +14 -0
- package/dist/src/{ui → custom}/item.d.ts +8 -1
- package/dist/src/{ui → custom}/kbd.d.ts +7 -0
- package/dist/src/custom/native-select.d.ts +12 -0
- package/dist/src/custom/sort-builder.d.ts +22 -0
- package/dist/src/custom/spinner.d.ts +10 -0
- package/dist/src/hooks/use-mobile.d.ts +7 -0
- package/dist/src/index.d.ts +5 -1
- package/dist/src/renderers/basic/button-group.d.ts +8 -0
- package/dist/src/renderers/basic/div.d.ts +7 -0
- package/dist/src/renderers/basic/html.d.ts +7 -0
- package/dist/src/renderers/basic/icon.d.ts +7 -0
- package/dist/src/renderers/basic/image.d.ts +7 -0
- package/dist/src/renderers/basic/navigation-menu.d.ts +8 -0
- package/dist/src/renderers/basic/pagination.d.ts +8 -0
- package/dist/src/renderers/basic/separator.d.ts +7 -0
- package/dist/src/renderers/basic/span.d.ts +7 -0
- package/dist/src/renderers/basic/text.d.ts +7 -0
- package/dist/src/renderers/complex/carousel.d.ts +7 -0
- package/dist/src/renderers/complex/data-table.d.ts +7 -0
- package/dist/src/renderers/complex/filter-builder.d.ts +7 -0
- package/dist/src/renderers/complex/resizable.d.ts +7 -0
- package/dist/src/renderers/complex/scroll-area.d.ts +7 -0
- package/dist/src/renderers/complex/table.d.ts +7 -0
- package/dist/src/renderers/data-display/alert.d.ts +7 -0
- package/dist/src/renderers/data-display/avatar.d.ts +7 -0
- package/dist/src/renderers/data-display/badge.d.ts +7 -0
- package/dist/src/renderers/data-display/breadcrumb.d.ts +8 -0
- package/dist/src/renderers/data-display/kbd.d.ts +8 -0
- package/dist/src/renderers/data-display/list.d.ts +7 -0
- package/dist/src/renderers/data-display/statistic.d.ts +7 -0
- package/dist/src/renderers/data-display/table.d.ts +8 -0
- package/dist/src/renderers/data-display/tree-view.d.ts +7 -0
- package/dist/src/renderers/disclosure/accordion.d.ts +7 -0
- package/dist/src/renderers/disclosure/collapsible.d.ts +7 -0
- package/dist/src/renderers/disclosure/toggle-group.d.ts +8 -0
- package/dist/src/renderers/feedback/empty.d.ts +8 -0
- package/dist/src/renderers/feedback/loading.d.ts +7 -0
- package/dist/src/renderers/feedback/progress.d.ts +7 -0
- package/dist/src/renderers/feedback/skeleton.d.ts +7 -0
- package/dist/src/renderers/feedback/sonner.d.ts +8 -0
- package/dist/src/renderers/feedback/spinner.d.ts +8 -0
- package/dist/src/renderers/feedback/toast.d.ts +8 -0
- package/dist/src/renderers/feedback/toaster.d.ts +7 -0
- package/dist/src/renderers/form/button.d.ts +7 -0
- package/dist/src/renderers/form/calendar.d.ts +7 -0
- package/dist/src/renderers/form/checkbox.d.ts +7 -0
- package/dist/src/renderers/form/combobox.d.ts +8 -0
- package/dist/src/renderers/form/command.d.ts +8 -0
- package/dist/src/renderers/form/date-picker.d.ts +7 -0
- package/dist/src/renderers/form/file-upload.d.ts +7 -0
- package/dist/src/renderers/form/form.d.ts +7 -0
- package/dist/src/renderers/form/input-otp.d.ts +7 -0
- package/dist/src/renderers/form/input.d.ts +7 -0
- package/dist/src/renderers/form/label.d.ts +7 -0
- package/dist/src/renderers/form/radio-group.d.ts +7 -0
- package/dist/src/renderers/form/select.d.ts +7 -0
- package/dist/src/renderers/form/slider.d.ts +7 -0
- package/dist/src/renderers/form/switch.d.ts +7 -0
- package/dist/src/renderers/form/textarea.d.ts +7 -0
- package/dist/src/renderers/form/toggle.d.ts +7 -0
- package/dist/src/renderers/layout/aspect-ratio.d.ts +8 -0
- package/dist/src/renderers/layout/card.d.ts +7 -0
- package/dist/src/renderers/layout/container.d.ts +7 -0
- package/dist/src/renderers/layout/flex.d.ts +7 -0
- package/dist/src/renderers/layout/grid.d.ts +7 -0
- package/dist/src/renderers/layout/page.d.ts +1 -1
- package/dist/src/renderers/layout/semantic.d.ts +7 -0
- package/dist/src/renderers/layout/stack.d.ts +7 -0
- package/dist/src/renderers/layout/tabs.d.ts +7 -0
- package/dist/src/renderers/navigation/header-bar.d.ts +7 -0
- package/dist/src/renderers/navigation/sidebar.d.ts +7 -0
- package/dist/src/renderers/overlay/alert-dialog.d.ts +7 -0
- package/dist/src/renderers/overlay/context-menu.d.ts +7 -0
- package/dist/src/renderers/overlay/dialog.d.ts +7 -0
- package/dist/src/renderers/overlay/drawer.d.ts +7 -0
- package/dist/src/renderers/overlay/dropdown-menu.d.ts +7 -0
- package/dist/src/renderers/overlay/hover-card.d.ts +7 -0
- package/dist/src/renderers/overlay/menubar.d.ts +8 -0
- package/dist/src/renderers/overlay/popover.d.ts +7 -0
- package/dist/src/renderers/overlay/sheet.d.ts +7 -0
- package/dist/src/renderers/overlay/tooltip.d.ts +7 -0
- package/dist/src/renderers/placeholders.d.ts +9 -0
- package/dist/src/ui/accordion.d.ts +11 -4
- package/dist/src/ui/alert-dialog.d.ts +24 -11
- package/dist/src/ui/alert.d.ts +11 -5
- package/dist/src/ui/aspect-ratio.d.ts +8 -1
- package/dist/src/ui/avatar.d.ts +10 -3
- package/dist/src/ui/badge.d.ts +10 -3
- package/dist/src/ui/breadcrumb.d.ts +23 -8
- package/dist/src/ui/button.d.ts +10 -5
- package/dist/src/ui/calendar.d.ts +8 -1
- package/dist/src/ui/card.d.ts +14 -8
- package/dist/src/ui/carousel.d.ts +12 -6
- package/dist/src/ui/chart.d.ts +62 -0
- package/dist/src/ui/checkbox.d.ts +8 -1
- package/dist/src/ui/collapsible.d.ts +10 -3
- package/dist/src/ui/command.d.ts +85 -16
- package/dist/src/ui/context-menu.d.ts +21 -12
- package/dist/src/ui/dialog.d.ts +24 -13
- package/dist/src/ui/drawer.d.ts +26 -10
- package/dist/src/ui/dropdown-menu.d.ts +27 -18
- package/dist/src/ui/form.d.ts +13 -7
- package/dist/src/ui/hover-card.d.ts +10 -3
- package/dist/src/ui/index.d.ts +10 -11
- package/dist/src/ui/input-otp.d.ts +37 -7
- package/dist/src/ui/input.d.ts +7 -0
- package/dist/src/ui/label.d.ts +9 -1
- package/dist/src/ui/menubar.d.ts +26 -17
- package/dist/src/ui/navigation-menu.d.ts +16 -11
- package/dist/src/ui/pagination.d.ts +32 -10
- package/dist/src/ui/popover.d.ts +11 -5
- package/dist/src/ui/progress.d.ts +8 -1
- package/dist/src/ui/radio-group.d.ts +9 -2
- package/dist/src/ui/resizable.d.ts +12 -8
- package/dist/src/ui/scroll-area.d.ts +9 -2
- package/dist/src/ui/select.d.ts +18 -13
- package/dist/src/ui/separator.d.ts +7 -0
- package/dist/src/ui/sheet.d.ts +30 -11
- package/dist/src/ui/sidebar.d.ts +41 -38
- package/dist/src/ui/skeleton.d.ts +8 -1
- package/dist/src/ui/slider.d.ts +8 -1
- package/dist/src/ui/sonner.d.ts +2 -1
- package/dist/src/ui/switch.d.ts +9 -2
- package/dist/src/ui/table.d.ts +15 -8
- package/dist/src/ui/tabs.d.ts +8 -1
- package/dist/src/ui/textarea.d.ts +8 -1
- package/dist/src/ui/toast.d.ts +22 -0
- package/dist/src/ui/toggle-group.d.ts +15 -5
- package/dist/src/ui/toggle.d.ts +11 -1
- package/dist/src/ui/tooltip.d.ts +11 -4
- package/dist/src/ui/typography.d.ts +21 -0
- package/metadata/ObjectGrid.component.yml +72 -0
- package/package.json +35 -13
- package/postcss.config.js +9 -1
- package/shadcn-components.json +315 -0
- package/src/SchemaRenderer.tsx +28 -0
- package/src/__tests__/PageRendererRegions.test.tsx +59 -0
- package/src/__tests__/README.md +124 -0
- package/src/__tests__/Registry.test.ts +21 -0
- package/src/__tests__/basic-renderers.test.tsx +255 -0
- package/src/__tests__/complex-disclosure-renderers.test.tsx +302 -0
- package/src/__tests__/feedback-overlay-renderers.test.tsx +349 -0
- package/src/__tests__/form-renderers.test.tsx +364 -0
- package/src/__tests__/layout-data-renderers.test.tsx +340 -0
- package/src/__tests__/test-utils.tsx +190 -0
- package/src/{ui → custom}/button-group.tsx +9 -1
- package/src/custom/combobox.tsx +104 -0
- package/src/custom/date-picker.tsx +61 -0
- package/src/{ui → custom}/empty.tsx +8 -0
- package/src/custom/field.tsx +81 -0
- package/src/{ui → custom}/filter-builder.tsx +11 -3
- package/src/custom/index.ts +12 -0
- package/src/custom/input-group.tsx +53 -0
- package/src/{ui → custom}/item.tsx +9 -1
- package/src/{ui → custom}/kbd.tsx +8 -0
- package/src/custom/native-select.tsx +33 -0
- package/src/custom/sort-builder.tsx +129 -0
- package/src/custom/spinner.tsx +26 -0
- package/src/hooks/use-mobile.tsx +8 -0
- package/src/index.css +105 -54
- package/src/index.test.ts +8 -0
- package/src/index.ts +22 -1
- package/src/lib/utils.tsx +8 -0
- package/src/new-components.test.ts +8 -9
- package/src/renderers/basic/button-group.tsx +79 -0
- package/src/renderers/basic/div.tsx +21 -2
- package/src/renderers/basic/html.tsx +9 -0
- package/src/renderers/basic/icon.tsx +67 -3
- package/src/renderers/basic/image.tsx +13 -1
- package/src/renderers/basic/index.ts +11 -0
- package/src/renderers/basic/navigation-menu.tsx +81 -0
- package/src/renderers/basic/pagination.tsx +109 -0
- package/src/renderers/basic/separator.tsx +10 -1
- package/src/renderers/basic/span.tsx +21 -2
- package/src/renderers/basic/text.tsx +12 -2
- package/src/renderers/complex/__tests__/data-table.test.ts +8 -0
- package/src/renderers/complex/carousel.tsx +12 -3
- package/src/renderers/complex/data-table.tsx +150 -96
- package/src/renderers/complex/filter-builder.tsx +10 -1
- package/src/renderers/complex/index.ts +9 -3
- package/src/renderers/complex/resizable.tsx +10 -1
- package/src/renderers/complex/scroll-area.tsx +33 -7
- package/src/renderers/complex/table.tsx +11 -2
- package/src/renderers/data-display/alert.tsx +9 -0
- package/src/renderers/data-display/avatar.tsx +9 -0
- package/src/renderers/data-display/badge.tsx +9 -0
- package/src/renderers/data-display/breadcrumb.tsx +60 -0
- package/src/renderers/data-display/index.ts +12 -0
- package/src/renderers/data-display/kbd.tsx +50 -0
- package/src/renderers/data-display/list.tsx +29 -49
- package/src/renderers/data-display/statistic.tsx +45 -48
- package/src/renderers/data-display/table.tsx +78 -0
- package/src/renderers/data-display/tree-view.tsx +32 -37
- package/src/renderers/disclosure/accordion.tsx +9 -0
- package/src/renderers/disclosure/collapsible.tsx +9 -0
- package/src/renderers/disclosure/index.ts +9 -0
- package/src/renderers/disclosure/toggle-group.tsx +79 -0
- package/src/renderers/feedback/empty.tsx +49 -0
- package/src/renderers/feedback/index.ts +12 -0
- package/src/renderers/feedback/loading.tsx +10 -1
- package/src/renderers/feedback/progress.tsx +9 -0
- package/src/renderers/feedback/skeleton.tsx +9 -0
- package/src/renderers/feedback/sonner.tsx +56 -0
- package/src/renderers/feedback/spinner.tsx +55 -0
- package/src/renderers/feedback/toast.tsx +59 -0
- package/src/renderers/feedback/toaster.tsx +14 -17
- package/src/renderers/form/button.tsx +43 -1
- package/src/renderers/form/calendar.tsx +9 -0
- package/src/renderers/form/checkbox.tsx +46 -16
- package/src/renderers/form/combobox.tsx +48 -0
- package/src/renderers/form/command.tsx +58 -0
- package/src/renderers/form/date-picker.tsx +11 -2
- package/src/renderers/form/file-upload.tsx +11 -2
- package/src/renderers/form/form.tsx +104 -18
- package/src/renderers/form/index.ts +10 -0
- package/src/renderers/form/input-otp.tsx +35 -15
- package/src/renderers/form/input.tsx +92 -50
- package/src/renderers/form/label.tsx +9 -0
- package/src/renderers/form/radio-group.tsx +9 -0
- package/src/renderers/form/select.tsx +43 -15
- package/src/renderers/form/slider.tsx +17 -1
- package/src/renderers/form/switch.tsx +9 -0
- package/src/renderers/form/textarea.tsx +58 -27
- package/src/renderers/form/toggle.tsx +11 -45
- package/src/renderers/index.ts +8 -0
- package/src/renderers/layout/aspect-ratio.tsx +51 -0
- package/src/renderers/layout/card.tsx +18 -2
- package/src/renderers/layout/container.tsx +21 -12
- package/src/renderers/layout/flex.tsx +17 -8
- package/src/renderers/layout/grid.tsx +31 -8
- package/src/renderers/layout/index.ts +9 -0
- package/src/renderers/layout/page.tsx +44 -24
- package/src/renderers/layout/semantic.tsx +9 -0
- package/src/renderers/layout/stack.tsx +18 -9
- package/src/renderers/layout/tabs.tsx +51 -17
- package/src/renderers/navigation/header-bar.tsx +10 -1
- package/src/renderers/navigation/index.ts +8 -0
- package/src/renderers/navigation/sidebar.tsx +13 -0
- package/src/renderers/overlay/alert-dialog.tsx +9 -0
- package/src/renderers/overlay/context-menu.tsx +10 -1
- package/src/renderers/overlay/dialog.tsx +9 -0
- package/src/renderers/overlay/drawer.tsx +9 -0
- package/src/renderers/overlay/dropdown-menu.tsx +9 -0
- package/src/renderers/overlay/hover-card.tsx +9 -0
- package/src/renderers/overlay/index.ts +9 -0
- package/src/renderers/overlay/menubar.tsx +76 -0
- package/src/renderers/overlay/popover.tsx +9 -0
- package/src/renderers/overlay/sheet.tsx +9 -0
- package/src/renderers/overlay/tooltip.tsx +9 -0
- package/src/renderers/placeholders.tsx +107 -0
- package/src/stories/CRMApp.stories.tsx +706 -0
- package/src/stories/Guide.mdx +55 -0
- package/src/stories/Introduction.mdx +34 -0
- package/src/stories/MockedData.stories.tsx +71 -0
- package/src/stories/assets/accessibility.png +0 -0
- package/src/stories/assets/accessibility.svg +1 -0
- package/src/stories/assets/addon-library.png +0 -0
- package/src/stories/assets/assets.png +0 -0
- package/src/stories/assets/avif-test-image.avif +0 -0
- package/src/stories/assets/context.png +0 -0
- package/src/stories/assets/discord.svg +1 -0
- package/src/stories/assets/docs.png +0 -0
- package/src/stories/assets/figma-plugin.png +0 -0
- package/src/stories/assets/github.svg +1 -0
- package/src/stories/assets/share.png +0 -0
- package/src/stories/assets/styling.png +0 -0
- package/src/stories/assets/testing.png +0 -0
- package/src/stories/assets/theming.png +0 -0
- package/src/stories/assets/tutorials.svg +1 -0
- package/src/stories/assets/youtube.svg +1 -0
- package/src/stories/button.css +30 -0
- package/src/stories/header.css +32 -0
- package/src/stories/page.css +68 -0
- package/src/stories-json/accordion.stories.tsx +43 -0
- package/src/stories-json/aggrid.stories.tsx +103 -0
- package/src/stories-json/alert.stories.tsx +39 -0
- package/src/stories-json/aspect-ratio.stories.tsx +34 -0
- package/src/stories-json/avatar.stories.tsx +38 -0
- package/src/stories-json/badge.stories.tsx +53 -0
- package/src/stories-json/breadcrumb.stories.tsx +30 -0
- package/src/stories-json/button-group.stories.tsx +43 -0
- package/src/stories-json/button.stories.tsx +73 -0
- package/src/stories-json/calendar.stories.tsx +85 -0
- package/src/stories-json/card.stories.tsx +48 -0
- package/src/stories-json/carousel.stories.tsx +33 -0
- package/src/stories-json/charts.stories.tsx +195 -0
- package/src/stories-json/chatbot.stories.tsx +248 -0
- package/src/stories-json/code-editor.stories.tsx +92 -0
- package/src/stories-json/collapsible.stories.tsx +40 -0
- package/src/stories-json/controls.stories.tsx +36 -0
- package/src/stories-json/dashboard.stories.tsx +318 -0
- package/src/stories-json/data-table.stories.tsx +60 -0
- package/src/stories-json/data_display_extras.stories.tsx +102 -0
- package/src/stories-json/date-picker.stories.tsx +28 -0
- package/src/stories-json/detail-view.stories.tsx +258 -0
- package/src/stories-json/dialog.stories.tsx +43 -0
- package/src/stories-json/feedback_extras.stories.tsx +40 -0
- package/src/stories-json/feedback_others.stories.tsx +46 -0
- package/src/stories-json/form_advanced.stories.tsx +117 -0
- package/src/stories-json/form_extras.stories.tsx +123 -0
- package/src/stories-json/grid.stories.tsx +56 -0
- package/src/stories-json/icon.stories.tsx +36 -0
- package/src/stories-json/input.stories.tsx +52 -0
- package/src/stories-json/kanban.stories.tsx +295 -0
- package/src/stories-json/layout_extended.stories.tsx +76 -0
- package/src/stories-json/layout_flex.stories.tsx +107 -0
- package/src/stories-json/list-view.stories.tsx +97 -0
- package/src/stories-json/markdown.stories.tsx +129 -0
- package/src/stories-json/menus.stories.tsx +63 -0
- package/src/stories-json/metric-card.stories.tsx +143 -0
- package/src/stories-json/navigation-menu.stories.tsx +37 -0
- package/src/stories-json/object-aggrid.stories.tsx +252 -0
- package/src/stories-json/object-form.stories.tsx +130 -0
- package/src/stories-json/object-gantt.stories.tsx +114 -0
- package/src/stories-json/object-grid.stories.tsx +157 -0
- package/src/stories-json/object-map.stories.tsx +116 -0
- package/src/stories-json/object-view.stories.tsx +118 -0
- package/src/stories-json/overlay_extras.stories.tsx +113 -0
- package/src/stories-json/overlay_others.stories.tsx +76 -0
- package/src/stories-json/page.stories.tsx +55 -0
- package/src/stories-json/reports.stories.tsx +163 -0
- package/src/stories-json/resizable.stories.tsx +44 -0
- package/src/stories-json/select.stories.tsx +34 -0
- package/src/stories-json/separator.stories.tsx +41 -0
- package/src/stories-json/sidebar.stories.tsx +147 -0
- package/src/stories-json/statistic.stories.tsx +44 -0
- package/src/stories-json/tabs.stories.tsx +51 -0
- package/src/stories-json/timeline.stories.tsx +188 -0
- package/src/stories-json/typography.stories.tsx +45 -0
- package/src/ui/accordion.tsx +55 -53
- package/src/ui/alert-dialog.tsx +111 -117
- package/src/ui/alert.tsx +46 -57
- package/src/ui/aspect-ratio.tsx +9 -5
- package/src/ui/avatar.tsx +49 -42
- package/src/ui/badge.tsx +18 -20
- package/src/ui/breadcrumb.tsx +89 -75
- package/src/ui/button.tsx +38 -37
- package/src/ui/calendar.tsx +37 -53
- package/src/ui/card.tsx +59 -110
- package/src/ui/carousel.tsx +144 -113
- package/src/ui/chart.tsx +367 -0
- package/src/ui/checkbox.tsx +28 -22
- package/src/ui/collapsible.tsx +13 -25
- package/src/ui/command.tsx +114 -135
- package/src/ui/context-menu.tsx +77 -116
- package/src/ui/dialog.tsx +102 -113
- package/src/ui/drawer.tsx +90 -99
- package/src/ui/dropdown-menu.tsx +142 -188
- package/src/ui/form.tsx +59 -40
- package/src/ui/hover-card.tsx +26 -33
- package/src/ui/index.ts +11 -11
- package/src/ui/input-otp.tsx +53 -55
- package/src/ui/input.tsx +21 -15
- package/src/ui/label.tsx +25 -15
- package/src/ui/menubar.tsx +196 -206
- package/src/ui/navigation-menu.tsx +104 -136
- package/src/ui/pagination.tsx +94 -96
- package/src/ui/popover.tsx +29 -38
- package/src/ui/progress.tsx +29 -34
- package/src/ui/radio-group.tsx +27 -20
- package/src/ui/resizable.tsx +40 -42
- package/src/ui/scroll-area.tsx +46 -48
- package/src/ui/select.tsx +140 -160
- package/src/ui/separator.tsx +10 -2
- package/src/ui/sheet.tsx +118 -107
- package/src/ui/sidebar.tsx +471 -418
- package/src/ui/skeleton.tsx +14 -11
- package/src/ui/slider.tsx +27 -54
- package/src/ui/sonner.tsx +29 -19
- package/src/ui/switch.tsx +27 -21
- package/src/ui/table.tsx +102 -97
- package/src/ui/tabs.tsx +14 -37
- package/src/ui/textarea.tsx +16 -4
- package/src/ui/toast.tsx +137 -0
- package/src/ui/toggle-group.tsx +37 -55
- package/src/ui/toggle.tsx +30 -27
- package/src/ui/tooltip.tsx +29 -52
- package/src/ui/typography.tsx +85 -0
- package/tsconfig.json +2 -1
- package/vite.config.ts +20 -2
- package/vitest.config.ts +5 -0
- package/dist/src/index.test.d.ts +0 -1
- package/dist/src/new-components.test.d.ts +0 -1
- package/dist/src/renderers/complex/__tests__/data-table.test.d.ts +0 -0
- package/dist/src/renderers/complex/calendar-view.d.ts +0 -1
- package/dist/src/renderers/complex/chatbot.d.ts +0 -1
- package/dist/src/renderers/complex/chatbot.test.d.ts +0 -1
- package/dist/src/renderers/complex/timeline.d.ts +0 -1
- package/dist/src/ui/calendar-view.d.ts +0 -21
- package/dist/src/ui/chatbot.d.ts +0 -36
- package/dist/src/ui/field.d.ts +0 -24
- package/dist/src/ui/input-group.d.ts +0 -16
- package/dist/src/ui/spinner.d.ts +0 -3
- package/dist/src/ui/timeline.d.ts +0 -25
- package/metadata/ObjectTable.component.yml +0 -41
- package/src/renderers/complex/calendar-view.tsx +0 -219
- package/src/renderers/complex/chatbot.test.ts +0 -44
- package/src/renderers/complex/chatbot.tsx +0 -185
- package/src/renderers/complex/timeline.tsx +0 -466
- package/src/ui/calendar-view.tsx +0 -503
- package/src/ui/chatbot.tsx +0 -240
- package/src/ui/field.tsx +0 -246
- package/src/ui/input-group.tsx +0 -170
- package/src/ui/spinner.tsx +0 -38
- package/src/ui/timeline.tsx +0 -266
- package/tailwind.config.js +0 -75
- /package/dist/src/{ui → custom}/empty.d.ts +0 -0
package/src/ui/sidebar.tsx
CHANGED
|
@@ -1,9 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ObjectUI
|
|
3
|
+
* Copyright (c) 2024-present ObjectStack Inc.
|
|
4
|
+
*
|
|
5
|
+
* This source code is licensed under the MIT license found in the
|
|
6
|
+
* LICENSE file in the root directory of this source tree.
|
|
7
|
+
*/
|
|
8
|
+
|
|
1
9
|
"use client"
|
|
2
10
|
|
|
3
11
|
import * as React from "react"
|
|
4
12
|
import { Slot } from "@radix-ui/react-slot"
|
|
5
13
|
import { cva, type VariantProps } from "class-variance-authority"
|
|
6
|
-
import {
|
|
14
|
+
import { PanelLeft } from "lucide-react"
|
|
7
15
|
|
|
8
16
|
import { useIsMobile } from "../hooks/use-mobile"
|
|
9
17
|
import { cn } from "../lib/utils"
|
|
@@ -53,248 +61,267 @@ function useSidebar() {
|
|
|
53
61
|
return context
|
|
54
62
|
}
|
|
55
63
|
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
// We use openProp and setOpenProp for control from outside the component.
|
|
74
|
-
const [_open, _setOpen] = React.useState(defaultOpen)
|
|
75
|
-
const open = openProp ?? _open
|
|
76
|
-
const setOpen = React.useCallback(
|
|
77
|
-
(value: boolean | ((value: boolean) => boolean)) => {
|
|
78
|
-
const openState = typeof value === "function" ? value(open) : value
|
|
79
|
-
if (setOpenProp) {
|
|
80
|
-
setOpenProp(openState)
|
|
81
|
-
} else {
|
|
82
|
-
_setOpen(openState)
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
// This sets the cookie to keep the sidebar state.
|
|
86
|
-
document.cookie = `${SIDEBAR_COOKIE_NAME}=${openState}; path=/; max-age=${SIDEBAR_COOKIE_MAX_AGE}`
|
|
64
|
+
const SidebarProvider = React.forwardRef<
|
|
65
|
+
HTMLDivElement,
|
|
66
|
+
React.ComponentProps<"div"> & {
|
|
67
|
+
defaultOpen?: boolean
|
|
68
|
+
open?: boolean
|
|
69
|
+
onOpenChange?: (open: boolean) => void
|
|
70
|
+
}
|
|
71
|
+
>(
|
|
72
|
+
(
|
|
73
|
+
{
|
|
74
|
+
defaultOpen = true,
|
|
75
|
+
open: openProp,
|
|
76
|
+
onOpenChange: setOpenProp,
|
|
77
|
+
className,
|
|
78
|
+
style,
|
|
79
|
+
children,
|
|
80
|
+
...props
|
|
87
81
|
},
|
|
88
|
-
|
|
89
|
-
)
|
|
82
|
+
ref
|
|
83
|
+
) => {
|
|
84
|
+
const isMobile = useIsMobile()
|
|
85
|
+
const [openMobile, setOpenMobile] = React.useState(false)
|
|
86
|
+
|
|
87
|
+
// This is the internal state of the sidebar.
|
|
88
|
+
// We use openProp and setOpenProp for control from outside the component.
|
|
89
|
+
const [_open, _setOpen] = React.useState(defaultOpen)
|
|
90
|
+
const open = openProp ?? _open
|
|
91
|
+
const setOpen = React.useCallback(
|
|
92
|
+
(value: boolean | ((value: boolean) => boolean)) => {
|
|
93
|
+
const openState = typeof value === "function" ? value(open) : value
|
|
94
|
+
if (setOpenProp) {
|
|
95
|
+
setOpenProp(openState)
|
|
96
|
+
} else {
|
|
97
|
+
_setOpen(openState)
|
|
98
|
+
}
|
|
90
99
|
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
const
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
(
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
100
|
+
// This sets the cookie to keep the sidebar state.
|
|
101
|
+
document.cookie = `${SIDEBAR_COOKIE_NAME}=${openState}; path=/; max-age=${SIDEBAR_COOKIE_MAX_AGE}`
|
|
102
|
+
},
|
|
103
|
+
[setOpenProp, open]
|
|
104
|
+
)
|
|
105
|
+
|
|
106
|
+
// Helper to toggle the sidebar.
|
|
107
|
+
const toggleSidebar = React.useCallback(() => {
|
|
108
|
+
return isMobile
|
|
109
|
+
? setOpenMobile((open) => !open)
|
|
110
|
+
: setOpen((open) => !open)
|
|
111
|
+
}, [isMobile, setOpen, setOpenMobile])
|
|
112
|
+
|
|
113
|
+
// Adds a keyboard shortcut to toggle the sidebar.
|
|
114
|
+
React.useEffect(() => {
|
|
115
|
+
const handleKeyDown = (event: KeyboardEvent) => {
|
|
116
|
+
if (
|
|
117
|
+
event.key === SIDEBAR_KEYBOARD_SHORTCUT &&
|
|
118
|
+
(event.metaKey || event.ctrlKey)
|
|
119
|
+
) {
|
|
120
|
+
event.preventDefault()
|
|
121
|
+
toggleSidebar()
|
|
122
|
+
}
|
|
105
123
|
}
|
|
106
|
-
}
|
|
107
124
|
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
125
|
+
window.addEventListener("keydown", handleKeyDown)
|
|
126
|
+
return () => window.removeEventListener("keydown", handleKeyDown)
|
|
127
|
+
}, [toggleSidebar])
|
|
128
|
+
|
|
129
|
+
// We add a state so that we can do data-state="expanded" or "collapsed".
|
|
130
|
+
// This makes it easier to style the sidebar with Tailwind classes.
|
|
131
|
+
const state = open ? "expanded" : "collapsed"
|
|
132
|
+
|
|
133
|
+
const contextValue = React.useMemo<SidebarContextProps>(
|
|
134
|
+
() => ({
|
|
135
|
+
state,
|
|
136
|
+
open,
|
|
137
|
+
setOpen,
|
|
138
|
+
isMobile,
|
|
139
|
+
openMobile,
|
|
140
|
+
setOpenMobile,
|
|
141
|
+
toggleSidebar,
|
|
142
|
+
}),
|
|
143
|
+
[state, open, setOpen, isMobile, openMobile, setOpenMobile, toggleSidebar]
|
|
144
|
+
)
|
|
128
145
|
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
146
|
+
return (
|
|
147
|
+
<SidebarContext.Provider value={contextValue}>
|
|
148
|
+
<TooltipProvider delayDuration={0}>
|
|
149
|
+
<div
|
|
150
|
+
style={
|
|
151
|
+
{
|
|
152
|
+
"--sidebar-width": SIDEBAR_WIDTH,
|
|
153
|
+
"--sidebar-width-icon": SIDEBAR_WIDTH_ICON,
|
|
154
|
+
...style,
|
|
155
|
+
} as React.CSSProperties
|
|
156
|
+
}
|
|
157
|
+
className={cn(
|
|
158
|
+
"group/sidebar-wrapper flex min-h-svh w-full has-[[data-variant=inset]]:bg-sidebar",
|
|
159
|
+
className
|
|
160
|
+
)}
|
|
161
|
+
ref={ref}
|
|
162
|
+
{...props}
|
|
163
|
+
>
|
|
164
|
+
{children}
|
|
165
|
+
</div>
|
|
166
|
+
</TooltipProvider>
|
|
167
|
+
</SidebarContext.Provider>
|
|
168
|
+
)
|
|
169
|
+
}
|
|
170
|
+
)
|
|
171
|
+
SidebarProvider.displayName = "SidebarProvider"
|
|
172
|
+
|
|
173
|
+
const Sidebar = React.forwardRef<
|
|
174
|
+
HTMLDivElement,
|
|
175
|
+
React.ComponentProps<"div"> & {
|
|
176
|
+
side?: "left" | "right"
|
|
177
|
+
variant?: "sidebar" | "floating" | "inset"
|
|
178
|
+
collapsible?: "offcanvas" | "icon" | "none"
|
|
179
|
+
}
|
|
180
|
+
>(
|
|
181
|
+
(
|
|
182
|
+
{
|
|
183
|
+
side = "left",
|
|
184
|
+
variant = "sidebar",
|
|
185
|
+
collapsible = "offcanvas",
|
|
186
|
+
className,
|
|
187
|
+
children,
|
|
188
|
+
...props
|
|
189
|
+
},
|
|
190
|
+
ref
|
|
191
|
+
) => {
|
|
192
|
+
const { isMobile, state, openMobile, setOpenMobile } = useSidebar()
|
|
193
|
+
|
|
194
|
+
if (collapsible === "none") {
|
|
195
|
+
return (
|
|
132
196
|
<div
|
|
133
|
-
data-slot="sidebar-wrapper"
|
|
134
|
-
style={
|
|
135
|
-
{
|
|
136
|
-
"--sidebar-width": SIDEBAR_WIDTH,
|
|
137
|
-
"--sidebar-width-icon": SIDEBAR_WIDTH_ICON,
|
|
138
|
-
...style,
|
|
139
|
-
} as React.CSSProperties
|
|
140
|
-
}
|
|
141
197
|
className={cn(
|
|
142
|
-
"
|
|
198
|
+
"flex h-full w-[var(--sidebar-width)] flex-col bg-sidebar text-sidebar-foreground",
|
|
143
199
|
className
|
|
144
200
|
)}
|
|
201
|
+
ref={ref}
|
|
145
202
|
{...props}
|
|
146
203
|
>
|
|
147
204
|
{children}
|
|
148
205
|
</div>
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
)
|
|
152
|
-
}
|
|
206
|
+
)
|
|
207
|
+
}
|
|
153
208
|
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
>
|
|
178
|
-
{children}
|
|
179
|
-
</div>
|
|
180
|
-
)
|
|
181
|
-
}
|
|
209
|
+
if (isMobile) {
|
|
210
|
+
return (
|
|
211
|
+
<Sheet open={openMobile} onOpenChange={setOpenMobile} {...props}>
|
|
212
|
+
<SheetContent
|
|
213
|
+
data-sidebar="sidebar"
|
|
214
|
+
data-mobile="true"
|
|
215
|
+
className="w-[var(--sidebar-width)] bg-sidebar p-0 text-sidebar-foreground [&>button]:hidden"
|
|
216
|
+
style={
|
|
217
|
+
{
|
|
218
|
+
"--sidebar-width": SIDEBAR_WIDTH_MOBILE,
|
|
219
|
+
} as React.CSSProperties
|
|
220
|
+
}
|
|
221
|
+
side={side}
|
|
222
|
+
>
|
|
223
|
+
<SheetHeader className="sr-only">
|
|
224
|
+
<SheetTitle>Sidebar</SheetTitle>
|
|
225
|
+
<SheetDescription>Displays the mobile sidebar.</SheetDescription>
|
|
226
|
+
</SheetHeader>
|
|
227
|
+
<div className="flex h-full w-full flex-col">{children}</div>
|
|
228
|
+
</SheetContent>
|
|
229
|
+
</Sheet>
|
|
230
|
+
)
|
|
231
|
+
}
|
|
182
232
|
|
|
183
|
-
if (isMobile) {
|
|
184
233
|
return (
|
|
185
|
-
<Sheet open={openMobile} onOpenChange={setOpenMobile} {...props}>
|
|
186
|
-
<SheetContent
|
|
187
|
-
data-sidebar="sidebar"
|
|
188
|
-
data-slot="sidebar"
|
|
189
|
-
data-mobile="true"
|
|
190
|
-
className="bg-sidebar text-sidebar-foreground w-[--sidebar-width] p-0 [&>button]:hidden"
|
|
191
|
-
style={
|
|
192
|
-
{
|
|
193
|
-
"--sidebar-width": SIDEBAR_WIDTH_MOBILE,
|
|
194
|
-
} as React.CSSProperties
|
|
195
|
-
}
|
|
196
|
-
side={side}
|
|
197
|
-
>
|
|
198
|
-
<SheetHeader className="sr-only">
|
|
199
|
-
<SheetTitle>Sidebar</SheetTitle>
|
|
200
|
-
<SheetDescription>Displays the mobile sidebar.</SheetDescription>
|
|
201
|
-
</SheetHeader>
|
|
202
|
-
<div className="flex h-full w-full flex-col">{children}</div>
|
|
203
|
-
</SheetContent>
|
|
204
|
-
</Sheet>
|
|
205
|
-
)
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
return (
|
|
209
|
-
<div
|
|
210
|
-
className="group peer text-sidebar-foreground hidden md:block"
|
|
211
|
-
data-state={state}
|
|
212
|
-
data-collapsible={state === "collapsed" ? collapsible : ""}
|
|
213
|
-
data-variant={variant}
|
|
214
|
-
data-side={side}
|
|
215
|
-
data-slot="sidebar"
|
|
216
|
-
>
|
|
217
|
-
{/* This is what handles the sidebar gap on desktop */}
|
|
218
|
-
<div
|
|
219
|
-
data-slot="sidebar-gap"
|
|
220
|
-
className={cn(
|
|
221
|
-
"relative w-[--sidebar-width] bg-transparent transition-[width] duration-200 ease-linear",
|
|
222
|
-
"group-data-[collapsible=offcanvas]:w-0",
|
|
223
|
-
"group-data-[side=right]:rotate-180",
|
|
224
|
-
variant === "floating" || variant === "inset"
|
|
225
|
-
? "group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+1rem)]"
|
|
226
|
-
: "group-data-[collapsible=icon]:w-[--sidebar-width-icon]"
|
|
227
|
-
)}
|
|
228
|
-
/>
|
|
229
234
|
<div
|
|
230
|
-
|
|
231
|
-
className=
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
// Adjust the padding for floating and inset variants.
|
|
237
|
-
variant === "floating" || variant === "inset"
|
|
238
|
-
? "p-2 group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+1rem+2px)]"
|
|
239
|
-
: "group-data-[collapsible=icon]:w-[--sidebar-width-icon] group-data-[side=left]:border-r group-data-[side=right]:border-l",
|
|
240
|
-
className
|
|
241
|
-
)}
|
|
242
|
-
{...props}
|
|
235
|
+
ref={ref}
|
|
236
|
+
className="group peer hidden text-sidebar-foreground md:block"
|
|
237
|
+
data-state={state}
|
|
238
|
+
data-collapsible={state === "collapsed" ? collapsible : ""}
|
|
239
|
+
data-variant={variant}
|
|
240
|
+
data-side={side}
|
|
243
241
|
>
|
|
242
|
+
{/* This is what handles the sidebar gap on desktop */}
|
|
243
|
+
<div
|
|
244
|
+
className={cn(
|
|
245
|
+
"relative w-[var(--sidebar-width)] bg-transparent transition-[width] duration-200 ease-linear",
|
|
246
|
+
"group-data-[collapsible=offcanvas]:w-0",
|
|
247
|
+
"group-data-[side=right]:rotate-180",
|
|
248
|
+
variant === "floating" || variant === "inset"
|
|
249
|
+
? "group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)_+_theme(spacing.4))]"
|
|
250
|
+
: "group-data-[collapsible=icon]:w-[var(--sidebar-width-icon)]"
|
|
251
|
+
)}
|
|
252
|
+
/>
|
|
244
253
|
<div
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
254
|
+
className={cn(
|
|
255
|
+
"fixed inset-y-0 z-10 hidden h-svh w-[var(--sidebar-width)] transition-[left,right,width] duration-200 ease-linear md:flex",
|
|
256
|
+
side === "left"
|
|
257
|
+
? "left-0 group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)]"
|
|
258
|
+
: "right-0 group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)]",
|
|
259
|
+
// Adjust the padding for floating and inset variants.
|
|
260
|
+
variant === "floating" || variant === "inset"
|
|
261
|
+
? "p-2 group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)_+_theme(spacing.4)_+2px)]"
|
|
262
|
+
: "group-data-[collapsible=icon]:w-[var(--sidebar-width-icon)] group-data-[side=left]:border-r group-data-[side=right]:border-l",
|
|
263
|
+
className
|
|
264
|
+
)}
|
|
265
|
+
{...props}
|
|
248
266
|
>
|
|
249
|
-
|
|
267
|
+
<div
|
|
268
|
+
data-sidebar="sidebar"
|
|
269
|
+
className="flex h-full w-full flex-col bg-sidebar group-data-[variant=floating]:rounded-lg group-data-[variant=floating]:border group-data-[variant=floating]:border-sidebar-border group-data-[variant=floating]:shadow"
|
|
270
|
+
>
|
|
271
|
+
{children}
|
|
272
|
+
</div>
|
|
250
273
|
</div>
|
|
251
274
|
</div>
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
275
|
+
)
|
|
276
|
+
}
|
|
277
|
+
)
|
|
278
|
+
Sidebar.displayName = "Sidebar"
|
|
255
279
|
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
}: React.ComponentProps<typeof Button>) {
|
|
280
|
+
const SidebarTrigger = React.forwardRef<
|
|
281
|
+
React.ElementRef<typeof Button>,
|
|
282
|
+
React.ComponentProps<typeof Button>
|
|
283
|
+
>(({ className, onClick, ...props }, ref) => {
|
|
261
284
|
const { toggleSidebar } = useSidebar()
|
|
262
285
|
|
|
263
286
|
return (
|
|
264
287
|
<Button
|
|
288
|
+
ref={ref}
|
|
265
289
|
data-sidebar="trigger"
|
|
266
|
-
data-slot="sidebar-trigger"
|
|
267
290
|
variant="ghost"
|
|
268
291
|
size="icon"
|
|
269
|
-
className={cn("
|
|
292
|
+
className={cn("h-7 w-7", className)}
|
|
270
293
|
onClick={(event) => {
|
|
271
294
|
onClick?.(event)
|
|
272
295
|
toggleSidebar()
|
|
273
296
|
}}
|
|
274
297
|
{...props}
|
|
275
298
|
>
|
|
276
|
-
<
|
|
299
|
+
<PanelLeft />
|
|
277
300
|
<span className="sr-only">Toggle Sidebar</span>
|
|
278
301
|
</Button>
|
|
279
302
|
)
|
|
280
|
-
}
|
|
303
|
+
})
|
|
304
|
+
SidebarTrigger.displayName = "SidebarTrigger"
|
|
281
305
|
|
|
282
|
-
|
|
306
|
+
const SidebarRail = React.forwardRef<
|
|
307
|
+
HTMLButtonElement,
|
|
308
|
+
React.ComponentProps<"button">
|
|
309
|
+
>(({ className, ...props }, ref) => {
|
|
283
310
|
const { toggleSidebar } = useSidebar()
|
|
284
311
|
|
|
285
312
|
return (
|
|
286
313
|
<button
|
|
314
|
+
ref={ref}
|
|
287
315
|
data-sidebar="rail"
|
|
288
|
-
data-slot="sidebar-rail"
|
|
289
316
|
aria-label="Toggle Sidebar"
|
|
290
317
|
tabIndex={-1}
|
|
291
318
|
onClick={toggleSidebar}
|
|
292
319
|
title="Toggle Sidebar"
|
|
293
320
|
className={cn(
|
|
294
|
-
"
|
|
295
|
-
"
|
|
321
|
+
"absolute inset-y-0 z-20 hidden w-4 -translate-x-1/2 transition-all ease-linear after:absolute after:inset-y-0 after:left-1/2 after:w-[2px] hover:after:bg-sidebar-border group-data-[side=left]:-right-4 group-data-[side=right]:left-0 sm:flex",
|
|
322
|
+
"[[data-side=left]_&]:cursor-w-resize [[data-side=right]_&]:cursor-e-resize",
|
|
296
323
|
"[[data-side=left][data-state=collapsed]_&]:cursor-e-resize [[data-side=right][data-state=collapsed]_&]:cursor-w-resize",
|
|
297
|
-
"
|
|
324
|
+
"group-data-[collapsible=offcanvas]:translate-x-0 group-data-[collapsible=offcanvas]:after:left-full group-data-[collapsible=offcanvas]:hover:bg-sidebar",
|
|
298
325
|
"[[data-side=left][data-collapsible=offcanvas]_&]:-right-2",
|
|
299
326
|
"[[data-side=right][data-collapsible=offcanvas]_&]:-left-2",
|
|
300
327
|
className
|
|
@@ -302,76 +329,97 @@ function SidebarRail({ className, ...props }: React.ComponentProps<"button">) {
|
|
|
302
329
|
{...props}
|
|
303
330
|
/>
|
|
304
331
|
)
|
|
305
|
-
}
|
|
332
|
+
})
|
|
333
|
+
SidebarRail.displayName = "SidebarRail"
|
|
306
334
|
|
|
307
|
-
|
|
335
|
+
const SidebarInset = React.forwardRef<
|
|
336
|
+
HTMLDivElement,
|
|
337
|
+
React.ComponentProps<"main">
|
|
338
|
+
>(({ className, ...props }, ref) => {
|
|
308
339
|
return (
|
|
309
340
|
<main
|
|
310
|
-
|
|
341
|
+
ref={ref}
|
|
311
342
|
className={cn(
|
|
312
|
-
"
|
|
313
|
-
"md:peer-data-[variant=inset]:m-2 md:peer-data-[
|
|
343
|
+
"relative flex w-full flex-1 flex-col bg-background",
|
|
344
|
+
"md:peer-data-[variant=inset]:m-2 md:peer-data-[state=collapsed]:peer-data-[variant=inset]:ml-2 md:peer-data-[variant=inset]:ml-0 md:peer-data-[variant=inset]:rounded-xl md:peer-data-[variant=inset]:shadow",
|
|
314
345
|
className
|
|
315
346
|
)}
|
|
316
347
|
{...props}
|
|
317
348
|
/>
|
|
318
349
|
)
|
|
319
|
-
}
|
|
350
|
+
})
|
|
351
|
+
SidebarInset.displayName = "SidebarInset"
|
|
320
352
|
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
}
|
|
353
|
+
const SidebarInput = React.forwardRef<
|
|
354
|
+
React.ElementRef<typeof Input>,
|
|
355
|
+
React.ComponentProps<typeof Input>
|
|
356
|
+
>(({ className, ...props }, ref) => {
|
|
325
357
|
return (
|
|
326
358
|
<Input
|
|
327
|
-
|
|
359
|
+
ref={ref}
|
|
328
360
|
data-sidebar="input"
|
|
329
|
-
className={cn(
|
|
361
|
+
className={cn(
|
|
362
|
+
"h-8 w-full bg-background shadow-none focus-visible:ring-2 focus-visible:ring-sidebar-ring",
|
|
363
|
+
className
|
|
364
|
+
)}
|
|
330
365
|
{...props}
|
|
331
366
|
/>
|
|
332
367
|
)
|
|
333
|
-
}
|
|
368
|
+
})
|
|
369
|
+
SidebarInput.displayName = "SidebarInput"
|
|
334
370
|
|
|
335
|
-
|
|
371
|
+
const SidebarHeader = React.forwardRef<
|
|
372
|
+
HTMLDivElement,
|
|
373
|
+
React.ComponentProps<"div">
|
|
374
|
+
>(({ className, ...props }, ref) => {
|
|
336
375
|
return (
|
|
337
376
|
<div
|
|
338
|
-
|
|
377
|
+
ref={ref}
|
|
339
378
|
data-sidebar="header"
|
|
340
379
|
className={cn("flex flex-col gap-2 p-2", className)}
|
|
341
380
|
{...props}
|
|
342
381
|
/>
|
|
343
382
|
)
|
|
344
|
-
}
|
|
383
|
+
})
|
|
384
|
+
SidebarHeader.displayName = "SidebarHeader"
|
|
345
385
|
|
|
346
|
-
|
|
386
|
+
const SidebarFooter = React.forwardRef<
|
|
387
|
+
HTMLDivElement,
|
|
388
|
+
React.ComponentProps<"div">
|
|
389
|
+
>(({ className, ...props }, ref) => {
|
|
347
390
|
return (
|
|
348
391
|
<div
|
|
349
|
-
|
|
392
|
+
ref={ref}
|
|
350
393
|
data-sidebar="footer"
|
|
351
394
|
className={cn("flex flex-col gap-2 p-2", className)}
|
|
352
395
|
{...props}
|
|
353
396
|
/>
|
|
354
397
|
)
|
|
355
|
-
}
|
|
398
|
+
})
|
|
399
|
+
SidebarFooter.displayName = "SidebarFooter"
|
|
356
400
|
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
}
|
|
401
|
+
const SidebarSeparator = React.forwardRef<
|
|
402
|
+
React.ElementRef<typeof Separator>,
|
|
403
|
+
React.ComponentProps<typeof Separator>
|
|
404
|
+
>(({ className, ...props }, ref) => {
|
|
361
405
|
return (
|
|
362
406
|
<Separator
|
|
363
|
-
|
|
407
|
+
ref={ref}
|
|
364
408
|
data-sidebar="separator"
|
|
365
|
-
className={cn("
|
|
409
|
+
className={cn("mx-2 w-auto bg-sidebar-border", className)}
|
|
366
410
|
{...props}
|
|
367
411
|
/>
|
|
368
412
|
)
|
|
369
|
-
}
|
|
413
|
+
})
|
|
414
|
+
SidebarSeparator.displayName = "SidebarSeparator"
|
|
370
415
|
|
|
371
|
-
|
|
416
|
+
const SidebarContent = React.forwardRef<
|
|
417
|
+
HTMLDivElement,
|
|
418
|
+
React.ComponentProps<"div">
|
|
419
|
+
>(({ className, ...props }, ref) => {
|
|
372
420
|
return (
|
|
373
421
|
<div
|
|
374
|
-
|
|
422
|
+
ref={ref}
|
|
375
423
|
data-sidebar="content"
|
|
376
424
|
className={cn(
|
|
377
425
|
"flex min-h-0 flex-1 flex-col gap-2 overflow-auto group-data-[collapsible=icon]:overflow-hidden",
|
|
@@ -380,101 +428,109 @@ function SidebarContent({ className, ...props }: React.ComponentProps<"div">) {
|
|
|
380
428
|
{...props}
|
|
381
429
|
/>
|
|
382
430
|
)
|
|
383
|
-
}
|
|
431
|
+
})
|
|
432
|
+
SidebarContent.displayName = "SidebarContent"
|
|
384
433
|
|
|
385
|
-
|
|
434
|
+
const SidebarGroup = React.forwardRef<
|
|
435
|
+
HTMLDivElement,
|
|
436
|
+
React.ComponentProps<"div">
|
|
437
|
+
>(({ className, ...props }, ref) => {
|
|
386
438
|
return (
|
|
387
439
|
<div
|
|
388
|
-
|
|
440
|
+
ref={ref}
|
|
389
441
|
data-sidebar="group"
|
|
390
442
|
className={cn("relative flex w-full min-w-0 flex-col p-2", className)}
|
|
391
443
|
{...props}
|
|
392
444
|
/>
|
|
393
445
|
)
|
|
394
|
-
}
|
|
446
|
+
})
|
|
447
|
+
SidebarGroup.displayName = "SidebarGroup"
|
|
395
448
|
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
asChild
|
|
399
|
-
|
|
400
|
-
}: React.ComponentProps<"div"> & { asChild?: boolean }) {
|
|
449
|
+
const SidebarGroupLabel = React.forwardRef<
|
|
450
|
+
HTMLDivElement,
|
|
451
|
+
React.ComponentProps<"div"> & { asChild?: boolean }
|
|
452
|
+
>(({ className, asChild = false, ...props }, ref) => {
|
|
401
453
|
const Comp = asChild ? Slot : "div"
|
|
402
454
|
|
|
403
455
|
return (
|
|
404
456
|
<Comp
|
|
405
|
-
|
|
457
|
+
ref={ref}
|
|
406
458
|
data-sidebar="group-label"
|
|
407
459
|
className={cn(
|
|
408
|
-
"
|
|
460
|
+
"flex h-8 shrink-0 items-center rounded-md px-2 text-xs font-medium text-sidebar-foreground/70 outline-none ring-sidebar-ring transition-[margin,opacity] duration-200 ease-linear focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0",
|
|
409
461
|
"group-data-[collapsible=icon]:-mt-8 group-data-[collapsible=icon]:opacity-0",
|
|
410
462
|
className
|
|
411
463
|
)}
|
|
412
464
|
{...props}
|
|
413
465
|
/>
|
|
414
466
|
)
|
|
415
|
-
}
|
|
467
|
+
})
|
|
468
|
+
SidebarGroupLabel.displayName = "SidebarGroupLabel"
|
|
416
469
|
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
asChild
|
|
420
|
-
|
|
421
|
-
}: React.ComponentProps<"button"> & { asChild?: boolean }) {
|
|
470
|
+
const SidebarGroupAction = React.forwardRef<
|
|
471
|
+
HTMLButtonElement,
|
|
472
|
+
React.ComponentProps<"button"> & { asChild?: boolean }
|
|
473
|
+
>(({ className, asChild = false, ...props }, ref) => {
|
|
422
474
|
const Comp = asChild ? Slot : "button"
|
|
423
475
|
|
|
424
476
|
return (
|
|
425
477
|
<Comp
|
|
426
|
-
|
|
478
|
+
ref={ref}
|
|
427
479
|
data-sidebar="group-action"
|
|
428
480
|
className={cn(
|
|
429
|
-
"
|
|
481
|
+
"absolute right-3 top-3.5 flex aspect-square w-5 items-center justify-center rounded-md p-0 text-sidebar-foreground outline-none ring-sidebar-ring transition-transform hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0",
|
|
430
482
|
// Increases the hit area of the button on mobile.
|
|
431
|
-
"after:absolute after:-inset-2 md:
|
|
483
|
+
"after:absolute after:-inset-2 after:md:hidden",
|
|
432
484
|
"group-data-[collapsible=icon]:hidden",
|
|
433
485
|
className
|
|
434
486
|
)}
|
|
435
487
|
{...props}
|
|
436
488
|
/>
|
|
437
489
|
)
|
|
438
|
-
}
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
}
|
|
490
|
+
})
|
|
491
|
+
SidebarGroupAction.displayName = "SidebarGroupAction"
|
|
492
|
+
|
|
493
|
+
const SidebarGroupContent = React.forwardRef<
|
|
494
|
+
HTMLDivElement,
|
|
495
|
+
React.ComponentProps<"div">
|
|
496
|
+
>(({ className, ...props }, ref) => (
|
|
497
|
+
<div
|
|
498
|
+
ref={ref}
|
|
499
|
+
data-sidebar="group-content"
|
|
500
|
+
className={cn("w-full text-sm", className)}
|
|
501
|
+
{...props}
|
|
502
|
+
/>
|
|
503
|
+
))
|
|
504
|
+
SidebarGroupContent.displayName = "SidebarGroupContent"
|
|
505
|
+
|
|
506
|
+
const SidebarMenu = React.forwardRef<
|
|
507
|
+
HTMLUListElement,
|
|
508
|
+
React.ComponentProps<"ul">
|
|
509
|
+
>(({ className, ...props }, ref) => (
|
|
510
|
+
<ul
|
|
511
|
+
ref={ref}
|
|
512
|
+
data-sidebar="menu"
|
|
513
|
+
className={cn("flex w-full min-w-0 flex-col gap-1", className)}
|
|
514
|
+
{...props}
|
|
515
|
+
/>
|
|
516
|
+
))
|
|
517
|
+
SidebarMenu.displayName = "SidebarMenu"
|
|
518
|
+
|
|
519
|
+
const SidebarMenuItem = React.forwardRef<
|
|
520
|
+
HTMLLIElement,
|
|
521
|
+
React.ComponentProps<"li">
|
|
522
|
+
>(({ className, ...props }, ref) => (
|
|
523
|
+
<li
|
|
524
|
+
ref={ref}
|
|
525
|
+
data-sidebar="menu-item"
|
|
526
|
+
className={cn("group/menu-item relative", className)}
|
|
527
|
+
{...props}
|
|
528
|
+
/>
|
|
529
|
+
))
|
|
530
|
+
SidebarMenuItem.displayName = "SidebarMenuItem"
|
|
475
531
|
|
|
476
532
|
const sidebarMenuButtonVariants = cva(
|
|
477
|
-
"peer/menu-button flex w-full items-center gap-2 overflow-hidden rounded-md p-2 text-left text-sm outline-
|
|
533
|
+
"peer/menu-button flex w-full items-center gap-2 overflow-hidden rounded-md p-2 text-left text-sm outline-none ring-sidebar-ring transition-[width,height,padding] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 group-has-[[data-sidebar=menu-action]]/menu-item:pr-8 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-[active=true]:bg-sidebar-accent data-[active=true]:font-medium data-[active=true]:text-sidebar-accent-foreground data-[state=open]:hover:bg-sidebar-accent data-[state=open]:hover:text-sidebar-accent-foreground group-data-[collapsible=icon]:!size-8 group-data-[collapsible=icon]:!p-2 [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0",
|
|
478
534
|
{
|
|
479
535
|
variants: {
|
|
480
536
|
variant: {
|
|
@@ -485,7 +541,7 @@ const sidebarMenuButtonVariants = cva(
|
|
|
485
541
|
size: {
|
|
486
542
|
default: "h-8 text-sm",
|
|
487
543
|
sm: "h-7 text-xs",
|
|
488
|
-
lg: "h-12 text-sm group-data-[collapsible=icon]
|
|
544
|
+
lg: "h-12 text-sm group-data-[collapsible=icon]:!p-0",
|
|
489
545
|
},
|
|
490
546
|
},
|
|
491
547
|
defaultVariants: {
|
|
@@ -495,125 +551,129 @@ const sidebarMenuButtonVariants = cva(
|
|
|
495
551
|
}
|
|
496
552
|
)
|
|
497
553
|
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
554
|
+
const SidebarMenuButton = React.forwardRef<
|
|
555
|
+
HTMLButtonElement,
|
|
556
|
+
React.ComponentProps<"button"> & {
|
|
557
|
+
asChild?: boolean
|
|
558
|
+
isActive?: boolean
|
|
559
|
+
tooltip?: string | React.ComponentProps<typeof TooltipContent>
|
|
560
|
+
} & VariantProps<typeof sidebarMenuButtonVariants>
|
|
561
|
+
>(
|
|
562
|
+
(
|
|
563
|
+
{
|
|
564
|
+
asChild = false,
|
|
565
|
+
isActive = false,
|
|
566
|
+
variant = "default",
|
|
567
|
+
size = "default",
|
|
568
|
+
tooltip,
|
|
569
|
+
className,
|
|
570
|
+
...props
|
|
571
|
+
},
|
|
572
|
+
ref
|
|
573
|
+
) => {
|
|
574
|
+
const Comp = asChild ? Slot : "button"
|
|
575
|
+
const { isMobile, state } = useSidebar()
|
|
576
|
+
|
|
577
|
+
const button = (
|
|
578
|
+
<Comp
|
|
579
|
+
ref={ref}
|
|
580
|
+
data-sidebar="menu-button"
|
|
581
|
+
data-size={size}
|
|
582
|
+
data-active={isActive}
|
|
583
|
+
className={cn(sidebarMenuButtonVariants({ variant, size }), className)}
|
|
584
|
+
{...props}
|
|
585
|
+
/>
|
|
586
|
+
)
|
|
524
587
|
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
588
|
+
if (!tooltip) {
|
|
589
|
+
return button
|
|
590
|
+
}
|
|
528
591
|
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
592
|
+
if (typeof tooltip === "string") {
|
|
593
|
+
tooltip = {
|
|
594
|
+
children: tooltip,
|
|
595
|
+
}
|
|
532
596
|
}
|
|
533
|
-
}
|
|
534
597
|
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
}
|
|
598
|
+
return (
|
|
599
|
+
<Tooltip>
|
|
600
|
+
<TooltipTrigger asChild>{button}</TooltipTrigger>
|
|
601
|
+
<TooltipContent
|
|
602
|
+
side="right"
|
|
603
|
+
align="center"
|
|
604
|
+
hidden={state !== "collapsed" || isMobile}
|
|
605
|
+
{...tooltip}
|
|
606
|
+
/>
|
|
607
|
+
</Tooltip>
|
|
608
|
+
)
|
|
609
|
+
}
|
|
610
|
+
)
|
|
611
|
+
SidebarMenuButton.displayName = "SidebarMenuButton"
|
|
547
612
|
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
}
|
|
554
|
-
|
|
555
|
-
showOnHover?: boolean
|
|
556
|
-
}) {
|
|
613
|
+
const SidebarMenuAction = React.forwardRef<
|
|
614
|
+
HTMLButtonElement,
|
|
615
|
+
React.ComponentProps<"button"> & {
|
|
616
|
+
asChild?: boolean
|
|
617
|
+
showOnHover?: boolean
|
|
618
|
+
}
|
|
619
|
+
>(({ className, asChild = false, showOnHover = false, ...props }, ref) => {
|
|
557
620
|
const Comp = asChild ? Slot : "button"
|
|
558
621
|
|
|
559
622
|
return (
|
|
560
623
|
<Comp
|
|
561
|
-
|
|
624
|
+
ref={ref}
|
|
562
625
|
data-sidebar="menu-action"
|
|
563
626
|
className={cn(
|
|
564
|
-
"
|
|
627
|
+
"absolute right-1 top-1.5 flex aspect-square w-5 items-center justify-center rounded-md p-0 text-sidebar-foreground outline-none ring-sidebar-ring transition-transform hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 peer-hover/menu-button:text-sidebar-accent-foreground [&>svg]:size-4 [&>svg]:shrink-0",
|
|
565
628
|
// Increases the hit area of the button on mobile.
|
|
566
|
-
"after:absolute after:-inset-2 md:
|
|
629
|
+
"after:absolute after:-inset-2 after:md:hidden",
|
|
567
630
|
"peer-data-[size=sm]/menu-button:top-1",
|
|
568
631
|
"peer-data-[size=default]/menu-button:top-1.5",
|
|
569
632
|
"peer-data-[size=lg]/menu-button:top-2.5",
|
|
570
633
|
"group-data-[collapsible=icon]:hidden",
|
|
571
634
|
showOnHover &&
|
|
572
|
-
"
|
|
635
|
+
"group-focus-within/menu-item:opacity-100 group-hover/menu-item:opacity-100 data-[state=open]:opacity-100 peer-data-[active=true]/menu-button:text-sidebar-accent-foreground md:opacity-0",
|
|
573
636
|
className
|
|
574
637
|
)}
|
|
575
638
|
{...props}
|
|
576
639
|
/>
|
|
577
640
|
)
|
|
578
|
-
}
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
}
|
|
607
|
-
|
|
608
|
-
}) {
|
|
641
|
+
})
|
|
642
|
+
SidebarMenuAction.displayName = "SidebarMenuAction"
|
|
643
|
+
|
|
644
|
+
const SidebarMenuBadge = React.forwardRef<
|
|
645
|
+
HTMLDivElement,
|
|
646
|
+
React.ComponentProps<"div">
|
|
647
|
+
>(({ className, ...props }, ref) => (
|
|
648
|
+
<div
|
|
649
|
+
ref={ref}
|
|
650
|
+
data-sidebar="menu-badge"
|
|
651
|
+
className={cn(
|
|
652
|
+
"pointer-events-none absolute right-1 flex h-5 min-w-5 select-none items-center justify-center rounded-md px-1 text-xs font-medium tabular-nums text-sidebar-foreground",
|
|
653
|
+
"peer-hover/menu-button:text-sidebar-accent-foreground peer-data-[active=true]/menu-button:text-sidebar-accent-foreground",
|
|
654
|
+
"peer-data-[size=sm]/menu-button:top-1",
|
|
655
|
+
"peer-data-[size=default]/menu-button:top-1.5",
|
|
656
|
+
"peer-data-[size=lg]/menu-button:top-2.5",
|
|
657
|
+
"group-data-[collapsible=icon]:hidden",
|
|
658
|
+
className
|
|
659
|
+
)}
|
|
660
|
+
{...props}
|
|
661
|
+
/>
|
|
662
|
+
))
|
|
663
|
+
SidebarMenuBadge.displayName = "SidebarMenuBadge"
|
|
664
|
+
|
|
665
|
+
const SidebarMenuSkeleton = React.forwardRef<
|
|
666
|
+
HTMLDivElement,
|
|
667
|
+
React.ComponentProps<"div"> & {
|
|
668
|
+
showIcon?: boolean
|
|
669
|
+
}
|
|
670
|
+
>(({ className, showIcon = false, ...props }, ref) => {
|
|
609
671
|
// Random width between 50 to 90%.
|
|
610
|
-
const [width] = React.useState(() => {
|
|
611
|
-
return `${Math.floor(Math.random() * 40) + 50}%`
|
|
612
|
-
})
|
|
672
|
+
const [width] = React.useState(() => `${Math.floor(Math.random() * 40) + 50}%`)
|
|
613
673
|
|
|
614
674
|
return (
|
|
615
675
|
<div
|
|
616
|
-
|
|
676
|
+
ref={ref}
|
|
617
677
|
data-sidebar="menu-skeleton"
|
|
618
678
|
className={cn("flex h-8 items-center gap-2 rounded-md px-2", className)}
|
|
619
679
|
{...props}
|
|
@@ -625,7 +685,7 @@ function SidebarMenuSkeleton({
|
|
|
625
685
|
/>
|
|
626
686
|
)}
|
|
627
687
|
<Skeleton
|
|
628
|
-
className="h-4 max-w-
|
|
688
|
+
className="h-4 max-w-[--skeleton-width] flex-1"
|
|
629
689
|
data-sidebar="menu-skeleton-text"
|
|
630
690
|
style={
|
|
631
691
|
{
|
|
@@ -635,58 +695,50 @@ function SidebarMenuSkeleton({
|
|
|
635
695
|
/>
|
|
636
696
|
</div>
|
|
637
697
|
)
|
|
638
|
-
}
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
}
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
isActive = false,
|
|
673
|
-
className,
|
|
674
|
-
...props
|
|
675
|
-
}: React.ComponentProps<"a"> & {
|
|
676
|
-
asChild?: boolean
|
|
677
|
-
size?: "sm" | "md"
|
|
678
|
-
isActive?: boolean
|
|
679
|
-
}) {
|
|
698
|
+
})
|
|
699
|
+
SidebarMenuSkeleton.displayName = "SidebarMenuSkeleton"
|
|
700
|
+
|
|
701
|
+
const SidebarMenuSub = React.forwardRef<
|
|
702
|
+
HTMLUListElement,
|
|
703
|
+
React.ComponentProps<"ul">
|
|
704
|
+
>(({ className, ...props }, ref) => (
|
|
705
|
+
<ul
|
|
706
|
+
ref={ref}
|
|
707
|
+
data-sidebar="menu-sub"
|
|
708
|
+
className={cn(
|
|
709
|
+
"mx-3.5 flex min-w-0 translate-x-px flex-col gap-1 border-l border-sidebar-border px-2.5 py-0.5",
|
|
710
|
+
"group-data-[collapsible=icon]:hidden",
|
|
711
|
+
className
|
|
712
|
+
)}
|
|
713
|
+
{...props}
|
|
714
|
+
/>
|
|
715
|
+
))
|
|
716
|
+
SidebarMenuSub.displayName = "SidebarMenuSub"
|
|
717
|
+
|
|
718
|
+
const SidebarMenuSubItem = React.forwardRef<
|
|
719
|
+
HTMLLIElement,
|
|
720
|
+
React.ComponentProps<"li">
|
|
721
|
+
>(({ ...props }, ref) => <li ref={ref} {...props} />)
|
|
722
|
+
SidebarMenuSubItem.displayName = "SidebarMenuSubItem"
|
|
723
|
+
|
|
724
|
+
const SidebarMenuSubButton = React.forwardRef<
|
|
725
|
+
HTMLAnchorElement,
|
|
726
|
+
React.ComponentProps<"a"> & {
|
|
727
|
+
asChild?: boolean
|
|
728
|
+
size?: "sm" | "md"
|
|
729
|
+
isActive?: boolean
|
|
730
|
+
}
|
|
731
|
+
>(({ asChild = false, size = "md", isActive, className, ...props }, ref) => {
|
|
680
732
|
const Comp = asChild ? Slot : "a"
|
|
681
733
|
|
|
682
734
|
return (
|
|
683
735
|
<Comp
|
|
684
|
-
|
|
736
|
+
ref={ref}
|
|
685
737
|
data-sidebar="menu-sub-button"
|
|
686
738
|
data-size={size}
|
|
687
739
|
data-active={isActive}
|
|
688
740
|
className={cn(
|
|
689
|
-
"
|
|
741
|
+
"flex h-7 min-w-0 -translate-x-px items-center gap-2 overflow-hidden rounded-md px-2 text-sidebar-foreground outline-none ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0 [&>svg]:text-sidebar-accent-foreground",
|
|
690
742
|
"data-[active=true]:bg-sidebar-accent data-[active=true]:text-sidebar-accent-foreground",
|
|
691
743
|
size === "sm" && "text-xs",
|
|
692
744
|
size === "md" && "text-sm",
|
|
@@ -696,7 +748,8 @@ function SidebarMenuSubButton({
|
|
|
696
748
|
{...props}
|
|
697
749
|
/>
|
|
698
750
|
)
|
|
699
|
-
}
|
|
751
|
+
})
|
|
752
|
+
SidebarMenuSubButton.displayName = "SidebarMenuSubButton"
|
|
700
753
|
|
|
701
754
|
export {
|
|
702
755
|
Sidebar,
|