sellmate-design-system-react 1.1.1 → 1.2.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 (58) hide show
  1. package/dist/components/SActionModal/SActionModal.cjs +7 -0
  2. package/dist/components/SActionModal/SActionModal.cjs.map +1 -1
  3. package/dist/components/SActionModal/SActionModal.d.ts +1 -0
  4. package/dist/components/SActionModal/SActionModal.js +8 -1
  5. package/dist/components/SActionModal/SActionModal.js.map +1 -1
  6. package/dist/components/SConfirmModal/SConfirmModal.cjs +6 -0
  7. package/dist/components/SConfirmModal/SConfirmModal.cjs.map +1 -1
  8. package/dist/components/SConfirmModal/SConfirmModal.js +7 -1
  9. package/dist/components/SConfirmModal/SConfirmModal.js.map +1 -1
  10. package/dist/components/SGnb/SGnb.cjs.map +1 -1
  11. package/dist/components/SGnb/SGnb.js.map +1 -1
  12. package/dist/components/SKeyValueTable/SKeyValueTable.cjs +2 -2
  13. package/dist/components/SKeyValueTable/SKeyValueTable.cjs.map +1 -1
  14. package/dist/components/SKeyValueTable/SKeyValueTable.js +2 -2
  15. package/dist/components/SKeyValueTable/SKeyValueTable.js.map +1 -1
  16. package/dist/components/SLoadingModal/SLoadingModal.cjs +6 -0
  17. package/dist/components/SLoadingModal/SLoadingModal.cjs.map +1 -1
  18. package/dist/components/SLoadingModal/SLoadingModal.js +7 -1
  19. package/dist/components/SLoadingModal/SLoadingModal.js.map +1 -1
  20. package/dist/components/SModal/SModal.cjs +6 -0
  21. package/dist/components/SModal/SModal.cjs.map +1 -1
  22. package/dist/components/SModal/SModal.js +6 -0
  23. package/dist/components/SModal/SModal.js.map +1 -1
  24. package/dist/components/SModalContainer/SModalContainer.cjs +6 -0
  25. package/dist/components/SModalContainer/SModalContainer.cjs.map +1 -1
  26. package/dist/components/SModalContainer/SModalContainer.js +7 -1
  27. package/dist/components/SModalContainer/SModalContainer.js.map +1 -1
  28. package/dist/components/SPage/SPage.cjs +3 -3
  29. package/dist/components/SPage/SPage.cjs.map +1 -1
  30. package/dist/components/SPage/SPage.js +3 -3
  31. package/dist/components/SPage/SPage.js.map +1 -1
  32. package/dist/components/SPopup/SPopup.cjs +2 -2
  33. package/dist/components/SPopup/SPopup.cjs.map +1 -1
  34. package/dist/components/SPopup/SPopup.js +2 -2
  35. package/dist/components/SPopup/SPopup.js.map +1 -1
  36. package/dist/components/SScrollArea/SScrollArea.cjs +2 -2
  37. package/dist/components/SScrollArea/SScrollArea.cjs.map +1 -1
  38. package/dist/components/SScrollArea/SScrollArea.js +2 -2
  39. package/dist/components/SScrollArea/SScrollArea.js.map +1 -1
  40. package/dist/components/SSelect/SSelect.cjs +2 -2
  41. package/dist/components/SSelect/SSelect.cjs.map +1 -1
  42. package/dist/components/SSelect/SSelect.js +2 -2
  43. package/dist/components/SSelect/SSelect.js.map +1 -1
  44. package/dist/components/STable/STable.cjs +137 -95
  45. package/dist/components/STable/STable.cjs.map +1 -1
  46. package/dist/components/STable/STable.d.ts +1 -1
  47. package/dist/components/STable/STable.js +137 -95
  48. package/dist/components/STable/STable.js.map +1 -1
  49. package/dist/index.cjs +145 -96
  50. package/dist/index.cjs.map +1 -1
  51. package/dist/index.js +145 -96
  52. package/dist/index.js.map +1 -1
  53. package/dist/lib/scrollbar.cjs +3 -3
  54. package/dist/lib/scrollbar.cjs.map +1 -1
  55. package/dist/lib/scrollbar.js +3 -3
  56. package/dist/lib/scrollbar.js.map +1 -1
  57. package/dist/styles.css +33 -3
  58. package/package.json +1 -1
