diff --git a/src/content/ui/QuestionPanel.svelte b/src/content/ui/QuestionPanel.svelte index 523ec54..fe827e8 100644 --- a/src/content/ui/QuestionPanel.svelte +++ b/src/content/ui/QuestionPanel.svelte @@ -149,6 +149,53 @@ return Boolean(editableParent && editableParent.getAttribute("contenteditable") !== "false"); } + function stopNativeEvent(event) { + event?.stopPropagation?.(); + event?.stopImmediatePropagation?.(); + } + + function focusInputInContainer(container) { + const input = container?.querySelector?.("input"); + if (input) setTimeout(() => input.focus(), 0); + } + + function stopPanelPointerEvents(node) { + const events = ["pointerdown", "mousedown"]; + events.forEach((eventName) => node.addEventListener(eventName, stopNativeEvent)); + + return { + destroy() { + events.forEach((eventName) => node.removeEventListener(eventName, stopNativeEvent)); + }, + }; + } + + function focusContainerInputAction(node, options = {}) { + const handlePointerDown = (event) => { + stopNativeEvent(event); + if (event?.target?.closest?.("input, button")) return; + focusInputInContainer(node); + }; + const handleClick = (event) => { + if (event?.target?.closest?.("button")) return; + stopNativeEvent(event); + focusInputInContainer(node); + if (options.selectOther) selectSingleOption("Other"); + }; + + node.addEventListener("pointerdown", handlePointerDown); + node.addEventListener("mousedown", stopNativeEvent); + node.addEventListener("click", handleClick); + + return { + destroy() { + node.removeEventListener("pointerdown", handlePointerDown); + node.removeEventListener("mousedown", stopNativeEvent); + node.removeEventListener("click", handleClick); + }, + }; + } + function prevQuestion() { if (currentQuestionIndex > 0) { currentQuestionIndex--; @@ -310,7 +357,11 @@ {@const q = questions[currentQuestionIndex]} {@const key = q.id || `q_${currentQuestionIndex}`} -