Commit graph

181 commits

Author SHA1 Message Date
isUnknown
133651c35d portfolio : animation horizontale — toggle panel + composant
All checks were successful
Deploy / Deploy to Production (push) Successful in 19s
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>
2026-03-21 14:37:05 +01:00
isUnknown
347ccd33eb panel : fix fonts
All checks were successful
Deploy / Deploy to Production (push) Successful in 20s
2026-03-21 14:17:39 +01:00
isUnknown
eeb4cb4e3a panel > portfolio : improve layout
All checks were successful
Deploy / Deploy to Production (push) Successful in 19s
2026-03-21 14:10:44 +01:00
isUnknown
75330bea7b panel > site : menu images
All checks were successful
Deploy / Deploy to Production (push) Successful in 20s
2026-03-21 13:58:16 +01:00
isUnknown
2cefdd8867 little style adjustments
All checks were successful
Deploy / Deploy to Production (push) Successful in 21s
2026-03-21 13:41:18 +01:00
isUnknown
6f26c94308 article style
All checks were successful
Deploy / Deploy to Production (push) Successful in 19s
2026-03-21 13:38:42 +01:00
isUnknown
1f8abcd305 closes #7
All checks were successful
Deploy / Deploy to Production (push) Successful in 19s
2026-03-21 13:24:25 +01:00
isUnknown
008fc41823 closes #19
All checks were successful
Deploy / Deploy to Production (push) Successful in 18s
2026-03-21 13:16:32 +01:00
isUnknown
4538392003 finish portfolio animation without box shadow - related #20
All checks were successful
Deploy / Deploy to Production (push) Successful in 18s
2026-03-21 12:54:33 +01:00
isUnknown
436772502b portfolio gallery animation : decrease opacity - related to #20 2026-03-21 12:42:32 +01:00
isUnknown
376db9d72f remove useless help
All checks were successful
Deploy / Deploy to Production (push) Successful in 18s
2026-03-21 12:36:38 +01:00
isUnknown
deb5f59d5e portfolio > gallery animation : invert col animations directions
All checks were successful
Deploy / Deploy to Production (push) Successful in 18s
related to #20
2026-03-21 12:36:05 +01:00
isUnknown
8829817e48 feat(portfolio): image d'arrière-plan pour la galerie animée
All checks were successful
Deploy / Deploy to Production (push) Successful in 18s
related to #20

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-21 12:34:46 +01:00
isUnknown
b455cbb82e a11y
All checks were successful
Deploy / Deploy to Production (push) Successful in 19s
2026-03-21 09:40:23 +01:00
isUnknown
7863828fb4 fix(blog): retour à la liste quand on clique sur Blog depuis un article
All checks were successful
Deploy / Deploy to Production (push) Successful in 20s
closes #10

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-21 09:39:54 +01:00
isUnknown
e2df8d04e0 feat(about): team members cliquables si champ link rempli + fix ARIA warning
All checks were successful
Deploy / Deploy to Production (push) Successful in 19s
closes #3

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-21 09:30:16 +01:00
isUnknown
3499fd0d34 fix(security): rate limiting basé sur REMOTE_ADDR uniquement
All checks were successful
Deploy / Deploy to Production (push) Successful in 21s
X-Forwarded-For est un header client spoofable, REMOTE_ADDR est l'IP TCP.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-21 09:25:27 +01:00
isUnknown
1ee0a4e640 closes #12
All checks were successful
Deploy / Deploy to Production (push) Successful in 21s
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-21 09:18:24 +01:00
isUnknown
764a36edb5 closes #13
All checks were successful
Deploy / Deploy to Production (push) Successful in 21s
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-21 09:08:50 +01:00
isUnknown
4803390a1f closes #22
All checks were successful
Deploy / Deploy to Production (push) Successful in 21s
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-21 09:03:11 +01:00
isUnknown
875e4d63f5 closes #23
All checks were successful
Deploy / Deploy to Production (push) Successful in 21s
2026-03-21 08:41:12 +01:00
isUnknown
cb1e961faf closes #18
All checks were successful
Deploy / Deploy to Production (push) Successful in 26s
2026-03-21 08:25:13 +01:00
isUnknown
5cfecd7786 fix(expertise): vidéo bloquée quand fwdTarget = duration (3+ items)
All checks were successful
Deploy / Deploy to Production (push) Successful in 22s
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>
2026-03-20 14:55:39 +01:00
isUnknown
7838342f96 fix(expertise): attend seeked avant de switcher la vidéo visible
All checks were successful
Deploy / Deploy to Production (push) Successful in 5m25s
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>
2026-03-20 14:32:27 +01:00
isUnknown
ff5b0028f1 fix(expertise): refonte logique vidéo forward/reverse sans flash
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>
2026-03-20 14:29:41 +01:00
isUnknown
dd69e54746 feat(expertise): vidéo démarre au premier scroll, pas à l'entrée du slide
- 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>
2026-03-20 14:23:53 +01:00
isUnknown
dee786e9e2 fix(article): section share centrée + suppression bordure articles recommandés 2026-03-20 14:08:37 +01:00
isUnknown
3ce0f939d8 revert(jeu): retour à l'état ddfcf4d — iframe directe + overlay CSS 2026-03-20 13:51:37 +01:00
isUnknown
421d39d773 debug(jeu): charge l'iframe directement pour diagnostiquer 2026-03-20 13:48:23 +01:00
isUnknown
b4dfc4480e fix(jeu): src injecté au clic (about:blank initial) + event delegation
- 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>
2026-03-20 12:14:57 +01:00
isUnknown
ddfcf4de70 fix(jeu): overlay fonctionnel — CSS complet + URL sanitizée + data-state
All checks were successful
Deploy / Deploy to Production (push) Successful in 22s
- 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>
2026-03-20 12:08:33 +01:00
isUnknown
2af4604c08 fix(jeu): positionnement overlay — retire float iframe, position absolute overlay 2026-03-20 12:03:18 +01:00
isUnknown
c26de10eac fix(jeu): type url → text pour accepter les query params complexes 2026-03-20 11:59:27 +01:00
isUnknown
5b9b190b35 feat(jeu): bloc Kirby iframe + logique click-to-play dans Article.svelte
- 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>
2026-03-20 11:57:21 +01:00
isUnknown
ef992708fc chore: réordonnancement CSS expertise, log debug router, newline backend
- 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>
2026-03-20 11:52:37 +01:00
isUnknown
869dacd121 fix(play): ratio SVG curves et simplification état actif carousel
- 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>
2026-03-20 11:52:28 +01:00
isUnknown
e51f3fbfce fix(portfolio): layout texte/keywords et typographie description
- Remplace flex par un affichage statique sur .portfolio-text
- h2 : ajout font-family Danzza Bold
- description : font Danzza, font-size subtitle, line-height 1.4
- keywords : grid 2 colonnes avec row-gap, margin verticale
- catchphrase : margin-bottom 1rem
- Mobile : grid-area texte décalé d'une ligne, ajustements description

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-20 11:52:18 +01:00
isUnknown
65e345585a fix(styles): typographie strong, grille layout, ajustements collection mobile
- fonts.css : strong { font-weight: 900 }
- layout.css : ajustement grid-template-rows (lignes 6-7 réduites à 2fr)
- collection.css : padding header mobile, tailles de police, gap carte,
  image aspect-ratio avec marges, line-height description

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-20 11:52:12 +01:00
isUnknown
b655a22bf6 fix(blog): lien "lire l'article" sous l'image sur mobile + champ date corrigé
- 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>
2026-03-20 11:52:06 +01:00
isUnknown
517c701ab9 feat(footer): suppression newsletter, h3 → p.footer-label, corrections CSS mobile
- 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>
2026-03-20 11:08:14 +01:00
isUnknown
1625ee1c44 expertise : fix title custom marks implementation
All checks were successful
Deploy / Deploy to Production (push) Successful in 26s
2026-03-20 09:53:49 +01:00
isUnknown
79019b761f Feat: écran de remerciement post-téléchargement white paper
All checks were successful
Deploy / Deploy to Production (push) Successful in 22s
- Remplace le message inline par un écran centré (smiley + heading + signature)
- Ajout clés i18n wp_success_heading / wp_success_sub
- Ajustements blueprints white-paper / white-papers / site
- Route : stockage leads sur page livres-blancs

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-19 11:36:00 +01:00
isUnknown
1cbb843c89 Feat: ajustements UI white-paper, home, portfolio + icône download
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-19 11:21:05 +01:00
isUnknown
fcca068868 Fix: navigation sous-pages blog/white-papers + singleSlug
All checks were successful
Deploy / Deploy to Production (push) Successful in 25s
- 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>
2026-03-19 07:36:43 +01:00
isUnknown
9f8854efa5 Fix: suppression du timing check (faux positifs sur desktop)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-19 07:15:44 +01:00
isUnknown
67d8159787 Feat: sécurisation formulaire white paper + stockage leads
- Honeypot, timing check, rate limiting IP, validation serveur
- Déduplication par email : enrichissement des champs vides si contact existant
- Blueprint white-paper : onglet "Contacts intéressés" (champ structure contactDatabase)
- Blueprint site.yml : ajout onglet "Données d'usage" pour vue globale des leads
- Route externalisée dans site/config/routes/download-white-paper.php
- isDownloadable côté client (prénom, nom, email valide, consentement)
- Cursor : pas de hover sur boutons disabled
- Buttons : hover désactivé si disabled

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-19 07:11:00 +01:00
isUnknown
974067d986 Refactor: WhitePaper — redesign layout + suppression préfixes wp-
- 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>
2026-03-18 18:48:50 +01:00
isUnknown
d4f05d6157 Feat: Livres blancs — nouveau template collection + livre blanc individuel
- Blueprints white-papers / white-paper (intro, cover, PDF, date)
- Templates PHP + JSON API (liste avec singleSlug, détail avec fileUrl)
- Route POST (:any)/(:any)/download pour le téléchargement gated
- Panel : entrée white-papers ajoutée au menu après blog
- collection.css : styles partagés extraits de Blog (collection-*)
- Blog.svelte : classes renommées blog-* → collection-*
- WhitePapers.svelte : vue liste, URLs dynamiques via data.uri
- WhitePaper.svelte : vue détail deux colonnes + formulaire de téléchargement
- i18n : clés white paper (label, form, consentement, statuts)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-18 17:37:22 +01:00
isUnknown
42ee58c18d site title format
All checks were successful
Deploy / Deploy to Production (push) Successful in 19s
2026-03-18 16:20:47 +01:00
isUnknown
474baf321b Fix/Feat: footer, newsletter, logo footerLogo, i18n, router formatting
- Footer : newsletter commentée, margin-top blog, text-align footer-col
- Blueprint site : logo → footerLogo (champ dédié au pied de page)
- Controller : logo → footerLogo
- i18n : newsletter_heading mis à jour (newsletters)
- site.svelte.js : retrait console.log debug
- router/index.js : reformatage quotes (linter)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-18 16:17:16 +01:00