@simplysm/solid 13.0.82 → 13.0.83

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 CHANGED
@@ -5,26 +5,26 @@
5
5
  A comprehensive, enterprise-grade UI component library built on SolidJS and Tailwind CSS. Provides a full suite of form controls, data display components, layout primitives, feedback systems, and high-level CRUD abstractions for building business applications.
6
6
 
7
7
  Key features:
8
- - **Controlled component pattern** `value`/`onValueChange` across all form controls
9
- - **Compound component API** `Select.Item`, `DataSheet.Column`, `Tabs.Tab`, etc.
10
- - **Built-in validation** `required`, `validate`, `lazyValidation` on every form control
11
- - **5-level sizing** `"xs" | "sm" | "md" | "lg" | "xl"` on all interactive components
12
- - **Semantic theming** `"base" | "primary" | "success" | "warning" | "danger"` color system
13
- - **Light/Dark mode** via `ThemeProvider` with system preference detection
14
- - **i18n** built-in internationalization via `I18nProvider`
15
- - **CRUD abstractions** `CrudSheet` and `CrudDetail` for rapid data management UIs
8
+ - **Controlled component pattern** -- `value`/`onValueChange` across all form controls
9
+ - **Compound component API** -- `Select.Item`, `DataSheet.Column`, `Tabs.Tab`, etc.
10
+ - **Built-in validation** -- `required`, `validate`, `lazyValidation` on every form control
11
+ - **5-level sizing** -- `"xs" | "sm" | "md" | "lg" | "xl"` on all interactive components
12
+ - **Semantic theming** -- `"base" | "primary" | "info" | "success" | "warning" | "danger"` color system
13
+ - **Light/Dark mode** -- via `ThemeProvider` with system preference detection
14
+ - **i18n** -- built-in internationalization via `I18nProvider`
15
+ - **CRUD abstractions** -- `CrudSheet` and `CrudDetail` for rapid data management UIs
16
16
 
17
17
  ## Documentation
18
18
 
19
19
  | Category | Description |
20
20
  |----------|-------------|
