@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 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 component type.
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
- const slots = splitSlots(props.children, {
23
- header: HeaderComponent,
24
- footer: FooterComponent,
25
- });
26
- // slots.header, slots.footer, slots.rest
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: user permission state
241
+ permRecord: () => userPermissions(), // optional: Record<string, boolean> permission state
242
242
  });
243
243
 
244
- // structure.routes -- Route array (pass to @solidjs/router)
245
- // structure.usableMenus() -- SidebarMenuItem[] for Sidebar.Menu
246
- // structure.usableFlatMenus() -- Flat menu list
247
- // structure.permRecord() -- Record<string, boolean> permission state
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.routes}>
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.routes` has `path` (derived from nested `code` values) and `component` properties, ready to pass directly to `<Route>`.
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, // "sm" | "lg" | "xl"
114
- getFieldWrapperClass, // Utility to build field wrapper class string
115
- getTextareaWrapperClass, // Utility to build textarea wrapper class string
116
- fieldInputClass, // Base classes for field <input> element
117
- fieldGapClasses, // Gap classes per size (with prefix icon)
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, // "sm" | "lg" | "xl"
126
- checkboxBaseClass, // Base wrapper classes
127
- indicatorBaseClass, // Base indicator (box) classes
128
- checkedClass, // Checked state classes (primary color)
129
- checkboxSizeClasses, // Size variant classes
130
- checkboxInsetClass, // Inset mode classes
131
- checkboxInlineClass, // Inline display classes
132
- checkboxDisabledClass, // Disabled state classes
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
- // etc.
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.42",
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-browser": "13.0.42",
53
- "@simplysm/core-common": "13.0.42"
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"