@olundot/ui 0.8.2 → 0.10.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,7 +4713,7 @@ 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
  );
@@ -4909,7 +4722,7 @@ function DropdownMenuSubContent({
4909
4722
  className,
4910
4723
  ...props
4911
4724
  }) {
4912
- return /* @__PURE__ */ jsx28(
4725
+ return /* @__PURE__ */ jsx25(
4913
4726
  DropdownMenuPrimitive.SubContent,
4914
4727
  {
4915
4728
  "data-slot": "dropdown-menu-sub-content",
@@ -4923,7 +4736,468 @@ function DropdownMenuSubContent({
4923
4736
  "motion-reduce:transition-none",
4924
4737
  className
4925
4738
  ),
4926
- ...props
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({
5182
+ className,
5183
+ children,
5184
+ name,
5185
+ ...props
5186
+ }) {
5187
+ const fallbackText = children ?? (name ? getAvatarFallbackText(name) : null);
5188
+ return /* @__PURE__ */ jsx31(
5189
+ AvatarPrimitive.Fallback,
5190
+ {
5191
+ "data-slot": "avatar-fallback",
5192
+ className: cn(
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",
5197
+ className
5198
+ ),
5199
+ ...props,
5200
+ children: fallbackText
4927
5201
  }
4928
5202
  );
4929
5203
  }
@@ -4931,7 +5205,7 @@ function DropdownMenuSubContent({
4931
5205
  // src/components/ui/sheet.tsx
4932
5206
  import { XIcon } from "lucide-react";
4933
5207
  import { Dialog as SheetPrimitive } from "radix-ui";
4934
- import { jsx as jsx29, jsxs as jsxs26 } from "react/jsx-runtime";
5208
+ import { jsx as jsx32, jsxs as jsxs29 } from "react/jsx-runtime";
4935
5209
  var defaultSheetMotionConfig = {
4936
5210
  type: "slide",
4937
5211
  duration: 300,
@@ -4963,22 +5237,22 @@ function getSheetMotionStyle(motionConfig, style) {
4963
5237
  };
4964
5238
  }
4965
5239
  function Sheet({ ...props }) {
4966
- return /* @__PURE__ */ jsx29(SheetPrimitive.Root, { "data-slot": "sheet", ...props });
5240
+ return /* @__PURE__ */ jsx32(SheetPrimitive.Root, { "data-slot": "sheet", ...props });
4967
5241
  }
4968
5242
  function SheetTrigger({
4969
5243
  ...props
4970
5244
  }) {
4971
- return /* @__PURE__ */ jsx29(SheetPrimitive.Trigger, { "data-slot": "sheet-trigger", ...props });
5245
+ return /* @__PURE__ */ jsx32(SheetPrimitive.Trigger, { "data-slot": "sheet-trigger", ...props });
4972
5246
  }
4973
5247
  function SheetClose({
4974
5248
  ...props
4975
5249
  }) {
4976
- return /* @__PURE__ */ jsx29(SheetPrimitive.Close, { "data-slot": "sheet-close", ...props });
5250
+ return /* @__PURE__ */ jsx32(SheetPrimitive.Close, { "data-slot": "sheet-close", ...props });
4977
5251
  }
4978
5252
  function SheetPortal({
4979
5253
  ...props
4980
5254
  }) {
4981
- return /* @__PURE__ */ jsx29(SheetPrimitive.Portal, { "data-slot": "sheet-portal", ...props });
5255
+ return /* @__PURE__ */ jsx32(SheetPrimitive.Portal, { "data-slot": "sheet-portal", ...props });
4982
5256
  }
4983
5257
  function SheetOverlay({
4984
5258
  className,
@@ -4987,7 +5261,7 @@ function SheetOverlay({
4987
5261
  ...props
4988
5262
  }) {
4989
5263
  const motionConfig = resolveSheetMotionConfig(motion);
4990
- return /* @__PURE__ */ jsx29(
5264
+ return /* @__PURE__ */ jsx32(
4991
5265
  SheetPrimitive.Overlay,
4992
5266
  {
4993
5267
  "data-slot": "sheet-overlay",
@@ -5020,9 +5294,9 @@ function SheetContent({
5020
5294
  }) {
5021
5295
  const motionConfig = resolveSheetMotionConfig(motion);
5022
5296
  const hasSlideMotion = motionConfig && motionConfig.type === "slide";
5023
- return /* @__PURE__ */ jsxs26(SheetPortal, { children: [
5024
- /* @__PURE__ */ jsx29(SheetOverlay, { motion: motionConfig }),
5025
- /* @__PURE__ */ jsxs26(
5297
+ return /* @__PURE__ */ jsxs29(SheetPortal, { children: [
5298
+ /* @__PURE__ */ jsx32(SheetOverlay, { motion: motionConfig }),
5299
+ /* @__PURE__ */ jsxs29(
5026
5300
  SheetPrimitive.Content,
5027
5301
  {
5028
5302
  "data-slot": "sheet-content",
@@ -5073,9 +5347,9 @@ function SheetContent({
5073
5347
  ...props,
5074
5348
  children: [
5075
5349
  children,
5076
- showCloseButton && /* @__PURE__ */ jsxs26(SheetPrimitive.Close, { className: "absolute top-4 right-4 cursor-pointer rounded-xs opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:ring-2 focus:ring-ring focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none data-[state=open]:bg-secondary", children: [
5077
- /* @__PURE__ */ jsx29(XIcon, { className: "size-[16px]" }),
5078
- /* @__PURE__ */ jsx29("span", { className: "sr-only", children: "Close" })
5350
+ showCloseButton && /* @__PURE__ */ jsxs29(SheetPrimitive.Close, { className: "absolute top-4 right-4 cursor-pointer rounded-xs opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:ring-2 focus:ring-ring focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none data-[state=open]:bg-secondary", children: [
5351
+ /* @__PURE__ */ jsx32(XIcon, { className: "size-[16px]" }),
5352
+ /* @__PURE__ */ jsx32("span", { className: "sr-only", children: "Close" })
5079
5353
  ] })
5080
5354
  ]
5081
5355
  }
@@ -5083,7 +5357,7 @@ function SheetContent({
5083
5357
  ] });
5084
5358
  }
5085
5359
  function SheetHeader({ className, ...props }) {
5086
- return /* @__PURE__ */ jsx29(
5360
+ return /* @__PURE__ */ jsx32(
5087
5361
  "div",
5088
5362
  {
5089
5363
  "data-slot": "sheet-header",
@@ -5093,7 +5367,7 @@ function SheetHeader({ className, ...props }) {
5093
5367
  );
5094
5368
  }
5095
5369
  function SheetFooter({ className, ...props }) {
5096
- return /* @__PURE__ */ jsx29(
5370
+ return /* @__PURE__ */ jsx32(
5097
5371
  "div",
5098
5372
  {
5099
5373
  "data-slot": "sheet-footer",
@@ -5106,7 +5380,7 @@ function SheetTitle({
5106
5380
  className,
5107
5381
  ...props
5108
5382
  }) {
5109
- return /* @__PURE__ */ jsx29(
5383
+ return /* @__PURE__ */ jsx32(
5110
5384
  SheetPrimitive.Title,
5111
5385
  {
5112
5386
  "data-slot": "sheet-title",
@@ -5119,7 +5393,7 @@ function SheetDescription({
5119
5393
  className,
5120
5394
  ...props
5121
5395
  }) {
5122
- return /* @__PURE__ */ jsx29(
5396
+ return /* @__PURE__ */ jsx32(
5123
5397
  SheetPrimitive.Description,
5124
5398
  {
5125
5399
  "data-slot": "sheet-description",
@@ -5131,7 +5405,7 @@ function SheetDescription({
5131
5405
 
5132
5406
  // src/components/ui/sheet-drawer.tsx
5133
5407
  import { Maximize2Icon, Minimize2Icon, XIcon as XIcon2 } from "lucide-react";
5134
- import { jsx as jsx30, jsxs as jsxs27 } from "react/jsx-runtime";
5408
+ import { jsx as jsx33, jsxs as jsxs30 } from "react/jsx-runtime";
5135
5409
  var sheetDrawerContentClassName = cn(
5136
5410
  "gap-0 p-0",
5137
5411
  "bg-[var(--bg-surface)] text-foreground",
@@ -5200,7 +5474,7 @@ function SheetDrawer({
5200
5474
  const resolvedWidth = expanded ? "full" : width;
5201
5475
  const resolvedExpandLabel = hasExpandedToggle && expanded ? collapseLabel : expandLabel;
5202
5476
  const ExpandActionIcon = hasExpandedToggle && expanded ? Minimize2Icon : Maximize2Icon;
5203
- return /* @__PURE__ */ jsx30(Sheet, { open, onOpenChange, children: /* @__PURE__ */ jsxs27(
5477
+ return /* @__PURE__ */ jsx33(Sheet, { open, onOpenChange, children: /* @__PURE__ */ jsxs30(
5204
5478
  SheetContent,
5205
5479
  {
5206
5480
  "data-slot": "sheet-drawer-content",
@@ -5214,11 +5488,11 @@ function SheetDrawer({
5214
5488
  resolvedWidth === "full" && sheetDrawerFullContentClassName
5215
5489
  ),
5216
5490
  children: [
5217
- /* @__PURE__ */ jsxs27("div", { "data-slot": "sheet-drawer-header", className: sheetDrawerHeaderClassName, children: [
5218
- /* @__PURE__ */ jsxs27("div", { className: sheetDrawerHeaderTextClassName, children: [
5219
- caption ? /* @__PURE__ */ jsx30("div", { "data-slot": "sheet-drawer-caption", className: sheetDrawerCaptionClassName, children: caption }) : null,
5220
- /* @__PURE__ */ jsx30(SheetTitle, { "data-slot": "sheet-drawer-title", className: sheetDrawerTitleClassName, children: title }),
5221
- description ? /* @__PURE__ */ jsx30(
5491
+ /* @__PURE__ */ jsxs30("div", { "data-slot": "sheet-drawer-header", className: sheetDrawerHeaderClassName, children: [
5492
+ /* @__PURE__ */ jsxs30("div", { className: sheetDrawerHeaderTextClassName, children: [
5493
+ caption ? /* @__PURE__ */ jsx33("div", { "data-slot": "sheet-drawer-caption", className: sheetDrawerCaptionClassName, children: caption }) : null,
5494
+ /* @__PURE__ */ jsx33(SheetTitle, { "data-slot": "sheet-drawer-title", className: sheetDrawerTitleClassName, children: title }),
5495
+ description ? /* @__PURE__ */ jsx33(
5222
5496
  SheetDescription,
5223
5497
  {
5224
5498
  "data-slot": "sheet-drawer-description",
@@ -5227,8 +5501,8 @@ function SheetDrawer({
5227
5501
  }
5228
5502
  ) : null
5229
5503
  ] }),
5230
- /* @__PURE__ */ jsxs27("div", { "data-slot": "sheet-drawer-header-actions", className: sheetDrawerHeaderActionsClassName, children: [
5231
- showExpandAction ? hasExpandedToggle ? /* @__PURE__ */ jsxs27(
5504
+ /* @__PURE__ */ jsxs30("div", { "data-slot": "sheet-drawer-header-actions", className: sheetDrawerHeaderActionsClassName, children: [
5505
+ showExpandAction ? hasExpandedToggle ? /* @__PURE__ */ jsxs30(
5232
5506
  "button",
5233
5507
  {
5234
5508
  type: "button",
@@ -5239,11 +5513,11 @@ function SheetDrawer({
5239
5513
  className: sheetDrawerExpandButtonClassName,
5240
5514
  onClick: () => onExpandedChange(!expanded),
5241
5515
  children: [
5242
- /* @__PURE__ */ jsx30(ExpandActionIcon, { className: "size-[16px]" }),
5243
- /* @__PURE__ */ jsx30("span", { className: "hidden text-sm font-medium leading-normal md:inline", children: resolvedExpandLabel })
5516
+ /* @__PURE__ */ jsx33(ExpandActionIcon, { className: "size-[16px]" }),
5517
+ /* @__PURE__ */ jsx33("span", { className: "hidden text-sm font-medium leading-normal md:inline", children: resolvedExpandLabel })
5244
5518
  ]
5245
5519
  }
5246
- ) : expandHref ? /* @__PURE__ */ jsxs27(
5520
+ ) : expandHref ? /* @__PURE__ */ jsxs30(
5247
5521
  "a",
5248
5522
  {
5249
5523
  href: expandHref,
@@ -5251,11 +5525,11 @@ function SheetDrawer({
5251
5525
  "data-slot": "sheet-drawer-expand",
5252
5526
  className: sheetDrawerExpandButtonClassName,
5253
5527
  children: [
5254
- /* @__PURE__ */ jsx30(ExpandActionIcon, { className: "size-[16px]" }),
5255
- /* @__PURE__ */ jsx30("span", { className: "hidden text-sm font-medium leading-normal md:inline", children: expandLabel })
5528
+ /* @__PURE__ */ jsx33(ExpandActionIcon, { className: "size-[16px]" }),
5529
+ /* @__PURE__ */ jsx33("span", { className: "hidden text-sm font-medium leading-normal md:inline", children: expandLabel })
5256
5530
  ]
5257
5531
  }
5258
- ) : /* @__PURE__ */ jsxs27(
5532
+ ) : /* @__PURE__ */ jsxs30(
5259
5533
  "button",
5260
5534
  {
5261
5535
  type: "button",
@@ -5264,40 +5538,40 @@ function SheetDrawer({
5264
5538
  className: sheetDrawerExpandButtonClassName,
5265
5539
  onClick: onExpand,
5266
5540
  children: [
5267
- /* @__PURE__ */ jsx30(ExpandActionIcon, { className: "size-[16px]" }),
5268
- /* @__PURE__ */ jsx30("span", { className: "hidden text-sm font-medium leading-normal md:inline", children: expandLabel })
5541
+ /* @__PURE__ */ jsx33(ExpandActionIcon, { className: "size-[16px]" }),
5542
+ /* @__PURE__ */ jsx33("span", { className: "hidden text-sm font-medium leading-normal md:inline", children: expandLabel })
5269
5543
  ]
5270
5544
  }
5271
5545
  ) : null,
5272
- /* @__PURE__ */ jsx30(
5546
+ /* @__PURE__ */ jsx33(
5273
5547
  SheetClose,
5274
5548
  {
5275
5549
  "aria-label": closeLabel,
5276
5550
  "data-slot": "sheet-drawer-close",
5277
5551
  className: sheetDrawerCloseButtonClassName,
5278
- children: /* @__PURE__ */ jsx30(XIcon2, { className: "size-[16px]" })
5552
+ children: /* @__PURE__ */ jsx33(XIcon2, { className: "size-[16px]" })
5279
5553
  }
5280
5554
  )
5281
5555
  ] })
5282
5556
  ] }),
5283
- /* @__PURE__ */ jsx30("div", { "data-slot": "sheet-drawer-body", className: sheetDrawerBodyClassName, children }),
5284
- footer ? /* @__PURE__ */ jsx30("div", { "data-slot": "sheet-drawer-footer", className: sheetDrawerFooterClassName, children: footer }) : null
5557
+ /* @__PURE__ */ jsx33("div", { "data-slot": "sheet-drawer-body", className: sheetDrawerBodyClassName, children }),
5558
+ footer ? /* @__PURE__ */ jsx33("div", { "data-slot": "sheet-drawer-footer", className: sheetDrawerFooterClassName, children: footer }) : null
5285
5559
  ]
5286
5560
  }
5287
5561
  ) });
5288
5562
  }
5289
5563
 
5290
5564
  // src/components/ui/popover.tsx
5291
- import * as React24 from "react";
5565
+ import * as React25 from "react";
5292
5566
  import { Popover as PopoverPrimitive } from "radix-ui";
5293
- import { jsx as jsx31, jsxs as jsxs28 } from "react/jsx-runtime";
5567
+ import { jsx as jsx34, jsxs as jsxs31 } from "react/jsx-runtime";
5294
5568
  function Popover({ modal = false, ...props }) {
5295
- return /* @__PURE__ */ jsx31(PopoverPrimitive.Root, { modal, ...props });
5569
+ return /* @__PURE__ */ jsx34(PopoverPrimitive.Root, { modal, ...props });
5296
5570
  }
5297
5571
  var PopoverTrigger = PopoverPrimitive.Trigger;
5298
5572
  var PopoverAnchor = PopoverPrimitive.Anchor;
5299
5573
  var PopoverClose = PopoverPrimitive.Close;
5300
- var PopoverContent = React24.forwardRef(({ className, align = "center", sideOffset = 8, collisionPadding = 8, showArrow = false, children, ...props }, ref) => /* @__PURE__ */ jsx31(PopoverPrimitive.Portal, { children: /* @__PURE__ */ jsxs28(
5574
+ var PopoverContent = React25.forwardRef(({ className, align = "center", sideOffset = 8, collisionPadding = 8, showArrow = false, children, ...props }, ref) => /* @__PURE__ */ jsx34(PopoverPrimitive.Portal, { children: /* @__PURE__ */ jsxs31(
5301
5575
  PopoverPrimitive.Content,
5302
5576
  {
5303
5577
  ref,
@@ -5321,7 +5595,7 @@ var PopoverContent = React24.forwardRef(({ className, align = "center", sideOffs
5321
5595
  ...props,
5322
5596
  children: [
5323
5597
  children,
5324
- showArrow ? /* @__PURE__ */ jsx31(
5598
+ showArrow ? /* @__PURE__ */ jsx34(
5325
5599
  PopoverPrimitive.Arrow,
5326
5600
  {
5327
5601
  "data-slot": "popover-arrow",
@@ -5334,7 +5608,7 @@ var PopoverContent = React24.forwardRef(({ className, align = "center", sideOffs
5334
5608
  }
5335
5609
  ) }));
5336
5610
  PopoverContent.displayName = PopoverPrimitive.Content.displayName;
5337
- var PopoverArrow = React24.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx31(
5611
+ var PopoverArrow = React25.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx34(
5338
5612
  PopoverPrimitive.Arrow,
5339
5613
  {
5340
5614
  ref,
@@ -5348,10 +5622,10 @@ var PopoverArrow = React24.forwardRef(({ className, ...props }, ref) => /* @__PU
5348
5622
  PopoverArrow.displayName = PopoverPrimitive.Arrow.displayName;
5349
5623
 
5350
5624
  // src/components/ui/badge.tsx
5351
- import * as React25 from "react";
5352
- import { cva as cva12 } from "class-variance-authority";
5353
- import { jsx as jsx32, jsxs as jsxs29 } from "react/jsx-runtime";
5354
- var badgeVariants = cva12(
5625
+ import * as React26 from "react";
5626
+ import { cva as cva13 } from "class-variance-authority";
5627
+ import { jsx as jsx35, jsxs as jsxs32 } from "react/jsx-runtime";
5628
+ var badgeVariants = cva13(
5355
5629
  [
5356
5630
  "inline-flex w-fit shrink-0 items-center whitespace-nowrap",
5357
5631
  "rounded-[var(--radius-full)] border leading-none",
@@ -5410,10 +5684,10 @@ var badgeVariants = cva12(
5410
5684
  }
5411
5685
  }
5412
5686
  );
5413
- var badgeDotVariants = cva12(
5687
+ var badgeDotVariants = cva13(
5414
5688
  "size-[var(--space-0-5)] shrink-0 rounded-[var(--radius-full)] bg-current"
5415
5689
  );
5416
- var Badge = React25.forwardRef(
5690
+ var Badge = React26.forwardRef(
5417
5691
  ({
5418
5692
  className,
5419
5693
  variant = "neutral",
@@ -5425,7 +5699,7 @@ var Badge = React25.forwardRef(
5425
5699
  ...props
5426
5700
  }, ref) => {
5427
5701
  const resolvedShowDot = showDot ?? variant === "status";
5428
- return /* @__PURE__ */ jsxs29(
5702
+ return /* @__PURE__ */ jsxs32(
5429
5703
  "span",
5430
5704
  {
5431
5705
  ref,
@@ -5438,7 +5712,7 @@ var Badge = React25.forwardRef(
5438
5712
  className: cn(badgeVariants({ variant, tone, size, className })),
5439
5713
  ...props,
5440
5714
  children: [
5441
- resolvedShowDot ? /* @__PURE__ */ jsx32("span", { "aria-hidden": "true", "data-slot": "badge-dot", className: badgeDotVariants() }) : null,
5715
+ resolvedShowDot ? /* @__PURE__ */ jsx35("span", { "aria-hidden": "true", "data-slot": "badge-dot", className: badgeDotVariants() }) : null,
5442
5716
  children
5443
5717
  ]
5444
5718
  }
@@ -5448,10 +5722,10 @@ var Badge = React25.forwardRef(
5448
5722
  Badge.displayName = "Badge";
5449
5723
 
5450
5724
  // src/components/ui/two-tier-badge.tsx
5451
- import * as React26 from "react";
5452
- import { cva as cva13 } from "class-variance-authority";
5453
- import { jsx as jsx33, jsxs as jsxs30 } from "react/jsx-runtime";
5454
- var twoTierBadgeVariants = cva13(
5725
+ import * as React27 from "react";
5726
+ import { cva as cva14 } from "class-variance-authority";
5727
+ import { jsx as jsx36, jsxs as jsxs33 } from "react/jsx-runtime";
5728
+ var twoTierBadgeVariants = cva14(
5455
5729
  "inline-flex w-fit flex-col gap-[var(--space-0-5)]",
5456
5730
  {
5457
5731
  variants: {
@@ -5466,7 +5740,7 @@ var twoTierBadgeVariants = cva13(
5466
5740
  }
5467
5741
  }
5468
5742
  );
5469
- var twoTierBadgeLineVariants = cva13(
5743
+ var twoTierBadgeLineVariants = cva14(
5470
5744
  [
5471
5745
  "inline-flex w-fit shrink-0 items-center justify-center whitespace-nowrap",
5472
5746
  "rounded-[var(--radius-xs)] border leading-none",
@@ -5493,7 +5767,7 @@ var twoTierBadgeLineVariants = cva13(
5493
5767
  }
5494
5768
  }
5495
5769
  );
5496
- var TwoTierBadge = React26.forwardRef(
5770
+ var TwoTierBadge = React27.forwardRef(
5497
5771
  ({
5498
5772
  className,
5499
5773
  align,
@@ -5504,7 +5778,7 @@ var TwoTierBadge = React26.forwardRef(
5504
5778
  primaryClassName,
5505
5779
  secondaryClassName,
5506
5780
  ...props
5507
- }, ref) => /* @__PURE__ */ jsxs30(
5781
+ }, ref) => /* @__PURE__ */ jsxs33(
5508
5782
  "div",
5509
5783
  {
5510
5784
  ref,
@@ -5512,7 +5786,7 @@ var TwoTierBadge = React26.forwardRef(
5512
5786
  className: cn(twoTierBadgeVariants({ align, className })),
5513
5787
  ...props,
5514
5788
  children: [
5515
- /* @__PURE__ */ jsx33(
5789
+ /* @__PURE__ */ jsx36(
5516
5790
  "span",
5517
5791
  {
5518
5792
  "data-slot": "two-tier-badge-primary",
@@ -5526,7 +5800,7 @@ var TwoTierBadge = React26.forwardRef(
5526
5800
  children: primary
5527
5801
  }
5528
5802
  ),
5529
- secondary ? /* @__PURE__ */ jsx33(
5803
+ secondary ? /* @__PURE__ */ jsx36(
5530
5804
  "span",
5531
5805
  {
5532
5806
  "data-slot": "two-tier-badge-secondary",
@@ -5547,10 +5821,10 @@ var TwoTierBadge = React26.forwardRef(
5547
5821
  TwoTierBadge.displayName = "TwoTierBadge";
5548
5822
 
5549
5823
  // src/components/ui/status-badge.tsx
5550
- import * as React27 from "react";
5551
- import { cva as cva14 } from "class-variance-authority";
5552
- import { jsx as jsx34, jsxs as jsxs31 } from "react/jsx-runtime";
5553
- var statusBadgeVariants = cva14(
5824
+ import * as React28 from "react";
5825
+ import { cva as cva15 } from "class-variance-authority";
5826
+ import { jsx as jsx37, jsxs as jsxs34 } from "react/jsx-runtime";
5827
+ var statusBadgeVariants = cva15(
5554
5828
  [
5555
5829
  "inline-flex w-fit shrink-0 items-center whitespace-nowrap",
5556
5830
  "rounded-[var(--radius-full)] border leading-none",
@@ -5579,10 +5853,10 @@ var statusBadgeVariants = cva14(
5579
5853
  }
5580
5854
  }
5581
5855
  );
5582
- var statusBadgeDotVariants = cva14(
5856
+ var statusBadgeDotVariants = cva15(
5583
5857
  "size-[var(--space-0-5)] shrink-0 rounded-[var(--radius-full)] bg-current"
5584
5858
  );
5585
- var StatusBadge = React27.forwardRef(
5859
+ var StatusBadge = React28.forwardRef(
5586
5860
  ({
5587
5861
  className,
5588
5862
  status = "active",
@@ -5591,7 +5865,7 @@ var StatusBadge = React27.forwardRef(
5591
5865
  pulse = true,
5592
5866
  children,
5593
5867
  ...props
5594
- }, ref) => /* @__PURE__ */ jsxs31(
5868
+ }, ref) => /* @__PURE__ */ jsxs34(
5595
5869
  "span",
5596
5870
  {
5597
5871
  ref,
@@ -5600,7 +5874,7 @@ var StatusBadge = React27.forwardRef(
5600
5874
  className: cn(statusBadgeVariants({ status, size, className })),
5601
5875
  ...props,
5602
5876
  children: [
5603
- showDot ? /* @__PURE__ */ jsx34(
5877
+ showDot ? /* @__PURE__ */ jsx37(
5604
5878
  "span",
5605
5879
  {
5606
5880
  "aria-hidden": "true",
@@ -5620,10 +5894,10 @@ var StatusBadge = React27.forwardRef(
5620
5894
  StatusBadge.displayName = "StatusBadge";
5621
5895
 
5622
5896
  // src/components/ui/notification-badge.tsx
5623
- import * as React28 from "react";
5624
- import { cva as cva15 } from "class-variance-authority";
5625
- import { jsx as jsx35 } from "react/jsx-runtime";
5626
- var notificationBadgeVariants = cva15(
5897
+ import * as React29 from "react";
5898
+ import { cva as cva16 } from "class-variance-authority";
5899
+ import { jsx as jsx38 } from "react/jsx-runtime";
5900
+ var notificationBadgeVariants = cva16(
5627
5901
  [
5628
5902
  "inline-flex shrink-0 items-center justify-center rounded-[var(--radius-full)]",
5629
5903
  "bg-[var(--semantic-error,var(--error))] text-[var(--error-contrast)]",
@@ -5653,7 +5927,7 @@ function formatNotificationCount(count, max) {
5653
5927
  }
5654
5928
  return String(count);
5655
5929
  }
5656
- var NotificationBadge = React28.forwardRef(
5930
+ var NotificationBadge = React29.forwardRef(
5657
5931
  ({
5658
5932
  className,
5659
5933
  count,
@@ -5668,7 +5942,7 @@ var NotificationBadge = React28.forwardRef(
5668
5942
  }
5669
5943
  const normalizedMax = Math.max(1, Math.floor(max));
5670
5944
  const label = ariaLabel ?? (count > normalizedMax ? `\uC77D\uC9C0 \uC54A\uC740 \uC54C\uB9BC ${normalizedMax}\uAC1C \uC774\uC0C1` : `\uC77D\uC9C0 \uC54A\uC740 \uC54C\uB9BC ${count}\uAC1C`);
5671
- return /* @__PURE__ */ jsx35(
5945
+ return /* @__PURE__ */ jsx38(
5672
5946
  "span",
5673
5947
  {
5674
5948
  ref,
@@ -5686,12 +5960,12 @@ var NotificationBadge = React28.forwardRef(
5686
5960
  NotificationBadge.displayName = "NotificationBadge";
5687
5961
 
5688
5962
  // src/components/ui/chip.tsx
5689
- import * as React29 from "react";
5690
- import { cva as cva16 } from "class-variance-authority";
5691
- import { X as X3 } from "lucide-react";
5963
+ import * as React30 from "react";
5964
+ import { cva as cva17 } from "class-variance-authority";
5965
+ import { X as X4 } from "lucide-react";
5692
5966
  import { Slot as Slot2 } from "radix-ui";
5693
- import { jsx as jsx36, jsxs as jsxs32 } from "react/jsx-runtime";
5694
- var chipVariants = cva16(
5967
+ import { jsx as jsx39, jsxs as jsxs35 } from "react/jsx-runtime";
5968
+ var chipVariants = cva17(
5695
5969
  [
5696
5970
  "inline-flex w-fit shrink-0 items-center justify-center whitespace-nowrap",
5697
5971
  "rounded-[var(--radius-full)] border leading-none",
@@ -5754,7 +6028,7 @@ var chipVariants = cva16(
5754
6028
  }
5755
6029
  }
5756
6030
  );
5757
- var chipCountVariants = cva16(
6031
+ var chipCountVariants = cva17(
5758
6032
  [
5759
6033
  "inline-flex min-w-[var(--space-2)] items-center justify-center",
5760
6034
  "rounded-[var(--radius-full)] px-[var(--space-0-5)]",
@@ -5782,7 +6056,7 @@ var chipCountVariants = cva16(
5782
6056
  }
5783
6057
  }
5784
6058
  );
5785
- var Chip = React29.forwardRef(
6059
+ var Chip = React30.forwardRef(
5786
6060
  ({
5787
6061
  className,
5788
6062
  variant = "filter",
@@ -5797,7 +6071,7 @@ var Chip = React29.forwardRef(
5797
6071
  }, ref) => {
5798
6072
  const Comp = asChild ? Slot2.Root : "button";
5799
6073
  const removable = variant === "removable";
5800
- return /* @__PURE__ */ jsxs32(
6074
+ return /* @__PURE__ */ jsxs35(
5801
6075
  Comp,
5802
6076
  {
5803
6077
  ref,
@@ -5812,7 +6086,7 @@ var Chip = React29.forwardRef(
5812
6086
  ...props,
5813
6087
  children: [
5814
6088
  children,
5815
- count !== void 0 ? /* @__PURE__ */ jsx36(
6089
+ count !== void 0 ? /* @__PURE__ */ jsx39(
5816
6090
  "span",
5817
6091
  {
5818
6092
  "aria-hidden": "true",
@@ -5822,13 +6096,13 @@ var Chip = React29.forwardRef(
5822
6096
  children: count
5823
6097
  }
5824
6098
  ) : null,
5825
- removable ? /* @__PURE__ */ jsx36(
6099
+ removable ? /* @__PURE__ */ jsx39(
5826
6100
  "span",
5827
6101
  {
5828
6102
  "aria-label": removeLabel,
5829
6103
  "data-slot": "chip-remove",
5830
6104
  className: "inline-flex size-[var(--space-2)] items-center justify-center rounded-[var(--radius-full)] text-text-tertiary",
5831
- children: /* @__PURE__ */ jsx36(X3, { "aria-hidden": "true", size: 14, strokeWidth: 2.25 })
6105
+ children: /* @__PURE__ */ jsx39(X4, { "aria-hidden": "true", size: 14, strokeWidth: 2.25 })
5832
6106
  }
5833
6107
  ) : null
5834
6108
  ]
@@ -5839,13 +6113,12 @@ var Chip = React29.forwardRef(
5839
6113
  Chip.displayName = "Chip";
5840
6114
 
5841
6115
  // src/components/ui/empty-state.tsx
5842
- import * as React30 from "react";
5843
- import { cva as cva17 } from "class-variance-authority";
5844
- import { jsx as jsx37, jsxs as jsxs33 } from "react/jsx-runtime";
5845
- var emptyStateBaseVariants = cva17(
6116
+ import * as React31 from "react";
6117
+ import { cva as cva18 } from "class-variance-authority";
6118
+ import { jsx as jsx40, jsxs as jsxs36 } from "react/jsx-runtime";
6119
+ var emptyStateBaseVariants = cva18(
5846
6120
  [
5847
6121
  "flex flex-col items-center justify-center text-center",
5848
- "rounded-[var(--radius-md)] border border-[var(--border-subtle)]",
5849
6122
  "text-foreground"
5850
6123
  ].join(" "),
5851
6124
  {
@@ -5854,10 +6127,15 @@ var emptyStateBaseVariants = cva17(
5854
6127
  sm: "gap-[var(--space-1)] px-[var(--space-2)] py-[var(--space-3)]",
5855
6128
  md: "gap-[var(--space-1-5)] px-[var(--space-3)] py-[var(--space-5)]",
5856
6129
  lg: "gap-[var(--space-2)] px-[var(--space-4)] py-[var(--space-6)]"
6130
+ },
6131
+ bordered: {
6132
+ true: "rounded-[var(--radius-md)] border border-[var(--border-subtle)]",
6133
+ false: ""
5857
6134
  }
5858
6135
  },
5859
6136
  defaultVariants: {
5860
- size: "md"
6137
+ size: "md",
6138
+ bordered: true
5861
6139
  }
5862
6140
  }
5863
6141
  );
@@ -5872,14 +6150,21 @@ function getEmptyStateToneSurface(tone) {
5872
6150
  return surfaceClassNames.surface;
5873
6151
  }
5874
6152
  }
5875
- function emptyStateVariants({ size, tone = "neutral", surface, className } = {}) {
6153
+ function emptyStateVariants({
6154
+ size,
6155
+ tone = "neutral",
6156
+ surface,
6157
+ bordered = true,
6158
+ className
6159
+ } = {}) {
6160
+ const hasBorder = bordered !== false;
5876
6161
  return cn(
5877
- emptyStateBaseVariants({ size }),
5878
- surface ? surfaceClassNames[surface] : getEmptyStateToneSurface(tone),
6162
+ emptyStateBaseVariants({ size, bordered: hasBorder }),
6163
+ hasBorder ? surface ? surfaceClassNames[surface] : getEmptyStateToneSurface(tone) : null,
5879
6164
  className
5880
6165
  );
5881
6166
  }
5882
- var emptyStateIconVariants = cva17(
6167
+ var emptyStateIconVariants = cva18(
5883
6168
  [
5884
6169
  "inline-flex items-center justify-center rounded-[var(--radius-full)]",
5885
6170
  "border border-[var(--border-subtle)] bg-[var(--bg-raised)] text-text-tertiary"
@@ -5897,12 +6182,12 @@ var emptyStateIconVariants = cva17(
5897
6182
  }
5898
6183
  }
5899
6184
  );
5900
- var iconSize2 = {
6185
+ var iconSize3 = {
5901
6186
  sm: 18,
5902
6187
  md: 20,
5903
6188
  lg: 24
5904
6189
  };
5905
- var EmptyState = React30.forwardRef(
6190
+ var EmptyState = React31.forwardRef(
5906
6191
  ({
5907
6192
  className,
5908
6193
  size = "md",
@@ -5913,29 +6198,30 @@ var EmptyState = React30.forwardRef(
5913
6198
  description,
5914
6199
  hint,
5915
6200
  action,
6201
+ bordered = true,
5916
6202
  ...props
5917
6203
  }, ref) => {
5918
6204
  const resolvedSize = size ?? "md";
5919
- return /* @__PURE__ */ jsxs33(
6205
+ return /* @__PURE__ */ jsxs36(
5920
6206
  "div",
5921
6207
  {
5922
6208
  ref,
5923
6209
  role: "status",
5924
6210
  "data-slot": "empty-state",
5925
- className: cn(emptyStateVariants({ size, tone, surface, className })),
6211
+ className: cn(emptyStateVariants({ size, tone, surface, bordered, className })),
5926
6212
  ...props,
5927
6213
  children: [
5928
- Icon ? /* @__PURE__ */ jsx37(
6214
+ Icon ? /* @__PURE__ */ jsx40(
5929
6215
  "span",
5930
6216
  {
5931
6217
  "aria-hidden": "true",
5932
6218
  "data-slot": "empty-state-icon",
5933
6219
  className: emptyStateIconVariants({ size: resolvedSize }),
5934
- children: /* @__PURE__ */ jsx37(Icon, { size: iconSize2[resolvedSize], strokeWidth: 1.75 })
6220
+ children: /* @__PURE__ */ jsx40(Icon, { size: iconSize3[resolvedSize], strokeWidth: 1.75 })
5935
6221
  }
5936
6222
  ) : null,
5937
- /* @__PURE__ */ jsxs33("div", { className: "flex max-w-[420px] flex-col items-center gap-[var(--space-1)]", children: [
5938
- /* @__PURE__ */ jsx37(
6223
+ /* @__PURE__ */ jsxs36("div", { className: "flex max-w-[420px] flex-col items-center gap-[var(--space-1)]", children: [
6224
+ /* @__PURE__ */ jsx40(
5939
6225
  "h2",
5940
6226
  {
5941
6227
  "data-slot": "empty-state-title",
@@ -5943,7 +6229,7 @@ var EmptyState = React30.forwardRef(
5943
6229
  children: title
5944
6230
  }
5945
6231
  ),
5946
- description ? /* @__PURE__ */ jsx37(
6232
+ description ? /* @__PURE__ */ jsx40(
5947
6233
  "p",
5948
6234
  {
5949
6235
  "data-slot": "empty-state-description",
@@ -5951,7 +6237,7 @@ var EmptyState = React30.forwardRef(
5951
6237
  children: description
5952
6238
  }
5953
6239
  ) : null,
5954
- hint ? /* @__PURE__ */ jsx37(
6240
+ hint ? /* @__PURE__ */ jsx40(
5955
6241
  "p",
5956
6242
  {
5957
6243
  "data-slot": "empty-state-hint",
@@ -5960,7 +6246,7 @@ var EmptyState = React30.forwardRef(
5960
6246
  }
5961
6247
  ) : null
5962
6248
  ] }),
5963
- action ? /* @__PURE__ */ jsx37("div", { "data-slot": "empty-state-action", className: "mt-[var(--space-1)]", children: action }) : null
6249
+ action ? /* @__PURE__ */ jsx40("div", { "data-slot": "empty-state-action", className: "mt-[var(--space-1)]", children: action }) : null
5964
6250
  ]
5965
6251
  }
5966
6252
  );
@@ -5969,11 +6255,11 @@ var EmptyState = React30.forwardRef(
5969
6255
  EmptyState.displayName = "EmptyState";
5970
6256
 
5971
6257
  // src/components/ui/error-state.tsx
5972
- import * as React31 from "react";
6258
+ import * as React32 from "react";
5973
6259
  import { AlertTriangle as AlertTriangle2 } from "lucide-react";
5974
- import { cva as cva18 } from "class-variance-authority";
5975
- import { jsx as jsx38, jsxs as jsxs34 } from "react/jsx-runtime";
5976
- var errorStateVariants = cva18(
6260
+ import { cva as cva19 } from "class-variance-authority";
6261
+ import { jsx as jsx41, jsxs as jsxs37 } from "react/jsx-runtime";
6262
+ var errorStateVariants = cva19(
5977
6263
  [
5978
6264
  "flex flex-col items-center justify-center text-center",
5979
6265
  "rounded-[var(--radius-md)] border border-[var(--border-subtle)]",
@@ -5994,7 +6280,7 @@ var errorStateVariants = cva18(
5994
6280
  }
5995
6281
  }
5996
6282
  );
5997
- var ErrorState = React31.forwardRef(
6283
+ var ErrorState = React32.forwardRef(
5998
6284
  ({
5999
6285
  className,
6000
6286
  size = "md",
@@ -6005,7 +6291,7 @@ var ErrorState = React31.forwardRef(
6005
6291
  onRetry,
6006
6292
  retryLabel = "\uB2E4\uC2DC \uC2DC\uB3C4",
6007
6293
  ...props
6008
- }, ref) => /* @__PURE__ */ jsxs34(
6294
+ }, ref) => /* @__PURE__ */ jsxs37(
6009
6295
  "div",
6010
6296
  {
6011
6297
  ref,
@@ -6014,17 +6300,17 @@ var ErrorState = React31.forwardRef(
6014
6300
  className: cn(errorStateVariants({ size, surface, className })),
6015
6301
  ...props,
6016
6302
  children: [
6017
- /* @__PURE__ */ jsx38(
6303
+ /* @__PURE__ */ jsx41(
6018
6304
  "span",
6019
6305
  {
6020
6306
  "aria-hidden": "true",
6021
6307
  "data-slot": "error-state-icon",
6022
6308
  className: "inline-flex size-[48px] items-center justify-center rounded-[var(--radius-full)] bg-[var(--error-bg)] text-[var(--error)]",
6023
- children: /* @__PURE__ */ jsx38(AlertTriangle2, { size: 24, strokeWidth: 1.75 })
6309
+ children: /* @__PURE__ */ jsx41(AlertTriangle2, { size: 24, strokeWidth: 1.75 })
6024
6310
  }
6025
6311
  ),
6026
- /* @__PURE__ */ jsxs34("div", { className: "flex max-w-[420px] flex-col items-center gap-[var(--space-1)]", children: [
6027
- /* @__PURE__ */ jsx38(
6312
+ /* @__PURE__ */ jsxs37("div", { className: "flex max-w-[420px] flex-col items-center gap-[var(--space-1)]", children: [
6313
+ /* @__PURE__ */ jsx41(
6028
6314
  "h2",
6029
6315
  {
6030
6316
  "data-slot": "error-state-title",
@@ -6032,7 +6318,7 @@ var ErrorState = React31.forwardRef(
6032
6318
  children: title
6033
6319
  }
6034
6320
  ),
6035
- /* @__PURE__ */ jsx38(
6321
+ /* @__PURE__ */ jsx41(
6036
6322
  "p",
6037
6323
  {
6038
6324
  "data-slot": "error-state-message",
@@ -6040,7 +6326,7 @@ var ErrorState = React31.forwardRef(
6040
6326
  children: message
6041
6327
  }
6042
6328
  ),
6043
- errorCode ? /* @__PURE__ */ jsx38(
6329
+ errorCode ? /* @__PURE__ */ jsx41(
6044
6330
  "p",
6045
6331
  {
6046
6332
  "data-slot": "error-state-code",
@@ -6049,7 +6335,7 @@ var ErrorState = React31.forwardRef(
6049
6335
  }
6050
6336
  ) : null
6051
6337
  ] }),
6052
- onRetry ? /* @__PURE__ */ jsx38(Button, { size: "sm", variant: "outline", onClick: onRetry, children: retryLabel }) : null
6338
+ onRetry ? /* @__PURE__ */ jsx41(Button, { size: "sm", variant: "outline", onClick: onRetry, children: retryLabel }) : null
6053
6339
  ]
6054
6340
  }
6055
6341
  )
@@ -6057,10 +6343,10 @@ var ErrorState = React31.forwardRef(
6057
6343
  ErrorState.displayName = "ErrorState";
6058
6344
 
6059
6345
  // src/components/ui/skeleton.tsx
6060
- import * as React32 from "react";
6061
- import { cva as cva19 } from "class-variance-authority";
6062
- import { jsx as jsx39 } from "react/jsx-runtime";
6063
- var skeletonVariants = cva19(
6346
+ import * as React33 from "react";
6347
+ import { cva as cva20 } from "class-variance-authority";
6348
+ import { jsx as jsx42 } from "react/jsx-runtime";
6349
+ var skeletonVariants = cva20(
6064
6350
  [
6065
6351
  "animate-pulse rounded-[var(--radius-sm)] bg-[var(--bg-raised)]",
6066
6352
  "motion-reduce:animate-none motion-reduce:opacity-80"
@@ -6078,7 +6364,7 @@ var skeletonVariants = cva19(
6078
6364
  }
6079
6365
  }
6080
6366
  );
6081
- var spinnerVariants = cva19(
6367
+ var spinnerVariants = cva20(
6082
6368
  [
6083
6369
  "inline-block shrink-0 animate-spin rounded-[var(--radius-full)] border-2",
6084
6370
  "border-[var(--border-subtle)] border-t-[var(--accent-solid)]",
@@ -6101,8 +6387,8 @@ var spinnerVariants = cva19(
6101
6387
  }
6102
6388
  }
6103
6389
  );
6104
- var Skeleton = React32.forwardRef(
6105
- ({ className, shape, style, ...props }, ref) => /* @__PURE__ */ jsx39(
6390
+ var Skeleton = React33.forwardRef(
6391
+ ({ className, shape, style, ...props }, ref) => /* @__PURE__ */ jsx42(
6106
6392
  "div",
6107
6393
  {
6108
6394
  ref,
@@ -6115,15 +6401,15 @@ var Skeleton = React32.forwardRef(
6115
6401
  );
6116
6402
  Skeleton.displayName = "Skeleton";
6117
6403
  var defaultTextWidths = ["92%", "84%", "68%", "76%"];
6118
- var SkeletonText = React32.forwardRef(
6119
- ({ className, lines = 3, widths = defaultTextWidths, ...props }, ref) => /* @__PURE__ */ jsx39(
6404
+ var SkeletonText = React33.forwardRef(
6405
+ ({ className, lines = 3, widths = defaultTextWidths, ...props }, ref) => /* @__PURE__ */ jsx42(
6120
6406
  "div",
6121
6407
  {
6122
6408
  ref,
6123
6409
  "data-slot": "skeleton-text",
6124
6410
  className: cn("flex flex-col gap-[var(--space-1)]", className),
6125
6411
  ...props,
6126
- children: Array.from({ length: lines }, (_, index) => /* @__PURE__ */ jsx39(
6412
+ children: Array.from({ length: lines }, (_, index) => /* @__PURE__ */ jsx42(
6127
6413
  Skeleton,
6128
6414
  {
6129
6415
  shape: "text",
@@ -6135,7 +6421,7 @@ var SkeletonText = React32.forwardRef(
6135
6421
  )
6136
6422
  );
6137
6423
  SkeletonText.displayName = "SkeletonText";
6138
- var SkeletonRow = React32.forwardRef(
6424
+ var SkeletonRow = React33.forwardRef(
6139
6425
  ({
6140
6426
  className,
6141
6427
  columns,
@@ -6146,7 +6432,7 @@ var SkeletonRow = React32.forwardRef(
6146
6432
  }, ref) => {
6147
6433
  const rowCount = Math.max(5, count);
6148
6434
  const gridTemplateColumns = columns.map((column) => column.width ?? "1fr").join(" ");
6149
- return /* @__PURE__ */ jsx39(
6435
+ return /* @__PURE__ */ jsx42(
6150
6436
  "div",
6151
6437
  {
6152
6438
  ref,
@@ -6160,7 +6446,7 @@ var SkeletonRow = React32.forwardRef(
6160
6446
  className
6161
6447
  ),
6162
6448
  ...props,
6163
- children: Array.from({ length: rowCount }, (_, rowIndex) => /* @__PURE__ */ jsx39(
6449
+ children: Array.from({ length: rowCount }, (_, rowIndex) => /* @__PURE__ */ jsx42(
6164
6450
  "div",
6165
6451
  {
6166
6452
  "data-slot": "skeleton-row",
@@ -6168,11 +6454,11 @@ var SkeletonRow = React32.forwardRef(
6168
6454
  "grid min-h-[48px] items-center border-t border-[var(--border-subtle)] first:border-t-0"
6169
6455
  ),
6170
6456
  style: { gridTemplateColumns },
6171
- children: columns.map((column, columnIndex) => /* @__PURE__ */ jsx39(
6457
+ children: columns.map((column, columnIndex) => /* @__PURE__ */ jsx42(
6172
6458
  "div",
6173
6459
  {
6174
6460
  className: "px-[var(--space-2)] py-[var(--space-1)]",
6175
- children: /* @__PURE__ */ jsx39(
6461
+ children: /* @__PURE__ */ jsx42(
6176
6462
  Skeleton,
6177
6463
  {
6178
6464
  shape: "text",
@@ -6192,8 +6478,8 @@ var SkeletonRow = React32.forwardRef(
6192
6478
  }
6193
6479
  );
6194
6480
  SkeletonRow.displayName = "SkeletonRow";
6195
- var Spinner = React32.forwardRef(
6196
- ({ className, size, label = "\uB85C\uB529 \uC911", ...props }, ref) => /* @__PURE__ */ jsx39(
6481
+ var Spinner = React33.forwardRef(
6482
+ ({ className, size, label = "\uB85C\uB529 \uC911", ...props }, ref) => /* @__PURE__ */ jsx42(
6197
6483
  "span",
6198
6484
  {
6199
6485
  ref,
@@ -6207,155 +6493,11 @@ var Spinner = React32.forwardRef(
6207
6493
  );
6208
6494
  Spinner.displayName = "Spinner";
6209
6495
 
6210
- // src/components/ui/icon-button.tsx
6211
- import * as React33 from "react";
6212
- import { cva as cva20 } from "class-variance-authority";
6213
- import { jsx as jsx40, jsxs as jsxs35 } from "react/jsx-runtime";
6214
- var iconButtonVariants = cva20(
6215
- [
6216
- "olun-icon-button relative inline-flex cursor-pointer shrink-0 items-center justify-center",
6217
- "rounded-[var(--radius-sm)] border font-medium",
6218
- "transition-colors motion-reduce:transition-none",
6219
- "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--focus-ring)]",
6220
- "disabled:cursor-not-allowed disabled:bg-[var(--action-disabled-bg)] disabled:text-text-disabled",
6221
- "[&_svg]:pointer-events-none [&_svg]:shrink-0"
6222
- ].join(" "),
6223
- {
6224
- variants: {
6225
- variant: {
6226
- ghost: "border-transparent bg-transparent text-text-secondary hover:bg-[var(--action-hover)] hover:text-foreground",
6227
- outline: "border-[var(--border-subtle)] bg-[var(--bg-surface)] text-text-secondary hover:border-[var(--border-accent)] hover:bg-[var(--action-hover)] hover:text-foreground",
6228
- subtle: "border-transparent bg-[var(--bg-raised)] text-text-secondary hover:bg-[var(--action-hover)] hover:text-foreground",
6229
- danger: "border-transparent bg-[var(--error-bg)] text-[var(--error)] hover:bg-[var(--action-hover)]"
6230
- },
6231
- size: {
6232
- sm: "size-[var(--space-4)]",
6233
- md: "size-[var(--touch-target-min)]",
6234
- lg: "size-[var(--space-6)]"
6235
- },
6236
- pressed: {
6237
- true: "",
6238
- false: ""
6239
- }
6240
- },
6241
- compoundVariants: [
6242
- {
6243
- pressed: true,
6244
- variant: ["ghost", "outline", "subtle"],
6245
- className: "border-[var(--border-accent)] bg-[var(--action-selected)] text-foreground"
6246
- },
6247
- {
6248
- pressed: true,
6249
- variant: "danger",
6250
- className: "border-[var(--error)] bg-[var(--error-bg)] text-[var(--error)]"
6251
- }
6252
- ],
6253
- defaultVariants: {
6254
- variant: "ghost",
6255
- size: "md",
6256
- pressed: false
6257
- }
6258
- }
6259
- );
6260
- var iconButtonBadgeVariants = cva20(
6261
- [
6262
- "pointer-events-none absolute right-0 top-0 inline-flex",
6263
- "olun-icon-button__badge",
6264
- "min-h-[var(--space-1-5)] min-w-[var(--space-1-5)] translate-x-1/3 -translate-y-1/3",
6265
- "items-center justify-center gap-[2px] rounded-[var(--radius-full)] px-[3px]",
6266
- "font-[family-name:var(--font-display)] text-[10px] font-semibold leading-none",
6267
- "[&:has(svg)]:size-[var(--space-1-5)] [&:has(svg)]:px-0 [&_svg]:size-[10px]"
6268
- ].join(" "),
6269
- {
6270
- variants: {
6271
- tone: {
6272
- info: "bg-[var(--accent-solid)] text-[var(--accent-on-solid)]",
6273
- error: "bg-[var(--error)] text-[var(--error-contrast)]"
6274
- }
6275
- },
6276
- defaultVariants: {
6277
- tone: "info"
6278
- }
6279
- }
6280
- );
6281
- var iconSize3 = {
6282
- sm: 14,
6283
- md: 16,
6284
- lg: 18
6285
- };
6286
- var iconStrokeWidth = {
6287
- sm: 2.25,
6288
- md: 2.25,
6289
- lg: 1.75
6290
- };
6291
- var IconButton = React33.forwardRef(
6292
- ({
6293
- className,
6294
- variant = "ghost",
6295
- size = "md",
6296
- pressed = false,
6297
- icon: Icon,
6298
- badge,
6299
- badgeTone = "info",
6300
- type,
6301
- title,
6302
- "aria-label": ariaLabel,
6303
- "aria-labelledby": ariaLabelledBy,
6304
- ...props
6305
- }, ref) => {
6306
- const resolvedSize = size ?? "md";
6307
- const isToggle = pressed !== void 0;
6308
- const isPressed = pressed === true;
6309
- const hoverTitle = title ?? (typeof ariaLabel === "string" ? ariaLabel : void 0);
6310
- return /* @__PURE__ */ jsxs35(
6311
- "button",
6312
- {
6313
- ref,
6314
- ...props,
6315
- "data-slot": "icon-button",
6316
- "data-variant": variant,
6317
- "data-size": resolvedSize,
6318
- "data-pressed": isToggle ? String(isPressed) : void 0,
6319
- "aria-label": ariaLabel,
6320
- "aria-labelledby": ariaLabelledBy,
6321
- "aria-pressed": isToggle ? isPressed : void 0,
6322
- title: hoverTitle,
6323
- className: cn(
6324
- iconButtonVariants({ variant, size, pressed: isPressed, className })
6325
- ),
6326
- type: type ?? "button",
6327
- children: [
6328
- /* @__PURE__ */ jsx40(
6329
- Icon,
6330
- {
6331
- "aria-hidden": "true",
6332
- "data-slot": "icon-button-icon",
6333
- size: iconSize3[resolvedSize],
6334
- strokeWidth: iconStrokeWidth[resolvedSize]
6335
- }
6336
- ),
6337
- badge !== void 0 ? /* @__PURE__ */ jsx40(
6338
- "span",
6339
- {
6340
- "aria-hidden": "true",
6341
- "data-slot": "icon-button-badge",
6342
- "data-badge-tone": badgeTone,
6343
- className: iconButtonBadgeVariants({ tone: badgeTone }),
6344
- children: badge
6345
- }
6346
- ) : null
6347
- ]
6348
- }
6349
- );
6350
- }
6351
- );
6352
- IconButton.displayName = "IconButton";
6353
-
6354
6496
  // src/components/ui/pagination.tsx
6355
6497
  import * as React34 from "react";
6356
6498
  import { ChevronsLeft, ChevronLeft, ChevronRight, ChevronsRight } from "lucide-react";
6357
6499
  import { cva as cva21 } from "class-variance-authority";
6358
- import { jsx as jsx41, jsxs as jsxs36 } from "react/jsx-runtime";
6500
+ import { jsx as jsx43, jsxs as jsxs38 } from "react/jsx-runtime";
6359
6501
  var paginationVariants = cva21(
6360
6502
  [
6361
6503
  "flex w-full flex-col gap-[var(--space-1-5)]",
@@ -6430,7 +6572,7 @@ function NavigationButton({
6430
6572
  icon: Icon,
6431
6573
  onPageChange
6432
6574
  }) {
6433
- return /* @__PURE__ */ jsx41(
6575
+ return /* @__PURE__ */ jsx43(
6434
6576
  "button",
6435
6577
  {
6436
6578
  "aria-label": label,
@@ -6438,7 +6580,7 @@ function NavigationButton({
6438
6580
  className: paginationControlVariants({ size }),
6439
6581
  type: "button",
6440
6582
  onClick: () => onPageChange?.(page),
6441
- children: /* @__PURE__ */ jsx41(Icon, { "aria-hidden": "true", "data-slot": "pagination-icon" })
6583
+ children: /* @__PURE__ */ jsx43(Icon, { "aria-hidden": "true", "data-slot": "pagination-icon" })
6442
6584
  }
6443
6585
  );
6444
6586
  }
@@ -6470,7 +6612,7 @@ var Pagination = React34.forwardRef(
6470
6612
  value: String(option),
6471
6613
  label: option
6472
6614
  }));
6473
- return /* @__PURE__ */ jsxs36(
6615
+ return /* @__PURE__ */ jsxs38(
6474
6616
  "nav",
6475
6617
  {
6476
6618
  ref,
@@ -6480,16 +6622,16 @@ var Pagination = React34.forwardRef(
6480
6622
  className: cn(paginationVariants({ size: resolvedSize, className })),
6481
6623
  ...props,
6482
6624
  children: [
6483
- /* @__PURE__ */ jsxs36("div", { className: "flex flex-wrap items-center gap-[var(--space-1-5)]", children: [
6484
- /* @__PURE__ */ jsx41("span", { "data-slot": "pagination-total", className: "font-medium text-text-secondary", children: totalLabel(total) }),
6485
- /* @__PURE__ */ jsxs36(
6625
+ /* @__PURE__ */ jsxs38("div", { className: "flex flex-wrap items-center gap-[var(--space-1-5)]", children: [
6626
+ /* @__PURE__ */ jsx43("span", { "data-slot": "pagination-total", className: "font-medium text-text-secondary", children: totalLabel(total) }),
6627
+ /* @__PURE__ */ jsxs38(
6486
6628
  "div",
6487
6629
  {
6488
6630
  "data-slot": "pagination-size",
6489
6631
  className: "inline-flex items-center gap-[var(--space-1)] text-xs text-text-tertiary",
6490
6632
  children: [
6491
- /* @__PURE__ */ jsx41("span", { children: pageSizeLabel }),
6492
- /* @__PURE__ */ jsx41(
6633
+ /* @__PURE__ */ jsx43("span", { children: pageSizeLabel }),
6634
+ /* @__PURE__ */ jsx43(
6493
6635
  Select,
6494
6636
  {
6495
6637
  "aria-label": pageSizeLabel,
@@ -6505,13 +6647,13 @@ var Pagination = React34.forwardRef(
6505
6647
  }
6506
6648
  )
6507
6649
  ] }),
6508
- /* @__PURE__ */ jsxs36(
6650
+ /* @__PURE__ */ jsxs38(
6509
6651
  "div",
6510
6652
  {
6511
6653
  "data-slot": "pagination-list",
6512
6654
  className: "flex items-center justify-center gap-[var(--space-0-5)]",
6513
6655
  children: [
6514
- /* @__PURE__ */ jsx41(
6656
+ /* @__PURE__ */ jsx43(
6515
6657
  NavigationButton,
6516
6658
  {
6517
6659
  label: "\uCCAB \uD398\uC774\uC9C0",
@@ -6522,7 +6664,7 @@ var Pagination = React34.forwardRef(
6522
6664
  onPageChange
6523
6665
  }
6524
6666
  ),
6525
- /* @__PURE__ */ jsx41(
6667
+ /* @__PURE__ */ jsx43(
6526
6668
  NavigationButton,
6527
6669
  {
6528
6670
  label: "\uC774\uC804 \uD398\uC774\uC9C0",
@@ -6534,7 +6676,7 @@ var Pagination = React34.forwardRef(
6534
6676
  }
6535
6677
  ),
6536
6678
  items.map(
6537
- (item, index) => item === "ellipsis" ? /* @__PURE__ */ jsx41(
6679
+ (item, index) => item === "ellipsis" ? /* @__PURE__ */ jsx43(
6538
6680
  "span",
6539
6681
  {
6540
6682
  "data-slot": "pagination-ellipsis",
@@ -6546,7 +6688,7 @@ var Pagination = React34.forwardRef(
6546
6688
  children: "..."
6547
6689
  },
6548
6690
  `ellipsis-${index}`
6549
- ) : /* @__PURE__ */ jsx41(
6691
+ ) : /* @__PURE__ */ jsx43(
6550
6692
  "button",
6551
6693
  {
6552
6694
  "aria-label": `${item} \uD398\uC774\uC9C0`,
@@ -6560,7 +6702,7 @@ var Pagination = React34.forwardRef(
6560
6702
  item
6561
6703
  )
6562
6704
  ),
6563
- /* @__PURE__ */ jsx41(
6705
+ /* @__PURE__ */ jsx43(
6564
6706
  NavigationButton,
6565
6707
  {
6566
6708
  label: "\uB2E4\uC74C \uD398\uC774\uC9C0",
@@ -6571,7 +6713,7 @@ var Pagination = React34.forwardRef(
6571
6713
  onPageChange
6572
6714
  }
6573
6715
  ),
6574
- /* @__PURE__ */ jsx41(
6716
+ /* @__PURE__ */ jsx43(
6575
6717
  NavigationButton,
6576
6718
  {
6577
6719
  label: "\uB9C8\uC9C0\uB9C9 \uD398\uC774\uC9C0",
@@ -6594,7 +6736,7 @@ Pagination.displayName = "Pagination";
6594
6736
 
6595
6737
  // src/components/ui/mode-toggle.tsx
6596
6738
  import { cva as cva22 } from "class-variance-authority";
6597
- import { jsx as jsx42, jsxs as jsxs37 } from "react/jsx-runtime";
6739
+ import { jsx as jsx44, jsxs as jsxs39 } from "react/jsx-runtime";
6598
6740
  var modeToggleVariants = cva22(
6599
6741
  [
6600
6742
  "inline-flex items-center rounded-[var(--radius-sm)] border border-[var(--border-subtle)]",
@@ -6624,7 +6766,7 @@ function ModeToggle({
6624
6766
  onChange,
6625
6767
  ...props
6626
6768
  }) {
6627
- return /* @__PURE__ */ jsx42(
6769
+ return /* @__PURE__ */ jsx44(
6628
6770
  "div",
6629
6771
  {
6630
6772
  role: "group",
@@ -6634,7 +6776,7 @@ function ModeToggle({
6634
6776
  children: options.map((option) => {
6635
6777
  const Icon = option.icon;
6636
6778
  const isActive = option.value === value;
6637
- return /* @__PURE__ */ jsxs37(
6779
+ return /* @__PURE__ */ jsxs39(
6638
6780
  "button",
6639
6781
  {
6640
6782
  type: "button",
@@ -6650,8 +6792,8 @@ function ModeToggle({
6650
6792
  }
6651
6793
  },
6652
6794
  children: [
6653
- Icon ? /* @__PURE__ */ jsx42(Icon, { "aria-hidden": "true", "data-slot": "mode-toggle-icon" }) : null,
6654
- /* @__PURE__ */ jsx42("span", { children: option.label })
6795
+ Icon ? /* @__PURE__ */ jsx44(Icon, { "aria-hidden": "true", "data-slot": "mode-toggle-icon" }) : null,
6796
+ /* @__PURE__ */ jsx44("span", { children: option.label })
6655
6797
  ]
6656
6798
  },
6657
6799
  option.value
@@ -6664,7 +6806,7 @@ function ModeToggle({
6664
6806
  // src/components/ui/action-footer.tsx
6665
6807
  import * as React35 from "react";
6666
6808
  import { cva as cva23 } from "class-variance-authority";
6667
- import { jsx as jsx43, jsxs as jsxs38 } from "react/jsx-runtime";
6809
+ import { jsx as jsx45, jsxs as jsxs40 } from "react/jsx-runtime";
6668
6810
  var actionFooterVariants = cva23(
6669
6811
  [
6670
6812
  "flex flex-wrap items-center gap-[var(--space-2)] border-t border-[var(--border-subtle)]",
@@ -6735,7 +6877,7 @@ function getStatusLabel(status) {
6735
6877
  }
6736
6878
  }
6737
6879
  function renderAction(action) {
6738
- return /* @__PURE__ */ jsx43(
6880
+ return /* @__PURE__ */ jsx45(
6739
6881
  Button,
6740
6882
  {
6741
6883
  variant: action.variant,
@@ -6766,7 +6908,7 @@ var ActionFooter = React35.forwardRef(
6766
6908
  const mainActions = sortMainActions(
6767
6909
  visibleActions.filter((action) => !destructiveVariants.has(action.variant ?? "default"))
6768
6910
  );
6769
- return /* @__PURE__ */ jsxs38(
6911
+ return /* @__PURE__ */ jsxs40(
6770
6912
  "div",
6771
6913
  {
6772
6914
  ref,
@@ -6775,7 +6917,7 @@ var ActionFooter = React35.forwardRef(
6775
6917
  className: cn(actionFooterVariants({ position, surface, className })),
6776
6918
  ...props,
6777
6919
  children: [
6778
- destructiveActions.length > 0 ? /* @__PURE__ */ jsx43(
6920
+ destructiveActions.length > 0 ? /* @__PURE__ */ jsx45(
6779
6921
  "div",
6780
6922
  {
6781
6923
  "data-slot": "action-footer-destructive-actions",
@@ -6783,7 +6925,7 @@ var ActionFooter = React35.forwardRef(
6783
6925
  children: destructiveActions.map(renderAction)
6784
6926
  }
6785
6927
  ) : null,
6786
- status ? /* @__PURE__ */ jsxs38(
6928
+ status ? /* @__PURE__ */ jsxs40(
6787
6929
  "div",
6788
6930
  {
6789
6931
  "data-slot": "action-footer-status",
@@ -6791,7 +6933,7 @@ var ActionFooter = React35.forwardRef(
6791
6933
  "aria-live": "polite",
6792
6934
  className: cn(actionFooterStatusVariants({ kind: status.kind })),
6793
6935
  children: [
6794
- /* @__PURE__ */ jsx43(
6936
+ /* @__PURE__ */ jsx45(
6795
6937
  "span",
6796
6938
  {
6797
6939
  "aria-hidden": "true",
@@ -6799,11 +6941,11 @@ var ActionFooter = React35.forwardRef(
6799
6941
  className: "size-[6px] shrink-0 rounded-[var(--radius-full)]"
6800
6942
  }
6801
6943
  ),
6802
- /* @__PURE__ */ jsx43("span", { className: "truncate", children: getStatusLabel(status) })
6944
+ /* @__PURE__ */ jsx45("span", { className: "truncate", children: getStatusLabel(status) })
6803
6945
  ]
6804
6946
  }
6805
6947
  ) : null,
6806
- /* @__PURE__ */ jsx43(
6948
+ /* @__PURE__ */ jsx45(
6807
6949
  "div",
6808
6950
  {
6809
6951
  "data-slot": "action-footer-main-actions",
@@ -6820,9 +6962,9 @@ ActionFooter.displayName = "ActionFooter";
6820
6962
 
6821
6963
  // src/components/ui/toast.tsx
6822
6964
  import * as React36 from "react";
6823
- import { AlertCircle as AlertCircle5, AlertTriangle as AlertTriangle3, CheckCircle2 as CheckCircle25, Info as Info2, X as X4 } from "lucide-react";
6965
+ import { AlertCircle as AlertCircle5, AlertTriangle as AlertTriangle3, CheckCircle2 as CheckCircle25, Info as Info2, X as X5 } from "lucide-react";
6824
6966
  import { cva as cva24 } from "class-variance-authority";
6825
- import { jsx as jsx44, jsxs as jsxs39 } from "react/jsx-runtime";
6967
+ import { jsx as jsx46, jsxs as jsxs41 } from "react/jsx-runtime";
6826
6968
  var toastVariants = cva24(
6827
6969
  [
6828
6970
  "grid min-w-[280px] max-w-[420px] grid-cols-[auto_1fr_auto] items-center",
@@ -6921,7 +7063,7 @@ var ToastRoot = React36.forwardRef(
6921
7063
  }, ref) => {
6922
7064
  const Icon = toastIcons[variant];
6923
7065
  const hasIcon = Icon !== null;
6924
- return /* @__PURE__ */ jsxs39(
7066
+ return /* @__PURE__ */ jsxs41(
6925
7067
  "div",
6926
7068
  {
6927
7069
  ref,
@@ -6937,7 +7079,7 @@ var ToastRoot = React36.forwardRef(
6937
7079
  ),
6938
7080
  ...props,
6939
7081
  children: [
6940
- Icon ? /* @__PURE__ */ jsx44(
7082
+ Icon ? /* @__PURE__ */ jsx46(
6941
7083
  Icon,
6942
7084
  {
6943
7085
  "aria-hidden": "true",
@@ -6947,9 +7089,9 @@ var ToastRoot = React36.forwardRef(
6947
7089
  className: "shrink-0"
6948
7090
  }
6949
7091
  ) : null,
6950
- /* @__PURE__ */ jsxs39("div", { "data-slot": "toast-body", className: "min-w-0", children: [
6951
- /* @__PURE__ */ jsx44("div", { "data-slot": "toast-message", className: "font-normal", children: message }),
6952
- action ? /* @__PURE__ */ jsx44(
7092
+ /* @__PURE__ */ jsxs41("div", { "data-slot": "toast-body", className: "min-w-0", children: [
7093
+ /* @__PURE__ */ jsx46("div", { "data-slot": "toast-message", className: "font-normal", children: message }),
7094
+ action ? /* @__PURE__ */ jsx46(
6953
7095
  Button,
6954
7096
  {
6955
7097
  "data-slot": "toast-action",
@@ -6961,7 +7103,7 @@ var ToastRoot = React36.forwardRef(
6961
7103
  }
6962
7104
  ) : null
6963
7105
  ] }),
6964
- /* @__PURE__ */ jsx44(
7106
+ /* @__PURE__ */ jsx46(
6965
7107
  "button",
6966
7108
  {
6967
7109
  type: "button",
@@ -6973,7 +7115,7 @@ var ToastRoot = React36.forwardRef(
6973
7115
  "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--focus-ring)]"
6974
7116
  ),
6975
7117
  onClick: onClose,
6976
- children: /* @__PURE__ */ jsx44(X4, { "aria-hidden": "true", size: 16, strokeWidth: 1.75 })
7118
+ children: /* @__PURE__ */ jsx46(X5, { "aria-hidden": "true", size: 16, strokeWidth: 1.75 })
6977
7119
  }
6978
7120
  )
6979
7121
  ]
@@ -6982,7 +7124,7 @@ var ToastRoot = React36.forwardRef(
6982
7124
  }
6983
7125
  );
6984
7126
  ToastRoot.displayName = "ToastRoot";
6985
- var ToastViewport = React36.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx44(
7127
+ var ToastViewport = React36.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx46(
6986
7128
  "ol",
6987
7129
  {
6988
7130
  ref,
@@ -7000,9 +7142,9 @@ function ToastProvider({ children, maxToasts = 3, className, ...props }) {
7000
7142
  }),
7001
7143
  [maxToasts]
7002
7144
  );
7003
- return /* @__PURE__ */ jsxs39("div", { "data-slot": "toast-provider", className, ...props, children: [
7145
+ return /* @__PURE__ */ jsxs41("div", { "data-slot": "toast-provider", className, ...props, children: [
7004
7146
  children,
7005
- /* @__PURE__ */ jsx44(ToastViewport, { children: items.map((item) => /* @__PURE__ */ jsx44("li", { children: /* @__PURE__ */ jsx44(ToastRoot, { ...item, onClose: () => toast.dismiss(item.id) }) }, item.id)) })
7147
+ /* @__PURE__ */ jsx46(ToastViewport, { children: items.map((item) => /* @__PURE__ */ jsx46("li", { children: /* @__PURE__ */ jsx46(ToastRoot, { ...item, onClose: () => toast.dismiss(item.id) }) }, item.id)) })
7006
7148
  ] });
7007
7149
  }
7008
7150
 
@@ -7010,7 +7152,7 @@ function ToastProvider({ children, maxToasts = 3, className, ...props }) {
7010
7152
  import * as React37 from "react";
7011
7153
  import { cva as cva25 } from "class-variance-authority";
7012
7154
  import { AlertCircle as AlertCircle6 } from "lucide-react";
7013
- import { Fragment as Fragment8, jsx as jsx45, jsxs as jsxs40 } from "react/jsx-runtime";
7155
+ import { Fragment as Fragment8, jsx as jsx47, jsxs as jsxs42 } from "react/jsx-runtime";
7014
7156
  var otpFieldVariants = cva25("flex w-full flex-col gap-[var(--space-1-5)]", {
7015
7157
  variants: {
7016
7158
  size: {
@@ -7022,20 +7164,25 @@ var otpFieldVariants = cva25("flex w-full flex-col gap-[var(--space-1-5)]", {
7022
7164
  size: "default"
7023
7165
  }
7024
7166
  });
7025
- var otpFieldGroupVariants = cva25("flex flex-wrap items-start gap-[var(--space-1)] pt-[var(--space-0-5)]", {
7167
+ var otpFieldGroupVariants = cva25("flex items-start gap-[var(--space-1)] pt-[var(--space-0-5)]", {
7026
7168
  variants: {
7027
7169
  size: {
7028
7170
  default: "",
7029
7171
  compact: ""
7172
+ },
7173
+ fluid: {
7174
+ true: "flex-nowrap justify-center",
7175
+ false: "flex-wrap"
7030
7176
  }
7031
7177
  },
7032
7178
  defaultVariants: {
7033
- size: "default"
7179
+ size: "default",
7180
+ fluid: false
7034
7181
  }
7035
7182
  });
7036
7183
  var otpCellVariants = cva25(
7037
7184
  [
7038
- "flex shrink-0 items-center justify-center rounded-[var(--radius-sm)] border",
7185
+ "flex items-center justify-center rounded-[var(--radius-sm)] border",
7039
7186
  "border-[var(--border)] text-foreground",
7040
7187
  "font-[family-name:var(--font-display)] tabular-nums",
7041
7188
  "text-center leading-none caret-[var(--accent-fg)]",
@@ -7050,13 +7197,40 @@ var otpCellVariants = cva25(
7050
7197
  {
7051
7198
  variants: {
7052
7199
  size: {
7053
- default: "h-[60px] w-[52px] text-[24px]",
7054
- compact: "h-[52px] w-[44px] text-[20px]"
7200
+ default: "h-[60px] text-[24px]",
7201
+ compact: "h-[52px] text-[20px]"
7202
+ },
7203
+ fluid: {
7204
+ true: "min-w-0 flex-1",
7205
+ false: "shrink-0"
7055
7206
  },
7056
7207
  surface: fieldSurfaceClassNames
7057
7208
  },
7209
+ compoundVariants: [
7210
+ {
7211
+ size: "default",
7212
+ fluid: false,
7213
+ className: "w-[52px]"
7214
+ },
7215
+ {
7216
+ size: "compact",
7217
+ fluid: false,
7218
+ className: "w-[44px]"
7219
+ },
7220
+ {
7221
+ size: "default",
7222
+ fluid: true,
7223
+ className: "max-w-[52px]"
7224
+ },
7225
+ {
7226
+ size: "compact",
7227
+ fluid: true,
7228
+ className: "max-w-[44px]"
7229
+ }
7230
+ ],
7058
7231
  defaultVariants: {
7059
7232
  size: "default",
7233
+ fluid: false,
7060
7234
  surface: "surface"
7061
7235
  }
7062
7236
  }
@@ -7114,6 +7288,7 @@ var OTPField = React37.forwardRef(
7114
7288
  helperText,
7115
7289
  id,
7116
7290
  invalid,
7291
+ fluid = false,
7117
7292
  label,
7118
7293
  length = 6,
7119
7294
  name,
@@ -7162,7 +7337,7 @@ var OTPField = React37.forwardRef(
7162
7337
  },
7163
7338
  [disabled, isControlled, length, onComplete, onValueChange]
7164
7339
  );
7165
- return /* @__PURE__ */ jsxs40(
7340
+ return /* @__PURE__ */ jsxs42(
7166
7341
  "fieldset",
7167
7342
  {
7168
7343
  ref,
@@ -7175,7 +7350,7 @@ var OTPField = React37.forwardRef(
7175
7350
  className: cn(otpFieldVariants({ size, className })),
7176
7351
  ...props,
7177
7352
  children: [
7178
- /* @__PURE__ */ jsx45(
7353
+ /* @__PURE__ */ jsx47(
7179
7354
  "legend",
7180
7355
  {
7181
7356
  id: labelId,
@@ -7184,17 +7359,17 @@ var OTPField = React37.forwardRef(
7184
7359
  children: label
7185
7360
  }
7186
7361
  ),
7187
- /* @__PURE__ */ jsx45(
7362
+ /* @__PURE__ */ jsx47(
7188
7363
  "div",
7189
7364
  {
7190
7365
  "data-slot": "otp-field-group",
7191
7366
  "aria-labelledby": labelId,
7192
7367
  "aria-describedby": groupDescribedBy,
7193
- className: cn(otpFieldGroupVariants({ size })),
7368
+ className: cn(otpFieldGroupVariants({ size, fluid })),
7194
7369
  children: Array.from({ length }, (_, index) => {
7195
7370
  const digit = resolvedSlots[index] ?? "";
7196
7371
  const inputId = `${fieldId}-cell-${index + 1}`;
7197
- return /* @__PURE__ */ jsx45(
7372
+ return /* @__PURE__ */ jsx47(
7198
7373
  "input",
7199
7374
  {
7200
7375
  ref: (node) => {
@@ -7282,22 +7457,22 @@ var OTPField = React37.forwardRef(
7282
7457
  onFocus: (event) => {
7283
7458
  event.currentTarget.select();
7284
7459
  },
7285
- className: cn(otpCellVariants({ size, surface }))
7460
+ className: cn(otpCellVariants({ size, surface, fluid }))
7286
7461
  },
7287
7462
  inputId
7288
7463
  );
7289
7464
  })
7290
7465
  }
7291
7466
  ),
7292
- helperText || errorText ? /* @__PURE__ */ jsx45(
7467
+ helperText || errorText ? /* @__PURE__ */ jsx47(
7293
7468
  "p",
7294
7469
  {
7295
7470
  id: errorText ? errorId : helperId,
7296
7471
  "data-slot": "otp-field-message",
7297
7472
  "data-kind": errorText ? "error" : "helper",
7298
7473
  className: otpFieldMessageVariants({ state: resolvedState }),
7299
- children: errorText ? /* @__PURE__ */ jsxs40(Fragment8, { children: [
7300
- /* @__PURE__ */ jsx45(
7474
+ children: errorText ? /* @__PURE__ */ jsxs42(Fragment8, { children: [
7475
+ /* @__PURE__ */ jsx47(
7301
7476
  AlertCircle6,
7302
7477
  {
7303
7478
  "aria-hidden": "true",
@@ -7305,11 +7480,11 @@ var OTPField = React37.forwardRef(
7305
7480
  strokeWidth: 2
7306
7481
  }
7307
7482
  ),
7308
- /* @__PURE__ */ jsx45("span", { children: errorText })
7309
- ] }) : /* @__PURE__ */ jsx45("span", { children: helperText })
7483
+ /* @__PURE__ */ jsx47("span", { children: errorText })
7484
+ ] }) : /* @__PURE__ */ jsx47("span", { children: helperText })
7310
7485
  }
7311
7486
  ) : null,
7312
- name ? /* @__PURE__ */ jsx45(
7487
+ name ? /* @__PURE__ */ jsx47(
7313
7488
  "input",
7314
7489
  {
7315
7490
  "aria-hidden": "true",
@@ -7331,9 +7506,9 @@ OTPField.displayName = "OTPField";
7331
7506
 
7332
7507
  // src/components/ui/search-field.tsx
7333
7508
  import * as React38 from "react";
7334
- import { Search, X as X5 } from "lucide-react";
7509
+ import { Search, X as X6 } from "lucide-react";
7335
7510
  import { cva as cva26 } from "class-variance-authority";
7336
- import { jsx as jsx46, jsxs as jsxs41 } from "react/jsx-runtime";
7511
+ import { jsx as jsx48, jsxs as jsxs43 } from "react/jsx-runtime";
7337
7512
  var searchFieldVariants = cva26("relative flex w-full items-center", {
7338
7513
  variants: {
7339
7514
  size: {
@@ -7432,14 +7607,14 @@ var SearchField = React38.forwardRef(
7432
7607
  }
7433
7608
  onClear?.();
7434
7609
  };
7435
- return /* @__PURE__ */ jsxs41(
7610
+ return /* @__PURE__ */ jsxs43(
7436
7611
  "div",
7437
7612
  {
7438
7613
  "data-slot": "search-field",
7439
7614
  "data-size": resolvedSize,
7440
7615
  className: cn(searchFieldVariants({ size, className })),
7441
7616
  children: [
7442
- /* @__PURE__ */ jsx46(
7617
+ /* @__PURE__ */ jsx48(
7443
7618
  Search,
7444
7619
  {
7445
7620
  "aria-hidden": "true",
@@ -7449,7 +7624,7 @@ var SearchField = React38.forwardRef(
7449
7624
  strokeWidth: resolvedSize === "sm" ? 2 : 1.75
7450
7625
  }
7451
7626
  ),
7452
- /* @__PURE__ */ jsx46(
7627
+ /* @__PURE__ */ jsx48(
7453
7628
  "input",
7454
7629
  {
7455
7630
  ref: inputRef,
@@ -7470,7 +7645,7 @@ var SearchField = React38.forwardRef(
7470
7645
  ...props
7471
7646
  }
7472
7647
  ),
7473
- showClear ? /* @__PURE__ */ jsx46(
7648
+ showClear ? /* @__PURE__ */ jsx48(
7474
7649
  "button",
7475
7650
  {
7476
7651
  type: "button",
@@ -7478,7 +7653,7 @@ var SearchField = React38.forwardRef(
7478
7653
  "data-slot": "search-field-clear",
7479
7654
  className: "absolute right-[8px] top-1/2 inline-flex size-[var(--space-2)] -translate-y-1/2 cursor-pointer items-center justify-center rounded-[var(--radius-full)] text-text-tertiary transition-colors hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-[var(--focus-ring)]",
7480
7655
  onClick: clearInput,
7481
- children: /* @__PURE__ */ jsx46(X5, { "aria-hidden": "true", size: 16, strokeWidth: 1.75 })
7656
+ children: /* @__PURE__ */ jsx48(X6, { "aria-hidden": "true", size: 16, strokeWidth: 1.75 })
7482
7657
  }
7483
7658
  ) : null
7484
7659
  ]
@@ -7491,7 +7666,7 @@ SearchField.displayName = "SearchField";
7491
7666
  // src/components/ui/checkbox-group.tsx
7492
7667
  import * as React39 from "react";
7493
7668
  import { cva as cva27 } from "class-variance-authority";
7494
- import { jsx as jsx47 } from "react/jsx-runtime";
7669
+ import { jsx as jsx49 } from "react/jsx-runtime";
7495
7670
  var checkboxGroupVariants = cva27("gap-[var(--space-1)]", {
7496
7671
  variants: {
7497
7672
  appearance: {
@@ -7567,7 +7742,7 @@ var CheckboxGroup = React39.forwardRef(
7567
7742
  }),
7568
7743
  [appearance, density, disabled, name, selectedValues, toggleValue]
7569
7744
  );
7570
- return /* @__PURE__ */ jsx47(CheckboxGroupContext.Provider, { value: contextValue, children: /* @__PURE__ */ jsx47(
7745
+ return /* @__PURE__ */ jsx49(CheckboxGroupContext.Provider, { value: contextValue, children: /* @__PURE__ */ jsx49(
7571
7746
  "div",
7572
7747
  {
7573
7748
  ref,
@@ -7595,7 +7770,7 @@ import * as React40 from "react";
7595
7770
  import { cva as cva28 } from "class-variance-authority";
7596
7771
  import { Circle } from "lucide-react";
7597
7772
  import { RadioGroup as RadioGroupPrimitive } from "radix-ui";
7598
- import { jsx as jsx48, jsxs as jsxs42 } from "react/jsx-runtime";
7773
+ import { jsx as jsx50, jsxs as jsxs44 } from "react/jsx-runtime";
7599
7774
  var radioGroupVariants = cva28("gap-[var(--space-1)]", {
7600
7775
  variants: {
7601
7776
  appearance: {
@@ -7703,7 +7878,7 @@ var RadioGroup = React40.forwardRef(
7703
7878
  () => ({ appearance, density }),
7704
7879
  [appearance, density]
7705
7880
  );
7706
- return /* @__PURE__ */ jsx48(RadioGroupContext.Provider, { value: contextValue, children: /* @__PURE__ */ jsx48(
7881
+ return /* @__PURE__ */ jsx50(RadioGroupContext.Provider, { value: contextValue, children: /* @__PURE__ */ jsx50(
7707
7882
  RadioGroupPrimitive.Root,
7708
7883
  {
7709
7884
  ref,
@@ -7732,7 +7907,7 @@ var Radio = React40.forwardRef(({ className, children, description, id, ...props
7732
7907
  const radioId = id ?? generatedId;
7733
7908
  const labelId = `${radioId}-label`;
7734
7909
  const descriptionId = description ? `${radioId}-description` : void 0;
7735
- return /* @__PURE__ */ jsxs42(
7910
+ return /* @__PURE__ */ jsxs44(
7736
7911
  RadioGroupPrimitive.Item,
7737
7912
  {
7738
7913
  ref,
@@ -7743,24 +7918,24 @@ var Radio = React40.forwardRef(({ className, children, description, id, ...props
7743
7918
  className: cn(radioVariants({ appearance, density }), className),
7744
7919
  ...props,
7745
7920
  children: [
7746
- /* @__PURE__ */ jsx48(
7921
+ /* @__PURE__ */ jsx50(
7747
7922
  "span",
7748
7923
  {
7749
7924
  "aria-hidden": "true",
7750
7925
  "data-slot": "radio-control",
7751
7926
  className: radioControlVariants({ appearance }),
7752
- children: /* @__PURE__ */ jsx48(
7927
+ children: /* @__PURE__ */ jsx50(
7753
7928
  RadioGroupPrimitive.Indicator,
7754
7929
  {
7755
7930
  "data-slot": "radio-indicator",
7756
7931
  className: "flex items-center justify-center",
7757
- children: /* @__PURE__ */ jsx48(Circle, { "aria-hidden": "true", size: 8, fill: "currentColor" })
7932
+ children: /* @__PURE__ */ jsx50(Circle, { "aria-hidden": "true", size: 8, fill: "currentColor" })
7758
7933
  }
7759
7934
  )
7760
7935
  }
7761
7936
  ),
7762
- /* @__PURE__ */ jsxs42("span", { className: "flex min-w-0 flex-col gap-[var(--space-0-5)]", children: [
7763
- /* @__PURE__ */ jsx48(
7937
+ /* @__PURE__ */ jsxs44("span", { className: "flex min-w-0 flex-col gap-[var(--space-0-5)]", children: [
7938
+ /* @__PURE__ */ jsx50(
7764
7939
  "span",
7765
7940
  {
7766
7941
  id: labelId,
@@ -7772,7 +7947,7 @@ var Radio = React40.forwardRef(({ className, children, description, id, ...props
7772
7947
  children
7773
7948
  }
7774
7949
  ),
7775
- description ? /* @__PURE__ */ jsx48(
7950
+ description ? /* @__PURE__ */ jsx50(
7776
7951
  "span",
7777
7952
  {
7778
7953
  id: descriptionId,
@@ -7790,20 +7965,20 @@ Radio.displayName = "Radio";
7790
7965
 
7791
7966
  // src/components/ui/scroll-area.tsx
7792
7967
  import { ScrollArea as ScrollAreaPrimitive } from "radix-ui";
7793
- import { jsx as jsx49, jsxs as jsxs43 } from "react/jsx-runtime";
7968
+ import { jsx as jsx51, jsxs as jsxs45 } from "react/jsx-runtime";
7794
7969
  function ScrollArea({
7795
7970
  className,
7796
7971
  children,
7797
7972
  ...props
7798
7973
  }) {
7799
- return /* @__PURE__ */ jsxs43(
7974
+ return /* @__PURE__ */ jsxs45(
7800
7975
  ScrollAreaPrimitive.Root,
7801
7976
  {
7802
7977
  "data-slot": "scroll-area",
7803
7978
  className: cn("relative", className),
7804
7979
  ...props,
7805
7980
  children: [
7806
- /* @__PURE__ */ jsx49(
7981
+ /* @__PURE__ */ jsx51(
7807
7982
  ScrollAreaPrimitive.Viewport,
7808
7983
  {
7809
7984
  "data-slot": "scroll-area-viewport",
@@ -7811,8 +7986,8 @@ function ScrollArea({
7811
7986
  children
7812
7987
  }
7813
7988
  ),
7814
- /* @__PURE__ */ jsx49(ScrollBar, {}),
7815
- /* @__PURE__ */ jsx49(ScrollAreaPrimitive.Corner, {})
7989
+ /* @__PURE__ */ jsx51(ScrollBar, {}),
7990
+ /* @__PURE__ */ jsx51(ScrollAreaPrimitive.Corner, {})
7816
7991
  ]
7817
7992
  }
7818
7993
  );
@@ -7822,7 +7997,7 @@ function ScrollBar({
7822
7997
  orientation = "vertical",
7823
7998
  ...props
7824
7999
  }) {
7825
- return /* @__PURE__ */ jsx49(
8000
+ return /* @__PURE__ */ jsx51(
7826
8001
  ScrollAreaPrimitive.ScrollAreaScrollbar,
7827
8002
  {
7828
8003
  "data-slot": "scroll-area-scrollbar",
@@ -7834,7 +8009,7 @@ function ScrollBar({
7834
8009
  className
7835
8010
  ),
7836
8011
  ...props,
7837
- children: /* @__PURE__ */ jsx49(
8012
+ children: /* @__PURE__ */ jsx51(
7838
8013
  ScrollAreaPrimitive.ScrollAreaThumb,
7839
8014
  {
7840
8015
  "data-slot": "scroll-area-thumb",
@@ -7846,7 +8021,7 @@ function ScrollBar({
7846
8021
  }
7847
8022
 
7848
8023
  // src/components/ui/progress.tsx
7849
- import { jsx as jsx50 } from "react/jsx-runtime";
8024
+ import { jsx as jsx52 } from "react/jsx-runtime";
7850
8025
  var progressFillByStatus = {
7851
8026
  active: "bg-[var(--accent-solid)]",
7852
8027
  success: "bg-[var(--success)]",
@@ -7867,7 +8042,7 @@ function Progress({
7867
8042
  const clamped = Math.max(0, Math.min(safeMax, value));
7868
8043
  const percent = clamped / safeMax * 100;
7869
8044
  const w = typeof width === "number" ? `${width}px` : width;
7870
- return /* @__PURE__ */ jsx50(
8045
+ return /* @__PURE__ */ jsx52(
7871
8046
  "div",
7872
8047
  {
7873
8048
  role: "progressbar",
@@ -7881,7 +8056,7 @@ function Progress({
7881
8056
  ),
7882
8057
  style: { width: w, height: `${height}px`, ...style },
7883
8058
  ...props,
7884
- children: /* @__PURE__ */ jsx50(
8059
+ children: /* @__PURE__ */ jsx52(
7885
8060
  "div",
7886
8061
  {
7887
8062
  className: cn(
@@ -7899,7 +8074,7 @@ function Progress({
7899
8074
  import * as React41 from "react";
7900
8075
  import { ChevronRight as ChevronRight2 } from "lucide-react";
7901
8076
  import { cva as cva29 } from "class-variance-authority";
7902
- import { jsx as jsx51, jsxs as jsxs44 } from "react/jsx-runtime";
8077
+ import { jsx as jsx53, jsxs as jsxs46 } from "react/jsx-runtime";
7903
8078
  var treeViewVariants = cva29(
7904
8079
  "m-0 list-none p-[var(--space-0-5)] text-body-sm text-foreground"
7905
8080
  );
@@ -8069,7 +8244,7 @@ function TreeView({
8069
8244
  const selected = node.id === selectedId;
8070
8245
  const isActive = node.id === activeId;
8071
8246
  const itemState = { expanded, selected, depth, hasChildren };
8072
- return /* @__PURE__ */ jsxs44(
8247
+ return /* @__PURE__ */ jsxs46(
8073
8248
  "li",
8074
8249
  {
8075
8250
  ref: (element) => {
@@ -8094,7 +8269,7 @@ function TreeView({
8094
8269
  onSelect?.(node.id, node);
8095
8270
  },
8096
8271
  children: [
8097
- /* @__PURE__ */ jsxs44(
8272
+ /* @__PURE__ */ jsxs46(
8098
8273
  "span",
8099
8274
  {
8100
8275
  "data-slot": "treeitem-row",
@@ -8103,7 +8278,7 @@ function TreeView({
8103
8278
  },
8104
8279
  className: treeItemRowVariants({ selected }),
8105
8280
  children: [
8106
- hasChildren ? /* @__PURE__ */ jsx51(
8281
+ hasChildren ? /* @__PURE__ */ jsx53(
8107
8282
  "span",
8108
8283
  {
8109
8284
  "data-slot": "treeitem-toggle",
@@ -8113,7 +8288,7 @@ function TreeView({
8113
8288
  setExpanded(node.id, !expanded);
8114
8289
  },
8115
8290
  className: "flex size-[var(--space-2)] shrink-0 items-center justify-center text-text-tertiary",
8116
- children: /* @__PURE__ */ jsx51(
8291
+ children: /* @__PURE__ */ jsx53(
8117
8292
  ChevronRight2,
8118
8293
  {
8119
8294
  "aria-hidden": "true",
@@ -8126,7 +8301,7 @@ function TreeView({
8126
8301
  }
8127
8302
  )
8128
8303
  }
8129
- ) : /* @__PURE__ */ jsx51(
8304
+ ) : /* @__PURE__ */ jsx53(
8130
8305
  "span",
8131
8306
  {
8132
8307
  "data-slot": "treeitem-spacer",
@@ -8134,18 +8309,18 @@ function TreeView({
8134
8309
  className: "size-[var(--space-2)] shrink-0"
8135
8310
  }
8136
8311
  ),
8137
- /* @__PURE__ */ jsx51("span", { className: "flex min-w-0 flex-1 items-center gap-[var(--space-1)]", children: renderItem(node, itemState) })
8312
+ /* @__PURE__ */ jsx53("span", { className: "flex min-w-0 flex-1 items-center gap-[var(--space-1)]", children: renderItem(node, itemState) })
8138
8313
  ]
8139
8314
  }
8140
8315
  ),
8141
- hasChildren && expanded && children ? /* @__PURE__ */ jsx51("ul", { role: "group", "data-slot": "tree-group", className: "m-0 list-none p-0", children: renderLevel(children, depth + 1) }) : null
8316
+ hasChildren && expanded && children ? /* @__PURE__ */ jsx53("ul", { role: "group", "data-slot": "tree-group", className: "m-0 list-none p-0", children: renderLevel(children, depth + 1) }) : null
8142
8317
  ]
8143
8318
  },
8144
8319
  node.id
8145
8320
  );
8146
8321
  });
8147
8322
  }
8148
- return /* @__PURE__ */ jsx51(
8323
+ return /* @__PURE__ */ jsx53(
8149
8324
  "ul",
8150
8325
  {
8151
8326
  role: "tree",
@@ -8161,9 +8336,9 @@ function TreeView({
8161
8336
  }
8162
8337
 
8163
8338
  // src/components/branding/olun-logo.tsx
8164
- import { jsx as jsx52, jsxs as jsxs45 } from "react/jsx-runtime";
8339
+ import { jsx as jsx54, jsxs as jsxs47 } from "react/jsx-runtime";
8165
8340
  function OlunSymbol({ size = 28, className }) {
8166
- return /* @__PURE__ */ jsxs45(
8341
+ return /* @__PURE__ */ jsxs47(
8167
8342
  "svg",
8168
8343
  {
8169
8344
  width: size,
@@ -8174,7 +8349,7 @@ function OlunSymbol({ size = 28, className }) {
8174
8349
  className,
8175
8350
  "aria-hidden": "true",
8176
8351
  children: [
8177
- /* @__PURE__ */ jsx52(
8352
+ /* @__PURE__ */ jsx54(
8178
8353
  "circle",
8179
8354
  {
8180
8355
  cx: "108",
@@ -8186,7 +8361,7 @@ function OlunSymbol({ size = 28, className }) {
8186
8361
  style: { color: "var(--text-primary)" }
8187
8362
  }
8188
8363
  ),
8189
- /* @__PURE__ */ jsx52("circle", { cx: "185", cy: "175", r: "22", fill: "var(--accent-solid)" })
8364
+ /* @__PURE__ */ jsx54("circle", { cx: "185", cy: "175", r: "22", fill: "var(--accent-solid)" })
8190
8365
  ]
8191
8366
  }
8192
8367
  );
@@ -8197,7 +8372,7 @@ function OlunLogo({
8197
8372
  showSymbol = true,
8198
8373
  className
8199
8374
  }) {
8200
- return /* @__PURE__ */ jsxs45(
8375
+ return /* @__PURE__ */ jsxs47(
8201
8376
  "div",
8202
8377
  {
8203
8378
  className,
@@ -8207,8 +8382,8 @@ function OlunLogo({
8207
8382
  gap: "var(--space-1-5)"
8208
8383
  },
8209
8384
  children: [
8210
- showSymbol && /* @__PURE__ */ jsx52(OlunSymbol, { size: symbolSize }),
8211
- /* @__PURE__ */ jsxs45(
8385
+ showSymbol && /* @__PURE__ */ jsx54(OlunSymbol, { size: symbolSize }),
8386
+ /* @__PURE__ */ jsxs47(
8212
8387
  "span",
8213
8388
  {
8214
8389
  style: {
@@ -8220,7 +8395,7 @@ function OlunLogo({
8220
8395
  },
8221
8396
  children: [
8222
8397
  "OLUN",
8223
- /* @__PURE__ */ jsx52("span", { style: { color: "var(--accent-fg)" }, children: "." })
8398
+ /* @__PURE__ */ jsx54("span", { style: { color: "var(--accent-fg)" }, children: "." })
8224
8399
  ]
8225
8400
  }
8226
8401
  )
@@ -8231,11 +8406,11 @@ function OlunLogo({
8231
8406
 
8232
8407
  // src/components/branding/theme-toggle.tsx
8233
8408
  import { Sun, Moon } from "lucide-react";
8234
- import { jsx as jsx53 } from "react/jsx-runtime";
8409
+ import { jsx as jsx55 } from "react/jsx-runtime";
8235
8410
  function ThemeToggle({ className }) {
8236
8411
  const { resolvedTheme, toggleTheme } = useOlunTheme();
8237
8412
  const Icon = resolvedTheme === "dark" ? Moon : Sun;
8238
- return /* @__PURE__ */ jsx53(
8413
+ return /* @__PURE__ */ jsx55(
8239
8414
  "button",
8240
8415
  {
8241
8416
  onClick: () => toggleTheme(),
@@ -8247,14 +8422,14 @@ function ThemeToggle({ className }) {
8247
8422
  ),
8248
8423
  "aria-label": "\uD14C\uB9C8 \uC804\uD658",
8249
8424
  title: resolvedTheme === "dark" ? "\uB77C\uC774\uD2B8 \uBAA8\uB4DC\uB85C" : "\uB2E4\uD06C \uBAA8\uB4DC\uB85C",
8250
- children: /* @__PURE__ */ jsx53(Icon, { className: "size-[18px]", strokeWidth: 1.75 })
8425
+ children: /* @__PURE__ */ jsx55(Icon, { className: "size-[18px]", strokeWidth: 1.75 })
8251
8426
  }
8252
8427
  );
8253
8428
  }
8254
8429
 
8255
8430
  // src/components/branding/theme-fab.tsx
8256
8431
  import { Sun as Sun2, Moon as Moon2 } from "lucide-react";
8257
- import { jsx as jsx54 } from "react/jsx-runtime";
8432
+ import { jsx as jsx56 } from "react/jsx-runtime";
8258
8433
  function ThemeFab({ variant = "square" } = {}) {
8259
8434
  const { mounted, resolvedTheme, toggleTheme } = useOlunTheme();
8260
8435
  if (!mounted) {
@@ -8294,7 +8469,7 @@ function ThemeFab({ variant = "square" } = {}) {
8294
8469
  WebkitBackdropFilter: "blur(16px)",
8295
8470
  zIndex: 9999
8296
8471
  };
8297
- return /* @__PURE__ */ jsx54(
8472
+ return /* @__PURE__ */ jsx56(
8298
8473
  "button",
8299
8474
  {
8300
8475
  onClick: () => toggleTheme(),
@@ -8319,7 +8494,7 @@ function ThemeFab({ variant = "square" } = {}) {
8319
8494
  e.currentTarget.style.color = "var(--text-secondary)";
8320
8495
  }
8321
8496
  },
8322
- children: /* @__PURE__ */ jsx54(
8497
+ children: /* @__PURE__ */ jsx56(
8323
8498
  Icon,
8324
8499
  {
8325
8500
  size: isCircle ? 22 : 16,
@@ -8331,7 +8506,7 @@ function ThemeFab({ variant = "square" } = {}) {
8331
8506
  }
8332
8507
 
8333
8508
  // src/components/logos/organization-logo.tsx
8334
- import { jsx as jsx55 } from "react/jsx-runtime";
8509
+ import { jsx as jsx57 } from "react/jsx-runtime";
8335
8510
  var organizationLogoRegistry = {
8336
8511
  jbnu: {
8337
8512
  label: "\uC804\uBD81\uB300\uD559\uAD50 \uC5E0\uBE14\uB7FC",
@@ -8360,7 +8535,7 @@ function OrganizationLogo({
8360
8535
  }) {
8361
8536
  const asset = organizationLogoRegistry[organization];
8362
8537
  const isDecorative = ariaHidden === true || ariaHidden === "true";
8363
- return /* @__PURE__ */ jsx55(
8538
+ return /* @__PURE__ */ jsx57(
8364
8539
  "svg",
8365
8540
  {
8366
8541
  viewBox: asset.viewBox,
@@ -8378,7 +8553,7 @@ function OrganizationLogo({
8378
8553
  ...style
8379
8554
  },
8380
8555
  ...props,
8381
- children: asset.paths.map((path) => /* @__PURE__ */ jsx55("path", { d: path }, path))
8556
+ children: asset.paths.map((path) => /* @__PURE__ */ jsx57("path", { d: path }, path))
8382
8557
  }
8383
8558
  );
8384
8559
  }
@@ -8389,6 +8564,7 @@ export {
8389
8564
  AvatarFallback,
8390
8565
  AvatarImage,
8391
8566
  Badge,
8567
+ BulkActionBar,
8392
8568
  Button,
8393
8569
  Card,
8394
8570
  CardContent,
@@ -8402,6 +8578,7 @@ export {
8402
8578
  CheckboxGroupContext,
8403
8579
  Chip,
8404
8580
  ConfirmDialog,
8581
+ ContextMenu,
8405
8582
  CopyButton,
8406
8583
  DataTable,
8407
8584
  DetailLayout,