sellmate-design-system-react 9.0.0-beta.66 → 9.0.0-beta.68

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.
Files changed (30) hide show
  1. package/AGENTS.md +125 -9
  2. package/dist/components/SBarChart/barChart.config.d.ts +0 -8
  3. package/dist/components/SCalendarBoard/CalendarDayCard.d.ts +7 -0
  4. package/dist/components/SCalendarBoard/CalendarEventButton.d.ts +3 -1
  5. package/dist/components/SCalendarBoard/CalendarMoreButton.d.ts +5 -0
  6. package/dist/components/SCalendarBoard/README.md +1 -0
  7. package/dist/components/SCalendarBoard/SCalendarBoard.d.ts +13 -1
  8. package/dist/components/SCalendarBoard/calendar-board-layout.d.ts +11 -1
  9. package/dist/components/SCalendarBoard/calendarBoard.config.d.ts +5 -0
  10. package/dist/components/SCard/README.md +1 -0
  11. package/dist/components/SCard/SCard.d.ts +10 -1
  12. package/dist/components/SFooter/README.md +16 -2
  13. package/dist/components/SFooter/SFooter.d.ts +13 -3
  14. package/dist/components/SFooter/index.d.ts +1 -1
  15. package/dist/components/SImage/README.md +3 -0
  16. package/dist/components/SImage/SImage.d.ts +9 -6
  17. package/dist/components/SLoadingContainer/index.d.ts +1 -1
  18. package/dist/components/SLoadingContainer/loading.d.ts +34 -15
  19. package/dist/components/SSectionHeaderCard/README.md +1 -0
  20. package/dist/components/SSectionHeaderCard/SSectionHeaderCard.d.ts +10 -1
  21. package/dist/index.cjs +373 -158
  22. package/dist/index.cjs.map +1 -1
  23. package/dist/index.js +374 -158
  24. package/dist/index.js.map +1 -1
  25. package/dist/lib/chart/hover-dim.d.ts +19 -0
  26. package/dist/lib/hover-preview.d.ts +32 -0
  27. package/dist/llms-full.txt +147 -11
  28. package/dist/llms.txt +125 -9
  29. package/dist/styles.css +3 -0
  30. package/package.json +1 -1
package/dist/index.cjs CHANGED
@@ -5,7 +5,7 @@ var clsx = require('clsx');
5
5
  var tailwindMerge = require('tailwind-merge');
6
6
  var react = require('react');
7
7
  var jsxRuntime = require('react/jsx-runtime');
8
- var RPopover12 = require('@radix-ui/react-popover');
8
+ var RPopover13 = require('@radix-ui/react-popover');
9
9
  var reactDom = require('react-dom');
10
10
  var RCheckbox = require('@radix-ui/react-checkbox');
11
11
  var client = require('react-dom/client');
@@ -33,7 +33,7 @@ function _interopNamespace(e) {
33
33
  return Object.freeze(n);
34
34
  }
35
35
 
36
- var RPopover12__namespace = /*#__PURE__*/_interopNamespace(RPopover12);
36
+ var RPopover13__namespace = /*#__PURE__*/_interopNamespace(RPopover13);
37
37
  var RCheckbox__namespace = /*#__PURE__*/_interopNamespace(RCheckbox);
38
38
  var RTooltip__namespace = /*#__PURE__*/_interopNamespace(RTooltip);
39
39
  var RDropdown5__namespace = /*#__PURE__*/_interopNamespace(RDropdown5);
@@ -3735,6 +3735,57 @@ var SIcon = /* @__PURE__ */ react.forwardRef(function SIcon2({ name, size = 24,
3735
3735
  }
3736
3736
  );
3737
3737
  });
3738
+
3739
+ // src/lib/display-name.ts
3740
+ function withDisplayName(component, name) {
3741
+ component.displayName = name;
3742
+ return component;
3743
+ }
3744
+
3745
+ // src/lib/floating-anim.ts
3746
+ var FLOATING_SLIDE_ANIM = [
3747
+ "data-[state=open]:data-[side=top]:animate-floating-in-top",
3748
+ "data-[state=delayed-open]:data-[side=top]:animate-floating-in-top",
3749
+ "data-[state=instant-open]:data-[side=top]:animate-floating-in-top",
3750
+ "data-[state=closed]:data-[side=top]:animate-floating-out-top",
3751
+ "data-[state=open]:data-[side=bottom]:animate-floating-in-bottom",
3752
+ "data-[state=delayed-open]:data-[side=bottom]:animate-floating-in-bottom",
3753
+ "data-[state=instant-open]:data-[side=bottom]:animate-floating-in-bottom",
3754
+ "data-[state=closed]:data-[side=bottom]:animate-floating-out-bottom",
3755
+ "data-[state=open]:data-[side=left]:animate-floating-in-left",
3756
+ "data-[state=delayed-open]:data-[side=left]:animate-floating-in-left",
3757
+ "data-[state=instant-open]:data-[side=left]:animate-floating-in-left",
3758
+ "data-[state=closed]:data-[side=left]:animate-floating-out-left",
3759
+ "data-[state=open]:data-[side=right]:animate-floating-in-right",
3760
+ "data-[state=delayed-open]:data-[side=right]:animate-floating-in-right",
3761
+ "data-[state=instant-open]:data-[side=right]:animate-floating-in-right",
3762
+ "data-[state=closed]:data-[side=right]:animate-floating-out-right"
3763
+ ].join(" ");
3764
+
3765
+ // src/lib/hover-preview.ts
3766
+ function hoverPreviewOrigin({
3767
+ anchor,
3768
+ size,
3769
+ viewportWidth,
3770
+ viewportHeight,
3771
+ padding = 8
3772
+ }) {
3773
+ const startX = anchor.left + anchor.width / 2;
3774
+ const startY = anchor.top + anchor.height / 2;
3775
+ const x = Math.max(padding, Math.min(startX, viewportWidth - size - padding));
3776
+ const y = Math.max(padding, Math.min(startY, viewportHeight - size - padding));
3777
+ return { x, y };
3778
+ }
3779
+ var PortalContainerContext = /* @__PURE__ */ react.createContext(null);
3780
+ var InsideModalContext = /* @__PURE__ */ react.createContext(false);
3781
+ var PortalContainerProvider = PortalContainerContext.Provider;
3782
+ var InsideModalProvider = InsideModalContext.Provider;
3783
+ function usePortalContainer() {
3784
+ return react.useContext(PortalContainerContext) ?? void 0;
3785
+ }
3786
+ function useInsideModal() {
3787
+ return react.useContext(InsideModalContext);
3788
+ }
3738
3789
  var VIEWBOX = 80;
3739
3790
  var RADIUS = 34;
3740
3791
  var STROKE = 12;
