sellmate-design-system-react 0.1.7 → 0.1.9

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 (146) hide show
  1. package/dist/components/SActionModal/SActionModal.cjs +11 -3
  2. package/dist/components/SActionModal/SActionModal.cjs.map +1 -1
  3. package/dist/components/SActionModal/SActionModal.js +11 -3
  4. package/dist/components/SActionModal/SActionModal.js.map +1 -1
  5. package/dist/components/SBarcodeInput/SBarcodeInput.cjs +226 -209
  6. package/dist/components/SBarcodeInput/SBarcodeInput.cjs.map +1 -1
  7. package/dist/components/SBarcodeInput/SBarcodeInput.js +226 -209
  8. package/dist/components/SBarcodeInput/SBarcodeInput.js.map +1 -1
  9. package/dist/components/SCalendar/SCalendar.cjs +9 -1
  10. package/dist/components/SCalendar/SCalendar.cjs.map +1 -1
  11. package/dist/components/SCalendar/SCalendar.js +9 -1
  12. package/dist/components/SCalendar/SCalendar.js.map +1 -1
  13. package/dist/components/SChip/SChip.cjs +9 -1
  14. package/dist/components/SChip/SChip.cjs.map +1 -1
  15. package/dist/components/SChip/SChip.d.ts +1 -1
  16. package/dist/components/SChip/SChip.js +9 -1
  17. package/dist/components/SChip/SChip.js.map +1 -1
  18. package/dist/components/SChipInput/SChipInput.cjs +260 -235
  19. package/dist/components/SChipInput/SChipInput.cjs.map +1 -1
  20. package/dist/components/SChipInput/SChipInput.js +259 -235
  21. package/dist/components/SChipInput/SChipInput.js.map +1 -1
  22. package/dist/components/SCircleProgress/SCircleProgress.cjs +56 -58
  23. package/dist/components/SCircleProgress/SCircleProgress.cjs.map +1 -1
  24. package/dist/components/SCircleProgress/SCircleProgress.js +56 -58
  25. package/dist/components/SCircleProgress/SCircleProgress.js.map +1 -1
  26. package/dist/components/SConfirmModal/SConfirmModal.cjs +9 -1
  27. package/dist/components/SConfirmModal/SConfirmModal.cjs.map +1 -1
  28. package/dist/components/SConfirmModal/SConfirmModal.js +9 -1
  29. package/dist/components/SConfirmModal/SConfirmModal.js.map +1 -1
  30. package/dist/components/SDatePicker/SDatePicker.cjs +247 -221
  31. package/dist/components/SDatePicker/SDatePicker.cjs.map +1 -1
  32. package/dist/components/SDatePicker/SDatePicker.js +247 -221
  33. package/dist/components/SDatePicker/SDatePicker.js.map +1 -1
  34. package/dist/components/SDateRangePicker/SDateRangePicker.cjs +308 -256
  35. package/dist/components/SDateRangePicker/SDateRangePicker.cjs.map +1 -1
  36. package/dist/components/SDateRangePicker/SDateRangePicker.js +308 -256
  37. package/dist/components/SDateRangePicker/SDateRangePicker.js.map +1 -1
  38. package/dist/components/SDropdownButton/SDropdownButton.cjs +51 -4
  39. package/dist/components/SDropdownButton/SDropdownButton.cjs.map +1 -1
  40. package/dist/components/SDropdownButton/SDropdownButton.js +52 -5
  41. package/dist/components/SDropdownButton/SDropdownButton.js.map +1 -1
  42. package/dist/components/SField/SField.cjs +226 -21
  43. package/dist/components/SField/SField.cjs.map +1 -1
  44. package/dist/components/SField/SField.d.ts +11 -0
  45. package/dist/components/SField/SField.js +226 -21
  46. package/dist/components/SField/SField.js.map +1 -1
  47. package/dist/components/SFilePicker/SFilePicker.cjs +306 -278
  48. package/dist/components/SFilePicker/SFilePicker.cjs.map +1 -1
  49. package/dist/components/SFilePicker/SFilePicker.d.ts +4 -2
  50. package/dist/components/SFilePicker/SFilePicker.js +306 -278
  51. package/dist/components/SFilePicker/SFilePicker.js.map +1 -1
  52. package/dist/components/SGhostButton/SGhostButton.cjs +8 -0
  53. package/dist/components/SGhostButton/SGhostButton.cjs.map +1 -1
  54. package/dist/components/SGhostButton/SGhostButton.js +8 -0
  55. package/dist/components/SGhostButton/SGhostButton.js.map +1 -1
  56. package/dist/components/SGuide/SGuide.cjs +12 -1
  57. package/dist/components/SGuide/SGuide.cjs.map +1 -1
  58. package/dist/components/SGuide/SGuide.js +12 -1
  59. package/dist/components/SGuide/SGuide.js.map +1 -1
  60. package/dist/components/SInput/SInput.cjs +226 -209
  61. package/dist/components/SInput/SInput.cjs.map +1 -1
  62. package/dist/components/SInput/SInput.js +226 -209
  63. package/dist/components/SInput/SInput.js.map +1 -1
  64. package/dist/components/SKeyValueTable/SKeyValueTable.cjs +640 -453
  65. package/dist/components/SKeyValueTable/SKeyValueTable.cjs.map +1 -1
  66. package/dist/components/SKeyValueTable/SKeyValueTable.d.ts +3 -1
  67. package/dist/components/SKeyValueTable/SKeyValueTable.js +640 -453
  68. package/dist/components/SKeyValueTable/SKeyValueTable.js.map +1 -1
  69. package/dist/components/SLoadingContainer/SLoadingContainer.cjs +64 -58
  70. package/dist/components/SLoadingContainer/SLoadingContainer.cjs.map +1 -1
  71. package/dist/components/SLoadingContainer/SLoadingContainer.js +64 -58
  72. package/dist/components/SLoadingContainer/SLoadingContainer.js.map +1 -1
  73. package/dist/components/SLoadingContainer/loading.cjs +64 -58
  74. package/dist/components/SLoadingContainer/loading.cjs.map +1 -1
  75. package/dist/components/SLoadingContainer/loading.js +64 -58
  76. package/dist/components/SLoadingContainer/loading.js.map +1 -1
  77. package/dist/components/SLoadingModal/SLoadingModal.cjs +68 -61
  78. package/dist/components/SLoadingModal/SLoadingModal.cjs.map +1 -1
  79. package/dist/components/SLoadingModal/SLoadingModal.js +68 -61
  80. package/dist/components/SLoadingModal/SLoadingModal.js.map +1 -1
  81. package/dist/components/SModalContainer/SModalContainer.cjs +9 -1
  82. package/dist/components/SModalContainer/SModalContainer.cjs.map +1 -1
  83. package/dist/components/SModalContainer/SModalContainer.js +9 -1
  84. package/dist/components/SModalContainer/SModalContainer.js.map +1 -1
  85. package/dist/components/SNumberInput/SNumberInput.cjs +334 -50
  86. package/dist/components/SNumberInput/SNumberInput.cjs.map +1 -1
  87. package/dist/components/SNumberInput/SNumberInput.d.ts +2 -0
  88. package/dist/components/SNumberInput/SNumberInput.js +334 -50
  89. package/dist/components/SNumberInput/SNumberInput.js.map +1 -1
  90. package/dist/components/SPagination/SPagination.cjs +1 -1
  91. package/dist/components/SPagination/SPagination.cjs.map +1 -1
  92. package/dist/components/SPagination/SPagination.js +1 -1
  93. package/dist/components/SPagination/SPagination.js.map +1 -1
  94. package/dist/components/SPopover/SPopover.cjs +20 -3
  95. package/dist/components/SPopover/SPopover.cjs.map +1 -1
  96. package/dist/components/SPopover/SPopover.js +20 -4
  97. package/dist/components/SPopover/SPopover.js.map +1 -1
  98. package/dist/components/SPopup/SPopup.cjs +2 -2
  99. package/dist/components/SPopup/SPopup.cjs.map +1 -1
  100. package/dist/components/SPopup/SPopup.js +2 -2
  101. package/dist/components/SPopup/SPopup.js.map +1 -1
  102. package/dist/components/SPortal/SPortal.cjs +8 -0
  103. package/dist/components/SPortal/SPortal.cjs.map +1 -1
  104. package/dist/components/SPortal/SPortal.js +8 -0
  105. package/dist/components/SPortal/SPortal.js.map +1 -1
  106. package/dist/components/SSelect/SSelect.cjs +76 -32
  107. package/dist/components/SSelect/SSelect.cjs.map +1 -1
  108. package/dist/components/SSelect/SSelect.js +76 -32
  109. package/dist/components/SSelect/SSelect.js.map +1 -1
  110. package/dist/components/STable/STable.cjs +133 -91
  111. package/dist/components/STable/STable.cjs.map +1 -1
  112. package/dist/components/STable/STable.js +133 -91
  113. package/dist/components/STable/STable.js.map +1 -1
  114. package/dist/components/STextLink/STextLink.cjs +137 -3
  115. package/dist/components/STextLink/STextLink.cjs.map +1 -1
  116. package/dist/components/STextLink/STextLink.d.ts +1 -1
  117. package/dist/components/STextLink/STextLink.js +118 -4
  118. package/dist/components/STextLink/STextLink.js.map +1 -1
  119. package/dist/components/STextarea/STextarea.cjs +226 -21
  120. package/dist/components/STextarea/STextarea.cjs.map +1 -1
  121. package/dist/components/STextarea/STextarea.js +226 -21
  122. package/dist/components/STextarea/STextarea.js.map +1 -1
  123. package/dist/components/SToast/SToast.cjs +8 -0
  124. package/dist/components/SToast/SToast.cjs.map +1 -1
  125. package/dist/components/SToast/SToast.js +8 -0
  126. package/dist/components/SToast/SToast.js.map +1 -1
  127. package/dist/components/SToast/SToastContainer.cjs +11 -3
  128. package/dist/components/SToast/SToastContainer.cjs.map +1 -1
  129. package/dist/components/SToast/SToastContainer.js +11 -3
  130. package/dist/components/SToast/SToastContainer.js.map +1 -1
  131. package/dist/components/STooltip/STooltip.cjs +217 -14
  132. package/dist/components/STooltip/STooltip.cjs.map +1 -1
  133. package/dist/components/STooltip/STooltip.js +217 -14
  134. package/dist/components/STooltip/STooltip.js.map +1 -1
  135. package/dist/index.cjs +532 -300
  136. package/dist/index.cjs.map +1 -1
  137. package/dist/index.js +531 -300
  138. package/dist/index.js.map +1 -1
  139. package/dist/lib/floating-anim.cjs +8 -0
  140. package/dist/lib/floating-anim.cjs.map +1 -1
  141. package/dist/lib/floating-anim.d.ts +5 -1
  142. package/dist/lib/floating-anim.js +8 -0
  143. package/dist/lib/floating-anim.js.map +1 -1
  144. package/dist/styles.css +175 -66
  145. package/dist/theme.css +49 -22
  146. package/package.json +1 -1
