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.cjs CHANGED
@@ -3724,16 +3724,21 @@ var SIcon = /* @__PURE__ */ react.forwardRef(function SIcon2({ name, size = 24,
3724
3724
  const Svg = ICONS[name];
3725
3725
  if (!Svg) return null;
3726
3726
  const rotateClass = rotate ? { 90: "rotate-90", 180: "rotate-180", 270: "-rotate-90" }[rotate] : void 0;
3727
+ const cssSize = typeof size === "string" && /var\(|calc\(/.test(size);
3727
3728
  return /* @__PURE__ */ jsxRuntime.jsx(
3728
3729
  "span",
3729
3730
  {
3730
3731
  ref,
3731
3732
  className: cn("inline-flex items-center justify-center", rotateClass, className),
3732
- style: { color: resolveColor(color), ...style },
3733
+ style: {
3734
+ color: resolveColor(color),
3735
+ ...cssSize && { width: size, height: size },
3736
+ ...style
3737
+ },
3733
3738
  role: label ? "img" : void 0,
3734
3739
  "aria-label": label,
3735
3740
  "aria-hidden": label ? void 0 : true,
3736
- children: /* @__PURE__ */ jsxRuntime.jsx(Svg, { size })
3741
+ children: /* @__PURE__ */ jsxRuntime.jsx(Svg, { size: cssSize ? "100%" : size })
3737
3742
  }
3738
3743
  );
3739
3744
  });
@@ -4136,7 +4141,7 @@ var SBadge = /* @__PURE__ */ react.forwardRef(function SBadge2({ color = "blue",
4136
4141
  return /* @__PURE__ */ jsxRuntime.jsx("span", { ref, className: cn("inline-flex items-center justify-center", className), ...rest, children: /* @__PURE__ */ jsxRuntime.jsx(
4137
4142
  "span",
4138
4143
  {
4139
- className: "rounded-full",
4144
+ className: "rounded-(--cmp-badge-radius)",
4140
4145
  style: {
4141
4146
  width: "var(--cmp-badge-size, 6px)",
4142
4147
  height: "var(--cmp-badge-size, 6px)",
@@ -4203,7 +4208,8 @@ var BUTTON_SIZE_CONFIG = {
4203
4208
  height: "var(--cmp-button-xs-height)",
4204
4209
  paddingX: "var(--cmp-button-xs-paddingX)",
4205
4210
  gap: "var(--cmp-button-xs-gap)",
4206
- iconSize: 12,
4211
+ iconSize: "var(--cmp-button-xs-icon)",
4212
+ iconOnlyWidth: "var(--cmp-button-iconOnly-xs-width)",
4207
4213
  fontSize: 12,
4208
4214
  fontWeight: 500,
4209
4215
  radius: "var(--cmp-button-radius-sm)",
@@ -4213,7 +4219,8 @@ var BUTTON_SIZE_CONFIG = {
4213
4219
  height: "var(--cmp-button-sm-height)",
4214
4220
  paddingX: "var(--cmp-button-sm-paddingX)",
4215
4221
  gap: "var(--cmp-button-sm-gap)",
4216
- iconSize: 16,
4222
+ iconSize: "var(--cmp-button-sm-icon)",
4223
+ iconOnlyWidth: "var(--cmp-button-iconOnly-sm-width)",
4217
4224
  fontSize: 12,
4218
4225
  fontWeight: 500,
4219
4226
  radius: "var(--cmp-button-radius-sm)",
@@ -4223,7 +4230,8 @@ var BUTTON_SIZE_CONFIG = {
4223
4230
  height: "var(--cmp-button-md-height)",
4224
4231
  paddingX: "var(--cmp-button-md-paddingX)",
4225
4232
  gap: "var(--cmp-button-md-gap)",
4226
- iconSize: 20,
4233
+ iconSize: "var(--cmp-button-md-icon)",
4234
+ iconOnlyWidth: "var(--cmp-button-iconOnly-md-width)",
4227
4235
  fontSize: 16,
4228
4236
  fontWeight: 500,
4229
4237
  radius: "var(--cmp-button-radius-md)",
@@ -4233,7 +4241,8 @@ var BUTTON_SIZE_CONFIG = {
4233
4241
  height: "var(--cmp-button-lg-height)",
4234
4242
  paddingX: "var(--cmp-button-lg-paddingX)",
4235
4243
  gap: "var(--cmp-button-lg-gap)",
4236
- iconSize: 24,
4244
+ iconSize: "var(--cmp-button-lg-icon)",
4245
+ iconOnlyWidth: "var(--cmp-button-iconOnly-lg-width)",
4237
4246
  fontSize: 18,
4238
4247
  fontWeight: 500,
4239
4248
  radius: "var(--cmp-button-radius-md)",
@@ -4280,7 +4289,7 @@ var SButton = /* @__PURE__ */ react.forwardRef(function SButton2({
4280
4289
  "--btn-border": disabled ? BUTTON_DISABLED_BORDER : preset.border,
4281
4290
  "--btn-ring": BUTTON_FOCUS_RING,
4282
4291
  "minHeight": s.height,
4283
- "minWidth": iconOnly ? s.height : hasLabel ? s.minWidth : void 0,
4292
+ "minWidth": iconOnly ? s.iconOnlyWidth : hasLabel ? s.minWidth : void 0,
4284
4293
  "padding": iconOnly ? 0 : `0 ${s.paddingX}`,
4285
4294
  "borderRadius": s.radius,
4286
4295
  "gap": s.gap,
@@ -4297,7 +4306,7 @@ var SButton = /* @__PURE__ */ react.forwardRef(function SButton2({
4297
4306
  disabled,
4298
4307
  "aria-label": ariaLabel,
4299
4308
  className: cn(
4300
- "inline-flex items-center justify-center whitespace-nowrap border border-solid leading-none transition-colors",
4309
+ "inline-flex items-center justify-center whitespace-nowrap border-[length:var(--cmp-button-border-width-default)] border-solid leading-none transition-colors",
4301
4310
  "border-[color:var(--btn-border)] bg-[var(--btn-bg)]",
4302
4311
  "outline-none focus-visible:shadow-[0_0_0_2px_var(--btn-ring)]",
4303
4312
  disabled ? "cursor-not-allowed" : "cursor-pointer hover:bg-[var(--btn-bg-hover)]",
@@ -4415,34 +4424,28 @@ var TAG_COLORS = [
4415
4424
  ];
4416
4425
  var TAG_SIZE_CONFIG = {
4417
4426
  xs: {
4418
- height: 20,
4419
- paddingX: 8,
4420
- gap: 4,
4421
- radius: 6,
4422
- iconSize: 12,
4423
- fontSize: 11,
4424
- fontWeight: 500,
4425
- lineHeight: 18
4427
+ height: "var(--cmp-tag-xs-height)",
4428
+ paddingX: "var(--cmp-tag-xs-paddingX)",
4429
+ gap: "var(--cmp-tag-xs-gap)",
4430
+ radius: "var(--cmp-tag-xs-radius)",
4431
+ iconSize: "var(--cmp-tag-xs-icon)",
4432
+ typography: "typo-feedback-xs"
4426
4433
  },
4427
4434
  sm: {
4428
- height: 24,
4429
- paddingX: 8,
4430
- gap: 4,
4431
- radius: 6,
4432
- iconSize: 16,
4433
- fontSize: 12,
4434
- fontWeight: 600,
4435
- lineHeight: 20
4435
+ height: "var(--cmp-tag-sm-height)",
4436
+ paddingX: "var(--cmp-tag-sm-paddingX)",
4437
+ gap: "var(--cmp-tag-sm-gap)",
4438
+ radius: "var(--cmp-tag-sm-radius)",
4439
+ iconSize: "var(--cmp-tag-sm-icon)",
4440
+ typography: "typo-feedback-sm-semibold"
4436
4441
  },
4437
4442
  md: {
4438
- height: 28,
4439
- paddingX: 12,
4440
- gap: 6,
4441
- radius: 8,
4442
- iconSize: 16,
4443
- fontSize: 14,
4444
- fontWeight: 700,
4445
- lineHeight: 24
4443
+ height: "var(--cmp-tag-md-height)",
4444
+ paddingX: "var(--cmp-tag-md-paddingX)",
4445
+ gap: "var(--cmp-tag-md-gap)",
4446
+ radius: "var(--cmp-tag-md-radius)",
4447
+ iconSize: "var(--cmp-tag-md-icon)",
4448
+ typography: "typo-feedback-md-bold"
4446
4449
  }
4447
4450
  };
4448
4451
  var STag = /* @__PURE__ */ react.forwardRef(function STag2({
@@ -4470,16 +4473,14 @@ var STag = /* @__PURE__ */ react.forwardRef(function STag2({
4470
4473
  "aria-label": label || "tag",
4471
4474
  className: cn(
4472
4475
  "box-border inline-flex w-fit select-none items-center justify-center whitespace-nowrap",
4476
+ s.typography,
4473
4477
  className
4474
4478
  ),
4475
4479
  style: {
4476
4480
  minHeight: s.height,
4477
- padding: `0 ${s.paddingX}px`,
4481
+ padding: `0 ${s.paddingX}`,
4478
4482
  gap: s.gap,
4479
4483
  borderRadius: shape === "pill" ? 999 : s.radius,
4480
- fontSize: s.fontSize,
4481
- fontWeight: s.fontWeight,
4482
- lineHeight: `${s.lineHeight}px`,
4483
4484
  background: bgColor,
4484
4485
  color: contentColor,
4485
4486
  ...resolvedWidth != null ? { width: resolvedWidth } : {},
@@ -4499,11 +4500,11 @@ var STag = /* @__PURE__ */ react.forwardRef(function STag2({
4499
4500
  );
4500
4501
  });
4501
4502
  var SIZE = {
4502
- xxs: { icon: 12, radius: "sm" },
4503
- xs: { icon: 16, radius: "sm" },
4504
- sm: { icon: 20, radius: "sm" },
4505
- md: { icon: 24, radius: "md" },
4506
- lg: { icon: 32, radius: "md" }
4503
+ xxs: { icon: "var(--cmp-ghostButton-xxs-icon)", radius: "sm" },
4504
+ xs: { icon: "var(--cmp-ghostButton-xs-icon)", radius: "sm" },
4505
+ sm: { icon: "var(--cmp-ghostButton-sm-icon)", radius: "sm" },
4506
+ md: { icon: "var(--cmp-ghostButton-md-icon)", radius: "md" },
4507
+ lg: { icon: "var(--cmp-ghostButton-lg-icon)", radius: "md" }
4507
4508
  };
4508
4509
  var TOOLTIP_HIDE_DELAY_MS = 100;
4509
4510
  var SGhostButton = /* @__PURE__ */ react.forwardRef(function SGhostButton2({
@@ -4578,7 +4579,7 @@ var SGhostButton = /* @__PURE__ */ react.forwardRef(function SGhostButton2({
4578
4579
  "span",
4579
4580
  {
4580
4581
  "aria-hidden": true,
4581
- className: "pointer-events-none absolute inset-0 rounded-[inherit] opacity-0 transition-opacity duration-200 group-hover/ghost-button:opacity-5",
4582
+ className: "pointer-events-none absolute inset-0 rounded-[inherit] opacity-0 transition-opacity duration-200 group-hover/ghost-button:opacity-(--cmp-ghostButton-hover-opacity)",
4582
4583
  style: { background: `var(--cmp-ghostButton-${intent}-hover-bg)` }
4583
4584
  }
4584
4585
  ),
@@ -4802,7 +4803,9 @@ var STooltipImpl = /* @__PURE__ */ react.forwardRef(function STooltip({
4802
4803
  ...restContentProps
4803
4804
  } = contentProps ?? {};
4804
4805
  const contentClass = cn(
4805
- "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",
4806
+ "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",
4807
+ // default 500, danger/warning/accent 700 — tooltip.<type>.typography
4808
+ tooltipType === "default" ? "typo-feedback-sm-medium" : "typo-feedback-sm-bold",
4806
4809
  FLOATING_SLIDE_ANIM,
4807
4810
  className,
4808
4811
  contentPropsClassName
@@ -4810,7 +4813,6 @@ var STooltipImpl = /* @__PURE__ */ react.forwardRef(function STooltip({
4810
4813
  const contentStyle = {
4811
4814
  background: bg,
4812
4815
  color: fg,
4813
- fontWeight: tooltipType === "default" ? 500 : 700,
4814
4816
  ...style,
4815
4817
  ...contentPropsStyle
4816
4818
  };
@@ -4851,7 +4853,7 @@ var STooltipImpl = /* @__PURE__ */ react.forwardRef(function STooltip({
4851
4853
  onMouseLeave: isHover ? startHide : void 0,
4852
4854
  ...restContentProps,
4853
4855
  children: [
4854
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-start gap-[12px]", children: [
4856
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-start gap-(--cmp-tooltip-gap)", children: [
4855
4857
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "min-w-0 flex-1", children: body }),
4856
4858
  showClose && !isNone && /* @__PURE__ */ jsxRuntime.jsx(
4857
4859
  SGhostButton,
@@ -4906,16 +4908,20 @@ var FIELD_SIZE = {
4906
4908
  height: 28,
4907
4909
  radius: 4,
4908
4910
  fieldGap: 12,
4909
- labelGap: 6,
4911
+ labelHeight: "var(--cmp-field-label-sm-height)",
4912
+ labelGap: "var(--cmp-field-label-sm-gap)",
4910
4913
  labelTypo: "typo-field-sm-bold",
4914
+ labelIcon: "var(--cmp-field-label-sm-icon)",
4911
4915
  icon: 16
4912
4916
  },
4913
4917
  md: {
4914
4918
  height: 36,
4915
4919
  radius: 6,
4916
4920
  fieldGap: 16,
4917
- labelGap: 8,
4921
+ labelHeight: "var(--cmp-field-label-md-height)",
4922
+ labelGap: "var(--cmp-field-label-md-gap)",
4918
4923
  labelTypo: "typo-field-md-bold",
4924
+ labelIcon: "var(--cmp-field-label-md-icon)",
4919
4925
  icon: 16
4920
4926
  }
4921
4927
  };
@@ -5042,7 +5048,7 @@ var SField = /* @__PURE__ */ react.forwardRef(function SField2({
5042
5048
  // 라벨과 컨트롤 사이가 간격 토큰보다 넓어진다. 줄 세우기용 labelWidth 도
5043
5049
  // 뜻이 없다(아래에 컨트롤이 제 폭으로 선다).
5044
5050
  ...labelOnTop ? {} : {
5045
- height: cssLen(labelHeight) ?? s.height,
5051
+ height: cssLen(labelHeight) ?? s.labelHeight,
5046
5052
  marginRight: s.fieldGap,
5047
5053
  width: cssLen(labelWidth)
5048
5054
  }
@@ -5052,7 +5058,7 @@ var SField = /* @__PURE__ */ react.forwardRef(function SField2({
5052
5058
  SIcon,
5053
5059
  {
5054
5060
  name: icon,
5055
- size: s.icon,
5061
+ size: s.labelIcon,
5056
5062
  color: iconColor,
5057
5063
  style: { marginRight: s.labelGap }
5058
5064
  }
@@ -5132,7 +5138,7 @@ var SField = /* @__PURE__ */ react.forwardRef(function SField2({
5132
5138
  effectiveAddonLabel !== "" && /* @__PURE__ */ jsxRuntime.jsxs(
5133
5139
  "div",
5134
5140
  {
5135
- 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",
5141
+ 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",
5136
5142
  style: {
5137
5143
  // 원본 sd-field: labelWidth가 addon 폭(--sd-field-addon-width)에도 적용됨
5138
5144
  width: cssLen(labelWidth),
@@ -5152,7 +5158,7 @@ var SField = /* @__PURE__ */ react.forwardRef(function SField2({
5152
5158
  ]
5153
5159
  }
5154
5160
  ),
5155
- showError ? /* @__PURE__ */ jsxRuntime.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__ */ jsxRuntime.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
5161
+ showError ? /* @__PURE__ */ jsxRuntime.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__ */ jsxRuntime.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
5156
5162
  ]
5157
5163
  }
5158
5164
  )
@@ -5479,8 +5485,8 @@ var CHAT_ATTACHED_FILE_CONFIG = {
5479
5485
  contentGap: "gap-(--cmp-chatAttachedFile-content-gap)",
5480
5486
  /** 클립 아이콘이 앉는 칩 — 내부 패딩·면·라운드 (높이는 아이콘+패딩이 정한다) */
5481
5487
  tile: "p-(--cmp-chatAttachedFile-icon-wrapper-padding) rounded-(--cmp-chatAttachedFile-icon-wrapper-radius) bg-(--cmp-chatAttachedFile-icon-wrapper-bg)",
5482
- /** 칩 안 클립 아이콘 크기(px). SVG width/height 는 속성값이라 CSS 변수를 못 받아 값으로 둔다 (토큰 값과 동일) */
5483
- iconSize: 16,
5488
+ /** 칩 안 클립 아이콘 크기 */
5489
+ iconSize: "var(--cmp-chatAttachedFile-icon-size)",
5484
5490
  /** 파일명 타이포 프리셋 */
5485
5491
  nameTypo: "typo-body-sm-default",
5486
5492
  /** 파일명 텍스트색 */
@@ -5558,8 +5564,8 @@ var CHAT_FILE_CONFIG = {
5558
5564
  * 디자인팀에 `icon.wrapper.bg.hover` 를 요청해 나오는 대로 갈아끼운다.
5559
5565
  */
5560
5566
  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)",
5561
- /** 칩 안 클립 아이콘 크기(px). SVG width/height 는 속성값이라 CSS 변수를 못 받아 값으로 둔다 (토큰 값과 동일) */
5562
- iconSize: 20,
5567
+ /** 칩 안 클립 아이콘 크기 */
5568
+ iconSize: "var(--cmp-chatFile-icon-size)",
5563
5569
  /** 파일명 타이포 프리셋 */
5564
5570
  nameTypo: "typo-body-md-bold",
5565
5571
  /** 파일명·부가정보 텍스트색 */
@@ -5912,7 +5918,7 @@ var SDraggableItemView = /* @__PURE__ */ react.forwardRef(
5912
5918
  paddingYClass,
5913
5919
  // 항목 사이 구분선은 리스트가 그린다.
5914
5920
  bordered && cn(
5915
- "rounded-(--cmp-listDraggableItem-radius-bordered) border border-(--cmp-listDraggableItem-border-default)",
5921
+ "rounded-(--cmp-listDraggableItem-radius-bordered) border-(length:--cmp-listDraggableItem-border-width-default) border-(--cmp-listDraggableItem-border-default)",
5916
5922
  !disabled && !selected && !dragging && cn(
5917
5923
  "hover:border-(--cmp-listDraggableItem-bordered-border-hover)",
5918
5924
  "[[data-drag-active]_&]:hover:border-(--cmp-listDraggableItem-border-default)"
@@ -6784,7 +6790,7 @@ var SExpansionItem = /* @__PURE__ */ react.forwardRef(
6784
6790
  "gap-(--cmp-listExpansionItem-title-gap)",
6785
6791
  // 헤더 액션이 있으면 오른쪽 끝 여백은 액션 칸이 갖고, 버튼은 액션과의 간격만 남긴다
6786
6792
  hasHeaderAction ? "pr-(--cmp-listExpansionItem-title-gap)" : "pr-(--cmp-listExpansionItem-title-paddingX)",
6787
- depth === 2 ? "pl-[36px]" : depth === 3 ? "pl-[56px]" : "pl-[16px]",
6793
+ depth === 2 ? "pl-[36px]" : depth === 3 ? "pl-[56px]" : "pl-(--cmp-listExpansionItem-title-paddingX)",
6788
6794
  isExpanded && "text-(--cmp-listExpansionItem-title-text-expanded)"
6789
6795
  ),
6790
6796
  children: [
@@ -6795,7 +6801,14 @@ var SExpansionItem = /* @__PURE__ */ react.forwardRef(
6795
6801
  "flex transition-transform duration-200 ease-out motion-reduce:transition-none",
6796
6802
  isExpanded && "rotate-180"
6797
6803
  ),
6798
- children: /* @__PURE__ */ jsxRuntime.jsx(SIcon, { name: "caretDown", size: 12, color: "var(--sys-color-fg-quaternary)" })
6804
+ children: /* @__PURE__ */ jsxRuntime.jsx(
6805
+ SIcon,
6806
+ {
6807
+ name: "caretDown",
6808
+ size: "var(--cmp-listExpansionItem-title-icon)",
6809
+ color: "var(--sys-color-fg-quaternary)"
6810
+ }
6811
+ )
6799
6812
  }
6800
6813
  ),
6801
6814
  leadingNode,
@@ -6833,10 +6846,9 @@ var SExpansionItem = /* @__PURE__ */ react.forwardRef(
6833
6846
  className: cn(
6834
6847
  "group/expansion-item relative overflow-hidden bg-(--cmp-listExpansionItem-title-bg-default)",
6835
6848
  // 항목 사이 구분선은 리스트가 그린다.
6836
- // 보더 색은 시맨틱 토큰(border-default → hover strong → 펼침 accentLight)을 쓴다.
6837
- // TODO: expansionItem/bordered/radius 토큰 생성 후 rounded 고정값도 토큰으로 교체한다.
6838
- bordered && "rounded-[8px] border border-border-default hover:border-border-strong [&:has(>button:hover)]:border-border-strong",
6839
- bordered && isExpanded && "!border-border-accentLight",
6849
+ // 보더 색: 기본 → hover → 펼침 순으로 listExpansionItem.border 토큰을 쓴다.
6850
+ 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)",
6851
+ bordered && isExpanded && "!border-(--cmp-listExpansionItem-border-expanded)",
6840
6852
  className
6841
6853
  ),
6842
6854
  ...rest,
@@ -6845,7 +6857,7 @@ var SExpansionItem = /* @__PURE__ */ react.forwardRef(
6845
6857
  "span",
6846
6858
  {
6847
6859
  "aria-hidden": "true",
6848
- className: "pointer-events-none absolute bottom-[-1px] left-0 top-0 z-[1] w-(--cmp-listItem-accentStripe-width) bg-(--cmp-listItem-accentStripe-color)"
6860
+ className: "pointer-events-none absolute bottom-[-1px] left-0 top-0 z-[1] w-(--cmp-listExpansionItem-accentStripe-width) bg-(--cmp-listExpansionItem-accentStripe-color)"
6849
6861
  }
6850
6862
  ),
6851
6863
  hasHeaderAction ? (
@@ -6952,9 +6964,9 @@ var SListItemImpl = /* @__PURE__ */ react.forwardRef(function SListItem({
6952
6964
  dense ? "py-(--cmp-listItem-paddingY-dense)" : "py-(--cmp-listItem-paddingY-normal)",
6953
6965
  "gap-(--cmp-listItem-gap)",
6954
6966
  "pr-(--cmp-listItem-paddingX)",
6955
- depth === 2 ? "pl-[36px]" : depth === 3 ? "pl-[56px]" : "pl-[16px]",
6967
+ depth === 2 ? "pl-[36px]" : depth === 3 ? "pl-[56px]" : "pl-(--cmp-listItem-paddingX)",
6956
6968
  bordered && cn(
6957
- "overflow-hidden rounded-(--cmp-listItem-radius-bordered) border border-(--cmp-listItem-border-default)",
6969
+ "overflow-hidden rounded-(--cmp-listItem-radius-bordered) border-(length:--cmp-listItem-border-width-default) border-(--cmp-listItem-border-default)",
6958
6970
  isSelected ? "border-(--cmp-listItem-bordered-border-selected)" : isInteractive && "hover:border-(--cmp-listItem-bordered-border-hover)"
6959
6971
  ),
6960
6972
  className
@@ -7644,7 +7656,7 @@ function SCheckbox({
7644
7656
  };
7645
7657
  const boxBg = disabled ? "var(--cmp-checkbox-bg-disabled)" : inverse ? "transparent" : isChecked ? "var(--cmp-checkbox-checked-bg-default)" : "var(--cmp-checkbox-unchecked-bg-default)";
7646
7658
  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)";
7647
- const iconColor = disabled ? "var(--cmp-checkbox-checked-icon-disabled)" : "var(--cmp-checkbox-checked-icon-default)";
7659
+ const iconColor = disabled ? "var(--cmp-checkbox-checked-icon-disabled)" : inverse ? "var(--cmp-checkbox-checked-icon-inverse)" : "var(--cmp-checkbox-checked-icon-default)";
7648
7660
  const labelColor = disabled ? "var(--cmp-checkbox-label-disabled)" : inverse ? "var(--cmp-checkbox-label-inverse)" : "var(--cmp-checkbox-label-default)";
7649
7661
  return /* @__PURE__ */ jsxRuntime.jsxs(
7650
7662
  "label",
@@ -7673,7 +7685,7 @@ function SCheckbox({
7673
7685
  SIcon,
7674
7686
  {
7675
7687
  name: state2 === "indeterminate" ? "checkboxIndeterminate" : "checkboxCheck",
7676
- size: 12,
7688
+ size: "var(--cmp-checkbox-icon)",
7677
7689
  color: iconColor
7678
7690
  }
7679
7691
  ) })
@@ -7685,11 +7697,19 @@ function SCheckbox({
7685
7697
  // 찌그러진다 — 띄어쓰기에서만 끊고, 끊을 자리가 없는 긴 토큰만 흘려보낸다
7686
7698
  // (SRadio·SSwitch 라벨과 같은 규칙). 두 사본에 함께 걸려야 하므로 바깥 grid 에 준다.
7687
7699
  /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "grid break-keep wrap-break-word", style: { color: labelColor }, children: [
7688
- /* @__PURE__ */ jsxRuntime.jsx("span", { "aria-hidden": true, className: "typo-body-sm-medium invisible", style: { gridArea: "1 / 1" }, children: label }),
7689
7700
  /* @__PURE__ */ jsxRuntime.jsx(
7690
7701
  "span",
7691
7702
  {
7692
- className: isChecked ? "typo-body-sm-medium" : "typo-body-sm-default",
7703
+ "aria-hidden": true,
7704
+ className: "typo-field-sm-medium invisible",
7705
+ style: { gridArea: "1 / 1" },
7706
+ children: label
7707
+ }
7708
+ ),
7709
+ /* @__PURE__ */ jsxRuntime.jsx(
7710
+ "span",
7711
+ {
7712
+ className: isChecked ? "typo-field-sm-medium" : "typo-field-sm-default",
7693
7713
  style: { gridArea: "1 / 1" },
7694
7714
  children: label
7695
7715
  }
@@ -7701,18 +7721,18 @@ function SCheckbox({
7701
7721
  }
7702
7722
  var TREE_LABEL_TYPOGRAPHY = {
7703
7723
  sm: {
7704
- default: "typo-body-sm-medium",
7705
- selected: "typo-body-sm-bold",
7724
+ default: "typo-item-sm-default",
7725
+ selected: "typo-item-sm-selected",
7706
7726
  rowHeight: "h-[28px]"
7707
7727
  },
7708
7728
  md: {
7709
- default: "typo-body-md-medium",
7710
- selected: "typo-body-md-bold",
7729
+ default: "typo-item-md-default",
7730
+ selected: "typo-item-md-selected",
7711
7731
  rowHeight: "h-[32px]"
7712
7732
  }
7713
7733
  };
7714
7734
  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)";
7715
- var TREE_ROW_BORDER_CLASS = "border-b border-(--cmp-tree-item-border-default)";
7735
+ var TREE_ROW_BORDER_CLASS = "border-b-(length:--cmp-tree-item-border-width-default) border-(--cmp-tree-item-border-default)";
7716
7736
  var TREE_ROW_ACTIVE_CLASS = "bg-(--cmp-tree-item-bg-hover)";
7717
7737
  var TREE_CONTENT_CLASS = "box-border flex min-w-0 flex-1 items-center gap-(--cmp-tree-item-contentGap)";
7718
7738
  function treeLabelClass(size, {
@@ -7722,12 +7742,49 @@ function treeLabelClass(size, {
7722
7742
  }) {
7723
7743
  const typography = TREE_LABEL_TYPOGRAPHY[size];
7724
7744
  return cn(
7725
- "block min-w-0 flex-1 truncate py-(--cmp-tree-item-paddingY) text-(--cmp-tree-item-text-default)",
7745
+ "block min-w-0 truncate py-(--cmp-tree-item-paddingY) text-(--cmp-tree-item-text-default)",
7726
7746
  emphasized ? typography.selected : typography.default,
7727
7747
  disabled && "opacity-60",
7728
- disabled ? "cursor-not-allowed" : selectable ? "cursor-pointer" : void 0
7748
+ disabled ? "cursor-not-allowed" : selectable ? "cursor-pointer" : void 0,
7749
+ selectable && !disabled && "group-hover/tree-label:underline"
7750
+ );
7751
+ }
7752
+ function TreeSelectZone({
7753
+ selectable,
7754
+ disabled = false,
7755
+ control,
7756
+ children
7757
+ }) {
7758
+ return /* @__PURE__ */ jsxRuntime.jsxs(
7759
+ "span",
7760
+ {
7761
+ "data-tree-label": true,
7762
+ className: cn(
7763
+ "flex min-w-0 items-center gap-(--cmp-tree-item-contentGap)",
7764
+ selectable && (disabled ? "cursor-not-allowed" : "group/tree-label cursor-pointer")
7765
+ ),
7766
+ children: [
7767
+ control,
7768
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex min-w-0 items-center gap-sd-8", children: [
7769
+ children,
7770
+ selectable && !disabled && /* @__PURE__ */ jsxRuntime.jsx(
7771
+ SIcon,
7772
+ {
7773
+ name: "chevronRight",
7774
+ size: 12,
7775
+ color: "var(--sys-color-fg-quaternary)",
7776
+ className: "hidden shrink-0 group-hover/tree-label:inline-flex"
7777
+ }
7778
+ )
7779
+ ] })
7780
+ ]
7781
+ }
7729
7782
  );
7730
7783
  }
7784
+ function isRowSelectClick(event) {
7785
+ const zone = event.target.closest("[data-tree-label]");
7786
+ return zone != null && event.currentTarget.contains(zone);
7787
+ }
7731
7788
  function isRowControlClick(event) {
7732
7789
  const control = event.target.closest("[data-tree-control]");
7733
7790
  return control != null && event.currentTarget.contains(control);
@@ -7961,7 +8018,7 @@ var STreeItemImpl = /* @__PURE__ */ react.forwardRef(function STreeItem({
7961
8018
  };
7962
8019
  const handleRowClick = (event) => {
7963
8020
  if (isRowControlClick(event)) return;
7964
- if (selectable && event.target.closest("[data-tree-label]")) {
8021
+ if (selectable && isRowSelectClick(event)) {
7965
8022
  handleSelect(event);
7966
8023
  return;
7967
8024
  }
@@ -8002,35 +8059,41 @@ var STreeItemImpl = /* @__PURE__ */ react.forwardRef(function STreeItem({
8002
8059
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: TREE_CONTENT_CLASS, children: [
8003
8060
  hasChildren ? /* @__PURE__ */ jsxRuntime.jsx(TreeCaret, { expanded, onToggle: (event) => onToggle?.(node, event) }) : /* @__PURE__ */ jsxRuntime.jsx(TreeCaretSpacer, {}),
8004
8061
  leadingNode,
8005
- selectable && /* @__PURE__ */ jsxRuntime.jsx(
8006
- "span",
8062
+ /* @__PURE__ */ jsxRuntime.jsx(
8063
+ TreeSelectZone,
8007
8064
  {
8008
- "data-tree-control": true,
8009
- className: "flex shrink-0",
8010
- "aria-hidden": node.disabled ? "true" : void 0,
8065
+ selectable,
8066
+ disabled: node.disabled,
8067
+ control: selectable && /* @__PURE__ */ jsxRuntime.jsx(
8068
+ "span",
8069
+ {
8070
+ "data-tree-control": true,
8071
+ className: "flex shrink-0",
8072
+ "aria-hidden": node.disabled ? "true" : void 0,
8073
+ children: /* @__PURE__ */ jsxRuntime.jsx(
8074
+ SCheckbox,
8075
+ {
8076
+ value: checkboxValue,
8077
+ disabled: node.disabled,
8078
+ onValueChange: () => handleSelect()
8079
+ }
8080
+ )
8081
+ }
8082
+ ),
8011
8083
  children: /* @__PURE__ */ jsxRuntime.jsx(
8012
- SCheckbox,
8084
+ "span",
8013
8085
  {
8014
- value: checkboxValue,
8015
- disabled: node.disabled,
8016
- onValueChange: () => handleSelect()
8086
+ className: treeLabelClass(size, {
8087
+ emphasized: selected || indeterminate,
8088
+ disabled: Boolean(node.disabled),
8089
+ selectable
8090
+ }),
8091
+ children: node.label
8017
8092
  }
8018
8093
  )
8019
8094
  }
8020
8095
  ),
8021
- /* @__PURE__ */ jsxRuntime.jsx(
8022
- "span",
8023
- {
8024
- "data-tree-label": true,
8025
- className: treeLabelClass(size, {
8026
- emphasized: selected || indeterminate,
8027
- disabled: Boolean(node.disabled),
8028
- selectable
8029
- }),
8030
- children: node.label
8031
- }
8032
- ),
8033
- trailingNode
8096
+ trailingNode != null && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ml-auto flex shrink-0", children: trailingNode })
8034
8097
  ] })
8035
8098
  ]
8036
8099
  }
@@ -8308,7 +8371,7 @@ var SSectionHeaderCardHeaderImpl = /* @__PURE__ */ react.forwardRef(
8308
8371
  "span",
8309
8372
  {
8310
8373
  className: cn(
8311
- "min-w-0 truncate text-(--sys-color-fg-brand)",
8374
+ "min-w-0 truncate text-(--cmp-sectionHeaderCard-title-color)",
8312
8375
  titleSizeClass[titleSize]
8313
8376
  ),
8314
8377
  children: title
@@ -8318,7 +8381,7 @@ var SSectionHeaderCardHeaderImpl = /* @__PURE__ */ react.forwardRef(
8318
8381
  SIcon,
8319
8382
  {
8320
8383
  name: "asterisk",
8321
- size: 16,
8384
+ size: "var(--cmp-sectionHeaderCard-required-icon)",
8322
8385
  color: "var(--sys-color-fg-accent)",
8323
8386
  className: "shrink-0"
8324
8387
  }
@@ -8335,7 +8398,7 @@ var SSectionHeaderCardHeaderImpl = /* @__PURE__ */ react.forwardRef(
8335
8398
  }
8336
8399
  )
8337
8400
  ] }),
8338
- subtitle && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "min-w-0 truncate text-[12px] font-normal leading-[20px] text-(--sys-color-fg-secondary)", children: subtitle }),
8401
+ subtitle && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "min-w-0 truncate typo-body-sm-default text-(--cmp-sectionHeaderCard-subtitle-color)", children: subtitle }),
8339
8402
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ml-auto flex min-h-sd-6 min-w-0 flex-1 items-center justify-end", children: slot })
8340
8403
  ]
8341
8404
  }
@@ -8371,7 +8434,7 @@ var SSectionHeaderCardRootImpl = /* @__PURE__ */ react.forwardRef(
8371
8434
  {
8372
8435
  ref,
8373
8436
  className: cn(
8374
- "box-border flex w-full flex-col items-stretch overflow-hidden rounded-[8px] border border-(--sys-color-border-default) bg-(--sys-color-bg-frame)",
8437
+ "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)",
8375
8438
  className
8376
8439
  ),
8377
8440
  ...rest,
@@ -8923,18 +8986,25 @@ var SCallout = /* @__PURE__ */ react.forwardRef(function SCallout2({ type = "def
8923
8986
  hasDangerTitle && /* @__PURE__ */ jsxRuntime.jsxs(
8924
8987
  "div",
8925
8988
  {
8926
- 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]",
8989
+ 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]",
8927
8990
  style: {
8928
8991
  background: "var(--cmp-callout-danger-title-bg)",
8929
8992
  color: "var(--cmp-callout-danger-title-color)"
8930
8993
  },
8931
8994
  children: [
8932
- /* @__PURE__ */ jsxRuntime.jsx(SIcon, { name: "warningFill", size: 24, color: "var(--cmp-callout-danger-title-color)" }),
8995
+ /* @__PURE__ */ jsxRuntime.jsx(
8996
+ SIcon,
8997
+ {
8998
+ name: "warningFill",
8999
+ size: "var(--cmp-callout-danger-title-icon)",
9000
+ color: "var(--cmp-callout-danger-title-color)"
9001
+ }
9002
+ ),
8933
9003
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "whitespace-nowrap", children: DANGER_TITLE_LABEL })
8934
9004
  ]
8935
9005
  }
8936
9006
  ),
8937
- /* @__PURE__ */ jsxRuntime.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__ */ jsxRuntime.jsx("ul", { className: "m-0 flex list-none flex-col justify-center gap-[var(--cmp-callout-body-gap)] p-0", children: renderItems(message) }) })
9007
+ /* @__PURE__ */ jsxRuntime.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__ */ jsxRuntime.jsx("ul", { className: "m-0 flex list-none flex-col justify-center gap-[var(--cmp-callout-body-gap)] p-0", children: renderItems(message) }) })
8938
9008
  ]
8939
9009
  }
8940
9010
  );
@@ -9005,7 +9075,7 @@ var SContextAlert = /* @__PURE__ */ react.forwardRef(function SContextAlert2({ i
9005
9075
  className: "shrink-0"
9006
9076
  }
9007
9077
  ),
9008
- /* @__PURE__ */ jsxRuntime.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) => (
9078
+ /* @__PURE__ */ jsxRuntime.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) => (
9009
9079
  // 메시지는 HTML 문자열을 허용하되, sanitizeInlineHtml 로 살균 후 innerHTML 렌더 (XSS 방어)
9010
9080
  /* @__PURE__ */ jsxRuntime.jsx(
9011
9081
  "p",
@@ -9250,20 +9320,20 @@ var loading = {
9250
9320
  };
9251
9321
  var SIZE_CONFIG = {
9252
9322
  sm: {
9253
- gap: 4,
9254
- iconSize: 16,
9323
+ gap: "var(--cmp-textLink-sm-gap)",
9324
+ iconSize: "var(--cmp-textLink-sm-icon)",
9255
9325
  typo: "typo-control-xs-medium",
9256
9326
  underlineTypo: "typo-control-xs-underline"
9257
9327
  },
9258
9328
  md: {
9259
- gap: 8,
9260
- iconSize: 16,
9329
+ gap: "var(--cmp-textLink-md-gap)",
9330
+ iconSize: "var(--cmp-textLink-md-icon)",
9261
9331
  typo: "typo-control-sm-default",
9262
9332
  underlineTypo: "typo-control-sm-underline"
9263
9333
  },
9264
9334
  lg: {
9265
- gap: 8,
9266
- iconSize: 20,
9335
+ gap: "var(--cmp-textLink-lg-gap)",
9336
+ iconSize: "var(--cmp-textLink-lg-icon)",
9267
9337
  typo: "typo-control-md-default",
9268
9338
  underlineTypo: "typo-control-md-underline"
9269
9339
  }
@@ -9325,15 +9395,23 @@ var STextLink = /* @__PURE__ */ react.forwardRef(function STextLink2({
9325
9395
  children: label || children
9326
9396
  }
9327
9397
  ),
9328
- rightArrow !== "none" && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "inline-flex h-[16px] w-[16px] items-center justify-center", children: /* @__PURE__ */ jsxRuntime.jsx(
9329
- SIcon,
9398
+ rightArrow !== "none" && // 화살표 칸은 좌측 아이콘과 같은 크기다(textLink.<size>.icon 이 leadingIcon·trailingArrow 공유)
9399
+ /* @__PURE__ */ jsxRuntime.jsx(
9400
+ "span",
9330
9401
  {
9331
- name: rightArrow === "chevron" ? "chevronRight" : "caretRight",
9332
- size: 12,
9333
- color: disabled ? "var(--cmp-textLink-icon-disabled)" : "var(--color-grey-65)",
9334
- rotate: rightArrowRotate
9402
+ className: "inline-flex items-center justify-center",
9403
+ style: { width: s.iconSize, height: s.iconSize },
9404
+ children: /* @__PURE__ */ jsxRuntime.jsx(
9405
+ SIcon,
9406
+ {
9407
+ name: rightArrow === "chevron" ? "chevronRight" : "caretRight",
9408
+ size: 12,
9409
+ color: disabled ? "var(--cmp-textLink-icon-disabled)" : "var(--color-grey-65)",
9410
+ rotate: rightArrowRotate
9411
+ }
9412
+ )
9335
9413
  }
9336
- ) })
9414
+ )
9337
9415
  ]
9338
9416
  }
9339
9417
  );
@@ -9406,24 +9484,38 @@ function DropdownMenuContent({
9406
9484
  ) });
9407
9485
  }
9408
9486
  var SIZE2 = {
9409
- xs: { height: 24, paddingX: 8, gap: 6, arrow: 12, fontSize: 12, minWidth: 64, splitMinWidth: 72 },
9487
+ xs: {
9488
+ height: "var(--cmp-button-xs-height)",
9489
+ paddingX: "var(--cmp-button-xs-paddingX)",
9490
+ gap: "var(--cmp-button-dropdown-xs-gap)",
9491
+ arrow: "var(--cmp-button-dropdown-xs-arrow)",
9492
+ toggleWidth: "var(--cmp-button-iconOnly-xs-width)",
9493
+ fontSize: 12,
9494
+ minWidth: 64,
9495
+ splitMinWidth: 72,
9496
+ radius: "var(--cmp-button-radius-sm)"
9497
+ },
9410
9498
  sm: {
9411
- height: 28,
9412
- paddingX: 12,
9413
- gap: 8,
9414
- arrow: 12,
9499
+ height: "var(--cmp-button-sm-height)",
9500
+ paddingX: "var(--cmp-button-sm-paddingX)",
9501
+ gap: "var(--cmp-button-dropdown-sm-gap)",
9502
+ arrow: "var(--cmp-button-dropdown-sm-arrow)",
9503
+ toggleWidth: "var(--cmp-button-iconOnly-sm-width)",
9415
9504
  fontSize: 12,
9416
9505
  minWidth: 72,
9417
- splitMinWidth: 88
9506
+ splitMinWidth: 88,
9507
+ radius: "var(--cmp-button-radius-sm)"
9418
9508
  },
9419
9509
  md: {
9420
- height: 36,
9421
- paddingX: 20,
9422
- gap: 16,
9423
- arrow: 16,
9510
+ height: "var(--cmp-button-md-height)",
9511
+ paddingX: "var(--cmp-button-md-paddingX)",
9512
+ gap: "var(--cmp-button-dropdown-md-gap)",
9513
+ arrow: "var(--cmp-button-dropdown-md-arrow)",
9514
+ toggleWidth: "var(--cmp-button-iconOnly-md-width)",
9424
9515
  fontSize: 16,
9425
9516
  minWidth: 100,
9426
- splitMinWidth: 106
9517
+ splitMinWidth: 106,
9518
+ radius: "var(--cmp-button-radius-md)"
9427
9519
  }
9428
9520
  };
9429
9521
  function splitDivider(color, outline) {
@@ -9505,7 +9597,7 @@ var SDropdownButtonImpl = /* @__PURE__ */ react.forwardRef(
9505
9597
  );
9506
9598
  const splitIcon = /* @__PURE__ */ jsxRuntime.jsx(SIcon, { name: "etc", size: s.arrow, color: "var(--dd-icon)" });
9507
9599
  const triggerBase = cn(
9508
- "box-border inline-flex items-center whitespace-nowrap border border-solid outline-none transition-colors",
9600
+ "box-border inline-flex items-center whitespace-nowrap border-[length:var(--cmp-button-border-width-default)] border-solid outline-none transition-colors",
9509
9601
  "border-[color:var(--dd-border)] bg-[var(--dd-bg)] text-[color:var(--dd-text)]",
9510
9602
  disabled ? "cursor-not-allowed" : "cursor-pointer hover:bg-[var(--dd-bg-hover)]"
9511
9603
  );
@@ -9544,10 +9636,12 @@ var SDropdownButtonImpl = /* @__PURE__ */ react.forwardRef(
9544
9636
  type: "button",
9545
9637
  disabled,
9546
9638
  onClick: onLabelClick,
9547
- className: cn(triggerBase, "flex-1 justify-center rounded-l-[4px] border-r-0"),
9639
+ className: cn(triggerBase, "flex-1 justify-center border-r-0"),
9548
9640
  style: {
9641
+ borderTopLeftRadius: s.radius,
9642
+ borderBottomLeftRadius: s.radius,
9549
9643
  minHeight: s.height,
9550
- padding: `0 ${s.paddingX}px`,
9644
+ padding: `0 ${s.paddingX}`,
9551
9645
  fontSize: s.fontSize,
9552
9646
  ...colorVars
9553
9647
  },
@@ -9561,10 +9655,15 @@ var SDropdownButtonImpl = /* @__PURE__ */ react.forwardRef(
9561
9655
  type: "button",
9562
9656
  disabled,
9563
9657
  "aria-label": "\uBA54\uB274 \uC5F4\uAE30",
9564
- className: cn(triggerBase, "justify-center rounded-r-[4px] border-l"),
9658
+ className: cn(
9659
+ triggerBase,
9660
+ "justify-center border-l-[length:var(--cmp-button-border-width-default)]"
9661
+ ),
9565
9662
  style: {
9663
+ borderTopRightRadius: s.radius,
9664
+ borderBottomRightRadius: s.radius,
9566
9665
  minHeight: s.height,
9567
- minWidth: s.height,
9666
+ minWidth: s.toggleWidth,
9568
9667
  borderLeftColor: disabled ? "var(--cmp-button-border-disabled)" : splitDivider(color, outline),
9569
9668
  ...colorVars
9570
9669
  },
@@ -9578,11 +9677,12 @@ var SDropdownButtonImpl = /* @__PURE__ */ react.forwardRef(
9578
9677
  {
9579
9678
  type: "button",
9580
9679
  disabled,
9581
- className: cn(triggerBase, "justify-between rounded-[4px]", className),
9680
+ className: cn(triggerBase, "justify-between rounded-(--dd-radius)", className),
9582
9681
  style: {
9682
+ ...{ "--dd-radius": s.radius },
9583
9683
  minWidth: s.minWidth,
9584
9684
  minHeight: s.height,
9585
- padding: `0 ${s.paddingX}px`,
9685
+ padding: `0 ${s.paddingX}`,
9586
9686
  gap: s.gap,
9587
9687
  fontSize: s.fontSize,
9588
9688
  ...colorVars,
@@ -9692,13 +9792,13 @@ function SSwitch({
9692
9792
  style
9693
9793
  }) {
9694
9794
  const right = rightLabel;
9695
- const renderLabel = (text) => text ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "typo-body-sm-medium break-keep wrap-break-word", children: text }) : null;
9795
+ const renderLabel = (text) => text ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "typo-field-sm-medium break-keep wrap-break-word", children: text }) : null;
9696
9796
  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)";
9697
9797
  return /* @__PURE__ */ jsxRuntime.jsxs(
9698
9798
  "label",
9699
9799
  {
9700
9800
  className: cn(
9701
- "inline-flex items-center gap-[6px]",
9801
+ "inline-flex items-center gap-(--cmp-switch-gap)",
9702
9802
  disabled ? "cursor-not-allowed" : "cursor-pointer",
9703
9803
  className
9704
9804
  ),
@@ -9712,14 +9812,14 @@ function SSwitch({
9712
9812
  disabled,
9713
9813
  onCheckedChange: (v) => onValueChange?.(v),
9714
9814
  className: cn(
9715
- "relative h-[20px] w-[32px] flex-shrink-0 rounded-full p-[2px] outline-none transition-colors duration-200",
9815
+ "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",
9716
9816
  disabled ? "cursor-not-allowed" : "cursor-pointer"
9717
9817
  ),
9718
9818
  style: { background: trackBg },
9719
9819
  children: /* @__PURE__ */ jsxRuntime.jsx(
9720
9820
  RSwitch__namespace.Thumb,
9721
9821
  {
9722
- 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]",
9822
+ 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)]",
9723
9823
  style: {
9724
9824
  background: disabled ? "var(--cmp-switch-knob-disabled)" : "var(--cmp-switch-knob-default)"
9725
9825
  }
@@ -10447,8 +10547,8 @@ var SSystemActionButton = /* @__PURE__ */ react.forwardRef(
10447
10547
  }
10448
10548
  );
10449
10549
  var SIZE_CLASSES = {
10450
- xs: "h-[24px] px-[8px] text-[12px] font-normal leading-[20px]",
10451
- sm: "h-[28px] px-[12px] text-[14px] font-medium leading-[24px]"
10550
+ xs: "h-(--cmp-toggle-xs-height) px-(--cmp-toggle-xs-paddingX) typo-control-xs-default",
10551
+ sm: "h-(--cmp-toggle-sm-height) px-(--cmp-toggle-sm-paddingX) typo-control-sm-default"
10452
10552
  };
10453
10553
  function SToggle({
10454
10554
  value = false,
@@ -10470,7 +10570,7 @@ function SToggle({
10470
10570
  "aria-pressed": value,
10471
10571
  onClick: () => !disabled && onValueChange?.(!value),
10472
10572
  className: cn(
10473
- "box-border inline-flex items-center justify-center whitespace-nowrap rounded-full border border-solid transition-colors",
10573
+ "box-border inline-flex items-center justify-center whitespace-nowrap rounded-(--cmp-toggle-radius) border-(length:--cmp-toggle-border-width) border-solid transition-colors",
10474
10574
  SIZE_CLASSES[size],
10475
10575
  disabled ? "cursor-not-allowed" : "cursor-pointer",
10476
10576
  // 미선택(off) hover 시 파란 채움 + 흰 글자
@@ -10556,10 +10656,17 @@ function SPopover({
10556
10656
  menuTitle && /* @__PURE__ */ jsxRuntime.jsxs(
10557
10657
  "div",
10558
10658
  {
10559
- className: "flex items-center gap-[var(--cmp-popover-title-gap)] text-[14px] font-bold leading-[24px]",
10659
+ className: "typo-feedback-md-bold flex items-center gap-[var(--cmp-popover-title-gap)]",
10560
10660
  style: { color: titleColor },
10561
10661
  children: [
10562
- titleIcon && /* @__PURE__ */ jsxRuntime.jsx(SIcon, { name: titleIcon, size: 16, color: titleColor }),
10662
+ titleIcon && /* @__PURE__ */ jsxRuntime.jsx(
10663
+ SIcon,
10664
+ {
10665
+ name: titleIcon,
10666
+ size: "var(--cmp-popover-title-leadingIcon)",
10667
+ color: titleColor
10668
+ }
10669
+ ),
10563
10670
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "min-w-0", children: menuTitle })
10564
10671
  ]
10565
10672
  }
@@ -10696,14 +10803,14 @@ function SGuide({
10696
10803
  }
10697
10804
  setOpen((o) => !o);
10698
10805
  },
10699
- 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",
10806
+ 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",
10700
10807
  style: {
10701
10808
  borderColor: active ? activeBg : "var(--cmp-guide-button-border-default)",
10702
10809
  background: active ? activeBg : "var(--cmp-guide-button-bg-default)",
10703
10810
  color: active ? "var(--cmp-guide-button-text-active)" : "var(--cmp-guide-button-text-default)"
10704
10811
  },
10705
10812
  children: [
10706
- /* @__PURE__ */ jsxRuntime.jsx(SIcon, { name: iconName, size: 16, color: iconColor }),
10813
+ /* @__PURE__ */ jsxRuntime.jsx(SIcon, { name: iconName, size: "var(--cmp-guide-button-icon-size)", color: iconColor }),
10707
10814
  label || defaultLabel
10708
10815
  ]
10709
10816
  }
@@ -10753,11 +10860,11 @@ function SGuide({
10753
10860
  color: isNotion ? "var(--sys-color-fg-primary)" : "var(--cmp-guide-contents-icon)"
10754
10861
  }
10755
10862
  ),
10756
- /* @__PURE__ */ jsxRuntime.jsx("h3", { className: "m-0 break-keep text-[16px] font-bold leading-[26px] text-[color:var(--cmp-guide-contents-typography-color)]", children: popupTitle || defaultLabel })
10863
+ /* @__PURE__ */ jsxRuntime.jsx("h3", { className: "typo-heading-md m-0 break-keep text-[color:var(--cmp-guide-contents-typography-color)]", children: popupTitle || defaultLabel })
10757
10864
  ]
10758
10865
  }
10759
10866
  ),
10760
- /* @__PURE__ */ jsxRuntime.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__ */ jsxRuntime.jsx(
10867
+ /* @__PURE__ */ jsxRuntime.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__ */ jsxRuntime.jsx(
10761
10868
  "li",
10762
10869
  {
10763
10870
  className: cn(
@@ -11028,15 +11135,22 @@ function SConfirmModal({
11028
11135
  showClose: true,
11029
11136
  onClose: () => settle(onClose),
11030
11137
  className: "w-fit min-w-[min(520px,calc(100dvw-48px))]",
11031
- children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex min-h-0 flex-auto flex-col items-center gap-[40px] px-[32px] py-[40px]", children: [
11032
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex w-full min-h-0 flex-col items-center gap-[20px] overflow-y-auto", children: [
11033
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col items-center gap-[12px]", children: [
11034
- iconName && /* @__PURE__ */ jsxRuntime.jsx(SIcon, { name: iconName, size: 32, color: TYPE_ICON_COLOR[type] }),
11138
+ children: /* @__PURE__ */ jsxRuntime.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: [
11139
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex w-full min-h-0 flex-col items-center gap-(--cmp-modal-confirm-body-gap) overflow-y-auto", children: [
11140
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col items-center gap-(--cmp-modal-confirm-title-gap)", children: [
11141
+ iconName && /* @__PURE__ */ jsxRuntime.jsx(
11142
+ SIcon,
11143
+ {
11144
+ name: iconName,
11145
+ size: "var(--cmp-modal-confirm-title-icon)",
11146
+ color: TYPE_ICON_COLOR[type]
11147
+ }
11148
+ ),
11035
11149
  /* @__PURE__ */ jsxRuntime.jsx(
11036
11150
  "h2",
11037
11151
  {
11038
11152
  className: cn(
11039
- "text-center text-[18px] font-bold leading-[30px] text-[color:var(--cmp-modal-confirm-title-color)]",
11153
+ "typo-heading-lg text-center text-[color:var(--cmp-modal-confirm-title-color)]",
11040
11154
  titleClassName
11041
11155
  ),
11042
11156
  children: modalTitle
@@ -11125,7 +11239,7 @@ function SOverlayHeader({
11125
11239
  {
11126
11240
  className: cn(
11127
11241
  "m-0 overflow-hidden text-ellipsis whitespace-nowrap",
11128
- "text-[16px] font-bold leading-[26px]",
11242
+ "typo-heading-md",
11129
11243
  titleClassName
11130
11244
  ),
11131
11245
  style: { color: "var(--cmp-overlay-header-title-color)" },
@@ -11220,8 +11334,8 @@ function SLoadingModal({
11220
11334
  showButton = false,
11221
11335
  buttonLabel,
11222
11336
  onButtonClick,
11223
- width = 520,
11224
- height = 320
11337
+ width = "var(--cmp-modal-loading-width)",
11338
+ height = "var(--cmp-modal-loading-height)"
11225
11339
  }) {
11226
11340
  const resolvedMessage = message ?? DEFAULT_MESSAGE[state2];
11227
11341
  const lines = Array.isArray(resolvedMessage) ? resolvedMessage : resolvedMessage ? [resolvedMessage] : [];
@@ -11237,8 +11351,15 @@ function SLoadingModal({
11237
11351
  ariaTitle: lines[0] || "\uB85C\uB529 \uC911",
11238
11352
  width,
11239
11353
  height,
11240
- children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex min-h-0 flex-auto flex-col overflow-y-auto px-[32px]", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "m-auto flex flex-col items-center gap-[20px]", children: [
11241
- state2 === "loading" ? progress !== void 0 ? /* @__PURE__ */ jsxRuntime.jsx(SCircleProgress, { value: progress }) : /* @__PURE__ */ jsxRuntime.jsx(SCircleProgress, { indeterminate: true }) : /* @__PURE__ */ jsxRuntime.jsx(SIcon, { name: "warningOutline", size: 80, color: "var(--cmp-modal-confirm-negative-icon)" }),
11354
+ children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex min-h-0 flex-auto flex-col overflow-y-auto px-[32px]", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "m-auto flex flex-col items-center gap-(--cmp-modal-loading-gap)", children: [
11355
+ state2 === "loading" ? progress !== void 0 ? /* @__PURE__ */ jsxRuntime.jsx(SCircleProgress, { value: progress }) : /* @__PURE__ */ jsxRuntime.jsx(SCircleProgress, { indeterminate: true }) : /* @__PURE__ */ jsxRuntime.jsx(
11356
+ SIcon,
11357
+ {
11358
+ name: "warningOutline",
11359
+ size: "var(--cmp-modal-loading-content)",
11360
+ color: "var(--cmp-modal-confirm-negative-icon)"
11361
+ }
11362
+ ),
11242
11363
  lines.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-col gap-[2px]", children: lines.map((m, i) => /* @__PURE__ */ jsxRuntime.jsx(
11243
11364
  "p",
11244
11365
  {
@@ -12026,13 +12147,8 @@ var LAUNCHER_LIST_BOX_LAYOUT = {
12026
12147
  radius: gnb("launcher-listBox-radius"),
12027
12148
  /** 패널 상하좌우 여백 */
12028
12149
  padding: gnb("launcher-listBox-paddingAll"),
12029
- /**
12030
- * 패널 그림자.
12031
- * 토큰(`component.gnb.launcher.listBox.shadow` = `{shadow.floating}`)은 값이 배열이라
12032
- * `--cmp-*` 로 나오지 않는다 — 생성기가 스칼라만 내보내기 때문이다. 그래서 그 별칭이
12033
- * 가리키는 스케일 토큰을 직접 쓴다(같은 값이다).
12034
- */
12035
- shadow: "var(--shadow-floating)",
12150
+ /** 패널 그림자 */
12151
+ shadow: gnb("launcher-listBox-shadow"),
12036
12152
  /** 줄 왼쪽 여백 */
12037
12153
  itemPaddingLeft: gnb("launcher-button-paddingLeft"),
12038
12154
  /** 줄 오른쪽 여백 — 왼쪽보다 좁다(오른쪽 끝은 hover 아이콘 자리다) */
@@ -12403,20 +12519,19 @@ var GNB_MENU = {
12403
12519
  depth3PaddingLeft: box2("item-depth3-paddingLeft"),
12404
12520
  depth1Icon: box2("item-depth1-icon"),
12405
12521
  // box 는 depth1 전용 타이포 토큰이 없어 depth1 도 selected 타이포를 따른다
12522
+ depth1Typo: "typo-navigation-lg-semibold",
12523
+ // token: gnb.box.item.typography.selected
12524
+ itemTypo: "typo-navigation-lg-medium",
12525
+ // token: gnb.box.item.typography.default
12526
+ itemTypoSelected: "typo-navigation-lg-semibold",
12527
+ // token: gnb.box.item.typography.selected
12406
12528
  depth1FontSize: 14,
12407
- // token: gnb.box.item.typography.selected.fontSize
12408
12529
  depth1LineHeight: 24,
12409
- // token: gnb.box.item.typography.selected.lineHeight
12410
12530
  depth1FontWeight: 600,
12411
- // token: gnb.box.item.typography.selected.fontWeight
12412
12531
  itemFontSize: 14,
12413
- // token: gnb.box.item.typography.default.fontSize
12414
12532
  itemLineHeight: 24,
12415
- // token: gnb.box.item.typography.default.lineHeight
12416
12533
  itemFontWeight: 500,
12417
- // token: gnb.box.item.typography.default.fontWeight
12418
12534
  itemFontWeightSelected: 600
12419
- // token: gnb.box.item.typography.selected.fontWeight
12420
12535
  },
12421
12536
  belt: {
12422
12537
  bodyPaddingY: gnb2("body-padding"),
@@ -12433,20 +12548,19 @@ var GNB_MENU = {
12433
12548
  depth3PaddingLeft: belt("item-depth3-paddingLeft"),
12434
12549
  depth1Icon: belt("item-depth1-icon"),
12435
12550
  // belt 전용 depth1 아이콘 토큰(16)
12551
+ depth1Typo: "typo-navigation-md-bold",
12552
+ // token: gnb.belt.item.depth1.typography
12553
+ itemTypo: "typo-navigation-sm-medium",
12554
+ // token: gnb.belt.item.typography.default
12555
+ itemTypoSelected: "typo-navigation-sm-bold",
12556
+ // token: gnb.belt.item.typography.selected
12436
12557
  depth1FontSize: 13,
12437
- // token: gnb.belt.item.depth1.typography.fontSize
12438
12558
  depth1LineHeight: 22,
12439
- // token: gnb.belt.item.depth1.typography.lineHeight
12440
12559
  depth1FontWeight: 700,
12441
- // token: gnb.belt.item.depth1.typography.fontWeight
12442
12560
  itemFontSize: 12,
12443
- // token: gnb.belt.item.typography.default.fontSize
12444
12561
  itemLineHeight: 20,
12445
- // token: gnb.belt.item.typography.default.lineHeight
12446
12562
  itemFontWeight: 500,
12447
- // token: gnb.belt.item.typography.default.fontWeight
12448
12563
  itemFontWeightSelected: 700
12449
- // token: gnb.belt.item.typography.selected.fontWeight
12450
12564
  }
12451
12565
  };
12452
12566
  var GNB_COLORS = {
@@ -12491,15 +12605,16 @@ var GNB_RAIL = {
12491
12605
  itemPaddingBottom: gnb2("rail-item-paddingBottom"),
12492
12606
  itemRadius: gnb2("rail-item-radius"),
12493
12607
  itemIcon: gnb2("rail-item-icon"),
12494
- // 타이포 (theme.css 에 gnb 타이포 변수 없음 → 토큰 값 직접 명시)
12608
+ // 타이포 — 토큰이 가리키는 typo-* 클래스
12609
+ itemTypo: "typo-navigation-xs-medium",
12610
+ // token: gnb.rail.item.typography.default
12611
+ itemTypoSelected: "typo-navigation-xs-bold",
12612
+ // token: gnb.rail.item.typography.selected
12613
+ // 아래 숫자는 공개 export 라 남겨 둔 같은 값이다 — 렌더에는 쓰지 않는다
12495
12614
  itemFontSize: 11,
12496
- // token: gnb.rail.item.typography.default.fontSize
12497
12615
  itemLineHeight: 18,
12498
- // token: gnb.rail.item.typography.default.lineHeight
12499
12616
  itemFontWeight: 500,
12500
- // token: gnb.rail.item.typography.default.fontWeight
12501
12617
  itemFontWeightSelected: 700
12502
- // token: gnb.rail.item.typography.selected.fontWeight
12503
12618
  };
12504
12619
  var GNB_RAIL_WIDTH = 68;
12505
12620
  var GNB_FOLD_MS = 200;
@@ -12733,7 +12848,10 @@ var SGnb = /* @__PURE__ */ react.forwardRef(function SGnb2({
12733
12848
  type: "button",
12734
12849
  disabled: item4.disabled,
12735
12850
  "aria-current": isActive ? "true" : void 0,
12736
- className: "box-border flex select-none flex-col items-center border-none bg-transparent transition-colors duration-150",
12851
+ className: cn(
12852
+ "box-border flex select-none flex-col items-center border-none bg-transparent transition-colors duration-150",
12853
+ isActive ? GNB_RAIL.itemTypoSelected : GNB_RAIL.itemTypo
12854
+ ),
12737
12855
  style: {
12738
12856
  width: GNB_RAIL.itemWidth,
12739
12857
  paddingTop: GNB_RAIL.itemPaddingTop,
@@ -12743,9 +12861,6 @@ var SGnb = /* @__PURE__ */ react.forwardRef(function SGnb2({
12743
12861
  color: isActive ? C.itemColorActive : C.railFgDefault,
12744
12862
  // <button> 의 UA 폰트를 끊고 앱 폰트를 잇는다 (메뉴 아이템과 같은 이유)
12745
12863
  fontFamily: "inherit",
12746
- fontSize: GNB_RAIL.itemFontSize,
12747
- lineHeight: `${GNB_RAIL.itemLineHeight}px`,
12748
- fontWeight: isActive ? GNB_RAIL.itemFontWeightSelected : GNB_RAIL.itemFontWeight,
12749
12864
  opacity: item4.disabled ? 0.4 : 1,
12750
12865
  cursor: item4.disabled ? "not-allowed" : "pointer"
12751
12866
  },
@@ -12784,9 +12899,6 @@ var SGnb = /* @__PURE__ */ react.forwardRef(function SGnb2({
12784
12899
  color: isSelected ? C.itemColorActive : isHovered ? C.itemColorHover : C.itemColorDefault,
12785
12900
  // <button> 의 UA 폰트(Arial 13.3px)를 끊고 앱 폰트를 잇는다
12786
12901
  fontFamily: "inherit",
12787
- fontSize: depth === 1 ? M.depth1FontSize : M.itemFontSize,
12788
- lineHeight: `${depth === 1 ? M.depth1LineHeight : M.itemLineHeight}px`,
12789
- fontWeight: depth === 1 ? M.depth1FontWeight : isSelected ? M.itemFontWeightSelected : M.itemFontWeight,
12790
12902
  opacity: item4.disabled ? 0.4 : 1,
12791
12903
  cursor: item4.disabled ? "not-allowed" : "pointer"
12792
12904
  };
@@ -12801,7 +12913,10 @@ var SGnb = /* @__PURE__ */ react.forwardRef(function SGnb2({
12801
12913
  disabled: item4.disabled,
12802
12914
  "aria-expanded": hasChildren ? isExpanded : void 0,
12803
12915
  "aria-current": isSelected ? "page" : void 0,
12804
- className: "box-border flex select-none items-center border-none bg-transparent text-left transition-colors duration-150",
12916
+ className: cn(
12917
+ "box-border flex select-none items-center border-none bg-transparent text-left transition-colors duration-150",
12918
+ depth === 1 ? M.depth1Typo : isSelected ? M.itemTypoSelected : M.itemTypo
12919
+ ),
12805
12920
  style: itemStyle,
12806
12921
  onClick: () => handleItemClick(item4),
12807
12922
  ...rowHoverProps(item4),
@@ -13987,8 +14102,10 @@ var SPageHeader = /* @__PURE__ */ withDisplayName(
13987
14102
  );
13988
14103
 
13989
14104
  // src/components/STabs/tabs.config.ts
13990
- var TAB_MAIN_SIZE = { height: 36, paddingX: 24 };
13991
- var TAB_TYPOGRAPHY = { fontSize: 12, lineHeight: 20 };
14105
+ var TAB_MAIN_SIZE = {
14106
+ height: "var(--cmp-tab-main-height)",
14107
+ paddingX: "var(--cmp-tab-main-paddingX)"
14108
+ };
13992
14109
  var TAB_MAIN_COLORS = {
13993
14110
  selected: {
13994
14111
  bg: "var(--cmp-tab-main-selected-bg)",
@@ -14033,7 +14150,7 @@ function STabs({
14033
14150
  // main(가로): baseline(하단 divider)이 100% 너비로 채워지도록 w-full
14034
14151
  sub ? "inline-flex w-fit" : "flex w-full",
14035
14152
  isVertical ? "flex-col items-stretch" : "flex-row",
14036
- sub ? isVertical ? "gap-[16px]" : "gap-[24px]" : "gap-[4px]",
14153
+ sub ? isVertical ? "gap-(--cmp-tab-sub-gap-vertical)" : "gap-(--cmp-tab-sub-gap-horizontal)" : "gap-(--cmp-tab-main-container-gap)",
14037
14154
  className
14038
14155
  ),
14039
14156
  style: containerStyle,
@@ -14043,30 +14160,26 @@ function STabs({
14043
14160
  let tabStyle;
14044
14161
  if (sub) {
14045
14162
  tabStyle = {
14046
- height: 20,
14047
- paddingBottom: 4,
14048
- fontSize: TAB_TYPOGRAPHY.fontSize,
14049
- lineHeight: `${TAB_TYPOGRAPHY.lineHeight}px`,
14163
+ height: "var(--cmp-tab-sub-item-height)",
14164
+ paddingBottom: "var(--cmp-tab-sub-content-gap)",
14050
14165
  color: selected ? TAB_SUB_COLORS.selected.text : TAB_SUB_COLORS.default.text,
14051
- borderBottom: `1px solid ${selected ? TAB_SUB_COLORS.selected.line : "transparent"}`
14166
+ borderBottom: `var(--cmp-tab-sub-border-width) solid ${selected ? TAB_SUB_COLORS.selected.line : "transparent"}`
14052
14167
  };
14053
14168
  } else {
14054
14169
  const border = selected ? TAB_MAIN_COLORS.selected.border : TAB_MAIN_COLORS.default.border;
14055
14170
  const selectedBg = TAB_MAIN_COLORS.selected.bg;
14056
14171
  tabStyle = {
14057
14172
  height: TAB_MAIN_SIZE.height,
14058
- padding: `0 ${TAB_MAIN_SIZE.paddingX}px`,
14059
- fontSize: TAB_TYPOGRAPHY.fontSize,
14060
- lineHeight: `${TAB_TYPOGRAPHY.lineHeight}px`,
14173
+ padding: `0 ${TAB_MAIN_SIZE.paddingX}`,
14061
14174
  background: selected ? TAB_MAIN_COLORS.selected.bg : TAB_MAIN_COLORS.default.bg,
14062
14175
  color: selected ? TAB_MAIN_COLORS.selected.text : TAB_MAIN_COLORS.default.text,
14063
- border: `1px solid ${border}`,
14176
+ border: `var(--cmp-tab-main-border-width) solid ${border}`,
14064
14177
  // 폴더형: 미선택 탭은 baseline 위에, 선택 탭은 baseline(파란선)을 1px 덮어 연결된 것처럼 보이게
14065
- borderTopLeftRadius: 6,
14066
- borderTopRightRadius: 6,
14178
+ borderTopLeftRadius: "var(--cmp-tab-main-radius)",
14179
+ borderTopRightRadius: "var(--cmp-tab-main-radius)",
14067
14180
  borderBottomLeftRadius: 0,
14068
14181
  borderBottomRightRadius: 0,
14069
- borderBottom: selected ? `1px solid ${selectedBg}` : "none",
14182
+ borderBottom: selected ? `var(--cmp-tab-main-border-width) solid ${selectedBg}` : "none",
14070
14183
  marginBottom: selected ? -1 : 0
14071
14184
  };
14072
14185
  }
@@ -14103,12 +14216,17 @@ function STabs({
14103
14216
  moveTo(tabs.length - 1);
14104
14217
  }
14105
14218
  },
14106
- 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",
14219
+ className: cn(
14220
+ "relative box-border inline-flex cursor-pointer select-none items-center justify-center whitespace-nowrap outline-none transition-[color,background-color] duration-200",
14221
+ sub ? "gap-[8px]" : "gap-(--cmp-tab-main-gap)",
14222
+ // 타이포 (token: tab.<main|sub>.<selected|default>.typography)
14223
+ selected ? "typo-navigation-sm-bold" : "typo-navigation-sm-default"
14224
+ ),
14107
14225
  style: tabStyle,
14108
14226
  children: [
14109
14227
  /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "grid", children: [
14110
14228
  /* @__PURE__ */ jsxRuntime.jsx("span", { "aria-hidden": true, className: "invisible font-bold", style: { gridArea: "1 / 1" }, children: tab.label }),
14111
- /* @__PURE__ */ jsxRuntime.jsx("span", { style: { gridArea: "1 / 1", fontWeight: selected ? 700 : 400 }, children: tab.label })
14229
+ /* @__PURE__ */ jsxRuntime.jsx("span", { style: { gridArea: "1 / 1" }, children: tab.label })
14112
14230
  ] }),
14113
14231
  tab.badge !== void 0 && tab.badge !== null && tab.badge !== "" && /* @__PURE__ */ jsxRuntime.jsx(
14114
14232
  STag,
@@ -14159,7 +14277,7 @@ function SPagination({
14159
14277
  "aria-label": aria,
14160
14278
  onClick,
14161
14279
  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)]",
14162
- children: /* @__PURE__ */ jsxRuntime.jsx(SIcon, { name: icon, size: 12, color: "var(--color-grey-65)" })
14280
+ children: /* @__PURE__ */ jsxRuntime.jsx(SIcon, { name: icon, size: "var(--cmp-pagination-icon)", color: "var(--color-grey-65)" })
14163
14281
  }
14164
14282
  );
14165
14283
  const prevButtons = simple ? currentPage > 1 && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
@@ -14183,8 +14301,8 @@ function SPagination({
14183
14301
  style,
14184
14302
  children: [
14185
14303
  /* @__PURE__ */ jsxRuntime.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 }),
14186
- simple ? /* @__PURE__ */ jsxRuntime.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: [
14187
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-bold text-[color:var(--cmp-pagination-item-content-selected)]", children: currentPage }),
14304
+ simple ? /* @__PURE__ */ jsxRuntime.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: [
14305
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "typo-control-xs-bold text-[color:var(--cmp-pagination-item-content-selected)]", children: currentPage }),
14188
14306
  /* @__PURE__ */ jsxRuntime.jsx("span", { children: "/" }),
14189
14307
  /* @__PURE__ */ jsxRuntime.jsx("span", { children: lastPage })
14190
14308
  ] }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center gap-[var(--cmp-pagination-move-gap)]", children: pageNumbers.map((n) => {
@@ -14196,8 +14314,8 @@ function SPagination({
14196
14314
  "aria-current": selected ? "page" : void 0,
14197
14315
  onClick: () => go(n),
14198
14316
  className: cn(
14199
- "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]",
14200
- 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)]"
14317
+ "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)]",
14318
+ 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)]"
14201
14319
  ),
14202
14320
  style: { width: itemWidth },
14203
14321
  children: n
@@ -14220,15 +14338,18 @@ var STEPPER_SIZE_CONFIG = {
14220
14338
  sequenceSize: V2("sm-sequence-size"),
14221
14339
  fontSize: "12px",
14222
14340
  lineHeight: "20px",
14223
- fontWeightActive: 700,
14224
- fontWeightDefault: 500
14341
+ typoDefault: "typo-navigation-sm-medium",
14342
+ typoActive: "typo-navigation-sm-bold",
14343
+ fontWeightActive: 700
14225
14344
  },
14226
14345
  lg: {
14227
14346
  sequenceSize: V2("lg-sequence-size"),
14228
14347
  fontSize: "14px",
14229
14348
  lineHeight: "24px",
14230
- fontWeightActive: 700,
14231
- fontWeightDefault: 500
14349
+ typoDefault: "typo-navigation-lg-medium",
14350
+ // 토큰(navigation.lg.semibold)은 600 인데 지금 700 으로 그린다 — 값이 달라 토큰을 쓰지 않는다
14351
+ typoActive: null,
14352
+ fontWeightActive: 700
14232
14353
  }
14233
14354
  };
14234
14355
  var STEPPER_LAYOUT = {
@@ -14254,7 +14375,9 @@ var STEPPER_COLORS = {
14254
14375
  sequenceText: {
14255
14376
  active: V2("sequence-text-active"),
14256
14377
  default: V2("sequence-text-default"),
14257
- completed: VF("sequence-text-completed", "#0075FF")
14378
+ // 완료 시퀀스의 체크 아이콘 색은 전용 토큰이 없다(stepper.sequence.text 에 completed 가 없음).
14379
+ // 진행 중 시퀀스 숫자와 같은 accent 색을 시맨틱 토큰으로 직접 쓴다.
14380
+ completed: "var(--sys-color-fg-accent)"
14258
14381
  },
14259
14382
  text: {
14260
14383
  active: V2("text-active"),
@@ -14269,14 +14392,15 @@ var STEPPER_HORIZONTAL_COMPLETED_COLORS = {
14269
14392
  text: STEPPER_COLORS.text.completed
14270
14393
  };
14271
14394
  var STEPPER_VERTICAL_LAYOUT = {
14272
- width: VF("vertical-width", "240px"),
14395
+ /** 세로형 폭. 대응 토큰이 없어 디자인 값을 그대로 쓴다(stepper.vertical 에 width 가 없음). */
14396
+ width: "240px",
14273
14397
  itemGap: VF("vertical-item-gap", "12px"),
14274
14398
  itemPaddingX: VF("vertical-item-paddingX", "16px"),
14275
14399
  itemPaddingY: VF("vertical-item-paddingY", "8px"),
14276
14400
  titlePaddingTop: VF("vertical-title-paddingTop", "12px"),
14277
14401
  titlePaddingBottom: VF("vertical-title-paddingBottom", "4px"),
14278
- titleFontSize: VF("vertical-title-font-size", "11px"),
14279
- titleLineHeight: VF("vertical-title-line-height", "18px"),
14402
+ /** 구간 제목 타이포 — stepper.vertical.title.typography (= heading.xxs) */
14403
+ titleTypo: "typo-heading-xxs",
14280
14404
  accentStripeWidth: VF("vertical-item-accentStripe-width", "2px"),
14281
14405
  accentStripeColor: VF("vertical-item-accentStripe-color", "#64ABFF")
14282
14406
  };
@@ -14286,6 +14410,7 @@ var STEPPER_VERTICAL_COLORS = {
14286
14410
  hover: VF("vertical-item-bg-hover", "#F6F6F6"),
14287
14411
  selected: VF("vertical-item-bg-selected", "#EFF6FF")
14288
14412
  },
14413
+ titleBg: V2("vertical-title-bg"),
14289
14414
  titleText: VF("vertical-title-text", "#004290"),
14290
14415
  textDefault: STEPPER_COLORS.text.default,
14291
14416
  textCompleted: STEPPER_COLORS.text.completed,
@@ -14293,9 +14418,10 @@ var STEPPER_VERTICAL_COLORS = {
14293
14418
  sequenceBgActive: STEPPER_COLORS.sequenceBg.active,
14294
14419
  sequenceTextActive: STEPPER_COLORS.sequenceText.active,
14295
14420
  sequenceTextDefault: STEPPER_COLORS.sequenceText.default,
14296
- sequenceBorderCompleted: VF("vertical-sequence-border-completed", "#93C4FF"),
14297
- sequenceBgCompleted: VF("vertical-sequence-bg-completed", "#EFF6FF"),
14298
- sequenceIconCompleted: VF("vertical-sequence-icon-completed", "#0075FF"),
14421
+ // 세로형 전용 completed 토큰은 없다 — 가로형과 같은 sequence.*.completed 를 쓴다.
14422
+ sequenceBorderCompleted: STEPPER_COLORS.sequenceBorder.completed,
14423
+ sequenceBgCompleted: STEPPER_COLORS.sequenceBg.completed,
14424
+ sequenceIconCompleted: STEPPER_COLORS.sequenceText.completed,
14299
14425
  errorBadge: "#FB4444"
14300
14426
  };
14301
14427
  var ERROR_TOOLTIP_MESSAGE = "\uD655\uC778\uC774 \uD544\uC694\uD55C \uD56D\uBAA9\uC774 \uC788\uC2B5\uB2C8\uB2E4.";
@@ -14458,10 +14584,12 @@ var SStepper = /* @__PURE__ */ react.forwardRef(function SStepper2({
14458
14584
  if (isHorizontalCompleted) return STEPPER_HORIZONTAL_COMPLETED_COLORS.sequenceIcon;
14459
14585
  return STEPPER_COLORS.sequenceText[state2];
14460
14586
  })();
14587
+ const emphasized = state2 === "active" || isVertical && hovered;
14588
+ const itemTypo = emphasized ? config.typoActive : config.typoDefault;
14461
14589
  const itemStyle = {
14462
14590
  gap: STEPPER_LAYOUT.itemGap,
14463
14591
  color: itemColor,
14464
- fontWeight: state2 === "active" || isVertical && hovered ? config.fontWeightActive : config.fontWeightDefault
14592
+ fontWeight: itemTypo ? void 0 : config.fontWeightActive
14465
14593
  };
14466
14594
  const sequenceStyle = {
14467
14595
  width: config.sequenceSize,
@@ -14478,7 +14606,7 @@ var SStepper = /* @__PURE__ */ react.forwardRef(function SStepper2({
14478
14606
  {
14479
14607
  role: roleListItem ? "listitem" : void 0,
14480
14608
  "aria-current": roleListItem && state2 === "active" ? "step" : void 0,
14481
- className: "inline-flex items-center whitespace-nowrap",
14609
+ className: cn("inline-flex items-center whitespace-nowrap", itemTypo),
14482
14610
  style: itemStyle,
14483
14611
  children: [
14484
14612
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -14524,7 +14652,7 @@ var SStepper = /* @__PURE__ */ react.forwardRef(function SStepper2({
14524
14652
  className: cn("relative inline-flex flex-col items-start", className),
14525
14653
  style: {
14526
14654
  width: STEPPER_VERTICAL_LAYOUT.width,
14527
- // 폭은 토큰이 정하되 부모보다 넓어지지 않는다 — 부모가 세로 스크롤바만큼 좁아지면 따라 줄어
14655
+ // 폭은 디자인 값(전용 토큰 없음)이되 부모보다 넓어지지 않는다 — 부모가 세로 스크롤바만큼 좁아지면 따라 줄어
14528
14656
  // 가로 넘침(가로 스크롤바)이 생기지 않는다
14529
14657
  maxWidth: "100%",
14530
14658
  fontSize: config.fontSize,
@@ -14556,18 +14684,18 @@ var SStepper = /* @__PURE__ */ react.forwardRef(function SStepper2({
14556
14684
  group.group && /* @__PURE__ */ jsxRuntime.jsx(
14557
14685
  "div",
14558
14686
  {
14559
- className: "flex w-full items-center overflow-hidden",
14687
+ className: cn(
14688
+ "flex w-full items-center overflow-hidden",
14689
+ STEPPER_VERTICAL_LAYOUT.titleTypo
14690
+ ),
14560
14691
  style: {
14561
14692
  gap: STEPPER_VERTICAL_LAYOUT.itemGap,
14562
14693
  paddingLeft: STEPPER_VERTICAL_LAYOUT.itemPaddingX,
14563
14694
  paddingRight: STEPPER_VERTICAL_LAYOUT.itemPaddingX,
14564
14695
  paddingTop: STEPPER_VERTICAL_LAYOUT.titlePaddingTop,
14565
14696
  paddingBottom: STEPPER_VERTICAL_LAYOUT.titlePaddingBottom,
14566
- background: STEPPER_VERTICAL_COLORS.itemBg.default,
14567
- color: STEPPER_VERTICAL_COLORS.titleText,
14568
- fontSize: STEPPER_VERTICAL_LAYOUT.titleFontSize,
14569
- lineHeight: STEPPER_VERTICAL_LAYOUT.titleLineHeight,
14570
- fontWeight: 700
14697
+ background: STEPPER_VERTICAL_COLORS.titleBg,
14698
+ color: STEPPER_VERTICAL_COLORS.titleText
14571
14699
  },
14572
14700
  children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "whitespace-nowrap", children: group.group })
14573
14701
  }
@@ -15146,8 +15274,8 @@ var CalendarDayCard = /* @__PURE__ */ react.forwardRef(function CalendarDayCard2
15146
15274
  {
15147
15275
  className: cn(
15148
15276
  "inline-flex size-(--cmp-calendarBoard-daySequence-size) items-center justify-center rounded-(--cmp-calendarBoard-daySequence-radius)",
15149
- isToday ? "typo-body-md-bold bg-(--cmp-calendarBoard-daySequence-bg-today) text-(--cmp-calendarBoard-daySequence-text-today)" : cn(
15150
- "typo-body-md-medium",
15277
+ isToday ? "typo-item-md-selected bg-(--cmp-calendarBoard-daySequence-bg-today) text-(--cmp-calendarBoard-daySequence-text-today)" : cn(
15278
+ "typo-item-md-default",
15151
15279
  inCurrentMonth ? "text-(--cmp-calendarBoard-daySequence-text-default)" : "text-(--cmp-calendarBoard-daySequence-text-otherMonth)"
15152
15280
  ),
15153
15281
  // 오늘이 아니면서 선택된 날은 테두리 원으로 표시한다 (오늘은 이미 채운 원이라 겹치지 않는다).
@@ -15705,14 +15833,12 @@ function clampToAvailableHeight(value, availableHeight) {
15705
15833
  }
15706
15834
  var FONT = {
15707
15835
  sm: {
15708
- fontSize: 12,
15709
- lineHeight: 20,
15836
+ typo: "typo-field-sm-default",
15710
15837
  paddingX: "var(--cmp-textinput-sm-paddingX)",
15711
15838
  gap: "var(--cmp-textinput-sm-gap)"
15712
15839
  },
15713
15840
  md: {
15714
- fontSize: 14,
15715
- lineHeight: 24,
15841
+ typo: "typo-field-md-default",
15716
15842
  paddingX: "var(--cmp-textinput-md-paddingX)",
15717
15843
  gap: "var(--cmp-textinput-md-gap)"
15718
15844
  }
@@ -15751,12 +15877,10 @@ var SSearchInput = /* @__PURE__ */ react.forwardRef(function SSearchInput2({
15751
15877
  children: /* @__PURE__ */ jsxRuntime.jsxs(
15752
15878
  "div",
15753
15879
  {
15754
- className: "flex h-full w-full items-center",
15880
+ className: cn("flex h-full w-full items-center", f.typo),
15755
15881
  style: {
15756
15882
  gap: f.gap,
15757
- padding: `0 ${f.paddingX}`,
15758
- fontSize: f.fontSize,
15759
- lineHeight: `${f.lineHeight}px`
15883
+ padding: `0 ${f.paddingX}`
15760
15884
  },
15761
15885
  children: [
15762
15886
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -15817,6 +15941,18 @@ var SSearchInput = /* @__PURE__ */ react.forwardRef(function SSearchInput2({
15817
15941
  );
15818
15942
  });
15819
15943
 
15944
+ // src/lib/list-box-item.ts
15945
+ var LIST_BOX_ITEM_PADDING_LEFT = {
15946
+ 1: "var(--cmp-listBoxItem-paddingLeft-depth1)",
15947
+ 2: "var(--cmp-listBoxItem-paddingLeft-depth2)",
15948
+ 3: "var(--cmp-listBoxItem-paddingLeft-depth3)"
15949
+ };
15950
+ var LIST_BOX_ITEM_PADDING_Y_RIGHT = {
15951
+ paddingTop: "var(--cmp-listBoxItem-paddingY)",
15952
+ paddingBottom: "var(--cmp-listBoxItem-paddingY)",
15953
+ paddingRight: "var(--cmp-listBoxItem-paddingRight)"
15954
+ };
15955
+
15820
15956
  // src/components/SSelect/select.config.ts
15821
15957
  function flattenOptions(options, depth = 1, inheritDisabled = true) {
15822
15958
  const out = [];
@@ -16090,6 +16226,14 @@ var SSelectImpl = /* @__PURE__ */ react.forwardRef(function SSelect({
16090
16226
  }, [insideModal, pendingOpen, portalContainer]);
16091
16227
  const requestOpenRef = react.useRef(requestOpen);
16092
16228
  requestOpenRef.current = requestOpen;
16229
+ react.useEffect(() => {
16230
+ if (!label || effectiveDisabled) return;
16231
+ const labelEl = document.getElementById(fieldLabelId(triggerId));
16232
+ if (!labelEl) return;
16233
+ const toggle = () => requestOpenRef.current(!open);
16234
+ labelEl.addEventListener("click", toggle);
16235
+ return () => labelEl.removeEventListener("click", toggle);
16236
+ }, [label, effectiveDisabled, triggerId, open]);
16093
16237
  react.useImperativeHandle(
16094
16238
  ref,
16095
16239
  () => ({
@@ -16371,6 +16515,7 @@ var SSelectImpl = /* @__PURE__ */ react.forwardRef(function SSelect({
16371
16515
  const handleClear = () => {
16372
16516
  emit3([]);
16373
16517
  if (rules && rules.length > 0) setRuleError(runRules(multi ? [] : "", rules));
16518
+ triggerRef.current?.focus();
16374
16519
  };
16375
16520
  const handleRemoveChip = (targets) => {
16376
16521
  const remove = new Set(targets);
@@ -16566,6 +16711,15 @@ var SSelectImpl = /* @__PURE__ */ react.forwardRef(function SSelect({
16566
16711
  commitOpen(false);
16567
16712
  }
16568
16713
  };
16714
+ const handleTriggerKeyDown = (event) => {
16715
+ if (event.target !== event.currentTarget || effectiveDisabled) return;
16716
+ if (event.key === " " || !open && event.key === "Enter") {
16717
+ event.preventDefault();
16718
+ requestOpen(!open);
16719
+ return;
16720
+ }
16721
+ handleKeyDown(event);
16722
+ };
16569
16723
  return /* @__PURE__ */ jsxRuntime.jsxs(
16570
16724
  SField,
16571
16725
  {
@@ -16593,23 +16747,28 @@ var SSelectImpl = /* @__PURE__ */ react.forwardRef(function SSelect({
16593
16747
  children: [
16594
16748
  name && /* @__PURE__ */ jsxRuntime.jsx("input", { type: "hidden", name, value: selected.join(",") }),
16595
16749
  /* @__PURE__ */ jsxRuntime.jsxs(
16596
- "button",
16750
+ "div",
16597
16751
  {
16598
16752
  ref: triggerRef,
16599
16753
  id: triggerId,
16600
- type: "button",
16601
- disabled: effectiveDisabled,
16602
- "aria-labelledby": label ? `${fieldLabelId(triggerId)} ${triggerId}` : void 0,
16754
+ role: "combobox",
16755
+ tabIndex: effectiveDisabled ? -1 : 0,
16756
+ "aria-disabled": effectiveDisabled || void 0,
16757
+ "aria-labelledby": label ? `${fieldLabelId(triggerId)} ${triggerId}` : triggerId,
16603
16758
  "aria-haspopup": isTree ? "tree" : "listbox",
16604
16759
  "aria-expanded": open,
16605
16760
  "aria-controls": open ? listboxId : void 0,
16606
16761
  "aria-activedescendant": open && focusedIndex >= 0 ? activeOptionId : void 0,
16607
16762
  "aria-busy": showTriggerSpinner || void 0,
16608
- onClick: () => requestOpen(!open),
16609
- onKeyDown: handleKeyDown,
16763
+ onClick: () => {
16764
+ if (effectiveDisabled) return;
16765
+ requestOpen(!open);
16766
+ },
16767
+ onKeyDown: handleTriggerKeyDown,
16610
16768
  className: cn(
16611
- "flex h-full w-full cursor-pointer items-center justify-between bg-transparent text-left outline-none disabled:cursor-not-allowed",
16612
- 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)"
16769
+ "flex h-full w-full items-center justify-between bg-transparent text-left outline-none",
16770
+ effectiveDisabled ? "cursor-not-allowed" : "cursor-pointer",
16771
+ 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)"
16613
16772
  ),
16614
16773
  style: {
16615
16774
  // 칩 한 줄이 기본 높이 안에서 세로 가운데에 오는 여백. 줄이 늘면 같은 여백을 유지한 채 트리거가 커진다.
@@ -16731,7 +16890,7 @@ var SSelectImpl = /* @__PURE__ */ react.forwardRef(function SSelect({
16731
16890
  "div",
16732
16891
  {
16733
16892
  ref: searchBarRef,
16734
- className: "sticky top-0 z-[1] bg-[var(--cmp-listBox-bg)] px-(--cmp-listBoxItem-search-paddingX) py-(--cmp-listBoxItem-search-paddingY)",
16893
+ 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)",
16735
16894
  children: /* @__PURE__ */ jsxRuntime.jsx(
16736
16895
  SSearchInput,
16737
16896
  {
@@ -16766,7 +16925,6 @@ var SSelectImpl = /* @__PURE__ */ react.forwardRef(function SSelect({
16766
16925
  groupLeafValues,
16767
16926
  focusedValue: navigableItems[focusedIndex]?.key,
16768
16927
  showSelectAll: selectAllVisible,
16769
- searchVisible,
16770
16928
  selectAllLabel: allSelectedLabel,
16771
16929
  selectAllSelected: allSelected,
16772
16930
  onSelectAll: handleSelectAll,
@@ -16823,7 +16981,6 @@ function ItemList({
16823
16981
  groupLeafValues,
16824
16982
  focusedValue,
16825
16983
  showSelectAll,
16826
- searchVisible,
16827
16984
  selectAllLabel,
16828
16985
  selectAllSelected,
16829
16986
  onSelectAll,
@@ -16834,7 +16991,7 @@ function ItemList({
16834
16991
  const selectedSet = react.useMemo(() => new Set(selected), [selected]);
16835
16992
  const checkboxShiftRef = react.useRef(false);
16836
16993
  const itemBase = cn(
16837
- "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",
16994
+ "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",
16838
16995
  "text-[color:var(--cmp-listBoxItem-content-default)]",
16839
16996
  "disabled:cursor-not-allowed disabled:text-[color:var(--cmp-listBoxItem-content-disabled)]"
16840
16997
  );
@@ -16871,7 +17028,7 @@ function ItemList({
16871
17028
  itemBase,
16872
17029
  focusedValue === "__select_all__" && "bg-[var(--cmp-listBoxItem-bg-hover)] text-[color:var(--cmp-listBoxItem-content-hover)]"
16873
17030
  ),
16874
- style: { paddingTop: 4, paddingBottom: 4, paddingRight: 12, paddingLeft: 12 },
17031
+ style: { ...LIST_BOX_ITEM_PADDING_Y_RIGHT, paddingLeft: LIST_BOX_ITEM_PADDING_LEFT[1] },
16875
17032
  onMouseEnter: () => onHoverValue("__select_all__"),
16876
17033
  onMouseLeave: () => onHoverValue(null),
16877
17034
  onClick: onSelectAll,
@@ -16884,7 +17041,7 @@ function ItemList({
16884
17041
  topSpacer > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { "aria-hidden": true, style: { height: topSpacer } }),
16885
17042
  items.map((o, windowIndex) => {
16886
17043
  const idx = windowIndex + indexOffset;
16887
- const padLeft = o.depth === 1 ? 12 : o.depth === 2 ? 20 : 28;
17044
+ const padLeft = LIST_BOX_ITEM_PADDING_LEFT[o.depth === 1 ? 1 : o.depth === 2 ? 2 : 3];
16888
17045
  const rowKey = `${o.value}-${idx}`;
16889
17046
  if (tree) {
16890
17047
  const togglesLeaves = multi && o.isGroup;
@@ -16926,15 +17083,20 @@ function ItemList({
16926
17083
  TREE_LABEL_TYPOGRAPHY.sm.rowHeight,
16927
17084
  TREE_ROW_BORDER_CLASS,
16928
17085
  "select-none",
16929
- rowDisabled ? "cursor-not-allowed" : "cursor-pointer",
17086
+ o.isGroup && "cursor-pointer",
16930
17087
  focused && TREE_ROW_ACTIVE_CLASS
16931
17088
  ),
16932
17089
  onMouseEnter: () => onHoverValue(focusKey),
16933
17090
  onMouseLeave: () => onHoverValue(null),
16934
17091
  onClick: (event) => {
16935
- if (isRowControlClick(event) || rowDisabled) return;
16936
- if (togglesLeaves) onToggleGroup(leafValues);
16937
- else onSelect(o.value, idx, event.shiftKey);
17092
+ if (isRowControlClick(event)) return;
17093
+ if (isRowSelectClick(event)) {
17094
+ if (rowDisabled) return;
17095
+ if (togglesLeaves) onToggleGroup(leafValues);
17096
+ else onSelect(o.value, idx, event.shiftKey);
17097
+ return;
17098
+ }
17099
+ if (o.isGroup) onToggleExpand(o.value);
16938
17100
  },
16939
17101
  children: [
16940
17102
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -16953,27 +17115,41 @@ function ItemList({
16953
17115
  // 비활성 그룹도 접고 편다 — 그룹이 비활성이어도 아래에 고를 수 있는 자식이 있을 수 있다.
16954
17116
  /* @__PURE__ */ jsxRuntime.jsx(TreeCaret, { expanded, onToggle: () => onToggleExpand(o.value) })
16955
17117
  ) : /* @__PURE__ */ jsxRuntime.jsx(TreeCaretSpacer, {}),
16956
- multi && /* @__PURE__ */ jsxRuntime.jsx(
16957
- "span",
16958
- {
16959
- "data-tree-control": true,
16960
- className: "flex shrink-0",
16961
- onPointerDownCapture: (event) => {
16962
- checkboxShiftRef.current = event.shiftKey;
16963
- },
16964
- children: /* @__PURE__ */ jsxRuntime.jsx(SCheckbox, { value: checkState, disabled: rowDisabled, onValueChange: toggle })
16965
- }
16966
- ),
16967
17118
  /* @__PURE__ */ jsxRuntime.jsx(
16968
- OptionLabel,
17119
+ TreeSelectZone,
16969
17120
  {
16970
- label: o.label,
16971
- className: treeLabelClass("sm", {
16972
- // 고른 줄은 굵게 — multi_tree 는 일부만 고른 그룹도 굵다 (STree 와 같다)
16973
- emphasized: checkState !== false,
16974
- disabled: rowDisabled,
16975
- selectable: true
16976
- })
17121
+ selectable: true,
17122
+ disabled: rowDisabled,
17123
+ control: multi && /* @__PURE__ */ jsxRuntime.jsx(
17124
+ "span",
17125
+ {
17126
+ "data-tree-control": true,
17127
+ className: "flex shrink-0",
17128
+ onPointerDownCapture: (event) => {
17129
+ checkboxShiftRef.current = event.shiftKey;
17130
+ },
17131
+ children: /* @__PURE__ */ jsxRuntime.jsx(
17132
+ SCheckbox,
17133
+ {
17134
+ value: checkState,
17135
+ disabled: rowDisabled,
17136
+ onValueChange: toggle
17137
+ }
17138
+ )
17139
+ }
17140
+ ),
17141
+ children: /* @__PURE__ */ jsxRuntime.jsx(
17142
+ OptionLabel,
17143
+ {
17144
+ label: o.label,
17145
+ className: treeLabelClass("sm", {
17146
+ // 고른 줄은 굵게 — multi_tree 는 일부만 고른 그룹도 굵다 (STree 와 같다)
17147
+ emphasized: checkState !== false,
17148
+ disabled: rowDisabled,
17149
+ selectable: true
17150
+ })
17151
+ }
17152
+ )
16977
17153
  }
16978
17154
  )
16979
17155
  ] })
@@ -16985,7 +17161,7 @@ function ItemList({
16985
17161
  }
16986
17162
  if (o.isGroup) {
16987
17163
  const isDepth1 = o.depth === 1;
16988
- const isFirstRow = idx === 0 && !showSelectAll && !searchVisible;
17164
+ const isFirstRow = idx === 0 && !showSelectAll;
16989
17165
  const groupTone = cn(
16990
17166
  isDepth1 ? "bg-[var(--cmp-listBoxItem-depth1-bg-default)] font-bold" : "bg-[var(--cmp-listBoxItem-depth2-middle-bg)] font-medium",
16991
17167
  isDepth1 && !isFirstRow && "border-t border-solid border-[color:var(--cmp-listBoxItem-depth1-border-color)]"
@@ -17010,7 +17186,7 @@ function ItemList({
17010
17186
  "data-select-focused": groupFocused ? "true" : void 0,
17011
17187
  "data-select-active": groupFocused ? "true" : void 0,
17012
17188
  className: cn(
17013
- "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)]",
17189
+ "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)]",
17014
17190
  groupTone,
17015
17191
  groupDisabled ? "cursor-not-allowed text-[color:var(--cmp-listBoxItem-content-disabled)]" : "cursor-pointer",
17016
17192
  groupDisabled && isDepth1 && "bg-[var(--cmp-listBoxItem-depth1-bg-disabled)]",
@@ -17051,7 +17227,7 @@ function ItemList({
17051
17227
  "data-select-row": true,
17052
17228
  "data-index": idx,
17053
17229
  className: cn(
17054
- "select-none py-[4px] pr-[12px] text-[12px] leading-[20px] text-[color:var(--cmp-listBoxItem-content-default)]",
17230
+ "select-none py-(--cmp-listBoxItem-paddingY) pr-(--cmp-listBoxItem-paddingRight) typo-field-sm-default text-[color:var(--cmp-listBoxItem-content-default)]",
17055
17231
  groupTone,
17056
17232
  // 하위가 전부 비활성이면(select.config 에서 bubble-up) 어미 그룹도 비활성 처리:
17057
17233
  // 텍스트는 회색(#888), depth1 그룹은 파란 배경 대신 회색(#EEE)으로 (depth2 는 #F6F6F6 유지)
@@ -17087,7 +17263,7 @@ function ItemList({
17087
17263
  // (:hover 는 disabled 버튼에도 매칭되므로 클래스 자체를 붙이지 않아야 한다)
17088
17264
  !o.disabled && activeClass
17089
17265
  ),
17090
- style: { paddingTop: 4, paddingBottom: 4, paddingRight: 12, paddingLeft: padLeft },
17266
+ style: { ...LIST_BOX_ITEM_PADDING_Y_RIGHT, paddingLeft: padLeft },
17091
17267
  onMouseEnter: () => onHoverValue(o.value),
17092
17268
  onMouseLeave: () => onHoverValue(null),
17093
17269
  onClick: (event) => onSelect(o.value, idx, event.shiftKey),
@@ -17116,40 +17292,17 @@ function TriggerLabel({ label }) {
17116
17292
  return /* @__PURE__ */ jsxRuntime.jsx(OptionLabel, { label, className: "truncate" });
17117
17293
  }
17118
17294
  function TriggerRemoveButton({ ariaLabel, onRemove }) {
17119
- return /* @__PURE__ */ jsxRuntime.jsxs(
17120
- "span",
17295
+ return /* @__PURE__ */ jsxRuntime.jsx(
17296
+ SGhostButton,
17121
17297
  {
17122
- role: "button",
17123
- tabIndex: 0,
17124
- "aria-label": ariaLabel,
17125
- className: "group/select-remove relative inline-flex shrink-0 cursor-pointer items-center justify-center",
17126
- style: {
17127
- width: "var(--cmp-ghostButton-xxs-size)",
17128
- height: "var(--cmp-ghostButton-xxs-size)",
17129
- borderRadius: "var(--cmp-ghostButton-radius-sm)"
17130
- },
17298
+ icon: "close",
17299
+ size: "xxs",
17300
+ ariaLabel,
17301
+ className: "shrink-0",
17131
17302
  onClick: (event) => {
17132
- event.preventDefault();
17133
- event.stopPropagation();
17134
- onRemove();
17135
- },
17136
- onKeyDown: (event) => {
17137
- if (event.key !== "Enter" && event.key !== " ") return;
17138
- event.preventDefault();
17139
17303
  event.stopPropagation();
17140
17304
  onRemove();
17141
- },
17142
- children: [
17143
- /* @__PURE__ */ jsxRuntime.jsx(
17144
- "span",
17145
- {
17146
- "aria-hidden": true,
17147
- className: "pointer-events-none absolute inset-0 rounded-[inherit] opacity-0 transition-opacity duration-200 group-hover/select-remove:opacity-5",
17148
- style: { background: "var(--cmp-ghostButton-default-hover-bg)" }
17149
- }
17150
- ),
17151
- /* @__PURE__ */ jsxRuntime.jsx(SIcon, { name: "close", size: 12, color: "var(--cmp-ghostButton-default-content)" })
17152
- ]
17305
+ }
17153
17306
  }
17154
17307
  );
17155
17308
  }
@@ -17163,7 +17316,7 @@ function CheckboxBox({
17163
17316
  "span",
17164
17317
  {
17165
17318
  className: cn(
17166
- "flex h-[16px] w-[16px] flex-shrink-0 items-center justify-center rounded-[2px] border border-solid",
17319
+ "flex size-(--cmp-checkbox-size) flex-shrink-0 items-center justify-center rounded-(--cmp-checkbox-radius) border-(length:--cmp-checkbox-borderWidth) border-solid",
17167
17320
  disabled ? (
17168
17321
  // 비활성: 회색 채움(#E1E1E1) + 회색 테두리(#CCCCCC)
17169
17322
  "cursor-not-allowed border-[color:var(--cmp-checkbox-border-disabled)] bg-[var(--cmp-checkbox-bg-disabled)]"
@@ -17173,7 +17326,7 @@ function CheckboxBox({
17173
17326
  SIcon,
17174
17327
  {
17175
17328
  name: state2 === null ? "checkboxIndeterminate" : "checkboxCheck",
17176
- size: 12,
17329
+ size: "var(--cmp-checkbox-icon)",
17177
17330
  color: disabled ? "var(--cmp-checkbox-checked-icon-disabled)" : "var(--cmp-checkbox-checked-icon-default)"
17178
17331
  }
17179
17332
  )
@@ -17806,7 +17959,7 @@ var STableImpl = /* @__PURE__ */ react.forwardRef(function STable({
17806
17959
  "span",
17807
17960
  {
17808
17961
  onMouseDown: (e) => startResize(i, e),
17809
- 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",
17962
+ 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",
17810
17963
  "aria-hidden": true,
17811
17964
  children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "h-full w-[4px] border-x border-solid border-[color:var(--cmp-table-header-resizingBar-color)]" })
17812
17965
  },
@@ -17869,7 +18022,7 @@ var STableImpl = /* @__PURE__ */ react.forwardRef(function STable({
17869
18022
  colSpan: group.colSpan,
17870
18023
  rowSpan: group.rowSpan,
17871
18024
  className: cn(
17872
- "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)]",
18025
+ "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)]",
17873
18026
  group.firstIndex + group.colSpan === visibleCols.length && "border-r-0",
17874
18027
  group.rowSpan === 2 && "border-b-0",
17875
18028
  group.className
@@ -17911,7 +18064,7 @@ var STableImpl = /* @__PURE__ */ react.forwardRef(function STable({
17911
18064
  "span",
17912
18065
  {
17913
18066
  "aria-hidden": true,
17914
- 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)]"
18067
+ 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)]"
17915
18068
  }
17916
18069
  )
17917
18070
  ]
@@ -17932,7 +18085,7 @@ var STableImpl = /* @__PURE__ */ react.forwardRef(function STable({
17932
18085
  // 세로 가운데도 어긋난다. 글자 줄높이는 아래 th__content 가 다시 준다.
17933
18086
  headerGroupInfo && "border-r border-solid border-[color:var(--cmp-table-border-color)]",
17934
18087
  headerGroupInfo && i === visibleCols.length - 1 && "border-r-0",
17935
- "relative bg-[var(--cmp-table-header-bg)] px-[16px] text-[12px] font-medium leading-[0] text-[color:var(--sys-color-fg-primary)]",
18088
+ "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)]",
17936
18089
  stickyInfo(i).isSticky && "z-[6]",
17937
18090
  col.thClass
17938
18091
  ),
@@ -17951,7 +18104,7 @@ var STableImpl = /* @__PURE__ */ react.forwardRef(function STable({
17951
18104
  // 원본 th__content: align에 따라 justify-content 적용 (th도 정렬 반영)
17952
18105
  // th 가 leading-[0] 이므로 글자 줄높이는 여기서 준다 (truncate 가
17953
18106
  // overflow-hidden 이라 줄높이가 0이면 라벨이 잘려 사라진다).
17954
- "inline-flex w-full min-w-0 items-center gap-[4px] leading-[20px]",
18107
+ "inline-flex w-full min-w-0 items-center gap-[var(--cmp-table-header-gap)] leading-[20px]",
17955
18108
  col.align === "center" && "justify-center",
17956
18109
  col.align === "right" && "justify-end"
17957
18110
  ),
@@ -18849,8 +19002,8 @@ function useTruncatedValueTooltip({
18849
19002
  };
18850
19003
  }
18851
19004
  var FONT2 = {
18852
- sm: { fontSize: 12, lineHeight: 20, paddingX: "var(--cmp-textinput-sm-paddingX)" },
18853
- md: { fontSize: 14, lineHeight: 24, paddingX: "var(--cmp-textinput-md-paddingX)" }
19005
+ sm: { typo: "typo-field-sm-default", paddingX: "var(--cmp-textinput-sm-paddingX)" },
19006
+ md: { typo: "typo-field-md-default", paddingX: "var(--cmp-textinput-md-paddingX)" }
18854
19007
  };
18855
19008
  var SInput = /* @__PURE__ */ react.forwardRef(function SInput2({
18856
19009
  value,
@@ -18943,12 +19096,11 @@ var SInput = /* @__PURE__ */ react.forwardRef(function SInput2({
18943
19096
  {
18944
19097
  className: cn(
18945
19098
  "flex h-full w-full items-center",
19099
+ f.typo,
18946
19100
  size === "md" ? "gap-[var(--cmp-textinput-md-gap)]" : "gap-[var(--cmp-textinput-sm-gap)]"
18947
19101
  ),
18948
19102
  style: {
18949
- padding: `0 ${f.paddingX}`,
18950
- fontSize: f.fontSize,
18951
- lineHeight: `${f.lineHeight}px`
19103
+ padding: `0 ${f.paddingX}`
18952
19104
  },
18953
19105
  children: [
18954
19106
  prefix != null && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "flex flex-shrink-0 items-center", children: prefix }),
@@ -19022,8 +19174,8 @@ var SInput = /* @__PURE__ */ react.forwardRef(function SInput2({
19022
19174
  );
19023
19175
  });
19024
19176
  var PAD2 = {
19025
- sm: { fontSize: 12, lineHeight: 20, stepper: 20, icon: 12 },
19026
- md: { fontSize: 14, lineHeight: 24, stepper: 24, icon: 14 }
19177
+ sm: { typo: "typo-field-sm-default", icon: 12 },
19178
+ md: { typo: "typo-field-md-default", icon: 14 }
19027
19179
  };
19028
19180
  var toNumber = (val) => {
19029
19181
  if (val === null || val === void 0 || val === "") return null;
@@ -19258,7 +19410,7 @@ var SNumberInput = /* @__PURE__ */ react.forwardRef(function SNumberInput2({
19258
19410
  onClick: dir === "inc" ? increment : decrement,
19259
19411
  className: cn(
19260
19412
  "flex flex-shrink-0 items-center justify-center border border-solid border-transparent transition-colors",
19261
- off ? "cursor-not-allowed" : "cursor-pointer hover:border-[var(--color-border-accentLight)]"
19413
+ off ? "cursor-not-allowed" : "cursor-pointer hover:border-[var(--cmp-numberInput-stepper-border-default)]"
19262
19414
  ),
19263
19415
  style: {
19264
19416
  width: `var(--cmp-numberInput-stepper-${size}-size)`,
@@ -19307,13 +19459,11 @@ var SNumberInput = /* @__PURE__ */ react.forwardRef(function SNumberInput2({
19307
19459
  children: /* @__PURE__ */ jsxRuntime.jsxs(
19308
19460
  "div",
19309
19461
  {
19310
- className: "flex h-full w-full items-center",
19462
+ className: cn("flex h-full w-full items-center", p.typo),
19311
19463
  style: {
19312
19464
  // 원본 sd-number-input: content gap = padding-x 토큰 (gap 토큰 아님)
19313
19465
  gap: `var(--cmp-numberInput-${size}-paddingX)`,
19314
- padding: `0 ${showButton ? padX : `calc(${padX} * 2)`}`,
19315
- fontSize: p.fontSize,
19316
- lineHeight: `${p.lineHeight}px`
19466
+ padding: `0 ${showButton ? padX : `calc(${padX} * 2)`}`
19317
19467
  },
19318
19468
  children: [
19319
19469
  showButton && stepper("dec"),
@@ -19599,7 +19749,7 @@ function SCalendar({
19599
19749
  onClick: () => view(y - 1, m)
19600
19750
  }
19601
19751
  ),
19602
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "inline-flex min-w-[40px] items-center justify-center text-center text-[14px] font-medium leading-[24px]", children: y }),
19752
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "inline-flex min-w-[40px] items-center justify-center text-center typo-field-md-medium", children: y }),
19603
19753
  /* @__PURE__ */ jsxRuntime.jsx(
19604
19754
  SGhostButton,
19605
19755
  {
@@ -19624,7 +19774,7 @@ function SCalendar({
19624
19774
  }
19625
19775
  }
19626
19776
  ),
19627
- /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "inline-flex w-full min-w-[40px] items-center justify-center text-center text-[14px] font-medium leading-[24px]", children: [
19777
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "inline-flex w-full min-w-[40px] items-center justify-center text-center typo-field-md-medium", children: [
19628
19778
  m,
19629
19779
  "\uC6D4"
19630
19780
  ] }),
@@ -19701,7 +19851,7 @@ function SCalendar({
19701
19851
  }) }),
19702
19852
  legend.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
19703
19853
  /* @__PURE__ */ jsxRuntime.jsx(SDivider, {}),
19704
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-wrap items-center justify-center gap-x-[var(--cmp-datepicker-calendar-legend-group-gap)] gap-y-[4px] text-[11px] leading-[18px]", children: legend.map((item4) => /* @__PURE__ */ jsxRuntime.jsxs(
19854
+ /* @__PURE__ */ jsxRuntime.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__ */ jsxRuntime.jsxs(
19705
19855
  "span",
19706
19856
  {
19707
19857
  className: "inline-flex items-center gap-[var(--cmp-datepicker-calendar-legend-gap)]",
@@ -19729,10 +19879,10 @@ function SCalendar({
19729
19879
  var MODE_LIST_HEIGHT = 240;
19730
19880
  var MODE_ITEM_HEIGHT = 28;
19731
19881
  var modeListItemClass = (selected, disabled) => cn(
19732
- "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]",
19733
- disabled && "cursor-not-allowed bg-[var(--cmp-datepicker-mode-item-bg-default)] font-medium text-[color:var(--cmp-datepicker-mode-item-content-disabled)]",
19734
- !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)]",
19735
- !disabled && selected && "cursor-pointer bg-[var(--cmp-datepicker-mode-item-bg-default)] font-bold text-[color:var(--cmp-datepicker-mode-item-content-selected)]"
19882
+ "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",
19883
+ 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)]",
19884
+ !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)]",
19885
+ !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)]"
19736
19886
  );
19737
19887
  var MODE_NOUN = {
19738
19888
  date: "\uB0A0\uC9DC",
@@ -20042,9 +20192,9 @@ function SDatePicker({
20042
20192
  const resolvedError = error || ruleError !== "";
20043
20193
  const resolvedStatus = status ?? (rules && rules.length > 0 ? ruleError !== "" ? "error" : void 0 : void 0);
20044
20194
  const baseDims = size === "md" ? {
20045
- padX: 16,
20046
- gap: 12,
20047
- icon: 20,
20195
+ padX: "var(--cmp-datepicker-md-paddingX)",
20196
+ gap: "var(--cmp-datepicker-md-gap)",
20197
+ icon: "var(--cmp-datepicker-md-icon)",
20048
20198
  minW: 104,
20049
20199
  fieldMinW: 168,
20050
20200
  // 값 길이가 YYYY-MM-DD 로 정해져 있어, width="100%" 를 받아도 행 전체로
@@ -20052,19 +20202,20 @@ function SDatePicker({
20052
20202
  // px 가 아니라 등급이라 --cmp-field-width-* 가 바뀌면 함께 따라간다.
20053
20203
  // 이 기본 상한이 걸리적거리는 자리(폭이 이미 좁게 정해진 팝오버 등)는 maxWidth prop 으로 덮는다
20054
20204
  fieldMaxW: "lg",
20205
+ // 요일 폭 계산에 숫자가 필요해 남긴다. 렌더 타이포는 typo 가 맡는다
20055
20206
  fontSize: 14,
20056
- lineHeight: 24,
20057
- radius: 6
20207
+ typo: "typo-field-md-default",
20208
+ radius: "var(--cmp-datepicker-md-radius)"
20058
20209
  } : {
20059
- padX: 12,
20060
- gap: 8,
20061
- icon: 16,
20210
+ padX: "var(--cmp-datepicker-sm-paddingX)",
20211
+ gap: "var(--cmp-datepicker-sm-gap)",
20212
+ icon: "var(--cmp-datepicker-sm-icon)",
20062
20213
  minW: 80,
20063
20214
  fieldMinW: 128,
20064
20215
  fieldMaxW: "md",
20065
20216
  fontSize: 12,
20066
- lineHeight: 20,
20067
- radius: 4
20217
+ typo: "typo-field-sm-default",
20218
+ radius: "var(--cmp-datepicker-sm-radius)"
20068
20219
  };
20069
20220
  const weekdayW = weekday ? weekdaySuffixWidth(baseDims.fontSize) : 0;
20070
20221
  const dims = {
@@ -20135,7 +20286,7 @@ function SDatePicker({
20135
20286
  "flex h-full w-full items-center overflow-hidden bg-transparent outline-none",
20136
20287
  disabled ? "cursor-not-allowed" : "cursor-pointer"
20137
20288
  ),
20138
- style: { padding: `0 ${dims.padX}px`, gap: dims.gap, borderRadius: dims.radius },
20289
+ style: { padding: `0 ${dims.padX}`, gap: dims.gap, borderRadius: dims.radius },
20139
20290
  children: [
20140
20291
  /* @__PURE__ */ jsxRuntime.jsx(
20141
20292
  SIcon,
@@ -20150,11 +20301,9 @@ function SDatePicker({
20150
20301
  "span",
20151
20302
  {
20152
20303
  id: triggerTextId,
20153
- className: "flex-1 truncate text-center",
20304
+ className: cn("flex-1 truncate text-center", dims.typo),
20154
20305
  style: {
20155
20306
  minWidth: dims.minW,
20156
- fontSize: dims.fontSize,
20157
- lineHeight: `${dims.lineHeight}px`,
20158
20307
  color: disabled ? "var(--cmp-datepicker-text-disabled)" : hasValue ? "var(--cmp-datepicker-text-default)" : "var(--cmp-field-hint-color)"
20159
20308
  },
20160
20309
  children: hasValue ? weekday ? withWeekday(value) : value : resolvedPlaceholder
@@ -20365,7 +20514,7 @@ function RangeCalendar({
20365
20514
  className: cn(!isLeft && "invisible pointer-events-none")
20366
20515
  }
20367
20516
  ),
20368
- /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "inline-flex min-w-[40px] flex-1 items-center justify-center text-center text-[14px] font-medium leading-[24px]", children: [
20517
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "inline-flex min-w-[40px] flex-1 items-center justify-center text-center typo-field-md-medium", children: [
20369
20518
  gy,
20370
20519
  ".",
20371
20520
  String(gm).padStart(2, "0")
@@ -20433,14 +20582,14 @@ function RangeCalendar({
20433
20582
  const hour = which === "start" ? sH : eH;
20434
20583
  const minute = which === "start" ? sM : eM;
20435
20584
  const num = (n, strip) => active && n !== "" ? strip ? String(Number(n)) : n : "-";
20436
- 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";
20585
+ 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";
20437
20586
  const LABEL = "text-[color:var(--cmp-datepicker-calendar-time-date-label)]";
20438
20587
  const UNIT = "text-[color:var(--cmp-datepicker-calendar-time-date-unit)]";
20439
20588
  return /* @__PURE__ */ jsxRuntime.jsxs(
20440
20589
  "div",
20441
20590
  {
20442
20591
  className: cn(
20443
- "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]",
20592
+ "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",
20444
20593
  active ? "bg-[var(--cmp-datepicker-calendar-time-bg-selected)]" : "bg-[var(--cmp-datepicker-calendar-time-bg-default)]"
20445
20594
  ),
20446
20595
  children: [
@@ -20502,7 +20651,7 @@ function RangeCalendar({
20502
20651
  ),
20503
20652
  children: [
20504
20653
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative flex items-center justify-center", children: [
20505
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-center gap-[var(--cmp-datepicker-calendar-gap)] text-[14px] font-medium leading-[24px]", children: [
20654
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-center gap-[var(--cmp-datepicker-calendar-gap)] typo-field-md-medium", children: [
20506
20655
  /* @__PURE__ */ jsxRuntime.jsx(SGhostButton, { icon: "chevronLeft", size: "xxs", ariaLabel: "prevYear", onClick: goPrevYear }),
20507
20656
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "inline-flex min-w-[40px] items-center justify-center text-center", children: y }),
20508
20657
  /* @__PURE__ */ jsxRuntime.jsx(SGhostButton, { icon: "chevronRight", size: "xxs", ariaLabel: "nextYear", onClick: goNextYear })
@@ -20599,28 +20748,29 @@ function SDateRangePicker({
20599
20748
  const resolvedError = error || ruleError !== "";
20600
20749
  const resolvedStatus = status ?? (rules && rules.length > 0 ? ruleError !== "" ? "error" : void 0 : void 0);
20601
20750
  const baseDims = size === "md" ? {
20602
- padX: 16,
20603
- gap: 12,
20604
- icon: 20,
20751
+ padX: "var(--cmp-datepicker-md-paddingX)",
20752
+ gap: "var(--cmp-datepicker-md-gap)",
20753
+ icon: "var(--cmp-datepicker-md-icon)",
20605
20754
  minW: 104,
20606
20755
  fieldMinW: 260,
20607
20756
  // xl — 값이 `YYYY-MM-DD ~ YYYY-MM-DD` 라 단일 날짜의 두 배가 넘는다.
20608
20757
  // 최소너비(260)가 이미 lg 를 넘으므로 상한도 한 등급 위여야 한다
20609
20758
  fieldMaxW: "xl",
20759
+ // 요일 폭 계산에 숫자가 필요해 남긴다. 렌더 타이포는 typo 가 맡는다
20610
20760
  fontSize: 14,
20611
- lineHeight: 24,
20612
- radius: 6
20761
+ typo: "typo-field-md-default",
20762
+ radius: "var(--cmp-datepicker-md-radius)"
20613
20763
  } : {
20614
- padX: 12,
20615
- gap: 8,
20616
- icon: 16,
20764
+ padX: "var(--cmp-datepicker-sm-paddingX)",
20765
+ gap: "var(--cmp-datepicker-sm-gap)",
20766
+ icon: "var(--cmp-datepicker-sm-icon)",
20617
20767
  minW: 80,
20618
20768
  fieldMinW: 216,
20619
20769
  // lg — 최소너비 216 이 md 를 넘어 md 로는 담기지 않는다
20620
20770
  fieldMaxW: "lg",
20621
20771
  fontSize: 12,
20622
- lineHeight: 20,
20623
- radius: 4
20772
+ typo: "typo-field-sm-default",
20773
+ radius: "var(--cmp-datepicker-sm-radius)"
20624
20774
  };
20625
20775
  const weekdayW = showWeekday ? weekdaySuffixWidth(baseDims.fontSize) * 2 : 0;
20626
20776
  const dims = {
@@ -20697,7 +20847,7 @@ function SDateRangePicker({
20697
20847
  "flex h-full w-full items-center overflow-hidden bg-transparent outline-none",
20698
20848
  disabled ? "cursor-not-allowed" : "cursor-pointer"
20699
20849
  ),
20700
- style: { padding: `0 ${dims.padX}px`, gap: dims.gap, borderRadius: dims.radius },
20850
+ style: { padding: `0 ${dims.padX}`, gap: dims.gap, borderRadius: dims.radius },
20701
20851
  children: [
20702
20852
  /* @__PURE__ */ jsxRuntime.jsx(
20703
20853
  SIcon,
@@ -20714,12 +20864,11 @@ function SDateRangePicker({
20714
20864
  id: triggerTextId,
20715
20865
  className: cn(
20716
20866
  "flex-1 items-center",
20867
+ dims.typo,
20717
20868
  hasDisplay ? "flex" : "block truncate text-center"
20718
20869
  ),
20719
20870
  style: {
20720
20871
  minWidth: dims.minW,
20721
- fontSize: dims.fontSize,
20722
- lineHeight: `${dims.lineHeight}px`,
20723
20872
  color: disabled ? "var(--cmp-datepicker-text-disabled)" : hasDisplay ? "var(--cmp-datepicker-text-default)" : "var(--cmp-field-hint-color)"
20724
20873
  },
20725
20874
  children: hasDisplay ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
@@ -20874,8 +21023,9 @@ var SChipImpl = /* @__PURE__ */ react.forwardRef(function SChip({
20874
21023
  {
20875
21024
  "aria-disabled": disabled ? "true" : void 0,
20876
21025
  className: cn(
20877
- "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",
20878
- editing ? "font-normal" : "font-medium",
21026
+ "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",
21027
+ // chip.typography.focus / .default
21028
+ editing ? "typo-control-xs-default" : "typo-control-xs-medium",
20879
21029
  disabled ? "cursor-not-allowed" : "",
20880
21030
  className
20881
21031
  ),
@@ -21047,7 +21197,7 @@ function SFilePicker({
21047
21197
  const resolvedError = error || ruleError !== "";
21048
21198
  const resolvedStatus = status ?? (rules?.length ? ruleError !== "" ? "error" : void 0 : void 0);
21049
21199
  const padX = size === "md" ? "var(--cmp-filepicker-md-paddingX)" : "var(--cmp-filepicker-sm-paddingX)";
21050
- const iconSize = size === "md" ? 20 : 16;
21200
+ const iconSize = size === "md" ? "var(--cmp-filepicker-md-icon)" : "var(--cmp-filepicker-sm-icon)";
21051
21201
  const gapCls = size === "md" ? "gap-[var(--cmp-filepicker-md-gap)]" : "gap-[var(--cmp-filepicker-sm-gap)]";
21052
21202
  const inlinePlaceholder = inline && !disabled && !hasFiles;
21053
21203
  const showListbox = multiple && showMultipleListBox;
@@ -21101,7 +21251,8 @@ function SFilePicker({
21101
21251
  {
21102
21252
  id: displayTextId,
21103
21253
  className: cn(
21104
- "min-w-0 flex-1 truncate text-[12px]",
21254
+ "min-w-0 flex-1 truncate",
21255
+ size === "md" ? "typo-field-md-default" : "typo-field-sm-default",
21105
21256
  inlinePlaceholder && "text-[color:var(--cmp-filepicker-text-placeholder)] transition-colors group-hover/filepicker:text-[color:var(--cmp-filepicker-text-default)]"
21106
21257
  ),
21107
21258
  style: inlinePlaceholder ? void 0 : {
@@ -21275,10 +21426,10 @@ function SKeyValueTable({
21275
21426
  skipOccupied();
21276
21427
  maxCols = Math.max(maxCols, col, occupied.length);
21277
21428
  });
21278
- const radiusClass = radius === "full" ? "rounded-none" : radius === "useTop" ? "rounded-b-[8px] rounded-t-none" : "rounded-[8px]";
21429
+ const radiusClass = radius === "full" ? "rounded-none" : radius === "useTop" ? "rounded-b-[var(--cmp-table-radius)] rounded-t-none" : "rounded-[var(--cmp-table-radius)]";
21279
21430
  const frameClass = cn(
21280
21431
  "overflow-hidden",
21281
- bordered && "border border-solid border-[color:var(--cmp-table-border-color)]",
21432
+ bordered && "border-[length:var(--cmp-table-border-width)] border-solid border-[color:var(--cmp-table-border-color)]",
21282
21433
  radiusClass
21283
21434
  );
21284
21435
  const table = /* @__PURE__ */ jsxRuntime.jsxs(
@@ -21314,7 +21465,7 @@ function SKeyValueTable({
21314
21465
  paddingBottom: cellPadY
21315
21466
  },
21316
21467
  children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex h-full w-full items-center justify-between gap-[var(--cmp-table-header-gap)]", children: [
21317
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "inline-flex items-center gap-[8px]", children: [
21468
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "inline-flex items-center gap-[var(--cmp-table-content-gap)]", children: [
21318
21469
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-[12px] font-bold leading-[20px] text-[color:var(--sys-color-fg-primary)]", children: f.label }),
21319
21470
  f.required && /* @__PURE__ */ jsxRuntime.jsx(SIcon, { name: "asterisk", size: 12, color: "var(--sys-color-fg-accent)" })
21320
21471
  ] }),
@@ -23422,22 +23573,15 @@ function SToast({
23422
23573
  ...style
23423
23574
  },
23424
23575
  children: [
23425
- icon && /* @__PURE__ */ jsxRuntime.jsx(SIcon, { name: icon, size: 16, color: iconColor }),
23426
- /* @__PURE__ */ jsxRuntime.jsx(
23427
- "span",
23428
- {
23429
- className: "text-[14px] font-medium leading-[24px] text-nowrap",
23430
- style: { color: content },
23431
- children: message
23432
- }
23433
- ),
23576
+ icon && /* @__PURE__ */ jsxRuntime.jsx(SIcon, { name: icon, size: "var(--cmp-toast-icon)", color: iconColor }),
23577
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "typo-feedback-md-medium text-nowrap", style: { color: content }, children: message }),
23434
23578
  link && /* @__PURE__ */ jsxRuntime.jsx(
23435
23579
  "a",
23436
23580
  {
23437
23581
  href: link,
23438
23582
  target: "_blank",
23439
23583
  rel: "noopener noreferrer",
23440
- className: "text-[14px] font-bold leading-[24px] underline text-nowrap",
23584
+ className: "typo-feedback-md-underline text-nowrap",
23441
23585
  style: { color: linkColor },
23442
23586
  children: linkLabel || link
23443
23587
  }
@@ -23980,9 +24124,9 @@ var SForm = /* @__PURE__ */ react.forwardRef(function SForm2({ formClassName, on
23980
24124
  ) });
23981
24125
  });
23982
24126
  var SIZE_CONFIG2 = {
23983
- xs: { fontSize: 12, lineHeight: 20, radius: "var(--cmp-radioButton-radius-sm)" },
23984
- sm: { fontSize: 12, lineHeight: 20, radius: "var(--cmp-radioButton-radius-sm)" },
23985
- md: { fontSize: 14, lineHeight: 24, radius: "var(--cmp-radioButton-radius-md)" }
24127
+ xs: { typo: "typo-control-xs-medium", radius: "var(--cmp-radioButton-radius-sm)" },
24128
+ sm: { typo: "typo-control-xs-medium", radius: "var(--cmp-radioButton-radius-sm)" },
24129
+ md: { typo: "typo-control-sm-default", radius: "var(--cmp-radioButton-radius-md)" }
23986
24130
  };
23987
24131
  function SRadioButton({
23988
24132
  options = [],
@@ -24031,8 +24175,9 @@ function SRadioButton({
24031
24175
  onFocus: tooltip ? () => setHoveredValue(o.value) : void 0,
24032
24176
  onBlur: tooltip ? () => setHoveredValue(null) : void 0,
24033
24177
  className: cn(
24034
- "relative box-border grow inline-flex items-center justify-center whitespace-nowrap border border-solid font-medium transition-colors",
24035
- first ? "" : "-ml-px",
24178
+ "relative box-border grow inline-flex items-center justify-center whitespace-nowrap border-(length:--cmp-radioButton-border-width) border-solid transition-colors",
24179
+ s.typo,
24180
+ first ? "" : "ml-(--cmp-radioButton-group-gap)",
24036
24181
  selected ? "z-10" : "",
24037
24182
  !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",
24038
24183
  od ? "cursor-not-allowed" : ro ? "cursor-default" : "cursor-pointer"
@@ -24040,8 +24185,6 @@ function SRadioButton({
24040
24185
  style: {
24041
24186
  height: `var(--cmp-radioButton-${size}-height)`,
24042
24187
  padding: `0 var(--cmp-radioButton-${size}-paddingX)`,
24043
- fontSize: `${s.fontSize}px`,
24044
- lineHeight: `${s.lineHeight}px`,
24045
24188
  borderRadius: [
24046
24189
  first ? s.radius : "0",
24047
24190
  last ? s.radius : "0",
@@ -24078,6 +24221,7 @@ function SRadioCard({
24078
24221
  value,
24079
24222
  label,
24080
24223
  subtitle,
24224
+ children,
24081
24225
  tag,
24082
24226
  disabled = false,
24083
24227
  name,
@@ -24105,72 +24249,85 @@ function SRadioCard({
24105
24249
  };
24106
24250
  const textColor = disabled ? "text-(--sys-color-disabled-text)" : null;
24107
24251
  return /* @__PURE__ */ jsxRuntime.jsxs(
24108
- "label",
24252
+ "div",
24109
24253
  {
24110
- ...cardInteractiveProps,
24111
- "aria-disabled": disabled || void 0,
24112
24254
  className: cn(
24113
- "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",
24114
- 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)",
24255
+ "box-border flex w-full flex-col rounded-(--cmp-radioCard-radius) border-(length:--cmp-radioCard-border-width) border-solid transition-colors",
24256
+ 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)",
24115
24257
  className
24116
24258
  ),
24117
24259
  style,
24118
24260
  children: [
24119
- /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-(--cmp-radioCard-gap)", children: [
24120
- native && /* @__PURE__ */ jsxRuntime.jsx(
24121
- "input",
24122
- {
24123
- type: "radio",
24124
- name,
24125
- value: valStr,
24126
- checked,
24127
- disabled,
24128
- onChange: () => onValueChange?.(val),
24129
- className: "sr-only"
24130
- }
24131
- ),
24132
- /* @__PURE__ */ jsxRuntime.jsx(
24133
- "span",
24134
- {
24135
- 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)",
24136
- style: {
24137
- "--rc-dot-bg": disabled ? "var(--cmp-radio-bg-disabled)" : "var(--cmp-radio-bg-default)",
24138
- "--rc-dot-border": disabled ? "var(--cmp-radio-border-disabled)" : checked ? "var(--cmp-radio-border-active)" : "var(--cmp-radio-border-default)"
24139
- },
24140
- children: checked && /* @__PURE__ */ jsxRuntime.jsx(
24261
+ /* @__PURE__ */ jsxRuntime.jsxs(
24262
+ "label",
24263
+ {
24264
+ ...cardInteractiveProps,
24265
+ "aria-disabled": disabled || void 0,
24266
+ className: cn(
24267
+ "box-border flex w-full flex-col px-(--cmp-radioCard-paddingX) py-(--cmp-radioCard-paddingY)",
24268
+ disabled ? "cursor-not-allowed" : "cursor-pointer"
24269
+ ),
24270
+ children: [
24271
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-(--cmp-radioCard-gap)", children: [
24272
+ native && /* @__PURE__ */ jsxRuntime.jsx(
24273
+ "input",
24274
+ {
24275
+ type: "radio",
24276
+ name,
24277
+ value: valStr,
24278
+ checked,
24279
+ disabled,
24280
+ onChange: () => onValueChange?.(val),
24281
+ className: "sr-only"
24282
+ }
24283
+ ),
24284
+ /* @__PURE__ */ jsxRuntime.jsx(
24285
+ "span",
24286
+ {
24287
+ 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)",
24288
+ style: {
24289
+ "--rc-dot-bg": disabled ? "var(--cmp-radio-bg-disabled)" : "var(--cmp-radio-bg-default)",
24290
+ "--rc-dot-border": disabled ? "var(--cmp-radio-border-disabled)" : checked ? "var(--cmp-radio-border-active)" : "var(--cmp-radio-border-default)"
24291
+ },
24292
+ children: checked && /* @__PURE__ */ jsxRuntime.jsx(
24293
+ "span",
24294
+ {
24295
+ className: "h-(--cmp-radio-dot-size) w-(--cmp-radio-dot-size) rounded-(--cmp-radio-radius) bg-(--rc-dot-fill)",
24296
+ style: {
24297
+ "--rc-dot-fill": disabled ? "var(--cmp-radio-dot-disabled)" : "var(--cmp-radio-dot-default)"
24298
+ }
24299
+ }
24300
+ )
24301
+ }
24302
+ ),
24303
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: cn("grid min-w-0", textColor ?? "text-(--cmp-radioCard-label-color)"), children: [
24304
+ /* @__PURE__ */ jsxRuntime.jsx("span", { "aria-hidden": true, className: "typo-body-md-bold invisible", style: { gridArea: "1 / 1" }, children: label }),
24305
+ /* @__PURE__ */ jsxRuntime.jsx(
24306
+ "span",
24307
+ {
24308
+ className: checked ? "typo-body-md-bold" : "typo-body-md-semibold",
24309
+ style: { gridArea: "1 / 1" },
24310
+ children: label
24311
+ }
24312
+ )
24313
+ ] }),
24314
+ tag && /* @__PURE__ */ jsxRuntime.jsx(STag, { ...tag, size: "xs", className: "ml-auto" })
24315
+ ] }),
24316
+ subtitle && /* @__PURE__ */ jsxRuntime.jsx(
24141
24317
  "span",
24142
24318
  {
24143
- className: "h-(--cmp-radio-dot-size) w-(--cmp-radio-dot-size) rounded-(--cmp-radio-radius) bg-(--rc-dot-fill)",
24144
- style: {
24145
- "--rc-dot-fill": disabled ? "var(--cmp-radio-dot-disabled)" : "var(--cmp-radio-dot-default)"
24146
- }
24319
+ className: cn(
24320
+ "typo-body-sm-default pl-(--cmp-radioCard-subtitle-paddingLeft)",
24321
+ textColor ?? "text-(--cmp-radioCard-subtitle-color)"
24322
+ ),
24323
+ children: subtitle
24147
24324
  }
24148
24325
  )
24149
- }
24150
- ),
24151
- /* @__PURE__ */ jsxRuntime.jsxs("span", { className: cn("grid min-w-0", textColor ?? "text-(--cmp-radioCard-label-color)"), children: [
24152
- /* @__PURE__ */ jsxRuntime.jsx("span", { "aria-hidden": true, className: "typo-body-md-bold invisible", style: { gridArea: "1 / 1" }, children: label }),
24153
- /* @__PURE__ */ jsxRuntime.jsx(
24154
- "span",
24155
- {
24156
- className: checked ? "typo-body-md-bold" : "typo-body-md-semibold",
24157
- style: { gridArea: "1 / 1" },
24158
- children: label
24159
- }
24160
- )
24161
- ] }),
24162
- tag && /* @__PURE__ */ jsxRuntime.jsx(STag, { ...tag, size: "xs", className: "ml-auto" })
24163
- ] }),
24164
- subtitle && /* @__PURE__ */ jsxRuntime.jsx(
24165
- "span",
24166
- {
24167
- className: cn(
24168
- "typo-body-sm-default pl-(--cmp-radioCard-subtitle-paddingLeft)",
24169
- textColor ?? "text-(--cmp-radioCard-subtitle-color)"
24170
- ),
24171
- children: subtitle
24326
+ ]
24172
24327
  }
24173
- )
24328
+ ),
24329
+ children != null && children !== false && // 라벨 왼쪽 끝(카드 여백 + 서브타이틀 들여쓰기)에 맞춘다. 서브타이틀과의 간격은 label 의 아래 여백이다
24330
+ /* @__PURE__ */ jsxRuntime.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 })
24174
24331
  ]
24175
24332
  }
24176
24333
  );
@@ -24205,7 +24362,8 @@ function SRadioCardGroup({
24205
24362
  tag: o.tag,
24206
24363
  name: groupName,
24207
24364
  disabled: disabled || o.disabled,
24208
- onValueChange
24365
+ onValueChange,
24366
+ children: o.content
24209
24367
  },
24210
24368
  String(o.value)
24211
24369
  ))
@@ -26544,6 +26702,7 @@ var CHIPFILTER = {
26544
26702
  dividerHeight: "var(--cmp-chipFilter-divider-height)",
26545
26703
  chipHeight: "var(--cmp-chipFilter-chip-height)",
26546
26704
  chipRadius: "var(--cmp-chipFilter-chip-radius)",
26705
+ chipPaddingX: "var(--cmp-chipFilter-chip-paddingX)",
26547
26706
  chipGap: "var(--cmp-chipFilter-chip-gap)",
26548
26707
  chipDefaultBg: "var(--cmp-chipFilter-chip-default-bg)",
26549
26708
  chipDefaultBorder: "var(--cmp-chipFilter-chip-default-border)",
@@ -26554,7 +26713,7 @@ var CHIPFILTER = {
26554
26713
  chipAppliedBg: "var(--cmp-chipFilter-chip-applied-bg)",
26555
26714
  chipAppliedBorder: "var(--cmp-chipFilter-chip-applied-border)",
26556
26715
  chipAppliedLabel: "var(--cmp-chipFilter-chip-applied-text-label)",
26557
- chipAppliedValue: "var(--color-brilliantblue-80)",
26716
+ chipAppliedValue: "var(--cmp-chipFilter-chip-applied-text-data)",
26558
26717
  chipDisabledBg: "var(--cmp-chipFilter-chip-disabled-bg)",
26559
26718
  chipDisabledBorder: "var(--cmp-chipFilter-chip-disabled-border)",
26560
26719
  chipDisabledText: "var(--cmp-chipFilter-chip-disabled-text)",
@@ -27189,20 +27348,13 @@ var SChipFilter = /* @__PURE__ */ react.forwardRef(function SChipFilter2({
27189
27348
  onValueChange: (next) => emitValueAndSearch(field.key, next)
27190
27349
  }),
27191
27350
  addable && !disabled && !field.disabled && showClear && /* @__PURE__ */ jsxRuntime.jsx(
27192
- "button",
27351
+ SGhostButton,
27193
27352
  {
27194
- type: "button",
27195
- "aria-label": `${field.label} \uD544\uD130 \uC81C\uAC70`,
27196
- className: "inline-flex size-[16px] shrink-0 items-center justify-center rounded-[var(--cmp-ghostButton-radius-sm)] border-none bg-transparent p-0",
27197
- onClick: handleClear,
27198
- children: /* @__PURE__ */ jsxRuntime.jsx(
27199
- SIcon,
27200
- {
27201
- name: "close",
27202
- size: 12,
27203
- color: "var(--cmp-ghostButton-default-content)"
27204
- }
27205
- )
27353
+ icon: "close",
27354
+ size: "xxs",
27355
+ ariaLabel: `${field.label} \uD544\uD130 \uC81C\uAC70`,
27356
+ className: "shrink-0",
27357
+ onClick: handleClear
27206
27358
  }
27207
27359
  )
27208
27360
  ] }, field.key) : /* @__PURE__ */ jsxRuntime.jsx(
@@ -27245,7 +27397,7 @@ var SChipFilter = /* @__PURE__ */ react.forwardRef(function SChipFilter2({
27245
27397
  {
27246
27398
  type: "button",
27247
27399
  disabled: disabled || inactiveFields.length === 0,
27248
- 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",
27400
+ 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",
27249
27401
  style: {
27250
27402
  minHeight: "var(--cmp-chipFilter-addButton-height)" ,
27251
27403
  borderRadius: "var(--cmp-chipFilter-addButton-radius)" ,
@@ -27257,7 +27409,7 @@ var SChipFilter = /* @__PURE__ */ react.forwardRef(function SChipFilter2({
27257
27409
  SIcon,
27258
27410
  {
27259
27411
  name: "add",
27260
- size: 12,
27412
+ size: "var(--cmp-chipFilter-addButton-icon)",
27261
27413
  color: disabled || inactiveFields.length === 0 ? CHIPFILTER.addTextDisabled : CHIPFILTER.addText
27262
27414
  }
27263
27415
  ),
@@ -27293,9 +27445,9 @@ var SChipFilter = /* @__PURE__ */ react.forwardRef(function SChipFilter2({
27293
27445
  onClick: reset,
27294
27446
  className: cn(
27295
27447
  "shrink-0",
27296
- // 부모 flex gap(6px)은 칩 사이 간격 기준이라, 필터 추가 버튼과의 12px 간격을 맞추려면
27297
- // 부족한 만큼(12px - gap)을 추가로 띄운다. 필터 추가가 없을 땐 divider와 이미 12px이라 불필요.
27298
- hasAddButton && "ml-[calc(12px-var(--cmp-chipFilter-chip-group))]"
27448
+ // 부모 flex gap(chip-group)은 칩 사이 간격 기준이라, 필터 추가 버튼과의 bar-gap 간격을 맞추려면
27449
+ // 부족한 만큼(bar-gap - chip-group)을 추가로 띄운다. 필터 추가가 없을 땐 divider와 이미 bar-gap이라 불필요.
27450
+ hasAddButton && "ml-[calc(var(--cmp-chipFilter-bar-gap)_-_var(--cmp-chipFilter-chip-group))]"
27299
27451
  )
27300
27452
  }
27301
27453
  )
@@ -27349,7 +27501,7 @@ function Divider({ inset, top } = {}) {
27349
27501
  className: cn(
27350
27502
  "inline-flex w-px shrink-0 bg-[var(--chipfilter-bar-border)]",
27351
27503
  top ? "mt-[2px] self-start" : "my-auto",
27352
- inset && "mx-[calc(12px-var(--cmp-chipFilter-chip-group))]"
27504
+ inset && "mx-[calc(var(--cmp-chipFilter-bar-gap)_-_var(--cmp-chipFilter-chip-group))]"
27353
27505
  ),
27354
27506
  style: { height: "var(--chipfilter-divider-height)" }
27355
27507
  }
@@ -27389,87 +27541,97 @@ function FilterChip({
27389
27541
  const border = disabled ? CHIPFILTER.chipDisabledBorder : warning ? CHIPFILTER.chipWarningBorder : applied ? active ? "var(--color-blue-strong)" : CHIPFILTER.chipAppliedBorder : active ? CHIPFILTER.chipActiveBorder : CHIPFILTER.chipDefaultBorder;
27390
27542
  const background = disabled ? CHIPFILTER.chipDisabledBg : applied ? CHIPFILTER.chipAppliedBg : CHIPFILTER.chipDefaultBg;
27391
27543
  const textColor = disabled ? CHIPFILTER.chipDisabledText : CHIPFILTER.chipDefaultText;
27544
+ const hasClear = !disabled && showClear && (applied || showClearWhenEmpty);
27392
27545
  return /* @__PURE__ */ jsxRuntime.jsxs(
27393
- "button",
27546
+ "div",
27394
27547
  {
27395
- ref: refCallback,
27396
- type: "button",
27397
- disabled,
27398
- "aria-expanded": active,
27399
27548
  onPointerDown: (event) => event.stopPropagation(),
27400
- onClick: onOpen,
27401
- 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",
27549
+ className: "inline-flex max-w-full shrink-0 items-stretch whitespace-nowrap border border-solid",
27402
27550
  style: {
27403
27551
  minHeight: CHIPFILTER.chipHeight,
27404
27552
  gap: CHIPFILTER.chipGap,
27405
27553
  borderRadius: CHIPFILTER.chipRadius,
27406
27554
  borderColor: border,
27407
27555
  background,
27408
- color: textColor
27556
+ paddingRight: hasClear ? CHIPFILTER.chipPaddingX : void 0
27409
27557
  },
27410
27558
  children: [
27411
- field.required && /* @__PURE__ */ jsxRuntime.jsx(
27412
- SIcon,
27559
+ /* @__PURE__ */ jsxRuntime.jsxs(
27560
+ "button",
27413
27561
  {
27414
- name: "asterisk",
27415
- size: 12,
27416
- color: disabled ? CHIPFILTER.chipDisabledText : "var(--cmp-tag-darkblue-content)"
27562
+ ref: refCallback,
27563
+ type: "button",
27564
+ disabled,
27565
+ "aria-expanded": active,
27566
+ onClick: onOpen,
27567
+ 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",
27568
+ style: {
27569
+ gap: CHIPFILTER.chipGap,
27570
+ paddingLeft: CHIPFILTER.chipPaddingX,
27571
+ paddingRight: hasClear ? void 0 : CHIPFILTER.chipPaddingX,
27572
+ color: textColor
27573
+ },
27574
+ children: [
27575
+ field.required && /* @__PURE__ */ jsxRuntime.jsx(
27576
+ SIcon,
27577
+ {
27578
+ name: "asterisk",
27579
+ size: "var(--cmp-chipFilter-chip-icon-essential)",
27580
+ color: disabled ? CHIPFILTER.chipDisabledText : "var(--cmp-tag-darkblue-content)"
27581
+ }
27582
+ ),
27583
+ applied ? /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "inline-flex min-w-0 items-center gap-[4px] truncate", children: [
27584
+ /* @__PURE__ */ jsxRuntime.jsx(
27585
+ "span",
27586
+ {
27587
+ className: "typo-body-sm-bold",
27588
+ style: {
27589
+ color: disabled ? CHIPFILTER.chipDisabledText : CHIPFILTER.chipAppliedLabel
27590
+ },
27591
+ children: field.label
27592
+ }
27593
+ ),
27594
+ /* @__PURE__ */ jsxRuntime.jsx(
27595
+ "span",
27596
+ {
27597
+ style: {
27598
+ color: disabled ? CHIPFILTER.chipDisabledText : CHIPFILTER.chipAppliedLabel
27599
+ },
27600
+ children: ":"
27601
+ }
27602
+ ),
27603
+ /* @__PURE__ */ jsxRuntime.jsx(
27604
+ "span",
27605
+ {
27606
+ className: "min-w-0 truncate typo-body-sm-bold",
27607
+ style: {
27608
+ color: disabled ? CHIPFILTER.chipDisabledText : CHIPFILTER.chipAppliedValue
27609
+ },
27610
+ children: valueText
27611
+ }
27612
+ )
27613
+ ] }) : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
27614
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: cn("min-w-0 truncate", active && "typo-body-sm-bold"), children: field.label }),
27615
+ /* @__PURE__ */ jsxRuntime.jsx(
27616
+ SIcon,
27617
+ {
27618
+ name: "caretDown",
27619
+ size: "var(--cmp-chipFilter-chip-icon-caret)",
27620
+ color: disabled ? CHIPFILTER.chipDisabledText : CHIPFILTER.chipCaret
27621
+ }
27622
+ )
27623
+ ] })
27624
+ ]
27417
27625
  }
27418
27626
  ),
27419
- applied ? /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "inline-flex min-w-0 items-center gap-[4px] truncate", children: [
27420
- /* @__PURE__ */ jsxRuntime.jsx(
27421
- "span",
27422
- {
27423
- className: "font-bold",
27424
- style: { color: disabled ? CHIPFILTER.chipDisabledText : CHIPFILTER.chipAppliedLabel },
27425
- children: field.label
27426
- }
27427
- ),
27428
- /* @__PURE__ */ jsxRuntime.jsx(
27429
- "span",
27430
- {
27431
- style: { color: disabled ? CHIPFILTER.chipDisabledText : CHIPFILTER.chipAppliedLabel },
27432
- children: ":"
27433
- }
27434
- ),
27435
- /* @__PURE__ */ jsxRuntime.jsx(
27436
- "span",
27437
- {
27438
- className: "min-w-0 truncate font-bold",
27439
- style: { color: disabled ? CHIPFILTER.chipDisabledText : CHIPFILTER.chipAppliedValue },
27440
- children: valueText
27441
- }
27442
- )
27443
- ] }) : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
27444
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: cn("min-w-0 truncate", active && "font-bold"), children: field.label }),
27445
- /* @__PURE__ */ jsxRuntime.jsx(
27446
- SIcon,
27447
- {
27448
- name: "caretDown",
27449
- size: 12,
27450
- color: disabled ? CHIPFILTER.chipDisabledText : CHIPFILTER.chipCaret
27451
- }
27452
- )
27453
- ] }),
27454
- !disabled && showClear && (applied || showClearWhenEmpty) && /* @__PURE__ */ jsxRuntime.jsx(
27455
- "span",
27627
+ hasClear && /* @__PURE__ */ jsxRuntime.jsx(
27628
+ SGhostButton,
27456
27629
  {
27457
- role: "button",
27458
- tabIndex: 0,
27459
- "aria-label": `${field.label} \uD544\uD130 \uC9C0\uC6B0\uAE30`,
27460
- className: "inline-flex size-[16px] items-center justify-center rounded-[var(--cmp-ghostButton-radius-sm)]",
27461
- onClick: (event) => {
27462
- event.preventDefault();
27463
- event.stopPropagation();
27464
- onClear();
27465
- },
27466
- onKeyDown: (event) => {
27467
- if (event.key !== "Enter" && event.key !== " ") return;
27468
- event.preventDefault();
27469
- event.stopPropagation();
27470
- onClear();
27471
- },
27472
- children: /* @__PURE__ */ jsxRuntime.jsx(SIcon, { name: "close", size: 12, color: "var(--cmp-ghostButton-default-content)" })
27630
+ icon: "close",
27631
+ size: "xxs",
27632
+ ariaLabel: `${field.label} \uD544\uD130 \uC9C0\uC6B0\uAE30`,
27633
+ className: "shrink-0 self-center",
27634
+ onClick: onClear
27473
27635
  }
27474
27636
  )
27475
27637
  ]
@@ -27849,47 +28011,18 @@ function InlineDatePresetFilter({
27849
28011
  const badgeBackground = disabled ? CHIPFILTER.chipDisabledBg : CHIPFILTER.chipAppliedBg;
27850
28012
  const badgeLabelColor = disabled ? CHIPFILTER.chipDisabledText : CHIPFILTER.chipAppliedLabel;
27851
28013
  const badgeValueColor = disabled ? CHIPFILTER.chipDisabledText : CHIPFILTER.chipAppliedValue;
27852
- const badge = applied && /* @__PURE__ */ jsxRuntime.jsxs(
27853
- "span",
27854
- {
27855
- className: "inline-flex shrink-0 items-center gap-[4px] whitespace-nowrap border border-solid px-[var(--cmp-chipFilter-chip-paddingX)] text-[12px] leading-[20px]",
27856
- style: {
27857
- minHeight: CHIPFILTER.chipHeight,
27858
- borderRadius: CHIPFILTER.chipRadius,
27859
- borderColor: badgeBorder,
27860
- background: badgeBackground,
27861
- color: badgeLabelColor,
27862
- cursor: rangeValue && !disabled ? "pointer" : void 0
27863
- },
27864
- children: [
27865
- /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "font-bold", children: [
27866
- field.label,
27867
- ":"
27868
- ] }),
27869
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-bold", style: { color: badgeValueColor }, children: displayValue(field, value) }),
27870
- !disabled && showClear && /* @__PURE__ */ jsxRuntime.jsx(
27871
- "span",
27872
- {
27873
- role: "button",
27874
- tabIndex: 0,
27875
- "aria-label": `${field.label} \uD544\uD130 \uC9C0\uC6B0\uAE30`,
27876
- className: "inline-flex size-[16px] items-center justify-center rounded-[var(--cmp-ghostButton-radius-sm)]",
27877
- onClick: (event) => {
27878
- event.stopPropagation();
27879
- onClear();
27880
- },
27881
- onKeyDown: (event) => {
27882
- if (event.key !== "Enter" && event.key !== " ") return;
27883
- event.preventDefault();
27884
- event.stopPropagation();
27885
- onClear();
27886
- },
27887
- children: /* @__PURE__ */ jsxRuntime.jsx(SIcon, { name: "close", size: 12, color: "var(--cmp-ghostButton-default-content)" })
27888
- }
27889
- )
27890
- ]
27891
- }
27892
- );
28014
+ const hasClear = !disabled && showClear;
28015
+ const badgeTextStyle = {
28016
+ paddingLeft: CHIPFILTER.chipPaddingX,
28017
+ paddingRight: hasClear ? void 0 : CHIPFILTER.chipPaddingX
28018
+ };
28019
+ const badgeText = /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
28020
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "typo-body-sm-bold", children: [
28021
+ field.label,
28022
+ ":"
28023
+ ] }),
28024
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "typo-body-sm-bold", style: { color: badgeValueColor }, children: displayValue(field, value) })
28025
+ ] });
27893
28026
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex shrink-0 items-center gap-[8px]", children: [
27894
28027
  /* @__PURE__ */ jsxRuntime.jsx(
27895
28028
  SRadioButton,
@@ -27901,43 +28034,71 @@ function InlineDatePresetFilter({
27901
28034
  onValueChange: (next) => selectPreset(String(next))
27902
28035
  }
27903
28036
  ),
27904
- applied && (rangeValue ? (
27905
- // 뱃지 모양은 그대로 두고, 눌렀을 때 캘린더가 열려 기간을 직접 다시 고를 수 있게 한다.
27906
- // 직접 고르면 프리셋 선택은 해제된다.
27907
- /* @__PURE__ */ jsxRuntime.jsxs(RPopover13__namespace.Root, { open: pickerOpen, onOpenChange: setPickerOpen, children: [
27908
- /* @__PURE__ */ jsxRuntime.jsx(RPopover13__namespace.Trigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(
27909
- "button",
27910
- {
27911
- type: "button",
27912
- disabled,
27913
- className: "border-none bg-transparent p-0 outline-none disabled:cursor-not-allowed",
27914
- children: badge
27915
- }
27916
- ) }),
27917
- /* @__PURE__ */ jsxRuntime.jsx(RPopover13__namespace.Portal, { container: portalContainer, children: /* @__PURE__ */ jsxRuntime.jsx(
27918
- RPopover13__namespace.Content,
27919
- {
27920
- side: "bottom",
27921
- align: "start",
27922
- sideOffset: 4,
27923
- className: cn("z-50", FLOATING_SLIDE_ANIM),
27924
- children: /* @__PURE__ */ jsxRuntime.jsx(
27925
- RangeCalendar,
27926
- {
27927
- value: rangeValue,
27928
- selectable: field.selectable,
27929
- maxRange: field.maxRange,
27930
- onSelect: (range) => {
27931
- setSelectedId(null);
27932
- onValueChange(range);
27933
- setPickerOpen(false);
28037
+ applied && // 뱃지 모양(테두리·배경)은 바깥이 맡고, 라벨·값 칸과 지우기 × 를 형제로 둔다 — FilterChip 과
28038
+ // 같은 이유로, 캘린더를 여는 버튼 안에 × 를 넣지 않는다.
28039
+ /* @__PURE__ */ jsxRuntime.jsxs(
28040
+ "span",
28041
+ {
28042
+ className: "inline-flex shrink-0 items-stretch gap-[4px] whitespace-nowrap border border-solid typo-body-sm-default",
28043
+ style: {
28044
+ minHeight: CHIPFILTER.chipHeight,
28045
+ borderRadius: CHIPFILTER.chipRadius,
28046
+ borderColor: badgeBorder,
28047
+ background: badgeBackground,
28048
+ color: badgeLabelColor,
28049
+ paddingRight: hasClear ? CHIPFILTER.chipPaddingX : void 0
28050
+ },
28051
+ children: [
28052
+ rangeValue ? (
28053
+ // 눌렀을 때 캘린더가 열려 기간을 직접 다시 고를 수 있게 한다. 직접 고르면 프리셋 선택은 해제된다.
28054
+ /* @__PURE__ */ jsxRuntime.jsxs(RPopover13__namespace.Root, { open: pickerOpen, onOpenChange: setPickerOpen, children: [
28055
+ /* @__PURE__ */ jsxRuntime.jsx(RPopover13__namespace.Trigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(
28056
+ "button",
28057
+ {
28058
+ type: "button",
28059
+ disabled,
28060
+ className: "inline-flex cursor-pointer items-center gap-[4px] border-none bg-transparent p-0 outline-none disabled:cursor-not-allowed",
28061
+ style: badgeTextStyle,
28062
+ children: badgeText
27934
28063
  }
27935
- }
27936
- )
27937
- }
27938
- ) })
27939
- ] })
27940
- ) : badge)
28064
+ ) }),
28065
+ /* @__PURE__ */ jsxRuntime.jsx(RPopover13__namespace.Portal, { container: portalContainer, children: /* @__PURE__ */ jsxRuntime.jsx(
28066
+ RPopover13__namespace.Content,
28067
+ {
28068
+ side: "bottom",
28069
+ align: "start",
28070
+ sideOffset: 4,
28071
+ className: cn("z-50", FLOATING_SLIDE_ANIM),
28072
+ children: /* @__PURE__ */ jsxRuntime.jsx(
28073
+ RangeCalendar,
28074
+ {
28075
+ value: rangeValue,
28076
+ selectable: field.selectable,
28077
+ maxRange: field.maxRange,
28078
+ onSelect: (range) => {
28079
+ setSelectedId(null);
28080
+ onValueChange(range);
28081
+ setPickerOpen(false);
28082
+ }
28083
+ }
28084
+ )
28085
+ }
28086
+ ) })
28087
+ ] })
28088
+ ) : /* @__PURE__ */ jsxRuntime.jsx("span", { className: "inline-flex items-center gap-[4px]", style: badgeTextStyle, children: badgeText }),
28089
+ hasClear && /* @__PURE__ */ jsxRuntime.jsx(
28090
+ SGhostButton,
28091
+ {
28092
+ icon: "close",
28093
+ size: "xxs",
28094
+ ariaLabel: `${field.label} \uD544\uD130 \uC9C0\uC6B0\uAE30`,
28095
+ className: "shrink-0 self-center",
28096
+ onClick: onClear
28097
+ }
28098
+ )
28099
+ ]
28100
+ }
28101
+ )
27941
28102
  ] });
27942
28103
  }
27943
28104
  var MATCH_MODE_OPTIONS = [
@@ -28026,7 +28187,7 @@ function KeywordEditor({
28026
28187
  /* @__PURE__ */ jsxRuntime.jsx(
28027
28188
  "span",
28028
28189
  {
28029
- className: "shrink-0 whitespace-nowrap text-[12px] font-medium leading-[20px]",
28190
+ className: "shrink-0 whitespace-nowrap typo-body-sm-medium",
28030
28191
  style: { color: CHIPFILTER.listboxLabel },
28031
28192
  children: "\uAC80\uC0C9 \uC870\uAC74 :"
28032
28193
  }
@@ -28086,7 +28247,7 @@ function KeywordEntryRow({
28086
28247
  return /* @__PURE__ */ jsxRuntime.jsxs(
28087
28248
  "div",
28088
28249
  {
28089
- className: "group flex w-full items-center justify-between gap-[8px] text-[12px] leading-[20px]",
28250
+ className: "group flex w-full items-center justify-between gap-[8px] typo-body-sm-default",
28090
28251
  style: {
28091
28252
  paddingTop: CHIPFILTER.itemPaddingY,
28092
28253
  paddingBottom: CHIPFILTER.itemPaddingY,
@@ -28097,13 +28258,13 @@ function KeywordEntryRow({
28097
28258
  children: [
28098
28259
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: cn("min-w-0 truncate", !disabled && "group-hover:font-bold"), children: label }),
28099
28260
  !disabled && /* @__PURE__ */ jsxRuntime.jsx(
28100
- "button",
28261
+ SGhostButton,
28101
28262
  {
28102
- type: "button",
28103
- "aria-label": `${label} \uC0AD\uC81C`,
28104
- className: "invisible inline-flex size-[16px] shrink-0 cursor-pointer items-center justify-center group-hover:visible",
28105
- onClick: onRemove,
28106
- children: /* @__PURE__ */ jsxRuntime.jsx(SIcon, { name: "close", size: 12, color: "var(--cmp-ghostButton-default-content)" })
28263
+ icon: "close",
28264
+ size: "xxs",
28265
+ ariaLabel: `${label} \uC0AD\uC81C`,
28266
+ className: "invisible shrink-0 group-hover:visible",
28267
+ onClick: onRemove
28107
28268
  }
28108
28269
  )
28109
28270
  ]
@@ -28112,7 +28273,7 @@ function KeywordEntryRow({
28112
28273
  }
28113
28274
  var OPTION_SEARCH_THRESHOLD = 11;
28114
28275
  var filterFlatOptions = (flat, query) => filterDepthRows(flat, (option) => option.label.toLowerCase().includes(query));
28115
- var depthPaddingLeft = (depth) => depth === 1 ? 12 : depth === 2 ? 20 : 28;
28276
+ var depthPaddingLeft = (depth) => LIST_BOX_ITEM_PADDING_LEFT[depth === 1 ? 1 : depth === 2 ? 2 : 3];
28116
28277
  function OptionList({
28117
28278
  field,
28118
28279
  value,
@@ -28328,14 +28489,14 @@ function OptionCheckbox({ checked, disabled }) {
28328
28489
  "span",
28329
28490
  {
28330
28491
  className: cn(
28331
- "inline-flex size-[16px] shrink-0 items-center justify-center rounded-[2px] border border-solid",
28492
+ "inline-flex size-(--cmp-checkbox-size) shrink-0 items-center justify-center rounded-(--cmp-checkbox-radius) border-(length:--cmp-checkbox-borderWidth) border-solid",
28332
28493
  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)]"
28333
28494
  ),
28334
28495
  children: filled && /* @__PURE__ */ jsxRuntime.jsx(
28335
28496
  SIcon,
28336
28497
  {
28337
28498
  name: checked === null ? "checkboxIndeterminate" : "checkboxCheck",
28338
- size: 12,
28499
+ size: "var(--cmp-checkbox-icon)",
28339
28500
  color: disabled ? "var(--cmp-checkbox-checked-icon-disabled)" : "var(--cmp-checkbox-checked-icon-default)"
28340
28501
  }
28341
28502
  )
@@ -28380,8 +28541,8 @@ function MenuItem({
28380
28541
  onMouseEnter,
28381
28542
  onClick,
28382
28543
  className: cn(
28383
- "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",
28384
- selected ? "font-bold" : "font-normal",
28544
+ "flex w-full min-w-0 cursor-pointer items-center gap-[8px] border-none bg-transparent text-left outline-none disabled:cursor-not-allowed",
28545
+ selected ? "typo-body-sm-bold" : "typo-body-sm-default",
28385
28546
  !disabled && "hover:font-bold"
28386
28547
  ),
28387
28548
  style: {
@@ -28618,7 +28779,7 @@ var SChipInput = /* @__PURE__ */ react.forwardRef(function SChipInput2({
28618
28779
  labelPosition,
28619
28780
  subLabel,
28620
28781
  labelWidth,
28621
- labelHeight: `calc(var(--cmp-chipInput-${size}-minHeight) + 2px)`,
28782
+ labelHeight: `calc(var(--cmp-chipInput-${size}-minHeight) + var(--cmp-chipInput-borderWidth) * 2)`,
28622
28783
  icon,
28623
28784
  iconColor,
28624
28785
  labelTooltip,
@@ -28703,8 +28864,8 @@ var SChipInput = /* @__PURE__ */ react.forwardRef(function SChipInput2({
28703
28864
  {
28704
28865
  "aria-hidden": true,
28705
28866
  className: cn(
28706
- "invisible col-start-1 row-start-1 whitespace-pre font-normal",
28707
- size === "md" ? "text-14 leading-sd-24" : "text-12 leading-sd-20"
28867
+ "invisible col-start-1 row-start-1 whitespace-pre",
28868
+ size === "md" ? "typo-field-md-default" : "typo-field-sm-default"
28708
28869
  ),
28709
28870
  children: inputValue !== "" ? inputValue : values.length === 0 ? placeholder : ""
28710
28871
  }
@@ -28723,9 +28884,9 @@ var SChipInput = /* @__PURE__ */ react.forwardRef(function SChipInput2({
28723
28884
  "aria-activedescendant": showDropdown && activeIndex >= 0 ? activeOptionId : void 0,
28724
28885
  "aria-autocomplete": "list",
28725
28886
  className: cn(
28726
- "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",
28887
+ "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",
28727
28888
  AUTOFILL_RESET_CLASS,
28728
- size === "md" ? "text-14 leading-sd-24" : "text-12 leading-sd-20"
28889
+ size === "md" ? "typo-field-md-default" : "typo-field-sm-default"
28729
28890
  ),
28730
28891
  style: {
28731
28892
  minWidth: "1ch",
@@ -28895,7 +29056,7 @@ var SChipInput = /* @__PURE__ */ react.forwardRef(function SChipInput2({
28895
29056
  "aria-selected": selected || active,
28896
29057
  tabIndex: -1,
28897
29058
  className: cn(
28898
- "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",
29059
+ "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",
28899
29060
  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)"
28900
29061
  ),
28901
29062
  onMouseDown: (e) => {
@@ -29104,7 +29265,7 @@ var TIMEPICKER_SIZE_CONFIG = {
29104
29265
  gap: V4("sm-gap"),
29105
29266
  icon: V4("sm-icon"),
29106
29267
  radius: V4("sm-radius"),
29107
- // TODO: component.timepicker 토큰에 typography가 추가되면 CSS 변수로 교체한다.
29268
+ typography: "typo-field-sm-default",
29108
29269
  fontSize: 12,
29109
29270
  lineHeight: 20,
29110
29271
  minWidth: 80,
@@ -29117,7 +29278,7 @@ var TIMEPICKER_SIZE_CONFIG = {
29117
29278
  gap: V4("md-gap"),
29118
29279
  icon: V4("md-icon"),
29119
29280
  radius: V4("md-radius"),
29120
- // TODO: component.timepicker 토큰에 typography가 추가되면 CSS 변수로 교체한다.
29281
+ typography: "typo-field-md-default",
29121
29282
  fontSize: 14,
29122
29283
  lineHeight: 24,
29123
29284
  minWidth: 96,
@@ -29448,11 +29609,9 @@ function STimePicker({
29448
29609
  "span",
29449
29610
  {
29450
29611
  id: triggerTextId,
29451
- className: "flex-1 truncate text-center",
29612
+ className: cn("flex-1 truncate text-center", dims.typography),
29452
29613
  style: {
29453
29614
  minWidth: dims.minWidth,
29454
- fontSize: dims.fontSize,
29455
- lineHeight: `${dims.lineHeight}px`,
29456
29615
  color: disabled ? "var(--cmp-timepicker-text-disabled)" : hasValue ? "var(--cmp-timepicker-text-default)" : "var(--cmp-field-hint-color)"
29457
29616
  },
29458
29617
  children: hasValue ? displayText : placeholder
@@ -29556,7 +29715,7 @@ function RangeTimeSelector({
29556
29715
  className: "flex flex-col items-center",
29557
29716
  style: { gap: "var(--cmp-timepicker-selector-range-heading-gap)" },
29558
29717
  children: [
29559
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "whitespace-nowrap text-center text-[12px] font-bold leading-[20px] text-[var(--cmp-timepicker-selector-range-heading-color)]", children: title }),
29718
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "whitespace-nowrap text-center typo-field-sm-bold text-[var(--cmp-timepicker-selector-range-heading-color)]", children: title }),
29560
29719
  /* @__PURE__ */ jsxRuntime.jsx(
29561
29720
  TimeListbox,
29562
29721
  {
@@ -29723,11 +29882,9 @@ function STimeRangePicker({
29723
29882
  "span",
29724
29883
  {
29725
29884
  id: triggerTextId,
29726
- className: "flex-1 truncate text-center",
29885
+ className: cn("flex-1 truncate text-center", dims.typography),
29727
29886
  style: {
29728
29887
  minWidth: dims.minWidth,
29729
- fontSize: dims.fontSize,
29730
- lineHeight: `${dims.lineHeight}px`,
29731
29888
  color: disabled ? "var(--cmp-timepicker-text-disabled)" : hasValue ? "var(--cmp-timepicker-text-default)" : "var(--cmp-field-hint-color)"
29732
29889
  },
29733
29890
  children: hasValue ? displayText : placeholder