Le flash venait du fait que isReverse changeait immédiatement après
le seek (synchrone), mais le navigateur n'avait pas encore décodé
le frame cible. Maintenant on attend l'événement seeked du <video>
avant de changer isReverse, garantissant que le bon frame est affiché
au moment du switch.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Problèmes corrigés :
- Flash au changement de direction : l'ancien code attendait un événement
seeked avant de switcher la visibilité, montrant un mauvais frame.
Maintenant on positionne la vidéo cible AVANT de la rendre visible.
- Reprise forward depuis mauvaise position : stopActiveVideo() + playForward()
synchronisent correctement currentFwdTime avant le switch.
- segmentEnds[0] = 0 → currentFwdTime snappé exactement à la cible dans
les handlers timeupdate (plus de dérive à 0.1).
Changements :
- switchToForward/switchToReverse : positionnent la cible puis changent isReverse
- playForward/playReverse simplifiés : plus de logique seeked conditionnelle
- navigate() simplifié : forward=down, reverse=up, extension de cible si déjà actif
- CSS : opacity 0/1 + transition au lieu de display none/block pour éviter les flashes
- timeupdate : snap exact à la cible au lieu d'approximation
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- segmentEnds : i/(itemCount-1) au lieu de (i+1)/itemCount
→ item 0 = position 0 (vidéo à l'arrêt), item final = fin de vidéo
- initPlayback : supprime fwdTarget et play() immédiats, positionne juste à 0
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- jeu.php : iframe démarre sur about:blank, URL stockée dans data-src
- Article.svelte : event delegation sur document (plus de timeout/querySelector)
→ le src de l'iframe est injecté seulement quand l'user clique (évite l'iframe noir)
→ supprime l'ancien $effect avec setTimeout au profit d'une délégation propre
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- jeu.php : supprime les espaces de l'URL (preg_replace), ajoute data-state="initial" sur l'overlay
- Article.svelte : porte le CSS complet depuis l'ancienne app React
(background opaque, play icon, hover, deactivate btn, game-active state)
- JS : ignore les clics sur overlay ended, remet data-state="initial" au deactivate
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- site/blueprints/blocks/jeu.yml : champ URL pour l'iframe
- site/snippets/blocks/jeu.php : rendu HTML statique (container + overlay + bouton désactivation)
- Article.svelte : $effect pour attacher les handlers clic sur .iframe-game-container
et onMount pour écouter postMessage GameReleaseFocus depuis impact.games
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Expertise : réordonne align-self avant font-size dans .expertise-title
- Router : ajout console.log pour debug des données de slide
- expertise.json.php : suppression newline final
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- SVG curves : height 100vh / width auto (conserve le ratio)
- Carousel : fusionne les règles de border sur .active picture img
- Mobile : carousel décalé d'une ligne (grid-area 15), taille active corrigée
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Déplace les liens read-more après l'image sur mobile (desktop-only/mobile-only)
- Corrige le champ date : article.date → article.published
- Ajuste le padding .page-container sur mobile
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Retire la section newsletter commentée et tout son CSS associé
- Remplace les h3 par des p.footer-label (sémantique plus correcte)
- Réduit le gap des colonnes footer
- Fix divider mobile (7% width, 2px height)
- Ajoute offset margin-left pour .collection .page-scrollable-footer mobile
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- App.svelte : flèches clavier bloquées sur sous-page (ArrowLeft → history.back())
- Blog/WhitePapers : reset de articleData/itemData après 1100ms (post-transition)
pour éviter le flash pendant l'animation de changement de slide
- WhitePapers : singleSlug jamais resetté (pré-affiché à l'arrivée sur la slide)
- WhitePapers : $effect sur isActive pour replaceState + openItem si itemData null
- WhitePapers/Blog : handlePopState ignore les popstate hors de la page courante
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Nouveau layout desktop : flex row avec catch-area (label + titre) et form-area (formulaire)
- Mobile : height 100vh non-scrollable, overlay formulaire déclenché au clic
- Tablet : grid 2 colonnes
- Suppression des préfixes wp- sur toutes les classes (CSS scopé Svelte)
- white-paper.json.php : intro via ->inline() pour texte brut
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Footer renommé page-scrollable-footer, positionné en dernier enfant
de .page-container dans About, Blog et Article
- Marges négatives pour aligner le footer pleine largeur (about / blog)
- Retrait du footer global fixe de App.svelte
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Footer global fixé en bas (App.svelte), masqué par le contenu des slides
- margin-bottom sur .page-scrollable pour l'effet footer reveal (about, blog, article)
- About : champ intro remplacé par heading (text) + subtitle (writer), blueprint + API + vue mis à jour
- LanguageSwitcher : div → button avec hitbox élargie
- i18n : clé our_team (fr: NOTRE ÉQUIPE / en: OUR TEAM)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Même logique que les touches fléchées : navigation entre jeux,
aux limites passage à la slide précédente/suivante via slideTo.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- App.svelte : classe active sur la slide courante
- Portfolio : flèches PNG custom, <output> pour le compteur, transition gallery mobile avec délai à l'entrée seulement
- fonts.css : @font-face Danzza Light + classe .font-face-danzza-light corrigée
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Background fixe mobile (BG GAME MOBILE.png, position bottom)
- GalleryAnimation en plein écran sur mobile (position fixed, opacité 0.8)
- Arrows + compteur 01/05 ajoutés (desktop grid-area 18/16, mobile 18/15)
- Layout mobile : mockup centré, texte par-dessus, keywords masqués, nav horizontale 75px
- Séparation desktop-only / mobile-only pour la galerie
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Le footer était auto-placé par la CSS Grid golden-grid avant l'article.
Wrap article + footer dans .article-wrapper qui porte le grid-area.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>