@@ -2951,11 +2951,11 @@ var RADIUS = 34;
2951
2951
  var STROKE = 12;
2952
2952
  var CIRCUMFERENCE = 2 * Math.PI * RADIUS;
2953
2953
  var COLOR_MAP = {
2954
- primary: { arc: "var(--cmp-spinner-color-arc)", track: "var(--cmp-spinner-color-track)" },
2954
+ primary: { arc: "var(--cmp-progress-active-color)", track: "var(--cmp-progress-color-track)" },
2955
2955
  // inverse: 어두운 배경용 — arc 흰색, track 은 흰색 40%(회색 링)
2956
2956
  inverse: { arc: "var(--color-white)", track: "rgba(255,255,255,0.4)" },
2957
- error: { arc: "var(--color-red-75)", track: "var(--cmp-spinner-color-track)" },
2958
- complete: { arc: "#01BB4B", track: "var(--cmp-spinner-color-track)" }
2957
+ error: { arc: "var(--color-red-75)", track: "var(--cmp-progress-color-track)" },
2958
+ complete: { arc: "#01BB4B", track: "var(--cmp-progress-color-track)" }
2959
2959
  };
2960
2960
  var clamp = (v) => Number.isFinite(v) ? Math.max(0, Math.min(100, v)) : 0;
