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

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 (58) 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 +14 -0
  18. package/dist/components/SDonutChart/SDonutChart.d.ts +12 -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 +10 -0
  30. package/dist/components/SLineChart/SLineChart.d.ts +8 -0
  31. package/dist/components/SLineChart/lineChart.config.d.ts +49 -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 +451 -175
  45. package/dist/index.cjs.map +1 -1
  46. package/dist/index.d.ts +1 -0
  47. package/dist/index.js +447 -176
  48. package/dist/index.js.map +1 -1
  49. package/dist/lib/chart/frame.d.ts +5 -1
  50. package/dist/lib/chart/legend.d.ts +8 -2
  51. package/dist/lib/chart/palette.d.ts +15 -13
  52. package/dist/lib/chart/radial.d.ts +20 -10
  53. package/dist/llms-full.txt +126 -4
  54. package/dist/llms.txt +32 -6
  55. package/dist/styles.css +162 -15
  56. package/dist/theme.css +104 -6
  57. package/eslint/scale.gen.mjs +1 -1
  58. 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
@@ -19501,8 +19637,51 @@ var ChartFrame = /* @__PURE__ */ react.forwardRef(function ChartFrame2({ legend,
19501
19637
  );
19502
19638
  });
19503
19639
  var DOT_SIZE = 6;
