@geomak/ui 7.1.0 → 7.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +552 -306
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +157 -1
- package/dist/index.d.ts +157 -1
- package/dist/index.js +267 -26
- package/dist/index.js.map +1 -1
- package/dist/styles.css +41 -0
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
var chunk4V4U2W7K_cjs = require('./chunk-4V4U2W7K.cjs');
|
|
4
4
|
var chunkOAV4TA4B_cjs = require('./chunk-OAV4TA4B.cjs');
|
|
5
|
-
var
|
|
5
|
+
var React29 = require('react');
|
|
6
6
|
var reactDom = require('react-dom');
|
|
7
7
|
var jsxRuntime = require('react/jsx-runtime');
|
|
8
8
|
var AvatarPrimitive = require('@radix-ui/react-avatar');
|
|
@@ -17,8 +17,8 @@ var ToggleGroup = require('@radix-ui/react-toggle-group');
|
|
|
17
17
|
var ContextMenuPrimitive = require('@radix-ui/react-context-menu');
|
|
18
18
|
var SwitchPrimitive = require('@radix-ui/react-switch');
|
|
19
19
|
var NavigationMenu = require('@radix-ui/react-navigation-menu');
|
|
20
|
-
var CheckboxPrimitive = require('@radix-ui/react-checkbox');
|
|
21
20
|
var RadioGroupPrimitive = require('@radix-ui/react-radio-group');
|
|
21
|
+
var CheckboxPrimitive = require('@radix-ui/react-checkbox');
|
|
22
22
|
var SliderPrimitive = require('@radix-ui/react-slider');
|
|
23
23
|
|
|
24
24
|
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
@@ -41,7 +41,7 @@ function _interopNamespace(e) {
|
|
|
41
41
|
return Object.freeze(n);
|
|
42
42
|
}
|
|
43
43
|
|
|
44
|
-
var
|
|
44
|
+
var React29__default = /*#__PURE__*/_interopDefault(React29);
|
|
45
45
|
var AvatarPrimitive__namespace = /*#__PURE__*/_interopNamespace(AvatarPrimitive);
|
|
46
46
|
var DropdownMenu__namespace = /*#__PURE__*/_interopNamespace(DropdownMenu);
|
|
47
47
|
var Dialog__namespace = /*#__PURE__*/_interopNamespace(Dialog);
|
|
@@ -53,8 +53,8 @@ var ToggleGroup__namespace = /*#__PURE__*/_interopNamespace(ToggleGroup);
|
|
|
53
53
|
var ContextMenuPrimitive__namespace = /*#__PURE__*/_interopNamespace(ContextMenuPrimitive);
|
|
54
54
|
var SwitchPrimitive__namespace = /*#__PURE__*/_interopNamespace(SwitchPrimitive);
|
|
55
55
|
var NavigationMenu__namespace = /*#__PURE__*/_interopNamespace(NavigationMenu);
|
|
56
|
-
var CheckboxPrimitive__namespace = /*#__PURE__*/_interopNamespace(CheckboxPrimitive);
|
|
57
56
|
var RadioGroupPrimitive__namespace = /*#__PURE__*/_interopNamespace(RadioGroupPrimitive);
|
|
57
|
+
var CheckboxPrimitive__namespace = /*#__PURE__*/_interopNamespace(CheckboxPrimitive);
|
|
58
58
|
var SliderPrimitive__namespace = /*#__PURE__*/_interopNamespace(SliderPrimitive);
|
|
59
59
|
|
|
60
60
|
// src/utils/cx.ts
|
|
@@ -67,8 +67,8 @@ function cx(...values) {
|
|
|
67
67
|
return out;
|
|
68
68
|
}
|
|
69
69
|
function Portal({ children, target }) {
|
|
70
|
-
const [resolved, setResolved] =
|
|
71
|
-
|
|
70
|
+
const [resolved, setResolved] = React29.useState(null);
|
|
71
|
+
React29.useEffect(() => {
|
|
72
72
|
if (target === null) {
|
|
73
73
|
setResolved(null);
|
|
74
74
|
return;
|
|
@@ -502,7 +502,7 @@ function IconButton({
|
|
|
502
502
|
className = "",
|
|
503
503
|
style
|
|
504
504
|
}) {
|
|
505
|
-
const colorScheme =
|
|
505
|
+
const colorScheme = React29.useMemo(() => {
|
|
506
506
|
if (type === "primary") {
|
|
507
507
|
return "bg-accent text-accent-fg hover:bg-accent-hover";
|
|
508
508
|
}
|
|
@@ -592,7 +592,7 @@ var SIZE_CLASSES = {
|
|
|
592
592
|
md: "h-9 px-4 text-sm gap-1.5 rounded-lg",
|
|
593
593
|
lg: "h-11 px-5 text-sm gap-2 rounded-xl"
|
|
594
594
|
};
|
|
595
|
-
var Button =
|
|
595
|
+
var Button = React29__default.default.forwardRef(function Button2({
|
|
596
596
|
content,
|
|
597
597
|
variant = "primary",
|
|
598
598
|
size = "md",
|
|
@@ -700,7 +700,7 @@ function MenuButton({
|
|
|
700
700
|
"data-[state=open]:animate-in data-[state=open]:fade-in-0 data-[state=open]:zoom-in-95",
|
|
701
701
|
"data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95"
|
|
702
702
|
].join(" "),
|
|
703
|
-
children: items.map((item) => /* @__PURE__ */ jsxRuntime.jsxs(
|
|
703
|
+
children: items.map((item) => /* @__PURE__ */ jsxRuntime.jsxs(React29__default.default.Fragment, { children: [
|
|
704
704
|
item.separatorBefore && /* @__PURE__ */ jsxRuntime.jsx(DropdownMenu__namespace.Separator, { className: "my-1 h-px bg-border" }),
|
|
705
705
|
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
706
706
|
DropdownMenu__namespace.Item,
|
|
@@ -943,9 +943,9 @@ function Tooltip({
|
|
|
943
943
|
] }) });
|
|
944
944
|
}
|
|
945
945
|
var TooltipProvider = TooltipPrimitive__namespace.Provider;
|
|
946
|
-
var TabsContext =
|
|
946
|
+
var TabsContext = React29.createContext(null);
|
|
947
947
|
function useTabsContext() {
|
|
948
|
-
const ctx =
|
|
948
|
+
const ctx = React29.useContext(TabsContext);
|
|
949
949
|
if (!ctx) throw new Error("Tabs.List / Tabs.Trigger / Tabs.Panel must be rendered inside <Tabs>.");
|
|
950
950
|
return ctx;
|
|
951
951
|
}
|
|
@@ -967,26 +967,26 @@ function Tabs({
|
|
|
967
967
|
children
|
|
968
968
|
}) {
|
|
969
969
|
const isControlled = value !== void 0;
|
|
970
|
-
const [internal, setInternal] =
|
|
970
|
+
const [internal, setInternal] = React29.useState(defaultValue);
|
|
971
971
|
const current = isControlled ? value : internal;
|
|
972
972
|
const reduced = !!framerMotion.useReducedMotion();
|
|
973
|
-
const indicatorId =
|
|
974
|
-
const select =
|
|
973
|
+
const indicatorId = React29.useId();
|
|
974
|
+
const select = React29.useCallback((next) => {
|
|
975
975
|
if (!isControlled) setInternal(next);
|
|
976
976
|
onChange?.(next);
|
|
977
977
|
}, [isControlled, onChange]);
|
|
978
|
-
const registry =
|
|
979
|
-
const orderRef =
|
|
980
|
-
const [, bump] =
|
|
981
|
-
const registerTab =
|
|
978
|
+
const registry = React29.useRef(/* @__PURE__ */ new Map());
|
|
979
|
+
const orderRef = React29.useRef(0);
|
|
980
|
+
const [, bump] = React29.useState(0);
|
|
981
|
+
const registerTab = React29.useCallback((val, meta) => {
|
|
982
982
|
const existing = registry.current.get(val);
|
|
983
983
|
registry.current.set(val, { ...meta, order: existing?.order ?? orderRef.current++ });
|
|
984
984
|
if (!existing) bump((v) => v + 1);
|
|
985
985
|
}, []);
|
|
986
|
-
const unregisterTab =
|
|
986
|
+
const unregisterTab = React29.useCallback((val) => {
|
|
987
987
|
if (registry.current.delete(val)) bump((v) => v + 1);
|
|
988
988
|
}, []);
|
|
989
|
-
const getTabs =
|
|
989
|
+
const getTabs = React29.useCallback(() => [...registry.current.entries()].sort((a, b) => a[1].order - b[1].order).map(([val, m]) => ({ value: val, label: m.label, icon: m.icon, disabled: m.disabled })), []);
|
|
990
990
|
return /* @__PURE__ */ jsxRuntime.jsx(TabsContext.Provider, { value: { value: current, variant, size, orientation, indicatorId, reduced, select, registerTab, unregisterTab, getTabs }, children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
991
991
|
TabsPrimitive__namespace.Root,
|
|
992
992
|
{
|
|
@@ -1006,10 +1006,10 @@ function Tabs({
|
|
|
1006
1006
|
function TabsList({ children, "aria-label": ariaLabel, className = "" }) {
|
|
1007
1007
|
const { variant, orientation, reduced, value } = useTabsContext();
|
|
1008
1008
|
const horizontal = orientation === "horizontal";
|
|
1009
|
-
const scrollRef =
|
|
1010
|
-
const [edges, setEdges] =
|
|
1009
|
+
const scrollRef = React29.useRef(null);
|
|
1010
|
+
const [edges, setEdges] = React29.useState({ start: false, end: false });
|
|
1011
1011
|
const scrollable = variant !== "segmented";
|
|
1012
|
-
|
|
1012
|
+
React29.useLayoutEffect(() => {
|
|
1013
1013
|
const el = scrollRef.current;
|
|
1014
1014
|
if (!el || !scrollable) return;
|
|
1015
1015
|
const update = () => {
|
|
@@ -1034,13 +1034,13 @@ function TabsList({ children, "aria-label": ariaLabel, className = "" }) {
|
|
|
1034
1034
|
ro.disconnect();
|
|
1035
1035
|
};
|
|
1036
1036
|
}, [horizontal, scrollable, children]);
|
|
1037
|
-
const nudge =
|
|
1037
|
+
const nudge = React29.useCallback((dir) => {
|
|
1038
1038
|
const el = scrollRef.current;
|
|
1039
1039
|
if (!el) return;
|
|
1040
1040
|
const amount = (horizontal ? el.clientWidth : el.clientHeight) * 0.7 * dir;
|
|
1041
1041
|
el.scrollBy({ [horizontal ? "left" : "top"]: amount, behavior: reduced ? "auto" : "smooth" });
|
|
1042
1042
|
}, [horizontal, reduced]);
|
|
1043
|
-
|
|
1043
|
+
React29.useLayoutEffect(() => {
|
|
1044
1044
|
const el = scrollRef.current;
|
|
1045
1045
|
if (!el || !scrollable) return;
|
|
1046
1046
|
const active = el.querySelector("[role=tab][data-state=active]");
|
|
@@ -1098,9 +1098,9 @@ function Chevron2({ side, orientation, onClick }) {
|
|
|
1098
1098
|
function OverflowMenu() {
|
|
1099
1099
|
const { getTabs, value, select, orientation } = useTabsContext();
|
|
1100
1100
|
const horizontal = orientation === "horizontal";
|
|
1101
|
-
const [open, setOpen] =
|
|
1102
|
-
const wrapRef =
|
|
1103
|
-
const timer =
|
|
1101
|
+
const [open, setOpen] = React29.useState(false);
|
|
1102
|
+
const wrapRef = React29.useRef(null);
|
|
1103
|
+
const timer = React29.useRef(null);
|
|
1104
1104
|
const openNow = () => {
|
|
1105
1105
|
if (timer.current) clearTimeout(timer.current);
|
|
1106
1106
|
setOpen(true);
|
|
@@ -1108,7 +1108,7 @@ function OverflowMenu() {
|
|
|
1108
1108
|
const closeSoon = () => {
|
|
1109
1109
|
timer.current = setTimeout(() => setOpen(false), 160);
|
|
1110
1110
|
};
|
|
1111
|
-
|
|
1111
|
+
React29.useLayoutEffect(() => {
|
|
1112
1112
|
if (!open) return;
|
|
1113
1113
|
const onDoc = (e) => {
|
|
1114
1114
|
if (wrapRef.current && !wrapRef.current.contains(e.target)) setOpen(false);
|
|
@@ -1189,7 +1189,7 @@ function TabsTrigger({ value, icon, badge, closeable, onClose, disabled, classNa
|
|
|
1189
1189
|
const isActive = active === value;
|
|
1190
1190
|
const horizontal = orientation === "horizontal";
|
|
1191
1191
|
const sz = SIZE[size];
|
|
1192
|
-
|
|
1192
|
+
React29.useLayoutEffect(() => {
|
|
1193
1193
|
registerTab(value, { label: children, icon, disabled });
|
|
1194
1194
|
return () => unregisterTab(value);
|
|
1195
1195
|
}, [value, children, icon, disabled, registerTab, unregisterTab]);
|
|
@@ -1387,7 +1387,7 @@ function Tree({
|
|
|
1387
1387
|
item.key
|
|
1388
1388
|
)) });
|
|
1389
1389
|
}
|
|
1390
|
-
var AccordionCtx =
|
|
1390
|
+
var AccordionCtx = React29.createContext({ variant: "separated" });
|
|
1391
1391
|
function Accordion2({
|
|
1392
1392
|
children,
|
|
1393
1393
|
type = "single",
|
|
@@ -1446,7 +1446,7 @@ var Chevron3 = /* @__PURE__ */ jsxRuntime.jsx(
|
|
|
1446
1446
|
}
|
|
1447
1447
|
);
|
|
1448
1448
|
function AccordionItem({ value, title, icon, children, disabled, className = "" }) {
|
|
1449
|
-
const { variant } =
|
|
1449
|
+
const { variant } = React29.useContext(AccordionCtx);
|
|
1450
1450
|
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
1451
1451
|
AccordionPrimitive__namespace.Item,
|
|
1452
1452
|
{
|
|
@@ -1505,7 +1505,7 @@ function Breadcrumbs({
|
|
|
1505
1505
|
className = "",
|
|
1506
1506
|
style
|
|
1507
1507
|
}) {
|
|
1508
|
-
const [expanded, setExpanded] =
|
|
1508
|
+
const [expanded, setExpanded] = React29.useState(false);
|
|
1509
1509
|
const shouldCollapse = maxItems > 0 && items.length > maxItems && !expanded;
|
|
1510
1510
|
const visible = [];
|
|
1511
1511
|
if (shouldCollapse) {
|
|
@@ -1689,8 +1689,8 @@ function Stepper({
|
|
|
1689
1689
|
className = ""
|
|
1690
1690
|
}) {
|
|
1691
1691
|
const reduced = framerMotion.useReducedMotion();
|
|
1692
|
-
const [forcedVertical, setForcedVertical] =
|
|
1693
|
-
|
|
1692
|
+
const [forcedVertical, setForcedVertical] = React29.useState(false);
|
|
1693
|
+
React29.useEffect(() => {
|
|
1694
1694
|
if (!responsive || orientation === "vertical") return;
|
|
1695
1695
|
if (typeof window === "undefined" || typeof window.matchMedia !== "function") return;
|
|
1696
1696
|
const mq = window.matchMedia("(max-width: 767px)");
|
|
@@ -1799,7 +1799,7 @@ function Kbd({
|
|
|
1799
1799
|
style
|
|
1800
1800
|
}) {
|
|
1801
1801
|
if (keys && keys.length > 0) {
|
|
1802
|
-
return /* @__PURE__ */ jsxRuntime.jsx("span", { className: cx("inline-flex items-center gap-1", className), style, children: keys.map((k, i) => /* @__PURE__ */ jsxRuntime.jsxs(
|
|
1802
|
+
return /* @__PURE__ */ jsxRuntime.jsx("span", { className: cx("inline-flex items-center gap-1", className), style, children: keys.map((k, i) => /* @__PURE__ */ jsxRuntime.jsxs(React29__default.default.Fragment, { children: [
|
|
1803
1803
|
i > 0 && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-foreground-muted text-xs select-none", children: separator }),
|
|
1804
1804
|
/* @__PURE__ */ jsxRuntime.jsx("kbd", { className: [cap, SIZE3[size]].join(" "), children: k })
|
|
1805
1805
|
] }, `${k}-${i}`)) });
|
|
@@ -1890,13 +1890,13 @@ function FlatCarousel({
|
|
|
1890
1890
|
className = "",
|
|
1891
1891
|
style
|
|
1892
1892
|
}) {
|
|
1893
|
-
const scrollerRef =
|
|
1894
|
-
const slides =
|
|
1895
|
-
const [active, setActive] =
|
|
1896
|
-
const [atStart, setAtStart] =
|
|
1897
|
-
const [atEnd, setAtEnd] =
|
|
1893
|
+
const scrollerRef = React29.useRef(null);
|
|
1894
|
+
const slides = React29__default.default.Children.toArray(children);
|
|
1895
|
+
const [active, setActive] = React29.useState(0);
|
|
1896
|
+
const [atStart, setAtStart] = React29.useState(true);
|
|
1897
|
+
const [atEnd, setAtEnd] = React29.useState(false);
|
|
1898
1898
|
const width = typeof itemWidth === "number" ? `${itemWidth}px` : itemWidth;
|
|
1899
|
-
const update =
|
|
1899
|
+
const update = React29.useCallback(() => {
|
|
1900
1900
|
const el = scrollerRef.current;
|
|
1901
1901
|
if (!el) return;
|
|
1902
1902
|
setAtStart(el.scrollLeft <= 1);
|
|
@@ -1905,7 +1905,7 @@ function FlatCarousel({
|
|
|
1905
1905
|
const slideW = first ? first.getBoundingClientRect().width + gap : el.clientWidth;
|
|
1906
1906
|
setActive(Math.round(el.scrollLeft / slideW));
|
|
1907
1907
|
}, [gap]);
|
|
1908
|
-
|
|
1908
|
+
React29.useEffect(() => {
|
|
1909
1909
|
update();
|
|
1910
1910
|
const el = scrollerRef.current;
|
|
1911
1911
|
if (!el) return;
|
|
@@ -1946,9 +1946,9 @@ function RotatingCarousel({
|
|
|
1946
1946
|
className = "",
|
|
1947
1947
|
style
|
|
1948
1948
|
}) {
|
|
1949
|
-
const slides =
|
|
1949
|
+
const slides = React29__default.default.Children.toArray(children);
|
|
1950
1950
|
const count = slides.length;
|
|
1951
|
-
const [active, setActive] =
|
|
1951
|
+
const [active, setActive] = React29.useState(0);
|
|
1952
1952
|
const reduced = framerMotion.useReducedMotion();
|
|
1953
1953
|
const wrap = (n) => count > 0 ? (n % count + count) % count : 0;
|
|
1954
1954
|
const idx = wrap(active);
|
|
@@ -2186,13 +2186,13 @@ function Chat({
|
|
|
2186
2186
|
className = "",
|
|
2187
2187
|
style
|
|
2188
2188
|
}) {
|
|
2189
|
-
const listRef =
|
|
2190
|
-
const atBottomRef =
|
|
2191
|
-
const [showJump, setShowJump] =
|
|
2192
|
-
const [draft, setDraft] =
|
|
2189
|
+
const listRef = React29.useRef(null);
|
|
2190
|
+
const atBottomRef = React29.useRef(true);
|
|
2191
|
+
const [showJump, setShowJump] = React29.useState(false);
|
|
2192
|
+
const [draft, setDraft] = React29.useState("");
|
|
2193
2193
|
const hasHeader = title != null || subtitle != null || avatar != null || headerActions != null;
|
|
2194
2194
|
const isTyping = typingNames.length > 0;
|
|
2195
|
-
const scrollToBottom =
|
|
2195
|
+
const scrollToBottom = React29.useCallback((smooth = true) => {
|
|
2196
2196
|
const el = listRef.current;
|
|
2197
2197
|
if (!el) return;
|
|
2198
2198
|
if (typeof el.scrollTo === "function") el.scrollTo({ top: el.scrollHeight, behavior: smooth ? "smooth" : "auto" });
|
|
@@ -2205,10 +2205,10 @@ function Chat({
|
|
|
2205
2205
|
atBottomRef.current = near;
|
|
2206
2206
|
setShowJump(!near);
|
|
2207
2207
|
};
|
|
2208
|
-
|
|
2208
|
+
React29.useEffect(() => {
|
|
2209
2209
|
if (atBottomRef.current) scrollToBottom(messages.length > 0);
|
|
2210
2210
|
}, [messages.length, isTyping]);
|
|
2211
|
-
|
|
2211
|
+
React29.useEffect(() => {
|
|
2212
2212
|
scrollToBottom(false);
|
|
2213
2213
|
}, [scrollToBottom]);
|
|
2214
2214
|
const send = () => {
|
|
@@ -2398,7 +2398,7 @@ function FAB({
|
|
|
2398
2398
|
className = "",
|
|
2399
2399
|
style
|
|
2400
2400
|
}) {
|
|
2401
|
-
const [open, setOpen] =
|
|
2401
|
+
const [open, setOpen] = React29.useState(false);
|
|
2402
2402
|
const reduced = framerMotion.useReducedMotion();
|
|
2403
2403
|
const hasDial = !!actions && actions.length > 0;
|
|
2404
2404
|
const bottom = position.startsWith("bottom");
|
|
@@ -2500,8 +2500,8 @@ function PopConfirm({
|
|
|
2500
2500
|
onOpenChange,
|
|
2501
2501
|
className = ""
|
|
2502
2502
|
}) {
|
|
2503
|
-
const [uncontrolledOpen, setUncontrolledOpen] =
|
|
2504
|
-
const [loading, setLoading] =
|
|
2503
|
+
const [uncontrolledOpen, setUncontrolledOpen] = React29.useState(false);
|
|
2504
|
+
const [loading, setLoading] = React29.useState(false);
|
|
2505
2505
|
const isOpen = open ?? uncontrolledOpen;
|
|
2506
2506
|
const setOpen = (next) => {
|
|
2507
2507
|
onOpenChange?.(next);
|
|
@@ -2588,16 +2588,16 @@ function LogoutTimer({
|
|
|
2588
2588
|
logoutLabel = "Sign out now"
|
|
2589
2589
|
}) {
|
|
2590
2590
|
const reduced = framerMotion.useReducedMotion();
|
|
2591
|
-
const [warning, setWarning] =
|
|
2592
|
-
const [remaining, setRemaining] =
|
|
2593
|
-
const idleTimer =
|
|
2594
|
-
const tick =
|
|
2595
|
-
const deadline =
|
|
2596
|
-
const warningRef =
|
|
2597
|
-
const lastReset =
|
|
2598
|
-
const cbs =
|
|
2591
|
+
const [warning, setWarning] = React29.useState(false);
|
|
2592
|
+
const [remaining, setRemaining] = React29.useState(countdown);
|
|
2593
|
+
const idleTimer = React29.useRef(null);
|
|
2594
|
+
const tick = React29.useRef(null);
|
|
2595
|
+
const deadline = React29.useRef(0);
|
|
2596
|
+
const warningRef = React29.useRef(false);
|
|
2597
|
+
const lastReset = React29.useRef(0);
|
|
2598
|
+
const cbs = React29.useRef({ onLogout, onContinue, onWarning });
|
|
2599
2599
|
cbs.current = { onLogout, onContinue, onWarning };
|
|
2600
|
-
const clearTimers =
|
|
2600
|
+
const clearTimers = React29.useCallback(() => {
|
|
2601
2601
|
if (idleTimer.current) {
|
|
2602
2602
|
clearTimeout(idleTimer.current);
|
|
2603
2603
|
idleTimer.current = null;
|
|
@@ -2607,13 +2607,13 @@ function LogoutTimer({
|
|
|
2607
2607
|
tick.current = null;
|
|
2608
2608
|
}
|
|
2609
2609
|
}, []);
|
|
2610
|
-
const logout =
|
|
2610
|
+
const logout = React29.useCallback(() => {
|
|
2611
2611
|
clearTimers();
|
|
2612
2612
|
warningRef.current = false;
|
|
2613
2613
|
setWarning(false);
|
|
2614
2614
|
cbs.current.onLogout();
|
|
2615
2615
|
}, [clearTimers]);
|
|
2616
|
-
const startIdle =
|
|
2616
|
+
const startIdle = React29.useCallback(() => {
|
|
2617
2617
|
if (idleTimer.current) clearTimeout(idleTimer.current);
|
|
2618
2618
|
idleTimer.current = setTimeout(() => {
|
|
2619
2619
|
warningRef.current = true;
|
|
@@ -2628,7 +2628,7 @@ function LogoutTimer({
|
|
|
2628
2628
|
}, 250);
|
|
2629
2629
|
}, timeout);
|
|
2630
2630
|
}, [timeout, countdown, logout]);
|
|
2631
|
-
const stay =
|
|
2631
|
+
const stay = React29.useCallback(() => {
|
|
2632
2632
|
if (tick.current) {
|
|
2633
2633
|
clearInterval(tick.current);
|
|
2634
2634
|
tick.current = null;
|
|
@@ -2638,7 +2638,7 @@ function LogoutTimer({
|
|
|
2638
2638
|
cbs.current.onContinue?.();
|
|
2639
2639
|
startIdle();
|
|
2640
2640
|
}, [startIdle]);
|
|
2641
|
-
|
|
2641
|
+
React29.useEffect(() => {
|
|
2642
2642
|
if (!enabled) {
|
|
2643
2643
|
clearTimers();
|
|
2644
2644
|
warningRef.current = false;
|
|
@@ -2703,11 +2703,11 @@ function SegmentedControl({
|
|
|
2703
2703
|
"aria-label": ariaLabel
|
|
2704
2704
|
}) {
|
|
2705
2705
|
const sz = SIZE5[size];
|
|
2706
|
-
const groupId =
|
|
2707
|
-
const errorId =
|
|
2706
|
+
const groupId = React29.useId();
|
|
2707
|
+
const errorId = React29.useId();
|
|
2708
2708
|
const hasError = errorMessage != null;
|
|
2709
2709
|
const isControlled = value !== void 0;
|
|
2710
|
-
const [internal, setInternal] =
|
|
2710
|
+
const [internal, setInternal] = React29.useState(defaultValue);
|
|
2711
2711
|
const current = isControlled ? value : internal;
|
|
2712
2712
|
const handle = (v) => {
|
|
2713
2713
|
if (!v) return;
|
|
@@ -2868,22 +2868,22 @@ function Scheduler({
|
|
|
2868
2868
|
style
|
|
2869
2869
|
}) {
|
|
2870
2870
|
const reduced = framerMotion.useReducedMotion();
|
|
2871
|
-
const [view, setView] =
|
|
2872
|
-
const [cursor, setCursor] =
|
|
2873
|
-
const [loaded, setLoaded] =
|
|
2874
|
-
const [loading, setLoading] =
|
|
2875
|
-
const [error, setError] =
|
|
2876
|
-
const [reloadKey, setReloadKey] =
|
|
2877
|
-
const [dir, setDir] =
|
|
2878
|
-
const cbRef =
|
|
2871
|
+
const [view, setView] = React29.useState(defaultView);
|
|
2872
|
+
const [cursor, setCursor] = React29.useState(() => defaultDate ?? /* @__PURE__ */ new Date());
|
|
2873
|
+
const [loaded, setLoaded] = React29.useState([]);
|
|
2874
|
+
const [loading, setLoading] = React29.useState(false);
|
|
2875
|
+
const [error, setError] = React29.useState(null);
|
|
2876
|
+
const [reloadKey, setReloadKey] = React29.useState(0);
|
|
2877
|
+
const [dir, setDir] = React29.useState(0);
|
|
2878
|
+
const cbRef = React29.useRef({ loadEvents, onError });
|
|
2879
2879
|
cbRef.current = { loadEvents, onError };
|
|
2880
|
-
const range =
|
|
2880
|
+
const range = React29.useMemo(
|
|
2881
2881
|
() => view === "month" ? monthRange(cursor) : weekRange(cursor, weekStartsOn),
|
|
2882
2882
|
[view, cursor, weekStartsOn]
|
|
2883
2883
|
);
|
|
2884
2884
|
const fromKey = range.from.getTime();
|
|
2885
2885
|
const toKey = range.to.getTime();
|
|
2886
|
-
|
|
2886
|
+
React29.useEffect(() => {
|
|
2887
2887
|
const { loadEvents: loader, onError: onErr } = cbRef.current;
|
|
2888
2888
|
if (!loader) return;
|
|
2889
2889
|
let cancelled = false;
|
|
@@ -2903,16 +2903,16 @@ function Scheduler({
|
|
|
2903
2903
|
cancelled = true;
|
|
2904
2904
|
};
|
|
2905
2905
|
}, [fromKey, toKey, view, reloadKey]);
|
|
2906
|
-
const retry =
|
|
2907
|
-
const events =
|
|
2906
|
+
const retry = React29.useCallback(() => setReloadKey((k) => k + 1), []);
|
|
2907
|
+
const events = React29.useMemo(
|
|
2908
2908
|
() => (controlledEvents ?? loaded).map(normalize),
|
|
2909
2909
|
[controlledEvents, loaded]
|
|
2910
2910
|
);
|
|
2911
|
-
const go =
|
|
2911
|
+
const go = React29.useCallback((delta) => {
|
|
2912
2912
|
setDir(delta);
|
|
2913
2913
|
setCursor((c) => view === "month" ? addMonths(c, delta) : addDays(c, delta * 7));
|
|
2914
2914
|
}, [view]);
|
|
2915
|
-
const goToday =
|
|
2915
|
+
const goToday = React29.useCallback(() => {
|
|
2916
2916
|
setDir(0);
|
|
2917
2917
|
setCursor(/* @__PURE__ */ new Date());
|
|
2918
2918
|
}, []);
|
|
@@ -3022,9 +3022,9 @@ function SchedulerError({ onRetry }) {
|
|
|
3022
3022
|
] });
|
|
3023
3023
|
}
|
|
3024
3024
|
function MonthYearPicker({ label, cursor, onPick }) {
|
|
3025
|
-
const [open, setOpen] =
|
|
3026
|
-
const [viewYear, setViewYear] =
|
|
3027
|
-
|
|
3025
|
+
const [open, setOpen] = React29.useState(false);
|
|
3026
|
+
const [viewYear, setViewYear] = React29.useState(cursor.getFullYear());
|
|
3027
|
+
React29.useEffect(() => {
|
|
3028
3028
|
if (open) setViewYear(cursor.getFullYear());
|
|
3029
3029
|
}, [open, cursor]);
|
|
3030
3030
|
return /* @__PURE__ */ jsxRuntime.jsxs(Popover__namespace.Root, { open, onOpenChange: setOpen, children: [
|
|
@@ -3098,8 +3098,8 @@ function MonthView({
|
|
|
3098
3098
|
onSelectSlot,
|
|
3099
3099
|
onSelectEvent
|
|
3100
3100
|
}) {
|
|
3101
|
-
const grid =
|
|
3102
|
-
const eventsByDay =
|
|
3101
|
+
const grid = React29.useMemo(() => buildMonthGrid(cursor, weekStartsOn), [cursor, weekStartsOn]);
|
|
3102
|
+
const eventsByDay = React29.useMemo(() => bucketByDay(events), [events]);
|
|
3103
3103
|
const labels = weekdayLabels(weekStartsOn);
|
|
3104
3104
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex h-full flex-col", children: [
|
|
3105
3105
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "grid grid-cols-7 border-b border-border", children: labels.map((l) => /* @__PURE__ */ jsxRuntime.jsx("div", { className: "px-2 py-1.5 text-center text-[11px] font-medium uppercase tracking-wide text-foreground-muted", children: l }, l)) }),
|
|
@@ -3173,12 +3173,12 @@ function WeekView({
|
|
|
3173
3173
|
onSelectSlot,
|
|
3174
3174
|
onSelectEvent
|
|
3175
3175
|
}) {
|
|
3176
|
-
const days =
|
|
3177
|
-
const eventsByDay =
|
|
3178
|
-
const labels =
|
|
3176
|
+
const days = React29.useMemo(() => getWeekDays(cursor, weekStartsOn), [cursor, weekStartsOn]);
|
|
3177
|
+
const eventsByDay = React29.useMemo(() => bucketByDay(events), [events]);
|
|
3178
|
+
const labels = React29.useMemo(() => weekdayLabels(weekStartsOn), [weekStartsOn]);
|
|
3179
3179
|
const dow = (d) => labels[(d.getDay() - weekStartsOn + 7) % 7];
|
|
3180
3180
|
const [startHour, endHour] = dayHours;
|
|
3181
|
-
const hours =
|
|
3181
|
+
const hours = React29.useMemo(
|
|
3182
3182
|
() => Array.from({ length: endHour - startHour }, (_, i) => startHour + i),
|
|
3183
3183
|
[startHour, endHour]
|
|
3184
3184
|
);
|
|
@@ -3369,17 +3369,17 @@ function Cart({
|
|
|
3369
3369
|
] })
|
|
3370
3370
|
] });
|
|
3371
3371
|
}
|
|
3372
|
-
var CartContext =
|
|
3372
|
+
var CartContext = React29.createContext(null);
|
|
3373
3373
|
var clampQty = (qty, max) => {
|
|
3374
3374
|
const lower = Math.max(1, Math.round(qty));
|
|
3375
3375
|
return max != null ? Math.min(lower, max) : lower;
|
|
3376
3376
|
};
|
|
3377
3377
|
function CartProvider({ children, initialItems = [], onChange }) {
|
|
3378
|
-
const [items, setItems] =
|
|
3379
|
-
|
|
3378
|
+
const [items, setItems] = React29.useState(initialItems);
|
|
3379
|
+
React29.useEffect(() => {
|
|
3380
3380
|
onChange?.(items);
|
|
3381
3381
|
}, [items]);
|
|
3382
|
-
const addToCart =
|
|
3382
|
+
const addToCart = React29.useCallback((item, quantity) => {
|
|
3383
3383
|
const addQty = quantity ?? item.quantity ?? 1;
|
|
3384
3384
|
setItems((prev) => {
|
|
3385
3385
|
const existing = prev.find((it) => it.id === item.id);
|
|
@@ -3392,29 +3392,29 @@ function CartProvider({ children, initialItems = [], onChange }) {
|
|
|
3392
3392
|
return [...prev, { ...rest, quantity: clampQty(addQty, item.max) }];
|
|
3393
3393
|
});
|
|
3394
3394
|
}, []);
|
|
3395
|
-
const removeFromCart =
|
|
3395
|
+
const removeFromCart = React29.useCallback((id) => {
|
|
3396
3396
|
setItems((prev) => prev.filter((it) => it.id !== id));
|
|
3397
3397
|
}, []);
|
|
3398
|
-
const updateQuantity =
|
|
3398
|
+
const updateQuantity = React29.useCallback((id, quantity) => {
|
|
3399
3399
|
setItems(
|
|
3400
3400
|
(prev) => prev.map((it) => it.id === id ? { ...it, quantity: clampQty(quantity, it.max) } : it)
|
|
3401
3401
|
);
|
|
3402
3402
|
}, []);
|
|
3403
|
-
const clearCart =
|
|
3404
|
-
const isInCart =
|
|
3405
|
-
const getItemCount =
|
|
3406
|
-
const getCartTotal =
|
|
3403
|
+
const clearCart = React29.useCallback(() => setItems([]), []);
|
|
3404
|
+
const isInCart = React29.useCallback((id) => items.some((it) => it.id === id), [items]);
|
|
3405
|
+
const getItemCount = React29.useCallback(() => items.reduce((sum, it) => sum + it.quantity, 0), [items]);
|
|
3406
|
+
const getCartTotal = React29.useCallback(
|
|
3407
3407
|
() => items.reduce((sum, it) => sum + it.price * it.quantity, 0),
|
|
3408
3408
|
[items]
|
|
3409
3409
|
);
|
|
3410
|
-
const value =
|
|
3410
|
+
const value = React29.useMemo(
|
|
3411
3411
|
() => ({ items, addToCart, removeFromCart, updateQuantity, clearCart, isInCart, getItemCount, getCartTotal }),
|
|
3412
3412
|
[items, addToCart, removeFromCart, updateQuantity, clearCart, isInCart, getItemCount, getCartTotal]
|
|
3413
3413
|
);
|
|
3414
3414
|
return /* @__PURE__ */ jsxRuntime.jsx(CartContext.Provider, { value, children });
|
|
3415
3415
|
}
|
|
3416
3416
|
function useCart() {
|
|
3417
|
-
const ctx =
|
|
3417
|
+
const ctx = React29.useContext(CartContext);
|
|
3418
3418
|
if (!ctx) {
|
|
3419
3419
|
throw new Error("useCart must be used within a <CartProvider>.");
|
|
3420
3420
|
}
|
|
@@ -3748,11 +3748,11 @@ function buildBindings(store, name, kind, snap) {
|
|
|
3748
3748
|
|
|
3749
3749
|
// src/form/useForm.ts
|
|
3750
3750
|
function useForm(options = {}) {
|
|
3751
|
-
const ref =
|
|
3751
|
+
const ref = React29.useRef(null);
|
|
3752
3752
|
if (ref.current === null) ref.current = new FormStore(options);
|
|
3753
3753
|
const store = ref.current;
|
|
3754
|
-
|
|
3755
|
-
const make =
|
|
3754
|
+
React29.useSyncExternalStore(store.subscribe, store.getRootSnapshot, store.getRootSnapshot);
|
|
3755
|
+
const make = React29.useCallback(
|
|
3756
3756
|
(kind) => (name, rules) => {
|
|
3757
3757
|
if (rules !== void 0) store.setRule(name, rules);
|
|
3758
3758
|
return buildBindings(store, name, kind, store.getFieldSnapshot(name));
|
|
@@ -3781,9 +3781,9 @@ function useForm(options = {}) {
|
|
|
3781
3781
|
fieldTarget: make("target")
|
|
3782
3782
|
};
|
|
3783
3783
|
}
|
|
3784
|
-
var FormContext =
|
|
3784
|
+
var FormContext = React29.createContext(null);
|
|
3785
3785
|
function useFormStore() {
|
|
3786
|
-
const store =
|
|
3786
|
+
const store = React29.useContext(FormContext);
|
|
3787
3787
|
if (!store) {
|
|
3788
3788
|
throw new Error("useFormStore must be used within a <Form>. Did you forget to wrap your fields?");
|
|
3789
3789
|
}
|
|
@@ -3797,8 +3797,8 @@ function Form({
|
|
|
3797
3797
|
children,
|
|
3798
3798
|
...rest
|
|
3799
3799
|
}) {
|
|
3800
|
-
const ref =
|
|
3801
|
-
const bypass =
|
|
3800
|
+
const ref = React29.useRef(null);
|
|
3801
|
+
const bypass = React29.useRef(false);
|
|
3802
3802
|
const handleSubmit = async (e) => {
|
|
3803
3803
|
if (bypass.current) {
|
|
3804
3804
|
bypass.current = false;
|
|
@@ -3850,12 +3850,12 @@ function useFormField(name, options = {}) {
|
|
|
3850
3850
|
const store = useFormStore();
|
|
3851
3851
|
const { kind = "value", rules } = options;
|
|
3852
3852
|
if (rules !== void 0 && store.getRule(name) !== rules) store.setRule(name, rules);
|
|
3853
|
-
|
|
3853
|
+
React29.useEffect(() => {
|
|
3854
3854
|
return () => {
|
|
3855
3855
|
if (rules !== void 0) store.removeRule(name);
|
|
3856
3856
|
};
|
|
3857
3857
|
}, [store, name]);
|
|
3858
|
-
const snap =
|
|
3858
|
+
const snap = React29.useSyncExternalStore(
|
|
3859
3859
|
store.subscribe,
|
|
3860
3860
|
() => store.getFieldSnapshot(name)
|
|
3861
3861
|
);
|
|
@@ -3867,7 +3867,7 @@ function FormField({ name, kind, rules, children }) {
|
|
|
3867
3867
|
}
|
|
3868
3868
|
function useFieldArray(name) {
|
|
3869
3869
|
const store = useFormStore();
|
|
3870
|
-
|
|
3870
|
+
React29.useSyncExternalStore(store.subscribe, store.getRootSnapshot, store.getRootSnapshot);
|
|
3871
3871
|
const arr = store.getValue(name) ?? [];
|
|
3872
3872
|
const keys = store.getKeys(name);
|
|
3873
3873
|
return {
|
|
@@ -3900,7 +3900,7 @@ function TextInput({
|
|
|
3900
3900
|
suffix,
|
|
3901
3901
|
id
|
|
3902
3902
|
}) {
|
|
3903
|
-
const errorId =
|
|
3903
|
+
const errorId = React29.useId();
|
|
3904
3904
|
const hasError = errorMessage != null;
|
|
3905
3905
|
const hasAdornment = prefix != null || suffix != null;
|
|
3906
3906
|
const inputId = htmlFor ?? id;
|
|
@@ -4061,7 +4061,7 @@ function CreditCardForm({
|
|
|
4061
4061
|
className = "",
|
|
4062
4062
|
style
|
|
4063
4063
|
}) {
|
|
4064
|
-
const initial =
|
|
4064
|
+
const initial = React29.useRef({
|
|
4065
4065
|
number: formatCardNumber(defaultValue?.number ?? ""),
|
|
4066
4066
|
name: defaultValue?.name ?? "",
|
|
4067
4067
|
expiry: formatExpiry(defaultValue?.expiry ?? ""),
|
|
@@ -4070,7 +4070,7 @@ function CreditCardForm({
|
|
|
4070
4070
|
const form = useForm({ initialValues: initial });
|
|
4071
4071
|
const numberStr = String(form.values.number ?? "");
|
|
4072
4072
|
const brand = detectBrand(numberStr);
|
|
4073
|
-
|
|
4073
|
+
React29.useEffect(() => {
|
|
4074
4074
|
onChange?.(toCard(form.values));
|
|
4075
4075
|
}, [form.values.number, form.values.name, form.values.expiry, form.values.cvv]);
|
|
4076
4076
|
const numberBind = form.fieldNative("number", {
|
|
@@ -4193,7 +4193,7 @@ function Checkout({
|
|
|
4193
4193
|
] })
|
|
4194
4194
|
] });
|
|
4195
4195
|
}
|
|
4196
|
-
var NotificationContext =
|
|
4196
|
+
var NotificationContext = React29.createContext({
|
|
4197
4197
|
open: () => void 0,
|
|
4198
4198
|
close: () => void 0
|
|
4199
4199
|
});
|
|
@@ -4251,26 +4251,26 @@ function NotificationItem({
|
|
|
4251
4251
|
onClose,
|
|
4252
4252
|
reduced
|
|
4253
4253
|
}) {
|
|
4254
|
-
const [paused, setPaused] =
|
|
4254
|
+
const [paused, setPaused] = React29.useState(false);
|
|
4255
4255
|
const duration = n.duration ?? 4e3;
|
|
4256
4256
|
const isAutoDismissing = isFinite(duration) && duration > 0;
|
|
4257
4257
|
const showProgress = !reduced && isAutoDismissing;
|
|
4258
|
-
const timerRef =
|
|
4259
|
-
const startTimeRef =
|
|
4260
|
-
const remainingRef =
|
|
4261
|
-
const clearTimer =
|
|
4258
|
+
const timerRef = React29.useRef(null);
|
|
4259
|
+
const startTimeRef = React29.useRef(0);
|
|
4260
|
+
const remainingRef = React29.useRef(duration);
|
|
4261
|
+
const clearTimer = React29.useCallback(() => {
|
|
4262
4262
|
if (timerRef.current !== null) {
|
|
4263
4263
|
clearTimeout(timerRef.current);
|
|
4264
4264
|
timerRef.current = null;
|
|
4265
4265
|
}
|
|
4266
4266
|
}, []);
|
|
4267
|
-
const scheduleDismiss =
|
|
4267
|
+
const scheduleDismiss = React29.useCallback((ms) => {
|
|
4268
4268
|
clearTimer();
|
|
4269
4269
|
if (!isAutoDismissing) return;
|
|
4270
4270
|
startTimeRef.current = Date.now();
|
|
4271
4271
|
timerRef.current = setTimeout(() => onClose(n.id), ms);
|
|
4272
4272
|
}, [clearTimer, isAutoDismissing, n.id, onClose]);
|
|
4273
|
-
|
|
4273
|
+
React29.useEffect(() => {
|
|
4274
4274
|
if (paused || !isAutoDismissing) return;
|
|
4275
4275
|
scheduleDismiss(remainingRef.current);
|
|
4276
4276
|
return clearTimer;
|
|
@@ -4353,15 +4353,15 @@ function NotificationProvider({
|
|
|
4353
4353
|
children,
|
|
4354
4354
|
position = "top-right"
|
|
4355
4355
|
}) {
|
|
4356
|
-
const [notifications, setNotifications] =
|
|
4356
|
+
const [notifications, setNotifications] = React29.useState([]);
|
|
4357
4357
|
const reduced = framerMotion.useReducedMotion();
|
|
4358
|
-
const open =
|
|
4358
|
+
const open = React29.useCallback((payload) => {
|
|
4359
4359
|
setNotifications((prev) => [
|
|
4360
4360
|
...prev,
|
|
4361
4361
|
{ duration: 4e3, ...payload, id: Date.now() + Math.random() }
|
|
4362
4362
|
]);
|
|
4363
4363
|
}, []);
|
|
4364
|
-
const close =
|
|
4364
|
+
const close = React29.useCallback((id) => {
|
|
4365
4365
|
setNotifications((prev) => prev.filter((n) => n.id !== id));
|
|
4366
4366
|
}, []);
|
|
4367
4367
|
return /* @__PURE__ */ jsxRuntime.jsxs(NotificationContext.Provider, { value: { open, close }, children: [
|
|
@@ -4390,7 +4390,7 @@ function NotificationProvider({
|
|
|
4390
4390
|
] });
|
|
4391
4391
|
}
|
|
4392
4392
|
function useNotification() {
|
|
4393
|
-
const { open } =
|
|
4393
|
+
const { open } = React29.useContext(NotificationContext);
|
|
4394
4394
|
return {
|
|
4395
4395
|
info: (props) => open({ type: "info", ...props }),
|
|
4396
4396
|
success: (props) => open({ type: "success", ...props }),
|
|
@@ -4507,10 +4507,10 @@ function FadingBase({
|
|
|
4507
4507
|
isMounted = false,
|
|
4508
4508
|
children
|
|
4509
4509
|
}) {
|
|
4510
|
-
const [shouldRender, setShouldRender] =
|
|
4511
|
-
const [visible, setVisible] =
|
|
4512
|
-
const timerRef =
|
|
4513
|
-
|
|
4510
|
+
const [shouldRender, setShouldRender] = React29.useState(isMounted);
|
|
4511
|
+
const [visible, setVisible] = React29.useState(false);
|
|
4512
|
+
const timerRef = React29.useRef(null);
|
|
4513
|
+
React29.useEffect(() => {
|
|
4514
4514
|
if (isMounted) {
|
|
4515
4515
|
setShouldRender(true);
|
|
4516
4516
|
const rafId = requestAnimationFrame(() => setVisible(true));
|
|
@@ -4608,8 +4608,8 @@ function ScalableContainer({
|
|
|
4608
4608
|
togglePosition = "top-right",
|
|
4609
4609
|
className = ""
|
|
4610
4610
|
}) {
|
|
4611
|
-
const containerRef =
|
|
4612
|
-
const [internalScaled, setInternalScaled] =
|
|
4611
|
+
const containerRef = React29.useRef(null);
|
|
4612
|
+
const [internalScaled, setInternalScaled] = React29.useState(false);
|
|
4613
4613
|
const isScaled = expanded ?? internalScaled;
|
|
4614
4614
|
const reduced = framerMotion.useReducedMotion();
|
|
4615
4615
|
const onToggle = () => {
|
|
@@ -4747,17 +4747,17 @@ function CatalogGrid({ items, buttonText, onOpen, className = "" }) {
|
|
|
4747
4747
|
return /* @__PURE__ */ jsxRuntime.jsx("div", { className: `flex flex-wrap gap-2 ${className}`.trim(), children: items.map((item) => /* @__PURE__ */ jsxRuntime.jsx(GridCard, { item, buttonText, onOpen }, item.key)) });
|
|
4748
4748
|
}
|
|
4749
4749
|
function CatalogCarousel({ items, buttonText, onOpen, className = "" }) {
|
|
4750
|
-
const [activeIndex, setActiveIndex] =
|
|
4751
|
-
const [indexPool, setIndexPool] =
|
|
4752
|
-
const cardRefs =
|
|
4753
|
-
const getIndexes =
|
|
4750
|
+
const [activeIndex, setActiveIndex] = React29.useState(0);
|
|
4751
|
+
const [indexPool, setIndexPool] = React29.useState([]);
|
|
4752
|
+
const cardRefs = React29.useRef([]);
|
|
4753
|
+
const getIndexes = React29.useMemo(() => {
|
|
4754
4754
|
let nextIndex = activeIndex + 1;
|
|
4755
4755
|
let previousIndex = activeIndex - 1;
|
|
4756
4756
|
if (activeIndex === 0) previousIndex = items.length - 1;
|
|
4757
4757
|
if (activeIndex === items.length - 1) nextIndex = 0;
|
|
4758
4758
|
return { previousIndex, nextIndex };
|
|
4759
4759
|
}, [activeIndex, items.length]);
|
|
4760
|
-
|
|
4760
|
+
React29.useEffect(() => {
|
|
4761
4761
|
const { nextIndex, previousIndex } = getIndexes;
|
|
4762
4762
|
let indexes = [previousIndex, activeIndex, nextIndex];
|
|
4763
4763
|
if (activeIndex !== 0 && activeIndex !== items.length - 1) {
|
|
@@ -4930,8 +4930,8 @@ function writeDismissed(key) {
|
|
|
4930
4930
|
}
|
|
4931
4931
|
}
|
|
4932
4932
|
function useTargetBbox(ref) {
|
|
4933
|
-
const [bbox, setBbox] =
|
|
4934
|
-
|
|
4933
|
+
const [bbox, setBbox] = React29.useState(null);
|
|
4934
|
+
React29.useLayoutEffect(() => {
|
|
4935
4935
|
const el = ref?.current;
|
|
4936
4936
|
if (!el) {
|
|
4937
4937
|
setBbox(null);
|
|
@@ -4961,7 +4961,7 @@ function tooltipStyleFor(bbox, placement) {
|
|
|
4961
4961
|
return { left: bbox.left + bbox.width / 2, top: bbox.top - TOOLTIP_GAP, transform: "translate(-50%, -100%)", width: TOOLTIP_WIDTH };
|
|
4962
4962
|
}
|
|
4963
4963
|
function useFocusTrap(containerRef, active) {
|
|
4964
|
-
|
|
4964
|
+
React29.useEffect(() => {
|
|
4965
4965
|
if (!active) return;
|
|
4966
4966
|
const el = containerRef.current;
|
|
4967
4967
|
if (!el) return;
|
|
@@ -5000,16 +5000,16 @@ function Wizard({
|
|
|
5000
5000
|
onComplete,
|
|
5001
5001
|
onSkip
|
|
5002
5002
|
}) {
|
|
5003
|
-
const tooltipRef =
|
|
5004
|
-
const tooltipTitleId =
|
|
5005
|
-
const tooltipBodyId =
|
|
5003
|
+
const tooltipRef = React29.useRef(null);
|
|
5004
|
+
const tooltipTitleId = React29.useId();
|
|
5005
|
+
const tooltipBodyId = React29.useId();
|
|
5006
5006
|
const reduced = framerMotion.useReducedMotion();
|
|
5007
|
-
const [open, setOpen] =
|
|
5008
|
-
const [activeIndex, setActiveIndex] =
|
|
5007
|
+
const [open, setOpen] = React29.useState(() => steps.length > 0 && !readDismissed(storageKey));
|
|
5008
|
+
const [activeIndex, setActiveIndex] = React29.useState(0);
|
|
5009
5009
|
const step = steps[activeIndex];
|
|
5010
5010
|
const bbox = useTargetBbox(step?.stepRef);
|
|
5011
5011
|
useFocusTrap(tooltipRef, open);
|
|
5012
|
-
|
|
5012
|
+
React29.useEffect(() => {
|
|
5013
5013
|
if (!open || !dismissible) return;
|
|
5014
5014
|
const onKey = (e) => {
|
|
5015
5015
|
if (e.key === "Escape") {
|
|
@@ -5020,12 +5020,12 @@ function Wizard({
|
|
|
5020
5020
|
document.addEventListener("keydown", onKey);
|
|
5021
5021
|
return () => document.removeEventListener("keydown", onKey);
|
|
5022
5022
|
}, [open, dismissible]);
|
|
5023
|
-
const handleSkip =
|
|
5023
|
+
const handleSkip = React29.useCallback(() => {
|
|
5024
5024
|
writeDismissed(storageKey);
|
|
5025
5025
|
setOpen(false);
|
|
5026
5026
|
onSkip?.();
|
|
5027
5027
|
}, [storageKey, onSkip]);
|
|
5028
|
-
const handleComplete =
|
|
5028
|
+
const handleComplete = React29.useCallback(() => {
|
|
5029
5029
|
writeDismissed(storageKey);
|
|
5030
5030
|
setOpen(false);
|
|
5031
5031
|
onComplete?.();
|
|
@@ -5168,7 +5168,7 @@ function Wizard({
|
|
|
5168
5168
|
] });
|
|
5169
5169
|
}
|
|
5170
5170
|
var SearchIcon = /* @__PURE__ */ jsxRuntime.jsx("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", fill: "currentColor", className: "w-4 h-4", "aria-hidden": "true", children: /* @__PURE__ */ jsxRuntime.jsx("path", { fillRule: "evenodd", d: "M10.5 3.75a6.75 6.75 0 100 13.5 6.75 6.75 0 000-13.5zM2.25 10.5a8.25 8.25 0 1114.59 5.28l4.69 4.69a.75.75 0 11-1.06 1.06l-4.69-4.69A8.25 8.25 0 012.25 10.5z", clipRule: "evenodd" }) });
|
|
5171
|
-
var SearchInput =
|
|
5171
|
+
var SearchInput = React29__default.default.forwardRef(function SearchInput2({ value, onChange, disabled, label, htmlFor, placeholder, name, inputStyle, style, layout = "vertical", size = "md", icon, helperText, className }, ref) {
|
|
5172
5172
|
return /* @__PURE__ */ jsxRuntime.jsx(Field, { className, label, htmlFor, layout, helperText, children: /* @__PURE__ */ jsxRuntime.jsxs(
|
|
5173
5173
|
"div",
|
|
5174
5174
|
{
|
|
@@ -5403,7 +5403,7 @@ function EditableCell({
|
|
|
5403
5403
|
rowIndex,
|
|
5404
5404
|
onCellEdit
|
|
5405
5405
|
}) {
|
|
5406
|
-
const [editing, setEditing] =
|
|
5406
|
+
const [editing, setEditing] = React29.useState(false);
|
|
5407
5407
|
const value = row[col.keyBind];
|
|
5408
5408
|
const commit = (next) => {
|
|
5409
5409
|
setEditing(false);
|
|
@@ -5416,6 +5416,7 @@ function EditableCell({
|
|
|
5416
5416
|
"input",
|
|
5417
5417
|
{
|
|
5418
5418
|
autoFocus: true,
|
|
5419
|
+
size: 1,
|
|
5419
5420
|
defaultValue: value == null ? "" : String(value),
|
|
5420
5421
|
onBlur: (e) => commit(e.target.value),
|
|
5421
5422
|
onKeyDown: (e) => {
|
|
@@ -5428,7 +5429,7 @@ function EditableCell({
|
|
|
5428
5429
|
}
|
|
5429
5430
|
},
|
|
5430
5431
|
"aria-label": `Edit ${typeof col.label === "string" ? col.label : col.keyBind}`,
|
|
5431
|
-
className: "w-full rounded border border-accent bg-surface px-2 py-1 text-sm text-foreground outline-none"
|
|
5432
|
+
className: "box-border w-full min-w-0 rounded border border-accent bg-surface px-2 py-1 text-sm text-foreground outline-none"
|
|
5432
5433
|
}
|
|
5433
5434
|
);
|
|
5434
5435
|
}
|
|
@@ -5450,7 +5451,7 @@ function TableBody({
|
|
|
5450
5451
|
getRowKey,
|
|
5451
5452
|
onCellEdit
|
|
5452
5453
|
}) {
|
|
5453
|
-
const [expanded, setExpanded] =
|
|
5454
|
+
const [expanded, setExpanded] = React29.useState(() => /* @__PURE__ */ new Set());
|
|
5454
5455
|
const reduced = framerMotion.useReducedMotion();
|
|
5455
5456
|
const toggleRow = (rowKey) => {
|
|
5456
5457
|
setExpanded((prev) => {
|
|
@@ -5465,7 +5466,7 @@ function TableBody({
|
|
|
5465
5466
|
return /* @__PURE__ */ jsxRuntime.jsx("tbody", { children: rows.map((row, i) => {
|
|
5466
5467
|
const rowKey = getRowKey(row, i);
|
|
5467
5468
|
const isExpanded = expanded.has(rowKey);
|
|
5468
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
5469
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(React29__default.default.Fragment, { children: [
|
|
5469
5470
|
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
5470
5471
|
"tr",
|
|
5471
5472
|
{
|
|
@@ -5478,7 +5479,7 @@ function TableBody({
|
|
|
5478
5479
|
onClick: () => toggleRow(rowKey),
|
|
5479
5480
|
"aria-expanded": isExpanded,
|
|
5480
5481
|
"aria-label": isExpanded ? "Collapse row" : "Expand row",
|
|
5481
|
-
className: `w-9 h-9 inline-flex items-center justify-center rounded-md hover:
|
|
5482
|
+
className: `w-9 h-9 inline-flex items-center justify-center rounded-md text-foreground-muted hover:text-foreground transition-[transform,color] duration-200 focus:outline-none focus-visible:ring-2 focus-visible:ring-accent ${isExpanded && !expandRow.collapseIcon ? "rotate-180" : ""}`,
|
|
5482
5483
|
children: isExpanded ? expandRow.collapseIcon ?? expandRow.expandIcon ?? DefaultExpandIcon : expandRow.expandIcon ?? DefaultExpandIcon
|
|
5483
5484
|
}
|
|
5484
5485
|
) }),
|
|
@@ -5521,9 +5522,9 @@ function Pagination({
|
|
|
5521
5522
|
const matchedOption = picker.find(
|
|
5522
5523
|
(o) => o.label === options.perPage || o.value === options.perPage
|
|
5523
5524
|
);
|
|
5524
|
-
const [perPageKey, setPerPageKey] =
|
|
5525
|
+
const [perPageKey, setPerPageKey] = React29.useState(() => matchedOption?.key ?? picker[0]?.key);
|
|
5525
5526
|
const displayPerPageKey = serverSide ? matchedOption?.key ?? perPageKey : perPageKey;
|
|
5526
|
-
|
|
5527
|
+
React29.useEffect(() => {
|
|
5527
5528
|
if (serverSide && options.perPage != null) {
|
|
5528
5529
|
const next = picker.find((o) => o.label === options.perPage || o.value === options.perPage);
|
|
5529
5530
|
if (next) setPerPageKey(next.key);
|
|
@@ -5536,7 +5537,7 @@ function Pagination({
|
|
|
5536
5537
|
const chevronRight = /* @__PURE__ */ jsxRuntime.jsx("svg", { "aria-hidden": "true", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: 2, className: "h-4 w-4", children: /* @__PURE__ */ jsxRuntime.jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M9 6l6 6-6 6" }) });
|
|
5537
5538
|
const doubleChevronRight = /* @__PURE__ */ jsxRuntime.jsx("svg", { "aria-hidden": "true", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: 2, className: "h-4 w-4", children: /* @__PURE__ */ jsxRuntime.jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", d: "M6 6l6 6-6 6M12 6l6 6-6 6" }) });
|
|
5538
5539
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-wrap items-center justify-end gap-x-4 gap-y-3", children: [
|
|
5539
|
-
options.withPicker && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mr-auto flex items-center gap-2", children: [
|
|
5540
|
+
options.withPicker !== false && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mr-auto flex items-center gap-2", children: [
|
|
5540
5541
|
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "whitespace-nowrap text-xs text-foreground-muted", children: "Rows per page" }),
|
|
5541
5542
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
5542
5543
|
MenuButton,
|
|
@@ -5591,13 +5592,13 @@ function Table({
|
|
|
5591
5592
|
className = "",
|
|
5592
5593
|
style
|
|
5593
5594
|
}) {
|
|
5594
|
-
const searchRef =
|
|
5595
|
-
const [searchTerm, setSearchTerm] =
|
|
5596
|
-
const [perPage, setPerPage] =
|
|
5595
|
+
const searchRef = React29.useRef(null);
|
|
5596
|
+
const [searchTerm, setSearchTerm] = React29.useState("");
|
|
5597
|
+
const [perPage, setPerPage] = React29.useState(
|
|
5597
5598
|
typeof pagination.perPage === "number" ? pagination.perPage : 15
|
|
5598
5599
|
);
|
|
5599
|
-
const [activePage, setActivePage] =
|
|
5600
|
-
const [sortState, setSortState] =
|
|
5600
|
+
const [activePage, setActivePage] = React29.useState(0);
|
|
5601
|
+
const [sortState, setSortState] = React29.useState(defaultSort);
|
|
5601
5602
|
const isServerSide = !!(pagination.enabled && pagination.serverSide);
|
|
5602
5603
|
const handleSort = (col) => {
|
|
5603
5604
|
const key = col.keyBind;
|
|
@@ -5609,8 +5610,8 @@ function Table({
|
|
|
5609
5610
|
onSortChange?.(next);
|
|
5610
5611
|
};
|
|
5611
5612
|
const debounceMs = search?.debounceMs ?? 0;
|
|
5612
|
-
const [debouncedTerm, setDebouncedTerm] =
|
|
5613
|
-
|
|
5613
|
+
const [debouncedTerm, setDebouncedTerm] = React29.useState("");
|
|
5614
|
+
React29.useEffect(() => {
|
|
5614
5615
|
if (debounceMs <= 0) {
|
|
5615
5616
|
setDebouncedTerm(searchTerm);
|
|
5616
5617
|
return;
|
|
@@ -5619,7 +5620,7 @@ function Table({
|
|
|
5619
5620
|
return () => clearTimeout(t);
|
|
5620
5621
|
}, [searchTerm, debounceMs]);
|
|
5621
5622
|
const term = debounceMs > 0 ? debouncedTerm : searchTerm;
|
|
5622
|
-
const filteredRows =
|
|
5623
|
+
const filteredRows = React29.useMemo(() => {
|
|
5623
5624
|
if (isServerSide || !term) return rows;
|
|
5624
5625
|
if (search?.predicate) return rows.filter((row) => search.predicate(row, term));
|
|
5625
5626
|
const cs = !!search?.caseSensitive;
|
|
@@ -5633,7 +5634,7 @@ function Table({
|
|
|
5633
5634
|
};
|
|
5634
5635
|
return rows.filter((row) => keys ? keys.some((k) => test(row[k])) : Object.values(row).some(test));
|
|
5635
5636
|
}, [rows, term, isServerSide, search?.predicate, search?.caseSensitive, search?.matchMode, search?.keys]);
|
|
5636
|
-
const sortedRows =
|
|
5637
|
+
const sortedRows = React29.useMemo(() => {
|
|
5637
5638
|
if (isServerSide || !sortState) return filteredRows;
|
|
5638
5639
|
const col = columns.find((c) => c.keyBind === sortState.key);
|
|
5639
5640
|
const accessor = col?.sortAccessor ?? ((r) => r[sortState.key]);
|
|
@@ -5641,29 +5642,29 @@ function Table({
|
|
|
5641
5642
|
if (sortState.direction === "desc") out.reverse();
|
|
5642
5643
|
return out;
|
|
5643
5644
|
}, [filteredRows, sortState, isServerSide, columns]);
|
|
5644
|
-
const datasets =
|
|
5645
|
+
const datasets = React29.useMemo(() => {
|
|
5645
5646
|
if (isServerSide) return [rows];
|
|
5646
5647
|
return createDatasets(sortedRows, pagination.enabled ? perPage : null);
|
|
5647
5648
|
}, [sortedRows, perPage, pagination.enabled, isServerSide, rows]);
|
|
5648
|
-
const MAX_PAGE =
|
|
5649
|
+
const MAX_PAGE = React29.useMemo(() => {
|
|
5649
5650
|
if (isServerSide && typeof pagination.maxPage === "number") return Math.max(0, pagination.maxPage);
|
|
5650
5651
|
if (isServerSide && typeof pagination.totalCount === "number")
|
|
5651
5652
|
return Math.max(0, Math.ceil(pagination.totalCount / perPage) - 1);
|
|
5652
5653
|
return datasets.length ? datasets.length - 1 : 0;
|
|
5653
5654
|
}, [isServerSide, pagination.maxPage, pagination.totalCount, perPage, datasets.length]);
|
|
5654
|
-
const currentPageRows =
|
|
5655
|
+
const currentPageRows = React29.useMemo(() => {
|
|
5655
5656
|
if (isServerSide) return rows;
|
|
5656
5657
|
return datasets[activePage] ?? [];
|
|
5657
5658
|
}, [isServerSide, rows, datasets, activePage]);
|
|
5658
|
-
|
|
5659
|
+
React29.useEffect(() => {
|
|
5659
5660
|
if (pagination.enabled && !isServerSide && typeof pagination.perPage === "number") {
|
|
5660
5661
|
setPerPage(pagination.perPage);
|
|
5661
5662
|
}
|
|
5662
5663
|
}, [pagination.enabled, pagination.perPage, isServerSide]);
|
|
5663
|
-
|
|
5664
|
+
React29.useEffect(() => {
|
|
5664
5665
|
if (isServerSide && typeof pagination.perPage === "number") setPerPage(pagination.perPage);
|
|
5665
5666
|
}, [isServerSide, pagination.perPage]);
|
|
5666
|
-
|
|
5667
|
+
React29.useEffect(() => {
|
|
5667
5668
|
if (isServerSide && typeof pagination.page === "number" && pagination.page >= 1)
|
|
5668
5669
|
setActivePage(pagination.page - 1);
|
|
5669
5670
|
}, [isServerSide, pagination.page]);
|
|
@@ -5752,8 +5753,86 @@ function TableSkeletonBody({
|
|
|
5752
5753
|
i
|
|
5753
5754
|
)) });
|
|
5754
5755
|
}
|
|
5756
|
+
var useIsoLayoutEffect = typeof window !== "undefined" ? React29.useLayoutEffect : React29.useEffect;
|
|
5757
|
+
function VirtualList({
|
|
5758
|
+
items,
|
|
5759
|
+
rowHeight,
|
|
5760
|
+
renderItem: renderItem2,
|
|
5761
|
+
height = 400,
|
|
5762
|
+
getKey,
|
|
5763
|
+
overscan = 6,
|
|
5764
|
+
searchable = false,
|
|
5765
|
+
searchKeys,
|
|
5766
|
+
filter,
|
|
5767
|
+
searchPlaceholder = "Search\u2026",
|
|
5768
|
+
emptyState = "No results",
|
|
5769
|
+
"aria-label": ariaLabel = "List",
|
|
5770
|
+
className = "",
|
|
5771
|
+
style
|
|
5772
|
+
}) {
|
|
5773
|
+
const scrollRef = React29.useRef(null);
|
|
5774
|
+
const [scrollTop, setScrollTop] = React29.useState(0);
|
|
5775
|
+
const [viewport, setViewport] = React29.useState(typeof height === "number" ? height : 400);
|
|
5776
|
+
const [term, setTerm] = React29.useState("");
|
|
5777
|
+
useIsoLayoutEffect(() => {
|
|
5778
|
+
const el = scrollRef.current;
|
|
5779
|
+
if (!el) return;
|
|
5780
|
+
const measure = () => setViewport(el.clientHeight);
|
|
5781
|
+
measure();
|
|
5782
|
+
if (typeof ResizeObserver === "undefined") return;
|
|
5783
|
+
const ro = new ResizeObserver(measure);
|
|
5784
|
+
ro.observe(el);
|
|
5785
|
+
return () => ro.disconnect();
|
|
5786
|
+
}, []);
|
|
5787
|
+
const filtered = React29.useMemo(() => {
|
|
5788
|
+
if (!searchable || !term) return items;
|
|
5789
|
+
if (filter) return items.filter((it) => filter(it, term));
|
|
5790
|
+
const needle = term.toLowerCase();
|
|
5791
|
+
return items.filter((it) => {
|
|
5792
|
+
if (searchKeys) return searchKeys.some((k) => String(it[k] ?? "").toLowerCase().includes(needle));
|
|
5793
|
+
return String(it).toLowerCase().includes(needle);
|
|
5794
|
+
});
|
|
5795
|
+
}, [items, searchable, term, filter, searchKeys]);
|
|
5796
|
+
const total = filtered.length * rowHeight;
|
|
5797
|
+
const startIndex = Math.max(0, Math.floor(scrollTop / rowHeight) - overscan);
|
|
5798
|
+
const endIndex = Math.min(filtered.length, Math.ceil((scrollTop + viewport) / rowHeight) + overscan);
|
|
5799
|
+
const offsetY = startIndex * rowHeight;
|
|
5800
|
+
const visible = filtered.slice(startIndex, endIndex);
|
|
5801
|
+
const onSearch = (e) => {
|
|
5802
|
+
setTerm(e.target.value);
|
|
5803
|
+
setScrollTop(0);
|
|
5804
|
+
if (scrollRef.current) scrollRef.current.scrollTop = 0;
|
|
5805
|
+
};
|
|
5806
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cx("flex w-full flex-col gap-2", className), style, children: [
|
|
5807
|
+
searchable && /* @__PURE__ */ jsxRuntime.jsx(SearchInput_default, { value: term, onChange: onSearch, placeholder: searchPlaceholder }),
|
|
5808
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
5809
|
+
"div",
|
|
5810
|
+
{
|
|
5811
|
+
ref: scrollRef,
|
|
5812
|
+
onScroll: (e) => setScrollTop(e.currentTarget.scrollTop),
|
|
5813
|
+
role: "list",
|
|
5814
|
+
"aria-label": ariaLabel,
|
|
5815
|
+
className: "relative overflow-y-auto rounded-lg border border-border bg-surface",
|
|
5816
|
+
style: { height },
|
|
5817
|
+
children: filtered.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex h-full items-center justify-center p-6 text-sm text-foreground-muted", children: emptyState }) : /* @__PURE__ */ jsxRuntime.jsx("div", { style: { height: total, position: "relative" }, children: /* @__PURE__ */ jsxRuntime.jsx("div", { style: { transform: `translateY(${offsetY}px)` }, children: visible.map((item, i) => {
|
|
5818
|
+
const index = startIndex + i;
|
|
5819
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
5820
|
+
"div",
|
|
5821
|
+
{
|
|
5822
|
+
role: "listitem",
|
|
5823
|
+
style: { height: rowHeight },
|
|
5824
|
+
className: "box-border",
|
|
5825
|
+
children: renderItem2(item, index)
|
|
5826
|
+
},
|
|
5827
|
+
getKey ? getKey(item, index) : index
|
|
5828
|
+
);
|
|
5829
|
+
}) }) })
|
|
5830
|
+
}
|
|
5831
|
+
)
|
|
5832
|
+
] });
|
|
5833
|
+
}
|
|
5755
5834
|
function ThemeSwitch({ checked, onChange, label = "Toggle dark mode", className = "" }) {
|
|
5756
|
-
const id =
|
|
5835
|
+
const id = React29.useId();
|
|
5757
5836
|
return /* @__PURE__ */ jsxRuntime.jsx("label", { htmlFor: id, className: `flex items-center gap-2 cursor-pointer select-none ${className}`.trim(), children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
5758
5837
|
SwitchPrimitive__namespace.Root,
|
|
5759
5838
|
{
|
|
@@ -5937,7 +6016,7 @@ function Sidebar({
|
|
|
5937
6016
|
}
|
|
5938
6017
|
) });
|
|
5939
6018
|
}
|
|
5940
|
-
var MegaMenuContext =
|
|
6019
|
+
var MegaMenuContext = React29.createContext({ align: "start" });
|
|
5941
6020
|
function MegaMenu({
|
|
5942
6021
|
children,
|
|
5943
6022
|
align = "start",
|
|
@@ -5968,7 +6047,7 @@ function MegaMenu({
|
|
|
5968
6047
|
}
|
|
5969
6048
|
var TOP_ITEM = "group/top inline-flex items-center gap-1.5 h-10 px-3 rounded-md text-sm font-medium select-none text-foreground-secondary hover:text-foreground hover:bg-surface-raised data-[state=open]:text-accent data-[active]:text-accent transition-colors focus:outline-none focus-visible:ring-2 focus-visible:ring-accent";
|
|
5970
6049
|
function MegaMenuItem({ label, icon, href, children, className = "" }) {
|
|
5971
|
-
const { align } =
|
|
6050
|
+
const { align } = React29.useContext(MegaMenuContext);
|
|
5972
6051
|
const pos = align === "center" ? "left-1/2 -translate-x-1/2" : align === "end" ? "right-0" : "left-0";
|
|
5973
6052
|
if (!children) {
|
|
5974
6053
|
return /* @__PURE__ */ jsxRuntime.jsx(NavigationMenu__namespace.Item, { children: /* @__PURE__ */ jsxRuntime.jsxs(NavigationMenu__namespace.Link, { href, className: cx(TOP_ITEM, className), children: [
|
|
@@ -6053,8 +6132,8 @@ function MegaMenuLink({ href, icon, description, active, onClick, children, clas
|
|
|
6053
6132
|
function MegaMenuFeatured({ children, className = "" }) {
|
|
6054
6133
|
return /* @__PURE__ */ jsxRuntime.jsx("div", { className: cx("min-w-0 rounded-lg bg-surface-raised border border-border p-4 flex flex-col", className), children });
|
|
6055
6134
|
}
|
|
6056
|
-
var elementsOfType = (children, type) =>
|
|
6057
|
-
(c) =>
|
|
6135
|
+
var elementsOfType = (children, type) => React29__default.default.Children.toArray(children).filter(
|
|
6136
|
+
(c) => React29__default.default.isValidElement(c) && c.type === type
|
|
6058
6137
|
);
|
|
6059
6138
|
var MOBILE_CHEVRON = /* @__PURE__ */ jsxRuntime.jsx(
|
|
6060
6139
|
"svg",
|
|
@@ -6091,9 +6170,9 @@ function MobileLinkRow({ link, onNavigate }) {
|
|
|
6091
6170
|
);
|
|
6092
6171
|
}
|
|
6093
6172
|
function MobilePanel({ panel, onNavigate }) {
|
|
6094
|
-
const nodes =
|
|
6173
|
+
const nodes = React29__default.default.Children.toArray(panel.props.children);
|
|
6095
6174
|
return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-col gap-4 px-2 pb-3 pt-1", children: nodes.map((node, i) => {
|
|
6096
|
-
if (!
|
|
6175
|
+
if (!React29__default.default.isValidElement(node)) return null;
|
|
6097
6176
|
const el = node;
|
|
6098
6177
|
if (el.type === MegaMenuSection) {
|
|
6099
6178
|
const { title, children } = el.props;
|
|
@@ -6112,8 +6191,8 @@ function MegaMenuMobile({
|
|
|
6112
6191
|
children,
|
|
6113
6192
|
label
|
|
6114
6193
|
}) {
|
|
6115
|
-
const [open, setOpen] =
|
|
6116
|
-
const [expanded, setExpanded] =
|
|
6194
|
+
const [open, setOpen] = React29.useState(false);
|
|
6195
|
+
const [expanded, setExpanded] = React29.useState(null);
|
|
6117
6196
|
const items = elementsOfType(children, MegaMenuItem);
|
|
6118
6197
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "md:hidden w-full", children: [
|
|
6119
6198
|
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
@@ -6186,17 +6265,17 @@ function AppShell({
|
|
|
6186
6265
|
children,
|
|
6187
6266
|
className = ""
|
|
6188
6267
|
}) {
|
|
6189
|
-
const [expanded, setExpanded] =
|
|
6190
|
-
const [isMobile, setIsMobile] =
|
|
6191
|
-
const [mobileOpen, setMobileOpen] =
|
|
6192
|
-
|
|
6268
|
+
const [expanded, setExpanded] = React29.useState(sidebarDefaultExpanded);
|
|
6269
|
+
const [isMobile, setIsMobile] = React29.useState(false);
|
|
6270
|
+
const [mobileOpen, setMobileOpen] = React29.useState(false);
|
|
6271
|
+
React29.useEffect(() => {
|
|
6193
6272
|
const mq = window.matchMedia("(max-width: 767px)");
|
|
6194
6273
|
const update = (e) => setIsMobile(e.matches);
|
|
6195
6274
|
update(mq);
|
|
6196
6275
|
mq.addEventListener("change", update);
|
|
6197
6276
|
return () => mq.removeEventListener("change", update);
|
|
6198
6277
|
}, []);
|
|
6199
|
-
|
|
6278
|
+
React29.useEffect(() => {
|
|
6200
6279
|
if (!isMobile) setMobileOpen(false);
|
|
6201
6280
|
}, [isMobile]);
|
|
6202
6281
|
const hasSidebar = sidebarSections.length > 0;
|
|
@@ -6323,7 +6402,7 @@ function SecureLayout({
|
|
|
6323
6402
|
className = ""
|
|
6324
6403
|
}) {
|
|
6325
6404
|
const reduced = framerMotion.useReducedMotion();
|
|
6326
|
-
const cbs =
|
|
6405
|
+
const cbs = React29.useRef({ canAccess, onGranted, onDeny });
|
|
6327
6406
|
cbs.current = { canAccess, onGranted, onDeny };
|
|
6328
6407
|
const rolesKey = JSON.stringify(roles);
|
|
6329
6408
|
const requiredRolesKey = JSON.stringify(requiredRoles);
|
|
@@ -6338,10 +6417,10 @@ function SecureLayout({
|
|
|
6338
6417
|
if (requiredPermissions?.length && !has(permissions, requiredPermissions, requireAllPermissions)) return false;
|
|
6339
6418
|
return true;
|
|
6340
6419
|
};
|
|
6341
|
-
const [state, setState] =
|
|
6420
|
+
const [state, setState] = React29.useState(
|
|
6342
6421
|
() => !passesSync() ? "denied" : canAccess ? "checking" : "granted"
|
|
6343
6422
|
);
|
|
6344
|
-
|
|
6423
|
+
React29.useEffect(() => {
|
|
6345
6424
|
let cancelled = false;
|
|
6346
6425
|
const { canAccess: check, onGranted: granted, onDeny: deny } = cbs.current;
|
|
6347
6426
|
const finish = (ok) => {
|
|
@@ -6502,10 +6581,10 @@ function ThemeProvider({
|
|
|
6502
6581
|
className = "",
|
|
6503
6582
|
style
|
|
6504
6583
|
}) {
|
|
6505
|
-
const id =
|
|
6584
|
+
const id = React29__default.default.useId().replace(/:/g, "");
|
|
6506
6585
|
const scopeClass = `geo-th-${id}`;
|
|
6507
|
-
const divRef =
|
|
6508
|
-
|
|
6586
|
+
const divRef = React29.useRef(null);
|
|
6587
|
+
React29.useEffect(() => {
|
|
6509
6588
|
const el = divRef.current;
|
|
6510
6589
|
if (!el) return;
|
|
6511
6590
|
if (colorScheme === "auto") return;
|
|
@@ -6520,8 +6599,8 @@ function ThemeProvider({
|
|
|
6520
6599
|
}
|
|
6521
6600
|
el.classList.toggle("dark", colorScheme === "dark");
|
|
6522
6601
|
}, [colorScheme]);
|
|
6523
|
-
const lightVars =
|
|
6524
|
-
const darkVarStr =
|
|
6602
|
+
const lightVars = React29.useMemo(() => toCssVars(theme), [theme]);
|
|
6603
|
+
const darkVarStr = React29.useMemo(() => {
|
|
6525
6604
|
if (!darkTheme) return "";
|
|
6526
6605
|
const dvars = toCssVars(darkTheme);
|
|
6527
6606
|
if (!Object.keys(dvars).length) return "";
|
|
@@ -6563,7 +6642,7 @@ function NumberInput({
|
|
|
6563
6642
|
readOnly = false,
|
|
6564
6643
|
precision
|
|
6565
6644
|
}) {
|
|
6566
|
-
const errorId =
|
|
6645
|
+
const errorId = React29.useId();
|
|
6567
6646
|
const hasError = errorMessage != null;
|
|
6568
6647
|
const inferredPrecision = precision ?? (Number.isInteger(step) ? 0 : String(step).split(".")[1]?.length ?? 0);
|
|
6569
6648
|
const round = (n) => {
|
|
@@ -6694,8 +6773,8 @@ function Password({
|
|
|
6694
6773
|
showIcon,
|
|
6695
6774
|
hideIcon
|
|
6696
6775
|
}) {
|
|
6697
|
-
const [visible, setVisible] =
|
|
6698
|
-
const errorId =
|
|
6776
|
+
const [visible, setVisible] = React29.useState(false);
|
|
6777
|
+
const errorId = React29.useId();
|
|
6699
6778
|
const hasError = errorMessage != null;
|
|
6700
6779
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
6701
6780
|
Field,
|
|
@@ -6749,6 +6828,168 @@ function Password({
|
|
|
6749
6828
|
}
|
|
6750
6829
|
);
|
|
6751
6830
|
}
|
|
6831
|
+
var defaultPasswordRules = [
|
|
6832
|
+
{ label: "At least 8 characters", test: (p) => p.length >= 8 },
|
|
6833
|
+
{ label: "A lowercase letter", test: (p) => /[a-z]/.test(p) },
|
|
6834
|
+
{ label: "An uppercase letter", test: (p) => /[A-Z]/.test(p) },
|
|
6835
|
+
{ label: "A number", test: (p) => /\d/.test(p) },
|
|
6836
|
+
{ label: "A symbol", test: (p) => /[^A-Za-z0-9]/.test(p) }
|
|
6837
|
+
];
|
|
6838
|
+
var LABELS = ["", "Weak", "Fair", "Good", "Strong"];
|
|
6839
|
+
function scorePassword(password) {
|
|
6840
|
+
if (!password) return { score: 0, label: "" };
|
|
6841
|
+
let s = 0;
|
|
6842
|
+
if (password.length >= 8) s++;
|
|
6843
|
+
if (/[a-z]/.test(password) && /[A-Z]/.test(password)) s++;
|
|
6844
|
+
if (/\d/.test(password)) s++;
|
|
6845
|
+
if (/[^A-Za-z0-9]/.test(password)) s++;
|
|
6846
|
+
if (password.length >= 12) s++;
|
|
6847
|
+
const lowEntropy = /^(.)\1+$/.test(password) || /^(?:0123456789|abcdefghijklmnopqrstuvwxyz|qwertyuiop)/i.test(password);
|
|
6848
|
+
if (lowEntropy) s = Math.min(s, 1);
|
|
6849
|
+
const score = Math.max(1, Math.min(4, s));
|
|
6850
|
+
return { score, label: LABELS[score] };
|
|
6851
|
+
}
|
|
6852
|
+
var BAR_COLOR = {
|
|
6853
|
+
0: "bg-border",
|
|
6854
|
+
1: "bg-status-error",
|
|
6855
|
+
2: "bg-status-warning",
|
|
6856
|
+
3: "bg-accent",
|
|
6857
|
+
4: "bg-status-success"
|
|
6858
|
+
};
|
|
6859
|
+
var TEXT_COLOR = {
|
|
6860
|
+
0: "text-foreground-muted",
|
|
6861
|
+
1: "text-status-error",
|
|
6862
|
+
2: "text-status-warning",
|
|
6863
|
+
3: "text-accent",
|
|
6864
|
+
4: "text-status-success"
|
|
6865
|
+
};
|
|
6866
|
+
var Tick = ({ ok }) => /* @__PURE__ */ jsxRuntime.jsx("svg", { viewBox: "0 0 20 20", "aria-hidden": "true", className: cx("h-3.5 w-3.5 shrink-0", ok ? "text-status-success" : "text-foreground-muted"), children: ok ? /* @__PURE__ */ jsxRuntime.jsx("path", { fill: "currentColor", fillRule: "evenodd", clipRule: "evenodd", d: "M10 2a8 8 0 1 0 0 16 8 8 0 0 0 0-16Zm3.7 6.3a1 1 0 0 0-1.4-1.4L9 10.18 7.7 8.88a1 1 0 0 0-1.4 1.42l2 2a1 1 0 0 0 1.4 0l4-4Z" }) : /* @__PURE__ */ jsxRuntime.jsx("circle", { cx: "10", cy: "10", r: "2.5", fill: "currentColor" }) });
|
|
6867
|
+
function PasswordStrength({
|
|
6868
|
+
value,
|
|
6869
|
+
scorer = scorePassword,
|
|
6870
|
+
showRequirements = false,
|
|
6871
|
+
rules = defaultPasswordRules,
|
|
6872
|
+
confirmValue,
|
|
6873
|
+
hideMeter = false,
|
|
6874
|
+
className = "",
|
|
6875
|
+
style
|
|
6876
|
+
}) {
|
|
6877
|
+
const { score, label } = React29.useMemo(() => scorer(value), [scorer, value]);
|
|
6878
|
+
const showMatch = confirmValue != null && (value.length > 0 || confirmValue.length > 0);
|
|
6879
|
+
const matches = value.length > 0 && value === confirmValue;
|
|
6880
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cx("flex flex-col gap-2", className), style, "aria-live": "polite", children: [
|
|
6881
|
+
!hideMeter && /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
6882
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex gap-1", role: "meter", "aria-valuemin": 0, "aria-valuemax": 4, "aria-valuenow": score, "aria-label": "Password strength", children: [1, 2, 3, 4].map((seg) => {
|
|
6883
|
+
const active = seg <= score;
|
|
6884
|
+
return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "h-1.5 flex-1 overflow-hidden rounded-full bg-border", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
6885
|
+
"div",
|
|
6886
|
+
{
|
|
6887
|
+
className: cx(
|
|
6888
|
+
"h-full origin-left rounded-full transition-[transform,background-color] duration-300 ease-out motion-reduce:transition-none",
|
|
6889
|
+
score > 0 ? BAR_COLOR[score] : "bg-border"
|
|
6890
|
+
),
|
|
6891
|
+
style: { transform: `scaleX(${active ? 1 : 0})`, transitionDelay: active ? `${(seg - 1) * 70}ms` : "0ms" }
|
|
6892
|
+
}
|
|
6893
|
+
) }, seg);
|
|
6894
|
+
}) }),
|
|
6895
|
+
label && /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "text-xs", children: [
|
|
6896
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-foreground-muted", children: "Strength: " }),
|
|
6897
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: cx("font-medium", TEXT_COLOR[score]), children: label })
|
|
6898
|
+
] })
|
|
6899
|
+
] }),
|
|
6900
|
+
showRequirements && /* @__PURE__ */ jsxRuntime.jsx("ul", { className: "mt-0.5 flex flex-col gap-1", children: rules.map((rule, i) => {
|
|
6901
|
+
const ok = rule.test(value);
|
|
6902
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("li", { className: cx("flex items-center gap-1.5 text-xs", ok ? "text-foreground-secondary" : "text-foreground-muted"), children: [
|
|
6903
|
+
/* @__PURE__ */ jsxRuntime.jsx(Tick, { ok }),
|
|
6904
|
+
rule.label
|
|
6905
|
+
] }, i);
|
|
6906
|
+
}) }),
|
|
6907
|
+
showMatch && /* @__PURE__ */ jsxRuntime.jsxs("p", { className: cx("flex items-center gap-1.5 text-xs font-medium", matches ? "text-status-success" : "text-status-error"), children: [
|
|
6908
|
+
/* @__PURE__ */ jsxRuntime.jsx(Tick, { ok: matches }),
|
|
6909
|
+
matches ? "Passwords match" : "Passwords don\u2019t match"
|
|
6910
|
+
] })
|
|
6911
|
+
] });
|
|
6912
|
+
}
|
|
6913
|
+
var COLS = {
|
|
6914
|
+
1: "grid-cols-1",
|
|
6915
|
+
2: "grid-cols-1 sm:grid-cols-2",
|
|
6916
|
+
3: "grid-cols-1 sm:grid-cols-2 lg:grid-cols-3"
|
|
6917
|
+
};
|
|
6918
|
+
var PAD2 = { sm: "p-3", md: "p-4", lg: "p-5" };
|
|
6919
|
+
var TITLE = { sm: "text-sm", md: "text-sm", lg: "text-base" };
|
|
6920
|
+
var CheckMark = /* @__PURE__ */ jsxRuntime.jsx("svg", { viewBox: "0 0 24 24", fill: "currentColor", "aria-hidden": "true", className: "h-5 w-5 text-accent", children: /* @__PURE__ */ jsxRuntime.jsx("path", { fillRule: "evenodd", clipRule: "evenodd", d: "M12 2.25a9.75 9.75 0 1 0 0 19.5 9.75 9.75 0 0 0 0-19.5Zm4.28 7.53a.75.75 0 0 0-1.06-1.06l-4.97 4.97-1.97-1.97a.75.75 0 1 0-1.06 1.06l2.5 2.5a.75.75 0 0 0 1.06 0l5.5-5.5Z" }) });
|
|
6921
|
+
function RadioTile({
|
|
6922
|
+
options,
|
|
6923
|
+
value,
|
|
6924
|
+
defaultValue,
|
|
6925
|
+
onChange,
|
|
6926
|
+
name,
|
|
6927
|
+
label,
|
|
6928
|
+
columns = 2,
|
|
6929
|
+
size = "md",
|
|
6930
|
+
disabled,
|
|
6931
|
+
required,
|
|
6932
|
+
helperText,
|
|
6933
|
+
errorMessage,
|
|
6934
|
+
className
|
|
6935
|
+
}) {
|
|
6936
|
+
const groupId = React29.useId();
|
|
6937
|
+
const errorId = React29.useId();
|
|
6938
|
+
const hasError = errorMessage != null;
|
|
6939
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
6940
|
+
Field,
|
|
6941
|
+
{
|
|
6942
|
+
className,
|
|
6943
|
+
label,
|
|
6944
|
+
htmlFor: groupId,
|
|
6945
|
+
errorId,
|
|
6946
|
+
errorMessage,
|
|
6947
|
+
required,
|
|
6948
|
+
helperText,
|
|
6949
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
6950
|
+
RadioGroupPrimitive__namespace.Root,
|
|
6951
|
+
{
|
|
6952
|
+
id: groupId,
|
|
6953
|
+
name,
|
|
6954
|
+
value,
|
|
6955
|
+
defaultValue,
|
|
6956
|
+
onValueChange: onChange,
|
|
6957
|
+
disabled,
|
|
6958
|
+
required,
|
|
6959
|
+
"aria-invalid": hasError || void 0,
|
|
6960
|
+
"aria-describedby": hasError ? errorId : void 0,
|
|
6961
|
+
className: cx("grid gap-3", COLS[columns]),
|
|
6962
|
+
children: options.map((opt) => /* @__PURE__ */ jsxRuntime.jsxs(
|
|
6963
|
+
RadioGroupPrimitive__namespace.Item,
|
|
6964
|
+
{
|
|
6965
|
+
value: opt.value,
|
|
6966
|
+
disabled: opt.disabled,
|
|
6967
|
+
className: cx(
|
|
6968
|
+
"group relative flex flex-col gap-1 rounded-xl border bg-surface text-left transition-colors duration-150",
|
|
6969
|
+
PAD2[size],
|
|
6970
|
+
"border-border hover:border-border-strong",
|
|
6971
|
+
"data-[state=checked]:border-accent data-[state=checked]:ring-1 data-[state=checked]:ring-accent",
|
|
6972
|
+
// Keyboard focus only (no mouse-click flash); ring is instant, not animated.
|
|
6973
|
+
"focus:outline-none focus-visible:ring-2 focus-visible:ring-accent focus-visible:ring-offset-1 focus-visible:ring-offset-surface",
|
|
6974
|
+
"disabled:cursor-not-allowed disabled:opacity-50"
|
|
6975
|
+
),
|
|
6976
|
+
children: [
|
|
6977
|
+
/* @__PURE__ */ jsxRuntime.jsx(RadioGroupPrimitive__namespace.Indicator, { className: "absolute right-3 top-3", children: CheckMark }),
|
|
6978
|
+
opt.icon != null && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "mb-1 text-accent [&>svg]:h-6 [&>svg]:w-6", children: opt.icon }),
|
|
6979
|
+
/* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex items-center gap-2 pr-6", children: [
|
|
6980
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: cx("font-semibold text-foreground", TITLE[size]), children: opt.label }),
|
|
6981
|
+
opt.badge != null && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "rounded-full border border-border bg-surface-raised px-2 py-0.5 text-[11px] font-medium text-foreground-secondary", children: opt.badge })
|
|
6982
|
+
] }),
|
|
6983
|
+
opt.description != null && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs leading-relaxed text-foreground-secondary", children: opt.description })
|
|
6984
|
+
]
|
|
6985
|
+
},
|
|
6986
|
+
opt.value
|
|
6987
|
+
))
|
|
6988
|
+
}
|
|
6989
|
+
)
|
|
6990
|
+
}
|
|
6991
|
+
);
|
|
6992
|
+
}
|
|
6752
6993
|
function Checkbox({
|
|
6753
6994
|
checked,
|
|
6754
6995
|
value,
|
|
@@ -6768,7 +7009,7 @@ function Checkbox({
|
|
|
6768
7009
|
}) {
|
|
6769
7010
|
const isChecked = checked ?? value ?? false;
|
|
6770
7011
|
const labelFirst = labelPosition === "left";
|
|
6771
|
-
const errorId =
|
|
7012
|
+
const errorId = React29.useId();
|
|
6772
7013
|
const hasError = errorMessage != null;
|
|
6773
7014
|
const box = /* @__PURE__ */ jsxRuntime.jsx(
|
|
6774
7015
|
CheckboxPrimitive__namespace.Root,
|
|
@@ -6876,8 +7117,8 @@ function RadioGroup({
|
|
|
6876
7117
|
className,
|
|
6877
7118
|
errorMessage
|
|
6878
7119
|
}) {
|
|
6879
|
-
const errorId =
|
|
6880
|
-
const groupId =
|
|
7120
|
+
const errorId = React29.useId();
|
|
7121
|
+
const groupId = React29.useId();
|
|
6881
7122
|
const hasError = errorMessage != null;
|
|
6882
7123
|
const labelFirst = labelPosition === "left";
|
|
6883
7124
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -6977,11 +7218,11 @@ function Switch({
|
|
|
6977
7218
|
disabled,
|
|
6978
7219
|
errorMessage
|
|
6979
7220
|
}) {
|
|
6980
|
-
const id =
|
|
6981
|
-
const errorId =
|
|
7221
|
+
const id = React29.useId();
|
|
7222
|
+
const errorId = React29.useId();
|
|
6982
7223
|
const hasError = errorMessage != null;
|
|
6983
7224
|
const isControlled = checked !== void 0;
|
|
6984
|
-
const [internal, setInternal] =
|
|
7225
|
+
const [internal, setInternal] = React29.useState(defaultChecked);
|
|
6985
7226
|
const isOn = isControlled ? checked : internal;
|
|
6986
7227
|
const handle = (c) => {
|
|
6987
7228
|
if (!isControlled) setInternal(c);
|
|
@@ -7057,11 +7298,11 @@ function MultiTagRow({
|
|
|
7057
7298
|
labelFor,
|
|
7058
7299
|
onRemove
|
|
7059
7300
|
}) {
|
|
7060
|
-
const wrapRef =
|
|
7061
|
-
const measureRef =
|
|
7062
|
-
const [visibleCount, setVisibleCount] =
|
|
7301
|
+
const wrapRef = React29.useRef(null);
|
|
7302
|
+
const measureRef = React29.useRef(null);
|
|
7303
|
+
const [visibleCount, setVisibleCount] = React29.useState(values.length);
|
|
7063
7304
|
const key = values.map(String).join("|");
|
|
7064
|
-
|
|
7305
|
+
React29.useLayoutEffect(() => {
|
|
7065
7306
|
const wrap = wrapRef.current;
|
|
7066
7307
|
const measure = measureRef.current;
|
|
7067
7308
|
if (!wrap || !measure) return;
|
|
@@ -7155,16 +7396,16 @@ function Dropdown({
|
|
|
7155
7396
|
size = "md",
|
|
7156
7397
|
className = ""
|
|
7157
7398
|
}) {
|
|
7158
|
-
const [open, setOpen] =
|
|
7159
|
-
const [selectedItems, setSelectedItems] =
|
|
7160
|
-
const [searchTerm, setSearchTerm] =
|
|
7161
|
-
const [innerItems, setInnerItems] =
|
|
7162
|
-
const errorId =
|
|
7399
|
+
const [open, setOpen] = React29.useState(false);
|
|
7400
|
+
const [selectedItems, setSelectedItems] = React29.useState([]);
|
|
7401
|
+
const [searchTerm, setSearchTerm] = React29.useState("");
|
|
7402
|
+
const [innerItems, setInnerItems] = React29.useState([]);
|
|
7403
|
+
const errorId = React29.useId();
|
|
7163
7404
|
const hasError = errorMessage != null;
|
|
7164
|
-
|
|
7405
|
+
React29.useEffect(() => {
|
|
7165
7406
|
setInnerItems(items);
|
|
7166
7407
|
}, [items]);
|
|
7167
|
-
|
|
7408
|
+
React29.useEffect(() => {
|
|
7168
7409
|
if (isMultiselect && Array.isArray(value)) {
|
|
7169
7410
|
setSelectedItems(value);
|
|
7170
7411
|
}
|
|
@@ -7356,19 +7597,19 @@ function AutoComplete({
|
|
|
7356
7597
|
required,
|
|
7357
7598
|
htmlFor
|
|
7358
7599
|
}) {
|
|
7359
|
-
const errorId =
|
|
7600
|
+
const errorId = React29.useId();
|
|
7360
7601
|
const hasError = errorMessage != null;
|
|
7361
|
-
const [term, setTerm] =
|
|
7362
|
-
const [open, setOpen] =
|
|
7363
|
-
const [asyncItems, setAsyncItems] =
|
|
7364
|
-
const [loading, setLoading] =
|
|
7602
|
+
const [term, setTerm] = React29.useState("");
|
|
7603
|
+
const [open, setOpen] = React29.useState(false);
|
|
7604
|
+
const [asyncItems, setAsyncItems] = React29.useState([]);
|
|
7605
|
+
const [loading, setLoading] = React29.useState(false);
|
|
7365
7606
|
const isAsync = typeof onSearch === "function";
|
|
7366
|
-
const debounceRef =
|
|
7367
|
-
const requestIdRef =
|
|
7607
|
+
const debounceRef = React29.useRef(null);
|
|
7608
|
+
const requestIdRef = React29.useRef(0);
|
|
7368
7609
|
const staticFiltered = isAsync || !items ? [] : term.trim() ? items.filter(
|
|
7369
7610
|
({ key, label: label2 }) => label2.toLowerCase().includes(term.toLowerCase()) || key.toLowerCase().includes(term.toLowerCase())
|
|
7370
7611
|
) : [];
|
|
7371
|
-
|
|
7612
|
+
React29.useEffect(() => {
|
|
7372
7613
|
if (!isAsync) return;
|
|
7373
7614
|
if (debounceRef.current) clearTimeout(debounceRef.current);
|
|
7374
7615
|
if (!term.trim()) {
|
|
@@ -7524,15 +7765,15 @@ function TreeSelect({
|
|
|
7524
7765
|
defaultExpandedKeys = [],
|
|
7525
7766
|
size = "md"
|
|
7526
7767
|
}) {
|
|
7527
|
-
const errorId =
|
|
7768
|
+
const errorId = React29.useId();
|
|
7528
7769
|
const hasError = errorMessage != null;
|
|
7529
|
-
const [open, setOpen] =
|
|
7530
|
-
const [expanded, setExpanded] =
|
|
7531
|
-
const [activeIndex, setActiveIndex] =
|
|
7532
|
-
const listRef =
|
|
7533
|
-
const visible =
|
|
7534
|
-
const didSyncOnOpenRef =
|
|
7535
|
-
|
|
7770
|
+
const [open, setOpen] = React29.useState(false);
|
|
7771
|
+
const [expanded, setExpanded] = React29.useState(() => new Set(defaultExpandedKeys));
|
|
7772
|
+
const [activeIndex, setActiveIndex] = React29.useState(0);
|
|
7773
|
+
const listRef = React29.useRef(null);
|
|
7774
|
+
const visible = React29.useMemo(() => flattenVisible(items, expanded), [items, expanded]);
|
|
7775
|
+
const didSyncOnOpenRef = React29.useRef(false);
|
|
7776
|
+
React29.useEffect(() => {
|
|
7536
7777
|
if (!open) {
|
|
7537
7778
|
didSyncOnOpenRef.current = false;
|
|
7538
7779
|
return;
|
|
@@ -7542,7 +7783,7 @@ function TreeSelect({
|
|
|
7542
7783
|
setActiveIndex(selectedIdx >= 0 ? selectedIdx : 0);
|
|
7543
7784
|
didSyncOnOpenRef.current = true;
|
|
7544
7785
|
}, [open, value]);
|
|
7545
|
-
const selectedNode =
|
|
7786
|
+
const selectedNode = React29.useMemo(
|
|
7546
7787
|
() => value != null ? findNodeByKey(items, value) : null,
|
|
7547
7788
|
[items, value]
|
|
7548
7789
|
);
|
|
@@ -7773,11 +8014,11 @@ function FileInput({
|
|
|
7773
8014
|
required,
|
|
7774
8015
|
icon
|
|
7775
8016
|
}) {
|
|
7776
|
-
const inputRef =
|
|
7777
|
-
const errorId =
|
|
7778
|
-
const [files, setFiles] =
|
|
7779
|
-
const [dragging, setDragging] =
|
|
7780
|
-
const [sizeError, setSizeError] =
|
|
8017
|
+
const inputRef = React29.useRef(null);
|
|
8018
|
+
const errorId = React29.useId();
|
|
8019
|
+
const [files, setFiles] = React29.useState([]);
|
|
8020
|
+
const [dragging, setDragging] = React29.useState(false);
|
|
8021
|
+
const [sizeError, setSizeError] = React29.useState(null);
|
|
7781
8022
|
const effectiveError = errorMessage ?? sizeError ?? void 0;
|
|
7782
8023
|
const openPicker = () => {
|
|
7783
8024
|
if (!disabled) inputRef.current?.click();
|
|
@@ -7968,30 +8209,30 @@ function DatePicker({
|
|
|
7968
8209
|
size = "md",
|
|
7969
8210
|
className = ""
|
|
7970
8211
|
}) {
|
|
7971
|
-
const errorId =
|
|
8212
|
+
const errorId = React29.useId();
|
|
7972
8213
|
const hasError = errorMessage != null;
|
|
7973
|
-
const [open, setOpen] =
|
|
7974
|
-
const [viewMonth, setViewMonth] =
|
|
7975
|
-
const [focusDate, setFocusDate] =
|
|
7976
|
-
const [view, setView] =
|
|
7977
|
-
const gridRef =
|
|
7978
|
-
|
|
8214
|
+
const [open, setOpen] = React29.useState(false);
|
|
8215
|
+
const [viewMonth, setViewMonth] = React29.useState(() => startOfMonth2(value ?? /* @__PURE__ */ new Date()));
|
|
8216
|
+
const [focusDate, setFocusDate] = React29.useState(() => value ?? /* @__PURE__ */ new Date());
|
|
8217
|
+
const [view, setView] = React29.useState("days");
|
|
8218
|
+
const gridRef = React29.useRef(null);
|
|
8219
|
+
React29.useEffect(() => {
|
|
7979
8220
|
if (!open) return;
|
|
7980
8221
|
const target = value ?? /* @__PURE__ */ new Date();
|
|
7981
8222
|
setViewMonth(startOfMonth2(target));
|
|
7982
8223
|
setFocusDate(target);
|
|
7983
8224
|
setView("days");
|
|
7984
8225
|
}, [open, value]);
|
|
7985
|
-
|
|
8226
|
+
React29.useEffect(() => {
|
|
7986
8227
|
if (!open) return;
|
|
7987
8228
|
const cell = gridRef.current?.querySelector(`[data-day="${defaultFormat3(focusDate)}"]`);
|
|
7988
8229
|
cell?.focus();
|
|
7989
8230
|
}, [open, focusDate]);
|
|
7990
|
-
const weekdays =
|
|
8231
|
+
const weekdays = React29.useMemo(() => {
|
|
7991
8232
|
const ordered = WEEKDAY_SHORT.slice(weekStartsOn).concat(WEEKDAY_SHORT.slice(0, weekStartsOn));
|
|
7992
8233
|
return ordered;
|
|
7993
8234
|
}, [weekStartsOn]);
|
|
7994
|
-
const grid =
|
|
8235
|
+
const grid = React29.useMemo(() => buildGrid(viewMonth, weekStartsOn), [viewMonth, weekStartsOn]);
|
|
7995
8236
|
const isDisabled = (d) => {
|
|
7996
8237
|
if (min && d < min) return true;
|
|
7997
8238
|
if (max && d > max) return true;
|
|
@@ -8281,10 +8522,10 @@ function TextArea({
|
|
|
8281
8522
|
style,
|
|
8282
8523
|
inputStyle
|
|
8283
8524
|
}) {
|
|
8284
|
-
const errorId =
|
|
8525
|
+
const errorId = React29.useId();
|
|
8285
8526
|
const hasError = errorMessage != null;
|
|
8286
|
-
const ref =
|
|
8287
|
-
|
|
8527
|
+
const ref = React29.useRef(null);
|
|
8528
|
+
React29.useLayoutEffect(() => {
|
|
8288
8529
|
if (!autoGrow) return;
|
|
8289
8530
|
const el = ref.current;
|
|
8290
8531
|
if (!el) return;
|
|
@@ -8356,14 +8597,14 @@ function Slider({
|
|
|
8356
8597
|
name,
|
|
8357
8598
|
htmlFor
|
|
8358
8599
|
}) {
|
|
8359
|
-
const errorId =
|
|
8600
|
+
const errorId = React29.useId();
|
|
8360
8601
|
const hasError = errorMessage != null;
|
|
8361
8602
|
const isRange = Array.isArray(value ?? defaultValue);
|
|
8362
|
-
const [internal, setInternal] =
|
|
8603
|
+
const [internal, setInternal] = React29.useState(
|
|
8363
8604
|
() => toArray(value) ?? toArray(defaultValue) ?? [min]
|
|
8364
8605
|
);
|
|
8365
8606
|
const current = toArray(value) ?? internal;
|
|
8366
|
-
const [dragging, setDragging] =
|
|
8607
|
+
const [dragging, setDragging] = React29.useState(false);
|
|
8367
8608
|
const emit = (arr) => {
|
|
8368
8609
|
setInternal(arr);
|
|
8369
8610
|
const next = isRange ? [arr[0], arr[1]] : arr[0];
|
|
@@ -8458,11 +8699,11 @@ function TagsInput({
|
|
|
8458
8699
|
validate,
|
|
8459
8700
|
separators = ["Enter", ","]
|
|
8460
8701
|
}) {
|
|
8461
|
-
const errorId =
|
|
8462
|
-
const inputRef =
|
|
8463
|
-
const [internal, setInternal] =
|
|
8464
|
-
const [draft, setDraft] =
|
|
8465
|
-
const [localError, setLocalError] =
|
|
8702
|
+
const errorId = React29.useId();
|
|
8703
|
+
const inputRef = React29.useRef(null);
|
|
8704
|
+
const [internal, setInternal] = React29.useState(defaultValue ?? []);
|
|
8705
|
+
const [draft, setDraft] = React29.useState("");
|
|
8706
|
+
const [localError, setLocalError] = React29.useState(null);
|
|
8466
8707
|
const tags = value ?? internal;
|
|
8467
8708
|
const hasError = errorMessage != null || localError != null;
|
|
8468
8709
|
const errorText = errorMessage ?? localError ?? void 0;
|
|
@@ -8593,9 +8834,9 @@ function OtpInput({
|
|
|
8593
8834
|
className,
|
|
8594
8835
|
groupAfter
|
|
8595
8836
|
}) {
|
|
8596
|
-
const errorId =
|
|
8837
|
+
const errorId = React29.useId();
|
|
8597
8838
|
const hasError = errorMessage != null;
|
|
8598
|
-
const refs =
|
|
8839
|
+
const refs = React29.useRef([]);
|
|
8599
8840
|
const chars = Array.from({ length }, (_, i) => value[i] ?? "");
|
|
8600
8841
|
const pattern = mode === "numeric" ? /[0-9]/ : /[a-zA-Z0-9]/;
|
|
8601
8842
|
const emit = (next) => {
|
|
@@ -8644,7 +8885,7 @@ function OtpInput({
|
|
|
8644
8885
|
emit(valid.join(""));
|
|
8645
8886
|
focusBox(valid.length);
|
|
8646
8887
|
};
|
|
8647
|
-
return /* @__PURE__ */ jsxRuntime.jsx(Field, { className, label, htmlFor, errorId, errorMessage, required, layout, helperText, children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-wrap items-center gap-2", role: "group", "aria-label": typeof label === "string" ? label : "One-time code", children: chars.map((char, idx) => /* @__PURE__ */ jsxRuntime.jsxs(
|
|
8888
|
+
return /* @__PURE__ */ jsxRuntime.jsx(Field, { className, label, htmlFor, errorId, errorMessage, required, layout, helperText, children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-wrap items-center gap-2", role: "group", "aria-label": typeof label === "string" ? label : "One-time code", children: chars.map((char, idx) => /* @__PURE__ */ jsxRuntime.jsxs(React29__default.default.Fragment, { children: [
|
|
8648
8889
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
8649
8890
|
"input",
|
|
8650
8891
|
{
|
|
@@ -8702,9 +8943,9 @@ function Rating({
|
|
|
8702
8943
|
className,
|
|
8703
8944
|
required
|
|
8704
8945
|
}) {
|
|
8705
|
-
const errorId =
|
|
8706
|
-
const [internal, setInternal] =
|
|
8707
|
-
const [hover, setHover] =
|
|
8946
|
+
const errorId = React29.useId();
|
|
8947
|
+
const [internal, setInternal] = React29.useState(defaultValue);
|
|
8948
|
+
const [hover, setHover] = React29.useState(null);
|
|
8708
8949
|
const current = value ?? internal;
|
|
8709
8950
|
const display2 = hover ?? current;
|
|
8710
8951
|
const interactive = !readOnly && !disabled;
|
|
@@ -8827,9 +9068,9 @@ function TimePicker({
|
|
|
8827
9068
|
required,
|
|
8828
9069
|
style
|
|
8829
9070
|
}) {
|
|
8830
|
-
const errorId =
|
|
9071
|
+
const errorId = React29.useId();
|
|
8831
9072
|
const hasError = errorMessage != null;
|
|
8832
|
-
const [open, setOpen] =
|
|
9073
|
+
const [open, setOpen] = React29.useState(false);
|
|
8833
9074
|
const parsed = parse(value) ?? { h: 0, m: 0, s: 0 };
|
|
8834
9075
|
const update = (next) => {
|
|
8835
9076
|
const merged = { ...parsed, ...next };
|
|
@@ -8953,13 +9194,13 @@ function DateRangePicker({
|
|
|
8953
9194
|
required,
|
|
8954
9195
|
style
|
|
8955
9196
|
}) {
|
|
8956
|
-
const errorId =
|
|
9197
|
+
const errorId = React29.useId();
|
|
8957
9198
|
const hasError = errorMessage != null;
|
|
8958
|
-
const [open, setOpen] =
|
|
8959
|
-
const [leftMonth, setLeftMonth] =
|
|
8960
|
-
const [pendingStart, setPendingStart] =
|
|
8961
|
-
const [hoverDate, setHoverDate] =
|
|
8962
|
-
const weekdays =
|
|
9199
|
+
const [open, setOpen] = React29.useState(false);
|
|
9200
|
+
const [leftMonth, setLeftMonth] = React29.useState(() => startOfMonth3(value.start ?? /* @__PURE__ */ new Date()));
|
|
9201
|
+
const [pendingStart, setPendingStart] = React29.useState(null);
|
|
9202
|
+
const [hoverDate, setHoverDate] = React29.useState(null);
|
|
9203
|
+
const weekdays = React29.useMemo(
|
|
8963
9204
|
() => WEEKDAY.slice(weekStartsOn).concat(WEEKDAY.slice(0, weekStartsOn)),
|
|
8964
9205
|
[weekStartsOn]
|
|
8965
9206
|
);
|
|
@@ -9135,10 +9376,10 @@ function ColorPicker({
|
|
|
9135
9376
|
required,
|
|
9136
9377
|
placeholder = "Pick a colour\u2026"
|
|
9137
9378
|
}) {
|
|
9138
|
-
const errorId =
|
|
9379
|
+
const errorId = React29.useId();
|
|
9139
9380
|
const hasError = errorMessage != null;
|
|
9140
|
-
const [open, setOpen] =
|
|
9141
|
-
const [draft, setDraft] =
|
|
9381
|
+
const [open, setOpen] = React29.useState(false);
|
|
9382
|
+
const [draft, setDraft] = React29.useState(value);
|
|
9142
9383
|
const valid = HEX_RE.test(value);
|
|
9143
9384
|
const pick = (hex) => {
|
|
9144
9385
|
onChange?.(hex);
|
|
@@ -9225,7 +9466,7 @@ function ColorPicker({
|
|
|
9225
9466
|
}
|
|
9226
9467
|
var CUSTOM_EVENT = "oxy-local-storage";
|
|
9227
9468
|
function useLocalStorage(key, initialValue) {
|
|
9228
|
-
const read =
|
|
9469
|
+
const read = React29.useCallback(() => {
|
|
9229
9470
|
if (typeof window === "undefined") return initialValue;
|
|
9230
9471
|
try {
|
|
9231
9472
|
const item = window.localStorage.getItem(key);
|
|
@@ -9234,8 +9475,8 @@ function useLocalStorage(key, initialValue) {
|
|
|
9234
9475
|
return initialValue;
|
|
9235
9476
|
}
|
|
9236
9477
|
}, [key]);
|
|
9237
|
-
const [stored, setStored] =
|
|
9238
|
-
const setValue =
|
|
9478
|
+
const [stored, setStored] = React29.useState(read);
|
|
9479
|
+
const setValue = React29.useCallback((value) => {
|
|
9239
9480
|
setStored((prev) => {
|
|
9240
9481
|
const next = value instanceof Function ? value(prev) : value;
|
|
9241
9482
|
try {
|
|
@@ -9248,7 +9489,7 @@ function useLocalStorage(key, initialValue) {
|
|
|
9248
9489
|
return next;
|
|
9249
9490
|
});
|
|
9250
9491
|
}, [key]);
|
|
9251
|
-
const remove =
|
|
9492
|
+
const remove = React29.useCallback(() => {
|
|
9252
9493
|
try {
|
|
9253
9494
|
if (typeof window !== "undefined") {
|
|
9254
9495
|
window.localStorage.removeItem(key);
|
|
@@ -9258,10 +9499,10 @@ function useLocalStorage(key, initialValue) {
|
|
|
9258
9499
|
}
|
|
9259
9500
|
setStored(initialValue);
|
|
9260
9501
|
}, [key]);
|
|
9261
|
-
|
|
9502
|
+
React29.useEffect(() => {
|
|
9262
9503
|
setStored(read());
|
|
9263
9504
|
}, [key, read]);
|
|
9264
|
-
|
|
9505
|
+
React29.useEffect(() => {
|
|
9265
9506
|
if (typeof window === "undefined") return;
|
|
9266
9507
|
const onStorage = (e) => {
|
|
9267
9508
|
if (e.key === null || e.key === key) setStored(read());
|
|
@@ -9280,8 +9521,8 @@ function useLocalStorage(key, initialValue) {
|
|
|
9280
9521
|
}
|
|
9281
9522
|
function useMediaQuery(query) {
|
|
9282
9523
|
const get = () => typeof window !== "undefined" && typeof window.matchMedia === "function" ? window.matchMedia(query).matches : false;
|
|
9283
|
-
const [matches, setMatches] =
|
|
9284
|
-
|
|
9524
|
+
const [matches, setMatches] = React29.useState(get);
|
|
9525
|
+
React29.useEffect(() => {
|
|
9285
9526
|
if (typeof window === "undefined" || typeof window.matchMedia !== "function") return;
|
|
9286
9527
|
const mql = window.matchMedia(query);
|
|
9287
9528
|
const onChange = () => setMatches(mql.matches);
|
|
@@ -9312,8 +9553,8 @@ function decodeSegment(seg) {
|
|
|
9312
9553
|
}
|
|
9313
9554
|
}
|
|
9314
9555
|
function useJwt(token) {
|
|
9315
|
-
const [, tick] =
|
|
9316
|
-
const decoded =
|
|
9556
|
+
const [, tick] = React29.useState(0);
|
|
9557
|
+
const decoded = React29.useMemo(() => {
|
|
9317
9558
|
if (!token) return { payload: null, header: null, exp: null };
|
|
9318
9559
|
const [h, p] = token.split(".");
|
|
9319
9560
|
const header = decodeSegment(h);
|
|
@@ -9321,7 +9562,7 @@ function useJwt(token) {
|
|
|
9321
9562
|
const exp = payload && typeof payload.exp === "number" ? payload.exp : null;
|
|
9322
9563
|
return { payload, header, exp };
|
|
9323
9564
|
}, [token]);
|
|
9324
|
-
|
|
9565
|
+
React29.useEffect(() => {
|
|
9325
9566
|
if (decoded.exp == null) return;
|
|
9326
9567
|
const ms = decoded.exp * 1e3 - Date.now();
|
|
9327
9568
|
if (ms <= 0) return;
|
|
@@ -9368,7 +9609,7 @@ function Jumbotron({
|
|
|
9368
9609
|
}
|
|
9369
9610
|
);
|
|
9370
9611
|
}
|
|
9371
|
-
var
|
|
9612
|
+
var COLS2 = {
|
|
9372
9613
|
2: "sm:grid-cols-2",
|
|
9373
9614
|
3: "sm:grid-cols-2 lg:grid-cols-3",
|
|
9374
9615
|
4: "sm:grid-cols-2 lg:grid-cols-4"
|
|
@@ -9390,7 +9631,7 @@ function FeatureGrid({
|
|
|
9390
9631
|
title != null && /* @__PURE__ */ jsxRuntime.jsx("h2", { className: "text-3xl font-bold tracking-tight text-foreground", children: title }),
|
|
9391
9632
|
description != null && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "max-w-2xl text-base leading-relaxed text-foreground-secondary", children: description })
|
|
9392
9633
|
] }),
|
|
9393
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: ["grid grid-cols-1 gap-6",
|
|
9634
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: ["grid grid-cols-1 gap-6", COLS2[columns]].join(" "), children: features.map((f, i) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-3 rounded-xl border border-border bg-surface p-5", children: [
|
|
9394
9635
|
f.icon != null && /* @__PURE__ */ jsxRuntime.jsx(
|
|
9395
9636
|
"span",
|
|
9396
9637
|
{
|
|
@@ -9447,7 +9688,7 @@ function PricingPlans({ plans, eyebrow, title, description, className = "", styl
|
|
|
9447
9688
|
)) })
|
|
9448
9689
|
] });
|
|
9449
9690
|
}
|
|
9450
|
-
var
|
|
9691
|
+
var COLS3 = {
|
|
9451
9692
|
1: "mx-auto max-w-2xl",
|
|
9452
9693
|
2: "sm:grid-cols-2",
|
|
9453
9694
|
3: "sm:grid-cols-2 lg:grid-cols-3"
|
|
@@ -9464,7 +9705,7 @@ function Testimonials({ testimonials, eyebrow, title, description, columns = 3,
|
|
|
9464
9705
|
title != null && /* @__PURE__ */ jsxRuntime.jsx("h2", { className: "text-3xl font-bold tracking-tight text-foreground", children: title }),
|
|
9465
9706
|
description != null && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "max-w-2xl text-base leading-relaxed text-foreground-secondary", children: description })
|
|
9466
9707
|
] }),
|
|
9467
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: ["grid grid-cols-1 gap-6",
|
|
9708
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: ["grid grid-cols-1 gap-6", COLS3[columns]].join(" "), children: testimonials.map((tm, i) => /* @__PURE__ */ jsxRuntime.jsxs("figure", { className: "flex flex-col gap-4 rounded-xl border border-border bg-surface p-6", children: [
|
|
9468
9709
|
tm.rating != null && /* @__PURE__ */ jsxRuntime.jsx(Stars, { value: tm.rating }),
|
|
9469
9710
|
/* @__PURE__ */ jsxRuntime.jsxs("blockquote", { className: "flex-1 text-sm leading-relaxed text-foreground", children: [
|
|
9470
9711
|
"\u201C",
|
|
@@ -9495,13 +9736,13 @@ function SlideShow({
|
|
|
9495
9736
|
style
|
|
9496
9737
|
}) {
|
|
9497
9738
|
const reduced = framerMotion.useReducedMotion();
|
|
9498
|
-
const [index, setIndex] =
|
|
9499
|
-
const [paused, setPaused] =
|
|
9739
|
+
const [index, setIndex] = React29.useState(0);
|
|
9740
|
+
const [paused, setPaused] = React29.useState(false);
|
|
9500
9741
|
const count = slides.length;
|
|
9501
9742
|
const idx = count ? (index % count + count) % count : 0;
|
|
9502
|
-
const go =
|
|
9503
|
-
const timer =
|
|
9504
|
-
|
|
9743
|
+
const go = React29.useCallback((d) => setIndex((i) => i + d), []);
|
|
9744
|
+
const timer = React29.useRef(null);
|
|
9745
|
+
React29.useEffect(() => {
|
|
9505
9746
|
if (!autoPlay || paused || count <= 1) return;
|
|
9506
9747
|
timer.current = setInterval(() => setIndex((i) => i + 1), interval);
|
|
9507
9748
|
return () => {
|
|
@@ -9577,7 +9818,7 @@ function Video({
|
|
|
9577
9818
|
className = "",
|
|
9578
9819
|
style
|
|
9579
9820
|
}) {
|
|
9580
|
-
const [playing, setPlaying] =
|
|
9821
|
+
const [playing, setPlaying] = React29.useState(autoPlay);
|
|
9581
9822
|
const frame = cx("relative w-full overflow-hidden bg-backdrop", framed ? "rounded-2xl border border-border shadow-sm" : "", className);
|
|
9582
9823
|
const ratio = aspect.replace("/", " / ");
|
|
9583
9824
|
return /* @__PURE__ */ jsxRuntime.jsx("div", { className: frame, style: { aspectRatio: ratio, ...style }, children: embedUrl ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -9632,7 +9873,7 @@ function Parallax({
|
|
|
9632
9873
|
style
|
|
9633
9874
|
}) {
|
|
9634
9875
|
const reduced = framerMotion.useReducedMotion();
|
|
9635
|
-
const ref =
|
|
9876
|
+
const ref = React29.useRef(null);
|
|
9636
9877
|
const { scrollYProgress } = framerMotion.useScroll({ target: ref, offset: ["start end", "end start"] });
|
|
9637
9878
|
const shift = Math.max(0, Math.min(1, speed)) * 100;
|
|
9638
9879
|
const y = framerMotion.useTransform(scrollYProgress, [0, 1], reduced ? ["0%", "0%"] : [`-${shift / 2}%`, `${shift / 2}%`]);
|
|
@@ -9668,7 +9909,7 @@ function Parallax({
|
|
|
9668
9909
|
}
|
|
9669
9910
|
);
|
|
9670
9911
|
}
|
|
9671
|
-
var
|
|
9912
|
+
var COLS4 = {
|
|
9672
9913
|
2: "sm:grid-cols-2",
|
|
9673
9914
|
3: "sm:grid-cols-2 lg:grid-cols-3"
|
|
9674
9915
|
};
|
|
@@ -9689,7 +9930,7 @@ function Blog({
|
|
|
9689
9930
|
title != null && /* @__PURE__ */ jsxRuntime.jsx("h2", { className: "text-2xl font-bold tracking-tight text-foreground sm:text-3xl", children: title }),
|
|
9690
9931
|
description != null && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "max-w-2xl text-base leading-relaxed text-foreground-secondary", children: description })
|
|
9691
9932
|
] }),
|
|
9692
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: ["grid grid-cols-1 gap-6",
|
|
9933
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: ["grid grid-cols-1 gap-6", COLS4[columns]].join(" "), children: posts.map((post, i) => {
|
|
9693
9934
|
const meta = [post.author, post.date, post.readTime].filter((m) => m != null);
|
|
9694
9935
|
const inner = /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
9695
9936
|
post.image && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative aspect-video overflow-hidden bg-backdrop", children: [
|
|
@@ -9700,7 +9941,7 @@ function Blog({
|
|
|
9700
9941
|
post.tag != null && !post.image && /* @__PURE__ */ jsxRuntime.jsx("div", { children: /* @__PURE__ */ jsxRuntime.jsx(Badge, { tone: "accent", variant: "soft", size: "sm", children: post.tag }) }),
|
|
9701
9942
|
/* @__PURE__ */ jsxRuntime.jsx("h3", { className: "text-base font-semibold leading-snug text-foreground transition-colors group-hover:text-accent", children: post.title }),
|
|
9702
9943
|
post.excerpt != null && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "line-clamp-3 text-sm leading-relaxed text-foreground-secondary", children: post.excerpt }),
|
|
9703
|
-
meta.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-auto flex flex-wrap items-center gap-x-2 gap-y-1 pt-3 text-xs text-foreground-muted", children: meta.map((m, j) => /* @__PURE__ */ jsxRuntime.jsxs(
|
|
9944
|
+
meta.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-auto flex flex-wrap items-center gap-x-2 gap-y-1 pt-3 text-xs text-foreground-muted", children: meta.map((m, j) => /* @__PURE__ */ jsxRuntime.jsxs(React29__default.default.Fragment, { children: [
|
|
9704
9945
|
j > 0 && /* @__PURE__ */ jsxRuntime.jsx("span", { "aria-hidden": "true", children: "\xB7" }),
|
|
9705
9946
|
/* @__PURE__ */ jsxRuntime.jsx("span", { children: m })
|
|
9706
9947
|
] }, j)) })
|
|
@@ -9829,8 +10070,8 @@ function LeadCapture({
|
|
|
9829
10070
|
className = "",
|
|
9830
10071
|
style
|
|
9831
10072
|
}) {
|
|
9832
|
-
const [email, setEmail] =
|
|
9833
|
-
const [done, setDone] =
|
|
10073
|
+
const [email, setEmail] = React29.useState("");
|
|
10074
|
+
const [done, setDone] = React29.useState(false);
|
|
9834
10075
|
const submit = (e) => {
|
|
9835
10076
|
e.preventDefault();
|
|
9836
10077
|
const value = email.trim();
|
|
@@ -9956,10 +10197,12 @@ exports.OpaqueGridCard = OpaqueGridCard;
|
|
|
9956
10197
|
exports.OtpInput = OtpInput;
|
|
9957
10198
|
exports.Parallax = Parallax;
|
|
9958
10199
|
exports.Password = Password;
|
|
10200
|
+
exports.PasswordStrength = PasswordStrength;
|
|
9959
10201
|
exports.PopConfirm = PopConfirm;
|
|
9960
10202
|
exports.Portal = Portal;
|
|
9961
10203
|
exports.PricingPlans = PricingPlans;
|
|
9962
10204
|
exports.RadioGroup = RadioGroup;
|
|
10205
|
+
exports.RadioTile = RadioTile;
|
|
9963
10206
|
exports.Rating = Rating;
|
|
9964
10207
|
exports.ScalableContainer = ScalableContainer;
|
|
9965
10208
|
exports.Scheduler = Scheduler;
|
|
@@ -9995,10 +10238,12 @@ exports.Tree = Tree;
|
|
|
9995
10238
|
exports.TreeSelect = TreeSelect;
|
|
9996
10239
|
exports.Typography = Typography;
|
|
9997
10240
|
exports.Video = Video;
|
|
10241
|
+
exports.VirtualList = VirtualList;
|
|
9998
10242
|
exports.Wizard = Wizard;
|
|
9999
10243
|
exports.cardNumberError = cardNumberError;
|
|
10000
10244
|
exports.cvvError = cvvError;
|
|
10001
10245
|
exports.cx = cx;
|
|
10246
|
+
exports.defaultPasswordRules = defaultPasswordRules;
|
|
10002
10247
|
exports.detectBrand = detectBrand;
|
|
10003
10248
|
exports.expiryError = expiryError;
|
|
10004
10249
|
exports.fieldShell = fieldShell;
|
|
@@ -10009,6 +10254,7 @@ exports.luhnValid = luhnValid;
|
|
|
10009
10254
|
exports.onlyDigits = onlyDigits;
|
|
10010
10255
|
exports.patterns = patterns;
|
|
10011
10256
|
exports.runFieldRules = runFieldRules;
|
|
10257
|
+
exports.scorePassword = scorePassword;
|
|
10012
10258
|
exports.useBreakpoint = useBreakpoint;
|
|
10013
10259
|
exports.useCart = useCart;
|
|
10014
10260
|
exports.useFieldArray = useFieldArray;
|