sellmate-design-system-react 9.0.0-beta.93 → 9.0.0-beta.94

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (31) hide show
  1. package/AGENTS.md +1 -0
  2. package/dist/components/SButton/button.config.d.ts +2 -1
  3. package/dist/components/SChatAttachedFile/chatAttachedFile.config.d.ts +2 -2
  4. package/dist/components/SChatFile/chatFile.config.d.ts +2 -2
  5. package/dist/components/SChipFilter/README.md +2 -0
  6. package/dist/components/SGhostButton/README.md +2 -0
  7. package/dist/components/SGnb/gnb.config.d.ts +6 -0
  8. package/dist/components/SIcon/README.md +3 -1
  9. package/dist/components/SIcon/SIcon.d.ts +1 -1
  10. package/dist/components/SLauncherListBox/launcherListBox.config.d.ts +2 -7
  11. package/dist/components/SLoadingModal/README.md +2 -2
  12. package/dist/components/SRadioCard/README.md +3 -0
  13. package/dist/components/SRadioCard/SRadioCard.d.ts +7 -2
  14. package/dist/components/SRadioCard/SRadioCardGroup.d.ts +3 -1
  15. package/dist/components/SSelect/README.md +1 -1
  16. package/dist/components/SSelect/SSelect.d.ts +1 -1
  17. package/dist/components/SStepper/stepper.config.d.ts +9 -3
  18. package/dist/components/STabs/tabs.config.d.ts +3 -8
  19. package/dist/components/STag/tag.config.d.ts +10 -9
  20. package/dist/components/STimePicker/timepicker.config.d.ts +3 -0
  21. package/dist/components/STree/README.md +2 -0
  22. package/dist/index.cjs +804 -647
  23. package/dist/index.cjs.map +1 -1
  24. package/dist/index.js +804 -647
  25. package/dist/index.js.map +1 -1
  26. package/dist/lib/list-box-item.d.ts +16 -0
  27. package/dist/lib/tree-row.d.ts +20 -2
  28. package/dist/llms-full.txt +12 -4
  29. package/dist/llms.txt +1 -0
  30. package/dist/styles.css +228 -80
  31. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -3695,16 +3695,21 @@ var SIcon = /* @__PURE__ */ forwardRef(function SIcon2({ name, size = 24, color,
3695
3695
  const Svg = ICONS[name];
3696
3696
  if (!Svg) return null;
3697
3697
  const rotateClass = rotate ? { 90: "rotate-90", 180: "rotate-180", 270: "-rotate-90" }[rotate] : void 0;
3698
+ const cssSize = typeof size === "string" && /var\(|calc\(/.test(size);
3698
3699
  return /* @__PURE__ */ jsx(
3699
3700
  "span",
3700
3701
  {
3701
3702
  ref,
3702
3703
  className: cn("inline-flex items-center justify-center", rotateClass, className),
3703
- style: { color: resolveColor(color), ...style },
3704
+ style: {
3705
+ color: resolveColor(color),
3706
+ ...cssSize && { width: size, height: size },
3707
+ ...style
3708
+ },
3704
3709
  role: label ? "img" : void 0,
3705
3710
  "aria-label": label,
3706
3711
  "aria-hidden": label ? void 0 : true,
3707
- children: /* @__PURE__ */ jsx(Svg, { size })
3712
+ children: /* @__PURE__ */ jsx(Svg, { size: cssSize ? "100%" : size })
3708
3713
  }
3709
3714
  );
3710
3715
  });
@@ -4107,7 +4112,7 @@ var SBadge = /* @__PURE__ */ forwardRef(function SBadge2({ color = "blue", class
4107
4112
  return /* @__PURE__ */ jsx("span", { ref, className: cn("inline-flex items-center justify-center", className), ...rest, children: /* @__PURE__ */ jsx(
4108
4113
  "span",
4109
4114
  {
4110
- className: "rounded-full",
4115
+ className: "rounded-(--cmp-badge-radius)",
4111
4116
  style: {
4112
4117
  width: "var(--cmp-badge-size, 6px)",
4113
4118
  height: "var(--cmp-badge-size, 6px)",
@@ -4174,7 +4179,8 @@ var BUTTON_SIZE_CONFIG = {
4174
4179
  height: "var(--cmp-button-xs-height)",
4175
4180
  paddingX: "var(--cmp-button-xs-paddingX)",
4176
4181
  gap: "var(--cmp-button-xs-gap)",
4177
- iconSize: 12,
4182
+ iconSize: "var(--cmp-button-xs-icon)",
4183
+ iconOnlyWidth: "var(--cmp-button-iconOnly-xs-width)",
4178
4184
  fontSize: 12,
4179
4185
  fontWeight: 500,
4180
4186
  radius: "var(--cmp-button-radius-sm)",
@@ -4184,7 +4190,8 @@ var BUTTON_SIZE_CONFIG = {
4184
4190
  height: "var(--cmp-button-sm-height)",
4185
4191
  paddingX: "var(--cmp-button-sm-paddingX)",
4186
4192
  gap: "var(--cmp-button-sm-gap)",
4187
- iconSize: 16,
4193
+ iconSize: "var(--cmp-button-sm-icon)",
4194
+ iconOnlyWidth: "var(--cmp-button-iconOnly-sm-width)",
4188
4195
  fontSize: 12,
4189
4196
  fontWeight: 500,
4190
4197
  radius: "var(--cmp-button-radius-sm)",
@@ -4194,7 +4201,8 @@ var BUTTON_SIZE_CONFIG = {
4194
4201
  height: "var(--cmp-button-md-height)",
4195
4202
  paddingX: "var(--cmp-button-md-paddingX)",
4196
4203
  gap: "var(--cmp-button-md-gap)",
4197
- iconSize: 20,
4204
+ iconSize: "var(--cmp-button-md-icon)",
4205
+ iconOnlyWidth: "var(--cmp-button-iconOnly-md-width)",
4198
4206
  fontSize: 16,
4199
4207
  fontWeight: 500,
4200
4208
  radius: "var(--cmp-button-radius-md)",
@@ -4204,7 +4212,8 @@ var BUTTON_SIZE_CONFIG = {
4204
4212
  height: "var(--cmp-button-lg-height)",
4205
4213
  paddingX: "var(--cmp-button-lg-paddingX)",
4206
4214
  gap: "var(--cmp-button-lg-gap)",
4207
- iconSize: 24,
4215
+ iconSize: "var(--cmp-button-lg-icon)",
4216
+ iconOnlyWidth: "var(--cmp-button-iconOnly-lg-width)",
4208
4217
  fontSize: 18,
4209
4218
  fontWeight: 500,
4210
4219
  radius: "var(--cmp-button-radius-md)",
@@ -4251,7 +4260,7 @@ var SButton = /* @__PURE__ */ forwardRef(function SButton2({
4251
4260
  "--btn-border": disabled ? BUTTON_DISABLED_BORDER : preset.border,
4252
4261
  "--btn-ring": BUTTON_FOCUS_RING,
4253
4262
  "minHeight": s.height,
4254
- "minWidth": iconOnly ? s.height : hasLabel ? s.minWidth : void 0,
4263
+ "minWidth": iconOnly ? s.iconOnlyWidth : hasLabel ? s.minWidth : void 0,
4255
4264
  "padding": iconOnly ? 0 : `0 ${s.paddingX}`,
4256
4265
  "borderRadius": s.radius,
4257
4266
  "gap": s.gap,
@@ -4268,7 +4277,7 @@ var SButton = /* @__PURE__ */ forwardRef(function SButton2({
4268
4277
  disabled,
4269
4278
  "aria-label": ariaLabel,
4270
4279
  className: cn(
4271
- "inline-flex items-center justify-center whitespace-nowrap border border-solid leading-none transition-colors",
4280
+ "inline-flex items-center justify-center whitespace-nowrap border-[length:var(--cmp-button-border-width-default)] border-solid leading-none transition-colors",
4272
4281
  "border-[color:var(--btn-border)] bg-[var(--btn-bg)]",
4273
4282
  "outline-none focus-visible:shadow-[0_0_0_2px_var(--btn-ring)]",
4274
4283
  disabled ? "cursor-not-allowed" : "cursor-pointer hover:bg-[var(--btn-bg-hover)]",
@@ -4386,34 +4395,28 @@ var TAG_COLORS = [
4386
4395
  ];
4387
4396
  var TAG_SIZE_CONFIG = {
4388
4397
  xs: {
4389
- height: 20,
4390
- paddingX: 8,
4391
- gap: 4,
4392
- radius: 6,
4393
- iconSize: 12,
4394
- fontSize: 11,
4395
- fontWeight: 500,
4396
- lineHeight: 18
4398
+ height: "var(--cmp-tag-xs-height)",
4399
+ paddingX: "var(--cmp-tag-xs-paddingX)",
4400
+ gap: "var(--cmp-tag-xs-gap)",
4401
+ radius: "var(--cmp-tag-xs-radius)",
4402
+ iconSize: "var(--cmp-tag-xs-icon)",
4403
+ typography: "typo-feedback-xs"
4397
4404
  },
4398
4405
  sm: {
4399
- height: 24,
4400
- paddingX: 8,
4401
- gap: 4,
4402
- radius: 6,
4403
- iconSize: 16,
4404
- fontSize: 12,
4405
- fontWeight: 600,
4406
- lineHeight: 20
4406
+ height: "var(--cmp-tag-sm-height)",
4407
+ paddingX: "var(--cmp-tag-sm-paddingX)",
4408
+ gap: "var(--cmp-tag-sm-gap)",
4409
+ radius: "var(--cmp-tag-sm-radius)",
4410
+ iconSize: "var(--cmp-tag-sm-icon)",
4411
+ typography: "typo-feedback-sm-semibold"
4407
4412
  },
4408
4413
  md: {
4409
- height: 28,
4410
- paddingX: 12,
4411
- gap: 6,
4412
- radius: 8,
4413
- iconSize: 16,
4414
- fontSize: 14,
4415
- fontWeight: 700,
4416
- lineHeight: 24
4414
+ height: "var(--cmp-tag-md-height)",
4415
+ paddingX: "var(--cmp-tag-md-paddingX)",
4416
+ gap: "var(--cmp-tag-md-gap)",
4417
+ radius: "var(--cmp-tag-md-radius)",
4418
+ iconSize: "var(--cmp-tag-md-icon)",
4419
+ typography: "typo-feedback-md-bold"
4417
4420
  }
4418
4421
  };
4419
4422
  var STag = /* @__PURE__ */ forwardRef(function STag2({
@@ -4441,16 +4444,14 @@ var STag = /* @__PURE__ */ forwardRef(function STag2({
4441
4444
  "aria-label": label || "tag",
4442
4445
  className: cn(
4443
4446
  "box-border inline-flex w-fit select-none items-center justify-center whitespace-nowrap",
4447
+ s.typography,
4444
4448
  className
4445
4449
  ),
4446
4450
  style: {
4447
4451
  minHeight: s.height,
4448
- padding: `0 ${s.paddingX}px`,
4452
+ padding: `0 ${s.paddingX}`,
4449
4453
  gap: s.gap,
4450
4454
  borderRadius: shape === "pill" ? 999 : s.radius,
4451
- fontSize: s.fontSize,
4452
- fontWeight: s.fontWeight,
4453
- lineHeight: `${s.lineHeight}px`,
4454
4455
  background: bgColor,
4455
4456
  color: contentColor,
4456
4457
  ...resolvedWidth != null ? { width: resolvedWidth } : {},
@@ -4470,11 +4471,11 @@ var STag = /* @__PURE__ */ forwardRef(function STag2({
4470
4471
  );
4471
4472
  });
4472
4473
  var SIZE = {
4473
- xxs: { icon: 12, radius: "sm" },
4474
- xs: { icon: 16, radius: "sm" },
4475
- sm: { icon: 20, radius: "sm" },
4476
- md: { icon: 24, radius: "md" },
4477
- lg: { icon: 32, radius: "md" }
4474
+ xxs: { icon: "var(--cmp-ghostButton-xxs-icon)", radius: "sm" },
4475
+ xs: { icon: "var(--cmp-ghostButton-xs-icon)", radius: "sm" },
4476
+ sm: { icon: "var(--cmp-ghostButton-sm-icon)", radius: "sm" },
4477
+ md: { icon: "var(--cmp-ghostButton-md-icon)", radius: "md" },
4478
+ lg: { icon: "var(--cmp-ghostButton-lg-icon)", radius: "md" }
4478
4479
  };
4479
4480
  var TOOLTIP_HIDE_DELAY_MS = 100;
4480
4481
  var SGhostButton = /* @__PURE__ */ forwardRef(function SGhostButton2({
@@ -4549,7 +4550,7 @@ var SGhostButton = /* @__PURE__ */ forwardRef(function SGhostButton2({
4549
4550
  "span",
4550
4551
  {
4551
4552
  "aria-hidden": true,
4552
- className: "pointer-events-none absolute inset-0 rounded-[inherit] opacity-0 transition-opacity duration-200 group-hover/ghost-button:opacity-5",
4553
+ className: "pointer-events-none absolute inset-0 rounded-[inherit] opacity-0 transition-opacity duration-200 group-hover/ghost-button:opacity-(--cmp-ghostButton-hover-opacity)",
4553
4554
  style: { background: `var(--cmp-ghostButton-${intent}-hover-bg)` }
4554
4555
  }
4555
4556
  ),
@@ -4773,7 +4774,9 @@ var STooltipImpl = /* @__PURE__ */ forwardRef(function STooltip({
4773
4774
  ...restContentProps
4774
4775
  } = contentProps ?? {};
4775
4776
  const contentClass = cn(
4776
- "z-50 w-fit max-w-[var(--radix-popover-content-available-width)] rounded-[6px] px-[16px] py-[12px] text-[12px] leading-[20px] shadow-normal-sm",
4777
+ "z-50 w-fit max-w-[var(--radix-popover-content-available-width)] rounded-(--cmp-tooltip-radius) px-(--cmp-tooltip-paddingX) py-(--cmp-tooltip-paddingY) shadow-normal-sm",
4778
+ // default 500, danger/warning/accent 700 — tooltip.<type>.typography
4779
+ tooltipType === "default" ? "typo-feedback-sm-medium" : "typo-feedback-sm-bold",
4777
4780
  FLOATING_SLIDE_ANIM,
4778
4781
  className,
4779
4782
  contentPropsClassName
@@ -4781,7 +4784,6 @@ var STooltipImpl = /* @__PURE__ */ forwardRef(function STooltip({
4781
4784
  const contentStyle = {
4782
4785
  background: bg,
4783
4786
  color: fg,
4784
- fontWeight: tooltipType === "default" ? 500 : 700,
4785
4787
  ...style,
4786
4788
  ...contentPropsStyle
4787
4789
  };
@@ -4822,7 +4824,7 @@ var STooltipImpl = /* @__PURE__ */ forwardRef(function STooltip({
4822
4824
  onMouseLeave: isHover ? startHide : void 0,
4823
4825
  ...restContentProps,
4824
4826
  children: [
4825
- /* @__PURE__ */ jsxs("div", { className: "flex items-start gap-[12px]", children: [
4827
+ /* @__PURE__ */ jsxs("div", { className: "flex items-start gap-(--cmp-tooltip-gap)", children: [
4826
4828
  /* @__PURE__ */ jsx("div", { className: "min-w-0 flex-1", children: body }),
4827
4829
  showClose && !isNone && /* @__PURE__ */ jsx(
4828
4830
  SGhostButton,
@@ -4877,16 +4879,20 @@ var FIELD_SIZE = {
4877
4879
  height: 28,
4878
4880
  radius: 4,
4879
4881
  fieldGap: 12,
4880
- labelGap: 6,
4882
+ labelHeight: "var(--cmp-field-label-sm-height)",
4883
+ labelGap: "var(--cmp-field-label-sm-gap)",
4881
4884
  labelTypo: "typo-field-sm-bold",
4885
+ labelIcon: "var(--cmp-field-label-sm-icon)",
4882
4886
  icon: 16
4883
4887
  },
4884
4888
  md: {
4885
4889
  height: 36,
4886
4890
  radius: 6,
4887
4891
  fieldGap: 16,
4888
- labelGap: 8,
4892
+ labelHeight: "var(--cmp-field-label-md-height)",
4893
+ labelGap: "var(--cmp-field-label-md-gap)",
4889
4894
  labelTypo: "typo-field-md-bold",
4895
+ labelIcon: "var(--cmp-field-label-md-icon)",
4890
4896
  icon: 16
4891
4897
  }
4892
4898
  };
@@ -5013,7 +5019,7 @@ var SField = /* @__PURE__ */ forwardRef(function SField2({
5013
5019
  // 라벨과 컨트롤 사이가 간격 토큰보다 넓어진다. 줄 세우기용 labelWidth 도
5014
5020
  // 뜻이 없다(아래에 컨트롤이 제 폭으로 선다).
5015
5021
  ...labelOnTop ? {} : {
5016
- height: cssLen(labelHeight) ?? s.height,
5022
+ height: cssLen(labelHeight) ?? s.labelHeight,
5017
5023
  marginRight: s.fieldGap,
5018
5024
  width: cssLen(labelWidth)
5019
5025
  }
@@ -5023,7 +5029,7 @@ var SField = /* @__PURE__ */ forwardRef(function SField2({
5023
5029
  SIcon,
5024
5030
  {
5025
5031
  name: icon,
5026
- size: s.icon,
5032
+ size: s.labelIcon,
5027
5033
  color: iconColor,
5028
5034
  style: { marginRight: s.labelGap }
5029
5035
  }
@@ -5103,7 +5109,7 @@ var SField = /* @__PURE__ */ forwardRef(function SField2({
5103
5109
  effectiveAddonLabel !== "" && /* @__PURE__ */ jsxs(
5104
5110
  "div",
5105
5111
  {
5106
- className: "flex shrink-0 items-center gap-(--cmp-field-addonLabel-gap) whitespace-nowrap border-r border-solid px-(--cmp-field-addonLabel-paddingX) text-12 font-medium leading-sd-20",
5112
+ className: "flex shrink-0 items-center gap-(--cmp-field-addonLabel-gap) whitespace-nowrap border-r-(length:--cmp-field-addonLabel-border-width) border-solid px-(--cmp-field-addonLabel-paddingX) typo-field-sm-medium",
5107
5113
  style: {
5108
5114
  // 원본 sd-field: labelWidth가 addon 폭(--sd-field-addon-width)에도 적용됨
5109
5115
  width: cssLen(labelWidth),
@@ -5123,7 +5129,7 @@ var SField = /* @__PURE__ */ forwardRef(function SField2({
5123
5129
  ]
5124
5130
  }
5125
5131
  ),
5126
- showError ? /* @__PURE__ */ jsx("div", { className: "mt-(--cmp-field-contents-gap) px-(--cmp-field-message-paddingX) text-12 font-normal leading-sd-20 text-(--cmp-field-errorMessage-color)", children: errorMessage }) : hint !== "" ? /* @__PURE__ */ jsx("div", { className: "mt-(--cmp-field-contents-gap) px-(--cmp-field-message-paddingX) text-12 font-normal leading-sd-20 text-(--cmp-field-hint-color)", children: hint }) : null
5132
+ showError ? /* @__PURE__ */ jsx("div", { className: "mt-(--cmp-field-contents-gap) px-(--cmp-field-message-paddingX) typo-field-sm-default text-(--cmp-field-errorMessage-color)", children: errorMessage }) : hint !== "" ? /* @__PURE__ */ jsx("div", { className: "mt-(--cmp-field-contents-gap) px-(--cmp-field-message-paddingX) typo-field-sm-default text-(--cmp-field-hint-color)", children: hint }) : null
5127
5133
  ]
5128
5134
  }
5129
5135
  )
@@ -5450,8 +5456,8 @@ var CHAT_ATTACHED_FILE_CONFIG = {
5450
5456
  contentGap: "gap-(--cmp-chatAttachedFile-content-gap)",
5451
5457
  /** 클립 아이콘이 앉는 칩 — 내부 패딩·면·라운드 (높이는 아이콘+패딩이 정한다) */
5452
5458
  tile: "p-(--cmp-chatAttachedFile-icon-wrapper-padding) rounded-(--cmp-chatAttachedFile-icon-wrapper-radius) bg-(--cmp-chatAttachedFile-icon-wrapper-bg)",
5453
- /** 칩 안 클립 아이콘 크기(px). SVG width/height 는 속성값이라 CSS 변수를 못 받아 값으로 둔다 (토큰 값과 동일) */
5454
- iconSize: 16,
5459
+ /** 칩 안 클립 아이콘 크기 */
5460
+ iconSize: "var(--cmp-chatAttachedFile-icon-size)",
5455
5461
  /** 파일명 타이포 프리셋 */
5456
5462
  nameTypo: "typo-body-sm-default",
5457
5463
  /** 파일명 텍스트색 */
@@ -5529,8 +5535,8 @@ var CHAT_FILE_CONFIG = {
5529
5535
  * 디자인팀에 `icon.wrapper.bg.hover` 를 요청해 나오는 대로 갈아끼운다.
5530
5536
  */
5531
5537
  tile: "p-(--cmp-chatFile-icon-wrapper-padding) rounded-(--cmp-chatFile-icon-wrapper-radius) bg-(--cmp-chatFile-icon-wrapper-bg) group-hover/chat-file:bg-(--sys-color-bg-frame)",
5532
- /** 칩 안 클립 아이콘 크기(px). SVG width/height 는 속성값이라 CSS 변수를 못 받아 값으로 둔다 (토큰 값과 동일) */
5533
- iconSize: 20,
5538
+ /** 칩 안 클립 아이콘 크기 */
5539
+ iconSize: "var(--cmp-chatFile-icon-size)",
5534
5540
  /** 파일명 타이포 프리셋 */
5535
5541
  nameTypo: "typo-body-md-bold",
5536
5542
  /** 파일명·부가정보 텍스트색 */
@@ -5883,7 +5889,7 @@ var SDraggableItemView = /* @__PURE__ */ forwardRef(
5883
5889
  paddingYClass,
5884
5890
  // 항목 사이 구분선은 리스트가 그린다.
5885
5891
  bordered && cn(
5886
- "rounded-(--cmp-listDraggableItem-radius-bordered) border border-(--cmp-listDraggableItem-border-default)",
5892
+ "rounded-(--cmp-listDraggableItem-radius-bordered) border-(length:--cmp-listDraggableItem-border-width-default) border-(--cmp-listDraggableItem-border-default)",
5887
5893
  !disabled && !selected && !dragging && cn(
5888
5894
  "hover:border-(--cmp-listDraggableItem-bordered-border-hover)",
5889
5895
  "[[data-drag-active]_&]:hover:border-(--cmp-listDraggableItem-border-default)"
@@ -6755,7 +6761,7 @@ var SExpansionItem = /* @__PURE__ */ forwardRef(
6755
6761
  "gap-(--cmp-listExpansionItem-title-gap)",
6756
6762
  // 헤더 액션이 있으면 오른쪽 끝 여백은 액션 칸이 갖고, 버튼은 액션과의 간격만 남긴다
6757
6763
  hasHeaderAction ? "pr-(--cmp-listExpansionItem-title-gap)" : "pr-(--cmp-listExpansionItem-title-paddingX)",
6758
- depth === 2 ? "pl-[36px]" : depth === 3 ? "pl-[56px]" : "pl-[16px]",
6764
+ depth === 2 ? "pl-[36px]" : depth === 3 ? "pl-[56px]" : "pl-(--cmp-listExpansionItem-title-paddingX)",
6759
6765
  isExpanded && "text-(--cmp-listExpansionItem-title-text-expanded)"
6760
6766
  ),
6761
6767
  children: [
@@ -6766,7 +6772,14 @@ var SExpansionItem = /* @__PURE__ */ forwardRef(
6766
6772
  "flex transition-transform duration-200 ease-out motion-reduce:transition-none",
6767
6773
  isExpanded && "rotate-180"
6768
6774
  ),
6769
- children: /* @__PURE__ */ jsx(SIcon, { name: "caretDown", size: 12, color: "var(--sys-color-fg-quaternary)" })
6775
+ children: /* @__PURE__ */ jsx(
6776
+ SIcon,
6777
+ {
6778
+ name: "caretDown",
6779
+ size: "var(--cmp-listExpansionItem-title-icon)",
6780
+ color: "var(--sys-color-fg-quaternary)"
6781
+ }
6782
+ )
6770
6783
  }
6771
6784
  ),
6772
6785
  leadingNode,
@@ -6804,10 +6817,9 @@ var SExpansionItem = /* @__PURE__ */ forwardRef(
6804
6817
  className: cn(
6805
6818
  "group/expansion-item relative overflow-hidden bg-(--cmp-listExpansionItem-title-bg-default)",
6806
6819
  // 항목 사이 구분선은 리스트가 그린다.
6807
- // 보더 색은 시맨틱 토큰(border-default → hover strong → 펼침 accentLight)을 쓴다.
6808
- // TODO: expansionItem/bordered/radius 토큰 생성 후 rounded 고정값도 토큰으로 교체한다.
6809
- bordered && "rounded-[8px] border border-border-default hover:border-border-strong [&:has(>button:hover)]:border-border-strong",
6810
- bordered && isExpanded && "!border-border-accentLight",
6820
+ // 보더 색: 기본 → hover → 펼침 순으로 listExpansionItem.border 토큰을 쓴다.
6821
+ bordered && "rounded-(--cmp-listExpansionItem-bordered-radius) border border-(--cmp-listExpansionItem-border-default) hover:border-(--cmp-listExpansionItem-border-hover) [&:has(>button:hover)]:border-(--cmp-listExpansionItem-border-hover)",
6822
+ bordered && isExpanded && "!border-(--cmp-listExpansionItem-border-expanded)",
6811
6823
  className
6812
6824
  ),
6813
6825
  ...rest,
@@ -6816,7 +6828,7 @@ var SExpansionItem = /* @__PURE__ */ forwardRef(
6816
6828
  "span",
6817
6829
  {
6818
6830
  "aria-hidden": "true",
6819
- className: "pointer-events-none absolute bottom-[-1px] left-0 top-0 z-[1] w-(--cmp-listItem-accentStripe-width) bg-(--cmp-listItem-accentStripe-color)"
6831
+ className: "pointer-events-none absolute bottom-[-1px] left-0 top-0 z-[1] w-(--cmp-listExpansionItem-accentStripe-width) bg-(--cmp-listExpansionItem-accentStripe-color)"
6820
6832
  }
6821
6833
  ),
6822
6834
  hasHeaderAction ? (
@@ -6923,9 +6935,9 @@ var SListItemImpl = /* @__PURE__ */ forwardRef(function SListItem({
6923
6935
  dense ? "py-(--cmp-listItem-paddingY-dense)" : "py-(--cmp-listItem-paddingY-normal)",
6924
6936
  "gap-(--cmp-listItem-gap)",
6925
6937
  "pr-(--cmp-listItem-paddingX)",
6926
- depth === 2 ? "pl-[36px]" : depth === 3 ? "pl-[56px]" : "pl-[16px]",
6938
+ depth === 2 ? "pl-[36px]" : depth === 3 ? "pl-[56px]" : "pl-(--cmp-listItem-paddingX)",
6927
6939
  bordered && cn(
6928
- "overflow-hidden rounded-(--cmp-listItem-radius-bordered) border border-(--cmp-listItem-border-default)",
6940
+ "overflow-hidden rounded-(--cmp-listItem-radius-bordered) border-(length:--cmp-listItem-border-width-default) border-(--cmp-listItem-border-default)",
6929
6941
  isSelected ? "border-(--cmp-listItem-bordered-border-selected)" : isInteractive && "hover:border-(--cmp-listItem-bordered-border-hover)"
6930
6942
  ),
6931
6943
  className
@@ -7615,7 +7627,7 @@ function SCheckbox({
7615
7627
  };
7616
7628
  const boxBg = disabled ? "var(--cmp-checkbox-bg-disabled)" : inverse ? "transparent" : isChecked ? "var(--cmp-checkbox-checked-bg-default)" : "var(--cmp-checkbox-unchecked-bg-default)";
7617
7629
  const boxBorder = disabled ? "var(--cmp-checkbox-border-disabled)" : inverse ? "var(--cmp-checkbox-checked-border-inverse)" : isChecked ? "var(--cmp-checkbox-checked-bg-default)" : "var(--cmp-checkbox-unchecked-border-default)";
7618
- const iconColor = disabled ? "var(--cmp-checkbox-checked-icon-disabled)" : "var(--cmp-checkbox-checked-icon-default)";
7630
+ const iconColor = disabled ? "var(--cmp-checkbox-checked-icon-disabled)" : inverse ? "var(--cmp-checkbox-checked-icon-inverse)" : "var(--cmp-checkbox-checked-icon-default)";
7619
7631
  const labelColor = disabled ? "var(--cmp-checkbox-label-disabled)" : inverse ? "var(--cmp-checkbox-label-inverse)" : "var(--cmp-checkbox-label-default)";
7620
7632
  return /* @__PURE__ */ jsxs(
7621
7633
  "label",
@@ -7644,7 +7656,7 @@ function SCheckbox({
7644
7656
  SIcon,
7645
7657
  {
7646
7658
  name: state2 === "indeterminate" ? "checkboxIndeterminate" : "checkboxCheck",
7647
- size: 12,
7659
+ size: "var(--cmp-checkbox-icon)",
7648
7660
  color: iconColor
7649
7661
  }
7650
7662
  ) })
@@ -7656,11 +7668,19 @@ function SCheckbox({
7656
7668
  // 찌그러진다 — 띄어쓰기에서만 끊고, 끊을 자리가 없는 긴 토큰만 흘려보낸다
7657
7669
  // (SRadio·SSwitch 라벨과 같은 규칙). 두 사본에 함께 걸려야 하므로 바깥 grid 에 준다.
7658
7670
  /* @__PURE__ */ jsxs("span", { className: "grid break-keep wrap-break-word", style: { color: labelColor }, children: [
7659
- /* @__PURE__ */ jsx("span", { "aria-hidden": true, className: "typo-body-sm-medium invisible", style: { gridArea: "1 / 1" }, children: label }),
7660
7671
  /* @__PURE__ */ jsx(
7661
7672
  "span",
7662
7673
  {
7663
- className: isChecked ? "typo-body-sm-medium" : "typo-body-sm-default",
7674
+ "aria-hidden": true,
7675
+ className: "typo-field-sm-medium invisible",
7676
+ style: { gridArea: "1 / 1" },
7677
+ children: label
7678
+ }
7679
+ ),
7680
+ /* @__PURE__ */ jsx(
7681
+ "span",
7682
+ {
7683
+ className: isChecked ? "typo-field-sm-medium" : "typo-field-sm-default",
7664
7684
  style: { gridArea: "1 / 1" },
7665
7685
  children: label
7666
7686
  }
@@ -7672,18 +7692,18 @@ function SCheckbox({
7672
7692
  }
7673
7693
  var TREE_LABEL_TYPOGRAPHY = {
7674
7694
  sm: {
7675
- default: "typo-body-sm-medium",
7676
- selected: "typo-body-sm-bold",
7695
+ default: "typo-item-sm-default",
7696
+ selected: "typo-item-sm-selected",
7677
7697
  rowHeight: "h-[28px]"
7678
7698
  },
7679
7699
  md: {
7680
- default: "typo-body-md-medium",
7681
- selected: "typo-body-md-bold",
7700
+ default: "typo-item-md-default",
7701
+ selected: "typo-item-md-selected",
7682
7702
  rowHeight: "h-[32px]"
7683
7703
  }
7684
7704
  };
7685
7705
  var TREE_ROW_CLASS = "group/tree-item box-border flex w-full items-center gap-(--cmp-tree-item-rowGap) overflow-hidden bg-(--cmp-tree-item-bg-default) px-(--cmp-tree-item-paddingX) text-left hover:bg-(--cmp-tree-item-bg-hover)";
7686
- var TREE_ROW_BORDER_CLASS = "border-b border-(--cmp-tree-item-border-default)";
7706
+ var TREE_ROW_BORDER_CLASS = "border-b-(length:--cmp-tree-item-border-width-default) border-(--cmp-tree-item-border-default)";
7687
7707
  var TREE_ROW_ACTIVE_CLASS = "bg-(--cmp-tree-item-bg-hover)";
7688
7708
  var TREE_CONTENT_CLASS = "box-border flex min-w-0 flex-1 items-center gap-(--cmp-tree-item-contentGap)";
7689
7709
  function treeLabelClass(size, {
@@ -7693,12 +7713,49 @@ function treeLabelClass(size, {
7693
7713
  }) {
7694
7714
  const typography = TREE_LABEL_TYPOGRAPHY[size];
7695
7715
  return cn(
7696
- "block min-w-0 flex-1 truncate py-(--cmp-tree-item-paddingY) text-(--cmp-tree-item-text-default)",
7716
+ "block min-w-0 truncate py-(--cmp-tree-item-paddingY) text-(--cmp-tree-item-text-default)",
7697
7717
  emphasized ? typography.selected : typography.default,
7698
7718
  disabled && "opacity-60",
7699
- disabled ? "cursor-not-allowed" : selectable ? "cursor-pointer" : void 0
7719
+ disabled ? "cursor-not-allowed" : selectable ? "cursor-pointer" : void 0,
7720
+ selectable && !disabled && "group-hover/tree-label:underline"
7721
+ );
7722
+ }
7723
+ function TreeSelectZone({
7724
+ selectable,
7725
+ disabled = false,
7726
+ control,
7727
+ children
7728
+ }) {
7729
+ return /* @__PURE__ */ jsxs(
7730
+ "span",
7731
+ {
7732
+ "data-tree-label": true,
7733
+ className: cn(
7734
+ "flex min-w-0 items-center gap-(--cmp-tree-item-contentGap)",
7735
+ selectable && (disabled ? "cursor-not-allowed" : "group/tree-label cursor-pointer")
7736
+ ),
7737
+ children: [
7738
+ control,
7739
+ /* @__PURE__ */ jsxs("span", { className: "flex min-w-0 items-center gap-sd-8", children: [
7740
+ children,
7741
+ selectable && !disabled && /* @__PURE__ */ jsx(
7742
+ SIcon,
7743
+ {
7744
+ name: "chevronRight",
7745
+ size: 12,
7746
+ color: "var(--sys-color-fg-quaternary)",
7747
+ className: "hidden shrink-0 group-hover/tree-label:inline-flex"
7748
+ }
7749
+ )
7750
+ ] })
7751
+ ]
7752
+ }
7700
7753
  );
7701
7754
  }
7755
+ function isRowSelectClick(event) {
7756
+ const zone = event.target.closest("[data-tree-label]");
7757
+ return zone != null && event.currentTarget.contains(zone);
7758
+ }
7702
7759
  function isRowControlClick(event) {
7703
7760
  const control = event.target.closest("[data-tree-control]");
7704
7761
  return control != null && event.currentTarget.contains(control);
@@ -7932,7 +7989,7 @@ var STreeItemImpl = /* @__PURE__ */ forwardRef(function STreeItem({
7932
7989
  };
7933
7990
  const handleRowClick = (event) => {
7934
7991
  if (isRowControlClick(event)) return;
7935
- if (selectable && event.target.closest("[data-tree-label]")) {
7992
+ if (selectable && isRowSelectClick(event)) {
7936
7993
  handleSelect(event);
7937
7994
  return;
7938
7995
  }
@@ -7973,35 +8030,41 @@ var STreeItemImpl = /* @__PURE__ */ forwardRef(function STreeItem({
7973
8030
  /* @__PURE__ */ jsxs("div", { className: TREE_CONTENT_CLASS, children: [
7974
8031
  hasChildren ? /* @__PURE__ */ jsx(TreeCaret, { expanded, onToggle: (event) => onToggle?.(node, event) }) : /* @__PURE__ */ jsx(TreeCaretSpacer, {}),
7975
8032
  leadingNode,
7976
- selectable && /* @__PURE__ */ jsx(
7977
- "span",
8033
+ /* @__PURE__ */ jsx(
8034
+ TreeSelectZone,
7978
8035
  {
7979
- "data-tree-control": true,
7980
- className: "flex shrink-0",
7981
- "aria-hidden": node.disabled ? "true" : void 0,
8036
+ selectable,
8037
+ disabled: node.disabled,
8038
+ control: selectable && /* @__PURE__ */ jsx(
8039
+ "span",
8040
+ {
8041
+ "data-tree-control": true,
8042
+ className: "flex shrink-0",
8043
+ "aria-hidden": node.disabled ? "true" : void 0,
8044
+ children: /* @__PURE__ */ jsx(
8045
+ SCheckbox,
8046
+ {
8047
+ value: checkboxValue,
8048
+ disabled: node.disabled,
8049
+ onValueChange: () => handleSelect()
8050
+ }
8051
+ )
8052
+ }
8053
+ ),
7982
8054
  children: /* @__PURE__ */ jsx(
7983
- SCheckbox,
8055
+ "span",
7984
8056
  {
7985
- value: checkboxValue,
7986
- disabled: node.disabled,
7987
- onValueChange: () => handleSelect()
8057
+ className: treeLabelClass(size, {
8058
+ emphasized: selected || indeterminate,
8059
+ disabled: Boolean(node.disabled),
8060
+ selectable
8061
+ }),
8062
+ children: node.label
7988
8063
  }
7989
8064
  )
7990
8065
  }
7991
8066
  ),
7992
- /* @__PURE__ */ jsx(
7993
- "span",
7994
- {
7995
- "data-tree-label": true,
7996
- className: treeLabelClass(size, {
7997
- emphasized: selected || indeterminate,
7998
- disabled: Boolean(node.disabled),
7999
- selectable
8000
- }),
8001
- children: node.label
8002
- }
8003
- ),
8004
- trailingNode
8067
+ trailingNode != null && /* @__PURE__ */ jsx("span", { className: "ml-auto flex shrink-0", children: trailingNode })
8005
8068
  ] })
8006
8069
  ]
8007
8070
  }
@@ -8279,7 +8342,7 @@ var SSectionHeaderCardHeaderImpl = /* @__PURE__ */ forwardRef(
8279
8342
  "span",
8280
8343
  {
8281
8344
  className: cn(
8282
- "min-w-0 truncate text-(--sys-color-fg-brand)",
8345
+ "min-w-0 truncate text-(--cmp-sectionHeaderCard-title-color)",
8283
8346
  titleSizeClass[titleSize]
8284
8347
  ),
8285
8348
  children: title
@@ -8289,7 +8352,7 @@ var SSectionHeaderCardHeaderImpl = /* @__PURE__ */ forwardRef(
8289
8352
  SIcon,
8290
8353
  {
8291
8354
  name: "asterisk",
8292
- size: 16,
8355
+ size: "var(--cmp-sectionHeaderCard-required-icon)",
8293
8356
  color: "var(--sys-color-fg-accent)",
8294
8357
  className: "shrink-0"
8295
8358
  }
@@ -8306,7 +8369,7 @@ var SSectionHeaderCardHeaderImpl = /* @__PURE__ */ forwardRef(
8306
8369
  }
8307
8370
  )
8308
8371
  ] }),
8309
- subtitle && /* @__PURE__ */ jsx("span", { className: "min-w-0 truncate text-[12px] font-normal leading-[20px] text-(--sys-color-fg-secondary)", children: subtitle }),
8372
+ subtitle && /* @__PURE__ */ jsx("span", { className: "min-w-0 truncate typo-body-sm-default text-(--cmp-sectionHeaderCard-subtitle-color)", children: subtitle }),
8310
8373
  /* @__PURE__ */ jsx("div", { className: "ml-auto flex min-h-sd-6 min-w-0 flex-1 items-center justify-end", children: slot })
8311
8374
  ]
8312
8375
  }
@@ -8342,7 +8405,7 @@ var SSectionHeaderCardRootImpl = /* @__PURE__ */ forwardRef(
8342
8405
  {
8343
8406
  ref,
8344
8407
  className: cn(
8345
- "box-border flex w-full flex-col items-stretch overflow-hidden rounded-[8px] border border-(--sys-color-border-default) bg-(--sys-color-bg-frame)",
8408
+ "box-border flex w-full flex-col items-stretch overflow-hidden rounded-(--cmp-sectionHeaderCard-radius) border border-(--cmp-sectionHeaderCard-border) bg-(--cmp-sectionHeaderCard-body-bg)",
8346
8409
  className
8347
8410
  ),
8348
8411
  ...rest,
@@ -8894,18 +8957,25 @@ var SCallout = /* @__PURE__ */ forwardRef(function SCallout2({ type = "default",
8894
8957
  hasDangerTitle && /* @__PURE__ */ jsxs(
8895
8958
  "div",
8896
8959
  {
8897
- className: "flex shrink-0 flex-col items-center justify-center gap-[var(--cmp-callout-danger-title-gap)] px-[var(--cmp-callout-danger-title-paddingX)] py-[8px] text-[16px] font-bold leading-[26px]",
8960
+ className: "typo-heading-md flex shrink-0 flex-col items-center justify-center gap-[var(--cmp-callout-danger-title-gap)] px-[var(--cmp-callout-danger-title-paddingX)] py-[8px]",
8898
8961
  style: {
8899
8962
  background: "var(--cmp-callout-danger-title-bg)",
8900
8963
  color: "var(--cmp-callout-danger-title-color)"
8901
8964
  },
8902
8965
  children: [
8903
- /* @__PURE__ */ jsx(SIcon, { name: "warningFill", size: 24, color: "var(--cmp-callout-danger-title-color)" }),
8966
+ /* @__PURE__ */ jsx(
8967
+ SIcon,
8968
+ {
8969
+ name: "warningFill",
8970
+ size: "var(--cmp-callout-danger-title-icon)",
8971
+ color: "var(--cmp-callout-danger-title-color)"
8972
+ }
8973
+ ),
8904
8974
  /* @__PURE__ */ jsx("span", { className: "whitespace-nowrap", children: DANGER_TITLE_LABEL })
8905
8975
  ]
8906
8976
  }
8907
8977
  ),
8908
- /* @__PURE__ */ jsx("div", { className: "flex min-w-0 flex-1 flex-col justify-center gap-[var(--cmp-callout-body-gap)] px-[var(--cmp-callout-body-paddingX)] py-[var(--cmp-callout-body-paddingY)] text-[12px] font-normal leading-[20px]", children: children ?? /* @__PURE__ */ jsx("ul", { className: "m-0 flex list-none flex-col justify-center gap-[var(--cmp-callout-body-gap)] p-0", children: renderItems(message) }) })
8978
+ /* @__PURE__ */ jsx("div", { className: "flex min-w-0 flex-1 flex-col justify-center gap-[var(--cmp-callout-body-gap)] px-[var(--cmp-callout-body-paddingX)] py-[var(--cmp-callout-body-paddingY)] typo-feedback-sm-regular", children: children ?? /* @__PURE__ */ jsx("ul", { className: "m-0 flex list-none flex-col justify-center gap-[var(--cmp-callout-body-gap)] p-0", children: renderItems(message) }) })
8909
8979
  ]
8910
8980
  }
8911
8981
  );
@@ -8976,7 +9046,7 @@ var SContextAlert = /* @__PURE__ */ forwardRef(function SContextAlert2({ intent
8976
9046
  className: "shrink-0"
8977
9047
  }
8978
9048
  ),
8979
- /* @__PURE__ */ jsx("div", { className: "flex min-w-0 flex-1 flex-col text-[12px] font-normal leading-[20px] text-[color:var(--cmp-contextAlert-content)]", children: messages.map((m, i) => (
9049
+ /* @__PURE__ */ jsx("div", { className: "flex min-w-0 flex-1 flex-col typo-feedback-sm-regular text-[color:var(--cmp-contextAlert-content)]", children: messages.map((m, i) => (
8980
9050
  // 메시지는 HTML 문자열을 허용하되, sanitizeInlineHtml 로 살균 후 innerHTML 렌더 (XSS 방어)
8981
9051
  /* @__PURE__ */ jsx(
8982
9052
  "p",
@@ -9221,20 +9291,20 @@ var loading = {
9221
9291
  };
9222
9292
  var SIZE_CONFIG = {
9223
9293
  sm: {
9224
- gap: 4,
9225
- iconSize: 16,
9294
+ gap: "var(--cmp-textLink-sm-gap)",
9295
+ iconSize: "var(--cmp-textLink-sm-icon)",
9226
9296
  typo: "typo-control-xs-medium",
9227
9297
  underlineTypo: "typo-control-xs-underline"
9228
9298
  },
9229
9299
  md: {
9230
- gap: 8,
9231
- iconSize: 16,
9300
+ gap: "var(--cmp-textLink-md-gap)",
9301
+ iconSize: "var(--cmp-textLink-md-icon)",
9232
9302
  typo: "typo-control-sm-default",
9233
9303
  underlineTypo: "typo-control-sm-underline"
9234
9304
  },
9235
9305
  lg: {
9236
- gap: 8,
9237
- iconSize: 20,
9306
+ gap: "var(--cmp-textLink-lg-gap)",
9307
+ iconSize: "var(--cmp-textLink-lg-icon)",
9238
9308
  typo: "typo-control-md-default",
9239
9309
  underlineTypo: "typo-control-md-underline"
9240
9310
  }
@@ -9296,15 +9366,23 @@ var STextLink = /* @__PURE__ */ forwardRef(function STextLink2({
9296
9366
  children: label || children
9297
9367
  }
9298
9368
  ),
9299
- rightArrow !== "none" && /* @__PURE__ */ jsx("span", { className: "inline-flex h-[16px] w-[16px] items-center justify-center", children: /* @__PURE__ */ jsx(
9300
- SIcon,
9369
+ rightArrow !== "none" && // 화살표 칸은 좌측 아이콘과 같은 크기다(textLink.<size>.icon 이 leadingIcon·trailingArrow 공유)
9370
+ /* @__PURE__ */ jsx(
9371
+ "span",
9301
9372
  {
9302
- name: rightArrow === "chevron" ? "chevronRight" : "caretRight",
9303
- size: 12,
9304
- color: disabled ? "var(--cmp-textLink-icon-disabled)" : "var(--color-grey-65)",
9305
- rotate: rightArrowRotate
9373
+ className: "inline-flex items-center justify-center",
9374
+ style: { width: s.iconSize, height: s.iconSize },
9375
+ children: /* @__PURE__ */ jsx(
9376
+ SIcon,
9377
+ {
9378
+ name: rightArrow === "chevron" ? "chevronRight" : "caretRight",
9379
+ size: 12,
9380
+ color: disabled ? "var(--cmp-textLink-icon-disabled)" : "var(--color-grey-65)",
9381
+ rotate: rightArrowRotate
9382
+ }
9383
+ )
9306
9384
  }
9307
- ) })
9385
+ )
9308
9386
  ]
9309
9387
  }
9310
9388
  );
@@ -9377,24 +9455,38 @@ function DropdownMenuContent({
9377
9455
  ) });
9378
9456
  }
9379
9457
  var SIZE2 = {
9380
- xs: { height: 24, paddingX: 8, gap: 6, arrow: 12, fontSize: 12, minWidth: 64, splitMinWidth: 72 },
9458
+ xs: {
9459
+ height: "var(--cmp-button-xs-height)",
9460
+ paddingX: "var(--cmp-button-xs-paddingX)",
9461
+ gap: "var(--cmp-button-dropdown-xs-gap)",
9462
+ arrow: "var(--cmp-button-dropdown-xs-arrow)",
9463
+ toggleWidth: "var(--cmp-button-iconOnly-xs-width)",
9464
+ fontSize: 12,
9465
+ minWidth: 64,
9466
+ splitMinWidth: 72,
9467
+ radius: "var(--cmp-button-radius-sm)"
9468
+ },
9381
9469
  sm: {
9382
- height: 28,
9383
- paddingX: 12,
9384
- gap: 8,
9385
- arrow: 12,
9470
+ height: "var(--cmp-button-sm-height)",
9471
+ paddingX: "var(--cmp-button-sm-paddingX)",
9472
+ gap: "var(--cmp-button-dropdown-sm-gap)",
9473
+ arrow: "var(--cmp-button-dropdown-sm-arrow)",
9474
+ toggleWidth: "var(--cmp-button-iconOnly-sm-width)",
9386
9475
  fontSize: 12,
9387
9476
  minWidth: 72,
9388
- splitMinWidth: 88
9477
+ splitMinWidth: 88,
9478
+ radius: "var(--cmp-button-radius-sm)"
9389
9479
  },
9390
9480
  md: {
9391
- height: 36,
9392
- paddingX: 20,
9393
- gap: 16,
9394
- arrow: 16,
9481
+ height: "var(--cmp-button-md-height)",
9482
+ paddingX: "var(--cmp-button-md-paddingX)",
9483
+ gap: "var(--cmp-button-dropdown-md-gap)",
9484
+ arrow: "var(--cmp-button-dropdown-md-arrow)",
9485
+ toggleWidth: "var(--cmp-button-iconOnly-md-width)",
9395
9486
  fontSize: 16,
9396
9487
  minWidth: 100,
9397
- splitMinWidth: 106
9488
+ splitMinWidth: 106,
9489
+ radius: "var(--cmp-button-radius-md)"
9398
9490
  }
9399
9491
  };
9400
9492
  function splitDivider(color, outline) {
@@ -9476,7 +9568,7 @@ var SDropdownButtonImpl = /* @__PURE__ */ forwardRef(
9476
9568
  );
9477
9569
  const splitIcon = /* @__PURE__ */ jsx(SIcon, { name: "etc", size: s.arrow, color: "var(--dd-icon)" });
9478
9570
  const triggerBase = cn(
9479
- "box-border inline-flex items-center whitespace-nowrap border border-solid outline-none transition-colors",
9571
+ "box-border inline-flex items-center whitespace-nowrap border-[length:var(--cmp-button-border-width-default)] border-solid outline-none transition-colors",
9480
9572
  "border-[color:var(--dd-border)] bg-[var(--dd-bg)] text-[color:var(--dd-text)]",
9481
9573
  disabled ? "cursor-not-allowed" : "cursor-pointer hover:bg-[var(--dd-bg-hover)]"
9482
9574
  );
@@ -9515,10 +9607,12 @@ var SDropdownButtonImpl = /* @__PURE__ */ forwardRef(
9515
9607
  type: "button",
9516
9608
  disabled,
9517
9609
  onClick: onLabelClick,
9518
- className: cn(triggerBase, "flex-1 justify-center rounded-l-[4px] border-r-0"),
9610
+ className: cn(triggerBase, "flex-1 justify-center border-r-0"),
9519
9611
  style: {
9612
+ borderTopLeftRadius: s.radius,
9613
+ borderBottomLeftRadius: s.radius,
9520
9614
  minHeight: s.height,
9521
- padding: `0 ${s.paddingX}px`,
9615
+ padding: `0 ${s.paddingX}`,
9522
9616
  fontSize: s.fontSize,
9523
9617
  ...colorVars
9524
9618
  },
@@ -9532,10 +9626,15 @@ var SDropdownButtonImpl = /* @__PURE__ */ forwardRef(
9532
9626
  type: "button",
9533
9627
  disabled,
9534
9628
  "aria-label": "\uBA54\uB274 \uC5F4\uAE30",
9535
- className: cn(triggerBase, "justify-center rounded-r-[4px] border-l"),
9629
+ className: cn(
9630
+ triggerBase,
9631
+ "justify-center border-l-[length:var(--cmp-button-border-width-default)]"
9632
+ ),
9536
9633
  style: {
9634
+ borderTopRightRadius: s.radius,
9635
+ borderBottomRightRadius: s.radius,
9537
9636
  minHeight: s.height,
9538
- minWidth: s.height,
9637
+ minWidth: s.toggleWidth,
9539
9638
  borderLeftColor: disabled ? "var(--cmp-button-border-disabled)" : splitDivider(color, outline),
9540
9639
  ...colorVars
9541
9640
  },
@@ -9549,11 +9648,12 @@ var SDropdownButtonImpl = /* @__PURE__ */ forwardRef(
9549
9648
  {
9550
9649
  type: "button",
9551
9650
  disabled,
9552
- className: cn(triggerBase, "justify-between rounded-[4px]", className),
9651
+ className: cn(triggerBase, "justify-between rounded-(--dd-radius)", className),
9553
9652
  style: {
9653
+ ...{ "--dd-radius": s.radius },
9554
9654
  minWidth: s.minWidth,
9555
9655
  minHeight: s.height,
9556
- padding: `0 ${s.paddingX}px`,
9656
+ padding: `0 ${s.paddingX}`,
9557
9657
  gap: s.gap,
9558
9658
  fontSize: s.fontSize,
9559
9659
  ...colorVars,
@@ -9663,13 +9763,13 @@ function SSwitch({
9663
9763
  style
9664
9764
  }) {
9665
9765
  const right = rightLabel;
9666
- const renderLabel = (text) => text ? /* @__PURE__ */ jsx("span", { className: "typo-body-sm-medium break-keep wrap-break-word", children: text }) : null;
9766
+ const renderLabel = (text) => text ? /* @__PURE__ */ jsx("span", { className: "typo-field-sm-medium break-keep wrap-break-word", children: text }) : null;
9667
9767
  const trackBg = disabled ? value ? "var(--cmp-switch-bg-disabled-on)" : "var(--cmp-switch-bg-disabled-off)" : value ? "var(--cmp-switch-bg-on)" : "var(--cmp-switch-bg-off)";
9668
9768
  return /* @__PURE__ */ jsxs(
9669
9769
  "label",
9670
9770
  {
9671
9771
  className: cn(
9672
- "inline-flex items-center gap-[6px]",
9772
+ "inline-flex items-center gap-(--cmp-switch-gap)",
9673
9773
  disabled ? "cursor-not-allowed" : "cursor-pointer",
9674
9774
  className
9675
9775
  ),
@@ -9683,14 +9783,14 @@ function SSwitch({
9683
9783
  disabled,
9684
9784
  onCheckedChange: (v) => onValueChange?.(v),
9685
9785
  className: cn(
9686
- "relative h-[20px] w-[32px] flex-shrink-0 rounded-full p-[2px] outline-none transition-colors duration-200",
9786
+ "relative h-(--cmp-switch-height) w-(--cmp-switch-width) flex-shrink-0 rounded-(--cmp-switch-radius) p-(--cmp-switch-paddingXY) outline-none transition-colors duration-200",
9687
9787
  disabled ? "cursor-not-allowed" : "cursor-pointer"
9688
9788
  ),
9689
9789
  style: { background: trackBg },
9690
9790
  children: /* @__PURE__ */ jsx(
9691
9791
  RSwitch.Thumb,
9692
9792
  {
9693
- className: "block h-[16px] w-[16px] rounded-full shadow-[0_2px_4px_rgba(0,0,0,0.16)] transition-transform duration-200 data-[state=checked]:translate-x-[12px]",
9793
+ className: "block h-(--cmp-switch-knob-size) w-(--cmp-switch-knob-size) rounded-full shadow-[0_2px_4px_rgba(0,0,0,0.16)] transition-transform duration-200 data-[state=checked]:translate-x-[calc(var(--cmp-switch-width)_-_var(--cmp-switch-knob-size)_-_var(--cmp-switch-paddingXY)_*_2)]",
9694
9794
  style: {
9695
9795
  background: disabled ? "var(--cmp-switch-knob-disabled)" : "var(--cmp-switch-knob-default)"
9696
9796
  }
@@ -10418,8 +10518,8 @@ var SSystemActionButton = /* @__PURE__ */ forwardRef(
10418
10518
  }
10419
10519
  );
10420
10520
  var SIZE_CLASSES = {
10421
- xs: "h-[24px] px-[8px] text-[12px] font-normal leading-[20px]",
10422
- sm: "h-[28px] px-[12px] text-[14px] font-medium leading-[24px]"
10521
+ xs: "h-(--cmp-toggle-xs-height) px-(--cmp-toggle-xs-paddingX) typo-control-xs-default",
10522
+ sm: "h-(--cmp-toggle-sm-height) px-(--cmp-toggle-sm-paddingX) typo-control-sm-default"
10423
10523
  };
10424
10524
  function SToggle({
10425
10525
  value = false,
@@ -10441,7 +10541,7 @@ function SToggle({
10441
10541
  "aria-pressed": value,
10442
10542
  onClick: () => !disabled && onValueChange?.(!value),
10443
10543
  className: cn(
10444
- "box-border inline-flex items-center justify-center whitespace-nowrap rounded-full border border-solid transition-colors",
10544
+ "box-border inline-flex items-center justify-center whitespace-nowrap rounded-(--cmp-toggle-radius) border-(length:--cmp-toggle-border-width) border-solid transition-colors",
10445
10545
  SIZE_CLASSES[size],
10446
10546
  disabled ? "cursor-not-allowed" : "cursor-pointer",
10447
10547
  // 미선택(off) hover 시 파란 채움 + 흰 글자
@@ -10527,10 +10627,17 @@ function SPopover({
10527
10627
  menuTitle && /* @__PURE__ */ jsxs(
10528
10628
  "div",
10529
10629
  {
10530
- className: "flex items-center gap-[var(--cmp-popover-title-gap)] text-[14px] font-bold leading-[24px]",
10630
+ className: "typo-feedback-md-bold flex items-center gap-[var(--cmp-popover-title-gap)]",
10531
10631
  style: { color: titleColor },
10532
10632
  children: [
10533
- titleIcon && /* @__PURE__ */ jsx(SIcon, { name: titleIcon, size: 16, color: titleColor }),
10633
+ titleIcon && /* @__PURE__ */ jsx(
10634
+ SIcon,
10635
+ {
10636
+ name: titleIcon,
10637
+ size: "var(--cmp-popover-title-leadingIcon)",
10638
+ color: titleColor
10639
+ }
10640
+ ),
10534
10641
  /* @__PURE__ */ jsx("span", { className: "min-w-0", children: menuTitle })
10535
10642
  ]
10536
10643
  }
@@ -10667,14 +10774,14 @@ function SGuide({
10667
10774
  }
10668
10775
  setOpen((o) => !o);
10669
10776
  },
10670
- className: "inline-flex h-[var(--cmp-guide-button-height)] cursor-pointer items-center gap-[var(--cmp-guide-button-gap)] whitespace-nowrap rounded-[var(--cmp-guide-button-radius)] border-[length:var(--cmp-guide-button-border-width)] border-solid px-[var(--cmp-guide-button-paddingX)] text-[12px] font-medium leading-[20px] transition-colors",
10777
+ className: "inline-flex h-[var(--cmp-guide-button-height)] cursor-pointer items-center gap-[var(--cmp-guide-button-gap)] whitespace-nowrap rounded-[var(--cmp-guide-button-radius)] border-[length:var(--cmp-guide-button-border-width)] border-solid px-[var(--cmp-guide-button-paddingX)] typo-control-xs-medium transition-colors",
10671
10778
  style: {
10672
10779
  borderColor: active ? activeBg : "var(--cmp-guide-button-border-default)",
10673
10780
  background: active ? activeBg : "var(--cmp-guide-button-bg-default)",
10674
10781
  color: active ? "var(--cmp-guide-button-text-active)" : "var(--cmp-guide-button-text-default)"
10675
10782
  },
10676
10783
  children: [
10677
- /* @__PURE__ */ jsx(SIcon, { name: iconName, size: 16, color: iconColor }),
10784
+ /* @__PURE__ */ jsx(SIcon, { name: iconName, size: "var(--cmp-guide-button-icon-size)", color: iconColor }),
10678
10785
  label || defaultLabel
10679
10786
  ]
10680
10787
  }
@@ -10724,11 +10831,11 @@ function SGuide({
10724
10831
  color: isNotion ? "var(--sys-color-fg-primary)" : "var(--cmp-guide-contents-icon)"
10725
10832
  }
10726
10833
  ),
10727
- /* @__PURE__ */ jsx("h3", { className: "m-0 break-keep text-[16px] font-bold leading-[26px] text-[color:var(--cmp-guide-contents-typography-color)]", children: popupTitle || defaultLabel })
10834
+ /* @__PURE__ */ jsx("h3", { className: "typo-heading-md m-0 break-keep text-[color:var(--cmp-guide-contents-typography-color)]", children: popupTitle || defaultLabel })
10728
10835
  ]
10729
10836
  }
10730
10837
  ),
10731
- /* @__PURE__ */ jsx("ul", { className: "m-0 mt-[var(--cmp-guide-contents-gap)] flex w-full list-none flex-col gap-[var(--cmp-guide-contents-body-gap)] p-0 text-[12px] leading-[20px] text-[color:var(--cmp-guide-contents-typography-color)]", children: messages.map((m, i) => /* @__PURE__ */ jsx(
10838
+ /* @__PURE__ */ jsx("ul", { className: "m-0 mt-[var(--cmp-guide-contents-gap)] flex w-full list-none flex-col gap-[var(--cmp-guide-contents-body-gap)] p-0 typo-field-sm-default text-[color:var(--cmp-guide-contents-typography-color)]", children: messages.map((m, i) => /* @__PURE__ */ jsx(
10732
10839
  "li",
10733
10840
  {
10734
10841
  className: cn(
@@ -10999,15 +11106,22 @@ function SConfirmModal({
10999
11106
  showClose: true,
11000
11107
  onClose: () => settle(onClose),
11001
11108
  className: "w-fit min-w-[min(520px,calc(100dvw-48px))]",
11002
- children: /* @__PURE__ */ jsxs("div", { className: "flex min-h-0 flex-auto flex-col items-center gap-[40px] px-[32px] py-[40px]", children: [
11003
- /* @__PURE__ */ jsxs("div", { className: "flex w-full min-h-0 flex-col items-center gap-[20px] overflow-y-auto", children: [
11004
- /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center gap-[12px]", children: [
11005
- iconName && /* @__PURE__ */ jsx(SIcon, { name: iconName, size: 32, color: TYPE_ICON_COLOR[type] }),
11109
+ children: /* @__PURE__ */ jsxs("div", { className: "flex min-h-0 flex-auto flex-col items-center gap-(--cmp-modal-confirm-gap) px-(--cmp-modal-confirm-paddingX) py-(--cmp-modal-confirm-paddingY)", children: [
11110
+ /* @__PURE__ */ jsxs("div", { className: "flex w-full min-h-0 flex-col items-center gap-(--cmp-modal-confirm-body-gap) overflow-y-auto", children: [
11111
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center gap-(--cmp-modal-confirm-title-gap)", children: [
11112
+ iconName && /* @__PURE__ */ jsx(
11113
+ SIcon,
11114
+ {
11115
+ name: iconName,
11116
+ size: "var(--cmp-modal-confirm-title-icon)",
11117
+ color: TYPE_ICON_COLOR[type]
11118
+ }
11119
+ ),
11006
11120
  /* @__PURE__ */ jsx(
11007
11121
  "h2",
11008
11122
  {
11009
11123
  className: cn(
11010
- "text-center text-[18px] font-bold leading-[30px] text-[color:var(--cmp-modal-confirm-title-color)]",
11124
+ "typo-heading-lg text-center text-[color:var(--cmp-modal-confirm-title-color)]",
11011
11125
  titleClassName
11012
11126
  ),
11013
11127
  children: modalTitle
@@ -11096,7 +11210,7 @@ function SOverlayHeader({
11096
11210
  {
11097
11211
  className: cn(
11098
11212
  "m-0 overflow-hidden text-ellipsis whitespace-nowrap",
11099
- "text-[16px] font-bold leading-[26px]",
11213
+ "typo-heading-md",
11100
11214
  titleClassName
11101
11215
  ),
11102
11216
  style: { color: "var(--cmp-overlay-header-title-color)" },
@@ -11191,8 +11305,8 @@ function SLoadingModal({
11191
11305
  showButton = false,
11192
11306
  buttonLabel,
11193
11307
  onButtonClick,
11194
- width = 520,
11195
- height = 320
11308
+ width = "var(--cmp-modal-loading-width)",
11309
+ height = "var(--cmp-modal-loading-height)"
11196
11310
  }) {
11197
11311
  const resolvedMessage = message ?? DEFAULT_MESSAGE[state2];
11198
11312
  const lines = Array.isArray(resolvedMessage) ? resolvedMessage : resolvedMessage ? [resolvedMessage] : [];
@@ -11208,8 +11322,15 @@ function SLoadingModal({
11208
11322
  ariaTitle: lines[0] || "\uB85C\uB529 \uC911",
11209
11323
  width,
11210
11324
  height,
11211
- children: /* @__PURE__ */ jsx("div", { className: "flex min-h-0 flex-auto flex-col overflow-y-auto px-[32px]", children: /* @__PURE__ */ jsxs("div", { className: "m-auto flex flex-col items-center gap-[20px]", children: [
11212
- state2 === "loading" ? progress !== void 0 ? /* @__PURE__ */ jsx(SCircleProgress, { value: progress }) : /* @__PURE__ */ jsx(SCircleProgress, { indeterminate: true }) : /* @__PURE__ */ jsx(SIcon, { name: "warningOutline", size: 80, color: "var(--cmp-modal-confirm-negative-icon)" }),
11325
+ children: /* @__PURE__ */ jsx("div", { className: "flex min-h-0 flex-auto flex-col overflow-y-auto px-[32px]", children: /* @__PURE__ */ jsxs("div", { className: "m-auto flex flex-col items-center gap-(--cmp-modal-loading-gap)", children: [
11326
+ state2 === "loading" ? progress !== void 0 ? /* @__PURE__ */ jsx(SCircleProgress, { value: progress }) : /* @__PURE__ */ jsx(SCircleProgress, { indeterminate: true }) : /* @__PURE__ */ jsx(
11327
+ SIcon,
11328
+ {
11329
+ name: "warningOutline",
11330
+ size: "var(--cmp-modal-loading-content)",
11331
+ color: "var(--cmp-modal-confirm-negative-icon)"
11332
+ }
11333
+ ),
11213
11334
  lines.length > 0 && /* @__PURE__ */ jsx("div", { className: "flex flex-col gap-[2px]", children: lines.map((m, i) => /* @__PURE__ */ jsx(
11214
11335
  "p",
11215
11336
  {
@@ -11997,13 +12118,8 @@ var LAUNCHER_LIST_BOX_LAYOUT = {
11997
12118
  radius: gnb("launcher-listBox-radius"),
11998
12119
  /** 패널 상하좌우 여백 */
11999
12120
  padding: gnb("launcher-listBox-paddingAll"),
12000
- /**
12001
- * 패널 그림자.
12002
- * 토큰(`component.gnb.launcher.listBox.shadow` = `{shadow.floating}`)은 값이 배열이라
12003
- * `--cmp-*` 로 나오지 않는다 — 생성기가 스칼라만 내보내기 때문이다. 그래서 그 별칭이
12004
- * 가리키는 스케일 토큰을 직접 쓴다(같은 값이다).
12005
- */
12006
- shadow: "var(--shadow-floating)",
12121
+ /** 패널 그림자 */
12122
+ shadow: gnb("launcher-listBox-shadow"),
12007
12123
  /** 줄 왼쪽 여백 */
12008
12124
  itemPaddingLeft: gnb("launcher-button-paddingLeft"),
12009
12125
  /** 줄 오른쪽 여백 — 왼쪽보다 좁다(오른쪽 끝은 hover 아이콘 자리다) */
@@ -12374,20 +12490,19 @@ var GNB_MENU = {
12374
12490
  depth3PaddingLeft: box2("item-depth3-paddingLeft"),
12375
12491
  depth1Icon: box2("item-depth1-icon"),
12376
12492
  // box 는 depth1 전용 타이포 토큰이 없어 depth1 도 selected 타이포를 따른다
12493
+ depth1Typo: "typo-navigation-lg-semibold",
12494
+ // token: gnb.box.item.typography.selected
12495
+ itemTypo: "typo-navigation-lg-medium",
12496
+ // token: gnb.box.item.typography.default
12497
+ itemTypoSelected: "typo-navigation-lg-semibold",
12498
+ // token: gnb.box.item.typography.selected
12377
12499
  depth1FontSize: 14,
12378
- // token: gnb.box.item.typography.selected.fontSize
12379
12500
  depth1LineHeight: 24,
12380
- // token: gnb.box.item.typography.selected.lineHeight
12381
12501
  depth1FontWeight: 600,
12382
- // token: gnb.box.item.typography.selected.fontWeight
12383
12502
  itemFontSize: 14,
12384
- // token: gnb.box.item.typography.default.fontSize
12385
12503
  itemLineHeight: 24,
12386
- // token: gnb.box.item.typography.default.lineHeight
12387
12504
  itemFontWeight: 500,
12388
- // token: gnb.box.item.typography.default.fontWeight
12389
12505
  itemFontWeightSelected: 600
12390
- // token: gnb.box.item.typography.selected.fontWeight
12391
12506
  },
12392
12507
  belt: {
12393
12508
  bodyPaddingY: gnb2("body-padding"),
@@ -12404,20 +12519,19 @@ var GNB_MENU = {
12404
12519
  depth3PaddingLeft: belt("item-depth3-paddingLeft"),
12405
12520
  depth1Icon: belt("item-depth1-icon"),
12406
12521
  // belt 전용 depth1 아이콘 토큰(16)
12522
+ depth1Typo: "typo-navigation-md-bold",
12523
+ // token: gnb.belt.item.depth1.typography
12524
+ itemTypo: "typo-navigation-sm-medium",
12525
+ // token: gnb.belt.item.typography.default
12526
+ itemTypoSelected: "typo-navigation-sm-bold",
12527
+ // token: gnb.belt.item.typography.selected
12407
12528
  depth1FontSize: 13,
12408
- // token: gnb.belt.item.depth1.typography.fontSize
12409
12529
  depth1LineHeight: 22,
12410
- // token: gnb.belt.item.depth1.typography.lineHeight
12411
12530
  depth1FontWeight: 700,
12412
- // token: gnb.belt.item.depth1.typography.fontWeight
12413
12531
  itemFontSize: 12,
12414
- // token: gnb.belt.item.typography.default.fontSize
12415
12532
  itemLineHeight: 20,
12416
- // token: gnb.belt.item.typography.default.lineHeight
12417
12533
  itemFontWeight: 500,
12418
- // token: gnb.belt.item.typography.default.fontWeight
12419
12534
  itemFontWeightSelected: 700
12420
- // token: gnb.belt.item.typography.selected.fontWeight
12421
12535
  }
12422
12536
  };
12423
12537
  var GNB_COLORS = {
@@ -12462,15 +12576,16 @@ var GNB_RAIL = {
12462
12576
  itemPaddingBottom: gnb2("rail-item-paddingBottom"),
12463
12577
  itemRadius: gnb2("rail-item-radius"),
12464
12578
  itemIcon: gnb2("rail-item-icon"),
12465
- // 타이포 (theme.css 에 gnb 타이포 변수 없음 → 토큰 값 직접 명시)
12579
+ // 타이포 — 토큰이 가리키는 typo-* 클래스
12580
+ itemTypo: "typo-navigation-xs-medium",
12581
+ // token: gnb.rail.item.typography.default
12582
+ itemTypoSelected: "typo-navigation-xs-bold",
12583
+ // token: gnb.rail.item.typography.selected
12584
+ // 아래 숫자는 공개 export 라 남겨 둔 같은 값이다 — 렌더에는 쓰지 않는다
12466
12585
  itemFontSize: 11,
12467
- // token: gnb.rail.item.typography.default.fontSize
12468
12586
  itemLineHeight: 18,
12469
- // token: gnb.rail.item.typography.default.lineHeight
12470
12587
  itemFontWeight: 500,
12471
- // token: gnb.rail.item.typography.default.fontWeight
12472
12588
  itemFontWeightSelected: 700
12473
- // token: gnb.rail.item.typography.selected.fontWeight
12474
12589
  };
12475
12590
  var GNB_RAIL_WIDTH = 68;
12476
12591
  var GNB_FOLD_MS = 200;
@@ -12704,7 +12819,10 @@ var SGnb = /* @__PURE__ */ forwardRef(function SGnb2({
12704
12819
  type: "button",
12705
12820
  disabled: item4.disabled,
12706
12821
  "aria-current": isActive ? "true" : void 0,
12707
- className: "box-border flex select-none flex-col items-center border-none bg-transparent transition-colors duration-150",
12822
+ className: cn(
12823
+ "box-border flex select-none flex-col items-center border-none bg-transparent transition-colors duration-150",
12824
+ isActive ? GNB_RAIL.itemTypoSelected : GNB_RAIL.itemTypo
12825
+ ),
12708
12826
  style: {
12709
12827
  width: GNB_RAIL.itemWidth,
12710
12828
  paddingTop: GNB_RAIL.itemPaddingTop,
@@ -12714,9 +12832,6 @@ var SGnb = /* @__PURE__ */ forwardRef(function SGnb2({
12714
12832
  color: isActive ? C.itemColorActive : C.railFgDefault,
12715
12833
  // <button> 의 UA 폰트를 끊고 앱 폰트를 잇는다 (메뉴 아이템과 같은 이유)
12716
12834
  fontFamily: "inherit",
12717
- fontSize: GNB_RAIL.itemFontSize,
12718
- lineHeight: `${GNB_RAIL.itemLineHeight}px`,
12719
- fontWeight: isActive ? GNB_RAIL.itemFontWeightSelected : GNB_RAIL.itemFontWeight,
12720
12835
  opacity: item4.disabled ? 0.4 : 1,
12721
12836
  cursor: item4.disabled ? "not-allowed" : "pointer"
12722
12837
  },
@@ -12755,9 +12870,6 @@ var SGnb = /* @__PURE__ */ forwardRef(function SGnb2({
12755
12870
  color: isSelected ? C.itemColorActive : isHovered ? C.itemColorHover : C.itemColorDefault,
12756
12871
  // <button> 의 UA 폰트(Arial 13.3px)를 끊고 앱 폰트를 잇는다
12757
12872
  fontFamily: "inherit",
12758
- fontSize: depth === 1 ? M.depth1FontSize : M.itemFontSize,
12759
- lineHeight: `${depth === 1 ? M.depth1LineHeight : M.itemLineHeight}px`,
12760
- fontWeight: depth === 1 ? M.depth1FontWeight : isSelected ? M.itemFontWeightSelected : M.itemFontWeight,
12761
12873
  opacity: item4.disabled ? 0.4 : 1,
12762
12874
  cursor: item4.disabled ? "not-allowed" : "pointer"
12763
12875
  };
@@ -12772,7 +12884,10 @@ var SGnb = /* @__PURE__ */ forwardRef(function SGnb2({
12772
12884
  disabled: item4.disabled,
12773
12885
  "aria-expanded": hasChildren ? isExpanded : void 0,
12774
12886
  "aria-current": isSelected ? "page" : void 0,
12775
- className: "box-border flex select-none items-center border-none bg-transparent text-left transition-colors duration-150",
12887
+ className: cn(
12888
+ "box-border flex select-none items-center border-none bg-transparent text-left transition-colors duration-150",
12889
+ depth === 1 ? M.depth1Typo : isSelected ? M.itemTypoSelected : M.itemTypo
12890
+ ),
12776
12891
  style: itemStyle,
12777
12892
  onClick: () => handleItemClick(item4),
12778
12893
  ...rowHoverProps(item4),
@@ -13958,8 +14073,10 @@ var SPageHeader = /* @__PURE__ */ withDisplayName(
13958
14073
  );
13959
14074
 
13960
14075
  // src/components/STabs/tabs.config.ts
13961
- var TAB_MAIN_SIZE = { height: 36, paddingX: 24 };
13962
- var TAB_TYPOGRAPHY = { fontSize: 12, lineHeight: 20 };
14076
+ var TAB_MAIN_SIZE = {
14077
+ height: "var(--cmp-tab-main-height)",
14078
+ paddingX: "var(--cmp-tab-main-paddingX)"
14079
+ };
13963
14080
  var TAB_MAIN_COLORS = {
13964
14081
  selected: {
13965
14082
  bg: "var(--cmp-tab-main-selected-bg)",
@@ -14004,7 +14121,7 @@ function STabs({
14004
14121
  // main(가로): baseline(하단 divider)이 100% 너비로 채워지도록 w-full
14005
14122
  sub ? "inline-flex w-fit" : "flex w-full",
14006
14123
  isVertical ? "flex-col items-stretch" : "flex-row",
14007
- sub ? isVertical ? "gap-[16px]" : "gap-[24px]" : "gap-[4px]",
14124
+ sub ? isVertical ? "gap-(--cmp-tab-sub-gap-vertical)" : "gap-(--cmp-tab-sub-gap-horizontal)" : "gap-(--cmp-tab-main-container-gap)",
14008
14125
  className
14009
14126
  ),
14010
14127
  style: containerStyle,
@@ -14014,30 +14131,26 @@ function STabs({
14014
14131
  let tabStyle;
14015
14132
  if (sub) {
14016
14133
  tabStyle = {
14017
- height: 20,
14018
- paddingBottom: 4,
14019
- fontSize: TAB_TYPOGRAPHY.fontSize,
14020
- lineHeight: `${TAB_TYPOGRAPHY.lineHeight}px`,
14134
+ height: "var(--cmp-tab-sub-item-height)",
14135
+ paddingBottom: "var(--cmp-tab-sub-content-gap)",
14021
14136
  color: selected ? TAB_SUB_COLORS.selected.text : TAB_SUB_COLORS.default.text,
14022
- borderBottom: `1px solid ${selected ? TAB_SUB_COLORS.selected.line : "transparent"}`
14137
+ borderBottom: `var(--cmp-tab-sub-border-width) solid ${selected ? TAB_SUB_COLORS.selected.line : "transparent"}`
14023
14138
  };
14024
14139
  } else {
14025
14140
  const border = selected ? TAB_MAIN_COLORS.selected.border : TAB_MAIN_COLORS.default.border;
14026
14141
  const selectedBg = TAB_MAIN_COLORS.selected.bg;
14027
14142
  tabStyle = {
14028
14143
  height: TAB_MAIN_SIZE.height,
14029
- padding: `0 ${TAB_MAIN_SIZE.paddingX}px`,
14030
- fontSize: TAB_TYPOGRAPHY.fontSize,
14031
- lineHeight: `${TAB_TYPOGRAPHY.lineHeight}px`,
14144
+ padding: `0 ${TAB_MAIN_SIZE.paddingX}`,
14032
14145
  background: selected ? TAB_MAIN_COLORS.selected.bg : TAB_MAIN_COLORS.default.bg,
14033
14146
  color: selected ? TAB_MAIN_COLORS.selected.text : TAB_MAIN_COLORS.default.text,
14034
- border: `1px solid ${border}`,
14147
+ border: `var(--cmp-tab-main-border-width) solid ${border}`,
14035
14148
  // 폴더형: 미선택 탭은 baseline 위에, 선택 탭은 baseline(파란선)을 1px 덮어 연결된 것처럼 보이게
14036
- borderTopLeftRadius: 6,
14037
- borderTopRightRadius: 6,
14149
+ borderTopLeftRadius: "var(--cmp-tab-main-radius)",
14150
+ borderTopRightRadius: "var(--cmp-tab-main-radius)",
14038
14151
  borderBottomLeftRadius: 0,
14039
14152
  borderBottomRightRadius: 0,
14040
- borderBottom: selected ? `1px solid ${selectedBg}` : "none",
14153
+ borderBottom: selected ? `var(--cmp-tab-main-border-width) solid ${selectedBg}` : "none",
14041
14154
  marginBottom: selected ? -1 : 0
14042
14155
  };
14043
14156
  }
@@ -14074,12 +14187,17 @@ function STabs({
14074
14187
  moveTo(tabs.length - 1);
14075
14188
  }
14076
14189
  },
14077
- className: "relative box-border inline-flex cursor-pointer select-none items-center justify-center gap-[8px] whitespace-nowrap outline-none transition-[color,background-color] duration-200",
14190
+ className: cn(
14191
+ "relative box-border inline-flex cursor-pointer select-none items-center justify-center whitespace-nowrap outline-none transition-[color,background-color] duration-200",
14192
+ sub ? "gap-[8px]" : "gap-(--cmp-tab-main-gap)",
14193
+ // 타이포 (token: tab.<main|sub>.<selected|default>.typography)
14194
+ selected ? "typo-navigation-sm-bold" : "typo-navigation-sm-default"
14195
+ ),
14078
14196
  style: tabStyle,
14079
14197
  children: [
14080
14198
  /* @__PURE__ */ jsxs("span", { className: "grid", children: [
14081
14199
  /* @__PURE__ */ jsx("span", { "aria-hidden": true, className: "invisible font-bold", style: { gridArea: "1 / 1" }, children: tab.label }),
14082
- /* @__PURE__ */ jsx("span", { style: { gridArea: "1 / 1", fontWeight: selected ? 700 : 400 }, children: tab.label })
14200
+ /* @__PURE__ */ jsx("span", { style: { gridArea: "1 / 1" }, children: tab.label })
14083
14201
  ] }),
14084
14202
  tab.badge !== void 0 && tab.badge !== null && tab.badge !== "" && /* @__PURE__ */ jsx(
14085
14203
  STag,
@@ -14130,7 +14248,7 @@ function SPagination({
14130
14248
  "aria-label": aria,
14131
14249
  onClick,
14132
14250
  className: "flex h-[var(--cmp-pagination-height)] w-[var(--cmp-pagination-height)] cursor-pointer items-center justify-center rounded-[var(--cmp-pagination-radius)] border-none bg-transparent hover:bg-[var(--cmp-pagination-item-bg-hover)]",
14133
- children: /* @__PURE__ */ jsx(SIcon, { name: icon, size: 12, color: "var(--color-grey-65)" })
14251
+ children: /* @__PURE__ */ jsx(SIcon, { name: icon, size: "var(--cmp-pagination-icon)", color: "var(--color-grey-65)" })
14134
14252
  }
14135
14253
  );
14136
14254
  const prevButtons = simple ? currentPage > 1 && /* @__PURE__ */ jsxs(Fragment, { children: [
@@ -14154,8 +14272,8 @@ function SPagination({
14154
14272
  style,
14155
14273
  children: [
14156
14274
  /* @__PURE__ */ jsx("div", { className: "flex min-w-[calc(var(--cmp-pagination-height)*2+var(--cmp-pagination-move-gap))] items-center justify-end gap-[var(--cmp-pagination-move-gap)]", children: prevButtons }),
14157
- simple ? /* @__PURE__ */ jsxs("div", { className: "flex h-[var(--cmp-pagination-height)] items-center gap-[var(--cmp-pagination-simple-gap)] px-[var(--cmp-pagination-paddingX)] text-[12px] font-medium leading-[20px] text-[color:var(--cmp-pagination-item-content-default)]", children: [
14158
- /* @__PURE__ */ jsx("span", { className: "font-bold text-[color:var(--cmp-pagination-item-content-selected)]", children: currentPage }),
14275
+ simple ? /* @__PURE__ */ jsxs("div", { className: "flex h-[var(--cmp-pagination-height)] items-center gap-[var(--cmp-pagination-simple-gap)] px-[var(--cmp-pagination-paddingX)] typo-control-xs-medium text-[color:var(--cmp-pagination-item-content-default)]", children: [
14276
+ /* @__PURE__ */ jsx("span", { className: "typo-control-xs-bold text-[color:var(--cmp-pagination-item-content-selected)]", children: currentPage }),
14159
14277
  /* @__PURE__ */ jsx("span", { children: "/" }),
14160
14278
  /* @__PURE__ */ jsx("span", { children: lastPage })
14161
14279
  ] }) : /* @__PURE__ */ jsx("div", { className: "flex items-center gap-[var(--cmp-pagination-move-gap)]", children: pageNumbers.map((n) => {
@@ -14167,8 +14285,8 @@ function SPagination({
14167
14285
  "aria-current": selected ? "page" : void 0,
14168
14286
  onClick: () => go(n),
14169
14287
  className: cn(
14170
- "box-border flex h-[var(--cmp-pagination-height)] cursor-pointer items-center justify-center rounded-[var(--cmp-pagination-radius)] border-none px-[var(--cmp-pagination-paddingX)] text-[12px] leading-[20px]",
14171
- selected ? "bg-[var(--cmp-pagination-item-bg-selected)] font-bold text-[color:var(--cmp-pagination-item-content-selected)]" : "bg-transparent font-medium text-[color:var(--cmp-pagination-item-content-default)] hover:bg-[var(--cmp-pagination-item-bg-hover)] hover:text-[color:var(--cmp-pagination-item-content-hover)]"
14288
+ "box-border flex h-[var(--cmp-pagination-height)] cursor-pointer items-center justify-center rounded-[var(--cmp-pagination-radius)] border-none px-[var(--cmp-pagination-paddingX)]",
14289
+ selected ? "bg-[var(--cmp-pagination-item-bg-selected)] typo-control-xs-bold text-[color:var(--cmp-pagination-item-content-selected)]" : "bg-transparent typo-control-xs-medium text-[color:var(--cmp-pagination-item-content-default)] hover:bg-[var(--cmp-pagination-item-bg-hover)] hover:text-[color:var(--cmp-pagination-item-content-hover)]"
14172
14290
  ),
14173
14291
  style: { width: itemWidth },
14174
14292
  children: n
@@ -14191,15 +14309,18 @@ var STEPPER_SIZE_CONFIG = {
14191
14309
  sequenceSize: V2("sm-sequence-size"),
14192
14310
  fontSize: "12px",
14193
14311
  lineHeight: "20px",
14194
- fontWeightActive: 700,
14195
- fontWeightDefault: 500
14312
+ typoDefault: "typo-navigation-sm-medium",
14313
+ typoActive: "typo-navigation-sm-bold",
14314
+ fontWeightActive: 700
14196
14315
  },
14197
14316
  lg: {
14198
14317
  sequenceSize: V2("lg-sequence-size"),
14199
14318
  fontSize: "14px",
14200
14319
  lineHeight: "24px",
14201
- fontWeightActive: 700,
14202
- fontWeightDefault: 500
14320
+ typoDefault: "typo-navigation-lg-medium",
14321
+ // 토큰(navigation.lg.semibold)은 600 인데 지금 700 으로 그린다 — 값이 달라 토큰을 쓰지 않는다
14322
+ typoActive: null,
14323
+ fontWeightActive: 700
14203
14324
  }
14204
14325
  };
14205
14326
  var STEPPER_LAYOUT = {
@@ -14225,7 +14346,9 @@ var STEPPER_COLORS = {
14225
14346
  sequenceText: {
14226
14347
  active: V2("sequence-text-active"),
14227
14348
  default: V2("sequence-text-default"),
14228
- completed: VF("sequence-text-completed", "#0075FF")
14349
+ // 완료 시퀀스의 체크 아이콘 색은 전용 토큰이 없다(stepper.sequence.text 에 completed 가 없음).
14350
+ // 진행 중 시퀀스 숫자와 같은 accent 색을 시맨틱 토큰으로 직접 쓴다.
14351
+ completed: "var(--sys-color-fg-accent)"
14229
14352
  },
14230
14353
  text: {
14231
14354
  active: V2("text-active"),
@@ -14240,14 +14363,15 @@ var STEPPER_HORIZONTAL_COMPLETED_COLORS = {
14240
14363
  text: STEPPER_COLORS.text.completed
14241
14364
  };
14242
14365
  var STEPPER_VERTICAL_LAYOUT = {
14243
- width: VF("vertical-width", "240px"),
14366
+ /** 세로형 폭. 대응 토큰이 없어 디자인 값을 그대로 쓴다(stepper.vertical 에 width 가 없음). */
14367
+ width: "240px",
14244
14368
  itemGap: VF("vertical-item-gap", "12px"),
14245
14369
  itemPaddingX: VF("vertical-item-paddingX", "16px"),
14246
14370
  itemPaddingY: VF("vertical-item-paddingY", "8px"),
14247
14371
  titlePaddingTop: VF("vertical-title-paddingTop", "12px"),
14248
14372
  titlePaddingBottom: VF("vertical-title-paddingBottom", "4px"),
14249
- titleFontSize: VF("vertical-title-font-size", "11px"),
14250
- titleLineHeight: VF("vertical-title-line-height", "18px"),
14373
+ /** 구간 제목 타이포 — stepper.vertical.title.typography (= heading.xxs) */
14374
+ titleTypo: "typo-heading-xxs",
14251
14375
  accentStripeWidth: VF("vertical-item-accentStripe-width", "2px"),
14252
14376
  accentStripeColor: VF("vertical-item-accentStripe-color", "#64ABFF")
14253
14377
  };
@@ -14257,6 +14381,7 @@ var STEPPER_VERTICAL_COLORS = {
14257
14381
  hover: VF("vertical-item-bg-hover", "#F6F6F6"),
14258
14382
  selected: VF("vertical-item-bg-selected", "#EFF6FF")
14259
14383
  },
14384
+ titleBg: V2("vertical-title-bg"),
14260
14385
  titleText: VF("vertical-title-text", "#004290"),
14261
14386
  textDefault: STEPPER_COLORS.text.default,
14262
14387
  textCompleted: STEPPER_COLORS.text.completed,
@@ -14264,9 +14389,10 @@ var STEPPER_VERTICAL_COLORS = {
14264
14389
  sequenceBgActive: STEPPER_COLORS.sequenceBg.active,
14265
14390
  sequenceTextActive: STEPPER_COLORS.sequenceText.active,
14266
14391
  sequenceTextDefault: STEPPER_COLORS.sequenceText.default,
14267
- sequenceBorderCompleted: VF("vertical-sequence-border-completed", "#93C4FF"),
14268
- sequenceBgCompleted: VF("vertical-sequence-bg-completed", "#EFF6FF"),
14269
- sequenceIconCompleted: VF("vertical-sequence-icon-completed", "#0075FF"),
14392
+ // 세로형 전용 completed 토큰은 없다 — 가로형과 같은 sequence.*.completed 를 쓴다.
14393
+ sequenceBorderCompleted: STEPPER_COLORS.sequenceBorder.completed,
14394
+ sequenceBgCompleted: STEPPER_COLORS.sequenceBg.completed,
14395
+ sequenceIconCompleted: STEPPER_COLORS.sequenceText.completed,
14270
14396
  errorBadge: "#FB4444"
14271
14397
  };
14272
14398
  var ERROR_TOOLTIP_MESSAGE = "\uD655\uC778\uC774 \uD544\uC694\uD55C \uD56D\uBAA9\uC774 \uC788\uC2B5\uB2C8\uB2E4.";
@@ -14429,10 +14555,12 @@ var SStepper = /* @__PURE__ */ forwardRef(function SStepper2({
14429
14555
  if (isHorizontalCompleted) return STEPPER_HORIZONTAL_COMPLETED_COLORS.sequenceIcon;
14430
14556
  return STEPPER_COLORS.sequenceText[state2];
14431
14557
  })();
14558
+ const emphasized = state2 === "active" || isVertical && hovered;
14559
+ const itemTypo = emphasized ? config.typoActive : config.typoDefault;
14432
14560
  const itemStyle = {
14433
14561
  gap: STEPPER_LAYOUT.itemGap,
14434
14562
  color: itemColor,
14435
- fontWeight: state2 === "active" || isVertical && hovered ? config.fontWeightActive : config.fontWeightDefault
14563
+ fontWeight: itemTypo ? void 0 : config.fontWeightActive
14436
14564
  };
14437
14565
  const sequenceStyle = {
14438
14566
  width: config.sequenceSize,
@@ -14449,7 +14577,7 @@ var SStepper = /* @__PURE__ */ forwardRef(function SStepper2({
14449
14577
  {
14450
14578
  role: roleListItem ? "listitem" : void 0,
14451
14579
  "aria-current": roleListItem && state2 === "active" ? "step" : void 0,
14452
- className: "inline-flex items-center whitespace-nowrap",
14580
+ className: cn("inline-flex items-center whitespace-nowrap", itemTypo),
14453
14581
  style: itemStyle,
14454
14582
  children: [
14455
14583
  /* @__PURE__ */ jsx(
@@ -14495,7 +14623,7 @@ var SStepper = /* @__PURE__ */ forwardRef(function SStepper2({
14495
14623
  className: cn("relative inline-flex flex-col items-start", className),
14496
14624
  style: {
14497
14625
  width: STEPPER_VERTICAL_LAYOUT.width,
14498
- // 폭은 토큰이 정하되 부모보다 넓어지지 않는다 — 부모가 세로 스크롤바만큼 좁아지면 따라 줄어
14626
+ // 폭은 디자인 값(전용 토큰 없음)이되 부모보다 넓어지지 않는다 — 부모가 세로 스크롤바만큼 좁아지면 따라 줄어
14499
14627
  // 가로 넘침(가로 스크롤바)이 생기지 않는다
14500
14628
  maxWidth: "100%",
14501
14629
  fontSize: config.fontSize,
@@ -14527,18 +14655,18 @@ var SStepper = /* @__PURE__ */ forwardRef(function SStepper2({
14527
14655
  group.group && /* @__PURE__ */ jsx(
14528
14656
  "div",
14529
14657
  {
14530
- className: "flex w-full items-center overflow-hidden",
14658
+ className: cn(
14659
+ "flex w-full items-center overflow-hidden",
14660
+ STEPPER_VERTICAL_LAYOUT.titleTypo
14661
+ ),
14531
14662
  style: {
14532
14663
  gap: STEPPER_VERTICAL_LAYOUT.itemGap,
14533
14664
  paddingLeft: STEPPER_VERTICAL_LAYOUT.itemPaddingX,
14534
14665
  paddingRight: STEPPER_VERTICAL_LAYOUT.itemPaddingX,
14535
14666
  paddingTop: STEPPER_VERTICAL_LAYOUT.titlePaddingTop,
14536
14667
  paddingBottom: STEPPER_VERTICAL_LAYOUT.titlePaddingBottom,
14537
- background: STEPPER_VERTICAL_COLORS.itemBg.default,
14538
- color: STEPPER_VERTICAL_COLORS.titleText,
14539
- fontSize: STEPPER_VERTICAL_LAYOUT.titleFontSize,
14540
- lineHeight: STEPPER_VERTICAL_LAYOUT.titleLineHeight,
14541
- fontWeight: 700
14668
+ background: STEPPER_VERTICAL_COLORS.titleBg,
14669
+ color: STEPPER_VERTICAL_COLORS.titleText
14542
14670
  },
14543
14671
  children: /* @__PURE__ */ jsx("span", { className: "whitespace-nowrap", children: group.group })
14544
14672
  }
@@ -15117,8 +15245,8 @@ var CalendarDayCard = /* @__PURE__ */ forwardRef(function CalendarDayCard2({
15117
15245
  {
15118
15246
  className: cn(
15119
15247
  "inline-flex size-(--cmp-calendarBoard-daySequence-size) items-center justify-center rounded-(--cmp-calendarBoard-daySequence-radius)",
15120
- isToday ? "typo-body-md-bold bg-(--cmp-calendarBoard-daySequence-bg-today) text-(--cmp-calendarBoard-daySequence-text-today)" : cn(
15121
- "typo-body-md-medium",
15248
+ isToday ? "typo-item-md-selected bg-(--cmp-calendarBoard-daySequence-bg-today) text-(--cmp-calendarBoard-daySequence-text-today)" : cn(
15249
+ "typo-item-md-default",
15122
15250
  inCurrentMonth ? "text-(--cmp-calendarBoard-daySequence-text-default)" : "text-(--cmp-calendarBoard-daySequence-text-otherMonth)"
15123
15251
  ),
15124
15252
  // 오늘이 아니면서 선택된 날은 테두리 원으로 표시한다 (오늘은 이미 채운 원이라 겹치지 않는다).
@@ -15676,14 +15804,12 @@ function clampToAvailableHeight(value, availableHeight) {
15676
15804
  }
15677
15805
  var FONT = {
15678
15806
  sm: {
15679
- fontSize: 12,
15680
- lineHeight: 20,
15807
+ typo: "typo-field-sm-default",
15681
15808
  paddingX: "var(--cmp-textinput-sm-paddingX)",
15682
15809
  gap: "var(--cmp-textinput-sm-gap)"
15683
15810
  },
15684
15811
  md: {
15685
- fontSize: 14,
15686
- lineHeight: 24,
15812
+ typo: "typo-field-md-default",
15687
15813
  paddingX: "var(--cmp-textinput-md-paddingX)",
15688
15814
  gap: "var(--cmp-textinput-md-gap)"
15689
15815
  }
@@ -15722,12 +15848,10 @@ var SSearchInput = /* @__PURE__ */ forwardRef(function SSearchInput2({
15722
15848
  children: /* @__PURE__ */ jsxs(
15723
15849
  "div",
15724
15850
  {
15725
- className: "flex h-full w-full items-center",
15851
+ className: cn("flex h-full w-full items-center", f.typo),
15726
15852
  style: {
15727
15853
  gap: f.gap,
15728
- padding: `0 ${f.paddingX}`,
15729
- fontSize: f.fontSize,
15730
- lineHeight: `${f.lineHeight}px`
15854
+ padding: `0 ${f.paddingX}`
15731
15855
  },
15732
15856
  children: [
15733
15857
  /* @__PURE__ */ jsx(
@@ -15788,6 +15912,18 @@ var SSearchInput = /* @__PURE__ */ forwardRef(function SSearchInput2({
15788
15912
  );
15789
15913
  });
15790
15914
 
15915
+ // src/lib/list-box-item.ts
15916
+ var LIST_BOX_ITEM_PADDING_LEFT = {
15917
+ 1: "var(--cmp-listBoxItem-paddingLeft-depth1)",
15918
+ 2: "var(--cmp-listBoxItem-paddingLeft-depth2)",
15919
+ 3: "var(--cmp-listBoxItem-paddingLeft-depth3)"
15920
+ };
15921
+ var LIST_BOX_ITEM_PADDING_Y_RIGHT = {
15922
+ paddingTop: "var(--cmp-listBoxItem-paddingY)",
15923
+ paddingBottom: "var(--cmp-listBoxItem-paddingY)",
15924
+ paddingRight: "var(--cmp-listBoxItem-paddingRight)"
15925
+ };
15926
+
15791
15927
  // src/components/SSelect/select.config.ts
15792
15928
  function flattenOptions(options, depth = 1, inheritDisabled = true) {
15793
15929
  const out = [];
@@ -16061,6 +16197,14 @@ var SSelectImpl = /* @__PURE__ */ forwardRef(function SSelect({
16061
16197
  }, [insideModal, pendingOpen, portalContainer]);
16062
16198
  const requestOpenRef = useRef(requestOpen);
16063
16199
  requestOpenRef.current = requestOpen;
16200
+ useEffect(() => {
16201
+ if (!label || effectiveDisabled) return;
16202
+ const labelEl = document.getElementById(fieldLabelId(triggerId));
16203
+ if (!labelEl) return;
16204
+ const toggle = () => requestOpenRef.current(!open);
16205
+ labelEl.addEventListener("click", toggle);
16206
+ return () => labelEl.removeEventListener("click", toggle);
16207
+ }, [label, effectiveDisabled, triggerId, open]);
16064
16208
  useImperativeHandle(
16065
16209
  ref,
16066
16210
  () => ({
@@ -16342,6 +16486,7 @@ var SSelectImpl = /* @__PURE__ */ forwardRef(function SSelect({
16342
16486
  const handleClear = () => {
16343
16487
  emit3([]);
16344
16488
  if (rules && rules.length > 0) setRuleError(runRules(multi ? [] : "", rules));
16489
+ triggerRef.current?.focus();
16345
16490
  };
16346
16491
  const handleRemoveChip = (targets) => {
16347
16492
  const remove = new Set(targets);
@@ -16537,6 +16682,15 @@ var SSelectImpl = /* @__PURE__ */ forwardRef(function SSelect({
16537
16682
  commitOpen(false);
16538
16683
  }
16539
16684
  };
16685
+ const handleTriggerKeyDown = (event) => {
16686
+ if (event.target !== event.currentTarget || effectiveDisabled) return;
16687
+ if (event.key === " " || !open && event.key === "Enter") {
16688
+ event.preventDefault();
16689
+ requestOpen(!open);
16690
+ return;
16691
+ }
16692
+ handleKeyDown(event);
16693
+ };
16540
16694
  return /* @__PURE__ */ jsxs(
16541
16695
  SField,
16542
16696
  {
@@ -16564,23 +16718,28 @@ var SSelectImpl = /* @__PURE__ */ forwardRef(function SSelect({
16564
16718
  children: [
16565
16719
  name && /* @__PURE__ */ jsx("input", { type: "hidden", name, value: selected.join(",") }),
16566
16720
  /* @__PURE__ */ jsxs(
16567
- "button",
16721
+ "div",
16568
16722
  {
16569
16723
  ref: triggerRef,
16570
16724
  id: triggerId,
16571
- type: "button",
16572
- disabled: effectiveDisabled,
16573
- "aria-labelledby": label ? `${fieldLabelId(triggerId)} ${triggerId}` : void 0,
16725
+ role: "combobox",
16726
+ tabIndex: effectiveDisabled ? -1 : 0,
16727
+ "aria-disabled": effectiveDisabled || void 0,
16728
+ "aria-labelledby": label ? `${fieldLabelId(triggerId)} ${triggerId}` : triggerId,
16574
16729
  "aria-haspopup": isTree ? "tree" : "listbox",
16575
16730
  "aria-expanded": open,
16576
16731
  "aria-controls": open ? listboxId : void 0,
16577
16732
  "aria-activedescendant": open && focusedIndex >= 0 ? activeOptionId : void 0,
16578
16733
  "aria-busy": showTriggerSpinner || void 0,
16579
- onClick: () => requestOpen(!open),
16580
- onKeyDown: handleKeyDown,
16734
+ onClick: () => {
16735
+ if (effectiveDisabled) return;
16736
+ requestOpen(!open);
16737
+ },
16738
+ onKeyDown: handleTriggerKeyDown,
16581
16739
  className: cn(
16582
- "flex h-full w-full cursor-pointer items-center justify-between bg-transparent text-left outline-none disabled:cursor-not-allowed",
16583
- size === "md" ? "typo-body-md-default gap-(--cmp-select-md-gap) px-(--cmp-select-md-paddingX)" : "typo-body-sm-default gap-(--cmp-select-sm-gap) px-(--cmp-select-sm-paddingX)"
16740
+ "flex h-full w-full items-center justify-between bg-transparent text-left outline-none",
16741
+ effectiveDisabled ? "cursor-not-allowed" : "cursor-pointer",
16742
+ size === "md" ? "typo-field-md-default gap-(--cmp-select-md-gap) px-(--cmp-select-md-paddingX)" : "typo-field-sm-default gap-(--cmp-select-sm-gap) px-(--cmp-select-sm-paddingX)"
16584
16743
  ),
16585
16744
  style: {
16586
16745
  // 칩 한 줄이 기본 높이 안에서 세로 가운데에 오는 여백. 줄이 늘면 같은 여백을 유지한 채 트리거가 커진다.
@@ -16702,7 +16861,7 @@ var SSelectImpl = /* @__PURE__ */ forwardRef(function SSelect({
16702
16861
  "div",
16703
16862
  {
16704
16863
  ref: searchBarRef,
16705
- className: "sticky top-0 z-[1] bg-[var(--cmp-listBox-bg)] px-(--cmp-listBoxItem-search-paddingX) py-(--cmp-listBoxItem-search-paddingY)",
16864
+ className: "sticky top-0 z-[1] border-b-(length:--border-width-1) border-solid border-[color:var(--sys-color-divider-default)] bg-[var(--cmp-listBox-bg)] px-(--cmp-listBoxItem-search-paddingX) py-(--cmp-listBoxItem-search-paddingY)",
16706
16865
  children: /* @__PURE__ */ jsx(
16707
16866
  SSearchInput,
16708
16867
  {
@@ -16737,7 +16896,6 @@ var SSelectImpl = /* @__PURE__ */ forwardRef(function SSelect({
16737
16896
  groupLeafValues,
16738
16897
  focusedValue: navigableItems[focusedIndex]?.key,
16739
16898
  showSelectAll: selectAllVisible,
16740
- searchVisible,
16741
16899
  selectAllLabel: allSelectedLabel,
16742
16900
  selectAllSelected: allSelected,
16743
16901
  onSelectAll: handleSelectAll,
@@ -16794,7 +16952,6 @@ function ItemList({
16794
16952
  groupLeafValues,
16795
16953
  focusedValue,
16796
16954
  showSelectAll,
16797
- searchVisible,
16798
16955
  selectAllLabel,
16799
16956
  selectAllSelected,
16800
16957
  onSelectAll,
@@ -16805,7 +16962,7 @@ function ItemList({
16805
16962
  const selectedSet = useMemo(() => new Set(selected), [selected]);
16806
16963
  const checkboxShiftRef = useRef(false);
16807
16964
  const itemBase = cn(
16808
- "group/select-item flex w-full cursor-pointer select-none items-center gap-[8px] border-none bg-transparent text-left text-[12px] leading-[20px] outline-none",
16965
+ "group/select-item flex w-full cursor-pointer select-none items-center gap-(--cmp-listBoxItem-gap) border-none bg-transparent text-left typo-field-sm-default outline-none",
16809
16966
  "text-[color:var(--cmp-listBoxItem-content-default)]",
16810
16967
  "disabled:cursor-not-allowed disabled:text-[color:var(--cmp-listBoxItem-content-disabled)]"
16811
16968
  );
@@ -16842,7 +16999,7 @@ function ItemList({
16842
16999
  itemBase,
16843
17000
  focusedValue === "__select_all__" && "bg-[var(--cmp-listBoxItem-bg-hover)] text-[color:var(--cmp-listBoxItem-content-hover)]"
16844
17001
  ),
16845
- style: { paddingTop: 4, paddingBottom: 4, paddingRight: 12, paddingLeft: 12 },
17002
+ style: { ...LIST_BOX_ITEM_PADDING_Y_RIGHT, paddingLeft: LIST_BOX_ITEM_PADDING_LEFT[1] },
16846
17003
  onMouseEnter: () => onHoverValue("__select_all__"),
16847
17004
  onMouseLeave: () => onHoverValue(null),
16848
17005
  onClick: onSelectAll,
@@ -16855,7 +17012,7 @@ function ItemList({
16855
17012
  topSpacer > 0 && /* @__PURE__ */ jsx("div", { "aria-hidden": true, style: { height: topSpacer } }),
16856
17013
  items.map((o, windowIndex) => {
16857
17014
  const idx = windowIndex + indexOffset;
16858
- const padLeft = o.depth === 1 ? 12 : o.depth === 2 ? 20 : 28;
17015
+ const padLeft = LIST_BOX_ITEM_PADDING_LEFT[o.depth === 1 ? 1 : o.depth === 2 ? 2 : 3];
16859
17016
  const rowKey = `${o.value}-${idx}`;
16860
17017
  if (tree) {
16861
17018
  const togglesLeaves = multi && o.isGroup;
@@ -16897,15 +17054,20 @@ function ItemList({
16897
17054
  TREE_LABEL_TYPOGRAPHY.sm.rowHeight,
16898
17055
  TREE_ROW_BORDER_CLASS,
16899
17056
  "select-none",
16900
- rowDisabled ? "cursor-not-allowed" : "cursor-pointer",
17057
+ o.isGroup && "cursor-pointer",
16901
17058
  focused && TREE_ROW_ACTIVE_CLASS
16902
17059
  ),
16903
17060
  onMouseEnter: () => onHoverValue(focusKey),
16904
17061
  onMouseLeave: () => onHoverValue(null),
16905
17062
  onClick: (event) => {
16906
- if (isRowControlClick(event) || rowDisabled) return;
16907
- if (togglesLeaves) onToggleGroup(leafValues);
16908
- else onSelect(o.value, idx, event.shiftKey);
17063
+ if (isRowControlClick(event)) return;
17064
+ if (isRowSelectClick(event)) {
17065
+ if (rowDisabled) return;
17066
+ if (togglesLeaves) onToggleGroup(leafValues);
17067
+ else onSelect(o.value, idx, event.shiftKey);
17068
+ return;
17069
+ }
17070
+ if (o.isGroup) onToggleExpand(o.value);
16909
17071
  },
16910
17072
  children: [
16911
17073
  /* @__PURE__ */ jsx(
@@ -16924,27 +17086,41 @@ function ItemList({
16924
17086
  // 비활성 그룹도 접고 편다 — 그룹이 비활성이어도 아래에 고를 수 있는 자식이 있을 수 있다.
16925
17087
  /* @__PURE__ */ jsx(TreeCaret, { expanded, onToggle: () => onToggleExpand(o.value) })
16926
17088
  ) : /* @__PURE__ */ jsx(TreeCaretSpacer, {}),
16927
- multi && /* @__PURE__ */ jsx(
16928
- "span",
16929
- {
16930
- "data-tree-control": true,
16931
- className: "flex shrink-0",
16932
- onPointerDownCapture: (event) => {
16933
- checkboxShiftRef.current = event.shiftKey;
16934
- },
16935
- children: /* @__PURE__ */ jsx(SCheckbox, { value: checkState, disabled: rowDisabled, onValueChange: toggle })
16936
- }
16937
- ),
16938
17089
  /* @__PURE__ */ jsx(
16939
- OptionLabel,
17090
+ TreeSelectZone,
16940
17091
  {
16941
- label: o.label,
16942
- className: treeLabelClass("sm", {
16943
- // 고른 줄은 굵게 — multi_tree 는 일부만 고른 그룹도 굵다 (STree 와 같다)
16944
- emphasized: checkState !== false,
16945
- disabled: rowDisabled,
16946
- selectable: true
16947
- })
17092
+ selectable: true,
17093
+ disabled: rowDisabled,
17094
+ control: multi && /* @__PURE__ */ jsx(
17095
+ "span",
17096
+ {
17097
+ "data-tree-control": true,
17098
+ className: "flex shrink-0",
17099
+ onPointerDownCapture: (event) => {
17100
+ checkboxShiftRef.current = event.shiftKey;
17101
+ },
17102
+ children: /* @__PURE__ */ jsx(
17103
+ SCheckbox,
17104
+ {
17105
+ value: checkState,
17106
+ disabled: rowDisabled,
17107
+ onValueChange: toggle
17108
+ }
17109
+ )
17110
+ }
17111
+ ),
17112
+ children: /* @__PURE__ */ jsx(
17113
+ OptionLabel,
17114
+ {
17115
+ label: o.label,
17116
+ className: treeLabelClass("sm", {
17117
+ // 고른 줄은 굵게 — multi_tree 는 일부만 고른 그룹도 굵다 (STree 와 같다)
17118
+ emphasized: checkState !== false,
17119
+ disabled: rowDisabled,
17120
+ selectable: true
17121
+ })
17122
+ }
17123
+ )
16948
17124
  }
16949
17125
  )
16950
17126
  ] })
@@ -16956,7 +17132,7 @@ function ItemList({
16956
17132
  }
16957
17133
  if (o.isGroup) {
16958
17134
  const isDepth1 = o.depth === 1;
16959
- const isFirstRow = idx === 0 && !showSelectAll && !searchVisible;
17135
+ const isFirstRow = idx === 0 && !showSelectAll;
16960
17136
  const groupTone = cn(
16961
17137
  isDepth1 ? "bg-[var(--cmp-listBoxItem-depth1-bg-default)] font-bold" : "bg-[var(--cmp-listBoxItem-depth2-middle-bg)] font-medium",
16962
17138
  isDepth1 && !isFirstRow && "border-t border-solid border-[color:var(--cmp-listBoxItem-depth1-border-color)]"
@@ -16981,7 +17157,7 @@ function ItemList({
16981
17157
  "data-select-focused": groupFocused ? "true" : void 0,
16982
17158
  "data-select-active": groupFocused ? "true" : void 0,
16983
17159
  className: cn(
16984
- "flex w-full select-none items-center gap-[8px] border-none py-[4px] pr-[12px] text-left text-[12px] leading-[20px] text-[color:var(--cmp-listBoxItem-content-default)]",
17160
+ "flex w-full select-none items-center gap-(--cmp-listBoxItem-gap) border-none py-(--cmp-listBoxItem-paddingY) pr-(--cmp-listBoxItem-paddingRight) text-left typo-field-sm-default text-[color:var(--cmp-listBoxItem-content-default)]",
16985
17161
  groupTone,
16986
17162
  groupDisabled ? "cursor-not-allowed text-[color:var(--cmp-listBoxItem-content-disabled)]" : "cursor-pointer",
16987
17163
  groupDisabled && isDepth1 && "bg-[var(--cmp-listBoxItem-depth1-bg-disabled)]",
@@ -17022,7 +17198,7 @@ function ItemList({
17022
17198
  "data-select-row": true,
17023
17199
  "data-index": idx,
17024
17200
  className: cn(
17025
- "select-none py-[4px] pr-[12px] text-[12px] leading-[20px] text-[color:var(--cmp-listBoxItem-content-default)]",
17201
+ "select-none py-(--cmp-listBoxItem-paddingY) pr-(--cmp-listBoxItem-paddingRight) typo-field-sm-default text-[color:var(--cmp-listBoxItem-content-default)]",
17026
17202
  groupTone,
17027
17203
  // 하위가 전부 비활성이면(select.config 에서 bubble-up) 어미 그룹도 비활성 처리:
17028
17204
  // 텍스트는 회색(#888), depth1 그룹은 파란 배경 대신 회색(#EEE)으로 (depth2 는 #F6F6F6 유지)
@@ -17058,7 +17234,7 @@ function ItemList({
17058
17234
  // (:hover 는 disabled 버튼에도 매칭되므로 클래스 자체를 붙이지 않아야 한다)
17059
17235
  !o.disabled && activeClass
17060
17236
  ),
17061
- style: { paddingTop: 4, paddingBottom: 4, paddingRight: 12, paddingLeft: padLeft },
17237
+ style: { ...LIST_BOX_ITEM_PADDING_Y_RIGHT, paddingLeft: padLeft },
17062
17238
  onMouseEnter: () => onHoverValue(o.value),
17063
17239
  onMouseLeave: () => onHoverValue(null),
17064
17240
  onClick: (event) => onSelect(o.value, idx, event.shiftKey),
@@ -17087,40 +17263,17 @@ function TriggerLabel({ label }) {
17087
17263
  return /* @__PURE__ */ jsx(OptionLabel, { label, className: "truncate" });
17088
17264
  }
17089
17265
  function TriggerRemoveButton({ ariaLabel, onRemove }) {
17090
- return /* @__PURE__ */ jsxs(
17091
- "span",
17266
+ return /* @__PURE__ */ jsx(
17267
+ SGhostButton,
17092
17268
  {
17093
- role: "button",
17094
- tabIndex: 0,
17095
- "aria-label": ariaLabel,
17096
- className: "group/select-remove relative inline-flex shrink-0 cursor-pointer items-center justify-center",
17097
- style: {
17098
- width: "var(--cmp-ghostButton-xxs-size)",
17099
- height: "var(--cmp-ghostButton-xxs-size)",
17100
- borderRadius: "var(--cmp-ghostButton-radius-sm)"
17101
- },
17269
+ icon: "close",
17270
+ size: "xxs",
17271
+ ariaLabel,
17272
+ className: "shrink-0",
17102
17273
  onClick: (event) => {
17103
- event.preventDefault();
17104
- event.stopPropagation();
17105
- onRemove();
17106
- },
17107
- onKeyDown: (event) => {
17108
- if (event.key !== "Enter" && event.key !== " ") return;
17109
- event.preventDefault();
17110
17274
  event.stopPropagation();
17111
17275
  onRemove();
17112
- },
17113
- children: [
17114
- /* @__PURE__ */ jsx(
17115
- "span",
17116
- {
17117
- "aria-hidden": true,
17118
- className: "pointer-events-none absolute inset-0 rounded-[inherit] opacity-0 transition-opacity duration-200 group-hover/select-remove:opacity-5",
17119
- style: { background: "var(--cmp-ghostButton-default-hover-bg)" }
17120
- }
17121
- ),
17122
- /* @__PURE__ */ jsx(SIcon, { name: "close", size: 12, color: "var(--cmp-ghostButton-default-content)" })
17123
- ]
17276
+ }
17124
17277
  }
17125
17278
  );
17126
17279
  }
@@ -17134,7 +17287,7 @@ function CheckboxBox({
17134
17287
  "span",
17135
17288
  {
17136
17289
  className: cn(
17137
- "flex h-[16px] w-[16px] flex-shrink-0 items-center justify-center rounded-[2px] border border-solid",
17290
+ "flex size-(--cmp-checkbox-size) flex-shrink-0 items-center justify-center rounded-(--cmp-checkbox-radius) border-(length:--cmp-checkbox-borderWidth) border-solid",
17138
17291
  disabled ? (
17139
17292
  // 비활성: 회색 채움(#E1E1E1) + 회색 테두리(#CCCCCC)
17140
17293
  "cursor-not-allowed border-[color:var(--cmp-checkbox-border-disabled)] bg-[var(--cmp-checkbox-bg-disabled)]"
@@ -17144,7 +17297,7 @@ function CheckboxBox({
17144
17297
  SIcon,
17145
17298
  {
17146
17299
  name: state2 === null ? "checkboxIndeterminate" : "checkboxCheck",
17147
- size: 12,
17300
+ size: "var(--cmp-checkbox-icon)",
17148
17301
  color: disabled ? "var(--cmp-checkbox-checked-icon-disabled)" : "var(--cmp-checkbox-checked-icon-default)"
17149
17302
  }
17150
17303
  )
@@ -17777,7 +17930,7 @@ var STableImpl = /* @__PURE__ */ forwardRef(function STable({
17777
17930
  "span",
17778
17931
  {
17779
17932
  onMouseDown: (e) => startResize(i, e),
17780
- 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",
17933
+ className: "absolute right-0 top-1/2 z-[5] flex h-[var(--cmp-table-header-resizingBar-height)] w-[9px] -translate-y-1/2 cursor-col-resize items-center justify-end",
17781
17934
  "aria-hidden": true,
17782
17935
  children: /* @__PURE__ */ jsx("span", { className: "h-full w-[4px] border-x border-solid border-[color:var(--cmp-table-header-resizingBar-color)]" })
17783
17936
  },
@@ -17840,7 +17993,7 @@ var STableImpl = /* @__PURE__ */ forwardRef(function STable({
17840
17993
  colSpan: group.colSpan,
17841
17994
  rowSpan: group.rowSpan,
17842
17995
  className: cn(
17843
- "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)]",
17996
+ "relative border-b border-r border-solid border-[color:var(--cmp-table-border-color)] bg-[var(--cmp-table-header-bg)] px-[var(--cmp-table-header-paddingX)] typo-table-header text-[color:var(--sys-color-fg-primary)]",
17844
17997
  group.firstIndex + group.colSpan === visibleCols.length && "border-r-0",
17845
17998
  group.rowSpan === 2 && "border-b-0",
17846
17999
  group.className
@@ -17882,7 +18035,7 @@ var STableImpl = /* @__PURE__ */ forwardRef(function STable({
17882
18035
  "span",
17883
18036
  {
17884
18037
  "aria-hidden": true,
17885
- 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)]"
18038
+ className: "pointer-events-none absolute right-0 top-1/2 h-[var(--cmp-table-header-resizingBar-height)] w-px -translate-y-1/2 bg-[var(--cmp-table-header-resizingBar-color)]"
17886
18039
  }
17887
18040
  )
17888
18041
  ]
@@ -17903,7 +18056,7 @@ var STableImpl = /* @__PURE__ */ forwardRef(function STable({
17903
18056
  // 세로 가운데도 어긋난다. 글자 줄높이는 아래 th__content 가 다시 준다.
17904
18057
  headerGroupInfo && "border-r border-solid border-[color:var(--cmp-table-border-color)]",
17905
18058
  headerGroupInfo && i === visibleCols.length - 1 && "border-r-0",
17906
- "relative bg-[var(--cmp-table-header-bg)] px-[16px] text-[12px] font-medium leading-[0] text-[color:var(--sys-color-fg-primary)]",
18059
+ "relative bg-[var(--cmp-table-header-bg)] px-[var(--cmp-table-header-paddingX)] typo-table-header leading-[0] text-[color:var(--sys-color-fg-primary)]",
17907
18060
  stickyInfo(i).isSticky && "z-[6]",
17908
18061
  col.thClass
17909
18062
  ),
@@ -17922,7 +18075,7 @@ var STableImpl = /* @__PURE__ */ forwardRef(function STable({
17922
18075
  // 원본 th__content: align에 따라 justify-content 적용 (th도 정렬 반영)
17923
18076
  // th 가 leading-[0] 이므로 글자 줄높이는 여기서 준다 (truncate 가
17924
18077
  // overflow-hidden 이라 줄높이가 0이면 라벨이 잘려 사라진다).
17925
- "inline-flex w-full min-w-0 items-center gap-[4px] leading-[20px]",
18078
+ "inline-flex w-full min-w-0 items-center gap-[var(--cmp-table-header-gap)] leading-[20px]",
17926
18079
  col.align === "center" && "justify-center",
17927
18080
  col.align === "right" && "justify-end"
17928
18081
  ),
@@ -18820,8 +18973,8 @@ function useTruncatedValueTooltip({
18820
18973
  };
18821
18974
  }
18822
18975
  var FONT2 = {
18823
- sm: { fontSize: 12, lineHeight: 20, paddingX: "var(--cmp-textinput-sm-paddingX)" },
18824
- md: { fontSize: 14, lineHeight: 24, paddingX: "var(--cmp-textinput-md-paddingX)" }
18976
+ sm: { typo: "typo-field-sm-default", paddingX: "var(--cmp-textinput-sm-paddingX)" },
18977
+ md: { typo: "typo-field-md-default", paddingX: "var(--cmp-textinput-md-paddingX)" }
18825
18978
  };
18826
18979
  var SInput = /* @__PURE__ */ forwardRef(function SInput2({
18827
18980
  value,
@@ -18914,12 +19067,11 @@ var SInput = /* @__PURE__ */ forwardRef(function SInput2({
18914
19067
  {
18915
19068
  className: cn(
18916
19069
  "flex h-full w-full items-center",
19070
+ f.typo,
18917
19071
  size === "md" ? "gap-[var(--cmp-textinput-md-gap)]" : "gap-[var(--cmp-textinput-sm-gap)]"
18918
19072
  ),
18919
19073
  style: {
18920
- padding: `0 ${f.paddingX}`,
18921
- fontSize: f.fontSize,
18922
- lineHeight: `${f.lineHeight}px`
19074
+ padding: `0 ${f.paddingX}`
18923
19075
  },
18924
19076
  children: [
18925
19077
  prefix != null && /* @__PURE__ */ jsx("span", { className: "flex flex-shrink-0 items-center", children: prefix }),
@@ -18993,8 +19145,8 @@ var SInput = /* @__PURE__ */ forwardRef(function SInput2({
18993
19145
  );
18994
19146
  });
18995
19147
  var PAD2 = {
18996
- sm: { fontSize: 12, lineHeight: 20, stepper: 20, icon: 12 },
18997
- md: { fontSize: 14, lineHeight: 24, stepper: 24, icon: 14 }
19148
+ sm: { typo: "typo-field-sm-default", icon: 12 },
19149
+ md: { typo: "typo-field-md-default", icon: 14 }
18998
19150
  };
18999
19151
  var toNumber = (val) => {
19000
19152
  if (val === null || val === void 0 || val === "") return null;
@@ -19229,7 +19381,7 @@ var SNumberInput = /* @__PURE__ */ forwardRef(function SNumberInput2({
19229
19381
  onClick: dir === "inc" ? increment : decrement,
19230
19382
  className: cn(
19231
19383
  "flex flex-shrink-0 items-center justify-center border border-solid border-transparent transition-colors",
19232
- off ? "cursor-not-allowed" : "cursor-pointer hover:border-[var(--color-border-accentLight)]"
19384
+ off ? "cursor-not-allowed" : "cursor-pointer hover:border-[var(--cmp-numberInput-stepper-border-default)]"
19233
19385
  ),
19234
19386
  style: {
19235
19387
  width: `var(--cmp-numberInput-stepper-${size}-size)`,
@@ -19278,13 +19430,11 @@ var SNumberInput = /* @__PURE__ */ forwardRef(function SNumberInput2({
19278
19430
  children: /* @__PURE__ */ jsxs(
19279
19431
  "div",
19280
19432
  {
19281
- className: "flex h-full w-full items-center",
19433
+ className: cn("flex h-full w-full items-center", p.typo),
19282
19434
  style: {
19283
19435
  // 원본 sd-number-input: content gap = padding-x 토큰 (gap 토큰 아님)
19284
19436
  gap: `var(--cmp-numberInput-${size}-paddingX)`,
19285
- padding: `0 ${showButton ? padX : `calc(${padX} * 2)`}`,
19286
- fontSize: p.fontSize,
19287
- lineHeight: `${p.lineHeight}px`
19437
+ padding: `0 ${showButton ? padX : `calc(${padX} * 2)`}`
19288
19438
  },
19289
19439
  children: [
19290
19440
  showButton && stepper("dec"),
@@ -19570,7 +19720,7 @@ function SCalendar({
19570
19720
  onClick: () => view(y - 1, m)
19571
19721
  }
19572
19722
  ),
19573
- /* @__PURE__ */ jsx("span", { className: "inline-flex min-w-[40px] items-center justify-center text-center text-[14px] font-medium leading-[24px]", children: y }),
19723
+ /* @__PURE__ */ jsx("span", { className: "inline-flex min-w-[40px] items-center justify-center text-center typo-field-md-medium", children: y }),
19574
19724
  /* @__PURE__ */ jsx(
19575
19725
  SGhostButton,
19576
19726
  {
@@ -19595,7 +19745,7 @@ function SCalendar({
19595
19745
  }
19596
19746
  }
19597
19747
  ),
19598
- /* @__PURE__ */ jsxs("span", { className: "inline-flex w-full min-w-[40px] items-center justify-center text-center text-[14px] font-medium leading-[24px]", children: [
19748
+ /* @__PURE__ */ jsxs("span", { className: "inline-flex w-full min-w-[40px] items-center justify-center text-center typo-field-md-medium", children: [
19599
19749
  m,
19600
19750
  "\uC6D4"
19601
19751
  ] }),
@@ -19672,7 +19822,7 @@ function SCalendar({
19672
19822
  }) }),
19673
19823
  legend.length > 0 && /* @__PURE__ */ jsxs(Fragment, { children: [
19674
19824
  /* @__PURE__ */ jsx(SDivider, {}),
19675
- /* @__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((item4) => /* @__PURE__ */ jsxs(
19825
+ /* @__PURE__ */ jsx("div", { className: "flex flex-wrap items-center justify-center gap-x-[var(--cmp-datepicker-calendar-legend-group-gap)] gap-y-[4px] typo-field-xs-default", children: legend.map((item4) => /* @__PURE__ */ jsxs(
19676
19826
  "span",
19677
19827
  {
19678
19828
  className: "inline-flex items-center gap-[var(--cmp-datepicker-calendar-legend-gap)]",
@@ -19700,10 +19850,10 @@ function SCalendar({
19700
19850
  var MODE_LIST_HEIGHT = 240;
19701
19851
  var MODE_ITEM_HEIGHT = 28;
19702
19852
  var modeListItemClass = (selected, disabled) => cn(
19703
- "flex w-full items-center justify-center gap-[var(--cmp-datepicker-mode-item-gap)] border-0 px-[var(--cmp-datepicker-mode-item-paddingX)] py-[var(--cmp-datepicker-mode-item-paddingY)] text-center font-base text-12 leading-[20px]",
19704
- disabled && "cursor-not-allowed bg-[var(--cmp-datepicker-mode-item-bg-default)] font-medium text-[color:var(--cmp-datepicker-mode-item-content-disabled)]",
19705
- !disabled && !selected && "cursor-pointer bg-[var(--cmp-datepicker-mode-item-bg-default)] font-medium text-[color:var(--cmp-datepicker-mode-item-content-default)] hover:bg-[var(--cmp-datepicker-mode-item-bg-hover)] hover:text-[color:var(--cmp-datepicker-mode-item-content-hover)]",
19706
- !disabled && selected && "cursor-pointer bg-[var(--cmp-datepicker-mode-item-bg-default)] font-bold text-[color:var(--cmp-datepicker-mode-item-content-selected)]"
19853
+ "flex w-full items-center justify-center gap-[var(--cmp-datepicker-mode-item-gap)] border-0 px-[var(--cmp-datepicker-mode-item-paddingX)] py-[var(--cmp-datepicker-mode-item-paddingY)] text-center",
19854
+ disabled && "typo-field-sm-medium cursor-not-allowed bg-[var(--cmp-datepicker-mode-item-bg-default)] text-[color:var(--cmp-datepicker-mode-item-content-disabled)]",
19855
+ !disabled && !selected && "typo-field-sm-medium cursor-pointer bg-[var(--cmp-datepicker-mode-item-bg-default)] text-[color:var(--cmp-datepicker-mode-item-content-default)] hover:bg-[var(--cmp-datepicker-mode-item-bg-hover)] hover:text-[color:var(--cmp-datepicker-mode-item-content-hover)]",
19856
+ !disabled && selected && "typo-field-sm-bold cursor-pointer bg-[var(--cmp-datepicker-mode-item-bg-default)] text-[color:var(--cmp-datepicker-mode-item-content-selected)]"
19707
19857
  );
19708
19858
  var MODE_NOUN = {
19709
19859
  date: "\uB0A0\uC9DC",
@@ -20013,9 +20163,9 @@ function SDatePicker({
20013
20163
  const resolvedError = error || ruleError !== "";
20014
20164
  const resolvedStatus = status ?? (rules && rules.length > 0 ? ruleError !== "" ? "error" : void 0 : void 0);
20015
20165
  const baseDims = size === "md" ? {
20016
- padX: 16,
20017
- gap: 12,
20018
- icon: 20,
20166
+ padX: "var(--cmp-datepicker-md-paddingX)",
20167
+ gap: "var(--cmp-datepicker-md-gap)",
20168
+ icon: "var(--cmp-datepicker-md-icon)",
20019
20169
  minW: 104,
20020
20170
  fieldMinW: 168,
20021
20171
  // 값 길이가 YYYY-MM-DD 로 정해져 있어, width="100%" 를 받아도 행 전체로
@@ -20023,19 +20173,20 @@ function SDatePicker({
20023
20173
  // px 가 아니라 등급이라 --cmp-field-width-* 가 바뀌면 함께 따라간다.
20024
20174
  // 이 기본 상한이 걸리적거리는 자리(폭이 이미 좁게 정해진 팝오버 등)는 maxWidth prop 으로 덮는다
20025
20175
  fieldMaxW: "lg",
20176
+ // 요일 폭 계산에 숫자가 필요해 남긴다. 렌더 타이포는 typo 가 맡는다
20026
20177
  fontSize: 14,
20027
- lineHeight: 24,
20028
- radius: 6
20178
+ typo: "typo-field-md-default",
20179
+ radius: "var(--cmp-datepicker-md-radius)"
20029
20180
  } : {
20030
- padX: 12,
20031
- gap: 8,
20032
- icon: 16,
20181
+ padX: "var(--cmp-datepicker-sm-paddingX)",
20182
+ gap: "var(--cmp-datepicker-sm-gap)",
20183
+ icon: "var(--cmp-datepicker-sm-icon)",
20033
20184
  minW: 80,
20034
20185
  fieldMinW: 128,
20035
20186
  fieldMaxW: "md",
20036
20187
  fontSize: 12,
20037
- lineHeight: 20,
20038
- radius: 4
20188
+ typo: "typo-field-sm-default",
20189
+ radius: "var(--cmp-datepicker-sm-radius)"
20039
20190
  };
20040
20191
  const weekdayW = weekday ? weekdaySuffixWidth(baseDims.fontSize) : 0;
20041
20192
  const dims = {
@@ -20106,7 +20257,7 @@ function SDatePicker({
20106
20257
  "flex h-full w-full items-center overflow-hidden bg-transparent outline-none",
20107
20258
  disabled ? "cursor-not-allowed" : "cursor-pointer"
20108
20259
  ),
20109
- style: { padding: `0 ${dims.padX}px`, gap: dims.gap, borderRadius: dims.radius },
20260
+ style: { padding: `0 ${dims.padX}`, gap: dims.gap, borderRadius: dims.radius },
20110
20261
  children: [
20111
20262
  /* @__PURE__ */ jsx(
20112
20263
  SIcon,
@@ -20121,11 +20272,9 @@ function SDatePicker({
20121
20272
  "span",
20122
20273
  {
20123
20274
  id: triggerTextId,
20124
- className: "flex-1 truncate text-center",
20275
+ className: cn("flex-1 truncate text-center", dims.typo),
20125
20276
  style: {
20126
20277
  minWidth: dims.minW,
20127
- fontSize: dims.fontSize,
20128
- lineHeight: `${dims.lineHeight}px`,
20129
20278
  color: disabled ? "var(--cmp-datepicker-text-disabled)" : hasValue ? "var(--cmp-datepicker-text-default)" : "var(--cmp-field-hint-color)"
20130
20279
  },
20131
20280
  children: hasValue ? weekday ? withWeekday(value) : value : resolvedPlaceholder
@@ -20336,7 +20485,7 @@ function RangeCalendar({
20336
20485
  className: cn(!isLeft && "invisible pointer-events-none")
20337
20486
  }
20338
20487
  ),
20339
- /* @__PURE__ */ jsxs("span", { className: "inline-flex min-w-[40px] flex-1 items-center justify-center text-center text-[14px] font-medium leading-[24px]", children: [
20488
+ /* @__PURE__ */ jsxs("span", { className: "inline-flex min-w-[40px] flex-1 items-center justify-center text-center typo-field-md-medium", children: [
20340
20489
  gy,
20341
20490
  ".",
20342
20491
  String(gm).padStart(2, "0")
@@ -20404,14 +20553,14 @@ function RangeCalendar({
20404
20553
  const hour = which === "start" ? sH : eH;
20405
20554
  const minute = which === "start" ? sM : eM;
20406
20555
  const num = (n, strip) => active && n !== "" ? strip ? String(Number(n)) : n : "-";
20407
- const INPUT_CLS = "h-[var(--cmp-datepicker-sm-height)] w-[40px] rounded-[var(--cmp-datepicker-sm-radius)] border border-solid border-[color:var(--cmp-datepicker-border-default)] bg-[var(--cmp-datepicker-bg-default)] text-center text-[12px] font-medium leading-[20px] text-[color:var(--cmp-datepicker-text-default)] outline-none placeholder:text-[color:var(--cmp-datepicker-text-disabled)] focus:border-[color:var(--cmp-datepicker-border-focus)] disabled:cursor-not-allowed";
20556
+ const INPUT_CLS = "h-[var(--cmp-datepicker-sm-height)] w-[40px] rounded-[var(--cmp-datepicker-sm-radius)] border-[length:var(--cmp-datepicker-border-width)] border-solid border-[color:var(--cmp-datepicker-border-default)] bg-[var(--cmp-datepicker-bg-default)] text-center typo-field-sm-medium text-[color:var(--cmp-datepicker-text-default)] outline-none placeholder:text-[color:var(--cmp-datepicker-text-disabled)] focus:border-[color:var(--cmp-datepicker-border-focus)] disabled:cursor-not-allowed";
20408
20557
  const LABEL = "text-[color:var(--cmp-datepicker-calendar-time-date-label)]";
20409
20558
  const UNIT = "text-[color:var(--cmp-datepicker-calendar-time-date-unit)]";
20410
20559
  return /* @__PURE__ */ jsxs(
20411
20560
  "div",
20412
20561
  {
20413
20562
  className: cn(
20414
- "flex flex-1 items-center justify-center gap-[var(--cmp-datepicker-calendar-time-section-gap)] rounded-[var(--cmp-datepicker-calendar-time-radius)] px-[var(--cmp-datepicker-calendar-time-paddingX)] py-[var(--cmp-datepicker-calendar-time-paddingY)] text-[12px] font-medium leading-[20px]",
20563
+ "flex flex-1 items-center justify-center gap-[var(--cmp-datepicker-calendar-time-section-gap)] rounded-[var(--cmp-datepicker-calendar-time-radius)] px-[var(--cmp-datepicker-calendar-time-paddingX)] py-[var(--cmp-datepicker-calendar-time-paddingY)] typo-field-sm-medium",
20415
20564
  active ? "bg-[var(--cmp-datepicker-calendar-time-bg-selected)]" : "bg-[var(--cmp-datepicker-calendar-time-bg-default)]"
20416
20565
  ),
20417
20566
  children: [
@@ -20473,7 +20622,7 @@ function RangeCalendar({
20473
20622
  ),
20474
20623
  children: [
20475
20624
  /* @__PURE__ */ jsxs("div", { className: "relative flex items-center justify-center", children: [
20476
- /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-center gap-[var(--cmp-datepicker-calendar-gap)] text-[14px] font-medium leading-[24px]", children: [
20625
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-center gap-[var(--cmp-datepicker-calendar-gap)] typo-field-md-medium", children: [
20477
20626
  /* @__PURE__ */ jsx(SGhostButton, { icon: "chevronLeft", size: "xxs", ariaLabel: "prevYear", onClick: goPrevYear }),
20478
20627
  /* @__PURE__ */ jsx("span", { className: "inline-flex min-w-[40px] items-center justify-center text-center", children: y }),
20479
20628
  /* @__PURE__ */ jsx(SGhostButton, { icon: "chevronRight", size: "xxs", ariaLabel: "nextYear", onClick: goNextYear })
@@ -20570,28 +20719,29 @@ function SDateRangePicker({
20570
20719
  const resolvedError = error || ruleError !== "";
20571
20720
  const resolvedStatus = status ?? (rules && rules.length > 0 ? ruleError !== "" ? "error" : void 0 : void 0);
20572
20721
  const baseDims = size === "md" ? {
20573
- padX: 16,
20574
- gap: 12,
20575
- icon: 20,
20722
+ padX: "var(--cmp-datepicker-md-paddingX)",
20723
+ gap: "var(--cmp-datepicker-md-gap)",
20724
+ icon: "var(--cmp-datepicker-md-icon)",
20576
20725
  minW: 104,
20577
20726
  fieldMinW: 260,
20578
20727
  // xl — 값이 `YYYY-MM-DD ~ YYYY-MM-DD` 라 단일 날짜의 두 배가 넘는다.
20579
20728
  // 최소너비(260)가 이미 lg 를 넘으므로 상한도 한 등급 위여야 한다
20580
20729
  fieldMaxW: "xl",
20730
+ // 요일 폭 계산에 숫자가 필요해 남긴다. 렌더 타이포는 typo 가 맡는다
20581
20731
  fontSize: 14,
20582
- lineHeight: 24,
20583
- radius: 6
20732
+ typo: "typo-field-md-default",
20733
+ radius: "var(--cmp-datepicker-md-radius)"
20584
20734
  } : {
20585
- padX: 12,
20586
- gap: 8,
20587
- icon: 16,
20735
+ padX: "var(--cmp-datepicker-sm-paddingX)",
20736
+ gap: "var(--cmp-datepicker-sm-gap)",
20737
+ icon: "var(--cmp-datepicker-sm-icon)",
20588
20738
  minW: 80,
20589
20739
  fieldMinW: 216,
20590
20740
  // lg — 최소너비 216 이 md 를 넘어 md 로는 담기지 않는다
20591
20741
  fieldMaxW: "lg",
20592
20742
  fontSize: 12,
20593
- lineHeight: 20,
20594
- radius: 4
20743
+ typo: "typo-field-sm-default",
20744
+ radius: "var(--cmp-datepicker-sm-radius)"
20595
20745
  };
20596
20746
  const weekdayW = showWeekday ? weekdaySuffixWidth(baseDims.fontSize) * 2 : 0;
20597
20747
  const dims = {
@@ -20668,7 +20818,7 @@ function SDateRangePicker({
20668
20818
  "flex h-full w-full items-center overflow-hidden bg-transparent outline-none",
20669
20819
  disabled ? "cursor-not-allowed" : "cursor-pointer"
20670
20820
  ),
20671
- style: { padding: `0 ${dims.padX}px`, gap: dims.gap, borderRadius: dims.radius },
20821
+ style: { padding: `0 ${dims.padX}`, gap: dims.gap, borderRadius: dims.radius },
20672
20822
  children: [
20673
20823
  /* @__PURE__ */ jsx(
20674
20824
  SIcon,
@@ -20685,12 +20835,11 @@ function SDateRangePicker({
20685
20835
  id: triggerTextId,
20686
20836
  className: cn(
20687
20837
  "flex-1 items-center",
20838
+ dims.typo,
20688
20839
  hasDisplay ? "flex" : "block truncate text-center"
20689
20840
  ),
20690
20841
  style: {
20691
20842
  minWidth: dims.minW,
20692
- fontSize: dims.fontSize,
20693
- lineHeight: `${dims.lineHeight}px`,
20694
20843
  color: disabled ? "var(--cmp-datepicker-text-disabled)" : hasDisplay ? "var(--cmp-datepicker-text-default)" : "var(--cmp-field-hint-color)"
20695
20844
  },
20696
20845
  children: hasDisplay ? /* @__PURE__ */ jsxs(Fragment, { children: [
@@ -20845,8 +20994,9 @@ var SChipImpl = /* @__PURE__ */ forwardRef(function SChip({
20845
20994
  {
20846
20995
  "aria-disabled": disabled ? "true" : void 0,
20847
20996
  className: cn(
20848
- "box-border inline-flex h-[var(--cmp-chip-height)] max-w-full items-center justify-center gap-[var(--cmp-chip-gap)] overflow-hidden whitespace-nowrap border-[length:var(--cmp-chip-border-width)] border-solid px-[var(--cmp-chip-paddingX)] text-[12px] leading-[20px] select-none",
20849
- editing ? "font-normal" : "font-medium",
20997
+ "box-border inline-flex h-[var(--cmp-chip-height)] max-w-full items-center justify-center gap-[var(--cmp-chip-gap)] overflow-hidden whitespace-nowrap border-[length:var(--cmp-chip-border-width)] border-solid px-[var(--cmp-chip-paddingX)] select-none",
20998
+ // chip.typography.focus / .default
20999
+ editing ? "typo-control-xs-default" : "typo-control-xs-medium",
20850
21000
  disabled ? "cursor-not-allowed" : "",
20851
21001
  className
20852
21002
  ),
@@ -21018,7 +21168,7 @@ function SFilePicker({
21018
21168
  const resolvedError = error || ruleError !== "";
21019
21169
  const resolvedStatus = status ?? (rules?.length ? ruleError !== "" ? "error" : void 0 : void 0);
21020
21170
  const padX = size === "md" ? "var(--cmp-filepicker-md-paddingX)" : "var(--cmp-filepicker-sm-paddingX)";
21021
- const iconSize = size === "md" ? 20 : 16;
21171
+ const iconSize = size === "md" ? "var(--cmp-filepicker-md-icon)" : "var(--cmp-filepicker-sm-icon)";
21022
21172
  const gapCls = size === "md" ? "gap-[var(--cmp-filepicker-md-gap)]" : "gap-[var(--cmp-filepicker-sm-gap)]";
21023
21173
  const inlinePlaceholder = inline && !disabled && !hasFiles;
21024
21174
  const showListbox = multiple && showMultipleListBox;
@@ -21072,7 +21222,8 @@ function SFilePicker({
21072
21222
  {
21073
21223
  id: displayTextId,
21074
21224
  className: cn(
21075
- "min-w-0 flex-1 truncate text-[12px]",
21225
+ "min-w-0 flex-1 truncate",
21226
+ size === "md" ? "typo-field-md-default" : "typo-field-sm-default",
21076
21227
  inlinePlaceholder && "text-[color:var(--cmp-filepicker-text-placeholder)] transition-colors group-hover/filepicker:text-[color:var(--cmp-filepicker-text-default)]"
21077
21228
  ),
21078
21229
  style: inlinePlaceholder ? void 0 : {
@@ -21246,10 +21397,10 @@ function SKeyValueTable({
21246
21397
  skipOccupied();
21247
21398
  maxCols = Math.max(maxCols, col, occupied.length);
21248
21399
  });
21249
- const radiusClass = radius === "full" ? "rounded-none" : radius === "useTop" ? "rounded-b-[8px] rounded-t-none" : "rounded-[8px]";
21400
+ const radiusClass = radius === "full" ? "rounded-none" : radius === "useTop" ? "rounded-b-[var(--cmp-table-radius)] rounded-t-none" : "rounded-[var(--cmp-table-radius)]";
21250
21401
  const frameClass = cn(
21251
21402
  "overflow-hidden",
21252
- bordered && "border border-solid border-[color:var(--cmp-table-border-color)]",
21403
+ bordered && "border-[length:var(--cmp-table-border-width)] border-solid border-[color:var(--cmp-table-border-color)]",
21253
21404
  radiusClass
21254
21405
  );
21255
21406
  const table = /* @__PURE__ */ jsxs(
@@ -21285,7 +21436,7 @@ function SKeyValueTable({
21285
21436
  paddingBottom: cellPadY
21286
21437
  },
21287
21438
  children: /* @__PURE__ */ jsxs("div", { className: "flex h-full w-full items-center justify-between gap-[var(--cmp-table-header-gap)]", children: [
21288
- /* @__PURE__ */ jsxs("div", { className: "inline-flex items-center gap-[8px]", children: [
21439
+ /* @__PURE__ */ jsxs("div", { className: "inline-flex items-center gap-[var(--cmp-table-content-gap)]", children: [
21289
21440
  /* @__PURE__ */ jsx("span", { className: "text-[12px] font-bold leading-[20px] text-[color:var(--sys-color-fg-primary)]", children: f.label }),
21290
21441
  f.required && /* @__PURE__ */ jsx(SIcon, { name: "asterisk", size: 12, color: "var(--sys-color-fg-accent)" })
21291
21442
  ] }),
@@ -23393,22 +23544,15 @@ function SToast({
23393
23544
  ...style
23394
23545
  },
23395
23546
  children: [
23396
- icon && /* @__PURE__ */ jsx(SIcon, { name: icon, size: 16, color: iconColor }),
23397
- /* @__PURE__ */ jsx(
23398
- "span",
23399
- {
23400
- className: "text-[14px] font-medium leading-[24px] text-nowrap",
23401
- style: { color: content },
23402
- children: message
23403
- }
23404
- ),
23547
+ icon && /* @__PURE__ */ jsx(SIcon, { name: icon, size: "var(--cmp-toast-icon)", color: iconColor }),
23548
+ /* @__PURE__ */ jsx("span", { className: "typo-feedback-md-medium text-nowrap", style: { color: content }, children: message }),
23405
23549
  link && /* @__PURE__ */ jsx(
23406
23550
  "a",
23407
23551
  {
23408
23552
  href: link,
23409
23553
  target: "_blank",
23410
23554
  rel: "noopener noreferrer",
23411
- className: "text-[14px] font-bold leading-[24px] underline text-nowrap",
23555
+ className: "typo-feedback-md-underline text-nowrap",
23412
23556
  style: { color: linkColor },
23413
23557
  children: linkLabel || link
23414
23558
  }
@@ -23951,9 +24095,9 @@ var SForm = /* @__PURE__ */ forwardRef(function SForm2({ formClassName, onSubmit
23951
24095
  ) });
23952
24096
  });
23953
24097
  var SIZE_CONFIG2 = {
23954
- xs: { fontSize: 12, lineHeight: 20, radius: "var(--cmp-radioButton-radius-sm)" },
23955
- sm: { fontSize: 12, lineHeight: 20, radius: "var(--cmp-radioButton-radius-sm)" },
23956
- md: { fontSize: 14, lineHeight: 24, radius: "var(--cmp-radioButton-radius-md)" }
24098
+ xs: { typo: "typo-control-xs-medium", radius: "var(--cmp-radioButton-radius-sm)" },
24099
+ sm: { typo: "typo-control-xs-medium", radius: "var(--cmp-radioButton-radius-sm)" },
24100
+ md: { typo: "typo-control-sm-default", radius: "var(--cmp-radioButton-radius-md)" }
23957
24101
  };
23958
24102
  function SRadioButton({
23959
24103
  options = [],
@@ -24002,8 +24146,9 @@ function SRadioButton({
24002
24146
  onFocus: tooltip ? () => setHoveredValue(o.value) : void 0,
24003
24147
  onBlur: tooltip ? () => setHoveredValue(null) : void 0,
24004
24148
  className: cn(
24005
- "relative box-border grow inline-flex items-center justify-center whitespace-nowrap border border-solid font-medium transition-colors",
24006
- first ? "" : "-ml-px",
24149
+ "relative box-border grow inline-flex items-center justify-center whitespace-nowrap border-(length:--cmp-radioButton-border-width) border-solid transition-colors",
24150
+ s.typo,
24151
+ first ? "" : "ml-(--cmp-radioButton-group-gap)",
24007
24152
  selected ? "z-10" : "",
24008
24153
  !od && !ro && !selected && "hover:!bg-[var(--cmp-radioButton-bg-hover)] hover:!text-[color:var(--cmp-radioButton-content-hover)] hover:!border-[color:var(--cmp-radioButton-bg-hover)] hover:z-10",
24009
24154
  od ? "cursor-not-allowed" : ro ? "cursor-default" : "cursor-pointer"
@@ -24011,8 +24156,6 @@ function SRadioButton({
24011
24156
  style: {
24012
24157
  height: `var(--cmp-radioButton-${size}-height)`,
24013
24158
  padding: `0 var(--cmp-radioButton-${size}-paddingX)`,
24014
- fontSize: `${s.fontSize}px`,
24015
- lineHeight: `${s.lineHeight}px`,
24016
24159
  borderRadius: [
24017
24160
  first ? s.radius : "0",
24018
24161
  last ? s.radius : "0",
@@ -24049,6 +24192,7 @@ function SRadioCard({
24049
24192
  value,
24050
24193
  label,
24051
24194
  subtitle,
24195
+ children,
24052
24196
  tag,
24053
24197
  disabled = false,
24054
24198
  name,
@@ -24076,72 +24220,85 @@ function SRadioCard({
24076
24220
  };
24077
24221
  const textColor = disabled ? "text-(--sys-color-disabled-text)" : null;
24078
24222
  return /* @__PURE__ */ jsxs(
24079
- "label",
24223
+ "div",
24080
24224
  {
24081
- ...cardInteractiveProps,
24082
- "aria-disabled": disabled || void 0,
24083
24225
  className: cn(
24084
- "box-border flex w-full flex-col rounded-(--cmp-radioCard-radius) border-(length:--cmp-radioCard-border-width) border-solid px-(--cmp-radioCard-paddingX) py-(--cmp-radioCard-paddingY) transition-colors",
24085
- disabled ? "cursor-not-allowed border-(--cmp-radioCard-border-default) bg-(--cmp-radioCard-bg-disabled)" : checked ? "cursor-pointer border-(--cmp-radioCard-border-selected) bg-(--cmp-radioCard-bg-selected)" : "cursor-pointer border-(--cmp-radioCard-border-default) bg-(--cmp-radioCard-bg-default) hover:border-(--cmp-radioCard-border-hover) hover:bg-(--cmp-radioCard-bg-hover)",
24226
+ "box-border flex w-full flex-col rounded-(--cmp-radioCard-radius) border-(length:--cmp-radioCard-border-width) border-solid transition-colors",
24227
+ disabled ? "border-(--cmp-radioCard-border-default) bg-(--cmp-radioCard-bg-disabled)" : checked ? "border-(--cmp-radioCard-border-selected) bg-(--cmp-radioCard-bg-selected)" : "border-(--cmp-radioCard-border-default) bg-(--cmp-radioCard-bg-default) hover:border-(--cmp-radioCard-border-hover) hover:bg-(--cmp-radioCard-bg-hover)",
24086
24228
  className
24087
24229
  ),
24088
24230
  style,
24089
24231
  children: [
24090
- /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-(--cmp-radioCard-gap)", children: [
24091
- native && /* @__PURE__ */ jsx(
24092
- "input",
24093
- {
24094
- type: "radio",
24095
- name,
24096
- value: valStr,
24097
- checked,
24098
- disabled,
24099
- onChange: () => onValueChange?.(val),
24100
- className: "sr-only"
24101
- }
24102
- ),
24103
- /* @__PURE__ */ jsx(
24104
- "span",
24105
- {
24106
- className: "flex h-(--cmp-radio-size) w-(--cmp-radio-size) shrink-0 items-center justify-center rounded-(--cmp-radio-radius) border-(length:--cmp-radio-borderWidth) border-solid border-(--rc-dot-border) bg-(--rc-dot-bg)",
24107
- style: {
24108
- "--rc-dot-bg": disabled ? "var(--cmp-radio-bg-disabled)" : "var(--cmp-radio-bg-default)",
24109
- "--rc-dot-border": disabled ? "var(--cmp-radio-border-disabled)" : checked ? "var(--cmp-radio-border-active)" : "var(--cmp-radio-border-default)"
24110
- },
24111
- children: checked && /* @__PURE__ */ jsx(
24232
+ /* @__PURE__ */ jsxs(
24233
+ "label",
24234
+ {
24235
+ ...cardInteractiveProps,
24236
+ "aria-disabled": disabled || void 0,
24237
+ className: cn(
24238
+ "box-border flex w-full flex-col px-(--cmp-radioCard-paddingX) py-(--cmp-radioCard-paddingY)",
24239
+ disabled ? "cursor-not-allowed" : "cursor-pointer"
24240
+ ),
24241
+ children: [
24242
+ /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-(--cmp-radioCard-gap)", children: [
24243
+ native && /* @__PURE__ */ jsx(
24244
+ "input",
24245
+ {
24246
+ type: "radio",
24247
+ name,
24248
+ value: valStr,
24249
+ checked,
24250
+ disabled,
24251
+ onChange: () => onValueChange?.(val),
24252
+ className: "sr-only"
24253
+ }
24254
+ ),
24255
+ /* @__PURE__ */ jsx(
24256
+ "span",
24257
+ {
24258
+ className: "flex h-(--cmp-radio-size) w-(--cmp-radio-size) shrink-0 items-center justify-center rounded-(--cmp-radio-radius) border-(length:--cmp-radio-borderWidth) border-solid border-(--rc-dot-border) bg-(--rc-dot-bg)",
24259
+ style: {
24260
+ "--rc-dot-bg": disabled ? "var(--cmp-radio-bg-disabled)" : "var(--cmp-radio-bg-default)",
24261
+ "--rc-dot-border": disabled ? "var(--cmp-radio-border-disabled)" : checked ? "var(--cmp-radio-border-active)" : "var(--cmp-radio-border-default)"
24262
+ },
24263
+ children: checked && /* @__PURE__ */ jsx(
24264
+ "span",
24265
+ {
24266
+ className: "h-(--cmp-radio-dot-size) w-(--cmp-radio-dot-size) rounded-(--cmp-radio-radius) bg-(--rc-dot-fill)",
24267
+ style: {
24268
+ "--rc-dot-fill": disabled ? "var(--cmp-radio-dot-disabled)" : "var(--cmp-radio-dot-default)"
24269
+ }
24270
+ }
24271
+ )
24272
+ }
24273
+ ),
24274
+ /* @__PURE__ */ jsxs("span", { className: cn("grid min-w-0", textColor ?? "text-(--cmp-radioCard-label-color)"), children: [
24275
+ /* @__PURE__ */ jsx("span", { "aria-hidden": true, className: "typo-body-md-bold invisible", style: { gridArea: "1 / 1" }, children: label }),
24276
+ /* @__PURE__ */ jsx(
24277
+ "span",
24278
+ {
24279
+ className: checked ? "typo-body-md-bold" : "typo-body-md-semibold",
24280
+ style: { gridArea: "1 / 1" },
24281
+ children: label
24282
+ }
24283
+ )
24284
+ ] }),
24285
+ tag && /* @__PURE__ */ jsx(STag, { ...tag, size: "xs", className: "ml-auto" })
24286
+ ] }),
24287
+ subtitle && /* @__PURE__ */ jsx(
24112
24288
  "span",
24113
24289
  {
24114
- className: "h-(--cmp-radio-dot-size) w-(--cmp-radio-dot-size) rounded-(--cmp-radio-radius) bg-(--rc-dot-fill)",
24115
- style: {
24116
- "--rc-dot-fill": disabled ? "var(--cmp-radio-dot-disabled)" : "var(--cmp-radio-dot-default)"
24117
- }
24290
+ className: cn(
24291
+ "typo-body-sm-default pl-(--cmp-radioCard-subtitle-paddingLeft)",
24292
+ textColor ?? "text-(--cmp-radioCard-subtitle-color)"
24293
+ ),
24294
+ children: subtitle
24118
24295
  }
24119
24296
  )
24120
- }
24121
- ),
24122
- /* @__PURE__ */ jsxs("span", { className: cn("grid min-w-0", textColor ?? "text-(--cmp-radioCard-label-color)"), children: [
24123
- /* @__PURE__ */ jsx("span", { "aria-hidden": true, className: "typo-body-md-bold invisible", style: { gridArea: "1 / 1" }, children: label }),
24124
- /* @__PURE__ */ jsx(
24125
- "span",
24126
- {
24127
- className: checked ? "typo-body-md-bold" : "typo-body-md-semibold",
24128
- style: { gridArea: "1 / 1" },
24129
- children: label
24130
- }
24131
- )
24132
- ] }),
24133
- tag && /* @__PURE__ */ jsx(STag, { ...tag, size: "xs", className: "ml-auto" })
24134
- ] }),
24135
- subtitle && /* @__PURE__ */ jsx(
24136
- "span",
24137
- {
24138
- className: cn(
24139
- "typo-body-sm-default pl-(--cmp-radioCard-subtitle-paddingLeft)",
24140
- textColor ?? "text-(--cmp-radioCard-subtitle-color)"
24141
- ),
24142
- children: subtitle
24297
+ ]
24143
24298
  }
24144
- )
24299
+ ),
24300
+ children != null && children !== false && // 라벨 왼쪽 끝(카드 여백 + 서브타이틀 들여쓰기)에 맞춘다. 서브타이틀과의 간격은 label 의 아래 여백이다
24301
+ /* @__PURE__ */ jsx("div", { className: "box-border w-full pr-(--cmp-radioCard-paddingX) pb-(--cmp-radioCard-paddingY) pl-[calc(var(--cmp-radioCard-paddingX)+var(--cmp-radioCard-subtitle-paddingLeft))]", children })
24145
24302
  ]
24146
24303
  }
24147
24304
  );
@@ -24176,7 +24333,8 @@ function SRadioCardGroup({
24176
24333
  tag: o.tag,
24177
24334
  name: groupName,
24178
24335
  disabled: disabled || o.disabled,
24179
- onValueChange
24336
+ onValueChange,
24337
+ children: o.content
24180
24338
  },
24181
24339
  String(o.value)
24182
24340
  ))
@@ -26515,6 +26673,7 @@ var CHIPFILTER = {
26515
26673
  dividerHeight: "var(--cmp-chipFilter-divider-height)",
26516
26674
  chipHeight: "var(--cmp-chipFilter-chip-height)",
26517
26675
  chipRadius: "var(--cmp-chipFilter-chip-radius)",
26676
+ chipPaddingX: "var(--cmp-chipFilter-chip-paddingX)",
26518
26677
  chipGap: "var(--cmp-chipFilter-chip-gap)",
26519
26678
  chipDefaultBg: "var(--cmp-chipFilter-chip-default-bg)",
26520
26679
  chipDefaultBorder: "var(--cmp-chipFilter-chip-default-border)",
@@ -26525,7 +26684,7 @@ var CHIPFILTER = {
26525
26684
  chipAppliedBg: "var(--cmp-chipFilter-chip-applied-bg)",
26526
26685
  chipAppliedBorder: "var(--cmp-chipFilter-chip-applied-border)",
26527
26686
  chipAppliedLabel: "var(--cmp-chipFilter-chip-applied-text-label)",
26528
- chipAppliedValue: "var(--color-brilliantblue-80)",
26687
+ chipAppliedValue: "var(--cmp-chipFilter-chip-applied-text-data)",
26529
26688
  chipDisabledBg: "var(--cmp-chipFilter-chip-disabled-bg)",
26530
26689
  chipDisabledBorder: "var(--cmp-chipFilter-chip-disabled-border)",
26531
26690
  chipDisabledText: "var(--cmp-chipFilter-chip-disabled-text)",
@@ -27160,20 +27319,13 @@ var SChipFilter = /* @__PURE__ */ forwardRef(function SChipFilter2({
27160
27319
  onValueChange: (next) => emitValueAndSearch(field.key, next)
27161
27320
  }),
27162
27321
  addable && !disabled && !field.disabled && showClear && /* @__PURE__ */ jsx(
27163
- "button",
27322
+ SGhostButton,
27164
27323
  {
27165
- type: "button",
27166
- "aria-label": `${field.label} \uD544\uD130 \uC81C\uAC70`,
27167
- className: "inline-flex size-[16px] shrink-0 items-center justify-center rounded-[var(--cmp-ghostButton-radius-sm)] border-none bg-transparent p-0",
27168
- onClick: handleClear,
27169
- children: /* @__PURE__ */ jsx(
27170
- SIcon,
27171
- {
27172
- name: "close",
27173
- size: 12,
27174
- color: "var(--cmp-ghostButton-default-content)"
27175
- }
27176
- )
27324
+ icon: "close",
27325
+ size: "xxs",
27326
+ ariaLabel: `${field.label} \uD544\uD130 \uC81C\uAC70`,
27327
+ className: "shrink-0",
27328
+ onClick: handleClear
27177
27329
  }
27178
27330
  )
27179
27331
  ] }, field.key) : /* @__PURE__ */ jsx(
@@ -27216,7 +27368,7 @@ var SChipFilter = /* @__PURE__ */ forwardRef(function SChipFilter2({
27216
27368
  {
27217
27369
  type: "button",
27218
27370
  disabled: disabled || inactiveFields.length === 0,
27219
- className: "inline-flex shrink-0 cursor-pointer items-center justify-center gap-[var(--cmp-chipFilter-addButton-gap)] whitespace-nowrap border border-solid bg-[var(--cmp-chipFilter-addButton-bg)] px-[var(--cmp-chipFilter-addButton-paddingX)] text-[12px] font-medium leading-[20px] outline-none disabled:cursor-not-allowed",
27371
+ className: "inline-flex shrink-0 cursor-pointer items-center justify-center gap-[var(--cmp-chipFilter-addButton-gap)] whitespace-nowrap border border-solid bg-[var(--cmp-chipFilter-addButton-bg)] px-[var(--cmp-chipFilter-addButton-paddingX)] typo-control-xs-medium outline-none disabled:cursor-not-allowed",
27220
27372
  style: {
27221
27373
  minHeight: "var(--cmp-chipFilter-addButton-height)" ,
27222
27374
  borderRadius: "var(--cmp-chipFilter-addButton-radius)" ,
@@ -27228,7 +27380,7 @@ var SChipFilter = /* @__PURE__ */ forwardRef(function SChipFilter2({
27228
27380
  SIcon,
27229
27381
  {
27230
27382
  name: "add",
27231
- size: 12,
27383
+ size: "var(--cmp-chipFilter-addButton-icon)",
27232
27384
  color: disabled || inactiveFields.length === 0 ? CHIPFILTER.addTextDisabled : CHIPFILTER.addText
27233
27385
  }
27234
27386
  ),
@@ -27264,9 +27416,9 @@ var SChipFilter = /* @__PURE__ */ forwardRef(function SChipFilter2({
27264
27416
  onClick: reset,
27265
27417
  className: cn(
27266
27418
  "shrink-0",
27267
- // 부모 flex gap(6px)은 칩 사이 간격 기준이라, 필터 추가 버튼과의 12px 간격을 맞추려면
27268
- // 부족한 만큼(12px - gap)을 추가로 띄운다. 필터 추가가 없을 땐 divider와 이미 12px이라 불필요.
27269
- hasAddButton && "ml-[calc(12px-var(--cmp-chipFilter-chip-group))]"
27419
+ // 부모 flex gap(chip-group)은 칩 사이 간격 기준이라, 필터 추가 버튼과의 bar-gap 간격을 맞추려면
27420
+ // 부족한 만큼(bar-gap - chip-group)을 추가로 띄운다. 필터 추가가 없을 땐 divider와 이미 bar-gap이라 불필요.
27421
+ hasAddButton && "ml-[calc(var(--cmp-chipFilter-bar-gap)_-_var(--cmp-chipFilter-chip-group))]"
27270
27422
  )
27271
27423
  }
27272
27424
  )
@@ -27320,7 +27472,7 @@ function Divider({ inset, top } = {}) {
27320
27472
  className: cn(
27321
27473
  "inline-flex w-px shrink-0 bg-[var(--chipfilter-bar-border)]",
27322
27474
  top ? "mt-[2px] self-start" : "my-auto",
27323
- inset && "mx-[calc(12px-var(--cmp-chipFilter-chip-group))]"
27475
+ inset && "mx-[calc(var(--cmp-chipFilter-bar-gap)_-_var(--cmp-chipFilter-chip-group))]"
27324
27476
  ),
27325
27477
  style: { height: "var(--chipfilter-divider-height)" }
27326
27478
  }
@@ -27360,87 +27512,97 @@ function FilterChip({
27360
27512
  const border = disabled ? CHIPFILTER.chipDisabledBorder : warning ? CHIPFILTER.chipWarningBorder : applied ? active ? "var(--color-blue-strong)" : CHIPFILTER.chipAppliedBorder : active ? CHIPFILTER.chipActiveBorder : CHIPFILTER.chipDefaultBorder;
27361
27513
  const background = disabled ? CHIPFILTER.chipDisabledBg : applied ? CHIPFILTER.chipAppliedBg : CHIPFILTER.chipDefaultBg;
27362
27514
  const textColor = disabled ? CHIPFILTER.chipDisabledText : CHIPFILTER.chipDefaultText;
27515
+ const hasClear = !disabled && showClear && (applied || showClearWhenEmpty);
27363
27516
  return /* @__PURE__ */ jsxs(
27364
- "button",
27517
+ "div",
27365
27518
  {
27366
- ref: refCallback,
27367
- type: "button",
27368
- disabled,
27369
- "aria-expanded": active,
27370
27519
  onPointerDown: (event) => event.stopPropagation(),
27371
- onClick: onOpen,
27372
- className: "group/chip-filter inline-flex max-w-full shrink-0 cursor-pointer items-center justify-center whitespace-nowrap border border-solid px-[var(--cmp-chipFilter-chip-paddingX)] text-[12px] leading-[20px] outline-none disabled:cursor-not-allowed",
27520
+ className: "inline-flex max-w-full shrink-0 items-stretch whitespace-nowrap border border-solid",
27373
27521
  style: {
27374
27522
  minHeight: CHIPFILTER.chipHeight,
27375
27523
  gap: CHIPFILTER.chipGap,
27376
27524
  borderRadius: CHIPFILTER.chipRadius,
27377
27525
  borderColor: border,
27378
27526
  background,
27379
- color: textColor
27527
+ paddingRight: hasClear ? CHIPFILTER.chipPaddingX : void 0
27380
27528
  },
27381
27529
  children: [
27382
- field.required && /* @__PURE__ */ jsx(
27383
- SIcon,
27530
+ /* @__PURE__ */ jsxs(
27531
+ "button",
27384
27532
  {
27385
- name: "asterisk",
27386
- size: 12,
27387
- color: disabled ? CHIPFILTER.chipDisabledText : "var(--cmp-tag-darkblue-content)"
27533
+ ref: refCallback,
27534
+ type: "button",
27535
+ disabled,
27536
+ "aria-expanded": active,
27537
+ onClick: onOpen,
27538
+ className: "inline-flex min-w-0 cursor-pointer items-center justify-center border-none bg-transparent p-0 typo-body-sm-default outline-none disabled:cursor-not-allowed",
27539
+ style: {
27540
+ gap: CHIPFILTER.chipGap,
27541
+ paddingLeft: CHIPFILTER.chipPaddingX,
27542
+ paddingRight: hasClear ? void 0 : CHIPFILTER.chipPaddingX,
27543
+ color: textColor
27544
+ },
27545
+ children: [
27546
+ field.required && /* @__PURE__ */ jsx(
27547
+ SIcon,
27548
+ {
27549
+ name: "asterisk",
27550
+ size: "var(--cmp-chipFilter-chip-icon-essential)",
27551
+ color: disabled ? CHIPFILTER.chipDisabledText : "var(--cmp-tag-darkblue-content)"
27552
+ }
27553
+ ),
27554
+ applied ? /* @__PURE__ */ jsxs("span", { className: "inline-flex min-w-0 items-center gap-[4px] truncate", children: [
27555
+ /* @__PURE__ */ jsx(
27556
+ "span",
27557
+ {
27558
+ className: "typo-body-sm-bold",
27559
+ style: {
27560
+ color: disabled ? CHIPFILTER.chipDisabledText : CHIPFILTER.chipAppliedLabel
27561
+ },
27562
+ children: field.label
27563
+ }
27564
+ ),
27565
+ /* @__PURE__ */ jsx(
27566
+ "span",
27567
+ {
27568
+ style: {
27569
+ color: disabled ? CHIPFILTER.chipDisabledText : CHIPFILTER.chipAppliedLabel
27570
+ },
27571
+ children: ":"
27572
+ }
27573
+ ),
27574
+ /* @__PURE__ */ jsx(
27575
+ "span",
27576
+ {
27577
+ className: "min-w-0 truncate typo-body-sm-bold",
27578
+ style: {
27579
+ color: disabled ? CHIPFILTER.chipDisabledText : CHIPFILTER.chipAppliedValue
27580
+ },
27581
+ children: valueText
27582
+ }
27583
+ )
27584
+ ] }) : /* @__PURE__ */ jsxs(Fragment, { children: [
27585
+ /* @__PURE__ */ jsx("span", { className: cn("min-w-0 truncate", active && "typo-body-sm-bold"), children: field.label }),
27586
+ /* @__PURE__ */ jsx(
27587
+ SIcon,
27588
+ {
27589
+ name: "caretDown",
27590
+ size: "var(--cmp-chipFilter-chip-icon-caret)",
27591
+ color: disabled ? CHIPFILTER.chipDisabledText : CHIPFILTER.chipCaret
27592
+ }
27593
+ )
27594
+ ] })
27595
+ ]
27388
27596
  }
27389
27597
  ),
27390
- applied ? /* @__PURE__ */ jsxs("span", { className: "inline-flex min-w-0 items-center gap-[4px] truncate", children: [
27391
- /* @__PURE__ */ jsx(
27392
- "span",
27393
- {
27394
- className: "font-bold",
27395
- style: { color: disabled ? CHIPFILTER.chipDisabledText : CHIPFILTER.chipAppliedLabel },
27396
- children: field.label
27397
- }
27398
- ),
27399
- /* @__PURE__ */ jsx(
27400
- "span",
27401
- {
27402
- style: { color: disabled ? CHIPFILTER.chipDisabledText : CHIPFILTER.chipAppliedLabel },
27403
- children: ":"
27404
- }
27405
- ),
27406
- /* @__PURE__ */ jsx(
27407
- "span",
27408
- {
27409
- className: "min-w-0 truncate font-bold",
27410
- style: { color: disabled ? CHIPFILTER.chipDisabledText : CHIPFILTER.chipAppliedValue },
27411
- children: valueText
27412
- }
27413
- )
27414
- ] }) : /* @__PURE__ */ jsxs(Fragment, { children: [
27415
- /* @__PURE__ */ jsx("span", { className: cn("min-w-0 truncate", active && "font-bold"), children: field.label }),
27416
- /* @__PURE__ */ jsx(
27417
- SIcon,
27418
- {
27419
- name: "caretDown",
27420
- size: 12,
27421
- color: disabled ? CHIPFILTER.chipDisabledText : CHIPFILTER.chipCaret
27422
- }
27423
- )
27424
- ] }),
27425
- !disabled && showClear && (applied || showClearWhenEmpty) && /* @__PURE__ */ jsx(
27426
- "span",
27598
+ hasClear && /* @__PURE__ */ jsx(
27599
+ SGhostButton,
27427
27600
  {
27428
- role: "button",
27429
- tabIndex: 0,
27430
- "aria-label": `${field.label} \uD544\uD130 \uC9C0\uC6B0\uAE30`,
27431
- className: "inline-flex size-[16px] items-center justify-center rounded-[var(--cmp-ghostButton-radius-sm)]",
27432
- onClick: (event) => {
27433
- event.preventDefault();
27434
- event.stopPropagation();
27435
- onClear();
27436
- },
27437
- onKeyDown: (event) => {
27438
- if (event.key !== "Enter" && event.key !== " ") return;
27439
- event.preventDefault();
27440
- event.stopPropagation();
27441
- onClear();
27442
- },
27443
- children: /* @__PURE__ */ jsx(SIcon, { name: "close", size: 12, color: "var(--cmp-ghostButton-default-content)" })
27601
+ icon: "close",
27602
+ size: "xxs",
27603
+ ariaLabel: `${field.label} \uD544\uD130 \uC9C0\uC6B0\uAE30`,
27604
+ className: "shrink-0 self-center",
27605
+ onClick: onClear
27444
27606
  }
27445
27607
  )
27446
27608
  ]
@@ -27820,47 +27982,18 @@ function InlineDatePresetFilter({
27820
27982
  const badgeBackground = disabled ? CHIPFILTER.chipDisabledBg : CHIPFILTER.chipAppliedBg;
27821
27983
  const badgeLabelColor = disabled ? CHIPFILTER.chipDisabledText : CHIPFILTER.chipAppliedLabel;
27822
27984
  const badgeValueColor = disabled ? CHIPFILTER.chipDisabledText : CHIPFILTER.chipAppliedValue;
27823
- const badge = applied && /* @__PURE__ */ jsxs(
27824
- "span",
27825
- {
27826
- className: "inline-flex shrink-0 items-center gap-[4px] whitespace-nowrap border border-solid px-[var(--cmp-chipFilter-chip-paddingX)] text-[12px] leading-[20px]",
27827
- style: {
27828
- minHeight: CHIPFILTER.chipHeight,
27829
- borderRadius: CHIPFILTER.chipRadius,
27830
- borderColor: badgeBorder,
27831
- background: badgeBackground,
27832
- color: badgeLabelColor,
27833
- cursor: rangeValue && !disabled ? "pointer" : void 0
27834
- },
27835
- children: [
27836
- /* @__PURE__ */ jsxs("span", { className: "font-bold", children: [
27837
- field.label,
27838
- ":"
27839
- ] }),
27840
- /* @__PURE__ */ jsx("span", { className: "font-bold", style: { color: badgeValueColor }, children: displayValue(field, value) }),
27841
- !disabled && showClear && /* @__PURE__ */ jsx(
27842
- "span",
27843
- {
27844
- role: "button",
27845
- tabIndex: 0,
27846
- "aria-label": `${field.label} \uD544\uD130 \uC9C0\uC6B0\uAE30`,
27847
- className: "inline-flex size-[16px] items-center justify-center rounded-[var(--cmp-ghostButton-radius-sm)]",
27848
- onClick: (event) => {
27849
- event.stopPropagation();
27850
- onClear();
27851
- },
27852
- onKeyDown: (event) => {
27853
- if (event.key !== "Enter" && event.key !== " ") return;
27854
- event.preventDefault();
27855
- event.stopPropagation();
27856
- onClear();
27857
- },
27858
- children: /* @__PURE__ */ jsx(SIcon, { name: "close", size: 12, color: "var(--cmp-ghostButton-default-content)" })
27859
- }
27860
- )
27861
- ]
27862
- }
27863
- );
27985
+ const hasClear = !disabled && showClear;
27986
+ const badgeTextStyle = {
27987
+ paddingLeft: CHIPFILTER.chipPaddingX,
27988
+ paddingRight: hasClear ? void 0 : CHIPFILTER.chipPaddingX
27989
+ };
27990
+ const badgeText = /* @__PURE__ */ jsxs(Fragment, { children: [
27991
+ /* @__PURE__ */ jsxs("span", { className: "typo-body-sm-bold", children: [
27992
+ field.label,
27993
+ ":"
27994
+ ] }),
27995
+ /* @__PURE__ */ jsx("span", { className: "typo-body-sm-bold", style: { color: badgeValueColor }, children: displayValue(field, value) })
27996
+ ] });
27864
27997
  return /* @__PURE__ */ jsxs("div", { className: "flex shrink-0 items-center gap-[8px]", children: [
27865
27998
  /* @__PURE__ */ jsx(
27866
27999
  SRadioButton,
@@ -27872,43 +28005,71 @@ function InlineDatePresetFilter({
27872
28005
  onValueChange: (next) => selectPreset(String(next))
27873
28006
  }
27874
28007
  ),
27875
- applied && (rangeValue ? (
27876
- // 뱃지 모양은 그대로 두고, 눌렀을 때 캘린더가 열려 기간을 직접 다시 고를 수 있게 한다.
27877
- // 직접 고르면 프리셋 선택은 해제된다.
27878
- /* @__PURE__ */ jsxs(RPopover13.Root, { open: pickerOpen, onOpenChange: setPickerOpen, children: [
27879
- /* @__PURE__ */ jsx(RPopover13.Trigger, { asChild: true, children: /* @__PURE__ */ jsx(
27880
- "button",
27881
- {
27882
- type: "button",
27883
- disabled,
27884
- className: "border-none bg-transparent p-0 outline-none disabled:cursor-not-allowed",
27885
- children: badge
27886
- }
27887
- ) }),
27888
- /* @__PURE__ */ jsx(RPopover13.Portal, { container: portalContainer, children: /* @__PURE__ */ jsx(
27889
- RPopover13.Content,
27890
- {
27891
- side: "bottom",
27892
- align: "start",
27893
- sideOffset: 4,
27894
- className: cn("z-50", FLOATING_SLIDE_ANIM),
27895
- children: /* @__PURE__ */ jsx(
27896
- RangeCalendar,
27897
- {
27898
- value: rangeValue,
27899
- selectable: field.selectable,
27900
- maxRange: field.maxRange,
27901
- onSelect: (range) => {
27902
- setSelectedId(null);
27903
- onValueChange(range);
27904
- setPickerOpen(false);
28008
+ applied && // 뱃지 모양(테두리·배경)은 바깥이 맡고, 라벨·값 칸과 지우기 × 를 형제로 둔다 — FilterChip 과
28009
+ // 같은 이유로, 캘린더를 여는 버튼 안에 × 를 넣지 않는다.
28010
+ /* @__PURE__ */ jsxs(
28011
+ "span",
28012
+ {
28013
+ className: "inline-flex shrink-0 items-stretch gap-[4px] whitespace-nowrap border border-solid typo-body-sm-default",
28014
+ style: {
28015
+ minHeight: CHIPFILTER.chipHeight,
28016
+ borderRadius: CHIPFILTER.chipRadius,
28017
+ borderColor: badgeBorder,
28018
+ background: badgeBackground,
28019
+ color: badgeLabelColor,
28020
+ paddingRight: hasClear ? CHIPFILTER.chipPaddingX : void 0
28021
+ },
28022
+ children: [
28023
+ rangeValue ? (
28024
+ // 눌렀을 때 캘린더가 열려 기간을 직접 다시 고를 수 있게 한다. 직접 고르면 프리셋 선택은 해제된다.
28025
+ /* @__PURE__ */ jsxs(RPopover13.Root, { open: pickerOpen, onOpenChange: setPickerOpen, children: [
28026
+ /* @__PURE__ */ jsx(RPopover13.Trigger, { asChild: true, children: /* @__PURE__ */ jsx(
28027
+ "button",
28028
+ {
28029
+ type: "button",
28030
+ disabled,
28031
+ className: "inline-flex cursor-pointer items-center gap-[4px] border-none bg-transparent p-0 outline-none disabled:cursor-not-allowed",
28032
+ style: badgeTextStyle,
28033
+ children: badgeText
27905
28034
  }
27906
- }
27907
- )
27908
- }
27909
- ) })
27910
- ] })
27911
- ) : badge)
28035
+ ) }),
28036
+ /* @__PURE__ */ jsx(RPopover13.Portal, { container: portalContainer, children: /* @__PURE__ */ jsx(
28037
+ RPopover13.Content,
28038
+ {
28039
+ side: "bottom",
28040
+ align: "start",
28041
+ sideOffset: 4,
28042
+ className: cn("z-50", FLOATING_SLIDE_ANIM),
28043
+ children: /* @__PURE__ */ jsx(
28044
+ RangeCalendar,
28045
+ {
28046
+ value: rangeValue,
28047
+ selectable: field.selectable,
28048
+ maxRange: field.maxRange,
28049
+ onSelect: (range) => {
28050
+ setSelectedId(null);
28051
+ onValueChange(range);
28052
+ setPickerOpen(false);
28053
+ }
28054
+ }
28055
+ )
28056
+ }
28057
+ ) })
28058
+ ] })
28059
+ ) : /* @__PURE__ */ jsx("span", { className: "inline-flex items-center gap-[4px]", style: badgeTextStyle, children: badgeText }),
28060
+ hasClear && /* @__PURE__ */ jsx(
28061
+ SGhostButton,
28062
+ {
28063
+ icon: "close",
28064
+ size: "xxs",
28065
+ ariaLabel: `${field.label} \uD544\uD130 \uC9C0\uC6B0\uAE30`,
28066
+ className: "shrink-0 self-center",
28067
+ onClick: onClear
28068
+ }
28069
+ )
28070
+ ]
28071
+ }
28072
+ )
27912
28073
  ] });
27913
28074
  }
27914
28075
  var MATCH_MODE_OPTIONS = [
@@ -27997,7 +28158,7 @@ function KeywordEditor({
27997
28158
  /* @__PURE__ */ jsx(
27998
28159
  "span",
27999
28160
  {
28000
- className: "shrink-0 whitespace-nowrap text-[12px] font-medium leading-[20px]",
28161
+ className: "shrink-0 whitespace-nowrap typo-body-sm-medium",
28001
28162
  style: { color: CHIPFILTER.listboxLabel },
28002
28163
  children: "\uAC80\uC0C9 \uC870\uAC74 :"
28003
28164
  }
@@ -28057,7 +28218,7 @@ function KeywordEntryRow({
28057
28218
  return /* @__PURE__ */ jsxs(
28058
28219
  "div",
28059
28220
  {
28060
- className: "group flex w-full items-center justify-between gap-[8px] text-[12px] leading-[20px]",
28221
+ className: "group flex w-full items-center justify-between gap-[8px] typo-body-sm-default",
28061
28222
  style: {
28062
28223
  paddingTop: CHIPFILTER.itemPaddingY,
28063
28224
  paddingBottom: CHIPFILTER.itemPaddingY,
@@ -28068,13 +28229,13 @@ function KeywordEntryRow({
28068
28229
  children: [
28069
28230
  /* @__PURE__ */ jsx("span", { className: cn("min-w-0 truncate", !disabled && "group-hover:font-bold"), children: label }),
28070
28231
  !disabled && /* @__PURE__ */ jsx(
28071
- "button",
28232
+ SGhostButton,
28072
28233
  {
28073
- type: "button",
28074
- "aria-label": `${label} \uC0AD\uC81C`,
28075
- className: "invisible inline-flex size-[16px] shrink-0 cursor-pointer items-center justify-center group-hover:visible",
28076
- onClick: onRemove,
28077
- children: /* @__PURE__ */ jsx(SIcon, { name: "close", size: 12, color: "var(--cmp-ghostButton-default-content)" })
28234
+ icon: "close",
28235
+ size: "xxs",
28236
+ ariaLabel: `${label} \uC0AD\uC81C`,
28237
+ className: "invisible shrink-0 group-hover:visible",
28238
+ onClick: onRemove
28078
28239
  }
28079
28240
  )
28080
28241
  ]
@@ -28083,7 +28244,7 @@ function KeywordEntryRow({
28083
28244
  }
28084
28245
  var OPTION_SEARCH_THRESHOLD = 11;
28085
28246
  var filterFlatOptions = (flat, query) => filterDepthRows(flat, (option) => option.label.toLowerCase().includes(query));
28086
- var depthPaddingLeft = (depth) => depth === 1 ? 12 : depth === 2 ? 20 : 28;
28247
+ var depthPaddingLeft = (depth) => LIST_BOX_ITEM_PADDING_LEFT[depth === 1 ? 1 : depth === 2 ? 2 : 3];
28087
28248
  function OptionList({
28088
28249
  field,
28089
28250
  value,
@@ -28299,14 +28460,14 @@ function OptionCheckbox({ checked, disabled }) {
28299
28460
  "span",
28300
28461
  {
28301
28462
  className: cn(
28302
- "inline-flex size-[16px] shrink-0 items-center justify-center rounded-[2px] border border-solid",
28463
+ "inline-flex size-(--cmp-checkbox-size) shrink-0 items-center justify-center rounded-(--cmp-checkbox-radius) border-(length:--cmp-checkbox-borderWidth) border-solid",
28303
28464
  disabled ? "border-[color:var(--cmp-checkbox-border-disabled)] bg-[var(--cmp-checkbox-bg-disabled)]" : filled ? "border-[color:var(--cmp-checkbox-checked-bg-default)] bg-[var(--cmp-checkbox-checked-bg-default)]" : "border-[color:var(--cmp-checkbox-unchecked-border-default)] bg-[var(--cmp-checkbox-unchecked-bg-default)]"
28304
28465
  ),
28305
28466
  children: filled && /* @__PURE__ */ jsx(
28306
28467
  SIcon,
28307
28468
  {
28308
28469
  name: checked === null ? "checkboxIndeterminate" : "checkboxCheck",
28309
- size: 12,
28470
+ size: "var(--cmp-checkbox-icon)",
28310
28471
  color: disabled ? "var(--cmp-checkbox-checked-icon-disabled)" : "var(--cmp-checkbox-checked-icon-default)"
28311
28472
  }
28312
28473
  )
@@ -28351,8 +28512,8 @@ function MenuItem({
28351
28512
  onMouseEnter,
28352
28513
  onClick,
28353
28514
  className: cn(
28354
- "flex w-full min-w-0 cursor-pointer items-center gap-[8px] border-none bg-transparent text-left text-[12px] leading-[20px] outline-none disabled:cursor-not-allowed",
28355
- selected ? "font-bold" : "font-normal",
28515
+ "flex w-full min-w-0 cursor-pointer items-center gap-[8px] border-none bg-transparent text-left outline-none disabled:cursor-not-allowed",
28516
+ selected ? "typo-body-sm-bold" : "typo-body-sm-default",
28356
28517
  !disabled && "hover:font-bold"
28357
28518
  ),
28358
28519
  style: {
@@ -28589,7 +28750,7 @@ var SChipInput = /* @__PURE__ */ forwardRef(function SChipInput2({
28589
28750
  labelPosition,
28590
28751
  subLabel,
28591
28752
  labelWidth,
28592
- labelHeight: `calc(var(--cmp-chipInput-${size}-minHeight) + 2px)`,
28753
+ labelHeight: `calc(var(--cmp-chipInput-${size}-minHeight) + var(--cmp-chipInput-borderWidth) * 2)`,
28593
28754
  icon,
28594
28755
  iconColor,
28595
28756
  labelTooltip,
@@ -28674,8 +28835,8 @@ var SChipInput = /* @__PURE__ */ forwardRef(function SChipInput2({
28674
28835
  {
28675
28836
  "aria-hidden": true,
28676
28837
  className: cn(
28677
- "invisible col-start-1 row-start-1 whitespace-pre font-normal",
28678
- size === "md" ? "text-14 leading-sd-24" : "text-12 leading-sd-20"
28838
+ "invisible col-start-1 row-start-1 whitespace-pre",
28839
+ size === "md" ? "typo-field-md-default" : "typo-field-sm-default"
28679
28840
  ),
28680
28841
  children: inputValue !== "" ? inputValue : values.length === 0 ? placeholder : ""
28681
28842
  }
@@ -28694,9 +28855,9 @@ var SChipInput = /* @__PURE__ */ forwardRef(function SChipInput2({
28694
28855
  "aria-activedescendant": showDropdown && activeIndex >= 0 ? activeOptionId : void 0,
28695
28856
  "aria-autocomplete": "list",
28696
28857
  className: cn(
28697
- "s-chip-input__input col-start-1 row-start-1 w-full border-0 bg-transparent p-0 font-normal text-(--cmp-chip-content-focus) outline-none placeholder:text-(--cmp-chipInput-text-placeholder) disabled:cursor-not-allowed",
28858
+ "s-chip-input__input col-start-1 row-start-1 w-full border-0 bg-transparent p-0 text-(--cmp-chip-content-focus) outline-none placeholder:text-(--cmp-chipInput-text-placeholder) disabled:cursor-not-allowed",
28698
28859
  AUTOFILL_RESET_CLASS,
28699
- size === "md" ? "text-14 leading-sd-24" : "text-12 leading-sd-20"
28860
+ size === "md" ? "typo-field-md-default" : "typo-field-sm-default"
28700
28861
  ),
28701
28862
  style: {
28702
28863
  minWidth: "1ch",
@@ -28866,7 +29027,7 @@ var SChipInput = /* @__PURE__ */ forwardRef(function SChipInput2({
28866
29027
  "aria-selected": selected || active,
28867
29028
  tabIndex: -1,
28868
29029
  className: cn(
28869
- "s-chip-input__suggestion-item flex shrink-0 cursor-pointer items-center gap-sd-8 overflow-hidden text-ellipsis whitespace-nowrap px-sd-12 py-sd-4 text-12 leading-sd-20",
29030
+ "s-chip-input__suggestion-item flex shrink-0 cursor-pointer items-center gap-(--cmp-listBoxItem-gap) overflow-hidden text-ellipsis whitespace-nowrap py-(--cmp-listBoxItem-paddingY) pl-(--cmp-listBoxItem-paddingLeft-depth1) pr-(--cmp-listBoxItem-paddingRight) typo-field-sm-default",
28870
29031
  selected ? "cursor-default overflow-visible font-bold text-(--cmp-listBoxItem-content-selected)" : active ? "bg-(--cmp-listBoxItem-bg-hover) font-medium text-(--cmp-listBoxItem-content-hover)" : "text-(--cmp-listBoxItem-content-default)"
28871
29032
  ),
28872
29033
  onMouseDown: (e) => {
@@ -29075,7 +29236,7 @@ var TIMEPICKER_SIZE_CONFIG = {
29075
29236
  gap: V4("sm-gap"),
29076
29237
  icon: V4("sm-icon"),
29077
29238
  radius: V4("sm-radius"),
29078
- // TODO: component.timepicker 토큰에 typography가 추가되면 CSS 변수로 교체한다.
29239
+ typography: "typo-field-sm-default",
29079
29240
  fontSize: 12,
29080
29241
  lineHeight: 20,
29081
29242
  minWidth: 80,
@@ -29088,7 +29249,7 @@ var TIMEPICKER_SIZE_CONFIG = {
29088
29249
  gap: V4("md-gap"),
29089
29250
  icon: V4("md-icon"),
29090
29251
  radius: V4("md-radius"),
29091
- // TODO: component.timepicker 토큰에 typography가 추가되면 CSS 변수로 교체한다.
29252
+ typography: "typo-field-md-default",
29092
29253
  fontSize: 14,
29093
29254
  lineHeight: 24,
29094
29255
  minWidth: 96,
@@ -29419,11 +29580,9 @@ function STimePicker({
29419
29580
  "span",
29420
29581
  {
29421
29582
  id: triggerTextId,
29422
- className: "flex-1 truncate text-center",
29583
+ className: cn("flex-1 truncate text-center", dims.typography),
29423
29584
  style: {
29424
29585
  minWidth: dims.minWidth,
29425
- fontSize: dims.fontSize,
29426
- lineHeight: `${dims.lineHeight}px`,
29427
29586
  color: disabled ? "var(--cmp-timepicker-text-disabled)" : hasValue ? "var(--cmp-timepicker-text-default)" : "var(--cmp-field-hint-color)"
29428
29587
  },
29429
29588
  children: hasValue ? displayText : placeholder
@@ -29527,7 +29686,7 @@ function RangeTimeSelector({
29527
29686
  className: "flex flex-col items-center",
29528
29687
  style: { gap: "var(--cmp-timepicker-selector-range-heading-gap)" },
29529
29688
  children: [
29530
- /* @__PURE__ */ jsx("div", { className: "whitespace-nowrap text-center text-[12px] font-bold leading-[20px] text-[var(--cmp-timepicker-selector-range-heading-color)]", children: title }),
29689
+ /* @__PURE__ */ jsx("div", { className: "whitespace-nowrap text-center typo-field-sm-bold text-[var(--cmp-timepicker-selector-range-heading-color)]", children: title }),
29531
29690
  /* @__PURE__ */ jsx(
29532
29691
  TimeListbox,
29533
29692
  {
@@ -29694,11 +29853,9 @@ function STimeRangePicker({
29694
29853
  "span",
29695
29854
  {
29696
29855
  id: triggerTextId,
29697
- className: "flex-1 truncate text-center",
29856
+ className: cn("flex-1 truncate text-center", dims.typography),
29698
29857
  style: {
29699
29858
  minWidth: dims.minWidth,
29700
- fontSize: dims.fontSize,
29701
- lineHeight: `${dims.lineHeight}px`,
29702
29859
  color: disabled ? "var(--cmp-timepicker-text-disabled)" : hasValue ? "var(--cmp-timepicker-text-default)" : "var(--cmp-field-hint-color)"
29703
29860
  },
29704
29861
  children: hasValue ? displayText : placeholder