add privacy page as standalone SPA view outside slide navigation

- 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>
This commit is contained in:
isUnknown 2026-03-30 18:43:35 +02:00
parent b12b839f1b
commit 44af8a9b4e
11 changed files with 259 additions and 50 deletions

View file

@ -17,6 +17,7 @@
import Blog from '@views/Blog.svelte'
import Article from '@views/Article.svelte'
import WhitePapers from '@views/WhitePapers.svelte'
import Privacy from '@views/Privacy.svelte'
import Default from '@views/Default.svelte'
const templates = {
@ -30,6 +31,7 @@
blog: Blog,
article: Article,
'white-papers': WhitePapers,
privacy: Privacy,
default: Default
}
@ -37,13 +39,15 @@
const wrapperTransform = $derived(`translateX(-${slides.activeIndex * 100}vw)`)
const linesBySlide = {
home: [6, 11, 16],
expertise: [6, 8, 11, 14, 16],
about: [6, 8, 11, 14, 16],
portfolio: [11, 16],
home: [6, 11, 16],
expertise: [6, 8, 11, 14, 16],
about: [6, 8, 11, 14, 16],
portfolio: [11, 16],
privacy: [6, 8, 11, 14, 16],
}
const ALL_COLS = [6, 8, 11, 14, 16]
const activeLines = $derived(new Set(linesBySlide[slides.active?.template] ?? []))
const activeTemplate = $derived(slides.standalone?.template ?? slides.active?.template)
const activeLines = $derived(new Set(linesBySlide[activeTemplate] ?? []))
let isReady = $state(false)
let isResizing = $state(false)
@ -143,22 +147,29 @@
</div>
<main class="main">
<div
class="slides-wrapper"
class:is-animated={isReady && !isResizing}
style="width: {wrapperWidth}; transform: {wrapperTransform}"
>
{#each slides.all as slide, i}
<section class="slide" class:active={i === slides.activeIndex} data-slide={slide.id} inert={i !== slides.activeIndex}>
{#if slide.loaded}
<svelte:component
this={templates[slide.template] ?? Default}
data={slide.data}
/>
{/if}
</section>
{/each}
</div>
{#if slides.standalone}
<svelte:component
this={templates[slides.standalone.template] ?? Default}
data={slides.standalone}
/>
{:else}
<div
class="slides-wrapper"
class:is-animated={isReady && !isResizing}
style="width: {wrapperWidth}; transform: {wrapperTransform}"
>
{#each slides.all as slide, i}
<section class="slide" class:active={i === slides.activeIndex} data-slide={slide.id} inert={i !== slides.activeIndex}>
{#if slide.loaded}
<svelte:component
this={templates[slide.template] ?? Default}
data={slide.data}
/>
{/if}
</section>
{/each}
</div>
{/if}
</main>
<LanguageSwitcher />