sellmate-design-system-react 0.6.1 → 0.8.0

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 (92) hide show
  1. package/dist/components/SBarcodeInput/SBarcodeInput.cjs +62 -48
  2. package/dist/components/SBarcodeInput/SBarcodeInput.cjs.map +1 -1
  3. package/dist/components/SBarcodeInput/SBarcodeInput.js +62 -48
  4. package/dist/components/SBarcodeInput/SBarcodeInput.js.map +1 -1
  5. package/dist/components/SChipInput/SChipInput.cjs +62 -48
  6. package/dist/components/SChipInput/SChipInput.cjs.map +1 -1
  7. package/dist/components/SChipInput/SChipInput.js +62 -48
  8. package/dist/components/SChipInput/SChipInput.js.map +1 -1
  9. package/dist/components/SDatePicker/SDatePicker.cjs +62 -48
  10. package/dist/components/SDatePicker/SDatePicker.cjs.map +1 -1
  11. package/dist/components/SDatePicker/SDatePicker.js +62 -48
  12. package/dist/components/SDatePicker/SDatePicker.js.map +1 -1
  13. package/dist/components/SDateRangePicker/SDateRangePicker.cjs +62 -48
  14. package/dist/components/SDateRangePicker/SDateRangePicker.cjs.map +1 -1
  15. package/dist/components/SDateRangePicker/SDateRangePicker.js +62 -48
  16. package/dist/components/SDateRangePicker/SDateRangePicker.js.map +1 -1
  17. package/dist/components/SField/SField.cjs +62 -48
  18. package/dist/components/SField/SField.cjs.map +1 -1
  19. package/dist/components/SField/SField.d.ts +6 -1
  20. package/dist/components/SField/SField.js +62 -48
  21. package/dist/components/SField/SField.js.map +1 -1
  22. package/dist/components/SFilePicker/SFilePicker.cjs +62 -48
  23. package/dist/components/SFilePicker/SFilePicker.cjs.map +1 -1
  24. package/dist/components/SFilePicker/SFilePicker.js +62 -48
  25. package/dist/components/SFilePicker/SFilePicker.js.map +1 -1
  26. package/dist/components/SInput/SInput.cjs +62 -48
  27. package/dist/components/SInput/SInput.cjs.map +1 -1
  28. package/dist/components/SInput/SInput.js +62 -48
  29. package/dist/components/SInput/SInput.js.map +1 -1
  30. package/dist/components/SKeyValueTable/SKeyValueTable.cjs +74 -49
  31. package/dist/components/SKeyValueTable/SKeyValueTable.cjs.map +1 -1
  32. package/dist/components/SKeyValueTable/SKeyValueTable.js +74 -49
  33. package/dist/components/SKeyValueTable/SKeyValueTable.js.map +1 -1
  34. package/dist/components/SNumberInput/SNumberInput.cjs +62 -48
  35. package/dist/components/SNumberInput/SNumberInput.cjs.map +1 -1
  36. package/dist/components/SNumberInput/SNumberInput.js +62 -48
  37. package/dist/components/SNumberInput/SNumberInput.js.map +1 -1
  38. package/dist/components/SPage/SPage.cjs +19 -2
  39. package/dist/components/SPage/SPage.cjs.map +1 -1
  40. package/dist/components/SPage/SPage.d.ts +7 -1
  41. package/dist/components/SPage/SPage.js +19 -2
  42. package/dist/components/SPage/SPage.js.map +1 -1
  43. package/dist/components/SPage/index.d.ts +1 -0
  44. package/dist/components/SPage/page.config.d.ts +8 -0
  45. package/dist/components/SPopup/SPopup.cjs +18 -1
  46. package/dist/components/SPopup/SPopup.cjs.map +1 -1
  47. package/dist/components/SPopup/SPopup.js +18 -1
  48. package/dist/components/SPopup/SPopup.js.map +1 -1
  49. package/dist/components/SScrollArea/SScrollArea.cjs +64 -0
  50. package/dist/components/SScrollArea/SScrollArea.cjs.map +1 -0
  51. package/dist/components/SScrollArea/SScrollArea.d.ts +21 -0
  52. package/dist/components/SScrollArea/SScrollArea.js +62 -0
  53. package/dist/components/SScrollArea/SScrollArea.js.map +1 -0
  54. package/dist/components/SScrollArea/index.d.ts +2 -0
  55. package/dist/components/SScrollArea/scrollArea.config.d.ts +2 -0
  56. package/dist/components/SSelect/SSelect.cjs +74 -49
  57. package/dist/components/SSelect/SSelect.cjs.map +1 -1
  58. package/dist/components/SSelect/SSelect.js +74 -49
  59. package/dist/components/SSelect/SSelect.js.map +1 -1
  60. package/dist/components/SStepper/SStepper.cjs +7 -11
  61. package/dist/components/SStepper/SStepper.cjs.map +1 -1
  62. package/dist/components/SStepper/SStepper.js +7 -11
  63. package/dist/components/SStepper/SStepper.js.map +1 -1
  64. package/dist/components/STable/STable.cjs +83 -55
  65. package/dist/components/STable/STable.cjs.map +1 -1
  66. package/dist/components/STable/STable.d.ts +2 -0
  67. package/dist/components/STable/STable.js +83 -55
  68. package/dist/components/STable/STable.js.map +1 -1
  69. package/dist/components/STextarea/STextarea.cjs +62 -48
  70. package/dist/components/STextarea/STextarea.cjs.map +1 -1
  71. package/dist/components/STextarea/STextarea.js +62 -48
  72. package/dist/components/STextarea/STextarea.js.map +1 -1
  73. package/dist/components/STimePicker/STimePicker.cjs +91 -54
  74. package/dist/components/STimePicker/STimePicker.cjs.map +1 -1
  75. package/dist/components/STimePicker/STimePicker.js +91 -54
  76. package/dist/components/STimePicker/STimePicker.js.map +1 -1
  77. package/dist/components/STimeRangePicker/STimeRangePicker.cjs +93 -54
  78. package/dist/components/STimeRangePicker/STimeRangePicker.cjs.map +1 -1
  79. package/dist/components/STimeRangePicker/STimeRangePicker.js +93 -54
  80. package/dist/components/STimeRangePicker/STimeRangePicker.js.map +1 -1
  81. package/dist/index.cjs +220 -81
  82. package/dist/index.cjs.map +1 -1
  83. package/dist/index.d.ts +1 -0
  84. package/dist/index.js +218 -82
  85. package/dist/index.js.map +1 -1
  86. package/dist/lib/scrollbar.cjs +15 -0
  87. package/dist/lib/scrollbar.cjs.map +1 -0
  88. package/dist/lib/scrollbar.d.ts +32 -0
  89. package/dist/lib/scrollbar.js +10 -0
  90. package/dist/lib/scrollbar.js.map +1 -0
  91. package/dist/styles.css +168 -17
  92. package/package.json +1 -1
