From 5ae0a552817f31fdae63b815392f7be4f51dc502 Mon Sep 17 00:00:00 2001
From: Emmanuel Raviart <emmanuel@raviart.com>
Date: Tue, 11 May 2021 23:21:12 +0200
Subject: [PATCH] Don't scroll when new URL stays in calculation page.

---
 .../calculations/CalculationPane.svelte       | 40 +++++++++--------
 src/lib/components/latchkeys/Arrow.svelte     | 21 ++++++---
 src/lib/components/latchkeys/Latchkey.svelte  |  3 +-
 src/lib/components/latchkeys/Rows.svelte      |  2 -
 .../parameters/ParameterPane.svelte           |  3 +-
 .../parameters/ParameterView.svelte           | 18 +++++---
 .../components/variables/VariablePane.svelte  |  3 +-
 .../variables/VariableReferredInputs.svelte   | 11 ++++-
 .../VariableReferredInputsPane.svelte         |  3 +-
 .../variables/VariableReferredNode.svelte     | 18 ++------
 .../VariableReferredParameter.svelte          |  3 +-
 .../VariableReferredParameterHeader.svelte    | 11 ++++-
 .../VariableReferredParameters.svelte         | 43 +++----------------
 .../VariableReferredParametersPane.svelte     |  8 +---
 .../variables/VariableReferredScale.svelte    |  3 +-
 .../components/variables/VariableView.svelte  | 11 +++--
 .../components/waterfalls/Waterfall.svelte    |  9 +++-
 src/lib/urls.ts                               | 13 ++++++
 src/routes/parameters/[parameter].svelte      |  7 ++-
 src/routes/variables/[variable]/index.svelte  |  7 ++-
 .../variables/[variable]/inputs/[date].svelte |  7 ++-
 .../[variable]/parameters/[date].svelte       | 12 +++---
 22 files changed, 137 insertions(+), 119 deletions(-)

diff --git a/src/lib/components/calculations/CalculationPane.svelte b/src/lib/components/calculations/CalculationPane.svelte
index b524dde9e..8a1022f2f 100644
--- a/src/lib/components/calculations/CalculationPane.svelte
+++ b/src/lib/components/calculations/CalculationPane.svelte
@@ -1,5 +1,5 @@
 <script lang="ts">
-  import { getContext } from "svelte"
+  import { getContext, setContext } from "svelte"
   import type { Writable } from "svelte/store"
 
   import { goto } from "$app/navigation"
@@ -14,6 +14,7 @@
   import VariableReferredParametersPane from "$lib/components/variables/VariableReferredParametersPane.svelte"
   import Waterfall from "$lib/components/waterfalls/Waterfall.svelte"
   import type { Decomposition } from "$lib/decompositions"
+  import type { SelfTargetAProps } from "$lib/urls"
 
   export let actions: string[] | undefined
   export let pane: "pane1" | "pane2" | "pane3" | "pane4"
@@ -24,10 +25,10 @@
 
   let component = undefined
   const decomposition = getContext("decomposition") as Writable<Decomposition>
+  const newSelfTargetAProps = newSelfTargetAPropsBuilder(pane)
+  setContext("newSelfTargetAProps", newSelfTargetAProps)
   let properties = undefined
 
-  $: newSelfTargetUrl = newSelfTargetUrlBuilder(pane)
-
   $: updateComponentAndProperties(actions, pane)
 
   function closeWindow() {
@@ -45,8 +46,8 @@
   }
 
   // eslint-disable-next-line @typescript-eslint/no-unused-vars