@@ -3852,7 +3903,10 @@ var SCircleProgress = /* @__PURE__ */ react.forwardRef(
3852
3903
  var IMAGE_FITS = ["cover", "contain", "fill", "none", "scale-down"];
3853
3904
  var EMPTY_ICON_SIZE = "60cqh";
3854
3905
  var SPINNER_SIZE = "45cqh";
3855
- var SImage = /* @__PURE__ */ react.forwardRef(function SImage2({
3906
+ var PREVIEW_HIDE_DELAY_MS = 100;
3907
+ var PREVIEW_MAX_SIZE = 200;
3908
+ var PREVIEW_VIEWPORT_PADDING = 8;
3909
+ var SImageImpl = /* @__PURE__ */ react.forwardRef(function SImageImpl2({
3856
3910
  src,
3857
3911
  alt = "",
3858
3912
  ratio = 1,
@@ -3864,6 +3918,9 @@ var SImage = /* @__PURE__ */ react.forwardRef(function SImage2({
3864
3918
  loadingSlot,
3865
3919
  errorSlot,
3866
3920
  imgProps,
3921
+ previewOnHover = false,
3922
+ previewSrc,
3923
+ previewSize = PREVIEW_MAX_SIZE,
3867
3924
  onLoad,
3868
3925
  onError,
3869
3926
  className,
@@ -3894,16 +3951,94 @@ var SImage = /* @__PURE__ */ react.forwardRef(function SImage2({
3894
3951
  const timer = setTimeout(() => setSpinnerVisible(true), loadingShowDelay);
3895
3952
  return () => clearTimeout(timer);
3896
3953
  }, [status, loadingShowDelay, src]);
3954
+ const portalContainer = usePortalContainer();
3955
+ const [previewOpen, setPreviewOpen] = react.useState(false);
3956
+ const previewHideTimer = react.useRef(void 0);
3957
+ const boxRef = react.useRef(null);
3958
+ const previewSource = previewSrc ?? src;
3959
+ const previewEnabled = previewOnHover && !!previewSource;
3960
+ const previewBoxSize = Math.min(previewSize, PREVIEW_MAX_SIZE);
3961
+ const previewBoxSizeRef = react.useRef(previewBoxSize);
3962
+ previewBoxSizeRef.current = previewBoxSize;
3963
+ const previewAnchorRef = react.useRef(null);
3964
+ if (previewAnchorRef.current == null) {
3965
+ previewAnchorRef.current = {
3966
+ getBoundingClientRect: () => {
3967
+ const anchor = boxRef.current?.getBoundingClientRect();
3968
+ if (!anchor) return new DOMRect(0, 0, 0, 0);
3969
+ const { x, y } = hoverPreviewOrigin({
3970
+ anchor,
3971
+ size: previewBoxSizeRef.current,
3972
+ viewportWidth: window.innerWidth,
3973
+ viewportHeight: window.innerHeight,
3974
+ padding: PREVIEW_VIEWPORT_PADDING
3975
+ });
3976
+ return new DOMRect(x, y, 0, 0);
3977
+ },
3978
+ // autoUpdate 가 스크롤 조상을 찾는 기준 — 없으면 표 안에서 스크롤할 때 위치가 굳는다
3979
+ get contextElement() {
3980
+ return boxRef.current ?? void 0;
3981
+ }
3982
+ };
3983
+ }
3984
+ const cancelPreviewHide = react.useCallback(() => {
3985
+ if (previewHideTimer.current) {
3986
+ clearTimeout(previewHideTimer.current);
3987
+ previewHideTimer.current = void 0;
3988
+ }
3989
+ }, []);
3990
+ const openPreview = () => {
3991
+ cancelPreviewHide();
3992
+ setPreviewOpen(true);
3993
+ };
3994
+ const startPreviewHide = () => {
3995
+ cancelPreviewHide();
3996
+ previewHideTimer.current = setTimeout(() => setPreviewOpen(false), PREVIEW_HIDE_DELAY_MS);
3997
+ };
3998
+ react.useEffect(() => {
3999
+ if (!previewEnabled) {
4000
+ cancelPreviewHide();
4001
+ setPreviewOpen(false);
4002
+ }
4003
+ }, [previewEnabled, cancelPreviewHide]);
4004
+ react.useEffect(() => cancelPreviewHide, [cancelPreviewHide]);
4005
+ const previewContentRef = react.useCallback((node) => {
4006
+ node?.parentElement?.style.setProperty("pointer-events", "none");
4007
+ }, []);
4008
+ const previewHandlers = previewEnabled ? {
4009
+ onMouseEnter: (event) => {
4010
+ rest.onMouseEnter?.(event);
4011
+ openPreview();
4012
+ },
4013
+ onMouseLeave: (event) => {
4014
+ rest.onMouseLeave?.(event);
4015
+ startPreviewHide();
4016
+ },
4017
+ // 소비자가 tabIndex 를 준 썸네일에서는 키보드로도 열린다
4018
+ onFocus: (event) => {
4019
+ rest.onFocus?.(event);
4020
+ openPreview();
4021
+ },
4022
+ onBlur: (event) => {
4023
+ rest.onBlur?.(event);
4024
+ startPreviewHide();
4025
+ }
4026
+ } : void 0;
3897
4027
  const isEmpty = !src;
3898
4028
  const showFallback = isEmpty || status === "error";
3899
4029
  const spinnerShown = !isEmpty && status === "loading" && showSpinner && spinnerVisible;
3900
- return /* @__PURE__ */ jsxRuntime.jsxs(
4030
+ const box3 = /* @__PURE__ */ jsxRuntime.jsxs(
3901
4031
  "div",
3902
4032
  {
3903
- ref,
4033
+ ref: (node) => {
4034
+ boxRef.current = node;
4035
+ if (typeof ref === "function") ref(node);
4036
+ else if (ref) ref.current = node;
4037
+ },
3904
4038
  className: cn("relative overflow-hidden bg-(--cmp-image-bg)", className),
3905
4039
  style: { containerType: "size", aspectRatio: ratio, ...style },
3906
4040
  ...rest,
4041
+ ...previewHandlers,
3907
4042
  children: [
3908
4043
  !isEmpty && /* @__PURE__ */ jsxRuntime.jsx(
3909
4044
  "img",
@@ -3939,7 +4074,47 @@ var SImage = /* @__PURE__ */ react.forwardRef(function SImage2({
3939
4074
  ]
3940
4075
  }
3941
4076
  );
4077
+ if (!previewEnabled) return box3;
4078
+ return /* @__PURE__ */ jsxRuntime.jsxs(RPopover13__namespace.Root, { open: previewOpen, onOpenChange: setPreviewOpen, children: [
4079
+ box3,
4080
+ /* @__PURE__ */ jsxRuntime.jsx(RPopover13__namespace.Anchor, { virtualRef: previewAnchorRef }),
4081
+ /* @__PURE__ */ jsxRuntime.jsx(RPopover13__namespace.Portal, { container: portalContainer, children: /* @__PURE__ */ jsxRuntime.jsx(
4082
+ RPopover13__namespace.Content,
4083
+ {
4084
+ ref: previewContentRef,
4085
+ side: "bottom",
4086
+ align: "start",
4087
+ sideOffset: 0,
4088
+ alignOffset: 0,
4089
+ avoidCollisions: false,
4090
+ role: "presentation",
4091
+ "aria-hidden": true,
4092
+ className: cn(
4093
+ "z-50 overflow-hidden rounded-[6px] shadow-normal-sm",
4094
+ // 읽기 전용이라 호버 브릿지를 두지 않는다. 그 대신 마우스를 통과시켜,
4095
+ // 목록 위로 뜬 미리보기가 아래 행의 클릭을 가로채지 않게 한다.
4096
+ // (래퍼 쪽은 previewContentRef 가 함께 끈다 — 둘 다 꺼야 깜빡이지 않는다)
4097
+ "pointer-events-none",
4098
+ FLOATING_SLIDE_ANIM
4099
+ ),
4100
+ onOpenAutoFocus: (event) => event.preventDefault(),
4101
+ onCloseAutoFocus: (event) => event.preventDefault(),
4102
+ children: /* @__PURE__ */ jsxRuntime.jsx(
4103
+ SImage,
4104
+ {
4105
+ src: previewSource,
4106
+ alt: "",
4107
+ ratio: 1,
4108
+ fit: "contain",
4109
+ loading: "eager",
4110
+ style: { width: previewBoxSize }
4111
+ }
4112
+ )
4113
+ }
4114
+ ) })
4115
+ ] });
3942
4116
  });
4117
+ var SImage = /* @__PURE__ */ withDisplayName(SImageImpl, "SImage");
3943
4118
  var BADGE_COLORS = [
3944
4119
  "red",
3945
4120
  "orange",
@@ -4135,6 +4310,7 @@ var SButton = /* @__PURE__ */ react.forwardRef(function SButton2({
4135
4310
  });
4136
4311
  function SFooter({
4137
4312
  bg = "white",
4313
+ size = "md",
4138
4314
  left,
4139
4315
  button,
4140
4316
  children,
@@ -4171,7 +4347,7 @@ function SFooter({
4171
4347
  SButton,
4172
4348
  {
4173
4349
  ...button,
4174
- size: "md",
4350
+ size,
4175
4351
  color: button.color ?? "primary",
4176
4352
  label: button.label ?? "\uD655\uC778"
4177
4353
  }
@@ -4180,7 +4356,16 @@ function SFooter({
4180
4356
  }
4181
4357
  );
4182
4358
  }
4183
- var SCard = /* @__PURE__ */ react.forwardRef(function SCard2({ bordered = false, footerLeft, button, footerClassName, className, children, ...rest }, ref) {
4359
+ var SCard = /* @__PURE__ */ react.forwardRef(function SCard2({
4360
+ bordered = false,
4361
+ footerLeft,
4362
+ button,
4363
+ footerSize = "md",
4364
+ footerClassName,
4365
+ className,
4366
+ children,
4367
+ ...rest
4368
+ }, ref) {
4184
4369
  const hasFooter = footerLeft != null || button != null;
4185
4370
  return /* @__PURE__ */ jsxRuntime.jsxs(
4186
4371
  "div",
@@ -4198,6 +4383,7 @@ var SCard = /* @__PURE__ */ react.forwardRef(function SCard2({ bordered = false,
4198
4383
  SFooter,
4199
4384
  {
4200
4385
  bg: "grey",
4386
+ size: footerSize,
4201
4387
  left: footerLeft,
4202
4388
  button,
4203
4389
  className: cn("px-(--sys-space-panel-padding-default)", footerClassName)
@@ -4208,42 +4394,6 @@ var SCard = /* @__PURE__ */ react.forwardRef(function SCard2({ bordered = false,
4208
4394
  );
4209
4395
  });
4210
4396
 
4211
- // src/lib/display-name.ts
4212
- function withDisplayName(component, name) {
4213
- component.displayName = name;
4214
- return component;
4215
- }
4216
-
4217
- // src/lib/floating-anim.ts
4218
- var FLOATING_SLIDE_ANIM = [
4219
- "data-[state=open]:data-[side=top]:animate-floating-in-top",
4220
- "data-[state=delayed-open]:data-[side=top]:animate-floating-in-top",
4221
- "data-[state=instant-open]:data-[side=top]:animate-floating-in-top",
4222
- "data-[state=closed]:data-[side=top]:animate-floating-out-top",
4223
- "data-[state=open]:data-[side=bottom]:animate-floating-in-bottom",
4224
- "data-[state=delayed-open]:data-[side=bottom]:animate-floating-in-bottom",
4225
- "data-[state=instant-open]:data-[side=bottom]:animate-floating-in-bottom",
4226
- "data-[state=closed]:data-[side=bottom]:animate-floating-out-bottom",
4227
- "data-[state=open]:data-[side=left]:animate-floating-in-left",
4228
- "data-[state=delayed-open]:data-[side=left]:animate-floating-in-left",
4229
- "data-[state=instant-open]:data-[side=left]:animate-floating-in-left",
4230
- "data-[state=closed]:data-[side=left]:animate-floating-out-left",
4231
- "data-[state=open]:data-[side=right]:animate-floating-in-right",
4232
- "data-[state=delayed-open]:data-[side=right]:animate-floating-in-right",
4233
- "data-[state=instant-open]:data-[side=right]:animate-floating-in-right",
4234
- "data-[state=closed]:data-[side=right]:animate-floating-out-right"
4235
- ].join(" ");
4236
- var PortalContainerContext = /* @__PURE__ */ react.createContext(null);
4237
- var InsideModalContext = /* @__PURE__ */ react.createContext(false);
4238
- var PortalContainerProvider = PortalContainerContext.Provider;
4239
- var InsideModalProvider = InsideModalContext.Provider;
4240
- function usePortalContainer() {
4241
- return react.useContext(PortalContainerContext) ?? void 0;
4242
- }
4243
- function useInsideModal() {
4244
- return react.useContext(InsideModalContext);
4245
- }
4246
-
4247
4397
  // src/components/STag/tag.config.ts
4248
4398
  var TAG_SHAPES = ["square", "pill"];
4249
4399
  var TAG_SIZES = ["xs", "sm", "md"];
@@ -4431,8 +4581,8 @@ var SGhostButton = /* @__PURE__ */ react.forwardRef(function SGhostButton2({
4431
4581
  }
4432
4582
  );
4433
4583
  if (!hasTooltip) return btn2;
4434
- return /* @__PURE__ */ jsxRuntime.jsxs(RPopover12__namespace.Root, { open, onOpenChange: setOpen, children: [
4435
- /* @__PURE__ */ jsxRuntime.jsx(RPopover12__namespace.Anchor, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(
4584
+ return /* @__PURE__ */ jsxRuntime.jsxs(RPopover13__namespace.Root, { open, onOpenChange: setOpen, children: [
4585
+ /* @__PURE__ */ jsxRuntime.jsx(RPopover13__namespace.Anchor, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(
4436
4586
  "span",
4437
4587
  {
4438
4588
  className: cn("inline-flex", anchorClassName),
@@ -4444,8 +4594,8 @@ var SGhostButton = /* @__PURE__ */ react.forwardRef(function SGhostButton2({
4444
4594
  children: btn2
4445
4595
  }
4446
4596
  ) }),
4447
- /* @__PURE__ */ jsxRuntime.jsx(RPopover12__namespace.Portal, { container: portalContainer, children: /* @__PURE__ */ jsxRuntime.jsx(
4448
- RPopover12__namespace.Content,
4597
+ /* @__PURE__ */ jsxRuntime.jsx(RPopover13__namespace.Portal, { container: portalContainer, children: /* @__PURE__ */ jsxRuntime.jsx(
4598
+ RPopover13__namespace.Content,
4449
4599
  {
4450
4600
  side: "top",
4451
4601
  sideOffset: 4,
@@ -4634,14 +4784,14 @@ var STooltipImpl = /* @__PURE__ */ react.forwardRef(function STooltip({
4634
4784
  ...style,
4635
4785
  ...contentPropsStyle
4636
4786
  };
4637
- return /* @__PURE__ */ jsxRuntime.jsxs(RPopover12__namespace.Root, { open, onOpenChange: setOpenState, children: [
4787
+ return /* @__PURE__ */ jsxRuntime.jsxs(RPopover13__namespace.Root, { open, onOpenChange: setOpenState, children: [
4638
4788
  isNone ? (
4639
4789
  // 트리거 없음: children 을 래퍼 없이 그대로 앵커로 쓴다 (소비자 레이아웃 보존).
4640
4790
  // mouse/focus 핸들러가 없으므로 showClose 없이도 자동 닫힘이 발생하지 않는다.
4641
- /* @__PURE__ */ jsxRuntime.jsx(RPopover12__namespace.Anchor, { asChild: true, children: triggerNode })
4791
+ /* @__PURE__ */ jsxRuntime.jsx(RPopover13__namespace.Anchor, { asChild: true, children: triggerNode })
4642
4792
  ) : isHover ? (
4643
4793
  // hover: Anchor(위치 기준) + 직접 mouse 핸들러 — 클릭으로 토글되지 않도록 Trigger 미사용
4644
- /* @__PURE__ */ jsxRuntime.jsx(RPopover12__namespace.Anchor, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(
4794
+ /* @__PURE__ */ jsxRuntime.jsx(RPopover13__namespace.Anchor, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(
4645
4795
  "span",
4646
4796
  {
4647
4797
  className: "inline-flex",
@@ -4652,9 +4802,9 @@ var STooltipImpl = /* @__PURE__ */ react.forwardRef(function STooltip({
4652
4802
  children: triggerNode
4653
4803
  }
4654
4804
  ) })
4655
- ) : /* @__PURE__ */ jsxRuntime.jsx(RPopover12__namespace.Trigger, { asChild: true, children: triggerNode }),
4656
- /* @__PURE__ */ jsxRuntime.jsx(RPopover12__namespace.Portal, { container: portalContainer, children: /* @__PURE__ */ jsxRuntime.jsxs(
4657
- RPopover12__namespace.Content,
4805
+ ) : /* @__PURE__ */ jsxRuntime.jsx(RPopover13__namespace.Trigger, { asChild: true, children: triggerNode }),
4806
+ /* @__PURE__ */ jsxRuntime.jsx(RPopover13__namespace.Portal, { container: portalContainer, children: /* @__PURE__ */ jsxRuntime.jsxs(
4807
+ RPopover13__namespace.Content,
4658
4808
  {
4659
4809
  side: placement,
4660
4810
  sideOffset,
@@ -4688,7 +4838,7 @@ var STooltipImpl = /* @__PURE__ */ react.forwardRef(function STooltip({
4688
4838
  }
4689
4839
  )
4690
4840
  ] }),
4691
- /* @__PURE__ */ jsxRuntime.jsx(RPopover12__namespace.Arrow, { width: 16, height: 12, style: { fill: bg } })
4841
+ /* @__PURE__ */ jsxRuntime.jsx(RPopover13__namespace.Arrow, { width: 16, height: 12, style: { fill: bg } })
4692
4842
  ]
4693
4843
  }
4694
4844
  ) })
@@ -7521,6 +7671,7 @@ var SSectionHeaderCardRootImpl = /* @__PURE__ */ react.forwardRef(
7521
7671
  background,
7522
7672
  footerLeft,
7523
7673
  button,
7674
+ footerSize = "md",
7524
7675
  footerClassName,
7525
7676
  className,
7526
7677
  children,
@@ -7557,6 +7708,7 @@ var SSectionHeaderCardRootImpl = /* @__PURE__ */ react.forwardRef(
7557
7708
  SFooter,
7558
7709
  {
7559
7710
  bg: "grey",
7711
+ size: footerSize,
7560
7712
  left: footerLeft,
7561
7713
  button,
7562
7714
  className: cn("px-(--cmp-sectionHeaderCard-header-paddingX)", footerClassName)
@@ -8337,12 +8489,18 @@ var release = (id) => {
8337
8489
  entries = next;
8338
8490
  sync();
8339
8491
  };
8492
+ var updateEntry = (id, message) => {
8493
+ const index = entries.findIndex((e) => e.id === id);
8494
+ if (index === -1) return;
8495
+ entries = entries.map((e, i) => i === index ? { ...e, message } : e);
8496
+ sync();
8497
+ };
8340
8498
  var subscribe = (cb) => {
8341
8499
  listeners.add(cb);
8342
8500
  return () => listeners.delete(cb);
8343
8501
  };
8344
8502
  var getSnapshot = () => state;
8345
- function SLoadingViewport() {
8503
+ function LoadingViewport() {
8346
8504
  const s = react.useSyncExternalStore(subscribe, getSnapshot, getSnapshot);
8347
8505
  return /* @__PURE__ */ jsxRuntime.jsx(SLoadingContainer, { open: s.open, message: s.message });
8348
8506
  }
@@ -8353,39 +8511,56 @@ function ensureMounted() {
8353
8511
  const host = document.createElement("div");
8354
8512
  host.setAttribute("data-sd-loading-root", "");
8355
8513
  document.body.appendChild(host);
8356
- client.createRoot(host).render(/* @__PURE__ */ jsxRuntime.jsx(SLoadingViewport, {}));
8514
+ client.createRoot(host).render(/* @__PURE__ */ jsxRuntime.jsx(LoadingViewport, {}));
8515
+ }
8516
+ function showEntry(options = {}) {
8517
+ ensureMounted();
8518
+ const id = ++seq;
8519
+ entries = [...entries, { id, message: options.message }];
8520
+ sync();
8521
+ let released = false;
8522
+ const handle = (() => {
8523
+ if (released) return;
8524
+ released = true;
8525
+ release(id);
8526
+ });
8527
+ handle.update = (next) => {
8528
+ if (released) return;
8529
+ updateEntry(id, next.message);
8530
+ };
8531
+ return handle;
8357
8532
  }
8358
8533
  var loading = {
8359
8534
  /**
8360
8535
  * 로딩 오버레이 표시. 겹쳐 부르면 그만큼 쌓이고 **마지막 하나가 걷힐 때** 닫힌다.
8361
- * 반환값은 이 호출 하나만 걷는 함수다(두 번 불러도 한 번만 걷힌다) — `hide()` 대신 이것을
8362
- * 쓰면 짝이 어긋나지 않는다.
8536
+ * 반환값은 이 호출 하나를 걷고 갱신하는 핸들이다(두 번 걷어도 한 번만 걷힌다).
8537
+ *
8538
+ * **걷는 것은 `finally` 에 둔다.** 빠뜨리면 그 즉시 화면이 갇히고, 정상 경로에서는 아무
8539
+ * 표시가 없다.
8363
8540
  *
8364
- * ⚠️ 메시지만 바꾸려면 `update()` 를 쓴다. `show()` 를 다시 부르면 하나 더 쌓여
8365
- * `hide()` 한 번으로는 닫히지 않는다.
8541
+ * ```ts
8542
+ * const done = loading.show({ message: '1/2 ...' });
8543
+ * try {
8544
+ * done.update({ message: '2/2 ...' }); // 이 호출의 메시지만 바뀐다
8545
+ * await api.submit(payload);
8546
+ * } finally {
8547
+ * done(); // 이 호출만 걷는다
8548
+ * }
8549
+ * ```
8550
+ *
8551
+ * ⚠️ **메시지를 바꾸려고 `show()` 를 다시 부르지 않는다.** 하나 더 쌓여 한 번 걷는 것으로는
8552
+ * 닫히지 않는다. 핸들의 `update()` 를 쓴다. (참조 카운트 이전에는 `show()` 를 다시 부르는
8553
+ * 것이 갱신이었다 — Quasar 도 같은 그룹에 다시 show 하면 갱신이다. 그 시절 관행대로 쓰인
8554
+ * 코드는 지금 오버레이를 하나 남긴다.)
8366
8555
  */
8367
8556
  show(options = {}) {
8368
- ensureMounted();
8369
- const id = ++seq;
8370
- entries = [...entries, { id, message: options.message }];
8371
- sync();
8372
- return () => release(id);
8373
- },
8374
- /** 표시 중인 메시지 갱신 — 쌓인 수는 그대로다 */
8375
- update(options) {
8376
- const top = entries[entries.length - 1];
8377
- if (!top) return;
8378
- entries = [...entries.slice(0, -1), { ...top, message: options.message }];
8379
- sync();
8380
- },
8381
- /** 가장 나중의 show 하나를 걷는다. 남은 것이 없을 때만 오버레이가 닫힌다 */
8382
- hide() {
8383
- const top = entries[entries.length - 1];
8384
- if (top) release(top.id);
8557
+ return showEntry(options);
8385
8558
  },
8386
8559
  /**
8387
- * 쌓인 것을 모두 걷고 즉시 닫는다. 화면 전환·에러 복구처럼 진행 중이던 작업의 짝을 더는
8388
- * 맞출 수 없을 때만 쓴다 — 평소에는 `hide()` 나 `show()` 가 준 함수로 하나씩 걷는다.
8560
+ * 쌓인 것을 모두 걷고 즉시 닫는다. **원본(Quasar)의 인자 없는 `hide()` 가 이것이다.**
8561
+ * 화면 전환·에러 복구처럼 진행 중이던 작업의 짝을 더는 맞출 수 없을 때만 쓴다 — 평소에는
8562
+ * `show()` 가 준 핸들로 걷는다.
8563
+ * 이걸로 걷힌 항목의 주인이 뒤늦게 자기 핸들을 불러도 아무 일도 일어나지 않는다.
8389
8564
  */
8390
8565
  hideAll() {
8391
8566
  if (entries.length === 0) return;
@@ -8907,7 +9082,7 @@ function SPortal({
8907
9082
  const portalContainer = usePortalContainer();
8908
9083
  const { minWidth: styleMinWidth, maxWidth: styleMaxWidth, ...restStyle } = style ?? {};
8909
9084
  return /* @__PURE__ */ jsxRuntime.jsxs(
8910
- RPopover12__namespace.Root,
9085
+ RPopover13__namespace.Root,
8911
9086
  {
8912
9087
  open,
8913
9088
  onOpenChange: (next) => {
@@ -8915,9 +9090,9 @@ function SPortal({
8915
9090
  if (!next) onClose?.();
8916
9091
  },
8917
9092
  children: [
8918
- /* @__PURE__ */ jsxRuntime.jsx(RPopover12__namespace.Anchor, { virtualRef: anchorRef }),
8919
- /* @__PURE__ */ jsxRuntime.jsx(RPopover12__namespace.Portal, { container: portalContainer, children: /* @__PURE__ */ jsxRuntime.jsx(
8920
- RPopover12__namespace.Content,
9093
+ /* @__PURE__ */ jsxRuntime.jsx(RPopover13__namespace.Anchor, { virtualRef: anchorRef }),
9094
+ /* @__PURE__ */ jsxRuntime.jsx(RPopover13__namespace.Portal, { container: portalContainer, children: /* @__PURE__ */ jsxRuntime.jsx(
9095
+ RPopover13__namespace.Content,
8921
9096
  {
8922
9097
  side: placement,
8923
9098
  align,
@@ -9668,10 +9843,10 @@ function SPopover({
9668
9843
  const descColor = type === "default" ? "var(--cmp-popover-default-description)" : "var(--cmp-popover-light-description)";
9669
9844
  const leftLinkLabelClass = type === "default" ? "text-[color:var(--cmp-popover-default-subAction)]" : "text-[color:var(--cmp-popover-light-subAction)]";
9670
9845
  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 }) });
9671
- return /* @__PURE__ */ jsxRuntime.jsxs(RPopover12__namespace.Root, { open: actualOpen, onOpenChange: setOpen, children: [
9672
- /* @__PURE__ */ jsxRuntime.jsx(RPopover12__namespace.Trigger, { asChild: true, children: triggerNode }),
9673
- /* @__PURE__ */ jsxRuntime.jsx(RPopover12__namespace.Portal, { container: portalContainer, children: /* @__PURE__ */ jsxRuntime.jsxs(
9674
- RPopover12__namespace.Content,
9846
+ return /* @__PURE__ */ jsxRuntime.jsxs(RPopover13__namespace.Root, { open: actualOpen, onOpenChange: setOpen, children: [
9847
+ /* @__PURE__ */ jsxRuntime.jsx(RPopover13__namespace.Trigger, { asChild: true, children: triggerNode }),
9848
+ /* @__PURE__ */ jsxRuntime.jsx(RPopover13__namespace.Portal, { container: portalContainer, children: /* @__PURE__ */ jsxRuntime.jsxs(
9849
+ RPopover13__namespace.Content,
9675
9850
  {
9676
9851
  side: placement,
9677
9852
  sideOffset: 8,
@@ -9737,7 +9912,7 @@ function SPopover({
9737
9912
  ]
9738
9913
  }
9739
9914
  ),
9740
- /* @__PURE__ */ jsxRuntime.jsx(RPopover12__namespace.Arrow, { width: 16, height: 12, style: { fill: bg } })
9915
+ /* @__PURE__ */ jsxRuntime.jsx(RPopover13__namespace.Arrow, { width: 16, height: 12, style: { fill: bg } })
9741
9916
  ]
9742
9917
  }
9743
9918
  ) })
@@ -9855,10 +10030,10 @@ function SGuide({
9855
10030
  );
9856
10031
  if (isNotion)
9857
10032
  return /* @__PURE__ */ jsxRuntime.jsx("span", { className, style, children: trigger });
9858
- return /* @__PURE__ */ jsxRuntime.jsxs(RPopover12__namespace.Root, { open, onOpenChange: setOpen, children: [
9859
- /* @__PURE__ */ jsxRuntime.jsx(RPopover12__namespace.Trigger, { asChild: true, children: trigger }),
9860
- /* @__PURE__ */ jsxRuntime.jsx(RPopover12__namespace.Portal, { container: portalContainer, children: /* @__PURE__ */ jsxRuntime.jsxs(
9861
- RPopover12__namespace.Content,
10033
+ return /* @__PURE__ */ jsxRuntime.jsxs(RPopover13__namespace.Root, { open, onOpenChange: setOpen, children: [
10034
+ /* @__PURE__ */ jsxRuntime.jsx(RPopover13__namespace.Trigger, { asChild: true, children: trigger }),
10035
+ /* @__PURE__ */ jsxRuntime.jsx(RPopover13__namespace.Portal, { container: portalContainer, children: /* @__PURE__ */ jsxRuntime.jsxs(
10036
+ RPopover13__namespace.Content,
9862
10037
  {
9863
10038
  side: "bottom",
9864
10039
  align: "start",
@@ -12351,10 +12526,10 @@ var SGnb = /* @__PURE__ */ react.forwardRef(function SGnb2({
12351
12526
  ),
12352
12527
  header === "fix" && menuResizeHandle,
12353
12528
  launcherListBox,
12354
- /* @__PURE__ */ jsxRuntime.jsxs(RPopover12__namespace.Root, { open: labelTip !== null, onOpenChange: (open) => !open && setLabelTip(null), children: [
12355
- /* @__PURE__ */ jsxRuntime.jsx(RPopover12__namespace.Anchor, { virtualRef: labelTipAnchorRef }),
12356
- /* @__PURE__ */ jsxRuntime.jsx(RPopover12__namespace.Portal, { container: portalContainer, children: /* @__PURE__ */ jsxRuntime.jsx(
12357
- RPopover12__namespace.Content,
12529
+ /* @__PURE__ */ jsxRuntime.jsxs(RPopover13__namespace.Root, { open: labelTip !== null, onOpenChange: (open) => !open && setLabelTip(null), children: [
12530
+ /* @__PURE__ */ jsxRuntime.jsx(RPopover13__namespace.Anchor, { virtualRef: labelTipAnchorRef }),
12531
+ /* @__PURE__ */ jsxRuntime.jsx(RPopover13__namespace.Portal, { container: portalContainer, children: /* @__PURE__ */ jsxRuntime.jsx(
12532
+ RPopover13__namespace.Content,
12358
12533
  {
12359
12534
  side: "right",
12360
12535
  sideOffset: 4,
@@ -13842,7 +14017,8 @@ function layoutCalendarBoard({
13842
14017
  cells,
13843
14018
  events,
13844
14019
  rowCapacity,
13845
- blockedDates
14020
+ blockedDates,
14021
+ focusedEventId
13846
14022
  }) {
13847
14023
  const count = cells.length;
13848
14024
  const weekCount = Math.ceil(count / 7);
@@ -13850,6 +14026,7 @@ function layoutCalendarBoard({
13850
14026
  const eventsByCell = Array.from({ length: count }, () => []);
13851
14027
  const hiddenCountByCell = new Array(count).fill(0);
13852
14028
  const moreLaneByWeek = new Array(weekCount).fill(-1);
14029
+ const moreReplacedByCell = new Array(count).fill(false);
13853
14030
  const runs = [];
13854
14031
  events.forEach((event, order) => {
13855
14032
  const start = event.date;
@@ -13907,9 +14084,15 @@ function layoutCalendarBoard({
13907
14084
  const week = Math.floor(run.startIndex / 7);
13908
14085
  const moreLane = moreLaneByWeek[week];
13909
14086
  const limit = moreLane < 0 ? rowCapacity : moreLane;
13910
- if (run.lane >= limit) {
13911
- for (let i = run.startIndex; i <= run.endIndex; i++) hiddenCountByCell[i] += 1;
13912
- continue;
14087
+ let lane = run.lane;
14088
+ if (lane >= limit) {
14089
+ const focused = focusedEventId != null && run.event.id === focusedEventId && moreLane >= 0;
14090
+ if (!focused) {
14091
+ for (let i = run.startIndex; i <= run.endIndex; i++) hiddenCountByCell[i] += 1;
14092
+ continue;
14093
+ }
14094
+ lane = moreLane;
14095
+ for (let i = run.startIndex; i <= run.endIndex; i++) moreReplacedByCell[i] = true;
13913
14096
  }
13914
14097
  const { event } = run;
13915
14098
  segmentsByCell[run.startIndex].push({
@@ -13917,12 +14100,18 @@ function layoutCalendarBoard({
13917
14100
  key: `${event.id ?? `${event.date}-${run.order}`}-${run.startIndex}`,
13918
14101
  startIndex: run.startIndex,
13919
14102
  span: run.endIndex - run.startIndex + 1,
13920
- lane: run.lane,
14103
+ lane,
13921
14104
  startsHere: cells[run.startIndex].date === event.date,
13922
14105
  endsHere: cells[run.endIndex].date === eventEndDate(event)
13923
14106
  });
13924
14107
  }
13925
- return { segmentsByCell, eventsByCell, hiddenCountByCell, moreLaneByWeek };
14108
+ return {
14109
+ segmentsByCell,
14110
+ eventsByCell,
14111
+ hiddenCountByCell,
14112
+ moreLaneByWeek,
14113
+ moreReplacedByCell
14114
+ };
13926
14115
  }
13927
14116
 
13928
14117
  // src/components/SCalendarBoard/calendarBoard.config.ts
@@ -13952,6 +14141,7 @@ var CALENDAR_BOARD_EVENT_PRESETS = {
13952
14141
  white: { bg: BG("white"), dot: "grey" }
13953
14142
  };
13954
14143
  var CALENDAR_BOARD_MAX_VISIBLE_EVENTS = 4;
14144
+ var CALENDAR_BOARD_DIM_OPACITY = 0.4;
13955
14145
  var CALENDAR_BOARD_DAY_COLORS = [
13956
14146
  "default",
13957
14147
  "danger",
@@ -13971,6 +14161,7 @@ function CalendarEventButton({
13971
14161
  onSelect,
13972
14162
  flatStart = false,
13973
14163
  flatEnd = false,
14164
+ dimmed = false,
13974
14165
  className,
13975
14166
  style
13976
14167
  }) {
@@ -13998,7 +14189,11 @@ function CalendarEventButton({
13998
14189
  disabled ? "cursor-not-allowed opacity-50" : "cursor-pointer",
13999
14190
  className
14000
14191
  ),
14001
- style: { ...style, "--ceb-bg": preset.bg },
14192
+ style: {
14193
+ ...style,
14194
+ "--ceb-bg": preset.bg,
14195
+ ...dimmed && { opacity: CALENDAR_BOARD_DIM_OPACITY }
14196
+ },
14002
14197
  onClick: (e) => {
14003
14198
  if (disabled) return;
14004
14199
  onSelect?.(event, e);
@@ -14042,7 +14237,7 @@ function CalendarEventButton({
14042
14237
  }
14043
14238
  );
14044
14239
  }
14045
- var CalendarMoreButton = /* @__PURE__ */ react.forwardRef(function CalendarMoreButton2({ count, label = "\uB354\uBCF4\uAE30", onClick, className, style }, ref) {
14240
+ var CalendarMoreButton = /* @__PURE__ */ react.forwardRef(function CalendarMoreButton2({ count, label = "\uB354\uBCF4\uAE30", dimmed = false, onClick, className, style }, ref) {
14046
14241
  return /* @__PURE__ */ jsxRuntime.jsxs(
14047
14242
  "button",
14048
14243
  {
@@ -14055,7 +14250,7 @@ var CalendarMoreButton = /* @__PURE__ */ react.forwardRef(function CalendarMoreB
14055
14250
  "bg-(--cmp-calendarBoard-moreButton-bg)",
14056
14251
  className
14057
14252
  ),
14058
- style,
14253
+ style: dimmed ? { ...style, opacity: CALENDAR_BOARD_DIM_OPACITY } : style,
14059
14254
  onClick,
14060
14255
  children: [
14061
14256
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -14090,6 +14285,8 @@ var CalendarDayCard = /* @__PURE__ */ react.forwardRef(function CalendarDayCard2
14090
14285
  body,
14091
14286
  hiddenCount,
14092
14287
  moreLane,
14288
+ moreReplaced,
14289
+ focusedEventId,
14093
14290
  isOpen,
14094
14291
  moreLabel,
14095
14292
  onDaySelect,
@@ -14097,6 +14294,7 @@ var CalendarDayCard = /* @__PURE__ */ react.forwardRef(function CalendarDayCard2
14097
14294
  onOpenEvents,
14098
14295
  ...rest
14099
14296
  }, ref) {
14297
+ const focusing = focusedEventId != null;
14100
14298
  const hasEvents = dayEventCount > 0;
14101
14299
  const interactive = selectable || hasEvents;
14102
14300
  const activate = () => {
@@ -14158,6 +14356,7 @@ var CalendarDayCard = /* @__PURE__ */ react.forwardRef(function CalendarDayCard2
14158
14356
  event: segment.event,
14159
14357
  flatStart: !segment.startsHere,
14160
14358
  flatEnd: !segment.endsHere,
14359
+ dimmed: focusing && segment.event.id !== focusedEventId,
14161
14360
  className: "absolute z-10",
14162
14361
  style: {
14163
14362
  top: laneTop(segment.lane),
@@ -14171,11 +14370,12 @@ var CalendarDayCard = /* @__PURE__ */ react.forwardRef(function CalendarDayCard2
14171
14370
  },
14172
14371
  segment.key
14173
14372
  )),
14174
- body == null && hiddenCount > 0 && moreLane >= 0 && /* @__PURE__ */ jsxRuntime.jsx(
14373
+ body == null && hiddenCount > 0 && moreLane >= 0 && !moreReplaced && /* @__PURE__ */ jsxRuntime.jsx(
14175
14374
  CalendarMoreButton,
14176
14375
  {
14177
14376
  count: hiddenCount,
14178
14377
  label: moreLabel,
14378
+ dimmed: focusing,
14179
14379
  className: "absolute z-10",
14180
14380
  style: {
14181
14381
  top: laneTop(moreLane),
@@ -14273,6 +14473,7 @@ function SCalendarBoard({
14273
14473
  events,
14274
14474
  dayColors,
14275
14475
  dayContent,
14476
+ focusedEventId,
14276
14477
  onEventClick,
14277
14478
  onMoreClick,
14278
14479
  todayLabel = "\uC624\uB298",
@@ -14323,8 +14524,14 @@ function SCalendarBoard({
14323
14524
  const blockedDates = new Set(
14324
14525
  cells.filter((cell) => dayContent?.[cell.date] != null).map((cell) => cell.date)
14325
14526
  );
14326
- return layoutCalendarBoard({ cells, events: events ?? [], rowCapacity, blockedDates });
14327
- }, [cells, events, rowCapacity, dayContent]);
14527
+ return layoutCalendarBoard({
14528
+ cells,
14529
+ events: events ?? [],
14530
+ rowCapacity,
14531
+ blockedDates,
14532
+ focusedEventId
14533
+ });
14534
+ }, [cells, events, rowCapacity, dayContent, focusedEventId]);
14328
14535
  const openIndex = openDate == null ? -1 : cells.findIndex((cell) => cell.date === openDate);
14329
14536
  const openEvents = openIndex < 0 ? [] : layout.eventsByCell[openIndex];
14330
14537
  react.useLayoutEffect(() => {
@@ -14449,7 +14656,7 @@ function SCalendarBoard({
14449
14656
  }
14450
14657
  ),
14451
14658
  /* @__PURE__ */ jsxRuntime.jsxs(
14452
- RPopover12__namespace.Root,
14659
+ RPopover13__namespace.Root,
14453
14660
  {
14454
14661
  open: openDate !== null,
14455
14662
  onOpenChange: (open) => {
@@ -14485,6 +14692,8 @@ function SCalendarBoard({
14485
14692
  body: content,
14486
14693
  hiddenCount: layout.hiddenCountByCell[index],
14487
14694
  moreLane: layout.moreLaneByWeek[Math.floor(index / 7)],
14695
+ moreReplaced: layout.moreReplacedByCell[index],
14696
+ focusedEventId,
14488
14697
  isOpen: openDate === cell.date,
14489
14698
  moreLabel,
14490
14699
  onDaySelect: (date) => onValueChange?.(date, list),
@@ -14493,12 +14702,12 @@ function SCalendarBoard({
14493
14702
  },
14494
14703
  cell.date
14495
14704
  );
14496
- return cell.date === openDate ? /* @__PURE__ */ jsxRuntime.jsx(RPopover12__namespace.Anchor, { asChild: true, children: card }, cell.date) : card;
14705
+ return cell.date === openDate ? /* @__PURE__ */ jsxRuntime.jsx(RPopover13__namespace.Anchor, { asChild: true, children: card }, cell.date) : card;
14497
14706
  })
14498
14707
  }
14499
14708
  ),
14500
- /* @__PURE__ */ jsxRuntime.jsx(RPopover12__namespace.Portal, { container: portalContainer, children: /* @__PURE__ */ jsxRuntime.jsx(
14501
- RPopover12__namespace.Content,
14709
+ /* @__PURE__ */ jsxRuntime.jsx(RPopover13__namespace.Portal, { container: portalContainer, children: /* @__PURE__ */ jsxRuntime.jsx(
14710
+ RPopover13__namespace.Content,
14502
14711
  {
14503
14712
  onInteractOutside: (e) => {
14504
14713
  const target = e.detail.originalEvent.target;
@@ -17001,10 +17210,10 @@ function useTruncatedValueTooltip({
17001
17210
  valueRef: elRef,
17002
17211
  onMouseEnter: active ? onMouseEnter : cancelHide,
17003
17212
  onMouseLeave: active ? startHide : cancelHide,
17004
- tooltip: active ? /* @__PURE__ */ jsxRuntime.jsxs(RPopover12__namespace.Root, { open, onOpenChange: setOpen, children: [
17005
- /* @__PURE__ */ jsxRuntime.jsx(RPopover12__namespace.Anchor, { virtualRef: elRef }),
17006
- /* @__PURE__ */ jsxRuntime.jsx(RPopover12__namespace.Portal, { container: portalContainer, children: /* @__PURE__ */ jsxRuntime.jsx(
17007
- RPopover12__namespace.Content,
17213
+ tooltip: active ? /* @__PURE__ */ jsxRuntime.jsxs(RPopover13__namespace.Root, { open, onOpenChange: setOpen, children: [
17214
+ /* @__PURE__ */ jsxRuntime.jsx(RPopover13__namespace.Anchor, { virtualRef: elRef }),
17215
+ /* @__PURE__ */ jsxRuntime.jsx(RPopover13__namespace.Portal, { container: portalContainer, children: /* @__PURE__ */ jsxRuntime.jsx(
17216
+ RPopover13__namespace.Content,
17008
17217
  {
17009
17218
  side: "top",
17010
17219
  sideOffset: 4,
@@ -18258,8 +18467,8 @@ function SDatePicker({
18258
18467
  disabled,
18259
18468
  className,
18260
18469
  style,
18261
- children: /* @__PURE__ */ jsxRuntime.jsxs(RPopover12__namespace.Root, { open, onOpenChange: (o) => !disabled && setOpen(o), children: [
18262
- /* @__PURE__ */ jsxRuntime.jsx(RPopover12__namespace.Trigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsxs(
18470
+ children: /* @__PURE__ */ jsxRuntime.jsxs(RPopover13__namespace.Root, { open, onOpenChange: (o) => !disabled && setOpen(o), children: [
18471
+ /* @__PURE__ */ jsxRuntime.jsx(RPopover13__namespace.Trigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsxs(
18263
18472
  "div",
18264
18473
  {
18265
18474
  role: "button",
@@ -18318,8 +18527,8 @@ function SDatePicker({
18318
18527
  ]
18319
18528
  }
18320
18529
  ) }),
18321
- /* @__PURE__ */ jsxRuntime.jsx(RPopover12__namespace.Portal, { container: portalContainer, children: /* @__PURE__ */ jsxRuntime.jsx(
18322
- RPopover12__namespace.Content,
18530
+ /* @__PURE__ */ jsxRuntime.jsx(RPopover13__namespace.Portal, { container: portalContainer, children: /* @__PURE__ */ jsxRuntime.jsx(
18531
+ RPopover13__namespace.Content,
18323
18532
  {
18324
18533
  side: "bottom",
18325
18534
  align: mode === "date" ? "start" : "center",
@@ -18795,7 +19004,7 @@ function SDateRangePicker({
18795
19004
  className,
18796
19005
  style,
18797
19006
  children: /* @__PURE__ */ jsxRuntime.jsxs(
18798
- RPopover12__namespace.Root,
19007
+ RPopover13__namespace.Root,
18799
19008
  {
18800
19009
  open,
18801
19010
  onOpenChange: (o) => {
@@ -18804,7 +19013,7 @@ function SDateRangePicker({
18804
19013
  if (!o) setPendingStart(null);
18805
19014
  },
18806
19015
  children: [
18807
- /* @__PURE__ */ jsxRuntime.jsx(RPopover12__namespace.Trigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsxs(
19016
+ /* @__PURE__ */ jsxRuntime.jsx(RPopover13__namespace.Trigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsxs(
18808
19017
  "div",
18809
19018
  {
18810
19019
  role: "button",
@@ -18868,8 +19077,8 @@ function SDateRangePicker({
18868
19077
  ]
18869
19078
  }
18870
19079
  ) }),
18871
- /* @__PURE__ */ jsxRuntime.jsx(RPopover12__namespace.Portal, { container: portalContainer, children: /* @__PURE__ */ jsxRuntime.jsx(
18872
- RPopover12__namespace.Content,
19080
+ /* @__PURE__ */ jsxRuntime.jsx(RPopover13__namespace.Portal, { container: portalContainer, children: /* @__PURE__ */ jsxRuntime.jsx(
19081
+ RPopover13__namespace.Content,
18873
19082
  {
18874
19083
  side: "bottom",
18875
19084
  align: "start",
@@ -19636,6 +19845,10 @@ var ChartFrame = /* @__PURE__ */ react.forwardRef(function ChartFrame2({ title,
19636
19845
  }
19637
19846
  );
19638
19847
  });
19848
+
19849
+ // src/lib/chart/hover-dim.ts
19850
+ var CHART_DIM_OPACITY_TRANSITION = "transition-opacity duration-200 ease-out motion-reduce:transition-none";
19851
+ var CHART_DIM_COLOR_TRANSITION = "transition-colors duration-200 ease-out motion-reduce:transition-none";
19639
19852
  var DOT_SIZE = 6;
19640
19853
  function ChartLegend({
19641
19854
  items,
@@ -19668,7 +19881,7 @@ function ChartLegend({
19668
19881
  "flex items-center gap-(--cmp-chart-legendItem-gap)",
19669
19882
  "py-(--cmp-chart-legendItem-paddingY)",
19670
19883
  "typo-body-sm-medium text-(--cmp-chart-legendItem-color)",
19671
- "transition-opacity duration-200 ease-out motion-reduce:transition-none",
19884
+ CHART_DIM_OPACITY_TRANSITION,
19672
19885
  activeIndex != null && activeIndex !== index && "opacity-(--opacity-060)"
19673
19886
  ),
19674
19887
  children: [
@@ -19699,7 +19912,7 @@ function ChartLegend({
19699
19912
  "flex items-center gap-(--cmp-chart-legendItem-gap)",
19700
19913
  "py-(--cmp-chart-legendItem-paddingY)",
19701
19914
  "typo-body-sm-medium text-(--cmp-chart-legendItem-color)",
19702
- "transition-opacity duration-200 ease-out motion-reduce:transition-none",
19915
+ CHART_DIM_OPACITY_TRANSITION,
19703
19916
  activeIndex != null && activeIndex !== index && "opacity-(--opacity-060)"
19704
19917
  ),
19705
19918
  children: [
@@ -19928,7 +20141,6 @@ var BAR_OPACITY_HOVER = 1;
19928
20141
  var BAR_DATA_LABEL_COLOR = "var(--cmp-chart-dataLabel-color-default)";
19929
20142
  var BAR_DATA_LABEL_TYPO = "typo-body-sm-medium";
19930
20143
  var BAR_DATA_LABEL_TYPO_HOVER = "typo-body-md-bold";
19931
- var BAR_HOVER_TRANSITION = "transition-opacity duration-200 ease-out motion-reduce:transition-none";
19932
20144
  function bandLayout(size, categoryCount, seriesCount, barSizeMax = BAR_SIZE_MAX) {
19933
20145
  const categories = Math.max(1, categoryCount);
19934
20146
  const series = Math.max(1, seriesCount);
@@ -20195,7 +20407,7 @@ var SBarChart = /* @__PURE__ */ react.forwardRef(function SBarChart2({
20195
20407
  "path",
20196
20408
  {
20197
20409
  d: barPath(x, y, width, barHeight, direction, negative),
20198
- className: BAR_HOVER_TRANSITION,
20410
+ className: CHART_DIM_OPACITY_TRANSITION,
20199
20411
  style: {
20200
20412
  fill: colorAt(seriesIndex, categoryIndex),
20201
20413
  opacity,
@@ -20212,7 +20424,7 @@ var SBarChart = /* @__PURE__ */ react.forwardRef(function SBarChart2({
20212
20424
  y: labelY,
20213
20425
  className: cn(
20214
20426
  hoveredCategory === categoryIndex ? BAR_DATA_LABEL_TYPO_HOVER : BAR_DATA_LABEL_TYPO,
20215
- BAR_HOVER_TRANSITION
20427
+ CHART_DIM_OPACITY_TRANSITION
20216
20428
  ),
20217
20429
  style: {
20218
20430
  fill: BAR_DATA_LABEL_COLOR,
@@ -20293,7 +20505,7 @@ var SBarChart = /* @__PURE__ */ react.forwardRef(function SBarChart2({
20293
20505
  width: box3.width,
20294
20506
  height: box3.height,
20295
20507
  clipPath: `url(#${segment.value < 0 ? negativeClip : positiveClip})`,
20296
- className: BAR_HOVER_TRANSITION,
20508
+ className: CHART_DIM_OPACITY_TRANSITION,
20297
20509
  style: {
20298
20510
  // 조각과 라벨에 따로 건다 — 묶음(<g>)에 걸면 호버가 없을 때의
20299
20511
  // 기본 흐림까지 합계 라벨에 묻어 숫자가 늘 옅어진다.
@@ -20318,7 +20530,7 @@ var SBarChart = /* @__PURE__ */ react.forwardRef(function SBarChart2({
20318
20530
  y: labelY,
20319
20531
  className: cn(
20320
20532
  hoveredCategory === categoryIndex ? BAR_DATA_LABEL_TYPO_HOVER : BAR_DATA_LABEL_TYPO,
20321
- BAR_HOVER_TRANSITION
20533
+ CHART_DIM_OPACITY_TRANSITION
20322
20534
  ),
20323
20535
  style: {
20324
20536
  fill: BAR_DATA_LABEL_COLOR,
@@ -20841,6 +21053,7 @@ var SLineChart = /* @__PURE__ */ react.forwardRef(function SLineChart2({
20841
21053
  cx: point.x,
20842
21054
  cy: point.y,
20843
21055
  r: hovered ? POINT_HOVER_RADIUS : POINT_RADIUS,
21056
+ className: CHART_DIM_COLOR_TRANSITION,
20844
21057
  style: {
20845
21058
  fill: dimmed ? dimmedColorAt(seriesIndex) : color,
20846
21059
  cursor: onPointClick ? "pointer" : void 0
@@ -21195,7 +21408,7 @@ var RadialChart = /* @__PURE__ */ react.forwardRef(function RadialChart2({
21195
21408
  {
21196
21409
  d: slice(arc2),
21197
21410
  fillRule: "evenodd",
21198
- className: "transition-opacity duration-200 ease-out motion-reduce:transition-none",
21411
+ className: CHART_DIM_OPACITY_TRANSITION,
21199
21412
  style: {
21200
21413
  fill: arc2.color,
21201
21414
  opacity,
@@ -21228,7 +21441,10 @@ var RadialChart = /* @__PURE__ */ react.forwardRef(function RadialChart2({
21228
21441
  y: point.y,
21229
21442
  textAnchor: "middle",
21230
21443
  dominantBaseline: "central",
21231
- className: "pointer-events-none typo-body-sm-bold transition-opacity duration-200 ease-out motion-reduce:transition-none",
21444
+ className: cn(
21445
+ "pointer-events-none typo-body-sm-bold",
21446
+ CHART_DIM_OPACITY_TRANSITION
21447
+ ),
21232
21448
  style: {
21233
21449
  fill: "var(--sys-color-fg-inverse)",
21234
21450
  opacity: hovered != null && hovered !== arc2.index ? OPACITY_DIMMED : void 0
@@ -23245,10 +23461,10 @@ function EditorToolbarBar({
23245
23461
  },
23246
23462
  item4
23247
23463
  );
23248
- return /* @__PURE__ */ jsxRuntime.jsxs(RPopover12__namespace.Root, { open: linkOpen, onOpenChange: setLinkOpen, children: [
23249
- /* @__PURE__ */ jsxRuntime.jsx(RPopover12__namespace.Trigger, { asChild: true, disabled: off, children: /* @__PURE__ */ jsxRuntime.jsx(ToolbarButton, { label: "\uB9C1\uD06C", active: state2.link, disabled: off, children: /* @__PURE__ */ jsxRuntime.jsx(IconLink, { size: ICON_SIZE }) }) }),
23250
- /* @__PURE__ */ jsxRuntime.jsx(RPopover12__namespace.Portal, { container: portalContainer, children: /* @__PURE__ */ jsxRuntime.jsx(
23251
- RPopover12__namespace.Content,
23464
+ return /* @__PURE__ */ jsxRuntime.jsxs(RPopover13__namespace.Root, { open: linkOpen, onOpenChange: setLinkOpen, children: [
23465
+ /* @__PURE__ */ jsxRuntime.jsx(RPopover13__namespace.Trigger, { asChild: true, disabled: off, children: /* @__PURE__ */ jsxRuntime.jsx(ToolbarButton, { label: "\uB9C1\uD06C", active: state2.link, disabled: off, children: /* @__PURE__ */ jsxRuntime.jsx(IconLink, { size: ICON_SIZE }) }) }),
23466
+ /* @__PURE__ */ jsxRuntime.jsx(RPopover13__namespace.Portal, { container: portalContainer, children: /* @__PURE__ */ jsxRuntime.jsx(
23467
+ RPopover13__namespace.Content,
23252
23468
  {
23253
23469
  sideOffset: 4,
23254
23470
  align: "start",
@@ -24641,8 +24857,8 @@ var SChipFilter = /* @__PURE__ */ react.forwardRef(function SChipFilter2({
24641
24857
  })(),
24642
24858
  hasRightActions && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
24643
24859
  /* @__PURE__ */ jsxRuntime.jsx(Divider, { inset: true }),
24644
- hasAddButton && /* @__PURE__ */ jsxRuntime.jsxs(RPopover12__namespace.Root, { open: addOpen, onOpenChange: setAddOpen, children: [
24645
- /* @__PURE__ */ jsxRuntime.jsx(RPopover12__namespace.Trigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsxs(
24860
+ hasAddButton && /* @__PURE__ */ jsxRuntime.jsxs(RPopover13__namespace.Root, { open: addOpen, onOpenChange: setAddOpen, children: [
24861
+ /* @__PURE__ */ jsxRuntime.jsx(RPopover13__namespace.Trigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsxs(
24646
24862
  "button",
24647
24863
  {
24648
24864
  type: "button",
@@ -24667,8 +24883,8 @@ var SChipFilter = /* @__PURE__ */ react.forwardRef(function SChipFilter2({
24667
24883
  ]
24668
24884
  }
24669
24885
  ) }),
24670
- /* @__PURE__ */ jsxRuntime.jsx(RPopover12__namespace.Portal, { container: portalContainer, children: /* @__PURE__ */ jsxRuntime.jsx(
24671
- RPopover12__namespace.Content,
24886
+ /* @__PURE__ */ jsxRuntime.jsx(RPopover13__namespace.Portal, { container: portalContainer, children: /* @__PURE__ */ jsxRuntime.jsx(
24887
+ RPopover13__namespace.Content,
24672
24888
  {
24673
24889
  side: "bottom",
24674
24890
  align: "start",
@@ -24703,17 +24919,17 @@ var SChipFilter = /* @__PURE__ */ react.forwardRef(function SChipFilter2({
24703
24919
  )
24704
24920
  ] })
24705
24921
  ] }),
24706
- /* @__PURE__ */ jsxRuntime.jsxs(RPopover12__namespace.Root, { open: openKey != null, onOpenChange: (next) => !next && setOpenKey(null), children: [
24922
+ /* @__PURE__ */ jsxRuntime.jsxs(RPopover13__namespace.Root, { open: openKey != null, onOpenChange: (next) => !next && setOpenKey(null), children: [
24707
24923
  /* @__PURE__ */ jsxRuntime.jsx(
24708
- RPopover12__namespace.Anchor,
24924
+ RPopover13__namespace.Anchor,
24709
24925
  {
24710
24926
  virtualRef: {
24711
24927
  current: openKey ? triggerRefs.current.get(openKey) : null
24712
24928
  }
24713
24929
  }
24714
24930
  ),
24715
- /* @__PURE__ */ jsxRuntime.jsx(RPopover12__namespace.Portal, { container: portalContainer, children: /* @__PURE__ */ jsxRuntime.jsx(
24716
- RPopover12__namespace.Content,
24931
+ /* @__PURE__ */ jsxRuntime.jsx(RPopover13__namespace.Portal, { container: portalContainer, children: /* @__PURE__ */ jsxRuntime.jsx(
24932
+ RPopover13__namespace.Content,
24717
24933
  {
24718
24934
  side: "bottom",
24719
24935
  align: "start",
@@ -25306,8 +25522,8 @@ function InlineDatePresetFilter({
25306
25522
  applied && (rangeValue ? (
25307
25523
  // 뱃지 모양은 그대로 두고, 눌렀을 때 캘린더가 열려 기간을 직접 다시 고를 수 있게 한다.
25308
25524
  // 직접 고르면 프리셋 선택은 해제된다.
25309
- /* @__PURE__ */ jsxRuntime.jsxs(RPopover12__namespace.Root, { open: pickerOpen, onOpenChange: setPickerOpen, children: [
25310
- /* @__PURE__ */ jsxRuntime.jsx(RPopover12__namespace.Trigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(
25525
+ /* @__PURE__ */ jsxRuntime.jsxs(RPopover13__namespace.Root, { open: pickerOpen, onOpenChange: setPickerOpen, children: [
25526
+ /* @__PURE__ */ jsxRuntime.jsx(RPopover13__namespace.Trigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(
25311
25527
  "button",
25312
25528
  {
25313
25529
  type: "button",
@@ -25316,8 +25532,8 @@ function InlineDatePresetFilter({
25316
25532
  children: badge
25317
25533
  }
25318
25534
  ) }),
25319
- /* @__PURE__ */ jsxRuntime.jsx(RPopover12__namespace.Portal, { container: portalContainer, children: /* @__PURE__ */ jsxRuntime.jsx(
25320
- RPopover12__namespace.Content,
25535
+ /* @__PURE__ */ jsxRuntime.jsx(RPopover13__namespace.Portal, { container: portalContainer, children: /* @__PURE__ */ jsxRuntime.jsx(
25536
+ RPopover13__namespace.Content,
25321
25537
  {
25322
25538
  side: "bottom",
25323
25539
  align: "start",
@@ -26779,8 +26995,8 @@ function STimePicker({
26779
26995
  disabled,
26780
26996
  className,
26781
26997
  style,
26782
- children: /* @__PURE__ */ jsxRuntime.jsxs(RPopover12__namespace.Root, { open, onOpenChange: commitOpen, children: [
26783
- /* @__PURE__ */ jsxRuntime.jsx(RPopover12__namespace.Trigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsxs(
26998
+ children: /* @__PURE__ */ jsxRuntime.jsxs(RPopover13__namespace.Root, { open, onOpenChange: commitOpen, children: [
26999
+ /* @__PURE__ */ jsxRuntime.jsx(RPopover13__namespace.Trigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsxs(
26784
27000
  "div",
26785
27001
  {
26786
27002
  ref: triggerRef,
@@ -26840,8 +27056,8 @@ function STimePicker({
26840
27056
  ]
26841
27057
  }
26842
27058
  ) }),
26843
- /* @__PURE__ */ jsxRuntime.jsx(RPopover12__namespace.Portal, { container: portalContainer, children: /* @__PURE__ */ jsxRuntime.jsx(
26844
- RPopover12__namespace.Content,
27059
+ /* @__PURE__ */ jsxRuntime.jsx(RPopover13__namespace.Portal, { container: portalContainer, children: /* @__PURE__ */ jsxRuntime.jsx(
27060
+ RPopover13__namespace.Content,
26845
27061
  {
26846
27062
  side: "bottom",
26847
27063
  align: "start",
@@ -27249,8 +27465,8 @@ function STimeRangePicker({
27249
27465
  disabled,
27250
27466
  className,
27251
27467
  style,
27252
- children: /* @__PURE__ */ jsxRuntime.jsxs(RPopover12__namespace.Root, { open, onOpenChange: commitOpen, children: [
27253
- /* @__PURE__ */ jsxRuntime.jsx(RPopover12__namespace.Trigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsxs(
27468
+ children: /* @__PURE__ */ jsxRuntime.jsxs(RPopover13__namespace.Root, { open, onOpenChange: commitOpen, children: [
27469
+ /* @__PURE__ */ jsxRuntime.jsx(RPopover13__namespace.Trigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsxs(
27254
27470
  "div",
27255
27471
  {
27256
27472
  ref: triggerRef,
@@ -27310,8 +27526,8 @@ function STimeRangePicker({
27310
27526
  ]
27311
27527
  }
27312
27528
  ) }),
27313
- /* @__PURE__ */ jsxRuntime.jsx(RPopover12__namespace.Portal, { container: portalContainer, children: /* @__PURE__ */ jsxRuntime.jsx(
27314
- RPopover12__namespace.Content,
27529
+ /* @__PURE__ */ jsxRuntime.jsx(RPopover13__namespace.Portal, { container: portalContainer, children: /* @__PURE__ */ jsxRuntime.jsx(
27530
+ RPopover13__namespace.Content,
27315
27531
  {
27316
27532
  side: "bottom",
27317
27533
  align: "start",
@@ -27460,7 +27676,6 @@ exports.SList = SList2;
27460
27676
  exports.SListItem = SListItem2;
27461
27677
  exports.SLoadingContainer = SLoadingContainer;
27462
27678
  exports.SLoadingModal = SLoadingModal;
27463
- exports.SLoadingViewport = SLoadingViewport;
27464
27679
  exports.SLoginCard = SLoginCard2;
27465
27680
  exports.SLogo = SLogo;
27466
27681
  exports.SMeatballButton = SMeatballButton2;