@olundot/ui 0.19.0 → 0.19.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1009,7 +1009,7 @@ function XIcon({ size }) {
1009
1009
  );
1010
1010
  }
1011
1011
  var Alert = React5.forwardRef(
1012
- ({ variant = "info", emphasis, title, children, onDismiss, style, ...rest }, ref) => {
1012
+ ({ variant = "info", emphasis, title: title2, children, onDismiss, style, ...rest }, ref) => {
1013
1013
  const weight = emphasis ?? defaultEmphasis(variant);
1014
1014
  const strong = weight === "strong";
1015
1015
  const fg = SEM_FG[variant];
@@ -1042,7 +1042,7 @@ var Alert = React5.forwardRef(
1042
1042
  "aria-hidden": "true",
1043
1043
  "data-slot": "alert-dot",
1044
1044
  style: {
1045
- marginTop: title ? 5 : 4,
1045
+ marginTop: title2 ? 5 : 4,
1046
1046
  width: 7,
1047
1047
  height: 7,
1048
1048
  flexShrink: 0,
@@ -1052,7 +1052,7 @@ var Alert = React5.forwardRef(
1052
1052
  }
1053
1053
  ),
1054
1054
  /* @__PURE__ */ jsxs5("div", { "data-slot": "alert-content", style: { flex: 1, minWidth: 0 }, children: [
1055
- title ? /* @__PURE__ */ jsx5(
1055
+ title2 ? /* @__PURE__ */ jsx5(
1056
1056
  "div",
1057
1057
  {
1058
1058
  "data-slot": "alert-title",
@@ -1063,7 +1063,7 @@ var Alert = React5.forwardRef(
1063
1063
  lineHeight: 1.35,
1064
1064
  color: strong ? fg : "var(--text-primary)"
1065
1065
  },
1066
- children: title
1066
+ children: title2
1067
1067
  }
1068
1068
  ) : null,
1069
1069
  /* @__PURE__ */ jsx5(
@@ -1071,7 +1071,7 @@ var Alert = React5.forwardRef(
1071
1071
  {
1072
1072
  "data-slot": "alert-body",
1073
1073
  style: {
1074
- marginTop: title ? 2 : 0,
1074
+ marginTop: title2 ? 2 : 0,
1075
1075
  fontFamily: "var(--font-sans)",
1076
1076
  fontSize: 12.5,
1077
1077
  lineHeight: 1.45,
@@ -2399,7 +2399,7 @@ var PageHeader = React13.forwardRef(
2399
2399
  className,
2400
2400
  breadcrumb,
2401
2401
  back,
2402
- title,
2402
+ title: title2,
2403
2403
  headingLevel = 1,
2404
2404
  subtitle,
2405
2405
  meta,
@@ -2443,7 +2443,7 @@ var PageHeader = React13.forwardRef(
2443
2443
  {
2444
2444
  "data-slot": "page-header-title",
2445
2445
  className: "max-w-full break-words font-[family-name:var(--font-display)] text-[28px] font-semibold leading-tight text-foreground",
2446
- children: title
2446
+ children: title2
2447
2447
  }
2448
2448
  ),
2449
2449
  subtitle ? /* @__PURE__ */ jsx14(
@@ -3512,38 +3512,311 @@ var FormLayout = React19.forwardRef(
3512
3512
  );
3513
3513
  FormLayout.displayName = "FormLayout";
3514
3514
 
3515
- // src/components/ui/form-modal.tsx
3516
- import * as React22 from "react";
3517
-
3518
3515
  // src/components/ui/dialog.tsx
3519
- import * as React21 from "react";
3520
- import { Dialog as DialogPrimitive } from "radix-ui";
3521
- import { X } from "lucide-react";
3522
-
3523
- // src/components/ui/sheet.tsx
3524
- import { XIcon as XIcon2 } from "lucide-react";
3525
- import { Dialog as SheetPrimitive } from "radix-ui";
3516
+ import * as React22 from "react";
3517
+ import { Dialog as DialogPrimitive2 } from "radix-ui";
3526
3518
 
3527
3519
  // src/lib/use-return-focus.ts
3528
3520
  import * as React20 from "react";
3529
3521
  function useReturnFocus() {
3530
3522
  const returnTo = React20.useRef(null);
3531
- const onOpenAutoFocus = React20.useCallback(() => {
3523
+ const onOpenAutoFocus = React20.useCallback((event) => {
3532
3524
  const active = document.activeElement;
3533
- returnTo.current = active instanceof HTMLElement && active !== document.body ? active : null;
3525
+ const content = event?.target instanceof HTMLElement ? event.target : null;
3526
+ const hasTrigger = !!content?.id && Array.from(document.querySelectorAll("[aria-controls]")).some(
3527
+ (element) => element.getAttribute("aria-controls") === content.id
3528
+ );
3529
+ returnTo.current = !hasTrigger && active instanceof HTMLElement && active !== document.body ? active : null;
3534
3530
  }, []);
3535
3531
  const onCloseAutoFocus = React20.useCallback((event) => {
3536
3532
  const target = returnTo.current;
3537
3533
  returnTo.current = null;
3538
3534
  if (!target?.isConnected) return;
3535
+ const active = document.activeElement;
3536
+ if (active instanceof HTMLElement && active !== document.body && active !== target) return;
3539
3537
  event.preventDefault();
3540
3538
  target.focus();
3541
3539
  }, []);
3542
3540
  return { onOpenAutoFocus, onCloseAutoFocus };
3543
3541
  }
3544
3542
 
3545
- // src/components/ui/sheet.tsx
3543
+ // src/components/ui/overlay-close-button.tsx
3544
+ import { X } from "lucide-react";
3545
+ import { Dialog as DialogPrimitive } from "radix-ui";
3546
+
3547
+ // src/components/ui/icon-button.tsx
3548
+ import * as React21 from "react";
3549
+ import { cva as cva9 } from "class-variance-authority";
3546
3550
  import { jsx as jsx21, jsxs as jsxs20 } from "react/jsx-runtime";
3551
+ var iconButtonCva = cva9(
3552
+ [
3553
+ "olun-icon-button relative inline-flex cursor-pointer shrink-0 items-center justify-center before:absolute before:content-['']",
3554
+ "rounded-[var(--radius-md)] border font-medium",
3555
+ "transition-colors motion-reduce:transition-none",
3556
+ "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--focus-ring)]",
3557
+ "disabled:cursor-not-allowed disabled:bg-[var(--action-disabled-bg)] disabled:text-text-disabled",
3558
+ "[&_svg]:pointer-events-none [&_svg]:shrink-0"
3559
+ ].join(" "),
3560
+ {
3561
+ variants: {
3562
+ // Legacy single axis, deprecated in 0.19 for `appearance` × `tone` and removed in 0.20.
3563
+ // Frozen at 0.18; button-appearance.test.tsx keeps ghost and subtle equal to their new
3564
+ // pair. `outline` and `danger` differ from the pair they migrate to (outline + neutral =
3565
+ // Button secondary, filled + danger = solid red).
3566
+ variant: {
3567
+ /** @deprecated Use `appearance="ghost" tone="neutral"` (the default). */
3568
+ ghost: "border-transparent bg-transparent text-text-secondary hover:bg-[var(--action-hover)] hover:text-foreground",
3569
+ /** @deprecated Use `appearance="outline" tone="neutral"`. */
3570
+ outline: "border-[var(--border-subtle)] bg-[var(--bg-surface)] text-text-secondary hover:border-[var(--border-strong)] hover:bg-[var(--action-hover)] hover:text-foreground",
3571
+ /** @deprecated Use `appearance="filled" tone="neutral"`. */
3572
+ subtle: "border-transparent bg-[var(--bg-inset)] text-text-secondary hover:bg-[var(--action-hover)] hover:text-foreground",
3573
+ /** @deprecated Use `appearance="filled" tone="danger"` (solid red, like Button). */
3574
+ danger: "border-transparent bg-[var(--error-bg)] text-[var(--error)] hover:bg-[var(--action-hover)]"
3575
+ },
3576
+ ...actionAxisVariants,
3577
+ // Hit area = 44px on every size. The ::before is absolutely positioned, so its
3578
+ // inset is measured from the padding box — inside the 1px border every variant
3579
+ // carries (transparent or not). Inset = (44 - (size - 2 × 1px border)) / 2.
3580
+ size: {
3581
+ sm: "size-[28px] before:-inset-[9px]",
3582
+ md: "size-[32px] before:-inset-[7px]",
3583
+ lg: "size-[40px] before:-inset-[3px]"
3584
+ },
3585
+ pressed: {
3586
+ true: "",
3587
+ false: ""
3588
+ }
3589
+ },
3590
+ compoundVariants: [
3591
+ ...actionCompoundVariants,
3592
+ {
3593
+ pressed: true,
3594
+ variant: ["ghost", "outline", "subtle"],
3595
+ className: "border-[var(--border-strong)] bg-[var(--action-selected)] text-foreground"
3596
+ },
3597
+ {
3598
+ pressed: true,
3599
+ variant: "danger",
3600
+ className: "border-[var(--error)] bg-[var(--error-bg)] text-[var(--error)]"
3601
+ },
3602
+ {
3603
+ pressed: true,
3604
+ tone: "neutral",
3605
+ className: "border-[var(--border-strong)] bg-[var(--action-selected)] text-foreground"
3606
+ }
3607
+ ],
3608
+ // ghost is the intended default, not a fallback: ghost is reserved for icon-only
3609
+ // actions repeated in rows or chrome (toolbars, headers, table rows), and
3610
+ // IconButton is its canonical entry point (#58). Text actions use Button.
3611
+ defaultVariants: {
3612
+ variant: "ghost",
3613
+ size: "md",
3614
+ pressed: false
3615
+ }
3616
+ }
3617
+ );
3618
+ var axisSizeClassName = {
3619
+ xs: "size-[28px] before:-inset-[9px]",
3620
+ sm: "size-[30px] before:-inset-[8px]",
3621
+ md: "size-[32px] before:-inset-[7px]",
3622
+ lg: "size-[36px] before:-inset-[5px]",
3623
+ xl: "size-[40px] before:-inset-[3px]"
3624
+ };
3625
+ var axisIcon = {
3626
+ xs: { size: 14, strokeWidth: 1.75 },
3627
+ sm: { size: 16, strokeWidth: 2 },
3628
+ md: { size: 16, strokeWidth: 2 },
3629
+ lg: { size: 18, strokeWidth: 2 },
3630
+ xl: { size: 18, strokeWidth: 2 }
3631
+ };
3632
+ function iconButtonVariants(options) {
3633
+ if (options?.appearance == null && options?.tone == null) {
3634
+ return iconButtonCva(options);
3635
+ }
3636
+ const { size, ...rest } = options;
3637
+ const paint = iconButtonCva({
3638
+ ...rest,
3639
+ ...resolveActionStyle(options.appearance, options.tone, "ghost"),
3640
+ variant: null,
3641
+ size: null
3642
+ });
3643
+ return size === null ? paint : `${paint} ${axisSizeClassName[size ?? "md"]}`;
3644
+ }
3645
+ var iconButtonBadgeVariants = cva9(
3646
+ [
3647
+ "pointer-events-none absolute right-0 top-0 inline-flex",
3648
+ "olun-icon-button__badge",
3649
+ "min-h-[var(--space-3)] min-w-[var(--space-3)] translate-x-1/3 -translate-y-1/3",
3650
+ "items-center justify-center gap-[2px] rounded-[var(--radius-full)] px-[3px]",
3651
+ "font-[family-name:var(--font-display)] text-[10px] font-semibold leading-none",
3652
+ "[&:has(svg)]:size-[var(--space-3)] [&:has(svg)]:px-0 [&_svg]:size-[10px]"
3653
+ ].join(" "),
3654
+ {
3655
+ variants: {
3656
+ tone: {
3657
+ info: "bg-[var(--accent-pop)] text-[var(--accent-on-fill)]",
3658
+ error: "bg-[var(--error)] text-[var(--error-contrast)]"
3659
+ }
3660
+ },
3661
+ defaultVariants: {
3662
+ tone: "info"
3663
+ }
3664
+ }
3665
+ );
3666
+ var iconSize2 = {
3667
+ sm: 14,
3668
+ md: 16,
3669
+ lg: 18
3670
+ };
3671
+ var textButtonSize = {
3672
+ sm: "xs",
3673
+ md: "md",
3674
+ lg: "xl"
3675
+ };
3676
+ var iconStrokeWidth = {
3677
+ sm: 2.25,
3678
+ md: 2.25,
3679
+ lg: 1.75
3680
+ };
3681
+ var IconButton = React21.forwardRef(
3682
+ ({
3683
+ className,
3684
+ variant = "ghost",
3685
+ appearance,
3686
+ tone,
3687
+ size = "md",
3688
+ pressed = void 0,
3689
+ icon: Icon,
3690
+ badge,
3691
+ badgeTone = "info",
3692
+ type,
3693
+ title: title2,
3694
+ "aria-label": ariaLabel,
3695
+ "aria-labelledby": ariaLabelledBy,
3696
+ iconPosition = "start",
3697
+ label,
3698
+ children,
3699
+ ...props
3700
+ }, ref) => {
3701
+ const resolvedSize = size ?? "md";
3702
+ const usesAxes = appearance != null || tone != null;
3703
+ const isToggle = pressed !== void 0;
3704
+ const isPressed = pressed === true;
3705
+ const hoverTitle = title2 ?? (typeof ariaLabel === "string" ? ariaLabel : void 0);
3706
+ const text = label ?? children;
3707
+ const hasText = text !== void 0 && text !== null && text !== false;
3708
+ const style = usesAxes ? resolveActionStyle(appearance, tone, "ghost") : void 0;
3709
+ const axisSize = usesAxes ? resolvedSize : void 0;
3710
+ const legacySize = resolvedSize;
3711
+ const textBoxSize = axisSize ?? textButtonSize[legacySize];
3712
+ const icon = /* @__PURE__ */ jsx21(
3713
+ Icon,
3714
+ {
3715
+ "aria-hidden": "true",
3716
+ "data-slot": "icon-button-icon",
3717
+ size: axisSize ? axisIcon[axisSize].size : iconSize2[legacySize],
3718
+ strokeWidth: axisSize ? axisIcon[axisSize].strokeWidth : hasText ? void 0 : iconStrokeWidth[legacySize]
3719
+ }
3720
+ );
3721
+ return /* @__PURE__ */ jsxs20(
3722
+ "button",
3723
+ {
3724
+ ref,
3725
+ ...props,
3726
+ "data-slot": "icon-button",
3727
+ "data-variant": usesAxes ? void 0 : variant,
3728
+ "data-appearance": style?.appearance,
3729
+ "data-tone": style?.tone,
3730
+ "data-size": resolvedSize,
3731
+ "data-icon-position": hasText ? iconPosition : void 0,
3732
+ "data-pressed": isToggle ? String(isPressed) : void 0,
3733
+ "aria-label": ariaLabel,
3734
+ "aria-labelledby": ariaLabelledBy,
3735
+ "aria-pressed": isToggle ? isPressed : void 0,
3736
+ title: hoverTitle,
3737
+ className: cn(
3738
+ iconButtonVariants({
3739
+ variant,
3740
+ appearance,
3741
+ tone,
3742
+ size: hasText ? null : size,
3743
+ pressed: isPressed
3744
+ }),
3745
+ hasText && ["whitespace-nowrap", buttonSizeClassName(textBoxSize)],
3746
+ className
3747
+ ),
3748
+ type: type ?? "button",
3749
+ children: [
3750
+ hasText && iconPosition === "end" ? null : icon,
3751
+ hasText ? text : null,
3752
+ hasText && iconPosition === "end" ? icon : null,
3753
+ badge !== void 0 ? /* @__PURE__ */ jsx21(
3754
+ "span",
3755
+ {
3756
+ "aria-hidden": "true",
3757
+ "data-slot": "icon-button-badge",
3758
+ "data-badge-tone": badgeTone,
3759
+ className: iconButtonBadgeVariants({ tone: badgeTone }),
3760
+ children: badge
3761
+ }
3762
+ ) : null
3763
+ ]
3764
+ }
3765
+ );
3766
+ }
3767
+ );
3768
+ IconButton.displayName = "IconButton";
3769
+
3770
+ // src/components/ui/overlay-close-button.tsx
3771
+ import { jsx as jsx22 } from "react/jsx-runtime";
3772
+ function OverlayCloseButton({
3773
+ label = "\uB2EB\uAE30",
3774
+ className
3775
+ }) {
3776
+ return /* @__PURE__ */ jsx22(DialogPrimitive.Close, { asChild: true, children: /* @__PURE__ */ jsx22(IconButton, { appearance: "ghost", size: "md", icon: X, "aria-label": label, className }) });
3777
+ }
3778
+
3779
+ // src/components/ui/overlay-surface.ts
3780
+ var bottomSheet = {
3781
+ /** Dialog / ConfirmDialog `mobilePresentation="sheet"` below 900px. */
3782
+ dialog: cn(
3783
+ // `!` on the box geometry so consumer width/offset classes (unprefixed or `sm:`) never keep
3784
+ // the centered card inside the < 900px band.
3785
+ "max-[899px]:inset-x-0! max-[899px]:top-auto! max-[899px]:bottom-0! max-[899px]:translate-x-0! max-[899px]:translate-y-0!",
3786
+ "max-[899px]:w-full! max-[899px]:max-w-none!",
3787
+ "max-[899px]:max-h-[85dvh] max-[899px]:overflow-y-auto",
3788
+ "max-[899px]:rounded-b-none max-[899px]:border-x-0",
3789
+ // Home-indicator clearance without touching the consumer's padding (DialogFooter's edge bleed
3790
+ // depends on it): a transparent bottom border as tall as the safe area, painted by the surface.
3791
+ "max-[899px]:border-b-[length:env(safe-area-inset-bottom)] max-[899px]:border-b-transparent",
3792
+ // motion-safe gate (not a motion-reduce override): a later-sorted variant would out-rank it.
3793
+ "max-[899px]:motion-safe:data-[state=open]:animate-[olun-sheet-in-from-bottom_var(--sheet-motion-duration)_var(--sheet-motion-easing)_both]",
3794
+ "max-[899px]:motion-safe:data-[state=closed]:animate-[olun-sheet-out-to-bottom_var(--sheet-motion-duration)_var(--sheet-motion-easing)_both]"
3795
+ ),
3796
+ /**
3797
+ * SheetContent `mobileSide="bottom"` below 900px. `max-w-none!` overrides the side variant's
3798
+ * `sm:max-w-sm` cap so the bottom sheet spans the full viewport width across the whole
3799
+ * < 900px band (not capped to 24rem).
3800
+ */
3801
+ sheetMobile: "max-[899px]:inset-x-0 max-[899px]:bottom-0 max-[899px]:top-auto max-[899px]:h-auto max-[899px]:w-full max-[899px]:max-w-none! max-[899px]:border-t max-[899px]:border-l-0 max-[899px]:rounded-none",
3802
+ /** SheetDrawer below 900px: `base` for every width, `full` for `width="full"` / expanded. */
3803
+ detail: {
3804
+ base: cn(
3805
+ "max-[899px]:h-[min(85dvh,720px)] max-[899px]:max-h-[85dvh] max-[899px]:w-full max-[899px]:max-w-none",
3806
+ "max-[899px]:rounded-t-[var(--radius-lg)]"
3807
+ ),
3808
+ full: "max-[899px]:h-[100dvh] max-[899px]:max-h-[100dvh] max-[899px]:rounded-none"
3809
+ },
3810
+ /** ActionSheet, a SheetContent `side="bottom"` at every width. */
3811
+ action: cn(
3812
+ "gap-0 max-h-[85dvh] rounded-t-[var(--radius-lg)]",
3813
+ "pb-[env(safe-area-inset-bottom)]"
3814
+ )
3815
+ };
3816
+
3817
+ // src/components/ui/sheet.tsx
3818
+ import { Dialog as SheetPrimitive } from "radix-ui";
3819
+ import { jsx as jsx23, jsxs as jsxs21 } from "react/jsx-runtime";
3547
3820
  var defaultSheetMotionConfig = {
3548
3821
  type: "slide",
3549
3822
  duration: 300,
@@ -3580,22 +3853,22 @@ function getDefaultSheetMotionStyle(style) {
3580
3853
  return getSheetMotionStyle(defaultSheetMotionConfig, style);
3581
3854
  }
3582
3855
  function Sheet({ ...props }) {
3583
- return /* @__PURE__ */ jsx21(SheetPrimitive.Root, { "data-slot": "sheet", ...props });
3856
+ return /* @__PURE__ */ jsx23(SheetPrimitive.Root, { "data-slot": "sheet", ...props });
3584
3857
  }
3585
3858
  function SheetTrigger({
3586
3859
  ...props
3587
3860
  }) {
3588
- return /* @__PURE__ */ jsx21(SheetPrimitive.Trigger, { "data-slot": "sheet-trigger", ...props });
3861
+ return /* @__PURE__ */ jsx23(SheetPrimitive.Trigger, { "data-slot": "sheet-trigger", ...props });
3589
3862
  }
3590
3863
  function SheetClose({
3591
3864
  ...props
3592
3865
  }) {
3593
- return /* @__PURE__ */ jsx21(SheetPrimitive.Close, { "data-slot": "sheet-close", ...props });
3866
+ return /* @__PURE__ */ jsx23(SheetPrimitive.Close, { "data-slot": "sheet-close", ...props });
3594
3867
  }
3595
3868
  function SheetPortal({
3596
3869
  ...props
3597
3870
  }) {
3598
- return /* @__PURE__ */ jsx21(SheetPrimitive.Portal, { "data-slot": "sheet-portal", ...props });
3871
+ return /* @__PURE__ */ jsx23(SheetPrimitive.Portal, { "data-slot": "sheet-portal", ...props });
3599
3872
  }
3600
3873
  function SheetOverlay({
3601
3874
  className,
@@ -3604,12 +3877,12 @@ function SheetOverlay({
3604
3877
  ...props
3605
3878
  }) {
3606
3879
  const motionConfig = resolveSheetMotionConfig(motion);
3607
- return /* @__PURE__ */ jsx21(
3880
+ return /* @__PURE__ */ jsx23(
3608
3881
  SheetPrimitive.Overlay,
3609
3882
  {
3610
3883
  "data-slot": "sheet-overlay",
3611
3884
  className: cn(
3612
- "fixed inset-0 z-[var(--z-overlay)] bg-[var(--scrim)]",
3885
+ "fixed inset-0 z-[var(--z-modal)] bg-[var(--scrim)]",
3613
3886
  motionConfig && cn(
3614
3887
  "transition-opacity motion-reduce:transition-none",
3615
3888
  "duration-[var(--sheet-motion-duration)]",
@@ -3641,16 +3914,16 @@ function SheetContent({
3641
3914
  const hasSlideMotion = motionConfig && motionConfig.type === "slide";
3642
3915
  const returnFocus = useReturnFocus();
3643
3916
  const handleOpenAutoFocus = (event) => {
3644
- returnFocus.onOpenAutoFocus();
3917
+ returnFocus.onOpenAutoFocus(event);
3645
3918
  onOpenAutoFocus?.(event);
3646
3919
  };
3647
3920
  const handleCloseAutoFocus = (event) => {
3648
3921
  onCloseAutoFocus?.(event);
3649
3922
  if (!event.defaultPrevented) returnFocus.onCloseAutoFocus(event);
3650
3923
  };
3651
- return /* @__PURE__ */ jsxs20(SheetPortal, { children: [
3652
- /* @__PURE__ */ jsx21(SheetOverlay, { motion: motionConfig }),
3653
- /* @__PURE__ */ jsxs20(
3924
+ return /* @__PURE__ */ jsxs21(SheetPortal, { children: [
3925
+ /* @__PURE__ */ jsx23(SheetOverlay, { motion: motionConfig }),
3926
+ /* @__PURE__ */ jsxs21(
3654
3927
  SheetPrimitive.Content,
3655
3928
  {
3656
3929
  "data-slot": "sheet-content",
@@ -3690,9 +3963,7 @@ function SheetContent({
3690
3963
  hasSlideMotion && "max-[899px]:data-[state=open]:animate-[olun-sheet-in-from-top_var(--sheet-motion-duration)_var(--sheet-motion-easing)_both] max-[899px]:data-[state=closed]:animate-[olun-sheet-out-to-top_var(--sheet-motion-duration)_var(--sheet-motion-easing)_both]"
3691
3964
  ),
3692
3965
  mobileSide === "bottom" && cn(
3693
- // `max-w-none!` overrides the side variant's `sm:max-w-sm` cap so the bottom sheet
3694
- // spans the full viewport width across the whole < 900px band (not capped to 24rem).
3695
- "max-[899px]:inset-x-0 max-[899px]:bottom-0 max-[899px]:top-auto max-[899px]:h-auto max-[899px]:w-full max-[899px]:max-w-none! max-[899px]:border-t max-[899px]:border-l-0 max-[899px]:rounded-none",
3966
+ bottomSheet.sheetMobile,
3696
3967
  hasSlideMotion && "max-[899px]:data-[state=open]:animate-[olun-sheet-in-from-bottom_var(--sheet-motion-duration)_var(--sheet-motion-easing)_both] max-[899px]:data-[state=closed]:animate-[olun-sheet-out-to-bottom_var(--sheet-motion-duration)_var(--sheet-motion-easing)_both]"
3697
3968
  ),
3698
3969
  className
@@ -3703,17 +3974,14 @@ function SheetContent({
3703
3974
  ...props,
3704
3975
  children: [
3705
3976
  children,
3706
- showCloseButton && /* @__PURE__ */ jsxs20(SheetPrimitive.Close, { className: "absolute top-4 right-4 cursor-pointer rounded-[var(--radius-md)] opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:ring-2 focus:ring-ring focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none data-[state=open]:bg-secondary", children: [
3707
- /* @__PURE__ */ jsx21(XIcon2, { className: "size-[16px]" }),
3708
- /* @__PURE__ */ jsx21("span", { className: "sr-only", children: "Close" })
3709
- ] })
3977
+ showCloseButton && /* @__PURE__ */ jsx23(OverlayCloseButton, { className: "absolute top-4 right-4" })
3710
3978
  ]
3711
3979
  }
3712
3980
  )
3713
3981
  ] });
3714
3982
  }
3715
3983
  function SheetBody({ className, ...props }) {
3716
- return /* @__PURE__ */ jsx21(
3984
+ return /* @__PURE__ */ jsx23(
3717
3985
  "div",
3718
3986
  {
3719
3987
  "data-slot": "sheet-body",
@@ -3723,7 +3991,7 @@ function SheetBody({ className, ...props }) {
3723
3991
  );
3724
3992
  }
3725
3993
  function SheetHeader({ className, ...props }) {
3726
- return /* @__PURE__ */ jsx21(
3994
+ return /* @__PURE__ */ jsx23(
3727
3995
  "div",
3728
3996
  {
3729
3997
  "data-slot": "sheet-header",
@@ -3733,7 +4001,7 @@ function SheetHeader({ className, ...props }) {
3733
4001
  );
3734
4002
  }
3735
4003
  function SheetFooter({ className, ...props }) {
3736
- return /* @__PURE__ */ jsx21(
4004
+ return /* @__PURE__ */ jsx23(
3737
4005
  "div",
3738
4006
  {
3739
4007
  "data-slot": "sheet-footer",
@@ -3746,7 +4014,7 @@ function SheetTitle({
3746
4014
  className,
3747
4015
  ...props
3748
4016
  }) {
3749
- return /* @__PURE__ */ jsx21(
4017
+ return /* @__PURE__ */ jsx23(
3750
4018
  SheetPrimitive.Title,
3751
4019
  {
3752
4020
  "data-slot": "sheet-title",
@@ -3759,41 +4027,30 @@ function SheetDescription({
3759
4027
  className,
3760
4028
  ...props
3761
4029
  }) {
3762
- return /* @__PURE__ */ jsx21(
4030
+ return /* @__PURE__ */ jsx23(
3763
4031
  SheetPrimitive.Description,
3764
4032
  {
3765
4033
  "data-slot": "sheet-description",
3766
- className: cn("text-sm text-muted-foreground", className),
4034
+ className: cn("text-sm text-text-secondary", className),
3767
4035
  ...props
3768
4036
  }
3769
4037
  );
3770
4038
  }
3771
4039
 
3772
4040
  // src/components/ui/dialog.tsx
3773
- import { jsx as jsx22, jsxs as jsxs21 } from "react/jsx-runtime";
3774
- var dialogMobileSheetClassName = cn(
3775
- // `!` on the box geometry so consumer width/offset classes (unprefixed or `sm:`) never keep
3776
- // the centered card inside the < 900px band.
3777
- "max-[899px]:inset-x-0! max-[899px]:top-auto! max-[899px]:bottom-0! max-[899px]:translate-x-0! max-[899px]:translate-y-0!",
3778
- "max-[899px]:w-full! max-[899px]:max-w-none!",
3779
- "max-[899px]:max-h-[85dvh] max-[899px]:overflow-y-auto",
3780
- "max-[899px]:rounded-b-none max-[899px]:border-x-0",
3781
- // Home-indicator clearance without touching the consumer's padding (DialogFooter's edge bleed
3782
- // depends on it): a transparent bottom border as tall as the safe area, painted by the surface.
3783
- "max-[899px]:border-b-[length:env(safe-area-inset-bottom)] max-[899px]:border-b-transparent",
3784
- // motion-safe gate (not a motion-reduce override): a later-sorted variant would out-rank it.
3785
- "max-[899px]:motion-safe:data-[state=open]:animate-[olun-sheet-in-from-bottom_var(--sheet-motion-duration)_var(--sheet-motion-easing)_both]",
3786
- "max-[899px]:motion-safe:data-[state=closed]:animate-[olun-sheet-out-to-bottom_var(--sheet-motion-duration)_var(--sheet-motion-easing)_both]"
3787
- );
4041
+ import { jsx as jsx24, jsxs as jsxs22 } from "react/jsx-runtime";
3788
4042
  function dialogMobileSheetStyle(style) {
3789
4043
  return getDefaultSheetMotionStyle(style);
3790
4044
  }
3791
- var Dialog = DialogPrimitive.Root;
3792
- var DialogTrigger = DialogPrimitive.Trigger;
3793
- var DialogPortal = DialogPrimitive.Portal;
3794
- var DialogClose = DialogPrimitive.Close;
3795
- var DialogOverlay = React21.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx22(
3796
- DialogPrimitive.Overlay,
4045
+ var DialogModalContext = React22.createContext(true);
4046
+ function Dialog({ modal = true, ...props }) {
4047
+ return /* @__PURE__ */ jsx24(DialogModalContext.Provider, { value: modal, children: /* @__PURE__ */ jsx24(DialogPrimitive2.Root, { modal, ...props }) });
4048
+ }
4049
+ var DialogTrigger = DialogPrimitive2.Trigger;
4050
+ var DialogPortal = DialogPrimitive2.Portal;
4051
+ var DialogClose = DialogPrimitive2.Close;
4052
+ var DialogOverlay = React22.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx24(
4053
+ DialogPrimitive2.Overlay,
3797
4054
  {
3798
4055
  ref,
3799
4056
  className: cn(
@@ -3808,62 +4065,72 @@ var DialogOverlay = React21.forwardRef(({ className, ...props }, ref) => /* @__P
3808
4065
  ...props
3809
4066
  }
3810
4067
  ));
3811
- DialogOverlay.displayName = DialogPrimitive.Overlay.displayName;
3812
- var DialogContent = React21.forwardRef(({ className, children, showCloseButton = false, mobilePresentation = "center", ...props }, ref) => /* @__PURE__ */ jsxs21(DialogPortal, { children: [
3813
- /* @__PURE__ */ jsx22(DialogOverlay, {}),
3814
- /* @__PURE__ */ jsxs21(
3815
- DialogPrimitive.Content,
3816
- {
3817
- ref,
3818
- className: cn(
3819
- "fixed left-1/2 top-1/2 z-[var(--z-modal)]",
3820
- "-translate-x-1/2 -translate-y-1/2",
3821
- "grid w-full max-w-lg gap-4 p-[var(--space-8)]",
3822
- // modal은 dim overlay 위 — panel surface 토큰(--bg-surface)으로 깨끗하게.
3823
- // (page 배경 --bg-base가 아니라 카드/섹션과 같은 surface 층을 쓴다.)
3824
- // arbitrary var 사용: 소비 site/app이 dist를 content-scan 안 해 `bg-base` 유틸이 purge될 수 있어 안전하게 var로.
3825
- "bg-[var(--bg-surface)] text-foreground",
3826
- // 2026: generic 무거운 그림자 대신 floating shadow-8 + 또렷한 중립 grey border(--border·16%) + radius-lg.
3827
- // (border-subtle=8%는 너무 흐려 가장자리가 안 보였음 → border-border로 grey 또렷하게.)
3828
- "border border-border rounded-[var(--radius-lg)] shadow-8",
3829
- "duration-200",
3830
- "data-[state=open]:animate-in data-[state=closed]:animate-out",
3831
- "data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
3832
- "data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95",
3833
- "data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%]",
3834
- "data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%]",
3835
- "motion-reduce:animate-none",
3836
- mobilePresentation === "sheet" && dialogMobileSheetClassName,
3837
- className
3838
- ),
3839
- ...props,
3840
- ...mobilePresentation === "sheet" && { style: dialogMobileSheetStyle(props.style) },
3841
- children: [
3842
- children,
3843
- showCloseButton ? /* @__PURE__ */ jsx22(
3844
- DialogPrimitive.Close,
3845
- {
3846
- className: cn(
3847
- "absolute right-4 top-4 inline-flex size-[32px] cursor-pointer items-center justify-center",
3848
- "rounded-[var(--radius-md)] text-text-secondary",
3849
- "transition-colors motion-reduce:transition-none",
3850
- "hover:bg-accent hover:text-accent-foreground",
3851
- "focus-visible:outline-none focus-visible:shadow-focus-ring",
3852
- "disabled:pointer-events-none disabled:text-text-disabled"
3853
- ),
3854
- "aria-label": "\uB2EB\uAE30",
3855
- children: /* @__PURE__ */ jsx22(X, { className: "size-[16px]" })
3856
- }
3857
- ) : null
3858
- ]
3859
- }
3860
- )
3861
- ] }));
3862
- DialogContent.displayName = DialogPrimitive.Content.displayName;
4068
+ DialogOverlay.displayName = DialogPrimitive2.Overlay.displayName;
4069
+ var DialogContent = React22.forwardRef(
4070
+ ({
4071
+ className,
4072
+ children,
4073
+ showCloseButton = false,
4074
+ mobilePresentation = "center",
4075
+ onOpenAutoFocus,
4076
+ onCloseAutoFocus,
4077
+ ...props
4078
+ }, ref) => {
4079
+ const modal = React22.useContext(DialogModalContext);
4080
+ const returnFocus = useReturnFocus();
4081
+ const handleOpenAutoFocus = (event) => {
4082
+ if (modal) returnFocus.onOpenAutoFocus(event);
4083
+ onOpenAutoFocus?.(event);
4084
+ };
4085
+ const handleCloseAutoFocus = (event) => {
4086
+ onCloseAutoFocus?.(event);
4087
+ if (modal && !event.defaultPrevented) returnFocus.onCloseAutoFocus(event);
4088
+ };
4089
+ return /* @__PURE__ */ jsxs22(DialogPortal, { children: [
4090
+ /* @__PURE__ */ jsx24(DialogOverlay, {}),
4091
+ /* @__PURE__ */ jsxs22(
4092
+ DialogPrimitive2.Content,
4093
+ {
4094
+ ref,
4095
+ className: cn(
4096
+ "fixed left-1/2 top-1/2 z-[var(--z-modal)]",
4097
+ "-translate-x-1/2 -translate-y-1/2",
4098
+ "grid w-full max-w-lg gap-4 p-[var(--space-8)]",
4099
+ // modal은 dim overlay 위 — panel surface 토큰(--bg-surface)으로 깨끗하게.
4100
+ // (page 배경 --bg-base가 아니라 카드/섹션과 같은 surface 층을 쓴다.)
4101
+ // arbitrary var 사용: 소비 site/app이 dist를 content-scan 안 해 `bg-base` 유틸이 purge될 수 있어 안전하게 var로.
4102
+ "bg-[var(--bg-surface)] text-foreground",
4103
+ // 2026: generic 무거운 그림자 대신 floating shadow-8 + 또렷한 중립 grey border(--border·16%) + radius-lg.
4104
+ // (border-subtle=8%는 너무 흐려 가장자리가 안 보였음 → border-border로 grey 또렷하게.)
4105
+ "border border-border rounded-[var(--radius-lg)] shadow-8",
4106
+ "duration-200",
4107
+ "data-[state=open]:animate-in data-[state=closed]:animate-out",
4108
+ "data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
4109
+ "data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95",
4110
+ "data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%]",
4111
+ "data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%]",
4112
+ "motion-reduce:animate-none",
4113
+ mobilePresentation === "sheet" && bottomSheet.dialog,
4114
+ className
4115
+ ),
4116
+ ...props,
4117
+ ...mobilePresentation === "sheet" && { style: dialogMobileSheetStyle(props.style) },
4118
+ onOpenAutoFocus: handleOpenAutoFocus,
4119
+ onCloseAutoFocus: handleCloseAutoFocus,
4120
+ children: [
4121
+ children,
4122
+ showCloseButton ? /* @__PURE__ */ jsx24(OverlayCloseButton, { className: "absolute right-4 top-4" }) : null
4123
+ ]
4124
+ }
4125
+ )
4126
+ ] });
4127
+ }
4128
+ );
4129
+ DialogContent.displayName = DialogPrimitive2.Content.displayName;
3863
4130
  var DialogHeader = ({
3864
4131
  className,
3865
4132
  ...props
3866
- }) => /* @__PURE__ */ jsx22(
4133
+ }) => /* @__PURE__ */ jsx24(
3867
4134
  "div",
3868
4135
  {
3869
4136
  className: cn(
@@ -3878,7 +4145,7 @@ DialogHeader.displayName = "DialogHeader";
3878
4145
  var DialogFooter = ({
3879
4146
  className,
3880
4147
  ...props
3881
- }) => /* @__PURE__ */ jsx22(
4148
+ }) => /* @__PURE__ */ jsx24(
3882
4149
  "div",
3883
4150
  {
3884
4151
  className: cn(
@@ -3894,8 +4161,8 @@ var DialogFooter = ({
3894
4161
  }
3895
4162
  );
3896
4163
  DialogFooter.displayName = "DialogFooter";
3897
- var DialogTitle = React21.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx22(
3898
- DialogPrimitive.Title,
4164
+ var DialogTitle = React22.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx24(
4165
+ DialogPrimitive2.Title,
3899
4166
  {
3900
4167
  ref,
3901
4168
  className: cn(
@@ -3905,17 +4172,17 @@ var DialogTitle = React21.forwardRef(({ className, ...props }, ref) => /* @__PUR
3905
4172
  ...props
3906
4173
  }
3907
4174
  ));
3908
- DialogTitle.displayName = DialogPrimitive.Title.displayName;
3909
- var DialogDescription = React21.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx22(
3910
- DialogPrimitive.Description,
4175
+ DialogTitle.displayName = DialogPrimitive2.Title.displayName;
4176
+ var DialogDescription = React22.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx24(
4177
+ DialogPrimitive2.Description,
3911
4178
  {
3912
4179
  ref,
3913
4180
  className: cn("text-sm text-text-secondary", className),
3914
4181
  ...props
3915
4182
  }
3916
4183
  ));
3917
- DialogDescription.displayName = DialogPrimitive.Description.displayName;
3918
- var DialogEyebrow = React21.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx22(
4184
+ DialogDescription.displayName = DialogPrimitive2.Description.displayName;
4185
+ var DialogEyebrow = React22.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx24(
3919
4186
  "p",
3920
4187
  {
3921
4188
  ref,
@@ -3927,43 +4194,130 @@ var DialogEyebrow = React21.forwardRef(({ className, ...props }, ref) => /* @__P
3927
4194
  }
3928
4195
  ));
3929
4196
  DialogEyebrow.displayName = "DialogEyebrow";
3930
- var DialogRawContent = DialogPrimitive.Content;
4197
+ var DialogRawContent = DialogPrimitive2.Content;
3931
4198
 
3932
- // src/components/ui/form-modal.tsx
3933
- import { jsx as jsx23, jsxs as jsxs22 } from "react/jsx-runtime";
3934
- var formModalContentClassName = cn(
3935
- "w-[calc(100vw-2rem)]",
3936
- "max-w-[560px]",
3937
- "gap-0 p-[var(--space-6)]",
3938
- "bg-[var(--bg-surface)]",
3939
- "border-[var(--border)]",
3940
- "rounded-[var(--radius-lg)]",
3941
- "shadow-[var(--shadow-4)]",
3942
- "text-foreground"
3943
- );
3944
- var formModalWideContentClassName = "max-w-[720px]";
3945
- var formModalHeaderClassName = cn(
4199
+ // src/lib/use-overlay-action.ts
4200
+ import * as React23 from "react";
4201
+ function useOverlayAction({
4202
+ action,
4203
+ onOpenChange,
4204
+ loading = false,
4205
+ disabled = false
4206
+ }) {
4207
+ const [pending, setPending] = React23.useState(false);
4208
+ const busyRef = React23.useRef(false);
4209
+ const isBusy = loading || pending;
4210
+ const guardOpenChange = React23.useCallback(
4211
+ (nextOpen) => {
4212
+ if (!nextOpen && isBusy) {
4213
+ return;
4214
+ }
4215
+ onOpenChange(nextOpen);
4216
+ },
4217
+ [isBusy, onOpenChange]
4218
+ );
4219
+ const run = React23.useCallback(async () => {
4220
+ if (busyRef.current || loading || disabled) {
4221
+ return;
4222
+ }
4223
+ busyRef.current = true;
4224
+ setPending(true);
4225
+ try {
4226
+ await action();
4227
+ onOpenChange(false);
4228
+ } finally {
4229
+ busyRef.current = false;
4230
+ setPending(false);
4231
+ }
4232
+ }, [action, disabled, loading, onOpenChange]);
4233
+ return { isBusy, run, guardOpenChange };
4234
+ }
4235
+
4236
+ // src/components/ui/overlay-tokens.ts
4237
+ var OVERLAY_WIDTH = {
4238
+ compact: "max-w-[420px]",
4239
+ form: "max-w-[560px]",
4240
+ wide: "max-w-[720px]"
4241
+ };
4242
+ var OVERLAY_SHADOW = {
4243
+ preset: "shadow-[var(--shadow-4)]"
4244
+ };
4245
+
4246
+ // src/components/ui/preset-surface.ts
4247
+ var title = cn("text-[18px] font-bold leading-snug text-foreground");
4248
+ var modalHeader = cn(
3946
4249
  "flex flex-col gap-[var(--space-2)]",
3947
4250
  "border-b border-[var(--border-subtle)] pb-[var(--space-4)]",
3948
4251
  "pr-[40px]"
3949
4252
  );
3950
- var formModalTitleClassName = cn(
3951
- "text-[18px] font-bold leading-snug text-foreground"
3952
- );
3953
- var formModalDescriptionClassName = cn(
3954
- "break-keep text-[14px] leading-normal text-text-secondary"
3955
- );
3956
- var formModalBodyClassName = cn(
3957
- "flex flex-col gap-[var(--space-4)] py-[var(--space-6)]"
3958
- );
3959
- var formModalFooterClassName = cn(
4253
+ var modalDescription = cn("break-keep text-[14px] leading-normal text-text-secondary");
4254
+ var modalFooter = cn(
3960
4255
  "border-t border-[var(--border-subtle)] pt-[var(--space-4)]",
3961
4256
  "flex flex-col-reverse justify-end gap-[var(--space-2)] sm:flex-row"
3962
4257
  );
4258
+ var modalBody = "flex flex-col gap-[var(--space-4)] py-[var(--space-6)]";
4259
+ var presetSurface = {
4260
+ form: {
4261
+ content: cn(
4262
+ "w-[calc(100vw-2rem)]",
4263
+ OVERLAY_WIDTH.form,
4264
+ "gap-0 p-[var(--space-6)]",
4265
+ "bg-[var(--bg-surface)]",
4266
+ "border-[var(--border)]",
4267
+ "rounded-[var(--radius-lg)]",
4268
+ OVERLAY_SHADOW.preset,
4269
+ "text-foreground"
4270
+ ),
4271
+ wideContent: OVERLAY_WIDTH.wide,
4272
+ header: modalHeader,
4273
+ title,
4274
+ description: modalDescription,
4275
+ body: modalBody,
4276
+ footer: modalFooter
4277
+ },
4278
+ info: {
4279
+ content: cn(
4280
+ "w-[calc(100vw-2rem)]",
4281
+ OVERLAY_WIDTH.compact,
4282
+ "gap-0 p-[var(--space-6)]",
4283
+ "bg-[var(--bg-surface)]",
4284
+ "border border-[var(--border)]",
4285
+ "rounded-[var(--radius-lg)]",
4286
+ OVERLAY_SHADOW.preset,
4287
+ "text-foreground"
4288
+ ),
4289
+ wideContent: OVERLAY_WIDTH.wide,
4290
+ header: modalHeader,
4291
+ title,
4292
+ description: modalDescription,
4293
+ body: cn(modalBody, "text-[14px] leading-normal text-text-secondary"),
4294
+ footer: modalFooter
4295
+ },
4296
+ confirm: {
4297
+ content: cn(
4298
+ "fixed left-1/2 top-1/2 z-[var(--z-modal)]",
4299
+ "-translate-x-1/2 -translate-y-1/2",
4300
+ "w-[calc(100vw-2rem)]",
4301
+ OVERLAY_WIDTH.compact,
4302
+ "flex flex-col gap-[var(--space-6)]",
4303
+ "bg-[var(--bg-surface)] border border-[var(--border)]",
4304
+ "rounded-[var(--radius-lg)] p-[var(--space-6)]",
4305
+ OVERLAY_SHADOW.preset,
4306
+ "text-foreground"
4307
+ ),
4308
+ title,
4309
+ description: "break-keep text-[14px] leading-relaxed text-text-secondary",
4310
+ body: "min-w-0 text-[14px] leading-relaxed text-text-secondary",
4311
+ footer: "flex items-center justify-end gap-[var(--space-3)]"
4312
+ }
4313
+ };
4314
+
4315
+ // src/components/ui/form-modal.tsx
4316
+ import { jsx as jsx25, jsxs as jsxs23 } from "react/jsx-runtime";
3963
4317
  function FormModal({
3964
4318
  open,
3965
4319
  onOpenChange,
3966
- title,
4320
+ title: title2,
3967
4321
  description,
3968
4322
  children,
3969
4323
  onSubmit,
@@ -3974,72 +4328,48 @@ function FormModal({
3974
4328
  status,
3975
4329
  mobilePresentation = "center"
3976
4330
  }) {
3977
- const [pending, setPending] = React22.useState(false);
3978
- const busyRef = React22.useRef(false);
3979
- const isBusy = loading || pending;
3980
- const returnFocus = useReturnFocus();
3981
- const handleOpenChange = React22.useCallback(
3982
- (nextOpen) => {
3983
- if (!nextOpen && isBusy) {
3984
- return;
3985
- }
3986
- onOpenChange(nextOpen);
3987
- },
3988
- [isBusy, onOpenChange]
3989
- );
3990
- const handleSubmit = React22.useCallback(
3991
- async (event) => {
3992
- event.preventDefault();
3993
- if (busyRef.current || loading) {
3994
- return;
3995
- }
3996
- busyRef.current = true;
3997
- setPending(true);
3998
- try {
3999
- await onSubmit();
4000
- onOpenChange(false);
4001
- } finally {
4002
- busyRef.current = false;
4003
- setPending(false);
4004
- }
4005
- },
4006
- [loading, onOpenChange, onSubmit]
4007
- );
4008
- return /* @__PURE__ */ jsx23(Dialog, { open, onOpenChange: handleOpenChange, children: /* @__PURE__ */ jsx23(
4331
+ const { isBusy, run, guardOpenChange } = useOverlayAction({
4332
+ action: onSubmit,
4333
+ onOpenChange,
4334
+ loading
4335
+ });
4336
+ return /* @__PURE__ */ jsx25(Dialog, { open, onOpenChange: guardOpenChange, children: /* @__PURE__ */ jsx25(
4009
4337
  DialogContent,
4010
4338
  {
4011
4339
  "data-slot": "form-modal-content",
4012
4340
  mobilePresentation,
4013
- ...returnFocus,
4014
4341
  className: cn(
4015
- formModalContentClassName,
4016
- wide && formModalWideContentClassName
4342
+ presetSurface.form.content,
4343
+ wide && presetSurface.form.wideContent
4017
4344
  ),
4018
- children: /* @__PURE__ */ jsxs22("form", { "data-slot": "form-modal-form", onSubmit: handleSubmit, children: [
4019
- /* @__PURE__ */ jsxs22("div", { "data-slot": "form-modal-header", className: formModalHeaderClassName, children: [
4020
- /* @__PURE__ */ jsx23(DialogTitle, { className: formModalTitleClassName, children: title }),
4021
- description ? /* @__PURE__ */ jsx23(DialogDescription, { className: formModalDescriptionClassName, children: description }) : null,
4022
- status ? /* @__PURE__ */ jsx23("div", { "data-slot": "form-modal-status", children: status }) : null
4345
+ children: /* @__PURE__ */ jsxs23("form", { "data-slot": "form-modal-form", onSubmit: (event) => {
4346
+ event.preventDefault();
4347
+ return run();
4348
+ }, children: [
4349
+ /* @__PURE__ */ jsxs23("div", { "data-slot": "form-modal-header", className: presetSurface.form.header, children: [
4350
+ /* @__PURE__ */ jsx25(DialogTitle, { className: presetSurface.form.title, children: title2 }),
4351
+ description ? /* @__PURE__ */ jsx25(DialogDescription, { className: presetSurface.form.description, children: description }) : null,
4352
+ status ? /* @__PURE__ */ jsx25("div", { "data-slot": "form-modal-status", children: status }) : null
4023
4353
  ] }),
4024
- /* @__PURE__ */ jsx23("div", { "data-slot": "form-modal-body", className: formModalBodyClassName, children }),
4025
- /* @__PURE__ */ jsxs22(
4354
+ /* @__PURE__ */ jsx25("div", { "data-slot": "form-modal-body", className: presetSurface.form.body, children }),
4355
+ /* @__PURE__ */ jsxs23(
4026
4356
  "div",
4027
4357
  {
4028
4358
  "data-slot": "form-modal-footer",
4029
- className: formModalFooterClassName,
4359
+ className: presetSurface.form.footer,
4030
4360
  children: [
4031
- /* @__PURE__ */ jsx23(
4361
+ /* @__PURE__ */ jsx25(
4032
4362
  Button,
4033
4363
  {
4034
4364
  variant: "secondary",
4035
4365
  size: "lg",
4036
4366
  className: footerButtonHitAreaClassName,
4037
4367
  disabled: isBusy,
4038
- onClick: () => handleOpenChange(false),
4368
+ onClick: () => guardOpenChange(false),
4039
4369
  children: cancelLabel
4040
4370
  }
4041
4371
  ),
4042
- /* @__PURE__ */ jsx23(Button, { type: "submit", size: "lg", className: footerButtonHitAreaClassName, loading: isBusy, children: submitLabel })
4372
+ /* @__PURE__ */ jsx25(Button, { type: "submit", size: "lg", className: footerButtonHitAreaClassName, loading: isBusy, children: submitLabel })
4043
4373
  ]
4044
4374
  }
4045
4375
  )
@@ -4049,41 +4379,11 @@ function FormModal({
4049
4379
  }
4050
4380
 
4051
4381
  // src/components/ui/info-modal.tsx
4052
- import { jsx as jsx24, jsxs as jsxs23 } from "react/jsx-runtime";
4053
- var infoModalContentClassName = cn(
4054
- "w-[calc(100vw-2rem)]",
4055
- "max-w-[420px]",
4056
- "gap-0 p-[var(--space-6)]",
4057
- "bg-[var(--bg-surface)]",
4058
- "border border-[var(--border)]",
4059
- "rounded-[var(--radius-lg)]",
4060
- "shadow-[var(--shadow-4)]",
4061
- "text-foreground"
4062
- );
4063
- var infoModalWideContentClassName = "max-w-[720px]";
4064
- var infoModalHeaderClassName = cn(
4065
- "flex flex-col gap-[var(--space-2)]",
4066
- "border-b border-[var(--border-subtle)] pb-[var(--space-4)]",
4067
- "pr-[40px]"
4068
- );
4069
- var infoModalTitleClassName = cn(
4070
- "text-[18px] font-bold leading-snug text-foreground"
4071
- );
4072
- var infoModalDescriptionClassName = cn(
4073
- "break-keep text-[14px] leading-normal text-text-secondary"
4074
- );
4075
- var infoModalBodyClassName = cn(
4076
- "flex flex-col gap-[var(--space-4)] py-[var(--space-6)]",
4077
- "text-[14px] leading-normal text-text-secondary"
4078
- );
4079
- var infoModalFooterClassName = cn(
4080
- "border-t border-[var(--border-subtle)] pt-[var(--space-4)]",
4081
- "flex flex-col-reverse justify-end gap-[var(--space-2)] sm:flex-row"
4082
- );
4382
+ import { jsx as jsx26, jsxs as jsxs24 } from "react/jsx-runtime";
4083
4383
  function InfoModal({
4084
4384
  open,
4085
4385
  onOpenChange,
4086
- title,
4386
+ title: title2,
4087
4387
  description,
4088
4388
  children,
4089
4389
  closeLabel = "\uB2EB\uAE30",
@@ -4091,31 +4391,29 @@ function InfoModal({
4091
4391
  footer,
4092
4392
  mobilePresentation = "center"
4093
4393
  }) {
4094
- const returnFocus = useReturnFocus();
4095
- return /* @__PURE__ */ jsx24(Dialog, { open, onOpenChange, children: /* @__PURE__ */ jsxs23(
4394
+ return /* @__PURE__ */ jsx26(Dialog, { open, onOpenChange, children: /* @__PURE__ */ jsxs24(
4096
4395
  DialogContent,
4097
4396
  {
4098
4397
  "data-slot": "info-modal-content",
4099
4398
  mobilePresentation,
4100
- ...returnFocus,
4101
4399
  className: cn(
4102
- infoModalContentClassName,
4103
- width === "wide" && infoModalWideContentClassName
4400
+ presetSurface.info.content,
4401
+ width === "wide" && presetSurface.info.wideContent
4104
4402
  ),
4105
4403
  children: [
4106
- /* @__PURE__ */ jsxs23("div", { "data-slot": "info-modal-header", className: infoModalHeaderClassName, children: [
4107
- /* @__PURE__ */ jsx24(DialogTitle, { "data-slot": "info-modal-title", className: infoModalTitleClassName, children: title }),
4108
- description ? /* @__PURE__ */ jsx24(
4404
+ /* @__PURE__ */ jsxs24("div", { "data-slot": "info-modal-header", className: presetSurface.info.header, children: [
4405
+ /* @__PURE__ */ jsx26(DialogTitle, { "data-slot": "info-modal-title", className: presetSurface.info.title, children: title2 }),
4406
+ description ? /* @__PURE__ */ jsx26(
4109
4407
  DialogDescription,
4110
4408
  {
4111
4409
  "data-slot": "info-modal-description",
4112
- className: infoModalDescriptionClassName,
4410
+ className: presetSurface.info.description,
4113
4411
  children: description
4114
4412
  }
4115
4413
  ) : null
4116
4414
  ] }),
4117
- /* @__PURE__ */ jsx24("div", { "data-slot": "info-modal-body", className: infoModalBodyClassName, children }),
4118
- /* @__PURE__ */ jsx24("div", { "data-slot": "info-modal-footer", className: infoModalFooterClassName, children: footer ?? /* @__PURE__ */ jsx24(
4415
+ /* @__PURE__ */ jsx26("div", { "data-slot": "info-modal-body", className: presetSurface.info.body, children }),
4416
+ /* @__PURE__ */ jsx26("div", { "data-slot": "info-modal-footer", className: presetSurface.info.footer, children: footer ?? /* @__PURE__ */ jsx26(
4119
4417
  Button,
4120
4418
  {
4121
4419
  "data-slot": "info-modal-close-button",
@@ -4136,12 +4434,12 @@ import * as React26 from "react";
4136
4434
  import { SlidersHorizontal } from "lucide-react";
4137
4435
 
4138
4436
  // src/components/ui/chip.tsx
4139
- import * as React23 from "react";
4140
- import { cva as cva9 } from "class-variance-authority";
4437
+ import * as React24 from "react";
4438
+ import { cva as cva10 } from "class-variance-authority";
4141
4439
  import { X as X2 } from "lucide-react";
4142
4440
  import { Slot as Slot2 } from "radix-ui";
4143
- import { jsx as jsx25, jsxs as jsxs24 } from "react/jsx-runtime";
4144
- var chipVariants = cva9(
4441
+ import { jsx as jsx27, jsxs as jsxs25 } from "react/jsx-runtime";
4442
+ var chipVariants = cva10(
4145
4443
  [
4146
4444
  "inline-flex w-fit shrink-0 items-center justify-center whitespace-nowrap",
4147
4445
  "rounded-[var(--radius-full)] border leading-none",
@@ -4204,7 +4502,7 @@ var chipVariants = cva9(
4204
4502
  }
4205
4503
  }
4206
4504
  );
4207
- var chipCountVariants = cva9(
4505
+ var chipCountVariants = cva10(
4208
4506
  [
4209
4507
  "inline-flex min-w-[var(--space-4)] items-center justify-center",
4210
4508
  "rounded-[var(--radius-full)] px-[var(--space-1)]",
@@ -4227,320 +4525,97 @@ var chipCountVariants = cva9(
4227
4525
  }
4228
4526
  },
4229
4527
  defaultVariants: {
4230
- tone: "neutral",
4231
- size: "md"
4232
- }
4233
- }
4234
- );
4235
- var Chip = React23.forwardRef(
4236
- ({
4237
- className,
4238
- variant = "filter",
4239
- tone = "neutral",
4240
- size = "md",
4241
- pressed = false,
4242
- count,
4243
- removeLabel = "Remove",
4244
- asChild = false,
4245
- children,
4246
- ...props
4247
- }, ref) => {
4248
- const removable = variant === "removable";
4249
- if (removable) {
4250
- const {
4251
- onClick,
4252
- disabled,
4253
- type: _type,
4254
- autoFocus: _af,
4255
- form: _form,
4256
- name: _name,
4257
- value: _value,
4258
- ...spanProps
4259
- } = props;
4260
- return /* @__PURE__ */ jsxs24(
4261
- "span",
4262
- {
4263
- "data-slot": "chip",
4264
- "data-variant": variant,
4265
- "data-tone": tone,
4266
- className: cn(chipVariants({ variant, tone, size, pressed, className })),
4267
- ...spanProps,
4268
- children: [
4269
- /* @__PURE__ */ jsx25("span", { children }),
4270
- count !== void 0 ? /* @__PURE__ */ jsx25(
4271
- "span",
4272
- {
4273
- "aria-hidden": "true",
4274
- "data-slot": "chip-count",
4275
- "data-count-tone": tone,
4276
- className: chipCountVariants({ tone, size }),
4277
- children: count
4278
- }
4279
- ) : null,
4280
- /* @__PURE__ */ jsx25(
4281
- "button",
4282
- {
4283
- ref,
4284
- type: "button",
4285
- "data-slot": "chip-remove",
4286
- "aria-label": removeLabel,
4287
- disabled,
4288
- onClick,
4289
- className: "inline-flex size-[var(--space-4)] items-center justify-center rounded-[var(--radius-full)] text-text-tertiary focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--focus-ring)]",
4290
- children: /* @__PURE__ */ jsx25(X2, { "aria-hidden": "true", size: 14, strokeWidth: 2.25 })
4291
- }
4292
- )
4293
- ]
4294
- }
4295
- );
4296
- }
4297
- const Comp = asChild ? Slot2.Root : "button";
4298
- return /* @__PURE__ */ jsxs24(
4299
- Comp,
4300
- {
4301
- ref,
4302
- "data-slot": "chip",
4303
- "data-variant": variant,
4304
- "data-tone": tone,
4305
- "aria-pressed": pressed,
4306
- className: cn(
4307
- chipVariants({ variant, tone, size, pressed, className })
4308
- ),
4309
- type: asChild ? void 0 : props.type ?? "button",
4310
- ...props,
4311
- children: [
4312
- children,
4313
- count !== void 0 ? /* @__PURE__ */ jsx25(
4314
- "span",
4315
- {
4316
- "aria-hidden": "true",
4317
- "data-slot": "chip-count",
4318
- "data-count-tone": tone,
4319
- className: chipCountVariants({ tone, size }),
4320
- children: count
4321
- }
4322
- ) : null
4323
- ]
4324
- }
4325
- );
4326
- }
4327
- );
4328
- Chip.displayName = "Chip";
4329
-
4330
- // src/components/ui/icon-button.tsx
4331
- import * as React24 from "react";
4332
- import { cva as cva10 } from "class-variance-authority";
4333
- import { jsx as jsx26, jsxs as jsxs25 } from "react/jsx-runtime";
4334
- var iconButtonCva = cva10(
4335
- [
4336
- "olun-icon-button relative inline-flex cursor-pointer shrink-0 items-center justify-center before:absolute before:content-['']",
4337
- "rounded-[var(--radius-md)] border font-medium",
4338
- "transition-colors motion-reduce:transition-none",
4339
- "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--focus-ring)]",
4340
- "disabled:cursor-not-allowed disabled:bg-[var(--action-disabled-bg)] disabled:text-text-disabled",
4341
- "[&_svg]:pointer-events-none [&_svg]:shrink-0"
4342
- ].join(" "),
4343
- {
4344
- variants: {
4345
- // Legacy single axis, deprecated in 0.19 for `appearance` × `tone` and removed in 0.20.
4346
- // Frozen at 0.18; button-appearance.test.tsx keeps ghost and subtle equal to their new
4347
- // pair. `outline` and `danger` differ from the pair they migrate to (outline + neutral =
4348
- // Button secondary, filled + danger = solid red).
4349
- variant: {
4350
- /** @deprecated Use `appearance="ghost" tone="neutral"` (the default). */
4351
- ghost: "border-transparent bg-transparent text-text-secondary hover:bg-[var(--action-hover)] hover:text-foreground",
4352
- /** @deprecated Use `appearance="outline" tone="neutral"`. */
4353
- outline: "border-[var(--border-subtle)] bg-[var(--bg-surface)] text-text-secondary hover:border-[var(--border-strong)] hover:bg-[var(--action-hover)] hover:text-foreground",
4354
- /** @deprecated Use `appearance="filled" tone="neutral"`. */
4355
- subtle: "border-transparent bg-[var(--bg-inset)] text-text-secondary hover:bg-[var(--action-hover)] hover:text-foreground",
4356
- /** @deprecated Use `appearance="filled" tone="danger"` (solid red, like Button). */
4357
- danger: "border-transparent bg-[var(--error-bg)] text-[var(--error)] hover:bg-[var(--action-hover)]"
4358
- },
4359
- ...actionAxisVariants,
4360
- // Hit area = 44px on every size. The ::before is absolutely positioned, so its
4361
- // inset is measured from the padding box — inside the 1px border every variant
4362
- // carries (transparent or not). Inset = (44 - (size - 2 × 1px border)) / 2.
4363
- size: {
4364
- sm: "size-[28px] before:-inset-[9px]",
4365
- md: "size-[32px] before:-inset-[7px]",
4366
- lg: "size-[40px] before:-inset-[3px]"
4367
- },
4368
- pressed: {
4369
- true: "",
4370
- false: ""
4371
- }
4372
- },
4373
- compoundVariants: [
4374
- ...actionCompoundVariants,
4375
- {
4376
- pressed: true,
4377
- variant: ["ghost", "outline", "subtle"],
4378
- className: "border-[var(--border-strong)] bg-[var(--action-selected)] text-foreground"
4379
- },
4380
- {
4381
- pressed: true,
4382
- variant: "danger",
4383
- className: "border-[var(--error)] bg-[var(--error-bg)] text-[var(--error)]"
4384
- },
4385
- {
4386
- pressed: true,
4387
- tone: "neutral",
4388
- className: "border-[var(--border-strong)] bg-[var(--action-selected)] text-foreground"
4389
- }
4390
- ],
4391
- // ghost is the intended default, not a fallback: ghost is reserved for icon-only
4392
- // actions repeated in rows or chrome (toolbars, headers, table rows), and
4393
- // IconButton is its canonical entry point (#58). Text actions use Button.
4394
- defaultVariants: {
4395
- variant: "ghost",
4396
- size: "md",
4397
- pressed: false
4398
- }
4399
- }
4400
- );
4401
- var axisSizeClassName = {
4402
- xs: "size-[28px] before:-inset-[9px]",
4403
- sm: "size-[30px] before:-inset-[8px]",
4404
- md: "size-[32px] before:-inset-[7px]",
4405
- lg: "size-[36px] before:-inset-[5px]",
4406
- xl: "size-[40px] before:-inset-[3px]"
4407
- };
4408
- var axisIcon = {
4409
- xs: { size: 14, strokeWidth: 1.75 },
4410
- sm: { size: 16, strokeWidth: 2 },
4411
- md: { size: 16, strokeWidth: 2 },
4412
- lg: { size: 18, strokeWidth: 2 },
4413
- xl: { size: 18, strokeWidth: 2 }
4414
- };
4415
- function iconButtonVariants(options) {
4416
- if (options?.appearance == null && options?.tone == null) {
4417
- return iconButtonCva(options);
4418
- }
4419
- const { size, ...rest } = options;
4420
- const paint = iconButtonCva({
4421
- ...rest,
4422
- ...resolveActionStyle(options.appearance, options.tone, "ghost"),
4423
- variant: null,
4424
- size: null
4425
- });
4426
- return size === null ? paint : `${paint} ${axisSizeClassName[size ?? "md"]}`;
4427
- }
4428
- var iconButtonBadgeVariants = cva10(
4429
- [
4430
- "pointer-events-none absolute right-0 top-0 inline-flex",
4431
- "olun-icon-button__badge",
4432
- "min-h-[var(--space-3)] min-w-[var(--space-3)] translate-x-1/3 -translate-y-1/3",
4433
- "items-center justify-center gap-[2px] rounded-[var(--radius-full)] px-[3px]",
4434
- "font-[family-name:var(--font-display)] text-[10px] font-semibold leading-none",
4435
- "[&:has(svg)]:size-[var(--space-3)] [&:has(svg)]:px-0 [&_svg]:size-[10px]"
4436
- ].join(" "),
4437
- {
4438
- variants: {
4439
- tone: {
4440
- info: "bg-[var(--accent-pop)] text-[var(--accent-on-fill)]",
4441
- error: "bg-[var(--error)] text-[var(--error-contrast)]"
4442
- }
4443
- },
4444
- defaultVariants: {
4445
- tone: "info"
4528
+ tone: "neutral",
4529
+ size: "md"
4446
4530
  }
4447
4531
  }
4448
4532
  );
4449
- var iconSize2 = {
4450
- sm: 14,
4451
- md: 16,
4452
- lg: 18
4453
- };
4454
- var textButtonSize = {
4455
- sm: "xs",
4456
- md: "md",
4457
- lg: "xl"
4458
- };
4459
- var iconStrokeWidth = {
4460
- sm: 2.25,
4461
- md: 2.25,
4462
- lg: 1.75
4463
- };
4464
- var IconButton = React24.forwardRef(
4533
+ var Chip = React24.forwardRef(
4465
4534
  ({
4466
4535
  className,
4467
- variant = "ghost",
4468
- appearance,
4469
- tone,
4536
+ variant = "filter",
4537
+ tone = "neutral",
4470
4538
  size = "md",
4471
- pressed = void 0,
4472
- icon: Icon,
4473
- badge,
4474
- badgeTone = "info",
4475
- type,
4476
- title,
4477
- "aria-label": ariaLabel,
4478
- "aria-labelledby": ariaLabelledBy,
4479
- iconPosition = "start",
4480
- label,
4539
+ pressed = false,
4540
+ count,
4541
+ removeLabel = "Remove",
4542
+ asChild = false,
4481
4543
  children,
4482
4544
  ...props
4483
4545
  }, ref) => {
4484
- const resolvedSize = size ?? "md";
4485
- const usesAxes = appearance != null || tone != null;
4486
- const isToggle = pressed !== void 0;
4487
- const isPressed = pressed === true;
4488
- const hoverTitle = title ?? (typeof ariaLabel === "string" ? ariaLabel : void 0);
4489
- const text = label ?? children;
4490
- const hasText = text !== void 0 && text !== null && text !== false;
4491
- const style = usesAxes ? resolveActionStyle(appearance, tone, "ghost") : void 0;
4492
- const axisSize = usesAxes ? resolvedSize : void 0;
4493
- const legacySize = resolvedSize;
4494
- const textBoxSize = axisSize ?? textButtonSize[legacySize];
4495
- const icon = /* @__PURE__ */ jsx26(
4496
- Icon,
4497
- {
4498
- "aria-hidden": "true",
4499
- "data-slot": "icon-button-icon",
4500
- size: axisSize ? axisIcon[axisSize].size : iconSize2[legacySize],
4501
- strokeWidth: axisSize ? axisIcon[axisSize].strokeWidth : hasText ? void 0 : iconStrokeWidth[legacySize]
4502
- }
4503
- );
4546
+ const removable = variant === "removable";
4547
+ if (removable) {
4548
+ const {
4549
+ onClick,
4550
+ disabled,
4551
+ type: _type,
4552
+ autoFocus: _af,
4553
+ form: _form,
4554
+ name: _name,
4555
+ value: _value,
4556
+ ...spanProps
4557
+ } = props;
4558
+ return /* @__PURE__ */ jsxs25(
4559
+ "span",
4560
+ {
4561
+ "data-slot": "chip",
4562
+ "data-variant": variant,
4563
+ "data-tone": tone,
4564
+ className: cn(chipVariants({ variant, tone, size, pressed, className })),
4565
+ ...spanProps,
4566
+ children: [
4567
+ /* @__PURE__ */ jsx27("span", { children }),
4568
+ count !== void 0 ? /* @__PURE__ */ jsx27(
4569
+ "span",
4570
+ {
4571
+ "aria-hidden": "true",
4572
+ "data-slot": "chip-count",
4573
+ "data-count-tone": tone,
4574
+ className: chipCountVariants({ tone, size }),
4575
+ children: count
4576
+ }
4577
+ ) : null,
4578
+ /* @__PURE__ */ jsx27(
4579
+ "button",
4580
+ {
4581
+ ref,
4582
+ type: "button",
4583
+ "data-slot": "chip-remove",
4584
+ "aria-label": removeLabel,
4585
+ disabled,
4586
+ onClick,
4587
+ className: "inline-flex size-[var(--space-4)] items-center justify-center rounded-[var(--radius-full)] text-text-tertiary focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--focus-ring)]",
4588
+ children: /* @__PURE__ */ jsx27(X2, { "aria-hidden": "true", size: 14, strokeWidth: 2.25 })
4589
+ }
4590
+ )
4591
+ ]
4592
+ }
4593
+ );
4594
+ }
4595
+ const Comp = asChild ? Slot2.Root : "button";
4504
4596
  return /* @__PURE__ */ jsxs25(
4505
- "button",
4597
+ Comp,
4506
4598
  {
4507
4599
  ref,
4508
- ...props,
4509
- "data-slot": "icon-button",
4510
- "data-variant": usesAxes ? void 0 : variant,
4511
- "data-appearance": style?.appearance,
4512
- "data-tone": style?.tone,
4513
- "data-size": resolvedSize,
4514
- "data-icon-position": hasText ? iconPosition : void 0,
4515
- "data-pressed": isToggle ? String(isPressed) : void 0,
4516
- "aria-label": ariaLabel,
4517
- "aria-labelledby": ariaLabelledBy,
4518
- "aria-pressed": isToggle ? isPressed : void 0,
4519
- title: hoverTitle,
4600
+ "data-slot": "chip",
4601
+ "data-variant": variant,
4602
+ "data-tone": tone,
4603
+ "aria-pressed": pressed,
4520
4604
  className: cn(
4521
- iconButtonVariants({
4522
- variant,
4523
- appearance,
4524
- tone,
4525
- size: hasText ? null : size,
4526
- pressed: isPressed
4527
- }),
4528
- hasText && ["whitespace-nowrap", buttonSizeClassName(textBoxSize)],
4529
- className
4605
+ chipVariants({ variant, tone, size, pressed, className })
4530
4606
  ),
4531
- type: type ?? "button",
4607
+ type: asChild ? void 0 : props.type ?? "button",
4608
+ ...props,
4532
4609
  children: [
4533
- hasText && iconPosition === "end" ? null : icon,
4534
- hasText ? text : null,
4535
- hasText && iconPosition === "end" ? icon : null,
4536
- badge !== void 0 ? /* @__PURE__ */ jsx26(
4610
+ children,
4611
+ count !== void 0 ? /* @__PURE__ */ jsx27(
4537
4612
  "span",
4538
4613
  {
4539
4614
  "aria-hidden": "true",
4540
- "data-slot": "icon-button-badge",
4541
- "data-badge-tone": badgeTone,
4542
- className: iconButtonBadgeVariants({ tone: badgeTone }),
4543
- children: badge
4615
+ "data-slot": "chip-count",
4616
+ "data-count-tone": tone,
4617
+ className: chipCountVariants({ tone, size }),
4618
+ children: count
4544
4619
  }
4545
4620
  ) : null
4546
4621
  ]
@@ -4548,20 +4623,20 @@ var IconButton = React24.forwardRef(
4548
4623
  );
4549
4624
  }
4550
4625
  );
4551
- IconButton.displayName = "IconButton";
4626
+ Chip.displayName = "Chip";
4552
4627
 
4553
4628
  // src/components/ui/popover.tsx
4554
4629
  import * as React25 from "react";
4555
4630
  import { Popover as PopoverPrimitive } from "radix-ui";
4556
- import { jsx as jsx27, jsxs as jsxs26 } from "react/jsx-runtime";
4631
+ import { jsx as jsx28, jsxs as jsxs26 } from "react/jsx-runtime";
4557
4632
  function Popover({ modal = false, ...props }) {
4558
- return /* @__PURE__ */ jsx27(PopoverPrimitive.Root, { modal, ...props });
4633
+ return /* @__PURE__ */ jsx28(PopoverPrimitive.Root, { modal, ...props });
4559
4634
  }
4560
4635
  var popoverArrowClassName = "fill-[var(--bg-surface)] stroke-[var(--border)] [&>polygon]:[vector-effect:non-scaling-stroke]";
4561
4636
  var PopoverTrigger = PopoverPrimitive.Trigger;
4562
4637
  var PopoverAnchor = PopoverPrimitive.Anchor;
4563
4638
  var PopoverClose = PopoverPrimitive.Close;
4564
- var PopoverContent = React25.forwardRef(({ className, align = "center", sideOffset = 8, collisionPadding = 8, showArrow = false, children, ...props }, ref) => /* @__PURE__ */ jsx27(PopoverPrimitive.Portal, { children: /* @__PURE__ */ jsxs26(
4639
+ var PopoverContent = React25.forwardRef(({ className, align = "center", sideOffset = 8, collisionPadding = 8, showArrow = false, children, ...props }, ref) => /* @__PURE__ */ jsx28(PopoverPrimitive.Portal, { children: /* @__PURE__ */ jsxs26(
4565
4640
  PopoverPrimitive.Content,
4566
4641
  {
4567
4642
  ref,
@@ -4585,7 +4660,7 @@ var PopoverContent = React25.forwardRef(({ className, align = "center", sideOffs
4585
4660
  ...props,
4586
4661
  children: [
4587
4662
  children,
4588
- showArrow ? /* @__PURE__ */ jsx27(
4663
+ showArrow ? /* @__PURE__ */ jsx28(
4589
4664
  PopoverPrimitive.Arrow,
4590
4665
  {
4591
4666
  "data-slot": "popover-arrow",
@@ -4598,7 +4673,7 @@ var PopoverContent = React25.forwardRef(({ className, align = "center", sideOffs
4598
4673
  }
4599
4674
  ) }));
4600
4675
  PopoverContent.displayName = PopoverPrimitive.Content.displayName;
4601
- var PopoverArrow = React25.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx27(
4676
+ var PopoverArrow = React25.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx28(
4602
4677
  PopoverPrimitive.Arrow,
4603
4678
  {
4604
4679
  ref,
@@ -4612,20 +4687,19 @@ var PopoverArrow = React25.forwardRef(({ className, ...props }, ref) => /* @__PU
4612
4687
  PopoverArrow.displayName = PopoverPrimitive.Arrow.displayName;
4613
4688
 
4614
4689
  // src/components/ui/sheet-drawer.tsx
4615
- import { Maximize2Icon, Minimize2Icon, XIcon as XIcon3 } from "lucide-react";
4616
- import { jsx as jsx28, jsxs as jsxs27 } from "react/jsx-runtime";
4690
+ import { Maximize2Icon, Minimize2Icon } from "lucide-react";
4691
+ import { jsx as jsx29, jsxs as jsxs27 } from "react/jsx-runtime";
4617
4692
  var sheetDrawerContentClassName = cn(
4618
4693
  "gap-0 p-0",
4619
4694
  "bg-[var(--bg-surface)] text-foreground",
4620
4695
  "border-[var(--border)] shadow-[var(--shadow-16)]",
4621
4696
  "min-[900px]:w-[480px] min-[900px]:max-w-[480px]",
4622
- "max-[899px]:h-[min(85dvh,720px)] max-[899px]:max-h-[85dvh] max-[899px]:w-full max-[899px]:max-w-none",
4623
- "max-[899px]:rounded-t-[var(--radius-lg)]"
4697
+ bottomSheet.detail.base
4624
4698
  );
4625
4699
  var sheetDrawerWideContentClassName = "min-[900px]:w-[720px] min-[900px]:max-w-[720px]";
4626
4700
  var sheetDrawerFullContentClassName = cn(
4627
4701
  "min-[900px]:w-[calc(100vw_-_var(--space-8))] min-[900px]:max-w-[calc(100vw_-_var(--space-8))]",
4628
- "max-[899px]:h-[100dvh] max-[899px]:max-h-[100dvh] max-[899px]:rounded-none"
4702
+ bottomSheet.detail.full
4629
4703
  );
4630
4704
  var sheetDrawerHeaderClassName = cn(
4631
4705
  "flex items-start justify-between gap-[var(--space-4)]",
@@ -4635,12 +4709,6 @@ var sheetDrawerHeaderTextClassName = "flex min-w-0 flex-1 flex-col gap-[var(--sp
4635
4709
  var sheetDrawerCaptionClassName = "flex flex-wrap items-center gap-[var(--space-2)]";
4636
4710
  var sheetDrawerTitleClassName = "text-[18px] font-bold leading-snug text-foreground";
4637
4711
  var sheetDrawerDescriptionClassName = "break-keep text-[14px] leading-normal text-text-secondary";
4638
- var sheetDrawerCloseButtonClassName = cn(
4639
- "flex size-[32px] shrink-0 cursor-pointer items-center justify-center",
4640
- "rounded-[var(--radius-md)] text-text-tertiary transition-colors",
4641
- "hover:bg-[var(--action-hover)] hover:text-foreground",
4642
- "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--focus-ring)] focus-visible:ring-offset-2"
4643
- );
4644
4712
  var sheetDrawerHeaderActionsClassName = cn(
4645
4713
  "flex shrink-0 items-center gap-[var(--space-1)]"
4646
4714
  );
@@ -4663,7 +4731,7 @@ function SheetDrawer({
4663
4731
  open,
4664
4732
  onOpenChange,
4665
4733
  caption,
4666
- title,
4734
+ title: title2,
4667
4735
  description,
4668
4736
  children,
4669
4737
  expandHref,
@@ -4682,7 +4750,7 @@ function SheetDrawer({
4682
4750
  const resolvedWidth = expanded ? "full" : width;
4683
4751
  const resolvedExpandLabel = hasExpandedToggle && expanded ? collapseLabel : expandLabel;
4684
4752
  const ExpandActionIcon = hasExpandedToggle && expanded ? Minimize2Icon : Maximize2Icon;
4685
- return /* @__PURE__ */ jsx28(Sheet, { open, onOpenChange, children: /* @__PURE__ */ jsxs27(
4753
+ return /* @__PURE__ */ jsx29(Sheet, { open, onOpenChange, children: /* @__PURE__ */ jsxs27(
4686
4754
  SheetContent,
4687
4755
  {
4688
4756
  "data-slot": "sheet-drawer-content",
@@ -4698,9 +4766,9 @@ function SheetDrawer({
4698
4766
  children: [
4699
4767
  /* @__PURE__ */ jsxs27("div", { "data-slot": "sheet-drawer-header", className: sheetDrawerHeaderClassName, children: [
4700
4768
  /* @__PURE__ */ jsxs27("div", { className: sheetDrawerHeaderTextClassName, children: [
4701
- caption ? /* @__PURE__ */ jsx28("div", { "data-slot": "sheet-drawer-caption", className: sheetDrawerCaptionClassName, children: caption }) : null,
4702
- /* @__PURE__ */ jsx28(SheetTitle, { "data-slot": "sheet-drawer-title", className: sheetDrawerTitleClassName, children: title }),
4703
- description ? /* @__PURE__ */ jsx28(
4769
+ caption ? /* @__PURE__ */ jsx29("div", { "data-slot": "sheet-drawer-caption", className: sheetDrawerCaptionClassName, children: caption }) : null,
4770
+ /* @__PURE__ */ jsx29(SheetTitle, { "data-slot": "sheet-drawer-title", className: sheetDrawerTitleClassName, children: title2 }),
4771
+ description ? /* @__PURE__ */ jsx29(
4704
4772
  SheetDescription,
4705
4773
  {
4706
4774
  "data-slot": "sheet-drawer-description",
@@ -4721,8 +4789,8 @@ function SheetDrawer({
4721
4789
  className: sheetDrawerExpandButtonClassName,
4722
4790
  onClick: () => onExpandedChange(!expanded),
4723
4791
  children: [
4724
- /* @__PURE__ */ jsx28(ExpandActionIcon, { className: "size-[16px]" }),
4725
- /* @__PURE__ */ jsx28("span", { className: "hidden text-sm font-medium leading-normal md:inline", children: resolvedExpandLabel })
4792
+ /* @__PURE__ */ jsx29(ExpandActionIcon, { className: "size-[16px]" }),
4793
+ /* @__PURE__ */ jsx29("span", { className: "hidden text-sm font-medium leading-normal md:inline", children: resolvedExpandLabel })
4726
4794
  ]
4727
4795
  }
4728
4796
  ) : expandHref ? /* @__PURE__ */ jsxs27(
@@ -4733,8 +4801,8 @@ function SheetDrawer({
4733
4801
  "data-slot": "sheet-drawer-expand",
4734
4802
  className: sheetDrawerExpandButtonClassName,
4735
4803
  children: [
4736
- /* @__PURE__ */ jsx28(ExpandActionIcon, { className: "size-[16px]" }),
4737
- /* @__PURE__ */ jsx28("span", { className: "hidden text-sm font-medium leading-normal md:inline", children: expandLabel })
4804
+ /* @__PURE__ */ jsx29(ExpandActionIcon, { className: "size-[16px]" }),
4805
+ /* @__PURE__ */ jsx29("span", { className: "hidden text-sm font-medium leading-normal md:inline", children: expandLabel })
4738
4806
  ]
4739
4807
  }
4740
4808
  ) : /* @__PURE__ */ jsxs27(
@@ -4746,31 +4814,23 @@ function SheetDrawer({
4746
4814
  className: sheetDrawerExpandButtonClassName,
4747
4815
  onClick: onExpand,
4748
4816
  children: [
4749
- /* @__PURE__ */ jsx28(ExpandActionIcon, { className: "size-[16px]" }),
4750
- /* @__PURE__ */ jsx28("span", { className: "hidden text-sm font-medium leading-normal md:inline", children: expandLabel })
4817
+ /* @__PURE__ */ jsx29(ExpandActionIcon, { className: "size-[16px]" }),
4818
+ /* @__PURE__ */ jsx29("span", { className: "hidden text-sm font-medium leading-normal md:inline", children: expandLabel })
4751
4819
  ]
4752
4820
  }
4753
4821
  ) : null,
4754
- /* @__PURE__ */ jsx28(
4755
- SheetClose,
4756
- {
4757
- "aria-label": closeLabel,
4758
- "data-slot": "sheet-drawer-close",
4759
- className: sheetDrawerCloseButtonClassName,
4760
- children: /* @__PURE__ */ jsx28(XIcon3, { className: "size-[16px]" })
4761
- }
4762
- )
4822
+ /* @__PURE__ */ jsx29(OverlayCloseButton, { label: closeLabel })
4763
4823
  ] })
4764
4824
  ] }),
4765
- /* @__PURE__ */ jsx28("div", { "data-slot": "sheet-drawer-body", className: sheetDrawerBodyClassName, children }),
4766
- footer ? /* @__PURE__ */ jsx28("div", { "data-slot": "sheet-drawer-footer", className: sheetDrawerFooterClassName, children: footer }) : null
4825
+ /* @__PURE__ */ jsx29("div", { "data-slot": "sheet-drawer-body", className: sheetDrawerBodyClassName, children }),
4826
+ footer ? /* @__PURE__ */ jsx29("div", { "data-slot": "sheet-drawer-footer", className: sheetDrawerFooterClassName, children: footer }) : null
4767
4827
  ]
4768
4828
  }
4769
4829
  ) });
4770
4830
  }
4771
4831
 
4772
4832
  // src/components/ui/filter-toolbar.tsx
4773
- import { Fragment as Fragment7, jsx as jsx29, jsxs as jsxs28 } from "react/jsx-runtime";
4833
+ import { Fragment as Fragment7, jsx as jsx30, jsxs as jsxs28 } from "react/jsx-runtime";
4774
4834
  var collapsibleClassNames = {
4775
4835
  sm: {
4776
4836
  inline: "hidden @[640px]:flex",
@@ -4841,7 +4901,7 @@ var FilterToolbar = React26.forwardRef(
4841
4901
  const usesSheet = containerWidth !== null && containerWidth < 640;
4842
4902
  const collapseClasses = collapsibleClassNames[collapseBelow];
4843
4903
  const collapseTriggerLabel = hasAppliedFilters ? `${collapsedLabel}, ${activeFilterCount}\uAC1C \uC801\uC6A9` : collapsedLabel;
4844
- const clearFiltersButton = onClearFilters ? /* @__PURE__ */ jsx29(
4904
+ const clearFiltersButton = onClearFilters ? /* @__PURE__ */ jsx30(
4845
4905
  "button",
4846
4906
  {
4847
4907
  type: "button",
@@ -4851,7 +4911,7 @@ var FilterToolbar = React26.forwardRef(
4851
4911
  children: "\uD574\uC81C"
4852
4912
  }
4853
4913
  ) : null;
4854
- const collapsedContent = collapsible ? /* @__PURE__ */ jsx29(
4914
+ const collapsedContent = collapsible ? /* @__PURE__ */ jsx30(
4855
4915
  "div",
4856
4916
  {
4857
4917
  "data-slot": "filter-toolbar-collapsed-content",
@@ -4868,7 +4928,7 @@ var FilterToolbar = React26.forwardRef(
4868
4928
  collapseClasses.trigger
4869
4929
  ),
4870
4930
  children: [
4871
- /* @__PURE__ */ jsx29(
4931
+ /* @__PURE__ */ jsx30(
4872
4932
  IconButton,
4873
4933
  {
4874
4934
  ref: triggerRef,
@@ -4879,7 +4939,7 @@ var FilterToolbar = React26.forwardRef(
4879
4939
  onClick: () => handleOverlayOpenChange(true)
4880
4940
  }
4881
4941
  ),
4882
- hasAppliedFilters ? /* @__PURE__ */ jsx29(
4942
+ hasAppliedFilters ? /* @__PURE__ */ jsx30(
4883
4943
  "span",
4884
4944
  {
4885
4945
  "aria-hidden": "true",
@@ -4911,7 +4971,7 @@ var FilterToolbar = React26.forwardRef(
4911
4971
  "data-slot": "filter-toolbar-row",
4912
4972
  className: "flex min-h-[32px] w-full flex-wrap items-center justify-start gap-x-[var(--space-2)] gap-y-[var(--space-2)]",
4913
4973
  children: [
4914
- search ? /* @__PURE__ */ jsx29(
4974
+ search ? /* @__PURE__ */ jsx30(
4915
4975
  "div",
4916
4976
  {
4917
4977
  "data-slot": "filter-toolbar-search",
@@ -4921,7 +4981,7 @@ var FilterToolbar = React26.forwardRef(
4921
4981
  ) : null,
4922
4982
  collapsible && usesSheet ? collapseTrigger : null,
4923
4983
  collapsible && !usesSheet ? /* @__PURE__ */ jsxs28(Popover, { open: overlayOpen, onOpenChange: handleOverlayOpenChange, children: [
4924
- /* @__PURE__ */ jsx29(PopoverAnchor, { asChild: true, children: collapseTrigger }),
4984
+ /* @__PURE__ */ jsx30(PopoverAnchor, { asChild: true, children: collapseTrigger }),
4925
4985
  overlayOpen ? /* @__PURE__ */ jsxs28(
4926
4986
  PopoverContent,
4927
4987
  {
@@ -4931,14 +4991,14 @@ var FilterToolbar = React26.forwardRef(
4931
4991
  align: "start",
4932
4992
  className: "w-[320px]",
4933
4993
  children: [
4934
- /* @__PURE__ */ jsx29("div", { className: "mb-[var(--space-3)] text-sm font-semibold", children: "\uD544\uD130" }),
4994
+ /* @__PURE__ */ jsx30("div", { className: "mb-[var(--space-3)] text-sm font-semibold", children: "\uD544\uD130" }),
4935
4995
  collapsedContent,
4936
- clearFiltersButton ? /* @__PURE__ */ jsx29("div", { className: "mt-[var(--space-4)] flex justify-end", children: clearFiltersButton }) : null
4996
+ clearFiltersButton ? /* @__PURE__ */ jsx30("div", { className: "mt-[var(--space-4)] flex justify-end", children: clearFiltersButton }) : null
4937
4997
  ]
4938
4998
  }
4939
4999
  ) : null
4940
5000
  ] }) : null,
4941
- filters ? /* @__PURE__ */ jsx29(
5001
+ filters ? /* @__PURE__ */ jsx30(
4942
5002
  "div",
4943
5003
  {
4944
5004
  "data-slot": "filter-toolbar-filters",
@@ -4946,7 +5006,7 @@ var FilterToolbar = React26.forwardRef(
4946
5006
  children: filters
4947
5007
  }
4948
5008
  ) : null,
4949
- collapsible && !overlayOpen ? /* @__PURE__ */ jsx29(
5009
+ collapsible && !overlayOpen ? /* @__PURE__ */ jsx30(
4950
5010
  "div",
4951
5011
  {
4952
5012
  "data-slot": "filter-toolbar-collapsible",
@@ -4960,7 +5020,7 @@ var FilterToolbar = React26.forwardRef(
4960
5020
  ]
4961
5021
  }
4962
5022
  ) : null,
4963
- collapsible && usesSheet && overlayOpen ? /* @__PURE__ */ jsx29(
5023
+ collapsible && usesSheet && overlayOpen ? /* @__PURE__ */ jsx30(
4964
5024
  SheetDrawer,
4965
5025
  {
4966
5026
  open: overlayOpen,
@@ -4982,8 +5042,8 @@ var FilterToolbar = React26.forwardRef(
4982
5042
  "\uAC1C \uC801\uC6A9"
4983
5043
  ] }),
4984
5044
  onClearFilters ? /* @__PURE__ */ jsxs28(Fragment7, { children: [
4985
- /* @__PURE__ */ jsx29("span", { "aria-hidden": "true", children: " \xB7 " }),
4986
- /* @__PURE__ */ jsx29(
5045
+ /* @__PURE__ */ jsx30("span", { "aria-hidden": "true", children: " \xB7 " }),
5046
+ /* @__PURE__ */ jsx30(
4987
5047
  "button",
4988
5048
  {
4989
5049
  type: "button",
@@ -5002,7 +5062,7 @@ var FilterToolbar = React26.forwardRef(
5002
5062
  "data-slot": "filter-toolbar-meta",
5003
5063
  className: "flex min-w-0 flex-wrap items-center justify-end gap-[var(--space-2)]",
5004
5064
  children: [
5005
- resultSummary ? /* @__PURE__ */ jsx29(
5065
+ resultSummary ? /* @__PURE__ */ jsx30(
5006
5066
  "div",
5007
5067
  {
5008
5068
  "data-slot": "filter-toolbar-summary",
@@ -5010,8 +5070,8 @@ var FilterToolbar = React26.forwardRef(
5010
5070
  children: resultSummary
5011
5071
  }
5012
5072
  ) : null,
5013
- clearAction ? /* @__PURE__ */ jsx29("div", { "data-slot": "filter-toolbar-clear", className: "shrink-0", children: clearAction }) : null,
5014
- actions ? /* @__PURE__ */ jsx29(
5073
+ clearAction ? /* @__PURE__ */ jsx30("div", { "data-slot": "filter-toolbar-clear", className: "shrink-0", children: clearAction }) : null,
5074
+ actions ? /* @__PURE__ */ jsx30(
5015
5075
  "div",
5016
5076
  {
5017
5077
  "data-slot": "filter-toolbar-actions",
@@ -5039,7 +5099,7 @@ import * as React27 from "react";
5039
5099
  import { cva as cva11 } from "class-variance-authority";
5040
5100
  import { Check as Check3, Minus } from "lucide-react";
5041
5101
  import { Checkbox as CheckboxPrimitive } from "radix-ui";
5042
- import { jsx as jsx30, jsxs as jsxs29 } from "react/jsx-runtime";
5102
+ import { jsx as jsx31, jsxs as jsxs29 } from "react/jsx-runtime";
5043
5103
  var checkboxFieldVariants = cva11(
5044
5104
  "flex flex-col gap-[var(--space-1)]",
5045
5105
  {
@@ -5207,7 +5267,7 @@ var Checkbox = React27.forwardRef(
5207
5267
  onCheckedChange: handleCheckedChange,
5208
5268
  ...props,
5209
5269
  children: [
5210
- /* @__PURE__ */ jsx30(
5270
+ /* @__PURE__ */ jsx31(
5211
5271
  "span",
5212
5272
  {
5213
5273
  "aria-hidden": "true",
@@ -5216,12 +5276,12 @@ var Checkbox = React27.forwardRef(
5216
5276
  checkboxBoxVariants({ size }),
5217
5277
  checkboxGroupBoxVariants({ appearance })
5218
5278
  ),
5219
- children: /* @__PURE__ */ jsx30(
5279
+ children: /* @__PURE__ */ jsx31(
5220
5280
  CheckboxPrimitive.Indicator,
5221
5281
  {
5222
5282
  "data-slot": "checkbox-indicator",
5223
5283
  className: "flex items-center justify-center",
5224
- children: resolvedChecked === "indeterminate" ? /* @__PURE__ */ jsx30(Minus, { "aria-hidden": "true", size: 14, strokeWidth: 2.5 }) : /* @__PURE__ */ jsx30(Check3, { "aria-hidden": "true", size: 14, strokeWidth: 2.5 })
5284
+ children: resolvedChecked === "indeterminate" ? /* @__PURE__ */ jsx31(Minus, { "aria-hidden": "true", size: 14, strokeWidth: 2.5 }) : /* @__PURE__ */ jsx31(Check3, { "aria-hidden": "true", size: 14, strokeWidth: 2.5 })
5225
5285
  }
5226
5286
  )
5227
5287
  }
@@ -5235,7 +5295,7 @@ var Checkbox = React27.forwardRef(
5235
5295
  className: "text-sm font-medium leading-snug text-foreground group-disabled:text-text-disabled",
5236
5296
  children: [
5237
5297
  labelContent,
5238
- required ? /* @__PURE__ */ jsx30(
5298
+ required ? /* @__PURE__ */ jsx31(
5239
5299
  "span",
5240
5300
  {
5241
5301
  "aria-hidden": "true",
@@ -5247,7 +5307,7 @@ var Checkbox = React27.forwardRef(
5247
5307
  ]
5248
5308
  }
5249
5309
  ),
5250
- error ? /* @__PURE__ */ jsx30(
5310
+ error ? /* @__PURE__ */ jsx31(
5251
5311
  "span",
5252
5312
  {
5253
5313
  id: errorId,
@@ -5256,7 +5316,7 @@ var Checkbox = React27.forwardRef(
5256
5316
  className: "text-xs font-medium leading-normal text-[var(--error)]",
5257
5317
  children: error
5258
5318
  }
5259
- ) : description ? /* @__PURE__ */ jsx30(
5319
+ ) : description ? /* @__PURE__ */ jsx31(
5260
5320
  "span",
5261
5321
  {
5262
5322
  id: descriptionId,
@@ -5283,7 +5343,7 @@ var Checkbox = React27.forwardRef(
5283
5343
  className: checkboxFieldVariants({ fullWidth }),
5284
5344
  children: [
5285
5345
  /* @__PURE__ */ jsxs29("div", { className: "inline-flex items-center gap-[var(--space-3)]", children: [
5286
- /* @__PURE__ */ jsx30(
5346
+ /* @__PURE__ */ jsx31(
5287
5347
  CheckboxPrimitive.Root,
5288
5348
  {
5289
5349
  ref,
@@ -5299,18 +5359,18 @@ var Checkbox = React27.forwardRef(
5299
5359
  className: cn(checkboxRootVariants(), className),
5300
5360
  onCheckedChange: handleCheckedChange,
5301
5361
  ...props,
5302
- children: /* @__PURE__ */ jsx30(
5362
+ children: /* @__PURE__ */ jsx31(
5303
5363
  "span",
5304
5364
  {
5305
5365
  "aria-hidden": "true",
5306
5366
  "data-slot": "checkbox-box",
5307
5367
  className: checkboxBoxVariants({ size }),
5308
- children: /* @__PURE__ */ jsx30(
5368
+ children: /* @__PURE__ */ jsx31(
5309
5369
  CheckboxPrimitive.Indicator,
5310
5370
  {
5311
5371
  "data-slot": "checkbox-indicator",
5312
5372
  className: "flex items-center justify-center",
5313
- children: resolvedChecked === "indeterminate" ? /* @__PURE__ */ jsx30(Minus, { "aria-hidden": "true", size: 14, strokeWidth: 2.5 }) : /* @__PURE__ */ jsx30(Check3, { "aria-hidden": "true", size: 14, strokeWidth: 2.5 })
5373
+ children: resolvedChecked === "indeterminate" ? /* @__PURE__ */ jsx31(Minus, { "aria-hidden": "true", size: 14, strokeWidth: 2.5 }) : /* @__PURE__ */ jsx31(Check3, { "aria-hidden": "true", size: 14, strokeWidth: 2.5 })
5314
5374
  }
5315
5375
  )
5316
5376
  }
@@ -5326,7 +5386,7 @@ var Checkbox = React27.forwardRef(
5326
5386
  className: labelClassName,
5327
5387
  children: [
5328
5388
  labelContent,
5329
- required ? /* @__PURE__ */ jsx30(
5389
+ required ? /* @__PURE__ */ jsx31(
5330
5390
  "span",
5331
5391
  {
5332
5392
  "aria-hidden": "true",
@@ -5339,7 +5399,7 @@ var Checkbox = React27.forwardRef(
5339
5399
  }
5340
5400
  ) : null
5341
5401
  ] }),
5342
- error ? /* @__PURE__ */ jsx30(
5402
+ error ? /* @__PURE__ */ jsx31(
5343
5403
  "p",
5344
5404
  {
5345
5405
  id: errorId,
@@ -5348,7 +5408,7 @@ var Checkbox = React27.forwardRef(
5348
5408
  className: "ml-[32px] text-xs font-medium leading-normal text-[var(--error)]",
5349
5409
  children: error
5350
5410
  }
5351
- ) : description ? /* @__PURE__ */ jsx30(
5411
+ ) : description ? /* @__PURE__ */ jsx31(
5352
5412
  "p",
5353
5413
  {
5354
5414
  id: descriptionId,
@@ -5368,7 +5428,7 @@ var Checkbox = React27.forwardRef(
5368
5428
  Checkbox.displayName = "Checkbox";
5369
5429
 
5370
5430
  // src/components/ui/data-table.tsx
5371
- import { jsx as jsx31, jsxs as jsxs30 } from "react/jsx-runtime";
5431
+ import { jsx as jsx32, jsxs as jsxs30 } from "react/jsx-runtime";
5372
5432
  var dataTableVariants = cva12(
5373
5433
  [
5374
5434
  "relative overflow-hidden rounded-[var(--radius-md)] border border-[var(--border-subtle)]",
@@ -5471,7 +5531,7 @@ function isInteractiveTarget(target) {
5471
5531
  function SortIcon({ sort, columnKey }) {
5472
5532
  const isActive = sort?.key === columnKey;
5473
5533
  if (!isActive) {
5474
- return /* @__PURE__ */ jsx31(
5534
+ return /* @__PURE__ */ jsx32(
5475
5535
  ChevronsUpDown,
5476
5536
  {
5477
5537
  "aria-hidden": "true",
@@ -5483,7 +5543,7 @@ function SortIcon({ sort, columnKey }) {
5483
5543
  );
5484
5544
  }
5485
5545
  const Icon = sort.dir === "asc" ? ChevronUp2 : ChevronDown3;
5486
- return /* @__PURE__ */ jsx31(
5546
+ return /* @__PURE__ */ jsx32(
5487
5547
  Icon,
5488
5548
  {
5489
5549
  "aria-hidden": "true",
@@ -5517,11 +5577,11 @@ function MobileSortControls({
5517
5577
  surfaceClassNames[surface]
5518
5578
  ),
5519
5579
  children: [
5520
- /* @__PURE__ */ jsx31("span", { className: "text-[12px] font-medium text-text-tertiary", children: "\uC815\uB82C" }),
5580
+ /* @__PURE__ */ jsx32("span", { className: "text-[12px] font-medium text-text-tertiary", children: "\uC815\uB82C" }),
5521
5581
  sortableColumns.map((column) => {
5522
5582
  const active = sortBy?.key === column.key;
5523
5583
  const nextSort = getNextSort(sortBy, column.key);
5524
- return /* @__PURE__ */ jsx31(
5584
+ return /* @__PURE__ */ jsx32(
5525
5585
  Button,
5526
5586
  {
5527
5587
  type: "button",
@@ -5532,8 +5592,8 @@ function MobileSortControls({
5532
5592
  className: active ? "border-[var(--border-strong)] bg-[var(--action-selected)] hover:border-[var(--border-strong)] hover:bg-[var(--action-selected)]" : void 0,
5533
5593
  onClick: () => onSortChange?.(column.key, nextSort),
5534
5594
  children: /* @__PURE__ */ jsxs30("span", { className: "inline-flex min-w-0 items-center gap-[var(--space-1)]", children: [
5535
- /* @__PURE__ */ jsx31("span", { className: "truncate", children: column.header }),
5536
- /* @__PURE__ */ jsx31(SortIcon, { sort: sortBy, columnKey: column.key })
5595
+ /* @__PURE__ */ jsx32("span", { className: "truncate", children: column.header }),
5596
+ /* @__PURE__ */ jsx32(SortIcon, { sort: sortBy, columnKey: column.key })
5537
5597
  ] })
5538
5598
  },
5539
5599
  column.key
@@ -5554,7 +5614,7 @@ function SkeletonRows({
5554
5614
  // 로딩 알림은 그 안의 row/cell 안에 둔다 — 종전에는 컨테이너가 role="status"라
5555
5615
  // aria-required-children(Critical)이 났다.
5556
5616
  /* @__PURE__ */ jsxs30("div", { role: "rowgroup", children: [
5557
- /* @__PURE__ */ jsx31("div", { role: "row", children: /* @__PURE__ */ jsx31("div", { role: "cell", "aria-colindex": 1, "aria-label": "\uB370\uC774\uD130 \uB85C\uB4DC \uC911", children: /* @__PURE__ */ jsx31("span", { role: "status", className: "sr-only", children: "\uB370\uC774\uD130 \uB85C\uB4DC \uC911" }) }) }),
5617
+ /* @__PURE__ */ jsx32("div", { role: "row", children: /* @__PURE__ */ jsx32("div", { role: "cell", "aria-colindex": 1, "aria-label": "\uB370\uC774\uD130 \uB85C\uB4DC \uC911", children: /* @__PURE__ */ jsx32("span", { role: "status", className: "sr-only", children: "\uB370\uC774\uD130 \uB85C\uB4DC \uC911" }) }) }),
5558
5618
  Array.from({ length: count }, (_, rowIndex) => /* @__PURE__ */ jsxs30(
5559
5619
  "div",
5560
5620
  {
@@ -5562,8 +5622,8 @@ function SkeletonRows({
5562
5622
  className: "grid min-h-[48px] items-center border-t border-[var(--border-subtle)]",
5563
5623
  style: { gridTemplateColumns },
5564
5624
  children: [
5565
- selectable ? /* @__PURE__ */ jsx31("div", { "aria-hidden": "true", className: "px-[var(--space-4)]" }) : null,
5566
- columns.map((column, columnIndex) => /* @__PURE__ */ jsx31("div", { className: "px-[var(--space-4)] py-[var(--space-2)]", children: /* @__PURE__ */ jsx31(
5625
+ selectable ? /* @__PURE__ */ jsx32("div", { "aria-hidden": "true", className: "px-[var(--space-4)]" }) : null,
5626
+ columns.map((column, columnIndex) => /* @__PURE__ */ jsx32("div", { className: "px-[var(--space-4)] py-[var(--space-2)]", children: /* @__PURE__ */ jsx32(
5567
5627
  "div",
5568
5628
  {
5569
5629
  className: cn(
@@ -5580,7 +5640,7 @@ function SkeletonRows({
5580
5640
  );
5581
5641
  }
5582
5642
  function MobileSkeletonCards({ count }) {
5583
- return /* @__PURE__ */ jsx31(
5643
+ return /* @__PURE__ */ jsx32(
5584
5644
  "div",
5585
5645
  {
5586
5646
  "data-slot": "data-table-mobile-skeleton",
@@ -5593,9 +5653,9 @@ function MobileSkeletonCards({ count }) {
5593
5653
  "data-slot": "data-table-mobile-skeleton-card",
5594
5654
  className: "flex flex-col gap-[var(--space-2)] border-t border-[var(--border-subtle)] px-[var(--space-4)] py-[var(--space-4)]",
5595
5655
  children: [
5596
- /* @__PURE__ */ jsx31("div", { className: "h-[14px] w-[72%] animate-pulse rounded-[var(--radius-sm)] bg-[var(--bg-inset)]" }),
5597
- /* @__PURE__ */ jsx31("div", { className: "h-[12px] w-[56%] animate-pulse rounded-[var(--radius-sm)] bg-[var(--bg-inset)]" }),
5598
- /* @__PURE__ */ jsx31("div", { className: "h-[12px] w-[64%] animate-pulse rounded-[var(--radius-sm)] bg-[var(--bg-inset)]" })
5656
+ /* @__PURE__ */ jsx32("div", { className: "h-[14px] w-[72%] animate-pulse rounded-[var(--radius-sm)] bg-[var(--bg-inset)]" }),
5657
+ /* @__PURE__ */ jsx32("div", { className: "h-[12px] w-[56%] animate-pulse rounded-[var(--radius-sm)] bg-[var(--bg-inset)]" }),
5658
+ /* @__PURE__ */ jsx32("div", { className: "h-[12px] w-[64%] animate-pulse rounded-[var(--radius-sm)] bg-[var(--bg-inset)]" })
5599
5659
  ]
5600
5660
  },
5601
5661
  rowIndex
@@ -5663,7 +5723,7 @@ function DataTableRowView({
5663
5723
  onClick: handlers.onClick,
5664
5724
  onKeyDown: handlers.onKeyDown,
5665
5725
  children: [
5666
- selectable ? /* @__PURE__ */ jsx31("div", { role: "cell", className: "px-[var(--space-4)]", children: /* @__PURE__ */ jsx31(
5726
+ selectable ? /* @__PURE__ */ jsx32("div", { role: "cell", className: "px-[var(--space-4)]", children: /* @__PURE__ */ jsx32(
5667
5727
  Checkbox,
5668
5728
  {
5669
5729
  "aria-label": `${String(row[columns[0]?.key] ?? rowId)} \uD589 \uC120\uD0DD`,
@@ -5678,7 +5738,7 @@ function DataTableRowView({
5678
5738
  columns.map((column, columnIndex) => {
5679
5739
  const align = column.align ?? "left";
5680
5740
  const content = getRenderedCell(row, column);
5681
- return /* @__PURE__ */ jsx31(
5741
+ return /* @__PURE__ */ jsx32(
5682
5742
  "div",
5683
5743
  {
5684
5744
  "data-slot": "data-table-cell",
@@ -5689,7 +5749,7 @@ function DataTableRowView({
5689
5749
  column.tabular ? "font-[family-name:var(--font-display)] tabular-nums" : null,
5690
5750
  align === "right" ? "text-text-tertiary" : null
5691
5751
  ),
5692
- children: /* @__PURE__ */ jsx31("span", { className: "min-w-0 truncate", children: linked && columnIndex === 0 && LinkComponent ? /* @__PURE__ */ jsx31(LinkComponent, { href, "data-slot": "data-table-row-link", className: rowLinkClass, children: content }) : content })
5752
+ children: /* @__PURE__ */ jsx32("span", { className: "min-w-0 truncate", children: linked && columnIndex === 0 && LinkComponent ? /* @__PURE__ */ jsx32(LinkComponent, { href, "data-slot": "data-table-row-link", className: rowLinkClass, children: content }) : content })
5693
5753
  },
5694
5754
  column.key
5695
5755
  );
@@ -5744,7 +5804,7 @@ function DataTableMobileCardView({
5744
5804
  onKeyDown: handlers.onKeyDown,
5745
5805
  children: [
5746
5806
  /* @__PURE__ */ jsxs30("div", { className: "flex min-w-0 items-start gap-[var(--space-3)]", children: [
5747
- selectable ? /* @__PURE__ */ jsx31("div", { "data-slot": "data-table-mobile-card-select", className: "shrink-0 pt-[2px]", children: /* @__PURE__ */ jsx31(
5807
+ selectable ? /* @__PURE__ */ jsx32("div", { "data-slot": "data-table-mobile-card-select", className: "shrink-0 pt-[2px]", children: /* @__PURE__ */ jsx32(
5748
5808
  Checkbox,
5749
5809
  {
5750
5810
  "aria-label": `${primaryText} \uBAA8\uBC14\uC77C \uCE74\uB4DC \uC120\uD0DD`,
@@ -5756,16 +5816,16 @@ function DataTableMobileCardView({
5756
5816
  ] })
5757
5817
  }
5758
5818
  ) }) : null,
5759
- /* @__PURE__ */ jsx31(
5819
+ /* @__PURE__ */ jsx32(
5760
5820
  "div",
5761
5821
  {
5762
5822
  "data-slot": "data-table-mobile-card-primary",
5763
5823
  className: "min-w-0 flex-1 font-medium text-foreground",
5764
- children: linked && LinkComponent ? /* @__PURE__ */ jsx31(LinkComponent, { href, "data-slot": "data-table-row-link", className: rowLinkClass, children: primaryContent }) : primaryContent
5824
+ children: linked && LinkComponent ? /* @__PURE__ */ jsx32(LinkComponent, { href, "data-slot": "data-table-row-link", className: rowLinkClass, children: primaryContent }) : primaryContent
5765
5825
  }
5766
5826
  )
5767
5827
  ] }),
5768
- secondaryColumns.length > 0 ? /* @__PURE__ */ jsx31("dl", { className: "grid min-w-0 gap-[var(--space-2)]", children: secondaryColumns.map((column) => {
5828
+ secondaryColumns.length > 0 ? /* @__PURE__ */ jsx32("dl", { className: "grid min-w-0 gap-[var(--space-2)]", children: secondaryColumns.map((column) => {
5769
5829
  const align = column.align ?? "left";
5770
5830
  return /* @__PURE__ */ jsxs30(
5771
5831
  "div",
@@ -5773,8 +5833,8 @@ function DataTableMobileCardView({
5773
5833
  "data-slot": "data-table-mobile-card-field",
5774
5834
  className: "grid min-w-0 grid-cols-[minmax(0,0.42fr)_minmax(0,1fr)] gap-[var(--space-2)] text-[12px] leading-snug",
5775
5835
  children: [
5776
- /* @__PURE__ */ jsx31("dt", { className: "min-w-0 text-text-tertiary", children: /* @__PURE__ */ jsx31("span", { className: "truncate", children: column.header }) }),
5777
- /* @__PURE__ */ jsx31(
5836
+ /* @__PURE__ */ jsx32("dt", { className: "min-w-0 text-text-tertiary", children: /* @__PURE__ */ jsx32("span", { className: "truncate", children: column.header }) }),
5837
+ /* @__PURE__ */ jsx32(
5778
5838
  "dd",
5779
5839
  {
5780
5840
  className: cn(
@@ -5782,7 +5842,7 @@ function DataTableMobileCardView({
5782
5842
  alignmentClass[align],
5783
5843
  column.tabular ? "font-[family-name:var(--font-display)] tabular-nums" : null
5784
5844
  ),
5785
- children: /* @__PURE__ */ jsx31("span", { className: "min-w-0 truncate", children: getRenderedCell(row, column) })
5845
+ children: /* @__PURE__ */ jsx32("span", { className: "min-w-0 truncate", children: getRenderedCell(row, column) })
5786
5846
  }
5787
5847
  )
5788
5848
  ]
@@ -6073,7 +6133,7 @@ function DataTableInner({
6073
6133
  ),
6074
6134
  ...props,
6075
6135
  children: [
6076
- selectable && announceSelection ? /* @__PURE__ */ jsx31(
6136
+ selectable && announceSelection ? /* @__PURE__ */ jsx32(
6077
6137
  "div",
6078
6138
  {
6079
6139
  "data-slot": "data-table-selection-status",
@@ -6082,16 +6142,16 @@ function DataTableInner({
6082
6142
  children: selectedCount > 0 ? `${selectedCount.toLocaleString("ko-KR")}${selectionUnit} \uC120\uD0DD\uB428` : ""
6083
6143
  }
6084
6144
  ) : null,
6085
- loading && data.length > 0 ? /* @__PURE__ */ jsx31(
6145
+ loading && data.length > 0 ? /* @__PURE__ */ jsx32(
6086
6146
  "div",
6087
6147
  {
6088
6148
  "data-slot": "data-table-progress",
6089
6149
  "aria-hidden": "true",
6090
6150
  className: "absolute left-0 right-0 top-0 z-10 h-[2px] overflow-hidden bg-[var(--action-selected)]",
6091
- children: /* @__PURE__ */ jsx31("div", { className: "h-full w-1/3 animate-pulse bg-[var(--primary)]" })
6151
+ children: /* @__PURE__ */ jsx32("div", { className: "h-full w-1/3 animate-pulse bg-[var(--primary)]" })
6092
6152
  }
6093
6153
  ) : null,
6094
- /* @__PURE__ */ jsx31("div", { ref: desktopRef, "data-slot": "data-table-desktop", className: "max-md:hidden md:block", children: /* @__PURE__ */ jsxs30(
6154
+ /* @__PURE__ */ jsx32("div", { ref: desktopRef, "data-slot": "data-table-desktop", className: "max-md:hidden md:block", children: /* @__PURE__ */ jsxs30(
6095
6155
  "div",
6096
6156
  {
6097
6157
  role: "table",
@@ -6113,20 +6173,20 @@ function DataTableInner({
6113
6173
  ),
6114
6174
  style: { gridTemplateColumns },
6115
6175
  children: [
6116
- selectable ? /* @__PURE__ */ jsx31("div", { role: "columnheader", className: "px-[var(--space-4)]", children: /* @__PURE__ */ jsx31(
6176
+ selectable ? /* @__PURE__ */ jsx32("div", { role: "columnheader", className: "px-[var(--space-4)]", children: /* @__PURE__ */ jsx32(
6117
6177
  Checkbox,
6118
6178
  {
6119
6179
  "aria-label": "\uC804\uCCB4 \uD589 \uC120\uD0DD",
6120
6180
  checked: partiallySelected ? "indeterminate" : allVisibleRowsSelected,
6121
6181
  onCheckedChange: (nextChecked) => toggleAllRows(nextChecked === true),
6122
- children: /* @__PURE__ */ jsx31("span", { className: "sr-only", children: "\uC804\uCCB4 \uD589 \uC120\uD0DD" })
6182
+ children: /* @__PURE__ */ jsx32("span", { className: "sr-only", children: "\uC804\uCCB4 \uD589 \uC120\uD0DD" })
6123
6183
  }
6124
6184
  ) }) : null,
6125
6185
  columns.map((column) => {
6126
6186
  const align = column.align ?? "left";
6127
6187
  const nextSort = getNextSort(sortBy, column.key);
6128
6188
  const ariaSort = sortBy?.key === column.key ? sortBy.dir === "asc" ? "ascending" : "descending" : void 0;
6129
- return /* @__PURE__ */ jsx31(
6189
+ return /* @__PURE__ */ jsx32(
6130
6190
  "div",
6131
6191
  {
6132
6192
  role: "columnheader",
@@ -6146,11 +6206,11 @@ function DataTableInner({
6146
6206
  ),
6147
6207
  onClick: () => onSortChange?.(column.key, nextSort),
6148
6208
  children: [
6149
- /* @__PURE__ */ jsx31("span", { className: "truncate", children: column.header }),
6150
- /* @__PURE__ */ jsx31(SortIcon, { sort: sortBy, columnKey: column.key })
6209
+ /* @__PURE__ */ jsx32("span", { className: "truncate", children: column.header }),
6210
+ /* @__PURE__ */ jsx32(SortIcon, { sort: sortBy, columnKey: column.key })
6151
6211
  ]
6152
6212
  }
6153
- ) : /* @__PURE__ */ jsx31("span", { className: "truncate", children: column.header })
6213
+ ) : /* @__PURE__ */ jsx32("span", { className: "truncate", children: column.header })
6154
6214
  },
6155
6215
  column.key
6156
6216
  );
@@ -6158,7 +6218,7 @@ function DataTableInner({
6158
6218
  ]
6159
6219
  }
6160
6220
  ),
6161
- loading && data.length === 0 ? /* @__PURE__ */ jsx31(
6221
+ loading && data.length === 0 ? /* @__PURE__ */ jsx32(
6162
6222
  SkeletonRows,
6163
6223
  {
6164
6224
  columns,
@@ -6169,7 +6229,7 @@ function DataTableInner({
6169
6229
  ) : data.length === 0 ? (
6170
6230
  /* role="table" 직계 자식은 row/rowgroup이어야 한다. data-slot과 테두리는
6171
6231
  그대로 유지해 시각 계약을 깨지 않는다(빈 상태에서도 표가 테두리를 그린다). */
6172
- /* @__PURE__ */ jsx31("div", { role: "rowgroup", children: /* @__PURE__ */ jsx31("div", { role: "row", children: /* @__PURE__ */ jsx31(
6232
+ /* @__PURE__ */ jsx32("div", { role: "rowgroup", children: /* @__PURE__ */ jsx32("div", { role: "row", children: /* @__PURE__ */ jsx32(
6173
6233
  "div",
6174
6234
  {
6175
6235
  role: "cell",
@@ -6179,9 +6239,9 @@ function DataTableInner({
6179
6239
  children: emptyState
6180
6240
  }
6181
6241
  ) }) })
6182
- ) : /* @__PURE__ */ jsx31("div", { ref: desktopListRef, role: "rowgroup", style: desktopSlice.style, children: desktopSlice.rows.map((row, index) => {
6242
+ ) : /* @__PURE__ */ jsx32("div", { ref: desktopListRef, role: "rowgroup", style: desktopSlice.style, children: desktopSlice.rows.map((row, index) => {
6183
6243
  const itemProps = getItemProps(row);
6184
- return /* @__PURE__ */ jsx31(
6244
+ return /* @__PURE__ */ jsx32(
6185
6245
  RowComponent,
6186
6246
  {
6187
6247
  ...itemProps,
@@ -6194,7 +6254,7 @@ function DataTableInner({
6194
6254
  ]
6195
6255
  }
6196
6256
  ) }),
6197
- /* @__PURE__ */ jsx31(
6257
+ /* @__PURE__ */ jsx32(
6198
6258
  MobileSortControls,
6199
6259
  {
6200
6260
  columns,
@@ -6204,14 +6264,14 @@ function DataTableInner({
6204
6264
  surface
6205
6265
  }
6206
6266
  ),
6207
- loading && data.length === 0 ? /* @__PURE__ */ jsx31(MobileSkeletonCards, { count: skeletonRowCount }) : data.length === 0 ? /* @__PURE__ */ jsx31(
6267
+ loading && data.length === 0 ? /* @__PURE__ */ jsx32(MobileSkeletonCards, { count: skeletonRowCount }) : data.length === 0 ? /* @__PURE__ */ jsx32(
6208
6268
  "div",
6209
6269
  {
6210
6270
  "data-slot": "data-table-mobile-empty",
6211
6271
  className: "border-t border-[var(--border-subtle)] p-[var(--space-4)] md:hidden",
6212
6272
  children: emptyState
6213
6273
  }
6214
- ) : /* @__PURE__ */ jsx31(
6274
+ ) : /* @__PURE__ */ jsx32(
6215
6275
  "div",
6216
6276
  {
6217
6277
  ref: mobileListRef,
@@ -6222,7 +6282,7 @@ function DataTableInner({
6222
6282
  style: mobileSlice.style,
6223
6283
  children: mobileSlice.rows.map((row, index) => {
6224
6284
  const itemProps = getItemProps(row);
6225
- return /* @__PURE__ */ jsx31(
6285
+ return /* @__PURE__ */ jsx32(
6226
6286
  CardComponent,
6227
6287
  {
6228
6288
  ...itemProps,
@@ -6244,21 +6304,21 @@ DataTable.displayName = "DataTable";
6244
6304
  // src/components/ui/dropdown-menu.tsx
6245
6305
  import { CheckIcon, ChevronRightIcon, CircleIcon } from "lucide-react";
6246
6306
  import { DropdownMenu as DropdownMenuPrimitive } from "radix-ui";
6247
- import { jsx as jsx32, jsxs as jsxs31 } from "react/jsx-runtime";
6307
+ import { jsx as jsx33, jsxs as jsxs31 } from "react/jsx-runtime";
6248
6308
  function DropdownMenu({
6249
6309
  ...props
6250
6310
  }) {
6251
- return /* @__PURE__ */ jsx32(DropdownMenuPrimitive.Root, { "data-slot": "dropdown-menu", ...props });
6311
+ return /* @__PURE__ */ jsx33(DropdownMenuPrimitive.Root, { "data-slot": "dropdown-menu", ...props });
6252
6312
  }
6253
6313
  function DropdownMenuPortal({
6254
6314
  ...props
6255
6315
  }) {
6256
- return /* @__PURE__ */ jsx32(DropdownMenuPrimitive.Portal, { "data-slot": "dropdown-menu-portal", ...props });
6316
+ return /* @__PURE__ */ jsx33(DropdownMenuPrimitive.Portal, { "data-slot": "dropdown-menu-portal", ...props });
6257
6317
  }
6258
6318
  function DropdownMenuTrigger({
6259
6319
  ...props
6260
6320
  }) {
6261
- return /* @__PURE__ */ jsx32(
6321
+ return /* @__PURE__ */ jsx33(
6262
6322
  DropdownMenuPrimitive.Trigger,
6263
6323
  {
6264
6324
  "data-slot": "dropdown-menu-trigger",
@@ -6271,7 +6331,7 @@ function DropdownMenuContent({
6271
6331
  sideOffset = 4,
6272
6332
  ...props
6273
6333
  }) {
6274
- return /* @__PURE__ */ jsx32(DropdownMenuPrimitive.Portal, { children: /* @__PURE__ */ jsx32(
6334
+ return /* @__PURE__ */ jsx33(DropdownMenuPrimitive.Portal, { children: /* @__PURE__ */ jsx33(
6275
6335
  DropdownMenuPrimitive.Content,
6276
6336
  {
6277
6337
  "data-slot": "dropdown-menu-content",
@@ -6294,7 +6354,7 @@ function DropdownMenuContent({
6294
6354
  function DropdownMenuGroup({
6295
6355
  ...props
6296
6356
  }) {
6297
- return /* @__PURE__ */ jsx32(DropdownMenuPrimitive.Group, { "data-slot": "dropdown-menu-group", ...props });
6357
+ return /* @__PURE__ */ jsx33(DropdownMenuPrimitive.Group, { "data-slot": "dropdown-menu-group", ...props });
6298
6358
  }
6299
6359
  function DropdownMenuItem({
6300
6360
  className,
@@ -6302,7 +6362,7 @@ function DropdownMenuItem({
6302
6362
  variant = "default",
6303
6363
  ...props
6304
6364
  }) {
6305
- return /* @__PURE__ */ jsx32(
6365
+ return /* @__PURE__ */ jsx33(
6306
6366
  DropdownMenuPrimitive.Item,
6307
6367
  {
6308
6368
  "data-slot": "dropdown-menu-item",
@@ -6345,7 +6405,7 @@ function DropdownMenuCheckboxItem({
6345
6405
  checked,
6346
6406
  ...props,
6347
6407
  children: [
6348
- /* @__PURE__ */ jsx32("span", { className: "pointer-events-none absolute left-2 flex h-3.5 w-3.5 items-center justify-center", children: /* @__PURE__ */ jsx32(DropdownMenuPrimitive.ItemIndicator, { children: /* @__PURE__ */ jsx32(CheckIcon, { size: 16 }) }) }),
6408
+ /* @__PURE__ */ jsx33("span", { className: "pointer-events-none absolute left-2 flex h-3.5 w-3.5 items-center justify-center", children: /* @__PURE__ */ jsx33(DropdownMenuPrimitive.ItemIndicator, { children: /* @__PURE__ */ jsx33(CheckIcon, { size: 16 }) }) }),
6349
6409
  children
6350
6410
  ]
6351
6411
  }
@@ -6354,7 +6414,7 @@ function DropdownMenuCheckboxItem({
6354
6414
  function DropdownMenuRadioGroup({
6355
6415
  ...props
6356
6416
  }) {
6357
- return /* @__PURE__ */ jsx32(
6417
+ return /* @__PURE__ */ jsx33(
6358
6418
  DropdownMenuPrimitive.RadioGroup,
6359
6419
  {
6360
6420
  "data-slot": "dropdown-menu-radio-group",
@@ -6382,7 +6442,7 @@ function DropdownMenuRadioItem({
6382
6442
  ),
6383
6443
  ...props,
6384
6444
  children: [
6385
- /* @__PURE__ */ jsx32("span", { className: "pointer-events-none absolute left-2 flex h-3.5 w-3.5 items-center justify-center", children: /* @__PURE__ */ jsx32(DropdownMenuPrimitive.ItemIndicator, { children: /* @__PURE__ */ jsx32(CircleIcon, { size: 8, className: "fill-current" }) }) }),
6445
+ /* @__PURE__ */ jsx33("span", { className: "pointer-events-none absolute left-2 flex h-3.5 w-3.5 items-center justify-center", children: /* @__PURE__ */ jsx33(DropdownMenuPrimitive.ItemIndicator, { children: /* @__PURE__ */ jsx33(CircleIcon, { size: 8, className: "fill-current" }) }) }),
6386
6446
  children
6387
6447
  ]
6388
6448
  }
@@ -6393,7 +6453,7 @@ function DropdownMenuLabel({
6393
6453
  inset,
6394
6454
  ...props
6395
6455
  }) {
6396
- return /* @__PURE__ */ jsx32(
6456
+ return /* @__PURE__ */ jsx33(
6397
6457
  DropdownMenuPrimitive.Label,
6398
6458
  {
6399
6459
  "data-slot": "dropdown-menu-label",
@@ -6410,7 +6470,7 @@ function DropdownMenuSeparator({
6410
6470
  className,
6411
6471
  ...props
6412
6472
  }) {
6413
- return /* @__PURE__ */ jsx32(
6473
+ return /* @__PURE__ */ jsx33(
6414
6474
  DropdownMenuPrimitive.Separator,
6415
6475
  {
6416
6476
  "data-slot": "dropdown-menu-separator",
@@ -6423,7 +6483,7 @@ function DropdownMenuShortcut({
6423
6483
  className,
6424
6484
  ...props
6425
6485
  }) {
6426
- return /* @__PURE__ */ jsx32(
6486
+ return /* @__PURE__ */ jsx33(
6427
6487
  "span",
6428
6488
  {
6429
6489
  "data-slot": "dropdown-menu-shortcut",
@@ -6438,7 +6498,7 @@ function DropdownMenuShortcut({
6438
6498
  function DropdownMenuSub({
6439
6499
  ...props
6440
6500
  }) {
6441
- return /* @__PURE__ */ jsx32(DropdownMenuPrimitive.Sub, { "data-slot": "dropdown-menu-sub", ...props });
6501
+ return /* @__PURE__ */ jsx33(DropdownMenuPrimitive.Sub, { "data-slot": "dropdown-menu-sub", ...props });
6442
6502
  }
6443
6503
  function DropdownMenuSubTrigger({
6444
6504
  className,
@@ -6463,7 +6523,7 @@ function DropdownMenuSubTrigger({
6463
6523
  ...props,
6464
6524
  children: [
6465
6525
  children,
6466
- /* @__PURE__ */ jsx32(ChevronRightIcon, { className: "ml-auto", size: 16 })
6526
+ /* @__PURE__ */ jsx33(ChevronRightIcon, { className: "ml-auto", size: 16 })
6467
6527
  ]
6468
6528
  }
6469
6529
  );
@@ -6472,7 +6532,7 @@ function DropdownMenuSubContent({
6472
6532
  className,
6473
6533
  ...props
6474
6534
  }) {
6475
- return /* @__PURE__ */ jsx32(
6535
+ return /* @__PURE__ */ jsx33(
6476
6536
  DropdownMenuPrimitive.SubContent,
6477
6537
  {
6478
6538
  "data-slot": "dropdown-menu-sub-content",
@@ -6492,7 +6552,7 @@ function DropdownMenuSubContent({
6492
6552
  }
6493
6553
 
6494
6554
  // src/components/ui/context-menu.tsx
6495
- import { jsx as jsx33, jsxs as jsxs32 } from "react/jsx-runtime";
6555
+ import { jsx as jsx34, jsxs as jsxs32 } from "react/jsx-runtime";
6496
6556
  function ContextMenu({
6497
6557
  open,
6498
6558
  onOpenChange,
@@ -6504,7 +6564,7 @@ function ContextMenu({
6504
6564
  return null;
6505
6565
  }
6506
6566
  return /* @__PURE__ */ jsxs32(DropdownMenu, { open, onOpenChange, modal: false, children: [
6507
- /* @__PURE__ */ jsx33(DropdownMenuTrigger, { asChild: true, children: /* @__PURE__ */ jsx33(
6567
+ /* @__PURE__ */ jsx34(DropdownMenuTrigger, { asChild: true, children: /* @__PURE__ */ jsx34(
6508
6568
  "span",
6509
6569
  {
6510
6570
  "aria-hidden": "true",
@@ -6518,14 +6578,14 @@ function ContextMenu({
6518
6578
  }
6519
6579
  }
6520
6580
  ) }),
6521
- /* @__PURE__ */ jsx33(DropdownMenuContent, { ...contentProps, children })
6581
+ /* @__PURE__ */ jsx34(DropdownMenuContent, { ...contentProps, children })
6522
6582
  ] });
6523
6583
  }
6524
6584
 
6525
6585
  // src/components/ui/bulk-action-bar.tsx
6526
6586
  import * as React29 from "react";
6527
6587
  import { X as X3 } from "lucide-react";
6528
- import { jsx as jsx34, jsxs as jsxs33 } from "react/jsx-runtime";
6588
+ import { jsx as jsx35, jsxs as jsxs33 } from "react/jsx-runtime";
6529
6589
  function ActionButton({ action }) {
6530
6590
  const danger = action.variant === "destructive";
6531
6591
  const off = action.disabled;
@@ -6557,7 +6617,7 @@ function ActionButton({ action }) {
6557
6617
  whiteSpace: "nowrap"
6558
6618
  },
6559
6619
  children: [
6560
- Icon ? /* @__PURE__ */ jsx34(
6620
+ Icon ? /* @__PURE__ */ jsx35(
6561
6621
  Icon,
6562
6622
  {
6563
6623
  "aria-hidden": "true",
@@ -6572,7 +6632,7 @@ function ActionButton({ action }) {
6572
6632
  );
6573
6633
  }
6574
6634
  function Divider() {
6575
- return /* @__PURE__ */ jsx34(
6635
+ return /* @__PURE__ */ jsx35(
6576
6636
  "span",
6577
6637
  {
6578
6638
  "aria-hidden": "true",
@@ -6587,7 +6647,7 @@ function Divider() {
6587
6647
  );
6588
6648
  }
6589
6649
  function ClearButton({ onClear }) {
6590
- return /* @__PURE__ */ jsx34(
6650
+ return /* @__PURE__ */ jsx35(
6591
6651
  "button",
6592
6652
  {
6593
6653
  type: "button",
@@ -6609,7 +6669,7 @@ function ClearButton({ onClear }) {
6609
6669
  justifyContent: "center",
6610
6670
  borderRadius: "var(--radius-md)"
6611
6671
  },
6612
- children: /* @__PURE__ */ jsx34(X3, { size: 16, strokeWidth: 1.75, "aria-hidden": "true" })
6672
+ children: /* @__PURE__ */ jsx35(X3, { size: 16, strokeWidth: 1.75, "aria-hidden": "true" })
6613
6673
  }
6614
6674
  );
6615
6675
  }
@@ -6701,7 +6761,7 @@ function BulkActionBar({
6701
6761
  ...props
6702
6762
  }) {
6703
6763
  const inline = placement === "inline";
6704
- const trailingSlot = trailing !== void 0 && trailing !== null ? /* @__PURE__ */ jsx34(
6764
+ const trailingSlot = trailing !== void 0 && trailing !== null ? /* @__PURE__ */ jsx35(
6705
6765
  "div",
6706
6766
  {
6707
6767
  "data-slot": "bulk-action-bar-trailing",
@@ -6730,7 +6790,7 @@ function BulkActionBar({
6730
6790
  style: { ...idleLineStyle, overflow: "visible", ...style },
6731
6791
  ...props,
6732
6792
  children: [
6733
- /* @__PURE__ */ jsx34(
6793
+ /* @__PURE__ */ jsx35(
6734
6794
  "div",
6735
6795
  {
6736
6796
  role: "status",
@@ -6752,7 +6812,7 @@ function BulkActionBar({
6752
6812
  );
6753
6813
  }
6754
6814
  if (count === 0 && idleContent !== void 0) {
6755
- return /* @__PURE__ */ jsx34(
6815
+ return /* @__PURE__ */ jsx35(
6756
6816
  "div",
6757
6817
  {
6758
6818
  role: "status",
@@ -6769,7 +6829,7 @@ function BulkActionBar({
6769
6829
  if (count === 0 && emptyHint === void 0) {
6770
6830
  return null;
6771
6831
  }
6772
- const countLabel = /* @__PURE__ */ jsx34(
6832
+ const countLabel = /* @__PURE__ */ jsx35(
6773
6833
  "span",
6774
6834
  {
6775
6835
  "data-slot": "bulk-action-bar-count",
@@ -6786,7 +6846,7 @@ function BulkActionBar({
6786
6846
  children: count > 0 ? `${count.toLocaleString("ko-KR")}${unit} \uC120\uD0DD\uB428` : emptyHint
6787
6847
  }
6788
6848
  );
6789
- const summarySlot = summary !== void 0 && summary !== null ? /* @__PURE__ */ jsx34(
6849
+ const summarySlot = summary !== void 0 && summary !== null ? /* @__PURE__ */ jsx35(
6790
6850
  "span",
6791
6851
  {
6792
6852
  ref: setSummaryElement,
@@ -6820,7 +6880,7 @@ function BulkActionBar({
6820
6880
  children: compact ? compactSummary : summary
6821
6881
  }
6822
6882
  ) : null;
6823
- const actionGroup = /* @__PURE__ */ jsx34(
6883
+ const actionGroup = /* @__PURE__ */ jsx35(
6824
6884
  "div",
6825
6885
  {
6826
6886
  "data-slot": "bulk-action-bar-actions",
@@ -6832,7 +6892,7 @@ function BulkActionBar({
6832
6892
  justifyContent: "flex-end",
6833
6893
  gap: 2
6834
6894
  },
6835
- children: actions.map((action) => /* @__PURE__ */ jsx34(ActionButton, { action }, action.key))
6895
+ children: actions.map((action) => /* @__PURE__ */ jsx35(ActionButton, { action }, action.key))
6836
6896
  }
6837
6897
  );
6838
6898
  if (inline) {
@@ -6876,10 +6936,10 @@ function BulkActionBar({
6876
6936
  gap: "var(--space-1)"
6877
6937
  },
6878
6938
  children: [
6879
- count > 0 && actions.length > 0 ? /* @__PURE__ */ jsx34(Divider, {}) : null,
6939
+ count > 0 && actions.length > 0 ? /* @__PURE__ */ jsx35(Divider, {}) : null,
6880
6940
  actionGroup,
6881
- /* @__PURE__ */ jsx34(Divider, {}),
6882
- /* @__PURE__ */ jsx34(ClearButton, { onClear })
6941
+ /* @__PURE__ */ jsx35(Divider, {}),
6942
+ /* @__PURE__ */ jsx35(ClearButton, { onClear })
6883
6943
  ]
6884
6944
  }
6885
6945
  ),
@@ -6920,10 +6980,10 @@ function BulkActionBar({
6920
6980
  ]
6921
6981
  }
6922
6982
  ),
6923
- count > 0 && actions.length > 0 ? /* @__PURE__ */ jsx34(Divider, {}) : null,
6983
+ count > 0 && actions.length > 0 ? /* @__PURE__ */ jsx35(Divider, {}) : null,
6924
6984
  actionGroup,
6925
- /* @__PURE__ */ jsx34(Divider, {}),
6926
- /* @__PURE__ */ jsx34(ClearButton, { onClear }),
6985
+ /* @__PURE__ */ jsx35(Divider, {}),
6986
+ /* @__PURE__ */ jsx35(ClearButton, { onClear }),
6927
6987
  trailingSlot
6928
6988
  ]
6929
6989
  }
@@ -6931,29 +6991,11 @@ function BulkActionBar({
6931
6991
  }
6932
6992
 
6933
6993
  // src/components/ui/confirm-dialog.tsx
6934
- import * as React30 from "react";
6935
- import { Fragment as Fragment8, jsx as jsx35, jsxs as jsxs34 } from "react/jsx-runtime";
6936
- var confirmDialogContentClassName = cn(
6937
- "fixed left-1/2 top-1/2 z-[var(--z-modal)]",
6938
- "-translate-x-1/2 -translate-y-1/2",
6939
- "w-[calc(100vw-2rem)] max-w-[420px]",
6940
- "flex flex-col gap-[var(--space-6)]",
6941
- "bg-[var(--bg-surface)] border border-[var(--border)]",
6942
- "rounded-[var(--radius-lg)] p-[var(--space-6)] shadow-[var(--shadow-4)]",
6943
- "text-foreground"
6944
- );
6945
- var confirmDialogTitleClassName = cn(
6946
- "text-[18px] font-bold leading-snug text-foreground"
6947
- );
6948
- var confirmDialogDescriptionClassName = cn(
6949
- "break-keep text-[14px] leading-relaxed text-text-secondary"
6950
- );
6951
- var confirmDialogBodyClassName = "min-w-0 text-[14px] leading-relaxed text-text-secondary";
6952
- var confirmDialogFooterClassName = "flex items-center justify-end gap-[var(--space-3)]";
6994
+ import { Fragment as Fragment8, jsx as jsx36, jsxs as jsxs34 } from "react/jsx-runtime";
6953
6995
  function ConfirmDialog({
6954
6996
  open,
6955
6997
  onOpenChange,
6956
- title,
6998
+ title: title2,
6957
6999
  description,
6958
7000
  tone = "default",
6959
7001
  confirmLabel,
@@ -6964,71 +7006,51 @@ function ConfirmDialog({
6964
7006
  confirmDisabled = false,
6965
7007
  mobilePresentation = "center"
6966
7008
  }) {
6967
- const [pending, setPending] = React30.useState(false);
6968
- const busyRef = React30.useRef(false);
6969
- const isBusy = loading || pending;
6970
7009
  const returnFocus = useReturnFocus();
6971
- const handleOpenChange = React30.useCallback(
6972
- (nextOpen) => {
6973
- if (!nextOpen && isBusy) {
6974
- return;
6975
- }
6976
- onOpenChange(nextOpen);
6977
- },
6978
- [isBusy, onOpenChange]
6979
- );
6980
- const handleConfirm = React30.useCallback(async () => {
6981
- if (busyRef.current || loading || confirmDisabled) {
6982
- return;
6983
- }
6984
- busyRef.current = true;
6985
- setPending(true);
6986
- try {
6987
- await onConfirm();
6988
- onOpenChange(false);
6989
- } finally {
6990
- busyRef.current = false;
6991
- setPending(false);
6992
- }
6993
- }, [confirmDisabled, loading, onConfirm, onOpenChange]);
7010
+ const { isBusy, run, guardOpenChange } = useOverlayAction({
7011
+ action: onConfirm,
7012
+ onOpenChange,
7013
+ loading,
7014
+ disabled: confirmDisabled
7015
+ });
6994
7016
  const dialogBody = /* @__PURE__ */ jsxs34(Fragment8, { children: [
6995
- /* @__PURE__ */ jsx35("div", { className: "flex items-start justify-between gap-[var(--space-4)]", children: /* @__PURE__ */ jsxs34("div", { className: "min-w-0 space-y-[var(--space-2)]", children: [
6996
- /* @__PURE__ */ jsx35(
7017
+ /* @__PURE__ */ jsx36("div", { className: "flex items-start justify-between gap-[var(--space-4)]", children: /* @__PURE__ */ jsxs34("div", { className: "min-w-0 space-y-[var(--space-2)]", children: [
7018
+ /* @__PURE__ */ jsx36(
6997
7019
  DialogTitle,
6998
7020
  {
6999
7021
  "data-slot": "dialog-title",
7000
- className: confirmDialogTitleClassName,
7001
- children: title
7022
+ className: presetSurface.confirm.title,
7023
+ children: title2
7002
7024
  }
7003
7025
  ),
7004
- description ? /* @__PURE__ */ jsx35(
7026
+ description ? /* @__PURE__ */ jsx36(
7005
7027
  DialogDescription,
7006
7028
  {
7007
7029
  "data-slot": "dialog-description",
7008
- className: confirmDialogDescriptionClassName,
7030
+ className: presetSurface.confirm.description,
7009
7031
  children: description
7010
7032
  }
7011
7033
  ) : null
7012
7034
  ] }) }),
7013
- children != null ? /* @__PURE__ */ jsx35("div", { "data-slot": "confirm-dialog-body", className: confirmDialogBodyClassName, children }) : null,
7035
+ children != null ? /* @__PURE__ */ jsx36("div", { "data-slot": "confirm-dialog-body", className: presetSurface.confirm.body, children }) : null,
7014
7036
  /* @__PURE__ */ jsxs34(
7015
7037
  "div",
7016
7038
  {
7017
7039
  "data-slot": "dialog-footer",
7018
- className: confirmDialogFooterClassName,
7040
+ className: presetSurface.confirm.footer,
7019
7041
  children: [
7020
- /* @__PURE__ */ jsx35(
7042
+ /* @__PURE__ */ jsx36(
7021
7043
  Button,
7022
7044
  {
7023
7045
  variant: "secondary",
7024
7046
  size: "lg",
7025
7047
  className: footerButtonHitAreaClassName,
7026
7048
  disabled: isBusy,
7027
- onClick: () => handleOpenChange(false),
7049
+ onClick: () => guardOpenChange(false),
7028
7050
  children: cancelLabel
7029
7051
  }
7030
7052
  ),
7031
- /* @__PURE__ */ jsx35(
7053
+ /* @__PURE__ */ jsx36(
7032
7054
  Button,
7033
7055
  {
7034
7056
  variant: tone === "destructive" ? "destructive" : "primary",
@@ -7036,7 +7058,7 @@ function ConfirmDialog({
7036
7058
  className: footerButtonHitAreaClassName,
7037
7059
  loading: isBusy,
7038
7060
  disabled: confirmDisabled,
7039
- onClick: handleConfirm,
7061
+ onClick: run,
7040
7062
  children: confirmLabel
7041
7063
  }
7042
7064
  )
@@ -7044,16 +7066,16 @@ function ConfirmDialog({
7044
7066
  }
7045
7067
  )
7046
7068
  ] });
7047
- return /* @__PURE__ */ jsx35(Dialog, { open, onOpenChange: handleOpenChange, children: /* @__PURE__ */ jsxs34(DialogPortal, { children: [
7048
- /* @__PURE__ */ jsx35(DialogOverlay, {}),
7049
- /* @__PURE__ */ jsx35(
7069
+ return /* @__PURE__ */ jsx36(Dialog, { open, onOpenChange: guardOpenChange, children: /* @__PURE__ */ jsxs34(DialogPortal, { children: [
7070
+ /* @__PURE__ */ jsx36(DialogOverlay, {}),
7071
+ /* @__PURE__ */ jsx36(
7050
7072
  DialogRawContent,
7051
7073
  {
7052
7074
  role: "alertdialog",
7053
7075
  "data-slot": "dialog-content",
7054
7076
  className: cn(
7055
- confirmDialogContentClassName,
7056
- mobilePresentation === "sheet" && dialogMobileSheetClassName
7077
+ presetSurface.confirm.content,
7078
+ mobilePresentation === "sheet" && bottomSheet.dialog
7057
7079
  ),
7058
7080
  style: mobilePresentation === "sheet" ? dialogMobileSheetStyle() : void 0,
7059
7081
  ...returnFocus,
@@ -7065,14 +7087,14 @@ function ConfirmDialog({
7065
7087
 
7066
7088
  // src/components/ui/separator.tsx
7067
7089
  import { Separator as SeparatorPrimitive } from "radix-ui";
7068
- import { jsx as jsx36 } from "react/jsx-runtime";
7090
+ import { jsx as jsx37 } from "react/jsx-runtime";
7069
7091
  function Separator2({
7070
7092
  className,
7071
7093
  orientation = "horizontal",
7072
7094
  decorative = true,
7073
7095
  ...props
7074
7096
  }) {
7075
- return /* @__PURE__ */ jsx36(
7097
+ return /* @__PURE__ */ jsx37(
7076
7098
  SeparatorPrimitive.Root,
7077
7099
  {
7078
7100
  "data-slot": "separator",
@@ -7089,13 +7111,13 @@ function Separator2({
7089
7111
 
7090
7112
  // src/components/ui/avatar.tsx
7091
7113
  import { Avatar as AvatarPrimitive } from "radix-ui";
7092
- import { jsx as jsx37 } from "react/jsx-runtime";
7114
+ import { jsx as jsx38 } from "react/jsx-runtime";
7093
7115
  function Avatar({
7094
7116
  className,
7095
7117
  size = "md",
7096
7118
  ...props
7097
7119
  }) {
7098
- return /* @__PURE__ */ jsx37(
7120
+ return /* @__PURE__ */ jsx38(
7099
7121
  AvatarPrimitive.Root,
7100
7122
  {
7101
7123
  "data-slot": "avatar",
@@ -7116,7 +7138,7 @@ function AvatarImage({
7116
7138
  className,
7117
7139
  ...props
7118
7140
  }) {
7119
- return /* @__PURE__ */ jsx37(
7141
+ return /* @__PURE__ */ jsx38(
7120
7142
  AvatarPrimitive.Image,
7121
7143
  {
7122
7144
  "data-slot": "avatar-image",
@@ -7141,7 +7163,7 @@ function AvatarFallback({
7141
7163
  ...props
7142
7164
  }) {
7143
7165
  const fallbackText = children ?? (name ? getAvatarFallbackText(name) : null);
7144
- return /* @__PURE__ */ jsx37(
7166
+ return /* @__PURE__ */ jsx38(
7145
7167
  AvatarPrimitive.Fallback,
7146
7168
  {
7147
7169
  "data-slot": "avatar-fallback",
@@ -7159,13 +7181,8 @@ function AvatarFallback({
7159
7181
  }
7160
7182
 
7161
7183
  // src/components/ui/action-sheet.tsx
7162
- import * as React31 from "react";
7163
- import { X as X4 } from "lucide-react";
7164
- import { jsx as jsx38, jsxs as jsxs35 } from "react/jsx-runtime";
7165
- var actionSheetContentClassName = cn(
7166
- "gap-0 max-h-[85dvh] rounded-t-[var(--radius-lg)]",
7167
- "pb-[env(safe-area-inset-bottom)]"
7168
- );
7184
+ import * as React30 from "react";
7185
+ import { jsx as jsx39, jsxs as jsxs35 } from "react/jsx-runtime";
7169
7186
  var actionSheetHeaderClassName = cn(
7170
7187
  "flex items-start gap-[var(--space-3)] px-[var(--space-4)] pt-[var(--space-4)] pb-[var(--space-3)]"
7171
7188
  );
@@ -7187,12 +7204,12 @@ var actionSheetItemClassName = cn(
7187
7204
  function ActionSheet({
7188
7205
  open,
7189
7206
  onOpenChange,
7190
- title,
7207
+ title: title2,
7191
7208
  description,
7192
7209
  items,
7193
7210
  closeLabel = "\uB2EB\uAE30"
7194
7211
  }) {
7195
- const pendingRef = React31.useRef(null);
7212
+ const pendingRef = React30.useRef(null);
7196
7213
  const returnFocus = useReturnFocus();
7197
7214
  const handleOpenChange = (nextOpen) => {
7198
7215
  pendingRef.current = null;
@@ -7208,24 +7225,24 @@ function ActionSheet({
7208
7225
  pendingRef.current = null;
7209
7226
  item?.onSelect();
7210
7227
  };
7211
- return /* @__PURE__ */ jsx38(Sheet, { open, onOpenChange: handleOpenChange, children: /* @__PURE__ */ jsxs35(
7228
+ return /* @__PURE__ */ jsx39(Sheet, { open, onOpenChange: handleOpenChange, children: /* @__PURE__ */ jsxs35(
7212
7229
  SheetContent,
7213
7230
  {
7214
7231
  side: "bottom",
7215
7232
  "data-slot": "action-sheet-content",
7216
- className: actionSheetContentClassName,
7233
+ className: bottomSheet.action,
7217
7234
  onOpenAutoFocus: returnFocus.onOpenAutoFocus,
7218
7235
  onCloseAutoFocus: handleCloseAutoFocus,
7219
7236
  ...description ? {} : { "aria-describedby": void 0 },
7220
7237
  children: [
7221
7238
  /* @__PURE__ */ jsxs35("div", { "data-slot": "action-sheet-header", className: actionSheetHeaderClassName, children: [
7222
7239
  /* @__PURE__ */ jsxs35("div", { className: "min-w-0 flex-1", children: [
7223
- /* @__PURE__ */ jsx38(SheetTitle, { className: actionSheetTitleClassName, children: title }),
7224
- description ? /* @__PURE__ */ jsx38(SheetDescription, { className: actionSheetDescriptionClassName, children: description }) : null
7240
+ /* @__PURE__ */ jsx39(SheetTitle, { className: actionSheetTitleClassName, children: title2 }),
7241
+ description ? /* @__PURE__ */ jsx39(SheetDescription, { className: actionSheetDescriptionClassName, children: description }) : null
7225
7242
  ] }),
7226
- /* @__PURE__ */ jsx38(SheetClose, { asChild: true, children: /* @__PURE__ */ jsx38(IconButton, { size: "sm", icon: X4, "aria-label": closeLabel }) })
7243
+ /* @__PURE__ */ jsx39(OverlayCloseButton, { label: closeLabel })
7227
7244
  ] }),
7228
- /* @__PURE__ */ jsx38("div", { "data-slot": "action-sheet-list", className: actionSheetListClassName, children: items.map((item) => {
7245
+ /* @__PURE__ */ jsx39("div", { "data-slot": "action-sheet-list", className: actionSheetListClassName, children: items.map((item) => {
7229
7246
  const Icon = item.icon;
7230
7247
  return /* @__PURE__ */ jsxs35(
7231
7248
  "button",
@@ -7237,8 +7254,8 @@ function ActionSheet({
7237
7254
  disabled: item.disabled,
7238
7255
  onClick: () => handleSelect(item),
7239
7256
  children: [
7240
- Icon ? /* @__PURE__ */ jsx38(Icon, { "aria-hidden": true, size: 17, strokeWidth: 1.75, className: "shrink-0" }) : null,
7241
- /* @__PURE__ */ jsx38("span", { className: "min-w-0 flex-1 break-keep", children: item.label })
7257
+ Icon ? /* @__PURE__ */ jsx39(Icon, { "aria-hidden": true, size: 17, strokeWidth: 1.75, className: "shrink-0" }) : null,
7258
+ /* @__PURE__ */ jsx39("span", { className: "min-w-0 flex-1 break-keep", children: item.label })
7242
7259
  ]
7243
7260
  },
7244
7261
  item.id
@@ -7250,8 +7267,8 @@ function ActionSheet({
7250
7267
  }
7251
7268
 
7252
7269
  // src/components/ui/badge.tsx
7253
- import * as React32 from "react";
7254
- import { jsx as jsx39, jsxs as jsxs36 } from "react/jsx-runtime";
7270
+ import * as React31 from "react";
7271
+ import { jsx as jsx40, jsxs as jsxs36 } from "react/jsx-runtime";
7255
7272
  var DOT = {
7256
7273
  error: "var(--semantic-error-fg)",
7257
7274
  warning: "var(--semantic-warning-fg)",
@@ -7260,7 +7277,7 @@ var DOT = {
7260
7277
  neutral: "var(--text-tertiary)",
7261
7278
  brand: "var(--accent-pop)"
7262
7279
  };
7263
- var Badge = React32.forwardRef(
7280
+ var Badge = React31.forwardRef(
7264
7281
  ({ tone = "neutral", className, children, ...props }, ref) => /* @__PURE__ */ jsxs36(
7265
7282
  "span",
7266
7283
  {
@@ -7275,7 +7292,7 @@ var Badge = React32.forwardRef(
7275
7292
  ),
7276
7293
  ...props,
7277
7294
  children: [
7278
- /* @__PURE__ */ jsx39(
7295
+ /* @__PURE__ */ jsx40(
7279
7296
  "span",
7280
7297
  {
7281
7298
  "aria-hidden": "true",
@@ -7292,8 +7309,8 @@ var Badge = React32.forwardRef(
7292
7309
  Badge.displayName = "Badge";
7293
7310
 
7294
7311
  // src/components/ui/two-tier-badge.tsx
7295
- import * as React33 from "react";
7296
- import { jsx as jsx40, jsxs as jsxs37 } from "react/jsx-runtime";
7312
+ import * as React32 from "react";
7313
+ import { jsx as jsx41, jsxs as jsxs37 } from "react/jsx-runtime";
7297
7314
  var FG = {
7298
7315
  neutral: "var(--text-secondary)",
7299
7316
  info: "var(--semantic-info-fg)",
@@ -7314,7 +7331,7 @@ var SEGMENT = {
7314
7331
  md: "gap-[7px] py-[var(--space-1)] px-[var(--space-3)] text-[14px]"
7315
7332
  };
7316
7333
  var DOT2 = { xs: 5, sm: 6, md: 7 };
7317
- var TwoTierBadge = React33.forwardRef(
7334
+ var TwoTierBadge = React32.forwardRef(
7318
7335
  ({ primary, secondary, tone = "neutral", emphasis = "subtle", size = "sm", showDot = false, className, style, ...props }, ref) => {
7319
7336
  const strong = emphasis === "strong";
7320
7337
  const fg = FG[tone];
@@ -7344,7 +7361,7 @@ var TwoTierBadge = React33.forwardRef(
7344
7361
  className: cn("inline-flex items-center whitespace-nowrap font-semibold", SEGMENT[size]),
7345
7362
  style: { color: fg, background: strong ? BG[tone] : "transparent" },
7346
7363
  children: [
7347
- showDot ? /* @__PURE__ */ jsx40(
7364
+ showDot ? /* @__PURE__ */ jsx41(
7348
7365
  "span",
7349
7366
  {
7350
7367
  "aria-hidden": "true",
@@ -7359,11 +7376,11 @@ var TwoTierBadge = React33.forwardRef(
7359
7376
  }
7360
7377
  }
7361
7378
  ) : null,
7362
- /* @__PURE__ */ jsx40("span", { children: primary })
7379
+ /* @__PURE__ */ jsx41("span", { children: primary })
7363
7380
  ]
7364
7381
  }
7365
7382
  ),
7366
- secondary != null ? /* @__PURE__ */ jsx40(
7383
+ secondary != null ? /* @__PURE__ */ jsx41(
7367
7384
  "span",
7368
7385
  {
7369
7386
  "data-slot": "two-tier-badge-secondary",
@@ -7384,8 +7401,8 @@ var TwoTierBadge = React33.forwardRef(
7384
7401
  TwoTierBadge.displayName = "TwoTierBadge";
7385
7402
 
7386
7403
  // src/components/ui/status-badge.tsx
7387
- import * as React34 from "react";
7388
- import { jsx as jsx41, jsxs as jsxs38 } from "react/jsx-runtime";
7404
+ import * as React33 from "react";
7405
+ import { jsx as jsx42, jsxs as jsxs38 } from "react/jsx-runtime";
7389
7406
  var ROLE = {
7390
7407
  error: "error",
7391
7408
  warning: "warning",
@@ -7414,7 +7431,7 @@ var SIZE = {
7414
7431
  sm: { cls: "gap-[6px] py-[var(--space-1)] px-[var(--space-2)] text-[12px]", dot: 6 },
7415
7432
  md: { cls: "gap-[var(--space-2)] py-[var(--space-1)] px-[14px] text-[14px]", dot: 7 }
7416
7433
  };
7417
- var StatusBadge = React34.forwardRef(
7434
+ var StatusBadge = React33.forwardRef(
7418
7435
  ({ status = "active", emphasis = "subtle", size = "sm", showDot = true, pulse = true, className, children, style, ...props }, ref) => {
7419
7436
  const role = ROLE[status];
7420
7437
  const fg = FG2[role];
@@ -7438,7 +7455,7 @@ var StatusBadge = React34.forwardRef(
7438
7455
  },
7439
7456
  ...props,
7440
7457
  children: [
7441
- showDot ? /* @__PURE__ */ jsx41(
7458
+ showDot ? /* @__PURE__ */ jsx42(
7442
7459
  "span",
7443
7460
  {
7444
7461
  "aria-hidden": "true",
@@ -7456,7 +7473,7 @@ var StatusBadge = React34.forwardRef(
7456
7473
  }
7457
7474
  ) : null,
7458
7475
  children,
7459
- /* @__PURE__ */ jsx41("style", { children: "@keyframes olun-status-pulse{0%,100%{opacity:1}50%{opacity:.4}}@media (prefers-reduced-motion: reduce){[data-slot=status-badge-dot]{animation:none!important}}" })
7476
+ /* @__PURE__ */ jsx42("style", { children: "@keyframes olun-status-pulse{0%,100%{opacity:1}50%{opacity:.4}}@media (prefers-reduced-motion: reduce){[data-slot=status-badge-dot]{animation:none!important}}" })
7460
7477
  ]
7461
7478
  }
7462
7479
  );
@@ -7465,9 +7482,9 @@ var StatusBadge = React34.forwardRef(
7465
7482
  StatusBadge.displayName = "StatusBadge";
7466
7483
 
7467
7484
  // src/components/ui/notification-badge.tsx
7468
- import * as React35 from "react";
7485
+ import * as React34 from "react";
7469
7486
  import { cva as cva13 } from "class-variance-authority";
7470
- import { jsx as jsx42 } from "react/jsx-runtime";
7487
+ import { jsx as jsx43 } from "react/jsx-runtime";
7471
7488
  var notificationBadgeVariants = cva13(
7472
7489
  [
7473
7490
  "inline-flex shrink-0 items-center justify-center rounded-[var(--radius-full)]",
@@ -7498,7 +7515,7 @@ function formatNotificationCount(count, max) {
7498
7515
  }
7499
7516
  return String(count);
7500
7517
  }
7501
- var NotificationBadge = React35.forwardRef(
7518
+ var NotificationBadge = React34.forwardRef(
7502
7519
  ({
7503
7520
  className,
7504
7521
  count,
@@ -7513,7 +7530,7 @@ var NotificationBadge = React35.forwardRef(
7513
7530
  }
7514
7531
  const normalizedMax = Math.max(1, Math.floor(max));
7515
7532
  const label = ariaLabel ?? (count > normalizedMax ? `\uC77D\uC9C0 \uC54A\uC740 \uC54C\uB9BC ${normalizedMax}\uAC1C \uC774\uC0C1` : `\uC77D\uC9C0 \uC54A\uC740 \uC54C\uB9BC ${count}\uAC1C`);
7516
- return /* @__PURE__ */ jsx42(
7533
+ return /* @__PURE__ */ jsx43(
7517
7534
  "span",
7518
7535
  {
7519
7536
  ref,
@@ -7531,9 +7548,9 @@ var NotificationBadge = React35.forwardRef(
7531
7548
  NotificationBadge.displayName = "NotificationBadge";
7532
7549
 
7533
7550
  // src/components/ui/empty-state.tsx
7534
- import * as React36 from "react";
7551
+ import * as React35 from "react";
7535
7552
  import { cva as cva14 } from "class-variance-authority";
7536
- import { jsx as jsx43, jsxs as jsxs39 } from "react/jsx-runtime";
7553
+ import { jsx as jsx44, jsxs as jsxs39 } from "react/jsx-runtime";
7537
7554
  var emptyStateBaseVariants = cva14(
7538
7555
  [
7539
7556
  "flex flex-col items-center justify-center text-center",
@@ -7605,14 +7622,14 @@ var iconSize3 = {
7605
7622
  md: 20,
7606
7623
  lg: 24
7607
7624
  };
7608
- var EmptyState = React36.forwardRef(
7625
+ var EmptyState = React35.forwardRef(
7609
7626
  ({
7610
7627
  className,
7611
7628
  size = "md",
7612
7629
  tone = "neutral",
7613
7630
  surface,
7614
7631
  icon: Icon,
7615
- title,
7632
+ title: title2,
7616
7633
  description,
7617
7634
  hint,
7618
7635
  action,
@@ -7629,25 +7646,25 @@ var EmptyState = React36.forwardRef(
7629
7646
  className: cn(emptyStateVariants({ size, tone, surface, bordered, className })),
7630
7647
  ...props,
7631
7648
  children: [
7632
- Icon ? /* @__PURE__ */ jsx43(
7649
+ Icon ? /* @__PURE__ */ jsx44(
7633
7650
  "span",
7634
7651
  {
7635
7652
  "aria-hidden": "true",
7636
7653
  "data-slot": "empty-state-icon",
7637
7654
  className: emptyStateIconVariants({ size: resolvedSize }),
7638
- children: /* @__PURE__ */ jsx43(Icon, { size: iconSize3[resolvedSize], strokeWidth: 1.75 })
7655
+ children: /* @__PURE__ */ jsx44(Icon, { size: iconSize3[resolvedSize], strokeWidth: 1.75 })
7639
7656
  }
7640
7657
  ) : null,
7641
7658
  /* @__PURE__ */ jsxs39("div", { className: "flex max-w-[420px] flex-col items-center gap-[var(--space-2)]", children: [
7642
- /* @__PURE__ */ jsx43(
7659
+ /* @__PURE__ */ jsx44(
7643
7660
  "h2",
7644
7661
  {
7645
7662
  "data-slot": "empty-state-title",
7646
7663
  className: "break-keep text-base font-semibold leading-snug text-foreground",
7647
- children: title
7664
+ children: title2
7648
7665
  }
7649
7666
  ),
7650
- description ? /* @__PURE__ */ jsx43(
7667
+ description ? /* @__PURE__ */ jsx44(
7651
7668
  "p",
7652
7669
  {
7653
7670
  "data-slot": "empty-state-description",
@@ -7655,7 +7672,7 @@ var EmptyState = React36.forwardRef(
7655
7672
  children: description
7656
7673
  }
7657
7674
  ) : null,
7658
- hint ? /* @__PURE__ */ jsx43(
7675
+ hint ? /* @__PURE__ */ jsx44(
7659
7676
  "p",
7660
7677
  {
7661
7678
  "data-slot": "empty-state-hint",
@@ -7664,7 +7681,7 @@ var EmptyState = React36.forwardRef(
7664
7681
  }
7665
7682
  ) : null
7666
7683
  ] }),
7667
- action ? /* @__PURE__ */ jsx43("div", { "data-slot": "empty-state-action", className: "mt-[var(--space-2)]", children: action }) : null
7684
+ action ? /* @__PURE__ */ jsx44("div", { "data-slot": "empty-state-action", className: "mt-[var(--space-2)]", children: action }) : null
7668
7685
  ]
7669
7686
  }
7670
7687
  );
@@ -7673,10 +7690,10 @@ var EmptyState = React36.forwardRef(
7673
7690
  EmptyState.displayName = "EmptyState";
7674
7691
 
7675
7692
  // src/components/ui/error-state.tsx
7676
- import * as React37 from "react";
7693
+ import * as React36 from "react";
7677
7694
  import { AlertTriangle } from "lucide-react";
7678
7695
  import { cva as cva15 } from "class-variance-authority";
7679
- import { jsx as jsx44, jsxs as jsxs40 } from "react/jsx-runtime";
7696
+ import { jsx as jsx45, jsxs as jsxs40 } from "react/jsx-runtime";
7680
7697
  var errorStateVariants = cva15(
7681
7698
  [
7682
7699
  "flex flex-col items-center justify-center text-center",
@@ -7698,12 +7715,12 @@ var errorStateVariants = cva15(
7698
7715
  }
7699
7716
  }
7700
7717
  );
7701
- var ErrorState = React37.forwardRef(
7718
+ var ErrorState = React36.forwardRef(
7702
7719
  ({
7703
7720
  className,
7704
7721
  size = "md",
7705
7722
  surface = "surface",
7706
- title = "\uBD88\uB7EC\uC624\uAE30 \uC2E4\uD328",
7723
+ title: title2 = "\uBD88\uB7EC\uC624\uAE30 \uC2E4\uD328",
7707
7724
  message = "\uC7A0\uC2DC \uD6C4 \uB2E4\uC2DC \uC2DC\uB3C4\uD574\uC8FC\uC138\uC694.",
7708
7725
  errorCode,
7709
7726
  onRetry,
@@ -7718,25 +7735,25 @@ var ErrorState = React37.forwardRef(
7718
7735
  className: cn(errorStateVariants({ size, surface, className })),
7719
7736
  ...props,
7720
7737
  children: [
7721
- /* @__PURE__ */ jsx44(
7738
+ /* @__PURE__ */ jsx45(
7722
7739
  "span",
7723
7740
  {
7724
7741
  "aria-hidden": "true",
7725
7742
  "data-slot": "error-state-icon",
7726
7743
  className: "inline-flex size-[48px] items-center justify-center rounded-[var(--radius-full)] bg-[var(--error-bg)] text-[var(--error)]",
7727
- children: /* @__PURE__ */ jsx44(AlertTriangle, { size: 24, strokeWidth: 1.75 })
7744
+ children: /* @__PURE__ */ jsx45(AlertTriangle, { size: 24, strokeWidth: 1.75 })
7728
7745
  }
7729
7746
  ),
7730
7747
  /* @__PURE__ */ jsxs40("div", { className: "flex max-w-[420px] flex-col items-center gap-[var(--space-2)]", children: [
7731
- /* @__PURE__ */ jsx44(
7748
+ /* @__PURE__ */ jsx45(
7732
7749
  "h2",
7733
7750
  {
7734
7751
  "data-slot": "error-state-title",
7735
7752
  className: "break-keep text-base font-semibold leading-snug text-foreground",
7736
- children: title
7753
+ children: title2
7737
7754
  }
7738
7755
  ),
7739
- /* @__PURE__ */ jsx44(
7756
+ /* @__PURE__ */ jsx45(
7740
7757
  "p",
7741
7758
  {
7742
7759
  "data-slot": "error-state-message",
@@ -7744,7 +7761,7 @@ var ErrorState = React37.forwardRef(
7744
7761
  children: message
7745
7762
  }
7746
7763
  ),
7747
- errorCode ? /* @__PURE__ */ jsx44(
7764
+ errorCode ? /* @__PURE__ */ jsx45(
7748
7765
  "p",
7749
7766
  {
7750
7767
  "data-slot": "error-state-code",
@@ -7753,7 +7770,7 @@ var ErrorState = React37.forwardRef(
7753
7770
  }
7754
7771
  ) : null
7755
7772
  ] }),
7756
- onRetry ? /* @__PURE__ */ jsx44(Button, { size: "sm", variant: "secondary", onClick: onRetry, children: retryLabel }) : null
7773
+ onRetry ? /* @__PURE__ */ jsx45(Button, { size: "sm", variant: "secondary", onClick: onRetry, children: retryLabel }) : null
7757
7774
  ]
7758
7775
  }
7759
7776
  )
@@ -7761,9 +7778,9 @@ var ErrorState = React37.forwardRef(
7761
7778
  ErrorState.displayName = "ErrorState";
7762
7779
 
7763
7780
  // src/components/ui/skeleton.tsx
7764
- import * as React38 from "react";
7781
+ import * as React37 from "react";
7765
7782
  import { cva as cva16 } from "class-variance-authority";
7766
- import { jsx as jsx45 } from "react/jsx-runtime";
7783
+ import { jsx as jsx46 } from "react/jsx-runtime";
7767
7784
  var skeletonVariants = cva16(
7768
7785
  [
7769
7786
  // bg-inset: light #F1F2F4 reads on white surfaces (bg-raised was white = invisible);
@@ -7807,8 +7824,8 @@ var spinnerVariants = cva16(
7807
7824
  }
7808
7825
  }
7809
7826
  );
7810
- var Skeleton = React38.forwardRef(
7811
- ({ className, shape, style, ...props }, ref) => /* @__PURE__ */ jsx45(
7827
+ var Skeleton = React37.forwardRef(
7828
+ ({ className, shape, style, ...props }, ref) => /* @__PURE__ */ jsx46(
7812
7829
  "div",
7813
7830
  {
7814
7831
  ref,
@@ -7821,15 +7838,15 @@ var Skeleton = React38.forwardRef(
7821
7838
  );
7822
7839
  Skeleton.displayName = "Skeleton";
7823
7840
  var defaultTextWidths = ["92%", "84%", "68%", "76%"];
7824
- var SkeletonText = React38.forwardRef(
7825
- ({ className, lines = 3, widths = defaultTextWidths, ...props }, ref) => /* @__PURE__ */ jsx45(
7841
+ var SkeletonText = React37.forwardRef(
7842
+ ({ className, lines = 3, widths = defaultTextWidths, ...props }, ref) => /* @__PURE__ */ jsx46(
7826
7843
  "div",
7827
7844
  {
7828
7845
  ref,
7829
7846
  "data-slot": "skeleton-text",
7830
7847
  className: cn("flex flex-col gap-[var(--space-2)]", className),
7831
7848
  ...props,
7832
- children: Array.from({ length: lines }, (_, index) => /* @__PURE__ */ jsx45(
7849
+ children: Array.from({ length: lines }, (_, index) => /* @__PURE__ */ jsx46(
7833
7850
  Skeleton,
7834
7851
  {
7835
7852
  shape: "text",
@@ -7841,7 +7858,7 @@ var SkeletonText = React38.forwardRef(
7841
7858
  )
7842
7859
  );
7843
7860
  SkeletonText.displayName = "SkeletonText";
7844
- var SkeletonRow = React38.forwardRef(
7861
+ var SkeletonRow = React37.forwardRef(
7845
7862
  ({
7846
7863
  className,
7847
7864
  columns,
@@ -7852,7 +7869,7 @@ var SkeletonRow = React38.forwardRef(
7852
7869
  }, ref) => {
7853
7870
  const rowCount = Math.max(5, count);
7854
7871
  const gridTemplateColumns = columns.map((column) => column.width ?? "1fr").join(" ");
7855
- return /* @__PURE__ */ jsx45(
7872
+ return /* @__PURE__ */ jsx46(
7856
7873
  "div",
7857
7874
  {
7858
7875
  ref,
@@ -7866,7 +7883,7 @@ var SkeletonRow = React38.forwardRef(
7866
7883
  className
7867
7884
  ),
7868
7885
  ...props,
7869
- children: Array.from({ length: rowCount }, (_, rowIndex) => /* @__PURE__ */ jsx45(
7886
+ children: Array.from({ length: rowCount }, (_, rowIndex) => /* @__PURE__ */ jsx46(
7870
7887
  "div",
7871
7888
  {
7872
7889
  "data-slot": "skeleton-row",
@@ -7874,11 +7891,11 @@ var SkeletonRow = React38.forwardRef(
7874
7891
  "grid min-h-[48px] items-center border-t border-[var(--border-subtle)] first:border-t-0"
7875
7892
  ),
7876
7893
  style: { gridTemplateColumns },
7877
- children: columns.map((column, columnIndex) => /* @__PURE__ */ jsx45(
7894
+ children: columns.map((column, columnIndex) => /* @__PURE__ */ jsx46(
7878
7895
  "div",
7879
7896
  {
7880
7897
  className: "px-[var(--space-4)] py-[var(--space-2)]",
7881
- children: /* @__PURE__ */ jsx45(
7898
+ children: /* @__PURE__ */ jsx46(
7882
7899
  Skeleton,
7883
7900
  {
7884
7901
  shape: "text",
@@ -7898,8 +7915,8 @@ var SkeletonRow = React38.forwardRef(
7898
7915
  }
7899
7916
  );
7900
7917
  SkeletonRow.displayName = "SkeletonRow";
7901
- var Spinner = React38.forwardRef(
7902
- ({ className, size, label = "\uB85C\uB529 \uC911", ...props }, ref) => /* @__PURE__ */ jsx45(
7918
+ var Spinner = React37.forwardRef(
7919
+ ({ className, size, label = "\uB85C\uB529 \uC911", ...props }, ref) => /* @__PURE__ */ jsx46(
7903
7920
  "span",
7904
7921
  {
7905
7922
  ref,
@@ -7914,12 +7931,12 @@ var Spinner = React38.forwardRef(
7914
7931
  Spinner.displayName = "Spinner";
7915
7932
 
7916
7933
  // src/components/ui/pagination.tsx
7917
- import * as React39 from "react";
7934
+ import * as React38 from "react";
7918
7935
  import { ChevronsLeft, ChevronLeft, ChevronRight as ChevronRight2, ChevronsRight } from "lucide-react";
7919
7936
  import { cva as cva17 } from "class-variance-authority";
7920
7937
 
7921
7938
  // src/components/ui/page-size-select.tsx
7922
- import { jsx as jsx46, jsxs as jsxs41 } from "react/jsx-runtime";
7939
+ import { jsx as jsx47, jsxs as jsxs41 } from "react/jsx-runtime";
7923
7940
  var DEFAULT_OPTIONS = [10, 20, 50, 100];
7924
7941
  function PageSizeSelect({
7925
7942
  value,
@@ -7947,8 +7964,8 @@ function PageSizeSelect({
7947
7964
  className
7948
7965
  ),
7949
7966
  children: [
7950
- label != null ? /* @__PURE__ */ jsx46("span", { children: label }) : null,
7951
- /* @__PURE__ */ jsx46(
7967
+ label != null ? /* @__PURE__ */ jsx47("span", { children: label }) : null,
7968
+ /* @__PURE__ */ jsx47(
7952
7969
  Select,
7953
7970
  {
7954
7971
  id,
@@ -7970,7 +7987,7 @@ function PageSizeSelect({
7970
7987
  }
7971
7988
 
7972
7989
  // src/components/ui/pagination.tsx
7973
- import { jsx as jsx47, jsxs as jsxs42 } from "react/jsx-runtime";
7990
+ import { jsx as jsx48, jsxs as jsxs42 } from "react/jsx-runtime";
7974
7991
  var paginationVariants = cva17(
7975
7992
  [
7976
7993
  "flex w-full flex-col gap-[var(--space-3)]",
@@ -8043,7 +8060,7 @@ function NavigationButton({
8043
8060
  icon: Icon,
8044
8061
  onPageChange
8045
8062
  }) {
8046
- return /* @__PURE__ */ jsx47(
8063
+ return /* @__PURE__ */ jsx48(
8047
8064
  "button",
8048
8065
  {
8049
8066
  "aria-label": label,
@@ -8051,11 +8068,11 @@ function NavigationButton({
8051
8068
  className: paginationControlVariants({ size }),
8052
8069
  type: "button",
8053
8070
  onClick: () => onPageChange?.(page),
8054
- children: /* @__PURE__ */ jsx47(Icon, { "aria-hidden": "true", "data-slot": "pagination-icon" })
8071
+ children: /* @__PURE__ */ jsx48(Icon, { "aria-hidden": "true", "data-slot": "pagination-icon" })
8055
8072
  }
8056
8073
  );
8057
8074
  }
8058
- var Pagination = React39.forwardRef(
8075
+ var Pagination = React38.forwardRef(
8059
8076
  ({
8060
8077
  className,
8061
8078
  size = "standard",
@@ -8091,8 +8108,8 @@ var Pagination = React39.forwardRef(
8091
8108
  ...props,
8092
8109
  children: [
8093
8110
  /* @__PURE__ */ jsxs42("div", { className: "flex flex-wrap items-center gap-[var(--space-3)]", children: [
8094
- /* @__PURE__ */ jsx47("span", { "data-slot": "pagination-total", className: "font-medium text-text-secondary", children: totalLabel(total) }),
8095
- showPageSize ? /* @__PURE__ */ jsx47("div", { "data-slot": "pagination-size", children: /* @__PURE__ */ jsx47(
8111
+ /* @__PURE__ */ jsx48("span", { "data-slot": "pagination-total", className: "font-medium text-text-secondary", children: totalLabel(total) }),
8112
+ showPageSize ? /* @__PURE__ */ jsx48("div", { "data-slot": "pagination-size", children: /* @__PURE__ */ jsx48(
8096
8113
  PageSizeSelect,
8097
8114
  {
8098
8115
  label: pageSizeLabel,
@@ -8110,7 +8127,7 @@ var Pagination = React39.forwardRef(
8110
8127
  "data-slot": "pagination-list",
8111
8128
  className: "flex items-center justify-center gap-[var(--space-1)]",
8112
8129
  children: [
8113
- /* @__PURE__ */ jsx47(
8130
+ /* @__PURE__ */ jsx48(
8114
8131
  NavigationButton,
8115
8132
  {
8116
8133
  label: "\uCCAB \uD398\uC774\uC9C0",
@@ -8121,7 +8138,7 @@ var Pagination = React39.forwardRef(
8121
8138
  onPageChange
8122
8139
  }
8123
8140
  ),
8124
- /* @__PURE__ */ jsx47(
8141
+ /* @__PURE__ */ jsx48(
8125
8142
  NavigationButton,
8126
8143
  {
8127
8144
  label: "\uC774\uC804 \uD398\uC774\uC9C0",
@@ -8133,7 +8150,7 @@ var Pagination = React39.forwardRef(
8133
8150
  }
8134
8151
  ),
8135
8152
  items.map(
8136
- (item, index) => item === "ellipsis" ? /* @__PURE__ */ jsx47(
8153
+ (item, index) => item === "ellipsis" ? /* @__PURE__ */ jsx48(
8137
8154
  "span",
8138
8155
  {
8139
8156
  "data-slot": "pagination-ellipsis",
@@ -8145,7 +8162,7 @@ var Pagination = React39.forwardRef(
8145
8162
  children: "..."
8146
8163
  },
8147
8164
  `ellipsis-${index}`
8148
- ) : /* @__PURE__ */ jsx47(
8165
+ ) : /* @__PURE__ */ jsx48(
8149
8166
  "button",
8150
8167
  {
8151
8168
  "aria-label": `${item} \uD398\uC774\uC9C0`,
@@ -8159,7 +8176,7 @@ var Pagination = React39.forwardRef(
8159
8176
  item
8160
8177
  )
8161
8178
  ),
8162
- /* @__PURE__ */ jsx47(
8179
+ /* @__PURE__ */ jsx48(
8163
8180
  NavigationButton,
8164
8181
  {
8165
8182
  label: "\uB2E4\uC74C \uD398\uC774\uC9C0",
@@ -8170,7 +8187,7 @@ var Pagination = React39.forwardRef(
8170
8187
  onPageChange
8171
8188
  }
8172
8189
  ),
8173
- /* @__PURE__ */ jsx47(
8190
+ /* @__PURE__ */ jsx48(
8174
8191
  NavigationButton,
8175
8192
  {
8176
8193
  label: "\uB9C8\uC9C0\uB9C9 \uD398\uC774\uC9C0",
@@ -8193,7 +8210,7 @@ Pagination.displayName = "Pagination";
8193
8210
 
8194
8211
  // src/components/ui/mode-toggle.tsx
8195
8212
  import { cva as cva18 } from "class-variance-authority";
8196
- import { jsx as jsx48, jsxs as jsxs43 } from "react/jsx-runtime";
8213
+ import { jsx as jsx49, jsxs as jsxs43 } from "react/jsx-runtime";
8197
8214
  var modeToggleVariants = cva18(
8198
8215
  [
8199
8216
  "inline-flex items-center rounded-[var(--radius-md)] border border-[var(--border-subtle)]",
@@ -8223,7 +8240,7 @@ function ModeToggle({
8223
8240
  onChange,
8224
8241
  ...props
8225
8242
  }) {
8226
- return /* @__PURE__ */ jsx48(
8243
+ return /* @__PURE__ */ jsx49(
8227
8244
  "div",
8228
8245
  {
8229
8246
  role: "group",
@@ -8249,8 +8266,8 @@ function ModeToggle({
8249
8266
  }
8250
8267
  },
8251
8268
  children: [
8252
- Icon ? /* @__PURE__ */ jsx48(Icon, { "aria-hidden": "true", "data-slot": "mode-toggle-icon" }) : null,
8253
- /* @__PURE__ */ jsx48("span", { children: option.label })
8269
+ Icon ? /* @__PURE__ */ jsx49(Icon, { "aria-hidden": "true", "data-slot": "mode-toggle-icon" }) : null,
8270
+ /* @__PURE__ */ jsx49("span", { children: option.label })
8254
8271
  ]
8255
8272
  },
8256
8273
  option.value
@@ -8261,9 +8278,9 @@ function ModeToggle({
8261
8278
  }
8262
8279
 
8263
8280
  // src/components/ui/action-footer.tsx
8264
- import * as React40 from "react";
8281
+ import * as React39 from "react";
8265
8282
  import { cva as cva19 } from "class-variance-authority";
8266
- import { jsx as jsx49, jsxs as jsxs44 } from "react/jsx-runtime";
8283
+ import { jsx as jsx50, jsxs as jsxs44 } from "react/jsx-runtime";
8267
8284
  var actionFooterVariants = cva19(
8268
8285
  [
8269
8286
  "flex flex-wrap items-center gap-[var(--space-4)] border-t border-[var(--border-subtle)]",
@@ -8334,7 +8351,7 @@ function getStatusLabel(status) {
8334
8351
  }
8335
8352
  }
8336
8353
  function renderAction(action) {
8337
- return /* @__PURE__ */ jsx49(
8354
+ return /* @__PURE__ */ jsx50(
8338
8355
  Button,
8339
8356
  {
8340
8357
  variant: action.variant,
@@ -8349,7 +8366,7 @@ function renderAction(action) {
8349
8366
  action.id ?? action.label
8350
8367
  );
8351
8368
  }
8352
- var ActionFooter = React40.forwardRef(
8369
+ var ActionFooter = React39.forwardRef(
8353
8370
  ({
8354
8371
  className,
8355
8372
  status,
@@ -8375,7 +8392,7 @@ var ActionFooter = React40.forwardRef(
8375
8392
  className: cn(actionFooterVariants({ position, surface, className })),
8376
8393
  ...props,
8377
8394
  children: [
8378
- destructiveActions.length > 0 ? /* @__PURE__ */ jsx49(
8395
+ destructiveActions.length > 0 ? /* @__PURE__ */ jsx50(
8379
8396
  "div",
8380
8397
  {
8381
8398
  "data-slot": "action-footer-destructive-actions",
@@ -8391,7 +8408,7 @@ var ActionFooter = React40.forwardRef(
8391
8408
  "aria-live": "polite",
8392
8409
  className: cn(actionFooterStatusVariants({ kind: status.kind })),
8393
8410
  children: [
8394
- /* @__PURE__ */ jsx49(
8411
+ /* @__PURE__ */ jsx50(
8395
8412
  "span",
8396
8413
  {
8397
8414
  "aria-hidden": "true",
@@ -8399,11 +8416,11 @@ var ActionFooter = React40.forwardRef(
8399
8416
  className: "size-[6px] shrink-0 rounded-[var(--radius-full)]"
8400
8417
  }
8401
8418
  ),
8402
- /* @__PURE__ */ jsx49("span", { className: "truncate", children: getStatusLabel(status) })
8419
+ /* @__PURE__ */ jsx50("span", { className: "truncate", children: getStatusLabel(status) })
8403
8420
  ]
8404
8421
  }
8405
8422
  ) : null,
8406
- /* @__PURE__ */ jsx49(
8423
+ /* @__PURE__ */ jsx50(
8407
8424
  "div",
8408
8425
  {
8409
8426
  "data-slot": "action-footer-main-actions",
@@ -8419,9 +8436,9 @@ var ActionFooter = React40.forwardRef(
8419
8436
  ActionFooter.displayName = "ActionFooter";
8420
8437
 
8421
8438
  // src/components/ui/toast.tsx
8422
- import * as React41 from "react";
8439
+ import * as React40 from "react";
8423
8440
  import { cva as cva20 } from "class-variance-authority";
8424
- import { jsx as jsx50, jsxs as jsxs45 } from "react/jsx-runtime";
8441
+ import { jsx as jsx51, jsxs as jsxs45 } from "react/jsx-runtime";
8425
8442
  var DOT3 = {
8426
8443
  default: "var(--neutral)",
8427
8444
  success: "var(--success)",
@@ -8539,7 +8556,7 @@ var toast = {
8539
8556
  }
8540
8557
  };
8541
8558
  var Toast = toast;
8542
- var ToastRoot = React41.forwardRef(
8559
+ var ToastRoot = React40.forwardRef(
8543
8560
  ({
8544
8561
  className,
8545
8562
  id,
@@ -8556,10 +8573,10 @@ var ToastRoot = React41.forwardRef(
8556
8573
  ...props
8557
8574
  }, ref) => {
8558
8575
  const durationMs = getToastDuration({ message, variant, duration });
8559
- const onCloseRef = React41.useRef(onClose);
8576
+ const onCloseRef = React40.useRef(onClose);
8560
8577
  onCloseRef.current = onClose;
8561
- const timerRef = React41.useRef(null);
8562
- React41.useEffect(() => {
8578
+ const timerRef = React40.useRef(null);
8579
+ React40.useEffect(() => {
8563
8580
  if (!onCloseRef.current) return void 0;
8564
8581
  const timer = createToastTimer(durationMs, () => onCloseRef.current?.());
8565
8582
  timerRef.current = timer;
@@ -8596,7 +8613,7 @@ var ToastRoot = React41.forwardRef(
8596
8613
  },
8597
8614
  ...props,
8598
8615
  children: [
8599
- /* @__PURE__ */ jsx50(
8616
+ /* @__PURE__ */ jsx51(
8600
8617
  "span",
8601
8618
  {
8602
8619
  "aria-hidden": "true",
@@ -8606,7 +8623,7 @@ var ToastRoot = React41.forwardRef(
8606
8623
  }
8607
8624
  ),
8608
8625
  /* @__PURE__ */ jsxs45("div", { "data-slot": "toast-body", className: "min-w-0 flex-1", children: [
8609
- /* @__PURE__ */ jsx50(
8626
+ /* @__PURE__ */ jsx51(
8610
8627
  "div",
8611
8628
  {
8612
8629
  "data-slot": "toast-message",
@@ -8614,7 +8631,7 @@ var ToastRoot = React41.forwardRef(
8614
8631
  children: message
8615
8632
  }
8616
8633
  ),
8617
- description ? /* @__PURE__ */ jsx50(
8634
+ description ? /* @__PURE__ */ jsx51(
8618
8635
  "div",
8619
8636
  {
8620
8637
  "data-slot": "toast-description",
@@ -8624,7 +8641,7 @@ var ToastRoot = React41.forwardRef(
8624
8641
  ) : null
8625
8642
  ] }),
8626
8643
  /* @__PURE__ */ jsxs45("div", { "data-slot": "toast-actions", className: "flex shrink-0 items-center gap-[2px]", children: [
8627
- action ? /* @__PURE__ */ jsx50(
8644
+ action ? /* @__PURE__ */ jsx51(
8628
8645
  Button,
8629
8646
  {
8630
8647
  "data-slot": "toast-action",
@@ -8634,7 +8651,7 @@ var ToastRoot = React41.forwardRef(
8634
8651
  children: action.label
8635
8652
  }
8636
8653
  ) : null,
8637
- /* @__PURE__ */ jsx50(
8654
+ /* @__PURE__ */ jsx51(
8638
8655
  "button",
8639
8656
  {
8640
8657
  type: "button",
@@ -8656,7 +8673,7 @@ var ToastRoot = React41.forwardRef(
8656
8673
  }
8657
8674
  );
8658
8675
  ToastRoot.displayName = "ToastRoot";
8659
- var ToastViewport = React41.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx50(
8676
+ var ToastViewport = React40.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx51(
8660
8677
  "ol",
8661
8678
  {
8662
8679
  ref,
@@ -8667,8 +8684,8 @@ var ToastViewport = React41.forwardRef(({ className, ...props }, ref) => /* @__P
8667
8684
  ));
8668
8685
  ToastViewport.displayName = "ToastViewport";
8669
8686
  function ToastProvider({ children, maxToasts = 3, className, ...props }) {
8670
- const [items, setItems] = React41.useState([]);
8671
- React41.useEffect(
8687
+ const [items, setItems] = React40.useState([]);
8688
+ React40.useEffect(
8672
8689
  () => toast.subscribe((nextItems) => {
8673
8690
  setItems(limitToasts(nextItems, maxToasts));
8674
8691
  }),
@@ -8676,15 +8693,15 @@ function ToastProvider({ children, maxToasts = 3, className, ...props }) {
8676
8693
  );
8677
8694
  return /* @__PURE__ */ jsxs45("div", { "data-slot": "toast-provider", className, ...props, children: [
8678
8695
  children,
8679
- /* @__PURE__ */ jsx50(ToastViewport, { children: items.map((item) => /* @__PURE__ */ jsx50("li", { children: /* @__PURE__ */ jsx50(ToastRoot, { ...item, onClose: () => toast.dismiss(item.id) }) }, item.id)) })
8696
+ /* @__PURE__ */ jsx51(ToastViewport, { children: items.map((item) => /* @__PURE__ */ jsx51("li", { children: /* @__PURE__ */ jsx51(ToastRoot, { ...item, onClose: () => toast.dismiss(item.id) }) }, item.id)) })
8680
8697
  ] });
8681
8698
  }
8682
8699
 
8683
8700
  // src/components/ui/otp-field.tsx
8684
- import * as React42 from "react";
8701
+ import * as React41 from "react";
8685
8702
  import { cva as cva21 } from "class-variance-authority";
8686
8703
  import { AlertCircle as AlertCircle4 } from "lucide-react";
8687
- import { Fragment as Fragment9, jsx as jsx51, jsxs as jsxs46 } from "react/jsx-runtime";
8704
+ import { Fragment as Fragment9, jsx as jsx52, jsxs as jsxs46 } from "react/jsx-runtime";
8688
8705
  var otpFieldVariants = cva21("flex w-full min-w-0 flex-col gap-[var(--space-3)]", {
8689
8706
  variants: {
8690
8707
  size: {
@@ -8811,7 +8828,7 @@ function fillDigitsFromIndex(slots, index, inserted, length) {
8811
8828
  focusIndex: Math.min(cursor, length - 1)
8812
8829
  };
8813
8830
  }
8814
- var OTPField = React42.forwardRef(
8831
+ var OTPField = React41.forwardRef(
8815
8832
  ({
8816
8833
  className,
8817
8834
  defaultValue,
@@ -8833,24 +8850,24 @@ var OTPField = React42.forwardRef(
8833
8850
  required,
8834
8851
  ...props
8835
8852
  }, ref) => {
8836
- const generatedId = React42.useId();
8853
+ const generatedId = React41.useId();
8837
8854
  const fieldId = id ?? generatedId;
8838
8855
  const labelId = `${fieldId}-label`;
8839
8856
  const helperId = helperText ? `${fieldId}-helper` : void 0;
8840
8857
  const errorId = errorText ? `${fieldId}-error` : void 0;
8841
8858
  const resolvedState = invalid || errorText ? "error" : "default";
8842
8859
  const isControlled = value !== void 0;
8843
- const [uncontrolledSlots, setUncontrolledSlots] = React42.useState(
8860
+ const [uncontrolledSlots, setUncontrolledSlots] = React41.useState(
8844
8861
  () => toDigitsArray(onlyDigits(defaultValue, length), length)
8845
8862
  );
8846
- const resolvedSlots = React42.useMemo(
8863
+ const resolvedSlots = React41.useMemo(
8847
8864
  () => isControlled ? toDigitsArray(onlyDigits(value, length), length) : uncontrolledSlots,
8848
8865
  [isControlled, length, uncontrolledSlots, value]
8849
8866
  );
8850
8867
  const resolvedValue = joinDigits(resolvedSlots).slice(0, length);
8851
- const cellsRef = React42.useRef([]);
8868
+ const cellsRef = React41.useRef([]);
8852
8869
  const groupDescribedBy = [helperId, errorId].filter(Boolean).join(" ") || void 0;
8853
- const setResolvedValue = React42.useCallback(
8870
+ const setResolvedValue = React41.useCallback(
8854
8871
  (nextSlots, focusIndex) => {
8855
8872
  const normalizedSlots = nextSlots.slice(0, length);
8856
8873
  const normalizedValue = joinDigits(normalizedSlots).slice(0, length);
@@ -8890,11 +8907,11 @@ var OTPField = React42.forwardRef(
8890
8907
  className: "text-sm font-medium leading-snug text-foreground",
8891
8908
  children: [
8892
8909
  label,
8893
- required ? /* @__PURE__ */ jsx51("span", { "aria-hidden": "true", className: "ml-1 font-bold text-[var(--error)]", children: "*" }) : null
8910
+ required ? /* @__PURE__ */ jsx52("span", { "aria-hidden": "true", className: "ml-1 font-bold text-[var(--error)]", children: "*" }) : null
8894
8911
  ]
8895
8912
  }
8896
8913
  ),
8897
- /* @__PURE__ */ jsx51(
8914
+ /* @__PURE__ */ jsx52(
8898
8915
  "div",
8899
8916
  {
8900
8917
  "data-slot": "otp-field-group",
@@ -8904,7 +8921,7 @@ var OTPField = React42.forwardRef(
8904
8921
  children: Array.from({ length }, (_, index) => {
8905
8922
  const digit = resolvedSlots[index] ?? "";
8906
8923
  const inputId = `${fieldId}-cell-${index + 1}`;
8907
- return /* @__PURE__ */ jsx51(
8924
+ return /* @__PURE__ */ jsx52(
8908
8925
  "input",
8909
8926
  {
8910
8927
  ref: (node) => {
@@ -8999,7 +9016,7 @@ var OTPField = React42.forwardRef(
8999
9016
  })
9000
9017
  }
9001
9018
  ),
9002
- helperText || errorText ? /* @__PURE__ */ jsx51(
9019
+ helperText || errorText ? /* @__PURE__ */ jsx52(
9003
9020
  "p",
9004
9021
  {
9005
9022
  id: errorText ? errorId : helperId,
@@ -9007,7 +9024,7 @@ var OTPField = React42.forwardRef(
9007
9024
  "data-kind": errorText ? "error" : "helper",
9008
9025
  className: otpFieldMessageVariants({ state: resolvedState }),
9009
9026
  children: errorText ? /* @__PURE__ */ jsxs46(Fragment9, { children: [
9010
- /* @__PURE__ */ jsx51(
9027
+ /* @__PURE__ */ jsx52(
9011
9028
  AlertCircle4,
9012
9029
  {
9013
9030
  "aria-hidden": "true",
@@ -9015,11 +9032,11 @@ var OTPField = React42.forwardRef(
9015
9032
  strokeWidth: 2
9016
9033
  }
9017
9034
  ),
9018
- /* @__PURE__ */ jsx51("span", { children: errorText })
9019
- ] }) : /* @__PURE__ */ jsx51("span", { children: helperText })
9035
+ /* @__PURE__ */ jsx52("span", { children: errorText })
9036
+ ] }) : /* @__PURE__ */ jsx52("span", { children: helperText })
9020
9037
  }
9021
9038
  ) : null,
9022
- name ? /* @__PURE__ */ jsx51(
9039
+ name ? /* @__PURE__ */ jsx52(
9023
9040
  "input",
9024
9041
  {
9025
9042
  "aria-hidden": "true",
@@ -9040,10 +9057,10 @@ var OTPField = React42.forwardRef(
9040
9057
  OTPField.displayName = "OTPField";
9041
9058
 
9042
9059
  // src/components/ui/search-field.tsx
9043
- import * as React43 from "react";
9044
- import { Search, X as X5 } from "lucide-react";
9060
+ import * as React42 from "react";
9061
+ import { Search, X as X4 } from "lucide-react";
9045
9062
  import { cva as cva22 } from "class-variance-authority";
9046
- import { jsx as jsx52, jsxs as jsxs47 } from "react/jsx-runtime";
9063
+ import { jsx as jsx53, jsxs as jsxs47 } from "react/jsx-runtime";
9047
9064
  var searchFieldVariants = cva22("relative flex w-full items-center", {
9048
9065
  variants: {
9049
9066
  size: {
@@ -9108,7 +9125,7 @@ var iconSize4 = {
9108
9125
  function hasVisibleValue(value) {
9109
9126
  return typeof value === "string" ? value.length > 0 : value !== void 0;
9110
9127
  }
9111
- var SearchField = React43.forwardRef(
9128
+ var SearchField = React42.forwardRef(
9112
9129
  ({
9113
9130
  className,
9114
9131
  inputMode = "search",
@@ -9124,12 +9141,12 @@ var SearchField = React43.forwardRef(
9124
9141
  ...props
9125
9142
  }, ref) => {
9126
9143
  const resolvedSize = size ?? "md";
9127
- const inputRef = React43.useRef(null);
9128
- const [hasText, setHasText] = React43.useState(
9144
+ const inputRef = React42.useRef(null);
9145
+ const [hasText, setHasText] = React42.useState(
9129
9146
  () => hasVisibleValue(value ?? defaultValue)
9130
9147
  );
9131
- React43.useImperativeHandle(ref, () => inputRef.current);
9132
- React43.useEffect(() => {
9148
+ React42.useImperativeHandle(ref, () => inputRef.current);
9149
+ React42.useEffect(() => {
9133
9150
  if (value !== void 0) {
9134
9151
  setHasText(hasVisibleValue(value));
9135
9152
  }
@@ -9149,7 +9166,7 @@ var SearchField = React43.forwardRef(
9149
9166
  "data-size": resolvedSize,
9150
9167
  className: cn(searchFieldVariants({ size, className })),
9151
9168
  children: [
9152
- /* @__PURE__ */ jsx52(
9169
+ /* @__PURE__ */ jsx53(
9153
9170
  Search,
9154
9171
  {
9155
9172
  "aria-hidden": "true",
@@ -9159,7 +9176,7 @@ var SearchField = React43.forwardRef(
9159
9176
  strokeWidth: resolvedSize === "sm" ? 2 : 1.75
9160
9177
  }
9161
9178
  ),
9162
- /* @__PURE__ */ jsx52(
9179
+ /* @__PURE__ */ jsx53(
9163
9180
  "input",
9164
9181
  {
9165
9182
  ref: inputRef,
@@ -9180,7 +9197,7 @@ var SearchField = React43.forwardRef(
9180
9197
  ...props
9181
9198
  }
9182
9199
  ),
9183
- showClear ? /* @__PURE__ */ jsx52(
9200
+ showClear ? /* @__PURE__ */ jsx53(
9184
9201
  "button",
9185
9202
  {
9186
9203
  type: "button",
@@ -9188,7 +9205,7 @@ var SearchField = React43.forwardRef(
9188
9205
  "data-slot": "search-field-clear",
9189
9206
  className: "absolute right-[8px] top-1/2 inline-flex size-[var(--space-4)] -translate-y-1/2 cursor-pointer items-center justify-center rounded-[var(--radius-full)] text-text-tertiary transition-colors hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--focus-ring)]",
9190
9207
  onClick: clearInput,
9191
- children: /* @__PURE__ */ jsx52(X5, { "aria-hidden": "true", size: 16, strokeWidth: 1.75 })
9208
+ children: /* @__PURE__ */ jsx53(X4, { "aria-hidden": "true", size: 16, strokeWidth: 1.75 })
9192
9209
  }
9193
9210
  ) : null
9194
9211
  ]
@@ -9199,9 +9216,9 @@ var SearchField = React43.forwardRef(
9199
9216
  SearchField.displayName = "SearchField";
9200
9217
 
9201
9218
  // src/components/ui/checkbox-group.tsx
9202
- import * as React44 from "react";
9219
+ import * as React43 from "react";
9203
9220
  import { cva as cva23 } from "class-variance-authority";
9204
- import { jsx as jsx53 } from "react/jsx-runtime";
9221
+ import { jsx as jsx54 } from "react/jsx-runtime";
9205
9222
  var checkboxGroupVariants = cva23("gap-[var(--space-2)]", {
9206
9223
  variants: {
9207
9224
  appearance: {
@@ -9227,7 +9244,7 @@ var checkboxGroupVariants = cva23("gap-[var(--space-2)]", {
9227
9244
  function toSelectionSet(value) {
9228
9245
  return new Set(value ?? []);
9229
9246
  }
9230
- var CheckboxGroup = React44.forwardRef(
9247
+ var CheckboxGroup = React43.forwardRef(
9231
9248
  ({
9232
9249
  className,
9233
9250
  children,
@@ -9243,14 +9260,14 @@ var CheckboxGroup = React44.forwardRef(
9243
9260
  ...props
9244
9261
  }, ref) => {
9245
9262
  const isControlled = value != null;
9246
- const [uncontrolledValue, setUncontrolledValue] = React44.useState(
9263
+ const [uncontrolledValue, setUncontrolledValue] = React43.useState(
9247
9264
  () => toSelectionSet(defaultValue)
9248
9265
  );
9249
- const selectedValues = React44.useMemo(
9266
+ const selectedValues = React43.useMemo(
9250
9267
  () => isControlled ? toSelectionSet(value) : uncontrolledValue,
9251
9268
  [isControlled, uncontrolledValue, value]
9252
9269
  );
9253
- const toggleValue = React44.useCallback(
9270
+ const toggleValue = React43.useCallback(
9254
9271
  (itemValue, checked) => {
9255
9272
  const nextValues = new Set(selectedValues);
9256
9273
  if (checked) {
@@ -9266,7 +9283,7 @@ var CheckboxGroup = React44.forwardRef(
9266
9283
  },
9267
9284
  [isControlled, onValueChange, selectedValues]
9268
9285
  );
9269
- const contextValue = React44.useMemo(
9286
+ const contextValue = React43.useMemo(
9270
9287
  () => ({
9271
9288
  appearance,
9272
9289
  density,
@@ -9277,7 +9294,7 @@ var CheckboxGroup = React44.forwardRef(
9277
9294
  }),
9278
9295
  [appearance, density, disabled, name, selectedValues, toggleValue]
9279
9296
  );
9280
- return /* @__PURE__ */ jsx53(CheckboxGroupContext.Provider, { value: contextValue, children: /* @__PURE__ */ jsx53(
9297
+ return /* @__PURE__ */ jsx54(CheckboxGroupContext.Provider, { value: contextValue, children: /* @__PURE__ */ jsx54(
9281
9298
  "div",
9282
9299
  {
9283
9300
  ref,
@@ -9301,11 +9318,11 @@ var CheckboxGroup = React44.forwardRef(
9301
9318
  CheckboxGroup.displayName = "CheckboxGroup";
9302
9319
 
9303
9320
  // src/components/ui/radio-group.tsx
9304
- import * as React45 from "react";
9321
+ import * as React44 from "react";
9305
9322
  import { cva as cva24 } from "class-variance-authority";
9306
9323
  import { Circle } from "lucide-react";
9307
9324
  import { RadioGroup as RadioGroupPrimitive } from "radix-ui";
9308
- import { jsx as jsx54, jsxs as jsxs48 } from "react/jsx-runtime";
9325
+ import { jsx as jsx55, jsxs as jsxs48 } from "react/jsx-runtime";
9309
9326
  var radioGroupVariants = cva24("gap-[var(--space-2)]", {
9310
9327
  variants: {
9311
9328
  appearance: {
@@ -9394,11 +9411,11 @@ var radioControlVariants = cva24(
9394
9411
  }
9395
9412
  }
9396
9413
  );
9397
- var RadioGroupContext = React45.createContext({
9414
+ var RadioGroupContext = React44.createContext({
9398
9415
  appearance: "plain",
9399
9416
  density: "comfortable"
9400
9417
  });
9401
- var RadioGroup = React45.forwardRef(
9418
+ var RadioGroup = React44.forwardRef(
9402
9419
  ({
9403
9420
  className,
9404
9421
  children,
@@ -9409,11 +9426,11 @@ var RadioGroup = React45.forwardRef(
9409
9426
  required,
9410
9427
  ...props
9411
9428
  }, ref) => {
9412
- const contextValue = React45.useMemo(
9429
+ const contextValue = React44.useMemo(
9413
9430
  () => ({ appearance, density }),
9414
9431
  [appearance, density]
9415
9432
  );
9416
- return /* @__PURE__ */ jsx54(RadioGroupContext.Provider, { value: contextValue, children: /* @__PURE__ */ jsx54(
9433
+ return /* @__PURE__ */ jsx55(RadioGroupContext.Provider, { value: contextValue, children: /* @__PURE__ */ jsx55(
9417
9434
  RadioGroupPrimitive.Root,
9418
9435
  {
9419
9436
  ref,
@@ -9436,9 +9453,9 @@ var RadioGroup = React45.forwardRef(
9436
9453
  }
9437
9454
  );
9438
9455
  RadioGroup.displayName = "RadioGroup";
9439
- var Radio = React45.forwardRef(({ className, children, description, id, ...props }, ref) => {
9440
- const { appearance, density } = React45.useContext(RadioGroupContext);
9441
- const generatedId = React45.useId();
9456
+ var Radio = React44.forwardRef(({ className, children, description, id, ...props }, ref) => {
9457
+ const { appearance, density } = React44.useContext(RadioGroupContext);
9458
+ const generatedId = React44.useId();
9442
9459
  const radioId = id ?? generatedId;
9443
9460
  const labelId = `${radioId}-label`;
9444
9461
  const descriptionId = description ? `${radioId}-description` : void 0;
@@ -9453,24 +9470,24 @@ var Radio = React45.forwardRef(({ className, children, description, id, ...props
9453
9470
  className: cn(radioVariants({ appearance, density }), className),
9454
9471
  ...props,
9455
9472
  children: [
9456
- /* @__PURE__ */ jsx54(
9473
+ /* @__PURE__ */ jsx55(
9457
9474
  "span",
9458
9475
  {
9459
9476
  "aria-hidden": "true",
9460
9477
  "data-slot": "radio-control",
9461
9478
  className: radioControlVariants({ appearance }),
9462
- children: /* @__PURE__ */ jsx54(
9479
+ children: /* @__PURE__ */ jsx55(
9463
9480
  RadioGroupPrimitive.Indicator,
9464
9481
  {
9465
9482
  "data-slot": "radio-indicator",
9466
9483
  className: "flex items-center justify-center",
9467
- children: /* @__PURE__ */ jsx54(Circle, { "aria-hidden": "true", size: 8, fill: "currentColor" })
9484
+ children: /* @__PURE__ */ jsx55(Circle, { "aria-hidden": "true", size: 8, fill: "currentColor" })
9468
9485
  }
9469
9486
  )
9470
9487
  }
9471
9488
  ),
9472
9489
  /* @__PURE__ */ jsxs48("span", { className: "flex min-w-0 flex-col gap-[var(--space-1)]", children: [
9473
- /* @__PURE__ */ jsx54(
9490
+ /* @__PURE__ */ jsx55(
9474
9491
  "span",
9475
9492
  {
9476
9493
  id: labelId,
@@ -9482,7 +9499,7 @@ var Radio = React45.forwardRef(({ className, children, description, id, ...props
9482
9499
  children
9483
9500
  }
9484
9501
  ),
9485
- description ? /* @__PURE__ */ jsx54(
9502
+ description ? /* @__PURE__ */ jsx55(
9486
9503
  "span",
9487
9504
  {
9488
9505
  id: descriptionId,
@@ -9500,7 +9517,7 @@ Radio.displayName = "Radio";
9500
9517
 
9501
9518
  // src/components/ui/scroll-area.tsx
9502
9519
  import { ScrollArea as ScrollAreaPrimitive } from "radix-ui";
9503
- import { jsx as jsx55, jsxs as jsxs49 } from "react/jsx-runtime";
9520
+ import { jsx as jsx56, jsxs as jsxs49 } from "react/jsx-runtime";
9504
9521
  function ScrollArea({
9505
9522
  className,
9506
9523
  children,
@@ -9513,7 +9530,7 @@ function ScrollArea({
9513
9530
  className: cn("relative", className),
9514
9531
  ...props,
9515
9532
  children: [
9516
- /* @__PURE__ */ jsx55(
9533
+ /* @__PURE__ */ jsx56(
9517
9534
  ScrollAreaPrimitive.Viewport,
9518
9535
  {
9519
9536
  "data-slot": "scroll-area-viewport",
@@ -9521,8 +9538,8 @@ function ScrollArea({
9521
9538
  children
9522
9539
  }
9523
9540
  ),
9524
- /* @__PURE__ */ jsx55(ScrollBar, {}),
9525
- /* @__PURE__ */ jsx55(ScrollAreaPrimitive.Corner, {})
9541
+ /* @__PURE__ */ jsx56(ScrollBar, {}),
9542
+ /* @__PURE__ */ jsx56(ScrollAreaPrimitive.Corner, {})
9526
9543
  ]
9527
9544
  }
9528
9545
  );
@@ -9532,7 +9549,7 @@ function ScrollBar({
9532
9549
  orientation = "vertical",
9533
9550
  ...props
9534
9551
  }) {
9535
- return /* @__PURE__ */ jsx55(
9552
+ return /* @__PURE__ */ jsx56(
9536
9553
  ScrollAreaPrimitive.ScrollAreaScrollbar,
9537
9554
  {
9538
9555
  "data-slot": "scroll-area-scrollbar",
@@ -9544,7 +9561,7 @@ function ScrollBar({
9544
9561
  className
9545
9562
  ),
9546
9563
  ...props,
9547
- children: /* @__PURE__ */ jsx55(
9564
+ children: /* @__PURE__ */ jsx56(
9548
9565
  ScrollAreaPrimitive.ScrollAreaThumb,
9549
9566
  {
9550
9567
  "data-slot": "scroll-area-thumb",
@@ -9556,7 +9573,7 @@ function ScrollBar({
9556
9573
  }
9557
9574
 
9558
9575
  // src/components/ui/progress.tsx
9559
- import { jsx as jsx56 } from "react/jsx-runtime";
9576
+ import { jsx as jsx57 } from "react/jsx-runtime";
9560
9577
  var progressFillByStatus = {
9561
9578
  active: "bg-[var(--primary)]",
9562
9579
  success: "bg-[var(--success)]",
@@ -9577,7 +9594,7 @@ function Progress({
9577
9594
  const clamped = Math.max(0, Math.min(safeMax, value));
9578
9595
  const percent = clamped / safeMax * 100;
9579
9596
  const w = typeof width === "number" ? `${width}px` : width;
9580
- return /* @__PURE__ */ jsx56(
9597
+ return /* @__PURE__ */ jsx57(
9581
9598
  "div",
9582
9599
  {
9583
9600
  role: "progressbar",
@@ -9591,7 +9608,7 @@ function Progress({
9591
9608
  ),
9592
9609
  style: { width: w, height: `${height}px`, ...style },
9593
9610
  ...props,
9594
- children: /* @__PURE__ */ jsx56(
9611
+ children: /* @__PURE__ */ jsx57(
9595
9612
  "div",
9596
9613
  {
9597
9614
  className: cn(
@@ -9606,10 +9623,10 @@ function Progress({
9606
9623
  }
9607
9624
 
9608
9625
  // src/components/ui/tree-view.tsx
9609
- import * as React46 from "react";
9626
+ import * as React45 from "react";
9610
9627
  import { ChevronRight as ChevronRight3 } from "lucide-react";
9611
9628
  import { cva as cva25 } from "class-variance-authority";
9612
- import { jsx as jsx57, jsxs as jsxs50 } from "react/jsx-runtime";
9629
+ import { jsx as jsx58, jsxs as jsxs50 } from "react/jsx-runtime";
9613
9630
  var treeViewVariants = cva25(
9614
9631
  "m-0 list-none p-[var(--space-1)] text-body-sm text-foreground"
9615
9632
  );
@@ -9712,27 +9729,27 @@ function TreeView({
9712
9729
  ...rest
9713
9730
  }) {
9714
9731
  const isExpandedControlled = expandedIds !== void 0;
9715
- const [internalExpanded, setInternalExpanded] = React46.useState(
9732
+ const [internalExpanded, setInternalExpanded] = React45.useState(
9716
9733
  () => defaultExpandedIds ?? []
9717
9734
  );
9718
9735
  const expandedList = isExpandedControlled ? expandedIds : internalExpanded;
9719
- const expandedSet = React46.useMemo(() => new Set(expandedList), [expandedList]);
9720
- const items = React46.useMemo(
9736
+ const expandedSet = React45.useMemo(() => new Set(expandedList), [expandedList]);
9737
+ const items = React45.useMemo(
9721
9738
  () => flattenVisibleNodes(nodes, getChildren, expandedSet),
9722
9739
  [nodes, getChildren, expandedSet]
9723
9740
  );
9724
- const [focusedId, setFocusedId] = React46.useState(null);
9741
+ const [focusedId, setFocusedId] = React45.useState(null);
9725
9742
  const visibleIds = items.map((item) => item.id);
9726
9743
  const activeId = focusedId && visibleIds.includes(focusedId) ? focusedId : selectedId && visibleIds.includes(selectedId) ? selectedId : visibleIds[0] ?? null;
9727
- const itemRefs = React46.useRef(/* @__PURE__ */ new Map());
9728
- const commitExpanded = React46.useCallback(
9744
+ const itemRefs = React45.useRef(/* @__PURE__ */ new Map());
9745
+ const commitExpanded = React45.useCallback(
9729
9746
  (next) => {
9730
9747
  if (!isExpandedControlled) setInternalExpanded(next);
9731
9748
  onExpandedChange?.(next);
9732
9749
  },
9733
9750
  [isExpandedControlled, onExpandedChange]
9734
9751
  );
9735
- const setExpanded = React46.useCallback(
9752
+ const setExpanded = React45.useCallback(
9736
9753
  (id, expand) => {
9737
9754
  const has = expandedSet.has(id);
9738
9755
  if (expand && !has) {
@@ -9743,7 +9760,7 @@ function TreeView({
9743
9760
  },
9744
9761
  [commitExpanded, expandedList, expandedSet]
9745
9762
  );
9746
- const focusItem = React46.useCallback((id) => {
9763
+ const focusItem = React45.useCallback((id) => {
9747
9764
  setFocusedId(id);
9748
9765
  itemRefs.current.get(id)?.focus();
9749
9766
  }, []);
@@ -9813,7 +9830,7 @@ function TreeView({
9813
9830
  },
9814
9831
  className: treeItemRowVariants({ selected }),
9815
9832
  children: [
9816
- hasChildren ? /* @__PURE__ */ jsx57(
9833
+ hasChildren ? /* @__PURE__ */ jsx58(
9817
9834
  "span",
9818
9835
  {
9819
9836
  "data-slot": "treeitem-toggle",
@@ -9823,7 +9840,7 @@ function TreeView({
9823
9840
  setExpanded(node.id, !expanded);
9824
9841
  },
9825
9842
  className: "flex size-[var(--space-4)] shrink-0 items-center justify-center text-text-tertiary",
9826
- children: /* @__PURE__ */ jsx57(
9843
+ children: /* @__PURE__ */ jsx58(
9827
9844
  ChevronRight3,
9828
9845
  {
9829
9846
  "aria-hidden": "true",
@@ -9836,7 +9853,7 @@ function TreeView({
9836
9853
  }
9837
9854
  )
9838
9855
  }
9839
- ) : /* @__PURE__ */ jsx57(
9856
+ ) : /* @__PURE__ */ jsx58(
9840
9857
  "span",
9841
9858
  {
9842
9859
  "data-slot": "treeitem-spacer",
@@ -9844,18 +9861,18 @@ function TreeView({
9844
9861
  className: "size-[var(--space-4)] shrink-0"
9845
9862
  }
9846
9863
  ),
9847
- /* @__PURE__ */ jsx57("span", { className: "flex min-w-0 flex-1 items-center gap-[var(--space-2)]", children: renderItem(node, itemState) })
9864
+ /* @__PURE__ */ jsx58("span", { className: "flex min-w-0 flex-1 items-center gap-[var(--space-2)]", children: renderItem(node, itemState) })
9848
9865
  ]
9849
9866
  }
9850
9867
  ),
9851
- hasChildren && expanded && children ? /* @__PURE__ */ jsx57("ul", { role: "group", "data-slot": "tree-group", className: "m-0 list-none p-0", children: renderLevel(children, depth + 1) }) : null
9868
+ hasChildren && expanded && children ? /* @__PURE__ */ jsx58("ul", { role: "group", "data-slot": "tree-group", className: "m-0 list-none p-0", children: renderLevel(children, depth + 1) }) : null
9852
9869
  ]
9853
9870
  },
9854
9871
  node.id
9855
9872
  );
9856
9873
  });
9857
9874
  }
9858
- return /* @__PURE__ */ jsx57(
9875
+ return /* @__PURE__ */ jsx58(
9859
9876
  "ul",
9860
9877
  {
9861
9878
  role: "tree",
@@ -9871,7 +9888,7 @@ function TreeView({
9871
9888
  }
9872
9889
 
9873
9890
  // src/components/branding/olun-logo.tsx
9874
- import { jsx as jsx58, jsxs as jsxs51 } from "react/jsx-runtime";
9891
+ import { jsx as jsx59, jsxs as jsxs51 } from "react/jsx-runtime";
9875
9892
  var SYMBOL_LARGE = { stroke: 24, dotX: 184, dotY: 180, dotR: 13 };
9876
9893
  var SYMBOL_SMALL = { stroke: 18, dotX: 185, dotY: 175, dotR: 22 };
9877
9894
  function OlunSymbol({ size = 28, className }) {
@@ -9887,7 +9904,7 @@ function OlunSymbol({ size = 28, className }) {
9887
9904
  className,
9888
9905
  "aria-hidden": "true",
9889
9906
  children: [
9890
- /* @__PURE__ */ jsx58(
9907
+ /* @__PURE__ */ jsx59(
9891
9908
  "circle",
9892
9909
  {
9893
9910
  cx: "108",
@@ -9899,7 +9916,7 @@ function OlunSymbol({ size = 28, className }) {
9899
9916
  style: { color: "var(--text-primary)" }
9900
9917
  }
9901
9918
  ),
9902
- /* @__PURE__ */ jsx58("circle", { cx: g.dotX, cy: g.dotY, r: g.dotR, fill: "var(--accent-pop)" })
9919
+ /* @__PURE__ */ jsx59("circle", { cx: g.dotX, cy: g.dotY, r: g.dotR, fill: "var(--accent-pop)" })
9903
9920
  ]
9904
9921
  }
9905
9922
  );
@@ -9920,7 +9937,7 @@ function OlunLogo({
9920
9937
  gap: "var(--space-3)"
9921
9938
  },
9922
9939
  children: [
9923
- showSymbol && /* @__PURE__ */ jsx58(OlunSymbol, { size: symbolSize }),
9940
+ showSymbol && /* @__PURE__ */ jsx59(OlunSymbol, { size: symbolSize }),
9924
9941
  /* @__PURE__ */ jsxs51(
9925
9942
  "span",
9926
9943
  {
@@ -9933,7 +9950,7 @@ function OlunLogo({
9933
9950
  },
9934
9951
  children: [
9935
9952
  "OLUN",
9936
- !showSymbol && /* @__PURE__ */ jsx58("span", { style: { color: "var(--accent)" }, children: "." })
9953
+ !showSymbol && /* @__PURE__ */ jsx59("span", { style: { color: "var(--accent)" }, children: "." })
9937
9954
  ]
9938
9955
  }
9939
9956
  )
@@ -9944,11 +9961,11 @@ function OlunLogo({
9944
9961
 
9945
9962
  // src/components/branding/theme-toggle.tsx
9946
9963
  import { Sun, Moon } from "lucide-react";
9947
- import { jsx as jsx59 } from "react/jsx-runtime";
9964
+ import { jsx as jsx60 } from "react/jsx-runtime";
9948
9965
  function ThemeToggle({ className }) {
9949
9966
  const { resolvedTheme, toggleTheme } = useOlunTheme();
9950
9967
  const Icon = resolvedTheme === "dark" ? Moon : Sun;
9951
- return /* @__PURE__ */ jsx59(
9968
+ return /* @__PURE__ */ jsx60(
9952
9969
  "button",
9953
9970
  {
9954
9971
  onClick: () => toggleTheme(),
@@ -9960,14 +9977,14 @@ function ThemeToggle({ className }) {
9960
9977
  ),
9961
9978
  "aria-label": "\uD14C\uB9C8 \uC804\uD658",
9962
9979
  title: resolvedTheme === "dark" ? "\uB77C\uC774\uD2B8 \uBAA8\uB4DC\uB85C" : "\uB2E4\uD06C \uBAA8\uB4DC\uB85C",
9963
- children: /* @__PURE__ */ jsx59(Icon, { className: "size-[18px]", strokeWidth: 1.75 })
9980
+ children: /* @__PURE__ */ jsx60(Icon, { className: "size-[18px]", strokeWidth: 1.75 })
9964
9981
  }
9965
9982
  );
9966
9983
  }
9967
9984
 
9968
9985
  // src/components/branding/theme-fab.tsx
9969
9986
  import { Sun as Sun2, Moon as Moon2 } from "lucide-react";
9970
- import { jsx as jsx60 } from "react/jsx-runtime";
9987
+ import { jsx as jsx61 } from "react/jsx-runtime";
9971
9988
  function ThemeFab({ variant = "square" } = {}) {
9972
9989
  const { mounted, resolvedTheme, toggleTheme } = useOlunTheme();
9973
9990
  if (!mounted) {
@@ -10007,7 +10024,7 @@ function ThemeFab({ variant = "square" } = {}) {
10007
10024
  WebkitBackdropFilter: "blur(16px)",
10008
10025
  zIndex: 9999
10009
10026
  };
10010
- return /* @__PURE__ */ jsx60(
10027
+ return /* @__PURE__ */ jsx61(
10011
10028
  "button",
10012
10029
  {
10013
10030
  onClick: () => toggleTheme(),
@@ -10032,7 +10049,7 @@ function ThemeFab({ variant = "square" } = {}) {
10032
10049
  e.currentTarget.style.color = "var(--text-secondary)";
10033
10050
  }
10034
10051
  },
10035
- children: /* @__PURE__ */ jsx60(
10052
+ children: /* @__PURE__ */ jsx61(
10036
10053
  Icon,
10037
10054
  {
10038
10055
  size: isCircle ? 22 : 16,
@@ -10044,7 +10061,7 @@ function ThemeFab({ variant = "square" } = {}) {
10044
10061
  }
10045
10062
 
10046
10063
  // src/components/logos/organization-logo.tsx
10047
- import { jsx as jsx61 } from "react/jsx-runtime";
10064
+ import { jsx as jsx62 } from "react/jsx-runtime";
10048
10065
  var organizationLogoRegistry = {
10049
10066
  jbnu: {
10050
10067
  label: "\uC804\uBD81\uB300\uD559\uAD50 \uC5E0\uBE14\uB7FC",
@@ -10073,7 +10090,7 @@ function OrganizationLogo({
10073
10090
  }) {
10074
10091
  const asset = organizationLogoRegistry[organization];
10075
10092
  const isDecorative = ariaHidden === true || ariaHidden === "true";
10076
- return /* @__PURE__ */ jsx61(
10093
+ return /* @__PURE__ */ jsx62(
10077
10094
  "svg",
10078
10095
  {
10079
10096
  viewBox: asset.viewBox,
@@ -10091,7 +10108,7 @@ function OrganizationLogo({
10091
10108
  ...style
10092
10109
  },
10093
10110
  ...props,
10094
- children: asset.paths.map((path) => /* @__PURE__ */ jsx61("path", { d: path }, path))
10111
+ children: asset.paths.map((path) => /* @__PURE__ */ jsx62("path", { d: path }, path))
10095
10112
  }
10096
10113
  );
10097
10114
  }