From 63613bf194c18ce50e111585ad770fc93f9e43c7 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Mon, 6 Feb 2023 10:33:09 -0500 Subject: [PATCH] feat: snapshots (#8710) * add failing test * make it possible to read snapshot props * refactor sessionStorage stuff a bit * snapshots * working * beef up test * tidy up * fix type * run all tests * err.... * lint * account for missing layouts etc * thank you, past us, for creating accessors for export const automatically * don't restore if navigation was blocked * update scroll position at same time as snapshot * DRY * types * docs * changeset * add a comment * only capture snapshot when appropriate * Update packages/kit/src/runtime/client/client.js Co-authored-by: Simon H <5968653+dummdidumm@users.noreply.github.com> * document caveat around large snapshots * destroy alternate timelines * fix --------- Co-authored-by: Simon H <5968653+dummdidumm@users.noreply.github.com> --- .changeset/little-countries-cough.md | 5 + .../docs/30-advanced/65-snapshots.md | 33 +++++++ packages/kit/src/core/sync/write_root.js | 11 ++- .../kit/src/core/sync/write_types/index.js | 35 +++---- packages/kit/src/runtime/client/client.js | 91 +++++++++++++++---- packages/kit/src/runtime/client/constants.js | 1 + .../kit/src/runtime/client/session-storage.js | 25 +++++ .../kit/src/runtime/server/page/render.js | 2 +- .../basics/src/routes/snapshot/+layout.svelte | 5 + .../basics/src/routes/snapshot/a/+page.svelte | 11 +++ .../basics/src/routes/snapshot/b/+page.svelte | 1 + .../basics/src/routes/snapshot/c/+page.svelte | 1 + .../kit/test/apps/basics/test/client.test.js | 29 ++++++ packages/kit/types/index.d.ts | 8 ++ 14 files changed, 218 insertions(+), 40 deletions(-) create mode 100644 .changeset/little-countries-cough.md create mode 100644 documentation/docs/30-advanced/65-snapshots.md create mode 100644 packages/kit/src/runtime/client/session-storage.js create mode 100644 packages/kit/test/apps/basics/src/routes/snapshot/+layout.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/snapshot/a/+page.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/snapshot/b/+page.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/snapshot/c/+page.svelte diff --git a/.changeset/little-countries-cough.md b/.changeset/little-countries-cough.md new file mode 100644 index 000000000000..7649ca44df4e --- /dev/null +++ b/.changeset/little-countries-cough.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': minor +--- + +feat: add snapshot mechanism for preserving ephemeral DOM state diff --git a/documentation/docs/30-advanced/65-snapshots.md b/documentation/docs/30-advanced/65-snapshots.md new file mode 100644 index 000000000000..41971b98e941 --- /dev/null +++ b/documentation/docs/30-advanced/65-snapshots.md @@ -0,0 +1,33 @@ +--- +title: Snapshots +--- + +Ephemeral DOM state — like scroll positions on sidebars, the content of `` elements and so on — is discarded when you navigate from one page to another. + +For example, if the user fills out a form but clicks a link before submitting, then hits the browser's back button, the values they filled in will be lost. In cases where it's valuable to preserve that input, you can take a _snapshot_ of DOM state, which can then be restored if the user navigates back. + +To do this, export a `snapshot` object with `capture` and `restore` methods from a `+page.svelte` or `+layout.svelte`: + +```svelte +/// file: +page.svelte + + +
+