sellmate-design-system-react 9.0.0-beta.40 → 9.0.0-beta.41
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/AGENTS.md +41 -20
- package/dist/components/SBarcodeInput/README.md +3 -3
- package/dist/components/SBarcodeInput/SBarcodeInput.d.ts +3 -1
- package/dist/components/SChipInput/README.md +1 -1
- package/dist/components/SChipInput/SChipInput.d.ts +1 -1
- package/dist/components/SConfirmModal/README.md +3 -11
- package/dist/components/SConfirmModal/SConfirmModal.d.ts +16 -8
- package/dist/components/SConfirmModal/index.d.ts +1 -1
- package/dist/components/SDateRangePicker/README.md +2 -2
- package/dist/components/SDateRangePicker/SDateRangePicker.d.ts +4 -4
- package/dist/components/SEditor/EditorBody.d.ts +1 -1
- package/dist/components/SEditor/README.md +4 -4
- package/dist/components/SEditor/SEditor.d.ts +3 -3
- package/dist/components/SField/README.md +2 -2
- package/dist/components/SField/SField.d.ts +8 -2
- package/dist/components/SFilePicker/README.md +3 -3
- package/dist/components/SFilePicker/SFilePicker.d.ts +4 -4
- package/dist/components/SForm/README.md +1 -1
- package/dist/components/SForm/SForm.d.ts +2 -2
- package/dist/components/SGnb/README.md +7 -7
- package/dist/components/SGnb/SGnb.d.ts +9 -9
- package/dist/components/SGnb/gnb.config.d.ts +2 -2
- package/dist/components/SImage/README.md +1 -1
- package/dist/components/SImage/SImage.d.ts +2 -2
- package/dist/components/SInput/README.md +3 -3
- package/dist/components/SInput/SInput.d.ts +3 -3
- package/dist/components/SLayout/README.md +1 -1
- package/dist/components/SLayout/SLayout.d.ts +2 -2
- package/dist/components/SList/README.md +10 -2
- package/dist/components/SList/SList.d.ts +7 -3
- package/dist/components/SList/index.d.ts +1 -1
- package/dist/components/SLoadingModal/README.md +1 -1
- package/dist/components/SLoadingModal/SLoadingModal.d.ts +2 -2
- package/dist/components/SModal/README.md +1 -1
- package/dist/components/SNumberInput/README.md +5 -5
- package/dist/components/SNumberInput/SNumberInput.d.ts +5 -3
- package/dist/components/SPage/README.md +42 -3
- package/dist/components/SPage/SPage.d.ts +16 -1
- package/dist/components/SPage/SPageHeader.d.ts +19 -8
- package/dist/components/SPage/index.d.ts +1 -1
- package/dist/components/SPage/page-column.d.ts +11 -2
- package/dist/components/SPage/page-width.d.ts +23 -0
- package/dist/components/SPage/page.config.d.ts +18 -0
- package/dist/components/SPopup/README.md +8 -2
- package/dist/components/SPopup/SPopup.d.ts +7 -3
- package/dist/components/SPopup/index.d.ts +1 -1
- package/dist/components/SSearchInput/README.md +3 -3
- package/dist/components/SSearchInput/SSearchInput.d.ts +3 -3
- package/dist/components/SSelect/README.md +5 -5
- package/dist/components/SSelect/SSelect.d.ts +14 -6
- package/dist/components/SSplitter/README.md +2 -2
- package/dist/components/SSplitter/SSplitter.d.ts +7 -3
- package/dist/components/SSwitch/README.md +0 -1
- package/dist/components/SSwitch/SSwitch.d.ts +1 -3
- package/dist/components/STable/README.md +8 -9
- package/dist/components/STable/STable.d.ts +9 -11
- package/dist/components/STabs/README.md +1 -1
- package/dist/components/STabs/STabs.d.ts +2 -2
- package/dist/components/STextLink/README.md +1 -1
- package/dist/components/STextLink/STextLink.d.ts +1 -1
- package/dist/components/STextarea/README.md +3 -3
- package/dist/components/STextarea/STextarea.d.ts +3 -3
- package/dist/components/STimePicker/README.md +1 -1
- package/dist/components/STimePicker/STimePicker.d.ts +4 -4
- package/dist/components/STimeRangePicker/README.md +1 -1
- package/dist/components/STimeRangePicker/STimeRangePicker.d.ts +4 -4
- package/dist/components/SToast/README.md +1 -1
- package/dist/components/SToast/SToast.d.ts +2 -2
- package/dist/components/STooltip/README.md +1 -1
- package/dist/components/STooltip/STooltip.d.ts +1 -1
- package/dist/components/STree/README.md +4 -4
- package/dist/components/STree/STree.d.ts +17 -5
- package/dist/index.cjs +295 -237
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +294 -238
- package/dist/index.js.map +1 -1
- package/dist/llms-full.txt +170 -106
- package/dist/llms.txt +41 -20
- package/dist/styles.css +9 -0
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -3413,7 +3413,7 @@ var SImage = /* @__PURE__ */ react.forwardRef(function SImage2({
|
|
|
3413
3413
|
position = "50% 50%",
|
|
3414
3414
|
loading: loading2 = "lazy",
|
|
3415
3415
|
loadingShowDelay = 0,
|
|
3416
|
-
|
|
3416
|
+
showSpinner = true,
|
|
3417
3417
|
loadingSlot,
|
|
3418
3418
|
errorSlot,
|
|
3419
3419
|
imgProps,
|
|
@@ -3449,7 +3449,7 @@ var SImage = /* @__PURE__ */ react.forwardRef(function SImage2({
|
|
|
3449
3449
|
}, [status, loadingShowDelay, src]);
|
|
3450
3450
|
const isEmpty = !src;
|
|
3451
3451
|
const showFallback = isEmpty || status === "error";
|
|
3452
|
-
const
|
|
3452
|
+
const spinnerShown = !isEmpty && status === "loading" && showSpinner && spinnerVisible;
|
|
3453
3453
|
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
3454
3454
|
"div",
|
|
3455
3455
|
{
|
|
@@ -3488,7 +3488,7 @@ var SImage = /* @__PURE__ */ react.forwardRef(function SImage2({
|
|
|
3488
3488
|
}
|
|
3489
3489
|
),
|
|
3490
3490
|
showFallback && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "absolute inset-0 flex items-center justify-center", children: errorSlot ?? /* @__PURE__ */ jsxRuntime.jsx(SIcon, { name: "image", size: EMPTY_ICON_SIZE, color: "var(--cmp-image-icon)" }) }),
|
|
3491
|
-
|
|
3491
|
+
spinnerShown && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "absolute inset-0 flex items-center justify-center", children: loadingSlot ?? /* @__PURE__ */ jsxRuntime.jsx(SCircleProgress, { indeterminate: true, type: "neutral", size: SPINNER_SIZE }) })
|
|
3492
3492
|
]
|
|
3493
3493
|
}
|
|
3494
3494
|
);
|
|
@@ -4080,6 +4080,10 @@ var SDivider = /* @__PURE__ */ react.forwardRef(function SDivider2({ vertical =
|
|
|
4080
4080
|
}
|
|
4081
4081
|
);
|
|
4082
4082
|
});
|
|
4083
|
+
var PADDING_CLASS = {
|
|
4084
|
+
default: "p-(--cmp-list-group-padding)",
|
|
4085
|
+
none: ""
|
|
4086
|
+
};
|
|
4083
4087
|
var dividerStyle = { backgroundColor: "var(--cmp-listItem-border-default)" };
|
|
4084
4088
|
function hasBorderedChild(children) {
|
|
4085
4089
|
let bordered = false;
|
|
@@ -4105,15 +4109,15 @@ function withDividers(children) {
|
|
|
4105
4109
|
]
|
|
4106
4110
|
);
|
|
4107
4111
|
}
|
|
4108
|
-
var SListImpl = /* @__PURE__ */ react.forwardRef(function SList({ className, children,
|
|
4109
|
-
const showDivider = !
|
|
4112
|
+
var SListImpl = /* @__PURE__ */ react.forwardRef(function SList({ className, children, gap = false, padding = "none", ...rest }, ref) {
|
|
4113
|
+
const showDivider = !gap && !hasBorderedChild(children);
|
|
4110
4114
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
4111
4115
|
"div",
|
|
4112
4116
|
{
|
|
4113
4117
|
ref,
|
|
4114
4118
|
className: cn(
|
|
4115
|
-
|
|
4116
|
-
|
|
4119
|
+
gap && "flex flex-col gap-(--cmp-list-group-gap)",
|
|
4120
|
+
PADDING_CLASS[padding],
|
|
4117
4121
|
className
|
|
4118
4122
|
),
|
|
4119
4123
|
...rest,
|
|
@@ -4358,7 +4362,7 @@ function SDraggableListInner({
|
|
|
4358
4362
|
maxDepth = 3,
|
|
4359
4363
|
listId,
|
|
4360
4364
|
group: groupName,
|
|
4361
|
-
|
|
4365
|
+
gap,
|
|
4362
4366
|
className,
|
|
4363
4367
|
...rest
|
|
4364
4368
|
}, ref) {
|
|
@@ -4373,7 +4377,7 @@ function SDraggableListInner({
|
|
|
4373
4377
|
const fromIndexRef = react.useRef(null);
|
|
4374
4378
|
const currentSelectedKey = selectedKey ?? internalSelectedKey;
|
|
4375
4379
|
const usesDepth = getDepth != null;
|
|
4376
|
-
const depthEnabled = usesDepth && !
|
|
4380
|
+
const depthEnabled = usesDepth && !gap;
|
|
4377
4381
|
const groupDragging = dragContext?.dragging;
|
|
4378
4382
|
const draggedSubtreeStart = dragContext ? groupDragging?.listId === listId ? groupDragging?.index ?? null : null : draggingIndex;
|
|
4379
4383
|
const startDrag = react.useCallback((event, index) => {
|
|
@@ -4487,11 +4491,11 @@ function SDraggableListInner({
|
|
|
4487
4491
|
borderTop: "2px solid var(--sys-color-fg-accentLight)",
|
|
4488
4492
|
left: getIndicatorOffset(depth),
|
|
4489
4493
|
right: 0,
|
|
4490
|
-
top:
|
|
4494
|
+
top: gap ? -5 : 0
|
|
4491
4495
|
});
|
|
4492
4496
|
const afterIndicatorStyle = (depth) => ({
|
|
4493
4497
|
borderTop: "2px solid var(--sys-color-fg-accentLight)",
|
|
4494
|
-
bottom:
|
|
4498
|
+
bottom: gap ? -5 : -1,
|
|
4495
4499
|
left: getIndicatorOffset(depth),
|
|
4496
4500
|
right: 0
|
|
4497
4501
|
});
|
|
@@ -4514,7 +4518,7 @@ function SDraggableListInner({
|
|
|
4514
4518
|
{
|
|
4515
4519
|
ref: setListRef,
|
|
4516
4520
|
...rest,
|
|
4517
|
-
|
|
4521
|
+
gap,
|
|
4518
4522
|
className: `${className ?? ""} ${dragContext ? "min-h-[40px]" : ""} ${showEmptyDrop ? "relative before:absolute before:left-0 before:right-0 before:top-0 before:z-10 before:h-[2px] before:bg-(--sys-color-fg-accentLight) before:content-['']" : ""}`,
|
|
4519
4523
|
"data-drag-active": dragActive || void 0,
|
|
4520
4524
|
"data-draggable-group": dragContext ? dragGroup : void 0,
|
|
@@ -5352,7 +5356,7 @@ function STreeAllItem({
|
|
|
5352
5356
|
var STreeItemImpl = /* @__PURE__ */ react.forwardRef(function STreeItem({
|
|
5353
5357
|
node,
|
|
5354
5358
|
depth = 1,
|
|
5355
|
-
|
|
5359
|
+
last = true,
|
|
5356
5360
|
ancestorLast = [],
|
|
5357
5361
|
expanded = false,
|
|
5358
5362
|
selected = false,
|
|
@@ -5420,7 +5424,7 @@ var STreeItemImpl = /* @__PURE__ */ react.forwardRef(function STreeItem({
|
|
|
5420
5424
|
size,
|
|
5421
5425
|
depth,
|
|
5422
5426
|
hasChildren,
|
|
5423
|
-
isLast,
|
|
5427
|
+
isLast: last,
|
|
5424
5428
|
ancestorLast
|
|
5425
5429
|
}
|
|
5426
5430
|
),
|
|
@@ -5488,7 +5492,7 @@ var STreeImpl = /* @__PURE__ */ react.forwardRef(function STree({
|
|
|
5488
5492
|
defaultExpandedIds,
|
|
5489
5493
|
selectable = true,
|
|
5490
5494
|
size = "sm",
|
|
5491
|
-
|
|
5495
|
+
showSelectAll = false,
|
|
5492
5496
|
cascadeSelection = true,
|
|
5493
5497
|
guideline = true,
|
|
5494
5498
|
border = true,
|
|
@@ -5511,7 +5515,7 @@ var STreeImpl = /* @__PURE__ */ react.forwardRef(function STree({
|
|
|
5511
5515
|
const allSelected = selectableIds.length > 0 && selectableIds.every((id) => selectedSet.has(id));
|
|
5512
5516
|
const someSelected = selectableIds.some((id) => selectedSet.has(id));
|
|
5513
5517
|
const allIndeterminate = someSelected && !allSelected;
|
|
5514
|
-
const showAllItem = selectable &&
|
|
5518
|
+
const showAllItem = selectable && showSelectAll;
|
|
5515
5519
|
const updateExpanded = (node) => {
|
|
5516
5520
|
const next = new Set(currentExpandedIds);
|
|
5517
5521
|
if (next.has(node.id)) next.delete(node.id);
|
|
@@ -5555,7 +5559,7 @@ var STreeImpl = /* @__PURE__ */ react.forwardRef(function STree({
|
|
|
5555
5559
|
{
|
|
5556
5560
|
node,
|
|
5557
5561
|
depth,
|
|
5558
|
-
isLast,
|
|
5562
|
+
last: isLast,
|
|
5559
5563
|
ancestorLast,
|
|
5560
5564
|
expanded: isExpanded,
|
|
5561
5565
|
selected,
|
|
@@ -5699,7 +5703,7 @@ var STooltipImpl = /* @__PURE__ */ react.forwardRef(function STooltip({
|
|
|
5699
5703
|
placement = "top",
|
|
5700
5704
|
sideOffset = 8,
|
|
5701
5705
|
tooltipType = "default",
|
|
5702
|
-
|
|
5706
|
+
showClose = false,
|
|
5703
5707
|
disabled = false,
|
|
5704
5708
|
children,
|
|
5705
5709
|
icon = "helpOutline",
|
|
@@ -5734,7 +5738,7 @@ var STooltipImpl = /* @__PURE__ */ react.forwardRef(function STooltip({
|
|
|
5734
5738
|
setOpenState(true);
|
|
5735
5739
|
};
|
|
5736
5740
|
const startHide = () => {
|
|
5737
|
-
if (
|
|
5741
|
+
if (showClose) return;
|
|
5738
5742
|
cancelHide();
|
|
5739
5743
|
hideTimer.current = setTimeout(() => setOpenState(false), HIDE_DELAY_MS);
|
|
5740
5744
|
};
|
|
@@ -5785,7 +5789,7 @@ var STooltipImpl = /* @__PURE__ */ react.forwardRef(function STooltip({
|
|
|
5785
5789
|
return /* @__PURE__ */ jsxRuntime.jsxs(RPopover12__namespace.Root, { open, onOpenChange: setOpenState, children: [
|
|
5786
5790
|
isNone ? (
|
|
5787
5791
|
// 트리거 없음: children 을 래퍼 없이 그대로 앵커로 쓴다 (소비자 레이아웃 보존).
|
|
5788
|
-
// mouse/focus 핸들러가 없으므로
|
|
5792
|
+
// mouse/focus 핸들러가 없으므로 showClose 없이도 자동 닫힘이 발생하지 않는다.
|
|
5789
5793
|
/* @__PURE__ */ jsxRuntime.jsx(RPopover12__namespace.Anchor, { asChild: true, children: triggerNode })
|
|
5790
5794
|
) : isHover ? (
|
|
5791
5795
|
// hover: Anchor(위치 기준) + 직접 mouse 핸들러 — 클릭으로 토글되지 않도록 Trigger 미사용
|
|
@@ -5810,10 +5814,10 @@ var STooltipImpl = /* @__PURE__ */ react.forwardRef(function STooltip({
|
|
|
5810
5814
|
style: contentStyle,
|
|
5811
5815
|
onOpenAutoFocus: (e) => e.preventDefault(),
|
|
5812
5816
|
onInteractOutside: (e) => {
|
|
5813
|
-
if (
|
|
5817
|
+
if (showClose || isNone) e.preventDefault();
|
|
5814
5818
|
},
|
|
5815
5819
|
onEscapeKeyDown: (e) => {
|
|
5816
|
-
if (
|
|
5820
|
+
if (showClose || isNone) e.preventDefault();
|
|
5817
5821
|
},
|
|
5818
5822
|
onMouseEnter: isHover ? cancelHide : void 0,
|
|
5819
5823
|
onMouseLeave: isHover ? startHide : void 0,
|
|
@@ -5821,7 +5825,7 @@ var STooltipImpl = /* @__PURE__ */ react.forwardRef(function STooltip({
|
|
|
5821
5825
|
children: [
|
|
5822
5826
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-start gap-[12px]", children: [
|
|
5823
5827
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "min-w-0 flex-1", children: body }),
|
|
5824
|
-
|
|
5828
|
+
showClose && !isNone && /* @__PURE__ */ jsxRuntime.jsx(
|
|
5825
5829
|
SGhostButton,
|
|
5826
5830
|
{
|
|
5827
5831
|
icon: "close",
|
|
@@ -6078,7 +6082,7 @@ var SSplitterRoot = /* @__PURE__ */ react.forwardRef(function SSplitter({
|
|
|
6078
6082
|
onValueChange,
|
|
6079
6083
|
unit = "%",
|
|
6080
6084
|
limits,
|
|
6081
|
-
|
|
6085
|
+
updateWhileDragging = false,
|
|
6082
6086
|
vertical = false,
|
|
6083
6087
|
disabled = false,
|
|
6084
6088
|
dividerClassName,
|
|
@@ -6108,8 +6112,8 @@ var SSplitterRoot = /* @__PURE__ */ react.forwardRef(function SSplitter({
|
|
|
6108
6112
|
const [minLimit, maxLimit] = limits ?? SSPLITTER_DEFAULT_LIMITS[unit];
|
|
6109
6113
|
const stateRef = react.useRef({ committedValue, unit, vertical, minLimit, maxLimit });
|
|
6110
6114
|
stateRef.current = { committedValue, unit, vertical, minLimit, maxLimit };
|
|
6111
|
-
const emitRef = react.useRef({ onValueChange,
|
|
6112
|
-
emitRef.current = { onValueChange,
|
|
6115
|
+
const emitRef = react.useRef({ onValueChange, updateWhileDragging, isControlled });
|
|
6116
|
+
emitRef.current = { onValueChange, updateWhileDragging, isControlled };
|
|
6113
6117
|
const measure = react.useCallback(() => {
|
|
6114
6118
|
const el = rootRef.current;
|
|
6115
6119
|
if (!el) return 0;
|
|
@@ -6148,7 +6152,7 @@ var SSplitterRoot = /* @__PURE__ */ react.forwardRef(function SSplitter({
|
|
|
6148
6152
|
const delta = (isVertical ? moveEvent.clientY : moveEvent.clientX) - startPos;
|
|
6149
6153
|
latest = clamp4(startValue + multiplier * delta, containerSize);
|
|
6150
6154
|
setDragValue(latest);
|
|
6151
|
-
if (emitRef.current.
|
|
6155
|
+
if (emitRef.current.updateWhileDragging) commit(latest);
|
|
6152
6156
|
};
|
|
6153
6157
|
const endDrag = () => {
|
|
6154
6158
|
document.removeEventListener("mousemove", onMove);
|
|
@@ -6585,7 +6589,7 @@ var STextLink = /* @__PURE__ */ react.forwardRef(function STextLink2({
|
|
|
6585
6589
|
icon,
|
|
6586
6590
|
iconColor,
|
|
6587
6591
|
iconRotate,
|
|
6588
|
-
|
|
6592
|
+
labelClassName,
|
|
6589
6593
|
rightArrow = "none",
|
|
6590
6594
|
rightArrowRotate,
|
|
6591
6595
|
underline = false,
|
|
@@ -6632,7 +6636,7 @@ var STextLink = /* @__PURE__ */ react.forwardRef(function STextLink2({
|
|
|
6632
6636
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
6633
6637
|
"span",
|
|
6634
6638
|
{
|
|
6635
|
-
className: cn(
|
|
6639
|
+
className: cn(labelClassName),
|
|
6636
6640
|
style: disabled ? { color: "var(--cmp-textLink-content-disabled)" } : void 0,
|
|
6637
6641
|
children: label || children
|
|
6638
6642
|
}
|
|
@@ -6898,13 +6902,12 @@ function SSwitch({
|
|
|
6898
6902
|
value = false,
|
|
6899
6903
|
leftLabel,
|
|
6900
6904
|
rightLabel,
|
|
6901
|
-
label,
|
|
6902
6905
|
disabled = false,
|
|
6903
6906
|
onValueChange,
|
|
6904
6907
|
className,
|
|
6905
6908
|
style
|
|
6906
6909
|
}) {
|
|
6907
|
-
const right = rightLabel
|
|
6910
|
+
const right = rightLabel;
|
|
6908
6911
|
const renderLabel = (text) => text ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-[12px] font-medium leading-[20px]", children: text }) : null;
|
|
6909
6912
|
const trackBg = disabled ? value ? "var(--cmp-switch-bg-disabled-on)" : "var(--cmp-switch-bg-disabled-off)" : value ? "var(--cmp-switch-bg-on)" : "var(--cmp-switch-bg-off)";
|
|
6910
6913
|
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
@@ -7788,7 +7791,7 @@ function SPopover({
|
|
|
7788
7791
|
STextLink,
|
|
7789
7792
|
{
|
|
7790
7793
|
label: leftLinkLabel,
|
|
7791
|
-
|
|
7794
|
+
labelClassName: leftLinkLabelClass,
|
|
7792
7795
|
onClick: onLeftLinkClick
|
|
7793
7796
|
}
|
|
7794
7797
|
),
|
|
@@ -7811,14 +7814,18 @@ function SPopover({
|
|
|
7811
7814
|
) })
|
|
7812
7815
|
] });
|
|
7813
7816
|
}
|
|
7817
|
+
var BODY_PADDING_CLASS2 = {
|
|
7818
|
+
default: "p-(--sys-space-panel-padding-default)",
|
|
7819
|
+
none: ""
|
|
7820
|
+
};
|
|
7814
7821
|
var SPopup = /* @__PURE__ */ react.forwardRef(function SPopup2({
|
|
7815
7822
|
popupTitle = "",
|
|
7816
7823
|
type = "default",
|
|
7817
|
-
|
|
7824
|
+
showFooter = false,
|
|
7818
7825
|
submitButton,
|
|
7819
7826
|
onSubmit,
|
|
7820
7827
|
footerLeft,
|
|
7821
|
-
|
|
7828
|
+
padding = "default",
|
|
7822
7829
|
children,
|
|
7823
7830
|
className,
|
|
7824
7831
|
style
|
|
@@ -7853,7 +7860,7 @@ var SPopup = /* @__PURE__ */ react.forwardRef(function SPopup2({
|
|
|
7853
7860
|
{
|
|
7854
7861
|
className: cn(
|
|
7855
7862
|
"box-border min-h-0 flex-1 overflow-auto",
|
|
7856
|
-
|
|
7863
|
+
BODY_PADDING_CLASS2[padding],
|
|
7857
7864
|
SCROLLBAR_CLASS,
|
|
7858
7865
|
SCROLLBAR_TRACK_BG_CLASS,
|
|
7859
7866
|
SCROLLBAR_TRACK_BORDER_CLASS
|
|
@@ -7861,7 +7868,7 @@ var SPopup = /* @__PURE__ */ react.forwardRef(function SPopup2({
|
|
|
7861
7868
|
children
|
|
7862
7869
|
}
|
|
7863
7870
|
),
|
|
7864
|
-
|
|
7871
|
+
showFooter && /* @__PURE__ */ jsxRuntime.jsx(SFooter, { left: footerLeft, button: { ...submitButton, onClick: onSubmit } })
|
|
7865
7872
|
]
|
|
7866
7873
|
}
|
|
7867
7874
|
);
|
|
@@ -8157,17 +8164,15 @@ var TYPE_ICON_COLOR = {
|
|
|
8157
8164
|
negative: "var(--cmp-modal-confirm-negative-icon)",
|
|
8158
8165
|
default: ""
|
|
8159
8166
|
};
|
|
8160
|
-
var
|
|
8161
|
-
|
|
8162
|
-
|
|
8163
|
-
|
|
8164
|
-
danger_outline_md: { color: "danger", outline: true },
|
|
8165
|
-
neutral_outline_md: { color: "neutral", outline: true }
|
|
8167
|
+
var MAIN_BUTTON_COLOR = {
|
|
8168
|
+
positive: "primary",
|
|
8169
|
+
negative: "danger",
|
|
8170
|
+
default: "neutral"
|
|
8166
8171
|
};
|
|
8167
|
-
var
|
|
8168
|
-
positive:
|
|
8169
|
-
negative:
|
|
8170
|
-
default:
|
|
8172
|
+
var MAIN_BUTTON_OUTLINE = {
|
|
8173
|
+
positive: false,
|
|
8174
|
+
negative: false,
|
|
8175
|
+
default: true
|
|
8171
8176
|
};
|
|
8172
8177
|
function SConfirmModal({
|
|
8173
8178
|
open,
|
|
@@ -8175,7 +8180,7 @@ function SConfirmModal({
|
|
|
8175
8180
|
persistent = false,
|
|
8176
8181
|
type = "positive",
|
|
8177
8182
|
modalTitle = "",
|
|
8178
|
-
|
|
8183
|
+
titleClassName,
|
|
8179
8184
|
topMessage = [],
|
|
8180
8185
|
bottomMessage = [],
|
|
8181
8186
|
tagLabel,
|
|
@@ -8187,14 +8192,15 @@ function SConfirmModal({
|
|
|
8187
8192
|
optionSlot,
|
|
8188
8193
|
contentSlot,
|
|
8189
8194
|
mainButtonLabel = "\uD655\uC778",
|
|
8190
|
-
|
|
8195
|
+
mainButtonOutline,
|
|
8191
8196
|
subButtonLabel,
|
|
8192
8197
|
onOk,
|
|
8193
8198
|
onCancel,
|
|
8194
8199
|
onClose
|
|
8195
8200
|
}) {
|
|
8196
8201
|
const iconName = TYPE_ICON[type];
|
|
8197
|
-
const
|
|
8202
|
+
const mainColor = MAIN_BUTTON_COLOR[type];
|
|
8203
|
+
const mainOutline = mainButtonOutline ?? MAIN_BUTTON_OUTLINE[type];
|
|
8198
8204
|
const [settled, setSettled] = react.useState(false);
|
|
8199
8205
|
react.useEffect(() => {
|
|
8200
8206
|
if (open) setSettled(false);
|
|
@@ -8228,7 +8234,7 @@ function SConfirmModal({
|
|
|
8228
8234
|
{
|
|
8229
8235
|
className: cn(
|
|
8230
8236
|
"text-center text-[18px] font-bold leading-[30px] text-[color:var(--cmp-modal-confirm-title-color)]",
|
|
8231
|
-
|
|
8237
|
+
titleClassName
|
|
8232
8238
|
),
|
|
8233
8239
|
children: modalTitle
|
|
8234
8240
|
}
|
|
@@ -8275,7 +8281,8 @@ function SConfirmModal({
|
|
|
8275
8281
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
8276
8282
|
SButton,
|
|
8277
8283
|
{
|
|
8278
|
-
|
|
8284
|
+
color: mainColor,
|
|
8285
|
+
outline: mainOutline,
|
|
8279
8286
|
size: "md",
|
|
8280
8287
|
disabled: settled,
|
|
8281
8288
|
onClick: () => settle(onOk),
|
|
@@ -8394,7 +8401,7 @@ function SLoadingModal({
|
|
|
8394
8401
|
state: state2 = "loading",
|
|
8395
8402
|
progress,
|
|
8396
8403
|
message,
|
|
8397
|
-
|
|
8404
|
+
showButton = false,
|
|
8398
8405
|
buttonLabel,
|
|
8399
8406
|
onButtonClick,
|
|
8400
8407
|
width = 520,
|
|
@@ -8402,7 +8409,7 @@ function SLoadingModal({
|
|
|
8402
8409
|
}) {
|
|
8403
8410
|
const resolvedMessage = message ?? DEFAULT_MESSAGE[state2];
|
|
8404
8411
|
const lines = Array.isArray(resolvedMessage) ? resolvedMessage : resolvedMessage ? [resolvedMessage] : [];
|
|
8405
|
-
const
|
|
8412
|
+
const buttonVisible = showButton || state2 === "error";
|
|
8406
8413
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
8407
8414
|
SModalContainer,
|
|
8408
8415
|
{
|
|
@@ -8424,7 +8431,7 @@ function SLoadingModal({
|
|
|
8424
8431
|
},
|
|
8425
8432
|
i
|
|
8426
8433
|
)) }),
|
|
8427
|
-
|
|
8434
|
+
buttonVisible && /* @__PURE__ */ jsxRuntime.jsx(
|
|
8428
8435
|
SButton,
|
|
8429
8436
|
{
|
|
8430
8437
|
color: "neutral",
|
|
@@ -9160,7 +9167,11 @@ var useIsomorphicLayoutEffect = typeof window !== "undefined" ? react.useLayoutE
|
|
|
9160
9167
|
var SPageColumnContext = /* @__PURE__ */ react.createContext(null);
|
|
9161
9168
|
function SPageColumn({ full, children }) {
|
|
9162
9169
|
const [scrolled, setScrolled] = react.useState(false);
|
|
9163
|
-
const
|
|
9170
|
+
const [contentWidth, setContentWidth] = react.useState("full");
|
|
9171
|
+
const value = react.useMemo(
|
|
9172
|
+
() => ({ scrolled, setScrolled, contentWidth, setContentWidth }),
|
|
9173
|
+
[scrolled, contentWidth]
|
|
9174
|
+
);
|
|
9164
9175
|
return /* @__PURE__ */ jsxRuntime.jsx(SPageColumnContext.Provider, { value, children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
9165
9176
|
"div",
|
|
9166
9177
|
{
|
|
@@ -9183,7 +9194,7 @@ function useSLayout() {
|
|
|
9183
9194
|
var SLayout = /* @__PURE__ */ react.forwardRef(function SLayout2({
|
|
9184
9195
|
type = "box",
|
|
9185
9196
|
header = "fix",
|
|
9186
|
-
|
|
9197
|
+
showRail = false,
|
|
9187
9198
|
folded,
|
|
9188
9199
|
defaultFolded = false,
|
|
9189
9200
|
onFoldedChange,
|
|
@@ -9212,12 +9223,12 @@ var SLayout = /* @__PURE__ */ react.forwardRef(function SLayout2({
|
|
|
9212
9223
|
() => ({
|
|
9213
9224
|
type,
|
|
9214
9225
|
header: effectiveHeader,
|
|
9215
|
-
|
|
9226
|
+
showRail,
|
|
9216
9227
|
folded: currentFolded,
|
|
9217
9228
|
setFolded,
|
|
9218
9229
|
registerNav
|
|
9219
9230
|
}),
|
|
9220
|
-
[type, effectiveHeader,
|
|
9231
|
+
[type, effectiveHeader, showRail, currentFolded, setFolded, registerNav]
|
|
9221
9232
|
);
|
|
9222
9233
|
const isFullHeader = effectiveHeader === "full";
|
|
9223
9234
|
const minWidthStyle = {
|
|
@@ -9466,12 +9477,12 @@ var SGnb = /* @__PURE__ */ react.forwardRef(function SGnb2({
|
|
|
9466
9477
|
header: headerProp,
|
|
9467
9478
|
color = "light",
|
|
9468
9479
|
items,
|
|
9469
|
-
|
|
9480
|
+
showRail: useRailProp,
|
|
9470
9481
|
value = "",
|
|
9471
9482
|
onValueChange,
|
|
9472
9483
|
onRailChange,
|
|
9473
9484
|
folded: foldedProp,
|
|
9474
|
-
|
|
9485
|
+
onFoldedChange,
|
|
9475
9486
|
onLauncherClick,
|
|
9476
9487
|
logo,
|
|
9477
9488
|
topContent,
|
|
@@ -9494,8 +9505,8 @@ var SGnb = /* @__PURE__ */ react.forwardRef(function SGnb2({
|
|
|
9494
9505
|
const layout = react.useContext(SLayoutContext);
|
|
9495
9506
|
const type = typeProp ?? layout?.type ?? "box";
|
|
9496
9507
|
const folded = foldedProp ?? layout?.folded ?? false;
|
|
9497
|
-
const
|
|
9498
|
-
const railHasLeaf =
|
|
9508
|
+
const showRail = useRailProp ?? layout?.showRail ?? false;
|
|
9509
|
+
const railHasLeaf = showRail && items.some((item4) => !item4.children || item4.children.length === 0);
|
|
9499
9510
|
const header = railHasLeaf ? "full" : headerProp ?? layout?.header ?? "fix";
|
|
9500
9511
|
const H = GNB_HEADER[header];
|
|
9501
9512
|
const M = GNB_MENU[type];
|
|
@@ -9603,7 +9614,7 @@ var SGnb = /* @__PURE__ */ react.forwardRef(function SGnb2({
|
|
|
9603
9614
|
};
|
|
9604
9615
|
const handleFoldToggle = () => {
|
|
9605
9616
|
const next = !folded;
|
|
9606
|
-
|
|
9617
|
+
onFoldedChange?.(next);
|
|
9607
9618
|
if (foldedProp === void 0) layout?.setFolded(next);
|
|
9608
9619
|
};
|
|
9609
9620
|
const renderRailItem = (item4) => {
|
|
@@ -9762,9 +9773,9 @@ var SGnb = /* @__PURE__ */ react.forwardRef(function SGnb2({
|
|
|
9762
9773
|
] }, item4.value)
|
|
9763
9774
|
);
|
|
9764
9775
|
};
|
|
9765
|
-
const railItems =
|
|
9766
|
-
const menuItems =
|
|
9767
|
-
const showMenu = !
|
|
9776
|
+
const railItems = showRail ? items : [];
|
|
9777
|
+
const menuItems = showRail ? items.find((item4) => item4.value === activeRail)?.children ?? [] : items;
|
|
9778
|
+
const showMenu = !showRail || menuItems.length > 0;
|
|
9768
9779
|
const [uncontrolledMenuWidth, setUncontrolledMenuWidth] = react.useState(
|
|
9769
9780
|
() => defaultMenuWidth ?? GNB_MENU_WIDTH
|
|
9770
9781
|
);
|
|
@@ -9772,7 +9783,7 @@ var SGnb = /* @__PURE__ */ react.forwardRef(function SGnb2({
|
|
|
9772
9783
|
const committedMenuWidth = menuWidthProp ?? uncontrolledMenuWidth;
|
|
9773
9784
|
const menuWidth = clampGnbMenuWidth(dragMenuWidth ?? committedMenuWidth);
|
|
9774
9785
|
const [resizing, setResizing] = react.useState(false);
|
|
9775
|
-
const bodyWidth = (
|
|
9786
|
+
const bodyWidth = (showRail ? GNB_RAIL_WIDTH : 0) + (showMenu ? menuWidth : 0);
|
|
9776
9787
|
const registerNav = layout?.registerNav;
|
|
9777
9788
|
useIsomorphicLayoutEffect(() => {
|
|
9778
9789
|
if (!registerNav) return;
|
|
@@ -10045,7 +10056,7 @@ var SGnb = /* @__PURE__ */ react.forwardRef(function SGnb2({
|
|
|
10045
10056
|
transition: `transform ${GNB_FOLD_MS}ms ease-out, ${hideAfterSlide(folded)}`
|
|
10046
10057
|
},
|
|
10047
10058
|
children: [
|
|
10048
|
-
|
|
10059
|
+
showRail && // 레일 컬럼 — 스크롤되는 아이템 목록(nav)을 가운데 두고 위아래에 고정 슬롯(top/footer)을 붙인다.
|
|
10049
10060
|
// 두 슬롯은 내비게이션이 아니므로 nav(landmark) 밖에 두고, 컬럼 폭·구분선·배경은 이 래퍼가
|
|
10050
10061
|
// 전체 높이에 걸쳐 책임진다(그래야 슬롯 자리까지 배경·오른쪽 선이 이어진다).
|
|
10051
10062
|
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
@@ -10621,12 +10632,26 @@ var SGnbSystem = /* @__PURE__ */ react.forwardRef(function SGnbSystem2({
|
|
|
10621
10632
|
}
|
|
10622
10633
|
);
|
|
10623
10634
|
});
|
|
10635
|
+
|
|
10636
|
+
// src/components/SPage/page-width.ts
|
|
10637
|
+
var MIN_CONTENT_WIDTH = `calc(var(${SLAYOUT_MIN_WIDTH_VAR}, 0px) - 100cqw + 100%)`;
|
|
10638
|
+
var SURPLUS = `max(0px, calc(100cqw - var(${SLAYOUT_MIN_WIDTH_VAR}, 0px)))`;
|
|
10639
|
+
var HALF_SURPLUS = `max(0px, calc((100cqw - var(${SLAYOUT_MIN_WIDTH_VAR}, 0px)) / 2))`;
|
|
10640
|
+
var contentWidthStyle = (mode) => {
|
|
10641
|
+
switch (mode) {
|
|
10642
|
+
case "fixed":
|
|
10643
|
+
return { marginRight: SURPLUS };
|
|
10644
|
+
case "fixedCenter":
|
|
10645
|
+
return { marginLeft: HALF_SURPLUS, marginRight: HALF_SURPLUS };
|
|
10646
|
+
default:
|
|
10647
|
+
return void 0;
|
|
10648
|
+
}
|
|
10649
|
+
};
|
|
10624
10650
|
var BACKGROUND_CLASS = {
|
|
10625
10651
|
frame: "bg-[var(--sys-color-bg-frame)]",
|
|
10626
10652
|
neutral: "bg-[var(--sys-color-bg-neutralLight)]",
|
|
10627
10653
|
screen: "bg-[var(--sys-color-bg-screen)]"
|
|
10628
10654
|
};
|
|
10629
|
-
var MIN_CONTENT_WIDTH = `calc(var(${SLAYOUT_MIN_WIDTH_VAR}, 0px) - 100cqw + 100%)`;
|
|
10630
10655
|
var NATIVE_SCROLLBAR_BACKGROUND_CLASS = {
|
|
10631
10656
|
frame: `${SCROLLBAR_TRACK_BORDER_CLASS} ${SCROLLBAR_TRACK_BG_CLASS}`,
|
|
10632
10657
|
neutral: `${SCROLLBAR_TRACK_BORDER_CLASS} ${SCROLLBAR_TRACK_BG_WHITE_CLASS}`,
|
|
@@ -10773,6 +10798,7 @@ var SPage = /* @__PURE__ */ react.forwardRef(function SPage2({
|
|
|
10773
10798
|
scrollEndSpacing = false,
|
|
10774
10799
|
overlayScrollbar = false,
|
|
10775
10800
|
contentHeight = "auto",
|
|
10801
|
+
contentWidth = "full",
|
|
10776
10802
|
className,
|
|
10777
10803
|
style,
|
|
10778
10804
|
children,
|
|
@@ -10782,6 +10808,12 @@ var SPage = /* @__PURE__ */ react.forwardRef(function SPage2({
|
|
|
10782
10808
|
const layout = react.useContext(SLayoutContext);
|
|
10783
10809
|
const column = react.useContext(SPageColumnContext);
|
|
10784
10810
|
const gridStyle = layout?.header === "full" && !column ? { gridArea: "page" } : void 0;
|
|
10811
|
+
const setColumnContentWidth = column?.setContentWidth;
|
|
10812
|
+
useIsomorphicLayoutEffect(() => {
|
|
10813
|
+
if (!setColumnContentWidth) return;
|
|
10814
|
+
setColumnContentWidth(contentWidth);
|
|
10815
|
+
return () => setColumnContentWidth("full");
|
|
10816
|
+
}, [setColumnContentWidth, contentWidth]);
|
|
10785
10817
|
const scrollRef = react.useRef(null);
|
|
10786
10818
|
const setMainRef = react.useCallback(
|
|
10787
10819
|
(node) => {
|
|
@@ -10796,6 +10828,7 @@ var SPage = /* @__PURE__ */ react.forwardRef(function SPage2({
|
|
|
10796
10828
|
setColumnScrolled?.(e.currentTarget.scrollTop > 0);
|
|
10797
10829
|
};
|
|
10798
10830
|
const fill = contentHeight === "fill";
|
|
10831
|
+
const fixedWidthStyle = layout ? contentWidthStyle(contentWidth) : void 0;
|
|
10799
10832
|
const main = /* @__PURE__ */ jsxRuntime.jsx(
|
|
10800
10833
|
"main",
|
|
10801
10834
|
{
|
|
@@ -10811,7 +10844,14 @@ var SPage = /* @__PURE__ */ react.forwardRef(function SPage2({
|
|
|
10811
10844
|
style: !overlayScrollbar ? { ...gridStyle, ...style } : style,
|
|
10812
10845
|
onScroll: handleScroll,
|
|
10813
10846
|
...rest,
|
|
10814
|
-
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
10847
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
10848
|
+
"div",
|
|
10849
|
+
{
|
|
10850
|
+
className: cn(fill && "h-full"),
|
|
10851
|
+
style: { minWidth: MIN_CONTENT_WIDTH, ...fixedWidthStyle },
|
|
10852
|
+
children
|
|
10853
|
+
}
|
|
10854
|
+
)
|
|
10815
10855
|
}
|
|
10816
10856
|
);
|
|
10817
10857
|
if (!overlayScrollbar) return main;
|
|
@@ -10834,20 +10874,24 @@ var SPage = /* @__PURE__ */ react.forwardRef(function SPage2({
|
|
|
10834
10874
|
// src/components/SPage/page.config.ts
|
|
10835
10875
|
var PAGE_BACKGROUNDS = ["frame", "neutral", "screen"];
|
|
10836
10876
|
var PAGE_CONTENT_HEIGHTS = ["auto", "fill"];
|
|
10877
|
+
var PAGE_CONTENT_WIDTHS = ["full", "fixed", "fixedCenter"];
|
|
10878
|
+
var PAGE_HEADER_VARIANTS = ["plain", "bar"];
|
|
10837
10879
|
var SPageHeader = /* @__PURE__ */ withDisplayName(
|
|
10838
|
-
react.forwardRef(function SPageHeader2({ title, subText,
|
|
10880
|
+
react.forwardRef(function SPageHeader2({ title, subText, variant, onBack, slot, scrolled, className, style, ...rest }, ref) {
|
|
10839
10881
|
const hasBack = onBack != null;
|
|
10882
|
+
const bar = variant === "bar";
|
|
10840
10883
|
const column = react.useContext(SPageColumnContext);
|
|
10841
10884
|
const isScrolled = scrolled ?? column?.scrolled ?? false;
|
|
10842
|
-
|
|
10885
|
+
const rowStyle = column ? contentWidthStyle(column.contentWidth) : void 0;
|
|
10886
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
10843
10887
|
"header",
|
|
10844
10888
|
{
|
|
10845
10889
|
ref,
|
|
10846
10890
|
className: cn(
|
|
10847
|
-
"relative z-10 box-border flex shrink-0 items-center
|
|
10848
|
-
// 배경은 두 베리에이션이 같은 흰 면이다 —
|
|
10891
|
+
"relative z-10 box-border flex shrink-0 items-center px-(--cmp-pageHeader-paddingX)",
|
|
10892
|
+
// 배경은 두 베리에이션이 같은 흰 면이다 — variant 가 가르는 것은 높이·구분선·서브 텍스트 자리다.
|
|
10849
10893
|
// plain 에는 전용 배경 토큰이 없어 시스템 흰 표면을 쓴다(토큰이 생기면 그것으로 갈아끼운다).
|
|
10850
|
-
|
|
10894
|
+
bar ? "h-(--cmp-pageHeader-bar-height) border-b border-(--cmp-pageHeader-bar-border) bg-(--cmp-pageHeader-bar-bg) py-(--cmp-pageHeader-bar-paddingY)" : cn(
|
|
10851
10895
|
// 스크롤되면 그림자를 더해 콘텐츠 위에 뜬 것처럼 보이게 한다.
|
|
10852
10896
|
"bg-(--sys-color-bg-frame) pt-(--cmp-pageHeader-plain-paddingTop) pb-(--cmp-pageHeader-plain-paddingBottom)",
|
|
10853
10897
|
isScrolled && "shadow-floating"
|
|
@@ -10856,33 +10900,40 @@ var SPageHeader = /* @__PURE__ */ withDisplayName(
|
|
|
10856
10900
|
),
|
|
10857
10901
|
style,
|
|
10858
10902
|
...rest,
|
|
10859
|
-
children:
|
|
10860
|
-
|
|
10861
|
-
|
|
10862
|
-
|
|
10863
|
-
|
|
10864
|
-
|
|
10865
|
-
|
|
10866
|
-
|
|
10867
|
-
|
|
10868
|
-
|
|
10869
|
-
|
|
10870
|
-
|
|
10871
|
-
|
|
10872
|
-
|
|
10873
|
-
|
|
10874
|
-
"flex min-w-0 flex-1 items-center",
|
|
10875
|
-
fix ? "flex-row gap-(--cmp-pageHeader-gap)" : "flex-col items-start gap-(--cmp-pageHeader-plain-title-gap)",
|
|
10876
|
-
!hasBack && "pl-(--cmp-pageHeader-title-paddingLeft)"
|
|
10903
|
+
children: /* @__PURE__ */ jsxRuntime.jsxs(
|
|
10904
|
+
"div",
|
|
10905
|
+
{
|
|
10906
|
+
className: "flex min-w-0 flex-1 items-center gap-(--cmp-pageHeader-gap)",
|
|
10907
|
+
style: rowStyle,
|
|
10908
|
+
children: [
|
|
10909
|
+
hasBack && /* @__PURE__ */ jsxRuntime.jsx(
|
|
10910
|
+
SGhostButton,
|
|
10911
|
+
{
|
|
10912
|
+
icon: "chevronLeft",
|
|
10913
|
+
size: "xs",
|
|
10914
|
+
ariaLabel: "\uB4A4\uB85C\uAC00\uAE30",
|
|
10915
|
+
onClick: onBack,
|
|
10916
|
+
className: "shrink-0"
|
|
10917
|
+
}
|
|
10877
10918
|
),
|
|
10878
|
-
|
|
10879
|
-
|
|
10880
|
-
|
|
10881
|
-
|
|
10882
|
-
|
|
10883
|
-
|
|
10884
|
-
|
|
10885
|
-
|
|
10919
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
10920
|
+
"div",
|
|
10921
|
+
{
|
|
10922
|
+
className: cn(
|
|
10923
|
+
"flex min-w-0 flex-1 items-center",
|
|
10924
|
+
bar ? "flex-row gap-(--cmp-pageHeader-gap)" : "flex-col items-start gap-(--cmp-pageHeader-plain-title-gap)",
|
|
10925
|
+
!hasBack && "pl-(--cmp-pageHeader-title-paddingLeft)"
|
|
10926
|
+
),
|
|
10927
|
+
children: [
|
|
10928
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "typo-heading-lg min-w-0 truncate text-(--cmp-pageHeader-title-text)", children: title }),
|
|
10929
|
+
subText && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "typo-body-md-default min-w-0 truncate text-(--cmp-pageHeader-subtitle-text)", children: subText })
|
|
10930
|
+
]
|
|
10931
|
+
}
|
|
10932
|
+
),
|
|
10933
|
+
slot && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "ml-auto flex shrink-0 items-center", children: slot })
|
|
10934
|
+
]
|
|
10935
|
+
}
|
|
10936
|
+
)
|
|
10886
10937
|
}
|
|
10887
10938
|
);
|
|
10888
10939
|
}),
|
|
@@ -10912,13 +10963,13 @@ function STabs({
|
|
|
10912
10963
|
value,
|
|
10913
10964
|
tabs,
|
|
10914
10965
|
onValueChange,
|
|
10915
|
-
|
|
10966
|
+
sub = false,
|
|
10916
10967
|
vertical = false,
|
|
10917
10968
|
className,
|
|
10918
10969
|
style
|
|
10919
10970
|
}) {
|
|
10920
10971
|
const blue = TAB_MAIN_COLORS.selected.border;
|
|
10921
|
-
const isVertical =
|
|
10972
|
+
const isVertical = sub && vertical;
|
|
10922
10973
|
const tabRefs = react.useRef([]);
|
|
10923
10974
|
const moveTo = (target) => {
|
|
10924
10975
|
if (target < 0 || target >= tabs.length) return;
|
|
@@ -10926,7 +10977,7 @@ function STabs({
|
|
|
10926
10977
|
tabRefs.current[target]?.focus();
|
|
10927
10978
|
};
|
|
10928
10979
|
const containerStyle = { ...style };
|
|
10929
|
-
if (!
|
|
10980
|
+
if (!sub) containerStyle.borderBottom = `1px solid ${blue}`;
|
|
10930
10981
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
10931
10982
|
"div",
|
|
10932
10983
|
{
|
|
@@ -10934,9 +10985,9 @@ function STabs({
|
|
|
10934
10985
|
"aria-orientation": isVertical ? "vertical" : "horizontal",
|
|
10935
10986
|
className: cn(
|
|
10936
10987
|
// main(가로): baseline(하단 divider)이 100% 너비로 채워지도록 w-full
|
|
10937
|
-
|
|
10988
|
+
sub ? "inline-flex w-fit" : "flex w-full",
|
|
10938
10989
|
isVertical ? "flex-col items-stretch" : "flex-row",
|
|
10939
|
-
|
|
10990
|
+
sub ? isVertical ? "gap-[16px]" : "gap-[24px]" : "gap-[4px]",
|
|
10940
10991
|
className
|
|
10941
10992
|
),
|
|
10942
10993
|
style: containerStyle,
|
|
@@ -10944,7 +10995,7 @@ function STabs({
|
|
|
10944
10995
|
const selected = tab.value === value;
|
|
10945
10996
|
const select = () => onValueChange?.(tab.value);
|
|
10946
10997
|
let tabStyle;
|
|
10947
|
-
if (
|
|
10998
|
+
if (sub) {
|
|
10948
10999
|
tabStyle = {
|
|
10949
11000
|
height: 20,
|
|
10950
11001
|
paddingBottom: 4,
|
|
@@ -12314,6 +12365,7 @@ var ALIGN = {
|
|
|
12314
12365
|
center: "center",
|
|
12315
12366
|
end: "flex-end"
|
|
12316
12367
|
};
|
|
12368
|
+
var FOCUS_RING_SHADOW = "0px 0px 4px 0px #0071ff66";
|
|
12317
12369
|
var cssLen = (v) => v === void 0 || v === "" || v === 0 ? void 0 : typeof v === "number" ? `${v}px` : v;
|
|
12318
12370
|
var SField = /* @__PURE__ */ react.forwardRef(function SField2({
|
|
12319
12371
|
name,
|
|
@@ -12380,7 +12432,11 @@ var SField = /* @__PURE__ */ react.forwardRef(function SField2({
|
|
|
12380
12432
|
const addonWidth = effectiveAddonLabel !== "" ? cssLen(labelWidth) : void 0;
|
|
12381
12433
|
const maxWidthValue = fieldWidthValue(maxWidth);
|
|
12382
12434
|
const resolvedMaxWidth = maxWidthValue === void 0 || effectiveAddonLabel === "" ? maxWidthValue : addonWidth ? `calc(${maxWidthValue} + ${addonWidth})` : void 0;
|
|
12383
|
-
const borderColor = borderless ? "transparent" : disabled ? "var(--color-grey-45)" :
|
|
12435
|
+
const borderColor = borderless ? "transparent" : disabled ? "var(--color-grey-45)" : (
|
|
12436
|
+
// focus·hover(제어 prop) 가 error/pass 보다 우선 — 실제 :hover/:focus-within 클래스도
|
|
12437
|
+
// 같은 순서로 --field-bc 를 덮으므로, prop 으로 흉내 낸 상태도 그와 같게 둔다.
|
|
12438
|
+
interactive && (focused || hovered) ? "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)"
|
|
12439
|
+
);
|
|
12384
12440
|
const bgColor = borderless ? "transparent" : disabled ? "var(--color-grey-30)" : readOnly ? "var(--sys-color-field-bg-readOnly)" : "var(--sys-color-field-bg-default)";
|
|
12385
12441
|
const textColor = disabled ? "var(--color-grey-65)" : readOnly ? "var(--sys-color-field-text-readOnly)" : "var(--sys-color-field-text-default)";
|
|
12386
12442
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -12458,7 +12514,7 @@ var SField = /* @__PURE__ */ react.forwardRef(function SField2({
|
|
|
12458
12514
|
// @ts-expect-error CSS 변수
|
|
12459
12515
|
"--field-bc": borderColor,
|
|
12460
12516
|
// focused/hovered prop이 명시된 경우 강조를 즉시 반영
|
|
12461
|
-
...interactive && !borderless && focused ? { boxShadow:
|
|
12517
|
+
...interactive && !borderless && (focused || hovered) ? { boxShadow: FOCUS_RING_SHADOW } : {},
|
|
12462
12518
|
...multiline ? { minHeight: s.height } : { height: s.height },
|
|
12463
12519
|
"borderRadius": s.radius,
|
|
12464
12520
|
"background": bgColor,
|
|
@@ -12527,7 +12583,7 @@ var SSearchInput = /* @__PURE__ */ react.forwardRef(function SSearchInput2({
|
|
|
12527
12583
|
width,
|
|
12528
12584
|
focused,
|
|
12529
12585
|
hovered,
|
|
12530
|
-
|
|
12586
|
+
inputClassName,
|
|
12531
12587
|
inputStyle,
|
|
12532
12588
|
className,
|
|
12533
12589
|
style,
|
|
@@ -12588,7 +12644,7 @@ var SSearchInput = /* @__PURE__ */ react.forwardRef(function SSearchInput2({
|
|
|
12588
12644
|
// type="search" 의 브라우저 기본 취소 버튼은 clearable 과 겹치므로 지운다
|
|
12589
12645
|
"h-full min-w-0 flex-1 border-0 bg-transparent p-0 outline-none placeholder:text-[color:var(--sys-color-field-text-placeholder)] disabled:cursor-not-allowed [&::-webkit-search-cancel-button]:hidden",
|
|
12590
12646
|
AUTOFILL_RESET_CLASS,
|
|
12591
|
-
|
|
12647
|
+
inputClassName
|
|
12592
12648
|
),
|
|
12593
12649
|
style: {
|
|
12594
12650
|
// fontSize/lineHeight 는 컨테이너에서 상속 (원본 font-size: inherit)
|
|
@@ -12663,12 +12719,12 @@ var SSelectImpl = /* @__PURE__ */ react.forwardRef(function SSelect({
|
|
|
12663
12719
|
value,
|
|
12664
12720
|
onValueChange,
|
|
12665
12721
|
onOpenChange,
|
|
12666
|
-
|
|
12722
|
+
valueAsPrimitive = false,
|
|
12667
12723
|
name,
|
|
12668
12724
|
options = [],
|
|
12669
12725
|
type = "default",
|
|
12670
|
-
|
|
12671
|
-
|
|
12726
|
+
showSearch = false,
|
|
12727
|
+
showSelectAll = false,
|
|
12672
12728
|
allSelectedLabel = "\uC804\uCCB4",
|
|
12673
12729
|
placeholder = "\uC120\uD0DD",
|
|
12674
12730
|
disabled = false,
|
|
@@ -12713,7 +12769,7 @@ var SSelectImpl = /* @__PURE__ */ react.forwardRef(function SSelect({
|
|
|
12713
12769
|
const hasLeaf = react.useMemo(() => flat.some((o) => !o.isGroup), [flat]);
|
|
12714
12770
|
const allOptionsDisabled = hasLeaf && selectable.length === 0;
|
|
12715
12771
|
const effectiveDisabled = disabled || allOptionsDisabled;
|
|
12716
|
-
const
|
|
12772
|
+
const searchVisible = showSearch && selectable.length >= SEARCH_THRESHOLD;
|
|
12717
12773
|
const labelByValue = react.useMemo(() => new Map(flat.map((o) => [o.value, o.label])), [flat]);
|
|
12718
12774
|
const rawByValue = react.useMemo(() => new Map(flat.map((o) => [o.value, o.raw])), [flat]);
|
|
12719
12775
|
const optionByValue = react.useMemo(
|
|
@@ -12730,9 +12786,9 @@ var SSelectImpl = /* @__PURE__ */ react.forwardRef(function SSelect({
|
|
|
12730
12786
|
const emit3 = (next) => {
|
|
12731
12787
|
if (!onValueChange) return;
|
|
12732
12788
|
const mapped = next.map(
|
|
12733
|
-
(v) =>
|
|
12789
|
+
(v) => valueAsPrimitive ? rawByValue.get(v) ?? v : optionByValue.get(v) ?? { value: v, label: v }
|
|
12734
12790
|
);
|
|
12735
|
-
onValueChange(multi ? mapped : mapped[0] ?? (
|
|
12791
|
+
onValueChange(multi ? mapped : mapped[0] ?? (valueAsPrimitive ? "" : null));
|
|
12736
12792
|
};
|
|
12737
12793
|
const commitOpen = (next, valueForRules) => {
|
|
12738
12794
|
setOpen(next);
|
|
@@ -12779,12 +12835,12 @@ var SSelectImpl = /* @__PURE__ */ react.forwardRef(function SSelect({
|
|
|
12779
12835
|
resetValidation: () => setRuleError("")
|
|
12780
12836
|
});
|
|
12781
12837
|
const filtered = react.useMemo(() => {
|
|
12782
|
-
if (!
|
|
12838
|
+
if (!searchVisible || search.trim() === "") return flat;
|
|
12783
12839
|
const q = search.trim().toLowerCase();
|
|
12784
12840
|
return flat.filter(
|
|
12785
12841
|
(o) => o.isGroup || (isHtmlLabel(o.label) ? extractText(o.label) : o.label).toLowerCase().includes(q)
|
|
12786
12842
|
);
|
|
12787
|
-
}, [flat, search,
|
|
12843
|
+
}, [flat, search, searchVisible]);
|
|
12788
12844
|
const allValues = selectable.map((o) => o.value);
|
|
12789
12845
|
const allSelected = allValues.length > 0 && allValues.every((v) => selected.includes(v));
|
|
12790
12846
|
const hasItems = filtered.some((o) => !o.isGroup);
|
|
@@ -12797,7 +12853,7 @@ var SSelectImpl = /* @__PURE__ */ react.forwardRef(function SSelect({
|
|
|
12797
12853
|
}, [filtered]);
|
|
12798
12854
|
const navigableItems = react.useMemo(() => {
|
|
12799
12855
|
const items = [];
|
|
12800
|
-
if (multi &&
|
|
12856
|
+
if (multi && showSelectAll && allValues.length > 0) {
|
|
12801
12857
|
items.push({ key: "__select_all__", isSelectAll: true });
|
|
12802
12858
|
}
|
|
12803
12859
|
filtered.forEach((o, i) => {
|
|
@@ -12812,7 +12868,7 @@ var SSelectImpl = /* @__PURE__ */ react.forwardRef(function SSelect({
|
|
|
12812
12868
|
}
|
|
12813
12869
|
});
|
|
12814
12870
|
return items;
|
|
12815
|
-
}, [allValues.length, filtered, groupLeafValues, multi,
|
|
12871
|
+
}, [allValues.length, filtered, groupLeafValues, multi, showSelectAll]);
|
|
12816
12872
|
const selectedAnchorIndex = react.useMemo(() => {
|
|
12817
12873
|
if (selected.length === 0) return -1;
|
|
12818
12874
|
const selectedSet = new Set(selected);
|
|
@@ -13040,7 +13096,7 @@ var SSelectImpl = /* @__PURE__ */ react.forwardRef(function SSelect({
|
|
|
13040
13096
|
viewportPadding: 24,
|
|
13041
13097
|
fit: !dropdownWidth,
|
|
13042
13098
|
onOpenAutoFocus: (event) => {
|
|
13043
|
-
if (!
|
|
13099
|
+
if (!searchVisible) {
|
|
13044
13100
|
event.preventDefault();
|
|
13045
13101
|
return;
|
|
13046
13102
|
}
|
|
@@ -13073,7 +13129,7 @@ var SSelectImpl = /* @__PURE__ */ react.forwardRef(function SSelect({
|
|
|
13073
13129
|
style: { maxHeight: clampToAvailableHeight(dropdownHeight, POPOVER_AVAILABLE_HEIGHT) },
|
|
13074
13130
|
onMouseLeave: () => setFocusedIndex(-1),
|
|
13075
13131
|
children: [
|
|
13076
|
-
|
|
13132
|
+
searchVisible && /* @__PURE__ */ jsxRuntime.jsx(
|
|
13077
13133
|
"div",
|
|
13078
13134
|
{
|
|
13079
13135
|
ref: searchBarRef,
|
|
@@ -13099,7 +13155,7 @@ var SSelectImpl = /* @__PURE__ */ react.forwardRef(function SSelect({
|
|
|
13099
13155
|
selected,
|
|
13100
13156
|
groupLeafValues,
|
|
13101
13157
|
focusedValue: navigableItems[focusedIndex]?.key,
|
|
13102
|
-
showSelectAll: multi &&
|
|
13158
|
+
showSelectAll: multi && showSelectAll && allValues.length > 0,
|
|
13103
13159
|
selectAllLabel: allSelectedLabel,
|
|
13104
13160
|
selectAllSelected: allSelected,
|
|
13105
13161
|
onSelectAll: handleSelectAll,
|
|
@@ -13356,19 +13412,19 @@ var STable = /* @__PURE__ */ react.forwardRef(function STable2({
|
|
|
13356
13412
|
stickyColumn,
|
|
13357
13413
|
radius = "default",
|
|
13358
13414
|
bordered = true,
|
|
13359
|
-
|
|
13360
|
-
|
|
13361
|
-
|
|
13415
|
+
emptyLabel = "\uB370\uC774\uD130\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4.",
|
|
13416
|
+
emptySlot,
|
|
13417
|
+
loading: loading2 = false,
|
|
13362
13418
|
dense = false,
|
|
13363
13419
|
onDenseChange,
|
|
13364
|
-
|
|
13420
|
+
hoverable = true,
|
|
13365
13421
|
pagination,
|
|
13366
13422
|
onPageChange,
|
|
13367
|
-
|
|
13368
|
-
|
|
13423
|
+
internalPagination = false,
|
|
13424
|
+
showRowsPerPageSelect = false,
|
|
13369
13425
|
rowsPerPageOption = DEFAULT_ROWS_PER_PAGE_OPTION,
|
|
13370
13426
|
onRowsPerPageChange,
|
|
13371
|
-
|
|
13427
|
+
virtualScroll = false,
|
|
13372
13428
|
rowHeight,
|
|
13373
13429
|
virtualBuffer = 5,
|
|
13374
13430
|
virtualEndThreshold = 10,
|
|
@@ -13507,16 +13563,16 @@ var STable = /* @__PURE__ */ react.forwardRef(function STable2({
|
|
|
13507
13563
|
setHeaderGutter(el.offsetWidth - el.clientWidth);
|
|
13508
13564
|
setScrolledLeft(el.scrollLeft > 0);
|
|
13509
13565
|
setScrolledRight(el.scrollLeft + el.clientWidth < el.scrollWidth - 1);
|
|
13510
|
-
if (
|
|
13566
|
+
if (virtualScroll) {
|
|
13511
13567
|
const { start, end } = calcRange(el.scrollTop, el.clientHeight);
|
|
13512
13568
|
setVsRange((prev) => prev.start === start && prev.end === end ? prev : { start, end });
|
|
13513
13569
|
}
|
|
13514
|
-
}, [
|
|
13570
|
+
}, [virtualScroll, calcRange]);
|
|
13515
13571
|
react.useEffect(() => {
|
|
13516
13572
|
handleScroll();
|
|
13517
|
-
}, [handleScroll, rowCount, columnWidths,
|
|
13573
|
+
}, [handleScroll, rowCount, columnWidths, loading2, height]);
|
|
13518
13574
|
react.useEffect(() => {
|
|
13519
|
-
if (!
|
|
13575
|
+
if (!virtualScroll) return;
|
|
13520
13576
|
cbRef.current.onVirtualUpdate?.({ from: vsRange.start, to: vsRange.end });
|
|
13521
13577
|
const threshold = Math.max(1, virtualEndThreshold);
|
|
13522
13578
|
if (vsRange.end >= Math.max(0, rowCount - threshold) && lastReachEndRef.current !== rowCount) {
|
|
@@ -13528,7 +13584,7 @@ var STable = /* @__PURE__ */ react.forwardRef(function STable2({
|
|
|
13528
13584
|
threshold
|
|
13529
13585
|
});
|
|
13530
13586
|
}
|
|
13531
|
-
}, [vsRange,
|
|
13587
|
+
}, [vsRange, virtualScroll, rowCount, virtualEndThreshold]);
|
|
13532
13588
|
const getStickyStyle = react.useCallback(
|
|
13533
13589
|
(colIdx) => {
|
|
13534
13590
|
const leftOffset = columnWidths.slice(0, colIdx).reduce((a, b) => a + b, selectable ? SELECTABLE_COLUMN_WIDTH : 0);
|
|
@@ -13553,7 +13609,7 @@ var STable = /* @__PURE__ */ react.forwardRef(function STable2({
|
|
|
13553
13609
|
isRowSelected,
|
|
13554
13610
|
getIsAllChecked,
|
|
13555
13611
|
getPaginationInfo: () => {
|
|
13556
|
-
if (!
|
|
13612
|
+
if (!internalPagination || !pagination) return null;
|
|
13557
13613
|
const startIndex = (currentPage - 1) * innerRowsPerPage;
|
|
13558
13614
|
return {
|
|
13559
13615
|
startIndex,
|
|
@@ -13584,7 +13640,7 @@ var STable = /* @__PURE__ */ react.forwardRef(function STable2({
|
|
|
13584
13640
|
getIsAllChecked,
|
|
13585
13641
|
getStickyStyle,
|
|
13586
13642
|
setRowCount,
|
|
13587
|
-
|
|
13643
|
+
internalPagination,
|
|
13588
13644
|
pagination,
|
|
13589
13645
|
currentPage,
|
|
13590
13646
|
innerRowsPerPage,
|
|
@@ -13623,31 +13679,31 @@ var STable = /* @__PURE__ */ react.forwardRef(function STable2({
|
|
|
13623
13679
|
},
|
|
13624
13680
|
[visibleCols]
|
|
13625
13681
|
);
|
|
13626
|
-
const pageInfo =
|
|
13682
|
+
const pageInfo = internalPagination && pagination ? {
|
|
13627
13683
|
startIndex: (currentPage - 1) * innerRowsPerPage,
|
|
13628
13684
|
endIndex: (currentPage - 1) * innerRowsPerPage + innerRowsPerPage
|
|
13629
13685
|
} : null;
|
|
13630
13686
|
let bodyRows = rows;
|
|
13631
13687
|
let topSpacer = 0;
|
|
13632
13688
|
let bottomSpacer = 0;
|
|
13633
|
-
if (
|
|
13689
|
+
if (virtualScroll) {
|
|
13634
13690
|
bodyRows = rows.slice(vsRange.start, vsRange.end);
|
|
13635
13691
|
topSpacer = vsRange.start * effectiveRowHeight;
|
|
13636
13692
|
bottomSpacer = Math.max(0, (rowCount - vsRange.end) * effectiveRowHeight);
|
|
13637
13693
|
} else if (pageInfo) {
|
|
13638
13694
|
bodyRows = rows.slice(pageInfo.startIndex, pageInfo.endIndex);
|
|
13639
13695
|
}
|
|
13640
|
-
const isNoData = rowCount === 0 && !
|
|
13641
|
-
const showNoDataSlot = isNoData &&
|
|
13642
|
-
const showPagination = !
|
|
13643
|
-
const lastPage =
|
|
13644
|
-
const displayPage =
|
|
13696
|
+
const isNoData = rowCount === 0 && !loading2;
|
|
13697
|
+
const showNoDataSlot = isNoData && emptySlot != null;
|
|
13698
|
+
const showPagination = !virtualScroll && (pagination != null || internalPagination);
|
|
13699
|
+
const lastPage = internalPagination ? Math.max(1, Math.ceil(rowCount / (innerRowsPerPage || 1))) : pagination?.lastPage ?? Math.max(1, Math.ceil(rowCount / (pagination?.rowsPerPage ?? 10)));
|
|
13700
|
+
const displayPage = internalPagination ? currentPage : pagination?.page ?? 1;
|
|
13645
13701
|
const changePage = (p) => {
|
|
13646
|
-
if (
|
|
13702
|
+
if (internalPagination) setCurrentPage(p);
|
|
13647
13703
|
onPageChange?.(p);
|
|
13648
13704
|
};
|
|
13649
13705
|
const changeRowsPerPage = (perPage) => {
|
|
13650
|
-
if (
|
|
13706
|
+
if (internalPagination) {
|
|
13651
13707
|
setInnerRowsPerPage(perPage);
|
|
13652
13708
|
const newLast = Math.max(1, Math.ceil(rowCount / (perPage || 1)));
|
|
13653
13709
|
setCurrentPage((cp) => cp > newLast ? newLast : cp);
|
|
@@ -13771,7 +13827,7 @@ var STable = /* @__PURE__ */ react.forwardRef(function STable2({
|
|
|
13771
13827
|
!height && "min-h-0 grow",
|
|
13772
13828
|
radiusClass,
|
|
13773
13829
|
// 원본 sd-table__scroll-container--loading/--no-data: 로딩·데이터 없음 시 인터랙션 차단
|
|
13774
|
-
(
|
|
13830
|
+
(loading2 || rowCount === 0) && "pointer-events-none"
|
|
13775
13831
|
),
|
|
13776
13832
|
style: {
|
|
13777
13833
|
height,
|
|
@@ -13971,7 +14027,7 @@ var STable = /* @__PURE__ */ react.forwardRef(function STable2({
|
|
|
13971
14027
|
)
|
|
13972
14028
|
}
|
|
13973
14029
|
),
|
|
13974
|
-
showNoDataSlot ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn(bodyScrollClass, "pointer-events-auto bg-white"), children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex h-full min-h-[60px] w-full items-center justify-center", children:
|
|
14030
|
+
showNoDataSlot ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn(bodyScrollClass, "pointer-events-auto bg-white"), children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex h-full min-h-[60px] w-full items-center justify-center", children: emptySlot }) }) : (
|
|
13975
14031
|
/* 바디: 세로 스크롤은 이 컨테이너에만 생긴다 (헤더 제외) */
|
|
13976
14032
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
13977
14033
|
"div",
|
|
@@ -13981,7 +14037,7 @@ var STable = /* @__PURE__ */ react.forwardRef(function STable2({
|
|
|
13981
14037
|
className: cn(
|
|
13982
14038
|
bodyScrollClass,
|
|
13983
14039
|
// 원본 sd-table__scroll-container--loading/--no-data: 로딩·데이터 없음 시 스크롤 차단
|
|
13984
|
-
(
|
|
14040
|
+
(loading2 || rowCount === 0) && "overflow-hidden"
|
|
13985
14041
|
),
|
|
13986
14042
|
children: /* @__PURE__ */ jsxRuntime.jsxs(
|
|
13987
14043
|
"table",
|
|
@@ -13991,7 +14047,7 @@ var STable = /* @__PURE__ */ react.forwardRef(function STable2({
|
|
|
13991
14047
|
children: [
|
|
13992
14048
|
colgroup,
|
|
13993
14049
|
/* @__PURE__ */ jsxRuntime.jsxs("tbody", { children: [
|
|
13994
|
-
|
|
14050
|
+
virtualScroll && topSpacer > 0 && /* @__PURE__ */ jsxRuntime.jsx("tr", { "aria-hidden": true, style: { height: topSpacer }, children: /* @__PURE__ */ jsxRuntime.jsx("td", { colSpan: totalColSpan, className: "p-0" }) }),
|
|
13995
14051
|
rowCount === 0 ? null : bodyRows.map((row, ri) => {
|
|
13996
14052
|
const isSel = selectedKeys.has(row[rowKey]);
|
|
13997
14053
|
const rowBg = "bg-white";
|
|
@@ -14001,10 +14057,10 @@ var STable = /* @__PURE__ */ react.forwardRef(function STable2({
|
|
|
14001
14057
|
onClick: () => onRowClick?.(row),
|
|
14002
14058
|
className: cn(
|
|
14003
14059
|
"group/table-row",
|
|
14004
|
-
|
|
14060
|
+
hoverable && "hover:bg-[var(--color-grey-05)]",
|
|
14005
14061
|
onRowClick && "cursor-pointer"
|
|
14006
14062
|
),
|
|
14007
|
-
style: { height:
|
|
14063
|
+
style: { height: virtualScroll ? effectiveRowHeight : rowH },
|
|
14008
14064
|
children: [
|
|
14009
14065
|
selectable && /* @__PURE__ */ jsxRuntime.jsx(
|
|
14010
14066
|
"td",
|
|
@@ -14013,7 +14069,7 @@ var STable = /* @__PURE__ */ react.forwardRef(function STable2({
|
|
|
14013
14069
|
// 원본 .td--selected: 48px 고정폭, 항상 left sticky, 체크박스 중앙정렬
|
|
14014
14070
|
"sticky left-0 z-[2] border-b border-solid border-[color:var(--cmp-table-border-color)] align-middle",
|
|
14015
14071
|
rowBg,
|
|
14016
|
-
|
|
14072
|
+
hoverable && "group-hover/table-row:bg-[var(--color-grey-05)]",
|
|
14017
14073
|
stickyLeft === 0 && scrolledLeft && "shadow-[5px_0_8px_0_rgba(34,34,34,0.1)]"
|
|
14018
14074
|
),
|
|
14019
14075
|
style: {
|
|
@@ -14031,7 +14087,7 @@ var STable = /* @__PURE__ */ react.forwardRef(function STable2({
|
|
|
14031
14087
|
// 셀 배경은 흰색으로 채워 뒤 배경이 비치지 않게 하고, hover 시 행 배경(grey_05)을 따른다.
|
|
14032
14088
|
"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)]",
|
|
14033
14089
|
rowBg,
|
|
14034
|
-
|
|
14090
|
+
hoverable && "group-hover/table-row:bg-[var(--color-grey-05)]",
|
|
14035
14091
|
stickyShadowClass(i),
|
|
14036
14092
|
typeof col.tdClass === "function" ? col.tdClass(row) : col.tdClass
|
|
14037
14093
|
);
|
|
@@ -14065,7 +14121,7 @@ var STable = /* @__PURE__ */ react.forwardRef(function STable2({
|
|
|
14065
14121
|
row[rowKey] ?? ri
|
|
14066
14122
|
);
|
|
14067
14123
|
}),
|
|
14068
|
-
|
|
14124
|
+
virtualScroll && bottomSpacer > 0 && /* @__PURE__ */ jsxRuntime.jsx("tr", { "aria-hidden": true, style: { height: bottomSpacer }, children: /* @__PURE__ */ jsxRuntime.jsx("td", { colSpan: totalColSpan, className: "p-0" }) })
|
|
14069
14125
|
] })
|
|
14070
14126
|
]
|
|
14071
14127
|
}
|
|
@@ -14081,13 +14137,13 @@ var STable = /* @__PURE__ */ react.forwardRef(function STable2({
|
|
|
14081
14137
|
className: "pointer-events-none absolute left-0 right-0 top-0 z-[31] h-[var(--cmp-table-header-height)] bg-white/60"
|
|
14082
14138
|
}
|
|
14083
14139
|
),
|
|
14084
|
-
!showNoDataSlot && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "pointer-events-none absolute bottom-0 left-0 right-0 top-[var(--cmp-table-header-height)] z-[30] flex items-center justify-center bg-white/60 text-[12px] text-[color:var(--color-grey-65)]", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex min-h-[60px] w-full items-center justify-center", children:
|
|
14140
|
+
!showNoDataSlot && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "pointer-events-none absolute bottom-0 left-0 right-0 top-[var(--cmp-table-header-height)] z-[30] flex items-center justify-center bg-white/60 text-[12px] text-[color:var(--color-grey-65)]", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex min-h-[60px] w-full items-center justify-center", children: emptyLabel }) })
|
|
14085
14141
|
] }),
|
|
14086
|
-
|
|
14142
|
+
loading2 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute inset-0 z-30 flex items-center justify-center bg-white/60", children: /* @__PURE__ */ jsxRuntime.jsx(SCircleProgress, { indeterminate: true }) })
|
|
14087
14143
|
]
|
|
14088
14144
|
}
|
|
14089
14145
|
),
|
|
14090
|
-
(showPagination ||
|
|
14146
|
+
(showPagination || showRowsPerPageSelect) && // 원본 sd-table__pagination: 테이블 하단에 이어붙는 회색 바(높이 48px, margin-top:-1px로 테두리 겹침).
|
|
14091
14147
|
// SPagination은 전체 폭 기준 중앙, rows-per-page SSelect는 우측에 absolute 배치해 중앙 정렬을 유지한다.
|
|
14092
14148
|
// 루트 높이가 확정된 경우(테이블이 남은 영역을 채우는 배치) 페이지네이션 바가
|
|
14093
14149
|
// 눌리지 않도록 shrink-0으로 48px를 보장한다.
|
|
@@ -14103,7 +14159,7 @@ var STable = /* @__PURE__ */ react.forwardRef(function STable2({
|
|
|
14103
14159
|
),
|
|
14104
14160
|
children: [
|
|
14105
14161
|
showPagination && /* @__PURE__ */ jsxRuntime.jsx(SPagination, { currentPage: displayPage, lastPage, onPageChange: changePage }),
|
|
14106
|
-
|
|
14162
|
+
showRowsPerPageSelect && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "absolute right-[10px] top-1/2 flex -translate-y-1/2 items-center gap-[12px]", children: [
|
|
14107
14163
|
dense && /* @__PURE__ */ jsxRuntime.jsx(
|
|
14108
14164
|
STextLink,
|
|
14109
14165
|
{
|
|
@@ -14120,8 +14176,8 @@ var STable = /* @__PURE__ */ react.forwardRef(function STable2({
|
|
|
14120
14176
|
SSelect2,
|
|
14121
14177
|
{
|
|
14122
14178
|
options: rowsPerPageOption,
|
|
14123
|
-
value:
|
|
14124
|
-
|
|
14179
|
+
value: internalPagination ? innerRowsPerPage : pagination?.rowsPerPage,
|
|
14180
|
+
valueAsPrimitive: true,
|
|
14125
14181
|
onValueChange: (v) => changeRowsPerPage(Number(v)),
|
|
14126
14182
|
width: 128
|
|
14127
14183
|
}
|
|
@@ -14269,7 +14325,7 @@ var SInput = /* @__PURE__ */ react.forwardRef(function SInput2({
|
|
|
14269
14325
|
status,
|
|
14270
14326
|
focused,
|
|
14271
14327
|
hovered,
|
|
14272
|
-
|
|
14328
|
+
inputClassName,
|
|
14273
14329
|
inputStyle,
|
|
14274
14330
|
label,
|
|
14275
14331
|
labelWidth,
|
|
@@ -14369,7 +14425,7 @@ var SInput = /* @__PURE__ */ react.forwardRef(function SInput2({
|
|
|
14369
14425
|
className: cn(
|
|
14370
14426
|
"h-full min-w-0 flex-1 border-0 bg-transparent p-0 outline-none placeholder:text-[color:var(--sys-color-field-text-placeholder)] disabled:cursor-not-allowed",
|
|
14371
14427
|
AUTOFILL_RESET_CLASS,
|
|
14372
|
-
|
|
14428
|
+
inputClassName
|
|
14373
14429
|
),
|
|
14374
14430
|
style: {
|
|
14375
14431
|
// fontSize/lineHeight 는 컨테이너에서 상속 (원본 font-size: inherit)
|
|
@@ -14426,7 +14482,7 @@ var STextarea = /* @__PURE__ */ react.forwardRef(function STextarea2({
|
|
|
14426
14482
|
status,
|
|
14427
14483
|
focused,
|
|
14428
14484
|
hovered,
|
|
14429
|
-
|
|
14485
|
+
textareaClassName,
|
|
14430
14486
|
textareaStyle,
|
|
14431
14487
|
label,
|
|
14432
14488
|
labelWidth,
|
|
@@ -14506,7 +14562,7 @@ var STextarea = /* @__PURE__ */ react.forwardRef(function STextarea2({
|
|
|
14506
14562
|
className: cn(
|
|
14507
14563
|
"w-full resize-y border-0 bg-transparent outline-none placeholder:text-[color:var(--sys-color-field-text-placeholder)] disabled:cursor-not-allowed",
|
|
14508
14564
|
AUTOFILL_RESET_CLASS,
|
|
14509
|
-
|
|
14565
|
+
textareaClassName
|
|
14510
14566
|
),
|
|
14511
14567
|
style: {
|
|
14512
14568
|
minHeight: 100,
|
|
@@ -14551,8 +14607,8 @@ var formatInputWithCommas = (value) => {
|
|
|
14551
14607
|
const formattedInt = addCommas(intPart === "" ? "0" : intPart);
|
|
14552
14608
|
return `${isNeg ? "-" : ""}${formattedInt}${hasDecimal ? `.${decPart}` : ""}`;
|
|
14553
14609
|
};
|
|
14554
|
-
var getDecimalLimit = (
|
|
14555
|
-
if (!
|
|
14610
|
+
var getDecimalLimit = (allowDecimal, maxDecimalLength) => {
|
|
14611
|
+
if (!allowDecimal || maxDecimalLength === void 0 || !Number.isFinite(maxDecimalLength)) {
|
|
14556
14612
|
return void 0;
|
|
14557
14613
|
}
|
|
14558
14614
|
return Math.max(0, Math.floor(maxDecimalLength));
|
|
@@ -14581,12 +14637,12 @@ var SNumberInput = /* @__PURE__ */ react.forwardRef(function SNumberInput2({
|
|
|
14581
14637
|
min = Number.NEGATIVE_INFINITY,
|
|
14582
14638
|
max = Number.POSITIVE_INFINITY,
|
|
14583
14639
|
step = 1,
|
|
14584
|
-
|
|
14585
|
-
|
|
14640
|
+
showButton = false,
|
|
14641
|
+
allowDecimal = false,
|
|
14586
14642
|
maxDecimalLength,
|
|
14587
14643
|
inputPrefix = "",
|
|
14588
14644
|
inputSuffix = "",
|
|
14589
|
-
|
|
14645
|
+
inputClassName,
|
|
14590
14646
|
inputStyle,
|
|
14591
14647
|
autoFocus,
|
|
14592
14648
|
onFocus,
|
|
@@ -14616,7 +14672,7 @@ var SNumberInput = /* @__PURE__ */ react.forwardRef(function SNumberInput2({
|
|
|
14616
14672
|
}, ref) {
|
|
14617
14673
|
const p = PAD3[size];
|
|
14618
14674
|
const padX = `var(--cmp-numberInput-${size}-paddingX)`;
|
|
14619
|
-
const decimalLimit = getDecimalLimit(
|
|
14675
|
+
const decimalLimit = getDecimalLimit(allowDecimal, maxDecimalLength);
|
|
14620
14676
|
const numValue = applyDecimalLimit(toNumber(value), decimalLimit);
|
|
14621
14677
|
const [display, setDisplay] = react.useState(() => formatWithCommas(numValue));
|
|
14622
14678
|
const [ruleError, setRuleError] = react.useState("");
|
|
@@ -14699,7 +14755,7 @@ var SNumberInput = /* @__PURE__ */ react.forwardRef(function SNumberInput2({
|
|
|
14699
14755
|
setDisplayWithCaret(cleaned, logicalCaret);
|
|
14700
14756
|
return;
|
|
14701
14757
|
}
|
|
14702
|
-
if (!
|
|
14758
|
+
if (!allowDecimal && cleaned.includes(".")) {
|
|
14703
14759
|
resetRejectedInput(target, logicalCaret);
|
|
14704
14760
|
return;
|
|
14705
14761
|
}
|
|
@@ -14787,12 +14843,12 @@ var SNumberInput = /* @__PURE__ */ react.forwardRef(function SNumberInput2({
|
|
|
14787
14843
|
style: {
|
|
14788
14844
|
// 원본 sd-number-input: content gap = padding-x 토큰 (gap 토큰 아님)
|
|
14789
14845
|
gap: `var(--cmp-numberInput-${size}-paddingX)`,
|
|
14790
|
-
padding: `0 ${
|
|
14846
|
+
padding: `0 ${showButton ? padX : `calc(${padX} * 2)`}`,
|
|
14791
14847
|
fontSize: p.fontSize,
|
|
14792
14848
|
lineHeight: `${p.lineHeight}px`
|
|
14793
14849
|
},
|
|
14794
14850
|
children: [
|
|
14795
|
-
|
|
14851
|
+
showButton && stepper("dec"),
|
|
14796
14852
|
inputPrefix !== "" && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "flex-shrink-0", style: { color: affixColor }, children: inputPrefix }),
|
|
14797
14853
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
14798
14854
|
"input",
|
|
@@ -14800,7 +14856,7 @@ var SNumberInput = /* @__PURE__ */ react.forwardRef(function SNumberInput2({
|
|
|
14800
14856
|
ref: setRefs2,
|
|
14801
14857
|
name,
|
|
14802
14858
|
type: "text",
|
|
14803
|
-
inputMode:
|
|
14859
|
+
inputMode: allowDecimal ? "decimal" : "numeric",
|
|
14804
14860
|
value: display,
|
|
14805
14861
|
placeholder,
|
|
14806
14862
|
disabled,
|
|
@@ -14831,11 +14887,11 @@ var SNumberInput = /* @__PURE__ */ react.forwardRef(function SNumberInput2({
|
|
|
14831
14887
|
// (h-full 이면 input 내부 텍스트 센터링을 브라우저가 수행해 1px 어긋날 수 있음)
|
|
14832
14888
|
"min-w-0 flex-1 border-0 bg-transparent p-0 outline-none placeholder:text-[color:var(--cmp-numberInput-text-placeholder)] disabled:cursor-not-allowed",
|
|
14833
14889
|
AUTOFILL_RESET_CLASS,
|
|
14834
|
-
|
|
14890
|
+
inputClassName
|
|
14835
14891
|
),
|
|
14836
14892
|
style: {
|
|
14837
14893
|
// fontSize/lineHeight 는 컨테이너에서 상속
|
|
14838
|
-
textAlign:
|
|
14894
|
+
textAlign: showButton ? "center" : "right",
|
|
14839
14895
|
color: disabled ? "var(--cmp-numberInput-text-disabled)" : "var(--cmp-numberInput-text-default)",
|
|
14840
14896
|
...inputStyle
|
|
14841
14897
|
},
|
|
@@ -14845,7 +14901,7 @@ var SNumberInput = /* @__PURE__ */ react.forwardRef(function SNumberInput2({
|
|
|
14845
14901
|
),
|
|
14846
14902
|
valueTooltip.tooltip,
|
|
14847
14903
|
inputSuffix !== "" && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "flex-shrink-0", style: { color: affixColor }, children: inputSuffix }),
|
|
14848
|
-
|
|
14904
|
+
showButton && stepper("inc")
|
|
14849
14905
|
]
|
|
14850
14906
|
}
|
|
14851
14907
|
)
|
|
@@ -15683,7 +15739,7 @@ function RangeCalendar({
|
|
|
15683
15739
|
value,
|
|
15684
15740
|
selectable,
|
|
15685
15741
|
maxRange,
|
|
15686
|
-
|
|
15742
|
+
showTimePicker = false,
|
|
15687
15743
|
onSelect,
|
|
15688
15744
|
onPendingStartChange,
|
|
15689
15745
|
onViewChange
|
|
@@ -15702,7 +15758,7 @@ function RangeCalendar({
|
|
|
15702
15758
|
const [eM, setEM] = react.useState(splitDateTime(value?.[1]).minute);
|
|
15703
15759
|
const lastEmitted = react.useRef("");
|
|
15704
15760
|
react.useEffect(() => {
|
|
15705
|
-
if (
|
|
15761
|
+
if (showTimePicker && JSON.stringify(value) === lastEmitted.current) return;
|
|
15706
15762
|
const s = splitDateTime(value?.[0]);
|
|
15707
15763
|
const e = splitDateTime(value?.[1]);
|
|
15708
15764
|
setStart(s.date);
|
|
@@ -15711,7 +15767,7 @@ function RangeCalendar({
|
|
|
15711
15767
|
setSM(s.minute);
|
|
15712
15768
|
setEH(e.hour);
|
|
15713
15769
|
setEM(e.minute);
|
|
15714
|
-
}, [value,
|
|
15770
|
+
}, [value, showTimePicker]);
|
|
15715
15771
|
const setBase = (ny, nm) => {
|
|
15716
15772
|
setY(ny);
|
|
15717
15773
|
setM(nm);
|
|
@@ -15759,7 +15815,7 @@ function RangeCalendar({
|
|
|
15759
15815
|
const pad = (v) => String(Number(v) || 0).padStart(2, "0");
|
|
15760
15816
|
const emit3 = (dateStart, dateEnd, time) => {
|
|
15761
15817
|
const t = time ?? { sH, sM, eH, eM };
|
|
15762
|
-
const range =
|
|
15818
|
+
const range = showTimePicker ? [`${dateStart} ${pad(t.sH)}:${pad(t.sM)}`, `${dateEnd} ${pad(t.eH)}:${pad(t.eM)}`] : [dateStart, dateEnd];
|
|
15763
15819
|
lastEmitted.current = JSON.stringify(range);
|
|
15764
15820
|
onSelect(range);
|
|
15765
15821
|
};
|
|
@@ -15769,7 +15825,7 @@ function RangeCalendar({
|
|
|
15769
15825
|
setStart(d);
|
|
15770
15826
|
setEnd(null);
|
|
15771
15827
|
setHover(null);
|
|
15772
|
-
if (
|
|
15828
|
+
if (showTimePicker) {
|
|
15773
15829
|
setSH("00");
|
|
15774
15830
|
setSM("00");
|
|
15775
15831
|
setEH("23");
|
|
@@ -15780,7 +15836,7 @@ function RangeCalendar({
|
|
|
15780
15836
|
}
|
|
15781
15837
|
setEnd(d);
|
|
15782
15838
|
onPendingStartChange?.(null);
|
|
15783
|
-
emit3(start, d,
|
|
15839
|
+
emit3(start, d, showTimePicker ? { sH, sM, eH: "23", eM: "59" } : void 0);
|
|
15784
15840
|
};
|
|
15785
15841
|
const changeTime = (which, part, raw) => {
|
|
15786
15842
|
const digits = raw.replace(/\D/g, "").slice(0, 2);
|
|
@@ -15951,7 +16007,7 @@ function RangeCalendar({
|
|
|
15951
16007
|
// 높이는 고정이 아니라 하한이다 — 5주/6주 달을 오갈 때의 높이 흔들림만 막으면 되고,
|
|
15952
16008
|
// 창이 좁아 패널이 가로 스크롤될 때는 스크롤바 높이만큼 늘어날 수 있어야 한다.
|
|
15953
16009
|
// (단일 달 SCalendar 도 min-h 를 쓴다)
|
|
15954
|
-
|
|
16010
|
+
showTimePicker ? "h-auto" : "min-h-[364px]"
|
|
15955
16011
|
),
|
|
15956
16012
|
children: [
|
|
15957
16013
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative flex items-center justify-center", children: [
|
|
@@ -15984,7 +16040,7 @@ function RangeCalendar({
|
|
|
15984
16040
|
]
|
|
15985
16041
|
}
|
|
15986
16042
|
),
|
|
15987
|
-
|
|
16043
|
+
showTimePicker && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
15988
16044
|
/* @__PURE__ */ jsxRuntime.jsx(SDivider, {}),
|
|
15989
16045
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex gap-[var(--cmp-datepicker-calendar-time-gap)]", children: [
|
|
15990
16046
|
renderTimeSection("start", start, "\uBD80\uD130"),
|
|
@@ -16003,7 +16059,7 @@ function SDateRangePicker({
|
|
|
16003
16059
|
placeholder = "YYYY-MM-DD ~ YYYY-MM-DD",
|
|
16004
16060
|
selectable,
|
|
16005
16061
|
maxRange,
|
|
16006
|
-
|
|
16062
|
+
showTimePicker = false,
|
|
16007
16063
|
disabled = false,
|
|
16008
16064
|
clearable = false,
|
|
16009
16065
|
width,
|
|
@@ -16071,14 +16127,14 @@ function SDateRangePicker({
|
|
|
16071
16127
|
setPendingStart(null);
|
|
16072
16128
|
onValueChange?.(r);
|
|
16073
16129
|
if (rules && rules.length > 0) setRuleError(runRules(r, rules));
|
|
16074
|
-
if (!
|
|
16130
|
+
if (!showTimePicker) setOpen(false);
|
|
16075
16131
|
};
|
|
16076
16132
|
const clear = () => {
|
|
16077
16133
|
setPendingStart(null);
|
|
16078
16134
|
onValueChange?.(null);
|
|
16079
16135
|
if (rules && rules.length > 0) setRuleError(runRules(null, rules));
|
|
16080
16136
|
};
|
|
16081
|
-
const resolvedPlaceholder =
|
|
16137
|
+
const resolvedPlaceholder = showTimePicker && placeholder === "YYYY-MM-DD ~ YYYY-MM-DD" ? "YYYY-MM-DD HH:mm ~ YYYY-MM-DD HH:mm" : placeholder;
|
|
16082
16138
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
16083
16139
|
SField,
|
|
16084
16140
|
{
|
|
@@ -16192,7 +16248,7 @@ function SDateRangePicker({
|
|
|
16192
16248
|
value: value ?? null,
|
|
16193
16249
|
selectable,
|
|
16194
16250
|
maxRange,
|
|
16195
|
-
|
|
16251
|
+
showTimePicker,
|
|
16196
16252
|
onSelect: select,
|
|
16197
16253
|
onPendingStartChange: setPendingStart,
|
|
16198
16254
|
onViewChange
|
|
@@ -16364,7 +16420,7 @@ function SFilePicker({
|
|
|
16364
16420
|
hovered = false,
|
|
16365
16421
|
inline = false,
|
|
16366
16422
|
multiple = false,
|
|
16367
|
-
|
|
16423
|
+
showMultipleListBox = false,
|
|
16368
16424
|
accept,
|
|
16369
16425
|
maxFileSize,
|
|
16370
16426
|
maxTotalSize,
|
|
@@ -16464,7 +16520,7 @@ function SFilePicker({
|
|
|
16464
16520
|
const iconSize = size === "md" ? 20 : 16;
|
|
16465
16521
|
const gapCls = size === "md" ? "gap-[var(--cmp-filepicker-md-gap)]" : "gap-[var(--cmp-filepicker-sm-gap)]";
|
|
16466
16522
|
const inlinePlaceholder = inline && !disabled && !hasFiles;
|
|
16467
|
-
const showListbox = multiple &&
|
|
16523
|
+
const showListbox = multiple && showMultipleListBox;
|
|
16468
16524
|
const filesArr = multiple ? files : [];
|
|
16469
16525
|
const contentInner = /* @__PURE__ */ jsxRuntime.jsxs(
|
|
16470
16526
|
"div",
|
|
@@ -16551,7 +16607,7 @@ function SFilePicker({
|
|
|
16551
16607
|
}
|
|
16552
16608
|
)
|
|
16553
16609
|
] }) : contentInner;
|
|
16554
|
-
const chips = multiple && !
|
|
16610
|
+
const chips = multiple && !showMultipleListBox && filesArr.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-[8px] flex flex-wrap gap-[8px]", children: filesArr.map((f, i) => /* @__PURE__ */ jsxRuntime.jsx(SChip2, { value: f.name, editable: false, onRemove: () => removeChip(i) }, i)) });
|
|
16555
16611
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className, style, children: [
|
|
16556
16612
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
16557
16613
|
SField,
|
|
@@ -16763,7 +16819,7 @@ function SToast({
|
|
|
16763
16819
|
link,
|
|
16764
16820
|
linkLabel,
|
|
16765
16821
|
buttonLabel,
|
|
16766
|
-
|
|
16822
|
+
showClose = false,
|
|
16767
16823
|
type = "default",
|
|
16768
16824
|
onClose,
|
|
16769
16825
|
onButtonClick,
|
|
@@ -16823,7 +16879,7 @@ function SToast({
|
|
|
16823
16879
|
onClick: (e) => onButtonClick?.(e)
|
|
16824
16880
|
}
|
|
16825
16881
|
),
|
|
16826
|
-
|
|
16882
|
+
showClose && /* @__PURE__ */ jsxRuntime.jsx(
|
|
16827
16883
|
SGhostButton,
|
|
16828
16884
|
{
|
|
16829
16885
|
icon: "close",
|
|
@@ -17078,7 +17134,7 @@ var SToastContainer = /* @__PURE__ */ react.forwardRef(
|
|
|
17078
17134
|
);
|
|
17079
17135
|
}
|
|
17080
17136
|
);
|
|
17081
|
-
var SForm = /* @__PURE__ */ react.forwardRef(function SForm2({
|
|
17137
|
+
var SForm = /* @__PURE__ */ react.forwardRef(function SForm2({ formClassName, onSubmit, onValidationError, children, className, style }, ref) {
|
|
17082
17138
|
const formRef = react.useRef(null);
|
|
17083
17139
|
const fieldsRef = react.useRef(/* @__PURE__ */ new Set());
|
|
17084
17140
|
const register = react.useCallback((entry) => {
|
|
@@ -17146,7 +17202,7 @@ var SForm = /* @__PURE__ */ react.forwardRef(function SForm2({ formClass, onSubm
|
|
|
17146
17202
|
{
|
|
17147
17203
|
ref: formRef,
|
|
17148
17204
|
onSubmit: handleSubmit,
|
|
17149
|
-
className: cn(
|
|
17205
|
+
className: cn(formClassName, className),
|
|
17150
17206
|
style,
|
|
17151
17207
|
noValidate: true,
|
|
17152
17208
|
children
|
|
@@ -18995,7 +19051,7 @@ var EditorBody = /* @__PURE__ */ react.forwardRef(function EditorBody2({
|
|
|
18995
19051
|
toolbar,
|
|
18996
19052
|
bubbleMenu,
|
|
18997
19053
|
onImageUpload,
|
|
18998
|
-
|
|
19054
|
+
editorClassName,
|
|
18999
19055
|
editorStyle
|
|
19000
19056
|
}, ref) {
|
|
19001
19057
|
const placeholderRef = react.useRef(placeholder);
|
|
@@ -19079,7 +19135,7 @@ var EditorBody = /* @__PURE__ */ react.forwardRef(function EditorBody2({
|
|
|
19079
19135
|
SCROLLBAR_CLASS,
|
|
19080
19136
|
SEDITOR_CONTENT_CLASS,
|
|
19081
19137
|
disabled && "cursor-not-allowed",
|
|
19082
|
-
|
|
19138
|
+
editorClassName
|
|
19083
19139
|
),
|
|
19084
19140
|
style: { ...editorContentStyle({ minHeight, maxHeight, disabled }), ...editorStyle },
|
|
19085
19141
|
children: /* @__PURE__ */ jsxRuntime.jsx(api.EditorContent, { editor, className: "h-full" })
|
|
@@ -19205,7 +19261,7 @@ var SEditor = /* @__PURE__ */ react.forwardRef(function SEditor2({
|
|
|
19205
19261
|
focused,
|
|
19206
19262
|
hovered,
|
|
19207
19263
|
name,
|
|
19208
|
-
|
|
19264
|
+
editorClassName,
|
|
19209
19265
|
editorStyle,
|
|
19210
19266
|
onFocus,
|
|
19211
19267
|
onBlur,
|
|
@@ -19334,7 +19390,7 @@ var SEditor = /* @__PURE__ */ react.forwardRef(function SEditor2({
|
|
|
19334
19390
|
"div",
|
|
19335
19391
|
{
|
|
19336
19392
|
"aria-busy": true,
|
|
19337
|
-
className: cn("min-w-0 flex-1 overflow-y-auto", SCROLLBAR_CLASS,
|
|
19393
|
+
className: cn("min-w-0 flex-1 overflow-y-auto", SCROLLBAR_CLASS, editorClassName),
|
|
19338
19394
|
style: { ...editorContentStyle({ minHeight, maxHeight, disabled }), ...editorStyle },
|
|
19339
19395
|
children: (value ?? defaultValue ?? "") === "" && /* @__PURE__ */ jsxRuntime.jsx("span", { style: { color: "var(--sys-color-field-text-placeholder)" }, children: placeholder })
|
|
19340
19396
|
}
|
|
@@ -19359,7 +19415,7 @@ var SEditor = /* @__PURE__ */ react.forwardRef(function SEditor2({
|
|
|
19359
19415
|
toolbar: resolvedToolbar,
|
|
19360
19416
|
bubbleMenu: resolvedBubbleMenu,
|
|
19361
19417
|
onImageUpload,
|
|
19362
|
-
|
|
19418
|
+
editorClassName,
|
|
19363
19419
|
editorStyle
|
|
19364
19420
|
}
|
|
19365
19421
|
) })
|
|
@@ -19812,23 +19868,23 @@ var SChipFilter = /* @__PURE__ */ react.forwardRef(function SChipFilter2({
|
|
|
19812
19868
|
}
|
|
19813
19869
|
setOpenKey(key);
|
|
19814
19870
|
};
|
|
19815
|
-
const
|
|
19871
|
+
const valueAsPrimitive = (key, nextValue) => {
|
|
19816
19872
|
const next = { ...values, [key]: nextValue };
|
|
19817
19873
|
onValueChange?.(next);
|
|
19818
19874
|
onFilterChange?.({ key, value: nextValue, values: next });
|
|
19819
19875
|
return next;
|
|
19820
19876
|
};
|
|
19821
19877
|
const emitValueAndSearch = (key, nextValue) => {
|
|
19822
|
-
runSearch(
|
|
19878
|
+
runSearch(valueAsPrimitive(key, nextValue));
|
|
19823
19879
|
};
|
|
19824
19880
|
const clearValue = (key) => {
|
|
19825
19881
|
const field = fields.find((f) => f.key === key);
|
|
19826
19882
|
const def = field ? resolveFieldDefault(field) : void 0;
|
|
19827
|
-
runSearch(
|
|
19883
|
+
runSearch(valueAsPrimitive(key, def !== void 0 ? def : null));
|
|
19828
19884
|
};
|
|
19829
19885
|
const removeField = (key) => {
|
|
19830
19886
|
keywordDraftRef.current = null;
|
|
19831
|
-
const nextValues =
|
|
19887
|
+
const nextValues = valueAsPrimitive(key, null);
|
|
19832
19888
|
dismissedRef.current.add(key);
|
|
19833
19889
|
setInternalActiveKeys((current) => current.filter((activeKey) => activeKey !== key));
|
|
19834
19890
|
if (openKey === key) setOpenKey(null);
|
|
@@ -20068,7 +20124,7 @@ var SChipFilter = /* @__PURE__ */ react.forwardRef(function SChipFilter2({
|
|
|
20068
20124
|
icon: "reset",
|
|
20069
20125
|
iconColor: "grey_80",
|
|
20070
20126
|
label: "\uAC80\uC0C9 \uCD08\uAE30\uD654",
|
|
20071
|
-
|
|
20127
|
+
labelClassName: "text-grey-80",
|
|
20072
20128
|
disabled: disabled || !canReset,
|
|
20073
20129
|
onClick: reset,
|
|
20074
20130
|
className: cn(
|
|
@@ -20106,7 +20162,7 @@ var SChipFilter = /* @__PURE__ */ react.forwardRef(function SChipFilter2({
|
|
|
20106
20162
|
field: currentOpenField,
|
|
20107
20163
|
value: values[currentOpenField.key],
|
|
20108
20164
|
disabled: disabled || currentOpenField.disabled,
|
|
20109
|
-
onValueChange: (next) =>
|
|
20165
|
+
onValueChange: (next) => valueAsPrimitive(currentOpenField.key, next),
|
|
20110
20166
|
onValueCommit: (next) => emitValueAndSearch(currentOpenField.key, next),
|
|
20111
20167
|
onDraftChange: (text) => {
|
|
20112
20168
|
keywordDraftRef.current = text.trim() === "" ? null : { key: currentOpenField.key, text };
|
|
@@ -20310,7 +20366,7 @@ function EditorPanel({
|
|
|
20310
20366
|
{
|
|
20311
20367
|
size: "sm",
|
|
20312
20368
|
label: allSelected ? "\uC120\uD0DD \uD574\uC81C" : "\uC804\uCCB4 \uC120\uD0DD",
|
|
20313
|
-
|
|
20369
|
+
labelClassName: "font-bold",
|
|
20314
20370
|
disabled,
|
|
20315
20371
|
onClick: toggleSelectAll,
|
|
20316
20372
|
style: { color: "var(--sys-color-fg-secondary)" }
|
|
@@ -20333,7 +20389,7 @@ function EditorPanel({
|
|
|
20333
20389
|
{
|
|
20334
20390
|
size: "sm",
|
|
20335
20391
|
label: "\uAC80\uC0C9",
|
|
20336
|
-
|
|
20392
|
+
labelClassName: "font-bold",
|
|
20337
20393
|
onClick: onClose,
|
|
20338
20394
|
style: { color: CHIPFILTER.chipAppliedValue }
|
|
20339
20395
|
}
|
|
@@ -21067,7 +21123,7 @@ var SChipInput = /* @__PURE__ */ react.forwardRef(function SChipInput2({
|
|
|
21067
21123
|
name,
|
|
21068
21124
|
rules,
|
|
21069
21125
|
error,
|
|
21070
|
-
|
|
21126
|
+
showReset = false,
|
|
21071
21127
|
maxCount,
|
|
21072
21128
|
metaPlacement = "end",
|
|
21073
21129
|
duplicateLabel,
|
|
@@ -21202,7 +21258,7 @@ var SChipInput = /* @__PURE__ */ react.forwardRef(function SChipInput2({
|
|
|
21202
21258
|
commit(values.slice(0, -1));
|
|
21203
21259
|
}
|
|
21204
21260
|
};
|
|
21205
|
-
const showResetLink =
|
|
21261
|
+
const showResetLink = showReset && values.length > 0;
|
|
21206
21262
|
const showMaxCount = maxCount != null;
|
|
21207
21263
|
const showMetaInfo = showResetLink || showMaxCount;
|
|
21208
21264
|
const closeDropdown = () => {
|
|
@@ -21522,7 +21578,7 @@ var SBarcodeInput = /* @__PURE__ */ react.forwardRef(
|
|
|
21522
21578
|
hovered,
|
|
21523
21579
|
prefix,
|
|
21524
21580
|
suffix,
|
|
21525
|
-
|
|
21581
|
+
inputClassName,
|
|
21526
21582
|
inputStyle,
|
|
21527
21583
|
label,
|
|
21528
21584
|
labelWidth,
|
|
@@ -21613,7 +21669,7 @@ var SBarcodeInput = /* @__PURE__ */ react.forwardRef(
|
|
|
21613
21669
|
className: cn(
|
|
21614
21670
|
"h-full min-w-0 flex-1 border-0 bg-transparent p-0 outline-none placeholder:text-[color:var(--cmp-textinput-text-placeholder)] disabled:cursor-not-allowed",
|
|
21615
21671
|
AUTOFILL_RESET_CLASS,
|
|
21616
|
-
|
|
21672
|
+
inputClassName
|
|
21617
21673
|
),
|
|
21618
21674
|
style: {
|
|
21619
21675
|
fontSize: f.fontSize,
|
|
@@ -21707,7 +21763,7 @@ var TIME_SELECTOR_WIDTH = 136;
|
|
|
21707
21763
|
var MERIDIEM_TIME_SELECTOR_WIDTH = 154;
|
|
21708
21764
|
function TimeSelector({
|
|
21709
21765
|
value,
|
|
21710
|
-
|
|
21766
|
+
showMeridiem,
|
|
21711
21767
|
minuteStep,
|
|
21712
21768
|
onChange
|
|
21713
21769
|
}) {
|
|
@@ -21721,7 +21777,7 @@ function TimeSelector({
|
|
|
21721
21777
|
setMinute(parsed.minute);
|
|
21722
21778
|
}, [parsed.hour, parsed.minute]);
|
|
21723
21779
|
const meridiem = hour >= 12 ? "PM" : "AM";
|
|
21724
|
-
const displayHour =
|
|
21780
|
+
const displayHour = showMeridiem ? hour % 12 === 0 ? 12 : hour % 12 : hour;
|
|
21725
21781
|
const commit = (nextHour, nextMinute) => {
|
|
21726
21782
|
const h = clampTimePart(nextHour, 0, 23);
|
|
21727
21783
|
const m = clampTimePart(nextMinute, 0, 59);
|
|
@@ -21752,8 +21808,8 @@ function TimeSelector({
|
|
|
21752
21808
|
setInputDraft((prev) => ({ ...prev, [part]: String(currentValue).padStart(2, "0") }));
|
|
21753
21809
|
};
|
|
21754
21810
|
const commitHourDraft = (draft) => {
|
|
21755
|
-
const clamped = clampTimePart(Number(draft),
|
|
21756
|
-
const nextHour =
|
|
21811
|
+
const clamped = clampTimePart(Number(draft), showMeridiem ? 1 : 0, showMeridiem ? 12 : 23);
|
|
21812
|
+
const nextHour = showMeridiem ? meridiem === "PM" ? clamped === 12 ? 12 : clamped + 12 : clamped === 12 ? 0 : clamped : clamped;
|
|
21757
21813
|
commit(nextHour, minute);
|
|
21758
21814
|
return clamped;
|
|
21759
21815
|
};
|
|
@@ -21854,7 +21910,7 @@ function TimeSelector({
|
|
|
21854
21910
|
boxShadow: "4px 8px 16px -4px rgba(34,34,34,0.1), 0 0 24px -6px rgba(34,34,34,0.12)"
|
|
21855
21911
|
},
|
|
21856
21912
|
children: [
|
|
21857
|
-
|
|
21913
|
+
showMeridiem && /* @__PURE__ */ jsxRuntime.jsx(
|
|
21858
21914
|
"div",
|
|
21859
21915
|
{
|
|
21860
21916
|
className: "flex items-center justify-center",
|
|
@@ -21881,7 +21937,7 @@ function TimeSelector({
|
|
|
21881
21937
|
}) })
|
|
21882
21938
|
}
|
|
21883
21939
|
),
|
|
21884
|
-
|
|
21940
|
+
showMeridiem && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "h-px w-full bg-[var(--sys-color-divider-default)]" }),
|
|
21885
21941
|
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
21886
21942
|
"div",
|
|
21887
21943
|
{
|
|
@@ -21922,7 +21978,7 @@ function STimePicker({
|
|
|
21922
21978
|
placeholder = "00:00",
|
|
21923
21979
|
disabled = false,
|
|
21924
21980
|
clearable = false,
|
|
21925
|
-
|
|
21981
|
+
showMeridiem,
|
|
21926
21982
|
minuteStep = 1,
|
|
21927
21983
|
width,
|
|
21928
21984
|
name,
|
|
@@ -21950,8 +22006,8 @@ function STimePicker({
|
|
|
21950
22006
|
const [ruleError, setRuleError] = react.useState("");
|
|
21951
22007
|
const dims = TIMEPICKER_SIZE_CONFIG[size] ?? TIMEPICKER_SIZE_CONFIG.sm;
|
|
21952
22008
|
const normalized = value ? formatTimeValue(parseTimeValue(value).hour, parseTimeValue(value).minute) : null;
|
|
21953
|
-
const
|
|
21954
|
-
const displayText = formatTimeDisplay(normalized,
|
|
22009
|
+
const effectiveShowMeridiem = showMeridiem ?? type === "midday";
|
|
22010
|
+
const displayText = formatTimeDisplay(normalized, effectiveShowMeridiem ? "midday" : "default");
|
|
21955
22011
|
const hasValue = normalized != null && normalized !== "";
|
|
21956
22012
|
useFormField({
|
|
21957
22013
|
name,
|
|
@@ -21968,7 +22024,7 @@ function STimePicker({
|
|
|
21968
22024
|
if (disabled) return;
|
|
21969
22025
|
if (next) {
|
|
21970
22026
|
const triggerWidth = triggerRef.current?.getBoundingClientRect().width ?? 0;
|
|
21971
|
-
const selectorWidth =
|
|
22027
|
+
const selectorWidth = effectiveShowMeridiem ? MERIDIEM_TIME_SELECTOR_WIDTH : TIME_SELECTOR_WIDTH;
|
|
21972
22028
|
setPopoverAlignOffset(Math.max(0, (triggerWidth - selectorWidth) / 2));
|
|
21973
22029
|
}
|
|
21974
22030
|
setOpen(next);
|
|
@@ -22078,7 +22134,7 @@ function STimePicker({
|
|
|
22078
22134
|
TimeSelector,
|
|
22079
22135
|
{
|
|
22080
22136
|
value: normalized,
|
|
22081
|
-
|
|
22137
|
+
showMeridiem: effectiveShowMeridiem,
|
|
22082
22138
|
minuteStep,
|
|
22083
22139
|
onChange: commitValue
|
|
22084
22140
|
}
|
|
@@ -22121,7 +22177,7 @@ var MIDDAY_FIELD_MAX_WIDTH = {
|
|
|
22121
22177
|
};
|
|
22122
22178
|
function RangeTimeSelector({
|
|
22123
22179
|
value,
|
|
22124
|
-
|
|
22180
|
+
showMeridiem,
|
|
22125
22181
|
minuteStep,
|
|
22126
22182
|
rangeOrder,
|
|
22127
22183
|
onChange
|
|
@@ -22134,7 +22190,7 @@ function RangeTimeSelector({
|
|
|
22134
22190
|
const getMeridiem = (side) => getParts(side).hour >= 12 ? "PM" : "AM";
|
|
22135
22191
|
const getDisplayHour = (side) => {
|
|
22136
22192
|
const { hour } = getParts(side);
|
|
22137
|
-
if (!
|
|
22193
|
+
if (!showMeridiem) return hour;
|
|
22138
22194
|
const displayHour = hour % 12;
|
|
22139
22195
|
return displayHour === 0 ? 12 : displayHour;
|
|
22140
22196
|
};
|
|
@@ -22197,10 +22253,10 @@ function RangeTimeSelector({
|
|
|
22197
22253
|
setInputDraft((prev) => ({ ...prev, [key]: String(currentValue).padStart(2, "0") }));
|
|
22198
22254
|
};
|
|
22199
22255
|
const commitHourDraft = (side, draft) => {
|
|
22200
|
-
const clamped = clampTimePart(Number(draft),
|
|
22256
|
+
const clamped = clampTimePart(Number(draft), showMeridiem ? 1 : 0, showMeridiem ? 12 : 23);
|
|
22201
22257
|
const parts = getParts(side);
|
|
22202
22258
|
const meridiem = getMeridiem(side);
|
|
22203
|
-
const nextHour =
|
|
22259
|
+
const nextHour = showMeridiem ? meridiem === "PM" ? clamped === 12 ? 12 : clamped + 12 : clamped === 12 ? 0 : clamped : clamped;
|
|
22204
22260
|
commit(side, nextHour, parts.minute);
|
|
22205
22261
|
return clamped;
|
|
22206
22262
|
};
|
|
@@ -22308,7 +22364,7 @@ function RangeTimeSelector({
|
|
|
22308
22364
|
style: { gap: "var(--cmp-timepicker-selector-range-heading-gap)" },
|
|
22309
22365
|
children: [
|
|
22310
22366
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "whitespace-nowrap text-center text-[12px] font-bold leading-[20px] text-[var(--cmp-timepicker-selector-range-heading-color)]", children: title }),
|
|
22311
|
-
|
|
22367
|
+
showMeridiem && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "isolate flex", children: ["AM", "PM"].map((item4, index) => {
|
|
22312
22368
|
const selected = item4 === getMeridiem(side);
|
|
22313
22369
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
22314
22370
|
"button",
|
|
@@ -22386,7 +22442,7 @@ function STimeRangePicker({
|
|
|
22386
22442
|
placeholder = "00:00 ~ 23:59",
|
|
22387
22443
|
disabled = false,
|
|
22388
22444
|
clearable = false,
|
|
22389
|
-
|
|
22445
|
+
showMeridiem,
|
|
22390
22446
|
minuteStep = 1,
|
|
22391
22447
|
rangeOrder = "strict",
|
|
22392
22448
|
width,
|
|
@@ -22415,10 +22471,10 @@ function STimeRangePicker({
|
|
|
22415
22471
|
const [ruleError, setRuleError] = react.useState("");
|
|
22416
22472
|
const dims = TIMEPICKER_SIZE_CONFIG[size] ?? TIMEPICKER_SIZE_CONFIG.sm;
|
|
22417
22473
|
const normalized = normalizeTimeRangeValue(value ?? null, rangeOrder);
|
|
22418
|
-
const
|
|
22474
|
+
const effectiveShowMeridiem = showMeridiem ?? type === "midday";
|
|
22419
22475
|
const displayText = formatTimeRangeDisplay(
|
|
22420
22476
|
normalized,
|
|
22421
|
-
|
|
22477
|
+
effectiveShowMeridiem ? "midday" : "default"
|
|
22422
22478
|
);
|
|
22423
22479
|
const hasValue = normalized != null && normalized[0] !== "" && normalized[1] !== "";
|
|
22424
22480
|
useFormField({
|
|
@@ -22464,8 +22520,8 @@ function STimeRangePicker({
|
|
|
22464
22520
|
focused: focused || open,
|
|
22465
22521
|
errorMessage: ruleError !== "" ? ruleError : errorMessage,
|
|
22466
22522
|
width,
|
|
22467
|
-
minWidth:
|
|
22468
|
-
maxWidth:
|
|
22523
|
+
minWidth: effectiveShowMeridiem ? MIDDAY_FIELD_MIN_WIDTH[size] : dims.fieldMinWidth,
|
|
22524
|
+
maxWidth: effectiveShowMeridiem ? MIDDAY_FIELD_MAX_WIDTH[size] : dims.fieldMaxWidth,
|
|
22469
22525
|
disabled,
|
|
22470
22526
|
className,
|
|
22471
22527
|
style,
|
|
@@ -22545,7 +22601,7 @@ function STimeRangePicker({
|
|
|
22545
22601
|
RangeTimeSelector,
|
|
22546
22602
|
{
|
|
22547
22603
|
value: normalized,
|
|
22548
|
-
|
|
22604
|
+
showMeridiem: effectiveShowMeridiem,
|
|
22549
22605
|
minuteStep,
|
|
22550
22606
|
rangeOrder,
|
|
22551
22607
|
onChange: commitValue
|
|
@@ -22591,6 +22647,8 @@ exports.ICONS = ICONS;
|
|
|
22591
22647
|
exports.IMAGE_FITS = IMAGE_FITS;
|
|
22592
22648
|
exports.PAGE_BACKGROUNDS = PAGE_BACKGROUNDS;
|
|
22593
22649
|
exports.PAGE_CONTENT_HEIGHTS = PAGE_CONTENT_HEIGHTS;
|
|
22650
|
+
exports.PAGE_CONTENT_WIDTHS = PAGE_CONTENT_WIDTHS;
|
|
22651
|
+
exports.PAGE_HEADER_VARIANTS = PAGE_HEADER_VARIANTS;
|
|
22594
22652
|
exports.RangeCalendar = RangeCalendar;
|
|
22595
22653
|
exports.SAccountListBox = SAccountListBox;
|
|
22596
22654
|
exports.SActionModal = SActionModal;
|