@assure-one/design-system 0.4.1 → 0.7.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
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
  import * as React36 from 'react';
3
- import { forwardRef, useState, useCallback, useId, useRef, useImperativeHandle, useEffect, createContext, useContext, useMemo } from 'react';
3
+ import { forwardRef, useState, useCallback, useId, useRef, useImperativeHandle, useEffect, createContext, Fragment as Fragment$1, useContext, useMemo } from 'react';
4
4
  import * as AccordionPrimitive from '@radix-ui/react-accordion';
5
5
  import { clsx } from 'clsx';
6
6
  import { twMerge } from 'tailwind-merge';
@@ -28,6 +28,7 @@ import { OTPInput as OTPInput$1, REGEXP_ONLY_DIGITS } from 'input-otp';
28
28
  import * as ProgressPrimitive from '@radix-ui/react-progress';
29
29
  import * as RadioGroupPrimitive from '@radix-ui/react-radio-group';
30
30
  import * as ScrollAreaPrimitive from '@radix-ui/react-scroll-area';
31
+ import { RemoveScroll } from 'react-remove-scroll';
31
32
  import * as SeparatorPrimitive from '@radix-ui/react-separator';
32
33
  import * as SliderPrimitive from '@radix-ui/react-slider';
33
34
  import { useFormStatus } from 'react-dom';
@@ -2120,6 +2121,74 @@ function FilterIcon({ size = 24, ...props }) {
2120
2121
  }
2121
2122
  ) });
2122
2123
  }
