sellmate-design-system-react 0.12.0 → 1.1.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 (100) hide show
  1. package/dist/components/SActionModal/SActionModal.cjs +3 -3
  2. package/dist/components/SActionModal/SActionModal.cjs.map +1 -1
  3. package/dist/components/SActionModal/SActionModal.js +3 -3
  4. package/dist/components/SActionModal/SActionModal.js.map +1 -1
  5. package/dist/components/SBarcodeInput/SBarcodeInput.cjs +1 -1
  6. package/dist/components/SBarcodeInput/SBarcodeInput.cjs.map +1 -1
  7. package/dist/components/SBarcodeInput/SBarcodeInput.js +1 -1
  8. package/dist/components/SBarcodeInput/SBarcodeInput.js.map +1 -1
  9. package/dist/components/SChipInput/SChipInput.cjs +1 -1
  10. package/dist/components/SChipInput/SChipInput.cjs.map +1 -1
  11. package/dist/components/SChipInput/SChipInput.js +1 -1
  12. package/dist/components/SChipInput/SChipInput.js.map +1 -1
  13. package/dist/components/SConfirmModal/SConfirmModal.cjs +4 -4
  14. package/dist/components/SConfirmModal/SConfirmModal.cjs.map +1 -1
  15. package/dist/components/SConfirmModal/SConfirmModal.js +4 -4
  16. package/dist/components/SConfirmModal/SConfirmModal.js.map +1 -1
  17. package/dist/components/SDatePicker/SDatePicker.cjs +1 -1
  18. package/dist/components/SDatePicker/SDatePicker.cjs.map +1 -1
  19. package/dist/components/SDatePicker/SDatePicker.js +1 -1
  20. package/dist/components/SDatePicker/SDatePicker.js.map +1 -1
  21. package/dist/components/SDateRangePicker/SDateRangePicker.cjs +1 -1
  22. package/dist/components/SDateRangePicker/SDateRangePicker.cjs.map +1 -1
  23. package/dist/components/SDateRangePicker/SDateRangePicker.js +1 -1
  24. package/dist/components/SDateRangePicker/SDateRangePicker.js.map +1 -1
  25. package/dist/components/SExpansionItem/SExpansionItem.cjs +42 -12
  26. package/dist/components/SExpansionItem/SExpansionItem.cjs.map +1 -1
  27. package/dist/components/SExpansionItem/SExpansionItem.d.ts +2 -0
  28. package/dist/components/SExpansionItem/SExpansionItem.js +43 -13
  29. package/dist/components/SExpansionItem/SExpansionItem.js.map +1 -1
  30. package/dist/components/SField/SField.cjs +1 -1
  31. package/dist/components/SField/SField.cjs.map +1 -1
  32. package/dist/components/SField/SField.js +1 -1
  33. package/dist/components/SField/SField.js.map +1 -1
  34. package/dist/components/SFilePicker/SFilePicker.cjs +1 -1
  35. package/dist/components/SFilePicker/SFilePicker.cjs.map +1 -1
  36. package/dist/components/SFilePicker/SFilePicker.js +1 -1
  37. package/dist/components/SFilePicker/SFilePicker.js.map +1 -1
  38. package/dist/components/SInput/SInput.cjs +1 -1
  39. package/dist/components/SInput/SInput.cjs.map +1 -1
  40. package/dist/components/SInput/SInput.js +1 -1
  41. package/dist/components/SInput/SInput.js.map +1 -1
  42. package/dist/components/SKeyValueTable/SKeyValueTable.cjs +1 -1
  43. package/dist/components/SKeyValueTable/SKeyValueTable.cjs.map +1 -1
  44. package/dist/components/SKeyValueTable/SKeyValueTable.js +1 -1
  45. package/dist/components/SKeyValueTable/SKeyValueTable.js.map +1 -1
  46. package/dist/components/SLoadingModal/SLoadingModal.cjs +3 -3
  47. package/dist/components/SLoadingModal/SLoadingModal.cjs.map +1 -1
  48. package/dist/components/SLoadingModal/SLoadingModal.js +3 -3
  49. package/dist/components/SLoadingModal/SLoadingModal.js.map +1 -1
  50. package/dist/components/SModal/SModal.cjs +31 -37
  51. package/dist/components/SModal/SModal.cjs.map +1 -1
  52. package/dist/components/SModal/SModal.d.ts +38 -19
  53. package/dist/components/SModal/SModal.js +31 -37
  54. package/dist/components/SModal/SModal.js.map +1 -1
  55. package/dist/components/SModalContainer/SModalContainer.cjs +1 -1
  56. package/dist/components/SModalContainer/SModalContainer.cjs.map +1 -1
  57. package/dist/components/SModalContainer/SModalContainer.js +1 -1
  58. package/dist/components/SModalContainer/SModalContainer.js.map +1 -1
  59. package/dist/components/SNumberInput/SNumberInput.cjs +1 -1
  60. package/dist/components/SNumberInput/SNumberInput.cjs.map +1 -1
  61. package/dist/components/SNumberInput/SNumberInput.js +1 -1
  62. package/dist/components/SNumberInput/SNumberInput.js.map +1 -1
  63. package/dist/components/SSelect/SSelect.cjs +1 -1
  64. package/dist/components/SSelect/SSelect.cjs.map +1 -1
  65. package/dist/components/SSelect/SSelect.js +1 -1
  66. package/dist/components/SSelect/SSelect.js.map +1 -1
  67. package/dist/components/STable/STable.cjs +2 -2
  68. package/dist/components/STable/STable.cjs.map +1 -1
  69. package/dist/components/STable/STable.d.ts +2 -1
  70. package/dist/components/STable/STable.js +2 -2
  71. package/dist/components/STable/STable.js.map +1 -1
  72. package/dist/components/STableBar/STableBar.cjs +93 -0
  73. package/dist/components/STableBar/STableBar.cjs.map +1 -0
  74. package/dist/components/STableBar/STableBar.d.ts +17 -0
  75. package/dist/components/STableBar/STableBar.js +91 -0
  76. package/dist/components/STableBar/STableBar.js.map +1 -0
  77. package/dist/components/STableBar/index.d.ts +1 -0
  78. package/dist/components/STextarea/STextarea.cjs +1 -1
  79. package/dist/components/STextarea/STextarea.cjs.map +1 -1
  80. package/dist/components/STextarea/STextarea.js +1 -1
  81. package/dist/components/STextarea/STextarea.js.map +1 -1
  82. package/dist/components/STimePicker/STimePicker.cjs +1 -1
  83. package/dist/components/STimePicker/STimePicker.cjs.map +1 -1
  84. package/dist/components/STimePicker/STimePicker.js +1 -1
  85. package/dist/components/STimePicker/STimePicker.js.map +1 -1
  86. package/dist/components/STimeRangePicker/STimeRangePicker.cjs +1 -1
  87. package/dist/components/STimeRangePicker/STimeRangePicker.cjs.map +1 -1
  88. package/dist/components/STimeRangePicker/STimeRangePicker.js +1 -1
  89. package/dist/components/STimeRangePicker/STimeRangePicker.js.map +1 -1
  90. package/dist/components/STooltip/STooltip.cjs +1 -1
  91. package/dist/components/STooltip/STooltip.cjs.map +1 -1
  92. package/dist/components/STooltip/STooltip.js +1 -1
  93. package/dist/components/STooltip/STooltip.js.map +1 -1
  94. package/dist/index.cjs +133 -53
  95. package/dist/index.cjs.map +1 -1
  96. package/dist/index.d.ts +1 -0
  97. package/dist/index.js +134 -55
  98. package/dist/index.js.map +1 -1
  99. package/dist/styles.css +117 -32
  100. package/package.json +1 -1
