@lessly/ui 2.1.0 → 2.3.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/{chunk-F5RMHSPS.js → chunk-CEXND5YW.js} +38 -5
- package/dist/index.d.ts +142 -39
- package/dist/index.js +444 -176
- package/dist/router.js +3 -3
- package/dist/styles-federated.css +34 -0
- package/dist/styles.css +34 -0
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -19,7 +19,7 @@ import {
|
|
|
19
19
|
cn,
|
|
20
20
|
useIsMobile,
|
|
21
21
|
useSidebar
|
|
22
|
-
} from "./chunk-
|
|
22
|
+
} from "./chunk-CEXND5YW.js";
|
|
23
23
|
|
|
24
24
|
// src/components/auto-height.tsx
|
|
25
25
|
import * as React from "react";
|
|
@@ -170,7 +170,7 @@ var DialogContent = React3.forwardRef(({ className, children, showClose = true,
|
|
|
170
170
|
...props,
|
|
171
171
|
children: [
|
|
172
172
|
children,
|
|
173
|
-
showClose && /* @__PURE__ */ jsxs2(DialogPrimitive.Close, { className: "absolute right-4 top-4 rounded-sm text-text-tertiary opacity-70 transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-border-focus disabled:pointer-events-none", children: [
|
|
173
|
+
showClose && /* @__PURE__ */ jsxs2(DialogPrimitive.Close, { className: "absolute right-4 top-4 rounded-sm text-text-tertiary opacity-70 transition-opacity duration-fast hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-border-focus disabled:pointer-events-none", children: [
|
|
174
174
|
/* @__PURE__ */ jsx3(X, { className: "h-4 w-4" }),
|
|
175
175
|
/* @__PURE__ */ jsx3("span", { className: "sr-only", children: "Close" })
|
|
176
176
|
] })
|
|
@@ -291,7 +291,7 @@ var DropdownMenuItem = React4.forwardRef(({ className, inset, variant = "default
|
|
|
291
291
|
{
|
|
292
292
|
ref,
|
|
293
293
|
className: cn(
|
|
294
|
-
"relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none transition-colors focus:bg-bg-secondary focus:text-text-primary focus:ring-1 focus:ring-inset data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
|
|
294
|
+
"relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none transition-colors duration-fast focus:bg-bg-secondary focus:text-text-primary focus:ring-1 focus:ring-inset data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
|
|
295
295
|
inset && "pl-8",
|
|
296
296
|
// Destructive reddens — wash and label — under the pointer or the keyboard, and drops the red
|
|
297
297
|
// frame a destructive Button rests on, because a row repeated down a menu makes the whole menu
|
|
@@ -308,7 +308,7 @@ var DropdownMenuCheckboxItem = React4.forwardRef(({ className, children, checked
|
|
|
308
308
|
{
|
|
309
309
|
ref,
|
|
310
310
|
className: cn(
|
|
311
|
-
"relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-bg-secondary focus:text-text-primary focus:ring-1 focus:ring-inset focus:ring-border-selected data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
|
|
311
|
+
"relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors duration-fast focus:bg-bg-secondary focus:text-text-primary focus:ring-1 focus:ring-inset focus:ring-border-selected data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
|
|
312
312
|
className
|
|
313
313
|
),
|
|
314
314
|
checked,
|
|
@@ -325,7 +325,7 @@ var DropdownMenuRadioItem = React4.forwardRef(({ className, children, ...props }
|
|
|
325
325
|
{
|
|
326
326
|
ref,
|
|
327
327
|
className: cn(
|
|
328
|
-
"relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-bg-secondary focus:text-text-primary focus:ring-1 focus:ring-inset focus:ring-border-selected data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
|
|
328
|
+
"relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors duration-fast focus:bg-bg-secondary focus:text-text-primary focus:ring-1 focus:ring-inset focus:ring-border-selected data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
|
|
329
329
|
className
|
|
330
330
|
),
|
|
331
331
|
...props,
|
|
@@ -349,7 +349,7 @@ var DropdownMenuSeparator = React4.forwardRef(({ className, ...props }, ref) =>
|
|
|
349
349
|
DropdownMenuPrimitive.Separator,
|
|
350
350
|
{
|
|
351
351
|
ref,
|
|
352
|
-
className: cn("-mx-1 my-1 h-px bg-border-
|
|
352
|
+
className: cn("-mx-1 my-1 h-px bg-border-subtle", className),
|
|
353
353
|
...props
|
|
354
354
|
}
|
|
355
355
|
));
|
|
@@ -479,7 +479,7 @@ import { cva as cva2 } from "class-variance-authority";
|
|
|
479
479
|
import { Check as Check2 } from "lucide-react";
|
|
480
480
|
import { jsx as jsx8, jsxs as jsxs5 } from "react/jsx-runtime";
|
|
481
481
|
var optionCardVariants = cva2(
|
|
482
|
-
"flex w-full items-center gap-3 rounded-lg border border-border-default p-3 text-left transition-colors hover:bg-bg-elevated focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-border-focus",
|
|
482
|
+
"flex w-full items-center gap-3 rounded-lg border border-border-default p-3 text-left transition-colors duration-fast hover:bg-bg-elevated focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-border-focus",
|
|
483
483
|
{
|
|
484
484
|
variants: {
|
|
485
485
|
selected: {
|
|
@@ -724,18 +724,18 @@ function Switch({
|
|
|
724
724
|
"data-testid": testId,
|
|
725
725
|
disabled,
|
|
726
726
|
onClick: () => onCheckedChange(!checked),
|
|
727
|
-
className: `relative inline-flex h-6 w-10 shrink-0 cursor-pointer rounded-full transition-colors outline-none focus-visible:ring-2 focus-visible:ring-border-focus focus-visible:ring-offset-2 focus-visible:ring-offset-bg-surface ${checked ? "bg-text-brand" : "bg-bg-surface"} ${disabled ? "cursor-not-allowed opacity-50" : ""} ${className}`,
|
|
727
|
+
className: `relative inline-flex h-6 w-10 shrink-0 cursor-pointer rounded-full transition-colors duration-fast outline-none focus-visible:ring-2 focus-visible:ring-border-focus focus-visible:ring-offset-2 focus-visible:ring-offset-bg-surface ${checked ? "bg-text-brand" : "bg-bg-surface"} ${disabled ? "cursor-not-allowed opacity-50" : ""} ${className}`,
|
|
728
728
|
children: [
|
|
729
729
|
/* @__PURE__ */ jsx14(
|
|
730
730
|
"span",
|
|
731
731
|
{
|
|
732
|
-
className: `pointer-events-none absolute inset-0 rounded-full border border-border-strong transition-opacity ${checked ? "opacity-0" : "opacity-100"}`
|
|
732
|
+
className: `pointer-events-none absolute inset-0 rounded-full border border-border-strong transition-opacity duration-fast ${checked ? "opacity-0" : "opacity-100"}`
|
|
733
733
|
}
|
|
734
734
|
),
|
|
735
735
|
/* @__PURE__ */ jsx14(
|
|
736
736
|
"span",
|
|
737
737
|
{
|
|
738
|
-
className: `pointer-events-none absolute inset-y-0 left-0 flex w-6 items-center justify-center transition-opacity ${checked ? "opacity-100" : "opacity-0"}`,
|
|
738
|
+
className: `pointer-events-none absolute inset-y-0 left-0 flex w-6 items-center justify-center transition-opacity duration-fast ${checked ? "opacity-100" : "opacity-0"}`,
|
|
739
739
|
children: /* @__PURE__ */ jsx14(Check3, { className: "size-3 text-white" })
|
|
740
740
|
}
|
|
741
741
|
),
|
|
@@ -743,7 +743,7 @@ function Switch({
|
|
|
743
743
|
"span",
|
|
744
744
|
{
|
|
745
745
|
"aria-hidden": "true",
|
|
746
|
-
className: `pointer-events-none absolute top-1/2 left-0 h-4 w-4 -translate-y-1/2 rounded-full transition-transform ${checked ? "translate-x-5 bg-white" : "translate-x-1 bg-border-strong"}`
|
|
746
|
+
className: `pointer-events-none absolute top-1/2 left-0 h-4 w-4 -translate-y-1/2 rounded-full transition-transform duration-fast ${checked ? "translate-x-5 bg-white" : "translate-x-1 bg-border-strong"}`
|
|
747
747
|
}
|
|
748
748
|
)
|
|
749
749
|
]
|
|
@@ -832,7 +832,7 @@ var Slider = React14.forwardRef(({ className, ...props }, ref) => {
|
|
|
832
832
|
Array.from({ length: thumbCount }).map((_, i) => /* @__PURE__ */ jsx18(
|
|
833
833
|
SliderPrimitive.Thumb,
|
|
834
834
|
{
|
|
835
|
-
className: "block size-5 rounded-full border border-border-brand bg-bg-elevated shadow-sm transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-border-focus data-[disabled]:pointer-events-none data-[disabled]:opacity-50"
|
|
835
|
+
className: "block size-5 rounded-full border border-border-brand bg-bg-elevated shadow-sm transition-colors duration-fast focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-border-focus data-[disabled]:pointer-events-none data-[disabled]:opacity-50"
|
|
836
836
|
},
|
|
837
837
|
i
|
|
838
838
|
))
|
|
@@ -848,7 +848,7 @@ import * as TogglePrimitive from "@radix-ui/react-toggle";
|
|
|
848
848
|
import { cva as cva3 } from "class-variance-authority";
|
|
849
849
|
import { jsx as jsx19 } from "react/jsx-runtime";
|
|
850
850
|
var toggleVariants = cva3(
|
|
851
|
-
"inline-flex items-center justify-center gap-2 rounded-md text-sm font-medium text-text-secondary transition-colors focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-border-focus disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0",
|
|
851
|
+
"inline-flex items-center justify-center gap-2 rounded-md text-sm font-medium data-[state=on]:font-semibold text-text-secondary transition-colors duration-fast focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-border-focus disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0",
|
|
852
852
|
{
|
|
853
853
|
variants: {
|
|
854
854
|
/**
|
|
@@ -857,7 +857,7 @@ var toggleVariants = cva3(
|
|
|
857
857
|
*/
|
|
858
858
|
treatment: {
|
|
859
859
|
frame: "ring-1 ring-inset ring-border-subtle hover:bg-bg-secondary hover:text-text-primary data-[state=on]:text-text-primary data-[state=on]:ring-border-strong",
|
|
860
|
-
track: "data-[state=off]:hover:text-text-primary data-[state=on]:bg-bg-
|
|
860
|
+
track: "data-[state=off]:hover:text-text-primary data-[state=on]:bg-bg-sunken data-[state=on]:text-text-primary"
|
|
861
861
|
},
|
|
862
862
|
variant: {
|
|
863
863
|
default: "bg-transparent",
|
|
@@ -909,17 +909,18 @@ var SlidingThumb = ({ index, count }) => /* @__PURE__ */ jsx20(
|
|
|
909
909
|
"span",
|
|
910
910
|
{
|
|
911
911
|
"aria-hidden": "true",
|
|
912
|
-
className: "motion-segment-thumb pointer-events-none absolute inset-y-0 left-0 rounded-md bg-bg-
|
|
912
|
+
className: "motion-segment-thumb pointer-events-none absolute inset-y-0 left-0 rounded-md bg-bg-sunken",
|
|
913
913
|
style: { width: `calc(100% / ${count})`, transform: `translateX(${index * 100}%)` }
|
|
914
914
|
}
|
|
915
915
|
);
|
|
916
916
|
var ToggleGroup = React16.forwardRef(({ className, variant, size, treatment, sliding, children, ...props }, ref) => {
|
|
917
|
-
const
|
|
917
|
+
const slots = React16.Children.toArray(children).filter(React16.isValidElement);
|
|
918
|
+
const wordless = slots.length > 0 && slots.every((slot) => isIconOnly(slot.props.children));
|
|
919
|
+
const resolved = treatment ?? (props.type === "single" && !wordless ? "track" : "frame");
|
|
918
920
|
const [mirror, setMirror] = React16.useState(
|
|
919
921
|
() => typeof props.defaultValue === "string" ? props.defaultValue : void 0
|
|
920
922
|
);
|
|
921
923
|
const selected = typeof props.value === "string" ? props.value : mirror;
|
|
922
|
-
const slots = React16.Children.toArray(children).filter(React16.isValidElement);
|
|
923
924
|
const index = slots.findIndex((slot) => slot.props.value === selected);
|
|
924
925
|
const rootProps = sliding && typeof props.value !== "string" ? {
|
|
925
926
|
...props,
|
|
@@ -940,10 +941,13 @@ var ToggleGroup = React16.forwardRef(({ className, variant, size, treatment, sli
|
|
|
940
941
|
// what lets the thumb be exactly `100% / count` wide and travel in multiples of itself.
|
|
941
942
|
"inline-flex w-fit items-center gap-0.5"
|
|
942
943
|
) : "flex items-center justify-center gap-1",
|
|
943
|
-
// A sliding track
|
|
944
|
-
//
|
|
945
|
-
//
|
|
946
|
-
|
|
944
|
+
// A sliding track's slots share its width equally, because the thumb is one slot wide and
|
|
945
|
+
// travels in multiples of itself. The gap goes for the same reason: a gap between slots is
|
|
946
|
+
// width the thumb's own step does not account for. The track sizes to those slots rather
|
|
947
|
+
// than to whatever holds it — given a parent and no width of its own it used to span the
|
|
948
|
+
// whole of it, and with no frame drawn the slots then read as loose words with a step
|
|
949
|
+
// somewhere in them (#754). A caller wanting full width writes one, as every call site did.
|
|
950
|
+
sliding && "relative flex w-fit gap-0",
|
|
947
951
|
className
|
|
948
952
|
),
|
|
949
953
|
...rootProps,
|
|
@@ -968,11 +972,11 @@ var ToggleGroupItem = React16.forwardRef(({ className, children, variant, size,
|
|
|
968
972
|
// the height its size declares. A slot is the one place this matters most — the items of a
|
|
969
973
|
// group sit side by side, so one that is 8px wider than its neighbours is visible.
|
|
970
974
|
isIconOnly(children) && ICON_ONLY_BOX,
|
|
971
|
-
// Inside a track, the selected slot is also the heavier word:
|
|
972
|
-
//
|
|
975
|
+
// Inside a track, the selected slot is also the heavier word: the surface step under it is
|
|
976
|
+
// 1.208:1 light / 1.109:1 dark on its own, which is a mark but not one on its own.
|
|
973
977
|
context.treatment === "track" && "data-[state=on]:font-semibold",
|
|
974
|
-
// Under a sliding thumb the
|
|
975
|
-
// copy on the slot would sit still while the first one moved. The word stays the slot's own.
|
|
978
|
+
// Under a sliding thumb the surface step belongs to the thumb, which is the one that travels; a
|
|
979
|
+
// second copy on the slot would sit still while the first one moved. The word stays the slot's own.
|
|
976
980
|
context.sliding && "relative z-10 flex-1 data-[state=on]:bg-transparent"
|
|
977
981
|
);
|
|
978
982
|
if (inert) {
|
|
@@ -1012,7 +1016,7 @@ var InputOTPSlot = React17.forwardRef(({ index, className, ...props }, ref) => {
|
|
|
1012
1016
|
{
|
|
1013
1017
|
ref,
|
|
1014
1018
|
className: cn(
|
|
1015
|
-
"relative flex size-10 items-center justify-center border-y border-r text-sm text-text-primary transition-all first:rounded-l-md first:border-l last:rounded-r-md",
|
|
1019
|
+
"relative flex size-10 items-center justify-center border-y border-r text-sm text-text-primary transition-all duration-fast first:rounded-l-md first:border-l last:rounded-r-md",
|
|
1016
1020
|
// A field takes the field border (`Guidelines/Look/Borders`, #417), and a slot is the other
|
|
1017
1021
|
// control that can honestly paint the filled step — it holds its own character, so the step
|
|
1018
1022
|
// is a literal class picked by a boolean and the code walks the ladder as you type.
|
|
@@ -1290,7 +1294,7 @@ var ContextMenuItem = React22.forwardRef(({ className, inset, ...props }, ref) =
|
|
|
1290
1294
|
{
|
|
1291
1295
|
ref,
|
|
1292
1296
|
className: cn(
|
|
1293
|
-
"relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none transition-colors focus:bg-bg-secondary focus:text-text-primary data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
|
|
1297
|
+
"relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none transition-colors duration-fast focus:bg-bg-secondary focus:text-text-primary data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
|
|
1294
1298
|
inset && "pl-8",
|
|
1295
1299
|
className
|
|
1296
1300
|
),
|
|
@@ -1303,7 +1307,7 @@ var ContextMenuCheckboxItem = React22.forwardRef(({ className, children, checked
|
|
|
1303
1307
|
{
|
|
1304
1308
|
ref,
|
|
1305
1309
|
className: cn(
|
|
1306
|
-
"relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-bg-secondary focus:text-text-primary data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
|
|
1310
|
+
"relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors duration-fast focus:bg-bg-secondary focus:text-text-primary data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
|
|
1307
1311
|
className
|
|
1308
1312
|
),
|
|
1309
1313
|
checked,
|
|
@@ -1320,7 +1324,7 @@ var ContextMenuRadioItem = React22.forwardRef(({ className, children, ...props }
|
|
|
1320
1324
|
{
|
|
1321
1325
|
ref,
|
|
1322
1326
|
className: cn(
|
|
1323
|
-
"relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-bg-secondary focus:text-text-primary data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
|
|
1327
|
+
"relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors duration-fast focus:bg-bg-secondary focus:text-text-primary data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
|
|
1324
1328
|
className
|
|
1325
1329
|
),
|
|
1326
1330
|
...props,
|
|
@@ -1438,7 +1442,7 @@ var MenubarItem = React23.forwardRef(({ className, inset, ...props }, ref) => /*
|
|
|
1438
1442
|
{
|
|
1439
1443
|
ref,
|
|
1440
1444
|
className: cn(
|
|
1441
|
-
"relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none transition-colors focus:bg-bg-secondary focus:text-text-primary data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
|
|
1445
|
+
"relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none transition-colors duration-fast focus:bg-bg-secondary focus:text-text-primary data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
|
|
1442
1446
|
inset && "pl-8",
|
|
1443
1447
|
className
|
|
1444
1448
|
),
|
|
@@ -1451,7 +1455,7 @@ var MenubarCheckboxItem = React23.forwardRef(({ className, children, checked, ..
|
|
|
1451
1455
|
{
|
|
1452
1456
|
ref,
|
|
1453
1457
|
className: cn(
|
|
1454
|
-
"relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-bg-secondary focus:text-text-primary data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
|
|
1458
|
+
"relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors duration-fast focus:bg-bg-secondary focus:text-text-primary data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
|
|
1455
1459
|
className
|
|
1456
1460
|
),
|
|
1457
1461
|
checked,
|
|
@@ -1468,7 +1472,7 @@ var MenubarRadioItem = React23.forwardRef(({ className, children, ...props }, re
|
|
|
1468
1472
|
{
|
|
1469
1473
|
ref,
|
|
1470
1474
|
className: cn(
|
|
1471
|
-
"relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-bg-secondary focus:text-text-primary data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
|
|
1475
|
+
"relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors duration-fast focus:bg-bg-secondary focus:text-text-primary data-[disabled]:pointer-events-none data-[disabled]:opacity-50",
|
|
1472
1476
|
className
|
|
1473
1477
|
),
|
|
1474
1478
|
...props,
|
|
@@ -1507,7 +1511,7 @@ import * as React24 from "react";
|
|
|
1507
1511
|
import { cva as cva4 } from "class-variance-authority";
|
|
1508
1512
|
import { jsx as jsx28 } from "react/jsx-runtime";
|
|
1509
1513
|
var badgeVariants = cva4(
|
|
1510
|
-
"inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-border-focus",
|
|
1514
|
+
"inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors duration-fast focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-border-focus",
|
|
1511
1515
|
{
|
|
1512
1516
|
variants: {
|
|
1513
1517
|
variant: {
|
|
@@ -1567,7 +1571,7 @@ var TableRow = React25.forwardRef(
|
|
|
1567
1571
|
{
|
|
1568
1572
|
ref,
|
|
1569
1573
|
className: cn(
|
|
1570
|
-
"border-b border-border-subtle transition-colors hover:bg-bg-secondary-a50 data-[state=selected]:bg-bg-secondary",
|
|
1574
|
+
"border-b border-border-subtle transition-colors duration-fast hover:bg-bg-secondary-a50 data-[state=selected]:bg-bg-secondary",
|
|
1571
1575
|
className
|
|
1572
1576
|
),
|
|
1573
1577
|
...props
|
|
@@ -1659,12 +1663,11 @@ var GLYPH_SIZE = {
|
|
|
1659
1663
|
};
|
|
1660
1664
|
var TONE = {
|
|
1661
1665
|
neutral: "bg-bg-secondary text-text-secondary",
|
|
1662
|
-
brand: "bg-bg-brand-subtle text-text-brand",
|
|
1663
1666
|
teal: "bg-bg-teal-subtle text-text-teal",
|
|
1664
1667
|
violet: "bg-bg-violet-subtle text-text-violet",
|
|
1665
1668
|
rose: "bg-bg-rose-subtle text-text-rose"
|
|
1666
1669
|
};
|
|
1667
|
-
var TINT_FAMILIES = ["
|
|
1670
|
+
var TINT_FAMILIES = ["teal", "violet", "rose"];
|
|
1668
1671
|
function initialsOf(name) {
|
|
1669
1672
|
const parts = name.trim().split(/\s+/).filter(Boolean);
|
|
1670
1673
|
if (parts.length === 0) return "?";
|
|
@@ -1676,9 +1679,17 @@ function initialOf(name) {
|
|
|
1676
1679
|
return c ? c.toUpperCase() : "?";
|
|
1677
1680
|
}
|
|
1678
1681
|
function tintFor(seed) {
|
|
1679
|
-
|
|
1680
|
-
|
|
1681
|
-
|
|
1682
|
+
return TINT_FAMILIES[hashSeed(seed) % TINT_FAMILIES.length];
|
|
1683
|
+
}
|
|
1684
|
+
function hashSeed(seed) {
|
|
1685
|
+
let h = 2166136261;
|
|
1686
|
+
for (let i = 0; i < seed.length; i++) h = Math.imul(h ^ seed.charCodeAt(i), 16777619);
|
|
1687
|
+
h ^= h >>> 16;
|
|
1688
|
+
h = Math.imul(h, 2246822507);
|
|
1689
|
+
h ^= h >>> 13;
|
|
1690
|
+
h = Math.imul(h, 3266489909);
|
|
1691
|
+
h ^= h >>> 16;
|
|
1692
|
+
return h >>> 0;
|
|
1682
1693
|
}
|
|
1683
1694
|
function Mark({ shape, size, tone, src, label, children }) {
|
|
1684
1695
|
return /* @__PURE__ */ jsxs18(
|
|
@@ -1759,7 +1770,7 @@ var Progress = React30.forwardRef(({ className, value, ...props }, ref) => /* @_
|
|
|
1759
1770
|
children: /* @__PURE__ */ jsx37(
|
|
1760
1771
|
ProgressPrimitive.Indicator,
|
|
1761
1772
|
{
|
|
1762
|
-
className: "h-full w-full flex-1 bg-text-tertiary transition-all",
|
|
1773
|
+
className: "h-full w-full flex-1 bg-text-tertiary transition-all duration-slide",
|
|
1763
1774
|
style: { transform: `translateX(-${100 - (value || 0)}%)` }
|
|
1764
1775
|
}
|
|
1765
1776
|
)
|
|
@@ -1781,7 +1792,7 @@ var TabsList = React31.forwardRef(({ className, ...props }, ref) => /* @__PURE__
|
|
|
1781
1792
|
{
|
|
1782
1793
|
ref,
|
|
1783
1794
|
className: cn(
|
|
1784
|
-
"inline-flex h-10 items-center justify-center rounded-md bg-bg-
|
|
1795
|
+
"inline-flex h-10 items-center justify-center rounded-md bg-bg-surface p-1 text-text-secondary",
|
|
1785
1796
|
className
|
|
1786
1797
|
),
|
|
1787
1798
|
...props
|
|
@@ -1793,7 +1804,7 @@ var TabsTrigger = React31.forwardRef(({ className, ...props }, ref) => /* @__PUR
|
|
|
1793
1804
|
{
|
|
1794
1805
|
ref,
|
|
1795
1806
|
className: cn(
|
|
1796
|
-
"inline-flex items-center justify-center whitespace-nowrap rounded-sm px-3 py-1.5 text-sm font-medium transition-all focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-border-focus disabled:pointer-events-none disabled:opacity-50 data-[state=active]:bg-bg-
|
|
1807
|
+
"inline-flex items-center justify-center whitespace-nowrap rounded-sm px-3 py-1.5 text-sm font-medium transition-all duration-fast focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-border-focus disabled:pointer-events-none disabled:opacity-50 data-[state=active]:bg-bg-sunken data-[state=active]:font-semibold data-[state=active]:text-text-primary",
|
|
1797
1808
|
className
|
|
1798
1809
|
),
|
|
1799
1810
|
...props
|
|
@@ -1833,7 +1844,7 @@ var AccordionTrigger = React32.forwardRef(({ className, children, ...props }, re
|
|
|
1833
1844
|
{
|
|
1834
1845
|
ref,
|
|
1835
1846
|
className: cn(
|
|
1836
|
-
"flex flex-1 items-center justify-between py-4 text-sm font-medium transition-all hover:underline [&[data-state=open]>svg]:rotate-180",
|
|
1847
|
+
"flex flex-1 items-center justify-between py-4 text-sm font-medium transition-all duration-fast hover:underline [&[data-state=open]>svg]:rotate-180",
|
|
1837
1848
|
className
|
|
1838
1849
|
),
|
|
1839
1850
|
...props,
|
|
@@ -1900,7 +1911,7 @@ var ScrollBar = React34.forwardRef(({ className, orientation = "vertical", ...pr
|
|
|
1900
1911
|
ref,
|
|
1901
1912
|
orientation,
|
|
1902
1913
|
className: cn(
|
|
1903
|
-
"flex touch-none select-none transition-colors",
|
|
1914
|
+
"flex touch-none select-none transition-colors duration-fast",
|
|
1904
1915
|
orientation === "vertical" && "h-full w-2.5 border-l border-l-transparent p-[1px]",
|
|
1905
1916
|
orientation === "horizontal" && "h-2.5 flex-col border-t border-t-transparent p-[1px]",
|
|
1906
1917
|
className
|
|
@@ -1998,7 +2009,7 @@ var BreadcrumbLink = React36.forwardRef(({ asChild, className, ...props }, ref)
|
|
|
1998
2009
|
Comp,
|
|
1999
2010
|
{
|
|
2000
2011
|
ref,
|
|
2001
|
-
className: cn("transition-colors hover:text-text-primary", className),
|
|
2012
|
+
className: cn("transition-colors duration-fast hover:text-text-primary", className),
|
|
2002
2013
|
...props
|
|
2003
2014
|
}
|
|
2004
2015
|
);
|
|
@@ -2257,7 +2268,7 @@ var NavigationMenuList = React39.forwardRef(({ className, ...props }, ref) => /*
|
|
|
2257
2268
|
NavigationMenuList.displayName = NavigationMenuPrimitive.List.displayName;
|
|
2258
2269
|
var NavigationMenuItem = NavigationMenuPrimitive.Item;
|
|
2259
2270
|
var navigationMenuTriggerStyle = cva6(
|
|
2260
|
-
"group inline-flex h-10 w-max items-center justify-center rounded-md bg-bg-elevated px-4 py-2 text-sm font-medium transition-colors hover:bg-bg-secondary hover:text-text-primary focus:bg-bg-secondary focus:outline-none disabled:pointer-events-none disabled:opacity-50 data-[state=open]:bg-bg-secondary"
|
|
2271
|
+
"group inline-flex h-10 w-max items-center justify-center rounded-md bg-bg-elevated px-4 py-2 text-sm font-medium transition-colors duration-fast hover:bg-bg-secondary hover:text-text-primary focus:bg-bg-secondary focus:outline-none disabled:pointer-events-none disabled:opacity-50 data-[state=open]:bg-bg-secondary"
|
|
2261
2272
|
);
|
|
2262
2273
|
var NavigationMenuTrigger = React39.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ jsxs25(
|
|
2263
2274
|
NavigationMenuPrimitive.Trigger,
|
|
@@ -2413,7 +2424,7 @@ function ThemeToggle() {
|
|
|
2413
2424
|
"button",
|
|
2414
2425
|
{
|
|
2415
2426
|
onClick: () => setTheme(next),
|
|
2416
|
-
className: "p-2 rounded-lg text-text-secondary hover:bg-bg-secondary transition-colors",
|
|
2427
|
+
className: "p-2 rounded-lg text-text-secondary hover:bg-bg-secondary transition-colors duration-fast",
|
|
2417
2428
|
"aria-label": label,
|
|
2418
2429
|
title: label,
|
|
2419
2430
|
children: /* @__PURE__ */ jsx48(Icon, { className: "w-4 h-4" })
|
|
@@ -2451,20 +2462,35 @@ function Calendar({ className, classNames, showOutsideDays = true, ...props }) {
|
|
|
2451
2462
|
week: "flex w-full mt-2",
|
|
2452
2463
|
day: "relative p-0 text-center text-sm focus-within:relative focus-within:z-20",
|
|
2453
2464
|
day_button: cn(
|
|
2454
|
-
"inline-flex size-9 items-center justify-center rounded-md p-0 font-regular text-text-primary transition-colors",
|
|
2465
|
+
"inline-flex size-9 items-center justify-center rounded-md p-0 font-regular text-text-primary transition-colors duration-fast",
|
|
2455
2466
|
"hover:bg-bg-secondary focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-border-focus",
|
|
2456
2467
|
"aria-selected:opacity-100"
|
|
2457
2468
|
),
|
|
2458
|
-
|
|
2459
|
-
//
|
|
2460
|
-
//
|
|
2461
|
-
|
|
2462
|
-
|
|
2469
|
+
// The console's selection mark, unchanged for a day: the surface step, the weight step, the
|
|
2470
|
+
// primary tone (Guidelines/Look/Selection weight). Hovering a chosen day holds the step —
|
|
2471
|
+
// `day_button`'s wash is the pointer's channel and would lighten the mark out from under it.
|
|
2472
|
+
selected: "[&>button]:bg-bg-sunken [&>button]:font-semibold [&>button]:text-text-primary [&>button]:hover:bg-bg-sunken",
|
|
2473
|
+
// Today moved off `bg-secondary` because the selection mark landed on `bg-sunken`, and in
|
|
2474
|
+
// dark those two measure 1.034:1 — today would have worn the chosen day's fill. A hairline
|
|
2475
|
+
// is the free channel: it rests at `border-default`, the kit's resting edge, where a
|
|
2476
|
+
// selection with no word to thicken steps to `border-strong`, so neither reads as the
|
|
2477
|
+
// other, and a day that is both wears the plate and the hairline at once. `border` rather
|
|
2478
|
+
// than a ring because the box is a fixed `size-9`, so the edge costs no layout here and
|
|
2479
|
+
// leaves the focus ring the one thing drawing a ring.
|
|
2480
|
+
today: "[&>button]:border [&>button]:border-border-default",
|
|
2463
2481
|
outside: "[&>button]:text-text-tertiary [&>button]:opacity-50",
|
|
2464
2482
|
disabled: "[&>button]:text-text-disabled [&>button]:opacity-50",
|
|
2465
|
-
|
|
2466
|
-
|
|
2467
|
-
|
|
2483
|
+
// A range is one band, so the fill goes on the cell, which has no radius of its own to notch
|
|
2484
|
+
// the join with; the ends round their outer side and a one-day range rounds both. Every day
|
|
2485
|
+
// in a range also carries `selected`, so the band and each button's own plate are the same
|
|
2486
|
+
// step and meet without a seam.
|
|
2487
|
+
range_start: "bg-bg-sunken rounded-l-md",
|
|
2488
|
+
range_end: "bg-bg-sunken rounded-r-md",
|
|
2489
|
+
// Spanned, not chosen: the middle keeps the surface step and gives back the weight step and
|
|
2490
|
+
// the primary tone. `[&[data-selected]>button]` is the specificity that takes them back —
|
|
2491
|
+
// rdp writes `data-selected` on every cell of a range, so this beats `selected` by an
|
|
2492
|
+
// attribute rather than by whatever order Tailwind happens to emit two equal selectors in.
|
|
2493
|
+
range_middle: "bg-bg-sunken [&[data-selected]>button]:font-regular [&[data-selected]>button]:text-text-secondary",
|
|
2468
2494
|
hidden: "invisible",
|
|
2469
2495
|
...classNames
|
|
2470
2496
|
},
|
|
@@ -2892,7 +2918,7 @@ var DocsLink = React45.forwardRef(
|
|
|
2892
2918
|
target: "_blank",
|
|
2893
2919
|
rel: "noreferrer noopener",
|
|
2894
2920
|
className: cn(
|
|
2895
|
-
"inline-flex items-center gap-1.5 rounded-md px-2.5 py-1 text-sm text-text-secondary transition-colors hover:bg-bg-secondary hover:text-text-primary focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-border-focus",
|
|
2921
|
+
"inline-flex items-center gap-1.5 rounded-md px-2.5 py-1 text-sm text-text-secondary transition-colors duration-fast hover:bg-bg-secondary hover:text-text-primary focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-border-focus",
|
|
2896
2922
|
className
|
|
2897
2923
|
),
|
|
2898
2924
|
...props,
|
|
@@ -3350,7 +3376,7 @@ function UserMenu({ user, items, collapsed = false, align = "start" }) {
|
|
|
3350
3376
|
"button",
|
|
3351
3377
|
{
|
|
3352
3378
|
type: "button",
|
|
3353
|
-
className: "flex w-full items-center gap-2.5 rounded-xl px-1.5 py-[5px] text-left transition-colors hover:bg-[var(--hov-bg)] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-border-focus",
|
|
3379
|
+
className: "flex w-full items-center gap-2.5 rounded-xl px-1.5 py-[5px] text-left transition-colors duration-fast hover:bg-[var(--hov-bg)] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-border-focus",
|
|
3354
3380
|
children: [
|
|
3355
3381
|
avatar,
|
|
3356
3382
|
/* @__PURE__ */ jsxs36("span", { className: "flex min-w-0 flex-1 flex-col gap-0.5", children: [
|
|
@@ -3378,7 +3404,7 @@ function UserMenu({ user, items, collapsed = false, align = "start" }) {
|
|
|
3378
3404
|
/* @__PURE__ */ jsx61("span", { className: "block truncate text-sm font-medium text-text-primary", children: user.name }),
|
|
3379
3405
|
collapsed && secondLine && /* @__PURE__ */ jsx61("span", { className: "block truncate text-xs font-regular text-text-tertiary", children: secondLine })
|
|
3380
3406
|
] }),
|
|
3381
|
-
/* @__PURE__ */ jsx61(DropdownMenuSeparator, { className: "mx-0 shrink-0
|
|
3407
|
+
/* @__PURE__ */ jsx61(DropdownMenuSeparator, { className: "mx-0 shrink-0" }),
|
|
3382
3408
|
items.map((item, i) => {
|
|
3383
3409
|
const Icon = item.icon;
|
|
3384
3410
|
const content = /* @__PURE__ */ jsxs36(Fragment2, { children: [
|
|
@@ -4459,10 +4485,43 @@ var RemovableChip = React62.forwardRef(
|
|
|
4459
4485
|
);
|
|
4460
4486
|
RemovableChip.displayName = "RemovableChip";
|
|
4461
4487
|
|
|
4462
|
-
// src/
|
|
4488
|
+
// src/hooks/use-fresh-highlight.ts
|
|
4463
4489
|
import * as React63 from "react";
|
|
4490
|
+
var HOLD_MS = 3200;
|
|
4491
|
+
var CLEAR_MS = HOLD_MS + 900;
|
|
4492
|
+
function useFreshHighlight() {
|
|
4493
|
+
const [freshId, setFreshId] = React63.useState(null);
|
|
4494
|
+
const [message, setMessage] = React63.useState("");
|
|
4495
|
+
const timer = React63.useRef(void 0);
|
|
4496
|
+
React63.useEffect(() => () => clearTimeout(timer.current), []);
|
|
4497
|
+
const markFresh = React63.useCallback((id, announce) => {
|
|
4498
|
+
clearTimeout(timer.current);
|
|
4499
|
+
setFreshId(id);
|
|
4500
|
+
if (announce) setMessage(announce);
|
|
4501
|
+
timer.current = setTimeout(() => setFreshId(null), CLEAR_MS);
|
|
4502
|
+
}, []);
|
|
4503
|
+
const isFresh = React63.useCallback((id) => id === freshId, [freshId]);
|
|
4504
|
+
const freshRef = React63.useCallback((el) => {
|
|
4505
|
+
if (!el) return;
|
|
4506
|
+
const rect = el.getBoundingClientRect();
|
|
4507
|
+
const viewportH = window.innerHeight || document.documentElement.clientHeight;
|
|
4508
|
+
const offscreen = rect.top < 0 || rect.bottom > viewportH;
|
|
4509
|
+
if (!offscreen) return;
|
|
4510
|
+
const reduce = window.matchMedia?.("(prefers-reduced-motion: reduce)").matches;
|
|
4511
|
+
el.scrollIntoView({ block: "nearest", behavior: reduce ? "auto" : "smooth" });
|
|
4512
|
+
}, []);
|
|
4513
|
+
const announcer = React63.createElement(
|
|
4514
|
+
"span",
|
|
4515
|
+
{ role: "status", "aria-live": "polite", className: "sr-only" },
|
|
4516
|
+
message
|
|
4517
|
+
);
|
|
4518
|
+
return { isFresh, markFresh, freshRef, announcer };
|
|
4519
|
+
}
|
|
4520
|
+
|
|
4521
|
+
// src/components/nav-section-label.tsx
|
|
4522
|
+
import * as React64 from "react";
|
|
4464
4523
|
import { jsx as jsx75 } from "react/jsx-runtime";
|
|
4465
|
-
var NavSectionLabel =
|
|
4524
|
+
var NavSectionLabel = React64.forwardRef(
|
|
4466
4525
|
function NavSectionLabel2({ className, ...props }, ref) {
|
|
4467
4526
|
return /* @__PURE__ */ jsx75(
|
|
4468
4527
|
"div",
|
|
@@ -4477,7 +4536,7 @@ var NavSectionLabel = React63.forwardRef(
|
|
|
4477
4536
|
NavSectionLabel.displayName = "NavSectionLabel";
|
|
4478
4537
|
|
|
4479
4538
|
// src/components/menu-popup.tsx
|
|
4480
|
-
import * as
|
|
4539
|
+
import * as React65 from "react";
|
|
4481
4540
|
import { jsx as jsx76, jsxs as jsxs49 } from "react/jsx-runtime";
|
|
4482
4541
|
function MenuPopup({
|
|
4483
4542
|
trigger,
|
|
@@ -4507,7 +4566,7 @@ function MenuPopup({
|
|
|
4507
4566
|
)
|
|
4508
4567
|
] });
|
|
4509
4568
|
}
|
|
4510
|
-
var MenuDivider =
|
|
4569
|
+
var MenuDivider = React65.forwardRef(
|
|
4511
4570
|
function MenuDivider2({ className, ...props }, ref) {
|
|
4512
4571
|
return /* @__PURE__ */ jsx76(
|
|
4513
4572
|
"div",
|
|
@@ -4523,11 +4582,11 @@ var MenuDivider = React64.forwardRef(
|
|
|
4523
4582
|
MenuDivider.displayName = "MenuDivider";
|
|
4524
4583
|
|
|
4525
4584
|
// src/components/sidebar-product-header.tsx
|
|
4526
|
-
import * as
|
|
4585
|
+
import * as React66 from "react";
|
|
4527
4586
|
import { Slot as Slot4 } from "@radix-ui/react-slot";
|
|
4528
4587
|
import { ChevronsUpDown as ChevronsUpDown2 } from "lucide-react";
|
|
4529
4588
|
import { Fragment as Fragment7, jsx as jsx77, jsxs as jsxs50 } from "react/jsx-runtime";
|
|
4530
|
-
var SidebarProductHeader =
|
|
4589
|
+
var SidebarProductHeader = React66.forwardRef(
|
|
4531
4590
|
function SidebarProductHeader2({ name, icon, trailing, asChild = false, className, children, ...props }, ref) {
|
|
4532
4591
|
const adornment = trailing === void 0 ? /* @__PURE__ */ jsx77(ChevronsUpDown2, { size: 14, "aria-hidden": "true", className: "shrink-0 text-text-tertiary" }) : trailing;
|
|
4533
4592
|
const content = /* @__PURE__ */ jsxs50(Fragment7, { children: [
|
|
@@ -4537,8 +4596,8 @@ var SidebarProductHeader = React65.forwardRef(
|
|
|
4537
4596
|
] });
|
|
4538
4597
|
const classes = cn("flex w-full items-center gap-2.5 rounded-xl px-1.5 py-0 text-left", className);
|
|
4539
4598
|
if (asChild) {
|
|
4540
|
-
const child =
|
|
4541
|
-
return /* @__PURE__ */ jsx77(Slot4, { ref, className: classes, ...props, children:
|
|
4599
|
+
const child = React66.Children.only(children);
|
|
4600
|
+
return /* @__PURE__ */ jsx77(Slot4, { ref, className: classes, ...props, children: React66.cloneElement(child, void 0, content) });
|
|
4542
4601
|
}
|
|
4543
4602
|
return /* @__PURE__ */ jsx77("button", { ref, type: "button", className: classes, ...props, children: content });
|
|
4544
4603
|
}
|
|
@@ -4548,7 +4607,7 @@ SidebarProductHeader.displayName = "SidebarProductHeader";
|
|
|
4548
4607
|
// src/components/org-product-switcher.tsx
|
|
4549
4608
|
import { ChevronsUpDown as ChevronsUpDown3, Check as Check9 } from "lucide-react";
|
|
4550
4609
|
import { Fragment as Fragment8, jsx as jsx78, jsxs as jsxs51 } from "react/jsx-runtime";
|
|
4551
|
-
var triggerBox = "flex w-full items-center gap-2.5 rounded-xl px-1.5 py-1 text-left transition-colors hover:bg-[var(--hov-bg)] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-border-focus";
|
|
4610
|
+
var triggerBox = "flex w-full items-center gap-2.5 rounded-xl px-1.5 py-1 text-left transition-colors duration-fast hover:bg-[var(--hov-bg)] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-border-focus";
|
|
4552
4611
|
var menuItem = "gap-2 rounded-md px-2 py-1.5 text-sm font-medium text-text-secondary focus:bg-[var(--menu-hov)] focus:text-text-primary";
|
|
4553
4612
|
var sectionLabel = "px-2 pt-1.5 pb-1 text-xs font-medium text-text-tertiary";
|
|
4554
4613
|
var NO_ORG_LABEL = "Select an organization\u2026";
|
|
@@ -4639,7 +4698,7 @@ function OrgProductSwitcher({
|
|
|
4639
4698
|
o.id === activeOrgId && /* @__PURE__ */ jsx78(Check9, { className: "size-4 shrink-0 text-text-secondary", "aria-hidden": "true" })
|
|
4640
4699
|
] }, o.id)),
|
|
4641
4700
|
products.length > 0 && /* @__PURE__ */ jsxs51(Fragment8, { children: [
|
|
4642
|
-
/* @__PURE__ */ jsx78(DropdownMenuSeparator, { className: "mx-0 shrink-0
|
|
4701
|
+
/* @__PURE__ */ jsx78(DropdownMenuSeparator, { className: "mx-0 shrink-0" }),
|
|
4643
4702
|
/* @__PURE__ */ jsx78(DropdownMenuLabel, { className: sectionLabel, children: orgName ? `${orgName} \xB7 Products` : "Products" }),
|
|
4644
4703
|
products.map((p) => /* @__PURE__ */ jsxs51(DropdownMenuItem, { className: menuItem, onSelect: () => onProductSelect?.(p.id), children: [
|
|
4645
4704
|
/* @__PURE__ */ jsx78(Mark2, { item: p, size: "sm", reserve: true }),
|
|
@@ -4648,7 +4707,7 @@ function OrgProductSwitcher({
|
|
|
4648
4707
|
] }, p.id))
|
|
4649
4708
|
] }),
|
|
4650
4709
|
actions && actions.length > 0 && /* @__PURE__ */ jsxs51(Fragment8, { children: [
|
|
4651
|
-
/* @__PURE__ */ jsx78(DropdownMenuSeparator, { className: "mx-0 shrink-0
|
|
4710
|
+
/* @__PURE__ */ jsx78(DropdownMenuSeparator, { className: "mx-0 shrink-0" }),
|
|
4652
4711
|
actions.map((a) => /* @__PURE__ */ jsx78(DropdownMenuItem, { className: menuItem, onSelect: a.onSelect, asChild: Boolean(a.href), children: a.href ? /* @__PURE__ */ jsxs51("a", { href: a.href, children: [
|
|
4653
4712
|
a.icon,
|
|
4654
4713
|
a.label
|
|
@@ -4668,7 +4727,7 @@ OrgProductSwitcher.displayName = "OrgProductSwitcher";
|
|
|
4668
4727
|
import { ArrowLeft as ArrowLeft3 } from "lucide-react";
|
|
4669
4728
|
import { jsx as jsx79, jsxs as jsxs52 } from "react/jsx-runtime";
|
|
4670
4729
|
var focusRing = "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-border-focus";
|
|
4671
|
-
var arrowPlate = "flex size-5 items-center justify-center rounded-md transition-colors hover:bg-[color-mix(in_srgb,var(--text-primary)_12%,transparent)] hover:text-text-primary";
|
|
4730
|
+
var arrowPlate = "flex size-5 items-center justify-center rounded-md transition-colors duration-fast hover:bg-[color-mix(in_srgb,var(--text-primary)_12%,transparent)] hover:text-text-primary";
|
|
4672
4731
|
var arrowBox = "flex shrink-0 cursor-pointer items-center rounded-xl py-2 pr-0 pl-2.5 text-text-secondary";
|
|
4673
4732
|
var titleBox = "min-w-0 flex-1 cursor-pointer truncate rounded-xl py-2 pr-2.5 pl-[14px] text-left text-sm font-semibold text-text-primary";
|
|
4674
4733
|
var Arrow = () => /* @__PURE__ */ jsx79(ArrowLeft3, { size: 16, "aria-hidden": "true" });
|
|
@@ -4726,9 +4785,9 @@ function SidebarBackHeader({
|
|
|
4726
4785
|
SidebarBackHeader.displayName = "SidebarBackHeader";
|
|
4727
4786
|
|
|
4728
4787
|
// src/components/top-bar.tsx
|
|
4729
|
-
import * as
|
|
4788
|
+
import * as React67 from "react";
|
|
4730
4789
|
import { jsx as jsx80, jsxs as jsxs53 } from "react/jsx-runtime";
|
|
4731
|
-
var TopBar =
|
|
4790
|
+
var TopBar = React67.forwardRef(
|
|
4732
4791
|
({ left, right, className, ...props }, ref) => /* @__PURE__ */ jsxs53("div", { ref, className: cn("flex w-full items-center gap-1", className), ...props, children: [
|
|
4733
4792
|
left,
|
|
4734
4793
|
right && /* @__PURE__ */ jsx80("div", { className: "ml-auto flex items-center gap-2", children: right })
|
|
@@ -4737,9 +4796,9 @@ var TopBar = React66.forwardRef(
|
|
|
4737
4796
|
TopBar.displayName = "TopBar";
|
|
4738
4797
|
|
|
4739
4798
|
// src/components/top-bar-utilities.tsx
|
|
4740
|
-
import * as
|
|
4799
|
+
import * as React68 from "react";
|
|
4741
4800
|
import { jsx as jsx81, jsxs as jsxs54 } from "react/jsx-runtime";
|
|
4742
|
-
var TopBarUtilities =
|
|
4801
|
+
var TopBarUtilities = React68.forwardRef(
|
|
4743
4802
|
({ items, className, ...props }, ref) => /* @__PURE__ */ jsx81("div", { ref, className: cn("flex items-center gap-1", className), ...props, children: items.map(({ name, icon, onClick }) => /* @__PURE__ */ jsxs54(Tooltip, { children: [
|
|
4744
4803
|
/* @__PURE__ */ jsx81(TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsx81(Button, { variant: "ghost", size: "sm", icon, "aria-label": name, onClick }) }),
|
|
4745
4804
|
/* @__PURE__ */ jsx81(TooltipContent, { children: name })
|
|
@@ -4748,10 +4807,10 @@ var TopBarUtilities = React67.forwardRef(
|
|
|
4748
4807
|
TopBarUtilities.displayName = "TopBarUtilities";
|
|
4749
4808
|
|
|
4750
4809
|
// src/components/grid.tsx
|
|
4751
|
-
import * as
|
|
4810
|
+
import * as React69 from "react";
|
|
4752
4811
|
import { Slot as Slot5 } from "@radix-ui/react-slot";
|
|
4753
4812
|
import { jsx as jsx82 } from "react/jsx-runtime";
|
|
4754
|
-
var Grid =
|
|
4813
|
+
var Grid = React69.forwardRef(
|
|
4755
4814
|
({ fluid = false, asChild = false, className, ...props }, ref) => {
|
|
4756
4815
|
const Comp = asChild ? Slot5 : "div";
|
|
4757
4816
|
return /* @__PURE__ */ jsx82(
|
|
@@ -4772,7 +4831,7 @@ var Grid = React68.forwardRef(
|
|
|
4772
4831
|
Grid.displayName = "Grid";
|
|
4773
4832
|
|
|
4774
4833
|
// src/components/col.tsx
|
|
4775
|
-
import * as
|
|
4834
|
+
import * as React70 from "react";
|
|
4776
4835
|
import { Slot as Slot6 } from "@radix-ui/react-slot";
|
|
4777
4836
|
import { jsx as jsx83 } from "react/jsx-runtime";
|
|
4778
4837
|
var TIER_MAX = { base: 4, md: 8, xl: 12 };
|
|
@@ -4894,7 +4953,7 @@ function responsiveClasses(span, offset) {
|
|
|
4894
4953
|
}
|
|
4895
4954
|
return cn(...spanClasses, ...startClasses);
|
|
4896
4955
|
}
|
|
4897
|
-
var Col =
|
|
4956
|
+
var Col = React70.forwardRef(
|
|
4898
4957
|
({ span, offset, asChild = false, className, ...props }, ref) => {
|
|
4899
4958
|
const Comp = asChild ? Slot6 : "div";
|
|
4900
4959
|
return /* @__PURE__ */ jsx83(Comp, { ref, className: cn(responsiveClasses(span, offset), className), ...props });
|
|
@@ -4913,7 +4972,7 @@ function PageColumn({ className, width = "reading", ...props }) {
|
|
|
4913
4972
|
}
|
|
4914
4973
|
|
|
4915
4974
|
// src/components/code-block.tsx
|
|
4916
|
-
import * as
|
|
4975
|
+
import * as React71 from "react";
|
|
4917
4976
|
import { jsx as jsx85, jsxs as jsxs55 } from "react/jsx-runtime";
|
|
4918
4977
|
var TOKEN_CLASS = {
|
|
4919
4978
|
comment: "text-text-tertiary italic",
|
|
@@ -5085,11 +5144,11 @@ function dropLeading(tokens, count) {
|
|
|
5085
5144
|
}
|
|
5086
5145
|
return out;
|
|
5087
5146
|
}
|
|
5088
|
-
var CodeBlock =
|
|
5147
|
+
var CodeBlock = React71.forwardRef(
|
|
5089
5148
|
({ code, lang = "tsx", variant = "default", copy = false, filename, scroll = false, highlightLines, showLineNumbers = false, className, ...props }, ref) => {
|
|
5090
|
-
const lines =
|
|
5091
|
-
const rawLines =
|
|
5092
|
-
const highlighted =
|
|
5149
|
+
const lines = React71.useMemo(() => tokenizeLines(code, lang), [code, lang]);
|
|
5150
|
+
const rawLines = React71.useMemo(() => code.split("\n"), [code]);
|
|
5151
|
+
const highlighted = React71.useMemo(() => parseHighlightLines(highlightLines), [highlightLines]);
|
|
5093
5152
|
const isDiff = variant === "diff";
|
|
5094
5153
|
const isTerminal = variant === "terminal";
|
|
5095
5154
|
const showCopy = copy && !isTerminal;
|
|
@@ -5164,7 +5223,7 @@ var CodeBlock = React70.forwardRef(
|
|
|
5164
5223
|
}
|
|
5165
5224
|
);
|
|
5166
5225
|
CodeBlock.displayName = "CodeBlock";
|
|
5167
|
-
var Code =
|
|
5226
|
+
var Code = React71.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx85(
|
|
5168
5227
|
"code",
|
|
5169
5228
|
{
|
|
5170
5229
|
ref,
|
|
@@ -5178,10 +5237,10 @@ var Code = React70.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */
|
|
|
5178
5237
|
Code.displayName = "Code";
|
|
5179
5238
|
|
|
5180
5239
|
// src/components/grid-overlay.tsx
|
|
5181
|
-
import * as
|
|
5240
|
+
import * as React72 from "react";
|
|
5182
5241
|
import { jsx as jsx86 } from "react/jsx-runtime";
|
|
5183
5242
|
var BASELINE = "var(--grid-gutter) / 2";
|
|
5184
|
-
var GridOverlay =
|
|
5243
|
+
var GridOverlay = React72.forwardRef(
|
|
5185
5244
|
({ columns, baseline = false, className, style, ...props }, ref) => {
|
|
5186
5245
|
const count = Number.isFinite(columns) ? Math.max(1, Math.floor(columns)) : 1;
|
|
5187
5246
|
return /* @__PURE__ */ jsx86(
|
|
@@ -5209,7 +5268,7 @@ var GridOverlay = React71.forwardRef(
|
|
|
5209
5268
|
GridOverlay.displayName = "GridOverlay";
|
|
5210
5269
|
|
|
5211
5270
|
// src/components/attachment-chip.tsx
|
|
5212
|
-
import * as
|
|
5271
|
+
import * as React73 from "react";
|
|
5213
5272
|
import { cva as cva8 } from "class-variance-authority";
|
|
5214
5273
|
import { Link2, Clock, Plus as Plus2 } from "lucide-react";
|
|
5215
5274
|
import { jsx as jsx87, jsxs as jsxs56 } from "react/jsx-runtime";
|
|
@@ -5231,7 +5290,7 @@ var stateIcons = {
|
|
|
5231
5290
|
requested: Clock,
|
|
5232
5291
|
available: Plus2
|
|
5233
5292
|
};
|
|
5234
|
-
var AttachmentChip =
|
|
5293
|
+
var AttachmentChip = React73.forwardRef(
|
|
5235
5294
|
({ state, account, icon, hideIcon = false, className, ...props }, ref) => {
|
|
5236
5295
|
const Icon = icon ?? stateIcons[state ?? "attached"];
|
|
5237
5296
|
return /* @__PURE__ */ jsxs56("span", { ref, className: cn(attachmentChipVariants({ state }), className), ...props, children: [
|
|
@@ -5243,7 +5302,7 @@ var AttachmentChip = React72.forwardRef(
|
|
|
5243
5302
|
AttachmentChip.displayName = "AttachmentChip";
|
|
5244
5303
|
|
|
5245
5304
|
// src/components/connector-card.tsx
|
|
5246
|
-
import * as
|
|
5305
|
+
import * as React74 from "react";
|
|
5247
5306
|
import { AlertTriangle, ChevronDown as ChevronDown6 } from "lucide-react";
|
|
5248
5307
|
import { Fragment as Fragment9, jsx as jsx88, jsxs as jsxs57 } from "react/jsx-runtime";
|
|
5249
5308
|
var originLabels = {
|
|
@@ -5258,7 +5317,7 @@ var statusLabels = {
|
|
|
5258
5317
|
function monogram(name) {
|
|
5259
5318
|
return name.replace(/[^a-zA-Z0-9 ]/g, " ").split(/\s+/).filter(Boolean).slice(0, 2).map((w) => w[0].toUpperCase()).join("");
|
|
5260
5319
|
}
|
|
5261
|
-
var ConnectorCard =
|
|
5320
|
+
var ConnectorCard = React74.forwardRef(
|
|
5262
5321
|
({
|
|
5263
5322
|
name,
|
|
5264
5323
|
kind,
|
|
@@ -5362,7 +5421,7 @@ var ConnectorCard = React73.forwardRef(
|
|
|
5362
5421
|
ChevronDown6,
|
|
5363
5422
|
{
|
|
5364
5423
|
"aria-hidden": "true",
|
|
5365
|
-
className: "size-4 shrink-0 text-text-tertiary transition-transform group-data-[state=open]:rotate-180"
|
|
5424
|
+
className: "size-4 shrink-0 text-text-tertiary transition-transform duration-fast group-data-[state=open]:rotate-180"
|
|
5366
5425
|
}
|
|
5367
5426
|
)
|
|
5368
5427
|
] })
|
|
@@ -5382,12 +5441,12 @@ var ConnectorCard = React73.forwardRef(
|
|
|
5382
5441
|
ConnectorCard.displayName = "ConnectorCard";
|
|
5383
5442
|
|
|
5384
5443
|
// src/components/request-row.tsx
|
|
5385
|
-
import * as
|
|
5444
|
+
import * as React75 from "react";
|
|
5386
5445
|
import { Fragment as Fragment10, jsx as jsx89, jsxs as jsxs58 } from "react/jsx-runtime";
|
|
5387
5446
|
function monogram2(name) {
|
|
5388
5447
|
return name.replace(/[^a-zA-Z0-9 ]/g, " ").split(/\s+/).filter(Boolean).slice(0, 2).map((w) => w[0].toUpperCase()).join("");
|
|
5389
5448
|
}
|
|
5390
|
-
var RequestRow =
|
|
5449
|
+
var RequestRow = React75.forwardRef(
|
|
5391
5450
|
({ surface, name, state, glyph, subtitle, account, onApprove, onDeny, onRequest, onRevoke, action, className, ...props }, ref) => {
|
|
5392
5451
|
let controls = action;
|
|
5393
5452
|
if (controls === void 0) {
|
|
@@ -5439,7 +5498,7 @@ var RequestRow = React74.forwardRef(
|
|
|
5439
5498
|
RequestRow.displayName = "RequestRow";
|
|
5440
5499
|
|
|
5441
5500
|
// src/components/feedback-button.tsx
|
|
5442
|
-
import * as
|
|
5501
|
+
import * as React76 from "react";
|
|
5443
5502
|
import { MessageSquare, Loader2 as Loader23, CheckCircle2 } from "lucide-react";
|
|
5444
5503
|
import { jsx as jsx90, jsxs as jsxs59 } from "react/jsx-runtime";
|
|
5445
5504
|
var TITLE_MAX = 256;
|
|
@@ -5455,15 +5514,15 @@ var DEFAULT_LABELS = {
|
|
|
5455
5514
|
};
|
|
5456
5515
|
function FeedbackButton({ onSubmit, labels, className }) {
|
|
5457
5516
|
const l = { ...DEFAULT_LABELS, ...labels };
|
|
5458
|
-
const uid =
|
|
5517
|
+
const uid = React76.useId();
|
|
5459
5518
|
const titleId = `${uid}-title`;
|
|
5460
5519
|
const detailsId = `${uid}-details`;
|
|
5461
5520
|
const titleErrId = `${uid}-title-error`;
|
|
5462
5521
|
const detailsErrId = `${uid}-details-error`;
|
|
5463
|
-
const [open, setOpen] =
|
|
5464
|
-
const [status, setStatus] =
|
|
5465
|
-
const [title, setTitle] =
|
|
5466
|
-
const [details, setDetails] =
|
|
5522
|
+
const [open, setOpen] = React76.useState(false);
|
|
5523
|
+
const [status, setStatus] = React76.useState("idle");
|
|
5524
|
+
const [title, setTitle] = React76.useState("");
|
|
5525
|
+
const [details, setDetails] = React76.useState("");
|
|
5467
5526
|
const titleTooLong = title.length > TITLE_MAX;
|
|
5468
5527
|
const detailsTooLong = details.length > DETAILS_MAX;
|
|
5469
5528
|
const titleEmpty = title.trim().length === 0;
|
|
@@ -5597,11 +5656,11 @@ function isNotificationSettled(item) {
|
|
|
5597
5656
|
}
|
|
5598
5657
|
|
|
5599
5658
|
// src/components/notification-bell.tsx
|
|
5600
|
-
import * as
|
|
5659
|
+
import * as React78 from "react";
|
|
5601
5660
|
import { BellRing, Settings } from "lucide-react";
|
|
5602
5661
|
|
|
5603
5662
|
// src/components/notification-row.tsx
|
|
5604
|
-
import * as
|
|
5663
|
+
import * as React77 from "react";
|
|
5605
5664
|
|
|
5606
5665
|
// src/components/notification-parts.tsx
|
|
5607
5666
|
import { Check as Check10 } from "lucide-react";
|
|
@@ -5636,7 +5695,7 @@ function DeepLinkControl({
|
|
|
5636
5695
|
|
|
5637
5696
|
// src/components/notification-row.tsx
|
|
5638
5697
|
import { jsx as jsx92, jsxs as jsxs60 } from "react/jsx-runtime";
|
|
5639
|
-
var NotificationRow =
|
|
5698
|
+
var NotificationRow = React77.forwardRef(
|
|
5640
5699
|
({ item, onItemClick, onActionClick, onMarkRead, formatAge, className, ...props }, ref) => {
|
|
5641
5700
|
const settled = isNotificationSettled(item);
|
|
5642
5701
|
const unread = !settled && !item.read;
|
|
@@ -5700,7 +5759,7 @@ var NotificationRow = React76.forwardRef(
|
|
|
5700
5759
|
onClick: () => onActionClick?.(item, action),
|
|
5701
5760
|
className: cn(
|
|
5702
5761
|
rowControlHitArea,
|
|
5703
|
-
chip ? "rounded-md px-2.5 py-1 text-xs font-medium transition-colors" : "text-xs font-semibold text-text-secondary transition-opacity hover:opacity-80",
|
|
5762
|
+
chip ? "rounded-md px-2.5 py-1 text-xs font-medium transition-colors duration-fast" : "text-xs font-semibold text-text-secondary transition-opacity duration-fast hover:opacity-80",
|
|
5704
5763
|
action.variant === "primary" && "bg-bg-brand text-text-on-brand hover:bg-bg-brand-hover",
|
|
5705
5764
|
action.variant === "destructive" && "bg-bg-elevated text-text-danger hover:bg-bg-sunken"
|
|
5706
5765
|
),
|
|
@@ -5717,7 +5776,7 @@ var NotificationRow = React76.forwardRef(
|
|
|
5717
5776
|
onClick: () => onItemClick?.(item),
|
|
5718
5777
|
className: cn(
|
|
5719
5778
|
rowControlHitArea,
|
|
5720
|
-
"text-xs font-semibold text-text-brand transition-opacity hover:opacity-80"
|
|
5779
|
+
"text-xs font-semibold text-text-brand transition-opacity duration-fast hover:opacity-80"
|
|
5721
5780
|
)
|
|
5722
5781
|
}
|
|
5723
5782
|
)
|
|
@@ -5732,7 +5791,7 @@ NotificationRow.displayName = "NotificationRow";
|
|
|
5732
5791
|
|
|
5733
5792
|
// src/components/notification-bell.tsx
|
|
5734
5793
|
import { jsx as jsx93, jsxs as jsxs61 } from "react/jsx-runtime";
|
|
5735
|
-
var NotificationBell =
|
|
5794
|
+
var NotificationBell = React78.forwardRef(
|
|
5736
5795
|
({
|
|
5737
5796
|
items,
|
|
5738
5797
|
unreadCount,
|
|
@@ -5760,7 +5819,7 @@ var NotificationBell = React77.forwardRef(
|
|
|
5760
5819
|
type: "button",
|
|
5761
5820
|
"aria-label": "Notifications",
|
|
5762
5821
|
className: cn(
|
|
5763
|
-
"relative flex size-8 items-center justify-center rounded-lg text-text-secondary transition-colors hover:bg-bg-elevated hover:text-text-primary data-[state=open]:bg-bg-
|
|
5822
|
+
"relative flex size-8 items-center justify-center rounded-lg text-text-secondary transition-colors duration-fast hover:bg-bg-elevated hover:text-text-primary data-[state=open]:bg-bg-elevated data-[state=open]:text-text-primary",
|
|
5764
5823
|
className
|
|
5765
5824
|
),
|
|
5766
5825
|
children: [
|
|
@@ -5785,7 +5844,7 @@ var NotificationBell = React77.forwardRef(
|
|
|
5785
5844
|
{
|
|
5786
5845
|
type: "button",
|
|
5787
5846
|
onClick: () => onMarkAllRead?.(),
|
|
5788
|
-
className: "text-sm font-medium text-text-tertiary transition-colors hover:text-text-primary",
|
|
5847
|
+
className: "text-sm font-medium text-text-tertiary transition-colors duration-fast hover:text-text-primary",
|
|
5789
5848
|
children: "Mark all read"
|
|
5790
5849
|
}
|
|
5791
5850
|
),
|
|
@@ -5795,7 +5854,7 @@ var NotificationBell = React77.forwardRef(
|
|
|
5795
5854
|
type: "button",
|
|
5796
5855
|
"aria-label": "Notification settings",
|
|
5797
5856
|
onClick: () => onOpenSettings(),
|
|
5798
|
-
className: "flex size-6 items-center justify-center rounded-md text-text-tertiary transition-colors hover:bg-bg-surface hover:text-text-primary",
|
|
5857
|
+
className: "flex size-6 items-center justify-center rounded-md text-text-tertiary transition-colors duration-fast hover:bg-bg-surface hover:text-text-primary",
|
|
5799
5858
|
children: /* @__PURE__ */ jsx93(Settings, { className: "size-[15px]", "aria-hidden": "true" })
|
|
5800
5859
|
}
|
|
5801
5860
|
)
|
|
@@ -5818,7 +5877,7 @@ var NotificationBell = React77.forwardRef(
|
|
|
5818
5877
|
{
|
|
5819
5878
|
type: "button",
|
|
5820
5879
|
onClick: () => onOpenArchive(),
|
|
5821
|
-
className: "flex w-full shrink-0 items-center justify-center px-5 py-2.5 text-sm font-medium text-text-brand transition-colors hover:bg-bg-surface",
|
|
5880
|
+
className: "flex w-full shrink-0 items-center justify-center px-5 py-2.5 text-sm font-medium text-text-brand transition-colors duration-fast hover:bg-bg-surface",
|
|
5822
5881
|
children: hidden > 0 ? `Open notifications archive, ${hidden} more` : "Open notifications archive"
|
|
5823
5882
|
}
|
|
5824
5883
|
)
|
|
@@ -5831,11 +5890,11 @@ var NotificationBell = React77.forwardRef(
|
|
|
5831
5890
|
NotificationBell.displayName = "NotificationBell";
|
|
5832
5891
|
|
|
5833
5892
|
// src/components/notification-center.tsx
|
|
5834
|
-
import * as
|
|
5893
|
+
import * as React79 from "react";
|
|
5835
5894
|
import { Check as Check11, Search as Search2 } from "lucide-react";
|
|
5836
5895
|
import { jsx as jsx94, jsxs as jsxs62 } from "react/jsx-runtime";
|
|
5837
|
-
var chipBase = "rounded-
|
|
5838
|
-
var chipOn = "bg-bg-
|
|
5896
|
+
var chipBase = "rounded-md px-3 py-1.5 text-sm font-medium transition-colors duration-fast";
|
|
5897
|
+
var chipOn = "bg-bg-sunken font-semibold text-text-primary";
|
|
5839
5898
|
var chipOff = "bg-bg-elevated text-text-secondary hover:text-text-primary";
|
|
5840
5899
|
function CenterRow({
|
|
5841
5900
|
item,
|
|
@@ -5890,14 +5949,14 @@ function CenterRow({
|
|
|
5890
5949
|
onClick: () => onDeepLinkClick?.(item),
|
|
5891
5950
|
className: cn(
|
|
5892
5951
|
rowControlHitArea,
|
|
5893
|
-
"inline-flex items-center gap-1 text-sm font-medium text-text-brand transition-colors hover:text-text-primary"
|
|
5952
|
+
"inline-flex items-center gap-1 text-sm font-medium text-text-brand transition-colors duration-fast hover:text-text-primary"
|
|
5894
5953
|
)
|
|
5895
5954
|
}
|
|
5896
5955
|
)
|
|
5897
5956
|
] })
|
|
5898
5957
|
] });
|
|
5899
5958
|
}
|
|
5900
|
-
var NotificationCenter =
|
|
5959
|
+
var NotificationCenter = React79.forwardRef(
|
|
5901
5960
|
({
|
|
5902
5961
|
items,
|
|
5903
5962
|
header = true,
|
|
@@ -5914,16 +5973,16 @@ var NotificationCenter = React78.forwardRef(
|
|
|
5914
5973
|
formatAge,
|
|
5915
5974
|
className
|
|
5916
5975
|
}, ref) => {
|
|
5917
|
-
const [status, setStatus] =
|
|
5918
|
-
const [source, setSource] =
|
|
5919
|
-
const [product, setProduct] =
|
|
5920
|
-
const [query, setQuery] =
|
|
5921
|
-
const [limit, setLimit] =
|
|
5922
|
-
const age =
|
|
5976
|
+
const [status, setStatus] = React79.useState("all");
|
|
5977
|
+
const [source, setSource] = React79.useState("all");
|
|
5978
|
+
const [product, setProduct] = React79.useState("all");
|
|
5979
|
+
const [query, setQuery] = React79.useState("");
|
|
5980
|
+
const [limit, setLimit] = React79.useState(pageSize);
|
|
5981
|
+
const age = React79.useCallback(
|
|
5923
5982
|
(createdAt) => formatAge ? formatAge(createdAt) : formatRelativeAge(createdAt),
|
|
5924
5983
|
[formatAge]
|
|
5925
5984
|
);
|
|
5926
|
-
const sourceChips =
|
|
5985
|
+
const sourceChips = React79.useMemo(
|
|
5927
5986
|
() => sources ?? Array.from(new Set(items.map((n) => n.source))),
|
|
5928
5987
|
[sources, items]
|
|
5929
5988
|
);
|
|
@@ -5945,7 +6004,7 @@ var NotificationCenter = React78.forwardRef(
|
|
|
5945
6004
|
{
|
|
5946
6005
|
type: "button",
|
|
5947
6006
|
onClick: () => onMarkAllRead(),
|
|
5948
|
-
className: "shrink-0 rounded-md px-2.5 py-1 text-sm font-medium text-text-tertiary transition-colors hover:text-text-primary",
|
|
6007
|
+
className: "shrink-0 rounded-md px-2.5 py-1 text-sm font-medium text-text-tertiary transition-colors duration-fast hover:text-text-primary",
|
|
5949
6008
|
children: "Read all"
|
|
5950
6009
|
}
|
|
5951
6010
|
)
|
|
@@ -6042,7 +6101,7 @@ var NotificationCenter = React78.forwardRef(
|
|
|
6042
6101
|
{
|
|
6043
6102
|
type: "button",
|
|
6044
6103
|
onClick: () => setLimit((l) => l + pageSize),
|
|
6045
|
-
className: "mt-1 rounded-lg bg-bg-elevated px-4 py-2.5 text-sm font-medium text-text-secondary transition-colors hover:bg-bg-surface hover:text-text-primary",
|
|
6104
|
+
className: "mt-1 rounded-lg bg-bg-elevated px-4 py-2.5 text-sm font-medium text-text-secondary transition-colors duration-fast hover:bg-bg-surface hover:text-text-primary",
|
|
6046
6105
|
children: [
|
|
6047
6106
|
"Load ",
|
|
6048
6107
|
remaining,
|
|
@@ -6057,7 +6116,7 @@ var NotificationCenter = React78.forwardRef(
|
|
|
6057
6116
|
NotificationCenter.displayName = "NotificationCenter";
|
|
6058
6117
|
|
|
6059
6118
|
// src/components/notification-settings.tsx
|
|
6060
|
-
import * as
|
|
6119
|
+
import * as React80 from "react";
|
|
6061
6120
|
import { Moon as Moon2, Plus as Plus3, Volume2 } from "lucide-react";
|
|
6062
6121
|
import { Fragment as Fragment11, jsx as jsx95, jsxs as jsxs63 } from "react/jsx-runtime";
|
|
6063
6122
|
var THRESHOLDS = [
|
|
@@ -6084,7 +6143,7 @@ function ThresholdControl({
|
|
|
6084
6143
|
}
|
|
6085
6144
|
);
|
|
6086
6145
|
}
|
|
6087
|
-
var NotificationSettings =
|
|
6146
|
+
var NotificationSettings = React80.forwardRef(
|
|
6088
6147
|
({
|
|
6089
6148
|
subscriptions,
|
|
6090
6149
|
value,
|
|
@@ -6097,7 +6156,7 @@ var NotificationSettings = React79.forwardRef(
|
|
|
6097
6156
|
pushSlot,
|
|
6098
6157
|
className
|
|
6099
6158
|
}, ref) => {
|
|
6100
|
-
const [tab, setTab] =
|
|
6159
|
+
const [tab, setTab] = React80.useState(DEFAULT_KEY);
|
|
6101
6160
|
const isDefault = tab === DEFAULT_KEY;
|
|
6102
6161
|
const defaults = value[DEFAULT_KEY] ?? { thresholds: {} };
|
|
6103
6162
|
const customized = !isDefault && Object.prototype.hasOwnProperty.call(value, tab);
|
|
@@ -6179,7 +6238,7 @@ var NotificationSettings = React79.forwardRef(
|
|
|
6179
6238
|
{
|
|
6180
6239
|
type: "button",
|
|
6181
6240
|
onClick: () => onUnmute?.(m.source),
|
|
6182
|
-
className: "rounded-md px-2.5 py-1 text-sm font-medium text-text-brand transition-colors hover:bg-bg-surface",
|
|
6241
|
+
className: "rounded-md px-2.5 py-1 text-sm font-medium text-text-brand transition-colors duration-fast hover:bg-bg-surface",
|
|
6183
6242
|
children: "Unmute"
|
|
6184
6243
|
}
|
|
6185
6244
|
)
|
|
@@ -6213,7 +6272,7 @@ var NotificationSettings = React79.forwardRef(
|
|
|
6213
6272
|
{
|
|
6214
6273
|
type: "button",
|
|
6215
6274
|
onClick: customize,
|
|
6216
|
-
className: "mt-5 inline-flex items-center gap-1.5 rounded-lg bg-bg-brand px-3.5 py-2 text-sm font-semibold text-text-on-brand transition-colors hover:bg-bg-brand-hover",
|
|
6275
|
+
className: "mt-5 inline-flex items-center gap-1.5 rounded-lg bg-bg-brand px-3.5 py-2 text-sm font-semibold text-text-on-brand transition-colors duration-fast hover:bg-bg-brand-hover",
|
|
6217
6276
|
children: [
|
|
6218
6277
|
/* @__PURE__ */ jsx95(Plus3, { className: "size-4", "aria-hidden": "true" }),
|
|
6219
6278
|
" Customize for ",
|
|
@@ -6235,7 +6294,7 @@ var NotificationSettings = React79.forwardRef(
|
|
|
6235
6294
|
{
|
|
6236
6295
|
type: "button",
|
|
6237
6296
|
onClick: resetToDefault,
|
|
6238
|
-
className: "shrink-0 rounded-md px-2.5 py-1 text-sm font-medium text-text-tertiary transition-colors hover:text-text-danger",
|
|
6297
|
+
className: "shrink-0 rounded-md px-2.5 py-1 text-sm font-medium text-text-tertiary transition-colors duration-fast hover:text-text-danger",
|
|
6239
6298
|
children: "Reset to Default"
|
|
6240
6299
|
}
|
|
6241
6300
|
)
|
|
@@ -6248,14 +6307,14 @@ var NotificationSettings = React79.forwardRef(
|
|
|
6248
6307
|
NotificationSettings.displayName = "NotificationSettings";
|
|
6249
6308
|
|
|
6250
6309
|
// src/components/notification-toast.tsx
|
|
6251
|
-
import * as
|
|
6310
|
+
import * as React81 from "react";
|
|
6252
6311
|
import { X as X4 } from "lucide-react";
|
|
6253
6312
|
import { jsx as jsx96, jsxs as jsxs64 } from "react/jsx-runtime";
|
|
6254
|
-
var chipBase2 = "rounded-lg px-2.5 py-1 text-sm font-medium transition-colors";
|
|
6313
|
+
var chipBase2 = "rounded-lg px-2.5 py-1 text-sm font-medium transition-colors duration-fast";
|
|
6255
6314
|
var chipPrimary = "bg-bg-brand text-text-on-brand hover:bg-bg-brand-hover";
|
|
6256
6315
|
var chipDestructive = "bg-bg-elevated text-text-danger hover:bg-bg-surface";
|
|
6257
|
-
var linkAction = "text-sm font-semibold text-text-brand transition-colors hover:text-text-primary";
|
|
6258
|
-
var NotificationToast =
|
|
6316
|
+
var linkAction = "text-sm font-semibold text-text-brand transition-colors duration-fast hover:text-text-primary";
|
|
6317
|
+
var NotificationToast = React81.forwardRef(
|
|
6259
6318
|
({
|
|
6260
6319
|
item,
|
|
6261
6320
|
showSource = true,
|
|
@@ -6272,7 +6331,7 @@ var NotificationToast = React80.forwardRef(
|
|
|
6272
6331
|
const actions = item.actions ?? [];
|
|
6273
6332
|
const percent = progress === void 0 || !Number.isFinite(progress) ? void 0 : Math.min(100, Math.max(0, progress));
|
|
6274
6333
|
const progressLine = progressLabel === void 0 && percent !== void 0 ? `live, ${Math.round(percent)}%` : progressLabel;
|
|
6275
|
-
const barId =
|
|
6334
|
+
const barId = React81.useId();
|
|
6276
6335
|
const hasProgressLine = progressLine !== null && progressLine !== void 0;
|
|
6277
6336
|
return /* @__PURE__ */ jsxs64(
|
|
6278
6337
|
"div",
|
|
@@ -6296,7 +6355,7 @@ var NotificationToast = React80.forwardRef(
|
|
|
6296
6355
|
type: "button",
|
|
6297
6356
|
"aria-label": dismissLabel,
|
|
6298
6357
|
onClick: () => onDismiss(item),
|
|
6299
|
-
className: "flex size-5 shrink-0 items-center justify-center rounded-md text-text-tertiary transition-colors hover:bg-bg-surface hover:text-text-primary",
|
|
6358
|
+
className: "flex size-5 shrink-0 items-center justify-center rounded-md text-text-tertiary transition-colors duration-fast hover:bg-bg-surface hover:text-text-primary",
|
|
6300
6359
|
children: /* @__PURE__ */ jsx96(X4, { className: "size-3.5", "aria-hidden": "true" })
|
|
6301
6360
|
}
|
|
6302
6361
|
)
|
|
@@ -6350,7 +6409,7 @@ var NotificationToast = React80.forwardRef(
|
|
|
6350
6409
|
NotificationToast.displayName = "NotificationToast";
|
|
6351
6410
|
|
|
6352
6411
|
// src/components/notification-toaster.tsx
|
|
6353
|
-
import * as
|
|
6412
|
+
import * as React82 from "react";
|
|
6354
6413
|
import { jsx as jsx97 } from "react/jsx-runtime";
|
|
6355
6414
|
var positions = {
|
|
6356
6415
|
"bottom-right": "bottom-6 right-6 flex-col",
|
|
@@ -6358,7 +6417,7 @@ var positions = {
|
|
|
6358
6417
|
"top-right": "top-6 right-6 flex-col-reverse",
|
|
6359
6418
|
"top-left": "top-6 left-6 flex-col-reverse"
|
|
6360
6419
|
};
|
|
6361
|
-
var NotificationToaster =
|
|
6420
|
+
var NotificationToaster = React82.forwardRef(
|
|
6362
6421
|
({
|
|
6363
6422
|
items,
|
|
6364
6423
|
dwell,
|
|
@@ -6375,15 +6434,15 @@ var NotificationToaster = React81.forwardRef(
|
|
|
6375
6434
|
className
|
|
6376
6435
|
}, ref) => {
|
|
6377
6436
|
const shown = items.slice(0, max);
|
|
6378
|
-
const [paused, setPaused] =
|
|
6379
|
-
const onDismissRef =
|
|
6437
|
+
const [paused, setPaused] = React82.useState(false);
|
|
6438
|
+
const onDismissRef = React82.useRef(onDismiss);
|
|
6380
6439
|
onDismissRef.current = onDismiss;
|
|
6381
6440
|
const fyiDwell = dwell?.fyi;
|
|
6382
6441
|
const importantDwell = dwell?.important;
|
|
6383
6442
|
const criticalDwell = dwell?.critical;
|
|
6384
|
-
const remaining =
|
|
6443
|
+
const remaining = React82.useRef(/* @__PURE__ */ new Map());
|
|
6385
6444
|
const liveIds = shown.map((item) => `${item.id}:${item.severity}`).join(" ");
|
|
6386
|
-
|
|
6445
|
+
React82.useEffect(() => {
|
|
6387
6446
|
const owedById = remaining.current;
|
|
6388
6447
|
const dwellSeconds = {
|
|
6389
6448
|
fyi: fyiDwell ?? TOAST_DWELL.fyi,
|
|
@@ -6711,11 +6770,11 @@ var COUNTRY_OPTIONS = [
|
|
|
6711
6770
|
];
|
|
6712
6771
|
|
|
6713
6772
|
// src/components/organization-onboarding-form.tsx
|
|
6714
|
-
import * as
|
|
6773
|
+
import * as React83 from "react";
|
|
6715
6774
|
|
|
6716
6775
|
// src/lib/auth-surface.ts
|
|
6717
|
-
var AUTH_FILLED_BUTTON = "flex h-[46px] w-full items-center justify-center gap-[11px] rounded-[10px] border border-transparent bg-text-primary px-[14px] text-[14.5px] font-semibold tracking-[-0.005em] text-bg-sunken transition-opacity hover:opacity-[0.92] focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-text-brand active:translate-y-px disabled:cursor-not-allowed disabled:opacity-[0.55]";
|
|
6718
|
-
var AUTH_QUIET_BUTTON = "flex h-[46px] w-full items-center justify-center gap-[11px] rounded-[10px] border border-border-default bg-transparent px-[14px] text-[14.5px] font-medium tracking-[-0.005em] text-text-secondary transition-colors hover:bg-bg-secondary focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-text-brand";
|
|
6776
|
+
var AUTH_FILLED_BUTTON = "flex h-[46px] w-full items-center justify-center gap-[11px] rounded-[10px] border border-transparent bg-text-primary px-[14px] text-[14.5px] font-semibold tracking-[-0.005em] text-bg-sunken transition-opacity duration-fast hover:opacity-[0.92] focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-text-brand active:translate-y-px disabled:cursor-not-allowed disabled:opacity-[0.55]";
|
|
6777
|
+
var AUTH_QUIET_BUTTON = "flex h-[46px] w-full items-center justify-center gap-[11px] rounded-[10px] border border-border-default bg-transparent px-[14px] text-[14.5px] font-medium tracking-[-0.005em] text-text-secondary transition-colors duration-fast hover:bg-bg-secondary focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-text-brand";
|
|
6719
6778
|
var AUTH_BUTTON_SHADOW = "var(--auth-btn-shadow)";
|
|
6720
6779
|
|
|
6721
6780
|
// src/components/organization-onboarding-form.tsx
|
|
@@ -6754,22 +6813,22 @@ function OrganizationOnboardingForm({
|
|
|
6754
6813
|
onCancel,
|
|
6755
6814
|
className
|
|
6756
6815
|
}) {
|
|
6757
|
-
const [name, setName] =
|
|
6758
|
-
const [legalName, setLegalName] =
|
|
6759
|
-
const [ownerName, setOwnerName] =
|
|
6760
|
-
const [countryOfIncorporation, setCountryOfIncorporation] =
|
|
6816
|
+
const [name, setName] = React83.useState(defaultValues?.name ?? "");
|
|
6817
|
+
const [legalName, setLegalName] = React83.useState(defaultValues?.legal_name ?? "");
|
|
6818
|
+
const [ownerName, setOwnerName] = React83.useState(defaultValues?.owner_name ?? "");
|
|
6819
|
+
const [countryOfIncorporation, setCountryOfIncorporation] = React83.useState(
|
|
6761
6820
|
defaultValues?.country_of_incorporation ?? ""
|
|
6762
6821
|
);
|
|
6763
|
-
const [residencyCountry, setResidencyCountry] =
|
|
6822
|
+
const [residencyCountry, setResidencyCountry] = React83.useState(
|
|
6764
6823
|
defaultValues?.residency_country ?? ""
|
|
6765
6824
|
);
|
|
6766
|
-
const [owners, setOwners] =
|
|
6825
|
+
const [owners, setOwners] = React83.useState(
|
|
6767
6826
|
() => initialRows(defaultValues?.beneficial_owners)
|
|
6768
6827
|
);
|
|
6769
|
-
const [ownershipConfirmed, setOwnershipConfirmed] =
|
|
6770
|
-
const [confirmationAttempted, setConfirmationAttempted] =
|
|
6771
|
-
const nextKeyRef =
|
|
6772
|
-
const submittingRef =
|
|
6828
|
+
const [ownershipConfirmed, setOwnershipConfirmed] = React83.useState(false);
|
|
6829
|
+
const [confirmationAttempted, setConfirmationAttempted] = React83.useState(false);
|
|
6830
|
+
const nextKeyRef = React83.useRef(owners.length);
|
|
6831
|
+
const submittingRef = React83.useRef(false);
|
|
6773
6832
|
const trimmed = name.trim();
|
|
6774
6833
|
const filledOwners = owners.filter((row) => !isRowBlank(row));
|
|
6775
6834
|
const ownerShares = filledOwners.map((row) => parseShare(row.share));
|
|
@@ -6823,7 +6882,7 @@ function OrganizationOnboardingForm({
|
|
|
6823
6882
|
...needsOwnershipConfirmation ? { ownership_confirmed: ownershipConfirmed } : {}
|
|
6824
6883
|
});
|
|
6825
6884
|
};
|
|
6826
|
-
|
|
6885
|
+
React83.useEffect(() => {
|
|
6827
6886
|
submittingRef.current = false;
|
|
6828
6887
|
}, [
|
|
6829
6888
|
name,
|
|
@@ -7049,7 +7108,7 @@ function OrganizationOnboardingForm({
|
|
|
7049
7108
|
}
|
|
7050
7109
|
|
|
7051
7110
|
// src/components/list-columns.tsx
|
|
7052
|
-
import * as
|
|
7111
|
+
import * as React84 from "react";
|
|
7053
7112
|
import { jsx as jsx99, jsxs as jsxs66 } from "react/jsx-runtime";
|
|
7054
7113
|
var CELL_WIDTH = { 20: "w-20", 24: "w-24", 28: "w-28", 32: "w-32" };
|
|
7055
7114
|
var headerClass = "flex items-center gap-3 border-b border-border-subtle bg-bg-secondary px-4 py-1.5 text-xs text-text-tertiary";
|
|
@@ -7068,7 +7127,7 @@ function warnDuplicateKeys(columns, where) {
|
|
|
7068
7127
|
seen.add(c.key);
|
|
7069
7128
|
}
|
|
7070
7129
|
}
|
|
7071
|
-
var ListHeader =
|
|
7130
|
+
var ListHeader = React84.forwardRef(function ListHeader2({ lead, columns, mark = true, trailing = true, className, ...props }, ref) {
|
|
7072
7131
|
warnDuplicateKeys(columns, "ListHeader");
|
|
7073
7132
|
return /* @__PURE__ */ jsxs66("div", { ref, className: cn(headerClass, className), ...props, children: [
|
|
7074
7133
|
mark && /* @__PURE__ */ jsx99("span", { className: "size-8 shrink-0", "aria-hidden": true }),
|
|
@@ -7082,7 +7141,7 @@ function cellValue(values, column) {
|
|
|
7082
7141
|
const value = values[column.key];
|
|
7083
7142
|
return value === void 0 || value === null || value === "" ? column.fallback : value;
|
|
7084
7143
|
}
|
|
7085
|
-
var ListCells =
|
|
7144
|
+
var ListCells = React84.forwardRef(function ListCells2({ columns, values, className, ...props }, ref) {
|
|
7086
7145
|
warnDuplicateKeys(columns, "ListCells");
|
|
7087
7146
|
return /* @__PURE__ */ jsx99("span", { ref, className: cn(cellsClass, className), ...props, children: columns.map((c) => /* @__PURE__ */ jsx99(
|
|
7088
7147
|
"span",
|
|
@@ -7097,7 +7156,7 @@ ListHeader.displayName = "ListHeader";
|
|
|
7097
7156
|
ListCells.displayName = "ListCells";
|
|
7098
7157
|
|
|
7099
7158
|
// src/components/theme-picker.tsx
|
|
7100
|
-
import * as
|
|
7159
|
+
import * as React85 from "react";
|
|
7101
7160
|
import { Check as Check12, Monitor } from "lucide-react";
|
|
7102
7161
|
import { jsx as jsx100, jsxs as jsxs67 } from "react/jsx-runtime";
|
|
7103
7162
|
var THEME_SWATCHES = {
|
|
@@ -7146,11 +7205,11 @@ function Panels({ palette }) {
|
|
|
7146
7205
|
)
|
|
7147
7206
|
] });
|
|
7148
7207
|
}
|
|
7149
|
-
var autoPlateClass = "flex h-full items-center justify-center bg-bg-
|
|
7208
|
+
var autoPlateClass = "flex h-full items-center justify-center bg-bg-surface";
|
|
7150
7209
|
var previewClass = "block h-28 overflow-hidden rounded-lg border border-border-default";
|
|
7151
|
-
var cardClass = "grid gap-2 rounded-lg p-1.5 text-left transition-colors hover:bg-bg-elevated focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-border-focus";
|
|
7210
|
+
var cardClass = "grid gap-2 rounded-lg p-1.5 text-left transition-colors duration-fast hover:bg-bg-elevated focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-border-focus";
|
|
7152
7211
|
var TRACK = { gridTemplateColumns: "repeat(auto-fit, minmax(8rem, 1fr))" };
|
|
7153
|
-
var Picker =
|
|
7212
|
+
var Picker = React85.forwardRef(function Picker2({ value, onValueChange, className, ...props }, ref) {
|
|
7154
7213
|
return /* @__PURE__ */ jsx100("div", { role: "group", "aria-label": "Theme", ...props, ref, className: cn("grid gap-4", className), style: { ...TRACK, ...props.style }, children: OPTIONS.map((o) => {
|
|
7155
7214
|
const selected = o.value === value;
|
|
7156
7215
|
return (
|
|
@@ -7165,7 +7224,7 @@ var Picker = React84.forwardRef(function Picker2({ value, onValueChange, classNa
|
|
|
7165
7224
|
onClick: () => onValueChange(o.value),
|
|
7166
7225
|
className: cardClass,
|
|
7167
7226
|
children: [
|
|
7168
|
-
/* @__PURE__ */ jsx100("span", { className: cn(previewClass, selected && "
|
|
7227
|
+
/* @__PURE__ */ jsx100("span", { className: cn(previewClass, selected && "border-border-strong"), "aria-hidden": true, children: o.value === "system" ? /* @__PURE__ */ jsx100("span", { className: autoPlateClass, children: /* @__PURE__ */ jsx100(Monitor, { className: "size-8 text-text-tertiary" }) }) : /* @__PURE__ */ jsx100(Panels, { palette: THEME_SWATCHES[o.value] }) }),
|
|
7169
7228
|
/* @__PURE__ */ jsxs67(
|
|
7170
7229
|
"span",
|
|
7171
7230
|
{
|
|
@@ -7186,7 +7245,7 @@ var Picker = React84.forwardRef(function Picker2({ value, onValueChange, classNa
|
|
|
7186
7245
|
);
|
|
7187
7246
|
}) });
|
|
7188
7247
|
});
|
|
7189
|
-
var WiredPicker =
|
|
7248
|
+
var WiredPicker = React85.forwardRef(function WiredPicker2({ onValueChange, ...props }, ref) {
|
|
7190
7249
|
const { theme, setTheme } = useTheme();
|
|
7191
7250
|
return /* @__PURE__ */ jsx100(
|
|
7192
7251
|
Picker,
|
|
@@ -7201,8 +7260,8 @@ var WiredPicker = React84.forwardRef(function WiredPicker2({ onValueChange, ...p
|
|
|
7201
7260
|
}
|
|
7202
7261
|
);
|
|
7203
7262
|
});
|
|
7204
|
-
var ThemePicker =
|
|
7205
|
-
const controlled =
|
|
7263
|
+
var ThemePicker = React85.forwardRef(function ThemePicker2({ value, onValueChange, ...props }, ref) {
|
|
7264
|
+
const controlled = React85.useRef(value !== void 0);
|
|
7206
7265
|
if (process.env.NODE_ENV !== "production" && controlled.current !== (value !== void 0)) {
|
|
7207
7266
|
console.warn(
|
|
7208
7267
|
"[ThemePicker] `value` went from " + (controlled.current ? "set to missing" : "missing to set") + " after mount. The picker stays " + (controlled.current ? "controlled" : "wired to the console theme") + " for its whole life: render it once its value is known, or leave `value` off entirely."
|
|
@@ -7214,7 +7273,7 @@ var ThemePicker = React84.forwardRef(function ThemePicker2({ value, onValueChang
|
|
|
7214
7273
|
ThemePicker.displayName = "ThemePicker";
|
|
7215
7274
|
|
|
7216
7275
|
// src/components/secret-reveal.tsx
|
|
7217
|
-
import * as
|
|
7276
|
+
import * as React86 from "react";
|
|
7218
7277
|
import { Copy as Copy2, Download } from "lucide-react";
|
|
7219
7278
|
import { jsx as jsx101, jsxs as jsxs68 } from "react/jsx-runtime";
|
|
7220
7279
|
var asText = (value) => Array.isArray(value) ? value.join("\n") : value;
|
|
@@ -7232,7 +7291,7 @@ function SecretValue({ value }) {
|
|
|
7232
7291
|
}
|
|
7233
7292
|
return /* @__PURE__ */ jsx101("code", { className: "block break-all font-mono text-sm font-medium text-text-primary", children: value });
|
|
7234
7293
|
}
|
|
7235
|
-
var SecretReveal =
|
|
7294
|
+
var SecretReveal = React86.forwardRef(
|
|
7236
7295
|
({
|
|
7237
7296
|
value,
|
|
7238
7297
|
caption,
|
|
@@ -7249,18 +7308,18 @@ var SecretReveal = React85.forwardRef(
|
|
|
7249
7308
|
className,
|
|
7250
7309
|
...props
|
|
7251
7310
|
}, ref) => {
|
|
7252
|
-
const [takenText, setTakenText] =
|
|
7253
|
-
const [refusedText, setRefusedText] =
|
|
7254
|
-
const [announcedFor, setAnnouncedFor] =
|
|
7255
|
-
const copyRef =
|
|
7256
|
-
const captionId =
|
|
7311
|
+
const [takenText, setTakenText] = React86.useState(null);
|
|
7312
|
+
const [refusedText, setRefusedText] = React86.useState(null);
|
|
7313
|
+
const [announcedFor, setAnnouncedFor] = React86.useState(null);
|
|
7314
|
+
const copyRef = React86.useRef(null);
|
|
7315
|
+
const captionId = React86.useId();
|
|
7257
7316
|
const text = asText(value);
|
|
7258
7317
|
const empty = text.length === 0;
|
|
7259
7318
|
const taken = takenText === text;
|
|
7260
7319
|
const refused = refusedText === text;
|
|
7261
|
-
|
|
7320
|
+
React86.useEffect(() => setAnnouncedFor(text), [text]);
|
|
7262
7321
|
const announced = announcedFor === text ? REVEALED : "";
|
|
7263
|
-
|
|
7322
|
+
React86.useEffect(() => {
|
|
7264
7323
|
if (autoFocus) copyRef.current?.focus();
|
|
7265
7324
|
}, [autoFocus]);
|
|
7266
7325
|
const reportTaken = () => {
|
|
@@ -7320,6 +7379,212 @@ var SecretReveal = React85.forwardRef(
|
|
|
7320
7379
|
}
|
|
7321
7380
|
);
|
|
7322
7381
|
SecretReveal.displayName = "SecretReveal";
|
|
7382
|
+
|
|
7383
|
+
// src/components/star-rating.tsx
|
|
7384
|
+
import * as React87 from "react";
|
|
7385
|
+
import * as RadioGroupPrimitive2 from "@radix-ui/react-radio-group";
|
|
7386
|
+
import { Star } from "lucide-react";
|
|
7387
|
+
import { jsx as jsx102 } from "react/jsx-runtime";
|
|
7388
|
+
var STAR_BOX = {
|
|
7389
|
+
sm: "size-4",
|
|
7390
|
+
md: "size-5",
|
|
7391
|
+
lg: "size-6"
|
|
7392
|
+
};
|
|
7393
|
+
var ROW_GAP = {
|
|
7394
|
+
sm: "gap-0.5",
|
|
7395
|
+
md: "gap-1",
|
|
7396
|
+
lg: "gap-1.5"
|
|
7397
|
+
};
|
|
7398
|
+
var defaultItemLabel = (value, max) => `${value} out of ${max} stars`;
|
|
7399
|
+
var StarGlyph = ({ filled, size }) => /* @__PURE__ */ jsx102(
|
|
7400
|
+
Star,
|
|
7401
|
+
{
|
|
7402
|
+
"aria-hidden": "true",
|
|
7403
|
+
className: cn(
|
|
7404
|
+
STAR_BOX[size],
|
|
7405
|
+
"shrink-0 transition-colors duration-fast",
|
|
7406
|
+
filled ? "fill-current text-text-primary" : "text-text-tertiary"
|
|
7407
|
+
)
|
|
7408
|
+
}
|
|
7409
|
+
);
|
|
7410
|
+
var StarRating = React87.forwardRef(
|
|
7411
|
+
({
|
|
7412
|
+
className,
|
|
7413
|
+
value,
|
|
7414
|
+
defaultValue,
|
|
7415
|
+
onValueChange,
|
|
7416
|
+
max = 5,
|
|
7417
|
+
min = 1,
|
|
7418
|
+
size = "md",
|
|
7419
|
+
readOnly,
|
|
7420
|
+
disabled,
|
|
7421
|
+
itemLabel = defaultItemLabel,
|
|
7422
|
+
...props
|
|
7423
|
+
}, ref) => {
|
|
7424
|
+
const stars = Array.from({ length: max }, (_, index) => index + 1);
|
|
7425
|
+
const [mirror, setMirror] = React87.useState(defaultValue ?? 0);
|
|
7426
|
+
const selected = value ?? mirror;
|
|
7427
|
+
const [preview, setPreview] = React87.useState(null);
|
|
7428
|
+
const shown = preview ?? selected;
|
|
7429
|
+
const commit = (next) => {
|
|
7430
|
+
setMirror(next);
|
|
7431
|
+
onValueChange?.(next);
|
|
7432
|
+
};
|
|
7433
|
+
if (readOnly) {
|
|
7434
|
+
return /* @__PURE__ */ jsx102(
|
|
7435
|
+
"div",
|
|
7436
|
+
{
|
|
7437
|
+
ref,
|
|
7438
|
+
role: "img",
|
|
7439
|
+
"aria-label": props["aria-label"] ?? itemLabel(selected, max),
|
|
7440
|
+
className: cn("inline-flex items-center", ROW_GAP[size], className),
|
|
7441
|
+
children: stars.map((star) => /* @__PURE__ */ jsx102(StarGlyph, { filled: star <= selected, size }, star))
|
|
7442
|
+
}
|
|
7443
|
+
);
|
|
7444
|
+
}
|
|
7445
|
+
return /* @__PURE__ */ jsx102(
|
|
7446
|
+
RadioGroupPrimitive2.Root,
|
|
7447
|
+
{
|
|
7448
|
+
ref,
|
|
7449
|
+
...props,
|
|
7450
|
+
disabled,
|
|
7451
|
+
value: String(selected),
|
|
7452
|
+
onValueChange: (next) => commit(Number(next)),
|
|
7453
|
+
onKeyDown: (event) => {
|
|
7454
|
+
if (min === 0 && (event.key === "Backspace" || event.key === "Delete")) {
|
|
7455
|
+
event.preventDefault();
|
|
7456
|
+
commit(0);
|
|
7457
|
+
}
|
|
7458
|
+
},
|
|
7459
|
+
orientation: "horizontal",
|
|
7460
|
+
loop: false,
|
|
7461
|
+
className: cn("inline-flex items-center", ROW_GAP[size], className),
|
|
7462
|
+
children: stars.map((star) => /* @__PURE__ */ jsx102(
|
|
7463
|
+
RadioGroupPrimitive2.Item,
|
|
7464
|
+
{
|
|
7465
|
+
value: String(star),
|
|
7466
|
+
"aria-label": itemLabel(star, max),
|
|
7467
|
+
onPointerEnter: () => setPreview(star),
|
|
7468
|
+
onPointerLeave: () => setPreview((current) => current === star ? null : current),
|
|
7469
|
+
onClick: () => {
|
|
7470
|
+
if (min === 0 && star === selected) commit(0);
|
|
7471
|
+
},
|
|
7472
|
+
className: cn(
|
|
7473
|
+
// Focus is an outline held off the box, never a flush ring (`Guidelines/Look/Borders`).
|
|
7474
|
+
"rounded-md p-0.5 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-border-focus",
|
|
7475
|
+
"disabled:pointer-events-none disabled:opacity-50"
|
|
7476
|
+
),
|
|
7477
|
+
children: /* @__PURE__ */ jsx102(StarGlyph, { filled: star <= shown, size })
|
|
7478
|
+
},
|
|
7479
|
+
star
|
|
7480
|
+
))
|
|
7481
|
+
}
|
|
7482
|
+
);
|
|
7483
|
+
}
|
|
7484
|
+
);
|
|
7485
|
+
StarRating.displayName = "StarRating";
|
|
7486
|
+
|
|
7487
|
+
// src/components/rating-scale.tsx
|
|
7488
|
+
import * as React88 from "react";
|
|
7489
|
+
import * as RadioGroupPrimitive3 from "@radix-ui/react-radio-group";
|
|
7490
|
+
import { jsx as jsx103, jsxs as jsxs69 } from "react/jsx-runtime";
|
|
7491
|
+
var SLOT_BOX = {
|
|
7492
|
+
sm: "h-8 min-w-8 px-2 text-xs",
|
|
7493
|
+
md: "h-9 min-w-9 px-2 text-sm",
|
|
7494
|
+
lg: "h-11 min-w-11 px-3 text-base"
|
|
7495
|
+
};
|
|
7496
|
+
var defaultItemLabel2 = (value, _min, max) => `${value} out of ${max}`;
|
|
7497
|
+
var RatingScale = React88.forwardRef(
|
|
7498
|
+
({
|
|
7499
|
+
className,
|
|
7500
|
+
value,
|
|
7501
|
+
defaultValue,
|
|
7502
|
+
onValueChange,
|
|
7503
|
+
min = 0,
|
|
7504
|
+
max = 10,
|
|
7505
|
+
size = "md",
|
|
7506
|
+
readOnly,
|
|
7507
|
+
disabled,
|
|
7508
|
+
endLabels,
|
|
7509
|
+
itemLabel = defaultItemLabel2,
|
|
7510
|
+
...props
|
|
7511
|
+
}, ref) => {
|
|
7512
|
+
const slots = Array.from({ length: Math.max(0, max - min + 1) }, (_, index) => min + index);
|
|
7513
|
+
const [mirror, setMirror] = React88.useState(defaultValue);
|
|
7514
|
+
const selected = value ?? mirror;
|
|
7515
|
+
const row = /* @__PURE__ */ jsx103("div", { className: cn("flex flex-wrap items-center gap-1.5", !endLabels && className), children: slots.map((slot) => {
|
|
7516
|
+
const isSelected = slot === selected;
|
|
7517
|
+
const box = cn(
|
|
7518
|
+
"inline-flex items-center justify-center rounded-md border tabular-nums transition-colors duration-fast",
|
|
7519
|
+
SLOT_BOX[size],
|
|
7520
|
+
isSelected ? "border-border-strong font-semibold text-text-primary" : "border-field-border font-medium text-text-secondary"
|
|
7521
|
+
);
|
|
7522
|
+
if (readOnly) {
|
|
7523
|
+
return /* @__PURE__ */ jsx103("span", { className: box, "aria-hidden": "true", children: slot }, slot);
|
|
7524
|
+
}
|
|
7525
|
+
return /* @__PURE__ */ jsx103(
|
|
7526
|
+
RadioGroupPrimitive3.Item,
|
|
7527
|
+
{
|
|
7528
|
+
value: String(slot),
|
|
7529
|
+
"aria-label": itemLabel(slot, min, max),
|
|
7530
|
+
className: cn(
|
|
7531
|
+
box,
|
|
7532
|
+
// The hover step is the same channel the mark uses, one rung short of it, so the
|
|
7533
|
+
// pointer never promises a mark it is not making.
|
|
7534
|
+
"hover:border-field-border-hover hover:text-text-primary",
|
|
7535
|
+
"focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-border-focus",
|
|
7536
|
+
"disabled:pointer-events-none disabled:opacity-50"
|
|
7537
|
+
),
|
|
7538
|
+
children: slot
|
|
7539
|
+
},
|
|
7540
|
+
slot
|
|
7541
|
+
);
|
|
7542
|
+
}) });
|
|
7543
|
+
const ends = endLabels ? /* @__PURE__ */ jsxs69("div", { className: "flex items-center justify-between text-xs text-text-tertiary", children: [
|
|
7544
|
+
/* @__PURE__ */ jsx103("span", { children: endLabels.low }),
|
|
7545
|
+
/* @__PURE__ */ jsx103("span", { children: endLabels.high })
|
|
7546
|
+
] }) : null;
|
|
7547
|
+
if (readOnly) {
|
|
7548
|
+
return /* @__PURE__ */ jsxs69(
|
|
7549
|
+
"div",
|
|
7550
|
+
{
|
|
7551
|
+
ref,
|
|
7552
|
+
role: "img",
|
|
7553
|
+
"aria-label": props["aria-label"] ?? (selected === void 0 ? "Not answered" : itemLabel(selected, min, max)),
|
|
7554
|
+
className: cn(endLabels && cn("flex flex-col gap-1.5", className)),
|
|
7555
|
+
children: [
|
|
7556
|
+
row,
|
|
7557
|
+
ends
|
|
7558
|
+
]
|
|
7559
|
+
}
|
|
7560
|
+
);
|
|
7561
|
+
}
|
|
7562
|
+
const group = /* @__PURE__ */ jsx103(
|
|
7563
|
+
RadioGroupPrimitive3.Root,
|
|
7564
|
+
{
|
|
7565
|
+
ref,
|
|
7566
|
+
...props,
|
|
7567
|
+
disabled,
|
|
7568
|
+
value: selected === void 0 ? "" : String(selected),
|
|
7569
|
+
onValueChange: (next) => {
|
|
7570
|
+
const parsed = Number(next);
|
|
7571
|
+
setMirror(parsed);
|
|
7572
|
+
onValueChange?.(parsed);
|
|
7573
|
+
},
|
|
7574
|
+
orientation: "horizontal",
|
|
7575
|
+
loop: false,
|
|
7576
|
+
asChild: true,
|
|
7577
|
+
children: row
|
|
7578
|
+
}
|
|
7579
|
+
);
|
|
7580
|
+
if (!endLabels) return group;
|
|
7581
|
+
return /* @__PURE__ */ jsxs69("div", { className: cn("flex flex-col gap-1.5", className), children: [
|
|
7582
|
+
group,
|
|
7583
|
+
ends
|
|
7584
|
+
] });
|
|
7585
|
+
}
|
|
7586
|
+
);
|
|
7587
|
+
RatingScale.displayName = "RatingScale";
|
|
7323
7588
|
export {
|
|
7324
7589
|
Accordion,
|
|
7325
7590
|
AccordionContent,
|
|
@@ -7534,6 +7799,7 @@ export {
|
|
|
7534
7799
|
Progress,
|
|
7535
7800
|
RadioGroup2 as RadioGroup,
|
|
7536
7801
|
RadioGroupItem,
|
|
7802
|
+
RatingScale,
|
|
7537
7803
|
RemovableChip,
|
|
7538
7804
|
RemoveButton,
|
|
7539
7805
|
RequestRow,
|
|
@@ -7558,6 +7824,7 @@ export {
|
|
|
7558
7824
|
SidebarProductHeader,
|
|
7559
7825
|
Skeleton,
|
|
7560
7826
|
Slider,
|
|
7827
|
+
StarRating,
|
|
7561
7828
|
StatCard,
|
|
7562
7829
|
StatusDot,
|
|
7563
7830
|
StepUpChallenge,
|
|
@@ -7607,6 +7874,7 @@ export {
|
|
|
7607
7874
|
toggleVariants,
|
|
7608
7875
|
useCarousel,
|
|
7609
7876
|
useFormField,
|
|
7877
|
+
useFreshHighlight,
|
|
7610
7878
|
useIsMobile,
|
|
7611
7879
|
useSidebar,
|
|
7612
7880
|
useTheme
|