From dcaec58e364a96c53828fb1facc0901160c3b85b Mon Sep 17 00:00:00 2001
From: David Smadja <david.smadja@assemblee-nationale.fr>
Date: Thu, 17 Apr 2025 15:22:22 +0200
Subject: [PATCH] Adjust scroll position when closing pinned sticky node

---
 .../VariableReferredNodeParameter.svelte      | 37 ++++++++++++++++++-
 src/routes/+page.svelte                       |  4 +-
 2 files changed, 39 insertions(+), 2 deletions(-)

diff --git a/src/lib/components/legislation_view/parameters/VariableReferredNodeParameter.svelte b/src/lib/components/legislation_view/parameters/VariableReferredNodeParameter.svelte
index aa09e546a..b4d4cf02b 100644
--- a/src/lib/components/legislation_view/parameters/VariableReferredNodeParameter.svelte
+++ b/src/lib/components/legislation_view/parameters/VariableReferredNodeParameter.svelte
@@ -13,6 +13,7 @@
   import VariableReferredValueParameter from "$lib/components/legislation_view/parameters/VariableReferredValueParameter.svelte"
 
   import type { DisplayMode } from "$lib/displays"
+  import { onMount } from "svelte"
 
   interface Props {
     billParameter: NodeParameter
@@ -43,6 +44,8 @@
   }: Props = $props()
 
   let openChildrenParameters = $state(true)
+  let lawDiv: HTMLDivElement | undefined = $state()
+  let stickyDiv: HTMLDivElement | undefined = $state()
 
   if (isOtherParametersSection) {
     openChildrenParameters = false
@@ -96,12 +99,44 @@
       yield [bothChild, lawChild, revaluationChild, billChild]
     }
   }
+
+  onMount(() => {
+    lawDiv = document.getElementById("law-div")! as HTMLDivElement
+  })
+
+  function isStickyActive() {
+    if (stickyDiv) {
+      const lawHeader = document.getElementById("law-header")!
+      const currentLawheaderBottom = lawHeader.getBoundingClientRect().bottom
+      const stickyDivStyle = window.getComputedStyle(stickyDiv)
+      const stickyDivTop = parseInt(stickyDivStyle.top, 10)
+      const currentStikyDivTop = stickyDiv.getBoundingClientRect().top
+      return currentStikyDivTop - currentLawheaderBottom <= stickyDivTop
+    }
+    return false
+  }
+
+  function showHide() {
+    const stickyWasActive = isStickyActive()
+    openChildrenParameters = !openChildrenParameters
+    if (stickyWasActive && lawDiv !== undefined && stickyDiv !== undefined) {
+      setTimeout(() => {
+        const stickyDivStyle = window.getComputedStyle(stickyDiv!)
+        const stickyDivTop = parseInt(stickyDivStyle.top, 10)
+        const offsetToScroll =
+          stickyDiv!.offsetTop - lawDiv!.offsetTop - stickyDivTop
+
+        lawDiv!.scrollTop = offsetToScroll
+      }, 0)
+    }
+  }
 </script>
 
 <section style="isolation: isolate;">
   {#if depth !== 0}
     {@const top = (depth - 1) * 2}
     <div
+      bind:this={stickyDiv}
       data-depth={depth}
       class="sticky-element flex {depth === 1
         ? ''
@@ -110,7 +145,7 @@
     >
       <button
         aria-label={openChildrenParameters ? "fermer" : "ouvrir"}
-        onclick={() => (openChildrenParameters = !openChildrenParameters)}
+        onclick={showHide}
       >
         <iconify-icon
           class="align-[-0.2rem] text-lg"
diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte
index 741ee5dcd..cb3bc4e1e 100644
--- a/src/routes/+page.svelte
+++ b/src/routes/+page.svelte
@@ -932,7 +932,7 @@
     <div class="flex flex-1 overflow-x-hidden">
       <!-- Panneau de gauche les zones éditables par l'utilisateur (amendement)-->
       <section
-        class="flex min-w-0 flex-[1_0_100%] overflow-y-scroll bg-white shadow-lg transition-transform duration-500 ease-out-quart md:z-10 md:!h-full md:flex-[0_0_33.3%] md:translate-x-0 md:overflow-visible md:!p-0"
+        class="flex min-w-0 flex-[1_0_100%] bg-white shadow-lg transition-transform duration-500 ease-out-quart md:z-10 md:!h-full md:flex-[0_0_33.3%] md:translate-x-0 md:overflow-visible md:!p-0"
         class:-translate-x-full={!mobileLawTab}
         class:!h-[calc(100vh-96px)]={!mobileLawTab}
         class:pb-24={shared.testCasesIndex.length === 1 &&
@@ -942,6 +942,7 @@
         <div class="flex min-h-full w-full flex-col">
           <!-- Header (fixed) -->
           <header
+            id="law-header"
             class="flex w-screen items-center justify-between border-b border-black px-5 pb-2 pt-4 md:w-full md:px-5 2xl:pb-3 2xl:pt-5"
           >
             <!-- Titre -->
@@ -959,6 +960,7 @@
               class="w-screen overflow-y-scroll bg-white px-2 pb-5 md:w-full"
               out:fade={{ duration: 100 }}
               in:fade={{ delay: 150, duration: 150 }}
+              id="law-div"
             >
               <!-- Vue par défaut - choix de dispositifs -->
               {#if displayMode.parametersVariableName === undefined}
-- 
GitLab