sellmate-design-system-react 9.0.0-beta.6 → 9.0.0-beta.7
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/README.md +63 -0
- package/dist/components/SList/README.md +0 -1
- package/dist/components/SList/SList.d.ts +0 -2
- package/dist/components/SPage/README.md +1 -0
- package/dist/components/SPage/SPage.d.ts +5 -0
- package/dist/components/STree/README.md +2 -0
- package/dist/components/STree/STree.d.ts +6 -0
- package/dist/components/STree/index.d.ts +1 -1
- package/dist/index.cjs +394 -85
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +393 -84
- package/dist/index.js.map +1 -1
- package/dist/lib/truncated-value-tooltip.d.ts +18 -0
- package/dist/llms-full.txt +3 -1
- package/dist/styles.css +59 -4
- package/dist/theme.css +5 -1
- package/eslint/index.mjs +5 -0
- package/eslint/rules/field-width-grade.d.mts +41 -0
- package/eslint/rules/field-width-grade.mjs +294 -0
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -7,7 +7,7 @@ var react = require('react');
|
|
|
7
7
|
var jsxRuntime = require('react/jsx-runtime');
|
|
8
8
|
var reactDom = require('react-dom');
|
|
9
9
|
var RCheckbox = require('@radix-ui/react-checkbox');
|
|
10
|
-
var
|
|
10
|
+
var RPopover10 = require('@radix-ui/react-popover');
|
|
11
11
|
var client = require('react-dom/client');
|
|
12
12
|
var RTooltip = require('@radix-ui/react-tooltip');
|
|
13
13
|
var RDropdown = require('@radix-ui/react-dropdown-menu');
|
|
@@ -34,7 +34,7 @@ function _interopNamespace(e) {
|
|
|
34
34
|
}
|
|
35
35
|
|
|
36
36
|
var RCheckbox__namespace = /*#__PURE__*/_interopNamespace(RCheckbox);
|
|
37
|
-
var
|
|
37
|
+
var RPopover10__namespace = /*#__PURE__*/_interopNamespace(RPopover10);
|
|
38
38
|
var RTooltip__namespace = /*#__PURE__*/_interopNamespace(RTooltip);
|
|
39
39
|
var RDropdown__namespace = /*#__PURE__*/_interopNamespace(RDropdown);
|
|
40
40
|
var RSwitch__namespace = /*#__PURE__*/_interopNamespace(RSwitch);
|
|
@@ -3445,7 +3445,7 @@ var SDraggableItemView = /* @__PURE__ */ react.forwardRef(
|
|
|
3445
3445
|
!disabled && !selected && !dragging && "hover:bg-(--cmp-listDraggableItem-bg-hover)",
|
|
3446
3446
|
hasSupportingText && supportingTextPosition === "bottom" ? dense ? "min-h-[52px]" : "min-h-[60px]" : dense ? "h-[32px]" : "h-[40px]",
|
|
3447
3447
|
paddingYClass,
|
|
3448
|
-
// 항목 사이 구분선은 리스트가
|
|
3448
|
+
// 항목 사이 구분선은 리스트가 그린다.
|
|
3449
3449
|
bordered && cn(
|
|
3450
3450
|
"rounded-(--cmp-listDraggableItem-radius-bordered) border border-(--cmp-listDraggableItem-border-default)",
|
|
3451
3451
|
!disabled && !selected && !dragging && "hover:border-(--cmp-listDraggableItem-bordered-border-hover)",
|
|
@@ -3653,7 +3653,7 @@ var SDraggableItemImpl = /* @__PURE__ */ react.forwardRef(function SDraggableIte
|
|
|
3653
3653
|
] });
|
|
3654
3654
|
});
|
|
3655
3655
|
var SDraggableItem2 = /* @__PURE__ */ withDisplayName(SDraggableItemImpl, "SDraggableItem");
|
|
3656
|
-
var SListImpl = /* @__PURE__ */ react.forwardRef(function SList({ className, children, useGap = false, usePadding = false,
|
|
3656
|
+
var SListImpl = /* @__PURE__ */ react.forwardRef(function SList({ className, children, useGap = false, usePadding = false, ...rest }, ref) {
|
|
3657
3657
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
3658
3658
|
"div",
|
|
3659
3659
|
{
|
|
@@ -3661,7 +3661,7 @@ var SListImpl = /* @__PURE__ */ react.forwardRef(function SList({ className, chi
|
|
|
3661
3661
|
className: cn(
|
|
3662
3662
|
useGap && "flex flex-col gap-(--cmp-list-group-gap)",
|
|
3663
3663
|
usePadding && "p-(--cmp-list-group-padding)",
|
|
3664
|
-
|
|
3664
|
+
"[&>*]:border-b [&>*]:border-(--cmp-listItem-border-default)",
|
|
3665
3665
|
className
|
|
3666
3666
|
),
|
|
3667
3667
|
...rest,
|
|
@@ -4033,7 +4033,7 @@ var SExpansionItem = /* @__PURE__ */ react.forwardRef(
|
|
|
4033
4033
|
ref,
|
|
4034
4034
|
className: cn(
|
|
4035
4035
|
"group/expansion-item relative overflow-hidden bg-(--cmp-listExpansionItem-title-bg-default)",
|
|
4036
|
-
// 항목 사이 구분선은 리스트가
|
|
4036
|
+
// 항목 사이 구분선은 리스트가 그린다.
|
|
4037
4037
|
// 보더 색은 시맨틱 토큰(border-default → hover strong → 펼침 accentLight)을 쓴다.
|
|
4038
4038
|
// TODO: expansionItem/bordered/radius 토큰 생성 후 rounded 고정값도 토큰으로 교체한다.
|
|
4039
4039
|
bordered && "rounded-[8px] border border-border-default hover:border-border-strong [&:has(>button:hover)]:border-border-strong",
|
|
@@ -4585,8 +4585,8 @@ function SGhostButton({
|
|
|
4585
4585
|
}
|
|
4586
4586
|
);
|
|
4587
4587
|
if (!hasTooltip) return btn;
|
|
4588
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
4589
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
4588
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(RPopover10__namespace.Root, { open, onOpenChange: setOpen, children: [
|
|
4589
|
+
/* @__PURE__ */ jsxRuntime.jsx(RPopover10__namespace.Anchor, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
4590
4590
|
"span",
|
|
4591
4591
|
{
|
|
4592
4592
|
className: cn("inline-flex", anchorClassName),
|
|
@@ -4598,8 +4598,8 @@ function SGhostButton({
|
|
|
4598
4598
|
children: btn
|
|
4599
4599
|
}
|
|
4600
4600
|
) }),
|
|
4601
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
4602
|
-
|
|
4601
|
+
/* @__PURE__ */ jsxRuntime.jsx(RPopover10__namespace.Portal, { container: portalContainer, children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
4602
|
+
RPopover10__namespace.Content,
|
|
4603
4603
|
{
|
|
4604
4604
|
side: "top",
|
|
4605
4605
|
sideOffset: 4,
|
|
@@ -4613,6 +4613,18 @@ function SGhostButton({
|
|
|
4613
4613
|
) })
|
|
4614
4614
|
] });
|
|
4615
4615
|
}
|
|
4616
|
+
var TREE_LABEL_TYPOGRAPHY = {
|
|
4617
|
+
sm: {
|
|
4618
|
+
default: "typo-body-sm-medium",
|
|
4619
|
+
selected: "typo-body-sm-bold",
|
|
4620
|
+
rowHeight: "h-[28px]"
|
|
4621
|
+
},
|
|
4622
|
+
md: {
|
|
4623
|
+
default: "typo-body-md-medium",
|
|
4624
|
+
selected: "typo-body-md-bold",
|
|
4625
|
+
rowHeight: "h-[32px]"
|
|
4626
|
+
}
|
|
4627
|
+
};
|
|
4616
4628
|
function collectIds(nodes) {
|
|
4617
4629
|
return nodes.flatMap((node) => [node.id, ...collectIds(node.children ?? [])]);
|
|
4618
4630
|
}
|
|
@@ -4645,6 +4657,7 @@ function getSelectionState(node, selectedSet, cascadeSelection) {
|
|
|
4645
4657
|
}
|
|
4646
4658
|
function TreeConnector({
|
|
4647
4659
|
guideline,
|
|
4660
|
+
size,
|
|
4648
4661
|
depth,
|
|
4649
4662
|
hasChildren,
|
|
4650
4663
|
isLast,
|
|
@@ -4652,6 +4665,8 @@ function TreeConnector({
|
|
|
4652
4665
|
}) {
|
|
4653
4666
|
if (depth <= 1) return null;
|
|
4654
4667
|
const ancestorConnectors = ancestorLast.slice(0, -1);
|
|
4668
|
+
const branchTop = size === "sm" ? "top-[13px]" : "top-[15px]";
|
|
4669
|
+
const nodeHeight = size === "sm" ? "h-[15px]" : "h-[17px]";
|
|
4655
4670
|
return /* @__PURE__ */ jsxRuntime.jsxs("span", { "aria-hidden": "true", className: "flex self-stretch", children: [
|
|
4656
4671
|
ancestorConnectors.map((last, index) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
4657
4672
|
"span",
|
|
@@ -4665,13 +4680,22 @@ function TreeConnector({
|
|
|
4665
4680
|
/* @__PURE__ */ jsxRuntime.jsxs("span", { className: "relative block w-[20px] shrink-0", children: [
|
|
4666
4681
|
guideline && !isLast && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "absolute bottom-0 left-[6px] top-[-1px] w-px bg-(--cmp-tree-connector-line-color)" }),
|
|
4667
4682
|
guideline && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
4668
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
4683
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
4684
|
+
"span",
|
|
4685
|
+
{
|
|
4686
|
+
className: cn(
|
|
4687
|
+
"absolute left-[6px] top-[-1px] w-px bg-(--cmp-tree-connector-line-color)",
|
|
4688
|
+
nodeHeight
|
|
4689
|
+
)
|
|
4690
|
+
}
|
|
4691
|
+
),
|
|
4669
4692
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
4670
4693
|
"span",
|
|
4671
4694
|
{
|
|
4672
4695
|
"data-tree-connector-branch": hasChildren ? "parent" : "leaf",
|
|
4673
4696
|
className: cn(
|
|
4674
|
-
"absolute left-[6px]
|
|
4697
|
+
"absolute left-[6px] h-px bg-(--cmp-tree-connector-line-color)",
|
|
4698
|
+
branchTop,
|
|
4675
4699
|
hasChildren ? "w-[14px]" : "w-[calc(14px+var(--cmp-tree-item-arrow-icon))]"
|
|
4676
4700
|
)
|
|
4677
4701
|
}
|
|
@@ -4684,9 +4708,12 @@ function STreeAllItem({
|
|
|
4684
4708
|
selected,
|
|
4685
4709
|
indeterminate,
|
|
4686
4710
|
border,
|
|
4711
|
+
size,
|
|
4687
4712
|
onSelect
|
|
4688
4713
|
}) {
|
|
4689
4714
|
const checkboxValue = indeterminate ? null : selected;
|
|
4715
|
+
const typography = TREE_LABEL_TYPOGRAPHY[size];
|
|
4716
|
+
const labelTypo = selected || indeterminate ? typography.selected : typography.default;
|
|
4690
4717
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
4691
4718
|
"div",
|
|
4692
4719
|
{
|
|
@@ -4695,17 +4722,18 @@ function STreeAllItem({
|
|
|
4695
4722
|
"aria-selected": selected,
|
|
4696
4723
|
onClick: onSelect,
|
|
4697
4724
|
className: cn(
|
|
4698
|
-
"group/tree-item box-border flex
|
|
4725
|
+
"group/tree-item box-border flex w-full cursor-pointer items-center overflow-hidden bg-(--cmp-tree-item-bg-default) px-(--cmp-tree-item-paddingX) text-left hover:bg-(--cmp-tree-item-bg-hover)",
|
|
4726
|
+
typography.rowHeight,
|
|
4699
4727
|
border && "border-b border-(--cmp-tree-item-border-default)"
|
|
4700
4728
|
),
|
|
4701
|
-
children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "box-border flex
|
|
4729
|
+
children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "box-border flex min-w-0 flex-1 items-center gap-(--cmp-tree-item-contentGap)", children: [
|
|
4702
4730
|
/* @__PURE__ */ jsxRuntime.jsx("span", { onClick: (event) => event.stopPropagation(), className: "flex shrink-0", children: /* @__PURE__ */ jsxRuntime.jsx(SCheckbox, { value: checkboxValue, onValueChange: () => onSelect() }) }),
|
|
4703
4731
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
4704
4732
|
"span",
|
|
4705
4733
|
{
|
|
4706
4734
|
className: cn(
|
|
4707
|
-
"block min-w-0 flex-1 truncate
|
|
4708
|
-
|
|
4735
|
+
"block min-w-0 flex-1 truncate py-(--cmp-tree-item-paddingY) text-(--cmp-tree-item-text-default)",
|
|
4736
|
+
labelTypo
|
|
4709
4737
|
),
|
|
4710
4738
|
children: "\uC804\uCCB4"
|
|
4711
4739
|
}
|
|
@@ -4725,6 +4753,7 @@ var STreeItemImpl = /* @__PURE__ */ react.forwardRef(function STreeItem({
|
|
|
4725
4753
|
border = true,
|
|
4726
4754
|
indeterminate = false,
|
|
4727
4755
|
selectable = true,
|
|
4756
|
+
size = "sm",
|
|
4728
4757
|
leading,
|
|
4729
4758
|
trailing,
|
|
4730
4759
|
onToggle,
|
|
@@ -4736,6 +4765,7 @@ var STreeItemImpl = /* @__PURE__ */ react.forwardRef(function STreeItem({
|
|
|
4736
4765
|
const renderState = {
|
|
4737
4766
|
node,
|
|
4738
4767
|
depth,
|
|
4768
|
+
size,
|
|
4739
4769
|
expanded,
|
|
4740
4770
|
selected,
|
|
4741
4771
|
indeterminate,
|
|
@@ -4745,6 +4775,8 @@ var STreeItemImpl = /* @__PURE__ */ react.forwardRef(function STreeItem({
|
|
|
4745
4775
|
const leadingNode = typeof leading === "function" ? leading(renderState) : leading;
|
|
4746
4776
|
const trailingNode = typeof trailing === "function" ? trailing(renderState) : trailing;
|
|
4747
4777
|
const checkboxValue = indeterminate ? null : selected;
|
|
4778
|
+
const typography = TREE_LABEL_TYPOGRAPHY[size];
|
|
4779
|
+
const labelTypo = selected || indeterminate ? typography.selected : typography.default;
|
|
4748
4780
|
const handleSelect = (event) => {
|
|
4749
4781
|
if (node.disabled) return;
|
|
4750
4782
|
onTreeSelect?.(node, event);
|
|
@@ -4764,7 +4796,8 @@ var STreeItemImpl = /* @__PURE__ */ react.forwardRef(function STreeItem({
|
|
|
4764
4796
|
"aria-disabled": node.disabled || void 0,
|
|
4765
4797
|
onClick: handleRowClick,
|
|
4766
4798
|
className: cn(
|
|
4767
|
-
"group/tree-item box-border flex
|
|
4799
|
+
"group/tree-item box-border flex w-full items-center gap-(--cmp-tree-item-rowGap) overflow-hidden bg-(--cmp-tree-item-bg-default) px-(--cmp-tree-item-paddingX) text-left",
|
|
4800
|
+
typography.rowHeight,
|
|
4768
4801
|
border && "border-b border-(--cmp-tree-item-border-default)",
|
|
4769
4802
|
!node.disabled && "hover:bg-(--cmp-tree-item-bg-hover)",
|
|
4770
4803
|
node.disabled && "cursor-not-allowed opacity-60",
|
|
@@ -4777,13 +4810,14 @@ var STreeItemImpl = /* @__PURE__ */ react.forwardRef(function STreeItem({
|
|
|
4777
4810
|
TreeConnector,
|
|
4778
4811
|
{
|
|
4779
4812
|
guideline,
|
|
4813
|
+
size,
|
|
4780
4814
|
depth,
|
|
4781
4815
|
hasChildren,
|
|
4782
4816
|
isLast,
|
|
4783
4817
|
ancestorLast
|
|
4784
4818
|
}
|
|
4785
4819
|
),
|
|
4786
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "box-border flex
|
|
4820
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "box-border flex min-w-0 flex-1 items-center gap-(--cmp-tree-item-contentGap)", children: [
|
|
4787
4821
|
hasChildren ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
4788
4822
|
SGhostButton,
|
|
4789
4823
|
{
|
|
@@ -4825,8 +4859,8 @@ var STreeItemImpl = /* @__PURE__ */ react.forwardRef(function STreeItem({
|
|
|
4825
4859
|
if (!node.disabled && selectable) onTreeSelect?.(node, event);
|
|
4826
4860
|
},
|
|
4827
4861
|
className: cn(
|
|
4828
|
-
"block min-w-0 flex-1 truncate
|
|
4829
|
-
|
|
4862
|
+
"block min-w-0 flex-1 truncate py-(--cmp-tree-item-paddingY) text-(--cmp-tree-item-text-default)",
|
|
4863
|
+
labelTypo,
|
|
4830
4864
|
node.disabled ? "cursor-not-allowed" : selectable ? "cursor-pointer" : void 0
|
|
4831
4865
|
),
|
|
4832
4866
|
children: node.label
|
|
@@ -4846,6 +4880,7 @@ var STreeImpl = /* @__PURE__ */ react.forwardRef(function STree({
|
|
|
4846
4880
|
expandedIds,
|
|
4847
4881
|
defaultExpandedIds,
|
|
4848
4882
|
selectable = true,
|
|
4883
|
+
size = "sm",
|
|
4849
4884
|
useAll = false,
|
|
4850
4885
|
cascadeSelection = true,
|
|
4851
4886
|
guideline = true,
|
|
@@ -4919,6 +4954,7 @@ var STreeImpl = /* @__PURE__ */ react.forwardRef(function STree({
|
|
|
4919
4954
|
selected,
|
|
4920
4955
|
indeterminate,
|
|
4921
4956
|
selectable,
|
|
4957
|
+
size,
|
|
4922
4958
|
guideline,
|
|
4923
4959
|
border,
|
|
4924
4960
|
leading,
|
|
@@ -4954,6 +4990,7 @@ var STreeImpl = /* @__PURE__ */ react.forwardRef(function STree({
|
|
|
4954
4990
|
selected: allSelected,
|
|
4955
4991
|
indeterminate: allIndeterminate,
|
|
4956
4992
|
border,
|
|
4993
|
+
size,
|
|
4957
4994
|
onSelect: updateAllSelected
|
|
4958
4995
|
}
|
|
4959
4996
|
),
|
|
@@ -5138,14 +5175,14 @@ var STooltipImpl = /* @__PURE__ */ react.forwardRef(function STooltip({
|
|
|
5138
5175
|
...style,
|
|
5139
5176
|
...contentPropsStyle
|
|
5140
5177
|
};
|
|
5141
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
5178
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(RPopover10__namespace.Root, { open, onOpenChange: setOpenState, children: [
|
|
5142
5179
|
isNone ? (
|
|
5143
5180
|
// 트리거 없음: children 을 래퍼 없이 그대로 앵커로 쓴다 (소비자 레이아웃 보존).
|
|
5144
5181
|
// mouse/focus 핸들러가 없으므로 useClose 없이도 자동 닫힘이 발생하지 않는다.
|
|
5145
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
5182
|
+
/* @__PURE__ */ jsxRuntime.jsx(RPopover10__namespace.Anchor, { asChild: true, children: triggerNode })
|
|
5146
5183
|
) : isHover ? (
|
|
5147
5184
|
// hover: Anchor(위치 기준) + 직접 mouse 핸들러 — 클릭으로 토글되지 않도록 Trigger 미사용
|
|
5148
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
5185
|
+
/* @__PURE__ */ jsxRuntime.jsx(RPopover10__namespace.Anchor, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
5149
5186
|
"span",
|
|
5150
5187
|
{
|
|
5151
5188
|
className: "inline-flex",
|
|
@@ -5156,9 +5193,9 @@ var STooltipImpl = /* @__PURE__ */ react.forwardRef(function STooltip({
|
|
|
5156
5193
|
children: triggerNode
|
|
5157
5194
|
}
|
|
5158
5195
|
) })
|
|
5159
|
-
) : /* @__PURE__ */ jsxRuntime.jsx(
|
|
5160
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
5161
|
-
|
|
5196
|
+
) : /* @__PURE__ */ jsxRuntime.jsx(RPopover10__namespace.Trigger, { asChild: true, children: triggerNode }),
|
|
5197
|
+
/* @__PURE__ */ jsxRuntime.jsx(RPopover10__namespace.Portal, { container: portalContainer, children: /* @__PURE__ */ jsxRuntime.jsxs(
|
|
5198
|
+
RPopover10__namespace.Content,
|
|
5162
5199
|
{
|
|
5163
5200
|
side: placement,
|
|
5164
5201
|
sideOffset,
|
|
@@ -5192,7 +5229,7 @@ var STooltipImpl = /* @__PURE__ */ react.forwardRef(function STooltip({
|
|
|
5192
5229
|
}
|
|
5193
5230
|
)
|
|
5194
5231
|
] }),
|
|
5195
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
5232
|
+
/* @__PURE__ */ jsxRuntime.jsx(RPopover10__namespace.Arrow, { width: 16, height: 12, style: { fill: bg } })
|
|
5196
5233
|
]
|
|
5197
5234
|
}
|
|
5198
5235
|
) })
|
|
@@ -6479,10 +6516,10 @@ function SPopover({
|
|
|
6479
6516
|
const descColor = type === "default" ? "var(--cmp-popover-default-description)" : "var(--cmp-popover-light-description)";
|
|
6480
6517
|
const leftLinkLabelClass = type === "default" ? "text-[color:var(--cmp-popover-default-subAction)]" : "text-[color:var(--cmp-popover-light-subAction)]";
|
|
6481
6518
|
const triggerNode = trigger ?? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "inline-flex cursor-pointer", "aria-label": ariaLabel, children: /* @__PURE__ */ jsxRuntime.jsx(SIcon, { name: icon, size: iconSize, color }) });
|
|
6482
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
6483
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
6484
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
6485
|
-
|
|
6519
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(RPopover10__namespace.Root, { open: actualOpen, onOpenChange: setOpen, children: [
|
|
6520
|
+
/* @__PURE__ */ jsxRuntime.jsx(RPopover10__namespace.Trigger, { asChild: true, children: triggerNode }),
|
|
6521
|
+
/* @__PURE__ */ jsxRuntime.jsx(RPopover10__namespace.Portal, { container: portalContainer, children: /* @__PURE__ */ jsxRuntime.jsxs(
|
|
6522
|
+
RPopover10__namespace.Content,
|
|
6486
6523
|
{
|
|
6487
6524
|
side: placement,
|
|
6488
6525
|
sideOffset: 8,
|
|
@@ -6548,7 +6585,7 @@ function SPopover({
|
|
|
6548
6585
|
]
|
|
6549
6586
|
}
|
|
6550
6587
|
),
|
|
6551
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
6588
|
+
/* @__PURE__ */ jsxRuntime.jsx(RPopover10__namespace.Arrow, { width: 16, height: 12, style: { fill: bg } })
|
|
6552
6589
|
]
|
|
6553
6590
|
}
|
|
6554
6591
|
) })
|
|
@@ -6579,7 +6616,7 @@ function SPortal({
|
|
|
6579
6616
|
const portalContainer = usePortalContainer();
|
|
6580
6617
|
const { minWidth: styleMinWidth, maxWidth: styleMaxWidth, ...restStyle } = style ?? {};
|
|
6581
6618
|
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
6582
|
-
|
|
6619
|
+
RPopover10__namespace.Root,
|
|
6583
6620
|
{
|
|
6584
6621
|
open,
|
|
6585
6622
|
onOpenChange: (next) => {
|
|
@@ -6587,9 +6624,9 @@ function SPortal({
|
|
|
6587
6624
|
if (!next) onClose?.();
|
|
6588
6625
|
},
|
|
6589
6626
|
children: [
|
|
6590
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
6591
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
6592
|
-
|
|
6627
|
+
/* @__PURE__ */ jsxRuntime.jsx(RPopover10__namespace.Anchor, { virtualRef: anchorRef }),
|
|
6628
|
+
/* @__PURE__ */ jsxRuntime.jsx(RPopover10__namespace.Portal, { container: portalContainer, children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
6629
|
+
RPopover10__namespace.Content,
|
|
6593
6630
|
{
|
|
6594
6631
|
side: placement,
|
|
6595
6632
|
align,
|
|
@@ -6787,10 +6824,10 @@ function SGuide({
|
|
|
6787
6824
|
);
|
|
6788
6825
|
if (isNotion)
|
|
6789
6826
|
return /* @__PURE__ */ jsxRuntime.jsx("span", { className, style, children: trigger });
|
|
6790
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
6791
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
6792
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
6793
|
-
|
|
6827
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(RPopover10__namespace.Root, { open, onOpenChange: setOpen, children: [
|
|
6828
|
+
/* @__PURE__ */ jsxRuntime.jsx(RPopover10__namespace.Trigger, { asChild: true, children: trigger }),
|
|
6829
|
+
/* @__PURE__ */ jsxRuntime.jsx(RPopover10__namespace.Portal, { container: portalContainer, children: /* @__PURE__ */ jsxRuntime.jsxs(
|
|
6830
|
+
RPopover10__namespace.Content,
|
|
6794
6831
|
{
|
|
6795
6832
|
side: "bottom",
|
|
6796
6833
|
align: "start",
|
|
@@ -8871,10 +8908,10 @@ var SGnb = /* @__PURE__ */ react.forwardRef(function SGnb2({
|
|
|
8871
8908
|
}
|
|
8872
8909
|
),
|
|
8873
8910
|
header === "fix" && menuResizeHandle,
|
|
8874
|
-
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
8875
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
8876
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
8877
|
-
|
|
8911
|
+
/* @__PURE__ */ jsxRuntime.jsxs(RPopover10__namespace.Root, { open: labelTip !== null, onOpenChange: (open) => !open && setLabelTip(null), children: [
|
|
8912
|
+
/* @__PURE__ */ jsxRuntime.jsx(RPopover10__namespace.Anchor, { virtualRef: labelTipAnchorRef }),
|
|
8913
|
+
/* @__PURE__ */ jsxRuntime.jsx(RPopover10__namespace.Portal, { container: portalContainer, children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
8914
|
+
RPopover10__namespace.Content,
|
|
8878
8915
|
{
|
|
8879
8916
|
side: "right",
|
|
8880
8917
|
sideOffset: 4,
|
|
@@ -8945,13 +8982,155 @@ var SPageHeader = /* @__PURE__ */ withDisplayName(
|
|
|
8945
8982
|
);
|
|
8946
8983
|
var MIN_CONTENT_WIDTH = `calc(var(${SLAYOUT_MIN_WIDTH_VAR}, 0px) - 100cqw + 100%)`;
|
|
8947
8984
|
var BACKGROUND_CLASS = {
|
|
8948
|
-
frame:
|
|
8949
|
-
neutral:
|
|
8950
|
-
screen:
|
|
8985
|
+
frame: "bg-[var(--sys-color-bg-frame)]",
|
|
8986
|
+
neutral: "bg-[var(--sys-color-bg-neutralLight)]",
|
|
8987
|
+
screen: "bg-[var(--sys-color-bg-screen)]"
|
|
8988
|
+
};
|
|
8989
|
+
var NATIVE_SCROLLBAR_BACKGROUND_CLASS = {
|
|
8990
|
+
frame: `${SCROLLBAR_TRACK_BORDER_CLASS} ${SCROLLBAR_TRACK_BG_CLASS}`,
|
|
8991
|
+
neutral: `${SCROLLBAR_TRACK_BORDER_CLASS} ${SCROLLBAR_TRACK_BG_WHITE_CLASS}`,
|
|
8992
|
+
screen: `${SCROLLBAR_TRACK_BORDER_CLASS} ${SCROLLBAR_TRACK_BG_CLASS}`
|
|
8951
8993
|
};
|
|
8994
|
+
var SCROLLBAR_SIZE = 12;
|
|
8995
|
+
var SCROLLBAR_MIN_THUMB_SIZE = 32;
|
|
8996
|
+
var getMetrics = (viewportSize, contentSize, scrollOffset) => {
|
|
8997
|
+
if (contentSize <= viewportSize) {
|
|
8998
|
+
return { visible: false, thumbSize: 0, thumbOffset: 0 };
|
|
8999
|
+
}
|
|
9000
|
+
const trackSize = viewportSize;
|
|
9001
|
+
const maxScrollOffset = contentSize - viewportSize;
|
|
9002
|
+
const thumbSize = Math.min(
|
|
9003
|
+
trackSize,
|
|
9004
|
+
Math.max(SCROLLBAR_MIN_THUMB_SIZE, viewportSize / contentSize * trackSize)
|
|
9005
|
+
);
|
|
9006
|
+
const maxThumbOffset = trackSize - thumbSize;
|
|
9007
|
+
const thumbOffset = maxScrollOffset > 0 ? scrollOffset / maxScrollOffset * maxThumbOffset : 0;
|
|
9008
|
+
return { visible: true, thumbSize, thumbOffset };
|
|
9009
|
+
};
|
|
9010
|
+
var setForwardedRef = (ref, node) => {
|
|
9011
|
+
if (typeof ref === "function") {
|
|
9012
|
+
ref(node);
|
|
9013
|
+
return;
|
|
9014
|
+
}
|
|
9015
|
+
if (ref) ref.current = node;
|
|
9016
|
+
};
|
|
9017
|
+
function SPageOverlayScrollbars({ scrollRef }) {
|
|
9018
|
+
const [vertical, setVertical] = react.useState({
|
|
9019
|
+
visible: false,
|
|
9020
|
+
thumbSize: 0,
|
|
9021
|
+
thumbOffset: 0
|
|
9022
|
+
});
|
|
9023
|
+
const [horizontal, setHorizontal] = react.useState({
|
|
9024
|
+
visible: false,
|
|
9025
|
+
thumbSize: 0,
|
|
9026
|
+
thumbOffset: 0
|
|
9027
|
+
});
|
|
9028
|
+
const update = react.useCallback(() => {
|
|
9029
|
+
const el = scrollRef.current;
|
|
9030
|
+
if (!el) return;
|
|
9031
|
+
setVertical(getMetrics(el.clientHeight, el.scrollHeight, el.scrollTop));
|
|
9032
|
+
setHorizontal(getMetrics(el.clientWidth, el.scrollWidth, el.scrollLeft));
|
|
9033
|
+
}, [scrollRef]);
|
|
9034
|
+
react.useEffect(() => {
|
|
9035
|
+
const el = scrollRef.current;
|
|
9036
|
+
if (!el) return;
|
|
9037
|
+
update();
|
|
9038
|
+
el.addEventListener("scroll", update, { passive: true });
|
|
9039
|
+
const observer = typeof ResizeObserver === "undefined" ? null : new ResizeObserver(update);
|
|
9040
|
+
observer?.observe(el);
|
|
9041
|
+
if (el.firstElementChild) observer?.observe(el.firstElementChild);
|
|
9042
|
+
return () => {
|
|
9043
|
+
el.removeEventListener("scroll", update);
|
|
9044
|
+
observer?.disconnect();
|
|
9045
|
+
};
|
|
9046
|
+
}, [scrollRef, update]);
|
|
9047
|
+
const dragVertical = (startEvent) => {
|
|
9048
|
+
const el = scrollRef.current;
|
|
9049
|
+
if (!el || !vertical.visible) return;
|
|
9050
|
+
startEvent.preventDefault();
|
|
9051
|
+
startEvent.currentTarget.setPointerCapture(startEvent.pointerId);
|
|
9052
|
+
const startPointer = startEvent.clientY;
|
|
9053
|
+
const startScrollTop = el.scrollTop;
|
|
9054
|
+
const maxThumbOffset = el.clientHeight - vertical.thumbSize;
|
|
9055
|
+
const maxScrollTop = el.scrollHeight - el.clientHeight;
|
|
9056
|
+
if (maxThumbOffset <= 0 || maxScrollTop <= 0) return;
|
|
9057
|
+
const onPointerMove = (moveEvent) => {
|
|
9058
|
+
const delta = moveEvent.clientY - startPointer;
|
|
9059
|
+
el.scrollTop = startScrollTop + delta / maxThumbOffset * maxScrollTop;
|
|
9060
|
+
};
|
|
9061
|
+
const onPointerUp = () => {
|
|
9062
|
+
window.removeEventListener("pointermove", onPointerMove);
|
|
9063
|
+
window.removeEventListener("pointerup", onPointerUp);
|
|
9064
|
+
};
|
|
9065
|
+
window.addEventListener("pointermove", onPointerMove);
|
|
9066
|
+
window.addEventListener("pointerup", onPointerUp, { once: true });
|
|
9067
|
+
};
|
|
9068
|
+
const dragHorizontal = (startEvent) => {
|
|
9069
|
+
const el = scrollRef.current;
|
|
9070
|
+
if (!el || !horizontal.visible) return;
|
|
9071
|
+
startEvent.preventDefault();
|
|
9072
|
+
startEvent.currentTarget.setPointerCapture(startEvent.pointerId);
|
|
9073
|
+
const startPointer = startEvent.clientX;
|
|
9074
|
+
const startScrollLeft = el.scrollLeft;
|
|
9075
|
+
const maxThumbOffset = el.clientWidth - horizontal.thumbSize;
|
|
9076
|
+
const maxScrollLeft = el.scrollWidth - el.clientWidth;
|
|
9077
|
+
if (maxThumbOffset <= 0 || maxScrollLeft <= 0) return;
|
|
9078
|
+
const onPointerMove = (moveEvent) => {
|
|
9079
|
+
const delta = moveEvent.clientX - startPointer;
|
|
9080
|
+
el.scrollLeft = startScrollLeft + delta / maxThumbOffset * maxScrollLeft;
|
|
9081
|
+
};
|
|
9082
|
+
const onPointerUp = () => {
|
|
9083
|
+
window.removeEventListener("pointermove", onPointerMove);
|
|
9084
|
+
window.removeEventListener("pointerup", onPointerUp);
|
|
9085
|
+
};
|
|
9086
|
+
window.addEventListener("pointermove", onPointerMove);
|
|
9087
|
+
window.addEventListener("pointerup", onPointerUp, { once: true });
|
|
9088
|
+
};
|
|
9089
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
9090
|
+
vertical.visible && /* @__PURE__ */ jsxRuntime.jsx(
|
|
9091
|
+
"div",
|
|
9092
|
+
{
|
|
9093
|
+
"aria-hidden": "true",
|
|
9094
|
+
className: "pointer-events-none absolute bottom-0 right-0 top-0 z-[1] w-[12px]",
|
|
9095
|
+
style: { bottom: horizontal.visible ? SCROLLBAR_SIZE : 0 },
|
|
9096
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
9097
|
+
"div",
|
|
9098
|
+
{
|
|
9099
|
+
className: "pointer-events-auto absolute right-[2px] w-[8px] cursor-default touch-none rounded-full bg-[var(--color-grey-45)]",
|
|
9100
|
+
style: {
|
|
9101
|
+
height: vertical.thumbSize,
|
|
9102
|
+
transform: `translateY(${vertical.thumbOffset}px)`
|
|
9103
|
+
},
|
|
9104
|
+
onPointerDown: dragVertical
|
|
9105
|
+
}
|
|
9106
|
+
)
|
|
9107
|
+
}
|
|
9108
|
+
),
|
|
9109
|
+
horizontal.visible && /* @__PURE__ */ jsxRuntime.jsx(
|
|
9110
|
+
"div",
|
|
9111
|
+
{
|
|
9112
|
+
"aria-hidden": "true",
|
|
9113
|
+
className: "pointer-events-none absolute bottom-0 left-0 right-0 z-[1] h-[12px]",
|
|
9114
|
+
style: { right: vertical.visible ? SCROLLBAR_SIZE : 0 },
|
|
9115
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
9116
|
+
"div",
|
|
9117
|
+
{
|
|
9118
|
+
className: "pointer-events-auto absolute bottom-[2px] h-[8px] cursor-default touch-none rounded-full bg-[var(--color-grey-45)]",
|
|
9119
|
+
style: {
|
|
9120
|
+
width: horizontal.thumbSize,
|
|
9121
|
+
transform: `translateX(${horizontal.thumbOffset}px)`
|
|
9122
|
+
},
|
|
9123
|
+
onPointerDown: dragHorizontal
|
|
9124
|
+
}
|
|
9125
|
+
)
|
|
9126
|
+
}
|
|
9127
|
+
)
|
|
9128
|
+
] });
|
|
9129
|
+
}
|
|
8952
9130
|
var SPage = /* @__PURE__ */ react.forwardRef(function SPage2({
|
|
8953
9131
|
background = "frame",
|
|
8954
9132
|
scrollEndSpacing = true,
|
|
9133
|
+
overlayScrollbar = false,
|
|
8955
9134
|
contentHeight = "auto",
|
|
8956
9135
|
header,
|
|
8957
9136
|
className,
|
|
@@ -8962,6 +9141,14 @@ var SPage = /* @__PURE__ */ react.forwardRef(function SPage2({
|
|
|
8962
9141
|
}, ref) {
|
|
8963
9142
|
const layout = react.useContext(SLayoutContext);
|
|
8964
9143
|
const gridStyle = layout?.header === "full" ? { gridArea: "page" } : void 0;
|
|
9144
|
+
const scrollRef = react.useRef(null);
|
|
9145
|
+
const setMainRef = react.useCallback(
|
|
9146
|
+
(node) => {
|
|
9147
|
+
scrollRef.current = node;
|
|
9148
|
+
setForwardedRef(ref, node);
|
|
9149
|
+
},
|
|
9150
|
+
[ref]
|
|
9151
|
+
);
|
|
8965
9152
|
const [scrolled, setScrolled] = react.useState(false);
|
|
8966
9153
|
const handleScroll = (e) => {
|
|
8967
9154
|
onScroll?.(e);
|
|
@@ -8971,21 +9158,54 @@ var SPage = /* @__PURE__ */ react.forwardRef(function SPage2({
|
|
|
8971
9158
|
const main = /* @__PURE__ */ jsxRuntime.jsx(
|
|
8972
9159
|
"main",
|
|
8973
9160
|
{
|
|
8974
|
-
ref,
|
|
9161
|
+
ref: setMainRef,
|
|
8975
9162
|
className: cn(
|
|
8976
9163
|
"box-border min-h-0 min-w-0 flex-1 overflow-auto p-[var(--cmp-pageBody-padding-default)]",
|
|
9164
|
+
overlayScrollbar && "h-full",
|
|
8977
9165
|
!fill && scrollEndSpacing && "pb-[var(--cmp-pageBody-padding-scrollEnd)]",
|
|
8978
|
-
SCROLLBAR_CLASS
|
|
9166
|
+
overlayScrollbar ? SCROLLBAR_HIDDEN_CLASS : `${SCROLLBAR_CLASS} ${NATIVE_SCROLLBAR_BACKGROUND_CLASS[background]}`,
|
|
8979
9167
|
BACKGROUND_CLASS[background],
|
|
8980
9168
|
className
|
|
8981
9169
|
),
|
|
8982
|
-
style: header == null ? { ...gridStyle, ...style } : style,
|
|
9170
|
+
style: header == null && !overlayScrollbar ? { ...gridStyle, ...style } : style,
|
|
8983
9171
|
onScroll: handleScroll,
|
|
8984
9172
|
...rest,
|
|
8985
9173
|
children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn(fill && "h-full"), style: { minWidth: MIN_CONTENT_WIDTH }, children })
|
|
8986
9174
|
}
|
|
8987
9175
|
);
|
|
8988
|
-
if (
|
|
9176
|
+
if (!overlayScrollbar) {
|
|
9177
|
+
if (header == null) return main;
|
|
9178
|
+
return (
|
|
9179
|
+
// fix 가 아닌 헤더는 자기 배경이 투명이라(SPageHeader.tsx) 이 배경이 그대로 비친다.
|
|
9180
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
9181
|
+
"div",
|
|
9182
|
+
{
|
|
9183
|
+
className: cn("flex min-h-0 min-w-0 flex-1 flex-col", BACKGROUND_CLASS[background]),
|
|
9184
|
+
style: gridStyle,
|
|
9185
|
+
children: [
|
|
9186
|
+
/* @__PURE__ */ jsxRuntime.jsx(SPageHeader, { ...header, scrolled }),
|
|
9187
|
+
main
|
|
9188
|
+
]
|
|
9189
|
+
}
|
|
9190
|
+
)
|
|
9191
|
+
);
|
|
9192
|
+
}
|
|
9193
|
+
if (header == null) {
|
|
9194
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
9195
|
+
"div",
|
|
9196
|
+
{
|
|
9197
|
+
className: cn(
|
|
9198
|
+
"relative min-h-0 min-w-0 flex-1 overflow-hidden",
|
|
9199
|
+
BACKGROUND_CLASS[background]
|
|
9200
|
+
),
|
|
9201
|
+
style: gridStyle,
|
|
9202
|
+
children: [
|
|
9203
|
+
main,
|
|
9204
|
+
/* @__PURE__ */ jsxRuntime.jsx(SPageOverlayScrollbars, { scrollRef })
|
|
9205
|
+
]
|
|
9206
|
+
}
|
|
9207
|
+
);
|
|
9208
|
+
}
|
|
8989
9209
|
return (
|
|
8990
9210
|
// fix 가 아닌 헤더는 자기 배경이 투명이라(SPageHeader.tsx) 이 배경이 그대로 비친다 —
|
|
8991
9211
|
// 그래서 SPage 의 background 를 main 뿐 아니라 여기에도 칠한다(스크롤바 관련 클래스는
|
|
@@ -8997,7 +9217,10 @@ var SPage = /* @__PURE__ */ react.forwardRef(function SPage2({
|
|
|
8997
9217
|
style: gridStyle,
|
|
8998
9218
|
children: [
|
|
8999
9219
|
/* @__PURE__ */ jsxRuntime.jsx(SPageHeader, { ...header, scrolled }),
|
|
9000
|
-
|
|
9220
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative min-h-0 min-w-0 flex-1 overflow-hidden", children: [
|
|
9221
|
+
main,
|
|
9222
|
+
/* @__PURE__ */ jsxRuntime.jsx(SPageOverlayScrollbars, { scrollRef })
|
|
9223
|
+
] })
|
|
9001
9224
|
]
|
|
9002
9225
|
}
|
|
9003
9226
|
)
|
|
@@ -11304,6 +11527,67 @@ var STableBar = /* @__PURE__ */ react.forwardRef(function STableBar2({ total, se
|
|
|
11304
11527
|
|
|
11305
11528
|
// src/lib/autofill.ts
|
|
11306
11529
|
var AUTOFILL_RESET_CLASS = "autofill:[-webkit-text-fill-color:currentColor] autofill:[box-shadow:0_0_0_1000px_var(--sys-color-field-bg-default)_inset] autofill:[transition:background-color_5000s_ease-in-out_0s] [&:-webkit-autofill]:[-webkit-text-fill-color:currentColor] [&:-webkit-autofill]:[box-shadow:0_0_0_1000px_var(--sys-color-field-bg-default)_inset] [&:-webkit-autofill]:[transition:background-color_5000s_ease-in-out_0s]";
|
|
11530
|
+
var HIDE_DELAY_MS2 = 100;
|
|
11531
|
+
function mergeRefs(...refs) {
|
|
11532
|
+
return (node) => {
|
|
11533
|
+
for (const ref of refs) {
|
|
11534
|
+
if (!ref) continue;
|
|
11535
|
+
if (typeof ref === "function") ref(node);
|
|
11536
|
+
else ref.current = node;
|
|
11537
|
+
}
|
|
11538
|
+
};
|
|
11539
|
+
}
|
|
11540
|
+
function useTruncatedValueTooltip({
|
|
11541
|
+
enabled,
|
|
11542
|
+
text
|
|
11543
|
+
}) {
|
|
11544
|
+
const portalContainer = usePortalContainer();
|
|
11545
|
+
const elRef = react.useRef(null);
|
|
11546
|
+
const [open, setOpen] = react.useState(false);
|
|
11547
|
+
const hideTimer = react.useRef(void 0);
|
|
11548
|
+
const cancelHide = react.useCallback(() => {
|
|
11549
|
+
if (hideTimer.current) {
|
|
11550
|
+
clearTimeout(hideTimer.current);
|
|
11551
|
+
hideTimer.current = void 0;
|
|
11552
|
+
}
|
|
11553
|
+
}, []);
|
|
11554
|
+
const startHide = react.useCallback(() => {
|
|
11555
|
+
cancelHide();
|
|
11556
|
+
hideTimer.current = setTimeout(() => setOpen(false), HIDE_DELAY_MS2);
|
|
11557
|
+
}, [cancelHide]);
|
|
11558
|
+
const onMouseEnter = react.useCallback(() => {
|
|
11559
|
+
cancelHide();
|
|
11560
|
+
const el = elRef.current;
|
|
11561
|
+
if (!el) return;
|
|
11562
|
+
if (el.scrollWidth - el.clientWidth > 1) setOpen(true);
|
|
11563
|
+
}, [cancelHide]);
|
|
11564
|
+
react.useEffect(() => {
|
|
11565
|
+
if (!enabled || text === "") setOpen(false);
|
|
11566
|
+
}, [enabled, text]);
|
|
11567
|
+
react.useEffect(() => cancelHide, [cancelHide]);
|
|
11568
|
+
const active = enabled && text !== "";
|
|
11569
|
+
return {
|
|
11570
|
+
valueRef: elRef,
|
|
11571
|
+
onMouseEnter: active ? onMouseEnter : cancelHide,
|
|
11572
|
+
onMouseLeave: active ? startHide : cancelHide,
|
|
11573
|
+
tooltip: active ? /* @__PURE__ */ jsxRuntime.jsxs(RPopover10__namespace.Root, { open, onOpenChange: setOpen, children: [
|
|
11574
|
+
/* @__PURE__ */ jsxRuntime.jsx(RPopover10__namespace.Anchor, { virtualRef: elRef }),
|
|
11575
|
+
/* @__PURE__ */ jsxRuntime.jsx(RPopover10__namespace.Portal, { container: portalContainer, children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
11576
|
+
RPopover10__namespace.Content,
|
|
11577
|
+
{
|
|
11578
|
+
side: "top",
|
|
11579
|
+
sideOffset: 4,
|
|
11580
|
+
"aria-hidden": true,
|
|
11581
|
+
className: cn("z-50", FLOATING_SLIDE_ANIM),
|
|
11582
|
+
onOpenAutoFocus: (e) => e.preventDefault(),
|
|
11583
|
+
onMouseEnter: cancelHide,
|
|
11584
|
+
onMouseLeave: startHide,
|
|
11585
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(STag, { shape: "square", size: "xs", color: "grey", label: text })
|
|
11586
|
+
}
|
|
11587
|
+
) })
|
|
11588
|
+
] }) : null
|
|
11589
|
+
};
|
|
11590
|
+
}
|
|
11307
11591
|
var FONT = {
|
|
11308
11592
|
sm: { fontSize: 12, lineHeight: 20, paddingX: "var(--cmp-textinput-sm-paddingX)" },
|
|
11309
11593
|
md: { fontSize: 14, lineHeight: 24, paddingX: "var(--cmp-textinput-md-paddingX)" }
|
|
@@ -11361,6 +11645,10 @@ var SInput = /* @__PURE__ */ react.forwardRef(function SInput2({
|
|
|
11361
11645
|
const resolvedError = error || ruleError !== "";
|
|
11362
11646
|
const resolvedErrorMessage = ruleError !== "" ? ruleError : errorMessage;
|
|
11363
11647
|
const resolvedStatus = status ?? (rules && rules.length > 0 ? ruleError !== "" ? "error" : void 0 : void 0);
|
|
11648
|
+
const valueTooltip = useTruncatedValueTooltip({
|
|
11649
|
+
enabled: readOnly && !disabled,
|
|
11650
|
+
text: String(value ?? "")
|
|
11651
|
+
});
|
|
11364
11652
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
11365
11653
|
SField,
|
|
11366
11654
|
{
|
|
@@ -11401,7 +11689,7 @@ var SInput = /* @__PURE__ */ react.forwardRef(function SInput2({
|
|
|
11401
11689
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
11402
11690
|
"input",
|
|
11403
11691
|
{
|
|
11404
|
-
ref,
|
|
11692
|
+
ref: mergeRefs(ref, valueTooltip.valueRef),
|
|
11405
11693
|
type: inputType,
|
|
11406
11694
|
value: value ?? "",
|
|
11407
11695
|
disabled,
|
|
@@ -11426,9 +11714,18 @@ var SInput = /* @__PURE__ */ react.forwardRef(function SInput2({
|
|
|
11426
11714
|
color: disabled ? "var(--cmp-textinput-text-disabled)" : "var(--sys-color-field-text-default)",
|
|
11427
11715
|
...inputStyle
|
|
11428
11716
|
},
|
|
11429
|
-
...rest
|
|
11717
|
+
...rest,
|
|
11718
|
+
onMouseEnter: (e) => {
|
|
11719
|
+
rest.onMouseEnter?.(e);
|
|
11720
|
+
valueTooltip.onMouseEnter();
|
|
11721
|
+
},
|
|
11722
|
+
onMouseLeave: (e) => {
|
|
11723
|
+
rest.onMouseLeave?.(e);
|
|
11724
|
+
valueTooltip.onMouseLeave();
|
|
11725
|
+
}
|
|
11430
11726
|
}
|
|
11431
11727
|
),
|
|
11728
|
+
valueTooltip.tooltip,
|
|
11432
11729
|
suffix != null && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "flex flex-shrink-0 items-center", children: suffix }),
|
|
11433
11730
|
clearable && hasValue && !disabled && !readOnly && /* @__PURE__ */ jsxRuntime.jsx(
|
|
11434
11731
|
SGhostButton,
|
|
@@ -11662,8 +11959,10 @@ var SNumberInput = /* @__PURE__ */ react.forwardRef(function SNumberInput2({
|
|
|
11662
11959
|
const [display, setDisplay] = react.useState(() => formatWithCommas(numValue));
|
|
11663
11960
|
const [ruleError, setRuleError] = react.useState("");
|
|
11664
11961
|
const innerRef = react.useRef(null);
|
|
11962
|
+
const valueTooltip = useTruncatedValueTooltip({ enabled: readOnly && !disabled, text: display });
|
|
11665
11963
|
const setRefs2 = (el) => {
|
|
11666
11964
|
innerRef.current = el;
|
|
11965
|
+
valueTooltip.valueRef.current = el;
|
|
11667
11966
|
if (typeof ref === "function") ref(el);
|
|
11668
11967
|
else if (ref) ref.current = el;
|
|
11669
11968
|
};
|
|
@@ -11877,9 +12176,12 @@ var SNumberInput = /* @__PURE__ */ react.forwardRef(function SNumberInput2({
|
|
|
11877
12176
|
textAlign: useButton ? "center" : "right",
|
|
11878
12177
|
color: disabled ? "var(--cmp-numberInput-text-disabled)" : "var(--cmp-numberInput-text-default)",
|
|
11879
12178
|
...inputStyle
|
|
11880
|
-
}
|
|
12179
|
+
},
|
|
12180
|
+
onMouseEnter: valueTooltip.onMouseEnter,
|
|
12181
|
+
onMouseLeave: valueTooltip.onMouseLeave
|
|
11881
12182
|
}
|
|
11882
12183
|
),
|
|
12184
|
+
valueTooltip.tooltip,
|
|
11883
12185
|
inputSuffix !== "" && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "flex-shrink-0", style: { color: affixColor }, children: inputSuffix }),
|
|
11884
12186
|
useButton && stepper("inc")
|
|
11885
12187
|
]
|
|
@@ -12620,8 +12922,8 @@ function SDatePicker({
|
|
|
12620
12922
|
disabled,
|
|
12621
12923
|
className,
|
|
12622
12924
|
style,
|
|
12623
|
-
children: /* @__PURE__ */ jsxRuntime.jsxs(
|
|
12624
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
12925
|
+
children: /* @__PURE__ */ jsxRuntime.jsxs(RPopover10__namespace.Root, { open, onOpenChange: (o) => !disabled && setOpen(o), children: [
|
|
12926
|
+
/* @__PURE__ */ jsxRuntime.jsx(RPopover10__namespace.Trigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsxs(
|
|
12625
12927
|
"button",
|
|
12626
12928
|
{
|
|
12627
12929
|
type: "button",
|
|
@@ -12657,8 +12959,8 @@ function SDatePicker({
|
|
|
12657
12959
|
]
|
|
12658
12960
|
}
|
|
12659
12961
|
) }),
|
|
12660
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
12661
|
-
|
|
12962
|
+
/* @__PURE__ */ jsxRuntime.jsx(RPopover10__namespace.Portal, { container: portalContainer, children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
12963
|
+
RPopover10__namespace.Content,
|
|
12662
12964
|
{
|
|
12663
12965
|
side: "bottom",
|
|
12664
12966
|
align: mode === "date" ? "start" : "center",
|
|
@@ -13124,7 +13426,7 @@ function SDateRangePicker({
|
|
|
13124
13426
|
className,
|
|
13125
13427
|
style,
|
|
13126
13428
|
children: /* @__PURE__ */ jsxRuntime.jsxs(
|
|
13127
|
-
|
|
13429
|
+
RPopover10__namespace.Root,
|
|
13128
13430
|
{
|
|
13129
13431
|
open,
|
|
13130
13432
|
onOpenChange: (o) => {
|
|
@@ -13133,7 +13435,7 @@ function SDateRangePicker({
|
|
|
13133
13435
|
if (!o) setPendingStart(null);
|
|
13134
13436
|
},
|
|
13135
13437
|
children: [
|
|
13136
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
13438
|
+
/* @__PURE__ */ jsxRuntime.jsx(RPopover10__namespace.Trigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsxs(
|
|
13137
13439
|
"button",
|
|
13138
13440
|
{
|
|
13139
13441
|
type: "button",
|
|
@@ -13174,8 +13476,8 @@ function SDateRangePicker({
|
|
|
13174
13476
|
]
|
|
13175
13477
|
}
|
|
13176
13478
|
) }),
|
|
13177
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
13178
|
-
|
|
13479
|
+
/* @__PURE__ */ jsxRuntime.jsx(RPopover10__namespace.Portal, { container: portalContainer, children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
13480
|
+
RPopover10__namespace.Content,
|
|
13179
13481
|
{
|
|
13180
13482
|
side: "bottom",
|
|
13181
13483
|
align: "start",
|
|
@@ -14701,8 +15003,8 @@ var SChipFilter = /* @__PURE__ */ react.forwardRef(function SChipFilter2({
|
|
|
14701
15003
|
})(),
|
|
14702
15004
|
hasRightActions && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
14703
15005
|
/* @__PURE__ */ jsxRuntime.jsx(Divider, { inset: true }),
|
|
14704
|
-
hasAddButton && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
14705
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
15006
|
+
hasAddButton && /* @__PURE__ */ jsxRuntime.jsxs(RPopover10__namespace.Root, { open: addOpen, onOpenChange: setAddOpen, children: [
|
|
15007
|
+
/* @__PURE__ */ jsxRuntime.jsx(RPopover10__namespace.Trigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsxs(
|
|
14706
15008
|
"button",
|
|
14707
15009
|
{
|
|
14708
15010
|
type: "button",
|
|
@@ -14727,8 +15029,8 @@ var SChipFilter = /* @__PURE__ */ react.forwardRef(function SChipFilter2({
|
|
|
14727
15029
|
]
|
|
14728
15030
|
}
|
|
14729
15031
|
) }),
|
|
14730
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
14731
|
-
|
|
15032
|
+
/* @__PURE__ */ jsxRuntime.jsx(RPopover10__namespace.Portal, { container: portalContainer, children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
15033
|
+
RPopover10__namespace.Content,
|
|
14732
15034
|
{
|
|
14733
15035
|
side: "bottom",
|
|
14734
15036
|
align: "start",
|
|
@@ -14768,17 +15070,17 @@ var SChipFilter = /* @__PURE__ */ react.forwardRef(function SChipFilter2({
|
|
|
14768
15070
|
)
|
|
14769
15071
|
] })
|
|
14770
15072
|
] }),
|
|
14771
|
-
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
15073
|
+
/* @__PURE__ */ jsxRuntime.jsxs(RPopover10__namespace.Root, { open: openKey != null, onOpenChange: (next) => !next && setOpenKey(null), children: [
|
|
14772
15074
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
14773
|
-
|
|
15075
|
+
RPopover10__namespace.Anchor,
|
|
14774
15076
|
{
|
|
14775
15077
|
virtualRef: {
|
|
14776
15078
|
current: openKey ? triggerRefs.current.get(openKey) : null
|
|
14777
15079
|
}
|
|
14778
15080
|
}
|
|
14779
15081
|
),
|
|
14780
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
14781
|
-
|
|
15082
|
+
/* @__PURE__ */ jsxRuntime.jsx(RPopover10__namespace.Portal, { container: portalContainer, children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
15083
|
+
RPopover10__namespace.Content,
|
|
14782
15084
|
{
|
|
14783
15085
|
side: "bottom",
|
|
14784
15086
|
align: "start",
|
|
@@ -15318,8 +15620,8 @@ function InlineDatePresetFilter({
|
|
|
15318
15620
|
applied && (rangeValue ? (
|
|
15319
15621
|
// 뱃지 모양은 그대로 두고, 눌렀을 때 캘린더가 열려 기간을 직접 다시 고를 수 있게 한다.
|
|
15320
15622
|
// 직접 고르면 프리셋 선택은 해제된다.
|
|
15321
|
-
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
15322
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
15623
|
+
/* @__PURE__ */ jsxRuntime.jsxs(RPopover10__namespace.Root, { open: pickerOpen, onOpenChange: setPickerOpen, children: [
|
|
15624
|
+
/* @__PURE__ */ jsxRuntime.jsx(RPopover10__namespace.Trigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
15323
15625
|
"button",
|
|
15324
15626
|
{
|
|
15325
15627
|
type: "button",
|
|
@@ -15328,8 +15630,8 @@ function InlineDatePresetFilter({
|
|
|
15328
15630
|
children: badge
|
|
15329
15631
|
}
|
|
15330
15632
|
) }),
|
|
15331
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
15332
|
-
|
|
15633
|
+
/* @__PURE__ */ jsxRuntime.jsx(RPopover10__namespace.Portal, { container: portalContainer, children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
15634
|
+
RPopover10__namespace.Content,
|
|
15333
15635
|
{
|
|
15334
15636
|
side: "bottom",
|
|
15335
15637
|
align: "start",
|
|
@@ -16140,6 +16442,10 @@ var SBarcodeInput = /* @__PURE__ */ react.forwardRef(
|
|
|
16140
16442
|
});
|
|
16141
16443
|
const resolvedError = error || ruleError !== "";
|
|
16142
16444
|
const resolvedStatus = status ?? (rules && rules.length > 0 ? ruleError !== "" ? "error" : void 0 : void 0);
|
|
16445
|
+
const valueTooltip = useTruncatedValueTooltip({
|
|
16446
|
+
enabled: readOnly && !disabled,
|
|
16447
|
+
text: String(value ?? "")
|
|
16448
|
+
});
|
|
16143
16449
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
16144
16450
|
SField,
|
|
16145
16451
|
{
|
|
@@ -16176,7 +16482,7 @@ var SBarcodeInput = /* @__PURE__ */ react.forwardRef(
|
|
|
16176
16482
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
16177
16483
|
"input",
|
|
16178
16484
|
{
|
|
16179
|
-
ref,
|
|
16485
|
+
ref: mergeRefs(ref, valueTooltip.valueRef),
|
|
16180
16486
|
name,
|
|
16181
16487
|
type: "text",
|
|
16182
16488
|
value: value ?? "",
|
|
@@ -16202,9 +16508,12 @@ var SBarcodeInput = /* @__PURE__ */ react.forwardRef(
|
|
|
16202
16508
|
fontSize: f.fontSize,
|
|
16203
16509
|
color: disabled ? "var(--cmp-textinput-text-disabled)" : "var(--cmp-textinput-text-default)",
|
|
16204
16510
|
...inputStyle
|
|
16205
|
-
}
|
|
16511
|
+
},
|
|
16512
|
+
onMouseEnter: valueTooltip.onMouseEnter,
|
|
16513
|
+
onMouseLeave: valueTooltip.onMouseLeave
|
|
16206
16514
|
}
|
|
16207
16515
|
),
|
|
16516
|
+
valueTooltip.tooltip,
|
|
16208
16517
|
suffix,
|
|
16209
16518
|
clearable && hasValue && !disabled && /* @__PURE__ */ jsxRuntime.jsx(
|
|
16210
16519
|
SGhostButton,
|
|
@@ -16584,8 +16893,8 @@ function STimePicker({
|
|
|
16584
16893
|
disabled,
|
|
16585
16894
|
className,
|
|
16586
16895
|
style,
|
|
16587
|
-
children: /* @__PURE__ */ jsxRuntime.jsxs(
|
|
16588
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
16896
|
+
children: /* @__PURE__ */ jsxRuntime.jsxs(RPopover10__namespace.Root, { open, onOpenChange: commitOpen, children: [
|
|
16897
|
+
/* @__PURE__ */ jsxRuntime.jsx(RPopover10__namespace.Trigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsxs(
|
|
16589
16898
|
"div",
|
|
16590
16899
|
{
|
|
16591
16900
|
ref: triggerRef,
|
|
@@ -16645,8 +16954,8 @@ function STimePicker({
|
|
|
16645
16954
|
]
|
|
16646
16955
|
}
|
|
16647
16956
|
) }),
|
|
16648
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
16649
|
-
|
|
16957
|
+
/* @__PURE__ */ jsxRuntime.jsx(RPopover10__namespace.Portal, { container: portalContainer, children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
16958
|
+
RPopover10__namespace.Content,
|
|
16650
16959
|
{
|
|
16651
16960
|
side: "bottom",
|
|
16652
16961
|
align: "start",
|
|
@@ -17051,8 +17360,8 @@ function STimeRangePicker({
|
|
|
17051
17360
|
disabled,
|
|
17052
17361
|
className,
|
|
17053
17362
|
style,
|
|
17054
|
-
children: /* @__PURE__ */ jsxRuntime.jsxs(
|
|
17055
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
17363
|
+
children: /* @__PURE__ */ jsxRuntime.jsxs(RPopover10__namespace.Root, { open, onOpenChange: commitOpen, children: [
|
|
17364
|
+
/* @__PURE__ */ jsxRuntime.jsx(RPopover10__namespace.Trigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsxs(
|
|
17056
17365
|
"div",
|
|
17057
17366
|
{
|
|
17058
17367
|
ref: triggerRef,
|
|
@@ -17112,8 +17421,8 @@ function STimeRangePicker({
|
|
|
17112
17421
|
]
|
|
17113
17422
|
}
|
|
17114
17423
|
) }),
|
|
17115
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
17116
|
-
|
|
17424
|
+
/* @__PURE__ */ jsxRuntime.jsx(RPopover10__namespace.Portal, { container: portalContainer, children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
17425
|
+
RPopover10__namespace.Content,
|
|
17117
17426
|
{
|
|
17118
17427
|
side: "bottom",
|
|
17119
17428
|
align: "start",
|