diff --git a/CLAUDE.md b/CLAUDE.md
index 04127cb..ccd5e78 100644
--- a/CLAUDE.md
+++ b/CLAUDE.md
@@ -14,26 +14,36 @@ Site vitrine du projet Le Librodrome — livre + chansons sur l'économie du don
```
app/
- pages/ # Routes : index, lire/, ecouter/, autonomie, evenement, gratewizard, a-propos, admin/
- components/ # admin, book, content, home, layout, player, song, ui
- composables/ # useAudioPlayer, useBookData, useGrateWizard, usePlaylist, usePageContent, useSiteContent...
- assets/css/ # main.css (UnoCSS)
-data/
- pages/ # Contenu YAML par page (home, lire, ecouter, autonomie, evenement...)
- site.yml # Config globale du site
+ pages/
+ numerique/ # Autonomie numérique (index + [slug] détail)
+ economique/ # Autonomie économique (index, monnaie-libre, commande, productions-collectives)
+ modele-eco/ # Livre : sommaire + chapitres [slug]
+ citoyenne/ # Autonomie citoyenne (index + [slug] détail)
+ en-musique/ # Player audio
+ evenement.vue # Événement
+ admin/ # Back-office (pages/, book/, songs, messages, media)
+ components/
+ book/Actions.vue # Boutons partagés livre (player, PDF, chapitres, commande)
+ home/ # BookSection, AxisBlock, AxisGrid, HeroSection, Messages
+ admin/, player/, song/, ui/
+ composables/ # useAudioPlayer, useBookData, useGrateWizard, usePageContent...
+ stores/palette.ts # 4 palettes saisonnières (été par défaut, persisté localStorage)
+ assets/css/ # main.css (UnoCSS + overrides light mode)
+site/
+ pages/ # Contenu YAML par section (numerique/, economique/, citoyenne/)
+ site.yml # Config globale (nav, footer, GrateWizard)
+ bookplayer.config.yml # Config player/chapitres
server/
- api/ # Endpoints API (admin, health)
- middleware/ # Auth middleware
+ api/content/pages/[...path].get.ts # GET pages YAML (chemins imbriqués)
+ api/admin/content/pages/[...path].put.ts # PUT pages YAML
+ api/admin/content/pages.get.ts # Liste toutes les pages
+ middleware/redirects.ts # 301 : /gestation, /modele-eco, /decision, /lire
docker/
- Dockerfile # Build multi-stage (dev + prod)
- docker-compose.yml # Production (Traefik)
- docker-compose.dev.yml # Dev Docker
+ Dockerfile, docker-compose.yml, docker-compose.dev.yml
```
## Ports dev (CRITIQUE)
-Chaque projet a un port fixe pour éviter les conflits Nuxt auto-increment :
-
| Projet | Port | Config |
|--------|------|--------|
| **librodrome** | **3000** | `nuxt.config.ts` → `devServer.port: 3000` |
@@ -41,32 +51,32 @@ Chaque projet a un port fixe pour éviter les conflits Nuxt auto-increment :
| **SejeteralO frontend** | **3009** | `frontend/nuxt.config.ts` → `devServer.port: 3009` |
| **SejeteralO backend** | **8000** | Makefile → `uvicorn --port 8000` |
-Script de gestion : `/home/yvv/Documents/PROD/DEV/dev-ports.sh` (status/kill/clean/start)
-
-**Ne jamais changer ces ports.** Si un port est occupé, tuer le process parasite plutôt que laisser Nuxt auto-incrémenter.
+**Ne jamais changer ces ports.**
## Intégration GrateWizard
-- URL dev configurée dans `app/app.config.ts` → `localhost:3001`
+- URL dev : `app/app.config.ts` → `localhost:3001`
- URL prod : `https://gratewizard.axiom-team.fr`
-- Ouverture en popup via `composables/useGrateWizard.ts`
-- GrateWizard est un projet Next.js séparé (`/home/yvv/Documents/PROD/DEV/GrateWizard`)
+- Bloc GrateWizard dans la section économique de la home
-## Contenu
+## Contenu administrable
-Le contenu des pages est dans `data/pages/*.yml` et chargé via `composables/usePageContent.ts`. Le contenu riche (articles) utilise Nuxt Content avec des fichiers Markdown.
+- YAML dans `site/pages/` organisé par section (sous-dossiers)
+- API supporte les chemins imbriqués (`numerique/logiciel-libre`)
+- Admin : `/admin/pages` liste toutes les pages, `/admin/pages/{path}` édite en YAML
+- Git sync auto en prod (ADMIN_GIT_SYNC=true)
## Commandes
```bash
pnpm dev # Dev server sur :3000
pnpm build # Build production
-pnpm generate # Génération statique
```
## Conventions
- Langue du site : français
- Commits en français, style concis
-- CSS via UnoCSS (utility-first), pas de framework CSS externe
+- CSS via UnoCSS (utility-first) + variables CSS palettes
- Composants Vue SFC avec `
diff --git a/app/components/book/ChapterNav.vue b/app/components/book/ChapterNav.vue
index 2ff2559..e4657bf 100644
--- a/app/components/book/ChapterNav.vue
+++ b/app/components/book/ChapterNav.vue
@@ -6,7 +6,7 @@
-
diff --git a/app/components/home/AxisBlock.vue b/app/components/home/AxisBlock.vue
index caf2b91..88f64dd 100644
--- a/app/components/home/AxisBlock.vue
+++ b/app/components/home/AxisBlock.vue
@@ -56,15 +56,17 @@
@@ -79,6 +81,7 @@ interface AxisAction {
icon: string
highlight?: boolean
secondary?: boolean
+ to?: string
}
interface AxisItem {
diff --git a/app/components/home/AxisGrid.vue b/app/components/home/AxisGrid.vue
index 293948b..92ea63b 100644
--- a/app/components/home/AxisGrid.vue
+++ b/app/components/home/AxisGrid.vue
@@ -25,6 +25,24 @@
@open-pdf="$emit('open-pdf')"
@launch-gratewizard="launchGW"
/>
+
+
+
@@ -40,26 +58,6 @@
-
-
-
-
-
@@ -160,10 +158,10 @@ function launchGW() {
.gw-block {
display: flex;
align-items: center;
- gap: 1.25rem;
+ gap: 1rem;
width: 100%;
- padding: 1.75rem 2rem;
- border-radius: 1rem;
+ padding: 1.25rem 1.5rem;
+ border-radius: 0.75rem;
border: none;
background: linear-gradient(135deg, hsl(280 50% 20% / 0.35), hsl(260 40% 15% / 0.25));
box-shadow: 0 0 40px hsl(280 60% 50% / 0.06), inset 0 1px 0 hsl(280 60% 70% / 0.08);
@@ -187,9 +185,9 @@ function launchGW() {
display: flex;
align-items: center;
justify-content: center;
- width: 3.5rem;
- height: 3.5rem;
- border-radius: 0.875rem;
+ width: 2.5rem;
+ height: 2.5rem;
+ border-radius: 0.625rem;
background: hsl(280 60% 55% / 0.18);
color: hsl(280 60% 72%);
flex-shrink: 0;
@@ -205,8 +203,8 @@ function launchGW() {
display: flex;
align-items: center;
justify-content: center;
- width: 2.5rem;
- height: 2.5rem;
+ width: 2rem;
+ height: 2rem;
border-radius: 50%;
background: hsl(280 60% 55% / 0.1);
color: hsl(280 60% 65%);
diff --git a/app/components/home/BookSection.vue b/app/components/home/BookSection.vue
index 5249837..926c421 100644
--- a/app/components/home/BookSection.vue
+++ b/app/components/home/BookSection.vue
@@ -5,23 +5,6 @@
-
-
-
-
-
- {{ content?.book.cta.player }}
-
-
-
- {{ content?.book.cta.pdf }}
-
-
+
@@ -66,6 +44,12 @@
+
+
diff --git a/app/pages/citoyenne/[slug].vue b/app/pages/citoyenne/[slug].vue
new file mode 100644
index 0000000..b9ab439
--- /dev/null
+++ b/app/pages/citoyenne/[slug].vue
@@ -0,0 +1,159 @@
+
+
+
+
+
+
+
+ {{ content?.kicker }}
+
+
+
+ {{ content?.title ?? slug }}
+
+
+
+ {{ content?.description }}
+
+
+
+
+
+
+
{{ feature.title }}
+
{{ feature.text }}
+
+
+
+
+
+
+
+ {{ content.project.name }}
+
+
+ {{ content.project.text }}
+
+
+
+ En gestation
+
+
+
+
+
+
+ {{ content.content }}
+
+
+
+
+
+
+ Ouvrir Glibredecision
+
+
+
+ Lancer SejeteralO
+
+
+
+ Autonomie citoyenne
+
+
+
+
+
+
+
+
+
+
diff --git a/app/pages/citoyenne/index.vue b/app/pages/citoyenne/index.vue
new file mode 100644
index 0000000..e08f623
--- /dev/null
+++ b/app/pages/citoyenne/index.vue
@@ -0,0 +1,631 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ content?.kicker }}
+
+ {{ content?.title }}
+
+
+ {{ content?.description }}
+
+
+
+
+
+
+
+
+
+ Se donner les moyens de la décision collective.
+
+
+
+
+
+
+
+
+
+
+
+ Application pour obtenir justice sociale et incitation dynamique à la réduction.
+ Permet de confier la décision à la population des communes.
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/pages/decision.vue b/app/pages/decision.vue
deleted file mode 100644
index 5ec312d..0000000
--- a/app/pages/decision.vue
+++ /dev/null
@@ -1,104 +0,0 @@
-
-
-
-
-
-
-
-
Plateforme Décision
-
- Se donner les moyens de la décision collective.
-
-
-
-
-
-
-
-
{{ feature.title }}
-
{{ feature.text }}
-
-
-
-
-
-
-
- Ouvrir Glibredecision
-
-
-
- Retour à l'accueil
-
-
-
-
-
-
-
-
-
-
diff --git a/app/pages/economique/commande.vue b/app/pages/economique/commande.vue
new file mode 100644
index 0000000..4dee394
--- /dev/null
+++ b/app/pages/economique/commande.vue
@@ -0,0 +1,453 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ content?.kicker }}
+
+
+
+ {{ content?.title }}
+
+
+
+ {{ content?.description }}
+
+
+
+
+
+
+
+
+
+
+ {{ content?.librairie?.title }}
+
+
+ {{ content?.librairie?.text }}
+
+
+
+
+
+
+
+ Autonomie économique
+
+
+
+
+
+
+
+
+
+
diff --git a/app/pages/economique/index.vue b/app/pages/economique/index.vue
new file mode 100644
index 0000000..fb7b60f
--- /dev/null
+++ b/app/pages/economique/index.vue
@@ -0,0 +1,647 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ content?.kicker }}
+
+ {{ content?.title }}
+
+
+ {{ content?.description }}
+
+
+
+
+
+
+
+
+ La Ğ1 (June) : une monnaie co-créée par ses membres, sans dette ni intérêt. Le dividende universel comme base.
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Une plateforme pour faciliter la création d'équipes et la réalisation de productions à l'échelle des bassins de vie. Passer la seconde.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/pages/modele-eco/[slug].vue b/app/pages/economique/modele-eco/[slug].vue
similarity index 92%
rename from app/pages/modele-eco/[slug].vue
rename to app/pages/economique/modele-eco/[slug].vue
index d4650cf..56c4adb 100644
--- a/app/pages/modele-eco/[slug].vue
+++ b/app/pages/economique/modele-eco/[slug].vue
@@ -14,7 +14,7 @@