From bd33ea480476c59c05abc333f764104574518224 Mon Sep 17 00:00:00 2001 From: KoalaDev <6156589+Shik3i@users.noreply.github.com> Date: Sun, 12 Jul 2026 06:31:24 +0200 Subject: [PATCH] feat(extension): implement accordion mutual exclusion behavior for settings details categories --- examples/Caddyfile.example | 2 +- extension/popup.html | 8 ++++---- extension/popup.js | 13 +++++++++++++ website/README.md | 2 +- website/template.html | 2 +- 5 files changed, 20 insertions(+), 7 deletions(-) diff --git a/examples/Caddyfile.example b/examples/Caddyfile.example index 85396ae..e74721e 100644 --- a/examples/Caddyfile.example +++ b/examples/Caddyfile.example @@ -84,7 +84,7 @@ sync.koalastuff.net { import security_headers header { # CSP hardened with base-uri and form-action limits - Content-Security-Policy "default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; connect-src 'self'; img-src 'self' data: blob:; object-src 'none'; frame-ancestors 'none'; base-uri 'none'; form-action 'none';" + Content-Security-Policy "default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; connect-src 'self'; img-src 'self' data:; object-src 'none'; frame-ancestors 'none'; base-uri 'none'; form-action 'none';" # Modern Permissions Policy (blocks browser hardware access for enhanced privacy) Permissions-Policy "camera=(), microphone=(), geolocation=(), payment=(), usb=()" diff --git a/extension/popup.html b/extension/popup.html index 6c73d62..cf435a9 100644 --- a/extension/popup.html +++ b/extension/popup.html @@ -813,7 +813,7 @@
-
+
👤 Profile & Theme
@@ -851,7 +851,7 @@
-
+
🔒 Privacy Settings
@@ -872,7 +872,7 @@
-
+
âš¡ Playback & Sync
@@ -910,7 +910,7 @@
-
+
🔧 Troubleshooting
diff --git a/extension/popup.js b/extension/popup.js index d392e3d..3510895 100644 --- a/extension/popup.js +++ b/extension/popup.js @@ -1375,6 +1375,19 @@ if (elements.langSelector) { }); } +// Accordion behavior for settings details categories (collapses others when one opens) +document.querySelectorAll('#tab-settings details.form-group').forEach(det => { + det.addEventListener('toggle', () => { + if (det.open) { + document.querySelectorAll('#tab-settings details.form-group').forEach(other => { + if (other !== det && other.open) { + other.removeAttribute('open'); + } + }); + } + }); +}); + elements.serverUrl.addEventListener('change', () => { let url = elements.serverUrl.value.trim(); if (url && !url.includes('://')) { diff --git a/website/README.md b/website/README.md index 94cb740..af7a637 100644 --- a/website/README.md +++ b/website/README.md @@ -90,7 +90,7 @@ sync.koalastuff.net { header @static Cache-Control "public, max-age=31536000, must-revalidate" header { - Content-Security-Policy "default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; connect-src 'self'; img-src 'self' data: blob:; object-src 'none'; frame-ancestors 'none'; base-uri 'none'; form-action 'none';" + Content-Security-Policy "default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; connect-src 'self'; img-src 'self' data:; object-src 'none'; frame-ancestors 'none'; base-uri 'none'; form-action 'none';" Permissions-Policy "camera=(), microphone=(), geolocation=(), payment=(), usb=()" Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" X-Content-Type-Options nosniff diff --git a/website/template.html b/website/template.html index 5c6f092..69e2098 100644 --- a/website/template.html +++ b/website/template.html @@ -1440,7 +1440,7 @@ # Hardened Security & Permission Policies import security_headers header { - Content-Security-Policy "default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; connect-src 'self'; img-src 'self' data: blob:; object-src 'none'; frame-ancestors 'none'; base-uri 'none'; form-action 'none';" + Content-Security-Policy "default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; connect-src 'self'; img-src 'self' data:; object-src 'none'; frame-ancestors 'none'; base-uri 'none'; form-action 'none';" Permissions-Policy "camera=(), microphone=(), geolocation=(), payment=(), usb=()" } }