sellmate-design-system-react 9.0.0-beta.40 → 9.0.0-beta.41

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 (80) hide show
  1. package/AGENTS.md +41 -20
  2. package/dist/components/SBarcodeInput/README.md +3 -3
  3. package/dist/components/SBarcodeInput/SBarcodeInput.d.ts +3 -1
  4. package/dist/components/SChipInput/README.md +1 -1
  5. package/dist/components/SChipInput/SChipInput.d.ts +1 -1
  6. package/dist/components/SConfirmModal/README.md +3 -11
  7. package/dist/components/SConfirmModal/SConfirmModal.d.ts +16 -8
  8. package/dist/components/SConfirmModal/index.d.ts +1 -1
  9. package/dist/components/SDateRangePicker/README.md +2 -2
  10. package/dist/components/SDateRangePicker/SDateRangePicker.d.ts +4 -4
  11. package/dist/components/SEditor/EditorBody.d.ts +1 -1
  12. package/dist/components/SEditor/README.md +4 -4
  13. package/dist/components/SEditor/SEditor.d.ts +3 -3
  14. package/dist/components/SField/README.md +2 -2
  15. package/dist/components/SField/SField.d.ts +8 -2
  16. package/dist/components/SFilePicker/README.md +3 -3
  17. package/dist/components/SFilePicker/SFilePicker.d.ts +4 -4
  18. package/dist/components/SForm/README.md +1 -1
  19. package/dist/components/SForm/SForm.d.ts +2 -2
  20. package/dist/components/SGnb/README.md +7 -7
  21. package/dist/components/SGnb/SGnb.d.ts +9 -9
  22. package/dist/components/SGnb/gnb.config.d.ts +2 -2
  23. package/dist/components/SImage/README.md +1 -1
  24. package/dist/components/SImage/SImage.d.ts +2 -2
  25. package/dist/components/SInput/README.md +3 -3
  26. package/dist/components/SInput/SInput.d.ts +3 -3
  27. package/dist/components/SLayout/README.md +1 -1
  28. package/dist/components/SLayout/SLayout.d.ts +2 -2
  29. package/dist/components/SList/README.md +10 -2
  30. package/dist/components/SList/SList.d.ts +7 -3
  31. package/dist/components/SList/index.d.ts +1 -1
  32. package/dist/components/SLoadingModal/README.md +1 -1
  33. package/dist/components/SLoadingModal/SLoadingModal.d.ts +2 -2
  34. package/dist/components/SModal/README.md +1 -1
  35. package/dist/components/SNumberInput/README.md +5 -5
  36. package/dist/components/SNumberInput/SNumberInput.d.ts +5 -3
  37. package/dist/components/SPage/README.md +42 -3
  38. package/dist/components/SPage/SPage.d.ts +16 -1
  39. package/dist/components/SPage/SPageHeader.d.ts +19 -8
  40. package/dist/components/SPage/index.d.ts +1 -1
  41. package/dist/components/SPage/page-column.d.ts +11 -2
  42. package/dist/components/SPage/page-width.d.ts +23 -0
  43. package/dist/components/SPage/page.config.d.ts +18 -0
  44. package/dist/components/SPopup/README.md +8 -2
  45. package/dist/components/SPopup/SPopup.d.ts +7 -3
  46. package/dist/components/SPopup/index.d.ts +1 -1
  47. package/dist/components/SSearchInput/README.md +3 -3
  48. package/dist/components/SSearchInput/SSearchInput.d.ts +3 -3
  49. package/dist/components/SSelect/README.md +5 -5
  50. package/dist/components/SSelect/SSelect.d.ts +14 -6
  51. package/dist/components/SSplitter/README.md +2 -2
  52. package/dist/components/SSplitter/SSplitter.d.ts +7 -3
  53. package/dist/components/SSwitch/README.md +0 -1
  54. package/dist/components/SSwitch/SSwitch.d.ts +1 -3
  55. package/dist/components/STable/README.md +8 -9
  56. package/dist/components/STable/STable.d.ts +9 -11
  57. package/dist/components/STabs/README.md +1 -1
  58. package/dist/components/STabs/STabs.d.ts +2 -2
  59. package/dist/components/STextLink/README.md +1 -1
  60. package/dist/components/STextLink/STextLink.d.ts +1 -1
  61. package/dist/components/STextarea/README.md +3 -3
  62. package/dist/components/STextarea/STextarea.d.ts +3 -3
  63. package/dist/components/STimePicker/README.md +1 -1
  64. package/dist/components/STimePicker/STimePicker.d.ts +4 -4
  65. package/dist/components/STimeRangePicker/README.md +1 -1
  66. package/dist/components/STimeRangePicker/STimeRangePicker.d.ts +4 -4
  67. package/dist/components/SToast/README.md +1 -1
  68. package/dist/components/SToast/SToast.d.ts +2 -2
  69. package/dist/components/STooltip/README.md +1 -1
  70. package/dist/components/STooltip/STooltip.d.ts +1 -1
  71. package/dist/components/STree/README.md +4 -4
  72. package/dist/components/STree/STree.d.ts +17 -5
  73. package/dist/index.cjs +295 -237
  74. package/dist/index.cjs.map +1 -1
  75. package/dist/index.js +294 -238
  76. package/dist/index.js.map +1 -1
  77. package/dist/llms-full.txt +170 -106
  78. package/dist/llms.txt +41 -20
  79. package/dist/styles.css +9 -0
  80. package/package.json +1 -1
package/dist/index.cjs CHANGED
@@ -3413,7 +3413,7 @@ var SImage = /* @__PURE__ */ react.forwardRef(function SImage2({
3413
3413
  position = "50% 50%",
3414
3414
  loading: loading2 = "lazy",
3415
3415
  loadingShowDelay = 0,
3416
- noSpinner = false,
3416
+ showSpinner = true,
3417
3417
  loadingSlot,
3418
3418
  errorSlot,
3419
3419
  imgProps,
@@ -3449,7 +3449,7 @@ var SImage = /* @__PURE__ */ react.forwardRef(function SImage2({
3449
3449
  }, [status, loadingShowDelay, src]);
3450
3450
  const isEmpty = !src;
3451
3451
  const showFallback = isEmpty || status === "error";
3452
- const showSpinner = !isEmpty && status === "loading" && !noSpinner && spinnerVisible;
3452
+ const spinnerShown = !isEmpty && status === "loading" && showSpinner && spinnerVisible;
3453
3453
  return /* @__PURE__ */ jsxRuntime.jsxs(
3454
3454
  "div",
3455
3455
  {
@@ -3488,7 +3488,7 @@ var SImage = /* @__PURE__ */ react.forwardRef(function SImage2({
3488
3488
  }
3489
3489
  ),
3490
3490
  showFallback && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "absolute inset-0 flex items-center justify-center", children: errorSlot ?? /* @__PURE__ */ jsxRuntime.jsx(SIcon, { name: "image", size: EMPTY_ICON_SIZE, color: "var(--cmp-image-icon)" }) }),
3491
- showSpinner && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "absolute inset-0 flex items-center justify-center", children: loadingSlot ?? /* @__PURE__ */ jsxRuntime.jsx(SCircleProgress, { indeterminate: true, type: "neutral", size: SPINNER_SIZE }) })
3491
+ spinnerShown && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "absolute inset-0 flex items-center justify-center", children: loadingSlot ?? /* @__PURE__ */ jsxRuntime.jsx(SCircleProgress, { indeterminate: true, type: "neutral", size: SPINNER_SIZE }) })
3492
3492
  ]
3493
3493
  }
3494
3494
  );
@@ -4080,6 +4080,10 @@ var SDivider = /* @__PURE__ */ react.forwardRef(function SDivider2({ vertical =
4080
4080
  }
4081
4081
  );
4082
4082
  });
4083
+ var PADDING_CLASS = {
4084
+ default: "p-(--cmp-list-group-padding)",
4085
+ none: ""
4086
+ };
4083
4087
  var dividerStyle = { backgroundColor: "var(--cmp-listItem-border-default)" };
4084
4088
  function hasBorderedChild(children) {
4085
4089
  let bordered = false;
@@ -4105,15 +4109,15 @@ function withDividers(children) {
4105
4109
  ]
4106
4110
  );
4107
4111
  }
