@simplysm/solid 13.0.42 → 13.0.43
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/docs/helpers.md +29 -6
- package/docs/hooks.md +62 -7
- package/docs/styling.md +36 -14
- package/package.json +3 -3
package/docs/helpers.md
CHANGED
|
@@ -14,18 +14,41 @@ const style = mergeStyles("color: red", { fontSize: "14px" }, props.style);
|
|
|
14
14
|
|
|
15
15
|
## splitSlots
|
|
16
16
|
|
|
17
|
-
Utility for splitting children into named slots based on
|
|
17
|
+
Utility for splitting resolved children into named slots based on `data-*` attributes. Returns a tuple of `[slots accessor, content accessor]`.
|
|
18
|
+
|
|
19
|
+
Slot keys are matched against the element's `dataset` (camelCase). Sub-components that set a matching data attribute (e.g., `data-select-header`) are separated into the named slot; all other children remain in `content`.
|
|
18
20
|
|
|
19
21
|
```typescript
|
|
20
22
|
import { splitSlots } from "@simplysm/solid";
|
|
23
|
+
import { children } from "solid-js";
|
|
24
|
+
|
|
25
|
+
// Inside a component:
|
|
26
|
+
const resolved = children(() => props.children);
|
|
27
|
+
const [slots, content] = splitSlots(resolved, ["selectHeader", "selectAction"] as const);
|
|
28
|
+
|
|
29
|
+
// Access inside JSX (within a reactive context)
|
|
30
|
+
<div>{slots().selectHeader}</div> // HTMLElement[] matching data-select-header
|
|
31
|
+
<div>{content()}</div> // JSX.Element[] – remaining children
|
|
32
|
+
```
|
|
21
33
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
34
|
+
**Signature:**
|
|
35
|
+
|
|
36
|
+
```typescript
|
|
37
|
+
function splitSlots<K extends string>(
|
|
38
|
+
resolved: { toArray: () => unknown[] },
|
|
39
|
+
keys: readonly K[],
|
|
40
|
+
): [Accessor<Record<K, HTMLElement[]>>, Accessor<JSX.Element[]>]
|
|
27
41
|
```
|
|
28
42
|
|
|
43
|
+
| Parameter | Type | Description |
|
|
44
|
+
|-----------|------|-------------|
|
|
45
|
+
| `resolved` | `{ toArray: () => unknown[] }` | Resolved children from SolidJS `children()` |
|
|
46
|
+
| `keys` | `readonly K[]` | Slot key names (camelCase, matched against `element.dataset`) |
|
|
47
|
+
|
|
48
|
+
Returns a tuple:
|
|
49
|
+
- `slots` — `Accessor<Record<K, HTMLElement[]>>` — named slot elements per key
|
|
50
|
+
- `content` — `Accessor<JSX.Element[]>` — remaining children not matched by any key
|
|
51
|
+
|
|
29
52
|
---
|
|
30
53
|
|
|
31
54
|
## ripple directive
|
package/docs/hooks.md
CHANGED
|
@@ -238,13 +238,14 @@ const items: AppStructureItem<string>[] = [
|
|
|
238
238
|
const structure = createAppStructure({
|
|
239
239
|
items,
|
|
240
240
|
usableModules: () => activeModules(), // optional: filter by active modules
|
|
241
|
-
permRecord: () => userPermissions(), // optional:
|
|
241
|
+
permRecord: () => userPermissions(), // optional: Record<string, boolean> permission state
|
|
242
242
|
});
|
|
243
243
|
|
|
244
|
-
// structure.
|
|
245
|
-
// structure.usableMenus()
|
|
246
|
-
// structure.usableFlatMenus() --
|
|
247
|
-
// structure.
|
|
244
|
+
// structure.usableRoutes() -- Accessor<AppRoute[]> - filtered route array (pass to @solidjs/router)
|
|
245
|
+
// structure.usableMenus() -- Accessor<AppMenu[]> - filtered menu array for Sidebar.Menu
|
|
246
|
+
// structure.usableFlatMenus() -- Accessor<AppFlatMenu[]> - flat filtered menu list
|
|
247
|
+
// structure.usablePerms() -- Accessor<AppPerm[]> - filtered permission tree
|
|
248
|
+
// structure.flatPerms -- AppFlatPerm[] - all flat perm entries (static, not reactive)
|
|
248
249
|
```
|
|
249
250
|
|
|
250
251
|
**Routing integration with `@solidjs/router`:**
|
|
@@ -261,7 +262,7 @@ render(
|
|
|
261
262
|
<Route path="/" component={App}>
|
|
262
263
|
<Route path="/home" component={Home}>
|
|
263
264
|
<Route path="/" component={() => <Navigate href="/home/main" />} />
|
|
264
|
-
<For each={appStructure.
|
|
265
|
+
<For each={appStructure.usableRoutes()}>
|
|
265
266
|
{(r) => <Route path={r.path} component={r.component} />}
|
|
266
267
|
</For>
|
|
267
268
|
<Route path="/*" component={NotFoundPage} />
|
|
@@ -274,7 +275,52 @@ render(
|
|
|
274
275
|
);
|
|
275
276
|
```
|
|
276
277
|
|
|
277
|
-
Each route object in `structure.
|
|
278
|
+
Each route object in `structure.usableRoutes()` has `path` (derived from nested `code` values) and `component` properties, ready to pass directly to `<Route>`. Note that `usableRoutes` is a reactive accessor — it re-evaluates when `usableModules` or `permRecord` signals change.
|
|
279
|
+
|
|
280
|
+
**AppStructure return type:**
|
|
281
|
+
|
|
282
|
+
```typescript
|
|
283
|
+
interface AppStructure<TModule> {
|
|
284
|
+
items: AppStructureItem<TModule>[];
|
|
285
|
+
usableRoutes: Accessor<AppRoute[]>; // reactive, filtered by modules + permRecord
|
|
286
|
+
usableMenus: Accessor<AppMenu[]>; // reactive, filtered by modules + permRecord
|
|
287
|
+
usableFlatMenus: Accessor<AppFlatMenu[]>; // reactive, flat version of usableMenus
|
|
288
|
+
usablePerms: Accessor<AppPerm<TModule>[]>; // reactive, filtered permission tree
|
|
289
|
+
flatPerms: AppFlatPerm<TModule>[]; // static, all perm entries (not reactive)
|
|
290
|
+
getTitleChainByHref(href: string): string[];
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
interface AppRoute {
|
|
294
|
+
path: string;
|
|
295
|
+
component: Component;
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
interface AppMenu {
|
|
299
|
+
title: string;
|
|
300
|
+
href?: string;
|
|
301
|
+
icon?: Component<IconProps>;
|
|
302
|
+
children?: AppMenu[];
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
interface AppFlatMenu {
|
|
306
|
+
titleChain: string[];
|
|
307
|
+
href: string;
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
interface AppPerm<TModule = string> {
|
|
311
|
+
title: string;
|
|
312
|
+
href?: string;
|
|
313
|
+
modules?: TModule[];
|
|
314
|
+
perms?: string[];
|
|
315
|
+
children?: AppPerm<TModule>[];
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
interface AppFlatPerm<TModule = string> {
|
|
319
|
+
titleChain: string[];
|
|
320
|
+
code: string;
|
|
321
|
+
modulesChain: TModule[][];
|
|
322
|
+
}
|
|
323
|
+
```
|
|
278
324
|
|
|
279
325
|
**AppStructureItem types:**
|
|
280
326
|
|
|
@@ -302,6 +348,15 @@ interface AppStructureLeafItem<TModule> {
|
|
|
302
348
|
isNotMenu?: boolean; // exclude from menu but include in routing
|
|
303
349
|
}
|
|
304
350
|
|
|
351
|
+
// Sub-permission item
|
|
352
|
+
interface AppStructureSubPerm<TModule> {
|
|
353
|
+
code: string;
|
|
354
|
+
title: string;
|
|
355
|
+
modules?: TModule[];
|
|
356
|
+
requiredModules?: TModule[];
|
|
357
|
+
perms: ("use" | "edit")[];
|
|
358
|
+
}
|
|
359
|
+
|
|
305
360
|
type AppStructureItem<TModule> = AppStructureGroupItem<TModule> | AppStructureLeafItem<TModule>;
|
|
306
361
|
```
|
|
307
362
|
|
package/docs/styling.md
CHANGED
|
@@ -110,26 +110,45 @@ import {
|
|
|
110
110
|
|
|
111
111
|
```typescript
|
|
112
112
|
import {
|
|
113
|
-
type FieldSize,
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
113
|
+
type FieldSize, // "sm" | "lg" | "xl"
|
|
114
|
+
fieldBaseClass, // Base wrapper classes (inline-flex, field surface, h-field)
|
|
115
|
+
fieldSizeClasses, // Size variant classes per FieldSize
|
|
116
|
+
fieldInsetClass, // Inset mode wrapper classes
|
|
117
|
+
fieldInsetHeightClass, // Inset height class (h-field-inset, excludes border)
|
|
118
|
+
fieldInsetSizeHeightClasses, // Inset height classes per size
|
|
119
|
+
fieldDisabledClass, // Disabled state classes
|
|
120
|
+
textAreaBaseClass, // Base textarea wrapper classes
|
|
121
|
+
textAreaSizeClasses, // Textarea size classes per FieldSize
|
|
122
|
+
fieldInputClass, // Base classes for field <input> element
|
|
123
|
+
fieldGapClasses, // Gap classes per size (with prefix icon)
|
|
124
|
+
getFieldWrapperClass, // Utility to build field wrapper class string
|
|
125
|
+
getTextareaWrapperClass, // Utility to build textarea wrapper class string
|
|
118
126
|
} from "@simplysm/solid";
|
|
119
127
|
```
|
|
120
128
|
|
|
129
|
+
**`getFieldWrapperClass` options:**
|
|
130
|
+
|
|
131
|
+
| Option | Type | Description |
|
|
132
|
+
|--------|------|-------------|
|
|
133
|
+
| `size` | `FieldSize` | Size variant |
|
|
134
|
+
| `disabled` | `boolean` | Apply disabled styles |
|
|
135
|
+
| `inset` | `boolean` | Apply inset styles |
|
|
136
|
+
| `includeCustomClass` | `string \| false` | Additional CSS class (or `false` to skip) |
|
|
137
|
+
| `extra` | `string \| false` | Extra classes inserted before size/disabled/inset |
|
|
138
|
+
|
|
121
139
|
### Checkbox.styles
|
|
122
140
|
|
|
123
141
|
```typescript
|
|
124
142
|
import {
|
|
125
|
-
type CheckboxSize,
|
|
126
|
-
checkboxBaseClass,
|
|
127
|
-
indicatorBaseClass,
|
|
128
|
-
checkedClass,
|
|
129
|
-
checkboxSizeClasses,
|
|
130
|
-
checkboxInsetClass,
|
|
131
|
-
|
|
132
|
-
|
|
143
|
+
type CheckboxSize, // "sm" | "lg" | "xl"
|
|
144
|
+
checkboxBaseClass, // Base wrapper classes
|
|
145
|
+
indicatorBaseClass, // Base indicator (box) classes
|
|
146
|
+
checkedClass, // Checked state classes (primary color)
|
|
147
|
+
checkboxSizeClasses, // Size variant classes
|
|
148
|
+
checkboxInsetClass, // Inset mode classes
|
|
149
|
+
checkboxInsetSizeHeightClasses, // Inset height classes per size (excludes border)
|
|
150
|
+
checkboxInlineClass, // Inline display classes
|
|
151
|
+
checkboxDisabledClass, // Disabled state classes
|
|
133
152
|
} from "@simplysm/solid";
|
|
134
153
|
```
|
|
135
154
|
|
|
@@ -142,8 +161,11 @@ import {
|
|
|
142
161
|
sortableThClass, sortIconClass, toolbarClass, fixedClass, fixedLastClass,
|
|
143
162
|
resizerClass, resizeIndicatorClass, featureThClass, featureTdClass,
|
|
144
163
|
expandIndentGuideClass, expandIndentGuideLineClass, expandToggleClass,
|
|
164
|
+
selectSingleClass, selectSingleSelectedClass, selectSingleUnselectedClass,
|
|
145
165
|
reorderHandleClass, reorderIndicatorClass, configButtonClass,
|
|
146
|
-
|
|
166
|
+
featureCellWrapperClass, featureCellBodyWrapperClass,
|
|
167
|
+
featureCellClickableClass, featureCellBodyClickableClass,
|
|
168
|
+
reorderCellWrapperClass,
|
|
147
169
|
} from "@simplysm/solid";
|
|
148
170
|
```
|
|
149
171
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@simplysm/solid",
|
|
3
|
-
"version": "13.0.
|
|
3
|
+
"version": "13.0.43",
|
|
4
4
|
"description": "심플리즘 패키지 - SolidJS 라이브러리",
|
|
5
5
|
"author": "김석래",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -49,8 +49,8 @@
|
|
|
49
49
|
"solid-tiptap": "^0.8.0",
|
|
50
50
|
"tailwind-merge": "^3.5.0",
|
|
51
51
|
"tailwindcss": "^3.4.19",
|
|
52
|
-
"@simplysm/core-
|
|
53
|
-
"@simplysm/core-
|
|
52
|
+
"@simplysm/core-common": "13.0.43",
|
|
53
|
+
"@simplysm/core-browser": "13.0.43"
|
|
54
54
|
},
|
|
55
55
|
"devDependencies": {
|
|
56
56
|
"@solidjs/testing-library": "^0.8.10"
|