Bouton PDF par chapitre, badges morceaux améliorés, PDF configurable admin, git sync admin→prod
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
- Bouton PDF blanc par chapitre avec numéro de page (ChapterHeader) - Badges morceaux plus visibles (bordure, poids, hover) dans ChapterHeader et SongBadges - PDF viewer : page cible + panneau signets ouverts par défaut (BookPdfReader) - Config YAML : pdfFile dans book, chapterPages pour le mapping chapitre→page - Admin book : section PDF du livre avec chemin éditable et sauvegarde - Git sync automatique : chaque sauvegarde admin commit+push en prod (ADMIN_GIT_SYNC=true) - Docker : git installé en prod, volumes pour .git/site/content/public Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -20,13 +20,24 @@
|
||||
<button
|
||||
v-for="song in songs"
|
||||
:key="song.id"
|
||||
class="inline-flex items-center gap-1.5 rounded-full bg-primary/10 px-3 py-1 text-xs font-medium text-primary transition-colors hover:bg-primary/20"
|
||||
class="song-badge-btn"
|
||||
@click="playSong(song)"
|
||||
>
|
||||
<div class="i-lucide-music h-3 w-3" />
|
||||
{{ song.title }}
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<!-- PDF button -->
|
||||
<div v-if="pdfPage" class="mt-3">
|
||||
<button class="pdf-btn" @click="showPdf = true">
|
||||
<div class="i-lucide-book-open h-3.5 w-3.5" />
|
||||
<span>Lire dans le PDF</span>
|
||||
<span class="pdf-page-badge">p.{{ pdfPage }}</span>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<BookPdfReader v-model="showPdf" :page="pdfPage" />
|
||||
</header>
|
||||
</template>
|
||||
|
||||
@@ -47,6 +58,9 @@ const { loadAndPlay } = useAudioPlayer()
|
||||
await bookData.init()
|
||||
|
||||
const songs = computed(() => bookData.getChapterSongs(props.chapterSlug))
|
||||
const pdfPage = computed(() => bookData.getChapterPage(props.chapterSlug))
|
||||
|
||||
const showPdf = ref(false)
|
||||
|
||||
function playSong(song: Song) {
|
||||
loadAndPlay(song)
|
||||
@@ -59,4 +73,57 @@ function playSong(song: Song) {
|
||||
padding-bottom: 0.75rem;
|
||||
border-bottom: 2px solid hsl(var(--color-primary) / 0.4);
|
||||
}
|
||||
|
||||
.song-badge-btn {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
gap: 0.375rem;
|
||||
border-radius: 9999px;
|
||||
padding: 0.375rem 0.875rem;
|
||||
font-size: 0.8rem;
|
||||
font-weight: 600;
|
||||
background: hsl(var(--color-primary) / 0.12);
|
||||
color: hsl(var(--color-primary) / 0.85);
|
||||
border: 1px solid hsl(var(--color-primary) / 0.25);
|
||||
cursor: pointer;
|
||||
transition: all 0.2s;
|
||||
}
|
||||
|
||||
.song-badge-btn:hover {
|
||||
background: hsl(var(--color-primary) / 0.2);
|
||||
border-color: hsl(var(--color-primary) / 0.4);
|
||||
box-shadow: 0 2px 8px hsl(var(--color-primary) / 0.15);
|
||||
transform: translateY(-1px);
|
||||
}
|
||||
|
||||
.pdf-btn {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
gap: 0.5rem;
|
||||
padding: 0.5rem 1rem;
|
||||
border-radius: 0.5rem;
|
||||
background: hsl(0 0% 96%);
|
||||
color: hsl(0 0% 15%);
|
||||
font-size: 0.8rem;
|
||||
font-weight: 600;
|
||||
border: 1px solid hsl(0 0% 88%);
|
||||
cursor: pointer;
|
||||
transition: all 0.2s;
|
||||
}
|
||||
|
||||
.pdf-btn:hover {
|
||||
background: white;
|
||||
box-shadow: 0 2px 12px hsl(0 0% 100% / 0.25);
|
||||
transform: translateY(-1px);
|
||||
}
|
||||
|
||||
.pdf-page-badge {
|
||||
font-family: var(--font-mono, monospace);
|
||||
font-size: 0.7rem;
|
||||
font-weight: 500;
|
||||
padding: 0.1rem 0.4rem;
|
||||
border-radius: 0.25rem;
|
||||
background: hsl(0 0% 88%);
|
||||
color: hsl(0 0% 35%);
|
||||
}
|
||||
</style>
|
||||
|
||||
Reference in New Issue
Block a user