@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/docs/helpers.md
DELETED
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
# Helpers & Directives
|
|
2
|
-
|
|
3
|
-
## mergeStyles
|
|
4
|
-
|
|
5
|
-
Utility for merging inline style strings and `JSX.CSSProperties` objects.
|
|
6
|
-
|
|
7
|
-
```typescript
|
|
8
|
-
import { mergeStyles } from "@simplysm/solid";
|
|
9
|
-
|
|
10
|
-
const style = mergeStyles("color: red", { fontSize: "14px" }, props.style);
|
|
11
|
-
```
|
|
12
|
-
|
|
13
|
-
---
|
|
14
|
-
|
|
15
|
-
## ripple directive
|
|
16
|
-
|
|
17
|
-
Material Design ripple effect directive. Displays ripple effect on click.
|
|
18
|
-
|
|
19
|
-
```tsx
|
|
20
|
-
import { ripple } from "@simplysm/solid";
|
|
21
|
-
// Keep reference to register directive
|
|
22
|
-
void ripple;
|
|
23
|
-
|
|
24
|
-
<button use:ripple={true}>Click</button>
|
|
25
|
-
<button use:ripple={!props.disabled}>Conditional activation</button>
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
- Creates internal ripple container, operates without affecting parent element
|
|
29
|
-
- Automatically disabled when `prefers-reduced-motion: reduce` is set
|
|
30
|
-
- Single ripple mode: removes previous ripple on new click
|
|
31
|
-
|
|
32
|
-
---
|
|
33
|
-
|
|
34
|
-
## createAppStructure
|
|
35
|
-
|
|
36
|
-
See [createAppStructure](hooks.md#createappstructure) in the Hooks documentation for full API details.
|
|
37
|
-
|
|
38
|
-
Exports the following types:
|
|
39
|
-
|
|
40
|
-
```typescript
|
|
41
|
-
import {
|
|
42
|
-
createAppStructure,
|
|
43
|
-
type AppStructure,
|
|
44
|
-
type AppStructureItem,
|
|
45
|
-
type AppStructureGroupItem,
|
|
46
|
-
type AppStructureLeafItem,
|
|
47
|
-
type AppStructureSubPerm,
|
|
48
|
-
type AppRoute,
|
|
49
|
-
type AppMenu,
|
|
50
|
-
type AppFlatMenu,
|
|
51
|
-
type AppPerm,
|
|
52
|
-
type AppFlatPerm,
|
|
53
|
-
} from "@simplysm/solid";
|
|
54
|
-
```
|
package/docs/hooks.md
DELETED
|
@@ -1,588 +0,0 @@
|
|
|
1
|
-
# Hooks
|
|
2
|
-
|
|
3
|
-
## useTheme
|
|
4
|
-
|
|
5
|
-
Hook to access theme (dark/light/system) state. Must be used inside `ThemeProvider`.
|
|
6
|
-
|
|
7
|
-
```tsx
|
|
8
|
-
import { useTheme } from "@simplysm/solid";
|
|
9
|
-
|
|
10
|
-
const theme = useTheme();
|
|
11
|
-
theme.mode(); // "light" | "dark" | "system"
|
|
12
|
-
theme.resolvedTheme(); // "light" | "dark" (follows OS setting when system)
|
|
13
|
-
theme.setMode("dark");
|
|
14
|
-
theme.cycleMode(); // light -> system -> dark -> light
|
|
15
|
-
```
|
|
16
|
-
|
|
17
|
-
| Property/Method | Type | Description |
|
|
18
|
-
|-----------------|------|-------------|
|
|
19
|
-
| `mode` | `() => ThemeMode` | Current theme mode |
|
|
20
|
-
| `resolvedTheme` | `() => ResolvedTheme` | Actual applied theme |
|
|
21
|
-
| `setMode` | `(mode: ThemeMode) => void` | Set theme mode |
|
|
22
|
-
| `cycleMode` | `() => void` | Cycle to next mode |
|
|
23
|
-
|
|
24
|
-
---
|
|
25
|
-
|
|
26
|
-
## useLocalStorage
|
|
27
|
-
|
|
28
|
-
Local-only persistent storage hook. Always uses `localStorage` regardless of `syncStorage` setting. Keys are automatically prefixed as `{clientName}.{key}`. Use for data that should never leave the device (auth tokens, device-specific state).
|
|
29
|
-
|
|
30
|
-
```tsx
|
|
31
|
-
import { useLocalStorage } from "@simplysm/solid";
|
|
32
|
-
|
|
33
|
-
const [token, setToken] = useLocalStorage<string>("auth-token");
|
|
34
|
-
|
|
35
|
-
// Set value
|
|
36
|
-
setToken("abc123");
|
|
37
|
-
|
|
38
|
-
// Remove value
|
|
39
|
-
setToken(undefined);
|
|
40
|
-
|
|
41
|
-
// Functional update
|
|
42
|
-
setToken((prev) => prev + "-refreshed");
|
|
43
|
-
```
|
|
44
|
-
|
|
45
|
-
| Return value | Type | Description |
|
|
46
|
-
|--------------|------|-------------|
|
|
47
|
-
| `[0]` | `Accessor<T \| undefined>` | Value getter |
|
|
48
|
-
| `[1]` | `StorageSetter<T>` | Value setter (accepts value, `undefined` to remove, or updater function) |
|
|
49
|
-
|
|
50
|
-
---
|
|
51
|
-
|
|
52
|
-
## useSyncConfig
|
|
53
|
-
|
|
54
|
-
Syncable config hook. Uses `SyncStorageProvider` storage if present, falls back to `localStorage` otherwise. Keys are automatically prefixed as `{clientName}.{key}`. Use for user preferences that should sync across devices (theme, DataSheet column configs, filter presets).
|
|
55
|
-
|
|
56
|
-
```tsx
|
|
57
|
-
import { useSyncConfig } from "@simplysm/solid";
|
|
58
|
-
|
|
59
|
-
const [theme, setTheme, ready] = useSyncConfig("theme", "light");
|
|
60
|
-
|
|
61
|
-
// ready state indicates initialization is complete
|
|
62
|
-
// When syncStorage is not configured (localStorage), ready is immediately true
|
|
63
|
-
```
|
|
64
|
-
|
|
65
|
-
| Return value | Type | Description |
|
|
66
|
-
|--------------|------|-------------|
|
|
67
|
-
| `[0]` | `Accessor<T>` | Value getter |
|
|
68
|
-
| `[1]` | `Setter<T>` | Value setter |
|
|
69
|
-
| `[2]` | `Accessor<boolean>` | Ready state (`true` after initialization) |
|
|
70
|
-
|
|
71
|
-
---
|
|
72
|
-
|
|
73
|
-
## useLogger
|
|
74
|
-
|
|
75
|
-
Logging hook. If `LoggerProvider` is present, logs are sent to the adapter only. Otherwise, logs fall back to `consola`.
|
|
76
|
-
|
|
77
|
-
```tsx
|
|
78
|
-
import { useLogger, type Logger } from "@simplysm/solid";
|
|
79
|
-
|
|
80
|
-
const logger: Logger = useLogger();
|
|
81
|
-
logger.log("user action", { userId: 123 });
|
|
82
|
-
logger.info("app started");
|
|
83
|
-
logger.error("something failed", errorObj);
|
|
84
|
-
logger.warn("deprecation notice");
|
|
85
|
-
```
|
|
86
|
-
|
|
87
|
-
**Logger interface:**
|
|
88
|
-
|
|
89
|
-
| Method | Signature | Description |
|
|
90
|
-
|--------|-----------|-------------|
|
|
91
|
-
| `log` | `(...args: unknown[]) => void` | Log message (general) |
|
|
92
|
-
| `info` | `(...args: unknown[]) => void` | Log message (informational) |
|
|
93
|
-
| `warn` | `(...args: unknown[]) => void` | Log message (warning) |
|
|
94
|
-
| `error` | `(...args: unknown[]) => void` | Log message (error) |
|
|
95
|
-
| `configure` | `(fn: (origin: LogAdapter) => LogAdapter) => void` | Set or wrap the log adapter (inside `LoggerProvider` only) |
|
|
96
|
-
|
|
97
|
-
**Configuring a custom adapter (decorator pattern):**
|
|
98
|
-
|
|
99
|
-
```tsx
|
|
100
|
-
// Replace default consola adapter
|
|
101
|
-
useLogger().configure((origin) => myLogAdapter);
|
|
102
|
-
|
|
103
|
-
// Wrap default adapter (chaining)
|
|
104
|
-
useLogger().configure((origin) => ({
|
|
105
|
-
write(severity, ...data) {
|
|
106
|
-
sendToServer(severity, ...data);
|
|
107
|
-
origin.write(severity, ...data); // also log to consola
|
|
108
|
-
},
|
|
109
|
-
}));
|
|
110
|
-
```
|
|
111
|
-
|
|
112
|
-
**Global error capturing:** `ErrorLoggerProvider` captures uncaught errors (`window.onerror`) and unhandled promise rejections (`unhandledrejection`) and logs them via `useLogger`.
|
|
113
|
-
|
|
114
|
-
---
|
|
115
|
-
|
|
116
|
-
## useNotification
|
|
117
|
-
|
|
118
|
-
Hook to access notification system. Must be used inside `NotificationProvider`. See [Notification](feedback.md#notification) for detailed API.
|
|
119
|
-
|
|
120
|
-
---
|
|
121
|
-
|
|
122
|
-
## useBusy
|
|
123
|
-
|
|
124
|
-
Hook to access busy overlay. Must be used inside `BusyProvider`. See [Busy](feedback.md#busy) for detailed API.
|
|
125
|
-
|
|
126
|
-
---
|
|
127
|
-
|
|
128
|
-
## usePrint
|
|
129
|
-
|
|
130
|
-
Hook for printing and PDF generation. Must be used inside `<PrintProvider>`. See [Print / usePrint](feedback.md#print--useprint) for detailed API.
|
|
131
|
-
|
|
132
|
-
---
|
|
133
|
-
|
|
134
|
-
## useConfig
|
|
135
|
-
|
|
136
|
-
Hook to access app-wide configuration. Must be used inside `ConfigProvider`.
|
|
137
|
-
|
|
138
|
-
```tsx
|
|
139
|
-
import { useConfig } from "@simplysm/solid";
|
|
140
|
-
|
|
141
|
-
const config = useConfig();
|
|
142
|
-
console.log(config.clientName); // "my-app"
|
|
143
|
-
```
|
|
144
|
-
|
|
145
|
-
---
|
|
146
|
-
|
|
147
|
-
## useServiceClient
|
|
148
|
-
|
|
149
|
-
Hook to access the WebSocket service client context. Must be used inside `ServiceClientProvider`. See [ServiceClientProvider](providers.md#serviceclientprovider) for detailed API.
|
|
150
|
-
|
|
151
|
-
---
|
|
152
|
-
|
|
153
|
-
## useSharedData
|
|
154
|
-
|
|
155
|
-
Hook to access shared data managed by `SharedDataProvider`. Must be used inside `SharedDataProvider`. See [SharedDataProvider](providers.md#shareddataprovider) for detailed API.
|
|
156
|
-
|
|
157
|
-
---
|
|
158
|
-
|
|
159
|
-
## createControllableSignal
|
|
160
|
-
|
|
161
|
-
Signal hook that automatically handles Controlled/Uncontrolled patterns. Operates in controlled mode when `onChange` is provided, uncontrolled mode otherwise.
|
|
162
|
-
|
|
163
|
-
```tsx
|
|
164
|
-
import { createControllableSignal } from "@simplysm/solid";
|
|
165
|
-
|
|
166
|
-
// Use inside components
|
|
167
|
-
const [value, setValue] = createControllableSignal({
|
|
168
|
-
value: () => props.value ?? "",
|
|
169
|
-
onChange: () => props.onValueChange,
|
|
170
|
-
});
|
|
171
|
-
|
|
172
|
-
// Supports functional setter
|
|
173
|
-
setValue((prev) => prev + "!");
|
|
174
|
-
```
|
|
175
|
-
|
|
176
|
-
---
|
|
177
|
-
|
|
178
|
-
## createControllableStore
|
|
179
|
-
|
|
180
|
-
Store hook that automatically handles Controlled/Uncontrolled patterns for objects and arrays. Similar to `createControllableSignal` but uses SolidJS `createStore` internally, supporting path-based updates via `SetStoreFunction`.
|
|
181
|
-
|
|
182
|
-
Operates in controlled mode when `onChange` is provided (setter calls `onChange` with cloned value), uncontrolled mode otherwise (internal store only).
|
|
183
|
-
|
|
184
|
-
```tsx
|
|
185
|
-
import { createControllableStore } from "@simplysm/solid";
|
|
186
|
-
|
|
187
|
-
// Controlled mode (parent manages state)
|
|
188
|
-
const [items, setItems] = createControllableStore<Item[]>({
|
|
189
|
-
value: () => props.items ?? [],
|
|
190
|
-
onChange: () => props.onItemsChange,
|
|
191
|
-
});
|
|
192
|
-
|
|
193
|
-
// Uncontrolled mode (internal state only)
|
|
194
|
-
const [items, setItems] = createControllableStore<Item[]>({
|
|
195
|
-
value: () => [],
|
|
196
|
-
onChange: () => undefined,
|
|
197
|
-
});
|
|
198
|
-
|
|
199
|
-
// Supports all SetStoreFunction overloads
|
|
200
|
-
setItems(0, "name", "updated"); // path-based update
|
|
201
|
-
setItems(produce((draft) => { ... })); // produce
|
|
202
|
-
setItems(reconcile(newItems)); // reconcile
|
|
203
|
-
```
|
|
204
|
-
|
|
205
|
-
| Option | Type | Description |
|
|
206
|
-
|--------|------|-------------|
|
|
207
|
-
| `value` | `() => TValue` | Reactive value accessor (syncs external changes to internal store) |
|
|
208
|
-
| `onChange` | `() => ((value: TValue) => void) \| undefined` | Change callback accessor. When defined, enables controlled mode |
|
|
209
|
-
|
|
210
|
-
| Return | Type | Description |
|
|
211
|
-
|--------|------|-------------|
|
|
212
|
-
| `[0]` | `TValue` | Store (reactive proxy) |
|
|
213
|
-
| `[1]` | `SetStoreFunction<TValue>` | Store setter (triggers `onChange` in controlled mode) |
|
|
214
|
-
|
|
215
|
-
---
|
|
216
|
-
|
|
217
|
-
## createMountTransition
|
|
218
|
-
|
|
219
|
-
Mount transition hook for open/close CSS animations. Control DOM rendering with `mounted()` and toggle CSS classes with `animating()`.
|
|
220
|
-
|
|
221
|
-
```tsx
|
|
222
|
-
import { createMountTransition } from "@simplysm/solid";
|
|
223
|
-
|
|
224
|
-
const { mounted, animating, unmount } = createMountTransition(() => open());
|
|
225
|
-
```
|
|
226
|
-
|
|
227
|
-
| Return value | Type | Description |
|
|
228
|
-
|--------------|------|-------------|
|
|
229
|
-
| `mounted` | `() => boolean` | Whether mounted in DOM |
|
|
230
|
-
| `animating` | `() => boolean` | Animation active state |
|
|
231
|
-
| `unmount` | `() => void` | Manual unmount |
|
|
232
|
-
|
|
233
|
-
---
|
|
234
|
-
|
|
235
|
-
## createIMEHandler
|
|
236
|
-
|
|
237
|
-
Hook that delays `setValue` calls during IME (Korean, CJK, etc.) composition to prevent interrupted input. Use inside contenteditable or custom input components.
|
|
238
|
-
|
|
239
|
-
```tsx
|
|
240
|
-
import { createIMEHandler } from "@simplysm/solid";
|
|
241
|
-
|
|
242
|
-
const {
|
|
243
|
-
composingValue,
|
|
244
|
-
handleCompositionStart,
|
|
245
|
-
handleInput,
|
|
246
|
-
handleCompositionEnd,
|
|
247
|
-
flushComposition,
|
|
248
|
-
} = createIMEHandler((value) => {
|
|
249
|
-
// called only when composition is complete
|
|
250
|
-
setMyValue(value);
|
|
251
|
-
});
|
|
252
|
-
|
|
253
|
-
// Wire up to DOM element events:
|
|
254
|
-
<div
|
|
255
|
-
contentEditable
|
|
256
|
-
onCompositionStart={handleCompositionStart}
|
|
257
|
-
onCompositionEnd={(e) => handleCompositionEnd(e.currentTarget.textContent ?? "")}
|
|
258
|
-
onInput={(e) => handleInput(e.currentTarget.textContent ?? "", e.isComposing)}
|
|
259
|
-
/>
|
|
260
|
-
```
|
|
261
|
-
|
|
262
|
-
| Return value | Type | Description |
|
|
263
|
-
|--------------|------|-------------|
|
|
264
|
-
| `composingValue` | `Accessor<string \| null>` | Current composing value (for display); `null` when not composing |
|
|
265
|
-
| `handleCompositionStart` | `() => void` | Call on `compositionstart` event |
|
|
266
|
-
| `handleInput` | `(value: string, isComposing: boolean) => void` | Call on `input` event |
|
|
267
|
-
| `handleCompositionEnd` | `(value: string) => void` | Call on `compositionend` event |
|
|
268
|
-
| `flushComposition` | `() => void` | Immediately commit any pending composition |
|
|
269
|
-
|
|
270
|
-
---
|
|
271
|
-
|
|
272
|
-
## createSlotSignal
|
|
273
|
-
|
|
274
|
-
Signal factory for slot registration pattern. Used internally by compound components (`SelectList`, etc.) to register child slot content.
|
|
275
|
-
|
|
276
|
-
```tsx
|
|
277
|
-
import { createSlotSignal, type SlotAccessor } from "@simplysm/solid";
|
|
278
|
-
|
|
279
|
-
const [headerSlot, setHeader] = createSlotSignal();
|
|
280
|
-
|
|
281
|
-
// Register slot content (typically from a sub-component)
|
|
282
|
-
setHeader(() => <div>Header Content</div>);
|
|
283
|
-
|
|
284
|
-
// Read slot content (in parent render)
|
|
285
|
-
<Show when={headerSlot()}>
|
|
286
|
-
{headerSlot()!()}
|
|
287
|
-
</Show>
|
|
288
|
-
|
|
289
|
-
// Unregister
|
|
290
|
-
setHeader(undefined);
|
|
291
|
-
```
|
|
292
|
-
|
|
293
|
-
| Return | Type | Description |
|
|
294
|
-
|--------|------|-------------|
|
|
295
|
-
| `[0]` | `Accessor<SlotAccessor>` | Slot accessor (`(() => JSX.Element) \| undefined`) |
|
|
296
|
-
| `[1]` | `(content: SlotAccessor) => void` | Slot setter |
|
|
297
|
-
|
|
298
|
-
**`SlotAccessor` type:** `(() => JSX.Element) | undefined`
|
|
299
|
-
|
|
300
|
-
---
|
|
301
|
-
|
|
302
|
-
## useRouterLink
|
|
303
|
-
|
|
304
|
-
`@solidjs/router`-based navigation hook. Automatically handles Ctrl/Alt + click (new tab), Shift + click (new window), and regular click (SPA routing).
|
|
305
|
-
|
|
306
|
-
```tsx
|
|
307
|
-
import { useRouterLink } from "@simplysm/solid";
|
|
308
|
-
|
|
309
|
-
const navigate = useRouterLink();
|
|
310
|
-
|
|
311
|
-
<List.Item onClick={navigate({ href: "/home/dashboard" })}>
|
|
312
|
-
Dashboard
|
|
313
|
-
</List.Item>
|
|
314
|
-
|
|
315
|
-
// Pass state (not visible in URL)
|
|
316
|
-
<List.Item onClick={navigate({ href: "/users/123", state: { from: "list" } })}>
|
|
317
|
-
User
|
|
318
|
-
</List.Item>
|
|
319
|
-
|
|
320
|
-
// Custom new window size on Shift+click
|
|
321
|
-
<List.Item onClick={navigate({ href: "/reports/pdf", window: { width: 1200, height: 900 } })}>
|
|
322
|
-
Report
|
|
323
|
-
</List.Item>
|
|
324
|
-
```
|
|
325
|
-
|
|
326
|
-
**Options:**
|
|
327
|
-
|
|
328
|
-
| Option | Type | Default | Description |
|
|
329
|
-
|--------|------|---------|-------------|
|
|
330
|
-
| `href` | `string` | (required) | Navigation path (fully-formed URL, e.g., `"/home/dashboard?tab=1"`) |
|
|
331
|
-
| `state` | `Record<string, unknown>` | - | State to pass to the route (not exposed in URL) |
|
|
332
|
-
| `window.width` | `number` | `800` | New window width (Shift+click) |
|
|
333
|
-
| `window.height` | `number` | `800` | New window height (Shift+click) |
|
|
334
|
-
|
|
335
|
-
---
|
|
336
|
-
|
|
337
|
-
## createAppStructure
|
|
338
|
-
|
|
339
|
-
Utility for declaratively defining app structure (routing, menus, permissions). Takes a factory function and returns `{ AppStructureProvider, useAppStructure }` for Context-based access with full `InferPerms` type preservation.
|
|
340
|
-
|
|
341
|
-
```tsx
|
|
342
|
-
// appStructure.ts
|
|
343
|
-
import { createAppStructure } from "@simplysm/solid";
|
|
344
|
-
import { IconHome, IconUsers } from "@tabler/icons-solidjs";
|
|
345
|
-
import { useAuth } from "./AuthProvider";
|
|
346
|
-
|
|
347
|
-
export const { AppStructureProvider, useAppStructure } = createAppStructure(() => {
|
|
348
|
-
const auth = useAuth();
|
|
349
|
-
return {
|
|
350
|
-
items: [
|
|
351
|
-
{
|
|
352
|
-
code: "home",
|
|
353
|
-
title: "Home",
|
|
354
|
-
icon: IconHome,
|
|
355
|
-
component: HomePage,
|
|
356
|
-
perms: ["use"],
|
|
357
|
-
},
|
|
358
|
-
{
|
|
359
|
-
code: "admin",
|
|
360
|
-
title: "Admin",
|
|
361
|
-
icon: IconUsers,
|
|
362
|
-
children: [
|
|
363
|
-
{ code: "users", title: "User Management", component: UsersPage, perms: ["use", "edit"] },
|
|
364
|
-
{ code: "roles", title: "Role Management", component: RolesPage, perms: ["use"], isNotMenu: true },
|
|
365
|
-
],
|
|
366
|
-
},
|
|
367
|
-
],
|
|
368
|
-
usableModules: () => activeModules(), // optional: filter by active modules
|
|
369
|
-
permRecord: () => auth.authInfo()?.permissions, // optional: Record<string, boolean>
|
|
370
|
-
};
|
|
371
|
-
});
|
|
372
|
-
```
|
|
373
|
-
|
|
374
|
-
The factory function (`getOpts`) is called inside `AppStructureProvider` at render time, so context hooks like `useAuth()` can be used. The `const TItems` generic preserves item literal types for full `InferPerms` type inference.
|
|
375
|
-
|
|
376
|
-
**Provider setup:**
|
|
377
|
-
|
|
378
|
-
```tsx
|
|
379
|
-
// main.tsx or App.tsx
|
|
380
|
-
import { AppStructureProvider } from "./appStructure";
|
|
381
|
-
|
|
382
|
-
render(
|
|
383
|
-
() => (
|
|
384
|
-
<AppStructureProvider>
|
|
385
|
-
<HashRouter>
|
|
386
|
-
{/* ... */}
|
|
387
|
-
</HashRouter>
|
|
388
|
-
</AppStructureProvider>
|
|
389
|
-
),
|
|
390
|
-
document.getElementById("root")!,
|
|
391
|
-
);
|
|
392
|
-
```
|
|
393
|
-
|
|
394
|
-
**Using the hook in components:**
|
|
395
|
-
|
|
396
|
-
```tsx
|
|
397
|
-
import { useAppStructure } from "./appStructure";
|
|
398
|
-
|
|
399
|
-
function Home(props: RouteSectionProps) {
|
|
400
|
-
const appStructure = useAppStructure();
|
|
401
|
-
|
|
402
|
-
// appStructure.usableRoutes() -- Accessor<AppRoute[]>
|
|
403
|
-
// appStructure.usableMenus() -- Accessor<AppMenu[]>
|
|
404
|
-
// appStructure.usableFlatMenus() -- Accessor<AppFlatMenu[]>
|
|
405
|
-
// appStructure.usablePerms() -- Accessor<AppPerm[]>
|
|
406
|
-
// appStructure.allFlatPerms -- AppFlatPerm[]
|
|
407
|
-
// appStructure.getTitleChainByHref(href) -- string[]
|
|
408
|
-
// appStructure.perms -- typed permission accessor
|
|
409
|
-
|
|
410
|
-
return <Sidebar.Menu menus={appStructure.usableMenus()} />;
|
|
411
|
-
}
|
|
412
|
-
```
|
|
413
|
-
|
|
414
|
-
**Routing integration with `@solidjs/router`:**
|
|
415
|
-
|
|
416
|
-
```tsx
|
|
417
|
-
import { useAppStructure } from "./appStructure";
|
|
418
|
-
|
|
419
|
-
function HomeRoutes() {
|
|
420
|
-
const appStructure = useAppStructure();
|
|
421
|
-
return (
|
|
422
|
-
<For each={appStructure.usableRoutes()}>
|
|
423
|
-
{(r) => <Route path={r.path} component={r.component} />}
|
|
424
|
-
</For>
|
|
425
|
-
);
|
|
426
|
-
}
|
|
427
|
-
|
|
428
|
-
// In your router setup (inside AppStructureProvider):
|
|
429
|
-
<Route path="/home" component={Home}>
|
|
430
|
-
<Route path="/" component={() => <Navigate href="/home/main" />} />
|
|
431
|
-
<HomeRoutes />
|
|
432
|
-
<Route path="/*" component={NotFoundPage} />
|
|
433
|
-
</Route>
|
|
434
|
-
```
|
|
435
|
-
|
|
436
|
-
`usableRoutes()` is a reactive accessor returning routes filtered by `usableModules` and `permRecord`. Items with `perms: ["use"]` are excluded from routes when the user lacks the `use` permission.
|
|
437
|
-
|
|
438
|
-
**AppStructure return type:**
|
|
439
|
-
|
|
440
|
-
```typescript
|
|
441
|
-
interface AppStructure<TModule> {
|
|
442
|
-
items: AppStructureItem<TModule>[];
|
|
443
|
-
usableRoutes: Accessor<AppRoute[]>; // reactive, filtered by modules + permRecord
|
|
444
|
-
usableMenus: Accessor<AppMenu[]>; // reactive, filtered by modules + permRecord
|
|
445
|
-
usableFlatMenus: Accessor<AppFlatMenu[]>; // reactive, flat version of usableMenus
|
|
446
|
-
usablePerms: Accessor<AppPerm<TModule>[]>; // reactive, filtered permission tree
|
|
447
|
-
allFlatPerms: AppFlatPerm<TModule>[]; // static, all perm entries (not reactive)
|
|
448
|
-
getTitleChainByHref(href: string): string[];
|
|
449
|
-
perms: InferPerms<TItems>; // typed permission accessor (getter-based reactive booleans)
|
|
450
|
-
}
|
|
451
|
-
|
|
452
|
-
interface AppRoute {
|
|
453
|
-
path: string;
|
|
454
|
-
component: Component;
|
|
455
|
-
}
|
|
456
|
-
|
|
457
|
-
interface AppMenu {
|
|
458
|
-
title: string;
|
|
459
|
-
href?: string;
|
|
460
|
-
icon?: Component<IconProps>;
|
|
461
|
-
children?: AppMenu[];
|
|
462
|
-
}
|
|
463
|
-
|
|
464
|
-
interface AppFlatMenu {
|
|
465
|
-
titleChain: string[];
|
|
466
|
-
href: string;
|
|
467
|
-
}
|
|
468
|
-
|
|
469
|
-
interface AppPerm<TModule = string> {
|
|
470
|
-
title: string;
|
|
471
|
-
href?: string;
|
|
472
|
-
modules?: TModule[];
|
|
473
|
-
perms?: string[];
|
|
474
|
-
children?: AppPerm<TModule>[];
|
|
475
|
-
}
|
|
476
|
-
|
|
477
|
-
interface AppFlatPerm<TModule = string> {
|
|
478
|
-
titleChain: string[];
|
|
479
|
-
code: string;
|
|
480
|
-
modulesChain: TModule[][];
|
|
481
|
-
requiredModulesChain: TModule[][];
|
|
482
|
-
}
|
|
483
|
-
```
|
|
484
|
-
|
|
485
|
-
**AppStructureItem types:**
|
|
486
|
-
|
|
487
|
-
```typescript
|
|
488
|
-
// Group item (has children, no component)
|
|
489
|
-
interface AppStructureGroupItem<TModule> {
|
|
490
|
-
code: string;
|
|
491
|
-
title: string;
|
|
492
|
-
icon?: Component<IconProps>;
|
|
493
|
-
modules?: TModule[];
|
|
494
|
-
requiredModules?: TModule[];
|
|
495
|
-
children: AppStructureItem<TModule>[];
|
|
496
|
-
}
|
|
497
|
-
|
|
498
|
-
// Leaf item (has component, no children)
|
|
499
|
-
interface AppStructureLeafItem<TModule> {
|
|
500
|
-
code: string;
|
|
501
|
-
title: string;
|
|
502
|
-
icon?: Component<IconProps>;
|
|
503
|
-
modules?: TModule[];
|
|
504
|
-
requiredModules?: TModule[];
|
|
505
|
-
component?: Component;
|
|
506
|
-
perms?: ("use" | "edit")[];
|
|
507
|
-
subPerms?: AppStructureSubPerm<TModule>[];
|
|
508
|
-
isNotMenu?: boolean; // exclude from menu but include in routing
|
|
509
|
-
}
|
|
510
|
-
|
|
511
|
-
// Sub-permission item
|
|
512
|
-
interface AppStructureSubPerm<TModule> {
|
|
513
|
-
code: string;
|
|
514
|
-
title: string;
|
|
515
|
-
modules?: TModule[];
|
|
516
|
-
requiredModules?: TModule[];
|
|
517
|
-
perms: ("use" | "edit")[];
|
|
518
|
-
}
|
|
519
|
-
|
|
520
|
-
type AppStructureItem<TModule> = AppStructureGroupItem<TModule> | AppStructureLeafItem<TModule>;
|
|
521
|
-
```
|
|
522
|
-
|
|
523
|
-
#### getTitleChainByHref
|
|
524
|
-
|
|
525
|
-
Retrieves the breadcrumb title chain for a given href path. Works on raw items (including `isNotMenu` items).
|
|
526
|
-
|
|
527
|
-
```tsx
|
|
528
|
-
import { useLocation } from "@solidjs/router";
|
|
529
|
-
import { useAppStructure } from "./appStructure";
|
|
530
|
-
|
|
531
|
-
function Breadcrumb() {
|
|
532
|
-
const appStructure = useAppStructure();
|
|
533
|
-
const location = useLocation();
|
|
534
|
-
|
|
535
|
-
// Returns ["Sales", "Invoice"] for /home/sales/invoice
|
|
536
|
-
const breadcrumb = () => appStructure.getTitleChainByHref(location.pathname);
|
|
537
|
-
|
|
538
|
-
return <span>{breadcrumb().join(" > ")}</span>;
|
|
539
|
-
}
|
|
540
|
-
```
|
|
541
|
-
|
|
542
|
-
#### perms
|
|
543
|
-
|
|
544
|
-
Typed permission accessor providing dot-notation access with TypeScript autocompletion and reactive boolean values. Built from the `permRecord` signal using `Object.defineProperty` getters.
|
|
545
|
-
|
|
546
|
-
**Important:** For type inference to work, pass items inline to `createAppStructure`. Declaring items as a separate variable with explicit `AppStructureItem[]` type annotation widens literal types, losing autocompletion.
|
|
547
|
-
|
|
548
|
-
```typescript
|
|
549
|
-
// appStructure.ts
|
|
550
|
-
import { createAppStructure } from "@simplysm/solid";
|
|
551
|
-
|
|
552
|
-
export const { AppStructureProvider, useAppStructure } = createAppStructure(() => ({
|
|
553
|
-
items: [
|
|
554
|
-
{
|
|
555
|
-
code: "home",
|
|
556
|
-
title: "Home",
|
|
557
|
-
children: [
|
|
558
|
-
{
|
|
559
|
-
code: "user",
|
|
560
|
-
title: "User",
|
|
561
|
-
perms: ["use", "edit"],
|
|
562
|
-
subPerms: [
|
|
563
|
-
{ code: "auth", title: "Auth", perms: ["use"] },
|
|
564
|
-
],
|
|
565
|
-
},
|
|
566
|
-
],
|
|
567
|
-
},
|
|
568
|
-
],
|
|
569
|
-
permRecord: () => userPermissions(),
|
|
570
|
-
}));
|
|
571
|
-
|
|
572
|
-
// In a component (inside AppStructureProvider):
|
|
573
|
-
const appStructure = useAppStructure();
|
|
574
|
-
|
|
575
|
-
// Typed access with autocompletion:
|
|
576
|
-
appStructure.perms.home.user.use // boolean (reactive)
|
|
577
|
-
appStructure.perms.home.user.edit // boolean (reactive)
|
|
578
|
-
appStructure.perms.home.user.auth.use // boolean (reactive)
|
|
579
|
-
|
|
580
|
-
// Use in components:
|
|
581
|
-
<Show when={appStructure.perms.home.user.use}>
|
|
582
|
-
<UserPage />
|
|
583
|
-
</Show>
|
|
584
|
-
```
|
|
585
|
-
|
|
586
|
-
- Leaf items without `perms`/`subPerms` are excluded from the tree
|
|
587
|
-
- Groups with no permission-bearing descendants are excluded
|
|
588
|
-
- Returns `false` when `permRecord` is not provided or key is missing
|