Preload unique image URLs via new Image(). Container stays at opacity:0
until all are ready, then reveals at once. Cached images show instantly
(no fade transition). Fixes broken progressive reveal in scrolling gallery.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Defer GalleryAnimation rendering until mockup image is fully loaded.
Ensures mockup has bandwidth priority over gallery images.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Images start at opacity:0 and fade in on load event. MutationObserver
catches cached images before first paint to show them instantly.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
preloadAll caused slow loading by fetching all projects' images at once
(and 404s from srcset strings used as img src). {#key currentIndex}
destroys/recreates DOM on project switch, eliminating stale images.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Only render the active slide initially. After its critical media (videos)
fires canplaythrough, progressively render remaining slides by distance.
JSON loading is now sequential by proximity instead of all-parallel.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Replace inline carousel logic with a dedicated TeamCarousel.svelte component.
Uses SwiperJS for mobile peek (1.4 slides), tablet (2) and desktop (4) layouts,
with touch swipe, pagination dots and prev/next buttons.
related to #53
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Replace complex segment-based video control with a simpler model:
- Scroll down → advance one text item (650ms lock) + play video forward
- Scroll up → go back one text item + play video in reverse
- Video plays continuously in chosen direction, decoupled from text items
- Remove useScrollNav, segmentEnds, offsetY, computeOffset, fwdTarget/revTarget
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Fix scroll listener (cleanup, local querySelector, scrollHeight calc)
- Fix media query syntax in variables.css (missing space in `and (`)
- Use transform: translateY instead of bottom for GPU-accelerated transition
- Throttle scroll handler with requestAnimationFrame
- Move Footer to App.svelte (global), remove per-view imports
refs #51
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- New Kirby template/blueprint/JSON for privacy page (confidentialite slug)
- Standalone page state in slides store + router handling for non-nav pages
- Privacy.svelte view with background image, text blocks, footer
- Centralize vertical lines in App.svelte as fixed elements with per-slide visibility
- Footer privacy link language-aware (FR/EN)
- Portfolio mockup fix: read from default language for consistent EN display
- menu.php: add privacy page to Kirby panel navigation
refs #44
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- WhitePaper : cover en absolute bottom-left, overflow hidden sur mobile
- WhitePapers : position relative sur le conteneur
- Panel : fix couleur du tick des checkboxes/radios cochés
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Retirer les lignes des views (Home, Expertise, About, Portfolio)
- Centraliser dans App.svelte en position:fixed, visibilité par slide
via transition de hauteur 0→100vh selon slides.active.template
- Positions calculées depuis la golden-grid (1/6, 1/3, 1/2, 2/3, 5/6)
- Nettoyer layout.css (garder seulement les classes pour Menu.svelte)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>