- 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>
Calling onScroll() immediately after attaching the listener caused the
footer to appear on page load when content height exceeded clientHeight
by less than the threshold (0 >= smallOverflow - 100 = true at scrollTop=0).
Footer now starts hidden and only reveals on explicit user scroll.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- App.svelte: sync body[data-template] on every active template change.
PHP only sets it on initial load; SPA navigation left it stale (e.g.
stuck on "home"), breaking CSS selectors like [data-template="white-paper"].
- Footer.svelte: guard atBottom with an overflow check.
When scrollHeight === clientHeight (no overflow), the old formula
(0 >= 0 - threshold) was always true, showing the footer immediately
on pages with no scrollable content (e.g. white-paper detail on load).
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>
Preload unique image URLs via new Image(). Container stays at opacity:0
until all are ready, then reveals at once. Cached images show instantly
(no fade transition). Fixes broken progressive reveal in scrolling gallery.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>