diff --git a/src/App.svelte b/src/App.svelte index cb790cb..4967b2f 100644 --- a/src/App.svelte +++ b/src/App.svelte @@ -33,7 +33,26 @@ const wrapperWidth = $derived(`${slides.all.length * 100}vw`) const wrapperTransform = $derived(`translateX(-${slides.activeIndex * 100}vw)`) + let isReady = $state(false) + let isResizing = $state(false) + let resizeTimer = null + + // Active la transition seulement après le premier paint à la bonne position. + // Sans ça, un chargement sur /expertise slide depuis l'accueil. + $effect(() => { + if (slides.all.length > 0 && !isReady) { + requestAnimationFrame(() => { isReady = true }) + } + }) + onMount(() => { + const handleResize = () => { + isResizing = true + clearTimeout(resizeTimer) + resizeTimer = setTimeout(() => { isResizing = false }, 150) + } + window.addEventListener('resize', handleResize) + const handleKeydown = (e) => { if (e.key === 'ArrowRight') { const next = slides.all[slides.activeIndex + 1] @@ -44,7 +63,11 @@ } } window.addEventListener('keydown', handleKeydown) - return () => window.removeEventListener('keydown', handleKeydown) + return () => { + window.removeEventListener('resize', handleResize) + window.removeEventListener('keydown', handleKeydown) + clearTimeout(resizeTimer) + } }) @@ -54,6 +77,7 @@
{#each slides.all as slide} @@ -106,6 +130,9 @@ .slides-wrapper { display: flex; height: 100%; + } + + .slides-wrapper.is-animated { transition: transform 1000ms cubic-bezier(0.77, 0, 0.175, 1); }