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>