@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
package/src/directives/ripple.ts
CHANGED
|
@@ -10,13 +10,13 @@ declare module "solid-js" {
|
|
|
10
10
|
}
|
|
11
11
|
|
|
12
12
|
/**
|
|
13
|
-
*
|
|
13
|
+
* Directive that adds a ripple effect to interactive elements.
|
|
14
14
|
*
|
|
15
15
|
* @remarks
|
|
16
|
-
* -
|
|
17
|
-
* -
|
|
18
|
-
* -
|
|
19
|
-
* - `prefers-reduced-motion: reduce`
|
|
16
|
+
* - Creates an internal ripple-container div with overflow: hidden (no impact on parent element)
|
|
17
|
+
* - Changes position to `relative` only when the element is `static` (restores original value on cleanup)
|
|
18
|
+
* - Single ripple mode: removes the previous ripple on new click
|
|
19
|
+
* - Disables ripple when `prefers-reduced-motion: reduce` is set
|
|
20
20
|
*
|
|
21
21
|
* @example
|
|
22
22
|
* ```tsx
|
|
@@ -32,7 +32,7 @@ export function ripple(el: HTMLElement, accessor: Accessor<boolean>): void {
|
|
|
32
32
|
|
|
33
33
|
const prefersReducedMotion = window.matchMedia("(prefers-reduced-motion: reduce)");
|
|
34
34
|
|
|
35
|
-
// ripple container
|
|
35
|
+
// Create ripple container (handles overflow: hidden internally)
|
|
36
36
|
const ensureContainer = () => {
|
|
37
37
|
if (containerEl) return containerEl;
|
|
38
38
|
|
|
@@ -48,7 +48,7 @@ export function ripple(el: HTMLElement, accessor: Accessor<boolean>): void {
|
|
|
48
48
|
if (!accessor()) return;
|
|
49
49
|
if (prefersReducedMotion.matches) return;
|
|
50
50
|
|
|
51
|
-
//
|
|
51
|
+
// Check and apply position (required for container placement)
|
|
52
52
|
if (getComputedStyle(el).position === "static") {
|
|
53
53
|
if (!positionApplied) originalPosition = el.style.position;
|
|
54
54
|
el.style.position = "relative";
|
|
@@ -66,7 +66,7 @@ export function ripple(el: HTMLElement, accessor: Accessor<boolean>): void {
|
|
|
66
66
|
const x = event.clientX - rect.left;
|
|
67
67
|
const y = event.clientY - rect.top;
|
|
68
68
|
|
|
69
|
-
//
|
|
69
|
+
// Use the distance from the click position to the farthest corner as the radius
|
|
70
70
|
const maxDist = Math.max(
|
|
71
71
|
Math.hypot(x, y),
|
|
72
72
|
Math.hypot(rect.width - x, y),
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import type { Component, ParentComponent } from "solid-js";
|
|
2
|
-
import { type Accessor,
|
|
2
|
+
import { type Accessor, createMemo, createRoot, useContext } from "solid-js";
|
|
3
|
+
import { createHmrSafeContext } from "./createHmrSafeContext";
|
|
3
4
|
import type { IconProps } from "@tabler/icons-solidjs";
|
|
4
5
|
|
|
5
|
-
// ──
|
|
6
|
+
// ── Input Types ──
|
|
6
7
|
|
|
7
8
|
export interface AppStructureGroupItem<TModule> {
|
|
8
9
|
code: string;
|
|
@@ -37,7 +38,7 @@ export interface AppStructureSubPerm<TModule> {
|
|
|
37
38
|
perms: ("use" | "edit")[];
|
|
38
39
|
}
|
|
39
40
|
|
|
40
|
-
// ──
|
|
41
|
+
// ── Output Types ──
|
|
41
42
|
|
|
42
43
|
export interface AppMenu {
|
|
43
44
|
title: string;
|
|
@@ -81,7 +82,7 @@ export interface AppStructure<TModule> {
|
|
|
81
82
|
getTitleChainByHref(href: string): string[];
|
|
82
83
|
}
|
|
83
84
|
|
|
84
|
-
// ── Perms
|
|
85
|
+
// ── Perms Type Inference ──
|
|
85
86
|
|
|
86
87
|
type PermKey<TItem> = TItem extends { code: infer C extends string }
|
|
87
88
|
? TItem extends { children: any }
|
|
@@ -114,7 +115,7 @@ type InferPerms<TItems extends any[]> = {
|
|
|
114
115
|
: InferLeafPerms<Item>;
|
|
115
116
|
};
|
|
116
117
|
|
|
117
|
-
// ──
|
|
118
|
+
// ── Internal Helpers ──
|
|
118
119
|
|
|
119
120
|
function isGroupItem<TModule>(
|
|
120
121
|
item: AppStructureItem<TModule>,
|
|
@@ -234,12 +235,18 @@ function buildPerms<TModule>(
|
|
|
234
235
|
|
|
235
236
|
if (isGroupItem(item)) {
|
|
236
237
|
const children = buildPerms(item.children, href, usableModules);
|
|
238
|
+
if (children.length === 0) continue;
|
|
237
239
|
result.push({
|
|
238
240
|
title: item.title,
|
|
239
241
|
modules: item.modules,
|
|
240
242
|
children,
|
|
241
243
|
});
|
|
242
244
|
} else {
|
|
245
|
+
if (
|
|
246
|
+
(item.perms == null || item.perms.length === 0) &&
|
|
247
|
+
(item.subPerms == null || item.subPerms.length === 0)
|
|
248
|
+
)
|
|
249
|
+
continue;
|
|
243
250
|
result.push({
|
|
244
251
|
title: item.title,
|
|
245
252
|
href,
|
|
@@ -410,7 +417,7 @@ function findItemChainByCodes<TModule>(
|
|
|
410
417
|
return result;
|
|
411
418
|
}
|
|
412
419
|
|
|
413
|
-
// ──
|
|
420
|
+
// ── Main Function ──
|
|
414
421
|
|
|
415
422
|
function buildAppStructure<TModule, const TItems extends AppStructureItem<TModule>[]>(opts: {
|
|
416
423
|
items: TItems;
|
|
@@ -491,7 +498,7 @@ export function createAppStructure<TModule, const TItems extends AppStructureIte
|
|
|
491
498
|
} {
|
|
492
499
|
type TRet = AppStructure<TModule> & { perms: InferPerms<TItems> };
|
|
493
500
|
|
|
494
|
-
const Ctx =
|
|
501
|
+
const Ctx = createHmrSafeContext<TRet>("AppStructure");
|
|
495
502
|
|
|
496
503
|
const AppStructureProvider: ParentComponent = (props) => {
|
|
497
504
|
const structure = buildAppStructure(getOpts());
|
|
@@ -505,7 +512,7 @@ export function createAppStructure<TModule, const TItems extends AppStructureIte
|
|
|
505
512
|
|
|
506
513
|
const useAppStructure = (): TRet => {
|
|
507
514
|
const ctx = useContext(Ctx);
|
|
508
|
-
if (!ctx) throw new Error("AppStructureProvider
|
|
515
|
+
if (!ctx) throw new Error("AppStructureProvider is required.");
|
|
509
516
|
return ctx;
|
|
510
517
|
};
|
|
511
518
|
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type Context, createContext } from "solid-js";
|
|
2
|
+
|
|
3
|
+
const CACHE_KEY = "__simplysm_ctx__";
|
|
4
|
+
const cache = ((globalThis as unknown as Record<string, Record<string, unknown>>)[CACHE_KEY] ??= {});
|
|
5
|
+
|
|
6
|
+
export function createHmrSafeContext<TValue>(key: string): Context<TValue | undefined> {
|
|
7
|
+
return (cache[key] ??= createContext<TValue>()) as Context<TValue | undefined>;
|
|
8
|
+
}
|
|
@@ -4,10 +4,10 @@ import type { JSX } from "solid-js";
|
|
|
4
4
|
type SlotSetter = (value: (() => JSX.Element) | undefined) => void;
|
|
5
5
|
|
|
6
6
|
/**
|
|
7
|
-
*
|
|
7
|
+
* Factory function that creates a slot registration component.
|
|
8
8
|
*
|
|
9
|
-
* @param context - slot
|
|
10
|
-
* @param getSetter -
|
|
9
|
+
* @param context - Context to register the slot in
|
|
10
|
+
* @param getSetter - Function to extract the setter from the context value
|
|
11
11
|
*/
|
|
12
12
|
export function createSlotComponent<TCtx>(
|
|
13
13
|
context: Context<TCtx | undefined>,
|
|
@@ -15,7 +15,7 @@ export function createSlotComponent<TCtx>(
|
|
|
15
15
|
): ParentComponent {
|
|
16
16
|
return (props) => {
|
|
17
17
|
const ctx = useContext(context)!;
|
|
18
|
-
// eslint-disable-next-line solid/reactivity --
|
|
18
|
+
// eslint-disable-next-line solid/reactivity -- Slot registration runs only once on initial mount
|
|
19
19
|
getSetter(ctx)(() => props.children);
|
|
20
20
|
onCleanup(() => getSetter(ctx)(undefined));
|
|
21
21
|
return null;
|
|
@@ -1,25 +1,25 @@
|
|
|
1
1
|
import { type JSX } from "solid-js";
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
|
-
*
|
|
4
|
+
* Utility function that merges CSS styles.
|
|
5
5
|
*
|
|
6
6
|
* @remarks
|
|
7
|
-
* - string
|
|
8
|
-
* -
|
|
9
|
-
* -
|
|
10
|
-
* - undefined
|
|
7
|
+
* - Supports both string and object style formats
|
|
8
|
+
* - Object styles are merged into a single object (later values take precedence)
|
|
9
|
+
* - Strings are parsed and merged
|
|
10
|
+
* - undefined values are ignored
|
|
11
11
|
*
|
|
12
12
|
* @example
|
|
13
13
|
* ```tsx
|
|
14
|
-
* // Object
|
|
14
|
+
* // Object merge
|
|
15
15
|
* mergeStyles({ color: "red" }, { background: "blue" })
|
|
16
16
|
* // => { color: "red", background: "blue" }
|
|
17
17
|
*
|
|
18
|
-
* // String
|
|
18
|
+
* // String merge
|
|
19
19
|
* mergeStyles("color: red;", "background: blue;")
|
|
20
20
|
* // => { color: "red", background: "blue" }
|
|
21
21
|
*
|
|
22
|
-
* // Mixed
|
|
22
|
+
* // Mixed merge
|
|
23
23
|
* mergeStyles({ color: "red" }, "background: blue;")
|
|
24
24
|
* // => { color: "red", background: "blue" }
|
|
25
25
|
* ```
|
|
@@ -33,7 +33,7 @@ export function mergeStyles(
|
|
|
33
33
|
if (style === undefined) continue;
|
|
34
34
|
|
|
35
35
|
if (typeof style === "string") {
|
|
36
|
-
// CSS string
|
|
36
|
+
// Parse CSS string
|
|
37
37
|
const declarations = style.split(";").filter((s) => s.trim());
|
|
38
38
|
for (const declaration of declarations) {
|
|
39
39
|
const colonIndex = declaration.indexOf(":");
|
|
@@ -42,7 +42,7 @@ export function mergeStyles(
|
|
|
42
42
|
const property = declaration.slice(0, colonIndex).trim();
|
|
43
43
|
const value = declaration.slice(colonIndex + 1).trim();
|
|
44
44
|
if (property && value) {
|
|
45
|
-
// kebab-case
|
|
45
|
+
// Convert kebab-case to camelCase
|
|
46
46
|
const camelProperty = property.replace(/-([a-z])/g, (_, letter: string) =>
|
|
47
47
|
letter.toUpperCase(),
|
|
48
48
|
);
|
|
@@ -50,7 +50,7 @@ export function mergeStyles(
|
|
|
50
50
|
}
|
|
51
51
|
}
|
|
52
52
|
} else {
|
|
53
|
-
//
|
|
53
|
+
// Merge object styles
|
|
54
54
|
Object.assign(result, style);
|
|
55
55
|
}
|
|
56
56
|
}
|
|
@@ -1,37 +1,37 @@
|
|
|
1
1
|
import { createSignal, createEffect } from "solid-js";
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
|
-
*
|
|
5
|
-
*
|
|
4
|
+
* Utility type that restricts function types.
|
|
5
|
+
* If a function type is passed, it is converted to never, causing a compile-time error.
|
|
6
6
|
*
|
|
7
7
|
* @remarks
|
|
8
|
-
*
|
|
8
|
+
* To store a function, wrap it in an object: `createControllableSignal<{ fn: () => void }>(...)`
|
|
9
9
|
*/
|
|
10
10
|
type NotFunction<TValue> = TValue extends (...args: unknown[]) => unknown ? never : TValue;
|
|
11
11
|
|
|
12
12
|
/**
|
|
13
|
-
*
|
|
13
|
+
* Signal hook that supports the controlled/uncontrolled pattern.
|
|
14
14
|
*
|
|
15
15
|
* @remarks
|
|
16
|
-
* - `onChange
|
|
17
|
-
* - `onChange
|
|
18
|
-
* -
|
|
16
|
+
* - When `onChange` is provided: controlled mode, value managed externally
|
|
17
|
+
* - When `onChange` is absent: uncontrolled mode, uses internal state
|
|
18
|
+
* - Supports functional setter: `setValue(prev => !prev)`
|
|
19
19
|
*
|
|
20
20
|
* @example
|
|
21
21
|
* ```tsx
|
|
22
|
-
* // Controlled
|
|
22
|
+
* // Controlled mode (onOpenChange provided)
|
|
23
23
|
* const [open, setOpen] = createControllableSignal({
|
|
24
24
|
* value: () => props.open ?? false,
|
|
25
25
|
* onChange: () => props.onOpenChange,
|
|
26
26
|
* });
|
|
27
27
|
*
|
|
28
|
-
* // Uncontrolled
|
|
28
|
+
* // Uncontrolled mode (onOpenChange not provided)
|
|
29
29
|
* const [open, setOpen] = createControllableSignal({
|
|
30
30
|
* value: () => props.open ?? false,
|
|
31
31
|
* onChange: () => undefined,
|
|
32
32
|
* });
|
|
33
33
|
*
|
|
34
|
-
* //
|
|
34
|
+
* // Functional setter
|
|
35
35
|
* setOpen(prev => !prev);
|
|
36
36
|
* ```
|
|
37
37
|
*/
|
|
@@ -41,7 +41,7 @@ export function createControllableSignal<TValue>(options: {
|
|
|
41
41
|
}) {
|
|
42
42
|
const [internalValue, setInternalValue] = createSignal<TValue>(options.value());
|
|
43
43
|
|
|
44
|
-
//
|
|
44
|
+
// Sync internal state when props change (props take precedence)
|
|
45
45
|
createEffect(() => {
|
|
46
46
|
const propValue = options.value();
|
|
47
47
|
setInternalValue(() => propValue);
|
|
@@ -4,22 +4,22 @@ import type { SetStoreFunction } from "solid-js/store";
|
|
|
4
4
|
import { objClone } from "@simplysm/core-common";
|
|
5
5
|
|
|
6
6
|
/**
|
|
7
|
-
*
|
|
7
|
+
* Store hook that supports the controlled/uncontrolled pattern.
|
|
8
8
|
*
|
|
9
9
|
* @remarks
|
|
10
|
-
* - `onChange
|
|
11
|
-
* - `onChange
|
|
12
|
-
* -
|
|
10
|
+
* - When `onChange` is provided: controlled mode, notifies changes via onChange on setter calls
|
|
11
|
+
* - When `onChange` is absent: uncontrolled mode, uses internal store only
|
|
12
|
+
* - Supports all SetStoreFunction overloads (path-based, produce, reconcile, etc.)
|
|
13
13
|
*
|
|
14
14
|
* @example
|
|
15
15
|
* ```tsx
|
|
16
|
-
* // Controlled
|
|
16
|
+
* // Controlled mode (onItemsChange provided)
|
|
17
17
|
* const [items, setItems] = createControllableStore<Item[]>({
|
|
18
18
|
* value: () => props.items ?? [],
|
|
19
19
|
* onChange: () => props.onItemsChange,
|
|
20
20
|
* });
|
|
21
21
|
*
|
|
22
|
-
* // Uncontrolled
|
|
22
|
+
* // Uncontrolled mode (onItemsChange not provided)
|
|
23
23
|
* const [items, setItems] = createControllableStore<Item[]>({
|
|
24
24
|
* value: () => [],
|
|
25
25
|
* onChange: () => undefined,
|
|
@@ -32,12 +32,12 @@ export function createControllableStore<TValue extends object>(options: {
|
|
|
32
32
|
}): [TValue, SetStoreFunction<TValue>] {
|
|
33
33
|
const [store, rawSet] = createStore<TValue>(objClone(options.value()));
|
|
34
34
|
|
|
35
|
-
//
|
|
35
|
+
// Sync internal store when external value changes
|
|
36
36
|
createEffect(() => {
|
|
37
37
|
rawSet(reconcile(options.value()) as any);
|
|
38
38
|
});
|
|
39
39
|
|
|
40
|
-
//
|
|
40
|
+
// Wrap setter with a function wrapper to add onChange notification
|
|
41
41
|
const wrappedSet = ((...args: any[]) => {
|
|
42
42
|
const before = JSON.stringify(unwrap(store));
|
|
43
43
|
(rawSet as any)(...args);
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
import { createSignal, onCleanup } from "solid-js";
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
|
-
* IME
|
|
4
|
+
* IME composition handling hook.
|
|
5
5
|
*
|
|
6
6
|
* @remarks
|
|
7
|
-
*
|
|
8
|
-
* -
|
|
9
|
-
* -
|
|
10
|
-
* -
|
|
7
|
+
* Delays onValueChange during IME composition (e.g., Korean) to prevent DOM recreation (composition breakage).
|
|
8
|
+
* - During composition: only updates composingValue (for content div display)
|
|
9
|
+
* - On compositionEnd: delays setValue call via setTimeout(0)
|
|
10
|
+
* - Cleanup: immediately commits uncommitted value via flushComposition
|
|
11
11
|
*
|
|
12
|
-
* @param setValue -
|
|
13
|
-
* @returns IME
|
|
12
|
+
* @param setValue - Value commit function
|
|
13
|
+
* @returns IME handler object
|
|
14
14
|
*/
|
|
15
15
|
export function createIMEHandler(setValue: (value: string) => void) {
|
|
16
16
|
const [composingValue, setComposingValue] = createSignal<string | null>(null);
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { createSignal, createEffect, onCleanup } from "solid-js";
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
|
-
*
|
|
4
|
+
* Mount transition hook for open/close animations.
|
|
5
5
|
*
|
|
6
6
|
* @remarks
|
|
7
|
-
* - `open
|
|
8
|
-
* - `open
|
|
9
|
-
* -
|
|
7
|
+
* - When `open` becomes true: immediately sets `mounted=true`, then `animating=true` after double rAF
|
|
8
|
+
* - When `open` becomes false: immediately sets `animating=false`, then `mounted=false` after transitionend or fallback timer (200ms)
|
|
9
|
+
* - Used with CSS transitions: `mounted()` for DOM rendering, `animating()` for CSS class toggling
|
|
10
10
|
*/
|
|
11
11
|
export function createMountTransition(open: () => boolean): {
|
|
12
12
|
mounted: () => boolean;
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import {
|
|
2
2
|
type JSX,
|
|
3
3
|
type ParentComponent,
|
|
4
|
-
createContext,
|
|
5
4
|
createMemo,
|
|
6
5
|
splitProps,
|
|
7
6
|
useContext,
|
|
8
7
|
} from "solid-js";
|
|
8
|
+
import { createHmrSafeContext } from "../helpers/createHmrSafeContext";
|
|
9
9
|
import { twMerge } from "tailwind-merge";
|
|
10
10
|
import { createControllableSignal } from "./createControllableSignal";
|
|
11
11
|
import { Invalid } from "../components/form-control/Invalid";
|
|
@@ -106,14 +106,16 @@ export function createSelectionGroup(config: MultiGroupConfig | SingleGroupConfi
|
|
|
106
106
|
Item: <TValue = unknown>(props: SelectionGroupItemProps<TValue>) => JSX.Element;
|
|
107
107
|
};
|
|
108
108
|
} {
|
|
109
|
-
const Context =
|
|
109
|
+
const Context = createHmrSafeContext<MultiSelectContext | SingleSelectContext>(
|
|
110
|
+
`SelectionGroup_${config.contextName}`,
|
|
111
|
+
);
|
|
110
112
|
const ItemComponent = config.ItemComponent;
|
|
111
113
|
|
|
112
114
|
function ItemInner<TValue>(props: SelectionGroupItemProps<TValue>) {
|
|
113
115
|
const ctx = useContext(Context);
|
|
114
116
|
if (!ctx)
|
|
115
117
|
throw new Error(
|
|
116
|
-
`${config.contextName}.Item
|
|
118
|
+
`${config.contextName}.Item can only be used inside ${config.contextName}`,
|
|
117
119
|
);
|
|
118
120
|
|
|
119
121
|
const isSelected = (): boolean => {
|
|
@@ -3,9 +3,9 @@ import { createSignal, type Accessor, type JSX } from "solid-js";
|
|
|
3
3
|
export type SlotAccessor = (() => JSX.Element) | undefined;
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
|
-
*
|
|
6
|
+
* Creates a signal for slot registration.
|
|
7
7
|
*
|
|
8
|
-
* @returns [accessor, setter]
|
|
8
|
+
* @returns [accessor, setter] -- setter is wrapped to store a function as a value
|
|
9
9
|
*/
|
|
10
10
|
export function createSlotSignal(): [Accessor<SlotAccessor>, (content: SlotAccessor) => void] {
|
|
11
11
|
const [slot, _setSlot] = createSignal<SlotAccessor>();
|
|
@@ -6,28 +6,28 @@ type StorageSetter<TValue> = (
|
|
|
6
6
|
) => TValue | undefined;
|
|
7
7
|
|
|
8
8
|
/**
|
|
9
|
-
* localStorage
|
|
10
|
-
*
|
|
11
|
-
*
|
|
9
|
+
* localStorage-based storage hook.
|
|
10
|
+
* Always uses localStorage regardless of syncStorage settings.
|
|
11
|
+
* Used for data that should be maintained independently per device (auth tokens, device-specific state, etc.).
|
|
12
12
|
*
|
|
13
|
-
*
|
|
13
|
+
* Keys are automatically prefixed with ConfigContext's `clientName`. (`${clientName}.${key}`)
|
|
14
14
|
*
|
|
15
|
-
* @template T -
|
|
16
|
-
* @param key - localStorage
|
|
17
|
-
* @param initialValue -
|
|
18
|
-
* @returns [Accessor<T | undefined>, StorageSetter<T>]
|
|
15
|
+
* @template T - Type of the value to store
|
|
16
|
+
* @param key - localStorage key
|
|
17
|
+
* @param initialValue - Initial value (optional)
|
|
18
|
+
* @returns [Accessor<T | undefined>, StorageSetter<T>] tuple
|
|
19
19
|
*
|
|
20
20
|
* @example
|
|
21
21
|
* ```tsx
|
|
22
22
|
* const [token, setToken] = useLocalStorage<string>("auth-token");
|
|
23
23
|
*
|
|
24
|
-
* //
|
|
24
|
+
* // Set value
|
|
25
25
|
* setToken("abc123");
|
|
26
26
|
*
|
|
27
|
-
* //
|
|
27
|
+
* // Read value
|
|
28
28
|
* console.log(token()); // "abc123"
|
|
29
29
|
*
|
|
30
|
-
* //
|
|
30
|
+
* // Remove value
|
|
31
31
|
* setToken(undefined);
|
|
32
32
|
* ```
|
|
33
33
|
*/
|
|
@@ -38,7 +38,7 @@ export function useLocalStorage<TValue>(
|
|
|
38
38
|
const config = useConfig();
|
|
39
39
|
const prefixedKey = `${config.clientName}.${key}`;
|
|
40
40
|
|
|
41
|
-
//
|
|
41
|
+
// Read initial value from localStorage
|
|
42
42
|
let storedValue: TValue | undefined = initialValue;
|
|
43
43
|
try {
|
|
44
44
|
const item = localStorage.getItem(prefixedKey);
|
|
@@ -46,7 +46,7 @@ export function useLocalStorage<TValue>(
|
|
|
46
46
|
storedValue = JSON.parse(item) as TValue;
|
|
47
47
|
}
|
|
48
48
|
} catch {
|
|
49
|
-
//
|
|
49
|
+
// Use initial value on JSON parse failure
|
|
50
50
|
}
|
|
51
51
|
|
|
52
52
|
const [value, setValue] = createSignal<TValue | undefined>(storedValue);
|
package/src/hooks/useLogger.ts
CHANGED
|
@@ -9,7 +9,7 @@ export interface Logger {
|
|
|
9
9
|
info: (...args: unknown[]) => void;
|
|
10
10
|
warn: (...args: unknown[]) => void;
|
|
11
11
|
error: (...args: unknown[]) => void;
|
|
12
|
-
/** LogAdapter
|
|
12
|
+
/** Inject LogAdapter later. Only usable inside LoggerProvider */
|
|
13
13
|
configure: (fn: (origin: LogAdapter) => LogAdapter) => void;
|
|
14
14
|
}
|
|
15
15
|
|
|
@@ -34,7 +34,7 @@ export function useLogger(): Logger {
|
|
|
34
34
|
error: createLogFunction("error"),
|
|
35
35
|
configure: (fn: (origin: LogAdapter) => LogAdapter) => {
|
|
36
36
|
if (!loggerCtx) {
|
|
37
|
-
throw new Error("configure()
|
|
37
|
+
throw new Error("configure() can only be used inside LoggerProvider");
|
|
38
38
|
}
|
|
39
39
|
loggerCtx.configure(fn);
|
|
40
40
|
},
|
|
@@ -1,41 +1,41 @@
|
|
|
1
1
|
import { useNavigate } from "@solidjs/router";
|
|
2
2
|
|
|
3
3
|
export interface RouterLinkOptions {
|
|
4
|
-
/**
|
|
4
|
+
/** Navigation path (complete URL, e.g., "/home/dashboard?tab=1") */
|
|
5
5
|
href: string;
|
|
6
6
|
|
|
7
|
-
/**
|
|
7
|
+
/** Data to pass during navigation (not exposed in the URL) */
|
|
8
8
|
state?: Record<string, unknown>;
|
|
9
9
|
|
|
10
|
-
/**
|
|
10
|
+
/** New window size on Shift+click */
|
|
11
11
|
window?: {
|
|
12
|
-
width?: number; //
|
|
13
|
-
height?: number; //
|
|
12
|
+
width?: number; // Default: 800
|
|
13
|
+
height?: number; // Default: 800
|
|
14
14
|
};
|
|
15
15
|
}
|
|
16
16
|
|
|
17
17
|
/**
|
|
18
|
-
*
|
|
18
|
+
* Hook that handles router navigation.
|
|
19
19
|
*
|
|
20
20
|
* @remarks
|
|
21
|
-
* -
|
|
22
|
-
* - Ctrl/Alt +
|
|
23
|
-
* - Shift +
|
|
21
|
+
* - Normal click: SPA routing (useNavigate)
|
|
22
|
+
* - Ctrl/Alt + click: new tab
|
|
23
|
+
* - Shift + click: new window (with window option size applied)
|
|
24
24
|
*
|
|
25
25
|
* @example
|
|
26
26
|
* ```tsx
|
|
27
27
|
* const navigate = useRouterLink();
|
|
28
28
|
*
|
|
29
29
|
* <ListItem onClick={navigate({ href: "/home/dashboard" })}>
|
|
30
|
-
*
|
|
30
|
+
* Dashboard
|
|
31
31
|
* </ListItem>
|
|
32
32
|
*
|
|
33
|
-
* // state
|
|
33
|
+
* // Passing state
|
|
34
34
|
* <ListItem onClick={navigate({
|
|
35
35
|
* href: "/users/123",
|
|
36
36
|
* state: { from: "list" }
|
|
37
37
|
* })}>
|
|
38
|
-
*
|
|
38
|
+
* Users
|
|
39
39
|
* </ListItem>
|
|
40
40
|
* ```
|
|
41
41
|
*/
|
|
@@ -50,15 +50,15 @@ export function useRouterLink(): (
|
|
|
50
50
|
e.stopPropagation();
|
|
51
51
|
|
|
52
52
|
if (e.ctrlKey || e.metaKey || e.altKey) {
|
|
53
|
-
// Ctrl/Cmd/Alt +
|
|
53
|
+
// Ctrl/Cmd/Alt + click: new tab
|
|
54
54
|
window.open(options.href, "_blank");
|
|
55
55
|
} else if (e.shiftKey) {
|
|
56
|
-
// Shift +
|
|
56
|
+
// Shift + click: new window
|
|
57
57
|
const width = options.window?.width ?? 800;
|
|
58
58
|
const height = options.window?.height ?? 800;
|
|
59
59
|
window.open(options.href, "", `width=${width},height=${height}`);
|
|
60
60
|
} else {
|
|
61
|
-
//
|
|
61
|
+
// Normal click: SPA routing
|
|
62
62
|
navigate(options.href, options.state ? { state: options.state } : undefined);
|
|
63
63
|
}
|
|
64
64
|
};
|
package/src/index.ts
CHANGED
|
@@ -6,9 +6,6 @@ export * from "./components/form-control/Button";
|
|
|
6
6
|
// Select
|
|
7
7
|
export * from "./components/form-control/select/Select";
|
|
8
8
|
|
|
9
|
-
// SelectList
|
|
10
|
-
export * from "./components/form-control/select-list/SelectList";
|
|
11
|
-
|
|
12
9
|
// Combobox
|
|
13
10
|
export * from "./components/form-control/combobox/Combobox";
|
|
14
11
|
|
|
@@ -134,6 +131,10 @@ export * from "./providers/shared-data/SharedDataChangeEvent";
|
|
|
134
131
|
// SystemProvider
|
|
135
132
|
export * from "./providers/SystemProvider";
|
|
136
133
|
|
|
134
|
+
// I18n
|
|
135
|
+
export * from "./providers/i18n/I18nContext";
|
|
136
|
+
export * from "./providers/i18n/I18nContext.types";
|
|
137
|
+
|
|
137
138
|
//#endregion
|
|
138
139
|
|
|
139
140
|
//#region ========== Hooks ==========
|