@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
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export * from
|
|
2
|
-
export { default as FileUploader } from
|
|
3
|
-
export { FileUploader as default } from
|
|
1
|
+
export * from './types';
|
|
2
|
+
export { default as FileUploader } from './FileUploader';
|
|
3
|
+
export { FileUploader as default } from './FileUploader';
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import type { Accept } from
|
|
1
|
+
import type { Accept } from 'react-dropzone';
|
|
2
2
|
|
|
3
|
-
export type FileUploadStatus =
|
|
3
|
+
export type FileUploadStatus = 'idle' | 'uploading' | 'success' | 'error';
|
|
4
4
|
|
|
5
5
|
export type FileRecord = {
|
|
6
6
|
id?: string | number;
|
|
@@ -22,7 +22,7 @@ export type FileRecord = {
|
|
|
22
22
|
meta?: Record<string, unknown>;
|
|
23
23
|
};
|
|
24
24
|
|
|
25
|
-
export type FileUploaderLayout =
|
|
25
|
+
export type FileUploaderLayout = 'grid' | 'list';
|
|
26
26
|
|
|
27
27
|
export type FileUploaderProps = {
|
|
28
28
|
/** Controlled value of files */
|
|
@@ -22,7 +22,7 @@ const ignoredKeys = new Set(['message', 'type', 'types', 'ref']);
|
|
|
22
22
|
|
|
23
23
|
function collectMessages(
|
|
24
24
|
errors: FieldErrors<FieldValues> | undefined,
|
|
25
|
-
parentPath: string[] = []
|
|
25
|
+
parentPath: string[] = [],
|
|
26
26
|
): ErrorMessage[] {
|
|
27
27
|
if (!errors) return [];
|
|
28
28
|
|
|
@@ -35,9 +35,10 @@ function collectMessages(
|
|
|
35
35
|
for (const [key, value] of entries) {
|
|
36
36
|
if (!value) continue;
|
|
37
37
|
|
|
38
|
-
const currentPath =
|
|
39
|
-
|
|
40
|
-
|
|
38
|
+
const currentPath =
|
|
39
|
+
typeof key === 'string' && key === 'root'
|
|
40
|
+
? parentPath
|
|
41
|
+
: [...parentPath, String(key)];
|
|
41
42
|
|
|
42
43
|
if (typeof value === 'object') {
|
|
43
44
|
if ('message' in value && value.message) {
|
|
@@ -63,12 +64,15 @@ function collectMessages(
|
|
|
63
64
|
: Object.entries(value);
|
|
64
65
|
|
|
65
66
|
const nestedEntries = source.filter(
|
|
66
|
-
([nestedKey]) => !ignoredKeys.has(nestedKey)
|
|
67
|
+
([nestedKey]) => !ignoredKeys.has(nestedKey),
|
|
67
68
|
);
|
|
68
69
|
|
|
69
70
|
if (nestedEntries.length > 0) {
|
|
70
|
-
const nested: Record<string, unknown> =
|
|
71
|
-
|
|
71
|
+
const nested: Record<string, unknown> =
|
|
72
|
+
Object.fromEntries(nestedEntries);
|
|
73
|
+
messages.push(
|
|
74
|
+
...collectMessages(nested as FieldErrors<FieldValues>, currentPath),
|
|
75
|
+
);
|
|
72
76
|
}
|
|
73
77
|
}
|
|
74
78
|
}
|
|
@@ -84,12 +88,22 @@ export function FormInfoError<TFieldValues extends FieldValues = FieldValues>({
|
|
|
84
88
|
className,
|
|
85
89
|
showFieldPath = true,
|
|
86
90
|
}: FormInfoErrorProps<TFieldValues>) {
|
|
87
|
-
const messages = collectMessages(
|
|
91
|
+
const messages = collectMessages(
|
|
92
|
+
errors as FieldErrors<FieldValues> | undefined,
|
|
93
|
+
);
|
|
88
94
|
|
|
89
95
|
if (messages.length === 0) {
|
|
90
96
|
return null;
|
|
91
97
|
}
|
|
92
98
|
|
|
99
|
+
const keyOccurrences = new Map<string, number>();
|
|
100
|
+
const getMessageKey = (path: string, message: string) => {
|
|
101
|
+
const baseKey = [path, message].filter(Boolean).join(':') || message;
|
|
102
|
+
const occurrence = keyOccurrences.get(baseKey) ?? 0;
|
|
103
|
+
keyOccurrences.set(baseKey, occurrence + 1);
|
|
104
|
+
return occurrence === 0 ? baseKey : `${baseKey}:${occurrence}`;
|
|
105
|
+
};
|
|
106
|
+
|
|
93
107
|
return (
|
|
94
108
|
<Alert variant="destructive" className={cn('gap-2', className)}>
|
|
95
109
|
<AlertCircle className="mt-1" />
|
|
@@ -99,12 +113,13 @@ export function FormInfoError<TFieldValues extends FieldValues = FieldValues>({
|
|
|
99
113
|
{title ?? 'Please review the following issues'}
|
|
100
114
|
</AlertTitle>
|
|
101
115
|
<AlertDescription>
|
|
102
|
-
{description ??
|
|
116
|
+
{description ??
|
|
117
|
+
'Some fields need your attention before continuing.'}
|
|
103
118
|
</AlertDescription>
|
|
104
119
|
</div>
|
|
105
120
|
<ul className="grid gap-1 text-sm text-destructive">
|
|
106
|
-
{messages.map(({ path, message }
|
|
107
|
-
<li key={
|
|
121
|
+
{messages.map(({ path, message }) => (
|
|
122
|
+
<li key={getMessageKey(path, message)} className="leading-snug">
|
|
108
123
|
{showFieldPath && path ? (
|
|
109
124
|
<span className="font-medium">{path}: </span>
|
|
110
125
|
) : null}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import * as React from 'react';
|
|
1
|
+
import type * as React from 'react';
|
|
2
2
|
|
|
3
3
|
export type LoginProps = {
|
|
4
4
|
// Application title shown above the form (e.g., "Acme Inc")
|
|
@@ -50,13 +50,19 @@ export function Login({
|
|
|
50
50
|
children,
|
|
51
51
|
}: LoginProps) {
|
|
52
52
|
return (
|
|
53
|
-
<div
|
|
53
|
+
<div
|
|
54
|
+
className={['grid min-h-dvh grid-cols-1 md:grid-cols-2', className]
|
|
55
|
+
.filter(Boolean)
|
|
56
|
+
.join(' ')}
|
|
57
|
+
>
|
|
54
58
|
{/* Left column: form section */}
|
|
55
59
|
<div className="flex items-center justify-center p-6 md:p-10">
|
|
56
60
|
<div className="w-full max-w-md">
|
|
57
61
|
{/* Title */}
|
|
58
62
|
<div className="mb-6 text-center">
|
|
59
|
-
<h1 className="text-2xl font-bold leading-tight tracking-tight">
|
|
63
|
+
<h1 className="text-2xl font-bold leading-tight tracking-tight">
|
|
64
|
+
{appTitle}
|
|
65
|
+
</h1>
|
|
60
66
|
{subtitle ? (
|
|
61
67
|
<p className="text-muted-foreground mt-1 text-sm">{subtitle}</p>
|
|
62
68
|
) : null}
|
|
@@ -70,7 +76,10 @@ export function Login({
|
|
|
70
76
|
{forgotPasswordHref ? (
|
|
71
77
|
<div className="text-center text-sm">
|
|
72
78
|
{forgotPasswordLabel}{' '}
|
|
73
|
-
<a
|
|
79
|
+
<a
|
|
80
|
+
href={forgotPasswordHref}
|
|
81
|
+
className="underline underline-offset-4"
|
|
82
|
+
>
|
|
74
83
|
{forgotPasswordLinkLabel}
|
|
75
84
|
</a>
|
|
76
85
|
</div>
|
|
@@ -4,10 +4,15 @@ import * as React from 'react';
|
|
|
4
4
|
import { Calendar as CalendarIcon } 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 { MonthPicker } from './MonthPicker';
|
|
9
13
|
|
|
10
|
-
export interface MonthInputProps
|
|
14
|
+
export interface MonthInputProps
|
|
15
|
+
extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'> {
|
|
11
16
|
value?: Date | null;
|
|
12
17
|
onChange?: (date: Date | null) => void;
|
|
13
18
|
placeholder?: string;
|
|
@@ -42,7 +47,8 @@ export function MonthInput({
|
|
|
42
47
|
}: MonthInputProps) {
|
|
43
48
|
const [internalOpen, setInternalOpen] = React.useState(false);
|
|
44
49
|
const isOpen = typeof props.open === 'boolean' ? props.open : internalOpen;
|
|
45
|
-
const setOpen = (o: boolean) =>
|
|
50
|
+
const setOpen = (o: boolean) =>
|
|
51
|
+
props.onOpenChange ? props.onOpenChange(o) : setInternalOpen(o);
|
|
46
52
|
const [draft, setDraft] = React.useState<Date | null>(value ?? null);
|
|
47
53
|
|
|
48
54
|
React.useEffect(() => {
|
|
@@ -66,7 +72,10 @@ export function MonthInput({
|
|
|
66
72
|
type="button"
|
|
67
73
|
disabled={disabled}
|
|
68
74
|
variant={buttonVariant}
|
|
69
|
-
className={cn(
|
|
75
|
+
className={cn(
|
|
76
|
+
'w-[240px] justify-start text-left font-normal',
|
|
77
|
+
!value && 'text-muted-foreground',
|
|
78
|
+
)}
|
|
70
79
|
>
|
|
71
80
|
<CalendarIcon className="mr-2 h-4 w-4" />
|
|
72
81
|
{label}
|
|
@@ -107,10 +107,10 @@ function MonthCal({
|
|
|
107
107
|
onYearForward,
|
|
108
108
|
}: MonthCalProps) {
|
|
109
109
|
const [year, setYear] = React.useState<number>(
|
|
110
|
-
selectedMonth?.getFullYear() ?? new Date().getFullYear()
|
|
110
|
+
selectedMonth?.getFullYear() ?? new Date().getFullYear(),
|
|
111
111
|
);
|
|
112
112
|
const [month, setMonth] = React.useState<number>(
|
|
113
|
-
selectedMonth?.getMonth() ?? new Date().getMonth()
|
|
113
|
+
selectedMonth?.getMonth() ?? new Date().getMonth(),
|
|
114
114
|
);
|
|
115
115
|
const [menuYear, setMenuYear] = React.useState<number>(year);
|
|
116
116
|
|
|
@@ -135,7 +135,7 @@ function MonthCal({
|
|
|
135
135
|
}}
|
|
136
136
|
className={cn(
|
|
137
137
|
buttonVariants({ variant: variant?.chevrons ?? 'outline' }),
|
|
138
|
-
'inline-flex items-center justify-center h-7 w-7 p-0 absolute left-1'
|
|
138
|
+
'inline-flex items-center justify-center h-7 w-7 p-0 absolute left-1',
|
|
139
139
|
)}
|
|
140
140
|
>
|
|
141
141
|
<ChevronLeft className="opacity-50 h-4 w-4" />
|
|
@@ -148,7 +148,7 @@ function MonthCal({
|
|
|
148
148
|
}}
|
|
149
149
|
className={cn(
|
|
150
150
|
buttonVariants({ variant: variant?.chevrons ?? 'outline' }),
|
|
151
|
-
'inline-flex items-center justify-center h-7 w-7 p-0 absolute right-1'
|
|
151
|
+
'inline-flex items-center justify-center h-7 w-7 p-0 absolute right-1',
|
|
152
152
|
)}
|
|
153
153
|
>
|
|
154
154
|
<ChevronRight className="opacity-50 h-4 w-4" />
|
|
@@ -157,10 +157,10 @@ function MonthCal({
|
|
|
157
157
|
</div>
|
|
158
158
|
<table className="w-full border-collapse space-y-1">
|
|
159
159
|
<tbody>
|
|
160
|
-
{MONTHS.map((monthRow
|
|
160
|
+
{MONTHS.map((monthRow) => {
|
|
161
|
+
const rowKey = monthRow.map((month) => month.number).join('-');
|
|
161
162
|
return (
|
|
162
|
-
|
|
163
|
-
<tr key={`row-${a}`} className="flex w-full mt-2">
|
|
163
|
+
<tr key={rowKey} className="flex w-full mt-2">
|
|
164
164
|
{monthRow.map((m) => {
|
|
165
165
|
return (
|
|
166
166
|
<td
|
|
@@ -188,7 +188,8 @@ function MonthCal({
|
|
|
188
188
|
: false) ||
|
|
189
189
|
(disabledDatesMapped
|
|
190
190
|
? disabledDatesMapped?.some(
|
|
191
|
-
(d) =>
|
|
191
|
+
(d) =>
|
|
192
|
+
d.year === menuYear && d.month === m.number,
|
|
192
193
|
)
|
|
193
194
|
: false)
|
|
194
195
|
}
|
|
@@ -196,10 +197,10 @@ function MonthCal({
|
|
|
196
197
|
buttonVariants({
|
|
197
198
|
variant:
|
|
198
199
|
month === m.number && menuYear === year
|
|
199
|
-
? variant?.calendar?.selected ?? 'default'
|
|
200
|
-
: variant?.calendar?.main ?? 'ghost',
|
|
200
|
+
? (variant?.calendar?.selected ?? 'default')
|
|
201
|
+
: (variant?.calendar?.main ?? 'ghost'),
|
|
201
202
|
}),
|
|
202
|
-
'h-full w-full p-0 font-normal aria-selected:opacity-100'
|
|
203
|
+
'h-full w-full p-0 font-normal aria-selected:opacity-100',
|
|
203
204
|
)}
|
|
204
205
|
>
|
|
205
206
|
{callbacks?.monthLabel
|
|
@@ -4,10 +4,15 @@ import * as React from 'react';
|
|
|
4
4
|
import { Calendar as CalendarIcon } 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 { MonthRangePicker } from './MonthRangePicker';
|
|
9
13
|
|
|
10
|
-
export interface MonthRangeInputProps
|
|
14
|
+
export interface MonthRangeInputProps
|
|
15
|
+
extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'> {
|
|
11
16
|
value?: { start?: Date | null; end?: Date | null } | null;
|
|
12
17
|
onChange?: (range: { start?: Date | null; end?: Date | null } | null) => void;
|
|
13
18
|
placeholder?: string;
|
|
@@ -44,8 +49,12 @@ export function MonthRangeInput({
|
|
|
44
49
|
}: MonthRangeInputProps) {
|
|
45
50
|
const [internalOpen, setInternalOpen] = React.useState(false);
|
|
46
51
|
const isOpen = typeof props.open === 'boolean' ? props.open : internalOpen;
|
|
47
|
-
const setOpen = (o: boolean) =>
|
|
48
|
-
|
|
52
|
+
const setOpen = (o: boolean) =>
|
|
53
|
+
props.onOpenChange ? props.onOpenChange(o) : setInternalOpen(o);
|
|
54
|
+
const [draft, setDraft] = React.useState<{
|
|
55
|
+
start?: Date | null;
|
|
56
|
+
end?: Date | null;
|
|
57
|
+
} | null>(value ?? null);
|
|
49
58
|
|
|
50
59
|
React.useEffect(() => {
|
|
51
60
|
if (isOpen) {
|
|
@@ -58,7 +67,8 @@ export function MonthRangeInput({
|
|
|
58
67
|
const e = value?.end ?? null;
|
|
59
68
|
if (format) return format(s, e);
|
|
60
69
|
if (s && e) {
|
|
61
|
-
const fmt = (d: Date) =>
|
|
70
|
+
const fmt = (d: Date) =>
|
|
71
|
+
d.toLocaleDateString(undefined, { year: 'numeric', month: 'short' });
|
|
62
72
|
return `${fmt(s)} – ${fmt(e)}`;
|
|
63
73
|
}
|
|
64
74
|
return placeholder;
|
|
@@ -72,15 +82,26 @@ export function MonthRangeInput({
|
|
|
72
82
|
type="button"
|
|
73
83
|
disabled={disabled}
|
|
74
84
|
variant={buttonVariant}
|
|
75
|
-
className={cn(
|
|
85
|
+
className={cn(
|
|
86
|
+
'w-[280px] justify-start text-left font-normal',
|
|
87
|
+
!value && 'text-muted-foreground',
|
|
88
|
+
)}
|
|
76
89
|
>
|
|
77
90
|
<CalendarIcon className="mr-2 h-4 w-4" />
|
|
78
91
|
{label}
|
|
79
92
|
</Button>
|
|
80
93
|
</PopoverTrigger>
|
|
81
|
-
<PopoverContent
|
|
94
|
+
<PopoverContent
|
|
95
|
+
className="p-2 w-auto max-w-none"
|
|
96
|
+
align="start"
|
|
97
|
+
side={popoverSide}
|
|
98
|
+
>
|
|
82
99
|
<MonthRangePicker
|
|
83
|
-
selectedMonthRange={
|
|
100
|
+
selectedMonthRange={
|
|
101
|
+
draft?.start && draft?.end
|
|
102
|
+
? { start: draft.start, end: draft.end }
|
|
103
|
+
: undefined
|
|
104
|
+
}
|
|
84
105
|
onStartMonthSelect={(d) => {
|
|
85
106
|
if (disabled) return;
|
|
86
107
|
setDraft({ start: d, end: d });
|
|
@@ -11,8 +11,8 @@ const addMonths = (input: Date, months: number) => {
|
|
|
11
11
|
date.setDate(
|
|
12
12
|
Math.min(
|
|
13
13
|
input.getDate(),
|
|
14
|
-
getDaysInMonth(date.getFullYear(), date.getMonth() + 1)
|
|
15
|
-
)
|
|
14
|
+
getDaysInMonth(date.getFullYear(), date.getMonth() + 1),
|
|
15
|
+
),
|
|
16
16
|
);
|
|
17
17
|
return date;
|
|
18
18
|
};
|
|
@@ -174,16 +174,16 @@ function MonthRangeCal({
|
|
|
174
174
|
onYearForward,
|
|
175
175
|
}: MonthRangeCalProps) {
|
|
176
176
|
const [startYear, setStartYear] = React.useState<number>(
|
|
177
|
-
selectedMonthRange?.start.getFullYear() ?? new Date().getFullYear()
|
|
177
|
+
selectedMonthRange?.start.getFullYear() ?? new Date().getFullYear(),
|
|
178
178
|
);
|
|
179
179
|
const [startMonth, setStartMonth] = React.useState<number>(
|
|
180
|
-
selectedMonthRange?.start?.getMonth() ?? new Date().getMonth()
|
|
180
|
+
selectedMonthRange?.start?.getMonth() ?? new Date().getMonth(),
|
|
181
181
|
);
|
|
182
182
|
const [endYear, setEndYear] = React.useState<number>(
|
|
183
|
-
selectedMonthRange?.end?.getFullYear() ?? new Date().getFullYear() + 1
|
|
183
|
+
selectedMonthRange?.end?.getFullYear() ?? new Date().getFullYear() + 1,
|
|
184
184
|
);
|
|
185
185
|
const [endMonth, setEndMonth] = React.useState<number>(
|
|
186
|
-
selectedMonthRange?.end?.getMonth() ?? new Date().getMonth()
|
|
186
|
+
selectedMonthRange?.end?.getMonth() ?? new Date().getMonth(),
|
|
187
187
|
);
|
|
188
188
|
const [rangePending, setRangePending] = React.useState<boolean>(false);
|
|
189
189
|
const [endLocked, setEndLocked] = React.useState<boolean>(true);
|
|
@@ -207,7 +207,7 @@ function MonthRangeCal({
|
|
|
207
207
|
}}
|
|
208
208
|
className={cn(
|
|
209
209
|
buttonVariants({ variant: variant?.chevrons ?? 'outline' }),
|
|
210
|
-
'inline-flex items-center justify-center h-7 w-7 p-0 absolute left-1'
|
|
210
|
+
'inline-flex items-center justify-center h-7 w-7 p-0 absolute left-1',
|
|
211
211
|
)}
|
|
212
212
|
>
|
|
213
213
|
<ChevronLeft className="opacity-50 h-4 w-4" />
|
|
@@ -220,7 +220,7 @@ function MonthRangeCal({
|
|
|
220
220
|
}}
|
|
221
221
|
className={cn(
|
|
222
222
|
buttonVariants({ variant: variant?.chevrons ?? 'outline' }),
|
|
223
|
-
'inline-flex items-center justify-center h-7 w-7 p-0 absolute right-1'
|
|
223
|
+
'inline-flex items-center justify-center h-7 w-7 p-0 absolute right-1',
|
|
224
224
|
)}
|
|
225
225
|
>
|
|
226
226
|
<ChevronRight className="opacity-50 h-4 w-4" />
|
|
@@ -234,10 +234,12 @@ function MonthRangeCal({
|
|
|
234
234
|
</div>
|
|
235
235
|
<table className="w-full border-collapse space-y-1">
|
|
236
236
|
<tbody>
|
|
237
|
-
{MONTHS.map((monthRow
|
|
237
|
+
{MONTHS.map((monthRow) => {
|
|
238
|
+
const rowKey = monthRow
|
|
239
|
+
.map((month) => `${month.yearOffset}-${month.number}`)
|
|
240
|
+
.join('-');
|
|
238
241
|
return (
|
|
239
|
-
|
|
240
|
-
<tr key={`row-${a}`} className="flex w-full mt-2">
|
|
242
|
+
<tr key={rowKey} className="flex w-full mt-2">
|
|
241
243
|
{monthRow.map((m, i) => {
|
|
242
244
|
return (
|
|
243
245
|
<td
|
|
@@ -255,13 +257,13 @@ function MonthRangeCal({
|
|
|
255
257
|
m.number < endMonth)) &&
|
|
256
258
|
(rangePending || endLocked)
|
|
257
259
|
? 'text-accent-foreground bg-accent'
|
|
258
|
-
: ''
|
|
260
|
+
: '',
|
|
259
261
|
),
|
|
260
262
|
menuYear + m.yearOffset === startYear &&
|
|
261
263
|
m.number === startMonth &&
|
|
262
264
|
(rangePending || endLocked)
|
|
263
265
|
? 'text-accent-foreground bg-accent rounded-l-md'
|
|
264
|
-
: ''
|
|
266
|
+
: '',
|
|
265
267
|
),
|
|
266
268
|
menuYear + m.yearOffset === endYear &&
|
|
267
269
|
m.number === endMonth &&
|
|
@@ -269,9 +271,9 @@ function MonthRangeCal({
|
|
|
269
271
|
menuYear + m.yearOffset >= startYear &&
|
|
270
272
|
m.number >= startMonth
|
|
271
273
|
? 'text-accent-foreground bg-accent rounded-r-md'
|
|
272
|
-
: ''
|
|
274
|
+
: '',
|
|
273
275
|
),
|
|
274
|
-
i === 3 ? 'mr-2' : i === 4 ? 'ml-2' : ''
|
|
276
|
+
i === 3 ? 'mr-2' : i === 4 ? 'ml-2' : '',
|
|
275
277
|
)}
|
|
276
278
|
onMouseEnter={() => {
|
|
277
279
|
if (rangePending && !endLocked) {
|
|
@@ -297,7 +299,7 @@ function MonthRangeCal({
|
|
|
297
299
|
setEndMonth(m.number);
|
|
298
300
|
if (onStartMonthSelect)
|
|
299
301
|
onStartMonthSelect(
|
|
300
|
-
new Date(menuYear + m.yearOffset, m.number)
|
|
302
|
+
new Date(menuYear + m.yearOffset, m.number),
|
|
301
303
|
);
|
|
302
304
|
} else {
|
|
303
305
|
setRangePending(false);
|
|
@@ -309,7 +311,7 @@ function MonthRangeCal({
|
|
|
309
311
|
start: new Date(startYear, startMonth),
|
|
310
312
|
end: new Date(
|
|
311
313
|
menuYear + m.yearOffset,
|
|
312
|
-
m.number
|
|
314
|
+
m.number,
|
|
313
315
|
),
|
|
314
316
|
});
|
|
315
317
|
}
|
|
@@ -322,7 +324,7 @@ function MonthRangeCal({
|
|
|
322
324
|
setEndMonth(m.number);
|
|
323
325
|
if (onStartMonthSelect)
|
|
324
326
|
onStartMonthSelect(
|
|
325
|
-
new Date(menuYear + m.yearOffset, m.number)
|
|
327
|
+
new Date(menuYear + m.yearOffset, m.number),
|
|
326
328
|
);
|
|
327
329
|
}
|
|
328
330
|
}}
|
|
@@ -350,10 +352,10 @@ function MonthRangeCal({
|
|
|
350
352
|
(endMonth === m.number &&
|
|
351
353
|
menuYear + m.yearOffset === endYear &&
|
|
352
354
|
!rangePending)
|
|
353
|
-
? variant?.calendar?.selected ?? 'default'
|
|
354
|
-
: variant?.calendar?.main ?? 'ghost',
|
|
355
|
+
? (variant?.calendar?.selected ?? 'default')
|
|
356
|
+
: (variant?.calendar?.main ?? 'ghost'),
|
|
355
357
|
}),
|
|
356
|
-
'h-full w-full p-0 font-normal aria-selected:opacity-100'
|
|
358
|
+
'h-full w-full p-0 font-normal aria-selected:opacity-100',
|
|
357
359
|
)}
|
|
358
360
|
>
|
|
359
361
|
{callbacks?.monthLabel
|
|
@@ -85,7 +85,7 @@ export function TimePicker({
|
|
|
85
85
|
|
|
86
86
|
const setDraftPart = (
|
|
87
87
|
part: 'hour' | 'minute' | 'second' | 'period',
|
|
88
|
-
val: number | 'AM' | 'PM'
|
|
88
|
+
val: number | 'AM' | 'PM',
|
|
89
89
|
) => {
|
|
90
90
|
setDraft((prev) => {
|
|
91
91
|
const base = prev
|
|
@@ -99,7 +99,7 @@ export function TimePicker({
|
|
|
99
99
|
0,
|
|
100
100
|
0,
|
|
101
101
|
0,
|
|
102
|
-
0
|
|
102
|
+
0,
|
|
103
103
|
);
|
|
104
104
|
})();
|
|
105
105
|
if (part === 'hour') {
|
|
@@ -135,17 +135,17 @@ export function TimePicker({
|
|
|
135
135
|
() =>
|
|
136
136
|
Array.from(
|
|
137
137
|
{ length: Math.ceil(60 / minuteStep) },
|
|
138
|
-
(_, i) => i * minuteStep
|
|
138
|
+
(_, i) => i * minuteStep,
|
|
139
139
|
),
|
|
140
|
-
[minuteStep]
|
|
140
|
+
[minuteStep],
|
|
141
141
|
);
|
|
142
142
|
const seconds = React.useMemo(
|
|
143
143
|
() =>
|
|
144
144
|
Array.from(
|
|
145
145
|
{ length: Math.ceil(60 / secondStep) },
|
|
146
|
-
(_, i) => i * secondStep
|
|
146
|
+
(_, i) => i * secondStep,
|
|
147
147
|
),
|
|
148
|
-
[secondStep]
|
|
148
|
+
[secondStep],
|
|
149
149
|
);
|
|
150
150
|
|
|
151
151
|
const selectedHour = React.useMemo(() => {
|
|
@@ -170,7 +170,7 @@ export function TimePicker({
|
|
|
170
170
|
variant={buttonVariant}
|
|
171
171
|
className={cn(
|
|
172
172
|
'w-[240px] justify-start text-left font-normal',
|
|
173
|
-
!value && 'text-muted-foreground'
|
|
173
|
+
!value && 'text-muted-foreground',
|
|
174
174
|
)}
|
|
175
175
|
>
|
|
176
176
|
<Clock className="mr-2 h-4 w-4" />
|
|
@@ -180,7 +180,9 @@ export function TimePicker({
|
|
|
180
180
|
<PopoverContent className="p-3 w-auto" align="start">
|
|
181
181
|
<div className="flex items-end gap-2">
|
|
182
182
|
<div className="w-24">
|
|
183
|
-
<div className="mb-1 block text-xs text-muted-foreground">
|
|
183
|
+
<div className="mb-1 block text-xs text-muted-foreground">
|
|
184
|
+
Hour
|
|
185
|
+
</div>
|
|
184
186
|
<Select
|
|
185
187
|
disabled={disabled}
|
|
186
188
|
value={String(selectedHour)}
|
|
@@ -201,7 +203,9 @@ export function TimePicker({
|
|
|
201
203
|
|
|
202
204
|
{(precision === 'minute' || precision === 'second') && (
|
|
203
205
|
<div className="w-24">
|
|
204
|
-
<div className="mb-1 block text-xs text-muted-foreground">
|
|
206
|
+
<div className="mb-1 block text-xs text-muted-foreground">
|
|
207
|
+
Minute
|
|
208
|
+
</div>
|
|
205
209
|
<Select
|
|
206
210
|
disabled={disabled}
|
|
207
211
|
value={String(selectedMinute - (selectedMinute % minuteStep))}
|
|
@@ -223,7 +227,9 @@ export function TimePicker({
|
|
|
223
227
|
|
|
224
228
|
{precision === 'second' && (
|
|
225
229
|
<div className="w-24">
|
|
226
|
-
<div className="mb-1 block text-xs text-muted-foreground">
|
|
230
|
+
<div className="mb-1 block text-xs text-muted-foreground">
|
|
231
|
+
Second
|
|
232
|
+
</div>
|
|
227
233
|
<Select
|
|
228
234
|
disabled={disabled}
|
|
229
235
|
value={String(selectedSecond - (selectedSecond % secondStep))}
|
|
@@ -245,7 +251,9 @@ export function TimePicker({
|
|
|
245
251
|
|
|
246
252
|
{hourCycle === 12 && (
|
|
247
253
|
<div className="w-24">
|
|
248
|
-
<div className="mb-1 block text-xs text-muted-foreground">
|
|
254
|
+
<div className="mb-1 block text-xs text-muted-foreground">
|
|
255
|
+
Period
|
|
256
|
+
</div>
|
|
249
257
|
<Select
|
|
250
258
|
disabled={disabled}
|
|
251
259
|
value={selectedPeriod}
|