sellmate-design-system-react 9.0.0-beta.32 → 9.0.0-beta.34

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 (32) hide show
  1. package/AGENTS.md +21 -6
  2. package/dist/components/SBadge/README.md +2 -0
  3. package/dist/components/SButton/README.md +2 -0
  4. package/dist/components/SCalendarBoard/CalendarDayCard.d.ts +38 -0
  5. package/dist/components/SCalendarBoard/CalendarDayEventListBox.d.ts +26 -0
  6. package/dist/components/SCalendarBoard/CalendarEventButton.d.ts +13 -0
  7. package/dist/components/SCalendarBoard/CalendarMoreButton.d.ts +12 -0
  8. package/dist/components/SCalendarBoard/README.md +137 -0
  9. package/dist/components/SCalendarBoard/SCalendarBoard.d.ts +68 -0
  10. package/dist/components/SCalendarBoard/calendarBoard.config.d.ts +33 -0
  11. package/dist/components/SCalendarBoard/index.d.ts +3 -0
  12. package/dist/components/SCalendarBoard/types.d.ts +31 -0
  13. package/dist/components/SDivider/README.md +2 -0
  14. package/dist/components/SGhostButton/README.md +2 -0
  15. package/dist/components/SGnb/SGnb.d.ts +6 -0
  16. package/dist/components/SGnb/gnb.config.d.ts +3 -3
  17. package/dist/components/SGnbSystem/README.md +43 -1
  18. package/dist/components/SGnbSystem/SGnbSystem.d.ts +48 -2
  19. package/dist/components/SPortal/README.md +2 -0
  20. package/dist/components/SScrollArea/README.md +13 -0
  21. package/dist/components/SSystemActionButton/systemActionButton.config.d.ts +8 -2
  22. package/dist/components/STooltip/README.md +2 -0
  23. package/dist/index.cjs +823 -129
  24. package/dist/index.cjs.map +1 -1
  25. package/dist/index.d.ts +1 -0
  26. package/dist/index.js +817 -129
  27. package/dist/index.js.map +1 -1
  28. package/dist/llms-full.txt +206 -7
  29. package/dist/llms.txt +23 -8
  30. package/dist/styles.css +290 -9
  31. package/dist/theme.css +74 -8
  32. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -5,7 +5,7 @@ import { forwardRef, useState, useRef, useEffect, createContext, useContext, use
5
5
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
6
6
  import { createPortal } from 'react-dom';
7
7
  import * as RCheckbox from '@radix-ui/react-checkbox';
8
- import * as RPopover11 from '@radix-ui/react-popover';
8
+ import * as RPopover12 from '@radix-ui/react-popover';
9
9
  import { createRoot } from 'react-dom/client';
10
10
  import * as RTooltip from '@radix-ui/react-tooltip';
11
11
  import * as RDropdown2 from '@radix-ui/react-dropdown-menu';
@@ -5164,8 +5164,8 @@ function SGhostButton({
5164
5164
  }
5165
5165
  );
5166
5166
  if (!hasTooltip) return btn2;
5167
- return /* @__PURE__ */ jsxs(RPopover11.Root, { open, onOpenChange: setOpen, children: [
5168
- /* @__PURE__ */ jsx(RPopover11.Anchor, { asChild: true, children: /* @__PURE__ */ jsx(
5167
+ return /* @__PURE__ */ jsxs(RPopover12.Root, { open, onOpenChange: setOpen, children: [
5168
+ /* @__PURE__ */ jsx(RPopover12.Anchor, { asChild: true, children: /* @__PURE__ */ jsx(
5169
5169
  "span",
5170
5170
  {
5171
5171
  className: cn("inline-flex", anchorClassName),
@@ -5177,8 +5177,8 @@ function SGhostButton({
5177
5177
  children: btn2
5178
5178
  }
5179
5179
  ) }),
5180
- /* @__PURE__ */ jsx(RPopover11.Portal, { container: portalContainer, children: /* @__PURE__ */ jsx(
5181
- RPopover11.Content,
5180
+ /* @__PURE__ */ jsx(RPopover12.Portal, { container: portalContainer, children: /* @__PURE__ */ jsx(
5181
+ RPopover12.Content,
5182
5182
  {
5183
5183
  side: "top",
5184
5184
  sideOffset: 4,
@@ -5754,14 +5754,14 @@ var STooltipImpl = /* @__PURE__ */ forwardRef(function STooltip({
5754
5754
  ...style,
5755
5755
  ...contentPropsStyle
5756
5756
  };
5757
- return /* @__PURE__ */ jsxs(RPopover11.Root, { open, onOpenChange: setOpenState, children: [
5757
+ return /* @__PURE__ */ jsxs(RPopover12.Root, { open, onOpenChange: setOpenState, children: [
5758
5758
  isNone ? (
5759
5759
  // 트리거 없음: children 을 래퍼 없이 그대로 앵커로 쓴다 (소비자 레이아웃 보존).
5760
5760
  // mouse/focus 핸들러가 없으므로 useClose 없이도 자동 닫힘이 발생하지 않는다.
5761
- /* @__PURE__ */ jsx(RPopover11.Anchor, { asChild: true, children: triggerNode })
5761
+ /* @__PURE__ */ jsx(RPopover12.Anchor, { asChild: true, children: triggerNode })
5762
5762
  ) : isHover ? (
5763
5763
  // hover: Anchor(위치 기준) + 직접 mouse 핸들러 — 클릭으로 토글되지 않도록 Trigger 미사용
5764
- /* @__PURE__ */ jsx(RPopover11.Anchor, { asChild: true, children: /* @__PURE__ */ jsx(
5764
+ /* @__PURE__ */ jsx(RPopover12.Anchor, { asChild: true, children: /* @__PURE__ */ jsx(
5765
5765
  "span",
5766
5766
  {
5767
5767
  className: "inline-flex",
@@ -5772,9 +5772,9 @@ var STooltipImpl = /* @__PURE__ */ forwardRef(function STooltip({
5772
5772
  children: triggerNode
5773
5773
  }
5774
5774
  ) })
5775
- ) : /* @__PURE__ */ jsx(RPopover11.Trigger, { asChild: true, children: triggerNode }),
5776
- /* @__PURE__ */ jsx(RPopover11.Portal, { container: portalContainer, children: /* @__PURE__ */ jsxs(
5777
- RPopover11.Content,
5775
+ ) : /* @__PURE__ */ jsx(RPopover12.Trigger, { asChild: true, children: triggerNode }),
5776
+ /* @__PURE__ */ jsx(RPopover12.Portal, { container: portalContainer, children: /* @__PURE__ */ jsxs(
5777
+ RPopover12.Content,
5778
5778
  {
5779
5779
  side: placement,
5780
5780
  sideOffset,
@@ -5808,7 +5808,7 @@ var STooltipImpl = /* @__PURE__ */ forwardRef(function STooltip({
5808
5808
  }
5809
5809
  )
5810
5810
  ] }),
5811
- /* @__PURE__ */ jsx(RPopover11.Arrow, { width: 16, height: 12, style: { fill: bg } })
5811
+ /* @__PURE__ */ jsx(RPopover12.Arrow, { width: 16, height: 12, style: { fill: bg } })
5812
5812
  ]
5813
5813
  }
5814
5814
  ) })
@@ -6886,7 +6886,7 @@ function SPortal({
6886
6886
  const portalContainer = usePortalContainer();
6887
6887
  const { minWidth: styleMinWidth, maxWidth: styleMaxWidth, ...restStyle } = style ?? {};
6888
6888
  return /* @__PURE__ */ jsxs(
6889
- RPopover11.Root,
6889
+ RPopover12.Root,
6890
6890
  {
6891
6891
  open,
6892
6892
  onOpenChange: (next) => {
@@ -6894,9 +6894,9 @@ function SPortal({
6894
6894
  if (!next) onClose?.();
6895
6895
  },
6896
6896
  children: [
6897
- /* @__PURE__ */ jsx(RPopover11.Anchor, { virtualRef: anchorRef }),
6898
- /* @__PURE__ */ jsx(RPopover11.Portal, { container: portalContainer, children: /* @__PURE__ */ jsx(
6899
- RPopover11.Content,
6897
+ /* @__PURE__ */ jsx(RPopover12.Anchor, { virtualRef: anchorRef }),
6898
+ /* @__PURE__ */ jsx(RPopover12.Portal, { container: portalContainer, children: /* @__PURE__ */ jsx(
6899
+ RPopover12.Content,
6900
6900
  {
6901
6901
  side: placement,
6902
6902
  align,
@@ -7340,12 +7340,15 @@ var SYSTEM_ACTION_BUTTON_COLOR_CONFIG = {
7340
7340
  dark: {
7341
7341
  bg: item2("dark-bg-default"),
7342
7342
  bgHover: item2("dark-bg-hover"),
7343
+ // 프레임은 hover 에서도 행의 기본 표면색을 지킨다 — 표면만 한 단계 밝아지고 프레임은
7344
+ // 제자리에 남아, 밝아진 면에 뚫린 구멍처럼 읽힌다. `dark-icon-bg-hover`(흰색) 토큰은
7345
+ // 이 시안과 어긋나 쓰지 않는다.
7343
7346
  iconBg: item2("dark-icon-bg-default"),
7344
- iconBgHover: item2("dark-icon-bg-hover"),
7345
- // 어두운 면에는 글리프색 토큰이 없다. 기본은 프레임이 배경과 블렌딩되므로 라벨색(흰색),
7346
- // hover 는 프레임이 흰색이 되므로 그 위에 표면색을 그대로 얹는다.
7347
+ iconBgHover: item2("dark-icon-bg-default"),
7348
+ // 어두운 면에는 글리프색 토큰이 없다. 프레임이 배경과 블렌딩되므로 라벨색(흰색)을 쓰고,
7349
+ // 프레임이 hover 에서 그대로이므로 글리프도 그대로 둔다.
7347
7350
  iconGlyph: item2("dark-text"),
7348
- iconGlyphHover: item2("dark-bg-hover"),
7351
+ iconGlyphHover: item2("dark-text"),
7349
7352
  text: item2("dark-text"),
7350
7353
  actionText: {
7351
7354
  switch: action("switch-text-dark"),
@@ -7357,10 +7360,11 @@ var SYSTEM_ACTION_BUTTON_COLOR_CONFIG = {
7357
7360
  darker: {
7358
7361
  bg: item2("darker-bg-default"),
7359
7362
  bgHover: item2("darker-bg-hover"),
7363
+ // dark 와 같은 규칙 — 프레임은 hover 에서도 행의 기본 표면색을 지킨다.
7360
7364
  iconBg: item2("darker-icon-bg-default"),
7361
- iconBgHover: item2("darker-icon-bg-hover"),
7365
+ iconBgHover: item2("darker-icon-bg-default"),
7362
7366
  iconGlyph: item2("darker-text"),
7363
- iconGlyphHover: item2("darker-bg-hover"),
7367
+ iconGlyphHover: item2("darker-text"),
7364
7368
  text: item2("darker-text"),
7365
7369
  actionText: {
7366
7370
  switch: action("switch-text-dark"),
@@ -7405,7 +7409,13 @@ var SYSTEM_ACTION_BUTTON_LAYOUT = {
7405
7409
  /** 우측 여백 */
7406
7410
  paddingRight: action("paddingRight"),
7407
7411
  /** 액션 텍스트 ↔ 액션 아이콘 간격 */
7408
- actionGap: action("selectData-gap")
7412
+ actionGap: action("selectData-gap"),
7413
+ /**
7414
+ * 액션 아이콘 글리프 한 변. 프레임 한 변은 타입별 토큰(`actionButton.*-icon`)이 정하고
7415
+ * 그 안에 글리프가 이 크기로 놓인다 — 선행 아이콘의 프레임(24)/글리프(20) 과 같은 구조다.
7416
+ * 대응 토큰이 없어 디자인 값을 그대로 쓴다.
7417
+ */
7418
+ actionIconGlyph: "12px"
7409
7419
  };
7410
7420
  function TokenIcon2({ name, size }) {
7411
7421
  return /* @__PURE__ */ jsx(SIcon, { name, size: "100%", style: { width: size, height: size } });
@@ -7508,7 +7518,15 @@ var SSystemActionButton = /* @__PURE__ */ forwardRef(
7508
7518
  children: actionText
7509
7519
  }
7510
7520
  ),
7511
- spec.actionIcon && /* @__PURE__ */ jsx("span", { className: "inline-flex shrink-0 items-center text-(--sab-action-icon)", children: /* @__PURE__ */ jsx(TokenIcon2, { name: spec.actionIcon.name, size: spec.actionIcon.size }) })
7521
+ spec.actionIcon && // 토큰이 정하는 크기는 글리프가 아니라 프레임이다 — 그 안에 글리프를 가운데로 놓는다.
7522
+ /* @__PURE__ */ jsx(
7523
+ "span",
7524
+ {
7525
+ className: "inline-flex shrink-0 items-center justify-center text-(--sab-action-icon)",
7526
+ style: { width: spec.actionIcon.size, height: spec.actionIcon.size },
7527
+ children: /* @__PURE__ */ jsx(TokenIcon2, { name: spec.actionIcon.name, size: SYSTEM_ACTION_BUTTON_LAYOUT.actionIconGlyph })
7528
+ }
7529
+ )
7512
7530
  ] })
7513
7531
  ]
7514
7532
  }
@@ -7629,10 +7647,10 @@ function SPopover({
7629
7647
  const descColor = type === "default" ? "var(--cmp-popover-default-description)" : "var(--cmp-popover-light-description)";
7630
7648
  const leftLinkLabelClass = type === "default" ? "text-[color:var(--cmp-popover-default-subAction)]" : "text-[color:var(--cmp-popover-light-subAction)]";
7631
7649
  const triggerNode = trigger ?? /* @__PURE__ */ jsx("span", { className: "inline-flex cursor-pointer", "aria-label": ariaLabel, children: /* @__PURE__ */ jsx(SIcon, { name: icon, size: iconSize, color }) });
7632
- return /* @__PURE__ */ jsxs(RPopover11.Root, { open: actualOpen, onOpenChange: setOpen, children: [
7633
- /* @__PURE__ */ jsx(RPopover11.Trigger, { asChild: true, children: triggerNode }),
7634
- /* @__PURE__ */ jsx(RPopover11.Portal, { container: portalContainer, children: /* @__PURE__ */ jsxs(
7635
- RPopover11.Content,
7650
+ return /* @__PURE__ */ jsxs(RPopover12.Root, { open: actualOpen, onOpenChange: setOpen, children: [
7651
+ /* @__PURE__ */ jsx(RPopover12.Trigger, { asChild: true, children: triggerNode }),
7652
+ /* @__PURE__ */ jsx(RPopover12.Portal, { container: portalContainer, children: /* @__PURE__ */ jsxs(
7653
+ RPopover12.Content,
7636
7654
  {
7637
7655
  side: placement,
7638
7656
  sideOffset: 8,
@@ -7698,7 +7716,7 @@ function SPopover({
7698
7716
  ]
7699
7717
  }
7700
7718
  ),
7701
- /* @__PURE__ */ jsx(RPopover11.Arrow, { width: 16, height: 12, style: { fill: bg } })
7719
+ /* @__PURE__ */ jsx(RPopover12.Arrow, { width: 16, height: 12, style: { fill: bg } })
7702
7720
  ]
7703
7721
  }
7704
7722
  ) })
@@ -7809,10 +7827,10 @@ function SGuide({
7809
7827
  );
7810
7828
  if (isNotion)
7811
7829
  return /* @__PURE__ */ jsx("span", { className, style, children: trigger });
7812
- return /* @__PURE__ */ jsxs(RPopover11.Root, { open, onOpenChange: setOpen, children: [
7813
- /* @__PURE__ */ jsx(RPopover11.Trigger, { asChild: true, children: trigger }),
7814
- /* @__PURE__ */ jsx(RPopover11.Portal, { container: portalContainer, children: /* @__PURE__ */ jsxs(
7815
- RPopover11.Content,
7830
+ return /* @__PURE__ */ jsxs(RPopover12.Root, { open, onOpenChange: setOpen, children: [
7831
+ /* @__PURE__ */ jsx(RPopover12.Trigger, { asChild: true, children: trigger }),
7832
+ /* @__PURE__ */ jsx(RPopover12.Portal, { container: portalContainer, children: /* @__PURE__ */ jsxs(
7833
+ RPopover12.Content,
7816
7834
  {
7817
7835
  side: "bottom",
7818
7836
  align: "start",
@@ -9242,9 +9260,9 @@ var GNB_RAIL = {
9242
9260
  var GNB_RAIL_WIDTH = 68;
9243
9261
  var GNB_FOLD_MS = 200;
9244
9262
  var GNB_EXPAND_MS = 200;
9245
- var GNB_MENU_WIDTH = 240;
9263
+ var GNB_MENU_WIDTH = 214;
9246
9264
  var GNB_MENU_MIN_WIDTH = 200;
9247
- var GNB_MENU_MAX_WIDTH = 300;
9265
+ var GNB_MENU_MAX_WIDTH = 240;
9248
9266
  var GNB_MENU_RESIZE_KEY_STEP = { normal: 10, large: 50 };
9249
9267
  var clampGnbMenuWidth = (width) => Math.min(GNB_MENU_MAX_WIDTH, Math.max(GNB_MENU_MIN_WIDTH, Math.round(width)));
9250
9268
  var GNB_FULL_LOGO_WIDTH = 140;
@@ -9802,8 +9820,15 @@ var SGnb = /* @__PURE__ */ forwardRef(function SGnb2({
9802
9820
  "topContent"
9803
9821
  ) : null;
9804
9822
  const systemMenuContext = useMemo(
9805
- () => ({ color, folded: false, placement: "panel", active: !railFolded }),
9806
- [color, railFolded]
9823
+ // 기본 폭보다 줄여 놓은 메뉴 컬럼이면 판에 알린다 — 알림 개수가 점 배지로 줄어든다.
9824
+ () => ({
9825
+ color,
9826
+ folded: false,
9827
+ placement: "panel",
9828
+ active: !railFolded,
9829
+ narrow: menuWidth < GNB_MENU_WIDTH
9830
+ }),
9831
+ [color, railFolded, menuWidth]
9807
9832
  );
9808
9833
  const systemFoldedContext = useMemo(
9809
9834
  () => ({ color, folded: true, placement: "panel", active: true }),
@@ -9956,10 +9981,10 @@ var SGnb = /* @__PURE__ */ forwardRef(function SGnb2({
9956
9981
  }
9957
9982
  ),
9958
9983
  header === "fix" && menuResizeHandle,
9959
- /* @__PURE__ */ jsxs(RPopover11.Root, { open: labelTip !== null, onOpenChange: (open) => !open && setLabelTip(null), children: [
9960
- /* @__PURE__ */ jsx(RPopover11.Anchor, { virtualRef: labelTipAnchorRef }),
9961
- /* @__PURE__ */ jsx(RPopover11.Portal, { container: portalContainer, children: /* @__PURE__ */ jsx(
9962
- RPopover11.Content,
9984
+ /* @__PURE__ */ jsxs(RPopover12.Root, { open: labelTip !== null, onOpenChange: (open) => !open && setLabelTip(null), children: [
9985
+ /* @__PURE__ */ jsx(RPopover12.Anchor, { virtualRef: labelTipAnchorRef }),
9986
+ /* @__PURE__ */ jsx(RPopover12.Portal, { container: portalContainer, children: /* @__PURE__ */ jsx(
9987
+ RPopover12.Content,
9963
9988
  {
9964
9989
  side: "right",
9965
9990
  sideOffset: 4,
@@ -10070,7 +10095,7 @@ var GNB_SYSTEM_SETTING_LABEL = "\uC124\uC815";
10070
10095
  function TokenIcon3({ name, size }) {
10071
10096
  return /* @__PURE__ */ jsx(SIcon, { name, size: "100%", style: { width: size, height: size } });
10072
10097
  }
10073
- function SystemButton({
10098
+ var SystemButton = /* @__PURE__ */ forwardRef(function SystemButton2({
10074
10099
  color,
10075
10100
  icon,
10076
10101
  label,
@@ -10082,21 +10107,22 @@ function SystemButton({
10082
10107
  dot,
10083
10108
  accentColor,
10084
10109
  stretch,
10085
- buttonRef,
10086
10110
  hasPopup,
10087
10111
  expanded,
10088
- onClick
10089
- }) {
10112
+ onClick,
10113
+ onMouseLeave
10114
+ }, ref) {
10090
10115
  const c = SYSTEM_ACTION_BUTTON_COLOR_CONFIG[color];
10091
10116
  return /* @__PURE__ */ jsxs(
10092
10117
  "button",
10093
10118
  {
10094
- ref: buttonRef,
10119
+ ref,
10095
10120
  type: "button",
10096
10121
  "aria-label": label ? void 0 : ariaLabel,
10097
10122
  "aria-haspopup": hasPopup ? "dialog" : void 0,
10098
10123
  "aria-expanded": hasPopup ? expanded : void 0,
10099
10124
  onClick,
10125
+ onMouseLeave,
10100
10126
  className: cn(
10101
10127
  "group box-border flex cursor-pointer items-center border-none bg-(--gsb-bg) text-(--gsb-text) transition-colors hover:bg-(--gsb-bg-hover)",
10102
10128
  stretch ? "min-w-0 flex-1" : "shrink-0",
@@ -10142,12 +10168,14 @@ function SystemButton({
10142
10168
  ]
10143
10169
  }
10144
10170
  ),
10145
- label && /* @__PURE__ */ jsx("span", { className: "typo-body-sm-semibold min-w-0 flex-1 truncate", children: label }),
10146
- count != null && count > 0 && /* @__PURE__ */ jsx("span", { className: "typo-body-md-bold shrink-0", style: { color: accentColor }, children: count.toLocaleString() })
10171
+ label && /* @__PURE__ */ jsx("span", { className: "typo-body-sm-semibold min-w-0 truncate", children: label }),
10172
+ count != null && count > 0 && // 개수 오른쪽은 버튼 여백(alertButton.paddingX)만으로는 좁다 — 시안이 4px 을 더 준다.
10173
+ // 대응 토큰이 없어 디자인 값을 그대로 쓴다.
10174
+ /* @__PURE__ */ jsx("span", { className: "typo-body-md-bold me-[4px] shrink-0", style: { color: accentColor }, children: count.toLocaleString() })
10147
10175
  ]
10148
10176
  }
10149
10177
  );
10150
- }
10178
+ });
10151
10179
  var SGnbSystem = /* @__PURE__ */ forwardRef(function SGnbSystem2({
10152
10180
  color: colorProp,
10153
10181
  folded: foldedProp,
@@ -10166,6 +10194,7 @@ var SGnbSystem = /* @__PURE__ */ forwardRef(function SGnbSystem2({
10166
10194
  const isTop = placement === "top";
10167
10195
  const folded = !isTop && (foldedProp ?? gnb2?.folded ?? false);
10168
10196
  const active = gnb2?.active ?? true;
10197
+ const narrow = !isTop && !folded && (gnb2?.narrow ?? false);
10169
10198
  const c = GNB_SYSTEM_COLOR_CONFIG[color];
10170
10199
  const t = GNB_SYSTEM_TOP_COLOR_CONFIG[color];
10171
10200
  const itemColor = isTop ? t.item : color;
@@ -10184,13 +10213,39 @@ var SGnbSystem = /* @__PURE__ */ forwardRef(function SGnbSystem2({
10184
10213
  setAccountOpen(next);
10185
10214
  account?.onOpenChange?.(next);
10186
10215
  };
10216
+ const alertButtonRef = useRef(null);
10217
+ const [alertListOpen, setAlertListOpen] = useState(false);
10218
+ const hasAlertList = alert2?.listBox != null;
10219
+ const commitAlertListOpen = (next) => {
10220
+ setAlertListOpen(next);
10221
+ alert2?.onOpenChange?.(next);
10222
+ };
10187
10223
  useEffect(() => {
10188
10224
  if (active || !accountOpen) return;
10189
10225
  setAccountOpen(false);
10190
10226
  account?.onOpenChange?.(false);
10191
10227
  }, [active, accountOpen, account]);
10228
+ useEffect(() => {
10229
+ if (active || !alertListOpen) return;
10230
+ setAlertListOpen(false);
10231
+ alert2?.onOpenChange?.(false);
10232
+ }, [active, alertListOpen, alert2]);
10192
10233
  const alertCount = alert2?.count ?? 0;
10193
10234
  const notified = alertCount > 0;
10235
+ const alertTooltip = (alert2?.tooltip ?? []).filter((line) => line.trim() !== "");
10236
+ const hasAlertTooltip = alertTooltip.length > 0;
10237
+ const [alertTooltipDismissed, setAlertTooltipDismissed] = useState(false);
10238
+ const hadAlertTooltip = useRef(hasAlertTooltip);
10239
+ if (hadAlertTooltip.current !== hasAlertTooltip) {
10240
+ hadAlertTooltip.current = hasAlertTooltip;
10241
+ if (hasAlertTooltip && alertTooltipDismissed) setAlertTooltipDismissed(false);
10242
+ }
10243
+ const alertTooltipOpen = hasAlertTooltip && active && !alertTooltipDismissed;
10244
+ const dismissAlertTooltip = () => {
10245
+ if (!alertTooltipOpen) return;
10246
+ setAlertTooltipDismissed(true);
10247
+ alert2?.onTooltipDismiss?.();
10248
+ };
10194
10249
  const alertLabel = alert2?.label ?? GNB_SYSTEM_ALERT_LABEL;
10195
10250
  const settingLabel = setting?.label ?? GNB_SYSTEM_SETTING_LABEL;
10196
10251
  const alertButton = alert2 && /* @__PURE__ */ jsx(
@@ -10203,13 +10258,51 @@ var SGnbSystem = /* @__PURE__ */ forwardRef(function SGnbSystem2({
10203
10258
  paddingX: GNB_SYSTEM_LAYOUT.alertPaddingX,
10204
10259
  iconColor: notified ? alertIconColor : void 0,
10205
10260
  hoverBg: notified ? alertHoverBg : void 0,
10206
- count: folded ? void 0 : alertCount,
10207
- dot: folded && notified,
10261
+ count: folded || narrow ? void 0 : alertCount,
10262
+ dot: (folded || narrow) && notified,
10208
10263
  accentColor: alertCountColor,
10209
10264
  stretch: !folded && !isTop,
10210
- onClick: alert2.onClick
10265
+ ref: alertButtonRef,
10266
+ hasPopup: hasAlertList,
10267
+ expanded: alertListOpen,
10268
+ onClick: () => {
10269
+ dismissAlertTooltip();
10270
+ alert2.onClick?.();
10271
+ if (hasAlertList) commitAlertListOpen(!alertListOpen);
10272
+ },
10273
+ onMouseLeave: hasAlertTooltip ? dismissAlertTooltip : void 0
10211
10274
  }
10212
10275
  );
10276
+ const alertListBox = alert2 && hasAlertList && /* @__PURE__ */ jsx(
10277
+ SPortal,
10278
+ {
10279
+ open: alertListOpen && active,
10280
+ onClose: () => commitAlertListOpen(false),
10281
+ anchorRef: alertButtonRef,
10282
+ placement: isTop ? "bottom" : "right",
10283
+ align: "end",
10284
+ offset: 8,
10285
+ viewportPadding: 8,
10286
+ ariaLabel: alert2.label ?? GNB_SYSTEM_ALERT_LABEL,
10287
+ onOpenAutoFocus: (event) => event.preventDefault(),
10288
+ className: "rounded-(--radius-8)",
10289
+ children: alert2.listBox
10290
+ }
10291
+ );
10292
+ const alertNode = alertButton && /* @__PURE__ */ jsxs(Fragment, { children: [
10293
+ hasAlertTooltip ? /* @__PURE__ */ jsx(
10294
+ STooltip2,
10295
+ {
10296
+ trigger: "none",
10297
+ open: alertTooltipOpen,
10298
+ message: alertTooltip,
10299
+ tooltipType: color === "light" ? "default" : "accent",
10300
+ placement: isTop ? "bottom" : "right",
10301
+ children: alertButton
10302
+ }
10303
+ ) : alertButton,
10304
+ alertListBox
10305
+ ] });
10213
10306
  const settingButton = setting && /* @__PURE__ */ jsx(
10214
10307
  SystemButton,
10215
10308
  {
@@ -10265,7 +10358,7 @@ var SGnbSystem = /* @__PURE__ */ forwardRef(function SGnbSystem2({
10265
10358
  )
10266
10359
  })
10267
10360
  );
10268
- if (alertButton) segments.push({ key: "alert", node: alertButton });
10361
+ if (alertNode) segments.push({ key: "alert", node: alertNode });
10269
10362
  if (settingButton) segments.push({ key: "setting", node: settingButton });
10270
10363
  if (domainTag || accountButton) {
10271
10364
  segments.push({
@@ -10323,7 +10416,7 @@ var SGnbSystem = /* @__PURE__ */ forwardRef(function SGnbSystem2({
10323
10416
  "data-folded": "",
10324
10417
  ...rest,
10325
10418
  children: [
10326
- alertButton,
10419
+ alertNode,
10327
10420
  account && /* @__PURE__ */ jsx(
10328
10421
  SystemButton,
10329
10422
  {
@@ -10331,7 +10424,7 @@ var SGnbSystem = /* @__PURE__ */ forwardRef(function SGnbSystem2({
10331
10424
  icon: "user",
10332
10425
  ariaLabel: account.label ?? "account",
10333
10426
  paddingX: GNB_SYSTEM_LAYOUT.alertPaddingX,
10334
- buttonRef: foldedAccountRef,
10427
+ ref: foldedAccountRef,
10335
10428
  hasPopup: true,
10336
10429
  expanded: accountOpen,
10337
10430
  onClick: () => {
@@ -10377,7 +10470,7 @@ var SGnbSystem = /* @__PURE__ */ forwardRef(function SGnbSystem2({
10377
10470
  domainTag,
10378
10471
  hasUserBlock && /* @__PURE__ */ jsxs("div", { className: "flex flex-col", children: [
10379
10472
  (alert2 || setting) && /* @__PURE__ */ jsxs("div", { className: "flex items-center", style: { gap: GNB_SYSTEM_LAYOUT.gap }, children: [
10380
- alertButton,
10473
+ alertNode,
10381
10474
  alert2 && setting && /* @__PURE__ */ jsx(
10382
10475
  "span",
10383
10476
  {
@@ -11449,6 +11542,636 @@ var SStepper = /* @__PURE__ */ forwardRef(function SStepper2({
11449
11542
  );
11450
11543
  });
11451
11544
 
11545
+ // src/lib/date.ts
11546
+ function todayStr() {
11547
+ const d = /* @__PURE__ */ new Date();
11548
+ return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, "0")}-${String(d.getDate()).padStart(2, "0")}`;
11549
+ }
11550
+ function formatDate(year, month, day) {
11551
+ return `${year}-${String(month).padStart(2, "0")}-${String(day).padStart(2, "0")}`;
11552
+ }
11553
+ function calcYearMonth(year, month, dir) {
11554
+ if (dir === "prev")
11555
+ return month === 1 ? { year: year - 1, month: 12 } : { year, month: month - 1 };
11556
+ return month === 12 ? { year: year + 1, month: 1 } : { year, month: month + 1 };
11557
+ }
11558
+ function monthCells(year, month) {
11559
+ const firstDayIndex = new Date(year, month - 1, 1).getDay();
11560
+ const daysInCurrent = new Date(year, month, 0).getDate();
11561
+ const prev = calcYearMonth(year, month, "prev");
11562
+ const daysInPrev = new Date(prev.year, prev.month, 0).getDate();
11563
+ const next = calcYearMonth(year, month, "next");
11564
+ const cells = [];
11565
+ for (let i = firstDayIndex - 1; i >= 0; i--) {
11566
+ const day = daysInPrev - i;
11567
+ cells.push({ date: formatDate(prev.year, prev.month, day), day, inCurrentMonth: false });
11568
+ }
11569
+ for (let day = 1; day <= daysInCurrent; day++) {
11570
+ cells.push({ date: formatDate(year, month, day), day, inCurrentMonth: true });
11571
+ }
11572
+ const remaining = (7 - cells.length % 7) % 7;
11573
+ for (let day = 1; day <= remaining; day++) {
11574
+ cells.push({ date: formatDate(next.year, next.month, day), day, inCurrentMonth: false });
11575
+ }
11576
+ return cells;
11577
+ }
11578
+ var WEEK_LABELS = ["\uC77C", "\uC6D4", "\uD654", "\uC218", "\uBAA9", "\uAE08", "\uD1A0"];
11579
+
11580
+ // src/components/SCalendarBoard/calendarBoard.config.ts
11581
+ var CALENDAR_BOARD_EVENT_COLORS = [
11582
+ "default",
11583
+ "blue",
11584
+ "oceanBlue",
11585
+ "lightBlue",
11586
+ "green",
11587
+ "yellow",
11588
+ "orange",
11589
+ "red",
11590
+ "white"
11591
+ ];
11592
+ var BG = (name) => `var(--cmp-calendarBoard-eventButton-bg-${name})`;
11593
+ var CALENDAR_BOARD_EVENT_PRESETS = {
11594
+ default: { bg: BG("default"), dot: "indigo" },
11595
+ blue: { bg: BG("blue"), dot: "blue" },
11596
+ oceanBlue: { bg: BG("oceanBlue"), dot: "darkblue" },
11597
+ lightBlue: { bg: BG("lightBlue"), dot: "lightblue" },
11598
+ green: { bg: BG("green"), dot: "green" },
11599
+ yellow: { bg: BG("yellow"), dot: "yellow" },
11600
+ orange: { bg: BG("orange"), dot: "orange" },
11601
+ red: { bg: BG("red"), dot: "red" },
11602
+ white: { bg: BG("white"), dot: "grey" }
11603
+ };
11604
+ var CALENDAR_BOARD_MAX_VISIBLE_EVENTS = 4;
11605
+ var CALENDAR_BOARD_DAY_COLORS = [
11606
+ "default",
11607
+ "danger",
11608
+ "accent",
11609
+ "complete",
11610
+ "dim"
11611
+ ];
11612
+ var CALENDAR_BOARD_DAY_BG = {
11613
+ default: "var(--cmp-calendarBoard-dayCard-bg)",
11614
+ danger: "var(--color-red-30)",
11615
+ accent: "var(--color-brilliantblue-40)",
11616
+ complete: "var(--color-green-45)",
11617
+ dim: "var(--color-grey-25)"
11618
+ };
11619
+ function CalendarEventButton({
11620
+ event,
11621
+ onSelect,
11622
+ className
11623
+ }) {
11624
+ const preset = CALENDAR_BOARD_EVENT_PRESETS[event.color ?? "default"];
11625
+ const dot = event.dotColor ?? preset.dot;
11626
+ const disabled = event.disabled === true;
11627
+ const hasDescription = event.description != null && event.description !== "";
11628
+ const hasValue = event.value != null && event.value !== "";
11629
+ const title = [event.label.replace(/<[^>]*>/g, ""), event.description, event.value].filter((v) => v != null && v !== "").join(" ") || void 0;
11630
+ return /* @__PURE__ */ jsxs(
11631
+ "button",
11632
+ {
11633
+ type: "button",
11634
+ disabled,
11635
+ title,
11636
+ className: cn(
11637
+ // hover 는 배경 위에 8% 오버레이를 얹는다 — 프리셋 배경이 9종이라 색마다 hover 색을 두지 않는다.
11638
+ "group relative flex w-full min-w-0 items-center overflow-hidden text-left",
11639
+ "h-(--cmp-calendarBoard-item-height) shrink-0 rounded-(--cmp-calendarBoard-item-radius)",
11640
+ "gap-(--cmp-calendarBoard-eventButton-inline-gap) px-(--cmp-calendarBoard-item-paddingX)",
11641
+ "bg-(--ceb-bg) text-(--cmp-calendarBoard-eventButton-text-color-default)",
11642
+ disabled ? "cursor-not-allowed opacity-50" : "cursor-pointer",
11643
+ className
11644
+ ),
11645
+ style: { "--ceb-bg": preset.bg },
11646
+ onClick: (e) => {
11647
+ if (disabled) return;
11648
+ onSelect?.(event, e);
11649
+ },
11650
+ children: [
11651
+ !disabled && /* @__PURE__ */ jsx(
11652
+ "span",
11653
+ {
11654
+ "aria-hidden": true,
11655
+ className: "pointer-events-none absolute inset-0 rounded-(--cmp-calendarBoard-item-radius) bg-(--cmp-calendarBoard-eventButton-hover-overlay-color) opacity-0 transition-opacity group-hover:opacity-(--cmp-calendarBoard-eventButton-hover-overlay-opacity)"
11656
+ }
11657
+ ),
11658
+ /* @__PURE__ */ jsx(SBadge, { "aria-hidden": true, color: dot, className: "shrink-0" }),
11659
+ /* @__PURE__ */ jsxs("span", { className: "flex min-w-0 flex-1 items-center gap-(--cmp-calendarBoard-eventButton-label-gap)", children: [
11660
+ /* @__PURE__ */ jsxs("span", { className: "typo-body-sm-default min-w-0 flex-1 truncate", children: [
11661
+ /* @__PURE__ */ jsx(
11662
+ "span",
11663
+ {
11664
+ className: cn(
11665
+ "typo-body-sm-semibold",
11666
+ hasDescription && "me-(--cmp-calendarBoard-eventButton-label-gap)"
11667
+ ),
11668
+ dangerouslySetInnerHTML: { __html: sanitizeInlineHtml(event.label) }
11669
+ }
11670
+ ),
11671
+ hasDescription && event.description
11672
+ ] }),
11673
+ hasValue && /* @__PURE__ */ jsxs("span", { className: "flex shrink-0 items-center gap-(--cmp-calendarBoard-eventButton-label-gap)", children: [
11674
+ /* @__PURE__ */ jsx(
11675
+ "span",
11676
+ {
11677
+ "aria-hidden": true,
11678
+ className: "typo-body-sm-default text-(--cmp-calendarBoard-eventButton-text-color-separator)",
11679
+ children: "/"
11680
+ }
11681
+ ),
11682
+ /* @__PURE__ */ jsx("span", { className: "typo-body-sm-default whitespace-nowrap", children: event.value })
11683
+ ] })
11684
+ ] })
11685
+ ]
11686
+ }
11687
+ );
11688
+ }
11689
+ var CalendarMoreButton = /* @__PURE__ */ forwardRef(function CalendarMoreButton2({ count, label = "\uB354\uBCF4\uAE30", onClick, className }, ref) {
11690
+ return /* @__PURE__ */ jsxs(
11691
+ "button",
11692
+ {
11693
+ ref,
11694
+ type: "button",
11695
+ className: cn(
11696
+ "group relative flex w-full min-w-0 cursor-pointer items-center overflow-hidden text-left",
11697
+ "h-(--cmp-calendarBoard-item-height) shrink-0 rounded-(--cmp-calendarBoard-item-radius)",
11698
+ "gap-(--cmp-calendarBoard-moreButton-gap) px-(--cmp-calendarBoard-item-paddingX)",
11699
+ "bg-(--cmp-calendarBoard-moreButton-bg)",
11700
+ className
11701
+ ),
11702
+ onClick,
11703
+ children: [
11704
+ /* @__PURE__ */ jsx(
11705
+ "span",
11706
+ {
11707
+ "aria-hidden": true,
11708
+ className: "pointer-events-none absolute inset-0 rounded-(--cmp-calendarBoard-item-radius) bg-(--cmp-calendarBoard-moreButton-hover-overlay-color) opacity-0 transition-opacity group-hover:opacity-(--cmp-calendarBoard-moreButton-hover-overlay-opacity)"
11709
+ }
11710
+ ),
11711
+ /* @__PURE__ */ jsxs("span", { className: "typo-body-sm-semibold shrink-0 text-(--cmp-calendarBoard-moreButton-count-color)", children: [
11712
+ count,
11713
+ "\uAC1C"
11714
+ ] }),
11715
+ /* @__PURE__ */ jsx("span", { className: "typo-body-sm-default min-w-0 truncate text-(--cmp-calendarBoard-moreButton-label-color)", children: label })
11716
+ ]
11717
+ }
11718
+ );
11719
+ });
11720
+ var CalendarDayCard = /* @__PURE__ */ forwardRef(function CalendarDayCard2({
11721
+ date,
11722
+ day,
11723
+ inCurrentMonth,
11724
+ isToday,
11725
+ isSelected,
11726
+ selectable,
11727
+ color,
11728
+ events,
11729
+ body,
11730
+ hiddenCount,
11731
+ isOpen,
11732
+ moreLabel,
11733
+ onDaySelect,
11734
+ onEventClick,
11735
+ onOpenEvents,
11736
+ ...rest
11737
+ }, ref) {
11738
+ const hasEvents = events.length + hiddenCount > 0;
11739
+ const interactive = selectable || hasEvents;
11740
+ const activate = () => {
11741
+ if (hasEvents) onOpenEvents?.();
11742
+ if (selectable) onDaySelect?.(date);
11743
+ };
11744
+ return /* @__PURE__ */ jsxs(
11745
+ "div",
11746
+ {
11747
+ ...rest,
11748
+ ref,
11749
+ role: "gridcell",
11750
+ "data-date": date,
11751
+ "aria-selected": selectable ? isSelected : void 0,
11752
+ "aria-current": isToday ? "date" : void 0,
11753
+ "aria-haspopup": hasEvents ? "dialog" : void 0,
11754
+ "aria-expanded": hasEvents ? isOpen : void 0,
11755
+ tabIndex: interactive ? 0 : void 0,
11756
+ onClick: interactive ? activate : void 0,
11757
+ onKeyDown: interactive ? (e) => {
11758
+ if (e.key === "Enter" || e.key === " ") {
11759
+ e.preventDefault();
11760
+ activate();
11761
+ }
11762
+ } : void 0,
11763
+ className: cn(
11764
+ "relative flex min-h-(--cmp-calendarBoard-dayCard-minHeight) min-w-(--cmp-calendarBoard-dayCard-minWidth) flex-col bg-(--cdc-bg) px-(--cmp-calendarBoard-dayCard-paddingX) outline-none",
11765
+ interactive && "cursor-pointer"
11766
+ ),
11767
+ style: { ...rest.style, "--cdc-bg": CALENDAR_BOARD_DAY_BG[color] },
11768
+ children: [
11769
+ isSelected && /* @__PURE__ */ jsx(
11770
+ "span",
11771
+ {
11772
+ "aria-hidden": true,
11773
+ className: "pointer-events-none absolute inset-[1px] rounded-(--cmp-calendarBoard-dayCard-focus-border-radius) border-(length:--cmp-calendarBoard-dayCard-focus-border-width) border-solid border-(--cmp-calendarBoard-dayCard-focus-border-color)"
11774
+ }
11775
+ ),
11776
+ /* @__PURE__ */ jsx("div", { className: "flex shrink-0 pt-(--cmp-calendarBoard-dayCard-header-paddingTop) pb-(--cmp-calendarBoard-dayCard-header-paddingBottom)", children: /* @__PURE__ */ jsx(
11777
+ "span",
11778
+ {
11779
+ className: cn(
11780
+ "inline-flex size-(--cmp-calendarBoard-daySequence-size) items-center justify-center rounded-(--cmp-calendarBoard-daySequence-radius)",
11781
+ isToday ? "typo-body-md-bold bg-(--cmp-calendarBoard-daySequence-bg-today) text-(--cmp-calendarBoard-daySequence-text-today)" : cn(
11782
+ "typo-body-md-medium",
11783
+ inCurrentMonth ? "text-(--cmp-calendarBoard-daySequence-text-default)" : "text-(--cmp-calendarBoard-daySequence-text-otherMonth)"
11784
+ ),
11785
+ // 오늘이 아니면서 선택된 날은 테두리 원으로 표시한다 (오늘은 이미 채운 원이라 겹치지 않는다).
11786
+ // 굵기는 1px 로 고정한다 — 칸을 감싸는 focus 테두리(2px)와 달리 얇은 원이고, 대응 토큰이 없다.
11787
+ isSelected && !isToday && "border border-solid border-(--cmp-calendarBoard-daySequence-border-selected)"
11788
+ ),
11789
+ children: day
11790
+ }
11791
+ ) }),
11792
+ /* @__PURE__ */ jsxs(
11793
+ "div",
11794
+ {
11795
+ className: cn(
11796
+ "flex min-h-0 flex-col gap-(--cmp-calendarBoard-dayCard-grid-gap) pb-(--cmp-calendarBoard-dayCard-grid-paddingBottom)",
11797
+ // 슬롯은 남는 세로를 다 갖는다 — 안에서 h-full 로 칸을 채울 수 있어야 한다.
11798
+ body != null && "flex-1"
11799
+ ),
11800
+ children: [
11801
+ body,
11802
+ body == null && events.map((event, i) => /* @__PURE__ */ jsx(
11803
+ CalendarEventButton,
11804
+ {
11805
+ event,
11806
+ onSelect: (ev, e) => {
11807
+ e.stopPropagation();
11808
+ onEventClick?.(ev, e);
11809
+ }
11810
+ },
11811
+ event.id ?? `${event.date}-${i}`
11812
+ )),
11813
+ hiddenCount > 0 && /* @__PURE__ */ jsx(
11814
+ CalendarMoreButton,
11815
+ {
11816
+ count: hiddenCount,
11817
+ label: moreLabel,
11818
+ onClick: (e) => {
11819
+ e.stopPropagation();
11820
+ onOpenEvents?.();
11821
+ }
11822
+ }
11823
+ )
11824
+ ]
11825
+ }
11826
+ )
11827
+ ]
11828
+ }
11829
+ );
11830
+ });
11831
+ var MAX_HEIGHT = 480;
11832
+ var MAX_WIDTH = "calc(100vw - 16px)";
11833
+ function CalendarDayEventListBox({
11834
+ date,
11835
+ events,
11836
+ onEventClick,
11837
+ minWidth,
11838
+ minHeight,
11839
+ onClose,
11840
+ closeLabel = "\uB2EB\uAE30"
11841
+ }) {
11842
+ const [y, m, d] = date.split("-").map(Number);
11843
+ const weekday = WEEK_LABELS[new Date(y, m - 1, d).getDay()];
11844
+ return /* @__PURE__ */ jsxs(
11845
+ "div",
11846
+ {
11847
+ className: "flex w-max flex-col overflow-hidden rounded-(--cmp-calendarBoard-radius) bg-(--cmp-calendarBoard-bg) shadow-(--shadow-overlay)",
11848
+ style: { minWidth, maxWidth: MAX_WIDTH, minHeight, maxHeight: MAX_HEIGHT },
11849
+ children: [
11850
+ /* @__PURE__ */ jsxs("div", { className: "flex shrink-0 items-center gap-(--cmp-calendarBoard-dayEvent-header-gap) px-(--cmp-calendarBoard-dayEvent-header-paddingX) py-(--cmp-calendarBoard-dayEvent-header-paddingY)", children: [
11851
+ /* @__PURE__ */ jsxs("span", { className: "typo-heading-md text-(--cmp-calendarBoard-header-content-color)", children: [
11852
+ d,
11853
+ "\uC77C"
11854
+ ] }),
11855
+ /* @__PURE__ */ jsxs("span", { className: "typo-body-lg-default flex-1 text-(--cmp-calendarBoard-header-content-color)", children: [
11856
+ "(",
11857
+ weekday,
11858
+ ")"
11859
+ ] }),
11860
+ /* @__PURE__ */ jsx(
11861
+ SGhostButton,
11862
+ {
11863
+ icon: "close",
11864
+ size: "xs",
11865
+ ariaLabel: closeLabel,
11866
+ className: "shrink-0",
11867
+ onClick: onClose
11868
+ }
11869
+ )
11870
+ ] }),
11871
+ /* @__PURE__ */ jsx(SScrollArea, { axis: "vertical", className: "min-h-0 flex-1", children: /* @__PURE__ */ jsx("div", { className: "flex flex-col gap-(--cmp-calendarBoard-dayEvent-body-gap) px-(--cmp-calendarBoard-dayEvent-body-paddingX) pb-(--cmp-calendarBoard-dayEvent-body-paddingBottom)", children: events.map((event, i) => /* @__PURE__ */ jsx(
11872
+ CalendarEventButton,
11873
+ {
11874
+ event,
11875
+ onSelect: onEventClick
11876
+ },
11877
+ event.id ?? `${event.date}-${i}`
11878
+ )) }) })
11879
+ ]
11880
+ }
11881
+ );
11882
+ }
11883
+ var DAY_EVENT_OUTDENT = 16;
11884
+ var VIEWPORT_PADDING2 = 8;
11885
+ function shiftIntoView(desired, size, viewport) {
11886
+ const max = Math.max(viewport - size - VIEWPORT_PADDING2, VIEWPORT_PADDING2);
11887
+ return Math.min(Math.max(desired, VIEWPORT_PADDING2), max) - desired;
11888
+ }
11889
+ function measureRowCapacity(cell) {
11890
+ const cs = getComputedStyle(cell);
11891
+ const v = (name) => Number.parseFloat(cs.getPropertyValue(name)) || 0;
11892
+ const gap = v("--cmp-calendarBoard-dayCard-grid-gap");
11893
+ const row = v("--cmp-calendarBoard-item-height") + gap;
11894
+ if (row <= 0) return null;
11895
+ const header = v("--cmp-calendarBoard-dayCard-header-paddingTop") + v("--cmp-calendarBoard-daySequence-size") + v("--cmp-calendarBoard-dayCard-header-paddingBottom");
11896
+ const free = cell.getBoundingClientRect().height - header - v("--cmp-calendarBoard-dayCard-grid-paddingBottom") + gap;
11897
+ if (free <= 0) return null;
11898
+ return Math.max(1, Math.floor(free / row));
11899
+ }
11900
+ function SCalendarBoard({
11901
+ year,
11902
+ month,
11903
+ defaultYear,
11904
+ defaultMonth,
11905
+ onViewChange,
11906
+ selectable = false,
11907
+ value,
11908
+ onValueChange,
11909
+ events,
11910
+ dayColors,
11911
+ dayContent,
11912
+ onEventClick,
11913
+ onMoreClick,
11914
+ todayLabel = "\uC624\uB298",
11915
+ moreLabel,
11916
+ headerRight,
11917
+ className,
11918
+ style
11919
+ }) {
11920
+ const today = todayStr();
11921
+ const [ty, tm] = [Number(today.slice(0, 4)), Number(today.slice(5, 7))];
11922
+ const [innerView, setInnerView] = useState(() => ({
11923
+ year: defaultYear ?? ty,
11924
+ month: defaultMonth ?? tm
11925
+ }));
11926
+ const controlled = year != null && month != null;
11927
+ const view = controlled ? { year, month } : innerView;
11928
+ const [openDate, setOpenDate] = useState(null);
11929
+ const [placement, setPlacement] = useState({ cellWidth: 0, cellHeight: 0, side: 0, align: 0 });
11930
+ const [panelEl, setPanelEl] = useState(null);
11931
+ const portalContainer = usePortalContainer();
11932
+ const setView = useCallback(
11933
+ (next) => {
11934
+ setOpenDate(null);
11935
+ if (!controlled) setInnerView(next);
11936
+ onViewChange?.(next);
11937
+ },
11938
+ [controlled, onViewChange]
11939
+ );
11940
+ const cells = useMemo(() => monthCells(view.year, view.month), [view.year, view.month]);
11941
+ const rowCount = cells.length / 7;
11942
+ const gridRef = useRef(null);
11943
+ const [rowCapacity, setRowCapacity] = useState(CALENDAR_BOARD_MAX_VISIBLE_EVENTS);
11944
+ useEffect(() => {
11945
+ const grid = gridRef.current;
11946
+ if (grid == null || typeof ResizeObserver === "undefined") return;
11947
+ const cell = grid.querySelector('[role="gridcell"]');
11948
+ if (cell == null) return;
11949
+ const apply = () => {
11950
+ const next = measureRowCapacity(cell);
11951
+ if (next != null) setRowCapacity(next);
11952
+ };
11953
+ apply();
11954
+ const observer = new ResizeObserver(apply);
11955
+ observer.observe(cell);
11956
+ return () => observer.disconnect();
11957
+ }, [rowCount]);
11958
+ const eventMap = useMemo(() => {
11959
+ const map = /* @__PURE__ */ new Map();
11960
+ (events ?? []).forEach((event) => {
11961
+ const list = map.get(event.date);
11962
+ if (list) list.push(event);
11963
+ else map.set(event.date, [event]);
11964
+ });
11965
+ return map;
11966
+ }, [events]);
11967
+ const openEvents = openDate ? eventMap.get(openDate) ?? [] : [];
11968
+ useLayoutEffect(() => {
11969
+ if (openDate == null || panelEl == null) return;
11970
+ const cell = gridRef.current?.querySelector(`[data-date="${openDate}"]`);
11971
+ if (cell == null) return;
11972
+ const adjust = () => {
11973
+ const cellRect = cell.getBoundingClientRect();
11974
+ const panelRect = panelEl.getBoundingClientRect();
11975
+ const next = {
11976
+ cellWidth: cellRect.width,
11977
+ cellHeight: cellRect.height,
11978
+ side: -(cellRect.height + DAY_EVENT_OUTDENT) + shiftIntoView(cellRect.top - DAY_EVENT_OUTDENT, panelRect.height, window.innerHeight),
11979
+ align: -DAY_EVENT_OUTDENT + shiftIntoView(cellRect.left - DAY_EVENT_OUTDENT, panelRect.width, window.innerWidth)
11980
+ };
11981
+ setPlacement(
11982
+ (prev) => prev.cellWidth === next.cellWidth && prev.cellHeight === next.cellHeight && prev.side === next.side && prev.align === next.align ? prev : next
11983
+ );
11984
+ };
11985
+ adjust();
11986
+ const observer = typeof ResizeObserver === "undefined" ? null : new ResizeObserver(adjust);
11987
+ observer?.observe(panelEl);
11988
+ window.addEventListener("scroll", adjust, true);
11989
+ window.addEventListener("resize", adjust);
11990
+ return () => {
11991
+ observer?.disconnect();
11992
+ window.removeEventListener("scroll", adjust, true);
11993
+ window.removeEventListener("resize", adjust);
11994
+ };
11995
+ }, [openDate, panelEl]);
11996
+ const columns = "repeat(7, minmax(var(--cmp-calendarBoard-dayCard-minWidth), 1fr))";
11997
+ const openEventList = (date, list) => {
11998
+ if (onMoreClick) {
11999
+ onMoreClick({ date, events: list });
12000
+ return;
12001
+ }
12002
+ setOpenDate((prev) => prev === date ? null : date);
12003
+ };
12004
+ return /* @__PURE__ */ jsxs(
12005
+ "div",
12006
+ {
12007
+ className: cn(
12008
+ // 판 높이는 부모가 정한다 — 행이 그 높이를 균등 분할하고, 칸 높이가 다시 "몇 줄 보일지" 를 정한다.
12009
+ "flex h-full w-full flex-col overflow-hidden rounded-(--cmp-calendarBoard-radius) border border-solid border-(--cmp-calendarBoard-border) bg-(--cmp-calendarBoard-bg)",
12010
+ className
12011
+ ),
12012
+ style,
12013
+ children: [
12014
+ /* @__PURE__ */ jsxs("div", { className: "flex shrink-0 items-center gap-(--cmp-calendarBoard-header-gap) px-sd-16 py-sd-12", children: [
12015
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-(--cmp-calendarBoard-header-content-gap)", children: [
12016
+ /* @__PURE__ */ jsx(
12017
+ SGhostButton,
12018
+ {
12019
+ icon: "chevronLeft",
12020
+ size: "xxs",
12021
+ ariaLabel: "\uC774\uC804 \uD574",
12022
+ onClick: () => setView({ year: view.year - 1, month: view.month })
12023
+ }
12024
+ ),
12025
+ /* @__PURE__ */ jsx("span", { className: "typo-heading-lg inline-flex min-w-[48px] justify-center text-(--cmp-calendarBoard-header-content-color)", children: view.year }),
12026
+ /* @__PURE__ */ jsx(
12027
+ SGhostButton,
12028
+ {
12029
+ icon: "chevronRight",
12030
+ size: "xxs",
12031
+ ariaLabel: "\uB2E4\uC74C \uD574",
12032
+ onClick: () => setView({ year: view.year + 1, month: view.month })
12033
+ }
12034
+ )
12035
+ ] }),
12036
+ /* @__PURE__ */ jsx(SDivider, { vertical: true, height: "var(--cmp-calendarBoard-header-content-divider-height)" }),
12037
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-(--cmp-calendarBoard-header-content-gap)", children: [
12038
+ /* @__PURE__ */ jsx(
12039
+ SGhostButton,
12040
+ {
12041
+ icon: "chevronLeft",
12042
+ size: "xxs",
12043
+ ariaLabel: "\uC774\uC804 \uB2EC",
12044
+ onClick: () => setView(calcYearMonth(view.year, view.month, "prev"))
12045
+ }
12046
+ ),
12047
+ /* @__PURE__ */ jsxs("span", { className: "typo-heading-lg inline-flex min-w-[48px] justify-center text-(--cmp-calendarBoard-header-content-color)", children: [
12048
+ view.month,
12049
+ "\uC6D4"
12050
+ ] }),
12051
+ /* @__PURE__ */ jsx(
12052
+ SGhostButton,
12053
+ {
12054
+ icon: "chevronRight",
12055
+ size: "xxs",
12056
+ ariaLabel: "\uB2E4\uC74C \uB2EC",
12057
+ onClick: () => setView(calcYearMonth(view.year, view.month, "next"))
12058
+ }
12059
+ )
12060
+ ] }),
12061
+ todayLabel !== "" && /* @__PURE__ */ jsx(
12062
+ SButton,
12063
+ {
12064
+ color: "neutral",
12065
+ outline: true,
12066
+ size: "xs",
12067
+ label: todayLabel,
12068
+ onClick: () => setView({ year: ty, month: tm })
12069
+ }
12070
+ ),
12071
+ headerRight != null && /* @__PURE__ */ jsx("div", { className: "ml-auto flex items-center", children: headerRight })
12072
+ ] }),
12073
+ /* @__PURE__ */ jsx(SDivider, {}),
12074
+ /* @__PURE__ */ jsx(
12075
+ "div",
12076
+ {
12077
+ className: "grid shrink-0 bg-(--cmp-calendarBoard-grid-bg) pt-(--cmp-calendarBoard-grid-paddingTop) pb-(--cmp-calendarBoard-grid-gap)",
12078
+ style: { gridTemplateColumns: columns },
12079
+ children: WEEK_LABELS.map((label) => /* @__PURE__ */ jsx(
12080
+ "div",
12081
+ {
12082
+ className: "typo-body-md-default flex justify-center text-(--cmp-calendarBoard-grid-weekRow-color)",
12083
+ children: label
12084
+ },
12085
+ label
12086
+ ))
12087
+ }
12088
+ ),
12089
+ /* @__PURE__ */ jsxs(
12090
+ RPopover12.Root,
12091
+ {
12092
+ open: openDate !== null,
12093
+ onOpenChange: (open) => {
12094
+ if (!open) setOpenDate(null);
12095
+ },
12096
+ children: [
12097
+ /* @__PURE__ */ jsx(
12098
+ "div",
12099
+ {
12100
+ ref: gridRef,
12101
+ role: "grid",
12102
+ className: "grid min-h-0 flex-1 gap-px overflow-auto border-t border-solid border-(--cmp-calendarBoard-grid-month-border) bg-(--cmp-calendarBoard-grid-month-border)",
12103
+ style: {
12104
+ gridTemplateColumns: columns,
12105
+ // 행은 판 높이를 균등하게 나눠 갖는다 — 일정이 많은 주만 길어지면 격자가 깨진다.
12106
+ gridTemplateRows: `repeat(${rowCount}, minmax(var(--cmp-calendarBoard-dayCard-minHeight), 1fr))`
12107
+ },
12108
+ children: cells.map((cell) => {
12109
+ const content = dayContent?.[cell.date];
12110
+ const list = content == null ? eventMap.get(cell.date) ?? [] : [];
12111
+ const folded = list.length > rowCapacity;
12112
+ const visible = folded ? list.slice(0, rowCapacity - 1) : list;
12113
+ const card = /* @__PURE__ */ jsx(
12114
+ CalendarDayCard,
12115
+ {
12116
+ date: cell.date,
12117
+ day: cell.day,
12118
+ inCurrentMonth: cell.inCurrentMonth,
12119
+ isToday: cell.date === today,
12120
+ isSelected: value != null && value === cell.date,
12121
+ selectable,
12122
+ color: dayColors?.[cell.date] ?? "default",
12123
+ events: visible,
12124
+ body: content,
12125
+ hiddenCount: folded ? list.length - (rowCapacity - 1) : 0,
12126
+ isOpen: openDate === cell.date,
12127
+ moreLabel,
12128
+ onDaySelect: (date) => onValueChange?.(date, list),
12129
+ onEventClick,
12130
+ onOpenEvents: () => openEventList(cell.date, list)
12131
+ },
12132
+ cell.date
12133
+ );
12134
+ return cell.date === openDate ? /* @__PURE__ */ jsx(RPopover12.Anchor, { asChild: true, children: card }, cell.date) : card;
12135
+ })
12136
+ }
12137
+ ),
12138
+ /* @__PURE__ */ jsx(RPopover12.Portal, { container: portalContainer, children: /* @__PURE__ */ jsx(
12139
+ RPopover12.Content,
12140
+ {
12141
+ onInteractOutside: (e) => {
12142
+ const target = e.detail.originalEvent.target;
12143
+ if (target instanceof Node && gridRef.current?.contains(target)) e.preventDefault();
12144
+ },
12145
+ side: "bottom",
12146
+ align: "start",
12147
+ ref: setPanelEl,
12148
+ sideOffset: placement.side,
12149
+ alignOffset: placement.align,
12150
+ avoidCollisions: false,
12151
+ className: cn("z-50 outline-none", FLOATING_SLIDE_ANIM),
12152
+ onOpenAutoFocus: (e) => e.preventDefault(),
12153
+ children: openDate != null && /* @__PURE__ */ jsx(
12154
+ CalendarDayEventListBox,
12155
+ {
12156
+ date: openDate,
12157
+ minWidth: placement.cellWidth > 0 ? placement.cellWidth + DAY_EVENT_OUTDENT * 2 : void 0,
12158
+ minHeight: placement.cellHeight > 0 ? placement.cellHeight + DAY_EVENT_OUTDENT * 2 : void 0,
12159
+ events: openEvents,
12160
+ onEventClick,
12161
+ onClose: () => setOpenDate(null)
12162
+ }
12163
+ )
12164
+ },
12165
+ openDate
12166
+ ) })
12167
+ ]
12168
+ }
12169
+ )
12170
+ ]
12171
+ }
12172
+ );
12173
+ }
12174
+
11452
12175
  // src/lib/floating-height.ts
11453
12176
  var POPOVER_AVAILABLE_HEIGHT = "var(--radix-popover-content-available-height)";
11454
12177
  function clampToAvailableHeight(value, availableHeight) {
@@ -13404,10 +14127,10 @@ function useTruncatedValueTooltip({
13404
14127
  valueRef: elRef,
13405
14128
  onMouseEnter: active ? onMouseEnter : cancelHide,
13406
14129
  onMouseLeave: active ? startHide : cancelHide,
13407
- tooltip: active ? /* @__PURE__ */ jsxs(RPopover11.Root, { open, onOpenChange: setOpen, children: [
13408
- /* @__PURE__ */ jsx(RPopover11.Anchor, { virtualRef: elRef }),
13409
- /* @__PURE__ */ jsx(RPopover11.Portal, { container: portalContainer, children: /* @__PURE__ */ jsx(
13410
- RPopover11.Content,
14130
+ tooltip: active ? /* @__PURE__ */ jsxs(RPopover12.Root, { open, onOpenChange: setOpen, children: [
14131
+ /* @__PURE__ */ jsx(RPopover12.Anchor, { virtualRef: elRef }),
14132
+ /* @__PURE__ */ jsx(RPopover12.Portal, { container: portalContainer, children: /* @__PURE__ */ jsx(
14133
+ RPopover12.Content,
13411
14134
  {
13412
14135
  side: "top",
13413
14136
  sideOffset: 4,
@@ -14163,41 +14886,6 @@ function SRadioGroup({
14163
14886
  }
14164
14887
  );
14165
14888
  }
14166
-
14167
- // src/lib/date.ts
14168
- function todayStr() {
14169
- const d = /* @__PURE__ */ new Date();
14170
- return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, "0")}-${String(d.getDate()).padStart(2, "0")}`;
14171
- }
14172
- function formatDate(year, month, day) {
14173
- return `${year}-${String(month).padStart(2, "0")}-${String(day).padStart(2, "0")}`;
14174
- }
14175
- function calcYearMonth(year, month, dir) {
14176
- if (dir === "prev")
14177
- return month === 1 ? { year: year - 1, month: 12 } : { year, month: month - 1 };
14178
- return month === 12 ? { year: year + 1, month: 1 } : { year, month: month + 1 };
14179
- }
14180
- function monthCells(year, month) {
14181
- const firstDayIndex = new Date(year, month - 1, 1).getDay();
14182
- const daysInCurrent = new Date(year, month, 0).getDate();
14183
- const prev = calcYearMonth(year, month, "prev");
14184
- const daysInPrev = new Date(prev.year, prev.month, 0).getDate();
14185
- const next = calcYearMonth(year, month, "next");
14186
- const cells = [];
14187
- for (let i = firstDayIndex - 1; i >= 0; i--) {
14188
- const day = daysInPrev - i;
14189
- cells.push({ date: formatDate(prev.year, prev.month, day), day, inCurrentMonth: false });
14190
- }
14191
- for (let day = 1; day <= daysInCurrent; day++) {
14192
- cells.push({ date: formatDate(year, month, day), day, inCurrentMonth: true });
14193
- }
14194
- const remaining = (7 - cells.length % 7) % 7;
14195
- for (let day = 1; day <= remaining; day++) {
14196
- cells.push({ date: formatDate(next.year, next.month, day), day, inCurrentMonth: false });
14197
- }
14198
- return cells;
14199
- }
14200
- var WEEK_LABELS = ["\uC77C", "\uC6D4", "\uD654", "\uC218", "\uBAA9", "\uAE08", "\uD1A0"];
14201
14889
  function SCalendar({
14202
14890
  value,
14203
14891
  onValueChange,
@@ -14776,8 +15464,8 @@ function SDatePicker({
14776
15464
  disabled,
14777
15465
  className,
14778
15466
  style,
14779
- children: /* @__PURE__ */ jsxs(RPopover11.Root, { open, onOpenChange: (o) => !disabled && setOpen(o), children: [
14780
- /* @__PURE__ */ jsx(RPopover11.Trigger, { asChild: true, children: /* @__PURE__ */ jsxs(
15467
+ children: /* @__PURE__ */ jsxs(RPopover12.Root, { open, onOpenChange: (o) => !disabled && setOpen(o), children: [
15468
+ /* @__PURE__ */ jsx(RPopover12.Trigger, { asChild: true, children: /* @__PURE__ */ jsxs(
14781
15469
  "div",
14782
15470
  {
14783
15471
  role: "button",
@@ -14836,8 +15524,8 @@ function SDatePicker({
14836
15524
  ]
14837
15525
  }
14838
15526
  ) }),
14839
- /* @__PURE__ */ jsx(RPopover11.Portal, { container: portalContainer, children: /* @__PURE__ */ jsx(
14840
- RPopover11.Content,
15527
+ /* @__PURE__ */ jsx(RPopover12.Portal, { container: portalContainer, children: /* @__PURE__ */ jsx(
15528
+ RPopover12.Content,
14841
15529
  {
14842
15530
  side: "bottom",
14843
15531
  align: mode === "date" ? "start" : "center",
@@ -15310,7 +15998,7 @@ function SDateRangePicker({
15310
15998
  className,
15311
15999
  style,
15312
16000
  children: /* @__PURE__ */ jsxs(
15313
- RPopover11.Root,
16001
+ RPopover12.Root,
15314
16002
  {
15315
16003
  open,
15316
16004
  onOpenChange: (o) => {
@@ -15319,7 +16007,7 @@ function SDateRangePicker({
15319
16007
  if (!o) setPendingStart(null);
15320
16008
  },
15321
16009
  children: [
15322
- /* @__PURE__ */ jsx(RPopover11.Trigger, { asChild: true, children: /* @__PURE__ */ jsxs(
16010
+ /* @__PURE__ */ jsx(RPopover12.Trigger, { asChild: true, children: /* @__PURE__ */ jsxs(
15323
16011
  "div",
15324
16012
  {
15325
16013
  role: "button",
@@ -15383,8 +16071,8 @@ function SDateRangePicker({
15383
16071
  ]
15384
16072
  }
15385
16073
  ) }),
15386
- /* @__PURE__ */ jsx(RPopover11.Portal, { container: portalContainer, children: /* @__PURE__ */ jsx(
15387
- RPopover11.Content,
16074
+ /* @__PURE__ */ jsx(RPopover12.Portal, { container: portalContainer, children: /* @__PURE__ */ jsx(
16075
+ RPopover12.Content,
15388
16076
  {
15389
16077
  side: "bottom",
15390
16078
  align: "start",
@@ -17881,10 +18569,10 @@ function EditorToolbarBar({
17881
18569
  },
17882
18570
  item4
17883
18571
  );
17884
- return /* @__PURE__ */ jsxs(RPopover11.Root, { open: linkOpen, onOpenChange: setLinkOpen, children: [
17885
- /* @__PURE__ */ jsx(RPopover11.Trigger, { asChild: true, disabled: off, children: /* @__PURE__ */ jsx(ToolbarButton, { label: "\uB9C1\uD06C", active: state2.link, disabled: off, children: /* @__PURE__ */ jsx(IconLink, { size: ICON_SIZE }) }) }),
17886
- /* @__PURE__ */ jsx(RPopover11.Portal, { container: portalContainer, children: /* @__PURE__ */ jsx(
17887
- RPopover11.Content,
18572
+ return /* @__PURE__ */ jsxs(RPopover12.Root, { open: linkOpen, onOpenChange: setLinkOpen, children: [
18573
+ /* @__PURE__ */ jsx(RPopover12.Trigger, { asChild: true, disabled: off, children: /* @__PURE__ */ jsx(ToolbarButton, { label: "\uB9C1\uD06C", active: state2.link, disabled: off, children: /* @__PURE__ */ jsx(IconLink, { size: ICON_SIZE }) }) }),
18574
+ /* @__PURE__ */ jsx(RPopover12.Portal, { container: portalContainer, children: /* @__PURE__ */ jsx(
18575
+ RPopover12.Content,
17888
18576
  {
17889
18577
  sideOffset: 4,
17890
18578
  align: "start",
@@ -19092,7 +19780,7 @@ var SChipFilter = /* @__PURE__ */ forwardRef(function SChipFilter2({
19092
19780
  "div",
19093
19781
  {
19094
19782
  className: cn(
19095
- "flex w-full items-start gap-[var(--chipfilter-bar-gap)] border-b border-solid bg-[var(--chipfilter-bar-bg)] px-[var(--chipfilter-bar-padding-x)] py-[var(--chipfilter-bar-padding-y)]",
19783
+ "flex w-full items-start gap-[var(--chipfilter-bar-gap)] bg-[var(--chipfilter-bar-bg)] px-[var(--chipfilter-bar-padding-x)] py-[var(--chipfilter-bar-padding-y)]",
19096
19784
  className
19097
19785
  ),
19098
19786
  style: { ...rootStyle, borderColor: "var(--chipfilter-bar-border)" },
@@ -19220,8 +19908,8 @@ var SChipFilter = /* @__PURE__ */ forwardRef(function SChipFilter2({
19220
19908
  })(),
19221
19909
  hasRightActions && /* @__PURE__ */ jsxs(Fragment, { children: [
19222
19910
  /* @__PURE__ */ jsx(Divider, { inset: true }),
19223
- hasAddButton && /* @__PURE__ */ jsxs(RPopover11.Root, { open: addOpen, onOpenChange: setAddOpen, children: [
19224
- /* @__PURE__ */ jsx(RPopover11.Trigger, { asChild: true, children: /* @__PURE__ */ jsxs(
19911
+ hasAddButton && /* @__PURE__ */ jsxs(RPopover12.Root, { open: addOpen, onOpenChange: setAddOpen, children: [
19912
+ /* @__PURE__ */ jsx(RPopover12.Trigger, { asChild: true, children: /* @__PURE__ */ jsxs(
19225
19913
  "button",
19226
19914
  {
19227
19915
  type: "button",
@@ -19246,8 +19934,8 @@ var SChipFilter = /* @__PURE__ */ forwardRef(function SChipFilter2({
19246
19934
  ]
19247
19935
  }
19248
19936
  ) }),
19249
- /* @__PURE__ */ jsx(RPopover11.Portal, { container: portalContainer, children: /* @__PURE__ */ jsx(
19250
- RPopover11.Content,
19937
+ /* @__PURE__ */ jsx(RPopover12.Portal, { container: portalContainer, children: /* @__PURE__ */ jsx(
19938
+ RPopover12.Content,
19251
19939
  {
19252
19940
  side: "bottom",
19253
19941
  align: "start",
@@ -19282,17 +19970,17 @@ var SChipFilter = /* @__PURE__ */ forwardRef(function SChipFilter2({
19282
19970
  )
19283
19971
  ] })
19284
19972
  ] }),
19285
- /* @__PURE__ */ jsxs(RPopover11.Root, { open: openKey != null, onOpenChange: (next) => !next && setOpenKey(null), children: [
19973
+ /* @__PURE__ */ jsxs(RPopover12.Root, { open: openKey != null, onOpenChange: (next) => !next && setOpenKey(null), children: [
19286
19974
  /* @__PURE__ */ jsx(
19287
- RPopover11.Anchor,
19975
+ RPopover12.Anchor,
19288
19976
  {
19289
19977
  virtualRef: {
19290
19978
  current: openKey ? triggerRefs.current.get(openKey) : null
19291
19979
  }
19292
19980
  }
19293
19981
  ),
19294
- /* @__PURE__ */ jsx(RPopover11.Portal, { container: portalContainer, children: /* @__PURE__ */ jsx(
19295
- RPopover11.Content,
19982
+ /* @__PURE__ */ jsx(RPopover12.Portal, { container: portalContainer, children: /* @__PURE__ */ jsx(
19983
+ RPopover12.Content,
19296
19984
  {
19297
19985
  side: "bottom",
19298
19986
  align: "start",
@@ -19884,8 +20572,8 @@ function InlineDatePresetFilter({
19884
20572
  applied && (rangeValue ? (
19885
20573
  // 뱃지 모양은 그대로 두고, 눌렀을 때 캘린더가 열려 기간을 직접 다시 고를 수 있게 한다.
19886
20574
  // 직접 고르면 프리셋 선택은 해제된다.
19887
- /* @__PURE__ */ jsxs(RPopover11.Root, { open: pickerOpen, onOpenChange: setPickerOpen, children: [
19888
- /* @__PURE__ */ jsx(RPopover11.Trigger, { asChild: true, children: /* @__PURE__ */ jsx(
20575
+ /* @__PURE__ */ jsxs(RPopover12.Root, { open: pickerOpen, onOpenChange: setPickerOpen, children: [
20576
+ /* @__PURE__ */ jsx(RPopover12.Trigger, { asChild: true, children: /* @__PURE__ */ jsx(
19889
20577
  "button",
19890
20578
  {
19891
20579
  type: "button",
@@ -19894,8 +20582,8 @@ function InlineDatePresetFilter({
19894
20582
  children: badge
19895
20583
  }
19896
20584
  ) }),
19897
- /* @__PURE__ */ jsx(RPopover11.Portal, { container: portalContainer, children: /* @__PURE__ */ jsx(
19898
- RPopover11.Content,
20585
+ /* @__PURE__ */ jsx(RPopover12.Portal, { container: portalContainer, children: /* @__PURE__ */ jsx(
20586
+ RPopover12.Content,
19899
20587
  {
19900
20588
  side: "bottom",
19901
20589
  align: "start",
@@ -21203,8 +21891,8 @@ function STimePicker({
21203
21891
  disabled,
21204
21892
  className,
21205
21893
  style,
21206
- children: /* @__PURE__ */ jsxs(RPopover11.Root, { open, onOpenChange: commitOpen, children: [
21207
- /* @__PURE__ */ jsx(RPopover11.Trigger, { asChild: true, children: /* @__PURE__ */ jsxs(
21894
+ children: /* @__PURE__ */ jsxs(RPopover12.Root, { open, onOpenChange: commitOpen, children: [
21895
+ /* @__PURE__ */ jsx(RPopover12.Trigger, { asChild: true, children: /* @__PURE__ */ jsxs(
21208
21896
  "div",
21209
21897
  {
21210
21898
  ref: triggerRef,
@@ -21264,8 +21952,8 @@ function STimePicker({
21264
21952
  ]
21265
21953
  }
21266
21954
  ) }),
21267
- /* @__PURE__ */ jsx(RPopover11.Portal, { container: portalContainer, children: /* @__PURE__ */ jsx(
21268
- RPopover11.Content,
21955
+ /* @__PURE__ */ jsx(RPopover12.Portal, { container: portalContainer, children: /* @__PURE__ */ jsx(
21956
+ RPopover12.Content,
21269
21957
  {
21270
21958
  side: "bottom",
21271
21959
  align: "start",
@@ -21670,8 +22358,8 @@ function STimeRangePicker({
21670
22358
  disabled,
21671
22359
  className,
21672
22360
  style,
21673
- children: /* @__PURE__ */ jsxs(RPopover11.Root, { open, onOpenChange: commitOpen, children: [
21674
- /* @__PURE__ */ jsx(RPopover11.Trigger, { asChild: true, children: /* @__PURE__ */ jsxs(
22361
+ children: /* @__PURE__ */ jsxs(RPopover12.Root, { open, onOpenChange: commitOpen, children: [
22362
+ /* @__PURE__ */ jsx(RPopover12.Trigger, { asChild: true, children: /* @__PURE__ */ jsxs(
21675
22363
  "div",
21676
22364
  {
21677
22365
  ref: triggerRef,
@@ -21731,8 +22419,8 @@ function STimeRangePicker({
21731
22419
  ]
21732
22420
  }
21733
22421
  ) }),
21734
- /* @__PURE__ */ jsx(RPopover11.Portal, { container: portalContainer, children: /* @__PURE__ */ jsx(
21735
- RPopover11.Content,
22422
+ /* @__PURE__ */ jsx(RPopover12.Portal, { container: portalContainer, children: /* @__PURE__ */ jsx(
22423
+ RPopover12.Content,
21736
22424
  {
21737
22425
  side: "bottom",
21738
22426
  align: "start",
@@ -21759,6 +22447,6 @@ function STimeRangePicker({
21759
22447
  );
21760
22448
  }
21761
22449
 
21762
- export { ACCOUNT_LIST_BOX_ICONS, ACCOUNT_LIST_BOX_ITEM_TONES, ACCOUNT_LIST_BOX_LABELS, ACCOUNT_LIST_BOX_LAYOUT, ACCOUNT_LIST_BOX_TONE_CONFIG, BADGE_COLORS, BUTTON_COLORS, BUTTON_SIZES, COLOR_KEYS, FIELD_WIDTH_GRADES, GNB_COLORS, GNB_COMMON, GNB_FOLD_MS, GNB_FULL_LOGO_WIDTH, GNB_HEADER, GNB_MENU, GNB_MENU_WIDTH, GNB_RAIL, GNB_RAIL_WIDTH, GNB_SYSTEM_COLORS, GNB_SYSTEM_COLOR_CONFIG, GNB_SYSTEM_LAYOUT, GNB_SYSTEM_PLACEMENTS, GNB_SYSTEM_TOP_COLOR_CONFIG, ICONS, IMAGE_FITS, PAGE_BACKGROUNDS, PAGE_CONTENT_HEIGHTS, RangeCalendar, SAccountListBox, SActionModal, SBadge, SBarcodeInput, SButton, SCROLL_AREA_AXES, SCalendar, SCallout, SCard, SCheckbox, SChip2 as SChip, SChipFilter, SChipInput, SCircleProgress, SConfirmModal, SDatePicker, SDatePickerMonthListbox, SDatePickerYearListbox, SDateRangePicker, SDivider, SDraggableGroup, SDraggableItem2 as SDraggableItem, SDraggableList, SDraggableProvider, SDrawer, SDropdownButton2 as SDropdownButton, SEDITOR_DEFAULT_FONT_SIZE, SEDITOR_HEADING_LABELS, SEDITOR_HEADING_LEVELS, SEditor, SExpansionItem, SExpansionList2 as SExpansionList, SField, SFilePicker, SForm, SGhostButton, SGnb, SGnbSystem, SGnbSystemContext, SGuide, SIcon, SImage, SInput, SKeyValueTable, SLAYOUT_MIN_WIDTH, SLayout, SLayoutContext, SLinearProgress, SList2 as SList, SListItem2 as SListItem, SLoadingContainer, SLoadingModal, SLoadingViewport, SModal, SModalOutlet, SNumberInput, SPage, SPagination, SPopover, SPopup, SPortal, SRadio, SRadioButton, SRadioCard, SRadioCardGroup, SRadioGroup, SSPLITTER_UNITS, SScrollArea, SSearchInput, SSectionHeaderCard2 as SSectionHeaderCard, SSelect2 as SSelect, SSplitter2 as SSplitter, SStepper, SSwitch, SSystemActionButton, STEPPER_SIZES, STable, STableBar, STabs, STag, STextLink, STextarea, STimePicker, STimeRangePicker, SToast, SToastContainer, SToggle, STooltip2 as STooltip, STree2 as STree, STreeItem2 as STreeItem, SYSTEM_ACTION_BUTTON_COLORS, SYSTEM_ACTION_BUTTON_COLOR_CONFIG, SYSTEM_ACTION_BUTTON_LAYOUT, SYSTEM_ACTION_BUTTON_TYPES, SYSTEM_ACTION_BUTTON_TYPE_CONFIG, TAG_COLORS, TAG_SHAPES, TAG_SIZES, TIMEPICKER_SIZES, TIMEPICKER_SIZE_CONFIG, buttonPreset, cn, fieldWidthValue, findGnbAncestors, findGnbRailValue, isColorKey, isFieldWidthGrade, loading, resolveColor, useSLayout };
22450
+ export { ACCOUNT_LIST_BOX_ICONS, ACCOUNT_LIST_BOX_ITEM_TONES, ACCOUNT_LIST_BOX_LABELS, ACCOUNT_LIST_BOX_LAYOUT, ACCOUNT_LIST_BOX_TONE_CONFIG, BADGE_COLORS, BUTTON_COLORS, BUTTON_SIZES, CALENDAR_BOARD_DAY_BG, CALENDAR_BOARD_DAY_COLORS, CALENDAR_BOARD_EVENT_COLORS, CALENDAR_BOARD_EVENT_PRESETS, CALENDAR_BOARD_MAX_VISIBLE_EVENTS, COLOR_KEYS, FIELD_WIDTH_GRADES, GNB_COLORS, GNB_COMMON, GNB_FOLD_MS, GNB_FULL_LOGO_WIDTH, GNB_HEADER, GNB_MENU, GNB_MENU_WIDTH, GNB_RAIL, GNB_RAIL_WIDTH, GNB_SYSTEM_COLORS, GNB_SYSTEM_COLOR_CONFIG, GNB_SYSTEM_LAYOUT, GNB_SYSTEM_PLACEMENTS, GNB_SYSTEM_TOP_COLOR_CONFIG, ICONS, IMAGE_FITS, PAGE_BACKGROUNDS, PAGE_CONTENT_HEIGHTS, RangeCalendar, SAccountListBox, SActionModal, SBadge, SBarcodeInput, SButton, SCROLL_AREA_AXES, SCalendar, SCalendarBoard, SCallout, SCard, SCheckbox, SChip2 as SChip, SChipFilter, SChipInput, SCircleProgress, SConfirmModal, SDatePicker, SDatePickerMonthListbox, SDatePickerYearListbox, SDateRangePicker, SDivider, SDraggableGroup, SDraggableItem2 as SDraggableItem, SDraggableList, SDraggableProvider, SDrawer, SDropdownButton2 as SDropdownButton, SEDITOR_DEFAULT_FONT_SIZE, SEDITOR_HEADING_LABELS, SEDITOR_HEADING_LEVELS, SEditor, SExpansionItem, SExpansionList2 as SExpansionList, SField, SFilePicker, SForm, SGhostButton, SGnb, SGnbSystem, SGnbSystemContext, SGuide, SIcon, SImage, SInput, SKeyValueTable, SLAYOUT_MIN_WIDTH, SLayout, SLayoutContext, SLinearProgress, SList2 as SList, SListItem2 as SListItem, SLoadingContainer, SLoadingModal, SLoadingViewport, SModal, SModalOutlet, SNumberInput, SPage, SPagination, SPopover, SPopup, SPortal, SRadio, SRadioButton, SRadioCard, SRadioCardGroup, SRadioGroup, SSPLITTER_UNITS, SScrollArea, SSearchInput, SSectionHeaderCard2 as SSectionHeaderCard, SSelect2 as SSelect, SSplitter2 as SSplitter, SStepper, SSwitch, SSystemActionButton, STEPPER_SIZES, STable, STableBar, STabs, STag, STextLink, STextarea, STimePicker, STimeRangePicker, SToast, SToastContainer, SToggle, STooltip2 as STooltip, STree2 as STree, STreeItem2 as STreeItem, SYSTEM_ACTION_BUTTON_COLORS, SYSTEM_ACTION_BUTTON_COLOR_CONFIG, SYSTEM_ACTION_BUTTON_LAYOUT, SYSTEM_ACTION_BUTTON_TYPES, SYSTEM_ACTION_BUTTON_TYPE_CONFIG, TAG_COLORS, TAG_SHAPES, TAG_SIZES, TIMEPICKER_SIZES, TIMEPICKER_SIZE_CONFIG, buttonPreset, cn, fieldWidthValue, findGnbAncestors, findGnbRailValue, isColorKey, isFieldWidthGrade, loading, resolveColor, useSLayout };
21763
22451
  //# sourceMappingURL=index.js.map
21764
22452
  //# sourceMappingURL=index.js.map