@simplysm/solid 13.0.0-beta.6
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/.cache/typecheck-browser.tsbuildinfo +1 -0
- package/.cache/typecheck-tests-browser.tsbuildinfo +1 -0
- package/README.md +1652 -0
- package/dist/components/data/Pagination.js +110 -0
- package/dist/components/data/Pagination.js.map +7 -0
- package/dist/components/data/Table.js +34 -0
- package/dist/components/data/Table.js.map +7 -0
- package/dist/components/data/calendar/Calendar.js +90 -0
- package/dist/components/data/calendar/Calendar.js.map +7 -0
- package/dist/components/data/kanban/Kanban.js +367 -0
- package/dist/components/data/kanban/Kanban.js.map +7 -0
- package/dist/components/data/kanban/KanbanContext.js +24 -0
- package/dist/components/data/kanban/KanbanContext.js.map +7 -0
- package/dist/components/data/list/List.js +133 -0
- package/dist/components/data/list/List.js.map +7 -0
- package/dist/components/data/list/ListContext.js +8 -0
- package/dist/components/data/list/ListContext.js.map +7 -0
- package/dist/components/data/list/ListItem.js +101 -0
- package/dist/components/data/list/ListItem.js.map +7 -0
- package/dist/components/data/list/ListItem.styles.js +43 -0
- package/dist/components/data/list/ListItem.styles.js.map +7 -0
- package/dist/components/data/permission-table/PermissionTable.js +189 -0
- package/dist/components/data/permission-table/PermissionTable.js.map +7 -0
- package/dist/components/data/sheet/DataSheet.js +907 -0
- package/dist/components/data/sheet/DataSheet.js.map +7 -0
- package/dist/components/data/sheet/DataSheet.styles.js +142 -0
- package/dist/components/data/sheet/DataSheet.styles.js.map +7 -0
- package/dist/components/data/sheet/DataSheetColumn.js +28 -0
- package/dist/components/data/sheet/DataSheetColumn.js.map +7 -0
- package/dist/components/data/sheet/DataSheetConfigDialog.js +83 -0
- package/dist/components/data/sheet/DataSheetConfigDialog.js.map +7 -0
- package/dist/components/data/sheet/sheetUtils.js +125 -0
- package/dist/components/data/sheet/sheetUtils.js.map +7 -0
- package/dist/components/data/sheet/types.js +1 -0
- package/dist/components/data/sheet/types.js.map +7 -0
- package/dist/components/disclosure/Collapse.js +45 -0
- package/dist/components/disclosure/Collapse.js.map +7 -0
- package/dist/components/disclosure/Dialog.js +367 -0
- package/dist/components/disclosure/Dialog.js.map +7 -0
- package/dist/components/disclosure/DialogContext.js +14 -0
- package/dist/components/disclosure/DialogContext.js.map +7 -0
- package/dist/components/disclosure/DialogInstanceContext.js +10 -0
- package/dist/components/disclosure/DialogInstanceContext.js.map +7 -0
- package/dist/components/disclosure/DialogProvider.js +88 -0
- package/dist/components/disclosure/DialogProvider.js.map +7 -0
- package/dist/components/disclosure/Dropdown.js +244 -0
- package/dist/components/disclosure/Dropdown.js.map +7 -0
- package/dist/components/disclosure/Tabs.js +75 -0
- package/dist/components/disclosure/Tabs.js.map +7 -0
- package/dist/components/disclosure/dialogZIndex.js +32 -0
- package/dist/components/disclosure/dialogZIndex.js.map +7 -0
- package/dist/components/display/Alert.js +18 -0
- package/dist/components/display/Alert.js.map +7 -0
- package/dist/components/display/Barcode.js +39 -0
- package/dist/components/display/Barcode.js.map +7 -0
- package/dist/components/display/Card.js +21 -0
- package/dist/components/display/Card.js.map +7 -0
- package/dist/components/display/Echarts.js +33 -0
- package/dist/components/display/Echarts.js.map +7 -0
- package/dist/components/display/Icon.js +10 -0
- package/dist/components/display/Icon.js.map +7 -0
- package/dist/components/display/Tag.js +20 -0
- package/dist/components/display/Tag.js.map +7 -0
- package/dist/components/feedback/Progress.js +37 -0
- package/dist/components/feedback/Progress.js.map +7 -0
- package/dist/components/feedback/loading/LoadingContainer.js +83 -0
- package/dist/components/feedback/loading/LoadingContainer.js.map +7 -0
- package/dist/components/feedback/loading/LoadingContext.js +14 -0
- package/dist/components/feedback/loading/LoadingContext.js.map +7 -0
- package/dist/components/feedback/loading/LoadingProvider.js +47 -0
- package/dist/components/feedback/loading/LoadingProvider.js.map +7 -0
- package/dist/components/feedback/notification/NotificationBanner.js +61 -0
- package/dist/components/feedback/notification/NotificationBanner.js.map +7 -0
- package/dist/components/feedback/notification/NotificationBell.js +85 -0
- package/dist/components/feedback/notification/NotificationBell.js.map +7 -0
- package/dist/components/feedback/notification/NotificationContext.js +14 -0
- package/dist/components/feedback/notification/NotificationContext.js.map +7 -0
- package/dist/components/feedback/notification/NotificationProvider.js +101 -0
- package/dist/components/feedback/notification/NotificationProvider.js.map +7 -0
- package/dist/components/feedback/notification/index.js +5 -0
- package/dist/components/feedback/notification/index.js.map +7 -0
- package/dist/components/feedback/print/Print.js +12 -0
- package/dist/components/feedback/print/Print.js.map +7 -0
- package/dist/components/feedback/print/PrintInstanceContext.js +10 -0
- package/dist/components/feedback/print/PrintInstanceContext.js.map +7 -0
- package/dist/components/form-control/Button.js +74 -0
- package/dist/components/form-control/Button.js.map +7 -0
- package/dist/components/form-control/DropdownTrigger.styles.js +44 -0
- package/dist/components/form-control/DropdownTrigger.styles.js.map +7 -0
- package/dist/components/form-control/ThemeToggle.js +57 -0
- package/dist/components/form-control/ThemeToggle.js.map +7 -0
- package/dist/components/form-control/checkbox/Checkbox.js +78 -0
- package/dist/components/form-control/checkbox/Checkbox.js.map +7 -0
- package/dist/components/form-control/checkbox/Checkbox.styles.js +57 -0
- package/dist/components/form-control/checkbox/Checkbox.styles.js.map +7 -0
- package/dist/components/form-control/checkbox/CheckboxGroup.js +65 -0
- package/dist/components/form-control/checkbox/CheckboxGroup.js.map +7 -0
- package/dist/components/form-control/checkbox/Radio.js +78 -0
- package/dist/components/form-control/checkbox/Radio.js.map +7 -0
- package/dist/components/form-control/checkbox/RadioGroup.js +60 -0
- package/dist/components/form-control/checkbox/RadioGroup.js.map +7 -0
- package/dist/components/form-control/color-picker/ColorPicker.js +55 -0
- package/dist/components/form-control/color-picker/ColorPicker.js.map +7 -0
- package/dist/components/form-control/combobox/Combobox.js +214 -0
- package/dist/components/form-control/combobox/Combobox.js.map +7 -0
- package/dist/components/form-control/combobox/ComboboxContext.js +14 -0
- package/dist/components/form-control/combobox/ComboboxContext.js.map +7 -0
- package/dist/components/form-control/combobox/ComboboxItem.js +49 -0
- package/dist/components/form-control/combobox/ComboboxItem.js.map +7 -0
- package/dist/components/form-control/date-range-picker/DateRangePicker.js +136 -0
- package/dist/components/form-control/date-range-picker/DateRangePicker.js.map +7 -0
- package/dist/components/form-control/editor/EditorToolbar.js +290 -0
- package/dist/components/form-control/editor/EditorToolbar.js.map +7 -0
- package/dist/components/form-control/editor/RichTextEditor.js +114 -0
- package/dist/components/form-control/editor/RichTextEditor.js.map +7 -0
- package/dist/components/form-control/field/DatePicker.js +167 -0
- package/dist/components/form-control/field/DatePicker.js.map +7 -0
- package/dist/components/form-control/field/DateTimePicker.js +168 -0
- package/dist/components/form-control/field/DateTimePicker.js.map +7 -0
- package/dist/components/form-control/field/Field.styles.js +35 -0
- package/dist/components/form-control/field/Field.styles.js.map +7 -0
- package/dist/components/form-control/field/NumberInput.js +193 -0
- package/dist/components/form-control/field/NumberInput.js.map +7 -0
- package/dist/components/form-control/field/TextInput.js +178 -0
- package/dist/components/form-control/field/TextInput.js.map +7 -0
- package/dist/components/form-control/field/Textarea.js +186 -0
- package/dist/components/form-control/field/Textarea.js.map +7 -0
- package/dist/components/form-control/field/TimePicker.js +138 -0
- package/dist/components/form-control/field/TimePicker.js.map +7 -0
- package/dist/components/form-control/numpad/Numpad.js +107 -0
- package/dist/components/form-control/numpad/Numpad.js.map +7 -0
- package/dist/components/form-control/select/Select.js +196 -0
- package/dist/components/form-control/select/Select.js.map +7 -0
- package/dist/components/form-control/select/SelectContext.js +14 -0
- package/dist/components/form-control/select/SelectContext.js.map +7 -0
- package/dist/components/form-control/select/SelectItem.js +65 -0
- package/dist/components/form-control/select/SelectItem.js.map +7 -0
- package/dist/components/form-control/state-preset/StatePreset.js +195 -0
- package/dist/components/form-control/state-preset/StatePreset.js.map +7 -0
- package/dist/components/layout/FormGroup.js +34 -0
- package/dist/components/layout/FormGroup.js.map +7 -0
- package/dist/components/layout/FormTable.js +24 -0
- package/dist/components/layout/FormTable.js.map +7 -0
- package/dist/components/layout/sidebar/Sidebar.js +63 -0
- package/dist/components/layout/sidebar/Sidebar.js.map +7 -0
- package/dist/components/layout/sidebar/SidebarContainer.js +70 -0
- package/dist/components/layout/sidebar/SidebarContainer.js.map +7 -0
- package/dist/components/layout/sidebar/SidebarContext.js +20 -0
- package/dist/components/layout/sidebar/SidebarContext.js.map +7 -0
- package/dist/components/layout/sidebar/SidebarMenu.js +84 -0
- package/dist/components/layout/sidebar/SidebarMenu.js.map +7 -0
- package/dist/components/layout/sidebar/SidebarUser.js +51 -0
- package/dist/components/layout/sidebar/SidebarUser.js.map +7 -0
- package/dist/components/layout/topbar/Topbar.js +48 -0
- package/dist/components/layout/topbar/Topbar.js.map +7 -0
- package/dist/components/layout/topbar/TopbarContainer.js +13 -0
- package/dist/components/layout/topbar/TopbarContainer.js.map +7 -0
- package/dist/components/layout/topbar/TopbarMenu.js +106 -0
- package/dist/components/layout/topbar/TopbarMenu.js.map +7 -0
- package/dist/components/layout/topbar/TopbarUser.js +44 -0
- package/dist/components/layout/topbar/TopbarUser.js.map +7 -0
- package/dist/core-browser/src/extensions/element-ext.d.ts +98 -0
- package/dist/core-browser/src/extensions/element-ext.d.ts.map +1 -0
- package/dist/core-browser/src/extensions/html-element-ext.d.ts +54 -0
- package/dist/core-browser/src/extensions/html-element-ext.d.ts.map +1 -0
- package/dist/core-browser/src/index.d.ts +7 -0
- package/dist/core-browser/src/index.d.ts.map +1 -0
- package/dist/core-browser/src/utils/blob.d.ts +10 -0
- package/dist/core-browser/src/utils/blob.d.ts.map +1 -0
- package/dist/core-browser/src/utils/download.d.ts +11 -0
- package/dist/core-browser/src/utils/download.d.ts.map +1 -0
- package/dist/core-common/src/common.types.d.ts +74 -0
- package/dist/core-common/src/common.types.d.ts.map +1 -0
- package/dist/core-common/src/env.d.ts +6 -0
- package/dist/core-common/src/env.d.ts.map +1 -0
- package/dist/core-common/src/errors/argument-error.d.ts +25 -0
- package/dist/core-common/src/errors/argument-error.d.ts.map +1 -0
- package/dist/core-common/src/errors/not-implemented-error.d.ts +29 -0
- package/dist/core-common/src/errors/not-implemented-error.d.ts.map +1 -0
- package/dist/core-common/src/errors/sd-error.d.ts +27 -0
- package/dist/core-common/src/errors/sd-error.d.ts.map +1 -0
- package/dist/core-common/src/errors/timeout-error.d.ts +31 -0
- package/dist/core-common/src/errors/timeout-error.d.ts.map +1 -0
- package/dist/core-common/src/extensions/arr-ext.d.ts +15 -0
- package/dist/core-common/src/extensions/arr-ext.d.ts.map +1 -0
- package/dist/core-common/src/extensions/arr-ext.helpers.d.ts +19 -0
- package/dist/core-common/src/extensions/arr-ext.helpers.d.ts.map +1 -0
- package/dist/core-common/src/extensions/arr-ext.types.d.ts +215 -0
- package/dist/core-common/src/extensions/arr-ext.types.d.ts.map +1 -0
- package/dist/core-common/src/extensions/map-ext.d.ts +57 -0
- package/dist/core-common/src/extensions/map-ext.d.ts.map +1 -0
- package/dist/core-common/src/extensions/set-ext.d.ts +36 -0
- package/dist/core-common/src/extensions/set-ext.d.ts.map +1 -0
- package/dist/core-common/src/features/debounce-queue.d.ts +53 -0
- package/dist/core-common/src/features/debounce-queue.d.ts.map +1 -0
- package/dist/core-common/src/features/event-emitter.d.ts +66 -0
- package/dist/core-common/src/features/event-emitter.d.ts.map +1 -0
- package/dist/core-common/src/features/serial-queue.d.ts +47 -0
- package/dist/core-common/src/features/serial-queue.d.ts.map +1 -0
- package/dist/core-common/src/index.d.ts +32 -0
- package/dist/core-common/src/index.d.ts.map +1 -0
- package/dist/core-common/src/types/date-only.d.ts +152 -0
- package/dist/core-common/src/types/date-only.d.ts.map +1 -0
- package/dist/core-common/src/types/date-time.d.ts +96 -0
- package/dist/core-common/src/types/date-time.d.ts.map +1 -0
- package/dist/core-common/src/types/lazy-gc-map.d.ts +80 -0
- package/dist/core-common/src/types/lazy-gc-map.d.ts.map +1 -0
- package/dist/core-common/src/types/time.d.ts +68 -0
- package/dist/core-common/src/types/time.d.ts.map +1 -0
- package/dist/core-common/src/types/uuid.d.ts +35 -0
- package/dist/core-common/src/types/uuid.d.ts.map +1 -0
- package/dist/core-common/src/utils/bytes.d.ts +51 -0
- package/dist/core-common/src/utils/bytes.d.ts.map +1 -0
- package/dist/core-common/src/utils/date-format.d.ts +90 -0
- package/dist/core-common/src/utils/date-format.d.ts.map +1 -0
- package/dist/core-common/src/utils/json.d.ts +34 -0
- package/dist/core-common/src/utils/json.d.ts.map +1 -0
- package/dist/core-common/src/utils/num.d.ts +60 -0
- package/dist/core-common/src/utils/num.d.ts.map +1 -0
- package/dist/core-common/src/utils/obj.d.ts +258 -0
- package/dist/core-common/src/utils/obj.d.ts.map +1 -0
- package/dist/core-common/src/utils/path.d.ts +23 -0
- package/dist/core-common/src/utils/path.d.ts.map +1 -0
- package/dist/core-common/src/utils/primitive.d.ts +18 -0
- package/dist/core-common/src/utils/primitive.d.ts.map +1 -0
- package/dist/core-common/src/utils/str.d.ts +103 -0
- package/dist/core-common/src/utils/str.d.ts.map +1 -0
- package/dist/core-common/src/utils/template-strings.d.ts +84 -0
- package/dist/core-common/src/utils/template-strings.d.ts.map +1 -0
- package/dist/core-common/src/utils/transferable.d.ts +47 -0
- package/dist/core-common/src/utils/transferable.d.ts.map +1 -0
- package/dist/core-common/src/utils/wait.d.ts +19 -0
- package/dist/core-common/src/utils/wait.d.ts.map +1 -0
- package/dist/core-common/src/utils/xml.d.ts +36 -0
- package/dist/core-common/src/utils/xml.d.ts.map +1 -0
- package/dist/core-common/src/zip/sd-zip.d.ts +80 -0
- package/dist/core-common/src/zip/sd-zip.d.ts.map +1 -0
- package/dist/directives/ripple.js +106 -0
- package/dist/directives/ripple.js.map +7 -0
- package/dist/helpers/createAppStructure.js +96 -0
- package/dist/helpers/createAppStructure.js.map +7 -0
- package/dist/helpers/mergeStyles.js +27 -0
- package/dist/helpers/mergeStyles.js.map +7 -0
- package/dist/helpers/splitSlots.js +25 -0
- package/dist/helpers/splitSlots.js.map +7 -0
- package/dist/hooks/createControllableSignal.js +24 -0
- package/dist/hooks/createControllableSignal.js.map +7 -0
- package/dist/hooks/createIMEHandler.js +50 -0
- package/dist/hooks/createIMEHandler.js.map +7 -0
- package/dist/hooks/createMountTransition.js +33 -0
- package/dist/hooks/createMountTransition.js.map +7 -0
- package/dist/hooks/useClipboardValueCopy.js +121 -0
- package/dist/hooks/useClipboardValueCopy.js.map +7 -0
- package/dist/hooks/usePersisted.js +25 -0
- package/dist/hooks/usePersisted.js.map +7 -0
- package/dist/hooks/usePrint.js +208 -0
- package/dist/hooks/usePrint.js.map +7 -0
- package/dist/hooks/useRouterLink.js +24 -0
- package/dist/hooks/useRouterLink.js.map +7 -0
- package/dist/index.js +94 -0
- package/dist/index.js.map +7 -0
- package/dist/orm-common/src/db-context.d.ts +669 -0
- package/dist/orm-common/src/db-context.d.ts.map +1 -0
- package/dist/orm-common/src/errors/db-transaction-error.d.ts +51 -0
- package/dist/orm-common/src/errors/db-transaction-error.d.ts.map +1 -0
- package/dist/orm-common/src/exec/executable.d.ts +79 -0
- package/dist/orm-common/src/exec/executable.d.ts.map +1 -0
- package/dist/orm-common/src/exec/queryable.d.ts +708 -0
- package/dist/orm-common/src/exec/queryable.d.ts.map +1 -0
- package/dist/orm-common/src/exec/search-parser.d.ts +72 -0
- package/dist/orm-common/src/exec/search-parser.d.ts.map +1 -0
- package/dist/orm-common/src/expr/expr-unit.d.ts +25 -0
- package/dist/orm-common/src/expr/expr-unit.d.ts.map +1 -0
- package/dist/orm-common/src/expr/expr.d.ts +1369 -0
- package/dist/orm-common/src/expr/expr.d.ts.map +1 -0
- package/dist/orm-common/src/index.d.ts +32 -0
- package/dist/orm-common/src/index.d.ts.map +1 -0
- package/dist/orm-common/src/models/system-migration.d.ts +10 -0
- package/dist/orm-common/src/models/system-migration.d.ts.map +1 -0
- package/dist/orm-common/src/query-builder/base/expr-renderer-base.d.ts +95 -0
- package/dist/orm-common/src/query-builder/base/expr-renderer-base.d.ts.map +1 -0
- package/dist/orm-common/src/query-builder/base/query-builder-base.d.ts +66 -0
- package/dist/orm-common/src/query-builder/base/query-builder-base.d.ts.map +1 -0
- package/dist/orm-common/src/query-builder/mssql/mssql-expr-renderer.d.ts +84 -0
- package/dist/orm-common/src/query-builder/mssql/mssql-expr-renderer.d.ts.map +1 -0
- package/dist/orm-common/src/query-builder/mssql/mssql-query-builder.d.ts +45 -0
- package/dist/orm-common/src/query-builder/mssql/mssql-query-builder.d.ts.map +1 -0
- package/dist/orm-common/src/query-builder/mysql/mysql-expr-renderer.d.ts +84 -0
- package/dist/orm-common/src/query-builder/mysql/mysql-expr-renderer.d.ts.map +1 -0
- package/dist/orm-common/src/query-builder/mysql/mysql-query-builder.d.ts +54 -0
- package/dist/orm-common/src/query-builder/mysql/mysql-query-builder.d.ts.map +1 -0
- package/dist/orm-common/src/query-builder/postgresql/postgresql-expr-renderer.d.ts +84 -0
- package/dist/orm-common/src/query-builder/postgresql/postgresql-expr-renderer.d.ts.map +1 -0
- package/dist/orm-common/src/query-builder/postgresql/postgresql-query-builder.d.ts +52 -0
- package/dist/orm-common/src/query-builder/postgresql/postgresql-query-builder.d.ts.map +1 -0
- package/dist/orm-common/src/query-builder/query-builder.d.ts +7 -0
- package/dist/orm-common/src/query-builder/query-builder.d.ts.map +1 -0
- package/dist/orm-common/src/schema/factory/column-builder.d.ts +394 -0
- package/dist/orm-common/src/schema/factory/column-builder.d.ts.map +1 -0
- package/dist/orm-common/src/schema/factory/index-builder.d.ts +151 -0
- package/dist/orm-common/src/schema/factory/index-builder.d.ts.map +1 -0
- package/dist/orm-common/src/schema/factory/relation-builder.d.ts +337 -0
- package/dist/orm-common/src/schema/factory/relation-builder.d.ts.map +1 -0
- package/dist/orm-common/src/schema/procedure-builder.d.ts +202 -0
- package/dist/orm-common/src/schema/procedure-builder.d.ts.map +1 -0
- package/dist/orm-common/src/schema/table-builder.d.ts +259 -0
- package/dist/orm-common/src/schema/table-builder.d.ts.map +1 -0
- package/dist/orm-common/src/schema/view-builder.d.ts +183 -0
- package/dist/orm-common/src/schema/view-builder.d.ts.map +1 -0
- package/dist/orm-common/src/types/column.d.ts +172 -0
- package/dist/orm-common/src/types/column.d.ts.map +1 -0
- package/dist/orm-common/src/types/db.d.ts +175 -0
- package/dist/orm-common/src/types/db.d.ts.map +1 -0
- package/dist/orm-common/src/types/expr.d.ts +474 -0
- package/dist/orm-common/src/types/expr.d.ts.map +1 -0
- package/dist/orm-common/src/types/query-def.d.ts +351 -0
- package/dist/orm-common/src/types/query-def.d.ts.map +1 -0
- package/dist/orm-common/src/utils/result-parser.d.ts +38 -0
- package/dist/orm-common/src/utils/result-parser.d.ts.map +1 -0
- package/dist/providers/ConfigContext.js +14 -0
- package/dist/providers/ConfigContext.js.map +7 -0
- package/dist/providers/InitializeProvider.js +10 -0
- package/dist/providers/InitializeProvider.js.map +7 -0
- package/dist/providers/ServiceClientContext.js +16 -0
- package/dist/providers/ServiceClientContext.js.map +7 -0
- package/dist/providers/ServiceClientProvider.js +116 -0
- package/dist/providers/ServiceClientProvider.js.map +7 -0
- package/dist/providers/ThemeContext.js +48 -0
- package/dist/providers/ThemeContext.js.map +7 -0
- package/dist/providers/shared-data/SharedDataChangeEvent.js +8 -0
- package/dist/providers/shared-data/SharedDataChangeEvent.js.map +7 -0
- package/dist/providers/shared-data/SharedDataContext.js +16 -0
- package/dist/providers/shared-data/SharedDataContext.js.map +7 -0
- package/dist/providers/shared-data/SharedDataProvider.js +115 -0
- package/dist/providers/shared-data/SharedDataProvider.js.map +7 -0
- package/dist/service-client/src/features/event-client.d.ts +14 -0
- package/dist/service-client/src/features/event-client.d.ts.map +1 -0
- package/dist/service-client/src/features/file-client.d.ts +13 -0
- package/dist/service-client/src/features/file-client.d.ts.map +1 -0
- package/dist/service-client/src/features/orm/orm-client-connector.d.ts +10 -0
- package/dist/service-client/src/features/orm/orm-client-connector.d.ts.map +1 -0
- package/dist/service-client/src/features/orm/orm-client-db-context-executor.d.ts +26 -0
- package/dist/service-client/src/features/orm/orm-client-db-context-executor.d.ts.map +1 -0
- package/dist/service-client/src/features/orm/orm-connect-config.d.ts +13 -0
- package/dist/service-client/src/features/orm/orm-connect-config.d.ts.map +1 -0
- package/dist/service-client/src/index.d.ts +12 -0
- package/dist/service-client/src/index.d.ts.map +1 -0
- package/dist/service-client/src/protocol/client-protocol-wrapper.d.ts +23 -0
- package/dist/service-client/src/protocol/client-protocol-wrapper.d.ts.map +1 -0
- package/dist/service-client/src/service-client.d.ts +41 -0
- package/dist/service-client/src/service-client.d.ts.map +1 -0
- package/dist/service-client/src/transport/service-transport.d.ts +24 -0
- package/dist/service-client/src/transport/service-transport.d.ts.map +1 -0
- package/dist/service-client/src/transport/socket-provider.d.ts +31 -0
- package/dist/service-client/src/transport/socket-provider.d.ts.map +1 -0
- package/dist/service-client/src/types/connection-config.d.ts +8 -0
- package/dist/service-client/src/types/connection-config.d.ts.map +1 -0
- package/dist/service-client/src/types/progress.types.d.ts +10 -0
- package/dist/service-client/src/types/progress.types.d.ts.map +1 -0
- package/dist/service-common/src/index.d.ts +8 -0
- package/dist/service-common/src/index.d.ts.map +1 -0
- package/dist/service-common/src/protocol/protocol.types.d.ts +100 -0
- package/dist/service-common/src/protocol/protocol.types.d.ts.map +1 -0
- package/dist/service-common/src/protocol/service-protocol.d.ts +63 -0
- package/dist/service-common/src/protocol/service-protocol.d.ts.map +1 -0
- package/dist/service-common/src/service-types/auto-update-service.types.d.ts +17 -0
- package/dist/service-common/src/service-types/auto-update-service.types.d.ts.map +1 -0
- package/dist/service-common/src/service-types/crypto-service.types.d.ts +22 -0
- package/dist/service-common/src/service-types/crypto-service.types.d.ts.map +1 -0
- package/dist/service-common/src/service-types/orm-service.types.d.ts +30 -0
- package/dist/service-common/src/service-types/orm-service.types.d.ts.map +1 -0
- package/dist/service-common/src/service-types/smtp-service.types.d.ts +55 -0
- package/dist/service-common/src/service-types/smtp-service.types.d.ts.map +1 -0
- package/dist/service-common/src/types.d.ts +43 -0
- package/dist/service-common/src/types.d.ts.map +1 -0
- package/dist/solid/src/components/data/Pagination.d.ts +12 -0
- package/dist/solid/src/components/data/Pagination.d.ts.map +1 -0
- package/dist/solid/src/components/data/Table.d.ts +6 -0
- package/dist/solid/src/components/data/Table.d.ts.map +1 -0
- package/dist/solid/src/components/data/calendar/Calendar.d.ts +15 -0
- package/dist/solid/src/components/data/calendar/Calendar.d.ts.map +1 -0
- package/dist/solid/src/components/data/kanban/Kanban.d.ts +38 -0
- package/dist/solid/src/components/data/kanban/Kanban.d.ts.map +1 -0
- package/dist/solid/src/components/data/kanban/KanbanContext.d.ts +40 -0
- package/dist/solid/src/components/data/kanban/KanbanContext.d.ts.map +1 -0
- package/dist/solid/src/components/data/list/List.d.ts +36 -0
- package/dist/solid/src/components/data/list/List.d.ts.map +1 -0
- package/dist/solid/src/components/data/list/ListContext.d.ts +9 -0
- package/dist/solid/src/components/data/list/ListContext.d.ts.map +1 -0
- package/dist/solid/src/components/data/list/ListItem.d.ts +88 -0
- package/dist/solid/src/components/data/list/ListItem.d.ts.map +1 -0
- package/dist/solid/src/components/data/list/ListItem.styles.d.ts +10 -0
- package/dist/solid/src/components/data/list/ListItem.styles.d.ts.map +1 -0
- package/dist/solid/src/components/data/permission-table/PermissionTable.d.ts +26 -0
- package/dist/solid/src/components/data/permission-table/PermissionTable.d.ts.map +1 -0
- package/dist/solid/src/components/data/sheet/DataSheet.d.ts +12 -0
- package/dist/solid/src/components/data/sheet/DataSheet.d.ts.map +1 -0
- package/dist/solid/src/components/data/sheet/DataSheet.styles.d.ts +33 -0
- package/dist/solid/src/components/data/sheet/DataSheet.styles.d.ts.map +1 -0
- package/dist/solid/src/components/data/sheet/DataSheetColumn.d.ts +5 -0
- package/dist/solid/src/components/data/sheet/DataSheetColumn.d.ts.map +1 -0
- package/dist/solid/src/components/data/sheet/DataSheetConfigDialog.d.ts +8 -0
- package/dist/solid/src/components/data/sheet/DataSheetConfigDialog.d.ts.map +1 -0
- package/dist/solid/src/components/data/sheet/sheetUtils.d.ts +7 -0
- package/dist/solid/src/components/data/sheet/sheetUtils.d.ts.map +1 -0
- package/dist/solid/src/components/data/sheet/types.d.ts +113 -0
- package/dist/solid/src/components/data/sheet/types.d.ts.map +1 -0
- package/dist/solid/src/components/disclosure/Collapse.d.ts +21 -0
- package/dist/solid/src/components/disclosure/Collapse.d.ts.map +1 -0
- package/dist/solid/src/components/disclosure/Dialog.d.ts +65 -0
- package/dist/solid/src/components/disclosure/Dialog.d.ts.map +1 -0
- package/dist/solid/src/components/disclosure/DialogContext.d.ts +30 -0
- package/dist/solid/src/components/disclosure/DialogContext.d.ts.map +1 -0
- package/dist/solid/src/components/disclosure/DialogInstanceContext.d.ts +6 -0
- package/dist/solid/src/components/disclosure/DialogInstanceContext.d.ts.map +1 -0
- package/dist/solid/src/components/disclosure/DialogProvider.d.ts +19 -0
- package/dist/solid/src/components/disclosure/DialogProvider.d.ts.map +1 -0
- package/dist/solid/src/components/disclosure/Dropdown.d.ts +65 -0
- package/dist/solid/src/components/disclosure/Dropdown.d.ts.map +1 -0
- package/dist/solid/src/components/disclosure/Tabs.d.ts +24 -0
- package/dist/solid/src/components/disclosure/Tabs.d.ts.map +1 -0
- package/dist/solid/src/components/disclosure/dialogZIndex.d.ts +13 -0
- package/dist/solid/src/components/disclosure/dialogZIndex.d.ts.map +1 -0
- package/dist/solid/src/components/display/Alert.d.ts +8 -0
- package/dist/solid/src/components/display/Alert.d.ts.map +1 -0
- package/dist/solid/src/components/display/Barcode.d.ts +8 -0
- package/dist/solid/src/components/display/Barcode.d.ts.map +1 -0
- package/dist/solid/src/components/display/Card.d.ts +6 -0
- package/dist/solid/src/components/display/Card.d.ts.map +1 -0
- package/dist/solid/src/components/display/Echarts.d.ts +8 -0
- package/dist/solid/src/components/display/Echarts.d.ts.map +1 -0
- package/dist/solid/src/components/display/Icon.d.ts +8 -0
- package/dist/solid/src/components/display/Icon.d.ts.map +1 -0
- package/dist/solid/src/components/display/Tag.d.ts +8 -0
- package/dist/solid/src/components/display/Tag.d.ts.map +1 -0
- package/dist/solid/src/components/feedback/Progress.d.ts +12 -0
- package/dist/solid/src/components/feedback/Progress.d.ts.map +1 -0
- package/dist/solid/src/components/feedback/loading/LoadingContainer.d.ts +12 -0
- package/dist/solid/src/components/feedback/loading/LoadingContainer.d.ts.map +1 -0
- package/dist/solid/src/components/feedback/loading/LoadingContext.d.ts +11 -0
- package/dist/solid/src/components/feedback/loading/LoadingContext.d.ts.map +1 -0
- package/dist/solid/src/components/feedback/loading/LoadingProvider.d.ts +7 -0
- package/dist/solid/src/components/feedback/loading/LoadingProvider.d.ts.map +1 -0
- package/dist/solid/src/components/feedback/notification/NotificationBanner.d.ts +3 -0
- package/dist/solid/src/components/feedback/notification/NotificationBanner.d.ts.map +1 -0
- package/dist/solid/src/components/feedback/notification/NotificationBell.d.ts +6 -0
- package/dist/solid/src/components/feedback/notification/NotificationBell.d.ts.map +1 -0
- package/dist/solid/src/components/feedback/notification/NotificationContext.d.ts +39 -0
- package/dist/solid/src/components/feedback/notification/NotificationContext.d.ts.map +1 -0
- package/dist/solid/src/components/feedback/notification/NotificationProvider.d.ts +3 -0
- package/dist/solid/src/components/feedback/notification/NotificationProvider.d.ts.map +1 -0
- package/dist/solid/src/components/feedback/notification/index.d.ts +5 -0
- package/dist/solid/src/components/feedback/notification/index.d.ts.map +1 -0
- package/dist/solid/src/components/feedback/print/Print.d.ts +9 -0
- package/dist/solid/src/components/feedback/print/Print.d.ts.map +1 -0
- package/dist/solid/src/components/feedback/print/PrintInstanceContext.d.ts +6 -0
- package/dist/solid/src/components/feedback/print/PrintInstanceContext.d.ts.map +1 -0
- package/dist/solid/src/components/form-control/Button.d.ts +14 -0
- package/dist/solid/src/components/form-control/Button.d.ts.map +1 -0
- package/dist/solid/src/components/form-control/DropdownTrigger.styles.d.ts +14 -0
- package/dist/solid/src/components/form-control/DropdownTrigger.styles.d.ts.map +1 -0
- package/dist/solid/src/components/form-control/ThemeToggle.d.ts +25 -0
- package/dist/solid/src/components/form-control/ThemeToggle.d.ts.map +1 -0
- package/dist/solid/src/components/form-control/checkbox/Checkbox.d.ts +16 -0
- package/dist/solid/src/components/form-control/checkbox/Checkbox.d.ts.map +1 -0
- package/dist/solid/src/components/form-control/checkbox/Checkbox.styles.d.ts +12 -0
- package/dist/solid/src/components/form-control/checkbox/Checkbox.styles.d.ts.map +1 -0
- package/dist/solid/src/components/form-control/checkbox/CheckboxGroup.d.ts +27 -0
- package/dist/solid/src/components/form-control/checkbox/CheckboxGroup.d.ts.map +1 -0
- package/dist/solid/src/components/form-control/checkbox/Radio.d.ts +16 -0
- package/dist/solid/src/components/form-control/checkbox/Radio.d.ts.map +1 -0
- package/dist/solid/src/components/form-control/checkbox/RadioGroup.d.ts +27 -0
- package/dist/solid/src/components/form-control/checkbox/RadioGroup.d.ts.map +1 -0
- package/dist/solid/src/components/form-control/color-picker/ColorPicker.d.ts +29 -0
- package/dist/solid/src/components/form-control/color-picker/ColorPicker.d.ts.map +1 -0
- package/dist/solid/src/components/form-control/combobox/Combobox.d.ts +80 -0
- package/dist/solid/src/components/form-control/combobox/Combobox.d.ts.map +1 -0
- package/dist/solid/src/components/form-control/combobox/ComboboxContext.d.ts +11 -0
- package/dist/solid/src/components/form-control/combobox/ComboboxContext.d.ts.map +1 -0
- package/dist/solid/src/components/form-control/combobox/ComboboxItem.d.ts +12 -0
- package/dist/solid/src/components/form-control/combobox/ComboboxItem.d.ts.map +1 -0
- package/dist/solid/src/components/form-control/date-range-picker/DateRangePicker.d.ts +55 -0
- package/dist/solid/src/components/form-control/date-range-picker/DateRangePicker.d.ts.map +1 -0
- package/dist/solid/src/components/form-control/editor/EditorToolbar.d.ts +8 -0
- package/dist/solid/src/components/form-control/editor/EditorToolbar.d.ts.map +1 -0
- package/dist/solid/src/components/form-control/editor/RichTextEditor.d.ts +21 -0
- package/dist/solid/src/components/form-control/editor/RichTextEditor.d.ts.map +1 -0
- package/dist/solid/src/components/form-control/field/DatePicker.d.ts +61 -0
- package/dist/solid/src/components/form-control/field/DatePicker.d.ts.map +1 -0
- package/dist/solid/src/components/form-control/field/DateTimePicker.d.ts +58 -0
- package/dist/solid/src/components/form-control/field/DateTimePicker.d.ts.map +1 -0
- package/dist/solid/src/components/form-control/field/Field.styles.d.ts +13 -0
- package/dist/solid/src/components/form-control/field/Field.styles.d.ts.map +1 -0
- package/dist/solid/src/components/form-control/field/NumberInput.d.ts +47 -0
- package/dist/solid/src/components/form-control/field/NumberInput.d.ts.map +1 -0
- package/dist/solid/src/components/form-control/field/TextInput.d.ts +51 -0
- package/dist/solid/src/components/form-control/field/TextInput.d.ts.map +1 -0
- package/dist/solid/src/components/form-control/field/Textarea.d.ts +42 -0
- package/dist/solid/src/components/form-control/field/Textarea.d.ts.map +1 -0
- package/dist/solid/src/components/form-control/field/TimePicker.d.ts +46 -0
- package/dist/solid/src/components/form-control/field/TimePicker.d.ts.map +1 -0
- package/dist/solid/src/components/form-control/numpad/Numpad.d.ts +28 -0
- package/dist/solid/src/components/form-control/numpad/Numpad.d.ts.map +1 -0
- package/dist/solid/src/components/form-control/select/Select.d.ts +104 -0
- package/dist/solid/src/components/form-control/select/Select.d.ts.map +1 -0
- package/dist/solid/src/components/form-control/select/SelectContext.d.ts +14 -0
- package/dist/solid/src/components/form-control/select/SelectContext.d.ts.map +1 -0
- package/dist/solid/src/components/form-control/select/SelectItem.d.ts +33 -0
- package/dist/solid/src/components/form-control/select/SelectItem.d.ts.map +1 -0
- package/dist/solid/src/components/form-control/state-preset/StatePreset.d.ts +14 -0
- package/dist/solid/src/components/form-control/state-preset/StatePreset.d.ts.map +1 -0
- package/dist/solid/src/components/layout/FormGroup.d.ts +14 -0
- package/dist/solid/src/components/layout/FormGroup.d.ts.map +1 -0
- package/dist/solid/src/components/layout/FormTable.d.ts +5 -0
- package/dist/solid/src/components/layout/FormTable.d.ts.map +1 -0
- package/dist/solid/src/components/layout/sidebar/Sidebar.d.ts +35 -0
- package/dist/solid/src/components/layout/sidebar/Sidebar.d.ts.map +1 -0
- package/dist/solid/src/components/layout/sidebar/SidebarContainer.d.ts +34 -0
- package/dist/solid/src/components/layout/sidebar/SidebarContainer.d.ts.map +1 -0
- package/dist/solid/src/components/layout/sidebar/SidebarContext.d.ts +28 -0
- package/dist/solid/src/components/layout/sidebar/SidebarContext.d.ts.map +1 -0
- package/dist/solid/src/components/layout/sidebar/SidebarMenu.d.ts +41 -0
- package/dist/solid/src/components/layout/sidebar/SidebarMenu.d.ts.map +1 -0
- package/dist/solid/src/components/layout/sidebar/SidebarUser.d.ts +36 -0
- package/dist/solid/src/components/layout/sidebar/SidebarUser.d.ts.map +1 -0
- package/dist/solid/src/components/layout/topbar/Topbar.d.ts +35 -0
- package/dist/solid/src/components/layout/topbar/Topbar.d.ts.map +1 -0
- package/dist/solid/src/components/layout/topbar/TopbarContainer.d.ts +25 -0
- package/dist/solid/src/components/layout/topbar/TopbarContainer.d.ts.map +1 -0
- package/dist/solid/src/components/layout/topbar/TopbarMenu.d.ts +41 -0
- package/dist/solid/src/components/layout/topbar/TopbarMenu.d.ts.map +1 -0
- package/dist/solid/src/components/layout/topbar/TopbarUser.d.ts +35 -0
- package/dist/solid/src/components/layout/topbar/TopbarUser.d.ts.map +1 -0
- package/dist/solid/src/directives/ripple.d.ts +24 -0
- package/dist/solid/src/directives/ripple.d.ts.map +1 -0
- package/dist/solid/src/helpers/createAppStructure.d.ts +52 -0
- package/dist/solid/src/helpers/createAppStructure.d.ts.map +1 -0
- package/dist/solid/src/helpers/mergeStyles.d.ts +27 -0
- package/dist/solid/src/helpers/mergeStyles.d.ts.map +1 -0
- package/dist/solid/src/helpers/splitSlots.d.ts +25 -0
- package/dist/solid/src/helpers/splitSlots.d.ts.map +1 -0
- package/dist/solid/src/hooks/createControllableSignal.d.ts +40 -0
- package/dist/solid/src/hooks/createControllableSignal.d.ts.map +1 -0
- package/dist/solid/src/hooks/createIMEHandler.d.ts +20 -0
- package/dist/solid/src/hooks/createIMEHandler.d.ts.map +1 -0
- package/dist/solid/src/hooks/createMountTransition.d.ts +14 -0
- package/dist/solid/src/hooks/createMountTransition.d.ts.map +1 -0
- package/dist/solid/src/hooks/useClipboardValueCopy.d.ts +15 -0
- package/dist/solid/src/hooks/useClipboardValueCopy.d.ts.map +1 -0
- package/dist/solid/src/hooks/usePersisted.d.ts +26 -0
- package/dist/solid/src/hooks/usePersisted.d.ts.map +1 -0
- package/dist/solid/src/hooks/usePrint.d.ts +11 -0
- package/dist/solid/src/hooks/usePrint.d.ts.map +1 -0
- package/dist/solid/src/hooks/useRouterLink.d.ts +38 -0
- package/dist/solid/src/hooks/useRouterLink.d.ts.map +1 -0
- package/dist/solid/src/index.d.ts +85 -0
- package/dist/solid/src/index.d.ts.map +1 -0
- package/dist/solid/src/providers/ConfigContext.d.ts +48 -0
- package/dist/solid/src/providers/ConfigContext.d.ts.map +1 -0
- package/dist/solid/src/providers/InitializeProvider.d.ts +23 -0
- package/dist/solid/src/providers/InitializeProvider.d.ts.map +1 -0
- package/dist/solid/src/providers/ServiceClientContext.d.ts +10 -0
- package/dist/solid/src/providers/ServiceClientContext.d.ts.map +1 -0
- package/dist/solid/src/providers/ServiceClientProvider.d.ts +3 -0
- package/dist/solid/src/providers/ServiceClientProvider.d.ts.map +1 -0
- package/dist/solid/src/providers/ThemeContext.d.ts +65 -0
- package/dist/solid/src/providers/ThemeContext.d.ts.map +1 -0
- package/dist/solid/src/providers/shared-data/SharedDataChangeEvent.d.ts +8 -0
- package/dist/solid/src/providers/shared-data/SharedDataChangeEvent.d.ts.map +1 -0
- package/dist/solid/src/providers/shared-data/SharedDataContext.d.ts +22 -0
- package/dist/solid/src/providers/shared-data/SharedDataContext.d.ts.map +1 -0
- package/dist/solid/src/providers/shared-data/SharedDataProvider.d.ts +9 -0
- package/dist/solid/src/providers/shared-data/SharedDataProvider.d.ts.map +1 -0
- package/dist/solid/src/styles/patterns.styles.d.ts +6 -0
- package/dist/solid/src/styles/patterns.styles.d.ts.map +1 -0
- package/dist/solid/src/styles/tokens.styles.d.ts +20 -0
- package/dist/solid/src/styles/tokens.styles.d.ts.map +1 -0
- package/dist/styles/patterns.styles.js +30 -0
- package/dist/styles/patterns.styles.js.map +7 -0
- package/dist/styles/tokens.styles.js +72 -0
- package/dist/styles/tokens.styles.js.map +7 -0
- package/package.json +56 -0
- package/src/base.css +78 -0
- package/src/components/data/Pagination.tsx +112 -0
- package/src/components/data/Table.tsx +43 -0
- package/src/components/data/calendar/Calendar.tsx +139 -0
- package/src/components/data/kanban/Kanban.css +10 -0
- package/src/components/data/kanban/Kanban.tsx +547 -0
- package/src/components/data/kanban/KanbanContext.ts +71 -0
- package/src/components/data/list/List.tsx +184 -0
- package/src/components/data/list/ListContext.ts +12 -0
- package/src/components/data/list/ListItem.styles.ts +49 -0
- package/src/components/data/list/ListItem.tsx +222 -0
- package/src/components/data/permission-table/PermissionTable.tsx +291 -0
- package/src/components/data/sheet/DataSheet.css +26 -0
- package/src/components/data/sheet/DataSheet.styles.ts +161 -0
- package/src/components/data/sheet/DataSheet.tsx +1198 -0
- package/src/components/data/sheet/DataSheetColumn.tsx +29 -0
- package/src/components/data/sheet/DataSheetConfigDialog.tsx +146 -0
- package/src/components/data/sheet/sheetUtils.ts +156 -0
- package/src/components/data/sheet/types.ts +143 -0
- package/src/components/disclosure/Collapse.tsx +72 -0
- package/src/components/disclosure/Dialog.tsx +520 -0
- package/src/components/disclosure/DialogContext.ts +39 -0
- package/src/components/disclosure/DialogInstanceContext.ts +11 -0
- package/src/components/disclosure/DialogProvider.tsx +133 -0
- package/src/components/disclosure/Dropdown.tsx +406 -0
- package/src/components/disclosure/Tabs.tsx +127 -0
- package/src/components/disclosure/dialogZIndex.ts +43 -0
- package/src/components/display/Alert.tsx +32 -0
- package/src/components/display/Barcode.tsx +158 -0
- package/src/components/display/Card.css +14 -0
- package/src/components/display/Card.tsx +26 -0
- package/src/components/display/Echarts.tsx +45 -0
- package/src/components/display/Icon.tsx +13 -0
- package/src/components/display/Tag.tsx +31 -0
- package/src/components/feedback/Progress.tsx +61 -0
- package/src/components/feedback/loading/LoadingContainer.css +19 -0
- package/src/components/feedback/loading/LoadingContainer.tsx +132 -0
- package/src/components/feedback/loading/LoadingContext.ts +20 -0
- package/src/components/feedback/loading/LoadingProvider.tsx +58 -0
- package/src/components/feedback/notification/NotificationBanner.tsx +83 -0
- package/src/components/feedback/notification/NotificationBell.tsx +132 -0
- package/src/components/feedback/notification/NotificationContext.ts +65 -0
- package/src/components/feedback/notification/NotificationProvider.tsx +143 -0
- package/src/components/feedback/notification/index.ts +4 -0
- package/src/components/feedback/print/Print.tsx +21 -0
- package/src/components/feedback/print/PrintInstanceContext.ts +11 -0
- package/src/components/form-control/Button.tsx +90 -0
- package/src/components/form-control/DropdownTrigger.styles.ts +47 -0
- package/src/components/form-control/ThemeToggle.tsx +96 -0
- package/src/components/form-control/checkbox/Checkbox.styles.ts +66 -0
- package/src/components/form-control/checkbox/Checkbox.tsx +106 -0
- package/src/components/form-control/checkbox/CheckboxGroup.tsx +116 -0
- package/src/components/form-control/checkbox/Radio.tsx +107 -0
- package/src/components/form-control/checkbox/RadioGroup.tsx +111 -0
- package/src/components/form-control/color-picker/ColorPicker.tsx +96 -0
- package/src/components/form-control/combobox/Combobox.tsx +390 -0
- package/src/components/form-control/combobox/ComboboxContext.ts +22 -0
- package/src/components/form-control/combobox/ComboboxItem.tsx +69 -0
- package/src/components/form-control/date-range-picker/DateRangePicker.tsx +215 -0
- package/src/components/form-control/editor/EditorToolbar.tsx +348 -0
- package/src/components/form-control/editor/RichTextEditor.tsx +173 -0
- package/src/components/form-control/editor/editor.css +81 -0
- package/src/components/form-control/field/DatePicker.tsx +268 -0
- package/src/components/form-control/field/DateTimePicker.tsx +260 -0
- package/src/components/form-control/field/Field.styles.ts +42 -0
- package/src/components/form-control/field/NumberInput.tsx +328 -0
- package/src/components/form-control/field/TextInput.tsx +287 -0
- package/src/components/form-control/field/Textarea.tsx +262 -0
- package/src/components/form-control/field/TimePicker.tsx +215 -0
- package/src/components/form-control/numpad/Numpad.tsx +218 -0
- package/src/components/form-control/select/Select.tsx +404 -0
- package/src/components/form-control/select/SelectContext.ts +25 -0
- package/src/components/form-control/select/SelectItem.tsx +124 -0
- package/src/components/form-control/state-preset/StatePreset.tsx +277 -0
- package/src/components/layout/FormGroup.tsx +63 -0
- package/src/components/layout/FormTable.tsx +29 -0
- package/src/components/layout/sidebar/Sidebar.tsx +104 -0
- package/src/components/layout/sidebar/SidebarContainer.tsx +115 -0
- package/src/components/layout/sidebar/SidebarContext.ts +40 -0
- package/src/components/layout/sidebar/SidebarMenu.tsx +181 -0
- package/src/components/layout/sidebar/SidebarUser.tsx +107 -0
- package/src/components/layout/topbar/Topbar.tsx +93 -0
- package/src/components/layout/topbar/TopbarContainer.tsx +40 -0
- package/src/components/layout/topbar/TopbarMenu.tsx +206 -0
- package/src/components/layout/topbar/TopbarUser.tsx +96 -0
- package/src/directives/ripple.ts +151 -0
- package/src/helpers/createAppStructure.ts +183 -0
- package/src/helpers/mergeStyles.ts +55 -0
- package/src/helpers/splitSlots.ts +48 -0
- package/src/hooks/createControllableSignal.ts +63 -0
- package/src/hooks/createIMEHandler.ts +65 -0
- package/src/hooks/createMountTransition.ts +45 -0
- package/src/hooks/useClipboardValueCopy.ts +177 -0
- package/src/hooks/usePersisted.ts +51 -0
- package/src/hooks/usePrint.ts +277 -0
- package/src/hooks/useRouterLink.ts +64 -0
- package/src/index.ts +117 -0
- package/src/providers/ConfigContext.ts +59 -0
- package/src/providers/InitializeProvider.tsx +28 -0
- package/src/providers/ServiceClientContext.ts +21 -0
- package/src/providers/ServiceClientProvider.tsx +132 -0
- package/src/providers/ThemeContext.tsx +121 -0
- package/src/providers/shared-data/SharedDataChangeEvent.ts +8 -0
- package/src/providers/shared-data/SharedDataContext.ts +34 -0
- package/src/providers/shared-data/SharedDataProvider.tsx +149 -0
- package/src/styles/patterns.styles.ts +32 -0
- package/src/styles/tokens.styles.ts +83 -0
- package/tailwind.config.ts +50 -0
- package/tests/components/data/List.spec.tsx +683 -0
- package/tests/components/data/Pagination.spec.tsx +317 -0
- package/tests/components/data/Table.spec.tsx +55 -0
- package/tests/components/data/kanban/Kanban.selection.spec.tsx +209 -0
- package/tests/components/data/permission-table/PermissionTable.spec.tsx +280 -0
- package/tests/components/data/sheet/DataSheet.spec.tsx +564 -0
- package/tests/components/disclosure/Collapse.spec.tsx +162 -0
- package/tests/components/disclosure/Dialog.spec.tsx +319 -0
- package/tests/components/disclosure/DialogProvider.spec.tsx +110 -0
- package/tests/components/disclosure/Dropdown.spec.tsx +410 -0
- package/tests/components/disclosure/Tabs.spec.tsx +220 -0
- package/tests/components/display/Alert.spec.tsx +47 -0
- package/tests/components/display/Barcode.spec.tsx +61 -0
- package/tests/components/display/Card.spec.tsx +41 -0
- package/tests/components/display/Tag.spec.tsx +47 -0
- package/tests/components/feedback/notification/LiveRegion.spec.tsx +41 -0
- package/tests/components/feedback/notification/NotificationBanner.spec.tsx +164 -0
- package/tests/components/feedback/notification/NotificationBell.spec.tsx +207 -0
- package/tests/components/feedback/notification/NotificationContext.spec.tsx +331 -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/checkbox/Checkbox.spec.tsx +120 -0
- package/tests/components/form-control/checkbox/Radio.spec.tsx +112 -0
- package/tests/components/form-control/color-picker/ColorPicker.spec.tsx +67 -0
- package/tests/components/form-control/combobox/Combobox.spec.tsx +174 -0
- package/tests/components/form-control/combobox/ComboboxItem.spec.tsx +85 -0
- package/tests/components/form-control/date-range-picker/DateRangePicker.spec.tsx +172 -0
- package/tests/components/form-control/field/DatePicker.spec.tsx +305 -0
- package/tests/components/form-control/field/DateTimePicker.spec.tsx +287 -0
- package/tests/components/form-control/field/NumberInput.spec.tsx +276 -0
- package/tests/components/form-control/field/TextInput.spec.tsx +258 -0
- package/tests/components/form-control/field/Textarea.spec.tsx +181 -0
- package/tests/components/form-control/field/TimePicker.spec.tsx +243 -0
- package/tests/components/form-control/numpad/Numpad.spec.tsx +238 -0
- package/tests/components/form-control/select/Select.spec.tsx +239 -0
- package/tests/components/form-control/select/SelectItem.spec.tsx +149 -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 +190 -0
- package/tests/components/layout/sidebar/SidebarContainer.spec.tsx +203 -0
- package/tests/components/layout/sidebar/SidebarMenu.spec.tsx +213 -0
- package/tests/components/layout/sidebar/SidebarUser.spec.tsx +171 -0
- package/tests/directives/ripple.spec.tsx +130 -0
- package/tests/helpers/createAppStructure.spec.tsx +338 -0
- package/tests/helpers/mergeStyles.spec.ts +163 -0
- package/tests/helpers/splitSlots.spec.tsx +188 -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/usePersisted.spec.tsx +191 -0
- package/tests/hooks/usePrint.spec.tsx +123 -0
- package/tests/hooks/useRouterLink.spec.tsx +183 -0
- package/tests/providers/ConfigContext.spec.ts +40 -0
- package/tests/providers/ServiceClientContext.spec.tsx +83 -0
- package/tests/providers/shared-data/SharedDataProvider.spec.tsx +233 -0
package/README.md
ADDED
|
@@ -0,0 +1,1652 @@
|
|
|
1
|
+
# @simplysm/solid
|
|
2
|
+
|
|
3
|
+
A SolidJS UI component library for enterprise back-office applications such as ERP and MES. Provides components for data-intensive forms, tables, and sidebar layouts with Tailwind CSS styling, dark mode, and responsive design.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
pnpm add @simplysm/solid
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
**Peer Dependencies:**
|
|
12
|
+
- `solid-js` ^1.9
|
|
13
|
+
- `tailwindcss` ^3.4
|
|
14
|
+
|
|
15
|
+
**Optional Peer Dependencies:**
|
|
16
|
+
- `echarts` ^6.0 -- Required for Echarts chart components
|
|
17
|
+
|
|
18
|
+
## Configuration
|
|
19
|
+
|
|
20
|
+
### Tailwind CSS
|
|
21
|
+
|
|
22
|
+
`@simplysm/solid` provides a Tailwind CSS preset. Register it as a preset in your app's `tailwind.config.ts` to automatically apply custom themes including semantic colors, field sizes, and z-index values.
|
|
23
|
+
|
|
24
|
+
```typescript
|
|
25
|
+
// tailwind.config.ts
|
|
26
|
+
import simplysmPreset from "@simplysm/solid/tailwind.config";
|
|
27
|
+
|
|
28
|
+
export default {
|
|
29
|
+
darkMode: "class",
|
|
30
|
+
presets: [simplysmPreset],
|
|
31
|
+
content: [
|
|
32
|
+
"./src/**/*.{ts,tsx}",
|
|
33
|
+
...simplysmPreset.content,
|
|
34
|
+
],
|
|
35
|
+
};
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
### Provider Setup
|
|
39
|
+
|
|
40
|
+
Wrap your app root with `InitializeProvider` and `ThemeProvider`. `InitializeProvider` provides app-wide configuration (clientName, storage), and `ThemeProvider` manages dark mode state.
|
|
41
|
+
|
|
42
|
+
```tsx
|
|
43
|
+
import { InitializeProvider, ThemeProvider } from "@simplysm/solid";
|
|
44
|
+
|
|
45
|
+
function App() {
|
|
46
|
+
return (
|
|
47
|
+
<InitializeProvider config={{ clientName: "my-app" }}>
|
|
48
|
+
<ThemeProvider>
|
|
49
|
+
{/* app content */}
|
|
50
|
+
</ThemeProvider>
|
|
51
|
+
</InitializeProvider>
|
|
52
|
+
);
|
|
53
|
+
}
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
Alternatively, you can use `ConfigContext.Provider` directly:
|
|
57
|
+
|
|
58
|
+
```tsx
|
|
59
|
+
import { ConfigContext, ThemeProvider } from "@simplysm/solid";
|
|
60
|
+
|
|
61
|
+
function App() {
|
|
62
|
+
return (
|
|
63
|
+
<ConfigContext.Provider value={{ clientName: "my-app" }}>
|
|
64
|
+
<ThemeProvider>
|
|
65
|
+
{/* app content */}
|
|
66
|
+
</ThemeProvider>
|
|
67
|
+
</ConfigContext.Provider>
|
|
68
|
+
);
|
|
69
|
+
}
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
### Base CSS
|
|
73
|
+
|
|
74
|
+
Import the base CSS in your entry point:
|
|
75
|
+
|
|
76
|
+
```typescript
|
|
77
|
+
// entry point (e.g., index.tsx)
|
|
78
|
+
import "@simplysm/solid/base.css";
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
---
|
|
82
|
+
|
|
83
|
+
## Components
|
|
84
|
+
|
|
85
|
+
### Form Control
|
|
86
|
+
|
|
87
|
+
#### Button
|
|
88
|
+
|
|
89
|
+
Interactive button component with built-in Material Design ripple effect.
|
|
90
|
+
|
|
91
|
+
```tsx
|
|
92
|
+
import { Button } from "@simplysm/solid";
|
|
93
|
+
|
|
94
|
+
<Button theme="primary" variant="solid">Confirm</Button>
|
|
95
|
+
<Button theme="danger" variant="outline" size="sm">Delete</Button>
|
|
96
|
+
<Button variant="ghost">Cancel</Button>
|
|
97
|
+
<Button disabled>Disabled</Button>
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
| Prop | Type | Default | Description |
|
|
101
|
+
|------|------|---------|-------------|
|
|
102
|
+
| `theme` | `"primary" \| "info" \| "success" \| "warning" \| "danger" \| "base"` | `"base"` | Color theme |
|
|
103
|
+
| `variant` | `"solid" \| "outline" \| "ghost"` | `"outline"` | Style variant |
|
|
104
|
+
| `size` | `"sm" \| "lg"` | - | Size |
|
|
105
|
+
| `inset` | `boolean` | - | Inset style (removes border/rounded corners) |
|
|
106
|
+
| `disabled` | `boolean` | - | Disabled state |
|
|
107
|
+
|
|
108
|
+
All standard HTML `<button>` element attributes can also be passed.
|
|
109
|
+
|
|
110
|
+
---
|
|
111
|
+
|
|
112
|
+
#### TextInput
|
|
113
|
+
|
|
114
|
+
Text input field with format mask and IME (Korean, etc.) composition support.
|
|
115
|
+
|
|
116
|
+
```tsx
|
|
117
|
+
import { TextInput } from "@simplysm/solid";
|
|
118
|
+
|
|
119
|
+
// Basic usage
|
|
120
|
+
<TextInput value={name()} onValueChange={setName} placeholder="Enter name" />
|
|
121
|
+
|
|
122
|
+
// Password
|
|
123
|
+
<TextInput type="password" />
|
|
124
|
+
|
|
125
|
+
// Format mask (e.g., phone number)
|
|
126
|
+
<TextInput format="XXX-XXXX-XXXX" value={phone()} onValueChange={setPhone} />
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
| Prop | Type | Default | Description |
|
|
130
|
+
|------|------|---------|-------------|
|
|
131
|
+
| `value` | `string` | `""` | Input value |
|
|
132
|
+
| `onValueChange` | `(value: string) => void` | - | Value change callback |
|
|
133
|
+
| `type` | `"text" \| "password" \| "email"` | `"text"` | Input type |
|
|
134
|
+
| `format` | `string` | - | Input format (`X` represents character position, rest are separators) |
|
|
135
|
+
| `placeholder` | `string` | - | Placeholder |
|
|
136
|
+
| `disabled` | `boolean` | - | Disabled state |
|
|
137
|
+
| `readonly` | `boolean` | - | Read-only state |
|
|
138
|
+
| `error` | `boolean` | - | Error state (red border) |
|
|
139
|
+
| `size` | `"sm" \| "lg"` | - | Size |
|
|
140
|
+
| `inset` | `boolean` | - | Inset style |
|
|
141
|
+
|
|
142
|
+
---
|
|
143
|
+
|
|
144
|
+
#### NumberInput
|
|
145
|
+
|
|
146
|
+
Number input field with thousand separators and minimum decimal places support.
|
|
147
|
+
|
|
148
|
+
```tsx
|
|
149
|
+
import { NumberInput } from "@simplysm/solid";
|
|
150
|
+
|
|
151
|
+
// Basic usage (thousand separators auto-applied)
|
|
152
|
+
<NumberInput value={amount()} onValueChange={setAmount} />
|
|
153
|
+
|
|
154
|
+
// Without thousand separators
|
|
155
|
+
<NumberInput value={num()} comma={false} />
|
|
156
|
+
|
|
157
|
+
// Minimum 2 decimal places
|
|
158
|
+
<NumberInput value={price()} minDigits={2} />
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
| Prop | Type | Default | Description |
|
|
162
|
+
|------|------|---------|-------------|
|
|
163
|
+
| `value` | `number` | - | Input value |
|
|
164
|
+
| `onValueChange` | `(value: number \| undefined) => void` | - | Value change callback |
|
|
165
|
+
| `comma` | `boolean` | `true` | Show thousand separators |
|
|
166
|
+
| `minDigits` | `number` | - | Minimum decimal places |
|
|
167
|
+
| `placeholder` | `string` | - | Placeholder |
|
|
168
|
+
| `disabled` | `boolean` | - | Disabled state |
|
|
169
|
+
| `readonly` | `boolean` | - | Read-only state |
|
|
170
|
+
| `error` | `boolean` | - | Error state |
|
|
171
|
+
| `size` | `"sm" \| "lg"` | - | Size |
|
|
172
|
+
| `inset` | `boolean` | - | Inset style |
|
|
173
|
+
|
|
174
|
+
---
|
|
175
|
+
|
|
176
|
+
#### DatePicker
|
|
177
|
+
|
|
178
|
+
Date input field supporting year, month, and date units. Values are handled using the `DateOnly` type.
|
|
179
|
+
|
|
180
|
+
```tsx
|
|
181
|
+
import { DatePicker } from "@simplysm/solid";
|
|
182
|
+
import { DateOnly } from "@simplysm/core-common";
|
|
183
|
+
|
|
184
|
+
// Date input
|
|
185
|
+
<DatePicker unit="date" value={date()} onValueChange={setDate} />
|
|
186
|
+
|
|
187
|
+
// Year-month input
|
|
188
|
+
<DatePicker unit="month" value={monthDate()} onValueChange={setMonthDate} />
|
|
189
|
+
|
|
190
|
+
// Year-only input
|
|
191
|
+
<DatePicker unit="year" value={yearDate()} onValueChange={setYearDate} />
|
|
192
|
+
|
|
193
|
+
// min/max constraints
|
|
194
|
+
<DatePicker
|
|
195
|
+
unit="date"
|
|
196
|
+
value={date()}
|
|
197
|
+
onValueChange={setDate}
|
|
198
|
+
min={new DateOnly(2025, 1, 1)}
|
|
199
|
+
max={new DateOnly(2025, 12, 31)}
|
|
200
|
+
/>
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
| Prop | Type | Default | Description |
|
|
204
|
+
|------|------|---------|-------------|
|
|
205
|
+
| `value` | `DateOnly` | - | Input value |
|
|
206
|
+
| `onValueChange` | `(value: DateOnly \| undefined) => void` | - | Value change callback |
|
|
207
|
+
| `unit` | `"year" \| "month" \| "date"` | `"date"` | Date unit |
|
|
208
|
+
| `min` | `DateOnly` | - | Minimum date |
|
|
209
|
+
| `max` | `DateOnly` | - | Maximum date |
|
|
210
|
+
| `disabled` | `boolean` | - | Disabled state |
|
|
211
|
+
| `readonly` | `boolean` | - | Read-only state |
|
|
212
|
+
| `error` | `boolean` | - | Error state |
|
|
213
|
+
| `size` | `"sm" \| "lg"` | - | Size |
|
|
214
|
+
| `inset` | `boolean` | - | Inset style |
|
|
215
|
+
|
|
216
|
+
> `DateTimePicker` and `TimePicker` follow the same pattern for datetime (`DateTime`) and time (`Time`) input.
|
|
217
|
+
|
|
218
|
+
---
|
|
219
|
+
|
|
220
|
+
#### DateRangePicker
|
|
221
|
+
|
|
222
|
+
Component for inputting date ranges with period type selection (day/month/range). The from/to values are automatically adjusted when periodType changes.
|
|
223
|
+
|
|
224
|
+
```tsx
|
|
225
|
+
import { DateRangePicker, type DateRangePeriodType } from "@simplysm/solid";
|
|
226
|
+
import { createSignal } from "solid-js";
|
|
227
|
+
import { DateOnly } from "@simplysm/core-common";
|
|
228
|
+
|
|
229
|
+
const [periodType, setPeriodType] = createSignal<DateRangePeriodType>("range");
|
|
230
|
+
const [from, setFrom] = createSignal<DateOnly>();
|
|
231
|
+
const [to, setTo] = createSignal<DateOnly>();
|
|
232
|
+
|
|
233
|
+
<DateRangePicker
|
|
234
|
+
periodType={periodType()}
|
|
235
|
+
onPeriodTypeChange={setPeriodType}
|
|
236
|
+
from={from()}
|
|
237
|
+
onFromChange={setFrom}
|
|
238
|
+
to={to()}
|
|
239
|
+
onToChange={setTo}
|
|
240
|
+
/>
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
| Prop | Type | Default | Description |
|
|
244
|
+
|------|------|---------|-------------|
|
|
245
|
+
| `periodType` | `"day" \| "month" \| "range"` | `"range"` | Period type |
|
|
246
|
+
| `onPeriodTypeChange` | `(value: DateRangePeriodType) => void` | - | Period type change callback |
|
|
247
|
+
| `from` | `DateOnly` | - | Start date |
|
|
248
|
+
| `onFromChange` | `(value: DateOnly \| undefined) => void` | - | Start date change callback |
|
|
249
|
+
| `to` | `DateOnly` | - | End date |
|
|
250
|
+
| `onToChange` | `(value: DateOnly \| undefined) => void` | - | End date change callback |
|
|
251
|
+
| `disabled` | `boolean` | - | Disabled state |
|
|
252
|
+
| `size` | `"sm" \| "lg"` | - | Size |
|
|
253
|
+
| `periodLabels` | `Partial<Record<DateRangePeriodType, string>>` | `{ day: "Day", month: "Month", range: "Range" }` | Period type labels |
|
|
254
|
+
|
|
255
|
+
---
|
|
256
|
+
|
|
257
|
+
#### Textarea
|
|
258
|
+
|
|
259
|
+
Multi-line text input field. Height adjusts automatically based on content, with IME composition support.
|
|
260
|
+
|
|
261
|
+
```tsx
|
|
262
|
+
import { Textarea } from "@simplysm/solid";
|
|
263
|
+
|
|
264
|
+
<Textarea value={text()} onValueChange={setText} />
|
|
265
|
+
|
|
266
|
+
// Minimum 3 rows height
|
|
267
|
+
<Textarea minRows={3} value={text()} onValueChange={setText} />
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
| Prop | Type | Default | Description |
|
|
271
|
+
|------|------|---------|-------------|
|
|
272
|
+
| `value` | `string` | `""` | Input value |
|
|
273
|
+
| `onValueChange` | `(value: string) => void` | - | Value change callback |
|
|
274
|
+
| `placeholder` | `string` | - | Placeholder |
|
|
275
|
+
| `minRows` | `number` | `1` | Minimum number of rows |
|
|
276
|
+
| `disabled` | `boolean` | - | Disabled state |
|
|
277
|
+
| `readonly` | `boolean` | - | Read-only state |
|
|
278
|
+
| `error` | `boolean` | - | Error state |
|
|
279
|
+
| `size` | `"sm" \| "lg"` | - | Size |
|
|
280
|
+
| `inset` | `boolean` | - | Inset style |
|
|
281
|
+
|
|
282
|
+
---
|
|
283
|
+
|
|
284
|
+
#### Select
|
|
285
|
+
|
|
286
|
+
Dropdown selection component. Supports both items prop approach and children (Compound Components) approach. Single and multiple selection supported.
|
|
287
|
+
|
|
288
|
+
```tsx
|
|
289
|
+
import { Select } from "@simplysm/solid";
|
|
290
|
+
|
|
291
|
+
// items approach (simple array)
|
|
292
|
+
<Select
|
|
293
|
+
items={["Apple", "Banana", "Strawberry"]}
|
|
294
|
+
value={fruit()}
|
|
295
|
+
onValueChange={setFruit}
|
|
296
|
+
placeholder="Select fruit"
|
|
297
|
+
/>
|
|
298
|
+
|
|
299
|
+
// children approach (Compound Components)
|
|
300
|
+
<Select value={fruit()} onValueChange={setFruit} renderValue={(v) => v.name}>
|
|
301
|
+
<Select.Item value={item1}>{item1.name}</Select.Item>
|
|
302
|
+
<Select.Item value={item2}>{item2.name}</Select.Item>
|
|
303
|
+
</Select>
|
|
304
|
+
|
|
305
|
+
// items approach + ItemTemplate for custom rendering
|
|
306
|
+
<Select items={users} value={selectedUser()} onValueChange={setSelectedUser}>
|
|
307
|
+
<Select.ItemTemplate>
|
|
308
|
+
{(user) => <>{user.name} ({user.email})</>}
|
|
309
|
+
</Select.ItemTemplate>
|
|
310
|
+
</Select>
|
|
311
|
+
|
|
312
|
+
// Multiple selection
|
|
313
|
+
<Select items={options} value={selected()} onValueChange={setSelected} multiple />
|
|
314
|
+
|
|
315
|
+
// With action buttons and header
|
|
316
|
+
<Select value={item()} onValueChange={setItem} renderValue={(v) => v.name}>
|
|
317
|
+
<Select.Header><div>Custom header</div></Select.Header>
|
|
318
|
+
<Select.Action onClick={handleAdd}>+</Select.Action>
|
|
319
|
+
<Select.Item value={item1}>{item1.name}</Select.Item>
|
|
320
|
+
</Select>
|
|
321
|
+
```
|
|
322
|
+
|
|
323
|
+
| Prop | Type | Default | Description |
|
|
324
|
+
|------|------|---------|-------------|
|
|
325
|
+
| `value` | `T \| T[]` | - | Selected value |
|
|
326
|
+
| `onValueChange` | `(value: T \| T[]) => void` | - | Value change callback |
|
|
327
|
+
| `items` | `T[]` | - | Items array (items approach) |
|
|
328
|
+
| `getChildren` | `(item: T, index: number, depth: number) => T[] \| undefined` | - | Tree structure children getter |
|
|
329
|
+
| `renderValue` | `(value: T) => JSX.Element` | - | Value rendering function (required for children approach) |
|
|
330
|
+
| `multiple` | `boolean` | `false` | Multiple selection |
|
|
331
|
+
| `multiDisplayDirection` | `"horizontal" \| "vertical"` | `"horizontal"` | Display direction for multiple selection |
|
|
332
|
+
| `hideSelectAll` | `boolean` | - | Hide select all button (multiple selection) |
|
|
333
|
+
| `placeholder` | `string` | - | Placeholder |
|
|
334
|
+
| `disabled` | `boolean` | - | Disabled state |
|
|
335
|
+
| `required` | `boolean` | - | Required field |
|
|
336
|
+
| `size` | `"sm" \| "lg"` | - | Size |
|
|
337
|
+
| `inset` | `boolean` | - | Inset style |
|
|
338
|
+
|
|
339
|
+
**Sub-components:**
|
|
340
|
+
- `Select.Item` -- Selection item
|
|
341
|
+
- `Select.Action` -- Right-side action button
|
|
342
|
+
- `Select.Header` -- Dropdown top custom area
|
|
343
|
+
- `Select.ItemTemplate` -- Item rendering template for items approach
|
|
344
|
+
|
|
345
|
+
---
|
|
346
|
+
|
|
347
|
+
#### Combobox
|
|
348
|
+
|
|
349
|
+
Autocomplete component with async search and item selection support. Debouncing is built-in.
|
|
350
|
+
|
|
351
|
+
```tsx
|
|
352
|
+
import { Combobox } from "@simplysm/solid";
|
|
353
|
+
|
|
354
|
+
<Combobox
|
|
355
|
+
loadItems={async (query) => {
|
|
356
|
+
const response = await fetch(`/api/search?q=${query}`);
|
|
357
|
+
return response.json();
|
|
358
|
+
}}
|
|
359
|
+
renderValue={(item) => item.name}
|
|
360
|
+
value={selected()}
|
|
361
|
+
onValueChange={setSelected}
|
|
362
|
+
placeholder="Search..."
|
|
363
|
+
>
|
|
364
|
+
<Combobox.ItemTemplate>
|
|
365
|
+
{(item) => <>{item.name}</>}
|
|
366
|
+
</Combobox.ItemTemplate>
|
|
367
|
+
</Combobox>
|
|
368
|
+
```
|
|
369
|
+
|
|
370
|
+
| Prop | Type | Default | Description |
|
|
371
|
+
|------|------|---------|-------------|
|
|
372
|
+
| `value` | `T` | - | Selected value |
|
|
373
|
+
| `onValueChange` | `(value: T) => void` | - | Value change callback |
|
|
374
|
+
| `loadItems` | `(query: string) => Promise<T[]>` | **(required)** | Item loading function |
|
|
375
|
+
| `renderValue` | `(value: T) => JSX.Element` | **(required)** | Value rendering function |
|
|
376
|
+
| `debounceMs` | `number` | `300` | Debounce delay (ms) |
|
|
377
|
+
| `allowCustomValue` | `boolean` | - | Allow custom values |
|
|
378
|
+
| `parseCustomValue` | `(text: string) => T` | - | Custom value parsing function |
|
|
379
|
+
| `placeholder` | `string` | - | Placeholder |
|
|
380
|
+
| `disabled` | `boolean` | - | Disabled state |
|
|
381
|
+
| `size` | `"sm" \| "lg"` | - | Size |
|
|
382
|
+
| `inset` | `boolean` | - | Inset style |
|
|
383
|
+
|
|
384
|
+
**Sub-components:**
|
|
385
|
+
- `Combobox.Item` -- Selection item
|
|
386
|
+
- `Combobox.ItemTemplate` -- Item rendering template
|
|
387
|
+
|
|
388
|
+
---
|
|
389
|
+
|
|
390
|
+
#### Checkbox / Radio
|
|
391
|
+
|
|
392
|
+
Checkbox and radio button components.
|
|
393
|
+
|
|
394
|
+
```tsx
|
|
395
|
+
import { Checkbox, Radio } from "@simplysm/solid";
|
|
396
|
+
|
|
397
|
+
<Checkbox value={checked()} onValueChange={setChecked}>I agree</Checkbox>
|
|
398
|
+
<Checkbox theme="success" value={active()} onValueChange={setActive}>Activate</Checkbox>
|
|
399
|
+
|
|
400
|
+
<Radio value={option() === "a"} onValueChange={() => setOption("a")}>Option A</Radio>
|
|
401
|
+
<Radio value={option() === "b"} onValueChange={() => setOption("b")}>Option B</Radio>
|
|
402
|
+
```
|
|
403
|
+
|
|
404
|
+
| Prop | Type | Default | Description |
|
|
405
|
+
|------|------|---------|-------------|
|
|
406
|
+
| `value` | `boolean` | `false` | Checked state |
|
|
407
|
+
| `onValueChange` | `(value: boolean) => void` | - | Value change callback |
|
|
408
|
+
| `theme` | `"primary" \| "info" \| "success" \| "warning" \| "danger" \| "base"` | `"primary"` | Color theme |
|
|
409
|
+
| `size` | `"sm" \| "lg"` | - | Size |
|
|
410
|
+
| `disabled` | `boolean` | - | Disabled state |
|
|
411
|
+
| `inset` | `boolean` | - | Inset style |
|
|
412
|
+
| `inline` | `boolean` | - | Inline style |
|
|
413
|
+
|
|
414
|
+
---
|
|
415
|
+
|
|
416
|
+
#### CheckboxGroup / RadioGroup
|
|
417
|
+
|
|
418
|
+
Group components for managing multiple/single selection across items.
|
|
419
|
+
|
|
420
|
+
```tsx
|
|
421
|
+
import { CheckboxGroup, RadioGroup } from "@simplysm/solid";
|
|
422
|
+
|
|
423
|
+
// Multiple selection
|
|
424
|
+
<CheckboxGroup value={selectedColors()} onValueChange={setSelectedColors}>
|
|
425
|
+
<CheckboxGroup.Item value="red">Red</CheckboxGroup.Item>
|
|
426
|
+
<CheckboxGroup.Item value="green">Green</CheckboxGroup.Item>
|
|
427
|
+
<CheckboxGroup.Item value="blue">Blue</CheckboxGroup.Item>
|
|
428
|
+
</CheckboxGroup>
|
|
429
|
+
|
|
430
|
+
// Single selection
|
|
431
|
+
<RadioGroup value={size()} onValueChange={setSize}>
|
|
432
|
+
<RadioGroup.Item value="sm">Small</RadioGroup.Item>
|
|
433
|
+
<RadioGroup.Item value="md">Medium</RadioGroup.Item>
|
|
434
|
+
<RadioGroup.Item value="lg">Large</RadioGroup.Item>
|
|
435
|
+
</RadioGroup>
|
|
436
|
+
```
|
|
437
|
+
|
|
438
|
+
**CheckboxGroup Props:**
|
|
439
|
+
|
|
440
|
+
| Prop | Type | Default | Description |
|
|
441
|
+
|------|------|---------|-------------|
|
|
442
|
+
| `value` | `T[]` | `[]` | Selected values array |
|
|
443
|
+
| `onValueChange` | `(value: T[]) => void` | - | Value change callback |
|
|
444
|
+
| `theme` | `SemanticTheme` | `"primary"` | Color theme |
|
|
445
|
+
| `size` | `"sm" \| "lg"` | - | Size |
|
|
446
|
+
| `disabled` | `boolean` | - | Disable all items |
|
|
447
|
+
| `inline` | `boolean` | - | Inline style |
|
|
448
|
+
| `inset` | `boolean` | - | Inset style |
|
|
449
|
+
|
|
450
|
+
**RadioGroup Props:**
|
|
451
|
+
|
|
452
|
+
| Prop | Type | Default | Description |
|
|
453
|
+
|------|------|---------|-------------|
|
|
454
|
+
| `value` | `T` | - | Selected value |
|
|
455
|
+
| `onValueChange` | `(value: T) => void` | - | Value change callback |
|
|
456
|
+
| `theme` | `SemanticTheme` | `"primary"` | Color theme |
|
|
457
|
+
| `size` | `"sm" \| "lg"` | - | Size |
|
|
458
|
+
| `disabled` | `boolean` | - | Disable all items |
|
|
459
|
+
| `inline` | `boolean` | - | Inline style |
|
|
460
|
+
| `inset` | `boolean` | - | Inset style |
|
|
461
|
+
|
|
462
|
+
---
|
|
463
|
+
|
|
464
|
+
#### ColorPicker
|
|
465
|
+
|
|
466
|
+
Color selection component.
|
|
467
|
+
|
|
468
|
+
```tsx
|
|
469
|
+
import { ColorPicker } from "@simplysm/solid";
|
|
470
|
+
|
|
471
|
+
<ColorPicker value={color()} onValueChange={setColor} />
|
|
472
|
+
<ColorPicker value={color()} size="sm" disabled />
|
|
473
|
+
```
|
|
474
|
+
|
|
475
|
+
| Prop | Type | Default | Description |
|
|
476
|
+
|------|------|---------|-------------|
|
|
477
|
+
| `value` | `string` | `"#000000"` | Color value (#RRGGBB format) |
|
|
478
|
+
| `onValueChange` | `(value: string) => void` | - | Value change callback |
|
|
479
|
+
| `size` | `"sm" \| "lg"` | - | Size |
|
|
480
|
+
| `disabled` | `boolean` | - | Disabled state |
|
|
481
|
+
|
|
482
|
+
---
|
|
483
|
+
|
|
484
|
+
#### ThemeToggle
|
|
485
|
+
|
|
486
|
+
Dark/light/system theme cycle toggle button. Must be used inside `ThemeProvider`.
|
|
487
|
+
|
|
488
|
+
```tsx
|
|
489
|
+
import { ThemeToggle } from "@simplysm/solid";
|
|
490
|
+
|
|
491
|
+
<ThemeToggle />
|
|
492
|
+
<ThemeToggle size="sm" />
|
|
493
|
+
<ThemeToggle size="lg" />
|
|
494
|
+
```
|
|
495
|
+
|
|
496
|
+
Clicking cycles through `light -> system -> dark -> light`, displaying an icon matching the current mode.
|
|
497
|
+
|
|
498
|
+
| Prop | Type | Default | Description |
|
|
499
|
+
|------|------|---------|-------------|
|
|
500
|
+
| `size` | `"sm" \| "lg"` | - | Button size |
|
|
501
|
+
|
|
502
|
+
---
|
|
503
|
+
|
|
504
|
+
#### RichTextEditor
|
|
505
|
+
|
|
506
|
+
Tiptap-based rich text editor. Supports text formatting (bold, italic, strikethrough), alignment, colors, highlights, tables, and image insertion.
|
|
507
|
+
|
|
508
|
+
```tsx
|
|
509
|
+
import { RichTextEditor } from "@simplysm/solid";
|
|
510
|
+
|
|
511
|
+
<RichTextEditor value={html()} onValueChange={setHtml} />
|
|
512
|
+
```
|
|
513
|
+
|
|
514
|
+
| Prop | Type | Default | Description |
|
|
515
|
+
|------|------|---------|-------------|
|
|
516
|
+
| `value` | `string` | - | HTML string value |
|
|
517
|
+
| `onValueChange` | `(value: string) => void` | - | Value change callback |
|
|
518
|
+
| `disabled` | `boolean` | - | Disabled state |
|
|
519
|
+
| `error` | `boolean` | - | Error state |
|
|
520
|
+
| `size` | `"sm" \| "lg"` | - | Size |
|
|
521
|
+
|
|
522
|
+
---
|
|
523
|
+
|
|
524
|
+
#### Numpad
|
|
525
|
+
|
|
526
|
+
Numeric keypad component. Used in environments requiring touch-based number input.
|
|
527
|
+
|
|
528
|
+
```tsx
|
|
529
|
+
import { Numpad } from "@simplysm/solid";
|
|
530
|
+
|
|
531
|
+
<Numpad value={amount()} onValueChange={setAmount} />
|
|
532
|
+
|
|
533
|
+
// With ENT/minus buttons
|
|
534
|
+
<Numpad
|
|
535
|
+
value={amount()}
|
|
536
|
+
onValueChange={setAmount}
|
|
537
|
+
useEnterButton
|
|
538
|
+
useMinusButton
|
|
539
|
+
onEnterButtonClick={handleSubmit}
|
|
540
|
+
/>
|
|
541
|
+
```
|
|
542
|
+
|
|
543
|
+
| Prop | Type | Default | Description |
|
|
544
|
+
|------|------|---------|-------------|
|
|
545
|
+
| `value` | `number` | - | Input value |
|
|
546
|
+
| `onValueChange` | `(value: number \| undefined) => void` | - | Value change callback |
|
|
547
|
+
| `placeholder` | `string` | - | Placeholder |
|
|
548
|
+
| `required` | `boolean` | - | Required field |
|
|
549
|
+
| `inputDisabled` | `boolean` | - | Disable direct text field input |
|
|
550
|
+
| `useEnterButton` | `boolean` | - | Show ENT button |
|
|
551
|
+
| `useMinusButton` | `boolean` | - | Show minus button |
|
|
552
|
+
| `onEnterButtonClick` | `() => void` | - | ENT click callback |
|
|
553
|
+
| `size` | `"sm" \| "lg"` | - | Size |
|
|
554
|
+
|
|
555
|
+
---
|
|
556
|
+
|
|
557
|
+
#### StatePreset
|
|
558
|
+
|
|
559
|
+
Component for saving/loading screen state (search conditions, etc.) as presets. Persisted in localStorage.
|
|
560
|
+
|
|
561
|
+
```tsx
|
|
562
|
+
import { StatePreset } from "@simplysm/solid";
|
|
563
|
+
|
|
564
|
+
<StatePreset
|
|
565
|
+
presetKey="user-search"
|
|
566
|
+
value={searchState()}
|
|
567
|
+
onValueChange={setSearchState}
|
|
568
|
+
/>
|
|
569
|
+
```
|
|
570
|
+
|
|
571
|
+
| Prop | Type | Default | Description |
|
|
572
|
+
|------|------|---------|-------------|
|
|
573
|
+
| `presetKey` | `string` | **(required)** | Preset storage key |
|
|
574
|
+
| `value` | `T` | **(required)** | Current state value |
|
|
575
|
+
| `onValueChange` | `(value: T) => void` | **(required)** | State restore callback |
|
|
576
|
+
| `size` | `"sm" \| "lg"` | - | Size |
|
|
577
|
+
|
|
578
|
+
---
|
|
579
|
+
|
|
580
|
+
### Navigation
|
|
581
|
+
|
|
582
|
+
#### Tabs
|
|
583
|
+
|
|
584
|
+
Tab navigation component.
|
|
585
|
+
|
|
586
|
+
```tsx
|
|
587
|
+
import { Tabs } from "@simplysm/solid";
|
|
588
|
+
|
|
589
|
+
<Tabs value={activeTab()} onValueChange={setActiveTab}>
|
|
590
|
+
<Tabs.Tab value="tab1">Tab 1</Tabs.Tab>
|
|
591
|
+
<Tabs.Tab value="tab2">Tab 2</Tabs.Tab>
|
|
592
|
+
<Tabs.Tab value="tab3" disabled>Tab 3</Tabs.Tab>
|
|
593
|
+
</Tabs>
|
|
594
|
+
```
|
|
595
|
+
|
|
596
|
+
| Prop | Type | Default | Description |
|
|
597
|
+
|------|------|---------|-------------|
|
|
598
|
+
| `value` | `string` | - | Selected tab value |
|
|
599
|
+
| `onValueChange` | `(value: string) => void` | - | Tab change callback |
|
|
600
|
+
| `size` | `"sm" \| "lg"` | - | Size |
|
|
601
|
+
|
|
602
|
+
**Sub-components:**
|
|
603
|
+
- `Tabs.Tab` -- Individual tab (`value: string`, `disabled?: boolean`)
|
|
604
|
+
|
|
605
|
+
---
|
|
606
|
+
|
|
607
|
+
### Display
|
|
608
|
+
|
|
609
|
+
#### Card
|
|
610
|
+
|
|
611
|
+
Container with shadow effect.
|
|
612
|
+
|
|
613
|
+
```tsx
|
|
614
|
+
import { Card } from "@simplysm/solid";
|
|
615
|
+
|
|
616
|
+
<Card>Card content</Card>
|
|
617
|
+
<Card class="p-4">Card with padding</Card>
|
|
618
|
+
```
|
|
619
|
+
|
|
620
|
+
---
|
|
621
|
+
|
|
622
|
+
#### Tag
|
|
623
|
+
|
|
624
|
+
Inline tag/badge component.
|
|
625
|
+
|
|
626
|
+
```tsx
|
|
627
|
+
import { Tag } from "@simplysm/solid";
|
|
628
|
+
|
|
629
|
+
<Tag theme="primary">New</Tag>
|
|
630
|
+
<Tag theme="success">Complete</Tag>
|
|
631
|
+
<Tag theme="danger">Urgent</Tag>
|
|
632
|
+
```
|
|
633
|
+
|
|
634
|
+
| Prop | Type | Default | Description |
|
|
635
|
+
|------|------|---------|-------------|
|
|
636
|
+
| `theme` | `"primary" \| "info" \| "success" \| "warning" \| "danger" \| "base"` | `"base"` | Color theme |
|
|
637
|
+
|
|
638
|
+
---
|
|
639
|
+
|
|
640
|
+
#### Alert
|
|
641
|
+
|
|
642
|
+
Block-level alert/notice component.
|
|
643
|
+
|
|
644
|
+
```tsx
|
|
645
|
+
import { Alert } from "@simplysm/solid";
|
|
646
|
+
|
|
647
|
+
<Alert theme="info">This is an information message.</Alert>
|
|
648
|
+
<Alert theme="warning">Please pay attention to this.</Alert>
|
|
649
|
+
<Alert theme="danger">An error has occurred.</Alert>
|
|
650
|
+
```
|
|
651
|
+
|
|
652
|
+
| Prop | Type | Default | Description |
|
|
653
|
+
|------|------|---------|-------------|
|
|
654
|
+
| `theme` | `"primary" \| "info" \| "success" \| "warning" \| "danger" \| "base"` | `"base"` | Color theme |
|
|
655
|
+
|
|
656
|
+
---
|
|
657
|
+
|
|
658
|
+
#### Icon
|
|
659
|
+
|
|
660
|
+
Tabler Icons wrapper component. Displayed in `em` units to scale proportionally with surrounding text.
|
|
661
|
+
|
|
662
|
+
```tsx
|
|
663
|
+
import { Icon } from "@simplysm/solid";
|
|
664
|
+
import { IconCheck, IconAlertTriangle } from "@tabler/icons-solidjs";
|
|
665
|
+
|
|
666
|
+
<Icon icon={IconCheck} />
|
|
667
|
+
<Icon icon={IconAlertTriangle} size="2em" />
|
|
668
|
+
```
|
|
669
|
+
|
|
670
|
+
| Prop | Type | Default | Description |
|
|
671
|
+
|------|------|---------|-------------|
|
|
672
|
+
| `icon` | `Component` | **(required)** | Tabler icon component |
|
|
673
|
+
| `size` | `string \| number` | `"1.25em"` | Icon size |
|
|
674
|
+
|
|
675
|
+
---
|
|
676
|
+
|
|
677
|
+
#### Progress
|
|
678
|
+
|
|
679
|
+
Progress indicator component.
|
|
680
|
+
|
|
681
|
+
```tsx
|
|
682
|
+
import { Progress } from "@simplysm/solid";
|
|
683
|
+
|
|
684
|
+
<Progress value={0.65} />
|
|
685
|
+
<Progress value={0.8} theme="success" size="lg" />
|
|
686
|
+
|
|
687
|
+
// Custom text
|
|
688
|
+
<Progress value={progress()}>
|
|
689
|
+
{Math.round(progress() * 100)}% complete
|
|
690
|
+
</Progress>
|
|
691
|
+
```
|
|
692
|
+
|
|
693
|
+
| Prop | Type | Default | Description |
|
|
694
|
+
|------|------|---------|-------------|
|
|
695
|
+
| `value` | `number` | **(required)** | Progress (0~1) |
|
|
696
|
+
| `theme` | `"primary" \| "info" \| "success" \| "warning" \| "danger" \| "base"` | `"primary"` | Color theme |
|
|
697
|
+
| `size` | `"sm" \| "lg"` | - | Size |
|
|
698
|
+
| `inset` | `boolean` | - | Inset style |
|
|
699
|
+
|
|
700
|
+
---
|
|
701
|
+
|
|
702
|
+
#### Barcode
|
|
703
|
+
|
|
704
|
+
bwip-js-based barcode/QR code rendering component. Supports over 100 barcode types.
|
|
705
|
+
|
|
706
|
+
```tsx
|
|
707
|
+
import { Barcode } from "@simplysm/solid";
|
|
708
|
+
|
|
709
|
+
<Barcode type="qrcode" value="https://example.com" />
|
|
710
|
+
<Barcode type="code128" value="ABC-12345" />
|
|
711
|
+
<Barcode type="ean13" value="4901234567890" />
|
|
712
|
+
```
|
|
713
|
+
|
|
714
|
+
| Prop | Type | Default | Description |
|
|
715
|
+
|------|------|---------|-------------|
|
|
716
|
+
| `type` | `BarcodeType` | **(required)** | Barcode type (`"qrcode"`, `"code128"`, `"ean13"`, etc.) |
|
|
717
|
+
| `value` | `string` | - | Barcode value |
|
|
718
|
+
|
|
719
|
+
---
|
|
720
|
+
|
|
721
|
+
#### Echarts
|
|
722
|
+
|
|
723
|
+
Apache ECharts chart wrapper component. Requires `echarts` peer dependency installation.
|
|
724
|
+
|
|
725
|
+
```tsx
|
|
726
|
+
import { Echarts } from "@simplysm/solid";
|
|
727
|
+
|
|
728
|
+
<Echarts
|
|
729
|
+
option={{
|
|
730
|
+
xAxis: { type: "category", data: ["Mon", "Tue", "Wed"] },
|
|
731
|
+
yAxis: { type: "value" },
|
|
732
|
+
series: [{ data: [120, 200, 150], type: "bar" }],
|
|
733
|
+
}}
|
|
734
|
+
/>
|
|
735
|
+
|
|
736
|
+
<Echarts option={chartOption()} loading={isLoading()} />
|
|
737
|
+
```
|
|
738
|
+
|
|
739
|
+
| Prop | Type | Default | Description |
|
|
740
|
+
|------|------|---------|-------------|
|
|
741
|
+
| `option` | `echarts.EChartsOption` | **(required)** | ECharts option object |
|
|
742
|
+
| `loading` | `boolean` | - | Show loading state |
|
|
743
|
+
|
|
744
|
+
---
|
|
745
|
+
|
|
746
|
+
### Layout
|
|
747
|
+
|
|
748
|
+
#### Sidebar
|
|
749
|
+
|
|
750
|
+
Sidebar navigation with responsive support (mobile overlay below 520px). Open/closed state is saved in localStorage.
|
|
751
|
+
|
|
752
|
+
```tsx
|
|
753
|
+
import { Sidebar } from "@simplysm/solid";
|
|
754
|
+
|
|
755
|
+
<Sidebar.Container>
|
|
756
|
+
<Sidebar>
|
|
757
|
+
<Sidebar.User name="John Doe" menus={userMenus}>
|
|
758
|
+
<span>John Doe</span>
|
|
759
|
+
</Sidebar.User>
|
|
760
|
+
<Sidebar.Menu menus={menuItems} />
|
|
761
|
+
</Sidebar>
|
|
762
|
+
<div class="flex flex-1 flex-col">
|
|
763
|
+
<Topbar>
|
|
764
|
+
<h1>App Name</h1>
|
|
765
|
+
</Topbar>
|
|
766
|
+
<main class="flex-1 overflow-auto p-4">
|
|
767
|
+
{/* main content */}
|
|
768
|
+
</main>
|
|
769
|
+
</div>
|
|
770
|
+
</Sidebar.Container>
|
|
771
|
+
```
|
|
772
|
+
|
|
773
|
+
**Sub-components:**
|
|
774
|
+
- `Sidebar.Container` -- Container wrapping sidebar and main area (required)
|
|
775
|
+
- `Sidebar.Menu` -- Menu items list (`menus: SidebarMenuItem[]`)
|
|
776
|
+
- `Sidebar.User` -- User info area
|
|
777
|
+
|
|
778
|
+
---
|
|
779
|
+
|
|
780
|
+
#### Topbar
|
|
781
|
+
|
|
782
|
+
Top navigation bar. When used inside `Sidebar.Container`, a sidebar toggle button appears automatically.
|
|
783
|
+
|
|
784
|
+
```tsx
|
|
785
|
+
import { Topbar } from "@simplysm/solid";
|
|
786
|
+
|
|
787
|
+
<Topbar>
|
|
788
|
+
<h1 class="text-lg font-bold">App Name</h1>
|
|
789
|
+
<Topbar.Menu menus={menuItems} />
|
|
790
|
+
<div class="flex-1" />
|
|
791
|
+
<Topbar.User menus={userMenus}>User</Topbar.User>
|
|
792
|
+
</Topbar>
|
|
793
|
+
```
|
|
794
|
+
|
|
795
|
+
**Sub-components:**
|
|
796
|
+
- `Topbar.Container` -- Container wrapping main content below topbar
|
|
797
|
+
- `Topbar.Menu` -- Menu items list
|
|
798
|
+
- `Topbar.User` -- User menu (dropdown)
|
|
799
|
+
|
|
800
|
+
---
|
|
801
|
+
|
|
802
|
+
#### FormGroup
|
|
803
|
+
|
|
804
|
+
Layout component for arranging form fields with labels vertically or inline.
|
|
805
|
+
|
|
806
|
+
```tsx
|
|
807
|
+
import { FormGroup, TextInput } from "@simplysm/solid";
|
|
808
|
+
|
|
809
|
+
// Vertical layout (default)
|
|
810
|
+
<FormGroup>
|
|
811
|
+
<FormGroup.Item label="Name">
|
|
812
|
+
<TextInput value={name()} onValueChange={setName} />
|
|
813
|
+
</FormGroup.Item>
|
|
814
|
+
<FormGroup.Item label="Email">
|
|
815
|
+
<TextInput type="email" value={email()} onValueChange={setEmail} />
|
|
816
|
+
</FormGroup.Item>
|
|
817
|
+
</FormGroup>
|
|
818
|
+
|
|
819
|
+
// Inline layout
|
|
820
|
+
<FormGroup inline>
|
|
821
|
+
<FormGroup.Item label="Search">
|
|
822
|
+
<TextInput value={query()} onValueChange={setQuery} />
|
|
823
|
+
</FormGroup.Item>
|
|
824
|
+
<FormGroup.Item>
|
|
825
|
+
<Button theme="primary">Search</Button>
|
|
826
|
+
</FormGroup.Item>
|
|
827
|
+
</FormGroup>
|
|
828
|
+
```
|
|
829
|
+
|
|
830
|
+
| Prop | Type | Default | Description |
|
|
831
|
+
|------|------|---------|-------------|
|
|
832
|
+
| `inline` | `boolean` | `false` | Inline layout mode |
|
|
833
|
+
|
|
834
|
+
**Sub-components:**
|
|
835
|
+
- `FormGroup.Item` -- Form item (`label?: JSX.Element`)
|
|
836
|
+
|
|
837
|
+
---
|
|
838
|
+
|
|
839
|
+
#### FormTable
|
|
840
|
+
|
|
841
|
+
`<table>`-based form layout. Labels go in `<th>`, input fields in `<td>`.
|
|
842
|
+
|
|
843
|
+
```tsx
|
|
844
|
+
import { FormTable, TextInput, NumberInput } from "@simplysm/solid";
|
|
845
|
+
|
|
846
|
+
<FormTable>
|
|
847
|
+
<tbody>
|
|
848
|
+
<tr>
|
|
849
|
+
<th>Name</th>
|
|
850
|
+
<td><TextInput value={name()} onValueChange={setName} /></td>
|
|
851
|
+
<th>Age</th>
|
|
852
|
+
<td><NumberInput value={age()} onValueChange={setAge} /></td>
|
|
853
|
+
</tr>
|
|
854
|
+
<tr>
|
|
855
|
+
<th>Email</th>
|
|
856
|
+
<td colSpan={3}><TextInput type="email" value={email()} onValueChange={setEmail} /></td>
|
|
857
|
+
</tr>
|
|
858
|
+
</tbody>
|
|
859
|
+
</FormTable>
|
|
860
|
+
```
|
|
861
|
+
|
|
862
|
+
---
|
|
863
|
+
|
|
864
|
+
#### Kanban
|
|
865
|
+
|
|
866
|
+
Kanban board layout component.
|
|
867
|
+
|
|
868
|
+
---
|
|
869
|
+
|
|
870
|
+
### Data
|
|
871
|
+
|
|
872
|
+
#### Table
|
|
873
|
+
|
|
874
|
+
Basic HTML table wrapper. Provides consistent styling for borders, header backgrounds, etc.
|
|
875
|
+
|
|
876
|
+
```tsx
|
|
877
|
+
import { Table } from "@simplysm/solid";
|
|
878
|
+
|
|
879
|
+
<Table>
|
|
880
|
+
<thead>
|
|
881
|
+
<tr><th>Name</th><th>Age</th></tr>
|
|
882
|
+
</thead>
|
|
883
|
+
<tbody>
|
|
884
|
+
<tr><td>John Doe</td><td>30</td></tr>
|
|
885
|
+
<tr><td>Jane Smith</td><td>25</td></tr>
|
|
886
|
+
</tbody>
|
|
887
|
+
</Table>
|
|
888
|
+
|
|
889
|
+
// Inset style (removes outer border, fits parent container)
|
|
890
|
+
<Table inset>...</Table>
|
|
891
|
+
```
|
|
892
|
+
|
|
893
|
+
| Prop | Type | Default | Description |
|
|
894
|
+
|------|------|---------|-------------|
|
|
895
|
+
| `inset` | `boolean` | - | Inset style |
|
|
896
|
+
|
|
897
|
+
---
|
|
898
|
+
|
|
899
|
+
#### DataSheet
|
|
900
|
+
|
|
901
|
+
Advanced data table component. Supports sorting, pagination, row selection, tree expansion, column resize, column configuration, and row reordering.
|
|
902
|
+
|
|
903
|
+
```tsx
|
|
904
|
+
import { DataSheet } from "@simplysm/solid";
|
|
905
|
+
|
|
906
|
+
<DataSheet items={users()} key="user-table">
|
|
907
|
+
<DataSheet.Column key="name" header="Name" sortable>
|
|
908
|
+
{({ item }) => <>{item.name}</>}
|
|
909
|
+
</DataSheet.Column>
|
|
910
|
+
<DataSheet.Column key="age" header="Age" sortable width="80px">
|
|
911
|
+
{({ item }) => <>{item.age}</>}
|
|
912
|
+
</DataSheet.Column>
|
|
913
|
+
<DataSheet.Column key="email" header="Email">
|
|
914
|
+
{({ item }) => <>{item.email}</>}
|
|
915
|
+
</DataSheet.Column>
|
|
916
|
+
</DataSheet>
|
|
917
|
+
|
|
918
|
+
// With pagination + sorting + selection
|
|
919
|
+
<DataSheet
|
|
920
|
+
items={data()}
|
|
921
|
+
key="data-table"
|
|
922
|
+
page={page()}
|
|
923
|
+
onPageChange={setPage}
|
|
924
|
+
totalPageCount={totalPages()}
|
|
925
|
+
sorts={sorts()}
|
|
926
|
+
onSortsChange={setSorts}
|
|
927
|
+
selectMode="multiple"
|
|
928
|
+
selectedItems={selectedItems()}
|
|
929
|
+
onSelectedItemsChange={setSelectedItems}
|
|
930
|
+
>
|
|
931
|
+
{/* columns */}
|
|
932
|
+
</DataSheet>
|
|
933
|
+
```
|
|
934
|
+
|
|
935
|
+
**DataSheet Props (key items):**
|
|
936
|
+
|
|
937
|
+
| Prop | Type | Default | Description |
|
|
938
|
+
|------|------|---------|-------------|
|
|
939
|
+
| `items` | `T[]` | - | Data array |
|
|
940
|
+
| `key` | `string` | - | Column configuration storage key |
|
|
941
|
+
| `inset` | `boolean` | - | Inset style |
|
|
942
|
+
| `sorts` | `SortingDef[]` | - | Sort definition |
|
|
943
|
+
| `onSortsChange` | `(sorts: SortingDef[]) => void` | - | Sort change callback |
|
|
944
|
+
| `autoSort` | `boolean` | - | Client-side auto-sorting |
|
|
945
|
+
| `page` | `number` | - | Current page (0-based) |
|
|
946
|
+
| `onPageChange` | `(page: number) => void` | - | Page change callback |
|
|
947
|
+
| `totalPageCount` | `number` | - | Total page count |
|
|
948
|
+
| `selectMode` | `"single" \| "multiple"` | - | Selection mode |
|
|
949
|
+
| `selectedItems` | `T[]` | - | Selected items |
|
|
950
|
+
| `onSelectedItemsChange` | `(items: T[]) => void` | - | Selection change callback |
|
|
951
|
+
| `getChildren` | `(item: T, index: number) => T[] \| undefined` | - | Tree structure children getter |
|
|
952
|
+
| `hideConfigBar` | `boolean` | - | Hide configuration bar |
|
|
953
|
+
|
|
954
|
+
**DataSheet.Column Props:**
|
|
955
|
+
|
|
956
|
+
| Prop | Type | Default | Description |
|
|
957
|
+
|------|------|---------|-------------|
|
|
958
|
+
| `key` | `string` | **(required)** | Column identifier key |
|
|
959
|
+
| `header` | `string \| string[]` | - | Header text (array for multi-level headers) |
|
|
960
|
+
| `headerContent` | `() => JSX.Element` | - | Custom header rendering |
|
|
961
|
+
| `summary` | `() => JSX.Element` | - | Summary row rendering |
|
|
962
|
+
| `width` | `string` | - | Column width |
|
|
963
|
+
| `fixed` | `boolean` | - | Fixed column |
|
|
964
|
+
| `hidden` | `boolean` | - | Hidden column |
|
|
965
|
+
| `sortable` | `boolean` | - | Sortable |
|
|
966
|
+
| `resizable` | `boolean` | - | Resizable |
|
|
967
|
+
| `children` | `(ctx: { item: T, index: number, depth: number }) => JSX.Element` | **(required)** | Cell rendering function |
|
|
968
|
+
|
|
969
|
+
---
|
|
970
|
+
|
|
971
|
+
#### List
|
|
972
|
+
|
|
973
|
+
Tree-view style list component. Supports keyboard navigation.
|
|
974
|
+
|
|
975
|
+
```tsx
|
|
976
|
+
import { List } from "@simplysm/solid";
|
|
977
|
+
|
|
978
|
+
<List>
|
|
979
|
+
<List.Item>Item 1</List.Item>
|
|
980
|
+
<List.Item>Item 2</List.Item>
|
|
981
|
+
<List.Item>
|
|
982
|
+
Parent item
|
|
983
|
+
<List.Item.Children>
|
|
984
|
+
<List.Item>Child item 1</List.Item>
|
|
985
|
+
<List.Item>Child item 2</List.Item>
|
|
986
|
+
</List.Item.Children>
|
|
987
|
+
</List.Item>
|
|
988
|
+
</List>
|
|
989
|
+
|
|
990
|
+
// Inset style
|
|
991
|
+
<List inset>
|
|
992
|
+
<List.Item>Inset item</List.Item>
|
|
993
|
+
</List>
|
|
994
|
+
```
|
|
995
|
+
|
|
996
|
+
**Keyboard navigation:**
|
|
997
|
+
- `ArrowUp` / `ArrowDown` -- Move focus to previous/next item
|
|
998
|
+
- `Space` / `Enter` -- Click current item
|
|
999
|
+
- `ArrowRight` -- Expand if collapsed, focus first child if expanded
|
|
1000
|
+
- `ArrowLeft` -- Collapse if expanded, focus parent if collapsed
|
|
1001
|
+
- `Home` / `End` -- Focus first/last item
|
|
1002
|
+
|
|
1003
|
+
| Prop | Type | Default | Description |
|
|
1004
|
+
|------|------|---------|-------------|
|
|
1005
|
+
| `inset` | `boolean` | - | Transparent background style |
|
|
1006
|
+
|
|
1007
|
+
---
|
|
1008
|
+
|
|
1009
|
+
#### Pagination
|
|
1010
|
+
|
|
1011
|
+
Page navigation component.
|
|
1012
|
+
|
|
1013
|
+
```tsx
|
|
1014
|
+
import { Pagination } from "@simplysm/solid";
|
|
1015
|
+
|
|
1016
|
+
<Pagination
|
|
1017
|
+
page={currentPage()}
|
|
1018
|
+
onPageChange={setCurrentPage}
|
|
1019
|
+
totalPageCount={20}
|
|
1020
|
+
displayPageCount={10}
|
|
1021
|
+
/>
|
|
1022
|
+
```
|
|
1023
|
+
|
|
1024
|
+
| Prop | Type | Default | Description |
|
|
1025
|
+
|------|------|---------|-------------|
|
|
1026
|
+
| `page` | `number` | **(required)** | Current page (0-based) |
|
|
1027
|
+
| `onPageChange` | `(page: number) => void` | - | Page change callback |
|
|
1028
|
+
| `totalPageCount` | `number` | **(required)** | Total page count |
|
|
1029
|
+
| `displayPageCount` | `number` | `10` | Number of pages to display at once |
|
|
1030
|
+
| `size` | `"sm" \| "lg"` | - | Size |
|
|
1031
|
+
|
|
1032
|
+
---
|
|
1033
|
+
|
|
1034
|
+
#### Calendar
|
|
1035
|
+
|
|
1036
|
+
Calendar-style data display component.
|
|
1037
|
+
|
|
1038
|
+
```tsx
|
|
1039
|
+
import { Calendar } from "@simplysm/solid";
|
|
1040
|
+
|
|
1041
|
+
<Calendar
|
|
1042
|
+
items={events()}
|
|
1043
|
+
getItemDate={(event) => event.date}
|
|
1044
|
+
renderItem={(event) => <div>{event.title}</div>}
|
|
1045
|
+
yearMonth={yearMonth()}
|
|
1046
|
+
onYearMonthChange={setYearMonth}
|
|
1047
|
+
/>
|
|
1048
|
+
```
|
|
1049
|
+
|
|
1050
|
+
| Prop | Type | Default | Description |
|
|
1051
|
+
|------|------|---------|-------------|
|
|
1052
|
+
| `items` | `T[]` | **(required)** | Data array |
|
|
1053
|
+
| `getItemDate` | `(item: T, index: number) => DateOnly` | **(required)** | Item date extraction function |
|
|
1054
|
+
| `renderItem` | `(item: T, index: number) => JSX.Element` | **(required)** | Item rendering function |
|
|
1055
|
+
| `yearMonth` | `DateOnly` | - | Year-month to display |
|
|
1056
|
+
| `onYearMonthChange` | `(value: DateOnly) => void` | - | Year-month change callback |
|
|
1057
|
+
| `weekStartDay` | `number` | `0` (Sunday) | Week start day |
|
|
1058
|
+
|
|
1059
|
+
---
|
|
1060
|
+
|
|
1061
|
+
#### PermissionTable
|
|
1062
|
+
|
|
1063
|
+
Permission management table component.
|
|
1064
|
+
|
|
1065
|
+
---
|
|
1066
|
+
|
|
1067
|
+
### Disclosure
|
|
1068
|
+
|
|
1069
|
+
#### Collapse
|
|
1070
|
+
|
|
1071
|
+
Content collapse/expand animation component. Uses `margin-top`-based transition for smooth open/close effects.
|
|
1072
|
+
|
|
1073
|
+
```tsx
|
|
1074
|
+
import { Collapse, Button } from "@simplysm/solid";
|
|
1075
|
+
import { createSignal } from "solid-js";
|
|
1076
|
+
|
|
1077
|
+
const [open, setOpen] = createSignal(false);
|
|
1078
|
+
|
|
1079
|
+
<Button
|
|
1080
|
+
aria-expanded={open()}
|
|
1081
|
+
aria-controls="content"
|
|
1082
|
+
onClick={() => setOpen(!open())}
|
|
1083
|
+
>
|
|
1084
|
+
Toggle
|
|
1085
|
+
</Button>
|
|
1086
|
+
<Collapse id="content" open={open()}>
|
|
1087
|
+
<p>Collapsible content</p>
|
|
1088
|
+
</Collapse>
|
|
1089
|
+
```
|
|
1090
|
+
|
|
1091
|
+
| Prop | Type | Default | Description |
|
|
1092
|
+
|------|------|---------|-------------|
|
|
1093
|
+
| `open` | `boolean` | `false` | Open state |
|
|
1094
|
+
|
|
1095
|
+
Animation is automatically disabled when `prefers-reduced-motion` is set.
|
|
1096
|
+
|
|
1097
|
+
---
|
|
1098
|
+
|
|
1099
|
+
#### Dropdown
|
|
1100
|
+
|
|
1101
|
+
Positioned dropdown popup. Position is determined relative to trigger element or absolute coordinates.
|
|
1102
|
+
|
|
1103
|
+
```tsx
|
|
1104
|
+
import { Dropdown, Button } from "@simplysm/solid";
|
|
1105
|
+
import { createSignal } from "solid-js";
|
|
1106
|
+
|
|
1107
|
+
const [open, setOpen] = createSignal(false);
|
|
1108
|
+
let triggerRef!: HTMLButtonElement;
|
|
1109
|
+
|
|
1110
|
+
<Button ref={triggerRef} onClick={() => setOpen(!open())}>Open</Button>
|
|
1111
|
+
<Dropdown triggerRef={() => triggerRef} open={open()} onOpenChange={setOpen}>
|
|
1112
|
+
<p class="p-3">Dropdown content</p>
|
|
1113
|
+
</Dropdown>
|
|
1114
|
+
|
|
1115
|
+
// Context menu (absolute position)
|
|
1116
|
+
<Dropdown position={{ x: 100, y: 200 }} open={menuOpen()} onOpenChange={setMenuOpen}>
|
|
1117
|
+
<List inset>
|
|
1118
|
+
<List.Item>Menu item 1</List.Item>
|
|
1119
|
+
<List.Item>Menu item 2</List.Item>
|
|
1120
|
+
</List>
|
|
1121
|
+
</Dropdown>
|
|
1122
|
+
```
|
|
1123
|
+
|
|
1124
|
+
| Prop | Type | Default | Description |
|
|
1125
|
+
|------|------|---------|-------------|
|
|
1126
|
+
| `triggerRef` | `() => HTMLElement \| undefined` | - | Trigger element reference (mutually exclusive with position) |
|
|
1127
|
+
| `position` | `{ x: number; y: number }` | - | Absolute position (mutually exclusive with triggerRef) |
|
|
1128
|
+
| `open` | `boolean` | - | Open state |
|
|
1129
|
+
| `onOpenChange` | `(open: boolean) => void` | - | State change callback |
|
|
1130
|
+
| `maxHeight` | `number` | `300` | Maximum height (px) |
|
|
1131
|
+
| `keyboardNav` | `boolean` | - | Enable keyboard navigation (used by Select, etc.) |
|
|
1132
|
+
|
|
1133
|
+
---
|
|
1134
|
+
|
|
1135
|
+
#### Dialog
|
|
1136
|
+
|
|
1137
|
+
Modal dialog component. Supports drag movement, resize, floating mode, and fullscreen mode.
|
|
1138
|
+
|
|
1139
|
+
```tsx
|
|
1140
|
+
import { Dialog, Button } from "@simplysm/solid";
|
|
1141
|
+
import { createSignal } from "solid-js";
|
|
1142
|
+
|
|
1143
|
+
const [open, setOpen] = createSignal(false);
|
|
1144
|
+
|
|
1145
|
+
<Button onClick={() => setOpen(true)}>Open</Button>
|
|
1146
|
+
<Dialog
|
|
1147
|
+
title="Dialog Title"
|
|
1148
|
+
open={open()}
|
|
1149
|
+
onOpenChange={setOpen}
|
|
1150
|
+
closeOnBackdrop
|
|
1151
|
+
widthPx={600}
|
|
1152
|
+
>
|
|
1153
|
+
<div class="p-4">
|
|
1154
|
+
Dialog content
|
|
1155
|
+
</div>
|
|
1156
|
+
</Dialog>
|
|
1157
|
+
|
|
1158
|
+
// Floating mode (no backdrop)
|
|
1159
|
+
<Dialog
|
|
1160
|
+
title="Notification"
|
|
1161
|
+
open={open()}
|
|
1162
|
+
onOpenChange={setOpen}
|
|
1163
|
+
float
|
|
1164
|
+
position="bottom-right"
|
|
1165
|
+
>
|
|
1166
|
+
<div class="p-4">Floating dialog</div>
|
|
1167
|
+
</Dialog>
|
|
1168
|
+
```
|
|
1169
|
+
|
|
1170
|
+
| Prop | Type | Default | Description |
|
|
1171
|
+
|------|------|---------|-------------|
|
|
1172
|
+
| `open` | `boolean` | - | Open state |
|
|
1173
|
+
| `onOpenChange` | `(open: boolean) => void` | - | State change callback |
|
|
1174
|
+
| `title` | `string` | **(required)** | Modal title |
|
|
1175
|
+
| `hideHeader` | `boolean` | - | Hide header |
|
|
1176
|
+
| `closable` | `boolean` | `true` | Show close button |
|
|
1177
|
+
| `closeOnBackdrop` | `boolean` | - | Close on backdrop click |
|
|
1178
|
+
| `closeOnEscape` | `boolean` | `true` | Close on Escape key |
|
|
1179
|
+
| `resizable` | `boolean` | `false` | Resizable |
|
|
1180
|
+
| `movable` | `boolean` | `true` | Draggable |
|
|
1181
|
+
| `float` | `boolean` | - | Floating mode (no backdrop) |
|
|
1182
|
+
| `fill` | `boolean` | - | Fullscreen mode |
|
|
1183
|
+
| `widthPx` | `number` | - | Width (px) |
|
|
1184
|
+
| `heightPx` | `number` | - | Height (px) |
|
|
1185
|
+
| `minWidthPx` | `number` | - | Minimum width (px) |
|
|
1186
|
+
| `minHeightPx` | `number` | - | Minimum height (px) |
|
|
1187
|
+
| `position` | `"bottom-right" \| "top-right"` | - | Fixed position |
|
|
1188
|
+
| `headerAction` | `JSX.Element` | - | Header action area |
|
|
1189
|
+
| `canDeactivate` | `() => boolean` | - | Pre-close confirmation function |
|
|
1190
|
+
| `onCloseComplete` | `() => void` | - | Post-close animation callback |
|
|
1191
|
+
|
|
1192
|
+
---
|
|
1193
|
+
|
|
1194
|
+
### Feedback
|
|
1195
|
+
|
|
1196
|
+
#### Notification
|
|
1197
|
+
|
|
1198
|
+
Notification system. Wrap with `NotificationProvider` and trigger notifications using the `useNotification` hook.
|
|
1199
|
+
|
|
1200
|
+
```tsx
|
|
1201
|
+
import {
|
|
1202
|
+
NotificationProvider,
|
|
1203
|
+
NotificationBanner,
|
|
1204
|
+
NotificationBell,
|
|
1205
|
+
useNotification,
|
|
1206
|
+
} from "@simplysm/solid";
|
|
1207
|
+
|
|
1208
|
+
// Set up Provider at app root
|
|
1209
|
+
<NotificationProvider>
|
|
1210
|
+
<NotificationBanner />
|
|
1211
|
+
<header>
|
|
1212
|
+
<NotificationBell />
|
|
1213
|
+
</header>
|
|
1214
|
+
<MyApp />
|
|
1215
|
+
</NotificationProvider>
|
|
1216
|
+
|
|
1217
|
+
// Trigger notifications within components
|
|
1218
|
+
function MyComponent() {
|
|
1219
|
+
const notification = useNotification();
|
|
1220
|
+
|
|
1221
|
+
const handleSave = () => {
|
|
1222
|
+
notification.success("Success", "Saved successfully.");
|
|
1223
|
+
};
|
|
1224
|
+
|
|
1225
|
+
const handleError = () => {
|
|
1226
|
+
notification.danger("Error", "An issue occurred.", {
|
|
1227
|
+
action: { label: "Retry", onClick: handleRetry },
|
|
1228
|
+
});
|
|
1229
|
+
};
|
|
1230
|
+
|
|
1231
|
+
return <Button onClick={handleSave}>Save</Button>;
|
|
1232
|
+
}
|
|
1233
|
+
```
|
|
1234
|
+
|
|
1235
|
+
**useNotification API:**
|
|
1236
|
+
|
|
1237
|
+
| Method | Signature | Description |
|
|
1238
|
+
|--------|-----------|-------------|
|
|
1239
|
+
| `info` | `(title: string, message?: string, options?: NotificationOptions) => string` | Info notification |
|
|
1240
|
+
| `success` | `(title: string, message?: string, options?: NotificationOptions) => string` | Success notification |
|
|
1241
|
+
| `warning` | `(title: string, message?: string, options?: NotificationOptions) => string` | Warning notification |
|
|
1242
|
+
| `danger` | `(title: string, message?: string, options?: NotificationOptions) => string` | Error notification |
|
|
1243
|
+
| `update` | `(id: string, updates: Partial<NotificationItem>, options?: { renotify?: boolean }) => void` | Update notification |
|
|
1244
|
+
| `remove` | `(id: string) => void` | Remove notification |
|
|
1245
|
+
| `markAsRead` | `(id: string) => void` | Mark as read |
|
|
1246
|
+
| `markAllAsRead` | `() => void` | Mark all as read |
|
|
1247
|
+
| `dismissBanner` | `() => void` | Dismiss banner |
|
|
1248
|
+
| `clear` | `() => void` | Clear all |
|
|
1249
|
+
|
|
1250
|
+
**Components:**
|
|
1251
|
+
- `NotificationProvider` -- Notification state management Provider
|
|
1252
|
+
- `NotificationBanner` -- Top-of-screen notification banner
|
|
1253
|
+
- `NotificationBell` -- Notification bell icon (shows unread count)
|
|
1254
|
+
|
|
1255
|
+
---
|
|
1256
|
+
|
|
1257
|
+
#### Loading
|
|
1258
|
+
|
|
1259
|
+
Loading overlay system. Wrap with `LoadingProvider` and control loading state using the `useLoading` hook.
|
|
1260
|
+
|
|
1261
|
+
```tsx
|
|
1262
|
+
import {
|
|
1263
|
+
LoadingProvider,
|
|
1264
|
+
LoadingContainer,
|
|
1265
|
+
useLoading,
|
|
1266
|
+
} from "@simplysm/solid";
|
|
1267
|
+
|
|
1268
|
+
// Set up Provider at app root
|
|
1269
|
+
<LoadingProvider>
|
|
1270
|
+
<LoadingContainer />
|
|
1271
|
+
<MyApp />
|
|
1272
|
+
</LoadingProvider>
|
|
1273
|
+
|
|
1274
|
+
// Control loading within components
|
|
1275
|
+
function MyComponent() {
|
|
1276
|
+
const loading = useLoading();
|
|
1277
|
+
|
|
1278
|
+
const fetchData = async () => {
|
|
1279
|
+
loading.show("Loading data...");
|
|
1280
|
+
try {
|
|
1281
|
+
await fetch("/api/data");
|
|
1282
|
+
} finally {
|
|
1283
|
+
loading.hide();
|
|
1284
|
+
}
|
|
1285
|
+
};
|
|
1286
|
+
|
|
1287
|
+
return <Button onClick={fetchData}>Load Data</Button>;
|
|
1288
|
+
}
|
|
1289
|
+
```
|
|
1290
|
+
|
|
1291
|
+
**useLoading API:**
|
|
1292
|
+
|
|
1293
|
+
| Method | Signature | Description |
|
|
1294
|
+
|--------|-----------|-------------|
|
|
1295
|
+
| `show` | `(message?: string) => void` | Show loading |
|
|
1296
|
+
| `hide` | `() => void` | Hide loading |
|
|
1297
|
+
| `setProgress` | `(percent: number \| undefined) => void` | Set progress |
|
|
1298
|
+
|
|
1299
|
+
---
|
|
1300
|
+
|
|
1301
|
+
### Print
|
|
1302
|
+
|
|
1303
|
+
#### Print / usePrint
|
|
1304
|
+
|
|
1305
|
+
Browser printing and PDF generation. Requires `LoadingProvider`.
|
|
1306
|
+
|
|
1307
|
+
```tsx
|
|
1308
|
+
import { Print, usePrint } from "@simplysm/solid";
|
|
1309
|
+
|
|
1310
|
+
function MyComponent() {
|
|
1311
|
+
const { toPrinter, toPdf } = usePrint();
|
|
1312
|
+
|
|
1313
|
+
const handlePrint = async () => {
|
|
1314
|
+
await toPrinter(
|
|
1315
|
+
() => (
|
|
1316
|
+
<Print>
|
|
1317
|
+
<Print.Page>
|
|
1318
|
+
<h1>Print content</h1>
|
|
1319
|
+
<p>Page 1</p>
|
|
1320
|
+
</Print.Page>
|
|
1321
|
+
<Print.Page>
|
|
1322
|
+
<p>Page 2</p>
|
|
1323
|
+
</Print.Page>
|
|
1324
|
+
</Print>
|
|
1325
|
+
),
|
|
1326
|
+
{ size: "A4", margin: "10mm" },
|
|
1327
|
+
);
|
|
1328
|
+
};
|
|
1329
|
+
|
|
1330
|
+
const handlePdf = async () => {
|
|
1331
|
+
const pdfData = await toPdf(
|
|
1332
|
+
() => (
|
|
1333
|
+
<Print>
|
|
1334
|
+
<Print.Page>
|
|
1335
|
+
<h1>PDF content</h1>
|
|
1336
|
+
</Print.Page>
|
|
1337
|
+
</Print>
|
|
1338
|
+
),
|
|
1339
|
+
{ size: "A4 landscape" },
|
|
1340
|
+
);
|
|
1341
|
+
// pdfData: Uint8Array
|
|
1342
|
+
};
|
|
1343
|
+
|
|
1344
|
+
return (
|
|
1345
|
+
<>
|
|
1346
|
+
<Button onClick={handlePrint}>Print</Button>
|
|
1347
|
+
<Button onClick={handlePdf}>Download PDF</Button>
|
|
1348
|
+
</>
|
|
1349
|
+
);
|
|
1350
|
+
}
|
|
1351
|
+
```
|
|
1352
|
+
|
|
1353
|
+
**usePrint API:**
|
|
1354
|
+
|
|
1355
|
+
| Method | Signature | Description |
|
|
1356
|
+
|--------|-----------|-------------|
|
|
1357
|
+
| `toPrinter` | `(factory: () => JSX.Element, options?: PrintOptions) => Promise<void>` | Browser print |
|
|
1358
|
+
| `toPdf` | `(factory: () => JSX.Element, options?: PrintOptions) => Promise<Uint8Array>` | PDF generation |
|
|
1359
|
+
|
|
1360
|
+
**PrintOptions:**
|
|
1361
|
+
|
|
1362
|
+
| Option | Type | Default | Description |
|
|
1363
|
+
|--------|------|---------|-------------|
|
|
1364
|
+
| `size` | `string` | `"A4"` | Paper size (`"A4"`, `"A3"`, `"A4 landscape"`, `"210mm 297mm"`, etc.) |
|
|
1365
|
+
| `margin` | `string` | `"0"` | Margins (`"10mm"`, `"1cm"`, etc.) |
|
|
1366
|
+
|
|
1367
|
+
**Sub-components:**
|
|
1368
|
+
- `Print.Page` -- Explicit page breaks (auto-breaks if not used)
|
|
1369
|
+
|
|
1370
|
+
---
|
|
1371
|
+
|
|
1372
|
+
## Context & Hooks
|
|
1373
|
+
|
|
1374
|
+
### useTheme
|
|
1375
|
+
|
|
1376
|
+
Hook to access theme (dark/light/system) state. Must be used inside `ThemeProvider`.
|
|
1377
|
+
|
|
1378
|
+
```tsx
|
|
1379
|
+
import { useTheme } from "@simplysm/solid";
|
|
1380
|
+
|
|
1381
|
+
const theme = useTheme();
|
|
1382
|
+
theme.mode(); // "light" | "dark" | "system"
|
|
1383
|
+
theme.resolvedTheme(); // "light" | "dark" (follows OS setting when system)
|
|
1384
|
+
theme.setMode("dark");
|
|
1385
|
+
theme.cycleMode(); // light -> system -> dark -> light
|
|
1386
|
+
```
|
|
1387
|
+
|
|
1388
|
+
| Property/Method | Type | Description |
|
|
1389
|
+
|-----------------|------|-------------|
|
|
1390
|
+
| `mode` | `() => ThemeMode` | Current theme mode |
|
|
1391
|
+
| `resolvedTheme` | `() => ResolvedTheme` | Actual applied theme |
|
|
1392
|
+
| `setMode` | `(mode: ThemeMode) => void` | Set theme mode |
|
|
1393
|
+
| `cycleMode` | `() => void` | Cycle to next mode |
|
|
1394
|
+
|
|
1395
|
+
---
|
|
1396
|
+
|
|
1397
|
+
### usePersisted
|
|
1398
|
+
|
|
1399
|
+
localStorage-based persistent signal. Must be used inside `ConfigContext`, and keys are automatically stored as `{clientName}.{key}`. Supports serialization of `@simplysm/core-common` custom types like `DateTime`, `DateOnly`.
|
|
1400
|
+
|
|
1401
|
+
```tsx
|
|
1402
|
+
import { usePersisted } from "@simplysm/solid";
|
|
1403
|
+
|
|
1404
|
+
const [value, setValue] = usePersisted("settings.view", "grid");
|
|
1405
|
+
|
|
1406
|
+
// loading state (for async storage)
|
|
1407
|
+
const [data, setData, loading] = usePersisted("cache.data", defaultData);
|
|
1408
|
+
```
|
|
1409
|
+
|
|
1410
|
+
| Return value | Type | Description |
|
|
1411
|
+
|--------------|------|-------------|
|
|
1412
|
+
| `[0]` | `Accessor<T>` | Value getter |
|
|
1413
|
+
| `[1]` | `Setter<T>` | Value setter |
|
|
1414
|
+
| `[2]` | `Accessor<boolean>` | Loading state (async storage only) |
|
|
1415
|
+
|
|
1416
|
+
---
|
|
1417
|
+
|
|
1418
|
+
### useNotification
|
|
1419
|
+
|
|
1420
|
+
Hook to access notification system. Must be used inside `NotificationProvider`. See [Notification](#notification) section for detailed API.
|
|
1421
|
+
|
|
1422
|
+
---
|
|
1423
|
+
|
|
1424
|
+
### useLoading
|
|
1425
|
+
|
|
1426
|
+
Hook to access loading overlay. Must be used inside `LoadingProvider`. See [Loading](#loading) section for detailed API.
|
|
1427
|
+
|
|
1428
|
+
---
|
|
1429
|
+
|
|
1430
|
+
### usePrint
|
|
1431
|
+
|
|
1432
|
+
Hook for printing and PDF generation. Must be used inside `LoadingProvider`. See [Print](#print--useprint) section for detailed API.
|
|
1433
|
+
|
|
1434
|
+
---
|
|
1435
|
+
|
|
1436
|
+
### useConfig
|
|
1437
|
+
|
|
1438
|
+
Hook to access app-wide configuration. Must be used inside `ConfigContext.Provider` or `InitializeProvider`.
|
|
1439
|
+
|
|
1440
|
+
```tsx
|
|
1441
|
+
import { useConfig } from "@simplysm/solid";
|
|
1442
|
+
|
|
1443
|
+
const config = useConfig();
|
|
1444
|
+
console.log(config.clientName); // "my-app"
|
|
1445
|
+
```
|
|
1446
|
+
|
|
1447
|
+
---
|
|
1448
|
+
|
|
1449
|
+
### createControllableSignal
|
|
1450
|
+
|
|
1451
|
+
Signal hook that automatically handles Controlled/Uncontrolled patterns. Operates in controlled mode when `onChange` is provided, uncontrolled mode otherwise.
|
|
1452
|
+
|
|
1453
|
+
```tsx
|
|
1454
|
+
import { createControllableSignal } from "@simplysm/solid";
|
|
1455
|
+
|
|
1456
|
+
// Use inside components
|
|
1457
|
+
const [value, setValue] = createControllableSignal({
|
|
1458
|
+
value: () => props.value ?? "",
|
|
1459
|
+
onChange: () => props.onValueChange,
|
|
1460
|
+
});
|
|
1461
|
+
|
|
1462
|
+
// Supports functional setter
|
|
1463
|
+
setValue((prev) => prev + "!");
|
|
1464
|
+
```
|
|
1465
|
+
|
|
1466
|
+
---
|
|
1467
|
+
|
|
1468
|
+
### createMountTransition
|
|
1469
|
+
|
|
1470
|
+
Mount transition hook for open/close CSS animations. Control DOM rendering with `mounted()` and toggle CSS classes with `animating()`.
|
|
1471
|
+
|
|
1472
|
+
```tsx
|
|
1473
|
+
import { createMountTransition } from "@simplysm/solid";
|
|
1474
|
+
|
|
1475
|
+
const { mounted, animating, unmount } = createMountTransition(() => open());
|
|
1476
|
+
```
|
|
1477
|
+
|
|
1478
|
+
| Return value | Type | Description |
|
|
1479
|
+
|--------------|------|-------------|
|
|
1480
|
+
| `mounted` | `() => boolean` | Whether mounted in DOM |
|
|
1481
|
+
| `animating` | `() => boolean` | Animation active state |
|
|
1482
|
+
| `unmount` | `() => void` | Manual unmount |
|
|
1483
|
+
|
|
1484
|
+
---
|
|
1485
|
+
|
|
1486
|
+
### createIMEHandler
|
|
1487
|
+
|
|
1488
|
+
Hook that delays `onValueChange` calls during IME (Korean, etc.) composition to prevent interrupted input.
|
|
1489
|
+
|
|
1490
|
+
---
|
|
1491
|
+
|
|
1492
|
+
### useRouterLink
|
|
1493
|
+
|
|
1494
|
+
`@solidjs/router`-based navigation hook. Automatically handles Ctrl/Alt + click (new tab), Shift + click (new window).
|
|
1495
|
+
|
|
1496
|
+
```tsx
|
|
1497
|
+
import { useRouterLink } from "@simplysm/solid";
|
|
1498
|
+
|
|
1499
|
+
const navigate = useRouterLink();
|
|
1500
|
+
|
|
1501
|
+
<List.Item onClick={navigate({ href: "/home/dashboard" })}>
|
|
1502
|
+
Dashboard
|
|
1503
|
+
</List.Item>
|
|
1504
|
+
|
|
1505
|
+
// Pass state
|
|
1506
|
+
<List.Item onClick={navigate({ href: "/users/123", state: { from: "list" } })}>
|
|
1507
|
+
User
|
|
1508
|
+
</List.Item>
|
|
1509
|
+
```
|
|
1510
|
+
|
|
1511
|
+
---
|
|
1512
|
+
|
|
1513
|
+
### createAppStructure
|
|
1514
|
+
|
|
1515
|
+
Utility for declaratively defining app structure (routing, menus, permissions).
|
|
1516
|
+
|
|
1517
|
+
```tsx
|
|
1518
|
+
import { createAppStructure, type AppStructureItem } from "@simplysm/solid";
|
|
1519
|
+
|
|
1520
|
+
const items: AppStructureItem<string>[] = [
|
|
1521
|
+
{
|
|
1522
|
+
code: "home",
|
|
1523
|
+
title: "Home",
|
|
1524
|
+
component: HomePage,
|
|
1525
|
+
perms: ["use"],
|
|
1526
|
+
},
|
|
1527
|
+
{
|
|
1528
|
+
code: "admin",
|
|
1529
|
+
title: "Admin",
|
|
1530
|
+
children: [
|
|
1531
|
+
{ code: "users", title: "User Management", component: UsersPage, perms: ["use", "edit"] },
|
|
1532
|
+
],
|
|
1533
|
+
},
|
|
1534
|
+
];
|
|
1535
|
+
|
|
1536
|
+
const structure = createAppStructure(items, {
|
|
1537
|
+
modules: () => activeModules(),
|
|
1538
|
+
basePath: "/app",
|
|
1539
|
+
});
|
|
1540
|
+
|
|
1541
|
+
// structure.routes -- Route array (pass to Route component)
|
|
1542
|
+
// structure.usableMenus() -- Sidebar menu array
|
|
1543
|
+
// structure.permRecord() -- Permission record (Record<string, boolean>)
|
|
1544
|
+
```
|
|
1545
|
+
|
|
1546
|
+
---
|
|
1547
|
+
|
|
1548
|
+
## Directives
|
|
1549
|
+
|
|
1550
|
+
### ripple
|
|
1551
|
+
|
|
1552
|
+
Material Design ripple effect directive. Displays ripple effect on click.
|
|
1553
|
+
|
|
1554
|
+
```tsx
|
|
1555
|
+
import { ripple } from "@simplysm/solid";
|
|
1556
|
+
// Keep reference to register directive
|
|
1557
|
+
void ripple;
|
|
1558
|
+
|
|
1559
|
+
<button use:ripple={true}>Click</button>
|
|
1560
|
+
<button use:ripple={!props.disabled}>Conditional activation</button>
|
|
1561
|
+
```
|
|
1562
|
+
|
|
1563
|
+
- Creates internal ripple container, operates without affecting parent element
|
|
1564
|
+
- Automatically disabled when `prefers-reduced-motion: reduce` is set
|
|
1565
|
+
- Single ripple mode: removes previous ripple on new click
|
|
1566
|
+
|
|
1567
|
+
---
|
|
1568
|
+
|
|
1569
|
+
## Tailwind Theme
|
|
1570
|
+
|
|
1571
|
+
`@simplysm/solid` provides the following custom themes via Tailwind CSS preset.
|
|
1572
|
+
|
|
1573
|
+
### Semantic Colors
|
|
1574
|
+
|
|
1575
|
+
| Name | Base Color | Usage |
|
|
1576
|
+
|------|------------|-------|
|
|
1577
|
+
| `primary` | blue | Primary actions |
|
|
1578
|
+
| `info` | sky | Information |
|
|
1579
|
+
| `success` | green | Success |
|
|
1580
|
+
| `warning` | amber | Warning |
|
|
1581
|
+
| `danger` | red | Danger/error |
|
|
1582
|
+
| `base` | zinc | Neutral (backgrounds, borders, secondary text, etc.) |
|
|
1583
|
+
|
|
1584
|
+
> Use `base-*` instead of directly using `zinc-*`.
|
|
1585
|
+
|
|
1586
|
+
### Custom Sizes
|
|
1587
|
+
|
|
1588
|
+
| Class | Description |
|
|
1589
|
+
|-------|-------------|
|
|
1590
|
+
| `h-field` / `size-field` | Default field height (based on `py-1`) |
|
|
1591
|
+
| `h-field-sm` / `size-field-sm` | Small field height (based on `py-0.5`) |
|
|
1592
|
+
| `h-field-lg` / `size-field-lg` | Large field height (based on `py-2`) |
|
|
1593
|
+
| `h-field-inset` / `size-field-inset` | Inset field height (excludes border) |
|
|
1594
|
+
| `h-field-inset-sm` / `size-field-inset-sm` | Small inset field height |
|
|
1595
|
+
| `h-field-inset-lg` / `size-field-inset-lg` | Large inset field height |
|
|
1596
|
+
|
|
1597
|
+
### z-index Layers
|
|
1598
|
+
|
|
1599
|
+
| Class | Value | Description |
|
|
1600
|
+
|-------|-------|-------------|
|
|
1601
|
+
| `z-sidebar` | 100 | Sidebar |
|
|
1602
|
+
| `z-sidebar-backdrop` | 99 | Sidebar backdrop |
|
|
1603
|
+
| `z-busy` | 500 | Loading overlay |
|
|
1604
|
+
| `z-dropdown` | 1000 | Dropdown popup |
|
|
1605
|
+
| `z-modal-backdrop` | 1999 | Modal backdrop |
|
|
1606
|
+
| `z-modal` | 2000 | Modal dialog |
|
|
1607
|
+
|
|
1608
|
+
### Dark Mode
|
|
1609
|
+
|
|
1610
|
+
Uses Tailwind's `class` strategy. `ThemeProvider` automatically toggles the `dark` class on the `<html>` element.
|
|
1611
|
+
|
|
1612
|
+
```html
|
|
1613
|
+
<!-- Light mode -->
|
|
1614
|
+
<html>
|
|
1615
|
+
<!-- Dark mode -->
|
|
1616
|
+
<html class="dark">
|
|
1617
|
+
```
|
|
1618
|
+
|
|
1619
|
+
### Styling Patterns
|
|
1620
|
+
|
|
1621
|
+
When using Tailwind classes in components, group them by semantic units with `clsx` and resolve conflicts with `twMerge`:
|
|
1622
|
+
|
|
1623
|
+
```typescript
|
|
1624
|
+
import clsx from "clsx";
|
|
1625
|
+
import { twMerge } from "tailwind-merge";
|
|
1626
|
+
|
|
1627
|
+
const baseClass = clsx(
|
|
1628
|
+
"inline-flex items-center",
|
|
1629
|
+
"px-2 py-1",
|
|
1630
|
+
"rounded",
|
|
1631
|
+
"border border-transparent",
|
|
1632
|
+
);
|
|
1633
|
+
|
|
1634
|
+
const className = twMerge(baseClass, props.class);
|
|
1635
|
+
```
|
|
1636
|
+
|
|
1637
|
+
---
|
|
1638
|
+
|
|
1639
|
+
## Demo
|
|
1640
|
+
|
|
1641
|
+
Check out real-world usage examples of all components in the `solid-demo` package:
|
|
1642
|
+
|
|
1643
|
+
```bash
|
|
1644
|
+
pnpm dev
|
|
1645
|
+
# http://localhost:40081 (port may vary)
|
|
1646
|
+
```
|
|
1647
|
+
|
|
1648
|
+
---
|
|
1649
|
+
|
|
1650
|
+
## License
|
|
1651
|
+
|
|
1652
|
+
Apache-2.0
|