@wipco/sdui 0.6.0 → 0.8.0

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 (79) hide show
  1. package/dist/DatePicker-BndreCPl.d.ts +35 -0
  2. package/dist/{chunk-FGRR3ROJ.js → chunk-27APKNEI.js} +8 -5
  3. package/dist/{chunk-SEBPBUZR.js → chunk-5RWAK5QO.js} +4 -2
  4. package/dist/{chunk-ZQR3ULVH.js → chunk-6ALDY64N.js} +5 -3
  5. package/dist/{chunk-ZUCI34QY.js → chunk-6FADQ2SU.js} +63 -21
  6. package/dist/{chunk-KBHI3IUR.js → chunk-6ZUWN2QX.js} +4 -2
  7. package/dist/{chunk-RH7ESUE6.js → chunk-7MRAY6UD.js} +4 -2
  8. package/dist/{chunk-DGPRX4MU.js → chunk-7Y6UFAYZ.js} +4 -2
  9. package/dist/{chunk-7Y4J7EOK.js → chunk-BMZKZGJF.js} +3 -2
  10. package/dist/{chunk-WNYWTFGW.js → chunk-CEFOZOOM.js} +4 -2
  11. package/dist/{chunk-56KKWLNI.js → chunk-H7V35NC2.js} +5 -3
  12. package/dist/{chunk-MSAV4J4I.js → chunk-I5GNJDHQ.js} +5 -3
  13. package/dist/{chunk-ZNITJ4KK.js → chunk-IKLBICOJ.js} +4 -2
  14. package/dist/{chunk-LZJTKVMO.js → chunk-KL554MEM.js} +4 -2
  15. package/dist/{chunk-4SU2KYPU.js → chunk-KPDUJFVD.js} +4 -2
  16. package/dist/{chunk-USKRM22W.js → chunk-O4U7Y3XL.js} +3 -2
  17. package/dist/{chunk-MOIU7MUA.js → chunk-OM63D4UH.js} +5 -3
  18. package/dist/{chunk-Q6SBH63R.js → chunk-QTNIUMSM.js} +4 -2
  19. package/dist/{chunk-WVRCIVAD.js → chunk-RQ2FWV24.js} +4 -2
  20. package/dist/{chunk-QBIVW7E6.js → chunk-SAN4IX6N.js} +77 -2
  21. package/dist/{chunk-AROOQ5W6.js → chunk-VCX2XEF6.js} +4 -2
  22. package/dist/{chunk-OOHHW4K4.js → chunk-VPVCVSFH.js} +4 -2
  23. package/dist/{chunk-KADFN76X.js → chunk-WUTCZCQH.js} +1 -1
  24. package/dist/{chunk-APCXOCAO.js → chunk-YMWU4F7E.js} +4 -2
  25. package/dist/{chunk-QZQDHSMD.js → chunk-Z3WGIFJP.js} +3 -2
  26. package/dist/{chunk-PJRXPMI3.js → chunk-ZH5MLOZS.js} +3 -2
  27. package/dist/index.d.ts +1045 -965
  28. package/dist/index.js +82 -47
  29. package/dist/{layout-BnYUuWC2.d.ts → layout-B1QrIBm6.d.ts} +59 -1
  30. package/dist/meta.d.ts +42 -1
  31. package/dist/meta.js +215 -57
  32. package/dist/rich.d.ts +2 -1
  33. package/dist/rich.js +4 -3
  34. package/dist/widgets/AutocompleteField.d.ts +6 -40
  35. package/dist/widgets/AutocompleteField.js +4 -3
  36. package/dist/widgets/ColumnBoard.d.ts +6 -14
  37. package/dist/widgets/ColumnBoard.js +3 -2
  38. package/dist/widgets/DiffView.d.ts +6 -11
  39. package/dist/widgets/DiffView.js +3 -2
  40. package/dist/widgets/Disclosure.d.ts +6 -9
  41. package/dist/widgets/Disclosure.js +3 -2
  42. package/dist/widgets/EventCalendar.d.ts +6 -1
  43. package/dist/widgets/EventCalendar.js +3 -2
  44. package/dist/widgets/ImageLightbox.d.ts +6 -10
  45. package/dist/widgets/ImageLightbox.js +3 -2
  46. package/dist/widgets/InlineEdit.d.ts +6 -10
  47. package/dist/widgets/InlineEdit.js +3 -2
  48. package/dist/widgets/JsonField.d.ts +6 -1
  49. package/dist/widgets/JsonField.js +3 -2
  50. package/dist/widgets/LiveClock.d.ts +6 -1
  51. package/dist/widgets/LiveClock.js +2 -1
  52. package/dist/widgets/OrgChart.d.ts +7 -3
  53. package/dist/widgets/OrgChart.js +3 -2
  54. package/dist/widgets/PeriodFilter.d.ts +6 -1
  55. package/dist/widgets/PeriodFilter.js +3 -2
  56. package/dist/widgets/PrintSheet.d.ts +6 -12
  57. package/dist/widgets/PrintSheet.js +3 -2
  58. package/dist/widgets/SearchableMultiPicker.d.ts +6 -11
  59. package/dist/widgets/SearchableMultiPicker.js +4 -3
  60. package/dist/widgets/SecureScreen.d.ts +6 -14
  61. package/dist/widgets/SecureScreen.js +3 -2
  62. package/dist/widgets/StackedMeter.d.ts +7 -3
  63. package/dist/widgets/StackedMeter.js +2 -1
  64. package/dist/widgets/Strip.d.ts +6 -10
  65. package/dist/widgets/Strip.js +2 -2
  66. package/dist/widgets/SummaryTable.d.ts +6 -9
  67. package/dist/widgets/SummaryTable.js +2 -1
  68. package/dist/widgets/TagMultiSelect.d.ts +6 -1
  69. package/dist/widgets/TagMultiSelect.js +3 -2
  70. package/dist/widgets/Timeline.d.ts +6 -10
  71. package/dist/widgets/Timeline.js +4 -3
  72. package/dist/widgets/TreePicker.d.ts +6 -1
  73. package/dist/widgets/TreePicker.js +4 -3
  74. package/dist/widgets/TreeView.d.ts +6 -1
  75. package/dist/widgets/TreeView.js +3 -2
  76. package/dist/widgets/index.d.ts +61 -61
  77. package/dist/widgets/index.js +44 -44
  78. package/package.json +1 -1
  79. package/dist/DatePicker-CTDcFR7V.d.ts +0 -48