2961
2961
  var SCircleProgress = react.forwardRef(
@@ -2969,65 +2969,63 @@ var SCircleProgress = react.forwardRef(
2969
2969
  "div",
2970
2970
  {
2971
2971
  ref,
2972
- className: cn("inline-flex flex-col items-center gap-[8px]", className),
2972
+ className: cn(
2973
+ "inline-flex flex-col items-center gap-[var(--cmp-progress-circular-gap)]",
2974
+ className
2975
+ ),
2973
2976
  style,
2974
2977
  children: [
2975
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative h-[80px] w-[80px]", children: [
2976
- /* @__PURE__ */ jsxRuntime.jsxs(
2977
- "svg",
2978
- {
2979
- viewBox: `0 0 ${VIEWBOX} ${VIEWBOX}`,
2980
- xmlns: "http://www.w3.org/2000/svg",
2981
- className: cn(
2982
- "h-[80px] w-[80px]",
2983
- indeterminate && "origin-center animate-circle-spin"
2978
+ /* @__PURE__ */ jsxRuntime.jsxs(
2979
+ "svg",
2980
+ {
2981
+ viewBox: `0 0 ${VIEWBOX} ${VIEWBOX}`,
2982
+ xmlns: "http://www.w3.org/2000/svg",
2983
+ className: cn("h-[80px] w-[80px]", indeterminate && "origin-center animate-circle-spin"),
2984
+ children: [
2985
+ /* @__PURE__ */ jsxRuntime.jsx(
2986
+ "circle",
2987
+ {
2988
+ cx: c,
2989
+ cy: c,
2990
+ r: RADIUS,
2991
+ fill: "none",
2992
+ strokeWidth: STROKE,
2993
+ style: { stroke: colors.track }
2994
+ }
2984
2995
  ),
2985
- children: [
2986
- /* @__PURE__ */ jsxRuntime.jsx(
2987
- "circle",
2988
- {
2989
- cx: c,
2990
- cy: c,
2991
- r: RADIUS,
2992
- fill: "none",
2993
- strokeWidth: STROKE,
2994
- style: { stroke: colors.track }
2995
- }
2996
- ),
2997
- /* @__PURE__ */ jsxRuntime.jsx(
2998
- "circle",
2999
- {
3000
- cx: c,
3001
- cy: c,
3002
- r: RADIUS,
3003
- fill: "none",
3004
- strokeWidth: STROKE,
3005
- strokeLinecap: "round",
3006
- className: cn(
3007
- "origin-center",
3008
- indeterminate ? "animate-circle-arc" : "-rotate-90 transition-[stroke-dasharray] duration-[400ms] ease-linear"
3009
- ),
3010
- style: {
3011
- stroke: colors.arc,
3012
- ...indeterminate ? {} : { strokeDasharray: `${filled} ${CIRCUMFERENCE}`, strokeDashoffset: 0 }
3013
- }
2996
+ /* @__PURE__ */ jsxRuntime.jsx(
2997
+ "circle",
2998
+ {
2999
+ cx: c,
3000
+ cy: c,
3001
+ r: RADIUS,
3002
+ fill: "none",
3003
+ strokeWidth: STROKE,
3004
+ strokeLinecap: "round",
3005
+ className: cn(
3006
+ "origin-center",
3007
+ indeterminate ? "animate-circle-arc" : "-rotate-90 transition-[stroke-dasharray] duration-[400ms] ease-linear"
3008
+ ),
3009
+ style: {
3010
+ stroke: colors.arc,
3011
+ ...indeterminate ? {} : { strokeDasharray: `${filled} ${CIRCUMFERENCE}`, strokeDashoffset: 0 }
3014
3012
  }
3015
- )
3016
- ]
3017
- }
3018
- ),
3019
- !indeterminate && /* @__PURE__ */ jsxRuntime.jsxs(
3020
- "span",
3021
- {
3022
- className: "absolute inset-0 flex items-center justify-center text-[16px] font-bold leading-[26px]",
3023
- style: { color: percentColor },
3024
- children: [
3025
- Math.round(v),
3026
- "%"
3027
- ]
3028
- }
3029
- )
3030
- ] }),
3013
+ }
3014
+ )
3015
+ ]
3016
+ }
3017
+ ),
3018
+ !indeterminate && /* @__PURE__ */ jsxRuntime.jsxs(
3019
+ "span",
3020
+ {
3021
+ className: "text-center text-[16px] font-bold leading-[26px]",
3022
+ style: { color: percentColor },
3023
+ children: [
3024
+ Math.round(v),
3025
+ "%"
3026
+ ]
3027
+ }
3028
+ ),
3031
3029
  label && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-center text-[12px] font-normal leading-[20px] text-[color:var(--cmp-progress-color-label)]", children: label })
3032
3030
  ]
3033
3031
  }
@@ -3090,7 +3088,7 @@ function SPagination({
3090
3088
  style,
3091
3089
  children: [
3092
3090
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex min-w-[calc(var(--cmp-pagination-height)*2+var(--cmp-pagination-move-gap))] items-center justify-end gap-[var(--cmp-pagination-move-gap)]", children: prevButtons }),
3093
- simple ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex h-[var(--cmp-pagination-height)] items-center gap-[var(--cmp-pagination-move-gap)] px-[var(--cmp-pagination-paddingX)] text-[12px] font-medium leading-[20px] text-[color:var(--cmp-pagination-item-content-default)]", children: [
3091
+ simple ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex h-[var(--cmp-pagination-height)] items-center gap-[var(--cmp-pagination-simple-gap)] px-[var(--cmp-pagination-paddingX)] text-[12px] font-medium leading-[20px] text-[color:var(--cmp-pagination-item-content-default)]", children: [
3094
3092
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-bold text-[color:var(--cmp-pagination-item-content-selected)]", children: currentPage }),
3095
3093
  /* @__PURE__ */ jsxRuntime.jsx("span", { children: "/" }),
3096
3094
  /* @__PURE__ */ jsxRuntime.jsx("span", { children: lastPage })
@@ -3126,12 +3124,20 @@ function usePortalContainer() {
3126
3124
  // src/lib/floating-anim.ts
3127
3125
  var FLOATING_SLIDE_ANIM = [
3128
3126
  "data-[state=open]:data-[side=top]:animate-floating-in-top",
3127
+ "data-[state=delayed-open]:data-[side=top]:animate-floating-in-top",
3128
+ "data-[state=instant-open]:data-[side=top]:animate-floating-in-top",
3129
3129
  "data-[state=closed]:data-[side=top]:animate-floating-out-top",
3130
3130
  "data-[state=open]:data-[side=bottom]:animate-floating-in-bottom",
3131
+ "data-[state=delayed-open]:data-[side=bottom]:animate-floating-in-bottom",
3132
+ "data-[state=instant-open]:data-[side=bottom]:animate-floating-in-bottom",
3131
3133
  "data-[state=closed]:data-[side=bottom]:animate-floating-out-bottom",
3132
3134
  "data-[state=open]:data-[side=left]:animate-floating-in-left",
3135
+ "data-[state=delayed-open]:data-[side=left]:animate-floating-in-left",
3136
+ "data-[state=instant-open]:data-[side=left]:animate-floating-in-left",
3133
3137
  "data-[state=closed]:data-[side=left]:animate-floating-out-left",
3134
3138
  "data-[state=open]:data-[side=right]:animate-floating-in-right",
3139
+ "data-[state=delayed-open]:data-[side=right]:animate-floating-in-right",
3140
+ "data-[state=instant-open]:data-[side=right]:animate-floating-in-right",
3135
3141
  "data-[state=closed]:data-[side=right]:animate-floating-out-right"
3136
3142
  ].join(" ");
3137
3143
 
@@ -3326,7 +3332,8 @@ var HIDE_DELAY_MS = 100;
3326
3332
  function useBody(content, message = []) {
3327
3333
  if (content != null) return content;
3328
3334
  if (message.length === 0) return null;
3329
- return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: message.map((line, i) => /* @__PURE__ */ jsxRuntime.jsx("div", { children: line }, i)) });
3335
+ const singleLine = message.length === 1;
3336
+ return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: message.map((line, i) => /* @__PURE__ */ jsxRuntime.jsx("div", { className: singleLine ? "leading-[24px]" : void 0, children: line }, i)) });
3330
3337
  }
3331
3338
  var STooltip = react.forwardRef(function STooltip2({
3332
3339
  content,
@@ -3384,7 +3391,7 @@ var STooltip = react.forwardRef(function STooltip2({
3384
3391
  if (disabled || body == null) return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: triggerNode });
3385
3392
  const isHover = trigger === "hover";
3386
3393
  const contentClass = cn(
3387
- "z-50 max-w-xs rounded-[6px] px-[16px] py-[12px] text-[12px] leading-[20px]",
3394
+ "z-50 max-w-xs rounded-[6px] px-[16px] py-[12px] text-[12px] leading-[20px] shadow-[2px_2px_12px_2px_rgba(0,0,0,0.1)]",
3388
3395
  FLOATING_SLIDE_ANIM,
3389
3396
  className
3390
3397
  );
@@ -3429,11 +3436,17 @@ var STooltip = react.forwardRef(function STooltip2({
3429
3436
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-start gap-[12px]", children: [
3430
3437
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "min-w-0 flex-1", children: body }),
3431
3438
  useClose && /* @__PURE__ */ jsxRuntime.jsx(
3432
- RPopover2__namespace.Close,
3439
+ SGhostButton,
3433
3440
  {
3434
- "aria-label": "\uB2EB\uAE30",
3435
- className: "shrink-0 cursor-pointer opacity-70 hover:opacity-100",
3436
- children: /* @__PURE__ */ jsxRuntime.jsx(SIcon, { name: "close", size: 16, color: fg })
3441
+ icon: "close",
3442
+ size: "xs",
3443
+ intent: tooltipType === "default" ? "inverse" : "default",
3444
+ ariaLabel: "\uB2EB\uAE30",
3445
+ className: "shrink-0",
3446
+ onClick: () => {
3447
+ cancelHide();
3448
+ setOpen(false);
3449
+ }
3437
3450
  }
3438
3451
  )
3439
3452
  ] }),
@@ -3471,8 +3484,8 @@ function useFormField(field) {
3471
3484
  }, [ctx, name]);
3472
3485
  }
3473
3486
  var FIELD_SIZE = {
3474
- sm: { height: 28, radius: 4, fieldGap: 12, labelGap: 6, fontSize: 12, lineHeight: 20, icon: 12 },
3475
- md: { height: 36, radius: 6, fieldGap: 16, labelGap: 8, fontSize: 14, lineHeight: 24, icon: 12 }
3487
+ sm: { height: 28, radius: 4, fieldGap: 12, labelGap: 6, fontSize: 12, lineHeight: 20, icon: 16 },
3488
+ md: { height: 36, radius: 6, fieldGap: 16, labelGap: 8, fontSize: 14, lineHeight: 24, icon: 16 }
3476
3489
  };
3477
3490
  var ALIGN = {
3478
3491
  start: "flex-start",
@@ -3487,6 +3500,7 @@ var SField = react.forwardRef(function SField2({
3487
3500
  labelTooltip = "",
3488
3501
  labelTooltipProps,
3489
3502
  labelWidth,
3503
+ labelHeight,
3490
3504
  size = "sm",
3491
3505
  addonLabel = "",
3492
3506
  addonAlign = "start",
@@ -3501,6 +3515,7 @@ var SField = react.forwardRef(function SField2({
3501
3515
  readOnly = false,
3502
3516
  width,
3503
3517
  multiline = false,
3518
+ borderless = false,
3504
3519
  children,
3505
3520
  className,
3506
3521
  style,
@@ -3534,8 +3549,8 @@ var SField = react.forwardRef(function SField2({
3534
3549
  const resolvedSuccess = status === "pass";
3535
3550
  const showError = resolvedError && errorMessage !== "";
3536
3551
  const interactive = !disabled && !readOnly;
3537
- const borderColor = disabled ? "var(--color-grey-45)" : interactive && focused ? "var(--sys-color-field-border-focus)" : resolvedSuccess ? "var(--sys-color-field-border-success)" : resolvedError ? "var(--sys-color-field-border-danger)" : "var(--sys-color-field-border-default)";
3538
- const bgColor = disabled ? "var(--color-grey-30)" : readOnly ? "var(--sys-color-field-bg-readOnly)" : "var(--sys-color-field-bg-default)";
3552
+ const borderColor = borderless ? "transparent" : disabled ? "var(--color-grey-45)" : interactive && focused ? "var(--sys-color-field-border-focus)" : resolvedSuccess ? "var(--sys-color-field-border-success)" : resolvedError ? "var(--sys-color-field-border-danger)" : "var(--sys-color-field-border-default)";
3553
+ const bgColor = borderless ? "transparent" : disabled ? "var(--color-grey-30)" : readOnly ? "var(--sys-color-field-bg-readOnly)" : "var(--sys-color-field-bg-default)";
3539
3554
  const textColor = disabled ? "var(--color-grey-65)" : readOnly ? "var(--sys-color-field-text-readOnly)" : "var(--sys-color-field-text-default)";
3540
3555
  return /* @__PURE__ */ jsxRuntime.jsx(
3541
3556
  "div",
@@ -3552,7 +3567,7 @@ var SField = react.forwardRef(function SField2({
3552
3567
  {
3553
3568
  className: "flex shrink-0 items-center font-bold text-(--sys-color-field-text-default)",
3554
3569
  style: {
3555
- height: s.height,
3570
+ height: cssLen(labelHeight) ?? s.height,
3556
3571
  marginRight: s.fieldGap,
3557
3572
  width: cssLen(labelWidth),
3558
3573
  fontSize: s.fontSize,
@@ -3578,14 +3593,14 @@ var SField = react.forwardRef(function SField2({
3578
3593
  {
3579
3594
  className: cn(
3580
3595
  "relative box-border flex min-w-0 items-stretch overflow-hidden border border-solid border-(--field-bc)",
3581
- interactive && "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]",
3596
+ 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]",
3582
3597
  disabled && "cursor-not-allowed"
3583
3598
  ),
3584
3599
  style: {
3585
3600
  // @ts-expect-error CSS 변수
3586
3601
  "--field-bc": borderColor,
3587
3602
  // focused/hovered prop이 명시된 경우 강조를 즉시 반영
3588
- ...interactive && focused ? { boxShadow: "0px 0px 4px 0px #0071ff66" } : {},
3603
+ ...interactive && !borderless && focused ? { boxShadow: "0px 0px 4px 0px #0071ff66" } : {},
3589
3604
  ...multiline ? { minHeight: s.height } : { height: s.height },
3590
3605
  "width": cssLen(width),
3591
3606
  "borderRadius": s.radius,
@@ -3630,15 +3645,28 @@ function flattenOptions(options, depth = 1) {
3630
3645
  const out = [];
3631
3646
  for (const o of options) {
3632
3647
  const hasChildren = Array.isArray(o.children) && o.children.length > 0;
3633
- out.push({
3634
- value: String(o.value),
3635
- label: o.label,
3636
- disabled: !!o.disabled,
3637
- depth,
3638
- isGroup: hasChildren,
3639
- raw: o.value
3640
- });
3641
- if (hasChildren) out.push(...flattenOptions(o.children, depth + 1));
3648
+ if (hasChildren) {
3649
+ const childFlat = flattenOptions(o.children, depth + 1);
3650
+ const allChildrenDisabled = childFlat.every((c) => c.disabled);
3651
+ out.push({
3652
+ value: String(o.value),
3653
+ label: o.label,
3654
+ disabled: !!o.disabled || allChildrenDisabled,
3655
+ depth,
3656
+ isGroup: true,
3657
+ raw: o.value
3658
+ });
3659
+ out.push(...childFlat);
3660
+ } else {
3661
+ out.push({
3662
+ value: String(o.value),
3663
+ label: o.label,
3664
+ disabled: !!o.disabled,
3665
+ depth,
3666
+ isGroup: false,
3667
+ raw: o.value
3668
+ });
3669
+ }
3642
3670
  }
3643
3671
  return out;
3644
3672
  }
@@ -3762,6 +3790,9 @@ var SSelect = react.forwardRef(function SSelect2({
3762
3790
  );
3763
3791
  const flat = react.useMemo(() => flattenOptions(options), [options]);
3764
3792
  const selectable = react.useMemo(() => selectableOptions(flat), [flat]);
3793
+ const hasLeaf = react.useMemo(() => flat.some((o) => !o.isGroup), [flat]);
3794
+ const allOptionsDisabled = hasLeaf && selectable.length === 0;
3795
+ const effectiveDisabled = disabled || allOptionsDisabled;
3765
3796
  const showSearch = useSearch && selectable.length >= SEARCH_THRESHOLD;
3766
3797
  const labelByValue = react.useMemo(() => new Map(flat.map((o) => [o.value, o.label])), [flat]);
3767
3798
  const rawByValue = react.useMemo(() => new Map(flat.map((o) => [o.value, o.raw])), [flat]);
@@ -3812,6 +3843,7 @@ var SSelect = react.forwardRef(function SSelect2({
3812
3843
  const selectStore = /* @__PURE__ */ jsxRuntime.jsxs(
3813
3844
  Ariakit__namespace.SelectProvider,
3814
3845
  {
3846
+ animated: portalContainer == null ? 150 : false,
3815
3847
  value: multi ? selected : selected[0] ?? "",
3816
3848
  setValue: (v) => emit(Array.isArray(v) ? v : v === "" ? [] : [v]),
3817
3849
  open,
@@ -3827,10 +3859,10 @@ var SSelect = react.forwardRef(function SSelect2({
3827
3859
  Ariakit__namespace.Select,
3828
3860
  {
3829
3861
  ref: triggerRef,
3830
- disabled,
3862
+ disabled: effectiveDisabled,
3831
3863
  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",
3832
3864
  style: {
3833
- color: disabled ? "var(--cmp-select-text-disabled)" : isPlaceholder ? "var(--cmp-select-icon-default)" : "var(--cmp-select-text-default)"
3865
+ color: effectiveDisabled ? "var(--cmp-select-text-disabled)" : isPlaceholder ? "var(--cmp-select-icon-default)" : "var(--cmp-select-text-default)"
3834
3866
  },
3835
3867
  children: [
3836
3868
  isHtmlLabel(triggerText) ? /* @__PURE__ */ jsxRuntime.jsx(
@@ -3845,7 +3877,7 @@ var SSelect = react.forwardRef(function SSelect2({
3845
3877
  {
3846
3878
  name: "chevronDown",
3847
3879
  size: 12,
3848
- color: disabled ? "var(--cmp-select-icon-disabled)" : "var(--cmp-select-icon-default)",
3880
+ color: effectiveDisabled ? "var(--cmp-select-icon-disabled)" : "var(--cmp-select-icon-default)",
3849
3881
  className: cn("shrink-0 transition-transform duration-200", open && "rotate-180")
3850
3882
  }
3851
3883
  )
@@ -3859,7 +3891,7 @@ var SSelect = react.forwardRef(function SSelect2({
3859
3891
  portalElement: portalContainer,
3860
3892
  gutter: 4,
3861
3893
  sameWidth: !dropdownWidth,
3862
- className: "z-50 overflow-auto rounded-[var(--cmp-listBox-radius)] bg-[var(--cmp-listBox-bg)] py-[4px] shadow-[2px_2px_12px_2px_rgba(0,0,0,0.1)]",
3894
+ className: "z-50 overflow-auto rounded-[var(--cmp-listBox-radius)] bg-[var(--cmp-listBox-bg)] shadow-[2px_2px_12px_2px_rgba(0,0,0,0.1)] data-[enter]:animate-floating-in-bottom data-[leave]:animate-floating-out-bottom",
3863
3895
  style: {
3864
3896
  maxHeight: dropdownHeight,
3865
3897
  ...dropdownWidth ? { width: dropdownWidth } : {},
@@ -3900,7 +3932,7 @@ var SSelect = react.forwardRef(function SSelect2({
3900
3932
  ),
3901
3933
  hasItems ? /* @__PURE__ */ jsxRuntime.jsx(ItemList, { items: filtered, multi, selected, useSearch: showSearch }) : (
3902
3934
  // 원본 sd-select-listbox__empty (표시할 항목이 없을 때)
3903
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "px-[12px] py-[12px] text-center text-[12px] leading-[20px] text-[color:var(--cmp-listItem-content-disabled)]", children: "\uD45C\uC2DC\uD560 \uD56D\uBAA9\uC774 \uC5C6\uC2B5\uB2C8\uB2E4." })
3935
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "px-[12px] py-[12px] text-left text-[12px] leading-[20px] text-[color:var(--cmp-listItem-content-disabled)]", children: "\uD45C\uC2DC\uD560 \uD56D\uBAA9\uC774 \uC5C6\uC2B5\uB2C8\uB2E4." })
3904
3936
  )
3905
3937
  ]
3906
3938
  }
@@ -3923,7 +3955,7 @@ var SSelect = react.forwardRef(function SSelect2({
3923
3955
  error: error || ruleError !== "",
3924
3956
  status: rules && rules.length > 0 ? ruleError !== "" ? "error" : void 0 : void 0,
3925
3957
  errorMessage: ruleError !== "" ? ruleError : errorMessage,
3926
- disabled,
3958
+ disabled: effectiveDisabled,
3927
3959
  width,
3928
3960
  className,
3929
3961
  style,
@@ -3958,7 +3990,11 @@ function ItemList({
3958
3990
  {
3959
3991
  className: cn(
3960
3992
  "select-none py-[4px] pr-[12px] text-[12px] leading-[20px] text-[color:var(--cmp-listItem-content-default)]",
3961
- isDepth1 ? "border-t border-solid border-[color:var(--cmp-listItem-depth1-border-color)] bg-[var(--cmp-listItem-depth1-bg-default)] font-bold" : "bg-[var(--cmp-listItem-depth2-middle-bg)] font-medium"
3993
+ isDepth1 ? "border-t border-solid border-[color:var(--cmp-listItem-depth1-border-color)] bg-[var(--cmp-listItem-depth1-bg-default)] font-bold" : "bg-[var(--cmp-listItem-depth2-middle-bg)] font-medium",
3994
+ // 하위가 전부 비활성이면(select.config 에서 bubble-up) 어미 그룹도 비활성 처리:
3995
+ // 텍스트는 회색(#888), depth1 그룹은 파란 배경 대신 회색(#EEE)으로 (depth2 는 #F6F6F6 유지)
3996
+ o.disabled && "text-[color:var(--cmp-listItem-content-disabled)]",
3997
+ o.disabled && isDepth1 && "bg-[var(--cmp-listItem-depth1-bg-disabled)]"
3962
3998
  ),
3963
3999
  style: { paddingLeft: padLeft },
3964
4000
  children: o.label
@@ -3985,15 +4021,21 @@ function ItemList({
3985
4021
  "span",
3986
4022
  {
3987
4023
  className: cn(
3988
- "flex h-[16px] w-[16px] flex-shrink-0 items-center justify-center rounded-[2px] border border-solid group-data-[active-item]:border-[color:var(--cmp-checkbox-checked-border-inverse)]",
3989
- isSelected ? "border-[color:var(--cmp-checkbox-checked-bg-default)] bg-[var(--cmp-checkbox-checked-bg-default)] group-data-[active-item]:bg-transparent" : "border-[color:var(--cmp-checkbox-unchecked-border-default)] bg-transparent"
4024
+ "flex h-[16px] w-[16px] flex-shrink-0 items-center justify-center rounded-[2px] border border-solid",
4025
+ o.disabled ? (
4026
+ // 비활성: 회색 채움(#E1E1E1) + 회색 테두리(#CCCCCC)
4027
+ "border-[color:var(--cmp-checkbox-border-disabled)] bg-[var(--cmp-checkbox-bg-disabled)]"
4028
+ ) : cn(
4029
+ "group-data-[active-item]:border-[color:var(--cmp-checkbox-checked-border-inverse)]",
4030
+ isSelected ? "border-[color:var(--cmp-checkbox-checked-bg-default)] bg-[var(--cmp-checkbox-checked-bg-default)] group-data-[active-item]:bg-transparent" : "border-[color:var(--cmp-checkbox-unchecked-border-default)] bg-transparent"
4031
+ )
3990
4032
  ),
3991
4033
  children: isSelected && /* @__PURE__ */ jsxRuntime.jsx(
3992
4034
  SIcon,
3993
4035
  {
3994
4036
  name: "checkboxCheck",
3995
4037
  size: 12,
3996
- color: "var(--cmp-checkbox-checked-icon-default)"
4038
+ color: o.disabled ? "var(--cmp-checkbox-checked-icon-disabled)" : "var(--cmp-checkbox-checked-icon-default)"
3997
4039
  }
3998
4040
  )
3999
4041
  }