@rpcbase/router 0.168.0 → 0.170.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +399 -194
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -59,109 +59,178 @@ var resolveDataPrefetchFlag = (route, explicitPrefetchData, dataPrefetchHandleKe
|
|
|
59
59
|
if (typeof routeHandlePrefetchData === "boolean") return routeHandlePrefetchData;
|
|
60
60
|
return false;
|
|
61
61
|
};
|
|
62
|
-
var RoutePrefetchProvider = (
|
|
62
|
+
var RoutePrefetchProvider = (t0) => {
|
|
63
|
+
const $ = c(20);
|
|
64
|
+
const { children, defaultPrefetch: t1, dataPrefetchTtlMs: t2, dataPrefetchHandleKey: t3 } = t0;
|
|
65
|
+
const defaultPrefetch = t1 === void 0 ? "intent" : t1;
|
|
66
|
+
const dataPrefetchTtlMs = t2 === void 0 ? 3e4 : t2;
|
|
67
|
+
const dataPrefetchHandleKey = t3 === void 0 ? ROUTE_PREFETCH_DATA_HANDLE : t3;
|
|
63
68
|
const dataRouterContext = useContext(UNSAFE_DataRouterContext);
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
69
|
+
let t4;
|
|
70
|
+
if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
|
|
71
|
+
t4 = /* @__PURE__ */ new Map();
|
|
72
|
+
$[0] = t4;
|
|
73
|
+
} else t4 = $[0];
|
|
74
|
+
const routeModuleCacheRef = useRef(t4);
|
|
75
|
+
let t5;
|
|
76
|
+
if ($[1] === Symbol.for("react.memo_cache_sentinel")) {
|
|
77
|
+
t5 = /* @__PURE__ */ new Map();
|
|
78
|
+
$[1] = t5;
|
|
79
|
+
} else t5 = $[1];
|
|
80
|
+
const routeDataCacheRef = useRef(t5);
|
|
81
|
+
let t6;
|
|
82
|
+
if ($[2] === Symbol.for("react.memo_cache_sentinel")) {
|
|
83
|
+
t6 = async (route) => {
|
|
84
|
+
const routeId = route.id;
|
|
85
|
+
if (!routeId) return null;
|
|
86
|
+
const cached = routeModuleCacheRef.current.get(routeId);
|
|
87
|
+
if (cached) return cached;
|
|
88
|
+
const lazyRouteLoader = typeof route.lazy === "function" ? route.lazy : null;
|
|
89
|
+
const routeModuleImporter = getRouteModuleImporterFromHandle(route.handle);
|
|
90
|
+
if (!lazyRouteLoader && !routeModuleImporter) return null;
|
|
91
|
+
const prefetchPromise = Promise.resolve(lazyRouteLoader ? lazyRouteLoader() : routeModuleImporter()).then(_temp$2).catch((error) => {
|
|
92
|
+
routeModuleCacheRef.current.delete(routeId);
|
|
93
|
+
throw error;
|
|
94
|
+
});
|
|
95
|
+
routeModuleCacheRef.current.set(routeId, prefetchPromise);
|
|
96
|
+
return prefetchPromise;
|
|
97
|
+
};
|
|
98
|
+
$[2] = t6;
|
|
99
|
+
} else t6 = $[2];
|
|
100
|
+
const prefetchRouteModule = t6;
|
|
101
|
+
let t7;
|
|
102
|
+
if ($[3] !== dataPrefetchTtlMs) {
|
|
103
|
+
t7 = async (router, route_0, href) => {
|
|
104
|
+
const routeId_0 = route_0.id;
|
|
105
|
+
if (!routeId_0) return;
|
|
106
|
+
const now = Date.now();
|
|
107
|
+
pruneDataCache(routeDataCacheRef.current, now);
|
|
108
|
+
const cacheKey = `${routeId_0}|${href}`;
|
|
109
|
+
const cached_0 = routeDataCacheRef.current.get(cacheKey);
|
|
110
|
+
if (cached_0 && cached_0.expiresAt > now) {
|
|
111
|
+
await cached_0.promise;
|
|
106
112
|
return;
|
|
107
113
|
}
|
|
114
|
+
let hasLoader = typeof route_0.loader === "function";
|
|
115
|
+
if (!hasLoader) hasLoader = typeof (await prefetchRouteModule(route_0).catch(_temp2$1))?.loader === "function";
|
|
116
|
+
if (!hasLoader) return;
|
|
117
|
+
const fetcherKey = `rb:prefetch:${routeId_0}:${href}`;
|
|
118
|
+
const prefetchPromise_0 = Promise.resolve(router.fetch(fetcherKey, routeId_0, href)).catch((error_0) => {
|
|
119
|
+
routeDataCacheRef.current.delete(cacheKey);
|
|
120
|
+
throw error_0;
|
|
121
|
+
}).finally(() => {
|
|
122
|
+
try {
|
|
123
|
+
router.deleteFetcher(fetcherKey);
|
|
124
|
+
} catch {
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
const ttl = Math.max(1, dataPrefetchTtlMs);
|
|
129
|
+
routeDataCacheRef.current.set(cacheKey, {
|
|
130
|
+
expiresAt: now + ttl,
|
|
131
|
+
promise: prefetchPromise_0
|
|
132
|
+
});
|
|
133
|
+
await prefetchPromise_0;
|
|
134
|
+
};
|
|
135
|
+
$[3] = dataPrefetchTtlMs;
|
|
136
|
+
$[4] = t7;
|
|
137
|
+
} else t7 = $[4];
|
|
138
|
+
const prefetchRouteData = t7;
|
|
139
|
+
let t8;
|
|
140
|
+
if ($[5] !== dataPrefetchHandleKey || $[6] !== dataRouterContext?.router || $[7] !== prefetchRouteData) {
|
|
141
|
+
t8 = async (href_0, opts) => {
|
|
142
|
+
const normalized = normalizeHref(href_0);
|
|
143
|
+
if (!normalized) return;
|
|
144
|
+
const currentPathWithSearch = typeof window === "undefined" ? "" : `${window.location.pathname}${window.location.search}`;
|
|
145
|
+
if (normalized.pathWithSearch === currentPathWithSearch) return;
|
|
146
|
+
const router_0 = dataRouterContext?.router;
|
|
147
|
+
if (!router_0) return;
|
|
148
|
+
const matches = matchRoutes(router_0.routes, {
|
|
149
|
+
pathname: normalized.pathname,
|
|
150
|
+
search: normalized.search,
|
|
151
|
+
hash: normalized.hash
|
|
152
|
+
}, router_0.basename);
|
|
153
|
+
if (!matches || matches.length === 0) return;
|
|
154
|
+
const matchedRoutes = matches.map(_temp3);
|
|
155
|
+
if (opts?.prefetchCode !== false) await Promise.all(matchedRoutes.map(async (route_1) => {
|
|
156
|
+
try {
|
|
157
|
+
await prefetchRouteModule(route_1);
|
|
158
|
+
} catch {
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
}));
|
|
162
|
+
await Promise.all(matchedRoutes.map(async (route_2) => {
|
|
163
|
+
if (!resolveDataPrefetchFlag(route_2, opts?.prefetchData, dataPrefetchHandleKey)) return;
|
|
164
|
+
try {
|
|
165
|
+
await prefetchRouteData(router_0, route_2, normalized.pathWithSearch);
|
|
166
|
+
} catch {
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
}));
|
|
170
|
+
};
|
|
171
|
+
$[5] = dataPrefetchHandleKey;
|
|
172
|
+
$[6] = dataRouterContext?.router;
|
|
173
|
+
$[7] = prefetchRouteData;
|
|
174
|
+
$[8] = t8;
|
|
175
|
+
} else t8 = $[8];
|
|
176
|
+
const prefetch = t8;
|
|
177
|
+
let t10;
|
|
178
|
+
let t9;
|
|
179
|
+
if ($[9] !== prefetch) {
|
|
180
|
+
t9 = async (href_1) => prefetch(href_1, {
|
|
181
|
+
prefetchCode: true,
|
|
182
|
+
prefetchData: false
|
|
108
183
|
});
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
promise: prefetchPromise_0
|
|
184
|
+
t10 = async (href_2) => prefetch(href_2, {
|
|
185
|
+
prefetchCode: false,
|
|
186
|
+
prefetchData: true
|
|
113
187
|
});
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
pathname: normalized.pathname,
|
|
125
|
-
search: normalized.search,
|
|
126
|
-
hash: normalized.hash
|
|
127
|
-
}, router_0.basename);
|
|
128
|
-
if (!matches || matches.length === 0) return;
|
|
129
|
-
const matchedRoutes = matches.map((match) => match.route);
|
|
130
|
-
if (opts?.prefetchCode !== false) await Promise.all(matchedRoutes.map(async (route_1) => {
|
|
131
|
-
try {
|
|
132
|
-
await prefetchRouteModule(route_1);
|
|
133
|
-
} catch {
|
|
134
|
-
return;
|
|
135
|
-
}
|
|
136
|
-
}));
|
|
137
|
-
await Promise.all(matchedRoutes.map(async (route_2) => {
|
|
138
|
-
if (!resolveDataPrefetchFlag(route_2, opts?.prefetchData, dataPrefetchHandleKey)) return;
|
|
139
|
-
try {
|
|
140
|
-
await prefetchRouteData(router_0, route_2, normalized.pathWithSearch);
|
|
141
|
-
} catch {
|
|
142
|
-
return;
|
|
143
|
-
}
|
|
144
|
-
}));
|
|
145
|
-
};
|
|
146
|
-
return /* @__PURE__ */ jsx(RoutePrefetchContext.Provider, {
|
|
147
|
-
value: {
|
|
188
|
+
$[9] = prefetch;
|
|
189
|
+
$[10] = t10;
|
|
190
|
+
$[11] = t9;
|
|
191
|
+
} else {
|
|
192
|
+
t10 = $[10];
|
|
193
|
+
t9 = $[11];
|
|
194
|
+
}
|
|
195
|
+
let t11;
|
|
196
|
+
if ($[12] !== defaultPrefetch || $[13] !== prefetch || $[14] !== t10 || $[15] !== t9) {
|
|
197
|
+
t11 = {
|
|
148
198
|
defaultPrefetch,
|
|
149
199
|
prefetch,
|
|
150
|
-
prefetchCode:
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
200
|
+
prefetchCode: t9,
|
|
201
|
+
prefetchData: t10
|
|
202
|
+
};
|
|
203
|
+
$[12] = defaultPrefetch;
|
|
204
|
+
$[13] = prefetch;
|
|
205
|
+
$[14] = t10;
|
|
206
|
+
$[15] = t9;
|
|
207
|
+
$[16] = t11;
|
|
208
|
+
} else t11 = $[16];
|
|
209
|
+
let t12;
|
|
210
|
+
if ($[17] !== children || $[18] !== t11) {
|
|
211
|
+
t12 = /* @__PURE__ */ jsx(RoutePrefetchContext.Provider, {
|
|
212
|
+
value: t11,
|
|
213
|
+
children
|
|
214
|
+
});
|
|
215
|
+
$[17] = children;
|
|
216
|
+
$[18] = t11;
|
|
217
|
+
$[19] = t12;
|
|
218
|
+
} else t12 = $[19];
|
|
219
|
+
return t12;
|
|
161
220
|
};
|
|
162
221
|
var useRoutePrefetch = () => {
|
|
163
222
|
return useContext(RoutePrefetchContext);
|
|
164
223
|
};
|
|
224
|
+
function _temp$2(module) {
|
|
225
|
+
if (!module || typeof module !== "object") return null;
|
|
226
|
+
return module;
|
|
227
|
+
}
|
|
228
|
+
function _temp2$1() {
|
|
229
|
+
return null;
|
|
230
|
+
}
|
|
231
|
+
function _temp3(match) {
|
|
232
|
+
return match.route;
|
|
233
|
+
}
|
|
165
234
|
//#endregion
|
|
166
235
|
//#region src/Link.tsx
|
|
167
236
|
var ABSOLUTE_URL_REGEX = /^(?:[a-z][a-z0-9+.-]*:|\/\/)/i;
|
|
@@ -317,7 +386,7 @@ var Link = forwardRef((t0, forwardedRef) => {
|
|
|
317
386
|
const element = getAnchorElement();
|
|
318
387
|
if (!element || typeof IntersectionObserver === "undefined") return;
|
|
319
388
|
const observer = new IntersectionObserver((entries) => {
|
|
320
|
-
if (!entries.some(_temp) || viewportPrefetchedRef.current) return;
|
|
389
|
+
if (!entries.some(_temp$1) || viewportPrefetchedRef.current) return;
|
|
321
390
|
viewportPrefetchedRef.current = true;
|
|
322
391
|
prefetchHref();
|
|
323
392
|
}, { threshold: .5 });
|
|
@@ -412,7 +481,7 @@ var Link = forwardRef((t0, forwardedRef) => {
|
|
|
412
481
|
return t13;
|
|
413
482
|
});
|
|
414
483
|
Link.displayName = "Link";
|
|
415
|
-
function _temp(entry) {
|
|
484
|
+
function _temp$1(entry) {
|
|
416
485
|
return entry.isIntersecting;
|
|
417
486
|
}
|
|
418
487
|
//#endregion
|
|
@@ -508,42 +577,85 @@ var lazyRoute = (importer, opts) => {
|
|
|
508
577
|
};
|
|
509
578
|
//#endregion
|
|
510
579
|
//#region src/useApplyMeta.tsx
|
|
511
|
-
var useApplyMeta = (
|
|
580
|
+
var useApplyMeta = (t0) => {
|
|
581
|
+
const $ = c(12);
|
|
582
|
+
let t1;
|
|
583
|
+
if ($[0] !== t0) {
|
|
584
|
+
t1 = t0 === void 0 ? {} : t0;
|
|
585
|
+
$[0] = t0;
|
|
586
|
+
$[1] = t1;
|
|
587
|
+
} else t1 = $[1];
|
|
588
|
+
const { defaultTitle: t2, defaultMeta: t3, pagesMeta: t4 } = t1;
|
|
589
|
+
const defaultTitle = t2 === void 0 ? "" : t2;
|
|
590
|
+
let t5;
|
|
591
|
+
if ($[2] !== t3) {
|
|
592
|
+
t5 = t3 === void 0 ? [] : t3;
|
|
593
|
+
$[2] = t3;
|
|
594
|
+
$[3] = t5;
|
|
595
|
+
} else t5 = $[3];
|
|
596
|
+
const defaultMeta = t5;
|
|
597
|
+
let t6;
|
|
598
|
+
if ($[4] !== t4) {
|
|
599
|
+
t6 = t4 === void 0 ? {} : t4;
|
|
600
|
+
$[4] = t4;
|
|
601
|
+
$[5] = t6;
|
|
602
|
+
} else t6 = $[5];
|
|
603
|
+
const pagesMeta = t6;
|
|
512
604
|
const location = useLocation();
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
605
|
+
let t7;
|
|
606
|
+
let t8;
|
|
607
|
+
if ($[6] !== defaultMeta || $[7] !== defaultTitle || $[8] !== location.pathname || $[9] !== pagesMeta) {
|
|
608
|
+
t7 = () => {
|
|
609
|
+
const loadMeta = async () => {
|
|
610
|
+
let pageMeta = pagesMeta[location.pathname];
|
|
611
|
+
if (!pageMeta) pageMeta = {
|
|
612
|
+
title: defaultTitle,
|
|
613
|
+
meta: defaultMeta
|
|
614
|
+
};
|
|
615
|
+
document.title = pageMeta.title;
|
|
616
|
+
document.querySelectorAll("[data-react-meta]").forEach(_temp);
|
|
617
|
+
pageMeta.meta.forEach(_temp2);
|
|
618
|
+
const canonicalUrl = `${window.location.origin}${location.pathname}`;
|
|
619
|
+
const existingCanonical = document.querySelector("link[rel=\"canonical\"]");
|
|
620
|
+
if (existingCanonical) existingCanonical.remove();
|
|
621
|
+
const canonicalLink = document.createElement("link");
|
|
622
|
+
canonicalLink.setAttribute("rel", "canonical");
|
|
623
|
+
canonicalLink.setAttribute("href", canonicalUrl);
|
|
624
|
+
canonicalLink.setAttribute("data-react-meta", "true");
|
|
625
|
+
document.head.appendChild(canonicalLink);
|
|
519
626
|
};
|
|
520
|
-
|
|
521
|
-
document.querySelectorAll("[data-react-meta]").forEach((tag) => tag.remove());
|
|
522
|
-
pageMeta.meta.forEach((meta) => {
|
|
523
|
-
const metaElement = document.createElement("meta");
|
|
524
|
-
metaElement.setAttribute("data-react-meta", "true");
|
|
525
|
-
Object.entries(meta).forEach(([key, value]) => {
|
|
526
|
-
if (value) metaElement.setAttribute(key, value.toString());
|
|
527
|
-
});
|
|
528
|
-
document.head.appendChild(metaElement);
|
|
529
|
-
});
|
|
530
|
-
const canonicalUrl = `${window.location.origin}${location.pathname}`;
|
|
531
|
-
const existingCanonical = document.querySelector("link[rel=\"canonical\"]");
|
|
532
|
-
if (existingCanonical) existingCanonical.remove();
|
|
533
|
-
const canonicalLink = document.createElement("link");
|
|
534
|
-
canonicalLink.setAttribute("rel", "canonical");
|
|
535
|
-
canonicalLink.setAttribute("href", canonicalUrl);
|
|
536
|
-
canonicalLink.setAttribute("data-react-meta", "true");
|
|
537
|
-
document.head.appendChild(canonicalLink);
|
|
627
|
+
loadMeta();
|
|
538
628
|
};
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
629
|
+
t8 = [
|
|
630
|
+
location.pathname,
|
|
631
|
+
defaultTitle,
|
|
632
|
+
defaultMeta,
|
|
633
|
+
pagesMeta
|
|
634
|
+
];
|
|
635
|
+
$[6] = defaultMeta;
|
|
636
|
+
$[7] = defaultTitle;
|
|
637
|
+
$[8] = location.pathname;
|
|
638
|
+
$[9] = pagesMeta;
|
|
639
|
+
$[10] = t7;
|
|
640
|
+
$[11] = t8;
|
|
641
|
+
} else {
|
|
642
|
+
t7 = $[10];
|
|
643
|
+
t8 = $[11];
|
|
644
|
+
}
|
|
645
|
+
useEffect(t7, t8);
|
|
546
646
|
};
|
|
647
|
+
function _temp(tag) {
|
|
648
|
+
return tag.remove();
|
|
649
|
+
}
|
|
650
|
+
function _temp2(meta) {
|
|
651
|
+
const metaElement = document.createElement("meta");
|
|
652
|
+
metaElement.setAttribute("data-react-meta", "true");
|
|
653
|
+
Object.entries(meta).forEach((t0) => {
|
|
654
|
+
const [key, value] = t0;
|
|
655
|
+
if (value) metaElement.setAttribute(key, value.toString());
|
|
656
|
+
});
|
|
657
|
+
document.head.appendChild(metaElement);
|
|
658
|
+
}
|
|
547
659
|
//#endregion
|
|
548
660
|
//#region src/navigationGuards.ts
|
|
549
661
|
var NAVIGATION_GUARDS_STORE_KEY = "__rpcbaseNavigationGuardsStore";
|
|
@@ -813,76 +925,169 @@ function useQuerySearch() {
|
|
|
813
925
|
} else t0 = $[1];
|
|
814
926
|
return useSyncExternalStore(subscribeToQueryOverlayUrl, getCurrentSearch, t0);
|
|
815
927
|
}
|
|
816
|
-
var useQueryOverlay = (
|
|
928
|
+
var useQueryOverlay = (t0) => {
|
|
929
|
+
const $ = c(38);
|
|
930
|
+
const { params, parse, write, clear, closeDelayMs: t1 } = t0;
|
|
931
|
+
const closeDelayMs = t1 === void 0 ? 0 : t1;
|
|
817
932
|
const routerUrlSnapshot = useRouterUrlSnapshot();
|
|
818
933
|
const search = useQuerySearch();
|
|
819
934
|
const [isOptimisticallyClosed, setIsOptimisticallyClosed] = useState(false);
|
|
820
935
|
const closeTimeoutRef = useRef(null);
|
|
821
|
-
|
|
936
|
+
let t2;
|
|
937
|
+
if ($[0] !== parse || $[1] !== search) {
|
|
938
|
+
t2 = parse(new URLSearchParams(search));
|
|
939
|
+
$[0] = parse;
|
|
940
|
+
$[1] = search;
|
|
941
|
+
$[2] = t2;
|
|
942
|
+
} else t2 = $[2];
|
|
943
|
+
const value = t2;
|
|
822
944
|
const isUrlOpen = value !== null;
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
});
|
|
837
|
-
};
|
|
838
|
-
const buildHref = (nextValue) => {
|
|
839
|
-
const searchParams_0 = new URLSearchParams(getCurrentUrlSnapshot(routerUrlSnapshot).search);
|
|
840
|
-
clearOverlaySearchParams(searchParams_0, params, clear);
|
|
841
|
-
if (nextValue !== null) write(searchParams_0, nextValue);
|
|
842
|
-
return buildUrl(searchParams_0, routerUrlSnapshot);
|
|
843
|
-
};
|
|
844
|
-
const openOverlay = (nextValue_0) => {
|
|
845
|
-
resetOptimisticClose();
|
|
846
|
-
replaceQueryParams((searchParams_1) => {
|
|
847
|
-
clearOverlaySearchParams(searchParams_1, params, clear);
|
|
848
|
-
write(searchParams_1, nextValue_0);
|
|
849
|
-
});
|
|
850
|
-
};
|
|
851
|
-
const closeOverlay = () => {
|
|
852
|
-
if (!isUrlOpen) return;
|
|
853
|
-
setIsOptimisticallyClosed(true);
|
|
854
|
-
clearScheduledClose();
|
|
855
|
-
if (typeof window === "undefined" || closeDelayMs <= 0) {
|
|
856
|
-
closeUrlOverlay();
|
|
857
|
-
return;
|
|
858
|
-
}
|
|
859
|
-
closeTimeoutRef.current = window.setTimeout(() => {
|
|
945
|
+
let t3;
|
|
946
|
+
if ($[3] !== params || $[4] !== search) {
|
|
947
|
+
t3 = buildOverlayUrlStateKey(search, params);
|
|
948
|
+
$[3] = params;
|
|
949
|
+
$[4] = search;
|
|
950
|
+
$[5] = t3;
|
|
951
|
+
} else t3 = $[5];
|
|
952
|
+
const overlayUrlStateKey = t3;
|
|
953
|
+
let t4;
|
|
954
|
+
if ($[6] === Symbol.for("react.memo_cache_sentinel")) {
|
|
955
|
+
t4 = () => {
|
|
956
|
+
if (closeTimeoutRef.current === null) return;
|
|
957
|
+
window.clearTimeout(closeTimeoutRef.current);
|
|
860
958
|
closeTimeoutRef.current = null;
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
};
|
|
864
|
-
|
|
865
|
-
|
|
959
|
+
};
|
|
960
|
+
$[6] = t4;
|
|
961
|
+
} else t4 = $[6];
|
|
962
|
+
const clearScheduledClose = t4;
|
|
963
|
+
let t5;
|
|
964
|
+
if ($[7] === Symbol.for("react.memo_cache_sentinel")) {
|
|
965
|
+
t5 = () => {
|
|
966
|
+
clearScheduledClose();
|
|
866
967
|
setIsOptimisticallyClosed(false);
|
|
867
|
-
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
|
|
968
|
+
};
|
|
969
|
+
$[7] = t5;
|
|
970
|
+
} else t5 = $[7];
|
|
971
|
+
const resetOptimisticClose = t5;
|
|
972
|
+
let t6;
|
|
973
|
+
if ($[8] !== clear || $[9] !== params) {
|
|
974
|
+
t6 = () => {
|
|
975
|
+
replaceQueryParams((searchParams) => {
|
|
976
|
+
clearOverlaySearchParams(searchParams, params, clear);
|
|
977
|
+
});
|
|
978
|
+
};
|
|
979
|
+
$[8] = clear;
|
|
980
|
+
$[9] = params;
|
|
981
|
+
$[10] = t6;
|
|
982
|
+
} else t6 = $[10];
|
|
983
|
+
const closeUrlOverlay = t6;
|
|
984
|
+
let t7;
|
|
985
|
+
if ($[11] !== clear || $[12] !== params || $[13] !== routerUrlSnapshot || $[14] !== write) {
|
|
986
|
+
t7 = (nextValue) => {
|
|
987
|
+
const searchParams_0 = new URLSearchParams(getCurrentUrlSnapshot(routerUrlSnapshot).search);
|
|
988
|
+
clearOverlaySearchParams(searchParams_0, params, clear);
|
|
989
|
+
if (nextValue !== null) write(searchParams_0, nextValue);
|
|
990
|
+
return buildUrl(searchParams_0, routerUrlSnapshot);
|
|
991
|
+
};
|
|
992
|
+
$[11] = clear;
|
|
993
|
+
$[12] = params;
|
|
994
|
+
$[13] = routerUrlSnapshot;
|
|
995
|
+
$[14] = write;
|
|
996
|
+
$[15] = t7;
|
|
997
|
+
} else t7 = $[15];
|
|
998
|
+
const buildHref = t7;
|
|
999
|
+
let t8;
|
|
1000
|
+
if ($[16] !== clear || $[17] !== params || $[18] !== write) {
|
|
1001
|
+
t8 = (nextValue_0) => {
|
|
1002
|
+
resetOptimisticClose();
|
|
1003
|
+
replaceQueryParams((searchParams_1) => {
|
|
1004
|
+
clearOverlaySearchParams(searchParams_1, params, clear);
|
|
1005
|
+
write(searchParams_1, nextValue_0);
|
|
1006
|
+
});
|
|
1007
|
+
};
|
|
1008
|
+
$[16] = clear;
|
|
1009
|
+
$[17] = params;
|
|
1010
|
+
$[18] = write;
|
|
1011
|
+
$[19] = t8;
|
|
1012
|
+
} else t8 = $[19];
|
|
1013
|
+
const openOverlay = t8;
|
|
1014
|
+
let t9;
|
|
1015
|
+
if ($[20] !== closeDelayMs || $[21] !== closeUrlOverlay || $[22] !== isUrlOpen) {
|
|
1016
|
+
t9 = () => {
|
|
1017
|
+
if (!isUrlOpen) return;
|
|
1018
|
+
setIsOptimisticallyClosed(true);
|
|
874
1019
|
clearScheduledClose();
|
|
1020
|
+
if (typeof window === "undefined" || closeDelayMs <= 0) {
|
|
1021
|
+
closeUrlOverlay();
|
|
1022
|
+
return;
|
|
1023
|
+
}
|
|
1024
|
+
closeTimeoutRef.current = window.setTimeout(() => {
|
|
1025
|
+
closeTimeoutRef.current = null;
|
|
1026
|
+
closeUrlOverlay();
|
|
1027
|
+
}, closeDelayMs);
|
|
875
1028
|
};
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
1029
|
+
$[20] = closeDelayMs;
|
|
1030
|
+
$[21] = closeUrlOverlay;
|
|
1031
|
+
$[22] = isUrlOpen;
|
|
1032
|
+
$[23] = t9;
|
|
1033
|
+
} else t9 = $[23];
|
|
1034
|
+
const closeOverlay = t9;
|
|
1035
|
+
let t10;
|
|
1036
|
+
if ($[24] !== isUrlOpen) {
|
|
1037
|
+
t10 = () => {
|
|
1038
|
+
if (isUrlOpen) {
|
|
1039
|
+
setIsOptimisticallyClosed(false);
|
|
1040
|
+
return;
|
|
1041
|
+
}
|
|
1042
|
+
clearScheduledClose();
|
|
1043
|
+
setIsOptimisticallyClosed(false);
|
|
1044
|
+
};
|
|
1045
|
+
$[24] = isUrlOpen;
|
|
1046
|
+
$[25] = t10;
|
|
1047
|
+
} else t10 = $[25];
|
|
1048
|
+
let t11;
|
|
1049
|
+
if ($[26] !== isUrlOpen || $[27] !== overlayUrlStateKey) {
|
|
1050
|
+
t11 = [isUrlOpen, overlayUrlStateKey];
|
|
1051
|
+
$[26] = isUrlOpen;
|
|
1052
|
+
$[27] = overlayUrlStateKey;
|
|
1053
|
+
$[28] = t11;
|
|
1054
|
+
} else t11 = $[28];
|
|
1055
|
+
useEffect(t10, t11);
|
|
1056
|
+
let t12;
|
|
1057
|
+
let t13;
|
|
1058
|
+
if ($[29] === Symbol.for("react.memo_cache_sentinel")) {
|
|
1059
|
+
t12 = () => () => {
|
|
1060
|
+
clearScheduledClose();
|
|
1061
|
+
};
|
|
1062
|
+
t13 = [];
|
|
1063
|
+
$[29] = t12;
|
|
1064
|
+
$[30] = t13;
|
|
1065
|
+
} else {
|
|
1066
|
+
t12 = $[29];
|
|
1067
|
+
t13 = $[30];
|
|
1068
|
+
}
|
|
1069
|
+
useEffect(t12, t13);
|
|
1070
|
+
const t14 = isUrlOpen && !isOptimisticallyClosed;
|
|
1071
|
+
let t15;
|
|
1072
|
+
if ($[31] !== buildHref || $[32] !== closeOverlay || $[33] !== isUrlOpen || $[34] !== openOverlay || $[35] !== t14 || $[36] !== value) {
|
|
1073
|
+
t15 = {
|
|
1074
|
+
isOpen: t14,
|
|
1075
|
+
shouldRender: isUrlOpen,
|
|
1076
|
+
value,
|
|
1077
|
+
buildHref,
|
|
1078
|
+
openOverlay,
|
|
1079
|
+
closeOverlay,
|
|
1080
|
+
resetOptimisticClose
|
|
1081
|
+
};
|
|
1082
|
+
$[31] = buildHref;
|
|
1083
|
+
$[32] = closeOverlay;
|
|
1084
|
+
$[33] = isUrlOpen;
|
|
1085
|
+
$[34] = openOverlay;
|
|
1086
|
+
$[35] = t14;
|
|
1087
|
+
$[36] = value;
|
|
1088
|
+
$[37] = t15;
|
|
1089
|
+
} else t15 = $[37];
|
|
1090
|
+
return t15;
|
|
886
1091
|
};
|
|
887
1092
|
function QueryOverlay({ overlay, fallback, errorFallback, children }) {
|
|
888
1093
|
if (!overlay.shouldRender || overlay.value === null) return null;
|
|
@@ -971,17 +1176,17 @@ var useShortcutPrefetchNavigate = ({ shortcut, getHref, prefetch, navigate, trig
|
|
|
971
1176
|
}
|
|
972
1177
|
waitingForShortcutKeyUpRef.current = true;
|
|
973
1178
|
};
|
|
974
|
-
const onKeyUp = (
|
|
1179
|
+
const onKeyUp = (event) => {
|
|
975
1180
|
if (!enabledRef.current) return;
|
|
976
1181
|
if (triggerRef.current !== "keyup") return;
|
|
977
1182
|
if (!waitingForShortcutKeyUpRef.current) return;
|
|
978
|
-
if (normalizeKey(
|
|
1183
|
+
if (normalizeKey(event.key) !== normalizeKey(shortcutRef.current.key)) return;
|
|
979
1184
|
waitingForShortcutKeyUpRef.current = false;
|
|
980
|
-
if (ignoreTypingTargetRef.current && isTypingTargetRef.current(
|
|
981
|
-
if (preventDefaultRef.current)
|
|
982
|
-
const
|
|
983
|
-
if (!
|
|
984
|
-
callMaybeAsync(navigateRef.current,
|
|
1185
|
+
if (ignoreTypingTargetRef.current && isTypingTargetRef.current(event.target)) return;
|
|
1186
|
+
if (preventDefaultRef.current) event.preventDefault();
|
|
1187
|
+
const href = getHrefRef.current();
|
|
1188
|
+
if (!href) return;
|
|
1189
|
+
callMaybeAsync(navigateRef.current, href);
|
|
985
1190
|
};
|
|
986
1191
|
const onBlur = () => {
|
|
987
1192
|
waitingForShortcutKeyUpRef.current = false;
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["route","routeId","cached","prefetchPromise","error","href","router","to","target","reloadDocument","searchParams","nextValue","event","href"],"sources":["../src/routePrefetchHandles.ts","../src/routePrefetch.tsx","../src/Link.tsx","../src/lazyRoute.tsx","../src/useApplyMeta.tsx","../src/navigationGuards.ts","../src/queryOverlay.ts","../src/shortcutPrefetchNavigate.ts"],"sourcesContent":["export const ROUTE_MODULE_IMPORTER_HANDLE = \"__rpcbaseRouteModuleImporter\"\nexport const ROUTE_PREFETCH_DATA_HANDLE = \"prefetchData\"\n\nexport type RouteHandleObject = Record<string, unknown>\n\ntype RouteModuleImporter = () => Promise<unknown>\n\nconst isHandleObject = (value: unknown): value is RouteHandleObject =>\n Boolean(value) && typeof value === \"object\" && !Array.isArray(value)\n\nexport const getRouteModuleImporterFromHandle = (handle: unknown): RouteModuleImporter | null => {\n if (!isHandleObject(handle)) return null\n\n const importer = handle[ROUTE_MODULE_IMPORTER_HANDLE]\n return typeof importer === \"function\" ? (importer as RouteModuleImporter) : null\n}\n\nexport const getRoutePrefetchDataFromHandle = (\n handle: unknown,\n key = ROUTE_PREFETCH_DATA_HANDLE,\n): boolean | undefined => {\n if (!isHandleObject(handle)) return undefined\n\n const value = handle[key]\n return typeof value === \"boolean\" ? value : undefined\n}\n\nexport const mergeRouteHandle = (\n handle: unknown,\n {\n importer,\n prefetchData,\n prefetchDataKey = ROUTE_PREFETCH_DATA_HANDLE,\n }: {\n importer?: RouteModuleImporter\n prefetchData?: boolean\n prefetchDataKey?: string\n },\n): RouteHandleObject => {\n const nextHandle: RouteHandleObject = isHandleObject(handle) ? { ...handle } : {}\n\n if (importer) {\n nextHandle[ROUTE_MODULE_IMPORTER_HANDLE] = importer\n }\n\n if (typeof prefetchData === \"boolean\") {\n nextHandle[prefetchDataKey] = prefetchData\n }\n\n return nextHandle\n}\n","import { ReactNode, createContext, useContext, useRef } from \"react\"\nimport {\n UNSAFE_DataRouterContext,\n matchRoutes,\n type DataRouteObject,\n type DataRouter,\n} from \"react-router\"\n\nimport {\n ROUTE_PREFETCH_DATA_HANDLE,\n getRouteModuleImporterFromHandle,\n getRoutePrefetchDataFromHandle,\n} from \"./routePrefetchHandles\"\n\n\nexport type RoutePrefetchBehavior = \"intent\" | \"render\" | \"none\" | \"viewport\"\n\nexport type RoutePrefetchCallOptions = {\n prefetchCode?: boolean\n prefetchData?: boolean\n}\n\nexport type RoutePrefetchApi = {\n defaultPrefetch: RoutePrefetchBehavior\n prefetch: (href: string, opts?: RoutePrefetchCallOptions) => Promise<void>\n prefetchCode: (href: string) => Promise<void>\n prefetchData: (href: string) => Promise<void>\n}\n\ntype RoutePrefetchContextValue = RoutePrefetchApi\n\ntype PrefetchableRoute = DataRouteObject & {\n handle?: unknown\n lazy?: () => Promise<Record<string, unknown>>\n}\n\ntype RoutePrefetchProviderProps = {\n children: ReactNode\n defaultPrefetch?: RoutePrefetchBehavior\n dataPrefetchTtlMs?: number\n dataPrefetchHandleKey?: string\n}\n\ntype DataCacheValue = {\n expiresAt: number\n promise: Promise<void>\n}\n\nconst noop = async () => {}\n\nconst DEFAULT_PREFETCH_API: RoutePrefetchContextValue = {\n defaultPrefetch: \"none\",\n prefetch: noop,\n prefetchCode: noop,\n prefetchData: noop,\n}\n\nconst RoutePrefetchContext = createContext<RoutePrefetchContextValue>(DEFAULT_PREFETCH_API)\n\nconst normalizeHref = (href: string): { pathWithSearch: string; pathname: string; search: string; hash: string } | null => {\n if (typeof window === \"undefined\") return null\n\n try {\n const url = new URL(href, window.location.origin)\n if (url.origin !== window.location.origin) return null\n return {\n pathWithSearch: `${url.pathname}${url.search}`,\n pathname: url.pathname,\n search: url.search,\n hash: url.hash,\n }\n } catch {\n return null\n }\n}\n\nconst pruneDataCache = (cache: Map<string, DataCacheValue>, now: number): void => {\n cache.forEach((value, key) => {\n if (value.expiresAt <= now) {\n cache.delete(key)\n }\n })\n}\n\nconst resolveDataPrefetchFlag = (\n route: PrefetchableRoute,\n explicitPrefetchData: boolean | undefined,\n dataPrefetchHandleKey: string,\n): boolean => {\n if (typeof explicitPrefetchData === \"boolean\") {\n return explicitPrefetchData\n }\n\n const routeHandlePrefetchData = getRoutePrefetchDataFromHandle(route.handle, dataPrefetchHandleKey)\n if (typeof routeHandlePrefetchData === \"boolean\") {\n return routeHandlePrefetchData\n }\n\n return false\n}\n\nexport const RoutePrefetchProvider = ({\n children,\n defaultPrefetch = \"intent\",\n dataPrefetchTtlMs = 30000,\n dataPrefetchHandleKey = ROUTE_PREFETCH_DATA_HANDLE,\n}: RoutePrefetchProviderProps) => {\n const dataRouterContext = useContext(UNSAFE_DataRouterContext)\n const routeModuleCacheRef = useRef(new Map<string, Promise<Record<string, unknown> | null>>())\n const routeDataCacheRef = useRef(new Map<string, DataCacheValue>())\n\n const prefetchRouteModule = async (route: PrefetchableRoute): Promise<Record<string, unknown> | null> => {\n const routeId = route.id\n if (!routeId) return null\n\n const cached = routeModuleCacheRef.current.get(routeId)\n if (cached) {\n return cached\n }\n\n const lazyRouteLoader = typeof route.lazy === \"function\" ? route.lazy : null\n const routeModuleImporter = getRouteModuleImporterFromHandle(route.handle)\n if (!lazyRouteLoader && !routeModuleImporter) {\n return null\n }\n\n const prefetchPromise = Promise.resolve(lazyRouteLoader ? lazyRouteLoader() : routeModuleImporter!())\n .then((module) => {\n if (!module || typeof module !== \"object\") return null\n return module as Record<string, unknown>\n })\n .catch((error) => {\n routeModuleCacheRef.current.delete(routeId)\n throw error\n })\n\n routeModuleCacheRef.current.set(routeId, prefetchPromise)\n return prefetchPromise\n }\n\n const prefetchRouteData = async (router: DataRouter, route: PrefetchableRoute, href: string): Promise<void> => {\n const routeId = route.id\n if (!routeId) return\n\n const now = Date.now()\n pruneDataCache(routeDataCacheRef.current, now)\n\n const cacheKey = `${routeId}|${href}`\n const cached = routeDataCacheRef.current.get(cacheKey)\n if (cached && cached.expiresAt > now) {\n await cached.promise\n return\n }\n\n let hasLoader = typeof route.loader === \"function\"\n if (!hasLoader) {\n const loadedRouteModule = await prefetchRouteModule(route).catch(() => null)\n hasLoader = typeof loadedRouteModule?.loader === \"function\"\n }\n\n if (!hasLoader) return\n\n const fetcherKey = `rb:prefetch:${routeId}:${href}`\n\n const prefetchPromise = Promise.resolve(router.fetch(fetcherKey, routeId, href))\n .catch((error) => {\n routeDataCacheRef.current.delete(cacheKey)\n throw error\n })\n .finally(() => {\n try {\n router.deleteFetcher(fetcherKey)\n } catch {\n return\n }\n })\n\n const ttl = Math.max(1, dataPrefetchTtlMs)\n routeDataCacheRef.current.set(cacheKey, {\n expiresAt: now + ttl,\n promise: prefetchPromise,\n })\n\n await prefetchPromise\n }\n\n const prefetch = async (href: string, opts?: RoutePrefetchCallOptions): Promise<void> => {\n const normalized = normalizeHref(href)\n if (!normalized) return\n\n const currentPathWithSearch =\n typeof window === \"undefined\"\n ? \"\"\n : `${window.location.pathname}${window.location.search}`\n if (normalized.pathWithSearch === currentPathWithSearch) {\n return\n }\n\n const router = dataRouterContext?.router as DataRouter | undefined\n if (!router) return\n\n const matches = matchRoutes(\n router.routes,\n {\n pathname: normalized.pathname,\n search: normalized.search,\n hash: normalized.hash,\n },\n router.basename,\n )\n\n if (!matches || matches.length === 0) {\n return\n }\n\n const matchedRoutes = matches.map((match) => match.route as PrefetchableRoute)\n\n if (opts?.prefetchCode !== false) {\n await Promise.all(\n matchedRoutes.map(async (route) => {\n try {\n await prefetchRouteModule(route)\n } catch {\n return\n }\n }),\n )\n }\n\n await Promise.all(\n matchedRoutes.map(async (route) => {\n if (!resolveDataPrefetchFlag(route, opts?.prefetchData, dataPrefetchHandleKey)) {\n return\n }\n\n try {\n await prefetchRouteData(router, route, normalized.pathWithSearch)\n } catch {\n return\n }\n }),\n )\n }\n\n return (\n <RoutePrefetchContext.Provider\n value={{\n defaultPrefetch,\n prefetch,\n prefetchCode: async (href) => prefetch(href, { prefetchCode: true, prefetchData: false }),\n prefetchData: async (href) => prefetch(href, { prefetchCode: false, prefetchData: true }),\n }}\n >\n {children}\n </RoutePrefetchContext.Provider>\n )\n}\n\nexport const useRoutePrefetch = (): RoutePrefetchApi => useContext(RoutePrefetchContext)\n\nexport type { RoutePrefetchProviderProps }\n","import { forwardRef, useEffect, useRef, type Ref, type SyntheticEvent } from \"react\"\nimport { Link as RouterLink, type LinkProps as RouterLinkProps } from \"react-router\"\n\nimport { type RoutePrefetchBehavior, useRoutePrefetch } from \"./routePrefetch\"\n\n\nconst ABSOLUTE_URL_REGEX = /^(?:[a-z][a-z0-9+.-]*:|\\/\\/)/i\n\ntype LinkProps = Omit<RouterLinkProps, \"prefetch\"> & {\n prefetch?: RoutePrefetchBehavior\n prefetchData?: boolean\n}\n\nconst assignRef = <TValue,>(ref: Ref<TValue> | undefined, value: TValue) => {\n if (!ref) return\n if (typeof ref === \"function\") {\n ref(value)\n return\n }\n ref.current = value\n}\n\nconst composeEventHandlers = <TEvent extends SyntheticEvent>(\n theirHandler: ((event: TEvent) => void) | undefined,\n ourHandler: () => void,\n) => {\n return (event: TEvent) => {\n theirHandler?.(event)\n if (!event.defaultPrevented) {\n ourHandler()\n }\n }\n}\n\nconst shouldPrefetchLink = ({\n prefetch,\n reloadDocument,\n target,\n to,\n}: {\n prefetch: RoutePrefetchBehavior\n reloadDocument: boolean | undefined\n target: string | undefined\n to: RouterLinkProps[\"to\"]\n}): boolean => {\n if (prefetch === \"none\") return false\n if (reloadDocument) return false\n if (typeof target === \"string\" && target !== \"_self\") return false\n if (typeof to === \"string\" && ABSOLUTE_URL_REGEX.test(to)) return false\n return true\n}\n\nconst usePrefetchLink = (\n prefetchData: boolean | undefined,\n): {\n anchorRef: Ref<HTMLAnchorElement>\n prefetchHref: () => void\n getAnchorElement: () => HTMLAnchorElement | null\n} => {\n const localRef = useRef<HTMLAnchorElement | null>(null)\n const { prefetch } = useRoutePrefetch()\n\n return {\n anchorRef: (node) => {\n localRef.current = node\n },\n getAnchorElement: () => localRef.current,\n prefetchHref: () => {\n const href = localRef.current?.getAttribute(\"href\")\n if (!href) return\n void prefetch(href, { prefetchData })\n },\n }\n}\n\nexport const Link = forwardRef<HTMLAnchorElement, LinkProps>(\n (\n {\n prefetch: prefetchProp,\n prefetchData,\n onMouseEnter,\n onFocus,\n onTouchStart,\n reloadDocument,\n target,\n to,\n ...props\n },\n forwardedRef,\n ) => {\n const { defaultPrefetch } = useRoutePrefetch()\n const prefetchBehavior = prefetchProp ?? defaultPrefetch\n const viewportPrefetchedRef = useRef(false)\n const { anchorRef, prefetchHref, getAnchorElement } = usePrefetchLink(prefetchData)\n const canPrefetch = shouldPrefetchLink({\n prefetch: prefetchBehavior,\n reloadDocument,\n target,\n to,\n })\n\n useEffect(() => {\n viewportPrefetchedRef.current = false\n }, [to])\n\n useEffect(() => {\n if (!canPrefetch || prefetchBehavior !== \"render\") return\n prefetchHref()\n }, [canPrefetch, prefetchBehavior, prefetchHref])\n\n useEffect(() => {\n if (!canPrefetch || prefetchBehavior !== \"viewport\") return\n\n const element = getAnchorElement()\n if (!element || typeof IntersectionObserver === \"undefined\") return\n\n const observer = new IntersectionObserver(\n (entries) => {\n const isVisible = entries.some((entry) => entry.isIntersecting)\n if (!isVisible || viewportPrefetchedRef.current) return\n viewportPrefetchedRef.current = true\n prefetchHref()\n },\n { threshold: 0.5 },\n )\n\n observer.observe(element)\n return () => {\n observer.disconnect()\n }\n }, [canPrefetch, prefetchBehavior, prefetchHref, getAnchorElement])\n\n const handleIntentPrefetch = () => {\n if (!canPrefetch || prefetchBehavior !== \"intent\") return\n prefetchHref()\n }\n\n return (\n <RouterLink\n {...props}\n to={to}\n target={target}\n reloadDocument={reloadDocument}\n prefetch=\"none\"\n onMouseEnter={composeEventHandlers(onMouseEnter, handleIntentPrefetch)}\n onFocus={composeEventHandlers(onFocus, handleIntentPrefetch)}\n onTouchStart={composeEventHandlers(onTouchStart, handleIntentPrefetch)}\n ref={(node) => {\n assignRef(forwardedRef, node)\n assignRef(anchorRef, node)\n }}\n />\n )\n },\n)\n\nLink.displayName = \"Link\"\n\nexport type { LinkProps }\n","import { LoaderFunction } from \"react-router\"\n\nimport { mergeRouteHandle, RouteHandleObject } from \"./routePrefetchHandles\"\n\n\ntype RouteModuleLoader = (...args: any[]) => unknown\n\ntype RouteModule = {\n default: React.ComponentType<unknown>\n loader?: RouteModuleLoader\n}\n\ntype RouteModuleImporter = () => Promise<RouteModule>\n\ntype RouteOptions = {\n handle?: unknown\n prefetchData?: boolean\n prefetchDataKey?: string\n}\n\ntype LazyRouteResult = {\n lazy: () => Promise<{\n Component: React.ComponentType<unknown>\n loader?: LoaderFunction\n }>\n handle: RouteHandleObject\n}\n\nconst DYNAMIC_IMPORT_RELOAD_GUARD_MS = 60_000\nconst DYNAMIC_IMPORT_RELOAD_TIMEOUT_MS = 5_000\nconst DYNAMIC_IMPORT_RELOAD_STORAGE_KEY = \"rpcbase:dynamic-import-reload-at\"\nconst DYNAMIC_IMPORT_ERROR_PATTERNS = [\n /failed to fetch dynamically imported module/i,\n /importing a module script failed/i,\n /error loading dynamically imported module/i,\n /networkerror when attempting to fetch resource/i,\n /unable to preload css/i,\n /loading (?:css )?chunk .+ failed/i,\n]\n\nconst isDynamicImportError = (error: unknown): boolean => {\n const message = error instanceof Error ? error.message : typeof error === \"string\" ? error : \"\"\n return DYNAMIC_IMPORT_ERROR_PATTERNS.some((pattern) => pattern.test(message))\n}\n\nconst markPageReloadRequested = (): boolean => {\n if (typeof window === \"undefined\") return false\n if (typeof navigator !== \"undefined\" && navigator.onLine === false) return false\n\n const now = Date.now()\n\n try {\n const previousReloadAt = Number(window.sessionStorage.getItem(DYNAMIC_IMPORT_RELOAD_STORAGE_KEY))\n if (Number.isFinite(previousReloadAt) && now - previousReloadAt < DYNAMIC_IMPORT_RELOAD_GUARD_MS) {\n return false\n }\n window.sessionStorage.setItem(DYNAMIC_IMPORT_RELOAD_STORAGE_KEY, String(now))\n } catch {\n return false\n }\n\n return true\n}\n\nconst clearPageReloadGuard = (): void => {\n try {\n window.sessionStorage.removeItem(DYNAMIC_IMPORT_RELOAD_STORAGE_KEY)\n } catch {\n return\n }\n}\n\nconst reloadPage = (error: unknown): Promise<never> =>\n new Promise((_, reject) => {\n let pending = true\n\n const rejectIfPageRemains = () => {\n if (!pending) return\n pending = false\n window.removeEventListener(\"pagehide\", handlePageHide)\n clearPageReloadGuard()\n reject(error)\n }\n\n const timeout = window.setTimeout(rejectIfPageRemains, DYNAMIC_IMPORT_RELOAD_TIMEOUT_MS)\n const handlePageHide = () => {\n if (!pending) return\n pending = false\n window.clearTimeout(timeout)\n }\n\n window.addEventListener(\"pagehide\", handlePageHide, { once: true })\n\n try {\n window.location.reload()\n } catch {\n rejectIfPageRemains()\n }\n })\n\nconst memoizeImporter = (importer: RouteModuleImporter): RouteModuleImporter => {\n let promise: Promise<RouteModule> | null = null\n\n return async () => {\n if (!promise) {\n promise = importer().catch((error) => {\n promise = null\n throw error\n })\n }\n\n return promise\n }\n}\n\nexport const lazyRoute = (importer: RouteModuleImporter, opts?: RouteOptions): LazyRouteResult => {\n const loadModule = memoizeImporter(importer)\n\n return {\n lazy: async () => {\n let module: RouteModule\n try {\n module = await loadModule()\n } catch (error) {\n if (isDynamicImportError(error) && markPageReloadRequested()) {\n return reloadPage(error)\n }\n throw error\n }\n const lazyRouteModule: {\n Component: React.ComponentType<unknown>\n loader?: LoaderFunction\n } = {\n Component: module.default,\n }\n\n if (typeof module.loader === \"function\") {\n lazyRouteModule.loader = module.loader as unknown as LoaderFunction\n }\n\n return lazyRouteModule\n },\n handle: mergeRouteHandle(opts?.handle, {\n importer: loadModule,\n prefetchData: opts?.prefetchData,\n prefetchDataKey: opts?.prefetchDataKey,\n }),\n }\n}\n","import { useEffect } from \"react\"\nimport { useLocation } from \"react-router\"\n\n\ntype MetaAttributeValue = string | number | boolean | undefined\ntype MetaEntry = Record<string, MetaAttributeValue>\n\ntype PageMeta = {\n title: string\n meta: MetaEntry[]\n}\n\n\nexport const useApplyMeta = ({\n defaultTitle = \"\",\n defaultMeta = [],\n pagesMeta = {}\n}: {\n defaultTitle?: string\n defaultMeta?: MetaEntry[]\n pagesMeta?: Record<string, PageMeta>\n} = {}) => {\n const location = useLocation()\n\n useEffect(() => {\n const loadMeta = async () => {\n\n let pageMeta = pagesMeta[location.pathname]\n\n if (!pageMeta) {\n pageMeta = { title: defaultTitle, meta: defaultMeta }\n }\n\n document.title = pageMeta.title\n\n // Remove previous dynamically inserted tags\n document.querySelectorAll(\"[data-react-meta]\").forEach((tag) => tag.remove())\n\n // Inject new tags\n pageMeta.meta.forEach((meta) => {\n const metaElement = document.createElement(\"meta\")\n metaElement.setAttribute(\"data-react-meta\", \"true\")\n\n // Set all attributes from the meta object\n Object.entries(meta).forEach(([key, value]) => {\n if (value) {\n metaElement.setAttribute(key, value.toString())\n }\n })\n\n document.head.appendChild(metaElement)\n })\n\n // Update canonical link\n const canonicalUrl = `${window.location.origin}${location.pathname}`\n\n const existingCanonical = document.querySelector(\"link[rel=\\\"canonical\\\"]\")\n if (existingCanonical) {\n existingCanonical.remove()\n }\n\n const canonicalLink = document.createElement(\"link\")\n canonicalLink.setAttribute(\"rel\", \"canonical\")\n canonicalLink.setAttribute(\"href\", canonicalUrl)\n canonicalLink.setAttribute(\"data-react-meta\", \"true\")\n document.head.appendChild(canonicalLink)\n }\n\n loadMeta()\n }, [location.pathname, defaultTitle, defaultMeta, pagesMeta])\n}\n","import { useEffect, useRef } from \"react\"\nimport type { BlockerFunction } from \"react-router\"\n\n\nexport type NavigationGuard = {\n id: string\n enabled: boolean\n priority?: number\n message: string\n blockOnSearch?: boolean\n shouldBlockNavigation: BlockerFunction\n shouldBlockUnload: boolean\n}\n\ntype NavigationGuardsListener = () => void\n\ntype NavigationGuardsStore = {\n guards: Map<string, NavigationGuard>\n listeners: Set<NavigationGuardsListener>\n}\n\nconst NAVIGATION_GUARDS_STORE_KEY = \"__rpcbaseNavigationGuardsStore\"\n\nconst getNavigationGuardsStore = (): NavigationGuardsStore => {\n const globalAny = globalThis as {\n [NAVIGATION_GUARDS_STORE_KEY]?: NavigationGuardsStore\n }\n\n const existing = globalAny[NAVIGATION_GUARDS_STORE_KEY]\n if (existing) {\n return existing\n }\n\n const created: NavigationGuardsStore = {\n guards: new Map<string, NavigationGuard>(),\n listeners: new Set<NavigationGuardsListener>(),\n }\n\n globalAny[NAVIGATION_GUARDS_STORE_KEY] = created\n return created\n}\n\nconst notify = (): void => {\n getNavigationGuardsStore().listeners.forEach((listener) => {\n listener()\n })\n}\n\nconst isSameGuard = (a: NavigationGuard, b: NavigationGuard): boolean =>\n a.id === b.id &&\n a.enabled === b.enabled &&\n a.priority === b.priority &&\n a.message === b.message &&\n a.blockOnSearch === b.blockOnSearch &&\n a.shouldBlockNavigation === b.shouldBlockNavigation &&\n a.shouldBlockUnload === b.shouldBlockUnload\n\nexport const upsertNavigationGuard = (guard: NavigationGuard): void => {\n const guards = getNavigationGuardsStore().guards\n const prev = guards.get(guard.id)\n if (prev && isSameGuard(prev, guard)) {\n return\n }\n\n guards.set(guard.id, guard)\n notify()\n}\n\nexport const removeNavigationGuard = (id: string): void => {\n const guards = getNavigationGuardsStore().guards\n const didDelete = guards.delete(id)\n if (didDelete) {\n notify()\n }\n}\n\nexport const getNavigationGuards = (): NavigationGuard[] =>\n Array.from(getNavigationGuardsStore().guards.values())\n\nexport const subscribeNavigationGuards = (\n listener: NavigationGuardsListener,\n): (() => void) => {\n const listeners = getNavigationGuardsStore().listeners\n listeners.add(listener)\n return () => {\n listeners.delete(listener)\n }\n}\n\nexport const useRegisterNavigationGuard = (guard: NavigationGuard): void => {\n const latestGuardRef = useRef(guard)\n latestGuardRef.current = guard\n\n const lastIdRef = useRef<string | null>(null)\n\n useEffect(() => {\n const lastId = lastIdRef.current\n if (lastId && lastId !== guard.id) {\n removeNavigationGuard(lastId)\n }\n lastIdRef.current = guard.id\n\n if (!guard.enabled) {\n removeNavigationGuard(guard.id)\n return\n }\n\n upsertNavigationGuard(latestGuardRef.current)\n return () => {\n removeNavigationGuard(guard.id)\n }\n }, [\n guard.id,\n guard.enabled,\n guard.message,\n guard.priority,\n guard.blockOnSearch,\n guard.shouldBlockNavigation,\n guard.shouldBlockUnload,\n ])\n}\n","import {\n Component,\n Suspense,\n cloneElement,\n createElement,\n isValidElement,\n useContext,\n useEffect,\n useRef,\n useState,\n useSyncExternalStore,\n type CSSProperties,\n type ErrorInfo,\n type ReactElement,\n type ReactNode,\n} from \"react\"\nimport { createPortal } from \"react-dom\"\nimport { UNSAFE_LocationContext } from \"react-router\"\n\n\nexport type UseQueryOverlayOptions<TOverlay> = {\n params: string[]\n parse: (params: URLSearchParams) => TOverlay | null\n write: (params: URLSearchParams, state: TOverlay) => void\n clear: (params: URLSearchParams) => void\n closeDelayMs?: number\n}\n\nexport type QueryOverlayApi<TOverlay> = {\n value: TOverlay | null\n isOpen: boolean\n shouldRender: boolean\n buildHref: (nextValue: TOverlay | null) => string\n openOverlay: (nextValue: TOverlay) => void\n closeOverlay: () => void\n resetOptimisticClose: () => void\n}\n\nexport type QueryOverlayRenderControls = {\n open: boolean\n setOpen: (open: boolean) => void\n closeOverlay: () => void\n resetOptimisticClose: () => void\n}\n\nexport type QueryOverlayFallbackControls = QueryOverlayRenderControls & {\n onOpenChange: (open: boolean) => void\n}\n\nexport type QueryOverlayFallbackRender = (controls: QueryOverlayFallbackControls) => ReactNode\n\nexport type QueryOverlayErrorFallbackRender = (\n controls: QueryOverlayFallbackControls & {\n error: unknown\n },\n) => ReactNode\n\nexport type QueryOverlayLoadingFallbackProps = {\n open?: boolean\n label?: ReactNode\n}\n\nexport type QueryOverlayProps<TOverlay> = {\n overlay: QueryOverlayApi<TOverlay>\n fallback?: ReactNode | QueryOverlayFallbackRender\n errorFallback?: ReactNode | QueryOverlayErrorFallbackRender\n children: (state: TOverlay, controls: QueryOverlayRenderControls) => ReactNode\n}\n\ntype QueryOverlayErrorBoundaryProps = {\n children?: ReactNode\n fallback: (error: unknown) => ReactNode\n resetKey: string\n}\n\nclass QueryOverlayErrorBoundary extends Component<QueryOverlayErrorBoundaryProps, { error: unknown | null }> {\n state = { error: null }\n\n static getDerivedStateFromError(error: unknown) {\n return { error }\n }\n\n componentDidCatch(error: unknown, errorInfo: ErrorInfo) {\n console.error(\"Query overlay rendering error\", error, errorInfo)\n }\n\n componentDidUpdate(previousProps: QueryOverlayErrorBoundaryProps) {\n if (this.state.error === null) return\n if (previousProps.resetKey === this.props.resetKey) return\n this.setState({ error: null })\n }\n\n render() {\n return this.state.error === null ? this.props.children : this.props.fallback(this.state.error)\n }\n}\n\nconst QUERY_OVERLAY_URL_CHANGE_EVENT = \"rpcbase-query-overlay-url-change\"\n\ntype UrlSnapshot = {\n pathname: string\n search: string\n hash: string\n}\n\nfunction getCurrentUrlSnapshot(fallback?: UrlSnapshot): UrlSnapshot {\n if (typeof window === \"undefined\") {\n return fallback ?? { pathname: \"\", search: \"\", hash: \"\" }\n }\n\n return {\n pathname: window.location.pathname,\n search: window.location.search,\n hash: window.location.hash,\n }\n}\n\nfunction getParamValueFromSearch(search: string, param: string) {\n return new URLSearchParams(search).get(param)\n}\n\nfunction getSearchFromUrlSnapshot(fallback?: UrlSnapshot) {\n return getCurrentUrlSnapshot(fallback).search\n}\n\nfunction useRouterUrlSnapshot(): UrlSnapshot | undefined {\n const context = useContext(UNSAFE_LocationContext)\n const location = context?.location\n if (!location) return undefined\n return {\n pathname: location.pathname,\n search: location.search,\n hash: location.hash,\n }\n}\n\nfunction getCurrentParamValue(param: string) {\n if (typeof window === \"undefined\") return null\n return getParamValueFromSearch(window.location.search, param)\n}\n\nfunction getCurrentSearch() {\n if (typeof window === \"undefined\") return \"\"\n return window.location.search\n}\n\nfunction subscribeToQueryOverlayUrl(listener: () => void) {\n if (typeof window === \"undefined\") return () => undefined\n\n window.addEventListener(QUERY_OVERLAY_URL_CHANGE_EVENT, listener)\n window.addEventListener(\"popstate\", listener)\n return () => {\n window.removeEventListener(QUERY_OVERLAY_URL_CHANGE_EVENT, listener)\n window.removeEventListener(\"popstate\", listener)\n }\n}\n\nfunction buildUrl(searchParams: URLSearchParams, fallback?: UrlSnapshot) {\n const { pathname, hash } = getCurrentUrlSnapshot(fallback)\n const nextSearch = searchParams.toString()\n return `${pathname}${nextSearch ? `?${nextSearch}` : \"\"}${hash}`\n}\n\nfunction clearOverlaySearchParams(\n searchParams: URLSearchParams,\n params: string[],\n clear: (params: URLSearchParams) => void,\n) {\n clear(searchParams)\n for (const param of params) {\n searchParams.delete(param)\n }\n}\n\nfunction buildOverlayUrlStateKey(search: string, params: string[]) {\n const searchParams = new URLSearchParams(search)\n return params\n .map((param) => {\n const values = searchParams.getAll(param)\n return `${param}:${values.join(\"\\u0000\")}`\n })\n .join(\"\\u0001\")\n}\n\nconst queryOverlayLoadingBackdropStyle = (open: boolean): CSSProperties => ({\n position: \"fixed\",\n inset: 0,\n zIndex: 50,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n background: \"rgba(0, 0, 0, 0.5)\",\n color: \"white\",\n opacity: open ? 1 : 0,\n pointerEvents: open ? \"auto\" : \"none\",\n transition: \"opacity 150ms ease\",\n})\n\nconst queryOverlayLoadingStatusStyle: CSSProperties = {\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 10,\n fontSize: 14,\n fontWeight: 500,\n}\n\nexport function QueryOverlayLoadingFallback({\n open = true,\n label = \"Loading...\",\n}: QueryOverlayLoadingFallbackProps): ReactElement {\n const backdrop = createElement(\n \"div\",\n {\n \"data-rpcbase-query-overlay-loading\": \"\",\n \"data-state\": open ? \"open\" : \"closed\",\n style: queryOverlayLoadingBackdropStyle(open),\n },\n createElement(\n \"div\",\n {\n role: \"status\",\n \"aria-live\": \"polite\",\n style: queryOverlayLoadingStatusStyle,\n },\n createElement(\n \"svg\",\n {\n \"aria-hidden\": true,\n focusable: \"false\",\n height: 20,\n viewBox: \"0 0 24 24\",\n width: 20,\n },\n createElement(\"circle\", {\n cx: 12,\n cy: 12,\n fill: \"none\",\n r: 9,\n stroke: \"currentColor\",\n strokeOpacity: 0.35,\n strokeWidth: 3,\n }),\n createElement(\n \"path\",\n {\n d: \"M21 12a9 9 0 0 0-9-9\",\n fill: \"none\",\n stroke: \"currentColor\",\n strokeLinecap: \"round\",\n strokeWidth: 3,\n },\n createElement(\"animateTransform\", {\n attributeName: \"transform\",\n dur: \"0.8s\",\n from: \"0 12 12\",\n repeatCount: \"indefinite\",\n to: \"360 12 12\",\n type: \"rotate\",\n }),\n ),\n ),\n createElement(\"span\", null, label),\n ),\n )\n\n return typeof document === \"undefined\" ? backdrop : createPortal(backdrop, document.body)\n}\n\nconst QUERY_OVERLAY_LOADING_FALLBACK = createElement(QueryOverlayLoadingFallback)\n\nfunction renderQueryOverlayFallback(\n fallback: ReactNode | QueryOverlayFallbackRender | QueryOverlayErrorFallbackRender | undefined,\n controls: QueryOverlayFallbackControls,\n error?: unknown,\n includeError = false,\n) {\n if (typeof fallback === \"function\") {\n if (!includeError) {\n return (fallback as QueryOverlayFallbackRender)(controls)\n }\n\n return (fallback as QueryOverlayErrorFallbackRender)({ ...controls, error })\n }\n\n if (isValidElement(fallback)) {\n return cloneElement(fallback as ReactElement<Record<string, unknown>>, {\n open: controls.open,\n isOpen: controls.open,\n setOpen: controls.setOpen,\n onOpenChange: controls.onOpenChange,\n closeOverlay: controls.closeOverlay,\n error,\n })\n }\n\n return fallback ?? null\n}\n\nexport function replaceQueryParams(update: (searchParams: URLSearchParams) => void) {\n if (typeof window === \"undefined\") return\n\n const { pathname, search, hash } = getCurrentUrlSnapshot()\n const searchParams = new URLSearchParams(search)\n update(searchParams)\n\n const nextUrl = buildUrl(searchParams)\n const currentUrl = `${pathname}${search}${hash}`\n if (nextUrl === currentUrl) return\n\n window.history.replaceState(window.history.state, \"\", nextUrl)\n window.dispatchEvent(new Event(QUERY_OVERLAY_URL_CHANGE_EVENT))\n}\n\nexport function useQueryParam(param: string): string | null {\n const routerUrlSnapshot = useRouterUrlSnapshot()\n return useSyncExternalStore(\n subscribeToQueryOverlayUrl,\n () => getCurrentParamValue(param),\n () => getParamValueFromSearch(routerUrlSnapshot?.search ?? \"\", param),\n )\n}\n\nexport function useQuerySearch(): string {\n const routerUrlSnapshot = useRouterUrlSnapshot()\n return useSyncExternalStore(\n subscribeToQueryOverlayUrl,\n getCurrentSearch,\n () => getSearchFromUrlSnapshot(routerUrlSnapshot),\n )\n}\n\nexport const useQueryOverlay = <TOverlay>({\n params,\n parse,\n write,\n clear,\n closeDelayMs = 0,\n}: UseQueryOverlayOptions<TOverlay>): QueryOverlayApi<TOverlay> => {\n const routerUrlSnapshot = useRouterUrlSnapshot()\n const search = useQuerySearch()\n const [isOptimisticallyClosed, setIsOptimisticallyClosed] = useState(false)\n const closeTimeoutRef = useRef<number | null>(null)\n const value = parse(new URLSearchParams(search))\n const isUrlOpen = value !== null\n const overlayUrlStateKey = buildOverlayUrlStateKey(search, params)\n\n const clearScheduledClose = () => {\n if (closeTimeoutRef.current === null) return\n window.clearTimeout(closeTimeoutRef.current)\n closeTimeoutRef.current = null\n }\n\n const resetOptimisticClose = () => {\n clearScheduledClose()\n setIsOptimisticallyClosed(false)\n }\n\n const closeUrlOverlay = () => {\n replaceQueryParams((searchParams) => {\n clearOverlaySearchParams(searchParams, params, clear)\n })\n }\n\n const buildHref = (nextValue: TOverlay | null): string => {\n const searchParams = new URLSearchParams(getCurrentUrlSnapshot(routerUrlSnapshot).search)\n clearOverlaySearchParams(searchParams, params, clear)\n\n if (nextValue !== null) {\n write(searchParams, nextValue)\n }\n\n return buildUrl(searchParams, routerUrlSnapshot)\n }\n\n const openOverlay = (nextValue: TOverlay) => {\n resetOptimisticClose()\n replaceQueryParams((searchParams) => {\n clearOverlaySearchParams(searchParams, params, clear)\n write(searchParams, nextValue)\n })\n }\n\n const closeOverlay = () => {\n if (!isUrlOpen) return\n\n setIsOptimisticallyClosed(true)\n clearScheduledClose()\n\n if (typeof window === \"undefined\" || closeDelayMs <= 0) {\n closeUrlOverlay()\n return\n }\n\n closeTimeoutRef.current = window.setTimeout(() => {\n closeTimeoutRef.current = null\n closeUrlOverlay()\n }, closeDelayMs)\n }\n\n useEffect(() => {\n if (isUrlOpen) {\n setIsOptimisticallyClosed(false)\n return\n }\n\n clearScheduledClose()\n setIsOptimisticallyClosed(false)\n }, [isUrlOpen, overlayUrlStateKey])\n\n useEffect(() => {\n return () => {\n clearScheduledClose()\n }\n }, [])\n\n return {\n isOpen: isUrlOpen && !isOptimisticallyClosed,\n shouldRender: isUrlOpen,\n value,\n buildHref,\n openOverlay,\n closeOverlay,\n resetOptimisticClose,\n }\n}\n\nexport function QueryOverlay<TOverlay>({\n overlay,\n fallback,\n errorFallback,\n children,\n}: QueryOverlayProps<TOverlay>): ReactElement | null {\n if (!overlay.shouldRender || overlay.value === null) return null\n\n const setOpen = (open: boolean) => {\n if (open) {\n overlay.resetOptimisticClose()\n return\n }\n\n overlay.closeOverlay()\n }\n\n const controls: QueryOverlayRenderControls = {\n open: overlay.isOpen,\n setOpen,\n closeOverlay: overlay.closeOverlay,\n resetOptimisticClose: overlay.resetOptimisticClose,\n }\n const fallbackControls = {\n ...controls,\n onOpenChange: setOpen,\n }\n const resetKey = overlay.buildHref(overlay.value)\n const suspenseFallback = fallback === undefined ? QUERY_OVERLAY_LOADING_FALLBACK : fallback\n\n return createElement(\n QueryOverlayErrorBoundary,\n {\n resetKey,\n fallback: (error: unknown) => renderQueryOverlayFallback(errorFallback, fallbackControls, error, true),\n },\n createElement(\n Suspense,\n {\n fallback: renderQueryOverlayFallback(suspenseFallback, fallbackControls),\n },\n children(overlay.value, controls),\n ),\n )\n}\n","import { useEffect, useRef } from \"react\"\nimport { useNavigate } from \"react-router\"\n\n\nexport type KeyboardShortcut = {\n key: string\n mod?: boolean\n ctrl?: boolean\n meta?: boolean\n alt?: boolean\n shift?: boolean\n}\n\nexport type ShortcutTrigger = \"keydown\" | \"keyup\"\n\nexport type UseShortcutPrefetchNavigateOptions = {\n shortcut: KeyboardShortcut\n getHref: () => string\n prefetch?: (href: string) => Promise<void> | void\n navigate?: (href: string) => Promise<void> | void\n trigger?: ShortcutTrigger\n enabled?: boolean\n preventDefault?: boolean\n ignoreTypingTarget?: boolean\n isTypingTarget?: (target: EventTarget | null) => boolean\n}\n\nconst normalizeKey = (key: string): string => key.toLowerCase()\n\nconst defaultIsTypingTarget = (target: EventTarget | null): boolean => {\n const element = target as HTMLElement | null\n const tagName = element?.tagName\n\n return (\n element?.isContentEditable === true ||\n tagName === \"INPUT\" ||\n tagName === \"TEXTAREA\" ||\n tagName === \"SELECT\"\n )\n}\n\nconst matchesShortcutKeyDown = (event: KeyboardEvent, shortcut: KeyboardShortcut): boolean => {\n if (normalizeKey(event.key) !== normalizeKey(shortcut.key)) return false\n\n if (typeof shortcut.mod === \"boolean\") {\n const hasMod = event.metaKey || event.ctrlKey\n if (hasMod !== shortcut.mod) return false\n }\n if (typeof shortcut.ctrl === \"boolean\" && event.ctrlKey !== shortcut.ctrl) return false\n if (typeof shortcut.meta === \"boolean\" && event.metaKey !== shortcut.meta) return false\n if (typeof shortcut.alt === \"boolean\" && event.altKey !== shortcut.alt) return false\n if (typeof shortcut.shift === \"boolean\" && event.shiftKey !== shortcut.shift) return false\n\n return true\n}\n\nconst callMaybeAsync = (fn: ((href: string) => Promise<void> | void) | undefined, href: string) => {\n if (!fn) return\n void Promise.resolve(fn(href))\n}\n\nexport const useShortcutPrefetchNavigate = ({\n shortcut,\n getHref,\n prefetch,\n navigate,\n trigger = \"keyup\",\n enabled = true,\n preventDefault = true,\n ignoreTypingTarget = true,\n isTypingTarget = defaultIsTypingTarget,\n}: UseShortcutPrefetchNavigateOptions): void => {\n const routerNavigate = useNavigate()\n\n const shortcutRef = useRef(shortcut)\n const getHrefRef = useRef(getHref)\n const prefetchRef = useRef(prefetch)\n const navigateRef = useRef(navigate ?? routerNavigate)\n const triggerRef = useRef(trigger)\n const enabledRef = useRef(enabled)\n const preventDefaultRef = useRef(preventDefault)\n const ignoreTypingTargetRef = useRef(ignoreTypingTarget)\n const isTypingTargetRef = useRef(isTypingTarget)\n const waitingForShortcutKeyUpRef = useRef(false)\n\n shortcutRef.current = shortcut\n getHrefRef.current = getHref\n prefetchRef.current = prefetch\n navigateRef.current = navigate ?? routerNavigate\n triggerRef.current = trigger\n enabledRef.current = enabled\n preventDefaultRef.current = preventDefault\n ignoreTypingTargetRef.current = ignoreTypingTarget\n isTypingTargetRef.current = isTypingTarget\n\n if (!enabled || trigger !== \"keyup\") {\n waitingForShortcutKeyUpRef.current = false\n }\n\n useEffect(() => {\n if (typeof window === \"undefined\") return\n\n const onKeyDown = (event: KeyboardEvent) => {\n if (!enabledRef.current) return\n if (ignoreTypingTargetRef.current && isTypingTargetRef.current(event.target)) return\n if (event.repeat) return\n if (!matchesShortcutKeyDown(event, shortcutRef.current)) return\n\n if (preventDefaultRef.current) {\n event.preventDefault()\n }\n\n const href = getHrefRef.current()\n if (!href) return\n\n callMaybeAsync(prefetchRef.current, href)\n\n if (triggerRef.current === \"keydown\") {\n callMaybeAsync(navigateRef.current, href)\n return\n }\n\n waitingForShortcutKeyUpRef.current = true\n }\n\n const onKeyUp = (event: KeyboardEvent) => {\n if (!enabledRef.current) return\n if (triggerRef.current !== \"keyup\") return\n if (!waitingForShortcutKeyUpRef.current) return\n if (normalizeKey(event.key) !== normalizeKey(shortcutRef.current.key)) return\n\n waitingForShortcutKeyUpRef.current = false\n\n if (ignoreTypingTargetRef.current && isTypingTargetRef.current(event.target)) return\n\n if (preventDefaultRef.current) {\n event.preventDefault()\n }\n\n const href = getHrefRef.current()\n if (!href) return\n\n callMaybeAsync(navigateRef.current, href)\n }\n\n const onBlur = () => {\n waitingForShortcutKeyUpRef.current = false\n }\n\n window.addEventListener(\"keydown\", onKeyDown)\n window.addEventListener(\"keyup\", onKeyUp)\n window.addEventListener(\"blur\", onBlur)\n\n return () => {\n window.removeEventListener(\"keydown\", onKeyDown)\n window.removeEventListener(\"keyup\", onKeyUp)\n window.removeEventListener(\"blur\", onBlur)\n }\n }, [])\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["{\n children,\n defaultPrefetch = \"intent\",\n dataPrefetchTtlMs = 30000,\n dataPrefetchHandleKey = ROUTE_PREFETCH_DATA_HANDLE,\n}: RoutePrefetchProviderProps","defaultPrefetch = \"intent\"","dataPrefetchTtlMs = 30000","dataPrefetchHandleKey = ROUTE_PREFETCH_DATA_HANDLE","new Map<string, Promise<Record<string, unknown> | null>>()","new Map<string, DataCacheValue>()","async (route: PrefetchableRoute): Promise<Record<string, unknown> | null> => {\n const routeId = route.id\n if (!routeId) return null\n\n const cached = routeModuleCacheRef.current.get(routeId)\n if (cached) {\n return cached\n }\n\n const lazyRouteLoader = typeof route.lazy === \"function\" ? route.lazy : null\n const routeModuleImporter = getRouteModuleImporterFromHandle(route.handle)\n if (!lazyRouteLoader && !routeModuleImporter) {\n return null\n }\n\n const prefetchPromise = Promise.resolve(lazyRouteLoader ? lazyRouteLoader() : routeModuleImporter!())\n .then((module) => {\n if (!module || typeof module !== \"object\") return null\n return module as Record<string, unknown>\n })\n .catch((error) => {\n routeModuleCacheRef.current.delete(routeId)\n throw error\n })\n\n routeModuleCacheRef.current.set(routeId, prefetchPromise)\n return prefetchPromise\n }","(module) => {\n if (!module || typeof module !== \"object\") return null\n return module as Record<string, unknown>\n }","async (router: DataRouter, route: PrefetchableRoute, href: string): Promise<void> => {\n const routeId = route.id\n if (!routeId) return\n\n const now = Date.now()\n pruneDataCache(routeDataCacheRef.current, now)\n\n const cacheKey = `${routeId}|${href}`\n const cached = routeDataCacheRef.current.get(cacheKey)\n if (cached && cached.expiresAt > now) {\n await cached.promise\n return\n }\n\n let hasLoader = typeof route.loader === \"function\"\n if (!hasLoader) {\n const loadedRouteModule = await prefetchRouteModule(route).catch(() => null)\n hasLoader = typeof loadedRouteModule?.loader === \"function\"\n }\n\n if (!hasLoader) return\n\n const fetcherKey = `rb:prefetch:${routeId}:${href}`\n\n const prefetchPromise = Promise.resolve(router.fetch(fetcherKey, routeId, href))\n .catch((error) => {\n routeDataCacheRef.current.delete(cacheKey)\n throw error\n })\n .finally(() => {\n try {\n router.deleteFetcher(fetcherKey)\n } catch {\n return\n }\n })\n\n const ttl = Math.max(1, dataPrefetchTtlMs)\n routeDataCacheRef.current.set(cacheKey, {\n expiresAt: now + ttl,\n promise: prefetchPromise,\n })\n\n await prefetchPromise\n }","routeId","route","cached","() => null","prefetchPromise","error","async (href: string, opts?: RoutePrefetchCallOptions): Promise<void> => {\n const normalized = normalizeHref(href)\n if (!normalized) return\n\n const currentPathWithSearch =\n typeof window === \"undefined\"\n ? \"\"\n : `${window.location.pathname}${window.location.search}`\n if (normalized.pathWithSearch === currentPathWithSearch) {\n return\n }\n\n const router = dataRouterContext?.router as DataRouter | undefined\n if (!router) return\n\n const matches = matchRoutes(\n router.routes,\n {\n pathname: normalized.pathname,\n search: normalized.search,\n hash: normalized.hash,\n },\n router.basename,\n )\n\n if (!matches || matches.length === 0) {\n return\n }\n\n const matchedRoutes = matches.map((match) => match.route as PrefetchableRoute)\n\n if (opts?.prefetchCode !== false) {\n await Promise.all(\n matchedRoutes.map(async (route) => {\n try {\n await prefetchRouteModule(route)\n } catch {\n return\n }\n }),\n )\n }\n\n await Promise.all(\n matchedRoutes.map(async (route) => {\n if (!resolveDataPrefetchFlag(route, opts?.prefetchData, dataPrefetchHandleKey)) {\n return\n }\n\n try {\n await prefetchRouteData(router, route, normalized.pathWithSearch)\n } catch {\n return\n }\n }),\n )\n }","router","href","(match) => match.route as PrefetchableRoute","async (href) => prefetch(href, { prefetchCode: false, prefetchData: true })","async (href) => prefetch(href, { prefetchCode: true, prefetchData: false })","{\n defaultPrefetch,\n prefetch,\n prefetchCode: async (href) => prefetch(href, { prefetchCode: true, prefetchData: false }),\n prefetchData: async (href) => prefetch(href, { prefetchCode: false, prefetchData: true }),\n }","<RoutePrefetchContext.Provider\n value={{\n defaultPrefetch,\n prefetch,\n prefetchCode: async (href) => prefetch(href, { prefetchCode: true, prefetchData: false }),\n prefetchData: async (href) => prefetch(href, { prefetchCode: false, prefetchData: true }),\n }}\n >\n {children}\n </RoutePrefetchContext.Provider>","RoutePrefetchContext.Provider","(node) => {\n localRef.current = node\n }","() => localRef.current","{\n anchorRef: (node) => {\n localRef.current = node\n },\n getAnchorElement: () => localRef.current,\n prefetchHref: () => {\n const href = localRef.current?.getAttribute(\"href\")\n if (!href) return\n void prefetch(href, { prefetchData })\n },\n }","{\n prefetch: prefetchProp,\n prefetchData,\n onMouseEnter,\n onFocus,\n onTouchStart,\n reloadDocument,\n target,\n to,\n ...props\n }","shouldPrefetchLink({\n prefetch: prefetchBehavior,\n reloadDocument,\n target,\n to,\n })","() => {\n viewportPrefetchedRef.current = false\n }","[to]","() => {\n if (!canPrefetch || prefetchBehavior !== \"render\") return\n prefetchHref()\n }","[canPrefetch, prefetchBehavior, prefetchHref]","() => {\n if (!canPrefetch || prefetchBehavior !== \"viewport\") return\n\n const element = getAnchorElement()\n if (!element || typeof IntersectionObserver === \"undefined\") return\n\n const observer = new IntersectionObserver(\n (entries) => {\n const isVisible = entries.some((entry) => entry.isIntersecting)\n if (!isVisible || viewportPrefetchedRef.current) return\n viewportPrefetchedRef.current = true\n prefetchHref()\n },\n { threshold: 0.5 },\n )\n\n observer.observe(element)\n return () => {\n observer.disconnect()\n }\n }","[canPrefetch, prefetchBehavior, prefetchHref, getAnchorElement]","(entry) => entry.isIntersecting","() => {\n if (!canPrefetch || prefetchBehavior !== \"intent\") return\n prefetchHref()\n }","composeEventHandlers(onMouseEnter, handleIntentPrefetch)","composeEventHandlers(onFocus, handleIntentPrefetch)","composeEventHandlers(onTouchStart, handleIntentPrefetch)","(node) => {\n assignRef(forwardedRef, node)\n assignRef(anchorRef, node)\n }","<RouterLink\n {...props}\n to={to}\n target={target}\n reloadDocument={reloadDocument}\n prefetch=\"none\"\n onMouseEnter={composeEventHandlers(onMouseEnter, handleIntentPrefetch)}\n onFocus={composeEventHandlers(onFocus, handleIntentPrefetch)}\n onTouchStart={composeEventHandlers(onTouchStart, handleIntentPrefetch)}\n ref={(node) => {\n assignRef(forwardedRef, node)\n assignRef(anchorRef, node)\n }}\n />","{\n defaultTitle = \"\",\n defaultMeta = [],\n pagesMeta = {}\n}: {\n defaultTitle?: string\n defaultMeta?: MetaEntry[]\n pagesMeta?: Record<string, PageMeta>\n} = {}","defaultTitle = \"\"","defaultMeta = []","pagesMeta = {}","() => {\n const loadMeta = async () => {\n\n let pageMeta = pagesMeta[location.pathname]\n\n if (!pageMeta) {\n pageMeta = { title: defaultTitle, meta: defaultMeta }\n }\n\n document.title = pageMeta.title\n\n // Remove previous dynamically inserted tags\n document.querySelectorAll(\"[data-react-meta]\").forEach((tag) => tag.remove())\n\n // Inject new tags\n pageMeta.meta.forEach((meta) => {\n const metaElement = document.createElement(\"meta\")\n metaElement.setAttribute(\"data-react-meta\", \"true\")\n\n // Set all attributes from the meta object\n Object.entries(meta).forEach(([key, value]) => {\n if (value) {\n metaElement.setAttribute(key, value.toString())\n }\n })\n\n document.head.appendChild(metaElement)\n })\n\n // Update canonical link\n const canonicalUrl = `${window.location.origin}${location.pathname}`\n\n const existingCanonical = document.querySelector(\"link[rel=\\\"canonical\\\"]\")\n if (existingCanonical) {\n existingCanonical.remove()\n }\n\n const canonicalLink = document.createElement(\"link\")\n canonicalLink.setAttribute(\"rel\", \"canonical\")\n canonicalLink.setAttribute(\"href\", canonicalUrl)\n canonicalLink.setAttribute(\"data-react-meta\", \"true\")\n document.head.appendChild(canonicalLink)\n }\n\n loadMeta()\n }","[location.pathname, defaultTitle, defaultMeta, pagesMeta]","pathname","(tag) => tag.remove()","(meta) => {\n const metaElement = document.createElement(\"meta\")\n metaElement.setAttribute(\"data-react-meta\", \"true\")\n\n // Set all attributes from the meta object\n Object.entries(meta).forEach(([key, value]) => {\n if (value) {\n metaElement.setAttribute(key, value.toString())\n }\n })\n\n document.head.appendChild(metaElement)\n }","[key, value]","{\n pathname: location.pathname,\n search: location.search,\n hash: location.hash,\n }","hash","pathname","search","() => getCurrentParamValue(param)","() => getParamValueFromSearch(routerUrlSnapshot?.search ?? \"\", param)","() => getSearchFromUrlSnapshot(routerUrlSnapshot)","{\n params,\n parse,\n write,\n clear,\n closeDelayMs = 0,\n}: UseQueryOverlayOptions<TOverlay>","closeDelayMs = 0","parse(new URLSearchParams(search))","buildOverlayUrlStateKey(search, params)","() => {\n if (closeTimeoutRef.current === null) return\n window.clearTimeout(closeTimeoutRef.current)\n closeTimeoutRef.current = null\n }","() => {\n clearScheduledClose()\n setIsOptimisticallyClosed(false)\n }","() => {\n replaceQueryParams((searchParams) => {\n clearOverlaySearchParams(searchParams, params, clear)\n })\n }","(nextValue: TOverlay | null): string => {\n const searchParams = new URLSearchParams(getCurrentUrlSnapshot(routerUrlSnapshot).search)\n clearOverlaySearchParams(searchParams, params, clear)\n\n if (nextValue !== null) {\n write(searchParams, nextValue)\n }\n\n return buildUrl(searchParams, routerUrlSnapshot)\n }","searchParams","(nextValue: TOverlay) => {\n resetOptimisticClose()\n replaceQueryParams((searchParams) => {\n clearOverlaySearchParams(searchParams, params, clear)\n write(searchParams, nextValue)\n })\n }","nextValue","() => {\n if (!isUrlOpen) return\n\n setIsOptimisticallyClosed(true)\n clearScheduledClose()\n\n if (typeof window === \"undefined\" || closeDelayMs <= 0) {\n closeUrlOverlay()\n return\n }\n\n closeTimeoutRef.current = window.setTimeout(() => {\n closeTimeoutRef.current = null\n closeUrlOverlay()\n }, closeDelayMs)\n }","() => {\n if (isUrlOpen) {\n setIsOptimisticallyClosed(false)\n return\n }\n\n clearScheduledClose()\n setIsOptimisticallyClosed(false)\n }","[isUrlOpen, overlayUrlStateKey]","() => {\n return () => {\n clearScheduledClose()\n }\n }","[]","{\n isOpen: isUrlOpen && !isOptimisticallyClosed,\n shouldRender: isUrlOpen,\n value,\n buildHref,\n openOverlay,\n closeOverlay,\n resetOptimisticClose,\n }","isUrlOpen && !isOptimisticallyClosed"],"sources":["../src/routePrefetchHandles.ts","../src/routePrefetch.tsx","../src/Link.tsx","../src/lazyRoute.tsx","../src/useApplyMeta.tsx","../src/navigationGuards.ts","../src/queryOverlay.ts","../src/shortcutPrefetchNavigate.ts"],"sourcesContent":["export const ROUTE_MODULE_IMPORTER_HANDLE = \"__rpcbaseRouteModuleImporter\"\nexport const ROUTE_PREFETCH_DATA_HANDLE = \"prefetchData\"\n\nexport type RouteHandleObject = Record<string, unknown>\n\ntype RouteModuleImporter = () => Promise<unknown>\n\nconst isHandleObject = (value: unknown): value is RouteHandleObject =>\n Boolean(value) && typeof value === \"object\" && !Array.isArray(value)\n\nexport const getRouteModuleImporterFromHandle = (handle: unknown): RouteModuleImporter | null => {\n if (!isHandleObject(handle)) return null\n\n const importer = handle[ROUTE_MODULE_IMPORTER_HANDLE]\n return typeof importer === \"function\" ? (importer as RouteModuleImporter) : null\n}\n\nexport const getRoutePrefetchDataFromHandle = (\n handle: unknown,\n key = ROUTE_PREFETCH_DATA_HANDLE,\n): boolean | undefined => {\n if (!isHandleObject(handle)) return undefined\n\n const value = handle[key]\n return typeof value === \"boolean\" ? value : undefined\n}\n\nexport const mergeRouteHandle = (\n handle: unknown,\n {\n importer,\n prefetchData,\n prefetchDataKey = ROUTE_PREFETCH_DATA_HANDLE,\n }: {\n importer?: RouteModuleImporter\n prefetchData?: boolean\n prefetchDataKey?: string\n },\n): RouteHandleObject => {\n const nextHandle: RouteHandleObject = isHandleObject(handle) ? { ...handle } : {}\n\n if (importer) {\n nextHandle[ROUTE_MODULE_IMPORTER_HANDLE] = importer\n }\n\n if (typeof prefetchData === \"boolean\") {\n nextHandle[prefetchDataKey] = prefetchData\n }\n\n return nextHandle\n}\n","import { ReactNode, createContext, useContext, useRef } from \"react\"\nimport {\n UNSAFE_DataRouterContext,\n matchRoutes,\n type DataRouteObject,\n type DataRouter,\n} from \"react-router\"\n\nimport {\n ROUTE_PREFETCH_DATA_HANDLE,\n getRouteModuleImporterFromHandle,\n getRoutePrefetchDataFromHandle,\n} from \"./routePrefetchHandles\"\n\n\nexport type RoutePrefetchBehavior = \"intent\" | \"render\" | \"none\" | \"viewport\"\n\nexport type RoutePrefetchCallOptions = {\n prefetchCode?: boolean\n prefetchData?: boolean\n}\n\nexport type RoutePrefetchApi = {\n defaultPrefetch: RoutePrefetchBehavior\n prefetch: (href: string, opts?: RoutePrefetchCallOptions) => Promise<void>\n prefetchCode: (href: string) => Promise<void>\n prefetchData: (href: string) => Promise<void>\n}\n\ntype RoutePrefetchContextValue = RoutePrefetchApi\n\ntype PrefetchableRoute = DataRouteObject & {\n handle?: unknown\n lazy?: () => Promise<Record<string, unknown>>\n}\n\ntype RoutePrefetchProviderProps = {\n children: ReactNode\n defaultPrefetch?: RoutePrefetchBehavior\n dataPrefetchTtlMs?: number\n dataPrefetchHandleKey?: string\n}\n\ntype DataCacheValue = {\n expiresAt: number\n promise: Promise<void>\n}\n\nconst noop = async () => {}\n\nconst DEFAULT_PREFETCH_API: RoutePrefetchContextValue = {\n defaultPrefetch: \"none\",\n prefetch: noop,\n prefetchCode: noop,\n prefetchData: noop,\n}\n\nconst RoutePrefetchContext = createContext<RoutePrefetchContextValue>(DEFAULT_PREFETCH_API)\n\nconst normalizeHref = (href: string): { pathWithSearch: string; pathname: string; search: string; hash: string } | null => {\n if (typeof window === \"undefined\") return null\n\n try {\n const url = new URL(href, window.location.origin)\n if (url.origin !== window.location.origin) return null\n return {\n pathWithSearch: `${url.pathname}${url.search}`,\n pathname: url.pathname,\n search: url.search,\n hash: url.hash,\n }\n } catch {\n return null\n }\n}\n\nconst pruneDataCache = (cache: Map<string, DataCacheValue>, now: number): void => {\n cache.forEach((value, key) => {\n if (value.expiresAt <= now) {\n cache.delete(key)\n }\n })\n}\n\nconst resolveDataPrefetchFlag = (\n route: PrefetchableRoute,\n explicitPrefetchData: boolean | undefined,\n dataPrefetchHandleKey: string,\n): boolean => {\n if (typeof explicitPrefetchData === \"boolean\") {\n return explicitPrefetchData\n }\n\n const routeHandlePrefetchData = getRoutePrefetchDataFromHandle(route.handle, dataPrefetchHandleKey)\n if (typeof routeHandlePrefetchData === \"boolean\") {\n return routeHandlePrefetchData\n }\n\n return false\n}\n\nexport const RoutePrefetchProvider = ({\n children,\n defaultPrefetch = \"intent\",\n dataPrefetchTtlMs = 30000,\n dataPrefetchHandleKey = ROUTE_PREFETCH_DATA_HANDLE,\n}: RoutePrefetchProviderProps) => {\n const dataRouterContext = useContext(UNSAFE_DataRouterContext)\n const routeModuleCacheRef = useRef(new Map<string, Promise<Record<string, unknown> | null>>())\n const routeDataCacheRef = useRef(new Map<string, DataCacheValue>())\n\n const prefetchRouteModule = async (route: PrefetchableRoute): Promise<Record<string, unknown> | null> => {\n const routeId = route.id\n if (!routeId) return null\n\n const cached = routeModuleCacheRef.current.get(routeId)\n if (cached) {\n return cached\n }\n\n const lazyRouteLoader = typeof route.lazy === \"function\" ? route.lazy : null\n const routeModuleImporter = getRouteModuleImporterFromHandle(route.handle)\n if (!lazyRouteLoader && !routeModuleImporter) {\n return null\n }\n\n const prefetchPromise = Promise.resolve(lazyRouteLoader ? lazyRouteLoader() : routeModuleImporter!())\n .then((module) => {\n if (!module || typeof module !== \"object\") return null\n return module as Record<string, unknown>\n })\n .catch((error) => {\n routeModuleCacheRef.current.delete(routeId)\n throw error\n })\n\n routeModuleCacheRef.current.set(routeId, prefetchPromise)\n return prefetchPromise\n }\n\n const prefetchRouteData = async (router: DataRouter, route: PrefetchableRoute, href: string): Promise<void> => {\n const routeId = route.id\n if (!routeId) return\n\n const now = Date.now()\n pruneDataCache(routeDataCacheRef.current, now)\n\n const cacheKey = `${routeId}|${href}`\n const cached = routeDataCacheRef.current.get(cacheKey)\n if (cached && cached.expiresAt > now) {\n await cached.promise\n return\n }\n\n let hasLoader = typeof route.loader === \"function\"\n if (!hasLoader) {\n const loadedRouteModule = await prefetchRouteModule(route).catch(() => null)\n hasLoader = typeof loadedRouteModule?.loader === \"function\"\n }\n\n if (!hasLoader) return\n\n const fetcherKey = `rb:prefetch:${routeId}:${href}`\n\n const prefetchPromise = Promise.resolve(router.fetch(fetcherKey, routeId, href))\n .catch((error) => {\n routeDataCacheRef.current.delete(cacheKey)\n throw error\n })\n .finally(() => {\n try {\n router.deleteFetcher(fetcherKey)\n } catch {\n return\n }\n })\n\n const ttl = Math.max(1, dataPrefetchTtlMs)\n routeDataCacheRef.current.set(cacheKey, {\n expiresAt: now + ttl,\n promise: prefetchPromise,\n })\n\n await prefetchPromise\n }\n\n const prefetch = async (href: string, opts?: RoutePrefetchCallOptions): Promise<void> => {\n const normalized = normalizeHref(href)\n if (!normalized) return\n\n const currentPathWithSearch =\n typeof window === \"undefined\"\n ? \"\"\n : `${window.location.pathname}${window.location.search}`\n if (normalized.pathWithSearch === currentPathWithSearch) {\n return\n }\n\n const router = dataRouterContext?.router as DataRouter | undefined\n if (!router) return\n\n const matches = matchRoutes(\n router.routes,\n {\n pathname: normalized.pathname,\n search: normalized.search,\n hash: normalized.hash,\n },\n router.basename,\n )\n\n if (!matches || matches.length === 0) {\n return\n }\n\n const matchedRoutes = matches.map((match) => match.route as PrefetchableRoute)\n\n if (opts?.prefetchCode !== false) {\n await Promise.all(\n matchedRoutes.map(async (route) => {\n try {\n await prefetchRouteModule(route)\n } catch {\n return\n }\n }),\n )\n }\n\n await Promise.all(\n matchedRoutes.map(async (route) => {\n if (!resolveDataPrefetchFlag(route, opts?.prefetchData, dataPrefetchHandleKey)) {\n return\n }\n\n try {\n await prefetchRouteData(router, route, normalized.pathWithSearch)\n } catch {\n return\n }\n }),\n )\n }\n\n return (\n <RoutePrefetchContext.Provider\n value={{\n defaultPrefetch,\n prefetch,\n prefetchCode: async (href) => prefetch(href, { prefetchCode: true, prefetchData: false }),\n prefetchData: async (href) => prefetch(href, { prefetchCode: false, prefetchData: true }),\n }}\n >\n {children}\n </RoutePrefetchContext.Provider>\n )\n}\n\nexport const useRoutePrefetch = (): RoutePrefetchApi => useContext(RoutePrefetchContext)\n\nexport type { RoutePrefetchProviderProps }\n","import { forwardRef, useEffect, useRef, type Ref, type SyntheticEvent } from \"react\"\nimport { Link as RouterLink, type LinkProps as RouterLinkProps } from \"react-router\"\n\nimport { type RoutePrefetchBehavior, useRoutePrefetch } from \"./routePrefetch\"\n\n\nconst ABSOLUTE_URL_REGEX = /^(?:[a-z][a-z0-9+.-]*:|\\/\\/)/i\n\ntype LinkProps = Omit<RouterLinkProps, \"prefetch\"> & {\n prefetch?: RoutePrefetchBehavior\n prefetchData?: boolean\n}\n\nconst assignRef = <TValue,>(ref: Ref<TValue> | undefined, value: TValue) => {\n if (!ref) return\n if (typeof ref === \"function\") {\n ref(value)\n return\n }\n ref.current = value\n}\n\nconst composeEventHandlers = <TEvent extends SyntheticEvent>(\n theirHandler: ((event: TEvent) => void) | undefined,\n ourHandler: () => void,\n) => {\n return (event: TEvent) => {\n theirHandler?.(event)\n if (!event.defaultPrevented) {\n ourHandler()\n }\n }\n}\n\nconst shouldPrefetchLink = ({\n prefetch,\n reloadDocument,\n target,\n to,\n}: {\n prefetch: RoutePrefetchBehavior\n reloadDocument: boolean | undefined\n target: string | undefined\n to: RouterLinkProps[\"to\"]\n}): boolean => {\n if (prefetch === \"none\") return false\n if (reloadDocument) return false\n if (typeof target === \"string\" && target !== \"_self\") return false\n if (typeof to === \"string\" && ABSOLUTE_URL_REGEX.test(to)) return false\n return true\n}\n\nconst usePrefetchLink = (\n prefetchData: boolean | undefined,\n): {\n anchorRef: Ref<HTMLAnchorElement>\n prefetchHref: () => void\n getAnchorElement: () => HTMLAnchorElement | null\n} => {\n const localRef = useRef<HTMLAnchorElement | null>(null)\n const { prefetch } = useRoutePrefetch()\n\n return {\n anchorRef: (node) => {\n localRef.current = node\n },\n getAnchorElement: () => localRef.current,\n prefetchHref: () => {\n const href = localRef.current?.getAttribute(\"href\")\n if (!href) return\n void prefetch(href, { prefetchData })\n },\n }\n}\n\nexport const Link = forwardRef<HTMLAnchorElement, LinkProps>(\n (\n {\n prefetch: prefetchProp,\n prefetchData,\n onMouseEnter,\n onFocus,\n onTouchStart,\n reloadDocument,\n target,\n to,\n ...props\n },\n forwardedRef,\n ) => {\n const { defaultPrefetch } = useRoutePrefetch()\n const prefetchBehavior = prefetchProp ?? defaultPrefetch\n const viewportPrefetchedRef = useRef(false)\n const { anchorRef, prefetchHref, getAnchorElement } = usePrefetchLink(prefetchData)\n const canPrefetch = shouldPrefetchLink({\n prefetch: prefetchBehavior,\n reloadDocument,\n target,\n to,\n })\n\n useEffect(() => {\n viewportPrefetchedRef.current = false\n }, [to])\n\n useEffect(() => {\n if (!canPrefetch || prefetchBehavior !== \"render\") return\n prefetchHref()\n }, [canPrefetch, prefetchBehavior, prefetchHref])\n\n useEffect(() => {\n if (!canPrefetch || prefetchBehavior !== \"viewport\") return\n\n const element = getAnchorElement()\n if (!element || typeof IntersectionObserver === \"undefined\") return\n\n const observer = new IntersectionObserver(\n (entries) => {\n const isVisible = entries.some((entry) => entry.isIntersecting)\n if (!isVisible || viewportPrefetchedRef.current) return\n viewportPrefetchedRef.current = true\n prefetchHref()\n },\n { threshold: 0.5 },\n )\n\n observer.observe(element)\n return () => {\n observer.disconnect()\n }\n }, [canPrefetch, prefetchBehavior, prefetchHref, getAnchorElement])\n\n const handleIntentPrefetch = () => {\n if (!canPrefetch || prefetchBehavior !== \"intent\") return\n prefetchHref()\n }\n\n return (\n <RouterLink\n {...props}\n to={to}\n target={target}\n reloadDocument={reloadDocument}\n prefetch=\"none\"\n onMouseEnter={composeEventHandlers(onMouseEnter, handleIntentPrefetch)}\n onFocus={composeEventHandlers(onFocus, handleIntentPrefetch)}\n onTouchStart={composeEventHandlers(onTouchStart, handleIntentPrefetch)}\n ref={(node) => {\n assignRef(forwardedRef, node)\n assignRef(anchorRef, node)\n }}\n />\n )\n },\n)\n\nLink.displayName = \"Link\"\n\nexport type { LinkProps }\n","import { LoaderFunction } from \"react-router\"\n\nimport { mergeRouteHandle, RouteHandleObject } from \"./routePrefetchHandles\"\n\n\ntype RouteModuleLoader = (...args: any[]) => unknown\n\ntype RouteModule = {\n default: React.ComponentType<unknown>\n loader?: RouteModuleLoader\n}\n\ntype RouteModuleImporter = () => Promise<RouteModule>\n\ntype RouteOptions = {\n handle?: unknown\n prefetchData?: boolean\n prefetchDataKey?: string\n}\n\ntype LazyRouteResult = {\n lazy: () => Promise<{\n Component: React.ComponentType<unknown>\n loader?: LoaderFunction\n }>\n handle: RouteHandleObject\n}\n\nconst DYNAMIC_IMPORT_RELOAD_GUARD_MS = 60_000\nconst DYNAMIC_IMPORT_RELOAD_TIMEOUT_MS = 5_000\nconst DYNAMIC_IMPORT_RELOAD_STORAGE_KEY = \"rpcbase:dynamic-import-reload-at\"\nconst DYNAMIC_IMPORT_ERROR_PATTERNS = [\n /failed to fetch dynamically imported module/i,\n /importing a module script failed/i,\n /error loading dynamically imported module/i,\n /networkerror when attempting to fetch resource/i,\n /unable to preload css/i,\n /loading (?:css )?chunk .+ failed/i,\n]\n\nconst isDynamicImportError = (error: unknown): boolean => {\n const message = error instanceof Error ? error.message : typeof error === \"string\" ? error : \"\"\n return DYNAMIC_IMPORT_ERROR_PATTERNS.some((pattern) => pattern.test(message))\n}\n\nconst markPageReloadRequested = (): boolean => {\n if (typeof window === \"undefined\") return false\n if (typeof navigator !== \"undefined\" && navigator.onLine === false) return false\n\n const now = Date.now()\n\n try {\n const previousReloadAt = Number(window.sessionStorage.getItem(DYNAMIC_IMPORT_RELOAD_STORAGE_KEY))\n if (Number.isFinite(previousReloadAt) && now - previousReloadAt < DYNAMIC_IMPORT_RELOAD_GUARD_MS) {\n return false\n }\n window.sessionStorage.setItem(DYNAMIC_IMPORT_RELOAD_STORAGE_KEY, String(now))\n } catch {\n return false\n }\n\n return true\n}\n\nconst clearPageReloadGuard = (): void => {\n try {\n window.sessionStorage.removeItem(DYNAMIC_IMPORT_RELOAD_STORAGE_KEY)\n } catch {\n return\n }\n}\n\nconst reloadPage = (error: unknown): Promise<never> =>\n new Promise((_, reject) => {\n let pending = true\n\n const rejectIfPageRemains = () => {\n if (!pending) return\n pending = false\n window.removeEventListener(\"pagehide\", handlePageHide)\n clearPageReloadGuard()\n reject(error)\n }\n\n const timeout = window.setTimeout(rejectIfPageRemains, DYNAMIC_IMPORT_RELOAD_TIMEOUT_MS)\n const handlePageHide = () => {\n if (!pending) return\n pending = false\n window.clearTimeout(timeout)\n }\n\n window.addEventListener(\"pagehide\", handlePageHide, { once: true })\n\n try {\n window.location.reload()\n } catch {\n rejectIfPageRemains()\n }\n })\n\nconst memoizeImporter = (importer: RouteModuleImporter): RouteModuleImporter => {\n let promise: Promise<RouteModule> | null = null\n\n return async () => {\n if (!promise) {\n promise = importer().catch((error) => {\n promise = null\n throw error\n })\n }\n\n return promise\n }\n}\n\nexport const lazyRoute = (importer: RouteModuleImporter, opts?: RouteOptions): LazyRouteResult => {\n const loadModule = memoizeImporter(importer)\n\n return {\n lazy: async () => {\n let module: RouteModule\n try {\n module = await loadModule()\n } catch (error) {\n if (isDynamicImportError(error) && markPageReloadRequested()) {\n return reloadPage(error)\n }\n throw error\n }\n const lazyRouteModule: {\n Component: React.ComponentType<unknown>\n loader?: LoaderFunction\n } = {\n Component: module.default,\n }\n\n if (typeof module.loader === \"function\") {\n lazyRouteModule.loader = module.loader as unknown as LoaderFunction\n }\n\n return lazyRouteModule\n },\n handle: mergeRouteHandle(opts?.handle, {\n importer: loadModule,\n prefetchData: opts?.prefetchData,\n prefetchDataKey: opts?.prefetchDataKey,\n }),\n }\n}\n","import { useEffect } from \"react\"\nimport { useLocation } from \"react-router\"\n\n\ntype MetaAttributeValue = string | number | boolean | undefined\ntype MetaEntry = Record<string, MetaAttributeValue>\n\ntype PageMeta = {\n title: string\n meta: MetaEntry[]\n}\n\n\nexport const useApplyMeta = ({\n defaultTitle = \"\",\n defaultMeta = [],\n pagesMeta = {}\n}: {\n defaultTitle?: string\n defaultMeta?: MetaEntry[]\n pagesMeta?: Record<string, PageMeta>\n} = {}) => {\n const location = useLocation()\n\n useEffect(() => {\n const loadMeta = async () => {\n\n let pageMeta = pagesMeta[location.pathname]\n\n if (!pageMeta) {\n pageMeta = { title: defaultTitle, meta: defaultMeta }\n }\n\n document.title = pageMeta.title\n\n // Remove previous dynamically inserted tags\n document.querySelectorAll(\"[data-react-meta]\").forEach((tag) => tag.remove())\n\n // Inject new tags\n pageMeta.meta.forEach((meta) => {\n const metaElement = document.createElement(\"meta\")\n metaElement.setAttribute(\"data-react-meta\", \"true\")\n\n // Set all attributes from the meta object\n Object.entries(meta).forEach(([key, value]) => {\n if (value) {\n metaElement.setAttribute(key, value.toString())\n }\n })\n\n document.head.appendChild(metaElement)\n })\n\n // Update canonical link\n const canonicalUrl = `${window.location.origin}${location.pathname}`\n\n const existingCanonical = document.querySelector(\"link[rel=\\\"canonical\\\"]\")\n if (existingCanonical) {\n existingCanonical.remove()\n }\n\n const canonicalLink = document.createElement(\"link\")\n canonicalLink.setAttribute(\"rel\", \"canonical\")\n canonicalLink.setAttribute(\"href\", canonicalUrl)\n canonicalLink.setAttribute(\"data-react-meta\", \"true\")\n document.head.appendChild(canonicalLink)\n }\n\n loadMeta()\n }, [location.pathname, defaultTitle, defaultMeta, pagesMeta])\n}\n","import { useEffect, useRef } from \"react\"\nimport type { BlockerFunction } from \"react-router\"\n\n\nexport type NavigationGuard = {\n id: string\n enabled: boolean\n priority?: number\n message: string\n blockOnSearch?: boolean\n shouldBlockNavigation: BlockerFunction\n shouldBlockUnload: boolean\n}\n\ntype NavigationGuardsListener = () => void\n\ntype NavigationGuardsStore = {\n guards: Map<string, NavigationGuard>\n listeners: Set<NavigationGuardsListener>\n}\n\nconst NAVIGATION_GUARDS_STORE_KEY = \"__rpcbaseNavigationGuardsStore\"\n\nconst getNavigationGuardsStore = (): NavigationGuardsStore => {\n const globalAny = globalThis as {\n [NAVIGATION_GUARDS_STORE_KEY]?: NavigationGuardsStore\n }\n\n const existing = globalAny[NAVIGATION_GUARDS_STORE_KEY]\n if (existing) {\n return existing\n }\n\n const created: NavigationGuardsStore = {\n guards: new Map<string, NavigationGuard>(),\n listeners: new Set<NavigationGuardsListener>(),\n }\n\n globalAny[NAVIGATION_GUARDS_STORE_KEY] = created\n return created\n}\n\nconst notify = (): void => {\n getNavigationGuardsStore().listeners.forEach((listener) => {\n listener()\n })\n}\n\nconst isSameGuard = (a: NavigationGuard, b: NavigationGuard): boolean =>\n a.id === b.id &&\n a.enabled === b.enabled &&\n a.priority === b.priority &&\n a.message === b.message &&\n a.blockOnSearch === b.blockOnSearch &&\n a.shouldBlockNavigation === b.shouldBlockNavigation &&\n a.shouldBlockUnload === b.shouldBlockUnload\n\nexport const upsertNavigationGuard = (guard: NavigationGuard): void => {\n const guards = getNavigationGuardsStore().guards\n const prev = guards.get(guard.id)\n if (prev && isSameGuard(prev, guard)) {\n return\n }\n\n guards.set(guard.id, guard)\n notify()\n}\n\nexport const removeNavigationGuard = (id: string): void => {\n const guards = getNavigationGuardsStore().guards\n const didDelete = guards.delete(id)\n if (didDelete) {\n notify()\n }\n}\n\nexport const getNavigationGuards = (): NavigationGuard[] =>\n Array.from(getNavigationGuardsStore().guards.values())\n\nexport const subscribeNavigationGuards = (\n listener: NavigationGuardsListener,\n): (() => void) => {\n const listeners = getNavigationGuardsStore().listeners\n listeners.add(listener)\n return () => {\n listeners.delete(listener)\n }\n}\n\nexport const useRegisterNavigationGuard = (guard: NavigationGuard): void => {\n const latestGuardRef = useRef(guard)\n latestGuardRef.current = guard\n\n const lastIdRef = useRef<string | null>(null)\n\n useEffect(() => {\n const lastId = lastIdRef.current\n if (lastId && lastId !== guard.id) {\n removeNavigationGuard(lastId)\n }\n lastIdRef.current = guard.id\n\n if (!guard.enabled) {\n removeNavigationGuard(guard.id)\n return\n }\n\n upsertNavigationGuard(latestGuardRef.current)\n return () => {\n removeNavigationGuard(guard.id)\n }\n }, [\n guard.id,\n guard.enabled,\n guard.message,\n guard.priority,\n guard.blockOnSearch,\n guard.shouldBlockNavigation,\n guard.shouldBlockUnload,\n ])\n}\n","import {\n Component,\n Suspense,\n cloneElement,\n createElement,\n isValidElement,\n useContext,\n useEffect,\n useRef,\n useState,\n useSyncExternalStore,\n type CSSProperties,\n type ErrorInfo,\n type ReactElement,\n type ReactNode,\n} from \"react\"\nimport { createPortal } from \"react-dom\"\nimport { UNSAFE_LocationContext } from \"react-router\"\n\n\nexport type UseQueryOverlayOptions<TOverlay> = {\n params: string[]\n parse: (params: URLSearchParams) => TOverlay | null\n write: (params: URLSearchParams, state: TOverlay) => void\n clear: (params: URLSearchParams) => void\n closeDelayMs?: number\n}\n\nexport type QueryOverlayApi<TOverlay> = {\n value: TOverlay | null\n isOpen: boolean\n shouldRender: boolean\n buildHref: (nextValue: TOverlay | null) => string\n openOverlay: (nextValue: TOverlay) => void\n closeOverlay: () => void\n resetOptimisticClose: () => void\n}\n\nexport type QueryOverlayRenderControls = {\n open: boolean\n setOpen: (open: boolean) => void\n closeOverlay: () => void\n resetOptimisticClose: () => void\n}\n\nexport type QueryOverlayFallbackControls = QueryOverlayRenderControls & {\n onOpenChange: (open: boolean) => void\n}\n\nexport type QueryOverlayFallbackRender = (controls: QueryOverlayFallbackControls) => ReactNode\n\nexport type QueryOverlayErrorFallbackRender = (\n controls: QueryOverlayFallbackControls & {\n error: unknown\n },\n) => ReactNode\n\nexport type QueryOverlayLoadingFallbackProps = {\n open?: boolean\n label?: ReactNode\n}\n\nexport type QueryOverlayProps<TOverlay> = {\n overlay: QueryOverlayApi<TOverlay>\n fallback?: ReactNode | QueryOverlayFallbackRender\n errorFallback?: ReactNode | QueryOverlayErrorFallbackRender\n children: (state: TOverlay, controls: QueryOverlayRenderControls) => ReactNode\n}\n\ntype QueryOverlayErrorBoundaryProps = {\n children?: ReactNode\n fallback: (error: unknown) => ReactNode\n resetKey: string\n}\n\nclass QueryOverlayErrorBoundary extends Component<QueryOverlayErrorBoundaryProps, { error: unknown | null }> {\n state = { error: null }\n\n static getDerivedStateFromError(error: unknown) {\n return { error }\n }\n\n componentDidCatch(error: unknown, errorInfo: ErrorInfo) {\n console.error(\"Query overlay rendering error\", error, errorInfo)\n }\n\n componentDidUpdate(previousProps: QueryOverlayErrorBoundaryProps) {\n if (this.state.error === null) return\n if (previousProps.resetKey === this.props.resetKey) return\n this.setState({ error: null })\n }\n\n render() {\n return this.state.error === null ? this.props.children : this.props.fallback(this.state.error)\n }\n}\n\nconst QUERY_OVERLAY_URL_CHANGE_EVENT = \"rpcbase-query-overlay-url-change\"\n\ntype UrlSnapshot = {\n pathname: string\n search: string\n hash: string\n}\n\nfunction getCurrentUrlSnapshot(fallback?: UrlSnapshot): UrlSnapshot {\n if (typeof window === \"undefined\") {\n return fallback ?? { pathname: \"\", search: \"\", hash: \"\" }\n }\n\n return {\n pathname: window.location.pathname,\n search: window.location.search,\n hash: window.location.hash,\n }\n}\n\nfunction getParamValueFromSearch(search: string, param: string) {\n return new URLSearchParams(search).get(param)\n}\n\nfunction getSearchFromUrlSnapshot(fallback?: UrlSnapshot) {\n return getCurrentUrlSnapshot(fallback).search\n}\n\nfunction useRouterUrlSnapshot(): UrlSnapshot | undefined {\n const context = useContext(UNSAFE_LocationContext)\n const location = context?.location\n if (!location) return undefined\n return {\n pathname: location.pathname,\n search: location.search,\n hash: location.hash,\n }\n}\n\nfunction getCurrentParamValue(param: string) {\n if (typeof window === \"undefined\") return null\n return getParamValueFromSearch(window.location.search, param)\n}\n\nfunction getCurrentSearch() {\n if (typeof window === \"undefined\") return \"\"\n return window.location.search\n}\n\nfunction subscribeToQueryOverlayUrl(listener: () => void) {\n if (typeof window === \"undefined\") return () => undefined\n\n window.addEventListener(QUERY_OVERLAY_URL_CHANGE_EVENT, listener)\n window.addEventListener(\"popstate\", listener)\n return () => {\n window.removeEventListener(QUERY_OVERLAY_URL_CHANGE_EVENT, listener)\n window.removeEventListener(\"popstate\", listener)\n }\n}\n\nfunction buildUrl(searchParams: URLSearchParams, fallback?: UrlSnapshot) {\n const { pathname, hash } = getCurrentUrlSnapshot(fallback)\n const nextSearch = searchParams.toString()\n return `${pathname}${nextSearch ? `?${nextSearch}` : \"\"}${hash}`\n}\n\nfunction clearOverlaySearchParams(\n searchParams: URLSearchParams,\n params: string[],\n clear: (params: URLSearchParams) => void,\n) {\n clear(searchParams)\n for (const param of params) {\n searchParams.delete(param)\n }\n}\n\nfunction buildOverlayUrlStateKey(search: string, params: string[]) {\n const searchParams = new URLSearchParams(search)\n return params\n .map((param) => {\n const values = searchParams.getAll(param)\n return `${param}:${values.join(\"\\u0000\")}`\n })\n .join(\"\\u0001\")\n}\n\nconst queryOverlayLoadingBackdropStyle = (open: boolean): CSSProperties => ({\n position: \"fixed\",\n inset: 0,\n zIndex: 50,\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n background: \"rgba(0, 0, 0, 0.5)\",\n color: \"white\",\n opacity: open ? 1 : 0,\n pointerEvents: open ? \"auto\" : \"none\",\n transition: \"opacity 150ms ease\",\n})\n\nconst queryOverlayLoadingStatusStyle: CSSProperties = {\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 10,\n fontSize: 14,\n fontWeight: 500,\n}\n\nexport function QueryOverlayLoadingFallback({\n open = true,\n label = \"Loading...\",\n}: QueryOverlayLoadingFallbackProps): ReactElement {\n const backdrop = createElement(\n \"div\",\n {\n \"data-rpcbase-query-overlay-loading\": \"\",\n \"data-state\": open ? \"open\" : \"closed\",\n style: queryOverlayLoadingBackdropStyle(open),\n },\n createElement(\n \"div\",\n {\n role: \"status\",\n \"aria-live\": \"polite\",\n style: queryOverlayLoadingStatusStyle,\n },\n createElement(\n \"svg\",\n {\n \"aria-hidden\": true,\n focusable: \"false\",\n height: 20,\n viewBox: \"0 0 24 24\",\n width: 20,\n },\n createElement(\"circle\", {\n cx: 12,\n cy: 12,\n fill: \"none\",\n r: 9,\n stroke: \"currentColor\",\n strokeOpacity: 0.35,\n strokeWidth: 3,\n }),\n createElement(\n \"path\",\n {\n d: \"M21 12a9 9 0 0 0-9-9\",\n fill: \"none\",\n stroke: \"currentColor\",\n strokeLinecap: \"round\",\n strokeWidth: 3,\n },\n createElement(\"animateTransform\", {\n attributeName: \"transform\",\n dur: \"0.8s\",\n from: \"0 12 12\",\n repeatCount: \"indefinite\",\n to: \"360 12 12\",\n type: \"rotate\",\n }),\n ),\n ),\n createElement(\"span\", null, label),\n ),\n )\n\n return typeof document === \"undefined\" ? backdrop : createPortal(backdrop, document.body)\n}\n\nconst QUERY_OVERLAY_LOADING_FALLBACK = createElement(QueryOverlayLoadingFallback)\n\nfunction renderQueryOverlayFallback(\n fallback: ReactNode | QueryOverlayFallbackRender | QueryOverlayErrorFallbackRender | undefined,\n controls: QueryOverlayFallbackControls,\n error?: unknown,\n includeError = false,\n) {\n if (typeof fallback === \"function\") {\n if (!includeError) {\n return (fallback as QueryOverlayFallbackRender)(controls)\n }\n\n return (fallback as QueryOverlayErrorFallbackRender)({ ...controls, error })\n }\n\n if (isValidElement(fallback)) {\n return cloneElement(fallback as ReactElement<Record<string, unknown>>, {\n open: controls.open,\n isOpen: controls.open,\n setOpen: controls.setOpen,\n onOpenChange: controls.onOpenChange,\n closeOverlay: controls.closeOverlay,\n error,\n })\n }\n\n return fallback ?? null\n}\n\nexport function replaceQueryParams(update: (searchParams: URLSearchParams) => void) {\n if (typeof window === \"undefined\") return\n\n const { pathname, search, hash } = getCurrentUrlSnapshot()\n const searchParams = new URLSearchParams(search)\n update(searchParams)\n\n const nextUrl = buildUrl(searchParams)\n const currentUrl = `${pathname}${search}${hash}`\n if (nextUrl === currentUrl) return\n\n window.history.replaceState(window.history.state, \"\", nextUrl)\n window.dispatchEvent(new Event(QUERY_OVERLAY_URL_CHANGE_EVENT))\n}\n\nexport function useQueryParam(param: string): string | null {\n const routerUrlSnapshot = useRouterUrlSnapshot()\n return useSyncExternalStore(\n subscribeToQueryOverlayUrl,\n () => getCurrentParamValue(param),\n () => getParamValueFromSearch(routerUrlSnapshot?.search ?? \"\", param),\n )\n}\n\nexport function useQuerySearch(): string {\n const routerUrlSnapshot = useRouterUrlSnapshot()\n return useSyncExternalStore(\n subscribeToQueryOverlayUrl,\n getCurrentSearch,\n () => getSearchFromUrlSnapshot(routerUrlSnapshot),\n )\n}\n\nexport const useQueryOverlay = <TOverlay>({\n params,\n parse,\n write,\n clear,\n closeDelayMs = 0,\n}: UseQueryOverlayOptions<TOverlay>): QueryOverlayApi<TOverlay> => {\n const routerUrlSnapshot = useRouterUrlSnapshot()\n const search = useQuerySearch()\n const [isOptimisticallyClosed, setIsOptimisticallyClosed] = useState(false)\n const closeTimeoutRef = useRef<number | null>(null)\n const value = parse(new URLSearchParams(search))\n const isUrlOpen = value !== null\n const overlayUrlStateKey = buildOverlayUrlStateKey(search, params)\n\n const clearScheduledClose = () => {\n if (closeTimeoutRef.current === null) return\n window.clearTimeout(closeTimeoutRef.current)\n closeTimeoutRef.current = null\n }\n\n const resetOptimisticClose = () => {\n clearScheduledClose()\n setIsOptimisticallyClosed(false)\n }\n\n const closeUrlOverlay = () => {\n replaceQueryParams((searchParams) => {\n clearOverlaySearchParams(searchParams, params, clear)\n })\n }\n\n const buildHref = (nextValue: TOverlay | null): string => {\n const searchParams = new URLSearchParams(getCurrentUrlSnapshot(routerUrlSnapshot).search)\n clearOverlaySearchParams(searchParams, params, clear)\n\n if (nextValue !== null) {\n write(searchParams, nextValue)\n }\n\n return buildUrl(searchParams, routerUrlSnapshot)\n }\n\n const openOverlay = (nextValue: TOverlay) => {\n resetOptimisticClose()\n replaceQueryParams((searchParams) => {\n clearOverlaySearchParams(searchParams, params, clear)\n write(searchParams, nextValue)\n })\n }\n\n const closeOverlay = () => {\n if (!isUrlOpen) return\n\n setIsOptimisticallyClosed(true)\n clearScheduledClose()\n\n if (typeof window === \"undefined\" || closeDelayMs <= 0) {\n closeUrlOverlay()\n return\n }\n\n closeTimeoutRef.current = window.setTimeout(() => {\n closeTimeoutRef.current = null\n closeUrlOverlay()\n }, closeDelayMs)\n }\n\n useEffect(() => {\n if (isUrlOpen) {\n setIsOptimisticallyClosed(false)\n return\n }\n\n clearScheduledClose()\n setIsOptimisticallyClosed(false)\n }, [isUrlOpen, overlayUrlStateKey])\n\n useEffect(() => {\n return () => {\n clearScheduledClose()\n }\n }, [])\n\n return {\n isOpen: isUrlOpen && !isOptimisticallyClosed,\n shouldRender: isUrlOpen,\n value,\n buildHref,\n openOverlay,\n closeOverlay,\n resetOptimisticClose,\n }\n}\n\nexport function QueryOverlay<TOverlay>({\n overlay,\n fallback,\n errorFallback,\n children,\n}: QueryOverlayProps<TOverlay>): ReactElement | null {\n if (!overlay.shouldRender || overlay.value === null) return null\n\n const setOpen = (open: boolean) => {\n if (open) {\n overlay.resetOptimisticClose()\n return\n }\n\n overlay.closeOverlay()\n }\n\n const controls: QueryOverlayRenderControls = {\n open: overlay.isOpen,\n setOpen,\n closeOverlay: overlay.closeOverlay,\n resetOptimisticClose: overlay.resetOptimisticClose,\n }\n const fallbackControls = {\n ...controls,\n onOpenChange: setOpen,\n }\n const resetKey = overlay.buildHref(overlay.value)\n const suspenseFallback = fallback === undefined ? QUERY_OVERLAY_LOADING_FALLBACK : fallback\n\n return createElement(\n QueryOverlayErrorBoundary,\n {\n resetKey,\n fallback: (error: unknown) => renderQueryOverlayFallback(errorFallback, fallbackControls, error, true),\n },\n createElement(\n Suspense,\n {\n fallback: renderQueryOverlayFallback(suspenseFallback, fallbackControls),\n },\n children(overlay.value, controls),\n ),\n )\n}\n","import { useEffect, useRef } from \"react\"\nimport { useNavigate } from \"react-router\"\n\n\nexport type KeyboardShortcut = {\n key: string\n mod?: boolean\n ctrl?: boolean\n meta?: boolean\n alt?: boolean\n shift?: boolean\n}\n\nexport type ShortcutTrigger = \"keydown\" | \"keyup\"\n\nexport type UseShortcutPrefetchNavigateOptions = {\n shortcut: KeyboardShortcut\n getHref: () => string\n prefetch?: (href: string) => Promise<void> | void\n navigate?: (href: string) => Promise<void> | void\n trigger?: ShortcutTrigger\n enabled?: boolean\n preventDefault?: boolean\n ignoreTypingTarget?: boolean\n isTypingTarget?: (target: EventTarget | null) => boolean\n}\n\nconst normalizeKey = (key: string): string => key.toLowerCase()\n\nconst defaultIsTypingTarget = (target: EventTarget | null): boolean => {\n const element = target as HTMLElement | null\n const tagName = element?.tagName\n\n return (\n element?.isContentEditable === true ||\n tagName === \"INPUT\" ||\n tagName === \"TEXTAREA\" ||\n tagName === \"SELECT\"\n )\n}\n\nconst matchesShortcutKeyDown = (event: KeyboardEvent, shortcut: KeyboardShortcut): boolean => {\n if (normalizeKey(event.key) !== normalizeKey(shortcut.key)) return false\n\n if (typeof shortcut.mod === \"boolean\") {\n const hasMod = event.metaKey || event.ctrlKey\n if (hasMod !== shortcut.mod) return false\n }\n if (typeof shortcut.ctrl === \"boolean\" && event.ctrlKey !== shortcut.ctrl) return false\n if (typeof shortcut.meta === \"boolean\" && event.metaKey !== shortcut.meta) return false\n if (typeof shortcut.alt === \"boolean\" && event.altKey !== shortcut.alt) return false\n if (typeof shortcut.shift === \"boolean\" && event.shiftKey !== shortcut.shift) return false\n\n return true\n}\n\nconst callMaybeAsync = (fn: ((href: string) => Promise<void> | void) | undefined, href: string) => {\n if (!fn) return\n void Promise.resolve(fn(href))\n}\n\nexport const useShortcutPrefetchNavigate = ({\n shortcut,\n getHref,\n prefetch,\n navigate,\n trigger = \"keyup\",\n enabled = true,\n preventDefault = true,\n ignoreTypingTarget = true,\n isTypingTarget = defaultIsTypingTarget,\n}: UseShortcutPrefetchNavigateOptions): void => {\n const routerNavigate = useNavigate()\n\n const shortcutRef = useRef(shortcut)\n const getHrefRef = useRef(getHref)\n const prefetchRef = useRef(prefetch)\n const navigateRef = useRef(navigate ?? routerNavigate)\n const triggerRef = useRef(trigger)\n const enabledRef = useRef(enabled)\n const preventDefaultRef = useRef(preventDefault)\n const ignoreTypingTargetRef = useRef(ignoreTypingTarget)\n const isTypingTargetRef = useRef(isTypingTarget)\n const waitingForShortcutKeyUpRef = useRef(false)\n\n shortcutRef.current = shortcut\n getHrefRef.current = getHref\n prefetchRef.current = prefetch\n navigateRef.current = navigate ?? routerNavigate\n triggerRef.current = trigger\n enabledRef.current = enabled\n preventDefaultRef.current = preventDefault\n ignoreTypingTargetRef.current = ignoreTypingTarget\n isTypingTargetRef.current = isTypingTarget\n\n if (!enabled || trigger !== \"keyup\") {\n waitingForShortcutKeyUpRef.current = false\n }\n\n useEffect(() => {\n if (typeof window === \"undefined\") return\n\n const onKeyDown = (event: KeyboardEvent) => {\n if (!enabledRef.current) return\n if (ignoreTypingTargetRef.current && isTypingTargetRef.current(event.target)) return\n if (event.repeat) return\n if (!matchesShortcutKeyDown(event, shortcutRef.current)) return\n\n if (preventDefaultRef.current) {\n event.preventDefault()\n }\n\n const href = getHrefRef.current()\n if (!href) return\n\n callMaybeAsync(prefetchRef.current, href)\n\n if (triggerRef.current === \"keydown\") {\n callMaybeAsync(navigateRef.current, href)\n return\n }\n\n waitingForShortcutKeyUpRef.current = true\n }\n\n const onKeyUp = (event: KeyboardEvent) => {\n if (!enabledRef.current) return\n if (triggerRef.current !== \"keyup\") return\n if (!waitingForShortcutKeyUpRef.current) return\n if (normalizeKey(event.key) !== normalizeKey(shortcutRef.current.key)) return\n\n waitingForShortcutKeyUpRef.current = false\n\n if (ignoreTypingTargetRef.current && isTypingTargetRef.current(event.target)) return\n\n if (preventDefaultRef.current) {\n event.preventDefault()\n }\n\n const href = getHrefRef.current()\n if (!href) return\n\n callMaybeAsync(navigateRef.current, href)\n }\n\n const onBlur = () => {\n waitingForShortcutKeyUpRef.current = false\n }\n\n window.addEventListener(\"keydown\", onKeyDown)\n window.addEventListener(\"keyup\", onKeyUp)\n window.addEventListener(\"blur\", onBlur)\n\n return () => {\n window.removeEventListener(\"keydown\", onKeyDown)\n window.removeEventListener(\"keyup\", onKeyUp)\n window.removeEventListener(\"blur\", onBlur)\n }\n }, [])\n}\n"],"mappings":";;;;;;;AAAA,IAAa,+BAA+B;AAC5C,IAAa,6BAA6B;AAM1C,IAAM,kBAAkB,UACtB,QAAQ,KAAK,KAAK,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK;AAErE,IAAa,oCAAoC,WAAgD;CAC/F,IAAI,CAAC,eAAe,MAAM,GAAG,OAAO;CAEpC,MAAM,WAAW,OAAO;CACxB,OAAO,OAAO,aAAa,aAAc,WAAmC;AAC9E;AAEA,IAAa,kCACX,QACA,MAAM,+BACkB;CACxB,IAAI,CAAC,eAAe,MAAM,GAAG,OAAO,KAAA;CAEpC,MAAM,QAAQ,OAAO;CACrB,OAAO,OAAO,UAAU,YAAY,QAAQ,KAAA;AAC9C;AAEA,IAAa,oBACX,QACA,EACE,UACA,cACA,kBAAkB,iCAME;CACtB,MAAM,aAAgC,eAAe,MAAM,IAAI,EAAE,GAAG,OAAO,IAAI,CAAC;CAEhF,IAAI,UACF,WAAW,gCAAgC;CAG7C,IAAI,OAAO,iBAAiB,WAC1B,WAAW,mBAAmB;CAGhC,OAAO;AACT;;;ACFA,IAAM,OAAO,YAAY,CAAC;AAS1B,IAAM,uBAAuB,cAAyC;CANpE,iBAAiB;CACjB,UAAU;CACV,cAAc;CACd,cAAc;AAGsD,CAAoB;AAE1F,IAAM,iBAAiB,SAAoG;CACzH,IAAI,OAAO,WAAW,aAAa,OAAO;CAE1C,IAAI;EACF,MAAM,MAAM,IAAI,IAAI,MAAM,OAAO,SAAS,MAAM;EAChD,IAAI,IAAI,WAAW,OAAO,SAAS,QAAQ,OAAO;EAClD,OAAO;GACL,gBAAgB,GAAG,IAAI,WAAW,IAAI;GACtC,UAAU,IAAI;GACd,QAAQ,IAAI;GACZ,MAAM,IAAI;EACZ;CACF,QAAQ;EACN,OAAO;CACT;AACF;AAEA,IAAM,kBAAkB,OAAoC,QAAsB;CAChF,MAAM,SAAS,OAAO,QAAQ;EAC5B,IAAI,MAAM,aAAa,KACrB,MAAM,OAAO,GAAG;CAEpB,CAAC;AACH;AAEA,IAAM,2BACJ,OACA,sBACA,0BACY;CACZ,IAAI,OAAO,yBAAyB,WAClC,OAAO;CAGT,MAAM,0BAA0B,+BAA+B,MAAM,QAAQ,qBAAqB;CAClG,IAAI,OAAO,4BAA4B,WACrC,OAAO;CAGT,OAAO;AACT;AAEA,IAAa,yBAAA,OAKqB;;CALI,MAAA,EACpC,UACA,iBAAA,IACA,mBAAA,IACA,uBAAA,OAJoCA;CAEpC,MAAA,kBAAA,OAAA,KAAA,IAAkB,WAAlBC;CACA,MAAA,oBAAA,OAAA,KAAA,IAAoB,MAApBC;CACA,MAAA,wBAAA,OAAA,KAAA,IAAwB,6BAAxBC;CAEA,MAAM,oBAAoB,WAAW,wBAAwB;CAC1BC,IAAAA;;EAAI,qBAAA,IAAA,IAAqD;;;CAA5F,MAAM,sBAAsB,OAAOA,EAA0D;CAC5DC,IAAAA;;EAAI,qBAAA,IAAA,IAA4B;;;CAAjE,MAAM,oBAAoB,OAAOA,EAAiC;CAEtCC,IAAAA;;EAAO,KAAA,OAAA,UAAsE;GACvG,MAAM,UAAU,MAAM;GACtB,IAAI,CAAC,SAAS,OAAO;GAErB,MAAM,SAAS,oBAAoB,QAAQ,IAAI,OAAO;GACtD,IAAI,QACF,OAAO;GAGT,MAAM,kBAAkB,OAAO,MAAM,SAAS,aAAa,MAAM,OAAO;GACxE,MAAM,sBAAsB,iCAAiC,MAAM,MAAM;GACzE,IAAI,CAAC,mBAAmB,CAAC,qBACvB,OAAO;GAGT,MAAM,kBAAkB,QAAQ,QAAQ,kBAAkB,gBAAgB,IAAI,oBAAqB,CAAC,CAAC,CAClG,KAAKC,OAGL,CAAC,CACD,OAAO,UAAU;IAChB,oBAAoB,QAAQ,OAAO,OAAO;IAC1C,MAAM;GACR,CAAC;GAEH,oBAAoB,QAAQ,IAAI,SAAS,eAAe;GACxD,OAAO;EACT;;;CA3BA,MAAM,sBAAsBD;CA6BFE,IAAAA;CAqCA,IAAA,EAAA,OAAA,mBAAA;EArCA,KAAA,OAAO,QAAoB,SAA0B,SAAgC;GAC7G,MAAMC,YAAUC,QAAM;GACtB,IAAI,CAACD,WAAS;GAEd,MAAM,MAAM,KAAK,IAAI;GACrB,eAAe,kBAAkB,SAAS,GAAG;GAE7C,MAAM,WAAW,GAAGA,UAAQ,GAAG;GAC/B,MAAME,WAAS,kBAAkB,QAAQ,IAAI,QAAQ;GACrD,IAAIA,YAAUA,SAAO,YAAY,KAAK;IACpC,MAAMA,SAAO;IACb;GACF;GAEA,IAAI,YAAY,OAAOD,QAAM,WAAW;GACxC,IAAI,CAAC,WAEH,YAAY,QAAO,MADa,oBAAoBA,OAAK,CAAC,CAAC,MAAME,QAAU,EAAA,EACrC,WAAW;GAGnD,IAAI,CAAC,WAAW;GAEhB,MAAM,aAAa,eAAeH,UAAQ,GAAG;GAE7C,MAAMI,oBAAkB,QAAQ,QAAQ,OAAO,MAAM,YAAYJ,WAAS,IAAI,CAAC,CAAC,CAC7E,OAAO,YAAU;IAChB,kBAAkB,QAAQ,OAAO,QAAQ;IACzC,MAAMK;GACR,CAAC,CAAC,CACD,cAAc;IACb,IAAI;KACF,OAAO,cAAc,UAAU;IACjC,QAAQ;KACN;IACF;GACF,CAAC;GAEH,MAAM,MAAM,KAAK,IAAI,GAAG,iBAAiB;GACzC,kBAAkB,QAAQ,IAAI,UAAU;IACtC,WAAW,MAAM;IACjB,SAASD;GACX,CAAC;GAED,MAAMA;EACR;EAP0B,EAAA,KAAA;;;CArC1B,MAAM,oBAAoBL;CA8CTO,IAAAA;CA6C6C,IAAA,EAAA,OAAA,yBAAA,EAAA,OAjC1BC,mBAAAA,UAAAA,EAAAA,OAsCtB,mBAAA;EAlDG,KAAA,OAAO,QAAc,SAAmD;GACvF,MAAM,aAAa,cAAcC,MAAI;GACrC,IAAI,CAAC,YAAY;GAEjB,MAAM,wBACJ,OAAO,WAAW,cACd,KACA,GAAG,OAAO,SAAS,WAAW,OAAO,SAAS;GACpD,IAAI,WAAW,mBAAmB,uBAChC;GAGF,MAAMD,WAAS,mBAAmB;GAClC,IAAI,CAACA,UAAQ;GAEb,MAAM,UAAU,YACdA,SAAO,QACP;IACE,UAAU,WAAW;IACrB,QAAQ,WAAW;IACnB,MAAM,WAAW;GACnB,GACAA,SAAO,QACT;GAEA,IAAI,CAAC,WAAW,QAAQ,WAAW,GACjC;GAGF,MAAM,gBAAgB,QAAQ,IAAIE,MAA2C;GAE7E,IAAI,MAAM,iBAAiB,OACzB,MAAM,QAAQ,IACZ,cAAc,IAAI,OAAO,YAAU;IACjC,IAAI;KACF,MAAM,oBAAoBR,OAAK;IACjC,QAAQ;KACN;IACF;GACF,CAAC,CACH;GAGF,MAAM,QAAQ,IACZ,cAAc,IAAI,OAAO,YAAU;IACjC,IAAI,CAAC,wBAAwBA,SAAO,MAAM,cAAc,qBAAqB,GAC3E;IAGF,IAAI;KACF,MAAM,kBAAkBM,UAAQN,SAAO,WAAW,cAAc;IAClE,QAAQ;KACN;IACF;GACF,CAAC,CACH;EACF;EAX8D,EAAA,KAAA;EAjC1BM,EAAAA,KAAAA,mBAAAA;EAsCtB,EAAA,KAAA;;;CAlDd,MAAM,WAAWD;CAgEGI,IAAAA;CADAC,IAAAA;CAAgB,IAAA,EAAA,OAAA,UAAA;EAAhB,KAAA,OAAO,WAAS,SAASH,QAAM;GAAE,cAAc;GAAM,cAAc;EAAM,CAAC;EAC1E,MAAA,OAAO,WAAS,SAASA,QAAM;GAAE,cAAc;GAAO,cAAc;EAAK,CAAC;EAD1D,EAAA,KAAA;;;;;;;CAHzBI,IAAAA;CACL,IAAA,EAAA,QAAA,mBAAA,EAAA,QACA,YAAA,EAAA,QAEcF,OAAAA,EAAAA,QADAC,IAAAA;EAHT,MAAA;GACL;GACA;GACA,cAAcA;GACd,cAAcD;EAChB;EAJE,EAAA,MAAA;EACA,EAAA,MAAA;EAEcA,EAAAA,MAAAA;EADAC,EAAAA,MAAAA;;;CAJlBE,IAAAA;CAQG,IAAA,EAAA,QAAA,YAAA,EAAA,QAPMD,KAAAA;EADT,MAAA,oBAACE,qBAAAA,UAAD;GACE,OAAOF;GAON;EAC4B,CAAA;EAD5B,EAAA,MAAA;EAPMA,EAAAA,MAAAA;;;CAFX,OACEC;AAWJ;AAEA,IAAa,yBAAA;CAA2C,OAAA,WAAW,oBAAoB;;AAnI3E,SAAA,QAAC,QAAW;CAChB,IAAI,CAAC,UAAU,OAAO,WAAW,UAAU,OAAO;CAClD,OAAO;AACT;AA0BiE,SAAA,WAAA;CAAM,OAAA;;AA2DvC,SAAA,OAAC,OAAA;CAAU,OAAA,MAAM;;;;ACjNvD,IAAM,qBAAqB;AAO3B,IAAM,aAAsB,KAA8B,UAAkB;CAC1E,IAAI,CAAC,KAAK;CACV,IAAI,OAAO,QAAQ,YAAY;EAC7B,IAAI,KAAK;EACT;CACF;CACA,IAAI,UAAU;AAChB;AAEA,IAAM,wBACJ,cACA,eACG;CACH,QAAQ,UAAkB;EACxB,eAAe,KAAK;EACpB,IAAI,CAAC,MAAM,kBACT,WAAW;CAEf;AACF;AAEA,IAAM,sBAAsB,EAC1B,UACA,gBACA,QACA,SAMa;CACb,IAAI,aAAa,QAAQ,OAAO;CAChC,IAAI,gBAAgB,OAAO;CAC3B,IAAI,OAAO,WAAW,YAAY,WAAW,SAAS,OAAO;CAC7D,IAAI,OAAO,OAAO,YAAY,mBAAmB,KAAK,EAAE,GAAG,OAAO;CAClE,OAAO;AACT;AAEA,IAAM,mBACJ,iBAKG;;CACH,MAAM,WAAW,OAAiC,IAAI;CACtD,MAAM,EAAE,aAAa,iBAAiB;CAGzBE,IAAAA;CAGOC,IAAAA;;EAHP,MAAC,SAAS;GACnB,SAAS,UAAU;EACrB;EACkB,WAAM,SAAS;;;;;;;CAJ5BC,IAAAA;CAQE,IAAA,EAAA,OAAA,YAAA,EAAA,OAAiB,cAAA;EARnB,KAAA;GACL,WAAWF;GAGX,kBAAkBC;GAClB,oBAAoB;IAClB,MAAM,OAAO,SAAS,SAAS,aAAa,MAAM;IAClD,IAAI,CAAC,MAAM;IACN,SAAS,MAAM,EAAE,aAAa,CAAC;GACtC;EACF;EAFS,EAAA,KAAA;EAAiB,EAAA,KAAA;;;CAR1B,OAAOC;AAWT;AAEA,IAAa,OAAO,YAAA,IAahB,iBACG;;CARD,IAAA;CADA,IAAA;CAEA,IAAA;CAHA,IAAA;CADU,IAAA;CAQP,IAAA;CAHH,IAAA;CACA,IAAA;CACA,IAAA;CARFC,IAAAA,EAAAA,OAAAA,IAAAA;EACE,CAAA,CAAA,UAAU,cACV,cACA,cACA,SACA,cACA,gBACA,QACA,IACA,GAAA,SATFA;;;;;;;;;;;;;;;;;;;;;;CAaA,MAAM,EAAE,oBAAoB,iBAAiB;CAC7C,MAAM,mBAAmB,gBAAgB;CACzC,MAAM,wBAAwB,OAAO,KAAK;CAC1C,MAAM,EAAE,WAAW,cAAc,qBAAqB,gBAAgB,YAAY;CAC9DC,IAAAA;CACR,IAAA,EAAA,QAAA,oBAAA,EAAA,QACV,kBAAA,EAAA,QACA,UAAA,EAAA,QACA,IAAA;EAJkB,KAAA,mBAAmB;GACrC,UAAU;GACV;GACA;GACA;EACF,CAAC;EAJW,EAAA,MAAA;EACV,EAAA,MAAA;EACA,EAAA,MAAA;EACA,EAAA,MAAA;;;CAJF,MAAM,cAAcA;CAOVC,IAAAA;;EAAM,WAAA;GACd,sBAAsB,UAAU;EAClC;;;CAAGC,IAAAA;CAAC,IAAA,EAAA,QAAA,IAAA;EAAD,KAAA,CAAC,EAAE;EAAF,EAAA,MAAA;;;CAFJ,UAAUD,IAEPC,EAAI;CAEGC,IAAAA;CAGPC,IAAAA;CAFI,IAAA,EAAA,QAAA,eAAA,EAAA,QAAe,oBAAA,EAAA,QACpB,cAAA;EAFQ,WAAM;GACd,IAAI,CAAC,eAAe,qBAAqB,UAAU;GACnD,aAAa;EACf;EAAG,KAAA;GAAC;GAAa;GAAkB;EAAY;EAFxC,EAAA,MAAA;EAAe,EAAA,MAAA;EACpB,EAAA,MAAA;;;;;;;CAFF,UAAUD,IAGPC,EAA6C;CAEtCC,IAAAA;CAoBPC,IAAAA;CAnBI,IAAA,EAAA,QAAA,eAAA,EAAA,QAEW,oBAAA,EAAA,QAFI,oBAAA,EAAA,QAUhB,cAAA;EAXI,WAAM;GACd,IAAI,CAAC,eAAe,qBAAqB,YAAY;GAErD,MAAM,UAAU,iBAAiB;GACjC,IAAI,CAAC,WAAW,OAAO,yBAAyB,aAAa;GAE7D,MAAM,WAAW,IAAI,sBAClB,YAAY;IAEX,IAAI,CADc,QAAQ,KAAKC,OAC1B,KAAa,sBAAsB,SAAS;IACjD,sBAAsB,UAAU;IAChC,aAAa;GACf,GACA,EAAE,WAAW,GAAI,CACnB;GAEA,SAAS,QAAQ,OAAO;GACxB,aAAa;IACX,SAAS,WAAW;GACtB;EACF;EAAG,KAAA;GAAC;GAAa;GAAkB;GAAc;EAAgB;EAnB1D,EAAA,MAAA;EAEW,EAAA,MAAA;EAFI,EAAA,MAAA;EAUhB,EAAA,MAAA;;;;;;;CAXN,UAAUF,IAoBPC,EAA+D;CAErCE,IAAAA;CACtB,IAAA,EAAA,QAAA,eAAA,EAAA,QAAe,oBAAA,EAAA,QACpB,cAAA;EAF2B,WAAM;GACjC,IAAI,CAAC,eAAe,qBAAqB,UAAU;GACnD,aAAa;EACf;EAFO,EAAA,MAAA;EAAe,EAAA,MAAA;EACpB,EAAA,MAAA;;;CAFF,MAAM,uBAAuBA;CAYXC,IAAAA;CAAmC,IAAA,EAAA,QAAA,wBAAA,EAAA,QAAd,cAAA;EAArB,KAAA,qBAAqB,cAAc,oBAAoB;EAApB,EAAA,MAAA;EAAd,EAAA,MAAA;;;CAC1BC,IAAAA;CAA8B,IAAA,EAAA,QAAA,wBAAA,EAAA,QAAT,SAAA;EAArB,MAAA,qBAAqB,SAAS,oBAAoB;EAApB,EAAA,MAAA;EAAT,EAAA,MAAA;;;CAChBC,IAAAA;CAAmC,IAAA,EAAA,QAAA,wBAAA,EAAA,QAAd,cAAA;EAArB,MAAA,qBAAqB,cAAc,oBAAoB;EAApB,EAAA,MAAA;EAAd,EAAA,MAAA;;;CAC9BC,IAAAA;CAEO,IAAA,EAAA,QAAA,aAAA,EAAA,QADA,cAAA;EADP,OAAC,SAAS;GACb,UAAU,cAAc,IAAI;GAC5B,UAAU,WAAW,IAAI;EAC3B;EADY,EAAA,MAAA;EADA,EAAA,MAAA;;;CAVdC,IAAAA;CACM,IAAA,EAAA,QAAA,SAAA,EAAA,QAGY,kBAAA,EAAA,QAGPH,OAAAA,EAAAA,QACKC,OAAAA,EAAAA,QACTC,OAAAA,EAAAA,QAHSH,MAAAA,EAAAA,QAHN,UAAA,EAAA,QADJ,IAAA;EAFN,MAAA,oBAAC,QAAD;GACE,GAAI;GACA;GACI;GACQ;GAChB,UAAS;GACT,cAAcA;GACd,SAASC;GACT,cAAcC;GACd,KAAKC;EAIN,CAAA;EAZK,EAAA,MAAA;EAGY,EAAA,MAAA;EAGPF,EAAAA,MAAAA;EACKC,EAAAA,MAAAA;EACTC,EAAAA,MAAAA;EAHSH,EAAAA,MAAAA;EAHN,EAAA,MAAA;EADJ,EAAA,MAAA;;;CAHR,OACEI;AAeJ,CACF;AAEA,KAAK,cAAc;AAtCsB,SAAA,QAAC,OAAA;CAAU,OAAA,MAAM;;;;AC1F1D,IAAM,iCAAiC;AACvC,IAAM,mCAAmC;AACzC,IAAM,oCAAoC;AAC1C,IAAM,gCAAgC;CACpC;CACA;CACA;CACA;CACA;CACA;AACF;AAEA,IAAM,wBAAwB,UAA4B;CACxD,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,UAAU,WAAW,QAAQ;CAC7F,OAAO,8BAA8B,MAAM,YAAY,QAAQ,KAAK,OAAO,CAAC;AAC9E;AAEA,IAAM,gCAAyC;CAC7C,IAAI,OAAO,WAAW,aAAa,OAAO;CAC1C,IAAI,OAAO,cAAc,eAAe,UAAU,WAAW,OAAO,OAAO;CAE3E,MAAM,MAAM,KAAK,IAAI;CAErB,IAAI;EACF,MAAM,mBAAmB,OAAO,OAAO,eAAe,QAAQ,iCAAiC,CAAC;EAChG,IAAI,OAAO,SAAS,gBAAgB,KAAK,MAAM,mBAAmB,gCAChE,OAAO;EAET,OAAO,eAAe,QAAQ,mCAAmC,OAAO,GAAG,CAAC;CAC9E,QAAQ;EACN,OAAO;CACT;CAEA,OAAO;AACT;AAEA,IAAM,6BAAmC;CACvC,IAAI;EACF,OAAO,eAAe,WAAW,iCAAiC;CACpE,QAAQ;EACN;CACF;AACF;AAEA,IAAM,cAAc,UAClB,IAAI,SAAS,GAAG,WAAW;CACzB,IAAI,UAAU;CAEd,MAAM,4BAA4B;EAChC,IAAI,CAAC,SAAS;EACd,UAAU;EACV,OAAO,oBAAoB,YAAY,cAAc;EACrD,qBAAqB;EACrB,OAAO,KAAK;CACd;CAEA,MAAM,UAAU,OAAO,WAAW,qBAAqB,gCAAgC;CACvF,MAAM,uBAAuB;EAC3B,IAAI,CAAC,SAAS;EACd,UAAU;EACV,OAAO,aAAa,OAAO;CAC7B;CAEA,OAAO,iBAAiB,YAAY,gBAAgB,EAAE,MAAM,KAAK,CAAC;CAElE,IAAI;EACF,OAAO,SAAS,OAAO;CACzB,QAAQ;EACN,oBAAoB;CACtB;AACF,CAAC;AAEH,IAAM,mBAAmB,aAAuD;CAC9E,IAAI,UAAuC;CAE3C,OAAO,YAAY;EACjB,IAAI,CAAC,SACH,UAAU,SAAS,CAAC,CAAC,OAAO,UAAU;GACpC,UAAU;GACV,MAAM;EACR,CAAC;EAGH,OAAO;CACT;AACF;AAEA,IAAa,aAAa,UAA+B,SAAyC;CAChG,MAAM,aAAa,gBAAgB,QAAQ;CAE3C,OAAO;EACL,MAAM,YAAY;GAChB,IAAI;GACJ,IAAI;IACF,SAAS,MAAM,WAAW;GAC5B,SAAS,OAAO;IACd,IAAI,qBAAqB,KAAK,KAAK,wBAAwB,GACzD,OAAO,WAAW,KAAK;IAEzB,MAAM;GACR;GACA,MAAM,kBAGF,EACF,WAAW,OAAO,QACpB;GAEA,IAAI,OAAO,OAAO,WAAW,YAC3B,gBAAgB,SAAS,OAAO;GAGlC,OAAO;EACT;EACA,QAAQ,iBAAiB,MAAM,QAAQ;GACrC,UAAU;GACV,cAAc,MAAM;GACpB,iBAAiB,MAAM;EACzB,CAAC;CACH;AACF;;;ACvIA,IAAa,gBAAA,OAQF;;CARkBC,IAAAA;;EAQzB,KAAA,OAAA,KAAA,IAAA,CAAC,IARwBA;;;;CAC3B,MAAA,EAAA,cAAA,IACA,aAAA,IACA,WAAA,OAH2BA;CAC3B,MAAA,eAAA,OAAA,KAAA,IAAe,KAAfC;CACAC,IAAAA;;EAAc,KAAA,OAAA,KAAA,IAAA,CAAC,IAAfA;;;;;CACAC,IAAAA;;EAAY,KAAA,OAAA,KAAA,IAAA,CAAC,IAAbA;;;;;CAMA,MAAM,WAAW,YAAY;CAEnBC,IAAAA;CA6CPC,IAAAA;CAvC2C,IAAA,EAAA,OAAA,eAAA,EAAA,OAApB,gBAAA,EAAA,OAHYC,SAAAA,YAAAA,EAAAA,OAAnB,WAAA;EAHT,WAAM;GACd,MAAM,WAAW,YAAY;IAE3B,IAAI,WAAW,UAAU,SAAS;IAElC,IAAI,CAAC,UACH,WAAW;KAAE,OAAO;KAAc,MAAM;IAAY;IAGtD,SAAS,QAAQ,SAAS;IAG1B,SAAS,iBAAiB,mBAAmB,CAAC,CAAC,QAAQC,KAAqB;IAG5E,SAAS,KAAK,QAAQC,MAYrB;IAGD,MAAM,eAAe,GAAG,OAAO,SAAS,SAAS,SAAS;IAE1D,MAAM,oBAAoB,SAAS,cAAc,yBAAyB;IAC1E,IAAI,mBACF,kBAAkB,OAAO;IAG3B,MAAM,gBAAgB,SAAS,cAAc,MAAM;IACnD,cAAc,aAAa,OAAO,WAAW;IAC7C,cAAc,aAAa,QAAQ,YAAY;IAC/C,cAAc,aAAa,mBAAmB,MAAM;IACpD,SAAS,KAAK,YAAY,aAAa;GACzC;GAEA,SAAS;EACX;EAAG,KAAA;GAAC,SAAS;GAAU;GAAc;GAAa;EAAS;EAvCb,EAAA,KAAA;EAApB,EAAA,KAAA;EAHYF,EAAAA,KAAAA,SAAAA;EAAnB,EAAA,KAAA;;;;;;;CAHnB,UAAUF,IA6CPC,EAAyD;AAC9D;AAlC6D,SAAA,MAAC,KAAA;CAAQ,OAAA,IAAI,OAAO;;AAGrD,SAAA,OAAC,MAAS;CAC9B,MAAM,cAAc,SAAS,cAAc,MAAM;CACjD,YAAY,aAAa,mBAAmB,MAAM;CAGlD,OAAO,QAAQ,IAAI,CAAC,CAAC,SAAA,OAA0B;EAAjB,MAAA,CAAC,KAAK,SAANI;EAC5B,IAAI,OACF,YAAY,aAAa,KAAK,MAAM,SAAS,CAAC;CAElD,CAAC;CAED,SAAS,KAAK,YAAY,WAAW;AACvC;;;AC9BN,IAAM,8BAA8B;AAEpC,IAAM,iCAAwD;CAC5D,MAAM,YAAY;CAIlB,MAAM,WAAW,UAAU;CAC3B,IAAI,UACF,OAAO;CAGT,MAAM,UAAiC;EACrC,wBAAQ,IAAI,IAA6B;EACzC,2BAAW,IAAI,IAA8B;CAC/C;CAEA,UAAU,+BAA+B;CACzC,OAAO;AACT;AAEA,IAAM,eAAqB;CACzB,yBAAyB,CAAC,CAAC,UAAU,SAAS,aAAa;EACzD,SAAS;CACX,CAAC;AACH;AAEA,IAAM,eAAe,GAAoB,MACvC,EAAE,OAAO,EAAE,MACX,EAAE,YAAY,EAAE,WAChB,EAAE,aAAa,EAAE,YACjB,EAAE,YAAY,EAAE,WAChB,EAAE,kBAAkB,EAAE,iBACtB,EAAE,0BAA0B,EAAE,yBAC9B,EAAE,sBAAsB,EAAE;AAE5B,IAAa,yBAAyB,UAAiC;CACrE,MAAM,SAAS,yBAAyB,CAAC,CAAC;CAC1C,MAAM,OAAO,OAAO,IAAI,MAAM,EAAE;CAChC,IAAI,QAAQ,YAAY,MAAM,KAAK,GACjC;CAGF,OAAO,IAAI,MAAM,IAAI,KAAK;CAC1B,OAAO;AACT;AAEA,IAAa,yBAAyB,OAAqB;CAGzD,IAFe,yBAAyB,CAAC,CAAC,OACjB,OAAO,EAC5B,GACF,OAAO;AAEX;AAEA,IAAa,4BACX,MAAM,KAAK,yBAAyB,CAAC,CAAC,OAAO,OAAO,CAAC;AAEvD,IAAa,6BACX,aACiB;CACjB,MAAM,YAAY,yBAAyB,CAAC,CAAC;CAC7C,UAAU,IAAI,QAAQ;CACtB,aAAa;EACX,UAAU,OAAO,QAAQ;CAC3B;AACF;AAEA,IAAa,8BAA8B,UAAiC;CAC1E,MAAM,iBAAiB,OAAO,KAAK;CACnC,eAAe,UAAU;CAEzB,MAAM,YAAY,OAAsB,IAAI;CAE5C,gBAAgB;EACd,MAAM,SAAS,UAAU;EACzB,IAAI,UAAU,WAAW,MAAM,IAC7B,sBAAsB,MAAM;EAE9B,UAAU,UAAU,MAAM;EAE1B,IAAI,CAAC,MAAM,SAAS;GAClB,sBAAsB,MAAM,EAAE;GAC9B;EACF;EAEA,sBAAsB,eAAe,OAAO;EAC5C,aAAa;GACX,sBAAsB,MAAM,EAAE;EAChC;CACF,GAAG;EACD,MAAM;EACN,MAAM;EACN,MAAM;EACN,MAAM;EACN,MAAM;EACN,MAAM;EACN,MAAM;CACR,CAAC;AACH;;;AC7CA,IAAM,4BAAN,cAAwC,UAAqE;CAC3G,QAAQ,EAAE,OAAO,KAAK;CAEtB,OAAO,yBAAyB,OAAgB;EAC9C,OAAO,EAAE,MAAM;CACjB;CAEA,kBAAkB,OAAgB,WAAsB;EACtD,QAAQ,MAAM,iCAAiC,OAAO,SAAS;CACjE;CAEA,mBAAmB,eAA+C;EAChE,IAAI,KAAK,MAAM,UAAU,MAAM;EAC/B,IAAI,cAAc,aAAa,KAAK,MAAM,UAAU;EACpD,KAAK,SAAS,EAAE,OAAO,KAAK,CAAC;CAC/B;CAEA,SAAS;EACP,OAAO,KAAK,MAAM,UAAU,OAAO,KAAK,MAAM,WAAW,KAAK,MAAM,SAAS,KAAK,MAAM,KAAK;CAC/F;AACF;AAEA,IAAM,iCAAiC;AAQvC,SAAS,sBAAsB,UAAqC;CAClE,IAAI,OAAO,WAAW,aACpB,OAAO,YAAY;EAAE,UAAU;EAAI,QAAQ;EAAI,MAAM;CAAG;CAG1D,OAAO;EACL,UAAU,OAAO,SAAS;EAC1B,QAAQ,OAAO,SAAS;EACxB,MAAM,OAAO,SAAS;CACxB;AACF;AAEA,SAAS,wBAAwB,QAAgB,OAAe;CAC9D,OAAO,IAAI,gBAAgB,MAAM,CAAC,CAAC,IAAI,KAAK;AAC9C;AAEA,SAAS,yBAAyB,UAAwB;CACxD,OAAO,sBAAsB,QAAQ,CAAC,CAAC;AACzC;AAEA,SAAS,uBAAgD;;CAEvD,MAAM,WADU,WAAW,sBACV,CAAA,EAAS;CAC1B,IAAI,CAAC,UAAU;CACRC,IAAAA;CAGUC,IAAAA,EAAAA,OAAAA,SAAAA,QAAAA,EAAAA,OAFIC,SAAAA,YAAAA,EAAAA,OACFC,SAAAA,QAAAA;EAFZ,KAAA;GACL,UAAU,SAAS;GACnB,QAAQ,SAAS;GACjB,MAAM,SAAS;EACjB;EADiBF,EAAAA,KAAAA,SAAAA;EAFIC,EAAAA,KAAAA,SAAAA;EACFC,EAAAA,KAAAA,SAAAA;;;CAFnB,OAAOH;AAKT;AAEA,SAAS,qBAAqB,OAAe;CAC3C,IAAI,OAAO,WAAW,aAAa,OAAO;CAC1C,OAAO,wBAAwB,OAAO,SAAS,QAAQ,KAAK;AAC9D;AAEA,SAAS,mBAAmB;CAC1B,IAAI,OAAO,WAAW,aAAa,OAAO;CAC1C,OAAO,OAAO,SAAS;AACzB;AAEA,SAAS,2BAA2B,UAAsB;CACxD,IAAI,OAAO,WAAW,aAAa,aAAa,KAAA;CAEhD,OAAO,iBAAiB,gCAAgC,QAAQ;CAChE,OAAO,iBAAiB,YAAY,QAAQ;CAC5C,aAAa;EACX,OAAO,oBAAoB,gCAAgC,QAAQ;EACnE,OAAO,oBAAoB,YAAY,QAAQ;CACjD;AACF;AAEA,SAAS,SAAS,cAA+B,UAAwB;CACvE,MAAM,EAAE,UAAU,SAAS,sBAAsB,QAAQ;CACzD,MAAM,aAAa,aAAa,SAAS;CACzC,OAAO,GAAG,WAAW,aAAa,IAAI,eAAe,KAAK;AAC5D;AAEA,SAAS,yBACP,cACA,QACA,OACA;CACA,MAAM,YAAY;CAClB,KAAK,MAAM,SAAS,QAClB,aAAa,OAAO,KAAK;AAE7B;AAEA,SAAS,wBAAwB,QAAgB,QAAkB;CACjE,MAAM,eAAe,IAAI,gBAAgB,MAAM;CAC/C,OAAO,OACJ,KAAK,UAAU;EAEd,OAAO,GAAG,MAAM,GADD,aAAa,OAAO,KAChB,CAAA,CAAO,KAAK,IAAQ;CACzC,CAAC,CAAC,CACD,KAAK,GAAQ;AAClB;AAEA,IAAM,oCAAoC,UAAkC;CAC1E,UAAU;CACV,OAAO;CACP,QAAQ;CACR,SAAS;CACT,YAAY;CACZ,gBAAgB;CAChB,YAAY;CACZ,OAAO;CACP,SAAS,OAAO,IAAI;CACpB,eAAe,OAAO,SAAS;CAC/B,YAAY;AACd;AAEA,IAAM,iCAAgD;CACpD,SAAS;CACT,YAAY;CACZ,KAAK;CACL,UAAU;CACV,YAAY;AACd;AAEA,SAAgB,4BAA4B,EAC1C,OAAO,MACP,QAAQ,gBACyC;CACjD,MAAM,WAAW,cACf,OACA;EACE,sCAAsC;EACtC,cAAc,OAAO,SAAS;EAC9B,OAAO,iCAAiC,IAAI;CAC9C,GACA,cACE,OACA;EACE,MAAM;EACN,aAAa;EACb,OAAO;CACT,GACA,cACE,OACA;EACE,eAAe;EACf,WAAW;EACX,QAAQ;EACR,SAAS;EACT,OAAO;CACT,GACA,cAAc,UAAU;EACtB,IAAI;EACJ,IAAI;EACJ,MAAM;EACN,GAAG;EACH,QAAQ;EACR,eAAe;EACf,aAAa;CACf,CAAC,GACD,cACE,QACA;EACE,GAAG;EACH,MAAM;EACN,QAAQ;EACR,eAAe;EACf,aAAa;CACf,GACA,cAAc,oBAAoB;EAChC,eAAe;EACf,KAAK;EACL,MAAM;EACN,aAAa;EACb,IAAI;EACJ,MAAM;CACR,CAAC,CACH,CACF,GACA,cAAc,QAAQ,MAAM,KAAK,CACnC,CACF;CAEA,OAAO,OAAO,aAAa,cAAc,WAAW,aAAa,UAAU,SAAS,IAAI;AAC1F;AAEA,IAAM,iCAAiC,cAAc,2BAA2B;AAEhF,SAAS,2BACP,UACA,UACA,OACA,eAAe,OACf;CACA,IAAI,OAAO,aAAa,YAAY;EAClC,IAAI,CAAC,cACH,OAAQ,SAAwC,QAAQ;EAG1D,OAAQ,SAA6C;GAAE,GAAG;GAAU;EAAM,CAAC;CAC7E;CAEA,IAAI,eAAe,QAAQ,GACzB,OAAO,aAAa,UAAmD;EACrE,MAAM,SAAS;EACf,QAAQ,SAAS;EACjB,SAAS,SAAS;EAClB,cAAc,SAAS;EACvB,cAAc,SAAS;EACvB;CACF,CAAC;CAGH,OAAO,YAAY;AACrB;AAEA,SAAgB,mBAAmB,QAAiD;CAClF,IAAI,OAAO,WAAW,aAAa;CAEnC,MAAM,EAAE,UAAU,QAAQ,SAAS,sBAAsB;CACzD,MAAM,eAAe,IAAI,gBAAgB,MAAM;CAC/C,OAAO,YAAY;CAEnB,MAAM,UAAU,SAAS,YAAY;CAErC,IAAI,YAAY,GADM,WAAW,SAAS,QACd;CAE5B,OAAO,QAAQ,aAAa,OAAO,QAAQ,OAAO,IAAI,OAAO;CAC7D,OAAO,cAAc,IAAI,MAAM,8BAA8B,CAAC;AAChE;AAEA,SAAgB,cAAc,OAA8B;;CAC1D,MAAM,oBAAoB,qBAAqB;CAG7CI,IAAAA;CAA2B,IAAA,EAAA,OAAA,OAAA;EAA3B,WAAM,qBAAqB,KAAK;EAAL,EAAA,KAAA;;;CAC3BC,IAAAA;CAA+D,IAAA,EAAA,OAAA,SAAA,EAAA,OAAdF,mBAAAA,QAAAA;EAAjD,WAAM,wBAAwB,mBAAmB,UAAU,IAAI,KAAK;EAAL,EAAA,KAAA;EAAdA,EAAAA,KAAAA,mBAAAA;;;CAHnD,OAAO,qBACL,4BACAC,IACAC,EACF;AACF;AAEA,SAAgB,iBAAyB;;CACvC,MAAM,oBAAoB,qBAAqB;CAI7CC,IAAAA;CAA+B,IAAA,EAAA,OAAA,mBAAA;EAA/B,WAAM,yBAAyB,iBAAiB;EAAjB,EAAA,KAAA;;;CAHjC,OAAO,qBACL,4BACA,kBACAA,EACF;AACF;AAEA,IAAa,mBAAA,OAMsD;;CANzB,MAAA,EACxC,QACA,OACA,OACA,OACA,cAAA,OALwCC;CAKxC,MAAA,eAAA,OAAA,KAAA,IAAe,IAAfC;CAEA,MAAM,oBAAoB,qBAAqB;CAC/C,MAAM,SAAS,eAAe;CAC9B,MAAM,CAAC,wBAAwB,6BAA6B,SAAS,KAAK;CAC1E,MAAM,kBAAkB,OAAsB,IAAI;CACpCC,IAAAA;CAA0B,IAAA,EAAA,OAAA,SAAA,EAAA,OAAA,QAAA;EAA1B,KAAA,MAAM,IAAI,gBAAgB,MAAM,CAAC;EAAjC,EAAA,KAAA;EAA0B,EAAA,KAAA;;;CAAxC,MAAM,QAAQA;CACd,MAAM,YAAY,UAAU;CACDC,IAAAA;CAAgC,IAAA,EAAA,OAAA,UAAA,EAAA,OAAR,QAAA;EAAxB,KAAA,wBAAwB,QAAQ,MAAM;EAAN,EAAA,KAAA;EAAR,EAAA,KAAA;;;CAAnD,MAAM,qBAAqBA;CAECC,IAAAA;;EAAM,WAAA;GAChC,IAAI,gBAAgB,YAAY,MAAM;GACtC,OAAO,aAAa,gBAAgB,OAAO;GAC3C,gBAAgB,UAAU;EAC5B;;;CAJA,MAAM,sBAAsBA;CAMCC,IAAAA;;EAAM,WAAA;GACjC,oBAAoB;GACpB,0BAA0B,KAAK;EACjC;;;CAHA,MAAM,uBAAuBA;CAKLC,IAAAA;CAE2B,IAAA,EAAA,OAAA,SAAA,EAAA,OAAR,QAAA;EAFnB,WAAM;GAC5B,oBAAoB,iBAAiB;IACnC,yBAAyB,cAAc,QAAQ,KAAK;GACtD,CAAC;EACH;EAFmD,EAAA,KAAA;EAAR,EAAA,KAAA;;;CAF3C,MAAM,kBAAkBA;CAMNC,IAAAA;CAE+B,IAAA,EAAA,QAAA,SAAA,EAAA,QAAR,UAAA,EAAA,QADwB,qBAAA,EAAA,QAI7D,OAAA;EALc,MAAC,cAAuC;GACxD,MAAMC,iBAAe,IAAI,gBAAgB,sBAAsB,iBAAiB,CAAC,CAAC,MAAM;GACxF,yBAAyBA,gBAAc,QAAQ,KAAK;GAEpD,IAAI,cAAc,MAChB,MAAMA,gBAAc,SAAS;GAG/B,OAAO,SAASA,gBAAc,iBAAiB;EACjD;EAPiD,EAAA,MAAA;EAAR,EAAA,MAAA;EADwB,EAAA,MAAA;EAI7D,EAAA,MAAA;;;CALJ,MAAM,YAAYD;CAWEE,IAAAA;CAG+B,IAAA,EAAA,QAAA,SAAA,EAAA,QAAR,UAAA,EAAA,QACvC,OAAA;EAJgB,MAAC,gBAAwB;GAC3C,qBAAqB;GACrB,oBAAoB,mBAAiB;IACnC,yBAAyBD,gBAAc,QAAQ,KAAK;IACpD,MAAMA,gBAAcE,WAAS;GAC/B,CAAC;EACH;EAHmD,EAAA,MAAA;EAAR,EAAA,MAAA;EACvC,EAAA,MAAA;;;CAJJ,MAAM,cAAcD;CAQCE,IAAAA;CAMkB,IAAA,EAAA,QAAA,gBAAA,EAAA,QACnC,mBAAA,EAAA,QANG,WAAA;EADc,WAAM;GACzB,IAAI,CAAC,WAAW;GAEhB,0BAA0B,IAAI;GAC9B,oBAAoB;GAEpB,IAAI,OAAO,WAAW,eAAe,gBAAgB,GAAG;IACtD,gBAAgB;IAChB;GACF;GAEA,gBAAgB,UAAU,OAAO,iBAAiB;IAChD,gBAAgB,UAAU;IAC1B,gBAAgB;GAClB,GAAG,YAAY;EACjB;EATuC,EAAA,MAAA;EACnC,EAAA,MAAA;EANG,EAAA,MAAA;;;CADP,MAAM,eAAeA;CAiBXC,IAAAA;CACJ,IAAA,EAAA,QAAA,WAAA;EADI,YAAM;GACd,IAAI,WAAW;IACb,0BAA0B,KAAK;IAC/B;GACF;GAEA,oBAAoB;GACpB,0BAA0B,KAAK;EACjC;EAPM,EAAA,MAAA;;;CAOHC,IAAAA;CAAC,IAAA,EAAA,QAAA,aAAA,EAAA,QAAW,oBAAA;EAAZ,MAAA,CAAC,WAAW,kBAAkB;EAA7B,EAAA,MAAA;EAAW,EAAA,MAAA;;;CARf,UAAUD,KAQPC,GAA+B;CAExBC,IAAAA;CAIPC,IAAAA;;EAJO,kBACK;GACX,oBAAoB;EACtB;EACC,MAAA,CAAC;;;;;;;CAJJ,UAAUD,KAIPC,GAAE;CAGK,MAAA,MAAA,aAAa,CAAC;CADjBC,IAAAA;CAIL,IAAA,EAAA,QAAA,aAAA,EAAA,QAEA,gBAAA,EAAA,QAJc,aAAA,EAAA,QAGd,eAAA,EAAA,QAJQC,OAAAA,EAAAA,QAER,OAAA;EAHK,MAAA;GACL,QAAQA;GACR,cAAc;GACd;GACA;GACA;GACA;GACA;EACF;EAJE,EAAA,MAAA;EAEA,EAAA,MAAA;EAJc,EAAA,MAAA;EAGd,EAAA,MAAA;EAJQA,EAAAA,MAAAA;EAER,EAAA,MAAA;;;CAHF,OAAOD;AAST;AAEA,SAAgB,aAAuB,EACrC,SACA,UACA,eACA,YACmD;CACnD,IAAI,CAAC,QAAQ,gBAAgB,QAAQ,UAAU,MAAM,OAAO;CAE5D,MAAM,WAAW,SAAkB;EACjC,IAAI,MAAM;GACR,QAAQ,qBAAqB;GAC7B;EACF;EAEA,QAAQ,aAAa;CACvB;CAEA,MAAM,WAAuC;EAC3C,MAAM,QAAQ;EACd;EACA,cAAc,QAAQ;EACtB,sBAAsB,QAAQ;CAChC;CACA,MAAM,mBAAmB;EACvB,GAAG;EACH,cAAc;CAChB;CACA,MAAM,WAAW,QAAQ,UAAU,QAAQ,KAAK;CAGhD,OAAO,cACL,2BACA;EACE;EACA,WAAW,UAAmB,2BAA2B,eAAe,kBAAkB,OAAO,IAAI;CACvG,GACA,cACE,UACA,EACE,UAAU,2BAXS,aAAa,KAAA,IAAY,iCAAiC,UAWtB,gBAAgB,EACzE,GACA,SAAS,QAAQ,OAAO,QAAQ,CAClC,CACF;AACF;;;AC3bA,IAAM,gBAAgB,QAAwB,IAAI,YAAY;AAE9D,IAAM,yBAAyB,WAAwC;CACrE,MAAM,UAAU;CAChB,MAAM,UAAU,SAAS;CAEzB,OACE,SAAS,sBAAsB,QAC/B,YAAY,WACZ,YAAY,cACZ,YAAY;AAEhB;AAEA,IAAM,0BAA0B,OAAsB,aAAwC;CAC5F,IAAI,aAAa,MAAM,GAAG,MAAM,aAAa,SAAS,GAAG,GAAG,OAAO;CAEnE,IAAI,OAAO,SAAS,QAAQ,WACX;OAAA,MAAM,WAAW,MAAM,aACvB,SAAS,KAAK,OAAO;CAAA;CAEtC,IAAI,OAAO,SAAS,SAAS,aAAa,MAAM,YAAY,SAAS,MAAM,OAAO;CAClF,IAAI,OAAO,SAAS,SAAS,aAAa,MAAM,YAAY,SAAS,MAAM,OAAO;CAClF,IAAI,OAAO,SAAS,QAAQ,aAAa,MAAM,WAAW,SAAS,KAAK,OAAO;CAC/E,IAAI,OAAO,SAAS,UAAU,aAAa,MAAM,aAAa,SAAS,OAAO,OAAO;CAErF,OAAO;AACT;AAEA,IAAM,kBAAkB,IAA0D,SAAiB;CACjG,IAAI,CAAC,IAAI;CACT,QAAa,QAAQ,GAAG,IAAI,CAAC;AAC/B;AAEA,IAAa,+BAA+B,EAC1C,UACA,SACA,UACA,UACA,UAAU,SACV,UAAU,MACV,iBAAiB,MACjB,qBAAqB,MACrB,iBAAiB,4BAC6B;CAC9C,MAAM,iBAAiB,YAAY;CAEnC,MAAM,cAAc,OAAO,QAAQ;CACnC,MAAM,aAAa,OAAO,OAAO;CACjC,MAAM,cAAc,OAAO,QAAQ;CACnC,MAAM,cAAc,OAAO,YAAY,cAAc;CACrD,MAAM,aAAa,OAAO,OAAO;CACjC,MAAM,aAAa,OAAO,OAAO;CACjC,MAAM,oBAAoB,OAAO,cAAc;CAC/C,MAAM,wBAAwB,OAAO,kBAAkB;CACvD,MAAM,oBAAoB,OAAO,cAAc;CAC/C,MAAM,6BAA6B,OAAO,KAAK;CAE/C,YAAY,UAAU;CACtB,WAAW,UAAU;CACrB,YAAY,UAAU;CACtB,YAAY,UAAU,YAAY;CAClC,WAAW,UAAU;CACrB,WAAW,UAAU;CACrB,kBAAkB,UAAU;CAC5B,sBAAsB,UAAU;CAChC,kBAAkB,UAAU;CAE5B,IAAI,CAAC,WAAW,YAAY,SAC1B,2BAA2B,UAAU;CAGvC,gBAAgB;EACd,IAAI,OAAO,WAAW,aAAa;EAEnC,MAAM,aAAa,UAAyB;GAC1C,IAAI,CAAC,WAAW,SAAS;GACzB,IAAI,sBAAsB,WAAW,kBAAkB,QAAQ,MAAM,MAAM,GAAG;GAC9E,IAAI,MAAM,QAAQ;GAClB,IAAI,CAAC,uBAAuB,OAAO,YAAY,OAAO,GAAG;GAEzD,IAAI,kBAAkB,SACpB,MAAM,eAAe;GAGvB,MAAM,OAAO,WAAW,QAAQ;GAChC,IAAI,CAAC,MAAM;GAEX,eAAe,YAAY,SAAS,IAAI;GAExC,IAAI,WAAW,YAAY,WAAW;IACpC,eAAe,YAAY,SAAS,IAAI;IACxC;GACF;GAEA,2BAA2B,UAAU;EACvC;EAEA,MAAM,WAAW,UAAyB;GACxC,IAAI,CAAC,WAAW,SAAS;GACzB,IAAI,WAAW,YAAY,SAAS;GACpC,IAAI,CAAC,2BAA2B,SAAS;GACzC,IAAI,aAAa,MAAM,GAAG,MAAM,aAAa,YAAY,QAAQ,GAAG,GAAG;GAEvE,2BAA2B,UAAU;GAErC,IAAI,sBAAsB,WAAW,kBAAkB,QAAQ,MAAM,MAAM,GAAG;GAE9E,IAAI,kBAAkB,SACpB,MAAM,eAAe;GAGvB,MAAM,OAAO,WAAW,QAAQ;GAChC,IAAI,CAAC,MAAM;GAEX,eAAe,YAAY,SAAS,IAAI;EAC1C;EAEA,MAAM,eAAe;GACnB,2BAA2B,UAAU;EACvC;EAEA,OAAO,iBAAiB,WAAW,SAAS;EAC5C,OAAO,iBAAiB,SAAS,OAAO;EACxC,OAAO,iBAAiB,QAAQ,MAAM;EAEtC,aAAa;GACX,OAAO,oBAAoB,WAAW,SAAS;GAC/C,OAAO,oBAAoB,SAAS,OAAO;GAC3C,OAAO,oBAAoB,QAAQ,MAAM;EAC3C;CACF,GAAG,CAAC,CAAC;AACP"}
|