21
- | [Form Controls](docs/form-controls.md) | Input components Button, TextInput, NumberInput, DatePicker, TimePicker, Textarea, Select, Combobox, Checkbox, Radio, ColorPicker, DateRangePicker, RichTextEditor, Numpad, StatePreset, ThemeToggle |
22
- | [Layout](docs/layout.md) | Layout primitives FormGroup, FormTable, Sidebar, Topbar |
23
- | [Data](docs/data.md) | Data display Table, List, Pagination, DataSheet, Calendar, Kanban |
24
- | [Display](docs/display.md) | Display components Card, Icon, Tag, Link, Alert, Barcode, Echarts, Progress |
25
- | [Disclosure](docs/disclosure.md) | Disclosure components Collapse, Dropdown, Dialog, Tabs |
26
- | [Feedback](docs/feedback.md) | Feedback systems Notification, Busy overlay, Print |
27
- | [Providers](docs/providers.md) | Context providers Config, Theme, I18n, SyncStorage, Logger, ServiceClient, SharedData, System |
28
- | [Hooks](docs/hooks.md) | Hooks and primitives useLocalStorage, useSyncConfig, useLogger, createControllableSignal, createMountTransition, etc. |
29
- | [Helpers](docs/helpers.md) | Utilities mergeStyles, createAppStructure, createSlot, createSlots, ripple directive, style constants |
30
- | [Features](docs/features.md) | High-level components CrudSheet, CrudDetail, SharedDataSelect, DataSelectButton, AddressSearch, PermissionTable |
21
+ | [Form Controls](docs/form-controls.md) | Input components -- Button, TextInput, NumberInput, DatePicker, TimePicker, Textarea, Select, Combobox, Checkbox, Radio, ColorPicker, DateRangePicker, RichTextEditor, Numpad, StatePreset, ThemeToggle |
22
+ | [Layout](docs/layout.md) | Layout primitives -- FormGroup, FormTable, Sidebar, Topbar |
23
+ | [Data](docs/data.md) | Data display -- Table, List, Pagination, DataSheet, Calendar, Kanban |
24
+ | [Display](docs/display.md) | Display components -- Card, Icon, Tag, Link, Alert, Barcode, Echarts, Progress |
25
+ | [Disclosure](docs/disclosure.md) | Disclosure components -- Collapse, Dropdown, Dialog, Tabs |
26
+ | [Feedback](docs/feedback.md) | Feedback systems -- Notification, Busy overlay, Print |
27
+ | [Providers](docs/providers.md) | Context providers -- Config, Theme, I18n, SyncStorage, Logger, ServiceClient, SharedData, System |
28
+ | [Hooks](docs/hooks.md) | Hooks and primitives -- useLocalStorage, useSyncConfig, useLogger, createControllableSignal, createMountTransition, etc. |
29
+ | [Helpers](docs/helpers.md) | Utilities -- mergeStyles, createAppStructure, createSlot, createSlots, ripple directive, style constants |
30
+ | [Features](docs/features.md) | High-level components -- CrudSheet, CrudDetail, SharedDataSelect, DataSelectButton, AddressSearch, PermissionTable |
@@ -31,8 +31,8 @@ interface DropdownProps {
31
31
  Dropdown popup anchored to a trigger element. When `position` is provided instead of a trigger, the popup appears at the given absolute coordinates (useful for context menus). `keyboardNav` enables ArrowUp/Down navigation. Default `maxHeight` is 300px.
32
32
 
33
33
  **Sub-components:**
34
- - `Dropdown.Trigger` the element that opens the dropdown on click
35
- - `Dropdown.Content` the popup content
34
+ - `Dropdown.Trigger` -- the element that opens the dropdown on click
35
+ - `Dropdown.Content` -- the popup content
36
36
 
37
37
  ---
38
38
 
@@ -62,14 +62,16 @@ interface DialogProps {
62
62
 
63
63
  Modal dialog with overlay. Supports both declarative (template) and programmatic usage.
64
64
 
65
- - `mode="float"` centered floating dialog (default)
66
- - `mode="fill"` full-screen dialog
67
- - `beforeClose` return `false` to prevent closing
68
- - `resizable` / `draggable` enable resize handles / drag-to-move
65
+ - `mode="float"` -- centered floating dialog (default)
66
+ - `mode="fill"` -- full-screen dialog
67
+ - `beforeClose` -- return `false` to prevent closing
68
+ - `resizable` / `draggable` -- enable resize handles / drag-to-move (draggable defaults to `true`)
69
+ - `withCloseButton` -- show close button (defaults to `true`)
70
+ - `closeOnEscape` -- close on Escape key (defaults to `true`)
69
71
 
70
72
  **Sub-components:**
71
- - `Dialog.Header` dialog title bar
72
- - `Dialog.Action` dialog action buttons area
73
+ - `Dialog.Header` -- dialog title bar
74
+ - `Dialog.Action` -- dialog action buttons area
73
75
 
74
76
  ### Programmatic API
75
77
 
@@ -81,9 +83,14 @@ interface DialogContextValue {
81
83
  options?: DialogShowOptions,
82
84
  ): Promise<ExtractCloseResult<P> | undefined>;
83
85
  }
86
+
87
+ interface DialogProviderProps {
88
+ closeOnEscape?: boolean;
89
+ closeOnInteractOutside?: boolean;
90
+ }
84
91
  ```
85
92
 
86
- Use `DialogProvider` and `useDialog()` for programmatic dialog management. The shown component receives a `close(result?)` prop to close the dialog and return a value.
93
+ Use `DialogProvider` and `useDialog()` for programmatic dialog management. The shown component receives a `close(result?)` prop to close the dialog and return a value. `DialogProvider` accepts default options for `closeOnEscape` and `closeOnInteractOutside`.
87
94
 
88
95
  ```typescript
89
96
  const dialog = useDialog();
@@ -110,7 +117,7 @@ interface TabsProps {
110
117
 
111
118
  Tab navigation. Content rendering is managed externally based on the selected `value`.
112
119
 
113
- **Sub-component:** `Tabs.Tab` `{ value: string; disabled?: boolean; class?: string; children?: JSX.Element }`
120
+ **Sub-component:** `Tabs.Tab` -- `{ value: string; disabled?: boolean; class?: string; children?: JSX.Element }`
114
121
 
115
122
  ---
116
123
 
package/docs/display.md CHANGED
@@ -34,7 +34,7 @@ import { IconUser } from "@tabler/icons-solidjs";
34
34
 
35
35
  ```typescript
36
36
  interface TagProps extends JSX.HTMLAttributes<HTMLSpanElement> {
37
- theme?: "base" | "primary" | "success" | "warning" | "danger" | "danger-light" | "neutral";
37
+ theme?: "base" | "primary" | "info" | "success" | "warning" | "danger";
38
38
  }
39
39
  ```
40
40
 
@@ -46,7 +46,7 @@ Inline badge/tag with semantic theming.
46
46
 
47
47
  ```typescript
48
48
  interface LinkProps extends JSX.AnchorHTMLAttributes<HTMLAnchorElement> {
49
- theme?: "base" | "primary" | "success" | "warning" | "danger" | "danger-light" | "neutral";
49
+ theme?: "base" | "primary" | "info" | "success" | "warning" | "danger";
50
50
  disabled?: boolean;
51
51
  }
52
52
  ```
@@ -59,7 +59,7 @@ Styled anchor link with theme and disabled state.
59
59
 
60
60
  ```typescript
61
61
  interface AlertProps extends JSX.HTMLAttributes<HTMLDivElement> {
62
- theme?: "base" | "primary" | "success" | "warning" | "danger" | "danger-light" | "neutral";
62
+ theme?: "base" | "primary" | "info" | "success" | "warning" | "danger";
63
63
  }
64
64
  ```
65
65
 
@@ -98,13 +98,13 @@ Apache ECharts wrapper. Requires `echarts` as a peer dependency. Set `busy` to s
98
98
  ```typescript
99
99
  interface ProgressProps extends JSX.HTMLAttributes<HTMLDivElement> {
100
100
  value: number;
101
- theme?: "base" | "primary" | "success" | "warning" | "danger" | "danger-light" | "neutral";
101
+ theme?: "base" | "primary" | "info" | "success" | "warning" | "danger";
102
102
  size?: "xs" | "sm" | "md" | "lg" | "xl";
103
103
  inset?: boolean;
104
104
  }
105
105
  ```
106
106
 
107
- Progress bar. `value` is in the range 0100 (0 = 0%, 100 = 100%). Pass `children` to display custom content instead of the default percentage text.
107
+ Progress bar. `value` is in the range 0--100 (0 = 0%, 100 = 100%). Pass `children` to display custom content instead of the default percentage text.
108
108
 
109
109
  ---
110
110
 
package/docs/feedback.md CHANGED
@@ -7,6 +7,19 @@
7
7
  ```typescript
8
8
  type NotificationTheme = "info" | "success" | "warning" | "danger";
9
9
 
10
+ interface NotificationAction {
11
+ label: string;
12
+ onClick: () => void;
13
+ }
14
+
15
+ interface NotificationOptions {
16
+ action?: NotificationAction;
17
+ }
18
+
19
+ interface NotificationUpdateOptions {
20
+ renotify?: boolean;
21
+ }
22
+
10
23
  interface NotificationContextValue {
11
24
  items: Accessor<NotificationItem[]>;
12
25
  unreadCount: Accessor<number>;
@@ -27,7 +40,9 @@ interface NotificationContextValue {
27
40
  }
28
41
  ```
29
42
 
30
- Centralized notification management. Each `info`/`success`/`warning`/`danger` call creates a notification and returns its `id`. Use `error(err)` to display an error object as a danger notification.
43
+ Centralized notification management. Each `info`/`success`/`warning`/`danger` call creates a notification and returns its `id`. Use `error(err)` to display an error object as a danger notification. Maintains up to 50 notifications; older items are removed when exceeded.
44
+
45
+ Notifications can include an `action` button via the `options` parameter.
31
46
 
32
47
  ### NotificationBell
33
48
 
@@ -66,9 +81,9 @@ interface BusyProviderProps {
66
81
 
67
82
  Full-screen loading overlay with nestable `show`/`hide` calls (managed with an internal counter). Each `show` must have a matching `hide`.
68
83
 
69
- - `variant="spinner"` centered spinner (default)
70
- - `variant="bar"` top progress bar animation
71
- - `setProgress(percent)` display a determinate progress bar (0100, `undefined` for indeterminate)
84
+ - `variant="spinner"` -- centered spinner (default)
85
+ - `variant="bar"` -- top progress bar animation
86
+ - `setProgress(percent)` -- display a determinate progress bar (0--100, `undefined` for indeterminate)
72
87
 
73
88
  ### BusyContainer
74
89
 
@@ -84,8 +99,8 @@ interface BusyContainerProps extends Omit<JSX.HTMLAttributes<HTMLDivElement>, "c
84
99
  ```
85
100
 
86
101
  Local loading overlay for a specific container. Two modes:
87
- - `busy` shows overlay while preserving children
88
- - `ready={false}` hides children entirely until data is loaded
102
+ - `busy` -- shows overlay while preserving children
103
+ - `ready={false}` -- hides children entirely until data is loaded
89
104
 
90
105
  ---
91
106
 
@@ -123,6 +138,11 @@ const notification = useNotification();
123
138
  notification.success("Saved", "Record updated successfully");
124
139
  notification.error(new Error("Connection failed"));
125
140
 
141
+ // Notification with action button
142
+ notification.info("Update available", "A new version is ready", {
143
+ action: { label: "Refresh", onClick: () => location.reload() },
144
+ });
145
+
126
146
  // Global loading
127
147
  const busy = useBusy();
128
148
  busy.show("Loading data...");
@@ -4,7 +4,7 @@
4
4
 
5
5
  ```typescript
6
6
  interface ButtonProps extends JSX.ButtonHTMLAttributes<HTMLButtonElement> {
7
- theme?: "base" | "primary" | "success" | "warning" | "danger" | "danger-light" | "neutral";
7
+ theme?: "base" | "primary" | "info" | "success" | "warning" | "danger";
8
8
  variant?: "solid" | "outline" | "ghost";
9
9
  size?: "xs" | "sm" | "md" | "lg" | "xl";
10
10
  inset?: boolean;
@@ -44,7 +44,7 @@ interface TextInputProps {
44
44
 
45
45
  Single-line text input with format masking and validation. Use `format` for input masks (e.g. `"XXX-XXXX-XXXX"`).
46
46
 
47
- **Sub-component:** `TextInput.Prefix` renders content before the input.
47
+ **Sub-component:** `TextInput.Prefix` -- renders content before the input.
48
48
 
49
49
  ---
50
50
 
@@ -75,7 +75,7 @@ interface NumberInputProps {
75
75
 
76
76
  Numeric input with locale-aware formatting. `useGrouping` enables thousands separators (default: `true`).
77
77
 
78
- **Sub-component:** `NumberInput.Prefix` renders content before the input.
78
+ **Sub-component:** `NumberInput.Prefix` -- renders content before the input.
79
79
 
80
80
  ---
81
81
 
@@ -231,10 +231,10 @@ Dropdown select with single or multiple selection modes. Supports two usage patt
231
231
  Providing `itemSearchText` enables a built-in search input. `itemChildren` enables tree-structured items.
232
232
 
233
233
  **Sub-components:**
234
- - `Select.Item` selectable option (`{ value: TValue; disabled?: boolean }`)
235
- - `Select.Header` non-selectable header row
236
- - `Select.Action` non-selectable action row
237
- - `Select.ItemTemplate` custom item renderer
234
+ - `Select.Item` -- selectable option (`{ value: TValue; disabled?: boolean }`)
235
+ - `Select.Header` -- non-selectable header row
236
+ - `Select.Action` -- non-selectable action row
237
+ - `Select.ItemTemplate` -- custom item renderer
238
238
 
239
239
  ---
240
240
 
@@ -335,7 +335,7 @@ interface CheckboxGroupProps<TValue> {
335
335
 
336
336
  Group of checkboxes with multi-value binding.
337
337
 
338
- **Sub-component:** `CheckboxGroup.Item` `{ value: TValue; disabled?: boolean; children?: JSX.Element }`
338
+ **Sub-component:** `CheckboxGroup.Item` -- `{ value: TValue; disabled?: boolean; children?: JSX.Element }`
339
339
 
340
340
  ---
341
341
 
@@ -360,7 +360,7 @@ interface RadioGroupProps<TValue> {
360
360
 
361
361
  Group of radio buttons with single-value binding.
362
362
 
363
- **Sub-component:** `RadioGroup.Item` `{ value: TValue; disabled?: boolean; children?: JSX.Element }`
363
+ **Sub-component:** `RadioGroup.Item` -- `{ value: TValue; disabled?: boolean; children?: JSX.Element }`
364
364
 
365
365
  ---
366
366
 
@@ -474,7 +474,7 @@ interface ThemeToggleProps extends Omit<JSX.ButtonHTMLAttributes<HTMLButtonEleme
474
474
  }
475
475
  ```
476
476
 
477
- Button that cycles through light, dark, and system theme modes.
477
+ Button that cycles through light, system, and dark theme modes.
478
478
 
479
479
  ---
480
480
 
package/docs/helpers.md CHANGED
@@ -127,24 +127,25 @@ void ripple;
127
127
 
128
128
  Background, border, and text color utilities mapped to the theme system:
129
129
 
130
- - `bg.default`, `bg.subtle`, `bg.surface` background colors
131
- - `border.default`, `border.subtle` border colors
132
- - `text.default`, `text.muted`, `text.subtle` text colors
130
+ - `bg.surface`, `bg.muted`, `bg.subtle` -- background colors
131
+ - `border.default`, `border.subtle` -- border colors
132
+ - `text.default`, `text.muted`, `text.placeholder` -- text colors
133
133
 
134
134
  ### control.styles
135
135
 
136
- Component sizing utilities:
136
+ Component sizing and state utilities:
137
137
 
138
- - `pad.xs`, `pad.sm`, `pad.md`, `pad.lg`, `pad.xl` padding by size
139
- - `gap.xs` ... `gap.xl` gap by size
140
- - `ComponentSize` `"xs" | "sm" | "md" | "lg" | "xl"`
138
+ - `pad.xs`, `pad.sm`, `pad.md`, `pad.lg`, `pad.xl` -- padding by size
139
+ - `gap.xs` ... `gap.xl` -- gap by size
140
+ - `state.disabled` -- disabled state styling
141
+ - `ComponentSize` -- `"xs" | "sm" | "md" | "lg" | "xl"`
141
142
 
142
143
  ### theme.styles
143
144
 
144
145
  Semantic theme tokens:
145
146
 
146
- - `SemanticTheme` `"base" | "primary" | "success" | "warning" | "danger" | "danger-light" | "neutral"`
147
- - `themeTokens` maps each theme to `{ solid, subtle, outline, ghost }` Tailwind class sets
147
+ - `SemanticTheme` -- `"base" | "primary" | "info" | "success" | "warning" | "danger"`
148
+ - `themeTokens` -- maps each theme to `{ solid, solidHover, light, text, hoverBg, border }` Tailwind class sets
148
149
 
149
150
  ---
150
151
 
package/docs/providers.md CHANGED
@@ -7,7 +7,7 @@ export const ConfigProvider: ParentComponent<{ clientName: string }>;
7
7
  export function useConfig(): { clientName: string };
8
8
  ```
9
9
 
10
- Application-level configuration. `clientName` identifies the client app.
10
+ Application-level configuration. `clientName` identifies the client app and is used as a storage key prefix.
11
11
 
12
12
  ---
13
13
 
@@ -28,7 +28,7 @@ export const ThemeProvider: ParentComponent;
28
28
  export function useTheme(): ThemeContextValue;
29
29
  ```
30
30
 
31
- Light/Dark mode management with system preference detection. `cycleMode()` rotates through light dark system.
31
+ Light/Dark mode management with system preference detection. `cycleMode()` rotates through light -> system -> dark -> light. The selected mode is persisted via `SyncStorageProvider`.
32
32
 
33
33
  ---
34
34
 
@@ -51,7 +51,7 @@ export const I18nProvider: ParentComponent;
51
51
  export function useI18n(): I18nContextValue;
52
52
  ```
53
53
 
54
- Internationalization provider. Supports nested dictionary keys and parameter interpolation via `t("key", { name: "John" })`.
54
+ Internationalization provider. Built-in dictionaries for `"en"` and `"ko"`. Supports nested dictionary keys and parameter interpolation via `t("key", { name: "John" })`. The locale is auto-detected from `navigator.language` and persisted via `SyncStorageProvider`. Use `configure()` to add or override dictionaries.
55
55
 
56
56
  ---
57
57
 
@@ -92,7 +92,7 @@ interface LoggerContextValue {
92
92
  export const LoggerProvider: ParentComponent;
93
93
  ```
94
94
 
95
- Configurable logging provider. Middleware pattern via `configure()`.
95
+ Configurable logging provider. Defaults to a `consola`-based adapter. Middleware pattern via `configure()`.
96
96
 
97
97
  ---
98
98
 
@@ -110,7 +110,7 @@ export const ServiceClientProvider: ParentComponent;
110
110
  export function useServiceClient(): ServiceClientContextValue;
111
111
  ```
112
112
 
113
- Service communication provider. Manages WebSocket connections to backend services. Multiple named connections supported via `key`.
113
+ Service communication provider. Manages WebSocket connections to backend services. Multiple named connections supported via `key` (defaults to `"default"`). Auto-infers host, port, and SSL from `window.location` when not specified.
114
114
 
115
115
  ---
116
116
 
@@ -142,7 +142,12 @@ export const SharedDataProvider: (props: { children: JSX.Element }) => JSX.Eleme
142
142
  export function useSharedData<TSharedData>(): SharedDataValue<TSharedData>;
143
143
  ```
144
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.
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. Must be used inside `ServiceClientProvider`.
146
+
147
+ The returned `SharedDataValue` also provides:
148
+ - `wait()` -- wait until all initial fetches complete
149
+ - `busy` -- whether a fetch is in progress
150
+ - `configure()` -- set definitions to start data subscriptions (can only be called once)
146
151
 
147
152
  ---
148
153
 
@@ -155,7 +160,7 @@ export const SystemProvider: ParentComponent<{
155
160
  }>;
156
161
  ```
157
162
 
158
- Convenience provider that composes `ConfigProvider`, `SyncStorageProvider`, `LoggerProvider`, `ThemeProvider`, `I18nProvider`, `NotificationProvider`, and `BusyProvider` into a single wrapper.
163
+ Convenience provider that composes `ConfigProvider`, `I18nProvider`, `SyncStorageProvider`, `LoggerProvider`, `NotificationProvider`, `ErrorLoggerProvider`, `PwaUpdateProvider`, `ClipboardProvider`, `ThemeProvider`, `ServiceClientProvider`, `SharedDataProvider`, and `BusyProvider` into a single wrapper.
159
164
 
160
165
  ---
161
166
 
@@ -166,14 +171,10 @@ import { SystemProvider, DialogProvider, PrintProvider } from "@simplysm/solid";
166
171
 
167
172
  // Typical app provider tree
168
173
  <SystemProvider clientName="my-app">
169
- <ServiceClientProvider>
170
- <SharedDataProvider>
171
- <DialogProvider>
172
- <PrintProvider>
173
- <App />
174
- </PrintProvider>
175
- </DialogProvider>
176
- </SharedDataProvider>
177
- </ServiceClientProvider>
174
+ <DialogProvider>
175
+ <PrintProvider>
176
+ <App />
177
+ </PrintProvider>
178
+ </DialogProvider>
178
179
  </SystemProvider>
179
180
  ```
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@simplysm/solid",
3
- "version": "13.0.82",
3
+ "version": "13.0.83",
4
4
  "description": "Simplysm package - SolidJS library",
5
5
  "author": "simplysm",
6
6
  "license": "Apache-2.0",
@@ -52,10 +52,10 @@
52
52
  "tabbable": "^6.4.0",
53
53
  "tailwind-merge": "^3.5.0",
54
54
  "tailwindcss": "^3.4.19",
55
- "@simplysm/core-browser": "13.0.82",
56
- "@simplysm/core-common": "13.0.82",
57
- "@simplysm/service-client": "13.0.82",
58
- "@simplysm/service-common": "13.0.82"
55
+ "@simplysm/core-browser": "13.0.83",
56
+ "@simplysm/service-client": "13.0.83",
57
+ "@simplysm/core-common": "13.0.83",
58
+ "@simplysm/service-common": "13.0.83"
59
59
  },
60
60
  "devDependencies": {
61
61
  "@solidjs/testing-library": "^0.8.10"