$1') .replace(/^### (.+)$/gm, '
') - .replace(/^(?!<[hp])(.+)/gm, '
$1
') + .replace(/^(?!<[hpulob])(.+)/gm, '$1
') }) @@ -64,14 +103,23 @@ const renderedHtml = computed(() => { overflow: hidden; } -.md-tabs { +.md-toolbar { display: flex; + align-items: center; + justify-content: space-between; background: hsl(20 8% 6%); border-bottom: 1px solid hsl(20 8% 14%); } +.md-tabs { + display: flex; +} + .md-tab { - padding: 0.5rem 1rem; + display: flex; + align-items: center; + gap: 0.375rem; + padding: 0.5rem 0.875rem; border: none; background: none; color: hsl(20 8% 50%); @@ -85,6 +133,39 @@ const renderedHtml = computed(() => { background: hsl(20 8% 10%); } +.md-fullscreen { + padding: 0.5rem 0.75rem; + color: hsl(20 8% 40%); + transition: color 0.2s; +} +.md-fullscreen:hover, +.md-fullscreen--active { color: white; } + +.md-body { + display: flex; +} + +.md-body--split .md-textarea, +.md-body--split .md-preview { + width: 50%; +} + +.md-body--split .md-preview { + border-left: 1px solid hsl(20 8% 14%); +} + +.md-body--fullscreen { + position: fixed; + inset: 0; + z-index: 50; + background: hsl(20 8% 4%); +} + +.md-body--fullscreen .md-textarea, +.md-body--fullscreen .md-preview { + height: 100vh; +} + .md-textarea { width: 100%; padding: 1rem; @@ -95,7 +176,8 @@ const renderedHtml = computed(() => { font-size: 0.85rem; line-height: 1.7; resize: vertical; - min-height: 20rem; + min-height: 24rem; + tab-size: 2; } .md-textarea:focus { @@ -104,7 +186,9 @@ const renderedHtml = computed(() => { .md-preview { padding: 1rem; - min-height: 20rem; + min-height: 24rem; + max-height: 70vh; + overflow-y: auto; background: hsl(20 8% 4%); } diff --git a/app/components/admin/AdminSidebar.vue b/app/components/admin/AdminSidebar.vue index b7882e8..c268f01 100644 --- a/app/components/admin/AdminSidebar.vue +++ b/app/components/admin/AdminSidebar.vue @@ -27,17 +27,17 @@ Accueil -
-
-
- {{ bpContent?.cover.subtitle }}
-- {{ bpContent?.cover.description }} -
- -')
+ .replace(/\n/g, '
')
+ .replace(/^/, '
') + .replace(/$/, '
') +}) + +// ── Per-track color hues (9 tracks) ── +const trackHues: [number, number][] = [ + [15, 35], // 1 Ce livre est une façon + [350, 15], // 2 De quel don nous parlons + [36, 50], // 3 Les asymétries + [170, 200], // 4 Inverser les flux + [220, 250], // 5 Ainsi soit-il + [270, 300], // 6 La croissance + [320, 345], // 7 Monnaie libre + [150, 170], // 8 Créer une économie + [190, 220], // 9 Coder la liberté ] const sceneVars = computed(() => { - const idx = phase.value === 'reading' ? chapterIdx.value + 1 : 0 - const [h1, h2] = chapterHues[idx] ?? chapterHues[0] + const [h1, h2] = trackHues[trackIdx.value] ?? trackHues[0] return { '--scene-h1': h1, '--scene-h2': h2 } as Record