@olundot/ui 0.8.1 → 0.9.0
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 +16 -0
- package/dist/index.d.ts +89 -52
- package/dist/index.js +746 -611
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -4138,6 +4138,9 @@ function DataTableInner({
|
|
|
4138
4138
|
selectable = false,
|
|
4139
4139
|
selectedIds,
|
|
4140
4140
|
onSelectionChange,
|
|
4141
|
+
selectionBar = "top",
|
|
4142
|
+
activeRowId,
|
|
4143
|
+
onRowContextMenu,
|
|
4141
4144
|
sortBy,
|
|
4142
4145
|
onSortChange,
|
|
4143
4146
|
loading = false,
|
|
@@ -4185,7 +4188,7 @@ function DataTableInner({
|
|
|
4185
4188
|
className: cn(dataTableVariants({ density, surface, className })),
|
|
4186
4189
|
...props,
|
|
4187
4190
|
children: [
|
|
4188
|
-
selectable ? /* @__PURE__ */ jsx24(
|
|
4191
|
+
selectable && selectionBar === "top" ? /* @__PURE__ */ jsx24(
|
|
4189
4192
|
"div",
|
|
4190
4193
|
{
|
|
4191
4194
|
"data-slot": "data-table-selection-bar",
|
|
@@ -4299,16 +4302,19 @@ function DataTableInner({
|
|
|
4299
4302
|
) : data.length === 0 ? /* @__PURE__ */ jsx24("div", { "data-slot": "data-table-empty", className: "border-t border-[var(--border-subtle)] p-[var(--space-2)]", children: emptyState }) : /* @__PURE__ */ jsx24("div", { role: "rowgroup", children: data.map((row) => {
|
|
4300
4303
|
const rowId = getRowId(row, keyField);
|
|
4301
4304
|
const selected = resolvedSelectedIds.has(rowId);
|
|
4305
|
+
const visuallySelected = selected || rowId === activeRowId;
|
|
4302
4306
|
const href = rowHref?.(row);
|
|
4303
4307
|
return /* @__PURE__ */ jsxs23(
|
|
4304
4308
|
"div",
|
|
4305
4309
|
{
|
|
4306
4310
|
"data-slot": "data-table-row",
|
|
4311
|
+
"data-row-id": rowId,
|
|
4307
4312
|
"data-href": href,
|
|
4308
4313
|
role: "row",
|
|
4309
4314
|
tabIndex: href ? 0 : void 0,
|
|
4310
|
-
className: cn(dataTableRowVariants({ interactive: Boolean(href), selected })),
|
|
4315
|
+
className: cn(dataTableRowVariants({ interactive: Boolean(href), selected: visuallySelected })),
|
|
4311
4316
|
style: { gridTemplateColumns },
|
|
4317
|
+
onContextMenu: (event) => onRowContextMenu?.(rowId, event),
|
|
4312
4318
|
onClick: (event) => {
|
|
4313
4319
|
if (!href || isInteractiveTarget(event.target)) {
|
|
4314
4320
|
return;
|
|
@@ -4388,6 +4394,7 @@ function DataTableInner({
|
|
|
4388
4394
|
children: data.map((row) => {
|
|
4389
4395
|
const rowId = getRowId(row, keyField);
|
|
4390
4396
|
const selected = resolvedSelectedIds.has(rowId);
|
|
4397
|
+
const visuallySelected = selected || rowId === activeRowId;
|
|
4391
4398
|
const href = rowHref?.(row);
|
|
4392
4399
|
const primaryText = getAccessibleCellText(row, primaryColumn, rowId);
|
|
4393
4400
|
const primaryLabel = primaryColumn ? getHeaderLabel(primaryColumn) : "\uD589";
|
|
@@ -4395,6 +4402,7 @@ function DataTableInner({
|
|
|
4395
4402
|
"div",
|
|
4396
4403
|
{
|
|
4397
4404
|
"data-slot": "data-table-mobile-card",
|
|
4405
|
+
"data-row-id": rowId,
|
|
4398
4406
|
"data-href": href,
|
|
4399
4407
|
role: "listitem",
|
|
4400
4408
|
tabIndex: href ? 0 : void 0,
|
|
@@ -4403,8 +4411,9 @@ function DataTableInner({
|
|
|
4403
4411
|
"flex min-w-0 flex-col gap-[var(--space-1-5)] border-t border-[var(--border-subtle)] px-[var(--space-2)] py-[var(--space-2)]",
|
|
4404
4412
|
"text-body-sm leading-compact text-foreground transition-colors motion-reduce:transition-none",
|
|
4405
4413
|
href ? "cursor-pointer hover:bg-[var(--action-hover)] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-[var(--focus-ring)]" : null,
|
|
4406
|
-
|
|
4414
|
+
visuallySelected ? "bg-[var(--action-selected)]" : null
|
|
4407
4415
|
),
|
|
4416
|
+
onContextMenu: (event) => onRowContextMenu?.(rowId, event),
|
|
4408
4417
|
onClick: (event) => {
|
|
4409
4418
|
if (!href || isInteractiveTarget(event.target)) {
|
|
4410
4419
|
return;
|
|
@@ -4482,220 +4491,24 @@ function DataTableInner({
|
|
|
4482
4491
|
var DataTable = React22.forwardRef(DataTableInner);
|
|
4483
4492
|
DataTable.displayName = "DataTable";
|
|
4484
4493
|
|
|
4485
|
-
// src/components/ui/confirm-dialog.tsx
|
|
4486
|
-
import * as React23 from "react";
|
|
4487
|
-
import { Fragment as Fragment7, jsx as jsx25, jsxs as jsxs24 } from "react/jsx-runtime";
|
|
4488
|
-
var confirmDialogContentClassName = cn(
|
|
4489
|
-
"fixed left-1/2 top-1/2 z-[var(--z-modal)]",
|
|
4490
|
-
"-translate-x-1/2 -translate-y-1/2",
|
|
4491
|
-
"w-[calc(100vw-2rem)] max-w-[420px]",
|
|
4492
|
-
"flex flex-col gap-[var(--space-3)]",
|
|
4493
|
-
"bg-[var(--bg-raised)] border border-[var(--border-subtle)]",
|
|
4494
|
-
"rounded-[var(--radius-lg)] p-[var(--space-3)] shadow-[var(--elevation-4)]",
|
|
4495
|
-
"text-foreground"
|
|
4496
|
-
);
|
|
4497
|
-
var confirmDialogTitleClassName = cn(
|
|
4498
|
-
"text-[18px] font-bold leading-snug text-foreground"
|
|
4499
|
-
);
|
|
4500
|
-
var confirmDialogDescriptionClassName = cn(
|
|
4501
|
-
"break-keep text-[14px] leading-relaxed text-text-secondary"
|
|
4502
|
-
);
|
|
4503
|
-
var confirmDialogFooterClassName = "flex items-center justify-end gap-[var(--space-1-5)]";
|
|
4504
|
-
function ConfirmDialog({
|
|
4505
|
-
open,
|
|
4506
|
-
onOpenChange,
|
|
4507
|
-
title,
|
|
4508
|
-
description,
|
|
4509
|
-
tone = "default",
|
|
4510
|
-
confirmLabel,
|
|
4511
|
-
cancelLabel = "\uCDE8\uC18C",
|
|
4512
|
-
onConfirm,
|
|
4513
|
-
loading = false
|
|
4514
|
-
}) {
|
|
4515
|
-
const [pending, setPending] = React23.useState(false);
|
|
4516
|
-
const busyRef = React23.useRef(false);
|
|
4517
|
-
const isBusy = loading || pending;
|
|
4518
|
-
const handleOpenChange = React23.useCallback(
|
|
4519
|
-
(nextOpen) => {
|
|
4520
|
-
if (!nextOpen && isBusy) {
|
|
4521
|
-
return;
|
|
4522
|
-
}
|
|
4523
|
-
onOpenChange(nextOpen);
|
|
4524
|
-
},
|
|
4525
|
-
[isBusy, onOpenChange]
|
|
4526
|
-
);
|
|
4527
|
-
const handleConfirm = React23.useCallback(async () => {
|
|
4528
|
-
if (busyRef.current || loading) {
|
|
4529
|
-
return;
|
|
4530
|
-
}
|
|
4531
|
-
busyRef.current = true;
|
|
4532
|
-
setPending(true);
|
|
4533
|
-
try {
|
|
4534
|
-
await onConfirm();
|
|
4535
|
-
onOpenChange(false);
|
|
4536
|
-
} finally {
|
|
4537
|
-
busyRef.current = false;
|
|
4538
|
-
setPending(false);
|
|
4539
|
-
}
|
|
4540
|
-
}, [loading, onConfirm, onOpenChange]);
|
|
4541
|
-
const dialogBody = /* @__PURE__ */ jsxs24(Fragment7, { children: [
|
|
4542
|
-
/* @__PURE__ */ jsx25("div", { className: "flex items-start justify-between gap-[var(--space-2)]", children: /* @__PURE__ */ jsxs24("div", { className: "min-w-0 space-y-[var(--space-1)]", children: [
|
|
4543
|
-
/* @__PURE__ */ jsx25(
|
|
4544
|
-
DialogTitle,
|
|
4545
|
-
{
|
|
4546
|
-
"data-slot": "dialog-title",
|
|
4547
|
-
className: confirmDialogTitleClassName,
|
|
4548
|
-
children: title
|
|
4549
|
-
}
|
|
4550
|
-
),
|
|
4551
|
-
description ? /* @__PURE__ */ jsx25(
|
|
4552
|
-
DialogDescription,
|
|
4553
|
-
{
|
|
4554
|
-
"data-slot": "dialog-description",
|
|
4555
|
-
className: confirmDialogDescriptionClassName,
|
|
4556
|
-
children: description
|
|
4557
|
-
}
|
|
4558
|
-
) : null
|
|
4559
|
-
] }) }),
|
|
4560
|
-
/* @__PURE__ */ jsxs24(
|
|
4561
|
-
"div",
|
|
4562
|
-
{
|
|
4563
|
-
"data-slot": "dialog-footer",
|
|
4564
|
-
className: confirmDialogFooterClassName,
|
|
4565
|
-
children: [
|
|
4566
|
-
/* @__PURE__ */ jsx25(Button, { variant: "secondary", disabled: isBusy, onClick: () => handleOpenChange(false), children: cancelLabel }),
|
|
4567
|
-
/* @__PURE__ */ jsx25(
|
|
4568
|
-
Button,
|
|
4569
|
-
{
|
|
4570
|
-
variant: tone === "destructive" ? "destructive" : "primary",
|
|
4571
|
-
loading: isBusy,
|
|
4572
|
-
onClick: handleConfirm,
|
|
4573
|
-
children: confirmLabel
|
|
4574
|
-
}
|
|
4575
|
-
)
|
|
4576
|
-
]
|
|
4577
|
-
}
|
|
4578
|
-
)
|
|
4579
|
-
] });
|
|
4580
|
-
return /* @__PURE__ */ jsx25(Dialog, { open, onOpenChange: handleOpenChange, children: /* @__PURE__ */ jsxs24(DialogPortal, { children: [
|
|
4581
|
-
/* @__PURE__ */ jsx25(DialogOverlay, {}),
|
|
4582
|
-
/* @__PURE__ */ jsx25(DialogRawContent, { "data-slot": "dialog-content", className: confirmDialogContentClassName, children: dialogBody })
|
|
4583
|
-
] }) });
|
|
4584
|
-
}
|
|
4585
|
-
|
|
4586
|
-
// src/components/ui/separator.tsx
|
|
4587
|
-
import { Separator as SeparatorPrimitive } from "radix-ui";
|
|
4588
|
-
import { jsx as jsx26 } from "react/jsx-runtime";
|
|
4589
|
-
function Separator({
|
|
4590
|
-
className,
|
|
4591
|
-
orientation = "horizontal",
|
|
4592
|
-
decorative = true,
|
|
4593
|
-
...props
|
|
4594
|
-
}) {
|
|
4595
|
-
return /* @__PURE__ */ jsx26(
|
|
4596
|
-
SeparatorPrimitive.Root,
|
|
4597
|
-
{
|
|
4598
|
-
"data-slot": "separator",
|
|
4599
|
-
decorative,
|
|
4600
|
-
orientation,
|
|
4601
|
-
className: cn(
|
|
4602
|
-
"shrink-0 bg-border data-[orientation=horizontal]:h-px data-[orientation=horizontal]:w-full data-[orientation=vertical]:h-full data-[orientation=vertical]:w-px",
|
|
4603
|
-
className
|
|
4604
|
-
),
|
|
4605
|
-
...props
|
|
4606
|
-
}
|
|
4607
|
-
);
|
|
4608
|
-
}
|
|
4609
|
-
|
|
4610
|
-
// src/components/ui/avatar.tsx
|
|
4611
|
-
import { Avatar as AvatarPrimitive } from "radix-ui";
|
|
4612
|
-
import { jsx as jsx27 } from "react/jsx-runtime";
|
|
4613
|
-
function Avatar({
|
|
4614
|
-
className,
|
|
4615
|
-
size = "md",
|
|
4616
|
-
...props
|
|
4617
|
-
}) {
|
|
4618
|
-
return /* @__PURE__ */ jsx27(
|
|
4619
|
-
AvatarPrimitive.Root,
|
|
4620
|
-
{
|
|
4621
|
-
"data-slot": "avatar",
|
|
4622
|
-
"data-size": size,
|
|
4623
|
-
className: cn(
|
|
4624
|
-
"group/avatar relative flex shrink-0 overflow-hidden rounded-full select-none",
|
|
4625
|
-
"border border-[var(--border-subtle)] bg-[var(--bg-raised)] text-text-secondary",
|
|
4626
|
-
"h-9 w-9",
|
|
4627
|
-
"data-[size=sm]:h-8 data-[size=sm]:w-8",
|
|
4628
|
-
"data-[size=lg]:h-11 data-[size=lg]:w-11",
|
|
4629
|
-
className
|
|
4630
|
-
),
|
|
4631
|
-
...props
|
|
4632
|
-
}
|
|
4633
|
-
);
|
|
4634
|
-
}
|
|
4635
|
-
function AvatarImage({
|
|
4636
|
-
className,
|
|
4637
|
-
...props
|
|
4638
|
-
}) {
|
|
4639
|
-
return /* @__PURE__ */ jsx27(
|
|
4640
|
-
AvatarPrimitive.Image,
|
|
4641
|
-
{
|
|
4642
|
-
"data-slot": "avatar-image",
|
|
4643
|
-
className: cn("aspect-square h-full w-full object-cover", className),
|
|
4644
|
-
...props
|
|
4645
|
-
}
|
|
4646
|
-
);
|
|
4647
|
-
}
|
|
4648
|
-
function getAvatarFallbackText(name) {
|
|
4649
|
-
const trimmedName = name.trim();
|
|
4650
|
-
if (!trimmedName) return null;
|
|
4651
|
-
const segmenter = typeof Intl !== "undefined" && "Segmenter" in Intl ? new Intl.Segmenter("ko", { granularity: "grapheme" }) : null;
|
|
4652
|
-
if (segmenter) {
|
|
4653
|
-
return segmenter.segment(trimmedName)[Symbol.iterator]().next().value?.segment ?? null;
|
|
4654
|
-
}
|
|
4655
|
-
return Array.from(trimmedName)[0] ?? null;
|
|
4656
|
-
}
|
|
4657
|
-
function AvatarFallback({
|
|
4658
|
-
className,
|
|
4659
|
-
children,
|
|
4660
|
-
name,
|
|
4661
|
-
...props
|
|
4662
|
-
}) {
|
|
4663
|
-
const fallbackText = children ?? (name ? getAvatarFallbackText(name) : null);
|
|
4664
|
-
return /* @__PURE__ */ jsx27(
|
|
4665
|
-
AvatarPrimitive.Fallback,
|
|
4666
|
-
{
|
|
4667
|
-
"data-slot": "avatar-fallback",
|
|
4668
|
-
className: cn(
|
|
4669
|
-
"flex h-full w-full items-center justify-center rounded-full",
|
|
4670
|
-
"bg-[var(--bg-raised)] text-sm font-semibold text-text-secondary",
|
|
4671
|
-
"font-[family-name:var(--font-display)]",
|
|
4672
|
-
"group-data-[size=sm]/avatar:text-xs",
|
|
4673
|
-
className
|
|
4674
|
-
),
|
|
4675
|
-
...props,
|
|
4676
|
-
children: fallbackText
|
|
4677
|
-
}
|
|
4678
|
-
);
|
|
4679
|
-
}
|
|
4680
|
-
|
|
4681
4494
|
// src/components/ui/dropdown-menu.tsx
|
|
4682
4495
|
import { CheckIcon, ChevronRightIcon, CircleIcon } from "lucide-react";
|
|
4683
4496
|
import { DropdownMenu as DropdownMenuPrimitive } from "radix-ui";
|
|
4684
|
-
import { jsx as
|
|
4497
|
+
import { jsx as jsx25, jsxs as jsxs24 } from "react/jsx-runtime";
|
|
4685
4498
|
function DropdownMenu({
|
|
4686
4499
|
...props
|
|
4687
4500
|
}) {
|
|
4688
|
-
return /* @__PURE__ */
|
|
4501
|
+
return /* @__PURE__ */ jsx25(DropdownMenuPrimitive.Root, { "data-slot": "dropdown-menu", ...props });
|
|
4689
4502
|
}
|
|
4690
4503
|
function DropdownMenuPortal({
|
|
4691
4504
|
...props
|
|
4692
4505
|
}) {
|
|
4693
|
-
return /* @__PURE__ */
|
|
4506
|
+
return /* @__PURE__ */ jsx25(DropdownMenuPrimitive.Portal, { "data-slot": "dropdown-menu-portal", ...props });
|
|
4694
4507
|
}
|
|
4695
4508
|
function DropdownMenuTrigger({
|
|
4696
4509
|
...props
|
|
4697
4510
|
}) {
|
|
4698
|
-
return /* @__PURE__ */
|
|
4511
|
+
return /* @__PURE__ */ jsx25(
|
|
4699
4512
|
DropdownMenuPrimitive.Trigger,
|
|
4700
4513
|
{
|
|
4701
4514
|
"data-slot": "dropdown-menu-trigger",
|
|
@@ -4708,7 +4521,7 @@ function DropdownMenuContent({
|
|
|
4708
4521
|
sideOffset = 4,
|
|
4709
4522
|
...props
|
|
4710
4523
|
}) {
|
|
4711
|
-
return /* @__PURE__ */
|
|
4524
|
+
return /* @__PURE__ */ jsx25(DropdownMenuPrimitive.Portal, { children: /* @__PURE__ */ jsx25(
|
|
4712
4525
|
DropdownMenuPrimitive.Content,
|
|
4713
4526
|
{
|
|
4714
4527
|
"data-slot": "dropdown-menu-content",
|
|
@@ -4731,7 +4544,7 @@ function DropdownMenuContent({
|
|
|
4731
4544
|
function DropdownMenuGroup({
|
|
4732
4545
|
...props
|
|
4733
4546
|
}) {
|
|
4734
|
-
return /* @__PURE__ */
|
|
4547
|
+
return /* @__PURE__ */ jsx25(DropdownMenuPrimitive.Group, { "data-slot": "dropdown-menu-group", ...props });
|
|
4735
4548
|
}
|
|
4736
4549
|
function DropdownMenuItem({
|
|
4737
4550
|
className,
|
|
@@ -4739,7 +4552,7 @@ function DropdownMenuItem({
|
|
|
4739
4552
|
variant = "default",
|
|
4740
4553
|
...props
|
|
4741
4554
|
}) {
|
|
4742
|
-
return /* @__PURE__ */
|
|
4555
|
+
return /* @__PURE__ */ jsx25(
|
|
4743
4556
|
DropdownMenuPrimitive.Item,
|
|
4744
4557
|
{
|
|
4745
4558
|
"data-slot": "dropdown-menu-item",
|
|
@@ -4766,7 +4579,7 @@ function DropdownMenuCheckboxItem({
|
|
|
4766
4579
|
checked,
|
|
4767
4580
|
...props
|
|
4768
4581
|
}) {
|
|
4769
|
-
return /* @__PURE__ */
|
|
4582
|
+
return /* @__PURE__ */ jsxs24(
|
|
4770
4583
|
DropdownMenuPrimitive.CheckboxItem,
|
|
4771
4584
|
{
|
|
4772
4585
|
"data-slot": "dropdown-menu-checkbox-item",
|
|
@@ -4782,7 +4595,7 @@ function DropdownMenuCheckboxItem({
|
|
|
4782
4595
|
checked,
|
|
4783
4596
|
...props,
|
|
4784
4597
|
children: [
|
|
4785
|
-
/* @__PURE__ */
|
|
4598
|
+
/* @__PURE__ */ jsx25("span", { className: "pointer-events-none absolute left-2 flex h-3.5 w-3.5 items-center justify-center", children: /* @__PURE__ */ jsx25(DropdownMenuPrimitive.ItemIndicator, { children: /* @__PURE__ */ jsx25(CheckIcon, { size: 16 }) }) }),
|
|
4786
4599
|
children
|
|
4787
4600
|
]
|
|
4788
4601
|
}
|
|
@@ -4791,7 +4604,7 @@ function DropdownMenuCheckboxItem({
|
|
|
4791
4604
|
function DropdownMenuRadioGroup({
|
|
4792
4605
|
...props
|
|
4793
4606
|
}) {
|
|
4794
|
-
return /* @__PURE__ */
|
|
4607
|
+
return /* @__PURE__ */ jsx25(
|
|
4795
4608
|
DropdownMenuPrimitive.RadioGroup,
|
|
4796
4609
|
{
|
|
4797
4610
|
"data-slot": "dropdown-menu-radio-group",
|
|
@@ -4804,7 +4617,7 @@ function DropdownMenuRadioItem({
|
|
|
4804
4617
|
children,
|
|
4805
4618
|
...props
|
|
4806
4619
|
}) {
|
|
4807
|
-
return /* @__PURE__ */
|
|
4620
|
+
return /* @__PURE__ */ jsxs24(
|
|
4808
4621
|
DropdownMenuPrimitive.RadioItem,
|
|
4809
4622
|
{
|
|
4810
4623
|
"data-slot": "dropdown-menu-radio-item",
|
|
@@ -4819,7 +4632,7 @@ function DropdownMenuRadioItem({
|
|
|
4819
4632
|
),
|
|
4820
4633
|
...props,
|
|
4821
4634
|
children: [
|
|
4822
|
-
/* @__PURE__ */
|
|
4635
|
+
/* @__PURE__ */ jsx25("span", { className: "pointer-events-none absolute left-2 flex h-3.5 w-3.5 items-center justify-center", children: /* @__PURE__ */ jsx25(DropdownMenuPrimitive.ItemIndicator, { children: /* @__PURE__ */ jsx25(CircleIcon, { size: 8, className: "fill-current" }) }) }),
|
|
4823
4636
|
children
|
|
4824
4637
|
]
|
|
4825
4638
|
}
|
|
@@ -4830,7 +4643,7 @@ function DropdownMenuLabel({
|
|
|
4830
4643
|
inset,
|
|
4831
4644
|
...props
|
|
4832
4645
|
}) {
|
|
4833
|
-
return /* @__PURE__ */
|
|
4646
|
+
return /* @__PURE__ */ jsx25(
|
|
4834
4647
|
DropdownMenuPrimitive.Label,
|
|
4835
4648
|
{
|
|
4836
4649
|
"data-slot": "dropdown-menu-label",
|
|
@@ -4847,7 +4660,7 @@ function DropdownMenuSeparator({
|
|
|
4847
4660
|
className,
|
|
4848
4661
|
...props
|
|
4849
4662
|
}) {
|
|
4850
|
-
return /* @__PURE__ */
|
|
4663
|
+
return /* @__PURE__ */ jsx25(
|
|
4851
4664
|
DropdownMenuPrimitive.Separator,
|
|
4852
4665
|
{
|
|
4853
4666
|
"data-slot": "dropdown-menu-separator",
|
|
@@ -4860,7 +4673,7 @@ function DropdownMenuShortcut({
|
|
|
4860
4673
|
className,
|
|
4861
4674
|
...props
|
|
4862
4675
|
}) {
|
|
4863
|
-
return /* @__PURE__ */
|
|
4676
|
+
return /* @__PURE__ */ jsx25(
|
|
4864
4677
|
"span",
|
|
4865
4678
|
{
|
|
4866
4679
|
"data-slot": "dropdown-menu-shortcut",
|
|
@@ -4875,7 +4688,7 @@ function DropdownMenuShortcut({
|
|
|
4875
4688
|
function DropdownMenuSub({
|
|
4876
4689
|
...props
|
|
4877
4690
|
}) {
|
|
4878
|
-
return /* @__PURE__ */
|
|
4691
|
+
return /* @__PURE__ */ jsx25(DropdownMenuPrimitive.Sub, { "data-slot": "dropdown-menu-sub", ...props });
|
|
4879
4692
|
}
|
|
4880
4693
|
function DropdownMenuSubTrigger({
|
|
4881
4694
|
className,
|
|
@@ -4883,7 +4696,7 @@ function DropdownMenuSubTrigger({
|
|
|
4883
4696
|
children,
|
|
4884
4697
|
...props
|
|
4885
4698
|
}) {
|
|
4886
|
-
return /* @__PURE__ */
|
|
4699
|
+
return /* @__PURE__ */ jsxs24(
|
|
4887
4700
|
DropdownMenuPrimitive.SubTrigger,
|
|
4888
4701
|
{
|
|
4889
4702
|
"data-slot": "dropdown-menu-sub-trigger",
|
|
@@ -4900,30 +4713,491 @@ function DropdownMenuSubTrigger({
|
|
|
4900
4713
|
...props,
|
|
4901
4714
|
children: [
|
|
4902
4715
|
children,
|
|
4903
|
-
/* @__PURE__ */
|
|
4716
|
+
/* @__PURE__ */ jsx25(ChevronRightIcon, { className: "ml-auto", size: 16 })
|
|
4904
4717
|
]
|
|
4905
4718
|
}
|
|
4906
4719
|
);
|
|
4907
4720
|
}
|
|
4908
|
-
function DropdownMenuSubContent({
|
|
4721
|
+
function DropdownMenuSubContent({
|
|
4722
|
+
className,
|
|
4723
|
+
...props
|
|
4724
|
+
}) {
|
|
4725
|
+
return /* @__PURE__ */ jsx25(
|
|
4726
|
+
DropdownMenuPrimitive.SubContent,
|
|
4727
|
+
{
|
|
4728
|
+
"data-slot": "dropdown-menu-sub-content",
|
|
4729
|
+
className: cn(
|
|
4730
|
+
"z-[var(--z-popover)] min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-hidden",
|
|
4731
|
+
"rounded-sm border border-[var(--border)] bg-canvas p-[var(--space-0-5)] text-text-primary shadow-elevation-2",
|
|
4732
|
+
"data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2",
|
|
4733
|
+
"data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",
|
|
4734
|
+
"data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95",
|
|
4735
|
+
"data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95",
|
|
4736
|
+
"motion-reduce:transition-none",
|
|
4737
|
+
className
|
|
4738
|
+
),
|
|
4739
|
+
...props
|
|
4740
|
+
}
|
|
4741
|
+
);
|
|
4742
|
+
}
|
|
4743
|
+
|
|
4744
|
+
// src/components/ui/context-menu.tsx
|
|
4745
|
+
import { jsx as jsx26, jsxs as jsxs25 } from "react/jsx-runtime";
|
|
4746
|
+
function ContextMenu({
|
|
4747
|
+
open,
|
|
4748
|
+
onOpenChange,
|
|
4749
|
+
position,
|
|
4750
|
+
children,
|
|
4751
|
+
contentProps
|
|
4752
|
+
}) {
|
|
4753
|
+
if (!position) {
|
|
4754
|
+
return null;
|
|
4755
|
+
}
|
|
4756
|
+
return /* @__PURE__ */ jsxs25(DropdownMenu, { open, onOpenChange, modal: false, children: [
|
|
4757
|
+
/* @__PURE__ */ jsx26(DropdownMenuTrigger, { asChild: true, children: /* @__PURE__ */ jsx26(
|
|
4758
|
+
"span",
|
|
4759
|
+
{
|
|
4760
|
+
"aria-hidden": "true",
|
|
4761
|
+
"data-slot": "context-menu-anchor",
|
|
4762
|
+
style: {
|
|
4763
|
+
position: "fixed",
|
|
4764
|
+
left: position.x,
|
|
4765
|
+
top: position.y,
|
|
4766
|
+
width: 0,
|
|
4767
|
+
height: 0
|
|
4768
|
+
}
|
|
4769
|
+
}
|
|
4770
|
+
) }),
|
|
4771
|
+
/* @__PURE__ */ jsx26(DropdownMenuContent, { ...contentProps, children })
|
|
4772
|
+
] });
|
|
4773
|
+
}
|
|
4774
|
+
|
|
4775
|
+
// src/components/ui/bulk-action-bar.tsx
|
|
4776
|
+
import { X as X3 } from "lucide-react";
|
|
4777
|
+
|
|
4778
|
+
// src/components/ui/icon-button.tsx
|
|
4779
|
+
import * as React23 from "react";
|
|
4780
|
+
import { cva as cva12 } from "class-variance-authority";
|
|
4781
|
+
import { jsx as jsx27, jsxs as jsxs26 } from "react/jsx-runtime";
|
|
4782
|
+
var iconButtonVariants = cva12(
|
|
4783
|
+
[
|
|
4784
|
+
"olun-icon-button relative inline-flex cursor-pointer shrink-0 items-center justify-center",
|
|
4785
|
+
"rounded-[var(--radius-sm)] border font-medium",
|
|
4786
|
+
"transition-colors motion-reduce:transition-none",
|
|
4787
|
+
"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--focus-ring)]",
|
|
4788
|
+
"disabled:cursor-not-allowed disabled:bg-[var(--action-disabled-bg)] disabled:text-text-disabled",
|
|
4789
|
+
"[&_svg]:pointer-events-none [&_svg]:shrink-0"
|
|
4790
|
+
].join(" "),
|
|
4791
|
+
{
|
|
4792
|
+
variants: {
|
|
4793
|
+
variant: {
|
|
4794
|
+
ghost: "border-transparent bg-transparent text-text-secondary hover:bg-[var(--action-hover)] hover:text-foreground",
|
|
4795
|
+
outline: "border-[var(--border-subtle)] bg-[var(--bg-surface)] text-text-secondary hover:border-[var(--border-accent)] hover:bg-[var(--action-hover)] hover:text-foreground",
|
|
4796
|
+
subtle: "border-transparent bg-[var(--bg-raised)] text-text-secondary hover:bg-[var(--action-hover)] hover:text-foreground",
|
|
4797
|
+
danger: "border-transparent bg-[var(--error-bg)] text-[var(--error)] hover:bg-[var(--action-hover)]"
|
|
4798
|
+
},
|
|
4799
|
+
size: {
|
|
4800
|
+
sm: "size-[var(--space-4)]",
|
|
4801
|
+
md: "size-[var(--touch-target-min)]",
|
|
4802
|
+
lg: "size-[var(--space-6)]"
|
|
4803
|
+
},
|
|
4804
|
+
pressed: {
|
|
4805
|
+
true: "",
|
|
4806
|
+
false: ""
|
|
4807
|
+
}
|
|
4808
|
+
},
|
|
4809
|
+
compoundVariants: [
|
|
4810
|
+
{
|
|
4811
|
+
pressed: true,
|
|
4812
|
+
variant: ["ghost", "outline", "subtle"],
|
|
4813
|
+
className: "border-[var(--border-accent)] bg-[var(--action-selected)] text-foreground"
|
|
4814
|
+
},
|
|
4815
|
+
{
|
|
4816
|
+
pressed: true,
|
|
4817
|
+
variant: "danger",
|
|
4818
|
+
className: "border-[var(--error)] bg-[var(--error-bg)] text-[var(--error)]"
|
|
4819
|
+
}
|
|
4820
|
+
],
|
|
4821
|
+
defaultVariants: {
|
|
4822
|
+
variant: "ghost",
|
|
4823
|
+
size: "md",
|
|
4824
|
+
pressed: false
|
|
4825
|
+
}
|
|
4826
|
+
}
|
|
4827
|
+
);
|
|
4828
|
+
var iconButtonBadgeVariants = cva12(
|
|
4829
|
+
[
|
|
4830
|
+
"pointer-events-none absolute right-0 top-0 inline-flex",
|
|
4831
|
+
"olun-icon-button__badge",
|
|
4832
|
+
"min-h-[var(--space-1-5)] min-w-[var(--space-1-5)] translate-x-1/3 -translate-y-1/3",
|
|
4833
|
+
"items-center justify-center gap-[2px] rounded-[var(--radius-full)] px-[3px]",
|
|
4834
|
+
"font-[family-name:var(--font-display)] text-[10px] font-semibold leading-none",
|
|
4835
|
+
"[&:has(svg)]:size-[var(--space-1-5)] [&:has(svg)]:px-0 [&_svg]:size-[10px]"
|
|
4836
|
+
].join(" "),
|
|
4837
|
+
{
|
|
4838
|
+
variants: {
|
|
4839
|
+
tone: {
|
|
4840
|
+
info: "bg-[var(--accent-solid)] text-[var(--accent-on-solid)]",
|
|
4841
|
+
error: "bg-[var(--error)] text-[var(--error-contrast)]"
|
|
4842
|
+
}
|
|
4843
|
+
},
|
|
4844
|
+
defaultVariants: {
|
|
4845
|
+
tone: "info"
|
|
4846
|
+
}
|
|
4847
|
+
}
|
|
4848
|
+
);
|
|
4849
|
+
var iconSize2 = {
|
|
4850
|
+
sm: 14,
|
|
4851
|
+
md: 16,
|
|
4852
|
+
lg: 18
|
|
4853
|
+
};
|
|
4854
|
+
var iconStrokeWidth = {
|
|
4855
|
+
sm: 2.25,
|
|
4856
|
+
md: 2.25,
|
|
4857
|
+
lg: 1.75
|
|
4858
|
+
};
|
|
4859
|
+
var IconButton = React23.forwardRef(
|
|
4860
|
+
({
|
|
4861
|
+
className,
|
|
4862
|
+
variant = "ghost",
|
|
4863
|
+
size = "md",
|
|
4864
|
+
pressed = false,
|
|
4865
|
+
icon: Icon,
|
|
4866
|
+
badge,
|
|
4867
|
+
badgeTone = "info",
|
|
4868
|
+
type,
|
|
4869
|
+
title,
|
|
4870
|
+
"aria-label": ariaLabel,
|
|
4871
|
+
"aria-labelledby": ariaLabelledBy,
|
|
4872
|
+
...props
|
|
4873
|
+
}, ref) => {
|
|
4874
|
+
const resolvedSize = size ?? "md";
|
|
4875
|
+
const isToggle = pressed !== void 0;
|
|
4876
|
+
const isPressed = pressed === true;
|
|
4877
|
+
const hoverTitle = title ?? (typeof ariaLabel === "string" ? ariaLabel : void 0);
|
|
4878
|
+
return /* @__PURE__ */ jsxs26(
|
|
4879
|
+
"button",
|
|
4880
|
+
{
|
|
4881
|
+
ref,
|
|
4882
|
+
...props,
|
|
4883
|
+
"data-slot": "icon-button",
|
|
4884
|
+
"data-variant": variant,
|
|
4885
|
+
"data-size": resolvedSize,
|
|
4886
|
+
"data-pressed": isToggle ? String(isPressed) : void 0,
|
|
4887
|
+
"aria-label": ariaLabel,
|
|
4888
|
+
"aria-labelledby": ariaLabelledBy,
|
|
4889
|
+
"aria-pressed": isToggle ? isPressed : void 0,
|
|
4890
|
+
title: hoverTitle,
|
|
4891
|
+
className: cn(
|
|
4892
|
+
iconButtonVariants({ variant, size, pressed: isPressed, className })
|
|
4893
|
+
),
|
|
4894
|
+
type: type ?? "button",
|
|
4895
|
+
children: [
|
|
4896
|
+
/* @__PURE__ */ jsx27(
|
|
4897
|
+
Icon,
|
|
4898
|
+
{
|
|
4899
|
+
"aria-hidden": "true",
|
|
4900
|
+
"data-slot": "icon-button-icon",
|
|
4901
|
+
size: iconSize2[resolvedSize],
|
|
4902
|
+
strokeWidth: iconStrokeWidth[resolvedSize]
|
|
4903
|
+
}
|
|
4904
|
+
),
|
|
4905
|
+
badge !== void 0 ? /* @__PURE__ */ jsx27(
|
|
4906
|
+
"span",
|
|
4907
|
+
{
|
|
4908
|
+
"aria-hidden": "true",
|
|
4909
|
+
"data-slot": "icon-button-badge",
|
|
4910
|
+
"data-badge-tone": badgeTone,
|
|
4911
|
+
className: iconButtonBadgeVariants({ tone: badgeTone }),
|
|
4912
|
+
children: badge
|
|
4913
|
+
}
|
|
4914
|
+
) : null
|
|
4915
|
+
]
|
|
4916
|
+
}
|
|
4917
|
+
);
|
|
4918
|
+
}
|
|
4919
|
+
);
|
|
4920
|
+
IconButton.displayName = "IconButton";
|
|
4921
|
+
|
|
4922
|
+
// src/components/ui/bulk-action-bar.tsx
|
|
4923
|
+
import { jsx as jsx28, jsxs as jsxs27 } from "react/jsx-runtime";
|
|
4924
|
+
function BulkActionBar({
|
|
4925
|
+
count,
|
|
4926
|
+
actions,
|
|
4927
|
+
onClear,
|
|
4928
|
+
emptyHint,
|
|
4929
|
+
className,
|
|
4930
|
+
...props
|
|
4931
|
+
}) {
|
|
4932
|
+
if (count === 0 && emptyHint === void 0) {
|
|
4933
|
+
return null;
|
|
4934
|
+
}
|
|
4935
|
+
return /* @__PURE__ */ jsxs27(
|
|
4936
|
+
"div",
|
|
4937
|
+
{
|
|
4938
|
+
role: "toolbar",
|
|
4939
|
+
"aria-label": "\uC120\uD0DD \uD56D\uBAA9 \uC77C\uAD04 \uC791\uC5C5",
|
|
4940
|
+
"data-slot": "bulk-action-bar",
|
|
4941
|
+
className: cn(
|
|
4942
|
+
"sticky bottom-[var(--space-2)] z-[var(--z-sticky)] mx-auto flex min-h-[var(--touch-target-min)] w-fit max-w-[calc(100%-var(--space-4))] items-center gap-[var(--space-1)]",
|
|
4943
|
+
"rounded-full border border-[var(--border)] bg-[var(--bg-raised)] px-[var(--space-1)] py-[var(--space-0-5)] shadow-elevation-2",
|
|
4944
|
+
className
|
|
4945
|
+
),
|
|
4946
|
+
...props,
|
|
4947
|
+
children: [
|
|
4948
|
+
/* @__PURE__ */ jsx28(
|
|
4949
|
+
"span",
|
|
4950
|
+
{
|
|
4951
|
+
"data-slot": "bulk-action-bar-count",
|
|
4952
|
+
className: "px-[var(--space-1)] text-sm font-medium tabular-nums text-foreground",
|
|
4953
|
+
children: count > 0 ? `${count.toLocaleString("ko-KR")}\uAC1C \uC120\uD0DD\uB428` : emptyHint
|
|
4954
|
+
}
|
|
4955
|
+
),
|
|
4956
|
+
/* @__PURE__ */ jsxs27(
|
|
4957
|
+
"div",
|
|
4958
|
+
{
|
|
4959
|
+
"data-slot": "bulk-action-bar-actions",
|
|
4960
|
+
className: "flex min-w-0 flex-wrap items-center justify-end gap-[var(--space-0-5)]",
|
|
4961
|
+
children: [
|
|
4962
|
+
actions.map((action) => {
|
|
4963
|
+
const Icon = action.icon;
|
|
4964
|
+
return /* @__PURE__ */ jsxs27(
|
|
4965
|
+
Button,
|
|
4966
|
+
{
|
|
4967
|
+
type: "button",
|
|
4968
|
+
"data-slot": "bulk-action-bar-action",
|
|
4969
|
+
"data-variant": action.variant ?? "default",
|
|
4970
|
+
size: "sm",
|
|
4971
|
+
variant: action.variant === "destructive" ? "destructive" : "secondary",
|
|
4972
|
+
disabled: action.disabled,
|
|
4973
|
+
title: action.title,
|
|
4974
|
+
className: "min-h-[var(--touch-target-min)]",
|
|
4975
|
+
onClick: action.onClick,
|
|
4976
|
+
children: [
|
|
4977
|
+
Icon ? /* @__PURE__ */ jsx28(
|
|
4978
|
+
Icon,
|
|
4979
|
+
{
|
|
4980
|
+
"aria-hidden": "true",
|
|
4981
|
+
"data-slot": "bulk-action-bar-action-icon",
|
|
4982
|
+
strokeWidth: 1.75
|
|
4983
|
+
}
|
|
4984
|
+
) : null,
|
|
4985
|
+
action.label
|
|
4986
|
+
]
|
|
4987
|
+
},
|
|
4988
|
+
action.key
|
|
4989
|
+
);
|
|
4990
|
+
}),
|
|
4991
|
+
/* @__PURE__ */ jsx28(
|
|
4992
|
+
IconButton,
|
|
4993
|
+
{
|
|
4994
|
+
"aria-label": "\uC120\uD0DD \uD574\uC81C",
|
|
4995
|
+
icon: X3,
|
|
4996
|
+
size: "lg",
|
|
4997
|
+
variant: "ghost",
|
|
4998
|
+
onClick: onClear
|
|
4999
|
+
}
|
|
5000
|
+
)
|
|
5001
|
+
]
|
|
5002
|
+
}
|
|
5003
|
+
)
|
|
5004
|
+
]
|
|
5005
|
+
}
|
|
5006
|
+
);
|
|
5007
|
+
}
|
|
5008
|
+
|
|
5009
|
+
// src/components/ui/confirm-dialog.tsx
|
|
5010
|
+
import * as React24 from "react";
|
|
5011
|
+
import { Fragment as Fragment7, jsx as jsx29, jsxs as jsxs28 } from "react/jsx-runtime";
|
|
5012
|
+
var confirmDialogContentClassName = cn(
|
|
5013
|
+
"fixed left-1/2 top-1/2 z-[var(--z-modal)]",
|
|
5014
|
+
"-translate-x-1/2 -translate-y-1/2",
|
|
5015
|
+
"w-[calc(100vw-2rem)] max-w-[420px]",
|
|
5016
|
+
"flex flex-col gap-[var(--space-3)]",
|
|
5017
|
+
"bg-[var(--bg-raised)] border border-[var(--border-subtle)]",
|
|
5018
|
+
"rounded-[var(--radius-lg)] p-[var(--space-3)] shadow-[var(--elevation-4)]",
|
|
5019
|
+
"text-foreground"
|
|
5020
|
+
);
|
|
5021
|
+
var confirmDialogTitleClassName = cn(
|
|
5022
|
+
"text-[18px] font-bold leading-snug text-foreground"
|
|
5023
|
+
);
|
|
5024
|
+
var confirmDialogDescriptionClassName = cn(
|
|
5025
|
+
"break-keep text-[14px] leading-relaxed text-text-secondary"
|
|
5026
|
+
);
|
|
5027
|
+
var confirmDialogFooterClassName = "flex items-center justify-end gap-[var(--space-1-5)]";
|
|
5028
|
+
function ConfirmDialog({
|
|
5029
|
+
open,
|
|
5030
|
+
onOpenChange,
|
|
5031
|
+
title,
|
|
5032
|
+
description,
|
|
5033
|
+
tone = "default",
|
|
5034
|
+
confirmLabel,
|
|
5035
|
+
cancelLabel = "\uCDE8\uC18C",
|
|
5036
|
+
onConfirm,
|
|
5037
|
+
loading = false
|
|
5038
|
+
}) {
|
|
5039
|
+
const [pending, setPending] = React24.useState(false);
|
|
5040
|
+
const busyRef = React24.useRef(false);
|
|
5041
|
+
const isBusy = loading || pending;
|
|
5042
|
+
const handleOpenChange = React24.useCallback(
|
|
5043
|
+
(nextOpen) => {
|
|
5044
|
+
if (!nextOpen && isBusy) {
|
|
5045
|
+
return;
|
|
5046
|
+
}
|
|
5047
|
+
onOpenChange(nextOpen);
|
|
5048
|
+
},
|
|
5049
|
+
[isBusy, onOpenChange]
|
|
5050
|
+
);
|
|
5051
|
+
const handleConfirm = React24.useCallback(async () => {
|
|
5052
|
+
if (busyRef.current || loading) {
|
|
5053
|
+
return;
|
|
5054
|
+
}
|
|
5055
|
+
busyRef.current = true;
|
|
5056
|
+
setPending(true);
|
|
5057
|
+
try {
|
|
5058
|
+
await onConfirm();
|
|
5059
|
+
onOpenChange(false);
|
|
5060
|
+
} finally {
|
|
5061
|
+
busyRef.current = false;
|
|
5062
|
+
setPending(false);
|
|
5063
|
+
}
|
|
5064
|
+
}, [loading, onConfirm, onOpenChange]);
|
|
5065
|
+
const dialogBody = /* @__PURE__ */ jsxs28(Fragment7, { children: [
|
|
5066
|
+
/* @__PURE__ */ jsx29("div", { className: "flex items-start justify-between gap-[var(--space-2)]", children: /* @__PURE__ */ jsxs28("div", { className: "min-w-0 space-y-[var(--space-1)]", children: [
|
|
5067
|
+
/* @__PURE__ */ jsx29(
|
|
5068
|
+
DialogTitle,
|
|
5069
|
+
{
|
|
5070
|
+
"data-slot": "dialog-title",
|
|
5071
|
+
className: confirmDialogTitleClassName,
|
|
5072
|
+
children: title
|
|
5073
|
+
}
|
|
5074
|
+
),
|
|
5075
|
+
description ? /* @__PURE__ */ jsx29(
|
|
5076
|
+
DialogDescription,
|
|
5077
|
+
{
|
|
5078
|
+
"data-slot": "dialog-description",
|
|
5079
|
+
className: confirmDialogDescriptionClassName,
|
|
5080
|
+
children: description
|
|
5081
|
+
}
|
|
5082
|
+
) : null
|
|
5083
|
+
] }) }),
|
|
5084
|
+
/* @__PURE__ */ jsxs28(
|
|
5085
|
+
"div",
|
|
5086
|
+
{
|
|
5087
|
+
"data-slot": "dialog-footer",
|
|
5088
|
+
className: confirmDialogFooterClassName,
|
|
5089
|
+
children: [
|
|
5090
|
+
/* @__PURE__ */ jsx29(Button, { variant: "secondary", disabled: isBusy, onClick: () => handleOpenChange(false), children: cancelLabel }),
|
|
5091
|
+
/* @__PURE__ */ jsx29(
|
|
5092
|
+
Button,
|
|
5093
|
+
{
|
|
5094
|
+
variant: tone === "destructive" ? "destructive" : "primary",
|
|
5095
|
+
loading: isBusy,
|
|
5096
|
+
onClick: handleConfirm,
|
|
5097
|
+
children: confirmLabel
|
|
5098
|
+
}
|
|
5099
|
+
)
|
|
5100
|
+
]
|
|
5101
|
+
}
|
|
5102
|
+
)
|
|
5103
|
+
] });
|
|
5104
|
+
return /* @__PURE__ */ jsx29(Dialog, { open, onOpenChange: handleOpenChange, children: /* @__PURE__ */ jsxs28(DialogPortal, { children: [
|
|
5105
|
+
/* @__PURE__ */ jsx29(DialogOverlay, {}),
|
|
5106
|
+
/* @__PURE__ */ jsx29(DialogRawContent, { "data-slot": "dialog-content", className: confirmDialogContentClassName, children: dialogBody })
|
|
5107
|
+
] }) });
|
|
5108
|
+
}
|
|
5109
|
+
|
|
5110
|
+
// src/components/ui/separator.tsx
|
|
5111
|
+
import { Separator as SeparatorPrimitive } from "radix-ui";
|
|
5112
|
+
import { jsx as jsx30 } from "react/jsx-runtime";
|
|
5113
|
+
function Separator({
|
|
5114
|
+
className,
|
|
5115
|
+
orientation = "horizontal",
|
|
5116
|
+
decorative = true,
|
|
5117
|
+
...props
|
|
5118
|
+
}) {
|
|
5119
|
+
return /* @__PURE__ */ jsx30(
|
|
5120
|
+
SeparatorPrimitive.Root,
|
|
5121
|
+
{
|
|
5122
|
+
"data-slot": "separator",
|
|
5123
|
+
decorative,
|
|
5124
|
+
orientation,
|
|
5125
|
+
className: cn(
|
|
5126
|
+
"shrink-0 bg-border data-[orientation=horizontal]:h-px data-[orientation=horizontal]:w-full data-[orientation=vertical]:h-full data-[orientation=vertical]:w-px",
|
|
5127
|
+
className
|
|
5128
|
+
),
|
|
5129
|
+
...props
|
|
5130
|
+
}
|
|
5131
|
+
);
|
|
5132
|
+
}
|
|
5133
|
+
|
|
5134
|
+
// src/components/ui/avatar.tsx
|
|
5135
|
+
import { Avatar as AvatarPrimitive } from "radix-ui";
|
|
5136
|
+
import { jsx as jsx31 } from "react/jsx-runtime";
|
|
5137
|
+
function Avatar({
|
|
5138
|
+
className,
|
|
5139
|
+
size = "md",
|
|
5140
|
+
...props
|
|
5141
|
+
}) {
|
|
5142
|
+
return /* @__PURE__ */ jsx31(
|
|
5143
|
+
AvatarPrimitive.Root,
|
|
5144
|
+
{
|
|
5145
|
+
"data-slot": "avatar",
|
|
5146
|
+
"data-size": size,
|
|
5147
|
+
className: cn(
|
|
5148
|
+
"group/avatar relative flex shrink-0 overflow-hidden rounded-full select-none",
|
|
5149
|
+
"border border-[var(--border-subtle)] bg-[var(--bg-raised)] text-text-secondary",
|
|
5150
|
+
"h-9 w-9",
|
|
5151
|
+
"data-[size=sm]:h-8 data-[size=sm]:w-8",
|
|
5152
|
+
"data-[size=lg]:h-11 data-[size=lg]:w-11",
|
|
5153
|
+
className
|
|
5154
|
+
),
|
|
5155
|
+
...props
|
|
5156
|
+
}
|
|
5157
|
+
);
|
|
5158
|
+
}
|
|
5159
|
+
function AvatarImage({
|
|
5160
|
+
className,
|
|
5161
|
+
...props
|
|
5162
|
+
}) {
|
|
5163
|
+
return /* @__PURE__ */ jsx31(
|
|
5164
|
+
AvatarPrimitive.Image,
|
|
5165
|
+
{
|
|
5166
|
+
"data-slot": "avatar-image",
|
|
5167
|
+
className: cn("aspect-square h-full w-full object-cover", className),
|
|
5168
|
+
...props
|
|
5169
|
+
}
|
|
5170
|
+
);
|
|
5171
|
+
}
|
|
5172
|
+
function getAvatarFallbackText(name) {
|
|
5173
|
+
const trimmedName = name.trim();
|
|
5174
|
+
if (!trimmedName) return null;
|
|
5175
|
+
const segmenter = typeof Intl !== "undefined" && "Segmenter" in Intl ? new Intl.Segmenter("ko", { granularity: "grapheme" }) : null;
|
|
5176
|
+
if (segmenter) {
|
|
5177
|
+
return segmenter.segment(trimmedName)[Symbol.iterator]().next().value?.segment ?? null;
|
|
5178
|
+
}
|
|
5179
|
+
return Array.from(trimmedName)[0] ?? null;
|
|
5180
|
+
}
|
|
5181
|
+
function AvatarFallback({
|
|
4909
5182
|
className,
|
|
5183
|
+
children,
|
|
5184
|
+
name,
|
|
4910
5185
|
...props
|
|
4911
5186
|
}) {
|
|
4912
|
-
|
|
4913
|
-
|
|
5187
|
+
const fallbackText = children ?? (name ? getAvatarFallbackText(name) : null);
|
|
5188
|
+
return /* @__PURE__ */ jsx31(
|
|
5189
|
+
AvatarPrimitive.Fallback,
|
|
4914
5190
|
{
|
|
4915
|
-
"data-slot": "
|
|
5191
|
+
"data-slot": "avatar-fallback",
|
|
4916
5192
|
className: cn(
|
|
4917
|
-
"
|
|
4918
|
-
"
|
|
4919
|
-
"
|
|
4920
|
-
"
|
|
4921
|
-
"data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95",
|
|
4922
|
-
"data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95",
|
|
4923
|
-
"motion-reduce:transition-none",
|
|
5193
|
+
"flex h-full w-full items-center justify-center rounded-full",
|
|
5194
|
+
"bg-[var(--bg-raised)] text-sm font-semibold text-text-secondary",
|
|
5195
|
+
"font-[family-name:var(--font-display)]",
|
|
5196
|
+
"group-data-[size=sm]/avatar:text-xs",
|
|
4924
5197
|
className
|
|
4925
5198
|
),
|
|
4926
|
-
...props
|
|
5199
|
+
...props,
|
|
5200
|
+
children: fallbackText
|
|
4927
5201
|
}
|
|
4928
5202
|
);
|
|
4929
5203
|
}
|
|
@@ -4931,7 +5205,7 @@ function DropdownMenuSubContent({
|
|
|
4931
5205
|
// src/components/ui/sheet.tsx
|
|
4932
5206
|
import { XIcon } from "lucide-react";
|
|
4933
5207
|
import { Dialog as SheetPrimitive } from "radix-ui";
|
|
4934
|
-
import { jsx as
|
|
5208
|
+
import { jsx as jsx32, jsxs as jsxs29 } from "react/jsx-runtime";
|
|
4935
5209
|
var defaultSheetMotionConfig = {
|
|
4936
5210
|
type: "slide",
|
|
4937
5211
|
duration: 300,
|
|
@@ -4963,22 +5237,22 @@ function getSheetMotionStyle(motionConfig, style) {
|
|
|
4963
5237
|
};
|
|
4964
5238
|
}
|
|
4965
5239
|
function Sheet({ ...props }) {
|
|
4966
|
-
return /* @__PURE__ */
|
|
5240
|
+
return /* @__PURE__ */ jsx32(SheetPrimitive.Root, { "data-slot": "sheet", ...props });
|
|
4967
5241
|
}
|
|
4968
5242
|
function SheetTrigger({
|
|
4969
5243
|
...props
|
|
4970
5244
|
}) {
|
|
4971
|
-
return /* @__PURE__ */
|
|
5245
|
+
return /* @__PURE__ */ jsx32(SheetPrimitive.Trigger, { "data-slot": "sheet-trigger", ...props });
|
|
4972
5246
|
}
|
|
4973
5247
|
function SheetClose({
|
|
4974
5248
|
...props
|
|
4975
5249
|
}) {
|
|
4976
|
-
return /* @__PURE__ */
|
|
5250
|
+
return /* @__PURE__ */ jsx32(SheetPrimitive.Close, { "data-slot": "sheet-close", ...props });
|
|
4977
5251
|
}
|
|
4978
5252
|
function SheetPortal({
|
|
4979
5253
|
...props
|
|
4980
5254
|
}) {
|
|
4981
|
-
return /* @__PURE__ */
|
|
5255
|
+
return /* @__PURE__ */ jsx32(SheetPrimitive.Portal, { "data-slot": "sheet-portal", ...props });
|
|
4982
5256
|
}
|
|
4983
5257
|
function SheetOverlay({
|
|
4984
5258
|
className,
|
|
@@ -4987,7 +5261,7 @@ function SheetOverlay({
|
|
|
4987
5261
|
...props
|
|
4988
5262
|
}) {
|
|
4989
5263
|
const motionConfig = resolveSheetMotionConfig(motion);
|
|
4990
|
-
return /* @__PURE__ */
|
|
5264
|
+
return /* @__PURE__ */ jsx32(
|
|
4991
5265
|
SheetPrimitive.Overlay,
|
|
4992
5266
|
{
|
|
4993
5267
|
"data-slot": "sheet-overlay",
|
|
@@ -5020,9 +5294,9 @@ function SheetContent({
|
|
|
5020
5294
|
}) {
|
|
5021
5295
|
const motionConfig = resolveSheetMotionConfig(motion);
|
|
5022
5296
|
const hasSlideMotion = motionConfig && motionConfig.type === "slide";
|
|
5023
|
-
return /* @__PURE__ */
|
|
5024
|
-
/* @__PURE__ */
|
|
5025
|
-
/* @__PURE__ */
|
|
5297
|
+
return /* @__PURE__ */ jsxs29(SheetPortal, { children: [
|
|
5298
|
+
/* @__PURE__ */ jsx32(SheetOverlay, { motion: motionConfig }),
|
|
5299
|
+
/* @__PURE__ */ jsxs29(
|
|
5026
5300
|
SheetPrimitive.Content,
|
|
5027
5301
|
{
|
|
5028
5302
|
"data-slot": "sheet-content",
|
|
@@ -5057,11 +5331,14 @@ function SheetContent({
|
|
|
5057
5331
|
hasSlideMotion && "max-[899px]:data-[state=open]:animate-[olun-sheet-in-from-left_var(--sheet-motion-duration)_var(--sheet-motion-easing)_both] max-[899px]:data-[state=closed]:animate-[olun-sheet-out-to-left_var(--sheet-motion-duration)_var(--sheet-motion-easing)_both]"
|
|
5058
5332
|
),
|
|
5059
5333
|
mobileSide === "top" && cn(
|
|
5060
|
-
|
|
5334
|
+
// `max-w-none!` overrides the side variant's `sm:max-w-sm` cap (see mobileSide bottom).
|
|
5335
|
+
"max-[899px]:inset-x-0 max-[899px]:top-0 max-[899px]:bottom-auto max-[899px]:h-auto max-[899px]:w-full max-[899px]:max-w-none! max-[899px]:border-b max-[899px]:border-l-0 max-[899px]:rounded-none",
|
|
5061
5336
|
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]"
|
|
5062
5337
|
),
|
|
5063
5338
|
mobileSide === "bottom" && cn(
|
|
5064
|
-
|
|
5339
|
+
// `max-w-none!` overrides the side variant's `sm:max-w-sm` cap so the bottom sheet
|
|
5340
|
+
// spans the full viewport width across the whole < 900px band (not capped to 24rem).
|
|
5341
|
+
"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",
|
|
5065
5342
|
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]"
|
|
5066
5343
|
),
|
|
5067
5344
|
className
|
|
@@ -5070,9 +5347,9 @@ function SheetContent({
|
|
|
5070
5347
|
...props,
|
|
5071
5348
|
children: [
|
|
5072
5349
|
children,
|
|
5073
|
-
showCloseButton && /* @__PURE__ */
|
|
5074
|
-
/* @__PURE__ */
|
|
5075
|
-
/* @__PURE__ */
|
|
5350
|
+
showCloseButton && /* @__PURE__ */ jsxs29(SheetPrimitive.Close, { className: "absolute top-4 right-4 cursor-pointer rounded-xs opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:ring-2 focus:ring-ring focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none data-[state=open]:bg-secondary", children: [
|
|
5351
|
+
/* @__PURE__ */ jsx32(XIcon, { className: "size-[16px]" }),
|
|
5352
|
+
/* @__PURE__ */ jsx32("span", { className: "sr-only", children: "Close" })
|
|
5076
5353
|
] })
|
|
5077
5354
|
]
|
|
5078
5355
|
}
|
|
@@ -5080,7 +5357,7 @@ function SheetContent({
|
|
|
5080
5357
|
] });
|
|
5081
5358
|
}
|
|
5082
5359
|
function SheetHeader({ className, ...props }) {
|
|
5083
|
-
return /* @__PURE__ */
|
|
5360
|
+
return /* @__PURE__ */ jsx32(
|
|
5084
5361
|
"div",
|
|
5085
5362
|
{
|
|
5086
5363
|
"data-slot": "sheet-header",
|
|
@@ -5090,7 +5367,7 @@ function SheetHeader({ className, ...props }) {
|
|
|
5090
5367
|
);
|
|
5091
5368
|
}
|
|
5092
5369
|
function SheetFooter({ className, ...props }) {
|
|
5093
|
-
return /* @__PURE__ */
|
|
5370
|
+
return /* @__PURE__ */ jsx32(
|
|
5094
5371
|
"div",
|
|
5095
5372
|
{
|
|
5096
5373
|
"data-slot": "sheet-footer",
|
|
@@ -5103,7 +5380,7 @@ function SheetTitle({
|
|
|
5103
5380
|
className,
|
|
5104
5381
|
...props
|
|
5105
5382
|
}) {
|
|
5106
|
-
return /* @__PURE__ */
|
|
5383
|
+
return /* @__PURE__ */ jsx32(
|
|
5107
5384
|
SheetPrimitive.Title,
|
|
5108
5385
|
{
|
|
5109
5386
|
"data-slot": "sheet-title",
|
|
@@ -5116,7 +5393,7 @@ function SheetDescription({
|
|
|
5116
5393
|
className,
|
|
5117
5394
|
...props
|
|
5118
5395
|
}) {
|
|
5119
|
-
return /* @__PURE__ */
|
|
5396
|
+
return /* @__PURE__ */ jsx32(
|
|
5120
5397
|
SheetPrimitive.Description,
|
|
5121
5398
|
{
|
|
5122
5399
|
"data-slot": "sheet-description",
|
|
@@ -5128,7 +5405,7 @@ function SheetDescription({
|
|
|
5128
5405
|
|
|
5129
5406
|
// src/components/ui/sheet-drawer.tsx
|
|
5130
5407
|
import { Maximize2Icon, Minimize2Icon, XIcon as XIcon2 } from "lucide-react";
|
|
5131
|
-
import { jsx as
|
|
5408
|
+
import { jsx as jsx33, jsxs as jsxs30 } from "react/jsx-runtime";
|
|
5132
5409
|
var sheetDrawerContentClassName = cn(
|
|
5133
5410
|
"gap-0 p-0",
|
|
5134
5411
|
"bg-[var(--bg-surface)] text-foreground",
|
|
@@ -5197,7 +5474,7 @@ function SheetDrawer({
|
|
|
5197
5474
|
const resolvedWidth = expanded ? "full" : width;
|
|
5198
5475
|
const resolvedExpandLabel = hasExpandedToggle && expanded ? collapseLabel : expandLabel;
|
|
5199
5476
|
const ExpandActionIcon = hasExpandedToggle && expanded ? Minimize2Icon : Maximize2Icon;
|
|
5200
|
-
return /* @__PURE__ */
|
|
5477
|
+
return /* @__PURE__ */ jsx33(Sheet, { open, onOpenChange, children: /* @__PURE__ */ jsxs30(
|
|
5201
5478
|
SheetContent,
|
|
5202
5479
|
{
|
|
5203
5480
|
"data-slot": "sheet-drawer-content",
|
|
@@ -5211,11 +5488,11 @@ function SheetDrawer({
|
|
|
5211
5488
|
resolvedWidth === "full" && sheetDrawerFullContentClassName
|
|
5212
5489
|
),
|
|
5213
5490
|
children: [
|
|
5214
|
-
/* @__PURE__ */
|
|
5215
|
-
/* @__PURE__ */
|
|
5216
|
-
caption ? /* @__PURE__ */
|
|
5217
|
-
/* @__PURE__ */
|
|
5218
|
-
description ? /* @__PURE__ */
|
|
5491
|
+
/* @__PURE__ */ jsxs30("div", { "data-slot": "sheet-drawer-header", className: sheetDrawerHeaderClassName, children: [
|
|
5492
|
+
/* @__PURE__ */ jsxs30("div", { className: sheetDrawerHeaderTextClassName, children: [
|
|
5493
|
+
caption ? /* @__PURE__ */ jsx33("div", { "data-slot": "sheet-drawer-caption", className: sheetDrawerCaptionClassName, children: caption }) : null,
|
|
5494
|
+
/* @__PURE__ */ jsx33(SheetTitle, { "data-slot": "sheet-drawer-title", className: sheetDrawerTitleClassName, children: title }),
|
|
5495
|
+
description ? /* @__PURE__ */ jsx33(
|
|
5219
5496
|
SheetDescription,
|
|
5220
5497
|
{
|
|
5221
5498
|
"data-slot": "sheet-drawer-description",
|
|
@@ -5224,8 +5501,8 @@ function SheetDrawer({
|
|
|
5224
5501
|
}
|
|
5225
5502
|
) : null
|
|
5226
5503
|
] }),
|
|
5227
|
-
/* @__PURE__ */
|
|
5228
|
-
showExpandAction ? hasExpandedToggle ? /* @__PURE__ */
|
|
5504
|
+
/* @__PURE__ */ jsxs30("div", { "data-slot": "sheet-drawer-header-actions", className: sheetDrawerHeaderActionsClassName, children: [
|
|
5505
|
+
showExpandAction ? hasExpandedToggle ? /* @__PURE__ */ jsxs30(
|
|
5229
5506
|
"button",
|
|
5230
5507
|
{
|
|
5231
5508
|
type: "button",
|
|
@@ -5236,11 +5513,11 @@ function SheetDrawer({
|
|
|
5236
5513
|
className: sheetDrawerExpandButtonClassName,
|
|
5237
5514
|
onClick: () => onExpandedChange(!expanded),
|
|
5238
5515
|
children: [
|
|
5239
|
-
/* @__PURE__ */
|
|
5240
|
-
/* @__PURE__ */
|
|
5516
|
+
/* @__PURE__ */ jsx33(ExpandActionIcon, { className: "size-[16px]" }),
|
|
5517
|
+
/* @__PURE__ */ jsx33("span", { className: "hidden text-sm font-medium leading-normal md:inline", children: resolvedExpandLabel })
|
|
5241
5518
|
]
|
|
5242
5519
|
}
|
|
5243
|
-
) : expandHref ? /* @__PURE__ */
|
|
5520
|
+
) : expandHref ? /* @__PURE__ */ jsxs30(
|
|
5244
5521
|
"a",
|
|
5245
5522
|
{
|
|
5246
5523
|
href: expandHref,
|
|
@@ -5248,11 +5525,11 @@ function SheetDrawer({
|
|
|
5248
5525
|
"data-slot": "sheet-drawer-expand",
|
|
5249
5526
|
className: sheetDrawerExpandButtonClassName,
|
|
5250
5527
|
children: [
|
|
5251
|
-
/* @__PURE__ */
|
|
5252
|
-
/* @__PURE__ */
|
|
5528
|
+
/* @__PURE__ */ jsx33(ExpandActionIcon, { className: "size-[16px]" }),
|
|
5529
|
+
/* @__PURE__ */ jsx33("span", { className: "hidden text-sm font-medium leading-normal md:inline", children: expandLabel })
|
|
5253
5530
|
]
|
|
5254
5531
|
}
|
|
5255
|
-
) : /* @__PURE__ */
|
|
5532
|
+
) : /* @__PURE__ */ jsxs30(
|
|
5256
5533
|
"button",
|
|
5257
5534
|
{
|
|
5258
5535
|
type: "button",
|
|
@@ -5261,40 +5538,40 @@ function SheetDrawer({
|
|
|
5261
5538
|
className: sheetDrawerExpandButtonClassName,
|
|
5262
5539
|
onClick: onExpand,
|
|
5263
5540
|
children: [
|
|
5264
|
-
/* @__PURE__ */
|
|
5265
|
-
/* @__PURE__ */
|
|
5541
|
+
/* @__PURE__ */ jsx33(ExpandActionIcon, { className: "size-[16px]" }),
|
|
5542
|
+
/* @__PURE__ */ jsx33("span", { className: "hidden text-sm font-medium leading-normal md:inline", children: expandLabel })
|
|
5266
5543
|
]
|
|
5267
5544
|
}
|
|
5268
5545
|
) : null,
|
|
5269
|
-
/* @__PURE__ */
|
|
5546
|
+
/* @__PURE__ */ jsx33(
|
|
5270
5547
|
SheetClose,
|
|
5271
5548
|
{
|
|
5272
5549
|
"aria-label": closeLabel,
|
|
5273
5550
|
"data-slot": "sheet-drawer-close",
|
|
5274
5551
|
className: sheetDrawerCloseButtonClassName,
|
|
5275
|
-
children: /* @__PURE__ */
|
|
5552
|
+
children: /* @__PURE__ */ jsx33(XIcon2, { className: "size-[16px]" })
|
|
5276
5553
|
}
|
|
5277
5554
|
)
|
|
5278
5555
|
] })
|
|
5279
5556
|
] }),
|
|
5280
|
-
/* @__PURE__ */
|
|
5281
|
-
footer ? /* @__PURE__ */
|
|
5557
|
+
/* @__PURE__ */ jsx33("div", { "data-slot": "sheet-drawer-body", className: sheetDrawerBodyClassName, children }),
|
|
5558
|
+
footer ? /* @__PURE__ */ jsx33("div", { "data-slot": "sheet-drawer-footer", className: sheetDrawerFooterClassName, children: footer }) : null
|
|
5282
5559
|
]
|
|
5283
5560
|
}
|
|
5284
5561
|
) });
|
|
5285
5562
|
}
|
|
5286
5563
|
|
|
5287
5564
|
// src/components/ui/popover.tsx
|
|
5288
|
-
import * as
|
|
5565
|
+
import * as React25 from "react";
|
|
5289
5566
|
import { Popover as PopoverPrimitive } from "radix-ui";
|
|
5290
|
-
import { jsx as
|
|
5567
|
+
import { jsx as jsx34, jsxs as jsxs31 } from "react/jsx-runtime";
|
|
5291
5568
|
function Popover({ modal = false, ...props }) {
|
|
5292
|
-
return /* @__PURE__ */
|
|
5569
|
+
return /* @__PURE__ */ jsx34(PopoverPrimitive.Root, { modal, ...props });
|
|
5293
5570
|
}
|
|
5294
5571
|
var PopoverTrigger = PopoverPrimitive.Trigger;
|
|
5295
5572
|
var PopoverAnchor = PopoverPrimitive.Anchor;
|
|
5296
5573
|
var PopoverClose = PopoverPrimitive.Close;
|
|
5297
|
-
var PopoverContent =
|
|
5574
|
+
var PopoverContent = React25.forwardRef(({ className, align = "center", sideOffset = 8, collisionPadding = 8, showArrow = false, children, ...props }, ref) => /* @__PURE__ */ jsx34(PopoverPrimitive.Portal, { children: /* @__PURE__ */ jsxs31(
|
|
5298
5575
|
PopoverPrimitive.Content,
|
|
5299
5576
|
{
|
|
5300
5577
|
ref,
|
|
@@ -5318,7 +5595,7 @@ var PopoverContent = React24.forwardRef(({ className, align = "center", sideOffs
|
|
|
5318
5595
|
...props,
|
|
5319
5596
|
children: [
|
|
5320
5597
|
children,
|
|
5321
|
-
showArrow ? /* @__PURE__ */
|
|
5598
|
+
showArrow ? /* @__PURE__ */ jsx34(
|
|
5322
5599
|
PopoverPrimitive.Arrow,
|
|
5323
5600
|
{
|
|
5324
5601
|
"data-slot": "popover-arrow",
|
|
@@ -5331,7 +5608,7 @@ var PopoverContent = React24.forwardRef(({ className, align = "center", sideOffs
|
|
|
5331
5608
|
}
|
|
5332
5609
|
) }));
|
|
5333
5610
|
PopoverContent.displayName = PopoverPrimitive.Content.displayName;
|
|
5334
|
-
var PopoverArrow =
|
|
5611
|
+
var PopoverArrow = React25.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx34(
|
|
5335
5612
|
PopoverPrimitive.Arrow,
|
|
5336
5613
|
{
|
|
5337
5614
|
ref,
|
|
@@ -5345,10 +5622,10 @@ var PopoverArrow = React24.forwardRef(({ className, ...props }, ref) => /* @__PU
|
|
|
5345
5622
|
PopoverArrow.displayName = PopoverPrimitive.Arrow.displayName;
|
|
5346
5623
|
|
|
5347
5624
|
// src/components/ui/badge.tsx
|
|
5348
|
-
import * as
|
|
5349
|
-
import { cva as
|
|
5350
|
-
import { jsx as
|
|
5351
|
-
var badgeVariants =
|
|
5625
|
+
import * as React26 from "react";
|
|
5626
|
+
import { cva as cva13 } from "class-variance-authority";
|
|
5627
|
+
import { jsx as jsx35, jsxs as jsxs32 } from "react/jsx-runtime";
|
|
5628
|
+
var badgeVariants = cva13(
|
|
5352
5629
|
[
|
|
5353
5630
|
"inline-flex w-fit shrink-0 items-center whitespace-nowrap",
|
|
5354
5631
|
"rounded-[var(--radius-full)] border leading-none",
|
|
@@ -5407,10 +5684,10 @@ var badgeVariants = cva12(
|
|
|
5407
5684
|
}
|
|
5408
5685
|
}
|
|
5409
5686
|
);
|
|
5410
|
-
var badgeDotVariants =
|
|
5687
|
+
var badgeDotVariants = cva13(
|
|
5411
5688
|
"size-[var(--space-0-5)] shrink-0 rounded-[var(--radius-full)] bg-current"
|
|
5412
5689
|
);
|
|
5413
|
-
var Badge =
|
|
5690
|
+
var Badge = React26.forwardRef(
|
|
5414
5691
|
({
|
|
5415
5692
|
className,
|
|
5416
5693
|
variant = "neutral",
|
|
@@ -5422,7 +5699,7 @@ var Badge = React25.forwardRef(
|
|
|
5422
5699
|
...props
|
|
5423
5700
|
}, ref) => {
|
|
5424
5701
|
const resolvedShowDot = showDot ?? variant === "status";
|
|
5425
|
-
return /* @__PURE__ */
|
|
5702
|
+
return /* @__PURE__ */ jsxs32(
|
|
5426
5703
|
"span",
|
|
5427
5704
|
{
|
|
5428
5705
|
ref,
|
|
@@ -5435,7 +5712,7 @@ var Badge = React25.forwardRef(
|
|
|
5435
5712
|
className: cn(badgeVariants({ variant, tone, size, className })),
|
|
5436
5713
|
...props,
|
|
5437
5714
|
children: [
|
|
5438
|
-
resolvedShowDot ? /* @__PURE__ */
|
|
5715
|
+
resolvedShowDot ? /* @__PURE__ */ jsx35("span", { "aria-hidden": "true", "data-slot": "badge-dot", className: badgeDotVariants() }) : null,
|
|
5439
5716
|
children
|
|
5440
5717
|
]
|
|
5441
5718
|
}
|
|
@@ -5445,10 +5722,10 @@ var Badge = React25.forwardRef(
|
|
|
5445
5722
|
Badge.displayName = "Badge";
|
|
5446
5723
|
|
|
5447
5724
|
// src/components/ui/two-tier-badge.tsx
|
|
5448
|
-
import * as
|
|
5449
|
-
import { cva as
|
|
5450
|
-
import { jsx as
|
|
5451
|
-
var twoTierBadgeVariants =
|
|
5725
|
+
import * as React27 from "react";
|
|
5726
|
+
import { cva as cva14 } from "class-variance-authority";
|
|
5727
|
+
import { jsx as jsx36, jsxs as jsxs33 } from "react/jsx-runtime";
|
|
5728
|
+
var twoTierBadgeVariants = cva14(
|
|
5452
5729
|
"inline-flex w-fit flex-col gap-[var(--space-0-5)]",
|
|
5453
5730
|
{
|
|
5454
5731
|
variants: {
|
|
@@ -5463,7 +5740,7 @@ var twoTierBadgeVariants = cva13(
|
|
|
5463
5740
|
}
|
|
5464
5741
|
}
|
|
5465
5742
|
);
|
|
5466
|
-
var twoTierBadgeLineVariants =
|
|
5743
|
+
var twoTierBadgeLineVariants = cva14(
|
|
5467
5744
|
[
|
|
5468
5745
|
"inline-flex w-fit shrink-0 items-center justify-center whitespace-nowrap",
|
|
5469
5746
|
"rounded-[var(--radius-xs)] border leading-none",
|
|
@@ -5490,7 +5767,7 @@ var twoTierBadgeLineVariants = cva13(
|
|
|
5490
5767
|
}
|
|
5491
5768
|
}
|
|
5492
5769
|
);
|
|
5493
|
-
var TwoTierBadge =
|
|
5770
|
+
var TwoTierBadge = React27.forwardRef(
|
|
5494
5771
|
({
|
|
5495
5772
|
className,
|
|
5496
5773
|
align,
|
|
@@ -5501,7 +5778,7 @@ var TwoTierBadge = React26.forwardRef(
|
|
|
5501
5778
|
primaryClassName,
|
|
5502
5779
|
secondaryClassName,
|
|
5503
5780
|
...props
|
|
5504
|
-
}, ref) => /* @__PURE__ */
|
|
5781
|
+
}, ref) => /* @__PURE__ */ jsxs33(
|
|
5505
5782
|
"div",
|
|
5506
5783
|
{
|
|
5507
5784
|
ref,
|
|
@@ -5509,7 +5786,7 @@ var TwoTierBadge = React26.forwardRef(
|
|
|
5509
5786
|
className: cn(twoTierBadgeVariants({ align, className })),
|
|
5510
5787
|
...props,
|
|
5511
5788
|
children: [
|
|
5512
|
-
/* @__PURE__ */
|
|
5789
|
+
/* @__PURE__ */ jsx36(
|
|
5513
5790
|
"span",
|
|
5514
5791
|
{
|
|
5515
5792
|
"data-slot": "two-tier-badge-primary",
|
|
@@ -5523,7 +5800,7 @@ var TwoTierBadge = React26.forwardRef(
|
|
|
5523
5800
|
children: primary
|
|
5524
5801
|
}
|
|
5525
5802
|
),
|
|
5526
|
-
secondary ? /* @__PURE__ */
|
|
5803
|
+
secondary ? /* @__PURE__ */ jsx36(
|
|
5527
5804
|
"span",
|
|
5528
5805
|
{
|
|
5529
5806
|
"data-slot": "two-tier-badge-secondary",
|
|
@@ -5544,10 +5821,10 @@ var TwoTierBadge = React26.forwardRef(
|
|
|
5544
5821
|
TwoTierBadge.displayName = "TwoTierBadge";
|
|
5545
5822
|
|
|
5546
5823
|
// src/components/ui/status-badge.tsx
|
|
5547
|
-
import * as
|
|
5548
|
-
import { cva as
|
|
5549
|
-
import { jsx as
|
|
5550
|
-
var statusBadgeVariants =
|
|
5824
|
+
import * as React28 from "react";
|
|
5825
|
+
import { cva as cva15 } from "class-variance-authority";
|
|
5826
|
+
import { jsx as jsx37, jsxs as jsxs34 } from "react/jsx-runtime";
|
|
5827
|
+
var statusBadgeVariants = cva15(
|
|
5551
5828
|
[
|
|
5552
5829
|
"inline-flex w-fit shrink-0 items-center whitespace-nowrap",
|
|
5553
5830
|
"rounded-[var(--radius-full)] border leading-none",
|
|
@@ -5576,10 +5853,10 @@ var statusBadgeVariants = cva14(
|
|
|
5576
5853
|
}
|
|
5577
5854
|
}
|
|
5578
5855
|
);
|
|
5579
|
-
var statusBadgeDotVariants =
|
|
5856
|
+
var statusBadgeDotVariants = cva15(
|
|
5580
5857
|
"size-[var(--space-0-5)] shrink-0 rounded-[var(--radius-full)] bg-current"
|
|
5581
5858
|
);
|
|
5582
|
-
var StatusBadge =
|
|
5859
|
+
var StatusBadge = React28.forwardRef(
|
|
5583
5860
|
({
|
|
5584
5861
|
className,
|
|
5585
5862
|
status = "active",
|
|
@@ -5588,7 +5865,7 @@ var StatusBadge = React27.forwardRef(
|
|
|
5588
5865
|
pulse = true,
|
|
5589
5866
|
children,
|
|
5590
5867
|
...props
|
|
5591
|
-
}, ref) => /* @__PURE__ */
|
|
5868
|
+
}, ref) => /* @__PURE__ */ jsxs34(
|
|
5592
5869
|
"span",
|
|
5593
5870
|
{
|
|
5594
5871
|
ref,
|
|
@@ -5597,7 +5874,7 @@ var StatusBadge = React27.forwardRef(
|
|
|
5597
5874
|
className: cn(statusBadgeVariants({ status, size, className })),
|
|
5598
5875
|
...props,
|
|
5599
5876
|
children: [
|
|
5600
|
-
showDot ? /* @__PURE__ */
|
|
5877
|
+
showDot ? /* @__PURE__ */ jsx37(
|
|
5601
5878
|
"span",
|
|
5602
5879
|
{
|
|
5603
5880
|
"aria-hidden": "true",
|
|
@@ -5617,10 +5894,10 @@ var StatusBadge = React27.forwardRef(
|
|
|
5617
5894
|
StatusBadge.displayName = "StatusBadge";
|
|
5618
5895
|
|
|
5619
5896
|
// src/components/ui/notification-badge.tsx
|
|
5620
|
-
import * as
|
|
5621
|
-
import { cva as
|
|
5622
|
-
import { jsx as
|
|
5623
|
-
var notificationBadgeVariants =
|
|
5897
|
+
import * as React29 from "react";
|
|
5898
|
+
import { cva as cva16 } from "class-variance-authority";
|
|
5899
|
+
import { jsx as jsx38 } from "react/jsx-runtime";
|
|
5900
|
+
var notificationBadgeVariants = cva16(
|
|
5624
5901
|
[
|
|
5625
5902
|
"inline-flex shrink-0 items-center justify-center rounded-[var(--radius-full)]",
|
|
5626
5903
|
"bg-[var(--semantic-error,var(--error))] text-[var(--error-contrast)]",
|
|
@@ -5650,7 +5927,7 @@ function formatNotificationCount(count, max) {
|
|
|
5650
5927
|
}
|
|
5651
5928
|
return String(count);
|
|
5652
5929
|
}
|
|
5653
|
-
var NotificationBadge =
|
|
5930
|
+
var NotificationBadge = React29.forwardRef(
|
|
5654
5931
|
({
|
|
5655
5932
|
className,
|
|
5656
5933
|
count,
|
|
@@ -5665,7 +5942,7 @@ var NotificationBadge = React28.forwardRef(
|
|
|
5665
5942
|
}
|
|
5666
5943
|
const normalizedMax = Math.max(1, Math.floor(max));
|
|
5667
5944
|
const label = ariaLabel ?? (count > normalizedMax ? `\uC77D\uC9C0 \uC54A\uC740 \uC54C\uB9BC ${normalizedMax}\uAC1C \uC774\uC0C1` : `\uC77D\uC9C0 \uC54A\uC740 \uC54C\uB9BC ${count}\uAC1C`);
|
|
5668
|
-
return /* @__PURE__ */
|
|
5945
|
+
return /* @__PURE__ */ jsx38(
|
|
5669
5946
|
"span",
|
|
5670
5947
|
{
|
|
5671
5948
|
ref,
|
|
@@ -5683,12 +5960,12 @@ var NotificationBadge = React28.forwardRef(
|
|
|
5683
5960
|
NotificationBadge.displayName = "NotificationBadge";
|
|
5684
5961
|
|
|
5685
5962
|
// src/components/ui/chip.tsx
|
|
5686
|
-
import * as
|
|
5687
|
-
import { cva as
|
|
5688
|
-
import { X as
|
|
5963
|
+
import * as React30 from "react";
|
|
5964
|
+
import { cva as cva17 } from "class-variance-authority";
|
|
5965
|
+
import { X as X4 } from "lucide-react";
|
|
5689
5966
|
import { Slot as Slot2 } from "radix-ui";
|
|
5690
|
-
import { jsx as
|
|
5691
|
-
var chipVariants =
|
|
5967
|
+
import { jsx as jsx39, jsxs as jsxs35 } from "react/jsx-runtime";
|
|
5968
|
+
var chipVariants = cva17(
|
|
5692
5969
|
[
|
|
5693
5970
|
"inline-flex w-fit shrink-0 items-center justify-center whitespace-nowrap",
|
|
5694
5971
|
"rounded-[var(--radius-full)] border leading-none",
|
|
@@ -5751,7 +6028,7 @@ var chipVariants = cva16(
|
|
|
5751
6028
|
}
|
|
5752
6029
|
}
|
|
5753
6030
|
);
|
|
5754
|
-
var chipCountVariants =
|
|
6031
|
+
var chipCountVariants = cva17(
|
|
5755
6032
|
[
|
|
5756
6033
|
"inline-flex min-w-[var(--space-2)] items-center justify-center",
|
|
5757
6034
|
"rounded-[var(--radius-full)] px-[var(--space-0-5)]",
|
|
@@ -5779,7 +6056,7 @@ var chipCountVariants = cva16(
|
|
|
5779
6056
|
}
|
|
5780
6057
|
}
|
|
5781
6058
|
);
|
|
5782
|
-
var Chip =
|
|
6059
|
+
var Chip = React30.forwardRef(
|
|
5783
6060
|
({
|
|
5784
6061
|
className,
|
|
5785
6062
|
variant = "filter",
|
|
@@ -5794,7 +6071,7 @@ var Chip = React29.forwardRef(
|
|
|
5794
6071
|
}, ref) => {
|
|
5795
6072
|
const Comp = asChild ? Slot2.Root : "button";
|
|
5796
6073
|
const removable = variant === "removable";
|
|
5797
|
-
return /* @__PURE__ */
|
|
6074
|
+
return /* @__PURE__ */ jsxs35(
|
|
5798
6075
|
Comp,
|
|
5799
6076
|
{
|
|
5800
6077
|
ref,
|
|
@@ -5809,7 +6086,7 @@ var Chip = React29.forwardRef(
|
|
|
5809
6086
|
...props,
|
|
5810
6087
|
children: [
|
|
5811
6088
|
children,
|
|
5812
|
-
count !== void 0 ? /* @__PURE__ */
|
|
6089
|
+
count !== void 0 ? /* @__PURE__ */ jsx39(
|
|
5813
6090
|
"span",
|
|
5814
6091
|
{
|
|
5815
6092
|
"aria-hidden": "true",
|
|
@@ -5819,13 +6096,13 @@ var Chip = React29.forwardRef(
|
|
|
5819
6096
|
children: count
|
|
5820
6097
|
}
|
|
5821
6098
|
) : null,
|
|
5822
|
-
removable ? /* @__PURE__ */
|
|
6099
|
+
removable ? /* @__PURE__ */ jsx39(
|
|
5823
6100
|
"span",
|
|
5824
6101
|
{
|
|
5825
6102
|
"aria-label": removeLabel,
|
|
5826
6103
|
"data-slot": "chip-remove",
|
|
5827
6104
|
className: "inline-flex size-[var(--space-2)] items-center justify-center rounded-[var(--radius-full)] text-text-tertiary",
|
|
5828
|
-
children: /* @__PURE__ */
|
|
6105
|
+
children: /* @__PURE__ */ jsx39(X4, { "aria-hidden": "true", size: 14, strokeWidth: 2.25 })
|
|
5829
6106
|
}
|
|
5830
6107
|
) : null
|
|
5831
6108
|
]
|
|
@@ -5836,10 +6113,10 @@ var Chip = React29.forwardRef(
|
|
|
5836
6113
|
Chip.displayName = "Chip";
|
|
5837
6114
|
|
|
5838
6115
|
// src/components/ui/empty-state.tsx
|
|
5839
|
-
import * as
|
|
5840
|
-
import { cva as
|
|
5841
|
-
import { jsx as
|
|
5842
|
-
var emptyStateBaseVariants =
|
|
6116
|
+
import * as React31 from "react";
|
|
6117
|
+
import { cva as cva18 } from "class-variance-authority";
|
|
6118
|
+
import { jsx as jsx40, jsxs as jsxs36 } from "react/jsx-runtime";
|
|
6119
|
+
var emptyStateBaseVariants = cva18(
|
|
5843
6120
|
[
|
|
5844
6121
|
"flex flex-col items-center justify-center text-center",
|
|
5845
6122
|
"rounded-[var(--radius-md)] border border-[var(--border-subtle)]",
|
|
@@ -5876,7 +6153,7 @@ function emptyStateVariants({ size, tone = "neutral", surface, className } = {})
|
|
|
5876
6153
|
className
|
|
5877
6154
|
);
|
|
5878
6155
|
}
|
|
5879
|
-
var emptyStateIconVariants =
|
|
6156
|
+
var emptyStateIconVariants = cva18(
|
|
5880
6157
|
[
|
|
5881
6158
|
"inline-flex items-center justify-center rounded-[var(--radius-full)]",
|
|
5882
6159
|
"border border-[var(--border-subtle)] bg-[var(--bg-raised)] text-text-tertiary"
|
|
@@ -5894,12 +6171,12 @@ var emptyStateIconVariants = cva17(
|
|
|
5894
6171
|
}
|
|
5895
6172
|
}
|
|
5896
6173
|
);
|
|
5897
|
-
var
|
|
6174
|
+
var iconSize3 = {
|
|
5898
6175
|
sm: 18,
|
|
5899
6176
|
md: 20,
|
|
5900
6177
|
lg: 24
|
|
5901
6178
|
};
|
|
5902
|
-
var EmptyState =
|
|
6179
|
+
var EmptyState = React31.forwardRef(
|
|
5903
6180
|
({
|
|
5904
6181
|
className,
|
|
5905
6182
|
size = "md",
|
|
@@ -5913,7 +6190,7 @@ var EmptyState = React30.forwardRef(
|
|
|
5913
6190
|
...props
|
|
5914
6191
|
}, ref) => {
|
|
5915
6192
|
const resolvedSize = size ?? "md";
|
|
5916
|
-
return /* @__PURE__ */
|
|
6193
|
+
return /* @__PURE__ */ jsxs36(
|
|
5917
6194
|
"div",
|
|
5918
6195
|
{
|
|
5919
6196
|
ref,
|
|
@@ -5922,17 +6199,17 @@ var EmptyState = React30.forwardRef(
|
|
|
5922
6199
|
className: cn(emptyStateVariants({ size, tone, surface, className })),
|
|
5923
6200
|
...props,
|
|
5924
6201
|
children: [
|
|
5925
|
-
Icon ? /* @__PURE__ */
|
|
6202
|
+
Icon ? /* @__PURE__ */ jsx40(
|
|
5926
6203
|
"span",
|
|
5927
6204
|
{
|
|
5928
6205
|
"aria-hidden": "true",
|
|
5929
6206
|
"data-slot": "empty-state-icon",
|
|
5930
6207
|
className: emptyStateIconVariants({ size: resolvedSize }),
|
|
5931
|
-
children: /* @__PURE__ */
|
|
6208
|
+
children: /* @__PURE__ */ jsx40(Icon, { size: iconSize3[resolvedSize], strokeWidth: 1.75 })
|
|
5932
6209
|
}
|
|
5933
6210
|
) : null,
|
|
5934
|
-
/* @__PURE__ */
|
|
5935
|
-
/* @__PURE__ */
|
|
6211
|
+
/* @__PURE__ */ jsxs36("div", { className: "flex max-w-[420px] flex-col items-center gap-[var(--space-1)]", children: [
|
|
6212
|
+
/* @__PURE__ */ jsx40(
|
|
5936
6213
|
"h2",
|
|
5937
6214
|
{
|
|
5938
6215
|
"data-slot": "empty-state-title",
|
|
@@ -5940,7 +6217,7 @@ var EmptyState = React30.forwardRef(
|
|
|
5940
6217
|
children: title
|
|
5941
6218
|
}
|
|
5942
6219
|
),
|
|
5943
|
-
description ? /* @__PURE__ */
|
|
6220
|
+
description ? /* @__PURE__ */ jsx40(
|
|
5944
6221
|
"p",
|
|
5945
6222
|
{
|
|
5946
6223
|
"data-slot": "empty-state-description",
|
|
@@ -5948,7 +6225,7 @@ var EmptyState = React30.forwardRef(
|
|
|
5948
6225
|
children: description
|
|
5949
6226
|
}
|
|
5950
6227
|
) : null,
|
|
5951
|
-
hint ? /* @__PURE__ */
|
|
6228
|
+
hint ? /* @__PURE__ */ jsx40(
|
|
5952
6229
|
"p",
|
|
5953
6230
|
{
|
|
5954
6231
|
"data-slot": "empty-state-hint",
|
|
@@ -5957,7 +6234,7 @@ var EmptyState = React30.forwardRef(
|
|
|
5957
6234
|
}
|
|
5958
6235
|
) : null
|
|
5959
6236
|
] }),
|
|
5960
|
-
action ? /* @__PURE__ */
|
|
6237
|
+
action ? /* @__PURE__ */ jsx40("div", { "data-slot": "empty-state-action", className: "mt-[var(--space-1)]", children: action }) : null
|
|
5961
6238
|
]
|
|
5962
6239
|
}
|
|
5963
6240
|
);
|
|
@@ -5966,11 +6243,11 @@ var EmptyState = React30.forwardRef(
|
|
|
5966
6243
|
EmptyState.displayName = "EmptyState";
|
|
5967
6244
|
|
|
5968
6245
|
// src/components/ui/error-state.tsx
|
|
5969
|
-
import * as
|
|
6246
|
+
import * as React32 from "react";
|
|
5970
6247
|
import { AlertTriangle as AlertTriangle2 } from "lucide-react";
|
|
5971
|
-
import { cva as
|
|
5972
|
-
import { jsx as
|
|
5973
|
-
var errorStateVariants =
|
|
6248
|
+
import { cva as cva19 } from "class-variance-authority";
|
|
6249
|
+
import { jsx as jsx41, jsxs as jsxs37 } from "react/jsx-runtime";
|
|
6250
|
+
var errorStateVariants = cva19(
|
|
5974
6251
|
[
|
|
5975
6252
|
"flex flex-col items-center justify-center text-center",
|
|
5976
6253
|
"rounded-[var(--radius-md)] border border-[var(--border-subtle)]",
|
|
@@ -5991,7 +6268,7 @@ var errorStateVariants = cva18(
|
|
|
5991
6268
|
}
|
|
5992
6269
|
}
|
|
5993
6270
|
);
|
|
5994
|
-
var ErrorState =
|
|
6271
|
+
var ErrorState = React32.forwardRef(
|
|
5995
6272
|
({
|
|
5996
6273
|
className,
|
|
5997
6274
|
size = "md",
|
|
@@ -6002,7 +6279,7 @@ var ErrorState = React31.forwardRef(
|
|
|
6002
6279
|
onRetry,
|
|
6003
6280
|
retryLabel = "\uB2E4\uC2DC \uC2DC\uB3C4",
|
|
6004
6281
|
...props
|
|
6005
|
-
}, ref) => /* @__PURE__ */
|
|
6282
|
+
}, ref) => /* @__PURE__ */ jsxs37(
|
|
6006
6283
|
"div",
|
|
6007
6284
|
{
|
|
6008
6285
|
ref,
|
|
@@ -6011,17 +6288,17 @@ var ErrorState = React31.forwardRef(
|
|
|
6011
6288
|
className: cn(errorStateVariants({ size, surface, className })),
|
|
6012
6289
|
...props,
|
|
6013
6290
|
children: [
|
|
6014
|
-
/* @__PURE__ */
|
|
6291
|
+
/* @__PURE__ */ jsx41(
|
|
6015
6292
|
"span",
|
|
6016
6293
|
{
|
|
6017
6294
|
"aria-hidden": "true",
|
|
6018
6295
|
"data-slot": "error-state-icon",
|
|
6019
6296
|
className: "inline-flex size-[48px] items-center justify-center rounded-[var(--radius-full)] bg-[var(--error-bg)] text-[var(--error)]",
|
|
6020
|
-
children: /* @__PURE__ */
|
|
6297
|
+
children: /* @__PURE__ */ jsx41(AlertTriangle2, { size: 24, strokeWidth: 1.75 })
|
|
6021
6298
|
}
|
|
6022
6299
|
),
|
|
6023
|
-
/* @__PURE__ */
|
|
6024
|
-
/* @__PURE__ */
|
|
6300
|
+
/* @__PURE__ */ jsxs37("div", { className: "flex max-w-[420px] flex-col items-center gap-[var(--space-1)]", children: [
|
|
6301
|
+
/* @__PURE__ */ jsx41(
|
|
6025
6302
|
"h2",
|
|
6026
6303
|
{
|
|
6027
6304
|
"data-slot": "error-state-title",
|
|
@@ -6029,7 +6306,7 @@ var ErrorState = React31.forwardRef(
|
|
|
6029
6306
|
children: title
|
|
6030
6307
|
}
|
|
6031
6308
|
),
|
|
6032
|
-
/* @__PURE__ */
|
|
6309
|
+
/* @__PURE__ */ jsx41(
|
|
6033
6310
|
"p",
|
|
6034
6311
|
{
|
|
6035
6312
|
"data-slot": "error-state-message",
|
|
@@ -6037,7 +6314,7 @@ var ErrorState = React31.forwardRef(
|
|
|
6037
6314
|
children: message
|
|
6038
6315
|
}
|
|
6039
6316
|
),
|
|
6040
|
-
errorCode ? /* @__PURE__ */
|
|
6317
|
+
errorCode ? /* @__PURE__ */ jsx41(
|
|
6041
6318
|
"p",
|
|
6042
6319
|
{
|
|
6043
6320
|
"data-slot": "error-state-code",
|
|
@@ -6046,7 +6323,7 @@ var ErrorState = React31.forwardRef(
|
|
|
6046
6323
|
}
|
|
6047
6324
|
) : null
|
|
6048
6325
|
] }),
|
|
6049
|
-
onRetry ? /* @__PURE__ */
|
|
6326
|
+
onRetry ? /* @__PURE__ */ jsx41(Button, { size: "sm", variant: "outline", onClick: onRetry, children: retryLabel }) : null
|
|
6050
6327
|
]
|
|
6051
6328
|
}
|
|
6052
6329
|
)
|
|
@@ -6054,10 +6331,10 @@ var ErrorState = React31.forwardRef(
|
|
|
6054
6331
|
ErrorState.displayName = "ErrorState";
|
|
6055
6332
|
|
|
6056
6333
|
// src/components/ui/skeleton.tsx
|
|
6057
|
-
import * as
|
|
6058
|
-
import { cva as
|
|
6059
|
-
import { jsx as
|
|
6060
|
-
var skeletonVariants =
|
|
6334
|
+
import * as React33 from "react";
|
|
6335
|
+
import { cva as cva20 } from "class-variance-authority";
|
|
6336
|
+
import { jsx as jsx42 } from "react/jsx-runtime";
|
|
6337
|
+
var skeletonVariants = cva20(
|
|
6061
6338
|
[
|
|
6062
6339
|
"animate-pulse rounded-[var(--radius-sm)] bg-[var(--bg-raised)]",
|
|
6063
6340
|
"motion-reduce:animate-none motion-reduce:opacity-80"
|
|
@@ -6075,7 +6352,7 @@ var skeletonVariants = cva19(
|
|
|
6075
6352
|
}
|
|
6076
6353
|
}
|
|
6077
6354
|
);
|
|
6078
|
-
var spinnerVariants =
|
|
6355
|
+
var spinnerVariants = cva20(
|
|
6079
6356
|
[
|
|
6080
6357
|
"inline-block shrink-0 animate-spin rounded-[var(--radius-full)] border-2",
|
|
6081
6358
|
"border-[var(--border-subtle)] border-t-[var(--accent-solid)]",
|
|
@@ -6098,8 +6375,8 @@ var spinnerVariants = cva19(
|
|
|
6098
6375
|
}
|
|
6099
6376
|
}
|
|
6100
6377
|
);
|
|
6101
|
-
var Skeleton =
|
|
6102
|
-
({ className, shape, style, ...props }, ref) => /* @__PURE__ */
|
|
6378
|
+
var Skeleton = React33.forwardRef(
|
|
6379
|
+
({ className, shape, style, ...props }, ref) => /* @__PURE__ */ jsx42(
|
|
6103
6380
|
"div",
|
|
6104
6381
|
{
|
|
6105
6382
|
ref,
|
|
@@ -6112,15 +6389,15 @@ var Skeleton = React32.forwardRef(
|
|
|
6112
6389
|
);
|
|
6113
6390
|
Skeleton.displayName = "Skeleton";
|
|
6114
6391
|
var defaultTextWidths = ["92%", "84%", "68%", "76%"];
|
|
6115
|
-
var SkeletonText =
|
|
6116
|
-
({ className, lines = 3, widths = defaultTextWidths, ...props }, ref) => /* @__PURE__ */
|
|
6392
|
+
var SkeletonText = React33.forwardRef(
|
|
6393
|
+
({ className, lines = 3, widths = defaultTextWidths, ...props }, ref) => /* @__PURE__ */ jsx42(
|
|
6117
6394
|
"div",
|
|
6118
6395
|
{
|
|
6119
6396
|
ref,
|
|
6120
6397
|
"data-slot": "skeleton-text",
|
|
6121
6398
|
className: cn("flex flex-col gap-[var(--space-1)]", className),
|
|
6122
6399
|
...props,
|
|
6123
|
-
children: Array.from({ length: lines }, (_, index) => /* @__PURE__ */
|
|
6400
|
+
children: Array.from({ length: lines }, (_, index) => /* @__PURE__ */ jsx42(
|
|
6124
6401
|
Skeleton,
|
|
6125
6402
|
{
|
|
6126
6403
|
shape: "text",
|
|
@@ -6132,7 +6409,7 @@ var SkeletonText = React32.forwardRef(
|
|
|
6132
6409
|
)
|
|
6133
6410
|
);
|
|
6134
6411
|
SkeletonText.displayName = "SkeletonText";
|
|
6135
|
-
var SkeletonRow =
|
|
6412
|
+
var SkeletonRow = React33.forwardRef(
|
|
6136
6413
|
({
|
|
6137
6414
|
className,
|
|
6138
6415
|
columns,
|
|
@@ -6143,7 +6420,7 @@ var SkeletonRow = React32.forwardRef(
|
|
|
6143
6420
|
}, ref) => {
|
|
6144
6421
|
const rowCount = Math.max(5, count);
|
|
6145
6422
|
const gridTemplateColumns = columns.map((column) => column.width ?? "1fr").join(" ");
|
|
6146
|
-
return /* @__PURE__ */
|
|
6423
|
+
return /* @__PURE__ */ jsx42(
|
|
6147
6424
|
"div",
|
|
6148
6425
|
{
|
|
6149
6426
|
ref,
|
|
@@ -6157,7 +6434,7 @@ var SkeletonRow = React32.forwardRef(
|
|
|
6157
6434
|
className
|
|
6158
6435
|
),
|
|
6159
6436
|
...props,
|
|
6160
|
-
children: Array.from({ length: rowCount }, (_, rowIndex) => /* @__PURE__ */
|
|
6437
|
+
children: Array.from({ length: rowCount }, (_, rowIndex) => /* @__PURE__ */ jsx42(
|
|
6161
6438
|
"div",
|
|
6162
6439
|
{
|
|
6163
6440
|
"data-slot": "skeleton-row",
|
|
@@ -6165,11 +6442,11 @@ var SkeletonRow = React32.forwardRef(
|
|
|
6165
6442
|
"grid min-h-[48px] items-center border-t border-[var(--border-subtle)] first:border-t-0"
|
|
6166
6443
|
),
|
|
6167
6444
|
style: { gridTemplateColumns },
|
|
6168
|
-
children: columns.map((column, columnIndex) => /* @__PURE__ */
|
|
6445
|
+
children: columns.map((column, columnIndex) => /* @__PURE__ */ jsx42(
|
|
6169
6446
|
"div",
|
|
6170
6447
|
{
|
|
6171
6448
|
className: "px-[var(--space-2)] py-[var(--space-1)]",
|
|
6172
|
-
children: /* @__PURE__ */
|
|
6449
|
+
children: /* @__PURE__ */ jsx42(
|
|
6173
6450
|
Skeleton,
|
|
6174
6451
|
{
|
|
6175
6452
|
shape: "text",
|
|
@@ -6189,8 +6466,8 @@ var SkeletonRow = React32.forwardRef(
|
|
|
6189
6466
|
}
|
|
6190
6467
|
);
|
|
6191
6468
|
SkeletonRow.displayName = "SkeletonRow";
|
|
6192
|
-
var Spinner =
|
|
6193
|
-
({ className, size, label = "\uB85C\uB529 \uC911", ...props }, ref) => /* @__PURE__ */
|
|
6469
|
+
var Spinner = React33.forwardRef(
|
|
6470
|
+
({ className, size, label = "\uB85C\uB529 \uC911", ...props }, ref) => /* @__PURE__ */ jsx42(
|
|
6194
6471
|
"span",
|
|
6195
6472
|
{
|
|
6196
6473
|
ref,
|
|
@@ -6204,155 +6481,11 @@ var Spinner = React32.forwardRef(
|
|
|
6204
6481
|
);
|
|
6205
6482
|
Spinner.displayName = "Spinner";
|
|
6206
6483
|
|
|
6207
|
-
// src/components/ui/icon-button.tsx
|
|
6208
|
-
import * as React33 from "react";
|
|
6209
|
-
import { cva as cva20 } from "class-variance-authority";
|
|
6210
|
-
import { jsx as jsx40, jsxs as jsxs35 } from "react/jsx-runtime";
|
|
6211
|
-
var iconButtonVariants = cva20(
|
|
6212
|
-
[
|
|
6213
|
-
"olun-icon-button relative inline-flex cursor-pointer shrink-0 items-center justify-center",
|
|
6214
|
-
"rounded-[var(--radius-sm)] border font-medium",
|
|
6215
|
-
"transition-colors motion-reduce:transition-none",
|
|
6216
|
-
"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--focus-ring)]",
|
|
6217
|
-
"disabled:cursor-not-allowed disabled:bg-[var(--action-disabled-bg)] disabled:text-text-disabled",
|
|
6218
|
-
"[&_svg]:pointer-events-none [&_svg]:shrink-0"
|
|
6219
|
-
].join(" "),
|
|
6220
|
-
{
|
|
6221
|
-
variants: {
|
|
6222
|
-
variant: {
|
|
6223
|
-
ghost: "border-transparent bg-transparent text-text-secondary hover:bg-[var(--action-hover)] hover:text-foreground",
|
|
6224
|
-
outline: "border-[var(--border-subtle)] bg-[var(--bg-surface)] text-text-secondary hover:border-[var(--border-accent)] hover:bg-[var(--action-hover)] hover:text-foreground",
|
|
6225
|
-
subtle: "border-transparent bg-[var(--bg-raised)] text-text-secondary hover:bg-[var(--action-hover)] hover:text-foreground",
|
|
6226
|
-
danger: "border-transparent bg-[var(--error-bg)] text-[var(--error)] hover:bg-[var(--action-hover)]"
|
|
6227
|
-
},
|
|
6228
|
-
size: {
|
|
6229
|
-
sm: "size-[var(--space-4)]",
|
|
6230
|
-
md: "size-[var(--touch-target-min)]",
|
|
6231
|
-
lg: "size-[var(--space-6)]"
|
|
6232
|
-
},
|
|
6233
|
-
pressed: {
|
|
6234
|
-
true: "",
|
|
6235
|
-
false: ""
|
|
6236
|
-
}
|
|
6237
|
-
},
|
|
6238
|
-
compoundVariants: [
|
|
6239
|
-
{
|
|
6240
|
-
pressed: true,
|
|
6241
|
-
variant: ["ghost", "outline", "subtle"],
|
|
6242
|
-
className: "border-[var(--border-accent)] bg-[var(--action-selected)] text-foreground"
|
|
6243
|
-
},
|
|
6244
|
-
{
|
|
6245
|
-
pressed: true,
|
|
6246
|
-
variant: "danger",
|
|
6247
|
-
className: "border-[var(--error)] bg-[var(--error-bg)] text-[var(--error)]"
|
|
6248
|
-
}
|
|
6249
|
-
],
|
|
6250
|
-
defaultVariants: {
|
|
6251
|
-
variant: "ghost",
|
|
6252
|
-
size: "md",
|
|
6253
|
-
pressed: false
|
|
6254
|
-
}
|
|
6255
|
-
}
|
|
6256
|
-
);
|
|
6257
|
-
var iconButtonBadgeVariants = cva20(
|
|
6258
|
-
[
|
|
6259
|
-
"pointer-events-none absolute right-0 top-0 inline-flex",
|
|
6260
|
-
"olun-icon-button__badge",
|
|
6261
|
-
"min-h-[var(--space-1-5)] min-w-[var(--space-1-5)] translate-x-1/3 -translate-y-1/3",
|
|
6262
|
-
"items-center justify-center gap-[2px] rounded-[var(--radius-full)] px-[3px]",
|
|
6263
|
-
"font-[family-name:var(--font-display)] text-[10px] font-semibold leading-none",
|
|
6264
|
-
"[&:has(svg)]:size-[var(--space-1-5)] [&:has(svg)]:px-0 [&_svg]:size-[10px]"
|
|
6265
|
-
].join(" "),
|
|
6266
|
-
{
|
|
6267
|
-
variants: {
|
|
6268
|
-
tone: {
|
|
6269
|
-
info: "bg-[var(--accent-solid)] text-[var(--accent-on-solid)]",
|
|
6270
|
-
error: "bg-[var(--error)] text-[var(--error-contrast)]"
|
|
6271
|
-
}
|
|
6272
|
-
},
|
|
6273
|
-
defaultVariants: {
|
|
6274
|
-
tone: "info"
|
|
6275
|
-
}
|
|
6276
|
-
}
|
|
6277
|
-
);
|
|
6278
|
-
var iconSize3 = {
|
|
6279
|
-
sm: 14,
|
|
6280
|
-
md: 16,
|
|
6281
|
-
lg: 18
|
|
6282
|
-
};
|
|
6283
|
-
var iconStrokeWidth = {
|
|
6284
|
-
sm: 2.25,
|
|
6285
|
-
md: 2.25,
|
|
6286
|
-
lg: 1.75
|
|
6287
|
-
};
|
|
6288
|
-
var IconButton = React33.forwardRef(
|
|
6289
|
-
({
|
|
6290
|
-
className,
|
|
6291
|
-
variant = "ghost",
|
|
6292
|
-
size = "md",
|
|
6293
|
-
pressed = false,
|
|
6294
|
-
icon: Icon,
|
|
6295
|
-
badge,
|
|
6296
|
-
badgeTone = "info",
|
|
6297
|
-
type,
|
|
6298
|
-
title,
|
|
6299
|
-
"aria-label": ariaLabel,
|
|
6300
|
-
"aria-labelledby": ariaLabelledBy,
|
|
6301
|
-
...props
|
|
6302
|
-
}, ref) => {
|
|
6303
|
-
const resolvedSize = size ?? "md";
|
|
6304
|
-
const isToggle = pressed !== void 0;
|
|
6305
|
-
const isPressed = pressed === true;
|
|
6306
|
-
const hoverTitle = title ?? (typeof ariaLabel === "string" ? ariaLabel : void 0);
|
|
6307
|
-
return /* @__PURE__ */ jsxs35(
|
|
6308
|
-
"button",
|
|
6309
|
-
{
|
|
6310
|
-
ref,
|
|
6311
|
-
...props,
|
|
6312
|
-
"data-slot": "icon-button",
|
|
6313
|
-
"data-variant": variant,
|
|
6314
|
-
"data-size": resolvedSize,
|
|
6315
|
-
"data-pressed": isToggle ? String(isPressed) : void 0,
|
|
6316
|
-
"aria-label": ariaLabel,
|
|
6317
|
-
"aria-labelledby": ariaLabelledBy,
|
|
6318
|
-
"aria-pressed": isToggle ? isPressed : void 0,
|
|
6319
|
-
title: hoverTitle,
|
|
6320
|
-
className: cn(
|
|
6321
|
-
iconButtonVariants({ variant, size, pressed: isPressed, className })
|
|
6322
|
-
),
|
|
6323
|
-
type: type ?? "button",
|
|
6324
|
-
children: [
|
|
6325
|
-
/* @__PURE__ */ jsx40(
|
|
6326
|
-
Icon,
|
|
6327
|
-
{
|
|
6328
|
-
"aria-hidden": "true",
|
|
6329
|
-
"data-slot": "icon-button-icon",
|
|
6330
|
-
size: iconSize3[resolvedSize],
|
|
6331
|
-
strokeWidth: iconStrokeWidth[resolvedSize]
|
|
6332
|
-
}
|
|
6333
|
-
),
|
|
6334
|
-
badge !== void 0 ? /* @__PURE__ */ jsx40(
|
|
6335
|
-
"span",
|
|
6336
|
-
{
|
|
6337
|
-
"aria-hidden": "true",
|
|
6338
|
-
"data-slot": "icon-button-badge",
|
|
6339
|
-
"data-badge-tone": badgeTone,
|
|
6340
|
-
className: iconButtonBadgeVariants({ tone: badgeTone }),
|
|
6341
|
-
children: badge
|
|
6342
|
-
}
|
|
6343
|
-
) : null
|
|
6344
|
-
]
|
|
6345
|
-
}
|
|
6346
|
-
);
|
|
6347
|
-
}
|
|
6348
|
-
);
|
|
6349
|
-
IconButton.displayName = "IconButton";
|
|
6350
|
-
|
|
6351
6484
|
// src/components/ui/pagination.tsx
|
|
6352
6485
|
import * as React34 from "react";
|
|
6353
6486
|
import { ChevronsLeft, ChevronLeft, ChevronRight, ChevronsRight } from "lucide-react";
|
|
6354
6487
|
import { cva as cva21 } from "class-variance-authority";
|
|
6355
|
-
import { jsx as
|
|
6488
|
+
import { jsx as jsx43, jsxs as jsxs38 } from "react/jsx-runtime";
|
|
6356
6489
|
var paginationVariants = cva21(
|
|
6357
6490
|
[
|
|
6358
6491
|
"flex w-full flex-col gap-[var(--space-1-5)]",
|
|
@@ -6427,7 +6560,7 @@ function NavigationButton({
|
|
|
6427
6560
|
icon: Icon,
|
|
6428
6561
|
onPageChange
|
|
6429
6562
|
}) {
|
|
6430
|
-
return /* @__PURE__ */
|
|
6563
|
+
return /* @__PURE__ */ jsx43(
|
|
6431
6564
|
"button",
|
|
6432
6565
|
{
|
|
6433
6566
|
"aria-label": label,
|
|
@@ -6435,7 +6568,7 @@ function NavigationButton({
|
|
|
6435
6568
|
className: paginationControlVariants({ size }),
|
|
6436
6569
|
type: "button",
|
|
6437
6570
|
onClick: () => onPageChange?.(page),
|
|
6438
|
-
children: /* @__PURE__ */
|
|
6571
|
+
children: /* @__PURE__ */ jsx43(Icon, { "aria-hidden": "true", "data-slot": "pagination-icon" })
|
|
6439
6572
|
}
|
|
6440
6573
|
);
|
|
6441
6574
|
}
|
|
@@ -6467,7 +6600,7 @@ var Pagination = React34.forwardRef(
|
|
|
6467
6600
|
value: String(option),
|
|
6468
6601
|
label: option
|
|
6469
6602
|
}));
|
|
6470
|
-
return /* @__PURE__ */
|
|
6603
|
+
return /* @__PURE__ */ jsxs38(
|
|
6471
6604
|
"nav",
|
|
6472
6605
|
{
|
|
6473
6606
|
ref,
|
|
@@ -6477,16 +6610,16 @@ var Pagination = React34.forwardRef(
|
|
|
6477
6610
|
className: cn(paginationVariants({ size: resolvedSize, className })),
|
|
6478
6611
|
...props,
|
|
6479
6612
|
children: [
|
|
6480
|
-
/* @__PURE__ */
|
|
6481
|
-
/* @__PURE__ */
|
|
6482
|
-
/* @__PURE__ */
|
|
6613
|
+
/* @__PURE__ */ jsxs38("div", { className: "flex flex-wrap items-center gap-[var(--space-1-5)]", children: [
|
|
6614
|
+
/* @__PURE__ */ jsx43("span", { "data-slot": "pagination-total", className: "font-medium text-text-secondary", children: totalLabel(total) }),
|
|
6615
|
+
/* @__PURE__ */ jsxs38(
|
|
6483
6616
|
"div",
|
|
6484
6617
|
{
|
|
6485
6618
|
"data-slot": "pagination-size",
|
|
6486
6619
|
className: "inline-flex items-center gap-[var(--space-1)] text-xs text-text-tertiary",
|
|
6487
6620
|
children: [
|
|
6488
|
-
/* @__PURE__ */
|
|
6489
|
-
/* @__PURE__ */
|
|
6621
|
+
/* @__PURE__ */ jsx43("span", { children: pageSizeLabel }),
|
|
6622
|
+
/* @__PURE__ */ jsx43(
|
|
6490
6623
|
Select,
|
|
6491
6624
|
{
|
|
6492
6625
|
"aria-label": pageSizeLabel,
|
|
@@ -6502,13 +6635,13 @@ var Pagination = React34.forwardRef(
|
|
|
6502
6635
|
}
|
|
6503
6636
|
)
|
|
6504
6637
|
] }),
|
|
6505
|
-
/* @__PURE__ */
|
|
6638
|
+
/* @__PURE__ */ jsxs38(
|
|
6506
6639
|
"div",
|
|
6507
6640
|
{
|
|
6508
6641
|
"data-slot": "pagination-list",
|
|
6509
6642
|
className: "flex items-center justify-center gap-[var(--space-0-5)]",
|
|
6510
6643
|
children: [
|
|
6511
|
-
/* @__PURE__ */
|
|
6644
|
+
/* @__PURE__ */ jsx43(
|
|
6512
6645
|
NavigationButton,
|
|
6513
6646
|
{
|
|
6514
6647
|
label: "\uCCAB \uD398\uC774\uC9C0",
|
|
@@ -6519,7 +6652,7 @@ var Pagination = React34.forwardRef(
|
|
|
6519
6652
|
onPageChange
|
|
6520
6653
|
}
|
|
6521
6654
|
),
|
|
6522
|
-
/* @__PURE__ */
|
|
6655
|
+
/* @__PURE__ */ jsx43(
|
|
6523
6656
|
NavigationButton,
|
|
6524
6657
|
{
|
|
6525
6658
|
label: "\uC774\uC804 \uD398\uC774\uC9C0",
|
|
@@ -6531,7 +6664,7 @@ var Pagination = React34.forwardRef(
|
|
|
6531
6664
|
}
|
|
6532
6665
|
),
|
|
6533
6666
|
items.map(
|
|
6534
|
-
(item, index) => item === "ellipsis" ? /* @__PURE__ */
|
|
6667
|
+
(item, index) => item === "ellipsis" ? /* @__PURE__ */ jsx43(
|
|
6535
6668
|
"span",
|
|
6536
6669
|
{
|
|
6537
6670
|
"data-slot": "pagination-ellipsis",
|
|
@@ -6543,7 +6676,7 @@ var Pagination = React34.forwardRef(
|
|
|
6543
6676
|
children: "..."
|
|
6544
6677
|
},
|
|
6545
6678
|
`ellipsis-${index}`
|
|
6546
|
-
) : /* @__PURE__ */
|
|
6679
|
+
) : /* @__PURE__ */ jsx43(
|
|
6547
6680
|
"button",
|
|
6548
6681
|
{
|
|
6549
6682
|
"aria-label": `${item} \uD398\uC774\uC9C0`,
|
|
@@ -6557,7 +6690,7 @@ var Pagination = React34.forwardRef(
|
|
|
6557
6690
|
item
|
|
6558
6691
|
)
|
|
6559
6692
|
),
|
|
6560
|
-
/* @__PURE__ */
|
|
6693
|
+
/* @__PURE__ */ jsx43(
|
|
6561
6694
|
NavigationButton,
|
|
6562
6695
|
{
|
|
6563
6696
|
label: "\uB2E4\uC74C \uD398\uC774\uC9C0",
|
|
@@ -6568,7 +6701,7 @@ var Pagination = React34.forwardRef(
|
|
|
6568
6701
|
onPageChange
|
|
6569
6702
|
}
|
|
6570
6703
|
),
|
|
6571
|
-
/* @__PURE__ */
|
|
6704
|
+
/* @__PURE__ */ jsx43(
|
|
6572
6705
|
NavigationButton,
|
|
6573
6706
|
{
|
|
6574
6707
|
label: "\uB9C8\uC9C0\uB9C9 \uD398\uC774\uC9C0",
|
|
@@ -6591,7 +6724,7 @@ Pagination.displayName = "Pagination";
|
|
|
6591
6724
|
|
|
6592
6725
|
// src/components/ui/mode-toggle.tsx
|
|
6593
6726
|
import { cva as cva22 } from "class-variance-authority";
|
|
6594
|
-
import { jsx as
|
|
6727
|
+
import { jsx as jsx44, jsxs as jsxs39 } from "react/jsx-runtime";
|
|
6595
6728
|
var modeToggleVariants = cva22(
|
|
6596
6729
|
[
|
|
6597
6730
|
"inline-flex items-center rounded-[var(--radius-sm)] border border-[var(--border-subtle)]",
|
|
@@ -6621,7 +6754,7 @@ function ModeToggle({
|
|
|
6621
6754
|
onChange,
|
|
6622
6755
|
...props
|
|
6623
6756
|
}) {
|
|
6624
|
-
return /* @__PURE__ */
|
|
6757
|
+
return /* @__PURE__ */ jsx44(
|
|
6625
6758
|
"div",
|
|
6626
6759
|
{
|
|
6627
6760
|
role: "group",
|
|
@@ -6631,7 +6764,7 @@ function ModeToggle({
|
|
|
6631
6764
|
children: options.map((option) => {
|
|
6632
6765
|
const Icon = option.icon;
|
|
6633
6766
|
const isActive = option.value === value;
|
|
6634
|
-
return /* @__PURE__ */
|
|
6767
|
+
return /* @__PURE__ */ jsxs39(
|
|
6635
6768
|
"button",
|
|
6636
6769
|
{
|
|
6637
6770
|
type: "button",
|
|
@@ -6647,8 +6780,8 @@ function ModeToggle({
|
|
|
6647
6780
|
}
|
|
6648
6781
|
},
|
|
6649
6782
|
children: [
|
|
6650
|
-
Icon ? /* @__PURE__ */
|
|
6651
|
-
/* @__PURE__ */
|
|
6783
|
+
Icon ? /* @__PURE__ */ jsx44(Icon, { "aria-hidden": "true", "data-slot": "mode-toggle-icon" }) : null,
|
|
6784
|
+
/* @__PURE__ */ jsx44("span", { children: option.label })
|
|
6652
6785
|
]
|
|
6653
6786
|
},
|
|
6654
6787
|
option.value
|
|
@@ -6661,7 +6794,7 @@ function ModeToggle({
|
|
|
6661
6794
|
// src/components/ui/action-footer.tsx
|
|
6662
6795
|
import * as React35 from "react";
|
|
6663
6796
|
import { cva as cva23 } from "class-variance-authority";
|
|
6664
|
-
import { jsx as
|
|
6797
|
+
import { jsx as jsx45, jsxs as jsxs40 } from "react/jsx-runtime";
|
|
6665
6798
|
var actionFooterVariants = cva23(
|
|
6666
6799
|
[
|
|
6667
6800
|
"flex flex-wrap items-center gap-[var(--space-2)] border-t border-[var(--border-subtle)]",
|
|
@@ -6732,7 +6865,7 @@ function getStatusLabel(status) {
|
|
|
6732
6865
|
}
|
|
6733
6866
|
}
|
|
6734
6867
|
function renderAction(action) {
|
|
6735
|
-
return /* @__PURE__ */
|
|
6868
|
+
return /* @__PURE__ */ jsx45(
|
|
6736
6869
|
Button,
|
|
6737
6870
|
{
|
|
6738
6871
|
variant: action.variant,
|
|
@@ -6763,7 +6896,7 @@ var ActionFooter = React35.forwardRef(
|
|
|
6763
6896
|
const mainActions = sortMainActions(
|
|
6764
6897
|
visibleActions.filter((action) => !destructiveVariants.has(action.variant ?? "default"))
|
|
6765
6898
|
);
|
|
6766
|
-
return /* @__PURE__ */
|
|
6899
|
+
return /* @__PURE__ */ jsxs40(
|
|
6767
6900
|
"div",
|
|
6768
6901
|
{
|
|
6769
6902
|
ref,
|
|
@@ -6772,7 +6905,7 @@ var ActionFooter = React35.forwardRef(
|
|
|
6772
6905
|
className: cn(actionFooterVariants({ position, surface, className })),
|
|
6773
6906
|
...props,
|
|
6774
6907
|
children: [
|
|
6775
|
-
destructiveActions.length > 0 ? /* @__PURE__ */
|
|
6908
|
+
destructiveActions.length > 0 ? /* @__PURE__ */ jsx45(
|
|
6776
6909
|
"div",
|
|
6777
6910
|
{
|
|
6778
6911
|
"data-slot": "action-footer-destructive-actions",
|
|
@@ -6780,7 +6913,7 @@ var ActionFooter = React35.forwardRef(
|
|
|
6780
6913
|
children: destructiveActions.map(renderAction)
|
|
6781
6914
|
}
|
|
6782
6915
|
) : null,
|
|
6783
|
-
status ? /* @__PURE__ */
|
|
6916
|
+
status ? /* @__PURE__ */ jsxs40(
|
|
6784
6917
|
"div",
|
|
6785
6918
|
{
|
|
6786
6919
|
"data-slot": "action-footer-status",
|
|
@@ -6788,7 +6921,7 @@ var ActionFooter = React35.forwardRef(
|
|
|
6788
6921
|
"aria-live": "polite",
|
|
6789
6922
|
className: cn(actionFooterStatusVariants({ kind: status.kind })),
|
|
6790
6923
|
children: [
|
|
6791
|
-
/* @__PURE__ */
|
|
6924
|
+
/* @__PURE__ */ jsx45(
|
|
6792
6925
|
"span",
|
|
6793
6926
|
{
|
|
6794
6927
|
"aria-hidden": "true",
|
|
@@ -6796,11 +6929,11 @@ var ActionFooter = React35.forwardRef(
|
|
|
6796
6929
|
className: "size-[6px] shrink-0 rounded-[var(--radius-full)]"
|
|
6797
6930
|
}
|
|
6798
6931
|
),
|
|
6799
|
-
/* @__PURE__ */
|
|
6932
|
+
/* @__PURE__ */ jsx45("span", { className: "truncate", children: getStatusLabel(status) })
|
|
6800
6933
|
]
|
|
6801
6934
|
}
|
|
6802
6935
|
) : null,
|
|
6803
|
-
/* @__PURE__ */
|
|
6936
|
+
/* @__PURE__ */ jsx45(
|
|
6804
6937
|
"div",
|
|
6805
6938
|
{
|
|
6806
6939
|
"data-slot": "action-footer-main-actions",
|
|
@@ -6817,9 +6950,9 @@ ActionFooter.displayName = "ActionFooter";
|
|
|
6817
6950
|
|
|
6818
6951
|
// src/components/ui/toast.tsx
|
|
6819
6952
|
import * as React36 from "react";
|
|
6820
|
-
import { AlertCircle as AlertCircle5, AlertTriangle as AlertTriangle3, CheckCircle2 as CheckCircle25, Info as Info2, X as
|
|
6953
|
+
import { AlertCircle as AlertCircle5, AlertTriangle as AlertTriangle3, CheckCircle2 as CheckCircle25, Info as Info2, X as X5 } from "lucide-react";
|
|
6821
6954
|
import { cva as cva24 } from "class-variance-authority";
|
|
6822
|
-
import { jsx as
|
|
6955
|
+
import { jsx as jsx46, jsxs as jsxs41 } from "react/jsx-runtime";
|
|
6823
6956
|
var toastVariants = cva24(
|
|
6824
6957
|
[
|
|
6825
6958
|
"grid min-w-[280px] max-w-[420px] grid-cols-[auto_1fr_auto] items-center",
|
|
@@ -6918,7 +7051,7 @@ var ToastRoot = React36.forwardRef(
|
|
|
6918
7051
|
}, ref) => {
|
|
6919
7052
|
const Icon = toastIcons[variant];
|
|
6920
7053
|
const hasIcon = Icon !== null;
|
|
6921
|
-
return /* @__PURE__ */
|
|
7054
|
+
return /* @__PURE__ */ jsxs41(
|
|
6922
7055
|
"div",
|
|
6923
7056
|
{
|
|
6924
7057
|
ref,
|
|
@@ -6934,7 +7067,7 @@ var ToastRoot = React36.forwardRef(
|
|
|
6934
7067
|
),
|
|
6935
7068
|
...props,
|
|
6936
7069
|
children: [
|
|
6937
|
-
Icon ? /* @__PURE__ */
|
|
7070
|
+
Icon ? /* @__PURE__ */ jsx46(
|
|
6938
7071
|
Icon,
|
|
6939
7072
|
{
|
|
6940
7073
|
"aria-hidden": "true",
|
|
@@ -6944,9 +7077,9 @@ var ToastRoot = React36.forwardRef(
|
|
|
6944
7077
|
className: "shrink-0"
|
|
6945
7078
|
}
|
|
6946
7079
|
) : null,
|
|
6947
|
-
/* @__PURE__ */
|
|
6948
|
-
/* @__PURE__ */
|
|
6949
|
-
action ? /* @__PURE__ */
|
|
7080
|
+
/* @__PURE__ */ jsxs41("div", { "data-slot": "toast-body", className: "min-w-0", children: [
|
|
7081
|
+
/* @__PURE__ */ jsx46("div", { "data-slot": "toast-message", className: "font-normal", children: message }),
|
|
7082
|
+
action ? /* @__PURE__ */ jsx46(
|
|
6950
7083
|
Button,
|
|
6951
7084
|
{
|
|
6952
7085
|
"data-slot": "toast-action",
|
|
@@ -6958,7 +7091,7 @@ var ToastRoot = React36.forwardRef(
|
|
|
6958
7091
|
}
|
|
6959
7092
|
) : null
|
|
6960
7093
|
] }),
|
|
6961
|
-
/* @__PURE__ */
|
|
7094
|
+
/* @__PURE__ */ jsx46(
|
|
6962
7095
|
"button",
|
|
6963
7096
|
{
|
|
6964
7097
|
type: "button",
|
|
@@ -6970,7 +7103,7 @@ var ToastRoot = React36.forwardRef(
|
|
|
6970
7103
|
"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--focus-ring)]"
|
|
6971
7104
|
),
|
|
6972
7105
|
onClick: onClose,
|
|
6973
|
-
children: /* @__PURE__ */
|
|
7106
|
+
children: /* @__PURE__ */ jsx46(X5, { "aria-hidden": "true", size: 16, strokeWidth: 1.75 })
|
|
6974
7107
|
}
|
|
6975
7108
|
)
|
|
6976
7109
|
]
|
|
@@ -6979,7 +7112,7 @@ var ToastRoot = React36.forwardRef(
|
|
|
6979
7112
|
}
|
|
6980
7113
|
);
|
|
6981
7114
|
ToastRoot.displayName = "ToastRoot";
|
|
6982
|
-
var ToastViewport = React36.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */
|
|
7115
|
+
var ToastViewport = React36.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx46(
|
|
6983
7116
|
"ol",
|
|
6984
7117
|
{
|
|
6985
7118
|
ref,
|
|
@@ -6997,9 +7130,9 @@ function ToastProvider({ children, maxToasts = 3, className, ...props }) {
|
|
|
6997
7130
|
}),
|
|
6998
7131
|
[maxToasts]
|
|
6999
7132
|
);
|
|
7000
|
-
return /* @__PURE__ */
|
|
7133
|
+
return /* @__PURE__ */ jsxs41("div", { "data-slot": "toast-provider", className, ...props, children: [
|
|
7001
7134
|
children,
|
|
7002
|
-
/* @__PURE__ */
|
|
7135
|
+
/* @__PURE__ */ jsx46(ToastViewport, { children: items.map((item) => /* @__PURE__ */ jsx46("li", { children: /* @__PURE__ */ jsx46(ToastRoot, { ...item, onClose: () => toast.dismiss(item.id) }) }, item.id)) })
|
|
7003
7136
|
] });
|
|
7004
7137
|
}
|
|
7005
7138
|
|
|
@@ -7007,7 +7140,7 @@ function ToastProvider({ children, maxToasts = 3, className, ...props }) {
|
|
|
7007
7140
|
import * as React37 from "react";
|
|
7008
7141
|
import { cva as cva25 } from "class-variance-authority";
|
|
7009
7142
|
import { AlertCircle as AlertCircle6 } from "lucide-react";
|
|
7010
|
-
import { Fragment as Fragment8, jsx as
|
|
7143
|
+
import { Fragment as Fragment8, jsx as jsx47, jsxs as jsxs42 } from "react/jsx-runtime";
|
|
7011
7144
|
var otpFieldVariants = cva25("flex w-full flex-col gap-[var(--space-1-5)]", {
|
|
7012
7145
|
variants: {
|
|
7013
7146
|
size: {
|
|
@@ -7159,7 +7292,7 @@ var OTPField = React37.forwardRef(
|
|
|
7159
7292
|
},
|
|
7160
7293
|
[disabled, isControlled, length, onComplete, onValueChange]
|
|
7161
7294
|
);
|
|
7162
|
-
return /* @__PURE__ */
|
|
7295
|
+
return /* @__PURE__ */ jsxs42(
|
|
7163
7296
|
"fieldset",
|
|
7164
7297
|
{
|
|
7165
7298
|
ref,
|
|
@@ -7172,7 +7305,7 @@ var OTPField = React37.forwardRef(
|
|
|
7172
7305
|
className: cn(otpFieldVariants({ size, className })),
|
|
7173
7306
|
...props,
|
|
7174
7307
|
children: [
|
|
7175
|
-
/* @__PURE__ */
|
|
7308
|
+
/* @__PURE__ */ jsx47(
|
|
7176
7309
|
"legend",
|
|
7177
7310
|
{
|
|
7178
7311
|
id: labelId,
|
|
@@ -7181,7 +7314,7 @@ var OTPField = React37.forwardRef(
|
|
|
7181
7314
|
children: label
|
|
7182
7315
|
}
|
|
7183
7316
|
),
|
|
7184
|
-
/* @__PURE__ */
|
|
7317
|
+
/* @__PURE__ */ jsx47(
|
|
7185
7318
|
"div",
|
|
7186
7319
|
{
|
|
7187
7320
|
"data-slot": "otp-field-group",
|
|
@@ -7191,7 +7324,7 @@ var OTPField = React37.forwardRef(
|
|
|
7191
7324
|
children: Array.from({ length }, (_, index) => {
|
|
7192
7325
|
const digit = resolvedSlots[index] ?? "";
|
|
7193
7326
|
const inputId = `${fieldId}-cell-${index + 1}`;
|
|
7194
|
-
return /* @__PURE__ */
|
|
7327
|
+
return /* @__PURE__ */ jsx47(
|
|
7195
7328
|
"input",
|
|
7196
7329
|
{
|
|
7197
7330
|
ref: (node) => {
|
|
@@ -7286,15 +7419,15 @@ var OTPField = React37.forwardRef(
|
|
|
7286
7419
|
})
|
|
7287
7420
|
}
|
|
7288
7421
|
),
|
|
7289
|
-
helperText || errorText ? /* @__PURE__ */
|
|
7422
|
+
helperText || errorText ? /* @__PURE__ */ jsx47(
|
|
7290
7423
|
"p",
|
|
7291
7424
|
{
|
|
7292
7425
|
id: errorText ? errorId : helperId,
|
|
7293
7426
|
"data-slot": "otp-field-message",
|
|
7294
7427
|
"data-kind": errorText ? "error" : "helper",
|
|
7295
7428
|
className: otpFieldMessageVariants({ state: resolvedState }),
|
|
7296
|
-
children: errorText ? /* @__PURE__ */
|
|
7297
|
-
/* @__PURE__ */
|
|
7429
|
+
children: errorText ? /* @__PURE__ */ jsxs42(Fragment8, { children: [
|
|
7430
|
+
/* @__PURE__ */ jsx47(
|
|
7298
7431
|
AlertCircle6,
|
|
7299
7432
|
{
|
|
7300
7433
|
"aria-hidden": "true",
|
|
@@ -7302,11 +7435,11 @@ var OTPField = React37.forwardRef(
|
|
|
7302
7435
|
strokeWidth: 2
|
|
7303
7436
|
}
|
|
7304
7437
|
),
|
|
7305
|
-
/* @__PURE__ */
|
|
7306
|
-
] }) : /* @__PURE__ */
|
|
7438
|
+
/* @__PURE__ */ jsx47("span", { children: errorText })
|
|
7439
|
+
] }) : /* @__PURE__ */ jsx47("span", { children: helperText })
|
|
7307
7440
|
}
|
|
7308
7441
|
) : null,
|
|
7309
|
-
name ? /* @__PURE__ */
|
|
7442
|
+
name ? /* @__PURE__ */ jsx47(
|
|
7310
7443
|
"input",
|
|
7311
7444
|
{
|
|
7312
7445
|
"aria-hidden": "true",
|
|
@@ -7328,9 +7461,9 @@ OTPField.displayName = "OTPField";
|
|
|
7328
7461
|
|
|
7329
7462
|
// src/components/ui/search-field.tsx
|
|
7330
7463
|
import * as React38 from "react";
|
|
7331
|
-
import { Search, X as
|
|
7464
|
+
import { Search, X as X6 } from "lucide-react";
|
|
7332
7465
|
import { cva as cva26 } from "class-variance-authority";
|
|
7333
|
-
import { jsx as
|
|
7466
|
+
import { jsx as jsx48, jsxs as jsxs43 } from "react/jsx-runtime";
|
|
7334
7467
|
var searchFieldVariants = cva26("relative flex w-full items-center", {
|
|
7335
7468
|
variants: {
|
|
7336
7469
|
size: {
|
|
@@ -7429,14 +7562,14 @@ var SearchField = React38.forwardRef(
|
|
|
7429
7562
|
}
|
|
7430
7563
|
onClear?.();
|
|
7431
7564
|
};
|
|
7432
|
-
return /* @__PURE__ */
|
|
7565
|
+
return /* @__PURE__ */ jsxs43(
|
|
7433
7566
|
"div",
|
|
7434
7567
|
{
|
|
7435
7568
|
"data-slot": "search-field",
|
|
7436
7569
|
"data-size": resolvedSize,
|
|
7437
7570
|
className: cn(searchFieldVariants({ size, className })),
|
|
7438
7571
|
children: [
|
|
7439
|
-
/* @__PURE__ */
|
|
7572
|
+
/* @__PURE__ */ jsx48(
|
|
7440
7573
|
Search,
|
|
7441
7574
|
{
|
|
7442
7575
|
"aria-hidden": "true",
|
|
@@ -7446,7 +7579,7 @@ var SearchField = React38.forwardRef(
|
|
|
7446
7579
|
strokeWidth: resolvedSize === "sm" ? 2 : 1.75
|
|
7447
7580
|
}
|
|
7448
7581
|
),
|
|
7449
|
-
/* @__PURE__ */
|
|
7582
|
+
/* @__PURE__ */ jsx48(
|
|
7450
7583
|
"input",
|
|
7451
7584
|
{
|
|
7452
7585
|
ref: inputRef,
|
|
@@ -7467,7 +7600,7 @@ var SearchField = React38.forwardRef(
|
|
|
7467
7600
|
...props
|
|
7468
7601
|
}
|
|
7469
7602
|
),
|
|
7470
|
-
showClear ? /* @__PURE__ */
|
|
7603
|
+
showClear ? /* @__PURE__ */ jsx48(
|
|
7471
7604
|
"button",
|
|
7472
7605
|
{
|
|
7473
7606
|
type: "button",
|
|
@@ -7475,7 +7608,7 @@ var SearchField = React38.forwardRef(
|
|
|
7475
7608
|
"data-slot": "search-field-clear",
|
|
7476
7609
|
className: "absolute right-[8px] top-1/2 inline-flex size-[var(--space-2)] -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)]",
|
|
7477
7610
|
onClick: clearInput,
|
|
7478
|
-
children: /* @__PURE__ */
|
|
7611
|
+
children: /* @__PURE__ */ jsx48(X6, { "aria-hidden": "true", size: 16, strokeWidth: 1.75 })
|
|
7479
7612
|
}
|
|
7480
7613
|
) : null
|
|
7481
7614
|
]
|
|
@@ -7488,7 +7621,7 @@ SearchField.displayName = "SearchField";
|
|
|
7488
7621
|
// src/components/ui/checkbox-group.tsx
|
|
7489
7622
|
import * as React39 from "react";
|
|
7490
7623
|
import { cva as cva27 } from "class-variance-authority";
|
|
7491
|
-
import { jsx as
|
|
7624
|
+
import { jsx as jsx49 } from "react/jsx-runtime";
|
|
7492
7625
|
var checkboxGroupVariants = cva27("gap-[var(--space-1)]", {
|
|
7493
7626
|
variants: {
|
|
7494
7627
|
appearance: {
|
|
@@ -7564,7 +7697,7 @@ var CheckboxGroup = React39.forwardRef(
|
|
|
7564
7697
|
}),
|
|
7565
7698
|
[appearance, density, disabled, name, selectedValues, toggleValue]
|
|
7566
7699
|
);
|
|
7567
|
-
return /* @__PURE__ */
|
|
7700
|
+
return /* @__PURE__ */ jsx49(CheckboxGroupContext.Provider, { value: contextValue, children: /* @__PURE__ */ jsx49(
|
|
7568
7701
|
"div",
|
|
7569
7702
|
{
|
|
7570
7703
|
ref,
|
|
@@ -7592,7 +7725,7 @@ import * as React40 from "react";
|
|
|
7592
7725
|
import { cva as cva28 } from "class-variance-authority";
|
|
7593
7726
|
import { Circle } from "lucide-react";
|
|
7594
7727
|
import { RadioGroup as RadioGroupPrimitive } from "radix-ui";
|
|
7595
|
-
import { jsx as
|
|
7728
|
+
import { jsx as jsx50, jsxs as jsxs44 } from "react/jsx-runtime";
|
|
7596
7729
|
var radioGroupVariants = cva28("gap-[var(--space-1)]", {
|
|
7597
7730
|
variants: {
|
|
7598
7731
|
appearance: {
|
|
@@ -7700,7 +7833,7 @@ var RadioGroup = React40.forwardRef(
|
|
|
7700
7833
|
() => ({ appearance, density }),
|
|
7701
7834
|
[appearance, density]
|
|
7702
7835
|
);
|
|
7703
|
-
return /* @__PURE__ */
|
|
7836
|
+
return /* @__PURE__ */ jsx50(RadioGroupContext.Provider, { value: contextValue, children: /* @__PURE__ */ jsx50(
|
|
7704
7837
|
RadioGroupPrimitive.Root,
|
|
7705
7838
|
{
|
|
7706
7839
|
ref,
|
|
@@ -7729,7 +7862,7 @@ var Radio = React40.forwardRef(({ className, children, description, id, ...props
|
|
|
7729
7862
|
const radioId = id ?? generatedId;
|
|
7730
7863
|
const labelId = `${radioId}-label`;
|
|
7731
7864
|
const descriptionId = description ? `${radioId}-description` : void 0;
|
|
7732
|
-
return /* @__PURE__ */
|
|
7865
|
+
return /* @__PURE__ */ jsxs44(
|
|
7733
7866
|
RadioGroupPrimitive.Item,
|
|
7734
7867
|
{
|
|
7735
7868
|
ref,
|
|
@@ -7740,24 +7873,24 @@ var Radio = React40.forwardRef(({ className, children, description, id, ...props
|
|
|
7740
7873
|
className: cn(radioVariants({ appearance, density }), className),
|
|
7741
7874
|
...props,
|
|
7742
7875
|
children: [
|
|
7743
|
-
/* @__PURE__ */
|
|
7876
|
+
/* @__PURE__ */ jsx50(
|
|
7744
7877
|
"span",
|
|
7745
7878
|
{
|
|
7746
7879
|
"aria-hidden": "true",
|
|
7747
7880
|
"data-slot": "radio-control",
|
|
7748
7881
|
className: radioControlVariants({ appearance }),
|
|
7749
|
-
children: /* @__PURE__ */
|
|
7882
|
+
children: /* @__PURE__ */ jsx50(
|
|
7750
7883
|
RadioGroupPrimitive.Indicator,
|
|
7751
7884
|
{
|
|
7752
7885
|
"data-slot": "radio-indicator",
|
|
7753
7886
|
className: "flex items-center justify-center",
|
|
7754
|
-
children: /* @__PURE__ */
|
|
7887
|
+
children: /* @__PURE__ */ jsx50(Circle, { "aria-hidden": "true", size: 8, fill: "currentColor" })
|
|
7755
7888
|
}
|
|
7756
7889
|
)
|
|
7757
7890
|
}
|
|
7758
7891
|
),
|
|
7759
|
-
/* @__PURE__ */
|
|
7760
|
-
/* @__PURE__ */
|
|
7892
|
+
/* @__PURE__ */ jsxs44("span", { className: "flex min-w-0 flex-col gap-[var(--space-0-5)]", children: [
|
|
7893
|
+
/* @__PURE__ */ jsx50(
|
|
7761
7894
|
"span",
|
|
7762
7895
|
{
|
|
7763
7896
|
id: labelId,
|
|
@@ -7769,7 +7902,7 @@ var Radio = React40.forwardRef(({ className, children, description, id, ...props
|
|
|
7769
7902
|
children
|
|
7770
7903
|
}
|
|
7771
7904
|
),
|
|
7772
|
-
description ? /* @__PURE__ */
|
|
7905
|
+
description ? /* @__PURE__ */ jsx50(
|
|
7773
7906
|
"span",
|
|
7774
7907
|
{
|
|
7775
7908
|
id: descriptionId,
|
|
@@ -7787,20 +7920,20 @@ Radio.displayName = "Radio";
|
|
|
7787
7920
|
|
|
7788
7921
|
// src/components/ui/scroll-area.tsx
|
|
7789
7922
|
import { ScrollArea as ScrollAreaPrimitive } from "radix-ui";
|
|
7790
|
-
import { jsx as
|
|
7923
|
+
import { jsx as jsx51, jsxs as jsxs45 } from "react/jsx-runtime";
|
|
7791
7924
|
function ScrollArea({
|
|
7792
7925
|
className,
|
|
7793
7926
|
children,
|
|
7794
7927
|
...props
|
|
7795
7928
|
}) {
|
|
7796
|
-
return /* @__PURE__ */
|
|
7929
|
+
return /* @__PURE__ */ jsxs45(
|
|
7797
7930
|
ScrollAreaPrimitive.Root,
|
|
7798
7931
|
{
|
|
7799
7932
|
"data-slot": "scroll-area",
|
|
7800
7933
|
className: cn("relative", className),
|
|
7801
7934
|
...props,
|
|
7802
7935
|
children: [
|
|
7803
|
-
/* @__PURE__ */
|
|
7936
|
+
/* @__PURE__ */ jsx51(
|
|
7804
7937
|
ScrollAreaPrimitive.Viewport,
|
|
7805
7938
|
{
|
|
7806
7939
|
"data-slot": "scroll-area-viewport",
|
|
@@ -7808,8 +7941,8 @@ function ScrollArea({
|
|
|
7808
7941
|
children
|
|
7809
7942
|
}
|
|
7810
7943
|
),
|
|
7811
|
-
/* @__PURE__ */
|
|
7812
|
-
/* @__PURE__ */
|
|
7944
|
+
/* @__PURE__ */ jsx51(ScrollBar, {}),
|
|
7945
|
+
/* @__PURE__ */ jsx51(ScrollAreaPrimitive.Corner, {})
|
|
7813
7946
|
]
|
|
7814
7947
|
}
|
|
7815
7948
|
);
|
|
@@ -7819,7 +7952,7 @@ function ScrollBar({
|
|
|
7819
7952
|
orientation = "vertical",
|
|
7820
7953
|
...props
|
|
7821
7954
|
}) {
|
|
7822
|
-
return /* @__PURE__ */
|
|
7955
|
+
return /* @__PURE__ */ jsx51(
|
|
7823
7956
|
ScrollAreaPrimitive.ScrollAreaScrollbar,
|
|
7824
7957
|
{
|
|
7825
7958
|
"data-slot": "scroll-area-scrollbar",
|
|
@@ -7831,7 +7964,7 @@ function ScrollBar({
|
|
|
7831
7964
|
className
|
|
7832
7965
|
),
|
|
7833
7966
|
...props,
|
|
7834
|
-
children: /* @__PURE__ */
|
|
7967
|
+
children: /* @__PURE__ */ jsx51(
|
|
7835
7968
|
ScrollAreaPrimitive.ScrollAreaThumb,
|
|
7836
7969
|
{
|
|
7837
7970
|
"data-slot": "scroll-area-thumb",
|
|
@@ -7843,7 +7976,7 @@ function ScrollBar({
|
|
|
7843
7976
|
}
|
|
7844
7977
|
|
|
7845
7978
|
// src/components/ui/progress.tsx
|
|
7846
|
-
import { jsx as
|
|
7979
|
+
import { jsx as jsx52 } from "react/jsx-runtime";
|
|
7847
7980
|
var progressFillByStatus = {
|
|
7848
7981
|
active: "bg-[var(--accent-solid)]",
|
|
7849
7982
|
success: "bg-[var(--success)]",
|
|
@@ -7864,7 +7997,7 @@ function Progress({
|
|
|
7864
7997
|
const clamped = Math.max(0, Math.min(safeMax, value));
|
|
7865
7998
|
const percent = clamped / safeMax * 100;
|
|
7866
7999
|
const w = typeof width === "number" ? `${width}px` : width;
|
|
7867
|
-
return /* @__PURE__ */
|
|
8000
|
+
return /* @__PURE__ */ jsx52(
|
|
7868
8001
|
"div",
|
|
7869
8002
|
{
|
|
7870
8003
|
role: "progressbar",
|
|
@@ -7878,7 +8011,7 @@ function Progress({
|
|
|
7878
8011
|
),
|
|
7879
8012
|
style: { width: w, height: `${height}px`, ...style },
|
|
7880
8013
|
...props,
|
|
7881
|
-
children: /* @__PURE__ */
|
|
8014
|
+
children: /* @__PURE__ */ jsx52(
|
|
7882
8015
|
"div",
|
|
7883
8016
|
{
|
|
7884
8017
|
className: cn(
|
|
@@ -7896,7 +8029,7 @@ function Progress({
|
|
|
7896
8029
|
import * as React41 from "react";
|
|
7897
8030
|
import { ChevronRight as ChevronRight2 } from "lucide-react";
|
|
7898
8031
|
import { cva as cva29 } from "class-variance-authority";
|
|
7899
|
-
import { jsx as
|
|
8032
|
+
import { jsx as jsx53, jsxs as jsxs46 } from "react/jsx-runtime";
|
|
7900
8033
|
var treeViewVariants = cva29(
|
|
7901
8034
|
"m-0 list-none p-[var(--space-0-5)] text-body-sm text-foreground"
|
|
7902
8035
|
);
|
|
@@ -8066,7 +8199,7 @@ function TreeView({
|
|
|
8066
8199
|
const selected = node.id === selectedId;
|
|
8067
8200
|
const isActive = node.id === activeId;
|
|
8068
8201
|
const itemState = { expanded, selected, depth, hasChildren };
|
|
8069
|
-
return /* @__PURE__ */
|
|
8202
|
+
return /* @__PURE__ */ jsxs46(
|
|
8070
8203
|
"li",
|
|
8071
8204
|
{
|
|
8072
8205
|
ref: (element) => {
|
|
@@ -8091,7 +8224,7 @@ function TreeView({
|
|
|
8091
8224
|
onSelect?.(node.id, node);
|
|
8092
8225
|
},
|
|
8093
8226
|
children: [
|
|
8094
|
-
/* @__PURE__ */
|
|
8227
|
+
/* @__PURE__ */ jsxs46(
|
|
8095
8228
|
"span",
|
|
8096
8229
|
{
|
|
8097
8230
|
"data-slot": "treeitem-row",
|
|
@@ -8100,7 +8233,7 @@ function TreeView({
|
|
|
8100
8233
|
},
|
|
8101
8234
|
className: treeItemRowVariants({ selected }),
|
|
8102
8235
|
children: [
|
|
8103
|
-
hasChildren ? /* @__PURE__ */
|
|
8236
|
+
hasChildren ? /* @__PURE__ */ jsx53(
|
|
8104
8237
|
"span",
|
|
8105
8238
|
{
|
|
8106
8239
|
"data-slot": "treeitem-toggle",
|
|
@@ -8110,7 +8243,7 @@ function TreeView({
|
|
|
8110
8243
|
setExpanded(node.id, !expanded);
|
|
8111
8244
|
},
|
|
8112
8245
|
className: "flex size-[var(--space-2)] shrink-0 items-center justify-center text-text-tertiary",
|
|
8113
|
-
children: /* @__PURE__ */
|
|
8246
|
+
children: /* @__PURE__ */ jsx53(
|
|
8114
8247
|
ChevronRight2,
|
|
8115
8248
|
{
|
|
8116
8249
|
"aria-hidden": "true",
|
|
@@ -8123,7 +8256,7 @@ function TreeView({
|
|
|
8123
8256
|
}
|
|
8124
8257
|
)
|
|
8125
8258
|
}
|
|
8126
|
-
) : /* @__PURE__ */
|
|
8259
|
+
) : /* @__PURE__ */ jsx53(
|
|
8127
8260
|
"span",
|
|
8128
8261
|
{
|
|
8129
8262
|
"data-slot": "treeitem-spacer",
|
|
@@ -8131,18 +8264,18 @@ function TreeView({
|
|
|
8131
8264
|
className: "size-[var(--space-2)] shrink-0"
|
|
8132
8265
|
}
|
|
8133
8266
|
),
|
|
8134
|
-
/* @__PURE__ */
|
|
8267
|
+
/* @__PURE__ */ jsx53("span", { className: "flex min-w-0 flex-1 items-center gap-[var(--space-1)]", children: renderItem(node, itemState) })
|
|
8135
8268
|
]
|
|
8136
8269
|
}
|
|
8137
8270
|
),
|
|
8138
|
-
hasChildren && expanded && children ? /* @__PURE__ */
|
|
8271
|
+
hasChildren && expanded && children ? /* @__PURE__ */ jsx53("ul", { role: "group", "data-slot": "tree-group", className: "m-0 list-none p-0", children: renderLevel(children, depth + 1) }) : null
|
|
8139
8272
|
]
|
|
8140
8273
|
},
|
|
8141
8274
|
node.id
|
|
8142
8275
|
);
|
|
8143
8276
|
});
|
|
8144
8277
|
}
|
|
8145
|
-
return /* @__PURE__ */
|
|
8278
|
+
return /* @__PURE__ */ jsx53(
|
|
8146
8279
|
"ul",
|
|
8147
8280
|
{
|
|
8148
8281
|
role: "tree",
|
|
@@ -8158,9 +8291,9 @@ function TreeView({
|
|
|
8158
8291
|
}
|
|
8159
8292
|
|
|
8160
8293
|
// src/components/branding/olun-logo.tsx
|
|
8161
|
-
import { jsx as
|
|
8294
|
+
import { jsx as jsx54, jsxs as jsxs47 } from "react/jsx-runtime";
|
|
8162
8295
|
function OlunSymbol({ size = 28, className }) {
|
|
8163
|
-
return /* @__PURE__ */
|
|
8296
|
+
return /* @__PURE__ */ jsxs47(
|
|
8164
8297
|
"svg",
|
|
8165
8298
|
{
|
|
8166
8299
|
width: size,
|
|
@@ -8171,7 +8304,7 @@ function OlunSymbol({ size = 28, className }) {
|
|
|
8171
8304
|
className,
|
|
8172
8305
|
"aria-hidden": "true",
|
|
8173
8306
|
children: [
|
|
8174
|
-
/* @__PURE__ */
|
|
8307
|
+
/* @__PURE__ */ jsx54(
|
|
8175
8308
|
"circle",
|
|
8176
8309
|
{
|
|
8177
8310
|
cx: "108",
|
|
@@ -8183,7 +8316,7 @@ function OlunSymbol({ size = 28, className }) {
|
|
|
8183
8316
|
style: { color: "var(--text-primary)" }
|
|
8184
8317
|
}
|
|
8185
8318
|
),
|
|
8186
|
-
/* @__PURE__ */
|
|
8319
|
+
/* @__PURE__ */ jsx54("circle", { cx: "185", cy: "175", r: "22", fill: "var(--accent-solid)" })
|
|
8187
8320
|
]
|
|
8188
8321
|
}
|
|
8189
8322
|
);
|
|
@@ -8194,7 +8327,7 @@ function OlunLogo({
|
|
|
8194
8327
|
showSymbol = true,
|
|
8195
8328
|
className
|
|
8196
8329
|
}) {
|
|
8197
|
-
return /* @__PURE__ */
|
|
8330
|
+
return /* @__PURE__ */ jsxs47(
|
|
8198
8331
|
"div",
|
|
8199
8332
|
{
|
|
8200
8333
|
className,
|
|
@@ -8204,8 +8337,8 @@ function OlunLogo({
|
|
|
8204
8337
|
gap: "var(--space-1-5)"
|
|
8205
8338
|
},
|
|
8206
8339
|
children: [
|
|
8207
|
-
showSymbol && /* @__PURE__ */
|
|
8208
|
-
/* @__PURE__ */
|
|
8340
|
+
showSymbol && /* @__PURE__ */ jsx54(OlunSymbol, { size: symbolSize }),
|
|
8341
|
+
/* @__PURE__ */ jsxs47(
|
|
8209
8342
|
"span",
|
|
8210
8343
|
{
|
|
8211
8344
|
style: {
|
|
@@ -8217,7 +8350,7 @@ function OlunLogo({
|
|
|
8217
8350
|
},
|
|
8218
8351
|
children: [
|
|
8219
8352
|
"OLUN",
|
|
8220
|
-
/* @__PURE__ */
|
|
8353
|
+
/* @__PURE__ */ jsx54("span", { style: { color: "var(--accent-fg)" }, children: "." })
|
|
8221
8354
|
]
|
|
8222
8355
|
}
|
|
8223
8356
|
)
|
|
@@ -8228,11 +8361,11 @@ function OlunLogo({
|
|
|
8228
8361
|
|
|
8229
8362
|
// src/components/branding/theme-toggle.tsx
|
|
8230
8363
|
import { Sun, Moon } from "lucide-react";
|
|
8231
|
-
import { jsx as
|
|
8364
|
+
import { jsx as jsx55 } from "react/jsx-runtime";
|
|
8232
8365
|
function ThemeToggle({ className }) {
|
|
8233
8366
|
const { resolvedTheme, toggleTheme } = useOlunTheme();
|
|
8234
8367
|
const Icon = resolvedTheme === "dark" ? Moon : Sun;
|
|
8235
|
-
return /* @__PURE__ */
|
|
8368
|
+
return /* @__PURE__ */ jsx55(
|
|
8236
8369
|
"button",
|
|
8237
8370
|
{
|
|
8238
8371
|
onClick: () => toggleTheme(),
|
|
@@ -8244,14 +8377,14 @@ function ThemeToggle({ className }) {
|
|
|
8244
8377
|
),
|
|
8245
8378
|
"aria-label": "\uD14C\uB9C8 \uC804\uD658",
|
|
8246
8379
|
title: resolvedTheme === "dark" ? "\uB77C\uC774\uD2B8 \uBAA8\uB4DC\uB85C" : "\uB2E4\uD06C \uBAA8\uB4DC\uB85C",
|
|
8247
|
-
children: /* @__PURE__ */
|
|
8380
|
+
children: /* @__PURE__ */ jsx55(Icon, { className: "size-[18px]", strokeWidth: 1.75 })
|
|
8248
8381
|
}
|
|
8249
8382
|
);
|
|
8250
8383
|
}
|
|
8251
8384
|
|
|
8252
8385
|
// src/components/branding/theme-fab.tsx
|
|
8253
8386
|
import { Sun as Sun2, Moon as Moon2 } from "lucide-react";
|
|
8254
|
-
import { jsx as
|
|
8387
|
+
import { jsx as jsx56 } from "react/jsx-runtime";
|
|
8255
8388
|
function ThemeFab({ variant = "square" } = {}) {
|
|
8256
8389
|
const { mounted, resolvedTheme, toggleTheme } = useOlunTheme();
|
|
8257
8390
|
if (!mounted) {
|
|
@@ -8291,7 +8424,7 @@ function ThemeFab({ variant = "square" } = {}) {
|
|
|
8291
8424
|
WebkitBackdropFilter: "blur(16px)",
|
|
8292
8425
|
zIndex: 9999
|
|
8293
8426
|
};
|
|
8294
|
-
return /* @__PURE__ */
|
|
8427
|
+
return /* @__PURE__ */ jsx56(
|
|
8295
8428
|
"button",
|
|
8296
8429
|
{
|
|
8297
8430
|
onClick: () => toggleTheme(),
|
|
@@ -8316,7 +8449,7 @@ function ThemeFab({ variant = "square" } = {}) {
|
|
|
8316
8449
|
e.currentTarget.style.color = "var(--text-secondary)";
|
|
8317
8450
|
}
|
|
8318
8451
|
},
|
|
8319
|
-
children: /* @__PURE__ */
|
|
8452
|
+
children: /* @__PURE__ */ jsx56(
|
|
8320
8453
|
Icon,
|
|
8321
8454
|
{
|
|
8322
8455
|
size: isCircle ? 22 : 16,
|
|
@@ -8328,7 +8461,7 @@ function ThemeFab({ variant = "square" } = {}) {
|
|
|
8328
8461
|
}
|
|
8329
8462
|
|
|
8330
8463
|
// src/components/logos/organization-logo.tsx
|
|
8331
|
-
import { jsx as
|
|
8464
|
+
import { jsx as jsx57 } from "react/jsx-runtime";
|
|
8332
8465
|
var organizationLogoRegistry = {
|
|
8333
8466
|
jbnu: {
|
|
8334
8467
|
label: "\uC804\uBD81\uB300\uD559\uAD50 \uC5E0\uBE14\uB7FC",
|
|
@@ -8357,7 +8490,7 @@ function OrganizationLogo({
|
|
|
8357
8490
|
}) {
|
|
8358
8491
|
const asset = organizationLogoRegistry[organization];
|
|
8359
8492
|
const isDecorative = ariaHidden === true || ariaHidden === "true";
|
|
8360
|
-
return /* @__PURE__ */
|
|
8493
|
+
return /* @__PURE__ */ jsx57(
|
|
8361
8494
|
"svg",
|
|
8362
8495
|
{
|
|
8363
8496
|
viewBox: asset.viewBox,
|
|
@@ -8375,7 +8508,7 @@ function OrganizationLogo({
|
|
|
8375
8508
|
...style
|
|
8376
8509
|
},
|
|
8377
8510
|
...props,
|
|
8378
|
-
children: asset.paths.map((path) => /* @__PURE__ */
|
|
8511
|
+
children: asset.paths.map((path) => /* @__PURE__ */ jsx57("path", { d: path }, path))
|
|
8379
8512
|
}
|
|
8380
8513
|
);
|
|
8381
8514
|
}
|
|
@@ -8386,6 +8519,7 @@ export {
|
|
|
8386
8519
|
AvatarFallback,
|
|
8387
8520
|
AvatarImage,
|
|
8388
8521
|
Badge,
|
|
8522
|
+
BulkActionBar,
|
|
8389
8523
|
Button,
|
|
8390
8524
|
Card,
|
|
8391
8525
|
CardContent,
|
|
@@ -8399,6 +8533,7 @@ export {
|
|
|
8399
8533
|
CheckboxGroupContext,
|
|
8400
8534
|
Chip,
|
|
8401
8535
|
ConfirmDialog,
|
|
8536
|
+
ContextMenu,
|
|
8402
8537
|
CopyButton,
|
|
8403
8538
|
DataTable,
|
|
8404
8539
|
DetailLayout,
|