Vite traite les url() dans les blocs <style> et réécrit le chemin au build.
Déplacement de l'url en attribut style inline (non traité par Vite).
Annule la tentative de correction via generateBundle.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Vite réécrit les url() du CSS en supprimant le chemin (assetFileNames: '[name].[ext]').
Extension du plugin keepFontsInPlace pour corriger les URLs /assets/img/ dans le bundle CSS final.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- App.svelte : swipe gauche/droite → même comportement que les touches clavier (navigation entre slides)
- Play.svelte : stopImmediatePropagation sur touchend, blocage du scroll vertical (touchmove)
- Portfolio.svelte : migration du touch vertical (composable) vers horizontal — navigation entre projets, slide voisine aux bords, blocage scroll vertical, debounce 650ms anti-spam
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Ajout de tobimori/kirby-seo via Composer
- snippet('seo/head') dans header.php (remplace les meta manuels)
- snippet('seo/schemas') dans footer.php pour JSON-LD
- Onglet SEO ajouté dans site.yml et tous les blueprints de pages
- Configuration SEO dans config.php (sitemap, robots, canonicalBase TODO)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Home : matchMedia pour ne jouer que la vidéo visible (desktop/mobile)
- Expertise : play-then-pause pour forcer le décodage frame 0
- App : remplacement image de fond scrollable-page
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Ajout du mode horizontal dans GalleryAnimation (5 rangées, scrollLeft/scrollRight)
avec toggle vertical/horizontal dans le panel projet.
refs #21
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Bug : quand la vidéo forward atteint la fin (duration), timeupdate
ne fire pas toujours avec currentTime >= duration exactement.
Le handler ne se déclenche jamais, fwdTarget n'est pas nettoyé,
currentFwdTime garde l'ancienne valeur → la reprise en reverse
part du mauvais point.
Corrections :
- Écoute l'événement ended sur les deux vidéos pour garantir
le snap de currentFwdTime aux bornes (0 ou duration)
- Tolérance de 50ms dans les comparaisons timeupdate (>= target - 0.05)
pour capter la cible avant la fin naturelle de la vidéo
- Suppression du reassign de currentTime dans les handlers timeupdate
(inutile et pouvait causer un seek superflu)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
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>