@ship-it-ui/ui 0.0.8 → 0.0.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +1162 -485
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +305 -26
- package/dist/index.d.ts +305 -26
- package/dist/index.js +1159 -483
- package/dist/index.js.map +1 -1
- package/package.json +27 -27
package/dist/index.js
CHANGED
|
@@ -138,14 +138,16 @@ function useOutsideClick(ref, handler, enabled = true) {
|
|
|
138
138
|
}
|
|
139
139
|
|
|
140
140
|
// src/hooks/useTheme.ts
|
|
141
|
-
import { useCallback as useCallback4, useEffect as useEffect4, useState as useState4 } from "react";
|
|
141
|
+
import { useCallback as useCallback4, useEffect as useEffect4, useRef as useRef3, useState as useState4 } from "react";
|
|
142
142
|
function useTheme() {
|
|
143
143
|
const [theme, setThemeState] = useState4("dark");
|
|
144
|
+
const internalMutation = useRef3(false);
|
|
144
145
|
const setTheme = useCallback4((next) => {
|
|
145
146
|
if (typeof document === "undefined") {
|
|
146
147
|
setThemeState(next);
|
|
147
148
|
return;
|
|
148
149
|
}
|
|
150
|
+
internalMutation.current = true;
|
|
149
151
|
if (next === "light") {
|
|
150
152
|
document.documentElement.setAttribute("data-theme", "light");
|
|
151
153
|
} else {
|
|
@@ -160,6 +162,10 @@ function useTheme() {
|
|
|
160
162
|
const initial = document.documentElement.getAttribute("data-theme");
|
|
161
163
|
setThemeState(initial === "light" ? "light" : "dark");
|
|
162
164
|
const observer = new MutationObserver(() => {
|
|
165
|
+
if (internalMutation.current) {
|
|
166
|
+
internalMutation.current = false;
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
163
169
|
const attr = document.documentElement.getAttribute("data-theme");
|
|
164
170
|
setThemeState(attr === "light" ? "light" : "dark");
|
|
165
171
|
});
|
|
@@ -544,7 +550,7 @@ import {
|
|
|
544
550
|
useCallback as useCallback5,
|
|
545
551
|
useEffect as useEffect5,
|
|
546
552
|
useImperativeHandle,
|
|
547
|
-
useRef as
|
|
553
|
+
useRef as useRef4,
|
|
548
554
|
useState as useState5
|
|
549
555
|
} from "react";
|
|
550
556
|
import { jsx as jsx8, jsxs as jsxs5 } from "react/jsx-runtime";
|
|
@@ -612,7 +618,7 @@ var InlineEdit = forwardRef7(function InlineEdit2({
|
|
|
612
618
|
});
|
|
613
619
|
const [draft, setDraft] = useState5(value);
|
|
614
620
|
const [error, setError] = useState5(null);
|
|
615
|
-
const inputRef =
|
|
621
|
+
const inputRef = useRef4(null);
|
|
616
622
|
useEffect5(() => {
|
|
617
623
|
if (!editing) {
|
|
618
624
|
setDraft(value);
|
|
@@ -855,7 +861,7 @@ import {
|
|
|
855
861
|
useCallback as useCallback6,
|
|
856
862
|
useEffect as useEffect6,
|
|
857
863
|
useId as useId3,
|
|
858
|
-
useRef as
|
|
864
|
+
useRef as useRef5
|
|
859
865
|
} from "react";
|
|
860
866
|
import { jsx as jsx11, jsxs as jsxs8 } from "react/jsx-runtime";
|
|
861
867
|
var wrapperSizes = {
|
|
@@ -891,8 +897,8 @@ var NumberInput = forwardRef10(function NumberInput2({
|
|
|
891
897
|
});
|
|
892
898
|
const reactId = useId3();
|
|
893
899
|
const id = idProp ?? `ni-${reactId}`;
|
|
894
|
-
const repeatTimer =
|
|
895
|
-
const repeatInterval =
|
|
900
|
+
const repeatTimer = useRef5(void 0);
|
|
901
|
+
const repeatInterval = useRef5(void 0);
|
|
896
902
|
const clamp = useCallback6((n) => Math.min(max, Math.max(min, n)), [min, max]);
|
|
897
903
|
const bump = useCallback6(
|
|
898
904
|
(dir) => {
|
|
@@ -1008,13 +1014,13 @@ import {
|
|
|
1008
1014
|
forwardRef as forwardRef11,
|
|
1009
1015
|
useId as useId4,
|
|
1010
1016
|
useImperativeHandle as useImperativeHandle2,
|
|
1011
|
-
useRef as
|
|
1017
|
+
useRef as useRef6,
|
|
1012
1018
|
useState as useState6
|
|
1013
1019
|
} from "react";
|
|
1014
1020
|
import { jsx as jsx12, jsxs as jsxs9 } from "react/jsx-runtime";
|
|
1015
1021
|
var OTP = forwardRef11(function OTP2({ length = 6, onComplete, onChange, defaultValue = "", ariaLabel = "Code", className, disabled }, ref) {
|
|
1016
1022
|
const baseId = useId4();
|
|
1017
|
-
const refs =
|
|
1023
|
+
const refs = useRef6([]);
|
|
1018
1024
|
const [values, setValues] = useState6(
|
|
1019
1025
|
() => Array.from({ length }, (_, i) => defaultValue[i] ?? "")
|
|
1020
1026
|
);
|
|
@@ -1563,6 +1569,53 @@ AccordionContent.displayName = "AccordionContent";
|
|
|
1563
1569
|
import * as RadixAvatar from "@radix-ui/react-avatar";
|
|
1564
1570
|
import { forwardRef as forwardRef20 } from "react";
|
|
1565
1571
|
|
|
1572
|
+
// src/utils/color-override.ts
|
|
1573
|
+
var HEX = /^#(?:[0-9a-fA-F]{3,4}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$/;
|
|
1574
|
+
var FUNCTIONAL = /^(?:rgba?|hsla?|hwb|lab|lch|oklab|oklch|color|color-mix)\([^()]*(?:\([^()]*\)[^()]*)*\)$/;
|
|
1575
|
+
var KEYWORDS = /* @__PURE__ */ new Set([
|
|
1576
|
+
"transparent",
|
|
1577
|
+
"currentColor",
|
|
1578
|
+
"currentcolor",
|
|
1579
|
+
"inherit",
|
|
1580
|
+
"initial",
|
|
1581
|
+
"unset",
|
|
1582
|
+
"red",
|
|
1583
|
+
"green",
|
|
1584
|
+
"blue",
|
|
1585
|
+
"black",
|
|
1586
|
+
"white",
|
|
1587
|
+
"gray",
|
|
1588
|
+
"grey",
|
|
1589
|
+
"orange",
|
|
1590
|
+
"yellow",
|
|
1591
|
+
"purple",
|
|
1592
|
+
"pink",
|
|
1593
|
+
"brown",
|
|
1594
|
+
"cyan",
|
|
1595
|
+
"magenta"
|
|
1596
|
+
]);
|
|
1597
|
+
var isValid = (value) => {
|
|
1598
|
+
const v = value.trim();
|
|
1599
|
+
if (!v) return false;
|
|
1600
|
+
if (typeof CSS !== "undefined" && typeof CSS.supports === "function") {
|
|
1601
|
+
return CSS.supports("color", v);
|
|
1602
|
+
}
|
|
1603
|
+
return HEX.test(v) || FUNCTIONAL.test(v) || KEYWORDS.has(v);
|
|
1604
|
+
};
|
|
1605
|
+
var warnIfInvalidColor = (value, component) => {
|
|
1606
|
+
if (isValid(value)) return true;
|
|
1607
|
+
if (process.env.NODE_ENV !== "production") {
|
|
1608
|
+
console.warn(
|
|
1609
|
+
`[${component}] Invalid color value "${value}". Falling back to the default variant. Use a hex, rgb/rgba, hsl, oklch, lab/lch, color(), color-mix(), or a CSS color keyword.`
|
|
1610
|
+
);
|
|
1611
|
+
}
|
|
1612
|
+
return false;
|
|
1613
|
+
};
|
|
1614
|
+
var tintStyle = (color) => ({
|
|
1615
|
+
background: `color-mix(in oklab, ${color}, transparent 85%)`,
|
|
1616
|
+
color
|
|
1617
|
+
});
|
|
1618
|
+
|
|
1566
1619
|
// src/components/StatusDot/StatusDot.tsx
|
|
1567
1620
|
import { forwardRef as forwardRef19 } from "react";
|
|
1568
1621
|
import { jsx as jsx20, jsxs as jsxs16 } from "react/jsx-runtime";
|
|
@@ -1590,13 +1643,14 @@ var stateLabel = {
|
|
|
1590
1643
|
sync: "Syncing",
|
|
1591
1644
|
accent: "Active"
|
|
1592
1645
|
};
|
|
1593
|
-
var StatusDot = forwardRef19(function StatusDot2({ state = "ok", label, pulse, size = 8, className, ...props }, ref) {
|
|
1646
|
+
var StatusDot = forwardRef19(function StatusDot2({ state = "ok", color, label, pulse, size = 8, className, ...props }, ref) {
|
|
1647
|
+
const useColor = color && warnIfInvalidColor(color, "StatusDot");
|
|
1594
1648
|
return /* @__PURE__ */ jsxs16(
|
|
1595
1649
|
"span",
|
|
1596
1650
|
{
|
|
1597
1651
|
ref,
|
|
1598
1652
|
role: label ? "status" : "img",
|
|
1599
|
-
"aria-label": !label ? stateLabel[state] : void 0,
|
|
1653
|
+
"aria-label": !label ? useColor ? "Status" : stateLabel[state] : void 0,
|
|
1600
1654
|
className: cn("inline-flex items-center gap-[6px]", className),
|
|
1601
1655
|
...props,
|
|
1602
1656
|
children: [
|
|
@@ -1605,11 +1659,15 @@ var StatusDot = forwardRef19(function StatusDot2({ state = "ok", label, pulse, s
|
|
|
1605
1659
|
{
|
|
1606
1660
|
className: cn(
|
|
1607
1661
|
"inline-block rounded-full",
|
|
1608
|
-
stateColor[state],
|
|
1609
|
-
|
|
1610
|
-
|
|
1662
|
+
!useColor && stateColor[state],
|
|
1663
|
+
!useColor && stateText[state],
|
|
1664
|
+
pulse && "animate-[ship-pulse-ring_1.6s_infinite]"
|
|
1611
1665
|
),
|
|
1612
|
-
style: {
|
|
1666
|
+
style: {
|
|
1667
|
+
width: size,
|
|
1668
|
+
height: size,
|
|
1669
|
+
...useColor ? { backgroundColor: color, color } : {}
|
|
1670
|
+
}
|
|
1613
1671
|
}
|
|
1614
1672
|
),
|
|
1615
1673
|
label && /* @__PURE__ */ jsx20("span", { className: "text-text-muted text-[12px]", children: label })
|
|
@@ -1644,10 +1702,12 @@ function hashHue(str) {
|
|
|
1644
1702
|
for (let i = 0; i < str.length; i++) h = (h * 31 + str.charCodeAt(i)) % 360;
|
|
1645
1703
|
return h;
|
|
1646
1704
|
}
|
|
1647
|
-
var Avatar = forwardRef20(function Avatar2({ name = "?", src, size = "md", status, initials, className, style, ...props }, ref) {
|
|
1705
|
+
var Avatar = forwardRef20(function Avatar2({ name = "?", src, size = "md", status, initials, color, className, style, ...props }, ref) {
|
|
1648
1706
|
const dim = sizePx[size];
|
|
1649
1707
|
const hue = hashHue(name);
|
|
1650
1708
|
const computedInitials = initials ?? initialsFor(name);
|
|
1709
|
+
const useColor = color && warnIfInvalidColor(color, "Avatar");
|
|
1710
|
+
const fallbackBg = useColor ? color : `oklch(var(--color-avatar-fallback-l) var(--color-avatar-fallback-c) ${hue})`;
|
|
1651
1711
|
return /* @__PURE__ */ jsxs17(
|
|
1652
1712
|
"span",
|
|
1653
1713
|
{
|
|
@@ -1661,7 +1721,7 @@ var Avatar = forwardRef20(function Avatar2({ name = "?", src, size = "md", statu
|
|
|
1661
1721
|
{
|
|
1662
1722
|
className: "border-border relative inline-flex h-full w-full shrink-0 overflow-hidden rounded-full border",
|
|
1663
1723
|
style: {
|
|
1664
|
-
background: src ? void 0 :
|
|
1724
|
+
background: src ? void 0 : fallbackBg
|
|
1665
1725
|
},
|
|
1666
1726
|
children: [
|
|
1667
1727
|
src && /* @__PURE__ */ jsx21(RadixAvatar.Image, { src, alt: name, className: "h-full w-full object-cover" }),
|
|
@@ -1729,6 +1789,16 @@ AvatarGroup.displayName = "AvatarGroup";
|
|
|
1729
1789
|
import { cva as cva6 } from "class-variance-authority";
|
|
1730
1790
|
import { forwardRef as forwardRef22 } from "react";
|
|
1731
1791
|
import { jsx as jsx23, jsxs as jsxs19 } from "react/jsx-runtime";
|
|
1792
|
+
var badgeStructural = cva6("inline-flex items-center font-sans leading-none whitespace-nowrap", {
|
|
1793
|
+
variants: {
|
|
1794
|
+
size: {
|
|
1795
|
+
sm: "h-[18px] px-[6px] py-[1px] text-[10px] gap-1 rounded-full",
|
|
1796
|
+
md: "h-[22px] px-2 py-[2px] text-[11px] gap-[5px] rounded-full",
|
|
1797
|
+
lg: "h-[26px] px-[10px] py-[3px] text-[12px] gap-[6px] rounded-full"
|
|
1798
|
+
}
|
|
1799
|
+
},
|
|
1800
|
+
defaultVariants: { size: "md" }
|
|
1801
|
+
});
|
|
1732
1802
|
var badgeStyles = cva6("inline-flex items-center font-sans leading-none whitespace-nowrap", {
|
|
1733
1803
|
variants: {
|
|
1734
1804
|
variant: {
|
|
@@ -1762,20 +1832,53 @@ var dotColorClass = {
|
|
|
1762
1832
|
solid: "bg-bg"
|
|
1763
1833
|
};
|
|
1764
1834
|
var dotSize = { sm: "h-[5px] w-[5px]", md: "h-[6px] w-[6px]", lg: "h-[7px] w-[7px]" };
|
|
1765
|
-
var Badge = forwardRef22(function Badge2({ variant = "neutral", size = "md", dot, icon, className, children, ...props }, ref) {
|
|
1835
|
+
var Badge = forwardRef22(function Badge2({ variant = "neutral", size = "md", dot, icon, className, children, color, style, ...props }, ref) {
|
|
1766
1836
|
const sz = size ?? "md";
|
|
1767
|
-
const
|
|
1768
|
-
|
|
1769
|
-
|
|
1837
|
+
const useColor = color && warnIfInvalidColor(color, "Badge");
|
|
1838
|
+
if (useColor) {
|
|
1839
|
+
return /* @__PURE__ */ jsxs19(
|
|
1770
1840
|
"span",
|
|
1771
1841
|
{
|
|
1772
|
-
|
|
1773
|
-
className: cn(
|
|
1842
|
+
ref,
|
|
1843
|
+
className: cn(badgeStructural({ size }), className),
|
|
1844
|
+
style: { ...tintStyle(color), ...style },
|
|
1845
|
+
...props,
|
|
1846
|
+
children: [
|
|
1847
|
+
dot && /* @__PURE__ */ jsx23(
|
|
1848
|
+
"span",
|
|
1849
|
+
{
|
|
1850
|
+
"aria-hidden": true,
|
|
1851
|
+
className: cn("inline-block rounded-full", dotSize[sz]),
|
|
1852
|
+
style: { background: color }
|
|
1853
|
+
}
|
|
1854
|
+
),
|
|
1855
|
+
icon && /* @__PURE__ */ jsx23("span", { className: "inline-flex leading-none", children: icon }),
|
|
1856
|
+
children
|
|
1857
|
+
]
|
|
1774
1858
|
}
|
|
1775
|
-
)
|
|
1776
|
-
|
|
1777
|
-
|
|
1778
|
-
|
|
1859
|
+
);
|
|
1860
|
+
}
|
|
1861
|
+
const v = variant ?? "neutral";
|
|
1862
|
+
return /* @__PURE__ */ jsxs19(
|
|
1863
|
+
"span",
|
|
1864
|
+
{
|
|
1865
|
+
ref,
|
|
1866
|
+
className: cn(badgeStyles({ variant, size }), className),
|
|
1867
|
+
style,
|
|
1868
|
+
...props,
|
|
1869
|
+
children: [
|
|
1870
|
+
dot && /* @__PURE__ */ jsx23(
|
|
1871
|
+
"span",
|
|
1872
|
+
{
|
|
1873
|
+
"aria-hidden": true,
|
|
1874
|
+
className: cn("inline-block rounded-full", dotSize[sz], dotColorClass[v])
|
|
1875
|
+
}
|
|
1876
|
+
),
|
|
1877
|
+
icon && /* @__PURE__ */ jsx23("span", { className: "inline-flex leading-none", children: icon }),
|
|
1878
|
+
children
|
|
1879
|
+
]
|
|
1880
|
+
}
|
|
1881
|
+
);
|
|
1779
1882
|
});
|
|
1780
1883
|
Badge.displayName = "Badge";
|
|
1781
1884
|
|
|
@@ -1923,18 +2026,23 @@ StatCard.displayName = "StatCard";
|
|
|
1923
2026
|
// src/components/Chip/Chip.tsx
|
|
1924
2027
|
import { forwardRef as forwardRef25 } from "react";
|
|
1925
2028
|
import { jsx as jsx26, jsxs as jsxs22 } from "react/jsx-runtime";
|
|
1926
|
-
var Chip = forwardRef25(function Chip2({ icon, onRemove, density = "comfortable", className, children, ...props }, ref) {
|
|
2029
|
+
var Chip = forwardRef25(function Chip2({ icon, onRemove, density = "comfortable", color, className, children, style, ...props }, ref) {
|
|
1927
2030
|
const isTouch = density === "touch";
|
|
2031
|
+
const useColor = color && warnIfInvalidColor(color, "Chip");
|
|
2032
|
+
const structural = cn(
|
|
2033
|
+
"inline-flex items-center gap-[6px] font-sans rounded-full border",
|
|
2034
|
+
isTouch ? "text-m-mono h-8 py-[5px] pr-[6px] pl-3" : "h-[26px] py-[4px] pr-1 pl-[10px] text-[12px]"
|
|
2035
|
+
);
|
|
2036
|
+
const defaultPaint = "bg-panel-2 text-text border-border";
|
|
1928
2037
|
return /* @__PURE__ */ jsxs22(
|
|
1929
2038
|
"span",
|
|
1930
2039
|
{
|
|
1931
2040
|
ref,
|
|
1932
|
-
className: cn(
|
|
1933
|
-
|
|
1934
|
-
|
|
1935
|
-
|
|
1936
|
-
|
|
1937
|
-
),
|
|
2041
|
+
className: cn(structural, !useColor && defaultPaint, className),
|
|
2042
|
+
style: {
|
|
2043
|
+
...useColor ? { ...tintStyle(color), borderColor: "transparent" } : {},
|
|
2044
|
+
...style
|
|
2045
|
+
},
|
|
1938
2046
|
...props,
|
|
1939
2047
|
children: [
|
|
1940
2048
|
icon && /* @__PURE__ */ jsx26("span", { className: cn("text-text-dim inline-flex", isTouch ? "text-[12px]" : "text-[10px]"), children: icon }),
|
|
@@ -1985,7 +2093,7 @@ import {
|
|
|
1985
2093
|
forwardRef as forwardRef27,
|
|
1986
2094
|
useEffect as useEffect7,
|
|
1987
2095
|
useId as useId7,
|
|
1988
|
-
useRef as
|
|
2096
|
+
useRef as useRef7
|
|
1989
2097
|
} from "react";
|
|
1990
2098
|
import { jsx as jsx28, jsxs as jsxs23 } from "react/jsx-runtime";
|
|
1991
2099
|
var sizeMap = {
|
|
@@ -2003,8 +2111,10 @@ var Rating = forwardRef27(function Rating2({
|
|
|
2003
2111
|
readOnly = false,
|
|
2004
2112
|
className,
|
|
2005
2113
|
"aria-label": ariaLabel,
|
|
2114
|
+
color,
|
|
2006
2115
|
...props
|
|
2007
2116
|
}, ref) {
|
|
2117
|
+
const useColor = color && warnIfInvalidColor(color, "Rating");
|
|
2008
2118
|
const [current, setCurrent] = useControllableState({
|
|
2009
2119
|
value,
|
|
2010
2120
|
defaultValue: defaultValue ?? 0,
|
|
@@ -2013,8 +2123,8 @@ var Rating = forwardRef27(function Rating2({
|
|
|
2013
2123
|
const reactId = useId7();
|
|
2014
2124
|
const px = sizeMap[size];
|
|
2015
2125
|
const currentInt = Math.round(current ?? 0);
|
|
2016
|
-
const buttonsRef =
|
|
2017
|
-
const shouldFocusRef =
|
|
2126
|
+
const buttonsRef = useRef7([]);
|
|
2127
|
+
const shouldFocusRef = useRef7(false);
|
|
2018
2128
|
useEffect7(() => {
|
|
2019
2129
|
if (!shouldFocusRef.current) return;
|
|
2020
2130
|
shouldFocusRef.current = false;
|
|
@@ -2058,10 +2168,19 @@ var Rating = forwardRef27(function Rating2({
|
|
|
2058
2168
|
/* @__PURE__ */ jsx28(
|
|
2059
2169
|
"div",
|
|
2060
2170
|
{
|
|
2171
|
+
"data-filled-stars": true,
|
|
2061
2172
|
className: "pointer-events-none absolute inset-0 inline-flex items-center gap-0.5 overflow-hidden",
|
|
2062
|
-
style: { width: `${fillPct}
|
|
2173
|
+
style: { width: `${fillPct}%`, ...useColor ? { color } : {} },
|
|
2063
2174
|
"aria-hidden": true,
|
|
2064
|
-
children: Array.from({ length: max }).map((_, i) => /* @__PURE__ */ jsx28(
|
|
2175
|
+
children: Array.from({ length: max }).map((_, i) => /* @__PURE__ */ jsx28(
|
|
2176
|
+
IconGlyph3,
|
|
2177
|
+
{
|
|
2178
|
+
name: "star",
|
|
2179
|
+
size: px,
|
|
2180
|
+
className: cn("shrink-0", !useColor && "text-rating")
|
|
2181
|
+
},
|
|
2182
|
+
i
|
|
2183
|
+
))
|
|
2065
2184
|
}
|
|
2066
2185
|
)
|
|
2067
2186
|
]
|
|
@@ -2076,6 +2195,7 @@ var Rating = forwardRef27(function Rating2({
|
|
|
2076
2195
|
"aria-label": ariaLabel ?? "Rating",
|
|
2077
2196
|
tabIndex: -1,
|
|
2078
2197
|
className: cn("inline-flex items-center gap-0.5", className),
|
|
2198
|
+
style: useColor ? { color } : void 0,
|
|
2079
2199
|
onKeyDown: handleKey,
|
|
2080
2200
|
...props,
|
|
2081
2201
|
children: Array.from({ length: max }).map((_, i) => {
|
|
@@ -2099,8 +2219,8 @@ var Rating = forwardRef27(function Rating2({
|
|
|
2099
2219
|
"inline-flex shrink-0 cursor-pointer items-center justify-center rounded-sm",
|
|
2100
2220
|
"focus-visible:ring-accent-dim outline-none focus-visible:ring-[3px]",
|
|
2101
2221
|
"transition-colors duration-(--duration-micro)",
|
|
2102
|
-
filled ? "text-rating" : "text-rating-dim",
|
|
2103
|
-
"hover:text-rating"
|
|
2222
|
+
useColor ? filled ? "" : "opacity-30" : filled ? "text-rating" : "text-rating-dim",
|
|
2223
|
+
!useColor && "hover:text-rating"
|
|
2104
2224
|
),
|
|
2105
2225
|
children: /* @__PURE__ */ jsx28(IconGlyph3, { name: "star", size: px })
|
|
2106
2226
|
},
|
|
@@ -2226,17 +2346,20 @@ SkeletonGroup.displayName = "SkeletonGroup";
|
|
|
2226
2346
|
// src/components/Tag/Tag.tsx
|
|
2227
2347
|
import { forwardRef as forwardRef30 } from "react";
|
|
2228
2348
|
import { jsx as jsx31, jsxs as jsxs25 } from "react/jsx-runtime";
|
|
2229
|
-
var Tag = forwardRef30(function Tag2({ onRemove, icon, size = 22, className, children, ...props }, ref) {
|
|
2349
|
+
var Tag = forwardRef30(function Tag2({ onRemove, icon, size = 22, color, className, children, style, ...props }, ref) {
|
|
2350
|
+
const useColor = color && warnIfInvalidColor(color, "Tag");
|
|
2351
|
+
const structural = "inline-flex items-center gap-[6px] px-2 py-[3px] font-sans text-[11px] rounded-xs border";
|
|
2352
|
+
const defaultPaint = "bg-panel-2 text-text border-border";
|
|
2230
2353
|
return /* @__PURE__ */ jsxs25(
|
|
2231
2354
|
"span",
|
|
2232
2355
|
{
|
|
2233
2356
|
ref,
|
|
2234
|
-
className: cn(
|
|
2235
|
-
|
|
2236
|
-
|
|
2237
|
-
|
|
2238
|
-
|
|
2239
|
-
|
|
2357
|
+
className: cn(structural, !useColor && defaultPaint, className),
|
|
2358
|
+
style: {
|
|
2359
|
+
height: size,
|
|
2360
|
+
...useColor ? { ...tintStyle(color), borderColor: "transparent" } : {},
|
|
2361
|
+
...style
|
|
2362
|
+
},
|
|
2240
2363
|
...props,
|
|
2241
2364
|
children: [
|
|
2242
2365
|
icon && /* @__PURE__ */ jsx31("span", { className: "text-text-dim inline-flex", children: icon }),
|
|
@@ -2365,18 +2488,25 @@ var DialogContent = forwardRef32(function DialogContent2({ className, width = 46
|
|
|
2365
2488
|
});
|
|
2366
2489
|
DialogContent.displayName = "DialogContent";
|
|
2367
2490
|
function Dialog({ title, description, footer, width, children, ...rootProps }) {
|
|
2368
|
-
return /* @__PURE__ */ jsx33(DialogRoot, { ...rootProps, children: /* @__PURE__ */ jsxs27(
|
|
2369
|
-
|
|
2370
|
-
|
|
2371
|
-
|
|
2372
|
-
|
|
2373
|
-
|
|
2374
|
-
|
|
2375
|
-
|
|
2376
|
-
|
|
2377
|
-
|
|
2378
|
-
|
|
2379
|
-
|
|
2491
|
+
return /* @__PURE__ */ jsx33(DialogRoot, { ...rootProps, children: /* @__PURE__ */ jsxs27(
|
|
2492
|
+
DialogContent,
|
|
2493
|
+
{
|
|
2494
|
+
width,
|
|
2495
|
+
...description ? {} : { "aria-describedby": void 0 },
|
|
2496
|
+
children: [
|
|
2497
|
+
title && /* @__PURE__ */ jsx33(
|
|
2498
|
+
RadixDialog.Title,
|
|
2499
|
+
{
|
|
2500
|
+
className: cn("text-[16px] font-medium", description ? "mb-[6px]" : "mb-4"),
|
|
2501
|
+
children: title
|
|
2502
|
+
}
|
|
2503
|
+
),
|
|
2504
|
+
description && /* @__PURE__ */ jsx33(RadixDialog.Description, { className: "text-text-muted mb-[18px] text-[13px] leading-[1.55]", children: description }),
|
|
2505
|
+
children,
|
|
2506
|
+
footer && /* @__PURE__ */ jsx33("div", { className: "mt-5 flex justify-end gap-2", children: footer })
|
|
2507
|
+
]
|
|
2508
|
+
}
|
|
2509
|
+
) });
|
|
2380
2510
|
}
|
|
2381
2511
|
|
|
2382
2512
|
// src/components/Dialog/Drawer.tsx
|
|
@@ -2494,7 +2624,13 @@ var AlertDialog = forwardRef35(function AlertDialog2({ title, description, foote
|
|
|
2494
2624
|
children: title
|
|
2495
2625
|
}
|
|
2496
2626
|
),
|
|
2497
|
-
description
|
|
2627
|
+
description ? /* @__PURE__ */ jsx36(RadixAlert.Description, { className: "text-text-muted mb-[18px] text-[13px] leading-[1.55]", children: description }) : (
|
|
2628
|
+
// Radix AlertDialog requires a description for screen-reader users
|
|
2629
|
+
// and warns in dev mode when one is missing. When the caller opts
|
|
2630
|
+
// out of a visible description, fall back to the title text in a
|
|
2631
|
+
// visually-hidden Description so the a11y contract is still met.
|
|
2632
|
+
/* @__PURE__ */ jsx36(RadixAlert.Description, { className: "sr-only", children: title })
|
|
2633
|
+
),
|
|
2498
2634
|
children,
|
|
2499
2635
|
footer && /* @__PURE__ */ jsx36("div", { className: "mt-5 flex justify-end gap-2", children: footer })
|
|
2500
2636
|
]
|
|
@@ -2944,7 +3080,7 @@ import {
|
|
|
2944
3080
|
forwardRef as forwardRef44,
|
|
2945
3081
|
useCallback as useCallback9,
|
|
2946
3082
|
useEffect as useEffect8,
|
|
2947
|
-
useRef as
|
|
3083
|
+
useRef as useRef8
|
|
2948
3084
|
} from "react";
|
|
2949
3085
|
import { Fragment, jsx as jsx45, jsxs as jsxs38 } from "react/jsx-runtime";
|
|
2950
3086
|
var Carousel = forwardRef44(function Carousel2({
|
|
@@ -2966,7 +3102,7 @@ var Carousel = forwardRef44(function Carousel2({
|
|
|
2966
3102
|
defaultValue: defaultIndex ?? 0,
|
|
2967
3103
|
onChange: onIndexChange
|
|
2968
3104
|
});
|
|
2969
|
-
const viewportRef =
|
|
3105
|
+
const viewportRef = useRef8(null);
|
|
2970
3106
|
const goTo = useCallback9(
|
|
2971
3107
|
(i) => {
|
|
2972
3108
|
const clamped = Math.max(0, Math.min(items.length - 1, i));
|
|
@@ -3104,7 +3240,7 @@ import {
|
|
|
3104
3240
|
useEffect as useEffect9,
|
|
3105
3241
|
useId as useId8,
|
|
3106
3242
|
useMemo as useMemo2,
|
|
3107
|
-
useRef as
|
|
3243
|
+
useRef as useRef9,
|
|
3108
3244
|
useState as useState9
|
|
3109
3245
|
} from "react";
|
|
3110
3246
|
import { jsx as jsx46, jsxs as jsxs39 } from "react/jsx-runtime";
|
|
@@ -3163,7 +3299,7 @@ var Combobox = forwardRef45(function Combobox2({
|
|
|
3163
3299
|
onChange: onQueryChange
|
|
3164
3300
|
});
|
|
3165
3301
|
const [open, setOpen] = useState9(false);
|
|
3166
|
-
const wrapperRef =
|
|
3302
|
+
const wrapperRef = useRef9(null);
|
|
3167
3303
|
useOutsideClick(wrapperRef, () => setOpen(false));
|
|
3168
3304
|
const filtered = useMemo2(
|
|
3169
3305
|
() => query ? normalized.filter((o) => filter(o, query)) : normalized,
|
|
@@ -3443,7 +3579,7 @@ function filterCommandItems(query, groups) {
|
|
|
3443
3579
|
}
|
|
3444
3580
|
|
|
3445
3581
|
// src/patterns/DataTable/DataTable.tsx
|
|
3446
|
-
import { useEffect as useEffect11, useMemo as useMemo4, useRef as
|
|
3582
|
+
import { useEffect as useEffect11, useMemo as useMemo4, useRef as useRef10 } from "react";
|
|
3447
3583
|
import { jsx as jsx48, jsxs as jsxs41 } from "react/jsx-runtime";
|
|
3448
3584
|
var alignClass = {
|
|
3449
3585
|
left: "text-left",
|
|
@@ -3500,7 +3636,7 @@ function DataTable(props) {
|
|
|
3500
3636
|
const selectedSet = selected ?? EMPTY_SET;
|
|
3501
3637
|
const allSelected = allIds.length > 0 && allIds.every((id) => selectedSet.has(id));
|
|
3502
3638
|
const someSelected = !allSelected && allIds.some((id) => selectedSet.has(id));
|
|
3503
|
-
const headerCheckRef =
|
|
3639
|
+
const headerCheckRef = useRef10(null);
|
|
3504
3640
|
useEffect11(() => {
|
|
3505
3641
|
if (headerCheckRef.current) headerCheckRef.current.indeterminate = someSelected;
|
|
3506
3642
|
}, [someSelected]);
|
|
@@ -3532,7 +3668,7 @@ function DataTable(props) {
|
|
|
3532
3668
|
return next;
|
|
3533
3669
|
});
|
|
3534
3670
|
};
|
|
3535
|
-
return /* @__PURE__ */ jsxs41("table", { ref, className: cn("w-full border-collapse text-[12px]", className), children: [
|
|
3671
|
+
return /* @__PURE__ */ jsxs41("table", { ref, className: cn("relative w-full border-collapse text-[12px]", className), children: [
|
|
3536
3672
|
caption && /* @__PURE__ */ jsx48("caption", { className: "sr-only", children: caption }),
|
|
3537
3673
|
/* @__PURE__ */ jsx48("thead", { className: cn("bg-panel-2", stickyHeader && "z-raised sticky top-0"), children: /* @__PURE__ */ jsxs41("tr", { children: [
|
|
3538
3674
|
selectable && /* @__PURE__ */ jsx48("th", { scope: "col", className: "border-border w-8 border-b px-3 py-2 text-left", children: /* @__PURE__ */ jsx48(
|
|
@@ -3627,7 +3763,7 @@ import {
|
|
|
3627
3763
|
forwardRef as forwardRef47,
|
|
3628
3764
|
useCallback as useCallback10,
|
|
3629
3765
|
useEffect as useEffect12,
|
|
3630
|
-
useRef as
|
|
3766
|
+
useRef as useRef11,
|
|
3631
3767
|
useState as useState10
|
|
3632
3768
|
} from "react";
|
|
3633
3769
|
import { jsx as jsx49, jsxs as jsxs42 } from "react/jsx-runtime";
|
|
@@ -3721,8 +3857,8 @@ var Calendar = forwardRef47(function Calendar2({
|
|
|
3721
3857
|
}, [selectedDate]);
|
|
3722
3858
|
const focusedInVisibleMonth = focusedDate.getMonth() === month && focusedDate.getFullYear() === year;
|
|
3723
3859
|
const effectiveFocusDay = focusedInVisibleMonth ? focusedDate.getDate() : clampDay(year, month, focusedDate.getDate());
|
|
3724
|
-
const dayRefs =
|
|
3725
|
-
const shouldFocusRef =
|
|
3860
|
+
const dayRefs = useRef11(/* @__PURE__ */ new Map());
|
|
3861
|
+
const shouldFocusRef = useRef11(false);
|
|
3726
3862
|
useEffect12(() => {
|
|
3727
3863
|
if (!shouldFocusRef.current) return;
|
|
3728
3864
|
shouldFocusRef.current = false;
|
|
@@ -4213,10 +4349,31 @@ Lightbox.displayName = "Lightbox";
|
|
|
4213
4349
|
|
|
4214
4350
|
// src/patterns/ListingCard/ListingCard.tsx
|
|
4215
4351
|
import { IconGlyph as IconGlyph7 } from "@ship-it-ui/icons";
|
|
4216
|
-
import {
|
|
4352
|
+
import { cva as cva11 } from "class-variance-authority";
|
|
4353
|
+
import { forwardRef as forwardRef51, useState as useState13 } from "react";
|
|
4217
4354
|
import { jsx as jsx53, jsxs as jsxs46 } from "react/jsx-runtime";
|
|
4355
|
+
var hoverVariants = cva11("", {
|
|
4356
|
+
variants: {
|
|
4357
|
+
hoverEffect: {
|
|
4358
|
+
lift: "transition-[transform,box-shadow,border-color] duration-(--duration-micro) hover:-translate-y-px hover:shadow hover:border-border-strong",
|
|
4359
|
+
glow: "transition-[box-shadow,border-color] duration-(--duration-micro) hover:ring-[3px] hover:ring-accent-dim hover:border-accent",
|
|
4360
|
+
none: ""
|
|
4361
|
+
}
|
|
4362
|
+
}
|
|
4363
|
+
});
|
|
4364
|
+
var flagToneClass = {
|
|
4365
|
+
accent: "bg-accent-dim text-accent",
|
|
4366
|
+
purple: "bg-[color-mix(in_oklab,var(--color-purple),transparent_75%)] text-purple",
|
|
4367
|
+
pink: "bg-[color-mix(in_oklab,var(--color-pink),transparent_75%)] text-pink",
|
|
4368
|
+
ok: "bg-[color-mix(in_oklab,var(--color-ok),transparent_75%)] text-ok",
|
|
4369
|
+
warn: "bg-[color-mix(in_oklab,var(--color-warn),transparent_75%)] text-warn"
|
|
4370
|
+
};
|
|
4218
4371
|
var ListingCard = forwardRef51(function ListingCard2({
|
|
4372
|
+
variant = "default",
|
|
4219
4373
|
photos,
|
|
4374
|
+
renderPhoto,
|
|
4375
|
+
onClick,
|
|
4376
|
+
hoverEffect,
|
|
4220
4377
|
title,
|
|
4221
4378
|
eyebrow,
|
|
4222
4379
|
rating,
|
|
@@ -4224,31 +4381,50 @@ var ListingCard = forwardRef51(function ListingCard2({
|
|
|
4224
4381
|
price,
|
|
4225
4382
|
priceUnit = "/day",
|
|
4226
4383
|
originalPrice,
|
|
4384
|
+
pricePrefix,
|
|
4227
4385
|
host,
|
|
4228
4386
|
distance,
|
|
4229
4387
|
verified,
|
|
4230
4388
|
href,
|
|
4231
4389
|
onFavorite,
|
|
4232
4390
|
favorited,
|
|
4233
|
-
width = 280,
|
|
4391
|
+
width = variant === "spec" ? 320 : 280,
|
|
4392
|
+
flag,
|
|
4393
|
+
category,
|
|
4394
|
+
meta,
|
|
4395
|
+
specs,
|
|
4396
|
+
cta,
|
|
4397
|
+
hidePhotoCounter,
|
|
4398
|
+
classNames: cls = {},
|
|
4234
4399
|
className,
|
|
4235
4400
|
...props
|
|
4236
4401
|
}, ref) {
|
|
4402
|
+
const [photoIndex, setPhotoIndex] = useState13(0);
|
|
4403
|
+
const isSpec = variant === "spec";
|
|
4404
|
+
const stretchedLinkSupported = !isSpec || !cta && !!href;
|
|
4405
|
+
const isInteractive = Boolean(onClick) || Boolean(href);
|
|
4406
|
+
const effectiveHover = hoverEffect ?? (isInteractive ? "lift" : "none");
|
|
4407
|
+
const hoverClass = hoverVariants({ hoverEffect: effectiveHover });
|
|
4237
4408
|
return /* @__PURE__ */ jsxs46(
|
|
4238
4409
|
Card,
|
|
4239
4410
|
{
|
|
4240
4411
|
ref,
|
|
4241
|
-
className: cn("relative overflow-hidden !p-0", className),
|
|
4412
|
+
className: cn("relative isolate overflow-hidden !p-0", hoverClass, cls.root, className),
|
|
4242
4413
|
style: { width },
|
|
4243
4414
|
...props,
|
|
4244
4415
|
children: [
|
|
4245
|
-
/* @__PURE__ */ jsxs46("div", { className: "relative", children: [
|
|
4416
|
+
/* @__PURE__ */ jsxs46("div", { className: cn("relative", cls.photos), children: [
|
|
4246
4417
|
/* @__PURE__ */ jsx53(
|
|
4247
4418
|
Carousel,
|
|
4248
4419
|
{
|
|
4249
4420
|
items: photos,
|
|
4421
|
+
...isSpec ? {
|
|
4422
|
+
index: photoIndex,
|
|
4423
|
+
onIndexChange: setPhotoIndex,
|
|
4424
|
+
showDots: false
|
|
4425
|
+
} : {},
|
|
4250
4426
|
"aria-label": typeof title === "string" ? `${title} photos` : "Listing photos",
|
|
4251
|
-
renderItem: (src) => /* @__PURE__ */ jsx53(
|
|
4427
|
+
renderItem: (src, i) => renderPhoto ? renderPhoto(src, i) : /* @__PURE__ */ jsx53(
|
|
4252
4428
|
"img",
|
|
4253
4429
|
{
|
|
4254
4430
|
src,
|
|
@@ -4259,15 +4435,133 @@ var ListingCard = forwardRef51(function ListingCard2({
|
|
|
4259
4435
|
)
|
|
4260
4436
|
}
|
|
4261
4437
|
),
|
|
4262
|
-
verified && /* @__PURE__ */ jsx53("div", { className: "pointer-events-none absolute top-3 left-3 z-10", children: /* @__PURE__ */ jsxs46(Badge, { variant: "ok", size: "sm", children: [
|
|
4438
|
+
!isSpec && verified && /* @__PURE__ */ jsx53("div", { className: "pointer-events-none absolute top-3 left-3 z-10", children: /* @__PURE__ */ jsxs46(Badge, { variant: "ok", size: "sm", children: [
|
|
4263
4439
|
/* @__PURE__ */ jsx53(IconGlyph7, { name: "verified", size: 11 }),
|
|
4264
4440
|
" Verified host"
|
|
4265
|
-
] }) })
|
|
4441
|
+
] }) }),
|
|
4442
|
+
isSpec && flag && /* @__PURE__ */ jsx53("div", { className: "pointer-events-none absolute top-3 left-3 z-10", children: /* @__PURE__ */ jsxs46(
|
|
4443
|
+
"span",
|
|
4444
|
+
{
|
|
4445
|
+
className: cn(
|
|
4446
|
+
"inline-flex items-center gap-1.5 rounded-full px-2.5 py-1 text-[11px] font-medium backdrop-blur",
|
|
4447
|
+
flagToneClass[flag.tone ?? "accent"],
|
|
4448
|
+
cls.flag
|
|
4449
|
+
),
|
|
4450
|
+
children: [
|
|
4451
|
+
flag.icon && /* @__PURE__ */ jsx53(IconGlyph7, { name: flag.icon, size: 11 }),
|
|
4452
|
+
flag.label
|
|
4453
|
+
]
|
|
4454
|
+
}
|
|
4455
|
+
) }),
|
|
4456
|
+
isSpec && !hidePhotoCounter && photos.length > 1 && /* @__PURE__ */ jsxs46(
|
|
4457
|
+
"div",
|
|
4458
|
+
{
|
|
4459
|
+
"aria-hidden": true,
|
|
4460
|
+
className: cn(
|
|
4461
|
+
"pointer-events-none absolute top-3 right-3 z-10 rounded-full bg-black/55 px-2.5 py-1 font-mono text-[11px] text-white backdrop-blur",
|
|
4462
|
+
cls.photoCounter
|
|
4463
|
+
),
|
|
4464
|
+
children: [
|
|
4465
|
+
photoIndex + 1,
|
|
4466
|
+
" / ",
|
|
4467
|
+
photos.length
|
|
4468
|
+
]
|
|
4469
|
+
}
|
|
4470
|
+
)
|
|
4266
4471
|
] }),
|
|
4267
|
-
/* @__PURE__ */ jsxs46("div", { className: "flex flex-col
|
|
4268
|
-
|
|
4269
|
-
|
|
4270
|
-
|
|
4472
|
+
isSpec ? /* @__PURE__ */ jsxs46("div", { className: cn("flex flex-col", cls.body), children: [
|
|
4473
|
+
/* @__PURE__ */ jsxs46("div", { className: cn("flex flex-col gap-2 p-4 pb-3", cls.header), children: [
|
|
4474
|
+
/* @__PURE__ */ jsxs46("div", { className: "flex items-start justify-between gap-2", children: [
|
|
4475
|
+
/* @__PURE__ */ jsx53("span", { className: cn("text-text text-[15px] leading-snug font-semibold", cls.title), children: title }),
|
|
4476
|
+
category && /* @__PURE__ */ jsx53(
|
|
4477
|
+
"span",
|
|
4478
|
+
{
|
|
4479
|
+
className: cn(
|
|
4480
|
+
"border-border bg-panel-2 text-text-muted shrink-0 rounded-full border px-2 py-0.5 text-[10px] tracking-wide uppercase",
|
|
4481
|
+
cls.category
|
|
4482
|
+
),
|
|
4483
|
+
children: category
|
|
4484
|
+
}
|
|
4485
|
+
)
|
|
4486
|
+
] }),
|
|
4487
|
+
meta && /* @__PURE__ */ jsx53("span", { className: cn("text-text-dim font-mono text-[11px] tracking-wide", cls.meta), children: meta }),
|
|
4488
|
+
specs && specs.length > 0 && /* @__PURE__ */ jsx53(
|
|
4489
|
+
"dl",
|
|
4490
|
+
{
|
|
4491
|
+
className: cn(
|
|
4492
|
+
"border-border mt-1 grid gap-2 border-t pt-3",
|
|
4493
|
+
specs.length === 2 && "grid-cols-2",
|
|
4494
|
+
specs.length === 3 && "grid-cols-3",
|
|
4495
|
+
specs.length >= 4 && "grid-cols-4",
|
|
4496
|
+
cls.specs
|
|
4497
|
+
),
|
|
4498
|
+
children: specs.map((s, i) => /* @__PURE__ */ jsxs46("div", { className: cn("flex flex-col gap-0.5", cls.specCell), children: [
|
|
4499
|
+
/* @__PURE__ */ jsx53(
|
|
4500
|
+
"dt",
|
|
4501
|
+
{
|
|
4502
|
+
className: cn(
|
|
4503
|
+
"text-text-dim text-[10px] tracking-wider uppercase",
|
|
4504
|
+
cls.specLabel
|
|
4505
|
+
),
|
|
4506
|
+
children: s.label
|
|
4507
|
+
}
|
|
4508
|
+
),
|
|
4509
|
+
/* @__PURE__ */ jsx53("dd", { className: cn("text-text text-[13px] font-medium", cls.specValue), children: s.value })
|
|
4510
|
+
] }, i))
|
|
4511
|
+
}
|
|
4512
|
+
)
|
|
4513
|
+
] }),
|
|
4514
|
+
/* @__PURE__ */ jsxs46(
|
|
4515
|
+
"div",
|
|
4516
|
+
{
|
|
4517
|
+
className: cn(
|
|
4518
|
+
"border-border bg-panel-2 relative z-10 flex items-center justify-between gap-2 border-t px-4 py-3",
|
|
4519
|
+
cls.footer
|
|
4520
|
+
),
|
|
4521
|
+
children: [
|
|
4522
|
+
/* @__PURE__ */ jsx53("div", { className: "flex flex-col leading-tight", children: /* @__PURE__ */ jsxs46("div", { className: "flex items-baseline gap-1.5", children: [
|
|
4523
|
+
pricePrefix && /* @__PURE__ */ jsx53("span", { className: "text-text-dim text-[11px]", children: pricePrefix }),
|
|
4524
|
+
originalPrice && /* @__PURE__ */ jsx53("span", { className: "text-text-dim decoration-sale text-[11px] line-through", children: originalPrice }),
|
|
4525
|
+
/* @__PURE__ */ jsx53("span", { className: cn("text-text text-[15px] font-semibold", cls.price), children: price }),
|
|
4526
|
+
/* @__PURE__ */ jsx53("span", { className: cn("text-text-dim text-[11px]", cls.priceUnit), children: priceUnit })
|
|
4527
|
+
] }) }),
|
|
4528
|
+
cta && (cta.href ? /* @__PURE__ */ jsx53(
|
|
4529
|
+
Button,
|
|
4530
|
+
{
|
|
4531
|
+
asChild: true,
|
|
4532
|
+
variant: "primary",
|
|
4533
|
+
size: "sm",
|
|
4534
|
+
disabled: cta.disabled,
|
|
4535
|
+
className: cls.cta,
|
|
4536
|
+
children: /* @__PURE__ */ jsx53("a", { href: cta.href, onClick: cta.onClick, children: cta.label })
|
|
4537
|
+
}
|
|
4538
|
+
) : /* @__PURE__ */ jsx53(
|
|
4539
|
+
Button,
|
|
4540
|
+
{
|
|
4541
|
+
variant: "primary",
|
|
4542
|
+
size: "sm",
|
|
4543
|
+
onClick: cta.onClick,
|
|
4544
|
+
disabled: cta.disabled,
|
|
4545
|
+
className: cls.cta,
|
|
4546
|
+
children: cta.label
|
|
4547
|
+
}
|
|
4548
|
+
))
|
|
4549
|
+
]
|
|
4550
|
+
}
|
|
4551
|
+
)
|
|
4552
|
+
] }) : /* @__PURE__ */ jsxs46("div", { className: cn("flex flex-col gap-1 p-3", cls.body), children: [
|
|
4553
|
+
eyebrow && /* @__PURE__ */ jsx53(
|
|
4554
|
+
"span",
|
|
4555
|
+
{
|
|
4556
|
+
className: cn(
|
|
4557
|
+
"text-text-dim font-mono text-[10px] tracking-wide uppercase",
|
|
4558
|
+
cls.eyebrow
|
|
4559
|
+
),
|
|
4560
|
+
children: eyebrow
|
|
4561
|
+
}
|
|
4562
|
+
),
|
|
4563
|
+
/* @__PURE__ */ jsxs46("div", { className: cn("flex items-start justify-between gap-2", cls.header), children: [
|
|
4564
|
+
/* @__PURE__ */ jsx53("span", { className: cn("text-text text-[14px] leading-snug font-semibold", cls.title), children: title }),
|
|
4271
4565
|
rating !== void 0 && /* @__PURE__ */ jsxs46("span", { className: "inline-flex shrink-0 items-center gap-1 text-[12px]", children: [
|
|
4272
4566
|
/* @__PURE__ */ jsx53(IconGlyph7, { name: "star", size: 12, className: "text-rating" }),
|
|
4273
4567
|
/* @__PURE__ */ jsx53("span", { className: "text-text font-medium", children: rating.toFixed(1) }),
|
|
@@ -4278,19 +4572,29 @@ var ListingCard = forwardRef51(function ListingCard2({
|
|
|
4278
4572
|
] })
|
|
4279
4573
|
] })
|
|
4280
4574
|
] }),
|
|
4281
|
-
(host || distance) && /* @__PURE__ */ jsxs46("div", { className: "text-text-dim flex items-center gap-2 text-[12px]", children: [
|
|
4575
|
+
(host || distance) && /* @__PURE__ */ jsxs46("div", { className: cn("text-text-dim flex items-center gap-2 text-[12px]", cls.meta), children: [
|
|
4282
4576
|
host && /* @__PURE__ */ jsx53("span", { children: host }),
|
|
4283
4577
|
host && distance && /* @__PURE__ */ jsx53("span", { "aria-hidden": true, children: "\xB7" }),
|
|
4284
4578
|
distance && /* @__PURE__ */ jsx53("span", { children: distance })
|
|
4285
4579
|
] }),
|
|
4286
|
-
/* @__PURE__ */ jsxs46("div", { className: "mt-2 flex items-baseline gap-2", children: [
|
|
4580
|
+
/* @__PURE__ */ jsxs46("div", { className: cn("mt-2 flex items-baseline gap-2", cls.footer), children: [
|
|
4287
4581
|
originalPrice && /* @__PURE__ */ jsx53("span", { className: "text-text-dim decoration-sale text-[12px] line-through", children: originalPrice }),
|
|
4288
|
-
/* @__PURE__ */ jsx53("span", { className: "text-text text-[15px] font-semibold", children: price }),
|
|
4289
|
-
/* @__PURE__ */ jsx53("span", { className: "text-text-dim text-[12px]", children: priceUnit })
|
|
4582
|
+
/* @__PURE__ */ jsx53("span", { className: cn("text-text text-[15px] font-semibold", cls.price), children: price }),
|
|
4583
|
+
/* @__PURE__ */ jsx53("span", { className: cn("text-text-dim text-[12px]", cls.priceUnit), children: priceUnit })
|
|
4290
4584
|
] }),
|
|
4291
|
-
rating !== void 0 && /* @__PURE__ */ jsx53(
|
|
4585
|
+
rating !== void 0 && /* @__PURE__ */ jsx53(
|
|
4586
|
+
Rating,
|
|
4587
|
+
{
|
|
4588
|
+
value: rating,
|
|
4589
|
+
max: 5,
|
|
4590
|
+
precision: "half",
|
|
4591
|
+
size: "sm",
|
|
4592
|
+
readOnly: true,
|
|
4593
|
+
className: "sr-only"
|
|
4594
|
+
}
|
|
4595
|
+
)
|
|
4292
4596
|
] }),
|
|
4293
|
-
href && /* @__PURE__ */ jsx53(
|
|
4597
|
+
href && stretchedLinkSupported && !onClick && /* @__PURE__ */ jsx53(
|
|
4294
4598
|
"a",
|
|
4295
4599
|
{
|
|
4296
4600
|
href,
|
|
@@ -4298,7 +4602,16 @@ var ListingCard = forwardRef51(function ListingCard2({
|
|
|
4298
4602
|
className: "absolute inset-0 z-0 no-underline"
|
|
4299
4603
|
}
|
|
4300
4604
|
),
|
|
4301
|
-
|
|
4605
|
+
onClick && /* @__PURE__ */ jsx53(
|
|
4606
|
+
"button",
|
|
4607
|
+
{
|
|
4608
|
+
type: "button",
|
|
4609
|
+
onClick,
|
|
4610
|
+
"aria-label": typeof title === "string" ? `View ${title}` : "View listing",
|
|
4611
|
+
className: "focus-visible:ring-accent-dim absolute inset-0 z-0 cursor-pointer bg-transparent outline-none focus-visible:ring-[3px]"
|
|
4612
|
+
}
|
|
4613
|
+
),
|
|
4614
|
+
!isSpec && onFavorite && /* @__PURE__ */ jsx53(
|
|
4302
4615
|
"button",
|
|
4303
4616
|
{
|
|
4304
4617
|
type: "button",
|
|
@@ -4308,7 +4621,8 @@ var ListingCard = forwardRef51(function ListingCard2({
|
|
|
4308
4621
|
className: cn(
|
|
4309
4622
|
"absolute top-3 right-3 z-20 inline-grid h-8 w-8 cursor-pointer place-items-center rounded-full",
|
|
4310
4623
|
"bg-panel/85 hover:bg-panel border-border border shadow-sm backdrop-blur",
|
|
4311
|
-
favorited ? "text-err" : "text-text-dim hover:text-text"
|
|
4624
|
+
favorited ? "text-err" : "text-text-dim hover:text-text",
|
|
4625
|
+
cls.favorite
|
|
4312
4626
|
),
|
|
4313
4627
|
children: /* @__PURE__ */ jsx53(IconGlyph7, { name: "heart", size: 16 })
|
|
4314
4628
|
}
|
|
@@ -4319,8 +4633,355 @@ var ListingCard = forwardRef51(function ListingCard2({
|
|
|
4319
4633
|
});
|
|
4320
4634
|
ListingCard.displayName = "ListingCard";
|
|
4321
4635
|
|
|
4636
|
+
// src/patterns/ListingDetail/ListingDetail.tsx
|
|
4637
|
+
import * as RadixDialog6 from "@radix-ui/react-dialog";
|
|
4638
|
+
import { IconGlyph as IconGlyph8 } from "@ship-it-ui/icons";
|
|
4639
|
+
import { forwardRef as forwardRef52, useState as useState14 } from "react";
|
|
4640
|
+
import { jsx as jsx54, jsxs as jsxs47 } from "react/jsx-runtime";
|
|
4641
|
+
function renderAction(action, variant) {
|
|
4642
|
+
if (action.href) {
|
|
4643
|
+
return /* @__PURE__ */ jsx54(Button, { asChild: true, variant, disabled: action.disabled, children: /* @__PURE__ */ jsx54("a", { href: action.href, onClick: action.onClick, children: action.label }) });
|
|
4644
|
+
}
|
|
4645
|
+
return /* @__PURE__ */ jsx54(Button, { variant, onClick: action.onClick, disabled: action.disabled, children: action.label });
|
|
4646
|
+
}
|
|
4647
|
+
var flagToneClass2 = {
|
|
4648
|
+
accent: "bg-accent-dim text-accent",
|
|
4649
|
+
purple: "bg-[color-mix(in_oklab,var(--color-purple),transparent_75%)] text-purple",
|
|
4650
|
+
pink: "bg-[color-mix(in_oklab,var(--color-pink),transparent_75%)] text-pink",
|
|
4651
|
+
ok: "bg-[color-mix(in_oklab,var(--color-ok),transparent_75%)] text-ok",
|
|
4652
|
+
warn: "bg-[color-mix(in_oklab,var(--color-warn),transparent_75%)] text-warn"
|
|
4653
|
+
};
|
|
4654
|
+
var ListingDetail = forwardRef52(function ListingDetail2({
|
|
4655
|
+
variant = "default",
|
|
4656
|
+
open,
|
|
4657
|
+
defaultOpen,
|
|
4658
|
+
onOpenChange,
|
|
4659
|
+
photos,
|
|
4660
|
+
renderPhoto,
|
|
4661
|
+
title,
|
|
4662
|
+
eyebrow,
|
|
4663
|
+
description,
|
|
4664
|
+
rating,
|
|
4665
|
+
reviewCount,
|
|
4666
|
+
price,
|
|
4667
|
+
priceUnit = "/day",
|
|
4668
|
+
originalPrice,
|
|
4669
|
+
pricePrefix,
|
|
4670
|
+
host,
|
|
4671
|
+
features,
|
|
4672
|
+
primaryAction,
|
|
4673
|
+
secondaryAction,
|
|
4674
|
+
flag,
|
|
4675
|
+
category,
|
|
4676
|
+
meta,
|
|
4677
|
+
specs,
|
|
4678
|
+
cta,
|
|
4679
|
+
hidePhotoCounter,
|
|
4680
|
+
classNames: cls = {}
|
|
4681
|
+
}, ref) {
|
|
4682
|
+
const [galleryIndex, setGalleryIndex] = useState14(0);
|
|
4683
|
+
const [lightboxOpen, setLightboxOpen] = useState14(false);
|
|
4684
|
+
const isSpec = variant === "spec";
|
|
4685
|
+
const lightboxTitle = typeof title === "string" ? `${title} photos` : "Listing photos";
|
|
4686
|
+
return /* @__PURE__ */ jsxs47(RadixDialog6.Root, { open, defaultOpen, onOpenChange, children: [
|
|
4687
|
+
/* @__PURE__ */ jsxs47(RadixDialog6.Portal, { children: [
|
|
4688
|
+
/* @__PURE__ */ jsx54(
|
|
4689
|
+
RadixDialog6.Overlay,
|
|
4690
|
+
{
|
|
4691
|
+
className: cn(
|
|
4692
|
+
"z-overlay fixed inset-0 bg-black/55 backdrop-blur-[4px]",
|
|
4693
|
+
"data-[state=open]:animate-[ship-fade-in_150ms_ease]",
|
|
4694
|
+
cls.overlay
|
|
4695
|
+
)
|
|
4696
|
+
}
|
|
4697
|
+
),
|
|
4698
|
+
/* @__PURE__ */ jsxs47(
|
|
4699
|
+
RadixDialog6.Content,
|
|
4700
|
+
{
|
|
4701
|
+
ref,
|
|
4702
|
+
...description ? {} : { "aria-describedby": void 0 },
|
|
4703
|
+
className: cn(
|
|
4704
|
+
"z-modal fixed top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2",
|
|
4705
|
+
"w-[calc(100%-32px)] max-w-[960px]",
|
|
4706
|
+
"max-h-[min(92vh,820px)] overflow-hidden",
|
|
4707
|
+
"bg-panel border-border-strong rounded-lg border shadow-lg outline-none",
|
|
4708
|
+
"data-[state=open]:animate-[ship-dialog-in_180ms_var(--easing-out)]",
|
|
4709
|
+
"flex flex-col",
|
|
4710
|
+
cls.content
|
|
4711
|
+
),
|
|
4712
|
+
children: [
|
|
4713
|
+
/* @__PURE__ */ jsxs47(
|
|
4714
|
+
"div",
|
|
4715
|
+
{
|
|
4716
|
+
className: cn(
|
|
4717
|
+
"grid grid-cols-1 gap-6 overflow-y-auto p-6 md:grid-cols-[1.1fr_1fr]",
|
|
4718
|
+
isSpec && cta && "pb-4",
|
|
4719
|
+
cls.grid
|
|
4720
|
+
),
|
|
4721
|
+
children: [
|
|
4722
|
+
/* @__PURE__ */ jsxs47("div", { className: cn("flex flex-col gap-3", cls.photos), children: [
|
|
4723
|
+
/* @__PURE__ */ jsxs47("div", { className: "relative overflow-hidden rounded-md", children: [
|
|
4724
|
+
/* @__PURE__ */ jsx54(
|
|
4725
|
+
Carousel,
|
|
4726
|
+
{
|
|
4727
|
+
items: photos,
|
|
4728
|
+
index: galleryIndex,
|
|
4729
|
+
onIndexChange: setGalleryIndex,
|
|
4730
|
+
...isSpec ? { showDots: false } : {},
|
|
4731
|
+
"aria-label": typeof title === "string" ? `${title} photos` : "Listing photos",
|
|
4732
|
+
renderItem: (src, i) => renderPhoto ? renderPhoto(src, i, "gallery") : /* @__PURE__ */ jsx54(
|
|
4733
|
+
"img",
|
|
4734
|
+
{
|
|
4735
|
+
src,
|
|
4736
|
+
alt: "",
|
|
4737
|
+
className: "block h-full w-full object-cover",
|
|
4738
|
+
loading: "lazy"
|
|
4739
|
+
}
|
|
4740
|
+
)
|
|
4741
|
+
}
|
|
4742
|
+
),
|
|
4743
|
+
isSpec && flag ? /* @__PURE__ */ jsx54("div", { className: "pointer-events-none absolute top-3 left-3 z-10", children: /* @__PURE__ */ jsxs47(
|
|
4744
|
+
"span",
|
|
4745
|
+
{
|
|
4746
|
+
className: cn(
|
|
4747
|
+
"inline-flex items-center gap-1.5 rounded-full px-2.5 py-1 text-[11px] font-medium backdrop-blur",
|
|
4748
|
+
flagToneClass2[flag.tone ?? "accent"],
|
|
4749
|
+
cls.flag
|
|
4750
|
+
),
|
|
4751
|
+
children: [
|
|
4752
|
+
flag.icon && /* @__PURE__ */ jsx54(IconGlyph8, { name: flag.icon, size: 11 }),
|
|
4753
|
+
flag.label
|
|
4754
|
+
]
|
|
4755
|
+
}
|
|
4756
|
+
) }) : null,
|
|
4757
|
+
/* @__PURE__ */ jsx54(
|
|
4758
|
+
"button",
|
|
4759
|
+
{
|
|
4760
|
+
type: "button",
|
|
4761
|
+
onClick: () => setLightboxOpen(true),
|
|
4762
|
+
"aria-label": "Open photo viewer",
|
|
4763
|
+
className: cn(
|
|
4764
|
+
"bg-panel/85 hover:bg-panel border-border text-text-muted hover:text-text focus-visible:ring-accent-dim absolute z-10 inline-grid h-8 w-8 cursor-pointer place-items-center rounded-full border shadow-sm backdrop-blur outline-none focus-visible:ring-[3px]",
|
|
4765
|
+
isSpec ? "right-3 bottom-3" : "top-3 left-3"
|
|
4766
|
+
),
|
|
4767
|
+
children: /* @__PURE__ */ jsx54(IconGlyph8, { name: "maximize", size: 14 })
|
|
4768
|
+
}
|
|
4769
|
+
),
|
|
4770
|
+
isSpec && !hidePhotoCounter && photos.length > 1 && /* @__PURE__ */ jsxs47(
|
|
4771
|
+
"div",
|
|
4772
|
+
{
|
|
4773
|
+
"aria-hidden": true,
|
|
4774
|
+
className: cn(
|
|
4775
|
+
"pointer-events-none absolute top-3 right-3 z-10 rounded-full bg-black/55 px-2.5 py-1 font-mono text-[11px] text-white backdrop-blur",
|
|
4776
|
+
cls.photoCounter
|
|
4777
|
+
),
|
|
4778
|
+
children: [
|
|
4779
|
+
galleryIndex + 1,
|
|
4780
|
+
" / ",
|
|
4781
|
+
photos.length
|
|
4782
|
+
]
|
|
4783
|
+
}
|
|
4784
|
+
)
|
|
4785
|
+
] }),
|
|
4786
|
+
!isSpec && features && features.length > 0 && /* @__PURE__ */ jsx54("ul", { className: cn("flex flex-wrap gap-2", cls.features), children: features.map((f, i) => /* @__PURE__ */ jsxs47(
|
|
4787
|
+
"li",
|
|
4788
|
+
{
|
|
4789
|
+
className: "border-border bg-panel-2 text-text-muted inline-flex items-center gap-1.5 rounded-full border px-2.5 py-1 text-[12px]",
|
|
4790
|
+
children: [
|
|
4791
|
+
/* @__PURE__ */ jsx54(IconGlyph8, { name: f.icon, size: 12 }),
|
|
4792
|
+
f.label
|
|
4793
|
+
]
|
|
4794
|
+
},
|
|
4795
|
+
i
|
|
4796
|
+
)) })
|
|
4797
|
+
] }),
|
|
4798
|
+
/* @__PURE__ */ jsxs47("div", { className: cn("flex flex-col gap-4", cls.info), children: [
|
|
4799
|
+
/* @__PURE__ */ jsxs47("header", { className: cn("flex flex-col gap-1.5", cls.header), children: [
|
|
4800
|
+
eyebrow && !isSpec && /* @__PURE__ */ jsx54("span", { className: "text-text-dim font-mono text-[10px] tracking-wide uppercase", children: eyebrow }),
|
|
4801
|
+
/* @__PURE__ */ jsxs47("div", { className: "flex items-start justify-between gap-3", children: [
|
|
4802
|
+
/* @__PURE__ */ jsx54(RadixDialog6.Title, { asChild: true, children: /* @__PURE__ */ jsx54(
|
|
4803
|
+
"h2",
|
|
4804
|
+
{
|
|
4805
|
+
className: cn("text-text text-[22px] leading-tight font-semibold", cls.title),
|
|
4806
|
+
children: title
|
|
4807
|
+
}
|
|
4808
|
+
) }),
|
|
4809
|
+
isSpec && category && /* @__PURE__ */ jsx54(
|
|
4810
|
+
"span",
|
|
4811
|
+
{
|
|
4812
|
+
className: cn(
|
|
4813
|
+
"border-border bg-panel-2 text-text-muted mt-1 shrink-0 rounded-full border px-2 py-0.5 text-[10px] tracking-wide uppercase",
|
|
4814
|
+
cls.category
|
|
4815
|
+
),
|
|
4816
|
+
children: category
|
|
4817
|
+
}
|
|
4818
|
+
)
|
|
4819
|
+
] }),
|
|
4820
|
+
isSpec && meta && /* @__PURE__ */ jsx54(
|
|
4821
|
+
"span",
|
|
4822
|
+
{
|
|
4823
|
+
className: cn("text-text-dim font-mono text-[12px] tracking-wide", cls.meta),
|
|
4824
|
+
children: meta
|
|
4825
|
+
}
|
|
4826
|
+
),
|
|
4827
|
+
rating !== void 0 && /* @__PURE__ */ jsxs47("div", { className: "text-text-muted mt-1 flex items-center gap-2 text-[13px]", children: [
|
|
4828
|
+
/* @__PURE__ */ jsx54(IconGlyph8, { name: "star", size: 13, className: "text-rating" }),
|
|
4829
|
+
/* @__PURE__ */ jsx54("span", { className: "text-text font-medium", children: rating.toFixed(2) }),
|
|
4830
|
+
reviewCount !== void 0 && /* @__PURE__ */ jsxs47("span", { children: [
|
|
4831
|
+
"(",
|
|
4832
|
+
reviewCount,
|
|
4833
|
+
" reviews)"
|
|
4834
|
+
] }),
|
|
4835
|
+
/* @__PURE__ */ jsx54(
|
|
4836
|
+
Rating,
|
|
4837
|
+
{
|
|
4838
|
+
value: rating,
|
|
4839
|
+
max: 5,
|
|
4840
|
+
precision: "half",
|
|
4841
|
+
size: "sm",
|
|
4842
|
+
readOnly: true,
|
|
4843
|
+
className: "sr-only"
|
|
4844
|
+
}
|
|
4845
|
+
)
|
|
4846
|
+
] })
|
|
4847
|
+
] }),
|
|
4848
|
+
isSpec && specs && specs.length > 0 && /* @__PURE__ */ jsx54(
|
|
4849
|
+
"dl",
|
|
4850
|
+
{
|
|
4851
|
+
className: cn(
|
|
4852
|
+
"border-border grid grid-cols-2 gap-3 border-t pt-4 sm:grid-cols-3",
|
|
4853
|
+
cls.specs
|
|
4854
|
+
),
|
|
4855
|
+
children: specs.map((s, i) => /* @__PURE__ */ jsxs47("div", { className: cn("flex flex-col gap-0.5", cls.specCell), children: [
|
|
4856
|
+
/* @__PURE__ */ jsx54(
|
|
4857
|
+
"dt",
|
|
4858
|
+
{
|
|
4859
|
+
className: cn(
|
|
4860
|
+
"text-text-dim text-[10px] tracking-wider uppercase",
|
|
4861
|
+
cls.specLabel
|
|
4862
|
+
),
|
|
4863
|
+
children: s.label
|
|
4864
|
+
}
|
|
4865
|
+
),
|
|
4866
|
+
/* @__PURE__ */ jsx54("dd", { className: cn("text-text text-[15px] font-semibold", cls.specValue), children: s.value })
|
|
4867
|
+
] }, i))
|
|
4868
|
+
}
|
|
4869
|
+
),
|
|
4870
|
+
host && /* @__PURE__ */ jsxs47(
|
|
4871
|
+
"div",
|
|
4872
|
+
{
|
|
4873
|
+
className: cn("border-border flex items-center gap-3 border-t pt-4", cls.host),
|
|
4874
|
+
children: [
|
|
4875
|
+
/* @__PURE__ */ jsx54(
|
|
4876
|
+
Avatar,
|
|
4877
|
+
{
|
|
4878
|
+
size: "md",
|
|
4879
|
+
name: typeof host.name === "string" ? host.name : "Host",
|
|
4880
|
+
src: host.avatarUrl
|
|
4881
|
+
}
|
|
4882
|
+
),
|
|
4883
|
+
/* @__PURE__ */ jsxs47("div", { className: "flex flex-col", children: [
|
|
4884
|
+
/* @__PURE__ */ jsxs47("div", { className: "text-text inline-flex items-center gap-1.5 text-[13px] font-medium", children: [
|
|
4885
|
+
/* @__PURE__ */ jsxs47("span", { children: [
|
|
4886
|
+
"Hosted by ",
|
|
4887
|
+
host.name
|
|
4888
|
+
] }),
|
|
4889
|
+
host.verified && /* @__PURE__ */ jsxs47(Badge, { variant: "ok", size: "sm", children: [
|
|
4890
|
+
/* @__PURE__ */ jsx54(IconGlyph8, { name: "verified", size: 11 }),
|
|
4891
|
+
" Verified"
|
|
4892
|
+
] })
|
|
4893
|
+
] }),
|
|
4894
|
+
host.meta && /* @__PURE__ */ jsx54("span", { className: "text-text-dim text-[12px]", children: host.meta })
|
|
4895
|
+
] })
|
|
4896
|
+
]
|
|
4897
|
+
}
|
|
4898
|
+
),
|
|
4899
|
+
description && /* @__PURE__ */ jsx54(RadixDialog6.Description, { asChild: true, children: /* @__PURE__ */ jsx54("p", { className: cn("text-text-muted text-[13px] leading-[1.6]", cls.description), children: description }) }),
|
|
4900
|
+
!isSpec && /* @__PURE__ */ jsxs47(
|
|
4901
|
+
"div",
|
|
4902
|
+
{
|
|
4903
|
+
className: cn(
|
|
4904
|
+
"border-border mt-auto flex flex-col gap-3 border-t pt-4",
|
|
4905
|
+
cls.footer
|
|
4906
|
+
),
|
|
4907
|
+
children: [
|
|
4908
|
+
/* @__PURE__ */ jsxs47("div", { className: "flex items-baseline gap-2", children: [
|
|
4909
|
+
originalPrice && /* @__PURE__ */ jsx54("span", { className: "text-text-dim decoration-sale text-[13px] line-through", children: originalPrice }),
|
|
4910
|
+
/* @__PURE__ */ jsx54("span", { className: cn("text-text text-[22px] font-semibold", cls.price), children: price }),
|
|
4911
|
+
/* @__PURE__ */ jsx54("span", { className: cn("text-text-dim text-[13px]", cls.priceUnit), children: priceUnit })
|
|
4912
|
+
] }),
|
|
4913
|
+
(primaryAction || secondaryAction) && /* @__PURE__ */ jsxs47("div", { className: "flex flex-col gap-2 sm:flex-row sm:items-center sm:justify-end", children: [
|
|
4914
|
+
secondaryAction && renderAction(secondaryAction, "ghost"),
|
|
4915
|
+
primaryAction && renderAction(primaryAction, "primary")
|
|
4916
|
+
] })
|
|
4917
|
+
]
|
|
4918
|
+
}
|
|
4919
|
+
)
|
|
4920
|
+
] })
|
|
4921
|
+
]
|
|
4922
|
+
}
|
|
4923
|
+
),
|
|
4924
|
+
isSpec && (cta || price) && /* @__PURE__ */ jsxs47(
|
|
4925
|
+
"div",
|
|
4926
|
+
{
|
|
4927
|
+
className: cn(
|
|
4928
|
+
"border-border bg-panel-2 flex items-center justify-between gap-3 border-t px-6 py-4",
|
|
4929
|
+
cls.footer
|
|
4930
|
+
),
|
|
4931
|
+
children: [
|
|
4932
|
+
/* @__PURE__ */ jsxs47("div", { className: "flex items-baseline gap-2", children: [
|
|
4933
|
+
pricePrefix && /* @__PURE__ */ jsx54("span", { className: "text-text-dim text-[12px]", children: pricePrefix }),
|
|
4934
|
+
originalPrice && /* @__PURE__ */ jsx54("span", { className: "text-text-dim decoration-sale text-[13px] line-through", children: originalPrice }),
|
|
4935
|
+
/* @__PURE__ */ jsx54("span", { className: cn("text-text text-[20px] font-semibold", cls.price), children: price }),
|
|
4936
|
+
/* @__PURE__ */ jsx54("span", { className: cn("text-text-dim text-[13px]", cls.priceUnit), children: priceUnit })
|
|
4937
|
+
] }),
|
|
4938
|
+
cta && (cta.href ? /* @__PURE__ */ jsx54(Button, { asChild: true, variant: "primary", disabled: cta.disabled, className: cls.cta, children: /* @__PURE__ */ jsx54("a", { href: cta.href, onClick: cta.onClick, children: cta.label }) }) : /* @__PURE__ */ jsx54(
|
|
4939
|
+
Button,
|
|
4940
|
+
{
|
|
4941
|
+
variant: "primary",
|
|
4942
|
+
onClick: cta.onClick,
|
|
4943
|
+
disabled: cta.disabled,
|
|
4944
|
+
className: cls.cta,
|
|
4945
|
+
children: cta.label
|
|
4946
|
+
}
|
|
4947
|
+
))
|
|
4948
|
+
]
|
|
4949
|
+
}
|
|
4950
|
+
),
|
|
4951
|
+
/* @__PURE__ */ jsx54(RadixDialog6.Close, { asChild: true, children: /* @__PURE__ */ jsx54(
|
|
4952
|
+
"button",
|
|
4953
|
+
{
|
|
4954
|
+
type: "button",
|
|
4955
|
+
"aria-label": "Close listing details",
|
|
4956
|
+
className: cn(
|
|
4957
|
+
"bg-panel-2 hover:bg-panel-2/80 text-text-muted hover:text-text border-border focus-visible:ring-accent-dim absolute top-3 right-3 inline-grid h-9 w-9 cursor-pointer place-items-center rounded-full border outline-none focus-visible:ring-[3px]",
|
|
4958
|
+
cls.close
|
|
4959
|
+
),
|
|
4960
|
+
children: /* @__PURE__ */ jsx54(IconGlyph8, { name: "close", size: 16 })
|
|
4961
|
+
}
|
|
4962
|
+
) })
|
|
4963
|
+
]
|
|
4964
|
+
}
|
|
4965
|
+
)
|
|
4966
|
+
] }),
|
|
4967
|
+
/* @__PURE__ */ jsx54(
|
|
4968
|
+
Lightbox,
|
|
4969
|
+
{
|
|
4970
|
+
open: lightboxOpen,
|
|
4971
|
+
onOpenChange: setLightboxOpen,
|
|
4972
|
+
items: photos,
|
|
4973
|
+
index: galleryIndex,
|
|
4974
|
+
onIndexChange: setGalleryIndex,
|
|
4975
|
+
title: lightboxTitle,
|
|
4976
|
+
renderItem: (src, i) => renderPhoto ? renderPhoto(src, i, "lightbox") : /* @__PURE__ */ jsx54("img", { src, alt: "", className: "max-h-[88vh] max-w-[92vw] object-contain" })
|
|
4977
|
+
}
|
|
4978
|
+
)
|
|
4979
|
+
] });
|
|
4980
|
+
});
|
|
4981
|
+
ListingDetail.displayName = "ListingDetail";
|
|
4982
|
+
|
|
4322
4983
|
// src/patterns/PhoneInput/PhoneInput.tsx
|
|
4323
|
-
import { forwardRef as
|
|
4984
|
+
import { forwardRef as forwardRef53, useEffect as useEffect14, useMemo as useMemo5, useRef as useRef12, useState as useState15 } from "react";
|
|
4324
4985
|
|
|
4325
4986
|
// src/patterns/PhoneInput/countries.ts
|
|
4326
4987
|
var phoneCountries = [
|
|
@@ -4364,7 +5025,7 @@ var phoneCountries = [
|
|
|
4364
5025
|
];
|
|
4365
5026
|
|
|
4366
5027
|
// src/patterns/PhoneInput/PhoneInput.tsx
|
|
4367
|
-
import { jsx as
|
|
5028
|
+
import { jsx as jsx55, jsxs as jsxs48 } from "react/jsx-runtime";
|
|
4368
5029
|
function parseE164(value, list) {
|
|
4369
5030
|
if (!value.startsWith("+")) return null;
|
|
4370
5031
|
const digits = value.slice(1);
|
|
@@ -4378,7 +5039,7 @@ function toE164(country, national) {
|
|
|
4378
5039
|
if (cleaned.length === 0) return "";
|
|
4379
5040
|
return `+${country.dialCode}${cleaned}`;
|
|
4380
5041
|
}
|
|
4381
|
-
var PhoneInput =
|
|
5042
|
+
var PhoneInput = forwardRef53(function PhoneInput2({
|
|
4382
5043
|
value,
|
|
4383
5044
|
defaultValue,
|
|
4384
5045
|
onValueChange,
|
|
@@ -4394,11 +5055,11 @@ var PhoneInput = forwardRef52(function PhoneInput2({
|
|
|
4394
5055
|
onChange: onValueChange
|
|
4395
5056
|
});
|
|
4396
5057
|
const parsed = useMemo5(() => parseE164(committed ?? "", countries), [committed, countries]);
|
|
4397
|
-
const [country, setCountry] =
|
|
5058
|
+
const [country, setCountry] = useState15(
|
|
4398
5059
|
parsed?.country ?? countries.find((c) => c.code === defaultCountry) ?? countries[0]
|
|
4399
5060
|
);
|
|
4400
|
-
const [national, setNational] =
|
|
4401
|
-
const lastEmittedRef =
|
|
5061
|
+
const [national, setNational] = useState15(parsed?.national ?? "");
|
|
5062
|
+
const lastEmittedRef = useRef12(committed ?? "");
|
|
4402
5063
|
useEffect14(() => {
|
|
4403
5064
|
const current = committed ?? "";
|
|
4404
5065
|
if (current === lastEmittedRef.current) return;
|
|
@@ -4431,7 +5092,7 @@ var PhoneInput = forwardRef52(function PhoneInput2({
|
|
|
4431
5092
|
})),
|
|
4432
5093
|
[countries]
|
|
4433
5094
|
);
|
|
4434
|
-
return /* @__PURE__ */
|
|
5095
|
+
return /* @__PURE__ */ jsxs48(
|
|
4435
5096
|
"div",
|
|
4436
5097
|
{
|
|
4437
5098
|
className: cn(
|
|
@@ -4440,7 +5101,7 @@ var PhoneInput = forwardRef52(function PhoneInput2({
|
|
|
4440
5101
|
disabled && "opacity-50"
|
|
4441
5102
|
),
|
|
4442
5103
|
children: [
|
|
4443
|
-
/* @__PURE__ */
|
|
5104
|
+
/* @__PURE__ */ jsx55(
|
|
4444
5105
|
Select,
|
|
4445
5106
|
{
|
|
4446
5107
|
options: selectOptions,
|
|
@@ -4450,7 +5111,7 @@ var PhoneInput = forwardRef52(function PhoneInput2({
|
|
|
4450
5111
|
"aria-label": "Country"
|
|
4451
5112
|
}
|
|
4452
5113
|
),
|
|
4453
|
-
/* @__PURE__ */
|
|
5114
|
+
/* @__PURE__ */ jsx55(
|
|
4454
5115
|
"input",
|
|
4455
5116
|
{
|
|
4456
5117
|
ref,
|
|
@@ -4472,8 +5133,8 @@ var PhoneInput = forwardRef52(function PhoneInput2({
|
|
|
4472
5133
|
PhoneInput.displayName = "PhoneInput";
|
|
4473
5134
|
|
|
4474
5135
|
// src/patterns/PriceBreakdown/PriceBreakdown.tsx
|
|
4475
|
-
import { forwardRef as
|
|
4476
|
-
import { jsx as
|
|
5136
|
+
import { forwardRef as forwardRef54 } from "react";
|
|
5137
|
+
import { jsx as jsx56, jsxs as jsxs49 } from "react/jsx-runtime";
|
|
4477
5138
|
function PriceBreakdownRoot({
|
|
4478
5139
|
items,
|
|
4479
5140
|
total,
|
|
@@ -4483,30 +5144,30 @@ function PriceBreakdownRoot({
|
|
|
4483
5144
|
children,
|
|
4484
5145
|
...props
|
|
4485
5146
|
}, ref) {
|
|
4486
|
-
return /* @__PURE__ */
|
|
4487
|
-
items?.map((item, i) => /* @__PURE__ */
|
|
5147
|
+
return /* @__PURE__ */ jsxs49("div", { ref, className: cn("flex flex-col gap-2", className), ...props, children: [
|
|
5148
|
+
items?.map((item, i) => /* @__PURE__ */ jsx56(PriceBreakdownLine, { ...item }, i)),
|
|
4488
5149
|
children,
|
|
4489
|
-
total !== void 0 && /* @__PURE__ */
|
|
4490
|
-
/* @__PURE__ */
|
|
4491
|
-
/* @__PURE__ */
|
|
5150
|
+
total !== void 0 && /* @__PURE__ */ jsxs49("div", { className: "border-border mt-2 flex items-baseline justify-between border-t pt-3", children: [
|
|
5151
|
+
/* @__PURE__ */ jsx56("span", { className: "text-text text-[14px] font-semibold", children: totalLabel }),
|
|
5152
|
+
/* @__PURE__ */ jsxs49("span", { className: "text-text text-[16px] font-semibold", children: [
|
|
4492
5153
|
total,
|
|
4493
|
-
currency && /* @__PURE__ */
|
|
5154
|
+
currency && /* @__PURE__ */ jsx56("span", { className: "text-text-dim ml-1 text-[12px] font-normal", children: currency })
|
|
4494
5155
|
] })
|
|
4495
5156
|
] })
|
|
4496
5157
|
] });
|
|
4497
5158
|
}
|
|
4498
|
-
var PriceBreakdown =
|
|
5159
|
+
var PriceBreakdown = forwardRef54(PriceBreakdownRoot);
|
|
4499
5160
|
PriceBreakdown.displayName = "PriceBreakdown";
|
|
4500
|
-
var PriceBreakdownLine =
|
|
5161
|
+
var PriceBreakdownLine = forwardRef54(
|
|
4501
5162
|
function PriceBreakdownLine2({ label, subLabel, amount, originalAmount, discount, className }, ref) {
|
|
4502
|
-
return /* @__PURE__ */
|
|
4503
|
-
/* @__PURE__ */
|
|
4504
|
-
/* @__PURE__ */
|
|
4505
|
-
subLabel && /* @__PURE__ */
|
|
5163
|
+
return /* @__PURE__ */ jsxs49("div", { ref, className: cn("flex items-baseline justify-between gap-3", className), children: [
|
|
5164
|
+
/* @__PURE__ */ jsxs49("div", { className: "flex min-w-0 flex-col", children: [
|
|
5165
|
+
/* @__PURE__ */ jsx56("span", { className: "text-text text-[13px]", children: label }),
|
|
5166
|
+
subLabel && /* @__PURE__ */ jsx56("span", { className: "text-text-dim text-[11px]", children: subLabel })
|
|
4506
5167
|
] }),
|
|
4507
|
-
/* @__PURE__ */
|
|
4508
|
-
originalAmount && /* @__PURE__ */
|
|
4509
|
-
/* @__PURE__ */
|
|
5168
|
+
/* @__PURE__ */ jsxs49("div", { className: "inline-flex shrink-0 items-baseline gap-2", children: [
|
|
5169
|
+
originalAmount && /* @__PURE__ */ jsx56("span", { className: "text-text-dim decoration-sale text-[12px] line-through", children: originalAmount }),
|
|
5170
|
+
/* @__PURE__ */ jsx56(
|
|
4510
5171
|
"span",
|
|
4511
5172
|
{
|
|
4512
5173
|
className: cn("text-[13px] font-medium", discount ? "text-sale-text" : "text-text"),
|
|
@@ -4521,19 +5182,19 @@ PriceBreakdownLine.displayName = "PriceBreakdownLine";
|
|
|
4521
5182
|
PriceBreakdown.Line = PriceBreakdownLine;
|
|
4522
5183
|
|
|
4523
5184
|
// src/patterns/ReviewCard/ReviewCard.tsx
|
|
4524
|
-
import { IconGlyph as
|
|
4525
|
-
import { forwardRef as
|
|
4526
|
-
import { jsx as
|
|
4527
|
-
var ReviewCard =
|
|
4528
|
-
return /* @__PURE__ */
|
|
5185
|
+
import { IconGlyph as IconGlyph9 } from "@ship-it-ui/icons";
|
|
5186
|
+
import { forwardRef as forwardRef55 } from "react";
|
|
5187
|
+
import { jsx as jsx57, jsxs as jsxs50 } from "react/jsx-runtime";
|
|
5188
|
+
var ReviewCard = forwardRef55(function ReviewCard2({ author, authorAvatar, rating, date, body, photos, verified, subtitle, className, ...props }, ref) {
|
|
5189
|
+
return /* @__PURE__ */ jsxs50(
|
|
4529
5190
|
"article",
|
|
4530
5191
|
{
|
|
4531
5192
|
ref,
|
|
4532
5193
|
className: cn("border-border bg-panel flex flex-col gap-3 rounded-md border p-4", className),
|
|
4533
5194
|
...props,
|
|
4534
5195
|
children: [
|
|
4535
|
-
/* @__PURE__ */
|
|
4536
|
-
/* @__PURE__ */
|
|
5196
|
+
/* @__PURE__ */ jsxs50("header", { className: "flex items-start gap-3", children: [
|
|
5197
|
+
/* @__PURE__ */ jsx57(
|
|
4537
5198
|
Avatar,
|
|
4538
5199
|
{
|
|
4539
5200
|
src: authorAvatar,
|
|
@@ -4541,24 +5202,24 @@ var ReviewCard = forwardRef54(function ReviewCard2({ author, authorAvatar, ratin
|
|
|
4541
5202
|
size: "md"
|
|
4542
5203
|
}
|
|
4543
5204
|
),
|
|
4544
|
-
/* @__PURE__ */
|
|
4545
|
-
/* @__PURE__ */
|
|
4546
|
-
/* @__PURE__ */
|
|
4547
|
-
verified && /* @__PURE__ */
|
|
4548
|
-
/* @__PURE__ */
|
|
5205
|
+
/* @__PURE__ */ jsxs50("div", { className: "flex min-w-0 flex-1 flex-col gap-0.5", children: [
|
|
5206
|
+
/* @__PURE__ */ jsxs50("div", { className: "flex items-center gap-2", children: [
|
|
5207
|
+
/* @__PURE__ */ jsx57("span", { className: "text-text text-[14px] leading-tight font-semibold", children: author }),
|
|
5208
|
+
verified && /* @__PURE__ */ jsxs50(Badge, { variant: "ok", size: "sm", children: [
|
|
5209
|
+
/* @__PURE__ */ jsx57(IconGlyph9, { name: "verified", size: 11 }),
|
|
4549
5210
|
" Verified trip"
|
|
4550
5211
|
] })
|
|
4551
5212
|
] }),
|
|
4552
|
-
subtitle && /* @__PURE__ */
|
|
4553
|
-
/* @__PURE__ */
|
|
4554
|
-
/* @__PURE__ */
|
|
4555
|
-
/* @__PURE__ */
|
|
4556
|
-
/* @__PURE__ */
|
|
5213
|
+
subtitle && /* @__PURE__ */ jsx57("span", { className: "text-text-dim text-[11px]", children: subtitle }),
|
|
5214
|
+
/* @__PURE__ */ jsxs50("div", { className: "mt-1 flex items-center gap-2", children: [
|
|
5215
|
+
/* @__PURE__ */ jsx57(Rating, { value: rating, max: 5, precision: "half", size: "sm", readOnly: true }),
|
|
5216
|
+
/* @__PURE__ */ jsx57("span", { className: "text-text-dim text-[11px]", children: "\xB7" }),
|
|
5217
|
+
/* @__PURE__ */ jsx57("time", { className: "text-text-dim text-[11px]", children: date })
|
|
4557
5218
|
] })
|
|
4558
5219
|
] })
|
|
4559
5220
|
] }),
|
|
4560
|
-
/* @__PURE__ */
|
|
4561
|
-
photos && photos.length > 0 && /* @__PURE__ */
|
|
5221
|
+
/* @__PURE__ */ jsx57("p", { className: "text-text text-[13px] leading-relaxed", children: body }),
|
|
5222
|
+
photos && photos.length > 0 && /* @__PURE__ */ jsx57("div", { className: "flex gap-2 overflow-x-auto [scrollbar-width:none] [&::-webkit-scrollbar]:hidden", children: photos.map((src, i) => /* @__PURE__ */ jsx57(
|
|
4562
5223
|
"img",
|
|
4563
5224
|
{
|
|
4564
5225
|
src,
|
|
@@ -4575,11 +5236,11 @@ var ReviewCard = forwardRef54(function ReviewCard2({ author, authorAvatar, ratin
|
|
|
4575
5236
|
ReviewCard.displayName = "ReviewCard";
|
|
4576
5237
|
|
|
4577
5238
|
// src/patterns/Dots/Dots.tsx
|
|
4578
|
-
import { forwardRef as
|
|
4579
|
-
import { jsx as
|
|
4580
|
-
var Dots =
|
|
5239
|
+
import { forwardRef as forwardRef56 } from "react";
|
|
5240
|
+
import { jsx as jsx58 } from "react/jsx-runtime";
|
|
5241
|
+
var Dots = forwardRef56(function Dots2({ total, current, onChange, className, "aria-label": ariaLabel = "Progress", ...props }, ref) {
|
|
4581
5242
|
const interactive = typeof onChange === "function";
|
|
4582
|
-
return /* @__PURE__ */
|
|
5243
|
+
return /* @__PURE__ */ jsx58(
|
|
4583
5244
|
"nav",
|
|
4584
5245
|
{
|
|
4585
5246
|
ref,
|
|
@@ -4593,7 +5254,7 @@ var Dots = forwardRef55(function Dots2({ total, current, onChange, className, "a
|
|
|
4593
5254
|
isActive ? "w-[18px] bg-accent" : "w-[6px] bg-panel-2"
|
|
4594
5255
|
);
|
|
4595
5256
|
if (interactive) {
|
|
4596
|
-
return /* @__PURE__ */
|
|
5257
|
+
return /* @__PURE__ */ jsx58(
|
|
4597
5258
|
"button",
|
|
4598
5259
|
{
|
|
4599
5260
|
type: "button",
|
|
@@ -4610,7 +5271,7 @@ var Dots = forwardRef55(function Dots2({ total, current, onChange, className, "a
|
|
|
4610
5271
|
i
|
|
4611
5272
|
);
|
|
4612
5273
|
}
|
|
4613
|
-
return /* @__PURE__ */
|
|
5274
|
+
return /* @__PURE__ */ jsx58("span", { "aria-hidden": true, className: sharedClass }, i);
|
|
4614
5275
|
})
|
|
4615
5276
|
}
|
|
4616
5277
|
);
|
|
@@ -4619,15 +5280,15 @@ Dots.displayName = "Dots";
|
|
|
4619
5280
|
|
|
4620
5281
|
// src/patterns/Dropzone/Dropzone.tsx
|
|
4621
5282
|
import {
|
|
4622
|
-
forwardRef as
|
|
4623
|
-
useState as
|
|
5283
|
+
forwardRef as forwardRef57,
|
|
5284
|
+
useState as useState16
|
|
4624
5285
|
} from "react";
|
|
4625
|
-
import { jsx as
|
|
5286
|
+
import { jsx as jsx59, jsxs as jsxs51 } from "react/jsx-runtime";
|
|
4626
5287
|
function listToArray(list) {
|
|
4627
5288
|
if (!list) return [];
|
|
4628
5289
|
return Array.from(list);
|
|
4629
5290
|
}
|
|
4630
|
-
var Dropzone =
|
|
5291
|
+
var Dropzone = forwardRef57(function Dropzone2({
|
|
4631
5292
|
onFiles,
|
|
4632
5293
|
accept,
|
|
4633
5294
|
multiple = true,
|
|
@@ -4638,7 +5299,7 @@ var Dropzone = forwardRef56(function Dropzone2({
|
|
|
4638
5299
|
className,
|
|
4639
5300
|
...props
|
|
4640
5301
|
}, ref) {
|
|
4641
|
-
const [isDragging, setIsDragging] =
|
|
5302
|
+
const [isDragging, setIsDragging] = useState16(false);
|
|
4642
5303
|
const onDragOver = (e) => {
|
|
4643
5304
|
if (disabled) return;
|
|
4644
5305
|
e.preventDefault();
|
|
@@ -4652,7 +5313,7 @@ var Dropzone = forwardRef56(function Dropzone2({
|
|
|
4652
5313
|
const files = listToArray(e.dataTransfer.files);
|
|
4653
5314
|
if (files.length) onFiles?.(files);
|
|
4654
5315
|
};
|
|
4655
|
-
return /* @__PURE__ */
|
|
5316
|
+
return /* @__PURE__ */ jsxs51(
|
|
4656
5317
|
"label",
|
|
4657
5318
|
{
|
|
4658
5319
|
ref,
|
|
@@ -4669,7 +5330,7 @@ var Dropzone = forwardRef56(function Dropzone2({
|
|
|
4669
5330
|
),
|
|
4670
5331
|
...props,
|
|
4671
5332
|
children: [
|
|
4672
|
-
/* @__PURE__ */
|
|
5333
|
+
/* @__PURE__ */ jsx59(
|
|
4673
5334
|
"input",
|
|
4674
5335
|
{
|
|
4675
5336
|
type: "file",
|
|
@@ -4685,7 +5346,7 @@ var Dropzone = forwardRef56(function Dropzone2({
|
|
|
4685
5346
|
}
|
|
4686
5347
|
}
|
|
4687
5348
|
),
|
|
4688
|
-
/* @__PURE__ */
|
|
5349
|
+
/* @__PURE__ */ jsx59(
|
|
4689
5350
|
"div",
|
|
4690
5351
|
{
|
|
4691
5352
|
"aria-hidden": true,
|
|
@@ -4693,8 +5354,8 @@ var Dropzone = forwardRef56(function Dropzone2({
|
|
|
4693
5354
|
children: icon
|
|
4694
5355
|
}
|
|
4695
5356
|
),
|
|
4696
|
-
/* @__PURE__ */
|
|
4697
|
-
description && /* @__PURE__ */
|
|
5357
|
+
/* @__PURE__ */ jsx59("div", { className: "mb-1 text-[13px] font-medium", children: title }),
|
|
5358
|
+
description && /* @__PURE__ */ jsx59("div", { className: "text-text-dim text-[11px]", children: description })
|
|
4698
5359
|
]
|
|
4699
5360
|
}
|
|
4700
5361
|
);
|
|
@@ -4702,10 +5363,10 @@ var Dropzone = forwardRef56(function Dropzone2({
|
|
|
4702
5363
|
Dropzone.displayName = "Dropzone";
|
|
4703
5364
|
|
|
4704
5365
|
// src/patterns/EmptyState/EmptyState.tsx
|
|
4705
|
-
import { cva as
|
|
4706
|
-
import { forwardRef as
|
|
4707
|
-
import { jsx as
|
|
4708
|
-
var plateStyles =
|
|
5366
|
+
import { cva as cva12 } from "class-variance-authority";
|
|
5367
|
+
import { forwardRef as forwardRef58 } from "react";
|
|
5368
|
+
import { jsx as jsx60, jsxs as jsxs52 } from "react/jsx-runtime";
|
|
5369
|
+
var plateStyles = cva12("grid h-12 w-12 place-items-center rounded-base text-[22px]", {
|
|
4709
5370
|
variants: {
|
|
4710
5371
|
tone: {
|
|
4711
5372
|
neutral: "bg-panel-2 text-text-muted",
|
|
@@ -4717,8 +5378,8 @@ var plateStyles = cva11("grid h-12 w-12 place-items-center rounded-base text-[22
|
|
|
4717
5378
|
},
|
|
4718
5379
|
defaultVariants: { tone: "neutral" }
|
|
4719
5380
|
});
|
|
4720
|
-
var EmptyState =
|
|
4721
|
-
return /* @__PURE__ */
|
|
5381
|
+
var EmptyState = forwardRef58(function EmptyState2({ icon, title, description, action, chips, tone, className, ...props }, ref) {
|
|
5382
|
+
return /* @__PURE__ */ jsxs52(
|
|
4722
5383
|
"div",
|
|
4723
5384
|
{
|
|
4724
5385
|
ref,
|
|
@@ -4728,10 +5389,10 @@ var EmptyState = forwardRef57(function EmptyState2({ icon, title, description, a
|
|
|
4728
5389
|
),
|
|
4729
5390
|
...props,
|
|
4730
5391
|
children: [
|
|
4731
|
-
icon != null && /* @__PURE__ */
|
|
4732
|
-
/* @__PURE__ */
|
|
4733
|
-
description && /* @__PURE__ */
|
|
4734
|
-
chips && chips.length > 0 && /* @__PURE__ */
|
|
5392
|
+
icon != null && /* @__PURE__ */ jsx60("span", { "aria-hidden": true, className: plateStyles({ tone: tone ?? "neutral" }), children: icon }),
|
|
5393
|
+
/* @__PURE__ */ jsx60("div", { className: "text-[14px] font-medium", children: title }),
|
|
5394
|
+
description && /* @__PURE__ */ jsx60("div", { className: "text-text-muted max-w-[260px] text-[12px] leading-[1.5]", children: description }),
|
|
5395
|
+
chips && chips.length > 0 && /* @__PURE__ */ jsx60("div", { className: "flex w-full flex-col gap-1", children: chips.map((c, i) => /* @__PURE__ */ jsx60(
|
|
4735
5396
|
"button",
|
|
4736
5397
|
{
|
|
4737
5398
|
type: "button",
|
|
@@ -4753,18 +5414,18 @@ var EmptyState = forwardRef57(function EmptyState2({ icon, title, description, a
|
|
|
4753
5414
|
EmptyState.displayName = "EmptyState";
|
|
4754
5415
|
|
|
4755
5416
|
// src/patterns/FileChip/FileChip.tsx
|
|
4756
|
-
import { forwardRef as
|
|
4757
|
-
import { jsx as
|
|
5417
|
+
import { forwardRef as forwardRef59 } from "react";
|
|
5418
|
+
import { jsx as jsx61, jsxs as jsxs53 } from "react/jsx-runtime";
|
|
4758
5419
|
function deriveExt(name) {
|
|
4759
5420
|
const dot = name.lastIndexOf(".");
|
|
4760
5421
|
if (dot < 0) return "FILE";
|
|
4761
5422
|
return name.slice(dot + 1).slice(0, 4).toUpperCase();
|
|
4762
5423
|
}
|
|
4763
|
-
var FileChip =
|
|
5424
|
+
var FileChip = forwardRef59(function FileChip2({ name, size, progress, icon, onRemove, failed, className, ...props }, ref) {
|
|
4764
5425
|
const ext = deriveExt(name);
|
|
4765
5426
|
const showProgress = typeof progress === "number";
|
|
4766
5427
|
const isComplete = showProgress && progress >= 100;
|
|
4767
|
-
return /* @__PURE__ */
|
|
5428
|
+
return /* @__PURE__ */ jsxs53(
|
|
4768
5429
|
"div",
|
|
4769
5430
|
{
|
|
4770
5431
|
ref,
|
|
@@ -4774,7 +5435,7 @@ var FileChip = forwardRef58(function FileChip2({ name, size, progress, icon, onR
|
|
|
4774
5435
|
),
|
|
4775
5436
|
...props,
|
|
4776
5437
|
children: [
|
|
4777
|
-
/* @__PURE__ */
|
|
5438
|
+
/* @__PURE__ */ jsx61(
|
|
4778
5439
|
"span",
|
|
4779
5440
|
{
|
|
4780
5441
|
"aria-hidden": true,
|
|
@@ -4782,17 +5443,17 @@ var FileChip = forwardRef58(function FileChip2({ name, size, progress, icon, onR
|
|
|
4782
5443
|
children: icon ?? ext
|
|
4783
5444
|
}
|
|
4784
5445
|
),
|
|
4785
|
-
/* @__PURE__ */
|
|
4786
|
-
/* @__PURE__ */
|
|
4787
|
-
/* @__PURE__ */
|
|
5446
|
+
/* @__PURE__ */ jsxs53("div", { className: "min-w-0 flex-1", children: [
|
|
5447
|
+
/* @__PURE__ */ jsx61("div", { className: "truncate text-[12px] font-medium", children: name }),
|
|
5448
|
+
/* @__PURE__ */ jsxs53("div", { className: cn("font-mono text-[10px]", failed ? "text-err" : "text-text-dim"), children: [
|
|
4788
5449
|
size,
|
|
4789
|
-
showProgress && !isComplete && /* @__PURE__ */
|
|
5450
|
+
showProgress && !isComplete && /* @__PURE__ */ jsxs53("span", { children: [
|
|
4790
5451
|
" \xB7 ",
|
|
4791
5452
|
Math.round(progress),
|
|
4792
5453
|
"%"
|
|
4793
5454
|
] })
|
|
4794
5455
|
] }),
|
|
4795
|
-
showProgress && !isComplete && /* @__PURE__ */
|
|
5456
|
+
showProgress && !isComplete && /* @__PURE__ */ jsx61("div", { className: "bg-panel mt-1 h-[2px] overflow-hidden rounded-full", children: /* @__PURE__ */ jsx61(
|
|
4796
5457
|
"div",
|
|
4797
5458
|
{
|
|
4798
5459
|
className: cn(
|
|
@@ -4803,7 +5464,7 @@ var FileChip = forwardRef58(function FileChip2({ name, size, progress, icon, onR
|
|
|
4803
5464
|
}
|
|
4804
5465
|
) })
|
|
4805
5466
|
] }),
|
|
4806
|
-
onRemove && /* @__PURE__ */
|
|
5467
|
+
onRemove && /* @__PURE__ */ jsx61(
|
|
4807
5468
|
"button",
|
|
4808
5469
|
{
|
|
4809
5470
|
type: "button",
|
|
@@ -4823,10 +5484,10 @@ var FileChip = forwardRef58(function FileChip2({ name, size, progress, icon, onR
|
|
|
4823
5484
|
FileChip.displayName = "FileChip";
|
|
4824
5485
|
|
|
4825
5486
|
// src/patterns/FilterPanel/FilterPanel.tsx
|
|
4826
|
-
import { forwardRef as
|
|
4827
|
-
import { jsx as
|
|
5487
|
+
import { forwardRef as forwardRef60, useCallback as useCallback12, useState as useState17 } from "react";
|
|
5488
|
+
import { jsx as jsx62, jsxs as jsxs54 } from "react/jsx-runtime";
|
|
4828
5489
|
var EMPTY = Object.freeze({});
|
|
4829
|
-
var FilterPanel =
|
|
5490
|
+
var FilterPanel = forwardRef60(function FilterPanel2({
|
|
4830
5491
|
facets,
|
|
4831
5492
|
value,
|
|
4832
5493
|
defaultValue,
|
|
@@ -4859,7 +5520,7 @@ var FilterPanel = forwardRef59(function FilterPanel2({
|
|
|
4859
5520
|
setSelection(EMPTY);
|
|
4860
5521
|
onReset?.();
|
|
4861
5522
|
}, [setSelection, onReset]);
|
|
4862
|
-
return /* @__PURE__ */
|
|
5523
|
+
return /* @__PURE__ */ jsxs54(
|
|
4863
5524
|
"div",
|
|
4864
5525
|
{
|
|
4865
5526
|
ref,
|
|
@@ -4871,10 +5532,10 @@ var FilterPanel = forwardRef59(function FilterPanel2({
|
|
|
4871
5532
|
),
|
|
4872
5533
|
...props,
|
|
4873
5534
|
children: [
|
|
4874
|
-
/* @__PURE__ */
|
|
4875
|
-
/* @__PURE__ */
|
|
4876
|
-
total > 0 && /* @__PURE__ */
|
|
4877
|
-
/* @__PURE__ */
|
|
5535
|
+
/* @__PURE__ */ jsxs54("div", { className: "flex items-center gap-2", children: [
|
|
5536
|
+
/* @__PURE__ */ jsx62("span", { className: "text-text-dim font-mono text-[10px] tracking-[1.4px] uppercase", children: title }),
|
|
5537
|
+
total > 0 && /* @__PURE__ */ jsx62(Badge, { size: "sm", variant: "accent", children: total }),
|
|
5538
|
+
/* @__PURE__ */ jsx62(
|
|
4878
5539
|
Button,
|
|
4879
5540
|
{
|
|
4880
5541
|
type: "button",
|
|
@@ -4887,7 +5548,7 @@ var FilterPanel = forwardRef59(function FilterPanel2({
|
|
|
4887
5548
|
}
|
|
4888
5549
|
)
|
|
4889
5550
|
] }),
|
|
4890
|
-
facets.map((facet) => /* @__PURE__ */
|
|
5551
|
+
facets.map((facet) => /* @__PURE__ */ jsx62(
|
|
4891
5552
|
FilterFacetGroup,
|
|
4892
5553
|
{
|
|
4893
5554
|
facet,
|
|
@@ -4904,12 +5565,12 @@ var FilterPanel = forwardRef59(function FilterPanel2({
|
|
|
4904
5565
|
FilterPanel.displayName = "FilterPanel";
|
|
4905
5566
|
function FilterFacetGroup({ facet, selected, counts, onToggle }) {
|
|
4906
5567
|
const collapsible = facet.collapsible ?? true;
|
|
4907
|
-
const [open, setOpen] =
|
|
5568
|
+
const [open, setOpen] = useState17(facet.defaultOpen ?? true);
|
|
4908
5569
|
const isOpen = !collapsible || open;
|
|
4909
5570
|
const selectedCount = selected.length;
|
|
4910
5571
|
const headingClass = "text-text-muted flex items-center gap-[6px] font-mono text-[10px] tracking-[1.4px] uppercase";
|
|
4911
|
-
return /* @__PURE__ */
|
|
4912
|
-
collapsible ? /* @__PURE__ */
|
|
5572
|
+
return /* @__PURE__ */ jsxs54("section", { className: "flex flex-col gap-1", children: [
|
|
5573
|
+
collapsible ? /* @__PURE__ */ jsxs54(
|
|
4913
5574
|
"button",
|
|
4914
5575
|
{
|
|
4915
5576
|
type: "button",
|
|
@@ -4922,20 +5583,20 @@ function FilterFacetGroup({ facet, selected, counts, onToggle }) {
|
|
|
4922
5583
|
"hover:text-text"
|
|
4923
5584
|
),
|
|
4924
5585
|
children: [
|
|
4925
|
-
/* @__PURE__ */
|
|
4926
|
-
selectedCount > 0 && /* @__PURE__ */
|
|
4927
|
-
/* @__PURE__ */
|
|
5586
|
+
/* @__PURE__ */ jsx62("span", { className: "flex-1 text-left", children: facet.label }),
|
|
5587
|
+
selectedCount > 0 && /* @__PURE__ */ jsx62(Badge, { size: "sm", variant: "neutral", children: selectedCount }),
|
|
5588
|
+
/* @__PURE__ */ jsx62("span", { "aria-hidden": true, className: "text-[10px] opacity-70", children: isOpen ? "\u25BE" : "\u25B8" })
|
|
4928
5589
|
]
|
|
4929
5590
|
}
|
|
4930
|
-
) : /* @__PURE__ */
|
|
4931
|
-
/* @__PURE__ */
|
|
4932
|
-
selectedCount > 0 && /* @__PURE__ */
|
|
5591
|
+
) : /* @__PURE__ */ jsxs54("div", { className: cn(headingClass, "px-1 py-[2px]"), children: [
|
|
5592
|
+
/* @__PURE__ */ jsx62("span", { className: "flex-1", children: facet.label }),
|
|
5593
|
+
selectedCount > 0 && /* @__PURE__ */ jsx62(Badge, { size: "sm", variant: "neutral", children: selectedCount })
|
|
4933
5594
|
] }),
|
|
4934
|
-
isOpen && /* @__PURE__ */
|
|
5595
|
+
isOpen && /* @__PURE__ */ jsx62("ul", { className: "m-0 flex list-none flex-col gap-[2px] p-0", children: facet.options.map((option) => {
|
|
4935
5596
|
const isSelected = selected.includes(option.value);
|
|
4936
5597
|
const count = counts?.[option.value];
|
|
4937
|
-
return /* @__PURE__ */
|
|
4938
|
-
/* @__PURE__ */
|
|
5598
|
+
return /* @__PURE__ */ jsxs54("li", { className: "flex items-center gap-2 px-1 py-[3px]", children: [
|
|
5599
|
+
/* @__PURE__ */ jsx62(
|
|
4939
5600
|
Checkbox,
|
|
4940
5601
|
{
|
|
4941
5602
|
checked: isSelected,
|
|
@@ -4943,25 +5604,25 @@ function FilterFacetGroup({ facet, selected, counts, onToggle }) {
|
|
|
4943
5604
|
label: option.label
|
|
4944
5605
|
}
|
|
4945
5606
|
),
|
|
4946
|
-
typeof count === "number" && /* @__PURE__ */
|
|
5607
|
+
typeof count === "number" && /* @__PURE__ */ jsx62("span", { className: "text-text-dim ml-auto font-mono text-[10px] tabular-nums", children: count })
|
|
4947
5608
|
] }, option.value);
|
|
4948
5609
|
}) })
|
|
4949
5610
|
] });
|
|
4950
5611
|
}
|
|
4951
5612
|
|
|
4952
5613
|
// src/patterns/HealthScore/HealthScore.tsx
|
|
4953
|
-
import { forwardRef as
|
|
5614
|
+
import { forwardRef as forwardRef62 } from "react";
|
|
4954
5615
|
|
|
4955
5616
|
// src/patterns/RadialProgress/RadialProgress.tsx
|
|
4956
|
-
import { forwardRef as
|
|
4957
|
-
import { jsx as
|
|
5617
|
+
import { forwardRef as forwardRef61 } from "react";
|
|
5618
|
+
import { jsx as jsx63, jsxs as jsxs55 } from "react/jsx-runtime";
|
|
4958
5619
|
var toneStrokeClass = {
|
|
4959
5620
|
accent: "stroke-accent",
|
|
4960
5621
|
ok: "stroke-ok",
|
|
4961
5622
|
warn: "stroke-warn",
|
|
4962
5623
|
err: "stroke-err"
|
|
4963
5624
|
};
|
|
4964
|
-
var RadialProgress =
|
|
5625
|
+
var RadialProgress = forwardRef61(
|
|
4965
5626
|
function RadialProgress2({
|
|
4966
5627
|
value,
|
|
4967
5628
|
max = 100,
|
|
@@ -4979,7 +5640,7 @@ var RadialProgress = forwardRef60(
|
|
|
4979
5640
|
const c = 2 * Math.PI * r;
|
|
4980
5641
|
const dash = pct / 100 * c;
|
|
4981
5642
|
const resolvedTone = tone ?? (clamped >= max ? "ok" : "accent");
|
|
4982
|
-
return /* @__PURE__ */
|
|
5643
|
+
return /* @__PURE__ */ jsxs55(
|
|
4983
5644
|
"div",
|
|
4984
5645
|
{
|
|
4985
5646
|
ref,
|
|
@@ -4992,8 +5653,8 @@ var RadialProgress = forwardRef60(
|
|
|
4992
5653
|
style: { width: size, height: size },
|
|
4993
5654
|
...props,
|
|
4994
5655
|
children: [
|
|
4995
|
-
/* @__PURE__ */
|
|
4996
|
-
/* @__PURE__ */
|
|
5656
|
+
/* @__PURE__ */ jsxs55("svg", { width: size, height: size, viewBox: `0 0 ${size} ${size}`, children: [
|
|
5657
|
+
/* @__PURE__ */ jsx63(
|
|
4997
5658
|
"circle",
|
|
4998
5659
|
{
|
|
4999
5660
|
cx: size / 2,
|
|
@@ -5004,7 +5665,7 @@ var RadialProgress = forwardRef60(
|
|
|
5004
5665
|
className: "stroke-panel-2"
|
|
5005
5666
|
}
|
|
5006
5667
|
),
|
|
5007
|
-
/* @__PURE__ */
|
|
5668
|
+
/* @__PURE__ */ jsx63(
|
|
5008
5669
|
"circle",
|
|
5009
5670
|
{
|
|
5010
5671
|
cx: size / 2,
|
|
@@ -5022,7 +5683,7 @@ var RadialProgress = forwardRef60(
|
|
|
5022
5683
|
}
|
|
5023
5684
|
)
|
|
5024
5685
|
] }),
|
|
5025
|
-
/* @__PURE__ */
|
|
5686
|
+
/* @__PURE__ */ jsx63("div", { className: "absolute inset-0 grid place-items-center font-mono text-[11px] font-medium tabular-nums", children: children ?? `${Math.round(pct)}%` })
|
|
5026
5687
|
]
|
|
5027
5688
|
}
|
|
5028
5689
|
);
|
|
@@ -5031,7 +5692,7 @@ var RadialProgress = forwardRef60(
|
|
|
5031
5692
|
RadialProgress.displayName = "RadialProgress";
|
|
5032
5693
|
|
|
5033
5694
|
// src/patterns/HealthScore/HealthScore.tsx
|
|
5034
|
-
import { jsx as
|
|
5695
|
+
import { jsx as jsx64, jsxs as jsxs56 } from "react/jsx-runtime";
|
|
5035
5696
|
function deltaTone(delta) {
|
|
5036
5697
|
if (delta > 0) return "ok";
|
|
5037
5698
|
if (delta < 0) return "err";
|
|
@@ -5048,7 +5709,7 @@ var toneTextClass = {
|
|
|
5048
5709
|
warn: "text-warn",
|
|
5049
5710
|
err: "text-err"
|
|
5050
5711
|
};
|
|
5051
|
-
var HealthScore =
|
|
5712
|
+
var HealthScore = forwardRef62(function HealthScore2({
|
|
5052
5713
|
value,
|
|
5053
5714
|
max = 100,
|
|
5054
5715
|
delta,
|
|
@@ -5063,7 +5724,7 @@ var HealthScore = forwardRef61(function HealthScore2({
|
|
|
5063
5724
|
const pct = max > 0 ? Math.round(Math.min(max, Math.max(0, value)) / max * 100) : 0;
|
|
5064
5725
|
const resolvedTone = tone ?? (pct >= 80 ? "ok" : pct >= 50 ? "accent" : "warn");
|
|
5065
5726
|
const indicatorTone = typeof delta === "number" ? deltaTone(delta) : "accent";
|
|
5066
|
-
const core = /* @__PURE__ */
|
|
5727
|
+
const core = /* @__PURE__ */ jsxs56(
|
|
5067
5728
|
"div",
|
|
5068
5729
|
{
|
|
5069
5730
|
ref,
|
|
@@ -5071,10 +5732,10 @@ var HealthScore = forwardRef61(function HealthScore2({
|
|
|
5071
5732
|
"aria-label": ariaLabel ?? `${pct}% health`,
|
|
5072
5733
|
...props,
|
|
5073
5734
|
children: [
|
|
5074
|
-
/* @__PURE__ */
|
|
5075
|
-
label && /* @__PURE__ */
|
|
5076
|
-
typeof delta === "number" && /* @__PURE__ */
|
|
5077
|
-
/* @__PURE__ */
|
|
5735
|
+
/* @__PURE__ */ jsx64(RadialProgress, { value, max, size, tone: resolvedTone }),
|
|
5736
|
+
label && /* @__PURE__ */ jsx64("div", { className: "text-text-muted mt-1 text-[12px] leading-tight", children: label }),
|
|
5737
|
+
typeof delta === "number" && /* @__PURE__ */ jsxs56("div", { className: cn("font-mono text-[11px] tabular-nums", toneTextClass[indicatorTone]), children: [
|
|
5738
|
+
/* @__PURE__ */ jsx64("span", { "aria-hidden": true, children: deltaGlyph(delta) }),
|
|
5078
5739
|
" ",
|
|
5079
5740
|
Math.abs(delta)
|
|
5080
5741
|
] })
|
|
@@ -5084,15 +5745,15 @@ var HealthScore = forwardRef61(function HealthScore2({
|
|
|
5084
5745
|
if (!breakdown || breakdown.length === 0) {
|
|
5085
5746
|
return core;
|
|
5086
5747
|
}
|
|
5087
|
-
return /* @__PURE__ */
|
|
5748
|
+
return /* @__PURE__ */ jsx64(
|
|
5088
5749
|
HoverCard,
|
|
5089
5750
|
{
|
|
5090
|
-
trigger: /* @__PURE__ */
|
|
5091
|
-
content: /* @__PURE__ */
|
|
5092
|
-
/* @__PURE__ */
|
|
5093
|
-
/* @__PURE__ */
|
|
5094
|
-
/* @__PURE__ */
|
|
5095
|
-
/* @__PURE__ */
|
|
5751
|
+
trigger: /* @__PURE__ */ jsx64("span", { className: "inline-flex", children: core }),
|
|
5752
|
+
content: /* @__PURE__ */ jsxs56("div", { className: "flex min-w-[180px] flex-col gap-2", children: [
|
|
5753
|
+
/* @__PURE__ */ jsx64("div", { className: "text-text-dim font-mono text-[9px] tracking-[1.4px] uppercase", children: "Breakdown" }),
|
|
5754
|
+
/* @__PURE__ */ jsx64("ul", { className: "m-0 flex list-none flex-col gap-1 p-0 text-[12px]", children: breakdown.map((entry, i) => /* @__PURE__ */ jsxs56("li", { className: "flex items-center gap-2", children: [
|
|
5755
|
+
/* @__PURE__ */ jsx64("span", { className: "text-text-muted flex-1 truncate", children: entry.label }),
|
|
5756
|
+
/* @__PURE__ */ jsx64(
|
|
5096
5757
|
"span",
|
|
5097
5758
|
{
|
|
5098
5759
|
className: cn(
|
|
@@ -5110,21 +5771,21 @@ var HealthScore = forwardRef61(function HealthScore2({
|
|
|
5110
5771
|
HealthScore.displayName = "HealthScore";
|
|
5111
5772
|
|
|
5112
5773
|
// src/patterns/LargeTitle/LargeTitle.tsx
|
|
5113
|
-
import { forwardRef as
|
|
5114
|
-
import { jsx as
|
|
5115
|
-
var LargeTitle =
|
|
5116
|
-
return /* @__PURE__ */
|
|
5774
|
+
import { forwardRef as forwardRef63 } from "react";
|
|
5775
|
+
import { jsx as jsx65, jsxs as jsxs57 } from "react/jsx-runtime";
|
|
5776
|
+
var LargeTitle = forwardRef63(function LargeTitle2({ title, eyebrow, trailing, className, ...props }, ref) {
|
|
5777
|
+
return /* @__PURE__ */ jsxs57(
|
|
5117
5778
|
"header",
|
|
5118
5779
|
{
|
|
5119
5780
|
ref,
|
|
5120
5781
|
className: cn("px-screen flex items-end justify-between gap-3 py-3 pb-4", className),
|
|
5121
5782
|
...props,
|
|
5122
5783
|
children: [
|
|
5123
|
-
/* @__PURE__ */
|
|
5124
|
-
eyebrow && /* @__PURE__ */
|
|
5125
|
-
/* @__PURE__ */
|
|
5784
|
+
/* @__PURE__ */ jsxs57("div", { className: "min-w-0 flex-1", children: [
|
|
5785
|
+
eyebrow && /* @__PURE__ */ jsx65("div", { className: "text-m-eyebrow text-accent mb-[6px] font-mono tracking-wide uppercase", children: eyebrow }),
|
|
5786
|
+
/* @__PURE__ */ jsx65("h1", { className: "text-m-h1 m-0 truncate leading-tight font-medium tracking-tight", children: title })
|
|
5126
5787
|
] }),
|
|
5127
|
-
trailing && /* @__PURE__ */
|
|
5788
|
+
trailing && /* @__PURE__ */ jsx65("div", { className: "shrink-0", children: trailing })
|
|
5128
5789
|
]
|
|
5129
5790
|
}
|
|
5130
5791
|
);
|
|
@@ -5133,10 +5794,10 @@ LargeTitle.displayName = "LargeTitle";
|
|
|
5133
5794
|
|
|
5134
5795
|
// src/patterns/Menubar/Menubar.tsx
|
|
5135
5796
|
import * as RadixMenubar from "@radix-ui/react-menubar";
|
|
5136
|
-
import { forwardRef as
|
|
5137
|
-
import { jsx as
|
|
5138
|
-
var Menubar =
|
|
5139
|
-
return /* @__PURE__ */
|
|
5797
|
+
import { forwardRef as forwardRef64 } from "react";
|
|
5798
|
+
import { jsx as jsx66, jsxs as jsxs58 } from "react/jsx-runtime";
|
|
5799
|
+
var Menubar = forwardRef64(function Menubar2({ className, ...props }, ref) {
|
|
5800
|
+
return /* @__PURE__ */ jsx66(
|
|
5140
5801
|
RadixMenubar.Root,
|
|
5141
5802
|
{
|
|
5142
5803
|
ref,
|
|
@@ -5150,9 +5811,9 @@ var Menubar = forwardRef63(function Menubar2({ className, ...props }, ref) {
|
|
|
5150
5811
|
});
|
|
5151
5812
|
Menubar.displayName = "Menubar";
|
|
5152
5813
|
var MenubarMenu = RadixMenubar.Menu;
|
|
5153
|
-
var MenubarTrigger =
|
|
5814
|
+
var MenubarTrigger = forwardRef64(
|
|
5154
5815
|
function MenubarTrigger2({ className, ...props }, ref) {
|
|
5155
|
-
return /* @__PURE__ */
|
|
5816
|
+
return /* @__PURE__ */ jsx66(
|
|
5156
5817
|
RadixMenubar.Trigger,
|
|
5157
5818
|
{
|
|
5158
5819
|
ref,
|
|
@@ -5169,9 +5830,9 @@ var MenubarTrigger = forwardRef63(
|
|
|
5169
5830
|
}
|
|
5170
5831
|
);
|
|
5171
5832
|
MenubarTrigger.displayName = "MenubarTrigger";
|
|
5172
|
-
var MenubarContent =
|
|
5833
|
+
var MenubarContent = forwardRef64(
|
|
5173
5834
|
function MenubarContent2({ className, sideOffset = 6, align = "start", ...props }, ref) {
|
|
5174
|
-
return /* @__PURE__ */
|
|
5835
|
+
return /* @__PURE__ */ jsx66(RadixMenubar.Portal, { children: /* @__PURE__ */ jsx66(
|
|
5175
5836
|
RadixMenubar.Content,
|
|
5176
5837
|
{
|
|
5177
5838
|
ref,
|
|
@@ -5193,24 +5854,24 @@ var itemBase3 = cn(
|
|
|
5193
5854
|
"data-[highlighted]:bg-panel-2",
|
|
5194
5855
|
"data-[disabled]:opacity-40 data-[disabled]:cursor-not-allowed"
|
|
5195
5856
|
);
|
|
5196
|
-
var MenubarItem =
|
|
5197
|
-
return /* @__PURE__ */
|
|
5857
|
+
var MenubarItem = forwardRef64(function MenubarItem2({ trailing, destructive, className, children, ...props }, ref) {
|
|
5858
|
+
return /* @__PURE__ */ jsxs58(
|
|
5198
5859
|
RadixMenubar.Item,
|
|
5199
5860
|
{
|
|
5200
5861
|
ref,
|
|
5201
5862
|
className: cn(itemBase3, destructive ? "text-err" : "text-text", className),
|
|
5202
5863
|
...props,
|
|
5203
5864
|
children: [
|
|
5204
|
-
/* @__PURE__ */
|
|
5205
|
-
trailing && /* @__PURE__ */
|
|
5865
|
+
/* @__PURE__ */ jsx66("span", { className: "flex-1", children }),
|
|
5866
|
+
trailing && /* @__PURE__ */ jsx66("span", { className: "text-text-dim font-mono text-[10px]", children: trailing })
|
|
5206
5867
|
]
|
|
5207
5868
|
}
|
|
5208
5869
|
);
|
|
5209
5870
|
});
|
|
5210
5871
|
MenubarItem.displayName = "MenubarItem";
|
|
5211
|
-
var MenubarSeparator =
|
|
5872
|
+
var MenubarSeparator = forwardRef64(
|
|
5212
5873
|
function MenubarSeparator2({ className, ...props }, ref) {
|
|
5213
|
-
return /* @__PURE__ */
|
|
5874
|
+
return /* @__PURE__ */ jsx66(
|
|
5214
5875
|
RadixMenubar.Separator,
|
|
5215
5876
|
{
|
|
5216
5877
|
ref,
|
|
@@ -5225,22 +5886,22 @@ MenubarSeparator.displayName = "MenubarSeparator";
|
|
|
5225
5886
|
// src/patterns/NavBar/NavBar.tsx
|
|
5226
5887
|
import * as RadixNav from "@radix-ui/react-navigation-menu";
|
|
5227
5888
|
import {
|
|
5228
|
-
forwardRef as
|
|
5889
|
+
forwardRef as forwardRef66,
|
|
5229
5890
|
useCallback as useCallback14,
|
|
5230
5891
|
useEffect as useEffect15,
|
|
5231
|
-
useRef as
|
|
5232
|
-
useState as
|
|
5892
|
+
useRef as useRef13,
|
|
5893
|
+
useState as useState19
|
|
5233
5894
|
} from "react";
|
|
5234
5895
|
|
|
5235
5896
|
// src/patterns/Sidebar/Sidebar.tsx
|
|
5236
5897
|
import {
|
|
5237
|
-
forwardRef as
|
|
5898
|
+
forwardRef as forwardRef65,
|
|
5238
5899
|
useCallback as useCallback13,
|
|
5239
|
-
useState as
|
|
5900
|
+
useState as useState18
|
|
5240
5901
|
} from "react";
|
|
5241
|
-
import { Fragment as Fragment4, jsx as
|
|
5242
|
-
var Sidebar =
|
|
5243
|
-
return /* @__PURE__ */
|
|
5902
|
+
import { Fragment as Fragment4, jsx as jsx67, jsxs as jsxs59 } from "react/jsx-runtime";
|
|
5903
|
+
var Sidebar = forwardRef65(function Sidebar2({ width = 240, className, style, ...props }, ref) {
|
|
5904
|
+
return /* @__PURE__ */ jsx67(
|
|
5244
5905
|
"aside",
|
|
5245
5906
|
{
|
|
5246
5907
|
ref,
|
|
@@ -5254,12 +5915,12 @@ var Sidebar = forwardRef64(function Sidebar2({ width = 240, className, style, ..
|
|
|
5254
5915
|
);
|
|
5255
5916
|
});
|
|
5256
5917
|
Sidebar.displayName = "Sidebar";
|
|
5257
|
-
var NavItem =
|
|
5918
|
+
var NavItem = forwardRef65(
|
|
5258
5919
|
function NavItem2({ icon, label, active, badge, href, disabled, className, ...props }, ref) {
|
|
5259
|
-
const inner = /* @__PURE__ */
|
|
5260
|
-
icon && /* @__PURE__ */
|
|
5261
|
-
/* @__PURE__ */
|
|
5262
|
-
badge != null && /* @__PURE__ */
|
|
5920
|
+
const inner = /* @__PURE__ */ jsxs59(Fragment4, { children: [
|
|
5921
|
+
icon && /* @__PURE__ */ jsx67("span", { "aria-hidden": true, className: "w-[14px] text-center opacity-80", children: icon }),
|
|
5922
|
+
/* @__PURE__ */ jsx67("span", { className: "flex-1 truncate", children: label }),
|
|
5923
|
+
badge != null && /* @__PURE__ */ jsx67(
|
|
5263
5924
|
"span",
|
|
5264
5925
|
{
|
|
5265
5926
|
className: cn(
|
|
@@ -5280,7 +5941,7 @@ var NavItem = forwardRef64(
|
|
|
5280
5941
|
);
|
|
5281
5942
|
if (href) {
|
|
5282
5943
|
const anchorProps = props;
|
|
5283
|
-
return /* @__PURE__ */
|
|
5944
|
+
return /* @__PURE__ */ jsx67(
|
|
5284
5945
|
"a",
|
|
5285
5946
|
{
|
|
5286
5947
|
ref,
|
|
@@ -5294,7 +5955,7 @@ var NavItem = forwardRef64(
|
|
|
5294
5955
|
);
|
|
5295
5956
|
}
|
|
5296
5957
|
const buttonProps = props;
|
|
5297
|
-
return /* @__PURE__ */
|
|
5958
|
+
return /* @__PURE__ */ jsx67(
|
|
5298
5959
|
"button",
|
|
5299
5960
|
{
|
|
5300
5961
|
ref,
|
|
@@ -5309,7 +5970,7 @@ var NavItem = forwardRef64(
|
|
|
5309
5970
|
}
|
|
5310
5971
|
);
|
|
5311
5972
|
NavItem.displayName = "NavItem";
|
|
5312
|
-
var NavSection =
|
|
5973
|
+
var NavSection = forwardRef65(function NavSection2({
|
|
5313
5974
|
label,
|
|
5314
5975
|
icon,
|
|
5315
5976
|
action,
|
|
@@ -5323,7 +5984,7 @@ var NavSection = forwardRef64(function NavSection2({
|
|
|
5323
5984
|
...props
|
|
5324
5985
|
}, ref) {
|
|
5325
5986
|
const isControlled = open !== void 0;
|
|
5326
|
-
const [internalOpen, setInternalOpen] =
|
|
5987
|
+
const [internalOpen, setInternalOpen] = useState18(defaultOpen);
|
|
5327
5988
|
const isOpen = !collapsible || (isControlled ? open : internalOpen);
|
|
5328
5989
|
const toggle = useCallback13(() => {
|
|
5329
5990
|
const next = !isOpen;
|
|
@@ -5331,8 +5992,8 @@ var NavSection = forwardRef64(function NavSection2({
|
|
|
5331
5992
|
onOpenChange?.(next);
|
|
5332
5993
|
}, [isOpen, isControlled, onOpenChange]);
|
|
5333
5994
|
const eyebrowClass = "text-text-dim flex items-center gap-[6px] px-2 pt-2 font-mono text-[9px] tracking-[1.4px] uppercase";
|
|
5334
|
-
return /* @__PURE__ */
|
|
5335
|
-
collapsible ? /* @__PURE__ */
|
|
5995
|
+
return /* @__PURE__ */ jsxs59("div", { ref, className: cn("flex flex-col gap-1", className), ...props, children: [
|
|
5996
|
+
collapsible ? /* @__PURE__ */ jsxs59(
|
|
5336
5997
|
"button",
|
|
5337
5998
|
{
|
|
5338
5999
|
type: "button",
|
|
@@ -5345,18 +6006,18 @@ var NavSection = forwardRef64(function NavSection2({
|
|
|
5345
6006
|
"hover:text-text-muted"
|
|
5346
6007
|
),
|
|
5347
6008
|
children: [
|
|
5348
|
-
icon != null && /* @__PURE__ */
|
|
5349
|
-
/* @__PURE__ */
|
|
6009
|
+
icon != null && /* @__PURE__ */ jsx67("span", { "aria-hidden": true, className: "opacity-80", children: icon }),
|
|
6010
|
+
/* @__PURE__ */ jsx67("span", { className: "flex-1 text-left", children: label }),
|
|
5350
6011
|
action,
|
|
5351
|
-
/* @__PURE__ */
|
|
6012
|
+
/* @__PURE__ */ jsx67("span", { "aria-hidden": true, className: "text-[10px] opacity-70", children: isOpen ? "\u25BE" : "\u25B8" })
|
|
5352
6013
|
]
|
|
5353
6014
|
}
|
|
5354
|
-
) : /* @__PURE__ */
|
|
5355
|
-
icon != null && /* @__PURE__ */
|
|
5356
|
-
/* @__PURE__ */
|
|
6015
|
+
) : /* @__PURE__ */ jsxs59("div", { className: eyebrowClass, children: [
|
|
6016
|
+
icon != null && /* @__PURE__ */ jsx67("span", { "aria-hidden": true, className: "opacity-80", children: icon }),
|
|
6017
|
+
/* @__PURE__ */ jsx67("span", { className: "flex-1", children: label }),
|
|
5357
6018
|
action
|
|
5358
6019
|
] }),
|
|
5359
|
-
isOpen && /* @__PURE__ */
|
|
6020
|
+
isOpen && /* @__PURE__ */ jsx67(
|
|
5360
6021
|
"div",
|
|
5361
6022
|
{
|
|
5362
6023
|
className: cn("flex flex-col gap-[2px]", indent > 0 && "border-border ml-2 border-l"),
|
|
@@ -5369,12 +6030,12 @@ var NavSection = forwardRef64(function NavSection2({
|
|
|
5369
6030
|
NavSection.displayName = "NavSection";
|
|
5370
6031
|
|
|
5371
6032
|
// src/patterns/NavBar/NavBar.tsx
|
|
5372
|
-
import { Fragment as Fragment5, jsx as
|
|
6033
|
+
import { Fragment as Fragment5, jsx as jsx68, jsxs as jsxs60 } from "react/jsx-runtime";
|
|
5373
6034
|
function isActiveTree(item, activeId) {
|
|
5374
6035
|
if (item.id === activeId) return true;
|
|
5375
6036
|
return item.children?.some((c) => isActiveTree(c, activeId)) ?? false;
|
|
5376
6037
|
}
|
|
5377
|
-
var NavBar =
|
|
6038
|
+
var NavBar = forwardRef66(function NavBar2({
|
|
5378
6039
|
orientation = "horizontal",
|
|
5379
6040
|
items,
|
|
5380
6041
|
brand,
|
|
@@ -5388,9 +6049,9 @@ var NavBar = forwardRef65(function NavBar2({
|
|
|
5388
6049
|
...props
|
|
5389
6050
|
}, ref) {
|
|
5390
6051
|
const isControlled = value !== void 0;
|
|
5391
|
-
const [internalValue, setInternalValue] =
|
|
6052
|
+
const [internalValue, setInternalValue] = useState19(defaultValue);
|
|
5392
6053
|
const activeId = isControlled ? value : internalValue;
|
|
5393
|
-
const [drawerOpen, setDrawerOpen] =
|
|
6054
|
+
const [drawerOpen, setDrawerOpen] = useState19(false);
|
|
5394
6055
|
const select = useCallback14(
|
|
5395
6056
|
(id) => {
|
|
5396
6057
|
if (!isControlled) setInternalValue(id);
|
|
@@ -5410,7 +6071,7 @@ var NavBar = forwardRef65(function NavBar2({
|
|
|
5410
6071
|
// drawer is open on a viewport that's resizing past `md`, both navs can
|
|
5411
6072
|
// sit in the DOM together. Identical accessible names would trip axe's
|
|
5412
6073
|
// `landmark-unique` rule.
|
|
5413
|
-
/* @__PURE__ */
|
|
6074
|
+
/* @__PURE__ */ jsx68("nav", { "aria-label": "Mobile navigation", className: "flex flex-col gap-1", children: items.map((item) => /* @__PURE__ */ jsx68(
|
|
5414
6075
|
VerticalItem,
|
|
5415
6076
|
{
|
|
5416
6077
|
item,
|
|
@@ -5420,14 +6081,14 @@ var NavBar = forwardRef65(function NavBar2({
|
|
|
5420
6081
|
item.id
|
|
5421
6082
|
)) })
|
|
5422
6083
|
);
|
|
5423
|
-
const mobileBar = responsive ? /* @__PURE__ */
|
|
6084
|
+
const mobileBar = responsive ? /* @__PURE__ */ jsxs60(
|
|
5424
6085
|
"div",
|
|
5425
6086
|
{
|
|
5426
6087
|
className: cn(
|
|
5427
6088
|
"border-border bg-panel z-overlay sticky top-0 flex h-[52px] items-center gap-4 border-b px-5 md:hidden"
|
|
5428
6089
|
),
|
|
5429
6090
|
children: [
|
|
5430
|
-
/* @__PURE__ */
|
|
6091
|
+
/* @__PURE__ */ jsx68(
|
|
5431
6092
|
"button",
|
|
5432
6093
|
{
|
|
5433
6094
|
type: "button",
|
|
@@ -5437,15 +6098,15 @@ var NavBar = forwardRef65(function NavBar2({
|
|
|
5437
6098
|
children: "\u2630"
|
|
5438
6099
|
}
|
|
5439
6100
|
),
|
|
5440
|
-
brand && /* @__PURE__ */
|
|
5441
|
-
actions && /* @__PURE__ */
|
|
6101
|
+
brand && /* @__PURE__ */ jsx68("div", { className: "flex flex-1 items-center text-[13px] font-medium whitespace-nowrap", children: brand }),
|
|
6102
|
+
actions && /* @__PURE__ */ jsx68("div", { className: "flex items-center gap-3", children: actions })
|
|
5442
6103
|
]
|
|
5443
6104
|
}
|
|
5444
6105
|
) : null;
|
|
5445
6106
|
if (orientation === "horizontal") {
|
|
5446
|
-
return /* @__PURE__ */
|
|
6107
|
+
return /* @__PURE__ */ jsxs60(Fragment5, { children: [
|
|
5447
6108
|
mobileBar,
|
|
5448
|
-
/* @__PURE__ */
|
|
6109
|
+
/* @__PURE__ */ jsxs60(
|
|
5449
6110
|
"header",
|
|
5450
6111
|
{
|
|
5451
6112
|
ref,
|
|
@@ -5456,10 +6117,10 @@ var NavBar = forwardRef65(function NavBar2({
|
|
|
5456
6117
|
),
|
|
5457
6118
|
...props,
|
|
5458
6119
|
children: [
|
|
5459
|
-
brand && /* @__PURE__ */
|
|
5460
|
-
/* @__PURE__ */
|
|
5461
|
-
/* @__PURE__ */
|
|
5462
|
-
(item) => item.children?.length ? /* @__PURE__ */
|
|
6120
|
+
brand && /* @__PURE__ */ jsx68("div", { className: "shrink-0 text-[13px] font-medium whitespace-nowrap", children: brand }),
|
|
6121
|
+
/* @__PURE__ */ jsxs60(RadixNav.Root, { className: "relative flex-1", delayDuration: 120, children: [
|
|
6122
|
+
/* @__PURE__ */ jsx68(RadixNav.List, { className: "m-0! flex list-none! items-center gap-1 p-0! [&_li]:m-0!", children: items.map(
|
|
6123
|
+
(item) => item.children?.length ? /* @__PURE__ */ jsx68(
|
|
5463
6124
|
HorizontalDropdown,
|
|
5464
6125
|
{
|
|
5465
6126
|
item,
|
|
@@ -5468,7 +6129,7 @@ var NavBar = forwardRef65(function NavBar2({
|
|
|
5468
6129
|
onActivate: handleItemActivate
|
|
5469
6130
|
},
|
|
5470
6131
|
item.id
|
|
5471
|
-
) : /* @__PURE__ */
|
|
6132
|
+
) : /* @__PURE__ */ jsx68(RadixNav.Item, { children: /* @__PURE__ */ jsx68(
|
|
5472
6133
|
HorizontalLink,
|
|
5473
6134
|
{
|
|
5474
6135
|
item,
|
|
@@ -5477,13 +6138,13 @@ var NavBar = forwardRef65(function NavBar2({
|
|
|
5477
6138
|
}
|
|
5478
6139
|
) }, item.id)
|
|
5479
6140
|
) }),
|
|
5480
|
-
/* @__PURE__ */
|
|
6141
|
+
/* @__PURE__ */ jsx68("div", { className: "z-popover absolute top-full left-0 flex justify-start", children: /* @__PURE__ */ jsx68(RadixNav.Viewport, { className: "origin-top-left data-[state=open]:animate-[ship-fade-in_120ms_var(--easing-out)]" }) })
|
|
5481
6142
|
] }),
|
|
5482
|
-
actions && /* @__PURE__ */
|
|
6143
|
+
actions && /* @__PURE__ */ jsx68("div", { className: "flex items-center gap-3", children: actions })
|
|
5483
6144
|
]
|
|
5484
6145
|
}
|
|
5485
6146
|
),
|
|
5486
|
-
responsive && /* @__PURE__ */
|
|
6147
|
+
responsive && /* @__PURE__ */ jsx68(
|
|
5487
6148
|
Drawer,
|
|
5488
6149
|
{
|
|
5489
6150
|
open: drawerOpen,
|
|
@@ -5496,9 +6157,9 @@ var NavBar = forwardRef65(function NavBar2({
|
|
|
5496
6157
|
)
|
|
5497
6158
|
] });
|
|
5498
6159
|
}
|
|
5499
|
-
return /* @__PURE__ */
|
|
6160
|
+
return /* @__PURE__ */ jsxs60(Fragment5, { children: [
|
|
5500
6161
|
mobileBar,
|
|
5501
|
-
/* @__PURE__ */
|
|
6162
|
+
/* @__PURE__ */ jsxs60(
|
|
5502
6163
|
"aside",
|
|
5503
6164
|
{
|
|
5504
6165
|
ref,
|
|
@@ -5511,8 +6172,8 @@ var NavBar = forwardRef65(function NavBar2({
|
|
|
5511
6172
|
),
|
|
5512
6173
|
...props,
|
|
5513
6174
|
children: [
|
|
5514
|
-
brand && /* @__PURE__ */
|
|
5515
|
-
/* @__PURE__ */
|
|
6175
|
+
brand && /* @__PURE__ */ jsx68("div", { className: "px-2 py-1 text-[13px] font-medium", children: brand }),
|
|
6176
|
+
/* @__PURE__ */ jsx68("nav", { "aria-label": "Sidebar navigation", className: "flex flex-1 flex-col gap-1 overflow-y-auto", children: items.map((item) => /* @__PURE__ */ jsx68(
|
|
5516
6177
|
VerticalItem,
|
|
5517
6178
|
{
|
|
5518
6179
|
item,
|
|
@@ -5521,11 +6182,11 @@ var NavBar = forwardRef65(function NavBar2({
|
|
|
5521
6182
|
},
|
|
5522
6183
|
item.id
|
|
5523
6184
|
)) }),
|
|
5524
|
-
actions && /* @__PURE__ */
|
|
6185
|
+
actions && /* @__PURE__ */ jsx68("div", { className: "border-border mt-auto flex flex-col gap-2 border-t pt-3", children: actions })
|
|
5525
6186
|
]
|
|
5526
6187
|
}
|
|
5527
6188
|
),
|
|
5528
|
-
responsive && /* @__PURE__ */
|
|
6189
|
+
responsive && /* @__PURE__ */ jsx68(
|
|
5529
6190
|
Drawer,
|
|
5530
6191
|
{
|
|
5531
6192
|
open: drawerOpen,
|
|
@@ -5554,13 +6215,13 @@ function HorizontalLink({ item, active, onActivate }) {
|
|
|
5554
6215
|
}
|
|
5555
6216
|
onActivate(item.id);
|
|
5556
6217
|
};
|
|
5557
|
-
const inner = /* @__PURE__ */
|
|
5558
|
-
item.icon != null && /* @__PURE__ */
|
|
5559
|
-
/* @__PURE__ */
|
|
5560
|
-
item.badge != null && /* @__PURE__ */
|
|
6218
|
+
const inner = /* @__PURE__ */ jsxs60(Fragment5, { children: [
|
|
6219
|
+
item.icon != null && /* @__PURE__ */ jsx68("span", { "aria-hidden": true, className: "opacity-80", children: item.icon }),
|
|
6220
|
+
/* @__PURE__ */ jsx68("span", { children: item.label }),
|
|
6221
|
+
item.badge != null && /* @__PURE__ */ jsx68(ItemBadge, { active, children: item.badge })
|
|
5561
6222
|
] });
|
|
5562
6223
|
if (item.href) {
|
|
5563
|
-
return /* @__PURE__ */
|
|
6224
|
+
return /* @__PURE__ */ jsx68(RadixNav.Link, { asChild: true, active, children: /* @__PURE__ */ jsx68(
|
|
5564
6225
|
"a",
|
|
5565
6226
|
{
|
|
5566
6227
|
href: item.href,
|
|
@@ -5572,7 +6233,7 @@ function HorizontalLink({ item, active, onActivate }) {
|
|
|
5572
6233
|
}
|
|
5573
6234
|
) });
|
|
5574
6235
|
}
|
|
5575
|
-
return /* @__PURE__ */
|
|
6236
|
+
return /* @__PURE__ */ jsx68(RadixNav.Link, { asChild: true, active, children: /* @__PURE__ */ jsx68(
|
|
5576
6237
|
"button",
|
|
5577
6238
|
{
|
|
5578
6239
|
type: "button",
|
|
@@ -5585,8 +6246,8 @@ function HorizontalLink({ item, active, onActivate }) {
|
|
|
5585
6246
|
) });
|
|
5586
6247
|
}
|
|
5587
6248
|
function HorizontalDropdown({ item, active, activeId, onActivate }) {
|
|
5588
|
-
return /* @__PURE__ */
|
|
5589
|
-
/* @__PURE__ */
|
|
6249
|
+
return /* @__PURE__ */ jsxs60(RadixNav.Item, { children: [
|
|
6250
|
+
/* @__PURE__ */ jsxs60(
|
|
5590
6251
|
RadixNav.Trigger,
|
|
5591
6252
|
{
|
|
5592
6253
|
className: cn(
|
|
@@ -5598,9 +6259,9 @@ function HorizontalDropdown({ item, active, activeId, onActivate }) {
|
|
|
5598
6259
|
),
|
|
5599
6260
|
disabled: item.disabled,
|
|
5600
6261
|
children: [
|
|
5601
|
-
item.icon != null && /* @__PURE__ */
|
|
5602
|
-
/* @__PURE__ */
|
|
5603
|
-
/* @__PURE__ */
|
|
6262
|
+
item.icon != null && /* @__PURE__ */ jsx68("span", { "aria-hidden": true, className: "opacity-80", children: item.icon }),
|
|
6263
|
+
/* @__PURE__ */ jsx68("span", { children: item.label }),
|
|
6264
|
+
/* @__PURE__ */ jsx68(
|
|
5604
6265
|
"span",
|
|
5605
6266
|
{
|
|
5606
6267
|
"aria-hidden": true,
|
|
@@ -5611,7 +6272,7 @@ function HorizontalDropdown({ item, active, activeId, onActivate }) {
|
|
|
5611
6272
|
]
|
|
5612
6273
|
}
|
|
5613
6274
|
),
|
|
5614
|
-
/* @__PURE__ */
|
|
6275
|
+
/* @__PURE__ */ jsx68(RadixNav.Content, { className: "border-border bg-panel min-w-[220px] rounded-xs border p-2 shadow-lg", children: /* @__PURE__ */ jsx68("ul", { className: "m-0! flex list-none! flex-col gap-[2px] p-0! [&_li]:m-0!", children: item.children.map((child) => /* @__PURE__ */ jsx68("li", { children: /* @__PURE__ */ jsx68(DropdownLink, { item: child, active: child.id === activeId, onActivate }) }, child.id)) }) })
|
|
5615
6276
|
] });
|
|
5616
6277
|
}
|
|
5617
6278
|
function DropdownLink({ item, active, onActivate }) {
|
|
@@ -5628,13 +6289,13 @@ function DropdownLink({ item, active, onActivate }) {
|
|
|
5628
6289
|
}
|
|
5629
6290
|
onActivate(item.id);
|
|
5630
6291
|
};
|
|
5631
|
-
const inner = /* @__PURE__ */
|
|
5632
|
-
item.icon != null && /* @__PURE__ */
|
|
5633
|
-
/* @__PURE__ */
|
|
5634
|
-
item.badge != null && /* @__PURE__ */
|
|
6292
|
+
const inner = /* @__PURE__ */ jsxs60(Fragment5, { children: [
|
|
6293
|
+
item.icon != null && /* @__PURE__ */ jsx68("span", { "aria-hidden": true, className: "opacity-80", children: item.icon }),
|
|
6294
|
+
/* @__PURE__ */ jsx68("span", { className: "flex-1", children: item.label }),
|
|
6295
|
+
item.badge != null && /* @__PURE__ */ jsx68(ItemBadge, { active, children: item.badge })
|
|
5635
6296
|
] });
|
|
5636
6297
|
if (item.href) {
|
|
5637
|
-
return /* @__PURE__ */
|
|
6298
|
+
return /* @__PURE__ */ jsx68(RadixNav.Link, { asChild: true, active, children: /* @__PURE__ */ jsx68(
|
|
5638
6299
|
"a",
|
|
5639
6300
|
{
|
|
5640
6301
|
href: item.href,
|
|
@@ -5646,7 +6307,7 @@ function DropdownLink({ item, active, onActivate }) {
|
|
|
5646
6307
|
}
|
|
5647
6308
|
) });
|
|
5648
6309
|
}
|
|
5649
|
-
return /* @__PURE__ */
|
|
6310
|
+
return /* @__PURE__ */ jsx68(RadixNav.Link, { asChild: true, active, children: /* @__PURE__ */ jsx68(
|
|
5650
6311
|
"button",
|
|
5651
6312
|
{
|
|
5652
6313
|
type: "button",
|
|
@@ -5661,8 +6322,8 @@ function DropdownLink({ item, active, onActivate }) {
|
|
|
5661
6322
|
function VerticalItem({ item, activeId, onActivate }) {
|
|
5662
6323
|
const hasChildren = (item.children?.length ?? 0) > 0;
|
|
5663
6324
|
const treeActive = isActiveTree(item, activeId);
|
|
5664
|
-
const [open, setOpen] =
|
|
5665
|
-
const prevTreeActive =
|
|
6325
|
+
const [open, setOpen] = useState19(treeActive);
|
|
6326
|
+
const prevTreeActive = useRef13(treeActive);
|
|
5666
6327
|
useEffect15(() => {
|
|
5667
6328
|
if (treeActive && !prevTreeActive.current) setOpen(true);
|
|
5668
6329
|
prevTreeActive.current = treeActive;
|
|
@@ -5675,7 +6336,7 @@ function VerticalItem({ item, activeId, onActivate }) {
|
|
|
5675
6336
|
}
|
|
5676
6337
|
onActivate(item.id);
|
|
5677
6338
|
};
|
|
5678
|
-
return /* @__PURE__ */
|
|
6339
|
+
return /* @__PURE__ */ jsx68(
|
|
5679
6340
|
NavItem,
|
|
5680
6341
|
{
|
|
5681
6342
|
icon: item.icon,
|
|
@@ -5688,8 +6349,8 @@ function VerticalItem({ item, activeId, onActivate }) {
|
|
|
5688
6349
|
}
|
|
5689
6350
|
);
|
|
5690
6351
|
}
|
|
5691
|
-
return /* @__PURE__ */
|
|
5692
|
-
/* @__PURE__ */
|
|
6352
|
+
return /* @__PURE__ */ jsxs60("div", { className: "flex flex-col", children: [
|
|
6353
|
+
/* @__PURE__ */ jsxs60(
|
|
5693
6354
|
"button",
|
|
5694
6355
|
{
|
|
5695
6356
|
type: "button",
|
|
@@ -5705,18 +6366,18 @@ function VerticalItem({ item, activeId, onActivate }) {
|
|
|
5705
6366
|
item.disabled && "pointer-events-none opacity-50"
|
|
5706
6367
|
),
|
|
5707
6368
|
children: [
|
|
5708
|
-
item.icon != null && /* @__PURE__ */
|
|
5709
|
-
/* @__PURE__ */
|
|
5710
|
-
item.badge != null && /* @__PURE__ */
|
|
5711
|
-
/* @__PURE__ */
|
|
6369
|
+
item.icon != null && /* @__PURE__ */ jsx68("span", { "aria-hidden": true, className: "w-[14px] text-center opacity-80", children: item.icon }),
|
|
6370
|
+
/* @__PURE__ */ jsx68("span", { className: "flex-1 truncate", children: item.label }),
|
|
6371
|
+
item.badge != null && /* @__PURE__ */ jsx68(ItemBadge, { active: treeActive, children: item.badge }),
|
|
6372
|
+
/* @__PURE__ */ jsx68("span", { "aria-hidden": true, className: "text-[10px] opacity-60", children: open ? "\u25BE" : "\u25B8" })
|
|
5712
6373
|
]
|
|
5713
6374
|
}
|
|
5714
6375
|
),
|
|
5715
|
-
open && /* @__PURE__ */
|
|
6376
|
+
open && /* @__PURE__ */ jsx68("div", { className: "border-border mt-1 ml-[18px] flex flex-col gap-[2px] border-l pl-3", children: item.children.map((child) => /* @__PURE__ */ jsx68(VerticalItem, { item: child, activeId, onActivate }, child.id)) })
|
|
5716
6377
|
] });
|
|
5717
6378
|
}
|
|
5718
6379
|
function ItemBadge({ active, children }) {
|
|
5719
|
-
return /* @__PURE__ */
|
|
6380
|
+
return /* @__PURE__ */ jsx68(
|
|
5720
6381
|
"span",
|
|
5721
6382
|
{
|
|
5722
6383
|
className: cn(
|
|
@@ -5729,8 +6390,8 @@ function ItemBadge({ active, children }) {
|
|
|
5729
6390
|
}
|
|
5730
6391
|
|
|
5731
6392
|
// src/patterns/OnboardingChecklist/OnboardingChecklist.tsx
|
|
5732
|
-
import { forwardRef as
|
|
5733
|
-
import { Fragment as Fragment6, jsx as
|
|
6393
|
+
import { forwardRef as forwardRef67 } from "react";
|
|
6394
|
+
import { Fragment as Fragment6, jsx as jsx69, jsxs as jsxs61 } from "react/jsx-runtime";
|
|
5734
6395
|
var statusDot = {
|
|
5735
6396
|
pending: "off",
|
|
5736
6397
|
"in-progress": "sync",
|
|
@@ -5741,11 +6402,11 @@ var labelStateClass = {
|
|
|
5741
6402
|
"in-progress": "text-text",
|
|
5742
6403
|
done: "text-text-dim line-through"
|
|
5743
6404
|
};
|
|
5744
|
-
var OnboardingChecklist =
|
|
6405
|
+
var OnboardingChecklist = forwardRef67(
|
|
5745
6406
|
function OnboardingChecklist2({ items, onItemClick, title = "Get started", progressLabel, hideProgress, className, ...props }, ref) {
|
|
5746
6407
|
const total = items.length;
|
|
5747
6408
|
const done = items.filter((i) => i.status === "done").length;
|
|
5748
|
-
return /* @__PURE__ */
|
|
6409
|
+
return /* @__PURE__ */ jsxs61(
|
|
5749
6410
|
"section",
|
|
5750
6411
|
{
|
|
5751
6412
|
ref,
|
|
@@ -5756,11 +6417,11 @@ var OnboardingChecklist = forwardRef66(
|
|
|
5756
6417
|
),
|
|
5757
6418
|
...props,
|
|
5758
6419
|
children: [
|
|
5759
|
-
/* @__PURE__ */
|
|
5760
|
-
/* @__PURE__ */
|
|
5761
|
-
/* @__PURE__ */
|
|
6420
|
+
/* @__PURE__ */ jsxs61("header", { className: "flex items-center gap-2", children: [
|
|
6421
|
+
/* @__PURE__ */ jsx69("span", { className: "text-[14px] font-medium", children: title }),
|
|
6422
|
+
/* @__PURE__ */ jsx69("span", { className: "text-text-dim ml-auto font-mono text-[11px] tabular-nums", children: progressLabel ?? `${done} of ${total} complete` })
|
|
5762
6423
|
] }),
|
|
5763
|
-
!hideProgress && total > 0 && /* @__PURE__ */
|
|
6424
|
+
!hideProgress && total > 0 && /* @__PURE__ */ jsx69(
|
|
5764
6425
|
"div",
|
|
5765
6426
|
{
|
|
5766
6427
|
role: "progressbar",
|
|
@@ -5769,7 +6430,7 @@ var OnboardingChecklist = forwardRef66(
|
|
|
5769
6430
|
"aria-valuenow": done,
|
|
5770
6431
|
"aria-label": typeof title === "string" ? `${title} progress` : "Setup progress",
|
|
5771
6432
|
className: "bg-panel-2 h-[3px] w-full overflow-hidden rounded-full",
|
|
5772
|
-
children: /* @__PURE__ */
|
|
6433
|
+
children: /* @__PURE__ */ jsx69(
|
|
5773
6434
|
"span",
|
|
5774
6435
|
{
|
|
5775
6436
|
"aria-hidden": true,
|
|
@@ -5782,10 +6443,10 @@ var OnboardingChecklist = forwardRef66(
|
|
|
5782
6443
|
)
|
|
5783
6444
|
}
|
|
5784
6445
|
),
|
|
5785
|
-
/* @__PURE__ */
|
|
6446
|
+
/* @__PURE__ */ jsx69("ul", { className: "m-0 flex list-none flex-col gap-1 p-0", children: items.map((item) => {
|
|
5786
6447
|
const interactive = typeof onItemClick === "function";
|
|
5787
|
-
const labelBlock = /* @__PURE__ */
|
|
5788
|
-
/* @__PURE__ */
|
|
6448
|
+
const labelBlock = /* @__PURE__ */ jsxs61(Fragment6, { children: [
|
|
6449
|
+
/* @__PURE__ */ jsx69(
|
|
5789
6450
|
StatusDot,
|
|
5790
6451
|
{
|
|
5791
6452
|
state: statusDot[item.status],
|
|
@@ -5794,17 +6455,17 @@ var OnboardingChecklist = forwardRef66(
|
|
|
5794
6455
|
className: "mt-[3px]"
|
|
5795
6456
|
}
|
|
5796
6457
|
),
|
|
5797
|
-
/* @__PURE__ */
|
|
5798
|
-
/* @__PURE__ */
|
|
5799
|
-
item.description && /* @__PURE__ */
|
|
6458
|
+
/* @__PURE__ */ jsxs61("div", { className: "flex min-w-0 flex-1 flex-col gap-[2px]", children: [
|
|
6459
|
+
/* @__PURE__ */ jsx69("span", { className: cn("text-[13px]", labelStateClass[item.status]), children: item.label }),
|
|
6460
|
+
item.description && /* @__PURE__ */ jsx69("span", { className: "text-text-muted text-[12px] leading-[1.45]", children: item.description })
|
|
5800
6461
|
] })
|
|
5801
6462
|
] });
|
|
5802
6463
|
const labelRegionClass = cn(
|
|
5803
6464
|
"flex flex-1 items-start gap-3 rounded-md px-2 py-2 text-left transition-colors duration-(--duration-micro)",
|
|
5804
6465
|
interactive && "cursor-pointer outline-none hover:bg-panel-2 focus-visible:ring-[3px] focus-visible:ring-accent-dim"
|
|
5805
6466
|
);
|
|
5806
|
-
return /* @__PURE__ */
|
|
5807
|
-
interactive ? /* @__PURE__ */
|
|
6467
|
+
return /* @__PURE__ */ jsxs61("li", { className: "flex items-start gap-2", children: [
|
|
6468
|
+
interactive ? /* @__PURE__ */ jsx69(
|
|
5808
6469
|
"button",
|
|
5809
6470
|
{
|
|
5810
6471
|
type: "button",
|
|
@@ -5813,8 +6474,8 @@ var OnboardingChecklist = forwardRef66(
|
|
|
5813
6474
|
className: labelRegionClass,
|
|
5814
6475
|
children: labelBlock
|
|
5815
6476
|
}
|
|
5816
|
-
) : /* @__PURE__ */
|
|
5817
|
-
item.action && /* @__PURE__ */
|
|
6477
|
+
) : /* @__PURE__ */ jsx69("div", { className: labelRegionClass, children: labelBlock }),
|
|
6478
|
+
item.action && /* @__PURE__ */ jsx69("div", { className: "shrink-0 self-center", children: item.action })
|
|
5818
6479
|
] }, item.id);
|
|
5819
6480
|
}) })
|
|
5820
6481
|
]
|
|
@@ -5825,8 +6486,8 @@ var OnboardingChecklist = forwardRef66(
|
|
|
5825
6486
|
OnboardingChecklist.displayName = "OnboardingChecklist";
|
|
5826
6487
|
|
|
5827
6488
|
// src/patterns/Pagination/Pagination.tsx
|
|
5828
|
-
import { forwardRef as
|
|
5829
|
-
import { jsx as
|
|
6489
|
+
import { forwardRef as forwardRef68 } from "react";
|
|
6490
|
+
import { jsx as jsx70, jsxs as jsxs62 } from "react/jsx-runtime";
|
|
5830
6491
|
function buildRange(page, total, siblings) {
|
|
5831
6492
|
if (total <= 0) return [];
|
|
5832
6493
|
const items = [];
|
|
@@ -5839,9 +6500,9 @@ function buildRange(page, total, siblings) {
|
|
|
5839
6500
|
if (total > 1) items.push(total);
|
|
5840
6501
|
return items;
|
|
5841
6502
|
}
|
|
5842
|
-
var Pagination =
|
|
6503
|
+
var Pagination = forwardRef68(function Pagination2({ page, total, onPageChange, siblings = 1, className, ...props }, ref) {
|
|
5843
6504
|
const items = buildRange(page, total, siblings);
|
|
5844
|
-
return /* @__PURE__ */
|
|
6505
|
+
return /* @__PURE__ */ jsxs62(
|
|
5845
6506
|
"nav",
|
|
5846
6507
|
{
|
|
5847
6508
|
ref,
|
|
@@ -5849,7 +6510,7 @@ var Pagination = forwardRef67(function Pagination2({ page, total, onPageChange,
|
|
|
5849
6510
|
className: cn("inline-flex items-center gap-1", className),
|
|
5850
6511
|
...props,
|
|
5851
6512
|
children: [
|
|
5852
|
-
/* @__PURE__ */
|
|
6513
|
+
/* @__PURE__ */ jsx70(
|
|
5853
6514
|
IconButton,
|
|
5854
6515
|
{
|
|
5855
6516
|
size: "sm",
|
|
@@ -5862,7 +6523,7 @@ var Pagination = forwardRef67(function Pagination2({ page, total, onPageChange,
|
|
|
5862
6523
|
),
|
|
5863
6524
|
items.map((item, i) => {
|
|
5864
6525
|
if (item === "start-ellipsis" || item === "end-ellipsis") {
|
|
5865
|
-
return /* @__PURE__ */
|
|
6526
|
+
return /* @__PURE__ */ jsx70(
|
|
5866
6527
|
"span",
|
|
5867
6528
|
{
|
|
5868
6529
|
"aria-hidden": true,
|
|
@@ -5873,7 +6534,7 @@ var Pagination = forwardRef67(function Pagination2({ page, total, onPageChange,
|
|
|
5873
6534
|
);
|
|
5874
6535
|
}
|
|
5875
6536
|
const isActive = item === page;
|
|
5876
|
-
return /* @__PURE__ */
|
|
6537
|
+
return /* @__PURE__ */ jsx70(
|
|
5877
6538
|
"button",
|
|
5878
6539
|
{
|
|
5879
6540
|
type: "button",
|
|
@@ -5891,7 +6552,7 @@ var Pagination = forwardRef67(function Pagination2({ page, total, onPageChange,
|
|
|
5891
6552
|
item
|
|
5892
6553
|
);
|
|
5893
6554
|
}),
|
|
5894
|
-
/* @__PURE__ */
|
|
6555
|
+
/* @__PURE__ */ jsx70(
|
|
5895
6556
|
IconButton,
|
|
5896
6557
|
{
|
|
5897
6558
|
size: "sm",
|
|
@@ -5909,10 +6570,10 @@ var Pagination = forwardRef67(function Pagination2({ page, total, onPageChange,
|
|
|
5909
6570
|
Pagination.displayName = "Pagination";
|
|
5910
6571
|
|
|
5911
6572
|
// src/patterns/Progress/Progress.tsx
|
|
5912
|
-
import { cva as
|
|
5913
|
-
import { forwardRef as
|
|
5914
|
-
import { jsx as
|
|
5915
|
-
var trackStyles =
|
|
6573
|
+
import { cva as cva13 } from "class-variance-authority";
|
|
6574
|
+
import { forwardRef as forwardRef69 } from "react";
|
|
6575
|
+
import { jsx as jsx71, jsxs as jsxs63 } from "react/jsx-runtime";
|
|
6576
|
+
var trackStyles = cva13("w-full rounded-full bg-panel-2 overflow-hidden", {
|
|
5916
6577
|
variants: {
|
|
5917
6578
|
size: {
|
|
5918
6579
|
sm: "h-[3px]",
|
|
@@ -5922,7 +6583,7 @@ var trackStyles = cva12("w-full rounded-full bg-panel-2 overflow-hidden", {
|
|
|
5922
6583
|
},
|
|
5923
6584
|
defaultVariants: { size: "md" }
|
|
5924
6585
|
});
|
|
5925
|
-
var fillStyles =
|
|
6586
|
+
var fillStyles = cva13("h-full rounded-full transition-[width] duration-(--duration-step)", {
|
|
5926
6587
|
variants: {
|
|
5927
6588
|
tone: {
|
|
5928
6589
|
accent: "bg-accent",
|
|
@@ -5933,7 +6594,7 @@ var fillStyles = cva12("h-full rounded-full transition-[width] duration-(--durat
|
|
|
5933
6594
|
},
|
|
5934
6595
|
defaultVariants: { tone: "accent" }
|
|
5935
6596
|
});
|
|
5936
|
-
var Progress =
|
|
6597
|
+
var Progress = forwardRef69(function Progress2({
|
|
5937
6598
|
value = 0,
|
|
5938
6599
|
max = 100,
|
|
5939
6600
|
indeterminate = false,
|
|
@@ -5947,15 +6608,15 @@ var Progress = forwardRef68(function Progress2({
|
|
|
5947
6608
|
const clamped = Math.min(max, Math.max(0, value));
|
|
5948
6609
|
const pct = max > 0 ? clamped / max * 100 : 0;
|
|
5949
6610
|
const display = Math.round(pct);
|
|
5950
|
-
return /* @__PURE__ */
|
|
5951
|
-
label != null && /* @__PURE__ */
|
|
5952
|
-
/* @__PURE__ */
|
|
5953
|
-
showValue && !indeterminate && /* @__PURE__ */
|
|
6611
|
+
return /* @__PURE__ */ jsxs63("div", { ref, className: cn("flex w-full flex-col gap-2", className), ...props, children: [
|
|
6612
|
+
label != null && /* @__PURE__ */ jsxs63("div", { className: "flex text-[12px]", children: [
|
|
6613
|
+
/* @__PURE__ */ jsx71("span", { className: "text-text-muted", children: label }),
|
|
6614
|
+
showValue && !indeterminate && /* @__PURE__ */ jsxs63("span", { className: "text-text ml-auto font-mono tabular-nums", children: [
|
|
5954
6615
|
display,
|
|
5955
6616
|
"%"
|
|
5956
6617
|
] })
|
|
5957
6618
|
] }),
|
|
5958
|
-
/* @__PURE__ */
|
|
6619
|
+
/* @__PURE__ */ jsx71(
|
|
5959
6620
|
"div",
|
|
5960
6621
|
{
|
|
5961
6622
|
role: "progressbar",
|
|
@@ -5964,7 +6625,7 @@ var Progress = forwardRef68(function Progress2({
|
|
|
5964
6625
|
"aria-valuenow": indeterminate ? void 0 : display,
|
|
5965
6626
|
"aria-label": typeof label === "string" ? label : void 0,
|
|
5966
6627
|
className: trackStyles({ size }),
|
|
5967
|
-
children: indeterminate ? /* @__PURE__ */
|
|
6628
|
+
children: indeterminate ? /* @__PURE__ */ jsx71(
|
|
5968
6629
|
"span",
|
|
5969
6630
|
{
|
|
5970
6631
|
"aria-hidden": true,
|
|
@@ -5974,7 +6635,7 @@ var Progress = forwardRef68(function Progress2({
|
|
|
5974
6635
|
"animate-[ship-indeterminate_1.4s_linear_infinite]"
|
|
5975
6636
|
)
|
|
5976
6637
|
}
|
|
5977
|
-
) : /* @__PURE__ */
|
|
6638
|
+
) : /* @__PURE__ */ jsx71("span", { "aria-hidden": true, className: fillStyles({ tone }), style: { width: `${pct}%` } })
|
|
5978
6639
|
}
|
|
5979
6640
|
)
|
|
5980
6641
|
] });
|
|
@@ -5982,18 +6643,18 @@ var Progress = forwardRef68(function Progress2({
|
|
|
5982
6643
|
Progress.displayName = "Progress";
|
|
5983
6644
|
|
|
5984
6645
|
// src/patterns/PullToRefresh/PullToRefresh.tsx
|
|
5985
|
-
import { forwardRef as
|
|
5986
|
-
import { jsx as
|
|
6646
|
+
import { forwardRef as forwardRef70 } from "react";
|
|
6647
|
+
import { jsx as jsx72, jsxs as jsxs64 } from "react/jsx-runtime";
|
|
5987
6648
|
var labels = {
|
|
5988
6649
|
idle: "Pull to refresh",
|
|
5989
6650
|
pulling: "Pull to refresh",
|
|
5990
6651
|
ready: "Release to refresh",
|
|
5991
6652
|
loading: "Refreshing\u2026"
|
|
5992
6653
|
};
|
|
5993
|
-
var PullToRefresh =
|
|
6654
|
+
var PullToRefresh = forwardRef70(function PullToRefresh2({ state = "idle", label, className, ...props }, ref) {
|
|
5994
6655
|
const isLoading = state === "loading";
|
|
5995
6656
|
const transform = state === "ready" ? "rotate(180deg)" : state === "pulling" ? "rotate(90deg)" : "rotate(0deg)";
|
|
5996
|
-
return /* @__PURE__ */
|
|
6657
|
+
return /* @__PURE__ */ jsxs64(
|
|
5997
6658
|
"div",
|
|
5998
6659
|
{
|
|
5999
6660
|
ref,
|
|
@@ -6003,7 +6664,7 @@ var PullToRefresh = forwardRef69(function PullToRefresh2({ state = "idle", label
|
|
|
6003
6664
|
className: cn("text-text-muted flex flex-col items-center gap-[6px] py-3", className),
|
|
6004
6665
|
...props,
|
|
6005
6666
|
children: [
|
|
6006
|
-
/* @__PURE__ */
|
|
6667
|
+
/* @__PURE__ */ jsx72(
|
|
6007
6668
|
"div",
|
|
6008
6669
|
{
|
|
6009
6670
|
"aria-hidden": true,
|
|
@@ -6019,7 +6680,7 @@ var PullToRefresh = forwardRef69(function PullToRefresh2({ state = "idle", label
|
|
|
6019
6680
|
}
|
|
6020
6681
|
}
|
|
6021
6682
|
),
|
|
6022
|
-
/* @__PURE__ */
|
|
6683
|
+
/* @__PURE__ */ jsx72("span", { className: "text-m-eyebrow font-mono tracking-wide uppercase", children: label ?? labels[state] })
|
|
6023
6684
|
]
|
|
6024
6685
|
}
|
|
6025
6686
|
);
|
|
@@ -6027,8 +6688,8 @@ var PullToRefresh = forwardRef69(function PullToRefresh2({ state = "idle", label
|
|
|
6027
6688
|
PullToRefresh.displayName = "PullToRefresh";
|
|
6028
6689
|
|
|
6029
6690
|
// src/patterns/Sparkline/Sparkline.tsx
|
|
6030
|
-
import { forwardRef as
|
|
6031
|
-
import { jsx as
|
|
6691
|
+
import { forwardRef as forwardRef71, useMemo as useMemo6 } from "react";
|
|
6692
|
+
import { jsx as jsx73, jsxs as jsxs65 } from "react/jsx-runtime";
|
|
6032
6693
|
function buildPath(values, w, h) {
|
|
6033
6694
|
if (values.length === 0) return { line: "", area: "" };
|
|
6034
6695
|
const pad = 2;
|
|
@@ -6047,7 +6708,7 @@ function buildPath(values, w, h) {
|
|
|
6047
6708
|
)} L${pad.toFixed(2)},${(h - pad).toFixed(2)} Z`;
|
|
6048
6709
|
return { line, area };
|
|
6049
6710
|
}
|
|
6050
|
-
var Sparkline =
|
|
6711
|
+
var Sparkline = forwardRef71(function Sparkline2({
|
|
6051
6712
|
values,
|
|
6052
6713
|
width = 160,
|
|
6053
6714
|
height = 32,
|
|
@@ -6059,7 +6720,7 @@ var Sparkline = forwardRef70(function Sparkline2({
|
|
|
6059
6720
|
...props
|
|
6060
6721
|
}, ref) {
|
|
6061
6722
|
const { line, area } = useMemo6(() => buildPath(values, width, height), [values, width, height]);
|
|
6062
|
-
return /* @__PURE__ */
|
|
6723
|
+
return /* @__PURE__ */ jsxs65(
|
|
6063
6724
|
"svg",
|
|
6064
6725
|
{
|
|
6065
6726
|
ref,
|
|
@@ -6071,8 +6732,8 @@ var Sparkline = forwardRef70(function Sparkline2({
|
|
|
6071
6732
|
className: cn("inline-block", className),
|
|
6072
6733
|
...props,
|
|
6073
6734
|
children: [
|
|
6074
|
-
fill && /* @__PURE__ */
|
|
6075
|
-
/* @__PURE__ */
|
|
6735
|
+
fill && /* @__PURE__ */ jsx73("path", { d: area, fill: stroke, fillOpacity: 0.16, stroke: "none" }),
|
|
6736
|
+
/* @__PURE__ */ jsx73(
|
|
6076
6737
|
"path",
|
|
6077
6738
|
{
|
|
6078
6739
|
d: line,
|
|
@@ -6090,16 +6751,16 @@ var Sparkline = forwardRef70(function Sparkline2({
|
|
|
6090
6751
|
Sparkline.displayName = "Sparkline";
|
|
6091
6752
|
|
|
6092
6753
|
// src/patterns/Spinner/Spinner.tsx
|
|
6093
|
-
import { forwardRef as
|
|
6094
|
-
import { jsx as
|
|
6754
|
+
import { forwardRef as forwardRef72 } from "react";
|
|
6755
|
+
import { jsx as jsx74 } from "react/jsx-runtime";
|
|
6095
6756
|
var sizes = {
|
|
6096
6757
|
sm: { box: "h-3 w-3", border: "border-[2px]" },
|
|
6097
6758
|
md: { box: "h-4 w-4", border: "border-[2px]" },
|
|
6098
6759
|
lg: { box: "h-5 w-5", border: "border-[2px]" }
|
|
6099
6760
|
};
|
|
6100
|
-
var Spinner2 =
|
|
6761
|
+
var Spinner2 = forwardRef72(function Spinner3({ size = "md", label = "Loading", className, ...props }, ref) {
|
|
6101
6762
|
const s = sizes[size];
|
|
6102
|
-
return /* @__PURE__ */
|
|
6763
|
+
return /* @__PURE__ */ jsx74(
|
|
6103
6764
|
"span",
|
|
6104
6765
|
{
|
|
6105
6766
|
ref,
|
|
@@ -6107,7 +6768,7 @@ var Spinner2 = forwardRef71(function Spinner3({ size = "md", label = "Loading",
|
|
|
6107
6768
|
"aria-label": label,
|
|
6108
6769
|
className: cn("inline-block", className),
|
|
6109
6770
|
...props,
|
|
6110
|
-
children: /* @__PURE__ */
|
|
6771
|
+
children: /* @__PURE__ */ jsx74(
|
|
6111
6772
|
"span",
|
|
6112
6773
|
{
|
|
6113
6774
|
"aria-hidden": true,
|
|
@@ -6124,8 +6785,8 @@ var Spinner2 = forwardRef71(function Spinner3({ size = "md", label = "Loading",
|
|
|
6124
6785
|
Spinner2.displayName = "Spinner";
|
|
6125
6786
|
|
|
6126
6787
|
// src/patterns/Stepper/Stepper.tsx
|
|
6127
|
-
import { forwardRef as
|
|
6128
|
-
import { jsx as
|
|
6788
|
+
import { forwardRef as forwardRef73, Fragment as Fragment7 } from "react";
|
|
6789
|
+
import { jsx as jsx75, jsxs as jsxs66 } from "react/jsx-runtime";
|
|
6129
6790
|
var dotBase = "h-6 w-6 rounded-full grid place-items-center text-[11px] font-mono font-semibold border";
|
|
6130
6791
|
var dotStateClass = {
|
|
6131
6792
|
done: "bg-accent text-on-accent border-accent",
|
|
@@ -6142,8 +6803,8 @@ function stateFor(index, current) {
|
|
|
6142
6803
|
if (index === current) return "current";
|
|
6143
6804
|
return "upcoming";
|
|
6144
6805
|
}
|
|
6145
|
-
var Stepper =
|
|
6146
|
-
return /* @__PURE__ */
|
|
6806
|
+
var Stepper = forwardRef73(function Stepper2({ steps, current, className, ...props }, ref) {
|
|
6807
|
+
return /* @__PURE__ */ jsx75(
|
|
6147
6808
|
"ol",
|
|
6148
6809
|
{
|
|
6149
6810
|
ref,
|
|
@@ -6155,19 +6816,19 @@ var Stepper = forwardRef72(function Stepper2({ steps, current, className, ...pro
|
|
|
6155
6816
|
const id = typeof step === "string" ? void 0 : step.id;
|
|
6156
6817
|
const state = stateFor(i, current);
|
|
6157
6818
|
const connectorActive = i < current;
|
|
6158
|
-
return /* @__PURE__ */
|
|
6159
|
-
/* @__PURE__ */
|
|
6819
|
+
return /* @__PURE__ */ jsxs66(Fragment7, { children: [
|
|
6820
|
+
/* @__PURE__ */ jsxs66(
|
|
6160
6821
|
"li",
|
|
6161
6822
|
{
|
|
6162
6823
|
"aria-current": state === "current" ? "step" : void 0,
|
|
6163
6824
|
className: "flex items-center gap-2",
|
|
6164
6825
|
children: [
|
|
6165
|
-
/* @__PURE__ */
|
|
6166
|
-
/* @__PURE__ */
|
|
6826
|
+
/* @__PURE__ */ jsx75("span", { "aria-hidden": true, className: cn(dotBase, dotStateClass[state]), children: state === "done" ? "\u2713" : i + 1 }),
|
|
6827
|
+
/* @__PURE__ */ jsx75("span", { className: cn("text-[12px]", labelStateClass2[state]), children: label })
|
|
6167
6828
|
]
|
|
6168
6829
|
}
|
|
6169
6830
|
),
|
|
6170
|
-
i < steps.length - 1 && /* @__PURE__ */
|
|
6831
|
+
i < steps.length - 1 && /* @__PURE__ */ jsx75(
|
|
6171
6832
|
"span",
|
|
6172
6833
|
{
|
|
6173
6834
|
"aria-hidden": true,
|
|
@@ -6183,14 +6844,14 @@ Stepper.displayName = "Stepper";
|
|
|
6183
6844
|
|
|
6184
6845
|
// src/patterns/TabBar/TabBar.tsx
|
|
6185
6846
|
import {
|
|
6186
|
-
forwardRef as
|
|
6847
|
+
forwardRef as forwardRef74,
|
|
6187
6848
|
useCallback as useCallback15,
|
|
6188
|
-
useState as
|
|
6849
|
+
useState as useState20
|
|
6189
6850
|
} from "react";
|
|
6190
|
-
import { jsx as
|
|
6191
|
-
var TabBar =
|
|
6851
|
+
import { jsx as jsx76, jsxs as jsxs67 } from "react/jsx-runtime";
|
|
6852
|
+
var TabBar = forwardRef74(function TabBar2({ items, value, defaultValue, onValueChange, className, ...props }, ref) {
|
|
6192
6853
|
const isControlled = value !== void 0;
|
|
6193
|
-
const [internalValue, setInternalValue] =
|
|
6854
|
+
const [internalValue, setInternalValue] = useState20(defaultValue);
|
|
6194
6855
|
const activeId = isControlled ? value : internalValue;
|
|
6195
6856
|
const handleSelect = useCallback15(
|
|
6196
6857
|
(id, e) => {
|
|
@@ -6200,7 +6861,7 @@ var TabBar = forwardRef73(function TabBar2({ items, value, defaultValue, onValue
|
|
|
6200
6861
|
},
|
|
6201
6862
|
[isControlled, onValueChange]
|
|
6202
6863
|
);
|
|
6203
|
-
return /* @__PURE__ */
|
|
6864
|
+
return /* @__PURE__ */ jsx76(
|
|
6204
6865
|
"nav",
|
|
6205
6866
|
{
|
|
6206
6867
|
ref,
|
|
@@ -6215,7 +6876,7 @@ var TabBar = forwardRef73(function TabBar2({ items, value, defaultValue, onValue
|
|
|
6215
6876
|
children: items.map((item) => {
|
|
6216
6877
|
const isActive = item.id === activeId;
|
|
6217
6878
|
if (item.elevated) {
|
|
6218
|
-
return /* @__PURE__ */
|
|
6879
|
+
return /* @__PURE__ */ jsx76("div", { className: "grid place-items-center", children: /* @__PURE__ */ jsxs67(
|
|
6219
6880
|
"button",
|
|
6220
6881
|
{
|
|
6221
6882
|
type: "button",
|
|
@@ -6231,13 +6892,13 @@ var TabBar = forwardRef73(function TabBar2({ items, value, defaultValue, onValue
|
|
|
6231
6892
|
"disabled:cursor-not-allowed disabled:opacity-40"
|
|
6232
6893
|
),
|
|
6233
6894
|
children: [
|
|
6234
|
-
/* @__PURE__ */
|
|
6235
|
-
/* @__PURE__ */
|
|
6895
|
+
/* @__PURE__ */ jsx76("span", { "aria-hidden": true, children: item.icon }),
|
|
6896
|
+
/* @__PURE__ */ jsx76("span", { className: "sr-only", children: item.label })
|
|
6236
6897
|
]
|
|
6237
6898
|
}
|
|
6238
6899
|
) }, item.id);
|
|
6239
6900
|
}
|
|
6240
|
-
return /* @__PURE__ */
|
|
6901
|
+
return /* @__PURE__ */ jsxs67(
|
|
6241
6902
|
"button",
|
|
6242
6903
|
{
|
|
6243
6904
|
type: "button",
|
|
@@ -6252,9 +6913,9 @@ var TabBar = forwardRef73(function TabBar2({ items, value, defaultValue, onValue
|
|
|
6252
6913
|
isActive ? "text-accent-text" : "text-text-muted hover:text-text"
|
|
6253
6914
|
),
|
|
6254
6915
|
children: [
|
|
6255
|
-
/* @__PURE__ */
|
|
6916
|
+
/* @__PURE__ */ jsxs67("span", { className: "relative inline-flex", "aria-hidden": true, children: [
|
|
6256
6917
|
item.icon,
|
|
6257
|
-
item.badge != null && /* @__PURE__ */
|
|
6918
|
+
item.badge != null && /* @__PURE__ */ jsx76(
|
|
6258
6919
|
"span",
|
|
6259
6920
|
{
|
|
6260
6921
|
className: cn(
|
|
@@ -6265,9 +6926,9 @@ var TabBar = forwardRef73(function TabBar2({ items, value, defaultValue, onValue
|
|
|
6265
6926
|
}
|
|
6266
6927
|
)
|
|
6267
6928
|
] }),
|
|
6268
|
-
/* @__PURE__ */
|
|
6929
|
+
/* @__PURE__ */ jsxs67("span", { className: "text-[10px] font-medium tracking-tight", children: [
|
|
6269
6930
|
item.label,
|
|
6270
|
-
item.badge != null && /* @__PURE__ */
|
|
6931
|
+
item.badge != null && /* @__PURE__ */ jsxs67("span", { className: "sr-only", children: [
|
|
6271
6932
|
", ",
|
|
6272
6933
|
item.badge,
|
|
6273
6934
|
" unread"
|
|
@@ -6285,11 +6946,11 @@ TabBar.displayName = "TabBar";
|
|
|
6285
6946
|
|
|
6286
6947
|
// src/patterns/Tabs/Tabs.tsx
|
|
6287
6948
|
import * as RadixTabs from "@radix-ui/react-tabs";
|
|
6288
|
-
import { cva as
|
|
6289
|
-
import { createContext as createContext2, forwardRef as
|
|
6290
|
-
import { jsx as
|
|
6949
|
+
import { cva as cva14 } from "class-variance-authority";
|
|
6950
|
+
import { createContext as createContext2, forwardRef as forwardRef75, useContext as useContext2 } from "react";
|
|
6951
|
+
import { jsx as jsx77 } from "react/jsx-runtime";
|
|
6291
6952
|
var TabsVariantContext = createContext2("underline");
|
|
6292
|
-
var tabsListStyles =
|
|
6953
|
+
var tabsListStyles = cva14("", {
|
|
6293
6954
|
variants: {
|
|
6294
6955
|
variant: {
|
|
6295
6956
|
underline: "flex gap-6 border-b border-border",
|
|
@@ -6297,7 +6958,7 @@ var tabsListStyles = cva13("", {
|
|
|
6297
6958
|
}
|
|
6298
6959
|
}
|
|
6299
6960
|
});
|
|
6300
|
-
var tabsTriggerStyles =
|
|
6961
|
+
var tabsTriggerStyles = cva14(
|
|
6301
6962
|
"cursor-pointer outline-none transition-colors duration-(--duration-micro) focus-visible:ring-[3px] focus-visible:ring-accent-dim",
|
|
6302
6963
|
{
|
|
6303
6964
|
variants: {
|
|
@@ -6318,8 +6979,8 @@ var tabsTriggerStyles = cva13(
|
|
|
6318
6979
|
}
|
|
6319
6980
|
}
|
|
6320
6981
|
);
|
|
6321
|
-
var Tabs =
|
|
6322
|
-
return /* @__PURE__ */
|
|
6982
|
+
var Tabs = forwardRef75(function Tabs2({ variant = "underline", className, ...props }, ref) {
|
|
6983
|
+
return /* @__PURE__ */ jsx77(TabsVariantContext.Provider, { value: variant, children: /* @__PURE__ */ jsx77(
|
|
6323
6984
|
RadixTabs.Root,
|
|
6324
6985
|
{
|
|
6325
6986
|
ref,
|
|
@@ -6329,14 +6990,14 @@ var Tabs = forwardRef74(function Tabs2({ variant = "underline", className, ...pr
|
|
|
6329
6990
|
) });
|
|
6330
6991
|
});
|
|
6331
6992
|
Tabs.displayName = "Tabs";
|
|
6332
|
-
var TabsList =
|
|
6993
|
+
var TabsList = forwardRef75(function TabsList2({ className, ...props }, ref) {
|
|
6333
6994
|
const variant = useContext2(TabsVariantContext);
|
|
6334
|
-
return /* @__PURE__ */
|
|
6995
|
+
return /* @__PURE__ */ jsx77(RadixTabs.List, { ref, className: cn(tabsListStyles({ variant }), className), ...props });
|
|
6335
6996
|
});
|
|
6336
6997
|
TabsList.displayName = "TabsList";
|
|
6337
|
-
var Tab =
|
|
6998
|
+
var Tab = forwardRef75(function Tab2({ className, ...props }, ref) {
|
|
6338
6999
|
const variant = useContext2(TabsVariantContext);
|
|
6339
|
-
return /* @__PURE__ */
|
|
7000
|
+
return /* @__PURE__ */ jsx77(
|
|
6340
7001
|
RadixTabs.Trigger,
|
|
6341
7002
|
{
|
|
6342
7003
|
ref,
|
|
@@ -6346,9 +7007,9 @@ var Tab = forwardRef74(function Tab2({ className, ...props }, ref) {
|
|
|
6346
7007
|
);
|
|
6347
7008
|
});
|
|
6348
7009
|
Tab.displayName = "Tab";
|
|
6349
|
-
var TabsContent =
|
|
7010
|
+
var TabsContent = forwardRef75(
|
|
6350
7011
|
function TabsContent2({ className, ...props }, ref) {
|
|
6351
|
-
return /* @__PURE__ */
|
|
7012
|
+
return /* @__PURE__ */ jsx77(
|
|
6352
7013
|
RadixTabs.Content,
|
|
6353
7014
|
{
|
|
6354
7015
|
ref,
|
|
@@ -6364,8 +7025,8 @@ var TabsContent = forwardRef74(
|
|
|
6364
7025
|
TabsContent.displayName = "TabsContent";
|
|
6365
7026
|
|
|
6366
7027
|
// src/patterns/Timeline/Timeline.tsx
|
|
6367
|
-
import { forwardRef as
|
|
6368
|
-
import { jsx as
|
|
7028
|
+
import { forwardRef as forwardRef76 } from "react";
|
|
7029
|
+
import { jsx as jsx78, jsxs as jsxs68 } from "react/jsx-runtime";
|
|
6369
7030
|
var ringClass = {
|
|
6370
7031
|
accent: "border-accent",
|
|
6371
7032
|
ok: "border-ok",
|
|
@@ -6373,8 +7034,8 @@ var ringClass = {
|
|
|
6373
7034
|
err: "border-err",
|
|
6374
7035
|
muted: "border-text-dim"
|
|
6375
7036
|
};
|
|
6376
|
-
var Timeline =
|
|
6377
|
-
return /* @__PURE__ */
|
|
7037
|
+
var Timeline = forwardRef76(function Timeline2({ events, className, children, ...props }, ref) {
|
|
7038
|
+
return /* @__PURE__ */ jsx78(
|
|
6378
7039
|
"ol",
|
|
6379
7040
|
{
|
|
6380
7041
|
ref,
|
|
@@ -6384,14 +7045,14 @@ var Timeline = forwardRef75(function Timeline2({ events, className, children, ..
|
|
|
6384
7045
|
className
|
|
6385
7046
|
),
|
|
6386
7047
|
...props,
|
|
6387
|
-
children: events ? events.map((e, i) => /* @__PURE__ */
|
|
7048
|
+
children: events ? events.map((e, i) => /* @__PURE__ */ jsx78(TimelineItem, { tone: e.tone, time: e.time, description: e.description, children: e.title }, i)) : children
|
|
6388
7049
|
}
|
|
6389
7050
|
);
|
|
6390
7051
|
});
|
|
6391
7052
|
Timeline.displayName = "Timeline";
|
|
6392
|
-
var TimelineItem =
|
|
6393
|
-
return /* @__PURE__ */
|
|
6394
|
-
/* @__PURE__ */
|
|
7053
|
+
var TimelineItem = forwardRef76(function TimelineItem2({ tone = "accent", description, time, className, children, ...props }, ref) {
|
|
7054
|
+
return /* @__PURE__ */ jsxs68("li", { ref, className: cn("relative mb-[18px] last:mb-0", className), ...props, children: [
|
|
7055
|
+
/* @__PURE__ */ jsx78(
|
|
6395
7056
|
"span",
|
|
6396
7057
|
{
|
|
6397
7058
|
"aria-hidden": true,
|
|
@@ -6401,15 +7062,15 @@ var TimelineItem = forwardRef75(function TimelineItem2({ tone = "accent", descri
|
|
|
6401
7062
|
)
|
|
6402
7063
|
}
|
|
6403
7064
|
),
|
|
6404
|
-
/* @__PURE__ */
|
|
6405
|
-
description && /* @__PURE__ */
|
|
6406
|
-
time && /* @__PURE__ */
|
|
7065
|
+
/* @__PURE__ */ jsx78("div", { className: "text-[13px] font-medium", children }),
|
|
7066
|
+
description && /* @__PURE__ */ jsx78("div", { className: "text-text-muted text-[12px]", children: description }),
|
|
7067
|
+
time && /* @__PURE__ */ jsx78("div", { className: "text-text-dim mt-[2px] font-mono text-[10px]", children: time })
|
|
6407
7068
|
] });
|
|
6408
7069
|
});
|
|
6409
7070
|
TimelineItem.displayName = "TimelineItem";
|
|
6410
7071
|
|
|
6411
7072
|
// src/patterns/Timeline/ActivityTimeline.tsx
|
|
6412
|
-
import { forwardRef as
|
|
7073
|
+
import { forwardRef as forwardRef77 } from "react";
|
|
6413
7074
|
|
|
6414
7075
|
// src/patterns/Timeline/formatRelative.ts
|
|
6415
7076
|
var SECOND = 1e3;
|
|
@@ -6444,7 +7105,7 @@ function formatRelative(input, now = /* @__PURE__ */ new Date()) {
|
|
|
6444
7105
|
}
|
|
6445
7106
|
|
|
6446
7107
|
// src/patterns/Timeline/ActivityTimeline.tsx
|
|
6447
|
-
import { jsx as
|
|
7108
|
+
import { jsx as jsx79, jsxs as jsxs69 } from "react/jsx-runtime";
|
|
6448
7109
|
var ringClass2 = {
|
|
6449
7110
|
accent: "border-accent",
|
|
6450
7111
|
ok: "border-ok",
|
|
@@ -6452,10 +7113,10 @@ var ringClass2 = {
|
|
|
6452
7113
|
err: "border-err",
|
|
6453
7114
|
muted: "border-text-dim"
|
|
6454
7115
|
};
|
|
6455
|
-
var ActivityTimeline =
|
|
7116
|
+
var ActivityTimeline = forwardRef77(
|
|
6456
7117
|
function ActivityTimeline2({ events, relativeNow, className, ...props }, ref) {
|
|
6457
7118
|
const now = relativeNow ?? /* @__PURE__ */ new Date();
|
|
6458
|
-
return /* @__PURE__ */
|
|
7119
|
+
return /* @__PURE__ */ jsx79(
|
|
6459
7120
|
"ol",
|
|
6460
7121
|
{
|
|
6461
7122
|
ref,
|
|
@@ -6468,8 +7129,8 @@ var ActivityTimeline = forwardRef76(
|
|
|
6468
7129
|
children: events.map((event) => {
|
|
6469
7130
|
const tone = event.tone ?? "accent";
|
|
6470
7131
|
const time = formatRelative(event.at, now);
|
|
6471
|
-
return /* @__PURE__ */
|
|
6472
|
-
/* @__PURE__ */
|
|
7132
|
+
return /* @__PURE__ */ jsxs69("li", { className: "relative mb-4 last:mb-0", children: [
|
|
7133
|
+
/* @__PURE__ */ jsx79(
|
|
6473
7134
|
"span",
|
|
6474
7135
|
{
|
|
6475
7136
|
"aria-hidden": true,
|
|
@@ -6479,16 +7140,16 @@ var ActivityTimeline = forwardRef76(
|
|
|
6479
7140
|
)
|
|
6480
7141
|
}
|
|
6481
7142
|
),
|
|
6482
|
-
/* @__PURE__ */
|
|
6483
|
-
event.icon && /* @__PURE__ */
|
|
6484
|
-
/* @__PURE__ */
|
|
6485
|
-
time && /* @__PURE__ */
|
|
7143
|
+
/* @__PURE__ */ jsxs69("div", { className: "flex items-baseline gap-2", children: [
|
|
7144
|
+
event.icon && /* @__PURE__ */ jsx79("span", { "aria-hidden": true, className: "text-text-muted font-mono text-[12px]", children: event.icon }),
|
|
7145
|
+
/* @__PURE__ */ jsx79("div", { className: "text-[13px] font-medium", children: event.title }),
|
|
7146
|
+
time && /* @__PURE__ */ jsx79("time", { className: "text-text-dim ml-auto font-mono text-[10px]", children: time })
|
|
6486
7147
|
] }),
|
|
6487
|
-
event.actor && /* @__PURE__ */
|
|
6488
|
-
event.actor.avatar && /* @__PURE__ */
|
|
6489
|
-
/* @__PURE__ */
|
|
7148
|
+
event.actor && /* @__PURE__ */ jsxs69("div", { className: "text-text-muted mt-[2px] flex items-center gap-[6px] text-[12px]", children: [
|
|
7149
|
+
event.actor.avatar && /* @__PURE__ */ jsx79("span", { "aria-hidden": true, className: "inline-flex", children: event.actor.avatar }),
|
|
7150
|
+
/* @__PURE__ */ jsx79("span", { children: event.actor.name })
|
|
6490
7151
|
] }),
|
|
6491
|
-
event.payload && /* @__PURE__ */
|
|
7152
|
+
event.payload && /* @__PURE__ */ jsx79("div", { className: "border-border bg-panel-2 mt-2 rounded-md border px-3 py-2 font-mono text-[11px] leading-[1.5]", children: event.payload })
|
|
6492
7153
|
] }, event.id);
|
|
6493
7154
|
})
|
|
6494
7155
|
}
|
|
@@ -6498,9 +7159,9 @@ var ActivityTimeline = forwardRef76(
|
|
|
6498
7159
|
ActivityTimeline.displayName = "ActivityTimeline";
|
|
6499
7160
|
|
|
6500
7161
|
// src/patterns/Topbar/Topbar.tsx
|
|
6501
|
-
import { forwardRef as
|
|
6502
|
-
import { jsx as
|
|
6503
|
-
var Topbar =
|
|
7162
|
+
import { forwardRef as forwardRef78 } from "react";
|
|
7163
|
+
import { jsx as jsx80, jsxs as jsxs70 } from "react/jsx-runtime";
|
|
7164
|
+
var Topbar = forwardRef78(function Topbar2({
|
|
6504
7165
|
title,
|
|
6505
7166
|
eyebrow,
|
|
6506
7167
|
leading,
|
|
@@ -6514,7 +7175,7 @@ var Topbar = forwardRef77(function Topbar2({
|
|
|
6514
7175
|
}, ref) {
|
|
6515
7176
|
const isTouch = density === "touch";
|
|
6516
7177
|
const backHandler = typeof back === "function" ? back : back ? onBack : void 0;
|
|
6517
|
-
return /* @__PURE__ */
|
|
7178
|
+
return /* @__PURE__ */ jsxs70(
|
|
6518
7179
|
"header",
|
|
6519
7180
|
{
|
|
6520
7181
|
ref,
|
|
@@ -6525,7 +7186,7 @@ var Topbar = forwardRef77(function Topbar2({
|
|
|
6525
7186
|
),
|
|
6526
7187
|
...props,
|
|
6527
7188
|
children: [
|
|
6528
|
-
isTouch && back && /* @__PURE__ */
|
|
7189
|
+
isTouch && back && /* @__PURE__ */ jsx80(
|
|
6529
7190
|
"button",
|
|
6530
7191
|
{
|
|
6531
7192
|
type: "button",
|
|
@@ -6539,7 +7200,7 @@ var Topbar = forwardRef77(function Topbar2({
|
|
|
6539
7200
|
"hover:bg-panel-2 h-touch w-touch",
|
|
6540
7201
|
"focus-visible:ring-accent-dim outline-none focus-visible:ring-[3px]"
|
|
6541
7202
|
),
|
|
6542
|
-
children: /* @__PURE__ */
|
|
7203
|
+
children: /* @__PURE__ */ jsx80(
|
|
6543
7204
|
"svg",
|
|
6544
7205
|
{
|
|
6545
7206
|
width: "20",
|
|
@@ -6549,15 +7210,15 @@ var Topbar = forwardRef77(function Topbar2({
|
|
|
6549
7210
|
stroke: "currentColor",
|
|
6550
7211
|
strokeWidth: "2",
|
|
6551
7212
|
"aria-hidden": true,
|
|
6552
|
-
children: /* @__PURE__ */
|
|
7213
|
+
children: /* @__PURE__ */ jsx80("path", { d: "m15 18-6-6 6-6" })
|
|
6553
7214
|
}
|
|
6554
7215
|
)
|
|
6555
7216
|
}
|
|
6556
7217
|
),
|
|
6557
7218
|
leading,
|
|
6558
|
-
(title || isTouch && eyebrow) && /* @__PURE__ */
|
|
6559
|
-
isTouch && eyebrow && /* @__PURE__ */
|
|
6560
|
-
title && /* @__PURE__ */
|
|
7219
|
+
(title || isTouch && eyebrow) && /* @__PURE__ */ jsxs70("div", { className: cn("min-w-0", isTouch && "flex-1"), children: [
|
|
7220
|
+
isTouch && eyebrow && /* @__PURE__ */ jsx80("div", { className: "text-m-eyebrow text-accent font-mono tracking-wide uppercase", children: eyebrow }),
|
|
7221
|
+
title && /* @__PURE__ */ jsx80(
|
|
6561
7222
|
"div",
|
|
6562
7223
|
{
|
|
6563
7224
|
className: cn(
|
|
@@ -6567,8 +7228,8 @@ var Topbar = forwardRef77(function Topbar2({
|
|
|
6567
7228
|
}
|
|
6568
7229
|
)
|
|
6569
7230
|
] }),
|
|
6570
|
-
!isTouch && /* @__PURE__ */
|
|
6571
|
-
actions && /* @__PURE__ */
|
|
7231
|
+
!isTouch && /* @__PURE__ */ jsx80("div", { className: "flex flex-1 items-center" }),
|
|
7232
|
+
actions && /* @__PURE__ */ jsx80("div", { className: cn("flex items-center", isTouch ? "gap-1" : "gap-3"), children: actions }),
|
|
6572
7233
|
children
|
|
6573
7234
|
]
|
|
6574
7235
|
}
|
|
@@ -6578,14 +7239,15 @@ Topbar.displayName = "Topbar";
|
|
|
6578
7239
|
|
|
6579
7240
|
// src/patterns/Tree/Tree.tsx
|
|
6580
7241
|
import {
|
|
6581
|
-
forwardRef as
|
|
7242
|
+
forwardRef as forwardRef79,
|
|
6582
7243
|
useCallback as useCallback16,
|
|
6583
7244
|
useEffect as useEffect16,
|
|
6584
7245
|
useMemo as useMemo7,
|
|
6585
|
-
useRef as
|
|
6586
|
-
useState as
|
|
7246
|
+
useRef as useRef14,
|
|
7247
|
+
useState as useState21
|
|
6587
7248
|
} from "react";
|
|
6588
|
-
import {
|
|
7249
|
+
import { flushSync } from "react-dom";
|
|
7250
|
+
import { jsx as jsx81, jsxs as jsxs71 } from "react/jsx-runtime";
|
|
6589
7251
|
var EMPTY_SET2 = /* @__PURE__ */ new Set();
|
|
6590
7252
|
function flattenVisible(items, expanded, level, parentId, out) {
|
|
6591
7253
|
for (const item of items) {
|
|
@@ -6596,7 +7258,7 @@ function flattenVisible(items, expanded, level, parentId, out) {
|
|
|
6596
7258
|
}
|
|
6597
7259
|
}
|
|
6598
7260
|
}
|
|
6599
|
-
var Tree =
|
|
7261
|
+
var Tree = forwardRef79(function Tree2({
|
|
6600
7262
|
items,
|
|
6601
7263
|
expanded: expandedProp,
|
|
6602
7264
|
defaultExpanded,
|
|
@@ -6624,7 +7286,7 @@ var Tree = forwardRef78(function Tree2({
|
|
|
6624
7286
|
flattenVisible(items, expandedSet, 1, null, out);
|
|
6625
7287
|
return out;
|
|
6626
7288
|
}, [items, expandedSet]);
|
|
6627
|
-
const [activeId, setActiveId] =
|
|
7289
|
+
const [activeId, setActiveId] = useState21(null);
|
|
6628
7290
|
useEffect16(() => {
|
|
6629
7291
|
if (activeId && !flatVisible.some((f) => f.id === activeId)) {
|
|
6630
7292
|
setActiveId(null);
|
|
@@ -6635,7 +7297,7 @@ var Tree = forwardRef78(function Tree2({
|
|
|
6635
7297
|
if (value && flatVisible.some((f) => f.id === value)) return value;
|
|
6636
7298
|
return flatVisible[0]?.id ?? null;
|
|
6637
7299
|
}, [activeId, flatVisible, value]);
|
|
6638
|
-
const listRef =
|
|
7300
|
+
const listRef = useRef14(null);
|
|
6639
7301
|
const setRefs = useCallback16(
|
|
6640
7302
|
(node) => {
|
|
6641
7303
|
listRef.current = node;
|
|
@@ -6652,8 +7314,8 @@ var Tree = forwardRef78(function Tree2({
|
|
|
6652
7314
|
}, []);
|
|
6653
7315
|
const moveActive = useCallback16(
|
|
6654
7316
|
(id) => {
|
|
6655
|
-
setActiveId(id);
|
|
6656
|
-
|
|
7317
|
+
flushSync(() => setActiveId(id));
|
|
7318
|
+
focusItem(id);
|
|
6657
7319
|
},
|
|
6658
7320
|
[focusItem]
|
|
6659
7321
|
);
|
|
@@ -6778,7 +7440,7 @@ var Tree = forwardRef78(function Tree2({
|
|
|
6778
7440
|
toggle
|
|
6779
7441
|
]
|
|
6780
7442
|
);
|
|
6781
|
-
return /* @__PURE__ */
|
|
7443
|
+
return /* @__PURE__ */ jsx81(
|
|
6782
7444
|
"ul",
|
|
6783
7445
|
{
|
|
6784
7446
|
ref: setRefs,
|
|
@@ -6786,7 +7448,7 @@ var Tree = forwardRef78(function Tree2({
|
|
|
6786
7448
|
className: cn("flex flex-col gap-px text-[12px]", className),
|
|
6787
7449
|
onKeyDown: handleKeyDown,
|
|
6788
7450
|
...props,
|
|
6789
|
-
children: items.map((item) => /* @__PURE__ */
|
|
7451
|
+
children: items.map((item) => /* @__PURE__ */ jsx81(
|
|
6790
7452
|
TreeItemRow,
|
|
6791
7453
|
{
|
|
6792
7454
|
item,
|
|
@@ -6821,8 +7483,8 @@ function TreeItemRow({
|
|
|
6821
7483
|
const isExpanded = hasChildren && expanded.has(item.id);
|
|
6822
7484
|
const isSelected = selected === item.id;
|
|
6823
7485
|
const isTabStop = tabStopId === item.id;
|
|
6824
|
-
return /* @__PURE__ */
|
|
6825
|
-
/* @__PURE__ */
|
|
7486
|
+
return /* @__PURE__ */ jsxs71("li", { role: "none", children: [
|
|
7487
|
+
/* @__PURE__ */ jsxs71(
|
|
6826
7488
|
"div",
|
|
6827
7489
|
{
|
|
6828
7490
|
role: "treeitem",
|
|
@@ -6845,14 +7507,14 @@ function TreeItemRow({
|
|
|
6845
7507
|
isSelected ? "bg-accent-dim text-accent" : "text-text hover:bg-panel-2"
|
|
6846
7508
|
),
|
|
6847
7509
|
children: [
|
|
6848
|
-
/* @__PURE__ */
|
|
6849
|
-
item.icon && /* @__PURE__ */
|
|
6850
|
-
/* @__PURE__ */
|
|
7510
|
+
/* @__PURE__ */ jsx81("span", { "aria-hidden": true, className: "text-text-dim grid w-3 place-items-center text-[10px]", children: hasChildren ? isExpanded ? "\u25BE" : "\u25B8" : "" }),
|
|
7511
|
+
item.icon && /* @__PURE__ */ jsx81("span", { "aria-hidden": true, className: "text-[12px] opacity-80", children: item.icon }),
|
|
7512
|
+
/* @__PURE__ */ jsx81("span", { className: "flex-1 truncate", children: item.label }),
|
|
6851
7513
|
item.trailing
|
|
6852
7514
|
]
|
|
6853
7515
|
}
|
|
6854
7516
|
),
|
|
6855
|
-
hasChildren && isExpanded && /* @__PURE__ */
|
|
7517
|
+
hasChildren && isExpanded && /* @__PURE__ */ jsx81("ul", { role: "group", className: "flex flex-col gap-px", children: (item.children ?? []).map((child) => /* @__PURE__ */ jsx81(
|
|
6856
7518
|
TreeItemRow,
|
|
6857
7519
|
{
|
|
6858
7520
|
item: child,
|
|
@@ -6870,10 +7532,10 @@ function TreeItemRow({
|
|
|
6870
7532
|
}
|
|
6871
7533
|
|
|
6872
7534
|
// src/patterns/WizardDialog/WizardDialog.tsx
|
|
6873
|
-
import * as
|
|
6874
|
-
import { forwardRef as
|
|
6875
|
-
import { jsx as
|
|
6876
|
-
var WizardDialog =
|
|
7535
|
+
import * as RadixDialog7 from "@radix-ui/react-dialog";
|
|
7536
|
+
import { forwardRef as forwardRef80, useCallback as useCallback17, useMemo as useMemo8, useState as useState22 } from "react";
|
|
7537
|
+
import { jsx as jsx82, jsxs as jsxs72 } from "react/jsx-runtime";
|
|
7538
|
+
var WizardDialog = forwardRef80(function WizardDialog2({
|
|
6877
7539
|
open,
|
|
6878
7540
|
defaultOpen,
|
|
6879
7541
|
onOpenChange,
|
|
@@ -6889,7 +7551,7 @@ var WizardDialog = forwardRef79(function WizardDialog2({
|
|
|
6889
7551
|
cancelLabel,
|
|
6890
7552
|
onCancel
|
|
6891
7553
|
}, ref) {
|
|
6892
|
-
const [current, setCurrent] =
|
|
7554
|
+
const [current, setCurrent] = useState22(initialStep);
|
|
6893
7555
|
const total = steps.length;
|
|
6894
7556
|
const safeCurrent = Math.min(current, Math.max(0, total - 1));
|
|
6895
7557
|
const step = steps[safeCurrent];
|
|
@@ -6924,23 +7586,36 @@ var WizardDialog = forwardRef79(function WizardDialog2({
|
|
|
6924
7586
|
goNext();
|
|
6925
7587
|
}
|
|
6926
7588
|
};
|
|
6927
|
-
return /* @__PURE__ */
|
|
6928
|
-
|
|
6929
|
-
|
|
6930
|
-
|
|
6931
|
-
|
|
6932
|
-
|
|
6933
|
-
|
|
6934
|
-
|
|
6935
|
-
|
|
6936
|
-
|
|
6937
|
-
|
|
7589
|
+
return /* @__PURE__ */ jsx82(DialogRoot, { open, defaultOpen, onOpenChange, children: /* @__PURE__ */ jsxs72(
|
|
7590
|
+
DialogContent,
|
|
7591
|
+
{
|
|
7592
|
+
ref,
|
|
7593
|
+
width,
|
|
7594
|
+
...description ? {} : { "aria-describedby": void 0 },
|
|
7595
|
+
children: [
|
|
7596
|
+
title ? /* @__PURE__ */ jsx82(WizardTitle, { children: title }) : (
|
|
7597
|
+
// Radix Dialog requires a Title for assistive tech and warns in dev
|
|
7598
|
+
// mode without one. Fall back to a visually-hidden generic title so
|
|
7599
|
+
// the contract is met even when no title prop is supplied.
|
|
7600
|
+
/* @__PURE__ */ jsx82(RadixDialog7.Title, { className: "sr-only", children: "Wizard" })
|
|
7601
|
+
),
|
|
7602
|
+
description && /* @__PURE__ */ jsx82(WizardDescription, { children: description }),
|
|
7603
|
+
/* @__PURE__ */ jsx82("div", { className: "mb-5", children: /* @__PURE__ */ jsx82(Stepper, { steps: stepperSteps, current: safeCurrent }) }),
|
|
7604
|
+
/* @__PURE__ */ jsx82("div", { className: "mb-5", children: body }),
|
|
7605
|
+
/* @__PURE__ */ jsxs72("div", { className: "flex justify-end gap-2", children: [
|
|
7606
|
+
cancelLabel && /* @__PURE__ */ jsx82(Button, { type: "button", variant: "ghost", onClick: onCancel, children: cancelLabel }),
|
|
7607
|
+
/* @__PURE__ */ jsx82(Button, { type: "button", variant: "secondary", onClick: goBack, disabled: ctx.isFirst, children: backLabel }),
|
|
7608
|
+
/* @__PURE__ */ jsx82(Button, { type: "button", variant: "primary", onClick: handlePrimary, disabled: !canAdvance, children: ctx.isLast ? completeLabel : nextLabel })
|
|
7609
|
+
] })
|
|
7610
|
+
]
|
|
7611
|
+
}
|
|
7612
|
+
) });
|
|
6938
7613
|
});
|
|
6939
7614
|
function WizardTitle({ children }) {
|
|
6940
|
-
return /* @__PURE__ */
|
|
7615
|
+
return /* @__PURE__ */ jsx82(RadixDialog7.Title, { className: "mb-2 text-[16px] font-medium", children });
|
|
6941
7616
|
}
|
|
6942
7617
|
function WizardDescription({ children }) {
|
|
6943
|
-
return /* @__PURE__ */
|
|
7618
|
+
return /* @__PURE__ */ jsx82(RadixDialog7.Description, { className: "text-text-muted mb-4 text-[13px] leading-[1.55]", children });
|
|
6944
7619
|
}
|
|
6945
7620
|
WizardDialog.displayName = "WizardDialog";
|
|
6946
7621
|
export {
|
|
@@ -7017,6 +7692,7 @@ export {
|
|
|
7017
7692
|
LargeTitle,
|
|
7018
7693
|
Lightbox,
|
|
7019
7694
|
ListingCard,
|
|
7695
|
+
ListingDetail,
|
|
7020
7696
|
MenuCheckboxItem,
|
|
7021
7697
|
MenuItem,
|
|
7022
7698
|
MenuSeparator,
|