sellmate-design-system-react 9.0.0-beta.74 → 9.0.0-beta.76

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 (40) hide show
  1. package/AGENTS.md +37 -2
  2. package/README.md +5 -5
  3. package/bin/sellmate-ds.mjs +91 -59
  4. package/dist/components/SCircleProgress/README.md +6 -3
  5. package/dist/components/SCircleProgress/SCircleProgress.d.ts +11 -3
  6. package/dist/components/SLauncherListBox/README.md +1 -1
  7. package/dist/components/SLauncherListBox/launcherListBox.config.d.ts +2 -2
  8. package/dist/components/SLinearProgress/README.md +2 -2
  9. package/dist/components/SLinearProgress/SLinearProgress.d.ts +8 -2
  10. package/dist/components/SLogo/README.md +1 -0
  11. package/dist/components/SLogo/logo.config.d.ts +1 -1
  12. package/dist/components/SSelect/README.md +18 -2
  13. package/dist/components/SSelect/SSelect.d.ts +28 -5
  14. package/dist/components/SSelect/index.d.ts +1 -1
  15. package/dist/components/STable/README.md +29 -20
  16. package/dist/components/STable/STable.d.ts +47 -31
  17. package/dist/components/STable/index.d.ts +1 -1
  18. package/dist/index.cjs +167 -50
  19. package/dist/index.cjs.map +1 -1
  20. package/dist/index.js +167 -50
  21. package/dist/index.js.map +1 -1
  22. package/dist/llms-full.txt +94 -31
  23. package/dist/llms.txt +39 -3
  24. package/dist/styles.css +16 -0
  25. package/dist/theme.css +3 -0
  26. package/eslint/index.mjs +42 -42
  27. package/eslint/lib/class-names.mjs +23 -25
  28. package/eslint/lib/table-column.mjs +11 -11
  29. package/eslint/rules/component-group-gap.mjs +32 -30
  30. package/eslint/rules/divider-vertical-height.mjs +22 -22
  31. package/eslint/rules/field-width-grade.mjs +50 -50
  32. package/eslint/rules/no-arbitrary-class.mjs +63 -20
  33. package/eslint/rules/no-off-scale-spacing.mjs +61 -41
  34. package/eslint/rules/no-raw-html-control.mjs +38 -36
  35. package/eslint/rules/prefer-typo-preset.mjs +23 -17
  36. package/eslint/rules/require-locale-number.mjs +14 -19
  37. package/eslint/rules/table-column-width.mjs +21 -17
  38. package/eslint/rules/table-numeric-align.mjs +14 -14
  39. package/eslint/scale.gen.mjs +1 -1
  40. package/package.json +3 -3
package/dist/index.cjs CHANGED
@@ -3792,43 +3792,46 @@ var STROKE = 12;
3792
3792
  var CIRCUMFERENCE = 2 * Math.PI * RADIUS;
3793
3793
  var COLOR_MAP = {
3794
3794
  primary: { arc: "var(--cmp-progress-color-active)", track: "var(--cmp-progress-color-track)" },
3795
- // inverse: 어두운 배경용 — arc 흰색, track 은 흰색 40%(회색 링)
3796
- inverse: { arc: "var(--color-white)", track: "rgba(255,255,255,0.4)" },
3797
- error: { arc: "var(--color-red-75)", track: "var(--cmp-progress-color-track)" },
3798
- complete: { arc: "#01BB4B", track: "var(--cmp-progress-color-track)" },
3795
+ // inverse: 어두운 배경용 — arc 는 반전색, track 은 반전색을 inverse-opacity 만큼만(회색 링)
3796
+ inverse: {
3797
+ arc: "var(--cmp-progress-inverse-color)",
3798
+ track: "color-mix(in srgb, var(--cmp-progress-inverse-color) var(--cmp-progress-inverse-opacity), transparent)"
3799
+ },
3800
+ warning: { arc: "var(--cmp-progress-color-warning)", track: "var(--cmp-progress-color-track)" },
3801
+ error: { arc: "var(--cmp-progress-color-error)", track: "var(--cmp-progress-color-track)" },
3802
+ complete: { arc: "var(--cmp-progress-color-success)", track: "var(--cmp-progress-color-track)" },
3799
3803
  // neutral: 콘텐츠가 아직 없는 자리를 채우는 용도 — arc 도 회색이라 진행률보다 "대기"로 읽힌다
3800
- neutral: { arc: "var(--color-grey-35)", track: "var(--cmp-progress-color-track)" }
3804
+ neutral: { arc: "var(--cmp-progress-color-neutral)", track: "var(--cmp-progress-color-track)" }
3801
3805
  };
3802
- var DEFAULT_SIZE = 80;
3803
3806
  var clamp = (v) => Number.isFinite(v) ? Math.max(0, Math.min(100, v)) : 0;
