Redesign accueil : grille 3 axes, hero fade/swipe, pages gestation et décision

- Hero : animation fade-in/fade-out + swipe (useTypewriter composable + TypewriterText)
- 3 axes : Autonomie numérique, économique, citoyenne (AxisBlock + AxisGrid)
- Pages gestation avec présentations (wishBounty, trustWallet, Cloud libre)
- Page /decision : plateforme Décision collective (lien Glibredecision)
- Bloc événement distinct en bas des axes
- Nav : Numérique / Économique / Citoyenne / Événement
- Dark theme éclairci (bg 7→10%, surface 12→14%)
- Suppression BookSection + GrateWizardTeaser (remplacés par AxisGrid)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Yvv
2026-03-03 03:49:07 +01:00
parent f0338cca5e
commit 97ba6dd04c
14 changed files with 1028 additions and 359 deletions

104
app/pages/decision.vue Normal file
View File

@@ -0,0 +1,104 @@
<template>
<div class="section-padding">
<div class="container-content">
<div class="mx-auto max-w-3xl">
<!-- Header -->
<div class="text-center mb-12">
<div class="decision-icon mx-auto mb-6">
<div class="i-lucide-scale h-10 w-10" />
</div>
<h1 class="font-display text-4xl font-bold text-white mb-4">Plateforme Décision</h1>
<p class="text-lg text-white/60 leading-relaxed">
Se donner les moyens de la décision collective.
</p>
</div>
<!-- Features -->
<div class="grid gap-4 sm:grid-cols-2 mb-12">
<div v-for="feature in features" :key="feature.title" class="feature-card">
<div class="feature-icon">
<div :class="`i-lucide-${feature.icon} h-5 w-5`" />
</div>
<h3 class="font-display font-semibold text-white mb-1">{{ feature.title }}</h3>
<p class="text-sm text-white/50 leading-relaxed">{{ feature.text }}</p>
</div>
</div>
<!-- CTA -->
<div class="text-center flex flex-col items-center gap-3 sm:flex-row sm:justify-center">
<UiBaseButton :href="decisionUrl" target="_blank">
<div class="i-lucide-external-link mr-2 h-4 w-4" />
Ouvrir Glibredecision
</UiBaseButton>
<UiBaseButton variant="ghost" to="/">
<div class="i-lucide-arrow-left mr-2 h-4 w-4" />
Retour à l'accueil
</UiBaseButton>
</div>
</div>
</div>
</div>
</template>
<script setup lang="ts">
useHead({ title: 'Décision collective' })
const appConfig = useAppConfig()
const decisionUrl = (appConfig.libredecision as { url: string }).url
const features = [
{
icon: 'vote',
title: 'Décisions on-chain',
text: 'Des décisions transparentes et vérifiables, inscrites sur la blockchain.',
},
{
icon: 'scroll-text',
title: 'Les Mandats',
text: 'Formaliser et suivre les mandats confiés aux personnes désignées.',
},
{
icon: 'file-text',
title: 'Documents de référence',
text: 'Les textes fondateurs et documents qui encadrent la prise de décision.',
},
{
icon: 'git-branch',
title: 'Les Protocoles',
text: 'Les règles et processus qui structurent la décision collective.',
},
]
</script>
<style scoped>
.decision-icon {
display: flex;
align-items: center;
justify-content: center;
width: 5rem;
height: 5rem;
border-radius: 1rem;
background: hsl(var(--color-primary) / 0.1);
border: 1px solid hsl(var(--color-primary) / 0.2);
color: hsl(var(--color-primary));
}
.feature-card {
padding: 1.25rem;
border-radius: 0.75rem;
border: 1px solid hsl(var(--color-text) / 0.08);
background: hsl(var(--color-surface));
}
.feature-icon {
display: flex;
align-items: center;
justify-content: center;
width: 2.25rem;
height: 2.25rem;
border-radius: 0.5rem;
background: hsl(var(--color-primary) / 0.1);
color: hsl(var(--color-primary));
margin-bottom: 0.75rem;
}
</style>

View File

@@ -0,0 +1,94 @@
<template>
<div class="section-padding">
<div class="container-content">
<div class="mx-auto max-w-2xl">
<div class="gestation-icon mx-auto mb-6">
<div class="i-lucide-flask-conical h-12 w-12 text-accent" />
</div>
<h1 class="font-display text-3xl font-bold text-white mb-4 text-center">
{{ item?.label ?? 'En gestation' }}
</h1>
<p class="text-lg text-white/60 leading-relaxed mb-8 text-center">
{{ item?.description ?? 'Cette initiative est en cours de préparation.' }}
</p>
<!-- Présentation spécifique -->
<div v-if="item?.presentation" class="presentation-card mb-10">
<div class="presentation-icon">
<div class="i-lucide-rocket h-5 w-5" />
</div>
<h2 class="font-display text-xl font-semibold text-white mb-2">
{{ item.presentation.title }}
</h2>
<p class="text-white/60 leading-relaxed">
{{ item.presentation.text }}
</p>
<p class="mt-4 text-sm text-white/30 italic">En cours de développement.</p>
</div>
<div class="text-center">
<UiBaseButton variant="ghost" to="/">
<div class="i-lucide-arrow-left mr-2 h-4 w-4" />
Retour à l'accueil
</UiBaseButton>
</div>
</div>
</div>
</div>
</template>
<script setup lang="ts">
const route = useRoute()
const slug = route.params.slug as string
const { data: content } = await usePageContent('home')
const item = computed(() => {
const axes = (content.value as any)?.axes
if (!axes) return null
for (const axis of Object.values(axes) as any[]) {
for (const it of axis.items ?? []) {
if (it.to === `/gestation/${slug}`) return it
}
}
return null
})
useHead({
title: item.value?.label ?? `En gestation — ${slug}`,
})
</script>
<style scoped>
.gestation-icon {
display: flex;
align-items: center;
justify-content: center;
width: 5rem;
height: 5rem;
border-radius: 1rem;
background: hsl(var(--color-accent) / 0.1);
border: 1px solid hsl(var(--color-accent) / 0.2);
}
.presentation-card {
padding: 1.5rem;
border-radius: 0.75rem;
border: 1px solid hsl(var(--color-primary) / 0.15);
background: hsl(var(--color-surface));
}
.presentation-icon {
display: flex;
align-items: center;
justify-content: center;
width: 2.5rem;
height: 2.5rem;
border-radius: 0.5rem;
background: hsl(var(--color-primary) / 0.1);
color: hsl(var(--color-primary));
margin-bottom: 1rem;
}
</style>

View File

@@ -1,8 +1,8 @@
<template>
<div>
<HomeHeroSection />
<HomeBookSection @open-player="showBookPlayer = true" @open-pdf="showPdfReader = true" />
<HomeGrateWizardTeaser />
<HomeAxisGrid @open-player="showBookPlayer = true" @open-pdf="showPdfReader = true" />
<HomeMessages />
<BookPlayer v-model="showBookPlayer" />
<BookPdfReader v-model="showPdfReader" />
</div>