@simplysm/solid 13.0.53 → 13.0.55
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/sheet/DataSheet.css +28 -10
- package/dist/components/form-control/Invalid.js +1 -1
- package/dist/components/form-control/combobox/Combobox.d.ts.map +1 -1
- package/dist/components/form-control/combobox/Combobox.js +1 -1
- package/dist/components/form-control/combobox/Combobox.js.map +1 -1
- package/dist/components/form-control/field/DatePicker.d.ts.map +1 -1
- package/dist/components/form-control/field/DatePicker.js +3 -2
- package/dist/components/form-control/field/DatePicker.js.map +2 -2
- package/dist/components/form-control/field/DateTimePicker.d.ts.map +1 -1
- package/dist/components/form-control/field/DateTimePicker.js +3 -2
- package/dist/components/form-control/field/DateTimePicker.js.map +2 -2
- package/dist/components/form-control/field/NumberInput.d.ts.map +1 -1
- package/dist/components/form-control/field/NumberInput.js +1 -1
- package/dist/components/form-control/field/NumberInput.js.map +1 -1
- package/dist/components/form-control/field/TextInput.js +2 -2
- package/dist/components/form-control/field/TextInput.js.map +1 -1
- package/dist/components/form-control/field/TimePicker.d.ts.map +1 -1
- package/dist/components/form-control/field/TimePicker.js +3 -2
- package/dist/components/form-control/field/TimePicker.js.map +2 -2
- package/dist/components/form-control/state-preset/StatePreset.d.ts.map +1 -1
- package/dist/components/form-control/state-preset/StatePreset.js +1 -1
- package/dist/components/form-control/state-preset/StatePreset.js.map +1 -1
- package/dist/components/layout/topbar/Topbar.d.ts +2 -0
- package/dist/components/layout/topbar/Topbar.d.ts.map +1 -1
- package/dist/components/layout/topbar/Topbar.js +2 -0
- package/dist/components/layout/topbar/Topbar.js.map +2 -2
- package/dist/components/layout/topbar/TopbarActions.d.ts +3 -0
- package/dist/components/layout/topbar/TopbarActions.d.ts.map +1 -0
- package/dist/components/layout/topbar/TopbarActions.js +17 -0
- package/dist/components/layout/topbar/TopbarActions.js.map +6 -0
- package/dist/components/layout/topbar/TopbarContainer.d.ts +1 -1
- package/dist/components/layout/topbar/TopbarContainer.d.ts.map +1 -1
- package/dist/components/layout/topbar/TopbarContainer.js +21 -12
- package/dist/components/layout/topbar/TopbarContainer.js.map +2 -2
- package/dist/components/layout/topbar/TopbarContext.d.ts +9 -0
- package/dist/components/layout/topbar/TopbarContext.d.ts.map +1 -0
- package/dist/components/layout/topbar/TopbarContext.js +29 -0
- package/dist/components/layout/topbar/TopbarContext.js.map +6 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/docs/layout.md +70 -1
- package/package.json +3 -3
- package/src/components/data/sheet/DataSheet.css +28 -10
- package/src/components/form-control/Invalid.tsx +1 -1
- package/src/components/form-control/combobox/Combobox.tsx +1 -0
- package/src/components/form-control/field/DatePicker.tsx +4 -1
- package/src/components/form-control/field/DateTimePicker.tsx +3 -0
- package/src/components/form-control/field/NumberInput.tsx +2 -0
- package/src/components/form-control/field/TextInput.tsx +2 -2
- package/src/components/form-control/field/TimePicker.tsx +3 -0
- package/src/components/form-control/state-preset/StatePreset.tsx +1 -0
- package/src/components/layout/topbar/Topbar.tsx +3 -0
- package/src/components/layout/topbar/TopbarActions.tsx +8 -0
- package/src/components/layout/topbar/TopbarContainer.tsx +9 -5
- package/src/components/layout/topbar/TopbarContext.ts +36 -0
- package/src/index.ts +1 -0
|
@@ -11,6 +11,7 @@ import { Icon } from "../../display/Icon.js";
|
|
|
11
11
|
import { twMerge } from "tailwind-merge";
|
|
12
12
|
import { Button } from "../../form-control/Button.js";
|
|
13
13
|
import { useSidebarContextOptional } from "../sidebar/SidebarContext.js";
|
|
14
|
+
import { TopbarActions } from "./TopbarActions.js";
|
|
14
15
|
import { TopbarContainer } from "./TopbarContainer.js";
|
|
15
16
|
import { TopbarMenu } from "./TopbarMenu.js";
|
|
16
17
|
import { TopbarUser } from "./TopbarUser.js";
|
|
@@ -72,6 +73,7 @@ const TopbarBase = (props) => {
|
|
|
72
73
|
})();
|
|
73
74
|
};
|
|
74
75
|
const Topbar = TopbarBase;
|
|
76
|
+
Topbar.Actions = TopbarActions;
|
|
75
77
|
Topbar.Container = TopbarContainer;
|
|
76
78
|
Topbar.Menu = TopbarMenu;
|
|
77
79
|
Topbar.User = TopbarUser;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/components/layout/topbar/Topbar.tsx"],
|
|
4
|
-
"mappings": ";;;;;;AAAA,SAAyCA,YAAYC,YAAY;AACjE,SAASC,iBAAiB;AAC1B,OAAOC,UAAU;AACjB,SAASC,YAAY;AACrB,SAASC,eAAe;AACxB,SAASC,cAAc;AACvB,SAASC,iCAAiC;AAC1C,SAASC,uBAAuB;AAChC,SAASC,kBAAkB;AAC3B,SAASC,kBAAkB;AAM3B,MAAMC,
|
|
5
|
-
"names": ["splitProps", "Show", "IconMenu2", "clsx", "Icon", "twMerge", "Button", "useSidebarContextOptional", "TopbarContainer", "TopbarMenu", "TopbarUser", "baseClass", "TopbarBase", "props", "local", "rest", "sidebarContext", "handleToggle", "setToggle", "v", "getClassName", "class", "_el$", "_tmpl$", "_$spread", "_$mergeProps", "_$insert", "_$createComponent", "when", "children", "variant", "onClick", "icon", "size", "Topbar", "Container", "Menu", "User"]
|
|
4
|
+
"mappings": ";;;;;;AAAA,SAAyCA,YAAYC,YAAY;AACjE,SAASC,iBAAiB;AAC1B,OAAOC,UAAU;AACjB,SAASC,YAAY;AACrB,SAASC,eAAe;AACxB,SAASC,cAAc;AACvB,SAASC,iCAAiC;AAC1C,SAASC,qBAAqB;AAC9B,SAASC,uBAAuB;AAChC,SAASC,kBAAkB;AAC3B,SAASC,kBAAkB;AAM3B,MAAMC,YAAYT;;EAEhB;EACA;EACA;EACA;;EAEA;EACA;;EAEA;EACA;EACA;EACA;EACA;;EAEA;EACA;;EAEA;AACF;AA+BA,MAAMU,aAA4CC,WAAU;AAC1D,QAAM,CAACC,OAAOC,IAAI,IAAIhB,WAAWc,OAAO,CAAC,YAAY,OAAO,CAAC;AAG7D,QAAMG,iBAAiBV,0BAA0B;AAEjD,QAAMW,eAAeA,MAAM;AACzBD,qDAAgBE,UAAWC,OAAM,CAACA;EACpC;AAEA,QAAMC,eAAeA,MAAMhB,QAAQO,WAAWG,MAAMO,KAAK;AAEzD,UAAA,MAAA;AAAA,QAAAC,OAAAC,OAAA;AAAAC,aAAAF,MAAAG,aACcV,MAAI;MAAA,eAAA;MAAA,KAAA,OAAA,IAAA;AAAA,eAAqBK,aAAa;MAAC;IAAA,CAAA,GAAA,OAAA,IAAA;AAAAM,aAAAJ,MAAAK,kBAChD3B,MAAI;MAAC4B,MAAMZ;MAAc,IAAAa,WAAA;AAAA,eAAAF,kBACvBtB,QAAM;UAACyB,SAAO;UAASC,SAASd;UAAY,SAAA;UAAA,cAAA;UAAA,IAAAY,WAAA;AAAA,mBAAAF,kBAC1CxB,MAAI;cAAC6B,MAAM/B;cAAWgC,MAAI;YAAA,CAAA;UAAA;QAAA,CAAA;MAAA;IAAA,CAAA,GAAA,IAAA;AAAAP,aAAAJ,MAAA,MAG9BR,MAAMe,UAAQ,IAAA;AAAA,WAAAP;EAAA,GAAA;AAGrB;AAEO,MAAMY,SAAStB;AACtBsB,OAAOC,UAAU5B;AACjB2B,OAAOE,YAAY5B;AACnB0B,OAAOG,OAAO5B;AACdyB,OAAOI,OAAO5B;",
|
|
5
|
+
"names": ["splitProps", "Show", "IconMenu2", "clsx", "Icon", "twMerge", "Button", "useSidebarContextOptional", "TopbarActions", "TopbarContainer", "TopbarMenu", "TopbarUser", "baseClass", "TopbarBase", "props", "local", "rest", "sidebarContext", "handleToggle", "setToggle", "v", "getClassName", "class", "_el$", "_tmpl$", "_$spread", "_$mergeProps", "_$insert", "_$createComponent", "when", "children", "variant", "onClick", "icon", "size", "Topbar", "Actions", "Container", "Menu", "User"]
|
|
6
6
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TopbarActions.d.ts","sourceRoot":"","sources":["..\\..\\..\\..\\src\\components\\layout\\topbar\\TopbarActions.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAc,MAAM,UAAU,CAAC;AAGtD,eAAO,MAAM,aAAa,EAAE,SAI3B,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { template as _$template } from "solid-js/web";
|
|
2
|
+
import { insert as _$insert } from "solid-js/web";
|
|
3
|
+
var _tmpl$ = /* @__PURE__ */ _$template(`<span data-topbar-actions>`);
|
|
4
|
+
import { useContext } from "solid-js";
|
|
5
|
+
import { TopbarContext } from "./TopbarContext.js";
|
|
6
|
+
const TopbarActions = () => {
|
|
7
|
+
const context = useContext(TopbarContext);
|
|
8
|
+
return (() => {
|
|
9
|
+
var _el$ = _tmpl$();
|
|
10
|
+
_$insert(_el$, () => context == null ? void 0 : context.actions());
|
|
11
|
+
return _el$;
|
|
12
|
+
})();
|
|
13
|
+
};
|
|
14
|
+
export {
|
|
15
|
+
TopbarActions
|
|
16
|
+
};
|
|
17
|
+
//# sourceMappingURL=TopbarActions.js.map
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/components/layout/topbar/TopbarActions.tsx"],
|
|
4
|
+
"mappings": ";;;AAAA,SAAyBA,kBAAkB;AAC3C,SAASC,qBAAqB;AAEvB,MAAMC,gBAA2BA,MAAM;AAC5C,QAAMC,UAAUH,WAAWC,aAAa;AAExC,UAAA,MAAA;AAAA,QAAAG,OAAAC,OAAA;AAAAC,aAAAF,MAAA,MAAkCD,mCAASI,SAAS;AAAA,WAAAH;EAAA,GAAA;AACtD;",
|
|
5
|
+
"names": ["useContext", "TopbarContext", "TopbarActions", "context", "_el$", "_tmpl$", "_$insert", "actions"]
|
|
6
|
+
}
|
|
@@ -7,7 +7,7 @@ export interface TopbarContainerProps extends JSX.HTMLAttributes<HTMLDivElement>
|
|
|
7
7
|
*
|
|
8
8
|
* @remarks
|
|
9
9
|
* - `flex flex-col h-full` 구조로 Topbar와 콘텐츠를 수직 배치
|
|
10
|
-
* -
|
|
10
|
+
* - TopbarContext.Provider로 actions 상태 공유
|
|
11
11
|
* - 부모 요소에 높이가 지정되어야 함
|
|
12
12
|
*
|
|
13
13
|
* @example
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TopbarContainer.d.ts","sourceRoot":"","sources":["..\\..\\..\\..\\src\\components\\layout\\topbar\\TopbarContainer.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,GAAG,EAAE,KAAK,eAAe,
|
|
1
|
+
{"version":3,"file":"TopbarContainer.d.ts","sourceRoot":"","sources":["..\\..\\..\\..\\src\\components\\layout\\topbar\\TopbarContainer.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,GAAG,EAAE,KAAK,eAAe,EAA4B,MAAM,UAAU,CAAC;AAOpF,MAAM,WAAW,oBAAqB,SAAQ,GAAG,CAAC,cAAc,CAAC,cAAc,CAAC;IAC9E,QAAQ,EAAE,GAAG,CAAC,OAAO,CAAC;CACvB;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,eAAe,EAAE,eAAe,CAAC,oBAAoB,CAajE,CAAC"}
|
|
@@ -1,26 +1,35 @@
|
|
|
1
1
|
import { template as _$template } from "solid-js/web";
|
|
2
|
+
import { createComponent as _$createComponent } from "solid-js/web";
|
|
2
3
|
import { insert as _$insert } from "solid-js/web";
|
|
3
4
|
import { spread as _$spread } from "solid-js/web";
|
|
4
5
|
import { mergeProps as _$mergeProps } from "solid-js/web";
|
|
5
6
|
var _tmpl$ = /* @__PURE__ */ _$template(`<div>`);
|
|
6
|
-
import { splitProps } from "solid-js";
|
|
7
|
+
import { splitProps, createSignal } from "solid-js";
|
|
7
8
|
import clsx from "clsx";
|
|
8
9
|
import { twMerge } from "tailwind-merge";
|
|
10
|
+
import { TopbarContext } from "./TopbarContext.js";
|
|
9
11
|
const containerClass = clsx("flex h-full flex-col");
|
|
10
12
|
const TopbarContainer = (props) => {
|
|
11
13
|
const [local, rest] = splitProps(props, ["children", "class"]);
|
|
14
|
+
const [actions, setActions] = createSignal(void 0);
|
|
12
15
|
const getClassName = () => twMerge(containerClass, local.class);
|
|
13
|
-
return (
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
16
|
+
return _$createComponent(TopbarContext.Provider, {
|
|
17
|
+
value: {
|
|
18
|
+
actions,
|
|
19
|
+
setActions
|
|
20
|
+
},
|
|
21
|
+
get children() {
|
|
22
|
+
var _el$ = _tmpl$();
|
|
23
|
+
_$spread(_el$, _$mergeProps(rest, {
|
|
24
|
+
"data-topbar-container": "",
|
|
25
|
+
get ["class"]() {
|
|
26
|
+
return getClassName();
|
|
27
|
+
}
|
|
28
|
+
}), false, true);
|
|
29
|
+
_$insert(_el$, () => local.children);
|
|
30
|
+
return _el$;
|
|
31
|
+
}
|
|
32
|
+
});
|
|
24
33
|
};
|
|
25
34
|
export {
|
|
26
35
|
TopbarContainer
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/components/layout/topbar/TopbarContainer.tsx"],
|
|
4
|
-
"mappings": "
|
|
5
|
-
"names": ["splitProps", "clsx", "twMerge", "containerClass", "TopbarContainer", "props", "local", "rest", "getClassName", "class", "_el$", "_tmpl$", "_$spread", "_$mergeProps", "_$insert"
|
|
4
|
+
"mappings": ";;;;;;AAAA,SAAyCA,YAAYC,oBAAoB;AACzE,OAAOC,UAAU;AACjB,SAASC,eAAe;AACxB,SAASC,qBAAqB;AAE9B,MAAMC,iBAAiBH,KAAK,sBAAsB;AAyB3C,MAAMI,kBAA0DC,WAAU;AAC/E,QAAM,CAACC,OAAOC,IAAI,IAAIT,WAAWO,OAAO,CAAC,YAAY,OAAO,CAAC;AAC7D,QAAM,CAACG,SAASC,UAAU,IAAIV,aAAsCW,MAAS;AAE7E,QAAMC,eAAeA,MAAMV,QAAQE,gBAAgBG,MAAMM,KAAK;AAE9D,SAAAC,kBACGX,cAAcY,UAAQ;IAACC,OAAO;MAAEP;MAASC;IAAW;IAAC,IAAAO,WAAA;AAAA,UAAAC,OAAAC,OAAA;AAAAC,eAAAF,MAAAG,aAC3Cb,MAAI;QAAA,yBAAA;QAAA,KAAA,OAAA,IAAA;AAAA,iBAA+BI,aAAa;QAAC;MAAA,CAAA,GAAA,OAAA,IAAA;AAAAU,eAAAJ,MAAA,MACvDX,MAAMU,QAAQ;AAAA,aAAAC;IAAA;EAAA,CAAA;AAIvB;",
|
|
5
|
+
"names": ["splitProps", "createSignal", "clsx", "twMerge", "TopbarContext", "containerClass", "TopbarContainer", "props", "local", "rest", "actions", "setActions", "undefined", "getClassName", "class", "_$createComponent", "Provider", "value", "children", "_el$", "_tmpl$", "_$spread", "_$mergeProps", "_$insert"]
|
|
6
6
|
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type Accessor, type JSX, type Setter } from "solid-js";
|
|
2
|
+
export interface TopbarContextValue {
|
|
3
|
+
actions: Accessor<JSX.Element | undefined>;
|
|
4
|
+
setActions: Setter<JSX.Element | undefined>;
|
|
5
|
+
}
|
|
6
|
+
export declare const TopbarContext: import("solid-js").Context<TopbarContextValue | undefined>;
|
|
7
|
+
export declare function useTopbarActionsAccessor(): Accessor<JSX.Element | undefined>;
|
|
8
|
+
export declare function createTopbarActions(accessor: () => JSX.Element): void;
|
|
9
|
+
//# sourceMappingURL=TopbarContext.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TopbarContext.d.ts","sourceRoot":"","sources":["..\\..\\..\\..\\src\\components\\layout\\topbar\\TopbarContext.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,QAAQ,EACb,KAAK,GAAG,EACR,KAAK,MAAM,EACZ,MAAM,UAAU,CAAC;AAElB,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,QAAQ,CAAC,GAAG,CAAC,OAAO,GAAG,SAAS,CAAC,CAAC;IAC3C,UAAU,EAAE,MAAM,CAAC,GAAG,CAAC,OAAO,GAAG,SAAS,CAAC,CAAC;CAC7C;AAED,eAAO,MAAM,aAAa,4DAAsC,CAAC;AAEjE,wBAAgB,wBAAwB,IAAI,QAAQ,CAAC,GAAG,CAAC,OAAO,GAAG,SAAS,CAAC,CAM5E;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,CAAC,OAAO,GAAG,IAAI,CAWrE"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import {
|
|
2
|
+
createContext,
|
|
3
|
+
useContext,
|
|
4
|
+
onCleanup
|
|
5
|
+
} from "solid-js";
|
|
6
|
+
const TopbarContext = createContext();
|
|
7
|
+
function useTopbarActionsAccessor() {
|
|
8
|
+
const context = useContext(TopbarContext);
|
|
9
|
+
if (!context) {
|
|
10
|
+
throw new Error("useTopbarActionsAccessor\uB294 Topbar.Container \uB0B4\uBD80\uC5D0\uC11C\uB9CC \uC0AC\uC6A9\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4");
|
|
11
|
+
}
|
|
12
|
+
return context.actions;
|
|
13
|
+
}
|
|
14
|
+
function createTopbarActions(accessor) {
|
|
15
|
+
const context = useContext(TopbarContext);
|
|
16
|
+
if (!context) {
|
|
17
|
+
throw new Error("createTopbarActions\uB294 Topbar.Container \uB0B4\uBD80\uC5D0\uC11C\uB9CC \uC0AC\uC6A9\uD560 \uC218 \uC788\uC2B5\uB2C8\uB2E4");
|
|
18
|
+
}
|
|
19
|
+
context.setActions(() => accessor());
|
|
20
|
+
onCleanup(() => {
|
|
21
|
+
context.setActions(void 0);
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
export {
|
|
25
|
+
TopbarContext,
|
|
26
|
+
createTopbarActions,
|
|
27
|
+
useTopbarActionsAccessor
|
|
28
|
+
};
|
|
29
|
+
//# sourceMappingURL=TopbarContext.js.map
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/components/layout/topbar/TopbarContext.ts"],
|
|
4
|
+
"mappings": "AAAA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OAIK;AAOA,MAAM,gBAAgB,cAAkC;AAExD,SAAS,2BAA8D;AAC5E,QAAM,UAAU,WAAW,aAAa;AACxC,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,mIAA6D;AAAA,EAC/E;AACA,SAAO,QAAQ;AACjB;AAEO,SAAS,oBAAoB,UAAmC;AACrE,QAAM,UAAU,WAAW,aAAa;AACxC,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,8HAAwD;AAAA,EAC1E;AAEA,UAAQ,WAAW,MAAM,SAAS,CAAC;AAEnC,YAAU,MAAM;AACd,YAAQ,WAAW,MAAS;AAAA,EAC9B,CAAC;AACH;",
|
|
5
|
+
"names": []
|
|
6
|
+
}
|
package/dist/index.d.ts
CHANGED
|
@@ -25,6 +25,7 @@ export * from "./components/layout/FormTable";
|
|
|
25
25
|
export * from "./components/layout/sidebar/Sidebar";
|
|
26
26
|
export * from "./components/layout/sidebar/SidebarContext";
|
|
27
27
|
export * from "./components/layout/topbar/Topbar";
|
|
28
|
+
export * from "./components/layout/topbar/TopbarContext";
|
|
28
29
|
export * from "./components/data/Table";
|
|
29
30
|
export * from "./components/data/list/List";
|
|
30
31
|
export * from "./components/data/list/ListContext";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["..\\src\\index.ts"],"names":[],"mappings":"AAGA,cAAc,kCAAkC,CAAC;AAGjD,cAAc,yCAAyC,CAAC;AAGxD,cAAc,6CAA6C,CAAC;AAG5D,cAAc,2CAA2C,CAAC;AAC1D,cAAc,6CAA6C,CAAC;AAC5D,cAAc,4CAA4C,CAAC;AAC3D,cAAc,gDAAgD,CAAC;AAC/D,cAAc,4CAA4C,CAAC;AAC3D,cAAc,0CAA0C,CAAC;AACzD,cAAc,8CAA8C,CAAC;AAG7D,cAAc,6CAA6C,CAAC;AAC5D,cAAc,oDAAoD,CAAC;AACnE,cAAc,0CAA0C,CAAC;AACzD,cAAc,kDAAkD,CAAC;AACjE,cAAc,+CAA+C,CAAC;AAG9D,cAAc,oDAAoD,CAAC;AACnE,cAAc,6DAA6D,CAAC;AAC5E,cAAc,iDAAiD,CAAC;AAChE,cAAc,yCAAyC,CAAC;AACxD,cAAc,oDAAoD,CAAC;AACnE,cAAc,uCAAuC,CAAC;AACtD,cAAc,mCAAmC,CAAC;AAMlD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,qCAAqC,CAAC;AACpD,cAAc,4CAA4C,CAAC;AAC3D,cAAc,mCAAmC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["..\\src\\index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -25,6 +25,7 @@ export * from "./components/layout/FormTable.js";
|
|
|
25
25
|
export * from "./components/layout/sidebar/Sidebar.js";
|
|
26
26
|
export * from "./components/layout/sidebar/SidebarContext.js";
|
|
27
27
|
export * from "./components/layout/topbar/Topbar.js";
|
|
28
|
+
export * from "./components/layout/topbar/TopbarContext.js";
|
|
28
29
|
export * from "./components/data/Table.js";
|
|
29
30
|
export * from "./components/data/list/List.js";
|
|
30
31
|
export * from "./components/data/list/ListContext.js";
|
package/dist/index.js.map
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/index.ts"],
|
|
4
|
-
"mappings": "AAGA,cAAc;AAGd,cAAc;AAGd,cAAc;AAGd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAGd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAGd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAMd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAMd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAMd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAMd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAOd,cAAc;AACd,cAAc;AACd,cAAc;AAGd,cAAc;AACd,cAAc;AAGd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAOd,SAAyB,eAAe,iBAAiB;AAGzD;AAAA,EAGE;AAAA,EACA;AAAA,OACK;AAGP,eAAyD;AAGzD,SAAS,gBAAgB;AAIzB;AAAA,EAEE;AAAA,EACA;AAAA,OACK;AAQP,SAAS,mBAAmB,qBAAqB;AACjD,cAAc;AAGd,cAAc;AAMd,cAAc;AACd,cAAc;AACd,cAAc;AACd,SAAS,gCAAgC;AACzC,SAAS,wBAAwB;AACjC,SAAS,6BAA6B;AACtC,SAAS,qBAAqB;AAM9B,cAAc;AACd,cAAc;AAMd,SAAS,cAAc;AAMvB,SAAS,mBAAmB;AAC5B,SAAS,kBAAkB;AAC3B,SAAS,0BAA0B;",
|
|
4
|
+
"mappings": "AAGA,cAAc;AAGd,cAAc;AAGd,cAAc;AAGd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAGd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAGd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAMd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAMd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAMd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAMd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAOd,cAAc;AACd,cAAc;AACd,cAAc;AAGd,cAAc;AACd,cAAc;AAGd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AAOd,SAAyB,eAAe,iBAAiB;AAGzD;AAAA,EAGE;AAAA,EACA;AAAA,OACK;AAGP,eAAyD;AAGzD,SAAS,gBAAgB;AAIzB;AAAA,EAEE;AAAA,EACA;AAAA,OACK;AAQP,SAAS,mBAAmB,qBAAqB;AACjD,cAAc;AAGd,cAAc;AAMd,cAAc;AACd,cAAc;AACd,cAAc;AACd,SAAS,gCAAgC;AACzC,SAAS,wBAAwB;AACjC,SAAS,6BAA6B;AACtC,SAAS,qBAAqB;AAM9B,cAAc;AACd,cAAc;AAMd,SAAS,cAAc;AAMvB,SAAS,mBAAmB;AAC5B,SAAS,kBAAkB;AAC3B,SAAS,0BAA0B;",
|
|
5
5
|
"names": []
|
|
6
6
|
}
|
package/docs/layout.md
CHANGED
|
@@ -127,10 +127,79 @@ const userMenus: TopbarUserMenu[] = [
|
|
|
127
127
|
```
|
|
128
128
|
|
|
129
129
|
**Sub-components:**
|
|
130
|
-
- `Topbar.Container` -- Container wrapping main content
|
|
130
|
+
- `Topbar.Container` -- Container wrapping topbar and main content, provides `TopbarContext`
|
|
131
|
+
- `Topbar.Actions` -- Slot outlet that renders actions registered via `createTopbarActions`
|
|
131
132
|
- `Topbar.Menu` -- Menu items list
|
|
132
133
|
- `Topbar.User` -- User menu (dropdown)
|
|
133
134
|
|
|
135
|
+
### Topbar Actions Slot
|
|
136
|
+
|
|
137
|
+
A slot pattern that lets child pages inject action buttons (save, delete, etc.) into the topbar. The parent layout defines **where** actions appear, child pages define **what** to show.
|
|
138
|
+
|
|
139
|
+
**Layout (define the slot):**
|
|
140
|
+
|
|
141
|
+
```tsx
|
|
142
|
+
import { Topbar } from "@simplysm/solid";
|
|
143
|
+
|
|
144
|
+
<Topbar.Container>
|
|
145
|
+
<Topbar>
|
|
146
|
+
<span>Title</span>
|
|
147
|
+
<Topbar.Actions />
|
|
148
|
+
<div class="flex-1" />
|
|
149
|
+
</Topbar>
|
|
150
|
+
<main class="flex-1 overflow-auto p-4">
|
|
151
|
+
{props.children}
|
|
152
|
+
</main>
|
|
153
|
+
</Topbar.Container>
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
**Child page (fill the slot):**
|
|
157
|
+
|
|
158
|
+
```tsx
|
|
159
|
+
import { createTopbarActions, Button } from "@simplysm/solid";
|
|
160
|
+
|
|
161
|
+
function UserPage() {
|
|
162
|
+
createTopbarActions(() => (
|
|
163
|
+
<>
|
|
164
|
+
<Button theme="primary">Save</Button>
|
|
165
|
+
<Button>Cancel</Button>
|
|
166
|
+
</>
|
|
167
|
+
));
|
|
168
|
+
|
|
169
|
+
return <div>...</div>;
|
|
170
|
+
}
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
When `UserPage` mounts, the buttons appear in the topbar. When it unmounts, the actions are automatically cleaned up via `onCleanup`.
|
|
174
|
+
|
|
175
|
+
**createTopbarActions(accessor: () => JSX.Element): void**
|
|
176
|
+
|
|
177
|
+
Registers actions in the nearest `Topbar.Container` scope. Automatically removes actions on component unmount. Must be called inside `Topbar.Container`.
|
|
178
|
+
|
|
179
|
+
**useTopbarActionsAccessor(): Accessor<JSX.Element | undefined>**
|
|
180
|
+
|
|
181
|
+
Returns the actions accessor directly. For advanced use cases such as building custom topbar components. Must be called inside `Topbar.Container`.
|
|
182
|
+
|
|
183
|
+
```tsx
|
|
184
|
+
import { useTopbarActionsAccessor } from "@simplysm/solid";
|
|
185
|
+
|
|
186
|
+
const actions = useTopbarActionsAccessor();
|
|
187
|
+
// actions() returns the currently registered JSX.Element or undefined
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
**TopbarContext:**
|
|
191
|
+
|
|
192
|
+
`TopbarContext` is exported for building custom topbar layouts. `Topbar.Container` wraps children with `TopbarContext.Provider`, sharing `actions` accessor and `setActions` setter.
|
|
193
|
+
|
|
194
|
+
```typescript
|
|
195
|
+
import { TopbarContext } from "@simplysm/solid";
|
|
196
|
+
|
|
197
|
+
interface TopbarContextValue {
|
|
198
|
+
actions: Accessor<JSX.Element | undefined>;
|
|
199
|
+
setActions: Setter<JSX.Element | undefined>;
|
|
200
|
+
}
|
|
201
|
+
```
|
|
202
|
+
|
|
134
203
|
**TopbarMenuItem type:**
|
|
135
204
|
|
|
136
205
|
```typescript
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@simplysm/solid",
|
|
3
|
-
"version": "13.0.
|
|
3
|
+
"version": "13.0.55",
|
|
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.
|
|
53
|
-
"@simplysm/core-common": "13.0.
|
|
52
|
+
"@simplysm/core-browser": "13.0.55",
|
|
53
|
+
"@simplysm/core-common": "13.0.55"
|
|
54
54
|
},
|
|
55
55
|
"devDependencies": {
|
|
56
56
|
"@solidjs/testing-library": "^0.8.10"
|
|
@@ -1,10 +1,27 @@
|
|
|
1
|
-
[data-sheet] tbody tr
|
|
2
|
-
|
|
1
|
+
[data-sheet] tbody tr {
|
|
2
|
+
position: relative;
|
|
3
|
+
}
|
|
4
|
+
|
|
5
|
+
/* ::after 공통 — content가 없으면 렌더링되지 않으므로 각 상태에서 content 설정 */
|
|
6
|
+
[data-sheet] tbody tr::after {
|
|
7
|
+
position: absolute;
|
|
8
|
+
top: 0;
|
|
9
|
+
right: 0;
|
|
10
|
+
bottom: 0;
|
|
11
|
+
left: 0;
|
|
12
|
+
pointer-events: none;
|
|
13
|
+
z-index: 10;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
[data-sheet] tbody tr:hover::after {
|
|
17
|
+
content: "";
|
|
18
|
+
background: rgb(0 0 0 / 3%);
|
|
3
19
|
}
|
|
4
20
|
|
|
5
21
|
/* 선택 행 시각 효과 — 호버보다 약간 더 진하게 */
|
|
6
|
-
[data-sheet] tbody tr[data-selected]
|
|
7
|
-
|
|
22
|
+
[data-sheet] tbody tr[data-selected]::after {
|
|
23
|
+
content: "";
|
|
24
|
+
background: rgb(0 0 0 / 5%);
|
|
8
25
|
}
|
|
9
26
|
|
|
10
27
|
/* 드래그 중인 행 */
|
|
@@ -13,14 +30,15 @@
|
|
|
13
30
|
}
|
|
14
31
|
|
|
15
32
|
/* inside 드롭 대상 행 */
|
|
16
|
-
[data-sheet] tbody tr[data-drag-over="inside"]
|
|
17
|
-
|
|
33
|
+
[data-sheet] tbody tr[data-drag-over="inside"]::after {
|
|
34
|
+
content: "";
|
|
35
|
+
background: rgb(59 130 246 / 10%);
|
|
18
36
|
}
|
|
19
37
|
|
|
20
|
-
.dark [data-sheet] tbody tr:hover
|
|
21
|
-
|
|
38
|
+
.dark [data-sheet] tbody tr:hover::after {
|
|
39
|
+
background: rgb(255 255 255 / 4%);
|
|
22
40
|
}
|
|
23
41
|
|
|
24
|
-
.dark [data-sheet] tbody tr[data-selected]
|
|
25
|
-
|
|
42
|
+
.dark [data-sheet] tbody tr[data-selected]::after {
|
|
43
|
+
background: rgb(255 255 255 / 6%);
|
|
26
44
|
}
|
|
@@ -19,7 +19,7 @@ export const Invalid: ParentComponent<InvalidProps> = (props) => {
|
|
|
19
19
|
"size-px opacity-0",
|
|
20
20
|
"pointer-events-none -z-10",
|
|
21
21
|
);
|
|
22
|
-
hiddenInputEl.autocomplete = "
|
|
22
|
+
hiddenInputEl.autocomplete = "one-time-code";
|
|
23
23
|
hiddenInputEl.tabIndex = -1;
|
|
24
24
|
hiddenInputEl.setAttribute("aria-hidden", "true");
|
|
25
25
|
|
|
@@ -314,6 +314,7 @@ export const Combobox: ComboboxComponent = <T,>(props: ComboboxProps<T>) => {
|
|
|
314
314
|
value={query()}
|
|
315
315
|
placeholder={currentValue === undefined ? local.placeholder : undefined}
|
|
316
316
|
disabled={local.disabled}
|
|
317
|
+
autocomplete="one-time-code"
|
|
317
318
|
onInput={handleInput}
|
|
318
319
|
/>
|
|
319
320
|
);
|
|
@@ -3,7 +3,7 @@ import { type Component, createMemo, type JSX, Show, splitProps } from "solid-js
|
|
|
3
3
|
import { twMerge } from "tailwind-merge";
|
|
4
4
|
import { DateOnly } from "@simplysm/core-common";
|
|
5
5
|
import { createControllableSignal } from "../../../hooks/createControllableSignal";
|
|
6
|
-
import { type FieldSize,
|
|
6
|
+
import { fieldInputClass, type FieldSize, getFieldWrapperClass } from "./Field.styles";
|
|
7
7
|
import { Invalid } from "../../form-control/Invalid";
|
|
8
8
|
|
|
9
9
|
type DatePickerUnit = "year" | "month" | "date";
|
|
@@ -181,6 +181,7 @@ export const DatePicker: Component<DatePickerProps> = (props) => {
|
|
|
181
181
|
disabled: local.disabled,
|
|
182
182
|
inset: local.inset,
|
|
183
183
|
includeCustomClass: includeCustomClass && local.class,
|
|
184
|
+
extra: "min-w-32",
|
|
184
185
|
});
|
|
185
186
|
|
|
186
187
|
// 편집 가능 여부
|
|
@@ -231,6 +232,7 @@ export const DatePicker: Component<DatePickerProps> = (props) => {
|
|
|
231
232
|
title={local.title}
|
|
232
233
|
min={formatDateValue(local.min, fieldType())}
|
|
233
234
|
max={formatDateValue(local.max, fieldType())}
|
|
235
|
+
autocomplete="one-time-code"
|
|
234
236
|
onChange={handleChange}
|
|
235
237
|
/>
|
|
236
238
|
</div>
|
|
@@ -257,6 +259,7 @@ export const DatePicker: Component<DatePickerProps> = (props) => {
|
|
|
257
259
|
title={local.title}
|
|
258
260
|
min={formatDateValue(local.min, fieldType())}
|
|
259
261
|
max={formatDateValue(local.max, fieldType())}
|
|
262
|
+
autocomplete="one-time-code"
|
|
260
263
|
onChange={handleChange}
|
|
261
264
|
/>
|
|
262
265
|
</div>
|
|
@@ -176,6 +176,7 @@ export const DateTimePicker: Component<DateTimePickerProps> = (props) => {
|
|
|
176
176
|
disabled: local.disabled,
|
|
177
177
|
inset: local.inset,
|
|
178
178
|
includeCustomClass: includeCustomClass && local.class,
|
|
179
|
+
extra: "min-w-44",
|
|
179
180
|
});
|
|
180
181
|
|
|
181
182
|
// 편집 가능 여부
|
|
@@ -230,6 +231,7 @@ export const DateTimePicker: Component<DateTimePickerProps> = (props) => {
|
|
|
230
231
|
min={formatDateTimeValue(local.min, fieldType())}
|
|
231
232
|
max={formatDateTimeValue(local.max, fieldType())}
|
|
232
233
|
step={getStep()}
|
|
234
|
+
autocomplete="one-time-code"
|
|
233
235
|
onChange={handleChange}
|
|
234
236
|
/>
|
|
235
237
|
</div>
|
|
@@ -262,6 +264,7 @@ export const DateTimePicker: Component<DateTimePickerProps> = (props) => {
|
|
|
262
264
|
min={formatDateTimeValue(local.min, fieldType())}
|
|
263
265
|
max={formatDateTimeValue(local.max, fieldType())}
|
|
264
266
|
step={getStep()}
|
|
267
|
+
autocomplete="one-time-code"
|
|
265
268
|
onChange={handleChange}
|
|
266
269
|
/>
|
|
267
270
|
</div>
|
|
@@ -328,6 +328,7 @@ export const NumberInput: Component<NumberInputProps> = (props) => {
|
|
|
328
328
|
value={displayValue()}
|
|
329
329
|
placeholder={local.placeholder}
|
|
330
330
|
title={local.title}
|
|
331
|
+
autocomplete="one-time-code"
|
|
331
332
|
onInput={handleInput}
|
|
332
333
|
onFocus={handleFocus}
|
|
333
334
|
onBlur={handleBlur}
|
|
@@ -361,6 +362,7 @@ export const NumberInput: Component<NumberInputProps> = (props) => {
|
|
|
361
362
|
value={displayValue()}
|
|
362
363
|
placeholder={local.placeholder}
|
|
363
364
|
title={local.title}
|
|
365
|
+
autocomplete="one-time-code"
|
|
364
366
|
onInput={handleInput}
|
|
365
367
|
onFocus={handleFocus}
|
|
366
368
|
onBlur={handleBlur}
|
|
@@ -284,7 +284,7 @@ export const TextInput: Component<TextInputProps> = (props) => {
|
|
|
284
284
|
value={inputValue()}
|
|
285
285
|
placeholder={local.placeholder}
|
|
286
286
|
title={local.title}
|
|
287
|
-
autocomplete={local.autocomplete}
|
|
287
|
+
autocomplete={local.autocomplete ?? "one-time-code"}
|
|
288
288
|
onInput={handleInput}
|
|
289
289
|
onCompositionStart={handleCompositionStart}
|
|
290
290
|
onCompositionEnd={handleCompositionEnd}
|
|
@@ -314,7 +314,7 @@ export const TextInput: Component<TextInputProps> = (props) => {
|
|
|
314
314
|
value={inputValue()}
|
|
315
315
|
placeholder={local.placeholder}
|
|
316
316
|
title={local.title}
|
|
317
|
-
autocomplete={local.autocomplete}
|
|
317
|
+
autocomplete={local.autocomplete ?? "one-time-code"}
|
|
318
318
|
onInput={handleInput}
|
|
319
319
|
onCompositionStart={handleCompositionStart}
|
|
320
320
|
onCompositionEnd={handleCompositionEnd}
|
|
@@ -151,6 +151,7 @@ export const TimePicker: Component<TimePickerProps> = (props) => {
|
|
|
151
151
|
disabled: local.disabled,
|
|
152
152
|
inset: local.inset,
|
|
153
153
|
includeCustomClass: includeCustomClass && local.class,
|
|
154
|
+
extra: "min-w-24",
|
|
154
155
|
});
|
|
155
156
|
|
|
156
157
|
// 편집 가능 여부
|
|
@@ -203,6 +204,7 @@ export const TimePicker: Component<TimePickerProps> = (props) => {
|
|
|
203
204
|
value={displayValue()}
|
|
204
205
|
title={local.title}
|
|
205
206
|
step={getStep()}
|
|
207
|
+
autocomplete="one-time-code"
|
|
206
208
|
onChange={handleChange}
|
|
207
209
|
/>
|
|
208
210
|
</div>
|
|
@@ -228,6 +230,7 @@ export const TimePicker: Component<TimePickerProps> = (props) => {
|
|
|
228
230
|
value={displayValue()}
|
|
229
231
|
title={local.title}
|
|
230
232
|
step={getStep()}
|
|
233
|
+
autocomplete="one-time-code"
|
|
231
234
|
onChange={handleChange}
|
|
232
235
|
/>
|
|
233
236
|
</div>
|
|
@@ -289,6 +289,7 @@ function StatePresetInner<TValue>(props: StatePresetProps<TValue>): JSX.Element
|
|
|
289
289
|
type="text"
|
|
290
290
|
class={resolvedInputClass()}
|
|
291
291
|
placeholder="이름..."
|
|
292
|
+
autocomplete="one-time-code"
|
|
292
293
|
value={inputValue()}
|
|
293
294
|
onInput={(e) => setInputValue(e.currentTarget.value)}
|
|
294
295
|
onKeyDown={handleInputKeyDown}
|
|
@@ -5,6 +5,7 @@ import { Icon } from "../../display/Icon";
|
|
|
5
5
|
import { twMerge } from "tailwind-merge";
|
|
6
6
|
import { Button } from "../../form-control/Button";
|
|
7
7
|
import { useSidebarContextOptional } from "../sidebar/SidebarContext";
|
|
8
|
+
import { TopbarActions } from "./TopbarActions";
|
|
8
9
|
import { TopbarContainer } from "./TopbarContainer";
|
|
9
10
|
import { TopbarMenu } from "./TopbarMenu";
|
|
10
11
|
import { TopbarUser } from "./TopbarUser";
|
|
@@ -58,6 +59,7 @@ export interface TopbarProps extends JSX.HTMLAttributes<HTMLElement> {
|
|
|
58
59
|
* ```
|
|
59
60
|
*/
|
|
60
61
|
interface TopbarComponent extends ParentComponent<TopbarProps> {
|
|
62
|
+
Actions: typeof TopbarActions;
|
|
61
63
|
Container: typeof TopbarContainer;
|
|
62
64
|
Menu: typeof TopbarMenu;
|
|
63
65
|
User: typeof TopbarUser;
|
|
@@ -88,6 +90,7 @@ const TopbarBase: ParentComponent<TopbarProps> = (props) => {
|
|
|
88
90
|
};
|
|
89
91
|
|
|
90
92
|
export const Topbar = TopbarBase as TopbarComponent;
|
|
93
|
+
Topbar.Actions = TopbarActions;
|
|
91
94
|
Topbar.Container = TopbarContainer;
|
|
92
95
|
Topbar.Menu = TopbarMenu;
|
|
93
96
|
Topbar.User = TopbarUser;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type Component, useContext } from "solid-js";
|
|
2
|
+
import { TopbarContext } from "./TopbarContext";
|
|
3
|
+
|
|
4
|
+
export const TopbarActions: Component = () => {
|
|
5
|
+
const context = useContext(TopbarContext);
|
|
6
|
+
|
|
7
|
+
return <span data-topbar-actions>{context?.actions()}</span>;
|
|
8
|
+
};
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import { type JSX, type ParentComponent, splitProps } from "solid-js";
|
|
1
|
+
import { type JSX, type ParentComponent, splitProps, createSignal } from "solid-js";
|
|
2
2
|
import clsx from "clsx";
|
|
3
3
|
import { twMerge } from "tailwind-merge";
|
|
4
|
+
import { TopbarContext } from "./TopbarContext";
|
|
4
5
|
|
|
5
6
|
const containerClass = clsx("flex h-full flex-col");
|
|
6
7
|
|
|
@@ -13,7 +14,7 @@ export interface TopbarContainerProps extends JSX.HTMLAttributes<HTMLDivElement>
|
|
|
13
14
|
*
|
|
14
15
|
* @remarks
|
|
15
16
|
* - `flex flex-col h-full` 구조로 Topbar와 콘텐츠를 수직 배치
|
|
16
|
-
* -
|
|
17
|
+
* - TopbarContext.Provider로 actions 상태 공유
|
|
17
18
|
* - 부모 요소에 높이가 지정되어야 함
|
|
18
19
|
*
|
|
19
20
|
* @example
|
|
@@ -29,12 +30,15 @@ export interface TopbarContainerProps extends JSX.HTMLAttributes<HTMLDivElement>
|
|
|
29
30
|
*/
|
|
30
31
|
export const TopbarContainer: ParentComponent<TopbarContainerProps> = (props) => {
|
|
31
32
|
const [local, rest] = splitProps(props, ["children", "class"]);
|
|
33
|
+
const [actions, setActions] = createSignal<JSX.Element | undefined>(undefined);
|
|
32
34
|
|
|
33
35
|
const getClassName = () => twMerge(containerClass, local.class);
|
|
34
36
|
|
|
35
37
|
return (
|
|
36
|
-
<
|
|
37
|
-
{
|
|
38
|
-
|
|
38
|
+
<TopbarContext.Provider value={{ actions, setActions }}>
|
|
39
|
+
<div {...rest} data-topbar-container class={getClassName()}>
|
|
40
|
+
{local.children}
|
|
41
|
+
</div>
|
|
42
|
+
</TopbarContext.Provider>
|
|
39
43
|
);
|
|
40
44
|
};
|