package/dist/index.d.ts CHANGED
@@ -5,6 +5,7 @@ export * from './components/SIcon';
5
5
  export * from './components/SBadge';
6
6
  export * from './components/SCard';
7
7
  export * from './components/SDivider';
8
+ export * from './components/SScrollArea';
8
9
  export * from './components/STag';
9
10
  export * from './components/SButton';
10
11
  export * from './components/SCallout';
package/dist/index.js CHANGED
@@ -2909,6 +2909,52 @@ var SDivider = forwardRef(function SDivider2({ vertical = false, className, styl
2909
2909
  );
2910
2910
  });
2911
2911
 
2912
+ // src/lib/scrollbar.ts
2913
+ var FIREFOX_SCROLLBAR_CLASS = "supports-[not_selector(::-webkit-scrollbar)]:[scrollbar-width:thin] supports-[not_selector(::-webkit-scrollbar)]:[scrollbar-color:var(--color-grey-45)_transparent]";
2914
+ var SCROLLBAR_CLASS = `${FIREFOX_SCROLLBAR_CLASS} [&::-webkit-scrollbar]:h-[12px] [&::-webkit-scrollbar]:w-[12px] [&::-webkit-scrollbar]:bg-transparent [&::-webkit-scrollbar-track]:bg-transparent [&::-webkit-scrollbar-thumb]:rounded-full [&::-webkit-scrollbar-thumb]:border-2 [&::-webkit-scrollbar-thumb]:border-solid [&::-webkit-scrollbar-thumb]:border-transparent [&::-webkit-scrollbar-thumb]:bg-[var(--color-grey-45)] [&::-webkit-scrollbar-thumb]:bg-clip-padding`;
2915
+ var SCROLLBAR_TRACK_BG_CLASS = "supports-[not_selector(::-webkit-scrollbar)]:[scrollbar-color:var(--color-grey-45)_var(--color-grey-10)] [&::-webkit-scrollbar]:bg-[var(--color-grey-10)] [&::-webkit-scrollbar-track]:bg-[var(--color-grey-10)]";
2916
+ var SCROLLBAR_TRACK_BG_WHITE_CLASS = "supports-[not_selector(::-webkit-scrollbar)]:[scrollbar-color:var(--color-grey-45)_var(--color-white)] [&::-webkit-scrollbar]:bg-[var(--color-white)] [&::-webkit-scrollbar-track]:bg-[var(--color-white)]";
2917
+ var SCROLLBAR_TRACK_BORDER_CLASS = "[&::-webkit-scrollbar-track:vertical]:[border-left:1px_solid_var(--sys-color-border-default)] [&::-webkit-scrollbar-track:horizontal]:[border-top:1px_solid_var(--sys-color-border-default)] [&::-webkit-scrollbar-thumb:vertical]:[border-left-width:3px] [&::-webkit-scrollbar-thumb:horizontal]:[border-top-width:3px]";
2918
+ var AXIS_CLASS = {
2919
+ vertical: "overflow-x-hidden overflow-y-auto",
2920
+ horizontal: "overflow-x-auto overflow-y-hidden",
2921
+ both: "overflow-auto"
2922
+ };
2923
+ var SScrollArea = forwardRef(function SScrollArea2({
2924
+ axis = "both",
2925
+ background = false,
2926
+ bordered = false,
2927
+ maxHeight,
2928
+ maxWidth,
2929
+ className,
2930
+ style,
2931
+ children,
2932
+ ...rest
2933
+ }, ref) {
2934
+ const mergedStyle = { ...style };
2935
+ if (maxHeight) mergedStyle.maxHeight = maxHeight;
2936
+ if (maxWidth) mergedStyle.maxWidth = maxWidth;
2937
+ return /* @__PURE__ */ jsx(
2938
+ "div",
2939
+ {
2940
+ ref,
2941
+ className: cn(
2942
+ AXIS_CLASS[axis],
2943
+ SCROLLBAR_CLASS,
2944
+ background && SCROLLBAR_TRACK_BG_CLASS,
2945
+ bordered && SCROLLBAR_TRACK_BORDER_CLASS,
2946
+ className
2947
+ ),
2948
+ style: mergedStyle,
2949
+ ...rest,
2950
+ children
2951
+ }
2952
+ );
2953
+ });
2954
+
2955
+ // src/components/SScrollArea/scrollArea.config.ts
2956
+ var SCROLL_AREA_AXES = ["vertical", "horizontal", "both"];
2957
+
2912
2958
  // src/components/STag/tag.config.ts
