@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/CHANGELOG.md +11 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +980 -963
- package/package.json +3 -1
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:
|
|
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
|
-
|
|
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:
|
|
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:
|
|
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:
|
|
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
|
|
3520
|
-
import { Dialog as
|
|
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
|
-
|
|
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/
|
|
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__ */
|
|
3856
|
+
return /* @__PURE__ */ jsx23(SheetPrimitive.Root, { "data-slot": "sheet", ...props });
|
|
3584
3857
|
}
|
|
3585
3858
|
function SheetTrigger({
|
|
3586
3859
|
...props
|
|
3587
3860
|
}) {
|
|
3588
|
-
return /* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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-
|
|
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__ */
|
|
3652
|
-
/* @__PURE__ */
|
|
3653
|
-
/* @__PURE__ */
|
|
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
|
-
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
4030
|
+
return /* @__PURE__ */ jsx23(
|
|
3763
4031
|
SheetPrimitive.Description,
|
|
3764
4032
|
{
|
|
3765
4033
|
"data-slot": "sheet-description",
|
|
3766
|
-
className: cn("text-sm text-
|
|
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
|
|
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
|
|
3792
|
-
|
|
3793
|
-
|
|
3794
|
-
|
|
3795
|
-
var
|
|
3796
|
-
|
|
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 =
|
|
3812
|
-
var DialogContent =
|
|
3813
|
-
|
|
3814
|
-
|
|
3815
|
-
|
|
3816
|
-
|
|
3817
|
-
|
|
3818
|
-
|
|
3819
|
-
|
|
3820
|
-
|
|
3821
|
-
|
|
3822
|
-
|
|
3823
|
-
|
|
3824
|
-
|
|
3825
|
-
|
|
3826
|
-
|
|
3827
|
-
|
|
3828
|
-
|
|
3829
|
-
|
|
3830
|
-
|
|
3831
|
-
|
|
3832
|
-
|
|
3833
|
-
|
|
3834
|
-
|
|
3835
|
-
|
|
3836
|
-
|
|
3837
|
-
|
|
3838
|
-
|
|
3839
|
-
|
|
3840
|
-
|
|
3841
|
-
|
|
3842
|
-
|
|
3843
|
-
|
|
3844
|
-
|
|
3845
|
-
|
|
3846
|
-
|
|
3847
|
-
|
|
3848
|
-
|
|
3849
|
-
|
|
3850
|
-
|
|
3851
|
-
|
|
3852
|
-
|
|
3853
|
-
|
|
3854
|
-
"
|
|
3855
|
-
|
|
3856
|
-
|
|
3857
|
-
|
|
3858
|
-
|
|
3859
|
-
|
|
3860
|
-
|
|
3861
|
-
|
|
3862
|
-
|
|
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__ */
|
|
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__ */
|
|
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 =
|
|
3898
|
-
|
|
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 =
|
|
3909
|
-
var DialogDescription =
|
|
3910
|
-
|
|
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 =
|
|
3918
|
-
var DialogEyebrow =
|
|
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 =
|
|
4197
|
+
var DialogRawContent = DialogPrimitive2.Content;
|
|
3931
4198
|
|
|
3932
|
-
// src/
|
|
3933
|
-
import
|
|
3934
|
-
|
|
3935
|
-
|
|
3936
|
-
|
|
3937
|
-
|
|
3938
|
-
|
|
3939
|
-
|
|
3940
|
-
|
|
3941
|
-
|
|
3942
|
-
|
|
3943
|
-
|
|
3944
|
-
|
|
3945
|
-
|
|
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
|
|
3951
|
-
|
|
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
|
|
3978
|
-
|
|
3979
|
-
|
|
3980
|
-
|
|
3981
|
-
|
|
3982
|
-
|
|
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
|
-
|
|
4016
|
-
wide &&
|
|
4342
|
+
presetSurface.form.content,
|
|
4343
|
+
wide && presetSurface.form.wideContent
|
|
4017
4344
|
),
|
|
4018
|
-
children: /* @__PURE__ */
|
|
4019
|
-
|
|
4020
|
-
|
|
4021
|
-
|
|
4022
|
-
|
|
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__ */
|
|
4025
|
-
/* @__PURE__ */
|
|
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:
|
|
4359
|
+
className: presetSurface.form.footer,
|
|
4030
4360
|
children: [
|
|
4031
|
-
/* @__PURE__ */
|
|
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: () =>
|
|
4368
|
+
onClick: () => guardOpenChange(false),
|
|
4039
4369
|
children: cancelLabel
|
|
4040
4370
|
}
|
|
4041
4371
|
),
|
|
4042
|
-
/* @__PURE__ */
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
4103
|
-
width === "wide" &&
|
|
4400
|
+
presetSurface.info.content,
|
|
4401
|
+
width === "wide" && presetSurface.info.wideContent
|
|
4104
4402
|
),
|
|
4105
4403
|
children: [
|
|
4106
|
-
/* @__PURE__ */
|
|
4107
|
-
/* @__PURE__ */
|
|
4108
|
-
description ? /* @__PURE__ */
|
|
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:
|
|
4410
|
+
className: presetSurface.info.description,
|
|
4113
4411
|
children: description
|
|
4114
4412
|
}
|
|
4115
4413
|
) : null
|
|
4116
4414
|
] }),
|
|
4117
|
-
/* @__PURE__ */
|
|
4118
|
-
/* @__PURE__ */
|
|
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
|
|
4140
|
-
import { cva as
|
|
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
|
|
4144
|
-
var chipVariants =
|
|
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 =
|
|
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
|
|
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 = "
|
|
4468
|
-
|
|
4469
|
-
tone,
|
|
4536
|
+
variant = "filter",
|
|
4537
|
+
tone = "neutral",
|
|
4470
4538
|
size = "md",
|
|
4471
|
-
pressed =
|
|
4472
|
-
|
|
4473
|
-
|
|
4474
|
-
|
|
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
|
|
4485
|
-
|
|
4486
|
-
|
|
4487
|
-
|
|
4488
|
-
|
|
4489
|
-
|
|
4490
|
-
|
|
4491
|
-
|
|
4492
|
-
|
|
4493
|
-
|
|
4494
|
-
|
|
4495
|
-
|
|
4496
|
-
|
|
4497
|
-
|
|
4498
|
-
|
|
4499
|
-
|
|
4500
|
-
|
|
4501
|
-
|
|
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
|
-
|
|
4597
|
+
Comp,
|
|
4506
4598
|
{
|
|
4507
4599
|
ref,
|
|
4508
|
-
|
|
4509
|
-
"data-
|
|
4510
|
-
"data-
|
|
4511
|
-
"
|
|
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
|
-
|
|
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
|
-
|
|
4534
|
-
|
|
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": "
|
|
4541
|
-
"data-
|
|
4542
|
-
className:
|
|
4543
|
-
children:
|
|
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
|
-
|
|
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
|
|
4631
|
+
import { jsx as jsx28, jsxs as jsxs26 } from "react/jsx-runtime";
|
|
4557
4632
|
function Popover({ modal = false, ...props }) {
|
|
4558
|
-
return /* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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
|
|
4616
|
-
import { jsx as
|
|
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
|
-
|
|
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
|
-
|
|
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__ */
|
|
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__ */
|
|
4702
|
-
/* @__PURE__ */
|
|
4703
|
-
description ? /* @__PURE__ */
|
|
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__ */
|
|
4725
|
-
/* @__PURE__ */
|
|
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__ */
|
|
4737
|
-
/* @__PURE__ */
|
|
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__ */
|
|
4750
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
4766
|
-
footer ? /* @__PURE__ */
|
|
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
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
4994
|
+
/* @__PURE__ */ jsx30("div", { className: "mb-[var(--space-3)] text-sm font-semibold", children: "\uD544\uD130" }),
|
|
4935
4995
|
collapsedContent,
|
|
4936
|
-
clearFiltersButton ? /* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
4986
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
5014
|
-
actions ? /* @__PURE__ */
|
|
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
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
5536
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
5566
|
-
columns.map((column, columnIndex) => /* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
5597
|
-
/* @__PURE__ */
|
|
5598
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
5777
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
6151
|
+
children: /* @__PURE__ */ jsx32("div", { className: "h-full w-1/3 animate-pulse bg-[var(--primary)]" })
|
|
6092
6152
|
}
|
|
6093
6153
|
) : null,
|
|
6094
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
6150
|
-
/* @__PURE__ */
|
|
6209
|
+
/* @__PURE__ */ jsx32("span", { className: "truncate", children: column.header }),
|
|
6210
|
+
/* @__PURE__ */ jsx32(SortIcon, { sort: sortBy, columnKey: column.key })
|
|
6151
6211
|
]
|
|
6152
6212
|
}
|
|
6153
|
-
) : /* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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
|
|
6307
|
+
import { jsx as jsx33, jsxs as jsxs31 } from "react/jsx-runtime";
|
|
6248
6308
|
function DropdownMenu({
|
|
6249
6309
|
...props
|
|
6250
6310
|
}) {
|
|
6251
|
-
return /* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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
|
|
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__ */
|
|
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__ */
|
|
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
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
6939
|
+
count > 0 && actions.length > 0 ? /* @__PURE__ */ jsx35(Divider, {}) : null,
|
|
6880
6940
|
actionGroup,
|
|
6881
|
-
/* @__PURE__ */
|
|
6882
|
-
/* @__PURE__ */
|
|
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__ */
|
|
6983
|
+
count > 0 && actions.length > 0 ? /* @__PURE__ */ jsx35(Divider, {}) : null,
|
|
6924
6984
|
actionGroup,
|
|
6925
|
-
/* @__PURE__ */
|
|
6926
|
-
/* @__PURE__ */
|
|
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
|
|
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
|
|
6972
|
-
|
|
6973
|
-
|
|
6974
|
-
|
|
6975
|
-
|
|
6976
|
-
|
|
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__ */
|
|
6996
|
-
/* @__PURE__ */
|
|
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:
|
|
7001
|
-
children:
|
|
7022
|
+
className: presetSurface.confirm.title,
|
|
7023
|
+
children: title2
|
|
7002
7024
|
}
|
|
7003
7025
|
),
|
|
7004
|
-
description ? /* @__PURE__ */
|
|
7026
|
+
description ? /* @__PURE__ */ jsx36(
|
|
7005
7027
|
DialogDescription,
|
|
7006
7028
|
{
|
|
7007
7029
|
"data-slot": "dialog-description",
|
|
7008
|
-
className:
|
|
7030
|
+
className: presetSurface.confirm.description,
|
|
7009
7031
|
children: description
|
|
7010
7032
|
}
|
|
7011
7033
|
) : null
|
|
7012
7034
|
] }) }),
|
|
7013
|
-
children != null ? /* @__PURE__ */
|
|
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:
|
|
7040
|
+
className: presetSurface.confirm.footer,
|
|
7019
7041
|
children: [
|
|
7020
|
-
/* @__PURE__ */
|
|
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: () =>
|
|
7049
|
+
onClick: () => guardOpenChange(false),
|
|
7028
7050
|
children: cancelLabel
|
|
7029
7051
|
}
|
|
7030
7052
|
),
|
|
7031
|
-
/* @__PURE__ */
|
|
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:
|
|
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__ */
|
|
7048
|
-
/* @__PURE__ */
|
|
7049
|
-
/* @__PURE__ */
|
|
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
|
-
|
|
7056
|
-
mobilePresentation === "sheet" &&
|
|
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
|
|
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__ */
|
|
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
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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
|
|
7163
|
-
import {
|
|
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 =
|
|
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__ */
|
|
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:
|
|
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__ */
|
|
7224
|
-
description ? /* @__PURE__ */
|
|
7240
|
+
/* @__PURE__ */ jsx39(SheetTitle, { className: actionSheetTitleClassName, children: title2 }),
|
|
7241
|
+
description ? /* @__PURE__ */ jsx39(SheetDescription, { className: actionSheetDescriptionClassName, children: description }) : null
|
|
7225
7242
|
] }),
|
|
7226
|
-
/* @__PURE__ */
|
|
7243
|
+
/* @__PURE__ */ jsx39(OverlayCloseButton, { label: closeLabel })
|
|
7227
7244
|
] }),
|
|
7228
|
-
/* @__PURE__ */
|
|
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__ */
|
|
7241
|
-
/* @__PURE__ */
|
|
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
|
|
7254
|
-
import { jsx as
|
|
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 =
|
|
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__ */
|
|
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
|
|
7296
|
-
import { jsx as
|
|
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 =
|
|
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__ */
|
|
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__ */
|
|
7379
|
+
/* @__PURE__ */ jsx41("span", { children: primary })
|
|
7363
7380
|
]
|
|
7364
7381
|
}
|
|
7365
7382
|
),
|
|
7366
|
-
secondary != null ? /* @__PURE__ */
|
|
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
|
|
7388
|
-
import { jsx as
|
|
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 =
|
|
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__ */
|
|
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__ */
|
|
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
|
|
7485
|
+
import * as React34 from "react";
|
|
7469
7486
|
import { cva as cva13 } from "class-variance-authority";
|
|
7470
|
-
import { jsx as
|
|
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 =
|
|
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__ */
|
|
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
|
|
7551
|
+
import * as React35 from "react";
|
|
7535
7552
|
import { cva as cva14 } from "class-variance-authority";
|
|
7536
|
-
import { jsx as
|
|
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 =
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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:
|
|
7664
|
+
children: title2
|
|
7648
7665
|
}
|
|
7649
7666
|
),
|
|
7650
|
-
description ? /* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
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
|
|
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
|
|
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 =
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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:
|
|
7753
|
+
children: title2
|
|
7737
7754
|
}
|
|
7738
7755
|
),
|
|
7739
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
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
|
|
7781
|
+
import * as React37 from "react";
|
|
7765
7782
|
import { cva as cva16 } from "class-variance-authority";
|
|
7766
|
-
import { jsx as
|
|
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 =
|
|
7811
|
-
({ className, shape, style, ...props }, ref) => /* @__PURE__ */
|
|
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 =
|
|
7825
|
-
({ className, lines = 3, widths = defaultTextWidths, ...props }, ref) => /* @__PURE__ */
|
|
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__ */
|
|
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 =
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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 =
|
|
7902
|
-
({ className, size, label = "\uB85C\uB529 \uC911", ...props }, ref) => /* @__PURE__ */
|
|
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
|
|
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
|
|
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__ */
|
|
7951
|
-
/* @__PURE__ */
|
|
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
|
|
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__ */
|
|
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__ */
|
|
8071
|
+
children: /* @__PURE__ */ jsx48(Icon, { "aria-hidden": "true", "data-slot": "pagination-icon" })
|
|
8055
8072
|
}
|
|
8056
8073
|
);
|
|
8057
8074
|
}
|
|
8058
|
-
var Pagination =
|
|
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__ */
|
|
8095
|
-
showPageSize ? /* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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
|
|
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__ */
|
|
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__ */
|
|
8253
|
-
/* @__PURE__ */
|
|
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
|
|
8281
|
+
import * as React39 from "react";
|
|
8265
8282
|
import { cva as cva19 } from "class-variance-authority";
|
|
8266
|
-
import { jsx as
|
|
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__ */
|
|
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 =
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
8419
|
+
/* @__PURE__ */ jsx50("span", { className: "truncate", children: getStatusLabel(status) })
|
|
8403
8420
|
]
|
|
8404
8421
|
}
|
|
8405
8422
|
) : null,
|
|
8406
|
-
/* @__PURE__ */
|
|
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
|
|
8439
|
+
import * as React40 from "react";
|
|
8423
8440
|
import { cva as cva20 } from "class-variance-authority";
|
|
8424
|
-
import { jsx as
|
|
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 =
|
|
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 =
|
|
8576
|
+
const onCloseRef = React40.useRef(onClose);
|
|
8560
8577
|
onCloseRef.current = onClose;
|
|
8561
|
-
const timerRef =
|
|
8562
|
-
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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 =
|
|
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] =
|
|
8671
|
-
|
|
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__ */
|
|
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
|
|
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
|
|
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 =
|
|
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 =
|
|
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] =
|
|
8860
|
+
const [uncontrolledSlots, setUncontrolledSlots] = React41.useState(
|
|
8844
8861
|
() => toDigitsArray(onlyDigits(defaultValue, length), length)
|
|
8845
8862
|
);
|
|
8846
|
-
const resolvedSlots =
|
|
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 =
|
|
8868
|
+
const cellsRef = React41.useRef([]);
|
|
8852
8869
|
const groupDescribedBy = [helperId, errorId].filter(Boolean).join(" ") || void 0;
|
|
8853
|
-
const setResolvedValue =
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
9019
|
-
] }) : /* @__PURE__ */
|
|
9035
|
+
/* @__PURE__ */ jsx52("span", { children: errorText })
|
|
9036
|
+
] }) : /* @__PURE__ */ jsx52("span", { children: helperText })
|
|
9020
9037
|
}
|
|
9021
9038
|
) : null,
|
|
9022
|
-
name ? /* @__PURE__ */
|
|
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
|
|
9044
|
-
import { Search, X as
|
|
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
|
|
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 =
|
|
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 =
|
|
9128
|
-
const [hasText, setHasText] =
|
|
9144
|
+
const inputRef = React42.useRef(null);
|
|
9145
|
+
const [hasText, setHasText] = React42.useState(
|
|
9129
9146
|
() => hasVisibleValue(value ?? defaultValue)
|
|
9130
9147
|
);
|
|
9131
|
-
|
|
9132
|
-
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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
|
|
9219
|
+
import * as React43 from "react";
|
|
9203
9220
|
import { cva as cva23 } from "class-variance-authority";
|
|
9204
|
-
import { jsx as
|
|
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 =
|
|
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] =
|
|
9263
|
+
const [uncontrolledValue, setUncontrolledValue] = React43.useState(
|
|
9247
9264
|
() => toSelectionSet(defaultValue)
|
|
9248
9265
|
);
|
|
9249
|
-
const selectedValues =
|
|
9266
|
+
const selectedValues = React43.useMemo(
|
|
9250
9267
|
() => isControlled ? toSelectionSet(value) : uncontrolledValue,
|
|
9251
9268
|
[isControlled, uncontrolledValue, value]
|
|
9252
9269
|
);
|
|
9253
|
-
const toggleValue =
|
|
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 =
|
|
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__ */
|
|
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
|
|
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
|
|
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 =
|
|
9414
|
+
var RadioGroupContext = React44.createContext({
|
|
9398
9415
|
appearance: "plain",
|
|
9399
9416
|
density: "comfortable"
|
|
9400
9417
|
});
|
|
9401
|
-
var RadioGroup =
|
|
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 =
|
|
9429
|
+
const contextValue = React44.useMemo(
|
|
9413
9430
|
() => ({ appearance, density }),
|
|
9414
9431
|
[appearance, density]
|
|
9415
9432
|
);
|
|
9416
|
-
return /* @__PURE__ */
|
|
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 =
|
|
9440
|
-
const { appearance, density } =
|
|
9441
|
-
const generatedId =
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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
|
|
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__ */
|
|
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__ */
|
|
9525
|
-
/* @__PURE__ */
|
|
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__ */
|
|
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__ */
|
|
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
|
|
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__ */
|
|
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__ */
|
|
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
|
|
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
|
|
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] =
|
|
9732
|
+
const [internalExpanded, setInternalExpanded] = React45.useState(
|
|
9716
9733
|
() => defaultExpandedIds ?? []
|
|
9717
9734
|
);
|
|
9718
9735
|
const expandedList = isExpandedControlled ? expandedIds : internalExpanded;
|
|
9719
|
-
const expandedSet =
|
|
9720
|
-
const items =
|
|
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] =
|
|
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 =
|
|
9728
|
-
const commitExpanded =
|
|
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 =
|
|
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 =
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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__ */
|
|
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
|
|
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__ */
|
|
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__ */
|
|
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
|
|
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__ */
|
|
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__ */
|
|
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
|
|
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__ */
|
|
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__ */
|
|
10111
|
+
children: asset.paths.map((path) => /* @__PURE__ */ jsx62("path", { d: path }, path))
|
|
10095
10112
|
}
|
|
10096
10113
|
);
|
|
10097
10114
|
}
|