- Hero : 5 lignes typographiques alternées (bold/light/accent/caps/italic), citations et axes dans un bloc discret dépliable - Icônes axes : Ğ1 custom, balance (éco don), graphe (WoT), marteau (décision), pictos plus lumineux (glow) - Menu : Autonomie en italique + grand, Événement majuscule - Page /autonomie renommée /numerique avec redirect 301 - Sceau hexagramme 益 Yì dans le layout, BookSection dans /modele-eco - Fonts Syne + Space Grotesk, dark theme éclairci - Popup GrateWizard agrandie (480×860) - Actions AxisBlock : primary côte à côte, secondary séparé dessous Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
136 lines
4.7 KiB
Vue
136 lines
4.7 KiB
Vue
<template>
|
|
<section class="section-padding">
|
|
<div class="container-content">
|
|
<div class="grid items-center gap-12 md:grid-cols-2">
|
|
<!-- Book cover -->
|
|
<UiScrollReveal>
|
|
<div class="book-cover-wrapper relative">
|
|
<!-- Shadok pumper -->
|
|
<svg class="shadok-pumper" viewBox="0 0 200 240" fill="none" aria-hidden="true">
|
|
<ellipse cx="100" cy="130" rx="55" ry="65" fill="currentColor" opacity="0.9"/>
|
|
<ellipse cx="100" cy="60" rx="30" ry="28" fill="currentColor" opacity="0.85"/>
|
|
<circle cx="88" cy="54" r="6" fill="currentColor" opacity="0.2"/>
|
|
<circle cx="112" cy="54" r="6" fill="currentColor" opacity="0.2"/>
|
|
<circle cx="90" cy="53" r="2.5" fill="currentColor" opacity="0.5"/>
|
|
<circle cx="114" cy="53" r="2.5" fill="currentColor" opacity="0.5"/>
|
|
<polygon points="100,68 115,78 85,78" fill="currentColor" opacity="0.6"/>
|
|
<line x1="80" y1="192" x2="70" y2="230" stroke="currentColor" stroke-width="4" stroke-linecap="round" opacity="0.7"/>
|
|
<line x1="120" y1="192" x2="130" y2="230" stroke="currentColor" stroke-width="4" stroke-linecap="round" opacity="0.7"/>
|
|
<line x1="70" y1="230" x2="55" y2="232" stroke="currentColor" stroke-width="3" stroke-linecap="round" opacity="0.5"/>
|
|
<line x1="130" y1="230" x2="145" y2="232" stroke="currentColor" stroke-width="3" stroke-linecap="round" opacity="0.5"/>
|
|
<line x1="155" y1="110" x2="190" y2="90" stroke="currentColor" stroke-width="4" stroke-linecap="round" opacity="0.6"/>
|
|
<line x1="190" y1="90" x2="190" y2="120" stroke="currentColor" stroke-width="4" stroke-linecap="round" opacity="0.6"/>
|
|
<rect x="180" y="118" width="18" height="40" rx="3" fill="currentColor" opacity="0.4"/>
|
|
</svg>
|
|
<div class="book-cover-3d">
|
|
<img
|
|
:src="content?.book.coverImage"
|
|
:alt="content?.book.coverAlt"
|
|
class="book-cover-img"
|
|
/>
|
|
</div>
|
|
</div>
|
|
</UiScrollReveal>
|
|
|
|
<!-- Content + CTAs -->
|
|
<div>
|
|
<UiScrollReveal>
|
|
<p class="mb-2 font-mono text-sm tracking-widest text-accent uppercase">{{ content?.book.kicker }}</p>
|
|
<h2 class="heading-section font-display font-bold tracking-tight text-white">
|
|
{{ content?.book.title }}
|
|
</h2>
|
|
</UiScrollReveal>
|
|
|
|
<UiScrollReveal :delay="100">
|
|
<p class="mt-4 text-lg leading-relaxed text-white/60">
|
|
{{ content?.book.description }}
|
|
</p>
|
|
</UiScrollReveal>
|
|
|
|
<UiScrollReveal :delay="200">
|
|
<div class="mt-8 flex flex-col gap-3 sm:flex-row sm:gap-4">
|
|
<UiBaseButton @click="$emit('open-player')">
|
|
<div class="i-lucide-play mr-2 h-5 w-5" />
|
|
{{ content?.book.cta.player }}
|
|
</UiBaseButton>
|
|
<UiBaseButton variant="accent" @click="$emit('open-pdf')">
|
|
<div class="i-lucide-book-open mr-2 h-5 w-5" />
|
|
{{ content?.book.cta.pdf }}
|
|
</UiBaseButton>
|
|
</div>
|
|
</UiScrollReveal>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</section>
|
|
</template>
|
|
|
|
<script setup lang="ts">
|
|
defineEmits<{
|
|
'open-player': []
|
|
'open-pdf': []
|
|
}>()
|
|
|
|
const { data: content } = await usePageContent('home')
|
|
</script>
|
|
|
|
<style scoped>
|
|
.book-cover-wrapper {
|
|
perspective: 800px;
|
|
display: flex;
|
|
justify-content: center;
|
|
}
|
|
|
|
.book-cover-3d {
|
|
aspect-ratio: 3 / 4;
|
|
border-radius: 0.75rem;
|
|
overflow: hidden;
|
|
border: 1px solid hsl(var(--color-text) / 0.1);
|
|
box-shadow:
|
|
0 12px 40px hsl(var(--color-text) / 0.15),
|
|
0 0 0 1px hsl(var(--color-text) / 0.08);
|
|
transition: transform 0.5s cubic-bezier(0.645, 0.045, 0.355, 1),
|
|
box-shadow 0.5s ease;
|
|
max-width: 360px;
|
|
}
|
|
|
|
.book-cover-3d:hover {
|
|
transform: rotateY(-8deg) rotateX(3deg) scale(1.02);
|
|
box-shadow:
|
|
12px 16px 48px hsl(var(--color-text) / 0.2),
|
|
0 0 0 1px hsl(var(--color-primary) / 0.2);
|
|
}
|
|
|
|
.book-cover-img {
|
|
width: 200%;
|
|
height: 100%;
|
|
object-fit: cover;
|
|
transform: translateX(-50%);
|
|
}
|
|
|
|
.heading-section {
|
|
font-size: clamp(1.625rem, 4vw, 2.125rem);
|
|
}
|
|
|
|
.shadok-pumper {
|
|
position: absolute;
|
|
right: 3%;
|
|
bottom: 8%;
|
|
width: clamp(90px, 12vw, 180px);
|
|
opacity: 0.28;
|
|
pointer-events: none;
|
|
color: hsl(var(--color-primary));
|
|
animation: shadok-float 10s ease-in-out infinite;
|
|
z-index: 1;
|
|
}
|
|
|
|
@keyframes shadok-float {
|
|
0%, 100% { transform: translateY(0); }
|
|
50% { transform: translateY(-10px); }
|
|
}
|
|
|
|
@media (max-width: 768px) {
|
|
.shadok-pumper { display: none; }
|
|
}
|
|
</style>
|