@simplysm/solid 13.0.69 → 13.0.70
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 +24 -24
- package/dist/components/disclosure/Tabs.js +1 -1
- package/dist/components/disclosure/Tabs.js.map +1 -1
- package/dist/components/disclosure/dialogZIndex.d.ts +7 -7
- package/dist/components/disclosure/dialogZIndex.d.ts.map +1 -1
- package/dist/components/features/crud-detail/CrudDetail.d.ts.map +1 -1
- package/dist/components/features/crud-detail/CrudDetail.js +19 -16
- 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 +34 -28
- package/dist/components/features/crud-sheet/CrudSheet.js.map +2 -2
- 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 +6 -2
- 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 +8 -2
- 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 -13
- package/dist/components/features/shared-data/SharedDataSelectList.d.ts.map +1 -1
- package/dist/components/features/shared-data/SharedDataSelectList.js +219 -58
- 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 +4 -1
- package/dist/helpers/createAppStructure.js.map +1 -1
- 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.js +1 -1
- package/dist/hooks/createSelectionGroup.js.map +1 -1
- 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 +8 -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 +64 -64
- package/src/components/disclosure/Tabs.tsx +1 -1
- package/src/components/disclosure/dialogZIndex.ts +11 -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 +18 -16
- 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 +39 -37
- 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/data-select-button/DataSelectButton.tsx +34 -32
- package/src/components/features/permission-table/PermissionTable.tsx +22 -19
- package/src/components/features/shared-data/SharedDataSelect.tsx +22 -20
- package/src/components/features/shared-data/SharedDataSelectButton.tsx +10 -10
- package/src/components/features/shared-data/SharedDataSelectList.tsx +245 -48
- 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 +84 -84
- 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 +12 -6
- 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 +1 -1
- 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 +213 -0
- package/tests/components/disclosure/Tabs.spec.tsx +220 -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/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 +463 -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
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { createContext, useContext, type JSX, type ParentComponent, onCleanup } from "solid-js";
|
|
2
|
+
import { createSlotComponent } from "../../../helpers/createSlotComponent";
|
|
3
|
+
import type { SlotAccessor } from "../../../hooks/createSlotSignal";
|
|
4
|
+
|
|
5
|
+
// ─── Context ──────────────────────────────────────────────
|
|
6
|
+
|
|
7
|
+
export interface SharedDataSelectListContextValue {
|
|
8
|
+
setItemTemplate: (fn: ((...args: unknown[]) => JSX.Element) | undefined) => void;
|
|
9
|
+
setFilter: (content: SlotAccessor) => void;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export const SharedDataSelectListContext = createContext<SharedDataSelectListContextValue>();
|
|
13
|
+
|
|
14
|
+
export function useSharedDataSelectListContext(): SharedDataSelectListContextValue {
|
|
15
|
+
const context = useContext(SharedDataSelectListContext);
|
|
16
|
+
if (!context) {
|
|
17
|
+
throw new Error("useSharedDataSelectListContext can only be used inside SharedDataSelectList");
|
|
18
|
+
}
|
|
19
|
+
return context;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
// ─── Sub-components ───────────────────────────────────────
|
|
23
|
+
|
|
24
|
+
/** ItemTemplate sub-component — registers item render function */
|
|
25
|
+
export const SharedDataSelectListItemTemplate = <TItem,>(props: {
|
|
26
|
+
children: (item: TItem, index: number) => JSX.Element;
|
|
27
|
+
}) => {
|
|
28
|
+
const ctx = useSharedDataSelectListContext();
|
|
29
|
+
// eslint-disable-next-line solid/reactivity -- Store render function in signal, called from JSX tracked scope
|
|
30
|
+
ctx.setItemTemplate(props.children as (...args: unknown[]) => JSX.Element);
|
|
31
|
+
onCleanup(() => ctx.setItemTemplate(undefined));
|
|
32
|
+
return null;
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
/** Filter sub-component — registers custom filter UI slot */
|
|
36
|
+
export const SharedDataSelectListFilter: ParentComponent = createSlotComponent(
|
|
37
|
+
SharedDataSelectListContext,
|
|
38
|
+
(ctx) => ctx.setFilter,
|
|
39
|
+
);
|
|
@@ -10,7 +10,7 @@ import {
|
|
|
10
10
|
export type ProgressTheme = SemanticTheme;
|
|
11
11
|
|
|
12
12
|
export interface ProgressProps extends JSX.HTMLAttributes<HTMLDivElement> {
|
|
13
|
-
/**
|
|
13
|
+
/** Progress value (range 0-1, 0 = 0%, 1 = 100%) */
|
|
14
14
|
value: number;
|
|
15
15
|
theme?: ProgressTheme;
|
|
16
16
|
size?: ComponentSizeCompact;
|
|
@@ -14,9 +14,9 @@ import { createMountTransition } from "../../../hooks/createMountTransition";
|
|
|
14
14
|
import "./BusyContainer.css";
|
|
15
15
|
|
|
16
16
|
export interface BusyContainerProps extends Omit<JSX.HTMLAttributes<HTMLDivElement>, "children"> {
|
|
17
|
-
/**
|
|
17
|
+
/** Show loading overlay (children are preserved) */
|
|
18
18
|
busy?: boolean;
|
|
19
|
-
/** false
|
|
19
|
+
/** If false, children are hidden and loading overlay is shown. Used for initial data loading */
|
|
20
20
|
ready?: boolean;
|
|
21
21
|
variant?: BusyVariant;
|
|
22
22
|
message?: string;
|
|
@@ -26,7 +26,7 @@ export interface BusyContainerProps extends Omit<JSX.HTMLAttributes<HTMLDivEleme
|
|
|
26
26
|
|
|
27
27
|
const baseClass = clsx("relative", "size-full", "min-h-[70px] min-w-[70px]", "overflow-auto");
|
|
28
28
|
|
|
29
|
-
// eslint-disable-next-line tailwindcss/enforces-shorthand -- inset
|
|
29
|
+
// eslint-disable-next-line tailwindcss/enforces-shorthand -- inset is only supported in Chrome 87+
|
|
30
30
|
const screenBaseClass = clsx(
|
|
31
31
|
"absolute bottom-0 left-0 right-0 top-0",
|
|
32
32
|
"z-busy",
|
|
@@ -71,7 +71,7 @@ export const BusyContainer: ParentComponent<BusyContainerProps> = (props) => {
|
|
|
71
71
|
const busyCtx = useContext(BusyContext);
|
|
72
72
|
const currVariant = (): BusyVariant => local.variant ?? busyCtx?.variant() ?? "spinner";
|
|
73
73
|
|
|
74
|
-
//
|
|
74
|
+
// Animation state (mount transition)
|
|
75
75
|
const { mounted, animating, unmount } = createMountTransition(
|
|
76
76
|
() => local.ready === false || !!local.busy,
|
|
77
77
|
);
|
|
@@ -83,7 +83,7 @@ export const BusyContainer: ParentComponent<BusyContainerProps> = (props) => {
|
|
|
83
83
|
}
|
|
84
84
|
};
|
|
85
85
|
|
|
86
|
-
//
|
|
86
|
+
// Block keyboard input (capture phase)
|
|
87
87
|
let containerRef!: HTMLDivElement;
|
|
88
88
|
|
|
89
89
|
createEffect(() => {
|
|
@@ -106,7 +106,7 @@ export const BusyContainer: ParentComponent<BusyContainerProps> = (props) => {
|
|
|
106
106
|
animating() ? "pointer-events-auto opacity-100" : "pointer-events-none opacity-0",
|
|
107
107
|
);
|
|
108
108
|
|
|
109
|
-
// spinner:
|
|
109
|
+
// spinner: slide down animation
|
|
110
110
|
const rectClass = () => {
|
|
111
111
|
if (currVariant() !== "spinner") return "";
|
|
112
112
|
return clsx(
|
|
@@ -1,38 +1,38 @@
|
|
|
1
1
|
import { createContext, useContext, type Accessor } from "solid-js";
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
|
-
* Busy
|
|
5
|
-
* - `spinner`:
|
|
6
|
-
* - `bar`:
|
|
4
|
+
* Busy overlay display type
|
|
5
|
+
* - `spinner`: Full-screen spinner
|
|
6
|
+
* - `bar`: Top progress bar
|
|
7
7
|
*/
|
|
8
8
|
export type BusyVariant = "spinner" | "bar";
|
|
9
9
|
|
|
10
10
|
/**
|
|
11
|
-
* Busy
|
|
11
|
+
* Busy overlay Context value
|
|
12
12
|
*/
|
|
13
13
|
export interface BusyContextValue {
|
|
14
|
-
/**
|
|
14
|
+
/** Current display type */
|
|
15
15
|
variant: Accessor<BusyVariant>;
|
|
16
|
-
/**
|
|
16
|
+
/** Show overlay (nestable calls, requires matching hide calls) */
|
|
17
17
|
show: (message?: string) => void;
|
|
18
|
-
/**
|
|
18
|
+
/** Hide overlay (actually hides after all show calls have corresponding hide calls) */
|
|
19
19
|
hide: () => void;
|
|
20
|
-
/**
|
|
20
|
+
/** Set progress bar progress (0-100, undefined for indeterminate) */
|
|
21
21
|
setProgress: (percent: number | undefined) => void;
|
|
22
22
|
}
|
|
23
23
|
|
|
24
|
-
/** Busy
|
|
24
|
+
/** Busy overlay Context */
|
|
25
25
|
export const BusyContext = createContext<BusyContextValue>();
|
|
26
26
|
|
|
27
27
|
/**
|
|
28
|
-
*
|
|
28
|
+
* Hook to access Busy overlay
|
|
29
29
|
*
|
|
30
|
-
* @throws BusyProvider
|
|
30
|
+
* @throws Error if BusyProvider is not present
|
|
31
31
|
*/
|
|
32
32
|
export function useBusy(): BusyContextValue {
|
|
33
33
|
const context = useContext(BusyContext);
|
|
34
34
|
if (!context) {
|
|
35
|
-
throw new Error("useBusy
|
|
35
|
+
throw new Error("useBusy can only be used inside BusyProvider");
|
|
36
36
|
}
|
|
37
37
|
return context;
|
|
38
38
|
}
|
|
@@ -6,19 +6,19 @@ import { BusyContainer } from "./BusyContainer";
|
|
|
6
6
|
|
|
7
7
|
const overlayClass = clsx("fixed left-0 top-0", "h-screen w-screen", "overflow-hidden");
|
|
8
8
|
|
|
9
|
-
/** BusyProvider
|
|
9
|
+
/** BusyProvider configuration */
|
|
10
10
|
export interface BusyProviderProps {
|
|
11
|
-
/**
|
|
11
|
+
/** Display style (default: `"spinner"`) */
|
|
12
12
|
variant?: BusyVariant;
|
|
13
13
|
}
|
|
14
14
|
|
|
15
15
|
/**
|
|
16
|
-
* Busy
|
|
16
|
+
* Busy Overlay Provider
|
|
17
17
|
*
|
|
18
18
|
* @remarks
|
|
19
|
-
* - show/hide
|
|
20
|
-
* - Portal
|
|
21
|
-
* -
|
|
19
|
+
* - show/hide can be nested (managed with internal counter)
|
|
20
|
+
* - Renders via Portal to always display on top
|
|
21
|
+
* - Works independently (no other Provider dependencies)
|
|
22
22
|
*/
|
|
23
23
|
export const BusyProvider: ParentComponent<BusyProviderProps> = (props) => {
|
|
24
24
|
const [busyCount, setBusyCount] = createSignal(0);
|
|
@@ -3,6 +3,7 @@ import { Portal } from "solid-js/web";
|
|
|
3
3
|
import clsx from "clsx";
|
|
4
4
|
import { IconX } from "@tabler/icons-solidjs";
|
|
5
5
|
import { useNotification } from "./NotificationContext";
|
|
6
|
+
import { useI18nOptional } from "../../../providers/i18n/I18nContext";
|
|
6
7
|
import { Icon } from "../../display/Icon";
|
|
7
8
|
import { themeTokens } from "../../../styles/tokens.styles";
|
|
8
9
|
|
|
@@ -38,6 +39,7 @@ const dismissButtonClass = clsx("rounded", "p-1", "hover:bg-white/20");
|
|
|
38
39
|
|
|
39
40
|
export const NotificationBanner: Component = () => {
|
|
40
41
|
const notification = useNotification();
|
|
42
|
+
const i18n = useI18nOptional();
|
|
41
43
|
|
|
42
44
|
const handleDismiss = () => {
|
|
43
45
|
notification.dismissBanner();
|
|
@@ -72,7 +74,7 @@ export const NotificationBanner: Component = () => {
|
|
|
72
74
|
</Show>
|
|
73
75
|
<button
|
|
74
76
|
type="button"
|
|
75
|
-
aria-label="
|
|
77
|
+
aria-label={i18n?.t("notification.close") ?? "Close notification"}
|
|
76
78
|
class={dismissButtonClass}
|
|
77
79
|
onClick={handleDismiss}
|
|
78
80
|
>
|
|
@@ -78,7 +78,7 @@ export const NotificationBell: Component<NotificationBellProps> = (props) => {
|
|
|
78
78
|
type="button"
|
|
79
79
|
data-notification-bell
|
|
80
80
|
class={buttonClass}
|
|
81
|
-
aria-label={
|
|
81
|
+
aria-label={`${notification.unreadCount()} notifications`}
|
|
82
82
|
aria-haspopup="true"
|
|
83
83
|
aria-expanded={open()}
|
|
84
84
|
>
|
|
@@ -93,7 +93,7 @@ export const NotificationBell: Component<NotificationBellProps> = (props) => {
|
|
|
93
93
|
<Dropdown.Content>
|
|
94
94
|
<div class="w-80 p-2">
|
|
95
95
|
<div class={dropdownHeaderClass}>
|
|
96
|
-
<span class="font-bold"
|
|
96
|
+
<span class="font-bold">Notifications</span>
|
|
97
97
|
<Show when={notification.items().length > 0}>
|
|
98
98
|
<button
|
|
99
99
|
type="button"
|
|
@@ -101,14 +101,14 @@ export const NotificationBell: Component<NotificationBellProps> = (props) => {
|
|
|
101
101
|
class={clearButtonClass}
|
|
102
102
|
onClick={handleClear}
|
|
103
103
|
>
|
|
104
|
-
|
|
104
|
+
Clear All
|
|
105
105
|
</button>
|
|
106
106
|
</Show>
|
|
107
107
|
</div>
|
|
108
108
|
|
|
109
109
|
<Show
|
|
110
110
|
when={notification.items().length > 0}
|
|
111
|
-
fallback={<div class={emptyClass}
|
|
111
|
+
fallback={<div class={emptyClass}>No notifications</div>}
|
|
112
112
|
>
|
|
113
113
|
<div class={listClass}>
|
|
114
114
|
<For each={[...notification.items()].reverse()}>
|
|
@@ -1,95 +1,95 @@
|
|
|
1
1
|
import { type Accessor, createContext, useContext } from "solid-js";
|
|
2
2
|
|
|
3
|
-
/**
|
|
3
|
+
/** Notification theme */
|
|
4
4
|
export type NotificationTheme = "info" | "success" | "warning" | "danger";
|
|
5
5
|
|
|
6
|
-
/**
|
|
6
|
+
/** Notification action button */
|
|
7
7
|
export interface NotificationAction {
|
|
8
|
-
/**
|
|
8
|
+
/** Button text */
|
|
9
9
|
label: string;
|
|
10
|
-
/**
|
|
10
|
+
/** Click handler */
|
|
11
11
|
onClick: () => void;
|
|
12
12
|
}
|
|
13
13
|
|
|
14
|
-
/**
|
|
14
|
+
/** Notification item */
|
|
15
15
|
export interface NotificationItem {
|
|
16
|
-
/**
|
|
16
|
+
/** Unique identifier */
|
|
17
17
|
id: string;
|
|
18
|
-
/**
|
|
18
|
+
/** Theme (info, success, warning, danger) */
|
|
19
19
|
theme: NotificationTheme;
|
|
20
|
-
/**
|
|
20
|
+
/** Notification title */
|
|
21
21
|
title: string;
|
|
22
|
-
/**
|
|
22
|
+
/** Notification message (optional) */
|
|
23
23
|
message?: string;
|
|
24
|
-
/**
|
|
24
|
+
/** Action button (optional) */
|
|
25
25
|
action?: NotificationAction;
|
|
26
|
-
/**
|
|
26
|
+
/** Creation time */
|
|
27
27
|
createdAt: Date;
|
|
28
|
-
/**
|
|
28
|
+
/** Read status */
|
|
29
29
|
read: boolean;
|
|
30
30
|
}
|
|
31
31
|
|
|
32
|
-
/**
|
|
32
|
+
/** Notification creation options */
|
|
33
33
|
export interface NotificationOptions {
|
|
34
|
-
/**
|
|
34
|
+
/** Action button to display in notification */
|
|
35
35
|
action?: NotificationAction;
|
|
36
36
|
}
|
|
37
37
|
|
|
38
|
-
/**
|
|
38
|
+
/** Notification update options */
|
|
39
39
|
export interface NotificationUpdateOptions {
|
|
40
|
-
/** true
|
|
40
|
+
/** If true, mark read notification as unread (redisplay banner) */
|
|
41
41
|
renotify?: boolean;
|
|
42
42
|
}
|
|
43
43
|
|
|
44
44
|
/**
|
|
45
|
-
*
|
|
45
|
+
* Notification system Context value
|
|
46
46
|
*
|
|
47
47
|
* @remarks
|
|
48
|
-
*
|
|
49
|
-
*
|
|
48
|
+
* Provides methods to create, update, delete, and manage read status of notifications.
|
|
49
|
+
* Maintains up to 50 notifications; older items are removed when exceeded.
|
|
50
50
|
*/
|
|
51
51
|
export interface NotificationContextValue {
|
|
52
|
-
//
|
|
52
|
+
// State
|
|
53
53
|
items: Accessor<NotificationItem[]>;
|
|
54
54
|
unreadCount: Accessor<number>;
|
|
55
55
|
latestUnread: Accessor<NotificationItem | undefined>;
|
|
56
56
|
|
|
57
|
-
//
|
|
57
|
+
// Create notification (returns id)
|
|
58
58
|
info: (title: string, message?: string, options?: NotificationOptions) => string;
|
|
59
59
|
success: (title: string, message?: string, options?: NotificationOptions) => string;
|
|
60
60
|
warning: (title: string, message?: string, options?: NotificationOptions) => string;
|
|
61
61
|
danger: (title: string, message?: string, options?: NotificationOptions) => string;
|
|
62
62
|
error: (err?: any, header?: string) => void;
|
|
63
63
|
|
|
64
|
-
//
|
|
64
|
+
// Update notification
|
|
65
65
|
update: (
|
|
66
66
|
id: string,
|
|
67
67
|
updates: Partial<Pick<NotificationItem, "title" | "message" | "theme" | "action">>,
|
|
68
68
|
options?: NotificationUpdateOptions,
|
|
69
69
|
) => void;
|
|
70
70
|
|
|
71
|
-
//
|
|
71
|
+
// Delete notification
|
|
72
72
|
remove: (id: string) => void;
|
|
73
73
|
|
|
74
|
-
//
|
|
74
|
+
// Management
|
|
75
75
|
markAsRead: (id: string) => void;
|
|
76
76
|
markAllAsRead: () => void;
|
|
77
77
|
dismissBanner: () => void;
|
|
78
78
|
clear: () => void;
|
|
79
79
|
}
|
|
80
80
|
|
|
81
|
-
/**
|
|
81
|
+
/** Notification system Context */
|
|
82
82
|
export const NotificationContext = createContext<NotificationContextValue>();
|
|
83
83
|
|
|
84
84
|
/**
|
|
85
|
-
*
|
|
85
|
+
* Hook to access the notification system
|
|
86
86
|
*
|
|
87
|
-
* @throws
|
|
87
|
+
* @throws Error if used outside NotificationProvider
|
|
88
88
|
*/
|
|
89
89
|
export function useNotification(): NotificationContextValue {
|
|
90
90
|
const context = useContext(NotificationContext);
|
|
91
91
|
if (!context) {
|
|
92
|
-
throw new Error("useNotification
|
|
92
|
+
throw new Error("useNotification can only be used inside NotificationProvider");
|
|
93
93
|
}
|
|
94
94
|
return context;
|
|
95
95
|
}
|
|
@@ -12,13 +12,13 @@ import { useLogger } from "../../../hooks/useLogger";
|
|
|
12
12
|
const MAX_ITEMS = 50;
|
|
13
13
|
|
|
14
14
|
/**
|
|
15
|
-
*
|
|
15
|
+
* Notification system Provider
|
|
16
16
|
*
|
|
17
17
|
* @remarks
|
|
18
|
-
* -
|
|
19
|
-
* -
|
|
20
|
-
* -
|
|
21
|
-
* -
|
|
18
|
+
* - Maintains up to 50 notifications (older items auto-removed)
|
|
19
|
+
* - Shows latest unread notification in banner
|
|
20
|
+
* - Includes aria-live region for screen readers
|
|
21
|
+
* - Logs errors to logger if LoggerProvider is present
|
|
22
22
|
*/
|
|
23
23
|
export const NotificationProvider: ParentComponent = (props) => {
|
|
24
24
|
const logger = useLogger();
|
|
@@ -99,10 +99,10 @@ export const NotificationProvider: ParentComponent = (props) => {
|
|
|
99
99
|
|
|
100
100
|
const updated = { ...item, ...updates };
|
|
101
101
|
|
|
102
|
-
// renotify:
|
|
102
|
+
// renotify: if read, change back to unread
|
|
103
103
|
if (options?.renotify && item.read) {
|
|
104
104
|
updated.read = false;
|
|
105
|
-
//
|
|
105
|
+
// if dismissed banner is renotified, show it again
|
|
106
106
|
setDismissedBannerId(null);
|
|
107
107
|
}
|
|
108
108
|
|
|
@@ -155,10 +155,10 @@ export const NotificationProvider: ParentComponent = (props) => {
|
|
|
155
155
|
|
|
156
156
|
return (
|
|
157
157
|
<NotificationContext.Provider value={contextValue}>
|
|
158
|
-
{/*
|
|
158
|
+
{/* Screen reader Live Region */}
|
|
159
159
|
<div role="status" aria-live="polite" aria-atomic="true" class="sr-only">
|
|
160
160
|
<Show when={latestUnread()}>
|
|
161
|
-
{(item) =>
|
|
161
|
+
{(item) => `Notification: ${item().title} ${item().message ?? ""}`}
|
|
162
162
|
</Show>
|
|
163
163
|
</div>
|
|
164
164
|
{props.children}
|
|
@@ -15,6 +15,6 @@ export const PrintContext = createContext<PrintContextValue>();
|
|
|
15
15
|
|
|
16
16
|
export function usePrint(): PrintContextValue {
|
|
17
17
|
const ctx = useContext(PrintContext);
|
|
18
|
-
if (!ctx) throw new Error("usePrint
|
|
18
|
+
if (!ctx) throw new Error("usePrint can only be used inside PrintProvider");
|
|
19
19
|
return ctx;
|
|
20
20
|
}
|
|
@@ -38,7 +38,7 @@ export const triggerSizeClasses: Record<ComponentSize, string> = {
|
|
|
38
38
|
|
|
39
39
|
export const chevronWrapperClass = clsx("opacity-30", "hover:opacity-100");
|
|
40
40
|
|
|
41
|
-
/** Select/Combobox
|
|
41
|
+
/** Select/Combobox shared trigger class builder */
|
|
42
42
|
export function getTriggerClass(options: {
|
|
43
43
|
size?: ComponentSize;
|
|
44
44
|
disabled?: boolean;
|
|
@@ -27,13 +27,13 @@ export const Invalid: ParentComponent<InvalidProps> = (props) => {
|
|
|
27
27
|
|
|
28
28
|
const resolved = children(() => props.children);
|
|
29
29
|
|
|
30
|
-
//
|
|
30
|
+
// Reactively update setCustomValidity when message changes (always, regardless of touchMode)
|
|
31
31
|
createEffect(() => {
|
|
32
32
|
const msg = props.message ?? "";
|
|
33
33
|
hiddenInputEl.setCustomValidity(msg);
|
|
34
34
|
});
|
|
35
35
|
|
|
36
|
-
// target
|
|
36
|
+
// Set target to relative + insert hidden input inside target
|
|
37
37
|
createEffect(() => {
|
|
38
38
|
const targetEl = resolved.toArray().find((el): el is HTMLElement => el instanceof HTMLElement);
|
|
39
39
|
if (!targetEl) return;
|
|
@@ -52,7 +52,7 @@ export const Invalid: ParentComponent<InvalidProps> = (props) => {
|
|
|
52
52
|
});
|
|
53
53
|
});
|
|
54
54
|
|
|
55
|
-
//
|
|
55
|
+
// Handle visual indication
|
|
56
56
|
createEffect(() => {
|
|
57
57
|
const variant = props.variant ?? "dot";
|
|
58
58
|
const message = props.message ?? "";
|
|
@@ -102,7 +102,7 @@ export const Invalid: ParentComponent<InvalidProps> = (props) => {
|
|
|
102
102
|
}
|
|
103
103
|
});
|
|
104
104
|
|
|
105
|
-
// touchMode:
|
|
105
|
+
// touchMode: register focusout event on target to track touched state
|
|
106
106
|
createEffect(() => {
|
|
107
107
|
if (!(props.touchMode ?? false)) return;
|
|
108
108
|
|
|
@@ -121,7 +121,7 @@ export const Invalid: ParentComponent<InvalidProps> = (props) => {
|
|
|
121
121
|
});
|
|
122
122
|
});
|
|
123
123
|
|
|
124
|
-
// hidden input
|
|
124
|
+
// Redirect hidden input focus to focusable child of target
|
|
125
125
|
hiddenInputEl.addEventListener("focus", () => {
|
|
126
126
|
const targetEl = resolved.toArray().find((el): el is HTMLElement => el instanceof HTMLElement);
|
|
127
127
|
|
|
@@ -19,33 +19,33 @@ const iconSizes: Record<"sm" | "lg", string> = {
|
|
|
19
19
|
};
|
|
20
20
|
|
|
21
21
|
const modeLabels: Record<ThemeMode, string> = {
|
|
22
|
-
light: "
|
|
23
|
-
system: "
|
|
24
|
-
dark: "
|
|
22
|
+
light: "Light mode",
|
|
23
|
+
system: "System settings",
|
|
24
|
+
dark: "Dark mode",
|
|
25
25
|
};
|
|
26
26
|
|
|
27
27
|
export interface ThemeToggleProps extends Omit<
|
|
28
28
|
JSX.ButtonHTMLAttributes<HTMLButtonElement>,
|
|
29
29
|
"children"
|
|
30
30
|
> {
|
|
31
|
-
/**
|
|
31
|
+
/** Button size */
|
|
32
32
|
size?: "sm" | "lg";
|
|
33
33
|
}
|
|
34
34
|
|
|
35
35
|
/**
|
|
36
|
-
*
|
|
36
|
+
* Theme toggle button component
|
|
37
37
|
*
|
|
38
38
|
* @remarks
|
|
39
|
-
* -
|
|
40
|
-
* -
|
|
41
|
-
* -
|
|
39
|
+
* - Must be used inside ThemeProvider
|
|
40
|
+
* - Cycles through light → system → dark → light on click
|
|
41
|
+
* - Shows appropriate icon for current mode (☀️ / 💻 / 🌙)
|
|
42
42
|
*
|
|
43
43
|
* @example
|
|
44
44
|
* ```tsx
|
|
45
|
-
* //
|
|
45
|
+
* // Basic usage
|
|
46
46
|
* <ThemeToggle />
|
|
47
47
|
*
|
|
48
|
-
* //
|
|
48
|
+
* // Adjust size
|
|
49
49
|
* <ThemeToggle size="sm" />
|
|
50
50
|
* <ThemeToggle size="lg" />
|
|
51
51
|
* ```
|
|
@@ -12,7 +12,7 @@ import { insetBase, insetFocusOutlineSelf } from "../../../styles/patterns.style
|
|
|
12
12
|
|
|
13
13
|
export type CheckboxSize = ComponentSize;
|
|
14
14
|
|
|
15
|
-
// wrapper
|
|
15
|
+
// wrapper base styles
|
|
16
16
|
export const checkboxBaseClass = clsx(
|
|
17
17
|
"inline-flex items-center gap-2",
|
|
18
18
|
"whitespace-nowrap",
|
|
@@ -25,7 +25,7 @@ export const checkboxBaseClass = clsx(
|
|
|
25
25
|
"focus-visible:ring-2",
|
|
26
26
|
);
|
|
27
27
|
|
|
28
|
-
//
|
|
28
|
+
// Indicator base styles
|
|
29
29
|
export const indicatorBaseClass = clsx(
|
|
30
30
|
"flex shrink-0 items-center justify-center",
|
|
31
31
|
"size-4",
|
|
@@ -36,10 +36,10 @@ export const indicatorBaseClass = clsx(
|
|
|
36
36
|
"transition-colors",
|
|
37
37
|
);
|
|
38
38
|
|
|
39
|
-
//
|
|
39
|
+
// Checked state styles (primary fixed)
|
|
40
40
|
export const checkedClass = clsx("border-primary-500 bg-primary-500", "text-white");
|
|
41
41
|
|
|
42
|
-
//
|
|
42
|
+
// Size-specific styles
|
|
43
43
|
export const checkboxSizeClasses: Record<CheckboxSize, string> = {
|
|
44
44
|
xs: clsx("h-field-xs", paddingXs),
|
|
45
45
|
sm: clsx("h-field-sm", paddingSm),
|
|
@@ -47,14 +47,14 @@ export const checkboxSizeClasses: Record<CheckboxSize, string> = {
|
|
|
47
47
|
xl: clsx("h-field-xl", paddingXl),
|
|
48
48
|
};
|
|
49
49
|
|
|
50
|
-
//
|
|
50
|
+
// Inset styles
|
|
51
51
|
export const checkboxInsetClass = clsx(
|
|
52
52
|
"h-field-inset justify-center bg-transparent",
|
|
53
53
|
insetBase,
|
|
54
54
|
insetFocusOutlineSelf,
|
|
55
55
|
);
|
|
56
56
|
|
|
57
|
-
//
|
|
57
|
+
// Inset size-specific heights (excluding 2px border)
|
|
58
58
|
export const checkboxInsetSizeHeightClasses: Record<CheckboxSize, string> = {
|
|
59
59
|
xs: "h-field-inset-xs",
|
|
60
60
|
sm: "h-field-inset-sm",
|
|
@@ -62,8 +62,8 @@ export const checkboxInsetSizeHeightClasses: Record<CheckboxSize, string> = {
|
|
|
62
62
|
xl: "h-field-inset-xl",
|
|
63
63
|
};
|
|
64
64
|
|
|
65
|
-
//
|
|
65
|
+
// Inline styles
|
|
66
66
|
export const checkboxInlineClass = clsx("!h-auto", "!p-0", "gap-1");
|
|
67
67
|
|
|
68
|
-
//
|
|
68
|
+
// Disabled styles
|
|
69
69
|
export const checkboxDisabledClass = disabledOpacity;
|
|
@@ -17,7 +17,7 @@ import {
|
|
|
17
17
|
} from "./Checkbox.styles";
|
|
18
18
|
import { Invalid } from "../Invalid";
|
|
19
19
|
|
|
20
|
-
// Directive
|
|
20
|
+
// Directive usage declaration (for TypeScript)
|
|
21
21
|
void ripple;
|
|
22
22
|
|
|
23
23
|
export interface CheckboxProps {
|
|
@@ -84,7 +84,7 @@ export const Checkbox: ParentComponent<CheckboxProps> = (props) => {
|
|
|
84
84
|
|
|
85
85
|
const errorMsg = createMemo(() => {
|
|
86
86
|
const v = local.value ?? false;
|
|
87
|
-
if (local.required && !v) return "
|
|
87
|
+
if (local.required && !v) return "This is a required selection";
|
|
88
88
|
return local.validate?.(v);
|
|
89
89
|
});
|
|
90
90
|
|
|
@@ -31,7 +31,7 @@ const { Group } = createSelectionGroup({
|
|
|
31
31
|
mode: "multiple",
|
|
32
32
|
contextName: "CheckboxGroup",
|
|
33
33
|
ItemComponent: Checkbox,
|
|
34
|
-
emptyErrorMsg: "
|
|
34
|
+
emptyErrorMsg: "Please select an item",
|
|
35
35
|
});
|
|
36
36
|
|
|
37
37
|
export const CheckboxGroup = Group as unknown as CheckboxGroupComponent;
|
|
@@ -18,7 +18,7 @@ import { Invalid } from "../Invalid";
|
|
|
18
18
|
|
|
19
19
|
const radioDotClass = clsx("size-2", "rounded-full", "bg-current");
|
|
20
20
|
|
|
21
|
-
// Directive
|
|
21
|
+
// Directive usage declaration (for TypeScript)
|
|
22
22
|
void ripple;
|
|
23
23
|
|
|
24
24
|
export interface RadioProps {
|
|
@@ -85,7 +85,7 @@ export const Radio: ParentComponent<RadioProps> = (props) => {
|
|
|
85
85
|
|
|
86
86
|
const errorMsg = createMemo(() => {
|
|
87
87
|
const v = local.value ?? false;
|
|
88
|
-
if (local.required && !v) return "
|
|
88
|
+
if (local.required && !v) return "This is a required selection";
|
|
89
89
|
return local.validate?.(v);
|
|
90
90
|
});
|
|
91
91
|
|
|
@@ -31,7 +31,7 @@ const { Group } = createSelectionGroup({
|
|
|
31
31
|
mode: "single",
|
|
32
32
|
contextName: "RadioGroup",
|
|
33
33
|
ItemComponent: Radio,
|
|
34
|
-
emptyErrorMsg: "
|
|
34
|
+
emptyErrorMsg: "Please select an item",
|
|
35
35
|
});
|
|
36
36
|
|
|
37
37
|
export const RadioGroup = Group as unknown as RadioGroupComponent;
|