Restructure Engagement Forgeron + fix GenesisBlock + InertiaSlider

- Seed: restructure Engagement Forgeron (51→59 items) avec 3 nouvelles
  sections: Engagements fondamentaux (EF1-EF3), Engagements techniques
  (ET1-ET3), Qualification (Q0-Q1) liée au protocole Embarquement
- Seed: ajout protocole Embarquement Forgeron (5 jalons: candidature,
  miroir, évaluation, certification Smith, mise en ligne)
- GenesisBlock: fix lisibilité — fond mood-surface teinté accent au lieu
  de mood-text inversé, texte mood-aware au lieu de rgba blanc hardcodé
- InertiaSlider: mini affiche "Inertie" sous le curseur, compact en
  width:fit-content pour s'adapter au label
- Frontend: ajout section qualification dans SECTION_META/SECTION_ORDER
- Pages, composants et tests des sprints précédents

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Yvv
2026-03-03 03:44:33 +01:00
parent 4212e847d4
commit c19c1aa55e
16 changed files with 3002 additions and 361 deletions

View File

@@ -21,17 +21,6 @@ onMounted(async () => {
})
const entryCards = computed(() => [
{
key: 'documents',
title: 'Documents',
icon: 'i-lucide-book-open',
to: '/documents',
count: documents.activeDocuments.length,
countLabel: `${documents.activeDocuments.length} actif${documents.activeDocuments.length > 1 ? 's' : ''}`,
totalLabel: `${documents.list.length} au total`,
description: 'Textes fondateurs sous vote permanent',
color: 'var(--mood-accent)',
},
{
key: 'decisions',
title: 'Decisions',
@@ -44,15 +33,15 @@ const entryCards = computed(() => [
color: 'var(--mood-secondary, var(--mood-accent))',
},
{
key: 'protocoles',
title: 'Protocoles',
icon: 'i-lucide-settings',
to: '/protocols',
count: protocols.protocols.length,
countLabel: `${protocols.protocols.length} modalite${protocols.protocols.length > 1 ? 's' : ''}`,
totalLabel: 'Boite a outils de vote + workflows',
description: 'Modalites de vote, formules, workflows n8n',
color: 'var(--mood-tertiary, var(--mood-accent))',
key: 'documents',
title: 'Documents',
icon: 'i-lucide-book-open',
to: '/documents',
count: documents.activeDocuments.length,
countLabel: `${documents.activeDocuments.length} actif${documents.activeDocuments.length > 1 ? 's' : ''}`,
totalLabel: `${documents.list.length} au total`,
description: 'Textes fondateurs sous vote permanent',
color: 'var(--mood-accent)',
},
{
key: 'mandats',
@@ -65,6 +54,17 @@ const entryCards = computed(() => [
description: 'Missions deleguees avec nomination en binome',
color: 'var(--mood-success)',
},
{
key: 'protocoles',
title: 'Protocoles',
icon: 'i-lucide-settings',
to: '/protocols',
count: protocols.protocols.length,
countLabel: `${protocols.protocols.length} modalite${protocols.protocols.length > 1 ? 's' : ''}`,
totalLabel: 'Boite a outils de vote + workflows',
description: 'Modalites de vote, formules, workflows',
color: 'var(--mood-tertiary, var(--mood-accent))',
},
])
const recentDecisions = computed(() => {
@@ -151,35 +151,27 @@ function formatDate(dateStr: string): string {
</NuxtLink>
</div>
<!-- Toolbox teaser -->
<div class="dash__toolbox">
<div class="dash__toolbox-head">
<UIcon name="i-lucide-wrench" class="text-lg" />
<h3>Boite a outils</h3>
<span class="dash__toolbox-count">{{ protocols.protocols.length }}</span>
<!-- Toolbox teaser (5th block, distinct look) -->
<NuxtLink to="/tools" class="dash__toolbox-card">
<div class="dash__toolbox-card-inner">
<div class="dash__toolbox-card-icon">
<UIcon name="i-lucide-wrench" class="text-xl" />
</div>
<div class="dash__toolbox-card-body">
<h3 class="dash__toolbox-card-title">Boite a outils</h3>
<p class="dash__toolbox-card-desc">
Simulateur de formules, modules de vote, workflows
</p>
<div class="dash__toolbox-card-tags">
<span class="dash__toolbox-card-tag">Vote WoT</span>
<span class="dash__toolbox-card-tag">Inertie</span>
<span class="dash__toolbox-card-tag">Smith</span>
<span class="dash__toolbox-card-tag">Nuance</span>
</div>
</div>
<UIcon name="i-lucide-arrow-right" class="dash__toolbox-card-arrow" />
</div>
<div class="dash__toolbox-tags">
<template v-if="protocols.protocols.length > 0">
<NuxtLink
v-for="protocol in protocols.protocols"
:key="protocol.id"
:to="`/protocols/${protocol.id}`"
class="dash__tag"
>
{{ protocol.name }}
</NuxtLink>
</template>
<template v-else>
<span class="dash__tag">Vote WoT</span>
<span class="dash__tag">Vote nuance</span>
<span class="dash__tag">Vote permanent</span>
</template>
</div>
<NuxtLink to="/protocols" class="dash__toolbox-link">
Voir la boite a outils
<UIcon name="i-lucide-chevron-right" />
</NuxtLink>
</div>
</NuxtLink>
<!-- Recent activity -->
<div v-if="recentDecisions.length > 0" class="dash__activity">
@@ -292,7 +284,7 @@ function formatDate(dateStr: string): string {
@media (min-width: 640px) {
.dash__entries {
grid-template-columns: repeat(auto-fit, minmax(14rem, 1fr));
grid-template-columns: 1fr 1fr;
gap: 1rem;
}
}
@@ -460,73 +452,91 @@ function formatDate(dateStr: string): string {
transform: translateY(0);
}
/* --- Toolbox teaser --- */
.dash__toolbox {
background: var(--mood-surface);
/* --- Toolbox card (5th block, distinct) --- */
.dash__toolbox-card {
display: block;
text-decoration: none;
background: var(--mood-accent-soft);
border-radius: 16px;
padding: 1rem;
padding: 1.25rem;
transition: transform 0.15s ease, box-shadow 0.15s ease;
border-left: 4px solid var(--mood-accent);
}
@media (min-width: 640px) {
.dash__toolbox {
padding: 1.25rem;
}
.dash__toolbox-card:hover {
transform: translateY(-3px);
box-shadow: 0 8px 24px var(--mood-shadow);
}
.dash__toolbox-head {
.dash__toolbox-card-inner {
display: flex;
align-items: flex-start;
gap: 1rem;
}
.dash__toolbox-card-icon {
width: 2.75rem;
height: 2.75rem;
flex-shrink: 0;
display: flex;
align-items: center;
gap: 0.5rem;
color: var(--mood-accent);
font-weight: 800;
font-size: 1.0625rem;
}
.dash__toolbox-head h3 { margin: 0; }
.dash__toolbox-count {
font-size: 0.75rem;
font-weight: 800;
background: var(--mood-accent-soft);
color: var(--mood-accent);
padding: 2px 8px;
border-radius: 20px;
justify-content: center;
border-radius: 14px;
background: var(--mood-accent);
color: var(--mood-accent-text);
}
.dash__toolbox-tags {
.dash__toolbox-card-body {
flex: 1;
min-width: 0;
display: flex;
flex-direction: column;
gap: 0.375rem;
}
.dash__toolbox-card-title {
font-size: 1.125rem;
font-weight: 800;
color: var(--mood-text);
margin: 0;
}
.dash__toolbox-card-desc {
font-size: 0.8125rem;
color: var(--mood-text-muted);
margin: 0;
line-height: 1.4;
}
.dash__toolbox-card-tags {
display: flex;
flex-wrap: wrap;
gap: 0.5rem;
margin-top: 0.75rem;
}
.dash__tag {
display: inline-flex;
align-items: center;
padding: 0.375rem 0.875rem;
font-size: 0.8125rem;
font-weight: 600;
color: var(--mood-accent);
background: var(--mood-accent-soft);
border-radius: 20px;
text-decoration: none;
transition: transform 0.1s ease;
}
.dash__tag:hover {
transform: translateY(-1px);
}
.dash__toolbox-link {
display: inline-flex;
align-items: center;
gap: 0.375rem;
margin-top: 0.75rem;
font-size: 0.875rem;
margin-top: 0.25rem;
}
.dash__toolbox-card-tag {
display: inline-flex;
padding: 0.25rem 0.625rem;
font-size: 0.6875rem;
font-weight: 700;
color: var(--mood-accent);
text-decoration: none;
background: var(--mood-surface);
border-radius: 20px;
}
.dash__toolbox-link:hover {
text-decoration: underline;
.dash__toolbox-card-arrow {
flex-shrink: 0;
color: var(--mood-text-muted);
opacity: 0.3;
margin-top: 0.375rem;
transition: all 0.15s;
}
.dash__toolbox-card:hover .dash__toolbox-card-arrow {
opacity: 1;
color: var(--mood-accent);
transform: translateX(3px);
}
/* --- Activity --- */