sellmate-design-system-react 9.0.0-beta.64 → 9.0.0-beta.65

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 (57) hide show
  1. package/AGENTS.md +28 -3
  2. package/dist/components/SBarChart/README.md +2 -0
  3. package/dist/components/SBarChart/SBarChart.d.ts +4 -0
  4. package/dist/components/SBarChart/barChart.config.d.ts +12 -5
  5. package/dist/components/SBarcodeInput/README.md +1 -0
  6. package/dist/components/SBarcodeInput/SBarcodeInput.d.ts +8 -1
  7. package/dist/components/SChipInput/README.md +1 -0
  8. package/dist/components/SChipInput/SChipInput.d.ts +8 -1
  9. package/dist/components/SContextAlert/README.md +51 -0
  10. package/dist/components/SContextAlert/SContextAlert.d.ts +38 -0
  11. package/dist/components/SContextAlert/contextAlert.config.d.ts +29 -0
  12. package/dist/components/SContextAlert/index.d.ts +2 -0
  13. package/dist/components/SDatePicker/README.md +1 -0
  14. package/dist/components/SDatePicker/SDatePicker.d.ts +9 -2
  15. package/dist/components/SDateRangePicker/README.md +1 -0
  16. package/dist/components/SDateRangePicker/SDateRangePicker.d.ts +9 -2
  17. package/dist/components/SDonutChart/README.md +2 -0
  18. package/dist/components/SDonutChart/SDonutChart.d.ts +4 -0
  19. package/dist/components/SEditor/README.md +1 -0
  20. package/dist/components/SEditor/SEditor.d.ts +8 -1
  21. package/dist/components/SField/README.md +7 -0
  22. package/dist/components/SField/SField.d.ts +13 -0
  23. package/dist/components/SField/index.d.ts +1 -1
  24. package/dist/components/SFilePicker/README.md +1 -0
  25. package/dist/components/SFilePicker/SFilePicker.d.ts +9 -2
  26. package/dist/components/SIcon/README.md +2 -0
  27. package/dist/components/SInput/README.md +1 -0
  28. package/dist/components/SInput/SInput.d.ts +3 -1
  29. package/dist/components/SLineChart/README.md +2 -0
  30. package/dist/components/SLineChart/SLineChart.d.ts +4 -0
  31. package/dist/components/SLineChart/lineChart.config.d.ts +42 -33
  32. package/dist/components/SNumberInput/README.md +1 -0
  33. package/dist/components/SNumberInput/SNumberInput.d.ts +8 -1
  34. package/dist/components/SPieChart/README.md +2 -0
  35. package/dist/components/SPieChart/SPieChart.d.ts +4 -0
  36. package/dist/components/SSelect/README.md +1 -0
  37. package/dist/components/SSelect/SSelect.d.ts +8 -1
  38. package/dist/components/STextarea/README.md +1 -0
  39. package/dist/components/STextarea/STextarea.d.ts +8 -1
  40. package/dist/components/STimePicker/README.md +1 -0
  41. package/dist/components/STimePicker/STimePicker.d.ts +9 -2
  42. package/dist/components/STimeRangePicker/README.md +1 -0
  43. package/dist/components/STimeRangePicker/STimeRangePicker.d.ts +9 -2
  44. package/dist/index.cjs +366 -168
  45. package/dist/index.cjs.map +1 -1
  46. package/dist/index.d.ts +1 -0
  47. package/dist/index.js +362 -169
  48. package/dist/index.js.map +1 -1
  49. package/dist/lib/chart/frame.d.ts +5 -1
  50. package/dist/lib/chart/palette.d.ts +12 -15
  51. package/dist/lib/chart/radial.d.ts +18 -10
  52. package/dist/llms-full.txt +106 -4
  53. package/dist/llms.txt +32 -6
  54. package/dist/styles.css +159 -15
  55. package/dist/theme.css +104 -6
  56. package/eslint/scale.gen.mjs +1 -1
  57. package/package.json +1 -1
