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.js CHANGED
@@ -4215,7 +4215,7 @@ function moveWithDepth(items, fromIndex, target, getDepth, setDepth, maxDepth) {
4215
4215
  const nextDepth = target.intent === "inside" ? targetDepth + 1 : targetDepth;
4216
4216
  const depthDelta = clampDepth(nextDepth, maxDepth) - sourceDepth;
4217
4217
  const nextMovedItems = setDepth && depthDelta !== 0 ? movedItems.map(
4218
- (item, index) => setDepth(item, clampDepth(getDepth(item, fromIndex + index) + depthDelta, maxDepth))
4218
+ (item2, index) => setDepth(item2, clampDepth(getDepth(item2, fromIndex + index) + depthDelta, maxDepth))
4219
4219
  ) : movedItems;
4220
4220
  return [
4221
4221
  ...remainingItems.slice(0, insertionIndex),
@@ -4262,7 +4262,7 @@ function SDraggableListInner({
4262
4262
  setDropTarget({ index, intent: "before" });
4263
4263
  }, []);
4264
4264
  const readDepth = useCallback(
4265
- (item, index) => clampDepth(getDepth?.(item, index) ?? 1, maxDepth),
4265
+ (item2, index) => clampDepth(getDepth?.(item2, index) ?? 1, maxDepth),
4266
4266
  [getDepth, maxDepth]
4267
4267
  );
4268
4268
  useEffect(() => {
@@ -4303,8 +4303,8 @@ function SDraggableListInner({
4303
4303
  nextDropTarget = ratio < 0.5 ? { index, intent: "before" } : { index, intent: "after" };
4304
4304
  break;
4305
4305
  }
4306
- const item = items[index];
4307
- const canHaveChildren = (getCanHaveChildren?.(item, index) ?? true) && readDepth(item, index) < maxDepth;
4306
+ const item2 = items[index];
4307
+ const canHaveChildren = (getCanHaveChildren?.(item2, index) ?? true) && readDepth(item2, index) < maxDepth;
4308
4308
  if (ratio < 0.25) {
4309
4309
  nextDropTarget = { index, intent: "before" };
4310
4310
  } else if (ratio > 0.75 || !canHaveChildren) {
@@ -4384,10 +4384,10 @@ function SDraggableListInner({
4384
4384
  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-['']" : ""}`,
4385
4385
  "data-draggable-group": dragContext ? dragGroup : void 0,
4386
4386
  "data-draggable-list-id": dragContext ? listId : void 0,
4387
- children: items.map((item, index) => {
4388
- const itemKey = getKey(item, index);
4389
- const disabled = (getDisabled?.(item, index) ?? false) || isDescendant(items, index, draggedSubtreeStart, usesDepth ? readDepth : void 0);
4390
- const depth = readDepth(item, index);
4387
+ children: items.map((item2, index) => {
4388
+ const itemKey = getKey(item2, index);
4389
+ const disabled = (getDisabled?.(item2, index) ?? false) || isDescendant(items, index, draggedSubtreeStart, usesDepth ? readDepth : void 0);
4390
+ const depth = readDepth(item2, index);
4391
4391
  const showBefore = isDropTarget && currentDropIndex === index && (dragContext || currentDropIntent === "before");
4392
4392
  const showInside = isDropTarget && currentDropIndex === index && !dragContext && usesDepth && currentDropIntent === "inside";
4393
4393
  const showAfter = isDropTarget && (dragContext ? currentDropIndex === items.length && index === items.length - 1 : currentDropIndex === index && currentDropIntent === "after");
@@ -4411,7 +4411,7 @@ function SDraggableListInner({
4411
4411
  onClick: selectItem,
4412
4412
  onKeyDown: handleItemKeyDown,
4413
4413
  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)" : ""}`,
4414
- children: renderItem(item, index, {
4414
+ children: renderItem(item2, index, {
4415
4415
  onDragHandleMouseDown: (event) => {
4416
4416
  if (disabled) return;
4417
4417
  if (dragContext && dragGroup && listId) {
@@ -5333,7 +5333,7 @@ var STreeImpl = /* @__PURE__ */ forwardRef(function STree({
5333
5333
  }, ref) {
5334
5334
  const [internalValue, setInternalValue] = useState(defaultValue ?? []);
5335
5335
  const [internalExpandedIds, setInternalExpandedIds] = useState(
5336
- defaultExpandedIds ?? items.filter((item) => item.children?.length).map((item) => item.id)
5336
+ defaultExpandedIds ?? items.filter((item2) => item2.children?.length).map((item2) => item2.id)
5337
5337
  );
5338
5338
  const currentValue = value ?? internalValue;
5339
5339
  const currentExpandedIds = expandedIds ?? internalExpandedIds;
@@ -6708,6 +6708,174 @@ function SSwitch({
6708
6708
  }
6709
6709
  );
6710
6710
  }
6711
+
6712
+ // src/components/SSystemActionButton/systemActionButton.config.ts
6713
+ var SYSTEM_ACTION_BUTTON_COLORS = ["light", "dark", "darker"];
6714
+ var SYSTEM_ACTION_BUTTON_TYPES = [
6715
+ "account",
6716
+ "switch",
6717
+ "select",
6718
+ "subSelect",
6719
+ "status"
6720
+ ];
6721
+ var item = (p) => `var(--cmp-gnb-system-item-${p})`;
6722
+ var action = (p) => `var(--cmp-gnb-system-actionButton-${p})`;
6723
+ var sys = (p) => `var(--sys-color-${p})`;
6724
+ var SYSTEM_ACTION_BUTTON_COLOR_CONFIG = {
6725
+ light: {
6726
+ bg: item("light-bg-default"),
6727
+ bgHover: item("light-bg-hover"),
6728
+ // light 의 아이콘 프레임 배경은 기본·hover 공통 한 값이다 (흰 면 위 흰 프레임)
6729
+ iconBg: item("light-icon-bg"),
6730
+ iconBgHover: item("light-icon-bg"),
6731
+ iconGlyph: item("light-icon-default"),
6732
+ iconGlyphHover: item("light-icon-default"),
6733
+ text: item("light-text"),
6734
+ actionText: {
6735
+ switch: action("switch-text-light"),
6736
+ selectData: action("selectData-text-light")
6737
+ },
6738
+ // 트레일링 아이콘 전용 색 토큰이 없다. light 는 item.icon.default 가
6739
+ // "actionButton/alertButton/setting 공통 글리프색"이라고 토큰에 명시돼 있다.
6740
+ actionIcon: item("light-icon-default")
6741
+ },
6742
+ dark: {
6743
+ bg: item("dark-bg-default"),
6744
+ bgHover: item("dark-bg-hover"),
6745
+ iconBg: item("dark-icon-bg-default"),
6746
+ iconBgHover: item("dark-icon-bg-hover"),
6747
+ // 어두운 면에는 글리프색 토큰이 없다. 기본은 프레임이 배경과 블렌딩되므로 라벨색(흰색),
6748
+ // hover 는 프레임이 흰색이 되므로 그 위에 표면색을 그대로 얹는다.
6749
+ iconGlyph: item("dark-text"),
6750
+ iconGlyphHover: item("dark-bg-hover"),
6751
+ text: item("dark-text"),
6752
+ actionText: {
6753
+ switch: action("switch-text-dark"),
6754
+ selectData: action("selectData-text-dark")
6755
+ },
6756
+ // TODO: 어두운 면의 트레일링 아이콘 색 토큰이 없다. 시안(#AAAAAA)에 맞는 시맨틱 토큰으로 둔다.
6757
+ actionIcon: sys("fg-quaternary")
6758
+ },
6759
+ darker: {
6760
+ bg: item("darker-bg-default"),
6761
+ bgHover: item("darker-bg-hover"),
6762
+ iconBg: item("darker-icon-bg-default"),
6763
+ iconBgHover: item("darker-icon-bg-hover"),
6764
+ iconGlyph: item("darker-text"),
6765
+ iconGlyphHover: item("darker-bg-hover"),
6766
+ text: item("darker-text"),
6767
+ actionText: {
6768
+ switch: action("switch-text-dark"),
6769
+ selectData: action("selectData-text-dark")
6770
+ },
6771
+ actionIcon: sys("fg-quaternary")
6772
+ }
6773
+ };
6774
+ var SYSTEM_ACTION_BUTTON_TYPE_CONFIG = {
6775
+ account: { fixedIcon: "user" },
6776
+ switch: {
6777
+ actionText: { token: "switch", typo: "typo-field-sm-default" },
6778
+ actionIcon: { name: "synchronize", size: action("switch-icon") }
6779
+ },
6780
+ select: {
6781
+ actionIcon: { name: "chevronRight", size: action("select-icon") }
6782
+ },
6783
+ subSelect: {
6784
+ actionText: { token: "selectData", typo: "typo-control-xs-medium" },
6785
+ actionIcon: { name: "chevronRight", size: action("selectData-icon") }
6786
+ },
6787
+ status: {
6788
+ // status 는 선행 아이콘 없이 태그가 라벨 자리를 차지한다
6789
+ actionIcon: { name: "chevronRight", size: action("select-icon") }
6790
+ }
6791
+ };
6792
+ var SYSTEM_ACTION_BUTTON_LAYOUT = {
6793
+ /** 행 높이 */
6794
+ height: item("height"),
6795
+ /** 행 라운드 */
6796
+ radius: item("radius"),
6797
+ /** 아이콘 프레임 한 변 */
6798
+ iconFrame: item("icon-frame"),
6799
+ /** 아이콘 글리프 크기 */
6800
+ iconGlyph: item("icon-glyph"),
6801
+ /** 아이콘 프레임 라운드 */
6802
+ iconRadius: item("icon-radius"),
6803
+ /** 아이콘 프레임 ↔ 라벨 간격 */
6804
+ iconLabelGap: item("iconLabelGap"),
6805
+ /** 좌측 여백 */
6806
+ paddingLeft: action("paddingLeft"),
6807
+ /** 우측 여백 */
6808
+ paddingRight: action("paddingRight"),
6809
+ /** 액션 텍스트 ↔ 액션 아이콘 간격 */
6810
+ actionGap: action("selectData-gap")
6811
+ };
6812
+ function TokenIcon({ name, size }) {
6813
+ return /* @__PURE__ */ jsx(SIcon, { name, size: "100%", style: { width: size, height: size } });
6814
+ }
6815
+ var SSystemActionButton = /* @__PURE__ */ forwardRef(
6816
+ function SSystemActionButton2({ color = "light", type, label, option, disabled = false, className, style, ...rest }, ref) {
6817
+ const c = SYSTEM_ACTION_BUTTON_COLOR_CONFIG[color];
6818
+ const spec = SYSTEM_ACTION_BUTTON_TYPE_CONFIG[type];
6819
+ const hoverable = !disabled;
6820
+ const status = type === "status" ? option : void 0;
6821
+ const resolvedIcon = spec.fixedIcon ?? option?.icon;
6822
+ const actionText = spec.actionText ? option?.text : void 0;
6823
+ const cssVars = {
6824
+ "--sab-bg": c.bg,
6825
+ "--sab-bg-hover": hoverable ? c.bgHover : c.bg,
6826
+ "--sab-icon-bg": c.iconBg,
6827
+ "--sab-icon-bg-hover": hoverable ? c.iconBgHover : c.iconBg,
6828
+ "--sab-icon-glyph": c.iconGlyph,
6829
+ "--sab-icon-glyph-hover": hoverable ? c.iconGlyphHover : c.iconGlyph,
6830
+ "--sab-text": c.text,
6831
+ "--sab-action-text": spec.actionText ? c.actionText[spec.actionText.token] : void 0,
6832
+ "--sab-action-icon": c.actionIcon,
6833
+ "minHeight": SYSTEM_ACTION_BUTTON_LAYOUT.height,
6834
+ "borderRadius": SYSTEM_ACTION_BUTTON_LAYOUT.radius,
6835
+ "paddingLeft": SYSTEM_ACTION_BUTTON_LAYOUT.paddingLeft,
6836
+ "paddingRight": SYSTEM_ACTION_BUTTON_LAYOUT.paddingRight,
6837
+ "gap": SYSTEM_ACTION_BUTTON_LAYOUT.iconLabelGap,
6838
+ ...style
6839
+ };
6840
+ return /* @__PURE__ */ jsxs(
6841
+ "button",
6842
+ {
6843
+ ref,
6844
+ type: "button",
6845
+ disabled,
6846
+ className: cn(
6847
+ "group box-border flex w-full items-center border-none bg-(--sab-bg) text-left transition-colors",
6848
+ "hover:bg-(--sab-bg-hover)",
6849
+ disabled ? "cursor-not-allowed opacity-60" : "cursor-pointer",
6850
+ className
6851
+ ),
6852
+ style: cssVars,
6853
+ ...rest,
6854
+ children: [
6855
+ resolvedIcon && /* @__PURE__ */ jsx(
6856
+ "span",
6857
+ {
6858
+ 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)",
6859
+ style: { width: SYSTEM_ACTION_BUTTON_LAYOUT.iconFrame, height: SYSTEM_ACTION_BUTTON_LAYOUT.iconFrame, borderRadius: SYSTEM_ACTION_BUTTON_LAYOUT.iconRadius },
6860
+ children: /* @__PURE__ */ jsx(TokenIcon, { name: resolvedIcon, size: SYSTEM_ACTION_BUTTON_LAYOUT.iconGlyph })
6861
+ }
6862
+ ),
6863
+ /* @__PURE__ */ jsx("span", { className: "typo-body-sm-semibold flex min-w-0 flex-1 items-center text-(--sab-text)", children: status ? /* @__PURE__ */ jsx(STag, { color: status.color ?? "blue", icon: "dot", label: status.label }) : /* @__PURE__ */ jsx("span", { className: "truncate", children: label }) }),
6864
+ (actionText != null || spec.actionIcon) && /* @__PURE__ */ jsxs("span", { className: "inline-flex shrink-0 items-center", style: { gap: SYSTEM_ACTION_BUTTON_LAYOUT.actionGap }, children: [
6865
+ actionText != null && spec.actionText && /* @__PURE__ */ jsx(
6866
+ "span",
6867
+ {
6868
+ className: cn(spec.actionText.typo, "whitespace-nowrap text-(--sab-action-text)"),
6869
+ children: actionText
6870
+ }
6871
+ ),
6872
+ spec.actionIcon && /* @__PURE__ */ jsx("span", { className: "inline-flex shrink-0 items-center text-(--sab-action-icon)", children: /* @__PURE__ */ jsx(TokenIcon, { name: spec.actionIcon.name, size: spec.actionIcon.size }) })
6873
+ ] })
6874
+ ]
6875
+ }
6876
+ );
6877
+ }
6878
+ );
6711
6879
  var SIZE_CLASSES = {
6712
6880
  xs: "h-[24px] px-[8px] text-[12px] font-normal leading-[20px]",
6713
6881
  sm: "h-[28px] px-[12px] text-[14px] font-medium leading-[24px]"
@@ -8494,17 +8662,17 @@ var GNB_TOP_ICON_GAP = 8;
8494
8662
  var GNB_TOP_ICON_SIZE = 24;
8495
8663
  var GNB_FULL_LOGO_WIDTH_NO_LAUNCHER = GNB_FULL_LOGO_WIDTH + GNB_TOP_ICON_SIZE + GNB_TOP_ICON_GAP;
8496
8664
  function findGnbRailValue(items, value) {
8497
- if (items.some((item) => item.value === value)) return value;
8665
+ if (items.some((item2) => item2.value === value)) return value;
8498
8666
  return findGnbAncestors(items, value)[0];
8499
8667
  }
8500
8668
  function findGnbSiblingValues(items, value) {
8501
8669
  const walk = (list) => {
8502
- if (list.some((item) => item.value === value)) {
8503
- return list.filter((item) => item.value !== value).map((item) => item.value);
8670
+ if (list.some((item2) => item2.value === value)) {
8671
+ return list.filter((item2) => item2.value !== value).map((item2) => item2.value);
8504
8672
  }
8505
- for (const item of list) {
8506
- if (item.children) {
8507
- const found = walk(item.children);
8673
+ for (const item2 of list) {
8674
+ if (item2.children) {
8675
+ const found = walk(item2.children);
8508
8676
  if (found) return found;
8509
8677
  }
8510
8678
  }
@@ -8514,10 +8682,10 @@ function findGnbSiblingValues(items, value) {
8514
8682
  }
8515
8683
  function findGnbAncestors(items, value) {
8516
8684
  const walk = (list, trail) => {
8517
- for (const item of list) {
8518
- if (item.value === value) return trail;
8519
- if (item.children) {
8520
- const found = walk(item.children, [...trail, item.value]);
8685
+ for (const item2 of list) {
8686
+ if (item2.value === value) return trail;
8687
+ if (item2.children) {
8688
+ const found = walk(item2.children, [...trail, item2.value]);
8521
8689
  if (found) return found;
8522
8690
  }
8523
8691
  }
@@ -8527,20 +8695,20 @@ function findGnbAncestors(items, value) {
8527
8695
  }
8528
8696
  function findGnbDescendantBranchValues(items, value) {
8529
8697
  const find = (list) => {
8530
- for (const item of list) {
8531
- if (item.value === value) return item;
8532
- if (item.children) {
8533
- const found = find(item.children);
8698
+ for (const item2 of list) {
8699
+ if (item2.value === value) return item2;
8700
+ if (item2.children) {
8701
+ const found = find(item2.children);
8534
8702
  if (found) return found;
8535
8703
  }
8536
8704
  }
8537
8705
  return void 0;
8538
8706
  };
8539
8707
  const collect = (list, acc) => {
8540
- for (const item of list) {
8541
- if (item.children && item.children.length > 0) {
8542
- acc.push(item.value);
8543
- collect(item.children, acc);
8708
+ for (const item2 of list) {
8709
+ if (item2.children && item2.children.length > 0) {
8710
+ acc.push(item2.value);
8711
+ collect(item2.children, acc);
8544
8712
  }
8545
8713
  }
8546
8714
  return acc;
@@ -8583,7 +8751,7 @@ var SGnb = /* @__PURE__ */ forwardRef(function SGnb2({
8583
8751
  const type = typeProp ?? layout?.type ?? "box";
8584
8752
  const folded = foldedProp ?? layout?.folded ?? false;
8585
8753
  const useRail = useRailProp ?? layout?.useRail ?? false;
8586
- const railHasLeaf = useRail && items.some((item) => !item.children || item.children.length === 0);
8754
+ const railHasLeaf = useRail && items.some((item2) => !item2.children || item2.children.length === 0);
8587
8755
  const header = railHasLeaf ? "full" : headerProp ?? layout?.header ?? "fix";
8588
8756
  const H = GNB_HEADER[header];
8589
8757
  const M = GNB_MENU[type];
@@ -8626,13 +8794,13 @@ var SGnb = /* @__PURE__ */ forwardRef(function SGnb2({
8626
8794
  labelTipHideRef.current = setTimeout(() => setLabelTip(null), LABEL_TIP_HIDE_DELAY_MS);
8627
8795
  };
8628
8796
  useEffect(() => cancelLabelTipHide, []);
8629
- const rowHoverProps = (item) => ({
8797
+ const rowHoverProps = (item2) => ({
8630
8798
  onMouseEnter: (event) => {
8631
- setHoveredKey(item.value);
8632
- showLabelTipIfTruncated(event.currentTarget, item.label);
8799
+ setHoveredKey(item2.value);
8800
+ showLabelTipIfTruncated(event.currentTarget, item2.label);
8633
8801
  },
8634
8802
  onMouseLeave: () => {
8635
- setHoveredKey((prev) => prev === item.value ? null : prev);
8803
+ setHoveredKey((prev) => prev === item2.value ? null : prev);
8636
8804
  startLabelTipHide();
8637
8805
  }
8638
8806
  });
@@ -8658,7 +8826,7 @@ var SGnb = /* @__PURE__ */ forwardRef(function SGnb2({
8658
8826
  }, [items, value]);
8659
8827
  useEffect(() => {
8660
8828
  setActiveRail(
8661
- (prev) => prev !== void 0 && items.some((item) => item.value === prev) ? prev : items[0]?.value
8829
+ (prev) => prev !== void 0 && items.some((item2) => item2.value === prev) ? prev : items[0]?.value
8662
8830
  );
8663
8831
  }, [items]);
8664
8832
  const toggleExpand = (key) => {
@@ -8675,33 +8843,33 @@ var SGnb = /* @__PURE__ */ forwardRef(function SGnb2({
8675
8843
  return next;
8676
8844
  });
8677
8845
  };
8678
- const handleItemClick = (item) => {
8679
- if (item.disabled) return;
8680
- if (item.children && item.children.length > 0) {
8681
- toggleExpand(item.value);
8846
+ const handleItemClick = (item2) => {
8847
+ if (item2.disabled) return;
8848
+ if (item2.children && item2.children.length > 0) {
8849
+ toggleExpand(item2.value);
8682
8850
  return;
8683
8851
  }
8684
- onValueChange?.(item.value);
8852
+ onValueChange?.(item2.value);
8685
8853
  };
8686
- const handleRailClick = (item) => {
8687
- if (item.disabled) return;
8688
- setActiveRail(item.value);
8689
- onRailChange?.(item.value);
8690
- if (!item.children || item.children.length === 0) onValueChange?.(item.value);
8854
+ const handleRailClick = (item2) => {
8855
+ if (item2.disabled) return;
8856
+ setActiveRail(item2.value);
8857
+ onRailChange?.(item2.value);
8858
+ if (!item2.children || item2.children.length === 0) onValueChange?.(item2.value);
8691
8859
  };
8692
8860
  const handleFoldToggle = () => {
8693
8861
  const next = !folded;
8694
8862
  onFoldChange?.(next);
8695
8863
  if (foldedProp === void 0) layout?.setFolded(next);
8696
8864
  };
8697
- const renderRailItem = (item) => {
8698
- const isActive = item.value === activeRail;
8699
- const isHovered = hoveredKey === item.value && !item.disabled;
8865
+ const renderRailItem = (item2) => {
8866
+ const isActive = item2.value === activeRail;
8867
+ const isHovered = hoveredKey === item2.value && !item2.disabled;
8700
8868
  return /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsxs(
8701
8869
  "button",
8702
8870
  {
8703
8871
  type: "button",
8704
- disabled: item.disabled,
8872
+ disabled: item2.disabled,
8705
8873
  "aria-current": isActive ? "true" : void 0,
8706
8874
  className: "box-border flex select-none flex-col items-center border-none bg-transparent transition-colors duration-150",
8707
8875
  style: {
@@ -8716,31 +8884,31 @@ var SGnb = /* @__PURE__ */ forwardRef(function SGnb2({
8716
8884
  fontSize: GNB_RAIL.itemFontSize,
8717
8885
  lineHeight: `${GNB_RAIL.itemLineHeight}px`,
8718
8886
  fontWeight: isActive ? GNB_RAIL.itemFontWeightSelected : GNB_RAIL.itemFontWeight,
8719
- opacity: item.disabled ? 0.4 : 1,
8720
- cursor: item.disabled ? "not-allowed" : "pointer"
8887
+ opacity: item2.disabled ? 0.4 : 1,
8888
+ cursor: item2.disabled ? "not-allowed" : "pointer"
8721
8889
  },
8722
- onClick: () => handleRailClick(item),
8723
- ...rowHoverProps(item),
8890
+ onClick: () => handleRailClick(item2),
8891
+ ...rowHoverProps(item2),
8724
8892
  children: [
8725
- item.icon && /* @__PURE__ */ jsx(SIcon, { name: item.icon, size: GNB_RAIL.itemIcon, className: "shrink-0" }),
8893
+ item2.icon && /* @__PURE__ */ jsx(SIcon, { name: item2.icon, size: GNB_RAIL.itemIcon, className: "shrink-0" }),
8726
8894
  /* @__PURE__ */ jsx(
8727
8895
  "span",
8728
8896
  {
8729
8897
  "data-gnb-label": true,
8730
8898
  className: "w-full overflow-hidden text-ellipsis whitespace-nowrap text-center",
8731
- children: item.label
8899
+ children: item2.label
8732
8900
  }
8733
8901
  )
8734
8902
  ]
8735
8903
  }
8736
- ) }, item.value);
8904
+ ) }, item2.value);
8737
8905
  };
8738
- const renderItem = (item, depth, branchHasIcon = false) => {
8739
- const hasChildren = !!(item.children && item.children.length > 0);
8740
- const isSelected = !hasChildren && item.value === value;
8741
- const isExpanded = expandedKeys.has(item.value);
8742
- const isHovered = hoveredKey === item.value && !item.disabled;
8743
- const iconBranch = depth === 1 ? !!item.icon : branchHasIcon;
8906
+ const renderItem = (item2, depth, branchHasIcon = false) => {
8907
+ const hasChildren = !!(item2.children && item2.children.length > 0);
8908
+ const isSelected = !hasChildren && item2.value === value;
8909
+ const isExpanded = expandedKeys.has(item2.value);
8910
+ const isHovered = hoveredKey === item2.value && !item2.disabled;
8911
+ const iconBranch = depth === 1 ? !!item2.icon : branchHasIcon;
8744
8912
  const itemStyle = {
8745
8913
  gap: M.itemGap,
8746
8914
  paddingTop: M.itemPaddingY,
@@ -8757,8 +8925,8 @@ var SGnb = /* @__PURE__ */ forwardRef(function SGnb2({
8757
8925
  fontSize: depth === 1 ? M.depth1FontSize : M.itemFontSize,
8758
8926
  lineHeight: `${depth === 1 ? M.depth1LineHeight : M.itemLineHeight}px`,
8759
8927
  fontWeight: depth === 1 ? M.depth1FontWeight : isSelected ? M.itemFontWeightSelected : M.itemFontWeight,
8760
- opacity: item.disabled ? 0.4 : 1,
8761
- cursor: item.disabled ? "not-allowed" : "pointer"
8928
+ opacity: item2.disabled ? 0.4 : 1,
8929
+ cursor: item2.disabled ? "not-allowed" : "pointer"
8762
8930
  };
8763
8931
  return (
8764
8932
  // li 를 flex-col 로 둬야 버튼이 좌우 마진만큼 안쪽으로 들어가고,
@@ -8768,18 +8936,18 @@ var SGnb = /* @__PURE__ */ forwardRef(function SGnb2({
8768
8936
  "button",
8769
8937
  {
8770
8938
  type: "button",
8771
- disabled: item.disabled,
8939
+ disabled: item2.disabled,
8772
8940
  "aria-expanded": hasChildren ? isExpanded : void 0,
8773
8941
  "aria-current": isSelected ? "page" : void 0,
8774
8942
  className: "box-border flex select-none items-center border-none bg-transparent text-left transition-colors duration-150",
8775
8943
  style: itemStyle,
8776
- onClick: () => handleItemClick(item),
8777
- ...rowHoverProps(item),
8944
+ onClick: () => handleItemClick(item2),
8945
+ ...rowHoverProps(item2),
8778
8946
  children: [
8779
- depth === 1 && item.icon && /* @__PURE__ */ jsx(
8947
+ depth === 1 && item2.icon && /* @__PURE__ */ jsx(
8780
8948
  SIcon,
8781
8949
  {
8782
- name: item.icon,
8950
+ name: item2.icon,
8783
8951
  size: M.depth1Icon,
8784
8952
  color: isSelected ? C.itemColorActive : C.itemIcon,
8785
8953
  className: "shrink-0"
@@ -8799,17 +8967,17 @@ var SGnb = /* @__PURE__ */ forwardRef(function SGnb2({
8799
8967
  {
8800
8968
  "data-gnb-label": true,
8801
8969
  className: "min-w-0 flex-1 overflow-hidden text-ellipsis whitespace-nowrap",
8802
- children: item.label
8970
+ children: item2.label
8803
8971
  }
8804
8972
  )
8805
8973
  ] }),
8806
- item.tag !== void 0 && item.tag !== "" && /* @__PURE__ */ jsx(
8974
+ item2.tag !== void 0 && item2.tag !== "" && /* @__PURE__ */ jsx(
8807
8975
  STag,
8808
8976
  {
8809
8977
  shape: "square",
8810
8978
  size: "xs",
8811
- color: item.tagColor ?? "blue",
8812
- label: item.tag,
8979
+ color: item2.tagColor ?? "blue",
8980
+ label: item2.tag,
8813
8981
  className: "shrink-0"
8814
8982
  }
8815
8983
  ),
@@ -8842,16 +9010,16 @@ var SGnb = /* @__PURE__ */ forwardRef(function SGnb2({
8842
9010
  visibility: isExpanded ? "visible" : "hidden",
8843
9011
  transition: `visibility 0s linear ${isExpanded ? "0s" : `${GNB_EXPAND_MS}ms`}`
8844
9012
  },
8845
- children: item.children.map((child) => renderItem(child, depth + 1, iconBranch))
9013
+ children: item2.children.map((child) => renderItem(child, depth + 1, iconBranch))
8846
9014
  }
8847
9015
  )
8848
9016
  }
8849
9017
  )
8850
- ] }, item.value)
9018
+ ] }, item2.value)
8851
9019
  );
8852
9020
  };
8853
9021
  const railItems = useRail ? items : [];
8854
- const menuItems = useRail ? items.find((item) => item.value === activeRail)?.children ?? [] : items;
9022
+ const menuItems = useRail ? items.find((item2) => item2.value === activeRail)?.children ?? [] : items;
8855
9023
  const showMenu = !useRail || menuItems.length > 0;
8856
9024
  const [uncontrolledMenuWidth, setUncontrolledMenuWidth] = useState(
8857
9025
  () => defaultMenuWidth ?? GNB_MENU_WIDTH
@@ -9158,7 +9326,7 @@ var SGnb = /* @__PURE__ */ forwardRef(function SGnb2({
9158
9326
  paddingTop: M.bodyPaddingY,
9159
9327
  paddingBottom: M.bodyPaddingY
9160
9328
  },
9161
- children: /* @__PURE__ */ jsx("ul", { className: "m-0 flex list-none flex-col p-0", children: menuItems.map((item) => renderItem(item, 1)) })
9329
+ children: /* @__PURE__ */ jsx("ul", { className: "m-0 flex list-none flex-col p-0", children: menuItems.map((item2) => renderItem(item2, 1)) })
9162
9330
  }
9163
9331
  ),
9164
9332
  menuFooter && /* @__PURE__ */ jsx("div", { className: "shrink-0", children: menuFooter })
@@ -9809,19 +9977,19 @@ var STEPPER_VERTICAL_COLORS = {
9809
9977
  errorBadge: "#FB4444"
9810
9978
  };
9811
9979
  var ERROR_TOOLTIP_MESSAGE = "\uD655\uC778\uC774 \uD544\uC694\uD55C \uD56D\uBAA9\uC774 \uC788\uC2B5\uB2C8\uB2E4.";
9812
- function getItemValue(item, index) {
9813
- return item.value ?? String(index + 1);
9980
+ function getItemValue(item2, index) {
9981
+ return item2.value ?? String(index + 1);
9814
9982
  }
9815
9983
  function groupAdjacentItems(items) {
9816
9984
  return items.reduce(
9817
- (groups, item, index) => {
9818
- const currentGroup = item.group;
9985
+ (groups, item2, index) => {
9986
+ const currentGroup = item2.group;
9819
9987
  const previous = groups[groups.length - 1];
9820
9988
  if (currentGroup && previous?.group === currentGroup) {
9821
- previous.items.push(item);
9989
+ previous.items.push(item2);
9822
9990
  return groups;
9823
9991
  }
9824
- groups.push({ group: currentGroup, startIndex: index, items: [item] });
9992
+ groups.push({ group: currentGroup, startIndex: index, items: [item2] });
9825
9993
  return groups;
9826
9994
  },
9827
9995
  []
@@ -9851,15 +10019,15 @@ var SStepper = /* @__PURE__ */ forwardRef(function SStepper2({
9851
10019
  const verticalItemRefs = useRef([]);
9852
10020
  const activeIndex = Math.max(
9853
10021
  0,
9854
- items.findIndex((item, index) => getItemValue(item, index) === value)
10022
+ items.findIndex((item2, index) => getItemValue(item2, index) === value)
9855
10023
  );
9856
10024
  const lastCompletedIndex = items.reduce(
9857
- (lastIndex, item, index) => item.completed === true ? index : lastIndex,
10025
+ (lastIndex, item2, index) => item2.completed === true ? index : lastIndex,
9858
10026
  -1
9859
10027
  );
9860
10028
  const resolvedClickableIndex = lastCompletedIndex + 1;
9861
10029
  const [visitedMaxIndex, setVisitedMaxIndex] = useState(activeIndex);
9862
- const firstErrorIndex = items.findIndex((item) => item.error === true);
10030
+ const firstErrorIndex = items.findIndex((item2) => item2.error === true);
9863
10031
  useImperativeHandle(
9864
10032
  ref,
9865
10033
  () => ({
@@ -9887,18 +10055,18 @@ var SStepper = /* @__PURE__ */ forwardRef(function SStepper2({
9887
10055
  transform: `translateY(${activeItem.offsetTop}px)`
9888
10056
  });
9889
10057
  }, [activeIndex, vertical, items]);
9890
- const getState = (item, index) => {
10058
+ const getState = (item2, index) => {
9891
10059
  if (index === activeIndex) return "active";
9892
- if (item.completed != null) return item.completed ? "completed" : "default";
10060
+ if (item2.completed != null) return item2.completed ? "completed" : "default";
9893
10061
  return "default";
9894
10062
  };
9895
- const emitValueChange = (item, index) => {
9896
- onValueChange?.(getItemValue(item, index), item, index);
10063
+ const emitValueChange = (item2, index) => {
10064
+ onValueChange?.(getItemValue(item2, index), item2, index);
9897
10065
  };
9898
10066
  const isWithinClickableIndex = (index) => index <= resolvedClickableIndex;
9899
- const renderStepContent = (item, index, options = {}) => {
10067
+ const renderStepContent = (item2, index, options = {}) => {
9900
10068
  const { isVertical = false, roleListItem = true, hovered = false } = options;
9901
- const state2 = getState(item, index);
10069
+ const state2 = getState(item2, index);
9902
10070
  const isHorizontalCompleted = !isVertical && state2 === "completed";
9903
10071
  const isVerticalCompleted = isVertical && state2 === "completed";
9904
10072
  const isVerticalLastActive = isVertical && state2 === "default" && index === visitedMaxIndex;
@@ -9973,12 +10141,12 @@ var SStepper = /* @__PURE__ */ forwardRef(function SStepper2({
9973
10141
  children: showsCheckIcon ? /* @__PURE__ */ jsx(SIcon, { name: "check", size: STEPPER_LAYOUT.sequenceIcon, color: "currentColor" }) : index + 1
9974
10142
  }
9975
10143
  ),
9976
- /* @__PURE__ */ jsx("span", { children: item.label })
10144
+ /* @__PURE__ */ jsx("span", { children: item2.label })
9977
10145
  ]
9978
10146
  }
9979
10147
  );
9980
10148
  };
9981
- const renderClickableStepContent = (item, index, isVertical = false) => {
10149
+ const renderClickableStepContent = (item2, index, isVertical = false) => {
9982
10150
  const isDisabled = !isWithinClickableIndex(index);
9983
10151
  return /* @__PURE__ */ jsx(
9984
10152
  "button",
@@ -9991,9 +10159,9 @@ var SStepper = /* @__PURE__ */ forwardRef(function SStepper2({
9991
10159
  ),
9992
10160
  style: { font: "inherit", color: "inherit" },
9993
10161
  onClick: () => {
9994
- if (!isDisabled) emitValueChange(item, index);
10162
+ if (!isDisabled) emitValueChange(item2, index);
9995
10163
  },
9996
- children: renderStepContent(item, index, { isVertical, roleListItem: false })
10164
+ children: renderStepContent(item2, index, { isVertical, roleListItem: false })
9997
10165
  }
9998
10166
  );
9999
10167
  };
@@ -10052,10 +10220,10 @@ var SStepper = /* @__PURE__ */ forwardRef(function SStepper2({
10052
10220
  children: /* @__PURE__ */ jsx("span", { className: "whitespace-nowrap", children: group.group })
10053
10221
  }
10054
10222
  ),
10055
- group.items.map((item, itemIndex) => {
10223
+ group.items.map((item2, itemIndex) => {
10056
10224
  const index = group.startIndex + itemIndex;
10057
- const state2 = getState(item, index);
10058
- const itemValue = getItemValue(item, index);
10225
+ const state2 = getState(item2, index);
10226
+ const itemValue = getItemValue(item2, index);
10059
10227
  const canClickItem = isClickable && isWithinClickableIndex(index);
10060
10228
  const isDisabled = !canClickItem;
10061
10229
  const isHovered = hoveredIndex === index && canClickItem && state2 !== "active";
@@ -10073,12 +10241,12 @@ var SStepper = /* @__PURE__ */ forwardRef(function SStepper2({
10073
10241
  const handleMouseLeave = () => {
10074
10242
  setHoveredIndex((current) => current === index ? null : current);
10075
10243
  };
10076
- const stepContent = renderStepContent(item, index, {
10244
+ const stepContent = renderStepContent(item2, index, {
10077
10245
  isVertical: true,
10078
10246
  roleListItem: false,
10079
10247
  hovered: isHovered
10080
10248
  });
10081
- const errorBadge = item.error ? /* @__PURE__ */ jsx(
10249
+ const errorBadge = item2.error ? /* @__PURE__ */ jsx(
10082
10250
  "span",
10083
10251
  {
10084
10252
  "aria-hidden": "true",
@@ -10093,7 +10261,7 @@ var SStepper = /* @__PURE__ */ forwardRef(function SStepper2({
10093
10261
  ) : null;
10094
10262
  const isTooltipHovered = tooltipHoverValue === itemValue;
10095
10263
  const isCustomTooltipOpen = customTooltipOpen && index === firstErrorIndex;
10096
- const showTooltip = item.error === true && (isTooltipHovered || isCustomTooltipOpen);
10264
+ const showTooltip = item2.error === true && (isTooltipHovered || isCustomTooltipOpen);
10097
10265
  const handleTooltipMouseEnter = () => setTooltipHoverValue(itemValue);
10098
10266
  const handleTooltipMouseLeave = () => {
10099
10267
  setTooltipHoverValue((current) => current === itemValue ? null : current);
@@ -10117,7 +10285,7 @@ var SStepper = /* @__PURE__ */ forwardRef(function SStepper2({
10117
10285
  onMouseEnter: handleTooltipMouseEnter,
10118
10286
  onMouseLeave: handleTooltipMouseLeave,
10119
10287
  onClick: isClickable ? () => {
10120
- if (!isDisabled) emitValueChange(item, index);
10288
+ if (!isDisabled) emitValueChange(item2, index);
10121
10289
  } : void 0,
10122
10290
  children: [
10123
10291
  stepContent,
@@ -10149,13 +10317,13 @@ var SStepper = /* @__PURE__ */ forwardRef(function SStepper2({
10149
10317
  {
10150
10318
  type: "button",
10151
10319
  disabled: isDisabled,
10152
- "aria-label": item.label,
10320
+ "aria-label": item2.label,
10153
10321
  className: cn(
10154
10322
  "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)",
10155
10323
  isDisabled ? "cursor-default" : "cursor-pointer"
10156
10324
  ),
10157
10325
  onClick: () => {
10158
- if (!isDisabled) emitValueChange(item, index);
10326
+ if (!isDisabled) emitValueChange(item2, index);
10159
10327
  }
10160
10328
  }
10161
10329
  ),
@@ -10206,9 +10374,9 @@ var SStepper = /* @__PURE__ */ forwardRef(function SStepper2({
10206
10374
  lineHeight: config.lineHeight,
10207
10375
  ...style
10208
10376
  },
10209
- children: items.map((item, index) => {
10210
- const state2 = getState(item, index);
10211
- const content = isClickable ? /* @__PURE__ */ jsx("span", { role: "listitem", "aria-current": state2 === "active" ? "step" : void 0, children: renderClickableStepContent(item, index) }) : renderStepContent(item, index);
10377
+ children: items.map((item2, index) => {
10378
+ const state2 = getState(item2, index);
10379
+ const content = isClickable ? /* @__PURE__ */ jsx("span", { role: "listitem", "aria-current": state2 === "active" ? "step" : void 0, children: renderClickableStepContent(item2, index) }) : renderStepContent(item2, index);
10212
10380
  return /* @__PURE__ */ jsxs(
10213
10381
  "span",
10214
10382
  {
@@ -10242,7 +10410,7 @@ var SStepper = /* @__PURE__ */ forwardRef(function SStepper2({
10242
10410
  )
10243
10411
  ]
10244
10412
  },
10245
- getItemValue(item, index)
10413
+ getItemValue(item2, index)
10246
10414
  );
10247
10415
  })
10248
10416
  }
@@ -10785,7 +10953,7 @@ var SSelectImpl = /* @__PURE__ */ forwardRef(function SSelect({
10785
10953
  const selectedAnchorIndex = useMemo(() => {
10786
10954
  if (selected.length === 0) return -1;
10787
10955
  const selectedSet = new Set(selected);
10788
- return navigableItems.findIndex((item) => item.value != null && selectedSet.has(item.value));
10956
+ return navigableItems.findIndex((item2) => item2.value != null && selectedSet.has(item2.value));
10789
10957
  }, [navigableItems, selected]);
10790
10958
  selectedAnchorRef.current = selectedAnchorIndex;
10791
10959
  const triggerText = (() => {
@@ -11078,7 +11246,7 @@ var SSelectImpl = /* @__PURE__ */ forwardRef(function SSelect({
11078
11246
  setFocusedIndex(-1);
11079
11247
  return;
11080
11248
  }
11081
- const index = navigableItems.findIndex((item) => item.key === key);
11249
+ const index = navigableItems.findIndex((item2) => item2.key === key);
11082
11250
  if (index >= 0) setFocusedIndex(index);
11083
11251
  }
11084
11252
  }
@@ -11310,6 +11478,7 @@ var colWidthFromDef = (c) => {
11310
11478
  };
11311
11479
  var STable = /* @__PURE__ */ forwardRef(function STable2({
11312
11480
  columns = [],
11481
+ headerGroups,
11313
11482
  rows = [],
11314
11483
  rowKey = "id",
11315
11484
  selectable = false,
@@ -11357,6 +11526,49 @@ var STable = /* @__PURE__ */ forwardRef(function STable2({
11357
11526
  onDenseChange?.(next);
11358
11527
  };
11359
11528
  const visibleCols = useMemo(() => columns.filter((c) => c.visible !== false), [columns]);
11529
+ const headerGroupInfo = useMemo(() => {
11530
+ if (!headerGroups || headerGroups.length === 0) return null;
11531
+ const indexByName = new Map(visibleCols.map((col, index) => [col.name, index]));
11532
+ const covered = /* @__PURE__ */ new Set();
11533
+ let previousLast = -1;
11534
+ const cells = headerGroups.map((group) => {
11535
+ if (group.columnNames.length === 0) {
11536
+ throw new Error("[STable] headerGroups\uC758 columnNames\uB294 \uBE44\uC5B4 \uC788\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.");
11537
+ }
11538
+ const indexes = group.columnNames.map((name) => {
11539
+ const index = indexByName.get(name);
11540
+ if (index == null) {
11541
+ throw new Error(`[STable] headerGroups\uC5D0 \uC874\uC7AC\uD558\uC9C0 \uC54A\uB294 \uCEEC\uB7FC\uC774 \uC9C0\uC815\uB418\uC5C8\uC2B5\uB2C8\uB2E4: ${name}`);
11542
+ }
11543
+ if (covered.has(name)) {
11544
+ throw new Error(`[STable] headerGroups\uC5D0\uC11C \uCEEC\uB7FC\uC774 \uC911\uBCF5 \uC9C0\uC815\uB418\uC5C8\uC2B5\uB2C8\uB2E4: ${name}`);
11545
+ }
11546
+ covered.add(name);
11547
+ return index;
11548
+ });
11549
+ const first = indexes[0];
11550
+ const last = indexes[indexes.length - 1];
11551
+ if (last - first + 1 !== indexes.length || indexes.some((index, i) => index !== first + i)) {
11552
+ throw new Error(
11553
+ "[STable] headerGroups\uC758 columnNames\uB294 \uC778\uC811\uD55C \uCEEC\uB7FC \uC21C\uC11C\uB85C \uC9C0\uC815\uD574\uC57C \uD569\uB2C8\uB2E4."
11554
+ );
11555
+ }
11556
+ if (first <= previousLast) {
11557
+ throw new Error("[STable] headerGroups\uB294 \uCEEC\uB7FC \uC21C\uC11C\uB300\uB85C \uC9C0\uC815\uD574\uC57C \uD569\uB2C8\uB2E4.");
11558
+ }
11559
+ previousLast = last;
11560
+ return { ...group, firstIndex: first, colSpan: indexes.length };
11561
+ });
11562
+ if (covered.size !== visibleCols.length) {
11563
+ throw new Error("[STable] headerGroups\uC758 columnNames\uAC00 \uBAA8\uB4E0 visible \uCEEC\uB7FC\uC744 \uD3EC\uD568\uD574\uC57C \uD569\uB2C8\uB2E4.");
11564
+ }
11565
+ return {
11566
+ cells,
11567
+ rowSpanNames: new Set(
11568
+ cells.filter((cell) => cell.rowSpan === 2).flatMap((cell) => cell.columnNames)
11569
+ )
11570
+ };
11571
+ }, [headerGroups, visibleCols]);
11360
11572
  const stickyLeft = stickyColumn?.left ?? 0;
11361
11573
  const stickyRight = stickyColumn?.right ?? 0;
11362
11574
  const effectiveRowHeight = rowHeight ?? (innerDense ? DENSE_ROW_HEIGHT : DEFAULT_ROW_HEIGHT);
@@ -11619,6 +11831,35 @@ var STable = /* @__PURE__ */ forwardRef(function STable2({
11619
11831
  isRightEdge && scrolledRight && "shadow-[-5px_0_8px_0_rgba(34,34,34,0.1)]"
11620
11832
  );
11621
11833
  };
11834
+ const headerResizeHitArea = (i, key) => {
11835
+ const col = visibleCols[i];
11836
+ if (!headerGroupInfo || !resizable || !col || col.autoWidth || i >= visibleCols.length - 1) {
11837
+ return null;
11838
+ }
11839
+ return /* @__PURE__ */ jsx(
11840
+ "span",
11841
+ {
11842
+ onMouseDown: (e) => startResize(i, e),
11843
+ className: "absolute inset-y-0 right-0 z-[5] w-[9px] cursor-col-resize",
11844
+ "aria-hidden": true
11845
+ },
11846
+ key
11847
+ );
11848
+ };
11849
+ const headerResizer = (i, key) => {
11850
+ const col = visibleCols[i];
11851
+ if (!resizable || !col || col.autoWidth || i >= visibleCols.length - 1) return null;
11852
+ return /* @__PURE__ */ jsx(
11853
+ "span",
11854
+ {
11855
+ onMouseDown: (e) => startResize(i, e),
11856
+ 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",
11857
+ "aria-hidden": true,
11858
+ children: /* @__PURE__ */ jsx("span", { className: "h-full w-[4px] border-x border-solid border-[color:var(--cmp-table-header-resizingBar-color)]" })
11859
+ },
11860
+ key
11861
+ );
11862
+ };
11622
11863
  const bodyScrollClass = cn(
11623
11864
  "min-h-0 flex-1 overflow-auto border-t border-solid border-[color:var(--cmp-table-border-color)]",
11624
11865
  SCROLLBAR_CLASS,
@@ -11683,145 +11924,179 @@ var STable = /* @__PURE__ */ forwardRef(function STable2({
11683
11924
  style: { fontSize: 12 },
11684
11925
  children: [
11685
11926
  colgroup,
11686
- /* @__PURE__ */ jsx("thead", { className: cn(isNoData && "opacity-40"), children: /* @__PURE__ */ jsxs("tr", { className: "h-[var(--cmp-table-header-height)] bg-[var(--cmp-table-header-bg)]", children: [
11687
- selectable && /* @__PURE__ */ jsxs(
11688
- "th",
11689
- {
11690
- className: cn(
11691
- // 원본 .th--selected: 48px 고정폭, 항상 left sticky, 체크박스 중앙정렬
11692
- // 하단 border는 헤더 래퍼가 연속으로 그리므로 셀에는 두지 않는다.
11693
- "sticky left-0 z-[7] bg-[var(--cmp-table-header-bg)] text-center align-middle",
11694
- stickyLeft === 0 && scrolledLeft && "shadow-[5px_0_8px_0_rgba(34,34,34,0.1)]"
11695
- ),
11696
- style: {
11697
- width: SELECTABLE_COLUMN_WIDTH,
11698
- minWidth: SELECTABLE_COLUMN_WIDTH,
11699
- maxWidth: SELECTABLE_COLUMN_WIDTH
11927
+ /* @__PURE__ */ jsxs("thead", { className: cn(isNoData && "opacity-40"), children: [
11928
+ headerGroupInfo && /* @__PURE__ */ jsxs("tr", { className: "h-[var(--cmp-table-header-height)] bg-[var(--cmp-table-header-bg)]", children: [
11929
+ selectable && /* @__PURE__ */ jsx(
11930
+ "th",
11931
+ {
11932
+ rowSpan: 2,
11933
+ className: cn(
11934
+ "sticky left-0 z-[7] bg-[var(--cmp-table-header-bg)] text-center align-middle",
11935
+ stickyLeft === 0 && scrolledLeft && "shadow-[5px_0_8px_0_rgba(34,34,34,0.1)]"
11936
+ ),
11937
+ style: {
11938
+ width: SELECTABLE_COLUMN_WIDTH,
11939
+ minWidth: SELECTABLE_COLUMN_WIDTH,
11940
+ maxWidth: SELECTABLE_COLUMN_WIDTH
11941
+ },
11942
+ children: /* @__PURE__ */ jsx("div", { className: "flex items-center justify-center", children: /* @__PURE__ */ jsx(SCheckbox, { value: headerCheck, onValueChange: toggleAll }) })
11943
+ }
11944
+ ),
11945
+ headerGroupInfo.cells.map((group) => /* @__PURE__ */ jsxs(
11946
+ "th",
11947
+ {
11948
+ colSpan: group.colSpan,
11949
+ rowSpan: group.rowSpan,
11950
+ className: cn(
11951
+ "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)]",
11952
+ group.firstIndex + group.colSpan === visibleCols.length && "border-r-0",
11953
+ group.rowSpan === 2 && "border-b-0",
11954
+ group.className
11955
+ ),
11956
+ style: { textAlign: group.align ?? "left", ...group.style },
11957
+ children: [
11958
+ group.render ? group.render() : group.label,
11959
+ group.rowSpan === 2 && group.colSpan === 1 ? headerResizeHitArea(
11960
+ group.firstIndex,
11961
+ `group-resizer-${group.columnNames[0]}`
11962
+ ) : null
11963
+ ]
11700
11964
  },
11701
- children: [
11702
- /* @__PURE__ */ jsx("div", { className: "flex items-center justify-center", children: /* @__PURE__ */ jsx(SCheckbox, { value: headerCheck, onValueChange: toggleAll }) }),
11703
- /* @__PURE__ */ jsx(
11704
- "span",
11705
- {
11706
- "aria-hidden": true,
11707
- 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)]"
11708
- }
11709
- )
11710
- ]
11711
- }
11712
- ),
11713
- visibleCols.map((col, i) => {
11714
- const isSortable = !!col.sortable && !col.renderHeader;
11715
- const sortDir = isSortable && sort?.name === col.name ? sort.dir : void 0;
11716
- return /* @__PURE__ */ jsxs(
11965
+ group.columnNames.join("|")
11966
+ ))
11967
+ ] }),
11968
+ /* @__PURE__ */ jsxs("tr", { className: "h-[var(--cmp-table-header-height)] bg-[var(--cmp-table-header-bg)]", children: [
11969
+ selectable && !headerGroupInfo && /* @__PURE__ */ jsxs(
11717
11970
  "th",
11718
11971
  {
11719
11972
  className: cn(
11720
- // 하단 border는 헤더 래퍼가 연속으로 그린다 (거터 영역까지 이어짐).
11721
- // leading-[0]: th 의 스트럿(line-height 만큼의 빈 인라인 박스)을 없앤다.
11722
- // 내용이 inline-flex 라 스트럿이 남아 있으면 라벨보다 큰 컨트롤(정렬 버튼 등)이
11723
- // 들어올 때 줄 상자가 베이스라인 기준으로 늘어나 헤더 높이를 넘기고
11724
- // 세로 가운데도 어긋난다. 글자 줄높이는 아래 th__content 가 다시 준다.
11725
- "relative bg-[var(--cmp-table-header-bg)] px-[16px] text-[12px] font-medium leading-[0] text-[color:var(--sys-color-fg-primary)]",
11726
- stickyInfo(i).isSticky && "z-[6]",
11727
- stickyShadowClass(i),
11728
- col.thClass
11973
+ // 원본 .th--selected: 48px 고정폭, 항상 left sticky, 체크박스 중앙정렬
11974
+ // 하단 border는 헤더 래퍼가 연속으로 그리므로 셀에는 두지 않는다.
11975
+ "sticky left-0 z-[7] bg-[var(--cmp-table-header-bg)] text-center align-middle",
11976
+ stickyLeft === 0 && scrolledLeft && "shadow-[5px_0_8px_0_rgba(34,34,34,0.1)]"
11729
11977
  ),
11730
- style: { textAlign: col.align ?? "left", ...cellStyle(i), ...col.thStyle },
11731
- "aria-sort": isSortable ? sortDir === "asc" ? "ascending" : sortDir === "desc" ? "descending" : "none" : void 0,
11978
+ style: {
11979
+ width: SELECTABLE_COLUMN_WIDTH,
11980
+ minWidth: SELECTABLE_COLUMN_WIDTH,
11981
+ maxWidth: SELECTABLE_COLUMN_WIDTH
11982
+ },
11732
11983
  children: [
11984
+ /* @__PURE__ */ jsx("div", { className: "flex items-center justify-center", children: /* @__PURE__ */ jsx(SCheckbox, { value: headerCheck, onValueChange: toggleAll }) }),
11733
11985
  /* @__PURE__ */ jsx(
11734
11986
  "span",
11735
11987
  {
11736
- className: cn(
11737
- // 원본 th__content: align에 따라 justify-content 적용 (th도 정렬 반영)
11738
- // th 가 leading-[0] 이므로 글자 줄높이는 여기서 준다 (truncate 가
11739
- // overflow-hidden 이라 줄높이가 0이면 라벨이 잘려 사라진다).
11740
- "inline-flex w-full min-w-0 items-center gap-[4px] leading-[20px]",
11741
- col.align === "center" && "justify-center",
11742
- col.align === "right" && "justify-end"
11743
- ),
11744
- children: col.renderHeader ? col.renderHeader(col, i) : /* @__PURE__ */ jsxs(Fragment, { children: [
11745
- /* @__PURE__ */ jsx("span", { className: "truncate", children: col.label }),
11746
- col.helpText && col.helpText.length > 0 && // 라벨이 좁아져 truncate 되더라도 아이콘까지 함께 줄어들면 안 되므로
11747
- // shrink-0 래퍼로 감싼다 (STooltip 의 className 은 본문 쪽으로 간다).
11748
- // 아이콘·크기·색은 SKeyValueTable 헤더 도움말과 동일하게 맞춘다.
11749
- /* @__PURE__ */ jsx("span", { className: "inline-flex shrink-0", children: /* @__PURE__ */ jsx(
11750
- STooltip2,
11751
- {
11752
- trigger: "hover",
11753
- icon: "helpOutline",
11754
- iconSize: 12,
11755
- color: "var(--sys-color-fg-success)",
11756
- placement: "top",
11757
- message: col.helpText
11758
- }
11759
- ) }),
11760
- col.editable && /* @__PURE__ */ jsx(
11761
- SIcon,
11762
- {
11763
- name: "pageEdit",
11764
- size: 12,
11765
- color: "var(--sys-color-link-accent)",
11766
- label: "\uC218\uC815 \uAC00\uB2A5",
11767
- className: "shrink-0"
11768
- }
11769
- ),
11770
- col.navigable && /* @__PURE__ */ jsx(
11771
- SIcon,
11772
- {
11773
- name: "pageMove",
11774
- size: 12,
11775
- color: "var(--sys-color-link-accent)",
11776
- label: "\uB2E4\uB978 \uD654\uBA74\uC73C\uB85C \uC774\uB3D9",
11777
- className: "shrink-0"
11778
- }
11779
- ),
11780
- col.required && // 라벨이 truncate 돼도 필수 표시는 남아야 하므로 shrink-0.
11781
- // 아이콘·크기·색은 SKeyValueTable 헤더 필수 표시와 동일하게 맞춘다.
11782
- /* @__PURE__ */ jsx(
11783
- SIcon,
11784
- {
11785
- name: "asterisk",
11786
- size: 12,
11787
- color: "var(--sys-color-fg-accent)",
11788
- className: "shrink-0"
11789
- }
11790
- ),
11791
- isSortable && // 미정렬은 updown 을 default(회색)로 — 정렬할 수 있다는 것 자체가
11792
- // 헤더에 보여야 한다. 정렬 중이면 action 색으로 올려 활성임을 알린다.
11793
- // 라벨이 truncate 돼도 버튼은 남도록 shrink-0.
11794
- /* @__PURE__ */ jsx("span", { className: "inline-flex shrink-0", children: /* @__PURE__ */ jsx(
11795
- SGhostButton,
11796
- {
11797
- size: "xxs",
11798
- intent: sortDir ? "action" : "default",
11799
- icon: sortDir === "asc" ? "arrowUp" : sortDir === "desc" ? "arrowDown" : "updown",
11800
- ariaLabel: `${col.label} \uC815\uB82C`,
11801
- onClick: () => toggleSort(col)
11802
- }
11803
- ) })
11804
- ] })
11805
- }
11806
- ),
11807
- resizable && !col.autoWidth && i < visibleCols.length - 1 && // 원본 th__resizer: 셀 우측 경계 안쪽 4px 그립(좌우 1px #CCCCCC 라인, 세로 16px).
11808
- // 셀 밖으로 넘치면 다음 셀에 가려져 클릭이 안 먹으므로 translate 없이 셀 내부에 배치.
11809
- // 겉보기 그립은 4px(원본과 동일), 클릭 영역은 9px로 넓혀 사용성 확보.
11810
- /* @__PURE__ */ jsx(
11811
- "span",
11812
- {
11813
- onMouseDown: (e) => startResize(i, e),
11814
- 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",
11815
11988
  "aria-hidden": true,
11816
- children: /* @__PURE__ */ jsx("span", { className: "h-full w-[4px] border-x border-solid border-[color:var(--cmp-table-header-resizingBar-color)]" })
11989
+ 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)]"
11817
11990
  }
11818
11991
  )
11819
11992
  ]
11820
- },
11821
- col.name
11822
- );
11823
- })
11824
- ] }) })
11993
+ }
11994
+ ),
11995
+ visibleCols.map((col, i) => {
11996
+ if (headerGroupInfo?.rowSpanNames.has(col.name)) return null;
11997
+ const isSortable = !!col.sortable && !col.renderHeader;
11998
+ const sortDir = isSortable && sort?.name === col.name ? sort.dir : void 0;
11999
+ return /* @__PURE__ */ jsxs(
12000
+ "th",
12001
+ {
12002
+ className: cn(
12003
+ // 하단 border는 헤더 래퍼가 연속으로 그린다 (거터 영역까지 이어짐).
12004
+ // leading-[0]: th 의 스트럿(line-height 만큼의 빈 인라인 박스)을 없앤다.
12005
+ // 내용이 inline-flex 라 스트럿이 남아 있으면 라벨보다 큰 컨트롤(정렬 버튼 등)이
12006
+ // 들어올 때 줄 상자가 베이스라인 기준으로 늘어나 헤더 높이를 넘기고
12007
+ // 세로 가운데도 어긋난다. 글자 줄높이는 아래 th__content 가 다시 준다.
12008
+ headerGroupInfo && "border-r border-solid border-[color:var(--cmp-table-border-color)]",
12009
+ headerGroupInfo && i === visibleCols.length - 1 && "border-r-0",
12010
+ "relative bg-[var(--cmp-table-header-bg)] px-[16px] text-[12px] font-medium leading-[0] text-[color:var(--sys-color-fg-primary)]",
12011
+ stickyInfo(i).isSticky && "z-[6]",
12012
+ stickyShadowClass(i),
12013
+ col.thClass
12014
+ ),
12015
+ style: { textAlign: col.align ?? "left", ...cellStyle(i), ...col.thStyle },
12016
+ "aria-sort": isSortable ? sortDir === "asc" ? "ascending" : sortDir === "desc" ? "descending" : "none" : void 0,
12017
+ children: [
12018
+ /* @__PURE__ */ jsx(
12019
+ "span",
12020
+ {
12021
+ className: cn(
12022
+ // 원본 th__content: align에 따라 justify-content 적용 (th도 정렬 반영)
12023
+ // th 가 leading-[0] 이므로 글자 줄높이는 여기서 준다 (truncate 가
12024
+ // overflow-hidden 이라 줄높이가 0이면 라벨이 잘려 사라진다).
12025
+ "inline-flex w-full min-w-0 items-center gap-[4px] leading-[20px]",
12026
+ col.align === "center" && "justify-center",
12027
+ col.align === "right" && "justify-end"
12028
+ ),
12029
+ children: col.renderHeader ? col.renderHeader(col, i) : /* @__PURE__ */ jsxs(Fragment, { children: [
12030
+ /* @__PURE__ */ jsx("span", { className: "truncate", children: col.label }),
12031
+ col.helpText && col.helpText.length > 0 && // 라벨이 좁아져 truncate 되더라도 아이콘까지 함께 줄어들면 안 되므로
12032
+ // shrink-0 래퍼로 감싼다 (STooltip 의 className 은 본문 쪽으로 간다).
12033
+ // 아이콘·크기·색은 SKeyValueTable 헤더 도움말과 동일하게 맞춘다.
12034
+ /* @__PURE__ */ jsx("span", { className: "inline-flex shrink-0", children: /* @__PURE__ */ jsx(
12035
+ STooltip2,
12036
+ {
12037
+ trigger: "hover",
12038
+ icon: "helpOutline",
12039
+ iconSize: 12,
12040
+ color: "var(--sys-color-fg-success)",
12041
+ placement: "top",
12042
+ message: col.helpText
12043
+ }
12044
+ ) }),
12045
+ col.editable && /* @__PURE__ */ jsx(
12046
+ SIcon,
12047
+ {
12048
+ name: "pageEdit",
12049
+ size: 12,
12050
+ color: "var(--sys-color-link-accent)",
12051
+ label: "\uC218\uC815 \uAC00\uB2A5",
12052
+ className: "shrink-0"
12053
+ }
12054
+ ),
12055
+ col.navigable && /* @__PURE__ */ jsx(
12056
+ SIcon,
12057
+ {
12058
+ name: "pageMove",
12059
+ size: 12,
12060
+ color: "var(--sys-color-link-accent)",
12061
+ label: "\uB2E4\uB978 \uD654\uBA74\uC73C\uB85C \uC774\uB3D9",
12062
+ className: "shrink-0"
12063
+ }
12064
+ ),
12065
+ col.required && // 라벨이 truncate 돼도 필수 표시는 남아야 하므로 shrink-0.
12066
+ // 아이콘·크기·색은 SKeyValueTable 헤더 필수 표시와 동일하게 맞춘다.
12067
+ /* @__PURE__ */ jsx(
12068
+ SIcon,
12069
+ {
12070
+ name: "asterisk",
12071
+ size: 12,
12072
+ color: "var(--sys-color-fg-accent)",
12073
+ className: "shrink-0"
12074
+ }
12075
+ ),
12076
+ isSortable && // 미정렬은 updown 을 default(회색)로 — 정렬할 수 있다는 것 자체가
12077
+ // 헤더에 보여야 한다. 정렬 중이면 action 색으로 올려 활성임을 알린다.
12078
+ // 라벨이 truncate 돼도 버튼은 남도록 shrink-0.
12079
+ /* @__PURE__ */ jsx("span", { className: "inline-flex shrink-0", children: /* @__PURE__ */ jsx(
12080
+ SGhostButton,
12081
+ {
12082
+ size: "xxs",
12083
+ intent: sortDir ? "action" : "default",
12084
+ icon: sortDir === "asc" ? "arrowUp" : sortDir === "desc" ? "arrowDown" : "updown",
12085
+ ariaLabel: `${col.label} \uC815\uB82C`,
12086
+ onClick: () => toggleSort(col)
12087
+ }
12088
+ ) })
12089
+ ] })
12090
+ }
12091
+ ),
12092
+ headerGroupInfo ? headerResizeHitArea(i, `resizer-${col.name}`) : headerResizer(i, `resizer-${col.name}`)
12093
+ ]
12094
+ },
12095
+ col.name
12096
+ );
12097
+ })
12098
+ ] })
12099
+ ] })
11825
12100
  ]
11826
12101
  }
11827
12102
  )
@@ -11943,11 +12218,12 @@ var STable = /* @__PURE__ */ forwardRef(function STable2({
11943
12218
  ]
11944
12219
  }
11945
12220
  ),
11946
- (showPagination || dense) && // 원본 sd-table__pagination: 테이블 하단에 이어붙는 회색 바(높이 48px, margin-top:-1px로 테두리 겹침).
12221
+ (showPagination || useRowsPerPageSelect) && // 원본 sd-table__pagination: 테이블 하단에 이어붙는 회색 바(높이 48px, margin-top:-1px로 테두리 겹침).
11947
12222
  // SPagination은 전체 폭 기준 중앙, rows-per-page SSelect는 우측에 absolute 배치해 중앙 정렬을 유지한다.
11948
12223
  // 루트 높이가 확정된 경우(테이블이 남은 영역을 채우는 배치) 페이지네이션 바가
11949
12224
  // 눌리지 않도록 shrink-0으로 48px를 보장한다.
11950
- // 페이지네이션이 없어도 dense 면 이 바를 그린다 — 밀도 토글이 사는 곳이 여기다.
12225
+ // 페이지네이션이 없어도 rows-per-page 셀렉트가 있으면 이 바를 그린다 — 셀렉트와
12226
+ // 밀도 토글이 사는 곳이 여기다. dense 만으로는 그리지 않는다(빈 바가 남는다).
11951
12227
  /* @__PURE__ */ jsxs(
11952
12228
  "div",
11953
12229
  {
@@ -11958,7 +12234,7 @@ var STable = /* @__PURE__ */ forwardRef(function STable2({
11958
12234
  ),
11959
12235
  children: [
11960
12236
  showPagination && /* @__PURE__ */ jsx(SPagination, { currentPage: displayPage, lastPage, onPageChange: changePage }),
11961
- (dense || useRowsPerPageSelect) && /* @__PURE__ */ jsxs("div", { className: "absolute right-[10px] top-1/2 flex -translate-y-1/2 items-center gap-[12px]", children: [
12237
+ useRowsPerPageSelect && /* @__PURE__ */ jsxs("div", { className: "absolute right-[10px] top-1/2 flex -translate-y-1/2 items-center gap-[12px]", children: [
11962
12238
  dense && /* @__PURE__ */ jsx(
11963
12239
  STextLink,
11964
12240
  {
@@ -11970,8 +12246,8 @@ var STable = /* @__PURE__ */ forwardRef(function STable2({
11970
12246
  onClick: () => changeDense(!innerDense)
11971
12247
  }
11972
12248
  ),
11973
- dense && useRowsPerPageSelect && /* @__PURE__ */ jsx(SDivider, { vertical: true, className: "my-[6px]" }),
11974
- useRowsPerPageSelect && /* @__PURE__ */ jsx(
12249
+ dense && /* @__PURE__ */ jsx(SDivider, { vertical: true, className: "my-[6px]" }),
12250
+ /* @__PURE__ */ jsx(
11975
12251
  SSelect2,
11976
12252
  {
11977
12253
  options: rowsPerPageOption,
@@ -13048,7 +13324,7 @@ function SCalendar({
13048
13324
  }) }),
13049
13325
  legend.length > 0 && /* @__PURE__ */ jsxs(Fragment, { children: [
13050
13326
  /* @__PURE__ */ jsx(SDivider, {}),
13051
- /* @__PURE__ */ 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__ */ jsxs(
13327
+ /* @__PURE__ */ 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__ */ jsxs(
13052
13328
  "span",
13053
13329
  {
13054
13330
  className: "inline-flex items-center gap-[var(--cmp-datepicker-calendar-legend-gap)]",
@@ -13057,14 +13333,14 @@ function SCalendar({
13057
13333
  "span",
13058
13334
  {
13059
13335
  className: "h-[var(--cmp-datepicker-calendar-day-dot-size)] w-[var(--cmp-datepicker-calendar-day-dot-size)] rounded-full",
13060
- style: { backgroundColor: resolveColor(item.color) },
13336
+ style: { backgroundColor: resolveColor(item2.color) },
13061
13337
  "aria-hidden": true
13062
13338
  }
13063
13339
  ),
13064
- /* @__PURE__ */ jsx("span", { children: item.label })
13340
+ /* @__PURE__ */ jsx("span", { children: item2.label })
13065
13341
  ]
13066
13342
  },
13067
- `${item.color}|${item.label}`
13343
+ `${item2.color}|${item2.label}`
13068
13344
  )) })
13069
13345
  ] })
13070
13346
  ]
@@ -16031,19 +16307,19 @@ function EditorToolbarBar({
16031
16307
  closeLinkEditor();
16032
16308
  };
16033
16309
  const visible = [];
16034
- for (const item of items) {
16035
- if (item === "image" && !onImageUpload) continue;
16036
- if (item === "|" && (visible.length === 0 || visible[visible.length - 1] === "|")) continue;
16037
- visible.push(item);
16310
+ for (const item2 of items) {
16311
+ if (item2 === "image" && !onImageUpload) continue;
16312
+ if (item2 === "|" && (visible.length === 0 || visible[visible.length - 1] === "|")) continue;
16313
+ visible.push(item2);
16038
16314
  }
16039
16315
  while (visible.length > 0 && visible[visible.length - 1] === "|") visible.pop();
16040
16316
  const groups = [[]];
16041
- for (const item of visible) {
16042
- if (item === "|") groups.push([]);
16043
- else groups[groups.length - 1].push(item);
16317
+ for (const item2 of visible) {
16318
+ if (item2 === "|") groups.push([]);
16319
+ else groups[groups.length - 1].push(item2);
16044
16320
  }
16045
- const node = (item) => {
16046
- switch (item) {
16321
+ const node = (item2) => {
16322
+ switch (item2) {
16047
16323
  case "heading":
16048
16324
  return /* @__PURE__ */ jsxs(RDropdown2.Root, { modal: !insideModal, children: [
16049
16325
  /* @__PURE__ */ jsx(RDropdown2.Trigger, { asChild: true, disabled: off, children: /* @__PURE__ */ jsxs(
@@ -16078,7 +16354,7 @@ function EditorToolbarBar({
16078
16354
  level
16079
16355
  ))
16080
16356
  ] }) })
16081
- ] }, item);
16357
+ ] }, item2);
16082
16358
  case "fontSize":
16083
16359
  return /* @__PURE__ */ jsxs(RDropdown2.Root, { modal: !insideModal, children: [
16084
16360
  /* @__PURE__ */ jsx(RDropdown2.Trigger, { asChild: true, disabled: off, children: /* @__PURE__ */ jsxs(ToolbarButton, { label: "\uAE00\uC790 \uD06C\uAE30", disabled: off, className: "px-[6px]", children: [
@@ -16117,7 +16393,7 @@ function EditorToolbarBar({
16117
16393
  ]
16118
16394
  }
16119
16395
  ) })
16120
- ] }, item);
16396
+ ] }, item2);
16121
16397
  case "bold":
16122
16398
  return /* @__PURE__ */ jsx(
16123
16399
  ToolbarButton,
@@ -16129,7 +16405,7 @@ function EditorToolbarBar({
16129
16405
  onClick: () => chain()?.toggleBold().run(),
16130
16406
  children: /* @__PURE__ */ jsx(IconBold, { size: ICON_SIZE })
16131
16407
  },
16132
- item
16408
+ item2
16133
16409
  );
16134
16410
  case "italic":
16135
16411
  return /* @__PURE__ */ jsx(
@@ -16142,7 +16418,7 @@ function EditorToolbarBar({
16142
16418
  onClick: () => chain()?.toggleItalic().run(),
16143
16419
  children: /* @__PURE__ */ jsx(IconItalic, { size: ICON_SIZE })
16144
16420
  },
16145
- item
16421
+ item2
16146
16422
  );
16147
16423
  case "underline":
16148
16424
  return /* @__PURE__ */ jsx(
@@ -16155,7 +16431,7 @@ function EditorToolbarBar({
16155
16431
  onClick: () => chain()?.toggleUnderline().run(),
16156
16432
  children: /* @__PURE__ */ jsx(IconUnderline, { size: ICON_SIZE })
16157
16433
  },
16158
- item
16434
+ item2
16159
16435
  );
16160
16436
  case "strike":
16161
16437
  return /* @__PURE__ */ jsx(
@@ -16168,7 +16444,7 @@ function EditorToolbarBar({
16168
16444
  onClick: () => chain()?.toggleStrike().run(),
16169
16445
  children: /* @__PURE__ */ jsx(IconStrike, { size: ICON_SIZE })
16170
16446
  },
16171
- item
16447
+ item2
16172
16448
  );
16173
16449
  case "code":
16174
16450
  return /* @__PURE__ */ jsx(
@@ -16181,7 +16457,7 @@ function EditorToolbarBar({
16181
16457
  onClick: () => chain()?.toggleCode().run(),
16182
16458
  children: /* @__PURE__ */ jsx(IconCode, { size: ICON_SIZE })
16183
16459
  },
16184
- item
16460
+ item2
16185
16461
  );
16186
16462
  case "color":
16187
16463
  if (mobile)
@@ -16193,7 +16469,7 @@ function EditorToolbarBar({
16193
16469
  onClick: () => setMobileView("color"),
16194
16470
  children: /* @__PURE__ */ jsx(ColorIndicator, { color: off ? "currentColor" : activeColor, children: /* @__PURE__ */ jsx(IconTextColor, { size: ICON_SIZE }) })
16195
16471
  },
16196
- item
16472
+ item2
16197
16473
  );
16198
16474
  return /* @__PURE__ */ jsxs(RDropdown2.Root, { modal: !insideModal, children: [
16199
16475
  /* @__PURE__ */ jsx(RDropdown2.Trigger, { asChild: true, disabled: off, children: /* @__PURE__ */ jsx(ToolbarButton, { label: "\uAE00\uC790\uC0C9", disabled: off, children: /* @__PURE__ */ jsx(ColorIndicator, { color: off ? "currentColor" : activeColor, children: /* @__PURE__ */ jsx(IconTextColor, { size: ICON_SIZE }) }) }) }),
@@ -16208,7 +16484,7 @@ function EditorToolbarBar({
16208
16484
  onClear: clearColor
16209
16485
  }
16210
16486
  ) }) })
16211
- ] }, item);
16487
+ ] }, item2);
16212
16488
  case "alignLeft":
16213
16489
  return /* @__PURE__ */ jsx(
16214
16490
  ToolbarButton,
@@ -16220,7 +16496,7 @@ function EditorToolbarBar({
16220
16496
  onClick: () => chain()?.setTextAlign("left").run(),
16221
16497
  children: /* @__PURE__ */ jsx(IconAlignLeft, { size: ICON_SIZE })
16222
16498
  },
16223
- item
16499
+ item2
16224
16500
  );
16225
16501
  case "alignCenter":
16226
16502
  return /* @__PURE__ */ jsx(
@@ -16233,7 +16509,7 @@ function EditorToolbarBar({
16233
16509
  onClick: () => chain()?.setTextAlign("center").run(),
16234
16510
  children: /* @__PURE__ */ jsx(IconAlignCenter, { size: ICON_SIZE })
16235
16511
  },
16236
- item
16512
+ item2
16237
16513
  );
16238
16514
  case "alignRight":
16239
16515
  return /* @__PURE__ */ jsx(
@@ -16246,7 +16522,7 @@ function EditorToolbarBar({
16246
16522
  onClick: () => chain()?.setTextAlign("right").run(),
16247
16523
  children: /* @__PURE__ */ jsx(IconAlignRight, { size: ICON_SIZE })
16248
16524
  },
16249
- item
16525
+ item2
16250
16526
  );
16251
16527
  case "alignJustify":
16252
16528
  return /* @__PURE__ */ jsx(
@@ -16259,7 +16535,7 @@ function EditorToolbarBar({
16259
16535
  onClick: () => chain()?.setTextAlign("justify").run(),
16260
16536
  children: /* @__PURE__ */ jsx(IconAlignJustify, { size: ICON_SIZE })
16261
16537
  },
16262
- item
16538
+ item2
16263
16539
  );
16264
16540
  case "bulletList":
16265
16541
  return /* @__PURE__ */ jsx(
@@ -16272,7 +16548,7 @@ function EditorToolbarBar({
16272
16548
  onClick: () => chain()?.toggleBulletList().run(),
16273
16549
  children: /* @__PURE__ */ jsx(IconBulletList, { size: ICON_SIZE })
16274
16550
  },
16275
- item
16551
+ item2
16276
16552
  );
16277
16553
  case "orderedList":
16278
16554
  return /* @__PURE__ */ jsx(
@@ -16285,7 +16561,7 @@ function EditorToolbarBar({
16285
16561
  onClick: () => chain()?.toggleOrderedList().run(),
16286
16562
  children: /* @__PURE__ */ jsx(IconOrderedList, { size: ICON_SIZE })
16287
16563
  },
16288
- item
16564
+ item2
16289
16565
  );
16290
16566
  case "taskList":
16291
16567
  return /* @__PURE__ */ jsx(
@@ -16298,7 +16574,7 @@ function EditorToolbarBar({
16298
16574
  onClick: () => chain()?.toggleTaskList().run(),
16299
16575
  children: /* @__PURE__ */ jsx(IconTaskList, { size: ICON_SIZE })
16300
16576
  },
16301
- item
16577
+ item2
16302
16578
  );
16303
16579
  case "list": {
16304
16580
  const ListIcon = state2.orderedList ? IconOrderedList : state2.taskList ? IconTaskList : IconBulletList;
@@ -16343,7 +16619,7 @@ function EditorToolbarBar({
16343
16619
  }
16344
16620
  )
16345
16621
  ] }) })
16346
- ] }, item);
16622
+ ] }, item2);
16347
16623
  }
16348
16624
  case "blockquote":
16349
16625
  return /* @__PURE__ */ jsx(
@@ -16356,7 +16632,7 @@ function EditorToolbarBar({
16356
16632
  onClick: () => chain()?.toggleBlockquote().run(),
16357
16633
  children: /* @__PURE__ */ jsx(IconBlockquote, { size: ICON_SIZE })
16358
16634
  },
16359
- item
16635
+ item2
16360
16636
  );
16361
16637
  case "codeBlock":
16362
16638
  return /* @__PURE__ */ jsx(
@@ -16369,7 +16645,7 @@ function EditorToolbarBar({
16369
16645
  onClick: () => chain()?.toggleCodeBlock().run(),
16370
16646
  children: /* @__PURE__ */ jsx(IconCodeBlock, { size: ICON_SIZE })
16371
16647
  },
16372
- item
16648
+ item2
16373
16649
  );
16374
16650
  case "horizontalRule":
16375
16651
  return /* @__PURE__ */ jsx(
@@ -16380,7 +16656,7 @@ function EditorToolbarBar({
16380
16656
  onClick: () => chain()?.setHorizontalRule().run(),
16381
16657
  children: /* @__PURE__ */ jsx(IconHorizontalRule, { size: ICON_SIZE })
16382
16658
  },
16383
- item
16659
+ item2
16384
16660
  );
16385
16661
  case "link":
16386
16662
  if (mobile)
@@ -16393,7 +16669,7 @@ function EditorToolbarBar({
16393
16669
  onClick: () => setMobileView("link"),
16394
16670
  children: /* @__PURE__ */ jsx(IconLink, { size: ICON_SIZE })
16395
16671
  },
16396
- item
16672
+ item2
16397
16673
  );
16398
16674
  return /* @__PURE__ */ jsxs(RPopover11.Root, { open: linkOpen, onOpenChange: setLinkOpen, children: [
16399
16675
  /* @__PURE__ */ jsx(RPopover11.Trigger, { asChild: true, disabled: off, children: /* @__PURE__ */ jsx(ToolbarButton, { label: "\uB9C1\uD06C", active: state2.link, disabled: off, children: /* @__PURE__ */ jsx(IconLink, { size: ICON_SIZE }) }) }),
@@ -16418,7 +16694,7 @@ function EditorToolbarBar({
16418
16694
  )
16419
16695
  }
16420
16696
  ) })
16421
- ] }, item);
16697
+ ] }, item2);
16422
16698
  case "image":
16423
16699
  return /* @__PURE__ */ jsxs(
16424
16700
  ToolbarButton,
@@ -16432,7 +16708,7 @@ function EditorToolbarBar({
16432
16708
  /* @__PURE__ */ jsx("span", { className: "text-[12px] leading-[20px]", children: "\uC774\uBBF8\uC9C0" })
16433
16709
  ]
16434
16710
  },
16435
- item
16711
+ item2
16436
16712
  );
16437
16713
  case "table":
16438
16714
  return /* @__PURE__ */ jsxs(
@@ -16553,7 +16829,7 @@ function EditorToolbarBar({
16553
16829
  ] }) })
16554
16830
  ]
16555
16831
  },
16556
- item
16832
+ item2
16557
16833
  );
16558
16834
  case "undo":
16559
16835
  return /* @__PURE__ */ jsx(
@@ -16564,7 +16840,7 @@ function EditorToolbarBar({
16564
16840
  onClick: () => chain()?.undo().run(),
16565
16841
  children: /* @__PURE__ */ jsx(IconUndo, { size: ICON_SIZE })
16566
16842
  },
16567
- item
16843
+ item2
16568
16844
  );
16569
16845
  case "redo":
16570
16846
  return /* @__PURE__ */ jsx(
@@ -16575,7 +16851,7 @@ function EditorToolbarBar({
16575
16851
  onClick: () => chain()?.redo().run(),
16576
16852
  children: /* @__PURE__ */ jsx(IconRedo, { size: ICON_SIZE })
16577
16853
  },
16578
- item
16854
+ item2
16579
16855
  );
16580
16856
  default:
16581
16857
  return null;
@@ -17183,7 +17459,8 @@ var resolveFieldDefault = (field) => {
17183
17459
  if (field.type === "datepicker-day") return todayIso();
17184
17460
  if (field.type === "select") return field.options?.[0]?.value;
17185
17461
  if (field.type === "datepicker-statistics") {
17186
- const unit = getFieldPresets(field).find((preset) => !preset.custom)?.value;
17462
+ const presets = getFieldPresets(field).filter((preset) => !preset.custom);
17463
+ const unit = presets.some((preset) => preset.value === "day") ? "day" : presets[0]?.value;
17187
17464
  return unit ? createPeriodValue(unit) : void 0;
17188
17465
  }
17189
17466
  return void 0;
@@ -17313,8 +17590,7 @@ var SChipFilter = /* @__PURE__ */ forwardRef(function SChipFilter2({
17313
17590
  onActiveKeysChange,
17314
17591
  onReset,
17315
17592
  onAddFilter,
17316
- label = "\uAC80\uC0C9 \uD544\uD130",
17317
- showLabel = false,
17593
+ label,
17318
17594
  showReset = true,
17319
17595
  disabled = false,
17320
17596
  className,
@@ -17331,6 +17607,7 @@ var SChipFilter = /* @__PURE__ */ forwardRef(function SChipFilter2({
17331
17607
  const pendingOpenKeyRef = useRef(null);
17332
17608
  const triggerRefs = useRef(/* @__PURE__ */ new Map());
17333
17609
  const initializedDefaultsRef = useRef(/* @__PURE__ */ new Set());
17610
+ const misuseWarningSignatureRef = useRef(null);
17334
17611
  const prevOpenKeyRef = useRef(null);
17335
17612
  const valuesRef = useRef(values);
17336
17613
  valuesRef.current = values;
@@ -17346,14 +17623,19 @@ var SChipFilter = /* @__PURE__ */ forwardRef(function SChipFilter2({
17346
17623
  (current) => groups.every((group) => isGroupSatisfied(group, current)),
17347
17624
  [groups]
17348
17625
  );
17626
+ const isRequiredSatisfied = useCallback(
17627
+ (current) => fields.every((field) => !field.required || !isEmptyValue(current[field.key])),
17628
+ [fields]
17629
+ );
17349
17630
  const runSearch = useCallback(
17350
17631
  (next) => {
17351
17632
  if (valuesMapEqual(lastSearchedValuesRef.current, next)) return;
17352
17633
  if (!isGroupsValid(next)) return;
17634
+ if (!isRequiredSatisfied(next)) return;
17353
17635
  lastSearchedValuesRef.current = next;
17354
17636
  onSearch?.(next);
17355
17637
  },
17356
- [isGroupsValid, onSearch]
17638
+ [isGroupsValid, isRequiredSatisfied, onSearch]
17357
17639
  );
17358
17640
  useEffect(() => {
17359
17641
  const prevKey = prevOpenKeyRef.current;
@@ -17388,14 +17670,24 @@ var SChipFilter = /* @__PURE__ */ forwardRef(function SChipFilter2({
17388
17670
  });
17389
17671
  if (changed) onValueChange?.({ ...values, ...patch });
17390
17672
  }, [fields, values, onValueChange]);
17391
- if (typeof console !== "undefined") {
17392
- const misused = fields.filter((f) => f.defaultValue !== void 0 && !isFixedField(f));
17393
- if (misused.length > 0) {
17673
+ useEffect(() => {
17674
+ if (typeof console === "undefined") return;
17675
+ const misusedKeys = fields.filter((f) => f.defaultValue !== void 0 && !isFixedField(f)).map((f) => f.key);
17676
+ const requiredWithoutDefaultKeys = fields.filter((f) => f.required === true && resolveFieldDefault(f) === void 0).map((f) => f.key);
17677
+ const signature = JSON.stringify([misusedKeys, requiredWithoutDefaultKeys]);
17678
+ if (signature === misuseWarningSignatureRef.current) return;
17679
+ misuseWarningSignatureRef.current = signature;
17680
+ if (misusedKeys.length > 0) {
17394
17681
  console.warn(
17395
- `[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(", ")})`
17682
+ `[SChipFilter] defaultValue \uB294 fixed\xB7required \uD544\uD130\uC5D0\uC11C\uB9CC \uC4F8 \uC218 \uC788\uC2B5\uB2C8\uB2E4. \uBB34\uC2DC\uD569\uB2C8\uB2E4. (${misusedKeys.join(", ")})`
17396
17683
  );
17397
17684
  }
17398
- }
17685
+ if (requiredWithoutDefaultKeys.length > 0) {
17686
+ console.warn(
17687
+ `[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(", ")})`
17688
+ );
17689
+ }
17690
+ }, [fields]);
17399
17691
  const fixedKeys = fields.filter(isFixedField).map((field) => field.key);
17400
17692
  const resolvedActiveKeys = Array.from(
17401
17693
  /* @__PURE__ */ new Set([...activeKeys ?? internalActiveKeys, ...fixedKeys])
@@ -17463,7 +17755,10 @@ var SChipFilter = /* @__PURE__ */ forwardRef(function SChipFilter2({
17463
17755
  },
17464
17756
  [fields]
17465
17757
  );
17466
- const validate = useCallback(() => invalidGroups.size === 0, [invalidGroups]);
17758
+ const validate = useCallback(
17759
+ () => invalidGroups.size === 0 && isRequiredSatisfied(values),
17760
+ [invalidGroups, isRequiredSatisfied, values]
17761
+ );
17467
17762
  useImperativeHandle(ref, () => ({ open, reset, validate }), [open, reset, validate]);
17468
17763
  const addField = (key) => {
17469
17764
  const next = [...resolvedActiveKeys, key];
@@ -17500,7 +17795,7 @@ var SChipFilter = /* @__PURE__ */ forwardRef(function SChipFilter2({
17500
17795
  ),
17501
17796
  style: { ...rootStyle, borderColor: "var(--chipfilter-bar-border)" },
17502
17797
  children: [
17503
- showLabel && /* @__PURE__ */ jsxs(Fragment, { children: [
17798
+ label && /* @__PURE__ */ jsxs(Fragment, { children: [
17504
17799
  /* @__PURE__ */ jsx(STag, { className: "shrink-0", shape: "square", size: "sm", color: "darkblue", label }),
17505
17800
  /* @__PURE__ */ jsx(Divider, { top: true })
17506
17801
  ] }),
@@ -18210,6 +18505,10 @@ function InlineDatePresetFilter({
18210
18505
  setSelectedId(preset.value);
18211
18506
  onValueChange(preset.resolve ? preset.resolve() : null);
18212
18507
  };
18508
+ const badgeBorder = disabled ? CHIPFILTER.chipDisabledBorder : warning ? CHIPFILTER.chipWarningBorder : CHIPFILTER.chipAppliedBorder;
18509
+ const badgeBackground = disabled ? CHIPFILTER.chipDisabledBg : CHIPFILTER.chipAppliedBg;
18510
+ const badgeLabelColor = disabled ? CHIPFILTER.chipDisabledText : CHIPFILTER.chipAppliedLabel;
18511
+ const badgeValueColor = disabled ? CHIPFILTER.chipDisabledText : CHIPFILTER.chipAppliedValue;
18213
18512
  const badge = applied && /* @__PURE__ */ jsxs(
18214
18513
  "span",
18215
18514
  {
@@ -18217,17 +18516,17 @@ function InlineDatePresetFilter({
18217
18516
  style: {
18218
18517
  minHeight: CHIPFILTER.chipHeight,
18219
18518
  borderRadius: CHIPFILTER.chipRadius,
18220
- borderColor: warning ? CHIPFILTER.chipWarningBorder : CHIPFILTER.chipAppliedBorder,
18221
- background: CHIPFILTER.chipAppliedBg,
18222
- color: CHIPFILTER.chipAppliedLabel,
18223
- cursor: rangeValue ? "pointer" : void 0
18519
+ borderColor: badgeBorder,
18520
+ background: badgeBackground,
18521
+ color: badgeLabelColor,
18522
+ cursor: rangeValue && !disabled ? "pointer" : void 0
18224
18523
  },
18225
18524
  children: [
18226
18525
  /* @__PURE__ */ jsxs("span", { className: "font-bold", children: [
18227
18526
  field.label,
18228
18527
  ":"
18229
18528
  ] }),
18230
- /* @__PURE__ */ jsx("span", { className: "font-bold", style: { color: CHIPFILTER.chipAppliedValue }, children: displayValue(field, value) }),
18529
+ /* @__PURE__ */ jsx("span", { className: "font-bold", style: { color: badgeValueColor }, children: displayValue(field, value) }),
18231
18530
  !disabled && showClear && /* @__PURE__ */ jsx(
18232
18531
  "span",
18233
18532
  {
@@ -19009,8 +19308,8 @@ var SChipInput = /* @__PURE__ */ forwardRef(function SChipInput2({
19009
19308
  onMouseDown: (e) => e.preventDefault(),
19010
19309
  children: [
19011
19310
  loading2 && /* @__PURE__ */ 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..." }),
19012
- !effectiveAutocomplete ? /* @__PURE__ */ jsx("div", { className: "flex flex-wrap gap-sd-8 px-sd-12 py-sd-6", children: items.map((item, i) => {
19013
- const selected = values.includes(item);
19311
+ !effectiveAutocomplete ? /* @__PURE__ */ jsx("div", { className: "flex flex-wrap gap-sd-8 px-sd-12 py-sd-6", children: items.map((item2, i) => {
19312
+ const selected = values.includes(item2);
19014
19313
  const active = i === activeIndex && !selected;
19015
19314
  return /* @__PURE__ */ jsx(
19016
19315
  "div",
@@ -19021,14 +19320,14 @@ var SChipInput = /* @__PURE__ */ forwardRef(function SChipInput2({
19021
19320
  style: active ? { outline: "2px solid var(--color-border-accent)", outlineOffset: 1 } : void 0,
19022
19321
  onMouseDown: (e) => {
19023
19322
  e.preventDefault();
19024
- if (!selected) addChip(item);
19323
+ if (!selected) addChip(item2);
19025
19324
  },
19026
- children: /* @__PURE__ */ jsx(SChip2, { value: item, disabled: selected, editable: false, showRemove: false })
19325
+ children: /* @__PURE__ */ jsx(SChip2, { value: item2, disabled: selected, editable: false, showRemove: false })
19027
19326
  },
19028
- item
19327
+ item2
19029
19328
  );
19030
- }) }) : items.map((item, i) => {
19031
- const selected = values.includes(item);
19329
+ }) }) : items.map((item2, i) => {
19330
+ const selected = values.includes(item2);
19032
19331
  const active = i === activeIndex && !selected;
19033
19332
  return /* @__PURE__ */ jsxs(
19034
19333
  "div",
@@ -19041,10 +19340,10 @@ var SChipInput = /* @__PURE__ */ forwardRef(function SChipInput2({
19041
19340
  ),
19042
19341
  onMouseDown: (e) => {
19043
19342
  e.preventDefault();
19044
- if (!selected) addChip(item);
19343
+ if (!selected) addChip(item2);
19045
19344
  },
19046
19345
  children: [
19047
- /* @__PURE__ */ jsx("span", { className: "flex-1", children: item }),
19346
+ /* @__PURE__ */ jsx("span", { className: "flex-1", children: item2 }),
19048
19347
  selected && /* @__PURE__ */ jsx(
19049
19348
  SIcon,
19050
19349
  {
@@ -19055,7 +19354,7 @@ var SChipInput = /* @__PURE__ */ forwardRef(function SChipInput2({
19055
19354
  )
19056
19355
  ]
19057
19356
  },
19058
- item
19357
+ item2
19059
19358
  );
19060
19359
  })
19061
19360
  ]
@@ -19439,22 +19738,22 @@ function TimeSelector({
19439
19738
  style: {
19440
19739
  padding: "var(--cmp-timepicker-selector-section-paddingY) var(--cmp-timepicker-selector-section-paddingX)"
19441
19740
  },
19442
- children: /* @__PURE__ */ jsx("div", { className: "isolate flex", children: ["AM", "PM"].map((item, index) => {
19443
- const selected = item === meridiem;
19741
+ children: /* @__PURE__ */ jsx("div", { className: "isolate flex", children: ["AM", "PM"].map((item2, index) => {
19742
+ const selected = item2 === meridiem;
19444
19743
  return /* @__PURE__ */ jsx(
19445
19744
  "button",
19446
19745
  {
19447
19746
  type: "button",
19448
- onClick: () => setMeridiem(item),
19747
+ onClick: () => setMeridiem(item2),
19449
19748
  className: cn(
19450
19749
  "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]",
19451
19750
  index === 0 ? "rounded-l-[var(--cmp-select-sm-radius)]" : "rounded-r-[var(--cmp-select-sm-radius)]",
19452
19751
  index === 0 ? "-mr-px" : "",
19453
19752
  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)]"
19454
19753
  ),
19455
- children: item === "AM" ? "\uC624\uC804" : "\uC624\uD6C4"
19754
+ children: item2 === "AM" ? "\uC624\uC804" : "\uC624\uD6C4"
19456
19755
  },
19457
- item
19756
+ item2
19458
19757
  );
19459
19758
  }) })
19460
19759
  }
@@ -19675,8 +19974,8 @@ function getTimeMinutes(value) {
19675
19974
  }
19676
19975
  function normalizeTimeRangeValue(value, rangeOrder = "strict") {
19677
19976
  if (value == null) return null;
19678
- const normalized = value.map((item) => {
19679
- const parsed = parseTimeValue(item);
19977
+ const normalized = value.map((item2) => {
19978
+ const parsed = parseTimeValue(item2);
19680
19979
  return formatTimeValue(parsed.hour, parsed.minute);
19681
19980
  });
19682
19981
  if (rangeOrder === "strict" && getTimeMinutes(normalized[0]) > getTimeMinutes(normalized[1])) {
@@ -19886,21 +20185,21 @@ function RangeTimeSelector({
19886
20185
  style: { gap: "var(--cmp-timepicker-selector-range-heading-gap)" },
19887
20186
  children: [
19888
20187
  /* @__PURE__ */ jsx("div", { className: "whitespace-nowrap text-center text-[12px] font-bold leading-[20px] text-[var(--cmp-timepicker-selector-range-heading-color)]", children: title }),
19889
- useMeridiem && /* @__PURE__ */ jsx("div", { className: "isolate flex", children: ["AM", "PM"].map((item, index) => {
19890
- const selected = item === getMeridiem(side);
20188
+ useMeridiem && /* @__PURE__ */ jsx("div", { className: "isolate flex", children: ["AM", "PM"].map((item2, index) => {
20189
+ const selected = item2 === getMeridiem(side);
19891
20190
  return /* @__PURE__ */ jsx(
19892
20191
  "button",
19893
20192
  {
19894
20193
  type: "button",
19895
- onClick: () => setMeridiem(side, item),
20194
+ onClick: () => setMeridiem(side, item2),
19896
20195
  className: cn(
19897
20196
  "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]",
19898
20197
  index === 0 ? "rounded-l-[var(--cmp-select-sm-radius)] -mr-px" : "rounded-r-[var(--cmp-select-sm-radius)]",
19899
20198
  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)]"
19900
20199
  ),
19901
- children: item === "AM" ? "\uC624\uC804" : "\uC624\uD6C4"
20200
+ children: item2 === "AM" ? "\uC624\uC804" : "\uC624\uD6C4"
19902
20201
  },
19903
- item
20202
+ item2
19904
20203
  );
19905
20204
  }) })
19906
20205
  ]
@@ -20136,6 +20435,6 @@ function STimeRangePicker({
20136
20435
  );
20137
20436
  }
20138
20437
 
20139
- export { BADGE_COLORS, BUTTON_COLORS, BUTTON_SIZES, COLOR_KEYS, FIELD_WIDTH_GRADES, GNB_COLORS, GNB_COMMON, GNB_FOLD_MS, GNB_FULL_LOGO_WIDTH, GNB_HEADER, GNB_MENU, GNB_MENU_WIDTH, GNB_RAIL, GNB_RAIL_WIDTH, ICONS, IMAGE_FITS, PAGE_BACKGROUNDS, PAGE_CONTENT_HEIGHTS, RangeCalendar, SActionModal, SBadge, SBarcodeInput, SButton, SCROLL_AREA_AXES, SCalendar, SCallout, SCard, SCheckbox, SChip2 as SChip, SChipFilter, SChipInput, SCircleProgress, SConfirmModal, SDatePicker, SDatePickerMonthListbox, SDatePickerYearListbox, SDateRangePicker, SDivider, SDraggableGroup, SDraggableItem2 as SDraggableItem, SDraggableList, SDraggableProvider, SDrawer, SDropdownButton2 as SDropdownButton, SEDITOR_DEFAULT_FONT_SIZE, SEDITOR_HEADING_LABELS, SEDITOR_HEADING_LEVELS, SEditor, SExpansionItem, SExpansionList2 as SExpansionList, SField, SFilePicker, SForm, SGhostButton, SGnb, SGuide, SIcon, SImage, SInput, SKeyValueTable, SLAYOUT_MIN_WIDTH, SLayout, SLayoutContext, SLinearProgress, SList2 as SList, SListItem2 as SListItem, SLoadingContainer, SLoadingModal, SLoadingViewport, SModal, SModalOutlet, SNumberInput, SPage, SPagination, SPopover, SPopup, SPortal, SRadio, SRadioButton, SRadioGroup, SSPLITTER_UNITS, SScrollArea, SSearchInput, SSectionHeaderCard2 as SSectionHeaderCard, SSelect2 as SSelect, SSplitter2 as SSplitter, SStepper, SSwitch, STEPPER_SIZES, STable, STableBar, STabs, STag, STextLink, STextarea, STimePicker, STimeRangePicker, SToast, SToastContainer, SToggle, STooltip2 as STooltip, STree2 as STree, STreeItem2 as STreeItem, TAG_COLORS, TAG_SHAPES, TAG_SIZES, TIMEPICKER_SIZES, TIMEPICKER_SIZE_CONFIG, buttonPreset, cn, fieldWidthValue, findGnbAncestors, findGnbRailValue, isColorKey, isFieldWidthGrade, loading, resolveColor, useSLayout };
20438
+ export { BADGE_COLORS, BUTTON_COLORS, BUTTON_SIZES, COLOR_KEYS, FIELD_WIDTH_GRADES, GNB_COLORS, GNB_COMMON, GNB_FOLD_MS, GNB_FULL_LOGO_WIDTH, GNB_HEADER, GNB_MENU, GNB_MENU_WIDTH, GNB_RAIL, GNB_RAIL_WIDTH, ICONS, IMAGE_FITS, PAGE_BACKGROUNDS, PAGE_CONTENT_HEIGHTS, RangeCalendar, SActionModal, SBadge, SBarcodeInput, SButton, SCROLL_AREA_AXES, SCalendar, SCallout, SCard, SCheckbox, SChip2 as SChip, SChipFilter, SChipInput, SCircleProgress, SConfirmModal, SDatePicker, SDatePickerMonthListbox, SDatePickerYearListbox, SDateRangePicker, SDivider, SDraggableGroup, SDraggableItem2 as SDraggableItem, SDraggableList, SDraggableProvider, SDrawer, SDropdownButton2 as SDropdownButton, SEDITOR_DEFAULT_FONT_SIZE, SEDITOR_HEADING_LABELS, SEDITOR_HEADING_LEVELS, SEditor, SExpansionItem, SExpansionList2 as SExpansionList, SField, SFilePicker, SForm, SGhostButton, SGnb, SGuide, SIcon, SImage, SInput, SKeyValueTable, SLAYOUT_MIN_WIDTH, SLayout, SLayoutContext, SLinearProgress, SList2 as SList, SListItem2 as SListItem, SLoadingContainer, SLoadingModal, SLoadingViewport, SModal, SModalOutlet, SNumberInput, SPage, SPagination, SPopover, SPopup, SPortal, SRadio, SRadioButton, SRadioGroup, SSPLITTER_UNITS, SScrollArea, SSearchInput, SSectionHeaderCard2 as SSectionHeaderCard, SSelect2 as SSelect, SSplitter2 as SSplitter, SStepper, SSwitch, SSystemActionButton, STEPPER_SIZES, STable, STableBar, STabs, STag, STextLink, STextarea, STimePicker, STimeRangePicker, SToast, SToastContainer, SToggle, STooltip2 as STooltip, STree2 as STree, STreeItem2 as STreeItem, SYSTEM_ACTION_BUTTON_COLORS, SYSTEM_ACTION_BUTTON_COLOR_CONFIG, SYSTEM_ACTION_BUTTON_LAYOUT, SYSTEM_ACTION_BUTTON_TYPES, SYSTEM_ACTION_BUTTON_TYPE_CONFIG, TAG_COLORS, TAG_SHAPES, TAG_SIZES, TIMEPICKER_SIZES, TIMEPICKER_SIZE_CONFIG, buttonPreset, cn, fieldWidthValue, findGnbAncestors, findGnbRailValue, isColorKey, isFieldWidthGrade, loading, resolveColor, useSLayout };
20140
20439
  //# sourceMappingURL=index.js.map
20141
20440
  //# sourceMappingURL=index.js.map