4108
- var SListImpl = /* @__PURE__ */ react.forwardRef(function SList({ className, children, useGap = false, usePadding = false, ...rest }, ref) {
4109
- const showDivider = !useGap && !hasBorderedChild(children);
4112
+ var SListImpl = /* @__PURE__ */ react.forwardRef(function SList({ className, children, gap = false, padding = "none", ...rest }, ref) {
4113
+ const showDivider = !gap && !hasBorderedChild(children);
4110
4114
  return /* @__PURE__ */ jsxRuntime.jsx(
4111
4115
  "div",
4112
4116
  {
4113
4117
  ref,
4114
4118
  className: cn(
4115
- useGap && "flex flex-col gap-(--cmp-list-group-gap)",
4116
- usePadding && "p-(--cmp-list-group-padding)",
4119
+ gap && "flex flex-col gap-(--cmp-list-group-gap)",
4120
+ PADDING_CLASS[padding],
4117
4121
  className
4118
4122
  ),
4119
4123
  ...rest,
@@ -4358,7 +4362,7 @@ function SDraggableListInner({
4358
4362
  maxDepth = 3,
4359
4363
  listId,
4360
4364
  group: groupName,
4361
- useGap,
4365
+ gap,
4362
4366
  className,
4363
4367
  ...rest
4364
4368
  }, ref) {
@@ -4373,7 +4377,7 @@ function SDraggableListInner({
4373
4377
  const fromIndexRef = react.useRef(null);
4374
4378
  const currentSelectedKey = selectedKey ?? internalSelectedKey;
4375
4379
  const usesDepth = getDepth != null;
4376
- const depthEnabled = usesDepth && !useGap;
4380
+ const depthEnabled = usesDepth && !gap;
4377
4381
  const groupDragging = dragContext?.dragging;
4378
4382
  const draggedSubtreeStart = dragContext ? groupDragging?.listId === listId ? groupDragging?.index ?? null : null : draggingIndex;
4379
4383
  const startDrag = react.useCallback((event, index) => {
@@ -4487,11 +4491,11 @@ function SDraggableListInner({
4487
4491
  borderTop: "2px solid var(--sys-color-fg-accentLight)",
4488
4492
  left: getIndicatorOffset(depth),
4489
4493
  right: 0,
4490
- top: useGap ? -5 : 0
4494
+ top: gap ? -5 : 0
4491
4495
  });
4492
4496
  const afterIndicatorStyle = (depth) => ({
4493
4497
  borderTop: "2px solid var(--sys-color-fg-accentLight)",
4494
- bottom: useGap ? -5 : -1,
4498
+ bottom: gap ? -5 : -1,
4495
4499
  left: getIndicatorOffset(depth),
4496
4500
  right: 0
4497
4501
  });
@@ -4514,7 +4518,7 @@ function SDraggableListInner({
4514
4518
  {
4515
4519
  ref: setListRef,
4516
4520
  ...rest,
4517
- useGap,
4521
+ gap,
4518
4522
  className: `${className ?? ""} ${dragContext ? "min-h-[40px]" : ""} ${showEmptyDrop ? "relative before:absolute before:left-0 before:right-0 before:top-0 before:z-10 before:h-[2px] before:bg-(--sys-color-fg-accentLight) before:content-['']" : ""}`,
4519
4523
  "data-drag-active": dragActive || void 0,
4520
4524
  "data-draggable-group": dragContext ? dragGroup : void 0,
@@ -5352,7 +5356,7 @@ function STreeAllItem({
5352
5356
  var STreeItemImpl = /* @__PURE__ */ react.forwardRef(function STreeItem({
5353
5357
  node,
5354
5358
  depth = 1,
5355
- isLast = true,
5359
+ last = true,
5356
5360
  ancestorLast = [],
5357
5361
  expanded = false,
5358
5362
  selected = false,
@@ -5420,7 +5424,7 @@ var STreeItemImpl = /* @__PURE__ */ react.forwardRef(function STreeItem({
5420
5424
  size,
5421
5425
  depth,
5422
5426
  hasChildren,
5423
- isLast,
5427
+ isLast: last,
5424
5428
  ancestorLast
5425
5429
  }
5426
5430
  ),
@@ -5488,7 +5492,7 @@ var STreeImpl = /* @__PURE__ */ react.forwardRef(function STree({
5488
5492
  defaultExpandedIds,
5489
5493
  selectable = true,
5490
5494
  size = "sm",
5491
- useAll = false,
5495
+ showSelectAll = false,
5492
5496
  cascadeSelection = true,
5493
5497
  guideline = true,
5494
5498
  border = true,
@@ -5511,7 +5515,7 @@ var STreeImpl = /* @__PURE__ */ react.forwardRef(function STree({
5511
5515
  const allSelected = selectableIds.length > 0 && selectableIds.every((id) => selectedSet.has(id));
5512
5516
  const someSelected = selectableIds.some((id) => selectedSet.has(id));
5513
5517
  const allIndeterminate = someSelected && !allSelected;
5514
- const showAllItem = selectable && useAll;
5518
+ const showAllItem = selectable && showSelectAll;
5515
5519
  const updateExpanded = (node) => {
5516
5520
  const next = new Set(currentExpandedIds);
5517
5521
  if (next.has(node.id)) next.delete(node.id);
@@ -5555,7 +5559,7 @@ var STreeImpl = /* @__PURE__ */ react.forwardRef(function STree({
5555
5559
  {
5556
5560
  node,
5557
5561
  depth,
5558
- isLast,
5562
+ last: isLast,
5559
5563
  ancestorLast,
5560
5564
  expanded: isExpanded,
5561
5565
  selected,
@@ -5699,7 +5703,7 @@ var STooltipImpl = /* @__PURE__ */ react.forwardRef(function STooltip({
5699
5703
  placement = "top",
5700
5704
  sideOffset = 8,
5701
5705
  tooltipType = "default",
5702
- useClose = false,
5706
+ showClose = false,
5703
5707
  disabled = false,
5704
5708
  children,
5705
5709
  icon = "helpOutline",
@@ -5734,7 +5738,7 @@ var STooltipImpl = /* @__PURE__ */ react.forwardRef(function STooltip({
5734
5738
  setOpenState(true);
5735
5739
  };
5736
5740
  const startHide = () => {
5737
- if (useClose) return;
5741
+ if (showClose) return;
5738
5742
  cancelHide();
5739
5743
  hideTimer.current = setTimeout(() => setOpenState(false), HIDE_DELAY_MS);
5740
5744
  };
@@ -5785,7 +5789,7 @@ var STooltipImpl = /* @__PURE__ */ react.forwardRef(function STooltip({
5785
5789
  return /* @__PURE__ */ jsxRuntime.jsxs(RPopover12__namespace.Root, { open, onOpenChange: setOpenState, children: [
5786
5790
  isNone ? (
5787
5791
  // 트리거 없음: children 을 래퍼 없이 그대로 앵커로 쓴다 (소비자 레이아웃 보존).
5788
- // mouse/focus 핸들러가 없으므로 useClose 없이도 자동 닫힘이 발생하지 않는다.
5792
+ // mouse/focus 핸들러가 없으므로 showClose 없이도 자동 닫힘이 발생하지 않는다.
5789
5793
  /* @__PURE__ */ jsxRuntime.jsx(RPopover12__namespace.Anchor, { asChild: true, children: triggerNode })
5790
5794
  ) : isHover ? (
5791
5795
  // hover: Anchor(위치 기준) + 직접 mouse 핸들러 — 클릭으로 토글되지 않도록 Trigger 미사용
@@ -5810,10 +5814,10 @@ var STooltipImpl = /* @__PURE__ */ react.forwardRef(function STooltip({
5810
5814
  style: contentStyle,
5811
5815
  onOpenAutoFocus: (e) => e.preventDefault(),
5812
5816
  onInteractOutside: (e) => {
5813
- if (useClose || isNone) e.preventDefault();
5817
+ if (showClose || isNone) e.preventDefault();
5814
5818
  },
5815
5819
  onEscapeKeyDown: (e) => {
5816
- if (useClose || isNone) e.preventDefault();
5820
+ if (showClose || isNone) e.preventDefault();
5817
5821
  },
5818
5822
  onMouseEnter: isHover ? cancelHide : void 0,
5819
5823
  onMouseLeave: isHover ? startHide : void 0,
@@ -5821,7 +5825,7 @@ var STooltipImpl = /* @__PURE__ */ react.forwardRef(function STooltip({
5821
5825
  children: [
5822
5826
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-start gap-[12px]", children: [
5823
5827
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "min-w-0 flex-1", children: body }),
5824
- useClose && !isNone && /* @__PURE__ */ jsxRuntime.jsx(
5828
+ showClose && !isNone && /* @__PURE__ */ jsxRuntime.jsx(
5825
5829
  SGhostButton,
5826
5830
  {
5827
5831
  icon: "close",
@@ -6078,7 +6082,7 @@ var SSplitterRoot = /* @__PURE__ */ react.forwardRef(function SSplitter({
6078
6082
  onValueChange,
6079
6083
  unit = "%",
6080
6084
  limits,
6081
- emitImmediately = false,
6085
+ updateWhileDragging = false,
6082
6086
  vertical = false,
6083
6087
  disabled = false,
6084
6088
  dividerClassName,
@@ -6108,8 +6112,8 @@ var SSplitterRoot = /* @__PURE__ */ react.forwardRef(function SSplitter({
6108
6112
  const [minLimit, maxLimit] = limits ?? SSPLITTER_DEFAULT_LIMITS[unit];
6109
6113
  const stateRef = react.useRef({ committedValue, unit, vertical, minLimit, maxLimit });
6110
6114
  stateRef.current = { committedValue, unit, vertical, minLimit, maxLimit };
6111
- const emitRef = react.useRef({ onValueChange, emitImmediately, isControlled });
6112
- emitRef.current = { onValueChange, emitImmediately, isControlled };
6115
+ const emitRef = react.useRef({ onValueChange, updateWhileDragging, isControlled });
6116
+ emitRef.current = { onValueChange, updateWhileDragging, isControlled };
6113
6117
  const measure = react.useCallback(() => {
6114
6118
  const el = rootRef.current;
6115
6119
  if (!el) return 0;
@@ -6148,7 +6152,7 @@ var SSplitterRoot = /* @__PURE__ */ react.forwardRef(function SSplitter({
6148
6152
  const delta = (isVertical ? moveEvent.clientY : moveEvent.clientX) - startPos;
6149
6153
  latest = clamp4(startValue + multiplier * delta, containerSize);
6150
6154
  setDragValue(latest);
6151
- if (emitRef.current.emitImmediately) commit(latest);
6155
+ if (emitRef.current.updateWhileDragging) commit(latest);
6152
6156
  };
6153
6157
  const endDrag = () => {
6154
6158
  document.removeEventListener("mousemove", onMove);
@@ -6585,7 +6589,7 @@ var STextLink = /* @__PURE__ */ react.forwardRef(function STextLink2({
6585
6589
  icon,
6586
6590
  iconColor,
6587
6591
  iconRotate,
6588
- labelClass,
6592
+ labelClassName,
6589
6593
  rightArrow = "none",
6590
6594
  rightArrowRotate,
6591
6595
  underline = false,
@@ -6632,7 +6636,7 @@ var STextLink = /* @__PURE__ */ react.forwardRef(function STextLink2({
6632
6636
  /* @__PURE__ */ jsxRuntime.jsx(
6633
6637
  "span",
6634
6638
  {
6635
- className: cn(labelClass),
6639
+ className: cn(labelClassName),
6636
6640
  style: disabled ? { color: "var(--cmp-textLink-content-disabled)" } : void 0,
6637
6641
  children: label || children
6638
6642
  }
@@ -6898,13 +6902,12 @@ function SSwitch({
6898
6902
  value = false,
6899
6903
  leftLabel,
6900
6904
  rightLabel,
6901
- label,
6902
6905
  disabled = false,
6903
6906
  onValueChange,
6904
6907
  className,
6905
6908
  style
6906
6909
  }) {
6907
- const right = rightLabel ?? label;
6910
+ const right = rightLabel;
6908
6911
  const renderLabel = (text) => text ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-[12px] font-medium leading-[20px]", children: text }) : null;
6909
6912
  const trackBg = disabled ? value ? "var(--cmp-switch-bg-disabled-on)" : "var(--cmp-switch-bg-disabled-off)" : value ? "var(--cmp-switch-bg-on)" : "var(--cmp-switch-bg-off)";
6910
6913
  return /* @__PURE__ */ jsxRuntime.jsxs(
@@ -7788,7 +7791,7 @@ function SPopover({
7788
7791
  STextLink,
7789
7792
  {
7790
7793
  label: leftLinkLabel,
7791
- labelClass: leftLinkLabelClass,
7794
+ labelClassName: leftLinkLabelClass,
7792
7795
  onClick: onLeftLinkClick
7793
7796
  }
7794
7797
  ),
@@ -7811,14 +7814,18 @@ function SPopover({
7811
7814
  ) })
7812
7815
  ] });
7813
7816
  }
7817
+ var BODY_PADDING_CLASS2 = {
7818
+ default: "p-(--sys-space-panel-padding-default)",
7819
+ none: ""
7820
+ };
7814
7821
  var SPopup = /* @__PURE__ */ react.forwardRef(function SPopup2({
7815
7822
  popupTitle = "",
7816
7823
  type = "default",
7817
- useFooter = false,
7824
+ showFooter = false,
7818
7825
  submitButton,
7819
7826
  onSubmit,
7820
7827
  footerLeft,
7821
- noPadding = false,
7828
+ padding = "default",
7822
7829
  children,
7823
7830
  className,
7824
7831
  style
@@ -7853,7 +7860,7 @@ var SPopup = /* @__PURE__ */ react.forwardRef(function SPopup2({
7853
7860
  {
7854
7861
  className: cn(
7855
7862
  "box-border min-h-0 flex-1 overflow-auto",
7856
- !noPadding && "p-(--sys-space-panel-padding-default)",
7863
+ BODY_PADDING_CLASS2[padding],
7857
7864
  SCROLLBAR_CLASS,
7858
7865
  SCROLLBAR_TRACK_BG_CLASS,
7859
7866
  SCROLLBAR_TRACK_BORDER_CLASS
@@ -7861,7 +7868,7 @@ var SPopup = /* @__PURE__ */ react.forwardRef(function SPopup2({
7861
7868
  children
7862
7869
  }
7863
7870
  ),
7864
- useFooter && /* @__PURE__ */ jsxRuntime.jsx(SFooter, { left: footerLeft, button: { ...submitButton, onClick: onSubmit } })
7871
+ showFooter && /* @__PURE__ */ jsxRuntime.jsx(SFooter, { left: footerLeft, button: { ...submitButton, onClick: onSubmit } })
7865
7872
  ]
7866
7873
  }
7867
7874
  );
@@ -8157,17 +8164,15 @@ var TYPE_ICON_COLOR = {
8157
8164
  negative: "var(--cmp-modal-confirm-negative-icon)",
8158
8165
  default: ""
8159
8166
  };
8160
- var MAIN_BUTTON_STYLE = {
8161
- primary_md: { color: "primary" },
8162
- primary_outline_md: { color: "primary", outline: true },
8163
- danger_md: { color: "danger" },
8164
- danger_outline_md: { color: "danger", outline: true },
8165
- neutral_outline_md: { color: "neutral", outline: true }
8167
+ var MAIN_BUTTON_COLOR = {
8168
+ positive: "primary",
8169
+ negative: "danger",
8170
+ default: "neutral"
8166
8171
  };
8167
- var DEFAULT_MAIN_BUTTON = {
8168
- positive: "primary_md",
8169
- negative: "danger_md",
8170
- default: "neutral_outline_md"
8172
+ var MAIN_BUTTON_OUTLINE = {
8173
+ positive: false,
8174
+ negative: false,
8175
+ default: true
8171
8176
  };
8172
8177
  function SConfirmModal({
8173
8178
  open,
@@ -8175,7 +8180,7 @@ function SConfirmModal({
8175
8180
  persistent = false,
8176
8181
  type = "positive",
8177
8182
  modalTitle = "",
8178
- titleClass,
8183
+ titleClassName,
8179
8184
  topMessage = [],
8180
8185
  bottomMessage = [],
8181
8186
  tagLabel,
@@ -8187,14 +8192,15 @@ function SConfirmModal({
8187
8192
  optionSlot,
8188
8193
  contentSlot,
8189
8194
  mainButtonLabel = "\uD655\uC778",
8190
- mainButtonName,
8195
+ mainButtonOutline,
8191
8196
  subButtonLabel,
8192
8197
  onOk,
8193
8198
  onCancel,
8194
8199
  onClose
8195
8200
  }) {
8196
8201
  const iconName = TYPE_ICON[type];
8197
- const mainStyle = MAIN_BUTTON_STYLE[mainButtonName ?? DEFAULT_MAIN_BUTTON[type]];
8202
+ const mainColor = MAIN_BUTTON_COLOR[type];
8203
+ const mainOutline = mainButtonOutline ?? MAIN_BUTTON_OUTLINE[type];
8198
8204
  const [settled, setSettled] = react.useState(false);
8199
8205
  react.useEffect(() => {
8200
8206
  if (open) setSettled(false);
@@ -8228,7 +8234,7 @@ function SConfirmModal({
8228
8234
  {
8229
8235
  className: cn(
8230
8236
  "text-center text-[18px] font-bold leading-[30px] text-[color:var(--cmp-modal-confirm-title-color)]",
8231
- titleClass
8237
+ titleClassName
8232
8238
  ),
8233
8239
  children: modalTitle
8234
8240
  }
@@ -8275,7 +8281,8 @@ function SConfirmModal({
8275
8281
  /* @__PURE__ */ jsxRuntime.jsx(
8276
8282
  SButton,
8277
8283
  {
8278
- ...mainStyle,
8284
+ color: mainColor,
8285
+ outline: mainOutline,
8279
8286
  size: "md",
8280
8287
  disabled: settled,
8281
8288
  onClick: () => settle(onOk),
@@ -8394,7 +8401,7 @@ function SLoadingModal({
8394
8401
  state: state2 = "loading",
8395
8402
  progress,
8396
8403
  message,
8397
- useButton = false,
8404
+ showButton = false,
8398
8405
  buttonLabel,
8399
8406
  onButtonClick,
8400
8407
  width = 520,
@@ -8402,7 +8409,7 @@ function SLoadingModal({
8402
8409
  }) {
8403
8410
  const resolvedMessage = message ?? DEFAULT_MESSAGE[state2];
8404
8411
  const lines = Array.isArray(resolvedMessage) ? resolvedMessage : resolvedMessage ? [resolvedMessage] : [];
8405
- const showButton = useButton || state2 === "error";
8412
+ const buttonVisible = showButton || state2 === "error";
8406
8413
  return /* @__PURE__ */ jsxRuntime.jsx(
8407
8414
  SModalContainer,
8408
8415
  {
@@ -8424,7 +8431,7 @@ function SLoadingModal({
8424
8431
  },
8425
8432
  i
8426
8433
  )) }),
8427
- showButton && /* @__PURE__ */ jsxRuntime.jsx(
8434
+ buttonVisible && /* @__PURE__ */ jsxRuntime.jsx(
8428
8435
  SButton,
8429
8436
  {
8430
8437
  color: "neutral",
@@ -9160,7 +9167,11 @@ var useIsomorphicLayoutEffect = typeof window !== "undefined" ? react.useLayoutE
9160
9167
  var SPageColumnContext = /* @__PURE__ */ react.createContext(null);
9161
9168
  function SPageColumn({ full, children }) {
9162
9169
  const [scrolled, setScrolled] = react.useState(false);
9163
- const value = react.useMemo(() => ({ scrolled, setScrolled }), [scrolled]);
9170
+ const [contentWidth, setContentWidth] = react.useState("full");
9171
+ const value = react.useMemo(
9172
+ () => ({ scrolled, setScrolled, contentWidth, setContentWidth }),
9173
+ [scrolled, contentWidth]
9174
+ );
9164
9175
  return /* @__PURE__ */ jsxRuntime.jsx(SPageColumnContext.Provider, { value, children: /* @__PURE__ */ jsxRuntime.jsx(
9165
9176
  "div",
9166
9177
  {
@@ -9183,7 +9194,7 @@ function useSLayout() {
9183
9194
  var SLayout = /* @__PURE__ */ react.forwardRef(function SLayout2({
9184
9195
  type = "box",
9185
9196
  header = "fix",
9186
- useRail = false,
9197
+ showRail = false,
9187
9198
  folded,
9188
9199
  defaultFolded = false,
9189
9200
  onFoldedChange,
@@ -9212,12 +9223,12 @@ var SLayout = /* @__PURE__ */ react.forwardRef(function SLayout2({
9212
9223
  () => ({
9213
9224
  type,
9214
9225
  header: effectiveHeader,
9215
- useRail,
9226
+ showRail,
9216
9227
  folded: currentFolded,
9217
9228
  setFolded,
9218
9229
  registerNav
9219
9230
  }),
9220
- [type, effectiveHeader, useRail, currentFolded, setFolded, registerNav]
9231
+ [type, effectiveHeader, showRail, currentFolded, setFolded, registerNav]
9221
9232
  );
9222
9233
  const isFullHeader = effectiveHeader === "full";
9223
9234
  const minWidthStyle = {
@@ -9466,12 +9477,12 @@ var SGnb = /* @__PURE__ */ react.forwardRef(function SGnb2({
9466
9477
  header: headerProp,
9467
9478
  color = "light",
9468
9479
  items,
9469
- useRail: useRailProp,
9480
+ showRail: useRailProp,
9470
9481
  value = "",
9471
9482
  onValueChange,
9472
9483
  onRailChange,
9473
9484
  folded: foldedProp,
9474
- onFoldChange,
9485
+ onFoldedChange,
9475
9486
  onLauncherClick,
9476
9487
  logo,
9477
9488
  topContent,
@@ -9494,8 +9505,8 @@ var SGnb = /* @__PURE__ */ react.forwardRef(function SGnb2({
9494
9505
  const layout = react.useContext(SLayoutContext);
9495
9506
  const type = typeProp ?? layout?.type ?? "box";
9496
9507
  const folded = foldedProp ?? layout?.folded ?? false;
9497
- const useRail = useRailProp ?? layout?.useRail ?? false;
9498
- const railHasLeaf = useRail && items.some((item4) => !item4.children || item4.children.length === 0);
9508
+ const showRail = useRailProp ?? layout?.showRail ?? false;
9509
+ const railHasLeaf = showRail && items.some((item4) => !item4.children || item4.children.length === 0);
9499
9510
  const header = railHasLeaf ? "full" : headerProp ?? layout?.header ?? "fix";
9500
9511
  const H = GNB_HEADER[header];
9501
9512
  const M = GNB_MENU[type];
@@ -9603,7 +9614,7 @@ var SGnb = /* @__PURE__ */ react.forwardRef(function SGnb2({
9603
9614
  };
9604
9615
  const handleFoldToggle = () => {
9605
9616
  const next = !folded;
9606
- onFoldChange?.(next);
9617
+ onFoldedChange?.(next);
9607
9618
  if (foldedProp === void 0) layout?.setFolded(next);
9608
9619
  };
9609
9620
  const renderRailItem = (item4) => {
@@ -9762,9 +9773,9 @@ var SGnb = /* @__PURE__ */ react.forwardRef(function SGnb2({
9762
9773
  ] }, item4.value)
9763
9774
  );
9764
9775
  };
9765
- const railItems = useRail ? items : [];
9766
- const menuItems = useRail ? items.find((item4) => item4.value === activeRail)?.children ?? [] : items;
9767
- const showMenu = !useRail || menuItems.length > 0;
9776
+ const railItems = showRail ? items : [];
9777
+ const menuItems = showRail ? items.find((item4) => item4.value === activeRail)?.children ?? [] : items;
9778
+ const showMenu = !showRail || menuItems.length > 0;
9768
9779
  const [uncontrolledMenuWidth, setUncontrolledMenuWidth] = react.useState(
9769
9780
  () => defaultMenuWidth ?? GNB_MENU_WIDTH
9770
9781
  );
@@ -9772,7 +9783,7 @@ var SGnb = /* @__PURE__ */ react.forwardRef(function SGnb2({
9772
9783
  const committedMenuWidth = menuWidthProp ?? uncontrolledMenuWidth;
9773
9784
  const menuWidth = clampGnbMenuWidth(dragMenuWidth ?? committedMenuWidth);
9774
9785
  const [resizing, setResizing] = react.useState(false);
9775
- const bodyWidth = (useRail ? GNB_RAIL_WIDTH : 0) + (showMenu ? menuWidth : 0);
9786
+ const bodyWidth = (showRail ? GNB_RAIL_WIDTH : 0) + (showMenu ? menuWidth : 0);
9776
9787
  const registerNav = layout?.registerNav;
9777
9788
  useIsomorphicLayoutEffect(() => {
9778
9789
  if (!registerNav) return;
@@ -10045,7 +10056,7 @@ var SGnb = /* @__PURE__ */ react.forwardRef(function SGnb2({
10045
10056
  transition: `transform ${GNB_FOLD_MS}ms ease-out, ${hideAfterSlide(folded)}`
10046
10057
  },
10047
10058
  children: [
10048
- useRail && // 레일 컬럼 — 스크롤되는 아이템 목록(nav)을 가운데 두고 위아래에 고정 슬롯(top/footer)을 붙인다.
10059
+ showRail && // 레일 컬럼 — 스크롤되는 아이템 목록(nav)을 가운데 두고 위아래에 고정 슬롯(top/footer)을 붙인다.
10049
10060
  // 두 슬롯은 내비게이션이 아니므로 nav(landmark) 밖에 두고, 컬럼 폭·구분선·배경은 이 래퍼가
10050
10061
  // 전체 높이에 걸쳐 책임진다(그래야 슬롯 자리까지 배경·오른쪽 선이 이어진다).
10051
10062
  /* @__PURE__ */ jsxRuntime.jsxs(
@@ -10621,12 +10632,26 @@ var SGnbSystem = /* @__PURE__ */ react.forwardRef(function SGnbSystem2({
10621
10632
  }
10622
10633
  );
10623
10634
  });
10635
+
10636
+ // src/components/SPage/page-width.ts
10637
+ var MIN_CONTENT_WIDTH = `calc(var(${SLAYOUT_MIN_WIDTH_VAR}, 0px) - 100cqw + 100%)`;
10638
+ var SURPLUS = `max(0px, calc(100cqw - var(${SLAYOUT_MIN_WIDTH_VAR}, 0px)))`;
10639
+ var HALF_SURPLUS = `max(0px, calc((100cqw - var(${SLAYOUT_MIN_WIDTH_VAR}, 0px)) / 2))`;
10640
+ var contentWidthStyle = (mode) => {
10641
+ switch (mode) {
10642
+ case "fixed":
10643
+ return { marginRight: SURPLUS };
10644
+ case "fixedCenter":
10645
+ return { marginLeft: HALF_SURPLUS, marginRight: HALF_SURPLUS };
10646
+ default:
10647
+ return void 0;
10648
+ }
10649
+ };
10624
10650
  var BACKGROUND_CLASS = {
10625
10651
  frame: "bg-[var(--sys-color-bg-frame)]",
10626
10652
  neutral: "bg-[var(--sys-color-bg-neutralLight)]",
10627
10653
  screen: "bg-[var(--sys-color-bg-screen)]"
10628
10654
  };
10629
- var MIN_CONTENT_WIDTH = `calc(var(${SLAYOUT_MIN_WIDTH_VAR}, 0px) - 100cqw + 100%)`;
10630
10655
  var NATIVE_SCROLLBAR_BACKGROUND_CLASS = {
10631
10656
  frame: `${SCROLLBAR_TRACK_BORDER_CLASS} ${SCROLLBAR_TRACK_BG_CLASS}`,
10632
10657
  neutral: `${SCROLLBAR_TRACK_BORDER_CLASS} ${SCROLLBAR_TRACK_BG_WHITE_CLASS}`,
@@ -10773,6 +10798,7 @@ var SPage = /* @__PURE__ */ react.forwardRef(function SPage2({
10773
10798
  scrollEndSpacing = false,
10774
10799
  overlayScrollbar = false,
10775
10800
  contentHeight = "auto",
10801
+ contentWidth = "full",
10776
10802
  className,
10777
10803
  style,
10778
10804
  children,
@@ -10782,6 +10808,12 @@ var SPage = /* @__PURE__ */ react.forwardRef(function SPage2({
10782
10808
  const layout = react.useContext(SLayoutContext);
10783
10809
  const column = react.useContext(SPageColumnContext);
10784
10810
  const gridStyle = layout?.header === "full" && !column ? { gridArea: "page" } : void 0;
10811
+ const setColumnContentWidth = column?.setContentWidth;
10812
+ useIsomorphicLayoutEffect(() => {
10813
+ if (!setColumnContentWidth) return;
10814
+ setColumnContentWidth(contentWidth);
10815
+ return () => setColumnContentWidth("full");
10816
+ }, [setColumnContentWidth, contentWidth]);
10785
10817
  const scrollRef = react.useRef(null);
10786
10818
  const setMainRef = react.useCallback(
10787
10819
  (node) => {
@@ -10796,6 +10828,7 @@ var SPage = /* @__PURE__ */ react.forwardRef(function SPage2({
10796
10828
  setColumnScrolled?.(e.currentTarget.scrollTop > 0);
10797
10829
  };
10798
10830
  const fill = contentHeight === "fill";
10831
+ const fixedWidthStyle = layout ? contentWidthStyle(contentWidth) : void 0;
10799
10832
  const main = /* @__PURE__ */ jsxRuntime.jsx(
10800
10833
  "main",
10801
10834
  {
@@ -10811,7 +10844,14 @@ var SPage = /* @__PURE__ */ react.forwardRef(function SPage2({
10811
10844
  style: !overlayScrollbar ? { ...gridStyle, ...style } : style,
10812
10845
  onScroll: handleScroll,
10813
10846
  ...rest,
10814
- children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn(fill && "h-full"), style: { minWidth: MIN_CONTENT_WIDTH }, children })
10847
+ children: /* @__PURE__ */ jsxRuntime.jsx(
10848
+ "div",
10849
+ {
10850
+ className: cn(fill && "h-full"),
10851
+ style: { minWidth: MIN_CONTENT_WIDTH, ...fixedWidthStyle },
10852
+ children
10853
+ }
10854
+ )
10815
10855
  }
10816
10856
  );
10817
10857
  if (!overlayScrollbar) return main;
@@ -10834,20 +10874,24 @@ var SPage = /* @__PURE__ */ react.forwardRef(function SPage2({
10834
10874
  // src/components/SPage/page.config.ts
10835
10875
  var PAGE_BACKGROUNDS = ["frame", "neutral", "screen"];
10836
10876
  var PAGE_CONTENT_HEIGHTS = ["auto", "fill"];
10877
+ var PAGE_CONTENT_WIDTHS = ["full", "fixed", "fixedCenter"];
10878
+ var PAGE_HEADER_VARIANTS = ["plain", "bar"];
10837
10879
  var SPageHeader = /* @__PURE__ */ withDisplayName(
10838
- react.forwardRef(function SPageHeader2({ title, subText, fix = false, onBack, slot, scrolled, className, style, ...rest }, ref) {
10880
+ react.forwardRef(function SPageHeader2({ title, subText, variant, onBack, slot, scrolled, className, style, ...rest }, ref) {
10839
10881
  const hasBack = onBack != null;
10882
+ const bar = variant === "bar";
10840
10883
  const column = react.useContext(SPageColumnContext);
10841
10884
  const isScrolled = scrolled ?? column?.scrolled ?? false;
10842
- return /* @__PURE__ */ jsxRuntime.jsxs(
10885
+ const rowStyle = column ? contentWidthStyle(column.contentWidth) : void 0;
10886
+ return /* @__PURE__ */ jsxRuntime.jsx(
10843
10887
  "header",
10844
10888
  {
10845
10889
  ref,
10846
10890
  className: cn(
10847
- "relative z-10 box-border flex shrink-0 items-center gap-(--cmp-pageHeader-gap) px-(--cmp-pageHeader-paddingX)",
10848
- // 배경은 두 베리에이션이 같은 흰 면이다 — fix 가 가르는 것은 높이·구분선·서브 텍스트 자리다.
10891
+ "relative z-10 box-border flex shrink-0 items-center px-(--cmp-pageHeader-paddingX)",
10892
+ // 배경은 두 베리에이션이 같은 흰 면이다 — variant 가 가르는 것은 높이·구분선·서브 텍스트 자리다.
10849
10893
  // plain 에는 전용 배경 토큰이 없어 시스템 흰 표면을 쓴다(토큰이 생기면 그것으로 갈아끼운다).
10850
- fix ? "h-(--cmp-pageHeader-bar-height) border-b border-(--cmp-pageHeader-bar-border) bg-(--cmp-pageHeader-bar-bg) py-(--cmp-pageHeader-bar-paddingY)" : cn(
10894
+ bar ? "h-(--cmp-pageHeader-bar-height) border-b border-(--cmp-pageHeader-bar-border) bg-(--cmp-pageHeader-bar-bg) py-(--cmp-pageHeader-bar-paddingY)" : cn(
10851
10895
  // 스크롤되면 그림자를 더해 콘텐츠 위에 뜬 것처럼 보이게 한다.
10852
10896
  "bg-(--sys-color-bg-frame) pt-(--cmp-pageHeader-plain-paddingTop) pb-(--cmp-pageHeader-plain-paddingBottom)",
10853
10897
  isScrolled && "shadow-floating"
@@ -10856,33 +10900,40 @@ var SPageHeader = /* @__PURE__ */ withDisplayName(
10856
10900
  ),
10857
10901
  style,
10858
10902
  ...rest,
10859
- children: [
10860
- hasBack && /* @__PURE__ */ jsxRuntime.jsx(
10861
- SGhostButton,
10862
- {
10863
- icon: "chevronLeft",
10864
- size: "xs",
10865
- ariaLabel: "\uB4A4\uB85C\uAC00\uAE30",
10866
- onClick: onBack,
10867
- className: "shrink-0"
10868
- }
10869
- ),
10870
- /* @__PURE__ */ jsxRuntime.jsxs(
10871
- "div",
10872
- {
10873
- className: cn(
10874
- "flex min-w-0 flex-1 items-center",
10875
- fix ? "flex-row gap-(--cmp-pageHeader-gap)" : "flex-col items-start gap-(--cmp-pageHeader-plain-title-gap)",
10876
- !hasBack && "pl-(--cmp-pageHeader-title-paddingLeft)"
10903
+ children: /* @__PURE__ */ jsxRuntime.jsxs(
10904
+ "div",
10905
+ {
10906
+ className: "flex min-w-0 flex-1 items-center gap-(--cmp-pageHeader-gap)",
10907
+ style: rowStyle,
10908
+ children: [
10909
+ hasBack && /* @__PURE__ */ jsxRuntime.jsx(
10910
+ SGhostButton,
10911
+ {
10912
+ icon: "chevronLeft",
10913
+ size: "xs",
10914
+ ariaLabel: "\uB4A4\uB85C\uAC00\uAE30",
10915
+ onClick: onBack,
10916
+ className: "shrink-0"
10917
+ }
10877
10918
  ),
10878
- children: [
10879
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "typo-heading-lg min-w-0 truncate text-(--cmp-pageHeader-title-text)", children: title }),
10880
- subText && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "typo-body-md-default min-w-0 truncate text-(--cmp-pageHeader-subtitle-text)", children: subText })
10881
- ]
10882
- }
10883
- ),
10884
- slot && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ml-auto flex shrink-0 items-center", children: slot })
10885
- ]
10919
+ /* @__PURE__ */ jsxRuntime.jsxs(
10920
+ "div",
10921
+ {
10922
+ className: cn(
10923
+ "flex min-w-0 flex-1 items-center",
10924
+ bar ? "flex-row gap-(--cmp-pageHeader-gap)" : "flex-col items-start gap-(--cmp-pageHeader-plain-title-gap)",
10925
+ !hasBack && "pl-(--cmp-pageHeader-title-paddingLeft)"
10926
+ ),
10927
+ children: [
10928
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "typo-heading-lg min-w-0 truncate text-(--cmp-pageHeader-title-text)", children: title }),
10929
+ subText && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "typo-body-md-default min-w-0 truncate text-(--cmp-pageHeader-subtitle-text)", children: subText })
10930
+ ]
10931
+ }
10932
+ ),
10933
+ slot && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ml-auto flex shrink-0 items-center", children: slot })
10934
+ ]
10935
+ }
10936
+ )
10886
10937
  }
10887
10938
  );
10888
10939
  }),
@@ -10912,13 +10963,13 @@ function STabs({
10912
10963
  value,
10913
10964
  tabs,
10914
10965
  onValueChange,
10915
- isSub = false,
10966
+ sub = false,
10916
10967
  vertical = false,
10917
10968
  className,
10918
10969
  style
10919
10970
  }) {
10920
10971
  const blue = TAB_MAIN_COLORS.selected.border;
10921
- const isVertical = isSub && vertical;
10972
+ const isVertical = sub && vertical;
10922
10973
  const tabRefs = react.useRef([]);
10923
10974
  const moveTo = (target) => {
10924
10975
  if (target < 0 || target >= tabs.length) return;
@@ -10926,7 +10977,7 @@ function STabs({
10926
10977
  tabRefs.current[target]?.focus();
10927
10978
  };
10928
10979
  const containerStyle = { ...style };
10929
- if (!isSub) containerStyle.borderBottom = `1px solid ${blue}`;
10980
+ if (!sub) containerStyle.borderBottom = `1px solid ${blue}`;
10930
10981
  return /* @__PURE__ */ jsxRuntime.jsx(
10931
10982
  "div",
10932
10983
  {
@@ -10934,9 +10985,9 @@ function STabs({
10934
10985
  "aria-orientation": isVertical ? "vertical" : "horizontal",
10935
10986
  className: cn(
10936
10987
  // main(가로): baseline(하단 divider)이 100% 너비로 채워지도록 w-full
10937
- isSub ? "inline-flex w-fit" : "flex w-full",
10988
+ sub ? "inline-flex w-fit" : "flex w-full",
10938
10989
  isVertical ? "flex-col items-stretch" : "flex-row",
10939
- isSub ? isVertical ? "gap-[16px]" : "gap-[24px]" : "gap-[4px]",
10990
+ sub ? isVertical ? "gap-[16px]" : "gap-[24px]" : "gap-[4px]",
10940
10991
  className
10941
10992
  ),
10942
10993
  style: containerStyle,
@@ -10944,7 +10995,7 @@ function STabs({
10944
10995
  const selected = tab.value === value;
10945
10996
  const select = () => onValueChange?.(tab.value);
10946
10997
  let tabStyle;
10947
- if (isSub) {
10998
+ if (sub) {
10948
10999
  tabStyle = {
10949
11000
  height: 20,
10950
11001
  paddingBottom: 4,
@@ -12314,6 +12365,7 @@ var ALIGN = {
12314
12365
  center: "center",
12315
12366
  end: "flex-end"
12316
12367
  };
12368
+ var FOCUS_RING_SHADOW = "0px 0px 4px 0px #0071ff66";
12317
12369
  var cssLen = (v) => v === void 0 || v === "" || v === 0 ? void 0 : typeof v === "number" ? `${v}px` : v;
12318
12370
  var SField = /* @__PURE__ */ react.forwardRef(function SField2({
12319
12371
  name,
@@ -12380,7 +12432,11 @@ var SField = /* @__PURE__ */ react.forwardRef(function SField2({
12380
12432
  const addonWidth = effectiveAddonLabel !== "" ? cssLen(labelWidth) : void 0;
12381
12433
  const maxWidthValue = fieldWidthValue(maxWidth);
12382
12434
  const resolvedMaxWidth = maxWidthValue === void 0 || effectiveAddonLabel === "" ? maxWidthValue : addonWidth ? `calc(${maxWidthValue} + ${addonWidth})` : void 0;
12383
- const borderColor = borderless ? "transparent" : disabled ? "var(--color-grey-45)" : interactive && focused ? "var(--sys-color-field-border-focus)" : resolvedSuccess ? "var(--sys-color-field-border-success)" : resolvedError ? "var(--sys-color-field-border-danger)" : "var(--sys-color-field-border-default)";
12435
+ const borderColor = borderless ? "transparent" : disabled ? "var(--color-grey-45)" : (
12436
+ // focus·hover(제어 prop) 가 error/pass 보다 우선 — 실제 :hover/:focus-within 클래스도
12437
+ // 같은 순서로 --field-bc 를 덮으므로, prop 으로 흉내 낸 상태도 그와 같게 둔다.
12438
+ interactive && (focused || hovered) ? "var(--sys-color-field-border-focus)" : resolvedSuccess ? "var(--sys-color-field-border-success)" : resolvedError ? "var(--sys-color-field-border-danger)" : "var(--sys-color-field-border-default)"
12439
+ );
12384
12440
  const bgColor = borderless ? "transparent" : disabled ? "var(--color-grey-30)" : readOnly ? "var(--sys-color-field-bg-readOnly)" : "var(--sys-color-field-bg-default)";
12385
12441
  const textColor = disabled ? "var(--color-grey-65)" : readOnly ? "var(--sys-color-field-text-readOnly)" : "var(--sys-color-field-text-default)";
12386
12442
  return /* @__PURE__ */ jsxRuntime.jsx(
@@ -12458,7 +12514,7 @@ var SField = /* @__PURE__ */ react.forwardRef(function SField2({
12458
12514
  // @ts-expect-error CSS 변수
12459
12515
  "--field-bc": borderColor,
12460
12516
  // focused/hovered prop이 명시된 경우 강조를 즉시 반영
12461
- ...interactive && !borderless && focused ? { boxShadow: "0px 0px 4px 0px #0071ff66" } : {},
12517
+ ...interactive && !borderless && (focused || hovered) ? { boxShadow: FOCUS_RING_SHADOW } : {},
12462
12518
  ...multiline ? { minHeight: s.height } : { height: s.height },
12463
12519
  "borderRadius": s.radius,
12464
12520
  "background": bgColor,
@@ -12527,7 +12583,7 @@ var SSearchInput = /* @__PURE__ */ react.forwardRef(function SSearchInput2({
12527
12583
  width,
12528
12584
  focused,
12529
12585
  hovered,
12530
- inputClass,
12586
+ inputClassName,
12531
12587
  inputStyle,
12532
12588
  className,
12533
12589
  style,
@@ -12588,7 +12644,7 @@ var SSearchInput = /* @__PURE__ */ react.forwardRef(function SSearchInput2({
12588
12644
  // type="search" 의 브라우저 기본 취소 버튼은 clearable 과 겹치므로 지운다
12589
12645
  "h-full min-w-0 flex-1 border-0 bg-transparent p-0 outline-none placeholder:text-[color:var(--sys-color-field-text-placeholder)] disabled:cursor-not-allowed [&::-webkit-search-cancel-button]:hidden",
12590
12646
  AUTOFILL_RESET_CLASS,
12591
- inputClass
12647
+ inputClassName
12592
12648
  ),
12593
12649
  style: {
12594
12650
  // fontSize/lineHeight 는 컨테이너에서 상속 (원본 font-size: inherit)
@@ -12663,12 +12719,12 @@ var SSelectImpl = /* @__PURE__ */ react.forwardRef(function SSelect({
12663
12719
  value,
12664
12720
  onValueChange,
12665
12721
  onOpenChange,
12666
- emitValue = false,
12722
+ valueAsPrimitive = false,
12667
12723
  name,
12668
12724
  options = [],
12669
12725
  type = "default",
12670
- useSearch = false,
12671
- useSelectAll = false,
12726
+ showSearch = false,
12727
+ showSelectAll = false,
12672
12728
  allSelectedLabel = "\uC804\uCCB4",
12673
12729
  placeholder = "\uC120\uD0DD",
12674
12730
  disabled = false,
@@ -12713,7 +12769,7 @@ var SSelectImpl = /* @__PURE__ */ react.forwardRef(function SSelect({
12713
12769
  const hasLeaf = react.useMemo(() => flat.some((o) => !o.isGroup), [flat]);
12714
12770
  const allOptionsDisabled = hasLeaf && selectable.length === 0;
12715
12771
  const effectiveDisabled = disabled || allOptionsDisabled;
12716
- const showSearch = useSearch && selectable.length >= SEARCH_THRESHOLD;
12772
+ const searchVisible = showSearch && selectable.length >= SEARCH_THRESHOLD;
12717
12773
  const labelByValue = react.useMemo(() => new Map(flat.map((o) => [o.value, o.label])), [flat]);
12718
12774
  const rawByValue = react.useMemo(() => new Map(flat.map((o) => [o.value, o.raw])), [flat]);
12719
12775
  const optionByValue = react.useMemo(
@@ -12730,9 +12786,9 @@ var SSelectImpl = /* @__PURE__ */ react.forwardRef(function SSelect({
12730
12786
  const emit3 = (next) => {
12731
12787
  if (!onValueChange) return;
12732
12788
  const mapped = next.map(
12733
- (v) => emitValue ? rawByValue.get(v) ?? v : optionByValue.get(v) ?? { value: v, label: v }
12789
+ (v) => valueAsPrimitive ? rawByValue.get(v) ?? v : optionByValue.get(v) ?? { value: v, label: v }
12734
12790
  );
12735
- onValueChange(multi ? mapped : mapped[0] ?? (emitValue ? "" : null));
12791
+ onValueChange(multi ? mapped : mapped[0] ?? (valueAsPrimitive ? "" : null));
12736
12792
  };
12737
12793
  const commitOpen = (next, valueForRules) => {
12738
12794
  setOpen(next);
@@ -12779,12 +12835,12 @@ var SSelectImpl = /* @__PURE__ */ react.forwardRef(function SSelect({
12779
12835
  resetValidation: () => setRuleError("")
12780
12836
  });
12781
12837
  const filtered = react.useMemo(() => {
12782
- if (!showSearch || search.trim() === "") return flat;
12838
+ if (!searchVisible || search.trim() === "") return flat;
12783
12839
  const q = search.trim().toLowerCase();
12784
12840
  return flat.filter(
12785
12841
  (o) => o.isGroup || (isHtmlLabel(o.label) ? extractText(o.label) : o.label).toLowerCase().includes(q)
12786
12842
  );
12787
- }, [flat, search, showSearch]);
12843
+ }, [flat, search, searchVisible]);
12788
12844
  const allValues = selectable.map((o) => o.value);
12789
12845
  const allSelected = allValues.length > 0 && allValues.every((v) => selected.includes(v));
12790
12846
  const hasItems = filtered.some((o) => !o.isGroup);
@@ -12797,7 +12853,7 @@ var SSelectImpl = /* @__PURE__ */ react.forwardRef(function SSelect({
12797
12853
  }, [filtered]);
12798
12854
  const navigableItems = react.useMemo(() => {
12799
12855
  const items = [];
12800
- if (multi && useSelectAll && allValues.length > 0) {
12856
+ if (multi && showSelectAll && allValues.length > 0) {
12801
12857
  items.push({ key: "__select_all__", isSelectAll: true });
12802
12858
  }
12803
12859
  filtered.forEach((o, i) => {
@@ -12812,7 +12868,7 @@ var SSelectImpl = /* @__PURE__ */ react.forwardRef(function SSelect({
12812
12868
  }
12813
12869
  });
12814
12870
  return items;
12815
- }, [allValues.length, filtered, groupLeafValues, multi, useSelectAll]);
12871
+ }, [allValues.length, filtered, groupLeafValues, multi, showSelectAll]);
12816
12872
  const selectedAnchorIndex = react.useMemo(() => {
12817
12873
  if (selected.length === 0) return -1;
12818
12874
  const selectedSet = new Set(selected);
@@ -13040,7 +13096,7 @@ var SSelectImpl = /* @__PURE__ */ react.forwardRef(function SSelect({
13040
13096
  viewportPadding: 24,
13041
13097
  fit: !dropdownWidth,
13042
13098
  onOpenAutoFocus: (event) => {
13043
- if (!showSearch) {
13099
+ if (!searchVisible) {
13044
13100
  event.preventDefault();
13045
13101
  return;
13046
13102
  }
@@ -13073,7 +13129,7 @@ var SSelectImpl = /* @__PURE__ */ react.forwardRef(function SSelect({
13073
13129
  style: { maxHeight: clampToAvailableHeight(dropdownHeight, POPOVER_AVAILABLE_HEIGHT) },
13074
13130
  onMouseLeave: () => setFocusedIndex(-1),
13075
13131
  children: [
13076
- showSearch && /* @__PURE__ */ jsxRuntime.jsx(
13132
+ searchVisible && /* @__PURE__ */ jsxRuntime.jsx(
13077
13133
  "div",
13078
13134
  {
13079
13135
  ref: searchBarRef,
@@ -13099,7 +13155,7 @@ var SSelectImpl = /* @__PURE__ */ react.forwardRef(function SSelect({
13099
13155
  selected,
13100
13156
  groupLeafValues,
13101
13157
  focusedValue: navigableItems[focusedIndex]?.key,
13102
- showSelectAll: multi && useSelectAll && allValues.length > 0,
13158
+ showSelectAll: multi && showSelectAll && allValues.length > 0,
13103
13159
  selectAllLabel: allSelectedLabel,
13104
13160
  selectAllSelected: allSelected,
13105
13161
  onSelectAll: handleSelectAll,
@@ -13356,19 +13412,19 @@ var STable = /* @__PURE__ */ react.forwardRef(function STable2({
13356
13412
  stickyColumn,
13357
13413
  radius = "default",
13358
13414
  bordered = true,
13359
- noDataLabel = "\uB370\uC774\uD130\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.",
13360
- noDataSlot,
13361
- isLoading = false,
13415
+ emptyLabel = "\uB370\uC774\uD130\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.",
13416
+ emptySlot,
13417
+ loading: loading2 = false,
13362
13418
  dense = false,
13363
13419
  onDenseChange,
13364
- noHover = false,
13420
+ hoverable = true,
13365
13421
  pagination,
13366
13422
  onPageChange,
13367
- useInternalPagination = false,
13368
- useRowsPerPageSelect = false,
13423
+ internalPagination = false,
13424
+ showRowsPerPageSelect = false,
13369
13425
  rowsPerPageOption = DEFAULT_ROWS_PER_PAGE_OPTION,
13370
13426
  onRowsPerPageChange,
13371
- useVirtualScroll = false,
13427
+ virtualScroll = false,
13372
13428
  rowHeight,
13373
13429
  virtualBuffer = 5,
13374
13430
  virtualEndThreshold = 10,
@@ -13507,16 +13563,16 @@ var STable = /* @__PURE__ */ react.forwardRef(function STable2({
13507
13563
  setHeaderGutter(el.offsetWidth - el.clientWidth);
13508
13564
  setScrolledLeft(el.scrollLeft > 0);
13509
13565
  setScrolledRight(el.scrollLeft + el.clientWidth < el.scrollWidth - 1);
13510
- if (useVirtualScroll) {
13566
+ if (virtualScroll) {
13511
13567
  const { start, end } = calcRange(el.scrollTop, el.clientHeight);
13512
13568
  setVsRange((prev) => prev.start === start && prev.end === end ? prev : { start, end });
13513
13569
  }
13514
- }, [useVirtualScroll, calcRange]);
13570
+ }, [virtualScroll, calcRange]);
13515
13571
  react.useEffect(() => {
13516
13572
  handleScroll();
13517
- }, [handleScroll, rowCount, columnWidths, isLoading, height]);
13573
+ }, [handleScroll, rowCount, columnWidths, loading2, height]);
13518
13574
  react.useEffect(() => {
13519
- if (!useVirtualScroll) return;
13575
+ if (!virtualScroll) return;
13520
13576
  cbRef.current.onVirtualUpdate?.({ from: vsRange.start, to: vsRange.end });
13521
13577
  const threshold = Math.max(1, virtualEndThreshold);
13522
13578
  if (vsRange.end >= Math.max(0, rowCount - threshold) && lastReachEndRef.current !== rowCount) {
@@ -13528,7 +13584,7 @@ var STable = /* @__PURE__ */ react.forwardRef(function STable2({
13528
13584
  threshold
13529
13585
  });
13530
13586
  }
13531
- }, [vsRange, useVirtualScroll, rowCount, virtualEndThreshold]);
13587
+ }, [vsRange, virtualScroll, rowCount, virtualEndThreshold]);
13532
13588
  const getStickyStyle = react.useCallback(
13533
13589
  (colIdx) => {
13534
13590
  const leftOffset = columnWidths.slice(0, colIdx).reduce((a, b) => a + b, selectable ? SELECTABLE_COLUMN_WIDTH : 0);
@@ -13553,7 +13609,7 @@ var STable = /* @__PURE__ */ react.forwardRef(function STable2({
13553
13609
  isRowSelected,
13554
13610
  getIsAllChecked,
13555
13611
  getPaginationInfo: () => {
13556
- if (!useInternalPagination || !pagination) return null;
13612
+ if (!internalPagination || !pagination) return null;
13557
13613
  const startIndex = (currentPage - 1) * innerRowsPerPage;
13558
13614
  return {
13559
13615
  startIndex,
@@ -13584,7 +13640,7 @@ var STable = /* @__PURE__ */ react.forwardRef(function STable2({
13584
13640
  getIsAllChecked,
13585
13641
  getStickyStyle,
13586
13642
  setRowCount,
13587
- useInternalPagination,
13643
+ internalPagination,
13588
13644
  pagination,
13589
13645
  currentPage,
13590
13646
  innerRowsPerPage,
@@ -13623,31 +13679,31 @@ var STable = /* @__PURE__ */ react.forwardRef(function STable2({
13623
13679
  },
13624
13680
  [visibleCols]
13625
13681
  );
13626
- const pageInfo = useInternalPagination && pagination ? {
13682
+ const pageInfo = internalPagination && pagination ? {
13627
13683
  startIndex: (currentPage - 1) * innerRowsPerPage,
13628
13684
  endIndex: (currentPage - 1) * innerRowsPerPage + innerRowsPerPage
13629
13685
  } : null;
13630
13686
  let bodyRows = rows;
13631
13687
  let topSpacer = 0;
13632
13688
  let bottomSpacer = 0;
13633
- if (useVirtualScroll) {
13689
+ if (virtualScroll) {
13634
13690
  bodyRows = rows.slice(vsRange.start, vsRange.end);
13635
13691
  topSpacer = vsRange.start * effectiveRowHeight;
13636
13692
  bottomSpacer = Math.max(0, (rowCount - vsRange.end) * effectiveRowHeight);
13637
13693
  } else if (pageInfo) {
13638
13694
  bodyRows = rows.slice(pageInfo.startIndex, pageInfo.endIndex);
13639
13695
  }
13640
- const isNoData = rowCount === 0 && !isLoading;
13641
- const showNoDataSlot = isNoData && noDataSlot != null;
13642
- const showPagination = !useVirtualScroll && (pagination != null || useInternalPagination);
13643
- const lastPage = useInternalPagination ? Math.max(1, Math.ceil(rowCount / (innerRowsPerPage || 1))) : pagination?.lastPage ?? Math.max(1, Math.ceil(rowCount / (pagination?.rowsPerPage ?? 10)));
13644
- const displayPage = useInternalPagination ? currentPage : pagination?.page ?? 1;
13696
+ const isNoData = rowCount === 0 && !loading2;
13697
+ const showNoDataSlot = isNoData && emptySlot != null;
13698
+ const showPagination = !virtualScroll && (pagination != null || internalPagination);
13699
+ const lastPage = internalPagination ? Math.max(1, Math.ceil(rowCount / (innerRowsPerPage || 1))) : pagination?.lastPage ?? Math.max(1, Math.ceil(rowCount / (pagination?.rowsPerPage ?? 10)));
13700
+ const displayPage = internalPagination ? currentPage : pagination?.page ?? 1;
13645
13701
  const changePage = (p) => {
13646
- if (useInternalPagination) setCurrentPage(p);
13702
+ if (internalPagination) setCurrentPage(p);
13647
13703
  onPageChange?.(p);
13648
13704
  };
13649
13705
  const changeRowsPerPage = (perPage) => {
13650
- if (useInternalPagination) {
13706
+ if (internalPagination) {
13651
13707
  setInnerRowsPerPage(perPage);
13652
13708
  const newLast = Math.max(1, Math.ceil(rowCount / (perPage || 1)));
13653
13709
  setCurrentPage((cp) => cp > newLast ? newLast : cp);
@@ -13771,7 +13827,7 @@ var STable = /* @__PURE__ */ react.forwardRef(function STable2({
13771
13827
  !height && "min-h-0 grow",
13772
13828
  radiusClass,
13773
13829
  // 원본 sd-table__scroll-container--loading/--no-data: 로딩·데이터 없음 시 인터랙션 차단
13774
- (isLoading || rowCount === 0) && "pointer-events-none"
13830
+ (loading2 || rowCount === 0) && "pointer-events-none"
13775
13831
  ),
13776
13832
  style: {
13777
13833
  height,
@@ -13971,7 +14027,7 @@ var STable = /* @__PURE__ */ react.forwardRef(function STable2({
13971
14027
  )
13972
14028
  }
13973
14029
  ),
13974
- showNoDataSlot ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn(bodyScrollClass, "pointer-events-auto bg-white"), children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex h-full min-h-[60px] w-full items-center justify-center", children: noDataSlot }) }) : (
14030
+ showNoDataSlot ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn(bodyScrollClass, "pointer-events-auto bg-white"), children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex h-full min-h-[60px] w-full items-center justify-center", children: emptySlot }) }) : (
13975
14031
  /* 바디: 세로 스크롤은 이 컨테이너에만 생긴다 (헤더 제외) */
13976
14032
  /* @__PURE__ */ jsxRuntime.jsx(
13977
14033
  "div",
@@ -13981,7 +14037,7 @@ var STable = /* @__PURE__ */ react.forwardRef(function STable2({
13981
14037
  className: cn(
13982
14038
  bodyScrollClass,
13983
14039
  // 원본 sd-table__scroll-container--loading/--no-data: 로딩·데이터 없음 시 스크롤 차단
13984
- (isLoading || rowCount === 0) && "overflow-hidden"
14040
+ (loading2 || rowCount === 0) && "overflow-hidden"
13985
14041
  ),
13986
14042
  children: /* @__PURE__ */ jsxRuntime.jsxs(
13987
14043
  "table",
@@ -13991,7 +14047,7 @@ var STable = /* @__PURE__ */ react.forwardRef(function STable2({
13991
14047
  children: [
13992
14048
  colgroup,
13993
14049
  /* @__PURE__ */ jsxRuntime.jsxs("tbody", { children: [
13994
- useVirtualScroll && topSpacer > 0 && /* @__PURE__ */ jsxRuntime.jsx("tr", { "aria-hidden": true, style: { height: topSpacer }, children: /* @__PURE__ */ jsxRuntime.jsx("td", { colSpan: totalColSpan, className: "p-0" }) }),
14050
+ virtualScroll && topSpacer > 0 && /* @__PURE__ */ jsxRuntime.jsx("tr", { "aria-hidden": true, style: { height: topSpacer }, children: /* @__PURE__ */ jsxRuntime.jsx("td", { colSpan: totalColSpan, className: "p-0" }) }),
13995
14051
  rowCount === 0 ? null : bodyRows.map((row, ri) => {
13996
14052
  const isSel = selectedKeys.has(row[rowKey]);
13997
14053
  const rowBg = "bg-white";
@@ -14001,10 +14057,10 @@ var STable = /* @__PURE__ */ react.forwardRef(function STable2({
14001
14057
  onClick: () => onRowClick?.(row),
14002
14058
  className: cn(
14003
14059
  "group/table-row",
14004
- !noHover && "hover:bg-[var(--color-grey-05)]",
14060
+ hoverable && "hover:bg-[var(--color-grey-05)]",
14005
14061
  onRowClick && "cursor-pointer"
14006
14062
  ),
14007
- style: { height: useVirtualScroll ? effectiveRowHeight : rowH },
14063
+ style: { height: virtualScroll ? effectiveRowHeight : rowH },
14008
14064
  children: [
14009
14065
  selectable && /* @__PURE__ */ jsxRuntime.jsx(
14010
14066
  "td",
@@ -14013,7 +14069,7 @@ var STable = /* @__PURE__ */ react.forwardRef(function STable2({
14013
14069
  // 원본 .td--selected: 48px 고정폭, 항상 left sticky, 체크박스 중앙정렬
14014
14070
  "sticky left-0 z-[2] border-b border-solid border-[color:var(--cmp-table-border-color)] align-middle",
14015
14071
  rowBg,
14016
- !noHover && "group-hover/table-row:bg-[var(--color-grey-05)]",
14072
+ hoverable && "group-hover/table-row:bg-[var(--color-grey-05)]",
14017
14073
  stickyLeft === 0 && scrolledLeft && "shadow-[5px_0_8px_0_rgba(34,34,34,0.1)]"
14018
14074
  ),
14019
14075
  style: {
@@ -14031,7 +14087,7 @@ var STable = /* @__PURE__ */ react.forwardRef(function STable2({
14031
14087
  // 셀 배경은 흰색으로 채워 뒤 배경이 비치지 않게 하고, hover 시 행 배경(grey_05)을 따른다.
14032
14088
  "overflow-hidden text-ellipsis whitespace-nowrap border-b border-solid border-[color:var(--cmp-table-border-color)] text-[12px] leading-[20px] text-[color:var(--sys-color-fg-primary)]",
14033
14089
  rowBg,
14034
- !noHover && "group-hover/table-row:bg-[var(--color-grey-05)]",
14090
+ hoverable && "group-hover/table-row:bg-[var(--color-grey-05)]",
14035
14091
  stickyShadowClass(i),
14036
14092
  typeof col.tdClass === "function" ? col.tdClass(row) : col.tdClass
14037
14093
  );
@@ -14065,7 +14121,7 @@ var STable = /* @__PURE__ */ react.forwardRef(function STable2({
14065
14121
  row[rowKey] ?? ri
14066
14122
  );
14067
14123
  }),
14068
- useVirtualScroll && bottomSpacer > 0 && /* @__PURE__ */ jsxRuntime.jsx("tr", { "aria-hidden": true, style: { height: bottomSpacer }, children: /* @__PURE__ */ jsxRuntime.jsx("td", { colSpan: totalColSpan, className: "p-0" }) })
14124
+ virtualScroll && bottomSpacer > 0 && /* @__PURE__ */ jsxRuntime.jsx("tr", { "aria-hidden": true, style: { height: bottomSpacer }, children: /* @__PURE__ */ jsxRuntime.jsx("td", { colSpan: totalColSpan, className: "p-0" }) })
14069
14125
  ] })
14070
14126
  ]
14071
14127
  }
@@ -14081,13 +14137,13 @@ var STable = /* @__PURE__ */ react.forwardRef(function STable2({
14081
14137
  className: "pointer-events-none absolute left-0 right-0 top-0 z-[31] h-[var(--cmp-table-header-height)] bg-white/60"
14082
14138
  }
14083
14139
  ),
14084
- !showNoDataSlot && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "pointer-events-none absolute bottom-0 left-0 right-0 top-[var(--cmp-table-header-height)] z-[30] flex items-center justify-center bg-white/60 text-[12px] text-[color:var(--color-grey-65)]", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex min-h-[60px] w-full items-center justify-center", children: noDataLabel }) })
14140
+ !showNoDataSlot && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "pointer-events-none absolute bottom-0 left-0 right-0 top-[var(--cmp-table-header-height)] z-[30] flex items-center justify-center bg-white/60 text-[12px] text-[color:var(--color-grey-65)]", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex min-h-[60px] w-full items-center justify-center", children: emptyLabel }) })
14085
14141
  ] }),
14086
- isLoading && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute inset-0 z-30 flex items-center justify-center bg-white/60", children: /* @__PURE__ */ jsxRuntime.jsx(SCircleProgress, { indeterminate: true }) })
14142
+ loading2 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute inset-0 z-30 flex items-center justify-center bg-white/60", children: /* @__PURE__ */ jsxRuntime.jsx(SCircleProgress, { indeterminate: true }) })
14087
14143
  ]
14088
14144
  }
14089
14145
  ),
14090
- (showPagination || useRowsPerPageSelect) && // 원본 sd-table__pagination: 테이블 하단에 이어붙는 회색 바(높이 48px, margin-top:-1px로 테두리 겹침).
14146
+ (showPagination || showRowsPerPageSelect) && // 원본 sd-table__pagination: 테이블 하단에 이어붙는 회색 바(높이 48px, margin-top:-1px로 테두리 겹침).
14091
14147
  // SPagination은 전체 폭 기준 중앙, rows-per-page SSelect는 우측에 absolute 배치해 중앙 정렬을 유지한다.
14092
14148
  // 루트 높이가 확정된 경우(테이블이 남은 영역을 채우는 배치) 페이지네이션 바가
14093
14149
  // 눌리지 않도록 shrink-0으로 48px를 보장한다.
@@ -14103,7 +14159,7 @@ var STable = /* @__PURE__ */ react.forwardRef(function STable2({
14103
14159
  ),
14104
14160
  children: [
14105
14161
  showPagination && /* @__PURE__ */ jsxRuntime.jsx(SPagination, { currentPage: displayPage, lastPage, onPageChange: changePage }),
14106
- useRowsPerPageSelect && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "absolute right-[10px] top-1/2 flex -translate-y-1/2 items-center gap-[12px]", children: [
14162
+ showRowsPerPageSelect && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "absolute right-[10px] top-1/2 flex -translate-y-1/2 items-center gap-[12px]", children: [
14107
14163
  dense && /* @__PURE__ */ jsxRuntime.jsx(
14108
14164
  STextLink,
14109
14165
  {
@@ -14120,8 +14176,8 @@ var STable = /* @__PURE__ */ react.forwardRef(function STable2({
14120
14176
  SSelect2,
14121
14177
  {
14122
14178
  options: rowsPerPageOption,
14123
- value: useInternalPagination ? innerRowsPerPage : pagination?.rowsPerPage,
14124
- emitValue: true,
14179
+ value: internalPagination ? innerRowsPerPage : pagination?.rowsPerPage,
14180
+ valueAsPrimitive: true,
14125
14181
  onValueChange: (v) => changeRowsPerPage(Number(v)),
14126
14182
  width: 128
14127
14183
  }
@@ -14269,7 +14325,7 @@ var SInput = /* @__PURE__ */ react.forwardRef(function SInput2({
14269
14325
  status,
14270
14326
  focused,
14271
14327
  hovered,
14272
- inputClass,
14328
+ inputClassName,
14273
14329
  inputStyle,
14274
14330
  label,
14275
14331
  labelWidth,
@@ -14369,7 +14425,7 @@ var SInput = /* @__PURE__ */ react.forwardRef(function SInput2({
14369
14425
  className: cn(
14370
14426
  "h-full min-w-0 flex-1 border-0 bg-transparent p-0 outline-none placeholder:text-[color:var(--sys-color-field-text-placeholder)] disabled:cursor-not-allowed",
14371
14427
  AUTOFILL_RESET_CLASS,
14372
- inputClass
14428
+ inputClassName
14373
14429
  ),
14374
14430
  style: {
14375
14431
  // fontSize/lineHeight 는 컨테이너에서 상속 (원본 font-size: inherit)
@@ -14426,7 +14482,7 @@ var STextarea = /* @__PURE__ */ react.forwardRef(function STextarea2({
14426
14482
  status,
14427
14483
  focused,
14428
14484
  hovered,
14429
- textareaClass,
14485
+ textareaClassName,
14430
14486
  textareaStyle,
14431
14487
  label,
14432
14488
  labelWidth,
@@ -14506,7 +14562,7 @@ var STextarea = /* @__PURE__ */ react.forwardRef(function STextarea2({
14506
14562
  className: cn(
14507
14563
  "w-full resize-y border-0 bg-transparent outline-none placeholder:text-[color:var(--sys-color-field-text-placeholder)] disabled:cursor-not-allowed",
14508
14564
  AUTOFILL_RESET_CLASS,
14509
- textareaClass
14565
+ textareaClassName
14510
14566
  ),
14511
14567
  style: {
14512
14568
  minHeight: 100,
@@ -14551,8 +14607,8 @@ var formatInputWithCommas = (value) => {
14551
14607
  const formattedInt = addCommas(intPart === "" ? "0" : intPart);
14552
14608
  return `${isNeg ? "-" : ""}${formattedInt}${hasDecimal ? `.${decPart}` : ""}`;
14553
14609
  };
14554
- var getDecimalLimit = (useDecimal, maxDecimalLength) => {
14555
- if (!useDecimal || maxDecimalLength === void 0 || !Number.isFinite(maxDecimalLength)) {
14610
+ var getDecimalLimit = (allowDecimal, maxDecimalLength) => {
14611
+ if (!allowDecimal || maxDecimalLength === void 0 || !Number.isFinite(maxDecimalLength)) {
14556
14612
  return void 0;
14557
14613
  }
14558
14614
  return Math.max(0, Math.floor(maxDecimalLength));
@@ -14581,12 +14637,12 @@ var SNumberInput = /* @__PURE__ */ react.forwardRef(function SNumberInput2({
14581
14637
  min = Number.NEGATIVE_INFINITY,
14582
14638
  max = Number.POSITIVE_INFINITY,
14583
14639
  step = 1,
14584
- useButton = false,
14585
- useDecimal = false,
14640
+ showButton = false,
14641
+ allowDecimal = false,
14586
14642
  maxDecimalLength,
14587
14643
  inputPrefix = "",
14588
14644
  inputSuffix = "",
14589
- inputClass,
14645
+ inputClassName,
14590
14646
  inputStyle,
14591
14647
  autoFocus,
14592
14648
  onFocus,
@@ -14616,7 +14672,7 @@ var SNumberInput = /* @__PURE__ */ react.forwardRef(function SNumberInput2({
14616
14672
  }, ref) {
14617
14673
  const p = PAD3[size];
14618
14674
  const padX = `var(--cmp-numberInput-${size}-paddingX)`;
14619
- const decimalLimit = getDecimalLimit(useDecimal, maxDecimalLength);
14675
+ const decimalLimit = getDecimalLimit(allowDecimal, maxDecimalLength);
14620
14676
  const numValue = applyDecimalLimit(toNumber(value), decimalLimit);
14621
14677
  const [display, setDisplay] = react.useState(() => formatWithCommas(numValue));
14622
14678
  const [ruleError, setRuleError] = react.useState("");
@@ -14699,7 +14755,7 @@ var SNumberInput = /* @__PURE__ */ react.forwardRef(function SNumberInput2({
14699
14755
  setDisplayWithCaret(cleaned, logicalCaret);
14700
14756
  return;
14701
14757
  }
14702
- if (!useDecimal && cleaned.includes(".")) {
14758
+ if (!allowDecimal && cleaned.includes(".")) {
14703
14759
  resetRejectedInput(target, logicalCaret);
14704
14760
  return;
14705
14761
  }
@@ -14787,12 +14843,12 @@ var SNumberInput = /* @__PURE__ */ react.forwardRef(function SNumberInput2({
14787
14843
  style: {
14788
14844
  // 원본 sd-number-input: content gap = padding-x 토큰 (gap 토큰 아님)
14789
14845
  gap: `var(--cmp-numberInput-${size}-paddingX)`,
14790
- padding: `0 ${useButton ? padX : `calc(${padX} * 2)`}`,
14846
+ padding: `0 ${showButton ? padX : `calc(${padX} * 2)`}`,
14791
14847
  fontSize: p.fontSize,
14792
14848
  lineHeight: `${p.lineHeight}px`
14793
14849
  },
14794
14850
  children: [
14795
- useButton && stepper("dec"),
14851
+ showButton && stepper("dec"),
14796
14852
  inputPrefix !== "" && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "flex-shrink-0", style: { color: affixColor }, children: inputPrefix }),
14797
14853
  /* @__PURE__ */ jsxRuntime.jsx(
14798
14854
  "input",
@@ -14800,7 +14856,7 @@ var SNumberInput = /* @__PURE__ */ react.forwardRef(function SNumberInput2({
14800
14856
  ref: setRefs2,
14801
14857
  name,
14802
14858
  type: "text",
14803
- inputMode: useDecimal ? "decimal" : "numeric",
14859
+ inputMode: allowDecimal ? "decimal" : "numeric",
14804
14860
  value: display,
14805
14861
  placeholder,
14806
14862
  disabled,
@@ -14831,11 +14887,11 @@ var SNumberInput = /* @__PURE__ */ react.forwardRef(function SNumberInput2({
14831
14887
  // (h-full 이면 input 내부 텍스트 센터링을 브라우저가 수행해 1px 어긋날 수 있음)
14832
14888
  "min-w-0 flex-1 border-0 bg-transparent p-0 outline-none placeholder:text-[color:var(--cmp-numberInput-text-placeholder)] disabled:cursor-not-allowed",
14833
14889
  AUTOFILL_RESET_CLASS,
14834
- inputClass
14890
+ inputClassName
14835
14891
  ),
14836
14892
  style: {
14837
14893
  // fontSize/lineHeight 는 컨테이너에서 상속
14838
- textAlign: useButton ? "center" : "right",
14894
+ textAlign: showButton ? "center" : "right",
14839
14895
  color: disabled ? "var(--cmp-numberInput-text-disabled)" : "var(--cmp-numberInput-text-default)",
14840
14896
  ...inputStyle
14841
14897
  },
@@ -14845,7 +14901,7 @@ var SNumberInput = /* @__PURE__ */ react.forwardRef(function SNumberInput2({
14845
14901
  ),
14846
14902
  valueTooltip.tooltip,
14847
14903
  inputSuffix !== "" && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "flex-shrink-0", style: { color: affixColor }, children: inputSuffix }),
14848
- useButton && stepper("inc")
14904
+ showButton && stepper("inc")
14849
14905
  ]
14850
14906
  }
14851
14907
  )
@@ -15683,7 +15739,7 @@ function RangeCalendar({
15683
15739
  value,
15684
15740
  selectable,
15685
15741
  maxRange,
15686
- useTimePicker = false,
15742
+ showTimePicker = false,
15687
15743
  onSelect,
15688
15744
  onPendingStartChange,
15689
15745
  onViewChange
@@ -15702,7 +15758,7 @@ function RangeCalendar({
15702
15758
  const [eM, setEM] = react.useState(splitDateTime(value?.[1]).minute);
15703
15759
  const lastEmitted = react.useRef("");
15704
15760
  react.useEffect(() => {
15705
- if (useTimePicker && JSON.stringify(value) === lastEmitted.current) return;
15761
+ if (showTimePicker && JSON.stringify(value) === lastEmitted.current) return;
15706
15762
  const s = splitDateTime(value?.[0]);
15707
15763
  const e = splitDateTime(value?.[1]);
15708
15764
  setStart(s.date);
@@ -15711,7 +15767,7 @@ function RangeCalendar({
15711
15767
  setSM(s.minute);
15712
15768
  setEH(e.hour);
15713
15769
  setEM(e.minute);
15714
- }, [value, useTimePicker]);
15770
+ }, [value, showTimePicker]);
15715
15771
  const setBase = (ny, nm) => {
15716
15772
  setY(ny);
15717
15773
  setM(nm);
@@ -15759,7 +15815,7 @@ function RangeCalendar({
15759
15815
  const pad = (v) => String(Number(v) || 0).padStart(2, "0");
15760
15816
  const emit3 = (dateStart, dateEnd, time) => {
15761
15817
  const t = time ?? { sH, sM, eH, eM };
15762
- const range = useTimePicker ? [`${dateStart} ${pad(t.sH)}:${pad(t.sM)}`, `${dateEnd} ${pad(t.eH)}:${pad(t.eM)}`] : [dateStart, dateEnd];
15818
+ const range = showTimePicker ? [`${dateStart} ${pad(t.sH)}:${pad(t.sM)}`, `${dateEnd} ${pad(t.eH)}:${pad(t.eM)}`] : [dateStart, dateEnd];
15763
15819
  lastEmitted.current = JSON.stringify(range);
15764
15820
  onSelect(range);
15765
15821
  };
@@ -15769,7 +15825,7 @@ function RangeCalendar({
15769
15825
  setStart(d);
15770
15826
  setEnd(null);
15771
15827
  setHover(null);
15772
- if (useTimePicker) {
15828
+ if (showTimePicker) {
15773
15829
  setSH("00");
15774
15830
  setSM("00");
15775
15831
  setEH("23");
@@ -15780,7 +15836,7 @@ function RangeCalendar({
15780
15836
  }
15781
15837
  setEnd(d);
15782
15838
  onPendingStartChange?.(null);
15783
- emit3(start, d, useTimePicker ? { sH, sM, eH: "23", eM: "59" } : void 0);
15839
+ emit3(start, d, showTimePicker ? { sH, sM, eH: "23", eM: "59" } : void 0);
15784
15840
  };
15785
15841
  const changeTime = (which, part, raw) => {
15786
15842
  const digits = raw.replace(/\D/g, "").slice(0, 2);
@@ -15951,7 +16007,7 @@ function RangeCalendar({
15951
16007
  // 높이는 고정이 아니라 하한이다 — 5주/6주 달을 오갈 때의 높이 흔들림만 막으면 되고,
15952
16008
  // 창이 좁아 패널이 가로 스크롤될 때는 스크롤바 높이만큼 늘어날 수 있어야 한다.
15953
16009
  // (단일 달 SCalendar 도 min-h 를 쓴다)
15954
- useTimePicker ? "h-auto" : "min-h-[364px]"
16010
+ showTimePicker ? "h-auto" : "min-h-[364px]"
15955
16011
  ),
15956
16012
  children: [
15957
16013
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative flex items-center justify-center", children: [
@@ -15984,7 +16040,7 @@ function RangeCalendar({
15984
16040
  ]
15985
16041
  }
15986
16042
  ),
15987
- useTimePicker && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
16043
+ showTimePicker && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
15988
16044
  /* @__PURE__ */ jsxRuntime.jsx(SDivider, {}),
15989
16045
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex gap-[var(--cmp-datepicker-calendar-time-gap)]", children: [
15990
16046
  renderTimeSection("start", start, "\uBD80\uD130"),
@@ -16003,7 +16059,7 @@ function SDateRangePicker({
16003
16059
  placeholder = "YYYY-MM-DD ~ YYYY-MM-DD",
16004
16060
  selectable,
16005
16061
  maxRange,
16006
- useTimePicker = false,
16062
+ showTimePicker = false,
16007
16063
  disabled = false,
16008
16064
  clearable = false,
16009
16065
  width,
@@ -16071,14 +16127,14 @@ function SDateRangePicker({
16071
16127
  setPendingStart(null);
16072
16128
  onValueChange?.(r);
16073
16129
  if (rules && rules.length > 0) setRuleError(runRules(r, rules));
16074
- if (!useTimePicker) setOpen(false);
16130
+ if (!showTimePicker) setOpen(false);
16075
16131
  };
16076
16132
  const clear = () => {
16077
16133
  setPendingStart(null);
16078
16134
  onValueChange?.(null);
16079
16135
  if (rules && rules.length > 0) setRuleError(runRules(null, rules));
16080
16136
  };
16081
- const resolvedPlaceholder = useTimePicker && placeholder === "YYYY-MM-DD ~ YYYY-MM-DD" ? "YYYY-MM-DD HH:mm ~ YYYY-MM-DD HH:mm" : placeholder;
16137
+ const resolvedPlaceholder = showTimePicker && placeholder === "YYYY-MM-DD ~ YYYY-MM-DD" ? "YYYY-MM-DD HH:mm ~ YYYY-MM-DD HH:mm" : placeholder;
16082
16138
  return /* @__PURE__ */ jsxRuntime.jsx(
16083
16139
  SField,
16084
16140
  {
@@ -16192,7 +16248,7 @@ function SDateRangePicker({
16192
16248
  value: value ?? null,
16193
16249
  selectable,
16194
16250
  maxRange,
16195
- useTimePicker,
16251
+ showTimePicker,
16196
16252
  onSelect: select,
16197
16253
  onPendingStartChange: setPendingStart,
16198
16254
  onViewChange
@@ -16364,7 +16420,7 @@ function SFilePicker({
16364
16420
  hovered = false,
16365
16421
  inline = false,
16366
16422
  multiple = false,
16367
- useMultipleListBox = false,
16423
+ showMultipleListBox = false,
16368
16424
  accept,
16369
16425
  maxFileSize,
16370
16426
  maxTotalSize,
@@ -16464,7 +16520,7 @@ function SFilePicker({
16464
16520
  const iconSize = size === "md" ? 20 : 16;
16465
16521
  const gapCls = size === "md" ? "gap-[var(--cmp-filepicker-md-gap)]" : "gap-[var(--cmp-filepicker-sm-gap)]";
16466
16522
  const inlinePlaceholder = inline && !disabled && !hasFiles;
16467
- const showListbox = multiple && useMultipleListBox;
16523
+ const showListbox = multiple && showMultipleListBox;
16468
16524
  const filesArr = multiple ? files : [];
16469
16525
  const contentInner = /* @__PURE__ */ jsxRuntime.jsxs(
16470
16526
  "div",
@@ -16551,7 +16607,7 @@ function SFilePicker({
16551
16607
  }
16552
16608
  )
16553
16609
  ] }) : contentInner;
16554
- const chips = multiple && !useMultipleListBox && filesArr.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-[8px] flex flex-wrap gap-[8px]", children: filesArr.map((f, i) => /* @__PURE__ */ jsxRuntime.jsx(SChip2, { value: f.name, editable: false, onRemove: () => removeChip(i) }, i)) });
16610
+ const chips = multiple && !showMultipleListBox && filesArr.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-[8px] flex flex-wrap gap-[8px]", children: filesArr.map((f, i) => /* @__PURE__ */ jsxRuntime.jsx(SChip2, { value: f.name, editable: false, onRemove: () => removeChip(i) }, i)) });
16555
16611
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className, style, children: [
16556
16612
  /* @__PURE__ */ jsxRuntime.jsx(
16557
16613
  SField,
@@ -16763,7 +16819,7 @@ function SToast({
16763
16819
  link,
16764
16820
  linkLabel,
16765
16821
  buttonLabel,
16766
- useClose = false,
16822
+ showClose = false,
16767
16823
  type = "default",
16768
16824
  onClose,
16769
16825
  onButtonClick,
@@ -16823,7 +16879,7 @@ function SToast({
16823
16879
  onClick: (e) => onButtonClick?.(e)
16824
16880
  }
16825
16881
  ),
16826
- useClose && /* @__PURE__ */ jsxRuntime.jsx(
16882
+ showClose && /* @__PURE__ */ jsxRuntime.jsx(
16827
16883
  SGhostButton,
16828
16884
  {
16829
16885
  icon: "close",
@@ -17078,7 +17134,7 @@ var SToastContainer = /* @__PURE__ */ react.forwardRef(
17078
17134
  );
17079
17135
  }
17080
17136
  );
17081
- var SForm = /* @__PURE__ */ react.forwardRef(function SForm2({ formClass, onSubmit, onValidationError, children, className, style }, ref) {
17137
+ var SForm = /* @__PURE__ */ react.forwardRef(function SForm2({ formClassName, onSubmit, onValidationError, children, className, style }, ref) {
17082
17138
  const formRef = react.useRef(null);
17083
17139
  const fieldsRef = react.useRef(/* @__PURE__ */ new Set());
17084
17140
  const register = react.useCallback((entry) => {
@@ -17146,7 +17202,7 @@ var SForm = /* @__PURE__ */ react.forwardRef(function SForm2({ formClass, onSubm
17146
17202
  {
17147
17203
  ref: formRef,
17148
17204
  onSubmit: handleSubmit,
17149
- className: cn(formClass, className),
17205
+ className: cn(formClassName, className),
17150
17206
  style,
17151
17207
  noValidate: true,
17152
17208
  children
@@ -18995,7 +19051,7 @@ var EditorBody = /* @__PURE__ */ react.forwardRef(function EditorBody2({
18995
19051
  toolbar,
18996
19052
  bubbleMenu,
18997
19053
  onImageUpload,
18998
- editorClass,
19054
+ editorClassName,
18999
19055
  editorStyle
19000
19056
  }, ref) {
19001
19057
  const placeholderRef = react.useRef(placeholder);
@@ -19079,7 +19135,7 @@ var EditorBody = /* @__PURE__ */ react.forwardRef(function EditorBody2({
19079
19135
  SCROLLBAR_CLASS,
19080
19136
  SEDITOR_CONTENT_CLASS,
19081
19137
  disabled && "cursor-not-allowed",
19082
- editorClass
19138
+ editorClassName
19083
19139
  ),
19084
19140
  style: { ...editorContentStyle({ minHeight, maxHeight, disabled }), ...editorStyle },
19085
19141
  children: /* @__PURE__ */ jsxRuntime.jsx(api.EditorContent, { editor, className: "h-full" })
@@ -19205,7 +19261,7 @@ var SEditor = /* @__PURE__ */ react.forwardRef(function SEditor2({
19205
19261
  focused,
19206
19262
  hovered,
19207
19263
  name,
19208
- editorClass,
19264
+ editorClassName,
19209
19265
  editorStyle,
19210
19266
  onFocus,
19211
19267
  onBlur,
@@ -19334,7 +19390,7 @@ var SEditor = /* @__PURE__ */ react.forwardRef(function SEditor2({
19334
19390
  "div",
19335
19391
  {
19336
19392
  "aria-busy": true,
19337
- className: cn("min-w-0 flex-1 overflow-y-auto", SCROLLBAR_CLASS, editorClass),
19393
+ className: cn("min-w-0 flex-1 overflow-y-auto", SCROLLBAR_CLASS, editorClassName),
19338
19394
  style: { ...editorContentStyle({ minHeight, maxHeight, disabled }), ...editorStyle },
19339
19395
  children: (value ?? defaultValue ?? "") === "" && /* @__PURE__ */ jsxRuntime.jsx("span", { style: { color: "var(--sys-color-field-text-placeholder)" }, children: placeholder })
19340
19396
  }
@@ -19359,7 +19415,7 @@ var SEditor = /* @__PURE__ */ react.forwardRef(function SEditor2({
19359
19415
  toolbar: resolvedToolbar,
19360
19416
  bubbleMenu: resolvedBubbleMenu,
19361
19417
  onImageUpload,
19362
- editorClass,
19418
+ editorClassName,
19363
19419
  editorStyle
19364
19420
  }
19365
19421
  ) })
@@ -19812,23 +19868,23 @@ var SChipFilter = /* @__PURE__ */ react.forwardRef(function SChipFilter2({
19812
19868
  }
19813
19869
  setOpenKey(key);
19814
19870
  };
19815
- const emitValue = (key, nextValue) => {
19871
+ const valueAsPrimitive = (key, nextValue) => {
19816
19872
  const next = { ...values, [key]: nextValue };
19817
19873
  onValueChange?.(next);
19818
19874
  onFilterChange?.({ key, value: nextValue, values: next });
19819
19875
  return next;
19820
19876
  };
19821
19877
  const emitValueAndSearch = (key, nextValue) => {
19822
- runSearch(emitValue(key, nextValue));
19878
+ runSearch(valueAsPrimitive(key, nextValue));
19823
19879
  };
19824
19880
  const clearValue = (key) => {
19825
19881
  const field = fields.find((f) => f.key === key);
19826
19882
  const def = field ? resolveFieldDefault(field) : void 0;
19827
- runSearch(emitValue(key, def !== void 0 ? def : null));
19883
+ runSearch(valueAsPrimitive(key, def !== void 0 ? def : null));
19828
19884
  };
19829
19885
  const removeField = (key) => {
19830
19886
  keywordDraftRef.current = null;
19831
- const nextValues = emitValue(key, null);
19887
+ const nextValues = valueAsPrimitive(key, null);
19832
19888
  dismissedRef.current.add(key);
19833
19889
  setInternalActiveKeys((current) => current.filter((activeKey) => activeKey !== key));
19834
19890
  if (openKey === key) setOpenKey(null);
@@ -20068,7 +20124,7 @@ var SChipFilter = /* @__PURE__ */ react.forwardRef(function SChipFilter2({
20068
20124
  icon: "reset",
20069
20125
  iconColor: "grey_80",
20070
20126
  label: "\uAC80\uC0C9 \uCD08\uAE30\uD654",
20071
- labelClass: "text-grey-80",
20127
+ labelClassName: "text-grey-80",
20072
20128
  disabled: disabled || !canReset,
20073
20129
  onClick: reset,
20074
20130
  className: cn(
@@ -20106,7 +20162,7 @@ var SChipFilter = /* @__PURE__ */ react.forwardRef(function SChipFilter2({
20106
20162
  field: currentOpenField,
20107
20163
  value: values[currentOpenField.key],
20108
20164
  disabled: disabled || currentOpenField.disabled,
20109
- onValueChange: (next) => emitValue(currentOpenField.key, next),
20165
+ onValueChange: (next) => valueAsPrimitive(currentOpenField.key, next),
20110
20166
  onValueCommit: (next) => emitValueAndSearch(currentOpenField.key, next),
20111
20167
  onDraftChange: (text) => {
20112
20168
  keywordDraftRef.current = text.trim() === "" ? null : { key: currentOpenField.key, text };
@@ -20310,7 +20366,7 @@ function EditorPanel({
20310
20366
  {
20311
20367
  size: "sm",
20312
20368
  label: allSelected ? "\uC120\uD0DD \uD574\uC81C" : "\uC804\uCCB4 \uC120\uD0DD",
20313
- labelClass: "font-bold",
20369
+ labelClassName: "font-bold",
20314
20370
  disabled,
20315
20371
  onClick: toggleSelectAll,
20316
20372
  style: { color: "var(--sys-color-fg-secondary)" }
@@ -20333,7 +20389,7 @@ function EditorPanel({
20333
20389
  {
20334
20390
  size: "sm",
20335
20391
  label: "\uAC80\uC0C9",
20336
- labelClass: "font-bold",
20392
+ labelClassName: "font-bold",
20337
20393
  onClick: onClose,
20338
20394
  style: { color: CHIPFILTER.chipAppliedValue }
20339
20395
  }
@@ -21067,7 +21123,7 @@ var SChipInput = /* @__PURE__ */ react.forwardRef(function SChipInput2({
21067
21123
  name,
21068
21124
  rules,
21069
21125
  error,
21070
- useReset = false,
21126
+ showReset = false,
21071
21127
  maxCount,
21072
21128
  metaPlacement = "end",
21073
21129
  duplicateLabel,
@@ -21202,7 +21258,7 @@ var SChipInput = /* @__PURE__ */ react.forwardRef(function SChipInput2({
21202
21258
  commit(values.slice(0, -1));
21203
21259
  }
21204
21260
  };
21205
- const showResetLink = useReset && values.length > 0;
21261
+ const showResetLink = showReset && values.length > 0;
21206
21262
  const showMaxCount = maxCount != null;
21207
21263
  const showMetaInfo = showResetLink || showMaxCount;
21208
21264
  const closeDropdown = () => {
@@ -21522,7 +21578,7 @@ var SBarcodeInput = /* @__PURE__ */ react.forwardRef(
21522
21578
  hovered,
21523
21579
  prefix,
21524
21580
  suffix,
21525
- inputClass,
21581
+ inputClassName,
21526
21582
  inputStyle,
21527
21583
  label,
21528
21584
  labelWidth,
@@ -21613,7 +21669,7 @@ var SBarcodeInput = /* @__PURE__ */ react.forwardRef(
21613
21669
  className: cn(
21614
21670
  "h-full min-w-0 flex-1 border-0 bg-transparent p-0 outline-none placeholder:text-[color:var(--cmp-textinput-text-placeholder)] disabled:cursor-not-allowed",
21615
21671
  AUTOFILL_RESET_CLASS,
21616
- inputClass
21672
+ inputClassName
21617
21673
  ),
21618
21674
  style: {
21619
21675
  fontSize: f.fontSize,
@@ -21707,7 +21763,7 @@ var TIME_SELECTOR_WIDTH = 136;
21707
21763
  var MERIDIEM_TIME_SELECTOR_WIDTH = 154;
21708
21764
  function TimeSelector({
21709
21765
  value,
21710
- useMeridiem,
21766
+ showMeridiem,
21711
21767
  minuteStep,
21712
21768
  onChange
21713
21769
  }) {
@@ -21721,7 +21777,7 @@ function TimeSelector({
21721
21777
  setMinute(parsed.minute);
21722
21778
  }, [parsed.hour, parsed.minute]);
21723
21779
  const meridiem = hour >= 12 ? "PM" : "AM";
21724
- const displayHour = useMeridiem ? hour % 12 === 0 ? 12 : hour % 12 : hour;
21780
+ const displayHour = showMeridiem ? hour % 12 === 0 ? 12 : hour % 12 : hour;
21725
21781
  const commit = (nextHour, nextMinute) => {
21726
21782
  const h = clampTimePart(nextHour, 0, 23);
21727
21783
  const m = clampTimePart(nextMinute, 0, 59);
@@ -21752,8 +21808,8 @@ function TimeSelector({
21752
21808
  setInputDraft((prev) => ({ ...prev, [part]: String(currentValue).padStart(2, "0") }));
21753
21809
  };
21754
21810
  const commitHourDraft = (draft) => {
21755
- const clamped = clampTimePart(Number(draft), useMeridiem ? 1 : 0, useMeridiem ? 12 : 23);
21756
- const nextHour = useMeridiem ? meridiem === "PM" ? clamped === 12 ? 12 : clamped + 12 : clamped === 12 ? 0 : clamped : clamped;
21811
+ const clamped = clampTimePart(Number(draft), showMeridiem ? 1 : 0, showMeridiem ? 12 : 23);
21812
+ const nextHour = showMeridiem ? meridiem === "PM" ? clamped === 12 ? 12 : clamped + 12 : clamped === 12 ? 0 : clamped : clamped;
21757
21813
  commit(nextHour, minute);
21758
21814
  return clamped;
21759
21815
  };
@@ -21854,7 +21910,7 @@ function TimeSelector({
21854
21910
  boxShadow: "4px 8px 16px -4px rgba(34,34,34,0.1), 0 0 24px -6px rgba(34,34,34,0.12)"
21855
21911
  },
21856
21912
  children: [
21857
- useMeridiem && /* @__PURE__ */ jsxRuntime.jsx(
21913
+ showMeridiem && /* @__PURE__ */ jsxRuntime.jsx(
21858
21914
  "div",
21859
21915
  {
21860
21916
  className: "flex items-center justify-center",
@@ -21881,7 +21937,7 @@ function TimeSelector({
21881
21937
  }) })
21882
21938
  }
21883
21939
  ),
21884
- useMeridiem && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "h-px w-full bg-[var(--sys-color-divider-default)]" }),
21940
+ showMeridiem && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "h-px w-full bg-[var(--sys-color-divider-default)]" }),
21885
21941
  /* @__PURE__ */ jsxRuntime.jsxs(
21886
21942
  "div",
21887
21943
  {
@@ -21922,7 +21978,7 @@ function STimePicker({
21922
21978
  placeholder = "00:00",
21923
21979
  disabled = false,
21924
21980
  clearable = false,
21925
- useMeridiem,
21981
+ showMeridiem,
21926
21982
  minuteStep = 1,
21927
21983
  width,
21928
21984
  name,
@@ -21950,8 +22006,8 @@ function STimePicker({
21950
22006
  const [ruleError, setRuleError] = react.useState("");
21951
22007
  const dims = TIMEPICKER_SIZE_CONFIG[size] ?? TIMEPICKER_SIZE_CONFIG.sm;
21952
22008
  const normalized = value ? formatTimeValue(parseTimeValue(value).hour, parseTimeValue(value).minute) : null;
21953
- const effectiveUseMeridiem = useMeridiem ?? type === "midday";
21954
- const displayText = formatTimeDisplay(normalized, effectiveUseMeridiem ? "midday" : "default");
22009
+ const effectiveShowMeridiem = showMeridiem ?? type === "midday";
22010
+ const displayText = formatTimeDisplay(normalized, effectiveShowMeridiem ? "midday" : "default");
21955
22011
  const hasValue = normalized != null && normalized !== "";
21956
22012
  useFormField({
21957
22013
  name,
@@ -21968,7 +22024,7 @@ function STimePicker({
21968
22024
  if (disabled) return;
21969
22025
  if (next) {
21970
22026
  const triggerWidth = triggerRef.current?.getBoundingClientRect().width ?? 0;
21971
- const selectorWidth = effectiveUseMeridiem ? MERIDIEM_TIME_SELECTOR_WIDTH : TIME_SELECTOR_WIDTH;
22027
+ const selectorWidth = effectiveShowMeridiem ? MERIDIEM_TIME_SELECTOR_WIDTH : TIME_SELECTOR_WIDTH;
21972
22028
  setPopoverAlignOffset(Math.max(0, (triggerWidth - selectorWidth) / 2));
21973
22029
  }
21974
22030
  setOpen(next);
@@ -22078,7 +22134,7 @@ function STimePicker({
22078
22134
  TimeSelector,
22079
22135
  {
22080
22136
  value: normalized,
22081
- useMeridiem: effectiveUseMeridiem,
22137
+ showMeridiem: effectiveShowMeridiem,
22082
22138
  minuteStep,
22083
22139
  onChange: commitValue
22084
22140
  }
@@ -22121,7 +22177,7 @@ var MIDDAY_FIELD_MAX_WIDTH = {
22121
22177
  };
22122
22178
  function RangeTimeSelector({
22123
22179
  value,
22124
- useMeridiem,
22180
+ showMeridiem,
22125
22181
  minuteStep,
22126
22182
  rangeOrder,
22127
22183
  onChange
@@ -22134,7 +22190,7 @@ function RangeTimeSelector({
22134
22190
  const getMeridiem = (side) => getParts(side).hour >= 12 ? "PM" : "AM";
22135
22191
  const getDisplayHour = (side) => {
22136
22192
  const { hour } = getParts(side);
22137
- if (!useMeridiem) return hour;
22193
+ if (!showMeridiem) return hour;
22138
22194
  const displayHour = hour % 12;
22139
22195
  return displayHour === 0 ? 12 : displayHour;
22140
22196
  };
@@ -22197,10 +22253,10 @@ function RangeTimeSelector({
22197
22253
  setInputDraft((prev) => ({ ...prev, [key]: String(currentValue).padStart(2, "0") }));
22198
22254
  };
22199
22255
  const commitHourDraft = (side, draft) => {
22200
- const clamped = clampTimePart(Number(draft), useMeridiem ? 1 : 0, useMeridiem ? 12 : 23);
22256
+ const clamped = clampTimePart(Number(draft), showMeridiem ? 1 : 0, showMeridiem ? 12 : 23);
22201
22257
  const parts = getParts(side);
22202
22258
  const meridiem = getMeridiem(side);
22203
- const nextHour = useMeridiem ? meridiem === "PM" ? clamped === 12 ? 12 : clamped + 12 : clamped === 12 ? 0 : clamped : clamped;
22259
+ const nextHour = showMeridiem ? meridiem === "PM" ? clamped === 12 ? 12 : clamped + 12 : clamped === 12 ? 0 : clamped : clamped;
22204
22260
  commit(side, nextHour, parts.minute);
22205
22261
  return clamped;
22206
22262
  };
@@ -22308,7 +22364,7 @@ function RangeTimeSelector({
22308
22364
  style: { gap: "var(--cmp-timepicker-selector-range-heading-gap)" },
22309
22365
  children: [
22310
22366
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "whitespace-nowrap text-center text-[12px] font-bold leading-[20px] text-[var(--cmp-timepicker-selector-range-heading-color)]", children: title }),
22311
- useMeridiem && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "isolate flex", children: ["AM", "PM"].map((item4, index) => {
22367
+ showMeridiem && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "isolate flex", children: ["AM", "PM"].map((item4, index) => {
22312
22368
  const selected = item4 === getMeridiem(side);
22313
22369
  return /* @__PURE__ */ jsxRuntime.jsx(
22314
22370
  "button",
@@ -22386,7 +22442,7 @@ function STimeRangePicker({
22386
22442
  placeholder = "00:00 ~ 23:59",
22387
22443
  disabled = false,
22388
22444
  clearable = false,
22389
- useMeridiem,
22445
+ showMeridiem,
22390
22446
  minuteStep = 1,
22391
22447
  rangeOrder = "strict",
22392
22448
  width,
@@ -22415,10 +22471,10 @@ function STimeRangePicker({
22415
22471
  const [ruleError, setRuleError] = react.useState("");
22416
22472
  const dims = TIMEPICKER_SIZE_CONFIG[size] ?? TIMEPICKER_SIZE_CONFIG.sm;
22417
22473
  const normalized = normalizeTimeRangeValue(value ?? null, rangeOrder);
22418
- const effectiveUseMeridiem = useMeridiem ?? type === "midday";
22474
+ const effectiveShowMeridiem = showMeridiem ?? type === "midday";
22419
22475
  const displayText = formatTimeRangeDisplay(
22420
22476
  normalized,
22421
- effectiveUseMeridiem ? "midday" : "default"
22477
+ effectiveShowMeridiem ? "midday" : "default"
22422
22478
  );
22423
22479
  const hasValue = normalized != null && normalized[0] !== "" && normalized[1] !== "";
22424
22480
  useFormField({
@@ -22464,8 +22520,8 @@ function STimeRangePicker({
22464
22520
  focused: focused || open,
22465
22521
  errorMessage: ruleError !== "" ? ruleError : errorMessage,
22466
22522
  width,
22467
- minWidth: effectiveUseMeridiem ? MIDDAY_FIELD_MIN_WIDTH[size] : dims.fieldMinWidth,
22468
- maxWidth: effectiveUseMeridiem ? MIDDAY_FIELD_MAX_WIDTH[size] : dims.fieldMaxWidth,
22523
+ minWidth: effectiveShowMeridiem ? MIDDAY_FIELD_MIN_WIDTH[size] : dims.fieldMinWidth,
22524
+ maxWidth: effectiveShowMeridiem ? MIDDAY_FIELD_MAX_WIDTH[size] : dims.fieldMaxWidth,
22469
22525
  disabled,
22470
22526
  className,
22471
22527
  style,
@@ -22545,7 +22601,7 @@ function STimeRangePicker({
22545
22601
  RangeTimeSelector,
22546
22602
  {
22547
22603
  value: normalized,
22548
- useMeridiem: effectiveUseMeridiem,
22604
+ showMeridiem: effectiveShowMeridiem,
22549
22605
  minuteStep,
22550
22606
  rangeOrder,
22551
22607
  onChange: commitValue
@@ -22591,6 +22647,8 @@ exports.ICONS = ICONS;
22591
22647
  exports.IMAGE_FITS = IMAGE_FITS;
22592
22648
  exports.PAGE_BACKGROUNDS = PAGE_BACKGROUNDS;
22593
22649
  exports.PAGE_CONTENT_HEIGHTS = PAGE_CONTENT_HEIGHTS;
22650
+ exports.PAGE_CONTENT_WIDTHS = PAGE_CONTENT_WIDTHS;
22651
+ exports.PAGE_HEADER_VARIANTS = PAGE_HEADER_VARIANTS;
22594
22652
  exports.RangeCalendar = RangeCalendar;
22595
22653
  exports.SAccountListBox = SAccountListBox;
22596
22654
  exports.SActionModal = SActionModal;