package/dist/index.cjs CHANGED
@@ -4150,7 +4150,7 @@ function SFooter({
4150
4150
  {
4151
4151
  className: cn(
4152
4152
  "relative flex w-full flex-shrink-0 items-center justify-end gap-[var(--cmp-overlay-footer-gap)] overflow-hidden px-[var(--cmp-overlay-footer-paddingX)] py-[var(--cmp-overlay-footer-paddingY)]",
4153
- isGrey ? "bg-[var(--cmp-overlay-footer-bg-neutral)] border-t border-solid border-[color:var(--sys-color-border-default)]" : "bg-[var(--cmp-overlay-footer-bg-default)] shadow-[var(--shadow-spread-md)]",
4153
+ isGrey ? "bg-[var(--cmp-overlay-footer-bg-neutral)] border-t border-solid border-[color:var(--sys-color-border-default)]" : "bg-[var(--cmp-overlay-footer-bg-default)] shadow-[var(--cmp-overlay-footer-shadow)]",
4154
4154
  className
4155
4155
  ),
4156
4156
  style,
@@ -4739,6 +4739,7 @@ var SField = /* @__PURE__ */ react.forwardRef(function SField2({
4739
4739
  iconColor,
4740
4740
  labelTooltip = "",
4741
4741
  labelTooltipProps,
4742
+ labelPosition = "left",
4742
4743
  labelWidth,
4743
4744
  labelHeight,
4744
4745
  size = "sm",
@@ -4781,6 +4782,7 @@ var SField = /* @__PURE__ */ react.forwardRef(function SField2({
4781
4782
  []
4782
4783
  );
4783
4784
  const s = FIELD_SIZE[size];
4785
+ const labelOnTop = labelPosition === "top";
4784
4786
  if (label !== "" && addonLabel !== "" && typeof console !== "undefined") {
4785
4787
  console.warn(
4786
4788
  "[SField] label \uACFC addonLabel \uC740 \uD568\uAED8 \uC0AC\uC6A9\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. addonLabel \uC744 \uBB34\uC2DC\uD569\uB2C8\uB2E4."
@@ -4819,103 +4821,120 @@ var SField = /* @__PURE__ */ react.forwardRef(function SField2({
4819
4821
  style,
4820
4822
  onMouseEnter,
4821
4823
  onMouseLeave,
4822
- children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex w-full items-start", children: [
4823
- label !== "" && /* @__PURE__ */ jsxRuntime.jsxs(
4824
- "div",
4825
- {
4826
- className: "flex shrink-0 items-center font-bold text-(--sys-color-field-text-default)",
4827
- style: {
4828
- height: cssLen(labelHeight) ?? s.height,
4829
- marginRight: s.fieldGap,
4830
- width: cssLen(labelWidth),
4831
- fontSize: s.fontSize,
4832
- lineHeight: `${s.lineHeight}px`
4833
- },
4834
- children: [
4835
- icon && /* @__PURE__ */ jsxRuntime.jsx(
4836
- SIcon,
4837
- {
4838
- name: icon,
4839
- size: s.icon,
4840
- color: iconColor,
4841
- style: { marginRight: s.labelGap }
4842
- }
4843
- ),
4844
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "min-w-0 overflow-hidden text-ellipsis whitespace-nowrap", children: label }),
4845
- (labelTooltip !== "" || labelTooltipProps) && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "shrink-0 flex items-center", style: { marginLeft: s.labelGap }, children: /* @__PURE__ */ jsxRuntime.jsx(
4846
- STooltip2,
4847
- {
4848
- message: labelTooltip !== "" ? [labelTooltip] : void 0,
4849
- iconSize: s.icon,
4850
- ...labelTooltipProps
4851
- }
4852
- ) })
4853
- ]
4854
- }
4855
- ),
4856
- /* @__PURE__ */ jsxRuntime.jsxs(
4857
- "div",
4858
- {
4859
- className: cn("flex min-w-0 flex-col", !hug && !isPercentWidth && "flex-1"),
4860
- style: {
4861
- width: resolvedWidth,
4862
- minWidth: fieldWidthValue(minWidth),
4863
- maxWidth: resolvedMaxWidth
4864
- },
4865
- children: [
4866
- /* @__PURE__ */ jsxRuntime.jsxs(
4867
- "div",
4868
- {
4869
- className: cn(
4870
- "relative box-border flex min-w-0 items-stretch border border-solid border-(--field-bc)",
4871
- // 둘 다 넘친 것을 잘라 내지만 clip 은 스크롤 상자를 만들지 않는다. hidden 이면
4872
- // 이 상자가 스크롤포트가 되어 안쪽의 position:sticky 가 페이지 스크롤을 따라가지
4873
- // 못한다 (SEditor 의 고정 툴바). 여러 줄 필드에서만 바꿔 파급을 좁힌다.
4874
- multiline ? "overflow-clip" : "overflow-hidden",
4875
- interactive && !borderless && "hover:border-(--sys-color-field-border-focus) hover:shadow-[0px_0px_4px_0px_#0071ff66] focus-within:border-(--sys-color-field-border-focus) focus-within:shadow-[0px_0px_4px_0px_#0071ff66]",
4876
- disabled && "cursor-not-allowed"
4877
- ),
4878
- style: {
4879
- // @ts-expect-error CSS 변수
4880
- "--field-bc": borderColor,
4881
- // focused/hovered prop이 명시된 경우 강조를 즉시 반영
4882
- ...interactive && !borderless && (focused || hovered) ? { boxShadow: FOCUS_RING_SHADOW } : {},
4883
- ...multiline ? { minHeight: s.height } : { height: s.height },
4884
- "borderRadius": s.radius,
4885
- "background": bgColor,
4886
- "color": textColor
4824
+ children: /* @__PURE__ */ jsxRuntime.jsxs(
4825
+ "div",
4826
+ {
4827
+ className: cn(
4828
+ "flex w-full",
4829
+ labelOnTop ? "flex-col gap-(--sys-space-field-vertical-gap)" : "items-start"
4830
+ ),
4831
+ children: [
4832
+ label !== "" && /* @__PURE__ */ jsxRuntime.jsxs(
4833
+ "div",
4834
+ {
4835
+ className: "flex shrink-0 items-center font-bold text-(--sys-color-field-text-default)",
4836
+ style: {
4837
+ // 위에 선 라벨은 제 글줄 높이만 차지한다 — 컨트롤 높이에 맞춰 늘리면
4838
+ // 라벨과 컨트롤 사이가 간격 토큰보다 넓어진다. 줄 세우기용 labelWidth 도
4839
+ // 뜻이 없다(아래에 컨트롤이 제 폭으로 선다).
4840
+ ...labelOnTop ? {} : {
4841
+ height: cssLen(labelHeight) ?? s.height,
4842
+ marginRight: s.fieldGap,
4843
+ width: cssLen(labelWidth)
4887
4844
  },
4888
- "data-focused": focused || void 0,
4889
- "data-hovered": hovered || void 0,
4890
- children: [
4891
- effectiveAddonLabel !== "" && /* @__PURE__ */ jsxRuntime.jsxs(
4892
- "div",
4893
- {
4894
- 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",
4895
- style: {
4896
- // 원본 sd-field: labelWidth가 addon 폭(--sd-field-addon-width)에도 적용됨
4897
- width: cssLen(labelWidth),
4898
- justifyContent: ALIGN[addonAlign],
4899
- background: "var(--cmp-field-addonLabel-bg)",
4900
- borderRightColor: disabled ? "var(--cmp-field-addonLabel-border-disabled)" : "var(--cmp-field-addonLabel-border-default)",
4901
- borderTopLeftRadius: s.radius - 1,
4902
- borderBottomLeftRadius: s.radius - 1
4903
- },
4904
- children: [
4905
- icon && !label && /* @__PURE__ */ jsxRuntime.jsx(SIcon, { name: icon, size: s.icon, color: iconColor }),
4906
- effectiveAddonLabel
4907
- ]
4908
- }
4909
- ),
4910
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("flex min-w-0 flex-1", multiline && "bg-inherit"), children })
4911
- ]
4912
- }
4913
- ),
4914
- 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
4915
- ]
4916
- }
4917
- )
4918
- ] })
4845
+ fontSize: s.fontSize,
4846
+ lineHeight: `${s.lineHeight}px`
4847
+ },
4848
+ children: [
4849
+ icon && /* @__PURE__ */ jsxRuntime.jsx(
4850
+ SIcon,
4851
+ {
4852
+ name: icon,
4853
+ size: s.icon,
4854
+ color: iconColor,
4855
+ style: { marginRight: s.labelGap }
4856
+ }
4857
+ ),
4858
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "min-w-0 overflow-hidden text-ellipsis whitespace-nowrap", children: label }),
4859
+ (labelTooltip !== "" || labelTooltipProps) && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "shrink-0 flex items-center", style: { marginLeft: s.labelGap }, children: /* @__PURE__ */ jsxRuntime.jsx(
4860
+ STooltip2,
4861
+ {
4862
+ message: labelTooltip !== "" ? [labelTooltip] : void 0,
4863
+ iconSize: s.icon,
4864
+ ...labelTooltipProps
4865
+ }
4866
+ ) })
4867
+ ]
4868
+ }
4869
+ ),
4870
+ /* @__PURE__ */ jsxRuntime.jsxs(
4871
+ "div",
4872
+ {
4873
+ className: cn(
4874
+ "flex min-w-0 flex-col",
4875
+ !labelOnTop && !hug && !isPercentWidth && "flex-1"
4876
+ ),
4877
+ style: {
4878
+ width: resolvedWidth,
4879
+ minWidth: fieldWidthValue(minWidth),
4880
+ maxWidth: resolvedMaxWidth
4881
+ },
4882
+ children: [
4883
+ /* @__PURE__ */ jsxRuntime.jsxs(
4884
+ "div",
4885
+ {
4886
+ className: cn(
4887
+ "relative box-border flex min-w-0 items-stretch border border-solid border-(--field-bc)",
4888
+ // 둘 다 넘친 것을 잘라 내지만 clip 은 스크롤 상자를 만들지 않는다. hidden 이면
4889
+ // 이 상자가 스크롤포트가 되어 안쪽의 position:sticky 가 페이지 스크롤을 따라가지
4890
+ // 못한다 (SEditor 의 고정 툴바). 여러 줄 필드에서만 바꿔 파급을 좁힌다.
4891
+ multiline ? "overflow-clip" : "overflow-hidden",
4892
+ interactive && !borderless && "hover:border-(--sys-color-field-border-focus) hover:shadow-[0px_0px_4px_0px_#0071ff66] focus-within:border-(--sys-color-field-border-focus) focus-within:shadow-[0px_0px_4px_0px_#0071ff66]",
4893
+ disabled && "cursor-not-allowed"
4894
+ ),
4895
+ style: {
4896
+ // @ts-expect-error CSS 변수
4897
+ "--field-bc": borderColor,
4898
+ // focused/hovered prop이 명시된 경우 강조를 즉시 반영
4899
+ ...interactive && !borderless && (focused || hovered) ? { boxShadow: FOCUS_RING_SHADOW } : {},
4900
+ ...multiline ? { minHeight: s.height } : { height: s.height },
4901
+ "borderRadius": s.radius,
4902
+ "background": bgColor,
4903
+ "color": textColor
4904
+ },
4905
+ "data-focused": focused || void 0,
4906
+ "data-hovered": hovered || void 0,
4907
+ children: [
4908
+ effectiveAddonLabel !== "" && /* @__PURE__ */ jsxRuntime.jsxs(
4909
+ "div",
4910
+ {
4911
+ 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",
4912
+ style: {
4913
+ // 원본 sd-field: labelWidth가 addon 폭(--sd-field-addon-width)에도 적용됨
4914
+ width: cssLen(labelWidth),
4915
+ justifyContent: ALIGN[addonAlign],
4916
+ background: "var(--cmp-field-addonLabel-bg)",
4917
+ borderRightColor: disabled ? "var(--cmp-field-addonLabel-border-disabled)" : "var(--cmp-field-addonLabel-border-default)",
4918
+ borderTopLeftRadius: s.radius - 1,
4919
+ borderBottomLeftRadius: s.radius - 1
4920
+ },
4921
+ children: [
4922
+ icon && !label && /* @__PURE__ */ jsxRuntime.jsx(SIcon, { name: icon, size: s.icon, color: iconColor }),
4923
+ effectiveAddonLabel
4924
+ ]
4925
+ }
4926
+ ),
4927
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("flex min-w-0 flex-1", multiline && "bg-inherit"), children })
4928
+ ]
4929
+ }
4930
+ ),
4931
+ 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
4932
+ ]
4933
+ }
4934
+ )
4935
+ ]
4936
+ }
4937
+ )
4919
4938
  }
