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 @@
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=()"
}
}