HS: hide strategy config (+3 tests)

Three parts: (a) `runtime.sx` hs-hide-one!/hs-show-one! consult a new
`_hs-hide-strategies` dict (and `_hs-default-hide-strategy` override)
before falling through to the built-in display/opacity/etc. cases. The
strategy fn is called directly with (op, el, arg). New setters
`hs-set-hide-strategies!` and `hs-set-default-hide-strategy!`. (b)
`generate-sx-tests.py` `_hs_config_setup_ops` recognises
`_hyperscript.config.defaultHideShowStrategy = "X"`, `delete …default…`,
and `hideShowStrategies = { NAME: function (op, el, arg) { if …
classList.add/remove } }` with brace-matched function body extraction.
(c) Pre-setup emitter handles `__hs_config__` pseudo-name by emitting
the SX expression as-is (not a window.X = Y assignment).

Suite hs-upstream-hide: 12/16 → 15/16. Remaining test
(`hide element then show element retains original display`) needs
`on click 1 hide` / `on click 2 show` count-filtered events — separate
feature. Smoke 0-195: 162/195 unchanged.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-24 06:25:58 +00:00
parent 65d4c70638
commit beb120baf7
4 changed files with 224 additions and 69 deletions

View File

@@ -7003,6 +7003,7 @@
))
(deftest "can hide element, with tailwindcss hidden class default strategy"
(hs-cleanup!)
(hs-set-default-hide-strategy! "twDisplay")
(let ((_el-div (dom-create-element "div")))
(dom-set-attr _el-div "_" "on click hide")
(dom-append (dom-body) _el-div)
@@ -7017,6 +7018,7 @@
))
(deftest "can hide element, with tailwindcss invisible class default strategy"
(hs-cleanup!)
(hs-set-default-hide-strategy! "twVisibility")
(let ((_el-div (dom-create-element "div")))
(dom-set-attr _el-div "_" "on click hide")
(dom-append (dom-body) _el-div)
@@ -7031,6 +7033,7 @@
))
(deftest "can hide element, with tailwindcss opacity-0 class default strategy"
(hs-cleanup!)
(hs-set-default-hide-strategy! "twOpacity")
(let ((_el-div (dom-create-element "div")))
(dom-set-attr _el-div "_" "on click hide")
(dom-append (dom-body) _el-div)
@@ -7046,6 +7049,7 @@
))
(deftest "can show element, with tailwindcss removing hidden class default strategy"
(hs-cleanup!)
(hs-set-default-hide-strategy! "twDisplay")
(let ((_el-div (dom-create-element "div")))
(dom-add-class _el-div "hidden")
(dom-set-attr _el-div "_" "on click show")
@@ -7062,6 +7066,7 @@
))
(deftest "can show element, with tailwindcss removing invisible class default strategy"
(hs-cleanup!)
(hs-set-default-hide-strategy! "twVisibility")
(let ((_el-div (dom-create-element "div")))
(dom-add-class _el-div "invisible")
(dom-set-attr _el-div "_" "on click show")
@@ -7078,6 +7083,7 @@
))
(deftest "can show element, with tailwindcss removing opacity-0 class default strategy"
(hs-cleanup!)
(hs-set-default-hide-strategy! "twOpacity")
(let ((_el-div (dom-create-element "div")))
(dom-add-class _el-div "opacity-0")
(dom-set-attr _el-div "_" "on click show")
@@ -7424,6 +7430,7 @@
(defsuite "hs-upstream-hide"
(deftest "can configure hidden as the default hide strategy"
(hs-cleanup!)
(hs-set-default-hide-strategy! "hidden")
(let ((_el-div (dom-create-element "div")))
(dom-set-attr _el-div "_" "on click hide")
(dom-append (dom-body) _el-div)
@@ -7431,6 +7438,7 @@
(assert (!= (dom-get-attr _el-div "hidden") ""))
(dom-dispatch _el-div "click" nil)
(assert= (dom-get-attr _el-div "hidden") "")
(hs-set-default-hide-strategy! nil)
))
(deftest "can filter hide via the when clause"
(hs-cleanup!)
@@ -7567,6 +7575,7 @@
))
(deftest "can hide with custom strategy"
(hs-cleanup!)
(hs-set-hide-strategies! {:myHide (fn (op el arg) (if (= op "hide") (dom-add-class el "foo") (dom-remove-class el "foo")))})
(let ((_el-div (dom-create-element "div")))
(dom-set-attr _el-div "_" "on click hide with myHide")
(dom-append (dom-body) _el-div)
@@ -7577,6 +7586,8 @@
))
(deftest "can set default to custom strategy"
(hs-cleanup!)
(hs-set-default-hide-strategy! "myHide")
(hs-set-hide-strategies! {:myHide (fn (op el arg) (if (= op "hide") (dom-add-class el "foo") (dom-remove-class el "foo")))})
(let ((_el-div (dom-create-element "div")))
(dom-set-attr _el-div "_" "on click hide")
(dom-append (dom-body) _el-div)