3804
3807
  var SCircleProgress = /* @__PURE__ */ react.forwardRef(
3805
3808
  function SCircleProgress2({
3806
3809
  value = 0,
3807
3810
  type = "primary",
3808
3811
  indeterminate = false,
3809
- size = DEFAULT_SIZE,
3812
+ size,
3810
3813
  label,
3811
3814
  innerValue = false,
3812
3815
  className,
3813
3816
  style
3814
3817
  }, ref) {
3815
3818
  const v = clamp(value);
3816
- const dimension = typeof size === "number" ? `${size}px` : size;
3819
+ const dimension = size === void 0 ? "var(--cmp-progress-circular-size)" : typeof size === "number" ? `${size}px` : size;
3817
3820
  const colors = COLOR_MAP[type];
3818
3821
  const c = VIEWBOX / 2;
3819
- const percentColor = v === 0 ? "var(--sys-color-fg-tertiary, #888888)" : colors.arc;
3822
+ const percentColor = v === 0 ? "var(--sys-color-fg-tertiary)" : colors.arc;
3820
3823
  const filled = v / 100 * CIRCUMFERENCE;
3821
3824
  const showPercent = !indeterminate;
3822
3825
  const percentNode = /* @__PURE__ */ jsxRuntime.jsxs(
3823
3826
  "span",
3824
3827
  {
3825
3828
  className: cn(
3826
- "text-center text-[16px] font-bold",
3829
+ "typo-heading-md text-center",
3827
3830
  innerValue ? (
3828
3831
  // leading-[normal]: 26px leading 은 폰트 content(19px) 위아래로 홀수(7px)만큼 남아
3829
3832
  // 3px/4px 로 쪼개지고 글자가 링 중심보다 위로 뜬다. (leading-normal 은 1.5 라 동일 문제)
3830
3833
  "absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 leading-[normal]"
3831
- ) : "leading-[26px]"
3834
+ ) : void 0
3832
3835
  ),
3833
3836
  style: { color: percentColor },
3834
3837
  children: [
@@ -3894,7 +3897,7 @@ var SCircleProgress = /* @__PURE__ */ react.forwardRef(
3894
3897
  showPercent && innerValue && percentNode
3895
3898
  ] }),
3896
3899
  showPercent && !innerValue && percentNode,
3897
- label && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-center text-[12px] font-normal leading-[20px] text-[color:var(--cmp-progress-color-label)]", children: label })
3900
+ label && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "typo-feedback-sm-regular text-center text-[color:var(--cmp-progress-color-label)]", children: label })
3898
3901
  ]
3899
3902
  }
3900
3903
  );
@@ -6895,6 +6898,7 @@ var LOGO_NAMES = [
6895
6898
  "sellmate",
6896
6899
  "wms",
6897
6900
  "chat",
6901
+ "chatbot",
6898
6902
  "plm",
6899
6903
  "account",
6900
6904
  "people",
@@ -6973,6 +6977,62 @@ var LOGOS = {
6973
6977
  }
6974
6978
  ]
6975
6979
  },
