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/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 RPopover9 = require('@radix-ui/react-popover');
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 RPopover9__namespace = /*#__PURE__*/_interopNamespace(RPopover9);
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
- // 항목 사이 구분선은 리스트가 그린다 — SDraggableList 의 separator (SList.tsx)
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, separator = false, ...rest }, ref) {
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
- separator && "[&>*]:border-b [&>*]:border-(--cmp-listItem-border-default)",
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
- // 항목 사이 구분선은 리스트가 그린다 — SList/SExpansionList 의 separator (SList.tsx)
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(RPopover9__namespace.Root, { open, onOpenChange: setOpen, children: [
4589
- /* @__PURE__ */ jsxRuntime.jsx(RPopover9__namespace.Anchor, { asChild: true, children: /* @__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(RPopover9__namespace.Portal, { container: portalContainer, children: /* @__PURE__ */ jsxRuntime.jsx(
4602
- RPopover9__namespace.Content,
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("span", { className: "absolute left-[6px] top-[-1px] h-[17px] w-px bg-(--cmp-tree-connector-line-color)" }),
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] top-[15px] h-px bg-(--cmp-tree-connector-line-color)",
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 h-[32px] 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)",
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 h-full min-w-0 flex-1 items-center gap-(--cmp-tree-item-contentGap) py-(--cmp-tree-item-paddingY)", children: [
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 text-[14px] leading-[24px]",
4708
- selected || indeterminate ? "font-bold text-(--cmp-tree-item-text-selected)" : "font-medium text-(--cmp-tree-item-text-default)"
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 h-[32px] w-full items-center gap-(--cmp-tree-item-rowGap) overflow-hidden bg-(--cmp-tree-item-bg-default) px-(--cmp-tree-item-paddingX) text-left",
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 h-full min-w-0 flex-1 items-center gap-(--cmp-tree-item-contentGap) py-(--cmp-tree-item-paddingY)", children: [
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 text-[14px] leading-[24px]",
4829
- selected || indeterminate ? "font-bold text-(--cmp-tree-item-text-selected)" : "font-medium text-(--cmp-tree-item-text-default)",
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(RPopover9__namespace.Root, { open, onOpenChange: setOpenState, children: [
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(RPopover9__namespace.Anchor, { asChild: true, children: triggerNode })
5182
+ /* @__PURE__ */ jsxRuntime.jsx(RPopover10__namespace.Anchor, { asChild: true, children: triggerNode })
5146
5183
  ) : isHover ? (
5147
5184
  // hover: Anchor(위치 기준) + 직접 mouse 핸들러 — 클릭으로 토글되지 않도록 Trigger 미사용
5148
- /* @__PURE__ */ jsxRuntime.jsx(RPopover9__namespace.Anchor, { asChild: true, children: /* @__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(RPopover9__namespace.Trigger, { asChild: true, children: triggerNode }),
5160
- /* @__PURE__ */ jsxRuntime.jsx(RPopover9__namespace.Portal, { container: portalContainer, children: /* @__PURE__ */ jsxRuntime.jsxs(
5161
- RPopover9__namespace.Content,
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(RPopover9__namespace.Arrow, { width: 16, height: 12, style: { fill: bg } })
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(RPopover9__namespace.Root, { open: actualOpen, onOpenChange: setOpen, children: [
6483
- /* @__PURE__ */ jsxRuntime.jsx(RPopover9__namespace.Trigger, { asChild: true, children: triggerNode }),
6484
- /* @__PURE__ */ jsxRuntime.jsx(RPopover9__namespace.Portal, { container: portalContainer, children: /* @__PURE__ */ jsxRuntime.jsxs(
6485
- RPopover9__namespace.Content,
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(RPopover9__namespace.Arrow, { width: 16, height: 12, style: { fill: bg } })
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
- RPopover9__namespace.Root,
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(RPopover9__namespace.Anchor, { virtualRef: anchorRef }),
6591
- /* @__PURE__ */ jsxRuntime.jsx(RPopover9__namespace.Portal, { container: portalContainer, children: /* @__PURE__ */ jsxRuntime.jsx(
6592
- RPopover9__namespace.Content,
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(RPopover9__namespace.Root, { open, onOpenChange: setOpen, children: [
6791
- /* @__PURE__ */ jsxRuntime.jsx(RPopover9__namespace.Trigger, { asChild: true, children: trigger }),
6792
- /* @__PURE__ */ jsxRuntime.jsx(RPopover9__namespace.Portal, { container: portalContainer, children: /* @__PURE__ */ jsxRuntime.jsxs(
6793
- RPopover9__namespace.Content,
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(RPopover9__namespace.Root, { open: labelTip !== null, onOpenChange: (open) => !open && setLabelTip(null), children: [
8875
- /* @__PURE__ */ jsxRuntime.jsx(RPopover9__namespace.Anchor, { virtualRef: labelTipAnchorRef }),
8876
- /* @__PURE__ */ jsxRuntime.jsx(RPopover9__namespace.Portal, { container: portalContainer, children: /* @__PURE__ */ jsxRuntime.jsx(
8877
- RPopover9__namespace.Content,
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: `bg-[var(--sys-color-bg-frame)] ${SCROLLBAR_TRACK_BORDER_CLASS} ${SCROLLBAR_TRACK_BG_CLASS}`,
8949
- neutral: `bg-[var(--sys-color-bg-neutralLight)] ${SCROLLBAR_TRACK_BORDER_CLASS} ${SCROLLBAR_TRACK_BG_WHITE_CLASS}`,
8950
- screen: `bg-[var(--sys-color-bg-screen)] ${SCROLLBAR_TRACK_BORDER_CLASS} ${SCROLLBAR_TRACK_BG_CLASS}`
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 (header == null) return main;
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
- main
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(RPopover9__namespace.Root, { open, onOpenChange: (o) => !disabled && setOpen(o), children: [
12624
- /* @__PURE__ */ jsxRuntime.jsx(RPopover9__namespace.Trigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsxs(
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(RPopover9__namespace.Portal, { container: portalContainer, children: /* @__PURE__ */ jsxRuntime.jsx(
12661
- RPopover9__namespace.Content,
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
- RPopover9__namespace.Root,
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(RPopover9__namespace.Trigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsxs(
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(RPopover9__namespace.Portal, { container: portalContainer, children: /* @__PURE__ */ jsxRuntime.jsx(
13178
- RPopover9__namespace.Content,
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(RPopover9__namespace.Root, { open: addOpen, onOpenChange: setAddOpen, children: [
14705
- /* @__PURE__ */ jsxRuntime.jsx(RPopover9__namespace.Trigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsxs(
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(RPopover9__namespace.Portal, { container: portalContainer, children: /* @__PURE__ */ jsxRuntime.jsx(
14731
- RPopover9__namespace.Content,
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(RPopover9__namespace.Root, { open: openKey != null, onOpenChange: (next) => !next && setOpenKey(null), children: [
15073
+ /* @__PURE__ */ jsxRuntime.jsxs(RPopover10__namespace.Root, { open: openKey != null, onOpenChange: (next) => !next && setOpenKey(null), children: [
14772
15074
  /* @__PURE__ */ jsxRuntime.jsx(
14773
- RPopover9__namespace.Anchor,
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(RPopover9__namespace.Portal, { container: portalContainer, children: /* @__PURE__ */ jsxRuntime.jsx(
14781
- RPopover9__namespace.Content,
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(RPopover9__namespace.Root, { open: pickerOpen, onOpenChange: setPickerOpen, children: [
15322
- /* @__PURE__ */ jsxRuntime.jsx(RPopover9__namespace.Trigger, { asChild: true, children: /* @__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(RPopover9__namespace.Portal, { container: portalContainer, children: /* @__PURE__ */ jsxRuntime.jsx(
15332
- RPopover9__namespace.Content,
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(RPopover9__namespace.Root, { open, onOpenChange: commitOpen, children: [
16588
- /* @__PURE__ */ jsxRuntime.jsx(RPopover9__namespace.Trigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsxs(
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(RPopover9__namespace.Portal, { container: portalContainer, children: /* @__PURE__ */ jsxRuntime.jsx(
16649
- RPopover9__namespace.Content,
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(RPopover9__namespace.Root, { open, onOpenChange: commitOpen, children: [
17055
- /* @__PURE__ */ jsxRuntime.jsx(RPopover9__namespace.Trigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsxs(
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(RPopover9__namespace.Portal, { container: portalContainer, children: /* @__PURE__ */ jsxRuntime.jsx(
17116
- RPopover9__namespace.Content,
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",