@olundot/ui 0.8.1 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/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",
@@ -5057,11 +5331,14 @@ function SheetContent({
5057
5331
  hasSlideMotion && "max-[899px]:data-[state=open]:animate-[olun-sheet-in-from-left_var(--sheet-motion-duration)_var(--sheet-motion-easing)_both] max-[899px]:data-[state=closed]:animate-[olun-sheet-out-to-left_var(--sheet-motion-duration)_var(--sheet-motion-easing)_both]"
5058
5332
  ),
5059
5333
  mobileSide === "top" && cn(
5060
- "max-[899px]:inset-x-0 max-[899px]:top-0 max-[899px]:bottom-auto max-[899px]:h-auto max-[899px]:w-full max-[899px]:border-b max-[899px]:border-l-0 max-[899px]:rounded-none",
5334
+ // `max-w-none!` overrides the side variant's `sm:max-w-sm` cap (see mobileSide bottom).
5335
+ "max-[899px]:inset-x-0 max-[899px]:top-0 max-[899px]:bottom-auto max-[899px]:h-auto max-[899px]:w-full max-[899px]:max-w-none! max-[899px]:border-b max-[899px]:border-l-0 max-[899px]:rounded-none",
5061
5336
  hasSlideMotion && "max-[899px]:data-[state=open]:animate-[olun-sheet-in-from-top_var(--sheet-motion-duration)_var(--sheet-motion-easing)_both] max-[899px]:data-[state=closed]:animate-[olun-sheet-out-to-top_var(--sheet-motion-duration)_var(--sheet-motion-easing)_both]"
5062
5337
  ),
5063
5338
  mobileSide === "bottom" && cn(
5064
- "max-[899px]:inset-x-0 max-[899px]:bottom-0 max-[899px]:top-auto max-[899px]:h-auto max-[899px]:w-full max-[899px]:border-t max-[899px]:border-l-0 max-[899px]:rounded-none",
5339
+ // `max-w-none!` overrides the side variant's `sm:max-w-sm` cap so the bottom sheet
5340
+ // spans the full viewport width across the whole < 900px band (not capped to 24rem).
5341
+ "max-[899px]:inset-x-0 max-[899px]:bottom-0 max-[899px]:top-auto max-[899px]:h-auto max-[899px]:w-full max-[899px]:max-w-none! max-[899px]:border-t max-[899px]:border-l-0 max-[899px]:rounded-none",
5065
5342
  hasSlideMotion && "max-[899px]:data-[state=open]:animate-[olun-sheet-in-from-bottom_var(--sheet-motion-duration)_var(--sheet-motion-easing)_both] max-[899px]:data-[state=closed]:animate-[olun-sheet-out-to-bottom_var(--sheet-motion-duration)_var(--sheet-motion-easing)_both]"
5066
5343
  ),
5067
5344
  className
@@ -5070,9 +5347,9 @@ function SheetContent({
5070
5347
  ...props,
5071
5348
  children: [
5072
5349
  children,
5073
- showCloseButton && /* @__PURE__ */ 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: [
5074
- /* @__PURE__ */ jsx29(XIcon, { className: "size-[16px]" }),
5075
- /* @__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" })
5076
5353
  ] })
5077
5354
  ]
5078
5355
  }
@@ -5080,7 +5357,7 @@ function SheetContent({
5080
5357
  ] });
5081
5358
  }
5082
5359
  function SheetHeader({ className, ...props }) {
5083
- return /* @__PURE__ */ jsx29(
5360
+ return /* @__PURE__ */ jsx32(
5084
5361
  "div",
5085
5362
  {
5086
5363
  "data-slot": "sheet-header",
@@ -5090,7 +5367,7 @@ function SheetHeader({ className, ...props }) {
5090
5367
  );
5091
5368
  }
5092
5369
  function SheetFooter({ className, ...props }) {
5093
- return /* @__PURE__ */ jsx29(
5370
+ return /* @__PURE__ */ jsx32(
5094
5371
  "div",
5095
5372
  {
5096
5373
  "data-slot": "sheet-footer",
@@ -5103,7 +5380,7 @@ function SheetTitle({
5103
5380
  className,
5104
5381
  ...props
5105
5382
  }) {
5106
- return /* @__PURE__ */ jsx29(
5383
+ return /* @__PURE__ */ jsx32(
5107
5384
  SheetPrimitive.Title,
5108
5385
  {
5109
5386
  "data-slot": "sheet-title",
@@ -5116,7 +5393,7 @@ function SheetDescription({
5116
5393
  className,
5117
5394
  ...props
5118
5395
  }) {
5119
- return /* @__PURE__ */ jsx29(
5396
+ return /* @__PURE__ */ jsx32(
5120
5397
  SheetPrimitive.Description,
5121
5398
  {
5122
5399
  "data-slot": "sheet-description",
@@ -5128,7 +5405,7 @@ function SheetDescription({
5128
5405
 
5129
5406
  // src/components/ui/sheet-drawer.tsx
5130
5407
  import { Maximize2Icon, Minimize2Icon, XIcon as XIcon2 } from "lucide-react";
5131
- import { jsx as jsx30, jsxs as jsxs27 } from "react/jsx-runtime";
5408
+ import { jsx as jsx33, jsxs as jsxs30 } from "react/jsx-runtime";
5132
5409
  var sheetDrawerContentClassName = cn(
5133
5410
  "gap-0 p-0",
5134
5411
  "bg-[var(--bg-surface)] text-foreground",
@@ -5197,7 +5474,7 @@ function SheetDrawer({
5197
5474
  const resolvedWidth = expanded ? "full" : width;
5198
5475
  const resolvedExpandLabel = hasExpandedToggle && expanded ? collapseLabel : expandLabel;
5199
5476
  const ExpandActionIcon = hasExpandedToggle && expanded ? Minimize2Icon : Maximize2Icon;
5200
- return /* @__PURE__ */ jsx30(Sheet, { open, onOpenChange, children: /* @__PURE__ */ jsxs27(
5477
+ return /* @__PURE__ */ jsx33(Sheet, { open, onOpenChange, children: /* @__PURE__ */ jsxs30(
5201
5478
  SheetContent,
5202
5479
  {
5203
5480
  "data-slot": "sheet-drawer-content",
@@ -5211,11 +5488,11 @@ function SheetDrawer({
5211
5488
  resolvedWidth === "full" && sheetDrawerFullContentClassName
5212
5489
  ),
5213
5490
  children: [
5214
- /* @__PURE__ */ jsxs27("div", { "data-slot": "sheet-drawer-header", className: sheetDrawerHeaderClassName, children: [
5215
- /* @__PURE__ */ jsxs27("div", { className: sheetDrawerHeaderTextClassName, children: [
5216
- caption ? /* @__PURE__ */ jsx30("div", { "data-slot": "sheet-drawer-caption", className: sheetDrawerCaptionClassName, children: caption }) : null,
5217
- /* @__PURE__ */ jsx30(SheetTitle, { "data-slot": "sheet-drawer-title", className: sheetDrawerTitleClassName, children: title }),
5218
- 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(
5219
5496
  SheetDescription,
5220
5497
  {
5221
5498
  "data-slot": "sheet-drawer-description",
@@ -5224,8 +5501,8 @@ function SheetDrawer({
5224
5501
  }
5225
5502
  ) : null
5226
5503
  ] }),
5227
- /* @__PURE__ */ jsxs27("div", { "data-slot": "sheet-drawer-header-actions", className: sheetDrawerHeaderActionsClassName, children: [
5228
- showExpandAction ? hasExpandedToggle ? /* @__PURE__ */ jsxs27(
5504
+ /* @__PURE__ */ jsxs30("div", { "data-slot": "sheet-drawer-header-actions", className: sheetDrawerHeaderActionsClassName, children: [
5505
+ showExpandAction ? hasExpandedToggle ? /* @__PURE__ */ jsxs30(
5229
5506
  "button",
5230
5507
  {
5231
5508
  type: "button",
@@ -5236,11 +5513,11 @@ function SheetDrawer({
5236
5513
  className: sheetDrawerExpandButtonClassName,
5237
5514
  onClick: () => onExpandedChange(!expanded),
5238
5515
  children: [
5239
- /* @__PURE__ */ jsx30(ExpandActionIcon, { className: "size-[16px]" }),
5240
- /* @__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 })
5241
5518
  ]
5242
5519
  }
5243
- ) : expandHref ? /* @__PURE__ */ jsxs27(
5520
+ ) : expandHref ? /* @__PURE__ */ jsxs30(
5244
5521
  "a",
5245
5522
  {
5246
5523
  href: expandHref,
@@ -5248,11 +5525,11 @@ function SheetDrawer({
5248
5525
  "data-slot": "sheet-drawer-expand",
5249
5526
  className: sheetDrawerExpandButtonClassName,
5250
5527
  children: [
5251
- /* @__PURE__ */ jsx30(ExpandActionIcon, { className: "size-[16px]" }),
5252
- /* @__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 })
5253
5530
  ]
5254
5531
  }
5255
- ) : /* @__PURE__ */ jsxs27(
5532
+ ) : /* @__PURE__ */ jsxs30(
5256
5533
  "button",
5257
5534
  {
5258
5535
  type: "button",
@@ -5261,40 +5538,40 @@ function SheetDrawer({
5261
5538
  className: sheetDrawerExpandButtonClassName,
5262
5539
  onClick: onExpand,
5263
5540
  children: [
5264
- /* @__PURE__ */ jsx30(ExpandActionIcon, { className: "size-[16px]" }),
5265
- /* @__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 })
5266
5543
  ]
5267
5544
  }
5268
5545
  ) : null,
5269
- /* @__PURE__ */ jsx30(
5546
+ /* @__PURE__ */ jsx33(
5270
5547
  SheetClose,
5271
5548
  {
5272
5549
  "aria-label": closeLabel,
5273
5550
  "data-slot": "sheet-drawer-close",
5274
5551
  className: sheetDrawerCloseButtonClassName,
5275
- children: /* @__PURE__ */ jsx30(XIcon2, { className: "size-[16px]" })
5552
+ children: /* @__PURE__ */ jsx33(XIcon2, { className: "size-[16px]" })
5276
5553
  }
5277
5554
  )
5278
5555
  ] })
5279
5556
  ] }),
5280
- /* @__PURE__ */ jsx30("div", { "data-slot": "sheet-drawer-body", className: sheetDrawerBodyClassName, children }),
5281
- 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
5282
5559
  ]
5283
5560
  }
5284
5561
  ) });
5285
5562
  }
5286
5563
 
5287
5564
  // src/components/ui/popover.tsx
5288
- import * as React24 from "react";
5565
+ import * as React25 from "react";
5289
5566
  import { Popover as PopoverPrimitive } from "radix-ui";
5290
- import { jsx as jsx31, jsxs as jsxs28 } from "react/jsx-runtime";
5567
+ import { jsx as jsx34, jsxs as jsxs31 } from "react/jsx-runtime";
5291
5568
  function Popover({ modal = false, ...props }) {
5292
- return /* @__PURE__ */ jsx31(PopoverPrimitive.Root, { modal, ...props });
5569
+ return /* @__PURE__ */ jsx34(PopoverPrimitive.Root, { modal, ...props });
5293
5570
  }
5294
5571
  var PopoverTrigger = PopoverPrimitive.Trigger;
5295
5572
  var PopoverAnchor = PopoverPrimitive.Anchor;
5296
5573
  var PopoverClose = PopoverPrimitive.Close;
5297
- var PopoverContent = 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(
5298
5575
  PopoverPrimitive.Content,
5299
5576
  {
5300
5577
  ref,
@@ -5318,7 +5595,7 @@ var PopoverContent = React24.forwardRef(({ className, align = "center", sideOffs
5318
5595
  ...props,
5319
5596
  children: [
5320
5597
  children,
5321
- showArrow ? /* @__PURE__ */ jsx31(
5598
+ showArrow ? /* @__PURE__ */ jsx34(
5322
5599
  PopoverPrimitive.Arrow,
5323
5600
  {
5324
5601
  "data-slot": "popover-arrow",
@@ -5331,7 +5608,7 @@ var PopoverContent = React24.forwardRef(({ className, align = "center", sideOffs
5331
5608
  }
5332
5609
  ) }));
5333
5610
  PopoverContent.displayName = PopoverPrimitive.Content.displayName;
5334
- var PopoverArrow = React24.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx31(
5611
+ var PopoverArrow = React25.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx34(
5335
5612
  PopoverPrimitive.Arrow,
5336
5613
  {
5337
5614
  ref,
@@ -5345,10 +5622,10 @@ var PopoverArrow = React24.forwardRef(({ className, ...props }, ref) => /* @__PU
5345
5622
  PopoverArrow.displayName = PopoverPrimitive.Arrow.displayName;
5346
5623
 
5347
5624
  // src/components/ui/badge.tsx
5348
- import * as React25 from "react";
5349
- import { cva as cva12 } from "class-variance-authority";
5350
- import { jsx as jsx32, jsxs as jsxs29 } from "react/jsx-runtime";
5351
- 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(
5352
5629
  [
5353
5630
  "inline-flex w-fit shrink-0 items-center whitespace-nowrap",
5354
5631
  "rounded-[var(--radius-full)] border leading-none",
@@ -5407,10 +5684,10 @@ var badgeVariants = cva12(
5407
5684
  }
5408
5685
  }
5409
5686
  );
5410
- var badgeDotVariants = cva12(
5687
+ var badgeDotVariants = cva13(
5411
5688
  "size-[var(--space-0-5)] shrink-0 rounded-[var(--radius-full)] bg-current"
5412
5689
  );
5413
- var Badge = React25.forwardRef(
5690
+ var Badge = React26.forwardRef(
5414
5691
  ({
5415
5692
  className,
5416
5693
  variant = "neutral",
@@ -5422,7 +5699,7 @@ var Badge = React25.forwardRef(
5422
5699
  ...props
5423
5700
  }, ref) => {
5424
5701
  const resolvedShowDot = showDot ?? variant === "status";
5425
- return /* @__PURE__ */ jsxs29(
5702
+ return /* @__PURE__ */ jsxs32(
5426
5703
  "span",
5427
5704
  {
5428
5705
  ref,
@@ -5435,7 +5712,7 @@ var Badge = React25.forwardRef(
5435
5712
  className: cn(badgeVariants({ variant, tone, size, className })),
5436
5713
  ...props,
5437
5714
  children: [
5438
- resolvedShowDot ? /* @__PURE__ */ 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,
5439
5716
  children
5440
5717
  ]
5441
5718
  }
@@ -5445,10 +5722,10 @@ var Badge = React25.forwardRef(
5445
5722
  Badge.displayName = "Badge";
5446
5723
 
5447
5724
  // src/components/ui/two-tier-badge.tsx
5448
- import * as React26 from "react";
5449
- import { cva as cva13 } from "class-variance-authority";
5450
- import { jsx as jsx33, jsxs as jsxs30 } from "react/jsx-runtime";
5451
- 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(
5452
5729
  "inline-flex w-fit flex-col gap-[var(--space-0-5)]",
5453
5730
  {
5454
5731
  variants: {
@@ -5463,7 +5740,7 @@ var twoTierBadgeVariants = cva13(
5463
5740
  }
5464
5741
  }
5465
5742
  );
5466
- var twoTierBadgeLineVariants = cva13(
5743
+ var twoTierBadgeLineVariants = cva14(
5467
5744
  [
5468
5745
  "inline-flex w-fit shrink-0 items-center justify-center whitespace-nowrap",
5469
5746
  "rounded-[var(--radius-xs)] border leading-none",
@@ -5490,7 +5767,7 @@ var twoTierBadgeLineVariants = cva13(
5490
5767
  }
5491
5768
  }
5492
5769
  );
5493
- var TwoTierBadge = React26.forwardRef(
5770
+ var TwoTierBadge = React27.forwardRef(
5494
5771
  ({
5495
5772
  className,
5496
5773
  align,
@@ -5501,7 +5778,7 @@ var TwoTierBadge = React26.forwardRef(
5501
5778
  primaryClassName,
5502
5779
  secondaryClassName,
5503
5780
  ...props
5504
- }, ref) => /* @__PURE__ */ jsxs30(
5781
+ }, ref) => /* @__PURE__ */ jsxs33(
5505
5782
  "div",
5506
5783
  {
5507
5784
  ref,
@@ -5509,7 +5786,7 @@ var TwoTierBadge = React26.forwardRef(
5509
5786
  className: cn(twoTierBadgeVariants({ align, className })),
5510
5787
  ...props,
5511
5788
  children: [
5512
- /* @__PURE__ */ jsx33(
5789
+ /* @__PURE__ */ jsx36(
5513
5790
  "span",
5514
5791
  {
5515
5792
  "data-slot": "two-tier-badge-primary",
@@ -5523,7 +5800,7 @@ var TwoTierBadge = React26.forwardRef(
5523
5800
  children: primary
5524
5801
  }
5525
5802
  ),
5526
- secondary ? /* @__PURE__ */ jsx33(
5803
+ secondary ? /* @__PURE__ */ jsx36(
5527
5804
  "span",
5528
5805
  {
5529
5806
  "data-slot": "two-tier-badge-secondary",
@@ -5544,10 +5821,10 @@ var TwoTierBadge = React26.forwardRef(
5544
5821
  TwoTierBadge.displayName = "TwoTierBadge";
5545
5822
 
5546
5823
  // src/components/ui/status-badge.tsx
5547
- import * as React27 from "react";
5548
- import { cva as cva14 } from "class-variance-authority";
5549
- import { jsx as jsx34, jsxs as jsxs31 } from "react/jsx-runtime";
5550
- 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(
5551
5828
  [
5552
5829
  "inline-flex w-fit shrink-0 items-center whitespace-nowrap",
5553
5830
  "rounded-[var(--radius-full)] border leading-none",
@@ -5576,10 +5853,10 @@ var statusBadgeVariants = cva14(
5576
5853
  }
5577
5854
  }
5578
5855
  );
5579
- var statusBadgeDotVariants = cva14(
5856
+ var statusBadgeDotVariants = cva15(
5580
5857
  "size-[var(--space-0-5)] shrink-0 rounded-[var(--radius-full)] bg-current"
5581
5858
  );
5582
- var StatusBadge = React27.forwardRef(
5859
+ var StatusBadge = React28.forwardRef(
5583
5860
  ({
5584
5861
  className,
5585
5862
  status = "active",
@@ -5588,7 +5865,7 @@ var StatusBadge = React27.forwardRef(
5588
5865
  pulse = true,
5589
5866
  children,
5590
5867
  ...props
5591
- }, ref) => /* @__PURE__ */ jsxs31(
5868
+ }, ref) => /* @__PURE__ */ jsxs34(
5592
5869
  "span",
5593
5870
  {
5594
5871
  ref,
@@ -5597,7 +5874,7 @@ var StatusBadge = React27.forwardRef(
5597
5874
  className: cn(statusBadgeVariants({ status, size, className })),
5598
5875
  ...props,
5599
5876
  children: [
5600
- showDot ? /* @__PURE__ */ jsx34(
5877
+ showDot ? /* @__PURE__ */ jsx37(
5601
5878
  "span",
5602
5879
  {
5603
5880
  "aria-hidden": "true",
@@ -5617,10 +5894,10 @@ var StatusBadge = React27.forwardRef(
5617
5894
  StatusBadge.displayName = "StatusBadge";
5618
5895
 
5619
5896
  // src/components/ui/notification-badge.tsx
5620
- import * as React28 from "react";
5621
- import { cva as cva15 } from "class-variance-authority";
5622
- import { jsx as jsx35 } from "react/jsx-runtime";
5623
- 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(
5624
5901
  [
5625
5902
  "inline-flex shrink-0 items-center justify-center rounded-[var(--radius-full)]",
5626
5903
  "bg-[var(--semantic-error,var(--error))] text-[var(--error-contrast)]",
@@ -5650,7 +5927,7 @@ function formatNotificationCount(count, max) {
5650
5927
  }
5651
5928
  return String(count);
5652
5929
  }
5653
- var NotificationBadge = React28.forwardRef(
5930
+ var NotificationBadge = React29.forwardRef(
5654
5931
  ({
5655
5932
  className,
5656
5933
  count,
@@ -5665,7 +5942,7 @@ var NotificationBadge = React28.forwardRef(
5665
5942
  }
5666
5943
  const normalizedMax = Math.max(1, Math.floor(max));
5667
5944
  const label = ariaLabel ?? (count > normalizedMax ? `\uC77D\uC9C0 \uC54A\uC740 \uC54C\uB9BC ${normalizedMax}\uAC1C \uC774\uC0C1` : `\uC77D\uC9C0 \uC54A\uC740 \uC54C\uB9BC ${count}\uAC1C`);
5668
- return /* @__PURE__ */ jsx35(
5945
+ return /* @__PURE__ */ jsx38(
5669
5946
  "span",
5670
5947
  {
5671
5948
  ref,
@@ -5683,12 +5960,12 @@ var NotificationBadge = React28.forwardRef(
5683
5960
  NotificationBadge.displayName = "NotificationBadge";
5684
5961
 
5685
5962
  // src/components/ui/chip.tsx
5686
- import * as React29 from "react";
5687
- import { cva as cva16 } from "class-variance-authority";
5688
- 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";
5689
5966
  import { Slot as Slot2 } from "radix-ui";
5690
- import { jsx as jsx36, jsxs as jsxs32 } from "react/jsx-runtime";
5691
- var chipVariants = cva16(
5967
+ import { jsx as jsx39, jsxs as jsxs35 } from "react/jsx-runtime";
5968
+ var chipVariants = cva17(
5692
5969
  [
5693
5970
  "inline-flex w-fit shrink-0 items-center justify-center whitespace-nowrap",
5694
5971
  "rounded-[var(--radius-full)] border leading-none",
@@ -5751,7 +6028,7 @@ var chipVariants = cva16(
5751
6028
  }
5752
6029
  }
5753
6030
  );
5754
- var chipCountVariants = cva16(
6031
+ var chipCountVariants = cva17(
5755
6032
  [
5756
6033
  "inline-flex min-w-[var(--space-2)] items-center justify-center",
5757
6034
  "rounded-[var(--radius-full)] px-[var(--space-0-5)]",
@@ -5779,7 +6056,7 @@ var chipCountVariants = cva16(
5779
6056
  }
5780
6057
  }
5781
6058
  );
5782
- var Chip = React29.forwardRef(
6059
+ var Chip = React30.forwardRef(
5783
6060
  ({
5784
6061
  className,
5785
6062
  variant = "filter",
@@ -5794,7 +6071,7 @@ var Chip = React29.forwardRef(
5794
6071
  }, ref) => {
5795
6072
  const Comp = asChild ? Slot2.Root : "button";
5796
6073
  const removable = variant === "removable";
5797
- return /* @__PURE__ */ jsxs32(
6074
+ return /* @__PURE__ */ jsxs35(
5798
6075
  Comp,
5799
6076
  {
5800
6077
  ref,
@@ -5809,7 +6086,7 @@ var Chip = React29.forwardRef(
5809
6086
  ...props,
5810
6087
  children: [
5811
6088
  children,
5812
- count !== void 0 ? /* @__PURE__ */ jsx36(
6089
+ count !== void 0 ? /* @__PURE__ */ jsx39(
5813
6090
  "span",
5814
6091
  {
5815
6092
  "aria-hidden": "true",
@@ -5819,13 +6096,13 @@ var Chip = React29.forwardRef(
5819
6096
  children: count
5820
6097
  }
5821
6098
  ) : null,
5822
- removable ? /* @__PURE__ */ jsx36(
6099
+ removable ? /* @__PURE__ */ jsx39(
5823
6100
  "span",
5824
6101
  {
5825
6102
  "aria-label": removeLabel,
5826
6103
  "data-slot": "chip-remove",
5827
6104
  className: "inline-flex size-[var(--space-2)] items-center justify-center rounded-[var(--radius-full)] text-text-tertiary",
5828
- children: /* @__PURE__ */ jsx36(X3, { "aria-hidden": "true", size: 14, strokeWidth: 2.25 })
6105
+ children: /* @__PURE__ */ jsx39(X4, { "aria-hidden": "true", size: 14, strokeWidth: 2.25 })
5829
6106
  }
5830
6107
  ) : null
5831
6108
  ]
@@ -5836,10 +6113,10 @@ var Chip = React29.forwardRef(
5836
6113
  Chip.displayName = "Chip";
5837
6114
 
5838
6115
  // src/components/ui/empty-state.tsx
5839
- import * as React30 from "react";
5840
- import { cva as cva17 } from "class-variance-authority";
5841
- import { jsx as jsx37, jsxs as jsxs33 } from "react/jsx-runtime";
5842
- 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(
5843
6120
  [
5844
6121
  "flex flex-col items-center justify-center text-center",
5845
6122
  "rounded-[var(--radius-md)] border border-[var(--border-subtle)]",
@@ -5876,7 +6153,7 @@ function emptyStateVariants({ size, tone = "neutral", surface, className } = {})
5876
6153
  className
5877
6154
  );
5878
6155
  }
5879
- var emptyStateIconVariants = cva17(
6156
+ var emptyStateIconVariants = cva18(
5880
6157
  [
5881
6158
  "inline-flex items-center justify-center rounded-[var(--radius-full)]",
5882
6159
  "border border-[var(--border-subtle)] bg-[var(--bg-raised)] text-text-tertiary"
@@ -5894,12 +6171,12 @@ var emptyStateIconVariants = cva17(
5894
6171
  }
5895
6172
  }
5896
6173
  );
5897
- var iconSize2 = {
6174
+ var iconSize3 = {
5898
6175
  sm: 18,
5899
6176
  md: 20,
5900
6177
  lg: 24
5901
6178
  };
5902
- var EmptyState = React30.forwardRef(
6179
+ var EmptyState = React31.forwardRef(
5903
6180
  ({
5904
6181
  className,
5905
6182
  size = "md",
@@ -5913,7 +6190,7 @@ var EmptyState = React30.forwardRef(
5913
6190
  ...props
5914
6191
  }, ref) => {
5915
6192
  const resolvedSize = size ?? "md";
5916
- return /* @__PURE__ */ jsxs33(
6193
+ return /* @__PURE__ */ jsxs36(
5917
6194
  "div",
5918
6195
  {
5919
6196
  ref,
@@ -5922,17 +6199,17 @@ var EmptyState = React30.forwardRef(
5922
6199
  className: cn(emptyStateVariants({ size, tone, surface, className })),
5923
6200
  ...props,
5924
6201
  children: [
5925
- Icon ? /* @__PURE__ */ jsx37(
6202
+ Icon ? /* @__PURE__ */ jsx40(
5926
6203
  "span",
5927
6204
  {
5928
6205
  "aria-hidden": "true",
5929
6206
  "data-slot": "empty-state-icon",
5930
6207
  className: emptyStateIconVariants({ size: resolvedSize }),
5931
- children: /* @__PURE__ */ jsx37(Icon, { size: iconSize2[resolvedSize], strokeWidth: 1.75 })
6208
+ children: /* @__PURE__ */ jsx40(Icon, { size: iconSize3[resolvedSize], strokeWidth: 1.75 })
5932
6209
  }
5933
6210
  ) : null,
5934
- /* @__PURE__ */ jsxs33("div", { className: "flex max-w-[420px] flex-col items-center gap-[var(--space-1)]", children: [
5935
- /* @__PURE__ */ jsx37(
6211
+ /* @__PURE__ */ jsxs36("div", { className: "flex max-w-[420px] flex-col items-center gap-[var(--space-1)]", children: [
6212
+ /* @__PURE__ */ jsx40(
5936
6213
  "h2",
5937
6214
  {
5938
6215
  "data-slot": "empty-state-title",
@@ -5940,7 +6217,7 @@ var EmptyState = React30.forwardRef(
5940
6217
  children: title
5941
6218
  }
5942
6219
  ),
5943
- description ? /* @__PURE__ */ jsx37(
6220
+ description ? /* @__PURE__ */ jsx40(
5944
6221
  "p",
5945
6222
  {
5946
6223
  "data-slot": "empty-state-description",
@@ -5948,7 +6225,7 @@ var EmptyState = React30.forwardRef(
5948
6225
  children: description
5949
6226
  }
5950
6227
  ) : null,
5951
- hint ? /* @__PURE__ */ jsx37(
6228
+ hint ? /* @__PURE__ */ jsx40(
5952
6229
  "p",
5953
6230
  {
5954
6231
  "data-slot": "empty-state-hint",
@@ -5957,7 +6234,7 @@ var EmptyState = React30.forwardRef(
5957
6234
  }
5958
6235
  ) : null
5959
6236
  ] }),
5960
- action ? /* @__PURE__ */ 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
5961
6238
  ]
5962
6239
  }
5963
6240
  );
@@ -5966,11 +6243,11 @@ var EmptyState = React30.forwardRef(
5966
6243
  EmptyState.displayName = "EmptyState";
5967
6244
 
5968
6245
  // src/components/ui/error-state.tsx
5969
- import * as React31 from "react";
6246
+ import * as React32 from "react";
5970
6247
  import { AlertTriangle as AlertTriangle2 } from "lucide-react";
5971
- import { cva as cva18 } from "class-variance-authority";
5972
- import { jsx as jsx38, jsxs as jsxs34 } from "react/jsx-runtime";
5973
- 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(
5974
6251
  [
5975
6252
  "flex flex-col items-center justify-center text-center",
5976
6253
  "rounded-[var(--radius-md)] border border-[var(--border-subtle)]",
@@ -5991,7 +6268,7 @@ var errorStateVariants = cva18(
5991
6268
  }
5992
6269
  }
5993
6270
  );
5994
- var ErrorState = React31.forwardRef(
6271
+ var ErrorState = React32.forwardRef(
5995
6272
  ({
5996
6273
  className,
5997
6274
  size = "md",
@@ -6002,7 +6279,7 @@ var ErrorState = React31.forwardRef(
6002
6279
  onRetry,
6003
6280
  retryLabel = "\uB2E4\uC2DC \uC2DC\uB3C4",
6004
6281
  ...props
6005
- }, ref) => /* @__PURE__ */ jsxs34(
6282
+ }, ref) => /* @__PURE__ */ jsxs37(
6006
6283
  "div",
6007
6284
  {
6008
6285
  ref,
@@ -6011,17 +6288,17 @@ var ErrorState = React31.forwardRef(
6011
6288
  className: cn(errorStateVariants({ size, surface, className })),
6012
6289
  ...props,
6013
6290
  children: [
6014
- /* @__PURE__ */ jsx38(
6291
+ /* @__PURE__ */ jsx41(
6015
6292
  "span",
6016
6293
  {
6017
6294
  "aria-hidden": "true",
6018
6295
  "data-slot": "error-state-icon",
6019
6296
  className: "inline-flex size-[48px] items-center justify-center rounded-[var(--radius-full)] bg-[var(--error-bg)] text-[var(--error)]",
6020
- children: /* @__PURE__ */ jsx38(AlertTriangle2, { size: 24, strokeWidth: 1.75 })
6297
+ children: /* @__PURE__ */ jsx41(AlertTriangle2, { size: 24, strokeWidth: 1.75 })
6021
6298
  }
6022
6299
  ),
6023
- /* @__PURE__ */ jsxs34("div", { className: "flex max-w-[420px] flex-col items-center gap-[var(--space-1)]", children: [
6024
- /* @__PURE__ */ jsx38(
6300
+ /* @__PURE__ */ jsxs37("div", { className: "flex max-w-[420px] flex-col items-center gap-[var(--space-1)]", children: [
6301
+ /* @__PURE__ */ jsx41(
6025
6302
  "h2",
6026
6303
  {
6027
6304
  "data-slot": "error-state-title",
@@ -6029,7 +6306,7 @@ var ErrorState = React31.forwardRef(
6029
6306
  children: title
6030
6307
  }
6031
6308
  ),
6032
- /* @__PURE__ */ jsx38(
6309
+ /* @__PURE__ */ jsx41(
6033
6310
  "p",
6034
6311
  {
6035
6312
  "data-slot": "error-state-message",
@@ -6037,7 +6314,7 @@ var ErrorState = React31.forwardRef(
6037
6314
  children: message
6038
6315
  }
6039
6316
  ),
6040
- errorCode ? /* @__PURE__ */ jsx38(
6317
+ errorCode ? /* @__PURE__ */ jsx41(
6041
6318
  "p",
6042
6319
  {
6043
6320
  "data-slot": "error-state-code",
@@ -6046,7 +6323,7 @@ var ErrorState = React31.forwardRef(
6046
6323
  }
6047
6324
  ) : null
6048
6325
  ] }),
6049
- onRetry ? /* @__PURE__ */ 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
6050
6327
  ]
6051
6328
  }
6052
6329
  )
@@ -6054,10 +6331,10 @@ var ErrorState = React31.forwardRef(
6054
6331
  ErrorState.displayName = "ErrorState";
6055
6332
 
6056
6333
  // src/components/ui/skeleton.tsx
6057
- import * as React32 from "react";
6058
- import { cva as cva19 } from "class-variance-authority";
6059
- import { jsx as jsx39 } from "react/jsx-runtime";
6060
- 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(
6061
6338
  [
6062
6339
  "animate-pulse rounded-[var(--radius-sm)] bg-[var(--bg-raised)]",
6063
6340
  "motion-reduce:animate-none motion-reduce:opacity-80"
@@ -6075,7 +6352,7 @@ var skeletonVariants = cva19(
6075
6352
  }
6076
6353
  }
6077
6354
  );
6078
- var spinnerVariants = cva19(
6355
+ var spinnerVariants = cva20(
6079
6356
  [
6080
6357
  "inline-block shrink-0 animate-spin rounded-[var(--radius-full)] border-2",
6081
6358
  "border-[var(--border-subtle)] border-t-[var(--accent-solid)]",
@@ -6098,8 +6375,8 @@ var spinnerVariants = cva19(
6098
6375
  }
6099
6376
  }
6100
6377
  );
6101
- var Skeleton = React32.forwardRef(
6102
- ({ className, shape, style, ...props }, ref) => /* @__PURE__ */ jsx39(
6378
+ var Skeleton = React33.forwardRef(
6379
+ ({ className, shape, style, ...props }, ref) => /* @__PURE__ */ jsx42(
6103
6380
  "div",
6104
6381
  {
6105
6382
  ref,
@@ -6112,15 +6389,15 @@ var Skeleton = React32.forwardRef(
6112
6389
  );
6113
6390
  Skeleton.displayName = "Skeleton";
6114
6391
  var defaultTextWidths = ["92%", "84%", "68%", "76%"];
6115
- var SkeletonText = React32.forwardRef(
6116
- ({ className, lines = 3, widths = defaultTextWidths, ...props }, ref) => /* @__PURE__ */ jsx39(
6392
+ var SkeletonText = React33.forwardRef(
6393
+ ({ className, lines = 3, widths = defaultTextWidths, ...props }, ref) => /* @__PURE__ */ jsx42(
6117
6394
  "div",
6118
6395
  {
6119
6396
  ref,
6120
6397
  "data-slot": "skeleton-text",
6121
6398
  className: cn("flex flex-col gap-[var(--space-1)]", className),
6122
6399
  ...props,
6123
- children: Array.from({ length: lines }, (_, index) => /* @__PURE__ */ jsx39(
6400
+ children: Array.from({ length: lines }, (_, index) => /* @__PURE__ */ jsx42(
6124
6401
  Skeleton,
6125
6402
  {
6126
6403
  shape: "text",
@@ -6132,7 +6409,7 @@ var SkeletonText = React32.forwardRef(
6132
6409
  )
6133
6410
  );
6134
6411
  SkeletonText.displayName = "SkeletonText";
6135
- var SkeletonRow = React32.forwardRef(
6412
+ var SkeletonRow = React33.forwardRef(
6136
6413
  ({
6137
6414
  className,
6138
6415
  columns,
@@ -6143,7 +6420,7 @@ var SkeletonRow = React32.forwardRef(
6143
6420
  }, ref) => {
6144
6421
  const rowCount = Math.max(5, count);
6145
6422
  const gridTemplateColumns = columns.map((column) => column.width ?? "1fr").join(" ");
6146
- return /* @__PURE__ */ jsx39(
6423
+ return /* @__PURE__ */ jsx42(
6147
6424
  "div",
6148
6425
  {
6149
6426
  ref,
@@ -6157,7 +6434,7 @@ var SkeletonRow = React32.forwardRef(
6157
6434
  className
6158
6435
  ),
6159
6436
  ...props,
6160
- children: Array.from({ length: rowCount }, (_, rowIndex) => /* @__PURE__ */ jsx39(
6437
+ children: Array.from({ length: rowCount }, (_, rowIndex) => /* @__PURE__ */ jsx42(
6161
6438
  "div",
6162
6439
  {
6163
6440
  "data-slot": "skeleton-row",
@@ -6165,11 +6442,11 @@ var SkeletonRow = React32.forwardRef(
6165
6442
  "grid min-h-[48px] items-center border-t border-[var(--border-subtle)] first:border-t-0"
6166
6443
  ),
6167
6444
  style: { gridTemplateColumns },
6168
- children: columns.map((column, columnIndex) => /* @__PURE__ */ jsx39(
6445
+ children: columns.map((column, columnIndex) => /* @__PURE__ */ jsx42(
6169
6446
  "div",
6170
6447
  {
6171
6448
  className: "px-[var(--space-2)] py-[var(--space-1)]",
6172
- children: /* @__PURE__ */ jsx39(
6449
+ children: /* @__PURE__ */ jsx42(
6173
6450
  Skeleton,
6174
6451
  {
6175
6452
  shape: "text",
@@ -6189,8 +6466,8 @@ var SkeletonRow = React32.forwardRef(
6189
6466
  }
6190
6467
  );
6191
6468
  SkeletonRow.displayName = "SkeletonRow";
6192
- var Spinner = React32.forwardRef(
6193
- ({ 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(
6194
6471
  "span",
6195
6472
  {
6196
6473
  ref,
@@ -6204,155 +6481,11 @@ var Spinner = React32.forwardRef(
6204
6481
  );
6205
6482
  Spinner.displayName = "Spinner";
6206
6483
 
6207
- // src/components/ui/icon-button.tsx
6208
- import * as React33 from "react";
6209
- import { cva as cva20 } from "class-variance-authority";
6210
- import { jsx as jsx40, jsxs as jsxs35 } from "react/jsx-runtime";
6211
- var iconButtonVariants = cva20(
6212
- [
6213
- "olun-icon-button relative inline-flex cursor-pointer shrink-0 items-center justify-center",
6214
- "rounded-[var(--radius-sm)] border font-medium",
6215
- "transition-colors motion-reduce:transition-none",
6216
- "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--focus-ring)]",
6217
- "disabled:cursor-not-allowed disabled:bg-[var(--action-disabled-bg)] disabled:text-text-disabled",
6218
- "[&_svg]:pointer-events-none [&_svg]:shrink-0"
6219
- ].join(" "),
6220
- {
6221
- variants: {
6222
- variant: {
6223
- ghost: "border-transparent bg-transparent text-text-secondary hover:bg-[var(--action-hover)] hover:text-foreground",
6224
- outline: "border-[var(--border-subtle)] bg-[var(--bg-surface)] text-text-secondary hover:border-[var(--border-accent)] hover:bg-[var(--action-hover)] hover:text-foreground",
6225
- subtle: "border-transparent bg-[var(--bg-raised)] text-text-secondary hover:bg-[var(--action-hover)] hover:text-foreground",
6226
- danger: "border-transparent bg-[var(--error-bg)] text-[var(--error)] hover:bg-[var(--action-hover)]"
6227
- },
6228
- size: {
6229
- sm: "size-[var(--space-4)]",
6230
- md: "size-[var(--touch-target-min)]",
6231
- lg: "size-[var(--space-6)]"
6232
- },
6233
- pressed: {
6234
- true: "",
6235
- false: ""
6236
- }
6237
- },
6238
- compoundVariants: [
6239
- {
6240
- pressed: true,
6241
- variant: ["ghost", "outline", "subtle"],
6242
- className: "border-[var(--border-accent)] bg-[var(--action-selected)] text-foreground"
6243
- },
6244
- {
6245
- pressed: true,
6246
- variant: "danger",
6247
- className: "border-[var(--error)] bg-[var(--error-bg)] text-[var(--error)]"
6248
- }
6249
- ],
6250
- defaultVariants: {
6251
- variant: "ghost",
6252
- size: "md",
6253
- pressed: false
6254
- }
6255
- }
6256
- );
6257
- var iconButtonBadgeVariants = cva20(
6258
- [
6259
- "pointer-events-none absolute right-0 top-0 inline-flex",
6260
- "olun-icon-button__badge",
6261
- "min-h-[var(--space-1-5)] min-w-[var(--space-1-5)] translate-x-1/3 -translate-y-1/3",
6262
- "items-center justify-center gap-[2px] rounded-[var(--radius-full)] px-[3px]",
6263
- "font-[family-name:var(--font-display)] text-[10px] font-semibold leading-none",
6264
- "[&:has(svg)]:size-[var(--space-1-5)] [&:has(svg)]:px-0 [&_svg]:size-[10px]"
6265
- ].join(" "),
6266
- {
6267
- variants: {
6268
- tone: {
6269
- info: "bg-[var(--accent-solid)] text-[var(--accent-on-solid)]",
6270
- error: "bg-[var(--error)] text-[var(--error-contrast)]"
6271
- }
6272
- },
6273
- defaultVariants: {
6274
- tone: "info"
6275
- }
6276
- }
6277
- );
6278
- var iconSize3 = {
6279
- sm: 14,
6280
- md: 16,
6281
- lg: 18
6282
- };
6283
- var iconStrokeWidth = {
6284
- sm: 2.25,
6285
- md: 2.25,
6286
- lg: 1.75
6287
- };
6288
- var IconButton = React33.forwardRef(
6289
- ({
6290
- className,
6291
- variant = "ghost",
6292
- size = "md",
6293
- pressed = false,
6294
- icon: Icon,
6295
- badge,
6296
- badgeTone = "info",
6297
- type,
6298
- title,
6299
- "aria-label": ariaLabel,
6300
- "aria-labelledby": ariaLabelledBy,
6301
- ...props
6302
- }, ref) => {
6303
- const resolvedSize = size ?? "md";
6304
- const isToggle = pressed !== void 0;
6305
- const isPressed = pressed === true;
6306
- const hoverTitle = title ?? (typeof ariaLabel === "string" ? ariaLabel : void 0);
6307
- return /* @__PURE__ */ jsxs35(
6308
- "button",
6309
- {
6310
- ref,
6311
- ...props,
6312
- "data-slot": "icon-button",
6313
- "data-variant": variant,
6314
- "data-size": resolvedSize,
6315
- "data-pressed": isToggle ? String(isPressed) : void 0,
6316
- "aria-label": ariaLabel,
6317
- "aria-labelledby": ariaLabelledBy,
6318
- "aria-pressed": isToggle ? isPressed : void 0,
6319
- title: hoverTitle,
6320
- className: cn(
6321
- iconButtonVariants({ variant, size, pressed: isPressed, className })
6322
- ),
6323
- type: type ?? "button",
6324
- children: [
6325
- /* @__PURE__ */ jsx40(
6326
- Icon,
6327
- {
6328
- "aria-hidden": "true",
6329
- "data-slot": "icon-button-icon",
6330
- size: iconSize3[resolvedSize],
6331
- strokeWidth: iconStrokeWidth[resolvedSize]
6332
- }
6333
- ),
6334
- badge !== void 0 ? /* @__PURE__ */ jsx40(
6335
- "span",
6336
- {
6337
- "aria-hidden": "true",
6338
- "data-slot": "icon-button-badge",
6339
- "data-badge-tone": badgeTone,
6340
- className: iconButtonBadgeVariants({ tone: badgeTone }),
6341
- children: badge
6342
- }
6343
- ) : null
6344
- ]
6345
- }
6346
- );
6347
- }
6348
- );
6349
- IconButton.displayName = "IconButton";
6350
-
6351
6484
  // src/components/ui/pagination.tsx
6352
6485
  import * as React34 from "react";
6353
6486
  import { ChevronsLeft, ChevronLeft, ChevronRight, ChevronsRight } from "lucide-react";
6354
6487
  import { cva as cva21 } from "class-variance-authority";
6355
- import { jsx as jsx41, jsxs as jsxs36 } from "react/jsx-runtime";
6488
+ import { jsx as jsx43, jsxs as jsxs38 } from "react/jsx-runtime";
6356
6489
  var paginationVariants = cva21(
6357
6490
  [
6358
6491
  "flex w-full flex-col gap-[var(--space-1-5)]",
@@ -6427,7 +6560,7 @@ function NavigationButton({
6427
6560
  icon: Icon,
6428
6561
  onPageChange
6429
6562
  }) {
6430
- return /* @__PURE__ */ jsx41(
6563
+ return /* @__PURE__ */ jsx43(
6431
6564
  "button",
6432
6565
  {
6433
6566
  "aria-label": label,
@@ -6435,7 +6568,7 @@ function NavigationButton({
6435
6568
  className: paginationControlVariants({ size }),
6436
6569
  type: "button",
6437
6570
  onClick: () => onPageChange?.(page),
6438
- children: /* @__PURE__ */ jsx41(Icon, { "aria-hidden": "true", "data-slot": "pagination-icon" })
6571
+ children: /* @__PURE__ */ jsx43(Icon, { "aria-hidden": "true", "data-slot": "pagination-icon" })
6439
6572
  }
6440
6573
  );
6441
6574
  }
@@ -6467,7 +6600,7 @@ var Pagination = React34.forwardRef(
6467
6600
  value: String(option),
6468
6601
  label: option
6469
6602
  }));
6470
- return /* @__PURE__ */ jsxs36(
6603
+ return /* @__PURE__ */ jsxs38(
6471
6604
  "nav",
6472
6605
  {
6473
6606
  ref,
@@ -6477,16 +6610,16 @@ var Pagination = React34.forwardRef(
6477
6610
  className: cn(paginationVariants({ size: resolvedSize, className })),
6478
6611
  ...props,
6479
6612
  children: [
6480
- /* @__PURE__ */ jsxs36("div", { className: "flex flex-wrap items-center gap-[var(--space-1-5)]", children: [
6481
- /* @__PURE__ */ jsx41("span", { "data-slot": "pagination-total", className: "font-medium text-text-secondary", children: totalLabel(total) }),
6482
- /* @__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(
6483
6616
  "div",
6484
6617
  {
6485
6618
  "data-slot": "pagination-size",
6486
6619
  className: "inline-flex items-center gap-[var(--space-1)] text-xs text-text-tertiary",
6487
6620
  children: [
6488
- /* @__PURE__ */ jsx41("span", { children: pageSizeLabel }),
6489
- /* @__PURE__ */ jsx41(
6621
+ /* @__PURE__ */ jsx43("span", { children: pageSizeLabel }),
6622
+ /* @__PURE__ */ jsx43(
6490
6623
  Select,
6491
6624
  {
6492
6625
  "aria-label": pageSizeLabel,
@@ -6502,13 +6635,13 @@ var Pagination = React34.forwardRef(
6502
6635
  }
6503
6636
  )
6504
6637
  ] }),
6505
- /* @__PURE__ */ jsxs36(
6638
+ /* @__PURE__ */ jsxs38(
6506
6639
  "div",
6507
6640
  {
6508
6641
  "data-slot": "pagination-list",
6509
6642
  className: "flex items-center justify-center gap-[var(--space-0-5)]",
6510
6643
  children: [
6511
- /* @__PURE__ */ jsx41(
6644
+ /* @__PURE__ */ jsx43(
6512
6645
  NavigationButton,
6513
6646
  {
6514
6647
  label: "\uCCAB \uD398\uC774\uC9C0",
@@ -6519,7 +6652,7 @@ var Pagination = React34.forwardRef(
6519
6652
  onPageChange
6520
6653
  }
6521
6654
  ),
6522
- /* @__PURE__ */ jsx41(
6655
+ /* @__PURE__ */ jsx43(
6523
6656
  NavigationButton,
6524
6657
  {
6525
6658
  label: "\uC774\uC804 \uD398\uC774\uC9C0",
@@ -6531,7 +6664,7 @@ var Pagination = React34.forwardRef(
6531
6664
  }
6532
6665
  ),
6533
6666
  items.map(
6534
- (item, index) => item === "ellipsis" ? /* @__PURE__ */ jsx41(
6667
+ (item, index) => item === "ellipsis" ? /* @__PURE__ */ jsx43(
6535
6668
  "span",
6536
6669
  {
6537
6670
  "data-slot": "pagination-ellipsis",
@@ -6543,7 +6676,7 @@ var Pagination = React34.forwardRef(
6543
6676
  children: "..."
6544
6677
  },
6545
6678
  `ellipsis-${index}`
6546
- ) : /* @__PURE__ */ jsx41(
6679
+ ) : /* @__PURE__ */ jsx43(
6547
6680
  "button",
6548
6681
  {
6549
6682
  "aria-label": `${item} \uD398\uC774\uC9C0`,
@@ -6557,7 +6690,7 @@ var Pagination = React34.forwardRef(
6557
6690
  item
6558
6691
  )
6559
6692
  ),
6560
- /* @__PURE__ */ jsx41(
6693
+ /* @__PURE__ */ jsx43(
6561
6694
  NavigationButton,
6562
6695
  {
6563
6696
  label: "\uB2E4\uC74C \uD398\uC774\uC9C0",
@@ -6568,7 +6701,7 @@ var Pagination = React34.forwardRef(
6568
6701
  onPageChange
6569
6702
  }
6570
6703
  ),
6571
- /* @__PURE__ */ jsx41(
6704
+ /* @__PURE__ */ jsx43(
6572
6705
  NavigationButton,
6573
6706
  {
6574
6707
  label: "\uB9C8\uC9C0\uB9C9 \uD398\uC774\uC9C0",
@@ -6591,7 +6724,7 @@ Pagination.displayName = "Pagination";
6591
6724
 
6592
6725
  // src/components/ui/mode-toggle.tsx
6593
6726
  import { cva as cva22 } from "class-variance-authority";
6594
- import { jsx as jsx42, jsxs as jsxs37 } from "react/jsx-runtime";
6727
+ import { jsx as jsx44, jsxs as jsxs39 } from "react/jsx-runtime";
6595
6728
  var modeToggleVariants = cva22(
6596
6729
  [
6597
6730
  "inline-flex items-center rounded-[var(--radius-sm)] border border-[var(--border-subtle)]",
@@ -6621,7 +6754,7 @@ function ModeToggle({
6621
6754
  onChange,
6622
6755
  ...props
6623
6756
  }) {
6624
- return /* @__PURE__ */ jsx42(
6757
+ return /* @__PURE__ */ jsx44(
6625
6758
  "div",
6626
6759
  {
6627
6760
  role: "group",
@@ -6631,7 +6764,7 @@ function ModeToggle({
6631
6764
  children: options.map((option) => {
6632
6765
  const Icon = option.icon;
6633
6766
  const isActive = option.value === value;
6634
- return /* @__PURE__ */ jsxs37(
6767
+ return /* @__PURE__ */ jsxs39(
6635
6768
  "button",
6636
6769
  {
6637
6770
  type: "button",
@@ -6647,8 +6780,8 @@ function ModeToggle({
6647
6780
  }
6648
6781
  },
6649
6782
  children: [
6650
- Icon ? /* @__PURE__ */ jsx42(Icon, { "aria-hidden": "true", "data-slot": "mode-toggle-icon" }) : null,
6651
- /* @__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 })
6652
6785
  ]
6653
6786
  },
6654
6787
  option.value
@@ -6661,7 +6794,7 @@ function ModeToggle({
6661
6794
  // src/components/ui/action-footer.tsx
6662
6795
  import * as React35 from "react";
6663
6796
  import { cva as cva23 } from "class-variance-authority";
6664
- import { jsx as jsx43, jsxs as jsxs38 } from "react/jsx-runtime";
6797
+ import { jsx as jsx45, jsxs as jsxs40 } from "react/jsx-runtime";
6665
6798
  var actionFooterVariants = cva23(
6666
6799
  [
6667
6800
  "flex flex-wrap items-center gap-[var(--space-2)] border-t border-[var(--border-subtle)]",
@@ -6732,7 +6865,7 @@ function getStatusLabel(status) {
6732
6865
  }
6733
6866
  }
6734
6867
  function renderAction(action) {
6735
- return /* @__PURE__ */ jsx43(
6868
+ return /* @__PURE__ */ jsx45(
6736
6869
  Button,
6737
6870
  {
6738
6871
  variant: action.variant,
@@ -6763,7 +6896,7 @@ var ActionFooter = React35.forwardRef(
6763
6896
  const mainActions = sortMainActions(
6764
6897
  visibleActions.filter((action) => !destructiveVariants.has(action.variant ?? "default"))
6765
6898
  );
6766
- return /* @__PURE__ */ jsxs38(
6899
+ return /* @__PURE__ */ jsxs40(
6767
6900
  "div",
6768
6901
  {
6769
6902
  ref,
@@ -6772,7 +6905,7 @@ var ActionFooter = React35.forwardRef(
6772
6905
  className: cn(actionFooterVariants({ position, surface, className })),
6773
6906
  ...props,
6774
6907
  children: [
6775
- destructiveActions.length > 0 ? /* @__PURE__ */ jsx43(
6908
+ destructiveActions.length > 0 ? /* @__PURE__ */ jsx45(
6776
6909
  "div",
6777
6910
  {
6778
6911
  "data-slot": "action-footer-destructive-actions",
@@ -6780,7 +6913,7 @@ var ActionFooter = React35.forwardRef(
6780
6913
  children: destructiveActions.map(renderAction)
6781
6914
  }
6782
6915
  ) : null,
6783
- status ? /* @__PURE__ */ jsxs38(
6916
+ status ? /* @__PURE__ */ jsxs40(
6784
6917
  "div",
6785
6918
  {
6786
6919
  "data-slot": "action-footer-status",
@@ -6788,7 +6921,7 @@ var ActionFooter = React35.forwardRef(
6788
6921
  "aria-live": "polite",
6789
6922
  className: cn(actionFooterStatusVariants({ kind: status.kind })),
6790
6923
  children: [
6791
- /* @__PURE__ */ jsx43(
6924
+ /* @__PURE__ */ jsx45(
6792
6925
  "span",
6793
6926
  {
6794
6927
  "aria-hidden": "true",
@@ -6796,11 +6929,11 @@ var ActionFooter = React35.forwardRef(
6796
6929
  className: "size-[6px] shrink-0 rounded-[var(--radius-full)]"
6797
6930
  }
6798
6931
  ),
6799
- /* @__PURE__ */ jsx43("span", { className: "truncate", children: getStatusLabel(status) })
6932
+ /* @__PURE__ */ jsx45("span", { className: "truncate", children: getStatusLabel(status) })
6800
6933
  ]
6801
6934
  }
6802
6935
  ) : null,
6803
- /* @__PURE__ */ jsx43(
6936
+ /* @__PURE__ */ jsx45(
6804
6937
  "div",
6805
6938
  {
6806
6939
  "data-slot": "action-footer-main-actions",
@@ -6817,9 +6950,9 @@ ActionFooter.displayName = "ActionFooter";
6817
6950
 
6818
6951
  // src/components/ui/toast.tsx
6819
6952
  import * as React36 from "react";
6820
- import { AlertCircle as AlertCircle5, AlertTriangle as AlertTriangle3, CheckCircle2 as CheckCircle25, Info as Info2, X as X4 } from "lucide-react";
6953
+ import { AlertCircle as AlertCircle5, AlertTriangle as AlertTriangle3, CheckCircle2 as CheckCircle25, Info as Info2, X as X5 } from "lucide-react";
6821
6954
  import { cva as cva24 } from "class-variance-authority";
6822
- import { jsx as jsx44, jsxs as jsxs39 } from "react/jsx-runtime";
6955
+ import { jsx as jsx46, jsxs as jsxs41 } from "react/jsx-runtime";
6823
6956
  var toastVariants = cva24(
6824
6957
  [
6825
6958
  "grid min-w-[280px] max-w-[420px] grid-cols-[auto_1fr_auto] items-center",
@@ -6918,7 +7051,7 @@ var ToastRoot = React36.forwardRef(
6918
7051
  }, ref) => {
6919
7052
  const Icon = toastIcons[variant];
6920
7053
  const hasIcon = Icon !== null;
6921
- return /* @__PURE__ */ jsxs39(
7054
+ return /* @__PURE__ */ jsxs41(
6922
7055
  "div",
6923
7056
  {
6924
7057
  ref,
@@ -6934,7 +7067,7 @@ var ToastRoot = React36.forwardRef(
6934
7067
  ),
6935
7068
  ...props,
6936
7069
  children: [
6937
- Icon ? /* @__PURE__ */ jsx44(
7070
+ Icon ? /* @__PURE__ */ jsx46(
6938
7071
  Icon,
6939
7072
  {
6940
7073
  "aria-hidden": "true",
@@ -6944,9 +7077,9 @@ var ToastRoot = React36.forwardRef(
6944
7077
  className: "shrink-0"
6945
7078
  }
6946
7079
  ) : null,
6947
- /* @__PURE__ */ jsxs39("div", { "data-slot": "toast-body", className: "min-w-0", children: [
6948
- /* @__PURE__ */ jsx44("div", { "data-slot": "toast-message", className: "font-normal", children: message }),
6949
- 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(
6950
7083
  Button,
6951
7084
  {
6952
7085
  "data-slot": "toast-action",
@@ -6958,7 +7091,7 @@ var ToastRoot = React36.forwardRef(
6958
7091
  }
6959
7092
  ) : null
6960
7093
  ] }),
6961
- /* @__PURE__ */ jsx44(
7094
+ /* @__PURE__ */ jsx46(
6962
7095
  "button",
6963
7096
  {
6964
7097
  type: "button",
@@ -6970,7 +7103,7 @@ var ToastRoot = React36.forwardRef(
6970
7103
  "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--focus-ring)]"
6971
7104
  ),
6972
7105
  onClick: onClose,
6973
- children: /* @__PURE__ */ jsx44(X4, { "aria-hidden": "true", size: 16, strokeWidth: 1.75 })
7106
+ children: /* @__PURE__ */ jsx46(X5, { "aria-hidden": "true", size: 16, strokeWidth: 1.75 })
6974
7107
  }
6975
7108
  )
6976
7109
  ]
@@ -6979,7 +7112,7 @@ var ToastRoot = React36.forwardRef(
6979
7112
  }
6980
7113
  );
6981
7114
  ToastRoot.displayName = "ToastRoot";
6982
- var ToastViewport = React36.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx44(
7115
+ var ToastViewport = React36.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx46(
6983
7116
  "ol",
6984
7117
  {
6985
7118
  ref,
@@ -6997,9 +7130,9 @@ function ToastProvider({ children, maxToasts = 3, className, ...props }) {
6997
7130
  }),
6998
7131
  [maxToasts]
6999
7132
  );
7000
- return /* @__PURE__ */ jsxs39("div", { "data-slot": "toast-provider", className, ...props, children: [
7133
+ return /* @__PURE__ */ jsxs41("div", { "data-slot": "toast-provider", className, ...props, children: [
7001
7134
  children,
7002
- /* @__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)) })
7003
7136
  ] });
7004
7137
  }
7005
7138
 
@@ -7007,7 +7140,7 @@ function ToastProvider({ children, maxToasts = 3, className, ...props }) {
7007
7140
  import * as React37 from "react";
7008
7141
  import { cva as cva25 } from "class-variance-authority";
7009
7142
  import { AlertCircle as AlertCircle6 } from "lucide-react";
7010
- import { Fragment as Fragment8, jsx as jsx45, jsxs as jsxs40 } from "react/jsx-runtime";
7143
+ import { Fragment as Fragment8, jsx as jsx47, jsxs as jsxs42 } from "react/jsx-runtime";
7011
7144
  var otpFieldVariants = cva25("flex w-full flex-col gap-[var(--space-1-5)]", {
7012
7145
  variants: {
7013
7146
  size: {
@@ -7159,7 +7292,7 @@ var OTPField = React37.forwardRef(
7159
7292
  },
7160
7293
  [disabled, isControlled, length, onComplete, onValueChange]
7161
7294
  );
7162
- return /* @__PURE__ */ jsxs40(
7295
+ return /* @__PURE__ */ jsxs42(
7163
7296
  "fieldset",
7164
7297
  {
7165
7298
  ref,
@@ -7172,7 +7305,7 @@ var OTPField = React37.forwardRef(
7172
7305
  className: cn(otpFieldVariants({ size, className })),
7173
7306
  ...props,
7174
7307
  children: [
7175
- /* @__PURE__ */ jsx45(
7308
+ /* @__PURE__ */ jsx47(
7176
7309
  "legend",
7177
7310
  {
7178
7311
  id: labelId,
@@ -7181,7 +7314,7 @@ var OTPField = React37.forwardRef(
7181
7314
  children: label
7182
7315
  }
7183
7316
  ),
7184
- /* @__PURE__ */ jsx45(
7317
+ /* @__PURE__ */ jsx47(
7185
7318
  "div",
7186
7319
  {
7187
7320
  "data-slot": "otp-field-group",
@@ -7191,7 +7324,7 @@ var OTPField = React37.forwardRef(
7191
7324
  children: Array.from({ length }, (_, index) => {
7192
7325
  const digit = resolvedSlots[index] ?? "";
7193
7326
  const inputId = `${fieldId}-cell-${index + 1}`;
7194
- return /* @__PURE__ */ jsx45(
7327
+ return /* @__PURE__ */ jsx47(
7195
7328
  "input",
7196
7329
  {
7197
7330
  ref: (node) => {
@@ -7286,15 +7419,15 @@ var OTPField = React37.forwardRef(
7286
7419
  })
7287
7420
  }
7288
7421
  ),
7289
- helperText || errorText ? /* @__PURE__ */ jsx45(
7422
+ helperText || errorText ? /* @__PURE__ */ jsx47(
7290
7423
  "p",
7291
7424
  {
7292
7425
  id: errorText ? errorId : helperId,
7293
7426
  "data-slot": "otp-field-message",
7294
7427
  "data-kind": errorText ? "error" : "helper",
7295
7428
  className: otpFieldMessageVariants({ state: resolvedState }),
7296
- children: errorText ? /* @__PURE__ */ jsxs40(Fragment8, { children: [
7297
- /* @__PURE__ */ jsx45(
7429
+ children: errorText ? /* @__PURE__ */ jsxs42(Fragment8, { children: [
7430
+ /* @__PURE__ */ jsx47(
7298
7431
  AlertCircle6,
7299
7432
  {
7300
7433
  "aria-hidden": "true",
@@ -7302,11 +7435,11 @@ var OTPField = React37.forwardRef(
7302
7435
  strokeWidth: 2
7303
7436
  }
7304
7437
  ),
7305
- /* @__PURE__ */ jsx45("span", { children: errorText })
7306
- ] }) : /* @__PURE__ */ jsx45("span", { children: helperText })
7438
+ /* @__PURE__ */ jsx47("span", { children: errorText })
7439
+ ] }) : /* @__PURE__ */ jsx47("span", { children: helperText })
7307
7440
  }
7308
7441
  ) : null,
7309
- name ? /* @__PURE__ */ jsx45(
7442
+ name ? /* @__PURE__ */ jsx47(
7310
7443
  "input",
7311
7444
  {
7312
7445
  "aria-hidden": "true",
@@ -7328,9 +7461,9 @@ OTPField.displayName = "OTPField";
7328
7461
 
7329
7462
  // src/components/ui/search-field.tsx
7330
7463
  import * as React38 from "react";
7331
- import { Search, X as X5 } from "lucide-react";
7464
+ import { Search, X as X6 } from "lucide-react";
7332
7465
  import { cva as cva26 } from "class-variance-authority";
7333
- import { jsx as jsx46, jsxs as jsxs41 } from "react/jsx-runtime";
7466
+ import { jsx as jsx48, jsxs as jsxs43 } from "react/jsx-runtime";
7334
7467
  var searchFieldVariants = cva26("relative flex w-full items-center", {
7335
7468
  variants: {
7336
7469
  size: {
@@ -7429,14 +7562,14 @@ var SearchField = React38.forwardRef(
7429
7562
  }
7430
7563
  onClear?.();
7431
7564
  };
7432
- return /* @__PURE__ */ jsxs41(
7565
+ return /* @__PURE__ */ jsxs43(
7433
7566
  "div",
7434
7567
  {
7435
7568
  "data-slot": "search-field",
7436
7569
  "data-size": resolvedSize,
7437
7570
  className: cn(searchFieldVariants({ size, className })),
7438
7571
  children: [
7439
- /* @__PURE__ */ jsx46(
7572
+ /* @__PURE__ */ jsx48(
7440
7573
  Search,
7441
7574
  {
7442
7575
  "aria-hidden": "true",
@@ -7446,7 +7579,7 @@ var SearchField = React38.forwardRef(
7446
7579
  strokeWidth: resolvedSize === "sm" ? 2 : 1.75
7447
7580
  }
7448
7581
  ),
7449
- /* @__PURE__ */ jsx46(
7582
+ /* @__PURE__ */ jsx48(
7450
7583
  "input",
7451
7584
  {
7452
7585
  ref: inputRef,
@@ -7467,7 +7600,7 @@ var SearchField = React38.forwardRef(
7467
7600
  ...props
7468
7601
  }
7469
7602
  ),
7470
- showClear ? /* @__PURE__ */ jsx46(
7603
+ showClear ? /* @__PURE__ */ jsx48(
7471
7604
  "button",
7472
7605
  {
7473
7606
  type: "button",
@@ -7475,7 +7608,7 @@ var SearchField = React38.forwardRef(
7475
7608
  "data-slot": "search-field-clear",
7476
7609
  className: "absolute right-[8px] top-1/2 inline-flex size-[var(--space-2)] -translate-y-1/2 cursor-pointer items-center justify-center rounded-[var(--radius-full)] text-text-tertiary transition-colors hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--focus-ring)]",
7477
7610
  onClick: clearInput,
7478
- children: /* @__PURE__ */ jsx46(X5, { "aria-hidden": "true", size: 16, strokeWidth: 1.75 })
7611
+ children: /* @__PURE__ */ jsx48(X6, { "aria-hidden": "true", size: 16, strokeWidth: 1.75 })
7479
7612
  }
7480
7613
  ) : null
7481
7614
  ]
@@ -7488,7 +7621,7 @@ SearchField.displayName = "SearchField";
7488
7621
  // src/components/ui/checkbox-group.tsx
7489
7622
  import * as React39 from "react";
7490
7623
  import { cva as cva27 } from "class-variance-authority";
7491
- import { jsx as jsx47 } from "react/jsx-runtime";
7624
+ import { jsx as jsx49 } from "react/jsx-runtime";
7492
7625
  var checkboxGroupVariants = cva27("gap-[var(--space-1)]", {
7493
7626
  variants: {
7494
7627
  appearance: {
@@ -7564,7 +7697,7 @@ var CheckboxGroup = React39.forwardRef(
7564
7697
  }),
7565
7698
  [appearance, density, disabled, name, selectedValues, toggleValue]
7566
7699
  );
7567
- return /* @__PURE__ */ jsx47(CheckboxGroupContext.Provider, { value: contextValue, children: /* @__PURE__ */ jsx47(
7700
+ return /* @__PURE__ */ jsx49(CheckboxGroupContext.Provider, { value: contextValue, children: /* @__PURE__ */ jsx49(
7568
7701
  "div",
7569
7702
  {
7570
7703
  ref,
@@ -7592,7 +7725,7 @@ import * as React40 from "react";
7592
7725
  import { cva as cva28 } from "class-variance-authority";
7593
7726
  import { Circle } from "lucide-react";
7594
7727
  import { RadioGroup as RadioGroupPrimitive } from "radix-ui";
7595
- import { jsx as jsx48, jsxs as jsxs42 } from "react/jsx-runtime";
7728
+ import { jsx as jsx50, jsxs as jsxs44 } from "react/jsx-runtime";
7596
7729
  var radioGroupVariants = cva28("gap-[var(--space-1)]", {
7597
7730
  variants: {
7598
7731
  appearance: {
@@ -7700,7 +7833,7 @@ var RadioGroup = React40.forwardRef(
7700
7833
  () => ({ appearance, density }),
7701
7834
  [appearance, density]
7702
7835
  );
7703
- return /* @__PURE__ */ jsx48(RadioGroupContext.Provider, { value: contextValue, children: /* @__PURE__ */ jsx48(
7836
+ return /* @__PURE__ */ jsx50(RadioGroupContext.Provider, { value: contextValue, children: /* @__PURE__ */ jsx50(
7704
7837
  RadioGroupPrimitive.Root,
7705
7838
  {
7706
7839
  ref,
@@ -7729,7 +7862,7 @@ var Radio = React40.forwardRef(({ className, children, description, id, ...props
7729
7862
  const radioId = id ?? generatedId;
7730
7863
  const labelId = `${radioId}-label`;
7731
7864
  const descriptionId = description ? `${radioId}-description` : void 0;
7732
- return /* @__PURE__ */ jsxs42(
7865
+ return /* @__PURE__ */ jsxs44(
7733
7866
  RadioGroupPrimitive.Item,
7734
7867
  {
7735
7868
  ref,
@@ -7740,24 +7873,24 @@ var Radio = React40.forwardRef(({ className, children, description, id, ...props
7740
7873
  className: cn(radioVariants({ appearance, density }), className),
7741
7874
  ...props,
7742
7875
  children: [
7743
- /* @__PURE__ */ jsx48(
7876
+ /* @__PURE__ */ jsx50(
7744
7877
  "span",
7745
7878
  {
7746
7879
  "aria-hidden": "true",
7747
7880
  "data-slot": "radio-control",
7748
7881
  className: radioControlVariants({ appearance }),
7749
- children: /* @__PURE__ */ jsx48(
7882
+ children: /* @__PURE__ */ jsx50(
7750
7883
  RadioGroupPrimitive.Indicator,
7751
7884
  {
7752
7885
  "data-slot": "radio-indicator",
7753
7886
  className: "flex items-center justify-center",
7754
- children: /* @__PURE__ */ jsx48(Circle, { "aria-hidden": "true", size: 8, fill: "currentColor" })
7887
+ children: /* @__PURE__ */ jsx50(Circle, { "aria-hidden": "true", size: 8, fill: "currentColor" })
7755
7888
  }
7756
7889
  )
7757
7890
  }
7758
7891
  ),
7759
- /* @__PURE__ */ jsxs42("span", { className: "flex min-w-0 flex-col gap-[var(--space-0-5)]", children: [
7760
- /* @__PURE__ */ jsx48(
7892
+ /* @__PURE__ */ jsxs44("span", { className: "flex min-w-0 flex-col gap-[var(--space-0-5)]", children: [
7893
+ /* @__PURE__ */ jsx50(
7761
7894
  "span",
7762
7895
  {
7763
7896
  id: labelId,
@@ -7769,7 +7902,7 @@ var Radio = React40.forwardRef(({ className, children, description, id, ...props
7769
7902
  children
7770
7903
  }
7771
7904
  ),
7772
- description ? /* @__PURE__ */ jsx48(
7905
+ description ? /* @__PURE__ */ jsx50(
7773
7906
  "span",
7774
7907
  {
7775
7908
  id: descriptionId,
@@ -7787,20 +7920,20 @@ Radio.displayName = "Radio";
7787
7920
 
7788
7921
  // src/components/ui/scroll-area.tsx
7789
7922
  import { ScrollArea as ScrollAreaPrimitive } from "radix-ui";
7790
- import { jsx as jsx49, jsxs as jsxs43 } from "react/jsx-runtime";
7923
+ import { jsx as jsx51, jsxs as jsxs45 } from "react/jsx-runtime";
7791
7924
  function ScrollArea({
7792
7925
  className,
7793
7926
  children,
7794
7927
  ...props
7795
7928
  }) {
7796
- return /* @__PURE__ */ jsxs43(
7929
+ return /* @__PURE__ */ jsxs45(
7797
7930
  ScrollAreaPrimitive.Root,
7798
7931
  {
7799
7932
  "data-slot": "scroll-area",
7800
7933
  className: cn("relative", className),
7801
7934
  ...props,
7802
7935
  children: [
7803
- /* @__PURE__ */ jsx49(
7936
+ /* @__PURE__ */ jsx51(
7804
7937
  ScrollAreaPrimitive.Viewport,
7805
7938
  {
7806
7939
  "data-slot": "scroll-area-viewport",
@@ -7808,8 +7941,8 @@ function ScrollArea({
7808
7941
  children
7809
7942
  }
7810
7943
  ),
7811
- /* @__PURE__ */ jsx49(ScrollBar, {}),
7812
- /* @__PURE__ */ jsx49(ScrollAreaPrimitive.Corner, {})
7944
+ /* @__PURE__ */ jsx51(ScrollBar, {}),
7945
+ /* @__PURE__ */ jsx51(ScrollAreaPrimitive.Corner, {})
7813
7946
  ]
7814
7947
  }
7815
7948
  );
@@ -7819,7 +7952,7 @@ function ScrollBar({
7819
7952
  orientation = "vertical",
7820
7953
  ...props
7821
7954
  }) {
7822
- return /* @__PURE__ */ jsx49(
7955
+ return /* @__PURE__ */ jsx51(
7823
7956
  ScrollAreaPrimitive.ScrollAreaScrollbar,
7824
7957
  {
7825
7958
  "data-slot": "scroll-area-scrollbar",
@@ -7831,7 +7964,7 @@ function ScrollBar({
7831
7964
  className
7832
7965
  ),
7833
7966
  ...props,
7834
- children: /* @__PURE__ */ jsx49(
7967
+ children: /* @__PURE__ */ jsx51(
7835
7968
  ScrollAreaPrimitive.ScrollAreaThumb,
7836
7969
  {
7837
7970
  "data-slot": "scroll-area-thumb",
@@ -7843,7 +7976,7 @@ function ScrollBar({
7843
7976
  }
7844
7977
 
7845
7978
  // src/components/ui/progress.tsx
7846
- import { jsx as jsx50 } from "react/jsx-runtime";
7979
+ import { jsx as jsx52 } from "react/jsx-runtime";
7847
7980
  var progressFillByStatus = {
7848
7981
  active: "bg-[var(--accent-solid)]",
7849
7982
  success: "bg-[var(--success)]",
@@ -7864,7 +7997,7 @@ function Progress({
7864
7997
  const clamped = Math.max(0, Math.min(safeMax, value));
7865
7998
  const percent = clamped / safeMax * 100;
7866
7999
  const w = typeof width === "number" ? `${width}px` : width;
7867
- return /* @__PURE__ */ jsx50(
8000
+ return /* @__PURE__ */ jsx52(
7868
8001
  "div",
7869
8002
  {
7870
8003
  role: "progressbar",
@@ -7878,7 +8011,7 @@ function Progress({
7878
8011
  ),
7879
8012
  style: { width: w, height: `${height}px`, ...style },
7880
8013
  ...props,
7881
- children: /* @__PURE__ */ jsx50(
8014
+ children: /* @__PURE__ */ jsx52(
7882
8015
  "div",
7883
8016
  {
7884
8017
  className: cn(
@@ -7896,7 +8029,7 @@ function Progress({
7896
8029
  import * as React41 from "react";
7897
8030
  import { ChevronRight as ChevronRight2 } from "lucide-react";
7898
8031
  import { cva as cva29 } from "class-variance-authority";
7899
- import { jsx as jsx51, jsxs as jsxs44 } from "react/jsx-runtime";
8032
+ import { jsx as jsx53, jsxs as jsxs46 } from "react/jsx-runtime";
7900
8033
  var treeViewVariants = cva29(
7901
8034
  "m-0 list-none p-[var(--space-0-5)] text-body-sm text-foreground"
7902
8035
  );
@@ -8066,7 +8199,7 @@ function TreeView({
8066
8199
  const selected = node.id === selectedId;
8067
8200
  const isActive = node.id === activeId;
8068
8201
  const itemState = { expanded, selected, depth, hasChildren };
8069
- return /* @__PURE__ */ jsxs44(
8202
+ return /* @__PURE__ */ jsxs46(
8070
8203
  "li",
8071
8204
  {
8072
8205
  ref: (element) => {
@@ -8091,7 +8224,7 @@ function TreeView({
8091
8224
  onSelect?.(node.id, node);
8092
8225
  },
8093
8226
  children: [
8094
- /* @__PURE__ */ jsxs44(
8227
+ /* @__PURE__ */ jsxs46(
8095
8228
  "span",
8096
8229
  {
8097
8230
  "data-slot": "treeitem-row",
@@ -8100,7 +8233,7 @@ function TreeView({
8100
8233
  },
8101
8234
  className: treeItemRowVariants({ selected }),
8102
8235
  children: [
8103
- hasChildren ? /* @__PURE__ */ jsx51(
8236
+ hasChildren ? /* @__PURE__ */ jsx53(
8104
8237
  "span",
8105
8238
  {
8106
8239
  "data-slot": "treeitem-toggle",
@@ -8110,7 +8243,7 @@ function TreeView({
8110
8243
  setExpanded(node.id, !expanded);
8111
8244
  },
8112
8245
  className: "flex size-[var(--space-2)] shrink-0 items-center justify-center text-text-tertiary",
8113
- children: /* @__PURE__ */ jsx51(
8246
+ children: /* @__PURE__ */ jsx53(
8114
8247
  ChevronRight2,
8115
8248
  {
8116
8249
  "aria-hidden": "true",
@@ -8123,7 +8256,7 @@ function TreeView({
8123
8256
  }
8124
8257
  )
8125
8258
  }
8126
- ) : /* @__PURE__ */ jsx51(
8259
+ ) : /* @__PURE__ */ jsx53(
8127
8260
  "span",
8128
8261
  {
8129
8262
  "data-slot": "treeitem-spacer",
@@ -8131,18 +8264,18 @@ function TreeView({
8131
8264
  className: "size-[var(--space-2)] shrink-0"
8132
8265
  }
8133
8266
  ),
8134
- /* @__PURE__ */ 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) })
8135
8268
  ]
8136
8269
  }
8137
8270
  ),
8138
- 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
8139
8272
  ]
8140
8273
  },
8141
8274
  node.id
8142
8275
  );
8143
8276
  });
8144
8277
  }
8145
- return /* @__PURE__ */ jsx51(
8278
+ return /* @__PURE__ */ jsx53(
8146
8279
  "ul",
8147
8280
  {
8148
8281
  role: "tree",
@@ -8158,9 +8291,9 @@ function TreeView({
8158
8291
  }
8159
8292
 
8160
8293
  // src/components/branding/olun-logo.tsx
8161
- import { jsx as jsx52, jsxs as jsxs45 } from "react/jsx-runtime";
8294
+ import { jsx as jsx54, jsxs as jsxs47 } from "react/jsx-runtime";
8162
8295
  function OlunSymbol({ size = 28, className }) {
8163
- return /* @__PURE__ */ jsxs45(
8296
+ return /* @__PURE__ */ jsxs47(
8164
8297
  "svg",
8165
8298
  {
8166
8299
  width: size,
@@ -8171,7 +8304,7 @@ function OlunSymbol({ size = 28, className }) {
8171
8304
  className,
8172
8305
  "aria-hidden": "true",
8173
8306
  children: [
8174
- /* @__PURE__ */ jsx52(
8307
+ /* @__PURE__ */ jsx54(
8175
8308
  "circle",
8176
8309
  {
8177
8310
  cx: "108",
@@ -8183,7 +8316,7 @@ function OlunSymbol({ size = 28, className }) {
8183
8316
  style: { color: "var(--text-primary)" }
8184
8317
  }
8185
8318
  ),
8186
- /* @__PURE__ */ 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)" })
8187
8320
  ]
8188
8321
  }
8189
8322
  );
@@ -8194,7 +8327,7 @@ function OlunLogo({
8194
8327
  showSymbol = true,
8195
8328
  className
8196
8329
  }) {
8197
- return /* @__PURE__ */ jsxs45(
8330
+ return /* @__PURE__ */ jsxs47(
8198
8331
  "div",
8199
8332
  {
8200
8333
  className,
@@ -8204,8 +8337,8 @@ function OlunLogo({
8204
8337
  gap: "var(--space-1-5)"
8205
8338
  },
8206
8339
  children: [
8207
- showSymbol && /* @__PURE__ */ jsx52(OlunSymbol, { size: symbolSize }),
8208
- /* @__PURE__ */ jsxs45(
8340
+ showSymbol && /* @__PURE__ */ jsx54(OlunSymbol, { size: symbolSize }),
8341
+ /* @__PURE__ */ jsxs47(
8209
8342
  "span",
8210
8343
  {
8211
8344
  style: {
@@ -8217,7 +8350,7 @@ function OlunLogo({
8217
8350
  },
8218
8351
  children: [
8219
8352
  "OLUN",
8220
- /* @__PURE__ */ jsx52("span", { style: { color: "var(--accent-fg)" }, children: "." })
8353
+ /* @__PURE__ */ jsx54("span", { style: { color: "var(--accent-fg)" }, children: "." })
8221
8354
  ]
8222
8355
  }
8223
8356
  )
@@ -8228,11 +8361,11 @@ function OlunLogo({
8228
8361
 
8229
8362
  // src/components/branding/theme-toggle.tsx
8230
8363
  import { Sun, Moon } from "lucide-react";
8231
- import { jsx as jsx53 } from "react/jsx-runtime";
8364
+ import { jsx as jsx55 } from "react/jsx-runtime";
8232
8365
  function ThemeToggle({ className }) {
8233
8366
  const { resolvedTheme, toggleTheme } = useOlunTheme();
8234
8367
  const Icon = resolvedTheme === "dark" ? Moon : Sun;
8235
- return /* @__PURE__ */ jsx53(
8368
+ return /* @__PURE__ */ jsx55(
8236
8369
  "button",
8237
8370
  {
8238
8371
  onClick: () => toggleTheme(),
@@ -8244,14 +8377,14 @@ function ThemeToggle({ className }) {
8244
8377
  ),
8245
8378
  "aria-label": "\uD14C\uB9C8 \uC804\uD658",
8246
8379
  title: resolvedTheme === "dark" ? "\uB77C\uC774\uD2B8 \uBAA8\uB4DC\uB85C" : "\uB2E4\uD06C \uBAA8\uB4DC\uB85C",
8247
- children: /* @__PURE__ */ jsx53(Icon, { className: "size-[18px]", strokeWidth: 1.75 })
8380
+ children: /* @__PURE__ */ jsx55(Icon, { className: "size-[18px]", strokeWidth: 1.75 })
8248
8381
  }
8249
8382
  );
8250
8383
  }
8251
8384
 
8252
8385
  // src/components/branding/theme-fab.tsx
8253
8386
  import { Sun as Sun2, Moon as Moon2 } from "lucide-react";
8254
- import { jsx as jsx54 } from "react/jsx-runtime";
8387
+ import { jsx as jsx56 } from "react/jsx-runtime";
8255
8388
  function ThemeFab({ variant = "square" } = {}) {
8256
8389
  const { mounted, resolvedTheme, toggleTheme } = useOlunTheme();
8257
8390
  if (!mounted) {
@@ -8291,7 +8424,7 @@ function ThemeFab({ variant = "square" } = {}) {
8291
8424
  WebkitBackdropFilter: "blur(16px)",
8292
8425
  zIndex: 9999
8293
8426
  };
8294
- return /* @__PURE__ */ jsx54(
8427
+ return /* @__PURE__ */ jsx56(
8295
8428
  "button",
8296
8429
  {
8297
8430
  onClick: () => toggleTheme(),
@@ -8316,7 +8449,7 @@ function ThemeFab({ variant = "square" } = {}) {
8316
8449
  e.currentTarget.style.color = "var(--text-secondary)";
8317
8450
  }
8318
8451
  },
8319
- children: /* @__PURE__ */ jsx54(
8452
+ children: /* @__PURE__ */ jsx56(
8320
8453
  Icon,
8321
8454
  {
8322
8455
  size: isCircle ? 22 : 16,
@@ -8328,7 +8461,7 @@ function ThemeFab({ variant = "square" } = {}) {
8328
8461
  }
8329
8462
 
8330
8463
  // src/components/logos/organization-logo.tsx
8331
- import { jsx as jsx55 } from "react/jsx-runtime";
8464
+ import { jsx as jsx57 } from "react/jsx-runtime";
8332
8465
  var organizationLogoRegistry = {
8333
8466
  jbnu: {
8334
8467
  label: "\uC804\uBD81\uB300\uD559\uAD50 \uC5E0\uBE14\uB7FC",
@@ -8357,7 +8490,7 @@ function OrganizationLogo({
8357
8490
  }) {
8358
8491
  const asset = organizationLogoRegistry[organization];
8359
8492
  const isDecorative = ariaHidden === true || ariaHidden === "true";
8360
- return /* @__PURE__ */ jsx55(
8493
+ return /* @__PURE__ */ jsx57(
8361
8494
  "svg",
8362
8495
  {
8363
8496
  viewBox: asset.viewBox,
@@ -8375,7 +8508,7 @@ function OrganizationLogo({
8375
8508
  ...style
8376
8509
  },
8377
8510
  ...props,
8378
- children: asset.paths.map((path) => /* @__PURE__ */ jsx55("path", { d: path }, path))
8511
+ children: asset.paths.map((path) => /* @__PURE__ */ jsx57("path", { d: path }, path))
8379
8512
  }
8380
8513
  );
8381
8514
  }
@@ -8386,6 +8519,7 @@ export {
8386
8519
  AvatarFallback,
8387
8520
  AvatarImage,
8388
8521
  Badge,
8522
+ BulkActionBar,
8389
8523
  Button,
8390
8524
  Card,
8391
8525
  CardContent,
@@ -8399,6 +8533,7 @@ export {
8399
8533
  CheckboxGroupContext,
8400
8534
  Chip,
8401
8535
  ConfirmDialog,
8536
+ ContextMenu,
8402
8537
  CopyButton,
8403
8538
  DataTable,
8404
8539
  DetailLayout,