package/dist/index.cjs CHANGED
@@ -3040,9 +3040,9 @@ var SDivider = react.forwardRef(function SDivider2({ vertical = false, className
3040
3040
  // src/lib/scrollbar.ts
3041
3041
  var FIREFOX_SCROLLBAR_CLASS = "supports-[not_selector(::-webkit-scrollbar)]:[scrollbar-width:thin] supports-[not_selector(::-webkit-scrollbar)]:[scrollbar-color:var(--color-grey-45)_transparent]";
3042
3042
  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`;
3043
- 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)]";
3044
- 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)]";
3045
- 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]";
3043
+ 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)] [&::-webkit-scrollbar-corner]:bg-[var(--color-grey-10)]";
3044
+ 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)] [&::-webkit-scrollbar-corner]:bg-[var(--color-white)]";
3045
+ 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-corner]:[border-top:1px_solid_var(--sys-color-border-default)] [&::-webkit-scrollbar-corner]:[border-left:1px_solid_var(--sys-color-border-default)] [&::-webkit-scrollbar-thumb:vertical]:[border-left-width:3px] [&::-webkit-scrollbar-thumb:horizontal]:[border-top-width:3px]";
3046
3046
  var AXIS_CLASS = {
3047
3047
  vertical: "overflow-x-hidden overflow-y-auto",
3048
3048
  horizontal: "overflow-x-auto overflow-y-hidden",
@@ -4783,6 +4783,7 @@ function SModalContainer({
4783
4783
  style
4784
4784
  }) {
4785
4785
  const [shaking, setShaking] = react.useState(false);
4786
+ const contentRef = react.useRef(null);
4786
4787
  const [portalContainer, setPortalContainer] = react.useState(null);
4787
4788
  const triggerShake = react.useCallback(() => {
4788
4789
  setShaking(false);
@@ -4797,7 +4798,12 @@ function SModalContainer({
4797
4798
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "pointer-events-none fixed inset-0 z-[1001] flex items-center justify-center", children: /* @__PURE__ */ jsxRuntime.jsxs(
4798
4799
  RDialog__namespace.Content,
4799
4800
  {
4801
+ ref: contentRef,
4800
4802
  className: "pointer-events-auto outline-none data-[state=open]:animate-modal-in data-[state=closed]:animate-modal-out",
4803
+ onOpenAutoFocus: (e) => {
4804
+ e.preventDefault();
4805
+ contentRef.current?.focus({ preventScroll: true });
4806
+ },
4801
4807
  onEscapeKeyDown: guardClose,
4802
4808
  onPointerDownOutside: guardClose,
4803
4809
  onInteractOutside: guardClose,
@@ -4993,6 +4999,7 @@ function SActionModal({
4993
4999
  color: button.color ?? "primary",
4994
5000
  outline: button.outline,
4995
5001
  size: button.size ?? "md",
5002
+ disabled: button.disabled,
4996
5003
  onClick: () => {
4997
5004
  button.onClick?.();
4998
5005
  onOpenChange?.(false);
@@ -7345,7 +7352,6 @@ var STable = react.forwardRef(function STable2({
7345
7352
  resizable = false,
7346
7353
  width,
7347
7354
  height,
7348
- stickyHeader = false,
7349
7355
  stickyColumn,
7350
7356
  radius = "default",
7351
7357
  noDataLabel = "\uB370\uC774\uD130\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.",
@@ -7411,6 +7417,8 @@ var STable = react.forwardRef(function STable2({
7411
7417
  const [rowCountOverride, setRowCountOverride] = react.useState(null);
7412
7418
  const rowCount = rowCountOverride ?? rows.length;
7413
7419
  const scrollRef = react.useRef(null);
7420
+ const headerScrollRef = react.useRef(null);
7421
+ const [headerGutter, setHeaderGutter] = react.useState(0);
7414
7422
  const [vsRange, setVsRange] = react.useState({ start: 0, end: 0 });
7415
7423
  const lastReachEndRef = react.useRef(-1);
7416
7424
  const cbRef = react.useRef({ onVirtualUpdate, onVirtualReachEnd });
@@ -7435,6 +7443,9 @@ var STable = react.forwardRef(function STable2({
7435
7443
  const handleScroll = react.useCallback(() => {
7436
7444
  const el = scrollRef.current;
7437
7445
  if (!el) return;
7446
+ const header = headerScrollRef.current;
7447
+ if (header) header.scrollLeft = el.scrollLeft;
7448
+ setHeaderGutter(el.offsetWidth - el.clientWidth);
7438
7449
  setScrolledLeft(el.scrollLeft > 0);
7439
7450
  setScrolledRight(el.scrollLeft + el.clientWidth < el.scrollWidth - 1);
7440
7451
  if (useVirtualScroll) {
@@ -7444,7 +7455,7 @@ var STable = react.forwardRef(function STable2({
7444
7455
  }, [useVirtualScroll, calcRange]);
7445
7456
  react.useEffect(() => {
7446
7457
  handleScroll();
7447
- }, [handleScroll, rowCount, columnWidths]);
7458
+ }, [handleScroll, rowCount, columnWidths, isLoading, height]);
7448
7459
  react.useEffect(() => {
7449
7460
  if (!useVirtualScroll) return;
7450
7461
  cbRef.current.onVirtualUpdate?.({ from: vsRange.start, to: vsRange.end });
@@ -7624,6 +7635,10 @@ var STable = react.forwardRef(function STable2({
7624
7635
  isRightEdge && scrolledRight && "shadow-[-5px_0_8px_0_rgba(34,34,34,0.1)]"
7625
7636
  );
7626
7637
  };
7638
+ const colgroup = /* @__PURE__ */ jsxRuntime.jsxs("colgroup", { children: [
7639
+ selectable && /* @__PURE__ */ jsxRuntime.jsx("col", { style: { width: SELECTABLE_COLUMN_WIDTH } }),
7640
+ visibleCols.map((col, i) => /* @__PURE__ */ jsxRuntime.jsx("col", { style: col.autoWidth ? void 0 : { width: columnWidths[i] } }, col.name))
7641
+ ] });
7627
7642
  return /* @__PURE__ */ jsxRuntime.jsxs(
7628
7643
  "div",
7629
7644
  {
@@ -7634,42 +7649,45 @@ var STable = react.forwardRef(function STable2({
7634
7649
  /* @__PURE__ */ jsxRuntime.jsxs(
7635
7650
  "div",
7636
7651
  {
7637
- ref: scrollRef,
7638
- onScroll: handleScroll,
7639
7652
  className: cn(
7640
- "bg-white relative overflow-auto border border-solid border-[color:var(--cmp-table-border-color)]",
7641
- SCROLLBAR_CLASS,
7642
- SCROLLBAR_TRACK_BG_CLASS,
7643
- SCROLLBAR_TRACK_BORDER_CLASS,
7653
+ "bg-white relative flex flex-col overflow-hidden border border-solid border-[color:var(--cmp-table-border-color)]",
7654
+ // height가 없으면 루트가 받은 높이를 끝까지 채운다. 호스트가 className으로
7655
+ // `flex-1 min-h-0` 등을 줘 루트 높이가 확정된 경우, 행이 적어도 테두리 박스가
7656
+ // 남은 영역을 그대로 차지한다. basis는 auto로 둬 높이가 확정되지 않은
7657
+ // 기본 사용(내용만큼 커지는 케이스)에서는 동작이 바뀌지 않는다.
7658
+ !height && "min-h-0 grow",
7644
7659
  radiusClass,
7645
- // 원본 sd-table__scroll-container--loading/--no-data: 로딩·데이터 없음 시 스크롤·인터랙션 차단
7646
- (isLoading || rowCount === 0) && "overflow-hidden pointer-events-none"
7660
+ // 원본 sd-table__scroll-container--loading/--no-data: 로딩·데이터 없음 시 인터랙션 차단
7661
+ (isLoading || rowCount === 0) && "pointer-events-none"
7647
7662
  ),
7648
7663
  style: {
7649
7664
  height,
7650
7665
  minHeight: isNoData ? "calc(var(--cmp-table-header-height) + 60px)" : void 0
7651
7666
  },
7652
7667
  children: [
7653
- /* @__PURE__ */ jsxRuntime.jsxs(
7654
- "table",
7668
+ /* @__PURE__ */ jsxRuntime.jsx(
7669
+ "div",
7655
7670
  {
7656
- className: "w-full table-fixed border-separate border-spacing-0 text-left",
7657
- style: { fontSize: 12 },
7658
- children: [
7659
- /* @__PURE__ */ jsxRuntime.jsx("thead", { className: cn(isNoData && "opacity-40"), children: /* @__PURE__ */ jsxRuntime.jsxs(
7660
- "tr",
7661
- {
7662
- className: cn(
7663
- "h-[var(--cmp-table-header-height)] bg-[var(--cmp-table-header-bg)]",
7664
- stickyHeader && "sticky top-0 z-20"
7665
- ),
7666
- children: [
7671
+ ref: headerScrollRef,
7672
+ className: "flex-none overflow-hidden",
7673
+ style: {
7674
+ borderRight: headerGutter ? `${headerGutter}px solid var(--cmp-table-header-bg)` : void 0
7675
+ },
7676
+ children: /* @__PURE__ */ jsxRuntime.jsxs(
7677
+ "table",
7678
+ {
7679
+ className: "w-full table-fixed border-separate border-spacing-0 text-left",
7680
+ style: { fontSize: 12 },
7681
+ children: [
7682
+ colgroup,
7683
+ /* @__PURE__ */ jsxRuntime.jsx("thead", { className: cn(isNoData && "opacity-40"), children: /* @__PURE__ */ jsxRuntime.jsxs("tr", { className: "h-[var(--cmp-table-header-height)] bg-[var(--cmp-table-header-bg)]", children: [
7667
7684
  selectable && /* @__PURE__ */ jsxRuntime.jsxs(
7668
7685
  "th",
7669
7686
  {
7670
7687
  className: cn(
7671
7688
  // 원본 .th--selected: 48px 고정폭, 항상 left sticky, 체크박스 중앙정렬
7672
- "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",
7689
+ // 하단 border 헤더 래퍼가 연속으로 그리므로 셀에는 두지 않는다.
7690
+ "sticky left-0 z-[7] bg-[var(--cmp-table-header-bg)] text-center align-middle",
7673
7691
  stickyLeft === 0 && scrolledLeft && "shadow-[5px_0_8px_0_rgba(34,34,34,0.1)]"
7674
7692
  ),
7675
7693
  style: {
@@ -7693,7 +7711,8 @@ var STable = react.forwardRef(function STable2({
7693
7711
  "th",
7694
7712
  {
7695
7713
  className: cn(
7696
- "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)]",
7714
+ // 하단 border 헤더 래퍼가 연속으로 그린다 (거터 영역까지 이어짐).
7715
+ "relative bg-[var(--cmp-table-header-bg)] px-[16px] text-[12px] font-medium leading-[20px] text-[color:var(--sys-color-fg-primary)]",
7697
7716
  stickyInfo(i).isSticky && "z-[6]",
7698
7717
  stickyShadowClass(i),
7699
7718
  col.thClass
@@ -7731,74 +7750,102 @@ var STable = react.forwardRef(function STable2({
7731
7750
  },
7732
7751
  col.name
7733
7752
  ))
7734
- ]
7735
- }
7736
- ) }),
7737
- /* @__PURE__ */ jsxRuntime.jsxs("tbody", { children: [
7738
- useVirtualScroll && topSpacer > 0 && /* @__PURE__ */ jsxRuntime.jsx("tr", { "aria-hidden": true, style: { height: topSpacer }, children: /* @__PURE__ */ jsxRuntime.jsx("td", { colSpan: totalColSpan, className: "p-0" }) }),
7739
- rowCount === 0 ? null : bodyRows.map((row, ri) => {
7740
- const isSel = selectedKeys.has(row[rowKey]);
7741
- const rowBg = "bg-white";
7742
- return /* @__PURE__ */ jsxRuntime.jsxs(
7743
- "tr",
7744
- {
7745
- onClick: () => onRowClick?.(row),
7746
- className: cn(
7747
- "group/table-row hover:bg-[var(--color-grey-05)]",
7748
- onRowClick && "cursor-pointer"
7749
- ),
7750
- style: { height: useVirtualScroll ? effectiveRowHeight : rowH },
7751
- children: [
7752
- selectable && /* @__PURE__ */ jsxRuntime.jsx(
7753
- "td",
7754
- {
7755
- className: cn(
7756
- // 원본 .td--selected: 48px 고정폭, 항상 left sticky, 체크박스 중앙정렬
7757
- "sticky left-0 z-[2] border-b border-solid border-[color:var(--cmp-table-border-color)] align-middle group-hover/table-row:bg-[var(--color-grey-05)]",
7758
- rowBg,
7759
- stickyLeft === 0 && scrolledLeft && "shadow-[5px_0_8px_0_rgba(34,34,34,0.1)]"
7760
- ),
7761
- style: {
7762
- width: SELECTABLE_COLUMN_WIDTH,
7763
- minWidth: SELECTABLE_COLUMN_WIDTH,
7764
- maxWidth: SELECTABLE_COLUMN_WIDTH
7765
- },
7766
- onClick: (e) => e.stopPropagation(),
7767
- children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center justify-center", children: /* @__PURE__ */ jsxRuntime.jsx(SCheckbox, { value: isSel, onValueChange: () => toggleRow(row) }) })
7768
- }
7769
- ),
7770
- visibleCols.map((col, i) => /* @__PURE__ */ jsxRuntime.jsx(
7771
- "td",
7772
- {
7773
- className: cn(
7774
- // 원본 .td: 컬럼 폭에 맞춰 내용 말줄임(overflow hidden + ellipsis) + 행 구분선(border-b)
7775
- // 셀 배경은 흰색으로 채워 뒤 배경이 비치지 않게 하고, hover 시 행 배경(grey_05)을 따른다.
7776
- "overflow-hidden text-ellipsis whitespace-nowrap border-b border-solid border-[color:var(--cmp-table-border-color)] text-[12px] leading-[20px] text-[color:var(--sys-color-fg-primary)]",
7777
- rowBg,
7778
- "group-hover/table-row:bg-[var(--color-grey-05)]",
7779
- stickyShadowClass(i),
7780
- typeof col.tdClass === "function" ? col.tdClass(row) : col.tdClass
7753
+ ] }) })
7754
+ ]
7755
+ }
7756
+ )
7757
+ }
7758
+ ),
7759
+ /* @__PURE__ */ jsxRuntime.jsx(
7760
+ "div",
7761
+ {
7762
+ ref: scrollRef,
7763
+ onScroll: handleScroll,
7764
+ className: cn(
7765
+ // 헤더 하단 구분선은 body 상단 border로 그린다. body 래퍼는 스크롤바를 포함한
7766
+ // 전체 폭을 차지하므로(스크롤바는 border 안쪽) 헤더 거터의 border-right와 미터가
7767
+ // 생기지 않아 색·길이가 균일한 한 줄이 된다.
7768
+ "min-h-0 flex-1 overflow-auto border-t border-solid border-[color:var(--cmp-table-border-color)]",
7769
+ SCROLLBAR_CLASS,
7770
+ SCROLLBAR_TRACK_BG_CLASS,
7771
+ SCROLLBAR_TRACK_BORDER_CLASS,
7772
+ // 원본 sd-table__scroll-container--loading/--no-data: 로딩·데이터 없음 시 스크롤 차단
7773
+ (isLoading || rowCount === 0) && "overflow-hidden"
7774
+ ),
7775
+ children: /* @__PURE__ */ jsxRuntime.jsxs(
7776
+ "table",
7777
+ {
7778
+ className: "w-full table-fixed border-separate border-spacing-0 text-left",
7779
+ style: { fontSize: 12 },
7780
+ children: [
7781
+ colgroup,
7782
+ /* @__PURE__ */ jsxRuntime.jsxs("tbody", { children: [
7783
+ useVirtualScroll && topSpacer > 0 && /* @__PURE__ */ jsxRuntime.jsx("tr", { "aria-hidden": true, style: { height: topSpacer }, children: /* @__PURE__ */ jsxRuntime.jsx("td", { colSpan: totalColSpan, className: "p-0" }) }),
7784
+ rowCount === 0 ? null : bodyRows.map((row, ri) => {
7785
+ const isSel = selectedKeys.has(row[rowKey]);
7786
+ const rowBg = "bg-white";
7787
+ return /* @__PURE__ */ jsxRuntime.jsxs(
7788
+ "tr",
7789
+ {
7790
+ onClick: () => onRowClick?.(row),
7791
+ className: cn(
7792
+ "group/table-row hover:bg-[var(--color-grey-05)]",
7793
+ onRowClick && "cursor-pointer"
7794
+ ),
7795
+ style: { height: useVirtualScroll ? effectiveRowHeight : rowH },
7796
+ children: [
7797
+ selectable && /* @__PURE__ */ jsxRuntime.jsx(
7798
+ "td",
7799
+ {
7800
+ className: cn(
7801
+ // 원본 .td--selected: 48px 고정폭, 항상 left sticky, 체크박스 중앙정렬
7802
+ "sticky left-0 z-[2] border-b border-solid border-[color:var(--cmp-table-border-color)] align-middle group-hover/table-row:bg-[var(--color-grey-05)]",
7803
+ rowBg,
7804
+ stickyLeft === 0 && scrolledLeft && "shadow-[5px_0_8px_0_rgba(34,34,34,0.1)]"
7805
+ ),
7806
+ style: {
7807
+ width: SELECTABLE_COLUMN_WIDTH,
7808
+ minWidth: SELECTABLE_COLUMN_WIDTH,
7809
+ maxWidth: SELECTABLE_COLUMN_WIDTH
7810
+ },
7811
+ onClick: (e) => e.stopPropagation(),
7812
+ children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center justify-center", children: /* @__PURE__ */ jsxRuntime.jsx(SCheckbox, { value: isSel, onValueChange: () => toggleRow(row) }) })
7813
+ }
7781
7814
  ),
7782
- style: {
7783
- paddingLeft: cellPadX,
7784
- paddingRight: cellPadX,
7785
- paddingTop: cellPadY,
7786
- paddingBottom: cellPadY,
7787
- textAlign: col.align ?? "left",
7788
- ...cellStyle(i)
7789
- },
7790
- children: col.render ? col.render(row, cellValue(col, row)) : cellValue(col, row)
7791
- },
7792
- col.name
7793
- ))
7794
- ]
7795
- },
7796
- row[rowKey] ?? ri
7797
- );
7798
- }),
7799
- useVirtualScroll && bottomSpacer > 0 && /* @__PURE__ */ jsxRuntime.jsx("tr", { "aria-hidden": true, style: { height: bottomSpacer }, children: /* @__PURE__ */ jsxRuntime.jsx("td", { colSpan: totalColSpan, className: "p-0" }) })
7800
- ] })
7801
- ]
7815
+ visibleCols.map((col, i) => /* @__PURE__ */ jsxRuntime.jsx(
7816
+ "td",
7817
+ {
7818
+ className: cn(
7819
+ // 원본 .td: 컬럼 폭에 맞춰 내용 말줄임(overflow hidden + ellipsis) + 행 구분선(border-b)
7820
+ // 배경은 흰색으로 채워 뒤 배경이 비치지 않게 하고, hover 시 행 배경(grey_05)을 따른다.
7821
+ "overflow-hidden text-ellipsis whitespace-nowrap border-b border-solid border-[color:var(--cmp-table-border-color)] text-[12px] leading-[20px] text-[color:var(--sys-color-fg-primary)]",
7822
+ rowBg,
7823
+ "group-hover/table-row:bg-[var(--color-grey-05)]",
7824
+ stickyShadowClass(i),
7825
+ typeof col.tdClass === "function" ? col.tdClass(row) : col.tdClass
7826
+ ),
7827
+ style: {
7828
+ paddingLeft: cellPadX,
7829
+ paddingRight: cellPadX,
7830
+ paddingTop: cellPadY,
7831
+ paddingBottom: cellPadY,
7832
+ textAlign: col.align ?? "left",
7833
+ ...cellStyle(i)
7834
+ },
7835
+ children: col.render ? col.render(row, cellValue(col, row)) : cellValue(col, row)
7836
+ },
7837
+ col.name
7838
+ ))
7839
+ ]
7840
+ },
7841
+ row[rowKey] ?? ri
7842
+ );
7843
+ }),
7844
+ useVirtualScroll && bottomSpacer > 0 && /* @__PURE__ */ jsxRuntime.jsx("tr", { "aria-hidden": true, style: { height: bottomSpacer }, children: /* @__PURE__ */ jsxRuntime.jsx("td", { colSpan: totalColSpan, className: "p-0" }) })
7845
+ ] })
7846
+ ]
7847
+ }
7848
+ )
7802
7849
  }
7803
7850
  ),
7804
7851
  isNoData && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
@@ -7817,7 +7864,9 @@ var STable = react.forwardRef(function STable2({
7817
7864
  ),
7818
7865
  showPagination && // 원본 sd-table__pagination: 테이블 하단에 이어붙는 회색 바(높이 48px, margin-top:-1px로 테두리 겹침).
7819
7866
  // SPagination은 전체 폭 기준 중앙, rows-per-page SSelect는 우측에 absolute 배치해 중앙 정렬을 유지한다.
7820
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative -mt-px flex h-[48px] items-center justify-center rounded-[var(--cmp-table-radius)] border border-solid border-[color:var(--cmp-table-border-color)] bg-[var(--color-grey-05)]", children: [
7867
+ // 루트 높이가 확정된 경우(테이블이 남은 영역을 채우는 배치) 페이지네이션 바가
7868
+ // 눌리지 않도록 shrink-0으로 48px를 보장한다.
7869
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative -mt-px flex h-[48px] shrink-0 items-center justify-center rounded-[var(--cmp-table-radius)] border border-solid border-[color:var(--cmp-table-border-color)] bg-[var(--color-grey-05)]", children: [
7821
7870
  /* @__PURE__ */ jsxRuntime.jsx(SPagination, { currentPage: displayPage, lastPage, onPageChange: changePage }),
7822
7871
  useRowsPerPageSelect && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute right-[10px] top-1/2 -translate-y-1/2", children: /* @__PURE__ */ jsxRuntime.jsx(
7823
7872
  SSelect,