2124
+ function CheckCircleSolidIcon({ size = 24, ...props }) {
2125
+ return /* @__PURE__ */ jsx(Icon, { size, ...props, children: /* @__PURE__ */ jsx(
2126
+ "path",
2127
+ {
2128
+ fillRule: "evenodd",
2129
+ clipRule: "evenodd",
2130
+ fill: "currentColor",
2131
+ d: "M2.25 12c0-5.385 4.365-9.75 9.75-9.75s9.75 4.365 9.75 9.75-4.365 9.75-9.75 9.75S2.25 17.385 2.25 12Zm13.36-1.814a.75.75 0 0 0-1.22-.872l-3.236 4.53L9.53 12.22a.75.75 0 0 0-1.06 1.06l2.25 2.25a.75.75 0 0 0 1.14-.094l3.75-5.25Z"
2132
+ }
2133
+ ) });
2134
+ }
2135
+ function XCircleSolidIcon({ size = 24, ...props }) {
2136
+ return /* @__PURE__ */ jsx(Icon, { size, ...props, children: /* @__PURE__ */ jsx(
2137
+ "path",
2138
+ {
2139
+ fillRule: "evenodd",
2140
+ clipRule: "evenodd",
2141
+ fill: "currentColor",
2142
+ d: "M12 2.25C6.615 2.25 2.25 6.615 2.25 12s4.365 9.75 9.75 9.75 9.75-4.365 9.75-9.75S17.385 2.25 12 2.25Zm-1.72 6.97a.75.75 0 0 0-1.06 1.06L10.94 12l-1.72 1.72a.75.75 0 1 0 1.06 1.06L12 13.06l1.72 1.72a.75.75 0 1 0 1.06-1.06L13.06 12l1.72-1.72a.75.75 0 1 0-1.06-1.06L12 10.94l-1.72-1.72Z"
2143
+ }
2144
+ ) });
2145
+ }
2146
+ function AlertTriangleSolidIcon({ size = 24, ...props }) {
2147
+ return /* @__PURE__ */ jsx(Icon, { size, ...props, children: /* @__PURE__ */ jsx(
2148
+ "path",
2149
+ {
2150
+ fillRule: "evenodd",
2151
+ clipRule: "evenodd",
2152
+ fill: "currentColor",
2153
+ d: "M9.401 3.003c1.155-2 4.043-2 5.197 0l7.355 12.748c1.154 2-.29 4.5-2.599 4.5H4.645c-2.309 0-3.752-2.5-2.598-4.5L9.4 3.003ZM12 8.25a.75.75 0 0 1 .75.75v3.75a.75.75 0 0 1-1.5 0V9a.75.75 0 0 1 .75-.75Zm0 8.25a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5Z"
2154
+ }
2155
+ ) });
2156
+ }
2157
+ function InfoCircleSolidIcon({ size = 24, ...props }) {
2158
+ return /* @__PURE__ */ jsx(Icon, { size, ...props, children: /* @__PURE__ */ jsx(
2159
+ "path",
2160
+ {
2161
+ fillRule: "evenodd",
2162
+ clipRule: "evenodd",
2163
+ fill: "currentColor",
2164
+ d: "M2.25 12c0-5.385 4.365-9.75 9.75-9.75s9.75 4.365 9.75 9.75-4.365 9.75-9.75 9.75S2.25 17.385 2.25 12Zm8.706-1.442c1.146-.573 2.437.463 2.126 1.706l-.709 2.836.042-.02a.75.75 0 0 1 .67 1.342l-.04.022c-1.147.573-2.438-.463-2.127-1.706l.71-2.836-.042.02a.75.75 0 1 1-.671-1.341l.041-.022ZM12 9a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5Z"
2165
+ }
2166
+ ) });
2167
+ }
2168
+ function TrendingUpIcon({ size = 24, ...props }) {
2169
+ return /* @__PURE__ */ jsx(Icon, { size, ...props, children: /* @__PURE__ */ jsx(
2170
+ "path",
2171
+ {
2172
+ d: "M2 17l6.5-6.5 5 5L22 7M16 7h6v6",
2173
+ stroke: "currentColor",
2174
+ strokeWidth: "1.5",
2175
+ strokeLinecap: "round",
2176
+ strokeLinejoin: "round"
2177
+ }
2178
+ ) });
2179
+ }
2180
+ function TrendingDownIcon({ size = 24, ...props }) {
2181
+ return /* @__PURE__ */ jsx(Icon, { size, ...props, children: /* @__PURE__ */ jsx(
2182
+ "path",
2183
+ {
2184
+ d: "M2 7l6.5 6.5 5-5L22 17M16 17h6v-6",
2185
+ stroke: "currentColor",
2186
+ strokeWidth: "1.5",
2187
+ strokeLinecap: "round",
2188
+ strokeLinejoin: "round"
2189
+ }
2190
+ ) });
2191
+ }
2123
2192
  var Accordion = React36.forwardRef(function Accordion2({ className, ...props }, ref) {
2124
2193
  return /* @__PURE__ */ jsx(
2125
2194
  AccordionPrimitive.Root,
@@ -3071,8 +3140,8 @@ function Select({
3071
3140
  children: /* @__PURE__ */ jsx(SelectValue, { placeholder })
3072
3141
  }
3073
3142
  ),
3074
- /* @__PURE__ */ jsx(SelectContent, { className: contentClassName, children: options.map((opt) => /* @__PURE__ */ jsx(SelectItem, { value: opt.value, disabled: opt.disabled, children: /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-1.5 truncate", children: [
3075
- opt.label,
3143
+ /* @__PURE__ */ jsx(SelectContent, { className: contentClassName, children: options.map((opt) => /* @__PURE__ */ jsx(SelectItem, { value: opt.value, disabled: opt.disabled, children: /* @__PURE__ */ jsxs("span", { className: "flex min-w-0 items-center gap-1.5", children: [
3144
+ /* @__PURE__ */ jsx("span", { className: "line-clamp-1", children: opt.label }),
3076
3145
  opt.labelSuffix
3077
3146
  ] }) }, opt.value)) })
3078
3147
  ]
@@ -3090,16 +3159,17 @@ function ClientSelect({
3090
3159
  placeholder = "Select a client..."
3091
3160
  }) {
3092
3161
  const radixValue = value ?? void 0;
3162
+ const selected = value ? clients.find((c) => c.id === value) : void 0;
3093
3163
  const handleChange = (next) => {
3094
3164
  onChange(next === "" ? null : next);
3095
3165
  };
3096
3166
  return /* @__PURE__ */ jsxs("div", { className: cn("relative w-full", className), children: [
3097
3167
  /* @__PURE__ */ jsx("input", { type: "hidden", name, value: value ?? "" }),
3098
3168
  /* @__PURE__ */ jsxs(SelectRoot, { value: radixValue, onValueChange: handleChange, children: [
3099
- /* @__PURE__ */ jsx(SelectTrigger, { "aria-invalid": !!error || void 0, "aria-label": placeholder, children: /* @__PURE__ */ jsx(SelectValue, { placeholder }) }),
3100
- /* @__PURE__ */ jsx(SelectContent, { children: clients.length === 0 ? /* @__PURE__ */ jsx("div", { className: "text-fg-3 px-3 py-6 text-center text-xs", children: "No clients yet" }) : clients.map((c) => /* @__PURE__ */ jsx(SelectItem, { value: c.id, children: /* @__PURE__ */ jsxs("span", { className: "flex flex-col", children: [
3101
- /* @__PURE__ */ jsx("span", { className: "text-fg text-[13px] font-medium", children: c.label }),
3102
- c.email && /* @__PURE__ */ jsx("span", { className: "text-fg-3 text-xs", children: c.email })
3169
+ /* @__PURE__ */ jsx(SelectTrigger, { "aria-invalid": !!error || void 0, "aria-label": placeholder, children: /* @__PURE__ */ jsx(SelectValue, { placeholder, children: selected?.label ?? "" }) }),
3170
+ /* @__PURE__ */ jsx(SelectContent, { children: clients.length === 0 ? /* @__PURE__ */ jsx("div", { className: "text-fg-3 px-3 py-6 text-center text-xs", children: "No clients yet" }) : clients.map((c) => /* @__PURE__ */ jsx(SelectItem, { value: c.id, children: /* @__PURE__ */ jsxs("span", { className: "flex min-w-0 flex-col", children: [
3171
+ /* @__PURE__ */ jsx("span", { className: "text-fg line-clamp-1 text-[13px] font-medium", children: c.label }),
3172
+ c.email && /* @__PURE__ */ jsx("span", { className: "text-fg-3 line-clamp-1 text-xs", children: c.email })
3103
3173
  ] }) }, c.id)) })
3104
3174
  ] }),
3105
3175
  error && /* @__PURE__ */ jsx("p", { role: "alert", className: "text-danger-fg mt-1.5 text-xs", children: error })
@@ -3436,7 +3506,7 @@ function CommandPalette({
3436
3506
  ),
3437
3507
  /* @__PURE__ */ jsxs("div", { className: "min-w-0 flex-1", children: [
3438
3508
  /* @__PURE__ */ jsx("div", { className: "text-fg text-sm font-medium", children: item.label }),
3439
- item.description && /* @__PURE__ */ jsx("div", { className: "text-fg-3 truncate text-xs", children: item.description })
3509
+ item.description && /* @__PURE__ */ jsx("div", { className: "text-fg-3 line-clamp-1 text-xs", children: item.description })
3440
3510
  ] }),
3441
3511
  item.shortcut && /* @__PURE__ */ jsx("kbd", { className: cn(kbdClass, "hidden shrink-0 sm:inline-flex"), children: item.shortcut })
3442
3512
  ]
@@ -4417,67 +4487,45 @@ var Input = forwardRef(function Input2({
4417
4487
  ] });
4418
4488
  });
4419
4489
  Input.displayName = "Input";
4420
- var SHORTCUT_SECTIONS = [
4421
- {
4422
- title: "Create",
4423
- icon: /* @__PURE__ */ jsx(CornerDownLeftIcon, { className: "size-3" }),
4424
- shortcuts: [
4425
- { keys: ["C"], description: "New Client" },
4426
- { keys: ["T"], description: "Create Task" },
4427
- { keys: ["E"], description: "New Engagement" },
4428
- { keys: ["M"], description: "Compose Message" }
4429
- ]
4430
- },
4431
- {
4432
- title: "Go to",
4433
- icon: null,
4434
- shortcuts: [
4435
- { keys: ["G", "O"], description: "Overview" },
4436
- { keys: ["G", "C"], description: "Clients" },
4437
- { keys: ["G", "W"], description: "Workflow" },
4438
- { keys: ["G", "D"], description: "Documents" },
4439
- { keys: ["G", "B"], description: "Billing" },
4440
- { keys: ["G", "M"], description: "Communications" },
4441
- { keys: ["G", "A"], description: "Calendar" },
4442
- { keys: ["G", "R"], description: "Reports" },
4443
- { keys: ["G", "S"], description: "Settings" }
4444
- ]
4445
- },
4446
- {
4447
- title: "General",
4448
- icon: /* @__PURE__ */ jsx(CommandIcon, { className: "size-3" }),
4449
- shortcuts: [
4450
- { keys: ["\u2318", "K"], description: "Command palette" },
4451
- { keys: ["/"], description: "Focus search" },
4452
- { keys: ["?"], description: "Keyboard shortcuts" },
4453
- { keys: ["Esc"], description: "Close / go back" }
4454
- ]
4455
- }
4456
- ];
4490
+ var GENERAL_SECTION = {
4491
+ title: "General",
4492
+ icon: /* @__PURE__ */ jsx(CommandIcon, { className: "size-3" }),
4493
+ shortcuts: [
4494
+ { keys: ["\u2318", "K"], description: "Command palette" },
4495
+ { keys: ["/"], description: "Focus search" },
4496
+ { keys: ["?"], description: "Keyboard shortcuts" },
4497
+ { keys: ["Esc"], description: "Close / go back" }
4498
+ ]
4499
+ };
4457
4500
  var kbdClass2 = cn(
4458
4501
  "inline-flex items-center justify-center min-w-[18px] h-[18px] px-[5px]",
4459
4502
  "font-mono text-[10.5px] text-fg-3 bg-bg-2 border border-rule rounded-icon",
4460
4503
  "[border-bottom-width:1.5px]"
4461
4504
  );
4462
- function KeyboardShortcutsDialog() {
4505
+ function KeyboardShortcutsDialog({
4506
+ sections,
4507
+ hotkey = "?"
4508
+ } = {}) {
4463
4509
  const [open, setOpen] = React36.useState(false);
4464
4510
  React36.useEffect(() => {
4511
+ if (hotkey === null) return;
4465
4512
  function handleKeyDown(e) {
4466
4513
  const target = e.target;
4467
4514
  if (target instanceof HTMLInputElement || target instanceof HTMLTextAreaElement || target instanceof HTMLSelectElement || target?.isContentEditable) {
4468
4515
  return;
4469
4516
  }
4470
- if (e.key === "?" && !e.metaKey && !e.ctrlKey && !e.altKey) {
4517
+ if (e.key === hotkey && !e.metaKey && !e.ctrlKey && !e.altKey) {
4471
4518
  e.preventDefault();
4472
4519
  setOpen((prev) => !prev);
4473
4520
  }
4474
4521
  }
4475
4522
  document.addEventListener("keydown", handleKeyDown);
4476
4523
  return () => document.removeEventListener("keydown", handleKeyDown);
4477
- }, []);
4524
+ }, [hotkey]);
4525
+ const allSections = sections ? [...sections, GENERAL_SECTION] : [GENERAL_SECTION];
4478
4526
  return /* @__PURE__ */ jsx(Dialog, { open, onOpenChange: setOpen, children: /* @__PURE__ */ jsxs(DialogContent, { size: "md", className: "p-0", children: [
4479
4527
  /* @__PURE__ */ jsx(DialogHeader, { className: "border-rule mb-0 border-b px-5 py-4 pr-12", children: /* @__PURE__ */ jsx(DialogTitle, { className: "text-sm font-semibold", children: "Keyboard Shortcuts" }) }),
4480
- /* @__PURE__ */ jsx("div", { className: "scrollbar-thin max-h-[60vh] overflow-y-auto px-5 py-4", children: /* @__PURE__ */ jsx("div", { className: "grid grid-cols-2 gap-x-6 gap-y-5", children: SHORTCUT_SECTIONS.map((section) => /* @__PURE__ */ jsxs("div", { className: cn(section.title === "Go to" && "row-span-2"), children: [
4528
+ /* @__PURE__ */ jsx("div", { className: "scrollbar-thin max-h-[60vh] overflow-y-auto px-5 py-4", children: /* @__PURE__ */ jsx("div", { className: "grid grid-cols-2 gap-x-6 gap-y-5", children: allSections.map((section) => /* @__PURE__ */ jsxs("div", { className: cn(section.wide && "row-span-2"), children: [
4481
4529
  /* @__PURE__ */ jsxs(
4482
4530
  "h3",
4483
4531
  {
@@ -4508,7 +4556,7 @@ function KeyboardShortcutsDialog() {
4508
4556
  ] }, section.title)) }) }),
4509
4557
  /* @__PURE__ */ jsx("div", { className: "border-rule bg-bg-2/40 border-t px-5 py-3", children: /* @__PURE__ */ jsxs("p", { className: "text-fg-3 text-[11px]", children: [
4510
4558
  "Press ",
4511
- /* @__PURE__ */ jsx("kbd", { className: kbdClass2, children: "?" }),
4559
+ /* @__PURE__ */ jsx("kbd", { className: kbdClass2, children: hotkey ?? "?" }),
4512
4560
  " anytime to toggle this dialog"
4513
4561
  ] }) })
4514
4562
  ] }) });
@@ -4637,15 +4685,17 @@ function Logo({
4637
4685
  className,
4638
4686
  iconClassName,
4639
4687
  textClassName,
4688
+ productName = "Pro",
4640
4689
  inverted = false
4641
4690
  }) {
4642
4691
  const s = sizeStyles[size];
4692
+ const ariaLabel = productName ? `Assure ${productName}` : "Assure";
4643
4693
  return /* @__PURE__ */ jsxs(
4644
4694
  Link,
4645
4695
  {
4646
4696
  href,
4647
4697
  className: cn("inline-flex items-center", s.gap, className),
4648
- "aria-label": "Assure Pro",
4698
+ "aria-label": ariaLabel,
4649
4699
  children: [
4650
4700
  /* @__PURE__ */ jsx(
4651
4701
  Image2,
@@ -4669,8 +4719,10 @@ function Logo({
4669
4719
  ),
4670
4720
  children: [
4671
4721
  /* @__PURE__ */ jsx("span", { children: "Assure" }),
4672
- " ",
4673
- /* @__PURE__ */ jsx("span", { className: cn("font-medium", inverted ? "text-pro-fg" : "text-pro-fg"), children: "Pro" })
4722
+ productName && /* @__PURE__ */ jsxs(Fragment, { children: [
4723
+ " ",
4724
+ /* @__PURE__ */ jsx("span", { className: "text-pro-fg font-medium", children: productName })
4725
+ ] })
4674
4726
  ]
4675
4727
  }
4676
4728
  )
@@ -4701,7 +4753,7 @@ function MultiFilterPill({
4701
4753
  ),
4702
4754
  children: [
4703
4755
  icon && /* @__PURE__ */ jsx("span", { className: "[&>svg]:size-3.5", "aria-hidden": "true", children: icon }),
4704
- /* @__PURE__ */ jsx("span", { className: "truncate", children: displayLabel }),
4756
+ /* @__PURE__ */ jsx("span", { className: "line-clamp-1", children: displayLabel }),
4705
4757
  active ? /* @__PURE__ */ jsx(
4706
4758
  "span",
4707
4759
  {
@@ -4781,7 +4833,7 @@ function MultiFilterPill({
4781
4833
  "aria-hidden": "true"
4782
4834
  }
4783
4835
  ),
4784
- /* @__PURE__ */ jsx("span", { className: "truncate", children: opt.label })
4836
+ /* @__PURE__ */ jsx("span", { className: "line-clamp-1", children: opt.label })
4785
4837
  ]
4786
4838
  }
4787
4839
  ) }, opt.key);
@@ -5440,15 +5492,46 @@ function SearchSelect({
5440
5492
  onCreate,
5441
5493
  placeholder = "Search...",
5442
5494
  className,
5443
- disabled = false
5495
+ disabled = false,
5496
+ groupFilter = false,
5497
+ pinnedGroups,
5498
+ closeOnSelect = false,
5499
+ showGroupCounts = false,
5500
+ onCreateNew,
5501
+ createNewLabel = "Create new"
5444
5502
  }) {
5445
5503
  const [search, setSearch] = React36.useState("");
5446
5504
  const [open, setOpen] = React36.useState(false);
5505
+ const [activeChip, setActiveChip] = React36.useState(null);
5447
5506
  const selectedIds = React36.useMemo(() => new Set(selected.map((s) => s.id)), [selected]);
5448
5507
  const filtered = React36.useMemo(
5449
5508
  () => options.filter((opt) => !selectedIds.has(opt.id)),
5450
5509
  [options, selectedIds]
5451
5510
  );
5511
+ const groups = React36.useMemo(() => {
5512
+ const order = [];
5513
+ const byGroup = /* @__PURE__ */ new Map();
5514
+ for (const opt of filtered) {
5515
+ if (!byGroup.has(opt.group)) {
5516
+ byGroup.set(opt.group, []);
5517
+ order.push(opt.group);
5518
+ }
5519
+ byGroup.get(opt.group).push(opt);
5520
+ }
5521
+ return order.map((g) => [g, byGroup.get(g)]);
5522
+ }, [filtered]);
5523
+ const hasGroups = React36.useMemo(() => groups.some(([g]) => g != null), [groups]);
5524
+ const pinnedSet = React36.useMemo(() => new Set(pinnedGroups ?? []), [pinnedGroups]);
5525
+ const chips = React36.useMemo(() => {
5526
+ if (!groupFilter || !hasGroups) return [];
5527
+ return groups.map(([g]) => g).filter((g) => g != null && !pinnedSet.has(g));
5528
+ }, [groupFilter, hasGroups, groups, pinnedSet]);
5529
+ const visibleGroups = React36.useMemo(() => {
5530
+ if (chips.length > 0 && activeChip) {
5531
+ return groups.filter(([g]) => g === activeChip);
5532
+ }
5533
+ return groups;
5534
+ }, [groups, chips.length, activeChip]);
5452
5535
  const trimmedSearch = search.trim();
5453
5536
  const hasExactMatch = React36.useMemo(
5454
5537
  () => options.some((opt) => opt.label.toLowerCase() === trimmedSearch.toLowerCase()),
@@ -5459,8 +5542,9 @@ function SearchSelect({
5459
5542
  (option) => {
5460
5543
  onSelect(option);
5461
5544
  setSearch("");
5545
+ if (closeOnSelect) setOpen(false);
5462
5546
  },
5463
- [onSelect]
5547
+ [onSelect, closeOnSelect]
5464
5548
  );
5465
5549
  const handleCreate = React36.useCallback(() => {
5466
5550
  if (onCreate && trimmedSearch) {
@@ -5469,8 +5553,17 @@ function SearchSelect({
5469
5553
  setOpen(false);
5470
5554
  }
5471
5555
  }, [onCreate, trimmedSearch]);
5556
+ const inputRef = React36.useRef(null);
5557
+ const singleValue = closeOnSelect ? selected[0] ?? null : null;
5558
+ const showValue = singleValue !== null && !open;
5559
+ React36.useEffect(() => {
5560
+ if (open && closeOnSelect) {
5561
+ const raf = requestAnimationFrame(() => inputRef.current?.focus());
5562
+ return () => cancelAnimationFrame(raf);
5563
+ }
5564
+ }, [open, closeOnSelect]);
5472
5565
  return /* @__PURE__ */ jsxs("div", { className: cn("relative w-full", className), children: [
5473
- selected.length > 0 && /* @__PURE__ */ jsx("div", { className: "mb-2 flex flex-wrap gap-1.5", children: selected.map((item) => /* @__PURE__ */ jsxs(
5566
+ !closeOnSelect && selected.length > 0 && /* @__PURE__ */ jsx("div", { className: "mb-2 flex flex-wrap gap-1.5", children: selected.map((item) => /* @__PURE__ */ jsxs(
5474
5567
  "span",
5475
5568
  {
5476
5569
  className: cn(
@@ -5513,7 +5606,7 @@ function SearchSelect({
5513
5606
  }
5514
5607
  },
5515
5608
  children: [
5516
- /* @__PURE__ */ jsx(PopoverAnchor, { asChild: true, children: /* @__PURE__ */ jsxs(
5609
+ /* @__PURE__ */ jsx(PopoverAnchor, { asChild: true, children: /* @__PURE__ */ jsx(
5517
5610
  "div",
5518
5611
  {
5519
5612
  className: cn(
@@ -5521,9 +5614,59 @@ function SearchSelect({
5521
5614
  "transition-[color,background-color,border-color,box-shadow] duration-[var(--duration-fast)] ease-[var(--ease-out-quart)]",
5522
5615
  "motion-reduce:transition-none",
5523
5616
  "focus-within:border-accent focus-within:[box-shadow:var(--shadow-focus-ring)]",
5617
+ showValue && "hover:bg-bg-2 gap-2 pr-2 pl-3",
5524
5618
  disabled && "bg-bg-disabled cursor-not-allowed"
5525
5619
  ),
5526
- children: [
5620
+ children: showValue && singleValue ? /* @__PURE__ */ jsxs(Fragment, { children: [
5621
+ /* @__PURE__ */ jsxs(
5622
+ "button",
5623
+ {
5624
+ type: "button",
5625
+ onClick: () => !disabled && setOpen(true),
5626
+ disabled,
5627
+ className: "flex h-full flex-1 items-center gap-2 text-left outline-none disabled:cursor-not-allowed",
5628
+ children: [
5629
+ singleValue.icon && /* @__PURE__ */ jsx(
5630
+ "span",
5631
+ {
5632
+ className: cn(
5633
+ "flex size-5 shrink-0 items-center justify-center rounded-full [&_svg]:size-3",
5634
+ singleValue.iconClassName
5635
+ ),
5636
+ "aria-hidden": "true",
5637
+ children: singleValue.icon
5638
+ }
5639
+ ),
5640
+ /* @__PURE__ */ jsxs("span", { className: "text-fg flex-1 truncate text-[13px]", children: [
5641
+ singleValue.label,
5642
+ singleValue.description && /* @__PURE__ */ jsxs("span", { className: "text-fg-4", children: [
5643
+ " \xB7 ",
5644
+ singleValue.description
5645
+ ] })
5646
+ ] })
5647
+ ]
5648
+ }
5649
+ ),
5650
+ /* @__PURE__ */ jsx(
5651
+ "button",
5652
+ {
5653
+ type: "button",
5654
+ onClick: () => onRemove(singleValue),
5655
+ disabled,
5656
+ className: cn(
5657
+ "text-fg-3 shrink-0 rounded-full p-0.5",
5658
+ "transition-colors duration-[var(--duration-fast)] ease-[var(--ease-out-quart)]",
5659
+ "motion-reduce:transition-none",
5660
+ "hover:bg-overlay-hover hover:text-fg",
5661
+ "disabled:text-fg-disabled disabled:cursor-not-allowed disabled:hover:bg-transparent",
5662
+ "focus-visible:[box-shadow:var(--shadow-focus-ring)] focus-visible:outline-none"
5663
+ ),
5664
+ "aria-label": `Clear ${singleValue.label}`,
5665
+ children: /* @__PURE__ */ jsx(XIcon, { className: "size-3.5", "aria-hidden": "true" })
5666
+ }
5667
+ ),
5668
+ /* @__PURE__ */ jsx(ChevronDownIcon, { className: "text-fg-4 size-4 shrink-0", "aria-hidden": "true" })
5669
+ ] }) : /* @__PURE__ */ jsxs(Fragment, { children: [
5527
5670
  /* @__PURE__ */ jsx(
5528
5671
  SearchIcon,
5529
5672
  {
@@ -5534,6 +5677,7 @@ function SearchSelect({
5534
5677
  /* @__PURE__ */ jsx(
5535
5678
  Command.Input,
5536
5679
  {
5680
+ ref: inputRef,
5537
5681
  value: search,
5538
5682
  onValueChange: (v) => {
5539
5683
  setSearch(v);
@@ -5551,7 +5695,7 @@ function SearchSelect({
5551
5695
  )
5552
5696
  }
5553
5697
  )
5554
- ]
5698
+ ] })
5555
5699
  }
5556
5700
  ) }),
5557
5701
  /* @__PURE__ */ jsx(
@@ -5559,56 +5703,156 @@ function SearchSelect({
5559
5703
  {
5560
5704
  align: "start",
5561
5705
  sideOffset: 4,
5706
+ avoidCollisions: false,
5562
5707
  onOpenAutoFocus: (e) => e.preventDefault(),
5563
5708
  onInteractOutside: (e) => {
5564
5709
  const target = e.target;
5565
5710
  if (target.closest("[cmdk-input]")) e.preventDefault();
5566
5711
  },
5567
- className: cn("w-(--radix-popover-trigger-width) p-0", "min-w-[12rem]"),
5568
- children: /* @__PURE__ */ jsxs(Command.List, { className: "scrollbar-thin max-h-60 overflow-y-auto p-1", children: [
5569
- filtered.length === 0 && !showCreate && /* @__PURE__ */ jsx(Command.Empty, { className: "text-fg-3 px-3 py-2 text-xs", children: search ? "No results found." : "No options available." }),
5570
- filtered.map((option) => /* @__PURE__ */ jsxs(
5571
- Command.Item,
5712
+ style: {
5713
+ width: "var(--radix-popover-trigger-width)",
5714
+ maxHeight: "var(--radix-popover-content-available-height)"
5715
+ },
5716
+ className: cn("p-0", "flex flex-col", "min-w-[12rem] overflow-hidden"),
5717
+ children: /* @__PURE__ */ jsxs(RemoveScroll, { removeScrollBar: false, className: "contents", children: [
5718
+ chips.length > 0 && /* @__PURE__ */ jsx("div", { className: "border-rule flex flex-wrap gap-1 border-b p-1.5", children: [null, ...chips].map((chip) => {
5719
+ const active = activeChip === chip;
5720
+ return /* @__PURE__ */ jsx(
5721
+ "button",
5722
+ {
5723
+ type: "button",
5724
+ onClick: () => setActiveChip(chip),
5725
+ className: cn(
5726
+ "rounded-pill px-2.5 py-0.5 text-[12px] font-medium",
5727
+ "transition-colors duration-[var(--duration-fast)] ease-[var(--ease-out-quart)] motion-reduce:transition-none",
5728
+ active ? "bg-pro-fg text-fg-on-pro" : "border-rule text-fg-2 hover:bg-bg-2 border bg-transparent"
5729
+ ),
5730
+ children: chip ?? "All"
5731
+ },
5732
+ chip ?? "__all"
5733
+ );
5734
+ }) }),
5735
+ /* @__PURE__ */ jsxs(
5736
+ Command.List,
5572
5737
  {
5573
- value: option.label,
5574
- onSelect: () => handleSelect(option),
5575
5738
  className: cn(
5576
- "rounded-pill flex cursor-default items-center gap-2 px-2 py-1.5 text-[13px] outline-none select-none",
5577
- "text-fg-2 transition-colors duration-[var(--duration-fast)] ease-[var(--ease-out-quart)]",
5739
+ // No top padding: a sticky group heading pins at top-0, so any
5740
+ // top padding would leave a strip above it where the previous
5741
+ // group's last item peeks through. Top spacing comes from the
5742
+ // heading's own pt-2 instead.
5743
+ "scrollbar-thin min-h-0 flex-1 max-h-[min(20rem,60vh)] overflow-y-auto px-1 pb-1",
5744
+ // Quiet sentence-case section labels (only shown when grouped)
5745
+ "[&_[cmdk-group-heading]]:bg-surface [&_[cmdk-group-heading]]:sticky [&_[cmdk-group-heading]]:top-0 [&_[cmdk-group-heading]]:z-10",
5746
+ "[&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:pt-2 [&_[cmdk-group-heading]]:pb-1",
5747
+ "[&_[cmdk-group-heading]]:text-[11px] [&_[cmdk-group-heading]]:font-medium",
5748
+ "[&_[cmdk-group-heading]]:text-fg-3"
5749
+ ),
5750
+ children: [
5751
+ filtered.length === 0 && !showCreate && /* @__PURE__ */ jsx(Command.Empty, { className: "text-fg-3 px-3 py-2 text-xs", children: search ? "No results found." : "No options available." }),
5752
+ visibleGroups.map(([group, groupOptions]) => {
5753
+ const baseHeading = activeChip ? void 0 : group || void 0;
5754
+ const heading = baseHeading && showGroupCounts && !trimmedSearch ? `${baseHeading} \xB7 ${groupOptions.length}` : baseHeading;
5755
+ return /* @__PURE__ */ jsx(Command.Group, { heading, children: groupOptions.map((option) => {
5756
+ const isRich = !!option.icon || !!option.description;
5757
+ return /* @__PURE__ */ jsx(
5758
+ Command.Item,
5759
+ {
5760
+ value: hasGroups && group ? `${option.label} ${group}` : option.label,
5761
+ onSelect: () => handleSelect(option),
5762
+ className: cn(
5763
+ "flex cursor-default items-center outline-none select-none",
5764
+ "transition-colors duration-[var(--duration-fast)] ease-[var(--ease-out-quart)]",
5765
+ "motion-reduce:transition-none",
5766
+ isRich ? "rounded-md text-fg gap-2.5 px-2 py-1.5" : "rounded-pill text-fg-2 gap-2 px-2 py-1.5 text-[13px]",
5767
+ "data-[selected=true]:bg-bg-2 data-[selected=true]:text-fg"
5768
+ ),
5769
+ children: isRich ? /* @__PURE__ */ jsxs(Fragment, { children: [
5770
+ option.icon && /* @__PURE__ */ jsx(
5771
+ "span",
5772
+ {
5773
+ className: cn(
5774
+ "flex size-7 shrink-0 items-center justify-center rounded-full [&_svg]:size-3.5",
5775
+ option.iconClassName
5776
+ ),
5777
+ "aria-hidden": "true",
5778
+ children: option.icon
5779
+ }
5780
+ ),
5781
+ /* @__PURE__ */ jsxs("span", { className: "min-w-0 flex-1", children: [
5782
+ /* @__PURE__ */ jsx("span", { className: "block truncate text-[13px] font-medium", children: option.label }),
5783
+ option.description && /* @__PURE__ */ jsx("span", { className: "text-fg-4 block truncate text-[11px]", children: option.description })
5784
+ ] })
5785
+ ] }) : /* @__PURE__ */ jsxs(Fragment, { children: [
5786
+ option.color ? /* @__PURE__ */ jsx(
5787
+ "span",
5788
+ {
5789
+ className: "size-2 shrink-0 rounded-full",
5790
+ style: { backgroundColor: option.color },
5791
+ "aria-hidden": "true"
5792
+ }
5793
+ ) : /* @__PURE__ */ jsx(
5794
+ CheckIcon,
5795
+ {
5796
+ className: "size-4 shrink-0 text-transparent",
5797
+ "aria-hidden": "true"
5798
+ }
5799
+ ),
5800
+ /* @__PURE__ */ jsx("span", { className: "line-clamp-1", children: option.label })
5801
+ ] })
5802
+ },
5803
+ option.id
5804
+ );
5805
+ }) }, group ?? "__ungrouped");
5806
+ }),
5807
+ showCreate && /* @__PURE__ */ jsxs(Fragment, { children: [
5808
+ filtered.length > 0 && /* @__PURE__ */ jsx("div", { className: "bg-rule -mx-1 my-1 h-px", "aria-hidden": "true" }),
5809
+ /* @__PURE__ */ jsxs(
5810
+ Command.Item,
5811
+ {
5812
+ value: `__create_${trimmedSearch}`,
5813
+ onSelect: handleCreate,
5814
+ className: cn(
5815
+ "rounded-pill flex cursor-default items-center gap-2 px-2 py-1.5 text-[13px] outline-none select-none",
5816
+ "text-pro-fg transition-colors duration-[var(--duration-fast)] ease-[var(--ease-out-quart)]",
5817
+ "motion-reduce:transition-none",
5818
+ "data-[selected=true]:bg-pro-bg"
5819
+ ),
5820
+ children: [
5821
+ /* @__PURE__ */ jsx(PlusIcon, { className: "size-4 shrink-0", "aria-hidden": "true" }),
5822
+ /* @__PURE__ */ jsxs("span", { className: "line-clamp-1", children: [
5823
+ "Create \u201C",
5824
+ trimmedSearch,
5825
+ "\u201D"
5826
+ ] })
5827
+ ]
5828
+ }
5829
+ )
5830
+ ] })
5831
+ ]
5832
+ }
5833
+ ),
5834
+ onCreateNew && /* @__PURE__ */ jsxs(
5835
+ "button",
5836
+ {
5837
+ type: "button",
5838
+ onMouseDown: (e) => e.preventDefault(),
5839
+ onClick: () => {
5840
+ onCreateNew();
5841
+ setOpen(false);
5842
+ },
5843
+ className: cn(
5844
+ "border-rule text-pro-fg flex w-full shrink-0 items-center gap-2 border-t px-3 py-2.5 text-[13px] font-medium",
5845
+ "transition-colors duration-[var(--duration-fast)] ease-[var(--ease-out-quart)]",
5578
5846
  "motion-reduce:transition-none",
5579
- "data-[selected=true]:bg-bg-2 data-[selected=true]:text-fg"
5847
+ "hover:bg-pro-bg",
5848
+ "focus-visible:[box-shadow:var(--shadow-focus-ring)] focus-visible:outline-none"
5580
5849
  ),
5581
5850
  children: [
5582
- /* @__PURE__ */ jsx(CheckIcon, { className: "size-4 shrink-0 text-transparent", "aria-hidden": "true" }),
5583
- /* @__PURE__ */ jsx("span", { className: "truncate", children: option.label })
5851
+ /* @__PURE__ */ jsx(PlusIcon, { className: "size-4 shrink-0", "aria-hidden": "true" }),
5852
+ createNewLabel
5584
5853
  ]
5585
- },
5586
- option.id
5587
- )),
5588
- showCreate && /* @__PURE__ */ jsxs(Fragment, { children: [
5589
- filtered.length > 0 && /* @__PURE__ */ jsx("div", { className: "bg-rule -mx-1 my-1 h-px", "aria-hidden": "true" }),
5590
- /* @__PURE__ */ jsxs(
5591
- Command.Item,
5592
- {
5593
- value: `__create_${trimmedSearch}`,
5594
- onSelect: handleCreate,
5595
- className: cn(
5596
- "rounded-pill flex cursor-default items-center gap-2 px-2 py-1.5 text-[13px] outline-none select-none",
5597
- "text-pro-fg transition-colors duration-[var(--duration-fast)] ease-[var(--ease-out-quart)]",
5598
- "motion-reduce:transition-none",
5599
- "data-[selected=true]:bg-pro-bg"
5600
- ),
5601
- children: [
5602
- /* @__PURE__ */ jsx(PlusIcon, { className: "size-4 shrink-0", "aria-hidden": "true" }),
5603
- /* @__PURE__ */ jsxs("span", { className: "truncate", children: [
5604
- "Create \u201C",
5605
- trimmedSearch,
5606
- "\u201D"
5607
- ] })
5608
- ]
5609
- }
5610
- )
5611
- ] })
5854
+ }
5855
+ )
5612
5856
  ] })
5613
5857
  }
5614
5858
  )
@@ -5892,7 +6136,7 @@ function SideDrawer({
5892
6136
  function SideDrawerHeader({ title, subtitle, onClose, className }) {
5893
6137
  return /* @__PURE__ */ jsx("div", { className: cn("border-rule bg-surface shrink-0 border-b px-6 py-4", className), children: /* @__PURE__ */ jsxs("div", { className: "flex items-start justify-between gap-4", children: [
5894
6138
  /* @__PURE__ */ jsxs("div", { className: "min-w-0", children: [
5895
- /* @__PURE__ */ jsx("h2", { className: "font-display text-fg truncate text-base leading-tight font-medium tracking-tight", children: title }),
6139
+ /* @__PURE__ */ jsx("h2", { className: "font-display text-fg line-clamp-1 text-base leading-tight font-medium tracking-tight", children: title }),
5896
6140
  subtitle && /* @__PURE__ */ jsx("p", { className: "text-fg-3 mt-1 text-sm", children: subtitle })
5897
6141
  ] }),
5898
6142
  onClose && /* @__PURE__ */ jsx(
@@ -6637,32 +6881,55 @@ function ToastProvider({ children }) {
6637
6881
  )
6638
6882
  ] });
6639
6883
  }
6640
- var variantStyles = {
6641
- default: "bg-surface border-rule text-fg",
6642
- success: "bg-success-bg border-success-line text-success-fg",
6643
- destructive: "bg-danger-bg border-danger-line text-danger-fg",
6644
- warning: "bg-warning-bg border-warning-line text-warning-fg"
6884
+ var variantConfig = {
6885
+ default: { chip: "bg-pro-bg", icon: "text-pro-fg", bar: "bg-pro-fg", Icon: InfoCircleSolidIcon },
6886
+ success: {
6887
+ chip: "bg-success-bg",
6888
+ icon: "text-success-fg",
6889
+ bar: "bg-success-fg",
6890
+ Icon: CheckCircleSolidIcon
6891
+ },
6892
+ destructive: {
6893
+ chip: "bg-danger-bg",
6894
+ icon: "text-danger-fg",
6895
+ bar: "bg-danger-fg",
6896
+ Icon: XCircleSolidIcon
6897
+ },
6898
+ warning: {
6899
+ chip: "bg-warning-bg",
6900
+ icon: "text-warning-fg",
6901
+ bar: "bg-warning-fg",
6902
+ Icon: AlertTriangleSolidIcon
6903
+ }
6645
6904
  };
6646
6905
  function ToastItem({ toast, onDismiss }) {
6647
6906
  const timerRef = useRef(void 0);
6648
6907
  const [exiting, setExiting] = useState(false);
6908
+ const [filled, setFilled] = useState(false);
6909
+ const duration = toast.duration ?? 5e3;
6910
+ const showProgress = duration > 0;
6649
6911
  const close = useCallback(() => {
6650
6912
  setExiting(true);
6651
6913
  setTimeout(() => onDismiss(toast.id), 150);
6652
6914
  }, [toast.id, onDismiss]);
6653
6915
  useEffect(() => {
6654
- const duration = toast.duration ?? 5e3;
6655
- if (duration <= 0) return;
6916
+ if (!showProgress) return;
6656
6917
  timerRef.current = setTimeout(close, duration);
6657
6918
  return () => clearTimeout(timerRef.current);
6658
- }, [toast.duration, close]);
6659
- return /* @__PURE__ */ jsx(
6919
+ }, [showProgress, duration, close]);
6920
+ useEffect(() => {
6921
+ if (!showProgress) return;
6922
+ const raf = requestAnimationFrame(() => setFilled(true));
6923
+ return () => cancelAnimationFrame(raf);
6924
+ }, [showProgress]);
6925
+ const { chip, icon, bar, Icon: Icon3 } = variantConfig[toast.variant ?? "default"];
6926
+ return /* @__PURE__ */ jsxs(
6660
6927
  "div",
6661
6928
  {
6662
6929
  role: "status",
6663
6930
  "data-state": exiting ? "closed" : "open",
6664
6931
  className: cn(
6665
- "rounded-card shadow-card pointer-events-auto w-80 border p-4",
6932
+ "bg-surface border-rule text-fg rounded-card shadow-card pointer-events-auto relative w-80 overflow-hidden border p-4",
6666
6933
  "font-body",
6667
6934
  // Unified data-state animation (spec §5.27) — same model as Dialog/Tooltip:
6668
6935
  // open → fade+slide in over --duration-overlay (200ms), ease-out-quart
@@ -6671,29 +6938,68 @@ function ToastItem({ toast, onDismiss }) {
6671
6938
  "data-[state=open]:duration-[var(--duration-overlay)] data-[state=open]:ease-[var(--ease-out-quart)]",
6672
6939
  "data-[state=closed]:animate-out data-[state=closed]:slide-out-to-right-8 data-[state=closed]:fade-out-0",
6673
6940
  "data-[state=closed]:duration-[var(--duration-fast)] data-[state=closed]:ease-[var(--ease-in)]",
6674
- "motion-reduce:animate-none",
6675
- variantStyles[toast.variant ?? "default"]
6941
+ "motion-reduce:animate-none"
6676
6942
  ),
6677
- children: /* @__PURE__ */ jsxs("div", { className: "flex items-start gap-3", children: [
6678
- /* @__PURE__ */ jsxs("div", { className: "min-w-0 flex-1", children: [
6679
- /* @__PURE__ */ jsx("p", { className: "text-sm leading-tight font-semibold", children: toast.title }),
6680
- toast.description && /* @__PURE__ */ jsx("p", { className: "mt-1 text-sm leading-snug opacity-80", children: toast.description })
6943
+ children: [
6944
+ /* @__PURE__ */ jsxs("div", { className: "flex items-start gap-3", children: [
6945
+ /* @__PURE__ */ jsx(
6946
+ "span",
6947
+ {
6948
+ className: cn(
6949
+ "inline-flex size-8 shrink-0 items-center justify-center rounded-[9px]",
6950
+ chip,
6951
+ icon
6952
+ ),
6953
+ "aria-hidden": "true",
6954
+ children: /* @__PURE__ */ jsx(Icon3, { className: "size-5" })
6955
+ }
6956
+ ),
6957
+ /* @__PURE__ */ jsxs("div", { className: "min-w-0 flex-1", children: [
6958
+ /* @__PURE__ */ jsx("p", { className: "text-fg text-sm leading-tight font-semibold", children: toast.title }),
6959
+ toast.description && /* @__PURE__ */ jsx("p", { className: "text-fg-3 mt-0.5 text-sm leading-snug", children: toast.description }),
6960
+ toast.action && /* @__PURE__ */ jsx(
6961
+ "button",
6962
+ {
6963
+ type: "button",
6964
+ onClick: () => {
6965
+ toast.action?.onClick();
6966
+ close();
6967
+ },
6968
+ className: cn(
6969
+ "text-pro-fg mt-2 text-sm font-semibold",
6970
+ "transition-colors duration-[var(--duration-fast)] ease-[var(--ease-out-quart)] hover:underline motion-reduce:transition-none",
6971
+ "focus-visible:[box-shadow:var(--shadow-focus-ring)] rounded-sm focus-visible:outline-none"
6972
+ ),
6973
+ children: toast.action.label
6974
+ }
6975
+ )
6976
+ ] }),
6977
+ /* @__PURE__ */ jsx(
6978
+ "button",
6979
+ {
6980
+ type: "button",
6981
+ onClick: close,
6982
+ className: cn(
6983
+ "text-fg-4 hover:text-fg-2 rounded-icon -mr-1 inline-flex size-5 shrink-0 items-center justify-center",
6984
+ "transition-colors duration-[var(--duration-fast)] ease-[var(--ease-out-quart)] motion-reduce:transition-none",
6985
+ "focus-visible:[box-shadow:var(--shadow-focus-ring)] focus-visible:outline-none"
6986
+ ),
6987
+ "aria-label": "Dismiss",
6988
+ children: /* @__PURE__ */ jsx(XIcon, { className: "size-3.5", "aria-hidden": "true" })
6989
+ }
6990
+ )
6681
6991
  ] }),
6682
- /* @__PURE__ */ jsx(
6683
- "button",
6992
+ showProgress && /* @__PURE__ */ jsx("div", { className: "bg-rule absolute inset-x-0 bottom-0 h-1", "aria-hidden": "true", children: /* @__PURE__ */ jsx(
6993
+ "div",
6684
6994
  {
6685
- type: "button",
6686
- onClick: close,
6687
6995
  className: cn(
6688
- "rounded-icon inline-flex size-5 shrink-0 items-center justify-center",
6689
- "opacity-70 transition-opacity duration-[var(--duration-fast)] ease-[var(--ease-out-quart)] hover:opacity-100 motion-reduce:transition-none",
6690
- "focus-visible:[box-shadow:var(--shadow-focus-ring)] focus-visible:outline-none"
6996
+ "h-full transition-[width] ease-linear motion-reduce:transition-none",
6997
+ bar
6691
6998
  ),
6692
- "aria-label": "Dismiss",
6693
- children: /* @__PURE__ */ jsx(XIcon, { className: "size-3.5", "aria-hidden": "true" })
6999
+ style: { width: filled ? "100%" : "0%", transitionDuration: `${duration}ms` }
6694
7000
  }
6695
- )
6696
- ] })
7001
+ ) })
7002
+ ]
6697
7003
  }
6698
7004
  );
6699
7005
  }
@@ -7039,7 +7345,9 @@ var SidebarBrandText = React36.forwardRef(
7039
7345
  ref,
7040
7346
  "aria-hidden": "false",
7041
7347
  className: cn(
7042
- "min-w-0 truncate",
7348
+ // line-clamp-1 (not `truncate`) so multi-word wordmarks clip at a
7349
+ // word boundary instead of mid-word when the rail is narrow.
7350
+ "min-w-0 line-clamp-1",
7043
7351
  // Smooth fade + width collapse on rail. Keeps the wordmark
7044
7352
  // legible up to the moment the column reaches rail width, then
7045
7353
  // fully drops out (visibility:hidden cuts hit-testing).
@@ -7157,7 +7465,10 @@ var SidebarLink = React36.forwardRef(
7157
7465
  "span",
7158
7466
  {
7159
7467
  className: cn(
7160
- "min-w-0 flex-1 truncate",
7468
+ // line-clamp-1 (not `truncate`) so multi-word labels clip at a
7469
+ // word boundary; collapses cleanly with the rail-mode max-width
7470
+ // animation since both rules only constrain visible content.
7471
+ "min-w-0 flex-1 line-clamp-1",
7161
7472
  "transition-[opacity,max-width] duration-[180ms] ease-[var(--ease-out-quart)] motion-reduce:transition-none",
7162
7473
  "max-w-full opacity-100",
7163
7474
  "group-data-[labels=hide]/sidebar:max-w-0 group-data-[labels=hide]/sidebar:opacity-0 group-data-[labels=hide]/sidebar:invisible"
@@ -7178,7 +7489,10 @@ var SidebarLinkLabel = React36.forwardRef(
7178
7489
  {
7179
7490
  ref,
7180
7491
  className: cn(
7181
- "min-w-0 flex-1 truncate",
7492
+ // line-clamp-1 (not `truncate`) so multi-word labels clip at a
7493
+ // word boundary; collapses cleanly with the rail-mode max-width
7494
+ // animation since both rules only constrain visible content.
7495
+ "min-w-0 flex-1 line-clamp-1",
7182
7496
  // Fade + collapse instead of hard display:none so a single
7183
7497
  // 180ms opacity tween covers all labels in lockstep with the
7184
7498
  // 220ms aside-width transition — no snap on the last frame.
@@ -7296,7 +7610,10 @@ var SidebarLinkGroup = React36.forwardRef(
7296
7610
  "span",
7297
7611
  {
7298
7612
  className: cn(
7299
- "min-w-0 flex-1 truncate",
7613
+ // line-clamp-1 (not `truncate`) so multi-word labels clip at a
7614
+ // word boundary; collapses cleanly with the rail-mode max-width
7615
+ // animation since both rules only constrain visible content.
7616
+ "min-w-0 flex-1 line-clamp-1",
7300
7617
  "transition-[opacity,max-width] duration-[180ms] ease-[var(--ease-out-quart)] motion-reduce:transition-none",
7301
7618
  "max-w-full opacity-100",
7302
7619
  "group-data-[labels=hide]/sidebar:max-w-0 group-data-[labels=hide]/sidebar:opacity-0 group-data-[labels=hide]/sidebar:invisible"
@@ -7390,8 +7707,8 @@ var SidebarUser = React36.forwardRef(function SidebarUser2({ name, subtitle, ava
7390
7707
  "group-data-[labels=hide]/sidebar:max-w-0 group-data-[labels=hide]/sidebar:opacity-0 group-data-[labels=hide]/sidebar:invisible"
7391
7708
  ),
7392
7709
  children: [
7393
- /* @__PURE__ */ jsx("div", { className: "text-fg truncate text-[13px] font-medium", children: name }),
7394
- subtitle != null && /* @__PURE__ */ jsx("div", { className: "text-fg-4 truncate font-mono text-[10.5px]", children: subtitle })
7710
+ /* @__PURE__ */ jsx("div", { className: "text-fg line-clamp-1 text-[13px] font-medium", children: name }),
7711
+ subtitle != null && /* @__PURE__ */ jsx("div", { className: "text-fg-4 line-clamp-1 font-mono text-[10.5px]", children: subtitle })
7395
7712
  ]
7396
7713
  }
7397
7714
  )
@@ -7460,7 +7777,7 @@ var AppHeaderSearch = forwardRef(
7460
7777
  ...props,
7461
7778
  children: [
7462
7779
  /* @__PURE__ */ jsx(SearchIcon, { className: "size-[13px] shrink-0", strokeWidth: 1.8, "aria-hidden": "true" }),
7463
- /* @__PURE__ */ jsx("span", { className: "truncate text-left", children: placeholder }),
7780
+ /* @__PURE__ */ jsx("span", { className: "line-clamp-1 text-left", children: placeholder }),
7464
7781
  shortcut !== null && shortcut !== void 0 && shortcut !== "" && /* @__PURE__ */ jsx(
7465
7782
  "kbd",
7466
7783
  {
@@ -7569,35 +7886,125 @@ var toneToValue = {
7569
7886
  accent: "text-accent",
7570
7887
  muted: "text-fg"
7571
7888
  };
7572
- var KpiCard = forwardRef(function KpiCard2({ label, value, icon, tone = "muted", hint, action, toneValue, className, ...props }, ref) {
7573
- return /* @__PURE__ */ jsx(Card, { ref, className: cn("p-4", className), ...props, children: /* @__PURE__ */ jsxs("div", { className: "flex items-start gap-3", children: [
7574
- icon && /* @__PURE__ */ jsx(
7575
- "div",
7576
- {
7577
- "aria-hidden": "true",
7578
- className: cn(
7579
- "flex size-10 shrink-0 items-center justify-center rounded-lg [&_svg]:size-5",
7580
- toneToTile[tone]
7581
- ),
7582
- children: icon
7583
- }
7584
- ),
7585
- /* @__PURE__ */ jsxs("div", { className: "min-w-0 flex-1", children: [
7586
- /* @__PURE__ */ jsx(
7587
- "p",
7889
+ var sentimentChip = {
7890
+ positive: "bg-success-bg text-success-fg",
7891
+ negative: "bg-danger-bg text-danger-fg",
7892
+ neutral: "bg-bg-3 text-fg-3"
7893
+ };
7894
+ var sentimentText = {
7895
+ positive: "text-success-fg",
7896
+ negative: "text-danger-fg",
7897
+ neutral: "text-fg-3"
7898
+ };
7899
+ var directionToSentiment = {
7900
+ up: "positive",
7901
+ down: "negative",
7902
+ flat: "neutral"
7903
+ };
7904
+ var directionToIcon = {
7905
+ up: TrendingUpIcon,
7906
+ down: TrendingDownIcon,
7907
+ flat: MinusIcon
7908
+ };
7909
+ var directionToSrLabel = {
7910
+ up: "Up",
7911
+ down: "Down",
7912
+ flat: "No change"
7913
+ };
7914
+ function Sparkline({ data, className }) {
7915
+ if (data.length < 2) return null;
7916
+ const w = 100;
7917
+ const h = 28;
7918
+ const min = Math.min(...data);
7919
+ const max = Math.max(...data);
7920
+ const range = max - min || 1;
7921
+ const coords = data.map((d, i) => {
7922
+ const x = i / (data.length - 1) * w;
7923
+ const y = h - (d - min) / range * (h - 2) - 1;
7924
+ return [x, y];
7925
+ });
7926
+ const line = coords.map(([x, y]) => `${x.toFixed(2)},${y.toFixed(2)}`).join(" ");
7927
+ const area = `0,${h} ${line} ${w},${h}`;
7928
+ return /* @__PURE__ */ jsxs(
7929
+ "svg",
7930
+ {
7931
+ viewBox: `0 0 ${w} ${h}`,
7932
+ preserveAspectRatio: "none",
7933
+ className: cn("h-7 w-full", className),
7934
+ "aria-hidden": "true",
7935
+ children: [
7936
+ /* @__PURE__ */ jsx("polygon", { points: area, fill: "currentColor", className: "opacity-10" }),
7937
+ /* @__PURE__ */ jsx(
7938
+ "polyline",
7939
+ {
7940
+ points: line,
7941
+ fill: "none",
7942
+ stroke: "currentColor",
7943
+ strokeWidth: "2",
7944
+ strokeLinecap: "round",
7945
+ strokeLinejoin: "round",
7946
+ vectorEffect: "non-scaling-stroke"
7947
+ }
7948
+ )
7949
+ ]
7950
+ }
7951
+ );
7952
+ }
7953
+ var KpiCard = forwardRef(function KpiCard2({ label, value, icon, tone = "muted", delta, trend, hint, action, toneValue, className, ...props }, ref) {
7954
+ const deltaSentiment = delta ? delta.sentiment ?? directionToSentiment[delta.direction] : null;
7955
+ const DeltaIcon = delta ? directionToIcon[delta.direction] : null;
7956
+ const sparkColor = deltaSentiment ? sentimentText[deltaSentiment] : toneToValue[tone];
7957
+ return /* @__PURE__ */ jsxs(Card, { ref, className: cn("p-4", className), ...props, children: [
7958
+ /* @__PURE__ */ jsxs("div", { className: "flex items-start gap-3", children: [
7959
+ icon && /* @__PURE__ */ jsx(
7960
+ "div",
7588
7961
  {
7962
+ "aria-hidden": "true",
7589
7963
  className: cn(
7590
- "text-2xl font-bold tracking-tight tabular-nums",
7591
- toneValue ? toneToValue[tone] : "text-fg"
7964
+ "flex size-10 shrink-0 items-center justify-center rounded-lg [&_svg]:size-5",
7965
+ toneToTile[tone]
7592
7966
  ),
7593
- children: value
7967
+ children: icon
7594
7968
  }
7595
7969
  ),
7596
- /* @__PURE__ */ jsx("p", { className: "text-fg-3 text-xs", children: label }),
7597
- hint && /* @__PURE__ */ jsx("p", { className: "text-fg-4 mt-0.5 text-[11px]", children: hint })
7970
+ /* @__PURE__ */ jsxs("div", { className: "min-w-0 flex-1", children: [
7971
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-baseline gap-x-2 gap-y-1", children: [
7972
+ /* @__PURE__ */ jsx(
7973
+ "p",
7974
+ {
7975
+ className: cn(
7976
+ "text-2xl font-bold tracking-tight tabular-nums",
7977
+ toneValue ? toneToValue[tone] : "text-fg"
7978
+ ),
7979
+ children: value
7980
+ }
7981
+ ),
7982
+ delta && DeltaIcon && deltaSentiment && /* @__PURE__ */ jsxs(
7983
+ "span",
7984
+ {
7985
+ className: cn(
7986
+ "inline-flex items-center gap-0.5 rounded-full px-1.5 py-0.5 text-[11px] font-semibold tabular-nums",
7987
+ sentimentChip[deltaSentiment]
7988
+ ),
7989
+ children: [
7990
+ /* @__PURE__ */ jsx(DeltaIcon, { className: "size-3" }),
7991
+ /* @__PURE__ */ jsxs("span", { className: "sr-only", children: [
7992
+ directionToSrLabel[delta.direction],
7993
+ " "
7994
+ ] }),
7995
+ delta.value
7996
+ ]
7997
+ }
7998
+ )
7999
+ ] }),
8000
+ /* @__PURE__ */ jsx("p", { className: "text-fg-3 text-xs", children: label }),
8001
+ delta?.label && /* @__PURE__ */ jsx("p", { className: "text-fg-4 mt-0.5 text-[11px]", children: delta.label }),
8002
+ hint && /* @__PURE__ */ jsx("p", { className: "text-fg-4 mt-0.5 text-[11px]", children: hint })
8003
+ ] }),
8004
+ action && /* @__PURE__ */ jsx("div", { className: "shrink-0", children: action })
7598
8005
  ] }),
7599
- action && /* @__PURE__ */ jsx("div", { className: "shrink-0", children: action })
7600
- ] }) });
8006
+ trend && trend.length > 1 && /* @__PURE__ */ jsx(Sparkline, { data: trend, className: cn("mt-3", sparkColor) })
8007
+ ] });
7601
8008
  });
7602
8009
  KpiCard.displayName = "KpiCard";
7603
8010
  var DataTable = forwardRef(function DataTable2({ withToolbar, className, children, ...props }, ref) {
@@ -7970,7 +8377,7 @@ var DetailSpineHeader = forwardRef(
7970
8377
  }
7971
8378
  ),
7972
8379
  /* @__PURE__ */ jsxs("div", { className: "min-w-0 flex-1", children: [
7973
- /* @__PURE__ */ jsx("div", { className: "font-display text-fg truncate text-base leading-tight font-medium", children: title }),
8380
+ /* @__PURE__ */ jsx("div", { className: "font-display text-fg line-clamp-1 text-base leading-tight font-medium", children: title }),
7974
8381
  /* @__PURE__ */ jsx("div", { className: "font-spec text-fg-4 text-[11px]", children: subtitle })
7975
8382
  ] })
7976
8383
  ] });
@@ -8049,29 +8456,196 @@ var KanbanColumn = forwardRef(function KanbanColumn2({ title, count, className,
8049
8456
  );
8050
8457
  });
8051
8458
  KanbanColumn.displayName = "KanbanColumn";
8052
- var kanbanCardVariants = cva(
8053
- cn(
8054
- "bg-surface border border-rule rounded-card shadow-quiet p-3 space-y-2 cursor-grab",
8055
- "transition-colors duration-[var(--duration-fast)] ease-[var(--ease-out-quart)] motion-reduce:transition-none"
8056
- ),
8057
- {
8058
- variants: {
8059
- variant: {
8060
- default: "",
8061
- pro: "border-l-2 border-l-pro-fg",
8062
- warn: "border-l-2 border-l-warning-fg",
8063
- danger: "border-l-2 border-l-danger-fg"
8064
- }
8065
- },
8066
- defaultVariants: {
8067
- variant: "default"
8068
- }
8069
- }
8459
+ var kanbanCardBase = cn(
8460
+ "bg-surface border border-rule rounded-card shadow-quiet p-3 space-y-2 cursor-grab",
8461
+ "transition-colors duration-[var(--duration-fast)] ease-[var(--ease-out-quart)] hover:border-rule-strong motion-reduce:transition-none"
8070
8462
  );
8071
- var KanbanCard = forwardRef(function KanbanCard2({ variant, className, children, ...props }, ref) {
8072
- return /* @__PURE__ */ jsx("div", { ref, className: cn(kanbanCardVariants({ variant }), className), ...props, children });
8463
+ var priorityConfig = {
8464
+ high: { label: "High", variant: "destructive" },
8465
+ medium: { label: "Med", variant: "warning" },
8466
+ low: { label: "Low", variant: "secondary" }
8467
+ };
8468
+ var dueStatusClass = {
8469
+ overdue: "text-danger-fg font-semibold",
8470
+ soon: "text-warning-fg font-semibold",
8471
+ default: "text-fg-3 font-medium"
8472
+ };
8473
+ var KanbanCard = forwardRef(function KanbanCard2({ className, label, title, client, priority, dueDate, dueStatus, assignee, children, ...props }, ref) {
8474
+ const isRich = title !== void 0;
8475
+ const pri = priority ? priorityConfig[priority] : null;
8476
+ const hasFooter = Boolean(dueDate || assignee);
8477
+ return /* @__PURE__ */ jsx("div", { ref, className: cn(kanbanCardBase, className), ...props, children: isRich ? /* @__PURE__ */ jsxs("div", { children: [
8478
+ (label || pri) && /* @__PURE__ */ jsxs("div", { className: "mb-2 flex items-start justify-between gap-2", children: [
8479
+ label ? /* @__PURE__ */ jsx(Badge, { variant: "info", size: "sm", children: label }) : /* @__PURE__ */ jsx("span", {}),
8480
+ pri && /* @__PURE__ */ jsx(Badge, { variant: pri.variant, size: "sm", children: pri.label })
8481
+ ] }),
8482
+ /* @__PURE__ */ jsx("p", { className: "text-fg text-[13px] leading-snug font-semibold", children: title }),
8483
+ client && /* @__PURE__ */ jsxs("p", { className: "text-fg-3 mt-1 flex items-center gap-1.5 text-xs", children: [
8484
+ /* @__PURE__ */ jsx(UserIcon, { className: "size-3 shrink-0", "aria-hidden": "true" }),
8485
+ /* @__PURE__ */ jsx("span", { className: "truncate", children: client })
8486
+ ] }),
8487
+ hasFooter && /* @__PURE__ */ jsxs("div", { className: "border-rule-soft mt-3 flex items-center justify-between border-t pt-2.5", children: [
8488
+ dueDate ? /* @__PURE__ */ jsxs(
8489
+ "span",
8490
+ {
8491
+ className: cn(
8492
+ "flex items-center gap-1 text-xs",
8493
+ dueStatusClass[dueStatus ?? "default"]
8494
+ ),
8495
+ children: [
8496
+ /* @__PURE__ */ jsx(CalendarIcon, { className: "size-3 shrink-0", "aria-hidden": "true" }),
8497
+ dueDate
8498
+ ]
8499
+ }
8500
+ ) : /* @__PURE__ */ jsx("span", {}),
8501
+ assignee && /* @__PURE__ */ jsx(Avatar, { size: "xs", name: assignee.name, src: assignee.src, title: assignee.name })
8502
+ ] })
8503
+ ] }) : children });
8073
8504
  });
8074
8505
  KanbanCard.displayName = "KanbanCard";
8506
+ var NotificationPanel = forwardRef(
8507
+ function NotificationPanel2({ className, children, ...props }, ref) {
8508
+ return /* @__PURE__ */ jsx("div", { ref, className: cn("bg-surface text-fg flex w-full flex-col", className), ...props, children });
8509
+ }
8510
+ );
8511
+ NotificationPanel.displayName = "NotificationPanel";
8512
+ var NotificationPanelHeader = forwardRef(
8513
+ function NotificationPanelHeader2({ title = "Notifications", unreadCount = 0, onMarkAllRead, onSettings, className, ...props }, ref) {
8514
+ return /* @__PURE__ */ jsxs(
8515
+ "div",
8516
+ {
8517
+ ref,
8518
+ className: cn("border-rule flex items-center justify-between border-b px-4 py-3", className),
8519
+ ...props,
8520
+ children: [
8521
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
8522
+ /* @__PURE__ */ jsx("h3", { className: "text-fg text-sm font-semibold", children: title }),
8523
+ unreadCount > 0 && /* @__PURE__ */ jsx("span", { className: "bg-accent/10 text-accent rounded-pill px-1.5 py-0.5 text-[11px] font-semibold tabular-nums", children: unreadCount > 99 ? "99+" : unreadCount })
8524
+ ] }),
8525
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1", children: [
8526
+ onMarkAllRead && unreadCount > 0 && /* @__PURE__ */ jsx(
8527
+ "button",
8528
+ {
8529
+ type: "button",
8530
+ onClick: onMarkAllRead,
8531
+ className: "text-fg-3 hover:text-fg text-xs font-medium",
8532
+ children: "Mark all read"
8533
+ }
8534
+ ),
8535
+ onSettings && /* @__PURE__ */ jsx(
8536
+ "button",
8537
+ {
8538
+ type: "button",
8539
+ onClick: onSettings,
8540
+ "aria-label": "Notification settings",
8541
+ className: "text-fg-3 hover:text-fg hover:bg-bg-2 rounded-md p-1 [&_svg]:size-[15px]",
8542
+ children: /* @__PURE__ */ jsx(SettingsIcon, {})
8543
+ }
8544
+ )
8545
+ ] })
8546
+ ]
8547
+ }
8548
+ );
8549
+ }
8550
+ );
8551
+ NotificationPanelHeader.displayName = "NotificationPanelHeader";
8552
+ var FILTER_OPTIONS = ["all", "unread"];
8553
+ var NotificationFilter = forwardRef(
8554
+ function NotificationFilter2({ value, onValueChange, actions, className, ...props }, ref) {
8555
+ return /* @__PURE__ */ jsxs(
8556
+ "div",
8557
+ {
8558
+ ref,
8559
+ className: cn(
8560
+ "border-rule flex items-center justify-between gap-2 border-b px-3 py-2",
8561
+ className
8562
+ ),
8563
+ ...props,
8564
+ children: [
8565
+ /* @__PURE__ */ jsx("div", { className: "bg-bg-2 inline-flex rounded-md p-0.5 text-xs font-medium", children: FILTER_OPTIONS.map((option) => /* @__PURE__ */ jsx(
8566
+ "button",
8567
+ {
8568
+ type: "button",
8569
+ onClick: () => onValueChange(option),
8570
+ "aria-pressed": value === option,
8571
+ className: cn(
8572
+ "rounded-[6px] px-2.5 py-1 capitalize transition-colors",
8573
+ "focus-visible:ring-accent outline-none focus-visible:ring-2",
8574
+ value === option ? "bg-surface text-fg shadow-quiet" : "text-fg-3 hover:text-fg"
8575
+ ),
8576
+ children: option
8577
+ },
8578
+ option
8579
+ )) }),
8580
+ actions
8581
+ ]
8582
+ }
8583
+ );
8584
+ }
8585
+ );
8586
+ NotificationFilter.displayName = "NotificationFilter";
8587
+ var NotificationList = forwardRef(
8588
+ function NotificationList2({ className, children, ...props }, ref) {
8589
+ return /* @__PURE__ */ jsx(
8590
+ "div",
8591
+ {
8592
+ ref,
8593
+ className: cn("divide-rule-soft max-h-[460px] divide-y overflow-y-auto", className),
8594
+ ...props,
8595
+ children
8596
+ }
8597
+ );
8598
+ }
8599
+ );
8600
+ NotificationList.displayName = "NotificationList";
8601
+ var NotificationItem = forwardRef(
8602
+ function NotificationItem2({ title, body, typeLabel, client, time, sender, icon, unread, className, ...props }, ref) {
8603
+ const meta = [typeLabel, client, time].filter(Boolean);
8604
+ return /* @__PURE__ */ jsxs(
8605
+ "button",
8606
+ {
8607
+ ref,
8608
+ type: "button",
8609
+ className: cn(
8610
+ "flex w-full gap-3 px-4 py-3 text-left outline-none",
8611
+ "transition-colors duration-[var(--duration-fast)] ease-[var(--ease-out-quart)] motion-reduce:transition-none",
8612
+ "hover:bg-bg-2/60 focus-visible:bg-bg-2/60",
8613
+ unread && "bg-accent/[0.06]",
8614
+ className
8615
+ ),
8616
+ ...props,
8617
+ children: [
8618
+ sender ? /* @__PURE__ */ jsx(Avatar, { size: "sm", name: sender.name, src: sender.src, className: "mt-0.5" }) : /* @__PURE__ */ jsx(
8619
+ "div",
8620
+ {
8621
+ "aria-hidden": "true",
8622
+ className: "bg-bg-2 text-fg-3 mt-0.5 flex size-7 shrink-0 items-center justify-center rounded-full [&_svg]:size-3.5",
8623
+ children: icon
8624
+ }
8625
+ ),
8626
+ /* @__PURE__ */ jsxs("div", { className: "min-w-0 flex-1", children: [
8627
+ unread && /* @__PURE__ */ jsx("span", { className: "sr-only", children: "Unread. " }),
8628
+ /* @__PURE__ */ jsx("p", { className: cn("text-fg text-sm leading-snug", unread ? "font-semibold" : "font-medium"), children: title }),
8629
+ body && /* @__PURE__ */ jsx("p", { className: "text-fg-3 mt-0.5 truncate text-xs", children: body }),
8630
+ meta.length > 0 && /* @__PURE__ */ jsx("div", { className: "text-fg-4 mt-1 flex flex-wrap items-center gap-1.5 text-[11px]", children: meta.map((part, i) => /* @__PURE__ */ jsxs(Fragment$1, { children: [
8631
+ i > 0 && /* @__PURE__ */ jsx("span", { "aria-hidden": "true", children: "\xB7" }),
8632
+ /* @__PURE__ */ jsx(
8633
+ "span",
8634
+ {
8635
+ className: cn(
8636
+ i === 0 && typeLabel ? "font-medium tracking-wide uppercase" : "tabular-nums"
8637
+ ),
8638
+ children: part
8639
+ }
8640
+ )
8641
+ ] }, i)) })
8642
+ ] })
8643
+ ]
8644
+ }
8645
+ );
8646
+ }
8647
+ );
8648
+ NotificationItem.displayName = "NotificationItem";
8075
8649
  var Toolbar = forwardRef(function Toolbar2({ className, children, ...props }, ref) {
8076
8650
  return /* @__PURE__ */ jsx("div", { ref, className: cn("flex items-center gap-2", className), ...props, children });
8077
8651
  });
@@ -8199,6 +8773,6 @@ var KbdHint = forwardRef(function KbdHint2({ className, children, ...props }, re
8199
8773
  });
8200
8774
  KbdHint.displayName = "KbdHint";
8201
8775
 
8202
- export { Accordion, AccordionContent, AccordionItem, AccordionTrigger, ActivityItem, ActivityList, Alert, AlertCircleIcon, AlertDescription, AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogOverlay, AlertDialogPortal, AlertDialogTitle, AlertDialogTrigger, AlertTitle, AlertTriangleIcon, AppHeader, AppHeaderActions, AppHeaderBreadcrumb, AppHeaderSearch, AppHeaderTitle, ArrowDownIcon, ArrowLeftIcon, ArrowRightIcon, ArrowRightSmallIcon, ArrowUpIcon, AspectRatio, AtSignIcon, Avatar, Badge, BarChartIcon, BellIcon, Blockquote, BoldIcon, Breadcrumb, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator, BriefcaseIcon, Building2Icon, BuildingIcon, Button, Calendar, CalendarIcon, Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, ChatBubbleIcon, CheckCircle2Icon, CheckIcon, Checkbox, ChevronDownIcon, ChevronLeftIcon, ChevronRightIcon, ChevronUpIcon, ChevronsUpDownIcon, CircleDotIcon, CircleIcon, ClientSelect, ClipboardCheckIcon, ClockIcon, CloseIcon, Collapsible, CollapsibleContent, CollapsibleTrigger, ComingSoon, CommandIcon, CommandPalette, ConfirmActionButton, Content15 as Content, ContextMenu, ContextMenuCheckboxItem, ContextMenuContent, ContextMenuGroup, ContextMenuItem, ContextMenuLabel, ContextMenuPortal, ContextMenuRadioGroup, ContextMenuRadioItem, ContextMenuSeparator, ContextMenuShortcut, ContextMenuSub, ContextMenuSubContent, ContextMenuSubTrigger, ContextMenuTrigger, CopyButton, CopyIcon, CornerDownLeftIcon, CreditCardIcon, DATE_DISPLAY_PLACEHOLDER, DangerAction, DataItem, DataTable, DataTableBody, DataTableCell, DataTableCellDue, DataTableCellId, DataTableCellMono, DataTableCellName, DataTableCheckbox, DataTableHead, DataTableHeader, DataTablePagination, DataTableResultsCount, DataTableRow, DataTableSearch, DataTableSpacer, DataTableToolbar, DatePicker, DetailGrid, DetailMain, DetailSpine, DetailSpineHeader, DetailSpineSection, DetailSpineStats, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, DismissibleChip, DocumentIcon, DollarSignIcon, DownloadIcon, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, EmptyState, EyeIcon, EyeOffIcon, Eyebrow, FileIcon, FileReturnIcon, FileTextIcon, FileUpload, FilterChip, FilterIcon, FlagIcon, FolderClosedIcon, FolderOpenIcon, FolderPlusIcon, FormError, FormSection, FormSuccess, GlobeIcon, GoogleBrandIcon, HelpCircleIcon, HistoryIcon, HomeIcon, HoverCard, HoverCardContent, HoverCardPortal, HoverCardTrigger, IconAction, InboxIcon, InfoIcon, Input, ItalicIcon, Kanban, KanbanCard, KanbanColumn, KanbanIcon, KbdHint, KeyIcon, KeyboardShortcutsDialog, KpiCard, Label4 as Label, LayoutDashboardIcon, LayoutGridIcon, LayoutListIcon, LightningIcon, Link2Icon, LinkAction, LinkButton, LinkIcon, ListChecksIcon, ListIcon, ListOrderedIcon, LoaderIcon, LoadingRows, LockIcon, LockKeyholeIcon, LockOpenIcon, LogOutIcon, Logo, MailIcon, Main, MapPinIcon, MenuIcon, MessageCircleIcon, MessageCircleWarningIcon, MetadataGrid, MicrosoftBrandIcon, MinusIcon, MonitorIcon, MoonIcon, MoreHorizontalIcon, MoveIcon, MultiFilterPill, MultiSelectField, MutedSpec, Numeric, OTPInput, PageHeader, PageHeaderSep, PageHeaderSpec, Pagination, PaletteIcon, PanelLeftCloseIcon, PanelLeftIcon, PaperclipIcon, PenSignIcon, PencilIcon, PhoneIcon, PhoneInput, PlusIcon, Popover, PopoverAnchor, PopoverClose, PopoverContent, PopoverPortal, PopoverTrigger, PrimaryAction, ProgressBar, ProgressRing, RadioGroup3 as RadioGroup, RadioGroupItem, ReceiptIcon, ReplyIcon, RotateCcwIcon, SaveIcon, ScrollArea, ScrollBar, SearchIcon, SearchInput, SearchSelect, SecondaryAction, Section, SectionHead, SectionHeader, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectRoot, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, SendIcon, Separator4 as Separator, SettingsIcon, Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetOverlay, SheetPortal, SheetTitle, SheetTrigger, Shell, ShieldIcon, SideDrawer, Sidebar, SidebarBrand, SidebarBrandText, SidebarFooter, SidebarLink, SidebarLinkAction, SidebarLinkBadge, SidebarLinkGroup, SidebarLinkLabel, SidebarProvider, SidebarSection, SidebarTrigger, SidebarUser, Skeleton, SkeletonCircle, SkeletonText, SlashIcon, Slider, SmartphoneIcon, SparkleIcon, SparklesIcon, StarIcon, StarRating, Stat, Stepper, StrikethroughIcon, SubmitButton, SunIcon, Switch, Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableIcon, TableRow, Tabs, TabsContent, TabsList, TabsTrigger, TagIcon, TeamIcon, TeamMemberSelect, Textarea, ToastProvider, ToggleGroup, ToggleGroupItem, Toolbar, Tooltip, TooltipContent, TooltipPortal, TooltipProvider, TooltipTrigger, Trash2Icon, TrashIcon, UnderlineIcon, UploadIcon, UserCircleIcon, UserIcon, UsersIcon, VisuallyHidden, WorkflowIcon, XIcon, ZoomInIcon, ZoomOutIcon, alertVariants, badgeVariants, buttonVariants, cardVariants, cn, colors, displayToIso, filterChipVariants, inputVariants, isoToDisplay, kanbanCardVariants, labelVariants, progressBarVariants, progressRingVariants, radii, reference, searchInputVariants, shadows, sidebarLinkBadgeVariants, spacing, starRatingVariants, surfaces, systemTokens, textareaVariants, typography, useSidebarState, useToast };
8776
+ export { Accordion, AccordionContent, AccordionItem, AccordionTrigger, ActivityItem, ActivityList, Alert, AlertCircleIcon, AlertDescription, AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogOverlay, AlertDialogPortal, AlertDialogTitle, AlertDialogTrigger, AlertTitle, AlertTriangleIcon, AlertTriangleSolidIcon, AppHeader, AppHeaderActions, AppHeaderBreadcrumb, AppHeaderSearch, AppHeaderTitle, ArrowDownIcon, ArrowLeftIcon, ArrowRightIcon, ArrowRightSmallIcon, ArrowUpIcon, AspectRatio, AtSignIcon, Avatar, Badge, BarChartIcon, BellIcon, Blockquote, BoldIcon, Breadcrumb, BreadcrumbItem, BreadcrumbLink, BreadcrumbList, BreadcrumbPage, BreadcrumbSeparator, BriefcaseIcon, Building2Icon, BuildingIcon, Button, Calendar, CalendarIcon, Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader, CardTitle, ChatBubbleIcon, CheckCircle2Icon, CheckCircleSolidIcon, CheckIcon, Checkbox, ChevronDownIcon, ChevronLeftIcon, ChevronRightIcon, ChevronUpIcon, ChevronsUpDownIcon, CircleDotIcon, CircleIcon, ClientSelect, ClipboardCheckIcon, ClockIcon, CloseIcon, Collapsible, CollapsibleContent, CollapsibleTrigger, ComingSoon, CommandIcon, CommandPalette, ConfirmActionButton, Content15 as Content, ContextMenu, ContextMenuCheckboxItem, ContextMenuContent, ContextMenuGroup, ContextMenuItem, ContextMenuLabel, ContextMenuPortal, ContextMenuRadioGroup, ContextMenuRadioItem, ContextMenuSeparator, ContextMenuShortcut, ContextMenuSub, ContextMenuSubContent, ContextMenuSubTrigger, ContextMenuTrigger, CopyButton, CopyIcon, CornerDownLeftIcon, CreditCardIcon, DATE_DISPLAY_PLACEHOLDER, DangerAction, DataItem, DataTable, DataTableBody, DataTableCell, DataTableCellDue, DataTableCellId, DataTableCellMono, DataTableCellName, DataTableCheckbox, DataTableHead, DataTableHeader, DataTablePagination, DataTableResultsCount, DataTableRow, DataTableSearch, DataTableSpacer, DataTableToolbar, DatePicker, DetailGrid, DetailMain, DetailSpine, DetailSpineHeader, DetailSpineSection, DetailSpineStats, Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, DismissibleChip, DocumentIcon, DollarSignIcon, DownloadIcon, DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, EmptyState, EyeIcon, EyeOffIcon, Eyebrow, FileIcon, FileReturnIcon, FileTextIcon, FileUpload, FilterChip, FilterIcon, FlagIcon, FolderClosedIcon, FolderOpenIcon, FolderPlusIcon, FormError, FormSection, FormSuccess, GlobeIcon, GoogleBrandIcon, HelpCircleIcon, HistoryIcon, HomeIcon, HoverCard, HoverCardContent, HoverCardPortal, HoverCardTrigger, IconAction, InboxIcon, InfoCircleSolidIcon, InfoIcon, Input, ItalicIcon, Kanban, KanbanCard, KanbanColumn, KanbanIcon, KbdHint, KeyIcon, KeyboardShortcutsDialog, KpiCard, Label4 as Label, LayoutDashboardIcon, LayoutGridIcon, LayoutListIcon, LightningIcon, Link2Icon, LinkAction, LinkButton, LinkIcon, ListChecksIcon, ListIcon, ListOrderedIcon, LoaderIcon, LoadingRows, LockIcon, LockKeyholeIcon, LockOpenIcon, LogOutIcon, Logo, MailIcon, Main, MapPinIcon, MenuIcon, MessageCircleIcon, MessageCircleWarningIcon, MetadataGrid, MicrosoftBrandIcon, MinusIcon, MonitorIcon, MoonIcon, MoreHorizontalIcon, MoveIcon, MultiFilterPill, MultiSelectField, MutedSpec, NotificationFilter, NotificationItem, NotificationList, NotificationPanel, NotificationPanelHeader, Numeric, OTPInput, PageHeader, PageHeaderSep, PageHeaderSpec, Pagination, PaletteIcon, PanelLeftCloseIcon, PanelLeftIcon, PaperclipIcon, PenSignIcon, PencilIcon, PhoneIcon, PhoneInput, PlusIcon, Popover, PopoverAnchor, PopoverClose, PopoverContent, PopoverPortal, PopoverTrigger, PrimaryAction, ProgressBar, ProgressRing, RadioGroup3 as RadioGroup, RadioGroupItem, ReceiptIcon, ReplyIcon, RotateCcwIcon, SaveIcon, ScrollArea, ScrollBar, SearchIcon, SearchInput, SearchSelect, SecondaryAction, Section, SectionHead, SectionHeader, Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectRoot, SelectScrollDownButton, SelectScrollUpButton, SelectSeparator, SelectTrigger, SelectValue, SendIcon, Separator4 as Separator, SettingsIcon, Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetOverlay, SheetPortal, SheetTitle, SheetTrigger, Shell, ShieldIcon, SideDrawer, Sidebar, SidebarBrand, SidebarBrandText, SidebarFooter, SidebarLink, SidebarLinkAction, SidebarLinkBadge, SidebarLinkGroup, SidebarLinkLabel, SidebarProvider, SidebarSection, SidebarTrigger, SidebarUser, Skeleton, SkeletonCircle, SkeletonText, SlashIcon, Slider, SmartphoneIcon, SparkleIcon, SparklesIcon, StarIcon, StarRating, Stat, Stepper, StrikethroughIcon, SubmitButton, SunIcon, Switch, Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableIcon, TableRow, Tabs, TabsContent, TabsList, TabsTrigger, TagIcon, TeamIcon, TeamMemberSelect, Textarea, ToastProvider, ToggleGroup, ToggleGroupItem, Toolbar, Tooltip, TooltipContent, TooltipPortal, TooltipProvider, TooltipTrigger, Trash2Icon, TrashIcon, TrendingDownIcon, TrendingUpIcon, UnderlineIcon, UploadIcon, UserCircleIcon, UserIcon, UsersIcon, VisuallyHidden, WorkflowIcon, XCircleSolidIcon, XIcon, ZoomInIcon, ZoomOutIcon, alertVariants, badgeVariants, buttonVariants, cardVariants, cn, colors, displayToIso, filterChipVariants, inputVariants, isoToDisplay, labelVariants, progressBarVariants, progressRingVariants, radii, reference, searchInputVariants, shadows, sidebarLinkBadgeVariants, spacing, starRatingVariants, surfaces, systemTokens, textareaVariants, typography, useSidebarState, useToast };
8203
8777
  //# sourceMappingURL=index.js.map
8204
8778
  //# sourceMappingURL=index.js.map