@absolutejs/absolute 0.20.0-beta.169 → 0.20.0-beta.170
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/CHANGELOG.md +80 -0
- package/README.md +232 -0
- package/changelog.json +228 -0
- package/dist/angular/browser.js +7 -8
- package/dist/angular/browser.js.map +6 -5
- package/dist/angular/components/core/streamingSlotRegistrar.js +6 -2
- package/dist/angular/components/core/streamingSlotRegistry.js +7 -3
- package/dist/angular/index.js +555 -156
- package/dist/angular/index.js.map +29 -23
- package/dist/angular/server.js +555 -156
- package/dist/angular/server.js.map +29 -23
- package/dist/build/buildWorker.js +14 -8
- package/dist/build.js +4949 -1941
- package/dist/build.js.map +72 -42
- package/dist/cli/{add-7azr0c83.js → add-6a7pjkn9.js} +11 -7
- package/dist/cli/{analyze-3cyek6v3.js → analyze-606fshwa.js} +1 -1
- package/dist/cli/{build-25rz8v25.js → build-g81xqbb9.js} +1 -1
- package/dist/cli/{compile-4jnfxts9.js → compile-9y1w9zpj.js} +3 -3
- package/dist/cli/config/server.js +10699 -1538
- package/dist/cli/{dev-9tk5hn2e.js → dev-hyeb89hp.js} +5 -1
- package/dist/cli/{doctor-4nv2c2j3.js → doctor-h55y9hj1.js} +1 -1
- package/dist/cli/{generate-v75p2fct.js → generate-20x1pkf7.js} +4 -4
- package/dist/cli/{htmx-427swtdz.js → htmx-6mz2h7k1.js} +2 -2
- package/dist/cli/{index-bhbs6d5z.js → index-32ge2w1f.js} +12 -4
- package/dist/cli/{index-a4ws2jwd.js → index-3wz3mktm.js} +1 -1
- package/dist/cli/{index-b7hjgknf.js → index-9sksd8c8.js} +13 -4
- package/dist/cli/{index-eyzwc7gz.js → index-qbrzvmh9.js} +4 -2
- package/dist/cli/index-qw98g1p6.js +269 -0
- package/dist/cli/{index-434b7j4a.js → index-vtp20gwf.js} +69 -1
- package/dist/cli/{index-h7qhz02e.js → index-wk0pyxrg.js} +3 -0
- package/dist/cli/{index-k3y8cb6c.js → index-z6f43b20.js} +1 -1
- package/dist/cli/index.js +16 -16
- package/dist/cli/{islands-8sgky9gh.js → islands-dc54e5y1.js} +1 -1
- package/dist/cli/{ls-4m4yqwww.js → ls-b6zz24nt.js} +1 -1
- package/dist/cli/{mobile-hcxjr2gf.js → mobile-ajnnvqtv.js} +3 -3
- package/dist/cli/prerender-fqpp0m1j.js +10 -0
- package/dist/cli/{remove-1ycjx85k.js → remove-t8x1mrxg.js} +4 -4
- package/dist/cli/{start-mbaejxhm.js → start-d6p831ny.js} +3 -3
- package/dist/cli/{typecheck-dr068pmh.js → typecheck-stbt0qt5.js} +6 -1
- package/dist/cli/{workspace-1sycp9g1.js → workspace-61hh6jq1.js} +1 -1
- package/dist/client/chunks/index-6b66nzyf.js +381 -0
- package/dist/client/chunks/index-6b66nzyf.js.map +11 -0
- package/dist/client/chunks/{islands-rc28k5sx.js → islands-s2ta5ajb.js} +5 -2
- package/dist/client/chunks/{islands-rc28k5sx.js.map → islands-s2ta5ajb.js.map} +7 -6
- package/dist/client/index.js +160 -3
- package/dist/client/index.js.map +6 -4
- package/dist/client/navigation.js +764 -0
- package/dist/client/navigation.js.map +10 -0
- package/dist/client/prefetch.js +33 -375
- package/dist/client/prefetch.js.map +3 -4
- package/dist/core/streamingSlotRegistrar.js +5 -2
- package/dist/core/streamingSlotRegistrar.js.map +5 -4
- package/dist/core/streamingSlotRegistry.js +5 -2
- package/dist/core/streamingSlotRegistry.js.map +5 -4
- package/dist/dev/client/cspNonce.ts +28 -0
- package/dist/dev/client/handlers/html.ts +4 -3
- package/dist/dev/client/handlers/htmx.ts +3 -2
- package/dist/dev/client/handlers/svelte.ts +15 -90
- package/dist/dev/client/syncDevtools.ts +2 -1
- package/dist/dev/serverBootstrap.js +11 -4
- package/dist/i18n/index.js +543 -0
- package/dist/i18n/index.js.map +15 -0
- package/dist/index.js +6339 -2233
- package/dist/index.js.map +89 -54
- package/dist/islands/index.js +282 -40
- package/dist/islands/index.js.map +14 -10
- package/dist/mobile/browser.js +7 -2
- package/dist/mobile/browser.js.map +5 -4
- package/dist/mobile/index.js +7 -2
- package/dist/mobile/index.js.map +5 -4
- package/dist/mobile/remoteMacAgentEntry.js +1 -1
- package/dist/react/components/browser/index.js +94 -4
- package/dist/react/components/index.js +150 -10
- package/dist/react/components/index.js.map +15 -10
- package/dist/react/hooks/index.js +479 -13
- package/dist/react/hooks/index.js.map +12 -4
- package/dist/react/index.js +769 -166
- package/dist/react/index.js.map +32 -21
- package/dist/react/router/browser.js +21 -4
- package/dist/react/router/browser.js.map +5 -4
- package/dist/react/router/index.js +21 -4
- package/dist/react/router/index.js.map +5 -4
- package/dist/react/server.js +597 -203
- package/dist/react/server.js.map +25 -15
- package/dist/src/angular/zoneRuntime.d.ts +5 -0
- package/dist/src/build/buildReactServerComponents.d.ts +22 -0
- package/dist/src/build/downlevelAsyncForZone.d.ts +1 -0
- package/dist/src/build/fileRoutes.d.ts +65 -0
- package/dist/src/build/fonts/buildFonts.d.ts +25 -0
- package/dist/src/build/fonts/fallbackMetrics.d.ts +13 -0
- package/dist/src/build/fonts/googleFonts.d.ts +18 -0
- package/dist/src/build/fonts/injectFontTags.d.ts +7 -0
- package/dist/src/build/fonts/parseFontMetrics.d.ts +4 -0
- package/dist/src/build/generateReactIndexes.d.ts +7 -1
- package/dist/src/build/htmlIncludes.d.ts +16 -0
- package/dist/src/build/inlineSourceMapComment.d.ts +1 -0
- package/dist/src/build/scanConventions.d.ts +3 -0
- package/dist/src/build/vitals.d.ts +21 -0
- package/dist/src/client/formActions.d.ts +29 -0
- package/dist/src/client/index.d.ts +2 -0
- package/dist/src/client/navigation.d.ts +16 -0
- package/dist/src/client/prefetch.d.ts +2 -30
- package/dist/src/core/build.d.ts +2 -2
- package/dist/src/core/cspNonce.d.ts +12 -0
- package/dist/src/core/fileRouteAdapter.d.ts +15 -0
- package/dist/src/core/fileRoutes.d.ts +5 -0
- package/dist/src/core/formActionFlash.d.ts +25 -0
- package/dist/src/core/formActions.d.ts +249 -0
- package/dist/src/core/index.d.ts +5 -0
- package/dist/src/core/partialPrerender.d.ts +28 -0
- package/dist/src/core/partialPrerenderServe.d.ts +24 -0
- package/dist/src/core/precompressed.d.ts +11 -1
- package/dist/src/core/prerenderNonce.d.ts +9 -0
- package/dist/src/core/productionRuntime.d.ts +4 -2
- package/dist/src/core/serverOnlyStaticFiles.d.ts +8 -0
- package/dist/src/core/staticHtmlNonce.d.ts +2 -0
- package/dist/src/core/vitals.d.ts +108 -0
- package/dist/src/dev/angular/fastHmrCompiler.d.ts +1 -1
- package/dist/src/dev/client/cspNonce.d.ts +2 -0
- package/dist/src/dev/fileRouteRefresher.d.ts +5 -0
- package/dist/src/dev/importCost/instrument.d.ts +1 -1
- package/dist/src/dev/reactServerComponentsRebuild.d.ts +3 -0
- package/dist/src/i18n/defineMessages.d.ts +5 -0
- package/dist/src/i18n/formatMessage.d.ts +26 -0
- package/dist/src/i18n/index.d.ts +6 -0
- package/dist/src/i18n/intlCache.d.ts +5 -0
- package/dist/src/i18n/routing.d.ts +28 -0
- package/dist/src/i18n/translator.d.ts +11 -0
- package/dist/src/mobile/androidRelease.d.ts +2 -2
- package/dist/src/mobile/iosRelease.d.ts +4 -4
- package/dist/src/mobile/materializedBundle.d.ts +1 -1
- package/dist/src/mobile/mobileInspect.d.ts +1 -1
- package/dist/src/mobile/releaseArtifact.d.ts +2 -2
- package/dist/src/mobile/remoteMacProtocol.d.ts +2 -2
- package/dist/src/plugins/i18n.d.ts +30 -0
- package/dist/src/plugins/index.d.ts +2 -1
- package/dist/src/plugins/secureHeaders.d.ts +48 -0
- package/dist/src/react/components/Head.d.ts +1 -1
- package/dist/src/react/components/StreamSlot.browser.d.ts +1 -0
- package/dist/src/react/components/StreamSlot.d.ts +5 -1
- package/dist/src/react/components/SuspenseSlot.browser.d.ts +2 -0
- package/dist/src/react/components/SuspenseSlot.d.ts +12 -0
- package/dist/src/react/fileRoute.d.ts +18 -0
- package/dist/src/react/hooks/index.d.ts +4 -0
- package/dist/src/react/hooks/useFormAction.d.ts +42 -0
- package/dist/src/react/hooks/useI18n.d.ts +15 -0
- package/dist/src/react/index.d.ts +2 -0
- package/dist/src/react/server.d.ts +2 -0
- package/dist/src/react/serverComponents/constants.d.ts +11 -0
- package/dist/src/react/serverComponents/flightPayload.d.ts +2 -0
- package/dist/src/react/serverComponents/pageHandler.d.ts +14 -0
- package/dist/src/svelte/browser.d.ts +1 -0
- package/dist/src/svelte/fileRoute.d.ts +15 -0
- package/dist/src/svelte/i18n.d.ts +8 -0
- package/dist/src/svelte/index.d.ts +2 -0
- package/dist/src/svelte/lowerAwaitSlotSyntax.d.ts +5 -1
- package/dist/src/svelte/renderToReadableStream.d.ts +10 -2
- package/dist/src/svelte/router/browser.d.ts +3 -1
- package/dist/src/svelte/router/goto.d.ts +13 -10
- package/dist/src/svelte/router/guards.d.ts +43 -0
- package/dist/src/svelte/router/index.d.ts +3 -1
- package/dist/src/svelte/router/lazy.d.ts +17 -0
- package/dist/src/svelte/router/lazyModule.d.ts +29 -0
- package/dist/src/svelte/router/navigation.d.ts +55 -0
- package/dist/src/svelte/router/pushState.d.ts +4 -2
- package/dist/src/svelte/router/scroll.d.ts +34 -0
- package/dist/src/svelte/routerSsr.d.ts +9 -0
- package/dist/src/svelte/server.d.ts +1 -0
- package/dist/src/utils/cspNonceRef.d.ts +8 -0
- package/dist/src/utils/fontAssets.d.ts +17 -0
- package/dist/src/utils/formActionProtocol.d.ts +10 -0
- package/dist/src/utils/generateHeadElement.d.ts +1 -1
- package/dist/src/utils/index.d.ts +1 -0
- package/dist/src/utils/inlinePageCss.d.ts +18 -0
- package/dist/src/utils/loadConfig.d.ts +5 -0
- package/dist/src/utils/localeRef.d.ts +10 -0
- package/dist/src/utils/resolveConvention.d.ts +6 -1
- package/dist/src/utils/streamingSlots.d.ts +5 -0
- package/dist/src/vue/browser.d.ts +2 -0
- package/dist/src/vue/components/Image.d.ts +2 -2
- package/dist/src/vue/index.d.ts +2 -0
- package/dist/src/vue/serverDataPayload.d.ts +32 -0
- package/dist/src/vue/serverDataState.d.ts +9 -0
- package/dist/src/vue/useServerData.browser.d.ts +6 -0
- package/dist/src/vue/useServerData.d.ts +24 -0
- package/dist/svelte/browser.js +330 -3
- package/dist/svelte/browser.js.map +8 -4
- package/dist/svelte/components/AwaitSlot.svelte +5 -0
- package/dist/svelte/components/Head.svelte +50 -0
- package/dist/svelte/components/JsonLd.svelte +9 -1
- package/dist/svelte/components/StreamSlot.svelte +5 -0
- package/dist/svelte/index.js +1017 -117
- package/dist/svelte/index.js.map +38 -24
- package/dist/svelte/router/Link.svelte +40 -8
- package/dist/svelte/router/Route.svelte +157 -12
- package/dist/svelte/router/Route.svelte.d.ts +39 -5
- package/dist/svelte/router/Router.svelte +140 -25
- package/dist/svelte/router/Router.svelte.d.ts +5 -1
- package/dist/svelte/router/browser.ts +10 -0
- package/dist/svelte/router/goto.ts +15 -86
- package/dist/svelte/router/guards.ts +112 -0
- package/dist/svelte/router/index.ts +10 -0
- package/dist/svelte/router/lazy.ts +82 -0
- package/dist/svelte/router/lazyModule.ts +74 -0
- package/dist/svelte/router/navigation.ts +412 -0
- package/dist/svelte/router/pushState.ts +7 -4
- package/dist/svelte/router/scroll.ts +286 -0
- package/dist/svelte/server.js +747 -252
- package/dist/svelte/server.js.map +30 -20
- package/dist/types/angular.d.ts +2 -0
- package/dist/types/build.d.ts +37 -0
- package/dist/types/conventions.d.ts +3 -0
- package/dist/types/fileRoutes.d.ts +72 -0
- package/dist/types/fonts.d.ts +86 -0
- package/dist/types/formAction.d.ts +54 -0
- package/dist/types/globals.d.ts +10 -0
- package/dist/types/i18n.d.ts +185 -0
- package/dist/types/index.d.ts +4 -0
- package/dist/types/metadata.d.ts +11 -0
- package/dist/types/navigation.d.ts +37 -0
- package/dist/types/prefetch.d.ts +10 -0
- package/dist/types/sitemap.d.ts +4 -0
- package/dist/types/svelteRouter.d.ts +89 -2
- package/dist/types/svelteRouter.ts +112 -2
- package/dist/types/vue.d.ts +46 -1
- package/dist/utils/iconVersion.ts +34 -0
- package/dist/vue/browser.js +107 -11
- package/dist/vue/browser.js.map +7 -4
- package/dist/vue/components/index.js +5 -2
- package/dist/vue/components/index.js.map +5 -4
- package/dist/vue/index.js +712 -158
- package/dist/vue/index.js.map +32 -23
- package/dist/vue/server.js +310 -79
- package/dist/vue/server.js.map +20 -15
- package/package.json +9 -1
- package/dist/cli/prerender-mfnwsvyt.js +0 -7
- package/dist/src/plugins/pageRouter.d.ts +0 -1
- /package/dist/cli/{index-j7m8pq48.js → index-rervww4p.js} +0 -0
|
@@ -0,0 +1,764 @@
|
|
|
1
|
+
import {
|
|
2
|
+
readPageNonce,
|
|
3
|
+
consumePrefetch2
|
|
4
|
+
} from "./chunks/index-6b66nzyf.js";
|
|
5
|
+
|
|
6
|
+
// src/client/navigation.ts
|
|
7
|
+
var RUNTIME_KEY = Symbol.for("absolutejs.navigation");
|
|
8
|
+
var STATE_KEY = "__absoluteNavigation";
|
|
9
|
+
var OPT_OUT_SELECTOR = '[data-absolute-navigation="off"]';
|
|
10
|
+
var MODULE_RUN_PARAM = "absolute-nav";
|
|
11
|
+
var ANNOUNCER_ID = "absolute-navigation-announcer";
|
|
12
|
+
var ISLAND_STATE_GLOBAL = "__ABS_ISLAND_STATE__";
|
|
13
|
+
var DISPOSE_GLOBAL = "__ABSOLUTE_PAGE_DISPOSE__";
|
|
14
|
+
var READY_GLOBAL = "__ABSOLUTE_PAGE_READY__";
|
|
15
|
+
var STYLESHEET_TIMEOUT_MS = 5000;
|
|
16
|
+
var PAGE_READY_TIMEOUT_MS = 1e4;
|
|
17
|
+
var PAGE_READY_POLL_MS = 16;
|
|
18
|
+
var SCRIPT_PLACEHOLDER = "absolute-navigation-script";
|
|
19
|
+
var ID_RADIX = 36;
|
|
20
|
+
var PAGE_GLOBALS = [
|
|
21
|
+
"__INITIAL_PROPS__",
|
|
22
|
+
"__SSR_DIRTY__",
|
|
23
|
+
"__ABS_SLOT_HYDRATION_PENDING__",
|
|
24
|
+
"__ABS_SVELTE_LAZY_ROUTES__",
|
|
25
|
+
"__ABS_SVELTE_ISLAND_HTML__",
|
|
26
|
+
"__ABS_SERVER_ISLAND_HTML__",
|
|
27
|
+
"__ABSOLUTE_SERVER_DATA__",
|
|
28
|
+
"__ABS_ANGULAR_REQUEST_CONTEXT__",
|
|
29
|
+
DISPOSE_GLOBAL,
|
|
30
|
+
READY_GLOBAL
|
|
31
|
+
];
|
|
32
|
+
var JAVASCRIPT_TYPES = new Set([
|
|
33
|
+
"",
|
|
34
|
+
"application/ecmascript",
|
|
35
|
+
"application/javascript",
|
|
36
|
+
"module",
|
|
37
|
+
"speculationrules",
|
|
38
|
+
"text/ecmascript",
|
|
39
|
+
"text/javascript"
|
|
40
|
+
]);
|
|
41
|
+
var runtime;
|
|
42
|
+
var isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
43
|
+
var createId = () => typeof crypto !== "undefined" && typeof crypto.randomUUID === "function" ? crypto.randomUUID() : `${Date.now().toString(ID_RADIX)}-${Math.random().toString(ID_RADIX).slice(2)}`;
|
|
44
|
+
var delay = (millis) => new Promise((resolve) => {
|
|
45
|
+
setTimeout(resolve, millis);
|
|
46
|
+
});
|
|
47
|
+
var readPublicRuntime = () => {
|
|
48
|
+
const value = Reflect.get(globalThis, RUNTIME_KEY);
|
|
49
|
+
if (!isRecord(value))
|
|
50
|
+
return;
|
|
51
|
+
const { disable, navigate } = value;
|
|
52
|
+
if (typeof disable !== "function" || typeof navigate !== "function") {
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
return value;
|
|
56
|
+
};
|
|
57
|
+
var prefersReducedMotion = () => typeof window.matchMedia === "function" && window.matchMedia("(prefers-reduced-motion: reduce)").matches;
|
|
58
|
+
var isNavigationLike = (value) => typeof value === "object" && value !== null && ("currentEntry" in value) && typeof Reflect.get(value, "addEventListener") === "function";
|
|
59
|
+
var readNavigationApi = () => {
|
|
60
|
+
const value = Reflect.get(window, "navigation");
|
|
61
|
+
return isNavigationLike(value) ? value : undefined;
|
|
62
|
+
};
|
|
63
|
+
var readEntryKey = (api) => {
|
|
64
|
+
const entry = api.currentEntry;
|
|
65
|
+
if (typeof entry !== "object" || entry === null)
|
|
66
|
+
return;
|
|
67
|
+
const key = Reflect.get(entry, "key");
|
|
68
|
+
return typeof key === "string" ? key : undefined;
|
|
69
|
+
};
|
|
70
|
+
var readStamp = (state) => {
|
|
71
|
+
if (!isRecord(state))
|
|
72
|
+
return;
|
|
73
|
+
const stamp = state[STATE_KEY];
|
|
74
|
+
if (!isRecord(stamp))
|
|
75
|
+
return;
|
|
76
|
+
const { doc, key } = stamp;
|
|
77
|
+
if (typeof doc !== "string" || typeof key !== "string")
|
|
78
|
+
return;
|
|
79
|
+
return { doc, key };
|
|
80
|
+
};
|
|
81
|
+
var isStampable = (state) => state === null || isRecord(state);
|
|
82
|
+
var stampState = (state, doc, key) => {
|
|
83
|
+
if (!isStampable(state))
|
|
84
|
+
return state;
|
|
85
|
+
return { ...isRecord(state) ? state : {}, [STATE_KEY]: { doc, key } };
|
|
86
|
+
};
|
|
87
|
+
var currentEntryKey = (nav) => nav.navigationApi ? readEntryKey(nav.navigationApi) : readStamp(window.history.state)?.key;
|
|
88
|
+
var currentEntryOwner = (nav) => {
|
|
89
|
+
if (!nav.navigationApi)
|
|
90
|
+
return readStamp(window.history.state)?.doc;
|
|
91
|
+
const key = readEntryKey(nav.navigationApi);
|
|
92
|
+
return key === undefined ? undefined : nav.entryOwners.get(key);
|
|
93
|
+
};
|
|
94
|
+
var isForeignEntry = (nav) => {
|
|
95
|
+
const owner = currentEntryOwner(nav);
|
|
96
|
+
if (owner === nav.documentId)
|
|
97
|
+
return false;
|
|
98
|
+
return owner !== undefined || nav.navigationApi !== undefined;
|
|
99
|
+
};
|
|
100
|
+
var recordCurrentEntry = (nav) => {
|
|
101
|
+
if (!nav.navigationApi)
|
|
102
|
+
return;
|
|
103
|
+
const key = readEntryKey(nav.navigationApi);
|
|
104
|
+
if (key !== undefined)
|
|
105
|
+
nav.entryOwners.set(key, nav.documentId);
|
|
106
|
+
};
|
|
107
|
+
var trackEntries = (nav, api) => {
|
|
108
|
+
const onEntryChange = (event) => {
|
|
109
|
+
if (Reflect.get(event, "navigationType") === "traverse")
|
|
110
|
+
return;
|
|
111
|
+
recordCurrentEntry(nav);
|
|
112
|
+
};
|
|
113
|
+
api.addEventListener("currententrychange", onEntryChange);
|
|
114
|
+
nav.teardown.push(() => api.removeEventListener("currententrychange", onEntryChange));
|
|
115
|
+
recordCurrentEntry(nav);
|
|
116
|
+
};
|
|
117
|
+
var patchHistory = (nav) => {
|
|
118
|
+
const { history } = window;
|
|
119
|
+
const originalPush = history.pushState;
|
|
120
|
+
const originalReplace = history.replaceState;
|
|
121
|
+
history.pushState = (state, unused, url) => Reflect.apply(originalPush, history, [
|
|
122
|
+
stampState(state, nav.documentId, createId()),
|
|
123
|
+
unused,
|
|
124
|
+
url
|
|
125
|
+
]);
|
|
126
|
+
history.replaceState = (state, unused, url) => Reflect.apply(originalReplace, history, [
|
|
127
|
+
stampState(state, nav.documentId, readStamp(history.state)?.key ?? createId()),
|
|
128
|
+
unused,
|
|
129
|
+
url
|
|
130
|
+
]);
|
|
131
|
+
history.replaceState(history.state, "");
|
|
132
|
+
nav.restoreHistory = () => {
|
|
133
|
+
history.pushState = originalPush;
|
|
134
|
+
history.replaceState = originalReplace;
|
|
135
|
+
};
|
|
136
|
+
};
|
|
137
|
+
var recordScroll = (nav) => {
|
|
138
|
+
if (nav.navigating)
|
|
139
|
+
return;
|
|
140
|
+
const key = currentEntryKey(nav);
|
|
141
|
+
if (key === undefined)
|
|
142
|
+
return;
|
|
143
|
+
nav.scroll.set(key, { left: window.scrollX, top: window.scrollY });
|
|
144
|
+
};
|
|
145
|
+
var trackScroll = (nav) => {
|
|
146
|
+
const onScroll = () => {
|
|
147
|
+
if (nav.scrollFrame !== 0)
|
|
148
|
+
return;
|
|
149
|
+
nav.scrollFrame = window.requestAnimationFrame(() => {
|
|
150
|
+
nav.scrollFrame = 0;
|
|
151
|
+
recordScroll(nav);
|
|
152
|
+
});
|
|
153
|
+
};
|
|
154
|
+
window.addEventListener("scroll", onScroll, { passive: true });
|
|
155
|
+
nav.teardown.push(() => {
|
|
156
|
+
window.removeEventListener("scroll", onScroll);
|
|
157
|
+
if (nav.scrollFrame !== 0)
|
|
158
|
+
window.cancelAnimationFrame(nav.scrollFrame);
|
|
159
|
+
});
|
|
160
|
+
};
|
|
161
|
+
var scrollToHash = (hash) => {
|
|
162
|
+
if (hash === "" || hash === "#")
|
|
163
|
+
return false;
|
|
164
|
+
const id = decodeURIComponent(hash.slice(1));
|
|
165
|
+
const target = document.getElementById(id) ?? document.getElementsByName(id)[0];
|
|
166
|
+
if (!target)
|
|
167
|
+
return false;
|
|
168
|
+
target.scrollIntoView();
|
|
169
|
+
return true;
|
|
170
|
+
};
|
|
171
|
+
var applyScroll = (request, url) => {
|
|
172
|
+
if (request.scroll) {
|
|
173
|
+
window.scrollTo(request.scroll.left, request.scroll.top);
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
if (scrollToHash(url.hash))
|
|
177
|
+
return;
|
|
178
|
+
window.scrollTo(0, 0);
|
|
179
|
+
};
|
|
180
|
+
var reapplyScroll = (request, url) => {
|
|
181
|
+
if (window.scrollY !== 0 || window.scrollX !== 0)
|
|
182
|
+
return;
|
|
183
|
+
if (request.scroll && request.scroll.top + request.scroll.left > 0) {
|
|
184
|
+
window.scrollTo(request.scroll.left, request.scroll.top);
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
if (!request.scroll)
|
|
188
|
+
scrollToHash(url.hash);
|
|
189
|
+
};
|
|
190
|
+
var RELATIVE_SPECIFIER = /^(?:\/|\.\.?\/|https?:)/;
|
|
191
|
+
var IMPORT_CALL_RE = /\bimport\(\s*(["'])([^"'\n]+)\1\s*\)/g;
|
|
192
|
+
var IMPORT_FROM_RE = /\b(from|import)\s*(["'])([^"'\n]+)\2/g;
|
|
193
|
+
var resolveSameOrigin = (specifier) => {
|
|
194
|
+
if (!RELATIVE_SPECIFIER.test(specifier))
|
|
195
|
+
return;
|
|
196
|
+
try {
|
|
197
|
+
const url = new URL(specifier, window.location.href);
|
|
198
|
+
return url.origin === window.location.origin ? url : undefined;
|
|
199
|
+
} catch {
|
|
200
|
+
return;
|
|
201
|
+
}
|
|
202
|
+
};
|
|
203
|
+
var moduleUrlFor = (nav, specifier) => {
|
|
204
|
+
const url = resolveSameOrigin(specifier);
|
|
205
|
+
if (!url)
|
|
206
|
+
return specifier;
|
|
207
|
+
if (!nav.evaluatedModules.has(url.href)) {
|
|
208
|
+
nav.evaluatedModules.add(url.href);
|
|
209
|
+
return specifier;
|
|
210
|
+
}
|
|
211
|
+
nav.moduleRun += 1;
|
|
212
|
+
url.searchParams.set(MODULE_RUN_PARAM, String(nav.moduleRun));
|
|
213
|
+
return url.href;
|
|
214
|
+
};
|
|
215
|
+
var rewriteModuleSpecifiers = (nav, source) => source.replace(IMPORT_CALL_RE, (_match, _quote, specifier) => `import(${JSON.stringify(moduleUrlFor(nav, specifier))})`).replace(IMPORT_FROM_RE, (match, keyword, _quote, specifier) => resolveSameOrigin(specifier) ? `${keyword} ${JSON.stringify(moduleUrlFor(nav, specifier))}` : match);
|
|
216
|
+
var rememberSpecifier = (nav, specifier) => {
|
|
217
|
+
const url = resolveSameOrigin(specifier);
|
|
218
|
+
if (url)
|
|
219
|
+
nav.evaluatedModules.add(url.href);
|
|
220
|
+
};
|
|
221
|
+
var rememberImportCalls = (nav, text) => {
|
|
222
|
+
for (const match of text.matchAll(IMPORT_CALL_RE)) {
|
|
223
|
+
rememberSpecifier(nav, match[2] ?? "");
|
|
224
|
+
}
|
|
225
|
+
};
|
|
226
|
+
var rememberDocumentModules = (nav) => {
|
|
227
|
+
for (const script of Array.from(document.scripts)) {
|
|
228
|
+
const src = script.getAttribute("src");
|
|
229
|
+
if (src && script.type === "module")
|
|
230
|
+
rememberSpecifier(nav, src);
|
|
231
|
+
rememberImportCalls(nav, script.textContent ?? "");
|
|
232
|
+
}
|
|
233
|
+
};
|
|
234
|
+
var TRUST_ALL = { kind: "all" };
|
|
235
|
+
var TRUST_NONE = { kind: "none" };
|
|
236
|
+
var readTrust = (response) => {
|
|
237
|
+
const policy = response.headers.get("content-security-policy");
|
|
238
|
+
if (!policy)
|
|
239
|
+
return TRUST_ALL;
|
|
240
|
+
const nonce = /'nonce-([^']+)'/.exec(policy)?.[1];
|
|
241
|
+
if (!nonce)
|
|
242
|
+
return TRUST_NONE;
|
|
243
|
+
const trust = { kind: "nonce", nonce };
|
|
244
|
+
return trust;
|
|
245
|
+
};
|
|
246
|
+
var isTrusted = (element, trust) => {
|
|
247
|
+
if (trust.kind === "all")
|
|
248
|
+
return true;
|
|
249
|
+
if (trust.kind === "none")
|
|
250
|
+
return false;
|
|
251
|
+
return element.getAttribute("nonce") === trust.nonce;
|
|
252
|
+
};
|
|
253
|
+
var takePrefetched = async (url) => {
|
|
254
|
+
const pending = consumePrefetch2(url.href) ?? consumePrefetch2(`${url.pathname}${url.search}`);
|
|
255
|
+
if (!pending)
|
|
256
|
+
return;
|
|
257
|
+
const response = await pending;
|
|
258
|
+
return response.ok ? response : undefined;
|
|
259
|
+
};
|
|
260
|
+
var fetchDocument = async (url, signal) => await takePrefetched(url) ?? fetch(url.href, {
|
|
261
|
+
credentials: "same-origin",
|
|
262
|
+
headers: { Accept: "text/html" },
|
|
263
|
+
signal
|
|
264
|
+
});
|
|
265
|
+
var escapeRegExp = (value) => value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
266
|
+
var adoptResponseNonce = (nav, html, trust) => {
|
|
267
|
+
if (trust.kind !== "nonce" || !nav.nonce)
|
|
268
|
+
return { html, trust };
|
|
269
|
+
const pattern = new RegExp(`\\bnonce=(["'])${escapeRegExp(trust.nonce)}\\1`, "g");
|
|
270
|
+
const adopted = { kind: "nonce", nonce: nav.nonce };
|
|
271
|
+
return {
|
|
272
|
+
html: html.replace(pattern, `nonce="${nav.nonce}"`),
|
|
273
|
+
trust: adopted
|
|
274
|
+
};
|
|
275
|
+
};
|
|
276
|
+
var loadDocument = async (nav, url, signal) => {
|
|
277
|
+
const response = await fetchDocument(url, signal);
|
|
278
|
+
const contentType = response.headers.get("content-type") ?? "";
|
|
279
|
+
const finalUrl = new URL(response.url || url.href);
|
|
280
|
+
finalUrl.hash = url.hash;
|
|
281
|
+
if (!response.ok || !contentType.includes("text/html") || finalUrl.origin !== window.location.origin) {
|
|
282
|
+
await response.body?.cancel().catch(() => {
|
|
283
|
+
return;
|
|
284
|
+
});
|
|
285
|
+
return;
|
|
286
|
+
}
|
|
287
|
+
const { html, trust } = adoptResponseNonce(nav, await response.text(), readTrust(response));
|
|
288
|
+
const parsed = new DOMParser().parseFromString(html, "text/html");
|
|
289
|
+
const loaded = {
|
|
290
|
+
document: parsed,
|
|
291
|
+
trust,
|
|
292
|
+
url: finalUrl
|
|
293
|
+
};
|
|
294
|
+
return loaded;
|
|
295
|
+
};
|
|
296
|
+
var isExecutableScript = (script) => JAVASCRIPT_TYPES.has((script.getAttribute("type") ?? "").trim().toLowerCase());
|
|
297
|
+
var extractScripts = (loaded) => Array.from(loaded.document.querySelectorAll("script")).filter(isExecutableScript).map((source) => {
|
|
298
|
+
const placeholder = loaded.document.createComment(SCRIPT_PLACEHOLDER);
|
|
299
|
+
const trusted = isTrusted(source, loaded.trust);
|
|
300
|
+
source.replaceWith(placeholder);
|
|
301
|
+
const pending = { placeholder, source, trusted };
|
|
302
|
+
return pending;
|
|
303
|
+
});
|
|
304
|
+
var applyNonce = (nav, element, trusted) => {
|
|
305
|
+
element.removeAttribute("nonce");
|
|
306
|
+
if (trusted && nav.nonce)
|
|
307
|
+
element.setAttribute("nonce", nav.nonce);
|
|
308
|
+
};
|
|
309
|
+
var waitForStylesheet = (link) => new Promise((resolve) => {
|
|
310
|
+
const timer = setTimeout(resolve, STYLESHEET_TIMEOUT_MS);
|
|
311
|
+
const done = () => {
|
|
312
|
+
clearTimeout(timer);
|
|
313
|
+
resolve();
|
|
314
|
+
};
|
|
315
|
+
link.addEventListener("load", done, { once: true });
|
|
316
|
+
link.addEventListener("error", done, { once: true });
|
|
317
|
+
});
|
|
318
|
+
var preloadStylesheets = async (loaded) => {
|
|
319
|
+
const links = Array.from(loaded.document.head.querySelectorAll('link[rel~="stylesheet"]'));
|
|
320
|
+
const media = new Map;
|
|
321
|
+
for (const link of links) {
|
|
322
|
+
media.set(link, link.getAttribute("media"));
|
|
323
|
+
link.setAttribute("media", "not all");
|
|
324
|
+
document.head.append(document.adoptNode(link));
|
|
325
|
+
}
|
|
326
|
+
await Promise.all(links.map(waitForStylesheet));
|
|
327
|
+
return media;
|
|
328
|
+
};
|
|
329
|
+
var restoreMedia = (media) => {
|
|
330
|
+
for (const [link, value] of media) {
|
|
331
|
+
if (value === null)
|
|
332
|
+
link.removeAttribute("media");
|
|
333
|
+
else
|
|
334
|
+
link.setAttribute("media", value);
|
|
335
|
+
}
|
|
336
|
+
};
|
|
337
|
+
var elementKey = (element) => {
|
|
338
|
+
const attributes = Array.from(element.attributes).filter((attribute) => attribute.name !== "nonce").map((attribute) => `${attribute.name}=${attribute.value}`).sort().join("\x00");
|
|
339
|
+
return `${element.tagName}\x01${attributes}\x01${element.textContent ?? ""}`;
|
|
340
|
+
};
|
|
341
|
+
var takeMatch = (available, node) => available.get(elementKey(node))?.shift();
|
|
342
|
+
var syncAttributes = (target, source) => {
|
|
343
|
+
for (const attribute of Array.from(target.attributes)) {
|
|
344
|
+
if (!source.hasAttribute(attribute.name))
|
|
345
|
+
target.removeAttribute(attribute.name);
|
|
346
|
+
}
|
|
347
|
+
for (const attribute of Array.from(source.attributes)) {
|
|
348
|
+
target.setAttribute(attribute.name, attribute.value);
|
|
349
|
+
}
|
|
350
|
+
};
|
|
351
|
+
var indexHead = (preloaded) => {
|
|
352
|
+
const available = new Map;
|
|
353
|
+
for (const child of Array.from(document.head.children)) {
|
|
354
|
+
if (preloaded.has(child) || child.tagName === "SCRIPT")
|
|
355
|
+
continue;
|
|
356
|
+
const key = elementKey(child);
|
|
357
|
+
available.set(key, [...available.get(key) ?? [], child]);
|
|
358
|
+
}
|
|
359
|
+
return available;
|
|
360
|
+
};
|
|
361
|
+
var resolveHeadNode = (nav, node, context) => {
|
|
362
|
+
if (!(node instanceof Element) || context.preloaded.has(node))
|
|
363
|
+
return node;
|
|
364
|
+
const existing = takeMatch(context.available, node);
|
|
365
|
+
if (existing)
|
|
366
|
+
return existing;
|
|
367
|
+
if (node.tagName === "STYLE") {
|
|
368
|
+
applyNonce(nav, node, isTrusted(node, context.trust));
|
|
369
|
+
}
|
|
370
|
+
return document.adoptNode(node);
|
|
371
|
+
};
|
|
372
|
+
var swapHead = (nav, loaded, headNodes, preloaded) => {
|
|
373
|
+
const context = {
|
|
374
|
+
available: indexHead(preloaded),
|
|
375
|
+
preloaded,
|
|
376
|
+
trust: loaded.trust
|
|
377
|
+
};
|
|
378
|
+
const nextNodes = headNodes.map((node) => resolveHeadNode(nav, node, context));
|
|
379
|
+
syncAttributes(document.head, loaded.document.head);
|
|
380
|
+
document.head.replaceChildren(...nextNodes);
|
|
381
|
+
};
|
|
382
|
+
var swapBody = (nav, loaded) => {
|
|
383
|
+
for (const style of Array.from(loaded.document.body.querySelectorAll("style"))) {
|
|
384
|
+
applyNonce(nav, style, isTrusted(style, loaded.trust));
|
|
385
|
+
}
|
|
386
|
+
const nextBody = document.adoptNode(loaded.document.body);
|
|
387
|
+
document.body.replaceWith(nextBody);
|
|
388
|
+
};
|
|
389
|
+
var disposeCurrentPage = async () => {
|
|
390
|
+
const dispose = Reflect.get(window, DISPOSE_GLOBAL);
|
|
391
|
+
Reflect.set(window, DISPOSE_GLOBAL, undefined);
|
|
392
|
+
Reflect.set(window, READY_GLOBAL, undefined);
|
|
393
|
+
if (typeof dispose === "function")
|
|
394
|
+
await Reflect.apply(dispose, window, []);
|
|
395
|
+
};
|
|
396
|
+
var canTearDown = () => typeof Reflect.get(window, DISPOSE_GLOBAL) === "function";
|
|
397
|
+
var islandStateOf = (value) => isRecord(value) ? value : undefined;
|
|
398
|
+
var keepIslandState = (live) => {
|
|
399
|
+
const current = islandStateOf(Reflect.get(globalThis, ISLAND_STATE_GLOBAL));
|
|
400
|
+
if (!live || current === live)
|
|
401
|
+
return live;
|
|
402
|
+
const merged = { ...current ?? {}, ...live };
|
|
403
|
+
Reflect.set(globalThis, ISLAND_STATE_GLOBAL, merged);
|
|
404
|
+
return merged;
|
|
405
|
+
};
|
|
406
|
+
var loadEvent = (script) => new Promise((resolve) => {
|
|
407
|
+
script.addEventListener("load", () => resolve(), { once: true });
|
|
408
|
+
script.addEventListener("error", () => resolve(), { once: true });
|
|
409
|
+
});
|
|
410
|
+
var createScript = (nav, pending) => {
|
|
411
|
+
const { source } = pending;
|
|
412
|
+
const script = document.createElement("script");
|
|
413
|
+
Array.from(source.attributes).filter(({ name }) => name !== "nonce" && name !== "src").forEach(({ name, value }) => script.setAttribute(name, value));
|
|
414
|
+
applyNonce(nav, script, pending.trusted);
|
|
415
|
+
const src = source.getAttribute("src");
|
|
416
|
+
const isModule = source.type === "module";
|
|
417
|
+
if (src)
|
|
418
|
+
script.src = isModule ? moduleUrlFor(nav, src) : src;
|
|
419
|
+
if (!src)
|
|
420
|
+
script.text = rewriteModuleSpecifiers(nav, source.text);
|
|
421
|
+
if (src && !source.hasAttribute("async"))
|
|
422
|
+
script.async = false;
|
|
423
|
+
return script;
|
|
424
|
+
};
|
|
425
|
+
var runScript = async (nav, pending, islandState) => {
|
|
426
|
+
if (!pending.placeholder.isConnected)
|
|
427
|
+
return;
|
|
428
|
+
const script = createScript(nav, pending);
|
|
429
|
+
const loaded = script.src ? loadEvent(script) : Promise.resolve();
|
|
430
|
+
pending.placeholder.replaceWith(script);
|
|
431
|
+
islandState.live = keepIslandState(islandState.live);
|
|
432
|
+
await loaded;
|
|
433
|
+
islandState.live = keepIslandState(islandState.live);
|
|
434
|
+
};
|
|
435
|
+
var clearPageGlobals = () => {
|
|
436
|
+
for (const name of PAGE_GLOBALS)
|
|
437
|
+
Reflect.deleteProperty(window, name);
|
|
438
|
+
};
|
|
439
|
+
var runScripts = (nav, scripts) => {
|
|
440
|
+
const islandState = {
|
|
441
|
+
live: islandStateOf(Reflect.get(globalThis, ISLAND_STATE_GLOBAL))
|
|
442
|
+
};
|
|
443
|
+
return scripts.reduce((previous, pending) => previous.then(() => runScript(nav, pending, islandState)), Promise.resolve());
|
|
444
|
+
};
|
|
445
|
+
var pollForPage = async (deadline) => {
|
|
446
|
+
if (canTearDown() || Date.now() >= deadline)
|
|
447
|
+
return;
|
|
448
|
+
await delay(PAGE_READY_POLL_MS);
|
|
449
|
+
await pollForPage(deadline);
|
|
450
|
+
};
|
|
451
|
+
var waitForPageReady = async (hasModules) => {
|
|
452
|
+
if (hasModules)
|
|
453
|
+
await pollForPage(Date.now() + PAGE_READY_TIMEOUT_MS);
|
|
454
|
+
const ready = Reflect.get(window, READY_GLOBAL);
|
|
455
|
+
if (ready instanceof Promise)
|
|
456
|
+
await ready.catch(() => {
|
|
457
|
+
return;
|
|
458
|
+
});
|
|
459
|
+
};
|
|
460
|
+
var loadsModules = (scripts) => scripts.some(({ source }) => source.type === "module" || /\bimport\s*\(/.test(source.text));
|
|
461
|
+
var ensureAnnouncer = () => {
|
|
462
|
+
const existing = document.getElementById(ANNOUNCER_ID);
|
|
463
|
+
if (existing)
|
|
464
|
+
return existing;
|
|
465
|
+
const region = document.createElement("div");
|
|
466
|
+
region.id = ANNOUNCER_ID;
|
|
467
|
+
region.setAttribute("aria-live", "assertive");
|
|
468
|
+
region.setAttribute("aria-atomic", "true");
|
|
469
|
+
region.setAttribute("role", "status");
|
|
470
|
+
Object.assign(region.style, {
|
|
471
|
+
border: "0",
|
|
472
|
+
clip: "rect(0 0 0 0)",
|
|
473
|
+
height: "1px",
|
|
474
|
+
margin: "-1px",
|
|
475
|
+
overflow: "hidden",
|
|
476
|
+
padding: "0",
|
|
477
|
+
position: "absolute",
|
|
478
|
+
whiteSpace: "nowrap",
|
|
479
|
+
width: "1px"
|
|
480
|
+
});
|
|
481
|
+
document.body.append(region);
|
|
482
|
+
return region;
|
|
483
|
+
};
|
|
484
|
+
var announcePage = () => {
|
|
485
|
+
const heading = document.querySelector("h1")?.textContent?.trim();
|
|
486
|
+
const text = document.title || heading || window.location.pathname;
|
|
487
|
+
ensureAnnouncer().textContent = text;
|
|
488
|
+
};
|
|
489
|
+
var resetFocus = () => {
|
|
490
|
+
const autofocus = document.querySelector("[autofocus]");
|
|
491
|
+
if (autofocus) {
|
|
492
|
+
autofocus.focus();
|
|
493
|
+
return;
|
|
494
|
+
}
|
|
495
|
+
if (document.activeElement instanceof HTMLElement) {
|
|
496
|
+
document.activeElement.blur();
|
|
497
|
+
}
|
|
498
|
+
};
|
|
499
|
+
var dispatch = (name, detail, cancelable) => window.dispatchEvent(new CustomEvent(name, { cancelable, detail }));
|
|
500
|
+
var outcome = (value) => value;
|
|
501
|
+
var reload = (request, committed) => {
|
|
502
|
+
if (committed || request.type === "traverse")
|
|
503
|
+
window.location.reload();
|
|
504
|
+
else if (request.replace)
|
|
505
|
+
window.location.replace(request.url.href);
|
|
506
|
+
else
|
|
507
|
+
window.location.assign(request.url.href);
|
|
508
|
+
return outcome("reloaded");
|
|
509
|
+
};
|
|
510
|
+
var commitHistory = (nav, request, url) => {
|
|
511
|
+
nav.documentId = request.documentId ?? createId();
|
|
512
|
+
if (request.type === "traverse") {
|
|
513
|
+
recordCurrentEntry(nav);
|
|
514
|
+
return;
|
|
515
|
+
}
|
|
516
|
+
const key = currentEntryKey(nav);
|
|
517
|
+
if (key !== undefined) {
|
|
518
|
+
nav.scroll.set(key, { left: window.scrollX, top: window.scrollY });
|
|
519
|
+
}
|
|
520
|
+
const state = stampState(null, nav.documentId, createId());
|
|
521
|
+
if (request.replace)
|
|
522
|
+
window.history.replaceState(state, "", url.href);
|
|
523
|
+
else
|
|
524
|
+
window.history.pushState(state, "", url.href);
|
|
525
|
+
recordCurrentEntry(nav);
|
|
526
|
+
};
|
|
527
|
+
var shouldAnimate = (nav) => nav.options.viewTransition !== false && typeof Reflect.get(document, "startViewTransition") === "function" && !prefersReducedMotion();
|
|
528
|
+
var readPromise = (value, name) => {
|
|
529
|
+
if (typeof value !== "object" || value === null)
|
|
530
|
+
return;
|
|
531
|
+
const promise = Reflect.get(value, name);
|
|
532
|
+
return promise instanceof Promise ? promise : undefined;
|
|
533
|
+
};
|
|
534
|
+
var runSwap = async (nav, swap) => {
|
|
535
|
+
const start = Reflect.get(document, "startViewTransition");
|
|
536
|
+
if (!shouldAnimate(nav) || typeof start !== "function") {
|
|
537
|
+
await swap();
|
|
538
|
+
return;
|
|
539
|
+
}
|
|
540
|
+
const transition = Reflect.apply(start, document, [swap]);
|
|
541
|
+
readPromise(transition, "ready")?.catch(() => {
|
|
542
|
+
return;
|
|
543
|
+
});
|
|
544
|
+
readPromise(transition, "finished")?.catch(() => {
|
|
545
|
+
return;
|
|
546
|
+
});
|
|
547
|
+
await readPromise(transition, "updateCallbackDone");
|
|
548
|
+
};
|
|
549
|
+
var swapDocument = async (nav, request, loaded, isStale) => {
|
|
550
|
+
const scripts = extractScripts(loaded);
|
|
551
|
+
const headNodes = Array.from(loaded.document.head.childNodes);
|
|
552
|
+
const media = await preloadStylesheets(loaded);
|
|
553
|
+
const preloaded = new Set(media.keys());
|
|
554
|
+
if (isStale()) {
|
|
555
|
+
preloaded.forEach((link) => link.remove());
|
|
556
|
+
return false;
|
|
557
|
+
}
|
|
558
|
+
commitHistory(nav, request, loaded.url);
|
|
559
|
+
const swap = async () => {
|
|
560
|
+
await disposeCurrentPage();
|
|
561
|
+
clearPageGlobals();
|
|
562
|
+
syncAttributes(document.documentElement, loaded.document.documentElement);
|
|
563
|
+
swapHead(nav, loaded, headNodes, preloaded);
|
|
564
|
+
swapBody(nav, loaded);
|
|
565
|
+
restoreMedia(media);
|
|
566
|
+
applyScroll(request, loaded.url);
|
|
567
|
+
};
|
|
568
|
+
await runSwap(nav, swap);
|
|
569
|
+
resetFocus();
|
|
570
|
+
await runScripts(nav, scripts);
|
|
571
|
+
await waitForPageReady(loadsModules(scripts));
|
|
572
|
+
reapplyScroll(request, loaded.url);
|
|
573
|
+
announcePage();
|
|
574
|
+
return true;
|
|
575
|
+
};
|
|
576
|
+
var isCurrent = (nav, token) => nav.token === token;
|
|
577
|
+
var performNavigation = async (nav, request) => {
|
|
578
|
+
nav.token += 1;
|
|
579
|
+
const { token } = nav;
|
|
580
|
+
nav.controller?.abort();
|
|
581
|
+
const controller = new AbortController;
|
|
582
|
+
nav.controller = controller;
|
|
583
|
+
const detail = {
|
|
584
|
+
type: request.type,
|
|
585
|
+
url: request.url.href
|
|
586
|
+
};
|
|
587
|
+
const proceed = dispatch("absolute:before-navigate", detail, request.type !== "traverse");
|
|
588
|
+
if (!proceed)
|
|
589
|
+
return outcome("cancelled");
|
|
590
|
+
if (!canTearDown())
|
|
591
|
+
return reload(request, false);
|
|
592
|
+
const committedBefore = nav.documentId;
|
|
593
|
+
try {
|
|
594
|
+
const loaded = await loadDocument(nav, request.url, controller.signal);
|
|
595
|
+
if (!isCurrent(nav, token))
|
|
596
|
+
return outcome("superseded");
|
|
597
|
+
if (!loaded)
|
|
598
|
+
return reload(request, false);
|
|
599
|
+
nav.navigating = true;
|
|
600
|
+
const swapped = await swapDocument(nav, request, loaded, () => !isCurrent(nav, token));
|
|
601
|
+
if (!swapped)
|
|
602
|
+
return outcome("superseded");
|
|
603
|
+
dispatch("absolute:after-navigate", detail, false);
|
|
604
|
+
return outcome("swapped");
|
|
605
|
+
} catch (error) {
|
|
606
|
+
if (!isCurrent(nav, token))
|
|
607
|
+
return outcome("superseded");
|
|
608
|
+
console.error("[absolute] navigation failed, loading the page:", error);
|
|
609
|
+
return reload(request, nav.documentId !== committedBefore);
|
|
610
|
+
} finally {
|
|
611
|
+
if (isCurrent(nav, token))
|
|
612
|
+
nav.navigating = false;
|
|
613
|
+
}
|
|
614
|
+
};
|
|
615
|
+
var isModifiedClick = (event) => event.metaKey || event.ctrlKey || event.shiftKey || event.altKey;
|
|
616
|
+
var isSamePageFragment = (url) => url.hash !== "" && url.pathname === window.location.pathname && url.search === window.location.search;
|
|
617
|
+
var findAnchor = (event) => {
|
|
618
|
+
const { target } = event;
|
|
619
|
+
if (!(target instanceof Element))
|
|
620
|
+
return null;
|
|
621
|
+
return target.closest("a[href]");
|
|
622
|
+
};
|
|
623
|
+
var isPlainClick = (event) => !event.defaultPrevented && event.button === 0 && !isModifiedClick(event);
|
|
624
|
+
var isOptedOut = (anchor) => anchor.target !== "" && anchor.target !== "_self" || anchor.hasAttribute("download") || anchor.relList.contains("external") || anchor.closest(OPT_OUT_SELECTOR) !== null;
|
|
625
|
+
var interceptableUrl = (nav, anchor) => {
|
|
626
|
+
if (isOptedOut(anchor))
|
|
627
|
+
return;
|
|
628
|
+
const url = new URL(anchor.href, window.location.href);
|
|
629
|
+
if (url.origin !== window.location.origin)
|
|
630
|
+
return;
|
|
631
|
+
if (isSamePageFragment(url))
|
|
632
|
+
return;
|
|
633
|
+
if (nav.options.shouldIntercept?.(url) === false)
|
|
634
|
+
return;
|
|
635
|
+
return url;
|
|
636
|
+
};
|
|
637
|
+
var listenForClicks = (nav) => {
|
|
638
|
+
const onClick = (event) => {
|
|
639
|
+
if (!isPlainClick(event))
|
|
640
|
+
return;
|
|
641
|
+
const anchor = findAnchor(event);
|
|
642
|
+
const url = anchor ? interceptableUrl(nav, anchor) : undefined;
|
|
643
|
+
if (!url || !canTearDown())
|
|
644
|
+
return;
|
|
645
|
+
event.preventDefault();
|
|
646
|
+
performNavigation(nav, { replace: false, type: "link", url });
|
|
647
|
+
};
|
|
648
|
+
window.addEventListener("click", onClick);
|
|
649
|
+
nav.teardown.push(() => window.removeEventListener("click", onClick));
|
|
650
|
+
};
|
|
651
|
+
var listenForTraversals = (nav) => {
|
|
652
|
+
const onPopState = (event) => {
|
|
653
|
+
if (!isForeignEntry(nav))
|
|
654
|
+
return;
|
|
655
|
+
event.stopImmediatePropagation();
|
|
656
|
+
const owner = currentEntryOwner(nav);
|
|
657
|
+
const key = currentEntryKey(nav);
|
|
658
|
+
performNavigation(nav, {
|
|
659
|
+
documentId: owner,
|
|
660
|
+
replace: false,
|
|
661
|
+
scroll: key === undefined ? undefined : nav.scroll.get(key),
|
|
662
|
+
type: "traverse",
|
|
663
|
+
url: new URL(window.location.href)
|
|
664
|
+
});
|
|
665
|
+
};
|
|
666
|
+
window.addEventListener("popstate", onPopState, { capture: true });
|
|
667
|
+
nav.teardown.push(() => window.removeEventListener("popstate", onPopState, { capture: true }));
|
|
668
|
+
};
|
|
669
|
+
var disableNavigation = () => {
|
|
670
|
+
const installed = readPublicRuntime();
|
|
671
|
+
if (installed && typeof installed.disable === "function") {
|
|
672
|
+
Reflect.apply(installed.disable, undefined, []);
|
|
673
|
+
}
|
|
674
|
+
};
|
|
675
|
+
var teardownRuntime = (nav) => {
|
|
676
|
+
nav.controller?.abort();
|
|
677
|
+
for (const cleanup of nav.teardown.splice(0))
|
|
678
|
+
cleanup();
|
|
679
|
+
nav.restoreHistory?.();
|
|
680
|
+
Reflect.deleteProperty(globalThis, RUNTIME_KEY);
|
|
681
|
+
if (runtime === nav)
|
|
682
|
+
runtime = undefined;
|
|
683
|
+
};
|
|
684
|
+
var navigateWith = (nav) => (href, options = {}) => {
|
|
685
|
+
const url = new URL(href, window.location.href);
|
|
686
|
+
if (url.origin !== window.location.origin) {
|
|
687
|
+
window.location.assign(url.href);
|
|
688
|
+
return Promise.resolve("reloaded");
|
|
689
|
+
}
|
|
690
|
+
return performNavigation(nav, {
|
|
691
|
+
replace: options.replace === true,
|
|
692
|
+
type: "navigate",
|
|
693
|
+
url
|
|
694
|
+
});
|
|
695
|
+
};
|
|
696
|
+
var enableNavigation = (options = {}) => {
|
|
697
|
+
if (typeof window === "undefined" || readPublicRuntime())
|
|
698
|
+
return;
|
|
699
|
+
const navigationApi = readNavigationApi();
|
|
700
|
+
const nav = {
|
|
701
|
+
controller: undefined,
|
|
702
|
+
documentId: createId(),
|
|
703
|
+
entryOwners: new Map,
|
|
704
|
+
evaluatedModules: new Set,
|
|
705
|
+
moduleRun: 0,
|
|
706
|
+
navigating: false,
|
|
707
|
+
navigationApi,
|
|
708
|
+
nonce: readPageNonce(),
|
|
709
|
+
options,
|
|
710
|
+
restoreHistory: undefined,
|
|
711
|
+
scroll: new Map,
|
|
712
|
+
scrollFrame: 0,
|
|
713
|
+
teardown: [],
|
|
714
|
+
token: 0
|
|
715
|
+
};
|
|
716
|
+
runtime = nav;
|
|
717
|
+
if (navigationApi)
|
|
718
|
+
trackEntries(nav, navigationApi);
|
|
719
|
+
else
|
|
720
|
+
patchHistory(nav);
|
|
721
|
+
rememberDocumentModules(nav);
|
|
722
|
+
trackScroll(nav);
|
|
723
|
+
listenForClicks(nav);
|
|
724
|
+
listenForTraversals(nav);
|
|
725
|
+
const publicRuntime = {
|
|
726
|
+
navigate: navigateWith(nav),
|
|
727
|
+
disable: () => teardownRuntime(nav)
|
|
728
|
+
};
|
|
729
|
+
Reflect.set(globalThis, RUNTIME_KEY, publicRuntime);
|
|
730
|
+
};
|
|
731
|
+
var OUTCOMES = new Set([
|
|
732
|
+
"cancelled",
|
|
733
|
+
"reloaded",
|
|
734
|
+
"superseded",
|
|
735
|
+
"swapped"
|
|
736
|
+
]);
|
|
737
|
+
var isOutcome = (value) => OUTCOMES.has(value);
|
|
738
|
+
var isNavigationEnabled = () => typeof window !== "undefined" && readPublicRuntime() !== undefined;
|
|
739
|
+
var navigateDocument = async (href, options = {}) => {
|
|
740
|
+
const installed = readPublicRuntime();
|
|
741
|
+
const navigate = installed?.navigate;
|
|
742
|
+
if (typeof navigate === "function") {
|
|
743
|
+
const result = await Reflect.apply(navigate, undefined, [
|
|
744
|
+
href,
|
|
745
|
+
options
|
|
746
|
+
]);
|
|
747
|
+
if (isOutcome(result))
|
|
748
|
+
return result;
|
|
749
|
+
}
|
|
750
|
+
if (options.replace)
|
|
751
|
+
window.location.replace(href);
|
|
752
|
+
else
|
|
753
|
+
window.location.assign(href);
|
|
754
|
+
return outcome("reloaded");
|
|
755
|
+
};
|
|
756
|
+
export {
|
|
757
|
+
disableNavigation,
|
|
758
|
+
enableNavigation,
|
|
759
|
+
isNavigationEnabled,
|
|
760
|
+
navigateDocument
|
|
761
|
+
};
|
|
762
|
+
|
|
763
|
+
//# debugId=4ABAC329D93956C564756E2164756E21
|
|
764
|
+
//# sourceMappingURL=navigation.js.map
|