@simplysm/solid 13.0.55 → 13.0.56

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.
Files changed (181) hide show
  1. package/README.md +3 -1
  2. package/dist/components/data/crud-detail/CrudDetail.d.ts +14 -0
  3. package/dist/components/data/crud-detail/CrudDetail.d.ts.map +1 -0
  4. package/dist/components/data/crud-detail/CrudDetail.js +348 -0
  5. package/dist/components/data/crud-detail/CrudDetail.js.map +6 -0
  6. package/dist/components/data/crud-detail/CrudDetailAfter.d.ts +7 -0
  7. package/dist/components/data/crud-detail/CrudDetailAfter.d.ts.map +1 -0
  8. package/dist/components/data/crud-detail/CrudDetailAfter.js +14 -0
  9. package/dist/components/data/crud-detail/CrudDetailAfter.js.map +6 -0
  10. package/dist/components/data/crud-detail/CrudDetailBefore.d.ts +7 -0
  11. package/dist/components/data/crud-detail/CrudDetailBefore.d.ts.map +1 -0
  12. package/dist/components/data/crud-detail/CrudDetailBefore.js +14 -0
  13. package/dist/components/data/crud-detail/CrudDetailBefore.js.map +6 -0
  14. package/dist/components/data/crud-detail/CrudDetailTools.d.ts +7 -0
  15. package/dist/components/data/crud-detail/CrudDetailTools.d.ts.map +1 -0
  16. package/dist/components/data/crud-detail/CrudDetailTools.js +14 -0
  17. package/dist/components/data/crud-detail/CrudDetailTools.js.map +6 -0
  18. package/dist/components/data/crud-detail/types.d.ts +45 -0
  19. package/dist/components/data/crud-detail/types.d.ts.map +1 -0
  20. package/dist/components/data/crud-detail/types.js +1 -0
  21. package/dist/components/data/crud-detail/types.js.map +6 -0
  22. package/dist/components/data/crud-sheet/CrudSheet.d.ts +17 -0
  23. package/dist/components/data/crud-sheet/CrudSheet.d.ts.map +1 -0
  24. package/dist/components/data/crud-sheet/CrudSheet.js +679 -0
  25. package/dist/components/data/crud-sheet/CrudSheet.js.map +6 -0
  26. package/dist/components/data/crud-sheet/CrudSheetColumn.d.ts +5 -0
  27. package/dist/components/data/crud-sheet/CrudSheetColumn.d.ts.map +1 -0
  28. package/dist/components/data/crud-sheet/CrudSheetColumn.js +29 -0
  29. package/dist/components/data/crud-sheet/CrudSheetColumn.js.map +6 -0
  30. package/dist/components/data/crud-sheet/CrudSheetFilter.d.ts +7 -0
  31. package/dist/components/data/crud-sheet/CrudSheetFilter.d.ts.map +1 -0
  32. package/dist/components/data/crud-sheet/CrudSheetFilter.js +14 -0
  33. package/dist/components/data/crud-sheet/CrudSheetFilter.js.map +6 -0
  34. package/dist/components/data/crud-sheet/CrudSheetHeader.d.ts +7 -0
  35. package/dist/components/data/crud-sheet/CrudSheetHeader.d.ts.map +1 -0
  36. package/dist/components/data/crud-sheet/CrudSheetHeader.js +14 -0
  37. package/dist/components/data/crud-sheet/CrudSheetHeader.js.map +6 -0
  38. package/dist/components/data/crud-sheet/CrudSheetTools.d.ts +7 -0
  39. package/dist/components/data/crud-sheet/CrudSheetTools.d.ts.map +1 -0
  40. package/dist/components/data/crud-sheet/CrudSheetTools.js +14 -0
  41. package/dist/components/data/crud-sheet/CrudSheetTools.js.map +6 -0
  42. package/dist/components/data/crud-sheet/types.d.ts +109 -0
  43. package/dist/components/data/crud-sheet/types.d.ts.map +1 -0
  44. package/dist/components/data/crud-sheet/types.js +1 -0
  45. package/dist/components/data/crud-sheet/types.js.map +6 -0
  46. package/dist/components/data/kanban/Kanban.d.ts.map +1 -1
  47. package/dist/components/data/kanban/Kanban.js +137 -138
  48. package/dist/components/data/kanban/Kanban.js.map +2 -2
  49. package/dist/components/data/kanban/KanbanContext.d.ts +5 -1
  50. package/dist/components/data/kanban/KanbanContext.d.ts.map +1 -1
  51. package/dist/components/data/kanban/KanbanContext.js.map +1 -1
  52. package/dist/components/data/list/ListItem.d.ts.map +1 -1
  53. package/dist/components/data/list/ListItem.js +109 -99
  54. package/dist/components/data/list/ListItem.js.map +2 -2
  55. package/dist/components/data/sheet/DataSheet.js +1 -1
  56. package/dist/components/data/sheet/DataSheet.js.map +2 -2
  57. package/dist/components/data/sheet/DataSheet.styles.d.ts.map +1 -1
  58. package/dist/components/data/sheet/DataSheet.styles.js +1 -1
  59. package/dist/components/data/sheet/DataSheet.styles.js.map +1 -1
  60. package/dist/components/disclosure/Dialog.d.ts +16 -10
  61. package/dist/components/disclosure/Dialog.d.ts.map +1 -1
  62. package/dist/components/disclosure/Dialog.js +126 -91
  63. package/dist/components/disclosure/Dialog.js.map +2 -2
  64. package/dist/components/disclosure/DialogContext.d.ts +2 -4
  65. package/dist/components/disclosure/DialogContext.d.ts.map +1 -1
  66. package/dist/components/disclosure/DialogContext.js.map +1 -1
  67. package/dist/components/disclosure/DialogProvider.d.ts.map +1 -1
  68. package/dist/components/disclosure/DialogProvider.js +14 -9
  69. package/dist/components/disclosure/DialogProvider.js.map +2 -2
  70. package/dist/components/disclosure/Dropdown.d.ts +46 -22
  71. package/dist/components/disclosure/Dropdown.d.ts.map +1 -1
  72. package/dist/components/disclosure/Dropdown.js +100 -65
  73. package/dist/components/disclosure/Dropdown.js.map +2 -2
  74. package/dist/components/feedback/notification/NotificationBanner.d.ts.map +1 -1
  75. package/dist/components/feedback/notification/NotificationBanner.js +3 -3
  76. package/dist/components/feedback/notification/NotificationBanner.js.map +1 -1
  77. package/dist/components/feedback/notification/NotificationBell.d.ts.map +1 -1
  78. package/dist/components/feedback/notification/NotificationBell.js +84 -84
  79. package/dist/components/feedback/notification/NotificationBell.js.map +2 -2
  80. package/dist/components/form-control/combobox/Combobox.d.ts +6 -3
  81. package/dist/components/form-control/combobox/Combobox.d.ts.map +1 -1
  82. package/dist/components/form-control/combobox/Combobox.js +150 -168
  83. package/dist/components/form-control/combobox/Combobox.js.map +2 -2
  84. package/dist/components/form-control/combobox/ComboboxContext.d.ts +3 -0
  85. package/dist/components/form-control/combobox/ComboboxContext.d.ts.map +1 -1
  86. package/dist/components/form-control/combobox/ComboboxContext.js.map +1 -1
  87. package/dist/components/form-control/date-range-picker/DateRangePicker.d.ts +0 -2
  88. package/dist/components/form-control/date-range-picker/DateRangePicker.d.ts.map +1 -1
  89. package/dist/components/form-control/date-range-picker/DateRangePicker.js +9 -17
  90. package/dist/components/form-control/date-range-picker/DateRangePicker.js.map +2 -2
  91. package/dist/components/form-control/field/Field.styles.d.ts.map +1 -1
  92. package/dist/components/form-control/field/Field.styles.js +2 -1
  93. package/dist/components/form-control/field/Field.styles.js.map +1 -1
  94. package/dist/components/form-control/field/NumberInput.d.ts +15 -5
  95. package/dist/components/form-control/field/NumberInput.d.ts.map +1 -1
  96. package/dist/components/form-control/field/NumberInput.js +181 -141
  97. package/dist/components/form-control/field/NumberInput.js.map +2 -2
  98. package/dist/components/form-control/field/TextInput.d.ts +9 -5
  99. package/dist/components/form-control/field/TextInput.d.ts.map +1 -1
  100. package/dist/components/form-control/field/TextInput.js +199 -154
  101. package/dist/components/form-control/field/TextInput.js.map +2 -2
  102. package/dist/components/form-control/select/Select.d.ts +3 -3
  103. package/dist/components/form-control/select/Select.d.ts.map +1 -1
  104. package/dist/components/form-control/select/Select.js +116 -100
  105. package/dist/components/form-control/select/Select.js.map +2 -2
  106. package/dist/components/form-control/select/SelectContext.d.ts +9 -1
  107. package/dist/components/form-control/select/SelectContext.d.ts.map +1 -1
  108. package/dist/components/form-control/select/SelectContext.js.map +1 -1
  109. package/dist/components/form-control/select/SelectItem.d.ts.map +1 -1
  110. package/dist/components/form-control/select/SelectItem.js +77 -67
  111. package/dist/components/form-control/select/SelectItem.js.map +2 -2
  112. package/dist/components/layout/topbar/TopbarMenu.d.ts.map +1 -1
  113. package/dist/components/layout/topbar/TopbarMenu.js +63 -57
  114. package/dist/components/layout/topbar/TopbarMenu.js.map +2 -2
  115. package/dist/components/layout/topbar/TopbarUser.d.ts.map +1 -1
  116. package/dist/components/layout/topbar/TopbarUser.js +53 -54
  117. package/dist/components/layout/topbar/TopbarUser.js.map +2 -2
  118. package/dist/hooks/createControllableStore.d.ts +29 -0
  119. package/dist/hooks/createControllableStore.d.ts.map +1 -0
  120. package/dist/hooks/createControllableStore.js +19 -0
  121. package/dist/hooks/createControllableStore.js.map +6 -0
  122. package/dist/index.d.ts +5 -1
  123. package/dist/index.d.ts.map +1 -1
  124. package/dist/index.js +6 -2
  125. package/dist/index.js.map +1 -1
  126. package/dist/styles/patterns.styles.d.ts.map +1 -1
  127. package/dist/styles/patterns.styles.js +7 -1
  128. package/dist/styles/patterns.styles.js.map +1 -1
  129. package/docs/data-components.md +428 -0
  130. package/docs/disclosure.md +65 -35
  131. package/docs/form-controls.md +18 -3
  132. package/docs/helpers.md +0 -39
  133. package/docs/hooks.md +39 -0
  134. package/package.json +4 -3
  135. package/src/components/data/crud-detail/CrudDetail.tsx +346 -0
  136. package/src/components/data/crud-detail/CrudDetailAfter.tsx +19 -0
  137. package/src/components/data/crud-detail/CrudDetailBefore.tsx +19 -0
  138. package/src/components/data/crud-detail/CrudDetailTools.tsx +19 -0
  139. package/src/components/data/crud-detail/types.ts +58 -0
  140. package/src/components/data/crud-sheet/CrudSheet.tsx +628 -0
  141. package/src/components/data/crud-sheet/CrudSheetColumn.tsx +34 -0
  142. package/src/components/data/crud-sheet/CrudSheetFilter.tsx +21 -0
  143. package/src/components/data/crud-sheet/CrudSheetHeader.tsx +19 -0
  144. package/src/components/data/crud-sheet/CrudSheetTools.tsx +21 -0
  145. package/src/components/data/crud-sheet/types.ts +133 -0
  146. package/src/components/data/kanban/Kanban.tsx +72 -65
  147. package/src/components/data/kanban/KanbanContext.ts +7 -1
  148. package/src/components/data/list/ListItem.tsx +31 -18
  149. package/src/components/data/sheet/DataSheet.styles.ts +1 -1
  150. package/src/components/data/sheet/DataSheet.tsx +1 -1
  151. package/src/components/disclosure/Dialog.tsx +143 -105
  152. package/src/components/disclosure/DialogContext.ts +2 -4
  153. package/src/components/disclosure/DialogProvider.tsx +4 -2
  154. package/src/components/disclosure/Dropdown.tsx +174 -86
  155. package/src/components/feedback/notification/NotificationBanner.tsx +3 -9
  156. package/src/components/feedback/notification/NotificationBell.tsx +51 -57
  157. package/src/components/form-control/combobox/Combobox.tsx +109 -134
  158. package/src/components/form-control/combobox/ComboboxContext.ts +4 -1
  159. package/src/components/form-control/date-range-picker/DateRangePicker.tsx +6 -16
  160. package/src/components/form-control/field/Field.styles.ts +1 -0
  161. package/src/components/form-control/field/NumberInput.tsx +131 -88
  162. package/src/components/form-control/field/TextInput.tsx +139 -88
  163. package/src/components/form-control/select/Select.tsx +85 -67
  164. package/src/components/form-control/select/SelectContext.ts +12 -1
  165. package/src/components/form-control/select/SelectItem.tsx +39 -18
  166. package/src/components/layout/topbar/TopbarMenu.tsx +52 -55
  167. package/src/components/layout/topbar/TopbarUser.tsx +28 -31
  168. package/src/hooks/createControllableStore.ts +47 -0
  169. package/src/index.ts +5 -1
  170. package/src/styles/patterns.styles.ts +7 -1
  171. package/tailwind.css +4 -0
  172. package/dist/helpers/splitSlots.d.ts +0 -25
  173. package/dist/helpers/splitSlots.d.ts.map +0 -1
  174. package/dist/helpers/splitSlots.js +0 -25
  175. package/dist/helpers/splitSlots.js.map +0 -6
  176. package/dist/hooks/createItemTemplate.d.ts +0 -17
  177. package/dist/hooks/createItemTemplate.d.ts.map +0 -1
  178. package/dist/hooks/createItemTemplate.js +0 -40
  179. package/dist/hooks/createItemTemplate.js.map +0 -6
  180. package/src/helpers/splitSlots.ts +0 -51
  181. package/src/hooks/createItemTemplate.tsx +0 -42