-  function newSelfTargetUrlBuilder(pane) {
-    return (urlPath: string): string => {
+  function newSelfTargetAPropsBuilder(pane) {
+    return (urlPath: string): SelfTargetAProps => {
       // Variable-related views are shown in pane3.
       if (
         urlPath === "/parameters" ||
@@ -55,12 +56,18 @@
         urlPath.startsWith("/variables/")
       ) {
         const actions = [...(query.pane3 ?? []), urlPath.replace(/^\/+/, "")]
-        return newCalculationUrl({
-          ...query,
-          pane3: actions,
-        })
+        return {
+          href: newCalculationUrl({
+            ...query,
+            pane3: actions,
+          }),
+          "sveltekit:noscroll": true,
+        }
+      }
+      return {
+        href: urlPath,
+        "sveltekit:prefetch": true,
       }
-      return urlPath
     }
   }
 
@@ -156,16 +163,15 @@
 {#if component === DecompositionTree}
   <DecompositionTree
     decomposition={$decomposition}
-    {newSelfTargetUrl}
     open={true}
     {showNulls}
     {vectorIndex}
     {...properties}
   />
 {:else if component === Latchkey}
-  <Latchkey {newSelfTargetUrl} {showNulls} {vectorIndex} {...properties} />
+  <Latchkey {showNulls} {vectorIndex} {...properties} />
 {:else if component === ParameterPane}
-  <ParameterPane {newSelfTargetUrl} {...properties} />
+  <ParameterPane {...properties} />
 {:else if component === TestCaseEdit}
   <TestCaseEdit
     on:changeAxes
@@ -176,11 +182,11 @@
     {...properties}
   />
 {:else if component === VariablePane}
-  <VariablePane {newSelfTargetUrl} {...properties} />
+  <VariablePane {...properties} />
 {:else if component === VariableReferredInputsPane}
-  <VariableReferredInputsPane {newSelfTargetUrl} {...properties} />
+  <VariableReferredInputsPane {...properties} />
 {:else if component === VariableReferredParametersPane}
-  <VariableReferredParametersPane {newSelfTargetUrl} {...properties} />
+  <VariableReferredParametersPane {...properties} />
 {:else if component === Waterfall}
-  <Waterfall {newSelfTargetUrl} {showNulls} {vectorIndex} {...properties} />
+  <Waterfall {showNulls} {vectorIndex} {...properties} />
 {/if}
diff --git a/src/lib/components/latchkeys/Arrow.svelte b/src/lib/components/latchkeys/Arrow.svelte
index cec11199a..87bb1c008 100644
--- a/src/lib/components/latchkeys/Arrow.svelte
+++ b/src/lib/components/latchkeys/Arrow.svelte
@@ -4,11 +4,11 @@
 
   import { goto } from "$app/navigation"
   import type { LatchkeyDataItem } from "$lib/decompositions"
+  import type { SelfTargetAProps } from "$lib/urls"
 
   export let height: number
   export let index: number
   export let item: LatchkeyDataItem
-  export let newSelfTargetUrl: (urlPath: string) => string
   export let vectorIndex: number
   export let x0: number
   export let x1: number
@@ -37,6 +37,9 @@
     signDisplay: "exceptZero",
     style: "currency",
   })
+  const newSelfTargetAProps = getContext("newSelfTargetAProps") as (
+    url: string,
+  ) => SelfTargetAProps
   const showColoredRects = getContext("showColoredRects") as Writable<boolean>
   const verticalLineStrokeWidth = 2
 
@@ -153,8 +156,12 @@
 
 {#if index > 0}
   <g
-    on:click={() =>
-      goto(newSelfTargetUrl(`/variables/${leaf.code}/parameters/${date}`))}
+    on:click={() => {
+      const aProps = newSelfTargetAProps(
+        `/variables/${leaf.code}/parameters/${date}`,
+      )
+      goto(aProps.href, { noscroll: aProps["sveltekit:noscroll"] })
+    }}
     transform={x0 < x1
       ? `rotate(180, ${x + width / 2}, ${y + height / 2})`
       : null}
@@ -199,8 +206,12 @@
 
 {#if index > 0}
   <g
-    on:click={() =>
-      goto(newSelfTargetUrl(`/variables/${leaf.code}/parameters/${date}`))}
+    on:click={() => {
+      const aProps = newSelfTargetAProps(
+        `/variables/${leaf.code}/parameters/${date}`,
+      )
+      goto(aProps.href, { noscroll: aProps["sveltekit:noscroll"] })
+    }}
     transform={x0 < x1
       ? `rotate(180, ${x + width / 2}, ${y + height / 2})`
       : null}
diff --git a/src/lib/components/latchkeys/Latchkey.svelte b/src/lib/components/latchkeys/Latchkey.svelte
index 4bebcc166..16e91e110 100644
--- a/src/lib/components/latchkeys/Latchkey.svelte
+++ b/src/lib/components/latchkeys/Latchkey.svelte
@@ -10,7 +10,6 @@
   import AxisY from "./AxisY.svelte"
   import Rows from "./Rows.svelte"
 
-  export let newSelfTargetUrl: (urlPath: string) => string
   export let showNulls: boolean
   export let vectorIndex: number
 
@@ -169,7 +168,7 @@
       {yDomain}
     >
       <Svg>
-        <Rows {newSelfTargetUrl} {vectorIndex} />
+        <Rows {vectorIndex} />
         <AxisX />
         <AxisY gridlines={false} />
       </Svg>
diff --git a/src/lib/components/latchkeys/Rows.svelte b/src/lib/components/latchkeys/Rows.svelte
index 9e4869a40..6ef2084bd 100644
--- a/src/lib/components/latchkeys/Rows.svelte
+++ b/src/lib/components/latchkeys/Rows.svelte
@@ -3,7 +3,6 @@
 
   import Arrow from "./Arrow.svelte"
 
-  export let newSelfTargetUrl: (urlPath: string) => string
   export let vectorIndex: number
 
   const { data, xGet, xScale, yGet, yRange, yScale } = getContext("LayerCake")
@@ -41,7 +40,6 @@
       {height}
       {index}
       {item}
-      {newSelfTargetUrl}
       {vectorIndex}
       {x0}
       {x1}
diff --git a/src/lib/components/parameters/ParameterPane.svelte b/src/lib/components/parameters/ParameterPane.svelte
index 6971d46a2..13154d465 100644
--- a/src/lib/components/parameters/ParameterPane.svelte
+++ b/src/lib/components/parameters/ParameterPane.svelte
@@ -5,7 +5,6 @@
   import { improveParameterWithAncestors } from "$lib/parameters"
 
   export let name: string
-  export let newSelfTargetUrl: (urlPath: string) => string
   // export let pane: string
 
   let parameter: AnyParameter | undefined = undefined
@@ -30,5 +29,5 @@
 </script>
 
 {#if parameter !== undefined}
-  <ParameterView editable={true} {newSelfTargetUrl} {parameter} />
+  <ParameterView editable={true} {parameter} />
 {/if}
diff --git a/src/lib/components/parameters/ParameterView.svelte b/src/lib/components/parameters/ParameterView.svelte
index 27d3c01ce..036fe7b4a 100644
--- a/src/lib/components/parameters/ParameterView.svelte
+++ b/src/lib/components/parameters/ParameterView.svelte
@@ -5,11 +5,14 @@
   import type { AnyParameter } from "$lib/parameters"
   import { ParameterClass, iterParameterAncestors } from "$lib/parameters"
   import type { Reform } from "$lib/reforms"
+  import type { SelfTargetAProps } from "$lib/urls"
 
   export let editable: boolean
-  export let newSelfTargetUrl: (urlPath: string) => string
   export let parameter: AnyParameter
 
+  const newSelfTargetAProps = getContext("newSelfTargetAProps") as (
+    url: string,
+  ) => SelfTargetAProps
   const reform = getContext("reform") as Writable<Reform>
   const simulationRequested = getContext(
     "simulationRequested",
@@ -53,9 +56,10 @@
 <h1>
   Paramètre
   {#each [...iterParameterAncestors(parameter.parent)] as ancestor}
-    <a class="link" href={newSelfTargetUrl(`/parameters/${ancestor.name}`)}>
-      {ancestor.title}
-    </a>
+    <!-- svelte-ignore a11y-missing-attribute -->
+    <a class="link" {...newSelfTargetAProps(`/parameters/${ancestor.name}`)}
+      >{ancestor.title}</a
+    >
     &gt;
   {/each}
   {parameter.title}
@@ -103,7 +107,8 @@
     <ul class="ml-4">
       {#each Object.entries(parameter.children) as [childId, child]}
         <li class="my-2">
-          <a class="link" href={newSelfTargetUrl(`/parameters/${child.name}`)}>
+          <!-- svelte-ignore a11y-missing-attribute -->
+          <a class="link" {...newSelfTargetAProps(`/parameters/${child.name}`)}>
             {child.title}
           </a>
         </li>
@@ -211,7 +216,8 @@
     <ul class="list-disc list-inside">
       {#each parameter.referring_variables as variableName}
         <li>
-          <a class="link" href={newSelfTargetUrl(`/variables/${variableName}`)}
+          <!-- svelte-ignore a11y-missing-attribute -->
+          <a class="link" {...newSelfTargetAProps(`/variables/${variableName}`)}
             >{variableName}</a
           >
         </li>
diff --git a/src/lib/components/variables/VariablePane.svelte b/src/lib/components/variables/VariablePane.svelte
index 7c8bb811d..7c9d66cdb 100644
--- a/src/lib/components/variables/VariablePane.svelte
+++ b/src/lib/components/variables/VariablePane.svelte
@@ -4,7 +4,6 @@
   import type { Variable } from "$lib/variables"
 
   export let name: string
-  export let newSelfTargetUrl: (urlPath: string) => string
   // export let pane: string
 
   let variable: Variable | undefined = undefined
@@ -28,5 +27,5 @@
 </script>
 
 {#if variable !== undefined}
-  <VariableView editable={true} {newSelfTargetUrl} {variable} />
+  <VariableView editable={true} {variable} />
 {/if}
diff --git a/src/lib/components/variables/VariableReferredInputs.svelte b/src/lib/components/variables/VariableReferredInputs.svelte
index 8a0d903d6..284e9d420 100644
--- a/src/lib/components/variables/VariableReferredInputs.svelte
+++ b/src/lib/components/variables/VariableReferredInputs.svelte
@@ -1,9 +1,15 @@
 <script lang="ts">
+  import { getContext } from "svelte"
+
+  import type { SelfTargetAProps } from "$lib/urls"
   import type { Variable } from "$lib/variables"
 
-  export let newSelfTargetUrl: (urlPath: string) => string
   export let inputs: Variable[]
   export let variable: Variable
+
+  const newSelfTargetAProps = getContext("newSelfTargetAProps") as (
+    url: string,
+  ) => SelfTargetAProps
 </script>
 
 <h1 class="bg-blue-500 text-white">
@@ -22,7 +28,8 @@
   <ul>
     {#each inputs as input}
       <li>
-        <a class="link" href={newSelfTargetUrl(`/variables/${input.name}`)}
+        <!-- svelte-ignore a11y-missing-attribute -->
+        <a class="link" {...newSelfTargetAProps(`/variables/${input.name}`)}
           >{input.name}</a
         >
       </li>
diff --git a/src/lib/components/variables/VariableReferredInputsPane.svelte b/src/lib/components/variables/VariableReferredInputsPane.svelte
index 99f12328d..a3867815e 100644
--- a/src/lib/components/variables/VariableReferredInputsPane.svelte
+++ b/src/lib/components/variables/VariableReferredInputsPane.svelte
@@ -5,7 +5,6 @@
 
   export let date: string
   export let name: string
-  export let newSelfTargetUrl: (urlPath: string) => string
   // export let pane: string
 
   let inputs: Variable[] | undefined = undefined
@@ -53,5 +52,5 @@
 </script>
 
 {#if inputs !== undefined && variable !== undefined}
-  <VariableReferredInputs {inputs} {newSelfTargetUrl} {variable} />
+  <VariableReferredInputs {inputs} {variable} />
 {/if}
diff --git a/src/lib/components/variables/VariableReferredNode.svelte b/src/lib/components/variables/VariableReferredNode.svelte
index 62ff34c21..850f1e06e 100644
--- a/src/lib/components/variables/VariableReferredNode.svelte
+++ b/src/lib/components/variables/VariableReferredNode.svelte
@@ -8,38 +8,26 @@
 
   export let date: string
   export let depth: number
-  export let newSelfTargetUrl: (urlPath: string) => string
   export let parameter: ParameterNode
 </script>
 
 <section>
-  <VariableReferredParameterHeader {depth} {newSelfTargetUrl} {parameter} />
+  <VariableReferredParameterHeader {depth} {parameter} />
 
   {#if parameter.children !== undefined}
     <ul>
       {#each Object.values(parameter.children) as child}
         <li>
           {#if child.class === ParameterClass.Node}
-            <svelte:self
-              {date}
-              depth={depth + 1}
-              {newSelfTargetUrl}
-              parameter={child}
-            />
+            <svelte:self {date} depth={depth + 1} parameter={child} />
           {:else if child.class === ParameterClass.Parameter}
             <VariableReferredParameter
               {date}
               depth={depth + 1}
-              {newSelfTargetUrl}
               parameter={child}
             />
           {:else if child.class === ParameterClass.Scale}
-            <VariableReferredScale
-              {date}
-              depth={depth + 1}
-              {newSelfTargetUrl}
-              parameter={child}
-            />
+            <VariableReferredScale {date} depth={depth + 1} parameter={child} />
           {/if}
         </li>
       {/each}
diff --git a/src/lib/components/variables/VariableReferredParameter.svelte b/src/lib/components/variables/VariableReferredParameter.svelte
index 8abe371a2..984b643c5 100644
--- a/src/lib/components/variables/VariableReferredParameter.svelte
+++ b/src/lib/components/variables/VariableReferredParameter.svelte
@@ -9,7 +9,6 @@
 
   export let date: string
   export let depth: number
-  export let newSelfTargetUrl: (urlPath: string) => string
   export let parameter: Parameter
 
   let openHistory = false
@@ -50,7 +49,7 @@
 </script>
 
 <section>
-  <VariableReferredParameterHeader {depth} {newSelfTargetUrl} {parameter} />
+  <VariableReferredParameterHeader {depth} {parameter} />
 
   <div
     class="bg-gray-100 flex items-baseline justify-between text-gray-600 text-xs"
diff --git a/src/lib/components/variables/VariableReferredParameterHeader.svelte b/src/lib/components/variables/VariableReferredParameterHeader.svelte
index d3eac3e82..b614a4248 100644
--- a/src/lib/components/variables/VariableReferredParameterHeader.svelte
+++ b/src/lib/components/variables/VariableReferredParameterHeader.svelte
@@ -1,10 +1,16 @@
 <script lang="ts">
+  import { getContext } from "svelte"
+
   import type { AnyParameter } from "$lib/parameters"
   import { iterParameterAncestors } from "$lib/parameters"
+  import type { SelfTargetAProps } from "$lib/urls"
 
   export let depth: number
-  export let newSelfTargetUrl: (urlPath: string) => string
   export let parameter: AnyParameter
+
+  const newSelfTargetAProps = getContext("newSelfTargetAProps") as (
+    url: string,
+  ) => SelfTargetAProps
 </script>
 
 <h1
@@ -16,7 +22,8 @@
 >
   {#if depth === 0}
     {#each [...iterParameterAncestors(parameter.parent)] as ancestor}
-      <a class="link" href={newSelfTargetUrl(`/parameters/${ancestor.name}`)}>
+      <!-- svelte-ignore a11y-missing-attribute -->
+      <a class="link" {...newSelfTargetAProps(`/parameters/${ancestor.name}`)}>
         {ancestor.title}
       </a>
       &gt;
diff --git a/src/lib/components/variables/VariableReferredParameters.svelte b/src/lib/components/variables/VariableReferredParameters.svelte
index b6ac58979..56c1eb993 100644
--- a/src/lib/components/variables/VariableReferredParameters.svelte
+++ b/src/lib/components/variables/VariableReferredParameters.svelte
@@ -12,7 +12,6 @@
   import VariableReferredScale from "./VariableReferredScale.svelte"
 
   export let date: string
-  export let newSelfTargetUrl: (urlPath: string) => string
   export let parameters: AnyParameter[]
   export let variable: Variable
 
@@ -137,26 +136,11 @@
         {#each Object.values(rootDirectParameterById) as parameter}
           <li>
             {#if parameter.class === ParameterClass.Node}
-              <VariableReferredNode
-                {date}
-                depth={0}
-                {newSelfTargetUrl}
-                {parameter}
-              />
+              <VariableReferredNode {date} depth={0} {parameter} />
             {:else if parameter.class === ParameterClass.Parameter}
-              <VariableReferredParameter
-                {date}
-                depth={0}
-                {newSelfTargetUrl}
-                {parameter}
-              />
+              <VariableReferredParameter {date} depth={0} {parameter} />
             {:else if parameter.class === ParameterClass.Scale}
-              <VariableReferredScale
-                {date}
-                depth={0}
-                {newSelfTargetUrl}
-                {parameter}
-              />
+              <VariableReferredScale {date} depth={0} {parameter} />
             {/if}
           </li>
         {/each}
@@ -199,26 +183,11 @@
         {#each Object.values(rootParameterById) as parameter}
           <li>
             {#if parameter.class === ParameterClass.Node}
-              <VariableReferredNode
-                {date}
-                depth={0}
-                {newSelfTargetUrl}
-                {parameter}
-              />
+              <VariableReferredNode {date} depth={0} {parameter} />
             {:else if parameter.class === ParameterClass.Parameter}
-              <VariableReferredParameter
-                {date}
-                depth={0}
-                {newSelfTargetUrl}
-                {parameter}
-              />
+              <VariableReferredParameter {date} depth={0} {parameter} />
             {:else if parameter.class === ParameterClass.Scale}
-              <VariableReferredScale
-                {date}
-                depth={0}
-                {newSelfTargetUrl}
-                {parameter}
-              />
+              <VariableReferredScale {date} depth={0} {parameter} />
             {/if}
           </li>
         {/each}
diff --git a/src/lib/components/variables/VariableReferredParametersPane.svelte b/src/lib/components/variables/VariableReferredParametersPane.svelte
index 43b76f45d..aa9f82cd4 100644
--- a/src/lib/components/variables/VariableReferredParametersPane.svelte
+++ b/src/lib/components/variables/VariableReferredParametersPane.svelte
@@ -7,7 +7,6 @@
 
   export let date: string
   export let name: string
-  export let newSelfTargetUrl: (urlPath: string) => string
   // export let pane: string
 
   let variable: Variable | undefined = undefined
@@ -56,10 +55,5 @@
 </script>
 
 {#if parameters !== undefined && variable !== undefined}
-  <VariableReferredParameters
-    {date}
-    {newSelfTargetUrl}
-    {parameters}
-    {variable}
-  />
+  <VariableReferredParameters {date} {parameters} {variable} />
 {/if}
diff --git a/src/lib/components/variables/VariableReferredScale.svelte b/src/lib/components/variables/VariableReferredScale.svelte
index 9cc55c9bf..749b77339 100644
--- a/src/lib/components/variables/VariableReferredScale.svelte
+++ b/src/lib/components/variables/VariableReferredScale.svelte
@@ -5,7 +5,6 @@
 
   export let date: string
   export let depth: number
-  export let newSelfTargetUrl: (urlPath: string) => string
   export let parameter: Scale
 
   let openHistory = false
@@ -20,7 +19,7 @@
 </script>
 
 <section>
-  <VariableReferredParameterHeader {depth} {newSelfTargetUrl} {parameter} />
+  <VariableReferredParameterHeader {depth} {parameter} />
   <div class="bg-gray-100 flex items-baseline text-gray-600 text-xs">
     <div class="flex px-1">
       {#if latestBracket === undefined}
diff --git a/src/lib/components/variables/VariableView.svelte b/src/lib/components/variables/VariableView.svelte
index 32ff02596..af3448f6c 100644
--- a/src/lib/components/variables/VariableView.svelte
+++ b/src/lib/components/variables/VariableView.svelte
@@ -4,13 +4,16 @@
 
   import { pluralByEntityKey } from "$lib/entities"
   import type { SituationComplement, Situation } from "$lib/situations"
+  import type { SelfTargetAProps } from "$lib/urls"
   import type { Variable } from "$lib/variables"
 
   export let editable: boolean
-  export let newSelfTargetUrl: (urlPath: string) => string
   export let variable: Variable
 
   const date = new Date().toISOString().split("T")[0]
+  const newSelfTargetAProps = getContext("newSelfTargetAProps") as (
+    url: string,
+  ) => SelfTargetAProps
   const simulationRequested = getContext(
     "simulationRequested",
   ) as Writable<boolean>
@@ -141,16 +144,18 @@
 
   <section>
     <div>
+      <!-- svelte-ignore a11y-missing-attribute -->
       <a
         class="link"
-        href={newSelfTargetUrl(`/variables/${variable.name}/inputs/${date}`)}
+        {...newSelfTargetAProps(`/variables/${variable.name}/inputs/${date}`)}
         >Variables d'entrée influant sur la formule, à la date du {date}</a
       >
     </div>
     <div>
+      <!-- svelte-ignore a11y-missing-attribute -->
       <a
         class="link"
-        href={newSelfTargetUrl(
+        {...newSelfTargetAProps(
           `/variables/${variable.name}/parameters/${date}`,
         )}>Paramètres influant sur la formule, à la date du {date}</a
       >
diff --git a/src/lib/components/waterfalls/Waterfall.svelte b/src/lib/components/waterfalls/Waterfall.svelte
index acddbe146..68ac9ab4a 100644
--- a/src/lib/components/waterfalls/Waterfall.svelte
+++ b/src/lib/components/waterfalls/Waterfall.svelte
@@ -7,16 +7,20 @@
   import { LayerCake, Svg } from "$lib/components/layercake"
   import type { Decomposition } from "$lib/decompositions"
   import { walkDecomposition } from "$lib/decompositions"
+  import type { SelfTargetAProps } from "$lib/urls"
+
   import AxisX from "./AxisX.svelte"
   import AxisY from "./AxisY.svelte"
   import Columns from "./Columns.svelte"
 
-  export let newSelfTargetUrl: (urlPath: string) => string
   export let showNulls: boolean
   export let vectorIndex: number
 
   let adaptYScale = false
   const decomposition = getContext("decomposition") as Writable<Decomposition>
+  const newSelfTargetAProps = getContext("newSelfTargetAProps") as (
+    url: string,
+  ) => SelfTargetAProps
 
   $: data = [...walkDecomposition($decomposition, true, true)].filter(
     ({ delta }) => showNulls || delta.some((deltaItem) => deltaItem !== 0),
@@ -67,7 +71,8 @@
         !node.open,
       )
     }
-    goto(newSelfTargetUrl(`/variables/${node.code}`))
+    const aProps = newSelfTargetAProps(`/variables/${node.code}`)
+    goto(aProps.href, { noscroll: aProps["sveltekit:noscroll"] })
   }
 
   function toggleToNode(
diff --git a/src/lib/urls.ts b/src/lib/urls.ts
index ddb9d60d1..a9e43a3c9 100644
--- a/src/lib/urls.ts
+++ b/src/lib/urls.ts
@@ -1,3 +1,16 @@
+export interface SelfTargetAProps {
+  href: string
+  "sveltekit:prefetch"?: boolean
+  "sveltekit:noscroll"?: boolean
+}
+
+export function newSelfTargetAProps(url: string): SelfTargetAProps {
+  return {
+    href: url,
+    "sveltekit:prefetch": true,
+  }
+}
+
 // export function parseQuery(
 //   queryString?: string,
 // ): { [key: string]: string | string[] } {
diff --git a/src/routes/parameters/[parameter].svelte b/src/routes/parameters/[parameter].svelte
index 31bf2ddc2..1878b303c 100644
--- a/src/routes/parameters/[parameter].svelte
+++ b/src/routes/parameters/[parameter].svelte
@@ -27,11 +27,16 @@
 </script>
 
 <script lang="ts">
+  import { setContext } from "svelte"
+
   import { session } from "$app/stores"
   import ParameterView from "$lib/components/parameters/ParameterView.svelte"
   import type { AnyParameter } from "$lib/parameters"
+  import { newSelfTargetAProps } from "$lib/urls"
 
   export let parameter: AnyParameter
+
+  setContext("newSelfTargetAProps", newSelfTargetAProps)
 </script>
 
 <svelte:head>
@@ -39,5 +44,5 @@
 </svelte:head>
 
 <main>
-  <ParameterView editable={true} newSelfTargetUrl={(url) => url} {parameter} />
+  <ParameterView editable={true} {parameter} />
 </main>
diff --git a/src/routes/variables/[variable]/index.svelte b/src/routes/variables/[variable]/index.svelte
index b991aa97b..a161cb814 100644
--- a/src/routes/variables/[variable]/index.svelte
+++ b/src/routes/variables/[variable]/index.svelte
@@ -24,11 +24,16 @@
 </script>
 
 <script lang="ts">
+  import { setContext } from "svelte"
+
   import { session } from "$app/stores"
   import VariableView from "$lib/components/variables/VariableView.svelte"
+  import { newSelfTargetAProps } from "$lib/urls"
   import type { Variable } from "$lib/variables"
 
   export let variable: Variable
+
+  setContext("newSelfTargetAProps", newSelfTargetAProps)
 </script>
 
 <svelte:head>
@@ -36,5 +41,5 @@
 </svelte:head>
 
 <main>
-  <VariableView editable={true} newSelfTargetUrl={(url) => url} {variable} />
+  <VariableView editable={true} {variable} />
 </main>
diff --git a/src/routes/variables/[variable]/inputs/[date].svelte b/src/routes/variables/[variable]/inputs/[date].svelte
index 154b5bef0..5aabc155a 100644
--- a/src/routes/variables/[variable]/inputs/[date].svelte
+++ b/src/routes/variables/[variable]/inputs/[date].svelte
@@ -59,13 +59,18 @@
 </script>
 
 <script lang="ts">
+  import { setContext } from "svelte"
+
   import { page, session } from "$app/stores"
   import VariableReferredInputs from "$lib/components/variables/VariableReferredInputs.svelte"
+  import { newSelfTargetAProps } from "$lib/urls"
   import type { Variable } from "$lib/variables"
 
   export let variable: Variable
   export let inputs: Variable[]
 
+  setContext("newSelfTargetAProps", newSelfTargetAProps)
+
   $: params = $page.params
 
   $: date = params.date
@@ -80,5 +85,5 @@
 </svelte:head>
 
 <main>
-  <VariableReferredInputs {inputs} newSelfTargetUrl={(url) => url} {variable} />
+  <VariableReferredInputs {inputs} {variable} />
 </main>
diff --git a/src/routes/variables/[variable]/parameters/[date].svelte b/src/routes/variables/[variable]/parameters/[date].svelte
index e79afe9c7..0736fc0b9 100644
--- a/src/routes/variables/[variable]/parameters/[date].svelte
+++ b/src/routes/variables/[variable]/parameters/[date].svelte
@@ -64,14 +64,19 @@
 </script>
 
 <script lang="ts">
+  import { setContext } from "svelte"
+
   import { page, session } from "$app/stores"
   import VariableReferredParameters from "$lib/components/variables/VariableReferredParameters.svelte"
   import type { AnyParameter } from "$lib/parameters"
+  import { newSelfTargetAProps } from "$lib/urls"
   import type { Variable } from "$lib/variables"
 
   export let parameters: AnyParameter[]
   export let variable: Variable
 
+  setContext("newSelfTargetAProps", newSelfTargetAProps)
+
   $: params = $page.params
 
   $: date = params.date
@@ -86,10 +91,5 @@
 </svelte:head>
 
 <main>
-  <VariableReferredParameters
-    {date}
-    newSelfTargetUrl={(url) => url}
-    {parameters}
-    {variable}
-  />
+  <VariableReferredParameters {date} {parameters} {variable} />
 </main>
-- 
GitLab