Compare commits

...
6 Commits
Author SHA1 Message Date
YvvandClaude Fable 5 38467bea10 build : packageManager épinglé + approbation des scripts de build en CI
ci/woodpecker/push/woodpecker Pipeline was successful
- le pnpm choisi par corepack dans l'image Docker ignorait l'allowlist
  pnpm.onlyBuiltDependencies de package.json (les pnpm 10 récents la
  lisent dans pnpm-workspace.yaml) → ERR_PNPM_IGNORED_BUILDS, exit 1
- packageManager: pnpm@10.29.3 (déterministe, identique au poste local)
- pnpm-workspace.yaml : onlyBuiltDependencies (@parcel/watcher,
  better-sqlite3, esbuild, sharp)
- vérifié : install à froid CI=true --frozen-lockfile exit 0, build zéro
  erreur, prod :3099 → 200

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-12 02:54:53 +02:00
YvvandClaude Fable 5 da2a8aed49 build : @yvv/nuxt-base en git+https + git dans l'étape build Docker
ci/woodpecker/push/woodpecker Pipeline failed
- la dép git+ssh échouait en CI : pas de clé SSH ni de binaire git dans
  l'étape build (ENOENT sur git clone) — seule la prod installait git
- package.json + pnpm-lock : git+https://git.open.us.org/… (#v0.1.0 →
  b1c6a2f, même commit épinglé) — nécessite le repo yvv-nuxt-base public