package/src/index.ts CHANGED
@@ -57,6 +57,10 @@ export * from "./components/data/Pagination";
57
57
  export * from "./components/data/sheet/DataSheet";
58
58
  export * from "./components/data/sheet/DataSheet.styles";
59
59
  export * from "./components/data/sheet/types";
60
+ export * from "./components/data/crud-sheet/CrudSheet";
61
+ export * from "./components/data/crud-sheet/types";
62
+ export * from "./components/data/crud-detail/CrudDetail";
63
+ export * from "./components/data/crud-detail/types";
60
64
  export * from "./components/data/calendar/Calendar";
61
65
  export * from "./components/data/permission-table/PermissionTable";
62
66
  export * from "./components/data/kanban/Kanban";
@@ -155,6 +159,7 @@ export * from "./hooks/useLocalStorage";
155
159
  export * from "./hooks/useSyncConfig";
156
160
  export * from "./hooks/useLogger";
157
161
  export { createControllableSignal } from "./hooks/createControllableSignal";
162
+ export { createControllableStore } from "./hooks/createControllableStore";
158
163
  export { createIMEHandler } from "./hooks/createIMEHandler";
159
164
  export { createMountTransition } from "./hooks/createMountTransition";
160
165
  export { useRouterLink } from "./hooks/useRouterLink";
