@simplysm/solid 13.0.69 → 13.0.71
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/README.md +168 -195
- package/dist/components/data/calendar/Calendar.d.ts.map +1 -1
- package/dist/components/data/calendar/Calendar.js +15 -2
- package/dist/components/data/calendar/Calendar.js.map +2 -2
- package/dist/components/data/kanban/KanbanContext.js +2 -2
- package/dist/components/data/kanban/KanbanContext.js.map +1 -1
- package/dist/components/data/list/List.d.ts +8 -8
- package/dist/components/data/list/ListContext.d.ts +1 -1
- package/dist/components/data/list/ListItem.d.ts +15 -15
- package/dist/components/data/sheet/DataSheet.d.ts.map +1 -1
- package/dist/components/data/sheet/DataSheet.js +6 -4
- package/dist/components/data/sheet/DataSheet.js.map +2 -2
- package/dist/components/data/sheet/DataSheetConfigDialog.js +8 -8
- package/dist/components/data/sheet/DataSheetConfigDialog.js.map +1 -1
- package/dist/components/data/sheet/types.d.ts +4 -4
- package/dist/components/data/sheet/types.d.ts.map +1 -1
- package/dist/components/disclosure/Collapse.d.ts +4 -4
- package/dist/components/disclosure/Dialog.d.ts +24 -24
- package/dist/components/disclosure/Dialog.d.ts.map +1 -1
- package/dist/components/disclosure/Dialog.js +7 -2
- package/dist/components/disclosure/Dialog.js.map +2 -2
- package/dist/components/disclosure/DialogContext.d.ts +25 -25
- package/dist/components/disclosure/DialogContext.d.ts.map +1 -1
- package/dist/components/disclosure/DialogContext.js +1 -1
- package/dist/components/disclosure/DialogContext.js.map +1 -1
- package/dist/components/disclosure/DialogInstanceContext.d.ts +7 -7
- package/dist/components/disclosure/DialogInstanceContext.d.ts.map +1 -1
- package/dist/components/disclosure/DialogProvider.d.ts +3 -3
- package/dist/components/disclosure/Dropdown.d.ts +26 -24
- package/dist/components/disclosure/Dropdown.d.ts.map +1 -1
- package/dist/components/disclosure/Dropdown.js +24 -8
- package/dist/components/disclosure/Dropdown.js.map +2 -2
- package/dist/components/disclosure/Tabs.js +1 -1
- package/dist/components/disclosure/Tabs.js.map +1 -1
- package/dist/components/disclosure/dialogZIndex.d.ts +9 -7
- package/dist/components/disclosure/dialogZIndex.d.ts.map +1 -1
- package/dist/components/disclosure/dialogZIndex.js +4 -0
- package/dist/components/disclosure/dialogZIndex.js.map +1 -1
- package/dist/components/features/crud-detail/CrudDetail.d.ts.map +1 -1
- package/dist/components/features/crud-detail/CrudDetail.js +34 -22
- package/dist/components/features/crud-detail/CrudDetail.js.map +2 -2
- package/dist/components/features/crud-sheet/CrudSheet.d.ts.map +1 -1
- package/dist/components/features/crud-sheet/CrudSheet.js +48 -33
- package/dist/components/features/crud-sheet/CrudSheet.js.map +2 -2
- package/dist/components/features/crudRegistry.d.ts +16 -0
- package/dist/components/features/crudRegistry.d.ts.map +1 -0
- package/dist/components/features/crudRegistry.js +37 -0
- package/dist/components/features/crudRegistry.js.map +6 -0
- package/dist/components/features/data-select-button/DataSelectButton.d.ts +14 -14
- package/dist/components/features/data-select-button/DataSelectButton.d.ts.map +1 -1
- package/dist/components/features/data-select-button/DataSelectButton.js +27 -9
- package/dist/components/features/data-select-button/DataSelectButton.js.map +2 -2
- package/dist/components/features/permission-table/PermissionTable.d.ts +3 -3
- package/dist/components/features/permission-table/PermissionTable.d.ts.map +1 -1
- package/dist/components/features/permission-table/PermissionTable.js +74 -85
- package/dist/components/features/permission-table/PermissionTable.js.map +2 -2
- package/dist/components/features/shared-data/SharedDataSelect.d.ts +12 -12
- package/dist/components/features/shared-data/SharedDataSelect.d.ts.map +1 -1
- package/dist/components/features/shared-data/SharedDataSelect.js +10 -6
- package/dist/components/features/shared-data/SharedDataSelect.js.map +2 -2
- package/dist/components/features/shared-data/SharedDataSelectButton.d.ts +10 -10
- package/dist/components/features/shared-data/SharedDataSelectButton.d.ts.map +1 -1
- package/dist/components/features/shared-data/SharedDataSelectList.d.ts +23 -15
- package/dist/components/features/shared-data/SharedDataSelectList.d.ts.map +1 -1
- package/dist/components/features/shared-data/SharedDataSelectList.js +191 -65
- package/dist/components/features/shared-data/SharedDataSelectList.js.map +2 -2
- package/dist/components/features/shared-data/SharedDataSelectListContext.d.ts +15 -0
- package/dist/components/features/shared-data/SharedDataSelectListContext.d.ts.map +1 -0
- package/dist/components/features/shared-data/SharedDataSelectListContext.js +27 -0
- package/dist/components/features/shared-data/SharedDataSelectListContext.js.map +6 -0
- package/dist/components/feedback/Progress.d.ts +1 -1
- package/dist/components/feedback/Progress.d.ts.map +1 -1
- package/dist/components/feedback/busy/BusyContainer.d.ts +2 -2
- package/dist/components/feedback/busy/BusyContainer.d.ts.map +1 -1
- package/dist/components/feedback/busy/BusyContext.d.ts +11 -11
- package/dist/components/feedback/busy/BusyContext.d.ts.map +1 -1
- package/dist/components/feedback/busy/BusyContext.js +1 -1
- package/dist/components/feedback/busy/BusyContext.js.map +1 -1
- package/dist/components/feedback/busy/BusyProvider.d.ts +6 -6
- package/dist/components/feedback/busy/BusyProvider.d.ts.map +1 -1
- package/dist/components/feedback/notification/NotificationBanner.d.ts.map +1 -1
- package/dist/components/feedback/notification/NotificationBanner.js +7 -3
- package/dist/components/feedback/notification/NotificationBanner.js.map +2 -2
- package/dist/components/feedback/notification/NotificationBell.js +2 -2
- package/dist/components/feedback/notification/NotificationBell.js.map +1 -1
- package/dist/components/feedback/notification/NotificationContext.d.ts +22 -22
- package/dist/components/feedback/notification/NotificationContext.d.ts.map +1 -1
- package/dist/components/feedback/notification/NotificationContext.js +1 -1
- package/dist/components/feedback/notification/NotificationContext.js.map +1 -1
- package/dist/components/feedback/notification/NotificationProvider.d.ts +5 -5
- package/dist/components/feedback/notification/NotificationProvider.js +1 -1
- package/dist/components/feedback/notification/NotificationProvider.js.map +1 -1
- package/dist/components/feedback/print/PrintContext.js +1 -1
- package/dist/components/feedback/print/PrintContext.js.map +1 -1
- package/dist/components/form-control/DropdownTrigger.styles.d.ts +1 -1
- package/dist/components/form-control/DropdownTrigger.styles.d.ts.map +1 -1
- package/dist/components/form-control/ThemeToggle.d.ts +7 -7
- package/dist/components/form-control/ThemeToggle.d.ts.map +1 -1
- package/dist/components/form-control/ThemeToggle.js +3 -3
- package/dist/components/form-control/checkbox/Checkbox.js +1 -1
- package/dist/components/form-control/checkbox/CheckboxGroup.js +1 -1
- package/dist/components/form-control/checkbox/Radio.js +1 -1
- package/dist/components/form-control/checkbox/RadioGroup.js +1 -1
- package/dist/components/form-control/color-picker/ColorPicker.d.ts +12 -12
- package/dist/components/form-control/color-picker/ColorPicker.d.ts.map +1 -1
- package/dist/components/form-control/color-picker/ColorPicker.js +2 -2
- package/dist/components/form-control/combobox/Combobox.d.ts +22 -22
- package/dist/components/form-control/combobox/Combobox.d.ts.map +1 -1
- package/dist/components/form-control/combobox/Combobox.js +2 -2
- package/dist/components/form-control/combobox/ComboboxContext.d.ts +4 -4
- package/dist/components/form-control/combobox/ComboboxContext.d.ts.map +1 -1
- package/dist/components/form-control/combobox/ComboboxContext.js +1 -1
- package/dist/components/form-control/combobox/ComboboxContext.js.map +1 -1
- package/dist/components/form-control/combobox/ComboboxItem.d.ts +3 -3
- package/dist/components/form-control/combobox/ComboboxItem.d.ts.map +1 -1
- package/dist/components/form-control/date-range-picker/DateRangePicker.d.ts +14 -14
- package/dist/components/form-control/date-range-picker/DateRangePicker.d.ts.map +1 -1
- package/dist/components/form-control/date-range-picker/DateRangePicker.js +20 -9
- package/dist/components/form-control/date-range-picker/DateRangePicker.js.map +2 -2
- package/dist/components/form-control/editor/EditorToolbar.d.ts.map +1 -1
- package/dist/components/form-control/editor/EditorToolbar.js +65 -20
- package/dist/components/form-control/editor/EditorToolbar.js.map +2 -2
- package/dist/components/form-control/editor/RichTextEditor.d.ts +6 -6
- package/dist/components/form-control/editor/RichTextEditor.d.ts.map +1 -1
- package/dist/components/form-control/editor/RichTextEditor.js +1 -1
- package/dist/components/form-control/editor/editor.css +5 -5
- package/dist/components/form-control/field/DatePicker.d.ts +22 -22
- package/dist/components/form-control/field/DatePicker.d.ts.map +1 -1
- package/dist/components/form-control/field/DatePicker.js +4 -4
- package/dist/components/form-control/field/DatePicker.js.map +1 -1
- package/dist/components/form-control/field/DateTimePicker.d.ts +21 -21
- package/dist/components/form-control/field/DateTimePicker.d.ts.map +1 -1
- package/dist/components/form-control/field/DateTimePicker.js +4 -4
- package/dist/components/form-control/field/DateTimePicker.js.map +1 -1
- package/dist/components/form-control/field/FieldPlaceholder.d.ts +1 -1
- package/dist/components/form-control/field/FieldPlaceholder.d.ts.map +1 -1
- package/dist/components/form-control/field/NumberInput.d.ts +23 -23
- package/dist/components/form-control/field/NumberInput.d.ts.map +1 -1
- package/dist/components/form-control/field/NumberInput.js +4 -4
- package/dist/components/form-control/field/NumberInput.js.map +1 -1
- package/dist/components/form-control/field/TextInput.d.ts +25 -25
- package/dist/components/form-control/field/TextInput.d.ts.map +1 -1
- package/dist/components/form-control/field/TextInput.js +5 -5
- package/dist/components/form-control/field/TextInput.js.map +1 -1
- package/dist/components/form-control/field/Textarea.d.ts +19 -19
- package/dist/components/form-control/field/Textarea.d.ts.map +1 -1
- package/dist/components/form-control/field/Textarea.js +4 -4
- package/dist/components/form-control/field/Textarea.js.map +1 -1
- package/dist/components/form-control/field/TimePicker.d.ts +20 -20
- package/dist/components/form-control/field/TimePicker.d.ts.map +1 -1
- package/dist/components/form-control/field/TimePicker.js +4 -4
- package/dist/components/form-control/field/TimePicker.js.map +1 -1
- package/dist/components/form-control/numpad/Numpad.d.ts +11 -11
- package/dist/components/form-control/numpad/Numpad.d.ts.map +1 -1
- package/dist/components/form-control/select/Select.d.ts +26 -26
- package/dist/components/form-control/select/Select.d.ts.map +1 -1
- package/dist/components/form-control/select/Select.js +34 -23
- package/dist/components/form-control/select/Select.js.map +2 -2
- package/dist/components/form-control/select/SelectContext.d.ts +7 -7
- package/dist/components/form-control/select/SelectContext.d.ts.map +1 -1
- package/dist/components/form-control/select/SelectContext.js +1 -1
- package/dist/components/form-control/select/SelectContext.js.map +1 -1
- package/dist/components/form-control/select/SelectItem.d.ts +4 -4
- package/dist/components/form-control/select/SelectItem.d.ts.map +1 -1
- package/dist/components/form-control/state-preset/StatePreset.js +8 -8
- package/dist/components/form-control/state-preset/StatePreset.js.map +1 -1
- package/dist/components/layout/FormTable.js +4 -4
- package/dist/components/layout/sidebar/Sidebar.d.ts +5 -5
- package/dist/components/layout/sidebar/SidebarContainer.d.ts +11 -11
- package/dist/components/layout/sidebar/SidebarContainer.d.ts.map +1 -1
- package/dist/components/layout/sidebar/SidebarContainer.js +6 -1
- package/dist/components/layout/sidebar/SidebarContainer.js.map +2 -2
- package/dist/components/layout/sidebar/SidebarContext.d.ts +7 -7
- package/dist/components/layout/sidebar/SidebarContext.js +1 -1
- package/dist/components/layout/sidebar/SidebarContext.js.map +1 -1
- package/dist/components/layout/sidebar/SidebarMenu.d.ts +11 -11
- package/dist/components/layout/sidebar/SidebarUser.d.ts +14 -14
- package/dist/components/layout/topbar/Topbar.d.ts +6 -6
- package/dist/components/layout/topbar/Topbar.d.ts.map +1 -1
- package/dist/components/layout/topbar/Topbar.js +11 -6
- package/dist/components/layout/topbar/Topbar.js.map +2 -2
- package/dist/components/layout/topbar/TopbarContainer.d.ts +6 -6
- package/dist/components/layout/topbar/TopbarContext.js +2 -2
- package/dist/components/layout/topbar/TopbarContext.js.map +1 -1
- package/dist/components/layout/topbar/TopbarMenu.d.ts +11 -11
- package/dist/components/layout/topbar/TopbarMenu.d.ts.map +1 -1
- package/dist/components/layout/topbar/TopbarMenu.js +5 -1
- package/dist/components/layout/topbar/TopbarMenu.js.map +2 -2
- package/dist/components/layout/topbar/TopbarUser.d.ts +9 -9
- package/dist/directives/ripple.d.ts +5 -5
- package/dist/helpers/createAppStructure.d.ts.map +1 -1
- package/dist/helpers/createAppStructure.js +7 -3
- package/dist/helpers/createAppStructure.js.map +1 -1
- package/dist/helpers/createHmrSafeContext.d.ts +3 -0
- package/dist/helpers/createHmrSafeContext.d.ts.map +1 -0
- package/dist/helpers/createHmrSafeContext.js +10 -0
- package/dist/helpers/createHmrSafeContext.js.map +6 -0
- package/dist/helpers/createSlotComponent.d.ts +3 -3
- package/dist/helpers/mergeStyles.d.ts +8 -8
- package/dist/hooks/createControllableSignal.d.ts +10 -10
- package/dist/hooks/createControllableStore.d.ts +6 -6
- package/dist/hooks/createIMEHandler.d.ts +7 -7
- package/dist/hooks/createMountTransition.d.ts +4 -4
- package/dist/hooks/createSelectionGroup.d.ts.map +1 -1
- package/dist/hooks/createSelectionGroup.js +4 -3
- package/dist/hooks/createSelectionGroup.js.map +2 -2
- package/dist/hooks/createSlotSignal.d.ts +2 -2
- package/dist/hooks/useLocalStorage.d.ts +11 -11
- package/dist/hooks/useLogger.d.ts +1 -1
- package/dist/hooks/useLogger.d.ts.map +1 -1
- package/dist/hooks/useLogger.js +1 -1
- package/dist/hooks/useLogger.js.map +1 -1
- package/dist/hooks/useRouterLink.d.ts +10 -10
- package/dist/hooks/useRouterLink.d.ts.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/providers/ClipboardProvider.d.ts +5 -5
- package/dist/providers/ConfigContext.d.ts +6 -6
- package/dist/providers/ConfigContext.js +2 -2
- package/dist/providers/ConfigContext.js.map +1 -1
- package/dist/providers/ErrorLoggerProvider.d.ts +3 -3
- package/dist/providers/LoggerContext.d.ts +13 -13
- package/dist/providers/PwaUpdateProvider.d.ts +4 -4
- package/dist/providers/PwaUpdateProvider.js +2 -2
- package/dist/providers/PwaUpdateProvider.js.map +1 -1
- package/dist/providers/ServiceClientContext.d.ts +8 -8
- package/dist/providers/ServiceClientContext.d.ts.map +1 -1
- package/dist/providers/ServiceClientContext.js +1 -1
- package/dist/providers/ServiceClientContext.js.map +1 -1
- package/dist/providers/ServiceClientProvider.d.ts +6 -6
- package/dist/providers/ServiceClientProvider.js +7 -7
- package/dist/providers/ServiceClientProvider.js.map +1 -1
- package/dist/providers/SyncStorageContext.d.ts +14 -14
- package/dist/providers/SystemProvider.d.ts.map +1 -1
- package/dist/providers/SystemProvider.js +21 -16
- package/dist/providers/SystemProvider.js.map +2 -2
- package/dist/providers/ThemeContext.d.ts +20 -20
- package/dist/providers/ThemeContext.d.ts.map +1 -1
- package/dist/providers/ThemeContext.js +1 -1
- package/dist/providers/ThemeContext.js.map +1 -1
- package/dist/providers/i18n/I18nContext.d.ts +44 -0
- package/dist/providers/i18n/I18nContext.d.ts.map +1 -0
- package/dist/providers/i18n/I18nContext.js +73 -0
- package/dist/providers/i18n/I18nContext.js.map +6 -0
- package/dist/providers/i18n/I18nContext.types.d.ts +28 -0
- package/dist/providers/i18n/I18nContext.types.d.ts.map +1 -0
- package/dist/providers/i18n/I18nContext.types.js +1 -0
- package/dist/providers/i18n/I18nContext.types.js.map +6 -0
- package/dist/providers/i18n/i18nUtils.d.ts +18 -0
- package/dist/providers/i18n/i18nUtils.d.ts.map +1 -0
- package/dist/providers/i18n/i18nUtils.js +25 -0
- package/dist/providers/i18n/i18nUtils.js.map +6 -0
- package/dist/providers/i18n/locales/en.d.ts +163 -0
- package/dist/providers/i18n/locales/en.d.ts.map +1 -0
- package/dist/providers/i18n/locales/en.js +165 -0
- package/dist/providers/i18n/locales/en.js.map +6 -0
- package/dist/providers/i18n/locales/ko.d.ts +163 -0
- package/dist/providers/i18n/locales/ko.d.ts.map +1 -0
- package/dist/providers/i18n/locales/ko.js +165 -0
- package/dist/providers/i18n/locales/ko.js.map +6 -0
- package/dist/providers/shared-data/SharedDataChangeEvent.d.ts +4 -4
- package/dist/providers/shared-data/SharedDataContext.d.ts +28 -28
- package/dist/providers/shared-data/SharedDataContext.d.ts.map +1 -1
- package/dist/providers/shared-data/SharedDataContext.js +1 -1
- package/dist/providers/shared-data/SharedDataContext.js.map +1 -1
- package/dist/providers/shared-data/SharedDataProvider.d.ts +9 -9
- package/dist/providers/shared-data/SharedDataProvider.js +4 -4
- package/dist/providers/shared-data/SharedDataProvider.js.map +1 -1
- package/package.json +9 -8
- package/src/components/data/calendar/Calendar.tsx +10 -4
- package/src/components/data/kanban/Kanban.tsx +14 -14
- package/src/components/data/kanban/KanbanContext.ts +3 -3
- package/src/components/data/list/List.tsx +10 -10
- package/src/components/data/list/ListContext.ts +1 -1
- package/src/components/data/list/ListItem.styles.ts +8 -8
- package/src/components/data/list/ListItem.tsx +15 -15
- package/src/components/data/sheet/DataSheet.styles.ts +22 -22
- package/src/components/data/sheet/DataSheet.tsx +52 -48
- package/src/components/data/sheet/DataSheetColumn.tsx +1 -1
- package/src/components/data/sheet/DataSheetConfigDialog.tsx +9 -9
- package/src/components/data/sheet/sheetUtils.ts +7 -7
- package/src/components/data/sheet/types.ts +16 -16
- package/src/components/disclosure/Collapse.tsx +11 -11
- package/src/components/disclosure/Dialog.tsx +60 -57
- package/src/components/disclosure/DialogContext.ts +26 -26
- package/src/components/disclosure/DialogInstanceContext.ts +7 -7
- package/src/components/disclosure/DialogProvider.tsx +5 -5
- package/src/components/disclosure/Dropdown.tsx +89 -75
- package/src/components/disclosure/Tabs.tsx +1 -1
- package/src/components/disclosure/dialogZIndex.ts +16 -11
- package/src/components/display/Echarts.tsx +4 -4
- package/src/components/features/address/AddressSearch.tsx +2 -2
- package/src/components/features/crud-detail/CrudDetail.tsx +34 -21
- package/src/components/features/crud-detail/CrudDetailAfter.tsx +1 -1
- package/src/components/features/crud-detail/CrudDetailBefore.tsx +1 -1
- package/src/components/features/crud-detail/CrudDetailTools.tsx +1 -1
- package/src/components/features/crud-sheet/CrudSheet.tsx +52 -40
- package/src/components/features/crud-sheet/CrudSheetColumn.tsx +1 -1
- package/src/components/features/crud-sheet/CrudSheetFilter.tsx +1 -1
- package/src/components/features/crud-sheet/CrudSheetHeader.tsx +1 -1
- package/src/components/features/crud-sheet/CrudSheetTools.tsx +1 -1
- package/src/components/features/crudRegistry.ts +60 -0
- package/src/components/features/data-select-button/DataSelectButton.tsx +34 -32
- package/src/components/features/permission-table/PermissionTable.tsx +70 -64
- package/src/components/features/shared-data/SharedDataSelect.tsx +24 -22
- package/src/components/features/shared-data/SharedDataSelectButton.tsx +10 -10
- package/src/components/features/shared-data/SharedDataSelectList.tsx +231 -59
- package/src/components/features/shared-data/SharedDataSelectListContext.ts +39 -0
- package/src/components/feedback/Progress.tsx +1 -1
- package/src/components/feedback/busy/BusyContainer.tsx +6 -6
- package/src/components/feedback/busy/BusyContext.ts +12 -12
- package/src/components/feedback/busy/BusyProvider.tsx +6 -6
- package/src/components/feedback/notification/NotificationBanner.tsx +3 -1
- package/src/components/feedback/notification/NotificationBell.tsx +4 -4
- package/src/components/feedback/notification/NotificationContext.ts +28 -28
- package/src/components/feedback/notification/NotificationProvider.tsx +9 -9
- package/src/components/feedback/print/PrintContext.ts +1 -1
- package/src/components/form-control/Button.tsx +1 -1
- package/src/components/form-control/DropdownTrigger.styles.ts +1 -1
- package/src/components/form-control/Invalid.tsx +5 -5
- package/src/components/form-control/ThemeToggle.tsx +10 -10
- package/src/components/form-control/checkbox/Checkbox.styles.ts +8 -8
- package/src/components/form-control/checkbox/Checkbox.tsx +2 -2
- package/src/components/form-control/checkbox/CheckboxGroup.tsx +1 -1
- package/src/components/form-control/checkbox/Radio.tsx +2 -2
- package/src/components/form-control/checkbox/RadioGroup.tsx +1 -1
- package/src/components/form-control/color-picker/ColorPicker.tsx +17 -17
- package/src/components/form-control/combobox/Combobox.tsx +55 -55
- package/src/components/form-control/combobox/ComboboxContext.ts +5 -5
- package/src/components/form-control/combobox/ComboboxItem.tsx +3 -3
- package/src/components/form-control/date-range-picker/DateRangePicker.tsx +40 -26
- package/src/components/form-control/editor/EditorToolbar.tsx +52 -50
- package/src/components/form-control/editor/RichTextEditor.tsx +16 -16
- package/src/components/form-control/editor/editor.css +5 -5
- package/src/components/form-control/field/DatePicker.tsx +39 -39
- package/src/components/form-control/field/DateTimePicker.tsx +38 -38
- package/src/components/form-control/field/Field.styles.ts +11 -11
- package/src/components/form-control/field/FieldPlaceholder.tsx +1 -1
- package/src/components/form-control/field/NumberInput.tsx +63 -63
- package/src/components/form-control/field/TextInput.tsx +48 -48
- package/src/components/form-control/field/Textarea.tsx +32 -32
- package/src/components/form-control/field/TimePicker.tsx +37 -37
- package/src/components/form-control/numpad/Numpad.tsx +26 -26
- package/src/components/form-control/select/Select.tsx +82 -86
- package/src/components/form-control/select/SelectContext.ts +8 -8
- package/src/components/form-control/select/SelectItem.tsx +5 -5
- package/src/components/form-control/state-preset/StatePreset.tsx +13 -13
- package/src/components/layout/FormTable.tsx +4 -4
- package/src/components/layout/sidebar/Sidebar.tsx +8 -8
- package/src/components/layout/sidebar/SidebarContainer.tsx +19 -17
- package/src/components/layout/sidebar/SidebarContext.ts +8 -8
- package/src/components/layout/sidebar/SidebarMenu.tsx +19 -19
- package/src/components/layout/sidebar/SidebarUser.tsx +14 -14
- package/src/components/layout/topbar/Topbar.tsx +15 -13
- package/src/components/layout/topbar/TopbarContainer.tsx +6 -6
- package/src/components/layout/topbar/TopbarContext.ts +2 -2
- package/src/components/layout/topbar/TopbarMenu.tsx +18 -16
- package/src/components/layout/topbar/TopbarUser.tsx +9 -9
- package/src/directives/ripple.ts +8 -8
- package/src/helpers/createAppStructure.ts +15 -8
- package/src/helpers/createHmrSafeContext.ts +8 -0
- package/src/helpers/createSlotComponent.ts +4 -4
- package/src/helpers/mergeStyles.ts +11 -11
- package/src/hooks/createControllableSignal.ts +11 -11
- package/src/hooks/createControllableStore.ts +8 -8
- package/src/hooks/createIMEHandler.ts +7 -7
- package/src/hooks/createMountTransition.ts +4 -4
- package/src/hooks/createSelectionGroup.tsx +5 -3
- package/src/hooks/createSlotSignal.ts +2 -2
- package/src/hooks/useLocalStorage.ts +13 -13
- package/src/hooks/useLogger.ts +2 -2
- package/src/hooks/useRouterLink.ts +15 -15
- package/src/index.ts +4 -3
- package/src/providers/ClipboardProvider.tsx +19 -19
- package/src/providers/ConfigContext.tsx +8 -8
- package/src/providers/ErrorLoggerProvider.tsx +3 -3
- package/src/providers/LoggerContext.tsx +13 -13
- package/src/providers/PwaUpdateProvider.tsx +6 -6
- package/src/providers/ServiceClientContext.ts +9 -9
- package/src/providers/ServiceClientProvider.tsx +15 -15
- package/src/providers/SyncStorageContext.tsx +15 -15
- package/src/providers/SystemProvider.tsx +15 -12
- package/src/providers/ThemeContext.tsx +26 -26
- package/src/providers/i18n/I18nContext.tsx +129 -0
- package/src/providers/i18n/I18nContext.types.ts +30 -0
- package/src/providers/i18n/i18nUtils.ts +38 -0
- package/src/providers/i18n/locales/en.ts +161 -0
- package/src/providers/i18n/locales/ko.ts +161 -0
- package/src/providers/shared-data/SharedDataChangeEvent.ts +4 -4
- package/src/providers/shared-data/SharedDataContext.ts +29 -29
- package/src/providers/shared-data/SharedDataProvider.tsx +21 -21
- package/src/styles/patterns.styles.ts +6 -6
- package/src/styles/tokens.styles.ts +5 -5
- package/tailwind.config.ts +1 -1
- package/tailwind.css +4 -4
- package/tests/components/data/List.spec.tsx +689 -0
- package/tests/components/data/Pagination.spec.tsx +336 -0
- package/tests/components/data/Table.spec.tsx +55 -0
- package/tests/components/data/kanban/Kanban.selection.spec.tsx +213 -0
- package/tests/components/data/sheet/DataSheet.spec.tsx +645 -0
- package/tests/components/disclosure/Collapse.spec.tsx +173 -0
- package/tests/components/disclosure/Dialog.spec.tsx +438 -0
- package/tests/components/disclosure/DialogProvider.spec.tsx +142 -0
- package/tests/components/disclosure/Dropdown.spec.tsx +333 -0
- package/tests/components/disclosure/Tabs.spec.tsx +220 -0
- package/tests/components/disclosure/dialogZIndex.spec.ts +45 -0
- package/tests/components/display/Alert.spec.tsx +47 -0
- package/tests/components/display/Barcode.spec.tsx +61 -0
- package/tests/components/display/Card.spec.tsx +41 -0
- package/tests/components/display/Link.spec.tsx +62 -0
- package/tests/components/display/Tag.spec.tsx +47 -0
- package/tests/components/features/address/AddressSearch.spec.tsx +45 -0
- package/tests/components/features/crud-detail/CrudDetail.spec.tsx +537 -0
- package/tests/components/features/crud-sheet/CrudSheet.spec.tsx +491 -0
- package/tests/components/features/crudRegistry.spec.ts +119 -0
- package/tests/components/features/data-select-button/DataSelectButton.spec.tsx +482 -0
- package/tests/components/features/permission-table/PermissionTable.spec.tsx +288 -0
- package/tests/components/features/shared-data/SharedDataSelectList.spec.tsx +448 -0
- package/tests/components/feedback/busy/BusyContainer.spec.tsx +80 -0
- package/tests/components/feedback/notification/LiveRegion.spec.tsx +52 -0
- package/tests/components/feedback/notification/NotificationBanner.spec.tsx +187 -0
- package/tests/components/feedback/notification/NotificationBell.spec.tsx +226 -0
- package/tests/components/feedback/notification/NotificationContext.spec.tsx +362 -0
- package/tests/components/feedback/print/Print.spec.tsx +45 -0
- package/tests/components/form-control/Button.spec.tsx +119 -0
- package/tests/components/form-control/Invalid.spec.tsx +131 -0
- package/tests/components/form-control/checkbox/Checkbox.spec.tsx +137 -0
- package/tests/components/form-control/checkbox/CheckboxGroup.spec.tsx +108 -0
- package/tests/components/form-control/checkbox/Radio.spec.tsx +138 -0
- package/tests/components/form-control/checkbox/RadioGroup.spec.tsx +108 -0
- package/tests/components/form-control/color-picker/ColorPicker.spec.tsx +94 -0
- package/tests/components/form-control/combobox/Combobox.spec.tsx +253 -0
- package/tests/components/form-control/combobox/ComboboxItem.spec.tsx +88 -0
- package/tests/components/form-control/date-range-picker/DateRangePicker.spec.tsx +208 -0
- package/tests/components/form-control/field/DatePicker.spec.tsx +381 -0
- package/tests/components/form-control/field/DateTimePicker.spec.tsx +383 -0
- package/tests/components/form-control/field/NumberInput.spec.tsx +371 -0
- package/tests/components/form-control/field/TextInput.spec.tsx +341 -0
- package/tests/components/form-control/field/Textarea.spec.tsx +224 -0
- package/tests/components/form-control/field/TimePicker.spec.tsx +315 -0
- package/tests/components/form-control/numpad/Numpad.spec.tsx +248 -0
- package/tests/components/form-control/select/Select.spec.tsx +676 -0
- package/tests/components/form-control/select/SelectItem.spec.tsx +174 -0
- package/tests/components/layout/FormGroup.spec.tsx +104 -0
- package/tests/components/layout/FormTable.spec.tsx +43 -0
- package/tests/components/layout/sidebar/Sidebar.spec.tsx +192 -0
- package/tests/components/layout/sidebar/SidebarContainer.spec.tsx +261 -0
- package/tests/components/layout/sidebar/SidebarMenu.spec.tsx +219 -0
- package/tests/components/layout/sidebar/SidebarUser.spec.tsx +133 -0
- package/tests/components/layout/topbar/TopbarActions.spec.tsx +77 -0
- package/tests/components/layout/topbar/TopbarContainer.spec.tsx +38 -0
- package/tests/components/layout/topbar/createTopbarActions.spec.tsx +66 -0
- package/tests/directives/ripple.spec.tsx +130 -0
- package/tests/helpers/createAppStructure.spec.tsx +843 -0
- package/tests/helpers/mergeStyles.spec.ts +172 -0
- package/tests/hooks/createControllableSignal.spec.ts +194 -0
- package/tests/hooks/createIMEHandler.spec.ts +80 -0
- package/tests/hooks/createMountTransition.spec.ts +86 -0
- package/tests/hooks/useLocalStorage.spec.tsx +223 -0
- package/tests/hooks/useLogger.spec.tsx +116 -0
- package/tests/hooks/usePrint.spec.tsx +134 -0
- package/tests/hooks/useRouterLink.spec.tsx +183 -0
- package/tests/hooks/useSyncConfig.spec.tsx +304 -0
- package/tests/providers/ClipboardProvider.spec.tsx +20 -0
- package/tests/providers/ConfigContext.spec.tsx +42 -0
- package/tests/providers/ErrorLoggerProvider.spec.tsx +73 -0
- package/tests/providers/LoggerContext.spec.tsx +76 -0
- package/tests/providers/PwaUpdateProvider.spec.tsx +22 -0
- package/tests/providers/ServiceClientContext.spec.tsx +88 -0
- package/tests/providers/SyncStorageContext.spec.tsx +77 -0
- package/tests/providers/i18n/I18nContext.spec.tsx +110 -0
- package/tests/providers/shared-data/SharedDataProvider.spec.tsx +401 -0
- package/tests/vitest-env.d.ts +1 -0
- package/dist/components/form-control/select-list/SelectList.d.ts +0 -54
- package/dist/components/form-control/select-list/SelectList.d.ts.map +0 -1
- package/dist/components/form-control/select-list/SelectList.js +0 -280
- package/dist/components/form-control/select-list/SelectList.js.map +0 -6
- package/dist/components/form-control/select-list/SelectListContext.d.ts +0 -13
- package/dist/components/form-control/select-list/SelectListContext.d.ts.map +0 -1
- package/dist/components/form-control/select-list/SelectListContext.js +0 -14
- package/dist/components/form-control/select-list/SelectListContext.js.map +0 -6
- package/docs/data-components.md +0 -782
- package/docs/disclosure.md +0 -254
- package/docs/display.md +0 -153
- package/docs/feedback.md +0 -238
- package/docs/form-controls.md +0 -1068
- package/docs/helpers.md +0 -54
- package/docs/hooks.md +0 -588
- package/docs/layout.md +0 -384
- package/docs/providers.md +0 -211
- package/docs/styling.md +0 -184
- package/src/components/form-control/select-list/SelectList.tsx +0 -385
- package/src/components/form-control/select-list/SelectListContext.ts +0 -23
|
@@ -6,15 +6,15 @@ export interface FormTableProps extends JSX.HTMLAttributes<HTMLTableElement> {}
|
|
|
6
6
|
|
|
7
7
|
const baseClass = clsx(
|
|
8
8
|
"border-separate border-spacing-0 border-0",
|
|
9
|
-
//
|
|
9
|
+
// All cells: vertical center, right/bottom padding
|
|
10
10
|
"[&_td]:align-middle [&_th]:align-middle",
|
|
11
11
|
"[&_td]:pr-1.5 [&_th]:pr-1.5",
|
|
12
12
|
"[&_td]:pb-1 [&_th]:pb-1",
|
|
13
|
-
//
|
|
13
|
+
// Last cell in row: remove right padding
|
|
14
14
|
"[&_tr>*:last-child]:pr-0",
|
|
15
|
-
//
|
|
15
|
+
// Cells in last row: remove bottom padding
|
|
16
16
|
"[&_tr:last-child>*]:pb-0",
|
|
17
|
-
// th:
|
|
17
|
+
// th: right align, content width, prevent wrapping
|
|
18
18
|
"[&_th]:w-0 [&_th]:whitespace-nowrap [&_th]:pl-1 [&_th]:text-right",
|
|
19
19
|
);
|
|
20
20
|
|
|
@@ -38,18 +38,18 @@ export interface SidebarProps extends JSX.HTMLAttributes<HTMLElement> {
|
|
|
38
38
|
}
|
|
39
39
|
|
|
40
40
|
/**
|
|
41
|
-
*
|
|
41
|
+
* Sidebar body component
|
|
42
42
|
*
|
|
43
43
|
* @remarks
|
|
44
|
-
* -
|
|
45
|
-
* -
|
|
46
|
-
* -
|
|
44
|
+
* - Must be used inside SidebarContainer (`position: absolute` dependency)
|
|
45
|
+
* - Reads toggle state from Context to apply open/close animation
|
|
46
|
+
* - Does not include toggle button - controlled externally via useSidebarContext().setToggle
|
|
47
47
|
*
|
|
48
48
|
* @example
|
|
49
49
|
* ```tsx
|
|
50
50
|
* <Sidebar>
|
|
51
51
|
* <Sidebar.User menus={userMenus}>
|
|
52
|
-
* <span
|
|
52
|
+
* <span>User</span>
|
|
53
53
|
* </Sidebar.User>
|
|
54
54
|
* <Sidebar.Menu menus={menuItems} />
|
|
55
55
|
* </Sidebar>
|
|
@@ -66,10 +66,10 @@ const SidebarBase: ParentComponent<SidebarProps> = (props) => {
|
|
|
66
66
|
|
|
67
67
|
const { toggle } = useSidebarContext();
|
|
68
68
|
|
|
69
|
-
// Tailwind sm: breakpoint
|
|
69
|
+
// Detect Tailwind sm: breakpoint
|
|
70
70
|
const isDesktop = createMediaQuery(SM_MEDIA_QUERY);
|
|
71
71
|
|
|
72
|
-
//
|
|
72
|
+
// Calculate sidebar open state
|
|
73
73
|
const isOpen = createMemo(() => {
|
|
74
74
|
if (isDesktop()) {
|
|
75
75
|
return !toggle();
|
|
@@ -77,7 +77,7 @@ const SidebarBase: ParentComponent<SidebarProps> = (props) => {
|
|
|
77
77
|
return toggle();
|
|
78
78
|
});
|
|
79
79
|
|
|
80
|
-
// transform
|
|
80
|
+
// Calculate transform: hide left when closed
|
|
81
81
|
const getTransform = () => {
|
|
82
82
|
return isOpen() ? "translateX(0)" : "translateX(-100%)";
|
|
83
83
|
};
|
|
@@ -12,6 +12,7 @@ import clsx from "clsx";
|
|
|
12
12
|
import { twMerge } from "tailwind-merge";
|
|
13
13
|
import { SidebarContext, SM_MEDIA_QUERY } from "./SidebarContext";
|
|
14
14
|
import { mergeStyles } from "../../../helpers/mergeStyles";
|
|
15
|
+
import { useI18nOptional } from "../../../providers/i18n/I18nContext";
|
|
15
16
|
|
|
16
17
|
const backdropClass = clsx(
|
|
17
18
|
"absolute",
|
|
@@ -31,17 +32,17 @@ export interface SidebarContainerProps extends JSX.HTMLAttributes<HTMLDivElement
|
|
|
31
32
|
}
|
|
32
33
|
|
|
33
34
|
/**
|
|
34
|
-
*
|
|
35
|
+
* Sidebar container component
|
|
35
36
|
*
|
|
36
37
|
* @remarks
|
|
37
|
-
* - `position: relative
|
|
38
|
-
* -
|
|
39
|
-
* -
|
|
40
|
-
* -
|
|
41
|
-
* -
|
|
42
|
-
* -
|
|
43
|
-
* -
|
|
44
|
-
* -
|
|
38
|
+
* - Acts as container with `position: relative` for Sidebar
|
|
39
|
+
* - Parent element must have height specified (use `h-full`)
|
|
40
|
+
* - Content area's `overflow-auto` must be applied by user
|
|
41
|
+
* - Shares toggle state via SidebarContext.Provider
|
|
42
|
+
* - Toggle state is kept in memory only (reset on page refresh)
|
|
43
|
+
* - On desktop (640px+): uses padding-left + transition to expand/collapse content
|
|
44
|
+
* - On mobile (640px-): renders backdrop and closes on click
|
|
45
|
+
* - Auto closes on mobile when page navigates
|
|
45
46
|
*
|
|
46
47
|
* @example
|
|
47
48
|
* ```tsx
|
|
@@ -49,11 +50,11 @@ export interface SidebarContainerProps extends JSX.HTMLAttributes<HTMLDivElement
|
|
|
49
50
|
* <SidebarContainer>
|
|
50
51
|
* <Sidebar>
|
|
51
52
|
* <SidebarUser menus={userMenus}>
|
|
52
|
-
* <span
|
|
53
|
+
* <span>User</span>
|
|
53
54
|
* </SidebarUser>
|
|
54
55
|
* <SidebarMenu menus={menuItems} />
|
|
55
56
|
* </Sidebar>
|
|
56
|
-
* <main class="h-full overflow-auto"
|
|
57
|
+
* <main class="h-full overflow-auto">Content</main>
|
|
57
58
|
* </SidebarContainer>
|
|
58
59
|
* </div>
|
|
59
60
|
* ```
|
|
@@ -61,12 +62,13 @@ export interface SidebarContainerProps extends JSX.HTMLAttributes<HTMLDivElement
|
|
|
61
62
|
export const SidebarContainer: ParentComponent<SidebarContainerProps> = (props) => {
|
|
62
63
|
const [local, rest] = splitProps(props, ["children", "class", "style"]);
|
|
63
64
|
|
|
65
|
+
const i18n = useI18nOptional();
|
|
64
66
|
const [toggle, setToggle] = createSignal(false);
|
|
65
67
|
|
|
66
|
-
// Tailwind sm: breakpoint
|
|
68
|
+
// Detect Tailwind sm: breakpoint
|
|
67
69
|
const isDesktop = createMediaQuery(SM_MEDIA_QUERY);
|
|
68
70
|
|
|
69
|
-
//
|
|
71
|
+
// Calculate sidebar open state
|
|
70
72
|
const isOpen = createMemo(() => {
|
|
71
73
|
if (isDesktop()) {
|
|
72
74
|
return !toggle();
|
|
@@ -74,19 +76,19 @@ export const SidebarContainer: ParentComponent<SidebarContainerProps> = (props)
|
|
|
74
76
|
return toggle();
|
|
75
77
|
});
|
|
76
78
|
|
|
77
|
-
//
|
|
79
|
+
// Close on backdrop click
|
|
78
80
|
const handleBackdropClick = () => {
|
|
79
81
|
setToggle(false);
|
|
80
82
|
};
|
|
81
83
|
|
|
82
|
-
//
|
|
84
|
+
// Auto-close on page navigation on mobile
|
|
83
85
|
useBeforeLeave(() => {
|
|
84
86
|
if (!isDesktop() && toggle()) {
|
|
85
87
|
setToggle(false);
|
|
86
88
|
}
|
|
87
89
|
});
|
|
88
90
|
|
|
89
|
-
//
|
|
91
|
+
// Apply padding-left on desktop when sidebar is open (16rem = w-64)
|
|
90
92
|
const getPaddingLeft = () => {
|
|
91
93
|
if (isDesktop() && isOpen()) {
|
|
92
94
|
return "16rem";
|
|
@@ -111,7 +113,7 @@ export const SidebarContainer: ParentComponent<SidebarContainerProps> = (props)
|
|
|
111
113
|
onClick={handleBackdropClick}
|
|
112
114
|
onKeyDown={(e) => e.key === "Escape" && handleBackdropClick()}
|
|
113
115
|
role="button"
|
|
114
|
-
aria-label="
|
|
116
|
+
aria-label={i18n?.t("sidebar.closeSidebar") ?? "Close sidebar"}
|
|
115
117
|
tabIndex={0}
|
|
116
118
|
/>
|
|
117
119
|
</Show>
|
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
import { createContext, useContext, type Accessor, type Setter } from "solid-js";
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
|
-
* Tailwind sm: breakpoint
|
|
4
|
+
* Media query corresponding to Tailwind sm: breakpoint
|
|
5
5
|
* @see tailwind.config.ts screens.sm (640px)
|
|
6
6
|
*/
|
|
7
7
|
export const SM_MEDIA_QUERY = "(min-width: 640px)";
|
|
8
8
|
|
|
9
9
|
/**
|
|
10
|
-
*
|
|
10
|
+
* Sidebar toggle state shared Context
|
|
11
11
|
*
|
|
12
12
|
* @remarks
|
|
13
|
-
* toggle
|
|
14
|
-
* - `toggle=false` (
|
|
15
|
-
* - `toggle=true`:
|
|
13
|
+
* toggle semantics:
|
|
14
|
+
* - `toggle=false` (default): open on desktop (640px+), closed on mobile (640px-)
|
|
15
|
+
* - `toggle=true`: closed on desktop (640px+), open on mobile (640px-) as overlay
|
|
16
16
|
*/
|
|
17
17
|
export interface SidebarContextValue {
|
|
18
18
|
toggle: Accessor<boolean>;
|
|
@@ -24,16 +24,16 @@ export const SidebarContext = createContext<SidebarContextValue>();
|
|
|
24
24
|
export function useSidebarContext(): SidebarContextValue {
|
|
25
25
|
const context = useContext(SidebarContext);
|
|
26
26
|
if (!context) {
|
|
27
|
-
throw new Error("useSidebarContext
|
|
27
|
+
throw new Error("useSidebarContext can only be used inside SidebarContainer");
|
|
28
28
|
}
|
|
29
29
|
return context;
|
|
30
30
|
}
|
|
31
31
|
|
|
32
32
|
/**
|
|
33
|
-
*
|
|
33
|
+
* Optionally use SidebarContext (returns undefined if no Context)
|
|
34
34
|
*
|
|
35
35
|
* @remarks
|
|
36
|
-
*
|
|
36
|
+
* Used in components that can be used outside SidebarContainer (e.g., Topbar)
|
|
37
37
|
*/
|
|
38
38
|
export function useSidebarContextOptional(): SidebarContextValue | undefined {
|
|
39
39
|
return useContext(SidebarContext);
|
|
@@ -33,12 +33,12 @@ const headerClass = clsx(
|
|
|
33
33
|
|
|
34
34
|
export interface SidebarMenuProps extends Omit<JSX.HTMLAttributes<HTMLDivElement>, "children"> {
|
|
35
35
|
/**
|
|
36
|
-
*
|
|
36
|
+
* Menu items array
|
|
37
37
|
*/
|
|
38
38
|
menus: AppMenu[];
|
|
39
39
|
}
|
|
40
40
|
|
|
41
|
-
//
|
|
41
|
+
// Internal Context: share initial open state
|
|
42
42
|
interface MenuContextValue {
|
|
43
43
|
initialOpenItems: Accessor<Set<AppMenu>>;
|
|
44
44
|
}
|
|
@@ -46,25 +46,25 @@ interface MenuContextValue {
|
|
|
46
46
|
const MenuContext = createContext<MenuContextValue>();
|
|
47
47
|
|
|
48
48
|
/**
|
|
49
|
-
*
|
|
49
|
+
* Sidebar menu component
|
|
50
50
|
*
|
|
51
51
|
* @remarks
|
|
52
|
-
* - "MENU"
|
|
53
|
-
* - List/ListItem
|
|
54
|
-
* -
|
|
55
|
-
* -
|
|
56
|
-
* -
|
|
52
|
+
* - "MENU" header always shown
|
|
53
|
+
* - Recursive menu rendering with List/ListItem
|
|
54
|
+
* - Selection state determined by exact pathname match (ignores query string)
|
|
55
|
+
* - Parent items of selected menu automatically open on initial render
|
|
56
|
+
* - External links (containing ://) open in new tab
|
|
57
57
|
*
|
|
58
58
|
* @example
|
|
59
59
|
* ```tsx
|
|
60
60
|
* <SidebarMenu menus={[
|
|
61
|
-
* { title: "
|
|
61
|
+
* { title: "Dashboard", href: "/dashboard", icon: IconHome },
|
|
62
62
|
* {
|
|
63
|
-
* title: "
|
|
63
|
+
* title: "Settings",
|
|
64
64
|
* icon: IconSettings,
|
|
65
65
|
* children: [
|
|
66
|
-
* { title: "
|
|
67
|
-
* { title: "
|
|
66
|
+
* { title: "Profile", href: "/settings/profile" },
|
|
67
|
+
* { title: "Security", href: "/settings/security" },
|
|
68
68
|
* ],
|
|
69
69
|
* },
|
|
70
70
|
* ]} />
|
|
@@ -75,7 +75,7 @@ export const SidebarMenu: Component<SidebarMenuProps> = (props) => {
|
|
|
75
75
|
|
|
76
76
|
const location = useLocation();
|
|
77
77
|
|
|
78
|
-
//
|
|
78
|
+
// Find parents of menu matching current pathname and calculate open state
|
|
79
79
|
const findSelectedPath = (
|
|
80
80
|
menus: AppMenu[],
|
|
81
81
|
pathname: string,
|
|
@@ -94,11 +94,11 @@ export const SidebarMenu: Component<SidebarMenuProps> = (props) => {
|
|
|
94
94
|
return null;
|
|
95
95
|
};
|
|
96
96
|
|
|
97
|
-
//
|
|
97
|
+
// Recalculate open state in response to pathname change
|
|
98
98
|
const initialOpenItems = createMemo(() => {
|
|
99
99
|
const selectedPath = findSelectedPath(local.menus, location.pathname);
|
|
100
100
|
return selectedPath
|
|
101
|
-
? new Set(selectedPath.slice(0, -1)) //
|
|
101
|
+
? new Set(selectedPath.slice(0, -1)) // Open parents only, exclude last item (selected menu)
|
|
102
102
|
: new Set<AppMenu>();
|
|
103
103
|
});
|
|
104
104
|
|
|
@@ -128,18 +128,18 @@ const MenuItem: Component<MenuItemProps> = (props) => {
|
|
|
128
128
|
|
|
129
129
|
const hasChildren = () => props.menu.children !== undefined && props.menu.children.length > 0;
|
|
130
130
|
|
|
131
|
-
//
|
|
131
|
+
// Check if external link
|
|
132
132
|
const isExternalLink = () => props.menu.href?.includes("://") ?? false;
|
|
133
133
|
|
|
134
|
-
//
|
|
134
|
+
// Selection state
|
|
135
135
|
const isSelected = () => props.menu.href === location.pathname;
|
|
136
136
|
|
|
137
|
-
//
|
|
137
|
+
// Calculate open state (compare by object reference)
|
|
138
138
|
const shouldBeOpen = () => menuContext.initialOpenItems().has(props.menu);
|
|
139
139
|
|
|
140
140
|
const [open, setOpen] = createSignal(false);
|
|
141
141
|
|
|
142
|
-
//
|
|
142
|
+
// Update open state in response to pathname change
|
|
143
143
|
createEffect(() => {
|
|
144
144
|
if (shouldBeOpen()) {
|
|
145
145
|
setOpen(true);
|
|
@@ -40,44 +40,44 @@ export interface SidebarUserMenu {
|
|
|
40
40
|
|
|
41
41
|
export interface SidebarUserProps extends Omit<JSX.HTMLAttributes<HTMLDivElement>, "onClick"> {
|
|
42
42
|
/**
|
|
43
|
-
*
|
|
43
|
+
* User name (required)
|
|
44
44
|
*/
|
|
45
45
|
name: string;
|
|
46
46
|
|
|
47
47
|
/**
|
|
48
|
-
*
|
|
48
|
+
* Avatar icon (defaults to user icon if not provided)
|
|
49
49
|
*/
|
|
50
50
|
icon?: Component<TablerIconProps>;
|
|
51
51
|
|
|
52
52
|
/**
|
|
53
|
-
*
|
|
53
|
+
* Additional information (email, etc.; shows name only if not provided)
|
|
54
54
|
*/
|
|
55
55
|
description?: string;
|
|
56
56
|
|
|
57
57
|
/**
|
|
58
|
-
*
|
|
58
|
+
* Dropdown menu (clickable only when provided)
|
|
59
59
|
*/
|
|
60
60
|
menus?: SidebarUserMenu[];
|
|
61
61
|
}
|
|
62
62
|
|
|
63
63
|
/**
|
|
64
|
-
*
|
|
64
|
+
* Sidebar user information component
|
|
65
65
|
*
|
|
66
66
|
* @remarks
|
|
67
|
-
* - name, icon, description props
|
|
68
|
-
* -
|
|
69
|
-
* -
|
|
70
|
-
* -
|
|
71
|
-
* -
|
|
67
|
+
* - Displays user info via name, icon, description props
|
|
68
|
+
* - Shows default user icon if icon not provided
|
|
69
|
+
* - Shows name only with vertical centering if description not provided
|
|
70
|
+
* - Clickable and ripple effect apply only when menus provided
|
|
71
|
+
* - Click toggles dropdown menu
|
|
72
72
|
*
|
|
73
73
|
* @example
|
|
74
74
|
* ```tsx
|
|
75
75
|
* <SidebarUser
|
|
76
|
-
* name="
|
|
77
|
-
* description="
|
|
76
|
+
* name="John Doe"
|
|
77
|
+
* description="john@example.com"
|
|
78
78
|
* menus={[
|
|
79
|
-
* { title: "
|
|
80
|
-
* { title: "
|
|
79
|
+
* { title: "Profile", onClick: () => navigate("/profile") },
|
|
80
|
+
* { title: "Logout", onClick: handleLogout },
|
|
81
81
|
* ]}
|
|
82
82
|
* />
|
|
83
83
|
* ```
|
|
@@ -5,6 +5,7 @@ import { Icon } from "../../display/Icon";
|
|
|
5
5
|
import { twMerge } from "tailwind-merge";
|
|
6
6
|
import { Button } from "../../form-control/Button";
|
|
7
7
|
import { useSidebarContextOptional } from "../sidebar/SidebarContext";
|
|
8
|
+
import { useI18nOptional } from "../../../providers/i18n/I18nContext";
|
|
8
9
|
import { TopbarActions } from "./TopbarActions";
|
|
9
10
|
import { TopbarContainer } from "./TopbarContainer";
|
|
10
11
|
import { TopbarMenu } from "./TopbarMenu";
|
|
@@ -15,24 +16,24 @@ export type { TopbarMenuItem, TopbarMenuProps } from "./TopbarMenu";
|
|
|
15
16
|
export type { TopbarUserMenu, TopbarUserProps } from "./TopbarUser";
|
|
16
17
|
|
|
17
18
|
const baseClass = clsx(
|
|
18
|
-
//
|
|
19
|
+
// Layout
|
|
19
20
|
"flex",
|
|
20
21
|
"flex-row",
|
|
21
22
|
"gap-2",
|
|
22
23
|
"items-center",
|
|
23
|
-
//
|
|
24
|
+
// Size
|
|
24
25
|
"min-h-12",
|
|
25
26
|
"px-2",
|
|
26
|
-
//
|
|
27
|
+
// Background/border
|
|
27
28
|
"bg-white",
|
|
28
29
|
"dark:bg-base-900",
|
|
29
30
|
"border-b",
|
|
30
31
|
"border-base-200",
|
|
31
32
|
"dark:border-base-700",
|
|
32
|
-
//
|
|
33
|
+
// Scroll
|
|
33
34
|
"overflow-x-auto",
|
|
34
35
|
"overflow-y-hidden",
|
|
35
|
-
//
|
|
36
|
+
// Other
|
|
36
37
|
"select-none",
|
|
37
38
|
);
|
|
38
39
|
|
|
@@ -41,20 +42,20 @@ export interface TopbarProps extends JSX.HTMLAttributes<HTMLElement> {
|
|
|
41
42
|
}
|
|
42
43
|
|
|
43
44
|
/**
|
|
44
|
-
*
|
|
45
|
+
* Topbar main component
|
|
45
46
|
*
|
|
46
47
|
* @remarks
|
|
47
|
-
* -
|
|
48
|
-
* -
|
|
49
|
-
* -
|
|
48
|
+
* - Automatically shows sidebar toggle button if SidebarContext exists
|
|
49
|
+
* - Toggle button appears when used inside SidebarContainer
|
|
50
|
+
* - Acts as pure Topbar without toggle button when used standalone
|
|
50
51
|
*
|
|
51
52
|
* @example
|
|
52
53
|
* ```tsx
|
|
53
54
|
* <Topbar>
|
|
54
|
-
* <h1 class="text-lg font-bold"
|
|
55
|
+
* <h1 class="text-lg font-bold">App Name</h1>
|
|
55
56
|
* <Topbar.Menu menus={menuItems} />
|
|
56
57
|
* <div class="flex-1" />
|
|
57
|
-
* <Topbar.User menus={userMenus}
|
|
58
|
+
* <Topbar.User menus={userMenus}>User</Topbar.User>
|
|
58
59
|
* </Topbar>
|
|
59
60
|
* ```
|
|
60
61
|
*/
|
|
@@ -68,8 +69,9 @@ interface TopbarComponent extends ParentComponent<TopbarProps> {
|
|
|
68
69
|
const TopbarBase: ParentComponent<TopbarProps> = (props) => {
|
|
69
70
|
const [local, rest] = splitProps(props, ["children", "class"]);
|
|
70
71
|
|
|
71
|
-
//
|
|
72
|
+
// Optional use of SidebarContext (toggle button not shown if Context doesn't exist)
|
|
72
73
|
const sidebarContext = useSidebarContextOptional();
|
|
74
|
+
const i18n = useI18nOptional();
|
|
73
75
|
|
|
74
76
|
const handleToggle = () => {
|
|
75
77
|
sidebarContext?.setToggle((v) => !v);
|
|
@@ -80,7 +82,7 @@ const TopbarBase: ParentComponent<TopbarProps> = (props) => {
|
|
|
80
82
|
return (
|
|
81
83
|
<header {...rest} data-topbar class={getClassName()}>
|
|
82
84
|
<Show when={sidebarContext}>
|
|
83
|
-
<Button variant="ghost" onClick={handleToggle} class="p-2" aria-label="
|
|
85
|
+
<Button variant="ghost" onClick={handleToggle} class="p-2" aria-label={i18n?.t("topbar.toggleSidebar") ?? "Toggle sidebar"}>
|
|
84
86
|
<Icon icon={IconMenu2} size="1.5em" />
|
|
85
87
|
</Button>
|
|
86
88
|
</Show>
|
|
@@ -10,21 +10,21 @@ export interface TopbarContainerProps extends JSX.HTMLAttributes<HTMLDivElement>
|
|
|
10
10
|
}
|
|
11
11
|
|
|
12
12
|
/**
|
|
13
|
-
*
|
|
13
|
+
* Layout container wrapping Topbar and content area
|
|
14
14
|
*
|
|
15
15
|
* @remarks
|
|
16
|
-
* - `flex flex-col h-full`
|
|
17
|
-
* -
|
|
18
|
-
* -
|
|
16
|
+
* - Uses `flex flex-col h-full` structure to vertically layout Topbar and content
|
|
17
|
+
* - Shares actions state via TopbarContext.Provider
|
|
18
|
+
* - Parent element must have height specified
|
|
19
19
|
*
|
|
20
20
|
* @example
|
|
21
21
|
* ```tsx
|
|
22
22
|
* <TopbarContainer>
|
|
23
23
|
* <Topbar>
|
|
24
|
-
* <h1
|
|
24
|
+
* <h1>App Name</h1>
|
|
25
25
|
* <TopbarMenu menus={menuItems} />
|
|
26
26
|
* </Topbar>
|
|
27
|
-
* <main class="flex-1 overflow-auto"
|
|
27
|
+
* <main class="flex-1 overflow-auto">Content</main>
|
|
28
28
|
* </TopbarContainer>
|
|
29
29
|
* ```
|
|
30
30
|
*/
|
|
@@ -17,7 +17,7 @@ export const TopbarContext = createContext<TopbarContextValue>();
|
|
|
17
17
|
export function useTopbarActionsAccessor(): Accessor<JSX.Element | undefined> {
|
|
18
18
|
const context = useContext(TopbarContext);
|
|
19
19
|
if (!context) {
|
|
20
|
-
throw new Error("useTopbarActionsAccessor
|
|
20
|
+
throw new Error("useTopbarActionsAccessor can only be used inside Topbar.Container");
|
|
21
21
|
}
|
|
22
22
|
return context.actions;
|
|
23
23
|
}
|
|
@@ -25,7 +25,7 @@ export function useTopbarActionsAccessor(): Accessor<JSX.Element | undefined> {
|
|
|
25
25
|
export function createTopbarActions(accessor: () => JSX.Element): void {
|
|
26
26
|
const context = useContext(TopbarContext);
|
|
27
27
|
if (!context) {
|
|
28
|
-
throw new Error("createTopbarActions
|
|
28
|
+
throw new Error("createTopbarActions can only be used inside Topbar.Container");
|
|
29
29
|
}
|
|
30
30
|
|
|
31
31
|
context.setActions(() => accessor());
|
|
@@ -16,6 +16,7 @@ import { Button } from "../../form-control/Button";
|
|
|
16
16
|
import { Dropdown } from "../../disclosure/Dropdown";
|
|
17
17
|
import { List } from "../../data/list/List";
|
|
18
18
|
import { ListItem } from "../../data/list/ListItem";
|
|
19
|
+
import { useI18nOptional } from "../../../providers/i18n/I18nContext";
|
|
19
20
|
|
|
20
21
|
const desktopNavBaseClass = clsx("hidden sm:flex", "flex-row gap-1", "items-center");
|
|
21
22
|
const mobileWrapperClass = clsx("flex sm:hidden");
|
|
@@ -30,31 +31,31 @@ export interface TopbarMenuItem {
|
|
|
30
31
|
|
|
31
32
|
export interface TopbarMenuProps extends Omit<JSX.HTMLAttributes<HTMLElement>, "children"> {
|
|
32
33
|
/**
|
|
33
|
-
*
|
|
34
|
+
* Menu items array
|
|
34
35
|
*/
|
|
35
36
|
menus: TopbarMenuItem[];
|
|
36
37
|
}
|
|
37
38
|
|
|
38
39
|
/**
|
|
39
|
-
* Topbar
|
|
40
|
+
* Topbar dropdown menu component
|
|
40
41
|
*
|
|
41
42
|
* @remarks
|
|
42
|
-
* -
|
|
43
|
-
* -
|
|
44
|
-
* -
|
|
45
|
-
* -
|
|
46
|
-
* -
|
|
43
|
+
* - Items with children: show dropdown on click
|
|
44
|
+
* - Items without children: navigate directly on click
|
|
45
|
+
* - External links (containing ://): open in new tab
|
|
46
|
+
* - Selection determined by exact pathname match
|
|
47
|
+
* - Submenus rendered with List/ListItem (all levels expanded)
|
|
47
48
|
*
|
|
48
49
|
* @example
|
|
49
50
|
* ```tsx
|
|
50
51
|
* <TopbarMenu menus={[
|
|
51
|
-
* { title: "
|
|
52
|
+
* { title: "Dashboard", href: "/dashboard", icon: IconHome },
|
|
52
53
|
* {
|
|
53
|
-
* title: "
|
|
54
|
+
* title: "Menu 1",
|
|
54
55
|
* icon: IconFolder,
|
|
55
56
|
* children: [
|
|
56
|
-
* { title: "
|
|
57
|
-
* { title: "
|
|
57
|
+
* { title: "Submenu 1", href: "/menu1/sub1" },
|
|
58
|
+
* { title: "Submenu 2", href: "/menu1/sub2" },
|
|
58
59
|
* ],
|
|
59
60
|
* },
|
|
60
61
|
* ]} />
|
|
@@ -63,21 +64,22 @@ export interface TopbarMenuProps extends Omit<JSX.HTMLAttributes<HTMLElement>, "
|
|
|
63
64
|
export const TopbarMenu: Component<TopbarMenuProps> = (props) => {
|
|
64
65
|
const [local, rest] = splitProps(props, ["menus", "class"]);
|
|
65
66
|
const [mobileMenuOpen, setMobileMenuOpen] = createSignal(false);
|
|
67
|
+
const i18n = useI18nOptional();
|
|
66
68
|
|
|
67
69
|
return (
|
|
68
70
|
<>
|
|
69
|
-
{/*
|
|
71
|
+
{/* Desktop menu (shown only on 640px and above) */}
|
|
70
72
|
<nav {...rest} data-topbar-menu class={twMerge(desktopNavBaseClass, local.class)}>
|
|
71
73
|
<For each={local.menus}>{(menu) => <TopbarMenuButton menu={menu} />}</For>
|
|
72
74
|
</nav>
|
|
73
75
|
|
|
74
|
-
{/*
|
|
76
|
+
{/* Mobile hamburger (shown only below 640px) */}
|
|
75
77
|
<div class={mobileWrapperClass}>
|
|
76
78
|
<Dropdown open={mobileMenuOpen()} onOpenChange={setMobileMenuOpen}>
|
|
77
79
|
<Dropdown.Trigger>
|
|
78
80
|
<Button
|
|
79
81
|
variant="ghost"
|
|
80
|
-
aria-label="
|
|
82
|
+
aria-label={i18n?.t("topbarMenu.menu") ?? "Menu"}
|
|
81
83
|
aria-haspopup="menu"
|
|
82
84
|
aria-expanded={mobileMenuOpen()}
|
|
83
85
|
>
|
|
@@ -120,7 +122,7 @@ const TopbarMenuButton: Component<TopbarMenuButtonProps> = (props) => {
|
|
|
120
122
|
return false;
|
|
121
123
|
};
|
|
122
124
|
|
|
123
|
-
//
|
|
125
|
+
// Check if current menu or submenu is selected (cached with createMemo)
|
|
124
126
|
const isSelected = createMemo(() => {
|
|
125
127
|
if (props.menu.href === location.pathname) return true;
|
|
126
128
|
if (props.menu.children) {
|
|
@@ -200,7 +202,7 @@ const TopbarMenuDropdownItem: Component<TopbarMenuDropdownItemProps> = (props) =
|
|
|
200
202
|
}
|
|
201
203
|
props.onClose();
|
|
202
204
|
}
|
|
203
|
-
// href
|
|
205
|
+
// if no href but has children, clicking doesn't close the menu
|
|
204
206
|
};
|
|
205
207
|
|
|
206
208
|
return (
|
|
@@ -18,31 +18,31 @@ export interface TopbarUserMenu {
|
|
|
18
18
|
|
|
19
19
|
export interface TopbarUserProps extends Omit<JSX.HTMLAttributes<HTMLDivElement>, "onClick"> {
|
|
20
20
|
/**
|
|
21
|
-
*
|
|
21
|
+
* Dropdown menu (dropdown shown only when provided)
|
|
22
22
|
*/
|
|
23
23
|
menus?: TopbarUserMenu[];
|
|
24
24
|
|
|
25
25
|
/**
|
|
26
|
-
*
|
|
26
|
+
* User information area (customizable)
|
|
27
27
|
*/
|
|
28
28
|
children: JSX.Element;
|
|
29
29
|
}
|
|
30
30
|
|
|
31
31
|
/**
|
|
32
|
-
* Topbar
|
|
32
|
+
* Topbar user information component
|
|
33
33
|
*
|
|
34
34
|
* @remarks
|
|
35
|
-
* -
|
|
36
|
-
* - menus
|
|
37
|
-
* - Button
|
|
35
|
+
* - Customize user info display with children
|
|
36
|
+
* - When menus provided, click shows Dropdown menu
|
|
37
|
+
* - Uses Button's ghost style
|
|
38
38
|
*
|
|
39
39
|
* @example
|
|
40
40
|
* ```tsx
|
|
41
41
|
* <TopbarUser menus={[
|
|
42
|
-
* { title: "
|
|
43
|
-
* { title: "
|
|
42
|
+
* { title: "Profile", onClick: () => navigate("/profile") },
|
|
43
|
+
* { title: "Logout", onClick: handleLogout },
|
|
44
44
|
* ]}>
|
|
45
|
-
* <span
|
|
45
|
+
* <span>Username</span>
|
|
46
46
|
* </TopbarUser>
|
|
47
47
|
* ```
|
|
48
48
|
*/
|