@@ -0,0 +1,35 @@
1
+ import { S as SduiBoxProps } from './layout-B1QrIBm6.js';
2
+ import React__default from 'react';
3
+
4
+ interface DatePickerProps {
5
+ /** 선택된 날짜 (YYYY-MM-DD). 주어지면 controlled로 동작. */
6
+ value?: string;
7
+ onChange?: (value: string) => void;
8
+ /** 선택 가능 최소 날짜 (YYYY-MM-DD, 포함). */
9
+ min?: string;
10
+ /** 선택 가능 최대 날짜 (YYYY-MM-DD, 포함). */
11
+ max?: string;
12
+ placeholder?: string;
13
+ invalid?: boolean;
14
+ disabled?: boolean;
15
+ size?: 'sm' | 'md' | 'lg';
16
+ }
17
+ interface DateRangeValue {
18
+ from?: string;
19
+ to?: string;
20
+ }
21
+ interface DateRangePickerProps {
22
+ /** 선택된 기간 (YYYY-MM-DD). 주어지면 controlled로 동작. */
23
+ value?: DateRangeValue;
24
+ onChange?: (value: DateRangeValue) => void;
25
+ min?: string;
26
+ max?: string;
27
+ invalid?: boolean;
28
+ disabled?: boolean;
29
+ }
30
+ /** 바깥에서 온 `style`·`className`을 뿌리에 얹어 내보낸다. 까닭은 {@link ./boxed.tsx}에 있다. */
31
+ declare const DatePicker: React__default.FC<DatePickerProps & SduiBoxProps>;
32
+ /** 바깥에서 온 `style`·`className`을 뿌리에 얹어 내보낸다. 까닭은 {@link ./boxed.tsx}에 있다. */
33
+ declare const DateRangePicker: React__default.FC<DateRangePickerProps & SduiBoxProps>;
34
+
35
+ export { type DatePickerProps as D, type DateRangePickerProps as a, DatePicker as b, DateRangePicker as c, type DateRangeValue as d };
@@ -1,6 +1,7 @@
1
- import { Icon } from './chunk-ZUCI34QY.js';
2
- import { createContext, useContext, useState, useRef, useMemo, useCallback, useEffect, useLayoutEffect } from 'react';
3
- import { jsx, jsxs } from 'react/jsx-runtime';
1
+ import { Icon } from './chunk-6FADQ2SU.js';
2
+ import { boxed } from './chunk-SAN4IX6N.js';
3
+ import { createContext, useState, useRef, useMemo, useCallback, useEffect, useLayoutEffect, useContext } from 'react';
4
+ import { jsxs, jsx } from 'react/jsx-runtime';
4
5
 
5
6
  // src/env.ts
6
7
  var DEV = (() => {
@@ -297,7 +298,7 @@ function triggerClassName(size, invalid) {
297
298
  if (invalid) classes.push("wp-input--invalid");
298
299
  return classes.join(" ");
299
300
  }
300
- function DatePicker({
301
+ function DatePickerImpl({
301
302
  value,
302
303
  onChange,
303
304
  min,
@@ -366,7 +367,7 @@ function DatePicker({
366
367
  ) }) }) : null
367
368
  ] });
368
369
  }
