@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.
Files changed (59) hide show
  1. package/README.md +3 -1
  2. package/dist/components/data/sheet/DataSheet.css +28 -10
  3. package/dist/components/form-control/Invalid.js +1 -1
  4. package/dist/components/form-control/combobox/Combobox.d.ts.map +1 -1
  5. package/dist/components/form-control/combobox/Combobox.js +1 -1
  6. package/dist/components/form-control/combobox/Combobox.js.map +1 -1
  7. package/dist/components/form-control/field/DatePicker.d.ts.map +1 -1
  8. package/dist/components/form-control/field/DatePicker.js +3 -2
  9. package/dist/components/form-control/field/DatePicker.js.map +2 -2
  10. package/dist/components/form-control/field/DateTimePicker.d.ts.map +1 -1
  11. package/dist/components/form-control/field/DateTimePicker.js +3 -2
  12. package/dist/components/form-control/field/DateTimePicker.js.map +2 -2
  13. package/dist/components/form-control/field/NumberInput.d.ts.map +1 -1
  14. package/dist/components/form-control/field/NumberInput.js +1 -1
  15. package/dist/components/form-control/field/NumberInput.js.map +1 -1
  16. package/dist/components/form-control/field/TextInput.js +2 -2
  17. package/dist/components/form-control/field/TextInput.js.map +1 -1
  18. package/dist/components/form-control/field/TimePicker.d.ts.map +1 -1
  19. package/dist/components/form-control/field/TimePicker.js +3 -2
  20. package/dist/components/form-control/field/TimePicker.js.map +2 -2
  21. package/dist/components/form-control/state-preset/StatePreset.d.ts.map +1 -1
  22. package/dist/components/form-control/state-preset/StatePreset.js +1 -1
  23. package/dist/components/form-control/state-preset/StatePreset.js.map +1 -1
  24. package/dist/components/layout/topbar/Topbar.d.ts +2 -0
  25. package/dist/components/layout/topbar/Topbar.d.ts.map +1 -1
  26. package/dist/components/layout/topbar/Topbar.js +2 -0
  27. package/dist/components/layout/topbar/Topbar.js.map +2 -2
  28. package/dist/components/layout/topbar/TopbarActions.d.ts +3 -0
  29. package/dist/components/layout/topbar/TopbarActions.d.ts.map +1 -0
  30. package/dist/components/layout/topbar/TopbarActions.js +17 -0
  31. package/dist/components/layout/topbar/TopbarActions.js.map +6 -0
  32. package/dist/components/layout/topbar/TopbarContainer.d.ts +1 -1
  33. package/dist/components/layout/topbar/TopbarContainer.d.ts.map +1 -1
  34. package/dist/components/layout/topbar/TopbarContainer.js +21 -12
  35. package/dist/components/layout/topbar/TopbarContainer.js.map +2 -2
  36. package/dist/components/layout/topbar/TopbarContext.d.ts +9 -0
  37. package/dist/components/layout/topbar/TopbarContext.d.ts.map +1 -0
  38. package/dist/components/layout/topbar/TopbarContext.js +29 -0
  39. package/dist/components/layout/topbar/TopbarContext.js.map +6 -0
  40. package/dist/index.d.ts +1 -0
  41. package/dist/index.d.ts.map +1 -1
  42. package/dist/index.js +1 -0
  43. package/dist/index.js.map +1 -1
  44. package/docs/layout.md +70 -1
  45. package/package.json +3 -3
  46. package/src/components/data/sheet/DataSheet.css +28 -10
  47. package/src/components/form-control/Invalid.tsx +1 -1
  48. package/src/components/form-control/combobox/Combobox.tsx +1 -0
  49. package/src/components/form-control/field/DatePicker.tsx +4 -1
  50. package/src/components/form-control/field/DateTimePicker.tsx +3 -0
  51. package/src/components/form-control/field/NumberInput.tsx +2 -0
  52. package/src/components/form-control/field/TextInput.tsx +2 -2
  53. package/src/components/form-control/field/TimePicker.tsx +3 -0
  54. package/src/components/form-control/state-preset/StatePreset.tsx +1 -0
  55. package/src/components/layout/topbar/Topbar.tsx +3 -0
  56. package/src/components/layout/topbar/TopbarActions.tsx +8 -0
  57. package/src/components/layout/topbar/TopbarContainer.tsx +9 -5
  58. package/src/components/layout/topbar/TopbarContext.ts +36 -0
  59. 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,YAAYR;;EAEhB;EACA;EACA;EACA;;EAEA;EACA;;EAEA;EACA;EACA;EACA;EACA;;EAEA;EACA;;EAEA;AACF;AA8BA,MAAMS,aAA4CC,WAAU;AAC1D,QAAM,CAACC,OAAOC,IAAI,IAAIf,WAAWa,OAAO,CAAC,YAAY,OAAO,CAAC;AAG7D,QAAMG,iBAAiBT,0BAA0B;AAEjD,QAAMU,eAAeA,MAAM;AACzBD,qDAAgBE,UAAWC,OAAM,CAACA;EACpC;AAEA,QAAMC,eAAeA,MAAMf,QAAQM,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,kBAChD1B,MAAI;MAAC2B,MAAMZ;MAAc,IAAAa,WAAA;AAAA,eAAAF,kBACvBrB,QAAM;UAACwB,SAAO;UAASC,SAASd;UAAY,SAAA;UAAA,cAAA;UAAA,IAAAY,WAAA;AAAA,mBAAAF,kBAC1CvB,MAAI;cAAC4B,MAAM9B;cAAW+B,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,YAAY3B;AACnB0B,OAAOE,OAAO3B;AACdyB,OAAOG,OAAO3B;",
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,3 @@
1
+ import { type Component } from "solid-js";
2
+ export declare const TopbarActions: Component;
3
+ //# sourceMappingURL=TopbarActions.d.ts.map
@@ -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
- * - Context 없이 순수 레이아웃 역할만 수행
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,EAAc,MAAM,UAAU,CAAC;AAMtE,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,CAUjE,CAAC"}
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
- var _el$ = _tmpl$();
15
- _$spread(_el$, _$mergeProps(rest, {
16
- "data-topbar-container": "",
17
- get ["class"]() {
18
- return getClassName();
19
- }
20
- }), false, true);
21
- _$insert(_el$, () => local.children);
22
- return _el$;
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": ";;;;;AAAA,SAAyCA,kBAAkB;AAC3D,OAAOC,UAAU;AACjB,SAASC,eAAe;AAExB,MAAMC,iBAAiBF,KAAK,sBAAsB;AAyB3C,MAAMG,kBAA0DC,WAAU;AAC/E,QAAM,CAACC,OAAOC,IAAI,IAAIP,WAAWK,OAAO,CAAC,YAAY,OAAO,CAAC;AAE7D,QAAMG,eAAeA,MAAMN,QAAQC,gBAAgBG,MAAMG,KAAK;AAE9D,UAAA,MAAA;AAAA,QAAAC,OAAAC,OAAA;AAAAC,aAAAF,MAAAG,aACWN,MAAI;MAAA,yBAAA;MAAA,KAAA,OAAA,IAAA;AAAA,eAA+BC,aAAa;MAAC;IAAA,CAAA,GAAA,OAAA,IAAA;AAAAM,aAAAJ,MAAA,MACvDJ,MAAMS,QAAQ;AAAA,WAAAL;EAAA,GAAA;AAGrB;",
5
- "names": ["splitProps", "clsx", "twMerge", "containerClass", "TopbarContainer", "props", "local", "rest", "getClassName", "class", "_el$", "_tmpl$", "_$spread", "_$mergeProps", "_$insert", "children"]
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";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["..\\src\\index.ts"],"names":[],"mappings":"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"}
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;AAClD,cAAc,0CAA0C,CAAC;AAMzD,cAAc,yBAAyB,CAAC;AACxC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,oCAAoC,CAAC;AACnD,cAAc,wCAAwC,CAAC;AACvD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,mCAAmC,CAAC;AAClD,cAAc,0CAA0C,CAAC;AACzD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,qCAAqC,CAAC;AACpD,cAAc,oDAAoD,CAAC;AACnE,cAAc,iCAAiC,CAAC;AAChD,cAAc,wCAAwC,CAAC;AAMvD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,0BAA0B,CAAC;AACzC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,4BAA4B,CAAC;AAM3C,cAAc,kCAAkC,CAAC;AACjD,cAAc,kCAAkC,CAAC;AACjD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,uCAAuC,CAAC;AACtD,cAAc,+CAA+C,CAAC;AAC9D,cAAc,wCAAwC,CAAC;AACvD,cAAc,8BAA8B,CAAC;AAO7C,cAAc,wDAAwD,CAAC;AACvE,cAAc,qDAAqD,CAAC;AACpE,cAAc,uDAAuD,CAAC;AAGtE,cAAc,wCAAwC,CAAC;AACvD,cAAc,0CAA0C,CAAC;AAGzD,cAAc,0CAA0C,CAAC;AACzD,cAAc,2CAA2C,CAAC;AAC1D,cAAc,mCAAmC,CAAC;AAClD,cAAc,kDAAkD,CAAC;AACjE,cAAc,gCAAgC,CAAC;AAO/C,OAAO,EAAE,KAAK,SAAS,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAGrF,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,uBAAuB,EAC5B,kBAAkB,EAClB,cAAc,GACf,MAAM,gCAAgC,CAAC;AAGxC,OAAO,EAAE,KAAK,UAAU,EAAE,KAAK,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAGrF,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACpD,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAGzE,OAAO,EACL,KAAK,yBAAyB,EAC9B,oBAAoB,EACpB,gBAAgB,GACjB,MAAM,kCAAkC,CAAC;AAG1C,YAAY,EACV,oBAAoB,EACpB,kBAAkB,EAClB,eAAe,GAChB,MAAM,2CAA2C,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,2CAA2C,CAAC;AAC7F,cAAc,+CAA+C,CAAC;AAG9D,cAAc,4BAA4B,CAAC;AAM3C,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC;AAClC,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAC5E,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAMtD,cAAc,wBAAwB,CAAC;AACvC,cAAc,0BAA0B,CAAC;AAMzC,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAM7C,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAClE,YAAY,EACV,gBAAgB,EAChB,qBAAqB,EACrB,oBAAoB,EACpB,mBAAmB,EACnB,QAAQ,EACR,WAAW,EACX,OAAO,EACP,OAAO,EACP,WAAW,EACX,YAAY,GACb,MAAM,8BAA8B,CAAC"}
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 below topbar
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&lt;JSX.Element | undefined&gt;**
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.53",
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",
53
- "@simplysm/core-common": "13.0.53"
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:hover > td {
2
- box-shadow: inset 0 0 0 9999px rgb(0 0 0 / 3%);
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] > td {
7
- box-shadow: inset 0 0 0 9999px rgb(0 0 0 / 5%);
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"] > td {
17
- box-shadow: inset 0 0 0 9999px rgb(59 130 246 / 10%);
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 > td {
21
- box-shadow: inset 0 0 0 9999px rgb(255 255 255 / 4%);
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] > td {
25
- box-shadow: inset 0 0 0 9999px rgb(255 255 255 / 6%);
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 = "off";
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, fieldInputClass, getFieldWrapperClass } from "./Field.styles";
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
- * - Context 없이 순수 레이아웃 역할만 수행
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
- <div {...rest} data-topbar-container class={getClassName()}>
37
- {local.children}
38
- </div>
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
  };