@simplysm/solid 13.0.77 → 13.0.80
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +23 -217
- package/dist/components/data/Pagination.js +2 -2
- package/dist/components/data/Pagination.js.map +2 -2
- package/dist/components/data/Table.js +2 -2
- package/dist/components/data/Table.js.map +2 -2
- package/dist/components/data/calendar/Calendar.js +2 -2
- package/dist/components/data/calendar/Calendar.js.map +2 -2
- package/dist/components/data/kanban/Kanban.js +3 -3
- package/dist/components/data/kanban/Kanban.js.map +2 -2
- package/dist/components/data/list/ListItem.js +1 -1
- package/dist/components/data/list/ListItem.js.map +1 -1
- package/dist/components/data/list/ListItem.styles.js +1 -1
- package/dist/components/data/list/ListItem.styles.js.map +1 -1
- package/dist/components/data/sheet/DataSheet.js +16 -16
- package/dist/components/data/sheet/DataSheet.js.map +2 -2
- package/dist/components/data/sheet/DataSheet.styles.d.ts.map +1 -1
- package/dist/components/data/sheet/DataSheet.styles.js +2 -2
- package/dist/components/data/sheet/DataSheet.styles.js.map +1 -1
- package/dist/components/data/sheet/DataSheetConfigDialog.js +5 -5
- package/dist/components/data/sheet/DataSheetConfigDialog.js.map +2 -2
- package/dist/components/data/sheet/hooks/{useDataSheetExpansion.d.ts → createDataSheetExpansion.d.ts} +4 -4
- package/dist/components/data/sheet/hooks/createDataSheetExpansion.d.ts.map +1 -0
- package/dist/components/data/sheet/hooks/{useDataSheetExpansion.js → createDataSheetExpansion.js} +3 -3
- package/dist/components/data/sheet/hooks/{useDataSheetExpansion.js.map → createDataSheetExpansion.js.map} +2 -2
- package/dist/components/data/sheet/hooks/{useDataSheetFixedColumns.d.ts → createDataSheetFixedColumns.d.ts} +3 -3
- package/dist/components/data/sheet/hooks/createDataSheetFixedColumns.d.ts.map +1 -0
- package/dist/components/data/sheet/hooks/{useDataSheetFixedColumns.js → createDataSheetFixedColumns.js} +3 -3
- package/dist/components/data/sheet/hooks/{useDataSheetFixedColumns.js.map → createDataSheetFixedColumns.js.map} +2 -2
- package/dist/components/data/sheet/hooks/{useDataSheetHeaderCell.d.ts → createDataSheetHeaderCell.d.ts} +3 -3
- package/dist/components/data/sheet/hooks/createDataSheetHeaderCell.d.ts.map +1 -0
- package/dist/components/data/sheet/hooks/{useDataSheetHeaderCell.js → createDataSheetHeaderCell.js} +3 -3
- package/dist/components/data/sheet/hooks/{useDataSheetHeaderCell.js.map → createDataSheetHeaderCell.js.map} +3 -3
- package/dist/components/data/sheet/hooks/{useDataSheetPaging.d.ts → createDataSheetPaging.d.ts} +4 -4
- package/dist/components/data/sheet/hooks/createDataSheetPaging.d.ts.map +1 -0
- package/dist/components/data/sheet/hooks/{useDataSheetPaging.js → createDataSheetPaging.js} +3 -3
- package/dist/components/data/sheet/hooks/{useDataSheetPaging.js.map → createDataSheetPaging.js.map} +2 -2
- package/dist/components/data/sheet/hooks/{useDataSheetReorder.d.ts → createDataSheetReorder.d.ts} +3 -3
- package/dist/components/data/sheet/hooks/createDataSheetReorder.d.ts.map +1 -0
- package/dist/components/data/sheet/hooks/{useDataSheetReorder.js → createDataSheetReorder.js} +3 -3
- package/dist/components/data/sheet/hooks/{useDataSheetReorder.js.map → createDataSheetReorder.js.map} +2 -2
- package/dist/components/data/sheet/hooks/{useDataSheetSelection.d.ts → createDataSheetSelection.d.ts} +4 -4
- package/dist/components/data/sheet/hooks/createDataSheetSelection.d.ts.map +1 -0
- package/dist/components/data/sheet/hooks/{useDataSheetSelection.js → createDataSheetSelection.js} +3 -3
- package/dist/components/data/sheet/hooks/{useDataSheetSelection.js.map → createDataSheetSelection.js.map} +2 -2
- package/dist/components/data/sheet/hooks/{useDataSheetSorting.d.ts → createDataSheetSorting.d.ts} +4 -4
- package/dist/components/data/sheet/hooks/createDataSheetSorting.d.ts.map +1 -0
- package/dist/components/data/sheet/hooks/{useDataSheetSorting.js → createDataSheetSorting.js} +3 -3
- package/dist/components/data/sheet/hooks/{useDataSheetSorting.js.map → createDataSheetSorting.js.map} +2 -2
- package/dist/components/disclosure/Dialog.d.ts +2 -2
- package/dist/components/disclosure/Dialog.d.ts.map +1 -1
- package/dist/components/disclosure/Dialog.js +4 -4
- package/dist/components/disclosure/Dialog.js.map +2 -2
- package/dist/components/disclosure/Tabs.js +3 -3
- package/dist/components/disclosure/Tabs.js.map +2 -2
- package/dist/components/features/crud-sheet/CrudSheet.js +3 -3
- package/dist/components/features/crud-sheet/CrudSheet.js.map +2 -2
- package/dist/components/features/data-select-button/DataSelectButton.d.ts +23 -9
- package/dist/components/features/data-select-button/DataSelectButton.d.ts.map +1 -1
- package/dist/components/features/data-select-button/DataSelectButton.js +1 -1
- package/dist/components/features/data-select-button/DataSelectButton.js.map +1 -1
- package/dist/components/features/permission-table/PermissionTable.js +2 -2
- package/dist/components/features/permission-table/PermissionTable.js.map +2 -2
- package/dist/components/features/shared-data/SharedDataSelect.d.ts +23 -9
- package/dist/components/features/shared-data/SharedDataSelect.d.ts.map +1 -1
- package/dist/components/features/shared-data/SharedDataSelect.js.map +1 -1
- package/dist/components/features/shared-data/SharedDataSelectButton.d.ts +25 -10
- package/dist/components/features/shared-data/SharedDataSelectButton.d.ts.map +1 -1
- package/dist/components/features/shared-data/SharedDataSelectButton.js.map +1 -1
- package/dist/components/features/shared-data/SharedDataSelectList.js +1 -1
- package/dist/components/features/shared-data/SharedDataSelectList.js.map +2 -2
- package/dist/components/feedback/Progress.d.ts +1 -1
- package/dist/components/feedback/Progress.d.ts.map +1 -1
- package/dist/components/feedback/Progress.js +3 -3
- package/dist/components/feedback/Progress.js.map +2 -2
- package/dist/components/form-control/Button.js +2 -2
- package/dist/components/form-control/Button.js.map +2 -2
- package/dist/components/form-control/DropdownTrigger.styles.js +2 -2
- package/dist/components/form-control/DropdownTrigger.styles.js.map +1 -1
- package/dist/components/form-control/ThemeToggle.js +4 -4
- package/dist/components/form-control/ThemeToggle.js.map +2 -2
- package/dist/components/form-control/checkbox/Checkbox.d.ts +3 -3
- package/dist/components/form-control/checkbox/Checkbox.d.ts.map +1 -1
- package/dist/components/form-control/checkbox/Checkbox.styles.d.ts.map +1 -1
- package/dist/components/form-control/checkbox/Checkbox.styles.js +3 -3
- package/dist/components/form-control/checkbox/Checkbox.styles.js.map +1 -1
- package/dist/components/form-control/checkbox/CheckboxGroup.js +2 -2
- package/dist/components/form-control/checkbox/CheckboxGroup.js.map +2 -2
- package/dist/components/form-control/checkbox/Radio.d.ts +3 -3
- package/dist/components/form-control/checkbox/Radio.d.ts.map +1 -1
- package/dist/components/form-control/checkbox/RadioGroup.js +2 -2
- package/dist/components/form-control/checkbox/RadioGroup.js.map +2 -2
- package/dist/components/form-control/checkbox/SelectableBase.d.ts +3 -3
- package/dist/components/form-control/checkbox/SelectableBase.d.ts.map +1 -1
- package/dist/components/form-control/checkbox/SelectableBase.js +10 -10
- package/dist/components/form-control/checkbox/SelectableBase.js.map +2 -2
- package/dist/components/form-control/color-picker/ColorPicker.js +2 -2
- package/dist/components/form-control/color-picker/ColorPicker.js.map +2 -2
- package/dist/components/form-control/date-range-picker/DateRangePicker.js +1 -1
- package/dist/components/form-control/date-range-picker/DateRangePicker.js.map +2 -2
- package/dist/components/form-control/editor/EditorToolbar.js +1 -1
- package/dist/components/form-control/editor/EditorToolbar.js.map +2 -2
- package/dist/components/form-control/editor/RichTextEditor.js +2 -2
- package/dist/components/form-control/editor/RichTextEditor.js.map +2 -2
- package/dist/components/form-control/field/Field.styles.js +7 -7
- package/dist/components/form-control/field/Field.styles.js.map +1 -1
- package/dist/components/form-control/field/NumberInput.js +1 -1
- package/dist/components/form-control/field/NumberInput.js.map +1 -1
- package/dist/components/form-control/field/TextInput.js +1 -1
- package/dist/components/form-control/field/TextInput.js.map +1 -1
- package/dist/components/form-control/field/Textarea.js +1 -1
- package/dist/components/form-control/field/Textarea.js.map +1 -1
- package/dist/components/form-control/numpad/Numpad.d.ts +2 -2
- package/dist/components/form-control/numpad/Numpad.d.ts.map +1 -1
- package/dist/components/form-control/numpad/Numpad.js +4 -4
- package/dist/components/form-control/numpad/Numpad.js.map +2 -2
- package/dist/components/form-control/select/Select.js +1 -1
- package/dist/components/form-control/select/Select.js.map +2 -2
- package/dist/components/form-control/state-preset/StatePreset.js +8 -8
- package/dist/components/form-control/state-preset/StatePreset.js.map +2 -2
- package/dist/components/layout/topbar/Topbar.js +3 -3
- package/dist/components/layout/topbar/Topbar.js.map +2 -2
- package/dist/providers/PwaUpdateProvider.d.ts.map +1 -1
- package/dist/providers/PwaUpdateProvider.js +11 -4
- package/dist/providers/PwaUpdateProvider.js.map +2 -2
- package/dist/styles/control.styles.d.ts +3 -3
- package/dist/styles/control.styles.d.ts.map +1 -1
- package/dist/styles/control.styles.js +2 -2
- package/dist/styles/control.styles.js.map +1 -1
- package/docs/data.md +204 -0
- package/docs/disclosure.md +139 -0
- package/docs/display.md +125 -0
- package/docs/features.md +282 -0
- package/docs/feedback.md +136 -0
- package/docs/form-controls.md +520 -0
- package/docs/helpers.md +172 -0
- package/docs/hooks.md +146 -0
- package/docs/layout.md +94 -0
- package/docs/providers.md +179 -0
- package/package.json +19 -18
- package/src/components/data/Pagination.tsx +2 -2
- package/src/components/data/Table.tsx +2 -2
- package/src/components/data/calendar/Calendar.tsx +2 -2
- package/src/components/data/kanban/Kanban.tsx +2 -2
- package/src/components/data/list/ListItem.styles.ts +1 -1
- package/src/components/data/list/ListItem.tsx +1 -1
- package/src/components/data/sheet/DataSheet.styles.ts +2 -2
- package/src/components/data/sheet/DataSheet.tsx +16 -16
- package/src/components/data/sheet/DataSheetConfigDialog.tsx +5 -5
- package/src/components/data/sheet/hooks/{useDataSheetExpansion.ts → createDataSheetExpansion.ts} +5 -5
- package/src/components/data/sheet/hooks/{useDataSheetFixedColumns.ts → createDataSheetFixedColumns.ts} +3 -3
- package/src/components/data/sheet/hooks/{useDataSheetHeaderCell.tsx → createDataSheetHeaderCell.tsx} +2 -2
- package/src/components/data/sheet/hooks/{useDataSheetPaging.ts → createDataSheetPaging.ts} +5 -5
- package/src/components/data/sheet/hooks/{useDataSheetReorder.ts → createDataSheetReorder.ts} +3 -3
- package/src/components/data/sheet/hooks/{useDataSheetSelection.ts → createDataSheetSelection.ts} +5 -5
- package/src/components/data/sheet/hooks/{useDataSheetSorting.ts → createDataSheetSorting.ts} +5 -5
- package/src/components/disclosure/Dialog.tsx +5 -5
- package/src/components/disclosure/Tabs.tsx +3 -3
- package/src/components/features/crud-sheet/CrudSheet.tsx +3 -3
- package/src/components/features/data-select-button/DataSelectButton.tsx +42 -11
- package/src/components/features/permission-table/PermissionTable.tsx +2 -2
- package/src/components/features/shared-data/SharedDataSelect.tsx +45 -14
- package/src/components/features/shared-data/SharedDataSelectButton.tsx +38 -11
- package/src/components/features/shared-data/SharedDataSelectList.tsx +1 -1
- package/src/components/feedback/Progress.tsx +4 -4
- package/src/components/form-control/Button.tsx +2 -2
- package/src/components/form-control/DropdownTrigger.styles.ts +2 -2
- package/src/components/form-control/ThemeToggle.tsx +4 -4
- package/src/components/form-control/checkbox/Checkbox.styles.ts +3 -3
- package/src/components/form-control/checkbox/Checkbox.tsx +3 -3
- package/src/components/form-control/checkbox/CheckboxGroup.tsx +2 -2
- package/src/components/form-control/checkbox/Radio.tsx +3 -3
- package/src/components/form-control/checkbox/RadioGroup.tsx +2 -2
- package/src/components/form-control/checkbox/SelectableBase.tsx +15 -15
- package/src/components/form-control/color-picker/ColorPicker.tsx +2 -2
- package/src/components/form-control/date-range-picker/DateRangePicker.tsx +1 -1
- package/src/components/form-control/editor/EditorToolbar.tsx +1 -1
- package/src/components/form-control/editor/RichTextEditor.tsx +2 -2
- package/src/components/form-control/field/Field.styles.ts +7 -7
- package/src/components/form-control/field/NumberInput.tsx +1 -1
- package/src/components/form-control/field/TextInput.tsx +1 -1
- package/src/components/form-control/field/Textarea.tsx +1 -1
- package/src/components/form-control/numpad/Numpad.tsx +6 -6
- package/src/components/form-control/select/Select.tsx +1 -1
- package/src/components/form-control/state-preset/StatePreset.tsx +9 -9
- package/src/components/layout/topbar/Topbar.tsx +3 -3
- package/src/providers/PwaUpdateProvider.tsx +12 -5
- package/src/styles/control.styles.ts +3 -3
- package/tests/components/data/sheet/hooks/{useDataSheetExpansion.spec.ts → createDataSheetExpansion.spec.ts} +16 -16
- package/tests/components/data/sheet/hooks/{useDataSheetFixedColumns.spec.ts → createDataSheetFixedColumns.spec.ts} +27 -27
- package/tests/components/data/sheet/hooks/{useDataSheetPaging.spec.ts → createDataSheetPaging.spec.ts} +16 -16
- package/tests/components/data/sheet/hooks/{useDataSheetReorder.spec.ts → createDataSheetReorder.spec.ts} +14 -14
- package/tests/components/data/sheet/hooks/{useDataSheetSelection.spec.ts → createDataSheetSelection.spec.ts} +26 -26
- package/tests/components/data/sheet/hooks/{useDataSheetSorting.spec.ts → createDataSheetSorting.spec.ts} +13 -13
- package/tests/components/disclosure/Dialog.spec.tsx +2 -2
- package/tests/components/features/data-select-button/DataSelectButton.spec.tsx +55 -6
- package/tests/components/features/shared-data/SharedDataSelect.spec.tsx +40 -0
- package/tests/components/form-control/checkbox/Checkbox.spec.tsx +8 -8
- package/tests/components/form-control/checkbox/Radio.spec.tsx +9 -9
- package/tests/components/form-control/numpad/Numpad.spec.tsx +10 -10
- package/dist/components/data/sheet/hooks/useDataSheetExpansion.d.ts.map +0 -1
- package/dist/components/data/sheet/hooks/useDataSheetFixedColumns.d.ts.map +0 -1
- package/dist/components/data/sheet/hooks/useDataSheetHeaderCell.d.ts.map +0 -1
- package/dist/components/data/sheet/hooks/useDataSheetPaging.d.ts.map +0 -1
- package/dist/components/data/sheet/hooks/useDataSheetReorder.d.ts.map +0 -1
- package/dist/components/data/sheet/hooks/useDataSheetSelection.d.ts.map +0 -1
- package/dist/components/data/sheet/hooks/useDataSheetSorting.d.ts.map +0 -1
package/docs/hooks.md
ADDED
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
# Hooks
|
|
2
|
+
|
|
3
|
+
## useLocalStorage
|
|
4
|
+
|
|
5
|
+
```typescript
|
|
6
|
+
function useLocalStorage<TValue>(
|
|
7
|
+
key: string,
|
|
8
|
+
initialValue?: TValue,
|
|
9
|
+
): [Accessor<TValue | undefined>, StorageSetter<TValue>];
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
Reactive `localStorage` binding. Returns a signal-like tuple. Automatically serializes/deserializes values as JSON.
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## useSyncConfig
|
|
17
|
+
|
|
18
|
+
```typescript
|
|
19
|
+
function useSyncConfig<TValue>(
|
|
20
|
+
key: string,
|
|
21
|
+
defaultValue: TValue,
|
|
22
|
+
): [Accessor<TValue>, Setter<TValue>, Accessor<boolean>];
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
Persisted configuration backed by `SyncStorageProvider`. Returns `[value, setValue, ready]`. The `ready` accessor becomes `true` once the stored value has been loaded.
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
## useLogger
|
|
30
|
+
|
|
31
|
+
```typescript
|
|
32
|
+
interface Logger {
|
|
33
|
+
log(...args: unknown[]): void;
|
|
34
|
+
info(...args: unknown[]): void;
|
|
35
|
+
warn(...args: unknown[]): void;
|
|
36
|
+
error(...args: unknown[]): void;
|
|
37
|
+
configure(fn: (origin: LogAdapter) => LogAdapter): void;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function useLogger(): Logger;
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
Access the logging system from `LoggerProvider`. Supports middleware composition via `configure()`.
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
## createControllableSignal
|
|
48
|
+
|
|
49
|
+
```typescript
|
|
50
|
+
function createControllableSignal<TValue>(options: {
|
|
51
|
+
value: Accessor<TValue>;
|
|
52
|
+
onChange: Accessor<((value: TValue) => void) | undefined>;
|
|
53
|
+
}): [Accessor<TValue>, (newValue: TValue | ((prev: TValue) => TValue)) => TValue];
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
Creates a signal that supports both controlled and uncontrolled modes. When `onChange` is provided, the component is controlled; otherwise, internal state is used. This is the primitive behind all form control `value`/`onValueChange` pairs.
|
|
57
|
+
|
|
58
|
+
---
|
|
59
|
+
|
|
60
|
+
## createControllableStore
|
|
61
|
+
|
|
62
|
+
```typescript
|
|
63
|
+
function createControllableStore<TValue extends object>(options: {
|
|
64
|
+
value: () => TValue;
|
|
65
|
+
onChange: () => ((value: TValue) => void) | undefined;
|
|
66
|
+
}): [TValue, SetStoreFunction<TValue>];
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
Like `createControllableSignal` but for SolidJS stores (deep reactive objects).
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
## createIMEHandler
|
|
74
|
+
|
|
75
|
+
```typescript
|
|
76
|
+
function createIMEHandler(setValue: (value: string) => void): {
|
|
77
|
+
composingValue: Accessor<string | null>;
|
|
78
|
+
handleCompositionStart(): void;
|
|
79
|
+
handleInput(value: string, isComposing: boolean): void;
|
|
80
|
+
handleCompositionEnd(value: string): void;
|
|
81
|
+
flushComposition(): void;
|
|
82
|
+
};
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
Handles IME composition events (Korean, Chinese, Japanese input). Buffers intermediate composition states and only commits the final value. Used internally by `TextInput` and `Textarea`.
|
|
86
|
+
|
|
87
|
+
---
|
|
88
|
+
|
|
89
|
+
## createMountTransition
|
|
90
|
+
|
|
91
|
+
```typescript
|
|
92
|
+
function createMountTransition(
|
|
93
|
+
open: () => boolean,
|
|
94
|
+
): {
|
|
95
|
+
mounted: () => boolean;
|
|
96
|
+
animating: () => boolean;
|
|
97
|
+
unmount: () => void;
|
|
98
|
+
};
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
Manages mount/unmount transitions. While `open()` is true, `mounted` and `animating` are true. When `open()` becomes false, `animating` becomes false (triggering CSS transition), and `unmount()` should be called after the transition ends to set `mounted` to false.
|
|
102
|
+
|
|
103
|
+
---
|
|
104
|
+
|
|
105
|
+
## useRouterLink
|
|
106
|
+
|
|
107
|
+
```typescript
|
|
108
|
+
interface RouterLinkOptions {
|
|
109
|
+
href: string;
|
|
110
|
+
state?: Record<string, unknown>;
|
|
111
|
+
window?: { width?: number; height?: number };
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
function useRouterLink(): (options: RouterLinkOptions) => (e: MouseEvent | KeyboardEvent) => void;
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
Creates click handlers for SolidJS Router navigation. Supports opening links in new windows with specified dimensions via the `window` option.
|
|
118
|
+
|
|
119
|
+
---
|
|
120
|
+
|
|
121
|
+
## Usage Examples
|
|
122
|
+
|
|
123
|
+
```typescript
|
|
124
|
+
import {
|
|
125
|
+
useLocalStorage,
|
|
126
|
+
useSyncConfig,
|
|
127
|
+
createControllableSignal,
|
|
128
|
+
useLogger,
|
|
129
|
+
} from "@simplysm/solid";
|
|
130
|
+
|
|
131
|
+
// Local storage
|
|
132
|
+
const [theme, setTheme] = useLocalStorage<string>("app-theme", "light");
|
|
133
|
+
|
|
134
|
+
// Sync config (persisted to SyncStorageProvider)
|
|
135
|
+
const [pageSize, setPageSize, ready] = useSyncConfig("pageSize", 20);
|
|
136
|
+
|
|
137
|
+
// Logger
|
|
138
|
+
const logger = useLogger();
|
|
139
|
+
logger.info("Application started");
|
|
140
|
+
|
|
141
|
+
// Controlled/uncontrolled primitive
|
|
142
|
+
const [value, setValue] = createControllableSignal({
|
|
143
|
+
value: () => props.value,
|
|
144
|
+
onChange: () => props.onValueChange,
|
|
145
|
+
});
|
|
146
|
+
```
|
package/docs/layout.md
ADDED
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
# Layout
|
|
2
|
+
|
|
3
|
+
## FormGroup
|
|
4
|
+
|
|
5
|
+
```typescript
|
|
6
|
+
interface FormGroupProps extends JSX.HTMLAttributes<HTMLDivElement> {
|
|
7
|
+
inline?: boolean;
|
|
8
|
+
}
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
Groups form fields vertically (default) or horizontally with `inline`.
|
|
12
|
+
|
|
13
|
+
**Sub-component:** `FormGroup.Item` — `{ label?: JSX.Element } & JSX.HTMLAttributes<HTMLDivElement>`
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## FormTable
|
|
18
|
+
|
|
19
|
+
```typescript
|
|
20
|
+
interface FormTableProps extends JSX.HTMLAttributes<HTMLTableElement> {}
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
Arranges form fields in a label-value table layout.
|
|
24
|
+
|
|
25
|
+
**Sub-components:**
|
|
26
|
+
- `FormTable.Row` — table row
|
|
27
|
+
- `FormTable.Item` — `{ label?: JSX.Element } & JSX.TdHTMLAttributes<HTMLTableCellElement>`
|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
## Sidebar
|
|
32
|
+
|
|
33
|
+
```typescript
|
|
34
|
+
interface SidebarProps extends JSX.HTMLAttributes<HTMLElement> {
|
|
35
|
+
children: JSX.Element;
|
|
36
|
+
}
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
Collapsible sidebar navigation. Must be wrapped in `Sidebar.Container`.
|
|
40
|
+
|
|
41
|
+
**Sub-components:**
|
|
42
|
+
- `Sidebar.Container` — layout wrapper that includes both sidebar and main content
|
|
43
|
+
- `Sidebar.Menu` — `{ menus: AppMenu[] }` — renders navigation tree from `AppMenu` data
|
|
44
|
+
- `Sidebar.User` — `{ name: string; icon?: Component; description?: string; menus?: SidebarUserMenu[] }` — user profile section with optional dropdown menus
|
|
45
|
+
|
|
46
|
+
**Hook:** `useSidebar()` — access sidebar state (collapsed, toggle, etc.)
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
## Topbar
|
|
51
|
+
|
|
52
|
+
```typescript
|
|
53
|
+
interface TopbarProps extends JSX.HTMLAttributes<HTMLElement> {
|
|
54
|
+
children: JSX.Element;
|
|
55
|
+
}
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
Top navigation bar. Must be wrapped in `Topbar.Container`.
|
|
59
|
+
|
|
60
|
+
**Sub-components:**
|
|
61
|
+
- `Topbar.Container` — layout wrapper
|
|
62
|
+
- `Topbar.Menu` — `{ menus: TopbarMenuItem[] }` — renders top-level navigation
|
|
63
|
+
- `Topbar.User` — `{ menus?: TopbarUserMenu[]; children: JSX.Element }` — user section with dropdown
|
|
64
|
+
|
|
65
|
+
**Hooks:**
|
|
66
|
+
- `useTopbarActionsAccessor()` — access topbar actions element
|
|
67
|
+
- `useTopbarActions(accessor)` — register topbar actions from child components
|
|
68
|
+
|
|
69
|
+
---
|
|
70
|
+
|
|
71
|
+
## Usage Examples
|
|
72
|
+
|
|
73
|
+
```typescript
|
|
74
|
+
import { Sidebar, FormGroup, FormTable } from "@simplysm/solid";
|
|
75
|
+
|
|
76
|
+
// Sidebar layout
|
|
77
|
+
<Sidebar.Container>
|
|
78
|
+
<Sidebar>
|
|
79
|
+
<Sidebar.User name="John" description="Admin" />
|
|
80
|
+
<Sidebar.Menu menus={appMenus} />
|
|
81
|
+
</Sidebar>
|
|
82
|
+
<main>Content</main>
|
|
83
|
+
</Sidebar.Container>
|
|
84
|
+
|
|
85
|
+
// Form with labeled fields
|
|
86
|
+
<FormGroup>
|
|
87
|
+
<FormGroup.Item label="Name">
|
|
88
|
+
<TextInput value={name()} onValueChange={setName} />
|
|
89
|
+
</FormGroup.Item>
|
|
90
|
+
<FormGroup.Item label="Email">
|
|
91
|
+
<TextInput value={email()} onValueChange={setEmail} type="email" />
|
|
92
|
+
</FormGroup.Item>
|
|
93
|
+
</FormGroup>
|
|
94
|
+
```
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
# Providers
|
|
2
|
+
|
|
3
|
+
## ConfigProvider
|
|
4
|
+
|
|
5
|
+
```typescript
|
|
6
|
+
export const ConfigProvider: ParentComponent<{ clientName: string }>;
|
|
7
|
+
export function useConfig(): { clientName: string };
|
|
8
|
+
```
|
|
9
|
+
|
|
10
|
+
Application-level configuration. `clientName` identifies the client app.
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## ThemeProvider
|
|
15
|
+
|
|
16
|
+
```typescript
|
|
17
|
+
type ThemeMode = "light" | "dark" | "system";
|
|
18
|
+
type ResolvedTheme = "light" | "dark";
|
|
19
|
+
|
|
20
|
+
interface ThemeContextValue {
|
|
21
|
+
mode(): ThemeMode;
|
|
22
|
+
setMode(mode: ThemeMode): void;
|
|
23
|
+
resolvedTheme(): ResolvedTheme;
|
|
24
|
+
cycleMode(): void;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export const ThemeProvider: ParentComponent;
|
|
28
|
+
export function useTheme(): ThemeContextValue;
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
Light/Dark mode management with system preference detection. `cycleMode()` rotates through light → dark → system.
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## I18nProvider
|
|
36
|
+
|
|
37
|
+
```typescript
|
|
38
|
+
interface I18nContextValue {
|
|
39
|
+
t(key: string, params?: Record<string, string>): string;
|
|
40
|
+
locale: Accessor<string>;
|
|
41
|
+
setLocale(locale: string): void;
|
|
42
|
+
configure(options: I18nConfigureOptions): void;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
interface I18nConfigureOptions {
|
|
46
|
+
locale?: string;
|
|
47
|
+
dict?: Record<string, Record<string, unknown>>;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export const I18nProvider: ParentComponent;
|
|
51
|
+
export function useI18n(): I18nContextValue;
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
Internationalization provider. Supports nested dictionary keys and parameter interpolation via `t("key", { name: "John" })`.
|
|
55
|
+
|
|
56
|
+
---
|
|
57
|
+
|
|
58
|
+
## SyncStorageProvider
|
|
59
|
+
|
|
60
|
+
```typescript
|
|
61
|
+
interface StorageAdapter {
|
|
62
|
+
getItem(key: string): string | null | Promise<string | null>;
|
|
63
|
+
setItem(key: string, value: string): void | Promise<unknown>;
|
|
64
|
+
removeItem(key: string): void | Promise<void>;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
interface SyncStorageContextValue {
|
|
68
|
+
adapter: Accessor<StorageAdapter>;
|
|
69
|
+
configure(fn: (origin: StorageAdapter) => StorageAdapter): void;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
export const SyncStorageProvider: ParentComponent;
|
|
73
|
+
export function useSyncStorage(): SyncStorageContextValue | undefined;
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
Pluggable storage adapter used by components like `StatePreset`, `DataSheet` (column config), and `useSyncConfig`. Defaults to `localStorage`. Override with `configure()` for server-backed storage.
|
|
77
|
+
|
|
78
|
+
---
|
|
79
|
+
|
|
80
|
+
## LoggerProvider
|
|
81
|
+
|
|
82
|
+
```typescript
|
|
83
|
+
interface LogAdapter {
|
|
84
|
+
write(severity: "error" | "warn" | "info" | "log", ...data: any[]): Promise<void> | void;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
interface LoggerContextValue {
|
|
88
|
+
adapter: Accessor<LogAdapter>;
|
|
89
|
+
configure(fn: (origin: LogAdapter) => LogAdapter): void;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
export const LoggerProvider: ParentComponent;
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
Configurable logging provider. Middleware pattern via `configure()`.
|
|
96
|
+
|
|
97
|
+
---
|
|
98
|
+
|
|
99
|
+
## ServiceClientProvider
|
|
100
|
+
|
|
101
|
+
```typescript
|
|
102
|
+
interface ServiceClientContextValue {
|
|
103
|
+
connect(key?: string, options?: Partial<ServiceConnectionOptions>): Promise<void>;
|
|
104
|
+
close(key?: string): Promise<void>;
|
|
105
|
+
get(key?: string): ServiceClient;
|
|
106
|
+
isConnected(key?: string): boolean;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
export const ServiceClientProvider: ParentComponent;
|
|
110
|
+
export function useServiceClient(): ServiceClientContextValue;
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
Service communication provider. Manages WebSocket connections to backend services. Multiple named connections supported via `key`.
|
|
114
|
+
|
|
115
|
+
---
|
|
116
|
+
|
|
117
|
+
## SharedDataProvider
|
|
118
|
+
|
|
119
|
+
```typescript
|
|
120
|
+
interface SharedDataDefinition<TData> {
|
|
121
|
+
serviceKey?: string;
|
|
122
|
+
fetch(changeKeys?: (string | number)[]): Promise<TData[]>;
|
|
123
|
+
getKey(item: TData): string | number;
|
|
124
|
+
orderBy: [(item: TData) => unknown, "asc" | "desc"][];
|
|
125
|
+
filter?: unknown;
|
|
126
|
+
itemSearchText?: (item: TData) => string;
|
|
127
|
+
isItemHidden?: (item: TData) => boolean;
|
|
128
|
+
getParentKey?: (item: TData) => string | number | undefined;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
interface SharedDataAccessor<TData> {
|
|
132
|
+
items: Accessor<TData[]>;
|
|
133
|
+
get(key: string | number | undefined): TData | undefined;
|
|
134
|
+
emit(changeKeys?: (string | number)[]): Promise<void>;
|
|
135
|
+
getKey(item: TData): string | number;
|
|
136
|
+
itemSearchText?: (item: TData) => string;
|
|
137
|
+
isItemHidden?: (item: TData) => boolean;
|
|
138
|
+
getParentKey?: (item: TData) => string | number | undefined;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
export const SharedDataProvider: (props: { children: JSX.Element }) => JSX.Element;
|
|
142
|
+
export function useSharedData<TSharedData>(): SharedDataValue<TSharedData>;
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
Centralized data management for shared lookup data (e.g. code tables). Data is fetched once and shared across all consumers. `emit()` triggers a re-fetch.
|
|
146
|
+
|
|
147
|
+
---
|
|
148
|
+
|
|
149
|
+
## SystemProvider
|
|
150
|
+
|
|
151
|
+
```typescript
|
|
152
|
+
export const SystemProvider: ParentComponent<{
|
|
153
|
+
clientName: string;
|
|
154
|
+
busyVariant?: BusyVariant;
|
|
155
|
+
}>;
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
Convenience provider that composes `ConfigProvider`, `SyncStorageProvider`, `LoggerProvider`, `ThemeProvider`, `I18nProvider`, `NotificationProvider`, and `BusyProvider` into a single wrapper.
|
|
159
|
+
|
|
160
|
+
---
|
|
161
|
+
|
|
162
|
+
## Usage Examples
|
|
163
|
+
|
|
164
|
+
```typescript
|
|
165
|
+
import { SystemProvider, DialogProvider, PrintProvider } from "@simplysm/solid";
|
|
166
|
+
|
|
167
|
+
// Typical app provider tree
|
|
168
|
+
<SystemProvider clientName="my-app">
|
|
169
|
+
<ServiceClientProvider>
|
|
170
|
+
<SharedDataProvider>
|
|
171
|
+
<DialogProvider>
|
|
172
|
+
<PrintProvider>
|
|
173
|
+
<App />
|
|
174
|
+
</PrintProvider>
|
|
175
|
+
</DialogProvider>
|
|
176
|
+
</SharedDataProvider>
|
|
177
|
+
</ServiceClientProvider>
|
|
178
|
+
</SystemProvider>
|
|
179
|
+
```
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@simplysm/solid",
|
|
3
|
-
"version": "13.0.
|
|
3
|
+
"version": "13.0.80",
|
|
4
4
|
"description": "Simplysm package - SolidJS library",
|
|
5
5
|
"author": "simplysm",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
"files": [
|
|
16
16
|
"dist",
|
|
17
17
|
"src",
|
|
18
|
+
"docs",
|
|
18
19
|
"tests",
|
|
19
20
|
"tailwind.config.ts",
|
|
20
21
|
"tailwind.css"
|
|
@@ -28,19 +29,19 @@
|
|
|
28
29
|
"@solid-primitives/resize-observer": "^2.1.5",
|
|
29
30
|
"@solid-primitives/storage": "^4.3.4",
|
|
30
31
|
"@solidjs/router": "^0.15.4",
|
|
31
|
-
"@tabler/icons-solidjs": "^3.
|
|
32
|
-
"@tiptap/core": "^3.20.
|
|
33
|
-
"@tiptap/extension-color": "^3.20.
|
|
34
|
-
"@tiptap/extension-highlight": "^3.20.
|
|
35
|
-
"@tiptap/extension-image": "^3.20.
|
|
36
|
-
"@tiptap/extension-table": "^3.20.
|
|
37
|
-
"@tiptap/extension-table-cell": "^3.20.
|
|
38
|
-
"@tiptap/extension-table-header": "^3.20.
|
|
39
|
-
"@tiptap/extension-table-row": "^3.20.
|
|
40
|
-
"@tiptap/extension-text-align": "^3.20.
|
|
41
|
-
"@tiptap/extension-text-style": "^3.20.
|
|
42
|
-
"@tiptap/pm": "^3.20.
|
|
43
|
-
"@tiptap/starter-kit": "^3.20.
|
|
32
|
+
"@tabler/icons-solidjs": "^3.40.0",
|
|
33
|
+
"@tiptap/core": "^3.20.1",
|
|
34
|
+
"@tiptap/extension-color": "^3.20.1",
|
|
35
|
+
"@tiptap/extension-highlight": "^3.20.1",
|
|
36
|
+
"@tiptap/extension-image": "^3.20.1",
|
|
37
|
+
"@tiptap/extension-table": "^3.20.1",
|
|
38
|
+
"@tiptap/extension-table-cell": "^3.20.1",
|
|
39
|
+
"@tiptap/extension-table-header": "^3.20.1",
|
|
40
|
+
"@tiptap/extension-table-row": "^3.20.1",
|
|
41
|
+
"@tiptap/extension-text-align": "^3.20.1",
|
|
42
|
+
"@tiptap/extension-text-style": "^3.20.1",
|
|
43
|
+
"@tiptap/pm": "^3.20.1",
|
|
44
|
+
"@tiptap/starter-kit": "^3.20.1",
|
|
44
45
|
"bwip-js": "^4.8.0",
|
|
45
46
|
"clsx": "^2.1.1",
|
|
46
47
|
"consola": "^3.4.2",
|
|
@@ -51,10 +52,10 @@
|
|
|
51
52
|
"tabbable": "^6.4.0",
|
|
52
53
|
"tailwind-merge": "^3.5.0",
|
|
53
54
|
"tailwindcss": "^3.4.19",
|
|
54
|
-
"@simplysm/core-
|
|
55
|
-
"@simplysm/
|
|
56
|
-
"@simplysm/
|
|
57
|
-
"@simplysm/service-common": "13.0.
|
|
55
|
+
"@simplysm/core-common": "13.0.80",
|
|
56
|
+
"@simplysm/core-browser": "13.0.80",
|
|
57
|
+
"@simplysm/service-client": "13.0.80",
|
|
58
|
+
"@simplysm/service-common": "13.0.80"
|
|
58
59
|
},
|
|
59
60
|
"devDependencies": {
|
|
60
61
|
"@solidjs/testing-library": "^0.8.10"
|
|
@@ -22,7 +22,7 @@ export interface PaginationProps extends JSX.HTMLAttributes<HTMLElement> {
|
|
|
22
22
|
const btnClass = clsx("border-none font-normal");
|
|
23
23
|
|
|
24
24
|
const gapClasses: Record<ComponentSize, string> = {
|
|
25
|
-
|
|
25
|
+
md: gap.md,
|
|
26
26
|
xs: gap.xs,
|
|
27
27
|
sm: gap.sm,
|
|
28
28
|
lg: gap.lg,
|
|
@@ -54,7 +54,7 @@ export const Pagination: Component<PaginationProps> = (props) => {
|
|
|
54
54
|
const hasPrev = () => (pages()[0] ?? 1) > 1;
|
|
55
55
|
const hasNext = () => (pages()[pages().length - 1] ?? 1) < local.totalPageCount;
|
|
56
56
|
|
|
57
|
-
const getClassName = () => twMerge("inline-flex items-center", gapClasses[local.size ?? "
|
|
57
|
+
const getClassName = () => twMerge("inline-flex items-center", gapClasses[local.size ?? "md"], local.class);
|
|
58
58
|
|
|
59
59
|
return (
|
|
60
60
|
<nav {...rest} data-pagination class={getClassName()}>
|
|
@@ -23,7 +23,7 @@ const TableTh: ParentComponent<JSX.ThHTMLAttributes<HTMLTableCellElement>> = (pr
|
|
|
23
23
|
return (
|
|
24
24
|
<th
|
|
25
25
|
class={twMerge(
|
|
26
|
-
clsx("border-l border-t", border.default, pad.
|
|
26
|
+
clsx("border-l border-t", border.default, pad.md, bg.muted, "text-left font-bold"),
|
|
27
27
|
ctx.inset && "first:border-l-0",
|
|
28
28
|
local.class,
|
|
29
29
|
)}
|
|
@@ -40,7 +40,7 @@ const TableTd: ParentComponent<JSX.TdHTMLAttributes<HTMLTableCellElement>> = (pr
|
|
|
40
40
|
return (
|
|
41
41
|
<td
|
|
42
42
|
class={twMerge(
|
|
43
|
-
clsx("border-l border-t", border.default, pad.
|
|
43
|
+
clsx("border-l border-t", border.default, pad.md),
|
|
44
44
|
ctx.inset && "first:border-l-0",
|
|
45
45
|
local.class,
|
|
46
46
|
)}
|
|
@@ -108,7 +108,7 @@ function CalendarBase<TValue>(props: CalendarProps<TValue>) {
|
|
|
108
108
|
class={clsx(
|
|
109
109
|
"border-l border-t",
|
|
110
110
|
border.default,
|
|
111
|
-
pad.
|
|
111
|
+
pad.md,
|
|
112
112
|
bg.muted,
|
|
113
113
|
"text-center text-sm font-bold",
|
|
114
114
|
)}
|
|
@@ -141,7 +141,7 @@ function CalendarBase<TValue>(props: CalendarProps<TValue>) {
|
|
|
141
141
|
>
|
|
142
142
|
{cell.date.day}
|
|
143
143
|
</div>
|
|
144
|
-
<div class={clsx("flex flex-col", gap.
|
|
144
|
+
<div class={clsx("flex flex-col", gap.md)}>
|
|
145
145
|
<For each={cell.items}>
|
|
146
146
|
{(entry) => local.renderItem(entry.item, entry.index)}
|
|
147
147
|
</For>
|
|
@@ -494,13 +494,13 @@ const KanbanLane: ParentComponent<KanbanLaneProps> = (props) => {
|
|
|
494
494
|
</Button>
|
|
495
495
|
</Show>
|
|
496
496
|
<Show when={hasSelectableCards()}>
|
|
497
|
-
<Checkbox
|
|
497
|
+
<Checkbox checked={isAllSelected()} onCheckedChange={handleSelectAll} inline />
|
|
498
498
|
</Show>
|
|
499
499
|
<div class="flex-1">
|
|
500
500
|
<Show when={title()}>{title()!.children}</Show>
|
|
501
501
|
</div>
|
|
502
502
|
<Show when={tools()}>
|
|
503
|
-
<div class={clsx("flex items-center", gap.
|
|
503
|
+
<div class={clsx("flex items-center", gap.md)}>{tools()!.children}</div>
|
|
504
504
|
</Show>
|
|
505
505
|
</div>
|
|
506
506
|
</Show>
|
|
@@ -142,7 +142,7 @@ const ListItemInner: ParentComponent<ListItemProps> = (props) => {
|
|
|
142
142
|
const getHeaderClassName = () =>
|
|
143
143
|
twMerge(
|
|
144
144
|
listItemBaseClass,
|
|
145
|
-
listItemSizeClasses[local.size ?? "
|
|
145
|
+
listItemSizeClasses[local.size ?? "md"],
|
|
146
146
|
local.selected && listItemSelectedClass,
|
|
147
147
|
local.readOnly && listItemReadonlyClass,
|
|
148
148
|
local.disabled && listItemDisabledClass,
|
|
@@ -21,7 +21,7 @@ export const thClass = clsx(
|
|
|
21
21
|
"align-middle",
|
|
22
22
|
);
|
|
23
23
|
|
|
24
|
-
export const thContentClass = clsx(pad.
|
|
24
|
+
export const thContentClass = clsx(pad.md);
|
|
25
25
|
|
|
26
26
|
export const tdClass = clsx(
|
|
27
27
|
"bg-white dark:bg-base-950",
|
|
@@ -54,7 +54,7 @@ export const sortIconClass = clsx("bg-base-100 dark:bg-base-900");
|
|
|
54
54
|
// Top toolbar (settings button + pagination)
|
|
55
55
|
export const toolbarClass = clsx(
|
|
56
56
|
"flex items-center gap-2",
|
|
57
|
-
pad.
|
|
57
|
+
pad.md,
|
|
58
58
|
"border-b",
|
|
59
59
|
border.default,
|
|
60
60
|
);
|