From 8574a97e7bbf2d2a67dc5c743f4d1eb67610e715 Mon Sep 17 00:00:00 2001
From: Fuwn <contact@fuwn.net>
Date: Fri, 22 May 2026 14:04:16 +0000
Subject: fix(layout): preserve list panel when clicking action buttons in
 summary

The global animateDetails handler in +layout.svelte runs on every
window click, unconditionally finding the nearest <summary>,
preventDefault'ing the native toggle, and manually toggling the
parent <details>. That left no way for child handlers to opt out --
clicking Roulette or Refresh inside the list title still toggled
the panel. Skip the takeover (and stop the native toggle) when the
click target is an interactive element. Reverts the now-unneeded
slot wrapper in ListTitle from 0d46fa54.
---
 src/routes/+layout.svelte | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

(limited to 'src/routes/+layout.svelte')

diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte
index 9ad33ca9..71d74adb 100644
--- a/src/routes/+layout.svelte
+++ b/src/routes/+layout.svelte
@@ -143,8 +143,15 @@ const handleScroll = () => {
 const detailsAnimations = new WeakMap<HTMLDetailsElement, Animation>();
 
 const animateDetails = (e: MouseEvent) => {
-	const summary = (e.target as HTMLElement | null)?.closest("summary");
+	const target = e.target as HTMLElement | null;
+	const summary = target?.closest("summary");
 	if (!summary) return;
+
+	if (target?.closest("button, a, input, select, textarea, label")) {
+		e.preventDefault();
+		return;
+	}
+
 	const details = summary.parentElement as HTMLDetailsElement | null;
 	if (!details || details.tagName !== "DETAILS") return;
 	if (reducesMotion()) return;
-- 
cgit v1.2.3

