diff --git a/scripts/postbuild-csp.mjs b/scripts/postbuild-csp.mjs
index da48462..24a25bf 100644
--- a/scripts/postbuild-csp.mjs
+++ b/scripts/postbuild-csp.mjs
@@ -14,6 +14,20 @@ function* walk(dir) {
}
}
+// La politique complète (hors script-src) est lue depuis build/_headers,
+// unique source de vérité partagée avec .htaccess
+const headers = readFileSync(join(BUILD_DIR, '_headers'), 'utf8');
+const cspLine = headers
+ .split('\n')
+ .map((line) => line.trim())
+ .find((line) => line.startsWith('Content-Security-Policy:'));
+if (!cspLine) throw new Error('[csp] Content-Security-Policy introuvable dans build/_headers');
+const sharedPolicy = cspLine
+ .slice('Content-Security-Policy:'.length)
+ .trim()
+ // frame-ancestors est ignoré (et logué) dans une balise meta : il reste porté par l'en-tête HTTP
+ .replace(/frame-ancestors 'none';\s*/, '');
+
let pages = 0;
for (const file of walk(BUILD_DIR)) {
@@ -28,7 +42,7 @@ for (const file of walk(BUILD_DIR)) {
if (hashes.size === 0) continue;
- const csp = `default-src 'self'; script-src 'self' ${[...hashes].join(' ')}`;
+ const csp = `default-src 'self'; script-src 'self' ${[...hashes].join(' ')}; ${sharedPolicy}`;
const meta = ``;
const anchor = html.match(//);
@@ -41,4 +55,4 @@ for (const file of walk(BUILD_DIR)) {
pages++;
}
-console.log(`[csp] meta CSP injectée dans ${pages} page(s)`);
+console.log(`[csp] meta CSP complète injectée dans ${pages} page(s)`);
diff --git a/src/lib/audio-bus.svelte.ts b/src/lib/audio-bus.svelte.ts
new file mode 100644
index 0000000..0381c45
--- /dev/null
+++ b/src/lib/audio-bus.svelte.ts
@@ -0,0 +1,14 @@
+let current: HTMLAudioElement | null = $state(null);
+
+export function claimAudio(element: HTMLAudioElement) {
+ if (current && current !== element) {
+ current.pause();
+ }
+ current = element;
+}
+
+export function releaseAudio(element: HTMLAudioElement) {
+ if (current === element) {
+ current = null;
+ }
+}
diff --git a/src/lib/components/AudioPlayer.svelte b/src/lib/components/AudioPlayer.svelte
index 39d9eed..c015508 100644
--- a/src/lib/components/AudioPlayer.svelte
+++ b/src/lib/components/AudioPlayer.svelte
@@ -1,5 +1,6 @@