@olundot/ui 0.8.2 → 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/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
- selected ? "bg-[var(--action-selected)]" : null
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 jsx28, jsxs as jsxs25 } from "react/jsx-runtime";
4497
+ import { jsx as jsx25, jsxs as jsxs24 } from "react/jsx-runtime";
4685
4498
  function DropdownMenu({
4686
4499
  ...props
4687
4500
  }) {
4688
- return /* @__PURE__ */ jsx28(DropdownMenuPrimitive.Root, { "data-slot": "dropdown-menu", ...props });
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__ */ jsx28(DropdownMenuPrimitive.Portal, { "data-slot": "dropdown-menu-portal", ...props });
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__ */ jsx28(
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__ */ jsx28(DropdownMenuPrimitive.Portal, { children: /* @__PURE__ */ jsx28(
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__ */ jsx28(DropdownMenuPrimitive.Group, { "data-slot": "dropdown-menu-group", ...props });
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__ */ jsx28(
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__ */ jsxs25(
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__ */ jsx28("span", { className: "pointer-events-none absolute left-2 flex h-3.5 w-3.5 items-center justify-center", children: /* @__PURE__ */ jsx28(DropdownMenuPrimitive.ItemIndicator, { children: /* @__PURE__ */ jsx28(CheckIcon, { size: 16 }) }) }),
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__ */ jsx28(
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__ */ jsxs25(
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__ */ jsx28("span", { className: "pointer-events-none absolute left-2 flex h-3.5 w-3.5 items-center justify-center", children: /* @__PURE__ */ jsx28(DropdownMenuPrimitive.ItemIndicator, { children: /* @__PURE__ */ jsx28(CircleIcon, { size: 8, className: "fill-current" }) }) }),
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__ */ jsx28(
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__ */ jsx28(
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__ */ jsx28(
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__ */ jsx28(DropdownMenuPrimitive.Sub, { "data-slot": "dropdown-menu-sub", ...props });
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__ */ jsxs25(
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__ */ jsx28(ChevronRightIcon, { className: "ml-auto", size: 16 })
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
- return /* @__PURE__ */ jsx28(
4913
- DropdownMenuPrimitive.SubContent,
5187
+ const fallbackText = children ?? (name ? getAvatarFallbackText(name) : null);
5188
+ return /* @__PURE__ */ jsx31(
5189
+ AvatarPrimitive.Fallback,
4914
5190
  {
4915
- "data-slot": "dropdown-menu-sub-content",
5191
+ "data-slot": "avatar-fallback",
4916
5192
  className: cn(
4917
- "z-[var(--z-popover)] min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-hidden",
4918
- "rounded-sm border border-[var(--border)] bg-canvas p-[var(--space-0-5)] text-text-primary shadow-elevation-2",
4919
- "data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2",
4920
- "data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",
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 jsx29, jsxs as jsxs26 } from "react/jsx-runtime";
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__ */ jsx29(SheetPrimitive.Root, { "data-slot": "sheet", ...props });
5240
+ return /* @__PURE__ */ jsx32(SheetPrimitive.Root, { "data-slot": "sheet", ...props });
4967
5241
  }
4968
5242
  function SheetTrigger({
4969
5243
  ...props
4970
5244
  }) {
4971
- return /* @__PURE__ */ jsx29(SheetPrimitive.Trigger, { "data-slot": "sheet-trigger", ...props });
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__ */ jsx29(SheetPrimitive.Close, { "data-slot": "sheet-close", ...props });
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__ */ jsx29(SheetPrimitive.Portal, { "data-slot": "sheet-portal", ...props });
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__ */ jsx29(
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__ */ jsxs26(SheetPortal, { children: [
5024
- /* @__PURE__ */ jsx29(SheetOverlay, { motion: motionConfig }),
5025
- /* @__PURE__ */ jsxs26(
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",
@@ -5073,9 +5347,9 @@ function SheetContent({
5073
5347
  ...props,
5074
5348
  children: [
5075
5349
  children,
5076
- showCloseButton && /* @__PURE__ */ jsxs26(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: [
5077
- /* @__PURE__ */ jsx29(XIcon, { className: "size-[16px]" }),
5078
- /* @__PURE__ */ jsx29("span", { className: "sr-only", children: "Close" })
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" })
5079
5353
  ] })
5080
5354
  ]
5081
5355
  }
@@ -5083,7 +5357,7 @@ function SheetContent({
5083
5357
  ] });
5084
5358
  }
5085
5359
  function SheetHeader({ className, ...props }) {
5086
- return /* @__PURE__ */ jsx29(
5360
+ return /* @__PURE__ */ jsx32(
5087
5361
  "div",
5088
5362
  {
5089
5363
  "data-slot": "sheet-header",
@@ -5093,7 +5367,7 @@ function SheetHeader({ className, ...props }) {
5093
5367
  );
5094
5368
  }
5095
5369
  function SheetFooter({ className, ...props }) {
5096
- return /* @__PURE__ */ jsx29(
5370
+ return /* @__PURE__ */ jsx32(
5097
5371
  "div",
5098
5372
  {
5099
5373
  "data-slot": "sheet-footer",
@@ -5106,7 +5380,7 @@ function SheetTitle({
5106
5380
  className,
5107
5381
  ...props
5108
5382
  }) {
5109
- return /* @__PURE__ */ jsx29(
5383
+ return /* @__PURE__ */ jsx32(
5110
5384
  SheetPrimitive.Title,
5111
5385
  {
5112
5386
  "data-slot": "sheet-title",
@@ -5119,7 +5393,7 @@ function SheetDescription({
5119
5393
  className,
5120
5394
  ...props
5121
5395
  }) {
5122
- return /* @__PURE__ */ jsx29(
5396
+ return /* @__PURE__ */ jsx32(
5123
5397
  SheetPrimitive.Description,
5124
5398
  {
5125
5399
  "data-slot": "sheet-description",
@@ -5131,7 +5405,7 @@ function SheetDescription({
5131
5405
 
5132
5406
  // src/components/ui/sheet-drawer.tsx
5133
5407
  import { Maximize2Icon, Minimize2Icon, XIcon as XIcon2 } from "lucide-react";
5134
- import { jsx as jsx30, jsxs as jsxs27 } from "react/jsx-runtime";
5408
+ import { jsx as jsx33, jsxs as jsxs30 } from "react/jsx-runtime";
5135
5409
  var sheetDrawerContentClassName = cn(
5136
5410
  "gap-0 p-0",
5137
5411
  "bg-[var(--bg-surface)] text-foreground",
@@ -5200,7 +5474,7 @@ function SheetDrawer({
5200
5474
  const resolvedWidth = expanded ? "full" : width;
5201
5475
  const resolvedExpandLabel = hasExpandedToggle && expanded ? collapseLabel : expandLabel;
5202
5476
  const ExpandActionIcon = hasExpandedToggle && expanded ? Minimize2Icon : Maximize2Icon;
5203
- return /* @__PURE__ */ jsx30(Sheet, { open, onOpenChange, children: /* @__PURE__ */ jsxs27(
5477
+ return /* @__PURE__ */ jsx33(Sheet, { open, onOpenChange, children: /* @__PURE__ */ jsxs30(
5204
5478
  SheetContent,
5205
5479
  {
5206
5480
  "data-slot": "sheet-drawer-content",
@@ -5214,11 +5488,11 @@ function SheetDrawer({
5214
5488
  resolvedWidth === "full" && sheetDrawerFullContentClassName
5215
5489
  ),
5216
5490
  children: [
5217
- /* @__PURE__ */ jsxs27("div", { "data-slot": "sheet-drawer-header", className: sheetDrawerHeaderClassName, children: [
5218
- /* @__PURE__ */ jsxs27("div", { className: sheetDrawerHeaderTextClassName, children: [
5219
- caption ? /* @__PURE__ */ jsx30("div", { "data-slot": "sheet-drawer-caption", className: sheetDrawerCaptionClassName, children: caption }) : null,
5220
- /* @__PURE__ */ jsx30(SheetTitle, { "data-slot": "sheet-drawer-title", className: sheetDrawerTitleClassName, children: title }),
5221
- description ? /* @__PURE__ */ jsx30(
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(
5222
5496
  SheetDescription,
5223
5497
  {
5224
5498
  "data-slot": "sheet-drawer-description",
@@ -5227,8 +5501,8 @@ function SheetDrawer({
5227
5501
  }
5228
5502
  ) : null
5229
5503
  ] }),
5230
- /* @__PURE__ */ jsxs27("div", { "data-slot": "sheet-drawer-header-actions", className: sheetDrawerHeaderActionsClassName, children: [
5231
- showExpandAction ? hasExpandedToggle ? /* @__PURE__ */ jsxs27(
5504
+ /* @__PURE__ */ jsxs30("div", { "data-slot": "sheet-drawer-header-actions", className: sheetDrawerHeaderActionsClassName, children: [
5505
+ showExpandAction ? hasExpandedToggle ? /* @__PURE__ */ jsxs30(
5232
5506
  "button",
5233
5507
  {
5234
5508
  type: "button",
@@ -5239,11 +5513,11 @@ function SheetDrawer({
5239
5513
  className: sheetDrawerExpandButtonClassName,
5240
5514
  onClick: () => onExpandedChange(!expanded),
5241
5515
  children: [
5242
- /* @__PURE__ */ jsx30(ExpandActionIcon, { className: "size-[16px]" }),
5243
- /* @__PURE__ */ jsx30("span", { className: "hidden text-sm font-medium leading-normal md:inline", children: resolvedExpandLabel })
5516
+ /* @__PURE__ */ jsx33(ExpandActionIcon, { className: "size-[16px]" }),
5517
+ /* @__PURE__ */ jsx33("span", { className: "hidden text-sm font-medium leading-normal md:inline", children: resolvedExpandLabel })
5244
5518
  ]
5245
5519
  }
5246
- ) : expandHref ? /* @__PURE__ */ jsxs27(
5520
+ ) : expandHref ? /* @__PURE__ */ jsxs30(
5247
5521
  "a",
5248
5522
  {
5249
5523
  href: expandHref,
@@ -5251,11 +5525,11 @@ function SheetDrawer({
5251
5525
  "data-slot": "sheet-drawer-expand",
5252
5526
  className: sheetDrawerExpandButtonClassName,
5253
5527
  children: [
5254
- /* @__PURE__ */ jsx30(ExpandActionIcon, { className: "size-[16px]" }),
5255
- /* @__PURE__ */ jsx30("span", { className: "hidden text-sm font-medium leading-normal md:inline", children: expandLabel })
5528
+ /* @__PURE__ */ jsx33(ExpandActionIcon, { className: "size-[16px]" }),
5529
+ /* @__PURE__ */ jsx33("span", { className: "hidden text-sm font-medium leading-normal md:inline", children: expandLabel })
5256
5530
  ]
5257
5531
  }
5258
- ) : /* @__PURE__ */ jsxs27(
5532
+ ) : /* @__PURE__ */ jsxs30(
5259
5533
  "button",
5260
5534
  {
5261
5535
  type: "button",
@@ -5264,40 +5538,40 @@ function SheetDrawer({
5264
5538
  className: sheetDrawerExpandButtonClassName,
5265
5539
  onClick: onExpand,
5266
5540
  children: [
5267
- /* @__PURE__ */ jsx30(ExpandActionIcon, { className: "size-[16px]" }),
5268
- /* @__PURE__ */ jsx30("span", { className: "hidden text-sm font-medium leading-normal md:inline", children: expandLabel })
5541
+ /* @__PURE__ */ jsx33(ExpandActionIcon, { className: "size-[16px]" }),
5542
+ /* @__PURE__ */ jsx33("span", { className: "hidden text-sm font-medium leading-normal md:inline", children: expandLabel })
5269
5543
  ]
5270
5544
  }
5271
5545
  ) : null,
5272
- /* @__PURE__ */ jsx30(
5546
+ /* @__PURE__ */ jsx33(
5273
5547
  SheetClose,
5274
5548
  {
5275
5549
  "aria-label": closeLabel,
5276
5550
  "data-slot": "sheet-drawer-close",
5277
5551
  className: sheetDrawerCloseButtonClassName,
5278
- children: /* @__PURE__ */ jsx30(XIcon2, { className: "size-[16px]" })
5552
+ children: /* @__PURE__ */ jsx33(XIcon2, { className: "size-[16px]" })
5279
5553
  }
5280
5554
  )
5281
5555
  ] })
5282
5556
  ] }),
5283
- /* @__PURE__ */ jsx30("div", { "data-slot": "sheet-drawer-body", className: sheetDrawerBodyClassName, children }),
5284
- footer ? /* @__PURE__ */ jsx30("div", { "data-slot": "sheet-drawer-footer", className: sheetDrawerFooterClassName, children: footer }) : null
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
5285
5559
  ]
5286
5560
  }
5287
5561
  ) });
5288
5562
  }
5289
5563
 
5290
5564
  // src/components/ui/popover.tsx
5291
- import * as React24 from "react";
5565
+ import * as React25 from "react";
5292
5566
  import { Popover as PopoverPrimitive } from "radix-ui";
5293
- import { jsx as jsx31, jsxs as jsxs28 } from "react/jsx-runtime";
5567
+ import { jsx as jsx34, jsxs as jsxs31 } from "react/jsx-runtime";
5294
5568
  function Popover({ modal = false, ...props }) {
5295
- return /* @__PURE__ */ jsx31(PopoverPrimitive.Root, { modal, ...props });
5569
+ return /* @__PURE__ */ jsx34(PopoverPrimitive.Root, { modal, ...props });
5296
5570
  }
5297
5571
  var PopoverTrigger = PopoverPrimitive.Trigger;
5298
5572
  var PopoverAnchor = PopoverPrimitive.Anchor;
5299
5573
  var PopoverClose = PopoverPrimitive.Close;
5300
- var PopoverContent = React24.forwardRef(({ className, align = "center", sideOffset = 8, collisionPadding = 8, showArrow = false, children, ...props }, ref) => /* @__PURE__ */ jsx31(PopoverPrimitive.Portal, { children: /* @__PURE__ */ jsxs28(
5574
+ var PopoverContent = React25.forwardRef(({ className, align = "center", sideOffset = 8, collisionPadding = 8, showArrow = false, children, ...props }, ref) => /* @__PURE__ */ jsx34(PopoverPrimitive.Portal, { children: /* @__PURE__ */ jsxs31(
5301
5575
  PopoverPrimitive.Content,
5302
5576
  {
5303
5577
  ref,
@@ -5321,7 +5595,7 @@ var PopoverContent = React24.forwardRef(({ className, align = "center", sideOffs
5321
5595
  ...props,
5322
5596
  children: [
5323
5597
  children,
5324
- showArrow ? /* @__PURE__ */ jsx31(
5598
+ showArrow ? /* @__PURE__ */ jsx34(
5325
5599
  PopoverPrimitive.Arrow,
5326
5600
  {
5327
5601
  "data-slot": "popover-arrow",
@@ -5334,7 +5608,7 @@ var PopoverContent = React24.forwardRef(({ className, align = "center", sideOffs
5334
5608
  }
5335
5609
  ) }));
5336
5610
  PopoverContent.displayName = PopoverPrimitive.Content.displayName;
5337
- var PopoverArrow = React24.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx31(
5611
+ var PopoverArrow = React25.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx34(
5338
5612
  PopoverPrimitive.Arrow,
5339
5613
  {
5340
5614
  ref,
@@ -5348,10 +5622,10 @@ var PopoverArrow = React24.forwardRef(({ className, ...props }, ref) => /* @__PU
5348
5622
  PopoverArrow.displayName = PopoverPrimitive.Arrow.displayName;
5349
5623
 
5350
5624
  // src/components/ui/badge.tsx
5351
- import * as React25 from "react";
5352
- import { cva as cva12 } from "class-variance-authority";
5353
- import { jsx as jsx32, jsxs as jsxs29 } from "react/jsx-runtime";
5354
- var badgeVariants = cva12(
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(
5355
5629
  [
5356
5630
  "inline-flex w-fit shrink-0 items-center whitespace-nowrap",
5357
5631
  "rounded-[var(--radius-full)] border leading-none",
@@ -5410,10 +5684,10 @@ var badgeVariants = cva12(
5410
5684
  }
5411
5685
  }
5412
5686
  );
5413
- var badgeDotVariants = cva12(
5687
+ var badgeDotVariants = cva13(
5414
5688
  "size-[var(--space-0-5)] shrink-0 rounded-[var(--radius-full)] bg-current"
5415
5689
  );
5416
- var Badge = React25.forwardRef(
5690
+ var Badge = React26.forwardRef(
5417
5691
  ({
5418
5692
  className,
5419
5693
  variant = "neutral",
@@ -5425,7 +5699,7 @@ var Badge = React25.forwardRef(
5425
5699
  ...props
5426
5700
  }, ref) => {
5427
5701
  const resolvedShowDot = showDot ?? variant === "status";
5428
- return /* @__PURE__ */ jsxs29(
5702
+ return /* @__PURE__ */ jsxs32(
5429
5703
  "span",
5430
5704
  {
5431
5705
  ref,
@@ -5438,7 +5712,7 @@ var Badge = React25.forwardRef(
5438
5712
  className: cn(badgeVariants({ variant, tone, size, className })),
5439
5713
  ...props,
5440
5714
  children: [
5441
- resolvedShowDot ? /* @__PURE__ */ jsx32("span", { "aria-hidden": "true", "data-slot": "badge-dot", className: badgeDotVariants() }) : null,
5715
+ resolvedShowDot ? /* @__PURE__ */ jsx35("span", { "aria-hidden": "true", "data-slot": "badge-dot", className: badgeDotVariants() }) : null,
5442
5716
  children
5443
5717
  ]
5444
5718
  }
@@ -5448,10 +5722,10 @@ var Badge = React25.forwardRef(
5448
5722
  Badge.displayName = "Badge";
5449
5723
 
5450
5724
  // src/components/ui/two-tier-badge.tsx
5451
- import * as React26 from "react";
5452
- import { cva as cva13 } from "class-variance-authority";
5453
- import { jsx as jsx33, jsxs as jsxs30 } from "react/jsx-runtime";
5454
- var twoTierBadgeVariants = cva13(
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(
5455
5729
  "inline-flex w-fit flex-col gap-[var(--space-0-5)]",
5456
5730
  {
5457
5731
  variants: {
@@ -5466,7 +5740,7 @@ var twoTierBadgeVariants = cva13(
5466
5740
  }
5467
5741
  }
5468
5742
  );
5469
- var twoTierBadgeLineVariants = cva13(
5743
+ var twoTierBadgeLineVariants = cva14(
5470
5744
  [
5471
5745
  "inline-flex w-fit shrink-0 items-center justify-center whitespace-nowrap",
5472
5746
  "rounded-[var(--radius-xs)] border leading-none",
@@ -5493,7 +5767,7 @@ var twoTierBadgeLineVariants = cva13(
5493
5767
  }
5494
5768
  }
5495
5769
  );
5496
- var TwoTierBadge = React26.forwardRef(
5770
+ var TwoTierBadge = React27.forwardRef(
5497
5771
  ({
5498
5772
  className,
5499
5773
  align,
@@ -5504,7 +5778,7 @@ var TwoTierBadge = React26.forwardRef(
5504
5778
  primaryClassName,
5505
5779
  secondaryClassName,
5506
5780
  ...props
5507
- }, ref) => /* @__PURE__ */ jsxs30(
5781
+ }, ref) => /* @__PURE__ */ jsxs33(
5508
5782
  "div",
5509
5783
  {
5510
5784
  ref,
@@ -5512,7 +5786,7 @@ var TwoTierBadge = React26.forwardRef(
5512
5786
  className: cn(twoTierBadgeVariants({ align, className })),
5513
5787
  ...props,
5514
5788
  children: [
5515
- /* @__PURE__ */ jsx33(
5789
+ /* @__PURE__ */ jsx36(
5516
5790
  "span",
5517
5791
  {
5518
5792
  "data-slot": "two-tier-badge-primary",
@@ -5526,7 +5800,7 @@ var TwoTierBadge = React26.forwardRef(
5526
5800
  children: primary
5527
5801
  }
5528
5802
  ),
5529
- secondary ? /* @__PURE__ */ jsx33(
5803
+ secondary ? /* @__PURE__ */ jsx36(
5530
5804
  "span",
5531
5805
  {
5532
5806
  "data-slot": "two-tier-badge-secondary",
@@ -5547,10 +5821,10 @@ var TwoTierBadge = React26.forwardRef(
5547
5821
  TwoTierBadge.displayName = "TwoTierBadge";
5548
5822
 
5549
5823
  // src/components/ui/status-badge.tsx
5550
- import * as React27 from "react";
5551
- import { cva as cva14 } from "class-variance-authority";
5552
- import { jsx as jsx34, jsxs as jsxs31 } from "react/jsx-runtime";
5553
- var statusBadgeVariants = cva14(
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(
5554
5828
  [
5555
5829
  "inline-flex w-fit shrink-0 items-center whitespace-nowrap",
5556
5830
  "rounded-[var(--radius-full)] border leading-none",
@@ -5579,10 +5853,10 @@ var statusBadgeVariants = cva14(
5579
5853
  }
5580
5854
  }
5581
5855
  );
5582
- var statusBadgeDotVariants = cva14(
5856
+ var statusBadgeDotVariants = cva15(
5583
5857
  "size-[var(--space-0-5)] shrink-0 rounded-[var(--radius-full)] bg-current"
5584
5858
  );
5585
- var StatusBadge = React27.forwardRef(
5859
+ var StatusBadge = React28.forwardRef(
5586
5860
  ({
5587
5861
  className,
5588
5862
  status = "active",
@@ -5591,7 +5865,7 @@ var StatusBadge = React27.forwardRef(
5591
5865
  pulse = true,
5592
5866
  children,
5593
5867
  ...props
5594
- }, ref) => /* @__PURE__ */ jsxs31(
5868
+ }, ref) => /* @__PURE__ */ jsxs34(
5595
5869
  "span",
5596
5870
  {
5597
5871
  ref,
@@ -5600,7 +5874,7 @@ var StatusBadge = React27.forwardRef(
5600
5874
  className: cn(statusBadgeVariants({ status, size, className })),
5601
5875
  ...props,
5602
5876
  children: [
5603
- showDot ? /* @__PURE__ */ jsx34(
5877
+ showDot ? /* @__PURE__ */ jsx37(
5604
5878
  "span",
5605
5879
  {
5606
5880
  "aria-hidden": "true",
@@ -5620,10 +5894,10 @@ var StatusBadge = React27.forwardRef(
5620
5894
  StatusBadge.displayName = "StatusBadge";
5621
5895
 
5622
5896
  // src/components/ui/notification-badge.tsx
5623
- import * as React28 from "react";
5624
- import { cva as cva15 } from "class-variance-authority";
5625
- import { jsx as jsx35 } from "react/jsx-runtime";
5626
- var notificationBadgeVariants = cva15(
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(
5627
5901
  [
5628
5902
  "inline-flex shrink-0 items-center justify-center rounded-[var(--radius-full)]",
5629
5903
  "bg-[var(--semantic-error,var(--error))] text-[var(--error-contrast)]",
@@ -5653,7 +5927,7 @@ function formatNotificationCount(count, max) {
5653
5927
  }
5654
5928
  return String(count);
5655
5929
  }
5656
- var NotificationBadge = React28.forwardRef(
5930
+ var NotificationBadge = React29.forwardRef(
5657
5931
  ({
5658
5932
  className,
5659
5933
  count,
@@ -5668,7 +5942,7 @@ var NotificationBadge = React28.forwardRef(
5668
5942
  }
5669
5943
  const normalizedMax = Math.max(1, Math.floor(max));
5670
5944
  const label = ariaLabel ?? (count > normalizedMax ? `\uC77D\uC9C0 \uC54A\uC740 \uC54C\uB9BC ${normalizedMax}\uAC1C \uC774\uC0C1` : `\uC77D\uC9C0 \uC54A\uC740 \uC54C\uB9BC ${count}\uAC1C`);
5671
- return /* @__PURE__ */ jsx35(
5945
+ return /* @__PURE__ */ jsx38(
5672
5946
  "span",
5673
5947
  {
5674
5948
  ref,
@@ -5686,12 +5960,12 @@ var NotificationBadge = React28.forwardRef(
5686
5960
  NotificationBadge.displayName = "NotificationBadge";
5687
5961
 
5688
5962
  // src/components/ui/chip.tsx
5689
- import * as React29 from "react";
5690
- import { cva as cva16 } from "class-variance-authority";
5691
- import { X as X3 } from "lucide-react";
5963
+ import * as React30 from "react";
5964
+ import { cva as cva17 } from "class-variance-authority";
5965
+ import { X as X4 } from "lucide-react";
5692
5966
  import { Slot as Slot2 } from "radix-ui";
5693
- import { jsx as jsx36, jsxs as jsxs32 } from "react/jsx-runtime";
5694
- var chipVariants = cva16(
5967
+ import { jsx as jsx39, jsxs as jsxs35 } from "react/jsx-runtime";
5968
+ var chipVariants = cva17(
5695
5969
  [
5696
5970
  "inline-flex w-fit shrink-0 items-center justify-center whitespace-nowrap",
5697
5971
  "rounded-[var(--radius-full)] border leading-none",
@@ -5754,7 +6028,7 @@ var chipVariants = cva16(
5754
6028
  }
5755
6029
  }
5756
6030
  );
5757
- var chipCountVariants = cva16(
6031
+ var chipCountVariants = cva17(
5758
6032
  [
5759
6033
  "inline-flex min-w-[var(--space-2)] items-center justify-center",
5760
6034
  "rounded-[var(--radius-full)] px-[var(--space-0-5)]",
@@ -5782,7 +6056,7 @@ var chipCountVariants = cva16(
5782
6056
  }
5783
6057
  }
5784
6058
  );
5785
- var Chip = React29.forwardRef(
6059
+ var Chip = React30.forwardRef(
5786
6060
  ({
5787
6061
  className,
5788
6062
  variant = "filter",
@@ -5797,7 +6071,7 @@ var Chip = React29.forwardRef(
5797
6071
  }, ref) => {
5798
6072
  const Comp = asChild ? Slot2.Root : "button";
5799
6073
  const removable = variant === "removable";
5800
- return /* @__PURE__ */ jsxs32(
6074
+ return /* @__PURE__ */ jsxs35(
5801
6075
  Comp,
5802
6076
  {
5803
6077
  ref,
@@ -5812,7 +6086,7 @@ var Chip = React29.forwardRef(
5812
6086
  ...props,
5813
6087
  children: [
5814
6088
  children,
5815
- count !== void 0 ? /* @__PURE__ */ jsx36(
6089
+ count !== void 0 ? /* @__PURE__ */ jsx39(
5816
6090
  "span",
5817
6091
  {
5818
6092
  "aria-hidden": "true",
@@ -5822,13 +6096,13 @@ var Chip = React29.forwardRef(
5822
6096
  children: count
5823
6097
  }
5824
6098
  ) : null,
5825
- removable ? /* @__PURE__ */ jsx36(
6099
+ removable ? /* @__PURE__ */ jsx39(
5826
6100
  "span",
5827
6101
  {
5828
6102
  "aria-label": removeLabel,
5829
6103
  "data-slot": "chip-remove",
5830
6104
  className: "inline-flex size-[var(--space-2)] items-center justify-center rounded-[var(--radius-full)] text-text-tertiary",
5831
- children: /* @__PURE__ */ jsx36(X3, { "aria-hidden": "true", size: 14, strokeWidth: 2.25 })
6105
+ children: /* @__PURE__ */ jsx39(X4, { "aria-hidden": "true", size: 14, strokeWidth: 2.25 })
5832
6106
  }
5833
6107
  ) : null
5834
6108
  ]
@@ -5839,10 +6113,10 @@ var Chip = React29.forwardRef(
5839
6113
  Chip.displayName = "Chip";
5840
6114
 
5841
6115
  // src/components/ui/empty-state.tsx
5842
- import * as React30 from "react";
5843
- import { cva as cva17 } from "class-variance-authority";
5844
- import { jsx as jsx37, jsxs as jsxs33 } from "react/jsx-runtime";
5845
- var emptyStateBaseVariants = cva17(
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(
5846
6120
  [
5847
6121
  "flex flex-col items-center justify-center text-center",
5848
6122
  "rounded-[var(--radius-md)] border border-[var(--border-subtle)]",
@@ -5879,7 +6153,7 @@ function emptyStateVariants({ size, tone = "neutral", surface, className } = {})
5879
6153
  className
5880
6154
  );
5881
6155
  }
5882
- var emptyStateIconVariants = cva17(
6156
+ var emptyStateIconVariants = cva18(
5883
6157
  [
5884
6158
  "inline-flex items-center justify-center rounded-[var(--radius-full)]",
5885
6159
  "border border-[var(--border-subtle)] bg-[var(--bg-raised)] text-text-tertiary"
@@ -5897,12 +6171,12 @@ var emptyStateIconVariants = cva17(
5897
6171
  }
5898
6172
  }
5899
6173
  );
5900
- var iconSize2 = {
6174
+ var iconSize3 = {
5901
6175
  sm: 18,
5902
6176
  md: 20,
5903
6177
  lg: 24
5904
6178
  };
5905
- var EmptyState = React30.forwardRef(
6179
+ var EmptyState = React31.forwardRef(
5906
6180
  ({
5907
6181
  className,
5908
6182
  size = "md",
@@ -5916,7 +6190,7 @@ var EmptyState = React30.forwardRef(
5916
6190
  ...props
5917
6191
  }, ref) => {
5918
6192
  const resolvedSize = size ?? "md";
5919
- return /* @__PURE__ */ jsxs33(
6193
+ return /* @__PURE__ */ jsxs36(
5920
6194
  "div",
5921
6195
  {
5922
6196
  ref,
@@ -5925,17 +6199,17 @@ var EmptyState = React30.forwardRef(
5925
6199
  className: cn(emptyStateVariants({ size, tone, surface, className })),
5926
6200
  ...props,
5927
6201
  children: [
5928
- Icon ? /* @__PURE__ */ jsx37(
6202
+ Icon ? /* @__PURE__ */ jsx40(
5929
6203
  "span",
5930
6204
  {
5931
6205
  "aria-hidden": "true",
5932
6206
  "data-slot": "empty-state-icon",
5933
6207
  className: emptyStateIconVariants({ size: resolvedSize }),
5934
- children: /* @__PURE__ */ jsx37(Icon, { size: iconSize2[resolvedSize], strokeWidth: 1.75 })
6208
+ children: /* @__PURE__ */ jsx40(Icon, { size: iconSize3[resolvedSize], strokeWidth: 1.75 })
5935
6209
  }
5936
6210
  ) : null,
5937
- /* @__PURE__ */ jsxs33("div", { className: "flex max-w-[420px] flex-col items-center gap-[var(--space-1)]", children: [
5938
- /* @__PURE__ */ jsx37(
6211
+ /* @__PURE__ */ jsxs36("div", { className: "flex max-w-[420px] flex-col items-center gap-[var(--space-1)]", children: [
6212
+ /* @__PURE__ */ jsx40(
5939
6213
  "h2",
5940
6214
  {
5941
6215
  "data-slot": "empty-state-title",
@@ -5943,7 +6217,7 @@ var EmptyState = React30.forwardRef(
5943
6217
  children: title
5944
6218
  }
5945
6219
  ),
5946
- description ? /* @__PURE__ */ jsx37(
6220
+ description ? /* @__PURE__ */ jsx40(
5947
6221
  "p",
5948
6222
  {
5949
6223
  "data-slot": "empty-state-description",
@@ -5951,7 +6225,7 @@ var EmptyState = React30.forwardRef(
5951
6225
  children: description
5952
6226
  }
5953
6227
  ) : null,
5954
- hint ? /* @__PURE__ */ jsx37(
6228
+ hint ? /* @__PURE__ */ jsx40(
5955
6229
  "p",
5956
6230
  {
5957
6231
  "data-slot": "empty-state-hint",
@@ -5960,7 +6234,7 @@ var EmptyState = React30.forwardRef(
5960
6234
  }
5961
6235
  ) : null
5962
6236
  ] }),
5963
- action ? /* @__PURE__ */ jsx37("div", { "data-slot": "empty-state-action", className: "mt-[var(--space-1)]", children: action }) : null
6237
+ action ? /* @__PURE__ */ jsx40("div", { "data-slot": "empty-state-action", className: "mt-[var(--space-1)]", children: action }) : null
5964
6238
  ]
5965
6239
  }
5966
6240
  );
@@ -5969,11 +6243,11 @@ var EmptyState = React30.forwardRef(
5969
6243
  EmptyState.displayName = "EmptyState";
5970
6244
 
5971
6245
  // src/components/ui/error-state.tsx
5972
- import * as React31 from "react";
6246
+ import * as React32 from "react";
5973
6247
  import { AlertTriangle as AlertTriangle2 } from "lucide-react";
5974
- import { cva as cva18 } from "class-variance-authority";
5975
- import { jsx as jsx38, jsxs as jsxs34 } from "react/jsx-runtime";
5976
- var errorStateVariants = cva18(
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(
5977
6251
  [
5978
6252
  "flex flex-col items-center justify-center text-center",
5979
6253
  "rounded-[var(--radius-md)] border border-[var(--border-subtle)]",
@@ -5994,7 +6268,7 @@ var errorStateVariants = cva18(
5994
6268
  }
5995
6269
  }
5996
6270
  );
5997
- var ErrorState = React31.forwardRef(
6271
+ var ErrorState = React32.forwardRef(
5998
6272
  ({
5999
6273
  className,
6000
6274
  size = "md",
@@ -6005,7 +6279,7 @@ var ErrorState = React31.forwardRef(
6005
6279
  onRetry,
6006
6280
  retryLabel = "\uB2E4\uC2DC \uC2DC\uB3C4",
6007
6281
  ...props
6008
- }, ref) => /* @__PURE__ */ jsxs34(
6282
+ }, ref) => /* @__PURE__ */ jsxs37(
6009
6283
  "div",
6010
6284
  {
6011
6285
  ref,
@@ -6014,17 +6288,17 @@ var ErrorState = React31.forwardRef(
6014
6288
  className: cn(errorStateVariants({ size, surface, className })),
6015
6289
  ...props,
6016
6290
  children: [
6017
- /* @__PURE__ */ jsx38(
6291
+ /* @__PURE__ */ jsx41(
6018
6292
  "span",
6019
6293
  {
6020
6294
  "aria-hidden": "true",
6021
6295
  "data-slot": "error-state-icon",
6022
6296
  className: "inline-flex size-[48px] items-center justify-center rounded-[var(--radius-full)] bg-[var(--error-bg)] text-[var(--error)]",
6023
- children: /* @__PURE__ */ jsx38(AlertTriangle2, { size: 24, strokeWidth: 1.75 })
6297
+ children: /* @__PURE__ */ jsx41(AlertTriangle2, { size: 24, strokeWidth: 1.75 })
6024
6298
  }
6025
6299
  ),
6026
- /* @__PURE__ */ jsxs34("div", { className: "flex max-w-[420px] flex-col items-center gap-[var(--space-1)]", children: [
6027
- /* @__PURE__ */ jsx38(
6300
+ /* @__PURE__ */ jsxs37("div", { className: "flex max-w-[420px] flex-col items-center gap-[var(--space-1)]", children: [
6301
+ /* @__PURE__ */ jsx41(
6028
6302
  "h2",
6029
6303
  {
6030
6304
  "data-slot": "error-state-title",
@@ -6032,7 +6306,7 @@ var ErrorState = React31.forwardRef(
6032
6306
  children: title
6033
6307
  }
6034
6308
  ),
6035
- /* @__PURE__ */ jsx38(
6309
+ /* @__PURE__ */ jsx41(
6036
6310
  "p",
6037
6311
  {
6038
6312
  "data-slot": "error-state-message",
@@ -6040,7 +6314,7 @@ var ErrorState = React31.forwardRef(
6040
6314
  children: message
6041
6315
  }
6042
6316
  ),
6043
- errorCode ? /* @__PURE__ */ jsx38(
6317
+ errorCode ? /* @__PURE__ */ jsx41(
6044
6318
  "p",
6045
6319
  {
6046
6320
  "data-slot": "error-state-code",
@@ -6049,7 +6323,7 @@ var ErrorState = React31.forwardRef(
6049
6323
  }
6050
6324
  ) : null
6051
6325
  ] }),
6052
- onRetry ? /* @__PURE__ */ jsx38(Button, { size: "sm", variant: "outline", onClick: onRetry, children: retryLabel }) : null
6326
+ onRetry ? /* @__PURE__ */ jsx41(Button, { size: "sm", variant: "outline", onClick: onRetry, children: retryLabel }) : null
6053
6327
  ]
6054
6328
  }
6055
6329
  )
@@ -6057,10 +6331,10 @@ var ErrorState = React31.forwardRef(
6057
6331
  ErrorState.displayName = "ErrorState";
6058
6332
 
6059
6333
  // src/components/ui/skeleton.tsx
6060
- import * as React32 from "react";
6061
- import { cva as cva19 } from "class-variance-authority";
6062
- import { jsx as jsx39 } from "react/jsx-runtime";
6063
- var skeletonVariants = cva19(
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(
6064
6338
  [
6065
6339
  "animate-pulse rounded-[var(--radius-sm)] bg-[var(--bg-raised)]",
6066
6340
  "motion-reduce:animate-none motion-reduce:opacity-80"
@@ -6078,7 +6352,7 @@ var skeletonVariants = cva19(
6078
6352
  }
6079
6353
  }
6080
6354
  );
6081
- var spinnerVariants = cva19(
6355
+ var spinnerVariants = cva20(
6082
6356
  [
6083
6357
  "inline-block shrink-0 animate-spin rounded-[var(--radius-full)] border-2",
6084
6358
  "border-[var(--border-subtle)] border-t-[var(--accent-solid)]",
@@ -6101,8 +6375,8 @@ var spinnerVariants = cva19(
6101
6375
  }
6102
6376
  }
6103
6377
  );
6104
- var Skeleton = React32.forwardRef(
6105
- ({ className, shape, style, ...props }, ref) => /* @__PURE__ */ jsx39(
6378
+ var Skeleton = React33.forwardRef(
6379
+ ({ className, shape, style, ...props }, ref) => /* @__PURE__ */ jsx42(
6106
6380
  "div",
6107
6381
  {
6108
6382
  ref,
@@ -6115,15 +6389,15 @@ var Skeleton = React32.forwardRef(
6115
6389
  );
6116
6390
  Skeleton.displayName = "Skeleton";
6117
6391
  var defaultTextWidths = ["92%", "84%", "68%", "76%"];
6118
- var SkeletonText = React32.forwardRef(
6119
- ({ className, lines = 3, widths = defaultTextWidths, ...props }, ref) => /* @__PURE__ */ jsx39(
6392
+ var SkeletonText = React33.forwardRef(
6393
+ ({ className, lines = 3, widths = defaultTextWidths, ...props }, ref) => /* @__PURE__ */ jsx42(
6120
6394
  "div",
6121
6395
  {
6122
6396
  ref,
6123
6397
  "data-slot": "skeleton-text",
6124
6398
  className: cn("flex flex-col gap-[var(--space-1)]", className),
6125
6399
  ...props,
6126
- children: Array.from({ length: lines }, (_, index) => /* @__PURE__ */ jsx39(
6400
+ children: Array.from({ length: lines }, (_, index) => /* @__PURE__ */ jsx42(
6127
6401
  Skeleton,
6128
6402
  {
6129
6403
  shape: "text",
@@ -6135,7 +6409,7 @@ var SkeletonText = React32.forwardRef(
6135
6409
  )
6136
6410
  );
6137
6411
  SkeletonText.displayName = "SkeletonText";
6138
- var SkeletonRow = React32.forwardRef(
6412
+ var SkeletonRow = React33.forwardRef(
6139
6413
  ({
6140
6414
  className,
6141
6415
  columns,
@@ -6146,7 +6420,7 @@ var SkeletonRow = React32.forwardRef(
6146
6420
  }, ref) => {
6147
6421
  const rowCount = Math.max(5, count);
6148
6422
  const gridTemplateColumns = columns.map((column) => column.width ?? "1fr").join(" ");
6149
- return /* @__PURE__ */ jsx39(
6423
+ return /* @__PURE__ */ jsx42(
6150
6424
  "div",
6151
6425
  {
6152
6426
  ref,
@@ -6160,7 +6434,7 @@ var SkeletonRow = React32.forwardRef(
6160
6434
  className
6161
6435
  ),
6162
6436
  ...props,
6163
- children: Array.from({ length: rowCount }, (_, rowIndex) => /* @__PURE__ */ jsx39(
6437
+ children: Array.from({ length: rowCount }, (_, rowIndex) => /* @__PURE__ */ jsx42(
6164
6438
  "div",
6165
6439
  {
6166
6440
  "data-slot": "skeleton-row",
@@ -6168,11 +6442,11 @@ var SkeletonRow = React32.forwardRef(
6168
6442
  "grid min-h-[48px] items-center border-t border-[var(--border-subtle)] first:border-t-0"
6169
6443
  ),
6170
6444
  style: { gridTemplateColumns },
6171
- children: columns.map((column, columnIndex) => /* @__PURE__ */ jsx39(
6445
+ children: columns.map((column, columnIndex) => /* @__PURE__ */ jsx42(
6172
6446
  "div",
6173
6447
  {
6174
6448
  className: "px-[var(--space-2)] py-[var(--space-1)]",
6175
- children: /* @__PURE__ */ jsx39(
6449
+ children: /* @__PURE__ */ jsx42(
6176
6450
  Skeleton,
6177
6451
  {
6178
6452
  shape: "text",
@@ -6192,8 +6466,8 @@ var SkeletonRow = React32.forwardRef(
6192
6466
  }
6193
6467
  );
6194
6468
  SkeletonRow.displayName = "SkeletonRow";
6195
- var Spinner = React32.forwardRef(
6196
- ({ className, size, label = "\uB85C\uB529 \uC911", ...props }, ref) => /* @__PURE__ */ jsx39(
6469
+ var Spinner = React33.forwardRef(
6470
+ ({ className, size, label = "\uB85C\uB529 \uC911", ...props }, ref) => /* @__PURE__ */ jsx42(
6197
6471
  "span",
6198
6472
  {
6199
6473
  ref,
@@ -6207,155 +6481,11 @@ var Spinner = React32.forwardRef(
6207
6481
  );
6208
6482
  Spinner.displayName = "Spinner";
6209
6483
 
6210
- // src/components/ui/icon-button.tsx
6211
- import * as React33 from "react";
6212
- import { cva as cva20 } from "class-variance-authority";
6213
- import { jsx as jsx40, jsxs as jsxs35 } from "react/jsx-runtime";
6214
- var iconButtonVariants = cva20(
6215
- [
6216
- "olun-icon-button relative inline-flex cursor-pointer shrink-0 items-center justify-center",
6217
- "rounded-[var(--radius-sm)] border font-medium",
6218
- "transition-colors motion-reduce:transition-none",
6219
- "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--focus-ring)]",
6220
- "disabled:cursor-not-allowed disabled:bg-[var(--action-disabled-bg)] disabled:text-text-disabled",
6221
- "[&_svg]:pointer-events-none [&_svg]:shrink-0"
6222
- ].join(" "),
6223
- {
6224
- variants: {
6225
- variant: {
6226
- ghost: "border-transparent bg-transparent text-text-secondary hover:bg-[var(--action-hover)] hover:text-foreground",
6227
- 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",
6228
- subtle: "border-transparent bg-[var(--bg-raised)] text-text-secondary hover:bg-[var(--action-hover)] hover:text-foreground",
6229
- danger: "border-transparent bg-[var(--error-bg)] text-[var(--error)] hover:bg-[var(--action-hover)]"
6230
- },
6231
- size: {
6232
- sm: "size-[var(--space-4)]",
6233
- md: "size-[var(--touch-target-min)]",
6234
- lg: "size-[var(--space-6)]"
6235
- },
6236
- pressed: {
6237
- true: "",
6238
- false: ""
6239
- }
6240
- },
6241
- compoundVariants: [
6242
- {
6243
- pressed: true,
6244
- variant: ["ghost", "outline", "subtle"],
6245
- className: "border-[var(--border-accent)] bg-[var(--action-selected)] text-foreground"
6246
- },
6247
- {
6248
- pressed: true,
6249
- variant: "danger",
6250
- className: "border-[var(--error)] bg-[var(--error-bg)] text-[var(--error)]"
6251
- }
6252
- ],
6253
- defaultVariants: {
6254
- variant: "ghost",
6255
- size: "md",
6256
- pressed: false
6257
- }
6258
- }
6259
- );
6260
- var iconButtonBadgeVariants = cva20(
6261
- [
6262
- "pointer-events-none absolute right-0 top-0 inline-flex",
6263
- "olun-icon-button__badge",
6264
- "min-h-[var(--space-1-5)] min-w-[var(--space-1-5)] translate-x-1/3 -translate-y-1/3",
6265
- "items-center justify-center gap-[2px] rounded-[var(--radius-full)] px-[3px]",
6266
- "font-[family-name:var(--font-display)] text-[10px] font-semibold leading-none",
6267
- "[&:has(svg)]:size-[var(--space-1-5)] [&:has(svg)]:px-0 [&_svg]:size-[10px]"
6268
- ].join(" "),
6269
- {
6270
- variants: {
6271
- tone: {
6272
- info: "bg-[var(--accent-solid)] text-[var(--accent-on-solid)]",
6273
- error: "bg-[var(--error)] text-[var(--error-contrast)]"
6274
- }
6275
- },
6276
- defaultVariants: {
6277
- tone: "info"
6278
- }
6279
- }
6280
- );
6281
- var iconSize3 = {
6282
- sm: 14,
6283
- md: 16,
6284
- lg: 18
6285
- };
6286
- var iconStrokeWidth = {
6287
- sm: 2.25,
6288
- md: 2.25,
6289
- lg: 1.75
6290
- };
6291
- var IconButton = React33.forwardRef(
6292
- ({
6293
- className,
6294
- variant = "ghost",
6295
- size = "md",
6296
- pressed = false,
6297
- icon: Icon,
6298
- badge,
6299
- badgeTone = "info",
6300
- type,
6301
- title,
6302
- "aria-label": ariaLabel,
6303
- "aria-labelledby": ariaLabelledBy,
6304
- ...props
6305
- }, ref) => {
6306
- const resolvedSize = size ?? "md";
6307
- const isToggle = pressed !== void 0;
6308
- const isPressed = pressed === true;
6309
- const hoverTitle = title ?? (typeof ariaLabel === "string" ? ariaLabel : void 0);
6310
- return /* @__PURE__ */ jsxs35(
6311
- "button",
6312
- {
6313
- ref,
6314
- ...props,
6315
- "data-slot": "icon-button",
6316
- "data-variant": variant,
6317
- "data-size": resolvedSize,
6318
- "data-pressed": isToggle ? String(isPressed) : void 0,
6319
- "aria-label": ariaLabel,
6320
- "aria-labelledby": ariaLabelledBy,
6321
- "aria-pressed": isToggle ? isPressed : void 0,
6322
- title: hoverTitle,
6323
- className: cn(
6324
- iconButtonVariants({ variant, size, pressed: isPressed, className })
6325
- ),
6326
- type: type ?? "button",
6327
- children: [
6328
- /* @__PURE__ */ jsx40(
6329
- Icon,
6330
- {
6331
- "aria-hidden": "true",
6332
- "data-slot": "icon-button-icon",
6333
- size: iconSize3[resolvedSize],
6334
- strokeWidth: iconStrokeWidth[resolvedSize]
6335
- }
6336
- ),
6337
- badge !== void 0 ? /* @__PURE__ */ jsx40(
6338
- "span",
6339
- {
6340
- "aria-hidden": "true",
6341
- "data-slot": "icon-button-badge",
6342
- "data-badge-tone": badgeTone,
6343
- className: iconButtonBadgeVariants({ tone: badgeTone }),
6344
- children: badge
6345
- }
6346
- ) : null
6347
- ]
6348
- }
6349
- );
6350
- }
6351
- );
6352
- IconButton.displayName = "IconButton";
6353
-
6354
6484
  // src/components/ui/pagination.tsx
6355
6485
  import * as React34 from "react";
6356
6486
  import { ChevronsLeft, ChevronLeft, ChevronRight, ChevronsRight } from "lucide-react";
6357
6487
  import { cva as cva21 } from "class-variance-authority";
6358
- import { jsx as jsx41, jsxs as jsxs36 } from "react/jsx-runtime";
6488
+ import { jsx as jsx43, jsxs as jsxs38 } from "react/jsx-runtime";
6359
6489
  var paginationVariants = cva21(
6360
6490
  [
6361
6491
  "flex w-full flex-col gap-[var(--space-1-5)]",
@@ -6430,7 +6560,7 @@ function NavigationButton({
6430
6560
  icon: Icon,
6431
6561
  onPageChange
6432
6562
  }) {
6433
- return /* @__PURE__ */ jsx41(
6563
+ return /* @__PURE__ */ jsx43(
6434
6564
  "button",
6435
6565
  {
6436
6566
  "aria-label": label,
@@ -6438,7 +6568,7 @@ function NavigationButton({
6438
6568
  className: paginationControlVariants({ size }),
6439
6569
  type: "button",
6440
6570
  onClick: () => onPageChange?.(page),
6441
- children: /* @__PURE__ */ jsx41(Icon, { "aria-hidden": "true", "data-slot": "pagination-icon" })
6571
+ children: /* @__PURE__ */ jsx43(Icon, { "aria-hidden": "true", "data-slot": "pagination-icon" })
6442
6572
  }
6443
6573
  );
6444
6574
  }
@@ -6470,7 +6600,7 @@ var Pagination = React34.forwardRef(
6470
6600
  value: String(option),
6471
6601
  label: option
6472
6602
  }));
6473
- return /* @__PURE__ */ jsxs36(
6603
+ return /* @__PURE__ */ jsxs38(
6474
6604
  "nav",
6475
6605
  {
6476
6606
  ref,
@@ -6480,16 +6610,16 @@ var Pagination = React34.forwardRef(
6480
6610
  className: cn(paginationVariants({ size: resolvedSize, className })),
6481
6611
  ...props,
6482
6612
  children: [
6483
- /* @__PURE__ */ jsxs36("div", { className: "flex flex-wrap items-center gap-[var(--space-1-5)]", children: [
6484
- /* @__PURE__ */ jsx41("span", { "data-slot": "pagination-total", className: "font-medium text-text-secondary", children: totalLabel(total) }),
6485
- /* @__PURE__ */ jsxs36(
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(
6486
6616
  "div",
6487
6617
  {
6488
6618
  "data-slot": "pagination-size",
6489
6619
  className: "inline-flex items-center gap-[var(--space-1)] text-xs text-text-tertiary",
6490
6620
  children: [
6491
- /* @__PURE__ */ jsx41("span", { children: pageSizeLabel }),
6492
- /* @__PURE__ */ jsx41(
6621
+ /* @__PURE__ */ jsx43("span", { children: pageSizeLabel }),
6622
+ /* @__PURE__ */ jsx43(
6493
6623
  Select,
6494
6624
  {
6495
6625
  "aria-label": pageSizeLabel,
@@ -6505,13 +6635,13 @@ var Pagination = React34.forwardRef(
6505
6635
  }
6506
6636
  )
6507
6637
  ] }),
6508
- /* @__PURE__ */ jsxs36(
6638
+ /* @__PURE__ */ jsxs38(
6509
6639
  "div",
6510
6640
  {
6511
6641
  "data-slot": "pagination-list",
6512
6642
  className: "flex items-center justify-center gap-[var(--space-0-5)]",
6513
6643
  children: [
6514
- /* @__PURE__ */ jsx41(
6644
+ /* @__PURE__ */ jsx43(
6515
6645
  NavigationButton,
6516
6646
  {
6517
6647
  label: "\uCCAB \uD398\uC774\uC9C0",
@@ -6522,7 +6652,7 @@ var Pagination = React34.forwardRef(
6522
6652
  onPageChange
6523
6653
  }
6524
6654
  ),
6525
- /* @__PURE__ */ jsx41(
6655
+ /* @__PURE__ */ jsx43(
6526
6656
  NavigationButton,
6527
6657
  {
6528
6658
  label: "\uC774\uC804 \uD398\uC774\uC9C0",
@@ -6534,7 +6664,7 @@ var Pagination = React34.forwardRef(
6534
6664
  }
6535
6665
  ),
6536
6666
  items.map(
6537
- (item, index) => item === "ellipsis" ? /* @__PURE__ */ jsx41(
6667
+ (item, index) => item === "ellipsis" ? /* @__PURE__ */ jsx43(
6538
6668
  "span",
6539
6669
  {
6540
6670
  "data-slot": "pagination-ellipsis",
@@ -6546,7 +6676,7 @@ var Pagination = React34.forwardRef(
6546
6676
  children: "..."
6547
6677
  },
6548
6678
  `ellipsis-${index}`
6549
- ) : /* @__PURE__ */ jsx41(
6679
+ ) : /* @__PURE__ */ jsx43(
6550
6680
  "button",
6551
6681
  {
6552
6682
  "aria-label": `${item} \uD398\uC774\uC9C0`,
@@ -6560,7 +6690,7 @@ var Pagination = React34.forwardRef(
6560
6690
  item
6561
6691
  )
6562
6692
  ),
6563
- /* @__PURE__ */ jsx41(
6693
+ /* @__PURE__ */ jsx43(
6564
6694
  NavigationButton,
6565
6695
  {
6566
6696
  label: "\uB2E4\uC74C \uD398\uC774\uC9C0",
@@ -6571,7 +6701,7 @@ var Pagination = React34.forwardRef(
6571
6701
  onPageChange
6572
6702
  }
6573
6703
  ),
6574
- /* @__PURE__ */ jsx41(
6704
+ /* @__PURE__ */ jsx43(
6575
6705
  NavigationButton,
6576
6706
  {
6577
6707
  label: "\uB9C8\uC9C0\uB9C9 \uD398\uC774\uC9C0",
@@ -6594,7 +6724,7 @@ Pagination.displayName = "Pagination";
6594
6724
 
6595
6725
  // src/components/ui/mode-toggle.tsx
6596
6726
  import { cva as cva22 } from "class-variance-authority";
6597
- import { jsx as jsx42, jsxs as jsxs37 } from "react/jsx-runtime";
6727
+ import { jsx as jsx44, jsxs as jsxs39 } from "react/jsx-runtime";
6598
6728
  var modeToggleVariants = cva22(
6599
6729
  [
6600
6730
  "inline-flex items-center rounded-[var(--radius-sm)] border border-[var(--border-subtle)]",
@@ -6624,7 +6754,7 @@ function ModeToggle({
6624
6754
  onChange,
6625
6755
  ...props
6626
6756
  }) {
6627
- return /* @__PURE__ */ jsx42(
6757
+ return /* @__PURE__ */ jsx44(
6628
6758
  "div",
6629
6759
  {
6630
6760
  role: "group",
@@ -6634,7 +6764,7 @@ function ModeToggle({
6634
6764
  children: options.map((option) => {
6635
6765
  const Icon = option.icon;
6636
6766
  const isActive = option.value === value;
6637
- return /* @__PURE__ */ jsxs37(
6767
+ return /* @__PURE__ */ jsxs39(
6638
6768
  "button",
6639
6769
  {
6640
6770
  type: "button",
@@ -6650,8 +6780,8 @@ function ModeToggle({
6650
6780
  }
6651
6781
  },
6652
6782
  children: [
6653
- Icon ? /* @__PURE__ */ jsx42(Icon, { "aria-hidden": "true", "data-slot": "mode-toggle-icon" }) : null,
6654
- /* @__PURE__ */ jsx42("span", { children: option.label })
6783
+ Icon ? /* @__PURE__ */ jsx44(Icon, { "aria-hidden": "true", "data-slot": "mode-toggle-icon" }) : null,
6784
+ /* @__PURE__ */ jsx44("span", { children: option.label })
6655
6785
  ]
6656
6786
  },
6657
6787
  option.value
@@ -6664,7 +6794,7 @@ function ModeToggle({
6664
6794
  // src/components/ui/action-footer.tsx
6665
6795
  import * as React35 from "react";
6666
6796
  import { cva as cva23 } from "class-variance-authority";
6667
- import { jsx as jsx43, jsxs as jsxs38 } from "react/jsx-runtime";
6797
+ import { jsx as jsx45, jsxs as jsxs40 } from "react/jsx-runtime";
6668
6798
  var actionFooterVariants = cva23(
6669
6799
  [
6670
6800
  "flex flex-wrap items-center gap-[var(--space-2)] border-t border-[var(--border-subtle)]",
@@ -6735,7 +6865,7 @@ function getStatusLabel(status) {
6735
6865
  }
6736
6866
  }
6737
6867
  function renderAction(action) {
6738
- return /* @__PURE__ */ jsx43(
6868
+ return /* @__PURE__ */ jsx45(
6739
6869
  Button,
6740
6870
  {
6741
6871
  variant: action.variant,
@@ -6766,7 +6896,7 @@ var ActionFooter = React35.forwardRef(
6766
6896
  const mainActions = sortMainActions(
6767
6897
  visibleActions.filter((action) => !destructiveVariants.has(action.variant ?? "default"))
6768
6898
  );
6769
- return /* @__PURE__ */ jsxs38(
6899
+ return /* @__PURE__ */ jsxs40(
6770
6900
  "div",
6771
6901
  {
6772
6902
  ref,
@@ -6775,7 +6905,7 @@ var ActionFooter = React35.forwardRef(
6775
6905
  className: cn(actionFooterVariants({ position, surface, className })),
6776
6906
  ...props,
6777
6907
  children: [
6778
- destructiveActions.length > 0 ? /* @__PURE__ */ jsx43(
6908
+ destructiveActions.length > 0 ? /* @__PURE__ */ jsx45(
6779
6909
  "div",
6780
6910
  {
6781
6911
  "data-slot": "action-footer-destructive-actions",
@@ -6783,7 +6913,7 @@ var ActionFooter = React35.forwardRef(
6783
6913
  children: destructiveActions.map(renderAction)
6784
6914
  }
6785
6915
  ) : null,
6786
- status ? /* @__PURE__ */ jsxs38(
6916
+ status ? /* @__PURE__ */ jsxs40(
6787
6917
  "div",
6788
6918
  {
6789
6919
  "data-slot": "action-footer-status",
@@ -6791,7 +6921,7 @@ var ActionFooter = React35.forwardRef(
6791
6921
  "aria-live": "polite",
6792
6922
  className: cn(actionFooterStatusVariants({ kind: status.kind })),
6793
6923
  children: [
6794
- /* @__PURE__ */ jsx43(
6924
+ /* @__PURE__ */ jsx45(
6795
6925
  "span",
6796
6926
  {
6797
6927
  "aria-hidden": "true",
@@ -6799,11 +6929,11 @@ var ActionFooter = React35.forwardRef(
6799
6929
  className: "size-[6px] shrink-0 rounded-[var(--radius-full)]"
6800
6930
  }
6801
6931
  ),
6802
- /* @__PURE__ */ jsx43("span", { className: "truncate", children: getStatusLabel(status) })
6932
+ /* @__PURE__ */ jsx45("span", { className: "truncate", children: getStatusLabel(status) })
6803
6933
  ]
6804
6934
  }
6805
6935
  ) : null,
6806
- /* @__PURE__ */ jsx43(
6936
+ /* @__PURE__ */ jsx45(
6807
6937
  "div",
6808
6938
  {
6809
6939
  "data-slot": "action-footer-main-actions",
@@ -6820,9 +6950,9 @@ ActionFooter.displayName = "ActionFooter";
6820
6950
 
6821
6951
  // src/components/ui/toast.tsx
6822
6952
  import * as React36 from "react";
6823
- import { AlertCircle as AlertCircle5, AlertTriangle as AlertTriangle3, CheckCircle2 as CheckCircle25, Info as Info2, X as X4 } from "lucide-react";
6953
+ import { AlertCircle as AlertCircle5, AlertTriangle as AlertTriangle3, CheckCircle2 as CheckCircle25, Info as Info2, X as X5 } from "lucide-react";
6824
6954
  import { cva as cva24 } from "class-variance-authority";
6825
- import { jsx as jsx44, jsxs as jsxs39 } from "react/jsx-runtime";
6955
+ import { jsx as jsx46, jsxs as jsxs41 } from "react/jsx-runtime";
6826
6956
  var toastVariants = cva24(
6827
6957
  [
6828
6958
  "grid min-w-[280px] max-w-[420px] grid-cols-[auto_1fr_auto] items-center",
@@ -6921,7 +7051,7 @@ var ToastRoot = React36.forwardRef(
6921
7051
  }, ref) => {
6922
7052
  const Icon = toastIcons[variant];
6923
7053
  const hasIcon = Icon !== null;
6924
- return /* @__PURE__ */ jsxs39(
7054
+ return /* @__PURE__ */ jsxs41(
6925
7055
  "div",
6926
7056
  {
6927
7057
  ref,
@@ -6937,7 +7067,7 @@ var ToastRoot = React36.forwardRef(
6937
7067
  ),
6938
7068
  ...props,
6939
7069
  children: [
6940
- Icon ? /* @__PURE__ */ jsx44(
7070
+ Icon ? /* @__PURE__ */ jsx46(
6941
7071
  Icon,
6942
7072
  {
6943
7073
  "aria-hidden": "true",
@@ -6947,9 +7077,9 @@ var ToastRoot = React36.forwardRef(
6947
7077
  className: "shrink-0"
6948
7078
  }
6949
7079
  ) : null,
6950
- /* @__PURE__ */ jsxs39("div", { "data-slot": "toast-body", className: "min-w-0", children: [
6951
- /* @__PURE__ */ jsx44("div", { "data-slot": "toast-message", className: "font-normal", children: message }),
6952
- action ? /* @__PURE__ */ jsx44(
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(
6953
7083
  Button,
6954
7084
  {
6955
7085
  "data-slot": "toast-action",
@@ -6961,7 +7091,7 @@ var ToastRoot = React36.forwardRef(
6961
7091
  }
6962
7092
  ) : null
6963
7093
  ] }),
6964
- /* @__PURE__ */ jsx44(
7094
+ /* @__PURE__ */ jsx46(
6965
7095
  "button",
6966
7096
  {
6967
7097
  type: "button",
@@ -6973,7 +7103,7 @@ var ToastRoot = React36.forwardRef(
6973
7103
  "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--focus-ring)]"
6974
7104
  ),
6975
7105
  onClick: onClose,
6976
- children: /* @__PURE__ */ jsx44(X4, { "aria-hidden": "true", size: 16, strokeWidth: 1.75 })
7106
+ children: /* @__PURE__ */ jsx46(X5, { "aria-hidden": "true", size: 16, strokeWidth: 1.75 })
6977
7107
  }
6978
7108
  )
6979
7109
  ]
@@ -6982,7 +7112,7 @@ var ToastRoot = React36.forwardRef(
6982
7112
  }
6983
7113
  );
6984
7114
  ToastRoot.displayName = "ToastRoot";
6985
- var ToastViewport = React36.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx44(
7115
+ var ToastViewport = React36.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx46(
6986
7116
  "ol",
6987
7117
  {
6988
7118
  ref,
@@ -7000,9 +7130,9 @@ function ToastProvider({ children, maxToasts = 3, className, ...props }) {
7000
7130
  }),
7001
7131
  [maxToasts]
7002
7132
  );
7003
- return /* @__PURE__ */ jsxs39("div", { "data-slot": "toast-provider", className, ...props, children: [
7133
+ return /* @__PURE__ */ jsxs41("div", { "data-slot": "toast-provider", className, ...props, children: [
7004
7134
  children,
7005
- /* @__PURE__ */ jsx44(ToastViewport, { children: items.map((item) => /* @__PURE__ */ jsx44("li", { children: /* @__PURE__ */ jsx44(ToastRoot, { ...item, onClose: () => toast.dismiss(item.id) }) }, item.id)) })
7135
+ /* @__PURE__ */ jsx46(ToastViewport, { children: items.map((item) => /* @__PURE__ */ jsx46("li", { children: /* @__PURE__ */ jsx46(ToastRoot, { ...item, onClose: () => toast.dismiss(item.id) }) }, item.id)) })
7006
7136
  ] });
7007
7137
  }
7008
7138
 
@@ -7010,7 +7140,7 @@ function ToastProvider({ children, maxToasts = 3, className, ...props }) {
7010
7140
  import * as React37 from "react";
7011
7141
  import { cva as cva25 } from "class-variance-authority";
7012
7142
  import { AlertCircle as AlertCircle6 } from "lucide-react";
7013
- import { Fragment as Fragment8, jsx as jsx45, jsxs as jsxs40 } from "react/jsx-runtime";
7143
+ import { Fragment as Fragment8, jsx as jsx47, jsxs as jsxs42 } from "react/jsx-runtime";
7014
7144
  var otpFieldVariants = cva25("flex w-full flex-col gap-[var(--space-1-5)]", {
7015
7145
  variants: {
7016
7146
  size: {
@@ -7162,7 +7292,7 @@ var OTPField = React37.forwardRef(
7162
7292
  },
7163
7293
  [disabled, isControlled, length, onComplete, onValueChange]
7164
7294
  );
7165
- return /* @__PURE__ */ jsxs40(
7295
+ return /* @__PURE__ */ jsxs42(
7166
7296
  "fieldset",
7167
7297
  {
7168
7298
  ref,
@@ -7175,7 +7305,7 @@ var OTPField = React37.forwardRef(
7175
7305
  className: cn(otpFieldVariants({ size, className })),
7176
7306
  ...props,
7177
7307
  children: [
7178
- /* @__PURE__ */ jsx45(
7308
+ /* @__PURE__ */ jsx47(
7179
7309
  "legend",
7180
7310
  {
7181
7311
  id: labelId,
@@ -7184,7 +7314,7 @@ var OTPField = React37.forwardRef(
7184
7314
  children: label
7185
7315
  }
7186
7316
  ),
7187
- /* @__PURE__ */ jsx45(
7317
+ /* @__PURE__ */ jsx47(
7188
7318
  "div",
7189
7319
  {
7190
7320
  "data-slot": "otp-field-group",
@@ -7194,7 +7324,7 @@ var OTPField = React37.forwardRef(
7194
7324
  children: Array.from({ length }, (_, index) => {
7195
7325
  const digit = resolvedSlots[index] ?? "";
7196
7326
  const inputId = `${fieldId}-cell-${index + 1}`;
7197
- return /* @__PURE__ */ jsx45(
7327
+ return /* @__PURE__ */ jsx47(
7198
7328
  "input",
7199
7329
  {
7200
7330
  ref: (node) => {
@@ -7289,15 +7419,15 @@ var OTPField = React37.forwardRef(
7289
7419
  })
7290
7420
  }
7291
7421
  ),
7292
- helperText || errorText ? /* @__PURE__ */ jsx45(
7422
+ helperText || errorText ? /* @__PURE__ */ jsx47(
7293
7423
  "p",
7294
7424
  {
7295
7425
  id: errorText ? errorId : helperId,
7296
7426
  "data-slot": "otp-field-message",
7297
7427
  "data-kind": errorText ? "error" : "helper",
7298
7428
  className: otpFieldMessageVariants({ state: resolvedState }),
7299
- children: errorText ? /* @__PURE__ */ jsxs40(Fragment8, { children: [
7300
- /* @__PURE__ */ jsx45(
7429
+ children: errorText ? /* @__PURE__ */ jsxs42(Fragment8, { children: [
7430
+ /* @__PURE__ */ jsx47(
7301
7431
  AlertCircle6,
7302
7432
  {
7303
7433
  "aria-hidden": "true",
@@ -7305,11 +7435,11 @@ var OTPField = React37.forwardRef(
7305
7435
  strokeWidth: 2
7306
7436
  }
7307
7437
  ),
7308
- /* @__PURE__ */ jsx45("span", { children: errorText })
7309
- ] }) : /* @__PURE__ */ jsx45("span", { children: helperText })
7438
+ /* @__PURE__ */ jsx47("span", { children: errorText })
7439
+ ] }) : /* @__PURE__ */ jsx47("span", { children: helperText })
7310
7440
  }
7311
7441
  ) : null,
7312
- name ? /* @__PURE__ */ jsx45(
7442
+ name ? /* @__PURE__ */ jsx47(
7313
7443
  "input",
7314
7444
  {
7315
7445
  "aria-hidden": "true",
@@ -7331,9 +7461,9 @@ OTPField.displayName = "OTPField";
7331
7461
 
7332
7462
  // src/components/ui/search-field.tsx
7333
7463
  import * as React38 from "react";
7334
- import { Search, X as X5 } from "lucide-react";
7464
+ import { Search, X as X6 } from "lucide-react";
7335
7465
  import { cva as cva26 } from "class-variance-authority";
7336
- import { jsx as jsx46, jsxs as jsxs41 } from "react/jsx-runtime";
7466
+ import { jsx as jsx48, jsxs as jsxs43 } from "react/jsx-runtime";
7337
7467
  var searchFieldVariants = cva26("relative flex w-full items-center", {
7338
7468
  variants: {
7339
7469
  size: {
@@ -7432,14 +7562,14 @@ var SearchField = React38.forwardRef(
7432
7562
  }
7433
7563
  onClear?.();
7434
7564
  };
7435
- return /* @__PURE__ */ jsxs41(
7565
+ return /* @__PURE__ */ jsxs43(
7436
7566
  "div",
7437
7567
  {
7438
7568
  "data-slot": "search-field",
7439
7569
  "data-size": resolvedSize,
7440
7570
  className: cn(searchFieldVariants({ size, className })),
7441
7571
  children: [
7442
- /* @__PURE__ */ jsx46(
7572
+ /* @__PURE__ */ jsx48(
7443
7573
  Search,
7444
7574
  {
7445
7575
  "aria-hidden": "true",
@@ -7449,7 +7579,7 @@ var SearchField = React38.forwardRef(
7449
7579
  strokeWidth: resolvedSize === "sm" ? 2 : 1.75
7450
7580
  }
7451
7581
  ),
7452
- /* @__PURE__ */ jsx46(
7582
+ /* @__PURE__ */ jsx48(
7453
7583
  "input",
7454
7584
  {
7455
7585
  ref: inputRef,
@@ -7470,7 +7600,7 @@ var SearchField = React38.forwardRef(
7470
7600
  ...props
7471
7601
  }
7472
7602
  ),
7473
- showClear ? /* @__PURE__ */ jsx46(
7603
+ showClear ? /* @__PURE__ */ jsx48(
7474
7604
  "button",
7475
7605
  {
7476
7606
  type: "button",
@@ -7478,7 +7608,7 @@ var SearchField = React38.forwardRef(
7478
7608
  "data-slot": "search-field-clear",
7479
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)]",
7480
7610
  onClick: clearInput,
7481
- children: /* @__PURE__ */ jsx46(X5, { "aria-hidden": "true", size: 16, strokeWidth: 1.75 })
7611
+ children: /* @__PURE__ */ jsx48(X6, { "aria-hidden": "true", size: 16, strokeWidth: 1.75 })
7482
7612
  }
7483
7613
  ) : null
7484
7614
  ]
@@ -7491,7 +7621,7 @@ SearchField.displayName = "SearchField";
7491
7621
  // src/components/ui/checkbox-group.tsx
7492
7622
  import * as React39 from "react";
7493
7623
  import { cva as cva27 } from "class-variance-authority";
7494
- import { jsx as jsx47 } from "react/jsx-runtime";
7624
+ import { jsx as jsx49 } from "react/jsx-runtime";
7495
7625
  var checkboxGroupVariants = cva27("gap-[var(--space-1)]", {
7496
7626
  variants: {
7497
7627
  appearance: {
@@ -7567,7 +7697,7 @@ var CheckboxGroup = React39.forwardRef(
7567
7697
  }),
7568
7698
  [appearance, density, disabled, name, selectedValues, toggleValue]
7569
7699
  );
7570
- return /* @__PURE__ */ jsx47(CheckboxGroupContext.Provider, { value: contextValue, children: /* @__PURE__ */ jsx47(
7700
+ return /* @__PURE__ */ jsx49(CheckboxGroupContext.Provider, { value: contextValue, children: /* @__PURE__ */ jsx49(
7571
7701
  "div",
7572
7702
  {
7573
7703
  ref,
@@ -7595,7 +7725,7 @@ import * as React40 from "react";
7595
7725
  import { cva as cva28 } from "class-variance-authority";
7596
7726
  import { Circle } from "lucide-react";
7597
7727
  import { RadioGroup as RadioGroupPrimitive } from "radix-ui";
7598
- import { jsx as jsx48, jsxs as jsxs42 } from "react/jsx-runtime";
7728
+ import { jsx as jsx50, jsxs as jsxs44 } from "react/jsx-runtime";
7599
7729
  var radioGroupVariants = cva28("gap-[var(--space-1)]", {
7600
7730
  variants: {
7601
7731
  appearance: {
@@ -7703,7 +7833,7 @@ var RadioGroup = React40.forwardRef(
7703
7833
  () => ({ appearance, density }),
7704
7834
  [appearance, density]
7705
7835
  );
7706
- return /* @__PURE__ */ jsx48(RadioGroupContext.Provider, { value: contextValue, children: /* @__PURE__ */ jsx48(
7836
+ return /* @__PURE__ */ jsx50(RadioGroupContext.Provider, { value: contextValue, children: /* @__PURE__ */ jsx50(
7707
7837
  RadioGroupPrimitive.Root,
7708
7838
  {
7709
7839
  ref,
@@ -7732,7 +7862,7 @@ var Radio = React40.forwardRef(({ className, children, description, id, ...props
7732
7862
  const radioId = id ?? generatedId;
7733
7863
  const labelId = `${radioId}-label`;
7734
7864
  const descriptionId = description ? `${radioId}-description` : void 0;
7735
- return /* @__PURE__ */ jsxs42(
7865
+ return /* @__PURE__ */ jsxs44(
7736
7866
  RadioGroupPrimitive.Item,
7737
7867
  {
7738
7868
  ref,
@@ -7743,24 +7873,24 @@ var Radio = React40.forwardRef(({ className, children, description, id, ...props
7743
7873
  className: cn(radioVariants({ appearance, density }), className),
7744
7874
  ...props,
7745
7875
  children: [
7746
- /* @__PURE__ */ jsx48(
7876
+ /* @__PURE__ */ jsx50(
7747
7877
  "span",
7748
7878
  {
7749
7879
  "aria-hidden": "true",
7750
7880
  "data-slot": "radio-control",
7751
7881
  className: radioControlVariants({ appearance }),
7752
- children: /* @__PURE__ */ jsx48(
7882
+ children: /* @__PURE__ */ jsx50(
7753
7883
  RadioGroupPrimitive.Indicator,
7754
7884
  {
7755
7885
  "data-slot": "radio-indicator",
7756
7886
  className: "flex items-center justify-center",
7757
- children: /* @__PURE__ */ jsx48(Circle, { "aria-hidden": "true", size: 8, fill: "currentColor" })
7887
+ children: /* @__PURE__ */ jsx50(Circle, { "aria-hidden": "true", size: 8, fill: "currentColor" })
7758
7888
  }
7759
7889
  )
7760
7890
  }
7761
7891
  ),
7762
- /* @__PURE__ */ jsxs42("span", { className: "flex min-w-0 flex-col gap-[var(--space-0-5)]", children: [
7763
- /* @__PURE__ */ jsx48(
7892
+ /* @__PURE__ */ jsxs44("span", { className: "flex min-w-0 flex-col gap-[var(--space-0-5)]", children: [
7893
+ /* @__PURE__ */ jsx50(
7764
7894
  "span",
7765
7895
  {
7766
7896
  id: labelId,
@@ -7772,7 +7902,7 @@ var Radio = React40.forwardRef(({ className, children, description, id, ...props
7772
7902
  children
7773
7903
  }
7774
7904
  ),
7775
- description ? /* @__PURE__ */ jsx48(
7905
+ description ? /* @__PURE__ */ jsx50(
7776
7906
  "span",
7777
7907
  {
7778
7908
  id: descriptionId,
@@ -7790,20 +7920,20 @@ Radio.displayName = "Radio";
7790
7920
 
7791
7921
  // src/components/ui/scroll-area.tsx
7792
7922
  import { ScrollArea as ScrollAreaPrimitive } from "radix-ui";
7793
- import { jsx as jsx49, jsxs as jsxs43 } from "react/jsx-runtime";
7923
+ import { jsx as jsx51, jsxs as jsxs45 } from "react/jsx-runtime";
7794
7924
  function ScrollArea({
7795
7925
  className,
7796
7926
  children,
7797
7927
  ...props
7798
7928
  }) {
7799
- return /* @__PURE__ */ jsxs43(
7929
+ return /* @__PURE__ */ jsxs45(
7800
7930
  ScrollAreaPrimitive.Root,
7801
7931
  {
7802
7932
  "data-slot": "scroll-area",
7803
7933
  className: cn("relative", className),
7804
7934
  ...props,
7805
7935
  children: [
7806
- /* @__PURE__ */ jsx49(
7936
+ /* @__PURE__ */ jsx51(
7807
7937
  ScrollAreaPrimitive.Viewport,
7808
7938
  {
7809
7939
  "data-slot": "scroll-area-viewport",
@@ -7811,8 +7941,8 @@ function ScrollArea({
7811
7941
  children
7812
7942
  }
7813
7943
  ),
7814
- /* @__PURE__ */ jsx49(ScrollBar, {}),
7815
- /* @__PURE__ */ jsx49(ScrollAreaPrimitive.Corner, {})
7944
+ /* @__PURE__ */ jsx51(ScrollBar, {}),
7945
+ /* @__PURE__ */ jsx51(ScrollAreaPrimitive.Corner, {})
7816
7946
  ]
7817
7947
  }
7818
7948
  );
@@ -7822,7 +7952,7 @@ function ScrollBar({
7822
7952
  orientation = "vertical",
7823
7953
  ...props
7824
7954
  }) {
7825
- return /* @__PURE__ */ jsx49(
7955
+ return /* @__PURE__ */ jsx51(
7826
7956
  ScrollAreaPrimitive.ScrollAreaScrollbar,
7827
7957
  {
7828
7958
  "data-slot": "scroll-area-scrollbar",
@@ -7834,7 +7964,7 @@ function ScrollBar({
7834
7964
  className
7835
7965
  ),
7836
7966
  ...props,
7837
- children: /* @__PURE__ */ jsx49(
7967
+ children: /* @__PURE__ */ jsx51(
7838
7968
  ScrollAreaPrimitive.ScrollAreaThumb,
7839
7969
  {
7840
7970
  "data-slot": "scroll-area-thumb",
@@ -7846,7 +7976,7 @@ function ScrollBar({
7846
7976
  }
7847
7977
 
7848
7978
  // src/components/ui/progress.tsx
7849
- import { jsx as jsx50 } from "react/jsx-runtime";
7979
+ import { jsx as jsx52 } from "react/jsx-runtime";
7850
7980
  var progressFillByStatus = {
7851
7981
  active: "bg-[var(--accent-solid)]",
7852
7982
  success: "bg-[var(--success)]",
@@ -7867,7 +7997,7 @@ function Progress({
7867
7997
  const clamped = Math.max(0, Math.min(safeMax, value));
7868
7998
  const percent = clamped / safeMax * 100;
7869
7999
  const w = typeof width === "number" ? `${width}px` : width;
7870
- return /* @__PURE__ */ jsx50(
8000
+ return /* @__PURE__ */ jsx52(
7871
8001
  "div",
7872
8002
  {
7873
8003
  role: "progressbar",
@@ -7881,7 +8011,7 @@ function Progress({
7881
8011
  ),
7882
8012
  style: { width: w, height: `${height}px`, ...style },
7883
8013
  ...props,
7884
- children: /* @__PURE__ */ jsx50(
8014
+ children: /* @__PURE__ */ jsx52(
7885
8015
  "div",
7886
8016
  {
7887
8017
  className: cn(
@@ -7899,7 +8029,7 @@ function Progress({
7899
8029
  import * as React41 from "react";
7900
8030
  import { ChevronRight as ChevronRight2 } from "lucide-react";
7901
8031
  import { cva as cva29 } from "class-variance-authority";
7902
- import { jsx as jsx51, jsxs as jsxs44 } from "react/jsx-runtime";
8032
+ import { jsx as jsx53, jsxs as jsxs46 } from "react/jsx-runtime";
7903
8033
  var treeViewVariants = cva29(
7904
8034
  "m-0 list-none p-[var(--space-0-5)] text-body-sm text-foreground"
7905
8035
  );
@@ -8069,7 +8199,7 @@ function TreeView({
8069
8199
  const selected = node.id === selectedId;
8070
8200
  const isActive = node.id === activeId;
8071
8201
  const itemState = { expanded, selected, depth, hasChildren };
8072
- return /* @__PURE__ */ jsxs44(
8202
+ return /* @__PURE__ */ jsxs46(
8073
8203
  "li",
8074
8204
  {
8075
8205
  ref: (element) => {
@@ -8094,7 +8224,7 @@ function TreeView({
8094
8224
  onSelect?.(node.id, node);
8095
8225
  },
8096
8226
  children: [
8097
- /* @__PURE__ */ jsxs44(
8227
+ /* @__PURE__ */ jsxs46(
8098
8228
  "span",
8099
8229
  {
8100
8230
  "data-slot": "treeitem-row",
@@ -8103,7 +8233,7 @@ function TreeView({
8103
8233
  },
8104
8234
  className: treeItemRowVariants({ selected }),
8105
8235
  children: [
8106
- hasChildren ? /* @__PURE__ */ jsx51(
8236
+ hasChildren ? /* @__PURE__ */ jsx53(
8107
8237
  "span",
8108
8238
  {
8109
8239
  "data-slot": "treeitem-toggle",
@@ -8113,7 +8243,7 @@ function TreeView({
8113
8243
  setExpanded(node.id, !expanded);
8114
8244
  },
8115
8245
  className: "flex size-[var(--space-2)] shrink-0 items-center justify-center text-text-tertiary",
8116
- children: /* @__PURE__ */ jsx51(
8246
+ children: /* @__PURE__ */ jsx53(
8117
8247
  ChevronRight2,
8118
8248
  {
8119
8249
  "aria-hidden": "true",
@@ -8126,7 +8256,7 @@ function TreeView({
8126
8256
  }
8127
8257
  )
8128
8258
  }
8129
- ) : /* @__PURE__ */ jsx51(
8259
+ ) : /* @__PURE__ */ jsx53(
8130
8260
  "span",
8131
8261
  {
8132
8262
  "data-slot": "treeitem-spacer",
@@ -8134,18 +8264,18 @@ function TreeView({
8134
8264
  className: "size-[var(--space-2)] shrink-0"
8135
8265
  }
8136
8266
  ),
8137
- /* @__PURE__ */ jsx51("span", { className: "flex min-w-0 flex-1 items-center gap-[var(--space-1)]", children: renderItem(node, itemState) })
8267
+ /* @__PURE__ */ jsx53("span", { className: "flex min-w-0 flex-1 items-center gap-[var(--space-1)]", children: renderItem(node, itemState) })
8138
8268
  ]
8139
8269
  }
8140
8270
  ),
8141
- hasChildren && expanded && children ? /* @__PURE__ */ jsx51("ul", { role: "group", "data-slot": "tree-group", className: "m-0 list-none p-0", children: renderLevel(children, depth + 1) }) : null
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
8142
8272
  ]
8143
8273
  },
8144
8274
  node.id
8145
8275
  );
8146
8276
  });
8147
8277
  }
8148
- return /* @__PURE__ */ jsx51(
8278
+ return /* @__PURE__ */ jsx53(
8149
8279
  "ul",
8150
8280
  {
8151
8281
  role: "tree",
@@ -8161,9 +8291,9 @@ function TreeView({
8161
8291
  }
8162
8292
 
8163
8293
  // src/components/branding/olun-logo.tsx
8164
- import { jsx as jsx52, jsxs as jsxs45 } from "react/jsx-runtime";
8294
+ import { jsx as jsx54, jsxs as jsxs47 } from "react/jsx-runtime";
8165
8295
  function OlunSymbol({ size = 28, className }) {
8166
- return /* @__PURE__ */ jsxs45(
8296
+ return /* @__PURE__ */ jsxs47(
8167
8297
  "svg",
8168
8298
  {
8169
8299
  width: size,
@@ -8174,7 +8304,7 @@ function OlunSymbol({ size = 28, className }) {
8174
8304
  className,
8175
8305
  "aria-hidden": "true",
8176
8306
  children: [
8177
- /* @__PURE__ */ jsx52(
8307
+ /* @__PURE__ */ jsx54(
8178
8308
  "circle",
8179
8309
  {
8180
8310
  cx: "108",
@@ -8186,7 +8316,7 @@ function OlunSymbol({ size = 28, className }) {
8186
8316
  style: { color: "var(--text-primary)" }
8187
8317
  }
8188
8318
  ),
8189
- /* @__PURE__ */ jsx52("circle", { cx: "185", cy: "175", r: "22", fill: "var(--accent-solid)" })
8319
+ /* @__PURE__ */ jsx54("circle", { cx: "185", cy: "175", r: "22", fill: "var(--accent-solid)" })
8190
8320
  ]
8191
8321
  }
8192
8322
  );
@@ -8197,7 +8327,7 @@ function OlunLogo({
8197
8327
  showSymbol = true,
8198
8328
  className
8199
8329
  }) {
8200
- return /* @__PURE__ */ jsxs45(
8330
+ return /* @__PURE__ */ jsxs47(
8201
8331
  "div",
8202
8332
  {
8203
8333
  className,
@@ -8207,8 +8337,8 @@ function OlunLogo({
8207
8337
  gap: "var(--space-1-5)"
8208
8338
  },
8209
8339
  children: [
8210
- showSymbol && /* @__PURE__ */ jsx52(OlunSymbol, { size: symbolSize }),
8211
- /* @__PURE__ */ jsxs45(
8340
+ showSymbol && /* @__PURE__ */ jsx54(OlunSymbol, { size: symbolSize }),
8341
+ /* @__PURE__ */ jsxs47(
8212
8342
  "span",
8213
8343
  {
8214
8344
  style: {
@@ -8220,7 +8350,7 @@ function OlunLogo({
8220
8350
  },
8221
8351
  children: [
8222
8352
  "OLUN",
8223
- /* @__PURE__ */ jsx52("span", { style: { color: "var(--accent-fg)" }, children: "." })
8353
+ /* @__PURE__ */ jsx54("span", { style: { color: "var(--accent-fg)" }, children: "." })
8224
8354
  ]
8225
8355
  }
8226
8356
  )
@@ -8231,11 +8361,11 @@ function OlunLogo({
8231
8361
 
8232
8362
  // src/components/branding/theme-toggle.tsx
8233
8363
  import { Sun, Moon } from "lucide-react";
8234
- import { jsx as jsx53 } from "react/jsx-runtime";
8364
+ import { jsx as jsx55 } from "react/jsx-runtime";
8235
8365
  function ThemeToggle({ className }) {
8236
8366
  const { resolvedTheme, toggleTheme } = useOlunTheme();
8237
8367
  const Icon = resolvedTheme === "dark" ? Moon : Sun;
8238
- return /* @__PURE__ */ jsx53(
8368
+ return /* @__PURE__ */ jsx55(
8239
8369
  "button",
8240
8370
  {
8241
8371
  onClick: () => toggleTheme(),
@@ -8247,14 +8377,14 @@ function ThemeToggle({ className }) {
8247
8377
  ),
8248
8378
  "aria-label": "\uD14C\uB9C8 \uC804\uD658",
8249
8379
  title: resolvedTheme === "dark" ? "\uB77C\uC774\uD2B8 \uBAA8\uB4DC\uB85C" : "\uB2E4\uD06C \uBAA8\uB4DC\uB85C",
8250
- children: /* @__PURE__ */ jsx53(Icon, { className: "size-[18px]", strokeWidth: 1.75 })
8380
+ children: /* @__PURE__ */ jsx55(Icon, { className: "size-[18px]", strokeWidth: 1.75 })
8251
8381
  }
8252
8382
  );
8253
8383
  }
8254
8384
 
8255
8385
  // src/components/branding/theme-fab.tsx
8256
8386
  import { Sun as Sun2, Moon as Moon2 } from "lucide-react";
8257
- import { jsx as jsx54 } from "react/jsx-runtime";
8387
+ import { jsx as jsx56 } from "react/jsx-runtime";
8258
8388
  function ThemeFab({ variant = "square" } = {}) {
8259
8389
  const { mounted, resolvedTheme, toggleTheme } = useOlunTheme();
8260
8390
  if (!mounted) {
@@ -8294,7 +8424,7 @@ function ThemeFab({ variant = "square" } = {}) {
8294
8424
  WebkitBackdropFilter: "blur(16px)",
8295
8425
  zIndex: 9999
8296
8426
  };
8297
- return /* @__PURE__ */ jsx54(
8427
+ return /* @__PURE__ */ jsx56(
8298
8428
  "button",
8299
8429
  {
8300
8430
  onClick: () => toggleTheme(),
@@ -8319,7 +8449,7 @@ function ThemeFab({ variant = "square" } = {}) {
8319
8449
  e.currentTarget.style.color = "var(--text-secondary)";
8320
8450
  }
8321
8451
  },
8322
- children: /* @__PURE__ */ jsx54(
8452
+ children: /* @__PURE__ */ jsx56(
8323
8453
  Icon,
8324
8454
  {
8325
8455
  size: isCircle ? 22 : 16,
@@ -8331,7 +8461,7 @@ function ThemeFab({ variant = "square" } = {}) {
8331
8461
  }
8332
8462
 
8333
8463
  // src/components/logos/organization-logo.tsx
8334
- import { jsx as jsx55 } from "react/jsx-runtime";
8464
+ import { jsx as jsx57 } from "react/jsx-runtime";
8335
8465
  var organizationLogoRegistry = {
8336
8466
  jbnu: {
8337
8467
  label: "\uC804\uBD81\uB300\uD559\uAD50 \uC5E0\uBE14\uB7FC",
@@ -8360,7 +8490,7 @@ function OrganizationLogo({
8360
8490
  }) {
8361
8491
  const asset = organizationLogoRegistry[organization];
8362
8492
  const isDecorative = ariaHidden === true || ariaHidden === "true";
8363
- return /* @__PURE__ */ jsx55(
8493
+ return /* @__PURE__ */ jsx57(
8364
8494
  "svg",
8365
8495
  {
8366
8496
  viewBox: asset.viewBox,
@@ -8378,7 +8508,7 @@ function OrganizationLogo({
8378
8508
  ...style
8379
8509
  },
8380
8510
  ...props,
8381
- children: asset.paths.map((path) => /* @__PURE__ */ jsx55("path", { d: path }, path))
8511
+ children: asset.paths.map((path) => /* @__PURE__ */ jsx57("path", { d: path }, path))
8382
8512
  }
8383
8513
  );
8384
8514
  }
@@ -8389,6 +8519,7 @@ export {
8389
8519
  AvatarFallback,
8390
8520
  AvatarImage,
8391
8521
  Badge,
8522
+ BulkActionBar,
8392
8523
  Button,
8393
8524
  Card,
8394
8525
  CardContent,
@@ -8402,6 +8533,7 @@ export {
8402
8533
  CheckboxGroupContext,
8403
8534
  Chip,
8404
8535
  ConfirmDialog,
8536
+ ContextMenu,
8405
8537
  CopyButton,
8406
8538
  DataTable,
8407
8539
  DetailLayout,