@lessly/ui 4.0.0 → 4.1.1
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 +8 -0
- package/dist/{chunk-DYHP7W3X.js → chunk-LTHOLX7I.js} +93 -45
- package/dist/index.d.ts +25 -6
- package/dist/index.js +952 -985
- package/dist/router.js +6 -7
- package/dist/styles-federated.css +18 -1
- package/dist/styles.css +18 -7
- package/package.json +2 -3
package/dist/index.js
CHANGED
|
@@ -3,6 +3,8 @@ import {
|
|
|
3
3
|
EntityRow,
|
|
4
4
|
NavRow,
|
|
5
5
|
RailToggle,
|
|
6
|
+
ScrollArea,
|
|
7
|
+
ScrollBar,
|
|
6
8
|
Sheet,
|
|
7
9
|
SheetClose,
|
|
8
10
|
SheetContent,
|
|
@@ -21,7 +23,7 @@ import {
|
|
|
21
23
|
cn,
|
|
22
24
|
useIsMobile,
|
|
23
25
|
useSidebar
|
|
24
|
-
} from "./chunk-
|
|
26
|
+
} from "./chunk-LTHOLX7I.js";
|
|
25
27
|
|
|
26
28
|
// src/components/auto-height.tsx
|
|
27
29
|
import * as React from "react";
|
|
@@ -382,7 +384,7 @@ var Input = React5.forwardRef(
|
|
|
382
384
|
{
|
|
383
385
|
className: cn(
|
|
384
386
|
FIELD_BOX,
|
|
385
|
-
"items-center gap-1.5 focus-within:ring-2 focus-within:ring-border-focus has-[input:disabled]:cursor-not-allowed has-[input:disabled]:opacity-50",
|
|
387
|
+
"items-center gap-1.5 focus-within:ring-2 focus-within:ring-inset focus-within:ring-border-focus has-[input:disabled]:cursor-not-allowed has-[input:disabled]:opacity-50",
|
|
386
388
|
className
|
|
387
389
|
),
|
|
388
390
|
children: [
|
|
@@ -408,7 +410,7 @@ var Input = React5.forwardRef(
|
|
|
408
410
|
style,
|
|
409
411
|
className: cn(
|
|
410
412
|
FIELD_BOX,
|
|
411
|
-
"file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-text-tertiary focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-border-focus disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50",
|
|
413
|
+
"file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:text-text-tertiary focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-border-focus disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50",
|
|
412
414
|
className
|
|
413
415
|
),
|
|
414
416
|
ref,
|
|
@@ -429,7 +431,7 @@ var InputGroup = React6.forwardRef(
|
|
|
429
431
|
ref,
|
|
430
432
|
className: cn(
|
|
431
433
|
"flex h-10 w-full items-stretch overflow-hidden rounded-md border border-border-default bg-bg-primary text-sm text-text-primary",
|
|
432
|
-
"focus-within:ring-2 focus-within:ring-border-focus",
|
|
434
|
+
"focus-within:ring-2 focus-within:ring-inset focus-within:ring-border-focus",
|
|
433
435
|
"has-[input:disabled]:cursor-not-allowed has-[input:disabled]:opacity-50",
|
|
434
436
|
className
|
|
435
437
|
),
|
|
@@ -609,7 +611,7 @@ function Select({
|
|
|
609
611
|
"aria-labelledby": ariaLabelledby,
|
|
610
612
|
disabled,
|
|
611
613
|
className: cn(
|
|
612
|
-
"flex items-center text-sm text-text-primary focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-border-focus disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50",
|
|
614
|
+
"flex items-center text-sm text-text-primary focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-border-focus disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50",
|
|
613
615
|
quiet ? (
|
|
614
616
|
// No border at all, so there is no filled step to paint: what a row's control has to
|
|
615
617
|
// say is its value, and the hover fill is what says it can be pressed.
|
|
@@ -821,7 +823,7 @@ var Textarea = React13.forwardRef(
|
|
|
821
823
|
{
|
|
822
824
|
ref,
|
|
823
825
|
className: cn(
|
|
824
|
-
"flex min-h-20 w-full rounded-md border border-field-border hover:border-field-border-hover bg-bg-primary px-3 py-2 text-sm text-text-primary placeholder:text-text-tertiary focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-border-focus disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50",
|
|
826
|
+
"flex min-h-20 w-full rounded-md border border-field-border hover:border-field-border-hover bg-bg-primary px-3 py-2 text-sm text-text-primary placeholder:text-text-tertiary focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-border-focus disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50",
|
|
825
827
|
className
|
|
826
828
|
),
|
|
827
829
|
...props
|
|
@@ -1903,45 +1905,10 @@ var CollapsibleContent2 = React33.forwardRef(({ className, ...props }, ref) => /
|
|
|
1903
1905
|
));
|
|
1904
1906
|
CollapsibleContent2.displayName = CollapsiblePrimitive.CollapsibleContent.displayName;
|
|
1905
1907
|
|
|
1906
|
-
// src/components/scroll-area.tsx
|
|
1907
|
-
import * as React34 from "react";
|
|
1908
|
-
import * as ScrollAreaPrimitive from "@radix-ui/react-scroll-area";
|
|
1909
|
-
import { jsx as jsx41, jsxs as jsxs20 } from "react/jsx-runtime";
|
|
1910
|
-
var ScrollArea = React34.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ jsxs20(
|
|
1911
|
-
ScrollAreaPrimitive.Root,
|
|
1912
|
-
{
|
|
1913
|
-
ref,
|
|
1914
|
-
className: cn("relative overflow-hidden", className),
|
|
1915
|
-
...props,
|
|
1916
|
-
children: [
|
|
1917
|
-
/* @__PURE__ */ jsx41(ScrollAreaPrimitive.Viewport, { className: "h-full w-full rounded-[inherit]", children }),
|
|
1918
|
-
/* @__PURE__ */ jsx41(ScrollBar, {}),
|
|
1919
|
-
/* @__PURE__ */ jsx41(ScrollAreaPrimitive.Corner, {})
|
|
1920
|
-
]
|
|
1921
|
-
}
|
|
1922
|
-
));
|
|
1923
|
-
ScrollArea.displayName = ScrollAreaPrimitive.Root.displayName;
|
|
1924
|
-
var ScrollBar = React34.forwardRef(({ className, orientation = "vertical", ...props }, ref) => /* @__PURE__ */ jsx41(
|
|
1925
|
-
ScrollAreaPrimitive.ScrollAreaScrollbar,
|
|
1926
|
-
{
|
|
1927
|
-
ref,
|
|
1928
|
-
orientation,
|
|
1929
|
-
className: cn(
|
|
1930
|
-
"flex touch-none select-none transition-colors duration-fast",
|
|
1931
|
-
orientation === "vertical" && "h-full w-2.5 border-l border-l-transparent p-[1px]",
|
|
1932
|
-
orientation === "horizontal" && "h-2.5 flex-col border-t border-t-transparent p-[1px]",
|
|
1933
|
-
className
|
|
1934
|
-
),
|
|
1935
|
-
...props,
|
|
1936
|
-
children: /* @__PURE__ */ jsx41(ScrollAreaPrimitive.ScrollAreaThumb, { className: "relative flex-1 rounded-full bg-border-selected" })
|
|
1937
|
-
}
|
|
1938
|
-
));
|
|
1939
|
-
ScrollBar.displayName = ScrollAreaPrimitive.ScrollAreaScrollbar.displayName;
|
|
1940
|
-
|
|
1941
1908
|
// src/components/alert.tsx
|
|
1942
|
-
import * as
|
|
1909
|
+
import * as React34 from "react";
|
|
1943
1910
|
import { cva as cva5 } from "class-variance-authority";
|
|
1944
|
-
import { jsx as
|
|
1911
|
+
import { jsx as jsx41, jsxs as jsxs20 } from "react/jsx-runtime";
|
|
1945
1912
|
var alertVariants = cva5(
|
|
1946
1913
|
"relative w-full rounded-lg border p-4 [&>svg~*]:pl-7 [&>svg+div]:translate-y-[-3px] [&>svg]:absolute [&>svg]:left-4 [&>svg]:top-4 [&>svg]:size-4",
|
|
1947
1914
|
{
|
|
@@ -1956,8 +1923,8 @@ var alertVariants = cva5(
|
|
|
1956
1923
|
defaultVariants: { variant: "default" }
|
|
1957
1924
|
}
|
|
1958
1925
|
);
|
|
1959
|
-
var Alert =
|
|
1960
|
-
({ className, variant, value, action, children, ...props }, ref) => /* @__PURE__ */
|
|
1926
|
+
var Alert = React34.forwardRef(
|
|
1927
|
+
({ className, variant, value, action, children, ...props }, ref) => /* @__PURE__ */ jsxs20(
|
|
1961
1928
|
"div",
|
|
1962
1929
|
{
|
|
1963
1930
|
ref,
|
|
@@ -1966,16 +1933,16 @@ var Alert = React35.forwardRef(
|
|
|
1966
1933
|
...props,
|
|
1967
1934
|
children: [
|
|
1968
1935
|
children,
|
|
1969
|
-
(value !== void 0 || action !== void 0) && /* @__PURE__ */
|
|
1970
|
-
value !== void 0 && /* @__PURE__ */
|
|
1971
|
-
action !== void 0 && /* @__PURE__ */
|
|
1936
|
+
(value !== void 0 || action !== void 0) && /* @__PURE__ */ jsxs20("div", { className: "mt-2 flex items-center gap-2", children: [
|
|
1937
|
+
value !== void 0 && /* @__PURE__ */ jsx41("code", { className: "min-w-0 flex-1 truncate font-mono text-sm font-medium", children: value }),
|
|
1938
|
+
action !== void 0 && /* @__PURE__ */ jsx41("span", { className: "flex shrink-0 items-center gap-2", children: action })
|
|
1972
1939
|
] })
|
|
1973
1940
|
]
|
|
1974
1941
|
}
|
|
1975
1942
|
)
|
|
1976
1943
|
);
|
|
1977
1944
|
Alert.displayName = "Alert";
|
|
1978
|
-
var AlertTitle =
|
|
1945
|
+
var AlertTitle = React34.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx41(
|
|
1979
1946
|
"h5",
|
|
1980
1947
|
{
|
|
1981
1948
|
ref,
|
|
@@ -1984,7 +1951,7 @@ var AlertTitle = React35.forwardRef(({ className, ...props }, ref) => /* @__PURE
|
|
|
1984
1951
|
}
|
|
1985
1952
|
));
|
|
1986
1953
|
AlertTitle.displayName = "AlertTitle";
|
|
1987
|
-
var AlertDescription =
|
|
1954
|
+
var AlertDescription = React34.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx41(
|
|
1988
1955
|
"div",
|
|
1989
1956
|
{
|
|
1990
1957
|
ref,
|
|
@@ -1995,14 +1962,14 @@ var AlertDescription = React35.forwardRef(({ className, ...props }, ref) => /* @
|
|
|
1995
1962
|
AlertDescription.displayName = "AlertDescription";
|
|
1996
1963
|
|
|
1997
1964
|
// src/components/breadcrumb.tsx
|
|
1998
|
-
import * as
|
|
1965
|
+
import * as React35 from "react";
|
|
1999
1966
|
import { Slot } from "@radix-ui/react-slot";
|
|
2000
1967
|
import { ChevronRight as ChevronRight4, MoreHorizontal } from "lucide-react";
|
|
2001
|
-
import { jsx as
|
|
2002
|
-
var Breadcrumb =
|
|
1968
|
+
import { jsx as jsx42, jsxs as jsxs21 } from "react/jsx-runtime";
|
|
1969
|
+
var Breadcrumb = React35.forwardRef(({ ...props }, ref) => /* @__PURE__ */ jsx42("nav", { ref, "aria-label": "breadcrumb", ...props }));
|
|
2003
1970
|
Breadcrumb.displayName = "Breadcrumb";
|
|
2004
|
-
var BreadcrumbList =
|
|
2005
|
-
({ className, ...props }, ref) => /* @__PURE__ */
|
|
1971
|
+
var BreadcrumbList = React35.forwardRef(
|
|
1972
|
+
({ className, ...props }, ref) => /* @__PURE__ */ jsx42(
|
|
2006
1973
|
"ol",
|
|
2007
1974
|
{
|
|
2008
1975
|
ref,
|
|
@@ -2015,13 +1982,13 @@ var BreadcrumbList = React36.forwardRef(
|
|
|
2015
1982
|
)
|
|
2016
1983
|
);
|
|
2017
1984
|
BreadcrumbList.displayName = "BreadcrumbList";
|
|
2018
|
-
var BreadcrumbItem =
|
|
2019
|
-
({ className, ...props }, ref) => /* @__PURE__ */
|
|
1985
|
+
var BreadcrumbItem = React35.forwardRef(
|
|
1986
|
+
({ className, ...props }, ref) => /* @__PURE__ */ jsx42("li", { ref, className: cn("inline-flex items-center gap-1.5", className), ...props })
|
|
2020
1987
|
);
|
|
2021
1988
|
BreadcrumbItem.displayName = "BreadcrumbItem";
|
|
2022
|
-
var BreadcrumbLink =
|
|
1989
|
+
var BreadcrumbLink = React35.forwardRef(({ asChild, className, ...props }, ref) => {
|
|
2023
1990
|
const Comp = asChild ? Slot : "a";
|
|
2024
|
-
return /* @__PURE__ */
|
|
1991
|
+
return /* @__PURE__ */ jsx42(
|
|
2025
1992
|
Comp,
|
|
2026
1993
|
{
|
|
2027
1994
|
ref,
|
|
@@ -2031,8 +1998,8 @@ var BreadcrumbLink = React36.forwardRef(({ asChild, className, ...props }, ref)
|
|
|
2031
1998
|
);
|
|
2032
1999
|
});
|
|
2033
2000
|
BreadcrumbLink.displayName = "BreadcrumbLink";
|
|
2034
|
-
var BreadcrumbPage =
|
|
2035
|
-
({ className, ...props }, ref) => /* @__PURE__ */
|
|
2001
|
+
var BreadcrumbPage = React35.forwardRef(
|
|
2002
|
+
({ className, ...props }, ref) => /* @__PURE__ */ jsx42(
|
|
2036
2003
|
"span",
|
|
2037
2004
|
{
|
|
2038
2005
|
ref,
|
|
@@ -2049,18 +2016,18 @@ var BreadcrumbSeparator = ({
|
|
|
2049
2016
|
children,
|
|
2050
2017
|
className,
|
|
2051
2018
|
...props
|
|
2052
|
-
}) => /* @__PURE__ */
|
|
2019
|
+
}) => /* @__PURE__ */ jsx42(
|
|
2053
2020
|
"li",
|
|
2054
2021
|
{
|
|
2055
2022
|
role: "presentation",
|
|
2056
2023
|
"aria-hidden": "true",
|
|
2057
2024
|
className: cn("[&>svg]:h-4 [&>svg]:w-4", className),
|
|
2058
2025
|
...props,
|
|
2059
|
-
children: children ?? /* @__PURE__ */
|
|
2026
|
+
children: children ?? /* @__PURE__ */ jsx42(ChevronRight4, {})
|
|
2060
2027
|
}
|
|
2061
2028
|
);
|
|
2062
2029
|
BreadcrumbSeparator.displayName = "BreadcrumbSeparator";
|
|
2063
|
-
var BreadcrumbEllipsis = ({ className, ...props }) => /* @__PURE__ */
|
|
2030
|
+
var BreadcrumbEllipsis = ({ className, ...props }) => /* @__PURE__ */ jsxs21(
|
|
2064
2031
|
"span",
|
|
2065
2032
|
{
|
|
2066
2033
|
role: "presentation",
|
|
@@ -2068,18 +2035,18 @@ var BreadcrumbEllipsis = ({ className, ...props }) => /* @__PURE__ */ jsxs22(
|
|
|
2068
2035
|
className: cn("flex h-9 w-9 items-center justify-center", className),
|
|
2069
2036
|
...props,
|
|
2070
2037
|
children: [
|
|
2071
|
-
/* @__PURE__ */
|
|
2072
|
-
/* @__PURE__ */
|
|
2038
|
+
/* @__PURE__ */ jsx42(MoreHorizontal, { className: "h-4 w-4" }),
|
|
2039
|
+
/* @__PURE__ */ jsx42("span", { className: "sr-only", children: "More" })
|
|
2073
2040
|
]
|
|
2074
2041
|
}
|
|
2075
2042
|
);
|
|
2076
2043
|
BreadcrumbEllipsis.displayName = "BreadcrumbEllipsis";
|
|
2077
2044
|
|
|
2078
2045
|
// src/components/pagination.tsx
|
|
2079
|
-
import * as
|
|
2046
|
+
import * as React36 from "react";
|
|
2080
2047
|
import { ChevronLeft, ChevronRight as ChevronRight5, MoreHorizontal as MoreHorizontal2 } from "lucide-react";
|
|
2081
|
-
import { jsx as
|
|
2082
|
-
var Pagination = ({ className, ...props }) => /* @__PURE__ */
|
|
2048
|
+
import { jsx as jsx43, jsxs as jsxs22 } from "react/jsx-runtime";
|
|
2049
|
+
var Pagination = ({ className, ...props }) => /* @__PURE__ */ jsx43(
|
|
2083
2050
|
"nav",
|
|
2084
2051
|
{
|
|
2085
2052
|
role: "navigation",
|
|
@@ -2089,15 +2056,15 @@ var Pagination = ({ className, ...props }) => /* @__PURE__ */ jsx44(
|
|
|
2089
2056
|
}
|
|
2090
2057
|
);
|
|
2091
2058
|
Pagination.displayName = "Pagination";
|
|
2092
|
-
var PaginationContent =
|
|
2093
|
-
({ className, ...props }, ref) => /* @__PURE__ */
|
|
2059
|
+
var PaginationContent = React36.forwardRef(
|
|
2060
|
+
({ className, ...props }, ref) => /* @__PURE__ */ jsx43("ul", { ref, className: cn("flex flex-row items-center gap-1", className), ...props })
|
|
2094
2061
|
);
|
|
2095
2062
|
PaginationContent.displayName = "PaginationContent";
|
|
2096
|
-
var PaginationItem =
|
|
2097
|
-
({ className, ...props }, ref) => /* @__PURE__ */
|
|
2063
|
+
var PaginationItem = React36.forwardRef(
|
|
2064
|
+
({ className, ...props }, ref) => /* @__PURE__ */ jsx43("li", { ref, className: cn("", className), ...props })
|
|
2098
2065
|
);
|
|
2099
2066
|
PaginationItem.displayName = "PaginationItem";
|
|
2100
|
-
var PaginationLink = ({ className, isActive, size = "icon", ...props }) => /* @__PURE__ */
|
|
2067
|
+
var PaginationLink = ({ className, isActive, size = "icon", ...props }) => /* @__PURE__ */ jsx43(
|
|
2101
2068
|
"a",
|
|
2102
2069
|
{
|
|
2103
2070
|
"aria-current": isActive ? "page" : void 0,
|
|
@@ -2109,7 +2076,7 @@ var PaginationLink = ({ className, isActive, size = "icon", ...props }) => /* @_
|
|
|
2109
2076
|
}
|
|
2110
2077
|
);
|
|
2111
2078
|
PaginationLink.displayName = "PaginationLink";
|
|
2112
|
-
var PaginationPrevious = ({ className, ...props }) => /* @__PURE__ */
|
|
2079
|
+
var PaginationPrevious = ({ className, ...props }) => /* @__PURE__ */ jsxs22(
|
|
2113
2080
|
PaginationLink,
|
|
2114
2081
|
{
|
|
2115
2082
|
"aria-label": "Go to previous page",
|
|
@@ -2117,13 +2084,13 @@ var PaginationPrevious = ({ className, ...props }) => /* @__PURE__ */ jsxs23(
|
|
|
2117
2084
|
className: cn("gap-1 pl-2.5", className),
|
|
2118
2085
|
...props,
|
|
2119
2086
|
children: [
|
|
2120
|
-
/* @__PURE__ */
|
|
2121
|
-
/* @__PURE__ */
|
|
2087
|
+
/* @__PURE__ */ jsx43(ChevronLeft, { className: "h-4 w-4" }),
|
|
2088
|
+
/* @__PURE__ */ jsx43("span", { children: "Previous" })
|
|
2122
2089
|
]
|
|
2123
2090
|
}
|
|
2124
2091
|
);
|
|
2125
2092
|
PaginationPrevious.displayName = "PaginationPrevious";
|
|
2126
|
-
var PaginationNext = ({ className, ...props }) => /* @__PURE__ */
|
|
2093
|
+
var PaginationNext = ({ className, ...props }) => /* @__PURE__ */ jsxs22(
|
|
2127
2094
|
PaginationLink,
|
|
2128
2095
|
{
|
|
2129
2096
|
"aria-label": "Go to next page",
|
|
@@ -2131,32 +2098,32 @@ var PaginationNext = ({ className, ...props }) => /* @__PURE__ */ jsxs23(
|
|
|
2131
2098
|
className: cn("gap-1 pr-2.5", className),
|
|
2132
2099
|
...props,
|
|
2133
2100
|
children: [
|
|
2134
|
-
/* @__PURE__ */
|
|
2135
|
-
/* @__PURE__ */
|
|
2101
|
+
/* @__PURE__ */ jsx43("span", { children: "Next" }),
|
|
2102
|
+
/* @__PURE__ */ jsx43(ChevronRight5, { className: "h-4 w-4" })
|
|
2136
2103
|
]
|
|
2137
2104
|
}
|
|
2138
2105
|
);
|
|
2139
2106
|
PaginationNext.displayName = "PaginationNext";
|
|
2140
|
-
var PaginationEllipsis = ({ className, ...props }) => /* @__PURE__ */
|
|
2107
|
+
var PaginationEllipsis = ({ className, ...props }) => /* @__PURE__ */ jsxs22(
|
|
2141
2108
|
"span",
|
|
2142
2109
|
{
|
|
2143
2110
|
"aria-hidden": true,
|
|
2144
2111
|
className: cn("flex h-9 w-9 items-center justify-center", className),
|
|
2145
2112
|
...props,
|
|
2146
2113
|
children: [
|
|
2147
|
-
/* @__PURE__ */
|
|
2148
|
-
/* @__PURE__ */
|
|
2114
|
+
/* @__PURE__ */ jsx43(MoreHorizontal2, { className: "h-4 w-4" }),
|
|
2115
|
+
/* @__PURE__ */ jsx43("span", { className: "sr-only", children: "More pages" })
|
|
2149
2116
|
]
|
|
2150
2117
|
}
|
|
2151
2118
|
);
|
|
2152
2119
|
PaginationEllipsis.displayName = "PaginationEllipsis";
|
|
2153
2120
|
|
|
2154
2121
|
// src/components/command.tsx
|
|
2155
|
-
import * as
|
|
2122
|
+
import * as React37 from "react";
|
|
2156
2123
|
import { Command as CommandPrimitive, useCommandState } from "cmdk";
|
|
2157
2124
|
import { Search } from "lucide-react";
|
|
2158
|
-
import { Fragment as Fragment2, jsx as
|
|
2159
|
-
var Command =
|
|
2125
|
+
import { Fragment as Fragment2, jsx as jsx44, jsxs as jsxs23 } from "react/jsx-runtime";
|
|
2126
|
+
var Command = React37.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx44(
|
|
2160
2127
|
CommandPrimitive,
|
|
2161
2128
|
{
|
|
2162
2129
|
ref,
|
|
@@ -2168,28 +2135,28 @@ var Command = React38.forwardRef(({ className, ...props }, ref) => /* @__PURE__
|
|
|
2168
2135
|
}
|
|
2169
2136
|
));
|
|
2170
2137
|
Command.displayName = CommandPrimitive.displayName;
|
|
2171
|
-
var KeyCap = ({ children }) => /* @__PURE__ */
|
|
2172
|
-
var CommandKeyHints = () => /* @__PURE__ */
|
|
2173
|
-
/* @__PURE__ */
|
|
2138
|
+
var KeyCap = ({ children }) => /* @__PURE__ */ jsx44("kbd", { className: "inline-flex h-5 min-w-5 items-center justify-center rounded-sm border border-border-default bg-bg-elevated px-1 font-sans text-xs text-text-secondary", children });
|
|
2139
|
+
var CommandKeyHints = () => /* @__PURE__ */ jsx44("div", { className: "flex items-center gap-4 border-t border-border-subtle bg-bg-sunken px-3 py-2 text-xs text-text-tertiary", children: [[["\u2191", "\u2193"], "to navigate"], [["\u21B5"], "to select"]].map(([keys, verb]) => /* @__PURE__ */ jsxs23("span", { className: "flex items-center gap-1.5", children: [
|
|
2140
|
+
/* @__PURE__ */ jsx44("span", { className: "flex items-center gap-1", children: keys.map((key) => /* @__PURE__ */ jsx44(KeyCap, { children: key }, key)) }),
|
|
2174
2141
|
" ",
|
|
2175
2142
|
verb
|
|
2176
2143
|
] }, verb)) });
|
|
2177
2144
|
var CommandKeyHintsSlot = ({ children }) => {
|
|
2178
2145
|
const count = useCommandState((state) => state.filtered.count);
|
|
2179
|
-
return count > 0 ? /* @__PURE__ */
|
|
2146
|
+
return count > 0 ? /* @__PURE__ */ jsx44(Fragment2, { children }) : null;
|
|
2180
2147
|
};
|
|
2181
2148
|
var CommandDialog = ({
|
|
2182
2149
|
children,
|
|
2183
2150
|
groups,
|
|
2184
2151
|
placeholder,
|
|
2185
2152
|
empty,
|
|
2186
|
-
keyHints = /* @__PURE__ */
|
|
2153
|
+
keyHints = /* @__PURE__ */ jsx44(CommandKeyHints, {}),
|
|
2187
2154
|
shortcut = false,
|
|
2188
2155
|
open,
|
|
2189
2156
|
onOpenChange,
|
|
2190
2157
|
...props
|
|
2191
2158
|
}) => {
|
|
2192
|
-
|
|
2159
|
+
React37.useEffect(() => {
|
|
2193
2160
|
if (!shortcut || !onOpenChange) return;
|
|
2194
2161
|
const onKey = (e) => {
|
|
2195
2162
|
if (e.key === "k" && (e.metaKey || e.ctrlKey)) {
|
|
@@ -2200,11 +2167,11 @@ var CommandDialog = ({
|
|
|
2200
2167
|
document.addEventListener("keydown", onKey);
|
|
2201
2168
|
return () => document.removeEventListener("keydown", onKey);
|
|
2202
2169
|
}, [shortcut, open, onOpenChange]);
|
|
2203
|
-
return /* @__PURE__ */
|
|
2204
|
-
/* @__PURE__ */
|
|
2205
|
-
/* @__PURE__ */
|
|
2206
|
-
/* @__PURE__ */
|
|
2207
|
-
groups.map((group) => /* @__PURE__ */
|
|
2170
|
+
return /* @__PURE__ */ jsx44(Dialog, { open, onOpenChange, ...props, children: /* @__PURE__ */ jsx44(DialogContent, { className: "overflow-hidden p-0", children: /* @__PURE__ */ jsx44(Command, { className: "[&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group-heading]]:text-text-tertiary [&_[cmdk-group]]:px-2 [&_[cmdk-input-wrapper]_svg]:h-5 [&_[cmdk-input-wrapper]_svg]:w-5 [&_[cmdk-item]]:px-2 [&_[cmdk-item]]:py-3 [&_[cmdk-item]_svg]:h-5 [&_[cmdk-item]_svg]:w-5", children: groups ? /* @__PURE__ */ jsxs23(Fragment2, { children: [
|
|
2171
|
+
/* @__PURE__ */ jsx44(CommandInput, { placeholder }),
|
|
2172
|
+
/* @__PURE__ */ jsxs23(CommandList, { className: "max-h-[420px]", children: [
|
|
2173
|
+
/* @__PURE__ */ jsx44(CommandEmpty, { children: empty }),
|
|
2174
|
+
groups.map((group) => /* @__PURE__ */ jsx44(CommandGroup, { heading: group.heading, children: group.items.map((item) => /* @__PURE__ */ jsx44(
|
|
2208
2175
|
CommandItem,
|
|
2209
2176
|
{
|
|
2210
2177
|
value: item.value ?? [group.heading, item.sub, item.label].filter(Boolean).join(" "),
|
|
@@ -2217,12 +2184,12 @@ var CommandDialog = ({
|
|
|
2217
2184
|
item.id ?? `${group.heading}:${String(item.label)}`
|
|
2218
2185
|
)) }, group.heading))
|
|
2219
2186
|
] }),
|
|
2220
|
-
/* @__PURE__ */
|
|
2187
|
+
/* @__PURE__ */ jsx44(CommandKeyHintsSlot, { children: keyHints })
|
|
2221
2188
|
] }) : children }) }) });
|
|
2222
2189
|
};
|
|
2223
|
-
var CommandInput =
|
|
2224
|
-
/* @__PURE__ */
|
|
2225
|
-
/* @__PURE__ */
|
|
2190
|
+
var CommandInput = React37.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsxs23("div", { className: "flex items-center border-b border-border-subtle px-3", "cmdk-input-wrapper": "", children: [
|
|
2191
|
+
/* @__PURE__ */ jsx44(Search, { className: "mr-2 h-4 w-4 shrink-0 opacity-50" }),
|
|
2192
|
+
/* @__PURE__ */ jsx44(
|
|
2226
2193
|
CommandPrimitive.Input,
|
|
2227
2194
|
{
|
|
2228
2195
|
ref,
|
|
@@ -2235,7 +2202,7 @@ var CommandInput = React38.forwardRef(({ className, ...props }, ref) => /* @__PU
|
|
|
2235
2202
|
)
|
|
2236
2203
|
] }));
|
|
2237
2204
|
CommandInput.displayName = CommandPrimitive.Input.displayName;
|
|
2238
|
-
var CommandList =
|
|
2205
|
+
var CommandList = React37.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx44(
|
|
2239
2206
|
CommandPrimitive.List,
|
|
2240
2207
|
{
|
|
2241
2208
|
ref,
|
|
@@ -2244,7 +2211,7 @@ var CommandList = React38.forwardRef(({ className, ...props }, ref) => /* @__PUR
|
|
|
2244
2211
|
}
|
|
2245
2212
|
));
|
|
2246
2213
|
CommandList.displayName = CommandPrimitive.List.displayName;
|
|
2247
|
-
var CommandEmpty =
|
|
2214
|
+
var CommandEmpty = React37.forwardRef((props, ref) => /* @__PURE__ */ jsx44(
|
|
2248
2215
|
CommandPrimitive.Empty,
|
|
2249
2216
|
{
|
|
2250
2217
|
ref,
|
|
@@ -2253,7 +2220,7 @@ var CommandEmpty = React38.forwardRef((props, ref) => /* @__PURE__ */ jsx45(
|
|
|
2253
2220
|
}
|
|
2254
2221
|
));
|
|
2255
2222
|
CommandEmpty.displayName = CommandPrimitive.Empty.displayName;
|
|
2256
|
-
var CommandGroup =
|
|
2223
|
+
var CommandGroup = React37.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx44(
|
|
2257
2224
|
CommandPrimitive.Group,
|
|
2258
2225
|
{
|
|
2259
2226
|
ref,
|
|
@@ -2265,7 +2232,7 @@ var CommandGroup = React38.forwardRef(({ className, ...props }, ref) => /* @__PU
|
|
|
2265
2232
|
}
|
|
2266
2233
|
));
|
|
2267
2234
|
CommandGroup.displayName = CommandPrimitive.Group.displayName;
|
|
2268
|
-
var CommandSeparator =
|
|
2235
|
+
var CommandSeparator = React37.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx44(
|
|
2269
2236
|
CommandPrimitive.Separator,
|
|
2270
2237
|
{
|
|
2271
2238
|
ref,
|
|
@@ -2274,8 +2241,8 @@ var CommandSeparator = React38.forwardRef(({ className, ...props }, ref) => /* @
|
|
|
2274
2241
|
}
|
|
2275
2242
|
));
|
|
2276
2243
|
CommandSeparator.displayName = CommandPrimitive.Separator.displayName;
|
|
2277
|
-
var CommandItem =
|
|
2278
|
-
({ className, mark, sub, children, ...props }, ref) => /* @__PURE__ */
|
|
2244
|
+
var CommandItem = React37.forwardRef(
|
|
2245
|
+
({ className, mark, sub, children, ...props }, ref) => /* @__PURE__ */ jsxs23(
|
|
2279
2246
|
CommandPrimitive.Item,
|
|
2280
2247
|
{
|
|
2281
2248
|
ref,
|
|
@@ -2286,17 +2253,17 @@ var CommandItem = React38.forwardRef(
|
|
|
2286
2253
|
),
|
|
2287
2254
|
...props,
|
|
2288
2255
|
children: [
|
|
2289
|
-
mark ? /* @__PURE__ */
|
|
2290
|
-
sub ? /* @__PURE__ */
|
|
2291
|
-
/* @__PURE__ */
|
|
2292
|
-
/* @__PURE__ */
|
|
2256
|
+
mark ? /* @__PURE__ */ jsx44("span", { className: "shrink-0", children: mark }) : null,
|
|
2257
|
+
sub ? /* @__PURE__ */ jsxs23("span", { className: "flex min-w-0 flex-col", children: [
|
|
2258
|
+
/* @__PURE__ */ jsx44("span", { className: "truncate", children }),
|
|
2259
|
+
/* @__PURE__ */ jsx44("span", { className: "truncate text-xs text-text-tertiary", children: sub })
|
|
2293
2260
|
] }) : children
|
|
2294
2261
|
]
|
|
2295
2262
|
}
|
|
2296
2263
|
)
|
|
2297
2264
|
);
|
|
2298
2265
|
CommandItem.displayName = CommandPrimitive.Item.displayName;
|
|
2299
|
-
var CommandShortcut = ({ className, ...props }) => /* @__PURE__ */
|
|
2266
|
+
var CommandShortcut = ({ className, ...props }) => /* @__PURE__ */ jsx44(
|
|
2300
2267
|
"span",
|
|
2301
2268
|
{
|
|
2302
2269
|
className: cn("ml-auto text-xs tracking-widest text-text-tertiary", className),
|
|
@@ -2306,12 +2273,12 @@ var CommandShortcut = ({ className, ...props }) => /* @__PURE__ */ jsx45(
|
|
|
2306
2273
|
CommandShortcut.displayName = "CommandShortcut";
|
|
2307
2274
|
|
|
2308
2275
|
// src/components/navigation-menu.tsx
|
|
2309
|
-
import * as
|
|
2276
|
+
import * as React38 from "react";
|
|
2310
2277
|
import * as NavigationMenuPrimitive from "@radix-ui/react-navigation-menu";
|
|
2311
2278
|
import { cva as cva6 } from "class-variance-authority";
|
|
2312
2279
|
import { ChevronDown as ChevronDown4 } from "lucide-react";
|
|
2313
|
-
import { jsx as
|
|
2314
|
-
var NavigationMenu =
|
|
2280
|
+
import { jsx as jsx45, jsxs as jsxs24 } from "react/jsx-runtime";
|
|
2281
|
+
var NavigationMenu = React38.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ jsxs24(
|
|
2315
2282
|
NavigationMenuPrimitive.Root,
|
|
2316
2283
|
{
|
|
2317
2284
|
ref,
|
|
@@ -2319,12 +2286,12 @@ var NavigationMenu = React39.forwardRef(({ className, children, ...props }, ref)
|
|
|
2319
2286
|
...props,
|
|
2320
2287
|
children: [
|
|
2321
2288
|
children,
|
|
2322
|
-
/* @__PURE__ */
|
|
2289
|
+
/* @__PURE__ */ jsx45(NavigationMenuViewport, {})
|
|
2323
2290
|
]
|
|
2324
2291
|
}
|
|
2325
2292
|
));
|
|
2326
2293
|
NavigationMenu.displayName = NavigationMenuPrimitive.Root.displayName;
|
|
2327
|
-
var NavigationMenuList =
|
|
2294
|
+
var NavigationMenuList = React38.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx45(
|
|
2328
2295
|
NavigationMenuPrimitive.List,
|
|
2329
2296
|
{
|
|
2330
2297
|
ref,
|
|
@@ -2337,7 +2304,7 @@ var NavigationMenuItem = NavigationMenuPrimitive.Item;
|
|
|
2337
2304
|
var navigationMenuTriggerStyle = cva6(
|
|
2338
2305
|
"group inline-flex h-10 w-max cursor-pointer 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"
|
|
2339
2306
|
);
|
|
2340
|
-
var NavigationMenuTrigger =
|
|
2307
|
+
var NavigationMenuTrigger = React38.forwardRef(({ className, children, ...props }, ref) => /* @__PURE__ */ jsxs24(
|
|
2341
2308
|
NavigationMenuPrimitive.Trigger,
|
|
2342
2309
|
{
|
|
2343
2310
|
ref,
|
|
@@ -2346,7 +2313,7 @@ var NavigationMenuTrigger = React39.forwardRef(({ className, children, ...props
|
|
|
2346
2313
|
children: [
|
|
2347
2314
|
children,
|
|
2348
2315
|
" ",
|
|
2349
|
-
/* @__PURE__ */
|
|
2316
|
+
/* @__PURE__ */ jsx45(
|
|
2350
2317
|
ChevronDown4,
|
|
2351
2318
|
{
|
|
2352
2319
|
className: "relative top-[1px] ml-1 h-4 w-4 transition duration-200 group-data-[state=open]:rotate-180",
|
|
@@ -2357,7 +2324,7 @@ var NavigationMenuTrigger = React39.forwardRef(({ className, children, ...props
|
|
|
2357
2324
|
}
|
|
2358
2325
|
));
|
|
2359
2326
|
NavigationMenuTrigger.displayName = NavigationMenuPrimitive.Trigger.displayName;
|
|
2360
|
-
var NavigationMenuContent =
|
|
2327
|
+
var NavigationMenuContent = React38.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx45(
|
|
2361
2328
|
NavigationMenuPrimitive.Content,
|
|
2362
2329
|
{
|
|
2363
2330
|
ref,
|
|
@@ -2370,7 +2337,7 @@ var NavigationMenuContent = React39.forwardRef(({ className, ...props }, ref) =>
|
|
|
2370
2337
|
));
|
|
2371
2338
|
NavigationMenuContent.displayName = NavigationMenuPrimitive.Content.displayName;
|
|
2372
2339
|
var NavigationMenuLink = NavigationMenuPrimitive.Link;
|
|
2373
|
-
var NavigationMenuViewport =
|
|
2340
|
+
var NavigationMenuViewport = React38.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx45("div", { className: cn("absolute left-0 top-full flex justify-center"), children: /* @__PURE__ */ jsx45(
|
|
2374
2341
|
NavigationMenuPrimitive.Viewport,
|
|
2375
2342
|
{
|
|
2376
2343
|
ref,
|
|
@@ -2382,7 +2349,7 @@ var NavigationMenuViewport = React39.forwardRef(({ className, ...props }, ref) =
|
|
|
2382
2349
|
}
|
|
2383
2350
|
) }));
|
|
2384
2351
|
NavigationMenuViewport.displayName = NavigationMenuPrimitive.Viewport.displayName;
|
|
2385
|
-
var NavigationMenuIndicator =
|
|
2352
|
+
var NavigationMenuIndicator = React38.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx45(
|
|
2386
2353
|
NavigationMenuPrimitive.Indicator,
|
|
2387
2354
|
{
|
|
2388
2355
|
ref,
|
|
@@ -2391,7 +2358,7 @@ var NavigationMenuIndicator = React39.forwardRef(({ className, ...props }, ref)
|
|
|
2391
2358
|
className
|
|
2392
2359
|
),
|
|
2393
2360
|
...props,
|
|
2394
|
-
children: /* @__PURE__ */
|
|
2361
|
+
children: /* @__PURE__ */ jsx45("div", { className: "relative top-[60%] h-2 w-2 rotate-45 rounded-tl-sm bg-border-subtle shadow-md" })
|
|
2395
2362
|
}
|
|
2396
2363
|
));
|
|
2397
2364
|
NavigationMenuIndicator.displayName = NavigationMenuPrimitive.Indicator.displayName;
|
|
@@ -2454,10 +2421,10 @@ function useTheme() {
|
|
|
2454
2421
|
|
|
2455
2422
|
// src/components/sonner.tsx
|
|
2456
2423
|
import { Toaster as SonnerToaster, toast } from "sonner";
|
|
2457
|
-
import { jsx as
|
|
2424
|
+
import { jsx as jsx46 } from "react/jsx-runtime";
|
|
2458
2425
|
var Toaster = ({ ...props }) => {
|
|
2459
2426
|
const { resolvedTheme } = useTheme();
|
|
2460
|
-
return /* @__PURE__ */
|
|
2427
|
+
return /* @__PURE__ */ jsx46(
|
|
2461
2428
|
SonnerToaster,
|
|
2462
2429
|
{
|
|
2463
2430
|
theme: resolvedTheme,
|
|
@@ -2479,19 +2446,19 @@ var Toaster = ({ ...props }) => {
|
|
|
2479
2446
|
import { Sun, Moon } from "lucide-react";
|
|
2480
2447
|
|
|
2481
2448
|
// src/components/top-bar-utilities.tsx
|
|
2482
|
-
import * as
|
|
2483
|
-
import { jsx as
|
|
2449
|
+
import * as React39 from "react";
|
|
2450
|
+
import { jsx as jsx47, jsxs as jsxs25 } from "react/jsx-runtime";
|
|
2484
2451
|
var topBarMarkClass = "relative flex size-8 shrink-0 cursor-pointer items-center justify-center rounded-lg text-text-secondary transition-colors duration-fast hover:bg-[var(--hov-bg)] hover:text-text-primary focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-border-focus [&>svg]:size-[18px]";
|
|
2485
|
-
var TopBarUtilities =
|
|
2486
|
-
({ items, className, ...props }, ref) => /* @__PURE__ */
|
|
2487
|
-
/* @__PURE__ */
|
|
2488
|
-
/* @__PURE__ */
|
|
2452
|
+
var TopBarUtilities = React39.forwardRef(
|
|
2453
|
+
({ items, className, ...props }, ref) => /* @__PURE__ */ jsx47("div", { ref, className: cn("flex items-center gap-1", className), ...props, children: items.map(({ name, icon, onClick }) => /* @__PURE__ */ jsxs25(Tooltip, { children: [
|
|
2454
|
+
/* @__PURE__ */ jsx47(TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsx47("button", { type: "button", className: topBarMarkClass, "aria-label": name, onClick, children: icon }) }),
|
|
2455
|
+
/* @__PURE__ */ jsx47(TooltipContent, { children: name })
|
|
2489
2456
|
] }, name)) })
|
|
2490
2457
|
);
|
|
2491
2458
|
TopBarUtilities.displayName = "TopBarUtilities";
|
|
2492
2459
|
|
|
2493
2460
|
// src/components/theme-toggle.tsx
|
|
2494
|
-
import { jsx as
|
|
2461
|
+
import { jsx as jsx48 } from "react/jsx-runtime";
|
|
2495
2462
|
var icons = {
|
|
2496
2463
|
light: Sun,
|
|
2497
2464
|
dark: Moon
|
|
@@ -2501,7 +2468,7 @@ function ThemeToggle() {
|
|
|
2501
2468
|
const Icon = icons[resolvedTheme];
|
|
2502
2469
|
const next = resolvedTheme === "light" ? "dark" : "light";
|
|
2503
2470
|
const label = theme === "system" ? `Following your device (${resolvedTheme}). Switch to ${next}.` : `Switch to ${next} theme`;
|
|
2504
|
-
return /* @__PURE__ */
|
|
2471
|
+
return /* @__PURE__ */ jsx48(
|
|
2505
2472
|
"button",
|
|
2506
2473
|
{
|
|
2507
2474
|
type: "button",
|
|
@@ -2509,7 +2476,7 @@ function ThemeToggle() {
|
|
|
2509
2476
|
className: topBarMarkClass,
|
|
2510
2477
|
"aria-label": label,
|
|
2511
2478
|
title: label,
|
|
2512
|
-
children: /* @__PURE__ */
|
|
2479
|
+
children: /* @__PURE__ */ jsx48(Icon, {})
|
|
2513
2480
|
}
|
|
2514
2481
|
);
|
|
2515
2482
|
}
|
|
@@ -2517,9 +2484,9 @@ function ThemeToggle() {
|
|
|
2517
2484
|
// src/components/calendar.tsx
|
|
2518
2485
|
import { ChevronLeft as ChevronLeft2, ChevronRight as ChevronRight6 } from "lucide-react";
|
|
2519
2486
|
import { DayPicker } from "react-day-picker";
|
|
2520
|
-
import { jsx as
|
|
2487
|
+
import { jsx as jsx49 } from "react/jsx-runtime";
|
|
2521
2488
|
function Calendar({ className, classNames, showOutsideDays = true, ...props }) {
|
|
2522
|
-
return /* @__PURE__ */
|
|
2489
|
+
return /* @__PURE__ */ jsx49(
|
|
2523
2490
|
DayPicker,
|
|
2524
2491
|
{
|
|
2525
2492
|
showOutsideDays,
|
|
@@ -2577,7 +2544,7 @@ function Calendar({ className, classNames, showOutsideDays = true, ...props }) {
|
|
|
2577
2544
|
...classNames
|
|
2578
2545
|
},
|
|
2579
2546
|
components: {
|
|
2580
|
-
Chevron: ({ className: cls, orientation, ...rest }) => orientation === "left" ? /* @__PURE__ */
|
|
2547
|
+
Chevron: ({ className: cls, orientation, ...rest }) => orientation === "left" ? /* @__PURE__ */ jsx49(ChevronLeft2, { className: cn("size-4", cls), ...rest }) : /* @__PURE__ */ jsx49(ChevronRight6, { className: cn("size-4", cls), ...rest })
|
|
2581
2548
|
},
|
|
2582
2549
|
...props
|
|
2583
2550
|
}
|
|
@@ -2586,9 +2553,9 @@ function Calendar({ className, classNames, showOutsideDays = true, ...props }) {
|
|
|
2586
2553
|
Calendar.displayName = "Calendar";
|
|
2587
2554
|
|
|
2588
2555
|
// src/components/date-picker.tsx
|
|
2589
|
-
import * as
|
|
2556
|
+
import * as React40 from "react";
|
|
2590
2557
|
import { Calendar as CalendarIcon } from "lucide-react";
|
|
2591
|
-
import { jsx as
|
|
2558
|
+
import { jsx as jsx50, jsxs as jsxs26 } from "react/jsx-runtime";
|
|
2592
2559
|
var DEFAULT_FORMAT = {
|
|
2593
2560
|
year: "numeric",
|
|
2594
2561
|
month: "long",
|
|
@@ -2601,9 +2568,9 @@ function DatePicker({
|
|
|
2601
2568
|
disabled,
|
|
2602
2569
|
className
|
|
2603
2570
|
}) {
|
|
2604
|
-
const [open, setOpen] =
|
|
2605
|
-
return /* @__PURE__ */
|
|
2606
|
-
/* @__PURE__ */
|
|
2571
|
+
const [open, setOpen] = React40.useState(false);
|
|
2572
|
+
return /* @__PURE__ */ jsxs26(Popover, { open, onOpenChange: setOpen, children: [
|
|
2573
|
+
/* @__PURE__ */ jsx50(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsxs26(
|
|
2607
2574
|
Button,
|
|
2608
2575
|
{
|
|
2609
2576
|
type: "button",
|
|
@@ -2611,12 +2578,12 @@ function DatePicker({
|
|
|
2611
2578
|
disabled,
|
|
2612
2579
|
className: cn("w-[240px] justify-start gap-2 text-left font-regular", !value && "text-text-tertiary", className),
|
|
2613
2580
|
children: [
|
|
2614
|
-
/* @__PURE__ */
|
|
2581
|
+
/* @__PURE__ */ jsx50(CalendarIcon, { className: "size-4 shrink-0" }),
|
|
2615
2582
|
value ? value.toLocaleDateString(void 0, DEFAULT_FORMAT) : placeholder
|
|
2616
2583
|
]
|
|
2617
2584
|
}
|
|
2618
2585
|
) }),
|
|
2619
|
-
/* @__PURE__ */
|
|
2586
|
+
/* @__PURE__ */ jsx50(PopoverContent, { className: "w-auto p-0", align: "start", children: /* @__PURE__ */ jsx50(
|
|
2620
2587
|
Calendar,
|
|
2621
2588
|
{
|
|
2622
2589
|
mode: "single",
|
|
@@ -2633,20 +2600,20 @@ function DatePicker({
|
|
|
2633
2600
|
DatePicker.displayName = "DatePicker";
|
|
2634
2601
|
|
|
2635
2602
|
// src/components/add-picker.tsx
|
|
2636
|
-
import * as
|
|
2603
|
+
import * as React41 from "react";
|
|
2637
2604
|
import { Plus } from "lucide-react";
|
|
2638
|
-
import { jsx as
|
|
2639
|
-
var AddPicker =
|
|
2605
|
+
import { jsx as jsx51, jsxs as jsxs27 } from "react/jsx-runtime";
|
|
2606
|
+
var AddPicker = React41.forwardRef(
|
|
2640
2607
|
({ label, noun, items, exclude, onPick, className }, ref) => {
|
|
2641
|
-
const [open, setOpen] =
|
|
2642
|
-
const [q, setQ] =
|
|
2608
|
+
const [open, setOpen] = React41.useState(false);
|
|
2609
|
+
const [q, setQ] = React41.useState("");
|
|
2643
2610
|
const taken = exclude ?? [];
|
|
2644
2611
|
const needle = q.toLowerCase();
|
|
2645
2612
|
const matches = items.filter(
|
|
2646
2613
|
(item) => !taken.includes(item.id) && (item.name.toLowerCase().includes(needle) || !!item.sub?.toLowerCase().includes(needle))
|
|
2647
2614
|
);
|
|
2648
2615
|
const search = items.length > 1 ? `Search ${items.length} ${noun}` : `Search ${noun}`;
|
|
2649
|
-
return /* @__PURE__ */
|
|
2616
|
+
return /* @__PURE__ */ jsxs27(
|
|
2650
2617
|
Popover,
|
|
2651
2618
|
{
|
|
2652
2619
|
open,
|
|
@@ -2655,15 +2622,15 @@ var AddPicker = React42.forwardRef(
|
|
|
2655
2622
|
if (!next) setQ("");
|
|
2656
2623
|
},
|
|
2657
2624
|
children: [
|
|
2658
|
-
/* @__PURE__ */
|
|
2659
|
-
/* @__PURE__ */
|
|
2625
|
+
/* @__PURE__ */ jsx51(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsxs27(Button, { ref, variant: "ghost", size: "xs", className: cn("shrink-0", className), children: [
|
|
2626
|
+
/* @__PURE__ */ jsx51(Plus, { className: "size-4", "aria-hidden": true }),
|
|
2660
2627
|
label
|
|
2661
2628
|
] }) }),
|
|
2662
|
-
/* @__PURE__ */
|
|
2663
|
-
/* @__PURE__ */
|
|
2664
|
-
/* @__PURE__ */
|
|
2665
|
-
/* @__PURE__ */
|
|
2666
|
-
matches.map((item) => /* @__PURE__ */
|
|
2629
|
+
/* @__PURE__ */ jsx51(PopoverContent, { align: "end", className: "w-72 p-0", children: /* @__PURE__ */ jsxs27(Command, { shouldFilter: false, label: search, children: [
|
|
2630
|
+
/* @__PURE__ */ jsx51(CommandInput, { autoFocus: true, value: q, onValueChange: setQ, placeholder: search }),
|
|
2631
|
+
/* @__PURE__ */ jsxs27(CommandList, { className: "max-h-[18rem] p-1", children: [
|
|
2632
|
+
/* @__PURE__ */ jsx51(CommandEmpty, { children: q ? `No ${noun} match.` : `No ${noun} left to add.` }),
|
|
2633
|
+
matches.map((item) => /* @__PURE__ */ jsx51(
|
|
2667
2634
|
CommandItem,
|
|
2668
2635
|
{
|
|
2669
2636
|
value: item.id,
|
|
@@ -2674,7 +2641,7 @@ var AddPicker = React42.forwardRef(
|
|
|
2674
2641
|
setOpen(false);
|
|
2675
2642
|
setQ("");
|
|
2676
2643
|
},
|
|
2677
|
-
children: /* @__PURE__ */
|
|
2644
|
+
children: /* @__PURE__ */ jsx51("span", { className: "truncate", children: item.name })
|
|
2678
2645
|
},
|
|
2679
2646
|
item.id
|
|
2680
2647
|
))
|
|
@@ -2688,31 +2655,31 @@ var AddPicker = React42.forwardRef(
|
|
|
2688
2655
|
AddPicker.displayName = "AddPicker";
|
|
2689
2656
|
|
|
2690
2657
|
// src/components/carousel.tsx
|
|
2691
|
-
import * as
|
|
2658
|
+
import * as React42 from "react";
|
|
2692
2659
|
import useEmblaCarousel from "embla-carousel-react";
|
|
2693
2660
|
import { ArrowLeft, ArrowRight } from "lucide-react";
|
|
2694
|
-
import { jsx as
|
|
2695
|
-
var CarouselContext =
|
|
2661
|
+
import { jsx as jsx52, jsxs as jsxs28 } from "react/jsx-runtime";
|
|
2662
|
+
var CarouselContext = React42.createContext(null);
|
|
2696
2663
|
function useCarousel() {
|
|
2697
|
-
const context =
|
|
2664
|
+
const context = React42.useContext(CarouselContext);
|
|
2698
2665
|
if (!context) throw new Error("useCarousel must be used within a <Carousel />");
|
|
2699
2666
|
return context;
|
|
2700
2667
|
}
|
|
2701
|
-
var Carousel =
|
|
2668
|
+
var Carousel = React42.forwardRef(({ orientation = "horizontal", opts, setApi, plugins, className, children, ...props }, ref) => {
|
|
2702
2669
|
const [carouselRef, api] = useEmblaCarousel(
|
|
2703
2670
|
{ ...opts, axis: orientation === "horizontal" ? "x" : "y" },
|
|
2704
2671
|
plugins
|
|
2705
2672
|
);
|
|
2706
|
-
const [canScrollPrev, setCanScrollPrev] =
|
|
2707
|
-
const [canScrollNext, setCanScrollNext] =
|
|
2708
|
-
const onSelect =
|
|
2673
|
+
const [canScrollPrev, setCanScrollPrev] = React42.useState(false);
|
|
2674
|
+
const [canScrollNext, setCanScrollNext] = React42.useState(false);
|
|
2675
|
+
const onSelect = React42.useCallback((emblaApi) => {
|
|
2709
2676
|
if (!emblaApi) return;
|
|
2710
2677
|
setCanScrollPrev(emblaApi.canScrollPrev());
|
|
2711
2678
|
setCanScrollNext(emblaApi.canScrollNext());
|
|
2712
2679
|
}, []);
|
|
2713
|
-
const scrollPrev =
|
|
2714
|
-
const scrollNext =
|
|
2715
|
-
const handleKeyDown =
|
|
2680
|
+
const scrollPrev = React42.useCallback(() => api?.scrollPrev(), [api]);
|
|
2681
|
+
const scrollNext = React42.useCallback(() => api?.scrollNext(), [api]);
|
|
2682
|
+
const handleKeyDown = React42.useCallback(
|
|
2716
2683
|
(event) => {
|
|
2717
2684
|
if (event.key === "ArrowLeft") {
|
|
2718
2685
|
event.preventDefault();
|
|
@@ -2724,11 +2691,11 @@ var Carousel = React43.forwardRef(({ orientation = "horizontal", opts, setApi, p
|
|
|
2724
2691
|
},
|
|
2725
2692
|
[scrollPrev, scrollNext]
|
|
2726
2693
|
);
|
|
2727
|
-
|
|
2694
|
+
React42.useEffect(() => {
|
|
2728
2695
|
if (!api || !setApi) return;
|
|
2729
2696
|
setApi(api);
|
|
2730
2697
|
}, [api, setApi]);
|
|
2731
|
-
|
|
2698
|
+
React42.useEffect(() => {
|
|
2732
2699
|
if (!api) return;
|
|
2733
2700
|
onSelect(api);
|
|
2734
2701
|
api.on("reInit", onSelect);
|
|
@@ -2738,7 +2705,7 @@ var Carousel = React43.forwardRef(({ orientation = "horizontal", opts, setApi, p
|
|
|
2738
2705
|
api.off("select", onSelect);
|
|
2739
2706
|
};
|
|
2740
2707
|
}, [api, onSelect]);
|
|
2741
|
-
return /* @__PURE__ */
|
|
2708
|
+
return /* @__PURE__ */ jsx52(
|
|
2742
2709
|
CarouselContext.Provider,
|
|
2743
2710
|
{
|
|
2744
2711
|
value: {
|
|
@@ -2751,7 +2718,7 @@ var Carousel = React43.forwardRef(({ orientation = "horizontal", opts, setApi, p
|
|
|
2751
2718
|
canScrollPrev,
|
|
2752
2719
|
canScrollNext
|
|
2753
2720
|
},
|
|
2754
|
-
children: /* @__PURE__ */
|
|
2721
|
+
children: /* @__PURE__ */ jsx52(
|
|
2755
2722
|
"div",
|
|
2756
2723
|
{
|
|
2757
2724
|
ref,
|
|
@@ -2767,10 +2734,10 @@ var Carousel = React43.forwardRef(({ orientation = "horizontal", opts, setApi, p
|
|
|
2767
2734
|
);
|
|
2768
2735
|
});
|
|
2769
2736
|
Carousel.displayName = "Carousel";
|
|
2770
|
-
var CarouselContent =
|
|
2737
|
+
var CarouselContent = React42.forwardRef(
|
|
2771
2738
|
({ className, ...props }, ref) => {
|
|
2772
2739
|
const { carouselRef, orientation } = useCarousel();
|
|
2773
|
-
return /* @__PURE__ */
|
|
2740
|
+
return /* @__PURE__ */ jsx52("div", { ref: carouselRef, className: "overflow-hidden", children: /* @__PURE__ */ jsx52(
|
|
2774
2741
|
"div",
|
|
2775
2742
|
{
|
|
2776
2743
|
ref,
|
|
@@ -2781,10 +2748,10 @@ var CarouselContent = React43.forwardRef(
|
|
|
2781
2748
|
}
|
|
2782
2749
|
);
|
|
2783
2750
|
CarouselContent.displayName = "CarouselContent";
|
|
2784
|
-
var CarouselItem =
|
|
2751
|
+
var CarouselItem = React42.forwardRef(
|
|
2785
2752
|
({ className, ...props }, ref) => {
|
|
2786
2753
|
const { orientation } = useCarousel();
|
|
2787
|
-
return /* @__PURE__ */
|
|
2754
|
+
return /* @__PURE__ */ jsx52(
|
|
2788
2755
|
"div",
|
|
2789
2756
|
{
|
|
2790
2757
|
ref,
|
|
@@ -2801,9 +2768,9 @@ var CarouselItem = React43.forwardRef(
|
|
|
2801
2768
|
}
|
|
2802
2769
|
);
|
|
2803
2770
|
CarouselItem.displayName = "CarouselItem";
|
|
2804
|
-
var CarouselPrevious =
|
|
2771
|
+
var CarouselPrevious = React42.forwardRef(({ className, ...props }, ref) => {
|
|
2805
2772
|
const { orientation, scrollPrev, canScrollPrev } = useCarousel();
|
|
2806
|
-
return /* @__PURE__ */
|
|
2773
|
+
return /* @__PURE__ */ jsxs28(
|
|
2807
2774
|
"button",
|
|
2808
2775
|
{
|
|
2809
2776
|
ref,
|
|
@@ -2818,16 +2785,16 @@ var CarouselPrevious = React43.forwardRef(({ className, ...props }, ref) => {
|
|
|
2818
2785
|
onClick: scrollPrev,
|
|
2819
2786
|
...props,
|
|
2820
2787
|
children: [
|
|
2821
|
-
/* @__PURE__ */
|
|
2822
|
-
/* @__PURE__ */
|
|
2788
|
+
/* @__PURE__ */ jsx52(ArrowLeft, { className: "size-4" }),
|
|
2789
|
+
/* @__PURE__ */ jsx52("span", { className: "sr-only", children: "Previous slide" })
|
|
2823
2790
|
]
|
|
2824
2791
|
}
|
|
2825
2792
|
);
|
|
2826
2793
|
});
|
|
2827
2794
|
CarouselPrevious.displayName = "CarouselPrevious";
|
|
2828
|
-
var CarouselNext =
|
|
2795
|
+
var CarouselNext = React42.forwardRef(({ className, ...props }, ref) => {
|
|
2829
2796
|
const { orientation, scrollNext, canScrollNext } = useCarousel();
|
|
2830
|
-
return /* @__PURE__ */
|
|
2797
|
+
return /* @__PURE__ */ jsxs28(
|
|
2831
2798
|
"button",
|
|
2832
2799
|
{
|
|
2833
2800
|
ref,
|
|
@@ -2842,8 +2809,8 @@ var CarouselNext = React43.forwardRef(({ className, ...props }, ref) => {
|
|
|
2842
2809
|
onClick: scrollNext,
|
|
2843
2810
|
...props,
|
|
2844
2811
|
children: [
|
|
2845
|
-
/* @__PURE__ */
|
|
2846
|
-
/* @__PURE__ */
|
|
2812
|
+
/* @__PURE__ */ jsx52(ArrowRight, { className: "size-4" }),
|
|
2813
|
+
/* @__PURE__ */ jsx52("span", { className: "sr-only", children: "Next slide" })
|
|
2847
2814
|
]
|
|
2848
2815
|
}
|
|
2849
2816
|
);
|
|
@@ -2851,7 +2818,7 @@ var CarouselNext = React43.forwardRef(({ className, ...props }, ref) => {
|
|
|
2851
2818
|
CarouselNext.displayName = "CarouselNext";
|
|
2852
2819
|
|
|
2853
2820
|
// src/components/form.tsx
|
|
2854
|
-
import * as
|
|
2821
|
+
import * as React43 from "react";
|
|
2855
2822
|
import { Slot as Slot2 } from "@radix-ui/react-slot";
|
|
2856
2823
|
import {
|
|
2857
2824
|
Controller,
|
|
@@ -2859,16 +2826,16 @@ import {
|
|
|
2859
2826
|
useFormContext,
|
|
2860
2827
|
useFormState
|
|
2861
2828
|
} from "react-hook-form";
|
|
2862
|
-
import { jsx as
|
|
2829
|
+
import { jsx as jsx53 } from "react/jsx-runtime";
|
|
2863
2830
|
var Form = FormProvider;
|
|
2864
|
-
var FormFieldContext =
|
|
2831
|
+
var FormFieldContext = React43.createContext(null);
|
|
2865
2832
|
function FormField({ ...props }) {
|
|
2866
|
-
return /* @__PURE__ */
|
|
2833
|
+
return /* @__PURE__ */ jsx53(FormFieldContext.Provider, { value: { name: props.name }, children: /* @__PURE__ */ jsx53(Controller, { ...props }) });
|
|
2867
2834
|
}
|
|
2868
|
-
var FormItemContext =
|
|
2835
|
+
var FormItemContext = React43.createContext(null);
|
|
2869
2836
|
function useFormField() {
|
|
2870
|
-
const fieldContext =
|
|
2871
|
-
const itemContext =
|
|
2837
|
+
const fieldContext = React43.useContext(FormFieldContext);
|
|
2838
|
+
const itemContext = React43.useContext(FormItemContext);
|
|
2872
2839
|
const { getFieldState } = useFormContext();
|
|
2873
2840
|
const formState = useFormState({ name: fieldContext?.name });
|
|
2874
2841
|
if (!fieldContext) throw new Error("useFormField should be used within <FormField>");
|
|
@@ -2883,16 +2850,16 @@ function useFormField() {
|
|
|
2883
2850
|
...fieldState
|
|
2884
2851
|
};
|
|
2885
2852
|
}
|
|
2886
|
-
var FormItem =
|
|
2853
|
+
var FormItem = React43.forwardRef(
|
|
2887
2854
|
({ className, ...props }, ref) => {
|
|
2888
|
-
const id =
|
|
2889
|
-
return /* @__PURE__ */
|
|
2855
|
+
const id = React43.useId();
|
|
2856
|
+
return /* @__PURE__ */ jsx53(FormItemContext.Provider, { value: { id }, children: /* @__PURE__ */ jsx53("div", { ref, className: cn("space-y-2", className), ...props }) });
|
|
2890
2857
|
}
|
|
2891
2858
|
);
|
|
2892
2859
|
FormItem.displayName = "FormItem";
|
|
2893
|
-
var FormLabel =
|
|
2860
|
+
var FormLabel = React43.forwardRef(({ className, ...props }, ref) => {
|
|
2894
2861
|
const { error, formItemId } = useFormField();
|
|
2895
|
-
return /* @__PURE__ */
|
|
2862
|
+
return /* @__PURE__ */ jsx53(
|
|
2896
2863
|
Label2,
|
|
2897
2864
|
{
|
|
2898
2865
|
ref,
|
|
@@ -2903,9 +2870,9 @@ var FormLabel = React44.forwardRef(({ className, ...props }, ref) => {
|
|
|
2903
2870
|
);
|
|
2904
2871
|
});
|
|
2905
2872
|
FormLabel.displayName = "FormLabel";
|
|
2906
|
-
var FormControl =
|
|
2873
|
+
var FormControl = React43.forwardRef(({ ...props }, ref) => {
|
|
2907
2874
|
const { error, formItemId, formDescriptionId, formMessageId } = useFormField();
|
|
2908
|
-
return /* @__PURE__ */
|
|
2875
|
+
return /* @__PURE__ */ jsx53(
|
|
2909
2876
|
Slot2,
|
|
2910
2877
|
{
|
|
2911
2878
|
ref,
|
|
@@ -2917,9 +2884,9 @@ var FormControl = React44.forwardRef(({ ...props }, ref) => {
|
|
|
2917
2884
|
);
|
|
2918
2885
|
});
|
|
2919
2886
|
FormControl.displayName = "FormControl";
|
|
2920
|
-
var FormDescription =
|
|
2887
|
+
var FormDescription = React43.forwardRef(({ className, ...props }, ref) => {
|
|
2921
2888
|
const { formDescriptionId } = useFormField();
|
|
2922
|
-
return /* @__PURE__ */
|
|
2889
|
+
return /* @__PURE__ */ jsx53(
|
|
2923
2890
|
"p",
|
|
2924
2891
|
{
|
|
2925
2892
|
ref,
|
|
@@ -2930,11 +2897,11 @@ var FormDescription = React44.forwardRef(({ className, ...props }, ref) => {
|
|
|
2930
2897
|
);
|
|
2931
2898
|
});
|
|
2932
2899
|
FormDescription.displayName = "FormDescription";
|
|
2933
|
-
var FormMessage =
|
|
2900
|
+
var FormMessage = React43.forwardRef(({ className, children, ...props }, ref) => {
|
|
2934
2901
|
const { error, formMessageId } = useFormField();
|
|
2935
2902
|
const body = error ? String(error?.message ?? "") : children;
|
|
2936
2903
|
if (!body) return null;
|
|
2937
|
-
return /* @__PURE__ */
|
|
2904
|
+
return /* @__PURE__ */ jsx53(
|
|
2938
2905
|
"p",
|
|
2939
2906
|
{
|
|
2940
2907
|
ref,
|
|
@@ -2948,9 +2915,9 @@ var FormMessage = React44.forwardRef(({ className, children, ...props }, ref) =>
|
|
|
2948
2915
|
FormMessage.displayName = "FormMessage";
|
|
2949
2916
|
|
|
2950
2917
|
// src/components/status-dot.tsx
|
|
2951
|
-
import * as
|
|
2918
|
+
import * as React44 from "react";
|
|
2952
2919
|
import { cva as cva7 } from "class-variance-authority";
|
|
2953
|
-
import { jsx as
|
|
2920
|
+
import { jsx as jsx54, jsxs as jsxs29 } from "react/jsx-runtime";
|
|
2954
2921
|
var statusDotVariants = cva7("inline-block shrink-0 rounded-full", {
|
|
2955
2922
|
variants: {
|
|
2956
2923
|
status: {
|
|
@@ -2964,8 +2931,8 @@ var statusDotVariants = cva7("inline-block shrink-0 rounded-full", {
|
|
|
2964
2931
|
},
|
|
2965
2932
|
defaultVariants: { status: "neutral", size: "md" }
|
|
2966
2933
|
});
|
|
2967
|
-
var StatusDot =
|
|
2968
|
-
({ className, status, size, pulse = false, label, ...props }, ref) => /* @__PURE__ */
|
|
2934
|
+
var StatusDot = React44.forwardRef(
|
|
2935
|
+
({ className, status, size, pulse = false, label, ...props }, ref) => /* @__PURE__ */ jsxs29(
|
|
2969
2936
|
"span",
|
|
2970
2937
|
{
|
|
2971
2938
|
ref,
|
|
@@ -2973,14 +2940,14 @@ var StatusDot = React45.forwardRef(
|
|
|
2973
2940
|
className: cn("relative inline-flex", className),
|
|
2974
2941
|
...props,
|
|
2975
2942
|
children: [
|
|
2976
|
-
pulse && /* @__PURE__ */
|
|
2943
|
+
pulse && /* @__PURE__ */ jsx54(
|
|
2977
2944
|
"span",
|
|
2978
2945
|
{
|
|
2979
2946
|
"aria-hidden": "true",
|
|
2980
2947
|
className: cn(statusDotVariants({ status, size }), "absolute inset-0 animate-ping opacity-75")
|
|
2981
2948
|
}
|
|
2982
2949
|
),
|
|
2983
|
-
/* @__PURE__ */
|
|
2950
|
+
/* @__PURE__ */ jsx54("span", { className: cn(statusDotVariants({ status, size })) })
|
|
2984
2951
|
]
|
|
2985
2952
|
}
|
|
2986
2953
|
)
|
|
@@ -2988,11 +2955,11 @@ var StatusDot = React45.forwardRef(
|
|
|
2988
2955
|
StatusDot.displayName = "StatusDot";
|
|
2989
2956
|
|
|
2990
2957
|
// src/components/docs-link.tsx
|
|
2991
|
-
import * as
|
|
2958
|
+
import * as React45 from "react";
|
|
2992
2959
|
import { BookOpen, ExternalLink } from "lucide-react";
|
|
2993
|
-
import { jsx as
|
|
2994
|
-
var DocsLink =
|
|
2995
|
-
({ href = "https://docs.lessly.com", label = "Docs", showLeadingIcon = true, className, ...props }, ref) => /* @__PURE__ */
|
|
2960
|
+
import { jsx as jsx55, jsxs as jsxs30 } from "react/jsx-runtime";
|
|
2961
|
+
var DocsLink = React45.forwardRef(
|
|
2962
|
+
({ href = "https://docs.lessly.com", label = "Docs", showLeadingIcon = true, className, ...props }, ref) => /* @__PURE__ */ jsxs30(
|
|
2996
2963
|
"a",
|
|
2997
2964
|
{
|
|
2998
2965
|
ref,
|
|
@@ -3005,9 +2972,9 @@ var DocsLink = React46.forwardRef(
|
|
|
3005
2972
|
),
|
|
3006
2973
|
...props,
|
|
3007
2974
|
children: [
|
|
3008
|
-
showLeadingIcon && /* @__PURE__ */
|
|
2975
|
+
showLeadingIcon && /* @__PURE__ */ jsx55(BookOpen, { className: "size-4", "aria-hidden": "true" }),
|
|
3009
2976
|
label,
|
|
3010
|
-
/* @__PURE__ */
|
|
2977
|
+
/* @__PURE__ */ jsx55(ExternalLink, { className: "size-3 text-text-tertiary", "aria-hidden": "true" })
|
|
3011
2978
|
]
|
|
3012
2979
|
}
|
|
3013
2980
|
)
|
|
@@ -3015,28 +2982,28 @@ var DocsLink = React46.forwardRef(
|
|
|
3015
2982
|
DocsLink.displayName = "DocsLink";
|
|
3016
2983
|
|
|
3017
2984
|
// src/components/empty-state.tsx
|
|
3018
|
-
import * as
|
|
3019
|
-
import { jsx as
|
|
3020
|
-
var EmptyState =
|
|
3021
|
-
({ icon: Icon, title, titleAs: TitleTag = "p", description, action, className, ...props }, ref) => /* @__PURE__ */
|
|
3022
|
-
Icon && /* @__PURE__ */
|
|
3023
|
-
/* @__PURE__ */
|
|
3024
|
-
description && /* @__PURE__ */
|
|
3025
|
-
action && /* @__PURE__ */
|
|
2985
|
+
import * as React46 from "react";
|
|
2986
|
+
import { jsx as jsx56, jsxs as jsxs31 } from "react/jsx-runtime";
|
|
2987
|
+
var EmptyState = React46.forwardRef(
|
|
2988
|
+
({ icon: Icon, title, titleAs: TitleTag = "p", description, action, className, ...props }, ref) => /* @__PURE__ */ jsxs31("div", { ref, className: cn("flex flex-col items-center px-4 py-10 text-center", className), ...props, children: [
|
|
2989
|
+
Icon && /* @__PURE__ */ jsx56(Icon, { className: "mb-3 size-6 text-text-tertiary", "aria-hidden": "true" }),
|
|
2990
|
+
/* @__PURE__ */ jsx56(TitleTag, { className: "text-sm text-text-secondary", children: title }),
|
|
2991
|
+
description && /* @__PURE__ */ jsx56("p", { className: "mt-1 max-w-sm text-sm text-text-tertiary", children: description }),
|
|
2992
|
+
action && /* @__PURE__ */ jsx56("div", { className: "mt-3", children: action })
|
|
3026
2993
|
] })
|
|
3027
2994
|
);
|
|
3028
2995
|
EmptyState.displayName = "EmptyState";
|
|
3029
2996
|
|
|
3030
2997
|
// src/components/copy-button.tsx
|
|
3031
|
-
import * as
|
|
2998
|
+
import * as React47 from "react";
|
|
3032
2999
|
import { Check as Check7, Copy } from "lucide-react";
|
|
3033
|
-
import { jsx as
|
|
3000
|
+
import { jsx as jsx57, jsxs as jsxs32 } from "react/jsx-runtime";
|
|
3034
3001
|
var MASK = "\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022";
|
|
3035
|
-
var CopyButton =
|
|
3002
|
+
var CopyButton = React47.forwardRef(
|
|
3036
3003
|
({ value, label = "Copy", masked = false, className, variant = "ghost", size = "icon", onClick, ...props }, ref) => {
|
|
3037
|
-
const [copied, setCopied] =
|
|
3038
|
-
const timer =
|
|
3039
|
-
|
|
3004
|
+
const [copied, setCopied] = React47.useState(false);
|
|
3005
|
+
const timer = React47.useRef(void 0);
|
|
3006
|
+
React47.useEffect(() => () => clearTimeout(timer.current), []);
|
|
3040
3007
|
const handleClick = async (e) => {
|
|
3041
3008
|
onClick?.(e);
|
|
3042
3009
|
if (!navigator.clipboard?.writeText) return;
|
|
@@ -3054,7 +3021,7 @@ var CopyButton = React48.forwardRef(
|
|
|
3054
3021
|
// itself at the height `size` already declares instead of taking a label's padding. At the
|
|
3055
3022
|
// default `size="icon"` that is the same 40px square it always was; at `xs`/`sm` it is now
|
|
3056
3023
|
// square rather than a wide pill (#432).
|
|
3057
|
-
/* @__PURE__ */
|
|
3024
|
+
/* @__PURE__ */ jsx57(
|
|
3058
3025
|
Button,
|
|
3059
3026
|
{
|
|
3060
3027
|
ref,
|
|
@@ -3065,13 +3032,13 @@ var CopyButton = React48.forwardRef(
|
|
|
3065
3032
|
className: cn(className),
|
|
3066
3033
|
...props,
|
|
3067
3034
|
"aria-label": copied ? "Copied" : masked ? `${label} ending ${tail}` : label,
|
|
3068
|
-
icon: copied ? /* @__PURE__ */
|
|
3035
|
+
icon: copied ? /* @__PURE__ */ jsx57(Check7, { className: "text-text-success" }) : /* @__PURE__ */ jsx57(Copy, {})
|
|
3069
3036
|
}
|
|
3070
3037
|
)
|
|
3071
3038
|
);
|
|
3072
3039
|
if (!masked) return button;
|
|
3073
|
-
return /* @__PURE__ */
|
|
3074
|
-
/* @__PURE__ */
|
|
3040
|
+
return /* @__PURE__ */ jsxs32("span", { className: "inline-flex items-center gap-1.5", children: [
|
|
3041
|
+
/* @__PURE__ */ jsx57("code", { "aria-hidden": true, className: "font-mono text-xs text-text-tertiary", children: `${MASK}${tail}` }),
|
|
3075
3042
|
button
|
|
3076
3043
|
] });
|
|
3077
3044
|
}
|
|
@@ -3079,9 +3046,9 @@ var CopyButton = React48.forwardRef(
|
|
|
3079
3046
|
CopyButton.displayName = "CopyButton";
|
|
3080
3047
|
|
|
3081
3048
|
// src/components/stat-card.tsx
|
|
3082
|
-
import * as
|
|
3049
|
+
import * as React48 from "react";
|
|
3083
3050
|
import { ArrowDown, ArrowUp, Info as Info2, Minus as Minus2 } from "lucide-react";
|
|
3084
|
-
import { jsx as
|
|
3051
|
+
import { jsx as jsx58, jsxs as jsxs33 } from "react/jsx-runtime";
|
|
3085
3052
|
var directionIcons = {
|
|
3086
3053
|
up: ArrowUp,
|
|
3087
3054
|
down: ArrowDown,
|
|
@@ -3097,13 +3064,13 @@ var toneFromDirection = {
|
|
|
3097
3064
|
down: "negative",
|
|
3098
3065
|
neutral: "neutral"
|
|
3099
3066
|
};
|
|
3100
|
-
var StatCard =
|
|
3067
|
+
var StatCard = React48.forwardRef(
|
|
3101
3068
|
({ label, value, delta, hint, sub, icon: Icon, trend, className, ...props }, ref) => {
|
|
3102
3069
|
const direction = delta?.direction ?? "neutral";
|
|
3103
3070
|
const tone = delta?.tone ?? toneFromDirection[direction];
|
|
3104
3071
|
const DeltaIcon = directionIcons[direction];
|
|
3105
3072
|
const deltaClass = toneClasses[tone];
|
|
3106
|
-
return /* @__PURE__ */
|
|
3073
|
+
return /* @__PURE__ */ jsxs33(
|
|
3107
3074
|
"div",
|
|
3108
3075
|
{
|
|
3109
3076
|
ref,
|
|
@@ -3111,25 +3078,25 @@ var StatCard = React49.forwardRef(
|
|
|
3111
3078
|
className: cn("rounded-xl border border-border-subtle bg-bg-overlay p-5", className),
|
|
3112
3079
|
...props,
|
|
3113
3080
|
children: [
|
|
3114
|
-
/* @__PURE__ */
|
|
3115
|
-
/* @__PURE__ */
|
|
3116
|
-
/* @__PURE__ */
|
|
3117
|
-
hint && /* @__PURE__ */
|
|
3118
|
-
/* @__PURE__ */
|
|
3119
|
-
/* @__PURE__ */
|
|
3081
|
+
/* @__PURE__ */ jsxs33("div", { className: "flex items-center justify-between gap-2", children: [
|
|
3082
|
+
/* @__PURE__ */ jsxs33("div", { className: "flex items-center gap-1.5", children: [
|
|
3083
|
+
/* @__PURE__ */ jsx58("span", { className: "text-xs font-medium text-text-tertiary", children: label }),
|
|
3084
|
+
hint && /* @__PURE__ */ jsx58(TooltipProvider, { children: /* @__PURE__ */ jsxs33(Tooltip, { children: [
|
|
3085
|
+
/* @__PURE__ */ jsx58(TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsx58("button", { type: "button", "aria-label": "More info", className: "inline-flex cursor-pointer text-icon-secondary focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-border-focus rounded-sm", children: /* @__PURE__ */ jsx58(Info2, { className: "size-3.5", "aria-hidden": "true" }) }) }),
|
|
3086
|
+
/* @__PURE__ */ jsx58(TooltipContent, { children: hint })
|
|
3120
3087
|
] }) })
|
|
3121
3088
|
] }),
|
|
3122
|
-
Icon && /* @__PURE__ */
|
|
3089
|
+
Icon && /* @__PURE__ */ jsx58(Icon, { className: "size-4 text-icon-secondary", "aria-hidden": "true" })
|
|
3123
3090
|
] }),
|
|
3124
|
-
/* @__PURE__ */
|
|
3125
|
-
(delta || sub) && /* @__PURE__ */
|
|
3126
|
-
delta && /* @__PURE__ */
|
|
3127
|
-
/* @__PURE__ */
|
|
3091
|
+
/* @__PURE__ */ jsx58("div", { className: "mt-2 text-3xl font-semibold text-text-primary", children: value }),
|
|
3092
|
+
(delta || sub) && /* @__PURE__ */ jsxs33("div", { className: "mt-2 flex items-center gap-2 text-sm", children: [
|
|
3093
|
+
delta && /* @__PURE__ */ jsxs33("span", { className: cn("inline-flex items-center gap-0.5 font-medium", deltaClass), children: [
|
|
3094
|
+
/* @__PURE__ */ jsx58(DeltaIcon, { className: "size-3.5", "aria-hidden": "true" }),
|
|
3128
3095
|
delta.value
|
|
3129
3096
|
] }),
|
|
3130
|
-
sub && /* @__PURE__ */
|
|
3097
|
+
sub && /* @__PURE__ */ jsx58("span", { className: "text-text-tertiary", children: sub })
|
|
3131
3098
|
] }),
|
|
3132
|
-
trend !== void 0 && /* @__PURE__ */
|
|
3099
|
+
trend !== void 0 && /* @__PURE__ */ jsx58("div", { "data-slot": "stat-card-trend", className: "mt-3 min-h-10", children: trend })
|
|
3133
3100
|
]
|
|
3134
3101
|
}
|
|
3135
3102
|
);
|
|
@@ -3138,17 +3105,17 @@ var StatCard = React49.forwardRef(
|
|
|
3138
3105
|
StatCard.displayName = "StatCard";
|
|
3139
3106
|
|
|
3140
3107
|
// src/components/confirm-dialog.tsx
|
|
3141
|
-
import * as
|
|
3108
|
+
import * as React50 from "react";
|
|
3142
3109
|
import { Loader2 as Loader22 } from "lucide-react";
|
|
3143
3110
|
|
|
3144
3111
|
// src/components/step-up-challenge.tsx
|
|
3145
|
-
import * as
|
|
3112
|
+
import * as React49 from "react";
|
|
3146
3113
|
import { Fingerprint, Loader2 } from "lucide-react";
|
|
3147
|
-
import { jsx as
|
|
3114
|
+
import { jsx as jsx59, jsxs as jsxs34 } from "react/jsx-runtime";
|
|
3148
3115
|
var DEFAULT_METHODS = ["passkey", "code"];
|
|
3149
3116
|
var ATTEMPT_GAP_MS = 500;
|
|
3150
3117
|
var FACTOR_SWITCH = "w-fit cursor-pointer rounded-sm text-sm text-text-secondary underline-offset-2 hover:text-text-primary hover:underline focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-border-focus disabled:pointer-events-none disabled:opacity-50";
|
|
3151
|
-
var StepUpChallenge =
|
|
3118
|
+
var StepUpChallenge = React49.forwardRef((props, ref) => {
|
|
3152
3119
|
const {
|
|
3153
3120
|
methods,
|
|
3154
3121
|
defaultMethod,
|
|
@@ -3168,28 +3135,28 @@ var StepUpChallenge = React50.forwardRef((props, ref) => {
|
|
|
3168
3135
|
const offered = methods && methods.length > 0 ? methods : DEFAULT_METHODS;
|
|
3169
3136
|
const first = offered[0] ?? "passkey";
|
|
3170
3137
|
const initial = defaultMethod && offered.includes(defaultMethod) ? defaultMethod : first;
|
|
3171
|
-
const [method, setMethod] =
|
|
3172
|
-
const [code, setCode] =
|
|
3173
|
-
const [errorFactor, setErrorFactor] =
|
|
3174
|
-
const [attempted, setAttempted] =
|
|
3175
|
-
const fieldRef =
|
|
3176
|
-
const mounted =
|
|
3177
|
-
const pending =
|
|
3178
|
-
const attemptedAt =
|
|
3138
|
+
const [method, setMethod] = React49.useState(initial);
|
|
3139
|
+
const [code, setCode] = React49.useState("");
|
|
3140
|
+
const [errorFactor, setErrorFactor] = React49.useState(initial);
|
|
3141
|
+
const [attempted, setAttempted] = React49.useState(false);
|
|
3142
|
+
const fieldRef = React49.useRef(null);
|
|
3143
|
+
const mounted = React49.useRef(false);
|
|
3144
|
+
const pending = React49.useRef(false);
|
|
3145
|
+
const attemptedAt = React49.useRef(0);
|
|
3179
3146
|
const active = offered.includes(method) ? method : first;
|
|
3180
3147
|
const other = offered.find((m) => m !== active);
|
|
3181
3148
|
const showError = Boolean(error) && errorFactor === active;
|
|
3182
|
-
const reactId =
|
|
3149
|
+
const reactId = React49.useId();
|
|
3183
3150
|
const fieldId = `${reactId}-code`;
|
|
3184
3151
|
const errorId = `${reactId}-error`;
|
|
3185
|
-
|
|
3152
|
+
React49.useEffect(() => {
|
|
3186
3153
|
pending.current = false;
|
|
3187
3154
|
}, [verifying, error]);
|
|
3188
|
-
|
|
3155
|
+
React49.useEffect(() => {
|
|
3189
3156
|
if (!error) return;
|
|
3190
3157
|
fieldRef.current?.focus();
|
|
3191
3158
|
}, [error]);
|
|
3192
|
-
|
|
3159
|
+
React49.useEffect(() => {
|
|
3193
3160
|
if (!mounted.current) {
|
|
3194
3161
|
mounted.current = true;
|
|
3195
3162
|
return;
|
|
@@ -3224,7 +3191,7 @@ var StepUpChallenge = React50.forwardRef((props, ref) => {
|
|
|
3224
3191
|
const stopCodeBearingEvent = (event) => {
|
|
3225
3192
|
event.stopPropagation();
|
|
3226
3193
|
};
|
|
3227
|
-
return /* @__PURE__ */
|
|
3194
|
+
return /* @__PURE__ */ jsxs34(
|
|
3228
3195
|
"div",
|
|
3229
3196
|
{
|
|
3230
3197
|
...rest,
|
|
@@ -3232,15 +3199,15 @@ var StepUpChallenge = React50.forwardRef((props, ref) => {
|
|
|
3232
3199
|
"aria-busy": verifying || void 0,
|
|
3233
3200
|
className: cn("grid gap-4", className),
|
|
3234
3201
|
children: [
|
|
3235
|
-
active === "passkey" ? /* @__PURE__ */
|
|
3236
|
-
/* @__PURE__ */
|
|
3237
|
-
/* @__PURE__ */
|
|
3202
|
+
active === "passkey" ? /* @__PURE__ */ jsxs34("div", { className: "grid justify-items-start gap-2", children: [
|
|
3203
|
+
/* @__PURE__ */ jsx59(Fingerprint, { className: "size-5 text-text-secondary", "aria-hidden": "true" }),
|
|
3204
|
+
/* @__PURE__ */ jsx59("p", { className: "text-sm text-text-secondary", children: "Your device will ask for your fingerprint, face or PIN." }),
|
|
3238
3205
|
other === "code" && // Not a `Button` (Guidelines/When it isn't a Button): a `Button` here would read as a
|
|
3239
3206
|
// second action competing with the confirm below.
|
|
3240
|
-
/* @__PURE__ */
|
|
3241
|
-
] }) : /* @__PURE__ */
|
|
3242
|
-
/* @__PURE__ */
|
|
3243
|
-
/* @__PURE__ */
|
|
3207
|
+
/* @__PURE__ */ jsx59("button", { type: "button", className: FACTOR_SWITCH, disabled: verifying, onClick: () => switchTo("code"), children: `Use a ${codeLength}-digit code instead` })
|
|
3208
|
+
] }) : /* @__PURE__ */ jsxs34("div", { className: "grid justify-items-start gap-2", children: [
|
|
3209
|
+
/* @__PURE__ */ jsx59("label", { htmlFor: fieldId, className: "text-sm font-medium text-text-primary", children: `${codeLength}-digit code` }),
|
|
3210
|
+
/* @__PURE__ */ jsx59(
|
|
3244
3211
|
"div",
|
|
3245
3212
|
{
|
|
3246
3213
|
"data-sensitive": "one-time-code",
|
|
@@ -3253,7 +3220,7 @@ var StepUpChallenge = React50.forwardRef((props, ref) => {
|
|
|
3253
3220
|
onDrop: stopCodeBearingEvent,
|
|
3254
3221
|
onKeyDown: stopCodeBearingKey,
|
|
3255
3222
|
onKeyUp: stopCodeBearingKey,
|
|
3256
|
-
children: /* @__PURE__ */
|
|
3223
|
+
children: /* @__PURE__ */ jsx59(
|
|
3257
3224
|
InputOTP,
|
|
3258
3225
|
{
|
|
3259
3226
|
ref: fieldRef,
|
|
@@ -3274,18 +3241,18 @@ var StepUpChallenge = React50.forwardRef((props, ref) => {
|
|
|
3274
3241
|
event.preventDefault();
|
|
3275
3242
|
submit();
|
|
3276
3243
|
},
|
|
3277
|
-
children: /* @__PURE__ */
|
|
3244
|
+
children: /* @__PURE__ */ jsx59(InputOTPGroup, { children: Array.from({ length: codeLength }, (_, index) => /* @__PURE__ */ jsx59(InputOTPSlot, { index }, index)) })
|
|
3278
3245
|
}
|
|
3279
3246
|
)
|
|
3280
3247
|
}
|
|
3281
3248
|
),
|
|
3282
3249
|
other === "passkey" && // The mirror of the line in the passkey pane — see the note there.
|
|
3283
|
-
/* @__PURE__ */
|
|
3250
|
+
/* @__PURE__ */ jsx59("button", { type: "button", className: FACTOR_SWITCH, disabled: verifying, onClick: () => switchTo("passkey"), children: "Use a passkey instead" })
|
|
3284
3251
|
] }),
|
|
3285
|
-
showError && /* @__PURE__ */
|
|
3286
|
-
/* @__PURE__ */
|
|
3287
|
-
onBack && /* @__PURE__ */
|
|
3288
|
-
/* @__PURE__ */
|
|
3252
|
+
showError && /* @__PURE__ */ jsx59(InlineError, { id: errorId, children: error }),
|
|
3253
|
+
/* @__PURE__ */ jsxs34(DialogFooter, { children: [
|
|
3254
|
+
onBack && /* @__PURE__ */ jsx59(Button, { type: "button", variant: "outline", size: "sm", disabled: verifying, onClick: onBack, children: backLabel }),
|
|
3255
|
+
/* @__PURE__ */ jsx59(
|
|
3289
3256
|
Button,
|
|
3290
3257
|
{
|
|
3291
3258
|
type: "button",
|
|
@@ -3295,7 +3262,7 @@ var StepUpChallenge = React50.forwardRef((props, ref) => {
|
|
|
3295
3262
|
"aria-disabled": !canSubmit || void 0,
|
|
3296
3263
|
"aria-busy": verifying || void 0,
|
|
3297
3264
|
className: cn(!canSubmit && "opacity-50"),
|
|
3298
|
-
icon: verifying ? /* @__PURE__ */
|
|
3265
|
+
icon: verifying ? /* @__PURE__ */ jsx59(Loader2, { className: "animate-spin" }) : void 0,
|
|
3299
3266
|
onClick: submit,
|
|
3300
3267
|
children: confirmLabel
|
|
3301
3268
|
}
|
|
@@ -3308,9 +3275,9 @@ var StepUpChallenge = React50.forwardRef((props, ref) => {
|
|
|
3308
3275
|
StepUpChallenge.displayName = "StepUpChallenge";
|
|
3309
3276
|
|
|
3310
3277
|
// src/components/confirm-dialog.tsx
|
|
3311
|
-
import { jsx as
|
|
3312
|
-
var InlineError =
|
|
3313
|
-
({ children, className, ...props }, ref) => /* @__PURE__ */
|
|
3278
|
+
import { jsx as jsx60, jsxs as jsxs35 } from "react/jsx-runtime";
|
|
3279
|
+
var InlineError = React50.forwardRef(
|
|
3280
|
+
({ children, className, ...props }, ref) => /* @__PURE__ */ jsx60(
|
|
3314
3281
|
"div",
|
|
3315
3282
|
{
|
|
3316
3283
|
ref,
|
|
@@ -3340,14 +3307,14 @@ function ConfirmDialog({
|
|
|
3340
3307
|
onConfirm,
|
|
3341
3308
|
onError
|
|
3342
3309
|
}) {
|
|
3343
|
-
const [internalOpen, setInternalOpen] =
|
|
3310
|
+
const [internalOpen, setInternalOpen] = React50.useState(false);
|
|
3344
3311
|
const isControlled = open !== void 0;
|
|
3345
3312
|
const actualOpen = isControlled ? open : internalOpen;
|
|
3346
|
-
const [busy, setBusy] =
|
|
3347
|
-
const [error, setError] =
|
|
3348
|
-
const [typed, setTyped] =
|
|
3349
|
-
const [stepped, setStepped] =
|
|
3350
|
-
const phraseId = `${
|
|
3313
|
+
const [busy, setBusy] = React50.useState(false);
|
|
3314
|
+
const [error, setError] = React50.useState(null);
|
|
3315
|
+
const [typed, setTyped] = React50.useState("");
|
|
3316
|
+
const [stepped, setStepped] = React50.useState(false);
|
|
3317
|
+
const phraseId = `${React50.useId()}-phrase`;
|
|
3351
3318
|
const phraseMet = !confirmPhrase || typed.trim().toLowerCase() === confirmPhrase.trim().toLowerCase();
|
|
3352
3319
|
const challenging = Boolean(stepUp) && (!confirmPhrase || stepped);
|
|
3353
3320
|
const panelTitle = challenging ? stepUp?.title ?? title : title;
|
|
@@ -3357,7 +3324,7 @@ function ConfirmDialog({
|
|
|
3357
3324
|
setTyped("");
|
|
3358
3325
|
setStepped(false);
|
|
3359
3326
|
};
|
|
3360
|
-
|
|
3327
|
+
React50.useEffect(() => {
|
|
3361
3328
|
if (!actualOpen) reset();
|
|
3362
3329
|
}, [actualOpen]);
|
|
3363
3330
|
const setOpen = (next) => {
|
|
@@ -3377,22 +3344,22 @@ function ConfirmDialog({
|
|
|
3377
3344
|
setBusy(false);
|
|
3378
3345
|
}
|
|
3379
3346
|
};
|
|
3380
|
-
return /* @__PURE__ */
|
|
3347
|
+
return /* @__PURE__ */ jsxs35(Dialog, { open: actualOpen, onOpenChange: (next) => {
|
|
3381
3348
|
if (!busy) setOpen(next);
|
|
3382
3349
|
}, children: [
|
|
3383
|
-
trigger && /* @__PURE__ */
|
|
3384
|
-
/* @__PURE__ */
|
|
3385
|
-
/* @__PURE__ */
|
|
3386
|
-
/* @__PURE__ */
|
|
3387
|
-
panelDescription && /* @__PURE__ */
|
|
3350
|
+
trigger && /* @__PURE__ */ jsx60(DialogTrigger, { asChild: true, children: trigger }),
|
|
3351
|
+
/* @__PURE__ */ jsxs35(DialogContent, { children: [
|
|
3352
|
+
/* @__PURE__ */ jsxs35(DialogHeader, { children: [
|
|
3353
|
+
/* @__PURE__ */ jsx60(DialogTitle, { children: panelTitle }),
|
|
3354
|
+
panelDescription && /* @__PURE__ */ jsx60(DialogDescription, { children: panelDescription })
|
|
3388
3355
|
] }),
|
|
3389
|
-
confirmPhrase && !challenging && /* @__PURE__ */
|
|
3390
|
-
/* @__PURE__ */
|
|
3356
|
+
confirmPhrase && !challenging && /* @__PURE__ */ jsxs35("div", { className: "grid gap-1.5", children: [
|
|
3357
|
+
/* @__PURE__ */ jsxs35("label", { htmlFor: phraseId, className: "text-xs font-medium text-text-secondary", children: [
|
|
3391
3358
|
"Type ",
|
|
3392
|
-
/* @__PURE__ */
|
|
3359
|
+
/* @__PURE__ */ jsx60("span", { className: "font-mono text-text-primary", children: confirmPhrase }),
|
|
3393
3360
|
" to confirm"
|
|
3394
3361
|
] }),
|
|
3395
|
-
/* @__PURE__ */
|
|
3362
|
+
/* @__PURE__ */ jsx60(
|
|
3396
3363
|
Input,
|
|
3397
3364
|
{
|
|
3398
3365
|
id: phraseId,
|
|
@@ -3403,8 +3370,8 @@ function ConfirmDialog({
|
|
|
3403
3370
|
}
|
|
3404
3371
|
)
|
|
3405
3372
|
] }),
|
|
3406
|
-
error && !challenging && /* @__PURE__ */
|
|
3407
|
-
challenging ? /* @__PURE__ */
|
|
3373
|
+
error && !challenging && /* @__PURE__ */ jsx60(InlineError, { children: error }),
|
|
3374
|
+
challenging ? /* @__PURE__ */ jsx60(
|
|
3408
3375
|
StepUpChallenge,
|
|
3409
3376
|
{
|
|
3410
3377
|
methods: stepUp?.methods,
|
|
@@ -3423,16 +3390,16 @@ function ConfirmDialog({
|
|
|
3423
3390
|
onVerifyPasskey: () => void handleConfirm({ method: "passkey" }),
|
|
3424
3391
|
onVerifyCode: (code) => void handleConfirm({ method: "code", code })
|
|
3425
3392
|
}
|
|
3426
|
-
) : /* @__PURE__ */
|
|
3427
|
-
/* @__PURE__ */
|
|
3428
|
-
/* @__PURE__ */
|
|
3393
|
+
) : /* @__PURE__ */ jsxs35(DialogFooter, { children: [
|
|
3394
|
+
/* @__PURE__ */ jsx60(Button, { variant: "outline", disabled: busy, onClick: () => setOpen(false), children: cancelLabel }),
|
|
3395
|
+
/* @__PURE__ */ jsxs35(
|
|
3429
3396
|
Button,
|
|
3430
3397
|
{
|
|
3431
3398
|
variant: destructive ? "destructive-solid" : "default",
|
|
3432
3399
|
disabled: busy || !phraseMet,
|
|
3433
3400
|
onClick: () => stepUp ? setStepped(true) : void handleConfirm(),
|
|
3434
3401
|
children: [
|
|
3435
|
-
busy && /* @__PURE__ */
|
|
3402
|
+
busy && /* @__PURE__ */ jsx60(Loader22, { className: "size-4 animate-spin", "aria-hidden": "true" }),
|
|
3436
3403
|
confirmLabel
|
|
3437
3404
|
]
|
|
3438
3405
|
}
|
|
@@ -3443,18 +3410,18 @@ function ConfirmDialog({
|
|
|
3443
3410
|
}
|
|
3444
3411
|
|
|
3445
3412
|
// src/components/user-menu.tsx
|
|
3446
|
-
import * as
|
|
3413
|
+
import * as React51 from "react";
|
|
3447
3414
|
import { ChevronsUpDown } from "lucide-react";
|
|
3448
|
-
import { Fragment as Fragment3, jsx as
|
|
3415
|
+
import { Fragment as Fragment3, jsx as jsx61, jsxs as jsxs36 } from "react/jsx-runtime";
|
|
3449
3416
|
function UserMenu({ user, items, collapsed = false, tooltip = true, align = "start" }) {
|
|
3450
|
-
const openedByPointer =
|
|
3417
|
+
const openedByPointer = React51.useRef(false);
|
|
3451
3418
|
const secondLine = user.subtitle ?? user.email;
|
|
3452
|
-
const avatar = /* @__PURE__ */
|
|
3419
|
+
const avatar = /* @__PURE__ */ jsx61(PersonAvatar, { name: user.name, id: user.id, src: user.avatarUrl, size: "sm" });
|
|
3453
3420
|
const trigger = collapsed ? (
|
|
3454
3421
|
// The plate every other mark in a top bar gets, drawn outside the avatar instead of behind it:
|
|
3455
3422
|
// a round mark fills its own box, so a background under one is a background nobody sees, and
|
|
3456
3423
|
// this trigger rested with no hover at all beside four icon buttons that all had one.
|
|
3457
|
-
/* @__PURE__ */
|
|
3424
|
+
/* @__PURE__ */ jsx61(
|
|
3458
3425
|
"button",
|
|
3459
3426
|
{
|
|
3460
3427
|
type: "button",
|
|
@@ -3463,22 +3430,22 @@ function UserMenu({ user, items, collapsed = false, tooltip = true, align = "sta
|
|
|
3463
3430
|
children: avatar
|
|
3464
3431
|
}
|
|
3465
3432
|
)
|
|
3466
|
-
) : /* @__PURE__ */
|
|
3433
|
+
) : /* @__PURE__ */ jsxs36(
|
|
3467
3434
|
"button",
|
|
3468
3435
|
{
|
|
3469
3436
|
type: "button",
|
|
3470
3437
|
className: "flex w-full cursor-pointer 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",
|
|
3471
3438
|
children: [
|
|
3472
3439
|
avatar,
|
|
3473
|
-
/* @__PURE__ */
|
|
3474
|
-
/* @__PURE__ */
|
|
3475
|
-
secondLine && /* @__PURE__ */
|
|
3440
|
+
/* @__PURE__ */ jsxs36("span", { className: "flex min-w-0 flex-1 flex-col gap-0.5", children: [
|
|
3441
|
+
/* @__PURE__ */ jsx61("span", { className: "truncate text-sm leading-[normal] font-medium text-text-primary", children: user.name }),
|
|
3442
|
+
secondLine && /* @__PURE__ */ jsx61("span", { className: "truncate text-xs leading-[normal] text-text-tertiary", children: secondLine })
|
|
3476
3443
|
] }),
|
|
3477
|
-
/* @__PURE__ */
|
|
3444
|
+
/* @__PURE__ */ jsx61(ChevronsUpDown, { size: 14, "aria-hidden": "true", className: "shrink-0 text-text-tertiary" })
|
|
3478
3445
|
]
|
|
3479
3446
|
}
|
|
3480
3447
|
);
|
|
3481
|
-
const menuTrigger = /* @__PURE__ */
|
|
3448
|
+
const menuTrigger = /* @__PURE__ */ jsx61(
|
|
3482
3449
|
DropdownMenuTrigger,
|
|
3483
3450
|
{
|
|
3484
3451
|
asChild: true,
|
|
@@ -3491,12 +3458,12 @@ function UserMenu({ user, items, collapsed = false, tooltip = true, align = "sta
|
|
|
3491
3458
|
children: trigger
|
|
3492
3459
|
}
|
|
3493
3460
|
);
|
|
3494
|
-
const menu = /* @__PURE__ */
|
|
3495
|
-
collapsed && tooltip ? /* @__PURE__ */
|
|
3496
|
-
/* @__PURE__ */
|
|
3497
|
-
/* @__PURE__ */
|
|
3461
|
+
const menu = /* @__PURE__ */ jsxs36(DropdownMenu, { children: [
|
|
3462
|
+
collapsed && tooltip ? /* @__PURE__ */ jsx61(TooltipProvider, { children: /* @__PURE__ */ jsxs36(Tooltip, { children: [
|
|
3463
|
+
/* @__PURE__ */ jsx61(TooltipTrigger, { asChild: true, children: menuTrigger }),
|
|
3464
|
+
/* @__PURE__ */ jsx61(TooltipContent, { side: "right", children: user.name })
|
|
3498
3465
|
] }) }) : menuTrigger,
|
|
3499
|
-
/* @__PURE__ */
|
|
3466
|
+
/* @__PURE__ */ jsxs36(
|
|
3500
3467
|
DropdownMenuContent,
|
|
3501
3468
|
{
|
|
3502
3469
|
align,
|
|
@@ -3506,18 +3473,18 @@ function UserMenu({ user, items, collapsed = false, tooltip = true, align = "sta
|
|
|
3506
3473
|
},
|
|
3507
3474
|
className: "flex w-[var(--radix-dropdown-menu-trigger-width)] min-w-56 flex-col gap-px rounded-xl border-border-subtle bg-[var(--menu-bg)] p-1 shadow-(--menu-shadow)",
|
|
3508
3475
|
children: [
|
|
3509
|
-
/* @__PURE__ */
|
|
3510
|
-
/* @__PURE__ */
|
|
3511
|
-
collapsed && secondLine && /* @__PURE__ */
|
|
3476
|
+
/* @__PURE__ */ jsxs36(DropdownMenuLabel, { className: "px-2 pt-1.5 pb-1 text-xs font-medium text-text-tertiary", children: [
|
|
3477
|
+
/* @__PURE__ */ jsx61("span", { className: "block truncate text-sm font-medium text-text-primary", children: user.name }),
|
|
3478
|
+
collapsed && secondLine && /* @__PURE__ */ jsx61("span", { className: "block truncate text-xs font-regular text-text-tertiary", children: secondLine })
|
|
3512
3479
|
] }),
|
|
3513
|
-
/* @__PURE__ */
|
|
3480
|
+
/* @__PURE__ */ jsx61(DropdownMenuSeparator, { className: "mx-0 shrink-0" }),
|
|
3514
3481
|
items.map((item, i) => {
|
|
3515
3482
|
const Icon = item.icon;
|
|
3516
|
-
const content = /* @__PURE__ */
|
|
3517
|
-
Icon && /* @__PURE__ */
|
|
3483
|
+
const content = /* @__PURE__ */ jsxs36(Fragment3, { children: [
|
|
3484
|
+
Icon && /* @__PURE__ */ jsx61(Icon, { className: "size-4", "aria-hidden": "true" }),
|
|
3518
3485
|
item.label
|
|
3519
3486
|
] });
|
|
3520
|
-
return /* @__PURE__ */
|
|
3487
|
+
return /* @__PURE__ */ jsx61(
|
|
3521
3488
|
DropdownMenuItem,
|
|
3522
3489
|
{
|
|
3523
3490
|
onSelect: item.onSelect,
|
|
@@ -3526,7 +3493,7 @@ function UserMenu({ user, items, collapsed = false, tooltip = true, align = "sta
|
|
|
3526
3493
|
item.destructive && "text-text-danger focus:text-text-danger"
|
|
3527
3494
|
),
|
|
3528
3495
|
asChild: Boolean(item.href),
|
|
3529
|
-
children: item.href ? /* @__PURE__ */
|
|
3496
|
+
children: item.href ? /* @__PURE__ */ jsx61("a", { href: item.href, children: content }) : content
|
|
3530
3497
|
},
|
|
3531
3498
|
`${item.label}-${i}`
|
|
3532
3499
|
);
|
|
@@ -3539,10 +3506,10 @@ function UserMenu({ user, items, collapsed = false, tooltip = true, align = "sta
|
|
|
3539
3506
|
}
|
|
3540
3507
|
|
|
3541
3508
|
// src/components/extension-icon.tsx
|
|
3542
|
-
import * as
|
|
3509
|
+
import * as React52 from "react";
|
|
3543
3510
|
import * as LucideIcons from "lucide-react";
|
|
3544
3511
|
import { Puzzle } from "lucide-react";
|
|
3545
|
-
import { jsx as
|
|
3512
|
+
import { jsx as jsx62 } from "react/jsx-runtime";
|
|
3546
3513
|
var FORWARD_REF = /* @__PURE__ */ Symbol.for("react.forward_ref");
|
|
3547
3514
|
var catalog = LucideIcons;
|
|
3548
3515
|
function toPascalCase(name) {
|
|
@@ -3567,22 +3534,22 @@ function warnUnknownIconOnce(name) {
|
|
|
3567
3534
|
warnedUnknownIcons.add(name);
|
|
3568
3535
|
console.warn(`[@lessly/ui] ExtensionIcon: unknown icon "${name}" \u2014 falling back to Puzzle.`);
|
|
3569
3536
|
}
|
|
3570
|
-
var ExtensionIcon =
|
|
3537
|
+
var ExtensionIcon = React52.forwardRef(
|
|
3571
3538
|
({ name, ...props }, ref) => {
|
|
3572
3539
|
const Icon = resolveIcon(name);
|
|
3573
3540
|
if (!Icon) {
|
|
3574
3541
|
warnUnknownIconOnce(name);
|
|
3575
|
-
return /* @__PURE__ */
|
|
3542
|
+
return /* @__PURE__ */ jsx62(Puzzle, { ref, ...props, "data-icon-fallback": name });
|
|
3576
3543
|
}
|
|
3577
|
-
return /* @__PURE__ */
|
|
3544
|
+
return /* @__PURE__ */ jsx62(Icon, { ref, ...props });
|
|
3578
3545
|
}
|
|
3579
3546
|
);
|
|
3580
3547
|
ExtensionIcon.displayName = "ExtensionIcon";
|
|
3581
3548
|
|
|
3582
3549
|
// src/components/icon-hint.tsx
|
|
3583
|
-
import * as
|
|
3584
|
-
import { jsx as
|
|
3585
|
-
var IconHint =
|
|
3550
|
+
import * as React53 from "react";
|
|
3551
|
+
import { jsx as jsx63, jsxs as jsxs37 } from "react/jsx-runtime";
|
|
3552
|
+
var IconHint = React53.forwardRef(
|
|
3586
3553
|
({ children, label, side = "top", align = "center", className, ...props }, ref) => {
|
|
3587
3554
|
if (label.trim().length === 0) {
|
|
3588
3555
|
if (process.env.NODE_ENV !== "production") {
|
|
@@ -3590,7 +3557,7 @@ var IconHint = React54.forwardRef(
|
|
|
3590
3557
|
'[IconHint] `label` is blank: there is no name to expose and no sentence to show, and a focusable role="img" with no name is a WCAG 4.1.2 failure. Rendering the glyph as decorative instead \u2014 pass a sentence, or use DecorativeIcon if it needs none.'
|
|
3591
3558
|
);
|
|
3592
3559
|
}
|
|
3593
|
-
return /* @__PURE__ */
|
|
3560
|
+
return /* @__PURE__ */ jsx63(
|
|
3594
3561
|
"span",
|
|
3595
3562
|
{
|
|
3596
3563
|
ref,
|
|
@@ -3604,8 +3571,8 @@ var IconHint = React54.forwardRef(
|
|
|
3604
3571
|
}
|
|
3605
3572
|
);
|
|
3606
3573
|
}
|
|
3607
|
-
return /* @__PURE__ */
|
|
3608
|
-
/* @__PURE__ */
|
|
3574
|
+
return /* @__PURE__ */ jsxs37(Tooltip, { children: [
|
|
3575
|
+
/* @__PURE__ */ jsx63(TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsx63(
|
|
3609
3576
|
"span",
|
|
3610
3577
|
{
|
|
3611
3578
|
ref,
|
|
@@ -3622,16 +3589,16 @@ var IconHint = React54.forwardRef(
|
|
|
3622
3589
|
children
|
|
3623
3590
|
}
|
|
3624
3591
|
) }),
|
|
3625
|
-
/* @__PURE__ */
|
|
3592
|
+
/* @__PURE__ */ jsx63(TooltipContent, { side, align, "aria-hidden": true, children: label })
|
|
3626
3593
|
] });
|
|
3627
3594
|
}
|
|
3628
3595
|
);
|
|
3629
3596
|
IconHint.displayName = "IconHint";
|
|
3630
3597
|
|
|
3631
3598
|
// src/components/decorative-icon.tsx
|
|
3632
|
-
import * as
|
|
3633
|
-
import { jsx as
|
|
3634
|
-
var DecorativeIcon =
|
|
3599
|
+
import * as React54 from "react";
|
|
3600
|
+
import { jsx as jsx64, jsxs as jsxs38 } from "react/jsx-runtime";
|
|
3601
|
+
var DecorativeIcon = React54.forwardRef(
|
|
3635
3602
|
({ children, label, side = "top", align = "center", className, ...props }, ref) => {
|
|
3636
3603
|
if (label.trim().length === 0) {
|
|
3637
3604
|
if (process.env.NODE_ENV !== "production") {
|
|
@@ -3639,7 +3606,7 @@ var DecorativeIcon = React55.forwardRef(
|
|
|
3639
3606
|
"[DecorativeIcon] `label` is blank, so the tooltip would open on an empty bubble. Rendering the bare glyph instead \u2014 pass a sentence, or drop the wrapper if the glyph has nothing to add."
|
|
3640
3607
|
);
|
|
3641
3608
|
}
|
|
3642
|
-
return /* @__PURE__ */
|
|
3609
|
+
return /* @__PURE__ */ jsx64(
|
|
3643
3610
|
"span",
|
|
3644
3611
|
{
|
|
3645
3612
|
ref,
|
|
@@ -3653,8 +3620,8 @@ var DecorativeIcon = React55.forwardRef(
|
|
|
3653
3620
|
}
|
|
3654
3621
|
);
|
|
3655
3622
|
}
|
|
3656
|
-
return /* @__PURE__ */
|
|
3657
|
-
/* @__PURE__ */
|
|
3623
|
+
return /* @__PURE__ */ jsxs38(Tooltip, { children: [
|
|
3624
|
+
/* @__PURE__ */ jsx64(TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsx64(
|
|
3658
3625
|
"span",
|
|
3659
3626
|
{
|
|
3660
3627
|
ref,
|
|
@@ -3670,15 +3637,15 @@ var DecorativeIcon = React55.forwardRef(
|
|
|
3670
3637
|
children
|
|
3671
3638
|
}
|
|
3672
3639
|
) }),
|
|
3673
|
-
/* @__PURE__ */
|
|
3640
|
+
/* @__PURE__ */ jsx64(TooltipContent, { side, align, "aria-hidden": true, children: label })
|
|
3674
3641
|
] });
|
|
3675
3642
|
}
|
|
3676
3643
|
);
|
|
3677
3644
|
DecorativeIcon.displayName = "DecorativeIcon";
|
|
3678
3645
|
|
|
3679
3646
|
// src/components/image-cropper.tsx
|
|
3680
|
-
import * as
|
|
3681
|
-
import { Fragment as Fragment4, jsx as
|
|
3647
|
+
import * as React55 from "react";
|
|
3648
|
+
import { Fragment as Fragment4, jsx as jsx65, jsxs as jsxs39 } from "react/jsx-runtime";
|
|
3682
3649
|
var FALLBACK_STAGE_W = 360;
|
|
3683
3650
|
var FALLBACK_STAGE_H = 270;
|
|
3684
3651
|
var STEP = 8;
|
|
@@ -3711,7 +3678,7 @@ var MASK_CLASS = {
|
|
|
3711
3678
|
circle: "rounded-full"
|
|
3712
3679
|
};
|
|
3713
3680
|
var clampTo = (value, min, max) => Math.min(Math.max(value, min), max);
|
|
3714
|
-
var ImageCropper =
|
|
3681
|
+
var ImageCropper = React55.forwardRef(
|
|
3715
3682
|
({
|
|
3716
3683
|
src,
|
|
3717
3684
|
shape = "square",
|
|
@@ -3731,21 +3698,21 @@ var ImageCropper = React56.forwardRef(
|
|
|
3731
3698
|
className,
|
|
3732
3699
|
...props
|
|
3733
3700
|
}, ref) => {
|
|
3734
|
-
const [nat, setNat] =
|
|
3735
|
-
const [error, setError] =
|
|
3736
|
-
const [focused, setFocused] =
|
|
3737
|
-
const [stage, setStage] =
|
|
3738
|
-
const [crop, setCrop] =
|
|
3739
|
-
const imgRef =
|
|
3740
|
-
const stageRef =
|
|
3741
|
-
const framed =
|
|
3742
|
-
const inset =
|
|
3743
|
-
|
|
3701
|
+
const [nat, setNat] = React55.useState(null);
|
|
3702
|
+
const [error, setError] = React55.useState(null);
|
|
3703
|
+
const [focused, setFocused] = React55.useState(false);
|
|
3704
|
+
const [stage, setStage] = React55.useState({ w: FALLBACK_STAGE_W, h: FALLBACK_STAGE_H });
|
|
3705
|
+
const [crop, setCrop] = React55.useState({ x: 0, y: 0, size: 0 });
|
|
3706
|
+
const imgRef = React55.useRef(null);
|
|
3707
|
+
const stageRef = React55.useRef(null);
|
|
3708
|
+
const framed = React55.useRef(false);
|
|
3709
|
+
const inset = React55.useRef({ left: 0, top: 0 });
|
|
3710
|
+
React55.useEffect(() => {
|
|
3744
3711
|
framed.current = false;
|
|
3745
3712
|
setNat(null);
|
|
3746
3713
|
setError(null);
|
|
3747
3714
|
}, [src]);
|
|
3748
|
-
|
|
3715
|
+
React55.useLayoutEffect(() => {
|
|
3749
3716
|
const el = stageRef.current;
|
|
3750
3717
|
if (!el) return void 0;
|
|
3751
3718
|
const read = (entry) => {
|
|
@@ -3771,13 +3738,13 @@ var ImageCropper = React56.forwardRef(
|
|
|
3771
3738
|
const drawH = nat ? nat.h * fit : stage.h;
|
|
3772
3739
|
const padX = (stage.w - drawW) / 2;
|
|
3773
3740
|
const padY = (stage.h - drawH) / 2;
|
|
3774
|
-
|
|
3741
|
+
React55.useEffect(() => {
|
|
3775
3742
|
if (!nat || framed.current) return;
|
|
3776
3743
|
framed.current = true;
|
|
3777
3744
|
const size = Math.min(nat.w, nat.h);
|
|
3778
3745
|
setCrop({ x: (nat.w - size) / 2, y: (nat.h - size) / 2, size });
|
|
3779
3746
|
}, [nat]);
|
|
3780
|
-
const clampCrop =
|
|
3747
|
+
const clampCrop = React55.useCallback(
|
|
3781
3748
|
(x, y, size) => {
|
|
3782
3749
|
if (!nat) return { x, y, size };
|
|
3783
3750
|
const max = Math.min(nat.w, nat.h);
|
|
@@ -3787,8 +3754,8 @@ var ImageCropper = React56.forwardRef(
|
|
|
3787
3754
|
},
|
|
3788
3755
|
[nat, fit, minCropSize]
|
|
3789
3756
|
);
|
|
3790
|
-
const moving =
|
|
3791
|
-
const resizing =
|
|
3757
|
+
const moving = React55.useRef(null);
|
|
3758
|
+
const resizing = React55.useRef(null);
|
|
3792
3759
|
const onMoveDown = (e) => {
|
|
3793
3760
|
e.target.setPointerCapture(e.pointerId);
|
|
3794
3761
|
moving.current = { px: e.clientX, py: e.clientY, cx: crop.x, cy: crop.y };
|
|
@@ -3905,8 +3872,8 @@ var ImageCropper = React56.forwardRef(
|
|
|
3905
3872
|
const percent = nat ? Math.round(crop.size / Math.min(nat.w, nat.h) * 100) : 100;
|
|
3906
3873
|
const fromLeft = nat ? Math.round(crop.x / nat.w * 100) : 0;
|
|
3907
3874
|
const fromTop = nat ? Math.round(crop.y / nat.h * 100) : 0;
|
|
3908
|
-
return /* @__PURE__ */
|
|
3909
|
-
/* @__PURE__ */
|
|
3875
|
+
return /* @__PURE__ */ jsxs39("div", { ref, className: cn("flex flex-col gap-3", className), ...props, children: [
|
|
3876
|
+
/* @__PURE__ */ jsxs39(
|
|
3910
3877
|
"div",
|
|
3911
3878
|
{
|
|
3912
3879
|
ref: stageRef,
|
|
@@ -3915,7 +3882,7 @@ var ImageCropper = React56.forwardRef(
|
|
|
3915
3882
|
onPointerMove,
|
|
3916
3883
|
onPointerUp,
|
|
3917
3884
|
children: [
|
|
3918
|
-
/* @__PURE__ */
|
|
3885
|
+
/* @__PURE__ */ jsx65(
|
|
3919
3886
|
"img",
|
|
3920
3887
|
{
|
|
3921
3888
|
ref: imgRef,
|
|
@@ -3928,8 +3895,8 @@ var ImageCropper = React56.forwardRef(
|
|
|
3928
3895
|
className: "pointer-events-none absolute inset-0 size-full object-contain"
|
|
3929
3896
|
}
|
|
3930
3897
|
),
|
|
3931
|
-
!nat && !error && /* @__PURE__ */
|
|
3932
|
-
error === "load" && /* @__PURE__ */
|
|
3898
|
+
!nat && !error && /* @__PURE__ */ jsx65("div", { className: "absolute inset-0 flex items-center justify-center text-sm text-text-tertiary", children: "Loading\u2026" }),
|
|
3899
|
+
error === "load" && /* @__PURE__ */ jsx65(
|
|
3933
3900
|
"div",
|
|
3934
3901
|
{
|
|
3935
3902
|
role: "alert",
|
|
@@ -3937,8 +3904,8 @@ var ImageCropper = React56.forwardRef(
|
|
|
3937
3904
|
children: errorMessage
|
|
3938
3905
|
}
|
|
3939
3906
|
),
|
|
3940
|
-
nat && error !== "load" && /* @__PURE__ */
|
|
3941
|
-
/* @__PURE__ */
|
|
3907
|
+
nat && error !== "load" && /* @__PURE__ */ jsxs39(Fragment4, { children: [
|
|
3908
|
+
/* @__PURE__ */ jsx65(
|
|
3942
3909
|
"div",
|
|
3943
3910
|
{
|
|
3944
3911
|
tabIndex: 0,
|
|
@@ -3960,15 +3927,15 @@ var ImageCropper = React56.forwardRef(
|
|
|
3960
3927
|
cursor: "move",
|
|
3961
3928
|
boxShadow: (focused ? FOCUS_SHADOW : "") + RING_SHADOW
|
|
3962
3929
|
},
|
|
3963
|
-
children: /* @__PURE__ */
|
|
3964
|
-
/* @__PURE__ */
|
|
3965
|
-
/* @__PURE__ */
|
|
3966
|
-
/* @__PURE__ */
|
|
3967
|
-
/* @__PURE__ */
|
|
3930
|
+
children: /* @__PURE__ */ jsxs39("div", { className: "pointer-events-none absolute inset-0 opacity-40", children: [
|
|
3931
|
+
/* @__PURE__ */ jsx65("div", { className: "absolute left-1/3 top-0 h-full w-px bg-white/60" }),
|
|
3932
|
+
/* @__PURE__ */ jsx65("div", { className: "absolute left-2/3 top-0 h-full w-px bg-white/60" }),
|
|
3933
|
+
/* @__PURE__ */ jsx65("div", { className: "absolute left-0 top-1/3 h-px w-full bg-white/60" }),
|
|
3934
|
+
/* @__PURE__ */ jsx65("div", { className: "absolute left-0 top-2/3 h-px w-full bg-white/60" })
|
|
3968
3935
|
] })
|
|
3969
3936
|
}
|
|
3970
3937
|
),
|
|
3971
|
-
CORNERS.map((corner) => /* @__PURE__ */
|
|
3938
|
+
CORNERS.map((corner) => /* @__PURE__ */ jsx65(
|
|
3972
3939
|
"div",
|
|
3973
3940
|
{
|
|
3974
3941
|
"data-grip": corner,
|
|
@@ -3981,7 +3948,7 @@ var ImageCropper = React56.forwardRef(
|
|
|
3981
3948
|
padding: BRACKET.inset
|
|
3982
3949
|
},
|
|
3983
3950
|
onPointerDown: onResizeDown(corner),
|
|
3984
|
-
children: /* @__PURE__ */
|
|
3951
|
+
children: /* @__PURE__ */ jsx65(
|
|
3985
3952
|
"span",
|
|
3986
3953
|
{
|
|
3987
3954
|
className: "block border-solid border-white",
|
|
@@ -4003,10 +3970,10 @@ var ImageCropper = React56.forwardRef(
|
|
|
4003
3970
|
]
|
|
4004
3971
|
}
|
|
4005
3972
|
),
|
|
4006
|
-
error === "export" ? /* @__PURE__ */
|
|
4007
|
-
/* @__PURE__ */
|
|
4008
|
-
onCancel && /* @__PURE__ */
|
|
4009
|
-
/* @__PURE__ */
|
|
3973
|
+
error === "export" ? /* @__PURE__ */ jsx65("p", { role: "alert", className: "text-xs text-text-danger", children: exportErrorMessage }) : hint != null && !error ? /* @__PURE__ */ jsx65("p", { className: "text-xs text-text-tertiary", children: hint }) : null,
|
|
3974
|
+
/* @__PURE__ */ jsxs39("div", { className: "flex justify-end gap-2", children: [
|
|
3975
|
+
onCancel && /* @__PURE__ */ jsx65(Button, { type: "button", variant: "outline", size: "sm", onClick: onCancel, children: cancelLabel }),
|
|
3976
|
+
/* @__PURE__ */ jsx65(Button, { type: "button", size: "sm", onClick: save, disabled: !nat || error != null, children: saveLabel })
|
|
4010
3977
|
] })
|
|
4011
3978
|
] });
|
|
4012
3979
|
}
|
|
@@ -4014,7 +3981,7 @@ var ImageCropper = React56.forwardRef(
|
|
|
4014
3981
|
ImageCropper.displayName = "ImageCropper";
|
|
4015
3982
|
|
|
4016
3983
|
// src/components/image-crop-dialog.tsx
|
|
4017
|
-
import { jsx as
|
|
3984
|
+
import { jsx as jsx66, jsxs as jsxs40 } from "react/jsx-runtime";
|
|
4018
3985
|
function ImageCropDialog({
|
|
4019
3986
|
open,
|
|
4020
3987
|
onOpenChange,
|
|
@@ -4025,17 +3992,17 @@ function ImageCropDialog({
|
|
|
4025
3992
|
onCrop,
|
|
4026
3993
|
...cropperProps
|
|
4027
3994
|
}) {
|
|
4028
|
-
return /* @__PURE__ */
|
|
3995
|
+
return /* @__PURE__ */ jsx66(Dialog, { open, onOpenChange, children: /* @__PURE__ */ jsxs40(
|
|
4029
3996
|
DialogContent,
|
|
4030
3997
|
{
|
|
4031
3998
|
className: "sm:max-w-md",
|
|
4032
3999
|
...description ? {} : { "aria-describedby": void 0 },
|
|
4033
4000
|
children: [
|
|
4034
|
-
/* @__PURE__ */
|
|
4035
|
-
/* @__PURE__ */
|
|
4036
|
-
description && /* @__PURE__ */
|
|
4001
|
+
/* @__PURE__ */ jsxs40(DialogHeader, { children: [
|
|
4002
|
+
/* @__PURE__ */ jsx66(DialogTitle, { children: title ?? `Crop ${label.toLowerCase()}` }),
|
|
4003
|
+
description && /* @__PURE__ */ jsx66(DialogDescription, { children: description })
|
|
4037
4004
|
] }),
|
|
4038
|
-
src && /* @__PURE__ */
|
|
4005
|
+
src && /* @__PURE__ */ jsx66(
|
|
4039
4006
|
ImageCropper,
|
|
4040
4007
|
{
|
|
4041
4008
|
src,
|
|
@@ -4054,9 +4021,9 @@ function ImageCropDialog({
|
|
|
4054
4021
|
ImageCropDialog.displayName = "ImageCropDialog";
|
|
4055
4022
|
|
|
4056
4023
|
// src/components/image-upload.tsx
|
|
4057
|
-
import * as
|
|
4024
|
+
import * as React56 from "react";
|
|
4058
4025
|
import { Image as ImageIcon } from "lucide-react";
|
|
4059
|
-
import { jsx as
|
|
4026
|
+
import { jsx as jsx67, jsxs as jsxs41 } from "react/jsx-runtime";
|
|
4060
4027
|
var PREVIEW_BOX = {
|
|
4061
4028
|
sm: "size-8",
|
|
4062
4029
|
md: "size-12",
|
|
@@ -4071,7 +4038,7 @@ function formatSize(bytes) {
|
|
|
4071
4038
|
if (bytes >= 1024) return `${Math.floor(bytes / 1024)} KB`;
|
|
4072
4039
|
return `${bytes} B`;
|
|
4073
4040
|
}
|
|
4074
|
-
var ImageUpload =
|
|
4041
|
+
var ImageUpload = React56.forwardRef(
|
|
4075
4042
|
({
|
|
4076
4043
|
value,
|
|
4077
4044
|
onChange,
|
|
@@ -4094,11 +4061,11 @@ var ImageUpload = React57.forwardRef(
|
|
|
4094
4061
|
className,
|
|
4095
4062
|
...props
|
|
4096
4063
|
}, ref) => {
|
|
4097
|
-
const inputRef =
|
|
4098
|
-
const [picked, setPicked] =
|
|
4099
|
-
const [cropOpen, setCropOpen] =
|
|
4100
|
-
const [error, setError] =
|
|
4101
|
-
const pickSeq =
|
|
4064
|
+
const inputRef = React56.useRef(null);
|
|
4065
|
+
const [picked, setPicked] = React56.useState(null);
|
|
4066
|
+
const [cropOpen, setCropOpen] = React56.useState(false);
|
|
4067
|
+
const [error, setError] = React56.useState(null);
|
|
4068
|
+
const pickSeq = React56.useRef(0);
|
|
4102
4069
|
const refuse = (message) => {
|
|
4103
4070
|
setError(message);
|
|
4104
4071
|
onError?.(message);
|
|
@@ -4141,8 +4108,8 @@ var ImageUpload = React57.forwardRef(
|
|
|
4141
4108
|
reader.readAsDataURL(file);
|
|
4142
4109
|
};
|
|
4143
4110
|
const framed = value != null || fallback == null;
|
|
4144
|
-
return /* @__PURE__ */
|
|
4145
|
-
/* @__PURE__ */
|
|
4111
|
+
return /* @__PURE__ */ jsxs41("div", { ref, className: cn("flex items-start gap-3", className), ...props, children: [
|
|
4112
|
+
/* @__PURE__ */ jsx67(
|
|
4146
4113
|
"span",
|
|
4147
4114
|
{
|
|
4148
4115
|
className: cn(
|
|
@@ -4151,12 +4118,12 @@ var ImageUpload = React57.forwardRef(
|
|
|
4151
4118
|
PREVIEW_MASK[shape],
|
|
4152
4119
|
framed && "border border-border-default bg-bg-secondary text-text-secondary"
|
|
4153
4120
|
),
|
|
4154
|
-
children: value ? /* @__PURE__ */
|
|
4121
|
+
children: value ? /* @__PURE__ */ jsx67("img", { src: value, alt: `${label} preview`, className: "size-full object-cover" }) : fallback ?? /* @__PURE__ */ jsx67(ImageIcon, { className: "size-5", "aria-hidden": true })
|
|
4155
4122
|
}
|
|
4156
4123
|
),
|
|
4157
|
-
/* @__PURE__ */
|
|
4158
|
-
/* @__PURE__ */
|
|
4159
|
-
/* @__PURE__ */
|
|
4124
|
+
/* @__PURE__ */ jsxs41("div", { className: "min-w-0 flex-1", children: [
|
|
4125
|
+
/* @__PURE__ */ jsxs41("div", { className: "flex items-center gap-2", children: [
|
|
4126
|
+
/* @__PURE__ */ jsx67(
|
|
4160
4127
|
Button,
|
|
4161
4128
|
{
|
|
4162
4129
|
type: "button",
|
|
@@ -4167,7 +4134,7 @@ var ImageUpload = React57.forwardRef(
|
|
|
4167
4134
|
children: value ? changeLabel : uploadLabel
|
|
4168
4135
|
}
|
|
4169
4136
|
),
|
|
4170
|
-
value && /* @__PURE__ */
|
|
4137
|
+
value && /* @__PURE__ */ jsx67(
|
|
4171
4138
|
Button,
|
|
4172
4139
|
{
|
|
4173
4140
|
type: "button",
|
|
@@ -4182,10 +4149,10 @@ var ImageUpload = React57.forwardRef(
|
|
|
4182
4149
|
}
|
|
4183
4150
|
)
|
|
4184
4151
|
] }),
|
|
4185
|
-
hint != null && /* @__PURE__ */
|
|
4186
|
-
error && /* @__PURE__ */
|
|
4152
|
+
hint != null && /* @__PURE__ */ jsx67("p", { className: "mt-1 text-xs text-text-tertiary", children: hint }),
|
|
4153
|
+
error && /* @__PURE__ */ jsx67("p", { role: "alert", className: "mt-1 text-xs text-text-danger", children: error })
|
|
4187
4154
|
] }),
|
|
4188
|
-
/* @__PURE__ */
|
|
4155
|
+
/* @__PURE__ */ jsx67(
|
|
4189
4156
|
"input",
|
|
4190
4157
|
{
|
|
4191
4158
|
ref: inputRef,
|
|
@@ -4200,7 +4167,7 @@ var ImageUpload = React57.forwardRef(
|
|
|
4200
4167
|
}
|
|
4201
4168
|
}
|
|
4202
4169
|
),
|
|
4203
|
-
crop && /* @__PURE__ */
|
|
4170
|
+
crop && /* @__PURE__ */ jsx67(
|
|
4204
4171
|
ImageCropDialog,
|
|
4205
4172
|
{
|
|
4206
4173
|
open: cropOpen,
|
|
@@ -4223,14 +4190,14 @@ var ImageUpload = React57.forwardRef(
|
|
|
4223
4190
|
ImageUpload.displayName = "ImageUpload";
|
|
4224
4191
|
|
|
4225
4192
|
// src/components/back-link.tsx
|
|
4226
|
-
import * as
|
|
4193
|
+
import * as React57 from "react";
|
|
4227
4194
|
import { ArrowLeft as ArrowLeft2 } from "lucide-react";
|
|
4228
4195
|
import { Slottable } from "@radix-ui/react-slot";
|
|
4229
|
-
import { jsx as
|
|
4196
|
+
import { jsx as jsx68, jsxs as jsxs42 } from "react/jsx-runtime";
|
|
4230
4197
|
var SLOTTED_GLYPH = "inline-flex shrink-0 items-center justify-center [&>svg]:size-3.5";
|
|
4231
|
-
var BackLink =
|
|
4198
|
+
var BackLink = React57.forwardRef(
|
|
4232
4199
|
({ parent, asChild = false, children, className, onClick, ...props }, ref) => {
|
|
4233
|
-
const slotted = asChild &&
|
|
4200
|
+
const slotted = asChild && React57.isValidElement(children);
|
|
4234
4201
|
if (!slotted && !onClick) return null;
|
|
4235
4202
|
const shell = {
|
|
4236
4203
|
variant: "ghost",
|
|
@@ -4238,23 +4205,23 @@ var BackLink = React58.forwardRef(
|
|
|
4238
4205
|
className: cn("w-fit -ml-2", className)
|
|
4239
4206
|
};
|
|
4240
4207
|
if (slotted) {
|
|
4241
|
-
return /* @__PURE__ */
|
|
4242
|
-
/* @__PURE__ */
|
|
4243
|
-
/* @__PURE__ */
|
|
4208
|
+
return /* @__PURE__ */ jsxs42(Button, { ...props, ...shell, onClick, ref, asChild: true, children: [
|
|
4209
|
+
/* @__PURE__ */ jsx68(Slottable, { children }),
|
|
4210
|
+
/* @__PURE__ */ jsx68("span", { className: SLOTTED_GLYPH, "aria-hidden": true, children: /* @__PURE__ */ jsx68(ArrowLeft2, {}) }),
|
|
4244
4211
|
parent
|
|
4245
4212
|
] });
|
|
4246
4213
|
}
|
|
4247
|
-
return /* @__PURE__ */
|
|
4214
|
+
return /* @__PURE__ */ jsx68(Button, { ...props, ...shell, onClick, ref, icon: /* @__PURE__ */ jsx68(ArrowLeft2, {}), children: parent });
|
|
4248
4215
|
}
|
|
4249
4216
|
);
|
|
4250
4217
|
BackLink.displayName = "BackLink";
|
|
4251
4218
|
|
|
4252
4219
|
// src/components/card-note.tsx
|
|
4253
|
-
import * as
|
|
4220
|
+
import * as React58 from "react";
|
|
4254
4221
|
import { Lock as Lock2 } from "lucide-react";
|
|
4255
|
-
import { jsx as
|
|
4256
|
-
var CardNote =
|
|
4257
|
-
({ className, children, ...props }, ref) => /* @__PURE__ */
|
|
4222
|
+
import { jsx as jsx69, jsxs as jsxs43 } from "react/jsx-runtime";
|
|
4223
|
+
var CardNote = React58.forwardRef(
|
|
4224
|
+
({ className, children, ...props }, ref) => /* @__PURE__ */ jsxs43(
|
|
4258
4225
|
"p",
|
|
4259
4226
|
{
|
|
4260
4227
|
...props,
|
|
@@ -4264,7 +4231,7 @@ var CardNote = React59.forwardRef(
|
|
|
4264
4231
|
className
|
|
4265
4232
|
),
|
|
4266
4233
|
children: [
|
|
4267
|
-
/* @__PURE__ */
|
|
4234
|
+
/* @__PURE__ */ jsx69(Lock2, { className: "mt-0.5 size-3 shrink-0", "aria-hidden": true }),
|
|
4268
4235
|
children
|
|
4269
4236
|
]
|
|
4270
4237
|
}
|
|
@@ -4273,12 +4240,12 @@ var CardNote = React59.forwardRef(
|
|
|
4273
4240
|
CardNote.displayName = "CardNote";
|
|
4274
4241
|
|
|
4275
4242
|
// src/components/remove-button.tsx
|
|
4276
|
-
import * as
|
|
4243
|
+
import * as React59 from "react";
|
|
4277
4244
|
import { X as X2 } from "lucide-react";
|
|
4278
|
-
import { jsx as
|
|
4279
|
-
var RemoveButton =
|
|
4245
|
+
import { jsx as jsx70, jsxs as jsxs44 } from "react/jsx-runtime";
|
|
4246
|
+
var RemoveButton = React59.forwardRef(
|
|
4280
4247
|
({ label, size = "sm", side = "top", className, ...props }, ref) => {
|
|
4281
|
-
const button = /* @__PURE__ */
|
|
4248
|
+
const button = /* @__PURE__ */ jsx70(
|
|
4282
4249
|
Button,
|
|
4283
4250
|
{
|
|
4284
4251
|
...props,
|
|
@@ -4288,22 +4255,22 @@ var RemoveButton = React60.forwardRef(
|
|
|
4288
4255
|
"aria-describedby": void 0,
|
|
4289
4256
|
variant: "destructive-ghost",
|
|
4290
4257
|
size,
|
|
4291
|
-
icon: /* @__PURE__ */
|
|
4258
|
+
icon: /* @__PURE__ */ jsx70(X2, {}),
|
|
4292
4259
|
className: cn("shrink-0", className)
|
|
4293
4260
|
}
|
|
4294
4261
|
);
|
|
4295
|
-
return /* @__PURE__ */
|
|
4296
|
-
/* @__PURE__ */
|
|
4297
|
-
/* @__PURE__ */
|
|
4262
|
+
return /* @__PURE__ */ jsxs44(Tooltip, { children: [
|
|
4263
|
+
/* @__PURE__ */ jsx70(TooltipTrigger, { asChild: true, children: props.disabled ? /* @__PURE__ */ jsx70("span", { className: "inline-flex shrink-0", children: button }) : button }),
|
|
4264
|
+
/* @__PURE__ */ jsx70(TooltipContent, { side, "aria-hidden": true, children: label })
|
|
4298
4265
|
] });
|
|
4299
4266
|
}
|
|
4300
4267
|
);
|
|
4301
4268
|
RemoveButton.displayName = "RemoveButton";
|
|
4302
4269
|
|
|
4303
4270
|
// src/components/grant-role-picker.tsx
|
|
4304
|
-
import * as
|
|
4271
|
+
import * as React60 from "react";
|
|
4305
4272
|
import { Check as Check8 } from "lucide-react";
|
|
4306
|
-
import { Fragment as Fragment6, jsx as
|
|
4273
|
+
import { Fragment as Fragment6, jsx as jsx71, jsxs as jsxs45 } from "react/jsx-runtime";
|
|
4307
4274
|
var WEIGHT_TONE = {
|
|
4308
4275
|
faint: "text-text-secondary",
|
|
4309
4276
|
normal: "text-text-primary",
|
|
@@ -4316,7 +4283,7 @@ var grantRemoveLabel = (detail, notInForce) => {
|
|
|
4316
4283
|
if (!detail) return words;
|
|
4317
4284
|
return detail.startsWith(",") ? `${words}${detail}` : `${words} ${detail}`;
|
|
4318
4285
|
};
|
|
4319
|
-
var GrantRolePicker =
|
|
4286
|
+
var GrantRolePicker = React60.forwardRef(
|
|
4320
4287
|
({
|
|
4321
4288
|
value,
|
|
4322
4289
|
roles,
|
|
@@ -4340,15 +4307,15 @@ var GrantRolePicker = React61.forwardRef(
|
|
|
4340
4307
|
const rungs = !readOnly && !carried && pickable.length > 0;
|
|
4341
4308
|
const removeWords = grantRemoveLabel(void 0, notInForce !== void 0);
|
|
4342
4309
|
const valueNote = !current ? notes?.missing : rungs && !pickable.some((r) => r.id === value) ? notes?.aboveCap : void 0;
|
|
4343
|
-
const item = (r) => /* @__PURE__ */
|
|
4344
|
-
/* @__PURE__ */
|
|
4345
|
-
/* @__PURE__ */
|
|
4346
|
-
/* @__PURE__ */
|
|
4347
|
-
r.hint && /* @__PURE__ */
|
|
4310
|
+
const item = (r) => /* @__PURE__ */ jsxs45(DropdownMenuItem, { onSelect: () => onChange(r.id), className: "items-start gap-2 py-1.5", children: [
|
|
4311
|
+
/* @__PURE__ */ jsx71(Check8, { className: cn("mt-0.5 size-3.5 shrink-0 text-text-primary", r.id !== value && "invisible") }),
|
|
4312
|
+
/* @__PURE__ */ jsxs45("span", { className: "flex flex-col", children: [
|
|
4313
|
+
/* @__PURE__ */ jsx71("span", { className: cn("text-sm", WEIGHT_TONE[r.weight ?? "normal"]), children: r.name }),
|
|
4314
|
+
r.hint && /* @__PURE__ */ jsx71("span", { className: "text-xs text-text-tertiary", children: r.hint })
|
|
4348
4315
|
] })
|
|
4349
4316
|
] }, r.id);
|
|
4350
|
-
return /* @__PURE__ */
|
|
4351
|
-
/* @__PURE__ */
|
|
4317
|
+
return /* @__PURE__ */ jsxs45(DropdownMenu, { children: [
|
|
4318
|
+
/* @__PURE__ */ jsx71(
|
|
4352
4319
|
DropdownMenuTrigger,
|
|
4353
4320
|
{
|
|
4354
4321
|
ref,
|
|
@@ -4357,27 +4324,27 @@ var GrantRolePicker = React61.forwardRef(
|
|
|
4357
4324
|
type: "button",
|
|
4358
4325
|
"aria-label": ariaLabel ? `${ariaLabel}: ${nameOf2(value)}` : void 0,
|
|
4359
4326
|
className,
|
|
4360
|
-
children: /* @__PURE__ */
|
|
4327
|
+
children: /* @__PURE__ */ jsx71("span", { className: cn("max-w-[10rem] truncate", current ? WEIGHT_TONE[current.weight ?? "normal"] : MISSING_TONE), children: nameOf2(value) })
|
|
4361
4328
|
}
|
|
4362
4329
|
),
|
|
4363
|
-
/* @__PURE__ */
|
|
4364
|
-
carried && /* @__PURE__ */
|
|
4365
|
-
valueNote !== void 0 && /* @__PURE__ */
|
|
4330
|
+
/* @__PURE__ */ jsxs45(DropdownMenuContent, { align, className: "w-64", children: [
|
|
4331
|
+
carried && /* @__PURE__ */ jsx71("div", { className: MENU_STATEMENT, children: `${via} grants this role.` }),
|
|
4332
|
+
valueNote !== void 0 && /* @__PURE__ */ jsx71("div", { className: MENU_STATEMENT, children: valueNote }),
|
|
4366
4333
|
rungs && pickable.filter((r) => !r.group).map(item),
|
|
4367
4334
|
rungs && // Bands in the order the roles list states them, so a caller decides the order once.
|
|
4368
|
-
[...new Set(pickable.map((r) => r.group).filter((g) => !!g))].map((band) => /* @__PURE__ */
|
|
4369
|
-
/* @__PURE__ */
|
|
4370
|
-
/* @__PURE__ */
|
|
4335
|
+
[...new Set(pickable.map((r) => r.group).filter((g) => !!g))].map((band) => /* @__PURE__ */ jsxs45(React60.Fragment, { children: [
|
|
4336
|
+
/* @__PURE__ */ jsx71(DropdownMenuSeparator, {}),
|
|
4337
|
+
/* @__PURE__ */ jsx71(DropdownMenuLabel, { className: "px-2 py-1 text-xs font-medium text-text-tertiary", children: band }),
|
|
4371
4338
|
pickable.filter((r) => r.group === band).map(item)
|
|
4372
4339
|
] }, band)),
|
|
4373
|
-
notInForce && /* @__PURE__ */
|
|
4374
|
-
/* @__PURE__ */
|
|
4340
|
+
notInForce && /* @__PURE__ */ jsxs45("div", { className: "px-2 py-1.5 text-xs text-text-tertiary", children: [
|
|
4341
|
+
/* @__PURE__ */ jsx71("span", { className: "line-through", children: nameOf2(notInForce.role) }),
|
|
4375
4342
|
" ",
|
|
4376
4343
|
notInForce.why
|
|
4377
4344
|
] }),
|
|
4378
|
-
onRemove && /* @__PURE__ */
|
|
4379
|
-
rungs && /* @__PURE__ */
|
|
4380
|
-
/* @__PURE__ */
|
|
4345
|
+
onRemove && /* @__PURE__ */ jsxs45(Fragment6, { children: [
|
|
4346
|
+
rungs && /* @__PURE__ */ jsx71(DropdownMenuSeparator, {}),
|
|
4347
|
+
/* @__PURE__ */ jsxs45(
|
|
4381
4348
|
DropdownMenuItem,
|
|
4382
4349
|
{
|
|
4383
4350
|
variant: "destructive",
|
|
@@ -4385,13 +4352,13 @@ var GrantRolePicker = React61.forwardRef(
|
|
|
4385
4352
|
"aria-label": removeDetail ? grantRemoveLabel(removeDetail, notInForce !== void 0) : void 0,
|
|
4386
4353
|
className: "gap-2 py-1.5",
|
|
4387
4354
|
children: [
|
|
4388
|
-
rungs && /* @__PURE__ */
|
|
4355
|
+
rungs && /* @__PURE__ */ jsx71(Check8, { className: "invisible size-3.5 shrink-0" }),
|
|
4389
4356
|
removeWords
|
|
4390
4357
|
]
|
|
4391
4358
|
}
|
|
4392
4359
|
)
|
|
4393
4360
|
] }),
|
|
4394
|
-
!carried && !rungs && valueNote === void 0 && !notInForce && !onRemove && notes?.empty !== void 0 && /* @__PURE__ */
|
|
4361
|
+
!carried && !rungs && valueNote === void 0 && !notInForce && !onRemove && notes?.empty !== void 0 && /* @__PURE__ */ jsx71("div", { className: MENU_STATEMENT, children: notes.empty })
|
|
4395
4362
|
] })
|
|
4396
4363
|
] });
|
|
4397
4364
|
}
|
|
@@ -4399,9 +4366,9 @@ var GrantRolePicker = React61.forwardRef(
|
|
|
4399
4366
|
GrantRolePicker.displayName = "GrantRolePicker";
|
|
4400
4367
|
|
|
4401
4368
|
// src/components/grant-row.tsx
|
|
4402
|
-
import * as
|
|
4403
|
-
import { jsx as
|
|
4404
|
-
var GrantRow =
|
|
4369
|
+
import * as React61 from "react";
|
|
4370
|
+
import { jsx as jsx72, jsxs as jsxs46 } from "react/jsx-runtime";
|
|
4371
|
+
var GrantRow = React61.forwardRef((props, ref) => {
|
|
4405
4372
|
const {
|
|
4406
4373
|
name,
|
|
4407
4374
|
role,
|
|
@@ -4424,12 +4391,12 @@ var GrantRow = React62.forwardRef((props, ref) => {
|
|
|
4424
4391
|
const nameOf2 = (id) => roles.find((r) => r.id === id)?.name ?? missingLabel;
|
|
4425
4392
|
const picks = stated || readOnly ? void 0 : props.onChange;
|
|
4426
4393
|
const removes = grantRemoveLabel(removeDetail ?? name, notInForce !== void 0);
|
|
4427
|
-
return /* @__PURE__ */
|
|
4428
|
-
/* @__PURE__ */
|
|
4394
|
+
return /* @__PURE__ */ jsxs46("div", { ref, className: cn("flex items-center justify-between gap-2 px-4 py-2.5", className), children: [
|
|
4395
|
+
/* @__PURE__ */ jsx72("span", { className: "min-w-0 text-sm text-text-primary", children: name }),
|
|
4429
4396
|
props.actionsInMenu ? (
|
|
4430
4397
|
// One control, and the row ends at it. The carried case is derived from `via`: the group
|
|
4431
4398
|
// is what makes the role not this row's to change.
|
|
4432
|
-
/* @__PURE__ */
|
|
4399
|
+
/* @__PURE__ */ jsx72(
|
|
4433
4400
|
GrantRolePicker,
|
|
4434
4401
|
{
|
|
4435
4402
|
value: role,
|
|
@@ -4453,8 +4420,8 @@ var GrantRow = React62.forwardRef((props, ref) => {
|
|
|
4453
4420
|
// picker at all; an overtaken grant only exists under a group's, so it is the same fact
|
|
4454
4421
|
// arriving by the other route. A row that picked and also said either would be offering
|
|
4455
4422
|
// rungs that change nothing.
|
|
4456
|
-
/* @__PURE__ */
|
|
4457
|
-
/* @__PURE__ */
|
|
4423
|
+
/* @__PURE__ */ jsxs46("div", { className: "flex items-center gap-1", children: [
|
|
4424
|
+
/* @__PURE__ */ jsx72(
|
|
4458
4425
|
GrantRolePicker,
|
|
4459
4426
|
{
|
|
4460
4427
|
value: role,
|
|
@@ -4466,40 +4433,40 @@ var GrantRow = React62.forwardRef((props, ref) => {
|
|
|
4466
4433
|
missingLabel
|
|
4467
4434
|
}
|
|
4468
4435
|
),
|
|
4469
|
-
onRemove ? /* @__PURE__ */
|
|
4436
|
+
onRemove ? /* @__PURE__ */ jsx72(RemoveButton, { label: removes, onClick: onRemove }) : reserveRemove ? (
|
|
4470
4437
|
// Spacing, not a control: `RemoveButton`'s list-row box is 36px, so a row with nothing
|
|
4471
4438
|
// to remove holds the same 36px and the card keeps one right edge.
|
|
4472
|
-
/* @__PURE__ */
|
|
4439
|
+
/* @__PURE__ */ jsx72("span", { "aria-hidden": true, className: "w-9 shrink-0" })
|
|
4473
4440
|
) : null
|
|
4474
4441
|
] })
|
|
4475
|
-
) : /* @__PURE__ */
|
|
4476
|
-
/* @__PURE__ */
|
|
4477
|
-
/* @__PURE__ */
|
|
4478
|
-
/* @__PURE__ */
|
|
4479
|
-
via && /* @__PURE__ */
|
|
4442
|
+
) : /* @__PURE__ */ jsxs46("div", { className: "flex items-center gap-1", children: [
|
|
4443
|
+
/* @__PURE__ */ jsxs46("div", { className: "flex items-center gap-1.5 pr-2", children: [
|
|
4444
|
+
/* @__PURE__ */ jsxs46("div", { className: "flex shrink-0 flex-col items-end", children: [
|
|
4445
|
+
/* @__PURE__ */ jsx72("span", { className: cn("text-sm", held ? WEIGHT_TONE[held.weight ?? "normal"] : MISSING_TONE), children: nameOf2(role) }),
|
|
4446
|
+
via && /* @__PURE__ */ jsxs46("span", { className: "text-xs text-text-tertiary", children: [
|
|
4480
4447
|
"via ",
|
|
4481
4448
|
via
|
|
4482
4449
|
] }),
|
|
4483
|
-
notInForce && /* @__PURE__ */
|
|
4484
|
-
/* @__PURE__ */
|
|
4450
|
+
notInForce && /* @__PURE__ */ jsxs46("span", { className: "text-right text-xs text-text-tertiary", children: [
|
|
4451
|
+
/* @__PURE__ */ jsx72("span", { className: "line-through", children: nameOf2(notInForce.role) }),
|
|
4485
4452
|
" ",
|
|
4486
4453
|
notInForce.why
|
|
4487
4454
|
] })
|
|
4488
4455
|
] }),
|
|
4489
|
-
reserveChevron && /* @__PURE__ */
|
|
4456
|
+
reserveChevron && /* @__PURE__ */ jsx72("span", { "aria-hidden": true, className: "w-3.5 shrink-0" })
|
|
4490
4457
|
] }),
|
|
4491
|
-
!readOnly && onRemove ? /* @__PURE__ */
|
|
4458
|
+
!readOnly && onRemove ? /* @__PURE__ */ jsx72(RemoveButton, { label: removes, onClick: onRemove }) : reserveRemove ? /* @__PURE__ */ jsx72("span", { "aria-hidden": true, className: "w-9 shrink-0" }) : null
|
|
4492
4459
|
] })
|
|
4493
4460
|
] });
|
|
4494
4461
|
});
|
|
4495
4462
|
GrantRow.displayName = "GrantRow";
|
|
4496
4463
|
|
|
4497
4464
|
// src/components/removable-chip.tsx
|
|
4498
|
-
import * as
|
|
4465
|
+
import * as React62 from "react";
|
|
4499
4466
|
import { X as X3 } from "lucide-react";
|
|
4500
|
-
import { jsx as
|
|
4501
|
-
var RemovableChip =
|
|
4502
|
-
({ label, onRemove, leading, removeLabel, className, ...props }, ref) => /* @__PURE__ */
|
|
4467
|
+
import { jsx as jsx73, jsxs as jsxs47 } from "react/jsx-runtime";
|
|
4468
|
+
var RemovableChip = React62.forwardRef(
|
|
4469
|
+
({ label, onRemove, leading, removeLabel, className, ...props }, ref) => /* @__PURE__ */ jsxs47(
|
|
4503
4470
|
"span",
|
|
4504
4471
|
{
|
|
4505
4472
|
ref,
|
|
@@ -4512,8 +4479,8 @@ var RemovableChip = React63.forwardRef(
|
|
|
4512
4479
|
),
|
|
4513
4480
|
children: [
|
|
4514
4481
|
leading,
|
|
4515
|
-
/* @__PURE__ */
|
|
4516
|
-
/* @__PURE__ */
|
|
4482
|
+
/* @__PURE__ */ jsx73("span", { className: "truncate", children: label }),
|
|
4483
|
+
/* @__PURE__ */ jsx73(
|
|
4517
4484
|
Button,
|
|
4518
4485
|
{
|
|
4519
4486
|
type: "button",
|
|
@@ -4521,7 +4488,7 @@ var RemovableChip = React63.forwardRef(
|
|
|
4521
4488
|
"aria-label": removeLabel ?? `Remove ${label}`,
|
|
4522
4489
|
variant: "ghost",
|
|
4523
4490
|
size: "xs",
|
|
4524
|
-
icon: /* @__PURE__ */
|
|
4491
|
+
icon: /* @__PURE__ */ jsx73(X3, {}),
|
|
4525
4492
|
className: "shrink-0 hover:bg-bg-overlay"
|
|
4526
4493
|
}
|
|
4527
4494
|
)
|
|
@@ -4532,22 +4499,22 @@ var RemovableChip = React63.forwardRef(
|
|
|
4532
4499
|
RemovableChip.displayName = "RemovableChip";
|
|
4533
4500
|
|
|
4534
4501
|
// src/hooks/use-fresh-highlight.ts
|
|
4535
|
-
import * as
|
|
4502
|
+
import * as React63 from "react";
|
|
4536
4503
|
var HOLD_MS = 3200;
|
|
4537
4504
|
var CLEAR_MS = HOLD_MS + 900;
|
|
4538
4505
|
function useFreshHighlight() {
|
|
4539
|
-
const [freshId, setFreshId] =
|
|
4540
|
-
const [message, setMessage] =
|
|
4541
|
-
const timer =
|
|
4542
|
-
|
|
4543
|
-
const markFresh =
|
|
4506
|
+
const [freshId, setFreshId] = React63.useState(null);
|
|
4507
|
+
const [message, setMessage] = React63.useState("");
|
|
4508
|
+
const timer = React63.useRef(void 0);
|
|
4509
|
+
React63.useEffect(() => () => clearTimeout(timer.current), []);
|
|
4510
|
+
const markFresh = React63.useCallback((id, announce) => {
|
|
4544
4511
|
clearTimeout(timer.current);
|
|
4545
4512
|
setFreshId(id);
|
|
4546
4513
|
if (announce) setMessage(announce);
|
|
4547
4514
|
timer.current = setTimeout(() => setFreshId(null), CLEAR_MS);
|
|
4548
4515
|
}, []);
|
|
4549
|
-
const isFresh =
|
|
4550
|
-
const freshRef =
|
|
4516
|
+
const isFresh = React63.useCallback((id) => id === freshId, [freshId]);
|
|
4517
|
+
const freshRef = React63.useCallback((el) => {
|
|
4551
4518
|
if (!el) return;
|
|
4552
4519
|
const rect = el.getBoundingClientRect();
|
|
4553
4520
|
const viewportH = window.innerHeight || document.documentElement.clientHeight;
|
|
@@ -4556,7 +4523,7 @@ function useFreshHighlight() {
|
|
|
4556
4523
|
const reduce = window.matchMedia?.("(prefers-reduced-motion: reduce)").matches;
|
|
4557
4524
|
el.scrollIntoView({ block: "nearest", behavior: reduce ? "auto" : "smooth" });
|
|
4558
4525
|
}, []);
|
|
4559
|
-
const announcer =
|
|
4526
|
+
const announcer = React63.createElement(
|
|
4560
4527
|
"span",
|
|
4561
4528
|
{ role: "status", "aria-live": "polite", className: "sr-only" },
|
|
4562
4529
|
message
|
|
@@ -4566,7 +4533,7 @@ function useFreshHighlight() {
|
|
|
4566
4533
|
|
|
4567
4534
|
// src/components/quick-search-row.tsx
|
|
4568
4535
|
import { Search as Search2 } from "lucide-react";
|
|
4569
|
-
import { jsx as
|
|
4536
|
+
import { jsx as jsx74, jsxs as jsxs48 } from "react/jsx-runtime";
|
|
4570
4537
|
function QuickSearchRow({
|
|
4571
4538
|
onOpen,
|
|
4572
4539
|
label = "Quick search",
|
|
@@ -4576,7 +4543,7 @@ function QuickSearchRow({
|
|
|
4576
4543
|
}) {
|
|
4577
4544
|
const name = shortcut ? `${label} ${shortcut}` : label;
|
|
4578
4545
|
if (!collapsed) {
|
|
4579
|
-
return /* @__PURE__ */
|
|
4546
|
+
return /* @__PURE__ */ jsxs48(
|
|
4580
4547
|
"button",
|
|
4581
4548
|
{
|
|
4582
4549
|
type: "button",
|
|
@@ -4594,34 +4561,34 @@ function QuickSearchRow({
|
|
|
4594
4561
|
"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-border-focus"
|
|
4595
4562
|
),
|
|
4596
4563
|
children: [
|
|
4597
|
-
/* @__PURE__ */
|
|
4598
|
-
/* @__PURE__ */
|
|
4599
|
-
shortcut && /* @__PURE__ */
|
|
4564
|
+
/* @__PURE__ */ jsx74("span", { className: "flex size-4 shrink-0 items-center justify-center [&_svg]:size-4", "aria-hidden": "true", children: icon ?? /* @__PURE__ */ jsx74(Search2, {}) }),
|
|
4565
|
+
/* @__PURE__ */ jsx74("span", { className: "min-w-0 flex-1 truncate", children: label }),
|
|
4566
|
+
shortcut && /* @__PURE__ */ jsx74("span", { className: "shrink-0 text-xs font-medium text-text-tertiary", children: shortcut })
|
|
4600
4567
|
]
|
|
4601
4568
|
}
|
|
4602
4569
|
);
|
|
4603
4570
|
}
|
|
4604
|
-
return /* @__PURE__ */
|
|
4605
|
-
/* @__PURE__ */
|
|
4571
|
+
return /* @__PURE__ */ jsxs48(Tooltip, { children: [
|
|
4572
|
+
/* @__PURE__ */ jsx74(TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsx74(
|
|
4606
4573
|
NavRow,
|
|
4607
4574
|
{
|
|
4608
4575
|
variant: "rail",
|
|
4609
|
-
icon: icon ?? /* @__PURE__ */
|
|
4576
|
+
icon: icon ?? /* @__PURE__ */ jsx74(Search2, { "aria-hidden": "true" }),
|
|
4610
4577
|
label,
|
|
4611
4578
|
onClick: onOpen
|
|
4612
4579
|
}
|
|
4613
4580
|
) }),
|
|
4614
|
-
/* @__PURE__ */
|
|
4581
|
+
/* @__PURE__ */ jsx74(TooltipContent, { side: "right", children: name })
|
|
4615
4582
|
] });
|
|
4616
4583
|
}
|
|
4617
4584
|
QuickSearchRow.displayName = "QuickSearchRow";
|
|
4618
4585
|
|
|
4619
4586
|
// src/components/nav-section-label.tsx
|
|
4620
|
-
import * as
|
|
4621
|
-
import { jsx as
|
|
4622
|
-
var NavSectionLabel =
|
|
4587
|
+
import * as React64 from "react";
|
|
4588
|
+
import { jsx as jsx75 } from "react/jsx-runtime";
|
|
4589
|
+
var NavSectionLabel = React64.forwardRef(
|
|
4623
4590
|
function NavSectionLabel2({ className, ...props }, ref) {
|
|
4624
|
-
return /* @__PURE__ */
|
|
4591
|
+
return /* @__PURE__ */ jsx75(
|
|
4625
4592
|
"div",
|
|
4626
4593
|
{
|
|
4627
4594
|
ref,
|
|
@@ -4634,8 +4601,8 @@ var NavSectionLabel = React65.forwardRef(
|
|
|
4634
4601
|
NavSectionLabel.displayName = "NavSectionLabel";
|
|
4635
4602
|
|
|
4636
4603
|
// src/components/menu-popup.tsx
|
|
4637
|
-
import * as
|
|
4638
|
-
import { jsx as
|
|
4604
|
+
import * as React65 from "react";
|
|
4605
|
+
import { jsx as jsx76, jsxs as jsxs49 } from "react/jsx-runtime";
|
|
4639
4606
|
function MenuPopup({
|
|
4640
4607
|
trigger,
|
|
4641
4608
|
children,
|
|
@@ -4647,9 +4614,9 @@ function MenuPopup({
|
|
|
4647
4614
|
sideOffset = 6,
|
|
4648
4615
|
className
|
|
4649
4616
|
}) {
|
|
4650
|
-
return /* @__PURE__ */
|
|
4651
|
-
/* @__PURE__ */
|
|
4652
|
-
/* @__PURE__ */
|
|
4617
|
+
return /* @__PURE__ */ jsxs49(Popover, { open, defaultOpen, onOpenChange, children: [
|
|
4618
|
+
/* @__PURE__ */ jsx76(PopoverTrigger, { asChild: true, children: trigger }),
|
|
4619
|
+
/* @__PURE__ */ jsx76(
|
|
4653
4620
|
PopoverContent,
|
|
4654
4621
|
{
|
|
4655
4622
|
side: direction === "up" ? "top" : "bottom",
|
|
@@ -4664,9 +4631,9 @@ function MenuPopup({
|
|
|
4664
4631
|
)
|
|
4665
4632
|
] });
|
|
4666
4633
|
}
|
|
4667
|
-
var MenuDivider =
|
|
4634
|
+
var MenuDivider = React65.forwardRef(
|
|
4668
4635
|
function MenuDivider2({ className, ...props }, ref) {
|
|
4669
|
-
return /* @__PURE__ */
|
|
4636
|
+
return /* @__PURE__ */ jsx76(
|
|
4670
4637
|
"div",
|
|
4671
4638
|
{
|
|
4672
4639
|
ref,
|
|
@@ -4680,69 +4647,69 @@ var MenuDivider = React66.forwardRef(
|
|
|
4680
4647
|
MenuDivider.displayName = "MenuDivider";
|
|
4681
4648
|
|
|
4682
4649
|
// src/components/sidebar-product-header.tsx
|
|
4683
|
-
import * as
|
|
4650
|
+
import * as React66 from "react";
|
|
4684
4651
|
import { Slot as Slot3 } from "@radix-ui/react-slot";
|
|
4685
4652
|
import { ChevronsUpDown as ChevronsUpDown2 } from "lucide-react";
|
|
4686
|
-
import { Fragment as Fragment7, jsx as
|
|
4687
|
-
var SidebarProductHeader =
|
|
4653
|
+
import { Fragment as Fragment7, jsx as jsx77, jsxs as jsxs50 } from "react/jsx-runtime";
|
|
4654
|
+
var SidebarProductHeader = React66.forwardRef(
|
|
4688
4655
|
function SidebarProductHeader2({ name, icon, trailing, asChild = false, className, children, ...props }, ref) {
|
|
4689
|
-
const adornment = trailing === void 0 ? /* @__PURE__ */
|
|
4690
|
-
const content = /* @__PURE__ */
|
|
4691
|
-
icon && /* @__PURE__ */
|
|
4692
|
-
/* @__PURE__ */
|
|
4693
|
-
adornment && /* @__PURE__ */
|
|
4656
|
+
const adornment = trailing === void 0 ? /* @__PURE__ */ jsx77(ChevronsUpDown2, { size: 14, "aria-hidden": "true", className: "shrink-0 text-text-tertiary" }) : trailing;
|
|
4657
|
+
const content = /* @__PURE__ */ jsxs50(Fragment7, { children: [
|
|
4658
|
+
icon && /* @__PURE__ */ jsx77("span", { className: "flex size-7 shrink-0 items-center justify-center overflow-hidden rounded-md", "aria-hidden": "true", children: icon }),
|
|
4659
|
+
/* @__PURE__ */ jsx77("span", { className: "min-w-0 flex-1 truncate text-sm font-semibold text-text-primary", children: name }),
|
|
4660
|
+
adornment && /* @__PURE__ */ jsx77("span", { className: "flex shrink-0 items-center", children: adornment })
|
|
4694
4661
|
] });
|
|
4695
4662
|
const classes = cn("flex w-full cursor-pointer items-center gap-2.5 rounded-xl px-1.5 py-0 text-left", className);
|
|
4696
4663
|
if (asChild) {
|
|
4697
|
-
const child =
|
|
4698
|
-
return /* @__PURE__ */
|
|
4664
|
+
const child = React66.Children.only(children);
|
|
4665
|
+
return /* @__PURE__ */ jsx77(Slot3, { ref, className: classes, ...props, children: React66.cloneElement(child, void 0, content) });
|
|
4699
4666
|
}
|
|
4700
|
-
return /* @__PURE__ */
|
|
4667
|
+
return /* @__PURE__ */ jsx77("button", { ref, type: "button", className: classes, ...props, children: content });
|
|
4701
4668
|
}
|
|
4702
4669
|
);
|
|
4703
4670
|
SidebarProductHeader.displayName = "SidebarProductHeader";
|
|
4704
4671
|
|
|
4705
4672
|
// src/components/org-product-switcher.tsx
|
|
4706
|
-
import * as
|
|
4673
|
+
import * as React67 from "react";
|
|
4707
4674
|
import { ChevronsUpDown as ChevronsUpDown3, Check as Check9, Search as Search3 } from "lucide-react";
|
|
4708
|
-
import { Fragment as Fragment8, jsx as
|
|
4675
|
+
import { Fragment as Fragment8, jsx as jsx78, jsxs as jsxs51 } from "react/jsx-runtime";
|
|
4709
4676
|
var PRODUCT_STATUS_LABEL = {
|
|
4710
4677
|
blocked: "Blocked",
|
|
4711
4678
|
archived: "Archived"
|
|
4712
4679
|
};
|
|
4713
4680
|
function productStatusBadge(status) {
|
|
4714
4681
|
if (status === "active") return void 0;
|
|
4715
|
-
return /* @__PURE__ */
|
|
4682
|
+
return /* @__PURE__ */ jsx78(Badge, { variant: "status", children: PRODUCT_STATUS_LABEL[status] });
|
|
4716
4683
|
}
|
|
4717
4684
|
var triggerBox = "flex min-h-[40px] 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";
|
|
4718
4685
|
var inlineTriggerBox = "flex items-center gap-1.5 rounded-lg px-2 py-1 text-sm font-semibold text-text-primary transition-colors duration-fast hover:bg-[var(--hov-bg)] focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-border-focus";
|
|
4719
4686
|
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";
|
|
4720
4687
|
var sectionLabel = "px-2 pt-1.5 pb-1 text-xs font-medium text-text-tertiary";
|
|
4721
|
-
var searchBox = "mx-1 mb-1 flex h-8 shrink-0 items-center gap-2 rounded-md border border-field-border bg-bg-primary px-2 focus-within:ring-2 focus-within:ring-border-focus";
|
|
4688
|
+
var searchBox = "mx-1 mb-1 flex h-8 shrink-0 items-center gap-2 rounded-md border border-field-border bg-bg-primary px-2 focus-within:ring-2 focus-within:ring-inset focus-within:ring-border-focus";
|
|
4722
4689
|
var rowScroller = "flex max-h-[18rem] min-h-0 flex-col gap-px overflow-y-auto overscroll-contain";
|
|
4723
4690
|
var NO_ORG_LABEL = "Select an organization\u2026";
|
|
4724
4691
|
var nameOf = (item) => item?.name.trim() ? item.name : void 0;
|
|
4725
4692
|
var UNNAMED = { organization: "Unnamed organization", product: "Unnamed product" };
|
|
4726
4693
|
function NameLine({ className, children }) {
|
|
4727
|
-
return /* @__PURE__ */
|
|
4728
|
-
/* @__PURE__ */
|
|
4729
|
-
/* @__PURE__ */
|
|
4694
|
+
return /* @__PURE__ */ jsxs51("span", { className: "flex min-w-0 items-center gap-1", children: [
|
|
4695
|
+
/* @__PURE__ */ jsx78("span", { className: cn("min-w-0 truncate text-sm leading-[normal]", className), children }),
|
|
4696
|
+
/* @__PURE__ */ jsx78(ChevronsUpDown3, { size: 14, "aria-hidden": "true", className: "shrink-0 text-text-tertiary" })
|
|
4730
4697
|
] });
|
|
4731
4698
|
}
|
|
4732
4699
|
var SEARCH_NOUN = { organization: "organizations", product: "products" };
|
|
4733
4700
|
function ItemLabel({ item, kind }) {
|
|
4734
4701
|
const name = nameOf(item);
|
|
4735
|
-
return /* @__PURE__ */
|
|
4702
|
+
return /* @__PURE__ */ jsx78("span", { className: cn("min-w-0 flex-1 truncate", !name && "text-text-tertiary"), children: name ?? UNNAMED[kind] });
|
|
4736
4703
|
}
|
|
4737
4704
|
var MARK_SIZE = { md: "sm", sm: "xs" };
|
|
4738
4705
|
var ICON_BOX = { md: "size-8 rounded-md", sm: "size-6 rounded-sm" };
|
|
4739
4706
|
function Mark2({ item, kind, size, reserve }) {
|
|
4740
4707
|
if (item.icon) {
|
|
4741
|
-
return /* @__PURE__ */
|
|
4708
|
+
return /* @__PURE__ */ jsx78("span", { className: cn("flex shrink-0 items-center justify-center overflow-hidden", ICON_BOX[size]), "aria-hidden": "true", children: item.icon });
|
|
4742
4709
|
}
|
|
4743
4710
|
const name = nameOf(item);
|
|
4744
|
-
if (!name) return reserve ? /* @__PURE__ */
|
|
4745
|
-
return /* @__PURE__ */
|
|
4711
|
+
if (!name) return reserve ? /* @__PURE__ */ jsx78("span", { "aria-hidden": "true", className: cn("shrink-0", ICON_BOX[size]) }) : null;
|
|
4712
|
+
return /* @__PURE__ */ jsx78(EntityTile, { name, tone: kind === "product" ? "auto" : "neutral", size: MARK_SIZE[size] });
|
|
4746
4713
|
}
|
|
4747
4714
|
function OrgProductSwitcher({
|
|
4748
4715
|
organizations = [],
|
|
@@ -4756,10 +4723,10 @@ function OrgProductSwitcher({
|
|
|
4756
4723
|
className,
|
|
4757
4724
|
...props
|
|
4758
4725
|
}) {
|
|
4759
|
-
const [open, setOpen] =
|
|
4760
|
-
const [query, setQuery] =
|
|
4761
|
-
const contentRef =
|
|
4762
|
-
const searchRef =
|
|
4726
|
+
const [open, setOpen] = React67.useState(false);
|
|
4727
|
+
const [query, setQuery] = React67.useState("");
|
|
4728
|
+
const contentRef = React67.useRef(null);
|
|
4729
|
+
const searchRef = React67.useRef(null);
|
|
4763
4730
|
const activeOrg = organizations.find((o) => o.id === activeOrgId);
|
|
4764
4731
|
const activeProduct = products.find((p) => p.id === activeProductId);
|
|
4765
4732
|
const orgName = nameOf(activeOrg);
|
|
@@ -4780,7 +4747,7 @@ function OrgProductSwitcher({
|
|
|
4780
4747
|
const needle = query.trim().toLowerCase();
|
|
4781
4748
|
const matches = needle ? items.filter((i) => (nameOf(i) ?? UNNAMED[menuKind]).toLowerCase().includes(needle)) : items;
|
|
4782
4749
|
const hasList = items.length > 0;
|
|
4783
|
-
|
|
4750
|
+
React67.useEffect(() => {
|
|
4784
4751
|
if (!open || !hasList) return;
|
|
4785
4752
|
const id = window.setTimeout(() => searchRef.current?.focus());
|
|
4786
4753
|
return () => window.clearTimeout(id);
|
|
@@ -4810,24 +4777,24 @@ function OrgProductSwitcher({
|
|
|
4810
4777
|
}
|
|
4811
4778
|
if (e.key.length === 1) e.stopPropagation();
|
|
4812
4779
|
};
|
|
4813
|
-
return /* @__PURE__ */
|
|
4780
|
+
return /* @__PURE__ */ jsxs51(DropdownMenu, { open, onOpenChange: setMenuOpen, children: [
|
|
4814
4781
|
trigger === "inline" ? (
|
|
4815
4782
|
// One line, and the words are the whole trigger: the product where one has resolved, the
|
|
4816
4783
|
// org where it has not, and the same tertiary placeholder as the stacked form where neither
|
|
4817
4784
|
// has. Nothing is truncated — a bar sizes to its contents, and a name cut short in a bar is
|
|
4818
4785
|
// a name nowhere else on the page repeats.
|
|
4819
|
-
/* @__PURE__ */
|
|
4820
|
-
/* @__PURE__ */
|
|
4821
|
-
/* @__PURE__ */
|
|
4786
|
+
/* @__PURE__ */ jsxs51(DropdownMenuTrigger, { "aria-label": ariaLabel, className: cn(inlineTriggerBox, className), children: [
|
|
4787
|
+
/* @__PURE__ */ jsx78("span", { className: cn(!inlineName && "font-medium text-text-tertiary"), children: inlineName ?? NO_ORG_LABEL }),
|
|
4788
|
+
/* @__PURE__ */ jsx78(ChevronsUpDown3, { size: 14, "aria-hidden": "true", className: "shrink-0 text-text-tertiary" })
|
|
4822
4789
|
] })
|
|
4823
|
-
) : /* @__PURE__ */
|
|
4824
|
-
triggerMark && /* @__PURE__ */
|
|
4825
|
-
orgLevel ? /* @__PURE__ */
|
|
4826
|
-
orgName && /* @__PURE__ */
|
|
4827
|
-
/* @__PURE__ */
|
|
4790
|
+
) : /* @__PURE__ */ jsxs51(DropdownMenuTrigger, { "aria-label": ariaLabel, className: cn(triggerBox, className), children: [
|
|
4791
|
+
triggerMark && /* @__PURE__ */ jsx78(Mark2, { item: triggerMark, kind: markKind, size: "md" }),
|
|
4792
|
+
orgLevel ? /* @__PURE__ */ jsx78("span", { className: "flex min-w-0 flex-1 flex-col", children: /* @__PURE__ */ jsx78(NameLine, { className: orgName ? "font-semibold text-text-primary" : "text-text-tertiary", children: orgName ?? NO_ORG_LABEL }) }) : /* @__PURE__ */ jsxs51("span", { className: "flex min-w-0 flex-1 flex-col gap-0.5", children: [
|
|
4793
|
+
orgName && /* @__PURE__ */ jsx78("span", { className: "truncate text-xs leading-[normal] text-text-tertiary", children: orgName }),
|
|
4794
|
+
/* @__PURE__ */ jsx78(NameLine, { className: productName ? "font-semibold text-text-primary" : "text-text-tertiary", children: productLabel })
|
|
4828
4795
|
] })
|
|
4829
4796
|
] }),
|
|
4830
|
-
/* @__PURE__ */
|
|
4797
|
+
/* @__PURE__ */ jsxs51(
|
|
4831
4798
|
DropdownMenuContent,
|
|
4832
4799
|
{
|
|
4833
4800
|
ref: contentRef,
|
|
@@ -4835,11 +4802,11 @@ function OrgProductSwitcher({
|
|
|
4835
4802
|
sideOffset: 6,
|
|
4836
4803
|
className: "flex w-[var(--radix-dropdown-menu-trigger-width)] min-w-64 flex-col gap-px rounded-xl border-border-subtle bg-[var(--menu-bg)] p-1 shadow-(--menu-shadow)",
|
|
4837
4804
|
children: [
|
|
4838
|
-
items.length > 0 && /* @__PURE__ */
|
|
4839
|
-
/* @__PURE__ */
|
|
4840
|
-
/* @__PURE__ */
|
|
4841
|
-
/* @__PURE__ */
|
|
4842
|
-
/* @__PURE__ */
|
|
4805
|
+
items.length > 0 && /* @__PURE__ */ jsxs51(Fragment8, { children: [
|
|
4806
|
+
/* @__PURE__ */ jsx78(DropdownMenuLabel, { className: sectionLabel, children: menuKind === "organization" ? "Organizations" : "Products" }),
|
|
4807
|
+
/* @__PURE__ */ jsxs51("div", { className: searchBox, onKeyDown: onSearchKeyDown, children: [
|
|
4808
|
+
/* @__PURE__ */ jsx78(Search3, { size: 14, "aria-hidden": "true", className: "shrink-0 text-text-tertiary" }),
|
|
4809
|
+
/* @__PURE__ */ jsx78(
|
|
4843
4810
|
"input",
|
|
4844
4811
|
{
|
|
4845
4812
|
ref: searchRef,
|
|
@@ -4852,27 +4819,27 @@ function OrgProductSwitcher({
|
|
|
4852
4819
|
}
|
|
4853
4820
|
)
|
|
4854
4821
|
] }),
|
|
4855
|
-
/* @__PURE__ */
|
|
4822
|
+
/* @__PURE__ */ jsx78("div", { role: "group", className: rowScroller, children: matches.map((item) => {
|
|
4856
4823
|
const status = menuKind === "product" && productStatusBadge(item.status ?? "active");
|
|
4857
|
-
return /* @__PURE__ */
|
|
4858
|
-
/* @__PURE__ */
|
|
4859
|
-
/* @__PURE__ */
|
|
4860
|
-
status && /* @__PURE__ */
|
|
4861
|
-
item.id === activeItemId && /* @__PURE__ */
|
|
4824
|
+
return /* @__PURE__ */ jsxs51(DropdownMenuItem, { "data-menu-row": "", className: menuItem, onSelect: () => pick(item.id), children: [
|
|
4825
|
+
/* @__PURE__ */ jsx78(Mark2, { item, kind: menuKind, size: "sm", reserve: true }),
|
|
4826
|
+
/* @__PURE__ */ jsx78(ItemLabel, { item, kind: menuKind }),
|
|
4827
|
+
status && /* @__PURE__ */ jsx78("span", { className: "shrink-0", children: status }),
|
|
4828
|
+
item.id === activeItemId && /* @__PURE__ */ jsx78(Check9, { className: "size-4 shrink-0 text-text-secondary", "aria-hidden": "true" })
|
|
4862
4829
|
] }, item.id);
|
|
4863
4830
|
}) }),
|
|
4864
|
-
matches.length === 0 && /* @__PURE__ */
|
|
4831
|
+
matches.length === 0 && /* @__PURE__ */ jsxs51("div", { className: "px-2 py-1.5 text-sm text-text-tertiary", children: [
|
|
4865
4832
|
"No ",
|
|
4866
4833
|
noun,
|
|
4867
4834
|
" match."
|
|
4868
4835
|
] })
|
|
4869
4836
|
] }),
|
|
4870
|
-
actions && actions.length > 0 && /* @__PURE__ */
|
|
4871
|
-
items.length > 0 && /* @__PURE__ */
|
|
4872
|
-
actions.map((a) => /* @__PURE__ */
|
|
4837
|
+
actions && actions.length > 0 && /* @__PURE__ */ jsxs51(Fragment8, { children: [
|
|
4838
|
+
items.length > 0 && /* @__PURE__ */ jsx78(DropdownMenuSeparator, { className: "mx-0 shrink-0" }),
|
|
4839
|
+
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: [
|
|
4873
4840
|
a.icon,
|
|
4874
4841
|
a.label
|
|
4875
|
-
] }) : /* @__PURE__ */
|
|
4842
|
+
] }) : /* @__PURE__ */ jsxs51(Fragment8, { children: [
|
|
4876
4843
|
a.icon,
|
|
4877
4844
|
a.label
|
|
4878
4845
|
] }) }, a.id))
|
|
@@ -4886,13 +4853,13 @@ OrgProductSwitcher.displayName = "OrgProductSwitcher";
|
|
|
4886
4853
|
|
|
4887
4854
|
// src/components/sidebar-back-header.tsx
|
|
4888
4855
|
import { ArrowLeft as ArrowLeft3 } from "lucide-react";
|
|
4889
|
-
import { jsx as
|
|
4856
|
+
import { jsx as jsx79, jsxs as jsxs52 } from "react/jsx-runtime";
|
|
4890
4857
|
var focusRing = "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-border-focus";
|
|
4891
4858
|
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";
|
|
4892
4859
|
var rowPlate = "transition-colors duration-fast hover:bg-[color-mix(in_srgb,var(--text-primary)_7%,transparent)]";
|
|
4893
4860
|
var arrowBox = "flex shrink-0 cursor-pointer items-center rounded-xl py-2 pr-0 pl-2.5 text-text-secondary";
|
|
4894
4861
|
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";
|
|
4895
|
-
var Arrow = () => /* @__PURE__ */
|
|
4862
|
+
var Arrow = () => /* @__PURE__ */ jsx79(ArrowLeft3, { size: 16, "aria-hidden": "true" });
|
|
4896
4863
|
function SidebarBackHeader({
|
|
4897
4864
|
title,
|
|
4898
4865
|
onBack,
|
|
@@ -4906,7 +4873,7 @@ function SidebarBackHeader({
|
|
|
4906
4873
|
const { className: arrowClassName, ...arrowRest } = arrowProps ?? {};
|
|
4907
4874
|
const { className: titleClassName, ...titleRest } = titleProps ?? {};
|
|
4908
4875
|
if (!onTitleClick) {
|
|
4909
|
-
return /* @__PURE__ */
|
|
4876
|
+
return /* @__PURE__ */ jsxs52(
|
|
4910
4877
|
"button",
|
|
4911
4878
|
{
|
|
4912
4879
|
type: "button",
|
|
@@ -4914,14 +4881,14 @@ function SidebarBackHeader({
|
|
|
4914
4881
|
className: cn("flex cursor-pointer items-center rounded-xl", rowPlate, focusRing, className),
|
|
4915
4882
|
...rowProps,
|
|
4916
4883
|
children: [
|
|
4917
|
-
/* @__PURE__ */
|
|
4918
|
-
/* @__PURE__ */
|
|
4884
|
+
/* @__PURE__ */ jsx79("span", { className: arrowBox, children: /* @__PURE__ */ jsx79("span", { className: cn(arrowPlate, arrowClassName), ...arrowRest, children: /* @__PURE__ */ jsx79(Arrow, {}) }) }),
|
|
4885
|
+
/* @__PURE__ */ jsx79("span", { className: cn(titleBox, titleClassName), ...titleRest, children: title })
|
|
4919
4886
|
]
|
|
4920
4887
|
}
|
|
4921
4888
|
);
|
|
4922
4889
|
}
|
|
4923
|
-
return /* @__PURE__ */
|
|
4924
|
-
/* @__PURE__ */
|
|
4890
|
+
return /* @__PURE__ */ jsxs52("div", { className: cn("flex items-center rounded-xl", rowPlate, className), ...rowProps, children: [
|
|
4891
|
+
/* @__PURE__ */ jsx79(
|
|
4925
4892
|
"button",
|
|
4926
4893
|
{
|
|
4927
4894
|
type: "button",
|
|
@@ -4929,10 +4896,10 @@ function SidebarBackHeader({
|
|
|
4929
4896
|
onClick: onBack,
|
|
4930
4897
|
className: cn(arrowBox, focusRing, arrowClassName),
|
|
4931
4898
|
...arrowRest,
|
|
4932
|
-
children: /* @__PURE__ */
|
|
4899
|
+
children: /* @__PURE__ */ jsx79("span", { className: arrowPlate, children: /* @__PURE__ */ jsx79(Arrow, {}) })
|
|
4933
4900
|
}
|
|
4934
4901
|
),
|
|
4935
|
-
/* @__PURE__ */
|
|
4902
|
+
/* @__PURE__ */ jsx79(
|
|
4936
4903
|
"button",
|
|
4937
4904
|
{
|
|
4938
4905
|
type: "button",
|
|
@@ -4947,24 +4914,24 @@ function SidebarBackHeader({
|
|
|
4947
4914
|
SidebarBackHeader.displayName = "SidebarBackHeader";
|
|
4948
4915
|
|
|
4949
4916
|
// src/components/top-bar.tsx
|
|
4950
|
-
import * as
|
|
4951
|
-
import { jsx as
|
|
4952
|
-
var TopBar =
|
|
4953
|
-
({ left, right, className, ...props }, ref) => /* @__PURE__ */
|
|
4917
|
+
import * as React68 from "react";
|
|
4918
|
+
import { jsx as jsx80, jsxs as jsxs53 } from "react/jsx-runtime";
|
|
4919
|
+
var TopBar = React68.forwardRef(
|
|
4920
|
+
({ left, right, className, ...props }, ref) => /* @__PURE__ */ jsxs53("div", { ref, className: cn("flex w-full items-center gap-1", className), ...props, children: [
|
|
4954
4921
|
left,
|
|
4955
|
-
right && /* @__PURE__ */
|
|
4922
|
+
right && /* @__PURE__ */ jsx80("div", { className: "ml-auto flex items-center gap-2", children: right })
|
|
4956
4923
|
] })
|
|
4957
4924
|
);
|
|
4958
4925
|
TopBar.displayName = "TopBar";
|
|
4959
4926
|
|
|
4960
4927
|
// src/components/grid.tsx
|
|
4961
|
-
import * as
|
|
4928
|
+
import * as React69 from "react";
|
|
4962
4929
|
import { Slot as Slot4 } from "@radix-ui/react-slot";
|
|
4963
|
-
import { jsx as
|
|
4964
|
-
var Grid =
|
|
4930
|
+
import { jsx as jsx81 } from "react/jsx-runtime";
|
|
4931
|
+
var Grid = React69.forwardRef(
|
|
4965
4932
|
({ fluid = false, asChild = false, className, ...props }, ref) => {
|
|
4966
4933
|
const Comp = asChild ? Slot4 : "div";
|
|
4967
|
-
return /* @__PURE__ */
|
|
4934
|
+
return /* @__PURE__ */ jsx81(
|
|
4968
4935
|
Comp,
|
|
4969
4936
|
{
|
|
4970
4937
|
ref,
|
|
@@ -4982,9 +4949,9 @@ var Grid = React70.forwardRef(
|
|
|
4982
4949
|
Grid.displayName = "Grid";
|
|
4983
4950
|
|
|
4984
4951
|
// src/components/col.tsx
|
|
4985
|
-
import * as
|
|
4952
|
+
import * as React70 from "react";
|
|
4986
4953
|
import { Slot as Slot5 } from "@radix-ui/react-slot";
|
|
4987
|
-
import { jsx as
|
|
4954
|
+
import { jsx as jsx82 } from "react/jsx-runtime";
|
|
4988
4955
|
var TIER_MAX = { base: 4, md: 8, xl: 12 };
|
|
4989
4956
|
var SPAN = {
|
|
4990
4957
|
base: { 1: "col-span-1", 2: "col-span-2", 3: "col-span-3", 4: "col-span-4" },
|
|
@@ -5104,27 +5071,27 @@ function responsiveClasses(span, offset) {
|
|
|
5104
5071
|
}
|
|
5105
5072
|
return cn(...spanClasses, ...startClasses);
|
|
5106
5073
|
}
|
|
5107
|
-
var Col =
|
|
5074
|
+
var Col = React70.forwardRef(
|
|
5108
5075
|
({ span, offset, asChild = false, className, ...props }, ref) => {
|
|
5109
5076
|
const Comp = asChild ? Slot5 : "div";
|
|
5110
|
-
return /* @__PURE__ */
|
|
5077
|
+
return /* @__PURE__ */ jsx82(Comp, { ref, className: cn(responsiveClasses(span, offset), className), ...props });
|
|
5111
5078
|
}
|
|
5112
5079
|
);
|
|
5113
5080
|
Col.displayName = "Col";
|
|
5114
5081
|
|
|
5115
5082
|
// src/components/page-column.tsx
|
|
5116
|
-
import { jsx as
|
|
5083
|
+
import { jsx as jsx83 } from "react/jsx-runtime";
|
|
5117
5084
|
var WIDTH = {
|
|
5118
5085
|
reading: "grid gap-5 page-column",
|
|
5119
5086
|
full: "grid gap-5"
|
|
5120
5087
|
};
|
|
5121
5088
|
function PageColumn({ className, width = "reading", ...props }) {
|
|
5122
|
-
return /* @__PURE__ */
|
|
5089
|
+
return /* @__PURE__ */ jsx83("div", { "data-slot": "page-column", className: cn(WIDTH[width], className), ...props });
|
|
5123
5090
|
}
|
|
5124
5091
|
|
|
5125
5092
|
// src/components/code-block.tsx
|
|
5126
|
-
import * as
|
|
5127
|
-
import { jsx as
|
|
5093
|
+
import * as React71 from "react";
|
|
5094
|
+
import { jsx as jsx84, jsxs as jsxs54 } from "react/jsx-runtime";
|
|
5128
5095
|
var TOKEN_CLASS = {
|
|
5129
5096
|
comment: "text-text-tertiary italic",
|
|
5130
5097
|
string: "text-text-success",
|
|
@@ -5295,30 +5262,30 @@ function dropLeading(tokens, count) {
|
|
|
5295
5262
|
}
|
|
5296
5263
|
return out;
|
|
5297
5264
|
}
|
|
5298
|
-
var CodeBlock =
|
|
5265
|
+
var CodeBlock = React71.forwardRef(
|
|
5299
5266
|
({ code, lang = "tsx", variant = "default", copy = false, filename, scroll = false, highlightLines, showLineNumbers = false, className, ...props }, ref) => {
|
|
5300
|
-
const lines =
|
|
5301
|
-
const rawLines =
|
|
5302
|
-
const highlighted =
|
|
5267
|
+
const lines = React71.useMemo(() => tokenizeLines(code, lang), [code, lang]);
|
|
5268
|
+
const rawLines = React71.useMemo(() => code.split("\n"), [code]);
|
|
5269
|
+
const highlighted = React71.useMemo(() => parseHighlightLines(highlightLines), [highlightLines]);
|
|
5303
5270
|
const isDiff = variant === "diff";
|
|
5304
5271
|
const isTerminal = variant === "terminal";
|
|
5305
5272
|
const showCopy = copy && !isTerminal;
|
|
5306
5273
|
const overlayCopy = showCopy && !filename;
|
|
5307
5274
|
const contentWhitespace = scroll ? "whitespace-pre" : "whitespace-pre-wrap break-words";
|
|
5308
|
-
const pre = /* @__PURE__ */
|
|
5275
|
+
const pre = /* @__PURE__ */ jsx84(
|
|
5309
5276
|
"pre",
|
|
5310
5277
|
{
|
|
5311
5278
|
ref,
|
|
5312
5279
|
className: cn("py-4 font-mono text-xs leading-6 text-text-secondary", scroll && "overflow-x-auto", className),
|
|
5313
5280
|
...props,
|
|
5314
|
-
children: /* @__PURE__ */
|
|
5281
|
+
children: /* @__PURE__ */ jsx84("code", { className: "block min-w-full", children: lines.map((tokens, i) => {
|
|
5315
5282
|
const n = i + 1;
|
|
5316
5283
|
const raw = rawLines[i] ?? "";
|
|
5317
5284
|
const diffKind = isDiff ? raw[0] === "+" ? "add" : raw[0] === "-" ? "remove" : null : null;
|
|
5318
5285
|
const promptLen = isTerminal && raw[0] === "$" ? 1 : 0;
|
|
5319
5286
|
const markerDrop = diffKind ? 1 : promptLen;
|
|
5320
5287
|
const body = markerDrop ? dropLeading(tokens, markerDrop) : tokens;
|
|
5321
|
-
return /* @__PURE__ */
|
|
5288
|
+
return /* @__PURE__ */ jsxs54(
|
|
5322
5289
|
"span",
|
|
5323
5290
|
{
|
|
5324
5291
|
"data-line": n,
|
|
@@ -5331,8 +5298,8 @@ var CodeBlock = React72.forwardRef(
|
|
|
5331
5298
|
!diffKind && highlighted.has(n) && "bg-bg-brand-subtle"
|
|
5332
5299
|
),
|
|
5333
5300
|
children: [
|
|
5334
|
-
showLineNumbers && /* @__PURE__ */
|
|
5335
|
-
(isDiff || isTerminal) && /* @__PURE__ */
|
|
5301
|
+
showLineNumbers && /* @__PURE__ */ jsx84("span", { "aria-hidden": true, className: "mr-3 w-8 shrink-0 select-none text-right text-text-tertiary", children: n }),
|
|
5302
|
+
(isDiff || isTerminal) && /* @__PURE__ */ jsx84(
|
|
5336
5303
|
"span",
|
|
5337
5304
|
{
|
|
5338
5305
|
"aria-hidden": true,
|
|
@@ -5345,7 +5312,7 @@ var CodeBlock = React72.forwardRef(
|
|
|
5345
5312
|
children: diffKind === "add" ? "+" : diffKind === "remove" ? "-" : promptLen > 0 ? "$" : ""
|
|
5346
5313
|
}
|
|
5347
5314
|
),
|
|
5348
|
-
/* @__PURE__ */
|
|
5315
|
+
/* @__PURE__ */ jsx84("span", { className: cn("min-w-0 flex-1", contentWhitespace), children: body.length ? body.map((token, j) => /* @__PURE__ */ jsx84("span", { className: TOKEN_CLASS[token.kind], children: token.text }, j)) : "\xA0" })
|
|
5349
5316
|
]
|
|
5350
5317
|
},
|
|
5351
5318
|
i
|
|
@@ -5353,16 +5320,16 @@ var CodeBlock = React72.forwardRef(
|
|
|
5353
5320
|
}) })
|
|
5354
5321
|
}
|
|
5355
5322
|
);
|
|
5356
|
-
return /* @__PURE__ */
|
|
5357
|
-
filename && /* @__PURE__ */
|
|
5358
|
-
/* @__PURE__ */
|
|
5359
|
-
showCopy && /* @__PURE__ */
|
|
5323
|
+
return /* @__PURE__ */ jsxs54("div", { className: "relative overflow-hidden rounded-lg border border-border-subtle bg-bg-primary", children: [
|
|
5324
|
+
filename && /* @__PURE__ */ jsxs54("div", { className: "flex items-center justify-between gap-3 border-b border-border-subtle px-4 py-2", children: [
|
|
5325
|
+
/* @__PURE__ */ jsx84("span", { className: "font-mono text-xs text-text-tertiary", children: filename }),
|
|
5326
|
+
showCopy && /* @__PURE__ */ jsx84(CopyButton, { value: code, label: "Copy code", className: "size-7" })
|
|
5360
5327
|
] }),
|
|
5361
5328
|
pre,
|
|
5362
5329
|
overlayCopy && // Always visible, on every device: a copy control you have to hover to discover is a
|
|
5363
5330
|
// control most people never find. Opaque (`bg-bg-primary`, the block's own surface) so it
|
|
5364
5331
|
// reads cleanly where a long first line runs under it.
|
|
5365
|
-
/* @__PURE__ */
|
|
5332
|
+
/* @__PURE__ */ jsx84(
|
|
5366
5333
|
CopyButton,
|
|
5367
5334
|
{
|
|
5368
5335
|
value: code,
|
|
@@ -5374,7 +5341,7 @@ var CodeBlock = React72.forwardRef(
|
|
|
5374
5341
|
}
|
|
5375
5342
|
);
|
|
5376
5343
|
CodeBlock.displayName = "CodeBlock";
|
|
5377
|
-
var Code =
|
|
5344
|
+
var Code = React71.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx84(
|
|
5378
5345
|
"code",
|
|
5379
5346
|
{
|
|
5380
5347
|
ref,
|
|
@@ -5388,13 +5355,13 @@ var Code = React72.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */
|
|
|
5388
5355
|
Code.displayName = "Code";
|
|
5389
5356
|
|
|
5390
5357
|
// src/components/grid-overlay.tsx
|
|
5391
|
-
import * as
|
|
5392
|
-
import { jsx as
|
|
5358
|
+
import * as React72 from "react";
|
|
5359
|
+
import { jsx as jsx85 } from "react/jsx-runtime";
|
|
5393
5360
|
var BASELINE = "var(--grid-gutter) / 2";
|
|
5394
|
-
var GridOverlay =
|
|
5361
|
+
var GridOverlay = React72.forwardRef(
|
|
5395
5362
|
({ columns, baseline = false, className, style, ...props }, ref) => {
|
|
5396
5363
|
const count = Number.isFinite(columns) ? Math.max(1, Math.floor(columns)) : 1;
|
|
5397
|
-
return /* @__PURE__ */
|
|
5364
|
+
return /* @__PURE__ */ jsx85(
|
|
5398
5365
|
"div",
|
|
5399
5366
|
{
|
|
5400
5367
|
ref,
|
|
@@ -5411,7 +5378,7 @@ var GridOverlay = React73.forwardRef(
|
|
|
5411
5378
|
...style
|
|
5412
5379
|
},
|
|
5413
5380
|
...props,
|
|
5414
|
-
children: Array.from({ length: count }).map((_, i) => /* @__PURE__ */
|
|
5381
|
+
children: Array.from({ length: count }).map((_, i) => /* @__PURE__ */ jsx85("span", { style: { backgroundColor: "var(--bg-brand)", opacity: 0.1 } }, i))
|
|
5415
5382
|
}
|
|
5416
5383
|
);
|
|
5417
5384
|
}
|
|
@@ -5419,10 +5386,10 @@ var GridOverlay = React73.forwardRef(
|
|
|
5419
5386
|
GridOverlay.displayName = "GridOverlay";
|
|
5420
5387
|
|
|
5421
5388
|
// src/components/attachment-chip.tsx
|
|
5422
|
-
import * as
|
|
5389
|
+
import * as React73 from "react";
|
|
5423
5390
|
import { cva as cva8 } from "class-variance-authority";
|
|
5424
5391
|
import { Link2, Clock, Plus as Plus2 } from "lucide-react";
|
|
5425
|
-
import { jsx as
|
|
5392
|
+
import { jsx as jsx86, jsxs as jsxs55 } from "react/jsx-runtime";
|
|
5426
5393
|
var attachmentChipVariants = cva8(
|
|
5427
5394
|
"inline-flex items-center gap-1.5 rounded-lg border px-2.5 py-1 text-sm font-medium leading-tight",
|
|
5428
5395
|
{
|
|
@@ -5441,11 +5408,11 @@ var stateIcons = {
|
|
|
5441
5408
|
requested: Clock,
|
|
5442
5409
|
available: Plus2
|
|
5443
5410
|
};
|
|
5444
|
-
var AttachmentChip =
|
|
5411
|
+
var AttachmentChip = React73.forwardRef(
|
|
5445
5412
|
({ state, account, icon, hideIcon = false, className, ...props }, ref) => {
|
|
5446
5413
|
const Icon = icon ?? stateIcons[state ?? "attached"];
|
|
5447
|
-
return /* @__PURE__ */
|
|
5448
|
-
!hideIcon && /* @__PURE__ */
|
|
5414
|
+
return /* @__PURE__ */ jsxs55("span", { ref, className: cn(attachmentChipVariants({ state }), className), ...props, children: [
|
|
5415
|
+
!hideIcon && /* @__PURE__ */ jsx86(Icon, { className: "size-3.5 shrink-0 opacity-90", "aria-hidden": "true" }),
|
|
5449
5416
|
account
|
|
5450
5417
|
] });
|
|
5451
5418
|
}
|
|
@@ -5453,9 +5420,9 @@ var AttachmentChip = React74.forwardRef(
|
|
|
5453
5420
|
AttachmentChip.displayName = "AttachmentChip";
|
|
5454
5421
|
|
|
5455
5422
|
// src/components/connector-card.tsx
|
|
5456
|
-
import * as
|
|
5423
|
+
import * as React74 from "react";
|
|
5457
5424
|
import { AlertTriangle, ChevronDown as ChevronDown5 } from "lucide-react";
|
|
5458
|
-
import { Fragment as Fragment9, jsx as
|
|
5425
|
+
import { Fragment as Fragment9, jsx as jsx87, jsxs as jsxs56 } from "react/jsx-runtime";
|
|
5459
5426
|
var originLabels = {
|
|
5460
5427
|
org: "Attached by the organization",
|
|
5461
5428
|
product: "Attached by this product"
|
|
@@ -5468,7 +5435,7 @@ var statusLabels = {
|
|
|
5468
5435
|
function monogram(name) {
|
|
5469
5436
|
return name.replace(/[^a-zA-Z0-9 ]/g, " ").split(/\s+/).filter(Boolean).slice(0, 2).map((w) => w[0].toUpperCase()).join("");
|
|
5470
5437
|
}
|
|
5471
|
-
var ConnectorCard =
|
|
5438
|
+
var ConnectorCard = React74.forwardRef(
|
|
5472
5439
|
({
|
|
5473
5440
|
name,
|
|
5474
5441
|
kind,
|
|
@@ -5489,7 +5456,7 @@ var ConnectorCard = React75.forwardRef(
|
|
|
5489
5456
|
}, ref) => {
|
|
5490
5457
|
const connected = status !== "not-connected";
|
|
5491
5458
|
const label = statusLabel ?? statusLabels[status];
|
|
5492
|
-
const glyphBox = /* @__PURE__ */
|
|
5459
|
+
const glyphBox = /* @__PURE__ */ jsx87(
|
|
5493
5460
|
"div",
|
|
5494
5461
|
{
|
|
5495
5462
|
"aria-hidden": "true",
|
|
@@ -5497,48 +5464,48 @@ var ConnectorCard = React75.forwardRef(
|
|
|
5497
5464
|
children: glyph ?? monogram(name)
|
|
5498
5465
|
}
|
|
5499
5466
|
);
|
|
5500
|
-
const identity = /* @__PURE__ */
|
|
5501
|
-
/* @__PURE__ */
|
|
5502
|
-
(kind || origin) && /* @__PURE__ */
|
|
5503
|
-
kind && /* @__PURE__ */
|
|
5504
|
-
origin && /* @__PURE__ */
|
|
5467
|
+
const identity = /* @__PURE__ */ jsxs56("div", { className: "min-w-0", children: [
|
|
5468
|
+
/* @__PURE__ */ jsx87("p", { className: "truncate text-sm font-semibold text-text-primary", children: name }),
|
|
5469
|
+
(kind || origin) && /* @__PURE__ */ jsxs56("div", { className: "mt-0.5 flex flex-wrap gap-1", children: [
|
|
5470
|
+
kind && /* @__PURE__ */ jsx87(Badge, { variant: "secondary", children: kind }),
|
|
5471
|
+
origin && /* @__PURE__ */ jsx87(Badge, { variant: "outline", children: originLabels[origin] })
|
|
5505
5472
|
] })
|
|
5506
5473
|
] });
|
|
5507
|
-
const statusBadge = label ? /* @__PURE__ */
|
|
5508
|
-
const accessNote = access ? /* @__PURE__ */
|
|
5474
|
+
const statusBadge = label ? /* @__PURE__ */ jsx87(Badge, { variant: "status", children: label }) : null;
|
|
5475
|
+
const accessNote = access ? /* @__PURE__ */ jsxs56(
|
|
5509
5476
|
"div",
|
|
5510
5477
|
{
|
|
5511
5478
|
role: "note",
|
|
5512
5479
|
className: "flex items-start gap-2 border-t border-border-subtle bg-bg-secondary px-4 py-2.5 text-xs font-medium text-text-secondary",
|
|
5513
5480
|
children: [
|
|
5514
|
-
/* @__PURE__ */
|
|
5515
|
-
/* @__PURE__ */
|
|
5481
|
+
/* @__PURE__ */ jsx87(AlertTriangle, { className: "mt-0.5 size-3.5 shrink-0", "aria-hidden": "true" }),
|
|
5482
|
+
/* @__PURE__ */ jsx87("span", { children: access })
|
|
5516
5483
|
]
|
|
5517
5484
|
}
|
|
5518
5485
|
) : null;
|
|
5519
5486
|
const footerAction = collapsible ? action : connected && action;
|
|
5520
|
-
const footer = attachedCount !== void 0 || footerAction ? /* @__PURE__ */
|
|
5521
|
-
/* @__PURE__ */
|
|
5487
|
+
const footer = attachedCount !== void 0 || footerAction ? /* @__PURE__ */ jsxs56("div", { className: "flex items-center justify-between border-t border-border-subtle px-4 py-3", children: [
|
|
5488
|
+
/* @__PURE__ */ jsx87("span", { className: "text-sm text-text-secondary", children: attachedCount !== void 0 ? /* @__PURE__ */ jsxs56(Fragment9, { children: [
|
|
5522
5489
|
"Attached to ",
|
|
5523
|
-
/* @__PURE__ */
|
|
5490
|
+
/* @__PURE__ */ jsx87("span", { className: "font-semibold text-text-primary", children: attachedCount }),
|
|
5524
5491
|
" ",
|
|
5525
5492
|
attachedCount === 1 ? "product" : "products"
|
|
5526
|
-
] }) : /* @__PURE__ */
|
|
5493
|
+
] }) : /* @__PURE__ */ jsx87("span", { className: "text-text-tertiary", children: "Not attached to any product yet" }) }),
|
|
5527
5494
|
footerAction
|
|
5528
5495
|
] }) : null;
|
|
5529
|
-
const drawer = children ? /* @__PURE__ */
|
|
5496
|
+
const drawer = children ? /* @__PURE__ */ jsx87("div", { "data-slot": "drawer", className: "border-t border-border-subtle", children }) : null;
|
|
5530
5497
|
if (!collapsible) {
|
|
5531
|
-
return /* @__PURE__ */
|
|
5498
|
+
return /* @__PURE__ */ jsxs56(
|
|
5532
5499
|
Card,
|
|
5533
5500
|
{
|
|
5534
5501
|
ref,
|
|
5535
5502
|
className: cn(status === "not-connected" && "border-dashed border-border-default", className),
|
|
5536
5503
|
...props,
|
|
5537
5504
|
children: [
|
|
5538
|
-
/* @__PURE__ */
|
|
5505
|
+
/* @__PURE__ */ jsxs56("div", { className: "flex items-center gap-3 p-4", children: [
|
|
5539
5506
|
glyphBox,
|
|
5540
5507
|
identity,
|
|
5541
|
-
/* @__PURE__ */
|
|
5508
|
+
/* @__PURE__ */ jsx87("div", { className: "ml-auto shrink-0", children: connected ? statusBadge : action ?? statusBadge })
|
|
5542
5509
|
] }),
|
|
5543
5510
|
accessNote,
|
|
5544
5511
|
footer,
|
|
@@ -5547,7 +5514,7 @@ var ConnectorCard = React75.forwardRef(
|
|
|
5547
5514
|
}
|
|
5548
5515
|
);
|
|
5549
5516
|
}
|
|
5550
|
-
return /* @__PURE__ */
|
|
5517
|
+
return /* @__PURE__ */ jsx87(Collapsible, { defaultOpen, open, onOpenChange, children: /* @__PURE__ */ jsxs56(
|
|
5551
5518
|
Card,
|
|
5552
5519
|
{
|
|
5553
5520
|
ref,
|
|
@@ -5558,7 +5525,7 @@ var ConnectorCard = React75.forwardRef(
|
|
|
5558
5525
|
),
|
|
5559
5526
|
...props,
|
|
5560
5527
|
children: [
|
|
5561
|
-
/* @__PURE__ */
|
|
5528
|
+
/* @__PURE__ */ jsx87(CollapsibleTrigger2, { asChild: true, children: /* @__PURE__ */ jsxs56(
|
|
5562
5529
|
"button",
|
|
5563
5530
|
{
|
|
5564
5531
|
type: "button",
|
|
@@ -5566,9 +5533,9 @@ var ConnectorCard = React75.forwardRef(
|
|
|
5566
5533
|
children: [
|
|
5567
5534
|
glyphBox,
|
|
5568
5535
|
identity,
|
|
5569
|
-
/* @__PURE__ */
|
|
5536
|
+
/* @__PURE__ */ jsxs56("div", { className: "ml-auto flex shrink-0 items-center gap-2", children: [
|
|
5570
5537
|
statusBadge,
|
|
5571
|
-
/* @__PURE__ */
|
|
5538
|
+
/* @__PURE__ */ jsx87(
|
|
5572
5539
|
ChevronDown5,
|
|
5573
5540
|
{
|
|
5574
5541
|
"aria-hidden": "true",
|
|
@@ -5579,7 +5546,7 @@ var ConnectorCard = React75.forwardRef(
|
|
|
5579
5546
|
]
|
|
5580
5547
|
}
|
|
5581
5548
|
) }),
|
|
5582
|
-
/* @__PURE__ */
|
|
5549
|
+
/* @__PURE__ */ jsxs56(CollapsibleContent2, { children: [
|
|
5583
5550
|
accessNote,
|
|
5584
5551
|
footer,
|
|
5585
5552
|
drawer
|
|
@@ -5592,33 +5559,33 @@ var ConnectorCard = React75.forwardRef(
|
|
|
5592
5559
|
ConnectorCard.displayName = "ConnectorCard";
|
|
5593
5560
|
|
|
5594
5561
|
// src/components/request-row.tsx
|
|
5595
|
-
import * as
|
|
5596
|
-
import { Fragment as Fragment10, jsx as
|
|
5562
|
+
import * as React75 from "react";
|
|
5563
|
+
import { Fragment as Fragment10, jsx as jsx88, jsxs as jsxs57 } from "react/jsx-runtime";
|
|
5597
5564
|
function monogram2(name) {
|
|
5598
5565
|
return name.replace(/[^a-zA-Z0-9 ]/g, " ").split(/\s+/).filter(Boolean).slice(0, 2).map((w) => w[0].toUpperCase()).join("");
|
|
5599
5566
|
}
|
|
5600
|
-
var RequestRow =
|
|
5567
|
+
var RequestRow = React75.forwardRef(
|
|
5601
5568
|
({ surface, name, state, glyph, subtitle, account, onApprove, onDeny, onRequest, onRevoke, action, className, ...props }, ref) => {
|
|
5602
5569
|
let controls = action;
|
|
5603
5570
|
if (controls === void 0) {
|
|
5604
5571
|
if (surface === "org" && state === "pending") {
|
|
5605
|
-
controls = /* @__PURE__ */
|
|
5606
|
-
/* @__PURE__ */
|
|
5607
|
-
/* @__PURE__ */
|
|
5572
|
+
controls = /* @__PURE__ */ jsxs57(Fragment10, { children: [
|
|
5573
|
+
/* @__PURE__ */ jsx88(Button, { variant: "ghost", size: "sm", onClick: onDeny, children: "Deny" }),
|
|
5574
|
+
/* @__PURE__ */ jsx88(Button, { variant: "outline", size: "sm", onClick: onApprove, children: "Approve" })
|
|
5608
5575
|
] });
|
|
5609
5576
|
} else if (state === "sent") {
|
|
5610
|
-
controls = /* @__PURE__ */
|
|
5577
|
+
controls = /* @__PURE__ */ jsx88(Button, { variant: "destructive-ghost", size: "sm", onClick: onRevoke, children: "Revoke" });
|
|
5611
5578
|
} else if (state === "available") {
|
|
5612
|
-
controls = /* @__PURE__ */
|
|
5579
|
+
controls = /* @__PURE__ */ jsx88(Button, { variant: "outline", size: "sm", onClick: onRequest, children: "Request" });
|
|
5613
5580
|
} else if (state === "pending") {
|
|
5614
|
-
controls = /* @__PURE__ */
|
|
5581
|
+
controls = /* @__PURE__ */ jsx88(Badge, { variant: "status", children: "Requested" });
|
|
5615
5582
|
} else if (state === "denied") {
|
|
5616
|
-
controls = /* @__PURE__ */
|
|
5583
|
+
controls = /* @__PURE__ */ jsx88(Badge, { variant: "status", children: "Denied" });
|
|
5617
5584
|
} else if (state === "attached") {
|
|
5618
|
-
controls = account ? /* @__PURE__ */
|
|
5585
|
+
controls = account ? /* @__PURE__ */ jsx88(AttachmentChip, { state: "attached", account }) : /* @__PURE__ */ jsx88(Badge, { variant: "status", children: "In use" });
|
|
5619
5586
|
}
|
|
5620
5587
|
}
|
|
5621
|
-
return /* @__PURE__ */
|
|
5588
|
+
return /* @__PURE__ */ jsxs57(
|
|
5622
5589
|
"div",
|
|
5623
5590
|
{
|
|
5624
5591
|
ref,
|
|
@@ -5628,7 +5595,7 @@ var RequestRow = React76.forwardRef(
|
|
|
5628
5595
|
),
|
|
5629
5596
|
...props,
|
|
5630
5597
|
children: [
|
|
5631
|
-
/* @__PURE__ */
|
|
5598
|
+
/* @__PURE__ */ jsx88(
|
|
5632
5599
|
"div",
|
|
5633
5600
|
{
|
|
5634
5601
|
"aria-hidden": "true",
|
|
@@ -5636,11 +5603,11 @@ var RequestRow = React76.forwardRef(
|
|
|
5636
5603
|
children: glyph ?? monogram2(name)
|
|
5637
5604
|
}
|
|
5638
5605
|
),
|
|
5639
|
-
/* @__PURE__ */
|
|
5640
|
-
/* @__PURE__ */
|
|
5641
|
-
subtitle && /* @__PURE__ */
|
|
5606
|
+
/* @__PURE__ */ jsxs57("div", { className: "min-w-0", children: [
|
|
5607
|
+
/* @__PURE__ */ jsx88("p", { className: "truncate text-sm font-semibold text-text-primary", children: name }),
|
|
5608
|
+
subtitle && /* @__PURE__ */ jsx88("p", { className: "truncate text-xs text-text-tertiary", children: subtitle })
|
|
5642
5609
|
] }),
|
|
5643
|
-
/* @__PURE__ */
|
|
5610
|
+
/* @__PURE__ */ jsx88("div", { className: "ml-auto flex shrink-0 items-center gap-2", children: controls })
|
|
5644
5611
|
]
|
|
5645
5612
|
}
|
|
5646
5613
|
);
|
|
@@ -5649,9 +5616,9 @@ var RequestRow = React76.forwardRef(
|
|
|
5649
5616
|
RequestRow.displayName = "RequestRow";
|
|
5650
5617
|
|
|
5651
5618
|
// src/components/feedback-button.tsx
|
|
5652
|
-
import * as
|
|
5619
|
+
import * as React76 from "react";
|
|
5653
5620
|
import { MessageSquare, Loader2 as Loader23, CheckCircle2 } from "lucide-react";
|
|
5654
|
-
import { jsx as
|
|
5621
|
+
import { jsx as jsx89, jsxs as jsxs58 } from "react/jsx-runtime";
|
|
5655
5622
|
var TITLE_MAX = 256;
|
|
5656
5623
|
var DETAILS_MAX = 65536;
|
|
5657
5624
|
var DEFAULT_LABELS = {
|
|
@@ -5665,15 +5632,15 @@ var DEFAULT_LABELS = {
|
|
|
5665
5632
|
};
|
|
5666
5633
|
function FeedbackButton({ onSubmit, labels, className }) {
|
|
5667
5634
|
const l = { ...DEFAULT_LABELS, ...labels };
|
|
5668
|
-
const uid =
|
|
5635
|
+
const uid = React76.useId();
|
|
5669
5636
|
const titleId = `${uid}-title`;
|
|
5670
5637
|
const detailsId = `${uid}-details`;
|
|
5671
5638
|
const titleErrId = `${uid}-title-error`;
|
|
5672
5639
|
const detailsErrId = `${uid}-details-error`;
|
|
5673
|
-
const [open, setOpen] =
|
|
5674
|
-
const [status, setStatus] =
|
|
5675
|
-
const [title, setTitle] =
|
|
5676
|
-
const [details, setDetails] =
|
|
5640
|
+
const [open, setOpen] = React76.useState(false);
|
|
5641
|
+
const [status, setStatus] = React76.useState("idle");
|
|
5642
|
+
const [title, setTitle] = React76.useState("");
|
|
5643
|
+
const [details, setDetails] = React76.useState("");
|
|
5677
5644
|
const titleTooLong = title.length > TITLE_MAX;
|
|
5678
5645
|
const detailsTooLong = details.length > DETAILS_MAX;
|
|
5679
5646
|
const titleEmpty = title.trim().length === 0;
|
|
@@ -5698,20 +5665,20 @@ function FeedbackButton({ onSubmit, labels, className }) {
|
|
|
5698
5665
|
setStatus("error");
|
|
5699
5666
|
}
|
|
5700
5667
|
};
|
|
5701
|
-
return /* @__PURE__ */
|
|
5702
|
-
/* @__PURE__ */
|
|
5703
|
-
/* @__PURE__ */
|
|
5668
|
+
return /* @__PURE__ */ jsxs58(Popover, { open, onOpenChange: changeOpen, children: [
|
|
5669
|
+
/* @__PURE__ */ jsx89(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsxs58(Button, { variant: "ghost", size: "sm", "aria-label": l.trigger, className, children: [
|
|
5670
|
+
/* @__PURE__ */ jsx89(MessageSquare, { className: "size-4", "aria-hidden": "true" }),
|
|
5704
5671
|
l.trigger
|
|
5705
5672
|
] }) }),
|
|
5706
|
-
/* @__PURE__ */
|
|
5707
|
-
/* @__PURE__ */
|
|
5708
|
-
/* @__PURE__ */
|
|
5709
|
-
/* @__PURE__ */
|
|
5710
|
-
] }) : /* @__PURE__ */
|
|
5711
|
-
/* @__PURE__ */
|
|
5712
|
-
/* @__PURE__ */
|
|
5713
|
-
/* @__PURE__ */
|
|
5714
|
-
/* @__PURE__ */
|
|
5673
|
+
/* @__PURE__ */ jsx89(PopoverContent, { align: "end", side: "bottom", className: "w-80", children: status === "success" ? /* @__PURE__ */ jsxs58("div", { className: "flex flex-col items-center gap-3 py-2 text-center", children: [
|
|
5674
|
+
/* @__PURE__ */ jsx89(CheckCircle2, { className: "size-8 text-text-success", "aria-hidden": "true" }),
|
|
5675
|
+
/* @__PURE__ */ jsx89("p", { role: "status", className: "text-sm text-text-primary", children: l.success }),
|
|
5676
|
+
/* @__PURE__ */ jsx89(Button, { variant: "outline", size: "sm", onClick: () => changeOpen(false), children: "Close" })
|
|
5677
|
+
] }) : /* @__PURE__ */ jsxs58("form", { onSubmit: handleSubmit, className: "flex flex-col gap-3", children: [
|
|
5678
|
+
/* @__PURE__ */ jsx89("p", { className: "text-sm font-medium text-text-primary", children: l.title }),
|
|
5679
|
+
/* @__PURE__ */ jsxs58("div", { className: "flex flex-col gap-1.5", children: [
|
|
5680
|
+
/* @__PURE__ */ jsx89(Label2, { htmlFor: titleId, children: l.titleField }),
|
|
5681
|
+
/* @__PURE__ */ jsx89(
|
|
5715
5682
|
Input,
|
|
5716
5683
|
{
|
|
5717
5684
|
id: titleId,
|
|
@@ -5722,16 +5689,16 @@ function FeedbackButton({ onSubmit, labels, className }) {
|
|
|
5722
5689
|
"aria-describedby": titleTooLong ? titleErrId : void 0
|
|
5723
5690
|
}
|
|
5724
5691
|
),
|
|
5725
|
-
titleTooLong && /* @__PURE__ */
|
|
5692
|
+
titleTooLong && /* @__PURE__ */ jsxs58("p", { id: titleErrId, className: "text-xs text-text-danger", children: [
|
|
5726
5693
|
l.titleField,
|
|
5727
5694
|
" must be ",
|
|
5728
5695
|
TITLE_MAX,
|
|
5729
5696
|
" characters or fewer."
|
|
5730
5697
|
] })
|
|
5731
5698
|
] }),
|
|
5732
|
-
/* @__PURE__ */
|
|
5733
|
-
/* @__PURE__ */
|
|
5734
|
-
/* @__PURE__ */
|
|
5699
|
+
/* @__PURE__ */ jsxs58("div", { className: "flex flex-col gap-1.5", children: [
|
|
5700
|
+
/* @__PURE__ */ jsx89(Label2, { htmlFor: detailsId, children: l.detailsField }),
|
|
5701
|
+
/* @__PURE__ */ jsx89(
|
|
5735
5702
|
Textarea,
|
|
5736
5703
|
{
|
|
5737
5704
|
id: detailsId,
|
|
@@ -5742,16 +5709,16 @@ function FeedbackButton({ onSubmit, labels, className }) {
|
|
|
5742
5709
|
"aria-describedby": detailsTooLong ? detailsErrId : void 0
|
|
5743
5710
|
}
|
|
5744
5711
|
),
|
|
5745
|
-
detailsTooLong && /* @__PURE__ */
|
|
5712
|
+
detailsTooLong && /* @__PURE__ */ jsxs58("p", { id: detailsErrId, className: "text-xs text-text-danger", children: [
|
|
5746
5713
|
l.detailsField,
|
|
5747
5714
|
" must be ",
|
|
5748
5715
|
DETAILS_MAX,
|
|
5749
5716
|
" characters or fewer."
|
|
5750
5717
|
] })
|
|
5751
5718
|
] }),
|
|
5752
|
-
status === "error" && /* @__PURE__ */
|
|
5753
|
-
/* @__PURE__ */
|
|
5754
|
-
submitting && /* @__PURE__ */
|
|
5719
|
+
status === "error" && /* @__PURE__ */ jsx89(InlineError, { children: l.error }),
|
|
5720
|
+
/* @__PURE__ */ jsxs58(Button, { type: "submit", disabled: !valid || submitting, children: [
|
|
5721
|
+
submitting && /* @__PURE__ */ jsx89(Loader23, { className: "size-4 animate-spin", "aria-hidden": "true" }),
|
|
5755
5722
|
l.submit
|
|
5756
5723
|
] })
|
|
5757
5724
|
] }) })
|
|
@@ -5807,27 +5774,27 @@ function isNotificationSettled(item) {
|
|
|
5807
5774
|
}
|
|
5808
5775
|
|
|
5809
5776
|
// src/components/notification-bell.tsx
|
|
5810
|
-
import * as
|
|
5777
|
+
import * as React78 from "react";
|
|
5811
5778
|
import { BellRing, Settings } from "lucide-react";
|
|
5812
5779
|
|
|
5813
5780
|
// src/components/notification-row.tsx
|
|
5814
|
-
import * as
|
|
5781
|
+
import * as React77 from "react";
|
|
5815
5782
|
|
|
5816
5783
|
// src/components/notification-parts.tsx
|
|
5817
5784
|
import { Check as Check10 } from "lucide-react";
|
|
5818
|
-
import { jsx as
|
|
5785
|
+
import { jsx as jsx90 } from "react/jsx-runtime";
|
|
5819
5786
|
var rowControlHitArea = "relative after:absolute after:-inset-x-2 after:-top-1.5 after:-bottom-2.5";
|
|
5820
5787
|
function rowControlName(label, title) {
|
|
5821
5788
|
return `${label} "${title}"`;
|
|
5822
5789
|
}
|
|
5823
5790
|
function MarkReadButton({ title, onClick }) {
|
|
5824
5791
|
const label = `Mark "${title}" as read`;
|
|
5825
|
-
return /* @__PURE__ */
|
|
5792
|
+
return /* @__PURE__ */ jsx90(
|
|
5826
5793
|
Button,
|
|
5827
5794
|
{
|
|
5828
5795
|
variant: "ghost",
|
|
5829
5796
|
size: "xs",
|
|
5830
|
-
icon: /* @__PURE__ */
|
|
5797
|
+
icon: /* @__PURE__ */ jsx90(Check10, {}),
|
|
5831
5798
|
"aria-label": label,
|
|
5832
5799
|
onClick,
|
|
5833
5800
|
className: "relative text-text-secondary after:absolute after:-inset-3 hover:text-text-primary"
|
|
@@ -5841,12 +5808,12 @@ function DeepLinkControl({
|
|
|
5841
5808
|
onClick
|
|
5842
5809
|
}) {
|
|
5843
5810
|
const name = rowControlName(link.label, title);
|
|
5844
|
-
return link.href ? /* @__PURE__ */
|
|
5811
|
+
return link.href ? /* @__PURE__ */ jsx90("a", { href: link.href, "aria-label": name, onClick, className, children: link.label }) : /* @__PURE__ */ jsx90("button", { type: "button", "aria-label": name, onClick, className: cn("cursor-pointer", className), children: link.label });
|
|
5845
5812
|
}
|
|
5846
5813
|
|
|
5847
5814
|
// src/components/notification-row.tsx
|
|
5848
|
-
import { jsx as
|
|
5849
|
-
var NotificationRow =
|
|
5815
|
+
import { jsx as jsx91, jsxs as jsxs59 } from "react/jsx-runtime";
|
|
5816
|
+
var NotificationRow = React77.forwardRef(
|
|
5850
5817
|
({ item, onItemClick, onActionClick, onMarkRead, formatAge, className, ...props }, ref) => {
|
|
5851
5818
|
const settled = isNotificationSettled(item);
|
|
5852
5819
|
const unread = !settled && !item.read;
|
|
@@ -5858,20 +5825,20 @@ var NotificationRow = React78.forwardRef(
|
|
|
5858
5825
|
// Three steps of one ladder, and every one of them a token a reader can read:
|
|
5859
5826
|
// unread is the loudest, read is quieter, settled is quietest. An opacity is
|
|
5860
5827
|
// not a step — it drags the text under the contrast floor with the row.
|
|
5861
|
-
/* @__PURE__ */
|
|
5828
|
+
/* @__PURE__ */ jsxs59(
|
|
5862
5829
|
"div",
|
|
5863
5830
|
{
|
|
5864
5831
|
ref,
|
|
5865
5832
|
className: cn("group rounded-lg bg-bg-surface px-3 py-2.5", className),
|
|
5866
5833
|
...props,
|
|
5867
5834
|
children: [
|
|
5868
|
-
/* @__PURE__ */
|
|
5869
|
-
/* @__PURE__ */
|
|
5870
|
-
/* @__PURE__ */
|
|
5871
|
-
/* @__PURE__ */
|
|
5835
|
+
/* @__PURE__ */ jsxs59("div", { className: "flex items-start gap-2.5", children: [
|
|
5836
|
+
/* @__PURE__ */ jsxs59("div", { className: "min-w-0 flex-1", children: [
|
|
5837
|
+
/* @__PURE__ */ jsxs59("p", { className: "truncate text-xs text-text-tertiary", children: [
|
|
5838
|
+
/* @__PURE__ */ jsx91("span", { className: "font-semibold", children: item.source }),
|
|
5872
5839
|
item.receipt ? `, ${item.receipt}` : ""
|
|
5873
5840
|
] }),
|
|
5874
|
-
/* @__PURE__ */
|
|
5841
|
+
/* @__PURE__ */ jsx91(
|
|
5875
5842
|
"button",
|
|
5876
5843
|
{
|
|
5877
5844
|
type: "button",
|
|
@@ -5883,7 +5850,7 @@ var NotificationRow = React78.forwardRef(
|
|
|
5883
5850
|
children: item.title
|
|
5884
5851
|
}
|
|
5885
5852
|
),
|
|
5886
|
-
item.body && /* @__PURE__ */
|
|
5853
|
+
item.body && /* @__PURE__ */ jsx91(
|
|
5887
5854
|
"p",
|
|
5888
5855
|
{
|
|
5889
5856
|
className: cn(
|
|
@@ -5894,15 +5861,15 @@ var NotificationRow = React78.forwardRef(
|
|
|
5894
5861
|
}
|
|
5895
5862
|
)
|
|
5896
5863
|
] }),
|
|
5897
|
-
(age || markable) && /* @__PURE__ */
|
|
5898
|
-
stamp && age && /* @__PURE__ */
|
|
5899
|
-
markable && /* @__PURE__ */
|
|
5864
|
+
(age || markable) && /* @__PURE__ */ jsxs59("div", { className: "mt-px flex shrink-0 items-center gap-1", children: [
|
|
5865
|
+
stamp && age && /* @__PURE__ */ jsx91("time", { dateTime: toDateTimeAttribute(stamp), className: "text-xs text-text-tertiary", children: age }),
|
|
5866
|
+
markable && /* @__PURE__ */ jsx91(MarkReadButton, { title: item.title, onClick: () => onMarkRead(item.id) })
|
|
5900
5867
|
] })
|
|
5901
5868
|
] }),
|
|
5902
|
-
(actions.length > 0 || item.deepLink) && /* @__PURE__ */
|
|
5869
|
+
(actions.length > 0 || item.deepLink) && /* @__PURE__ */ jsxs59("div", { className: "mt-2 flex flex-wrap items-center gap-x-4 gap-y-2", children: [
|
|
5903
5870
|
actions.map((action) => {
|
|
5904
5871
|
const chip = action.variant === "primary" || action.variant === "destructive";
|
|
5905
|
-
return /* @__PURE__ */
|
|
5872
|
+
return /* @__PURE__ */ jsx91(
|
|
5906
5873
|
"button",
|
|
5907
5874
|
{
|
|
5908
5875
|
type: "button",
|
|
@@ -5920,7 +5887,7 @@ var NotificationRow = React78.forwardRef(
|
|
|
5920
5887
|
action.id
|
|
5921
5888
|
);
|
|
5922
5889
|
}),
|
|
5923
|
-
item.deepLink && /* @__PURE__ */
|
|
5890
|
+
item.deepLink && /* @__PURE__ */ jsx91(
|
|
5924
5891
|
DeepLinkControl,
|
|
5925
5892
|
{
|
|
5926
5893
|
link: item.deepLink,
|
|
@@ -5942,8 +5909,8 @@ var NotificationRow = React78.forwardRef(
|
|
|
5942
5909
|
NotificationRow.displayName = "NotificationRow";
|
|
5943
5910
|
|
|
5944
5911
|
// src/components/notification-bell.tsx
|
|
5945
|
-
import { jsx as
|
|
5946
|
-
var NotificationBell =
|
|
5912
|
+
import { jsx as jsx92, jsxs as jsxs60 } from "react/jsx-runtime";
|
|
5913
|
+
var NotificationBell = React78.forwardRef(
|
|
5947
5914
|
({
|
|
5948
5915
|
items,
|
|
5949
5916
|
unreadCount,
|
|
@@ -5963,8 +5930,8 @@ var NotificationBell = React79.forwardRef(
|
|
|
5963
5930
|
const unread = unreadCount ?? items.filter((n) => !n.read && n.cls !== "ephemeral").length;
|
|
5964
5931
|
const rows = items.slice(0, maxItems);
|
|
5965
5932
|
const hidden = items.length - rows.length;
|
|
5966
|
-
return /* @__PURE__ */
|
|
5967
|
-
/* @__PURE__ */
|
|
5933
|
+
return /* @__PURE__ */ jsxs60(Popover, { open, onOpenChange, children: [
|
|
5934
|
+
/* @__PURE__ */ jsx92(PopoverTrigger, { asChild: true, children: /* @__PURE__ */ jsxs60(
|
|
5968
5935
|
"button",
|
|
5969
5936
|
{
|
|
5970
5937
|
ref,
|
|
@@ -5976,12 +5943,12 @@ var NotificationBell = React79.forwardRef(
|
|
|
5976
5943
|
className
|
|
5977
5944
|
),
|
|
5978
5945
|
children: [
|
|
5979
|
-
/* @__PURE__ */
|
|
5980
|
-
unread > 0 && /* @__PURE__ */
|
|
5946
|
+
/* @__PURE__ */ jsx92(BellRing, { "aria-hidden": "true" }),
|
|
5947
|
+
unread > 0 && /* @__PURE__ */ jsx92("span", { className: "absolute -right-1.5 -top-1.5 flex size-[17px] items-center justify-center rounded-full bg-bg-brand text-xs font-bold leading-none text-text-on-brand ring-2 ring-bg-surface", children: unread })
|
|
5981
5948
|
]
|
|
5982
5949
|
}
|
|
5983
5950
|
) }),
|
|
5984
|
-
/* @__PURE__ */
|
|
5951
|
+
/* @__PURE__ */ jsxs60(
|
|
5985
5952
|
PopoverContent,
|
|
5986
5953
|
{
|
|
5987
5954
|
align: "end",
|
|
@@ -5992,10 +5959,10 @@ var NotificationBell = React79.forwardRef(
|
|
|
5992
5959
|
},
|
|
5993
5960
|
className: "flex w-[380px] flex-col overflow-hidden p-0",
|
|
5994
5961
|
children: [
|
|
5995
|
-
/* @__PURE__ */
|
|
5996
|
-
/* @__PURE__ */
|
|
5997
|
-
/* @__PURE__ */
|
|
5998
|
-
unread === 0 ? /* @__PURE__ */
|
|
5962
|
+
/* @__PURE__ */ jsxs60("div", { className: "flex shrink-0 items-center justify-between px-5 py-3", children: [
|
|
5963
|
+
/* @__PURE__ */ jsx92("span", { className: "text-sm font-bold text-text-primary", children: "Notification center" }),
|
|
5964
|
+
/* @__PURE__ */ jsxs60("div", { className: "flex items-center gap-3", children: [
|
|
5965
|
+
unread === 0 ? /* @__PURE__ */ jsx92("span", { className: "text-sm font-medium text-text-tertiary", children: "All read" }) : /* @__PURE__ */ jsx92(
|
|
5999
5966
|
"button",
|
|
6000
5967
|
{
|
|
6001
5968
|
type: "button",
|
|
@@ -6004,19 +5971,19 @@ var NotificationBell = React79.forwardRef(
|
|
|
6004
5971
|
children: "Mark all read"
|
|
6005
5972
|
}
|
|
6006
5973
|
),
|
|
6007
|
-
onOpenSettings && /* @__PURE__ */
|
|
5974
|
+
onOpenSettings && /* @__PURE__ */ jsx92(
|
|
6008
5975
|
"button",
|
|
6009
5976
|
{
|
|
6010
5977
|
type: "button",
|
|
6011
5978
|
"aria-label": "Notification settings",
|
|
6012
5979
|
onClick: () => onOpenSettings(),
|
|
6013
5980
|
className: "flex size-6 cursor-pointer items-center justify-center rounded-md text-text-tertiary transition-colors duration-fast hover:bg-bg-surface hover:text-text-primary",
|
|
6014
|
-
children: /* @__PURE__ */
|
|
5981
|
+
children: /* @__PURE__ */ jsx92(Settings, { className: "size-[15px]", "aria-hidden": "true" })
|
|
6015
5982
|
}
|
|
6016
5983
|
)
|
|
6017
5984
|
] })
|
|
6018
5985
|
] }),
|
|
6019
|
-
/* @__PURE__ */
|
|
5986
|
+
/* @__PURE__ */ jsx92("div", { className: "min-h-0 flex-1 space-y-1.5 overflow-y-auto px-2 pb-2", children: rows.length === 0 ? /* @__PURE__ */ jsx92("p", { className: "px-3 py-12 text-center text-xs leading-relaxed text-text-tertiary", children: "Nothing yet. Everything addressed to you lands here." }) : rows.map((item) => /* @__PURE__ */ jsx92(
|
|
6020
5987
|
NotificationRow,
|
|
6021
5988
|
{
|
|
6022
5989
|
item,
|
|
@@ -6027,8 +5994,8 @@ var NotificationBell = React79.forwardRef(
|
|
|
6027
5994
|
},
|
|
6028
5995
|
item.id
|
|
6029
5996
|
)) }),
|
|
6030
|
-
footer != null && /* @__PURE__ */
|
|
6031
|
-
items.length > 0 && onOpenArchive && /* @__PURE__ */
|
|
5997
|
+
footer != null && /* @__PURE__ */ jsx92("div", { className: "shrink-0 px-5 py-2.5 text-xs text-text-tertiary", children: footer }),
|
|
5998
|
+
items.length > 0 && onOpenArchive && /* @__PURE__ */ jsx92(
|
|
6032
5999
|
"button",
|
|
6033
6000
|
{
|
|
6034
6001
|
type: "button",
|
|
@@ -6046,9 +6013,9 @@ var NotificationBell = React79.forwardRef(
|
|
|
6046
6013
|
NotificationBell.displayName = "NotificationBell";
|
|
6047
6014
|
|
|
6048
6015
|
// src/components/notification-center.tsx
|
|
6049
|
-
import * as
|
|
6016
|
+
import * as React79 from "react";
|
|
6050
6017
|
import { Check as Check11, Search as Search4 } from "lucide-react";
|
|
6051
|
-
import { jsx as
|
|
6018
|
+
import { jsx as jsx93, jsxs as jsxs61 } from "react/jsx-runtime";
|
|
6052
6019
|
var chipBase = "cursor-pointer rounded-md px-3 py-1.5 text-sm font-medium transition-colors duration-fast";
|
|
6053
6020
|
var chipOn = "bg-bg-sunken font-semibold text-text-primary";
|
|
6054
6021
|
var chipOff = "bg-bg-elevated text-text-secondary hover:text-text-primary";
|
|
@@ -6063,12 +6030,12 @@ function CenterRow({
|
|
|
6063
6030
|
const markable = Boolean(onMarkRead) && unread && item.cls !== "ephemeral";
|
|
6064
6031
|
const stamp = item.createdAt ? item.createdAt instanceof Date ? item.createdAt : new Date(item.createdAt) : null;
|
|
6065
6032
|
const age = stamp ? formatAge(stamp) : null;
|
|
6066
|
-
return /* @__PURE__ */
|
|
6067
|
-
/* @__PURE__ */
|
|
6068
|
-
/* @__PURE__ */
|
|
6069
|
-
/* @__PURE__ */
|
|
6070
|
-
(age || markable) && /* @__PURE__ */
|
|
6071
|
-
stamp && age && /* @__PURE__ */
|
|
6033
|
+
return /* @__PURE__ */ jsxs61("article", { className: "group rounded-lg bg-bg-elevated px-4 py-3", children: [
|
|
6034
|
+
/* @__PURE__ */ jsxs61("div", { className: "flex items-center gap-2", children: [
|
|
6035
|
+
/* @__PURE__ */ jsx93("span", { className: "text-xs font-semibold text-text-tertiary", children: item.source }),
|
|
6036
|
+
/* @__PURE__ */ jsx93(Badge, { variant: severityBadgeVariant(item.severity), children: severityLabels[item.severity] }),
|
|
6037
|
+
(age || markable) && /* @__PURE__ */ jsxs61("div", { className: "ml-auto flex shrink-0 items-center gap-1.5", children: [
|
|
6038
|
+
stamp && age && /* @__PURE__ */ jsx93(
|
|
6072
6039
|
"time",
|
|
6073
6040
|
{
|
|
6074
6041
|
dateTime: toDateTimeAttribute(stamp),
|
|
@@ -6076,10 +6043,10 @@ function CenterRow({
|
|
|
6076
6043
|
children: age
|
|
6077
6044
|
}
|
|
6078
6045
|
),
|
|
6079
|
-
markable && /* @__PURE__ */
|
|
6046
|
+
markable && /* @__PURE__ */ jsx93(MarkReadButton, { title: item.title, onClick: () => onMarkRead(item.id) })
|
|
6080
6047
|
] })
|
|
6081
6048
|
] }),
|
|
6082
|
-
/* @__PURE__ */
|
|
6049
|
+
/* @__PURE__ */ jsx93(
|
|
6083
6050
|
"button",
|
|
6084
6051
|
{
|
|
6085
6052
|
type: "button",
|
|
@@ -6091,13 +6058,13 @@ function CenterRow({
|
|
|
6091
6058
|
children: item.title
|
|
6092
6059
|
}
|
|
6093
6060
|
),
|
|
6094
|
-
item.body && /* @__PURE__ */
|
|
6095
|
-
(item.receipt || item.deepLink) && /* @__PURE__ */
|
|
6096
|
-
item.receipt && /* @__PURE__ */
|
|
6097
|
-
/* @__PURE__ */
|
|
6061
|
+
item.body && /* @__PURE__ */ jsx93("p", { className: "mt-0.5 text-sm leading-snug text-text-secondary", children: item.body }),
|
|
6062
|
+
(item.receipt || item.deepLink) && /* @__PURE__ */ jsxs61("div", { className: "mt-2 flex flex-wrap items-center gap-x-4 gap-y-1.5", children: [
|
|
6063
|
+
item.receipt && /* @__PURE__ */ jsxs61("span", { className: "inline-flex items-center gap-1.5 text-sm text-text-tertiary", children: [
|
|
6064
|
+
/* @__PURE__ */ jsx93(Check11, { className: "size-3 shrink-0 text-text-success", "aria-hidden": "true" }),
|
|
6098
6065
|
item.receipt
|
|
6099
6066
|
] }),
|
|
6100
|
-
item.deepLink && /* @__PURE__ */
|
|
6067
|
+
item.deepLink && /* @__PURE__ */ jsx93(
|
|
6101
6068
|
DeepLinkControl,
|
|
6102
6069
|
{
|
|
6103
6070
|
link: item.deepLink,
|
|
@@ -6112,7 +6079,7 @@ function CenterRow({
|
|
|
6112
6079
|
] })
|
|
6113
6080
|
] });
|
|
6114
6081
|
}
|
|
6115
|
-
var NotificationCenter =
|
|
6082
|
+
var NotificationCenter = React79.forwardRef(
|
|
6116
6083
|
({
|
|
6117
6084
|
items,
|
|
6118
6085
|
header = true,
|
|
@@ -6129,16 +6096,16 @@ var NotificationCenter = React80.forwardRef(
|
|
|
6129
6096
|
formatAge,
|
|
6130
6097
|
className
|
|
6131
6098
|
}, ref) => {
|
|
6132
|
-
const [status, setStatus] =
|
|
6133
|
-
const [source, setSource] =
|
|
6134
|
-
const [product, setProduct] =
|
|
6135
|
-
const [query, setQuery] =
|
|
6136
|
-
const [limit, setLimit] =
|
|
6137
|
-
const age =
|
|
6099
|
+
const [status, setStatus] = React79.useState("all");
|
|
6100
|
+
const [source, setSource] = React79.useState("all");
|
|
6101
|
+
const [product, setProduct] = React79.useState("all");
|
|
6102
|
+
const [query, setQuery] = React79.useState("");
|
|
6103
|
+
const [limit, setLimit] = React79.useState(pageSize);
|
|
6104
|
+
const age = React79.useCallback(
|
|
6138
6105
|
(createdAt) => formatAge ? formatAge(createdAt) : formatRelativeAge(createdAt),
|
|
6139
6106
|
[formatAge]
|
|
6140
6107
|
);
|
|
6141
|
-
const sourceChips =
|
|
6108
|
+
const sourceChips = React79.useMemo(
|
|
6142
6109
|
() => sources ?? Array.from(new Set(items.map((n) => n.source))),
|
|
6143
6110
|
[sources, items]
|
|
6144
6111
|
);
|
|
@@ -6149,13 +6116,13 @@ var NotificationCenter = React80.forwardRef(
|
|
|
6149
6116
|
const shown = matched.slice(0, limit);
|
|
6150
6117
|
const remaining = matched.length - shown.length;
|
|
6151
6118
|
const filtering = q !== "" || status !== "all" || source !== "all" || product !== "all";
|
|
6152
|
-
return /* @__PURE__ */
|
|
6153
|
-
(header || onMarkAllRead) && /* @__PURE__ */
|
|
6154
|
-
header && /* @__PURE__ */
|
|
6155
|
-
/* @__PURE__ */
|
|
6156
|
-
description && /* @__PURE__ */
|
|
6119
|
+
return /* @__PURE__ */ jsxs61("div", { ref, className: cn("mx-auto max-w-[560px]", className), children: [
|
|
6120
|
+
(header || onMarkAllRead) && /* @__PURE__ */ jsxs61("div", { className: cn("mb-4 flex items-start gap-4", !header && "justify-end"), children: [
|
|
6121
|
+
header && /* @__PURE__ */ jsxs61("div", { className: "min-w-0 flex-1", children: [
|
|
6122
|
+
/* @__PURE__ */ jsx93("h1", { className: "mb-1.5 text-2xl font-semibold tracking-tight text-text-primary", children: title }),
|
|
6123
|
+
description && /* @__PURE__ */ jsx93("p", { className: "text-sm text-text-tertiary", children: description })
|
|
6157
6124
|
] }),
|
|
6158
|
-
onMarkAllRead && /* @__PURE__ */
|
|
6125
|
+
onMarkAllRead && /* @__PURE__ */ jsx93(
|
|
6159
6126
|
"button",
|
|
6160
6127
|
{
|
|
6161
6128
|
type: "button",
|
|
@@ -6165,9 +6132,9 @@ var NotificationCenter = React80.forwardRef(
|
|
|
6165
6132
|
}
|
|
6166
6133
|
)
|
|
6167
6134
|
] }),
|
|
6168
|
-
searchable && /* @__PURE__ */
|
|
6169
|
-
/* @__PURE__ */
|
|
6170
|
-
/* @__PURE__ */
|
|
6135
|
+
searchable && /* @__PURE__ */ jsxs61("div", { className: "mb-3 flex items-center gap-2 rounded-lg bg-bg-elevated px-3 py-2", children: [
|
|
6136
|
+
/* @__PURE__ */ jsx93(Search4, { className: "size-4 shrink-0 text-text-tertiary", "aria-hidden": "true" }),
|
|
6137
|
+
/* @__PURE__ */ jsx93(
|
|
6171
6138
|
"input",
|
|
6172
6139
|
{
|
|
6173
6140
|
type: "text",
|
|
@@ -6178,8 +6145,8 @@ var NotificationCenter = React80.forwardRef(
|
|
|
6178
6145
|
}
|
|
6179
6146
|
)
|
|
6180
6147
|
] }),
|
|
6181
|
-
/* @__PURE__ */
|
|
6182
|
-
/* @__PURE__ */
|
|
6148
|
+
/* @__PURE__ */ jsxs61("div", { className: "mb-2 flex flex-wrap gap-1.5", children: [
|
|
6149
|
+
/* @__PURE__ */ jsx93(
|
|
6183
6150
|
"button",
|
|
6184
6151
|
{
|
|
6185
6152
|
type: "button",
|
|
@@ -6188,7 +6155,7 @@ var NotificationCenter = React80.forwardRef(
|
|
|
6188
6155
|
children: "All"
|
|
6189
6156
|
}
|
|
6190
6157
|
),
|
|
6191
|
-
/* @__PURE__ */
|
|
6158
|
+
/* @__PURE__ */ jsx93(
|
|
6192
6159
|
"button",
|
|
6193
6160
|
{
|
|
6194
6161
|
type: "button",
|
|
@@ -6198,8 +6165,8 @@ var NotificationCenter = React80.forwardRef(
|
|
|
6198
6165
|
}
|
|
6199
6166
|
)
|
|
6200
6167
|
] }),
|
|
6201
|
-
/* @__PURE__ */
|
|
6202
|
-
/* @__PURE__ */
|
|
6168
|
+
/* @__PURE__ */ jsxs61("div", { className: "mb-2 flex flex-wrap gap-1.5", children: [
|
|
6169
|
+
/* @__PURE__ */ jsx93(
|
|
6203
6170
|
"button",
|
|
6204
6171
|
{
|
|
6205
6172
|
type: "button",
|
|
@@ -6208,7 +6175,7 @@ var NotificationCenter = React80.forwardRef(
|
|
|
6208
6175
|
children: "All sources"
|
|
6209
6176
|
}
|
|
6210
6177
|
),
|
|
6211
|
-
sourceChips.map((s) => /* @__PURE__ */
|
|
6178
|
+
sourceChips.map((s) => /* @__PURE__ */ jsx93(
|
|
6212
6179
|
"button",
|
|
6213
6180
|
{
|
|
6214
6181
|
type: "button",
|
|
@@ -6219,8 +6186,8 @@ var NotificationCenter = React80.forwardRef(
|
|
|
6219
6186
|
s
|
|
6220
6187
|
))
|
|
6221
6188
|
] }),
|
|
6222
|
-
products && products.length > 0 && /* @__PURE__ */
|
|
6223
|
-
/* @__PURE__ */
|
|
6189
|
+
products && products.length > 0 && /* @__PURE__ */ jsxs61("div", { className: "mb-4 flex flex-wrap gap-1.5", children: [
|
|
6190
|
+
/* @__PURE__ */ jsx93(
|
|
6224
6191
|
"button",
|
|
6225
6192
|
{
|
|
6226
6193
|
type: "button",
|
|
@@ -6229,7 +6196,7 @@ var NotificationCenter = React80.forwardRef(
|
|
|
6229
6196
|
children: "All products"
|
|
6230
6197
|
}
|
|
6231
6198
|
),
|
|
6232
|
-
products.map((p) => /* @__PURE__ */
|
|
6199
|
+
products.map((p) => /* @__PURE__ */ jsx93(
|
|
6233
6200
|
"button",
|
|
6234
6201
|
{
|
|
6235
6202
|
type: "button",
|
|
@@ -6240,8 +6207,8 @@ var NotificationCenter = React80.forwardRef(
|
|
|
6240
6207
|
p.id
|
|
6241
6208
|
))
|
|
6242
6209
|
] }),
|
|
6243
|
-
shown.length === 0 ? /* @__PURE__ */
|
|
6244
|
-
shown.map((item) => /* @__PURE__ */
|
|
6210
|
+
shown.length === 0 ? /* @__PURE__ */ jsx93("p", { className: "rounded-xl bg-bg-elevated px-4 py-10 text-center text-sm leading-relaxed text-text-tertiary", children: filtering ? "Nothing matches." : "Nothing here yet. Everything addressed to you lands here." }) : /* @__PURE__ */ jsxs61("div", { className: "flex flex-col gap-1.5", children: [
|
|
6211
|
+
shown.map((item) => /* @__PURE__ */ jsx93(
|
|
6245
6212
|
CenterRow,
|
|
6246
6213
|
{
|
|
6247
6214
|
item,
|
|
@@ -6252,7 +6219,7 @@ var NotificationCenter = React80.forwardRef(
|
|
|
6252
6219
|
},
|
|
6253
6220
|
item.id
|
|
6254
6221
|
)),
|
|
6255
|
-
remaining > 0 && /* @__PURE__ */
|
|
6222
|
+
remaining > 0 && /* @__PURE__ */ jsxs61(
|
|
6256
6223
|
"button",
|
|
6257
6224
|
{
|
|
6258
6225
|
type: "button",
|
|
@@ -6272,9 +6239,9 @@ var NotificationCenter = React80.forwardRef(
|
|
|
6272
6239
|
NotificationCenter.displayName = "NotificationCenter";
|
|
6273
6240
|
|
|
6274
6241
|
// src/components/notification-settings.tsx
|
|
6275
|
-
import * as
|
|
6242
|
+
import * as React80 from "react";
|
|
6276
6243
|
import { Moon as Moon2, Plus as Plus3, Volume2 } from "lucide-react";
|
|
6277
|
-
import { Fragment as Fragment11, jsx as
|
|
6244
|
+
import { Fragment as Fragment11, jsx as jsx94, jsxs as jsxs62 } from "react/jsx-runtime";
|
|
6278
6245
|
var THRESHOLDS = [
|
|
6279
6246
|
["everything", "Everything"],
|
|
6280
6247
|
["important", "Important"],
|
|
@@ -6286,7 +6253,7 @@ function ThresholdControl({
|
|
|
6286
6253
|
value,
|
|
6287
6254
|
onChange
|
|
6288
6255
|
}) {
|
|
6289
|
-
return /* @__PURE__ */
|
|
6256
|
+
return /* @__PURE__ */ jsx94(
|
|
6290
6257
|
ToggleGroup,
|
|
6291
6258
|
{
|
|
6292
6259
|
type: "single",
|
|
@@ -6295,11 +6262,11 @@ function ThresholdControl({
|
|
|
6295
6262
|
value,
|
|
6296
6263
|
onValueChange: (next) => next && onChange(next),
|
|
6297
6264
|
className: "shrink-0",
|
|
6298
|
-
children: THRESHOLDS.map(([threshold, text]) => /* @__PURE__ */
|
|
6265
|
+
children: THRESHOLDS.map(([threshold, text]) => /* @__PURE__ */ jsx94(ToggleGroupItem, { value: threshold, children: text }, threshold))
|
|
6299
6266
|
}
|
|
6300
6267
|
);
|
|
6301
6268
|
}
|
|
6302
|
-
var NotificationSettings =
|
|
6269
|
+
var NotificationSettings = React80.forwardRef(
|
|
6303
6270
|
({
|
|
6304
6271
|
subscriptions,
|
|
6305
6272
|
value,
|
|
@@ -6312,7 +6279,7 @@ var NotificationSettings = React81.forwardRef(
|
|
|
6312
6279
|
pushSlot,
|
|
6313
6280
|
className
|
|
6314
6281
|
}, ref) => {
|
|
6315
|
-
const [tab, setTab] =
|
|
6282
|
+
const [tab, setTab] = React80.useState(DEFAULT_KEY);
|
|
6316
6283
|
const isDefault = tab === DEFAULT_KEY;
|
|
6317
6284
|
const defaults = value[DEFAULT_KEY] ?? { thresholds: {} };
|
|
6318
6285
|
const customized = !isDefault && Object.prototype.hasOwnProperty.call(value, tab);
|
|
@@ -6332,15 +6299,15 @@ var NotificationSettings = React81.forwardRef(
|
|
|
6332
6299
|
const scopeGroup = (scope) => {
|
|
6333
6300
|
const rows = subscriptions.filter((s) => s.scope === scope);
|
|
6334
6301
|
if (rows.length === 0) return null;
|
|
6335
|
-
return /* @__PURE__ */
|
|
6336
|
-
/* @__PURE__ */
|
|
6337
|
-
/* @__PURE__ */
|
|
6302
|
+
return /* @__PURE__ */ jsxs62("div", { children: [
|
|
6303
|
+
/* @__PURE__ */ jsx94("p", { className: "mb-1.5 px-0.5 text-xs font-medium text-text-tertiary", children: scope === "product" ? "This product" : "Organization" }),
|
|
6304
|
+
/* @__PURE__ */ jsx94("div", { className: "space-y-2", children: rows.map((sub) => /* @__PURE__ */ jsxs62(
|
|
6338
6305
|
"div",
|
|
6339
6306
|
{
|
|
6340
6307
|
className: "flex items-center gap-4 rounded-xl bg-bg-elevated px-4 py-3",
|
|
6341
6308
|
children: [
|
|
6342
|
-
/* @__PURE__ */
|
|
6343
|
-
/* @__PURE__ */
|
|
6309
|
+
/* @__PURE__ */ jsx94("p", { className: "min-w-0 flex-1 text-sm font-semibold text-text-primary", children: sub.name }),
|
|
6310
|
+
/* @__PURE__ */ jsx94(
|
|
6344
6311
|
ThresholdControl,
|
|
6345
6312
|
{
|
|
6346
6313
|
label: sub.name,
|
|
@@ -6354,10 +6321,10 @@ var NotificationSettings = React81.forwardRef(
|
|
|
6354
6321
|
)) })
|
|
6355
6322
|
] }, scope);
|
|
6356
6323
|
};
|
|
6357
|
-
return /* @__PURE__ */
|
|
6358
|
-
products && products.length > 0 && /* @__PURE__ */
|
|
6359
|
-
/* @__PURE__ */
|
|
6360
|
-
/* @__PURE__ */
|
|
6324
|
+
return /* @__PURE__ */ jsxs62("div", { ref, className: cn("space-y-5", className), children: [
|
|
6325
|
+
products && products.length > 0 && /* @__PURE__ */ jsxs62("div", { children: [
|
|
6326
|
+
/* @__PURE__ */ jsx94("p", { className: "mb-2 px-0.5 text-xs font-medium text-text-tertiary", children: "Preferences for" }),
|
|
6327
|
+
/* @__PURE__ */ jsx94(
|
|
6361
6328
|
ToggleGroup,
|
|
6362
6329
|
{
|
|
6363
6330
|
type: "single",
|
|
@@ -6366,30 +6333,30 @@ var NotificationSettings = React81.forwardRef(
|
|
|
6366
6333
|
value: tab,
|
|
6367
6334
|
onValueChange: (next) => next && setTab(next),
|
|
6368
6335
|
className: "flex-wrap",
|
|
6369
|
-
children: [{ id: DEFAULT_KEY, label: "Default" }, ...products].map((t) => /* @__PURE__ */
|
|
6336
|
+
children: [{ id: DEFAULT_KEY, label: "Default" }, ...products].map((t) => /* @__PURE__ */ jsx94(ToggleGroupItem, { value: t.id, children: t.label }, t.id))
|
|
6370
6337
|
}
|
|
6371
6338
|
)
|
|
6372
6339
|
] }),
|
|
6373
|
-
isDefault ? /* @__PURE__ */
|
|
6374
|
-
/* @__PURE__ */
|
|
6375
|
-
/* @__PURE__ */
|
|
6376
|
-
/* @__PURE__ */
|
|
6377
|
-
/* @__PURE__ */
|
|
6378
|
-
pushSlot ?? /* @__PURE__ */
|
|
6340
|
+
isDefault ? /* @__PURE__ */ jsxs62(Fragment11, { children: [
|
|
6341
|
+
/* @__PURE__ */ jsx94("p", { className: "text-sm leading-relaxed text-text-secondary", children: "Your defaults, applied to every product unless you customize one. Everything addressed to you always lands in the in-app record; that cannot be turned off." }),
|
|
6342
|
+
/* @__PURE__ */ jsxs62(Card, { className: "border-none bg-bg-elevated p-5", children: [
|
|
6343
|
+
/* @__PURE__ */ jsx94(CardTitle, { as: "p", className: "mb-1.5", children: "Push to" }),
|
|
6344
|
+
/* @__PURE__ */ jsx94("p", { className: "mb-3 text-sm leading-relaxed text-text-secondary", children: "Forward notifications beyond the in-app record to a connected integration." }),
|
|
6345
|
+
pushSlot ?? /* @__PURE__ */ jsx94("div", { className: "rounded-lg bg-bg-surface px-4 py-6 text-center", children: /* @__PURE__ */ jsx94("p", { className: "text-sm text-text-tertiary", children: "No integrations connected." }) })
|
|
6379
6346
|
] }),
|
|
6380
|
-
mutes.length > 0 && /* @__PURE__ */
|
|
6381
|
-
/* @__PURE__ */
|
|
6382
|
-
/* @__PURE__ */
|
|
6383
|
-
/* @__PURE__ */
|
|
6384
|
-
/* @__PURE__ */
|
|
6385
|
-
/* @__PURE__ */
|
|
6386
|
-
/* @__PURE__ */
|
|
6347
|
+
mutes.length > 0 && /* @__PURE__ */ jsxs62("div", { children: [
|
|
6348
|
+
/* @__PURE__ */ jsx94("p", { className: "mb-1.5 px-0.5 text-xs font-medium text-text-tertiary", children: "Muted" }),
|
|
6349
|
+
/* @__PURE__ */ jsx94(Card, { className: "border-none bg-bg-elevated p-2", children: mutes.map((m) => /* @__PURE__ */ jsxs62("div", { className: "flex items-center gap-3 rounded-lg px-3 py-2.5", children: [
|
|
6350
|
+
/* @__PURE__ */ jsx94(Moon2, { className: "size-4 shrink-0 text-text-tertiary", "aria-hidden": "true" }),
|
|
6351
|
+
/* @__PURE__ */ jsxs62("div", { className: "min-w-0 flex-1", children: [
|
|
6352
|
+
/* @__PURE__ */ jsx94("p", { className: "text-sm font-medium text-text-primary", children: m.source }),
|
|
6353
|
+
/* @__PURE__ */ jsxs62("p", { className: "text-sm text-text-tertiary", children: [
|
|
6387
6354
|
"Muted, ",
|
|
6388
6355
|
m.label,
|
|
6389
6356
|
". Critical still comes through."
|
|
6390
6357
|
] })
|
|
6391
6358
|
] }),
|
|
6392
|
-
/* @__PURE__ */
|
|
6359
|
+
/* @__PURE__ */ jsx94(
|
|
6393
6360
|
"button",
|
|
6394
6361
|
{
|
|
6395
6362
|
type: "button",
|
|
@@ -6402,13 +6369,13 @@ var NotificationSettings = React81.forwardRef(
|
|
|
6402
6369
|
] }),
|
|
6403
6370
|
scopeGroup("product"),
|
|
6404
6371
|
scopeGroup("org"),
|
|
6405
|
-
onSoundEnabledChange && /* @__PURE__ */
|
|
6406
|
-
/* @__PURE__ */
|
|
6407
|
-
/* @__PURE__ */
|
|
6408
|
-
/* @__PURE__ */
|
|
6409
|
-
/* @__PURE__ */
|
|
6372
|
+
onSoundEnabledChange && /* @__PURE__ */ jsx94(Card, { className: "border-none bg-bg-elevated p-4", children: /* @__PURE__ */ jsxs62("div", { className: "flex items-center gap-3", children: [
|
|
6373
|
+
/* @__PURE__ */ jsx94(Volume2, { className: "size-4 text-text-tertiary", "aria-hidden": "true" }),
|
|
6374
|
+
/* @__PURE__ */ jsxs62("div", { className: "flex-1", children: [
|
|
6375
|
+
/* @__PURE__ */ jsx94("p", { className: "text-sm font-medium text-text-primary", children: "Notification sound" }),
|
|
6376
|
+
/* @__PURE__ */ jsx94("p", { className: "text-sm text-text-tertiary", children: "Play a tone when a notification arrives. Critical always chimes." })
|
|
6410
6377
|
] }),
|
|
6411
|
-
/* @__PURE__ */
|
|
6378
|
+
/* @__PURE__ */ jsx94(
|
|
6412
6379
|
Switch,
|
|
6413
6380
|
{
|
|
6414
6381
|
checked: soundEnabled ?? false,
|
|
@@ -6417,35 +6384,35 @@ var NotificationSettings = React81.forwardRef(
|
|
|
6417
6384
|
}
|
|
6418
6385
|
)
|
|
6419
6386
|
] }) })
|
|
6420
|
-
] }) : !customized ? /* @__PURE__ */
|
|
6421
|
-
/* @__PURE__ */
|
|
6387
|
+
] }) : !customized ? /* @__PURE__ */ jsxs62(Card, { className: "border-none bg-bg-elevated p-8 text-center", children: [
|
|
6388
|
+
/* @__PURE__ */ jsxs62("p", { className: "text-sm font-semibold text-text-primary", children: [
|
|
6422
6389
|
productLabel,
|
|
6423
6390
|
" follows your Default preferences."
|
|
6424
6391
|
] }),
|
|
6425
|
-
/* @__PURE__ */
|
|
6426
|
-
/* @__PURE__ */
|
|
6392
|
+
/* @__PURE__ */ jsx94("p", { className: "mx-auto mt-1.5 max-w-[360px] text-sm leading-relaxed text-text-tertiary", children: "Interrupt thresholds, sound and forwarding all come from Default. Opt in to give this product its own interrupt thresholds." }),
|
|
6393
|
+
/* @__PURE__ */ jsxs62(
|
|
6427
6394
|
"button",
|
|
6428
6395
|
{
|
|
6429
6396
|
type: "button",
|
|
6430
6397
|
onClick: customize,
|
|
6431
6398
|
className: "mt-5 inline-flex cursor-pointer 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",
|
|
6432
6399
|
children: [
|
|
6433
|
-
/* @__PURE__ */
|
|
6400
|
+
/* @__PURE__ */ jsx94(Plus3, { className: "size-4", "aria-hidden": "true" }),
|
|
6434
6401
|
" Customize for ",
|
|
6435
6402
|
productLabel
|
|
6436
6403
|
]
|
|
6437
6404
|
}
|
|
6438
6405
|
)
|
|
6439
|
-
] }) : /* @__PURE__ */
|
|
6440
|
-
/* @__PURE__ */
|
|
6441
|
-
/* @__PURE__ */
|
|
6442
|
-
/* @__PURE__ */
|
|
6406
|
+
] }) : /* @__PURE__ */ jsxs62(Fragment11, { children: [
|
|
6407
|
+
/* @__PURE__ */ jsx94(Card, { className: "border-none bg-bg-brand-subtle p-3.5", children: /* @__PURE__ */ jsxs62("div", { className: "flex items-center gap-3", children: [
|
|
6408
|
+
/* @__PURE__ */ jsxs62("div", { className: "min-w-0 flex-1", children: [
|
|
6409
|
+
/* @__PURE__ */ jsxs62("p", { className: "text-sm font-semibold text-text-brand", children: [
|
|
6443
6410
|
"Custom preferences for ",
|
|
6444
6411
|
productLabel
|
|
6445
6412
|
] }),
|
|
6446
|
-
/* @__PURE__ */
|
|
6413
|
+
/* @__PURE__ */ jsx94("p", { className: "text-sm leading-relaxed text-text-secondary", children: "Only the interrupt thresholds below differ. Sound and forwarding follow Default." })
|
|
6447
6414
|
] }),
|
|
6448
|
-
/* @__PURE__ */
|
|
6415
|
+
/* @__PURE__ */ jsx94(
|
|
6449
6416
|
"button",
|
|
6450
6417
|
{
|
|
6451
6418
|
type: "button",
|
|
@@ -6463,14 +6430,14 @@ var NotificationSettings = React81.forwardRef(
|
|
|
6463
6430
|
NotificationSettings.displayName = "NotificationSettings";
|
|
6464
6431
|
|
|
6465
6432
|
// src/components/notification-toast.tsx
|
|
6466
|
-
import * as
|
|
6433
|
+
import * as React81 from "react";
|
|
6467
6434
|
import { X as X4 } from "lucide-react";
|
|
6468
|
-
import { jsx as
|
|
6435
|
+
import { jsx as jsx95, jsxs as jsxs63 } from "react/jsx-runtime";
|
|
6469
6436
|
var chipBase2 = "cursor-pointer rounded-lg px-2.5 py-1 text-sm font-medium transition-colors duration-fast";
|
|
6470
6437
|
var chipPrimary = "bg-bg-brand text-text-on-brand hover:bg-bg-brand-hover";
|
|
6471
6438
|
var chipDestructive = "bg-bg-elevated text-text-danger hover:bg-bg-surface";
|
|
6472
6439
|
var linkAction = "cursor-pointer text-sm font-semibold text-text-brand transition-colors duration-fast hover:text-text-primary";
|
|
6473
|
-
var NotificationToast =
|
|
6440
|
+
var NotificationToast = React81.forwardRef(
|
|
6474
6441
|
({
|
|
6475
6442
|
item,
|
|
6476
6443
|
showSource = true,
|
|
@@ -6487,9 +6454,9 @@ var NotificationToast = React82.forwardRef(
|
|
|
6487
6454
|
const actions = item.actions ?? [];
|
|
6488
6455
|
const percent = progress === void 0 || !Number.isFinite(progress) ? void 0 : Math.min(100, Math.max(0, progress));
|
|
6489
6456
|
const progressLine = progressLabel === void 0 && percent !== void 0 ? `live, ${Math.round(percent)}%` : progressLabel;
|
|
6490
|
-
const barId =
|
|
6457
|
+
const barId = React81.useId();
|
|
6491
6458
|
const hasProgressLine = progressLine !== null && progressLine !== void 0;
|
|
6492
|
-
return /* @__PURE__ */
|
|
6459
|
+
return /* @__PURE__ */ jsxs63(
|
|
6493
6460
|
"div",
|
|
6494
6461
|
{
|
|
6495
6462
|
ref,
|
|
@@ -6500,24 +6467,24 @@ var NotificationToast = React82.forwardRef(
|
|
|
6500
6467
|
className
|
|
6501
6468
|
),
|
|
6502
6469
|
children: [
|
|
6503
|
-
/* @__PURE__ */
|
|
6504
|
-
showSource && /* @__PURE__ */
|
|
6505
|
-
/* @__PURE__ */
|
|
6506
|
-
(overflow || onDismiss) && /* @__PURE__ */
|
|
6470
|
+
/* @__PURE__ */ jsxs63("div", { className: "flex items-center gap-2", children: [
|
|
6471
|
+
showSource && /* @__PURE__ */ jsx95("span", { className: "text-xs font-semibold text-text-tertiary", children: item.source }),
|
|
6472
|
+
/* @__PURE__ */ jsx95(Badge, { variant: severityBadgeVariant(item.severity), children: severityLabels[item.severity] }),
|
|
6473
|
+
(overflow || onDismiss) && /* @__PURE__ */ jsxs63("span", { className: "-mr-1 ml-auto flex shrink-0 items-center gap-1", children: [
|
|
6507
6474
|
overflow,
|
|
6508
|
-
onDismiss && /* @__PURE__ */
|
|
6475
|
+
onDismiss && /* @__PURE__ */ jsx95(
|
|
6509
6476
|
"button",
|
|
6510
6477
|
{
|
|
6511
6478
|
type: "button",
|
|
6512
6479
|
"aria-label": dismissLabel,
|
|
6513
6480
|
onClick: () => onDismiss(item),
|
|
6514
6481
|
className: "flex size-5 shrink-0 cursor-pointer items-center justify-center rounded-md text-text-tertiary transition-colors duration-fast hover:bg-bg-surface hover:text-text-primary",
|
|
6515
|
-
children: /* @__PURE__ */
|
|
6482
|
+
children: /* @__PURE__ */ jsx95(X4, { className: "size-3.5", "aria-hidden": "true" })
|
|
6516
6483
|
}
|
|
6517
6484
|
)
|
|
6518
6485
|
] })
|
|
6519
6486
|
] }),
|
|
6520
|
-
onItemClick ? /* @__PURE__ */
|
|
6487
|
+
onItemClick ? /* @__PURE__ */ jsx95(
|
|
6521
6488
|
"button",
|
|
6522
6489
|
{
|
|
6523
6490
|
type: "button",
|
|
@@ -6525,15 +6492,15 @@ var NotificationToast = React82.forwardRef(
|
|
|
6525
6492
|
className: "mt-1 block cursor-pointer text-left text-sm font-semibold leading-snug text-text-primary underline-offset-2 hover:underline",
|
|
6526
6493
|
children: item.title
|
|
6527
6494
|
}
|
|
6528
|
-
) : /* @__PURE__ */
|
|
6529
|
-
item.body && /* @__PURE__ */
|
|
6530
|
-
note && /* @__PURE__ */
|
|
6495
|
+
) : /* @__PURE__ */ jsx95("p", { className: "mt-1 text-sm font-semibold leading-snug text-text-primary", children: item.title }),
|
|
6496
|
+
item.body && /* @__PURE__ */ jsx95("p", { className: "mt-0.5 text-sm leading-snug text-text-secondary", children: item.body }),
|
|
6497
|
+
note && /* @__PURE__ */ jsx95("p", { className: "mt-1.5 text-xs font-medium text-text-warning", children: note }),
|
|
6531
6498
|
percent !== void 0 && // The card is a `role="status"`, which implies `aria-atomic` — every tick of the bar would
|
|
6532
6499
|
// otherwise re-announce the whole card. `aria-live="off"` on the subtree that moves is the
|
|
6533
6500
|
// one cheap mitigation: the bar stays in the accessibility tree to be read on demand, it
|
|
6534
6501
|
// just stops interrupting.
|
|
6535
|
-
/* @__PURE__ */
|
|
6536
|
-
/* @__PURE__ */
|
|
6502
|
+
/* @__PURE__ */ jsxs63("div", { className: "mt-2", "aria-live": "off", children: [
|
|
6503
|
+
/* @__PURE__ */ jsx95(
|
|
6537
6504
|
Progress,
|
|
6538
6505
|
{
|
|
6539
6506
|
value: percent,
|
|
@@ -6542,11 +6509,11 @@ var NotificationToast = React82.forwardRef(
|
|
|
6542
6509
|
"aria-label": hasProgressLine ? void 0 : "Progress"
|
|
6543
6510
|
}
|
|
6544
6511
|
),
|
|
6545
|
-
hasProgressLine && /* @__PURE__ */
|
|
6512
|
+
hasProgressLine && /* @__PURE__ */ jsx95("p", { id: barId, className: "mt-0.5 text-xs text-text-secondary", children: progressLine })
|
|
6546
6513
|
] }),
|
|
6547
|
-
actions.length > 0 && /* @__PURE__ */
|
|
6514
|
+
actions.length > 0 && /* @__PURE__ */ jsx95("div", { className: "mt-2.5 flex flex-wrap items-center gap-2", children: actions.map((action) => {
|
|
6548
6515
|
const variant = action.variant ?? "link";
|
|
6549
|
-
return /* @__PURE__ */
|
|
6516
|
+
return /* @__PURE__ */ jsx95(
|
|
6550
6517
|
"button",
|
|
6551
6518
|
{
|
|
6552
6519
|
type: "button",
|
|
@@ -6565,15 +6532,15 @@ var NotificationToast = React82.forwardRef(
|
|
|
6565
6532
|
NotificationToast.displayName = "NotificationToast";
|
|
6566
6533
|
|
|
6567
6534
|
// src/components/notification-toaster.tsx
|
|
6568
|
-
import * as
|
|
6569
|
-
import { jsx as
|
|
6535
|
+
import * as React82 from "react";
|
|
6536
|
+
import { jsx as jsx96 } from "react/jsx-runtime";
|
|
6570
6537
|
var positions = {
|
|
6571
6538
|
"bottom-right": "bottom-6 right-6 flex-col",
|
|
6572
6539
|
"bottom-left": "bottom-6 left-6 flex-col",
|
|
6573
6540
|
"top-right": "top-6 right-6 flex-col-reverse",
|
|
6574
6541
|
"top-left": "top-6 left-6 flex-col-reverse"
|
|
6575
6542
|
};
|
|
6576
|
-
var NotificationToaster =
|
|
6543
|
+
var NotificationToaster = React82.forwardRef(
|
|
6577
6544
|
({
|
|
6578
6545
|
items,
|
|
6579
6546
|
dwell,
|
|
@@ -6590,15 +6557,15 @@ var NotificationToaster = React83.forwardRef(
|
|
|
6590
6557
|
className
|
|
6591
6558
|
}, ref) => {
|
|
6592
6559
|
const shown = items.slice(0, max);
|
|
6593
|
-
const [paused, setPaused] =
|
|
6594
|
-
const onDismissRef =
|
|
6560
|
+
const [paused, setPaused] = React82.useState(false);
|
|
6561
|
+
const onDismissRef = React82.useRef(onDismiss);
|
|
6595
6562
|
onDismissRef.current = onDismiss;
|
|
6596
6563
|
const fyiDwell = dwell?.fyi;
|
|
6597
6564
|
const importantDwell = dwell?.important;
|
|
6598
6565
|
const criticalDwell = dwell?.critical;
|
|
6599
|
-
const remaining =
|
|
6566
|
+
const remaining = React82.useRef(/* @__PURE__ */ new Map());
|
|
6600
6567
|
const liveIds = shown.map((item) => `${item.id}:${item.severity}`).join(" ");
|
|
6601
|
-
|
|
6568
|
+
React82.useEffect(() => {
|
|
6602
6569
|
const owedById = remaining.current;
|
|
6603
6570
|
const dwellSeconds = {
|
|
6604
6571
|
fyi: fyiDwell ?? TOAST_DWELL.fyi,
|
|
@@ -6639,7 +6606,7 @@ var NotificationToaster = React83.forwardRef(
|
|
|
6639
6606
|
};
|
|
6640
6607
|
}, [liveIds, paused, fyiDwell, importantDwell, criticalDwell]);
|
|
6641
6608
|
if (shown.length === 0) return null;
|
|
6642
|
-
return /* @__PURE__ */
|
|
6609
|
+
return /* @__PURE__ */ jsx96(
|
|
6643
6610
|
"div",
|
|
6644
6611
|
{
|
|
6645
6612
|
ref,
|
|
@@ -6652,7 +6619,7 @@ var NotificationToaster = React83.forwardRef(
|
|
|
6652
6619
|
positions[position],
|
|
6653
6620
|
className
|
|
6654
6621
|
),
|
|
6655
|
-
children: shown.map((item, i) => /* @__PURE__ */
|
|
6622
|
+
children: shown.map((item, i) => /* @__PURE__ */ jsx96("div", { className: "pointer-events-auto", children: /* @__PURE__ */ jsx96(
|
|
6656
6623
|
NotificationToast,
|
|
6657
6624
|
{
|
|
6658
6625
|
item,
|
|
@@ -6926,7 +6893,7 @@ var COUNTRY_OPTIONS = [
|
|
|
6926
6893
|
];
|
|
6927
6894
|
|
|
6928
6895
|
// src/components/organization-onboarding-form.tsx
|
|
6929
|
-
import * as
|
|
6896
|
+
import * as React83 from "react";
|
|
6930
6897
|
|
|
6931
6898
|
// src/lib/auth-surface.ts
|
|
6932
6899
|
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]";
|
|
@@ -6934,7 +6901,7 @@ var AUTH_QUIET_BUTTON = "flex h-[46px] w-full items-center justify-center gap-[1
|
|
|
6934
6901
|
var AUTH_BUTTON_SHADOW = "var(--auth-btn-shadow)";
|
|
6935
6902
|
|
|
6936
6903
|
// src/components/organization-onboarding-form.tsx
|
|
6937
|
-
import { jsx as
|
|
6904
|
+
import { jsx as jsx97, jsxs as jsxs64 } from "react/jsx-runtime";
|
|
6938
6905
|
var CONTROLLER_SHARE_PCT = 50;
|
|
6939
6906
|
var MAX_BENEFICIAL_OWNERS = 50;
|
|
6940
6907
|
var REQUIRED_FIELD_LABELS = {
|
|
@@ -6949,7 +6916,7 @@ function isOwnershipViolation(violation) {
|
|
|
6949
6916
|
return /ownership[_\s-]?confirmed/i.test(violation);
|
|
6950
6917
|
}
|
|
6951
6918
|
function RequiredMark() {
|
|
6952
|
-
return /* @__PURE__ */
|
|
6919
|
+
return /* @__PURE__ */ jsx97("span", { className: "text-text-danger", children: " *" });
|
|
6953
6920
|
}
|
|
6954
6921
|
function parseShare(raw) {
|
|
6955
6922
|
if (!/^\d{1,3}$/.test(raw.trim())) return null;
|
|
@@ -6978,23 +6945,23 @@ function OrganizationOnboardingForm({
|
|
|
6978
6945
|
onCancel,
|
|
6979
6946
|
className
|
|
6980
6947
|
}) {
|
|
6981
|
-
const [name, setName] =
|
|
6982
|
-
const [legalName, setLegalName] =
|
|
6983
|
-
const [ownerName, setOwnerName] =
|
|
6984
|
-
const [countryOfIncorporation, setCountryOfIncorporation] =
|
|
6948
|
+
const [name, setName] = React83.useState(defaultValues?.name ?? "");
|
|
6949
|
+
const [legalName, setLegalName] = React83.useState(defaultValues?.legal_name ?? "");
|
|
6950
|
+
const [ownerName, setOwnerName] = React83.useState(defaultValues?.owner_name ?? "");
|
|
6951
|
+
const [countryOfIncorporation, setCountryOfIncorporation] = React83.useState(
|
|
6985
6952
|
defaultValues?.country_of_incorporation ?? ""
|
|
6986
6953
|
);
|
|
6987
|
-
const [residencyCountry, setResidencyCountry] =
|
|
6954
|
+
const [residencyCountry, setResidencyCountry] = React83.useState(
|
|
6988
6955
|
defaultValues?.residency_country ?? ""
|
|
6989
6956
|
);
|
|
6990
|
-
const [owners, setOwners] =
|
|
6957
|
+
const [owners, setOwners] = React83.useState(
|
|
6991
6958
|
() => initialRows(defaultValues?.beneficial_owners)
|
|
6992
6959
|
);
|
|
6993
|
-
const [ownershipConfirmed, setOwnershipConfirmed] =
|
|
6994
|
-
const [confirmationAttempted, setConfirmationAttempted] =
|
|
6995
|
-
const [requiredAttempted, setRequiredAttempted] =
|
|
6996
|
-
const nextKeyRef =
|
|
6997
|
-
const submittingRef =
|
|
6960
|
+
const [ownershipConfirmed, setOwnershipConfirmed] = React83.useState(false);
|
|
6961
|
+
const [confirmationAttempted, setConfirmationAttempted] = React83.useState(false);
|
|
6962
|
+
const [requiredAttempted, setRequiredAttempted] = React83.useState(false);
|
|
6963
|
+
const nextKeyRef = React83.useRef(owners.length);
|
|
6964
|
+
const submittingRef = React83.useRef(false);
|
|
6998
6965
|
const trimmed = name.trim();
|
|
6999
6966
|
const filledOwners = owners.filter((row) => !isRowBlank(row));
|
|
7000
6967
|
const ownerShares = filledOwners.map((row) => parseShare(row.share));
|
|
@@ -7056,7 +7023,7 @@ function OrganizationOnboardingForm({
|
|
|
7056
7023
|
...needsOwnershipConfirmation ? { ownership_confirmed: ownershipConfirmed } : {}
|
|
7057
7024
|
});
|
|
7058
7025
|
};
|
|
7059
|
-
|
|
7026
|
+
React83.useEffect(() => {
|
|
7060
7027
|
submittingRef.current = false;
|
|
7061
7028
|
}, [
|
|
7062
7029
|
name,
|
|
@@ -7069,12 +7036,12 @@ function OrganizationOnboardingForm({
|
|
|
7069
7036
|
submitting,
|
|
7070
7037
|
serverError
|
|
7071
7038
|
]);
|
|
7072
|
-
const countryField = (params) => /* @__PURE__ */
|
|
7073
|
-
/* @__PURE__ */
|
|
7039
|
+
const countryField = (params) => /* @__PURE__ */ jsxs64("div", { className: "space-y-1.5", children: [
|
|
7040
|
+
/* @__PURE__ */ jsxs64(Label2, { htmlFor: params.id, children: [
|
|
7074
7041
|
params.label,
|
|
7075
|
-
/* @__PURE__ */
|
|
7042
|
+
/* @__PURE__ */ jsx97(RequiredMark, {})
|
|
7076
7043
|
] }),
|
|
7077
|
-
/* @__PURE__ */
|
|
7044
|
+
/* @__PURE__ */ jsx97(
|
|
7078
7045
|
Select,
|
|
7079
7046
|
{
|
|
7080
7047
|
id: params.id,
|
|
@@ -7087,13 +7054,13 @@ function OrganizationOnboardingForm({
|
|
|
7087
7054
|
}
|
|
7088
7055
|
)
|
|
7089
7056
|
] });
|
|
7090
|
-
return /* @__PURE__ */
|
|
7091
|
-
/* @__PURE__ */
|
|
7092
|
-
/* @__PURE__ */
|
|
7057
|
+
return /* @__PURE__ */ jsxs64("form", { onSubmit: handleSubmit, className: cn("space-y-4", className), children: [
|
|
7058
|
+
/* @__PURE__ */ jsxs64("div", { className: "space-y-1.5", children: [
|
|
7059
|
+
/* @__PURE__ */ jsxs64(Label2, { htmlFor: "create-org-name", children: [
|
|
7093
7060
|
REQUIRED_FIELD_LABELS.name,
|
|
7094
|
-
/* @__PURE__ */
|
|
7061
|
+
/* @__PURE__ */ jsx97(RequiredMark, {})
|
|
7095
7062
|
] }),
|
|
7096
|
-
/* @__PURE__ */
|
|
7063
|
+
/* @__PURE__ */ jsx97(
|
|
7097
7064
|
Input,
|
|
7098
7065
|
{
|
|
7099
7066
|
id: "create-org-name",
|
|
@@ -7104,12 +7071,12 @@ function OrganizationOnboardingForm({
|
|
|
7104
7071
|
}
|
|
7105
7072
|
)
|
|
7106
7073
|
] }),
|
|
7107
|
-
/* @__PURE__ */
|
|
7108
|
-
/* @__PURE__ */
|
|
7074
|
+
/* @__PURE__ */ jsxs64("div", { className: "space-y-1.5", children: [
|
|
7075
|
+
/* @__PURE__ */ jsxs64(Label2, { htmlFor: "create-org-legal-name", children: [
|
|
7109
7076
|
REQUIRED_FIELD_LABELS.legalName,
|
|
7110
|
-
/* @__PURE__ */
|
|
7077
|
+
/* @__PURE__ */ jsx97(RequiredMark, {})
|
|
7111
7078
|
] }),
|
|
7112
|
-
/* @__PURE__ */
|
|
7079
|
+
/* @__PURE__ */ jsx97(
|
|
7113
7080
|
Input,
|
|
7114
7081
|
{
|
|
7115
7082
|
id: "create-org-legal-name",
|
|
@@ -7120,12 +7087,12 @@ function OrganizationOnboardingForm({
|
|
|
7120
7087
|
}
|
|
7121
7088
|
)
|
|
7122
7089
|
] }),
|
|
7123
|
-
/* @__PURE__ */
|
|
7124
|
-
/* @__PURE__ */
|
|
7090
|
+
/* @__PURE__ */ jsxs64("div", { className: "space-y-1.5", children: [
|
|
7091
|
+
/* @__PURE__ */ jsxs64(Label2, { htmlFor: "create-org-owner-name", children: [
|
|
7125
7092
|
REQUIRED_FIELD_LABELS.ownerName,
|
|
7126
|
-
/* @__PURE__ */
|
|
7093
|
+
/* @__PURE__ */ jsx97(RequiredMark, {})
|
|
7127
7094
|
] }),
|
|
7128
|
-
/* @__PURE__ */
|
|
7095
|
+
/* @__PURE__ */ jsx97(
|
|
7129
7096
|
Input,
|
|
7130
7097
|
{
|
|
7131
7098
|
id: "create-org-owner-name",
|
|
@@ -7148,10 +7115,10 @@ function OrganizationOnboardingForm({
|
|
|
7148
7115
|
value: residencyCountry,
|
|
7149
7116
|
onChange: setResidencyCountry
|
|
7150
7117
|
}),
|
|
7151
|
-
/* @__PURE__ */
|
|
7152
|
-
/* @__PURE__ */
|
|
7153
|
-
/* @__PURE__ */
|
|
7154
|
-
/* @__PURE__ */
|
|
7118
|
+
/* @__PURE__ */ jsxs64("div", { className: "space-y-2", children: [
|
|
7119
|
+
/* @__PURE__ */ jsxs64("div", { className: "flex items-center justify-between", children: [
|
|
7120
|
+
/* @__PURE__ */ jsx97(Label2, { children: "Beneficial owners" }),
|
|
7121
|
+
/* @__PURE__ */ jsx97(
|
|
7155
7122
|
Button,
|
|
7156
7123
|
{
|
|
7157
7124
|
type: "button",
|
|
@@ -7164,16 +7131,16 @@ function OrganizationOnboardingForm({
|
|
|
7164
7131
|
}
|
|
7165
7132
|
)
|
|
7166
7133
|
] }),
|
|
7167
|
-
owners.length === 0 && /* @__PURE__ */
|
|
7168
|
-
owners.map((row) => /* @__PURE__ */
|
|
7134
|
+
owners.length === 0 && /* @__PURE__ */ jsx97("p", { className: "text-xs text-text-tertiary", children: "List the natural persons who ultimately own or control the organization." }),
|
|
7135
|
+
owners.map((row) => /* @__PURE__ */ jsxs64(
|
|
7169
7136
|
"div",
|
|
7170
7137
|
{
|
|
7171
7138
|
"data-testid": `beneficial-owner-row-${row.key}`,
|
|
7172
7139
|
className: "flex items-end gap-2",
|
|
7173
7140
|
children: [
|
|
7174
|
-
/* @__PURE__ */
|
|
7175
|
-
/* @__PURE__ */
|
|
7176
|
-
/* @__PURE__ */
|
|
7141
|
+
/* @__PURE__ */ jsxs64("div", { className: "flex-1 space-y-1", children: [
|
|
7142
|
+
/* @__PURE__ */ jsx97(Label2, { htmlFor: `bo-name-${row.key}`, className: "text-xs", children: "Name" }),
|
|
7143
|
+
/* @__PURE__ */ jsx97(
|
|
7177
7144
|
Input,
|
|
7178
7145
|
{
|
|
7179
7146
|
id: `bo-name-${row.key}`,
|
|
@@ -7183,9 +7150,9 @@ function OrganizationOnboardingForm({
|
|
|
7183
7150
|
}
|
|
7184
7151
|
)
|
|
7185
7152
|
] }),
|
|
7186
|
-
/* @__PURE__ */
|
|
7187
|
-
/* @__PURE__ */
|
|
7188
|
-
/* @__PURE__ */
|
|
7153
|
+
/* @__PURE__ */ jsxs64("div", { className: "w-40 space-y-1", children: [
|
|
7154
|
+
/* @__PURE__ */ jsx97(Label2, { htmlFor: `bo-country-${row.key}`, className: "text-xs", children: "Country" }),
|
|
7155
|
+
/* @__PURE__ */ jsx97(
|
|
7189
7156
|
Select,
|
|
7190
7157
|
{
|
|
7191
7158
|
id: `bo-country-${row.key}`,
|
|
@@ -7198,9 +7165,9 @@ function OrganizationOnboardingForm({
|
|
|
7198
7165
|
}
|
|
7199
7166
|
)
|
|
7200
7167
|
] }),
|
|
7201
|
-
/* @__PURE__ */
|
|
7202
|
-
/* @__PURE__ */
|
|
7203
|
-
/* @__PURE__ */
|
|
7168
|
+
/* @__PURE__ */ jsxs64("div", { className: "w-24 space-y-1", children: [
|
|
7169
|
+
/* @__PURE__ */ jsx97(Label2, { htmlFor: `bo-share-${row.key}`, className: "text-xs", children: "Share %" }),
|
|
7170
|
+
/* @__PURE__ */ jsx97(
|
|
7204
7171
|
Input,
|
|
7205
7172
|
{
|
|
7206
7173
|
id: `bo-share-${row.key}`,
|
|
@@ -7211,7 +7178,7 @@ function OrganizationOnboardingForm({
|
|
|
7211
7178
|
}
|
|
7212
7179
|
)
|
|
7213
7180
|
] }),
|
|
7214
|
-
/* @__PURE__ */
|
|
7181
|
+
/* @__PURE__ */ jsx97(
|
|
7215
7182
|
Button,
|
|
7216
7183
|
{
|
|
7217
7184
|
type: "button",
|
|
@@ -7226,16 +7193,16 @@ function OrganizationOnboardingForm({
|
|
|
7226
7193
|
},
|
|
7227
7194
|
row.key
|
|
7228
7195
|
)),
|
|
7229
|
-
!ownersValid && /* @__PURE__ */
|
|
7230
|
-
shareSum > 100 && /* @__PURE__ */
|
|
7196
|
+
!ownersValid && /* @__PURE__ */ jsx97("p", { "data-testid": "beneficial-owners-error", className: "text-xs text-text-danger", children: "Every owner needs a name, a country and a share between 0 and 100." }),
|
|
7197
|
+
shareSum > 100 && /* @__PURE__ */ jsxs64("p", { "data-testid": "beneficial-owners-sum-warning", className: "text-xs text-text-warning", children: [
|
|
7231
7198
|
"The listed shares add up to ",
|
|
7232
7199
|
shareSum,
|
|
7233
7200
|
"%, which is more than 100%."
|
|
7234
7201
|
] })
|
|
7235
7202
|
] }),
|
|
7236
|
-
needsOwnershipConfirmation && /* @__PURE__ */
|
|
7237
|
-
/* @__PURE__ */
|
|
7238
|
-
/* @__PURE__ */
|
|
7203
|
+
needsOwnershipConfirmation && /* @__PURE__ */ jsxs64("div", { className: "space-y-1", children: [
|
|
7204
|
+
/* @__PURE__ */ jsxs64("div", { className: "flex items-start gap-2", children: [
|
|
7205
|
+
/* @__PURE__ */ jsx97(
|
|
7239
7206
|
Checkbox,
|
|
7240
7207
|
{
|
|
7241
7208
|
id: "create-org-ownership-confirmed",
|
|
@@ -7245,19 +7212,19 @@ function OrganizationOnboardingForm({
|
|
|
7245
7212
|
onCheckedChange: (value) => setOwnershipConfirmed(value === true)
|
|
7246
7213
|
}
|
|
7247
7214
|
),
|
|
7248
|
-
/* @__PURE__ */
|
|
7215
|
+
/* @__PURE__ */ jsxs64(
|
|
7249
7216
|
Label2,
|
|
7250
7217
|
{
|
|
7251
7218
|
htmlFor: "create-org-ownership-confirmed",
|
|
7252
7219
|
className: "text-xs font-regular leading-snug",
|
|
7253
7220
|
children: [
|
|
7254
7221
|
"I confirm the ownership structure above is complete and correct",
|
|
7255
|
-
/* @__PURE__ */
|
|
7222
|
+
/* @__PURE__ */ jsx97(RequiredMark, {})
|
|
7256
7223
|
]
|
|
7257
7224
|
}
|
|
7258
7225
|
)
|
|
7259
7226
|
] }),
|
|
7260
|
-
showConfirmationError && /* @__PURE__ */
|
|
7227
|
+
showConfirmationError && /* @__PURE__ */ jsx97(
|
|
7261
7228
|
"p",
|
|
7262
7229
|
{
|
|
7263
7230
|
id: "create-org-ownership-error",
|
|
@@ -7267,13 +7234,13 @@ function OrganizationOnboardingForm({
|
|
|
7267
7234
|
}
|
|
7268
7235
|
)
|
|
7269
7236
|
] }),
|
|
7270
|
-
showRequiredError && /* @__PURE__ */
|
|
7271
|
-
(serverError || otherViolations.length > 0) && /* @__PURE__ */
|
|
7237
|
+
showRequiredError && /* @__PURE__ */ jsx97(InlineError, { "data-testid": "create-org-required-error", children: missingRequired.length === 1 ? `${missingRequired[0]} is required` : `These fields are required: ${missingRequired.join(", ")}` }),
|
|
7238
|
+
(serverError || otherViolations.length > 0) && /* @__PURE__ */ jsxs64(InlineError, { "data-testid": "create-org-server-error", children: [
|
|
7272
7239
|
serverError,
|
|
7273
|
-
otherViolations.length > 0 && /* @__PURE__ */
|
|
7240
|
+
otherViolations.length > 0 && /* @__PURE__ */ jsx97("ul", { "data-testid": "create-org-violations", className: "mt-1 list-disc pl-4", children: otherViolations.map((violation) => /* @__PURE__ */ jsx97("li", { children: violation }, violation)) })
|
|
7274
7241
|
] }),
|
|
7275
|
-
/* @__PURE__ */
|
|
7276
|
-
/* @__PURE__ */
|
|
7242
|
+
/* @__PURE__ */ jsxs64("div", { className: "space-y-2 pt-1", children: [
|
|
7243
|
+
/* @__PURE__ */ jsx97(
|
|
7277
7244
|
"button",
|
|
7278
7245
|
{
|
|
7279
7246
|
type: "submit",
|
|
@@ -7284,14 +7251,14 @@ function OrganizationOnboardingForm({
|
|
|
7284
7251
|
children: submitting ? "Creating\u2026" : submitLabel
|
|
7285
7252
|
}
|
|
7286
7253
|
),
|
|
7287
|
-
onCancel && /* @__PURE__ */
|
|
7254
|
+
onCancel && /* @__PURE__ */ jsx97("button", { type: "button", onClick: onCancel, className: cn("cursor-pointer", AUTH_QUIET_BUTTON), children: "Cancel" })
|
|
7288
7255
|
] })
|
|
7289
7256
|
] });
|
|
7290
7257
|
}
|
|
7291
7258
|
|
|
7292
7259
|
// src/components/list-columns.tsx
|
|
7293
|
-
import * as
|
|
7294
|
-
import { jsx as
|
|
7260
|
+
import * as React84 from "react";
|
|
7261
|
+
import { jsx as jsx98, jsxs as jsxs65 } from "react/jsx-runtime";
|
|
7295
7262
|
var CELL_WIDTH = { 20: "w-20", 24: "w-24", 28: "w-28", 32: "w-32" };
|
|
7296
7263
|
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";
|
|
7297
7264
|
var cellsClass = "flex shrink-0 items-center gap-3";
|
|
@@ -7309,13 +7276,13 @@ function warnDuplicateKeys(columns, where) {
|
|
|
7309
7276
|
seen.add(c.key);
|
|
7310
7277
|
}
|
|
7311
7278
|
}
|
|
7312
|
-
var ListHeader =
|
|
7279
|
+
var ListHeader = React84.forwardRef(function ListHeader2({ lead, columns, mark = true, trailing = true, className, ...props }, ref) {
|
|
7313
7280
|
warnDuplicateKeys(columns, "ListHeader");
|
|
7314
|
-
return /* @__PURE__ */
|
|
7315
|
-
mark && /* @__PURE__ */
|
|
7316
|
-
/* @__PURE__ */
|
|
7317
|
-
/* @__PURE__ */
|
|
7318
|
-
trailing && /* @__PURE__ */
|
|
7281
|
+
return /* @__PURE__ */ jsxs65("div", { ref, className: cn(headerClass, className), ...props, children: [
|
|
7282
|
+
mark && /* @__PURE__ */ jsx98("span", { className: "size-8 shrink-0", "aria-hidden": true }),
|
|
7283
|
+
/* @__PURE__ */ jsx98("span", { className: "min-w-0 flex-1 truncate", children: lead }),
|
|
7284
|
+
/* @__PURE__ */ jsx98("span", { className: cellsClass, children: columns.map((c) => /* @__PURE__ */ jsx98("span", { className: cn(CELL_WIDTH[c.width], cellClass), children: c.label }, c.key)) }),
|
|
7285
|
+
trailing && /* @__PURE__ */ jsx98("span", { className: "size-4 shrink-0", "aria-hidden": true })
|
|
7319
7286
|
] });
|
|
7320
7287
|
});
|
|
7321
7288
|
function cellValue(values, column) {
|
|
@@ -7323,9 +7290,9 @@ function cellValue(values, column) {
|
|
|
7323
7290
|
const value = values[column.key];
|
|
7324
7291
|
return value === void 0 || value === null || value === "" ? column.fallback : value;
|
|
7325
7292
|
}
|
|
7326
|
-
var ListCells =
|
|
7293
|
+
var ListCells = React84.forwardRef(function ListCells2({ columns, values, className, ...props }, ref) {
|
|
7327
7294
|
warnDuplicateKeys(columns, "ListCells");
|
|
7328
|
-
return /* @__PURE__ */
|
|
7295
|
+
return /* @__PURE__ */ jsx98("span", { ref, className: cn(cellsClass, className), ...props, children: columns.map((c) => /* @__PURE__ */ jsx98(
|
|
7329
7296
|
"span",
|
|
7330
7297
|
{
|
|
7331
7298
|
className: cn(CELL_WIDTH[c.width], cellClass, c.quiet && "text-text-tertiary"),
|
|
@@ -7338,9 +7305,9 @@ ListHeader.displayName = "ListHeader";
|
|
|
7338
7305
|
ListCells.displayName = "ListCells";
|
|
7339
7306
|
|
|
7340
7307
|
// src/components/theme-picker.tsx
|
|
7341
|
-
import * as
|
|
7308
|
+
import * as React85 from "react";
|
|
7342
7309
|
import { Check as Check12 } from "lucide-react";
|
|
7343
|
-
import { jsx as
|
|
7310
|
+
import { jsx as jsx99, jsxs as jsxs66 } from "react/jsx-runtime";
|
|
7344
7311
|
var THEME_SWATCHES = {
|
|
7345
7312
|
// --bg-surface --bg-sunken --bg-overlay --border-default --text-tertiary
|
|
7346
7313
|
light: { canvas: "#f2f3f4", rail: "#e1e2e4", body: "#ffffff", quiet: "#bbbec7", strong: "#535a6e" },
|
|
@@ -7354,13 +7321,13 @@ var OPTIONS = [
|
|
|
7354
7321
|
{ value: "system", label: "Auto", name: "Auto, follows your device theme" }
|
|
7355
7322
|
];
|
|
7356
7323
|
function Panels({ palette }) {
|
|
7357
|
-
return /* @__PURE__ */
|
|
7358
|
-
/* @__PURE__ */
|
|
7324
|
+
return /* @__PURE__ */ jsxs66("span", { className: "flex h-full gap-1.5 p-1.5", style: { background: palette.canvas }, children: [
|
|
7325
|
+
/* @__PURE__ */ jsx99(
|
|
7359
7326
|
"span",
|
|
7360
7327
|
{
|
|
7361
7328
|
className: "flex flex-col gap-1.5 p-1.5",
|
|
7362
7329
|
style: { width: "28%", borderRadius: 5, background: palette.rail },
|
|
7363
|
-
children: RAIL_BARS.map((w, i) => /* @__PURE__ */
|
|
7330
|
+
children: RAIL_BARS.map((w, i) => /* @__PURE__ */ jsx99(
|
|
7364
7331
|
"span",
|
|
7365
7332
|
{
|
|
7366
7333
|
className: "rounded-full",
|
|
@@ -7370,12 +7337,12 @@ function Panels({ palette }) {
|
|
|
7370
7337
|
))
|
|
7371
7338
|
}
|
|
7372
7339
|
),
|
|
7373
|
-
/* @__PURE__ */
|
|
7340
|
+
/* @__PURE__ */ jsx99(
|
|
7374
7341
|
"span",
|
|
7375
7342
|
{
|
|
7376
7343
|
className: "flex flex-1 flex-col gap-1.5 border p-2",
|
|
7377
7344
|
style: { borderRadius: 5, background: palette.body, borderColor: palette.quiet },
|
|
7378
|
-
children: BODY_BARS.map((w, i) => /* @__PURE__ */
|
|
7345
|
+
children: BODY_BARS.map((w, i) => /* @__PURE__ */ jsx99(
|
|
7379
7346
|
"span",
|
|
7380
7347
|
{
|
|
7381
7348
|
className: "rounded-full",
|
|
@@ -7389,21 +7356,21 @@ function Panels({ palette }) {
|
|
|
7389
7356
|
}
|
|
7390
7357
|
var CUT = "polygon(0 0, -8px 0, -8px calc(100% + 8px), calc(100% + 8px) calc(100% + 8px), calc(100% + 8px) calc(100% - 16px), 100% calc(100% - 16px))";
|
|
7391
7358
|
function AutoPanels() {
|
|
7392
|
-
return /* @__PURE__ */
|
|
7393
|
-
/* @__PURE__ */
|
|
7394
|
-
/* @__PURE__ */
|
|
7359
|
+
return /* @__PURE__ */ jsxs66("span", { className: "relative block h-full", children: [
|
|
7360
|
+
/* @__PURE__ */ jsx99("span", { className: "absolute inset-0", children: /* @__PURE__ */ jsx99(Panels, { palette: THEME_SWATCHES.light }) }),
|
|
7361
|
+
/* @__PURE__ */ jsx99("span", { className: "absolute inset-0", style: { clipPath: CUT }, children: /* @__PURE__ */ jsx99(Panels, { palette: THEME_SWATCHES.dark }) })
|
|
7395
7362
|
] });
|
|
7396
7363
|
}
|
|
7397
7364
|
var previewClass = "block h-28 overflow-hidden rounded-lg border border-border-default";
|
|
7398
7365
|
var cardClass = "grid cursor-pointer gap-2 rounded-lg p-1.5 text-left transition-colors duration-fast hover:bg-[var(--hov-bg)] focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-border-focus";
|
|
7399
7366
|
var TRACK = { gridTemplateColumns: "repeat(auto-fit, minmax(8rem, 1fr))" };
|
|
7400
|
-
var Picker =
|
|
7401
|
-
return /* @__PURE__ */
|
|
7367
|
+
var Picker = React85.forwardRef(function Picker2({ value, onValueChange, className, ...props }, ref) {
|
|
7368
|
+
return /* @__PURE__ */ jsx99("div", { role: "group", "aria-label": "Theme", ...props, ref, className: cn("grid gap-4", className), style: { ...TRACK, ...props.style }, children: OPTIONS.map((o) => {
|
|
7402
7369
|
const selected = o.value === value;
|
|
7403
7370
|
return (
|
|
7404
7371
|
// Not a `Button` (Guidelines/When it isn't a Button): the preview is the control, and
|
|
7405
7372
|
// `aria-pressed` is what says which one is on.
|
|
7406
|
-
/* @__PURE__ */
|
|
7373
|
+
/* @__PURE__ */ jsxs66(
|
|
7407
7374
|
"button",
|
|
7408
7375
|
{
|
|
7409
7376
|
type: "button",
|
|
@@ -7412,8 +7379,8 @@ var Picker = React86.forwardRef(function Picker2({ value, onValueChange, classNa
|
|
|
7412
7379
|
onClick: () => onValueChange(o.value),
|
|
7413
7380
|
className: cardClass,
|
|
7414
7381
|
children: [
|
|
7415
|
-
/* @__PURE__ */
|
|
7416
|
-
/* @__PURE__ */
|
|
7382
|
+
/* @__PURE__ */ jsx99("span", { className: cn(previewClass, selected && "border-border-strong"), "aria-hidden": true, children: o.value === "system" ? /* @__PURE__ */ jsx99(AutoPanels, {}) : /* @__PURE__ */ jsx99(Panels, { palette: THEME_SWATCHES[o.value] }) }),
|
|
7383
|
+
/* @__PURE__ */ jsxs66(
|
|
7417
7384
|
"span",
|
|
7418
7385
|
{
|
|
7419
7386
|
className: cn(
|
|
@@ -7421,7 +7388,7 @@ var Picker = React86.forwardRef(function Picker2({ value, onValueChange, classNa
|
|
|
7421
7388
|
selected ? "font-semibold text-text-primary" : "text-text-secondary"
|
|
7422
7389
|
),
|
|
7423
7390
|
children: [
|
|
7424
|
-
/* @__PURE__ */
|
|
7391
|
+
/* @__PURE__ */ jsx99(Check12, { className: cn("size-4 shrink-0", !selected && "invisible"), "aria-hidden": true }),
|
|
7425
7392
|
o.label
|
|
7426
7393
|
]
|
|
7427
7394
|
}
|
|
@@ -7433,9 +7400,9 @@ var Picker = React86.forwardRef(function Picker2({ value, onValueChange, classNa
|
|
|
7433
7400
|
);
|
|
7434
7401
|
}) });
|
|
7435
7402
|
});
|
|
7436
|
-
var WiredPicker =
|
|
7403
|
+
var WiredPicker = React85.forwardRef(function WiredPicker2({ onValueChange, ...props }, ref) {
|
|
7437
7404
|
const { theme, setTheme } = useTheme();
|
|
7438
|
-
return /* @__PURE__ */
|
|
7405
|
+
return /* @__PURE__ */ jsx99(
|
|
7439
7406
|
Picker,
|
|
7440
7407
|
{
|
|
7441
7408
|
...props,
|
|
@@ -7448,22 +7415,22 @@ var WiredPicker = React86.forwardRef(function WiredPicker2({ onValueChange, ...p
|
|
|
7448
7415
|
}
|
|
7449
7416
|
);
|
|
7450
7417
|
});
|
|
7451
|
-
var ThemePicker =
|
|
7452
|
-
const controlled =
|
|
7418
|
+
var ThemePicker = React85.forwardRef(function ThemePicker2({ value, onValueChange, ...props }, ref) {
|
|
7419
|
+
const controlled = React85.useRef(value !== void 0);
|
|
7453
7420
|
if (process.env.NODE_ENV !== "production" && controlled.current !== (value !== void 0)) {
|
|
7454
7421
|
console.warn(
|
|
7455
7422
|
"[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."
|
|
7456
7423
|
);
|
|
7457
7424
|
}
|
|
7458
|
-
return controlled.current ? /* @__PURE__ */
|
|
7459
|
-
}) }) : /* @__PURE__ */
|
|
7425
|
+
return controlled.current ? /* @__PURE__ */ jsx99(Picker, { ...props, ref, value: value ?? "system", onValueChange: onValueChange ?? (() => {
|
|
7426
|
+
}) }) : /* @__PURE__ */ jsx99(WiredPicker, { ...props, ref, onValueChange });
|
|
7460
7427
|
});
|
|
7461
7428
|
ThemePicker.displayName = "ThemePicker";
|
|
7462
7429
|
|
|
7463
7430
|
// src/components/secret-reveal.tsx
|
|
7464
|
-
import * as
|
|
7431
|
+
import * as React86 from "react";
|
|
7465
7432
|
import { Copy as Copy2, Download } from "lucide-react";
|
|
7466
|
-
import { jsx as
|
|
7433
|
+
import { jsx as jsx100, jsxs as jsxs67 } from "react/jsx-runtime";
|
|
7467
7434
|
var asText = (value) => Array.isArray(value) ? value.join("\n") : value;
|
|
7468
7435
|
var REVEALED = "A secret is on screen and will not be shown again.";
|
|
7469
7436
|
var REFUSED = "The browser refused the clipboard. Select the value to copy it.";
|
|
@@ -7471,15 +7438,15 @@ function SecretValue({ value }) {
|
|
|
7471
7438
|
if (Array.isArray(value)) {
|
|
7472
7439
|
const half = Math.ceil(value.length / 2);
|
|
7473
7440
|
const columns = [value.slice(0, half), value.slice(half)].filter((column) => column.length > 0);
|
|
7474
|
-
return /* @__PURE__ */
|
|
7441
|
+
return /* @__PURE__ */ jsx100("div", { className: "flex w-fit gap-x-12", children: columns.map((column, index) => (
|
|
7475
7442
|
// Neither the columns nor the values inside one are ever reordered, and two identical
|
|
7476
7443
|
// values in a list are legal, so the index is the key and the value is not.
|
|
7477
|
-
/* @__PURE__ */
|
|
7444
|
+
/* @__PURE__ */ jsx100("div", { className: "grid gap-y-1.5", children: column.map((line, row) => /* @__PURE__ */ jsx100("code", { className: "font-mono text-sm font-medium tabular-nums text-text-primary", children: line }, row)) }, index)
|
|
7478
7445
|
)) });
|
|
7479
7446
|
}
|
|
7480
|
-
return /* @__PURE__ */
|
|
7447
|
+
return /* @__PURE__ */ jsx100("code", { className: "block break-all font-mono text-sm font-medium text-text-primary", children: value });
|
|
7481
7448
|
}
|
|
7482
|
-
var SecretReveal =
|
|
7449
|
+
var SecretReveal = React86.forwardRef(
|
|
7483
7450
|
({
|
|
7484
7451
|
value,
|
|
7485
7452
|
caption,
|
|
@@ -7496,18 +7463,18 @@ var SecretReveal = React87.forwardRef(
|
|
|
7496
7463
|
className,
|
|
7497
7464
|
...props
|
|
7498
7465
|
}, ref) => {
|
|
7499
|
-
const [takenText, setTakenText] =
|
|
7500
|
-
const [refusedText, setRefusedText] =
|
|
7501
|
-
const [announcedFor, setAnnouncedFor] =
|
|
7502
|
-
const copyRef =
|
|
7503
|
-
const captionId =
|
|
7466
|
+
const [takenText, setTakenText] = React86.useState(null);
|
|
7467
|
+
const [refusedText, setRefusedText] = React86.useState(null);
|
|
7468
|
+
const [announcedFor, setAnnouncedFor] = React86.useState(null);
|
|
7469
|
+
const copyRef = React86.useRef(null);
|
|
7470
|
+
const captionId = React86.useId();
|
|
7504
7471
|
const text = asText(value);
|
|
7505
7472
|
const empty = text.length === 0;
|
|
7506
7473
|
const taken = takenText === text;
|
|
7507
7474
|
const refused = refusedText === text;
|
|
7508
|
-
|
|
7475
|
+
React86.useEffect(() => setAnnouncedFor(text), [text]);
|
|
7509
7476
|
const announced = announcedFor === text ? REVEALED : "";
|
|
7510
|
-
|
|
7477
|
+
React86.useEffect(() => {
|
|
7511
7478
|
if (autoFocus) copyRef.current?.focus();
|
|
7512
7479
|
}, [autoFocus]);
|
|
7513
7480
|
const reportTaken = () => {
|
|
@@ -7533,12 +7500,12 @@ var SecretReveal = React87.forwardRef(
|
|
|
7533
7500
|
reportTaken();
|
|
7534
7501
|
onDownload?.();
|
|
7535
7502
|
};
|
|
7536
|
-
return /* @__PURE__ */
|
|
7537
|
-
/* @__PURE__ */
|
|
7538
|
-
/* @__PURE__ */
|
|
7539
|
-
/* @__PURE__ */
|
|
7540
|
-
/* @__PURE__ */
|
|
7541
|
-
/* @__PURE__ */
|
|
7503
|
+
return /* @__PURE__ */ jsx100("div", { ref, className: cn("overflow-hidden rounded-lg bg-bg-sunken", className), ...props, children: /* @__PURE__ */ jsx100("div", { className: highlightClassName, ref: highlightRef, children: /* @__PURE__ */ jsxs67("div", { className: "grid gap-3 rounded-lg border border-border-strong px-4 py-3", children: [
|
|
7504
|
+
/* @__PURE__ */ jsx100("span", { role: "status", className: "sr-only", children: announced }),
|
|
7505
|
+
/* @__PURE__ */ jsx100("div", { id: captionId, className: "text-sm text-text-secondary", children: caption }),
|
|
7506
|
+
/* @__PURE__ */ jsx100(SecretValue, { value }),
|
|
7507
|
+
/* @__PURE__ */ jsxs67("div", { className: "flex flex-wrap items-center gap-2", children: [
|
|
7508
|
+
/* @__PURE__ */ jsx100(
|
|
7542
7509
|
Button,
|
|
7543
7510
|
{
|
|
7544
7511
|
ref: copyRef,
|
|
@@ -7546,12 +7513,12 @@ var SecretReveal = React87.forwardRef(
|
|
|
7546
7513
|
"aria-describedby": captionId,
|
|
7547
7514
|
variant: "outline",
|
|
7548
7515
|
size: "sm",
|
|
7549
|
-
icon: /* @__PURE__ */
|
|
7516
|
+
icon: /* @__PURE__ */ jsx100(Copy2, {}),
|
|
7550
7517
|
children: copyLabel ?? (Array.isArray(value) ? "Copy all" : "Copy")
|
|
7551
7518
|
}
|
|
7552
7519
|
),
|
|
7553
|
-
onDownload && /* @__PURE__ */
|
|
7554
|
-
/* @__PURE__ */
|
|
7520
|
+
onDownload && /* @__PURE__ */ jsx100(Button, { onClick: download, "aria-describedby": captionId, variant: "outline", size: "sm", icon: /* @__PURE__ */ jsx100(Download, {}), children: downloadLabel }),
|
|
7521
|
+
/* @__PURE__ */ jsx100(
|
|
7555
7522
|
Button,
|
|
7556
7523
|
{
|
|
7557
7524
|
onClick: onConfirm,
|
|
@@ -7562,17 +7529,17 @@ var SecretReveal = React87.forwardRef(
|
|
|
7562
7529
|
}
|
|
7563
7530
|
)
|
|
7564
7531
|
] }),
|
|
7565
|
-
refused && /* @__PURE__ */
|
|
7532
|
+
refused && /* @__PURE__ */ jsx100("div", { role: "status", className: "text-xs text-text-tertiary", children: REFUSED })
|
|
7566
7533
|
] }) }) });
|
|
7567
7534
|
}
|
|
7568
7535
|
);
|
|
7569
7536
|
SecretReveal.displayName = "SecretReveal";
|
|
7570
7537
|
|
|
7571
7538
|
// src/components/star-rating.tsx
|
|
7572
|
-
import * as
|
|
7539
|
+
import * as React87 from "react";
|
|
7573
7540
|
import * as RadioGroupPrimitive2 from "@radix-ui/react-radio-group";
|
|
7574
7541
|
import { Star } from "lucide-react";
|
|
7575
|
-
import { jsx as
|
|
7542
|
+
import { jsx as jsx101 } from "react/jsx-runtime";
|
|
7576
7543
|
var STAR_BOX = {
|
|
7577
7544
|
sm: "size-4",
|
|
7578
7545
|
md: "size-5",
|
|
@@ -7584,7 +7551,7 @@ var ROW_GAP = {
|
|
|
7584
7551
|
lg: "gap-1.5"
|
|
7585
7552
|
};
|
|
7586
7553
|
var defaultItemLabel = (value, max) => `${value} out of ${max} stars`;
|
|
7587
|
-
var StarGlyph = ({ filled, size }) => /* @__PURE__ */
|
|
7554
|
+
var StarGlyph = ({ filled, size }) => /* @__PURE__ */ jsx101(
|
|
7588
7555
|
Star,
|
|
7589
7556
|
{
|
|
7590
7557
|
"aria-hidden": "true",
|
|
@@ -7595,7 +7562,7 @@ var StarGlyph = ({ filled, size }) => /* @__PURE__ */ jsx102(
|
|
|
7595
7562
|
)
|
|
7596
7563
|
}
|
|
7597
7564
|
);
|
|
7598
|
-
var StarRating =
|
|
7565
|
+
var StarRating = React87.forwardRef(
|
|
7599
7566
|
({
|
|
7600
7567
|
className,
|
|
7601
7568
|
value,
|
|
@@ -7610,27 +7577,27 @@ var StarRating = React88.forwardRef(
|
|
|
7610
7577
|
...props
|
|
7611
7578
|
}, ref) => {
|
|
7612
7579
|
const stars = Array.from({ length: max }, (_, index) => index + 1);
|
|
7613
|
-
const [mirror, setMirror] =
|
|
7580
|
+
const [mirror, setMirror] = React87.useState(defaultValue ?? 0);
|
|
7614
7581
|
const selected = value ?? mirror;
|
|
7615
|
-
const [preview, setPreview] =
|
|
7582
|
+
const [preview, setPreview] = React87.useState(null);
|
|
7616
7583
|
const shown = preview ?? selected;
|
|
7617
7584
|
const commit = (next) => {
|
|
7618
7585
|
setMirror(next);
|
|
7619
7586
|
onValueChange?.(next);
|
|
7620
7587
|
};
|
|
7621
7588
|
if (readOnly) {
|
|
7622
|
-
return /* @__PURE__ */
|
|
7589
|
+
return /* @__PURE__ */ jsx101(
|
|
7623
7590
|
"div",
|
|
7624
7591
|
{
|
|
7625
7592
|
ref,
|
|
7626
7593
|
role: "img",
|
|
7627
7594
|
"aria-label": props["aria-label"] ?? itemLabel(selected, max),
|
|
7628
7595
|
className: cn("inline-flex items-center", ROW_GAP[size], className),
|
|
7629
|
-
children: stars.map((star) => /* @__PURE__ */
|
|
7596
|
+
children: stars.map((star) => /* @__PURE__ */ jsx101(StarGlyph, { filled: star <= selected, size }, star))
|
|
7630
7597
|
}
|
|
7631
7598
|
);
|
|
7632
7599
|
}
|
|
7633
|
-
return /* @__PURE__ */
|
|
7600
|
+
return /* @__PURE__ */ jsx101(
|
|
7634
7601
|
RadioGroupPrimitive2.Root,
|
|
7635
7602
|
{
|
|
7636
7603
|
ref,
|
|
@@ -7647,7 +7614,7 @@ var StarRating = React88.forwardRef(
|
|
|
7647
7614
|
orientation: "horizontal",
|
|
7648
7615
|
loop: false,
|
|
7649
7616
|
className: cn("inline-flex items-center", ROW_GAP[size], className),
|
|
7650
|
-
children: stars.map((star) => /* @__PURE__ */
|
|
7617
|
+
children: stars.map((star) => /* @__PURE__ */ jsx101(
|
|
7651
7618
|
RadioGroupPrimitive2.Item,
|
|
7652
7619
|
{
|
|
7653
7620
|
value: String(star),
|
|
@@ -7663,7 +7630,7 @@ var StarRating = React88.forwardRef(
|
|
|
7663
7630
|
"rounded-md p-0.5 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-border-focus",
|
|
7664
7631
|
"disabled:pointer-events-none disabled:opacity-50"
|
|
7665
7632
|
),
|
|
7666
|
-
children: /* @__PURE__ */
|
|
7633
|
+
children: /* @__PURE__ */ jsx101(StarGlyph, { filled: star <= shown, size })
|
|
7667
7634
|
},
|
|
7668
7635
|
star
|
|
7669
7636
|
))
|
|
@@ -7674,16 +7641,16 @@ var StarRating = React88.forwardRef(
|
|
|
7674
7641
|
StarRating.displayName = "StarRating";
|
|
7675
7642
|
|
|
7676
7643
|
// src/components/rating-scale.tsx
|
|
7677
|
-
import * as
|
|
7644
|
+
import * as React88 from "react";
|
|
7678
7645
|
import * as RadioGroupPrimitive3 from "@radix-ui/react-radio-group";
|
|
7679
|
-
import { jsx as
|
|
7646
|
+
import { jsx as jsx102, jsxs as jsxs68 } from "react/jsx-runtime";
|
|
7680
7647
|
var SLOT_BOX = {
|
|
7681
7648
|
sm: "h-8 min-w-8 px-2 text-xs",
|
|
7682
7649
|
md: "h-9 min-w-9 px-2 text-sm",
|
|
7683
7650
|
lg: "h-11 min-w-11 px-3 text-base"
|
|
7684
7651
|
};
|
|
7685
7652
|
var defaultItemLabel2 = (value, _min, max) => `${value} out of ${max}`;
|
|
7686
|
-
var RatingScale =
|
|
7653
|
+
var RatingScale = React88.forwardRef(
|
|
7687
7654
|
({
|
|
7688
7655
|
className,
|
|
7689
7656
|
value,
|
|
@@ -7699,9 +7666,9 @@ var RatingScale = React89.forwardRef(
|
|
|
7699
7666
|
...props
|
|
7700
7667
|
}, ref) => {
|
|
7701
7668
|
const slots = Array.from({ length: Math.max(0, max - min + 1) }, (_, index) => min + index);
|
|
7702
|
-
const [mirror, setMirror] =
|
|
7669
|
+
const [mirror, setMirror] = React88.useState(defaultValue);
|
|
7703
7670
|
const selected = value ?? mirror;
|
|
7704
|
-
const row = /* @__PURE__ */
|
|
7671
|
+
const row = /* @__PURE__ */ jsx102("div", { className: cn("flex flex-wrap items-center gap-1.5", !endLabels && className), children: slots.map((slot) => {
|
|
7705
7672
|
const isSelected = slot === selected;
|
|
7706
7673
|
const box = cn(
|
|
7707
7674
|
"inline-flex items-center justify-center rounded-md border tabular-nums transition-colors duration-fast",
|
|
@@ -7709,9 +7676,9 @@ var RatingScale = React89.forwardRef(
|
|
|
7709
7676
|
isSelected ? "border-border-strong font-semibold text-text-primary" : "border-field-border font-medium text-text-secondary"
|
|
7710
7677
|
);
|
|
7711
7678
|
if (readOnly) {
|
|
7712
|
-
return /* @__PURE__ */
|
|
7679
|
+
return /* @__PURE__ */ jsx102("span", { className: box, "aria-hidden": "true", children: slot }, slot);
|
|
7713
7680
|
}
|
|
7714
|
-
return /* @__PURE__ */
|
|
7681
|
+
return /* @__PURE__ */ jsx102(
|
|
7715
7682
|
RadioGroupPrimitive3.Item,
|
|
7716
7683
|
{
|
|
7717
7684
|
value: String(slot),
|
|
@@ -7730,12 +7697,12 @@ var RatingScale = React89.forwardRef(
|
|
|
7730
7697
|
slot
|
|
7731
7698
|
);
|
|
7732
7699
|
}) });
|
|
7733
|
-
const ends = endLabels ? /* @__PURE__ */
|
|
7734
|
-
/* @__PURE__ */
|
|
7735
|
-
/* @__PURE__ */
|
|
7700
|
+
const ends = endLabels ? /* @__PURE__ */ jsxs68("div", { className: "flex items-center justify-between text-xs text-text-tertiary", children: [
|
|
7701
|
+
/* @__PURE__ */ jsx102("span", { children: endLabels.low }),
|
|
7702
|
+
/* @__PURE__ */ jsx102("span", { children: endLabels.high })
|
|
7736
7703
|
] }) : null;
|
|
7737
7704
|
if (readOnly) {
|
|
7738
|
-
return /* @__PURE__ */
|
|
7705
|
+
return /* @__PURE__ */ jsxs68(
|
|
7739
7706
|
"div",
|
|
7740
7707
|
{
|
|
7741
7708
|
ref,
|
|
@@ -7749,7 +7716,7 @@ var RatingScale = React89.forwardRef(
|
|
|
7749
7716
|
}
|
|
7750
7717
|
);
|
|
7751
7718
|
}
|
|
7752
|
-
const group = /* @__PURE__ */
|
|
7719
|
+
const group = /* @__PURE__ */ jsx102(
|
|
7753
7720
|
RadioGroupPrimitive3.Root,
|
|
7754
7721
|
{
|
|
7755
7722
|
ref,
|
|
@@ -7768,7 +7735,7 @@ var RatingScale = React89.forwardRef(
|
|
|
7768
7735
|
}
|
|
7769
7736
|
);
|
|
7770
7737
|
if (!endLabels) return group;
|
|
7771
|
-
return /* @__PURE__ */
|
|
7738
|
+
return /* @__PURE__ */ jsxs68("div", { className: cn("flex flex-col gap-1.5", className), children: [
|
|
7772
7739
|
group,
|
|
7773
7740
|
ends
|
|
7774
7741
|
] });
|