@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.
- package/README.md +3 -1
- package/dist/components/data/crud-detail/CrudDetail.d.ts +14 -0
- package/dist/components/data/crud-detail/CrudDetail.d.ts.map +1 -0
- package/dist/components/data/crud-detail/CrudDetail.js +348 -0
- package/dist/components/data/crud-detail/CrudDetail.js.map +6 -0
- package/dist/components/data/crud-detail/CrudDetailAfter.d.ts +7 -0
- package/dist/components/data/crud-detail/CrudDetailAfter.d.ts.map +1 -0
- package/dist/components/data/crud-detail/CrudDetailAfter.js +14 -0
- package/dist/components/data/crud-detail/CrudDetailAfter.js.map +6 -0
- package/dist/components/data/crud-detail/CrudDetailBefore.d.ts +7 -0
- package/dist/components/data/crud-detail/CrudDetailBefore.d.ts.map +1 -0
- package/dist/components/data/crud-detail/CrudDetailBefore.js +14 -0
- package/dist/components/data/crud-detail/CrudDetailBefore.js.map +6 -0
- package/dist/components/data/crud-detail/CrudDetailTools.d.ts +7 -0
- package/dist/components/data/crud-detail/CrudDetailTools.d.ts.map +1 -0
- package/dist/components/data/crud-detail/CrudDetailTools.js +14 -0
- package/dist/components/data/crud-detail/CrudDetailTools.js.map +6 -0
- package/dist/components/data/crud-detail/types.d.ts +45 -0
- package/dist/components/data/crud-detail/types.d.ts.map +1 -0
- package/dist/components/data/crud-detail/types.js +1 -0
- package/dist/components/data/crud-detail/types.js.map +6 -0
- package/dist/components/data/crud-sheet/CrudSheet.d.ts +17 -0
- package/dist/components/data/crud-sheet/CrudSheet.d.ts.map +1 -0
- package/dist/components/data/crud-sheet/CrudSheet.js +679 -0
- package/dist/components/data/crud-sheet/CrudSheet.js.map +6 -0
- package/dist/components/data/crud-sheet/CrudSheetColumn.d.ts +5 -0
- package/dist/components/data/crud-sheet/CrudSheetColumn.d.ts.map +1 -0
- package/dist/components/data/crud-sheet/CrudSheetColumn.js +29 -0
- package/dist/components/data/crud-sheet/CrudSheetColumn.js.map +6 -0
- package/dist/components/data/crud-sheet/CrudSheetFilter.d.ts +7 -0
- package/dist/components/data/crud-sheet/CrudSheetFilter.d.ts.map +1 -0
- package/dist/components/data/crud-sheet/CrudSheetFilter.js +14 -0
- package/dist/components/data/crud-sheet/CrudSheetFilter.js.map +6 -0
- package/dist/components/data/crud-sheet/CrudSheetHeader.d.ts +7 -0
- package/dist/components/data/crud-sheet/CrudSheetHeader.d.ts.map +1 -0
- package/dist/components/data/crud-sheet/CrudSheetHeader.js +14 -0
- package/dist/components/data/crud-sheet/CrudSheetHeader.js.map +6 -0
- package/dist/components/data/crud-sheet/CrudSheetTools.d.ts +7 -0
- package/dist/components/data/crud-sheet/CrudSheetTools.d.ts.map +1 -0
- package/dist/components/data/crud-sheet/CrudSheetTools.js +14 -0
- package/dist/components/data/crud-sheet/CrudSheetTools.js.map +6 -0
- package/dist/components/data/crud-sheet/types.d.ts +109 -0
- package/dist/components/data/crud-sheet/types.d.ts.map +1 -0
- package/dist/components/data/crud-sheet/types.js +1 -0
- package/dist/components/data/crud-sheet/types.js.map +6 -0
- package/dist/components/data/kanban/Kanban.d.ts.map +1 -1
- package/dist/components/data/kanban/Kanban.js +137 -138
- package/dist/components/data/kanban/Kanban.js.map +2 -2
- package/dist/components/data/kanban/KanbanContext.d.ts +5 -1
- package/dist/components/data/kanban/KanbanContext.d.ts.map +1 -1
- package/dist/components/data/kanban/KanbanContext.js.map +1 -1
- package/dist/components/data/list/ListItem.d.ts.map +1 -1
- package/dist/components/data/list/ListItem.js +109 -99
- package/dist/components/data/list/ListItem.js.map +2 -2
- package/dist/components/data/sheet/DataSheet.js +1 -1
- 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 +1 -1
- package/dist/components/data/sheet/DataSheet.styles.js.map +1 -1
- package/dist/components/disclosure/Dialog.d.ts +16 -10
- package/dist/components/disclosure/Dialog.d.ts.map +1 -1
- package/dist/components/disclosure/Dialog.js +126 -91
- package/dist/components/disclosure/Dialog.js.map +2 -2
- package/dist/components/disclosure/DialogContext.d.ts +2 -4
- package/dist/components/disclosure/DialogContext.d.ts.map +1 -1
- package/dist/components/disclosure/DialogContext.js.map +1 -1
- package/dist/components/disclosure/DialogProvider.d.ts.map +1 -1
- package/dist/components/disclosure/DialogProvider.js +14 -9
- package/dist/components/disclosure/DialogProvider.js.map +2 -2
- package/dist/components/disclosure/Dropdown.d.ts +46 -22
- package/dist/components/disclosure/Dropdown.d.ts.map +1 -1
- package/dist/components/disclosure/Dropdown.js +100 -65
- package/dist/components/disclosure/Dropdown.js.map +2 -2
- package/dist/components/feedback/notification/NotificationBanner.d.ts.map +1 -1
- package/dist/components/feedback/notification/NotificationBanner.js +3 -3
- package/dist/components/feedback/notification/NotificationBanner.js.map +1 -1
- package/dist/components/feedback/notification/NotificationBell.d.ts.map +1 -1
- package/dist/components/feedback/notification/NotificationBell.js +84 -84
- package/dist/components/feedback/notification/NotificationBell.js.map +2 -2
- package/dist/components/form-control/combobox/Combobox.d.ts +6 -3
- package/dist/components/form-control/combobox/Combobox.d.ts.map +1 -1
- package/dist/components/form-control/combobox/Combobox.js +150 -168
- package/dist/components/form-control/combobox/Combobox.js.map +2 -2
- package/dist/components/form-control/combobox/ComboboxContext.d.ts +3 -0
- package/dist/components/form-control/combobox/ComboboxContext.d.ts.map +1 -1
- package/dist/components/form-control/combobox/ComboboxContext.js.map +1 -1
- package/dist/components/form-control/date-range-picker/DateRangePicker.d.ts +0 -2
- package/dist/components/form-control/date-range-picker/DateRangePicker.d.ts.map +1 -1
- package/dist/components/form-control/date-range-picker/DateRangePicker.js +9 -17
- package/dist/components/form-control/date-range-picker/DateRangePicker.js.map +2 -2
- package/dist/components/form-control/field/Field.styles.d.ts.map +1 -1
- package/dist/components/form-control/field/Field.styles.js +2 -1
- package/dist/components/form-control/field/Field.styles.js.map +1 -1
- package/dist/components/form-control/field/NumberInput.d.ts +15 -5
- package/dist/components/form-control/field/NumberInput.d.ts.map +1 -1
- package/dist/components/form-control/field/NumberInput.js +181 -141
- package/dist/components/form-control/field/NumberInput.js.map +2 -2
- package/dist/components/form-control/field/TextInput.d.ts +9 -5
- package/dist/components/form-control/field/TextInput.d.ts.map +1 -1
- package/dist/components/form-control/field/TextInput.js +199 -154
- package/dist/components/form-control/field/TextInput.js.map +2 -2
- package/dist/components/form-control/select/Select.d.ts +3 -3
- package/dist/components/form-control/select/Select.d.ts.map +1 -1
- package/dist/components/form-control/select/Select.js +116 -100
- package/dist/components/form-control/select/Select.js.map +2 -2
- package/dist/components/form-control/select/SelectContext.d.ts +9 -1
- package/dist/components/form-control/select/SelectContext.d.ts.map +1 -1
- package/dist/components/form-control/select/SelectContext.js.map +1 -1
- package/dist/components/form-control/select/SelectItem.d.ts.map +1 -1
- package/dist/components/form-control/select/SelectItem.js +77 -67
- package/dist/components/form-control/select/SelectItem.js.map +2 -2
- package/dist/components/layout/topbar/TopbarMenu.d.ts.map +1 -1
- package/dist/components/layout/topbar/TopbarMenu.js +63 -57
- package/dist/components/layout/topbar/TopbarMenu.js.map +2 -2
- package/dist/components/layout/topbar/TopbarUser.d.ts.map +1 -1
- package/dist/components/layout/topbar/TopbarUser.js +53 -54
- package/dist/components/layout/topbar/TopbarUser.js.map +2 -2
- package/dist/hooks/createControllableStore.d.ts +29 -0
- package/dist/hooks/createControllableStore.d.ts.map +1 -0
- package/dist/hooks/createControllableStore.js +19 -0
- package/dist/hooks/createControllableStore.js.map +6 -0
- package/dist/index.d.ts +5 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -2
- package/dist/index.js.map +1 -1
- package/dist/styles/patterns.styles.d.ts.map +1 -1
- package/dist/styles/patterns.styles.js +7 -1
- package/dist/styles/patterns.styles.js.map +1 -1
- package/docs/data-components.md +428 -0
- package/docs/disclosure.md +65 -35
- package/docs/form-controls.md +18 -3
- package/docs/helpers.md +0 -39
- package/docs/hooks.md +39 -0
- package/package.json +4 -3
- package/src/components/data/crud-detail/CrudDetail.tsx +346 -0
- package/src/components/data/crud-detail/CrudDetailAfter.tsx +19 -0
- package/src/components/data/crud-detail/CrudDetailBefore.tsx +19 -0
- package/src/components/data/crud-detail/CrudDetailTools.tsx +19 -0
- package/src/components/data/crud-detail/types.ts +58 -0
- package/src/components/data/crud-sheet/CrudSheet.tsx +628 -0
- package/src/components/data/crud-sheet/CrudSheetColumn.tsx +34 -0
- package/src/components/data/crud-sheet/CrudSheetFilter.tsx +21 -0
- package/src/components/data/crud-sheet/CrudSheetHeader.tsx +19 -0
- package/src/components/data/crud-sheet/CrudSheetTools.tsx +21 -0
- package/src/components/data/crud-sheet/types.ts +133 -0
- package/src/components/data/kanban/Kanban.tsx +72 -65
- package/src/components/data/kanban/KanbanContext.ts +7 -1
- package/src/components/data/list/ListItem.tsx +31 -18
- package/src/components/data/sheet/DataSheet.styles.ts +1 -1
- package/src/components/data/sheet/DataSheet.tsx +1 -1
- package/src/components/disclosure/Dialog.tsx +143 -105
- package/src/components/disclosure/DialogContext.ts +2 -4
- package/src/components/disclosure/DialogProvider.tsx +4 -2
- package/src/components/disclosure/Dropdown.tsx +174 -86
- package/src/components/feedback/notification/NotificationBanner.tsx +3 -9
- package/src/components/feedback/notification/NotificationBell.tsx +51 -57
- package/src/components/form-control/combobox/Combobox.tsx +109 -134
- package/src/components/form-control/combobox/ComboboxContext.ts +4 -1
- package/src/components/form-control/date-range-picker/DateRangePicker.tsx +6 -16
- package/src/components/form-control/field/Field.styles.ts +1 -0
- package/src/components/form-control/field/NumberInput.tsx +131 -88
- package/src/components/form-control/field/TextInput.tsx +139 -88
- package/src/components/form-control/select/Select.tsx +85 -67
- package/src/components/form-control/select/SelectContext.ts +12 -1
- package/src/components/form-control/select/SelectItem.tsx +39 -18
- package/src/components/layout/topbar/TopbarMenu.tsx +52 -55
- package/src/components/layout/topbar/TopbarUser.tsx +28 -31
- package/src/hooks/createControllableStore.ts +47 -0
- package/src/index.ts +5 -1
- package/src/styles/patterns.styles.ts +7 -1
- package/tailwind.css +4 -0
- package/dist/helpers/splitSlots.d.ts +0 -25
- package/dist/helpers/splitSlots.d.ts.map +0 -1
- package/dist/helpers/splitSlots.js +0 -25
- package/dist/helpers/splitSlots.js.map +0 -6
- package/dist/hooks/createItemTemplate.d.ts +0 -17
- package/dist/hooks/createItemTemplate.d.ts.map +0 -1
- package/dist/hooks/createItemTemplate.js +0 -40
- package/dist/hooks/createItemTemplate.js.map +0 -6
- package/src/helpers/splitSlots.ts +0 -51
- 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(
|
|
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
|
@@ -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
|
-
}
|