4920
4939
  );
4921
4940
  });
@@ -4952,6 +4971,7 @@ var STextarea = /* @__PURE__ */ react.forwardRef(function STextarea2({
4952
4971
  textareaClassName,
4953
4972
  textareaStyle,
4954
4973
  label,
4974
+ labelPosition,
4955
4975
  labelWidth,
4956
4976
  icon,
4957
4977
  iconColor,
@@ -5011,6 +5031,7 @@ var STextarea = /* @__PURE__ */ react.forwardRef(function STextarea2({
5011
5031
  SField,
5012
5032
  {
5013
5033
  label,
5034
+ labelPosition,
5014
5035
  labelWidth,
5015
5036
  icon,
5016
5037
  iconColor,
@@ -6978,7 +6999,7 @@ function TreeConnector({
6978
6999
  className: cn(
6979
7000
  "absolute left-[6px] h-px bg-(--cmp-tree-connector-line-color)",
6980
7001
  branchTop,
6981
- hasChildren ? "w-[14px]" : "w-[calc(14px+var(--cmp-tree-item-arrow-icon))]"
7002
+ hasChildren ? "w-[14px]" : "w-[calc(14px+var(--cmp-ghostButton-xxs-size))]"
6982
7003
  )
6983
7004
  }
6984
7005
  )
@@ -7131,7 +7152,12 @@ var STreeItemImpl = /* @__PURE__ */ react.forwardRef(function STreeItem({
7131
7152
  onToggle?.(node, event);
7132
7153
  }
7133
7154
  }
7134
- ) : /* @__PURE__ */ jsxRuntime.jsx("span", { className: "size-(--cmp-tree-item-arrow-icon) shrink-0", "aria-hidden": "true" }),
7155
+ ) : (
7156
+ // 자식이 없는 줄은 펼침 버튼 자리를 빈 칸으로 남겨 라벨의 시작점을 맞춘다.
7157
+ // 크기는 자리를 대신하는 그 버튼(`SGhostButton size="xxs"`)의 토큰을 그대로 쓴다 —
7158
+ // 버튼 크기가 바뀌면 빈 칸도 같이 따라가야 줄이 어긋나지 않는다.
7159
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "size-(--cmp-ghostButton-xxs-size) shrink-0", "aria-hidden": "true" })
7160
+ ),
7135
7161
  leadingNode,
7136
7162
  selectable && /* @__PURE__ */ jsxRuntime.jsx(
7137
7163
  "span",
@@ -8074,6 +8100,96 @@ var SCallout = /* @__PURE__ */ react.forwardRef(function SCallout2({ type = "def
8074
8100
  }
8075
8101
  );
8076
8102
  });
8103
+
8104
+ // src/components/SContextAlert/contextAlert.config.ts
8105
+ var CONTEXT_ALERT_INTENTS = [
8106
+ "default",
8107
+ "danger",
8108
+ "warning",
8109
+ "success",
8110
+ "accent",
8111
+ "discovery"
8112
+ ];
8113
+ var CONTEXT_ALERT_SURFACE = {
8114
+ default: {
8115
+ bg: "var(--cmp-contextAlert-default-bg)",
8116
+ border: "var(--cmp-contextAlert-default-border)"
8117
+ },
8118
+ danger: {
8119
+ bg: "var(--cmp-contextAlert-danger-bg)",
8120
+ border: "var(--cmp-contextAlert-danger-border)"
8121
+ },
8122
+ warning: {
8123
+ bg: "var(--cmp-contextAlert-warning-bg)",
8124
+ border: "var(--cmp-contextAlert-warning-border)"
8125
+ },
8126
+ success: {
8127
+ bg: "var(--cmp-contextAlert-success-bg)",
8128
+ border: "var(--cmp-contextAlert-success-border)"
8129
+ },
8130
+ accent: {
8131
+ bg: "var(--cmp-contextAlert-accent-bg)",
8132
+ border: "var(--cmp-contextAlert-accent-border)"
8133
+ },
8134
+ discovery: {
8135
+ bg: "var(--cmp-contextAlert-discovery-bg)",
8136
+ border: "var(--cmp-contextAlert-discovery-border)"
8137
+ }
8138
+ };
8139
+ var CONTEXT_ALERT_DEFAULT_ICON = "notificationOutline";
8140
+ var CONTEXT_ALERT_ICON_COLOR = "var(--sys-color-fg-tertiary)";
8141
+ var SContextAlert = /* @__PURE__ */ react.forwardRef(function SContextAlert2({
8142
+ intent = "default",
8143
+ messages = [],
8144
+ icon = CONTEXT_ALERT_DEFAULT_ICON,
8145
+ action: action2,
8146
+ className,
8147
+ style
8148
+ }, ref) {
8149
+ const surface = CONTEXT_ALERT_SURFACE[intent];
8150
+ const vars = {
8151
+ "--ca-bg": surface.bg,
8152
+ "--ca-border": surface.border
8153
+ };
8154
+ return /* @__PURE__ */ jsxRuntime.jsxs(
8155
+ "div",
8156
+ {
8157
+ ref,
8158
+ role: "note",
8159
+ className: cn(
8160
+ "flex w-full items-center gap-[var(--cmp-contextAlert-gap)]",
8161
+ "rounded-[var(--cmp-contextAlert-radius)] border-[length:var(--cmp-contextAlert-border-width)] border-solid",
8162
+ "px-[var(--cmp-contextAlert-paddingX)] py-[var(--cmp-contextAlert-paddingY)]",
8163
+ "border-[color:var(--ca-border)] bg-[var(--ca-bg)]",
8164
+ className
8165
+ ),
8166
+ style: { ...vars, ...style },
8167
+ children: [
8168
+ /* @__PURE__ */ jsxRuntime.jsx(
8169
+ SIcon,
8170
+ {
8171
+ name: icon,
8172
+ size: "var(--cmp-contextAlert-icon)",
8173
+ color: CONTEXT_ALERT_ICON_COLOR,
8174
+ className: "shrink-0"
8175
+ }
8176
+ ),
8177
+ /* @__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) => (
8178
+ // 메시지는 HTML 문자열을 허용하되, sanitizeInlineHtml 로 살균 후 innerHTML 렌더 (XSS 방어)
8179
+ /* @__PURE__ */ jsxRuntime.jsx(
8180
+ "p",
8181
+ {
8182
+ className: "m-0 break-keep break-words text-pretty",
8183
+ dangerouslySetInnerHTML: { __html: sanitizeInlineHtml(m) }
8184
+ },
8185
+ `${i}-${m}`
8186
+ )
8187
+ )) }),
8188
+ action2 != null && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex shrink-0 items-center", children: action2 })
8189
+ ]
8190
+ }
8191
+ );
8192
+ });
8077
8193
  var FILL_COLOR = {
8078
8194
  primary: "var(--cmp-progress-color-active)",
8079
8195
  error: "var(--cmp-progress-color-error)",
@@ -10072,7 +10188,7 @@ function SConfirmModal({
10072
10188
  }
10073
10189
  )
10074
10190
  ] }),
