From 2f438d9d7a85a59ee11def2d79ee8d56ff9d3604 Mon Sep 17 00:00:00 2001 From: Yvv Date: Thu, 26 Feb 2026 20:20:52 +0100 Subject: [PATCH] Refactoring complet : contenu livre, config unique, routes, admin et light mode MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Source unique : supprime app/data/librodrome.config.yml, renomme site/ en bookplayer.config.yml - Morceaux : renommés avec slugs lisibles, fichiers audio renommés, inversion ch2↔ch3 corrigée - Chapitres : 11 fichiers .md réécrits avec le vrai contenu du livre (synthèse fidèle du PDF) - Routes : /lire → /modele-eco, /ecouter → /en-musique, redirections 301 - Admin chapitres : champs structurés (titre, description, temps lecture), compteur mots - Éditeur markdown : mode split, plein écran, support Tab, meilleur rendu aperçu - Admin morceaux : drag & drop, ajout/suppression, gestion playlist - Light mode : palettes printemps/été plus saturées et contrastées, teintes primary - Raccourcis clavier player : espace, flèches gauche/droite - Paroles : toggle supprimé, toujours visibles et scrollables - Nouvelles pages : autonomie, evenement Co-Authored-By: Claude Opus 4.6 --- app/app.config.ts | 4 +- app/app.vue | 2 +- app/assets/css/main.css | 78 +++-- app/components/admin/AdminMarkdownEditor.vue | 148 +++++++--- app/components/admin/AdminSidebar.vue | 8 +- app/components/book/BookPlayer.vue | 24 +- app/components/book/ChapterNav.vue | 2 +- app/components/home/BookPresentation.vue | 39 +++ app/components/home/HeroSection.vue | 37 +++ app/components/player/PlayerPersistent.vue | 1 + app/components/song/SongItem.vue | 83 ++++-- app/components/song/SongLyrics.vue | 42 +-- app/composables/useBookData.ts | 4 +- app/composables/useKeyboardShortcuts.ts | 41 +++ app/data/librodrome.config.yml | 180 ------------ app/pages/admin/book/[slug].vue | 96 +++++-- app/pages/admin/book/index.vue | 204 ++++++++++++- app/pages/admin/songs.vue | 175 +++++++++++- app/pages/autonomie.vue | 168 +++++++++++ app/pages/{ecouter => en-musique}/index.vue | 134 ++++++++- app/pages/evenement.vue | 267 ++++++++++++++++++ app/pages/{lire => modele-eco}/[slug].vue | 4 +- app/pages/{lire => modele-eco}/index.vue | 46 ++- app/stores/palette.ts | 32 +-- content/book/01-introduction.md | 37 +++ content/book/02-don.md | 42 +++ content/book/03-mesure.md | 34 +++ content/book/04-monnaie.md | 36 +++ content/book/05-trm.md | 51 ++++ content/book/06-economie.md | 42 +++ content/book/07-echange.md | 37 +++ content/book/08-institution.md | 36 +++ content/book/09-greffes.md | 36 +++ content/book/10-maintenant.md | 37 +++ content/book/11-annexes.md | 48 ++++ content/book/annexes.md | 73 ----- content/book/autres-greffes.md | 103 ------- content/book/creer-une-economie.md | 103 ------- content/book/de-quel-don-parlons-nous.md | 96 ------- content/book/echanger.md | 57 ---- content/book/et-maintenant.md | 47 --- content/book/introduction.md | 84 ------ content/book/la-mesure-du-don.md | 61 ---- content/book/la-trm.md | 60 ---- content/book/raison-d-etre-d-une-monnaie.md | 60 ---- content/book/relation-institutionnelle.md | 47 --- docker/Dockerfile | 11 +- .../{chanson-05.mp3 => ainsi-soit-il.mp3} | Bin ...nson-01.mp3 => ce-livre-est-une-facon.mp3} | Bin .../{chanson-09.mp3 => coder-la-liberte.mp3} | Bin ...08.mp3 => des-cercles-qui-se-croisent.mp3} | Bin .../{chanson-04.mp3 => inverser-les-flux.mp3} | Bin ...on-06.mp3 => la-croissance-une-option.mp3} | Bin .../{chanson-03.mp3 => les-asymetries.mp3} | Bin ...anson-07.mp3 => monnaie-libre-essence.mp3} | Bin ...hanson-02.mp3 => un-don-qui-se-mesure.mp3} | Bin server/api/admin/chapters/[slug].delete.ts | 16 ++ server/api/admin/chapters/index.post.ts | 29 ++ server/api/admin/chapters/index.put.ts | 29 ++ server/api/admin/content/config.put.ts | 2 +- server/api/content/config.get.ts | 2 +- server/middleware/redirects.ts | 13 + ...drome.config.yml => bookplayer.config.yml} | 240 ++++++---------- site/pages/autonomie.yml | 46 +++ site/pages/ecouter.yml | 7 - site/pages/en-musique.yml | 7 + site/pages/evenement.yml | 5 + site/pages/home.yml | 30 +- site/pages/{lire.yml => modele-eco.yml} | 4 +- site/site.yml | 23 +- 70 files changed, 2125 insertions(+), 1385 deletions(-) create mode 100644 app/composables/useKeyboardShortcuts.ts delete mode 100644 app/data/librodrome.config.yml create mode 100644 app/pages/autonomie.vue rename app/pages/{ecouter => en-musique}/index.vue (51%) create mode 100644 app/pages/evenement.vue rename app/pages/{lire => modele-eco}/[slug].vue (95%) rename app/pages/{lire => modele-eco}/index.vue (71%) create mode 100644 content/book/01-introduction.md create mode 100644 content/book/02-don.md create mode 100644 content/book/03-mesure.md create mode 100644 content/book/04-monnaie.md create mode 100644 content/book/05-trm.md create mode 100644 content/book/06-economie.md create mode 100644 content/book/07-echange.md create mode 100644 content/book/08-institution.md create mode 100644 content/book/09-greffes.md create mode 100644 content/book/10-maintenant.md create mode 100644 content/book/11-annexes.md delete mode 100644 content/book/annexes.md delete mode 100644 content/book/autres-greffes.md delete mode 100644 content/book/creer-une-economie.md delete mode 100644 content/book/de-quel-don-parlons-nous.md delete mode 100644 content/book/echanger.md delete mode 100644 content/book/et-maintenant.md delete mode 100644 content/book/introduction.md delete mode 100644 content/book/la-mesure-du-don.md delete mode 100644 content/book/la-trm.md delete mode 100644 content/book/raison-d-etre-d-une-monnaie.md delete mode 100644 content/book/relation-institutionnelle.md rename public/audio/{chanson-05.mp3 => ainsi-soit-il.mp3} (100%) rename public/audio/{chanson-01.mp3 => ce-livre-est-une-facon.mp3} (100%) rename public/audio/{chanson-09.mp3 => coder-la-liberte.mp3} (100%) rename public/audio/{chanson-08.mp3 => des-cercles-qui-se-croisent.mp3} (100%) rename public/audio/{chanson-04.mp3 => inverser-les-flux.mp3} (100%) rename public/audio/{chanson-06.mp3 => la-croissance-une-option.mp3} (100%) rename public/audio/{chanson-03.mp3 => les-asymetries.mp3} (100%) rename public/audio/{chanson-07.mp3 => monnaie-libre-essence.mp3} (100%) rename public/audio/{chanson-02.mp3 => un-don-qui-se-mesure.mp3} (100%) create mode 100644 server/api/admin/chapters/[slug].delete.ts create mode 100644 server/api/admin/chapters/index.post.ts create mode 100644 server/api/admin/chapters/index.put.ts create mode 100644 server/middleware/redirects.ts rename site/{librodrome.config.yml => bookplayer.config.yml} (85%) create mode 100644 site/pages/autonomie.yml delete mode 100644 site/pages/ecouter.yml create mode 100644 site/pages/en-musique.yml create mode 100644 site/pages/evenement.yml rename site/pages/{lire.yml => modele-eco.yml} (72%) diff --git a/app/app.config.ts b/app/app.config.ts index 1a71a36..411a1bd 100644 --- a/app/app.config.ts +++ b/app/app.config.ts @@ -8,8 +8,8 @@ export default defineAppConfig({ height: '4rem', nav: [ { label: 'Autonomie', to: '/autonomie' }, - { label: 'Modèle éco', to: '/lire' }, - { label: 'En musique', to: '/ecouter' }, + { label: 'Modèle éco', to: '/modele-eco' }, + { label: 'En musique', to: '/en-musique' }, { label: 'Évènement', to: '/evenement' }, { label: 'À propos', to: '/a-propos' }, ], diff --git a/app/app.vue b/app/app.vue index 207714b..17b182a 100644 --- a/app/app.vue +++ b/app/app.vue @@ -22,7 +22,7 @@ useHead({ return title ? `${title} — Le Librodrome` : 'Le librodrome' }, meta: [ - { name: 'description', content: 'Une économie du don — enfin concevable. Un livre et 9 chansons, lecture guidée et écoute libre.' }, + { name: 'description', content: 'Une économie du don — enfin concevable. Un livre et des chansons, lecture guidée et écoute libre.' }, ], }) diff --git a/app/assets/css/main.css b/app/assets/css/main.css index a678c75..9f99248 100644 --- a/app/assets/css/main.css +++ b/app/assets/css/main.css @@ -97,24 +97,24 @@ a { color: hsl(var(--color-text)) !important; } -/* white with opacity → dark text with same opacity */ -.palette-light .text-white\/20 { color: hsl(var(--color-text) / 0.2) !important; } -.palette-light .text-white\/30 { color: hsl(var(--color-text) / 0.3) !important; } -.palette-light .text-white\/40 { color: hsl(var(--color-text) / 0.4) !important; } -.palette-light .text-white\/45 { color: hsl(var(--color-text) / 0.45) !important; } -.palette-light .text-white\/50 { color: hsl(var(--color-text) / 0.5) !important; } -.palette-light .text-white\/60 { color: hsl(var(--color-text) / 0.6) !important; } -.palette-light .text-white\/70 { color: hsl(var(--color-text) / 0.7) !important; } -.palette-light .text-white\/80 { color: hsl(var(--color-text) / 0.8) !important; } -.palette-light .text-white\/85 { color: hsl(var(--color-text) / 0.85) !important; } +/* white with opacity → dark text with boosted opacity for punch */ +.palette-light .text-white\/20 { color: hsl(var(--color-text) / 0.28) !important; } +.palette-light .text-white\/30 { color: hsl(var(--color-text) / 0.38) !important; } +.palette-light .text-white\/40 { color: hsl(var(--color-text) / 0.48) !important; } +.palette-light .text-white\/45 { color: hsl(var(--color-text) / 0.52) !important; } +.palette-light .text-white\/50 { color: hsl(var(--color-text) / 0.58) !important; } +.palette-light .text-white\/60 { color: hsl(var(--color-text) / 0.68) !important; } +.palette-light .text-white\/70 { color: hsl(var(--color-text) / 0.78) !important; } +.palette-light .text-white\/80 { color: hsl(var(--color-text) / 0.88) !important; } +.palette-light .text-white\/85 { color: hsl(var(--color-text) / 0.92) !important; } -/* white backgrounds → surface tones */ -.palette-light .bg-white\/5 { background-color: hsl(var(--color-text) / 0.04) !important; } -.palette-light .bg-white\/8 { background-color: hsl(var(--color-text) / 0.06) !important; } -.palette-light .bg-white\/10 { background-color: hsl(var(--color-text) / 0.07) !important; } +/* white backgrounds → surface tones with more contrast */ +.palette-light .bg-white\/5 { background-color: hsl(var(--color-primary) / 0.05) !important; } +.palette-light .bg-white\/8 { background-color: hsl(var(--color-primary) / 0.07) !important; } +.palette-light .bg-white\/10 { background-color: hsl(var(--color-primary) / 0.09) !important; } -/* borders */ -.palette-light .border-white\/8 { border-color: hsl(var(--color-text) / 0.1) !important; } +/* borders with primary tint */ +.palette-light .border-white\/8 { border-color: hsl(var(--color-primary) / 0.15) !important; } /* hover overrides */ .palette-light .hover\:text-white:hover, @@ -123,42 +123,43 @@ a { color: hsl(var(--color-text)) !important; } .palette-light .hover\:text-white\/60:hover { - color: hsl(var(--color-text) / 0.6) !important; + color: hsl(var(--color-text) / 0.7) !important; } .palette-light .hover\:bg-white\/5:hover { - background-color: hsl(var(--color-text) / 0.04) !important; + background-color: hsl(var(--color-primary) / 0.08) !important; } .palette-light .hover\:bg-white\/10:hover { - background-color: hsl(var(--color-text) / 0.07) !important; + background-color: hsl(var(--color-primary) / 0.12) !important; } /* group-hover overrides */ .palette-light .group:hover .group-hover\:text-primary\/60 { - color: hsl(var(--color-primary) / 0.6) !important; + color: hsl(var(--color-primary) / 0.7) !important; } /* placeholder overrides */ .palette-light .placeholder\:text-white\/30::placeholder { - color: hsl(var(--color-text) / 0.3) !important; + color: hsl(var(--color-text) / 0.35) !important; } /* Prose/content in light mode */ .palette-light .prose { color: hsl(var(--color-text)); } .palette-light .prose :where(h1,h2,h3,h4,h5,h6) { color: hsl(var(--color-text)); } -/* text-gradient in light mode — needs transparent fill override */ +/* text-gradient in light mode — vivid gradient */ .palette-light .text-gradient { - background-image: linear-gradient(to right, hsl(var(--color-primary)), hsl(var(--color-accent))); + background-image: linear-gradient(135deg, hsl(var(--color-primary)), hsl(var(--color-accent))); -webkit-background-clip: text; background-clip: text; -webkit-text-fill-color: transparent; color: transparent !important; } -/* card surfaces */ +/* card surfaces — subtle shadow for depth */ .palette-light .card-surface { background: hsl(var(--color-surface)) !important; - border-color: hsl(var(--color-text) / 0.1) !important; + border-color: hsl(var(--color-primary) / 0.12) !important; + box-shadow: 0 1px 3px hsl(var(--color-text) / 0.06); } /* btn-primary text stays white on colored bg */ @@ -166,17 +167,36 @@ a { color: white !important; } -/* input fields */ +/* input fields — cleaner contrast */ .palette-light input, .palette-light textarea { color: hsl(var(--color-text)); - background-color: hsl(var(--color-surface)); - border-color: hsl(var(--color-text) / 0.12); + background-color: white; + border-color: hsl(var(--color-text) / 0.18); +} + +.palette-light input:focus, +.palette-light textarea:focus { + border-color: hsl(var(--color-primary) / 0.5); + box-shadow: 0 0 0 3px hsl(var(--color-primary) / 0.1); } /* Ecouter view toggle buttons */ .palette-light .bg-white\/10 { - background-color: hsl(var(--color-text) / 0.1) !important; + background-color: hsl(var(--color-primary) / 0.1) !important; +} + +/* Light mode scrollbar — tinted with primary */ +.palette-light ::-webkit-scrollbar-thumb { + background: hsl(var(--color-primary) / 0.2); +} +.palette-light ::-webkit-scrollbar-thumb:hover { + background: hsl(var(--color-primary) / 0.35); +} + +/* Light mode selection — vivid */ +.palette-light ::selection { + background-color: hsl(var(--color-accent) / 0.25); } /* Page transitions */ diff --git a/app/components/admin/AdminMarkdownEditor.vue b/app/components/admin/AdminMarkdownEditor.vue index 3cbf9a3..1b6c00a 100644 --- a/app/components/admin/AdminMarkdownEditor.vue +++ b/app/components/admin/AdminMarkdownEditor.vue @@ -1,34 +1,57 @@