- git + ca-certificates ajoutés à l'étape build du Dockerfile
- vérifié : pnpm install + build zéro erreur, prod :3099 → 200

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-12 01:13:25 +02:00
YvvandClaude Opus 4.8 e64d4cf003 design(sceau): hexagramme 益 traits épais, coins nets, aspect carré
ci/woodpecker/push/woodpecker Pipeline failed
- viewBox 112×105, height 8, rx supprimé (rendu cut)
- géométrie calée sur les modèles IMAGES/PERVIER/Hexagrammes

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-03 06:54:36 +02:00
aya 483d226c8b empty commit
ci/woodpecker/push/woodpecker Pipeline failed
2026-07-24 23:25:51 +02:00
YvvandClaude Opus 4.8 069d206e94 feat(deps): adopte @yvv/nuxt-base via dépendance git (extends relatif retiré)
ci/woodpecker/manual/woodpecker Pipeline was successful
extends: ['../yvv-nuxt-base'] -> ['@yvv/nuxt-base'] + dépendance
git+ssh://gitea@git.open.us.org/yvv/yvv-nuxt-base.git#v0.1.0.
Rend le projet autonome de l'arborescence locale (débloque Docker/CI).
Build pnpm vert, prod :3099 -> 200, smoke moods OK (vars --color-*
distinctes automne/hiver, classes mood-* appliquées).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-24 18:15:44 +02:00
YvvandClaude Fable 5 5ec6474b37 feat: adoption layer yvv-nuxt-base — palette.ts délègue à useMood
- extends ../yvv-nuxt-base dans nuxt.config.ts
- application DOM (vars --color-*, palette-light/dark, color-scheme) via useMood(vars) + lightDarkClasses
- storageKey 'palette' et défaut 'ete' conservés — zéro migration utilisateur
- couleurs et API du store inchangées (currentPalette, colors, setPalette, applyToDOM)
- vérifié Playwright : 4 palettes × desktop/mobile au reload + switch à chaud via PaletteSelector, zéro erreur console, prod :3099 → 200
- CONTRIBUTING.md : mécanique déléguée documentée + blocant distribution layer

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-18 15:14:38 +02:00
8 changed files with 69 additions and 35 deletions
+1
View File
@@ -47,6 +47,7 @@ Les fichiers YAML sont dans `site/pages/`, organisés en sous-dossiers par secti
- Défaut : **été** (premier visiteur)
- Persisté en `localStorage('palette')` pour les visites suivantes
- CSS : variables `--color-primary`, `--color-accent`, etc. + classe `.palette-light`/`.palette-dark`
- Mécanique DOM (injection des variables, classes `mood-*`/`palette-*`, `color-scheme`, persistance) déléguée à `useMood` du layer `../yvv-nuxt-base` (`extends` dans `nuxt.config.ts`) — les couleurs restent définies ici. ⚠️ le layer est hors du repo : build Docker/CI cassera tant que la stratégie de distribution n'est pas tranchée (voir README du layer)
- Overrides light mode dans `main.css` (`.palette-light .text-white` → couleur adaptive)
- Admin : tous les `color: white` dans les composants admin sont remplacés par `hsl(var(--color-text))` sauf les boutons sur fond `hsl(var(--color-primary))` (`AdminSaveButton`, `.login-btn`)
+11 -11
View File
@@ -4,23 +4,23 @@
<main class="app-main">
<slot />
<!-- (Increase, #42) sceau hexagramme -->
<svg class="app-seal" viewBox="0 0 130 100" fill="currentColor" aria-hidden="true">
<!-- (Increase, #42) sceau hexagramme (traits épais, coins nets, ~carré) -->
<svg class="app-seal" viewBox="0 0 112 105" fill="currentColor" aria-hidden="true">
<!-- Line 6 (top) yang -->
<rect x="5" y="5" width="120" height="5" rx="1"/>
<rect x="6" y="6" width="100" height="8"/>
<!-- Line 5 yang -->
<rect x="5" y="22" width="120" height="5" rx="1"/>
<rect x="6" y="23" width="100" height="8"/>
<!-- Line 4 yin -->
<rect x="5" y="39" width="49" height="5" rx="1"/>
<rect x="76" y="39" width="49" height="5" rx="1"/>
<rect x="6" y="40" width="42" height="8"/>
<rect x="64" y="40" width="42" height="8"/>
<!-- Line 3 yin -->
<rect x="5" y="56" width="49" height="5" rx="1"/>
<rect x="76" y="56" width="49" height="5" rx="1"/>
<rect x="6" y="57" width="42" height="8"/>
<rect x="64" y="57" width="42" height="8"/>
<!-- Line 2 yin -->
<rect x="5" y="73" width="49" height="5" rx="1"/>
<rect x="76" y="73" width="49" height="5" rx="1"/>
<rect x="6" y="74" width="42" height="8"/>
<rect x="64" y="74" width="42" height="8"/>
<!-- Line 1 (bottom) yang -->
<rect x="5" y="90" width="120" height="5" rx="1"/>
<rect x="6" y="91" width="100" height="8"/>
</svg>
</main>
<LayoutTheFooter />
+31 -23
View File
@@ -75,36 +75,44 @@ const palettes: Record<PaletteName, PaletteColors> = {
},
}
export const usePaletteStore = defineStore('palette', () => {
const currentPalette = ref<PaletteName>(
(import.meta.client && localStorage.getItem('palette') as PaletteName) || 'ete',
// Chaque palette devient un "mood" du layer @yvv/nuxt-base : les couleurs
// (identité du projet) sont injectées en variables CSS --color-*, et les classes
// .palette-light / .palette-dark + color-scheme sont gérées par le mécanisme partagé.
const paletteMoods = (Object.entries(palettes) as [PaletteName, PaletteColors][]).map(
([id, c]) => ({
id,
isDark: !c.isLight,
vars: {
'--color-primary': c.primary,
'--color-accent': c.accent,
'--color-surface': c.surface,
'--color-bg': c.bg,
'--color-surface-light': c.surfaceLight,
'--color-text': c.text,
'--color-text-muted': c.textMuted,
},
}),
)
export const usePaletteStore = defineStore('palette', () => {
// Application DOM + persistance + light/dark déléguées au layer partagé.
// storageKey 'palette' conservé pour ne pas perdre les préférences existantes.
const { currentMood, setMood, initMood } = useMood(paletteMoods, {
storageKey: 'palette',
defaultId: 'ete',
syncColorMode: false, // librodrome n'utilise pas @nuxtjs/color-mode
lightDarkClasses: true,
})
const currentPalette = computed<PaletteName>(() => (currentMood.value as PaletteName) || 'ete')
const colors = computed(() => palettes[currentPalette.value])
const isLight = computed(() => colors.value.isLight)
function applyToDOM() {
if (!import.meta.client) return
const c = colors.value
const root = document.documentElement
const s = root.style
s.setProperty('--color-primary', c.primary)
s.setProperty('--color-accent', c.accent)
s.setProperty('--color-surface', c.surface)
s.setProperty('--color-bg', c.bg)
s.setProperty('--color-surface-light', c.surfaceLight)
s.setProperty('--color-text', c.text)
s.setProperty('--color-text-muted', c.textMuted)
// Toggle light/dark class for CSS overrides
root.classList.toggle('palette-light', c.isLight)
root.classList.toggle('palette-dark', !c.isLight)
s.setProperty('color-scheme', c.isLight ? 'light' : 'dark')
}
// Init depuis localStorage (SSR-safe : no-op côté serveur).
const applyToDOM = () => initMood()
function setPalette(name: PaletteName) {
currentPalette.value = name
if (import.meta.client) localStorage.setItem('palette', name)
applyToDOM()
setMood(name)
}
return {
+3
View File
@@ -11,6 +11,9 @@ WORKDIR /app
# Build
FROM base AS build
# git requis : dépendance @yvv/nuxt-base en git+https (l'image slim n'a pas git)
RUN apt-get update && apt-get -fy install git ca-certificates && rm -rf /var/cache/apt/*
RUN corepack enable
COPY package.json pnpm-lock.yaml ./
+1
View File
@@ -1,5 +1,6 @@
// https://nuxt.com/docs/api/configuration/nuxt-config
export default defineNuxtConfig({
extends: ['@yvv/nuxt-base'],
compatibilityDate: '2025-07-15',
devtools: { enabled: true },
+2
View File
@@ -2,6 +2,7 @@
"name": "librodrome",
"type": "module",
"private": true,
"packageManager": "pnpm@10.29.3",
"scripts": {
"build": "nuxt build && node scripts/fix-esm-imports.mjs",
"dev": "nuxt dev",
@@ -16,6 +17,7 @@
"@pinia/nuxt": "^0.11.3",
"@unocss/nuxt": "^66.6.0",
"@vueuse/nuxt": "^14.2.1",
"@yvv/nuxt-base": "git+https://git.open.us.org/yvv/yvv-nuxt-base.git#v0.1.0",
"better-sqlite3": "^12.6.2",
"nuxt": "^4.3.1",
"nuxt-umami": "^3.2.1",
+9
View File
@@ -26,6 +26,9 @@ importers:
'@vueuse/nuxt':
specifier: ^14.2.1
version: 14.2.1(magicast@0.5.2)(nuxt@4.3.1(@parcel/watcher@2.5.6)(@types/node@25.2.3)(@vue/compiler-sfc@3.5.28)(better-sqlite3@12.6.2)(cac@6.7.14)(db0@0.3.4(better-sqlite3@12.6.2))(ioredis@5.9.3)(magicast@0.5.2)(rollup@4.57.1)(terser@5.46.0)(typescript@5.9.3)(vite@7.3.1(@types/node@25.2.3)(jiti@2.6.1)(terser@5.46.0)(yaml@2.8.2))(yaml@2.8.2))(vue@3.5.28(typescript@5.9.3))
'@yvv/nuxt-base':
specifier: git+https://git.open.us.org/yvv/yvv-nuxt-base.git#v0.1.0
version: git+https://git.open.us.org/yvv/yvv-nuxt-base.git#b1c6a2f28052564d505dd05b363169cb97fb81b3
better-sqlite3:
specifier: ^12.6.2
version: 12.6.2
@@ -1916,6 +1919,10 @@ packages:
'@xtuc/long@4.2.2':
resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==}
'@yvv/nuxt-base@git+https://git.open.us.org/yvv/yvv-nuxt-base.git#b1c6a2f28052564d505dd05b363169cb97fb81b3':
resolution: {commit: b1c6a2f28052564d505dd05b363169cb97fb81b3, repo: https://git.open.us.org/yvv/yvv-nuxt-base.git, type: git}
version: 0.1.0
abbrev@3.0.1:
resolution: {integrity: sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==}
engines: {node: ^18.17.0 || >=20.5.0}
@@ -7004,6 +7011,8 @@ snapshots:
'@xtuc/long@4.2.2': {}
'@yvv/nuxt-base@git+https://git.open.us.org/yvv/yvv-nuxt-base.git#b1c6a2f28052564d505dd05b363169cb97fb81b3': {}
abbrev@3.0.1: {}
abort-controller@3.0.0:
+10
View File
@@ -0,0 +1,10 @@
# Les pnpm 10 récents lisent l'approbation des scripts de build ICI
# (la clé pnpm.onlyBuiltDependencies de package.json n'est plus honorée en CI)
packages:
- '.'
onlyBuiltDependencies:
- '@parcel/watcher'
- better-sqlite3
- esbuild
- sharp