package/dist/index.d.ts CHANGED
@@ -34,6 +34,7 @@ export * from './components/STabs';
34
34
  export * from './components/SPagination';
35
35
  export * from './components/SStepper';
36
36
  export * from './components/STable';
37
+ export * from './components/STableBar';
37
38
  export * from './components/SKeyValueTable';
38
39
  export * from './components/SToast';
39
40
  export * from './components/SForm';
package/dist/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import { clsx } from 'clsx';
3
3
  import { extendTailwindMerge } from 'tailwind-merge';
4
- import { forwardRef, useState, Children, useId, useEffect, useRef, useCallback, createContext, useImperativeHandle, useMemo, useContext, useLayoutEffect, useSyncExternalStore, Fragment as Fragment$1 } from 'react';
4
+ import { forwardRef, useState, useId, useEffect, useRef, useCallback, createContext, useImperativeHandle, useMemo, useContext, useLayoutEffect, useSyncExternalStore, Fragment as Fragment$1 } from 'react';
5
5
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
6
6
  import { createPortal } from 'react-dom';
7
7
  import { createRoot } from 'react-dom/client';
@@ -2899,6 +2899,7 @@ var SExpansionItem = forwardRef(
2899
2899
  leading,
2900
2900
  trailing,
2901
2901
  bodyPadding = true,
2902
+ bordered = false,
2902
2903
  expanded,
2903
2904
  defaultExpanded = false,
2904
2905
  dense = false,
@@ -2910,9 +2911,6 @@ var SExpansionItem = forwardRef(
2910
2911
  }, ref) {
2911
2912
  const [internalExpanded, setInternalExpanded] = useState(defaultExpanded);
2912
2913
  const isExpanded = expanded ?? internalExpanded;
2913
- const hasBody = Children.toArray(children).some(
2914
- (child) => child !== null && child !== void 0 && (typeof child !== "string" || child.trim() !== "")
2915
- );
2916
2914
  const leadingNode = typeof leading === "function" ? leading({ expanded: isExpanded, disabled }) : leading;
2917
2915
  const id = useId();
2918
2916
  return /* @__PURE__ */ jsxs(
@@ -2921,6 +2919,9 @@ var SExpansionItem = forwardRef(
2921
2919
  ref,
2922
2920
  className: cn(
2923
2921
  "group overflow-hidden bg-[var(--cmp-expansionItem-title-bg-default)]",
2922
+ // TODO: expansionItem/bordered/radius 및 border intent 토큰 생성 후 고정값을 토큰으로 교체한다.
2923
+ bordered && "rounded-[8px] border border-[#E1E1E1] hover:border-[#AAAAAA] [&:has(>button:hover)]:border-[#AAAAAA]",
2924
+ bordered && isExpanded && "!border-[#93C4FF]",
2924
2925
  className
2925
2926
  ),
2926
2927
  ...rest,
@@ -2940,23 +2941,52 @@ var SExpansionItem = forwardRef(
2940
2941
  },
2941
2942
  className: cn(
2942
2943
  "flex w-full items-center justify-between border-0 text-left text-[14px] font-bold leading-[24px] text-[var(--cmp-expansionItem-title-text-default)] focus-visible:outline focus-visible:outline-2 focus-visible:outline-[var(--sys-color-border-accent)] disabled:cursor-not-allowed disabled:text-[var(--sys-color-disabled-text)] cursor-pointer",
2943
- isExpanded && "border-b border-[var(--cmp-expansionItem-title-border)]",
2944
- !isExpanded && "hover:bg-[var(--cmp-expansionItem-title-bg-hover)]",
2945
- dense ? "min-h-8 py-[var(--cmp-expansionItem-title-paddingY-dense)]" : "min-h-10 py-[var(--cmp-expansionItem-title-paddingY-normal)]",
2946
- "gap-[var(--cmp-expansionItem-title-gap)]",
2947
- "pr-[var(--cmp-expansionItem-title-paddingX)]",
2948
- depth === 2 ? "pl-[calc(var(--cmp-expansionItem-title-paddingX)+32px)]" : depth === 3 ? "pl-[calc(var(--cmp-expansionItem-title-paddingX)+64px)]" : "pl-[var(--cmp-expansionItem-title-paddingX)]",
2949
- isExpanded && "bg-[var(--cmp-expansionItem-title-bg-expanded)] text-[var(--cmp-expansionItem-title-text-expanded)]"
2944
+ isExpanded && "border-b border-(--cmp-expansionItem-title-border)",
2945
+ !isExpanded && "hover:bg-(--cmp-expansionItem-title-bg-hover)",
2946
+ dense ? "min-h-8 py-(--cmp-expansionItem-title-paddingY-dense)" : "min-h-10 py-(--cmp-expansionItem-title-paddingY-normal)",
2947
+ "gap-(--cmp-expansionItem-title-gap)",
2948
+ "pr-(--cmp-expansionItem-title-paddingX)",
2949
+ depth === 2 ? "pl-[calc(var(--cmp-expansionItem-title-paddingX)+32px)]" : depth === 3 ? "pl-[calc(var(--cmp-expansionItem-title-paddingX)+64px)]" : "pl-(--cmp-expansionItem-title-paddingX)",
2950
+ isExpanded && "bg-(--cmp-expansionItem-title-bg-expanded) text-(--cmp-expansionItem-title-text-expanded)"
2950
2951
  ),
2951
2952
  children: [
2952
- !leading && hasBody && /* @__PURE__ */ jsx(SIcon, { name: isExpanded ? "caretUp" : "caretDown", size: 12 }),
2953
+ !leading && /* @__PURE__ */ jsx(
2954
+ "span",
2955
+ {
2956
+ className: cn(
2957
+ "flex transition-transform duration-200 ease-out motion-reduce:transition-none",
2958
+ isExpanded && "rotate-180"
2959
+ ),
2960
+ children: /* @__PURE__ */ jsx(SIcon, { name: "caretDown", size: 12 })
2961
+ }
2962
+ ),
2953
2963
  leadingNode,
2954
2964
  /* @__PURE__ */ jsx("span", { className: "flex min-w-0 flex-1 flex-col", children: /* @__PURE__ */ jsx("span", { children: title }) }),
2955
2965
  trailing
2956
2966
  ]
2957
2967
  }
2958
2968
  ),
2959
- /* @__PURE__ */ jsx("div", { id, hidden: !isExpanded, className: "bg-[var(--cmp-expansionItem-body-bg)]", children: /* @__PURE__ */ jsx("div", { className: bodyPadding ? "p-[var(--cmp-expansionItem-body-padding)]" : void 0, children }) })
2969
+ /* @__PURE__ */ jsx(
2970
+ "div",
2971
+ {
2972
+ id,
2973
+ "aria-hidden": !isExpanded,
2974
+ className: cn(
2975
+ "grid overflow-hidden bg-[var(--cmp-expansionItem-body-bg)] transition-[grid-template-rows] duration-200 ease-out motion-reduce:transition-none",
2976
+ isExpanded ? "grid-rows-[1fr]" : "grid-rows-[0fr]"
2977
+ ),
2978
+ children: /* @__PURE__ */ jsx(
2979
+ "div",
2980
+ {
2981
+ className: cn(
2982
+ "min-h-0 overflow-hidden",
2983
+ bodyPadding && isExpanded && "p-(--cmp-expansionItem-body-padding)"
2984
+ ),
2985
+ children
2986
+ }
2987
+ )
2988
+ }
2989
+ )
2960
2990
  ]
