@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 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
- toggleLoading(true);
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
- toggleLoading(false);
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
- document.documentElement.style.setProperty(
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 emit = (type, payload) => {
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 emit("before-visit", {
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 emit("before-swap", { from, to, isBackForward, signal });
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 emit("after-swap", { from, to, isBackForward, signal });
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 emit("after-swap", { from, to, isBackForward, signal });
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
- emit("load", { from, to, isBackForward });
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
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@very-simple/ajax",
3
- "version": "1.0.0-beta.3",
3
+ "version": "1.0.0-beta.5",
4
4
  "description": "A very simple turbolinks inspired ajax library",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",