369
- function DateRangePicker({
370
+ function DateRangePickerImpl({
370
371
  value,
371
372
  onChange,
372
373
  min,
@@ -493,5 +494,7 @@ var DP_CSS = `
493
494
  .wp-dp__day--range-start .wp-dp__day-btn,.wp-dp__day--range-end .wp-dp__day-btn{background:var(--wp-action-primary-bg);color:var(--wp-action-primary-fg);font-weight:500}
494
495
  .wp-dp__day--range-start.wp-dp__day--today .wp-dp__day-btn,.wp-dp__day--range-end.wp-dp__day--today .wp-dp__day-btn{box-shadow:none}
495
496
  `;
497
+ var DatePicker = boxed(DatePickerImpl, "DatePicker");
498
+ var DateRangePicker = boxed(DateRangePickerImpl, "DateRangePicker");
496
499
 
497
500
  export { DEV, DatePicker, DateRangePicker, HoistedStyle, SduiAdapterContext, assetResolverOf, defaultAdapter, hostFetchOf, isSafeNavigationTarget, resolveAdapter, useSduiAdapter, useSduiAssetResolver, useSduiSandbox };
@@ -1,4 +1,5 @@
1
- import { Input, IconButton, EmptyState, Icon, Badge } from './chunk-ZUCI34QY.js';
1
+ import { Input, IconButton, EmptyState, Icon, Badge } from './chunk-6FADQ2SU.js';
2
+ import { boxed } from './chunk-SAN4IX6N.js';
2
3
  import React, { useState, useMemo } from 'react';
3
4
  import { jsxs, jsx } from 'react/jsx-runtime';
4
5
 
@@ -56,7 +57,7 @@ function toggled(prev, id) {
56
57
  else next.add(id);
57
58
  return next;
58
59
  }
59
- function TreeView({
60
+ function TreeViewImpl({
60
61
  nodes,
61
62
  selectedId,
62
63
  onSelect,
@@ -256,5 +257,6 @@ function TreeView({
256
257
  }
257
258
  );
258
259
  }
260
+ var TreeView = boxed(TreeViewImpl, "TreeView");
259
261
 
260
262
  export { TreeView };
@@ -1,5 +1,6 @@
1
- import { TreeView } from './chunk-SEBPBUZR.js';
2
- import { Field, Dialog, Icon, Button, Input } from './chunk-ZUCI34QY.js';
1
+ import { TreeView } from './chunk-5RWAK5QO.js';
2
+ import { Field, Dialog, Icon, Button, Input } from './chunk-6FADQ2SU.js';
3
+ import { boxed } from './chunk-SAN4IX6N.js';
3
4
  import { useState, useEffect } from 'react';
4
5
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
5
6
 
@@ -20,7 +21,7 @@ function findNode(nodes, id) {
20
21
  }
21
22
  return void 0;
22
23
  }
23
- function TreePicker({
24
+ function TreePickerImpl({
24
25
  nodes,
25
26
  value,
26
27
  valueLabel,
@@ -189,5 +190,6 @@ function TreePicker({
189
190
  ) : null
190
191
  ] });
191
192
  }
193
+ var TreePicker = boxed(TreePickerImpl, "TreePicker");
192
194
 
193
195
  export { TreePicker };
@@ -1,8 +1,7 @@
1
+ import { mergeStyle, containerLayoutStyle, joinClass } from './chunk-SAN4IX6N.js';
1
2
  import React from 'react';
2
3
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
3
4
 
4
- // src/components.tsx
5
-
6
5
  // src/icons.ts
7
6
  var ICON_NODES = {
8
7
  "activity": [
@@ -688,8 +687,14 @@ var ICON_NODES = {
688
687
  { t: "line", x1: "8", x2: "14", y1: "11", y2: "11" }
689
688
  ]
690
689
  };
691
- function cx(...parts) {
692
- return parts.filter(Boolean).join(" ");
690
+
691
+ // src/warn-once.ts
692
+ var warned = /* @__PURE__ */ new Set();
693
+ function warnOnce(key, message, level = "error") {
694
+ if (warned.has(key)) return;
695
+ warned.add(key);
696
+ if (level === "warn") console.warn(message);
697
+ else console.error(message);
693
698
  }
694
699
  function Icon({ name, size = 18, strokeWidth = 1.5, className = "", style, title, ...rest }) {
695
700
  const nodes = Object.hasOwn(ICON_NODES, name) ? ICON_NODES[name] : void 0;
@@ -725,8 +730,10 @@ function Button({
725
730
  block = false,
726
731
  disabled = false,
727
732
  as = "button",
733
+ justify,
728
734
  children,
729
735
  className = "",
736
+ style,
730
737
  ...rest
731
738
  }) {
732
739
  const Tag2 = as;
@@ -740,6 +747,7 @@ function Button({
740
747
  Tag2,
741
748
  {
742
749
  className: classes.join(" "),
750
+ style: mergeStyle(containerLayoutStyle({ justify }), style),
743
751
  disabled: Tag2 === "button" ? disabled || loading : void 0,
744
752
  "aria-disabled": disabled || void 0,
745
753
  ...rest,
@@ -804,22 +812,56 @@ function Textarea({ invalid = false, rows = 3, className = "", ...rest }) {
804
812
  return /* @__PURE__ */ jsx(
805
813
  "textarea",
806
814
  {
807
- className: cx("wp-textarea", invalid && "wp-textarea--invalid", className),
815
+ className: joinClass("wp-textarea", invalid && "wp-textarea--invalid", className),
808
816
  rows,
809
817
  "aria-invalid": invalid || void 0,
810
818
  ...rest
811
819
  }
812
820
  );
813
821
  }
814
- function Select({ options = [], size = "md", invalid = false, placeholder, className = "", ...rest }) {
822
+ function pickOptionText(option, key) {
823
+ const raw = option[key];
824
+ if (raw === null || raw === void 0) return void 0;
825
+ return String(raw);
826
+ }
827
+ function Select({
828
+ options,
829
+ valueKey = "value",
830
+ labelKey = "label",
831
+ size = "md",
832
+ invalid = false,
833
+ placeholder,
834
+ className = "",
835
+ ...rest
836
+ }) {
815
837
  const classes = ["wp-select"];
816
838
  if (size !== "md") classes.push(`wp-select--${size}`);
817
839
  if (invalid) classes.push("wp-select--invalid");
818
840
  if (className) classes.push(className);
841
+ const list = Array.isArray(options) ? options : [];
819
842
  return /* @__PURE__ */ jsxs("div", { className: "wp-selectwrap", children: [
820
843
  /* @__PURE__ */ jsxs("select", { className: classes.join(" "), "aria-invalid": invalid || void 0, ...rest, children: [
821
844
  placeholder ? /* @__PURE__ */ jsx("option", { value: "", children: placeholder }) : null,
822
- options.map((option) => /* @__PURE__ */ jsx("option", { value: option.value, disabled: option.disabled, children: option.label }, option.value))
845
+ list.map((option, index) => {
846
+ const value = pickOptionText(option, valueKey);
847
+ const label = pickOptionText(option, labelKey) || value || "";
848
+ if (label === "") {
849
+ warnOnce(
850
+ `select:blank-option:${valueKey}/${labelKey}`,
851
+ `[sdui] <Select> \uC635\uC158\uC774 \uAC12\xB7\uB77C\uBCA8 \uB458 \uB2E4 \uBE44\uC5C8\uC2B5\uB2C8\uB2E4 (valueKey="${valueKey}", labelKey="${labelKey}") \u2014 \uB3C4\uBA54\uC778 \uAC1D\uCCB4\uB97C \uADF8\uB300\uB85C \uB118\uACBC\uB2E4\uBA74 \uB450 \uD504\uB86D\uC73C\uB85C \uC77D\uC744 \uD0A4\uB97C \uC9C0\uC815\uD558\uC138\uC694`,
852
+ "warn"
853
+ );
854
+ }
855
+ return /* @__PURE__ */ jsx(
856
+ "option",
857
+ {
858
+ value,
859
+ disabled: Boolean(option.disabled),
860
+ children: label
861
+ },
862
+ `${value ?? ""}-${index}`
863
+ );
864
+ })
823
865
  ] }),
824
866
  /* @__PURE__ */ jsx("span", { className: "wp-selectwrap__caret", children: /* @__PURE__ */ jsx(Icon, { name: "chevron-down", size: 15 }) })
825
867
  ] });
@@ -829,7 +871,7 @@ function Checkbox({ label, description, indeterminate = false, disabled = false,
829
871
  React.useEffect(() => {
830
872
  if (ref.current) ref.current.indeterminate = indeterminate;
831
873
  }, [indeterminate]);
832
- return /* @__PURE__ */ jsxs("label", { className: cx("wp-check", disabled && "wp-check--disabled", className), children: [
874
+ return /* @__PURE__ */ jsxs("label", { className: joinClass("wp-check", disabled && "wp-check--disabled", className), children: [
833
875
  /* @__PURE__ */ jsx("input", { ref, type: "checkbox", disabled, ...rest }),
834
876
  /* @__PURE__ */ jsx("span", { className: "wp-check__box", children: /* @__PURE__ */ jsx(Icon, { name: indeterminate ? "minus" : "check", size: 12, strokeWidth: 2.5 }) }),
835
877
  label || description ? /* @__PURE__ */ jsxs("span", { className: "wp-check__text", children: [
@@ -839,14 +881,14 @@ function Checkbox({ label, description, indeterminate = false, disabled = false,
839
881
  ] });
840
882
  }
841
883
  function Switch({ label, size = "md", disabled = false, className = "", ...rest }) {
842
- return /* @__PURE__ */ jsxs("label", { className: cx("wp-switch", size === "sm" && "wp-switch--sm", className), children: [
884
+ return /* @__PURE__ */ jsxs("label", { className: joinClass("wp-switch", size === "sm" && "wp-switch--sm", className), children: [
843
885
  /* @__PURE__ */ jsx("input", { type: "checkbox", role: "switch", disabled, ...rest }),
844
886
  /* @__PURE__ */ jsx("span", { className: "wp-switch__track" }),
845
887
  label ? /* @__PURE__ */ jsx("span", { children: label }) : null
846
888
  ] });
847
889
  }
848
890
  function Field({ label, hint, error, required = false, htmlFor, layout = "stacked", children, className = "", ...rest }) {
849
- return /* @__PURE__ */ jsxs("div", { className: cx("wp-field", layout === "horizontal" && "wp-field--horizontal", className), ...rest, children: [
891
+ return /* @__PURE__ */ jsxs("div", { className: joinClass("wp-field", layout === "horizontal" && "wp-field--horizontal", className), ...rest, children: [
850
892
  label ? /* @__PURE__ */ jsxs("label", { className: "wp-field__label", htmlFor, children: [
851
893
  label,
852
894
  required ? /* @__PURE__ */ jsx("span", { className: "wp-field__req", "aria-hidden": "true", children: "*" }) : null
@@ -895,14 +937,14 @@ function Badge({ tone = "neutral", dot = false, size = "md", children, className
895
937
  return /* @__PURE__ */ jsx(
896
938
  "span",
897
939
  {
898
- className: cx("wp-badge", `wp-badge--${tone}`, dot && "wp-badge--dot", size === "lg" && "wp-badge--lg", className),
940
+ className: joinClass("wp-badge", `wp-badge--${tone}`, dot && "wp-badge--dot", size === "lg" && "wp-badge--lg", className),
899
941
  ...rest,
900
942
  children
901
943
  }
902
944
  );
903
945
  }
904
946
  function Tag({ color, filled = false, onRemove, children, className = "", ...rest }) {
905
- return /* @__PURE__ */ jsxs("span", { className: cx("wp-tag", filled && "wp-tag--filled", className), ...rest, children: [
947
+ return /* @__PURE__ */ jsxs("span", { className: joinClass("wp-tag", filled && "wp-tag--filled", className), ...rest, children: [
906
948
  color ? /* @__PURE__ */ jsx("span", { className: "wp-tag__dot", style: { background: color } }) : null,
907
949
  children,
908
950
  onRemove ? /* @__PURE__ */ jsx("span", { className: "wp-tag__x", role: "button", "aria-label": "\uC81C\uAC70", onClick: onRemove, children: /* @__PURE__ */ jsx(Icon, { name: "x", size: 10, strokeWidth: 2 }) }) : null
@@ -919,7 +961,7 @@ function Alert({ tone = "info", title, children, actions, onClose, bar = false,
919
961
  return /* @__PURE__ */ jsxs(
920
962
  "div",
921
963
  {
922
- className: cx("wp-alert", `wp-alert--${tone}`, bar && "wp-alert--bar", className),
964
+ className: joinClass("wp-alert", `wp-alert--${tone}`, bar && "wp-alert--bar", className),
923
965
  role: tone === "danger" ? "alert" : "status",
924
966
  ...rest,
925
967
  children: [
@@ -935,7 +977,7 @@ function Alert({ tone = "info", title, children, actions, onClose, bar = false,
935
977
  );
936
978
  }
937
979
  function Toast({ tone = "info", title, children, action, onClose, className = "", ...rest }) {
938
- return /* @__PURE__ */ jsxs("div", { className: cx("wp-toast", `wp-toast--${tone}`, className), role: "status", ...rest, children: [
980
+ return /* @__PURE__ */ jsxs("div", { className: joinClass("wp-toast", `wp-toast--${tone}`, className), role: "status", ...rest, children: [
939
981
  /* @__PURE__ */ jsx("span", { className: "wp-toast__icon", children: /* @__PURE__ */ jsx(Icon, { name: TONE_ICONS[tone] ?? "info", size: 16 }) }),
940
982
  /* @__PURE__ */ jsxs("div", { className: "wp-toast__body", children: [
941
983
  title ? /* @__PURE__ */ jsx("span", { className: "wp-toast__title", children: title }) : null,
@@ -949,7 +991,7 @@ function Tabs({ items = [], value, onChange, size = "md", onChrome = false, clas
949
991
  return /* @__PURE__ */ jsx(
950
992
  "div",
951
993
  {
952
- className: cx("wp-tabs", size === "lg" && "wp-tabs--lg", onChrome && "wp-tabs--onchrome", className),
994
+ className: joinClass("wp-tabs", size === "lg" && "wp-tabs--lg", onChrome && "wp-tabs--onchrome", className),
953
995
  role: "tablist",
954
996
  ...rest,
955
997
  children: items.map((item) => /* @__PURE__ */ jsxs(
@@ -1034,7 +1076,7 @@ function Table({
1034
1076
  }
1035
1077
  function StatCard({ label, value, unit, delta, trend = "flat", icon, footer, size = "md", className = "", ...rest }) {
1036
1078
  const arrow = trend === "up" ? "arrow-up-right" : trend === "down" ? "arrow-down" : "minus";
1037
- return /* @__PURE__ */ jsx("div", { className: cx("wp-card", className), ...rest, children: /* @__PURE__ */ jsx("div", { className: "wp-card__body", children: /* @__PURE__ */ jsxs("div", { className: size === "sm" ? "wp-stat wp-stat--sm" : "wp-stat", children: [
1079
+ return /* @__PURE__ */ jsx("div", { className: joinClass("wp-card", className), ...rest, children: /* @__PURE__ */ jsx("div", { className: "wp-card__body", children: /* @__PURE__ */ jsxs("div", { className: size === "sm" ? "wp-stat wp-stat--sm" : "wp-stat", children: [
1038
1080
  /* @__PURE__ */ jsxs("div", { className: "wp-stat__label", children: [
1039
1081
  icon ? /* @__PURE__ */ jsx(Icon, { name: icon, size: 14 }) : null,
1040
1082
  label
@@ -1051,7 +1093,7 @@ function StatCard({ label, value, unit, delta, trend = "flat", icon, footer, siz
1051
1093
  ] }) }) });
1052
1094
  }
1053
1095
  function EmptyState({ icon = "square-dashed", title, children, actions, tight = false, className = "", ...rest }) {
1054
- return /* @__PURE__ */ jsxs("div", { className: cx("wp-empty", tight && "wp-empty--tight", className), ...rest, children: [
1096
+ return /* @__PURE__ */ jsxs("div", { className: joinClass("wp-empty", tight && "wp-empty--tight", className), ...rest, children: [
1055
1097
  /* @__PURE__ */ jsx("span", { className: "wp-empty__mark", children: /* @__PURE__ */ jsx(Icon, { name: icon, size: 20 }) }),
1056
1098
  title ? /* @__PURE__ */ jsx("div", { className: "wp-empty__title", children: title }) : null,
1057
1099
  children ? /* @__PURE__ */ jsx("div", { className: "wp-empty__text", children }) : null,
@@ -1062,7 +1104,7 @@ function Spinner({ size = "md", inverse = false, label, className = "", ...rest
1062
1104
  const el = /* @__PURE__ */ jsx(
1063
1105
  "span",
1064
1106
  {
1065
- className: cx("wp-spinner", size !== "md" && `wp-spinner--${size}`, inverse && "wp-spinner--inverse", className),
1107
+ className: joinClass("wp-spinner", size !== "md" && `wp-spinner--${size}`, inverse && "wp-spinner--inverse", className),
1066
1108
  role: "status",
1067
1109
  "aria-label": label || "\uB85C\uB529 \uC911",
1068
1110
  ...rest
@@ -1106,7 +1148,7 @@ function ProgressBar({
1106
1148
  if (!showValue && !label) {
1107
1149
  return /* @__PURE__ */ jsx("div", { className, ...rest, children: bar });
1108
1150
  }
1109
- return /* @__PURE__ */ jsxs("div", { className: cx("wp-col", className), style: { gap: 5 }, ...rest, children: [
1151
+ return /* @__PURE__ */ jsxs("div", { className: joinClass("wp-col", className), style: { gap: 5 }, ...rest, children: [
1110
1152
  label ? /* @__PURE__ */ jsxs("div", { className: "wp-row wp-row--between", children: [
1111
1153
  /* @__PURE__ */ jsx("span", { className: "wp-caption", children: label }),
1112
1154
  showValue ? /* @__PURE__ */ jsxs("span", { className: "wp-caption wp-num", children: [
@@ -1139,7 +1181,7 @@ function pageItems(page, total) {
1139
1181
  function Pagination({ page = 1, pageCount = 1, total, pageSize, onChange, className = "", ...rest }) {
1140
1182
  const from = total != null && pageSize ? (page - 1) * pageSize + 1 : null;
1141
1183
  const to = total != null && pageSize ? Math.min(total, page * pageSize) : null;
1142
- return /* @__PURE__ */ jsxs("div", { className: cx("wp-pager", className), ...rest, children: [
1184
+ return /* @__PURE__ */ jsxs("div", { className: joinClass("wp-pager", className), ...rest, children: [
1143
1185
  from != null ? /* @__PURE__ */ jsxs("span", { className: "wp-num", children: [
1144
1186
  from,
1145
1187
  "\u2013",
@@ -1287,4 +1329,4 @@ function Tooltip({ label, shortcut, placement = "top", wrap = false, children, c
1287
1329
  );
1288
1330
  }
1289
1331
 
1290
- export { Alert, Avatar, Badge, Breadcrumb, Button, Card, Checkbox, Dialog, EmptyState, Field, Icon, IconButton, Input, Pagination, ProgressBar, Radio, SegmentedControl, Select, SidebarNav, Spinner, StatCard, Switch, Table, Tabs, Tag, Textarea, Toast, Tooltip };
1332
+ export { Alert, Avatar, Badge, Breadcrumb, Button, Card, Checkbox, Dialog, EmptyState, Field, Icon, IconButton, Input, Pagination, ProgressBar, Radio, SegmentedControl, Select, SidebarNav, Spinner, StatCard, Switch, Table, Tabs, Tag, Textarea, Toast, Tooltip, warnOnce };
@@ -1,4 +1,5 @@
1
- import { Button } from './chunk-ZUCI34QY.js';
1
+ import { Button } from './chunk-6FADQ2SU.js';
2
+ import { boxed } from './chunk-SAN4IX6N.js';
2
3
  import { useEffect } from 'react';
3
4
  import { jsxs, jsx } from 'react/jsx-runtime';
4
5
 
@@ -18,7 +19,7 @@ var PRINT_CSS = `
18
19
  function PrintStyles() {
19
20
  return /* @__PURE__ */ jsx("style", { href: "erp-print", precedence: "medium", children: PRINT_CSS });
20
21
  }
21
- function PrintSheet({ title, children, autoPrint = false }) {
22
+ function PrintSheetImpl({ title, children, autoPrint = false }) {
22
23
  useEffect(() => {
23
24
  if (!autoPrint || !window.opener) return;
24
25
  const timer = window.setTimeout(() => window.print(), 500);
@@ -36,5 +37,6 @@ function PrintSheet({ title, children, autoPrint = false }) {
36
37
  ] })
37
38
  ] });
38
39
  }
40
+ var PrintSheet = boxed(PrintSheetImpl, "PrintSheet");
39
41
 
40
42
  export { PrintSheet };
@@ -1,4 +1,5 @@
1
- import { IconButton } from './chunk-ZUCI34QY.js';
1
+ import { IconButton } from './chunk-6FADQ2SU.js';
2
+ import { boxed } from './chunk-SAN4IX6N.js';
2
3
  import { useState, useRef, useCallback, useEffect } from 'react';
3
4
  import { createPortal } from 'react-dom';
4
5
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
@@ -11,7 +12,7 @@ var INITIAL_VIEW = { scale: 1, x: 0, y: 0 };
11
12
  function clamp(value, min, max) {
12
13
  return Math.min(max, Math.max(min, value));
13
14
  }
14
- function ImageLightbox({ src, alt, thumbClassName, thumbStyle, children }) {
15
+ function ImageLightboxImpl({ src, alt, thumbClassName, thumbStyle, children }) {
15
16
  const [open, setOpen] = useState(false);
16
17
  const [view, setView] = useState(INITIAL_VIEW);
17
18
  const [dragging, setDragging] = useState(false);
@@ -305,5 +306,6 @@ function ImageLightbox({ src, alt, thumbClassName, thumbStyle, children }) {
305
306
  overlay
306
307
  ] });
307
308
  }
309
+ var ImageLightbox = boxed(ImageLightboxImpl, "ImageLightbox");
308
310
 
309
311
  export { ImageLightbox };
@@ -1,4 +1,5 @@
1
- import { SegmentedControl, Select, Input } from './chunk-ZUCI34QY.js';
1
+ import { SegmentedControl, Select, Input } from './chunk-6FADQ2SU.js';
2
+ import { boxed } from './chunk-SAN4IX6N.js';
2
3
  import { useState, useMemo } from 'react';
3
4
  import { jsxs, jsx } from 'react/jsx-runtime';
4
5
 
@@ -126,7 +127,7 @@ var MONTH_OPTIONS = Array.from({ length: 12 }, (_, i) => ({
126
127
  value: String(i + 1),
127
128
  label: `${i + 1}\uC6D4`
128
129
  }));
129
- function PeriodFilter({ value, onChange, years, modes }) {
130
+ function PeriodFilterImpl({ value, onChange, years, modes }) {
130
131
  const [inner, setInner] = useState(() => normalizePeriod(value));
131
132
  const modeItems = useMemo(() => normalizeModes(modes), [modes]);
132
133
  const requested = normalizePeriod(value !== void 0 ? value : inner);
@@ -247,5 +248,6 @@ function PeriodFilter({ value, onChange, years, modes }) {
247
248
  }
248
249
  );
249
250
  }
251
+ var PeriodFilter = boxed(PeriodFilterImpl, "PeriodFilter");
250
252
 
251
253
  export { PeriodFilter };
@@ -1,6 +1,6 @@
1
+ import { boxed } from './chunk-SAN4IX6N.js';
1
2
  import { jsxs, jsx } from 'react/jsx-runtime';
2
3
 
3
- // src/widgets/StackedMeter.tsx
4
4
  var resolveColor = (color, index) => {
5
5
  if (!color) return `var(--wp-series-${index % 8 + 1})`;
6
6
  if (/^[1-8]$/.test(color)) return `var(--wp-series-${color})`;
@@ -15,7 +15,7 @@ var dotStyle = (color) => ({
15
15
  background: color,
16
16
  flexShrink: 0
17
17
  });
18
- function StackedMeter({
18
+ function StackedMeterImpl({
19
19
  segments,
20
20
  showLegend = true,
21
21
  height = 10
@@ -111,5 +111,6 @@ function StackedMeter({
111
111
  )
112
112
  ] });
113
113
  }
114
+ var StackedMeter = boxed(StackedMeterImpl, "StackedMeter");
114
115
 
115
116
  export { StackedMeter };
@@ -1,4 +1,5 @@
1
- import { Icon } from './chunk-ZUCI34QY.js';
1
+ import { Icon } from './chunk-6FADQ2SU.js';
2
+ import { boxed } from './chunk-SAN4IX6N.js';
2
3
  import { useState, useId, useCallback } from 'react';
3
4
  import { jsxs, jsx } from 'react/jsx-runtime';
4
5
 
@@ -15,7 +16,7 @@ var DISCLOSURE_CSS = `
15
16
  function DisclosureStyles() {
16
17
  return /* @__PURE__ */ jsx("style", { href: "erp-disclosure", precedence: "medium", children: DISCLOSURE_CSS });
17
18
  }
18
- function Disclosure({
19
+ function DisclosureImpl({
19
20
  summary,
20
21
  children,
21
22
  defaultOpen = false,
@@ -57,5 +58,6 @@ function Disclosure({
57
58
  hasContent ? /* @__PURE__ */ jsx("div", { id: contentId, className: "erp-disclosure__content", hidden: !isOpen, children }) : null
58
59
  ] });
59
60
  }
61
+ var Disclosure = boxed(DisclosureImpl, "Disclosure");
60
62
 
61
63
  export { Disclosure };
@@ -1,9 +1,10 @@
1
- import { includesLooseSearch } from './chunk-KADFN76X.js';
2
- import { Button, Dialog, Input, Tag, Checkbox } from './chunk-ZUCI34QY.js';
1
+ import { includesLooseSearch } from './chunk-WUTCZCQH.js';
2
+ import { Button, Dialog, Input, Tag, Checkbox } from './chunk-6FADQ2SU.js';
3
+ import { boxed } from './chunk-SAN4IX6N.js';
3
4
  import React, { useMemo, useState, useEffect } from 'react';
4
5
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
5
6
 
6
- function SearchableMultiPicker({
7
+ function SearchableMultiPickerImpl({
7
8
  title,
8
9
  options,
9
10
  values,
@@ -182,5 +183,6 @@ function SearchableMultiPicker({
182
183
  ) : null
183
184
  ] });
184
185
  }
186
+ var SearchableMultiPicker = boxed(SearchableMultiPickerImpl, "SearchableMultiPicker");
185
187
 
186
188
  export { SearchableMultiPicker };
@@ -1,5 +1,6 @@
1
- import { Disclosure } from './chunk-WNYWTFGW.js';
2
- import { Icon } from './chunk-ZUCI34QY.js';
1
+ import { Disclosure } from './chunk-CEFOZOOM.js';
2
+ import { Icon } from './chunk-6FADQ2SU.js';
3
+ import { boxed } from './chunk-SAN4IX6N.js';
3
4
  import { jsx, jsxs } from 'react/jsx-runtime';
4
5
 
5
6
  var TYPE_META = {
@@ -38,7 +39,7 @@ function formatPayload(payload) {
38
39
  return String(payload);
39
40
  }
40
41
  }
41
- function Timeline({ items, maxHeight }) {
42
+ function TimelineImpl({ items, maxHeight }) {
42
43
  if (items.length === 0) {
43
44
  return /* @__PURE__ */ jsx("p", { className: "wp-caption", style: { margin: 0, padding: "var(--wp-space-2) 0" }, children: "\uD45C\uC2DC\uD560 \uC774\uB825\uC774 \uC5C6\uC2B5\uB2C8\uB2E4." });
44
45
  }
@@ -73,5 +74,6 @@ function Timeline({ items, maxHeight }) {
73
74
  }
74
75
  );
75
76
  }
77
+ var Timeline = boxed(TimelineImpl, "Timeline");
76
78
 
77
79
  export { Timeline };
@@ -1,4 +1,5 @@
1
- import { IconButton, Badge } from './chunk-ZUCI34QY.js';
1
+ import { IconButton, Badge } from './chunk-6FADQ2SU.js';
2
+ import { boxed } from './chunk-SAN4IX6N.js';
2
3
  import { useRef, useState, useMemo, useCallback, useEffect } from 'react';
3
4
  import { jsxs, jsx } from 'react/jsx-runtime';
4
5
 
@@ -101,7 +102,7 @@ var nodeCardStyle = (selected) => ({
101
102
  cursor: "pointer",
102
103
  transition: "box-shadow var(--wp-duration-fast), border-color var(--wp-duration-fast)"
103
104
  });
104
- function OrgChart({
105
+ function OrgChartImpl({
105
106
  root,
106
107
  onNodeClick,
107
108
  selectedId,
@@ -429,5 +430,6 @@ function OrgChart({
429
430
  }
430
431
  );
431
432
  }
433
+ var OrgChart = boxed(OrgChartImpl, "OrgChart");
432
434
 
433
435
  export { OrgChart };
@@ -1,4 +1,5 @@
1
- import { SegmentedControl, IconButton, Button, Tag, EmptyState, Icon, Badge } from './chunk-ZUCI34QY.js';
1
+ import { SegmentedControl, IconButton, Button, Tag, EmptyState, Icon, Badge } from './chunk-6FADQ2SU.js';
2
+ import { boxed } from './chunk-SAN4IX6N.js';
2
3
  import { useState, useMemo } from 'react';
3
4
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
4
5
 
@@ -192,7 +193,7 @@ function normalizeViews(views) {
192
193
  return items.length > 0 ? items : VIEW_ITEMS;
193
194
  }
194
195
  var cellBorder = "1px solid var(--wp-border-subtle)";
195
- var EventCalendar = ({
196
+ var EventCalendarImpl = ({
196
197
  events,
197
198
  view,
198
199
  onViewChange,
@@ -763,5 +764,6 @@ var EventCalendar = ({
763
764
  }
764
765
  );
765
766
  };
767
+ var EventCalendar = boxed(EventCalendarImpl, "EventCalendar");
766
768
 
767
769
  export { EventCalendar };
@@ -1,8 +1,9 @@
1
- import { Badge, Tag } from './chunk-ZUCI34QY.js';
1
+ import { Badge, Tag } from './chunk-6FADQ2SU.js';
2
+ import { boxed } from './chunk-SAN4IX6N.js';
2
3
  import { useState, useMemo } from 'react';
3
4
  import { jsx } from 'react/jsx-runtime';
4
5
 
5
- function TagMultiSelect({
6
+ function TagMultiSelectImpl({
6
7
  options,
7
8
  values,
8
9
  onChange,
@@ -55,5 +56,6 @@ function TagMultiSelect({
55
56
  );
56
57
  }) });
57
58
  }
59
+ var TagMultiSelect = boxed(TagMultiSelectImpl, "TagMultiSelect");
58
60
 
59
61
  export { TagMultiSelect };
@@ -1,6 +1,6 @@
1
+ import { boxed } from './chunk-SAN4IX6N.js';
1
2
  import { jsxs, jsx } from 'react/jsx-runtime';
2
3
 
3
- // src/widgets/SummaryTable.tsx
4
4
  var SUMMARY_TABLE_CSS = `
5
5
  .erp-sumtable tfoot td{height:var(--wp-row-h);padding:0 12px;background:var(--wp-surface-sunken);border-top:var(--wp-border-w) solid var(--wp-border-strong);color:var(--wp-text-strong);font-weight:var(--wp-weight-semibold);vertical-align:middle}
6
6
  .erp-sumtable.wp-table--dense tfoot td{height:var(--wp-row-h-dense)}
@@ -17,7 +17,7 @@ function cellClass(column) {
17
17
  if (column.strong) classes.push("wp-table__strong");
18
18
  return classes.length > 0 ? classes.join(" ") : void 0;
19
19
  }
20
- function SummaryTable({ columns, rows, footer, dense = false }) {
20
+ function SummaryTableImpl({ columns, rows, footer, dense = false }) {
21
21
  const tableClass = dense ? "wp-table wp-table--dense erp-sumtable" : "wp-table erp-sumtable";
22
22
  return /* @__PURE__ */ jsxs("div", { className: "erp-sumtable__scroll", children: [
23
23
  /* @__PURE__ */ jsx(SummaryTableStyles, {}),
@@ -35,5 +35,6 @@ function SummaryTable({ columns, rows, footer, dense = false }) {
35
35
  ] })
36
36
  ] });
37
37
  }
38
+ var SummaryTable = boxed(SummaryTableImpl, "SummaryTable");
38
39
 
39
40
  export { SummaryTable };
@@ -1,5 +1,6 @@
1
- import { includesLooseSearch } from './chunk-KADFN76X.js';
2
- import { Icon, Button, Input, Spinner } from './chunk-ZUCI34QY.js';
1
+ import { includesLooseSearch } from './chunk-WUTCZCQH.js';
2
+ import { Icon, Button, Input, Spinner } from './chunk-6FADQ2SU.js';
3
+ import { boxed } from './chunk-SAN4IX6N.js';
3
4
  import { useId, useRef, useState, useEffect, useMemo } from 'react';
4
5
  import { jsxs, jsx } from 'react/jsx-runtime';
5
6
 
@@ -31,7 +32,7 @@ var ellipsisStyle = {
31
32
  var statusRowStyle = {
32
33
  padding: "var(--wp-space-2) var(--wp-space-3)"
33
34
  };
34
- function AutocompleteField({
35
+ function AutocompleteFieldImpl({
35
36
  search,
36
37
  options,
37
38
  labelKey = "label",
@@ -278,5 +279,6 @@ function AutocompleteField({
278
279
  ) }) : null
279
280
  ] });
280
281
  }
282
+ var AutocompleteField = boxed(AutocompleteFieldImpl, "AutocompleteField");
281
283
 
282
284
  export { AutocompleteField, toAutocompleteOptions };
@@ -1,4 +1,5 @@
1
- import { Badge, Checkbox, IconButton, Icon } from './chunk-ZUCI34QY.js';
1
+ import { Badge, Checkbox, IconButton, Icon } from './chunk-6FADQ2SU.js';
2
+ import { boxed } from './chunk-SAN4IX6N.js';
2
3
  import { useState, useEffect } from 'react';
3
4
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
4
5
 
@@ -31,7 +32,7 @@ function toneStyle(tone) {
31
32
  color: `var(--wp-status-${tone}-fg)`
32
33
  };
33
34
  }
34
- function ColumnBoard({
35
+ function ColumnBoardImpl({
35
36
  columns,
36
37
  items,
37
38
  onMove,
@@ -186,5 +187,6 @@ function ColumnBoard({
186
187
  ] }) : null
187
188
  ] });
188
189
  }
190
+ var ColumnBoard = boxed(ColumnBoardImpl, "ColumnBoard");
189
191
 
190
192
  export { ColumnBoard };