@k3-universe/react-kit 0.0.27 → 0.0.29
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/.storybook/main.ts +1 -1
- package/.storybook/preview.ts +18 -10
- package/biome.json +10 -0
- package/dist/index.js +2319 -1227
- package/dist/kit/builder/auth/AuthProvider.d.ts +36 -0
- package/dist/kit/builder/auth/AuthProvider.d.ts.map +1 -0
- package/dist/kit/builder/auth/adapter.d.ts +14 -0
- package/dist/kit/builder/auth/adapter.d.ts.map +1 -0
- package/dist/kit/builder/auth/client-adapters.d.ts +149 -0
- package/dist/kit/builder/auth/client-adapters.d.ts.map +1 -0
- package/dist/kit/builder/auth/components.d.ts +119 -0
- package/dist/kit/builder/auth/components.d.ts.map +1 -0
- package/dist/kit/builder/auth/hooks.d.ts +158 -0
- package/dist/kit/builder/auth/hooks.d.ts.map +1 -0
- package/dist/kit/builder/auth/index.d.ts +11 -0
- package/dist/kit/builder/auth/index.d.ts.map +1 -0
- package/dist/kit/builder/auth/permission-checker.d.ts +31 -0
- package/dist/kit/builder/auth/permission-checker.d.ts.map +1 -0
- package/dist/kit/builder/auth/storage.d.ts +17 -0
- package/dist/kit/builder/auth/storage.d.ts.map +1 -0
- package/dist/kit/builder/auth/token-manager.d.ts +9 -0
- package/dist/kit/builder/auth/token-manager.d.ts.map +1 -0
- package/dist/kit/builder/auth/types.d.ts +183 -0
- package/dist/kit/builder/auth/types.d.ts.map +1 -0
- package/dist/kit/builder/data-table/components/DataTable.d.ts +2 -1
- package/dist/kit/builder/data-table/components/DataTable.d.ts.map +1 -1
- package/dist/kit/builder/data-table/components/DataTableColumnHeader.d.ts +2 -2
- package/dist/kit/builder/data-table/components/DataTableColumnHeader.d.ts.map +1 -1
- package/dist/kit/builder/data-table/components/DataTablePagination.d.ts +2 -1
- package/dist/kit/builder/data-table/components/DataTablePagination.d.ts.map +1 -1
- package/dist/kit/builder/data-table/components/DataTableViewOptions.d.ts +1 -1
- package/dist/kit/builder/data-table/components/DataTableViewOptions.d.ts.map +1 -1
- package/dist/kit/builder/data-table/types.d.ts.map +1 -1
- package/dist/kit/builder/dialog/index.d.ts +1 -1
- package/dist/kit/builder/dialog/index.d.ts.map +1 -1
- package/dist/kit/builder/dialog/provider.d.ts +0 -1
- package/dist/kit/builder/dialog/provider.d.ts.map +1 -1
- package/dist/kit/builder/form/components/FormBuilder.d.ts.map +1 -1
- package/dist/kit/builder/form/components/FormBuilderActions.d.ts.map +1 -1
- package/dist/kit/builder/form/components/FormBuilderContext.d.ts.map +1 -1
- package/dist/kit/builder/form/components/FormBuilderField.d.ts +1 -1
- package/dist/kit/builder/form/components/FormBuilderField.d.ts.map +1 -1
- package/dist/kit/builder/form/components/fields/ArrayField.d.ts +1 -1
- package/dist/kit/builder/form/components/fields/ArrayField.d.ts.map +1 -1
- package/dist/kit/builder/form/components/fields/AutocompleteField.d.ts +1 -1
- package/dist/kit/builder/form/components/fields/AutocompleteField.d.ts.map +1 -1
- package/dist/kit/builder/form/components/fields/CheckboxField.d.ts +1 -1
- package/dist/kit/builder/form/components/fields/CheckboxField.d.ts.map +1 -1
- package/dist/kit/builder/form/components/fields/DateField.d.ts +1 -1
- package/dist/kit/builder/form/components/fields/DateField.d.ts.map +1 -1
- package/dist/kit/builder/form/components/fields/DatePickerField.d.ts +1 -1
- package/dist/kit/builder/form/components/fields/DatePickerField.d.ts.map +1 -1
- package/dist/kit/builder/form/components/fields/DateRangePickerField.d.ts +1 -1
- package/dist/kit/builder/form/components/fields/DateRangePickerField.d.ts.map +1 -1
- package/dist/kit/builder/form/components/fields/DateTimePickerField.d.ts +1 -1
- package/dist/kit/builder/form/components/fields/DateTimePickerField.d.ts.map +1 -1
- package/dist/kit/builder/form/components/fields/DateTimeRangePickerField.d.ts +1 -1
- package/dist/kit/builder/form/components/fields/DateTimeRangePickerField.d.ts.map +1 -1
- package/dist/kit/builder/form/components/fields/FileField.d.ts +1 -1
- package/dist/kit/builder/form/components/fields/FileField.d.ts.map +1 -1
- package/dist/kit/builder/form/components/fields/MonthPickerField.d.ts +1 -1
- package/dist/kit/builder/form/components/fields/MonthPickerField.d.ts.map +1 -1
- package/dist/kit/builder/form/components/fields/MonthRangePickerField.d.ts +1 -1
- package/dist/kit/builder/form/components/fields/MonthRangePickerField.d.ts.map +1 -1
- package/dist/kit/builder/form/components/fields/NumberField.d.ts +1 -1
- package/dist/kit/builder/form/components/fields/NumberField.d.ts.map +1 -1
- package/dist/kit/builder/form/components/fields/ObjectField.d.ts.map +1 -1
- package/dist/kit/builder/form/components/fields/RadioField.d.ts +1 -1
- package/dist/kit/builder/form/components/fields/RadioField.d.ts.map +1 -1
- package/dist/kit/builder/form/components/fields/SelectField.d.ts +1 -1
- package/dist/kit/builder/form/components/fields/SelectField.d.ts.map +1 -1
- package/dist/kit/builder/form/components/fields/SwitchField.d.ts +1 -1
- package/dist/kit/builder/form/components/fields/SwitchField.d.ts.map +1 -1
- package/dist/kit/builder/form/components/fields/TextField.d.ts +1 -1
- package/dist/kit/builder/form/components/fields/TextField.d.ts.map +1 -1
- package/dist/kit/builder/form/components/fields/TextareaField.d.ts +1 -1
- package/dist/kit/builder/form/components/fields/TextareaField.d.ts.map +1 -1
- package/dist/kit/builder/form/components/fields/TimePickerField.d.ts +1 -1
- package/dist/kit/builder/form/components/fields/TimePickerField.d.ts.map +1 -1
- package/dist/kit/builder/form/components/fields/TimeRangePickerField.d.ts +1 -1
- package/dist/kit/builder/form/components/fields/TimeRangePickerField.d.ts.map +1 -1
- package/dist/kit/builder/form/components/fields/index.d.ts.map +1 -1
- package/dist/kit/builder/form/components/fields/types.d.ts.map +1 -1
- package/dist/kit/builder/form/components/sectionNodes.d.ts.map +1 -1
- package/dist/kit/builder/form/hooks/useFormBuilder.d.ts.map +1 -1
- package/dist/kit/builder/form/types.d.ts.map +1 -1
- package/dist/kit/builder/form/utils/section-factories.d.ts.map +1 -1
- package/dist/kit/builder/page/Page.d.ts.map +1 -1
- package/dist/kit/builder/page/index.d.ts.map +1 -1
- package/dist/kit/builder/section/SectionBuilder.d.ts +1 -1
- package/dist/kit/builder/section/SectionBuilder.d.ts.map +1 -1
- package/dist/kit/builder/section/SectionContainer.d.ts +14 -0
- package/dist/kit/builder/section/SectionContainer.d.ts.map +1 -0
- package/dist/kit/builder/stack-dialog/context.d.ts.map +1 -1
- package/dist/kit/builder/stack-dialog/hooks.d.ts.map +1 -1
- package/dist/kit/builder/stack-dialog/index.d.ts +3 -3
- package/dist/kit/builder/stack-dialog/index.d.ts.map +1 -1
- package/dist/kit/builder/stack-dialog/provider.d.ts.map +1 -1
- package/dist/kit/builder/stack-dialog/renderer.d.ts.map +1 -1
- package/dist/kit/builder/stack-dialog/types.d.ts +1 -1
- package/dist/kit/builder/stack-dialog/types.d.ts.map +1 -1
- package/dist/kit/components/autocomplete/Autocomplete.d.ts +1 -1
- package/dist/kit/components/autocomplete/Autocomplete.d.ts.map +1 -1
- package/dist/kit/components/autocomplete/types.d.ts.map +1 -1
- package/dist/kit/components/datepicker/DatePicker.d.ts.map +1 -1
- package/dist/kit/components/datepicker/DateRangePicker.d.ts.map +1 -1
- package/dist/kit/components/datetimepicker/DateTimePicker.d.ts.map +1 -1
- package/dist/kit/components/datetimepicker/DateTimeRangePicker.d.ts.map +1 -1
- package/dist/kit/components/datetimepicker/index.d.ts.map +1 -1
- package/dist/kit/components/fileuploader/FileUploader.d.ts.map +1 -1
- package/dist/kit/components/fileuploader/types.d.ts +2 -2
- package/dist/kit/components/forminfo/FormInfoError.d.ts.map +1 -1
- package/dist/kit/components/login/Login.d.ts +1 -1
- package/dist/kit/components/login/Login.d.ts.map +1 -1
- package/dist/kit/components/monthpicker/MonthInput.d.ts.map +1 -1
- package/dist/kit/components/monthpicker/MonthPicker.d.ts.map +1 -1
- package/dist/kit/components/monthpicker/MonthRangeInput.d.ts.map +1 -1
- package/dist/kit/components/monthpicker/MonthRangePicker.d.ts.map +1 -1
- package/dist/kit/components/timepicker/TimePicker.d.ts.map +1 -1
- package/dist/kit/components/timepicker/TimeRangePicker.d.ts.map +1 -1
- package/dist/kit/components/timepicker/index.d.ts.map +1 -1
- package/dist/kit/layouts/admin/components/AdminLayout.d.ts.map +1 -1
- package/dist/kit/layouts/admin/components/ThemeToggle.d.ts.map +1 -1
- package/dist/kit/layouts/admin/hooks/menu.d.ts.map +1 -1
- package/dist/kit/layouts/admin/providers/AdminMenuProvider.d.ts +1 -1
- package/dist/kit/layouts/admin/providers/AdminMenuProvider.d.ts.map +1 -1
- package/dist/shadcn/hooks/use-mobile.d.ts.map +1 -1
- package/dist/shadcn/ui/accordion.d.ts +2 -2
- package/dist/shadcn/ui/accordion.d.ts.map +1 -1
- package/dist/shadcn/ui/alert-dialog.d.ts +4 -4
- package/dist/shadcn/ui/alert-dialog.d.ts.map +1 -1
- package/dist/shadcn/ui/alert.d.ts +4 -4
- package/dist/shadcn/ui/alert.d.ts.map +1 -1
- package/dist/shadcn/ui/aspect-ratio.d.ts +1 -1
- package/dist/shadcn/ui/aspect-ratio.d.ts.map +1 -1
- package/dist/shadcn/ui/avatar.d.ts +2 -2
- package/dist/shadcn/ui/avatar.d.ts.map +1 -1
- package/dist/shadcn/ui/badge.d.ts +2 -2
- package/dist/shadcn/ui/badge.d.ts.map +1 -1
- package/dist/shadcn/ui/breadcrumb.d.ts +8 -8
- package/dist/shadcn/ui/breadcrumb.d.ts.map +1 -1
- package/dist/shadcn/ui/button.d.ts +2 -2
- package/dist/shadcn/ui/button.d.ts.map +1 -1
- package/dist/shadcn/ui/calendar.d.ts +2 -2
- package/dist/shadcn/ui/calendar.d.ts.map +1 -1
- package/dist/shadcn/ui/card.d.ts +8 -8
- package/dist/shadcn/ui/card.d.ts.map +1 -1
- package/dist/shadcn/ui/carousel.d.ts +5 -5
- package/dist/shadcn/ui/carousel.d.ts.map +1 -1
- package/dist/shadcn/ui/chart.d.ts +7 -7
- package/dist/shadcn/ui/chart.d.ts.map +1 -1
- package/dist/shadcn/ui/checkbox.d.ts +2 -2
- package/dist/shadcn/ui/checkbox.d.ts.map +1 -1
- package/dist/shadcn/ui/collapsible.d.ts +1 -1
- package/dist/shadcn/ui/collapsible.d.ts.map +1 -1
- package/dist/shadcn/ui/command.d.ts +2 -2
- package/dist/shadcn/ui/command.d.ts.map +1 -1
- package/dist/shadcn/ui/context-menu.d.ts +4 -4
- package/dist/shadcn/ui/context-menu.d.ts.map +1 -1
- package/dist/shadcn/ui/dialog.d.ts +4 -4
- package/dist/shadcn/ui/dialog.d.ts.map +1 -1
- package/dist/shadcn/ui/drawer.d.ts +3 -3
- package/dist/shadcn/ui/drawer.d.ts.map +1 -1
- package/dist/shadcn/ui/dropdown-menu.d.ts +4 -4
- package/dist/shadcn/ui/dropdown-menu.d.ts.map +1 -1
- package/dist/shadcn/ui/form.d.ts +5 -5
- package/dist/shadcn/ui/form.d.ts.map +1 -1
- package/dist/shadcn/ui/hover-card.d.ts +2 -2
- package/dist/shadcn/ui/hover-card.d.ts.map +1 -1
- package/dist/shadcn/ui/input-otp.d.ts +4 -4
- package/dist/shadcn/ui/input-otp.d.ts.map +1 -1
- package/dist/shadcn/ui/input.d.ts +2 -2
- package/dist/shadcn/ui/input.d.ts.map +1 -1
- package/dist/shadcn/ui/label.d.ts +2 -2
- package/dist/shadcn/ui/label.d.ts.map +1 -1
- package/dist/shadcn/ui/menubar.d.ts +4 -4
- package/dist/shadcn/ui/menubar.d.ts.map +1 -1
- package/dist/shadcn/ui/navigation-menu.d.ts +2 -2
- package/dist/shadcn/ui/navigation-menu.d.ts.map +1 -1
- package/dist/shadcn/ui/pagination.d.ts +6 -6
- package/dist/shadcn/ui/pagination.d.ts.map +1 -1
- package/dist/shadcn/ui/popover.d.ts +2 -2
- package/dist/shadcn/ui/popover.d.ts.map +1 -1
- package/dist/shadcn/ui/progress.d.ts +2 -2
- package/dist/shadcn/ui/progress.d.ts.map +1 -1
- package/dist/shadcn/ui/radio-group.d.ts +2 -2
- package/dist/shadcn/ui/radio-group.d.ts.map +1 -1
- package/dist/shadcn/ui/resizable.d.ts +2 -2
- package/dist/shadcn/ui/resizable.d.ts.map +1 -1
- package/dist/shadcn/ui/scroll-area.d.ts +2 -2
- package/dist/shadcn/ui/scroll-area.d.ts.map +1 -1
- package/dist/shadcn/ui/select.d.ts +3 -3
- package/dist/shadcn/ui/select.d.ts.map +1 -1
- package/dist/shadcn/ui/separator.d.ts +2 -2
- package/dist/shadcn/ui/separator.d.ts.map +1 -1
- package/dist/shadcn/ui/sheet.d.ts +5 -5
- package/dist/shadcn/ui/sheet.d.ts.map +1 -1
- package/dist/shadcn/ui/sidebar.d.ts +26 -26
- package/dist/shadcn/ui/sidebar.d.ts.map +1 -1
- package/dist/shadcn/ui/skeleton.d.ts +1 -1
- package/dist/shadcn/ui/skeleton.d.ts.map +1 -1
- package/dist/shadcn/ui/slider.d.ts +2 -2
- package/dist/shadcn/ui/slider.d.ts.map +1 -1
- package/dist/shadcn/ui/sonner.d.ts.map +1 -1
- package/dist/shadcn/ui/switch.d.ts +2 -2
- package/dist/shadcn/ui/switch.d.ts.map +1 -1
- package/dist/shadcn/ui/table.d.ts +9 -9
- package/dist/shadcn/ui/table.d.ts.map +1 -1
- package/dist/shadcn/ui/tabs.d.ts +2 -2
- package/dist/shadcn/ui/tabs.d.ts.map +1 -1
- package/dist/shadcn/ui/textarea.d.ts +2 -2
- package/dist/shadcn/ui/textarea.d.ts.map +1 -1
- package/dist/shadcn/ui/toggle-group.d.ts +2 -2
- package/dist/shadcn/ui/toggle-group.d.ts.map +1 -1
- package/dist/shadcn/ui/toggle.d.ts +2 -2
- package/dist/shadcn/ui/toggle.d.ts.map +1 -1
- package/dist/shadcn/ui/tooltip.d.ts +2 -2
- package/dist/shadcn/ui/tooltip.d.ts.map +1 -1
- package/package.json +2 -2
- package/src/index.ts +1 -1
- package/src/kit/builder/auth/AuthProvider.tsx +131 -0
- package/src/kit/builder/auth/adapter.ts +436 -0
- package/src/kit/builder/auth/client-adapters.ts +398 -0
- package/src/kit/builder/auth/components.tsx +221 -0
- package/src/kit/builder/auth/hooks.ts +237 -0
- package/src/kit/builder/auth/index.ts +134 -0
- package/src/kit/builder/auth/permission-checker.ts +150 -0
- package/src/kit/builder/auth/storage.ts +366 -0
- package/src/kit/builder/auth/token-manager.ts +55 -0
- package/src/kit/builder/auth/types.ts +393 -0
- package/src/kit/builder/data-table/components/DataTable.tsx +216 -82
- package/src/kit/builder/data-table/components/DataTableColumnHeader.tsx +9 -5
- package/src/kit/builder/data-table/components/DataTablePagination.tsx +49 -27
- package/src/kit/builder/data-table/components/DataTableViewOptions.tsx +13 -4
- package/src/kit/builder/data-table/types.ts +18 -3
- package/src/kit/builder/dialog/index.ts +5 -1
- package/src/kit/builder/dialog/provider.tsx +56 -27
- package/src/kit/builder/form/components/FormBuilder.tsx +10 -14
- package/src/kit/builder/form/components/FormBuilderActions.tsx +1 -1
- package/src/kit/builder/form/components/FormBuilderContext.tsx +13 -6
- package/src/kit/builder/form/components/FormBuilderField.tsx +70 -20
- package/src/kit/builder/form/components/fields/ArrayField.tsx +148 -62
- package/src/kit/builder/form/components/fields/AutocompleteField.tsx +53 -18
- package/src/kit/builder/form/components/fields/CheckboxField.tsx +20 -11
- package/src/kit/builder/form/components/fields/DateField.tsx +17 -6
- package/src/kit/builder/form/components/fields/DatePickerField.tsx +15 -10
- package/src/kit/builder/form/components/fields/DateRangePickerField.tsx +20 -15
- package/src/kit/builder/form/components/fields/DateTimePickerField.tsx +16 -11
- package/src/kit/builder/form/components/fields/DateTimeRangePickerField.tsx +23 -17
- package/src/kit/builder/form/components/fields/FileField.tsx +10 -5
- package/src/kit/builder/form/components/fields/MonthPickerField.tsx +18 -11
- package/src/kit/builder/form/components/fields/MonthRangePickerField.tsx +23 -17
- package/src/kit/builder/form/components/fields/NumberField.tsx +9 -4
- package/src/kit/builder/form/components/fields/ObjectField.tsx +12 -7
- package/src/kit/builder/form/components/fields/RadioField.tsx +32 -14
- package/src/kit/builder/form/components/fields/SelectField.tsx +26 -11
- package/src/kit/builder/form/components/fields/SwitchField.tsx +20 -11
- package/src/kit/builder/form/components/fields/TextField.tsx +11 -5
- package/src/kit/builder/form/components/fields/TextareaField.tsx +9 -4
- package/src/kit/builder/form/components/fields/TimePickerField.tsx +16 -11
- package/src/kit/builder/form/components/fields/TimeRangePickerField.tsx +23 -17
- package/src/kit/builder/form/components/fields/index.ts +21 -21
- package/src/kit/builder/form/components/fields/types.ts +15 -11
- package/src/kit/builder/form/components/sectionNodes.tsx +63 -40
- package/src/kit/builder/form/hooks/useFormBuilder.ts +83 -34
- package/src/kit/builder/form/types.ts +173 -148
- package/src/kit/builder/form/utils/section-factories.ts +4 -1
- package/src/kit/builder/form/utils/transformers.ts +4 -4
- package/src/kit/builder/form/utils/validations.ts +1 -1
- package/src/kit/builder/page/Page.tsx +26 -6
- package/src/kit/builder/page/index.ts +1 -1
- package/src/kit/builder/section/SectionBuilder.tsx +252 -127
- package/src/kit/builder/section/SectionContainer.tsx +85 -0
- package/src/kit/builder/stack-dialog/context.ts +10 -4
- package/src/kit/builder/stack-dialog/hooks.ts +4 -3
- package/src/kit/builder/stack-dialog/index.ts +5 -11
- package/src/kit/builder/stack-dialog/provider.tsx +11 -11
- package/src/kit/builder/stack-dialog/renderer.tsx +23 -26
- package/src/kit/builder/stack-dialog/types.ts +18 -18
- package/src/kit/components/autocomplete/Autocomplete.tsx +631 -549
- package/src/kit/components/autocomplete/types.ts +17 -17
- package/src/kit/components/datepicker/DatePicker.tsx +33 -9
- package/src/kit/components/datepicker/DateRangePicker.tsx +159 -87
- package/src/kit/components/datetimepicker/DateTimePicker.tsx +136 -30
- package/src/kit/components/datetimepicker/DateTimeRangePicker.tsx +257 -67
- package/src/kit/components/datetimepicker/index.ts +3 -3
- package/src/kit/components/fileuploader/FileUploader.tsx +315 -180
- package/src/kit/components/fileuploader/index.ts +3 -3
- package/src/kit/components/fileuploader/types.ts +3 -3
- package/src/kit/components/forminfo/FormInfoError.tsx +26 -11
- package/src/kit/components/login/Login.tsx +13 -4
- package/src/kit/components/monthpicker/MonthInput.tsx +13 -4
- package/src/kit/components/monthpicker/MonthPicker.tsx +12 -11
- package/src/kit/components/monthpicker/MonthRangeInput.tsx +29 -8
- package/src/kit/components/monthpicker/MonthRangePicker.tsx +23 -21
- package/src/kit/components/timepicker/TimePicker.tsx +19 -11
- package/src/kit/components/timepicker/TimeRangePicker.tsx +106 -29
- package/src/kit/components/timepicker/index.ts +3 -3
- package/src/kit/layouts/admin/components/AdminLayout.tsx +53 -24
- package/src/kit/layouts/admin/components/ThemeToggle.tsx +3 -9
- package/src/kit/layouts/admin/hooks/menu.ts +11 -5
- package/src/kit/layouts/admin/providers/AdminMenuProvider.tsx +59 -39
- package/src/kit/layouts/admin/types/index.ts +1 -1
- package/src/kit/themes/base.css +1 -1
- package/src/kit/themes/clean-slate.css +40 -32
- package/src/kit/themes/default.css +34 -24
- package/src/kit/themes/minimal-modern.css +37 -29
- package/src/kit/themes/spotify.css +56 -39
- package/src/shadcn/hooks/use-mobile.ts +13 -11
- package/src/shadcn/lib/utils.ts +2 -2
- package/src/shadcn/ui/accordion.tsx +14 -14
- package/src/shadcn/ui/alert-dialog.tsx +29 -29
- package/src/shadcn/ui/alert.tsx +20 -20
- package/src/shadcn/ui/aspect-ratio.tsx +4 -4
- package/src/shadcn/ui/avatar.tsx +13 -13
- package/src/shadcn/ui/badge.tsx +16 -16
- package/src/shadcn/ui/breadcrumb.tsx +28 -28
- package/src/shadcn/ui/button.tsx +23 -23
- package/src/shadcn/ui/calendar.tsx +82 -78
- package/src/shadcn/ui/card.tsx +27 -27
- package/src/shadcn/ui/carousel.tsx +93 -93
- package/src/shadcn/ui/chart.tsx +103 -103
- package/src/shadcn/ui/checkbox.tsx +9 -9
- package/src/shadcn/ui/collapsible.tsx +6 -6
- package/src/shadcn/ui/command.tsx +36 -36
- package/src/shadcn/ui/context-menu.tsx +40 -40
- package/src/shadcn/ui/dialog.tsx +28 -28
- package/src/shadcn/ui/drawer.tsx +30 -30
- package/src/shadcn/ui/dropdown-menu.tsx +41 -41
- package/src/shadcn/ui/form.tsx +48 -47
- package/src/shadcn/ui/hover-card.tsx +11 -11
- package/src/shadcn/ui/input-otp.tsx +23 -23
- package/src/shadcn/ui/input.tsx +9 -9
- package/src/shadcn/ui/label.tsx +8 -8
- package/src/shadcn/ui/menubar.tsx +47 -47
- package/src/shadcn/ui/navigation-menu.tsx +33 -33
- package/src/shadcn/ui/pagination.tsx +28 -28
- package/src/shadcn/ui/popover.tsx +12 -12
- package/src/shadcn/ui/progress.tsx +8 -8
- package/src/shadcn/ui/radio-group.tsx +11 -11
- package/src/shadcn/ui/resizable.tsx +14 -14
- package/src/shadcn/ui/scroll-area.tsx +15 -15
- package/src/shadcn/ui/select.tsx +34 -34
- package/src/shadcn/ui/separator.tsx +9 -9
- package/src/shadcn/ui/sheet.tsx +36 -36
- package/src/shadcn/ui/sidebar.tsx +227 -227
- package/src/shadcn/ui/skeleton.tsx +5 -5
- package/src/shadcn/ui/slider.tsx +12 -12
- package/src/shadcn/ui/sonner.tsx +11 -11
- package/src/shadcn/ui/switch.tsx +9 -9
- package/src/shadcn/ui/table.tsx +32 -32
- package/src/shadcn/ui/tabs.tsx +14 -14
- package/src/shadcn/ui/textarea.tsx +7 -7
- package/src/shadcn/ui/toggle-group.tsx +17 -17
- package/src/shadcn/ui/toggle.tsx +16 -16
- package/src/shadcn/ui/tooltip.tsx +11 -11
- package/src/stories/FileUploader.stories.tsx +23 -4
- package/src/stories/kit/builder/DataTable.Basic.stories.tsx +14 -4
- package/src/stories/kit/builder/DataTable.Filters.stories.tsx +36 -14
- package/src/stories/kit/builder/DataTable.Pagination.stories.tsx +3 -2
- package/src/stories/kit/builder/DataTable.SelectionAndActions.stories.tsx +18 -4
- package/src/stories/kit/builder/DataTable.Sorting.stories.tsx +18 -7
- package/src/stories/kit/builder/Dialog.stories.tsx +19 -13
- package/src/stories/kit/builder/Form.ArrayLayouts.stories.tsx +40 -16
- package/src/stories/kit/builder/Form.Autocomplete.stories.tsx +34 -22
- package/src/stories/kit/builder/Form.Basic.stories.tsx +38 -6
- package/src/stories/kit/builder/Form.Complex.stories.tsx +356 -111
- package/src/stories/kit/builder/Form.DateTime.stories.tsx +12 -8
- package/src/stories/kit/builder/Form.Dynamic.stories.tsx +695 -132
- package/src/stories/kit/builder/Form.Files.stories.tsx +37 -26
- package/src/stories/kit/builder/Form.MultipleFormBuilder.stories.tsx +46 -42
- package/src/stories/kit/builder/Form.Pickers.stories.tsx +12 -8
- package/src/stories/kit/builder/Form.Simple.stories.tsx +15 -6
- package/src/stories/kit/builder/Form.Time.stories.tsx +12 -8
- package/src/stories/kit/builder/Page.stories.tsx +32 -6
- package/src/stories/kit/builder/Section.stories.tsx +58 -11
- package/src/stories/kit/components/Autocomplete.stories.tsx +55 -22
- package/src/stories/kit/components/DatePicker.stories.tsx +80 -13
- package/src/stories/kit/components/DateRangePicker.stories.tsx +52 -11
- package/src/stories/kit/components/Login.stories.tsx +8 -2
- package/src/stories/kit/components/MonthPicker.stories.tsx +26 -6
- package/src/stories/kit/components/MonthRangePicker.stories.tsx +24 -5
- package/src/stories/kit/components/TimePicker.stories.tsx +18 -16
- package/src/stories/kit/components/TimeRangePicker.stories.tsx +18 -12
- package/src/stories/kit/layouts/admin/AdminLayout.Basic.stories.tsx +29 -6
- package/src/stories/kit/layouts/admin/AdminLayout.Collapsible.stories.tsx +26 -5
- package/src/stories/kit/layouts/admin/AdminLayout.Complex.stories.tsx +101 -18
- package/src/stories/kit/layouts/admin/AdminLayout.CustomSidebarHeaderComponent.stories.tsx +18 -4
- package/src/stories/kit/layouts/admin/AdminLayout.CustomSidebarTitleAndIcon.stories.tsx +17 -4
- package/src/stories/kit/layouts/admin/AdminLayout.HeaderSlots.stories.tsx +28 -6
- package/src/stories/shadcn/ui/Accordion.stories.tsx +33 -10
- package/src/stories/shadcn/ui/AlertDialog.stories.tsx +3 -1
- package/src/stories/shadcn/ui/Button.stories.tsx +3 -1
- package/src/stories/shadcn/ui/Calendar.stories.tsx +6 -1
- package/src/stories/shadcn/ui/Card.stories.tsx +11 -2
- package/src/stories/shadcn/ui/Checkbox.stories.tsx +11 -3
- package/src/stories/shadcn/ui/Collapsible.stories.tsx +12 -5
- package/src/stories/shadcn/ui/ContextMenu.stories.tsx +12 -4
- package/src/stories/shadcn/ui/Dialog.stories.tsx +15 -3
- package/src/stories/shadcn/ui/Drawer.stories.tsx +5 -2
- package/src/stories/shadcn/ui/DropdownMenu.stories.tsx +15 -5
- package/src/stories/shadcn/ui/Form.stories.tsx +5 -2
- package/src/stories/shadcn/ui/HoverCard.stories.tsx +8 -2
- package/src/stories/shadcn/ui/Input.stories.tsx +3 -1
- package/src/stories/shadcn/ui/InputOtp.stories.tsx +9 -2
- package/src/stories/shadcn/ui/Menubar.stories.tsx +21 -7
- package/src/stories/shadcn/ui/NavigationMenu.stories.tsx +30 -5
- package/src/stories/shadcn/ui/Popover.stories.tsx +8 -2
- package/src/stories/shadcn/ui/Resizable.stories.tsx +17 -5
- package/src/stories/shadcn/ui/ScrollArea.stories.tsx +54 -2
- package/src/stories/shadcn/ui/Select.stories.tsx +7 -1
- package/src/stories/shadcn/ui/Sheet.stories.tsx +2 -1
- package/src/stories/shadcn/ui/Sidebar.stories.tsx +13 -2
- package/src/stories/shadcn/ui/Sonner.stories.tsx +12 -2
- package/src/stories/shadcn/ui/Table.stories.tsx +86 -27
- package/src/stories/shadcn/ui/Tabs.stories.tsx +9 -2
- package/src/stories/shadcn/ui/Textarea.stories.tsx +3 -1
- package/src/stories/shadcn/ui/Toggle.stories.tsx +10 -2
- package/src/stories/shadcn/ui/Tooltip.stories.tsx +6 -1
- package/tsconfig.json +1 -5
- package/tsconfig.tsbuildinfo +1 -0
- package/eslint.config.mjs +0 -19
|
@@ -4,7 +4,11 @@ import * as React from 'react';
|
|
|
4
4
|
import { Clock } from 'lucide-react';
|
|
5
5
|
import { cn } from '../../../shadcn/lib/utils';
|
|
6
6
|
import { Button } from '../../../shadcn/ui/button';
|
|
7
|
-
import {
|
|
7
|
+
import {
|
|
8
|
+
Popover,
|
|
9
|
+
PopoverContent,
|
|
10
|
+
PopoverTrigger,
|
|
11
|
+
} from '../../../shadcn/ui/popover';
|
|
8
12
|
import {
|
|
9
13
|
Select,
|
|
10
14
|
SelectContent,
|
|
@@ -20,7 +24,8 @@ export interface TimeRangePickerValue {
|
|
|
20
24
|
to?: Date | null;
|
|
21
25
|
}
|
|
22
26
|
|
|
23
|
-
export interface TimeRangePickerProps
|
|
27
|
+
export interface TimeRangePickerProps
|
|
28
|
+
extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'> {
|
|
24
29
|
value?: TimeRangePickerValue | null;
|
|
25
30
|
onChange?: (range: TimeRangePickerValue | null) => void;
|
|
26
31
|
placeholder?: string;
|
|
@@ -60,9 +65,29 @@ function TimeUnitSelector({
|
|
|
60
65
|
value: Date | null | undefined;
|
|
61
66
|
onChange: (next: Date | null) => void;
|
|
62
67
|
}) {
|
|
63
|
-
const hours = React.useMemo(
|
|
64
|
-
|
|
65
|
-
|
|
68
|
+
const hours = React.useMemo(
|
|
69
|
+
() =>
|
|
70
|
+
hourCycle === 12
|
|
71
|
+
? Array.from({ length: 12 }, (_, i) => i + 1)
|
|
72
|
+
: Array.from({ length: 24 }, (_, i) => i),
|
|
73
|
+
[hourCycle],
|
|
74
|
+
);
|
|
75
|
+
const minutes = React.useMemo(
|
|
76
|
+
() =>
|
|
77
|
+
Array.from(
|
|
78
|
+
{ length: Math.ceil(60 / minuteStep) },
|
|
79
|
+
(_, i) => i * minuteStep,
|
|
80
|
+
),
|
|
81
|
+
[minuteStep],
|
|
82
|
+
);
|
|
83
|
+
const seconds = React.useMemo(
|
|
84
|
+
() =>
|
|
85
|
+
Array.from(
|
|
86
|
+
{ length: Math.ceil(60 / secondStep) },
|
|
87
|
+
(_, i) => i * secondStep,
|
|
88
|
+
),
|
|
89
|
+
[secondStep],
|
|
90
|
+
);
|
|
66
91
|
const selectedHour = React.useMemo(() => {
|
|
67
92
|
if (!value) return hourCycle === 12 ? 12 : 0;
|
|
68
93
|
const h = value.getHours();
|
|
@@ -70,21 +95,33 @@ function TimeUnitSelector({
|
|
|
70
95
|
}, [value, hourCycle]);
|
|
71
96
|
const selectedMinute = value?.getMinutes() ?? 0;
|
|
72
97
|
const selectedSecond = value?.getSeconds() ?? 0;
|
|
73
|
-
const selectedPeriod: 'AM' | 'PM' =
|
|
98
|
+
const selectedPeriod: 'AM' | 'PM' =
|
|
99
|
+
value && value.getHours() >= 12 ? 'PM' : 'AM';
|
|
74
100
|
|
|
75
|
-
const setPart = (
|
|
101
|
+
const setPart = (
|
|
102
|
+
part: 'hour' | 'minute' | 'second' | 'period',
|
|
103
|
+
v: number | 'AM' | 'PM',
|
|
104
|
+
) => {
|
|
76
105
|
const base = value
|
|
77
106
|
? new Date(value)
|
|
78
107
|
: (() => {
|
|
79
108
|
const n = new Date();
|
|
80
|
-
return new Date(
|
|
109
|
+
return new Date(
|
|
110
|
+
n.getFullYear(),
|
|
111
|
+
n.getMonth(),
|
|
112
|
+
n.getDate(),
|
|
113
|
+
0,
|
|
114
|
+
0,
|
|
115
|
+
0,
|
|
116
|
+
0,
|
|
117
|
+
);
|
|
81
118
|
})();
|
|
82
119
|
if (part === 'hour') {
|
|
83
120
|
let h = Number(v);
|
|
84
121
|
if (hourCycle === 12) {
|
|
85
122
|
const isPM = base.getHours() >= 12;
|
|
86
123
|
h = h % 12;
|
|
87
|
-
base.setHours(isPM ? (h === 12 ? 12 : h + 12) :
|
|
124
|
+
base.setHours(isPM ? (h === 12 ? 12 : h + 12) : h === 12 ? 0 : h);
|
|
88
125
|
} else {
|
|
89
126
|
base.setHours(h);
|
|
90
127
|
}
|
|
@@ -108,13 +145,19 @@ function TimeUnitSelector({
|
|
|
108
145
|
<div className="flex items-end gap-2">
|
|
109
146
|
<div className="w-24">
|
|
110
147
|
<div className="mb-1 block text-xs text-muted-foreground">Hour</div>
|
|
111
|
-
<Select
|
|
148
|
+
<Select
|
|
149
|
+
disabled={disabled}
|
|
150
|
+
value={String(selectedHour)}
|
|
151
|
+
onValueChange={(v) => setPart('hour', Number(v))}
|
|
152
|
+
>
|
|
112
153
|
<SelectTrigger aria-label={`${label} hour`}>
|
|
113
154
|
<SelectValue />
|
|
114
155
|
</SelectTrigger>
|
|
115
156
|
<SelectContent>
|
|
116
157
|
{hours.map((h) => (
|
|
117
|
-
<SelectItem key={h} value={String(h)}>
|
|
158
|
+
<SelectItem key={h} value={String(h)}>
|
|
159
|
+
{hourCycle === 12 ? h : pad2(h)}
|
|
160
|
+
</SelectItem>
|
|
118
161
|
))}
|
|
119
162
|
</SelectContent>
|
|
120
163
|
</Select>
|
|
@@ -122,14 +165,22 @@ function TimeUnitSelector({
|
|
|
122
165
|
|
|
123
166
|
{(precision === 'minute' || precision === 'second') && (
|
|
124
167
|
<div className="w-24">
|
|
125
|
-
<div className="mb-1 block text-xs text-muted-foreground">
|
|
126
|
-
|
|
168
|
+
<div className="mb-1 block text-xs text-muted-foreground">
|
|
169
|
+
Minute
|
|
170
|
+
</div>
|
|
171
|
+
<Select
|
|
172
|
+
disabled={disabled}
|
|
173
|
+
value={String(selectedMinute - (selectedMinute % minuteStep))}
|
|
174
|
+
onValueChange={(v) => setPart('minute', Number(v))}
|
|
175
|
+
>
|
|
127
176
|
<SelectTrigger aria-label={`${label} minute`}>
|
|
128
177
|
<SelectValue />
|
|
129
178
|
</SelectTrigger>
|
|
130
179
|
<SelectContent>
|
|
131
180
|
{minutes.map((m) => (
|
|
132
|
-
<SelectItem key={m} value={String(m)}>
|
|
181
|
+
<SelectItem key={m} value={String(m)}>
|
|
182
|
+
{pad2(m)}
|
|
183
|
+
</SelectItem>
|
|
133
184
|
))}
|
|
134
185
|
</SelectContent>
|
|
135
186
|
</Select>
|
|
@@ -138,14 +189,22 @@ function TimeUnitSelector({
|
|
|
138
189
|
|
|
139
190
|
{precision === 'second' && (
|
|
140
191
|
<div className="w-24">
|
|
141
|
-
<div className="mb-1 block text-xs text-muted-foreground">
|
|
142
|
-
|
|
192
|
+
<div className="mb-1 block text-xs text-muted-foreground">
|
|
193
|
+
Second
|
|
194
|
+
</div>
|
|
195
|
+
<Select
|
|
196
|
+
disabled={disabled}
|
|
197
|
+
value={String(selectedSecond - (selectedSecond % secondStep))}
|
|
198
|
+
onValueChange={(v) => setPart('second', Number(v))}
|
|
199
|
+
>
|
|
143
200
|
<SelectTrigger aria-label={`${label} second`}>
|
|
144
201
|
<SelectValue />
|
|
145
202
|
</SelectTrigger>
|
|
146
203
|
<SelectContent>
|
|
147
204
|
{seconds.map((s) => (
|
|
148
|
-
<SelectItem key={s} value={String(s)}>
|
|
205
|
+
<SelectItem key={s} value={String(s)}>
|
|
206
|
+
{pad2(s)}
|
|
207
|
+
</SelectItem>
|
|
149
208
|
))}
|
|
150
209
|
</SelectContent>
|
|
151
210
|
</Select>
|
|
@@ -154,8 +213,14 @@ function TimeUnitSelector({
|
|
|
154
213
|
|
|
155
214
|
{hourCycle === 12 && (
|
|
156
215
|
<div className="w-24">
|
|
157
|
-
<div className="mb-1 block text-xs text-muted-foreground">
|
|
158
|
-
|
|
216
|
+
<div className="mb-1 block text-xs text-muted-foreground">
|
|
217
|
+
Period
|
|
218
|
+
</div>
|
|
219
|
+
<Select
|
|
220
|
+
disabled={disabled}
|
|
221
|
+
value={selectedPeriod}
|
|
222
|
+
onValueChange={(v) => setPart('period', v as 'AM' | 'PM')}
|
|
223
|
+
>
|
|
159
224
|
<SelectTrigger aria-label={`${label} period`}>
|
|
160
225
|
<SelectValue />
|
|
161
226
|
</SelectTrigger>
|
|
@@ -187,8 +252,11 @@ export function TimeRangePicker({
|
|
|
187
252
|
}: TimeRangePickerProps) {
|
|
188
253
|
const [internalOpen, setInternalOpen] = React.useState(false);
|
|
189
254
|
const isOpen = typeof props.open === 'boolean' ? props.open : internalOpen;
|
|
190
|
-
const setOpen = (o: boolean) =>
|
|
191
|
-
|
|
255
|
+
const setOpen = (o: boolean) =>
|
|
256
|
+
props.onOpenChange ? props.onOpenChange(o) : setInternalOpen(o);
|
|
257
|
+
const [draft, setDraft] = React.useState<TimeRangePickerValue | null>(
|
|
258
|
+
value ?? null,
|
|
259
|
+
);
|
|
192
260
|
|
|
193
261
|
React.useEffect(() => {
|
|
194
262
|
if (isOpen) setDraft(value ?? null);
|
|
@@ -198,12 +266,16 @@ export function TimeRangePicker({
|
|
|
198
266
|
const f = draft?.from ?? value?.from ?? null;
|
|
199
267
|
const t = draft?.to ?? value?.to ?? null;
|
|
200
268
|
if (format) return format(f ?? null, t ?? null);
|
|
201
|
-
const fs = f
|
|
202
|
-
?
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
269
|
+
const fs = f
|
|
270
|
+
? hourCycle === 12
|
|
271
|
+
? `${f.getHours() % 12 || 12}:${pad2(f.getMinutes())}${precision === 'second' ? `:${pad2(f.getSeconds())}` : ''} ${f.getHours() >= 12 ? 'PM' : 'AM'}`
|
|
272
|
+
: `${pad2(f.getHours())}:${pad2(f.getMinutes())}${precision === 'second' ? `:${pad2(f.getSeconds())}` : ''}`
|
|
273
|
+
: null;
|
|
274
|
+
const ts = t
|
|
275
|
+
? hourCycle === 12
|
|
276
|
+
? `${t.getHours() % 12 || 12}:${pad2(t.getMinutes())}${precision === 'second' ? `:${pad2(t.getSeconds())}` : ''} ${t.getHours() >= 12 ? 'PM' : 'AM'}`
|
|
277
|
+
: `${pad2(t.getHours())}:${pad2(t.getMinutes())}${precision === 'second' ? `:${pad2(t.getSeconds())}` : ''}`
|
|
278
|
+
: null;
|
|
207
279
|
return fs && ts ? `${fs} – ${ts}` : placeholder;
|
|
208
280
|
}, [draft, value, format, hourCycle, precision, placeholder]);
|
|
209
281
|
|
|
@@ -215,7 +287,10 @@ export function TimeRangePicker({
|
|
|
215
287
|
type="button"
|
|
216
288
|
disabled={disabled}
|
|
217
289
|
variant={buttonVariant}
|
|
218
|
-
className={cn(
|
|
290
|
+
className={cn(
|
|
291
|
+
'w-[280px] justify-start text-left font-normal',
|
|
292
|
+
!value && 'text-muted-foreground',
|
|
293
|
+
)}
|
|
219
294
|
>
|
|
220
295
|
<Clock className="mr-2 h-4 w-4" />
|
|
221
296
|
{label}
|
|
@@ -226,7 +301,9 @@ export function TimeRangePicker({
|
|
|
226
301
|
<TimeUnitSelector
|
|
227
302
|
label="From"
|
|
228
303
|
value={draft?.from ?? null}
|
|
229
|
-
onChange={(d) =>
|
|
304
|
+
onChange={(d) =>
|
|
305
|
+
setDraft((prev) => ({ ...(prev ?? {}), from: d }))
|
|
306
|
+
}
|
|
230
307
|
hourCycle={hourCycle}
|
|
231
308
|
precision={precision}
|
|
232
309
|
minuteStep={minuteStep}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export { TimePicker } from './TimePicker'
|
|
2
|
-
export { TimeRangePicker } from './TimeRangePicker'
|
|
3
|
-
export default void 0
|
|
1
|
+
export { TimePicker } from './TimePicker';
|
|
2
|
+
export { TimeRangePicker } from './TimeRangePicker';
|
|
3
|
+
export default void 0;
|
|
@@ -63,7 +63,10 @@ function AdminLayoutContent({
|
|
|
63
63
|
// Function to check if menu item is active
|
|
64
64
|
const isMenuItemActive = (itemUrl: string | undefined) => {
|
|
65
65
|
if (!itemUrl) return false;
|
|
66
|
-
return
|
|
66
|
+
return (
|
|
67
|
+
location.pathname === itemUrl ||
|
|
68
|
+
location.pathname.startsWith(`${itemUrl}/`)
|
|
69
|
+
);
|
|
67
70
|
};
|
|
68
71
|
|
|
69
72
|
const setOpen = useCallback((id: string, val?: boolean) => {
|
|
@@ -72,19 +75,26 @@ function AdminLayoutContent({
|
|
|
72
75
|
|
|
73
76
|
const hasActiveDescendant = (item: AdminMenuItem): boolean => {
|
|
74
77
|
if (!item.children || item.children.length === 0) return false;
|
|
75
|
-
return item.children.some(
|
|
78
|
+
return item.children.some(
|
|
79
|
+
(c) => isMenuItemActive(c.url) || hasActiveDescendant(c),
|
|
80
|
+
);
|
|
76
81
|
};
|
|
77
82
|
|
|
78
83
|
const renderItem = (item: AdminMenuItem, level = 0) => {
|
|
79
|
-
const hasChildren =
|
|
84
|
+
const hasChildren =
|
|
85
|
+
Array.isArray(item.children) && item.children.length > 0;
|
|
80
86
|
const isActive = isMenuItemActive(item.url);
|
|
81
|
-
const isOpen =
|
|
87
|
+
const isOpen =
|
|
88
|
+
openMap[item.id] ?? (hasChildren && hasActiveDescendant(item));
|
|
82
89
|
|
|
83
|
-
const indentClassMap = ['','pl-6','pl-10','pl-14'] as const;
|
|
90
|
+
const indentClassMap = ['', 'pl-6', 'pl-10', 'pl-14'] as const;
|
|
84
91
|
const indent = indentClassMap[Math.min(level, 3)];
|
|
85
92
|
|
|
86
93
|
const content = (
|
|
87
|
-
<SidebarMenuItem
|
|
94
|
+
<SidebarMenuItem
|
|
95
|
+
key={item.id}
|
|
96
|
+
className={`mb-1 ${level > 0 ? 'ml-1' : ''}`}
|
|
97
|
+
>
|
|
88
98
|
<SidebarMenuButton
|
|
89
99
|
asChild={!!item.url && !hasChildren}
|
|
90
100
|
isActive={isActive}
|
|
@@ -102,7 +112,11 @@ function AdminLayoutContent({
|
|
|
102
112
|
className={`h-4 w-4 transition-colors ${isActive ? 'text-primary-foreground' : 'text-sidebar-foreground group-hover:text-sidebar-accent-foreground'}`}
|
|
103
113
|
/>
|
|
104
114
|
)}
|
|
105
|
-
<span
|
|
115
|
+
<span
|
|
116
|
+
className={`font-medium transition-colors ${isActive ? 'text-primary-foreground' : 'text-sidebar-foreground group-hover:text-sidebar-accent-foreground'}`}
|
|
117
|
+
>
|
|
118
|
+
{item.title}
|
|
119
|
+
</span>
|
|
106
120
|
{item.badge && (
|
|
107
121
|
<span className="ml-auto text-xs bg-primary/10 text-primary px-2 py-0.5 rounded-full">
|
|
108
122
|
{item.badge}
|
|
@@ -111,13 +125,12 @@ function AdminLayoutContent({
|
|
|
111
125
|
</Link>
|
|
112
126
|
) : (
|
|
113
127
|
<div className="flex items-center gap-3 px-3 py-2.5 w-full">
|
|
114
|
-
{hasChildren &&
|
|
115
|
-
isOpen ? (
|
|
128
|
+
{hasChildren &&
|
|
129
|
+
(isOpen ? (
|
|
116
130
|
<ChevronDown className="h-3.5 w-3.5 text-muted-foreground" />
|
|
117
131
|
) : (
|
|
118
132
|
<ChevronRight className="h-3.5 w-3.5 text-muted-foreground" />
|
|
119
|
-
)
|
|
120
|
-
)}
|
|
133
|
+
))}
|
|
121
134
|
{item.icon ? (
|
|
122
135
|
<item.icon className="h-4 w-4 text-sidebar-foreground group-hover:text-sidebar-accent-foreground" />
|
|
123
136
|
) : (
|
|
@@ -125,10 +138,14 @@ function AdminLayoutContent({
|
|
|
125
138
|
)}
|
|
126
139
|
{item.url ? (
|
|
127
140
|
<Link to={item.url} className="flex-1 text-left">
|
|
128
|
-
<span className="font-medium text-sidebar-foreground group-hover:text-sidebar-accent-foreground">
|
|
141
|
+
<span className="font-medium text-sidebar-foreground group-hover:text-sidebar-accent-foreground">
|
|
142
|
+
{item.title}
|
|
143
|
+
</span>
|
|
129
144
|
</Link>
|
|
130
145
|
) : (
|
|
131
|
-
<span className="font-medium text-sidebar-foreground group-hover:text-sidebar-accent-foreground flex-1">
|
|
146
|
+
<span className="font-medium text-sidebar-foreground group-hover:text-sidebar-accent-foreground flex-1">
|
|
147
|
+
{item.title}
|
|
148
|
+
</span>
|
|
132
149
|
)}
|
|
133
150
|
{item.badge && (
|
|
134
151
|
<span className="ml-auto text-xs bg-primary/10 text-primary px-2 py-0.5 rounded-full">
|
|
@@ -140,7 +157,9 @@ function AdminLayoutContent({
|
|
|
140
157
|
</SidebarMenuButton>
|
|
141
158
|
{hasChildren && isOpen && (
|
|
142
159
|
<div className="mt-1 flex flex-col">
|
|
143
|
-
{(item.children ?? []).map((child: AdminMenuItem) =>
|
|
160
|
+
{(item.children ?? []).map((child: AdminMenuItem) =>
|
|
161
|
+
renderItem(child, Math.min(level + 1, 3)),
|
|
162
|
+
)}
|
|
144
163
|
</div>
|
|
145
164
|
)}
|
|
146
165
|
</SidebarMenuItem>
|
|
@@ -150,8 +169,11 @@ function AdminLayoutContent({
|
|
|
150
169
|
};
|
|
151
170
|
|
|
152
171
|
return (
|
|
153
|
-
|
|
154
|
-
<Sidebar
|
|
172
|
+
<div className="flex min-h-dvh w-full">
|
|
173
|
+
<Sidebar
|
|
174
|
+
className="bg-sidebar border-r border-sidebar-border"
|
|
175
|
+
collapsible={sidebarCollapsible ? 'icon' : 'none'}
|
|
176
|
+
>
|
|
155
177
|
<SidebarHeader className="bg-sidebar border-b border-sidebar-border">
|
|
156
178
|
{sidebarHeader ? (
|
|
157
179
|
sidebarHeader
|
|
@@ -161,7 +183,9 @@ function AdminLayoutContent({
|
|
|
161
183
|
<div className="flex h-8 w-8 items-center justify-center rounded-lg bg-primary text-primary-foreground">
|
|
162
184
|
<SidebarHeaderIcon className="h-4 w-4" />
|
|
163
185
|
</div>
|
|
164
|
-
<span className="font-semibold text-sidebar-foreground">
|
|
186
|
+
<span className="font-semibold text-sidebar-foreground">
|
|
187
|
+
{sidebarTitle}
|
|
188
|
+
</span>
|
|
165
189
|
</div>
|
|
166
190
|
</div>
|
|
167
191
|
)}
|
|
@@ -170,7 +194,9 @@ function AdminLayoutContent({
|
|
|
170
194
|
{sidebarGroups.map((group, idx) => (
|
|
171
195
|
<Fragment key={group.id}>
|
|
172
196
|
<SidebarGroup>
|
|
173
|
-
<SidebarGroupLabel className="text-xs font-semibold text-muted-foreground uppercase tracking-wider px-3 mb-2 group-data-[collapsible=icon]:hidden">
|
|
197
|
+
<SidebarGroupLabel className="text-xs font-semibold text-muted-foreground uppercase tracking-wider px-3 mb-2 group-data-[collapsible=icon]:hidden">
|
|
198
|
+
{group.label}
|
|
199
|
+
</SidebarGroupLabel>
|
|
174
200
|
<SidebarGroupContent>
|
|
175
201
|
<SidebarMenu className="group-data-[collapsible=icon]:items-center">
|
|
176
202
|
{group.items.map((item) => renderItem(item, 0))}
|
|
@@ -178,7 +204,10 @@ function AdminLayoutContent({
|
|
|
178
204
|
</SidebarGroupContent>
|
|
179
205
|
</SidebarGroup>
|
|
180
206
|
{idx < sidebarGroups.length - 1 && (
|
|
181
|
-
<Separator
|
|
207
|
+
<Separator
|
|
208
|
+
orientation="horizontal"
|
|
209
|
+
className="bg-sidebar-border group-data-[collapsible=icon]:hidden"
|
|
210
|
+
/>
|
|
182
211
|
)}
|
|
183
212
|
</Fragment>
|
|
184
213
|
))}
|
|
@@ -192,7 +221,9 @@ function AdminLayoutContent({
|
|
|
192
221
|
>
|
|
193
222
|
<div className="flex items-center gap-3 px-3 py-2.5 group-data-[collapsible=icon]:w-full group-data-[collapsible=icon]:items-center group-data-[collapsible=icon]:!justify-center group-data-[collapsible=icon]:!gap-0 group-data-[collapsible=icon]:!px-0">
|
|
194
223
|
<LogOut className="h-4 w-4 text-sidebar-foreground group-hover:text-sidebar-accent-foreground group-data-[collapsible=icon]:mx-auto group-data-[collapsible=icon]:mr-0" />
|
|
195
|
-
<span className="font-medium text-sidebar-foreground group-hover:text-sidebar-accent-foreground group-data-[collapsible=icon]:hidden">
|
|
224
|
+
<span className="font-medium text-sidebar-foreground group-hover:text-sidebar-accent-foreground group-data-[collapsible=icon]:hidden">
|
|
225
|
+
Logout
|
|
226
|
+
</span>
|
|
196
227
|
</div>
|
|
197
228
|
</SidebarMenuButton>
|
|
198
229
|
</SidebarMenuItem>
|
|
@@ -212,11 +243,9 @@ function AdminLayoutContent({
|
|
|
212
243
|
{headerAfterTheme}
|
|
213
244
|
</div>
|
|
214
245
|
</header>
|
|
215
|
-
<main className="flex flex-1 flex-col gap-4 p-4">
|
|
216
|
-
{children}
|
|
217
|
-
</main>
|
|
246
|
+
<main className="flex flex-1 flex-col gap-4 p-4">{children}</main>
|
|
218
247
|
</SidebarInset>
|
|
219
|
-
|
|
248
|
+
</div>
|
|
220
249
|
);
|
|
221
250
|
}
|
|
222
251
|
|
|
@@ -40,19 +40,13 @@ export default function ThemeToggle({ className }: ThemeToggleProps) {
|
|
|
40
40
|
<DropdownMenuLabel>Theme</DropdownMenuLabel>
|
|
41
41
|
<DropdownMenuSeparator />
|
|
42
42
|
<DropdownMenuItem onClick={() => setTheme('light')}>
|
|
43
|
-
<Sun className="mr-2 h-4 w-4" />
|
|
44
|
-
{' '}
|
|
45
|
-
Light
|
|
43
|
+
<Sun className="mr-2 h-4 w-4" /> Light
|
|
46
44
|
</DropdownMenuItem>
|
|
47
45
|
<DropdownMenuItem onClick={() => setTheme('dark')}>
|
|
48
|
-
<Moon className="mr-2 h-4 w-4" />
|
|
49
|
-
{' '}
|
|
50
|
-
Dark
|
|
46
|
+
<Moon className="mr-2 h-4 w-4" /> Dark
|
|
51
47
|
</DropdownMenuItem>
|
|
52
48
|
<DropdownMenuItem onClick={() => setTheme('system')}>
|
|
53
|
-
<Laptop className="mr-2 h-4 w-4" />
|
|
54
|
-
{' '}
|
|
55
|
-
System
|
|
49
|
+
<Laptop className="mr-2 h-4 w-4" /> System
|
|
56
50
|
</DropdownMenuItem>
|
|
57
51
|
</DropdownMenuContent>
|
|
58
52
|
</DropdownMenu>
|
|
@@ -1,7 +1,10 @@
|
|
|
1
|
-
import React
|
|
2
|
-
import {
|
|
1
|
+
import type React from 'react';
|
|
2
|
+
import { createContext, useContext } from 'react';
|
|
3
|
+
import type { AdminMenuContextValue, AdminMenuGroup } from '../types';
|
|
3
4
|
|
|
4
|
-
export const AdminMenuContext = createContext<AdminMenuContextValue | null>(
|
|
5
|
+
export const AdminMenuContext = createContext<AdminMenuContextValue | null>(
|
|
6
|
+
null,
|
|
7
|
+
);
|
|
5
8
|
|
|
6
9
|
export function useAdminSidebarMenu() {
|
|
7
10
|
const ctx = useContext(AdminMenuContext);
|
|
@@ -11,7 +14,9 @@ export function useAdminSidebarMenu() {
|
|
|
11
14
|
const noop = () => {};
|
|
12
15
|
return {
|
|
13
16
|
groups: [] as AdminMenuGroup[],
|
|
14
|
-
setGroups: noop as unknown as React.Dispatch<
|
|
17
|
+
setGroups: noop as unknown as React.Dispatch<
|
|
18
|
+
React.SetStateAction<AdminMenuGroup[]>
|
|
19
|
+
>,
|
|
15
20
|
registerGroup: noop as AdminMenuContextValue['registerGroup'],
|
|
16
21
|
registerItem: noop as AdminMenuContextValue['registerItem'],
|
|
17
22
|
clear: noop,
|
|
@@ -21,6 +26,7 @@ export function useAdminSidebarMenu() {
|
|
|
21
26
|
}
|
|
22
27
|
|
|
23
28
|
export function useAdminSidebarMenuRegistration() {
|
|
24
|
-
const { setGroups, registerGroup, registerItem, clear } =
|
|
29
|
+
const { setGroups, registerGroup, registerItem, clear } =
|
|
30
|
+
useAdminSidebarMenu();
|
|
25
31
|
return { setGroups, registerGroup, registerItem, clear };
|
|
26
32
|
}
|
|
@@ -1,48 +1,61 @@
|
|
|
1
|
-
import { useState, useCallback, useMemo } from
|
|
2
|
-
import { AdminMenuGroup, AdminMenuContextValue } from
|
|
3
|
-
import { AdminMenuContext } from
|
|
1
|
+
import { useState, useCallback, useMemo } from 'react';
|
|
2
|
+
import type { AdminMenuGroup, AdminMenuContextValue } from '../types';
|
|
3
|
+
import { AdminMenuContext } from '../hooks/menu';
|
|
4
4
|
|
|
5
5
|
export type AdminMenuProviderProps = {
|
|
6
6
|
initialGroups?: AdminMenuGroup[];
|
|
7
7
|
children: React.ReactNode;
|
|
8
8
|
};
|
|
9
9
|
|
|
10
|
-
export function AdminMenuProvider({
|
|
10
|
+
export function AdminMenuProvider({
|
|
11
|
+
initialGroups = [],
|
|
12
|
+
children,
|
|
13
|
+
}: AdminMenuProviderProps) {
|
|
11
14
|
const [groups, setGroups] = useState<AdminMenuGroup[]>(initialGroups);
|
|
12
15
|
|
|
13
|
-
const registerGroup = useCallback<AdminMenuContextValue['registerGroup']>(
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
16
|
+
const registerGroup = useCallback<AdminMenuContextValue['registerGroup']>(
|
|
17
|
+
(group) => {
|
|
18
|
+
setGroups((prev) => {
|
|
19
|
+
if (process.env.NODE_ENV !== 'production') {
|
|
20
|
+
// eslint-disable-next-line no-console
|
|
21
|
+
console.log('[AdminMenuProvider] registerGroup', group);
|
|
22
|
+
}
|
|
23
|
+
const exists = prev.some((g) => g.id === group.id);
|
|
24
|
+
if (exists) return prev;
|
|
25
|
+
return [
|
|
26
|
+
...prev,
|
|
27
|
+
{ id: group.id, label: group.label, items: group.items ?? [] },
|
|
28
|
+
];
|
|
29
|
+
});
|
|
30
|
+
},
|
|
31
|
+
[],
|
|
32
|
+
);
|
|
24
33
|
|
|
25
|
-
const registerItem = useCallback<AdminMenuContextValue['registerItem']>(
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
34
|
+
const registerItem = useCallback<AdminMenuContextValue['registerItem']>(
|
|
35
|
+
(groupId, item) => {
|
|
36
|
+
setGroups((prev) => {
|
|
37
|
+
if (process.env.NODE_ENV !== 'production') {
|
|
38
|
+
// eslint-disable-next-line no-console
|
|
39
|
+
console.log('[AdminMenuProvider] registerItem', groupId, item);
|
|
40
|
+
}
|
|
41
|
+
// if group exists, append or replace item by id
|
|
42
|
+
const idx = prev.findIndex((g) => g.id === groupId);
|
|
43
|
+
if (idx >= 0) {
|
|
44
|
+
const group = prev[idx];
|
|
45
|
+
const items = [...group.items];
|
|
46
|
+
const existingIdx = items.findIndex((it) => it.id === item.id);
|
|
47
|
+
if (existingIdx >= 0) items[existingIdx] = item;
|
|
48
|
+
else items.push(item);
|
|
49
|
+
const next = [...prev];
|
|
50
|
+
next[idx] = { ...group, items };
|
|
51
|
+
return next;
|
|
52
|
+
}
|
|
53
|
+
// create group if missing
|
|
54
|
+
return [...prev, { id: groupId, label: groupId, items: [item] }];
|
|
55
|
+
});
|
|
56
|
+
},
|
|
57
|
+
[],
|
|
58
|
+
);
|
|
46
59
|
|
|
47
60
|
const clear = useCallback(() => {
|
|
48
61
|
if (process.env.NODE_ENV !== 'production') {
|
|
@@ -52,7 +65,14 @@ export function AdminMenuProvider({ initialGroups = [], children }: AdminMenuPro
|
|
|
52
65
|
setGroups([]);
|
|
53
66
|
}, []);
|
|
54
67
|
|
|
55
|
-
const value = useMemo<AdminMenuContextValue>(
|
|
68
|
+
const value = useMemo<AdminMenuContextValue>(
|
|
69
|
+
() => ({ groups, setGroups, registerGroup, registerItem, clear }),
|
|
70
|
+
[groups, registerGroup, registerItem, clear],
|
|
71
|
+
);
|
|
56
72
|
|
|
57
|
-
return
|
|
58
|
-
}
|
|
73
|
+
return (
|
|
74
|
+
<AdminMenuContext.Provider value={value}>
|
|
75
|
+
{children}
|
|
76
|
+
</AdminMenuContext.Provider>
|
|
77
|
+
);
|
|
78
|
+
}
|
|
@@ -19,7 +19,7 @@ export type AdminMenuContextValue = {
|
|
|
19
19
|
groups: AdminMenuGroup[];
|
|
20
20
|
setGroups: React.Dispatch<React.SetStateAction<AdminMenuGroup[]>>;
|
|
21
21
|
registerGroup: (
|
|
22
|
-
group: Omit<AdminMenuGroup, 'items'> & { items?: AdminMenuItem[] }
|
|
22
|
+
group: Omit<AdminMenuGroup, 'items'> & { items?: AdminMenuItem[] },
|
|
23
23
|
) => void;
|
|
24
24
|
registerItem: (groupId: string, item: AdminMenuItem) => void;
|
|
25
25
|
clear: () => void;
|
package/src/kit/themes/base.css
CHANGED