2961
2991
  }
2962
2992
  );
@@ -4282,7 +4312,7 @@ var STooltip = forwardRef(function STooltip2({
4282
4312
  if (disabled || body == null) return /* @__PURE__ */ jsx(Fragment, { children: triggerNode });
4283
4313
  const isHover = trigger === "hover";
4284
4314
  const contentClass = cn(
4285
- "z-50 w-fit whitespace-nowrap rounded-[6px] px-[16px] py-[12px] text-[12px] leading-[20px]",
4315
+ "z-50 w-fit whitespace-nowrap rounded-[6px] px-[16px] py-[12px] text-[12px] leading-[20px] shadow-normal-sm",
4286
4316
  FLOATING_SLIDE_ANIM,
4287
4317
  className
4288
4318
  );
@@ -4749,7 +4779,7 @@ function SModalContainer({
4749
4779
  "div",
4750
4780
  {
4751
4781
  className: cn(
4752
- "relative overflow-hidden rounded-[var(--cmp-modal-radius)] bg-[var(--cmp-modal-bg)] shadow-normal-md",
4782
+ "relative flex max-h-[calc(100dvh-48px)] flex-col overflow-hidden rounded-[var(--cmp-modal-radius)] bg-[var(--cmp-modal-bg)] shadow-normal-md",
4753
4783
  shaking && "animate-modal-shake",
4754
4784
  className
4755
4785
  ),
@@ -4841,8 +4871,8 @@ function SConfirmModal({
4841
4871
  showClose: true,
4842
4872
  onClose,
4843
4873
  className: "w-fit min-w-[520px]",
4844
- children: /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center gap-[40px] px-[32px] py-[40px]", children: [
4845
- /* @__PURE__ */ jsxs("div", { className: "flex w-full flex-col items-center gap-[20px]", children: [
4874
+ children: /* @__PURE__ */ jsxs("div", { className: "flex min-h-0 flex-auto flex-col items-center gap-[40px] px-[32px] py-[40px]", children: [
4875
+ /* @__PURE__ */ jsxs("div", { className: "flex w-full min-h-0 flex-col items-center gap-[20px] overflow-y-auto", children: [
4846
4876
  /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center gap-[12px]", children: [
4847
4877
  iconName && /* @__PURE__ */ jsx(SIcon, { name: iconName, size: 32, color: TYPE_ICON_COLOR[type] }),
4848
4878
  /* @__PURE__ */ jsx(
@@ -4864,7 +4894,7 @@ function SConfirmModal({
4864
4894
  optionNode != null && optionNode
4865
4895
  ] })
4866
4896
  ] }),
4867
- /* @__PURE__ */ jsxs("div", { className: "flex gap-[8px]", children: [
4897
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-shrink-0 gap-[8px]", children: [
4868
4898
  subButtonLabel && /* @__PURE__ */ jsx(
4869
4899
  SButton,
4870
4900
  {
@@ -4917,8 +4947,8 @@ function SActionModal({
4917
4947
  showClose: true,
4918
4948
  width,
4919
4949
  height,
4920
- className: "w-fit min-w-[480px] min-h-[320px]",
4921
- children: /* @__PURE__ */ jsxs("div", { className: "flex h-full min-h-[320px] flex-col", children: [
4950
+ className: "w-fit min-w-[480px] min-h-[min(320px,calc(100dvh-48px))]",
4951
+ children: /* @__PURE__ */ jsxs("div", { className: "flex min-h-0 flex-auto flex-col", children: [
4922
4952
  /* @__PURE__ */ jsx("header", { className: "flex flex-shrink-0 items-center gap-[var(--cmp-overlay-header-gap)] py-[var(--cmp-overlay-header-paddingY)] pl-[var(--cmp-overlay-header-paddingX)] pr-[calc(var(--cmp-overlay-header-paddingX)+20px)]", children: /* @__PURE__ */ jsx("h2", { className: "text-[16px] font-bold leading-[26px] text-[color:var(--cmp-overlay-header-title-color)]", children: modalTitle }) }),
4923
4953
  /* @__PURE__ */ jsx("div", { className: "min-h-0 flex-1 overflow-auto px-[var(--cmp-modal-action-body-paddingX)] pb-[var(--cmp-modal-action-body-paddingBottom)]", children }),
4924
4954
  button && /* @__PURE__ */ jsx(
@@ -4984,7 +5014,7 @@ function SLoadingModal({
4984
5014
  ariaTitle: lines[0] || "\uB85C\uB529 \uC911",
4985
5015
  width,
4986
5016
  height,
4987
- children: /* @__PURE__ */ jsxs("div", { className: "flex h-full flex-col items-center justify-center gap-[20px] px-[32px]", children: [
5017
+ children: /* @__PURE__ */ jsx("div", { className: "flex min-h-0 flex-auto flex-col overflow-y-auto px-[32px]", children: /* @__PURE__ */ jsxs("div", { className: "m-auto flex flex-col items-center gap-[20px]", children: [
4988
5018
  state2 === "loading" ? progress !== void 0 ? /* @__PURE__ */ jsx(SCircleProgress, { value: progress }) : /* @__PURE__ */ jsx(SCircleProgress, { indeterminate: true }) : /* @__PURE__ */ jsx(SIcon, { name: "warningOutline", size: 80, color: "var(--cmp-modal-confirm-negative-icon)" }),
4989
5019
  lines.length > 0 && /* @__PURE__ */ jsx("div", { className: "flex flex-col gap-[2px]", children: lines.map((m, i) => /* @__PURE__ */ jsx(
4990
5020
  "p",
@@ -5007,7 +5037,7 @@ function SLoadingModal({
5007
5037
  label: buttonLabel ?? DEFAULT_BUTTON_LABEL[state2]
5008
5038
  }
5009
5039
  )
5010
- ] })
5040
+ ] }) })
5011
5041
  }
5012
5042
  );
5013
5043
  }
@@ -5090,6 +5120,10 @@ var SModalRefImpl = class {
5090
5120
  this.root = root;
5091
5121
  this.host = host;
5092
5122
  }
5123
+ /** @internal create 의 마운트 검사용 host 조회 */
5124
+ _getHost() {
5125
+ return this.host;
5126
+ }
5093
5127
  /** @internal 닫힘 시작 표시 — 컴포넌트 버튼·백드롭·ESC 닫힘 경로가 호출(중복 트리거 방지) */
5094
5128
  _markDismissed() {
5095
5129
  this.dismissRequested = true;
@@ -5185,46 +5219,35 @@ function LoadingMount({ options, refImpl }) {
5185
5219
  }
5186
5220
  );
5187
5221
  }
5222
+ function warnIfNotModal(host, component) {
5223
+ if (typeof process !== "undefined" && process?.env?.NODE_ENV === "production") return;
5224
+ if (!host || host.childElementCount === 0) return;
5225
+ const name = component?.name || "component";
5226
+ console.warn(
5227
+ `[SModal.create] ${name} \uC774(\uAC00) \uBAA8\uB2EC\uC744 \uB744\uC6B0\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4. create \uB294 \uCEE8\uD14C\uC774\uB108\uB97C \uB367\uC50C\uC6B0\uC9C0 \uC54A\uC73C\uBBC0\uB85C component \uB294 \uB8E8\uD2B8\uC5D0 SActionModal \uC744 \uB80C\uB354\uD558\uACE0, \uC8FC\uC785\uBC1B\uC740 open/onOpenChange/onClose \uB97C \uADF8\uB300\uB85C \uC804\uB2EC\uD574\uC57C \uD569\uB2C8\uB2E4. \uD655\uC778/\uCDE8\uC18C\uB294 SModal.confirm, \uB85C\uB529\uC740 SModal.loading \uC744 \uC0AC\uC6A9\uD558\uC138\uC694.`
5228
+ );
5229
+ }
5188
5230
  function CreateMount({ options, refImpl }) {
5189
- const {
5190
- component: Component,
5191
- componentProps,
5192
- persistent,
5193
- showClose,
5194
- width,
5195
- height,
5196
- className,
5197
- ariaTitle
5198
- } = options;
5231
+ const { component: Component, componentProps } = options;
5199
5232
  const [open, setOpen] = useState(true);
5200
5233
  useEffect(() => {
5201
5234
  refImpl._bindClose(() => setOpen(false));
5202
5235
  refImpl._bindUpdate(() => {
5203
5236
  });
5204
- }, [refImpl]);
5237
+ warnIfNotModal(refImpl._getHost(), Component);
5238
+ }, [refImpl, Component]);
5205
5239
  useExitTeardown(open, refImpl);
5206
5240
  const componentAllProps = {
5207
5241
  ...componentProps,
5242
+ open,
5243
+ onOpenChange: (o) => {
5244
+ if (!o) refImpl._markDismissed();
5245
+ setOpen(o);
5246
+ },
5247
+ onClose: () => refImpl._emitClose(),
5208
5248
  modalRef: refImpl
5209
5249
  };
5210
- return /* @__PURE__ */ jsx(
5211
- SModalContainer,
5212
- {
5213
- open,
5214
- onOpenChange: (o) => {
5215
- if (!o) refImpl._markDismissed();
5216
- setOpen(o);
5217
- },
5218
- persistent,
5219
- showClose,
5220
- onClose: () => refImpl.close(),
5221
- ariaTitle,
5222
- width,
5223
- height,
5224
- className,
5225
- children: /* @__PURE__ */ jsx(Component, { ...componentAllProps })
5226
- }
5227
- );
5250
+ return /* @__PURE__ */ jsx(Component, { ...componentAllProps });
5228
5251
  }
5229
5252
  function mount(render) {
5230
5253
  const host = document.createElement("div");
@@ -5248,8 +5271,9 @@ var SModal = {
5248
5271
  return mount((refImpl) => /* @__PURE__ */ jsx(LoadingMount, { options: { persistent: true, ...options }, refImpl }));
5249
5272
  },
5250
5273
  /**
5251
- * 커스텀 React 컴포넌트를 SModalContainer(딤+카드) 안에 띄운다. component modalRef
5252
- * prop 으로 주입되어 컴포넌트가 ok()/cancel()/close()/submit()/onSubmit() 으로 자기 모달을 제어한다.
5274
+ * SActionModal 루트로 렌더하는 컴포넌트를 띄운다. 컨테이너를 덧씌우지 않고 표시 제어
5275
+ * (open/onOpenChange/onClose) modalRef 주입하며, 닫힘 애니메이션 종료 후 자동으로
5276
+ * 언마운트한다. 컴포넌트가 모달을 띄우지 않으면 개발 모드에서 경고한다.
5253
5277
  */
5254
5278
  create(options) {
5255
5279
  return mount((refImpl) => /* @__PURE__ */ jsx(CreateMount, { options, refImpl }));
@@ -7725,7 +7749,7 @@ var STable = forwardRef(function STable2({
7725
7749
  rowBg,
7726
7750
  "group-hover:bg-[var(--color-grey-05)]",
7727
7751
  stickyShadowClass(i),
7728
- col.tdClass
7752
+ typeof col.tdClass === "function" ? col.tdClass(row) : col.tdClass
7729
7753
  ),
7730
7754
  style: {
7731
7755
  paddingLeft: cellPadX,
@@ -7782,6 +7806,61 @@ var STable = forwardRef(function STable2({
7782
7806
  }
7783
7807
  );
7784
7808
  });
7809
+ var COUNT_NULL = "var(--cmp-table-bar-count-null)";
7810
+ var totalColor = (n) => n > 0 ? "var(--cmp-table-bar-count-total)" : COUNT_NULL;
7811
+ var selectedColor = (n) => n > 0 ? "var(--color-brilliantblue-75)" : COUNT_NULL;
7812
+ var STableBar = forwardRef(function STableBar2({ total, selected, actions, rightActions, className, ...rest }, ref) {
7813
+ const hasTotal = total != null;
7814
+ const hasSelected = selected != null;
7815
+ const hasCount = hasTotal || hasSelected;
7816
+ return /* @__PURE__ */ jsxs(
7817
+ "div",
7818
+ {
7819
+ ref,
7820
+ role: actions || rightActions ? "toolbar" : void 0,
7821
+ className: cn(
7822
+ "flex w-full items-center gap-[var(--cmp-table-bar-section-gap)] px-[var(--sys-space-table-padding-md)]",
7823
+ "h-[var(--cmp-table-bar-height)] shrink-0",
7824
+ "rounded-[var(--cmp-table-radius)] border-[length:var(--cmp-table-border-width)] border-solid border-[var(--cmp-table-border-color)] bg-white",
7825
+ className
7826
+ ),
7827
+ ...rest,
7828
+ children: [
7829
+ hasCount && /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-[var(--cmp-table-content-gap)]", children: [
7830
+ hasTotal && /* @__PURE__ */ jsxs("span", { className: "typo-table-accent whitespace-nowrap text-[var(--sys-color-fg-primary)]", children: [
7831
+ "\uCD1D ",
7832
+ /* @__PURE__ */ jsx("b", { style: { color: totalColor(total) }, children: total.toLocaleString() }),
7833
+ " \uAC74"
7834
+ ] }),
7835
+ hasTotal && hasSelected && /* @__PURE__ */ jsx(
7836
+ "span",
7837
+ {
7838
+ "aria-hidden": "true",
7839
+ className: "typo-table-body text-[var(--sys-color-fg-tertiary)]",
7840
+ children: "/"
7841
+ }
7842
+ ),
7843
+ hasSelected && /* @__PURE__ */ jsxs("span", { className: "typo-table-body whitespace-nowrap text-[var(--sys-color-fg-primary)]", children: [
7844
+ /* @__PURE__ */ jsx("b", { style: { color: selectedColor(selected) }, children: selected.toLocaleString() }),
7845
+ " \uAC74 \uC120\uD0DD"
7846
+ ] })
7847
+ ] }),
7848
+ actions && /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-[var(--cmp-table-bar-section-gap)] has-[>div:empty]:hidden", children: [
7849
+ hasCount && /* @__PURE__ */ jsx(
7850
+ SDivider,
7851
+ {
7852
+ vertical: true,
7853
+ className: "h-[var(--cmp-table-bar-divider-height)] self-center",
7854
+ style: { backgroundColor: "var(--cmp-table-border-color)" }
7855
+ }
7856
+ ),
7857
+ /* @__PURE__ */ jsx("div", { className: "flex items-center gap-[var(--cmp-table-content-gap)]", children: actions })
7858
+ ] }),
7859
+ rightActions && /* @__PURE__ */ jsx("div", { className: "ml-auto flex items-center gap-[var(--cmp-table-content-gap)] empty:hidden", children: rightActions })
7860
+ ]
7861
+ }
7862
+ );
7863
+ });
7785
7864
  var FONT = {
7786
7865
  sm: { fontSize: 12, lineHeight: 20, paddingX: "var(--cmp-textinput-sm-paddingX)" },
7787
7866
  md: { fontSize: 14, lineHeight: 24, paddingX: "var(--cmp-textinput-md-paddingX)" }
@@ -11803,6 +11882,6 @@ function STimeRangePicker({
11803
11882
  );
11804
11883
  }
11805
11884
 
11806
- 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, SExpansionItem, SField, SFilePicker, SForm, SGhostButton, SGnb, SGuide, SIcon, SInput, SKeyValueTable, SLayout, SLayoutContext, SLinearProgress, SLoadingContainer, SLoadingModal, SLoadingViewport, SModal, 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 };
11885
+ 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, SExpansionItem, SField, SFilePicker, SForm, SGhostButton, SGnb, SGuide, SIcon, SInput, SKeyValueTable, SLayout, SLayoutContext, SLinearProgress, SLoadingContainer, SLoadingModal, SLoadingViewport, SModal, SNumberInput, SPage, SPagination, SPopover, SPopup, SPortal, SRadio, SRadioButton, SRadioGroup, SScrollArea, SSelect, SStepper, SSwitch, STEPPER_SIZES, STable, STableBar, 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 };
11807
11886
  //# sourceMappingURL=index.js.map
11808
11887
  //# sourceMappingURL=index.js.map