@inertiajs/core 2.2.12 → 2.2.13

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.esm.js CHANGED
@@ -35,7 +35,9 @@ var config = new Config({
35
35
  recentlySuccessfulDuration: 2e3
36
36
  },
37
37
  future: {
38
- preserveEqualProps: false
38
+ preserveEqualProps: false,
39
+ useDataInertiaHeadAttribute: false,
40
+ useDialogForErrorModal: false
39
41
  },
40
42
  prefetch: {
41
43
  cacheFor: 3e4
@@ -476,7 +478,8 @@ var CurrentPage = class {
476
478
  set(page2, {
477
479
  replace = false,
478
480
  preserveScroll = false,
479
- preserveState = false
481
+ preserveState = false,
482
+ viewTransition = false
480
483
  } = {}) {
481
484
  if (Object.keys(page2.deferredProps || {}).length) {
482
485
  this.pendingDeferredProps = {
@@ -503,6 +506,9 @@ var CurrentPage = class {
503
506
  replace ? history.replaceState(page2, () => resolve(null)) : history.pushState(page2, () => resolve(null));
504
507
  }).then(() => {
505
508
  const isNewComponent = !this.isTheSame(page2);
509
+ if (!isNewComponent && Object.keys(page2.props.errors || {}).length > 0) {
510
+ viewTransition = false;
511
+ }
506
512
  this.page = page2;
507
513
  this.cleared = false;
508
514
  if (isNewComponent) {
@@ -512,7 +518,12 @@ var CurrentPage = class {
512
518
  this.fireEventsFor("firstLoad");
513
519
  }
514
520
  this.isFirstPageLoad = false;
515
- return this.swap({ component, page: page2, preserveState }).then(() => {
521
+ return this.swap({
522
+ component,
523
+ page: page2,
524
+ preserveState,
525
+ viewTransition
526
+ }).then(() => {
516
527
  if (preserveScroll) {
517
528
  window.requestAnimationFrame(() => Scroll.restoreScrollRegions(scrollRegions));
518
529
  } else {
@@ -536,7 +547,7 @@ var CurrentPage = class {
536
547
  this.page = page2;
537
548
  this.cleared = false;
538
549
  history.setCurrent(page2);
539
- return this.swap({ component, page: page2, preserveState });
550
+ return this.swap({ component, page: page2, preserveState, viewTransition: false });
540
551
  });
541
552
  }
542
553
  clear() {
@@ -562,9 +573,18 @@ var CurrentPage = class {
562
573
  swap({
563
574
  component,
564
575
  page: page2,
565
- preserveState
576
+ preserveState,
577
+ viewTransition
566
578
  }) {
567
- return this.swapComponent({ component, page: page2, preserveState });
579
+ const doSwap = () => this.swapComponent({ component, page: page2, preserveState });
580
+ if (!viewTransition || !document?.startViewTransition) {
581
+ return doSwap();
582
+ }
583
+ const viewTransitionCallback = typeof viewTransition === "boolean" ? () => null : viewTransition;
584
+ return new Promise((resolve) => {
585
+ const transitionResult = document.startViewTransition(() => doSwap().then(resolve));
586
+ viewTransitionCallback(transitionResult);
587
+ });
568
588
  }
569
589
  resolve(component) {
570
590
  return Promise.resolve(this.resolveComponent(component));
@@ -1292,7 +1312,8 @@ var PrefetchedRequests = class {
1292
1312
  "onPrefetched",
1293
1313
  "onCancelToken",
1294
1314
  "onPrefetching",
1295
- "async"
1315
+ "async",
1316
+ "viewTransition"
1296
1317
  ]
1297
1318
  );
1298
1319
  }
@@ -1449,7 +1470,7 @@ import { get as get2, isEqual as isEqual2, set as set2 } from "lodash-es";
1449
1470
  var modal_default = {
1450
1471
  modal: null,
1451
1472
  listener: null,
1452
- show(html) {
1473
+ createIframeAndPage(html) {
1453
1474
  if (typeof html === "object") {
1454
1475
  html = `All Inertia requests must receive a valid Inertia response, however a plain JSON response was received.<hr>${JSON.stringify(
1455
1476
  html
@@ -1458,6 +1479,15 @@ var modal_default = {
1458
1479
  const page2 = document.createElement("html");
1459
1480
  page2.innerHTML = html;
1460
1481
  page2.querySelectorAll("a").forEach((a) => a.setAttribute("target", "_top"));
1482
+ const iframe = document.createElement("iframe");
1483
+ iframe.style.backgroundColor = "white";
1484
+ iframe.style.borderRadius = "5px";
1485
+ iframe.style.width = "100%";
1486
+ iframe.style.height = "100%";
1487
+ return { iframe, page: page2 };
1488
+ },
1489
+ show(html) {
1490
+ const { iframe, page: page2 } = this.createIframeAndPage(html);
1461
1491
  this.modal = document.createElement("div");
1462
1492
  this.modal.style.position = "fixed";
1463
1493
  this.modal.style.width = "100vw";
@@ -1467,11 +1497,6 @@ var modal_default = {
1467
1497
  this.modal.style.backgroundColor = "rgba(0, 0, 0, .6)";
1468
1498
  this.modal.style.zIndex = 2e5;
1469
1499
  this.modal.addEventListener("click", () => this.hide());
1470
- const iframe = document.createElement("iframe");
1471
- iframe.style.backgroundColor = "white";
1472
- iframe.style.borderRadius = "5px";
1473
- iframe.style.width = "100%";
1474
- iframe.style.height = "100%";
1475
1500
  this.modal.appendChild(iframe);
1476
1501
  document.body.prepend(this.modal);
1477
1502
  document.body.style.overflow = "hidden";
@@ -1497,6 +1522,55 @@ var modal_default = {
1497
1522
  }
1498
1523
  };
1499
1524
 
1525
+ // src/dialog.ts
1526
+ var dialog_default = {
1527
+ show(html) {
1528
+ const { iframe, page: page2 } = modal_default.createIframeAndPage(html);
1529
+ iframe.style.boxSizing = "border-box";
1530
+ iframe.style.display = "block";
1531
+ const dialog = document.createElement("dialog");
1532
+ dialog.id = "inertia-error-dialog";
1533
+ Object.assign(dialog.style, {
1534
+ width: "calc(100vw - 100px)",
1535
+ height: "calc(100vh - 100px)",
1536
+ padding: "0",
1537
+ margin: "auto",
1538
+ border: "none",
1539
+ backgroundColor: "transparent"
1540
+ });
1541
+ const dialogStyleElement = document.createElement("style");
1542
+ dialogStyleElement.textContent = `
1543
+ dialog#inertia-error-dialog::backdrop {
1544
+ background-color: rgba(0, 0, 0, 0.6);
1545
+ }
1546
+
1547
+ dialog#inertia-error-dialog:focus {
1548
+ outline: none;
1549
+ }
1550
+ `;
1551
+ document.head.appendChild(dialogStyleElement);
1552
+ dialog.addEventListener("click", (event) => {
1553
+ if (event.target === dialog) {
1554
+ dialog.close();
1555
+ }
1556
+ });
1557
+ dialog.addEventListener("close", () => {
1558
+ dialogStyleElement.remove();
1559
+ dialog.remove();
1560
+ });
1561
+ dialog.appendChild(iframe);
1562
+ document.body.prepend(dialog);
1563
+ dialog.showModal();
1564
+ dialog.focus();
1565
+ if (!iframe.contentWindow) {
1566
+ throw new Error("iframe not yet ready.");
1567
+ }
1568
+ iframe.contentWindow.document.open();
1569
+ iframe.contentWindow.document.write(page2.outerHTML);
1570
+ iframe.contentWindow.document.close();
1571
+ }
1572
+ };
1573
+
1500
1574
  // src/response.ts
1501
1575
  var queue2 = new Queue();
1502
1576
  var Response = class _Response {
@@ -1560,7 +1634,7 @@ var Response = class _Response {
1560
1634
  data: this.getDataFromResponse(this.response.data)
1561
1635
  };
1562
1636
  if (fireInvalidEvent(response)) {
1563
- return modal_default.show(response.data);
1637
+ return config.get("future.useDialogForErrorModal") ? dialog_default.show(response.data) : modal_default.show(response.data);
1564
1638
  }
1565
1639
  }
1566
1640
  isInertiaResponse() {
@@ -1613,7 +1687,8 @@ var Response = class _Response {
1613
1687
  return page.set(pageResponse, {
1614
1688
  replace: this.requestParams.all().replace,
1615
1689
  preserveScroll: this.requestParams.all().preserveScroll,
1616
- preserveState: this.requestParams.all().preserveState
1690
+ preserveState: this.requestParams.all().preserveState,
1691
+ viewTransition: this.requestParams.all().viewTransition
1617
1692
  });
1618
1693
  }
1619
1694
  getDataFromResponse(response) {
@@ -2050,7 +2125,8 @@ var Router = class {
2050
2125
  ...options,
2051
2126
  async: true,
2052
2127
  showProgress: false,
2053
- prefetch: true
2128
+ prefetch: true,
2129
+ viewTransition: false
2054
2130
  });
2055
2131
  const visitUrl = visit.url.origin + visit.url.pathname + visit.url.search;
2056
2132
  const currentUrl = window.location.origin + window.location.pathname + window.location.search;
@@ -2148,7 +2224,7 @@ var Router = class {
2148
2224
  clientVisit(params, { replace = false } = {}) {
2149
2225
  const current = page.get();
2150
2226
  const props = typeof params.props === "function" ? params.props(current.props) : params.props ?? current.props;
2151
- const { onError, onFinish, onSuccess, ...pageParams } = params;
2227
+ const { viewTransition, onError, onFinish, onSuccess, ...pageParams } = params;
2152
2228
  const page2 = {
2153
2229
  ...current,
2154
2230
  ...pageParams,
@@ -2159,7 +2235,8 @@ var Router = class {
2159
2235
  page.set(page2, {
2160
2236
  replace,
2161
2237
  preserveScroll,
2162
- preserveState
2238
+ preserveState,
2239
+ viewTransition
2163
2240
  }).then(() => {
2164
2241
  const errors = page.get().props.errors || {};
2165
2242
  if (Object.keys(errors).length === 0) {
@@ -2175,7 +2252,8 @@ var Router = class {
2175
2252
  ...options,
2176
2253
  async: true,
2177
2254
  showProgress: false,
2178
- prefetch: true
2255
+ prefetch: true,
2256
+ viewTransition: false
2179
2257
  }),
2180
2258
  ...this.getVisitEvents(options)
2181
2259
  };
@@ -2207,6 +2285,7 @@ var Router = class {
2207
2285
  preserveUrl: false,
2208
2286
  prefetch: false,
2209
2287
  invalidateCacheTags: [],
2288
+ viewTransition: false,
2210
2289
  ...options,
2211
2290
  ...configuredOptions
2212
2291
  };
@@ -2393,6 +2472,9 @@ function formDataToObject(source) {
2393
2472
 
2394
2473
  // src/head.ts
2395
2474
  var Renderer = {
2475
+ preferredAttribute() {
2476
+ return config.get("future.useDataInertiaHeadAttribute") ? "data-inertia" : "inertia";
2477
+ },
2396
2478
  buildDOMElement(tag) {
2397
2479
  const template = document.createElement("template");
2398
2480
  template.innerHTML = tag;
@@ -2408,12 +2490,13 @@ var Renderer = {
2408
2490
  return script;
2409
2491
  },
2410
2492
  isInertiaManagedElement(element) {
2411
- return element.nodeType === Node.ELEMENT_NODE && element.getAttribute("inertia") !== null;
2493
+ return element.nodeType === Node.ELEMENT_NODE && element.getAttribute(this.preferredAttribute()) !== null;
2412
2494
  },
2413
2495
  findMatchingElementIndex(element, elements) {
2414
- const key = element.getAttribute("inertia");
2496
+ const attribute = this.preferredAttribute();
2497
+ const key = element.getAttribute(attribute);
2415
2498
  if (key !== null) {
2416
- return elements.findIndex((element2) => element2.getAttribute("inertia") === key);
2499
+ return elements.findIndex((element2) => element2.getAttribute(attribute) === key);
2417
2500
  }
2418
2501
  return -1;
2419
2502
  },
@@ -2464,8 +2547,9 @@ function createHeadManager(isServer2, titleCallback, onUpdate) {
2464
2547
  }
2465
2548
  function collect() {
2466
2549
  const title = titleCallback("");
2550
+ const attribute = Renderer.preferredAttribute();
2467
2551
  const defaults = {
2468
- ...title ? { title: `<title inertia="">${title}</title>` } : {}
2552
+ ...title ? { title: `<title ${attribute}="">${title}</title>` } : {}
2469
2553
  };
2470
2554
  const elements = Object.values(states).reduce((carry, elements2) => carry.concat(elements2), []).reduce((carry, element) => {
2471
2555
  if (element.indexOf("<") === -1) {
@@ -2476,7 +2560,7 @@ function createHeadManager(isServer2, titleCallback, onUpdate) {
2476
2560
  carry.title = title2 ? `${title2[1]}${titleCallback(title2[2])}${title2[3]}` : element;
2477
2561
  return carry;
2478
2562
  }
2479
- const match = element.match(/ inertia="[^"]+"/);
2563
+ const match = element.match(attribute === "inertia" ? / inertia="[^"]+"/ : / data-inertia="[^"]+"/);
2480
2564
  if (match) {
2481
2565
  carry[match[0]] = element;
2482
2566
  } else {
@@ -2495,6 +2579,7 @@ function createHeadManager(isServer2, titleCallback, onUpdate) {
2495
2579
  createProvider: function() {
2496
2580
  const id = connect();
2497
2581
  return {
2582
+ preferredAttribute: Renderer.preferredAttribute,
2498
2583
  reconnect: () => reconnect(id),
2499
2584
  update: (elements) => update(id, elements),
2500
2585
  disconnect: () => disconnect(id)