/* === ANIMATION TITRE-NAV (toutes les pages) === */ function animerTitreNav() { document.querySelectorAll('.fenetre-nom').forEach(el => { el.innerHTML = el.textContent.split('').map((c, i) => { if (c === ' ') return ' '; const delayColor = (i * 0.3).toFixed(1); const delayLevite = (Math.random() * 4).toFixed(2); const duree = (3 + Math.random() * 3).toFixed(2); return `${c}`; }).join(''); }); } /* === /NOW (index.html) === */ function afficherNow() { const phrasesNow = [ "/now : faut que je fasses les courses.", "/now : les arbres vibrent !", "/now : les mains, les jambes, avancent..", "/now : lave toi le visage.", "/now : il pleut, et c'est très bien comme ça.", "/now : pas mal la page d'accueil !", "/now : i love my computer", "/now : demain je serais en cours, j'espère", "/now : je resterais auprès de toi pour toujours", "/now : je serais toi j'irais prendre l'air", "/now : je dois vraiment aller dormir la" ]; const spanNow = document.querySelector('.now'); if (spanNow) { const indexAleatoire = Math.floor(Math.random() * phrasesNow.length); spanNow.textContent = phrasesNow[indexAleatoire]; } } /* === GRILLE ALBUMS (reviews/index.html) === */ function toSlug(titre) { return titre .toLowerCase() .normalize('NFD').replace(/[\u0300-\u036f]/g, '') .replace(/\s+/g, '-') .replace(/[^a-z0-9-]/g, ''); } function chargerAlbums() { fetch('data/albums.json') .then(r => r.json()) .then(albums => { const grille = document.getElementById('grille'); albums.forEach(album => { const carte = document.createElement('div'); carte.className = 'carte'; const media = album.cover ? `${album.titre}` : `
${album.titre}
`; const fav = album.favoris ? '' : ''; carte.innerHTML = ` ${fav} ${media}
${album.titre}
${album.artiste}
`; carte.addEventListener('mouseenter', () => { grille.classList.add('hovering'); carte.classList.add('actif'); }); carte.addEventListener('mouseleave', () => { grille.classList.remove('hovering'); carte.classList.remove('actif'); }); carte.addEventListener('click', () => { window.location.href = `albums/${toSlug(album.titre)}.html`; }); grille.appendChild(carte); }); }) .catch(() => { document.getElementById('grille').textContent = 'impossible de charger les albums.'; }); } /* === FEED DEPECHES (depeches.html) === */ async function chargerDepeches() { const feed = document.getElementById('feed'); async function parseTexte(texte) { const urlRegex = /(https?:\/\/[^\s]+)/g; const urls = texte.match(urlRegex) || []; let html = texte.replace(urlRegex, '___URL___'); const embeds = await Promise.all(urls.map(async url => { if (url.includes('soundcloud.com')) { try { const r = await fetch(`https://soundcloud.com/oembed?format=json&url=${encodeURIComponent(url)}&maxwidth=500`); const data = await r.json(); return data.html; } catch { return `${url}`; } } if (url.includes('youtube.com') || url.includes('youtu.be')) { const id = url.match(/(?:v=|youtu\.be\/)([^&\s]+)/)?.[1]; if (id) return ``; } return `${url}`; })); embeds.forEach(e => { html = html.replace('___URL___', e); }); return html; } try { const r = await fetch('/api/depeches'); const depeches = await r.json(); feed.innerHTML = ''; if (depeches.length === 0) { feed.innerHTML = '

aucune dépêche pour l\'instant.

'; return; } for (const d of depeches) { const el = document.createElement('div'); el.className = 'depeche'; const texteHtml = await parseTexte(d.texte); const img = d.image ? `` : ''; el.innerHTML = `
ewen - ${d.date}
${texteHtml}
${img} `; feed.appendChild(el); } } catch { feed.innerHTML = '

impossible de charger les dépêches.

'; } } /* === LIGHTBOX (images dans les entrées) === */ function initLightbox() { const contenu = document.querySelector('.fenetre-contenu'); if (!contenu) return; contenu.addEventListener('click', e => { const img = e.target.closest('img:not(.thanks)'); if (!img) return; const overlay = document.createElement('div'); overlay.className = 'lightbox'; const fond = document.createElement('div'); fond.className = 'lightbox-fond'; overlay.appendChild(fond); const clone = document.createElement('img'); clone.className = 'lightbox-image'; clone.src = img.src; clone.alt = img.alt; overlay.appendChild(clone); const fermer = document.createElement('button'); fermer.className = 'lightbox-fermer'; fermer.innerHTML = '×'; overlay.appendChild(fermer); document.body.appendChild(overlay); overlay.addEventListener('click', e => { if (e.target === fond || e.target === fermer || e.target === overlay) { overlay.remove(); } }); document.addEventListener('keydown', function onKey(e) { if (e.key === 'Escape') { overlay.remove(); document.removeEventListener('keydown', onKey); } }); }); } /* === INIT === */ document.addEventListener('DOMContentLoaded', () => { animerTitreNav(); if (document.querySelector('.now')) { afficherNow(); } if (document.getElementById('grille')) { chargerAlbums(); } if (document.getElementById('feed')) { chargerDepeches(); } initLightbox(); });