10075
- hasBody && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col items-center gap-[20px] text-center text-[12px] font-normal leading-[20px] text-[color:var(--cmp-modal-confirm-message-color)] w-full", children: [
10191
+ hasBody && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "typo-feedback-md-regular flex w-full flex-col items-center gap-[20px] text-center text-[color:var(--cmp-modal-confirm-message-color)]", children: [
10076
10192
  topMessage.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-col gap-[2px]", children: topMessage.map((m, i) => /* @__PURE__ */ jsxRuntime.jsx(
10077
10193
  "p",
10078
10194
  {
@@ -10258,7 +10374,7 @@ function SLoadingModal({
10258
10374
  lines.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-col gap-[2px]", children: lines.map((m, i) => /* @__PURE__ */ jsxRuntime.jsx(
10259
10375
  "p",
10260
10376
  {
10261
- className: "m-0 max-w-[400px] break-keep text-center text-[12px] font-normal leading-[20px] text-[color:var(--cmp-modal-loading-message-color)]",
10377
+ className: "typo-feedback-md-regular m-0 max-w-[400px] break-keep text-center text-[color:var(--cmp-modal-loading-message-color)]",
10262
10378
  children: m
10263
10379
  },
10264
10380
  i
@@ -12013,7 +12129,7 @@ var SGnb = /* @__PURE__ */ react.forwardRef(function SGnb2({
12013
12129
  viewportPadding: 8,
12014
12130
  ariaLabel: GNB_LAUNCHER_LABEL,
12015
12131
  onOpenAutoFocus: (event) => event.preventDefault(),
12016
- className: "w-auto rounded-(--cmp-gnb-launcher-listBox-radius) bg-(--cmp-gnb-launcher-listBox-bg) shadow-floating",
12132
+ className: "w-auto rounded-(--cmp-gnb-launcher-listBox-radius) bg-(--cmp-gnb-launcher-listBox-bg) shadow-(--cmp-gnb-launcher-listBox-shadow)",
12017
12133
  children: /* @__PURE__ */ jsxRuntime.jsx(
12018
12134
  SLauncherListBox,
12019
12135
  {
@@ -14761,6 +14877,7 @@ var SSelectImpl = /* @__PURE__ */ react.forwardRef(function SSelect({
14761
14877
  onSearchChange,
14762
14878
  searchDebounce = DEFAULT_SEARCH_DEBOUNCE,
14763
14879
  label,
14880
+ labelPosition,
14764
14881
  labelWidth,
14765
14882
  icon,
14766
14883
  iconColor,
@@ -15193,6 +15310,7 @@ var SSelectImpl = /* @__PURE__ */ react.forwardRef(function SSelect({
15193
15310
  SField,
15194
15311
  {
15195
15312
  label,
15313
+ labelPosition,
15196
15314
  labelWidth,
15197
15315
  icon,
15198
15316
  iconColor,
@@ -16923,6 +17041,7 @@ var SInput = /* @__PURE__ */ react.forwardRef(function SInput2({
16923
17041
  inputClassName,
16924
17042
  inputStyle,
16925
17043
  label,
17044
+ labelPosition,
16926
17045
  labelWidth,
16927
17046
  labelTooltip,
16928
17047
  labelTooltipProps,
@@ -16966,6 +17085,7 @@ var SInput = /* @__PURE__ */ react.forwardRef(function SInput2({
16966
17085
  SField,
16967
17086
  {
16968
17087
  label,
17088
+ labelPosition,
16969
17089
  labelWidth,
16970
17090
  labelTooltip,
16971
17091
  labelTooltipProps,
@@ -17156,6 +17276,7 @@ var SNumberInput = /* @__PURE__ */ react.forwardRef(function SNumberInput2({
17156
17276
  focused,
17157
17277
  hovered,
17158
17278
  label,
17279
+ labelPosition,
17159
17280
  labelWidth,
17160
17281
  icon,
17161
17282
  iconColor,
@@ -17325,6 +17446,7 @@ var SNumberInput = /* @__PURE__ */ react.forwardRef(function SNumberInput2({
17325
17446
  SField,
17326
17447
  {
17327
17448
  label,
17449
+ labelPosition,
17328
17450
  labelWidth,
17329
17451
  icon,
17330
17452
  iconColor,
@@ -17612,7 +17734,7 @@ function SCalendar({
17612
17734
  if (e !== "" && date > e) return true;
17613
17735
  return false;
17614
17736
  };
17615
- const pick = (date) => {
17737
+ const pick2 = (date) => {
17616
17738
  if (!isDisabled(date)) onValueChange?.(date);
17617
17739
  };
17618
17740
  return /* @__PURE__ */ jsxRuntime.jsxs(
@@ -17697,7 +17819,7 @@ function SCalendar({
17697
17819
  {
17698
17820
  type: "button",
17699
17821
  disabled: !cell.inCurrentMonth || disabled,
17700
- onClick: () => cell.inCurrentMonth && pick(cell.date),
17822
+ onClick: () => cell.inCurrentMonth && pick2(cell.date),
17701
17823
  className: cn(
17702
17824
  "flex min-h-[var(--cmp-datepicker-calendar-day-circle-size)] w-[var(--cmp-datepicker-calendar-day-width)] flex-col items-center justify-start border-none bg-transparent p-0",
17703
17825
  !cell.inCurrentMonth ? "invisible pointer-events-none" : disabled ? "cursor-not-allowed" : "cursor-pointer"
@@ -18043,6 +18165,7 @@ function SDatePicker({
18043
18165
  rules,
18044
18166
  status,
18045
18167
  label,
18168
+ labelPosition,
18046
18169
  labelWidth,
18047
18170
  icon,
18048
18171
  iconColor,
@@ -18115,6 +18238,7 @@ function SDatePicker({
18115
18238
  SField,
18116
18239
  {
18117
18240
  label,
18241
+ labelPosition,
18118
18242
  labelWidth,
18119
18243
  icon,
18120
18244
  iconColor,
@@ -18577,6 +18701,7 @@ function SDateRangePicker({
18577
18701
  rules,
18578
18702
  status,
18579
18703
  label,
18704
+ labelPosition,
18580
18705
  labelWidth,
18581
18706
  icon,
18582
18707
  iconColor,
@@ -18649,6 +18774,7 @@ function SDateRangePicker({
18649
18774
  SField,
18650
18775
  {
18651
18776
  label,
18777
+ labelPosition,
18652
18778
  labelWidth,
18653
18779
  icon,
18654
18780
  iconColor,
@@ -18953,6 +19079,7 @@ function SFilePicker({
18953
19079
  status,
18954
19080
  size = "sm",
18955
19081
  label,
19082
+ labelPosition,
18956
19083
  labelWidth,
18957
19084
  icon,
18958
19085
  iconColor,
@@ -19137,6 +19264,7 @@ function SFilePicker({
19137
19264
  {
19138
19265
  borderless: inline,
19139
19266
  label,
19267
+ labelPosition,
19140
19268
  labelWidth,
19141
19269
  icon,
19142
19270
  iconColor,
@@ -19402,7 +19530,7 @@ function ChartGrid({ scale, direction, width, height }) {
19402
19530
  return /* @__PURE__ */ jsxRuntime.jsx("g", { "aria-hidden": true, children: scale.ticks.map((tick) => {
19403
19531
  const ratio = ratioOf(tick, scale);
19404
19532
  const isBaseline = tick === 0;
19405
- const color = isBaseline ? "var(--cmp-chart-baseline-color)" : "var(--cmp-chart-grid-line-color)";
19533
+ const color = isBaseline ? "var(--cmp-chart-baseline-color)" : "var(--cmp-chart-gridline-color)";
19406
19534
  const position = vertical ? height - ratio * height : ratio * width;
19407
19535
  const extent = vertical ? height : width;
19408
19536
  const snapped = Math.min(Math.max(Math.round(position), 0), Math.max(0, extent - 1)) + 0.5;
@@ -19480,7 +19608,7 @@ function ChartAxisLabels({
19480
19608
  }
19481
19609
  );
19482
19610
  }
19483
- var ChartFrame = /* @__PURE__ */ react.forwardRef(function ChartFrame2({ legend, legendPosition = "top", children, className, style, ...props }, ref) {
19611
+ var ChartFrame = /* @__PURE__ */ react.forwardRef(function ChartFrame2({ title, unit, legend, legendPosition = "top", children, className, style, ...props }, ref) {
19484
19612
  return /* @__PURE__ */ jsxRuntime.jsxs(
19485
19613
  "div",
19486
19614
  {
@@ -19493,6 +19621,14 @@ var ChartFrame = /* @__PURE__ */ react.forwardRef(function ChartFrame2({ legend,
19493
19621
  style,
19494
19622
  ...props,
19495
19623
  children: [
19624
+ (title || unit) && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-(--cmp-chart-gap)", children: [
19625
+ title && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "typo-body-md-medium text-(--cmp-chart-title-color)", children: title }),
19626
+ unit && // ml-auto — title 유무와 관계없이 항상 오른쪽 끝에 붙는다.
19627
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "ml-auto whitespace-nowrap typo-body-sm-default text-(--cmp-chart-unit-color)", children: [
19628
+ "\uB2E8\uC704 : ",
19629
+ unit
19630
+ ] })
19631
+ ] }),
19496
19632
  legend && legendPosition === "top" && legend,
19497
19633
  children,
19498
19634
  legend && legendPosition === "bottom" && legend
@@ -19543,46 +19679,57 @@ function ChartLegend({ items, align = "center", activeIndex, className }) {
19543
19679
 
19544
19680
  // src/lib/chart/palette.ts
19545
19681
  var V3 = (path) => `var(--cmp-chart-palette-${path})`;
19546
- var CHART_COLORS = {
19547
- positivePrimary: V3("variation-positivePrimary"),
19548
- positiveSecondary: V3("variation-positiveSecondary"),
19549
- negativePrimary: V3("variation-negativePrimary"),
19550
- negativeSecondary: V3("variation-negativeSecondary"),
19551
- neutralPrimary: V3("variation-neutralPrimary"),
19552
- neutralSecondary: V3("variation-neutralSecondary")
19553
- };
19554
- var CHART_PALETTES = {
19555
- default: [V3("single")],
19682
+ var DIMMED = (path) => `var(--cmp-chart-line-point-dimmed-palette-${path})`;
19683
+ var colorsOf = (v) => ({
19684
+ positivePrimary: v("variation-positivePrimary"),
19685
+ positiveSecondary: v("variation-positiveSecondary"),
19686
+ negativePrimary: v("variation-negativePrimary"),
19687
+ negativeSecondary: v("variation-negativeSecondary"),
19688
+ neutralPrimary: v("variation-neutralPrimary"),
19689
+ neutralSecondary: v("variation-neutralSecondary")
19690
+ });
19691
+ var palettesOf = (v) => ({
19692
+ default: [v("single")],
19556
19693
  multi: [
19557
- V3("multi-blue"),
19558
- V3("multi-skyblue"),
19559
- V3("multi-yellow"),
19560
- V3("multi-olive"),
19561
- V3("multi-lightRed"),
19562
- V3("multi-warmBlue"),
19563
- V3("multi-orange"),
19564
- V3("multi-green"),
19565
- V3("multi-navy"),
19566
- V3("multi-grey"),
19567
- V3("multi-red")
19694
+ v("multi-blue"),
19695
+ v("multi-skyblue"),
19696
+ v("multi-yellow"),
19697
+ v("multi-olive"),
19698
+ v("multi-lightRed"),
19699
+ v("multi-warmBlue"),
19700
+ v("multi-orange"),
19701
+ v("multi-green"),
19702
+ v("multi-navy"),
19703
+ v("multi-grey"),
19704
+ v("multi-red")
19568
19705
  ],
19569
19706
  gradation: [
19570
- V3("gradation-1"),
19571
- V3("gradation-2"),
19572
- V3("gradation-3"),
19573
- V3("gradation-4"),
19574
- V3("gradation-5"),
19575
- V3("gradation-6")
19707
+ v("gradation-1"),
19708
+ v("gradation-2"),
19709
+ v("gradation-3"),
19710
+ v("gradation-4"),
19711
+ v("gradation-5"),
19712
+ v("gradation-6")
19576
19713
  ]
19577
- };
19578
- function paletteColor(palette, index, colors) {
19714
+ });
19715
+ var CHART_COLORS = colorsOf(V3);
19716
+ var CHART_PALETTES = palettesOf(V3);
19717
+ var DIMMED_COLORS = colorsOf(DIMMED);
19718
+ var DIMMED_PALETTES = palettesOf(DIMMED);
19719
+ function pick(names, palettes, palette, index, colors) {
19579
19720
  if (palette === "custom") {
19580
- if (!colors?.length) return CHART_PALETTES.default[0];
19581
- return CHART_COLORS[colors[index % colors.length]];
19721
+ if (!colors?.length) return palettes.default[0];
19722
+ return names[colors[index % colors.length]];
19582
19723
  }
19583
- const list = CHART_PALETTES[palette] ?? CHART_PALETTES.default;
19724
+ const list = palettes[palette] ?? palettes.default;
19584
19725
  return list[index % list.length];
19585
19726
  }
19727
+ function paletteColor(palette, index, colors) {
19728
+ return pick(CHART_COLORS, CHART_PALETTES, palette, index, colors);
19729
+ }
19730
+ function linePointDimmedColor(palette, index, colors) {
19731
+ return pick(DIMMED_COLORS, DIMMED_PALETTES, palette, index, colors);
19732
+ }
19586
19733
  function useElementSize() {
19587
19734
  const ref = react.useRef(null);
19588
19735
  const [size, setSize] = react.useState({ width: 0, height: 0 });
@@ -19660,7 +19807,8 @@ function ChartTooltip({
19660
19807
  "pointer-events-none absolute top-0 left-0 z-10 w-max",
19661
19808
  "flex flex-col gap-(--cmp-chart-chartTooltip-gap)",
19662
19809
  "px-(--cmp-chart-chartTooltip-paddingX) py-(--cmp-chart-chartTooltip-paddingY)",
19663
- "rounded-(--cmp-chart-chartTooltip-radius) bg-(--cmp-chart-chartTooltip-bg) shadow-floating",
19810
+ "rounded-(--cmp-chart-chartTooltip-radius) bg-(--cmp-chart-chartTooltip-bg)",
19811
+ "shadow-(--cmp-chart-chartTooltip-shadow)",
19664
19812
  className
19665
19813
  ),
19666
19814
  style: {
@@ -19707,12 +19855,12 @@ var BAR_SIZE_MAX = 80;
19707
19855
  var BAR_GAP = 6;
19708
19856
  var GROUP_PADDING_MIN = 8;
19709
19857
  var GROUP_PADDING_MAX = 24;
19710
- var VALUE_LABEL_GAP = 6;
19858
+ var VALUE_LABEL_GAP = 4;
19711
19859
  var BAR_RADIUS = 8;
19712
- var BAR_OPACITY_DEFAULT = "var(--cmp-chart-bar-opacity-default)";
19860
+ var BAR_OPACITY_DEFAULT = "var(--cmp-chart-opacity-default)";
19713
19861
  var BAR_OPACITY_DIMMED = "var(--cmp-chart-bar-opacity-dimmed)";
19714
19862
  var BAR_OPACITY_HOVER = 1;
19715
- var BAR_DATA_LABEL_COLOR = "var(--cmp-chart-bar-dataLabel-color-default)";
19863
+ var BAR_DATA_LABEL_COLOR = "var(--cmp-chart-dataLabel-color-default)";
19716
19864
  var BAR_DATA_LABEL_TYPO = "typo-body-sm-medium";
19717
19865
  var BAR_DATA_LABEL_TYPO_HOVER = "typo-body-md-bold";
19718
19866
  var BAR_HOVER_TRANSITION = "transition-opacity duration-200 ease-out motion-reduce:transition-none";
@@ -19772,6 +19920,8 @@ function barPath(x, y, width, height, direction, negative) {
19772
19920
  var SBarChart = /* @__PURE__ */ react.forwardRef(function SBarChart2({
19773
19921
  categories,
19774
19922
  series,
19923
+ title,
19924
+ unit,
19775
19925
  direction = "vertical",
19776
19926
  stacked = false,
19777
19927
  palette = "default",
@@ -20237,6 +20387,8 @@ var SBarChart = /* @__PURE__ */ react.forwardRef(function SBarChart2({
20237
20387
  ChartFrame,
20238
20388
  {
20239
20389
  ref,
20390
+ title,
20391
+ unit,
20240
20392
  legend,
20241
20393
  legendPosition,
20242
20394
  className,
@@ -20277,18 +20429,18 @@ var SBarChart = /* @__PURE__ */ react.forwardRef(function SBarChart2({
20277
20429
  });
20278
20430
 
20279
20431
  // src/components/SLineChart/lineChart.config.ts
20280
- var LINE_WIDTH = 2;
20281
- var POINT_RADIUS = 4;
20282
- var POINT_HOVER_RADIUS = 9.5;
20283
- var POINT_HOVER_BORDER_WIDTH = 1;
20284
- var POINT_HOVER_INNER_RADIUS = 5;
20285
- var POINT_HOVER_BG = "var(--cmp-chart-bg)";
20286
- var POINT_HOVER_EXTENT = POINT_HOVER_RADIUS + POINT_HOVER_BORDER_WIDTH / 2;
20432
+ var LINE_WIDTH = "var(--cmp-chart-line-width)";
20433
+ var LINE_OPACITY = "var(--cmp-chart-line-opacity)";
20434
+ var POINT_RADIUS = 5;
20435
+ var POINT_HOVER_RADIUS = 6;
20436
+ var POINT_HALO_RADIUS = 12;
20437
+ var POINT_HALO_OPACITY = "var(--cmp-chart-line-point-opacity-bg)";
20438
+ var POINT_HOVER_EXTENT = POINT_HALO_RADIUS;
20287
20439
  var BAND_MIN = 40;
20288
- var VALUE_LABEL_GAP2 = 6;
20289
- var AREA_OPACITY_TOP = "30%";
20290
- var AREA_OPACITY_BOTTOM = "var(--opacity-005)";
20291
- var LINE_DATA_LABEL_COLOR = "var(--cmp-chart-bar-dataLabel-color-default)";
20440
+ var VALUE_LABEL_GAP2 = 4;
20441
+ var AREA_OPACITY_TOP = "var(--cmp-chart-line-area-gradation-start)";
20442
+ var AREA_OPACITY_BOTTOM = "var(--cmp-chart-line-area-gradation-end)";
20443
+ var LINE_DATA_LABEL_COLOR = "var(--cmp-chart-dataLabel-color-default)";
20292
20444
  var LINE_DATA_LABEL_TYPO = "typo-body-sm-medium";
20293
20445
  var LINE_DATA_LABEL_TYPO_HOVER = "typo-body-md-bold";
20294
20446
  var r = (value) => Math.round(value * 100) / 100;
@@ -20368,6 +20520,8 @@ function runsOf(row) {
20368
20520
  var SLineChart = /* @__PURE__ */ react.forwardRef(function SLineChart2({
20369
20521
  categories,
20370
20522
  series,
20523
+ title,
20524
+ unit,
20371
20525
  curve = "linear",
20372
20526
  area = false,
20373
20527
  stacked = false,
@@ -20397,6 +20551,10 @@ var SLineChart = /* @__PURE__ */ react.forwardRef(function SLineChart2({
20397
20551
  (seriesIndex) => paletteColor(palette, seriesIndex, customColors),
20398
20552
  [palette, customColors]
20399
20553
  );
20554
+ const dimmedColorAt = react.useCallback(
20555
+ (seriesIndex) => linePointDimmedColor(palette, seriesIndex, customColors),
20556
+ [palette, customColors]
20557
+ );
20400
20558
  const rows = react.useMemo(() => {
20401
20559
  const running = categories.map(() => 0);
20402
20560
  return series.map(
@@ -20568,10 +20726,13 @@ var SLineChart = /* @__PURE__ */ react.forwardRef(function SLineChart2({
20568
20726
  "aria-hidden": true,
20569
20727
  d,
20570
20728
  fill: "none",
20571
- strokeWidth: LINE_WIDTH,
20572
20729
  strokeLinecap: "round",
20573
20730
  strokeLinejoin: "round",
20574
- style: { stroke: colorAt(seriesIndex) }
20731
+ style: {
20732
+ stroke: colorAt(seriesIndex),
20733
+ strokeWidth: LINE_WIDTH,
20734
+ strokeOpacity: LINE_OPACITY
20735
+ }
20575
20736
  },
20576
20737
  `line-${seriesIndex}-${runIndex}`
20577
20738
  );
@@ -20588,6 +20749,7 @@ var SLineChart = /* @__PURE__ */ react.forwardRef(function SLineChart2({
20588
20749
  const hovered = hoveredCategory === categoryIndex;
20589
20750
  if (!showPoint && !hovered) return;
20590
20751
  const color = colorAt(seriesIndex);
20752
+ const dimmed = hoveredCategory != null && !hovered;
20591
20753
  const key = `${seriesIndex}-${categoryIndex}`;
20592
20754
  if (hovered) {
20593
20755
  halos.push(
@@ -20597,12 +20759,8 @@ var SLineChart = /* @__PURE__ */ react.forwardRef(function SLineChart2({
20597
20759
  "aria-hidden": true,
20598
20760
  cx: point.x,
20599
20761
  cy: point.y,
20600
- r: POINT_HOVER_RADIUS,
20601
- style: {
20602
- fill: POINT_HOVER_BG,
20603
- stroke: color,
20604
- strokeWidth: POINT_HOVER_BORDER_WIDTH
20605
- }
20762
+ r: POINT_HALO_RADIUS,
20763
+ style: { fill: color, fillOpacity: POINT_HALO_OPACITY }
20606
20764
  },
20607
20765
  `halo-${key}`
20608
20766
  )
@@ -20614,8 +20772,11 @@ var SLineChart = /* @__PURE__ */ react.forwardRef(function SLineChart2({
20614
20772
  {
20615
20773
  cx: point.x,
20616
20774
  cy: point.y,
20617
- r: hovered ? POINT_HOVER_INNER_RADIUS : POINT_RADIUS,
20618
- style: { fill: color, cursor: onPointClick ? "pointer" : void 0 },
20775
+ r: hovered ? POINT_HOVER_RADIUS : POINT_RADIUS,
20776
+ style: {
20777
+ fill: dimmed ? dimmedColorAt(seriesIndex) : color,
20778
+ cursor: onPointClick ? "pointer" : void 0
20779
+ },
20619
20780
  onClick: onPointClick ? () => onPointClick({ seriesIndex, categoryIndex, value: point.own }) : void 0,
20620
20781
  children: /* @__PURE__ */ jsxRuntime.jsx("title", { children: `${categories[categoryIndex]} ${series[seriesIndex]?.name ?? ""} ${formatValue(point.own)}` })
20621
20782
  },
@@ -20625,7 +20786,17 @@ var SLineChart = /* @__PURE__ */ react.forwardRef(function SLineChart2({
20625
20786
  });
20626
20787
  });
20627
20788
  return { pointHalos: halos, pointDots: dots };
20628
- }, [plotted, showPoint, hoveredCategory, colorAt, onPointClick, categories, series, formatValue]);
20789
+ }, [
20790
+ plotted,
20791
+ showPoint,
20792
+ hoveredCategory,
20793
+ colorAt,
20794
+ dimmedColorAt,
20795
+ onPointClick,
20796
+ categories,
20797
+ series,
20798
+ formatValue
20799
+ ]);
20629
20800
  const valueLabels = react.useMemo(
20630
20801
  () => showValueLabel ? plotted.flatMap(
20631
20802
  (row, seriesIndex) => row.map(
@@ -20651,6 +20822,8 @@ var SLineChart = /* @__PURE__ */ react.forwardRef(function SLineChart2({
20651
20822
  ChartFrame,
20652
20823
  {
20653
20824
  ref,
20825
+ title,
20826
+ unit,
20654
20827
  legend,
20655
20828
  legendPosition,
20656
20829
  className,
@@ -20786,8 +20959,9 @@ var LABEL_MIN_RATIO = 0.05;
20786
20959
  var PIE_LABEL_RADIUS_RATIO = 0.65;
20787
20960
  var HOVER_GROW = 4;
20788
20961
  var HOVER_CORNER = 2;
20789
- var OPACITY_DEFAULT = "var(--cmp-chart-bar-opacity-default)";
20790
- var OPACITY_DIMMED = "var(--cmp-chart-bar-opacity-dimmed)";
20962
+ var OPACITY_DEFAULT = "var(--cmp-chart-opacity-default)";
20963
+ var OPACITY_DIMMED = "var(--cmp-chart-doughnut-opacity-dimmed)";
20964
+ var SLICE_HOVER_SHADOW = "var(--cmp-chart-doughnut-shadow-hover-filter)";
20791
20965
  var OPACITY_HOVER = 1;
20792
20966
  var defaultFormat3 = (value) => value.toLocaleString();
20793
20967
  function formatRatio(ratio) {
@@ -20837,6 +21011,8 @@ function slicePath(center, outer, inner, start, end, corner = 0) {
20837
21011
  }
20838
21012
  var RadialChart = /* @__PURE__ */ react.forwardRef(function RadialChart2({
20839
21013
  data,
21014
+ title,
21015
+ unit,
20840
21016
  palette = "multi",
20841
21017
  colors,
20842
21018
  showValueLabel = false,
@@ -20908,6 +21084,8 @@ var RadialChart = /* @__PURE__ */ react.forwardRef(function RadialChart2({
20908
21084
  ChartFrame,
20909
21085
  {
20910
21086
  ref,
21087
+ title,
21088
+ unit,
20911
21089
  legend,
20912
21090
  legendPosition,
20913
21091
  className,
@@ -20918,6 +21096,7 @@ var RadialChart = /* @__PURE__ */ react.forwardRef(function RadialChart2({
20918
21096
  {
20919
21097
  width: diameter,
20920
21098
  height: diameter,
21099
+ overflow: "visible",
20921
21100
  role: "img",
20922
21101
  "aria-label": `${arcs.length}\uAC1C \uD56D\uBAA9 ${kind}`,
20923
21102
  onMouseLeave: () => setHovered(null),
@@ -20930,7 +21109,7 @@ var RadialChart = /* @__PURE__ */ react.forwardRef(function RadialChart2({
20930
21109
  "aria-hidden": true,
20931
21110
  d: slicePath(center, outer, inner, 0, Math.PI * 2),
20932
21111
  fillRule: "evenodd",
20933
- style: { fill: "var(--cmp-chart-grid-line-color)" }
21112
+ style: { fill: "var(--cmp-chart-gridline-color)" }
20934
21113
  }
20935
21114
  )
20936
21115
  ) : arcs.map((arc2) => {
@@ -20944,6 +21123,10 @@ var RadialChart = /* @__PURE__ */ react.forwardRef(function RadialChart2({
20944
21123
  style: {
20945
21124
  fill: arc2.color,
20946
21125
  opacity,
21126
+ // 짚은 조각만 떠오른다. SVG 도형에는 box-shadow 가 걸리지 않아
21127
+ // 같은 토큰의 filter 형태를 쓴다 (drop-shadow 에는 spread 가 없다 —
21128
+ // 토큰의 음수 spread 만큼 설계보다 조금 넓게 깔린다).
21129
+ filter: hovered === arc2.index ? SLICE_HOVER_SHADOW : void 0,
20947
21130
  cursor: onSliceClick ? "pointer" : void 0
20948
21131
  },
20949
21132
  onMouseEnter: () => setHovered(arc2.index),
@@ -23514,6 +23697,7 @@ var SEditor = /* @__PURE__ */ react.forwardRef(function SEditor2({
23514
23697
  onFocus,
23515
23698
  onBlur,
23516
23699
  label,
23700
+ labelPosition,
23517
23701
  labelWidth,
23518
23702
  icon,
23519
23703
  iconColor,
@@ -23602,6 +23786,7 @@ var SEditor = /* @__PURE__ */ react.forwardRef(function SEditor2({
23602
23786
  {
23603
23787
  name,
23604
23788
  label,
23789
+ labelPosition,
23605
23790
  labelWidth,
23606
23791
  icon,
23607
23792
  iconColor,
@@ -25489,7 +25674,7 @@ function ListBox({
25489
25674
  "div",
25490
25675
  {
25491
25676
  className: cn(
25492
- "overflow-hidden border border-solid shadow-[var(--shadow-overlay)]",
25677
+ "overflow-hidden border border-solid shadow-[var(--cmp-chipFilter-listbox-shadow)]",
25493
25678
  maxHeight && "flex flex-col"
25494
25679
  ),
25495
25680
  style: {
@@ -25574,6 +25759,7 @@ var SChipInput = /* @__PURE__ */ react.forwardRef(function SChipInput2({
25574
25759
  loadingRecommendedItems = false,
25575
25760
  dropdownMinWidth = 200,
25576
25761
  label,
25762
+ labelPosition,
25577
25763
  labelWidth,
25578
25764
  hint,
25579
25765
  errorMessage,
@@ -25714,6 +25900,7 @@ var SChipInput = /* @__PURE__ */ react.forwardRef(function SChipInput2({
25714
25900
  SField,
25715
25901
  {
25716
25902
  label,
25903
+ labelPosition,
25717
25904
  labelWidth,
25718
25905
  labelHeight: `calc(var(--cmp-chipInput-${size}-minHeight) + 2px)`,
25719
25906
  icon,
@@ -26032,6 +26219,7 @@ var SBarcodeInput = /* @__PURE__ */ react.forwardRef(
26032
26219
  inputClassName,
26033
26220
  inputStyle,
26034
26221
  label,
26222
+ labelPosition,
26035
26223
  labelWidth,
26036
26224
  icon,
26037
26225
  iconColor,
@@ -26068,6 +26256,7 @@ var SBarcodeInput = /* @__PURE__ */ react.forwardRef(
26068
26256
  SField,
26069
26257
  {
26070
26258
  label,
26259
+ labelPosition,
26071
26260
  labelWidth,
26072
26261
  icon,
26073
26262
  iconColor,
@@ -26437,6 +26626,7 @@ function STimePicker({
26437
26626
  rules,
26438
26627
  status,
26439
26628
  label,
26629
+ labelPosition,
26440
26630
  labelWidth,
26441
26631
  icon,
26442
26632
  iconColor,
@@ -26491,6 +26681,7 @@ function STimePicker({
26491
26681
  SField,
26492
26682
  {
26493
26683
  label,
26684
+ labelPosition,
26494
26685
  labelWidth,
26495
26686
  icon,
26496
26687
  iconColor,
@@ -26903,6 +27094,7 @@ function STimeRangePicker({
26903
27094
  rules,
26904
27095
  status,
26905
27096
  label,
27097
+ labelPosition,
26906
27098
  labelWidth,
26907
27099
  icon,
26908
27100
  iconColor,
@@ -26959,6 +27151,7 @@ function STimeRangePicker({
26959
27151
  SField,
26960
27152
  {
26961
27153
  label,
27154
+ labelPosition,
26962
27155
  labelWidth,
26963
27156
  icon,
26964
27157
  iconColor,
@@ -27090,6 +27283,10 @@ exports.CHAT_MESSAGE_READ_STATUSES = CHAT_MESSAGE_READ_STATUSES;
27090
27283
  exports.CHAT_MESSAGE_VARIANTS = CHAT_MESSAGE_VARIANTS;
27091
27284
  exports.CHIP_COLORS = CHIP_COLORS;
27092
27285
  exports.COLOR_KEYS = COLOR_KEYS;
27286
+ exports.CONTEXT_ALERT_DEFAULT_ICON = CONTEXT_ALERT_DEFAULT_ICON;
27287
+ exports.CONTEXT_ALERT_ICON_COLOR = CONTEXT_ALERT_ICON_COLOR;
27288
+ exports.CONTEXT_ALERT_INTENTS = CONTEXT_ALERT_INTENTS;
27289
+ exports.CONTEXT_ALERT_SURFACE = CONTEXT_ALERT_SURFACE;
27093
27290
  exports.FIELD_WIDTH_GRADES = FIELD_WIDTH_GRADES;
27094
27291
  exports.GNB_COLORS = GNB_COLORS;
27095
27292
  exports.GNB_COMMON = GNB_COMMON;
@@ -27144,6 +27341,7 @@ exports.SChipFilter = SChipFilter;
27144
27341
  exports.SChipInput = SChipInput;
27145
27342
  exports.SCircleProgress = SCircleProgress;
27146
27343
  exports.SConfirmModal = SConfirmModal;
27344
+ exports.SContextAlert = SContextAlert;
27147
27345
  exports.SDatePicker = SDatePicker;
27148
27346
  exports.SDatePickerMonthListbox = SDatePickerMonthListbox;
27149
27347
  exports.SDatePickerYearListbox = SDatePickerYearListbox;