@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
|
@@ -25,35 +25,32 @@ import {
|
|
|
25
25
|
borderSubtle,
|
|
26
26
|
type ComponentSize,
|
|
27
27
|
textMuted,
|
|
28
|
-
textPlaceholder,
|
|
29
28
|
} from "../../../styles/tokens.styles";
|
|
30
29
|
import { createControllableSignal } from "../../../hooks/createControllableSignal";
|
|
31
30
|
import { createSlotSignal } from "../../../hooks/createSlotSignal";
|
|
32
31
|
import { chevronWrapperClass, getTriggerClass } from "../DropdownTrigger.styles";
|
|
33
32
|
import { Invalid } from "../Invalid";
|
|
33
|
+
import { TextInput } from "../field/TextInput";
|
|
34
|
+
import { useI18nOptional } from "../../../providers/i18n/I18nContext";
|
|
34
35
|
|
|
35
36
|
void ripple;
|
|
36
37
|
|
|
37
|
-
// Select
|
|
38
|
+
// Select-specific styles
|
|
38
39
|
const multiTagClass = clsx("rounded", "bg-base-200 px-1", "dark:bg-base-600");
|
|
39
40
|
const selectedValueClass = clsx("flex-1", "whitespace-nowrap");
|
|
40
41
|
|
|
41
|
-
//
|
|
42
|
+
// Search input styles (override TextInput wrapper)
|
|
42
43
|
const searchInputClass = clsx(
|
|
43
44
|
"w-full",
|
|
44
|
-
"
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
"px-2 py-1.5",
|
|
48
|
-
"text-sm",
|
|
49
|
-
"outline-none",
|
|
50
|
-
textPlaceholder,
|
|
45
|
+
"rounded-none",
|
|
46
|
+
"border-0 border-b",
|
|
47
|
+
borderSubtle
|
|
51
48
|
);
|
|
52
49
|
|
|
53
|
-
//
|
|
50
|
+
// Select all/deselect all button area styles
|
|
54
51
|
const selectAllBarClass = clsx("flex gap-2", "border-b", borderSubtle, "px-2 py-1", "text-xs");
|
|
55
52
|
|
|
56
|
-
//
|
|
53
|
+
// Select all/deselect all button styles
|
|
57
54
|
const selectAllBtnClass = clsx(
|
|
58
55
|
"text-primary-500",
|
|
59
56
|
"hover:text-primary-600 dark:hover:text-primary-400",
|
|
@@ -61,7 +58,7 @@ const selectAllBtnClass = clsx(
|
|
|
61
58
|
);
|
|
62
59
|
|
|
63
60
|
/**
|
|
64
|
-
* Select
|
|
61
|
+
* Select right-side action sub-component
|
|
65
62
|
*/
|
|
66
63
|
interface SelectActionProps extends JSX.ButtonHTMLAttributes<HTMLButtonElement> {}
|
|
67
64
|
|
|
@@ -100,11 +97,11 @@ const SelectAction: ParentComponent<SelectActionProps> = (props) => {
|
|
|
100
97
|
};
|
|
101
98
|
|
|
102
99
|
/**
|
|
103
|
-
*
|
|
100
|
+
* Dropdown top custom area sub-component
|
|
104
101
|
*/
|
|
105
102
|
const SelectHeader: ParentComponent = (props) => {
|
|
106
103
|
const ctx = useSelectContext();
|
|
107
|
-
// eslint-disable-next-line solid/reactivity --
|
|
104
|
+
// eslint-disable-next-line solid/reactivity -- Save as slot accessor, called from JSX tracked scope
|
|
108
105
|
ctx.setHeader(() => props.children);
|
|
109
106
|
onCleanup(() => ctx.setHeader(undefined));
|
|
110
107
|
return null;
|
|
@@ -114,87 +111,87 @@ const SelectItemTemplate = <TArgs extends unknown[]>(props: {
|
|
|
114
111
|
children: (...args: TArgs) => JSX.Element;
|
|
115
112
|
}) => {
|
|
116
113
|
const ctx = useSelectContext();
|
|
117
|
-
// eslint-disable-next-line solid/reactivity --
|
|
114
|
+
// eslint-disable-next-line solid/reactivity -- Store render function in signal, called from JSX tracked scope
|
|
118
115
|
ctx.setItemTemplate(props.children as (...args: unknown[]) => JSX.Element);
|
|
119
116
|
onCleanup(() => ctx.setItemTemplate(undefined));
|
|
120
117
|
return null;
|
|
121
118
|
};
|
|
122
119
|
|
|
123
|
-
// Props
|
|
120
|
+
// Props definition
|
|
124
121
|
|
|
125
|
-
//
|
|
122
|
+
// Common Props (except value, onValueChange, multiple)
|
|
126
123
|
interface SelectCommonProps<TValue = unknown> {
|
|
127
|
-
/**
|
|
124
|
+
/** Disabled state */
|
|
128
125
|
disabled?: boolean;
|
|
129
126
|
|
|
130
|
-
/**
|
|
127
|
+
/** Required input */
|
|
131
128
|
required?: boolean;
|
|
132
129
|
|
|
133
|
-
/**
|
|
130
|
+
/** Placeholder text when no value selected */
|
|
134
131
|
placeholder?: string;
|
|
135
132
|
|
|
136
|
-
/**
|
|
133
|
+
/** Trigger size */
|
|
137
134
|
size?: ComponentSize;
|
|
138
135
|
|
|
139
|
-
/**
|
|
136
|
+
/** Borderless style */
|
|
140
137
|
inset?: boolean;
|
|
141
138
|
|
|
142
|
-
/**
|
|
139
|
+
/** Custom validation function */
|
|
143
140
|
validate?: (value: unknown) => string | undefined;
|
|
144
141
|
|
|
145
|
-
/** touchMode:
|
|
142
|
+
/** touchMode: Show error only after blur */
|
|
146
143
|
touchMode?: boolean;
|
|
147
144
|
|
|
148
|
-
/**
|
|
145
|
+
/** Search text extraction function (shows search input when set) */
|
|
149
146
|
getSearchText?: (item: TValue) => string;
|
|
150
147
|
|
|
151
|
-
/**
|
|
148
|
+
/** Function to determine if item is hidden */
|
|
152
149
|
getIsHidden?: (item: TValue) => boolean;
|
|
153
150
|
|
|
154
|
-
/**
|
|
151
|
+
/** Custom class */
|
|
155
152
|
class?: string;
|
|
156
153
|
|
|
157
|
-
/**
|
|
154
|
+
/** Custom style */
|
|
158
155
|
style?: JSX.CSSProperties;
|
|
159
156
|
}
|
|
160
157
|
|
|
161
|
-
//
|
|
158
|
+
// Single select Props
|
|
162
159
|
interface SelectSingleBaseProps<TValue> extends SelectCommonProps<TValue> {
|
|
163
|
-
/**
|
|
160
|
+
/** Single select mode */
|
|
164
161
|
multiple?: false;
|
|
165
162
|
|
|
166
|
-
/**
|
|
163
|
+
/** Currently selected value */
|
|
167
164
|
value?: TValue;
|
|
168
165
|
|
|
169
|
-
/**
|
|
166
|
+
/** Value change callback */
|
|
170
167
|
onValueChange?: (value: TValue) => void;
|
|
171
168
|
|
|
172
|
-
/**
|
|
169
|
+
/** Display direction for multiple select (not used in single select) */
|
|
173
170
|
multiDisplayDirection?: never;
|
|
174
171
|
|
|
175
|
-
/**
|
|
172
|
+
/** Hide select all button (not used in single select) */
|
|
176
173
|
hideSelectAll?: never;
|
|
177
174
|
}
|
|
178
175
|
|
|
179
|
-
//
|
|
176
|
+
// Multiple select Props
|
|
180
177
|
interface SelectMultipleBaseProps<TValue> extends SelectCommonProps<TValue> {
|
|
181
|
-
/**
|
|
178
|
+
/** Multiple select mode */
|
|
182
179
|
multiple: true;
|
|
183
180
|
|
|
184
|
-
/**
|
|
181
|
+
/** Currently selected values */
|
|
185
182
|
value?: TValue[];
|
|
186
183
|
|
|
187
|
-
/**
|
|
184
|
+
/** Value change callback */
|
|
188
185
|
onValueChange?: (value: TValue[]) => void;
|
|
189
186
|
|
|
190
|
-
/**
|
|
187
|
+
/** Display direction for multiple select */
|
|
191
188
|
multiDisplayDirection?: "horizontal" | "vertical";
|
|
192
189
|
|
|
193
|
-
/**
|
|
190
|
+
/** Hide select all button */
|
|
194
191
|
hideSelectAll?: boolean;
|
|
195
192
|
}
|
|
196
193
|
|
|
197
|
-
// items
|
|
194
|
+
// items mode
|
|
198
195
|
interface SelectWithItemsPropsBase<TValue> {
|
|
199
196
|
items: TValue[];
|
|
200
197
|
getChildren?: (item: TValue, index: number, depth: number) => TValue[] | undefined;
|
|
@@ -202,7 +199,7 @@ interface SelectWithItemsPropsBase<TValue> {
|
|
|
202
199
|
children?: JSX.Element;
|
|
203
200
|
}
|
|
204
201
|
|
|
205
|
-
// children
|
|
202
|
+
// children mode
|
|
206
203
|
interface SelectWithChildrenPropsBase<TValue> {
|
|
207
204
|
items?: never;
|
|
208
205
|
getChildren?: never;
|
|
@@ -225,17 +222,17 @@ interface SelectComponent {
|
|
|
225
222
|
}
|
|
226
223
|
|
|
227
224
|
/**
|
|
228
|
-
* Select
|
|
225
|
+
* Select component
|
|
229
226
|
*
|
|
230
227
|
* @example
|
|
231
228
|
* ```tsx
|
|
232
|
-
* // children
|
|
229
|
+
* // children mode
|
|
233
230
|
* <Select value={selected()} onValueChange={setSelected} renderValue={(v) => v.name}>
|
|
234
231
|
* <Select.Item value={item1}>{item1.name}</Select.Item>
|
|
235
232
|
* <Select.Item value={item2}>{item2.name}</Select.Item>
|
|
236
233
|
* </Select>
|
|
237
234
|
*
|
|
238
|
-
* // items prop
|
|
235
|
+
* // items prop mode
|
|
239
236
|
* <Select items={data} value={selected()} onValueChange={setSelected}>
|
|
240
237
|
* <Select.ItemTemplate>
|
|
241
238
|
* {(item) => <>{item.name}</>}
|
|
@@ -267,26 +264,27 @@ export const Select: SelectComponent = <T,>(props: SelectProps<T>) => {
|
|
|
267
264
|
"getIsHidden",
|
|
268
265
|
]);
|
|
269
266
|
|
|
267
|
+
const i18n = useI18nOptional();
|
|
270
268
|
const [open, setOpen] = createSignal(false);
|
|
271
269
|
|
|
272
|
-
//
|
|
270
|
+
// Search text signal
|
|
273
271
|
const [searchText, setSearchText] = createSignal("");
|
|
274
272
|
|
|
275
|
-
//
|
|
273
|
+
// Reset searchText when open becomes false
|
|
276
274
|
createEffect(() => {
|
|
277
275
|
if (!open()) {
|
|
278
276
|
setSearchText("");
|
|
279
277
|
}
|
|
280
278
|
});
|
|
281
279
|
|
|
282
|
-
//
|
|
280
|
+
// Manage selected value (controlled/uncontrolled pattern)
|
|
283
281
|
type ValueType = T | T[] | undefined;
|
|
284
282
|
const [value, setValue] = createControllableSignal<ValueType>({
|
|
285
283
|
value: () => local.value,
|
|
286
284
|
onChange: () => local.onValueChange as ((v: ValueType) => void) | undefined,
|
|
287
285
|
} as Parameters<typeof createControllableSignal<ValueType>>[0]);
|
|
288
286
|
|
|
289
|
-
//
|
|
287
|
+
// Check if value is selected
|
|
290
288
|
const isSelected = (itemValue: T): boolean => {
|
|
291
289
|
const current = value();
|
|
292
290
|
if (current === undefined) return false;
|
|
@@ -297,7 +295,7 @@ export const Select: SelectComponent = <T,>(props: SelectProps<T>) => {
|
|
|
297
295
|
return current === itemValue;
|
|
298
296
|
};
|
|
299
297
|
|
|
300
|
-
//
|
|
298
|
+
// Toggle value
|
|
301
299
|
const toggleValue = (itemValue: T) => {
|
|
302
300
|
if (local.multiple) {
|
|
303
301
|
const current = (value() as T[] | undefined) ?? [];
|
|
@@ -312,12 +310,12 @@ export const Select: SelectComponent = <T,>(props: SelectProps<T>) => {
|
|
|
312
310
|
}
|
|
313
311
|
};
|
|
314
312
|
|
|
315
|
-
//
|
|
313
|
+
// Close dropdown
|
|
316
314
|
const closeDropdown = () => {
|
|
317
315
|
setOpen(false);
|
|
318
316
|
};
|
|
319
317
|
|
|
320
|
-
//
|
|
318
|
+
// Slot signals
|
|
321
319
|
const [header, setHeader] = createSlotSignal();
|
|
322
320
|
const [action, setAction] = createSlotSignal();
|
|
323
321
|
const [itemTemplate, _setItemTemplate] = createSignal<
|
|
@@ -326,7 +324,7 @@ export const Select: SelectComponent = <T,>(props: SelectProps<T>) => {
|
|
|
326
324
|
const setItemTemplate = (fn: ((...args: unknown[]) => JSX.Element) | undefined) =>
|
|
327
325
|
_setItemTemplate(() => fn);
|
|
328
326
|
|
|
329
|
-
// Context
|
|
327
|
+
// Context value
|
|
330
328
|
const contextValue: SelectContextValue<T> = {
|
|
331
329
|
multiple: () => local.multiple ?? false,
|
|
332
330
|
isSelected,
|
|
@@ -337,7 +335,7 @@ export const Select: SelectComponent = <T,>(props: SelectProps<T>) => {
|
|
|
337
335
|
setItemTemplate,
|
|
338
336
|
};
|
|
339
337
|
|
|
340
|
-
//
|
|
338
|
+
// Trigger keyboard handling (only Enter/Space, ArrowUp/Down handled by Dropdown)
|
|
341
339
|
const handleTriggerKeyDown = (e: KeyboardEvent) => {
|
|
342
340
|
if (local.disabled) return;
|
|
343
341
|
|
|
@@ -347,15 +345,15 @@ export const Select: SelectComponent = <T,>(props: SelectProps<T>) => {
|
|
|
347
345
|
}
|
|
348
346
|
};
|
|
349
347
|
|
|
350
|
-
//
|
|
348
|
+
// Validation error message
|
|
351
349
|
const errorMsg = createMemo(() => {
|
|
352
350
|
const v = value();
|
|
353
351
|
if (local.required && (v === undefined || v === null || v === ""))
|
|
354
|
-
return "
|
|
352
|
+
return "This is a required field";
|
|
355
353
|
return local.validate?.(v);
|
|
356
354
|
});
|
|
357
355
|
|
|
358
|
-
//
|
|
356
|
+
// Trigger class
|
|
359
357
|
const getTriggerClassName = () =>
|
|
360
358
|
getTriggerClass({
|
|
361
359
|
size: local.size,
|
|
@@ -364,7 +362,7 @@ export const Select: SelectComponent = <T,>(props: SelectProps<T>) => {
|
|
|
364
362
|
class: local.class,
|
|
365
363
|
});
|
|
366
364
|
|
|
367
|
-
//
|
|
365
|
+
// Search filtering (supports hierarchical structure)
|
|
368
366
|
const filteredItems = createMemo((): T[] | undefined => {
|
|
369
367
|
if (!local.items) return undefined;
|
|
370
368
|
if (!local.getSearchText || !searchText()) return local.items;
|
|
@@ -372,12 +370,12 @@ export const Select: SelectComponent = <T,>(props: SelectProps<T>) => {
|
|
|
372
370
|
const terms = searchText().trim().split(" ").filter(Boolean);
|
|
373
371
|
if (terms.length === 0) return local.items;
|
|
374
372
|
|
|
375
|
-
//
|
|
373
|
+
// Include parent when child matches in hierarchical structure
|
|
376
374
|
const matchesSearch = (item: T): boolean => {
|
|
377
375
|
const text = local.getSearchText!(item).toLowerCase();
|
|
378
376
|
if (terms.every((t) => text.includes(t.toLowerCase()))) return true;
|
|
379
377
|
|
|
380
|
-
//
|
|
378
|
+
// Show parent if any child matches
|
|
381
379
|
if (local.getChildren) {
|
|
382
380
|
const itemChildren = local.getChildren(item, 0, 0);
|
|
383
381
|
if (itemChildren?.some((child) => matchesSearch(child))) return true;
|
|
@@ -389,13 +387,13 @@ export const Select: SelectComponent = <T,>(props: SelectProps<T>) => {
|
|
|
389
387
|
return local.items.filter((item) => matchesSearch(item));
|
|
390
388
|
});
|
|
391
389
|
|
|
392
|
-
//
|
|
390
|
+
// Items with hidden filter applied
|
|
393
391
|
const visibleItems = createMemo((): T[] | undefined => {
|
|
394
392
|
const items = filteredItems();
|
|
395
393
|
if (!items || !local.getIsHidden) return items;
|
|
396
394
|
|
|
397
395
|
return items.filter((item) => {
|
|
398
|
-
//
|
|
396
|
+
// Show hidden item if selected (with strikethrough)
|
|
399
397
|
if (local.getIsHidden!(item)) {
|
|
400
398
|
return isSelected(item);
|
|
401
399
|
}
|
|
@@ -403,31 +401,31 @@ export const Select: SelectComponent = <T,>(props: SelectProps<T>) => {
|
|
|
403
401
|
});
|
|
404
402
|
});
|
|
405
403
|
|
|
406
|
-
//
|
|
404
|
+
// Select all
|
|
407
405
|
const handleSelectAll = () => {
|
|
408
406
|
const items = visibleItems();
|
|
409
407
|
if (!items) return;
|
|
410
408
|
setValue(items);
|
|
411
409
|
};
|
|
412
410
|
|
|
413
|
-
//
|
|
411
|
+
// Deselect all
|
|
414
412
|
const handleDeselectAll = () => {
|
|
415
413
|
setValue([] as unknown as T[]);
|
|
416
414
|
};
|
|
417
415
|
|
|
418
|
-
//
|
|
416
|
+
// Inner component: resolve children inside Provider to trigger slot registration
|
|
419
417
|
const SelectInner: ParentComponent = (innerProps) => {
|
|
420
|
-
// children()
|
|
418
|
+
// Resolve children() to trigger sub-component registration (Header, Action, ItemTemplate return null)
|
|
421
419
|
const resolved = children(() => innerProps.children);
|
|
422
420
|
|
|
423
|
-
// itemTemplate
|
|
421
|
+
// Extract itemTemplate function
|
|
424
422
|
const getItemTemplate = ():
|
|
425
423
|
| ((item: T, index: number, depth: number) => JSX.Element)
|
|
426
424
|
| undefined => {
|
|
427
425
|
return itemTemplate() as ((item: T, index: number, depth: number) => JSX.Element) | undefined;
|
|
428
426
|
};
|
|
429
427
|
|
|
430
|
-
// items
|
|
428
|
+
// Render items recursively
|
|
431
429
|
const renderItems = (itemList: T[], depth: number): JSX.Element => {
|
|
432
430
|
const tpl = getItemTemplate();
|
|
433
431
|
return (
|
|
@@ -439,7 +437,7 @@ export const Select: SelectComponent = <T,>(props: SelectProps<T>) => {
|
|
|
439
437
|
{tpl ? tpl(item, index(), depth) : String(item)}
|
|
440
438
|
<Show when={local.getChildren?.(item, index(), depth)} keyed>
|
|
441
439
|
{(itemChildren) => {
|
|
442
|
-
//
|
|
440
|
+
// Apply hidden filter to child list
|
|
443
441
|
const visibleChildren = () => {
|
|
444
442
|
if (!local.getIsHidden) return itemChildren;
|
|
445
443
|
return itemChildren.filter((child) => {
|
|
@@ -463,7 +461,7 @@ export const Select: SelectComponent = <T,>(props: SelectProps<T>) => {
|
|
|
463
461
|
);
|
|
464
462
|
};
|
|
465
463
|
|
|
466
|
-
//
|
|
464
|
+
// Render selected value (reuse itemTemplate when in items mode)
|
|
467
465
|
const renderValue = (renderVal: T): JSX.Element => {
|
|
468
466
|
if (local.renderValue) {
|
|
469
467
|
return local.renderValue(renderVal);
|
|
@@ -475,7 +473,7 @@ export const Select: SelectComponent = <T,>(props: SelectProps<T>) => {
|
|
|
475
473
|
return <>{String(renderVal)}</>;
|
|
476
474
|
};
|
|
477
475
|
|
|
478
|
-
//
|
|
476
|
+
// Display selected value
|
|
479
477
|
const renderSelectedValue = (): JSX.Element => {
|
|
480
478
|
const current = value();
|
|
481
479
|
|
|
@@ -495,10 +493,10 @@ export const Select: SelectComponent = <T,>(props: SelectProps<T>) => {
|
|
|
495
493
|
return renderValue(current as T);
|
|
496
494
|
};
|
|
497
495
|
|
|
498
|
-
//
|
|
496
|
+
// Show unset item: single select + not required + items mode
|
|
499
497
|
const showUnsetItem = () => !local.multiple && !local.required && local.items !== undefined;
|
|
500
498
|
|
|
501
|
-
//
|
|
499
|
+
// Show select all/deselect bar: multiple + not hideSelectAll + items mode
|
|
502
500
|
const showSelectAllBar = () =>
|
|
503
501
|
local.multiple === true && !local.hideSelectAll && local.items !== undefined;
|
|
504
502
|
|
|
@@ -533,18 +531,16 @@ export const Select: SelectComponent = <T,>(props: SelectProps<T>) => {
|
|
|
533
531
|
</Dropdown.Trigger>
|
|
534
532
|
<Dropdown.Content>
|
|
535
533
|
<Show when={header()}>{header()!()}</Show>
|
|
536
|
-
{/*
|
|
534
|
+
{/* Search input */}
|
|
537
535
|
<Show when={local.getSearchText && local.items}>
|
|
538
|
-
<
|
|
539
|
-
type="text"
|
|
540
|
-
data-select-search
|
|
541
|
-
class={searchInputClass}
|
|
542
|
-
placeholder="검색..."
|
|
536
|
+
<TextInput
|
|
543
537
|
value={searchText()}
|
|
544
|
-
|
|
538
|
+
onValueChange={setSearchText}
|
|
539
|
+
placeholder={i18n?.t("select.searchPlaceholder") ?? "Search..."}
|
|
540
|
+
class={searchInputClass}
|
|
545
541
|
/>
|
|
546
542
|
</Show>
|
|
547
|
-
{/*
|
|
543
|
+
{/* Select all/deselect buttons */}
|
|
548
544
|
<Show when={showSelectAllBar()}>
|
|
549
545
|
<div class={selectAllBarClass}>
|
|
550
546
|
<button
|
|
@@ -553,7 +549,7 @@ export const Select: SelectComponent = <T,>(props: SelectProps<T>) => {
|
|
|
553
549
|
class={selectAllBtnClass}
|
|
554
550
|
onClick={handleSelectAll}
|
|
555
551
|
>
|
|
556
|
-
|
|
552
|
+
{i18n?.t("select.selectAll") ?? "Select all"}
|
|
557
553
|
</button>
|
|
558
554
|
<button
|
|
559
555
|
type="button"
|
|
@@ -561,16 +557,16 @@ export const Select: SelectComponent = <T,>(props: SelectProps<T>) => {
|
|
|
561
557
|
class={selectAllBtnClass}
|
|
562
558
|
onClick={handleDeselectAll}
|
|
563
559
|
>
|
|
564
|
-
|
|
560
|
+
{i18n?.t("select.deselectAll") ?? "Deselect all"}
|
|
565
561
|
</button>
|
|
566
562
|
</div>
|
|
567
563
|
</Show>
|
|
568
564
|
<List inset role="listbox">
|
|
569
565
|
<Show when={local.items} fallback={resolved()}>
|
|
570
|
-
{/*
|
|
566
|
+
{/* Unset item */}
|
|
571
567
|
<Show when={showUnsetItem()}>
|
|
572
568
|
<SelectItem value={undefined as T}>
|
|
573
|
-
<span class={textMuted}
|
|
569
|
+
<span class={textMuted}>{i18n?.t("select.unset") ?? "Unset"}</span>
|
|
574
570
|
</SelectItem>
|
|
575
571
|
</Show>
|
|
576
572
|
{renderItems(visibleItems() ?? [], 0)}
|
|
@@ -2,25 +2,25 @@ import { createContext, useContext, type Accessor, type JSX } from "solid-js";
|
|
|
2
2
|
import type { SlotAccessor } from "../../../hooks/createSlotSignal";
|
|
3
3
|
|
|
4
4
|
export interface SelectContextValue<TValue = unknown> {
|
|
5
|
-
/**
|
|
5
|
+
/** Whether multiple select mode is enabled */
|
|
6
6
|
multiple: Accessor<boolean>;
|
|
7
7
|
|
|
8
|
-
/**
|
|
8
|
+
/** Check if value is selected */
|
|
9
9
|
isSelected: (value: TValue) => boolean;
|
|
10
10
|
|
|
11
|
-
/**
|
|
11
|
+
/** Toggle value selection/deselection */
|
|
12
12
|
toggleValue: (value: TValue) => void;
|
|
13
13
|
|
|
14
|
-
/**
|
|
14
|
+
/** Close dropdown */
|
|
15
15
|
closeDropdown: () => void;
|
|
16
16
|
|
|
17
|
-
/**
|
|
17
|
+
/** Register header slot */
|
|
18
18
|
setHeader: (content: SlotAccessor) => void;
|
|
19
19
|
|
|
20
|
-
/**
|
|
20
|
+
/** Register action slot */
|
|
21
21
|
setAction: (content: SlotAccessor) => void;
|
|
22
22
|
|
|
23
|
-
/**
|
|
23
|
+
/** Register item template */
|
|
24
24
|
setItemTemplate: (fn: ((...args: unknown[]) => JSX.Element) | undefined) => void;
|
|
25
25
|
}
|
|
26
26
|
|
|
@@ -29,7 +29,7 @@ export const SelectContext = createContext<SelectContextValue>();
|
|
|
29
29
|
export function useSelectContext<TValue = unknown>(): SelectContextValue<TValue> {
|
|
30
30
|
const context = useContext(SelectContext);
|
|
31
31
|
if (!context) {
|
|
32
|
-
throw new Error("useSelectContext
|
|
32
|
+
throw new Error("useSelectContext can only be used inside Select component");
|
|
33
33
|
}
|
|
34
34
|
return context as SelectContextValue<TValue>;
|
|
35
35
|
}
|
|
@@ -31,10 +31,10 @@ export interface SelectItemProps<TValue = unknown> extends Omit<
|
|
|
31
31
|
JSX.ButtonHTMLAttributes<HTMLButtonElement>,
|
|
32
32
|
"value" | "onClick"
|
|
33
33
|
> {
|
|
34
|
-
/**
|
|
34
|
+
/** Item value */
|
|
35
35
|
value: TValue;
|
|
36
36
|
|
|
37
|
-
/**
|
|
37
|
+
/** Disabled state */
|
|
38
38
|
disabled?: boolean;
|
|
39
39
|
}
|
|
40
40
|
|
|
@@ -43,13 +43,13 @@ interface SelectItemComponent<TValue = unknown> extends ParentComponent<SelectIt
|
|
|
43
43
|
}
|
|
44
44
|
|
|
45
45
|
/**
|
|
46
|
-
*
|
|
46
|
+
* Selectable item within Select dropdown
|
|
47
47
|
*
|
|
48
48
|
* @example
|
|
49
49
|
* ```tsx
|
|
50
50
|
* <Select.Item value={item}>{item.name}</Select.Item>
|
|
51
51
|
*
|
|
52
|
-
* //
|
|
52
|
+
* // Nested items
|
|
53
53
|
* <Select.Item value={parent}>
|
|
54
54
|
* {parent.name}
|
|
55
55
|
* <Select.Item.Children>
|
|
@@ -75,7 +75,7 @@ export const SelectItem: SelectItemComponent = <T,>(
|
|
|
75
75
|
|
|
76
76
|
context.toggleValue(local.value);
|
|
77
77
|
|
|
78
|
-
//
|
|
78
|
+
// Close dropdown only in single select mode
|
|
79
79
|
if (!context.multiple()) {
|
|
80
80
|
context.closeDropdown();
|
|
81
81
|
}
|
|
@@ -117,7 +117,7 @@ function StatePresetInner<TValue>(props: StatePresetProps<TValue>): JSX.Element
|
|
|
117
117
|
|
|
118
118
|
const notification = useNotification();
|
|
119
119
|
|
|
120
|
-
// presetKey
|
|
120
|
+
// presetKey is an identifier set only once at mount, evaluate immediately to capture
|
|
121
121
|
/* eslint-disable solid/reactivity */
|
|
122
122
|
const [presets, setPresets] = useSyncConfig<StatePresetItem<TValue>[]>(
|
|
123
123
|
`state-preset.${local.presetKey}`,
|
|
@@ -147,7 +147,7 @@ function StatePresetInner<TValue>(props: StatePresetProps<TValue>): JSX.Element
|
|
|
147
147
|
}
|
|
148
148
|
|
|
149
149
|
if (presets().some((p) => p.name === name)) {
|
|
150
|
-
notification.warning("
|
|
150
|
+
notification.warning("Duplicate name", "A preset with this name already exists.");
|
|
151
151
|
return;
|
|
152
152
|
}
|
|
153
153
|
|
|
@@ -156,7 +156,7 @@ function StatePresetInner<TValue>(props: StatePresetProps<TValue>): JSX.Element
|
|
|
156
156
|
state: objClone(local.value),
|
|
157
157
|
};
|
|
158
158
|
setPresets([...presets(), newPreset]);
|
|
159
|
-
notification.info("
|
|
159
|
+
notification.info("Preset saved", `Preset "${name}" has been saved.`);
|
|
160
160
|
setAdding(false);
|
|
161
161
|
setInputValue("");
|
|
162
162
|
}
|
|
@@ -177,11 +177,11 @@ function StatePresetInner<TValue>(props: StatePresetProps<TValue>): JSX.Element
|
|
|
177
177
|
setPresets(updated);
|
|
178
178
|
|
|
179
179
|
const notiId = notification.info(
|
|
180
|
-
"
|
|
181
|
-
`"${presetName}"
|
|
180
|
+
"Preset overwritten",
|
|
181
|
+
`Preset "${presetName}" has been updated with the current state.`,
|
|
182
182
|
{
|
|
183
183
|
action: {
|
|
184
|
-
label: "
|
|
184
|
+
label: "Undo",
|
|
185
185
|
onClick: () => {
|
|
186
186
|
setPresets(snapshot);
|
|
187
187
|
notification.remove(notiId);
|
|
@@ -198,9 +198,9 @@ function StatePresetInner<TValue>(props: StatePresetProps<TValue>): JSX.Element
|
|
|
198
198
|
const updated = snapshot.filter((_, i) => i !== index);
|
|
199
199
|
setPresets(updated);
|
|
200
200
|
|
|
201
|
-
const notiId = notification.info("
|
|
201
|
+
const notiId = notification.info("Preset deleted", `Preset "${presetName}" has been deleted.`, {
|
|
202
202
|
action: {
|
|
203
|
-
label: "
|
|
203
|
+
label: "Undo",
|
|
204
204
|
onClick: () => {
|
|
205
205
|
setPresets(snapshot);
|
|
206
206
|
notification.remove(notiId);
|
|
@@ -242,7 +242,7 @@ function StatePresetInner<TValue>(props: StatePresetProps<TValue>): JSX.Element
|
|
|
242
242
|
type="button"
|
|
243
243
|
class={resolvedStarBtnClass()}
|
|
244
244
|
onClick={handleStartAdd}
|
|
245
|
-
title="
|
|
245
|
+
title="Add preset"
|
|
246
246
|
>
|
|
247
247
|
<Icon icon={IconStar} size={iconSize} />
|
|
248
248
|
</button>
|
|
@@ -255,7 +255,7 @@ function StatePresetInner<TValue>(props: StatePresetProps<TValue>): JSX.Element
|
|
|
255
255
|
type="button"
|
|
256
256
|
class={chipNameBtnClass}
|
|
257
257
|
onClick={() => handleRestore(preset)}
|
|
258
|
-
title={`"${preset.name}"
|
|
258
|
+
title={`Apply preset "${preset.name}"`}
|
|
259
259
|
>
|
|
260
260
|
{preset.name}
|
|
261
261
|
</button>
|
|
@@ -263,7 +263,7 @@ function StatePresetInner<TValue>(props: StatePresetProps<TValue>): JSX.Element
|
|
|
263
263
|
type="button"
|
|
264
264
|
class={resolvedIconBtnClass()}
|
|
265
265
|
onClick={() => handleOverwrite(index())}
|
|
266
|
-
title="
|
|
266
|
+
title="Overwrite with current state"
|
|
267
267
|
>
|
|
268
268
|
<Icon icon={IconDeviceFloppy} size={iconSize} />
|
|
269
269
|
</button>
|
|
@@ -271,7 +271,7 @@ function StatePresetInner<TValue>(props: StatePresetProps<TValue>): JSX.Element
|
|
|
271
271
|
type="button"
|
|
272
272
|
class={resolvedIconBtnClass()}
|
|
273
273
|
onClick={() => handleDelete(index())}
|
|
274
|
-
title="
|
|
274
|
+
title="Delete preset"
|
|
275
275
|
>
|
|
276
276
|
<Icon icon={IconX} size={iconSize} />
|
|
277
277
|
</button>
|
|
@@ -288,7 +288,7 @@ function StatePresetInner<TValue>(props: StatePresetProps<TValue>): JSX.Element
|
|
|
288
288
|
}}
|
|
289
289
|
type="text"
|
|
290
290
|
class={resolvedInputClass()}
|
|
291
|
-
placeholder="
|
|
291
|
+
placeholder="Name..."
|
|
292
292
|
autocomplete="one-time-code"
|
|
293
293
|
value={inputValue()}
|
|
294
294
|
onInput={(e) => setInputValue(e.currentTarget.value)}
|