sellmate-design-system-react 9.0.0-beta.24 → 9.0.0-beta.26
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 +32 -2
- package/dist/components/SChipFilter/README.md +5 -5
- package/dist/components/SChipFilter/SChipFilter.d.ts +10 -6
- package/dist/components/SIcon/README.md +2 -0
- package/dist/components/SSystemActionButton/README.md +129 -0
- package/dist/components/SSystemActionButton/SSystemActionButton.d.ts +79 -0
- package/dist/components/SSystemActionButton/index.d.ts +2 -0
- package/dist/components/SSystemActionButton/systemActionButton.config.d.ts +87 -0
- package/dist/components/STable/README.md +16 -0
- package/dist/components/STable/STable.d.ts +12 -0
- package/dist/components/STable/index.d.ts +1 -1
- package/dist/components/STag/README.md +2 -0
- package/dist/index.cjs +623 -318
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +618 -319
- package/dist/index.js.map +1 -1
- package/dist/llms-full.txt +182 -7
- package/dist/llms.txt +36 -4
- package/dist/styles.css +150 -1
- package/dist/theme.css +89 -1
- package/eslint/scale.gen.mjs +2 -2
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -4243,7 +4243,7 @@ function moveWithDepth(items, fromIndex, target, getDepth, setDepth, maxDepth) {
|
|
|
4243
4243
|
const nextDepth = target.intent === "inside" ? targetDepth + 1 : targetDepth;
|
|
4244
4244
|
const depthDelta = clampDepth(nextDepth, maxDepth) - sourceDepth;
|
|
4245
4245
|
const nextMovedItems = setDepth && depthDelta !== 0 ? movedItems.map(
|
|
4246
|
-
(
|
|
4246
|
+
(item2, index) => setDepth(item2, clampDepth(getDepth(item2, fromIndex + index) + depthDelta, maxDepth))
|
|
4247
4247
|
) : movedItems;
|
|
4248
4248
|
return [
|
|
4249
4249
|
...remainingItems.slice(0, insertionIndex),
|
|
@@ -4290,7 +4290,7 @@ function SDraggableListInner({
|
|
|
4290
4290
|
setDropTarget({ index, intent: "before" });
|
|
4291
4291
|
}, []);
|
|
4292
4292
|
const readDepth = react.useCallback(
|
|
4293
|
-
(
|
|
4293
|
+
(item2, index) => clampDepth(getDepth?.(item2, index) ?? 1, maxDepth),
|
|
4294
4294
|
[getDepth, maxDepth]
|
|
4295
4295
|
);
|
|
4296
4296
|
react.useEffect(() => {
|
|
@@ -4331,8 +4331,8 @@ function SDraggableListInner({
|
|
|
4331
4331
|
nextDropTarget = ratio < 0.5 ? { index, intent: "before" } : { index, intent: "after" };
|
|
4332
4332
|
break;
|
|
4333
4333
|
}
|
|
4334
|
-
const
|
|
4335
|
-
const canHaveChildren = (getCanHaveChildren?.(
|
|
4334
|
+
const item2 = items[index];
|
|
4335
|
+
const canHaveChildren = (getCanHaveChildren?.(item2, index) ?? true) && readDepth(item2, index) < maxDepth;
|
|
4336
4336
|
if (ratio < 0.25) {
|
|
4337
4337
|
nextDropTarget = { index, intent: "before" };
|
|
4338
4338
|
} else if (ratio > 0.75 || !canHaveChildren) {
|
|
@@ -4412,10 +4412,10 @@ function SDraggableListInner({
|
|
|
4412
4412
|
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-border-accent) before:content-['']" : ""}`,
|
|
4413
4413
|
"data-draggable-group": dragContext ? dragGroup : void 0,
|
|
4414
4414
|
"data-draggable-list-id": dragContext ? listId : void 0,
|
|
4415
|
-
children: items.map((
|
|
4416
|
-
const itemKey = getKey(
|
|
4417
|
-
const disabled = (getDisabled?.(
|
|
4418
|
-
const depth = readDepth(
|
|
4415
|
+
children: items.map((item2, index) => {
|
|
4416
|
+
const itemKey = getKey(item2, index);
|
|
4417
|
+
const disabled = (getDisabled?.(item2, index) ?? false) || isDescendant(items, index, draggedSubtreeStart, usesDepth ? readDepth : void 0);
|
|
4418
|
+
const depth = readDepth(item2, index);
|
|
4419
4419
|
const showBefore = isDropTarget && currentDropIndex === index && (dragContext || currentDropIntent === "before");
|
|
4420
4420
|
const showInside = isDropTarget && currentDropIndex === index && !dragContext && usesDepth && currentDropIntent === "inside";
|
|
4421
4421
|
const showAfter = isDropTarget && (dragContext ? currentDropIndex === items.length && index === items.length - 1 : currentDropIndex === index && currentDropIntent === "after");
|
|
@@ -4439,7 +4439,7 @@ function SDraggableListInner({
|
|
|
4439
4439
|
onClick: selectItem,
|
|
4440
4440
|
onKeyDown: handleItemKeyDown,
|
|
4441
4441
|
className: `relative ${showBefore ? `before:absolute before:left-0 before:right-0 ${beforeIndicatorPosition} before:z-10 before:h-[2px] before:bg-(--sys-color-border-accent) before:content-['']` : ""} ${showAfter ? `after:absolute after:left-0 after:right-0 ${afterIndicatorPosition} after:z-10 after:h-[2px] after:bg-(--sys-color-border-accent) after:content-['']` : ""} ${showInside ? "outline outline-2 outline-offset-[-2px] outline-(--sys-color-border-accent)" : ""}`,
|
|
4442
|
-
children: renderItem(
|
|
4442
|
+
children: renderItem(item2, index, {
|
|
4443
4443
|
onDragHandleMouseDown: (event) => {
|
|
4444
4444
|
if (disabled) return;
|
|
4445
4445
|
if (dragContext && dragGroup && listId) {
|
|
@@ -5361,7 +5361,7 @@ var STreeImpl = /* @__PURE__ */ react.forwardRef(function STree({
|
|
|
5361
5361
|
}, ref) {
|
|
5362
5362
|
const [internalValue, setInternalValue] = react.useState(defaultValue ?? []);
|
|
5363
5363
|
const [internalExpandedIds, setInternalExpandedIds] = react.useState(
|
|
5364
|
-
defaultExpandedIds ?? items.filter((
|
|
5364
|
+
defaultExpandedIds ?? items.filter((item2) => item2.children?.length).map((item2) => item2.id)
|
|
5365
5365
|
);
|
|
5366
5366
|
const currentValue = value ?? internalValue;
|
|
5367
5367
|
const currentExpandedIds = expandedIds ?? internalExpandedIds;
|
|
@@ -6736,6 +6736,174 @@ function SSwitch({
|
|
|
6736
6736
|
}
|
|
6737
6737
|
);
|
|
6738
6738
|
}
|
|
6739
|
+
|
|
6740
|
+
// src/components/SSystemActionButton/systemActionButton.config.ts
|
|
6741
|
+
var SYSTEM_ACTION_BUTTON_COLORS = ["light", "dark", "darker"];
|
|
6742
|
+
var SYSTEM_ACTION_BUTTON_TYPES = [
|
|
6743
|
+
"account",
|
|
6744
|
+
"switch",
|
|
6745
|
+
"select",
|
|
6746
|
+
"subSelect",
|
|
6747
|
+
"status"
|
|
6748
|
+
];
|
|
6749
|
+
var item = (p) => `var(--cmp-gnb-system-item-${p})`;
|
|
6750
|
+
var action = (p) => `var(--cmp-gnb-system-actionButton-${p})`;
|
|
6751
|
+
var sys = (p) => `var(--sys-color-${p})`;
|
|
6752
|
+
var SYSTEM_ACTION_BUTTON_COLOR_CONFIG = {
|
|
6753
|
+
light: {
|
|
6754
|
+
bg: item("light-bg-default"),
|
|
6755
|
+
bgHover: item("light-bg-hover"),
|
|
6756
|
+
// light 의 아이콘 프레임 배경은 기본·hover 공통 한 값이다 (흰 면 위 흰 프레임)
|
|
6757
|
+
iconBg: item("light-icon-bg"),
|
|
6758
|
+
iconBgHover: item("light-icon-bg"),
|
|
6759
|
+
iconGlyph: item("light-icon-default"),
|
|
6760
|
+
iconGlyphHover: item("light-icon-default"),
|
|
6761
|
+
text: item("light-text"),
|
|
6762
|
+
actionText: {
|
|
6763
|
+
switch: action("switch-text-light"),
|
|
6764
|
+
selectData: action("selectData-text-light")
|
|
6765
|
+
},
|
|
6766
|
+
// 트레일링 아이콘 전용 색 토큰이 없다. light 는 item.icon.default 가
|
|
6767
|
+
// "actionButton/alertButton/setting 공통 글리프색"이라고 토큰에 명시돼 있다.
|
|
6768
|
+
actionIcon: item("light-icon-default")
|
|
6769
|
+
},
|
|
6770
|
+
dark: {
|
|
6771
|
+
bg: item("dark-bg-default"),
|
|
6772
|
+
bgHover: item("dark-bg-hover"),
|
|
6773
|
+
iconBg: item("dark-icon-bg-default"),
|
|
6774
|
+
iconBgHover: item("dark-icon-bg-hover"),
|
|
6775
|
+
// 어두운 면에는 글리프색 토큰이 없다. 기본은 프레임이 배경과 블렌딩되므로 라벨색(흰색),
|
|
6776
|
+
// hover 는 프레임이 흰색이 되므로 그 위에 표면색을 그대로 얹는다.
|
|
6777
|
+
iconGlyph: item("dark-text"),
|
|
6778
|
+
iconGlyphHover: item("dark-bg-hover"),
|
|
6779
|
+
text: item("dark-text"),
|
|
6780
|
+
actionText: {
|
|
6781
|
+
switch: action("switch-text-dark"),
|
|
6782
|
+
selectData: action("selectData-text-dark")
|
|
6783
|
+
},
|
|
6784
|
+
// TODO: 어두운 면의 트레일링 아이콘 색 토큰이 없다. 시안(#AAAAAA)에 맞는 시맨틱 토큰으로 둔다.
|
|
6785
|
+
actionIcon: sys("fg-quaternary")
|
|
6786
|
+
},
|
|
6787
|
+
darker: {
|
|
6788
|
+
bg: item("darker-bg-default"),
|
|
6789
|
+
bgHover: item("darker-bg-hover"),
|
|
6790
|
+
iconBg: item("darker-icon-bg-default"),
|
|
6791
|
+
iconBgHover: item("darker-icon-bg-hover"),
|
|
6792
|
+
iconGlyph: item("darker-text"),
|
|
6793
|
+
iconGlyphHover: item("darker-bg-hover"),
|
|
6794
|
+
text: item("darker-text"),
|
|
6795
|
+
actionText: {
|
|
6796
|
+
switch: action("switch-text-dark"),
|
|
6797
|
+
selectData: action("selectData-text-dark")
|
|
6798
|
+
},
|
|
6799
|
+
actionIcon: sys("fg-quaternary")
|
|
6800
|
+
}
|
|
6801
|
+
};
|
|
6802
|
+
var SYSTEM_ACTION_BUTTON_TYPE_CONFIG = {
|
|
6803
|
+
account: { fixedIcon: "user" },
|
|
6804
|
+
switch: {
|
|
6805
|
+
actionText: { token: "switch", typo: "typo-field-sm-default" },
|
|
6806
|
+
actionIcon: { name: "synchronize", size: action("switch-icon") }
|
|
6807
|
+
},
|
|
6808
|
+
select: {
|
|
6809
|
+
actionIcon: { name: "chevronRight", size: action("select-icon") }
|
|
6810
|
+
},
|
|
6811
|
+
subSelect: {
|
|
6812
|
+
actionText: { token: "selectData", typo: "typo-control-xs-medium" },
|
|
6813
|
+
actionIcon: { name: "chevronRight", size: action("selectData-icon") }
|
|
6814
|
+
},
|
|
6815
|
+
status: {
|
|
6816
|
+
// status 는 선행 아이콘 없이 태그가 라벨 자리를 차지한다
|
|
6817
|
+
actionIcon: { name: "chevronRight", size: action("select-icon") }
|
|
6818
|
+
}
|
|
6819
|
+
};
|
|
6820
|
+
var SYSTEM_ACTION_BUTTON_LAYOUT = {
|
|
6821
|
+
/** 행 높이 */
|
|
6822
|
+
height: item("height"),
|
|
6823
|
+
/** 행 라운드 */
|
|
6824
|
+
radius: item("radius"),
|
|
6825
|
+
/** 아이콘 프레임 한 변 */
|
|
6826
|
+
iconFrame: item("icon-frame"),
|
|
6827
|
+
/** 아이콘 글리프 크기 */
|
|
6828
|
+
iconGlyph: item("icon-glyph"),
|
|
6829
|
+
/** 아이콘 프레임 라운드 */
|
|
6830
|
+
iconRadius: item("icon-radius"),
|
|
6831
|
+
/** 아이콘 프레임 ↔ 라벨 간격 */
|
|
6832
|
+
iconLabelGap: item("iconLabelGap"),
|
|
6833
|
+
/** 좌측 여백 */
|
|
6834
|
+
paddingLeft: action("paddingLeft"),
|
|
6835
|
+
/** 우측 여백 */
|
|
6836
|
+
paddingRight: action("paddingRight"),
|
|
6837
|
+
/** 액션 텍스트 ↔ 액션 아이콘 간격 */
|
|
6838
|
+
actionGap: action("selectData-gap")
|
|
6839
|
+
};
|
|
6840
|
+
function TokenIcon({ name, size }) {
|
|
6841
|
+
return /* @__PURE__ */ jsxRuntime.jsx(SIcon, { name, size: "100%", style: { width: size, height: size } });
|
|
6842
|
+
}
|
|
6843
|
+
var SSystemActionButton = /* @__PURE__ */ react.forwardRef(
|
|
6844
|
+
function SSystemActionButton2({ color = "light", type, label, option, disabled = false, className, style, ...rest }, ref) {
|
|
6845
|
+
const c = SYSTEM_ACTION_BUTTON_COLOR_CONFIG[color];
|
|
6846
|
+
const spec = SYSTEM_ACTION_BUTTON_TYPE_CONFIG[type];
|
|
6847
|
+
const hoverable = !disabled;
|
|
6848
|
+
const status = type === "status" ? option : void 0;
|
|
6849
|
+
const resolvedIcon = spec.fixedIcon ?? option?.icon;
|
|
6850
|
+
const actionText = spec.actionText ? option?.text : void 0;
|
|
6851
|
+
const cssVars = {
|
|
6852
|
+
"--sab-bg": c.bg,
|
|
6853
|
+
"--sab-bg-hover": hoverable ? c.bgHover : c.bg,
|
|
6854
|
+
"--sab-icon-bg": c.iconBg,
|
|
6855
|
+
"--sab-icon-bg-hover": hoverable ? c.iconBgHover : c.iconBg,
|
|
6856
|
+
"--sab-icon-glyph": c.iconGlyph,
|
|
6857
|
+
"--sab-icon-glyph-hover": hoverable ? c.iconGlyphHover : c.iconGlyph,
|
|
6858
|
+
"--sab-text": c.text,
|
|
6859
|
+
"--sab-action-text": spec.actionText ? c.actionText[spec.actionText.token] : void 0,
|
|
6860
|
+
"--sab-action-icon": c.actionIcon,
|
|
6861
|
+
"minHeight": SYSTEM_ACTION_BUTTON_LAYOUT.height,
|
|
6862
|
+
"borderRadius": SYSTEM_ACTION_BUTTON_LAYOUT.radius,
|
|
6863
|
+
"paddingLeft": SYSTEM_ACTION_BUTTON_LAYOUT.paddingLeft,
|
|
6864
|
+
"paddingRight": SYSTEM_ACTION_BUTTON_LAYOUT.paddingRight,
|
|
6865
|
+
"gap": SYSTEM_ACTION_BUTTON_LAYOUT.iconLabelGap,
|
|
6866
|
+
...style
|
|
6867
|
+
};
|
|
6868
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
6869
|
+
"button",
|
|
6870
|
+
{
|
|
6871
|
+
ref,
|
|
6872
|
+
type: "button",
|
|
6873
|
+
disabled,
|
|
6874
|
+
className: cn(
|
|
6875
|
+
"group box-border flex w-full items-center border-none bg-(--sab-bg) text-left transition-colors",
|
|
6876
|
+
"hover:bg-(--sab-bg-hover)",
|
|
6877
|
+
disabled ? "cursor-not-allowed opacity-60" : "cursor-pointer",
|
|
6878
|
+
className
|
|
6879
|
+
),
|
|
6880
|
+
style: cssVars,
|
|
6881
|
+
...rest,
|
|
6882
|
+
children: [
|
|
6883
|
+
resolvedIcon && /* @__PURE__ */ jsxRuntime.jsx(
|
|
6884
|
+
"span",
|
|
6885
|
+
{
|
|
6886
|
+
className: "inline-flex shrink-0 items-center justify-center bg-(--sab-icon-bg) text-(--sab-icon-glyph) transition-colors group-hover:bg-(--sab-icon-bg-hover) group-hover:text-(--sab-icon-glyph-hover)",
|
|
6887
|
+
style: { width: SYSTEM_ACTION_BUTTON_LAYOUT.iconFrame, height: SYSTEM_ACTION_BUTTON_LAYOUT.iconFrame, borderRadius: SYSTEM_ACTION_BUTTON_LAYOUT.iconRadius },
|
|
6888
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(TokenIcon, { name: resolvedIcon, size: SYSTEM_ACTION_BUTTON_LAYOUT.iconGlyph })
|
|
6889
|
+
}
|
|
6890
|
+
),
|
|
6891
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "typo-body-sm-semibold flex min-w-0 flex-1 items-center text-(--sab-text)", children: status ? /* @__PURE__ */ jsxRuntime.jsx(STag, { color: status.color ?? "blue", icon: "dot", label: status.label }) : /* @__PURE__ */ jsxRuntime.jsx("span", { className: "truncate", children: label }) }),
|
|
6892
|
+
(actionText != null || spec.actionIcon) && /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "inline-flex shrink-0 items-center", style: { gap: SYSTEM_ACTION_BUTTON_LAYOUT.actionGap }, children: [
|
|
6893
|
+
actionText != null && spec.actionText && /* @__PURE__ */ jsxRuntime.jsx(
|
|
6894
|
+
"span",
|
|
6895
|
+
{
|
|
6896
|
+
className: cn(spec.actionText.typo, "whitespace-nowrap text-(--sab-action-text)"),
|
|
6897
|
+
children: actionText
|
|
6898
|
+
}
|
|
6899
|
+
),
|
|
6900
|
+
spec.actionIcon && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "inline-flex shrink-0 items-center text-(--sab-action-icon)", children: /* @__PURE__ */ jsxRuntime.jsx(TokenIcon, { name: spec.actionIcon.name, size: spec.actionIcon.size }) })
|
|
6901
|
+
] })
|
|
6902
|
+
]
|
|
6903
|
+
}
|
|
6904
|
+
);
|
|
6905
|
+
}
|
|
6906
|
+
);
|
|
6739
6907
|
var SIZE_CLASSES = {
|
|
6740
6908
|
xs: "h-[24px] px-[8px] text-[12px] font-normal leading-[20px]",
|
|
6741
6909
|
sm: "h-[28px] px-[12px] text-[14px] font-medium leading-[24px]"
|
|
@@ -8522,17 +8690,17 @@ var GNB_TOP_ICON_GAP = 8;
|
|
|
8522
8690
|
var GNB_TOP_ICON_SIZE = 24;
|
|
8523
8691
|
var GNB_FULL_LOGO_WIDTH_NO_LAUNCHER = GNB_FULL_LOGO_WIDTH + GNB_TOP_ICON_SIZE + GNB_TOP_ICON_GAP;
|
|
8524
8692
|
function findGnbRailValue(items, value) {
|
|
8525
|
-
if (items.some((
|
|
8693
|
+
if (items.some((item2) => item2.value === value)) return value;
|
|
8526
8694
|
return findGnbAncestors(items, value)[0];
|
|
8527
8695
|
}
|
|
8528
8696
|
function findGnbSiblingValues(items, value) {
|
|
8529
8697
|
const walk = (list) => {
|
|
8530
|
-
if (list.some((
|
|
8531
|
-
return list.filter((
|
|
8698
|
+
if (list.some((item2) => item2.value === value)) {
|
|
8699
|
+
return list.filter((item2) => item2.value !== value).map((item2) => item2.value);
|
|
8532
8700
|
}
|
|
8533
|
-
for (const
|
|
8534
|
-
if (
|
|
8535
|
-
const found = walk(
|
|
8701
|
+
for (const item2 of list) {
|
|
8702
|
+
if (item2.children) {
|
|
8703
|
+
const found = walk(item2.children);
|
|
8536
8704
|
if (found) return found;
|
|
8537
8705
|
}
|
|
8538
8706
|
}
|
|
@@ -8542,10 +8710,10 @@ function findGnbSiblingValues(items, value) {
|
|
|
8542
8710
|
}
|
|
8543
8711
|
function findGnbAncestors(items, value) {
|
|
8544
8712
|
const walk = (list, trail) => {
|
|
8545
|
-
for (const
|
|
8546
|
-
if (
|
|
8547
|
-
if (
|
|
8548
|
-
const found = walk(
|
|
8713
|
+
for (const item2 of list) {
|
|
8714
|
+
if (item2.value === value) return trail;
|
|
8715
|
+
if (item2.children) {
|
|
8716
|
+
const found = walk(item2.children, [...trail, item2.value]);
|
|
8549
8717
|
if (found) return found;
|
|
8550
8718
|
}
|
|
8551
8719
|
}
|
|
@@ -8555,20 +8723,20 @@ function findGnbAncestors(items, value) {
|
|
|
8555
8723
|
}
|
|
8556
8724
|
function findGnbDescendantBranchValues(items, value) {
|
|
8557
8725
|
const find = (list) => {
|
|
8558
|
-
for (const
|
|
8559
|
-
if (
|
|
8560
|
-
if (
|
|
8561
|
-
const found = find(
|
|
8726
|
+
for (const item2 of list) {
|
|
8727
|
+
if (item2.value === value) return item2;
|
|
8728
|
+
if (item2.children) {
|
|
8729
|
+
const found = find(item2.children);
|
|
8562
8730
|
if (found) return found;
|
|
8563
8731
|
}
|
|
8564
8732
|
}
|
|
8565
8733
|
return void 0;
|
|
8566
8734
|
};
|
|
8567
8735
|
const collect = (list, acc) => {
|
|
8568
|
-
for (const
|
|
8569
|
-
if (
|
|
8570
|
-
acc.push(
|
|
8571
|
-
collect(
|
|
8736
|
+
for (const item2 of list) {
|
|
8737
|
+
if (item2.children && item2.children.length > 0) {
|
|
8738
|
+
acc.push(item2.value);
|
|
8739
|
+
collect(item2.children, acc);
|
|
8572
8740
|
}
|
|
8573
8741
|
}
|
|
8574
8742
|
return acc;
|
|
@@ -8611,7 +8779,7 @@ var SGnb = /* @__PURE__ */ react.forwardRef(function SGnb2({
|
|
|
8611
8779
|
const type = typeProp ?? layout?.type ?? "box";
|
|
8612
8780
|
const folded = foldedProp ?? layout?.folded ?? false;
|
|
8613
8781
|
const useRail = useRailProp ?? layout?.useRail ?? false;
|
|
8614
|
-
const railHasLeaf = useRail && items.some((
|
|
8782
|
+
const railHasLeaf = useRail && items.some((item2) => !item2.children || item2.children.length === 0);
|
|
8615
8783
|
const header = railHasLeaf ? "full" : headerProp ?? layout?.header ?? "fix";
|
|
8616
8784
|
const H = GNB_HEADER[header];
|
|
8617
8785
|
const M = GNB_MENU[type];
|
|
@@ -8654,13 +8822,13 @@ var SGnb = /* @__PURE__ */ react.forwardRef(function SGnb2({
|
|
|
8654
8822
|
labelTipHideRef.current = setTimeout(() => setLabelTip(null), LABEL_TIP_HIDE_DELAY_MS);
|
|
8655
8823
|
};
|
|
8656
8824
|
react.useEffect(() => cancelLabelTipHide, []);
|
|
8657
|
-
const rowHoverProps = (
|
|
8825
|
+
const rowHoverProps = (item2) => ({
|
|
8658
8826
|
onMouseEnter: (event) => {
|
|
8659
|
-
setHoveredKey(
|
|
8660
|
-
showLabelTipIfTruncated(event.currentTarget,
|
|
8827
|
+
setHoveredKey(item2.value);
|
|
8828
|
+
showLabelTipIfTruncated(event.currentTarget, item2.label);
|
|
8661
8829
|
},
|
|
8662
8830
|
onMouseLeave: () => {
|
|
8663
|
-
setHoveredKey((prev) => prev ===
|
|
8831
|
+
setHoveredKey((prev) => prev === item2.value ? null : prev);
|
|
8664
8832
|
startLabelTipHide();
|
|
8665
8833
|
}
|
|
8666
8834
|
});
|
|
@@ -8686,7 +8854,7 @@ var SGnb = /* @__PURE__ */ react.forwardRef(function SGnb2({
|
|
|
8686
8854
|
}, [items, value]);
|
|
8687
8855
|
react.useEffect(() => {
|
|
8688
8856
|
setActiveRail(
|
|
8689
|
-
(prev) => prev !== void 0 && items.some((
|
|
8857
|
+
(prev) => prev !== void 0 && items.some((item2) => item2.value === prev) ? prev : items[0]?.value
|
|
8690
8858
|
);
|
|
8691
8859
|
}, [items]);
|
|
8692
8860
|
const toggleExpand = (key) => {
|
|
@@ -8703,33 +8871,33 @@ var SGnb = /* @__PURE__ */ react.forwardRef(function SGnb2({
|
|
|
8703
8871
|
return next;
|
|
8704
8872
|
});
|
|
8705
8873
|
};
|
|
8706
|
-
const handleItemClick = (
|
|
8707
|
-
if (
|
|
8708
|
-
if (
|
|
8709
|
-
toggleExpand(
|
|
8874
|
+
const handleItemClick = (item2) => {
|
|
8875
|
+
if (item2.disabled) return;
|
|
8876
|
+
if (item2.children && item2.children.length > 0) {
|
|
8877
|
+
toggleExpand(item2.value);
|
|
8710
8878
|
return;
|
|
8711
8879
|
}
|
|
8712
|
-
onValueChange?.(
|
|
8880
|
+
onValueChange?.(item2.value);
|
|
8713
8881
|
};
|
|
8714
|
-
const handleRailClick = (
|
|
8715
|
-
if (
|
|
8716
|
-
setActiveRail(
|
|
8717
|
-
onRailChange?.(
|
|
8718
|
-
if (!
|
|
8882
|
+
const handleRailClick = (item2) => {
|
|
8883
|
+
if (item2.disabled) return;
|
|
8884
|
+
setActiveRail(item2.value);
|
|
8885
|
+
onRailChange?.(item2.value);
|
|
8886
|
+
if (!item2.children || item2.children.length === 0) onValueChange?.(item2.value);
|
|
8719
8887
|
};
|
|
8720
8888
|
const handleFoldToggle = () => {
|
|
8721
8889
|
const next = !folded;
|
|
8722
8890
|
onFoldChange?.(next);
|
|
8723
8891
|
if (foldedProp === void 0) layout?.setFolded(next);
|
|
8724
8892
|
};
|
|
8725
|
-
const renderRailItem = (
|
|
8726
|
-
const isActive =
|
|
8727
|
-
const isHovered = hoveredKey ===
|
|
8893
|
+
const renderRailItem = (item2) => {
|
|
8894
|
+
const isActive = item2.value === activeRail;
|
|
8895
|
+
const isHovered = hoveredKey === item2.value && !item2.disabled;
|
|
8728
8896
|
return /* @__PURE__ */ jsxRuntime.jsx("li", { children: /* @__PURE__ */ jsxRuntime.jsxs(
|
|
8729
8897
|
"button",
|
|
8730
8898
|
{
|
|
8731
8899
|
type: "button",
|
|
8732
|
-
disabled:
|
|
8900
|
+
disabled: item2.disabled,
|
|
8733
8901
|
"aria-current": isActive ? "true" : void 0,
|
|
8734
8902
|
className: "box-border flex select-none flex-col items-center border-none bg-transparent transition-colors duration-150",
|
|
8735
8903
|
style: {
|
|
@@ -8744,31 +8912,31 @@ var SGnb = /* @__PURE__ */ react.forwardRef(function SGnb2({
|
|
|
8744
8912
|
fontSize: GNB_RAIL.itemFontSize,
|
|
8745
8913
|
lineHeight: `${GNB_RAIL.itemLineHeight}px`,
|
|
8746
8914
|
fontWeight: isActive ? GNB_RAIL.itemFontWeightSelected : GNB_RAIL.itemFontWeight,
|
|
8747
|
-
opacity:
|
|
8748
|
-
cursor:
|
|
8915
|
+
opacity: item2.disabled ? 0.4 : 1,
|
|
8916
|
+
cursor: item2.disabled ? "not-allowed" : "pointer"
|
|
8749
8917
|
},
|
|
8750
|
-
onClick: () => handleRailClick(
|
|
8751
|
-
...rowHoverProps(
|
|
8918
|
+
onClick: () => handleRailClick(item2),
|
|
8919
|
+
...rowHoverProps(item2),
|
|
8752
8920
|
children: [
|
|
8753
|
-
|
|
8921
|
+
item2.icon && /* @__PURE__ */ jsxRuntime.jsx(SIcon, { name: item2.icon, size: GNB_RAIL.itemIcon, className: "shrink-0" }),
|
|
8754
8922
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
8755
8923
|
"span",
|
|
8756
8924
|
{
|
|
8757
8925
|
"data-gnb-label": true,
|
|
8758
8926
|
className: "w-full overflow-hidden text-ellipsis whitespace-nowrap text-center",
|
|
8759
|
-
children:
|
|
8927
|
+
children: item2.label
|
|
8760
8928
|
}
|
|
8761
8929
|
)
|
|
8762
8930
|
]
|
|
8763
8931
|
}
|
|
8764
|
-
) },
|
|
8932
|
+
) }, item2.value);
|
|
8765
8933
|
};
|
|
8766
|
-
const renderItem = (
|
|
8767
|
-
const hasChildren = !!(
|
|
8768
|
-
const isSelected = !hasChildren &&
|
|
8769
|
-
const isExpanded = expandedKeys.has(
|
|
8770
|
-
const isHovered = hoveredKey ===
|
|
8771
|
-
const iconBranch = depth === 1 ? !!
|
|
8934
|
+
const renderItem = (item2, depth, branchHasIcon = false) => {
|
|
8935
|
+
const hasChildren = !!(item2.children && item2.children.length > 0);
|
|
8936
|
+
const isSelected = !hasChildren && item2.value === value;
|
|
8937
|
+
const isExpanded = expandedKeys.has(item2.value);
|
|
8938
|
+
const isHovered = hoveredKey === item2.value && !item2.disabled;
|
|
8939
|
+
const iconBranch = depth === 1 ? !!item2.icon : branchHasIcon;
|
|
8772
8940
|
const itemStyle = {
|
|
8773
8941
|
gap: M.itemGap,
|
|
8774
8942
|
paddingTop: M.itemPaddingY,
|
|
@@ -8785,8 +8953,8 @@ var SGnb = /* @__PURE__ */ react.forwardRef(function SGnb2({
|
|
|
8785
8953
|
fontSize: depth === 1 ? M.depth1FontSize : M.itemFontSize,
|
|
8786
8954
|
lineHeight: `${depth === 1 ? M.depth1LineHeight : M.itemLineHeight}px`,
|
|
8787
8955
|
fontWeight: depth === 1 ? M.depth1FontWeight : isSelected ? M.itemFontWeightSelected : M.itemFontWeight,
|
|
8788
|
-
opacity:
|
|
8789
|
-
cursor:
|
|
8956
|
+
opacity: item2.disabled ? 0.4 : 1,
|
|
8957
|
+
cursor: item2.disabled ? "not-allowed" : "pointer"
|
|
8790
8958
|
};
|
|
8791
8959
|
return (
|
|
8792
8960
|
// li 를 flex-col 로 둬야 버튼이 좌우 마진만큼 안쪽으로 들어가고,
|
|
@@ -8796,18 +8964,18 @@ var SGnb = /* @__PURE__ */ react.forwardRef(function SGnb2({
|
|
|
8796
8964
|
"button",
|
|
8797
8965
|
{
|
|
8798
8966
|
type: "button",
|
|
8799
|
-
disabled:
|
|
8967
|
+
disabled: item2.disabled,
|
|
8800
8968
|
"aria-expanded": hasChildren ? isExpanded : void 0,
|
|
8801
8969
|
"aria-current": isSelected ? "page" : void 0,
|
|
8802
8970
|
className: "box-border flex select-none items-center border-none bg-transparent text-left transition-colors duration-150",
|
|
8803
8971
|
style: itemStyle,
|
|
8804
|
-
onClick: () => handleItemClick(
|
|
8805
|
-
...rowHoverProps(
|
|
8972
|
+
onClick: () => handleItemClick(item2),
|
|
8973
|
+
...rowHoverProps(item2),
|
|
8806
8974
|
children: [
|
|
8807
|
-
depth === 1 &&
|
|
8975
|
+
depth === 1 && item2.icon && /* @__PURE__ */ jsxRuntime.jsx(
|
|
8808
8976
|
SIcon,
|
|
8809
8977
|
{
|
|
8810
|
-
name:
|
|
8978
|
+
name: item2.icon,
|
|
8811
8979
|
size: M.depth1Icon,
|
|
8812
8980
|
color: isSelected ? C.itemColorActive : C.itemIcon,
|
|
8813
8981
|
className: "shrink-0"
|
|
@@ -8827,17 +8995,17 @@ var SGnb = /* @__PURE__ */ react.forwardRef(function SGnb2({
|
|
|
8827
8995
|
{
|
|
8828
8996
|
"data-gnb-label": true,
|
|
8829
8997
|
className: "min-w-0 flex-1 overflow-hidden text-ellipsis whitespace-nowrap",
|
|
8830
|
-
children:
|
|
8998
|
+
children: item2.label
|
|
8831
8999
|
}
|
|
8832
9000
|
)
|
|
8833
9001
|
] }),
|
|
8834
|
-
|
|
9002
|
+
item2.tag !== void 0 && item2.tag !== "" && /* @__PURE__ */ jsxRuntime.jsx(
|
|
8835
9003
|
STag,
|
|
8836
9004
|
{
|
|
8837
9005
|
shape: "square",
|
|
8838
9006
|
size: "xs",
|
|
8839
|
-
color:
|
|
8840
|
-
label:
|
|
9007
|
+
color: item2.tagColor ?? "blue",
|
|
9008
|
+
label: item2.tag,
|
|
8841
9009
|
className: "shrink-0"
|
|
8842
9010
|
}
|
|
8843
9011
|
),
|
|
@@ -8870,16 +9038,16 @@ var SGnb = /* @__PURE__ */ react.forwardRef(function SGnb2({
|
|
|
8870
9038
|
visibility: isExpanded ? "visible" : "hidden",
|
|
8871
9039
|
transition: `visibility 0s linear ${isExpanded ? "0s" : `${GNB_EXPAND_MS}ms`}`
|
|
8872
9040
|
},
|
|
8873
|
-
children:
|
|
9041
|
+
children: item2.children.map((child) => renderItem(child, depth + 1, iconBranch))
|
|
8874
9042
|
}
|
|
8875
9043
|
)
|
|
8876
9044
|
}
|
|
8877
9045
|
)
|
|
8878
|
-
] },
|
|
9046
|
+
] }, item2.value)
|
|
8879
9047
|
);
|
|
8880
9048
|
};
|
|
8881
9049
|
const railItems = useRail ? items : [];
|
|
8882
|
-
const menuItems = useRail ? items.find((
|
|
9050
|
+
const menuItems = useRail ? items.find((item2) => item2.value === activeRail)?.children ?? [] : items;
|
|
8883
9051
|
const showMenu = !useRail || menuItems.length > 0;
|
|
8884
9052
|
const [uncontrolledMenuWidth, setUncontrolledMenuWidth] = react.useState(
|
|
8885
9053
|
() => defaultMenuWidth ?? GNB_MENU_WIDTH
|
|
@@ -9186,7 +9354,7 @@ var SGnb = /* @__PURE__ */ react.forwardRef(function SGnb2({
|
|
|
9186
9354
|
paddingTop: M.bodyPaddingY,
|
|
9187
9355
|
paddingBottom: M.bodyPaddingY
|
|
9188
9356
|
},
|
|
9189
|
-
children: /* @__PURE__ */ jsxRuntime.jsx("ul", { className: "m-0 flex list-none flex-col p-0", children: menuItems.map((
|
|
9357
|
+
children: /* @__PURE__ */ jsxRuntime.jsx("ul", { className: "m-0 flex list-none flex-col p-0", children: menuItems.map((item2) => renderItem(item2, 1)) })
|
|
9190
9358
|
}
|
|
9191
9359
|
),
|
|
9192
9360
|
menuFooter && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "shrink-0", children: menuFooter })
|
|
@@ -9837,19 +10005,19 @@ var STEPPER_VERTICAL_COLORS = {
|
|
|
9837
10005
|
errorBadge: "#FB4444"
|
|
9838
10006
|
};
|
|
9839
10007
|
var ERROR_TOOLTIP_MESSAGE = "\uD655\uC778\uC774 \uD544\uC694\uD55C \uD56D\uBAA9\uC774 \uC788\uC2B5\uB2C8\uB2E4.";
|
|
9840
|
-
function getItemValue(
|
|
9841
|
-
return
|
|
10008
|
+
function getItemValue(item2, index) {
|
|
10009
|
+
return item2.value ?? String(index + 1);
|
|
9842
10010
|
}
|
|
9843
10011
|
function groupAdjacentItems(items) {
|
|
9844
10012
|
return items.reduce(
|
|
9845
|
-
(groups,
|
|
9846
|
-
const currentGroup =
|
|
10013
|
+
(groups, item2, index) => {
|
|
10014
|
+
const currentGroup = item2.group;
|
|
9847
10015
|
const previous = groups[groups.length - 1];
|
|
9848
10016
|
if (currentGroup && previous?.group === currentGroup) {
|
|
9849
|
-
previous.items.push(
|
|
10017
|
+
previous.items.push(item2);
|
|
9850
10018
|
return groups;
|
|
9851
10019
|
}
|
|
9852
|
-
groups.push({ group: currentGroup, startIndex: index, items: [
|
|
10020
|
+
groups.push({ group: currentGroup, startIndex: index, items: [item2] });
|
|
9853
10021
|
return groups;
|
|
9854
10022
|
},
|
|
9855
10023
|
[]
|
|
@@ -9879,15 +10047,15 @@ var SStepper = /* @__PURE__ */ react.forwardRef(function SStepper2({
|
|
|
9879
10047
|
const verticalItemRefs = react.useRef([]);
|
|
9880
10048
|
const activeIndex = Math.max(
|
|
9881
10049
|
0,
|
|
9882
|
-
items.findIndex((
|
|
10050
|
+
items.findIndex((item2, index) => getItemValue(item2, index) === value)
|
|
9883
10051
|
);
|
|
9884
10052
|
const lastCompletedIndex = items.reduce(
|
|
9885
|
-
(lastIndex,
|
|
10053
|
+
(lastIndex, item2, index) => item2.completed === true ? index : lastIndex,
|
|
9886
10054
|
-1
|
|
9887
10055
|
);
|
|
9888
10056
|
const resolvedClickableIndex = lastCompletedIndex + 1;
|
|
9889
10057
|
const [visitedMaxIndex, setVisitedMaxIndex] = react.useState(activeIndex);
|
|
9890
|
-
const firstErrorIndex = items.findIndex((
|
|
10058
|
+
const firstErrorIndex = items.findIndex((item2) => item2.error === true);
|
|
9891
10059
|
react.useImperativeHandle(
|
|
9892
10060
|
ref,
|
|
9893
10061
|
() => ({
|
|
@@ -9915,18 +10083,18 @@ var SStepper = /* @__PURE__ */ react.forwardRef(function SStepper2({
|
|
|
9915
10083
|
transform: `translateY(${activeItem.offsetTop}px)`
|
|
9916
10084
|
});
|
|
9917
10085
|
}, [activeIndex, vertical, items]);
|
|
9918
|
-
const getState = (
|
|
10086
|
+
const getState = (item2, index) => {
|
|
9919
10087
|
if (index === activeIndex) return "active";
|
|
9920
|
-
if (
|
|
10088
|
+
if (item2.completed != null) return item2.completed ? "completed" : "default";
|
|
9921
10089
|
return "default";
|
|
9922
10090
|
};
|
|
9923
|
-
const emitValueChange = (
|
|
9924
|
-
onValueChange?.(getItemValue(
|
|
10091
|
+
const emitValueChange = (item2, index) => {
|
|
10092
|
+
onValueChange?.(getItemValue(item2, index), item2, index);
|
|
9925
10093
|
};
|
|
9926
10094
|
const isWithinClickableIndex = (index) => index <= resolvedClickableIndex;
|
|
9927
|
-
const renderStepContent = (
|
|
10095
|
+
const renderStepContent = (item2, index, options = {}) => {
|
|
9928
10096
|
const { isVertical = false, roleListItem = true, hovered = false } = options;
|
|
9929
|
-
const state2 = getState(
|
|
10097
|
+
const state2 = getState(item2, index);
|
|
9930
10098
|
const isHorizontalCompleted = !isVertical && state2 === "completed";
|
|
9931
10099
|
const isVerticalCompleted = isVertical && state2 === "completed";
|
|
9932
10100
|
const isVerticalLastActive = isVertical && state2 === "default" && index === visitedMaxIndex;
|
|
@@ -10001,12 +10169,12 @@ var SStepper = /* @__PURE__ */ react.forwardRef(function SStepper2({
|
|
|
10001
10169
|
children: showsCheckIcon ? /* @__PURE__ */ jsxRuntime.jsx(SIcon, { name: "check", size: STEPPER_LAYOUT.sequenceIcon, color: "currentColor" }) : index + 1
|
|
10002
10170
|
}
|
|
10003
10171
|
),
|
|
10004
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { children:
|
|
10172
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { children: item2.label })
|
|
10005
10173
|
]
|
|
10006
10174
|
}
|
|
10007
10175
|
);
|
|
10008
10176
|
};
|
|
10009
|
-
const renderClickableStepContent = (
|
|
10177
|
+
const renderClickableStepContent = (item2, index, isVertical = false) => {
|
|
10010
10178
|
const isDisabled = !isWithinClickableIndex(index);
|
|
10011
10179
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
10012
10180
|
"button",
|
|
@@ -10019,9 +10187,9 @@ var SStepper = /* @__PURE__ */ react.forwardRef(function SStepper2({
|
|
|
10019
10187
|
),
|
|
10020
10188
|
style: { font: "inherit", color: "inherit" },
|
|
10021
10189
|
onClick: () => {
|
|
10022
|
-
if (!isDisabled) emitValueChange(
|
|
10190
|
+
if (!isDisabled) emitValueChange(item2, index);
|
|
10023
10191
|
},
|
|
10024
|
-
children: renderStepContent(
|
|
10192
|
+
children: renderStepContent(item2, index, { isVertical, roleListItem: false })
|
|
10025
10193
|
}
|
|
10026
10194
|
);
|
|
10027
10195
|
};
|
|
@@ -10080,10 +10248,10 @@ var SStepper = /* @__PURE__ */ react.forwardRef(function SStepper2({
|
|
|
10080
10248
|
children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "whitespace-nowrap", children: group.group })
|
|
10081
10249
|
}
|
|
10082
10250
|
),
|
|
10083
|
-
group.items.map((
|
|
10251
|
+
group.items.map((item2, itemIndex) => {
|
|
10084
10252
|
const index = group.startIndex + itemIndex;
|
|
10085
|
-
const state2 = getState(
|
|
10086
|
-
const itemValue = getItemValue(
|
|
10253
|
+
const state2 = getState(item2, index);
|
|
10254
|
+
const itemValue = getItemValue(item2, index);
|
|
10087
10255
|
const canClickItem = isClickable && isWithinClickableIndex(index);
|
|
10088
10256
|
const isDisabled = !canClickItem;
|
|
10089
10257
|
const isHovered = hoveredIndex === index && canClickItem && state2 !== "active";
|
|
@@ -10101,12 +10269,12 @@ var SStepper = /* @__PURE__ */ react.forwardRef(function SStepper2({
|
|
|
10101
10269
|
const handleMouseLeave = () => {
|
|
10102
10270
|
setHoveredIndex((current) => current === index ? null : current);
|
|
10103
10271
|
};
|
|
10104
|
-
const stepContent = renderStepContent(
|
|
10272
|
+
const stepContent = renderStepContent(item2, index, {
|
|
10105
10273
|
isVertical: true,
|
|
10106
10274
|
roleListItem: false,
|
|
10107
10275
|
hovered: isHovered
|
|
10108
10276
|
});
|
|
10109
|
-
const errorBadge =
|
|
10277
|
+
const errorBadge = item2.error ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
10110
10278
|
"span",
|
|
10111
10279
|
{
|
|
10112
10280
|
"aria-hidden": "true",
|
|
@@ -10121,7 +10289,7 @@ var SStepper = /* @__PURE__ */ react.forwardRef(function SStepper2({
|
|
|
10121
10289
|
) : null;
|
|
10122
10290
|
const isTooltipHovered = tooltipHoverValue === itemValue;
|
|
10123
10291
|
const isCustomTooltipOpen = customTooltipOpen && index === firstErrorIndex;
|
|
10124
|
-
const showTooltip =
|
|
10292
|
+
const showTooltip = item2.error === true && (isTooltipHovered || isCustomTooltipOpen);
|
|
10125
10293
|
const handleTooltipMouseEnter = () => setTooltipHoverValue(itemValue);
|
|
10126
10294
|
const handleTooltipMouseLeave = () => {
|
|
10127
10295
|
setTooltipHoverValue((current) => current === itemValue ? null : current);
|
|
@@ -10145,7 +10313,7 @@ var SStepper = /* @__PURE__ */ react.forwardRef(function SStepper2({
|
|
|
10145
10313
|
onMouseEnter: handleTooltipMouseEnter,
|
|
10146
10314
|
onMouseLeave: handleTooltipMouseLeave,
|
|
10147
10315
|
onClick: isClickable ? () => {
|
|
10148
|
-
if (!isDisabled) emitValueChange(
|
|
10316
|
+
if (!isDisabled) emitValueChange(item2, index);
|
|
10149
10317
|
} : void 0,
|
|
10150
10318
|
children: [
|
|
10151
10319
|
stepContent,
|
|
@@ -10177,13 +10345,13 @@ var SStepper = /* @__PURE__ */ react.forwardRef(function SStepper2({
|
|
|
10177
10345
|
{
|
|
10178
10346
|
type: "button",
|
|
10179
10347
|
disabled: isDisabled,
|
|
10180
|
-
"aria-label":
|
|
10348
|
+
"aria-label": item2.label,
|
|
10181
10349
|
className: cn(
|
|
10182
10350
|
"absolute inset-0 z-[2] m-0 border-0 bg-transparent p-0 text-left outline-none focus-visible:outline focus-visible:outline-2 focus-visible:outline-(--sys-color-border-accent)",
|
|
10183
10351
|
isDisabled ? "cursor-default" : "cursor-pointer"
|
|
10184
10352
|
),
|
|
10185
10353
|
onClick: () => {
|
|
10186
|
-
if (!isDisabled) emitValueChange(
|
|
10354
|
+
if (!isDisabled) emitValueChange(item2, index);
|
|
10187
10355
|
}
|
|
10188
10356
|
}
|
|
10189
10357
|
),
|
|
@@ -10234,9 +10402,9 @@ var SStepper = /* @__PURE__ */ react.forwardRef(function SStepper2({
|
|
|
10234
10402
|
lineHeight: config.lineHeight,
|
|
10235
10403
|
...style
|
|
10236
10404
|
},
|
|
10237
|
-
children: items.map((
|
|
10238
|
-
const state2 = getState(
|
|
10239
|
-
const content = isClickable ? /* @__PURE__ */ jsxRuntime.jsx("span", { role: "listitem", "aria-current": state2 === "active" ? "step" : void 0, children: renderClickableStepContent(
|
|
10405
|
+
children: items.map((item2, index) => {
|
|
10406
|
+
const state2 = getState(item2, index);
|
|
10407
|
+
const content = isClickable ? /* @__PURE__ */ jsxRuntime.jsx("span", { role: "listitem", "aria-current": state2 === "active" ? "step" : void 0, children: renderClickableStepContent(item2, index) }) : renderStepContent(item2, index);
|
|
10240
10408
|
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
10241
10409
|
"span",
|
|
10242
10410
|
{
|
|
@@ -10270,7 +10438,7 @@ var SStepper = /* @__PURE__ */ react.forwardRef(function SStepper2({
|
|
|
10270
10438
|
)
|
|
10271
10439
|
]
|
|
10272
10440
|
},
|
|
10273
|
-
getItemValue(
|
|
10441
|
+
getItemValue(item2, index)
|
|
10274
10442
|
);
|
|
10275
10443
|
})
|
|
10276
10444
|
}
|
|
@@ -10813,7 +10981,7 @@ var SSelectImpl = /* @__PURE__ */ react.forwardRef(function SSelect({
|
|
|
10813
10981
|
const selectedAnchorIndex = react.useMemo(() => {
|
|
10814
10982
|
if (selected.length === 0) return -1;
|
|
10815
10983
|
const selectedSet = new Set(selected);
|
|
10816
|
-
return navigableItems.findIndex((
|
|
10984
|
+
return navigableItems.findIndex((item2) => item2.value != null && selectedSet.has(item2.value));
|
|
10817
10985
|
}, [navigableItems, selected]);
|
|
10818
10986
|
selectedAnchorRef.current = selectedAnchorIndex;
|
|
10819
10987
|
const triggerText = (() => {
|
|
@@ -11106,7 +11274,7 @@ var SSelectImpl = /* @__PURE__ */ react.forwardRef(function SSelect({
|
|
|
11106
11274
|
setFocusedIndex(-1);
|
|
11107
11275
|
return;
|
|
11108
11276
|
}
|
|
11109
|
-
const index = navigableItems.findIndex((
|
|
11277
|
+
const index = navigableItems.findIndex((item2) => item2.key === key);
|
|
11110
11278
|
if (index >= 0) setFocusedIndex(index);
|
|
11111
11279
|
}
|
|
11112
11280
|
}
|
|
@@ -11338,6 +11506,7 @@ var colWidthFromDef = (c) => {
|
|
|
11338
11506
|
};
|
|
11339
11507
|
var STable = /* @__PURE__ */ react.forwardRef(function STable2({
|
|
11340
11508
|
columns = [],
|
|
11509
|
+
headerGroups,
|
|
11341
11510
|
rows = [],
|
|
11342
11511
|
rowKey = "id",
|
|
11343
11512
|
selectable = false,
|
|
@@ -11385,6 +11554,49 @@ var STable = /* @__PURE__ */ react.forwardRef(function STable2({
|
|
|
11385
11554
|
onDenseChange?.(next);
|
|
11386
11555
|
};
|
|
11387
11556
|
const visibleCols = react.useMemo(() => columns.filter((c) => c.visible !== false), [columns]);
|
|
11557
|
+
const headerGroupInfo = react.useMemo(() => {
|
|
11558
|
+
if (!headerGroups || headerGroups.length === 0) return null;
|
|
11559
|
+
const indexByName = new Map(visibleCols.map((col, index) => [col.name, index]));
|
|
11560
|
+
const covered = /* @__PURE__ */ new Set();
|
|
11561
|
+
let previousLast = -1;
|
|
11562
|
+
const cells = headerGroups.map((group) => {
|
|
11563
|
+
if (group.columnNames.length === 0) {
|
|
11564
|
+
throw new Error("[STable] headerGroups\uC758 columnNames\uB294 \uBE44\uC5B4 \uC788\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.");
|
|
11565
|
+
}
|
|
11566
|
+
const indexes = group.columnNames.map((name) => {
|
|
11567
|
+
const index = indexByName.get(name);
|
|
11568
|
+
if (index == null) {
|
|
11569
|
+
throw new Error(`[STable] headerGroups\uC5D0 \uC874\uC7AC\uD558\uC9C0 \uC54A\uB294 \uCEEC\uB7FC\uC774 \uC9C0\uC815\uB418\uC5C8\uC2B5\uB2C8\uB2E4: ${name}`);
|
|
11570
|
+
}
|
|
11571
|
+
if (covered.has(name)) {
|
|
11572
|
+
throw new Error(`[STable] headerGroups\uC5D0\uC11C \uCEEC\uB7FC\uC774 \uC911\uBCF5 \uC9C0\uC815\uB418\uC5C8\uC2B5\uB2C8\uB2E4: ${name}`);
|
|
11573
|
+
}
|
|
11574
|
+
covered.add(name);
|
|
11575
|
+
return index;
|
|
11576
|
+
});
|
|
11577
|
+
const first = indexes[0];
|
|
11578
|
+
const last = indexes[indexes.length - 1];
|
|
11579
|
+
if (last - first + 1 !== indexes.length || indexes.some((index, i) => index !== first + i)) {
|
|
11580
|
+
throw new Error(
|
|
11581
|
+
"[STable] headerGroups\uC758 columnNames\uB294 \uC778\uC811\uD55C \uCEEC\uB7FC \uC21C\uC11C\uB85C \uC9C0\uC815\uD574\uC57C \uD569\uB2C8\uB2E4."
|
|
11582
|
+
);
|
|
11583
|
+
}
|
|
11584
|
+
if (first <= previousLast) {
|
|
11585
|
+
throw new Error("[STable] headerGroups\uB294 \uCEEC\uB7FC \uC21C\uC11C\uB300\uB85C \uC9C0\uC815\uD574\uC57C \uD569\uB2C8\uB2E4.");
|
|
11586
|
+
}
|
|
11587
|
+
previousLast = last;
|
|
11588
|
+
return { ...group, firstIndex: first, colSpan: indexes.length };
|
|
11589
|
+
});
|
|
11590
|
+
if (covered.size !== visibleCols.length) {
|
|
11591
|
+
throw new Error("[STable] headerGroups\uC758 columnNames\uAC00 \uBAA8\uB4E0 visible \uCEEC\uB7FC\uC744 \uD3EC\uD568\uD574\uC57C \uD569\uB2C8\uB2E4.");
|
|
11592
|
+
}
|
|
11593
|
+
return {
|
|
11594
|
+
cells,
|
|
11595
|
+
rowSpanNames: new Set(
|
|
11596
|
+
cells.filter((cell) => cell.rowSpan === 2).flatMap((cell) => cell.columnNames)
|
|
11597
|
+
)
|
|
11598
|
+
};
|
|
11599
|
+
}, [headerGroups, visibleCols]);
|
|
11388
11600
|
const stickyLeft = stickyColumn?.left ?? 0;
|
|
11389
11601
|
const stickyRight = stickyColumn?.right ?? 0;
|
|
11390
11602
|
const effectiveRowHeight = rowHeight ?? (innerDense ? DENSE_ROW_HEIGHT : DEFAULT_ROW_HEIGHT);
|
|
@@ -11647,6 +11859,35 @@ var STable = /* @__PURE__ */ react.forwardRef(function STable2({
|
|
|
11647
11859
|
isRightEdge && scrolledRight && "shadow-[-5px_0_8px_0_rgba(34,34,34,0.1)]"
|
|
11648
11860
|
);
|
|
11649
11861
|
};
|
|
11862
|
+
const headerResizeHitArea = (i, key) => {
|
|
11863
|
+
const col = visibleCols[i];
|
|
11864
|
+
if (!headerGroupInfo || !resizable || !col || col.autoWidth || i >= visibleCols.length - 1) {
|
|
11865
|
+
return null;
|
|
11866
|
+
}
|
|
11867
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
11868
|
+
"span",
|
|
11869
|
+
{
|
|
11870
|
+
onMouseDown: (e) => startResize(i, e),
|
|
11871
|
+
className: "absolute inset-y-0 right-0 z-[5] w-[9px] cursor-col-resize",
|
|
11872
|
+
"aria-hidden": true
|
|
11873
|
+
},
|
|
11874
|
+
key
|
|
11875
|
+
);
|
|
11876
|
+
};
|
|
11877
|
+
const headerResizer = (i, key) => {
|
|
11878
|
+
const col = visibleCols[i];
|
|
11879
|
+
if (!resizable || !col || col.autoWidth || i >= visibleCols.length - 1) return null;
|
|
11880
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
11881
|
+
"span",
|
|
11882
|
+
{
|
|
11883
|
+
onMouseDown: (e) => startResize(i, e),
|
|
11884
|
+
className: "absolute right-0 top-1/2 z-[5] flex h-[16px] w-[9px] -translate-y-1/2 cursor-col-resize items-center justify-end",
|
|
11885
|
+
"aria-hidden": true,
|
|
11886
|
+
children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "h-full w-[4px] border-x border-solid border-[color:var(--cmp-table-header-resizingBar-color)]" })
|
|
11887
|
+
},
|
|
11888
|
+
key
|
|
11889
|
+
);
|
|
11890
|
+
};
|
|
11650
11891
|
const bodyScrollClass = cn(
|
|
11651
11892
|
"min-h-0 flex-1 overflow-auto border-t border-solid border-[color:var(--cmp-table-border-color)]",
|
|
11652
11893
|
SCROLLBAR_CLASS,
|
|
@@ -11711,145 +11952,179 @@ var STable = /* @__PURE__ */ react.forwardRef(function STable2({
|
|
|
11711
11952
|
style: { fontSize: 12 },
|
|
11712
11953
|
children: [
|
|
11713
11954
|
colgroup,
|
|
11714
|
-
/* @__PURE__ */ jsxRuntime.
|
|
11715
|
-
|
|
11716
|
-
|
|
11717
|
-
|
|
11718
|
-
|
|
11719
|
-
|
|
11720
|
-
|
|
11721
|
-
|
|
11722
|
-
|
|
11723
|
-
|
|
11724
|
-
|
|
11725
|
-
|
|
11726
|
-
|
|
11727
|
-
|
|
11955
|
+
/* @__PURE__ */ jsxRuntime.jsxs("thead", { className: cn(isNoData && "opacity-40"), children: [
|
|
11956
|
+
headerGroupInfo && /* @__PURE__ */ jsxRuntime.jsxs("tr", { className: "h-[var(--cmp-table-header-height)] bg-[var(--cmp-table-header-bg)]", children: [
|
|
11957
|
+
selectable && /* @__PURE__ */ jsxRuntime.jsx(
|
|
11958
|
+
"th",
|
|
11959
|
+
{
|
|
11960
|
+
rowSpan: 2,
|
|
11961
|
+
className: cn(
|
|
11962
|
+
"sticky left-0 z-[7] bg-[var(--cmp-table-header-bg)] text-center align-middle",
|
|
11963
|
+
stickyLeft === 0 && scrolledLeft && "shadow-[5px_0_8px_0_rgba(34,34,34,0.1)]"
|
|
11964
|
+
),
|
|
11965
|
+
style: {
|
|
11966
|
+
width: SELECTABLE_COLUMN_WIDTH,
|
|
11967
|
+
minWidth: SELECTABLE_COLUMN_WIDTH,
|
|
11968
|
+
maxWidth: SELECTABLE_COLUMN_WIDTH
|
|
11969
|
+
},
|
|
11970
|
+
children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center justify-center", children: /* @__PURE__ */ jsxRuntime.jsx(SCheckbox, { value: headerCheck, onValueChange: toggleAll }) })
|
|
11971
|
+
}
|
|
11972
|
+
),
|
|
11973
|
+
headerGroupInfo.cells.map((group) => /* @__PURE__ */ jsxRuntime.jsxs(
|
|
11974
|
+
"th",
|
|
11975
|
+
{
|
|
11976
|
+
colSpan: group.colSpan,
|
|
11977
|
+
rowSpan: group.rowSpan,
|
|
11978
|
+
className: cn(
|
|
11979
|
+
"relative border-b border-r border-solid border-[color:var(--cmp-table-border-color)] bg-[var(--cmp-table-header-bg)] px-[16px] text-[12px] font-medium leading-[20px] text-[color:var(--sys-color-fg-primary)]",
|
|
11980
|
+
group.firstIndex + group.colSpan === visibleCols.length && "border-r-0",
|
|
11981
|
+
group.rowSpan === 2 && "border-b-0",
|
|
11982
|
+
group.className
|
|
11983
|
+
),
|
|
11984
|
+
style: { textAlign: group.align ?? "left", ...group.style },
|
|
11985
|
+
children: [
|
|
11986
|
+
group.render ? group.render() : group.label,
|
|
11987
|
+
group.rowSpan === 2 && group.colSpan === 1 ? headerResizeHitArea(
|
|
11988
|
+
group.firstIndex,
|
|
11989
|
+
`group-resizer-${group.columnNames[0]}`
|
|
11990
|
+
) : null
|
|
11991
|
+
]
|
|
11728
11992
|
},
|
|
11729
|
-
|
|
11730
|
-
|
|
11731
|
-
|
|
11732
|
-
|
|
11733
|
-
|
|
11734
|
-
"aria-hidden": true,
|
|
11735
|
-
className: "pointer-events-none absolute right-0 top-1/2 h-[16px] w-px -translate-y-1/2 bg-[var(--cmp-table-header-resizingBar-color)]"
|
|
11736
|
-
}
|
|
11737
|
-
)
|
|
11738
|
-
]
|
|
11739
|
-
}
|
|
11740
|
-
),
|
|
11741
|
-
visibleCols.map((col, i) => {
|
|
11742
|
-
const isSortable = !!col.sortable && !col.renderHeader;
|
|
11743
|
-
const sortDir = isSortable && sort?.name === col.name ? sort.dir : void 0;
|
|
11744
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
11993
|
+
group.columnNames.join("|")
|
|
11994
|
+
))
|
|
11995
|
+
] }),
|
|
11996
|
+
/* @__PURE__ */ jsxRuntime.jsxs("tr", { className: "h-[var(--cmp-table-header-height)] bg-[var(--cmp-table-header-bg)]", children: [
|
|
11997
|
+
selectable && !headerGroupInfo && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
11745
11998
|
"th",
|
|
11746
11999
|
{
|
|
11747
12000
|
className: cn(
|
|
11748
|
-
//
|
|
11749
|
-
//
|
|
11750
|
-
|
|
11751
|
-
|
|
11752
|
-
// 세로 가운데도 어긋난다. 글자 줄높이는 아래 th__content 가 다시 준다.
|
|
11753
|
-
"relative bg-[var(--cmp-table-header-bg)] px-[16px] text-[12px] font-medium leading-[0] text-[color:var(--sys-color-fg-primary)]",
|
|
11754
|
-
stickyInfo(i).isSticky && "z-[6]",
|
|
11755
|
-
stickyShadowClass(i),
|
|
11756
|
-
col.thClass
|
|
12001
|
+
// 원본 .th--selected: 48px 고정폭, 항상 left sticky, 체크박스 중앙정렬
|
|
12002
|
+
// 하단 border는 헤더 래퍼가 연속으로 그리므로 셀에는 두지 않는다.
|
|
12003
|
+
"sticky left-0 z-[7] bg-[var(--cmp-table-header-bg)] text-center align-middle",
|
|
12004
|
+
stickyLeft === 0 && scrolledLeft && "shadow-[5px_0_8px_0_rgba(34,34,34,0.1)]"
|
|
11757
12005
|
),
|
|
11758
|
-
style: {
|
|
11759
|
-
|
|
12006
|
+
style: {
|
|
12007
|
+
width: SELECTABLE_COLUMN_WIDTH,
|
|
12008
|
+
minWidth: SELECTABLE_COLUMN_WIDTH,
|
|
12009
|
+
maxWidth: SELECTABLE_COLUMN_WIDTH
|
|
12010
|
+
},
|
|
11760
12011
|
children: [
|
|
12012
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center justify-center", children: /* @__PURE__ */ jsxRuntime.jsx(SCheckbox, { value: headerCheck, onValueChange: toggleAll }) }),
|
|
11761
12013
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
11762
12014
|
"span",
|
|
11763
12015
|
{
|
|
11764
|
-
className: cn(
|
|
11765
|
-
// 원본 th__content: align에 따라 justify-content 적용 (th도 정렬 반영)
|
|
11766
|
-
// th 가 leading-[0] 이므로 글자 줄높이는 여기서 준다 (truncate 가
|
|
11767
|
-
// overflow-hidden 이라 줄높이가 0이면 라벨이 잘려 사라진다).
|
|
11768
|
-
"inline-flex w-full min-w-0 items-center gap-[4px] leading-[20px]",
|
|
11769
|
-
col.align === "center" && "justify-center",
|
|
11770
|
-
col.align === "right" && "justify-end"
|
|
11771
|
-
),
|
|
11772
|
-
children: col.renderHeader ? col.renderHeader(col, i) : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
11773
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "truncate", children: col.label }),
|
|
11774
|
-
col.helpText && col.helpText.length > 0 && // 라벨이 좁아져 truncate 되더라도 아이콘까지 함께 줄어들면 안 되므로
|
|
11775
|
-
// shrink-0 래퍼로 감싼다 (STooltip 의 className 은 본문 쪽으로 간다).
|
|
11776
|
-
// 아이콘·크기·색은 SKeyValueTable 헤더 도움말과 동일하게 맞춘다.
|
|
11777
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "inline-flex shrink-0", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
11778
|
-
STooltip2,
|
|
11779
|
-
{
|
|
11780
|
-
trigger: "hover",
|
|
11781
|
-
icon: "helpOutline",
|
|
11782
|
-
iconSize: 12,
|
|
11783
|
-
color: "var(--sys-color-fg-success)",
|
|
11784
|
-
placement: "top",
|
|
11785
|
-
message: col.helpText
|
|
11786
|
-
}
|
|
11787
|
-
) }),
|
|
11788
|
-
col.editable && /* @__PURE__ */ jsxRuntime.jsx(
|
|
11789
|
-
SIcon,
|
|
11790
|
-
{
|
|
11791
|
-
name: "pageEdit",
|
|
11792
|
-
size: 12,
|
|
11793
|
-
color: "var(--sys-color-link-accent)",
|
|
11794
|
-
label: "\uC218\uC815 \uAC00\uB2A5",
|
|
11795
|
-
className: "shrink-0"
|
|
11796
|
-
}
|
|
11797
|
-
),
|
|
11798
|
-
col.navigable && /* @__PURE__ */ jsxRuntime.jsx(
|
|
11799
|
-
SIcon,
|
|
11800
|
-
{
|
|
11801
|
-
name: "pageMove",
|
|
11802
|
-
size: 12,
|
|
11803
|
-
color: "var(--sys-color-link-accent)",
|
|
11804
|
-
label: "\uB2E4\uB978 \uD654\uBA74\uC73C\uB85C \uC774\uB3D9",
|
|
11805
|
-
className: "shrink-0"
|
|
11806
|
-
}
|
|
11807
|
-
),
|
|
11808
|
-
col.required && // 라벨이 truncate 돼도 필수 표시는 남아야 하므로 shrink-0.
|
|
11809
|
-
// 아이콘·크기·색은 SKeyValueTable 헤더 필수 표시와 동일하게 맞춘다.
|
|
11810
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
11811
|
-
SIcon,
|
|
11812
|
-
{
|
|
11813
|
-
name: "asterisk",
|
|
11814
|
-
size: 12,
|
|
11815
|
-
color: "var(--sys-color-fg-accent)",
|
|
11816
|
-
className: "shrink-0"
|
|
11817
|
-
}
|
|
11818
|
-
),
|
|
11819
|
-
isSortable && // 미정렬은 updown 을 default(회색)로 — 정렬할 수 있다는 것 자체가
|
|
11820
|
-
// 헤더에 보여야 한다. 정렬 중이면 action 색으로 올려 활성임을 알린다.
|
|
11821
|
-
// 라벨이 truncate 돼도 버튼은 남도록 shrink-0.
|
|
11822
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "inline-flex shrink-0", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
11823
|
-
SGhostButton,
|
|
11824
|
-
{
|
|
11825
|
-
size: "xxs",
|
|
11826
|
-
intent: sortDir ? "action" : "default",
|
|
11827
|
-
icon: sortDir === "asc" ? "arrowUp" : sortDir === "desc" ? "arrowDown" : "updown",
|
|
11828
|
-
ariaLabel: `${col.label} \uC815\uB82C`,
|
|
11829
|
-
onClick: () => toggleSort(col)
|
|
11830
|
-
}
|
|
11831
|
-
) })
|
|
11832
|
-
] })
|
|
11833
|
-
}
|
|
11834
|
-
),
|
|
11835
|
-
resizable && !col.autoWidth && i < visibleCols.length - 1 && // 원본 th__resizer: 셀 우측 경계 안쪽 4px 그립(좌우 1px #CCCCCC 라인, 세로 16px).
|
|
11836
|
-
// 셀 밖으로 넘치면 다음 셀에 가려져 클릭이 안 먹으므로 translate 없이 셀 내부에 배치.
|
|
11837
|
-
// 겉보기 그립은 4px(원본과 동일), 클릭 영역은 9px로 넓혀 사용성 확보.
|
|
11838
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
11839
|
-
"span",
|
|
11840
|
-
{
|
|
11841
|
-
onMouseDown: (e) => startResize(i, e),
|
|
11842
|
-
className: "absolute right-0 top-1/2 z-[5] flex h-[16px] w-[9px] -translate-y-1/2 cursor-col-resize items-center justify-end",
|
|
11843
12016
|
"aria-hidden": true,
|
|
11844
|
-
|
|
12017
|
+
className: "pointer-events-none absolute right-0 top-1/2 h-[16px] w-px -translate-y-1/2 bg-[var(--cmp-table-header-resizingBar-color)]"
|
|
11845
12018
|
}
|
|
11846
12019
|
)
|
|
11847
12020
|
]
|
|
11848
|
-
}
|
|
11849
|
-
|
|
11850
|
-
)
|
|
11851
|
-
|
|
11852
|
-
|
|
12021
|
+
}
|
|
12022
|
+
),
|
|
12023
|
+
visibleCols.map((col, i) => {
|
|
12024
|
+
if (headerGroupInfo?.rowSpanNames.has(col.name)) return null;
|
|
12025
|
+
const isSortable = !!col.sortable && !col.renderHeader;
|
|
12026
|
+
const sortDir = isSortable && sort?.name === col.name ? sort.dir : void 0;
|
|
12027
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
12028
|
+
"th",
|
|
12029
|
+
{
|
|
12030
|
+
className: cn(
|
|
12031
|
+
// 하단 border는 헤더 래퍼가 연속으로 그린다 (거터 영역까지 이어짐).
|
|
12032
|
+
// leading-[0]: th 의 스트럿(line-height 만큼의 빈 인라인 박스)을 없앤다.
|
|
12033
|
+
// 내용이 inline-flex 라 스트럿이 남아 있으면 라벨보다 큰 컨트롤(정렬 버튼 등)이
|
|
12034
|
+
// 들어올 때 줄 상자가 베이스라인 기준으로 늘어나 헤더 높이를 넘기고
|
|
12035
|
+
// 세로 가운데도 어긋난다. 글자 줄높이는 아래 th__content 가 다시 준다.
|
|
12036
|
+
headerGroupInfo && "border-r border-solid border-[color:var(--cmp-table-border-color)]",
|
|
12037
|
+
headerGroupInfo && i === visibleCols.length - 1 && "border-r-0",
|
|
12038
|
+
"relative bg-[var(--cmp-table-header-bg)] px-[16px] text-[12px] font-medium leading-[0] text-[color:var(--sys-color-fg-primary)]",
|
|
12039
|
+
stickyInfo(i).isSticky && "z-[6]",
|
|
12040
|
+
stickyShadowClass(i),
|
|
12041
|
+
col.thClass
|
|
12042
|
+
),
|
|
12043
|
+
style: { textAlign: col.align ?? "left", ...cellStyle(i), ...col.thStyle },
|
|
12044
|
+
"aria-sort": isSortable ? sortDir === "asc" ? "ascending" : sortDir === "desc" ? "descending" : "none" : void 0,
|
|
12045
|
+
children: [
|
|
12046
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
12047
|
+
"span",
|
|
12048
|
+
{
|
|
12049
|
+
className: cn(
|
|
12050
|
+
// 원본 th__content: align에 따라 justify-content 적용 (th도 정렬 반영)
|
|
12051
|
+
// th 가 leading-[0] 이므로 글자 줄높이는 여기서 준다 (truncate 가
|
|
12052
|
+
// overflow-hidden 이라 줄높이가 0이면 라벨이 잘려 사라진다).
|
|
12053
|
+
"inline-flex w-full min-w-0 items-center gap-[4px] leading-[20px]",
|
|
12054
|
+
col.align === "center" && "justify-center",
|
|
12055
|
+
col.align === "right" && "justify-end"
|
|
12056
|
+
),
|
|
12057
|
+
children: col.renderHeader ? col.renderHeader(col, i) : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
12058
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "truncate", children: col.label }),
|
|
12059
|
+
col.helpText && col.helpText.length > 0 && // 라벨이 좁아져 truncate 되더라도 아이콘까지 함께 줄어들면 안 되므로
|
|
12060
|
+
// shrink-0 래퍼로 감싼다 (STooltip 의 className 은 본문 쪽으로 간다).
|
|
12061
|
+
// 아이콘·크기·색은 SKeyValueTable 헤더 도움말과 동일하게 맞춘다.
|
|
12062
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "inline-flex shrink-0", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
12063
|
+
STooltip2,
|
|
12064
|
+
{
|
|
12065
|
+
trigger: "hover",
|
|
12066
|
+
icon: "helpOutline",
|
|
12067
|
+
iconSize: 12,
|
|
12068
|
+
color: "var(--sys-color-fg-success)",
|
|
12069
|
+
placement: "top",
|
|
12070
|
+
message: col.helpText
|
|
12071
|
+
}
|
|
12072
|
+
) }),
|
|
12073
|
+
col.editable && /* @__PURE__ */ jsxRuntime.jsx(
|
|
12074
|
+
SIcon,
|
|
12075
|
+
{
|
|
12076
|
+
name: "pageEdit",
|
|
12077
|
+
size: 12,
|
|
12078
|
+
color: "var(--sys-color-link-accent)",
|
|
12079
|
+
label: "\uC218\uC815 \uAC00\uB2A5",
|
|
12080
|
+
className: "shrink-0"
|
|
12081
|
+
}
|
|
12082
|
+
),
|
|
12083
|
+
col.navigable && /* @__PURE__ */ jsxRuntime.jsx(
|
|
12084
|
+
SIcon,
|
|
12085
|
+
{
|
|
12086
|
+
name: "pageMove",
|
|
12087
|
+
size: 12,
|
|
12088
|
+
color: "var(--sys-color-link-accent)",
|
|
12089
|
+
label: "\uB2E4\uB978 \uD654\uBA74\uC73C\uB85C \uC774\uB3D9",
|
|
12090
|
+
className: "shrink-0"
|
|
12091
|
+
}
|
|
12092
|
+
),
|
|
12093
|
+
col.required && // 라벨이 truncate 돼도 필수 표시는 남아야 하므로 shrink-0.
|
|
12094
|
+
// 아이콘·크기·색은 SKeyValueTable 헤더 필수 표시와 동일하게 맞춘다.
|
|
12095
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
12096
|
+
SIcon,
|
|
12097
|
+
{
|
|
12098
|
+
name: "asterisk",
|
|
12099
|
+
size: 12,
|
|
12100
|
+
color: "var(--sys-color-fg-accent)",
|
|
12101
|
+
className: "shrink-0"
|
|
12102
|
+
}
|
|
12103
|
+
),
|
|
12104
|
+
isSortable && // 미정렬은 updown 을 default(회색)로 — 정렬할 수 있다는 것 자체가
|
|
12105
|
+
// 헤더에 보여야 한다. 정렬 중이면 action 색으로 올려 활성임을 알린다.
|
|
12106
|
+
// 라벨이 truncate 돼도 버튼은 남도록 shrink-0.
|
|
12107
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "inline-flex shrink-0", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
12108
|
+
SGhostButton,
|
|
12109
|
+
{
|
|
12110
|
+
size: "xxs",
|
|
12111
|
+
intent: sortDir ? "action" : "default",
|
|
12112
|
+
icon: sortDir === "asc" ? "arrowUp" : sortDir === "desc" ? "arrowDown" : "updown",
|
|
12113
|
+
ariaLabel: `${col.label} \uC815\uB82C`,
|
|
12114
|
+
onClick: () => toggleSort(col)
|
|
12115
|
+
}
|
|
12116
|
+
) })
|
|
12117
|
+
] })
|
|
12118
|
+
}
|
|
12119
|
+
),
|
|
12120
|
+
headerGroupInfo ? headerResizeHitArea(i, `resizer-${col.name}`) : headerResizer(i, `resizer-${col.name}`)
|
|
12121
|
+
]
|
|
12122
|
+
},
|
|
12123
|
+
col.name
|
|
12124
|
+
);
|
|
12125
|
+
})
|
|
12126
|
+
] })
|
|
12127
|
+
] })
|
|
11853
12128
|
]
|
|
11854
12129
|
}
|
|
11855
12130
|
)
|
|
@@ -11971,11 +12246,12 @@ var STable = /* @__PURE__ */ react.forwardRef(function STable2({
|
|
|
11971
12246
|
]
|
|
11972
12247
|
}
|
|
11973
12248
|
),
|
|
11974
|
-
(showPagination ||
|
|
12249
|
+
(showPagination || useRowsPerPageSelect) && // 원본 sd-table__pagination: 테이블 하단에 이어붙는 회색 바(높이 48px, margin-top:-1px로 테두리 겹침).
|
|
11975
12250
|
// SPagination은 전체 폭 기준 중앙, rows-per-page SSelect는 우측에 absolute 배치해 중앙 정렬을 유지한다.
|
|
11976
12251
|
// 루트 높이가 확정된 경우(테이블이 남은 영역을 채우는 배치) 페이지네이션 바가
|
|
11977
12252
|
// 눌리지 않도록 shrink-0으로 48px를 보장한다.
|
|
11978
|
-
// 페이지네이션이 없어도
|
|
12253
|
+
// 페이지네이션이 없어도 rows-per-page 셀렉트가 있으면 이 바를 그린다 — 셀렉트와
|
|
12254
|
+
// 밀도 토글이 사는 곳이 여기다. dense 만으로는 그리지 않는다(빈 바가 남는다).
|
|
11979
12255
|
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
11980
12256
|
"div",
|
|
11981
12257
|
{
|
|
@@ -11986,7 +12262,7 @@ var STable = /* @__PURE__ */ react.forwardRef(function STable2({
|
|
|
11986
12262
|
),
|
|
11987
12263
|
children: [
|
|
11988
12264
|
showPagination && /* @__PURE__ */ jsxRuntime.jsx(SPagination, { currentPage: displayPage, lastPage, onPageChange: changePage }),
|
|
11989
|
-
|
|
12265
|
+
useRowsPerPageSelect && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "absolute right-[10px] top-1/2 flex -translate-y-1/2 items-center gap-[12px]", children: [
|
|
11990
12266
|
dense && /* @__PURE__ */ jsxRuntime.jsx(
|
|
11991
12267
|
STextLink,
|
|
11992
12268
|
{
|
|
@@ -11998,8 +12274,8 @@ var STable = /* @__PURE__ */ react.forwardRef(function STable2({
|
|
|
11998
12274
|
onClick: () => changeDense(!innerDense)
|
|
11999
12275
|
}
|
|
12000
12276
|
),
|
|
12001
|
-
dense &&
|
|
12002
|
-
|
|
12277
|
+
dense && /* @__PURE__ */ jsxRuntime.jsx(SDivider, { vertical: true, className: "my-[6px]" }),
|
|
12278
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
12003
12279
|
SSelect2,
|
|
12004
12280
|
{
|
|
12005
12281
|
options: rowsPerPageOption,
|
|
@@ -13076,7 +13352,7 @@ function SCalendar({
|
|
|
13076
13352
|
}) }),
|
|
13077
13353
|
legend.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
13078
13354
|
/* @__PURE__ */ jsxRuntime.jsx(SDivider, {}),
|
|
13079
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-wrap items-center justify-center gap-x-[var(--cmp-datepicker-calendar-legend-group-gap)] gap-y-[4px] text-[11px] leading-[18px]", children: legend.map((
|
|
13355
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-wrap items-center justify-center gap-x-[var(--cmp-datepicker-calendar-legend-group-gap)] gap-y-[4px] text-[11px] leading-[18px]", children: legend.map((item2) => /* @__PURE__ */ jsxRuntime.jsxs(
|
|
13080
13356
|
"span",
|
|
13081
13357
|
{
|
|
13082
13358
|
className: "inline-flex items-center gap-[var(--cmp-datepicker-calendar-legend-gap)]",
|
|
@@ -13085,14 +13361,14 @@ function SCalendar({
|
|
|
13085
13361
|
"span",
|
|
13086
13362
|
{
|
|
13087
13363
|
className: "h-[var(--cmp-datepicker-calendar-day-dot-size)] w-[var(--cmp-datepicker-calendar-day-dot-size)] rounded-full",
|
|
13088
|
-
style: { backgroundColor: resolveColor(
|
|
13364
|
+
style: { backgroundColor: resolveColor(item2.color) },
|
|
13089
13365
|
"aria-hidden": true
|
|
13090
13366
|
}
|
|
13091
13367
|
),
|
|
13092
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { children:
|
|
13368
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { children: item2.label })
|
|
13093
13369
|
]
|
|
13094
13370
|
},
|
|
13095
|
-
`${
|
|
13371
|
+
`${item2.color}|${item2.label}`
|
|
13096
13372
|
)) })
|
|
13097
13373
|
] })
|
|
13098
13374
|
]
|
|
@@ -16059,19 +16335,19 @@ function EditorToolbarBar({
|
|
|
16059
16335
|
closeLinkEditor();
|
|
16060
16336
|
};
|
|
16061
16337
|
const visible = [];
|
|
16062
|
-
for (const
|
|
16063
|
-
if (
|
|
16064
|
-
if (
|
|
16065
|
-
visible.push(
|
|
16338
|
+
for (const item2 of items) {
|
|
16339
|
+
if (item2 === "image" && !onImageUpload) continue;
|
|
16340
|
+
if (item2 === "|" && (visible.length === 0 || visible[visible.length - 1] === "|")) continue;
|
|
16341
|
+
visible.push(item2);
|
|
16066
16342
|
}
|
|
16067
16343
|
while (visible.length > 0 && visible[visible.length - 1] === "|") visible.pop();
|
|
16068
16344
|
const groups = [[]];
|
|
16069
|
-
for (const
|
|
16070
|
-
if (
|
|
16071
|
-
else groups[groups.length - 1].push(
|
|
16345
|
+
for (const item2 of visible) {
|
|
16346
|
+
if (item2 === "|") groups.push([]);
|
|
16347
|
+
else groups[groups.length - 1].push(item2);
|
|
16072
16348
|
}
|
|
16073
|
-
const node = (
|
|
16074
|
-
switch (
|
|
16349
|
+
const node = (item2) => {
|
|
16350
|
+
switch (item2) {
|
|
16075
16351
|
case "heading":
|
|
16076
16352
|
return /* @__PURE__ */ jsxRuntime.jsxs(RDropdown2__namespace.Root, { modal: !insideModal, children: [
|
|
16077
16353
|
/* @__PURE__ */ jsxRuntime.jsx(RDropdown2__namespace.Trigger, { asChild: true, disabled: off, children: /* @__PURE__ */ jsxRuntime.jsxs(
|
|
@@ -16106,7 +16382,7 @@ function EditorToolbarBar({
|
|
|
16106
16382
|
level
|
|
16107
16383
|
))
|
|
16108
16384
|
] }) })
|
|
16109
|
-
] },
|
|
16385
|
+
] }, item2);
|
|
16110
16386
|
case "fontSize":
|
|
16111
16387
|
return /* @__PURE__ */ jsxRuntime.jsxs(RDropdown2__namespace.Root, { modal: !insideModal, children: [
|
|
16112
16388
|
/* @__PURE__ */ jsxRuntime.jsx(RDropdown2__namespace.Trigger, { asChild: true, disabled: off, children: /* @__PURE__ */ jsxRuntime.jsxs(ToolbarButton, { label: "\uAE00\uC790 \uD06C\uAE30", disabled: off, className: "px-[6px]", children: [
|
|
@@ -16145,7 +16421,7 @@ function EditorToolbarBar({
|
|
|
16145
16421
|
]
|
|
16146
16422
|
}
|
|
16147
16423
|
) })
|
|
16148
|
-
] },
|
|
16424
|
+
] }, item2);
|
|
16149
16425
|
case "bold":
|
|
16150
16426
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
16151
16427
|
ToolbarButton,
|
|
@@ -16157,7 +16433,7 @@ function EditorToolbarBar({
|
|
|
16157
16433
|
onClick: () => chain()?.toggleBold().run(),
|
|
16158
16434
|
children: /* @__PURE__ */ jsxRuntime.jsx(IconBold, { size: ICON_SIZE })
|
|
16159
16435
|
},
|
|
16160
|
-
|
|
16436
|
+
item2
|
|
16161
16437
|
);
|
|
16162
16438
|
case "italic":
|
|
16163
16439
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -16170,7 +16446,7 @@ function EditorToolbarBar({
|
|
|
16170
16446
|
onClick: () => chain()?.toggleItalic().run(),
|
|
16171
16447
|
children: /* @__PURE__ */ jsxRuntime.jsx(IconItalic, { size: ICON_SIZE })
|
|
16172
16448
|
},
|
|
16173
|
-
|
|
16449
|
+
item2
|
|
16174
16450
|
);
|
|
16175
16451
|
case "underline":
|
|
16176
16452
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -16183,7 +16459,7 @@ function EditorToolbarBar({
|
|
|
16183
16459
|
onClick: () => chain()?.toggleUnderline().run(),
|
|
16184
16460
|
children: /* @__PURE__ */ jsxRuntime.jsx(IconUnderline, { size: ICON_SIZE })
|
|
16185
16461
|
},
|
|
16186
|
-
|
|
16462
|
+
item2
|
|
16187
16463
|
);
|
|
16188
16464
|
case "strike":
|
|
16189
16465
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -16196,7 +16472,7 @@ function EditorToolbarBar({
|
|
|
16196
16472
|
onClick: () => chain()?.toggleStrike().run(),
|
|
16197
16473
|
children: /* @__PURE__ */ jsxRuntime.jsx(IconStrike, { size: ICON_SIZE })
|
|
16198
16474
|
},
|
|
16199
|
-
|
|
16475
|
+
item2
|
|
16200
16476
|
);
|
|
16201
16477
|
case "code":
|
|
16202
16478
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -16209,7 +16485,7 @@ function EditorToolbarBar({
|
|
|
16209
16485
|
onClick: () => chain()?.toggleCode().run(),
|
|
16210
16486
|
children: /* @__PURE__ */ jsxRuntime.jsx(IconCode, { size: ICON_SIZE })
|
|
16211
16487
|
},
|
|
16212
|
-
|
|
16488
|
+
item2
|
|
16213
16489
|
);
|
|
16214
16490
|
case "color":
|
|
16215
16491
|
if (mobile)
|
|
@@ -16221,7 +16497,7 @@ function EditorToolbarBar({
|
|
|
16221
16497
|
onClick: () => setMobileView("color"),
|
|
16222
16498
|
children: /* @__PURE__ */ jsxRuntime.jsx(ColorIndicator, { color: off ? "currentColor" : activeColor, children: /* @__PURE__ */ jsxRuntime.jsx(IconTextColor, { size: ICON_SIZE }) })
|
|
16223
16499
|
},
|
|
16224
|
-
|
|
16500
|
+
item2
|
|
16225
16501
|
);
|
|
16226
16502
|
return /* @__PURE__ */ jsxRuntime.jsxs(RDropdown2__namespace.Root, { modal: !insideModal, children: [
|
|
16227
16503
|
/* @__PURE__ */ jsxRuntime.jsx(RDropdown2__namespace.Trigger, { asChild: true, disabled: off, children: /* @__PURE__ */ jsxRuntime.jsx(ToolbarButton, { label: "\uAE00\uC790\uC0C9", disabled: off, children: /* @__PURE__ */ jsxRuntime.jsx(ColorIndicator, { color: off ? "currentColor" : activeColor, children: /* @__PURE__ */ jsxRuntime.jsx(IconTextColor, { size: ICON_SIZE }) }) }) }),
|
|
@@ -16236,7 +16512,7 @@ function EditorToolbarBar({
|
|
|
16236
16512
|
onClear: clearColor
|
|
16237
16513
|
}
|
|
16238
16514
|
) }) })
|
|
16239
|
-
] },
|
|
16515
|
+
] }, item2);
|
|
16240
16516
|
case "alignLeft":
|
|
16241
16517
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
16242
16518
|
ToolbarButton,
|
|
@@ -16248,7 +16524,7 @@ function EditorToolbarBar({
|
|
|
16248
16524
|
onClick: () => chain()?.setTextAlign("left").run(),
|
|
16249
16525
|
children: /* @__PURE__ */ jsxRuntime.jsx(IconAlignLeft, { size: ICON_SIZE })
|
|
16250
16526
|
},
|
|
16251
|
-
|
|
16527
|
+
item2
|
|
16252
16528
|
);
|
|
16253
16529
|
case "alignCenter":
|
|
16254
16530
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -16261,7 +16537,7 @@ function EditorToolbarBar({
|
|
|
16261
16537
|
onClick: () => chain()?.setTextAlign("center").run(),
|
|
16262
16538
|
children: /* @__PURE__ */ jsxRuntime.jsx(IconAlignCenter, { size: ICON_SIZE })
|
|
16263
16539
|
},
|
|
16264
|
-
|
|
16540
|
+
item2
|
|
16265
16541
|
);
|
|
16266
16542
|
case "alignRight":
|
|
16267
16543
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -16274,7 +16550,7 @@ function EditorToolbarBar({
|
|
|
16274
16550
|
onClick: () => chain()?.setTextAlign("right").run(),
|
|
16275
16551
|
children: /* @__PURE__ */ jsxRuntime.jsx(IconAlignRight, { size: ICON_SIZE })
|
|
16276
16552
|
},
|
|
16277
|
-
|
|
16553
|
+
item2
|
|
16278
16554
|
);
|
|
16279
16555
|
case "alignJustify":
|
|
16280
16556
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -16287,7 +16563,7 @@ function EditorToolbarBar({
|
|
|
16287
16563
|
onClick: () => chain()?.setTextAlign("justify").run(),
|
|
16288
16564
|
children: /* @__PURE__ */ jsxRuntime.jsx(IconAlignJustify, { size: ICON_SIZE })
|
|
16289
16565
|
},
|
|
16290
|
-
|
|
16566
|
+
item2
|
|
16291
16567
|
);
|
|
16292
16568
|
case "bulletList":
|
|
16293
16569
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -16300,7 +16576,7 @@ function EditorToolbarBar({
|
|
|
16300
16576
|
onClick: () => chain()?.toggleBulletList().run(),
|
|
16301
16577
|
children: /* @__PURE__ */ jsxRuntime.jsx(IconBulletList, { size: ICON_SIZE })
|
|
16302
16578
|
},
|
|
16303
|
-
|
|
16579
|
+
item2
|
|
16304
16580
|
);
|
|
16305
16581
|
case "orderedList":
|
|
16306
16582
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -16313,7 +16589,7 @@ function EditorToolbarBar({
|
|
|
16313
16589
|
onClick: () => chain()?.toggleOrderedList().run(),
|
|
16314
16590
|
children: /* @__PURE__ */ jsxRuntime.jsx(IconOrderedList, { size: ICON_SIZE })
|
|
16315
16591
|
},
|
|
16316
|
-
|
|
16592
|
+
item2
|
|
16317
16593
|
);
|
|
16318
16594
|
case "taskList":
|
|
16319
16595
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -16326,7 +16602,7 @@ function EditorToolbarBar({
|
|
|
16326
16602
|
onClick: () => chain()?.toggleTaskList().run(),
|
|
16327
16603
|
children: /* @__PURE__ */ jsxRuntime.jsx(IconTaskList, { size: ICON_SIZE })
|
|
16328
16604
|
},
|
|
16329
|
-
|
|
16605
|
+
item2
|
|
16330
16606
|
);
|
|
16331
16607
|
case "list": {
|
|
16332
16608
|
const ListIcon = state2.orderedList ? IconOrderedList : state2.taskList ? IconTaskList : IconBulletList;
|
|
@@ -16371,7 +16647,7 @@ function EditorToolbarBar({
|
|
|
16371
16647
|
}
|
|
16372
16648
|
)
|
|
16373
16649
|
] }) })
|
|
16374
|
-
] },
|
|
16650
|
+
] }, item2);
|
|
16375
16651
|
}
|
|
16376
16652
|
case "blockquote":
|
|
16377
16653
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -16384,7 +16660,7 @@ function EditorToolbarBar({
|
|
|
16384
16660
|
onClick: () => chain()?.toggleBlockquote().run(),
|
|
16385
16661
|
children: /* @__PURE__ */ jsxRuntime.jsx(IconBlockquote, { size: ICON_SIZE })
|
|
16386
16662
|
},
|
|
16387
|
-
|
|
16663
|
+
item2
|
|
16388
16664
|
);
|
|
16389
16665
|
case "codeBlock":
|
|
16390
16666
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -16397,7 +16673,7 @@ function EditorToolbarBar({
|
|
|
16397
16673
|
onClick: () => chain()?.toggleCodeBlock().run(),
|
|
16398
16674
|
children: /* @__PURE__ */ jsxRuntime.jsx(IconCodeBlock, { size: ICON_SIZE })
|
|
16399
16675
|
},
|
|
16400
|
-
|
|
16676
|
+
item2
|
|
16401
16677
|
);
|
|
16402
16678
|
case "horizontalRule":
|
|
16403
16679
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -16408,7 +16684,7 @@ function EditorToolbarBar({
|
|
|
16408
16684
|
onClick: () => chain()?.setHorizontalRule().run(),
|
|
16409
16685
|
children: /* @__PURE__ */ jsxRuntime.jsx(IconHorizontalRule, { size: ICON_SIZE })
|
|
16410
16686
|
},
|
|
16411
|
-
|
|
16687
|
+
item2
|
|
16412
16688
|
);
|
|
16413
16689
|
case "link":
|
|
16414
16690
|
if (mobile)
|
|
@@ -16421,7 +16697,7 @@ function EditorToolbarBar({
|
|
|
16421
16697
|
onClick: () => setMobileView("link"),
|
|
16422
16698
|
children: /* @__PURE__ */ jsxRuntime.jsx(IconLink, { size: ICON_SIZE })
|
|
16423
16699
|
},
|
|
16424
|
-
|
|
16700
|
+
item2
|
|
16425
16701
|
);
|
|
16426
16702
|
return /* @__PURE__ */ jsxRuntime.jsxs(RPopover11__namespace.Root, { open: linkOpen, onOpenChange: setLinkOpen, children: [
|
|
16427
16703
|
/* @__PURE__ */ jsxRuntime.jsx(RPopover11__namespace.Trigger, { asChild: true, disabled: off, children: /* @__PURE__ */ jsxRuntime.jsx(ToolbarButton, { label: "\uB9C1\uD06C", active: state2.link, disabled: off, children: /* @__PURE__ */ jsxRuntime.jsx(IconLink, { size: ICON_SIZE }) }) }),
|
|
@@ -16446,7 +16722,7 @@ function EditorToolbarBar({
|
|
|
16446
16722
|
)
|
|
16447
16723
|
}
|
|
16448
16724
|
) })
|
|
16449
|
-
] },
|
|
16725
|
+
] }, item2);
|
|
16450
16726
|
case "image":
|
|
16451
16727
|
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
16452
16728
|
ToolbarButton,
|
|
@@ -16460,7 +16736,7 @@ function EditorToolbarBar({
|
|
|
16460
16736
|
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-[12px] leading-[20px]", children: "\uC774\uBBF8\uC9C0" })
|
|
16461
16737
|
]
|
|
16462
16738
|
},
|
|
16463
|
-
|
|
16739
|
+
item2
|
|
16464
16740
|
);
|
|
16465
16741
|
case "table":
|
|
16466
16742
|
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
@@ -16581,7 +16857,7 @@ function EditorToolbarBar({
|
|
|
16581
16857
|
] }) })
|
|
16582
16858
|
]
|
|
16583
16859
|
},
|
|
16584
|
-
|
|
16860
|
+
item2
|
|
16585
16861
|
);
|
|
16586
16862
|
case "undo":
|
|
16587
16863
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -16592,7 +16868,7 @@ function EditorToolbarBar({
|
|
|
16592
16868
|
onClick: () => chain()?.undo().run(),
|
|
16593
16869
|
children: /* @__PURE__ */ jsxRuntime.jsx(IconUndo, { size: ICON_SIZE })
|
|
16594
16870
|
},
|
|
16595
|
-
|
|
16871
|
+
item2
|
|
16596
16872
|
);
|
|
16597
16873
|
case "redo":
|
|
16598
16874
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -16603,7 +16879,7 @@ function EditorToolbarBar({
|
|
|
16603
16879
|
onClick: () => chain()?.redo().run(),
|
|
16604
16880
|
children: /* @__PURE__ */ jsxRuntime.jsx(IconRedo, { size: ICON_SIZE })
|
|
16605
16881
|
},
|
|
16606
|
-
|
|
16882
|
+
item2
|
|
16607
16883
|
);
|
|
16608
16884
|
default:
|
|
16609
16885
|
return null;
|
|
@@ -17211,7 +17487,8 @@ var resolveFieldDefault = (field) => {
|
|
|
17211
17487
|
if (field.type === "datepicker-day") return todayIso();
|
|
17212
17488
|
if (field.type === "select") return field.options?.[0]?.value;
|
|
17213
17489
|
if (field.type === "datepicker-statistics") {
|
|
17214
|
-
const
|
|
17490
|
+
const presets = getFieldPresets(field).filter((preset) => !preset.custom);
|
|
17491
|
+
const unit = presets.some((preset) => preset.value === "day") ? "day" : presets[0]?.value;
|
|
17215
17492
|
return unit ? createPeriodValue(unit) : void 0;
|
|
17216
17493
|
}
|
|
17217
17494
|
return void 0;
|
|
@@ -17341,8 +17618,7 @@ var SChipFilter = /* @__PURE__ */ react.forwardRef(function SChipFilter2({
|
|
|
17341
17618
|
onActiveKeysChange,
|
|
17342
17619
|
onReset,
|
|
17343
17620
|
onAddFilter,
|
|
17344
|
-
label
|
|
17345
|
-
showLabel = false,
|
|
17621
|
+
label,
|
|
17346
17622
|
showReset = true,
|
|
17347
17623
|
disabled = false,
|
|
17348
17624
|
className,
|
|
@@ -17359,6 +17635,7 @@ var SChipFilter = /* @__PURE__ */ react.forwardRef(function SChipFilter2({
|
|
|
17359
17635
|
const pendingOpenKeyRef = react.useRef(null);
|
|
17360
17636
|
const triggerRefs = react.useRef(/* @__PURE__ */ new Map());
|
|
17361
17637
|
const initializedDefaultsRef = react.useRef(/* @__PURE__ */ new Set());
|
|
17638
|
+
const misuseWarningSignatureRef = react.useRef(null);
|
|
17362
17639
|
const prevOpenKeyRef = react.useRef(null);
|
|
17363
17640
|
const valuesRef = react.useRef(values);
|
|
17364
17641
|
valuesRef.current = values;
|
|
@@ -17374,14 +17651,19 @@ var SChipFilter = /* @__PURE__ */ react.forwardRef(function SChipFilter2({
|
|
|
17374
17651
|
(current) => groups.every((group) => isGroupSatisfied(group, current)),
|
|
17375
17652
|
[groups]
|
|
17376
17653
|
);
|
|
17654
|
+
const isRequiredSatisfied = react.useCallback(
|
|
17655
|
+
(current) => fields.every((field) => !field.required || !isEmptyValue(current[field.key])),
|
|
17656
|
+
[fields]
|
|
17657
|
+
);
|
|
17377
17658
|
const runSearch = react.useCallback(
|
|
17378
17659
|
(next) => {
|
|
17379
17660
|
if (valuesMapEqual(lastSearchedValuesRef.current, next)) return;
|
|
17380
17661
|
if (!isGroupsValid(next)) return;
|
|
17662
|
+
if (!isRequiredSatisfied(next)) return;
|
|
17381
17663
|
lastSearchedValuesRef.current = next;
|
|
17382
17664
|
onSearch?.(next);
|
|
17383
17665
|
},
|
|
17384
|
-
[isGroupsValid, onSearch]
|
|
17666
|
+
[isGroupsValid, isRequiredSatisfied, onSearch]
|
|
17385
17667
|
);
|
|
17386
17668
|
react.useEffect(() => {
|
|
17387
17669
|
const prevKey = prevOpenKeyRef.current;
|
|
@@ -17416,14 +17698,24 @@ var SChipFilter = /* @__PURE__ */ react.forwardRef(function SChipFilter2({
|
|
|
17416
17698
|
});
|
|
17417
17699
|
if (changed) onValueChange?.({ ...values, ...patch });
|
|
17418
17700
|
}, [fields, values, onValueChange]);
|
|
17419
|
-
|
|
17420
|
-
|
|
17421
|
-
|
|
17701
|
+
react.useEffect(() => {
|
|
17702
|
+
if (typeof console === "undefined") return;
|
|
17703
|
+
const misusedKeys = fields.filter((f) => f.defaultValue !== void 0 && !isFixedField(f)).map((f) => f.key);
|
|
17704
|
+
const requiredWithoutDefaultKeys = fields.filter((f) => f.required === true && resolveFieldDefault(f) === void 0).map((f) => f.key);
|
|
17705
|
+
const signature = JSON.stringify([misusedKeys, requiredWithoutDefaultKeys]);
|
|
17706
|
+
if (signature === misuseWarningSignatureRef.current) return;
|
|
17707
|
+
misuseWarningSignatureRef.current = signature;
|
|
17708
|
+
if (misusedKeys.length > 0) {
|
|
17422
17709
|
console.warn(
|
|
17423
|
-
`[SChipFilter] defaultValue \uB294 fixed\xB7required \uD544\uD130\uC5D0\uC11C\uB9CC \uC4F8 \uC218 \uC788\uC2B5\uB2C8\uB2E4. \uBB34\uC2DC\uD569\uB2C8\uB2E4. (${
|
|
17710
|
+
`[SChipFilter] defaultValue \uB294 fixed\xB7required \uD544\uD130\uC5D0\uC11C\uB9CC \uC4F8 \uC218 \uC788\uC2B5\uB2C8\uB2E4. \uBB34\uC2DC\uD569\uB2C8\uB2E4. (${misusedKeys.join(", ")})`
|
|
17424
17711
|
);
|
|
17425
17712
|
}
|
|
17426
|
-
|
|
17713
|
+
if (requiredWithoutDefaultKeys.length > 0) {
|
|
17714
|
+
console.warn(
|
|
17715
|
+
`[SChipFilter] required \uD544\uD130\uC5D0 defaultValue \uAC00 \uC5C6\uC2B5\uB2C8\uB2E4 \u2014 \uC774 \uD0C0\uC785\uC740 \uB0B4\uC7A5 \uAE30\uBCF8\uAC12\uC774 \uC5C6\uC5B4 "\uAC80\uC0C9 \uCD08\uAE30\uD654" \uC2DC \uAC12\uC774 \uBE44\uC6CC\uC9C0\uACE0 \uAC80\uC0C9\uB3C4 \uB9C9\uD799\uB2C8\uB2E4. defaultValue \uB97C \uC9C0\uC815\uD558\uC138\uC694. (${requiredWithoutDefaultKeys.join(", ")})`
|
|
17716
|
+
);
|
|
17717
|
+
}
|
|
17718
|
+
}, [fields]);
|
|
17427
17719
|
const fixedKeys = fields.filter(isFixedField).map((field) => field.key);
|
|
17428
17720
|
const resolvedActiveKeys = Array.from(
|
|
17429
17721
|
/* @__PURE__ */ new Set([...activeKeys ?? internalActiveKeys, ...fixedKeys])
|
|
@@ -17491,7 +17783,10 @@ var SChipFilter = /* @__PURE__ */ react.forwardRef(function SChipFilter2({
|
|
|
17491
17783
|
},
|
|
17492
17784
|
[fields]
|
|
17493
17785
|
);
|
|
17494
|
-
const validate = react.useCallback(
|
|
17786
|
+
const validate = react.useCallback(
|
|
17787
|
+
() => invalidGroups.size === 0 && isRequiredSatisfied(values),
|
|
17788
|
+
[invalidGroups, isRequiredSatisfied, values]
|
|
17789
|
+
);
|
|
17495
17790
|
react.useImperativeHandle(ref, () => ({ open, reset, validate }), [open, reset, validate]);
|
|
17496
17791
|
const addField = (key) => {
|
|
17497
17792
|
const next = [...resolvedActiveKeys, key];
|
|
@@ -17528,7 +17823,7 @@ var SChipFilter = /* @__PURE__ */ react.forwardRef(function SChipFilter2({
|
|
|
17528
17823
|
),
|
|
17529
17824
|
style: { ...rootStyle, borderColor: "var(--chipfilter-bar-border)" },
|
|
17530
17825
|
children: [
|
|
17531
|
-
|
|
17826
|
+
label && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
17532
17827
|
/* @__PURE__ */ jsxRuntime.jsx(STag, { className: "shrink-0", shape: "square", size: "sm", color: "darkblue", label }),
|
|
17533
17828
|
/* @__PURE__ */ jsxRuntime.jsx(Divider, { top: true })
|
|
17534
17829
|
] }),
|
|
@@ -18238,6 +18533,10 @@ function InlineDatePresetFilter({
|
|
|
18238
18533
|
setSelectedId(preset.value);
|
|
18239
18534
|
onValueChange(preset.resolve ? preset.resolve() : null);
|
|
18240
18535
|
};
|
|
18536
|
+
const badgeBorder = disabled ? CHIPFILTER.chipDisabledBorder : warning ? CHIPFILTER.chipWarningBorder : CHIPFILTER.chipAppliedBorder;
|
|
18537
|
+
const badgeBackground = disabled ? CHIPFILTER.chipDisabledBg : CHIPFILTER.chipAppliedBg;
|
|
18538
|
+
const badgeLabelColor = disabled ? CHIPFILTER.chipDisabledText : CHIPFILTER.chipAppliedLabel;
|
|
18539
|
+
const badgeValueColor = disabled ? CHIPFILTER.chipDisabledText : CHIPFILTER.chipAppliedValue;
|
|
18241
18540
|
const badge = applied && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
18242
18541
|
"span",
|
|
18243
18542
|
{
|
|
@@ -18245,17 +18544,17 @@ function InlineDatePresetFilter({
|
|
|
18245
18544
|
style: {
|
|
18246
18545
|
minHeight: CHIPFILTER.chipHeight,
|
|
18247
18546
|
borderRadius: CHIPFILTER.chipRadius,
|
|
18248
|
-
borderColor:
|
|
18249
|
-
background:
|
|
18250
|
-
color:
|
|
18251
|
-
cursor: rangeValue ? "pointer" : void 0
|
|
18547
|
+
borderColor: badgeBorder,
|
|
18548
|
+
background: badgeBackground,
|
|
18549
|
+
color: badgeLabelColor,
|
|
18550
|
+
cursor: rangeValue && !disabled ? "pointer" : void 0
|
|
18252
18551
|
},
|
|
18253
18552
|
children: [
|
|
18254
18553
|
/* @__PURE__ */ jsxRuntime.jsxs("span", { className: "font-bold", children: [
|
|
18255
18554
|
field.label,
|
|
18256
18555
|
":"
|
|
18257
18556
|
] }),
|
|
18258
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-bold", style: { color:
|
|
18557
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-bold", style: { color: badgeValueColor }, children: displayValue(field, value) }),
|
|
18259
18558
|
!disabled && showClear && /* @__PURE__ */ jsxRuntime.jsx(
|
|
18260
18559
|
"span",
|
|
18261
18560
|
{
|
|
@@ -19037,8 +19336,8 @@ var SChipInput = /* @__PURE__ */ react.forwardRef(function SChipInput2({
|
|
|
19037
19336
|
onMouseDown: (e) => e.preventDefault(),
|
|
19038
19337
|
children: [
|
|
19039
19338
|
loading2 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "s-chip-input__suggestions-empty p-sd-12 text-center text-12 leading-sd-20 text-(--color-grey-65)", children: "\uBD88\uB7EC\uC624\uB294 \uC911..." }),
|
|
19040
|
-
!effectiveAutocomplete ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-wrap gap-sd-8 px-sd-12 py-sd-6", children: items.map((
|
|
19041
|
-
const selected = values.includes(
|
|
19339
|
+
!effectiveAutocomplete ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-wrap gap-sd-8 px-sd-12 py-sd-6", children: items.map((item2, i) => {
|
|
19340
|
+
const selected = values.includes(item2);
|
|
19042
19341
|
const active = i === activeIndex && !selected;
|
|
19043
19342
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
19044
19343
|
"div",
|
|
@@ -19049,14 +19348,14 @@ var SChipInput = /* @__PURE__ */ react.forwardRef(function SChipInput2({
|
|
|
19049
19348
|
style: active ? { outline: "2px solid var(--color-border-accent)", outlineOffset: 1 } : void 0,
|
|
19050
19349
|
onMouseDown: (e) => {
|
|
19051
19350
|
e.preventDefault();
|
|
19052
|
-
if (!selected) addChip(
|
|
19351
|
+
if (!selected) addChip(item2);
|
|
19053
19352
|
},
|
|
19054
|
-
children: /* @__PURE__ */ jsxRuntime.jsx(SChip2, { value:
|
|
19353
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(SChip2, { value: item2, disabled: selected, editable: false, showRemove: false })
|
|
19055
19354
|
},
|
|
19056
|
-
|
|
19355
|
+
item2
|
|
19057
19356
|
);
|
|
19058
|
-
}) }) : items.map((
|
|
19059
|
-
const selected = values.includes(
|
|
19357
|
+
}) }) : items.map((item2, i) => {
|
|
19358
|
+
const selected = values.includes(item2);
|
|
19060
19359
|
const active = i === activeIndex && !selected;
|
|
19061
19360
|
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
19062
19361
|
"div",
|
|
@@ -19069,10 +19368,10 @@ var SChipInput = /* @__PURE__ */ react.forwardRef(function SChipInput2({
|
|
|
19069
19368
|
),
|
|
19070
19369
|
onMouseDown: (e) => {
|
|
19071
19370
|
e.preventDefault();
|
|
19072
|
-
if (!selected) addChip(
|
|
19371
|
+
if (!selected) addChip(item2);
|
|
19073
19372
|
},
|
|
19074
19373
|
children: [
|
|
19075
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "flex-1", children:
|
|
19374
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "flex-1", children: item2 }),
|
|
19076
19375
|
selected && /* @__PURE__ */ jsxRuntime.jsx(
|
|
19077
19376
|
SIcon,
|
|
19078
19377
|
{
|
|
@@ -19083,7 +19382,7 @@ var SChipInput = /* @__PURE__ */ react.forwardRef(function SChipInput2({
|
|
|
19083
19382
|
)
|
|
19084
19383
|
]
|
|
19085
19384
|
},
|
|
19086
|
-
|
|
19385
|
+
item2
|
|
19087
19386
|
);
|
|
19088
19387
|
})
|
|
19089
19388
|
]
|
|
@@ -19467,22 +19766,22 @@ function TimeSelector({
|
|
|
19467
19766
|
style: {
|
|
19468
19767
|
padding: "var(--cmp-timepicker-selector-section-paddingY) var(--cmp-timepicker-selector-section-paddingX)"
|
|
19469
19768
|
},
|
|
19470
|
-
children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "isolate flex", children: ["AM", "PM"].map((
|
|
19471
|
-
const selected =
|
|
19769
|
+
children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "isolate flex", children: ["AM", "PM"].map((item2, index) => {
|
|
19770
|
+
const selected = item2 === meridiem;
|
|
19472
19771
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
19473
19772
|
"button",
|
|
19474
19773
|
{
|
|
19475
19774
|
type: "button",
|
|
19476
|
-
onClick: () => setMeridiem(
|
|
19775
|
+
onClick: () => setMeridiem(item2),
|
|
19477
19776
|
className: cn(
|
|
19478
19777
|
"box-border h-[var(--cmp-textinput-sm-height)] w-[61px] cursor-pointer border border-solid bg-white text-center text-[12px] font-medium leading-[20px]",
|
|
19479
19778
|
index === 0 ? "rounded-l-[var(--cmp-select-sm-radius)]" : "rounded-r-[var(--cmp-select-sm-radius)]",
|
|
19480
19779
|
index === 0 ? "-mr-px" : "",
|
|
19481
19780
|
selected ? "z-[1] border-[var(--cmp-timepicker-border-focus)] text-[var(--cmp-timepicker-border-focus)]" : "border-[var(--cmp-timepicker-border-default)] text-[var(--cmp-field-hint-color)]"
|
|
19482
19781
|
),
|
|
19483
|
-
children:
|
|
19782
|
+
children: item2 === "AM" ? "\uC624\uC804" : "\uC624\uD6C4"
|
|
19484
19783
|
},
|
|
19485
|
-
|
|
19784
|
+
item2
|
|
19486
19785
|
);
|
|
19487
19786
|
}) })
|
|
19488
19787
|
}
|
|
@@ -19703,8 +20002,8 @@ function getTimeMinutes(value) {
|
|
|
19703
20002
|
}
|
|
19704
20003
|
function normalizeTimeRangeValue(value, rangeOrder = "strict") {
|
|
19705
20004
|
if (value == null) return null;
|
|
19706
|
-
const normalized = value.map((
|
|
19707
|
-
const parsed = parseTimeValue(
|
|
20005
|
+
const normalized = value.map((item2) => {
|
|
20006
|
+
const parsed = parseTimeValue(item2);
|
|
19708
20007
|
return formatTimeValue(parsed.hour, parsed.minute);
|
|
19709
20008
|
});
|
|
19710
20009
|
if (rangeOrder === "strict" && getTimeMinutes(normalized[0]) > getTimeMinutes(normalized[1])) {
|
|
@@ -19914,21 +20213,21 @@ function RangeTimeSelector({
|
|
|
19914
20213
|
style: { gap: "var(--cmp-timepicker-selector-range-heading-gap)" },
|
|
19915
20214
|
children: [
|
|
19916
20215
|
/* @__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 }),
|
|
19917
|
-
useMeridiem && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "isolate flex", children: ["AM", "PM"].map((
|
|
19918
|
-
const selected =
|
|
20216
|
+
useMeridiem && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "isolate flex", children: ["AM", "PM"].map((item2, index) => {
|
|
20217
|
+
const selected = item2 === getMeridiem(side);
|
|
19919
20218
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
19920
20219
|
"button",
|
|
19921
20220
|
{
|
|
19922
20221
|
type: "button",
|
|
19923
|
-
onClick: () => setMeridiem(side,
|
|
20222
|
+
onClick: () => setMeridiem(side, item2),
|
|
19924
20223
|
className: cn(
|
|
19925
20224
|
"box-border h-[var(--cmp-textinput-sm-height)] w-[61px] cursor-pointer border border-solid bg-white text-center text-[12px] font-medium leading-[20px]",
|
|
19926
20225
|
index === 0 ? "rounded-l-[var(--cmp-select-sm-radius)] -mr-px" : "rounded-r-[var(--cmp-select-sm-radius)]",
|
|
19927
20226
|
selected ? "z-[1] border-[var(--cmp-timepicker-border-focus)] text-[var(--cmp-timepicker-border-focus)]" : "border-[var(--cmp-timepicker-border-default)] text-[var(--cmp-field-hint-color)]"
|
|
19928
20227
|
),
|
|
19929
|
-
children:
|
|
20228
|
+
children: item2 === "AM" ? "\uC624\uC804" : "\uC624\uD6C4"
|
|
19930
20229
|
},
|
|
19931
|
-
|
|
20230
|
+
item2
|
|
19932
20231
|
);
|
|
19933
20232
|
}) })
|
|
19934
20233
|
]
|
|
@@ -20252,6 +20551,7 @@ exports.SSelect = SSelect2;
|
|
|
20252
20551
|
exports.SSplitter = SSplitter2;
|
|
20253
20552
|
exports.SStepper = SStepper;
|
|
20254
20553
|
exports.SSwitch = SSwitch;
|
|
20554
|
+
exports.SSystemActionButton = SSystemActionButton;
|
|
20255
20555
|
exports.STEPPER_SIZES = STEPPER_SIZES;
|
|
20256
20556
|
exports.STable = STable;
|
|
20257
20557
|
exports.STableBar = STableBar;
|
|
@@ -20267,6 +20567,11 @@ exports.SToggle = SToggle;
|
|
|
20267
20567
|
exports.STooltip = STooltip2;
|
|
20268
20568
|
exports.STree = STree2;
|
|
20269
20569
|
exports.STreeItem = STreeItem2;
|
|
20570
|
+
exports.SYSTEM_ACTION_BUTTON_COLORS = SYSTEM_ACTION_BUTTON_COLORS;
|
|
20571
|
+
exports.SYSTEM_ACTION_BUTTON_COLOR_CONFIG = SYSTEM_ACTION_BUTTON_COLOR_CONFIG;
|
|
20572
|
+
exports.SYSTEM_ACTION_BUTTON_LAYOUT = SYSTEM_ACTION_BUTTON_LAYOUT;
|
|
20573
|
+
exports.SYSTEM_ACTION_BUTTON_TYPES = SYSTEM_ACTION_BUTTON_TYPES;
|
|
20574
|
+
exports.SYSTEM_ACTION_BUTTON_TYPE_CONFIG = SYSTEM_ACTION_BUTTON_TYPE_CONFIG;
|
|
20270
20575
|
exports.TAG_COLORS = TAG_COLORS;
|
|
20271
20576
|
exports.TAG_SHAPES = TAG_SHAPES;
|
|
20272
20577
|
exports.TAG_SIZES = TAG_SIZES;
|