Page statique non listée avec template PHP autonome (sans Vite/Svelte).
Affiche les 60 mécaniques de gamification avec filtre et retournement de cartes.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Plug Emailable API into checkEmailDeliverability (fail open if no key)
- Show inline red error + shake animation on email field when address is undeliverable
- Remove window.open auto-download after form submission; success now checks result.success
- Disable arrow-key slide navigation when an input or textarea is focused
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Refactors the download route into clean single-responsibility functions
and adds Brevo contact sync (list ID configurable via brevo_whitepaper.list_id).
Includes a stub for future external email deliverability validation.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Whoops converts the E_DEPRECATED into an exception, causing a 500.
Pass '"' and '\\' explicitly to match the current default behavior.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
kirby()->page($uuid) triggers a full site tree scan which can fail
depending on server config. Instead, load livres-blancs children once
and build a uuid→title map for O(1) lookups in the contact loop.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
site()->find(false, false, ...uuids) passed booleans to a typed variadic
parameter, which can throw on PHP 8.1+. Resolve each UUID individually via
kirby()->page($uuid) and add null guard for page('livres-blancs').
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
toStructure()->toArray() returns lowercase keys, so reading 'whitepaper'
then writing 'whitePaper' left both keys in the array, producing duplicate
YAML keys on re-encode. unset the lowercase key first to keep the file clean.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Kirby's Form system strips translate:false fields when the current language
is not the default, so update() in an EN request silently discarded the
contactDatabase payload. Explicitly passing the default language code ensures
the write always targets white-papers.fr.txt.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Read was from the white-paper page, write was to livres-blancs — so
each submission started from an empty (or wrong) entries array and
replaced the full database. Both now read from livres-blancs.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- toPages()->first() instead of toPage() (pages field stores YAML array)
- Force read from default language content to avoid empty rules on FR requests
- Add error.php template so Kirby uses the error controller (without it,
Kirby fell back to default template and ignored site/controllers/error.php)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add #preloader div with scrollable-page-background.png as CSS background,
matching the Svelte bg-fixed image so the transition is imperceptible
(image is cached by the time Svelte requests it)
- Revert #ssr-content to visually-hidden (clip) for Google Wave 1 crawl
- Prevent scrollbar flash by adding overflow:hidden to html,body inline
before main.css loads
- Parallel-fetch sub-page data (/blog/slug.json) alongside parent in initRouter
so Blog/WhitePapers components receive prefetched data on mount — eliminates
the list→article flash on direct navigation
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Each page template now renders its content in a visually-hidden #ssr-content
div (sr-only technique) so search engine crawlers see real HTML without
impacting the Svelte app layout. Shared snippets handle nav, footer contact
info, and article cards.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Blueprint, PHP templates, Svelte view (static title + body blocks), i18n key and App routing. Page is unlisted, excluded from frontend navigation, and all panel change options are disabled.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Add config.world.game.php with debug=false so robots.index=true in prod
- Fix canonical.base to https://world.game
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Remove GalleryAnimation preloading (was downloading full-size originals
via new Image(), causing 5MB+ redundant downloads on top of WebP srcset)
- Gallery now shows immediately, images load lazily via DOM
- Force eager loading on mockup img when slide becomes active (fixes
first-project gallery never showing — lazy img off-screen on bg slide)
- Resize all direct ->url() calls to appropriate display dimensions:
gallery src 600px, mockup src 960px, backgrounds 1920px,
play lettering 500px, play preview 1000px, team photos 400px
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>
Le champ mockup (translate: false) retournait null en version anglaise
car Kirby lisait le fichier de contenu EN vide. On lit maintenant
explicitement via defaultLanguage pour toutes les langues.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>