19504
- function ChartLegend({ items, align = "center", activeIndex, className }) {
19640
+ function ChartLegend({
19641
+ items,
19642
+ align = "center",
19643
+ activeIndex,
19644
+ className,
19645
+ variant = "simple"
19646
+ }) {
19505
19647
  if (items.length === 0) return null;
19648
+ const dot = (color) => /* @__PURE__ */ jsxRuntime.jsx(
19649
+ "span",
19650
+ {
19651
+ "aria-hidden": true,
19652
+ className: "shrink-0 rounded-full",
19653
+ style: { width: DOT_SIZE, height: DOT_SIZE, background: color }
19654
+ }
19655
+ );
19656
+ if (variant === "default") {
19657
+ return /* @__PURE__ */ jsxRuntime.jsx(
19658
+ "ul",
19659
+ {
19660
+ className: cn(
19661
+ "flex list-none flex-col gap-(--cmp-chart-doughnut-legend-data-default-gap) p-0",
19662
+ className
19663
+ ),
19664
+ children: items.map((item4, index) => /* @__PURE__ */ jsxRuntime.jsxs(
19665
+ "li",
19666
+ {
19667
+ className: cn(
19668
+ "flex items-center gap-(--cmp-chart-legendItem-gap)",
19669
+ "py-(--cmp-chart-legendItem-paddingY)",
19670
+ "typo-body-sm-medium text-(--cmp-chart-legendItem-color)",
19671
+ "transition-opacity duration-200 ease-out motion-reduce:transition-none",
19672
+ activeIndex != null && activeIndex !== index && "opacity-(--opacity-060)"
19673
+ ),
19674
+ children: [
19675
+ dot(item4.color),
19676
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: item4.name }),
19677
+ item4.value != null && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ml-auto typo-body-sm-bold", style: { color: item4.valueColor }, children: item4.value })
19678
+ ]
19679
+ },
19680
+ `${item4.name}-${index}`
19681
+ ))
19682
+ }
19683
+ );
19684
+ }
19506
19685
  return /* @__PURE__ */ jsxRuntime.jsx(
19507
19686
  "ul",
19508
19687
  {
@@ -19524,14 +19703,7 @@ function ChartLegend({ items, align = "center", activeIndex, className }) {
19524
19703
  activeIndex != null && activeIndex !== index && "opacity-(--opacity-060)"
19525
19704
  ),
19526
19705
  children: [
19527
- /* @__PURE__ */ jsxRuntime.jsx(
19528
- "span",
19529
- {
19530
- "aria-hidden": true,
19531
- className: "shrink-0 rounded-full",
19532
- style: { width: DOT_SIZE, height: DOT_SIZE, background: item4.color }
19533
- }
19534
- ),
19706
+ dot(item4.color),
19535
19707
  item4.name
19536
19708
  ]
19537
19709
  },
@@ -19543,28 +19715,59 @@ function ChartLegend({ items, align = "center", activeIndex, className }) {
19543
19715
 
19544
19716
  // src/lib/chart/palette.ts
19545
19717
  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")],
19718
+ var DIMMED = (path) => `var(--cmp-chart-line-point-dimmed-palette-${path})`;
19719
+ var VALUE = (path) => `var(--cmp-chart-dataValue-palette-${path})`;
19720
+ var colorsOf = (v) => ({
19721
+ positivePrimary: v("variation-positivePrimary"),
19722
+ positiveSecondary: v("variation-positiveSecondary"),
19723
+ negativePrimary: v("variation-negativePrimary"),
19724
+ negativeSecondary: v("variation-negativeSecondary"),
19725
+ neutralPrimary: v("variation-neutralPrimary"),
19726
+ neutralSecondary: v("variation-neutralSecondary")
19727
+ });
19728
+ var palettesOf = (v) => ({
19729
+ default: [v("single")],
19556
19730
  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")
19731
+ v("multi-blue"),
19732
+ v("multi-skyblue"),
19733
+ v("multi-yellow"),
19734
+ v("multi-olive"),
19735
+ v("multi-lightRed"),
19736
+ v("multi-warmBlue"),
19737
+ v("multi-orange"),
19738
+ v("multi-green"),
19739
+ v("multi-navy"),
19740
+ v("multi-grey"),
19741
+ v("multi-red")
19742
+ ],
19743
+ gradation: [
19744
+ v("gradation-1"),
19745
+ v("gradation-2"),
19746
+ v("gradation-3"),
19747
+ v("gradation-4"),
19748
+ v("gradation-5"),
19749
+ v("gradation-6")
19750
+ ]
19751
+ });
19752
+ var CHART_COLORS = colorsOf(V3);
19753
+ var CHART_PALETTES = palettesOf(V3);
19754
+ var DIMMED_COLORS = colorsOf(DIMMED);
19755
+ var DIMMED_PALETTES = palettesOf(DIMMED);
19756
+ var DATA_VALUE_COLORS = colorsOf(VALUE);
19757
+ var DATA_VALUE_PALETTES = {
19758
+ default: [DATA_VALUE_COLORS.positivePrimary],
19759
+ multi: [
19760
+ VALUE("multi-blue"),
19761
+ VALUE("multi-skyblue"),
19762
+ VALUE("multi-yellow"),
19763
+ VALUE("multi-olive"),
19764
+ VALUE("multi-lightRed"),
19765
+ VALUE("multi-warmBlue"),
19766
+ VALUE("multi-orange"),
19767
+ VALUE("multi-green"),
19768
+ VALUE("multi-navy"),
19769
+ VALUE("multi-grey"),
19770
+ VALUE("multi-red")
19568
19771
  ],
19569
19772
  gradation: [
19570
19773
  V3("gradation-1"),
@@ -19572,17 +19775,26 @@ var CHART_PALETTES = {
19572
19775
  V3("gradation-3"),
19573
19776
  V3("gradation-4"),
19574
19777
  V3("gradation-5"),
19575
- V3("gradation-6")
19778
+ VALUE("gradation-6")
19576
19779
  ]
19577
19780
  };
19578
- function paletteColor(palette, index, colors) {
19781
+ function pick(names, palettes, palette, index, colors) {
19579
19782
  if (palette === "custom") {
19580
- if (!colors?.length) return CHART_PALETTES.default[0];
19581
- return CHART_COLORS[colors[index % colors.length]];
19783
+ if (!colors?.length) return palettes.default[0];
19784
+ return names[colors[index % colors.length]];
19582
19785
  }
19583
- const list = CHART_PALETTES[palette] ?? CHART_PALETTES.default;
19786
+ const list = palettes[palette] ?? palettes.default;
19584
19787
  return list[index % list.length];
19585
19788
  }
19789
+ function paletteColor(palette, index, colors) {
19790
+ return pick(CHART_COLORS, CHART_PALETTES, palette, index, colors);
19791
+ }
19792
+ function linePointDimmedColor(palette, index, colors) {
19793
+ return pick(DIMMED_COLORS, DIMMED_PALETTES, palette, index, colors);
19794
+ }
19795
+ function dataValueColor(palette, index, colors) {
19796
+ return pick(DATA_VALUE_COLORS, DATA_VALUE_PALETTES, palette, index, colors);
19797
+ }
19586
19798
  function useElementSize() {
19587
19799
  const ref = react.useRef(null);
19588
19800
  const [size, setSize] = react.useState({ width: 0, height: 0 });
@@ -19660,7 +19872,8 @@ function ChartTooltip({
19660
19872
  "pointer-events-none absolute top-0 left-0 z-10 w-max",
19661
19873
  "flex flex-col gap-(--cmp-chart-chartTooltip-gap)",
19662
19874
  "px-(--cmp-chart-chartTooltip-paddingX) py-(--cmp-chart-chartTooltip-paddingY)",
19663
- "rounded-(--cmp-chart-chartTooltip-radius) bg-(--cmp-chart-chartTooltip-bg) shadow-floating",
19875
+ "rounded-(--cmp-chart-chartTooltip-radius) bg-(--cmp-chart-chartTooltip-bg)",
19876
+ "shadow-(--cmp-chart-chartTooltip-shadow)",
19664
19877
  className
19665
19878
  ),
19666
19879
  style: {
@@ -19707,12 +19920,12 @@ var BAR_SIZE_MAX = 80;
19707
19920
  var BAR_GAP = 6;
19708
19921
  var GROUP_PADDING_MIN = 8;
19709
19922
  var GROUP_PADDING_MAX = 24;
19710
- var VALUE_LABEL_GAP = 6;
19923
+ var VALUE_LABEL_GAP = 4;
19711
19924
  var BAR_RADIUS = 8;
19712
- var BAR_OPACITY_DEFAULT = "var(--cmp-chart-bar-opacity-default)";
19925
+ var BAR_OPACITY_DEFAULT = "var(--cmp-chart-opacity-default)";
19713
19926
  var BAR_OPACITY_DIMMED = "var(--cmp-chart-bar-opacity-dimmed)";
19714
19927
  var BAR_OPACITY_HOVER = 1;
19715
- var BAR_DATA_LABEL_COLOR = "var(--cmp-chart-bar-dataLabel-color-default)";
19928
+ var BAR_DATA_LABEL_COLOR = "var(--cmp-chart-dataLabel-color-default)";
19716
19929
  var BAR_DATA_LABEL_TYPO = "typo-body-sm-medium";
19717
19930
  var BAR_DATA_LABEL_TYPO_HOVER = "typo-body-md-bold";
19718
19931
  var BAR_HOVER_TRANSITION = "transition-opacity duration-200 ease-out motion-reduce:transition-none";
@@ -19772,6 +19985,8 @@ function barPath(x, y, width, height, direction, negative) {
19772
19985
  var SBarChart = /* @__PURE__ */ react.forwardRef(function SBarChart2({
19773
19986
  categories,
19774
19987
  series,
19988
+ title,
19989
+ unit,
19775
19990
  direction = "vertical",
19776
19991
  stacked = false,
19777
19992
  palette = "default",
@@ -20237,6 +20452,8 @@ var SBarChart = /* @__PURE__ */ react.forwardRef(function SBarChart2({
20237
20452
  ChartFrame,
20238
20453
  {
20239
20454
  ref,
20455
+ title,
20456
+ unit,
20240
20457
  legend,
20241
20458
  legendPosition,
20242
20459
  className,
@@ -20277,18 +20494,19 @@ var SBarChart = /* @__PURE__ */ react.forwardRef(function SBarChart2({
20277
20494
  });
20278
20495
 
20279
20496
  // 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;
20497
+ var LINE_WIDTH = "var(--cmp-chart-line-width)";
20498
+ var LINE_OPACITY = "var(--cmp-chart-line-opacity)";
20499
+ var LINE_DASH = "11 11";
20500
+ var POINT_RADIUS = 5;
20501
+ var POINT_HOVER_RADIUS = 6;
20502
+ var POINT_HALO_RADIUS = 12;
20503
+ var POINT_HALO_OPACITY = "var(--cmp-chart-line-point-opacity-bg)";
20504
+ var POINT_HOVER_EXTENT = POINT_HALO_RADIUS;
20287
20505
  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)";
20506
+ var VALUE_LABEL_GAP2 = 4;
20507
+ var AREA_OPACITY_TOP = "var(--cmp-chart-line-area-gradation-start)";
20508
+ var AREA_OPACITY_BOTTOM = "var(--cmp-chart-line-area-gradation-end)";
20509
+ var LINE_DATA_LABEL_COLOR = "var(--cmp-chart-dataLabel-color-default)";
20292
20510
  var LINE_DATA_LABEL_TYPO = "typo-body-sm-medium";
20293
20511
  var LINE_DATA_LABEL_TYPO_HOVER = "typo-body-md-bold";
20294
20512
  var r = (value) => Math.round(value * 100) / 100;
@@ -20368,7 +20586,10 @@ function runsOf(row) {
20368
20586
  var SLineChart = /* @__PURE__ */ react.forwardRef(function SLineChart2({
20369
20587
  categories,
20370
20588
  series,
20589
+ title,
20590
+ unit,
20371
20591
  curve = "linear",
20592
+ lineStyle = "solid",
20372
20593
  area = false,
20373
20594
  stacked = false,
20374
20595
  palette = "default",
@@ -20397,6 +20618,10 @@ var SLineChart = /* @__PURE__ */ react.forwardRef(function SLineChart2({
20397
20618
  (seriesIndex) => paletteColor(palette, seriesIndex, customColors),
20398
20619
  [palette, customColors]
20399
20620
  );
20621
+ const dimmedColorAt = react.useCallback(
20622
+ (seriesIndex) => linePointDimmedColor(palette, seriesIndex, customColors),
20623
+ [palette, customColors]
20624
+ );
20400
20625
  const rows = react.useMemo(() => {
20401
20626
  const running = categories.map(() => 0);
20402
20627
  return series.map(
@@ -20568,16 +20793,20 @@ var SLineChart = /* @__PURE__ */ react.forwardRef(function SLineChart2({
20568
20793
  "aria-hidden": true,
20569
20794
  d,
20570
20795
  fill: "none",
20571
- strokeWidth: LINE_WIDTH,
20572
20796
  strokeLinecap: "round",
20573
20797
  strokeLinejoin: "round",
20574
- style: { stroke: colorAt(seriesIndex) }
20798
+ style: {
20799
+ stroke: colorAt(seriesIndex),
20800
+ strokeWidth: LINE_WIDTH,
20801
+ strokeOpacity: LINE_OPACITY,
20802
+ strokeDasharray: lineStyle === "dashed" ? LINE_DASH : void 0
20803
+ }
20575
20804
  },
20576
20805
  `line-${seriesIndex}-${runIndex}`
20577
20806
  );
20578
20807
  })
20579
20808
  ),
20580
- [plotted, smooth, colorAt]
20809
+ [plotted, smooth, colorAt, lineStyle]
20581
20810
  );
20582
20811
  const { pointHalos, pointDots } = react.useMemo(() => {
20583
20812
  const halos = [];
@@ -20588,6 +20817,7 @@ var SLineChart = /* @__PURE__ */ react.forwardRef(function SLineChart2({
20588
20817
  const hovered = hoveredCategory === categoryIndex;
20589
20818
  if (!showPoint && !hovered) return;
20590
20819
  const color = colorAt(seriesIndex);
20820
+ const dimmed = hoveredCategory != null && !hovered;
20591
20821
  const key = `${seriesIndex}-${categoryIndex}`;
20592
20822
  if (hovered) {
20593
20823
  halos.push(
@@ -20597,12 +20827,8 @@ var SLineChart = /* @__PURE__ */ react.forwardRef(function SLineChart2({
20597
20827
  "aria-hidden": true,
20598
20828
  cx: point.x,
20599
20829
  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
- }
20830
+ r: POINT_HALO_RADIUS,
20831
+ style: { fill: color, fillOpacity: POINT_HALO_OPACITY }
20606
20832
  },
20607
20833
  `halo-${key}`
20608
20834
  )
@@ -20614,8 +20840,11 @@ var SLineChart = /* @__PURE__ */ react.forwardRef(function SLineChart2({
20614
20840
  {
20615
20841
  cx: point.x,
20616
20842
  cy: point.y,
20617
- r: hovered ? POINT_HOVER_INNER_RADIUS : POINT_RADIUS,
20618
- style: { fill: color, cursor: onPointClick ? "pointer" : void 0 },
20843
+ r: hovered ? POINT_HOVER_RADIUS : POINT_RADIUS,
20844
+ style: {
20845
+ fill: dimmed ? dimmedColorAt(seriesIndex) : color,
20846
+ cursor: onPointClick ? "pointer" : void 0
20847
+ },
20619
20848
  onClick: onPointClick ? () => onPointClick({ seriesIndex, categoryIndex, value: point.own }) : void 0,
20620
20849
  children: /* @__PURE__ */ jsxRuntime.jsx("title", { children: `${categories[categoryIndex]} ${series[seriesIndex]?.name ?? ""} ${formatValue(point.own)}` })
20621
20850
  },
@@ -20625,7 +20854,17 @@ var SLineChart = /* @__PURE__ */ react.forwardRef(function SLineChart2({
20625
20854
  });
20626
20855
  });
20627
20856
  return { pointHalos: halos, pointDots: dots };
20628
- }, [plotted, showPoint, hoveredCategory, colorAt, onPointClick, categories, series, formatValue]);
20857
+ }, [
20858
+ plotted,
20859
+ showPoint,
20860
+ hoveredCategory,
20861
+ colorAt,
20862
+ dimmedColorAt,
20863
+ onPointClick,
20864
+ categories,
20865
+ series,
20866
+ formatValue
20867
+ ]);
20629
20868
  const valueLabels = react.useMemo(
20630
20869
  () => showValueLabel ? plotted.flatMap(
20631
20870
  (row, seriesIndex) => row.map(
@@ -20651,6 +20890,8 @@ var SLineChart = /* @__PURE__ */ react.forwardRef(function SLineChart2({
20651
20890
  ChartFrame,
20652
20891
  {
20653
20892
  ref,
20893
+ title,
20894
+ unit,
20654
20895
  legend,
20655
20896
  legendPosition,
20656
20897
  className,
@@ -20786,8 +21027,9 @@ var LABEL_MIN_RATIO = 0.05;
20786
21027
  var PIE_LABEL_RADIUS_RATIO = 0.65;
20787
21028
  var HOVER_GROW = 4;
20788
21029
  var HOVER_CORNER = 2;
20789
- var OPACITY_DEFAULT = "var(--cmp-chart-bar-opacity-default)";
20790
- var OPACITY_DIMMED = "var(--cmp-chart-bar-opacity-dimmed)";
21030
+ var OPACITY_DEFAULT = "var(--cmp-chart-opacity-default)";
21031
+ var OPACITY_DIMMED = "var(--cmp-chart-doughnut-opacity-dimmed)";
21032
+ var SLICE_HOVER_SHADOW = "var(--cmp-chart-doughnut-shadow-hover-filter)";
20791
21033
  var OPACITY_HOVER = 1;
20792
21034
  var defaultFormat3 = (value) => value.toLocaleString();
20793
21035
  function formatRatio(ratio) {
@@ -20837,11 +21079,14 @@ function slicePath(center, outer, inner, start, end, corner = 0) {
20837
21079
  }
20838
21080
  var RadialChart = /* @__PURE__ */ react.forwardRef(function RadialChart2({
20839
21081
  data,
21082
+ title,
21083
+ unit,
20840
21084
  palette = "multi",
20841
21085
  colors,
20842
21086
  showValueLabel = false,
20843
21087
  showLegend = true,
20844
21088
  legendPosition = "top",
21089
+ legendVariant = "simple",
20845
21090
  showTooltip = true,
20846
21091
  formatValue = defaultFormat3,
20847
21092
  onSliceClick,
@@ -20869,7 +21114,8 @@ var RadialChart = /* @__PURE__ */ react.forwardRef(function RadialChart2({
20869
21114
  ratio,
20870
21115
  start,
20871
21116
  end: angle,
20872
- color: paletteColor(effective, slice2.index, colors)
21117
+ color: paletteColor(effective, slice2.index, colors),
21118
+ valueColor: dataValueColor(effective, slice2.index, colors)
20873
21119
  };
20874
21120
  });
20875
21121
  return list;
@@ -20882,8 +21128,14 @@ var RadialChart = /* @__PURE__ */ react.forwardRef(function RadialChart2({
20882
21128
  const legend = showLegend ? /* @__PURE__ */ jsxRuntime.jsx(
20883
21129
  ChartLegend,
20884
21130
  {
20885
- items: arcs.map((arc2) => ({ name: arc2.name, color: arc2.color })),
20886
- activeIndex: hoveredArc ? arcs.indexOf(hoveredArc) : null
21131
+ items: arcs.map((arc2) => ({
21132
+ name: arc2.name,
21133
+ color: arc2.color,
21134
+ value: legendVariant === "default" ? formatValue(arc2.value) : void 0,
21135
+ valueColor: arc2.valueColor
21136
+ })),
21137
+ activeIndex: hoveredArc ? arcs.indexOf(hoveredArc) : null,
21138
+ variant: legendVariant
20887
21139
  }
20888
21140
  ) : null;
20889
21141
  const tooltipAnchor = react.useMemo(() => {
@@ -20908,6 +21160,8 @@ var RadialChart = /* @__PURE__ */ react.forwardRef(function RadialChart2({
20908
21160
  ChartFrame,
20909
21161
  {
20910
21162
  ref,
21163
+ title,
21164
+ unit,
20911
21165
  legend,
20912
21166
  legendPosition,
20913
21167
  className,
@@ -20918,6 +21172,7 @@ var RadialChart = /* @__PURE__ */ react.forwardRef(function RadialChart2({
20918
21172
  {
20919
21173
  width: diameter,
20920
21174
  height: diameter,
21175
+ overflow: "visible",
20921
21176
  role: "img",
20922
21177
  "aria-label": `${arcs.length}\uAC1C \uD56D\uBAA9 ${kind}`,
20923
21178
  onMouseLeave: () => setHovered(null),
@@ -20930,7 +21185,7 @@ var RadialChart = /* @__PURE__ */ react.forwardRef(function RadialChart2({
20930
21185
  "aria-hidden": true,
20931
21186
  d: slicePath(center, outer, inner, 0, Math.PI * 2),
20932
21187
  fillRule: "evenodd",
20933
- style: { fill: "var(--cmp-chart-grid-line-color)" }
21188
+ style: { fill: "var(--cmp-chart-gridline-color)" }
20934
21189
  }
20935
21190
  )
20936
21191
  ) : arcs.map((arc2) => {
@@ -20944,6 +21199,10 @@ var RadialChart = /* @__PURE__ */ react.forwardRef(function RadialChart2({
20944
21199
  style: {
20945
21200
  fill: arc2.color,
20946
21201
  opacity,
21202
+ // 짚은 조각만 떠오른다. SVG 도형에는 box-shadow 가 걸리지 않아
21203
+ // 같은 토큰의 filter 형태를 쓴다 (drop-shadow 에는 spread 가 없다 —
21204
+ // 토큰의 음수 spread 만큼 설계보다 조금 넓게 깔린다).
21205
+ filter: hovered === arc2.index ? SLICE_HOVER_SHADOW : void 0,
20947
21206
  cursor: onSliceClick ? "pointer" : void 0
20948
21207
  },
20949
21208
  onMouseEnter: () => setHovered(arc2.index),
@@ -21035,6 +21294,7 @@ var SDonutChart = /* @__PURE__ */ react.forwardRef(function SDonutChart2({
21035
21294
  showValueLabel = false,
21036
21295
  showLegend = true,
21037
21296
  legendPosition = "top",
21297
+ legendVariant = "simple",
21038
21298
  showTooltip = true,
21039
21299
  ...props
21040
21300
  }, ref) {
@@ -21047,6 +21307,7 @@ var SDonutChart = /* @__PURE__ */ react.forwardRef(function SDonutChart2({
21047
21307
  showValueLabel,
21048
21308
  showLegend,
21049
21309
  legendPosition,
21310
+ legendVariant,
21050
21311
  showTooltip,
21051
21312
  innerRatio: DONUT_INNER_RATIO,
21052
21313
  kind: "\uB3C4\uB11B \uADF8\uB798\uD504"
@@ -23514,6 +23775,7 @@ var SEditor = /* @__PURE__ */ react.forwardRef(function SEditor2({
23514
23775
  onFocus,
23515
23776
  onBlur,
23516
23777
  label,
23778
+ labelPosition,
23517
23779
  labelWidth,
23518
23780
  icon,
23519
23781
  iconColor,
@@ -23602,6 +23864,7 @@ var SEditor = /* @__PURE__ */ react.forwardRef(function SEditor2({
23602
23864
  {
23603
23865
  name,
23604
23866
  label,
23867
+ labelPosition,
23605
23868
  labelWidth,
23606
23869
  icon,
23607
23870
  iconColor,
@@ -25489,7 +25752,7 @@ function ListBox({
25489
25752
  "div",
25490
25753
  {
25491
25754
  className: cn(
25492
- "overflow-hidden border border-solid shadow-[var(--shadow-overlay)]",
25755
+ "overflow-hidden border border-solid shadow-[var(--cmp-chipFilter-listbox-shadow)]",
25493
25756
  maxHeight && "flex flex-col"
25494
25757
  ),
25495
25758
  style: {
@@ -25574,6 +25837,7 @@ var SChipInput = /* @__PURE__ */ react.forwardRef(function SChipInput2({
25574
25837
  loadingRecommendedItems = false,
25575
25838
  dropdownMinWidth = 200,
25576
25839
  label,
25840
+ labelPosition,
25577
25841
  labelWidth,
25578
25842
  hint,
25579
25843
  errorMessage,
@@ -25714,6 +25978,7 @@ var SChipInput = /* @__PURE__ */ react.forwardRef(function SChipInput2({
25714
25978
  SField,
25715
25979
  {
25716
25980
  label,
25981
+ labelPosition,
25717
25982
  labelWidth,
25718
25983
  labelHeight: `calc(var(--cmp-chipInput-${size}-minHeight) + 2px)`,
25719
25984
  icon,
@@ -26032,6 +26297,7 @@ var SBarcodeInput = /* @__PURE__ */ react.forwardRef(
26032
26297
  inputClassName,
26033
26298
  inputStyle,
26034
26299
  label,
26300
+ labelPosition,
26035
26301
  labelWidth,
26036
26302
  icon,
26037
26303
  iconColor,
@@ -26068,6 +26334,7 @@ var SBarcodeInput = /* @__PURE__ */ react.forwardRef(
26068
26334
  SField,
26069
26335
  {
26070
26336
  label,
26337
+ labelPosition,
26071
26338
  labelWidth,
26072
26339
  icon,
26073
26340
  iconColor,
@@ -26437,6 +26704,7 @@ function STimePicker({
26437
26704
  rules,
26438
26705
  status,
26439
26706
  label,
26707
+ labelPosition,
26440
26708
  labelWidth,
26441
26709
  icon,
26442
26710
  iconColor,
@@ -26491,6 +26759,7 @@ function STimePicker({
26491
26759
  SField,
26492
26760
  {
26493
26761
  label,
26762
+ labelPosition,
26494
26763
  labelWidth,
26495
26764
  icon,
26496
26765
  iconColor,
@@ -26903,6 +27172,7 @@ function STimeRangePicker({
26903
27172
  rules,
26904
27173
  status,
26905
27174
  label,
27175
+ labelPosition,
26906
27176
  labelWidth,
26907
27177
  icon,
26908
27178
  iconColor,
@@ -26959,6 +27229,7 @@ function STimeRangePicker({
26959
27229
  SField,
26960
27230
  {
26961
27231
  label,
27232
+ labelPosition,
26962
27233
  labelWidth,
26963
27234
  icon,
26964
27235
  iconColor,
@@ -27090,6 +27361,10 @@ exports.CHAT_MESSAGE_READ_STATUSES = CHAT_MESSAGE_READ_STATUSES;
27090
27361
  exports.CHAT_MESSAGE_VARIANTS = CHAT_MESSAGE_VARIANTS;
27091
27362
  exports.CHIP_COLORS = CHIP_COLORS;
27092
27363
  exports.COLOR_KEYS = COLOR_KEYS;
27364
+ exports.CONTEXT_ALERT_DEFAULT_ICON = CONTEXT_ALERT_DEFAULT_ICON;
27365
+ exports.CONTEXT_ALERT_ICON_COLOR = CONTEXT_ALERT_ICON_COLOR;
27366
+ exports.CONTEXT_ALERT_INTENTS = CONTEXT_ALERT_INTENTS;
27367
+ exports.CONTEXT_ALERT_SURFACE = CONTEXT_ALERT_SURFACE;
27093
27368
  exports.FIELD_WIDTH_GRADES = FIELD_WIDTH_GRADES;
27094
27369
  exports.GNB_COLORS = GNB_COLORS;
27095
27370
  exports.GNB_COMMON = GNB_COMMON;
@@ -27144,6 +27419,7 @@ exports.SChipFilter = SChipFilter;
27144
27419
  exports.SChipInput = SChipInput;
27145
27420
  exports.SCircleProgress = SCircleProgress;
27146
27421
  exports.SConfirmModal = SConfirmModal;
27422
+ exports.SContextAlert = SContextAlert;
27147
27423
  exports.SDatePicker = SDatePicker;
27148
27424
  exports.SDatePickerMonthListbox = SDatePickerMonthListbox;
27149
27425
  exports.SDatePickerYearListbox = SDatePickerYearListbox;