6980
+ chatbot: {
6981
+ width: 677,
6982
+ color: "#FF7F22",
6983
+ paths: [
6984
+ {
6985
+ d: "M390.671 0.480769C399.628 0.480769 406.904 7.6325 406.904 16.4692V16.9499H396.889V16.4692C396.889 13.0956 394.116 10.3553 390.671 10.3553H375.492C371.281 10.3553 367.868 13.7156 367.868 17.8542V32.1458C367.868 36.274 371.27 39.6447 375.492 39.6447H390.671C394.116 39.6447 396.889 36.9044 396.889 33.5308V33.0501H406.904V33.5308C406.904 42.3675 399.628 49.5192 390.671 49.5192H374.543C365.334 49.5191 357.865 42.1642 357.865 33.0914V16.9086C357.865 7.83555 365.346 0.480901 374.543 0.480769H390.671Z"
6986
+ },
6987
+ {
6988
+ d: "M424.736 17.3011C426.112 16.6865 427.8 16.4288 429.51 16.4288H441.028C443.607 16.4288 445.823 16.6732 447.666 17.1715L448.03 17.2748L448.033 17.2758C449.945 17.8576 451.503 18.7331 452.68 19.9613L452.896 20.1914C453.953 21.3596 454.71 22.7984 455.19 24.4704C455.699 26.2456 455.942 28.33 455.942 30.6997V49.5192H445.677V29.6133C445.677 27.873 445.325 26.6761 444.687 25.9362L444.684 25.9324C444.09 25.2296 442.926 24.7944 441.028 24.7944H429.51C427.612 24.7944 426.448 25.2296 425.854 25.9324L425.851 25.9362C425.213 26.6761 424.861 27.873 424.861 29.6133V49.5192H414.596V1.44231H424.736V17.3011Z"
6989
+ },
6990
+ {
6991
+ d: "M577.104 0C584.878 8.26358e-05 591.215 6.3316 591.215 14.1207V14.7104C591.215 17.8799 590.164 20.8103 588.393 23.1708C592.146 25.5104 594.648 29.6549 594.648 34.3703V35.8229C594.647 43.1032 588.678 49.0383 581.332 49.0385C580.953 49.2574 565.272 49.1891 553.469 49.0967C549.777 49.0678 546.808 46.0642 546.808 42.3725V14.1207C546.808 9.66706 548.856 5.5708 552.415 2.86677C554.889 0.99021 557.835 3.90295e-05 560.919 0H577.104ZM555.838 39.0991C555.838 40.1612 556.699 41.0222 557.761 41.0222H581.332C584.215 41.022 586.562 38.6931 586.562 35.8314V34.3788C586.562 31.5171 584.215 29.1882 581.332 29.1879H555.838V39.0991ZM561.552 9.5459C558.496 9.54605 556.009 12.0341 556.009 15.0916V21.1538H578.643C581.269 20.7195 583.279 18.4313 583.279 15.6823V15.0916C583.279 12.034 580.792 9.54593 577.736 9.5459H561.552Z",
6992
+ evenOdd: true
6993
+ },
6994
+ {
6995
+ d: "M488.836 11.5385C498.697 11.5385 503.492 15.4781 503.492 23.5793V36.9976C503.492 45.6093 505.135 49.0385 488.836 49.0385H475.897C466.577 49.0385 461.231 44.3883 461.231 36.2868C461.231 27.5861 465.683 23.5352 475.231 23.5352H494.952C494.858 22.4033 494.494 21.6261 493.86 21.1933C492.82 20.4832 491.218 20.3501 488.638 20.3501H465.162V11.5385H488.836ZM476.084 32.3252C472.839 32.3252 469.677 32.6136 469.677 36.1647C469.677 38.9392 471.715 40.2268 476.084 40.2269H488.638C491.01 40.2269 493.278 40.3707 494.255 39.6494C495.129 39.0058 495.046 37.8078 495.046 36.9976V32.3252H476.084Z",
6996
+ evenOdd: true
6997
+ },
6998
+ {
6999
+ d: "M529.384 1.61415V11.0023H540.077V19.9284H529.384V49.0385H520.011L520 48.3859V19.9284H509.308V11.0023H520V0.961538H529.373L529.384 1.61415Z"
7000
+ },
7001
+ {
7002
+ d: "M627.328 12.5C635.417 12.5 642 18.9976 642 27.0048V34.5337C642 42.5408 635.417 49.0385 627.328 49.0385H614.364C606.275 49.0385 599.692 42.5408 599.692 34.5337V27.0048C599.692 18.9976 606.275 12.5 614.364 12.5H627.328ZM614.373 21.7896C611.451 21.7898 609.08 24.1331 609.08 27.0048V34.5337C609.08 37.4065 611.453 39.759 614.373 39.7592H627.338C630.259 39.7592 632.631 37.4066 632.631 34.5337V27.0048C632.631 24.133 630.26 21.7896 627.338 21.7896H614.373Z",
7003
+ evenOdd: true
7004
+ },
7005
+ {
7006
+ d: "M665.923 1.61415V11.0023H676.615V19.9284H665.923V49.0385H656.55L656.538 48.3859V19.9284H645.846V11.0023H656.538V0.961538H665.912L665.923 1.61415Z"
7007
+ }
7008
+ ],
7009
+ vertical: [
7010
+ {
7011
+ d: "M72.6294 70.3846C79.795 70.3846 85.6153 76.106 85.6154 83.1753V83.5599H77.6038V83.1753C77.6037 80.4765 75.3853 78.2843 72.6294 78.2843H60.4862C57.1171 78.2843 54.3872 80.9725 54.3872 84.2834V95.7167C54.3872 99.0192 57.1087 101.716 60.4862 101.716H72.6294C75.3853 101.716 77.6037 99.5235 77.6038 96.8247V96.4401H85.6154V96.8247C85.6153 103.894 79.795 109.615 72.6294 109.615H59.7267C52.3598 109.615 46.3846 103.731 46.3846 96.4731V83.5269C46.3846 76.2684 52.3691 70.3847 59.7267 70.3846H72.6294Z"
7012
+ },
7013
+ {
7014
+ d: "M99.8815 83.8409C100.982 83.3492 102.333 83.143 103.701 83.143H112.915C114.978 83.143 116.751 83.3386 118.225 83.7372L118.517 83.8199L118.519 83.8206C120.049 84.2861 121.295 84.9865 122.237 85.9691L122.409 86.1531C123.255 87.0877 123.861 88.2388 124.244 89.5763C124.652 90.9965 124.846 92.664 124.846 94.5598V109.615H116.634V93.6907C116.634 92.2984 116.353 91.3409 115.842 90.749L115.84 90.7459C115.365 90.1837 114.433 89.8355 112.915 89.8355H103.701C102.182 89.8355 101.251 90.1837 100.775 90.7459L100.773 90.749C100.263 91.3409 99.9814 92.2984 99.9814 93.6907V109.615H91.7693V71.1538H99.8815V83.8409Z"
7015
+ },
7016
+ {
7017
+ d: "M221.775 70C227.995 70.0001 233.064 75.0653 233.064 81.2966V81.7683C233.064 84.3039 232.224 86.6483 230.807 88.5367C233.809 90.4083 235.811 93.7239 235.811 97.4962V98.6584C235.81 104.483 231.035 109.231 225.158 109.231C224.855 109.406 212.31 109.351 202.868 109.277C199.914 109.254 197.538 106.851 197.538 103.898V81.2966C197.539 77.7336 199.177 74.4566 202.025 72.2934C204.004 70.7922 206.361 70 208.828 70H221.775ZM204.763 101.279C204.763 102.129 205.452 102.818 206.301 102.818H225.158C227.465 102.818 229.342 100.954 229.342 98.6651V97.503C229.342 95.2137 227.465 93.3505 225.158 93.3504H204.763V101.279ZM209.334 77.6367C206.889 77.6368 204.9 79.6272 204.9 82.0733V86.9231H223.006C225.108 86.5756 226.716 84.745 226.716 82.5458V82.0733C226.716 79.6272 224.726 77.6367 222.282 77.6367H209.334Z",
7018
+ evenOdd: true
7019
+ },
7020
+ {
7021
+ d: "M151.162 79.2308C159.05 79.2308 162.886 82.3825 162.886 88.8634V99.5981C162.886 106.487 164.201 109.231 151.162 109.231H140.81C133.354 109.231 129.077 105.511 129.077 99.0294C129.077 92.0689 132.639 88.8281 140.277 88.8281H156.054C155.979 87.9226 155.688 87.3009 155.18 86.9546C154.348 86.3866 153.066 86.2801 151.003 86.2801H132.222V79.2308H151.162ZM140.959 95.8601C138.363 95.8601 135.834 96.0909 135.834 98.9318C135.834 101.151 137.465 102.181 140.959 102.181H151.003C152.9 102.181 154.715 102.297 155.497 101.72C156.196 101.205 156.129 100.246 156.129 99.5981V95.8601H140.959Z",
7022
+ evenOdd: true
7023
+ },
7024
+ {
7025
+ d: "M183.6 71.2913V78.8018H192.154V85.9428H183.6V109.231H176.101L176.092 108.709V85.9428H167.538V78.8018H176.092V70.7692H183.591L183.6 71.2913Z"
7026
+ },
7027
+ {
7028
+ d: "M261.955 80C268.426 80 273.692 85.1981 273.692 91.6038V97.627C273.692 104.033 268.426 109.231 261.955 109.231H251.584C245.113 109.231 239.846 104.033 239.846 97.627V91.6038C239.846 85.1981 245.113 80 251.584 80H261.955ZM251.591 87.4316C249.254 87.4318 247.357 89.3065 247.357 91.6038V97.627C247.357 99.9252 249.254 101.807 251.591 101.807H261.963C264.3 101.807 266.198 99.9253 266.198 97.627V91.6038C266.198 89.3064 264.301 87.4317 261.963 87.4316H251.591Z",
7029
+ evenOdd: true
7030
+ },
7031
+ {
7032
+ d: "M292.831 71.2913V78.8018H301.385V85.9428H292.831V109.231H285.332L285.323 108.709V85.9428H276.769V78.8018H285.323V70.7692H292.822L292.831 71.2913Z"
7033
+ }
7034
+ ]
7035
+ },
6976
7036
  plm: {
6977
7037
  width: 511,
6978
7038
  color: "#50BFF0",
@@ -7313,6 +7373,7 @@ var SERVICE_LABEL = {
7313
7373
  sellmate: "Sellmate",
7314
7374
  wms: "Sellmate WMS",
7315
7375
  chat: "Sellmate Chat",
7376
+ chatbot: "Sellmate ChatBot",
7316
7377
  plm: "Sellmate PLM",
7317
7378
  account: "Sellmate Account",
7318
7379
  people: "Sellmate People",
@@ -7573,6 +7634,10 @@ function TreeBranch({ expanded, children }) {
7573
7634
  }
7574
7635
  );
7575
7636
  }
