@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/README.md +13 -14
- package/dist/index.d.ts +271 -76
- package/dist/index.js +754 -180
- package/dist/index.js.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/tokens/index.d.ts +3 -5
- package/dist/tokens/index.js.map +1 -1
- package/package.json +2 -1
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
|
|
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
|
|
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
|
|
4421
|
-
|
|
4422
|
-
|
|
4423
|
-
|
|
4424
|
-
|
|
4425
|
-
|
|
4426
|
-
|
|
4427
|
-
|
|
4428
|
-
|
|
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 ===
|
|
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:
|
|
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":
|
|
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
|
-
|
|
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: "
|
|
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: "
|
|
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__ */
|
|
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
|
-
|
|
5568
|
-
|
|
5569
|
-
|
|
5570
|
-
|
|
5571
|
-
|
|
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
|
-
|
|
5577
|
-
|
|
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
|
-
"
|
|
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(
|
|
5583
|
-
|
|
5851
|
+
/* @__PURE__ */ jsx(PlusIcon, { className: "size-4 shrink-0", "aria-hidden": "true" }),
|
|
5852
|
+
createNewLabel
|
|
5584
5853
|
]
|
|
5585
|
-
}
|
|
5586
|
-
|
|
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
|
|
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
|
|
6641
|
-
default: "bg-
|
|
6642
|
-
success:
|
|
6643
|
-
|
|
6644
|
-
|
|
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
|
-
|
|
6655
|
-
if (duration <= 0) return;
|
|
6916
|
+
if (!showProgress) return;
|
|
6656
6917
|
timerRef.current = setTimeout(close, duration);
|
|
6657
6918
|
return () => clearTimeout(timerRef.current);
|
|
6658
|
-
}, [
|
|
6659
|
-
|
|
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:
|
|
6678
|
-
/* @__PURE__ */ jsxs("div", { className: "
|
|
6679
|
-
/* @__PURE__ */ jsx(
|
|
6680
|
-
|
|
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
|
-
"
|
|
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
|
-
"
|
|
6689
|
-
|
|
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
|
-
"
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
7394
|
-
subtitle != null && /* @__PURE__ */ jsx("div", { className: "text-fg-4
|
|
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: "
|
|
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
|
|
7573
|
-
|
|
7574
|
-
|
|
7575
|
-
|
|
7576
|
-
|
|
7577
|
-
|
|
7578
|
-
|
|
7579
|
-
|
|
7580
|
-
|
|
7581
|
-
|
|
7582
|
-
|
|
7583
|
-
|
|
7584
|
-
|
|
7585
|
-
|
|
7586
|
-
|
|
7587
|
-
|
|
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
|
-
"
|
|
7591
|
-
|
|
7964
|
+
"flex size-10 shrink-0 items-center justify-center rounded-lg [&_svg]:size-5",
|
|
7965
|
+
toneToTile[tone]
|
|
7592
7966
|
),
|
|
7593
|
-
children:
|
|
7967
|
+
children: icon
|
|
7594
7968
|
}
|
|
7595
7969
|
),
|
|
7596
|
-
/* @__PURE__ */
|
|
7597
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
8053
|
-
|
|
8054
|
-
|
|
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
|
|
8072
|
-
|
|
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,
|
|
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
|