sellmate-design-system-react 0.11.0 → 1.0.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.
- package/dist/components/SActionModal/SActionModal.cjs +3 -3
- package/dist/components/SActionModal/SActionModal.cjs.map +1 -1
- package/dist/components/SActionModal/SActionModal.js +3 -3
- package/dist/components/SActionModal/SActionModal.js.map +1 -1
- package/dist/components/SBarcodeInput/SBarcodeInput.cjs +1 -1
- package/dist/components/SBarcodeInput/SBarcodeInput.cjs.map +1 -1
- package/dist/components/SBarcodeInput/SBarcodeInput.js +1 -1
- package/dist/components/SBarcodeInput/SBarcodeInput.js.map +1 -1
- package/dist/components/SChipInput/SChipInput.cjs +1 -1
- package/dist/components/SChipInput/SChipInput.cjs.map +1 -1
- package/dist/components/SChipInput/SChipInput.js +1 -1
- package/dist/components/SChipInput/SChipInput.js.map +1 -1
- package/dist/components/SConfirmModal/SConfirmModal.cjs +4 -4
- package/dist/components/SConfirmModal/SConfirmModal.cjs.map +1 -1
- package/dist/components/SConfirmModal/SConfirmModal.js +4 -4
- package/dist/components/SConfirmModal/SConfirmModal.js.map +1 -1
- package/dist/components/SDatePicker/SDatePicker.cjs +1 -1
- package/dist/components/SDatePicker/SDatePicker.cjs.map +1 -1
- package/dist/components/SDatePicker/SDatePicker.js +1 -1
- package/dist/components/SDatePicker/SDatePicker.js.map +1 -1
- package/dist/components/SDateRangePicker/SDateRangePicker.cjs +1 -1
- package/dist/components/SDateRangePicker/SDateRangePicker.cjs.map +1 -1
- package/dist/components/SDateRangePicker/SDateRangePicker.js +1 -1
- package/dist/components/SDateRangePicker/SDateRangePicker.js.map +1 -1
- package/dist/components/SExpansionItem/SExpansionItem.cjs +42 -12
- package/dist/components/SExpansionItem/SExpansionItem.cjs.map +1 -1
- package/dist/components/SExpansionItem/SExpansionItem.d.ts +2 -0
- package/dist/components/SExpansionItem/SExpansionItem.js +43 -13
- package/dist/components/SExpansionItem/SExpansionItem.js.map +1 -1
- package/dist/components/SField/SField.cjs +1 -1
- package/dist/components/SField/SField.cjs.map +1 -1
- package/dist/components/SField/SField.js +1 -1
- package/dist/components/SField/SField.js.map +1 -1
- package/dist/components/SFilePicker/SFilePicker.cjs +1 -1
- package/dist/components/SFilePicker/SFilePicker.cjs.map +1 -1
- package/dist/components/SFilePicker/SFilePicker.js +1 -1
- package/dist/components/SFilePicker/SFilePicker.js.map +1 -1
- package/dist/components/SInput/SInput.cjs +1 -1
- package/dist/components/SInput/SInput.cjs.map +1 -1
- package/dist/components/SInput/SInput.js +1 -1
- package/dist/components/SInput/SInput.js.map +1 -1
- package/dist/components/SKeyValueTable/SKeyValueTable.cjs +1 -1
- package/dist/components/SKeyValueTable/SKeyValueTable.cjs.map +1 -1
- package/dist/components/SKeyValueTable/SKeyValueTable.js +1 -1
- package/dist/components/SKeyValueTable/SKeyValueTable.js.map +1 -1
- package/dist/components/SLoadingModal/SLoadingModal.cjs +3 -3
- package/dist/components/SLoadingModal/SLoadingModal.cjs.map +1 -1
- package/dist/components/SLoadingModal/SLoadingModal.js +3 -3
- package/dist/components/SLoadingModal/SLoadingModal.js.map +1 -1
- package/dist/components/SModal/SModal.cjs +3863 -0
- package/dist/components/SModal/SModal.cjs.map +1 -0
- package/dist/components/SModal/SModal.d.ts +121 -0
- package/dist/components/SModal/SModal.js +3840 -0
- package/dist/components/SModal/SModal.js.map +1 -0
- package/dist/components/SModal/index.d.ts +1 -0
- package/dist/components/SModalContainer/SModalContainer.cjs +1 -1
- package/dist/components/SModalContainer/SModalContainer.cjs.map +1 -1
- package/dist/components/SModalContainer/SModalContainer.js +1 -1
- package/dist/components/SModalContainer/SModalContainer.js.map +1 -1
- package/dist/components/SNumberInput/SNumberInput.cjs +1 -1
- package/dist/components/SNumberInput/SNumberInput.cjs.map +1 -1
- package/dist/components/SNumberInput/SNumberInput.js +1 -1
- package/dist/components/SNumberInput/SNumberInput.js.map +1 -1
- package/dist/components/SSelect/SSelect.cjs +1 -1
- package/dist/components/SSelect/SSelect.cjs.map +1 -1
- package/dist/components/SSelect/SSelect.js +1 -1
- package/dist/components/SSelect/SSelect.js.map +1 -1
- package/dist/components/STable/STable.cjs +2 -2
- package/dist/components/STable/STable.cjs.map +1 -1
- package/dist/components/STable/STable.d.ts +2 -1
- package/dist/components/STable/STable.js +2 -2
- package/dist/components/STable/STable.js.map +1 -1
- package/dist/components/STextarea/STextarea.cjs +1 -1
- package/dist/components/STextarea/STextarea.cjs.map +1 -1
- package/dist/components/STextarea/STextarea.js +1 -1
- package/dist/components/STextarea/STextarea.js.map +1 -1
- package/dist/components/STimePicker/STimePicker.cjs +1 -1
- package/dist/components/STimePicker/STimePicker.cjs.map +1 -1
- package/dist/components/STimePicker/STimePicker.js +1 -1
- package/dist/components/STimePicker/STimePicker.js.map +1 -1
- package/dist/components/STimeRangePicker/STimeRangePicker.cjs +1 -1
- package/dist/components/STimeRangePicker/STimeRangePicker.cjs.map +1 -1
- package/dist/components/STimeRangePicker/STimeRangePicker.js +1 -1
- package/dist/components/STimeRangePicker/STimeRangePicker.js.map +1 -1
- package/dist/components/STooltip/STooltip.cjs +1 -1
- package/dist/components/STooltip/STooltip.cjs.map +1 -1
- package/dist/components/STooltip/STooltip.js +1 -1
- package/dist/components/STooltip/STooltip.js.map +1 -1
- package/dist/index.cjs +291 -22
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +292 -24
- package/dist/index.js.map +1 -1
- package/dist/styles.css +83 -33
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -26,6 +26,7 @@ export * from './components/SGuide';
|
|
|
26
26
|
export * from './components/SConfirmModal';
|
|
27
27
|
export * from './components/SActionModal';
|
|
28
28
|
export * from './components/SLoadingModal';
|
|
29
|
+
export * from './components/SModal';
|
|
29
30
|
export * from './components/SGnb';
|
|
30
31
|
export * from './components/SLayout';
|
|
31
32
|
export * from './components/SPage';
|
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,
|
|
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-
|
|
2944
|
-
!isExpanded && "hover:bg-
|
|
2945
|
-
dense ? "min-h-8 py-
|
|
2946
|
-
"gap-
|
|
2947
|
-
"pr-
|
|
2948
|
-
depth === 2 ? "pl-[calc(var(--cmp-expansionItem-title-paddingX)+32px)]" : depth === 3 ? "pl-[calc(var(--cmp-expansionItem-title-paddingX)+64px)]" : "pl-
|
|
2949
|
-
isExpanded && "bg-
|
|
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 &&
|
|
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(
|
|
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
|
|
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__ */
|
|
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,10 +5037,248 @@ function SLoadingModal({
|
|
|
5007
5037
|
label: buttonLabel ?? DEFAULT_BUTTON_LABEL[state2]
|
|
5008
5038
|
}
|
|
5009
5039
|
)
|
|
5010
|
-
] })
|
|
5040
|
+
] }) })
|
|
5011
5041
|
}
|
|
5012
5042
|
);
|
|
5013
5043
|
}
|
|
5044
|
+
var EXIT_DURATION = 300;
|
|
5045
|
+
var EXIT_BUFFER = 100;
|
|
5046
|
+
var SModalRefImpl = class {
|
|
5047
|
+
constructor() {
|
|
5048
|
+
this.pendingClose = false;
|
|
5049
|
+
this.pendingPatches = [];
|
|
5050
|
+
this.dismissRequested = false;
|
|
5051
|
+
}
|
|
5052
|
+
onOk(fn) {
|
|
5053
|
+
this.okFn = fn;
|
|
5054
|
+
return this;
|
|
5055
|
+
}
|
|
5056
|
+
onCancel(fn) {
|
|
5057
|
+
this.cancelFn = fn;
|
|
5058
|
+
return this;
|
|
5059
|
+
}
|
|
5060
|
+
onClose(fn) {
|
|
5061
|
+
this.closeFn = fn;
|
|
5062
|
+
return this;
|
|
5063
|
+
}
|
|
5064
|
+
onClick(fn) {
|
|
5065
|
+
this.clickFn = fn;
|
|
5066
|
+
return this;
|
|
5067
|
+
}
|
|
5068
|
+
onSubmit(fn) {
|
|
5069
|
+
this.submitFn = fn;
|
|
5070
|
+
return this;
|
|
5071
|
+
}
|
|
5072
|
+
onDismissed(fn) {
|
|
5073
|
+
this.dismissedFn = fn;
|
|
5074
|
+
return this;
|
|
5075
|
+
}
|
|
5076
|
+
update(patch) {
|
|
5077
|
+
if (this.updateBinding) this.updateBinding(patch);
|
|
5078
|
+
else this.pendingPatches.push(patch);
|
|
5079
|
+
return this;
|
|
5080
|
+
}
|
|
5081
|
+
// 닫힘 트리거 — 이미 닫힘이 시작됐으면 무시(중복 콜백 방지)
|
|
5082
|
+
settle(emit2) {
|
|
5083
|
+
if (this.dismissRequested) return;
|
|
5084
|
+
this.dismissRequested = true;
|
|
5085
|
+
emit2();
|
|
5086
|
+
if (this.closeBinding) this.closeBinding();
|
|
5087
|
+
else this.pendingClose = true;
|
|
5088
|
+
}
|
|
5089
|
+
ok() {
|
|
5090
|
+
this.settle(() => this.okFn?.());
|
|
5091
|
+
return this;
|
|
5092
|
+
}
|
|
5093
|
+
cancel() {
|
|
5094
|
+
this.settle(() => this.cancelFn?.());
|
|
5095
|
+
return this;
|
|
5096
|
+
}
|
|
5097
|
+
close() {
|
|
5098
|
+
this.settle(() => this.closeFn?.());
|
|
5099
|
+
return this;
|
|
5100
|
+
}
|
|
5101
|
+
submit() {
|
|
5102
|
+
this.submitFn?.();
|
|
5103
|
+
return this;
|
|
5104
|
+
}
|
|
5105
|
+
/** @internal 마운트 컴포넌트가 닫기 함수를 등록 (등록 전 close() 호출은 지연 반영) */
|
|
5106
|
+
_bindClose(fn) {
|
|
5107
|
+
this.closeBinding = fn;
|
|
5108
|
+
if (this.pendingClose) fn();
|
|
5109
|
+
}
|
|
5110
|
+
/** @internal 마운트 컴포넌트가 옵션 갱신 함수를 등록 (등록 전 update() 호출은 지연 반영) */
|
|
5111
|
+
_bindUpdate(fn) {
|
|
5112
|
+
this.updateBinding = fn;
|
|
5113
|
+
if (this.pendingPatches.length) {
|
|
5114
|
+
this.pendingPatches.forEach(fn);
|
|
5115
|
+
this.pendingPatches = [];
|
|
5116
|
+
}
|
|
5117
|
+
}
|
|
5118
|
+
/** @internal 정리 대상(root·host) 주입 */
|
|
5119
|
+
_setTeardown(root, host) {
|
|
5120
|
+
this.root = root;
|
|
5121
|
+
this.host = host;
|
|
5122
|
+
}
|
|
5123
|
+
/** @internal create 의 마운트 검사용 host 조회 */
|
|
5124
|
+
_getHost() {
|
|
5125
|
+
return this.host;
|
|
5126
|
+
}
|
|
5127
|
+
/** @internal 닫힘 시작 표시 — 컴포넌트 버튼·백드롭·ESC 닫힘 경로가 호출(중복 트리거 방지) */
|
|
5128
|
+
_markDismissed() {
|
|
5129
|
+
this.dismissRequested = true;
|
|
5130
|
+
}
|
|
5131
|
+
/** @internal confirm 버튼 경로에서 onOk 발화 */
|
|
5132
|
+
_emitOk() {
|
|
5133
|
+
this.okFn?.();
|
|
5134
|
+
}
|
|
5135
|
+
/** @internal confirm 버튼 경로에서 onCancel 발화 */
|
|
5136
|
+
_emitCancel() {
|
|
5137
|
+
this.cancelFn?.();
|
|
5138
|
+
}
|
|
5139
|
+
/** @internal 닫기(X) 경로에서 onClose 발화 */
|
|
5140
|
+
_emitClose() {
|
|
5141
|
+
this.closeFn?.();
|
|
5142
|
+
}
|
|
5143
|
+
/** @internal loading 버튼 경로에서 onClick 발화 */
|
|
5144
|
+
_emitClick() {
|
|
5145
|
+
this.clickFn?.();
|
|
5146
|
+
}
|
|
5147
|
+
/** @internal */
|
|
5148
|
+
_emitDismissed() {
|
|
5149
|
+
this.dismissedFn?.();
|
|
5150
|
+
}
|
|
5151
|
+
/** @internal 닫힘 애니메이션 종료 후 언마운트 */
|
|
5152
|
+
_teardown() {
|
|
5153
|
+
this.root?.unmount();
|
|
5154
|
+
this.host?.remove();
|
|
5155
|
+
}
|
|
5156
|
+
};
|
|
5157
|
+
function useExitTeardown(open, refImpl) {
|
|
5158
|
+
const dismissedRef = useRef(false);
|
|
5159
|
+
useEffect(() => {
|
|
5160
|
+
if (open || dismissedRef.current) return;
|
|
5161
|
+
dismissedRef.current = true;
|
|
5162
|
+
const t = setTimeout(() => {
|
|
5163
|
+
refImpl._emitDismissed();
|
|
5164
|
+
refImpl._teardown();
|
|
5165
|
+
}, EXIT_DURATION + EXIT_BUFFER);
|
|
5166
|
+
return () => clearTimeout(t);
|
|
5167
|
+
}, [open, refImpl]);
|
|
5168
|
+
}
|
|
5169
|
+
function ConfirmMount({ options, refImpl }) {
|
|
5170
|
+
const [open, setOpen] = useState(true);
|
|
5171
|
+
const [opts, setOpts] = useState(options);
|
|
5172
|
+
useEffect(() => {
|
|
5173
|
+
refImpl._bindClose(() => setOpen(false));
|
|
5174
|
+
refImpl._bindUpdate((patch) => setOpts((prev) => ({ ...prev, ...patch })));
|
|
5175
|
+
}, [refImpl]);
|
|
5176
|
+
useExitTeardown(open, refImpl);
|
|
5177
|
+
return /* @__PURE__ */ jsx(
|
|
5178
|
+
SConfirmModal,
|
|
5179
|
+
{
|
|
5180
|
+
...opts,
|
|
5181
|
+
open,
|
|
5182
|
+
onOpenChange: (o) => {
|
|
5183
|
+
if (!o) refImpl._markDismissed();
|
|
5184
|
+
setOpen(o);
|
|
5185
|
+
},
|
|
5186
|
+
onOk: () => refImpl._emitOk(),
|
|
5187
|
+
onCancel: () => refImpl._emitCancel(),
|
|
5188
|
+
onClose: () => refImpl._emitClose()
|
|
5189
|
+
}
|
|
5190
|
+
);
|
|
5191
|
+
}
|
|
5192
|
+
function LoadingMount({ options, refImpl }) {
|
|
5193
|
+
const [open, setOpen] = useState(true);
|
|
5194
|
+
const [opts, setOpts] = useState(options);
|
|
5195
|
+
const buttonClicked = useRef(false);
|
|
5196
|
+
useEffect(() => {
|
|
5197
|
+
refImpl._bindClose(() => setOpen(false));
|
|
5198
|
+
refImpl._bindUpdate((patch) => setOpts((prev) => ({ ...prev, ...patch })));
|
|
5199
|
+
}, [refImpl]);
|
|
5200
|
+
useExitTeardown(open, refImpl);
|
|
5201
|
+
return /* @__PURE__ */ jsx(
|
|
5202
|
+
SLoadingModal,
|
|
5203
|
+
{
|
|
5204
|
+
...opts,
|
|
5205
|
+
open,
|
|
5206
|
+
onOpenChange: (o) => {
|
|
5207
|
+
if (!o && buttonClicked.current) {
|
|
5208
|
+
buttonClicked.current = false;
|
|
5209
|
+
return;
|
|
5210
|
+
}
|
|
5211
|
+
if (!o) refImpl._markDismissed();
|
|
5212
|
+
setOpen(o);
|
|
5213
|
+
},
|
|
5214
|
+
onClose: () => refImpl._emitClose(),
|
|
5215
|
+
onButtonClick: () => {
|
|
5216
|
+
buttonClicked.current = true;
|
|
5217
|
+
refImpl._emitClick();
|
|
5218
|
+
}
|
|
5219
|
+
}
|
|
5220
|
+
);
|
|
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
|
+
}
|
|
5230
|
+
function CreateMount({ options, refImpl }) {
|
|
5231
|
+
const { component: Component, componentProps } = options;
|
|
5232
|
+
const [open, setOpen] = useState(true);
|
|
5233
|
+
useEffect(() => {
|
|
5234
|
+
refImpl._bindClose(() => setOpen(false));
|
|
5235
|
+
refImpl._bindUpdate(() => {
|
|
5236
|
+
});
|
|
5237
|
+
warnIfNotModal(refImpl._getHost(), Component);
|
|
5238
|
+
}, [refImpl, Component]);
|
|
5239
|
+
useExitTeardown(open, refImpl);
|
|
5240
|
+
const componentAllProps = {
|
|
5241
|
+
...componentProps,
|
|
5242
|
+
open,
|
|
5243
|
+
onOpenChange: (o) => {
|
|
5244
|
+
if (!o) refImpl._markDismissed();
|
|
5245
|
+
setOpen(o);
|
|
5246
|
+
},
|
|
5247
|
+
onClose: () => refImpl._emitClose(),
|
|
5248
|
+
modalRef: refImpl
|
|
5249
|
+
};
|
|
5250
|
+
return /* @__PURE__ */ jsx(Component, { ...componentAllProps });
|
|
5251
|
+
}
|
|
5252
|
+
function mount(render) {
|
|
5253
|
+
const host = document.createElement("div");
|
|
5254
|
+
document.body.appendChild(host);
|
|
5255
|
+
const refImpl = new SModalRefImpl();
|
|
5256
|
+
const root = createRoot(host);
|
|
5257
|
+
refImpl._setTeardown(root, host);
|
|
5258
|
+
root.render(render(refImpl));
|
|
5259
|
+
return refImpl;
|
|
5260
|
+
}
|
|
5261
|
+
var SModal = {
|
|
5262
|
+
/** 확인/취소 모달을 즉시 띄운다. 반환 핸들에 onOk/onCancel/onClose/onDismissed 체이닝. */
|
|
5263
|
+
confirm(options) {
|
|
5264
|
+
return mount((refImpl) => /* @__PURE__ */ jsx(ConfirmMount, { options, refImpl }));
|
|
5265
|
+
},
|
|
5266
|
+
/**
|
|
5267
|
+
* 로딩(스피너/에러) 모달을 즉시 띄운다. 로딩 중 임의 닫힘 방지를 위해 persistent 기본 true.
|
|
5268
|
+
* 버튼 클릭은 자동 닫힘 없이 onClick 만 발화 — update()/close() 로 후속 동작을 결정한다.
|
|
5269
|
+
*/
|
|
5270
|
+
loading(options = {}) {
|
|
5271
|
+
return mount((refImpl) => /* @__PURE__ */ jsx(LoadingMount, { options: { persistent: true, ...options }, refImpl }));
|
|
5272
|
+
},
|
|
5273
|
+
/**
|
|
5274
|
+
* SActionModal 을 루트로 렌더하는 컴포넌트를 띄운다. 컨테이너를 덧씌우지 않고 표시 제어
|
|
5275
|
+
* (open/onOpenChange/onClose)와 modalRef 만 주입하며, 닫힘 애니메이션 종료 후 자동으로
|
|
5276
|
+
* 언마운트한다. 컴포넌트가 모달을 띄우지 않으면 개발 모드에서 경고한다.
|
|
5277
|
+
*/
|
|
5278
|
+
create(options) {
|
|
5279
|
+
return mount((refImpl) => /* @__PURE__ */ jsx(CreateMount, { options, refImpl }));
|
|
5280
|
+
}
|
|
5281
|
+
};
|
|
5014
5282
|
|
|
5015
5283
|
// src/components/SGnb/gnb.config.ts
|
|
5016
5284
|
var gnb = (p) => `var(--cmp-gnb-${p})`;
|
|
@@ -7481,7 +7749,7 @@ var STable = forwardRef(function STable2({
|
|
|
7481
7749
|
rowBg,
|
|
7482
7750
|
"group-hover:bg-[var(--color-grey-05)]",
|
|
7483
7751
|
stickyShadowClass(i),
|
|
7484
|
-
col.tdClass
|
|
7752
|
+
typeof col.tdClass === "function" ? col.tdClass(row) : col.tdClass
|
|
7485
7753
|
),
|
|
7486
7754
|
style: {
|
|
7487
7755
|
paddingLeft: cellPadX,
|
|
@@ -11559,6 +11827,6 @@ function STimeRangePicker({
|
|
|
11559
11827
|
);
|
|
11560
11828
|
}
|
|
11561
11829
|
|
|
11562
|
-
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, 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 };
|
|
11830
|
+
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 };
|
|
11563
11831
|
//# sourceMappingURL=index.js.map
|
|
11564
11832
|
//# sourceMappingURL=index.js.map
|