sellmate-design-system-react 9.0.0-beta.24 → 9.0.0-beta.26

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -4243,7 +4243,7 @@ function moveWithDepth(items, fromIndex, target, getDepth, setDepth, maxDepth) {
4243
4243
  const nextDepth = target.intent === "inside" ? targetDepth + 1 : targetDepth;
4244
4244
  const depthDelta = clampDepth(nextDepth, maxDepth) - sourceDepth;
4245
4245
  const nextMovedItems = setDepth && depthDelta !== 0 ? movedItems.map(
4246
- (item, index) => setDepth(item, clampDepth(getDepth(item, fromIndex + index) + depthDelta, maxDepth))
4246
+ (item2, index) => setDepth(item2, clampDepth(getDepth(item2, fromIndex + index) + depthDelta, maxDepth))
4247
4247
  ) : movedItems;
4248
4248
  return [
4249
4249
  ...remainingItems.slice(0, insertionIndex),
@@ -4290,7 +4290,7 @@ function SDraggableListInner({
4290
4290
  setDropTarget({ index, intent: "before" });
4291
4291
  }, []);
4292
4292
  const readDepth = react.useCallback(
4293
- (item, index) => clampDepth(getDepth?.(item, index) ?? 1, maxDepth),
4293
+ (item2, index) => clampDepth(getDepth?.(item2, index) ?? 1, maxDepth),
4294
4294
  [getDepth, maxDepth]
4295
4295
  );
4296
4296
  react.useEffect(() => {
@@ -4331,8 +4331,8 @@ function SDraggableListInner({
4331
4331
  nextDropTarget = ratio < 0.5 ? { index, intent: "before" } : { index, intent: "after" };
4332
4332
  break;
4333
4333
  }
4334
- const item = items[index];
4335
- const canHaveChildren = (getCanHaveChildren?.(item, index) ?? true) && readDepth(item, index) < maxDepth;
4334
+ const item2 = items[index];
4335
+ const canHaveChildren = (getCanHaveChildren?.(item2, index) ?? true) && readDepth(item2, index) < maxDepth;
4336
4336
  if (ratio < 0.25) {
4337
4337
  nextDropTarget = { index, intent: "before" };
4338
4338
  } else if (ratio > 0.75 || !canHaveChildren) {
@@ -4412,10 +4412,10 @@ function SDraggableListInner({
4412
4412
  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-border-accent) before:content-['']" : ""}`,
4413
4413
  "data-draggable-group": dragContext ? dragGroup : void 0,
4414
4414
  "data-draggable-list-id": dragContext ? listId : void 0,
4415
- children: items.map((item, index) => {
4416
- const itemKey = getKey(item, index);
4417
- const disabled = (getDisabled?.(item, index) ?? false) || isDescendant(items, index, draggedSubtreeStart, usesDepth ? readDepth : void 0);
4418
- const depth = readDepth(item, index);
4415
+ children: items.map((item2, index) => {
4416
+ const itemKey = getKey(item2, index);
4417
+ const disabled = (getDisabled?.(item2, index) ?? false) || isDescendant(items, index, draggedSubtreeStart, usesDepth ? readDepth : void 0);
4418
+ const depth = readDepth(item2, index);
4419
4419
  const showBefore = isDropTarget && currentDropIndex === index && (dragContext || currentDropIntent === "before");
4420
4420
  const showInside = isDropTarget && currentDropIndex === index && !dragContext && usesDepth && currentDropIntent === "inside";
4421
4421
  const showAfter = isDropTarget && (dragContext ? currentDropIndex === items.length && index === items.length - 1 : currentDropIndex === index && currentDropIntent === "after");
@@ -4439,7 +4439,7 @@ function SDraggableListInner({
4439
4439
  onClick: selectItem,
4440
4440
  onKeyDown: handleItemKeyDown,
4441
4441
  className: `relative ${showBefore ? `before:absolute before:left-0 before:right-0 ${beforeIndicatorPosition} before:z-10 before:h-[2px] before:bg-(--sys-color-border-accent) before:content-['']` : ""} ${showAfter ? `after:absolute after:left-0 after:right-0 ${afterIndicatorPosition} after:z-10 after:h-[2px] after:bg-(--sys-color-border-accent) after:content-['']` : ""} ${showInside ? "outline outline-2 outline-offset-[-2px] outline-(--sys-color-border-accent)" : ""}`,
4442
- children: renderItem(item, index, {
4442
+ children: renderItem(item2, index, {
4443
4443
  onDragHandleMouseDown: (event) => {
4444
4444
  if (disabled) return;
4445
4445
  if (dragContext && dragGroup && listId) {
@@ -5361,7 +5361,7 @@ var STreeImpl = /* @__PURE__ */ react.forwardRef(function STree({
5361
5361
  }, ref) {
5362
5362
  const [internalValue, setInternalValue] = react.useState(defaultValue ?? []);
5363
5363
  const [internalExpandedIds, setInternalExpandedIds] = react.useState(
5364
- defaultExpandedIds ?? items.filter((item) => item.children?.length).map((item) => item.id)
5364
+ defaultExpandedIds ?? items.filter((item2) => item2.children?.length).map((item2) => item2.id)
5365
5365
  );
5366
5366
  const currentValue = value ?? internalValue;
5367
5367
  const currentExpandedIds = expandedIds ?? internalExpandedIds;
@@ -6736,6 +6736,174 @@ function SSwitch({
6736
6736
  }
6737
6737
  );
6738
6738
  }
6739
+
6740
+ // src/components/SSystemActionButton/systemActionButton.config.ts
6741
+ var SYSTEM_ACTION_BUTTON_COLORS = ["light", "dark", "darker"];
6742
+ var SYSTEM_ACTION_BUTTON_TYPES = [
6743
+ "account",
6744
+ "switch",
6745
+ "select",
6746
+ "subSelect",
6747
+ "status"
6748
+ ];
6749
+ var item = (p) => `var(--cmp-gnb-system-item-${p})`;
6750
+ var action = (p) => `var(--cmp-gnb-system-actionButton-${p})`;
6751
+ var sys = (p) => `var(--sys-color-${p})`;
6752
+ var SYSTEM_ACTION_BUTTON_COLOR_CONFIG = {
6753
+ light: {
6754
+ bg: item("light-bg-default"),
6755
+ bgHover: item("light-bg-hover"),
6756
+ // light 의 아이콘 프레임 배경은 기본·hover 공통 한 값이다 (흰 면 위 흰 프레임)
6757
+ iconBg: item("light-icon-bg"),
6758
+ iconBgHover: item("light-icon-bg"),
6759
+ iconGlyph: item("light-icon-default"),
6760
+ iconGlyphHover: item("light-icon-default"),
6761
+ text: item("light-text"),
6762
+ actionText: {
6763
+ switch: action("switch-text-light"),
6764
+ selectData: action("selectData-text-light")
6765
+ },
6766
+ // 트레일링 아이콘 전용 색 토큰이 없다. light 는 item.icon.default 가
6767
+ // "actionButton/alertButton/setting 공통 글리프색"이라고 토큰에 명시돼 있다.
6768
+ actionIcon: item("light-icon-default")
6769
+ },
6770
+ dark: {
6771
+ bg: item("dark-bg-default"),
6772
+ bgHover: item("dark-bg-hover"),
6773
+ iconBg: item("dark-icon-bg-default"),
6774
+ iconBgHover: item("dark-icon-bg-hover"),
6775
+ // 어두운 면에는 글리프색 토큰이 없다. 기본은 프레임이 배경과 블렌딩되므로 라벨색(흰색),
6776
+ // hover 는 프레임이 흰색이 되므로 그 위에 표면색을 그대로 얹는다.
6777
+ iconGlyph: item("dark-text"),
6778
+ iconGlyphHover: item("dark-bg-hover"),
6779
+ text: item("dark-text"),
6780
+ actionText: {
6781
+ switch: action("switch-text-dark"),
6782
+ selectData: action("selectData-text-dark")
6783
+ },
6784
+ // TODO: 어두운 면의 트레일링 아이콘 색 토큰이 없다. 시안(#AAAAAA)에 맞는 시맨틱 토큰으로 둔다.
6785
+ actionIcon: sys("fg-quaternary")
6786
+ },
6787
+ darker: {
6788
+ bg: item("darker-bg-default"),
6789
+ bgHover: item("darker-bg-hover"),
6790
+ iconBg: item("darker-icon-bg-default"),
6791
+ iconBgHover: item("darker-icon-bg-hover"),
6792
+ iconGlyph: item("darker-text"),
6793
+ iconGlyphHover: item("darker-bg-hover"),
6794
+ text: item("darker-text"),
6795
+ actionText: {
6796
+ switch: action("switch-text-dark"),
6797
+ selectData: action("selectData-text-dark")
6798
+ },
6799
+ actionIcon: sys("fg-quaternary")
6800
+ }
6801
+ };
6802
+ var SYSTEM_ACTION_BUTTON_TYPE_CONFIG = {
6803
+ account: { fixedIcon: "user" },
6804
+ switch: {
6805
+ actionText: { token: "switch", typo: "typo-field-sm-default" },
6806
+ actionIcon: { name: "synchronize", size: action("switch-icon") }
6807
+ },
6808
+ select: {
6809
+ actionIcon: { name: "chevronRight", size: action("select-icon") }
6810
+ },
6811
+ subSelect: {
6812
+ actionText: { token: "selectData", typo: "typo-control-xs-medium" },
6813
+ actionIcon: { name: "chevronRight", size: action("selectData-icon") }
6814
+ },
6815
+ status: {
6816
+ // status 는 선행 아이콘 없이 태그가 라벨 자리를 차지한다
6817
+ actionIcon: { name: "chevronRight", size: action("select-icon") }
6818
+ }
6819
+ };
6820
+ var SYSTEM_ACTION_BUTTON_LAYOUT = {
6821
+ /** 행 높이 */
6822
+ height: item("height"),
6823
+ /** 행 라운드 */
6824
+ radius: item("radius"),
6825
+ /** 아이콘 프레임 한 변 */
6826
+ iconFrame: item("icon-frame"),
6827
+ /** 아이콘 글리프 크기 */
6828
+ iconGlyph: item("icon-glyph"),
6829
+ /** 아이콘 프레임 라운드 */
6830
+ iconRadius: item("icon-radius"),
6831
+ /** 아이콘 프레임 ↔ 라벨 간격 */
6832
+ iconLabelGap: item("iconLabelGap"),
6833
+ /** 좌측 여백 */
6834
+ paddingLeft: action("paddingLeft"),
6835
+ /** 우측 여백 */
6836
+ paddingRight: action("paddingRight"),
6837
+ /** 액션 텍스트 ↔ 액션 아이콘 간격 */
6838
+ actionGap: action("selectData-gap")
6839
+ };
6840
+ function TokenIcon({ name, size }) {
6841
+ return /* @__PURE__ */ jsxRuntime.jsx(SIcon, { name, size: "100%", style: { width: size, height: size } });
6842
+ }
6843
+ var SSystemActionButton = /* @__PURE__ */ react.forwardRef(
6844
+ function SSystemActionButton2({ color = "light", type, label, option, disabled = false, className, style, ...rest }, ref) {
6845
+ const c = SYSTEM_ACTION_BUTTON_COLOR_CONFIG[color];
6846
+ const spec = SYSTEM_ACTION_BUTTON_TYPE_CONFIG[type];
6847
+ const hoverable = !disabled;
6848
+ const status = type === "status" ? option : void 0;
6849
+ const resolvedIcon = spec.fixedIcon ?? option?.icon;
6850
+ const actionText = spec.actionText ? option?.text : void 0;
6851
+ const cssVars = {
6852
+ "--sab-bg": c.bg,
6853
+ "--sab-bg-hover": hoverable ? c.bgHover : c.bg,
6854
+ "--sab-icon-bg": c.iconBg,
6855
+ "--sab-icon-bg-hover": hoverable ? c.iconBgHover : c.iconBg,
6856
+ "--sab-icon-glyph": c.iconGlyph,
6857
+ "--sab-icon-glyph-hover": hoverable ? c.iconGlyphHover : c.iconGlyph,
6858
+ "--sab-text": c.text,
6859
+ "--sab-action-text": spec.actionText ? c.actionText[spec.actionText.token] : void 0,
6860
+ "--sab-action-icon": c.actionIcon,
6861
+ "minHeight": SYSTEM_ACTION_BUTTON_LAYOUT.height,
6862
+ "borderRadius": SYSTEM_ACTION_BUTTON_LAYOUT.radius,
6863
+ "paddingLeft": SYSTEM_ACTION_BUTTON_LAYOUT.paddingLeft,
6864
+ "paddingRight": SYSTEM_ACTION_BUTTON_LAYOUT.paddingRight,
6865
+ "gap": SYSTEM_ACTION_BUTTON_LAYOUT.iconLabelGap,
6866
+ ...style
6867
+ };
6868
+ return /* @__PURE__ */ jsxRuntime.jsxs(
6869
+ "button",
6870
+ {
6871
+ ref,
6872
+ type: "button",
6873
+ disabled,
6874
+ className: cn(
6875
+ "group box-border flex w-full items-center border-none bg-(--sab-bg) text-left transition-colors",
6876
+ "hover:bg-(--sab-bg-hover)",
6877
+ disabled ? "cursor-not-allowed opacity-60" : "cursor-pointer",
6878
+ className
6879
+ ),
6880
+ style: cssVars,
6881
+ ...rest,
6882
+ children: [
6883
+ resolvedIcon && /* @__PURE__ */ jsxRuntime.jsx(
6884
+ "span",
6885
+ {
6886
+ className: "inline-flex shrink-0 items-center justify-center bg-(--sab-icon-bg) text-(--sab-icon-glyph) transition-colors group-hover:bg-(--sab-icon-bg-hover) group-hover:text-(--sab-icon-glyph-hover)",
6887
+ style: { width: SYSTEM_ACTION_BUTTON_LAYOUT.iconFrame, height: SYSTEM_ACTION_BUTTON_LAYOUT.iconFrame, borderRadius: SYSTEM_ACTION_BUTTON_LAYOUT.iconRadius },
6888
+ children: /* @__PURE__ */ jsxRuntime.jsx(TokenIcon, { name: resolvedIcon, size: SYSTEM_ACTION_BUTTON_LAYOUT.iconGlyph })
6889
+ }
6890
+ ),
6891
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "typo-body-sm-semibold flex min-w-0 flex-1 items-center text-(--sab-text)", children: status ? /* @__PURE__ */ jsxRuntime.jsx(STag, { color: status.color ?? "blue", icon: "dot", label: status.label }) : /* @__PURE__ */ jsxRuntime.jsx("span", { className: "truncate", children: label }) }),
6892
+ (actionText != null || spec.actionIcon) && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "inline-flex shrink-0 items-center", style: { gap: SYSTEM_ACTION_BUTTON_LAYOUT.actionGap }, children: [
6893
+ actionText != null && spec.actionText && /* @__PURE__ */ jsxRuntime.jsx(
6894
+ "span",
6895
+ {
6896
+ className: cn(spec.actionText.typo, "whitespace-nowrap text-(--sab-action-text)"),
6897
+ children: actionText
6898
+ }
6899
+ ),
6900
+ spec.actionIcon && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "inline-flex shrink-0 items-center text-(--sab-action-icon)", children: /* @__PURE__ */ jsxRuntime.jsx(TokenIcon, { name: spec.actionIcon.name, size: spec.actionIcon.size }) })
6901
+ ] })
6902
+ ]
6903
+ }
6904
+ );
6905
+ }
6906
+ );
6739
6907
  var SIZE_CLASSES = {
6740
6908
  xs: "h-[24px] px-[8px] text-[12px] font-normal leading-[20px]",
6741
6909
  sm: "h-[28px] px-[12px] text-[14px] font-medium leading-[24px]"
@@ -8522,17 +8690,17 @@ var GNB_TOP_ICON_GAP = 8;
8522
8690
  var GNB_TOP_ICON_SIZE = 24;
8523
8691
  var GNB_FULL_LOGO_WIDTH_NO_LAUNCHER = GNB_FULL_LOGO_WIDTH + GNB_TOP_ICON_SIZE + GNB_TOP_ICON_GAP;
8524
8692
  function findGnbRailValue(items, value) {
8525
- if (items.some((item) => item.value === value)) return value;
8693
+ if (items.some((item2) => item2.value === value)) return value;
8526
8694
  return findGnbAncestors(items, value)[0];
8527
8695
  }
8528
8696
  function findGnbSiblingValues(items, value) {
8529
8697
  const walk = (list) => {
8530
- if (list.some((item) => item.value === value)) {
8531
- return list.filter((item) => item.value !== value).map((item) => item.value);
8698
+ if (list.some((item2) => item2.value === value)) {
8699
+ return list.filter((item2) => item2.value !== value).map((item2) => item2.value);
8532
8700
  }
8533
- for (const item of list) {
8534
- if (item.children) {
8535
- const found = walk(item.children);
8701
+ for (const item2 of list) {
8702
+ if (item2.children) {
8703
+ const found = walk(item2.children);
8536
8704
  if (found) return found;
8537
8705
  }
8538
8706
  }
@@ -8542,10 +8710,10 @@ function findGnbSiblingValues(items, value) {
8542
8710
  }
8543
8711
  function findGnbAncestors(items, value) {
8544
8712
  const walk = (list, trail) => {
8545
- for (const item of list) {
8546
- if (item.value === value) return trail;
8547
- if (item.children) {
8548
- const found = walk(item.children, [...trail, item.value]);
8713
+ for (const item2 of list) {
8714
+ if (item2.value === value) return trail;
8715
+ if (item2.children) {
8716
+ const found = walk(item2.children, [...trail, item2.value]);
8549
8717
  if (found) return found;
8550
8718
  }
8551
8719
  }
@@ -8555,20 +8723,20 @@ function findGnbAncestors(items, value) {
8555
8723
  }
8556
8724
  function findGnbDescendantBranchValues(items, value) {
8557
8725
  const find = (list) => {
8558
- for (const item of list) {
8559
- if (item.value === value) return item;
8560
- if (item.children) {
8561
- const found = find(item.children);
8726
+ for (const item2 of list) {
8727
+ if (item2.value === value) return item2;
8728
+ if (item2.children) {
8729
+ const found = find(item2.children);
8562
8730
  if (found) return found;
8563
8731
  }
8564
8732
  }
8565
8733
  return void 0;
8566
8734
  };
8567
8735
  const collect = (list, acc) => {
8568
- for (const item of list) {
8569
- if (item.children && item.children.length > 0) {
8570
- acc.push(item.value);
8571
- collect(item.children, acc);
8736
+ for (const item2 of list) {
8737
+ if (item2.children && item2.children.length > 0) {
8738
+ acc.push(item2.value);
8739
+ collect(item2.children, acc);
8572
8740
  }
8573
8741
  }
8574
8742
  return acc;
@@ -8611,7 +8779,7 @@ var SGnb = /* @__PURE__ */ react.forwardRef(function SGnb2({
8611
8779
  const type = typeProp ?? layout?.type ?? "box";
8612
8780
  const folded = foldedProp ?? layout?.folded ?? false;
8613
8781
  const useRail = useRailProp ?? layout?.useRail ?? false;
8614
- const railHasLeaf = useRail && items.some((item) => !item.children || item.children.length === 0);
8782
+ const railHasLeaf = useRail && items.some((item2) => !item2.children || item2.children.length === 0);
8615
8783
  const header = railHasLeaf ? "full" : headerProp ?? layout?.header ?? "fix";
8616
8784
  const H = GNB_HEADER[header];
8617
8785
  const M = GNB_MENU[type];
@@ -8654,13 +8822,13 @@ var SGnb = /* @__PURE__ */ react.forwardRef(function SGnb2({
8654
8822
  labelTipHideRef.current = setTimeout(() => setLabelTip(null), LABEL_TIP_HIDE_DELAY_MS);
8655
8823
  };
8656
8824
  react.useEffect(() => cancelLabelTipHide, []);
8657
- const rowHoverProps = (item) => ({
8825
+ const rowHoverProps = (item2) => ({
8658
8826
  onMouseEnter: (event) => {
8659
- setHoveredKey(item.value);
8660
- showLabelTipIfTruncated(event.currentTarget, item.label);
8827
+ setHoveredKey(item2.value);
8828
+ showLabelTipIfTruncated(event.currentTarget, item2.label);
8661
8829
  },
8662
8830
  onMouseLeave: () => {
8663
- setHoveredKey((prev) => prev === item.value ? null : prev);
8831
+ setHoveredKey((prev) => prev === item2.value ? null : prev);
8664
8832
  startLabelTipHide();
8665
8833
  }
8666
8834
  });
@@ -8686,7 +8854,7 @@ var SGnb = /* @__PURE__ */ react.forwardRef(function SGnb2({
8686
8854
  }, [items, value]);
8687
8855
  react.useEffect(() => {
8688
8856
  setActiveRail(
8689
- (prev) => prev !== void 0 && items.some((item) => item.value === prev) ? prev : items[0]?.value
8857
+ (prev) => prev !== void 0 && items.some((item2) => item2.value === prev) ? prev : items[0]?.value
8690
8858
  );
8691
8859
  }, [items]);
8692
8860
  const toggleExpand = (key) => {
@@ -8703,33 +8871,33 @@ var SGnb = /* @__PURE__ */ react.forwardRef(function SGnb2({
8703
8871
  return next;
8704
8872
  });
8705
8873
  };
8706
- const handleItemClick = (item) => {
8707
- if (item.disabled) return;
8708
- if (item.children && item.children.length > 0) {
8709
- toggleExpand(item.value);
8874
+ const handleItemClick = (item2) => {
8875
+ if (item2.disabled) return;
8876
+ if (item2.children && item2.children.length > 0) {
8877
+ toggleExpand(item2.value);
8710
8878
  return;
8711
8879
  }
8712
- onValueChange?.(item.value);
8880
+ onValueChange?.(item2.value);
8713
8881
  };
8714
- const handleRailClick = (item) => {
8715
- if (item.disabled) return;
8716
- setActiveRail(item.value);
8717
- onRailChange?.(item.value);
8718
- if (!item.children || item.children.length === 0) onValueChange?.(item.value);
8882
+ const handleRailClick = (item2) => {
8883
+ if (item2.disabled) return;
8884
+ setActiveRail(item2.value);
8885
+ onRailChange?.(item2.value);
8886
+ if (!item2.children || item2.children.length === 0) onValueChange?.(item2.value);
8719
8887
  };
8720
8888
  const handleFoldToggle = () => {
8721
8889
  const next = !folded;
8722
8890
  onFoldChange?.(next);
8723
8891
  if (foldedProp === void 0) layout?.setFolded(next);
8724
8892
  };
8725
- const renderRailItem = (item) => {
8726
- const isActive = item.value === activeRail;
8727
- const isHovered = hoveredKey === item.value && !item.disabled;
8893
+ const renderRailItem = (item2) => {
8894
+ const isActive = item2.value === activeRail;
8895
+ const isHovered = hoveredKey === item2.value && !item2.disabled;
8728
8896
  return /* @__PURE__ */ jsxRuntime.jsx("li", { children: /* @__PURE__ */ jsxRuntime.jsxs(
8729
8897
  "button",
8730
8898
  {
8731
8899
  type: "button",
8732
- disabled: item.disabled,
8900
+ disabled: item2.disabled,
8733
8901
  "aria-current": isActive ? "true" : void 0,
8734
8902
  className: "box-border flex select-none flex-col items-center border-none bg-transparent transition-colors duration-150",
8735
8903
  style: {
@@ -8744,31 +8912,31 @@ var SGnb = /* @__PURE__ */ react.forwardRef(function SGnb2({
8744
8912
  fontSize: GNB_RAIL.itemFontSize,
8745
8913
  lineHeight: `${GNB_RAIL.itemLineHeight}px`,
8746
8914
  fontWeight: isActive ? GNB_RAIL.itemFontWeightSelected : GNB_RAIL.itemFontWeight,
8747
- opacity: item.disabled ? 0.4 : 1,
8748
- cursor: item.disabled ? "not-allowed" : "pointer"
8915
+ opacity: item2.disabled ? 0.4 : 1,
8916
+ cursor: item2.disabled ? "not-allowed" : "pointer"
8749
8917
  },
8750
- onClick: () => handleRailClick(item),
8751
- ...rowHoverProps(item),
8918
+ onClick: () => handleRailClick(item2),
8919
+ ...rowHoverProps(item2),
8752
8920
  children: [
8753
- item.icon && /* @__PURE__ */ jsxRuntime.jsx(SIcon, { name: item.icon, size: GNB_RAIL.itemIcon, className: "shrink-0" }),
8921
+ item2.icon && /* @__PURE__ */ jsxRuntime.jsx(SIcon, { name: item2.icon, size: GNB_RAIL.itemIcon, className: "shrink-0" }),
8754
8922
  /* @__PURE__ */ jsxRuntime.jsx(
8755
8923
  "span",
8756
8924
  {
8757
8925
  "data-gnb-label": true,
8758
8926
  className: "w-full overflow-hidden text-ellipsis whitespace-nowrap text-center",
8759
- children: item.label
8927
+ children: item2.label
8760
8928
  }
8761
8929
  )
8762
8930
  ]
8763
8931
  }
8764
- ) }, item.value);
8932
+ ) }, item2.value);
8765
8933
  };
8766
- const renderItem = (item, depth, branchHasIcon = false) => {
8767
- const hasChildren = !!(item.children && item.children.length > 0);
8768
- const isSelected = !hasChildren && item.value === value;
8769
- const isExpanded = expandedKeys.has(item.value);
8770
- const isHovered = hoveredKey === item.value && !item.disabled;
8771
- const iconBranch = depth === 1 ? !!item.icon : branchHasIcon;
8934
+ const renderItem = (item2, depth, branchHasIcon = false) => {
8935
+ const hasChildren = !!(item2.children && item2.children.length > 0);
8936
+ const isSelected = !hasChildren && item2.value === value;
8937
+ const isExpanded = expandedKeys.has(item2.value);
8938
+ const isHovered = hoveredKey === item2.value && !item2.disabled;
8939
+ const iconBranch = depth === 1 ? !!item2.icon : branchHasIcon;
8772
8940
  const itemStyle = {
8773
8941
  gap: M.itemGap,
8774
8942
  paddingTop: M.itemPaddingY,
@@ -8785,8 +8953,8 @@ var SGnb = /* @__PURE__ */ react.forwardRef(function SGnb2({
8785
8953
  fontSize: depth === 1 ? M.depth1FontSize : M.itemFontSize,
8786
8954
  lineHeight: `${depth === 1 ? M.depth1LineHeight : M.itemLineHeight}px`,
8787
8955
  fontWeight: depth === 1 ? M.depth1FontWeight : isSelected ? M.itemFontWeightSelected : M.itemFontWeight,
8788
- opacity: item.disabled ? 0.4 : 1,
8789
- cursor: item.disabled ? "not-allowed" : "pointer"
8956
+ opacity: item2.disabled ? 0.4 : 1,
8957
+ cursor: item2.disabled ? "not-allowed" : "pointer"
8790
8958
  };
8791
8959
  return (
8792
8960
  // li 를 flex-col 로 둬야 버튼이 좌우 마진만큼 안쪽으로 들어가고,
@@ -8796,18 +8964,18 @@ var SGnb = /* @__PURE__ */ react.forwardRef(function SGnb2({
8796
8964
  "button",
8797
8965
  {
8798
8966
  type: "button",
8799
- disabled: item.disabled,
8967
+ disabled: item2.disabled,
8800
8968
  "aria-expanded": hasChildren ? isExpanded : void 0,
8801
8969
  "aria-current": isSelected ? "page" : void 0,
8802
8970
  className: "box-border flex select-none items-center border-none bg-transparent text-left transition-colors duration-150",
8803
8971
  style: itemStyle,
8804
- onClick: () => handleItemClick(item),
8805
- ...rowHoverProps(item),
8972
+ onClick: () => handleItemClick(item2),
8973
+ ...rowHoverProps(item2),
8806
8974
  children: [
8807
- depth === 1 && item.icon && /* @__PURE__ */ jsxRuntime.jsx(
8975
+ depth === 1 && item2.icon && /* @__PURE__ */ jsxRuntime.jsx(
8808
8976
  SIcon,
8809
8977
  {
8810
- name: item.icon,
8978
+ name: item2.icon,
8811
8979
  size: M.depth1Icon,
8812
8980
  color: isSelected ? C.itemColorActive : C.itemIcon,
8813
8981
  className: "shrink-0"
@@ -8827,17 +8995,17 @@ var SGnb = /* @__PURE__ */ react.forwardRef(function SGnb2({
8827
8995
  {
8828
8996
  "data-gnb-label": true,
8829
8997
  className: "min-w-0 flex-1 overflow-hidden text-ellipsis whitespace-nowrap",
8830
- children: item.label
8998
+ children: item2.label
8831
8999
  }
8832
9000
  )
8833
9001
  ] }),
8834
- item.tag !== void 0 && item.tag !== "" && /* @__PURE__ */ jsxRuntime.jsx(
9002
+ item2.tag !== void 0 && item2.tag !== "" && /* @__PURE__ */ jsxRuntime.jsx(
8835
9003
  STag,
8836
9004
  {
8837
9005
  shape: "square",
8838
9006
  size: "xs",
8839
- color: item.tagColor ?? "blue",
8840
- label: item.tag,
9007
+ color: item2.tagColor ?? "blue",
9008
+ label: item2.tag,
8841
9009
  className: "shrink-0"
8842
9010
  }
8843
9011
  ),
@@ -8870,16 +9038,16 @@ var SGnb = /* @__PURE__ */ react.forwardRef(function SGnb2({
8870
9038
  visibility: isExpanded ? "visible" : "hidden",
8871
9039
  transition: `visibility 0s linear ${isExpanded ? "0s" : `${GNB_EXPAND_MS}ms`}`
8872
9040
  },
8873
- children: item.children.map((child) => renderItem(child, depth + 1, iconBranch))
9041
+ children: item2.children.map((child) => renderItem(child, depth + 1, iconBranch))
8874
9042
  }
8875
9043
  )
8876
9044
  }
8877
9045
  )
8878
- ] }, item.value)
9046
+ ] }, item2.value)
8879
9047
  );
8880
9048
  };
8881
9049
  const railItems = useRail ? items : [];
8882
- const menuItems = useRail ? items.find((item) => item.value === activeRail)?.children ?? [] : items;
9050
+ const menuItems = useRail ? items.find((item2) => item2.value === activeRail)?.children ?? [] : items;
8883
9051
  const showMenu = !useRail || menuItems.length > 0;
8884
9052
  const [uncontrolledMenuWidth, setUncontrolledMenuWidth] = react.useState(
8885
9053
  () => defaultMenuWidth ?? GNB_MENU_WIDTH
@@ -9186,7 +9354,7 @@ var SGnb = /* @__PURE__ */ react.forwardRef(function SGnb2({
9186
9354
  paddingTop: M.bodyPaddingY,
9187
9355
  paddingBottom: M.bodyPaddingY
9188
9356
  },
9189
- children: /* @__PURE__ */ jsxRuntime.jsx("ul", { className: "m-0 flex list-none flex-col p-0", children: menuItems.map((item) => renderItem(item, 1)) })
9357
+ children: /* @__PURE__ */ jsxRuntime.jsx("ul", { className: "m-0 flex list-none flex-col p-0", children: menuItems.map((item2) => renderItem(item2, 1)) })
9190
9358
  }
9191
9359
  ),
9192
9360
  menuFooter && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "shrink-0", children: menuFooter })
@@ -9837,19 +10005,19 @@ var STEPPER_VERTICAL_COLORS = {
9837
10005
  errorBadge: "#FB4444"
9838
10006
  };
9839
10007
  var ERROR_TOOLTIP_MESSAGE = "\uD655\uC778\uC774 \uD544\uC694\uD55C \uD56D\uBAA9\uC774 \uC788\uC2B5\uB2C8\uB2E4.";
9840
- function getItemValue(item, index) {
9841
- return item.value ?? String(index + 1);
10008
+ function getItemValue(item2, index) {
10009
+ return item2.value ?? String(index + 1);
9842
10010
  }
9843
10011
  function groupAdjacentItems(items) {
9844
10012
  return items.reduce(
9845
- (groups, item, index) => {
9846
- const currentGroup = item.group;
10013
+ (groups, item2, index) => {
10014
+ const currentGroup = item2.group;
9847
10015
  const previous = groups[groups.length - 1];
9848
10016
  if (currentGroup && previous?.group === currentGroup) {
9849
- previous.items.push(item);
10017
+ previous.items.push(item2);
9850
10018
  return groups;
9851
10019
  }
9852
- groups.push({ group: currentGroup, startIndex: index, items: [item] });
10020
+ groups.push({ group: currentGroup, startIndex: index, items: [item2] });
9853
10021
  return groups;
9854
10022
  },
9855
10023
  []
@@ -9879,15 +10047,15 @@ var SStepper = /* @__PURE__ */ react.forwardRef(function SStepper2({
9879
10047
  const verticalItemRefs = react.useRef([]);
9880
10048
  const activeIndex = Math.max(
9881
10049
  0,
9882
- items.findIndex((item, index) => getItemValue(item, index) === value)
10050
+ items.findIndex((item2, index) => getItemValue(item2, index) === value)
9883
10051
  );
9884
10052
  const lastCompletedIndex = items.reduce(
9885
- (lastIndex, item, index) => item.completed === true ? index : lastIndex,
10053
+ (lastIndex, item2, index) => item2.completed === true ? index : lastIndex,
9886
10054
  -1
9887
10055
  );
9888
10056
  const resolvedClickableIndex = lastCompletedIndex + 1;
9889
10057
  const [visitedMaxIndex, setVisitedMaxIndex] = react.useState(activeIndex);
9890
- const firstErrorIndex = items.findIndex((item) => item.error === true);
10058
+ const firstErrorIndex = items.findIndex((item2) => item2.error === true);
9891
10059
  react.useImperativeHandle(
9892
10060
  ref,
9893
10061
  () => ({
@@ -9915,18 +10083,18 @@ var SStepper = /* @__PURE__ */ react.forwardRef(function SStepper2({
9915
10083
  transform: `translateY(${activeItem.offsetTop}px)`
9916
10084
  });
9917
10085
  }, [activeIndex, vertical, items]);
9918
- const getState = (item, index) => {
10086
+ const getState = (item2, index) => {
9919
10087
  if (index === activeIndex) return "active";
9920
- if (item.completed != null) return item.completed ? "completed" : "default";
10088
+ if (item2.completed != null) return item2.completed ? "completed" : "default";
9921
10089
  return "default";
9922
10090
  };
9923
- const emitValueChange = (item, index) => {
9924
- onValueChange?.(getItemValue(item, index), item, index);
10091
+ const emitValueChange = (item2, index) => {
10092
+ onValueChange?.(getItemValue(item2, index), item2, index);
9925
10093
  };
9926
10094
  const isWithinClickableIndex = (index) => index <= resolvedClickableIndex;
9927
- const renderStepContent = (item, index, options = {}) => {
10095
+ const renderStepContent = (item2, index, options = {}) => {
9928
10096
  const { isVertical = false, roleListItem = true, hovered = false } = options;
9929
- const state2 = getState(item, index);
10097
+ const state2 = getState(item2, index);
9930
10098
  const isHorizontalCompleted = !isVertical && state2 === "completed";
9931
10099
  const isVerticalCompleted = isVertical && state2 === "completed";
9932
10100
  const isVerticalLastActive = isVertical && state2 === "default" && index === visitedMaxIndex;
@@ -10001,12 +10169,12 @@ var SStepper = /* @__PURE__ */ react.forwardRef(function SStepper2({
10001
10169
  children: showsCheckIcon ? /* @__PURE__ */ jsxRuntime.jsx(SIcon, { name: "check", size: STEPPER_LAYOUT.sequenceIcon, color: "currentColor" }) : index + 1
10002
10170
  }
10003
10171
  ),
10004
- /* @__PURE__ */ jsxRuntime.jsx("span", { children: item.label })
10172
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: item2.label })
10005
10173
  ]
10006
10174
  }
10007
10175
  );
10008
10176
  };
10009
- const renderClickableStepContent = (item, index, isVertical = false) => {
10177
+ const renderClickableStepContent = (item2, index, isVertical = false) => {
10010
10178
  const isDisabled = !isWithinClickableIndex(index);
10011
10179
  return /* @__PURE__ */ jsxRuntime.jsx(
10012
10180
  "button",
@@ -10019,9 +10187,9 @@ var SStepper = /* @__PURE__ */ react.forwardRef(function SStepper2({
10019
10187
  ),
10020
10188
  style: { font: "inherit", color: "inherit" },
10021
10189
  onClick: () => {
10022
- if (!isDisabled) emitValueChange(item, index);
10190
+ if (!isDisabled) emitValueChange(item2, index);
10023
10191
  },
10024
- children: renderStepContent(item, index, { isVertical, roleListItem: false })
10192
+ children: renderStepContent(item2, index, { isVertical, roleListItem: false })
10025
10193
  }
10026
10194
  );
10027
10195
  };
@@ -10080,10 +10248,10 @@ var SStepper = /* @__PURE__ */ react.forwardRef(function SStepper2({
10080
10248
  children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "whitespace-nowrap", children: group.group })
10081
10249
  }
10082
10250
  ),
10083
- group.items.map((item, itemIndex) => {
10251
+ group.items.map((item2, itemIndex) => {
10084
10252
  const index = group.startIndex + itemIndex;
10085
- const state2 = getState(item, index);
10086
- const itemValue = getItemValue(item, index);
10253
+ const state2 = getState(item2, index);
10254
+ const itemValue = getItemValue(item2, index);
10087
10255
  const canClickItem = isClickable && isWithinClickableIndex(index);
10088
10256
  const isDisabled = !canClickItem;
10089
10257
  const isHovered = hoveredIndex === index && canClickItem && state2 !== "active";
@@ -10101,12 +10269,12 @@ var SStepper = /* @__PURE__ */ react.forwardRef(function SStepper2({
10101
10269
  const handleMouseLeave = () => {
10102
10270
  setHoveredIndex((current) => current === index ? null : current);
10103
10271
  };
10104
- const stepContent = renderStepContent(item, index, {
10272
+ const stepContent = renderStepContent(item2, index, {
10105
10273
  isVertical: true,
10106
10274
  roleListItem: false,
10107
10275
  hovered: isHovered
10108
10276
  });
10109
- const errorBadge = item.error ? /* @__PURE__ */ jsxRuntime.jsx(
10277
+ const errorBadge = item2.error ? /* @__PURE__ */ jsxRuntime.jsx(
10110
10278
  "span",
10111
10279
  {
10112
10280
  "aria-hidden": "true",
@@ -10121,7 +10289,7 @@ var SStepper = /* @__PURE__ */ react.forwardRef(function SStepper2({
10121
10289
  ) : null;
10122
10290
  const isTooltipHovered = tooltipHoverValue === itemValue;
10123
10291
  const isCustomTooltipOpen = customTooltipOpen && index === firstErrorIndex;
10124
- const showTooltip = item.error === true && (isTooltipHovered || isCustomTooltipOpen);
10292
+ const showTooltip = item2.error === true && (isTooltipHovered || isCustomTooltipOpen);
10125
10293
  const handleTooltipMouseEnter = () => setTooltipHoverValue(itemValue);
10126
10294
  const handleTooltipMouseLeave = () => {
10127
10295
  setTooltipHoverValue((current) => current === itemValue ? null : current);
@@ -10145,7 +10313,7 @@ var SStepper = /* @__PURE__ */ react.forwardRef(function SStepper2({
10145
10313
  onMouseEnter: handleTooltipMouseEnter,
10146
10314
  onMouseLeave: handleTooltipMouseLeave,
10147
10315
  onClick: isClickable ? () => {
10148
- if (!isDisabled) emitValueChange(item, index);
10316
+ if (!isDisabled) emitValueChange(item2, index);
10149
10317
  } : void 0,
10150
10318
  children: [
10151
10319
  stepContent,
@@ -10177,13 +10345,13 @@ var SStepper = /* @__PURE__ */ react.forwardRef(function SStepper2({
10177
10345
  {
10178
10346
  type: "button",
10179
10347
  disabled: isDisabled,
10180
- "aria-label": item.label,
10348
+ "aria-label": item2.label,
10181
10349
  className: cn(
10182
10350
  "absolute inset-0 z-[2] m-0 border-0 bg-transparent p-0 text-left outline-none focus-visible:outline focus-visible:outline-2 focus-visible:outline-(--sys-color-border-accent)",
10183
10351
  isDisabled ? "cursor-default" : "cursor-pointer"
10184
10352
  ),
10185
10353
  onClick: () => {
10186
- if (!isDisabled) emitValueChange(item, index);
10354
+ if (!isDisabled) emitValueChange(item2, index);
10187
10355
  }
10188
10356
  }
10189
10357
  ),
@@ -10234,9 +10402,9 @@ var SStepper = /* @__PURE__ */ react.forwardRef(function SStepper2({
10234
10402
  lineHeight: config.lineHeight,
10235
10403
  ...style
10236
10404
  },
10237
- children: items.map((item, index) => {
10238
- const state2 = getState(item, index);
10239
- const content = isClickable ? /* @__PURE__ */ jsxRuntime.jsx("span", { role: "listitem", "aria-current": state2 === "active" ? "step" : void 0, children: renderClickableStepContent(item, index) }) : renderStepContent(item, index);
10405
+ children: items.map((item2, index) => {
10406
+ const state2 = getState(item2, index);
10407
+ const content = isClickable ? /* @__PURE__ */ jsxRuntime.jsx("span", { role: "listitem", "aria-current": state2 === "active" ? "step" : void 0, children: renderClickableStepContent(item2, index) }) : renderStepContent(item2, index);
10240
10408
  return /* @__PURE__ */ jsxRuntime.jsxs(
10241
10409
  "span",
10242
10410
  {
@@ -10270,7 +10438,7 @@ var SStepper = /* @__PURE__ */ react.forwardRef(function SStepper2({
10270
10438
  )
10271
10439
  ]
10272
10440
  },
10273
- getItemValue(item, index)
10441
+ getItemValue(item2, index)
10274
10442
  );
10275
10443
  })
10276
10444
  }
@@ -10813,7 +10981,7 @@ var SSelectImpl = /* @__PURE__ */ react.forwardRef(function SSelect({
10813
10981
  const selectedAnchorIndex = react.useMemo(() => {
10814
10982
  if (selected.length === 0) return -1;
10815
10983
  const selectedSet = new Set(selected);
10816
- return navigableItems.findIndex((item) => item.value != null && selectedSet.has(item.value));
10984
+ return navigableItems.findIndex((item2) => item2.value != null && selectedSet.has(item2.value));
10817
10985
  }, [navigableItems, selected]);
10818
10986
  selectedAnchorRef.current = selectedAnchorIndex;
10819
10987
  const triggerText = (() => {
@@ -11106,7 +11274,7 @@ var SSelectImpl = /* @__PURE__ */ react.forwardRef(function SSelect({
11106
11274
  setFocusedIndex(-1);
11107
11275
  return;
11108
11276
  }
11109
- const index = navigableItems.findIndex((item) => item.key === key);
11277
+ const index = navigableItems.findIndex((item2) => item2.key === key);
11110
11278
  if (index >= 0) setFocusedIndex(index);
11111
11279
  }
11112
11280
  }
@@ -11338,6 +11506,7 @@ var colWidthFromDef = (c) => {
11338
11506
  };
11339
11507
  var STable = /* @__PURE__ */ react.forwardRef(function STable2({
11340
11508
  columns = [],
11509
+ headerGroups,
11341
11510
  rows = [],
11342
11511
  rowKey = "id",
11343
11512
  selectable = false,
@@ -11385,6 +11554,49 @@ var STable = /* @__PURE__ */ react.forwardRef(function STable2({
11385
11554
  onDenseChange?.(next);
11386
11555
  };
11387
11556
  const visibleCols = react.useMemo(() => columns.filter((c) => c.visible !== false), [columns]);
11557
+ const headerGroupInfo = react.useMemo(() => {
11558
+ if (!headerGroups || headerGroups.length === 0) return null;
11559
+ const indexByName = new Map(visibleCols.map((col, index) => [col.name, index]));
11560
+ const covered = /* @__PURE__ */ new Set();
11561
+ let previousLast = -1;
11562
+ const cells = headerGroups.map((group) => {
11563
+ if (group.columnNames.length === 0) {
11564
+ throw new Error("[STable] headerGroups\uC758 columnNames\uB294 \uBE44\uC5B4 \uC788\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.");
11565
+ }
11566
+ const indexes = group.columnNames.map((name) => {
11567
+ const index = indexByName.get(name);
11568
+ if (index == null) {
11569
+ throw new Error(`[STable] headerGroups\uC5D0 \uC874\uC7AC\uD558\uC9C0 \uC54A\uB294 \uCEEC\uB7FC\uC774 \uC9C0\uC815\uB418\uC5C8\uC2B5\uB2C8\uB2E4: ${name}`);
11570
+ }
11571
+ if (covered.has(name)) {
11572
+ throw new Error(`[STable] headerGroups\uC5D0\uC11C \uCEEC\uB7FC\uC774 \uC911\uBCF5 \uC9C0\uC815\uB418\uC5C8\uC2B5\uB2C8\uB2E4: ${name}`);
11573
+ }
11574
+ covered.add(name);
11575
+ return index;
11576
+ });
11577
+ const first = indexes[0];
11578
+ const last = indexes[indexes.length - 1];
11579
+ if (last - first + 1 !== indexes.length || indexes.some((index, i) => index !== first + i)) {
11580
+ throw new Error(
11581
+ "[STable] headerGroups\uC758 columnNames\uB294 \uC778\uC811\uD55C \uCEEC\uB7FC \uC21C\uC11C\uB85C \uC9C0\uC815\uD574\uC57C \uD569\uB2C8\uB2E4."
11582
+ );
11583
+ }
11584
+ if (first <= previousLast) {
11585
+ throw new Error("[STable] headerGroups\uB294 \uCEEC\uB7FC \uC21C\uC11C\uB300\uB85C \uC9C0\uC815\uD574\uC57C \uD569\uB2C8\uB2E4.");
11586
+ }
11587
+ previousLast = last;
11588
+ return { ...group, firstIndex: first, colSpan: indexes.length };
11589
+ });
11590
+ if (covered.size !== visibleCols.length) {
11591
+ throw new Error("[STable] headerGroups\uC758 columnNames\uAC00 \uBAA8\uB4E0 visible \uCEEC\uB7FC\uC744 \uD3EC\uD568\uD574\uC57C \uD569\uB2C8\uB2E4.");
11592
+ }
11593
+ return {
11594
+ cells,
11595
+ rowSpanNames: new Set(
11596
+ cells.filter((cell) => cell.rowSpan === 2).flatMap((cell) => cell.columnNames)
11597
+ )
11598
+ };
11599
+ }, [headerGroups, visibleCols]);
11388
11600
  const stickyLeft = stickyColumn?.left ?? 0;
11389
11601
  const stickyRight = stickyColumn?.right ?? 0;
11390
11602
  const effectiveRowHeight = rowHeight ?? (innerDense ? DENSE_ROW_HEIGHT : DEFAULT_ROW_HEIGHT);
@@ -11647,6 +11859,35 @@ var STable = /* @__PURE__ */ react.forwardRef(function STable2({
11647
11859
  isRightEdge && scrolledRight && "shadow-[-5px_0_8px_0_rgba(34,34,34,0.1)]"
11648
11860
  );
11649
11861
  };
11862
+ const headerResizeHitArea = (i, key) => {
11863
+ const col = visibleCols[i];
11864
+ if (!headerGroupInfo || !resizable || !col || col.autoWidth || i >= visibleCols.length - 1) {
11865
+ return null;
11866
+ }
11867
+ return /* @__PURE__ */ jsxRuntime.jsx(
11868
+ "span",
11869
+ {
11870
+ onMouseDown: (e) => startResize(i, e),
11871
+ className: "absolute inset-y-0 right-0 z-[5] w-[9px] cursor-col-resize",
11872
+ "aria-hidden": true
11873
+ },
11874
+ key
11875
+ );
11876
+ };
11877
+ const headerResizer = (i, key) => {
11878
+ const col = visibleCols[i];
11879
+ if (!resizable || !col || col.autoWidth || i >= visibleCols.length - 1) return null;
11880
+ return /* @__PURE__ */ jsxRuntime.jsx(
11881
+ "span",
11882
+ {
11883
+ onMouseDown: (e) => startResize(i, e),
11884
+ className: "absolute right-0 top-1/2 z-[5] flex h-[16px] w-[9px] -translate-y-1/2 cursor-col-resize items-center justify-end",
11885
+ "aria-hidden": true,
11886
+ children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "h-full w-[4px] border-x border-solid border-[color:var(--cmp-table-header-resizingBar-color)]" })
11887
+ },
11888
+ key
11889
+ );
11890
+ };
11650
11891
  const bodyScrollClass = cn(
11651
11892
  "min-h-0 flex-1 overflow-auto border-t border-solid border-[color:var(--cmp-table-border-color)]",
11652
11893
  SCROLLBAR_CLASS,
@@ -11711,145 +11952,179 @@ var STable = /* @__PURE__ */ react.forwardRef(function STable2({
11711
11952
  style: { fontSize: 12 },
11712
11953
  children: [
11713
11954
  colgroup,
11714
- /* @__PURE__ */ jsxRuntime.jsx("thead", { className: cn(isNoData && "opacity-40"), children: /* @__PURE__ */ jsxRuntime.jsxs("tr", { className: "h-[var(--cmp-table-header-height)] bg-[var(--cmp-table-header-bg)]", children: [
11715
- selectable && /* @__PURE__ */ jsxRuntime.jsxs(
11716
- "th",
11717
- {
11718
- className: cn(
11719
- // 원본 .th--selected: 48px 고정폭, 항상 left sticky, 체크박스 중앙정렬
11720
- // 하단 border는 헤더 래퍼가 연속으로 그리므로 셀에는 두지 않는다.
11721
- "sticky left-0 z-[7] bg-[var(--cmp-table-header-bg)] text-center align-middle",
11722
- stickyLeft === 0 && scrolledLeft && "shadow-[5px_0_8px_0_rgba(34,34,34,0.1)]"
11723
- ),
11724
- style: {
11725
- width: SELECTABLE_COLUMN_WIDTH,
11726
- minWidth: SELECTABLE_COLUMN_WIDTH,
11727
- maxWidth: SELECTABLE_COLUMN_WIDTH
11955
+ /* @__PURE__ */ jsxRuntime.jsxs("thead", { className: cn(isNoData && "opacity-40"), children: [
11956
+ headerGroupInfo && /* @__PURE__ */ jsxRuntime.jsxs("tr", { className: "h-[var(--cmp-table-header-height)] bg-[var(--cmp-table-header-bg)]", children: [
11957
+ selectable && /* @__PURE__ */ jsxRuntime.jsx(
11958
+ "th",
11959
+ {
11960
+ rowSpan: 2,
11961
+ className: cn(
11962
+ "sticky left-0 z-[7] bg-[var(--cmp-table-header-bg)] text-center align-middle",
11963
+ stickyLeft === 0 && scrolledLeft && "shadow-[5px_0_8px_0_rgba(34,34,34,0.1)]"
11964
+ ),
11965
+ style: {
11966
+ width: SELECTABLE_COLUMN_WIDTH,
11967
+ minWidth: SELECTABLE_COLUMN_WIDTH,
11968
+ maxWidth: SELECTABLE_COLUMN_WIDTH
11969
+ },
11970
+ children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center justify-center", children: /* @__PURE__ */ jsxRuntime.jsx(SCheckbox, { value: headerCheck, onValueChange: toggleAll }) })
11971
+ }
11972
+ ),
11973
+ headerGroupInfo.cells.map((group) => /* @__PURE__ */ jsxRuntime.jsxs(
11974
+ "th",
11975
+ {
11976
+ colSpan: group.colSpan,
11977
+ rowSpan: group.rowSpan,
11978
+ className: cn(
11979
+ "relative border-b border-r border-solid border-[color:var(--cmp-table-border-color)] bg-[var(--cmp-table-header-bg)] px-[16px] text-[12px] font-medium leading-[20px] text-[color:var(--sys-color-fg-primary)]",
11980
+ group.firstIndex + group.colSpan === visibleCols.length && "border-r-0",
11981
+ group.rowSpan === 2 && "border-b-0",
11982
+ group.className
11983
+ ),
11984
+ style: { textAlign: group.align ?? "left", ...group.style },
11985
+ children: [
11986
+ group.render ? group.render() : group.label,
11987
+ group.rowSpan === 2 && group.colSpan === 1 ? headerResizeHitArea(
11988
+ group.firstIndex,
11989
+ `group-resizer-${group.columnNames[0]}`
11990
+ ) : null
11991
+ ]
11728
11992
  },
11729
- children: [
11730
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center justify-center", children: /* @__PURE__ */ jsxRuntime.jsx(SCheckbox, { value: headerCheck, onValueChange: toggleAll }) }),
11731
- /* @__PURE__ */ jsxRuntime.jsx(
11732
- "span",
11733
- {
11734
- "aria-hidden": true,
11735
- className: "pointer-events-none absolute right-0 top-1/2 h-[16px] w-px -translate-y-1/2 bg-[var(--cmp-table-header-resizingBar-color)]"
11736
- }
11737
- )
11738
- ]
11739
- }
11740
- ),
11741
- visibleCols.map((col, i) => {
11742
- const isSortable = !!col.sortable && !col.renderHeader;
11743
- const sortDir = isSortable && sort?.name === col.name ? sort.dir : void 0;
11744
- return /* @__PURE__ */ jsxRuntime.jsxs(
11993
+ group.columnNames.join("|")
11994
+ ))
11995
+ ] }),
11996
+ /* @__PURE__ */ jsxRuntime.jsxs("tr", { className: "h-[var(--cmp-table-header-height)] bg-[var(--cmp-table-header-bg)]", children: [
11997
+ selectable && !headerGroupInfo && /* @__PURE__ */ jsxRuntime.jsxs(
11745
11998
  "th",
11746
11999
  {
11747
12000
  className: cn(
11748
- // 하단 border는 헤더 래퍼가 연속으로 그린다 (거터 영역까지 이어짐).
11749
- // leading-[0]: th 의 스트럿(line-height 만큼의 빈 인라인 박스)을 없앤다.
11750
- // 내용이 inline-flex 라 스트럿이 남아 있으면 라벨보다 큰 컨트롤(정렬 버튼 등)이
11751
- // 들어올 때 줄 상자가 베이스라인 기준으로 늘어나 헤더 높이를 넘기고
11752
- // 세로 가운데도 어긋난다. 글자 줄높이는 아래 th__content 가 다시 준다.
11753
- "relative bg-[var(--cmp-table-header-bg)] px-[16px] text-[12px] font-medium leading-[0] text-[color:var(--sys-color-fg-primary)]",
11754
- stickyInfo(i).isSticky && "z-[6]",
11755
- stickyShadowClass(i),
11756
- col.thClass
12001
+ // 원본 .th--selected: 48px 고정폭, 항상 left sticky, 체크박스 중앙정렬
12002
+ // 하단 border는 헤더 래퍼가 연속으로 그리므로 셀에는 두지 않는다.
12003
+ "sticky left-0 z-[7] bg-[var(--cmp-table-header-bg)] text-center align-middle",
12004
+ stickyLeft === 0 && scrolledLeft && "shadow-[5px_0_8px_0_rgba(34,34,34,0.1)]"
11757
12005
  ),
11758
- style: { textAlign: col.align ?? "left", ...cellStyle(i), ...col.thStyle },
11759
- "aria-sort": isSortable ? sortDir === "asc" ? "ascending" : sortDir === "desc" ? "descending" : "none" : void 0,
12006
+ style: {
12007
+ width: SELECTABLE_COLUMN_WIDTH,
12008
+ minWidth: SELECTABLE_COLUMN_WIDTH,
12009
+ maxWidth: SELECTABLE_COLUMN_WIDTH
12010
+ },
11760
12011
  children: [
12012
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center justify-center", children: /* @__PURE__ */ jsxRuntime.jsx(SCheckbox, { value: headerCheck, onValueChange: toggleAll }) }),
11761
12013
  /* @__PURE__ */ jsxRuntime.jsx(
11762
12014
  "span",
11763
12015
  {
11764
- className: cn(
11765
- // 원본 th__content: align에 따라 justify-content 적용 (th도 정렬 반영)
11766
- // th 가 leading-[0] 이므로 글자 줄높이는 여기서 준다 (truncate 가
11767
- // overflow-hidden 이라 줄높이가 0이면 라벨이 잘려 사라진다).
11768
- "inline-flex w-full min-w-0 items-center gap-[4px] leading-[20px]",
11769
- col.align === "center" && "justify-center",
11770
- col.align === "right" && "justify-end"
11771
- ),
11772
- children: col.renderHeader ? col.renderHeader(col, i) : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
11773
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "truncate", children: col.label }),
11774
- col.helpText && col.helpText.length > 0 && // 라벨이 좁아져 truncate 되더라도 아이콘까지 함께 줄어들면 안 되므로
11775
- // shrink-0 래퍼로 감싼다 (STooltip 의 className 은 본문 쪽으로 간다).
11776
- // 아이콘·크기·색은 SKeyValueTable 헤더 도움말과 동일하게 맞춘다.
11777
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "inline-flex shrink-0", children: /* @__PURE__ */ jsxRuntime.jsx(
11778
- STooltip2,
11779
- {
11780
- trigger: "hover",
11781
- icon: "helpOutline",
11782
- iconSize: 12,
11783
- color: "var(--sys-color-fg-success)",
11784
- placement: "top",
11785
- message: col.helpText
11786
- }
11787
- ) }),
11788
- col.editable && /* @__PURE__ */ jsxRuntime.jsx(
11789
- SIcon,
11790
- {
11791
- name: "pageEdit",
11792
- size: 12,
11793
- color: "var(--sys-color-link-accent)",
11794
- label: "\uC218\uC815 \uAC00\uB2A5",
11795
- className: "shrink-0"
11796
- }
11797
- ),
11798
- col.navigable && /* @__PURE__ */ jsxRuntime.jsx(
11799
- SIcon,
11800
- {
11801
- name: "pageMove",
11802
- size: 12,
11803
- color: "var(--sys-color-link-accent)",
11804
- label: "\uB2E4\uB978 \uD654\uBA74\uC73C\uB85C \uC774\uB3D9",
11805
- className: "shrink-0"
11806
- }
11807
- ),
11808
- col.required && // 라벨이 truncate 돼도 필수 표시는 남아야 하므로 shrink-0.
11809
- // 아이콘·크기·색은 SKeyValueTable 헤더 필수 표시와 동일하게 맞춘다.
11810
- /* @__PURE__ */ jsxRuntime.jsx(
11811
- SIcon,
11812
- {
11813
- name: "asterisk",
11814
- size: 12,
11815
- color: "var(--sys-color-fg-accent)",
11816
- className: "shrink-0"
11817
- }
11818
- ),
11819
- isSortable && // 미정렬은 updown 을 default(회색)로 — 정렬할 수 있다는 것 자체가
11820
- // 헤더에 보여야 한다. 정렬 중이면 action 색으로 올려 활성임을 알린다.
11821
- // 라벨이 truncate 돼도 버튼은 남도록 shrink-0.
11822
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "inline-flex shrink-0", children: /* @__PURE__ */ jsxRuntime.jsx(
11823
- SGhostButton,
11824
- {
11825
- size: "xxs",
11826
- intent: sortDir ? "action" : "default",
11827
- icon: sortDir === "asc" ? "arrowUp" : sortDir === "desc" ? "arrowDown" : "updown",
11828
- ariaLabel: `${col.label} \uC815\uB82C`,
11829
- onClick: () => toggleSort(col)
11830
- }
11831
- ) })
11832
- ] })
11833
- }
11834
- ),
11835
- resizable && !col.autoWidth && i < visibleCols.length - 1 && // 원본 th__resizer: 셀 우측 경계 안쪽 4px 그립(좌우 1px #CCCCCC 라인, 세로 16px).
11836
- // 셀 밖으로 넘치면 다음 셀에 가려져 클릭이 안 먹으므로 translate 없이 셀 내부에 배치.
11837
- // 겉보기 그립은 4px(원본과 동일), 클릭 영역은 9px로 넓혀 사용성 확보.
11838
- /* @__PURE__ */ jsxRuntime.jsx(
11839
- "span",
11840
- {
11841
- onMouseDown: (e) => startResize(i, e),
11842
- className: "absolute right-0 top-1/2 z-[5] flex h-[16px] w-[9px] -translate-y-1/2 cursor-col-resize items-center justify-end",
11843
12016
  "aria-hidden": true,
11844
- children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "h-full w-[4px] border-x border-solid border-[color:var(--cmp-table-header-resizingBar-color)]" })
12017
+ className: "pointer-events-none absolute right-0 top-1/2 h-[16px] w-px -translate-y-1/2 bg-[var(--cmp-table-header-resizingBar-color)]"
11845
12018
  }
11846
12019
  )
11847
12020
  ]
11848
- },
11849
- col.name
11850
- );
11851
- })
11852
- ] }) })
12021
+ }
12022
+ ),
12023
+ visibleCols.map((col, i) => {
12024
+ if (headerGroupInfo?.rowSpanNames.has(col.name)) return null;
12025
+ const isSortable = !!col.sortable && !col.renderHeader;
12026
+ const sortDir = isSortable && sort?.name === col.name ? sort.dir : void 0;
12027
+ return /* @__PURE__ */ jsxRuntime.jsxs(
12028
+ "th",
12029
+ {
12030
+ className: cn(
12031
+ // 하단 border는 헤더 래퍼가 연속으로 그린다 (거터 영역까지 이어짐).
12032
+ // leading-[0]: th 의 스트럿(line-height 만큼의 빈 인라인 박스)을 없앤다.
12033
+ // 내용이 inline-flex 라 스트럿이 남아 있으면 라벨보다 큰 컨트롤(정렬 버튼 등)이
12034
+ // 들어올 때 줄 상자가 베이스라인 기준으로 늘어나 헤더 높이를 넘기고
12035
+ // 세로 가운데도 어긋난다. 글자 줄높이는 아래 th__content 가 다시 준다.
12036
+ headerGroupInfo && "border-r border-solid border-[color:var(--cmp-table-border-color)]",
12037
+ headerGroupInfo && i === visibleCols.length - 1 && "border-r-0",
12038
+ "relative bg-[var(--cmp-table-header-bg)] px-[16px] text-[12px] font-medium leading-[0] text-[color:var(--sys-color-fg-primary)]",
12039
+ stickyInfo(i).isSticky && "z-[6]",
12040
+ stickyShadowClass(i),
12041
+ col.thClass
12042
+ ),
12043
+ style: { textAlign: col.align ?? "left", ...cellStyle(i), ...col.thStyle },
12044
+ "aria-sort": isSortable ? sortDir === "asc" ? "ascending" : sortDir === "desc" ? "descending" : "none" : void 0,
12045
+ children: [
12046
+ /* @__PURE__ */ jsxRuntime.jsx(
12047
+ "span",
12048
+ {
12049
+ className: cn(
12050
+ // 원본 th__content: align에 따라 justify-content 적용 (th도 정렬 반영)
12051
+ // th 가 leading-[0] 이므로 글자 줄높이는 여기서 준다 (truncate 가
12052
+ // overflow-hidden 이라 줄높이가 0이면 라벨이 잘려 사라진다).
12053
+ "inline-flex w-full min-w-0 items-center gap-[4px] leading-[20px]",
12054
+ col.align === "center" && "justify-center",
12055
+ col.align === "right" && "justify-end"
12056
+ ),
12057
+ children: col.renderHeader ? col.renderHeader(col, i) : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
12058
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "truncate", children: col.label }),
12059
+ col.helpText && col.helpText.length > 0 && // 라벨이 좁아져 truncate 되더라도 아이콘까지 함께 줄어들면 안 되므로
12060
+ // shrink-0 래퍼로 감싼다 (STooltip 의 className 은 본문 쪽으로 간다).
12061
+ // 아이콘·크기·색은 SKeyValueTable 헤더 도움말과 동일하게 맞춘다.
12062
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "inline-flex shrink-0", children: /* @__PURE__ */ jsxRuntime.jsx(
12063
+ STooltip2,
12064
+ {
12065
+ trigger: "hover",
12066
+ icon: "helpOutline",
12067
+ iconSize: 12,
12068
+ color: "var(--sys-color-fg-success)",
12069
+ placement: "top",
12070
+ message: col.helpText
12071
+ }
12072
+ ) }),
12073
+ col.editable && /* @__PURE__ */ jsxRuntime.jsx(
12074
+ SIcon,
12075
+ {
12076
+ name: "pageEdit",
12077
+ size: 12,
12078
+ color: "var(--sys-color-link-accent)",
12079
+ label: "\uC218\uC815 \uAC00\uB2A5",
12080
+ className: "shrink-0"
12081
+ }
12082
+ ),
12083
+ col.navigable && /* @__PURE__ */ jsxRuntime.jsx(
12084
+ SIcon,
12085
+ {
12086
+ name: "pageMove",
12087
+ size: 12,
12088
+ color: "var(--sys-color-link-accent)",
12089
+ label: "\uB2E4\uB978 \uD654\uBA74\uC73C\uB85C \uC774\uB3D9",
12090
+ className: "shrink-0"
12091
+ }
12092
+ ),
12093
+ col.required && // 라벨이 truncate 돼도 필수 표시는 남아야 하므로 shrink-0.
12094
+ // 아이콘·크기·색은 SKeyValueTable 헤더 필수 표시와 동일하게 맞춘다.
12095
+ /* @__PURE__ */ jsxRuntime.jsx(
12096
+ SIcon,
12097
+ {
12098
+ name: "asterisk",
12099
+ size: 12,
12100
+ color: "var(--sys-color-fg-accent)",
12101
+ className: "shrink-0"
12102
+ }
12103
+ ),
12104
+ isSortable && // 미정렬은 updown 을 default(회색)로 — 정렬할 수 있다는 것 자체가
12105
+ // 헤더에 보여야 한다. 정렬 중이면 action 색으로 올려 활성임을 알린다.
12106
+ // 라벨이 truncate 돼도 버튼은 남도록 shrink-0.
12107
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "inline-flex shrink-0", children: /* @__PURE__ */ jsxRuntime.jsx(
12108
+ SGhostButton,
12109
+ {
12110
+ size: "xxs",
12111
+ intent: sortDir ? "action" : "default",
12112
+ icon: sortDir === "asc" ? "arrowUp" : sortDir === "desc" ? "arrowDown" : "updown",
12113
+ ariaLabel: `${col.label} \uC815\uB82C`,
12114
+ onClick: () => toggleSort(col)
12115
+ }
12116
+ ) })
12117
+ ] })
12118
+ }
12119
+ ),
12120
+ headerGroupInfo ? headerResizeHitArea(i, `resizer-${col.name}`) : headerResizer(i, `resizer-${col.name}`)
12121
+ ]
12122
+ },
12123
+ col.name
12124
+ );
12125
+ })
12126
+ ] })
12127
+ ] })
11853
12128
  ]
11854
12129
  }
11855
12130
  )
@@ -11971,11 +12246,12 @@ var STable = /* @__PURE__ */ react.forwardRef(function STable2({
11971
12246
  ]
11972
12247
  }
11973
12248
  ),
11974
- (showPagination || dense) && // 원본 sd-table__pagination: 테이블 하단에 이어붙는 회색 바(높이 48px, margin-top:-1px로 테두리 겹침).
12249
+ (showPagination || useRowsPerPageSelect) && // 원본 sd-table__pagination: 테이블 하단에 이어붙는 회색 바(높이 48px, margin-top:-1px로 테두리 겹침).
11975
12250
  // SPagination은 전체 폭 기준 중앙, rows-per-page SSelect는 우측에 absolute 배치해 중앙 정렬을 유지한다.
11976
12251
  // 루트 높이가 확정된 경우(테이블이 남은 영역을 채우는 배치) 페이지네이션 바가
11977
12252
  // 눌리지 않도록 shrink-0으로 48px를 보장한다.
11978
- // 페이지네이션이 없어도 dense 면 이 바를 그린다 — 밀도 토글이 사는 곳이 여기다.
12253
+ // 페이지네이션이 없어도 rows-per-page 셀렉트가 있으면 이 바를 그린다 — 셀렉트와
12254
+ // 밀도 토글이 사는 곳이 여기다. dense 만으로는 그리지 않는다(빈 바가 남는다).
11979
12255
  /* @__PURE__ */ jsxRuntime.jsxs(
11980
12256
  "div",
11981
12257
  {
@@ -11986,7 +12262,7 @@ var STable = /* @__PURE__ */ react.forwardRef(function STable2({
11986
12262
  ),
11987
12263
  children: [
11988
12264
  showPagination && /* @__PURE__ */ jsxRuntime.jsx(SPagination, { currentPage: displayPage, lastPage, onPageChange: changePage }),
11989
- (dense || useRowsPerPageSelect) && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "absolute right-[10px] top-1/2 flex -translate-y-1/2 items-center gap-[12px]", children: [
12265
+ useRowsPerPageSelect && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "absolute right-[10px] top-1/2 flex -translate-y-1/2 items-center gap-[12px]", children: [
11990
12266
  dense && /* @__PURE__ */ jsxRuntime.jsx(
11991
12267
  STextLink,
11992
12268
  {
@@ -11998,8 +12274,8 @@ var STable = /* @__PURE__ */ react.forwardRef(function STable2({
11998
12274
  onClick: () => changeDense(!innerDense)
11999
12275
  }
12000
12276
  ),
12001
- dense && useRowsPerPageSelect && /* @__PURE__ */ jsxRuntime.jsx(SDivider, { vertical: true, className: "my-[6px]" }),
12002
- useRowsPerPageSelect && /* @__PURE__ */ jsxRuntime.jsx(
12277
+ dense && /* @__PURE__ */ jsxRuntime.jsx(SDivider, { vertical: true, className: "my-[6px]" }),
12278
+ /* @__PURE__ */ jsxRuntime.jsx(
12003
12279
  SSelect2,
12004
12280
  {
12005
12281
  options: rowsPerPageOption,
@@ -13076,7 +13352,7 @@ function SCalendar({
13076
13352
  }) }),
13077
13353
  legend.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
13078
13354
  /* @__PURE__ */ jsxRuntime.jsx(SDivider, {}),
13079
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-wrap items-center justify-center gap-x-[var(--cmp-datepicker-calendar-legend-group-gap)] gap-y-[4px] text-[11px] leading-[18px]", children: legend.map((item) => /* @__PURE__ */ jsxRuntime.jsxs(
13355
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-wrap items-center justify-center gap-x-[var(--cmp-datepicker-calendar-legend-group-gap)] gap-y-[4px] text-[11px] leading-[18px]", children: legend.map((item2) => /* @__PURE__ */ jsxRuntime.jsxs(
13080
13356
  "span",
13081
13357
  {
13082
13358
  className: "inline-flex items-center gap-[var(--cmp-datepicker-calendar-legend-gap)]",
@@ -13085,14 +13361,14 @@ function SCalendar({
13085
13361
  "span",
13086
13362
  {
13087
13363
  className: "h-[var(--cmp-datepicker-calendar-day-dot-size)] w-[var(--cmp-datepicker-calendar-day-dot-size)] rounded-full",
13088
- style: { backgroundColor: resolveColor(item.color) },
13364
+ style: { backgroundColor: resolveColor(item2.color) },
13089
13365
  "aria-hidden": true
13090
13366
  }
13091
13367
  ),
13092
- /* @__PURE__ */ jsxRuntime.jsx("span", { children: item.label })
13368
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: item2.label })
13093
13369
  ]
13094
13370
  },
13095
- `${item.color}|${item.label}`
13371
+ `${item2.color}|${item2.label}`
13096
13372
  )) })
13097
13373
  ] })
13098
13374
  ]
@@ -16059,19 +16335,19 @@ function EditorToolbarBar({
16059
16335
  closeLinkEditor();
16060
16336
  };
16061
16337
  const visible = [];
16062
- for (const item of items) {
16063
- if (item === "image" && !onImageUpload) continue;
16064
- if (item === "|" && (visible.length === 0 || visible[visible.length - 1] === "|")) continue;
16065
- visible.push(item);
16338
+ for (const item2 of items) {
16339
+ if (item2 === "image" && !onImageUpload) continue;
16340
+ if (item2 === "|" && (visible.length === 0 || visible[visible.length - 1] === "|")) continue;
16341
+ visible.push(item2);
16066
16342
  }
16067
16343
  while (visible.length > 0 && visible[visible.length - 1] === "|") visible.pop();
16068
16344
  const groups = [[]];
16069
- for (const item of visible) {
16070
- if (item === "|") groups.push([]);
16071
- else groups[groups.length - 1].push(item);
16345
+ for (const item2 of visible) {
16346
+ if (item2 === "|") groups.push([]);
16347
+ else groups[groups.length - 1].push(item2);
16072
16348
  }
16073
- const node = (item) => {
16074
- switch (item) {
16349
+ const node = (item2) => {
16350
+ switch (item2) {
16075
16351
  case "heading":
16076
16352
  return /* @__PURE__ */ jsxRuntime.jsxs(RDropdown2__namespace.Root, { modal: !insideModal, children: [
16077
16353
  /* @__PURE__ */ jsxRuntime.jsx(RDropdown2__namespace.Trigger, { asChild: true, disabled: off, children: /* @__PURE__ */ jsxRuntime.jsxs(
@@ -16106,7 +16382,7 @@ function EditorToolbarBar({
16106
16382
  level
16107
16383
  ))
16108
16384
  ] }) })
16109
- ] }, item);
16385
+ ] }, item2);
16110
16386
  case "fontSize":
16111
16387
  return /* @__PURE__ */ jsxRuntime.jsxs(RDropdown2__namespace.Root, { modal: !insideModal, children: [
16112
16388
  /* @__PURE__ */ jsxRuntime.jsx(RDropdown2__namespace.Trigger, { asChild: true, disabled: off, children: /* @__PURE__ */ jsxRuntime.jsxs(ToolbarButton, { label: "\uAE00\uC790 \uD06C\uAE30", disabled: off, className: "px-[6px]", children: [
@@ -16145,7 +16421,7 @@ function EditorToolbarBar({
16145
16421
  ]
16146
16422
  }
16147
16423
  ) })
16148
- ] }, item);
16424
+ ] }, item2);
16149
16425
  case "bold":
16150
16426
  return /* @__PURE__ */ jsxRuntime.jsx(
16151
16427
  ToolbarButton,
@@ -16157,7 +16433,7 @@ function EditorToolbarBar({
16157
16433
  onClick: () => chain()?.toggleBold().run(),
16158
16434
  children: /* @__PURE__ */ jsxRuntime.jsx(IconBold, { size: ICON_SIZE })
16159
16435
  },
16160
- item
16436
+ item2
16161
16437
  );
16162
16438
  case "italic":
16163
16439
  return /* @__PURE__ */ jsxRuntime.jsx(
@@ -16170,7 +16446,7 @@ function EditorToolbarBar({
16170
16446
  onClick: () => chain()?.toggleItalic().run(),
16171
16447
  children: /* @__PURE__ */ jsxRuntime.jsx(IconItalic, { size: ICON_SIZE })
16172
16448
  },
16173
- item
16449
+ item2
16174
16450
  );
16175
16451
  case "underline":
16176
16452
  return /* @__PURE__ */ jsxRuntime.jsx(
@@ -16183,7 +16459,7 @@ function EditorToolbarBar({
16183
16459
  onClick: () => chain()?.toggleUnderline().run(),
16184
16460
  children: /* @__PURE__ */ jsxRuntime.jsx(IconUnderline, { size: ICON_SIZE })
16185
16461
  },
16186
- item
16462
+ item2
16187
16463
  );
16188
16464
  case "strike":
16189
16465
  return /* @__PURE__ */ jsxRuntime.jsx(
@@ -16196,7 +16472,7 @@ function EditorToolbarBar({
16196
16472
  onClick: () => chain()?.toggleStrike().run(),
16197
16473
  children: /* @__PURE__ */ jsxRuntime.jsx(IconStrike, { size: ICON_SIZE })
16198
16474
  },
16199
- item
16475
+ item2
16200
16476
  );
16201
16477
  case "code":
16202
16478
  return /* @__PURE__ */ jsxRuntime.jsx(
@@ -16209,7 +16485,7 @@ function EditorToolbarBar({
16209
16485
  onClick: () => chain()?.toggleCode().run(),
16210
16486
  children: /* @__PURE__ */ jsxRuntime.jsx(IconCode, { size: ICON_SIZE })
16211
16487
  },
16212
- item
16488
+ item2
16213
16489
  );
16214
16490
  case "color":
16215
16491
  if (mobile)
@@ -16221,7 +16497,7 @@ function EditorToolbarBar({
16221
16497
  onClick: () => setMobileView("color"),
16222
16498
  children: /* @__PURE__ */ jsxRuntime.jsx(ColorIndicator, { color: off ? "currentColor" : activeColor, children: /* @__PURE__ */ jsxRuntime.jsx(IconTextColor, { size: ICON_SIZE }) })
16223
16499
  },
16224
- item
16500
+ item2
16225
16501
  );
16226
16502
  return /* @__PURE__ */ jsxRuntime.jsxs(RDropdown2__namespace.Root, { modal: !insideModal, children: [
16227
16503
  /* @__PURE__ */ jsxRuntime.jsx(RDropdown2__namespace.Trigger, { asChild: true, disabled: off, children: /* @__PURE__ */ jsxRuntime.jsx(ToolbarButton, { label: "\uAE00\uC790\uC0C9", disabled: off, children: /* @__PURE__ */ jsxRuntime.jsx(ColorIndicator, { color: off ? "currentColor" : activeColor, children: /* @__PURE__ */ jsxRuntime.jsx(IconTextColor, { size: ICON_SIZE }) }) }) }),
@@ -16236,7 +16512,7 @@ function EditorToolbarBar({
16236
16512
  onClear: clearColor
16237
16513
  }
16238
16514
  ) }) })
16239
- ] }, item);
16515
+ ] }, item2);
16240
16516
  case "alignLeft":
16241
16517
  return /* @__PURE__ */ jsxRuntime.jsx(
16242
16518
  ToolbarButton,
@@ -16248,7 +16524,7 @@ function EditorToolbarBar({
16248
16524
  onClick: () => chain()?.setTextAlign("left").run(),
16249
16525
  children: /* @__PURE__ */ jsxRuntime.jsx(IconAlignLeft, { size: ICON_SIZE })
16250
16526
  },
16251
- item
16527
+ item2
16252
16528
  );
16253
16529
  case "alignCenter":
16254
16530
  return /* @__PURE__ */ jsxRuntime.jsx(
@@ -16261,7 +16537,7 @@ function EditorToolbarBar({
16261
16537
  onClick: () => chain()?.setTextAlign("center").run(),
16262
16538
  children: /* @__PURE__ */ jsxRuntime.jsx(IconAlignCenter, { size: ICON_SIZE })
16263
16539
  },
16264
- item
16540
+ item2
16265
16541
  );
16266
16542
  case "alignRight":
16267
16543
  return /* @__PURE__ */ jsxRuntime.jsx(
@@ -16274,7 +16550,7 @@ function EditorToolbarBar({
16274
16550
  onClick: () => chain()?.setTextAlign("right").run(),
16275
16551
  children: /* @__PURE__ */ jsxRuntime.jsx(IconAlignRight, { size: ICON_SIZE })
16276
16552
  },
16277
- item
16553
+ item2
16278
16554
  );
16279
16555
  case "alignJustify":
16280
16556
  return /* @__PURE__ */ jsxRuntime.jsx(
@@ -16287,7 +16563,7 @@ function EditorToolbarBar({
16287
16563
  onClick: () => chain()?.setTextAlign("justify").run(),
16288
16564
  children: /* @__PURE__ */ jsxRuntime.jsx(IconAlignJustify, { size: ICON_SIZE })
16289
16565
  },
16290
- item
16566
+ item2
16291
16567
  );
16292
16568
  case "bulletList":
16293
16569
  return /* @__PURE__ */ jsxRuntime.jsx(
@@ -16300,7 +16576,7 @@ function EditorToolbarBar({
16300
16576
  onClick: () => chain()?.toggleBulletList().run(),
16301
16577
  children: /* @__PURE__ */ jsxRuntime.jsx(IconBulletList, { size: ICON_SIZE })
16302
16578
  },
16303
- item
16579
+ item2
16304
16580
  );
16305
16581
  case "orderedList":
16306
16582
  return /* @__PURE__ */ jsxRuntime.jsx(
@@ -16313,7 +16589,7 @@ function EditorToolbarBar({
16313
16589
  onClick: () => chain()?.toggleOrderedList().run(),
16314
16590
  children: /* @__PURE__ */ jsxRuntime.jsx(IconOrderedList, { size: ICON_SIZE })
16315
16591
  },
16316
- item
16592
+ item2
16317
16593
  );
16318
16594
  case "taskList":
16319
16595
  return /* @__PURE__ */ jsxRuntime.jsx(
@@ -16326,7 +16602,7 @@ function EditorToolbarBar({
16326
16602
  onClick: () => chain()?.toggleTaskList().run(),
16327
16603
  children: /* @__PURE__ */ jsxRuntime.jsx(IconTaskList, { size: ICON_SIZE })
16328
16604
  },
16329
- item
16605
+ item2
16330
16606
  );
16331
16607
  case "list": {
16332
16608
  const ListIcon = state2.orderedList ? IconOrderedList : state2.taskList ? IconTaskList : IconBulletList;
@@ -16371,7 +16647,7 @@ function EditorToolbarBar({
16371
16647
  }
16372
16648
  )
16373
16649
  ] }) })
16374
- ] }, item);
16650
+ ] }, item2);
16375
16651
  }
16376
16652
  case "blockquote":
16377
16653
  return /* @__PURE__ */ jsxRuntime.jsx(
@@ -16384,7 +16660,7 @@ function EditorToolbarBar({
16384
16660
  onClick: () => chain()?.toggleBlockquote().run(),
16385
16661
  children: /* @__PURE__ */ jsxRuntime.jsx(IconBlockquote, { size: ICON_SIZE })
16386
16662
  },
16387
- item
16663
+ item2
16388
16664
  );
16389
16665
  case "codeBlock":
16390
16666
  return /* @__PURE__ */ jsxRuntime.jsx(
@@ -16397,7 +16673,7 @@ function EditorToolbarBar({
16397
16673
  onClick: () => chain()?.toggleCodeBlock().run(),
16398
16674
  children: /* @__PURE__ */ jsxRuntime.jsx(IconCodeBlock, { size: ICON_SIZE })
16399
16675
  },
16400
- item
16676
+ item2
16401
16677
  );
16402
16678
  case "horizontalRule":
16403
16679
  return /* @__PURE__ */ jsxRuntime.jsx(
@@ -16408,7 +16684,7 @@ function EditorToolbarBar({
16408
16684
  onClick: () => chain()?.setHorizontalRule().run(),
16409
16685
  children: /* @__PURE__ */ jsxRuntime.jsx(IconHorizontalRule, { size: ICON_SIZE })
16410
16686
  },
16411
- item
16687
+ item2
16412
16688
  );
16413
16689
  case "link":
16414
16690
  if (mobile)
@@ -16421,7 +16697,7 @@ function EditorToolbarBar({
16421
16697
  onClick: () => setMobileView("link"),
16422
16698
  children: /* @__PURE__ */ jsxRuntime.jsx(IconLink, { size: ICON_SIZE })
16423
16699
  },
16424
- item
16700
+ item2
16425
16701
  );
16426
16702
  return /* @__PURE__ */ jsxRuntime.jsxs(RPopover11__namespace.Root, { open: linkOpen, onOpenChange: setLinkOpen, children: [
16427
16703
  /* @__PURE__ */ jsxRuntime.jsx(RPopover11__namespace.Trigger, { asChild: true, disabled: off, children: /* @__PURE__ */ jsxRuntime.jsx(ToolbarButton, { label: "\uB9C1\uD06C", active: state2.link, disabled: off, children: /* @__PURE__ */ jsxRuntime.jsx(IconLink, { size: ICON_SIZE }) }) }),
@@ -16446,7 +16722,7 @@ function EditorToolbarBar({
16446
16722
  )
16447
16723
  }
16448
16724
  ) })
16449
- ] }, item);
16725
+ ] }, item2);
16450
16726
  case "image":
16451
16727
  return /* @__PURE__ */ jsxRuntime.jsxs(
16452
16728
  ToolbarButton,
@@ -16460,7 +16736,7 @@ function EditorToolbarBar({
16460
16736
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-[12px] leading-[20px]", children: "\uC774\uBBF8\uC9C0" })
16461
16737
  ]
16462
16738
  },
16463
- item
16739
+ item2
16464
16740
  );
16465
16741
  case "table":
16466
16742
  return /* @__PURE__ */ jsxRuntime.jsxs(
@@ -16581,7 +16857,7 @@ function EditorToolbarBar({
16581
16857
  ] }) })
16582
16858
  ]
16583
16859
  },
16584
- item
16860
+ item2
16585
16861
  );
16586
16862
  case "undo":
16587
16863
  return /* @__PURE__ */ jsxRuntime.jsx(
@@ -16592,7 +16868,7 @@ function EditorToolbarBar({
16592
16868
  onClick: () => chain()?.undo().run(),
16593
16869
  children: /* @__PURE__ */ jsxRuntime.jsx(IconUndo, { size: ICON_SIZE })
16594
16870
  },
16595
- item
16871
+ item2
16596
16872
  );
16597
16873
  case "redo":
16598
16874
  return /* @__PURE__ */ jsxRuntime.jsx(
@@ -16603,7 +16879,7 @@ function EditorToolbarBar({
16603
16879
  onClick: () => chain()?.redo().run(),
16604
16880
  children: /* @__PURE__ */ jsxRuntime.jsx(IconRedo, { size: ICON_SIZE })
16605
16881
  },
16606
- item
16882
+ item2
16607
16883
  );
16608
16884
  default:
16609
16885
  return null;
@@ -17211,7 +17487,8 @@ var resolveFieldDefault = (field) => {
17211
17487
  if (field.type === "datepicker-day") return todayIso();
17212
17488
  if (field.type === "select") return field.options?.[0]?.value;
17213
17489
  if (field.type === "datepicker-statistics") {
17214
- const unit = getFieldPresets(field).find((preset) => !preset.custom)?.value;
17490
+ const presets = getFieldPresets(field).filter((preset) => !preset.custom);
17491
+ const unit = presets.some((preset) => preset.value === "day") ? "day" : presets[0]?.value;
17215
17492
  return unit ? createPeriodValue(unit) : void 0;
17216
17493
  }
17217
17494
  return void 0;
@@ -17341,8 +17618,7 @@ var SChipFilter = /* @__PURE__ */ react.forwardRef(function SChipFilter2({
17341
17618
  onActiveKeysChange,
17342
17619
  onReset,
17343
17620
  onAddFilter,
17344
- label = "\uAC80\uC0C9 \uD544\uD130",
17345
- showLabel = false,
17621
+ label,
17346
17622
  showReset = true,
17347
17623
  disabled = false,
17348
17624
  className,
@@ -17359,6 +17635,7 @@ var SChipFilter = /* @__PURE__ */ react.forwardRef(function SChipFilter2({
17359
17635
  const pendingOpenKeyRef = react.useRef(null);
17360
17636
  const triggerRefs = react.useRef(/* @__PURE__ */ new Map());
17361
17637
  const initializedDefaultsRef = react.useRef(/* @__PURE__ */ new Set());
17638
+ const misuseWarningSignatureRef = react.useRef(null);
17362
17639
  const prevOpenKeyRef = react.useRef(null);
17363
17640
  const valuesRef = react.useRef(values);
17364
17641
  valuesRef.current = values;
@@ -17374,14 +17651,19 @@ var SChipFilter = /* @__PURE__ */ react.forwardRef(function SChipFilter2({
17374
17651
  (current) => groups.every((group) => isGroupSatisfied(group, current)),
17375
17652
  [groups]
17376
17653
  );
17654
+ const isRequiredSatisfied = react.useCallback(
17655
+ (current) => fields.every((field) => !field.required || !isEmptyValue(current[field.key])),
17656
+ [fields]
17657
+ );
17377
17658
  const runSearch = react.useCallback(
17378
17659
  (next) => {
17379
17660
  if (valuesMapEqual(lastSearchedValuesRef.current, next)) return;
17380
17661
  if (!isGroupsValid(next)) return;
17662
+ if (!isRequiredSatisfied(next)) return;
17381
17663
  lastSearchedValuesRef.current = next;
17382
17664
  onSearch?.(next);
17383
17665
  },
17384
- [isGroupsValid, onSearch]
17666
+ [isGroupsValid, isRequiredSatisfied, onSearch]
17385
17667
  );
17386
17668
  react.useEffect(() => {
17387
17669
  const prevKey = prevOpenKeyRef.current;
@@ -17416,14 +17698,24 @@ var SChipFilter = /* @__PURE__ */ react.forwardRef(function SChipFilter2({
17416
17698
  });
17417
17699
  if (changed) onValueChange?.({ ...values, ...patch });
17418
17700
  }, [fields, values, onValueChange]);
17419
- if (typeof console !== "undefined") {
17420
- const misused = fields.filter((f) => f.defaultValue !== void 0 && !isFixedField(f));
17421
- if (misused.length > 0) {
17701
+ react.useEffect(() => {
17702
+ if (typeof console === "undefined") return;
17703
+ const misusedKeys = fields.filter((f) => f.defaultValue !== void 0 && !isFixedField(f)).map((f) => f.key);
17704
+ const requiredWithoutDefaultKeys = fields.filter((f) => f.required === true && resolveFieldDefault(f) === void 0).map((f) => f.key);
17705
+ const signature = JSON.stringify([misusedKeys, requiredWithoutDefaultKeys]);
17706
+ if (signature === misuseWarningSignatureRef.current) return;
17707
+ misuseWarningSignatureRef.current = signature;
17708
+ if (misusedKeys.length > 0) {
17422
17709
  console.warn(
17423
- `[SChipFilter] defaultValue \uB294 fixed\xB7required \uD544\uD130\uC5D0\uC11C\uB9CC \uC4F8 \uC218 \uC788\uC2B5\uB2C8\uB2E4. \uBB34\uC2DC\uD569\uB2C8\uB2E4. (${misused.map((f) => f.key).join(", ")})`
17710
+ `[SChipFilter] defaultValue \uB294 fixed\xB7required \uD544\uD130\uC5D0\uC11C\uB9CC \uC4F8 \uC218 \uC788\uC2B5\uB2C8\uB2E4. \uBB34\uC2DC\uD569\uB2C8\uB2E4. (${misusedKeys.join(", ")})`
17424
17711
  );
17425
17712
  }
17426
- }
17713
+ if (requiredWithoutDefaultKeys.length > 0) {
17714
+ console.warn(
17715
+ `[SChipFilter] required \uD544\uD130\uC5D0 defaultValue \uAC00 \uC5C6\uC2B5\uB2C8\uB2E4 \u2014 \uC774 \uD0C0\uC785\uC740 \uB0B4\uC7A5 \uAE30\uBCF8\uAC12\uC774 \uC5C6\uC5B4 "\uAC80\uC0C9 \uCD08\uAE30\uD654" \uC2DC \uAC12\uC774 \uBE44\uC6CC\uC9C0\uACE0 \uAC80\uC0C9\uB3C4 \uB9C9\uD799\uB2C8\uB2E4. defaultValue \uB97C \uC9C0\uC815\uD558\uC138\uC694. (${requiredWithoutDefaultKeys.join(", ")})`
17716
+ );
17717
+ }
17718
+ }, [fields]);
17427
17719
  const fixedKeys = fields.filter(isFixedField).map((field) => field.key);
17428
17720
  const resolvedActiveKeys = Array.from(
17429
17721
  /* @__PURE__ */ new Set([...activeKeys ?? internalActiveKeys, ...fixedKeys])
@@ -17491,7 +17783,10 @@ var SChipFilter = /* @__PURE__ */ react.forwardRef(function SChipFilter2({
17491
17783
  },
17492
17784
  [fields]
17493
17785
  );
17494
- const validate = react.useCallback(() => invalidGroups.size === 0, [invalidGroups]);
17786
+ const validate = react.useCallback(
17787
+ () => invalidGroups.size === 0 && isRequiredSatisfied(values),
17788
+ [invalidGroups, isRequiredSatisfied, values]
17789
+ );
17495
17790
  react.useImperativeHandle(ref, () => ({ open, reset, validate }), [open, reset, validate]);
17496
17791
  const addField = (key) => {
17497
17792
  const next = [...resolvedActiveKeys, key];
@@ -17528,7 +17823,7 @@ var SChipFilter = /* @__PURE__ */ react.forwardRef(function SChipFilter2({
17528
17823
  ),
17529
17824
  style: { ...rootStyle, borderColor: "var(--chipfilter-bar-border)" },
17530
17825
  children: [
17531
- showLabel && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
17826
+ label && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
17532
17827
  /* @__PURE__ */ jsxRuntime.jsx(STag, { className: "shrink-0", shape: "square", size: "sm", color: "darkblue", label }),
17533
17828
  /* @__PURE__ */ jsxRuntime.jsx(Divider, { top: true })
17534
17829
  ] }),
@@ -18238,6 +18533,10 @@ function InlineDatePresetFilter({
18238
18533
  setSelectedId(preset.value);
18239
18534
  onValueChange(preset.resolve ? preset.resolve() : null);
18240
18535
  };
18536
+ const badgeBorder = disabled ? CHIPFILTER.chipDisabledBorder : warning ? CHIPFILTER.chipWarningBorder : CHIPFILTER.chipAppliedBorder;
18537
+ const badgeBackground = disabled ? CHIPFILTER.chipDisabledBg : CHIPFILTER.chipAppliedBg;
18538
+ const badgeLabelColor = disabled ? CHIPFILTER.chipDisabledText : CHIPFILTER.chipAppliedLabel;
18539
+ const badgeValueColor = disabled ? CHIPFILTER.chipDisabledText : CHIPFILTER.chipAppliedValue;
18241
18540
  const badge = applied && /* @__PURE__ */ jsxRuntime.jsxs(
18242
18541
  "span",
18243
18542
  {
@@ -18245,17 +18544,17 @@ function InlineDatePresetFilter({
18245
18544
  style: {
18246
18545
  minHeight: CHIPFILTER.chipHeight,
18247
18546
  borderRadius: CHIPFILTER.chipRadius,
18248
- borderColor: warning ? CHIPFILTER.chipWarningBorder : CHIPFILTER.chipAppliedBorder,
18249
- background: CHIPFILTER.chipAppliedBg,
18250
- color: CHIPFILTER.chipAppliedLabel,
18251
- cursor: rangeValue ? "pointer" : void 0
18547
+ borderColor: badgeBorder,
18548
+ background: badgeBackground,
18549
+ color: badgeLabelColor,
18550
+ cursor: rangeValue && !disabled ? "pointer" : void 0
18252
18551
  },
18253
18552
  children: [
18254
18553
  /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "font-bold", children: [
18255
18554
  field.label,
18256
18555
  ":"
18257
18556
  ] }),
18258
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-bold", style: { color: CHIPFILTER.chipAppliedValue }, children: displayValue(field, value) }),
18557
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-bold", style: { color: badgeValueColor }, children: displayValue(field, value) }),
18259
18558
  !disabled && showClear && /* @__PURE__ */ jsxRuntime.jsx(
18260
18559
  "span",
18261
18560
  {
@@ -19037,8 +19336,8 @@ var SChipInput = /* @__PURE__ */ react.forwardRef(function SChipInput2({
19037
19336
  onMouseDown: (e) => e.preventDefault(),
19038
19337
  children: [
19039
19338
  loading2 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "s-chip-input__suggestions-empty p-sd-12 text-center text-12 leading-sd-20 text-(--color-grey-65)", children: "\uBD88\uB7EC\uC624\uB294 \uC911..." }),
19040
- !effectiveAutocomplete ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-wrap gap-sd-8 px-sd-12 py-sd-6", children: items.map((item, i) => {
19041
- const selected = values.includes(item);
19339
+ !effectiveAutocomplete ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-wrap gap-sd-8 px-sd-12 py-sd-6", children: items.map((item2, i) => {
19340
+ const selected = values.includes(item2);
19042
19341
  const active = i === activeIndex && !selected;
19043
19342
  return /* @__PURE__ */ jsxRuntime.jsx(
19044
19343
  "div",
@@ -19049,14 +19348,14 @@ var SChipInput = /* @__PURE__ */ react.forwardRef(function SChipInput2({
19049
19348
  style: active ? { outline: "2px solid var(--color-border-accent)", outlineOffset: 1 } : void 0,
19050
19349
  onMouseDown: (e) => {
19051
19350
  e.preventDefault();
19052
- if (!selected) addChip(item);
19351
+ if (!selected) addChip(item2);
19053
19352
  },
19054
- children: /* @__PURE__ */ jsxRuntime.jsx(SChip2, { value: item, disabled: selected, editable: false, showRemove: false })
19353
+ children: /* @__PURE__ */ jsxRuntime.jsx(SChip2, { value: item2, disabled: selected, editable: false, showRemove: false })
19055
19354
  },
19056
- item
19355
+ item2
19057
19356
  );
19058
- }) }) : items.map((item, i) => {
19059
- const selected = values.includes(item);
19357
+ }) }) : items.map((item2, i) => {
19358
+ const selected = values.includes(item2);
19060
19359
  const active = i === activeIndex && !selected;
19061
19360
  return /* @__PURE__ */ jsxRuntime.jsxs(
19062
19361
  "div",
@@ -19069,10 +19368,10 @@ var SChipInput = /* @__PURE__ */ react.forwardRef(function SChipInput2({
19069
19368
  ),
19070
19369
  onMouseDown: (e) => {
19071
19370
  e.preventDefault();
19072
- if (!selected) addChip(item);
19371
+ if (!selected) addChip(item2);
19073
19372
  },
19074
19373
  children: [
19075
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "flex-1", children: item }),
19374
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "flex-1", children: item2 }),
19076
19375
  selected && /* @__PURE__ */ jsxRuntime.jsx(
19077
19376
  SIcon,
19078
19377
  {
@@ -19083,7 +19382,7 @@ var SChipInput = /* @__PURE__ */ react.forwardRef(function SChipInput2({
19083
19382
  )
19084
19383
  ]
19085
19384
  },
19086
- item
19385
+ item2
19087
19386
  );
19088
19387
  })
19089
19388
  ]
@@ -19467,22 +19766,22 @@ function TimeSelector({
19467
19766
  style: {
19468
19767
  padding: "var(--cmp-timepicker-selector-section-paddingY) var(--cmp-timepicker-selector-section-paddingX)"
19469
19768
  },
19470
- children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "isolate flex", children: ["AM", "PM"].map((item, index) => {
19471
- const selected = item === meridiem;
19769
+ children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "isolate flex", children: ["AM", "PM"].map((item2, index) => {
19770
+ const selected = item2 === meridiem;
19472
19771
  return /* @__PURE__ */ jsxRuntime.jsx(
19473
19772
  "button",
19474
19773
  {
19475
19774
  type: "button",
19476
- onClick: () => setMeridiem(item),
19775
+ onClick: () => setMeridiem(item2),
19477
19776
  className: cn(
19478
19777
  "box-border h-[var(--cmp-textinput-sm-height)] w-[61px] cursor-pointer border border-solid bg-white text-center text-[12px] font-medium leading-[20px]",
19479
19778
  index === 0 ? "rounded-l-[var(--cmp-select-sm-radius)]" : "rounded-r-[var(--cmp-select-sm-radius)]",
19480
19779
  index === 0 ? "-mr-px" : "",
19481
19780
  selected ? "z-[1] border-[var(--cmp-timepicker-border-focus)] text-[var(--cmp-timepicker-border-focus)]" : "border-[var(--cmp-timepicker-border-default)] text-[var(--cmp-field-hint-color)]"
19482
19781
  ),
19483
- children: item === "AM" ? "\uC624\uC804" : "\uC624\uD6C4"
19782
+ children: item2 === "AM" ? "\uC624\uC804" : "\uC624\uD6C4"
19484
19783
  },
19485
- item
19784
+ item2
19486
19785
  );
19487
19786
  }) })
19488
19787
  }
@@ -19703,8 +20002,8 @@ function getTimeMinutes(value) {
19703
20002
  }
19704
20003
  function normalizeTimeRangeValue(value, rangeOrder = "strict") {
19705
20004
  if (value == null) return null;
19706
- const normalized = value.map((item) => {
19707
- const parsed = parseTimeValue(item);
20005
+ const normalized = value.map((item2) => {
20006
+ const parsed = parseTimeValue(item2);
19708
20007
  return formatTimeValue(parsed.hour, parsed.minute);
19709
20008
  });
19710
20009
  if (rangeOrder === "strict" && getTimeMinutes(normalized[0]) > getTimeMinutes(normalized[1])) {
@@ -19914,21 +20213,21 @@ function RangeTimeSelector({
19914
20213
  style: { gap: "var(--cmp-timepicker-selector-range-heading-gap)" },
19915
20214
  children: [
19916
20215
  /* @__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 }),
19917
- useMeridiem && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "isolate flex", children: ["AM", "PM"].map((item, index) => {
19918
- const selected = item === getMeridiem(side);
20216
+ useMeridiem && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "isolate flex", children: ["AM", "PM"].map((item2, index) => {
20217
+ const selected = item2 === getMeridiem(side);
19919
20218
  return /* @__PURE__ */ jsxRuntime.jsx(
19920
20219
  "button",
19921
20220
  {
19922
20221
  type: "button",
19923
- onClick: () => setMeridiem(side, item),
20222
+ onClick: () => setMeridiem(side, item2),
19924
20223
  className: cn(
19925
20224
  "box-border h-[var(--cmp-textinput-sm-height)] w-[61px] cursor-pointer border border-solid bg-white text-center text-[12px] font-medium leading-[20px]",
19926
20225
  index === 0 ? "rounded-l-[var(--cmp-select-sm-radius)] -mr-px" : "rounded-r-[var(--cmp-select-sm-radius)]",
19927
20226
  selected ? "z-[1] border-[var(--cmp-timepicker-border-focus)] text-[var(--cmp-timepicker-border-focus)]" : "border-[var(--cmp-timepicker-border-default)] text-[var(--cmp-field-hint-color)]"
19928
20227
  ),
19929
- children: item === "AM" ? "\uC624\uC804" : "\uC624\uD6C4"
20228
+ children: item2 === "AM" ? "\uC624\uC804" : "\uC624\uD6C4"
19930
20229
  },
19931
- item
20230
+ item2
19932
20231
  );
19933
20232
  }) })
19934
20233
  ]
@@ -20252,6 +20551,7 @@ exports.SSelect = SSelect2;
20252
20551
  exports.SSplitter = SSplitter2;
20253
20552
  exports.SStepper = SStepper;
20254
20553
  exports.SSwitch = SSwitch;
20554
+ exports.SSystemActionButton = SSystemActionButton;
20255
20555
  exports.STEPPER_SIZES = STEPPER_SIZES;
20256
20556
  exports.STable = STable;
20257
20557
  exports.STableBar = STableBar;
@@ -20267,6 +20567,11 @@ exports.SToggle = SToggle;
20267
20567
  exports.STooltip = STooltip2;
20268
20568
  exports.STree = STree2;
20269
20569
  exports.STreeItem = STreeItem2;
20570
+ exports.SYSTEM_ACTION_BUTTON_COLORS = SYSTEM_ACTION_BUTTON_COLORS;
20571
+ exports.SYSTEM_ACTION_BUTTON_COLOR_CONFIG = SYSTEM_ACTION_BUTTON_COLOR_CONFIG;
20572
+ exports.SYSTEM_ACTION_BUTTON_LAYOUT = SYSTEM_ACTION_BUTTON_LAYOUT;
20573
+ exports.SYSTEM_ACTION_BUTTON_TYPES = SYSTEM_ACTION_BUTTON_TYPES;
20574
+ exports.SYSTEM_ACTION_BUTTON_TYPE_CONFIG = SYSTEM_ACTION_BUTTON_TYPE_CONFIG;
20270
20575
  exports.TAG_COLORS = TAG_COLORS;
20271
20576
  exports.TAG_SHAPES = TAG_SHAPES;
20272
20577
  exports.TAG_SIZES = TAG_SIZES;