7637
+ function isRowControlClick(event) {
7638
+ const control = event.target.closest("[data-tree-control]");
7639
+ return control != null && event.currentTarget.contains(control);
7640
+ }
7576
7641
  function STreeAllItem({
7577
7642
  selected,
7578
7643
  indeterminate,
@@ -7595,14 +7660,16 @@ function STreeAllItem({
7595
7660
  "data-tree-row": rowId,
7596
7661
  tabIndex,
7597
7662
  onKeyDown,
7598
- onClick: onSelect,
7663
+ onClick: (event) => {
7664
+ if (!isRowControlClick(event)) onSelect(event);
7665
+ },
7599
7666
  className: cn(
7600
7667
  "group/tree-item box-border flex w-full cursor-pointer items-center overflow-hidden bg-(--cmp-tree-item-bg-default) px-(--cmp-tree-item-paddingX) text-left hover:bg-(--cmp-tree-item-bg-hover)",
7601
7668
  typography.rowHeight,
7602
7669
  border && "border-b border-(--cmp-tree-item-border-default)"
7603
7670
  ),
7604
7671
  children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "box-border flex min-w-0 flex-1 items-center gap-(--cmp-tree-item-contentGap)", children: [
7605
- /* @__PURE__ */ jsxRuntime.jsx("span", { onClick: (event) => event.stopPropagation(), className: "flex shrink-0", children: /* @__PURE__ */ jsxRuntime.jsx(SCheckbox, { value: checkboxValue, onValueChange: () => onSelect() }) }),
7672
+ /* @__PURE__ */ jsxRuntime.jsx("span", { "data-tree-control": true, className: "flex shrink-0", children: /* @__PURE__ */ jsxRuntime.jsx(SCheckbox, { value: checkboxValue, onValueChange: () => onSelect() }) }),
7606
7673
  /* @__PURE__ */ jsxRuntime.jsx(
7607
7674
  "span",
7608
7675
  {
@@ -7633,6 +7700,10 @@ var STreeItemImpl = /* @__PURE__ */ react.forwardRef(function STreeItem({
7633
7700
  trailing,
7634
7701
  onToggle,
7635
7702
  onTreeSelect,
7703
+ // treeitem 은 포커스를 받을 수 있어야 한다. tab 순서는 STree 가 한 줄에만 0 을 줘서 정한다(roving).
7704
+ tabIndex = -1,
7705
+ // 줄 단위 키보드 조작(화살표·Enter·Space)은 줄 사이를 오가야 해서 STree 가 쥐고 내려준다
7706
+ onKeyDown,
7636
7707
  className,
7637
7708
  ...rest
7638
7709
  }, ref) {
@@ -7657,6 +7728,11 @@ var STreeItemImpl = /* @__PURE__ */ react.forwardRef(function STreeItem({
7657
7728
  onTreeSelect?.(node, event);
7658
7729
  };
7659
7730
  const handleRowClick = (event) => {
7731
+ if (isRowControlClick(event)) return;
7732
+ if (selectable && event.target.closest("[data-tree-label]")) {
7733
+ handleSelect(event);
7734
+ return;
7735
+ }
7660
7736
  if (hasChildren) onToggle?.(node, event);
7661
7737
  };
7662
7738
  return /* @__PURE__ */ jsxRuntime.jsxs(
@@ -7668,6 +7744,8 @@ var STreeItemImpl = /* @__PURE__ */ react.forwardRef(function STreeItem({
7668
7744
  "aria-expanded": hasChildren ? expanded : void 0,
7669
7745
  "aria-selected": selectable ? selected : void 0,
7670
7746
  "aria-disabled": node.disabled || void 0,
7747
+ tabIndex,
7748
+ onKeyDown,
7671
7749
  onClick: handleRowClick,
7672
7750
  className: cn(
7673
7751
  "group/tree-item box-border flex w-full items-center gap-(--cmp-tree-item-rowGap) overflow-hidden bg-(--cmp-tree-item-bg-default) px-(--cmp-tree-item-paddingX) text-left",
@@ -7713,7 +7791,7 @@ var STreeItemImpl = /* @__PURE__ */ react.forwardRef(function STreeItem({
7713
7791
  selectable && /* @__PURE__ */ jsxRuntime.jsx(
7714
7792
  "span",
7715
7793
  {
7716
- onClick: (event) => event.stopPropagation(),
7794
+ "data-tree-control": true,
7717
7795
  className: "flex shrink-0",
7718
7796
  "aria-hidden": node.disabled ? "true" : void 0,
7719
7797
  children: /* @__PURE__ */ jsxRuntime.jsx(
@@ -7729,11 +7807,7 @@ var STreeItemImpl = /* @__PURE__ */ react.forwardRef(function STreeItem({
7729
7807
  /* @__PURE__ */ jsxRuntime.jsx(
7730
7808
  "span",
7731
7809
  {
7732
- onClick: (event) => {
7733
- if (!selectable) return;
7734
- event.stopPropagation();
7735
- if (!node.disabled && selectable) onTreeSelect?.(node, event);
7736
- },
7810
+ "data-tree-label": true,
7737
7811
  className: cn(
7738
7812
  "block min-w-0 flex-1 truncate py-(--cmp-tree-item-paddingY) text-(--cmp-tree-item-text-default)",
7739
7813
  labelTypo,
@@ -8737,6 +8811,7 @@ var SContextAlert = /* @__PURE__ */ react.forwardRef(function SContextAlert2({ i
8737
8811
  });
8738
8812
  var FILL_COLOR = {
8739
8813
  primary: "var(--cmp-progress-color-active)",
8814
+ warning: "var(--cmp-progress-color-warning)",
8740
8815
  error: "var(--cmp-progress-color-error)",
8741
8816
  complete: "var(--cmp-progress-color-success)"
8742
8817
  };
@@ -8745,20 +8820,20 @@ var SLinearProgress = /* @__PURE__ */ react.forwardRef(
8745
8820
  function SLinearProgress2({ value = 0, type = "primary", size = "sm", indeterminate = false, label, className, style }, ref) {
8746
8821
  const v = clamp2(value);
8747
8822
  const fill = FILL_COLOR[type];
8748
- const valueColor = v === 0 ? "var(--sys-color-fg-tertiary, #888888)" : fill;
8823
+ const valueColor = v === 0 ? "var(--sys-color-fg-tertiary)" : fill;
8749
8824
  const valueText = `${Math.round(v)}%`;
8750
8825
  const showValue = !indeterminate && size !== "xs";
8751
8826
  return /* @__PURE__ */ jsxRuntime.jsxs(
8752
8827
  "div",
8753
8828
  {
8754
8829
  ref,
8755
- className: cn("flex w-full flex-col gap-[12px]", className),
8830
+ className: cn("flex w-full flex-col gap-[var(--cmp-progress-linear-gap)]", className),
8756
8831
  style,
8757
8832
  children: [
8758
8833
  /* @__PURE__ */ jsxRuntime.jsxs(
8759
8834
  "div",
8760
8835
  {
8761
- className: "relative w-full overflow-hidden rounded-full bg-[var(--cmp-progress-color-track)]",
8836
+ className: "relative w-full overflow-hidden rounded-[var(--cmp-progress-linear-radius)] bg-[var(--cmp-progress-color-track)]",
8762
8837
  style: { height: `var(--cmp-progress-linear-height-${size})` },
8763
8838
  children: [
8764
8839
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -8775,7 +8850,7 @@ var SLinearProgress = /* @__PURE__ */ react.forwardRef(
8775
8850
  /* @__PURE__ */ jsxRuntime.jsx(
8776
8851
  "span",
8777
8852
  {
8778
- className: "pointer-events-none absolute inset-x-0 top-1/2 -translate-y-1/2 select-none text-center text-[12px] font-bold leading-[20px]",
8853
+ className: "pointer-events-none absolute inset-x-0 top-1/2 -translate-y-1/2 typo-feedback-sm-bold select-none text-center",
8779
8854
  style: { color: valueColor },
8780
8855
  children: valueText
8781
8856
  }
@@ -8783,7 +8858,7 @@ var SLinearProgress = /* @__PURE__ */ react.forwardRef(
8783
8858
  /* @__PURE__ */ jsxRuntime.jsx(
8784
8859
  "span",
8785
8860
  {
8786
- className: "pointer-events-none absolute inset-x-0 top-1/2 -translate-y-1/2 select-none text-center text-[12px] font-bold leading-[20px] text-[color:var(--cmp-progress-bar-text)]",
8861
+ className: "pointer-events-none absolute inset-x-0 top-1/2 -translate-y-1/2 typo-feedback-sm-bold select-none text-center text-[color:var(--cmp-progress-bar-text)]",
8787
8862
  style: { clipPath: `inset(0 ${100 - v}% 0 0)` },
8788
8863
  children: valueText
8789
8864
  }
@@ -8792,7 +8867,7 @@ var SLinearProgress = /* @__PURE__ */ react.forwardRef(
8792
8867
  ]
8793
8868
  }
8794
8869
  ),
8795
- label && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-center text-[12px] font-normal leading-[20px] text-[color:var(--cmp-progress-color-label)]", children: label })
8870
+ label && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "typo-feedback-sm-regular text-center text-[color:var(--cmp-progress-color-label)]", children: label })
8796
8871
  ]
8797
8872
  }
8798
8873
  );
@@ -11707,6 +11782,7 @@ var LAUNCHER_SERVICES = [
11707
11782
  "sellmate",
11708
11783
  "wms",
11709
11784
  "chat",
11785
+ "chatbot",
11710
11786
  "plm",
11711
11787
  "account",
11712
11788
  "people",
@@ -11718,6 +11794,7 @@ var LAUNCHER_SERVICE_CATALOG = {
11718
11794
  sellmate: { name: "\uC140\uBA54\uC774\uD2B8" },
11719
11795
  wms: { name: "\uC140\uBA54\uC774\uD2B8 WMS" },
11720
11796
  chat: { name: "\uC140\uBA54\uC774\uD2B8 \uCC57" },
11797
+ chatbot: { name: "\uC140\uBA54\uC774\uD2B8 \uCC57\uBD07" },
11721
11798
  plm: { name: "\uC140\uBA54\uC774\uD2B8 PLM" },
11722
11799
  account: {
11723
11800
  name: "\uC140\uBA54\uC774\uD2B8 \uC5B4\uCE74\uC6B4\uD2B8",
@@ -15668,10 +15745,12 @@ var SSelectImpl = /* @__PURE__ */ react.forwardRef(function SSelect({
15668
15745
  }
15669
15746
  commitOpen(next);
15670
15747
  };
15748
+ const commitOpenRef = react.useRef(commitOpen);
15749
+ commitOpenRef.current = commitOpen;
15671
15750
  react.useEffect(() => {
15672
15751
  if (!insideModal || portalContainer == null || !pendingOpen) return;
15673
15752
  setPendingOpen(false);
15674
- commitOpen(true);
15753
+ commitOpenRef.current(true);
15675
15754
  }, [insideModal, pendingOpen, portalContainer]);
15676
15755
  const requestOpenRef = react.useRef(requestOpen);
15677
15756
  requestOpenRef.current = requestOpen;
@@ -15873,6 +15952,7 @@ var SSelectImpl = /* @__PURE__ */ react.forwardRef(function SSelect({
15873
15952
  return labelByValue.get(selected[0]) ?? valueOptions.get(selected[0])?.label ?? selected[0];
15874
15953
  })();
15875
15954
  const isPlaceholder = selected.length === 0;
15955
+ const showTriggerSpinner = loading2 && !effectiveDisabled;
15876
15956
  const showClear = clearable && !effectiveDisabled && !isPlaceholder;
15877
15957
  const handleClear = () => {
15878
15958
  emit3([]);
@@ -16047,6 +16127,7 @@ var SSelectImpl = /* @__PURE__ */ react.forwardRef(function SSelect({
16047
16127
  "aria-expanded": open,
16048
16128
  "aria-controls": open ? listboxId : void 0,
16049
16129
  "aria-activedescendant": open && focusedIndex >= 0 ? activeOptionId : void 0,
16130
+ "aria-busy": showTriggerSpinner || void 0,
16050
16131
  onClick: () => requestOpen(!open),
16051
16132
  onKeyDown: handleKeyDown,
16052
16133
  className: "flex h-full w-full cursor-pointer items-center justify-between gap-[8px] bg-transparent px-[12px] text-left text-[12px] leading-[20px] outline-none disabled:cursor-not-allowed",
@@ -16098,7 +16179,7 @@ var SSelectImpl = /* @__PURE__ */ react.forwardRef(function SSelect({
16098
16179
  ]
16099
16180
  }
16100
16181
  ),
16101
- /* @__PURE__ */ jsxRuntime.jsx(
16182
+ showTriggerSpinner ? /* @__PURE__ */ jsxRuntime.jsx("span", { "aria-hidden": true, className: "inline-flex shrink-0", "data-select-trigger-spinner": true, children: /* @__PURE__ */ jsxRuntime.jsx(SCircleProgress, { indeterminate: true, type: "neutral", size: 12 }) }) : /* @__PURE__ */ jsxRuntime.jsx(
16102
16183
  SIcon,
16103
16184
  {
16104
16185
  name: "chevronDown",
@@ -16214,12 +16295,15 @@ var SSelectImpl = /* @__PURE__ */ react.forwardRef(function SSelect({
16214
16295
  // 첫 페이지를 받는 중에는 "없다"고 단정하지 않는다 — 아래 로딩 표시가 대신 나온다.
16215
16296
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "px-[12px] py-[12px] text-left text-[12px] leading-[20px] text-[color:var(--cmp-listBoxItem-content-disabled)]", children: "\uD45C\uC2DC\uD560 \uD56D\uBAA9\uC774 \uC5C6\uC2B5\uB2C8\uB2E4." })
16216
16297
  ),
16217
- loading2 && /* @__PURE__ */ jsxRuntime.jsx(
16298
+ loading2 && /* @__PURE__ */ jsxRuntime.jsxs(
16218
16299
  "div",
16219
16300
  {
16220
16301
  role: "status",
16221
- className: "px-[12px] py-[12px] text-center text-[12px] leading-[20px] text-[color:var(--cmp-listBoxItem-content-disabled)]",
16222
- children: "\uBD88\uB7EC\uC624\uB294 \uC911..."
16302
+ className: "flex items-center justify-center gap-[8px] px-[12px] py-[12px] text-[12px] leading-[20px] text-[color:var(--cmp-listBoxItem-content-disabled)]",
16303
+ children: [
16304
+ /* @__PURE__ */ jsxRuntime.jsx(SCircleProgress, { indeterminate: true, type: "neutral", size: 16 }),
16305
+ "\uBD88\uB7EC\uC624\uB294 \uC911..."
16306
+ ]
16223
16307
  }
16224
16308
  )
16225
16309
  ]
@@ -16489,7 +16573,7 @@ var colWidthFromDef = (c) => {
16489
16573
  const px = typeof c.width === "number" ? c.width : parseInt(c.width, 10);
16490
16574
  return Number.isFinite(px) ? px : DEFAULT_COLUMN_WIDTH;
16491
16575
  };
16492
- var STable = /* @__PURE__ */ react.forwardRef(function STable2({
16576
+ var STableImpl = /* @__PURE__ */ react.forwardRef(function STable({
16493
16577
  columns = [],
16494
16578
  headerGroups,
16495
16579
  rows = [],
@@ -17599,6 +17683,7 @@ var STable = /* @__PURE__ */ react.forwardRef(function STable2({
17599
17683
  }
17600
17684
  );
17601
17685
  });
17686
+ var STable2 = STableImpl;
17602
17687
  var COUNT_NULL = "var(--cmp-table-bar-count-null)";
17603
17688
  var totalColor = (n) => n > 0 ? "var(--cmp-table-bar-count-total)" : COUNT_NULL;
17604
17689
  var selectedColor = (n) => n > 0 ? "var(--color-brilliantblue-75)" : COUNT_NULL;
@@ -18405,11 +18490,13 @@ function SCalendar({
18405
18490
  const base = value || today;
18406
18491
  const [y, setY] = react.useState(() => Number(base.split("-")[0]));
18407
18492
  const [m, setM] = react.useState(() => Number(base.split("-")[1]));
18408
- react.useEffect(() => {
18493
+ const [syncedValue, setSyncedValue] = react.useState(value);
18494
+ if (syncedValue !== value) {
18495
+ setSyncedValue(value);
18409
18496
  const b = value || today;
18410
18497
  setY(Number(b.split("-")[0]));
18411
18498
  setM(Number(b.split("-")[1]));
18412
- }, [value]);
18499
+ }
18413
18500
  const cells = react.useMemo(() => monthCells(y, m), [y, m]);
18414
18501
  const eventMap = react.useMemo(() => {
18415
18502
  const map = /* @__PURE__ */ new Map();
@@ -19732,6 +19819,7 @@ var SChipImpl = /* @__PURE__ */ react.forwardRef(function SChip({
19732
19819
  {
19733
19820
  ref: inputRef,
19734
19821
  role: "textbox",
19822
+ tabIndex: 0,
19735
19823
  contentEditable: !disabled,
19736
19824
  suppressContentEditableWarning: true,
19737
19825
  spellCheck: false,
@@ -22156,6 +22244,7 @@ var SToastContainer = /* @__PURE__ */ react.forwardRef(
22156
22244
  const [mounted2, setMounted] = react.useState(false);
22157
22245
  const timers = react.useRef(/* @__PURE__ */ new Map());
22158
22246
  const elRefs = react.useRef(/* @__PURE__ */ new Map());
22247
+ const resizeObserverRef = react.useRef(null);
22159
22248
  const [heights, setHeights] = react.useState(/* @__PURE__ */ new Map());
22160
22249
  const onShowRef = react.useRef(onShow);
22161
22250
  const onDismissRef = react.useRef(onDismiss);
@@ -22169,6 +22258,8 @@ var SToastContainer = /* @__PURE__ */ react.forwardRef(
22169
22258
  if (!liveIds.current.has(id)) return;
22170
22259
  liveIds.current.delete(id);
22171
22260
  setToasts((prev) => prev.filter((t) => t.id !== id));
22261
+ const el = elRefs.current.get(id);
22262
+ if (el) resizeObserverRef.current?.unobserve(el);
22172
22263
  elRefs.current.delete(id);
22173
22264
  setHeights((prev) => {
22174
22265
  if (!prev.has(id)) return prev;
@@ -22202,21 +22293,31 @@ var SToastContainer = /* @__PURE__ */ react.forwardRef(
22202
22293
  });
22203
22294
  return () => cancelAnimationFrame(raf);
22204
22295
  }, [toasts]);
22205
- react.useLayoutEffect(() => {
22206
- let changed = false;
22207
- const next = new Map(heights);
22208
- toasts.forEach((t) => {
22209
- const el = elRefs.current.get(t.id);
22210
- if (el) {
22296
+ react.useEffect(() => {
22297
+ if (typeof ResizeObserver === "undefined") return;
22298
+ const observer = new ResizeObserver((entries4) => {
22299
+ const measured = [];
22300
+ for (const entry of entries4) {
22301
+ const el = entry.target;
22302
+ const id = el.dataset.toastId;
22211
22303
  const h = el.offsetHeight;
22212
- if (h > 0 && next.get(t.id) !== h) {
22213
- next.set(t.id, h);
22214
- changed = true;
22215
- }
22304
+ if (id != null && h > 0 && liveIds.current.has(id)) measured.push([id, h]);
22216
22305
  }
22306
+ if (measured.length === 0) return;
22307
+ setHeights((prev) => {
22308
+ if (measured.every(([id, h]) => prev.get(id) === h)) return prev;
22309
+ const next = new Map(prev);
22310
+ for (const [id, h] of measured) next.set(id, h);
22311
+ return next;
22312
+ });
22217
22313
  });
22218
- if (changed) setHeights(next);
22219
- });
22314
+ resizeObserverRef.current = observer;
22315
+ elRefs.current.forEach((el) => observer.observe(el));
22316
+ return () => {
22317
+ observer.disconnect();
22318
+ resizeObserverRef.current = null;
22319
+ };
22320
+ }, []);
22220
22321
  const scheduleAutoClose = react.useCallback(
22221
22322
  (id, duration) => {
22222
22323
  if (duration > 0)
@@ -22355,8 +22456,11 @@ var SToastContainer = /* @__PURE__ */ react.forwardRef(
22355
22456
  children: toasts.map((entry) => /* @__PURE__ */ jsxRuntime.jsx(
22356
22457
  "div",
22357
22458
  {
22459
+ "data-toast-id": entry.id,
22358
22460
  ref: (el) => {
22359
- if (el) elRefs.current.set(entry.id, el);
22461
+ if (el == null || elRefs.current.get(entry.id) === el) return;
22462
+ elRefs.current.set(entry.id, el);
22463
+ resizeObserverRef.current?.observe(el);
22360
22464
  },
22361
22465
  style: itemStyle(entry),
22362
22466
  children: /* @__PURE__ */ jsxRuntime.jsx(SToast, { ...entry.options, onClose: () => startDismiss(entry.id) })
@@ -26677,7 +26781,16 @@ var SChipInput = /* @__PURE__ */ react.forwardRef(function SChipInput2({
26677
26781
  const loading2 = effectiveAutocomplete ? loadingSuggestions && suggestions.length === 0 : loadingRecommendedItems && recommendedItems.length === 0;
26678
26782
  const isFieldEmpty = inputValue === "" && values.length > 0 && !focused;
26679
26783
  const isFieldFilled = inputValue !== "";
26784
+ const reopenDropdown = () => {
26785
+ setSuppressSuggestions(false);
26786
+ setSuppressRecommendations(false);
26787
+ };
26680
26788
  const onKeyDown = (e) => {
26789
+ if (e.key === "ArrowDown" && !showDropdown && (inputValue === "" ? suppressRecommendations : suppressSuggestions)) {
26790
+ e.preventDefault();
26791
+ reopenDropdown();
26792
+ return;
26793
+ }
26681
26794
  if (showDropdown && items.length > 0) {
26682
26795
  if (e.key === "ArrowDown") {
26683
26796
  e.preventDefault();
@@ -26755,10 +26868,10 @@ var SChipInput = /* @__PURE__ */ react.forwardRef(function SChipInput2({
26755
26868
  "relative box-border flex w-full flex-wrap content-center items-center gap-(--cmp-chipInput-chip-gap)",
26756
26869
  size === "md" ? "min-h-(--cmp-chipInput-md-minHeight) px-(--cmp-chipInput-md-paddingX) py-(--cmp-chipInput-md-paddingY)" : "min-h-(--cmp-chipInput-sm-minHeight) px-(--cmp-chipInput-sm-paddingX) py-(--cmp-chipInput-sm-paddingY)"
26757
26870
  ),
26871
+ role: "presentation",
26758
26872
  onClick: () => {
26759
26873
  if (!disabled) {
26760
- setSuppressSuggestions(false);
26761
- setSuppressRecommendations(false);
26874
+ reopenDropdown();
26762
26875
  inputRef.current?.focus();
26763
26876
  }
26764
26877
  },
@@ -26889,6 +27002,7 @@ var SChipInput = /* @__PURE__ */ react.forwardRef(function SChipInput2({
26889
27002
  metaPlacement === "end" && "ml-auto"
26890
27003
  ),
26891
27004
  "data-placement": metaPlacement,
27005
+ role: "presentation",
26892
27006
  onMouseDown: (e) => e.preventDefault(),
26893
27007
  children: [
26894
27008
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -26945,6 +27059,7 @@ var SChipInput = /* @__PURE__ */ react.forwardRef(function SChipInput2({
26945
27059
  {
26946
27060
  id: listboxId,
26947
27061
  role: "listbox",
27062
+ tabIndex: -1,
26948
27063
  className: "s-chip-input__suggestions flex w-full flex-col outline-none",
26949
27064
  onMouseDown: (e) => e.preventDefault(),
26950
27065
  children: [
@@ -26958,6 +27073,7 @@ var SChipInput = /* @__PURE__ */ react.forwardRef(function SChipInput2({
26958
27073
  id: active ? activeOptionId : void 0,
26959
27074
  role: "option",
26960
27075
  "aria-selected": selected || active,
27076
+ tabIndex: -1,
26961
27077
  className: "rounded-full",
26962
27078
  style: active ? { outline: "2px solid var(--color-border-accent)", outlineOffset: 1 } : void 0,
26963
27079
  onMouseDown: (e) => {
@@ -26977,6 +27093,7 @@ var SChipInput = /* @__PURE__ */ react.forwardRef(function SChipInput2({
26977
27093
  id: active ? activeOptionId : void 0,
26978
27094
  role: "option",
26979
27095
  "aria-selected": selected || active,
27096
+ tabIndex: -1,
26980
27097
  className: cn(
26981
27098
  "s-chip-input__suggestion-item flex shrink-0 cursor-pointer items-center gap-sd-8 overflow-hidden text-ellipsis whitespace-nowrap px-sd-12 py-sd-4 text-12 leading-sd-20",
26982
27099
  selected ? "cursor-default overflow-visible font-bold text-(--cmp-listBoxItem-content-selected)" : active ? "bg-(--cmp-listBoxItem-bg-hover) font-medium text-(--cmp-listBoxItem-content-hover)" : "text-(--cmp-listBoxItem-content-default)"
@@ -28245,7 +28362,7 @@ exports.SStepper = SStepper;
28245
28362
  exports.SSwitch = SSwitch;
28246
28363
  exports.SSystemActionButton = SSystemActionButton;
28247
28364
  exports.STEPPER_SIZES = STEPPER_SIZES;
28248
- exports.STable = STable;
28365
+ exports.STable = STable2;
28249
28366
  exports.STableBar = STableBar;
28250
28367
  exports.STabs = STabs;
28251
28368
  exports.STag = STag;