From 4baf16ac132c8940657d87eb309a0dc076285ec7 Mon Sep 17 00:00:00 2001 From: giles Date: Mon, 27 Apr 2026 02:35:34 +0000 Subject: [PATCH] HS: halt default no longer stops propagation (+1) Track halt mode via __hs-no-stop flag; skip stopPropagation when handler raised hs-halt-default (from 'halt default'). All other halt variants (halt, halt the event, halt bubbling) unchanged. Co-Authored-By: Claude Sonnet 4.6 --- lib/hyperscript/runtime.sx | 4 ++-- shared/static/wasm/sx/hs-runtime.sx | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/hyperscript/runtime.sx b/lib/hyperscript/runtime.sx index 66223707..13b52bc0 100644 --- a/lib/hyperscript/runtime.sx +++ b/lib/hyperscript/runtime.sx @@ -69,7 +69,7 @@ (fn (target event-name handler) (let - ((wrapped (fn (event) (do (host-set! meta "caller" _hs-on-caller) (guard (e ((and (not (= event-name "exception")) (not (= event-name "error"))) (dom-dispatch target "exception" {:error e})) (true (raise e))) (handler event)) (host-call event "stopPropagation"))))) + ((wrapped (fn (event) (do (host-set! meta "caller" _hs-on-caller) (let ((__hs-no-stop false)) (guard (e ((and (not (= event-name "exception")) (not (= event-name "error"))) (do (when (and (list? e) (= (first e) "hs-halt-default")) (set! __hs-no-stop true)) (when (not __hs-no-stop) (dom-dispatch target "exception" {:error e})))) (true (raise e))) (handler event)) (when (not __hs-no-stop) (host-call event "stopPropagation"))))))) (let ((unlisten (dom-listen target event-name wrapped)) (prev (or (dom-get-data target "hs-unlisteners") (list)))) @@ -561,7 +561,7 @@ (do (host-call ev "preventDefault") (host-call ev "stopPropagation"))))) - (when (not (= mode "the-event")) (raise (list "hs-return" nil)))))) + (when (not (= mode "the-event")) (raise (list (if (= mode "default") "hs-halt-default" "hs-return") nil)))))) (define hs-select! (fn (target) (host-call target "select" (list)))) diff --git a/shared/static/wasm/sx/hs-runtime.sx b/shared/static/wasm/sx/hs-runtime.sx index 66223707..13b52bc0 100644 --- a/shared/static/wasm/sx/hs-runtime.sx +++ b/shared/static/wasm/sx/hs-runtime.sx @@ -69,7 +69,7 @@ (fn (target event-name handler) (let - ((wrapped (fn (event) (do (host-set! meta "caller" _hs-on-caller) (guard (e ((and (not (= event-name "exception")) (not (= event-name "error"))) (dom-dispatch target "exception" {:error e})) (true (raise e))) (handler event)) (host-call event "stopPropagation"))))) + ((wrapped (fn (event) (do (host-set! meta "caller" _hs-on-caller) (let ((__hs-no-stop false)) (guard (e ((and (not (= event-name "exception")) (not (= event-name "error"))) (do (when (and (list? e) (= (first e) "hs-halt-default")) (set! __hs-no-stop true)) (when (not __hs-no-stop) (dom-dispatch target "exception" {:error e})))) (true (raise e))) (handler event)) (when (not __hs-no-stop) (host-call event "stopPropagation"))))))) (let ((unlisten (dom-listen target event-name wrapped)) (prev (or (dom-get-data target "hs-unlisteners") (list)))) @@ -561,7 +561,7 @@ (do (host-call ev "preventDefault") (host-call ev "stopPropagation"))))) - (when (not (= mode "the-event")) (raise (list "hs-return" nil)))))) + (when (not (= mode "the-event")) (raise (list (if (= mode "default") "hs-halt-default" "hs-return") nil)))))) (define hs-select! (fn (target) (host-call target "select" (list))))