@very-simple/ajax 1.0.0-beta.3 → 1.0.0-beta.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.js +14 -19
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -74,6 +74,9 @@ start({
|
|
|
74
74
|
progressHideDelay: 500,
|
|
75
75
|
// Prefix used for the `data-ajax-*` attributes.
|
|
76
76
|
prefix: 'data-ajax-',
|
|
77
|
+
// Default selectors to swap instead of the whole `<body>`, used for visits
|
|
78
|
+
// that don't specify their own `regions` (e.g. via `data-ajax-regions`).
|
|
79
|
+
regions: [],
|
|
77
80
|
// Custom scroll handling, e.g. restoring position on back/forward visits.
|
|
78
81
|
scrollBehavior: ({ isBackForward, savedPosition }) =>
|
|
79
82
|
isBackForward ? savedPosition : { top: 0 },
|
package/dist/index.d.ts
CHANGED
|
@@ -36,6 +36,8 @@ interface Config {
|
|
|
36
36
|
progressHideDelay?: number;
|
|
37
37
|
/** Prefix used for the `data-ajax-*` attributes. */
|
|
38
38
|
prefix?: string;
|
|
39
|
+
/** Default regions used for visits that don't specify their own. */
|
|
40
|
+
regions?: string[];
|
|
39
41
|
/** Called after an element is added to the DOM by a merge. */
|
|
40
42
|
mount?: (el: Element) => void;
|
|
41
43
|
/** Called before an element is removed from the DOM by a merge. */
|
|
@@ -72,6 +74,11 @@ type EventMap = {
|
|
|
72
74
|
'before-visit': Payload;
|
|
73
75
|
'before-swap': Payload;
|
|
74
76
|
'after-swap': Payload;
|
|
77
|
+
'progress-start': Record<string, never>;
|
|
78
|
+
progress: {
|
|
79
|
+
progress: number;
|
|
80
|
+
};
|
|
81
|
+
'progress-end': Record<string, never>;
|
|
75
82
|
};
|
|
76
83
|
type DomEventMap = {
|
|
77
84
|
[K in keyof EventMap as `ajax:${K & string}`]: CustomEvent<EventMap[K]>;
|
package/dist/index.js
CHANGED
|
@@ -6,7 +6,8 @@ var config = {
|
|
|
6
6
|
viewTransitions: false,
|
|
7
7
|
loadingDelay: 500,
|
|
8
8
|
progressHideDelay: 500,
|
|
9
|
-
prefix: "data-ajax-"
|
|
9
|
+
prefix: "data-ajax-",
|
|
10
|
+
regions: []
|
|
10
11
|
};
|
|
11
12
|
|
|
12
13
|
// src/load.ts
|
|
@@ -14,6 +15,7 @@ var parser = new DOMParser();
|
|
|
14
15
|
var currentLoadController;
|
|
15
16
|
var progress = 0;
|
|
16
17
|
var trickleInterval;
|
|
18
|
+
var emit = (type, payload) => document.dispatchEvent(new CustomEvent(`ajax:${type}`, { detail: payload }));
|
|
17
19
|
var cache = /* @__PURE__ */ new Map();
|
|
18
20
|
var load = async (url, regions, options) => {
|
|
19
21
|
let progressDelayTimeout;
|
|
@@ -22,8 +24,7 @@ var load = async (url, regions, options) => {
|
|
|
22
24
|
currentLoadController = new AbortController();
|
|
23
25
|
setProgress(0);
|
|
24
26
|
progressDelayTimeout = window.setTimeout(() => {
|
|
25
|
-
|
|
26
|
-
toggleProgress(true);
|
|
27
|
+
emit("progress-start", {});
|
|
27
28
|
startTrickle();
|
|
28
29
|
}, options.loadingDelay);
|
|
29
30
|
const response = await fetch(url, {
|
|
@@ -49,8 +50,7 @@ var load = async (url, regions, options) => {
|
|
|
49
50
|
clearTimeout(progressDelayTimeout);
|
|
50
51
|
stopTrickle();
|
|
51
52
|
setProgress(1);
|
|
52
|
-
|
|
53
|
-
setTimeout(() => toggleProgress(false), options.progressHideDelay);
|
|
53
|
+
setTimeout(() => emit("progress-end", {}), options.progressHideDelay);
|
|
54
54
|
}
|
|
55
55
|
};
|
|
56
56
|
var parseHtml = (html) => parser.parseFromString(html, "text/html");
|
|
@@ -62,13 +62,8 @@ var startTrickle = () => trickleInterval = window.setInterval(trickle, 300);
|
|
|
62
62
|
var stopTrickle = () => clearInterval(trickleInterval);
|
|
63
63
|
var setProgress = (value) => {
|
|
64
64
|
progress = value;
|
|
65
|
-
|
|
66
|
-
"--ajax-progress",
|
|
67
|
-
`${Math.round(value * 1e4) / 100}%`
|
|
68
|
-
);
|
|
65
|
+
emit("progress", { progress: value });
|
|
69
66
|
};
|
|
70
|
-
var toggleProgress = (state) => document.documentElement.toggleAttribute(`${config.prefix}progress`, state);
|
|
71
|
-
var toggleLoading = (state) => document.documentElement.toggleAttribute(`${config.prefix}loading`, state);
|
|
72
67
|
|
|
73
68
|
// src/merge.ts
|
|
74
69
|
import { Idiomorph } from "idiomorph/dist/idiomorph.esm.js";
|
|
@@ -204,7 +199,7 @@ var normalizeUrl = (url) => {
|
|
|
204
199
|
return url;
|
|
205
200
|
}
|
|
206
201
|
};
|
|
207
|
-
var
|
|
202
|
+
var emit2 = (type, payload) => {
|
|
208
203
|
const waiting = [];
|
|
209
204
|
const waitUntil = (promise) => waiting.push(Promise.resolve(promise));
|
|
210
205
|
payload = { ...payload, waitUntil };
|
|
@@ -222,7 +217,7 @@ var visit = async (url, {
|
|
|
222
217
|
autoFocus = true,
|
|
223
218
|
request,
|
|
224
219
|
state,
|
|
225
|
-
regions =
|
|
220
|
+
regions = config.regions,
|
|
226
221
|
morphHeads = config.morphHeads,
|
|
227
222
|
merge: mergeStrategy = config.merge,
|
|
228
223
|
executeScripts: shouldExecuteScripts = config.executeScripts,
|
|
@@ -238,7 +233,7 @@ var visit = async (url, {
|
|
|
238
233
|
currentVisitController = new AbortController();
|
|
239
234
|
const { signal } = currentVisitController;
|
|
240
235
|
if (url === currentUrl) historyMode = "none";
|
|
241
|
-
await
|
|
236
|
+
await emit2("before-visit", {
|
|
242
237
|
from: { url: fromUrl, state: fromState, document },
|
|
243
238
|
to: { url, state },
|
|
244
239
|
signal,
|
|
@@ -265,7 +260,7 @@ var visit = async (url, {
|
|
|
265
260
|
else if (historyMode === "push") history.pushState(state, "", url);
|
|
266
261
|
const from = { url: fromUrl, state: fromState, document };
|
|
267
262
|
const to = { url, state, document: newDocument };
|
|
268
|
-
await
|
|
263
|
+
await emit2("before-swap", { from, to, isBackForward, signal });
|
|
269
264
|
if (signal.aborted) return;
|
|
270
265
|
const getMergeStrategy = (oldEl, newEl) => newEl.getAttribute(`${config.prefix}merge`) || oldEl.getAttribute(`${config.prefix}merge`) || mergeStrategy;
|
|
271
266
|
let autoFocusEl;
|
|
@@ -318,18 +313,18 @@ var visit = async (url, {
|
|
|
318
313
|
await document.startViewTransition(async () => {
|
|
319
314
|
if (morphHeads) Idiomorph2.morph(document.head, newDocument.head);
|
|
320
315
|
await mergeRegions();
|
|
321
|
-
await
|
|
316
|
+
await emit2("after-swap", { from, to, isBackForward, signal });
|
|
322
317
|
applyScrollBehavior();
|
|
323
318
|
}).ready;
|
|
324
319
|
} else {
|
|
325
320
|
if (morphHeads) Idiomorph2.morph(document.head, newDocument.head);
|
|
326
321
|
await mergeRegions();
|
|
327
|
-
await
|
|
322
|
+
await emit2("after-swap", { from, to, isBackForward, signal });
|
|
328
323
|
applyScrollBehavior();
|
|
329
324
|
}
|
|
330
325
|
if (signal.aborted) return;
|
|
331
326
|
if (autoFocus) autoFocusEl?.focus({ preventScroll: true });
|
|
332
|
-
|
|
327
|
+
emit2("load", { from, to, isBackForward });
|
|
333
328
|
};
|
|
334
329
|
|
|
335
330
|
// src/intercept.ts
|
|
@@ -379,7 +374,7 @@ var interceptHistory = () => {
|
|
|
379
374
|
visit(window.location.href, {
|
|
380
375
|
history: "none",
|
|
381
376
|
isBackForward: true,
|
|
382
|
-
regions: currentState?.regions ??
|
|
377
|
+
regions: currentState?.regions ?? config.regions,
|
|
383
378
|
state: event.state
|
|
384
379
|
});
|
|
385
380
|
});
|