2913
2959
  var TAG_SHAPES = ["square", "pill"];
2914
2960
  var TAG_SIZES = ["xs", "sm", "md"];
@@ -4444,7 +4490,18 @@ var SPopup = forwardRef(function SPopup2({
4444
4490
  )
4445
4491
  }
4446
4492
  ),
4447
- /* @__PURE__ */ jsx("div", { className: "min-h-0 flex-1 overflow-auto", children }),
4493
+ /* @__PURE__ */ jsx(
4494
+ "div",
4495
+ {
4496
+ className: cn(
4497
+ "min-h-0 flex-1 overflow-auto",
4498
+ SCROLLBAR_CLASS,
4499
+ SCROLLBAR_TRACK_BG_CLASS,
4500
+ SCROLLBAR_TRACK_BORDER_CLASS
4501
+ ),
4502
+ children
4503
+ }
4504
+ ),
4448
4505
  useFooter && /* @__PURE__ */ jsxs(
4449
4506
  "footer",
4450
4507
  {
@@ -5505,14 +5562,24 @@ var SGnb = forwardRef(function SGnb2({
5505
5562
  }
5506
5563
  );
5507
5564
  });
5508
- var SPage = forwardRef(function SPage2({ className, style, children, ...rest }, ref) {
5565
+ var BACKGROUND_CLASS = {
5566
+ frame: `bg-[var(--sys-color-bg-frame)] ${SCROLLBAR_TRACK_BORDER_CLASS} ${SCROLLBAR_TRACK_BG_CLASS}`,
5567
+ neutral: `bg-[var(--sys-color-bg-neutralLight)] ${SCROLLBAR_TRACK_BORDER_CLASS} ${SCROLLBAR_TRACK_BG_WHITE_CLASS}`,
5568
+ screen: `bg-[var(--sys-color-bg-screen)] ${SCROLLBAR_TRACK_BORDER_CLASS} ${SCROLLBAR_TRACK_BG_CLASS}`
5569
+ };
5570
+ var SPage = forwardRef(function SPage2({ background = "frame", className, style, children, ...rest }, ref) {
5509
5571
  const layout = useContext(SLayoutContext);
5510
5572
  const gridStyle = layout?.header === "full" ? { gridColumn: 2, gridRow: 2 } : void 0;
5511
5573
  return /* @__PURE__ */ jsx(
5512
5574
  "main",
5513
5575
  {
5514
5576
  ref,
5515
- className: cn("box-border min-h-0 min-w-0 flex-1 overflow-auto p-20", className),
5577
+ className: cn(
5578
+ "box-border min-h-0 min-w-0 flex-1 overflow-auto p-20",
5579
+ SCROLLBAR_CLASS,
5580
+ BACKGROUND_CLASS[background],
5581
+ className
5582
+ ),
5516
5583
  style: { ...gridStyle, ...style },
5517
5584
  ...rest,
5518
5585
  children
@@ -5520,6 +5587,9 @@ var SPage = forwardRef(function SPage2({ className, style, children, ...rest },
5520
5587
  );
5521
5588
  });
5522
5589
 
5590
+ // src/components/SPage/page.config.ts
5591
+ var PAGE_BACKGROUNDS = ["frame", "neutral", "screen"];
5592
+
5523
5593
  // src/components/STabs/tabs.config.ts
5524
5594
  var TAB_MAIN_SIZE = {
5525
5595
  md: { height: 36, paddingX: 24 },
@@ -5882,7 +5952,7 @@ function SStepper({
5882
5952
  "aria-hidden": true,
5883
5953
  className: "inline-flex h-px shrink-0 items-center",
5884
5954
  style: { width: STEPPER_LAYOUT.dashWidth, color: STEPPER_COLORS.dash },
5885
- children: /* @__PURE__ */ jsx(
5955
+ children: /* @__PURE__ */ jsxs(
5886
5956
  "svg",
5887
5957
  {
5888
5958
  width: "20",
@@ -5890,16 +5960,12 @@ function SStepper({
5890
5960
  viewBox: "0 0 20 1",
5891
5961
  fill: "none",
5892
5962
  xmlns: "http://www.w3.org/2000/svg",
5893
- children: /* @__PURE__ */ jsx(
5894
- "line",
5895
- {
5896
- y1: "0.5",
5897
- x2: "20",
5898
- y2: "0.5",
5899
- stroke: "#888888",
5900
- strokeDasharray: "4 4"
5901
- }
5902
- )
5963
+ children: [
5964
+ /* @__PURE__ */ jsx("rect", { width: "1.6", height: "1", fill: "#888888" }),
5965
+ /* @__PURE__ */ jsx("rect", { x: "5", width: "3.3", height: "1", fill: "#888888" }),
5966
+ /* @__PURE__ */ jsx("rect", { x: "11.7", width: "3.3", height: "1", fill: "#888888" }),
5967
+ /* @__PURE__ */ jsx("rect", { x: "18.4", width: "1.6", height: "1", fill: "#888888" })
5968
+ ]
5903
5969
  }
5904
5970
  )
5905
5971
  }
@@ -6040,6 +6106,7 @@ var SField = forwardRef(function SField2({
6040
6106
  disabled = false,
6041
6107
  readOnly = false,
6042
6108
  width,
6109
+ minWidth,
6043
6110
  multiline = false,
6044
6111
  borderless = false,
6045
6112
  children,
@@ -6075,6 +6142,7 @@ var SField = forwardRef(function SField2({
6075
6142
  const resolvedSuccess = status === "pass";
6076
6143
  const showError = resolvedError && errorMessage !== "";
6077
6144
  const interactive = !disabled && !readOnly;
6145
+ const hug = cssLen(width) !== void 0;
6078
6146
  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)";
6079
6147
  const bgColor = borderless ? "transparent" : disabled ? "var(--color-grey-30)" : readOnly ? "var(--sys-color-field-bg-readOnly)" : "var(--sys-color-field-bg-default)";
6080
6148
  const textColor = disabled ? "var(--color-grey-65)" : readOnly ? "var(--sys-color-field-text-readOnly)" : "var(--sys-color-field-text-default)";
@@ -6083,7 +6151,13 @@ var SField = forwardRef(function SField2({
6083
6151
  {
6084
6152
  ref: rootRef,
6085
6153
  "data-name": name || void 0,
6086
- className: cn("inline-flex h-fit w-full flex-col", className),
6154
+ className: cn(
6155
+ "h-fit flex-col",
6156
+ // hug 시 inline-flex 를 유지하면 기존에 세로로 쌓여 있던 필드들이 한 줄에 붙어버리므로
6157
+ // 블록 레벨(flex)로 두어 쌓임은 그대로 유지한다. 나란히 놓으려면 부모를 flex 로.
6158
+ hug ? "flex w-fit max-w-full" : "inline-flex w-full",
6159
+ className
6160
+ ),
6087
6161
  style,
6088
6162
  onMouseEnter,
6089
6163
  onMouseLeave,
@@ -6121,54 +6195,60 @@ var SField = forwardRef(function SField2({
6121
6195
  ]
6122
6196
  }
6123
6197
  ),
6124
- /* @__PURE__ */ jsxs("div", { className: "flex min-w-0 flex-1 flex-col", children: [
6125
- /* @__PURE__ */ jsxs(
6126
- "div",
6127
- {
6128
- className: cn(
6129
- "relative box-border flex min-w-0 items-stretch overflow-hidden border border-solid border-(--field-bc)",
6130
- 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]",
6131
- disabled && "cursor-not-allowed"
6198
+ /* @__PURE__ */ jsxs(
6199
+ "div",
6200
+ {
6201
+ className: cn("flex min-w-0 flex-col", !hug && "flex-1"),
6202
+ style: { width: cssLen(width), minWidth: cssLen(minWidth) },
6203
+ children: [
6204
+ /* @__PURE__ */ jsxs(
6205
+ "div",
6206
+ {
6207
+ className: cn(
6208
+ "relative box-border flex min-w-0 items-stretch overflow-hidden border border-solid border-(--field-bc)",
6209
+ 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]",
6210
+ disabled && "cursor-not-allowed"
6211
+ ),
6212
+ style: {
6213
+ // @ts-expect-error CSS 변수
6214
+ "--field-bc": borderColor,
6215
+ // focused/hovered prop이 명시된 경우 강조를 즉시 반영
6216
+ ...interactive && !borderless && focused ? { boxShadow: "0px 0px 4px 0px #0071ff66" } : {},
6217
+ ...multiline ? { minHeight: s.height } : { height: s.height },
6218
+ "borderRadius": s.radius,
6219
+ "background": bgColor,
6220
+ "color": textColor
6221
+ },
6222
+ "data-focused": focused || void 0,
6223
+ "data-hovered": hovered || void 0,
6224
+ children: [
6225
+ effectiveAddonLabel !== "" && /* @__PURE__ */ jsxs(
6226
+ "div",
6227
+ {
6228
+ 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-20",
6229
+ style: {
6230
+ // 원본 sd-field: labelWidth가 addon 폭(--sd-field-addon-width)에도 적용됨
6231
+ width: cssLen(labelWidth),
6232
+ justifyContent: ALIGN[addonAlign],
6233
+ background: "var(--cmp-field-addonLabel-bg)",
6234
+ borderRightColor: disabled ? "var(--cmp-field-addonLabel-border-disabled)" : "var(--cmp-field-addonLabel-border-default)",
6235
+ borderTopLeftRadius: s.radius - 1,
6236
+ borderBottomLeftRadius: s.radius - 1
6237
+ },
6238
+ children: [
6239
+ icon && !label && /* @__PURE__ */ jsx(SIcon, { name: icon, size: s.icon, color: iconColor }),
6240
+ effectiveAddonLabel
6241
+ ]
6242
+ }
6243
+ ),
6244
+ /* @__PURE__ */ jsx("div", { className: "flex min-w-0 flex-1", children })
6245
+ ]
6246
+ }
6132
6247
  ),
6133
- style: {
6134
- // @ts-expect-error CSS 변수
6135
- "--field-bc": borderColor,
6136
- // focused/hovered prop이 명시된 경우 강조를 즉시 반영
6137
- ...interactive && !borderless && focused ? { boxShadow: "0px 0px 4px 0px #0071ff66" } : {},
6138
- ...multiline ? { minHeight: s.height } : { height: s.height },
6139
- "width": cssLen(width),
6140
- "borderRadius": s.radius,
6141
- "background": bgColor,
6142
- "color": textColor
6143
- },
6144
- "data-focused": focused || void 0,
6145
- "data-hovered": hovered || void 0,
6146
- children: [
6147
- effectiveAddonLabel !== "" && /* @__PURE__ */ jsxs(
6148
- "div",
6149
- {
6150
- 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-20",
6151
- style: {
6152
- // 원본 sd-field: labelWidth가 addon 폭(--sd-field-addon-width)에도 적용됨
6153
- width: cssLen(labelWidth),
6154
- justifyContent: ALIGN[addonAlign],
6155
- background: "var(--cmp-field-addonLabel-bg)",
6156
- borderRightColor: disabled ? "var(--cmp-field-addonLabel-border-disabled)" : "var(--cmp-field-addonLabel-border-default)",
6157
- borderTopLeftRadius: s.radius - 1,
6158
- borderBottomLeftRadius: s.radius - 1
6159
- },
6160
- children: [
6161
- icon && !label && /* @__PURE__ */ jsx(SIcon, { name: icon, size: s.icon, color: iconColor }),
6162
- effectiveAddonLabel
6163
- ]
6164
- }
6165
- ),
6166
- /* @__PURE__ */ jsx("div", { className: "flex min-w-0 flex-1", children })
6167
- ]
6168
- }
6169
- ),
6170
- showError ? /* @__PURE__ */ jsx("div", { className: "mt-(--cmp-field-contents-gap) text-12 font-normal leading-20 text-(--cmp-field-errorMessage-color)", children: errorMessage }) : hint !== "" ? /* @__PURE__ */ jsx("div", { className: "mt-(--cmp-field-contents-gap) text-12 font-normal leading-20 text-(--cmp-field-hint-color)", children: hint }) : null
6171
- ] })
6248
+ showError ? /* @__PURE__ */ jsx("div", { className: "mt-(--cmp-field-contents-gap) text-12 font-normal leading-20 text-(--cmp-field-errorMessage-color)", children: errorMessage }) : hint !== "" ? /* @__PURE__ */ jsx("div", { className: "mt-(--cmp-field-contents-gap) text-12 font-normal leading-20 text-(--cmp-field-hint-color)", children: hint }) : null
6249
+ ]
6250
+ }
6251
+ )
6172
6252
  ] })
6173
6253
  }
6174
6254
  );
@@ -6517,7 +6597,12 @@ var SSelect = forwardRef(function SSelect2({
6517
6597
  "div",
6518
6598
  {
6519
6599
  ref: listRef,
6520
- className: "overflow-auto [scrollbar-width:auto] [&::-webkit-scrollbar]:w-[8px] [&::-webkit-scrollbar]:bg-[var(--color-grey-25)] [&::-webkit-scrollbar:horizontal]:h-[8px] [&::-webkit-scrollbar-thumb]:rounded-[4px] [&::-webkit-scrollbar-thumb]:bg-[var(--color-grey-45)] [&::-webkit-scrollbar-track]:bg-[var(--color-grey-25)]",
6600
+ className: cn(
6601
+ "overflow-auto",
6602
+ SCROLLBAR_CLASS,
6603
+ SCROLLBAR_TRACK_BG_CLASS,
6604
+ SCROLLBAR_TRACK_BORDER_CLASS
6605
+ ),
6521
6606
  style: { maxHeight: dropdownHeight },
6522
6607
  onMouseLeave: () => setFocusedIndex(-1),
6523
6608
  children: [
@@ -7006,7 +7091,7 @@ var STable = forwardRef(function STable2({
7006
7091
  position: "sticky",
7007
7092
  left: isLeft ? "var(--sticky-left-offset)" : void 0,
7008
7093
  right: isRight ? "var(--sticky-right-offset)" : void 0,
7009
- zIndex: 3
7094
+ zIndex: 6
7010
7095
  };
7011
7096
  };
7012
7097
  const stickyShadowClass = (i) => {
@@ -7032,6 +7117,9 @@ var STable = forwardRef(function STable2({
7032
7117
  onScroll: handleScroll,
7033
7118
  className: cn(
7034
7119
  "bg-white relative overflow-auto border border-solid border-[color:var(--cmp-table-border-color)]",
7120
+ SCROLLBAR_CLASS,
7121
+ SCROLLBAR_TRACK_BG_CLASS,
7122
+ SCROLLBAR_TRACK_BORDER_CLASS,
7035
7123
  radiusClass,
7036
7124
  // 원본 sd-table__scroll-container--loading/--no-data: 로딩·데이터 없음 시 스크롤·인터랙션 차단
7037
7125
  (isLoading || rowCount === 0) && "overflow-hidden pointer-events-none"
@@ -7060,7 +7148,7 @@ var STable = forwardRef(function STable2({
7060
7148
  {
7061
7149
  className: cn(
7062
7150
  // 원본 .th--selected: 48px 고정폭, 항상 left sticky, 체크박스 중앙정렬
7063
- "sticky left-0 z-[4] border-b border-solid border-[color:var(--cmp-table-border-color)] bg-[var(--cmp-table-header-bg)] text-center align-middle",
7151
+ "sticky left-0 z-[7] border-b border-solid border-[color:var(--cmp-table-border-color)] bg-[var(--cmp-table-header-bg)] text-center align-middle",
7064
7152
  stickyLeft === 0 && scrolledLeft && "shadow-[5px_0_8px_0_rgba(34,34,34,0.1)]"
7065
7153
  ),
7066
7154
  style: {
@@ -7085,13 +7173,13 @@ var STable = forwardRef(function STable2({
7085
7173
  {
7086
7174
  className: cn(
7087
7175
  "relative border-b border-solid border-[color:var(--cmp-table-border-color)] bg-[var(--cmp-table-header-bg)] px-[16px] text-[12px] font-medium leading-[20px] text-[color:var(--sys-color-fg-primary)]",
7088
- stickyInfo(i).isSticky && "z-[4]",
7176
+ stickyInfo(i).isSticky && "z-[6]",
7089
7177
  stickyShadowClass(i),
7090
7178
  col.thClass
7091
7179
  ),
7092
7180
  style: { textAlign: col.align ?? "left", ...cellStyle(i), ...col.thStyle },
7093
7181
  children: [
7094
- /* @__PURE__ */ jsxs(
7182
+ /* @__PURE__ */ jsx(
7095
7183
  "span",
7096
7184
  {
7097
7185
  className: cn(
@@ -7100,10 +7188,10 @@ var STable = forwardRef(function STable2({
7100
7188
  col.align === "center" && "justify-center",
7101
7189
  col.align === "right" && "justify-end"
7102
7190
  ),
7103
- children: [
7191
+ children: col.renderHeader ? col.renderHeader(col, i) : /* @__PURE__ */ jsxs(Fragment, { children: [
7104
7192
  col.icon && /* @__PURE__ */ jsx(SIcon, { name: col.icon, size: 16, color: col.iconColor }),
7105
7193
  /* @__PURE__ */ jsx("span", { className: "truncate", children: col.label })
7106
- ]
7194
+ ] })
7107
7195
  }
7108
7196
  ),
7109
7197
  resizable && !col.autoWidth && i < visibleCols.length - 1 && // 원본 th__resizer: 셀 우측 경계 안쪽 4px 그립(좌우 1px #CCCCCC 라인, 세로 16px).
@@ -10403,6 +10491,8 @@ function formatTimeDisplay(value, type) {
10403
10491
  const displayHour = hour % 12 === 0 ? 12 : hour % 12;
10404
10492
  return `${meridiem} ${padTimePart(displayHour)}:${padTimePart(minute)}`;
10405
10493
  }
10494
+ var TIME_SELECTOR_WIDTH = 136;
10495
+ var MERIDIEM_TIME_SELECTOR_WIDTH = 154;
10406
10496
  function TimeSelector({
10407
10497
  value,
10408
10498
  useMeridiem,
@@ -10641,7 +10731,9 @@ function STimePicker({
10641
10731
  style
10642
10732
  }) {
10643
10733
  const portalContainer = usePortalContainer();
10734
+ const triggerRef = useRef(null);
10644
10735
  const [open, setOpen] = useState(false);
10736
+ const [popoverAlignOffset, setPopoverAlignOffset] = useState(0);
10645
10737
  const [focused, setFocused] = useState(false);
10646
10738
  const [ruleError, setRuleError] = useState("");
10647
10739
  const dims = TIMEPICKER_SIZE_CONFIG[size] ?? TIMEPICKER_SIZE_CONFIG.sm;
@@ -10662,6 +10754,11 @@ function STimePicker({
10662
10754
  const resolvedStatus = status ?? (rules && rules.length > 0 ? ruleError !== "" ? "error" : void 0 : void 0);
10663
10755
  const commitOpen = (next) => {
10664
10756
  if (disabled) return;
10757
+ if (next) {
10758
+ const triggerWidth = triggerRef.current?.getBoundingClientRect().width ?? 0;
10759
+ const selectorWidth = effectiveUseMeridiem ? MERIDIEM_TIME_SELECTOR_WIDTH : TIME_SELECTOR_WIDTH;
10760
+ setPopoverAlignOffset(Math.max(0, (triggerWidth - selectorWidth) / 2));
10761
+ }
10665
10762
  setOpen(next);
10666
10763
  onOpenChange?.(next);
10667
10764
  if (!next && rules && rules.length > 0) setRuleError(runRules(value, rules));
@@ -10688,19 +10785,32 @@ function STimePicker({
10688
10785
  focused: focused || open,
10689
10786
  errorMessage: ruleError !== "" ? ruleError : errorMessage,
10690
10787
  width,
10788
+ minWidth: dims.fieldMinWidth,
10691
10789
  disabled,
10692
10790
  className,
10693
- style: { minWidth: dims.fieldMinWidth, ...style },
10791
+ style,
10694
10792
  children: /* @__PURE__ */ jsxs(RPopover2.Root, { open, onOpenChange: commitOpen, children: [
10695
10793
  /* @__PURE__ */ jsx(RPopover2.Trigger, { asChild: true, children: /* @__PURE__ */ jsxs(
10696
- "button",
10794
+ "div",
10697
10795
  {
10698
- type: "button",
10699
- name,
10700
- disabled,
10796
+ ref: triggerRef,
10797
+ role: "button",
10798
+ "aria-disabled": disabled,
10799
+ tabIndex: disabled ? -1 : 0,
10800
+ "data-name": name,
10701
10801
  onFocus: () => setFocused(true),
10702
10802
  onBlur: () => setFocused(false),
10703
- className: "flex h-full w-full items-center overflow-hidden bg-transparent outline-none disabled:cursor-not-allowed",
10803
+ onKeyDown: (event) => {
10804
+ if (disabled) return;
10805
+ if (event.key === "Enter" || event.key === " ") {
10806
+ event.preventDefault();
10807
+ commitOpen(!open);
10808
+ }
10809
+ },
10810
+ className: cn(
10811
+ "flex h-full w-full items-center overflow-hidden bg-transparent outline-none",
10812
+ disabled ? "cursor-not-allowed" : "cursor-pointer"
10813
+ ),
10704
10814
  style: { padding: `0 ${dims.paddingX}`, gap: dims.gap, borderRadius: dims.radius },
10705
10815
  children: [
10706
10816
  /* @__PURE__ */ jsx(
@@ -10746,6 +10856,7 @@ function STimePicker({
10746
10856
  side: "bottom",
10747
10857
  align: "start",
10748
10858
  sideOffset: 4,
10859
+ alignOffset: popoverAlignOffset,
10749
10860
  className: cn("z-50", FLOATING_SLIDE_ANIM),
10750
10861
  children: /* @__PURE__ */ jsx(
10751
10862
  TimeSelector,
@@ -10783,6 +10894,11 @@ function formatTimeRangeDisplay(value, type) {
10783
10894
  if (value == null || value[0] === "" || value[1] === "") return "";
10784
10895
  return `${formatTimeDisplay(value[0], type)} ~ ${formatTimeDisplay(value[1], type)}`;
10785
10896
  }
10897
+ var TIME_RANGE_SELECTOR_WIDTH = 345;
10898
+ var MIDDAY_FIELD_MIN_WIDTH = {
10899
+ sm: 178,
10900
+ md: 216
10901
+ };
10786
10902
  function RangeTimeSelector({
10787
10903
  value,
10788
10904
  useMeridiem,
@@ -11072,7 +11188,9 @@ function STimeRangePicker({
11072
11188
  style
11073
11189
  }) {
11074
11190
  const portalContainer = usePortalContainer();
11191
+ const triggerRef = useRef(null);
11075
11192
  const [open, setOpen] = useState(false);
11193
+ const [popoverAlignOffset, setPopoverAlignOffset] = useState(0);
11076
11194
  const [focused, setFocused] = useState(false);
11077
11195
  const [ruleError, setRuleError] = useState("");
11078
11196
  const dims = TIMEPICKER_SIZE_CONFIG[size] ?? TIMEPICKER_SIZE_CONFIG.sm;
@@ -11096,6 +11214,10 @@ function STimeRangePicker({
11096
11214
  const resolvedStatus = status ?? (rules && rules.length > 0 ? ruleError !== "" ? "error" : void 0 : void 0);
11097
11215
  const commitOpen = (next) => {
11098
11216
  if (disabled) return;
11217
+ if (next) {
11218
+ const triggerWidth = triggerRef.current?.getBoundingClientRect().width ?? 0;
11219
+ setPopoverAlignOffset(Math.max(0, (triggerWidth - TIME_RANGE_SELECTOR_WIDTH) / 2));
11220
+ }
11099
11221
  setOpen(next);
11100
11222
  onOpenChange?.(next);
11101
11223
  if (!next && rules && rules.length > 0) setRuleError(runRules(value, rules));
@@ -11122,19 +11244,32 @@ function STimeRangePicker({
11122
11244
  focused: focused || open,
11123
11245
  errorMessage: ruleError !== "" ? ruleError : errorMessage,
11124
11246
  width,
11247
+ minWidth: effectiveUseMeridiem ? MIDDAY_FIELD_MIN_WIDTH[size] : dims.fieldMinWidth,
11125
11248
  disabled,
11126
11249
  className,
11127
- style: { minWidth: dims.fieldMinWidth, ...style },
11250
+ style,
11128
11251
  children: /* @__PURE__ */ jsxs(RPopover2.Root, { open, onOpenChange: commitOpen, children: [
11129
11252
  /* @__PURE__ */ jsx(RPopover2.Trigger, { asChild: true, children: /* @__PURE__ */ jsxs(
11130
- "button",
11253
+ "div",
11131
11254
  {
11132
- type: "button",
11133
- name,
11134
- disabled,
11255
+ ref: triggerRef,
11256
+ role: "button",
11257
+ "aria-disabled": disabled,
11258
+ tabIndex: disabled ? -1 : 0,
11259
+ "data-name": name,
11135
11260
  onFocus: () => setFocused(true),
11136
11261
  onBlur: () => setFocused(false),
11137
- className: "flex h-full w-full items-center overflow-hidden bg-transparent outline-none disabled:cursor-not-allowed",
11262
+ onKeyDown: (event) => {
11263
+ if (disabled) return;
11264
+ if (event.key === "Enter" || event.key === " ") {
11265
+ event.preventDefault();
11266
+ commitOpen(!open);
11267
+ }
11268
+ },
11269
+ className: cn(
11270
+ "flex h-full w-full items-center overflow-hidden bg-transparent outline-none",
11271
+ disabled ? "cursor-not-allowed" : "cursor-pointer"
11272
+ ),
11138
11273
  style: { padding: `0 ${dims.paddingX}`, gap: dims.gap, borderRadius: dims.radius },
11139
11274
  children: [
11140
11275
  /* @__PURE__ */ jsx(
@@ -11180,6 +11315,7 @@ function STimeRangePicker({
11180
11315
  side: "bottom",
11181
11316
  align: "start",
11182
11317
  sideOffset: 4,
11318
+ alignOffset: popoverAlignOffset,
11183
11319
  className: cn("z-50", FLOATING_SLIDE_ANIM),
11184
11320
  children: /* @__PURE__ */ jsx(
11185
11321
  RangeTimeSelector,
@@ -11198,6 +11334,6 @@ function STimeRangePicker({
11198
11334
  );
11199
11335
  }
11200
11336
 
11201
- export { BADGE_COLORS, BUTTON_COLORS, BUTTON_SIZES, COLOR_KEYS, GNB_COLORS, GNB_COMMON, GNB_FOLD_MS, GNB_HEADER, GNB_MENU, GNB_MENU_WIDTH, GNB_RAIL, GNB_RAIL_WIDTH, ICONS, SActionModal, SBadge, SBarcodeInput, SButton, SCalendar, SCallout, SCard, SCheckbox, SChip, SChipInput, SCircleProgress, SConfirmModal, SDatePicker, SDateRangePicker, SDivider, SDropdownButton, SField, SFilePicker, SForm, SGhostButton, SGnb, SGuide, SIcon, SInput, SKeyValueTable, SLayout, SLayoutContext, SLinearProgress, SLoadingContainer, SLoadingModal, SLoadingViewport, SNumberInput, SPage, SPagination, SPopover, SPopup, SPortal, SRadio, SRadioButton, SRadioGroup, SSelect, SStepper, SSwitch, STEPPER_SIZES, STable, STabs, STag, STextLink, STextarea, STimePicker, STimeRangePicker, SToast, SToastContainer, SToggle, STooltip, TAG_COLORS, TAG_SHAPES, TAG_SIZES, TIMEPICKER_SIZES, TIMEPICKER_SIZE_CONFIG, buttonPreset, cn, findGnbAncestors, findGnbRailValue, isColorKey, loading, resolveColor, useSLayout };
11337
+ export { BADGE_COLORS, BUTTON_COLORS, BUTTON_SIZES, COLOR_KEYS, GNB_COLORS, GNB_COMMON, GNB_FOLD_MS, GNB_HEADER, GNB_MENU, GNB_MENU_WIDTH, GNB_RAIL, GNB_RAIL_WIDTH, ICONS, PAGE_BACKGROUNDS, SActionModal, SBadge, SBarcodeInput, SButton, SCROLL_AREA_AXES, SCalendar, SCallout, SCard, SCheckbox, SChip, SChipInput, SCircleProgress, SConfirmModal, SDatePicker, SDateRangePicker, SDivider, SDropdownButton, SField, SFilePicker, SForm, SGhostButton, SGnb, SGuide, SIcon, SInput, SKeyValueTable, SLayout, SLayoutContext, SLinearProgress, SLoadingContainer, SLoadingModal, SLoadingViewport, SNumberInput, SPage, SPagination, SPopover, SPopup, SPortal, SRadio, SRadioButton, SRadioGroup, SScrollArea, SSelect, SStepper, SSwitch, STEPPER_SIZES, STable, STabs, STag, STextLink, STextarea, STimePicker, STimeRangePicker, SToast, SToastContainer, SToggle, STooltip, TAG_COLORS, TAG_SHAPES, TAG_SIZES, TIMEPICKER_SIZES, TIMEPICKER_SIZE_CONFIG, buttonPreset, cn, findGnbAncestors, findGnbRailValue, isColorKey, loading, resolveColor, useSLayout };
11202
11338
  //# sourceMappingURL=index.js.map
11203
11339
  //# sourceMappingURL=index.js.map