@@ -177,7 +182,6 @@ export { ripple } from "./directives/ripple";
177
182
  //#region ========== Helpers ==========
178
183
 
179
184
  export { mergeStyles } from "./helpers/mergeStyles";
180
- export { splitSlots } from "./helpers/splitSlots";
181
185
  export { createAppStructure } from "./helpers/createAppStructure";
182
186
  export type {
183
187
  AppStructureItem,
@@ -41,4 +41,10 @@ export const fieldSurface = clsx(
41
41
  );
42
42
 
43
43
  // ── 입력 요소 공통 ──
44
- export const inputBase = clsx("min-w-0 flex-1", "bg-transparent", "outline-none", textPlaceholder);
44
+ export const inputBase = clsx(
45
+ "min-w-0 flex-1",
46
+ "bg-transparent",
47
+ "outline-none",
48
+ "[text-decoration:inherit]",
49
+ textPlaceholder,
50
+ );
package/tailwind.css CHANGED
@@ -18,6 +18,10 @@
18
18
  height: 100%;
19
19
  }
20
20
 
21
+ pre {
22
+ font-family: sans-serif;
23
+ }
24
+
21
25
  *:focus {
22
26
  outline: none;
23
27
  }
@@ -1,25 +0,0 @@
1
- import "@simplysm/core-common";
2
- import { type Accessor } from "solid-js";
3
- import type { JSX } from "solid-js/jsx-runtime";
4
- /**
5
- * children을 slot 키 기준으로 분리하여 반환합니다.
6
- * SolidJS의 splitProps와 유사한 패턴으로 동작합니다.
7
- *
8
- * @param resolved - children(() => props.children)으로 생성된 resolved children
9
- * @param keys - 분리할 slot 키 배열 (camelCase, data 속성과 매칭)
10
- * @returns [slots, content] - slots는 각 키별 HTMLElement[], content는 나머지 JSX.Element[]
11
- *
12
- * @example
13
- * ```tsx
14
- * const resolved = children(() => props.children);
15
- * const [slots, content] = splitSlots(resolved, ["selectHeader", "selectAction"] as const);
16
- *
17
- * // JSX에서 사용
18
- * <div>{slots().selectHeader.single()}</div>
19
- * <div>{content()}</div>
20
- * ```
21
- */
22
- export declare function splitSlots<K extends string>(resolved: {
23
- toArray: () => unknown[];
24
- }, keys: readonly K[]): [Accessor<Record<K, HTMLElement[]>>, Accessor<JSX.Element[]>];
25
- //# sourceMappingURL=splitSlots.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"splitSlots.d.ts","sourceRoot":"","sources":["..\\..\\src\\helpers\\splitSlots.ts"],"names":[],"mappings":"AAAA,OAAO,uBAAuB,CAAC;AAC/B,OAAO,EAAE,KAAK,QAAQ,EAAc,MAAM,UAAU,CAAC;AACrD,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,sBAAsB,CAAC;AAEhD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,UAAU,CAAC,CAAC,SAAS,MAAM,EACzC,QAAQ,EAAE;IAAE,OAAO,EAAE,MAAM,OAAO,EAAE,CAAA;CAAE,EACtC,IAAI,EAAE,SAAS,CAAC,EAAE,GACjB,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,EAAE,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAyB/D"}
@@ -1,25 +0,0 @@
1
- import "@simplysm/core-common";
2
- import { createMemo } from "solid-js";
3
- function splitSlots(resolved, keys) {
4
- const memo = createMemo(() => {
5
- const arr = resolved.toArray();
6
- const result = Object.fromEntries(keys.map((k) => [k, []]));
7
- const content = [];
8
- for (const c of arr) {
9
- if (c instanceof HTMLElement) {
10
- const matchedKey = keys.find((k) => k in c.dataset);
11
- if (matchedKey !== void 0) {
12
- result[matchedKey].push(c);
13
- continue;
14
- }
15
- }
16
- content.push(c);
17
- }
18
- return { result, content };
19
- });
20
- return [() => memo().result, () => memo().content];
21
- }
22
- export {
23
- splitSlots
24
- };
25
- //# sourceMappingURL=splitSlots.js.map
@@ -1,6 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/helpers/splitSlots.ts"],
4
- "mappings": "AAAA,OAAO;AACP,SAAwB,kBAAkB;AAqBnC,SAAS,WACd,UACA,MAC+D;AAC/D,QAAM,OAAO,WAAW,MAAM;AAC5B,UAAM,MAAM,SAAS,QAAQ;AAC7B,UAAM,SAAS,OAAO,YAAY,KAAK,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;AAI1D,UAAM,UAAyB,CAAC;AAEhC,eAAW,KAAK,KAAK;AACnB,UAAI,aAAa,aAAa;AAC5B,cAAM,aAAa,KAAK,KAAK,CAAC,MAAM,KAAK,EAAE,OAAO;AAClD,YAAI,eAAe,QAAW;AAC5B,iBAAO,UAAU,EAAE,KAAK,CAAC;AACzB;AAAA,QACF;AAAA,MACF;AACA,cAAQ,KAAK,CAAgB;AAAA,IAC/B;AAEA,WAAO,EAAE,QAAQ,QAAQ;AAAA,EAC3B,CAAC;AAGD,SAAO,CAAC,MAAM,KAAK,EAAE,QAAQ,MAAM,KAAK,EAAE,OAAO;AACnD;",
5
- "names": []
6
- }
@@ -1,17 +0,0 @@
1
- import type { JSX } from "solid-js";
2
- /**
3
- * WeakMap 기반 템플릿 슬롯 패턴을 생성합니다. SolidJS children을 통해 렌더 함수를 전달할 때 사용합니다.
4
- *
5
- * Select와 Combobox의 ItemTemplate 서브 컴포넌트 패턴에서 사용됩니다.
6
- * TemplateSlot은 WeakMap에 렌더 함수를 ref로 저장하는 숨겨진 span을 렌더링합니다.
7
- * getTemplate은 resolved 슬롯 엘리먼트에서 렌더 함수를 가져옵니다.
8
- *
9
- * @param dataAttr - 숨겨진 span에 사용할 HTML 속성 이름 (예: "data-select-item-template")
10
- */
11
- export declare function createItemTemplate<TArgs extends unknown[]>(dataAttr: string): {
12
- TemplateSlot: (props: {
13
- children(...args: TArgs): JSX.Element;
14
- }) => JSX.Element;
15
- getTemplate: (slotElements: Element[]) => ((...args: TArgs) => JSX.Element) | undefined;
16
- };
17
- //# sourceMappingURL=createItemTemplate.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"createItemTemplate.d.ts","sourceRoot":"","sources":["..\\..\\src\\hooks\\createItemTemplate.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAEpC;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,SAAS,OAAO,EAAE,EACxD,QAAQ,EAAE,MAAM,GACf;IACD,YAAY,EAAE,CAAC,KAAK,EAAE;QAAE,QAAQ,CAAC,GAAG,IAAI,EAAE,KAAK,GAAG,GAAG,CAAC,OAAO,CAAA;KAAE,KAAK,GAAG,CAAC,OAAO,CAAC;IAChF,WAAW,EAAE,CAAC,YAAY,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,GAAG,IAAI,EAAE,KAAK,KAAK,GAAG,CAAC,OAAO,CAAC,GAAG,SAAS,CAAC;CACzF,CAyBA"}
@@ -1,40 +0,0 @@
1
- import { template as _$template } from "solid-js/web";
2
- import { use as _$use } from "solid-js/web";
3
- import { spread as _$spread } from "solid-js/web";
4
- import { mergeProps as _$mergeProps } from "solid-js/web";
5
- var _tmpl$ = /* @__PURE__ */ _$template(`<span>`);
6
- function createItemTemplate(dataAttr) {
7
- const templateFnMap = /* @__PURE__ */ new WeakMap();
8
- function TemplateSlot(props) {
9
- return (() => {
10
- var _el$ = _tmpl$();
11
- _$use((el) => {
12
- templateFnMap.set(el, props.children);
13
- }, _el$);
14
- _$spread(_el$, _$mergeProps({
15
- [dataAttr]: true
16
- }, {
17
- "style": {
18
- display: "none"
19
- }
20
- }), false, false);
21
- return _el$;
22
- })();
23
- }
24
- function getTemplate(slotElements) {
25
- if (slotElements.length === 0) return void 0;
26
- const el = slotElements[0];
27
- if (el instanceof HTMLElement) {
28
- return templateFnMap.get(el);
29
- }
30
- return void 0;
31
- }
32
- return {
33
- TemplateSlot,
34
- getTemplate
35
- };
36
- }
37
- export {
38
- createItemTemplate
39
- };
40
- //# sourceMappingURL=createItemTemplate.js.map
@@ -1,6 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/hooks/createItemTemplate.tsx"],
4
- "mappings": ";;;;;AAWO,SAASA,mBACdC,UAIA;AACA,QAAMC,gBAAgB,oBAAIC,QAAsD;AAEhF,WAASC,aAAaC,OAA+D;AACnF,YAAA,MAAA;AAAA,UAAAC,OAAAC,OAAA;AAAAC,YAEUC,QAAO;AACXP,sBAAcQ,IAAID,IAAIJ,MAAMM,QAAQ;MACtC,GAACL,IAAA;AAAAM,eAAAN,MAAAO,aACG;QAAE,CAACZ,QAAQ,GAAG;MAAK,GAAC;QAAA,SACjB;UAAEa,SAAS;QAAO;MAAC,CAAA,GAAA,OAAA,KAAA;AAAA,aAAAR;IAAA,GAAA;EAGhC;AAEA,WAASS,YAAYC,cAAwE;AAC3F,QAAIA,aAAaC,WAAW,EAAG,QAAOC;AACtC,UAAMT,KAAKO,aAAa,CAAC;AACzB,QAAIP,cAAcU,aAAa;AAC7B,aAAOjB,cAAckB,IAAIX,EAAE;IAC7B;AACA,WAAOS;EACT;AAEA,SAAO;IAAEd;IAAcW;EAAY;AACrC;",
5
- "names": ["createItemTemplate", "dataAttr", "templateFnMap", "WeakMap", "TemplateSlot", "props", "_el$", "_tmpl$", "_$use", "el", "set", "children", "_$spread", "_$mergeProps", "display", "getTemplate", "slotElements", "length", "undefined", "HTMLElement", "get"]
6
- }
@@ -1,51 +0,0 @@
1
- import "@simplysm/core-common";
2
- import { type Accessor, createMemo } from "solid-js";
3
- import type { JSX } from "solid-js/jsx-runtime";
4
-
5
- /**
6
- * children을 slot 키 기준으로 분리하여 반환합니다.
7
- * SolidJS의 splitProps와 유사한 패턴으로 동작합니다.
8
- *
9
- * @param resolved - children(() => props.children)으로 생성된 resolved children
10
- * @param keys - 분리할 slot 키 배열 (camelCase, data 속성과 매칭)
11
- * @returns [slots, content] - slots는 각 키별 HTMLElement[], content는 나머지 JSX.Element[]
12
- *
13
- * @example
14
- * ```tsx
15
- * const resolved = children(() => props.children);
16
- * const [slots, content] = splitSlots(resolved, ["selectHeader", "selectAction"] as const);
17
- *
18
- * // JSX에서 사용
19
- * <div>{slots().selectHeader.single()}</div>
20
- * <div>{content()}</div>
21
- * ```
22
- */
23
- export function splitSlots<K extends string>(
24
- resolved: { toArray: () => unknown[] },
25
- keys: readonly K[],
26
- ): [Accessor<Record<K, HTMLElement[]>>, Accessor<JSX.Element[]>] {
27
- const memo = createMemo(() => {
28
- const arr = resolved.toArray();
29
- const result = Object.fromEntries(keys.map((k) => [k, []])) as unknown as Record<
30
- K,
31
- HTMLElement[]
32
- >;
33
- const content: JSX.Element[] = [];
34
-
35
- for (const c of arr) {
36
- if (c instanceof HTMLElement) {
37
- const matchedKey = keys.find((k) => k in c.dataset);
38
- if (matchedKey !== undefined) {
39
- result[matchedKey].push(c);
40
- continue;
41
- }
42
- }
43
- content.push(c as JSX.Element);
44
- }
45
-
46
- return { result, content };
47
- });
48
-
49
- // eslint-disable-next-line solid/reactivity -- 반환된 accessor는 JSX나 tracked scope에서 호출됨
50
- return [() => memo().result, () => memo().content];
51
- }
@@ -1,42 +0,0 @@
1
- import type { JSX } from "solid-js";
2
-
3
- /**
4
- * WeakMap 기반 템플릿 슬롯 패턴을 생성합니다. SolidJS children을 통해 렌더 함수를 전달할 때 사용합니다.
5
- *
6
- * Select와 Combobox의 ItemTemplate 서브 컴포넌트 패턴에서 사용됩니다.
7
- * TemplateSlot은 WeakMap에 렌더 함수를 ref로 저장하는 숨겨진 span을 렌더링합니다.
8
- * getTemplate은 resolved 슬롯 엘리먼트에서 렌더 함수를 가져옵니다.
9
- *
10
- * @param dataAttr - 숨겨진 span에 사용할 HTML 속성 이름 (예: "data-select-item-template")
11
- */
12
- export function createItemTemplate<TArgs extends unknown[]>(
13
- dataAttr: string,
14
- ): {
15
- TemplateSlot: (props: { children(...args: TArgs): JSX.Element }) => JSX.Element;
16
- getTemplate: (slotElements: Element[]) => ((...args: TArgs) => JSX.Element) | undefined;
17
- } {
18
- const templateFnMap = new WeakMap<HTMLElement, (...args: TArgs) => JSX.Element>();
19
-
20
- function TemplateSlot(props: { children(...args: TArgs): JSX.Element }): JSX.Element {
21
- return (
22
- <span
23
- ref={(el) => {
24
- templateFnMap.set(el, props.children);
25
- }}
26
- {...{ [dataAttr]: true }}
27
- style={{ display: "none" }}
28
- />
29
- );
30
- }
31
-
32
- function getTemplate(slotElements: Element[]): ((...args: TArgs) => JSX.Element) | undefined {
33
- if (slotElements.length === 0) return undefined;
34
- const el = slotElements[0];
35
- if (el instanceof HTMLElement) {
36
- return templateFnMap.get(el);
37
- }
38
- return undefined;
39
- }
40
-
41
- return { TemplateSlot, getTemplate };
42
- }