From f985ed36c553a948b11d01fb98b841776b60402b Mon Sep 17 00:00:00 2001 From: David Smadja <david.smadja@assemblee-nationale.fr> Date: Wed, 16 Apr 2025 15:51:29 +0200 Subject: [PATCH] Functional sticky layout --- .../VariableReferredNodeParameter.svelte | 43 ++++++++++++++++++- src/routes/+page.svelte | 8 ++-- 2 files changed, 45 insertions(+), 6 deletions(-) diff --git a/src/lib/components/legislation_view/parameters/VariableReferredNodeParameter.svelte b/src/lib/components/legislation_view/parameters/VariableReferredNodeParameter.svelte index b517587ad..6b909fc3f 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 @@ -96,11 +97,40 @@ yield [bothChild, lawChild, revaluationChild, billChild] } } + + onMount(() => { + const updateStickyTop = () => { + const stickyElements = document.querySelectorAll(".sticky-element") + + stickyElements.forEach((el) => { + const depth = Number((el as HTMLElement).dataset.depth) - 1 + const top = depth * 32 + ;(el as HTMLElement).style.top = `${top}px` + + // const newzIndex = Number((el as HTMLElement).style) - 1 + // ;(el as HTMLElement).style.zIndex = newzIndex.toString() + }) + } + + // Mettre à jour la valeur au chargement + updateStickyTop() + + // // Mettre à jour si la fenêtre est redimensionnée + // window.addEventListener("resize", updateStickyTop) + + // return () => { + // window.removeEventListener("resize", updateStickyTop) + // } + }) </script> -<section> +<section style="isolation: isolate;"> {#if depth !== 0} - <div class="flex w-full items-center text-gray-600"> + {@const zIndex = 10000 - depth} + <div + data-depth={depth} + class="sticky-element flex h-8 w-full items-center text-gray-600 z-[{zIndex}]" + > <button aria-label={openChildrenParameters ? "fermer" : "ouvrir"} onclick={() => (openChildrenParameters = !openChildrenParameters)} @@ -174,3 +204,12 @@ {/if} {/if} </section> + +<style> + :global(.sticky-element) { + position: sticky !important; + /*top: 0px; Cette valeur sera mise à jour en JavaScript */ + z-index: 1000; + background-color: white; /* Ou toute autre couleur de fond nécessaire */ + } +</style> diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte index 878875138..741ee5dcd 100644 --- a/src/routes/+page.svelte +++ b/src/routes/+page.svelte @@ -956,13 +956,13 @@ <!-- Content --> {#key displayMode.parametersVariableName === undefined} <div - class="w-screen overflow-y-scroll bg-white px-2 py-5 md:w-full" + 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 }} > <!-- Vue par défaut - choix de dispositifs --> {#if displayMode.parametersVariableName === undefined} - <div class="px-6 py-3"> + <div class="px-6 pb-3 pt-8"> <h2 class="highlight-rotated-before highlight-rotated-after relative z-10 inline-block max-w-xs text-2xl font-light text-black" > @@ -1067,7 +1067,7 @@ </div> <!-- Vue modification de la loi --> {:else} - <div class="mb-4 flex justify-between"> + <div class="mb-4 flex justify-between pt-5"> {#if displayMode.parametersVariableName !== undefined && parameterParentName !== undefined} {@const parentShortLabel = parameterParentName ? (shared.decompositionByName[parameterParentName] @@ -1131,7 +1131,7 @@ <!-- <div class="mb-5 flex flex-col gap-2">--> {#key displayMode.parametersVariableName} <div - class="mt-1 flex-1 overflow-y-auto bg-white" + class="mt-1 flex-1 bg-white" out:fade={{ duration: 100 }} in:fade={{ delay: 150, duration: 150 }} > -- GitLab