diff --git a/hosts/ocaml/bin/sx_server.ml b/hosts/ocaml/bin/sx_server.ml
index bf2033cd..b7690320 100644
--- a/hosts/ocaml/bin/sx_server.ml
+++ b/hosts/ocaml/bin/sx_server.ml
@@ -713,13 +713,13 @@ let register_jit_hook env =
Sx_ref.jit_call_hook := Some (fun f args ->
match f with
| Lambda l ->
+ let fn_name = match l.l_name with Some n -> n | None -> "?" in
(match l.l_compiled with
| Some cl when not (Sx_vm.is_jit_failed cl) ->
(* Cached bytecode — run on VM, fall back to CEK on runtime error.
Log once per function name, then stay quiet. Don't disable. *)
(try Some (Sx_vm.call_closure cl args cl.vm_env_ref)
with e ->
- let fn_name = match l.l_name with Some n -> n | None -> "?" in
if not (Hashtbl.mem _jit_warned fn_name) then begin
Hashtbl.replace _jit_warned fn_name true;
Printf.eprintf "[jit] %s runtime fallback to CEK: %s\n%!" fn_name (Printexc.to_string e)
@@ -727,7 +727,6 @@ let register_jit_hook env =
None)
| Some _ -> None (* compile failed or disabled — CEK handles *)
| None ->
- let fn_name = match l.l_name with Some n -> n | None -> "?" in
if !_jit_compiling then None
else begin
_jit_compiling := true;
@@ -1578,9 +1577,16 @@ let http_inject_shell_statics env static_dir sx_sxc =
let project_dir = try Sys.getenv "SX_PROJECT_DIR" with Not_found ->
Filename.dirname (Filename.dirname static_dir) in
let templates_dir = project_dir ^ "/shared/sx/templates" in
- let client_libs = [
- templates_dir ^ "/cssx.sx";
- ] in
+ (* Client libraries: all .sx files in templates/client-libs/ *)
+ let client_libs_dir = templates_dir ^ "/client-libs" in
+ let extra_libs =
+ if Sys.file_exists client_libs_dir && Sys.is_directory client_libs_dir then
+ Array.to_list (Sys.readdir client_libs_dir)
+ |> List.filter (fun f -> Filename.check_suffix f ".sx")
+ |> List.sort String.compare
+ |> List.map (fun f -> client_libs_dir ^ "/" ^ f)
+ else [] in
+ let client_libs = (templates_dir ^ "/cssx.sx") :: extra_libs in
List.iter (fun path ->
if Sys.file_exists path then begin
let src = In_channel.with_open_text path In_channel.input_all in
@@ -1614,7 +1620,20 @@ let http_inject_shell_statics env static_dir sx_sxc =
(* Compute file hashes for cache busting *)
let sx_js_hash = file_hash (static_dir ^ "/scripts/sx-browser.js") in
let body_js_hash = file_hash (static_dir ^ "/scripts/body.js") in
- let wasm_hash = file_hash (static_dir ^ "/wasm/sx_browser.bc.wasm.js") in
+ (* Include SX source file hashes so browser cache busts when .sx files change *)
+ let sx_dir = static_dir ^ "/wasm/sx" in
+ let sx_files_hash =
+ if Sys.file_exists sx_dir && Sys.is_directory sx_dir then
+ let entries = Sys.readdir sx_dir in
+ Array.sort String.compare entries;
+ let combined = Array.fold_left (fun acc f ->
+ if Filename.check_suffix f ".sx" then
+ acc ^ file_hash (sx_dir ^ "/" ^ f)
+ else acc
+ ) "" entries in
+ String.sub (Digest.string combined |> Digest.to_hex) 0 12
+ else "" in
+ let wasm_hash = file_hash (static_dir ^ "/wasm/sx_browser.bc.wasm.js") ^ sx_files_hash in
(* Read CSS for inline injection *)
let tw_css = read_css_file (static_dir ^ "/styles/tw.css") in
let basics_css = read_css_file (static_dir ^ "/styles/basics.css") in
@@ -1674,16 +1693,7 @@ let http_inject_shell_statics env static_dir sx_sxc =
ignore (env_bind env "__shell-body-scripts" Nil);
ignore (env_bind env "__shell-inline-css" Nil);
ignore (env_bind env "__shell-inline-head-js" Nil);
- (* init-sx: trigger client-side render when sx-root is empty (SSR failed).
- The boot code hydrates existing islands but doesn't do fresh render.
- This script forces a render from page-sx after boot completes. *)
- ignore (env_bind env "__shell-init-sx" (String
- "document.addEventListener('sx:boot-done', function() { \
- var root = document.getElementById('sx-root'); \
- if (root && !root.innerHTML.trim() && typeof SX !== 'undefined' && SX.renderPage) { \
- SX.renderPage(); \
- } \
- });"));
+ ignore (env_bind env "__shell-init-sx" Nil);
Printf.eprintf "[sx-http] Shell statics: defs=%d hash=%s css=%d js=%s wasm=%s\n%!"
(String.length component_defs) component_hash (String.length sx_css) sx_js_hash wasm_hash
@@ -1789,7 +1799,9 @@ let http_setup_page_helpers env =
SxExpr (Printf.sprintf "(pre :class \"text-sm overflow-x-auto\" (code \"%s\"))" escaped)
| _ -> Nil);
(* component-source — stub *)
- bind "component-source" (fun _args -> String "")
+ bind "component-source" (fun _args -> String "");
+ (* handler-source — stub (returns empty, used by example pages) *)
+ bind "handler-source" (fun _args -> String "")
let http_mode port =
let env = make_server_env () in
@@ -2003,12 +2015,17 @@ let http_mode port =
in
match work with
| Some (fd, path, headers) ->
+ (* ~10M steps ≈ 3-5 seconds of CEK evaluation *)
+ Atomic.set Sx_ref._step_count 0;
+ Atomic.set Sx_ref._step_limit 10_000_000;
let response =
try
let is_ajax = List.exists (fun (k, _) -> k = "sx-request" || k = "hx-request") headers in
match http_render_page env path headers with
| Some html ->
- let resp = http_response ~content_type:"text/html; charset=utf-8" html in
+ let ct = if is_ajax then "text/sx; charset=utf-8"
+ else "text/html; charset=utf-8" in
+ let resp = http_response ~content_type:ct html in
if not is_ajax then Hashtbl.replace response_cache path resp;
resp
| None -> http_response ~status:404 "
Not Found
"
@@ -2016,6 +2033,7 @@ let http_mode port =
Printf.eprintf "[render] Error for %s: %s\n%!" path (Printexc.to_string e);
http_response ~status:500 "Internal Server Error
"
in
+ Atomic.set Sx_ref._step_limit 0;
write_response fd response
| None -> ()
done
diff --git a/shared/static/wasm/sx/adapter-dom.sx b/shared/static/wasm/sx/adapter-dom.sx
index 38c670ba..55416866 100644
--- a/shared/static/wasm/sx/adapter-dom.sx
+++ b/shared/static/wasm/sx/adapter-dom.sx
@@ -4,64 +4,1335 @@
(define island-scope? (fn () (not (nil? (scope-peek "sx-island-scope")))))
-(begin (define *memo-cache* (dict)) (define *cyst-counter* 0) (define next-cyst-id (fn () (set! *cyst-counter* (+ *cyst-counter* 1)) (str "sx-cyst-" *cyst-counter*))))
+(begin
+ (define *memo-cache* (dict))
+ (define *cyst-counter* 0)
+ (define
+ next-cyst-id
+ (fn
+ ()
+ (set! *cyst-counter* (+ *cyst-counter* 1))
+ (str "sx-cyst-" *cyst-counter*))))
-(define contains-deref? (fn (expr) (if (not (list? expr)) false (if (empty? expr) false (if (and (= (type-of (first expr)) "symbol") (= (symbol-name (first expr)) "deref")) true (some contains-deref? expr))))))
+(define
+ contains-deref?
+ (fn
+ (expr)
+ (if
+ (not (list? expr))
+ false
+ (if
+ (empty? expr)
+ false
+ (if
+ (and
+ (= (type-of (first expr)) "symbol")
+ (= (symbol-name (first expr)) "deref"))
+ true
+ (some contains-deref? expr))))))
-(define dom-on :effects (io) (fn (el name handler) (dom-listen el name (if (lambda? handler) (if (= 0 (len (lambda-params handler))) (fn (_e) (trampoline (call-lambda handler (list))) (run-post-render-hooks)) (fn (e) (trampoline (call-lambda handler (list e))) (run-post-render-hooks))) handler))))
+(define
+ dom-on
+ :effects (io)
+ (fn
+ (el name handler)
+ (dom-listen
+ el
+ name
+ (if
+ (lambda? handler)
+ (if
+ (= 0 (len (lambda-params handler)))
+ (fn
+ (_e)
+ (trampoline (call-lambda handler (list)))
+ (run-post-render-hooks))
+ (fn
+ (e)
+ (trampoline (call-lambda handler (list e)))
+ (run-post-render-hooks)))
+ handler))))
-(define render-to-dom :effects (render) (fn (expr (env :as dict) (ns :as string)) (set-render-active! true) (case (type-of expr) "nil" (create-fragment) "boolean" (create-fragment) "raw-html" (dom-parse-html (raw-html-content expr)) "string" (create-text-node expr) "number" (create-text-node (str expr)) "symbol" (render-to-dom (trampoline (eval-expr expr env)) env ns) "keyword" (create-text-node (keyword-name expr)) "dom-node" expr "spread" (do (when (not (island-scope?)) (scope-emit! "element-attrs" (spread-attrs expr))) expr) "dict" (if (has-key? expr "__host_handle") expr (create-fragment)) "list" (if (empty? expr) (create-fragment) (render-dom-list expr env ns)) :else (if (signal? expr) (if (island-scope?) (reactive-text expr) (create-text-node (str (deref expr)))) (create-text-node (str expr))))))
+(define
+ render-to-dom
+ :effects (render)
+ (fn
+ (expr (env :as dict) (ns :as string))
+ (set-render-active! true)
+ (case
+ (type-of expr)
+ "nil"
+ (create-fragment)
+ "boolean"
+ (create-fragment)
+ "raw-html"
+ (dom-parse-html (raw-html-content expr))
+ "string"
+ (create-text-node expr)
+ "number"
+ (create-text-node (str expr))
+ "symbol"
+ (render-to-dom (trampoline (eval-expr expr env)) env ns)
+ "keyword"
+ (create-text-node (keyword-name expr))
+ "dom-node"
+ expr
+ "spread"
+ (do
+ (when
+ (not (island-scope?))
+ (scope-emit! "element-attrs" (spread-attrs expr)))
+ expr)
+ "dict"
+ (if (has-key? expr "__host_handle") expr (create-fragment))
+ "list"
+ (if (empty? expr) (create-fragment) (render-dom-list expr env ns))
+ :else (if
+ (signal? expr)
+ (if
+ (island-scope?)
+ (reactive-text expr)
+ (create-text-node (str (deref expr))))
+ (create-text-node (str expr))))))
-(define render-dom-list :effects (render) (fn (expr (env :as dict) (ns :as string)) (let ((head (first expr))) (cond (= (type-of head) "symbol") (let ((name (symbol-name head)) (args (rest expr))) (cond (= name "raw!") (render-dom-raw args env) (= name "<>") (render-dom-fragment args env ns) (= name "lake") (render-dom-lake args env ns) (= name "marsh") (render-dom-marsh args env ns) (starts-with? name "html:") (render-dom-element (slice name 5) args env ns) (render-dom-form? name) (if (and (contains? HTML_TAGS name) (or (and (> (len args) 0) (= (type-of (first args)) "keyword")) ns)) (render-dom-element name args env ns) (dispatch-render-form name expr env ns)) (and (env-has? env name) (macro? (env-get env name))) (render-to-dom (expand-macro (env-get env name) args env) env ns) (contains? HTML_TAGS name) (render-dom-element name args env ns) (and (starts-with? name "~") (env-has? env name) (island? (env-get env name))) (if (scope-peek "sx-render-markers") (let ((island (env-get env name)) (marker (dom-create-element "span" nil))) (dom-set-attr marker "data-sx-island" (component-name island)) marker) (render-dom-island (env-get env name) args env ns)) (starts-with? name "~") (let ((comp (env-get env name))) (if (component? comp) (render-dom-component comp args env ns) (render-dom-unknown-component name))) (and (> (index-of name "-") 0) (> (len args) 0) (= (type-of (first args)) "keyword")) (render-dom-element name args env ns) ns (render-dom-element name args env ns) (and (= name "deref") (island-scope?)) (let ((sig-or-val (trampoline (eval-expr (first args) env)))) (if (signal? sig-or-val) (reactive-text sig-or-val) (create-text-node (str (deref sig-or-val))))) (and (island-scope?) (contains-deref? expr)) (reactive-text (computed (fn () (trampoline (eval-expr expr env))))) :else (render-to-dom (trampoline (eval-expr expr env)) env ns))) (or (lambda? head) (= (type-of head) "list")) (render-to-dom (trampoline (eval-expr expr env)) env ns) :else (let ((frag (create-fragment))) (for-each (fn (x) (let ((result (render-to-dom x env ns))) (when (not (spread? result)) (dom-append frag result)))) expr) frag)))))
+(define
+ render-dom-list
+ :effects (render)
+ (fn
+ (expr (env :as dict) (ns :as string))
+ (let
+ ((head (first expr)))
+ (cond
+ (= (type-of head) "symbol")
+ (let
+ ((name (symbol-name head)) (args (rest expr)))
+ (cond
+ (= name "raw!")
+ (render-dom-raw args env)
+ (= name "<>")
+ (render-dom-fragment args env ns)
+ (= name "lake")
+ (render-dom-lake args env ns)
+ (= name "marsh")
+ (render-dom-marsh args env ns)
+ (starts-with? name "html:")
+ (render-dom-element (slice name 5) args env ns)
+ (render-dom-form? name)
+ (if
+ (and
+ (contains? HTML_TAGS name)
+ (or
+ (and
+ (> (len args) 0)
+ (= (type-of (first args)) "keyword"))
+ ns))
+ (render-dom-element name args env ns)
+ (dispatch-render-form name expr env ns))
+ (and (env-has? env name) (macro? (env-get env name)))
+ (render-to-dom (expand-macro (env-get env name) args env) env ns)
+ (contains? HTML_TAGS name)
+ (render-dom-element name args env ns)
+ (and
+ (starts-with? name "~")
+ (env-has? env name)
+ (island? (env-get env name)))
+ (if
+ (scope-peek "sx-render-markers")
+ (let
+ ((island (env-get env name))
+ (marker (dom-create-element "span" nil))
+ (kw-state (dict)))
+ (reduce
+ (fn
+ (state arg)
+ (let
+ ((skip (get state "skip")))
+ (if
+ skip
+ (assoc state "skip" false "i" (inc (get state "i")))
+ (if
+ (and
+ (= (type-of arg) "keyword")
+ (< (inc (get state "i")) (len args)))
+ (let
+ ((kname (keyword-name arg))
+ (kval
+ (trampoline
+ (eval-expr
+ (nth args (inc (get state "i")))
+ env))))
+ (dict-set! kw-state kname kval)
+ (assoc
+ state
+ "skip"
+ true
+ "i"
+ (inc (get state "i"))))
+ (assoc state "i" (inc (get state "i")))))))
+ (dict "i" 0 "skip" false)
+ args)
+ (dom-set-attr marker "data-sx-island" (component-name island))
+ (when
+ (not (empty-dict? kw-state))
+ (dom-set-attr
+ marker
+ "data-sx-state"
+ (sx-serialize kw-state)))
+ marker)
+ (render-dom-island (env-get env name) args env ns))
+ (starts-with? name "~")
+ (let
+ ((comp (env-get env name)))
+ (if
+ (component? comp)
+ (render-dom-component comp args env ns)
+ (render-dom-unknown-component name)))
+ (and
+ (> (index-of name "-") 0)
+ (> (len args) 0)
+ (= (type-of (first args)) "keyword"))
+ (render-dom-element name args env ns)
+ ns
+ (render-dom-element name args env ns)
+ (and (= name "deref") (island-scope?))
+ (let
+ ((sig-or-val (trampoline (eval-expr (first args) env))))
+ (if
+ (signal? sig-or-val)
+ (reactive-text sig-or-val)
+ (create-text-node (str (deref sig-or-val)))))
+ (and (island-scope?) (contains-deref? expr))
+ (reactive-text
+ (computed (fn () (trampoline (eval-expr expr env)))))
+ :else (render-to-dom (trampoline (eval-expr expr env)) env ns)))
+ (or (lambda? head) (= (type-of head) "list"))
+ (render-to-dom (trampoline (eval-expr expr env)) env ns)
+ :else (let
+ ((frag (create-fragment)))
+ (for-each
+ (fn
+ (x)
+ (let
+ ((result (render-to-dom x env ns)))
+ (when (not (spread? result)) (dom-append frag result))))
+ expr)
+ frag)))))
-(define render-dom-element :effects (render) (fn ((tag :as string) (args :as list) (env :as dict) (ns :as string)) (let ((new-ns (cond (= tag "svg") SVG_NS (= tag "math") MATH_NS :else ns)) (el (dom-create-element tag new-ns))) (scope-push! "element-attrs" nil) (reduce (fn (state arg) (let ((skip (get state "skip"))) (if skip (assoc state "skip" false "i" (inc (get state "i"))) (if (and (= (type-of arg) "keyword") (< (inc (get state "i")) (len args))) (let ((attr-name (keyword-name arg)) (attr-expr (nth args (inc (get state "i"))))) (cond (starts-with? attr-name "on-") (let ((attr-val (trampoline (eval-expr attr-expr env)))) (when (callable? attr-val) (dom-on el (slice attr-name 3) attr-val))) (= attr-name "bind") (let ((attr-val (trampoline (eval-expr attr-expr env)))) (when (signal? attr-val) (bind-input el attr-val))) (= attr-name "ref") (let ((attr-val (trampoline (eval-expr attr-expr env)))) (dict-set! attr-val "current" el)) (= attr-name "key") (let ((attr-val (trampoline (eval-expr attr-expr env)))) (dom-set-attr el "key" (str attr-val))) (island-scope?) (reactive-attr el attr-name (fn () (trampoline (eval-expr attr-expr env)))) :else (let ((attr-val (trampoline (eval-expr attr-expr env)))) (cond (or (nil? attr-val) (= attr-val false)) nil (contains? BOOLEAN_ATTRS attr-name) (when attr-val (dom-set-attr el attr-name "")) (= attr-val true) (dom-set-attr el attr-name "") :else (dom-set-attr el attr-name (str attr-val))))) (assoc state "skip" true "i" (inc (get state "i")))) (do (when (not (contains? VOID_ELEMENTS tag)) (let ((child (render-to-dom arg env new-ns))) (cond (and (spread? child) (island-scope?)) (reactive-spread el (fn () (render-to-dom arg env new-ns))) (spread? child) nil :else (dom-append el child)))) (assoc state "i" (inc (get state "i")))))))) (dict "i" 0 "skip" false) args) (for-each (fn (spread-dict) (for-each (fn ((key :as string)) (let ((val (dict-get spread-dict key))) (if (= key "class") (let ((existing (dom-get-attr el "class"))) (dom-set-attr el "class" (if (and existing (not (= existing ""))) (str existing " " val) val))) (if (= key "style") (let ((existing (dom-get-attr el "style"))) (dom-set-attr el "style" (if (and existing (not (= existing ""))) (str existing ";" val) val))) (dom-set-attr el key (str val)))))) (keys spread-dict))) (scope-emitted "element-attrs")) (scope-pop! "element-attrs") el)))
+(define
+ render-dom-element
+ :effects (render)
+ (fn
+ ((tag :as string) (args :as list) (env :as dict) (ns :as string))
+ (let
+ ((new-ns (cond (= tag "svg") SVG_NS (= tag "math") MATH_NS :else ns))
+ (el (dom-create-element tag new-ns)))
+ (scope-push! "element-attrs" nil)
+ (reduce
+ (fn
+ (state arg)
+ (let
+ ((skip (get state "skip")))
+ (if
+ skip
+ (assoc state "skip" false "i" (inc (get state "i")))
+ (if
+ (and
+ (= (type-of arg) "keyword")
+ (< (inc (get state "i")) (len args)))
+ (let
+ ((attr-name (keyword-name arg))
+ (attr-expr (nth args (inc (get state "i")))))
+ (cond
+ (starts-with? attr-name "on-")
+ (let
+ ((attr-val (trampoline (eval-expr attr-expr env))))
+ (when
+ (callable? attr-val)
+ (dom-on el (slice attr-name 3) attr-val)))
+ (= attr-name "bind")
+ (let
+ ((attr-val (trampoline (eval-expr attr-expr env))))
+ (when (signal? attr-val) (bind-input el attr-val)))
+ (= attr-name "ref")
+ (let
+ ((attr-val (trampoline (eval-expr attr-expr env))))
+ (dict-set! attr-val "current" el))
+ (= attr-name "key")
+ (let
+ ((attr-val (trampoline (eval-expr attr-expr env))))
+ (dom-set-attr el "key" (str attr-val)))
+ (island-scope?)
+ (reactive-attr
+ el
+ attr-name
+ (fn () (trampoline (eval-expr attr-expr env))))
+ :else (let
+ ((attr-val (trampoline (eval-expr attr-expr env))))
+ (cond
+ (or (nil? attr-val) (= attr-val false))
+ nil
+ (contains? BOOLEAN_ATTRS attr-name)
+ (when attr-val (dom-set-attr el attr-name ""))
+ (= attr-val true)
+ (dom-set-attr el attr-name "")
+ :else (dom-set-attr el attr-name (str attr-val)))))
+ (assoc state "skip" true "i" (inc (get state "i"))))
+ (do
+ (when
+ (not (contains? VOID_ELEMENTS tag))
+ (let
+ ((child (render-to-dom arg env new-ns)))
+ (cond
+ (and (spread? child) (island-scope?))
+ (reactive-spread
+ el
+ (fn () (render-to-dom arg env new-ns)))
+ (spread? child)
+ nil
+ :else (dom-append el child))))
+ (assoc state "i" (inc (get state "i"))))))))
+ (dict "i" 0 "skip" false)
+ args)
+ (for-each
+ (fn
+ (spread-dict)
+ (for-each
+ (fn
+ ((key :as string))
+ (let
+ ((val (dict-get spread-dict key)))
+ (if
+ (= key "class")
+ (let
+ ((existing (dom-get-attr el "class")))
+ (dom-set-attr
+ el
+ "class"
+ (if
+ (and existing (not (= existing "")))
+ (str existing " " val)
+ val)))
+ (if
+ (= key "style")
+ (let
+ ((existing (dom-get-attr el "style")))
+ (dom-set-attr
+ el
+ "style"
+ (if
+ (and existing (not (= existing "")))
+ (str existing ";" val)
+ val)))
+ (dom-set-attr el key (str val))))))
+ (keys spread-dict)))
+ (scope-emitted "element-attrs"))
+ (scope-pop! "element-attrs")
+ el)))
-(define render-dom-component :effects (render) (fn ((comp :as component) (args :as list) (env :as dict) (ns :as string)) (let ((kwargs (dict)) (children (list))) (reduce (fn (state arg) (let ((skip (get state "skip"))) (if skip (assoc state "skip" false "i" (inc (get state "i"))) (if (and (= (type-of arg) "keyword") (< (inc (get state "i")) (len args))) (let ((val (trampoline (eval-expr (nth args (inc (get state "i"))) env)))) (dict-set! kwargs (keyword-name arg) val) (assoc state "skip" true "i" (inc (get state "i")))) (do (append! children arg) (assoc state "i" (inc (get state "i")))))))) (dict "i" 0 "skip" false) args) (let ((local (env-merge (component-closure comp) env))) (for-each (fn (p) (env-bind! local p (if (dict-has? kwargs p) (dict-get kwargs p) nil))) (component-params comp)) (when (component-has-children? comp) (let ((child-frag (create-fragment))) (for-each (fn (c) (let ((result (render-to-dom c env ns))) (when (not (spread? result)) (dom-append child-frag result)))) children) (env-bind! local "children" child-frag))) (render-to-dom (component-body comp) local ns)))))
+(define
+ render-dom-component
+ :effects (render)
+ (fn
+ ((comp :as component) (args :as list) (env :as dict) (ns :as string))
+ (let
+ ((kwargs (dict)) (children (list)))
+ (reduce
+ (fn
+ (state arg)
+ (let
+ ((skip (get state "skip")))
+ (if
+ skip
+ (assoc state "skip" false "i" (inc (get state "i")))
+ (if
+ (and
+ (= (type-of arg) "keyword")
+ (< (inc (get state "i")) (len args)))
+ (let
+ ((val (trampoline (eval-expr (nth args (inc (get state "i"))) env))))
+ (dict-set! kwargs (keyword-name arg) val)
+ (assoc state "skip" true "i" (inc (get state "i"))))
+ (do
+ (append! children arg)
+ (assoc state "i" (inc (get state "i"))))))))
+ (dict "i" 0 "skip" false)
+ args)
+ (let
+ ((local (env-merge (component-closure comp) env)))
+ (for-each
+ (fn
+ (p)
+ (env-bind!
+ local
+ p
+ (if (dict-has? kwargs p) (dict-get kwargs p) nil)))
+ (component-params comp))
+ (when
+ (component-has-children? comp)
+ (let
+ ((child-frag (create-fragment)))
+ (for-each
+ (fn
+ (c)
+ (let
+ ((result (render-to-dom c env ns)))
+ (when
+ (not (spread? result))
+ (dom-append child-frag result))))
+ children)
+ (env-bind! local "children" child-frag)))
+ (render-to-dom (component-body comp) local ns)))))
-(define render-dom-fragment :effects (render) (fn ((args :as list) (env :as dict) (ns :as string)) (let ((frag (create-fragment))) (for-each (fn (x) (let ((result (render-to-dom x env ns))) (when (not (spread? result)) (dom-append frag result)))) args) frag)))
+(define
+ render-dom-fragment
+ :effects (render)
+ (fn
+ ((args :as list) (env :as dict) (ns :as string))
+ (let
+ ((frag (create-fragment)))
+ (for-each
+ (fn
+ (x)
+ (let
+ ((result (render-to-dom x env ns)))
+ (when (not (spread? result)) (dom-append frag result))))
+ args)
+ frag)))
-(define render-dom-raw :effects (render) (fn ((args :as list) (env :as dict)) (let ((frag (create-fragment))) (for-each (fn (arg) (let ((val (trampoline (eval-expr arg env)))) (cond (= (type-of val) "string") (dom-append frag (dom-parse-html val)) (= (type-of val) "dom-node") (dom-append frag (dom-clone val)) (not (nil? val)) (dom-append frag (create-text-node (str val)))))) args) frag)))
+(define
+ render-dom-raw
+ :effects (render)
+ (fn
+ ((args :as list) (env :as dict))
+ (let
+ ((frag (create-fragment)))
+ (for-each
+ (fn
+ (arg)
+ (let
+ ((val (trampoline (eval-expr arg env))))
+ (cond
+ (= (type-of val) "string")
+ (dom-append frag (dom-parse-html val))
+ (= (type-of val) "dom-node")
+ (dom-append frag (dom-clone val))
+ (not (nil? val))
+ (dom-append frag (create-text-node (str val))))))
+ args)
+ frag)))
-(define render-dom-unknown-component :effects (render) (fn ((name :as string)) (error (str "Unknown component: " name))))
+(define
+ render-dom-unknown-component
+ :effects (render)
+ (fn ((name :as string)) (error (str "Unknown component: " name))))
-(define RENDER_DOM_FORMS (list "if" "when" "cond" "case" "let" "let*" "letrec" "begin" "do" "define" "defcomp" "defisland" "defmacro" "defstyle" "map" "map-indexed" "filter" "for-each" "portal" "error-boundary" "scope" "provide" "cyst"))
+(define
+ RENDER_DOM_FORMS
+ (list
+ "if"
+ "when"
+ "cond"
+ "case"
+ "let"
+ "let*"
+ "letrec"
+ "begin"
+ "do"
+ "define"
+ "defcomp"
+ "defisland"
+ "defmacro"
+ "defstyle"
+ "map"
+ "map-indexed"
+ "filter"
+ "for-each"
+ "portal"
+ "error-boundary"
+ "scope"
+ "provide"
+ "cyst"))
-(define render-dom-form? :effects () (fn ((name :as string)) (contains? RENDER_DOM_FORMS name)))
+(define
+ render-dom-form?
+ :effects ()
+ (fn ((name :as string)) (contains? RENDER_DOM_FORMS name)))
-(define dispatch-render-form :effects (render) (fn ((name :as string) expr (env :as dict) (ns :as string)) (cond (= name "if") (if (island-scope?) (let ((marker (create-comment "r-if")) (current-nodes (list)) (initial-result nil)) (effect (fn () (let ((result (let ((cond-val (trampoline (eval-expr (nth expr 1) env)))) (if cond-val (render-to-dom (nth expr 2) env ns) (if (> (len expr) 3) (render-to-dom (nth expr 3) env ns) (create-fragment)))))) (if (dom-parent marker) (do (for-each (fn (n) (dom-remove n)) current-nodes) (set! current-nodes (if (dom-is-fragment? result) (dom-child-nodes result) (list result))) (dom-insert-after marker result)) (set! initial-result result))))) (if (spread? initial-result) initial-result (let ((frag (create-fragment))) (dom-append frag marker) (when initial-result (set! current-nodes (if (dom-is-fragment? initial-result) (dom-child-nodes initial-result) (list initial-result))) (dom-append frag initial-result)) frag))) (let ((cond-val (trampoline (eval-expr (nth expr 1) env)))) (if cond-val (render-to-dom (nth expr 2) env ns) (if (> (len expr) 3) (render-to-dom (nth expr 3) env ns) (create-fragment))))) (= name "when") (if (island-scope?) (let ((marker (create-comment "r-when")) (current-nodes (list)) (initial-result nil)) (effect (fn () (if (dom-parent marker) (do (for-each (fn (n) (dom-remove n)) current-nodes) (set! current-nodes (list)) (when (trampoline (eval-expr (nth expr 1) env)) (let ((frag (create-fragment))) (for-each (fn (i) (dom-append frag (render-to-dom (nth expr i) env ns))) (range 2 (len expr))) (set! current-nodes (dom-child-nodes frag)) (dom-insert-after marker frag)))) (when (trampoline (eval-expr (nth expr 1) env)) (let ((frag (create-fragment))) (for-each (fn (i) (dom-append frag (render-to-dom (nth expr i) env ns))) (range 2 (len expr))) (set! current-nodes (dom-child-nodes frag)) (set! initial-result frag)))))) (if (spread? initial-result) initial-result (let ((frag (create-fragment))) (dom-append frag marker) (when initial-result (dom-append frag initial-result)) frag))) (if (not (trampoline (eval-expr (nth expr 1) env))) (create-fragment) (let ((frag (create-fragment))) (for-each (fn (i) (dom-append frag (render-to-dom (nth expr i) env ns))) (range 2 (len expr))) frag))) (= name "cond") (if (island-scope?) (let ((marker (create-comment "r-cond")) (current-nodes (list)) (initial-result nil)) (effect (fn () (let ((branch (eval-cond (rest expr) env))) (if (dom-parent marker) (do (for-each (fn (n) (dom-remove n)) current-nodes) (set! current-nodes (list)) (when branch (let ((result (render-to-dom branch env ns))) (set! current-nodes (if (dom-is-fragment? result) (dom-child-nodes result) (list result))) (dom-insert-after marker result)))) (when branch (let ((result (render-to-dom branch env ns))) (set! current-nodes (if (dom-is-fragment? result) (dom-child-nodes result) (list result))) (set! initial-result result))))))) (if (spread? initial-result) initial-result (let ((frag (create-fragment))) (dom-append frag marker) (when initial-result (dom-append frag initial-result)) frag))) (let ((branch (eval-cond (rest expr) env))) (if branch (render-to-dom branch env ns) (create-fragment)))) (= name "case") (render-to-dom (trampoline (eval-expr expr env)) env ns) (or (= name "let") (= name "let*")) (let ((local (process-bindings (nth expr 1) env))) (if (= (len expr) 3) (render-to-dom (nth expr 2) local ns) (let ((frag (create-fragment))) (for-each (fn (i) (let ((result (render-to-dom (nth expr i) local ns))) (when (not (spread? result)) (dom-append frag result)))) (range 2 (len expr))) frag))) (= name "letrec") (let ((bindings (nth expr 1)) (body (slice expr 2)) (local (env-extend env))) (for-each (fn (pair) (let ((pname (if (= (type-of (first pair)) "symbol") (symbol-name (first pair)) (str (first pair))))) (env-bind! local pname nil))) bindings) (for-each (fn (pair) (let ((pname (if (= (type-of (first pair)) "symbol") (symbol-name (first pair)) (str (first pair))))) (env-set! local pname (trampoline (eval-expr (nth pair 1) local))))) bindings) (when (> (len body) 1) (for-each (fn (e) (trampoline (eval-expr e local))) (init body))) (render-to-dom (last body) local ns)) (or (= name "begin") (= name "do")) (if (= (len expr) 2) (render-to-dom (nth expr 1) env ns) (let ((frag (create-fragment))) (for-each (fn (i) (let ((result (render-to-dom (nth expr i) env ns))) (when (not (spread? result)) (dom-append frag result)))) (range 1 (len expr))) frag)) (definition-form? name) (do (trampoline (eval-expr expr env)) (create-fragment)) (= name "map") (let ((coll-expr (nth expr 2))) (if (and (island-scope?) (= (type-of coll-expr) "list") (> (len coll-expr) 1) (= (type-of (first coll-expr)) "symbol") (= (symbol-name (first coll-expr)) "deref")) (let ((f (trampoline (eval-expr (nth expr 1) env))) (sig (trampoline (eval-expr (nth coll-expr 1) env)))) (if (signal? sig) (reactive-list f sig env ns) (let ((coll (deref sig)) (frag (create-fragment))) (for-each (fn (item) (let ((val (if (lambda? f) (render-lambda-dom f (list item) env ns) (render-to-dom (apply f (list item)) env ns)))) (dom-append frag val))) coll) frag))) (let ((f (trampoline (eval-expr (nth expr 1) env))) (coll (trampoline (eval-expr (nth expr 2) env))) (frag (create-fragment))) (for-each (fn (item) (let ((val (if (lambda? f) (render-lambda-dom f (list item) env ns) (render-to-dom (apply f (list item)) env ns)))) (dom-append frag val))) coll) frag))) (= name "map-indexed") (let ((f (trampoline (eval-expr (nth expr 1) env))) (coll (trampoline (eval-expr (nth expr 2) env))) (frag (create-fragment))) (for-each-indexed (fn (i item) (let ((val (if (lambda? f) (render-lambda-dom f (list i item) env ns) (render-to-dom (apply f (list i item)) env ns)))) (dom-append frag val))) coll) frag) (= name "filter") (render-to-dom (trampoline (eval-expr expr env)) env ns) (= name "portal") (render-dom-portal (rest expr) env ns) (= name "error-boundary") (render-dom-error-boundary (rest expr) env ns) (= name "for-each") (let ((f (trampoline (eval-expr (nth expr 1) env))) (coll (trampoline (eval-expr (nth expr 2) env))) (frag (create-fragment))) (for-each (fn (item) (let ((val (if (lambda? f) (render-lambda-dom f (list item) env ns) (render-to-dom (apply f (list item)) env ns)))) (dom-append frag val))) coll) frag) (= name "scope") (let ((scope-name (trampoline (eval-expr (nth expr 1) env))) (rest-args (slice expr 2)) (scope-val nil) (body-exprs nil) (frag (create-fragment))) (if (and (>= (len rest-args) 2) (= (type-of (first rest-args)) "keyword") (= (keyword-name (first rest-args)) "value")) (do (set! scope-val (trampoline (eval-expr (nth rest-args 1) env))) (set! body-exprs (slice rest-args 2))) (set! body-exprs rest-args)) (scope-push! scope-name scope-val) (for-each (fn (e) (dom-append frag (render-to-dom e env ns))) body-exprs) (scope-pop! scope-name) frag) (= name "provide") (let ((prov-name (trampoline (eval-expr (nth expr 1) env))) (prov-val (trampoline (eval-expr (nth expr 2) env))) (frag (create-fragment))) (scope-push! prov-name prov-val) (for-each (fn (i) (dom-append frag (render-to-dom (nth expr i) env ns))) (range 3 (len expr))) (scope-pop! prov-name) frag) (= name "cyst") (let ((cyst-key (if (and (> (len expr) 2) (= (type-of (nth expr 1)) "keyword") (= (keyword-name (nth expr 1)) "key")) (str (trampoline (eval-expr (nth expr 2) env))) (next-cyst-id))) (cached (get *memo-cache* cyst-key))) (if (and cached (host-get cached "isConnected")) cached (let ((container (dom-create-element "div" nil)) (disposers (list)) (body-exprs (if (and (> (len expr) 2) (= (type-of (nth expr 1)) "keyword") (= (keyword-name (nth expr 1)) "key")) (slice expr 3) (slice expr 1)))) (dom-set-attr container "data-sx-cyst" cyst-key) (let ((body-dom (with-island-scope (fn (d) (append! disposers d)) (fn () (let ((frag (create-fragment))) (for-each (fn (child) (dom-append frag (render-to-dom child env ns))) body-exprs) frag))))) (dom-append container body-dom) (dom-set-data container "sx-disposers" disposers) (dict-set! *memo-cache* cyst-key container) container)))) :else (render-to-dom (trampoline (eval-expr expr env)) env ns))))
+(define
+ dispatch-render-form
+ :effects (render)
+ (fn
+ ((name :as string) expr (env :as dict) (ns :as string))
+ (cond
+ (= name "if")
+ (if
+ (island-scope?)
+ (let
+ ((marker (create-comment "r-if"))
+ (current-nodes (list))
+ (initial-result nil))
+ (effect
+ (fn
+ ()
+ (let
+ ((result (let ((cond-val (trampoline (eval-expr (nth expr 1) env)))) (if cond-val (render-to-dom (nth expr 2) env ns) (if (> (len expr) 3) (render-to-dom (nth expr 3) env ns) (create-fragment))))))
+ (if
+ (dom-parent marker)
+ (do
+ (for-each (fn (n) (dom-remove n)) current-nodes)
+ (set!
+ current-nodes
+ (if
+ (dom-is-fragment? result)
+ (dom-child-nodes result)
+ (list result)))
+ (dom-insert-after marker result))
+ (set! initial-result result)))))
+ (if
+ (spread? initial-result)
+ initial-result
+ (let
+ ((frag (create-fragment)))
+ (dom-append frag marker)
+ (when
+ initial-result
+ (set!
+ current-nodes
+ (if
+ (dom-is-fragment? initial-result)
+ (dom-child-nodes initial-result)
+ (list initial-result)))
+ (dom-append frag initial-result))
+ frag)))
+ (let
+ ((cond-val (trampoline (eval-expr (nth expr 1) env))))
+ (if
+ cond-val
+ (render-to-dom (nth expr 2) env ns)
+ (if
+ (> (len expr) 3)
+ (render-to-dom (nth expr 3) env ns)
+ (create-fragment)))))
+ (= name "when")
+ (if
+ (island-scope?)
+ (let
+ ((marker (create-comment "r-when"))
+ (current-nodes (list))
+ (initial-result nil))
+ (effect
+ (fn
+ ()
+ (if
+ (dom-parent marker)
+ (do
+ (for-each (fn (n) (dom-remove n)) current-nodes)
+ (set! current-nodes (list))
+ (when
+ (trampoline (eval-expr (nth expr 1) env))
+ (let
+ ((frag (create-fragment)))
+ (for-each
+ (fn
+ (i)
+ (dom-append
+ frag
+ (render-to-dom (nth expr i) env ns)))
+ (range 2 (len expr)))
+ (set! current-nodes (dom-child-nodes frag))
+ (dom-insert-after marker frag))))
+ (when
+ (trampoline (eval-expr (nth expr 1) env))
+ (let
+ ((frag (create-fragment)))
+ (for-each
+ (fn
+ (i)
+ (dom-append frag (render-to-dom (nth expr i) env ns)))
+ (range 2 (len expr)))
+ (set! current-nodes (dom-child-nodes frag))
+ (set! initial-result frag))))))
+ (if
+ (spread? initial-result)
+ initial-result
+ (let
+ ((frag (create-fragment)))
+ (dom-append frag marker)
+ (when initial-result (dom-append frag initial-result))
+ frag)))
+ (if
+ (not (trampoline (eval-expr (nth expr 1) env)))
+ (create-fragment)
+ (let
+ ((frag (create-fragment)))
+ (for-each
+ (fn
+ (i)
+ (dom-append frag (render-to-dom (nth expr i) env ns)))
+ (range 2 (len expr)))
+ frag)))
+ (= name "cond")
+ (if
+ (island-scope?)
+ (let
+ ((marker (create-comment "r-cond"))
+ (current-nodes (list))
+ (initial-result nil))
+ (effect
+ (fn
+ ()
+ (let
+ ((branch (eval-cond (rest expr) env)))
+ (if
+ (dom-parent marker)
+ (do
+ (for-each (fn (n) (dom-remove n)) current-nodes)
+ (set! current-nodes (list))
+ (when
+ branch
+ (let
+ ((result (render-to-dom branch env ns)))
+ (set!
+ current-nodes
+ (if
+ (dom-is-fragment? result)
+ (dom-child-nodes result)
+ (list result)))
+ (dom-insert-after marker result))))
+ (when
+ branch
+ (let
+ ((result (render-to-dom branch env ns)))
+ (set!
+ current-nodes
+ (if
+ (dom-is-fragment? result)
+ (dom-child-nodes result)
+ (list result)))
+ (set! initial-result result)))))))
+ (if
+ (spread? initial-result)
+ initial-result
+ (let
+ ((frag (create-fragment)))
+ (dom-append frag marker)
+ (when initial-result (dom-append frag initial-result))
+ frag)))
+ (let
+ ((branch (eval-cond (rest expr) env)))
+ (if branch (render-to-dom branch env ns) (create-fragment))))
+ (= name "case")
+ (render-to-dom (trampoline (eval-expr expr env)) env ns)
+ (or (= name "let") (= name "let*"))
+ (let
+ ((local (process-bindings (nth expr 1) env)))
+ (if
+ (= (len expr) 3)
+ (render-to-dom (nth expr 2) local ns)
+ (let
+ ((frag (create-fragment)))
+ (for-each
+ (fn
+ (i)
+ (let
+ ((result (render-to-dom (nth expr i) local ns)))
+ (when (not (spread? result)) (dom-append frag result))))
+ (range 2 (len expr)))
+ frag)))
+ (= name "letrec")
+ (let
+ ((bindings (nth expr 1))
+ (body (slice expr 2))
+ (local (env-extend env)))
+ (for-each
+ (fn
+ (pair)
+ (let
+ ((pname (if (= (type-of (first pair)) "symbol") (symbol-name (first pair)) (str (first pair)))))
+ (env-bind! local pname nil)))
+ bindings)
+ (for-each
+ (fn
+ (pair)
+ (let
+ ((pname (if (= (type-of (first pair)) "symbol") (symbol-name (first pair)) (str (first pair)))))
+ (env-set!
+ local
+ pname
+ (trampoline (eval-expr (nth pair 1) local)))))
+ bindings)
+ (when
+ (> (len body) 1)
+ (for-each (fn (e) (trampoline (eval-expr e local))) (init body)))
+ (render-to-dom (last body) local ns))
+ (or (= name "begin") (= name "do"))
+ (if
+ (= (len expr) 2)
+ (render-to-dom (nth expr 1) env ns)
+ (let
+ ((frag (create-fragment)))
+ (for-each
+ (fn
+ (i)
+ (let
+ ((result (render-to-dom (nth expr i) env ns)))
+ (when (not (spread? result)) (dom-append frag result))))
+ (range 1 (len expr)))
+ frag))
+ (definition-form? name)
+ (do (trampoline (eval-expr expr env)) (create-fragment))
+ (= name "map")
+ (let
+ ((coll-expr (nth expr 2)))
+ (if
+ (and
+ (island-scope?)
+ (= (type-of coll-expr) "list")
+ (> (len coll-expr) 1)
+ (= (type-of (first coll-expr)) "symbol")
+ (= (symbol-name (first coll-expr)) "deref"))
+ (let
+ ((f (trampoline (eval-expr (nth expr 1) env)))
+ (sig (trampoline (eval-expr (nth coll-expr 1) env))))
+ (if
+ (signal? sig)
+ (reactive-list f sig env ns)
+ (let
+ ((coll (deref sig)) (frag (create-fragment)))
+ (for-each
+ (fn
+ (item)
+ (let
+ ((val (if (lambda? f) (render-lambda-dom f (list item) env ns) (render-to-dom (apply f (list item)) env ns))))
+ (dom-append frag val)))
+ coll)
+ frag)))
+ (let
+ ((f (trampoline (eval-expr (nth expr 1) env)))
+ (coll (trampoline (eval-expr (nth expr 2) env)))
+ (frag (create-fragment)))
+ (for-each
+ (fn
+ (item)
+ (let
+ ((val (if (lambda? f) (render-lambda-dom f (list item) env ns) (render-to-dom (apply f (list item)) env ns))))
+ (dom-append frag val)))
+ coll)
+ frag)))
+ (= name "map-indexed")
+ (let
+ ((f (trampoline (eval-expr (nth expr 1) env)))
+ (coll (trampoline (eval-expr (nth expr 2) env)))
+ (frag (create-fragment)))
+ (for-each-indexed
+ (fn
+ (i item)
+ (let
+ ((val (if (lambda? f) (render-lambda-dom f (list i item) env ns) (render-to-dom (apply f (list i item)) env ns))))
+ (dom-append frag val)))
+ coll)
+ frag)
+ (= name "filter")
+ (render-to-dom (trampoline (eval-expr expr env)) env ns)
+ (= name "portal")
+ (render-dom-portal (rest expr) env ns)
+ (= name "error-boundary")
+ (render-dom-error-boundary (rest expr) env ns)
+ (= name "for-each")
+ (let
+ ((f (trampoline (eval-expr (nth expr 1) env)))
+ (coll (trampoline (eval-expr (nth expr 2) env)))
+ (frag (create-fragment)))
+ (for-each
+ (fn
+ (item)
+ (let
+ ((val (if (lambda? f) (render-lambda-dom f (list item) env ns) (render-to-dom (apply f (list item)) env ns))))
+ (dom-append frag val)))
+ coll)
+ frag)
+ (= name "scope")
+ (let
+ ((scope-name (trampoline (eval-expr (nth expr 1) env)))
+ (rest-args (slice expr 2))
+ (scope-val nil)
+ (body-exprs nil)
+ (frag (create-fragment)))
+ (if
+ (and
+ (>= (len rest-args) 2)
+ (= (type-of (first rest-args)) "keyword")
+ (= (keyword-name (first rest-args)) "value"))
+ (do
+ (set! scope-val (trampoline (eval-expr (nth rest-args 1) env)))
+ (set! body-exprs (slice rest-args 2)))
+ (set! body-exprs rest-args))
+ (scope-push! scope-name scope-val)
+ (for-each
+ (fn (e) (dom-append frag (render-to-dom e env ns)))
+ body-exprs)
+ (scope-pop! scope-name)
+ frag)
+ (= name "provide")
+ (let
+ ((prov-name (trampoline (eval-expr (nth expr 1) env)))
+ (prov-val (trampoline (eval-expr (nth expr 2) env)))
+ (frag (create-fragment)))
+ (scope-push! prov-name prov-val)
+ (for-each
+ (fn (i) (dom-append frag (render-to-dom (nth expr i) env ns)))
+ (range 3 (len expr)))
+ (scope-pop! prov-name)
+ frag)
+ (= name "cyst")
+ (let
+ ((cyst-key (if (and (> (len expr) 2) (= (type-of (nth expr 1)) "keyword") (= (keyword-name (nth expr 1)) "key")) (str (trampoline (eval-expr (nth expr 2) env))) (next-cyst-id)))
+ (cached (get *memo-cache* cyst-key)))
+ (if
+ (and cached (host-get cached "isConnected"))
+ cached
+ (let
+ ((container (dom-create-element "div" nil))
+ (disposers (list))
+ (body-exprs
+ (if
+ (and
+ (> (len expr) 2)
+ (= (type-of (nth expr 1)) "keyword")
+ (= (keyword-name (nth expr 1)) "key"))
+ (slice expr 3)
+ (slice expr 1))))
+ (dom-set-attr container "data-sx-cyst" cyst-key)
+ (let
+ ((body-dom (with-island-scope (fn (d) (append! disposers d)) (fn () (let ((frag (create-fragment))) (for-each (fn (child) (dom-append frag (render-to-dom child env ns))) body-exprs) frag)))))
+ (dom-append container body-dom)
+ (dom-set-data container "sx-disposers" disposers)
+ (dict-set! *memo-cache* cyst-key container)
+ container))))
+ :else (render-to-dom (trampoline (eval-expr expr env)) env ns))))
-(define render-lambda-dom :effects (render) (fn ((f :as lambda) (args :as list) (env :as dict) (ns :as string)) (let ((local (env-merge (lambda-closure f) env))) (for-each-indexed (fn (i p) (env-bind! local p (nth args i))) (lambda-params f)) (render-to-dom (lambda-body f) local ns))))
+(define
+ render-lambda-dom
+ :effects (render)
+ (fn
+ ((f :as lambda) (args :as list) (env :as dict) (ns :as string))
+ (let
+ ((local (env-merge (lambda-closure f) env)))
+ (for-each-indexed
+ (fn (i p) (env-bind! local p (nth args i)))
+ (lambda-params f))
+ (render-to-dom (lambda-body f) local ns))))
-(define render-dom-island :effects (render mutation) (fn ((island :as island) (args :as list) (env :as dict) (ns :as string)) (let ((kwargs (dict)) (children (list))) (reduce (fn (state arg) (let ((skip (get state "skip"))) (if skip (assoc state "skip" false "i" (inc (get state "i"))) (if (and (= (type-of arg) "keyword") (< (inc (get state "i")) (len args))) (let ((val (trampoline (eval-expr (nth args (inc (get state "i"))) env)))) (dict-set! kwargs (keyword-name arg) val) (assoc state "skip" true "i" (inc (get state "i")))) (do (append! children arg) (assoc state "i" (inc (get state "i")))))))) (dict "i" 0 "skip" false) args) (let ((local (env-merge (component-closure island) env)) (island-name (component-name island))) (for-each (fn (p) (env-bind! local p (if (dict-has? kwargs p) (dict-get kwargs p) nil))) (component-params island)) (when (component-has-children? island) (let ((child-frag (create-fragment))) (for-each (fn (c) (dom-append child-frag (render-to-dom c env ns))) children) (env-bind! local "children" child-frag))) (let ((container (dom-create-element "span" nil)) (disposers (list))) (dom-set-attr container "data-sx-island" island-name) (mark-processed! container "island-hydrated") (let ((body-dom (with-island-scope (fn (disposable) (append! disposers disposable)) (fn () (render-to-dom (component-body island) local ns))))) (dom-append container body-dom) (dom-set-data container "sx-disposers" disposers) container))))))
+(define
+ render-dom-island
+ :effects (render mutation)
+ (fn
+ ((island :as island) (args :as list) (env :as dict) (ns :as string))
+ (let
+ ((kwargs (dict)) (children (list)))
+ (reduce
+ (fn
+ (state arg)
+ (let
+ ((skip (get state "skip")))
+ (if
+ skip
+ (assoc state "skip" false "i" (inc (get state "i")))
+ (if
+ (and
+ (= (type-of arg) "keyword")
+ (< (inc (get state "i")) (len args)))
+ (let
+ ((val (trampoline (eval-expr (nth args (inc (get state "i"))) env))))
+ (dict-set! kwargs (keyword-name arg) val)
+ (assoc state "skip" true "i" (inc (get state "i"))))
+ (do
+ (append! children arg)
+ (assoc state "i" (inc (get state "i"))))))))
+ (dict "i" 0 "skip" false)
+ args)
+ (let
+ ((local (env-merge (component-closure island) env))
+ (island-name (component-name island)))
+ (for-each
+ (fn
+ (p)
+ (env-bind!
+ local
+ p
+ (if (dict-has? kwargs p) (dict-get kwargs p) nil)))
+ (component-params island))
+ (when
+ (component-has-children? island)
+ (let
+ ((child-frag (create-fragment)))
+ (for-each
+ (fn (c) (dom-append child-frag (render-to-dom c env ns)))
+ children)
+ (env-bind! local "children" child-frag)))
+ (let
+ ((container (dom-create-element "span" nil)) (disposers (list)))
+ (begin
+ (dom-set-attr container "data-sx-island" island-name)
+ (when
+ (not (empty-dict? kwargs))
+ (dom-set-attr container "data-sx-state" (sx-serialize kwargs))))
+ (mark-processed! container "island-hydrated")
+ (let
+ ((body-dom (with-island-scope (fn (disposable) (append! disposers disposable)) (fn () (render-to-dom (component-body island) local ns)))))
+ (dom-append container body-dom)
+ (dom-set-data container "sx-disposers" disposers)
+ container))))))
-(define render-dom-lake :effects (render) (fn ((args :as list) (env :as dict) (ns :as string)) (let ((lake-id nil) (lake-tag "div") (children (list))) (reduce (fn (state arg) (let ((skip (get state "skip"))) (if skip (assoc state "skip" false "i" (inc (get state "i"))) (if (and (= (type-of arg) "keyword") (< (inc (get state "i")) (len args))) (let ((kname (keyword-name arg)) (kval (trampoline (eval-expr (nth args (inc (get state "i"))) env)))) (cond (= kname "id") (set! lake-id kval) (= kname "tag") (set! lake-tag kval)) (assoc state "skip" true "i" (inc (get state "i")))) (do (append! children arg) (assoc state "i" (inc (get state "i")))))))) (dict "i" 0 "skip" false) args) (let ((el (dom-create-element lake-tag nil))) (dom-set-attr el "data-sx-lake" (or lake-id "")) (for-each (fn (c) (dom-append el (render-to-dom c env ns))) children) el))))
+(define
+ render-dom-lake
+ :effects (render)
+ (fn
+ ((args :as list) (env :as dict) (ns :as string))
+ (let
+ ((lake-id nil) (lake-tag "div") (children (list)))
+ (reduce
+ (fn
+ (state arg)
+ (let
+ ((skip (get state "skip")))
+ (if
+ skip
+ (assoc state "skip" false "i" (inc (get state "i")))
+ (if
+ (and
+ (= (type-of arg) "keyword")
+ (< (inc (get state "i")) (len args)))
+ (let
+ ((kname (keyword-name arg))
+ (kval
+ (trampoline
+ (eval-expr (nth args (inc (get state "i"))) env))))
+ (cond
+ (= kname "id")
+ (set! lake-id kval)
+ (= kname "tag")
+ (set! lake-tag kval))
+ (assoc state "skip" true "i" (inc (get state "i"))))
+ (do
+ (append! children arg)
+ (assoc state "i" (inc (get state "i"))))))))
+ (dict "i" 0 "skip" false)
+ args)
+ (let
+ ((el (dom-create-element lake-tag nil)))
+ (dom-set-attr el "data-sx-lake" (or lake-id ""))
+ (for-each
+ (fn (c) (dom-append el (render-to-dom c env ns)))
+ children)
+ el))))
-(define render-dom-marsh :effects (render) (fn ((args :as list) (env :as dict) (ns :as string)) (let ((marsh-id nil) (marsh-tag "div") (marsh-transform nil) (children (list))) (reduce (fn (state arg) (let ((skip (get state "skip"))) (if skip (assoc state "skip" false "i" (inc (get state "i"))) (if (and (= (type-of arg) "keyword") (< (inc (get state "i")) (len args))) (let ((kname (keyword-name arg)) (kval (trampoline (eval-expr (nth args (inc (get state "i"))) env)))) (cond (= kname "id") (set! marsh-id kval) (= kname "tag") (set! marsh-tag kval) (= kname "transform") (set! marsh-transform kval)) (assoc state "skip" true "i" (inc (get state "i")))) (do (append! children arg) (assoc state "i" (inc (get state "i")))))))) (dict "i" 0 "skip" false) args) (let ((el (dom-create-element marsh-tag nil))) (dom-set-attr el "data-sx-marsh" (or marsh-id "")) (when marsh-transform (dom-set-data el "sx-marsh-transform" marsh-transform)) (dom-set-data el "sx-marsh-env" env) (for-each (fn (c) (dom-append el (render-to-dom c env ns))) children) el))))
+(define
+ render-dom-marsh
+ :effects (render)
+ (fn
+ ((args :as list) (env :as dict) (ns :as string))
+ (let
+ ((marsh-id nil)
+ (marsh-tag "div")
+ (marsh-transform nil)
+ (children (list)))
+ (reduce
+ (fn
+ (state arg)
+ (let
+ ((skip (get state "skip")))
+ (if
+ skip
+ (assoc state "skip" false "i" (inc (get state "i")))
+ (if
+ (and
+ (= (type-of arg) "keyword")
+ (< (inc (get state "i")) (len args)))
+ (let
+ ((kname (keyword-name arg))
+ (kval
+ (trampoline
+ (eval-expr (nth args (inc (get state "i"))) env))))
+ (cond
+ (= kname "id")
+ (set! marsh-id kval)
+ (= kname "tag")
+ (set! marsh-tag kval)
+ (= kname "transform")
+ (set! marsh-transform kval))
+ (assoc state "skip" true "i" (inc (get state "i"))))
+ (do
+ (append! children arg)
+ (assoc state "i" (inc (get state "i"))))))))
+ (dict "i" 0 "skip" false)
+ args)
+ (let
+ ((el (dom-create-element marsh-tag nil)))
+ (dom-set-attr el "data-sx-marsh" (or marsh-id ""))
+ (when
+ marsh-transform
+ (dom-set-data el "sx-marsh-transform" marsh-transform))
+ (dom-set-data el "sx-marsh-env" env)
+ (for-each
+ (fn (c) (dom-append el (render-to-dom c env ns)))
+ children)
+ el))))
-(define reactive-text :effects (render mutation) (fn (sig) (let ((node (create-text-node (str (deref sig))))) (effect (fn () (dom-set-text-content node (str (deref sig))))) node)))
+(define
+ reactive-text
+ :effects (render mutation)
+ (fn
+ (sig)
+ (let
+ ((node (create-text-node (str (deref sig)))))
+ (effect (fn () (dom-set-text-content node (str (deref sig)))))
+ node)))
-(define reactive-attr :effects (render mutation) (fn (el (attr-name :as string) (compute-fn :as lambda)) (let ((existing (or (dom-get-attr el "data-sx-reactive-attrs") "")) (updated (if (empty? existing) attr-name (str existing "," attr-name)))) (dom-set-attr el "data-sx-reactive-attrs" updated)) (effect (fn () (let ((raw (compute-fn))) (let ((val (if (signal? raw) (deref raw) raw))) (cond (or (nil? val) (= val false)) (dom-remove-attr el attr-name) (= val true) (dom-set-attr el attr-name "") :else (dom-set-attr el attr-name (str val)))))))))
+(define
+ reactive-attr
+ :effects (render mutation)
+ (fn
+ (el (attr-name :as string) (compute-fn :as lambda))
+ (let
+ ((existing (or (dom-get-attr el "data-sx-reactive-attrs") ""))
+ (updated
+ (if (empty? existing) attr-name (str existing "," attr-name))))
+ (dom-set-attr el "data-sx-reactive-attrs" updated))
+ (effect
+ (fn
+ ()
+ (let
+ ((raw (compute-fn)))
+ (let
+ ((val (if (signal? raw) (deref raw) raw)))
+ (cond
+ (or (nil? val) (= val false))
+ (dom-remove-attr el attr-name)
+ (= val true)
+ (dom-set-attr el attr-name "")
+ :else (dom-set-attr el attr-name (str val)))))))))
-(define reactive-spread :effects (render mutation) (fn (el (render-fn :as lambda)) (let ((prev-classes (list)) (prev-extra-keys (list))) (let ((existing (or (dom-get-attr el "data-sx-reactive-attrs") ""))) (dom-set-attr el "data-sx-reactive-attrs" (if (empty? existing) "_spread" (str existing ",_spread")))) (effect (fn () (when (not (empty? prev-classes)) (let ((current (or (dom-get-attr el "class") "")) (tokens (filter (fn (c) (not (= c ""))) (split current " "))) (kept (filter (fn (c) (not (some (fn (pc) (= pc c)) prev-classes))) tokens))) (if (empty? kept) (dom-remove-attr el "class") (dom-set-attr el "class" (join " " kept))))) (for-each (fn (k) (dom-remove-attr el k)) prev-extra-keys) (let ((result (render-fn))) (if (spread? result) (let ((attrs (spread-attrs result)) (cls-str (or (dict-get attrs "class") "")) (new-classes (filter (fn (c) (not (= c ""))) (split cls-str " "))) (extra-keys (filter (fn (k) (not (= k "class"))) (keys attrs)))) (set! prev-classes new-classes) (set! prev-extra-keys extra-keys) (when (not (empty? new-classes)) (let ((current (or (dom-get-attr el "class") ""))) (dom-set-attr el "class" (if (and current (not (= current ""))) (str current " " cls-str) cls-str)))) (for-each (fn (k) (dom-set-attr el k (str (dict-get attrs k)))) extra-keys) (run-post-render-hooks)) (do (set! prev-classes (list)) (set! prev-extra-keys (list))))))))))
+(define
+ reactive-spread
+ :effects (render mutation)
+ (fn
+ (el (render-fn :as lambda))
+ (let
+ ((prev-classes (list)) (prev-extra-keys (list)))
+ (let
+ ((existing (or (dom-get-attr el "data-sx-reactive-attrs") "")))
+ (dom-set-attr
+ el
+ "data-sx-reactive-attrs"
+ (if (empty? existing) "_spread" (str existing ",_spread"))))
+ (effect
+ (fn
+ ()
+ (when
+ (not (empty? prev-classes))
+ (let
+ ((current (or (dom-get-attr el "class") ""))
+ (tokens
+ (filter (fn (c) (not (= c ""))) (split current " ")))
+ (kept
+ (filter
+ (fn (c) (not (some (fn (pc) (= pc c)) prev-classes)))
+ tokens)))
+ (if
+ (empty? kept)
+ (dom-remove-attr el "class")
+ (dom-set-attr el "class" (join " " kept)))))
+ (for-each (fn (k) (dom-remove-attr el k)) prev-extra-keys)
+ (let
+ ((result (render-fn)))
+ (if
+ (spread? result)
+ (let
+ ((attrs (spread-attrs result))
+ (cls-str (or (dict-get attrs "class") ""))
+ (new-classes
+ (filter (fn (c) (not (= c ""))) (split cls-str " ")))
+ (extra-keys
+ (filter (fn (k) (not (= k "class"))) (keys attrs))))
+ (set! prev-classes new-classes)
+ (set! prev-extra-keys extra-keys)
+ (when
+ (not (empty? new-classes))
+ (let
+ ((current (or (dom-get-attr el "class") "")))
+ (dom-set-attr
+ el
+ "class"
+ (if
+ (and current (not (= current "")))
+ (str current " " cls-str)
+ cls-str))))
+ (for-each
+ (fn (k) (dom-set-attr el k (str (dict-get attrs k))))
+ extra-keys)
+ (run-post-render-hooks))
+ (do (set! prev-classes (list)) (set! prev-extra-keys (list))))))))))
-(define reactive-fragment :effects (render mutation) (fn ((test-fn :as lambda) (render-fn :as lambda) (env :as dict) (ns :as string)) (let ((marker (create-comment "island-fragment")) (current-nodes (list))) (effect (fn () (for-each (fn (n) (dom-remove n)) current-nodes) (set! current-nodes (list)) (when (test-fn) (let ((frag (render-fn))) (set! current-nodes (dom-child-nodes frag)) (dom-insert-after marker frag))))) marker)))
+(define
+ reactive-fragment
+ :effects (render mutation)
+ (fn
+ ((test-fn :as lambda)
+ (render-fn :as lambda)
+ (env :as dict)
+ (ns :as string))
+ (let
+ ((marker (create-comment "island-fragment")) (current-nodes (list)))
+ (effect
+ (fn
+ ()
+ (for-each (fn (n) (dom-remove n)) current-nodes)
+ (set! current-nodes (list))
+ (when
+ (test-fn)
+ (let
+ ((frag (render-fn)))
+ (set! current-nodes (dom-child-nodes frag))
+ (dom-insert-after marker frag)))))
+ marker)))
-(define render-list-item :effects (render) (fn ((map-fn :as lambda) item (env :as dict) (ns :as string)) (if (lambda? map-fn) (render-lambda-dom map-fn (list item) env ns) (render-to-dom (apply map-fn (list item)) env ns))))
+(define
+ render-list-item
+ :effects (render)
+ (fn
+ ((map-fn :as lambda) item (env :as dict) (ns :as string))
+ (if
+ (lambda? map-fn)
+ (render-lambda-dom map-fn (list item) env ns)
+ (render-to-dom (apply map-fn (list item)) env ns))))
-(define extract-key :effects (render) (fn (node (index :as number)) (let ((k (dom-get-attr node "key"))) (if k (do (dom-remove-attr node "key") k) (let ((dk (dom-get-data node "key"))) (if dk (str dk) (str "__idx_" index)))))))
+(define
+ extract-key
+ :effects (render)
+ (fn
+ (node (index :as number))
+ (let
+ ((k (dom-get-attr node "key")))
+ (if
+ k
+ (do (dom-remove-attr node "key") k)
+ (let
+ ((dk (dom-get-data node "key")))
+ (if dk (str dk) (str "__idx_" index)))))))
-(define reactive-list :effects (render mutation) (fn ((map-fn :as lambda) (items-sig :as signal) (env :as dict) (ns :as string)) (let ((container (create-fragment)) (marker (create-comment "island-list")) (key-map (dict)) (key-order (list))) (dom-append container marker) (effect (fn () (let ((items (deref items-sig))) (if (dom-parent marker) (let ((new-map (dict)) (new-keys (list)) (has-keys false)) (for-each-indexed (fn (idx item) (let ((rendered (render-list-item map-fn item env ns)) (key (extract-key rendered idx))) (when (and (not has-keys) (not (starts-with? key "__idx_"))) (set! has-keys true)) (if (dict-has? key-map key) (dict-set! new-map key (dict-get key-map key)) (dict-set! new-map key rendered)) (append! new-keys key))) items) (if (not has-keys) (do (dom-remove-children-after marker) (let ((frag (create-fragment))) (for-each (fn (k) (dom-append frag (dict-get new-map k))) new-keys) (dom-insert-after marker frag))) (do (for-each (fn (old-key) (when (not (dict-has? new-map old-key)) (dom-remove (dict-get key-map old-key)))) key-order) (let ((cursor marker)) (for-each (fn (k) (let ((node (dict-get new-map k)) (next (dom-next-sibling cursor))) (when (not (identical? node next)) (dom-insert-after cursor node)) (set! cursor node))) new-keys)))) (set! key-map new-map) (set! key-order new-keys)) (for-each-indexed (fn (idx item) (let ((rendered (render-list-item map-fn item env ns)) (key (extract-key rendered idx))) (dict-set! key-map key rendered) (append! key-order key) (dom-append container rendered))) items))))) container)))
+(define
+ reactive-list
+ :effects (render mutation)
+ (fn
+ ((map-fn :as lambda)
+ (items-sig :as signal)
+ (env :as dict)
+ (ns :as string))
+ (let
+ ((container (create-fragment))
+ (marker (create-comment "island-list"))
+ (key-map (dict))
+ (key-order (list)))
+ (dom-append container marker)
+ (effect
+ (fn
+ ()
+ (let
+ ((items (deref items-sig)))
+ (if
+ (dom-parent marker)
+ (let
+ ((new-map (dict)) (new-keys (list)) (has-keys false))
+ (for-each-indexed
+ (fn
+ (idx item)
+ (let
+ ((rendered (render-list-item map-fn item env ns))
+ (key (extract-key rendered idx)))
+ (when
+ (and
+ (not has-keys)
+ (not (starts-with? key "__idx_")))
+ (set! has-keys true))
+ (if
+ (dict-has? key-map key)
+ (dict-set! new-map key (dict-get key-map key))
+ (dict-set! new-map key rendered))
+ (append! new-keys key)))
+ items)
+ (if
+ (not has-keys)
+ (do
+ (dom-remove-children-after marker)
+ (let
+ ((frag (create-fragment)))
+ (for-each
+ (fn (k) (dom-append frag (dict-get new-map k)))
+ new-keys)
+ (dom-insert-after marker frag)))
+ (do
+ (for-each
+ (fn
+ (old-key)
+ (when
+ (not (dict-has? new-map old-key))
+ (dom-remove (dict-get key-map old-key))))
+ key-order)
+ (let
+ ((cursor marker))
+ (for-each
+ (fn
+ (k)
+ (let
+ ((node (dict-get new-map k))
+ (next (dom-next-sibling cursor)))
+ (when
+ (not (identical? node next))
+ (dom-insert-after cursor node))
+ (set! cursor node)))
+ new-keys))))
+ (set! key-map new-map)
+ (set! key-order new-keys))
+ (for-each-indexed
+ (fn
+ (idx item)
+ (let
+ ((rendered (render-list-item map-fn item env ns))
+ (key (extract-key rendered idx)))
+ (dict-set! key-map key rendered)
+ (append! key-order key)
+ (dom-append container rendered)))
+ items)))))
+ container)))
-(define bind-input :effects (render mutation) (fn (el (sig :as signal)) (let ((input-type (lower (or (dom-get-attr el "type") ""))) (is-checkbox (or (= input-type "checkbox") (= input-type "radio")))) (if is-checkbox (dom-set-prop el "checked" (deref sig)) (dom-set-prop el "value" (str (deref sig)))) (effect (fn () (if is-checkbox (dom-set-prop el "checked" (deref sig)) (let ((v (str (deref sig)))) (when (!= (dom-get-prop el "value") v) (dom-set-prop el "value" v)))))) (dom-on el (if is-checkbox "change" "input") (fn (e) (if is-checkbox (reset! sig (dom-get-prop el "checked")) (reset! sig (dom-get-prop el "value"))))))))
+(define
+ bind-input
+ :effects (render mutation)
+ (fn
+ (el (sig :as signal))
+ (let
+ ((input-type (lower (or (dom-get-attr el "type") "")))
+ (is-checkbox (or (= input-type "checkbox") (= input-type "radio"))))
+ (if
+ is-checkbox
+ (dom-set-prop el "checked" (deref sig))
+ (dom-set-prop el "value" (str (deref sig))))
+ (effect
+ (fn
+ ()
+ (if
+ is-checkbox
+ (dom-set-prop el "checked" (deref sig))
+ (let
+ ((v (str (deref sig))))
+ (when
+ (!= (dom-get-prop el "value") v)
+ (dom-set-prop el "value" v))))))
+ (dom-on
+ el
+ (if is-checkbox "change" "input")
+ (fn
+ (e)
+ (if
+ is-checkbox
+ (reset! sig (dom-get-prop el "checked"))
+ (reset! sig (dom-get-prop el "value"))))))))
(define *use-cek-reactive* true)
(define enable-cek-reactive! (fn () (set! *use-cek-reactive* true)))
-(define cek-reactive-text :effects (render mutation) (fn (expr env) (let ((node (create-text-node "")) (update-fn (fn (val) (dom-set-text-content node (str val))))) (let ((initial (cek-run (make-cek-state expr env (list (make-reactive-reset-frame env update-fn true)))))) (dom-set-text-content node (str initial)) node))))
+(define
+ cek-reactive-text
+ :effects (render mutation)
+ (fn
+ (expr env)
+ (let
+ ((node (create-text-node ""))
+ (update-fn (fn (val) (dom-set-text-content node (str val)))))
+ (let
+ ((initial (cek-run (make-cek-state expr env (list (make-reactive-reset-frame env update-fn true))))))
+ (dom-set-text-content node (str initial))
+ node))))
-(define cek-reactive-attr :effects (render mutation) (fn (el attr-name expr env) (let ((update-fn (fn (val) (cond (or (nil? val) (= val false)) (dom-remove-attr el attr-name) (= val true) (dom-set-attr el attr-name "") :else (dom-set-attr el attr-name (str val)))))) (let ((existing (or (dom-get-attr el "data-sx-reactive-attrs") "")) (updated (if (empty? existing) attr-name (str existing "," attr-name)))) (dom-set-attr el "data-sx-reactive-attrs" updated)) (let ((initial (cek-run (make-cek-state expr env (list (make-reactive-reset-frame env update-fn true)))))) (cek-call update-fn (list initial))))))
+(define
+ cek-reactive-attr
+ :effects (render mutation)
+ (fn
+ (el attr-name expr env)
+ (let
+ ((update-fn (fn (val) (cond (or (nil? val) (= val false)) (dom-remove-attr el attr-name) (= val true) (dom-set-attr el attr-name "") :else (dom-set-attr el attr-name (str val))))))
+ (let
+ ((existing (or (dom-get-attr el "data-sx-reactive-attrs") ""))
+ (updated
+ (if (empty? existing) attr-name (str existing "," attr-name))))
+ (dom-set-attr el "data-sx-reactive-attrs" updated))
+ (let
+ ((initial (cek-run (make-cek-state expr env (list (make-reactive-reset-frame env update-fn true))))))
+ (cek-call update-fn (list initial))))))
-(define render-dom-portal :effects (render) (fn ((args :as list) (env :as dict) (ns :as string)) (let ((selector (trampoline (eval-expr (first args) env))) (target (or (dom-query selector) (dom-ensure-element selector)))) (if (not target) (create-comment (str "portal: " selector " (not found)")) (let ((marker (create-comment (str "portal: " selector))) (frag (create-fragment))) (for-each (fn (child) (dom-append frag (render-to-dom child env ns))) (rest args)) (let ((portal-nodes (dom-child-nodes frag))) (dom-append target frag) (register-in-scope (fn () (for-each (fn (n) (dom-remove n)) portal-nodes)))) marker)))))
+(define
+ render-dom-portal
+ :effects (render)
+ (fn
+ ((args :as list) (env :as dict) (ns :as string))
+ (let
+ ((selector (trampoline (eval-expr (first args) env)))
+ (target (or (dom-query selector) (dom-ensure-element selector))))
+ (if
+ (not target)
+ (create-comment (str "portal: " selector " (not found)"))
+ (let
+ ((marker (create-comment (str "portal: " selector)))
+ (frag (create-fragment)))
+ (for-each
+ (fn (child) (dom-append frag (render-to-dom child env ns)))
+ (rest args))
+ (let
+ ((portal-nodes (dom-child-nodes frag)))
+ (dom-append target frag)
+ (register-in-scope
+ (fn () (for-each (fn (n) (dom-remove n)) portal-nodes))))
+ marker)))))
-(define render-dom-error-boundary :effects (render) (fn ((args :as list) (env :as dict) (ns :as string)) (let ((fallback-expr (first args)) (body-exprs (rest args)) (container (dom-create-element "div" nil)) (retry-version (signal 0))) (dom-set-attr container "data-sx-boundary" "true") (effect (fn () (deref retry-version) (dom-set-prop container "innerHTML" "") (scope-push! "sx-island-scope" nil) (try-catch (fn () (let ((frag (create-fragment))) (for-each (fn (child) (dom-append frag (render-to-dom child env ns))) body-exprs) (dom-append container frag)) (scope-pop! "sx-island-scope")) (fn (err) (scope-pop! "sx-island-scope") (let ((fallback-fn (trampoline (eval-expr fallback-expr env))) (retry-fn (fn () (swap! retry-version (fn (n) (+ n 1)))))) (let ((fallback-dom (if (lambda? fallback-fn) (render-lambda-dom fallback-fn (list err retry-fn) env ns) (render-to-dom (apply fallback-fn (list err retry-fn)) env ns)))) (dom-append container fallback-dom))))))) container)))
+(define
+ render-dom-error-boundary
+ :effects (render)
+ (fn
+ ((args :as list) (env :as dict) (ns :as string))
+ (let
+ ((fallback-expr (first args))
+ (body-exprs (rest args))
+ (container (dom-create-element "div" nil))
+ (retry-version (signal 0)))
+ (dom-set-attr container "data-sx-boundary" "true")
+ (effect
+ (fn
+ ()
+ (deref retry-version)
+ (dom-set-prop container "innerHTML" "")
+ (scope-push! "sx-island-scope" nil)
+ (try-catch
+ (fn
+ ()
+ (let
+ ((frag (create-fragment)))
+ (for-each
+ (fn
+ (child)
+ (dom-append frag (render-to-dom child env ns)))
+ body-exprs)
+ (dom-append container frag))
+ (scope-pop! "sx-island-scope"))
+ (fn
+ (err)
+ (scope-pop! "sx-island-scope")
+ (let
+ ((fallback-fn (trampoline (eval-expr fallback-expr env)))
+ (retry-fn
+ (fn () (swap! retry-version (fn (n) (+ n 1))))))
+ (let
+ ((fallback-dom (if (lambda? fallback-fn) (render-lambda-dom fallback-fn (list err retry-fn) env ns) (render-to-dom (apply fallback-fn (list err retry-fn)) env ns))))
+ (dom-append container fallback-dom)))))))
+ container)))
diff --git a/shared/static/wasm/sx/adapter-dom.sxbc b/shared/static/wasm/sx/adapter-dom.sxbc
deleted file mode 100644
index ea1774ff..00000000
--- a/shared/static/wasm/sx/adapter-dom.sxbc
+++ /dev/null
@@ -1,1184 +0,0 @@
-(sxbc 1 "3bc60b6ea15ee2ba"
- (code
- :bytecode (1 1 0 128 0 0 5 1 3 0 128 2 0 5 51 5 0 128 4 0 5 52 7 0 0 128 6 0 5 1 9 0 128 8 0 5 51 11 0 128 10 0 5 51 13 0 128 12 0 5 51 15 0 128 14 0 5 51 17 0 128 16 0 5 51 19 0 128 18 0 5 51 21 0 128 20 0 5 51 23 0 128 22 0 5 51 25 0 128 24 0 5 51 27 0 128 26 0 5 51 29 0 128 28 0 5 1 32 0 1 33 0 1 34 0 1 35 0 1 36 0 1 37 0 1 38 0 1 39 0 1 40 0 1 41 0 1 42 0 1 43 0 1 44 0 1 45 0 1 46 0 1 47 0 1 48 0 1 49 0 1 50 0 1 51 0 1 52 0 1 53 0 1 54 0 52 31 0 23 128 30 0 5 51 56 0 128 55 0 5 51 58 0 128 57 0 5 51 60 0 128 59 0 5 51 62 0 128 61 0 5 51 64 0 128 63 0 5 51 66 0 128 65 0 5 51 68 0 128 67 0 5 51 70 0 128 69 0 5 51 72 0 128 71 0 5 51 74 0 128 73 0 5 51 76 0 128 75 0 5 51 78 0 128 77 0 5 51 80 0 128 79 0 5 51 82 0 128 81 0 5 3 128 83 0 5 51 85 0 128 84 0 5 51 87 0 128 86 0 5 51 89 0 128 88 0 5 51 91 0 128 90 0 5 51 93 0 128 92 0 50)
- :constants (
- "SVG_NS"
- "http://www.w3.org/2000/svg"
- "MATH_NS"
- "http://www.w3.org/1998/Math/MathML"
- "island-scope?"
- (code
- :bytecode (1 3 0 52 2 0 1 52 1 0 1 52 0 0 1 50)
- :constants (
- "not"
- "nil?"
- "scope-peek"
- "sx-island-scope"))
- "*memo-cache*"
- "dict"
- "*cyst-counter*"
- 0
- "next-cyst-id"
- (code
- :bytecode (20 1 0 1 2 0 52 0 0 2 21 1 0 5 1 4 0 20 1 0 52 3 0 2 50)
- :constants (
- "+"
- "*cyst-counter*"
- 1
- "str"
- "sx-cyst-"))
- "contains-deref?"
- (code :arity 1
- :bytecode (16 0 52 1 0 1 52 0 0 1 33 4 0 4 32 69 0 16 0 52 2 0 1 33 4 0 4 32 56 0 16 0 52 5 0 1 52 4 0 1 1 6 0 52 3 0 2 6 33 19 0 5 20 7 0 16 0 52 5 0 1 48 1 1 8 0 52 3 0 2 33 4 0 3 32 9 0 20 10 0 16 0 52 9 0 2 50)
- :constants (
- "not"
- "list?"
- "empty?"
- "="
- "type-of"
- "first"
- "symbol"
- "symbol-name"
- "deref"
- "some"
- "contains-deref?"))
- "dom-on"
- (code :arity 3
- :bytecode (20 0 0 16 0 16 1 16 2 52 1 0 1 33 36 0 1 3 0 16 2 52 5 0 1 52 4 0 1 52 2 0 2 33 8 0 51 6 0 1 2 32 5 0 51 7 0 1 2 32 2 0 16 2 49 3 50)
- :constants (
- "dom-listen"
- "lambda?"
- "="
- 0
- "len"
- "lambda-params"
- (code :arity 1 :upvalue-count 1
- :bytecode (20 0 0 20 1 0 18 0 52 2 0 0 48 2 48 1 5 20 3 0 49 0 50)
- :constants (
- "trampoline"
- "call-lambda"
- "list"
- "run-post-render-hooks"))
- (code :arity 1 :upvalue-count 1
- :bytecode (20 0 0 20 1 0 18 0 16 0 52 2 0 1 48 2 48 1 5 20 3 0 49 0 50)
- :constants (
- "trampoline"
- "call-lambda"
- "list"
- "run-post-render-hooks"))))
- "render-to-dom"
- (code :arity 3
- :bytecode (20 0 0 3 48 1 5 16 0 52 1 0 1 6 1 2 0 52 3 0 2 33 9 0 5 20 4 0 49 0 32 106 1 6 1 5 0 52 3 0 2 33 9 0 5 20 4 0 49 0 32 86 1 6 1 6 0 52 3 0 2 33 15 0 5 20 7 0 16 0 52 8 0 1 49 1 32 60 1 6 1 9 0 52 3 0 2 33 11 0 5 20 10 0 16 0 49 1 32 38 1 6 1 11 0 52 3 0 2 33 15 0 5 20 10 0 16 0 52 12 0 1 49 1 32 12 1 6 1 13 0 52 3 0 2 33 27 0 5 20 14 0 20 15 0 20 16 0 16 0 16 1 48 2 48 1 16 1 16 2 49 3 32 230 0 6 1 17 0 52 3 0 2 33 16 0 5 20 10 0 20 18 0 16 0 48 1 49 1 32 203 0 6 1 19 0 52 3 0 2 33 6 0 5 16 0 32 186 0 6 1 20 0 52 3 0 2 33 36 0 5 20 22 0 48 0 52 21 0 1 33 16 0 1 24 0 16 0 52 25 0 1 52 23 0 2 32 1 0 2 5 16 0 32 139 0 6 1 26 0 52 3 0 2 33 26 0 5 16 0 1 28 0 52 27 0 2 33 5 0 16 0 32 5 0 20 4 0 49 0 32 102 0 6 1 29 0 52 3 0 2 33 32 0 5 16 0 52 30 0 1 33 8 0 20 4 0 49 0 32 11 0 20 31 0 16 0 16 1 16 2 49 3 32 59 0 5 20 32 0 16 0 48 1 33 37 0 20 22 0 48 0 33 10 0 20 33 0 16 0 49 1 32 16 0 20 10 0 20 34 0 16 0 48 1 52 12 0 1 49 1 32 11 0 20 10 0 16 0 52 12 0 1 49 1 50)
- :constants (
- "set-render-active!"
- "type-of"
- "nil"
- "="
- "create-fragment"
- "boolean"
- "raw-html"
- "dom-parse-html"
- "raw-html-content"
- "string"
- "create-text-node"
- "number"
- "str"
- "symbol"
- "render-to-dom"
- "trampoline"
- "eval-expr"
- "keyword"
- "keyword-name"
- "dom-node"
- "spread"
- "not"
- "island-scope?"
- "scope-emit!"
- "element-attrs"
- "spread-attrs"
- "dict"
- "has-key?"
- "__host_handle"
- "list"
- "empty?"
- "render-dom-list"
- "signal?"
- "reactive-text"
- "deref"))
- "render-dom-list"
- (code :arity 3
- :bytecode (16 0 52 0 0 1 17 3 16 3 52 2 0 1 1 3 0 52 1 0 2 33 253 2 20 4 0 16 3 48 1 17 4 16 0 52 5 0 1 17 5 16 4 1 6 0 52 1 0 2 33 12 0 20 7 0 16 5 16 1 49 2 32 209 2 16 4 1 8 0 52 1 0 2 33 14 0 20 9 0 16 5 16 1 16 2 49 3 32 183 2 16 4 1 10 0 52 1 0 2 33 14 0 20 11 0 16 5 16 1 16 2 49 3 32 157 2 16 4 1 12 0 52 1 0 2 33 14 0 20 13 0 16 5 16 1 16 2 49 3 32 131 2 16 4 1 15 0 52 14 0 2 33 23 0 20 16 0 16 4 1 18 0 52 17 0 2 16 5 16 1 16 2 49 4 32 96 2 20 19 0 16 4 48 1 33 91 0 20 21 0 16 4 52 20 0 2 6 33 43 0 5 16 5 52 23 0 1 1 24 0 52 22 0 2 6 33 18 0 5 16 5 52 0 0 1 52 2 0 1 1 25 0 52 1 0 2 6 34 3 0 5 16 2 33 16 0 20 16 0 16 4 16 5 16 1 16 2 49 4 32 13 0 20 26 0 16 4 16 0 16 1 16 2 49 4 32 251 1 20 27 0 16 1 16 4 48 2 6 33 14 0 5 20 29 0 16 1 16 4 48 2 52 28 0 1 33 30 0 20 30 0 20 31 0 20 29 0 16 1 16 4 48 2 16 5 16 1 48 3 16 1 16 2 49 3 32 191 1 20 21 0 16 4 52 20 0 2 33 16 0 20 16 0 16 4 16 5 16 1 16 2 49 4 32 163 1 16 4 1 32 0 52 14 0 2 6 33 28 0 5 20 27 0 16 1 16 4 48 2 6 33 14 0 5 20 29 0 16 1 16 4 48 2 52 33 0 1 33 77 0 1 35 0 52 34 0 1 33 44 0 20 29 0 16 1 16 4 48 2 17 6 20 36 0 1 37 0 2 48 2 17 7 20 38 0 16 7 1 39 0 16 6 52 40 0 1 48 3 5 16 7 32 20 0 20 41 0 20 29 0 16 1 16 4 48 2 16 5 16 1 16 2 49 4 32 42 1 16 4 1 32 0 52 14 0 2 33 46 0 20 29 0 16 1 16 4 48 2 17 6 16 6 52 42 0 1 33 16 0 20 43 0 16 6 16 5 16 1 16 2 49 4 32 7 0 20 44 0 16 4 49 1 32 240 0 16 4 1 46 0 52 45 0 2 1 24 0 52 22 0 2 6 33 36 0 5 16 5 52 23 0 1 1 24 0 52 22 0 2 6 33 18 0 5 16 5 52 0 0 1 52 2 0 1 1 25 0 52 1 0 2 33 16 0 20 16 0 16 4 16 5 16 1 16 2 49 4 32 165 0 16 2 33 16 0 20 16 0 16 4 16 5 16 1 16 2 49 4 32 144 0 16 4 1 47 0 52 1 0 2 6 33 6 0 5 20 48 0 48 0 33 59 0 20 49 0 20 50 0 16 5 52 0 0 1 16 1 48 2 48 1 17 6 20 51 0 16 6 48 1 33 10 0 20 52 0 16 6 49 1 32 16 0 20 53 0 20 47 0 16 6 48 1 52 54 0 1 49 1 32 63 0 20 48 0 48 0 6 33 8 0 5 20 55 0 16 0 48 1 33 20 0 20 52 0 20 56 0 51 57 0 1 0 1 1 48 1 49 1 32 23 0 20 30 0 20 49 0 20 50 0 16 0 16 1 48 2 48 1 16 1 16 2 49 3 32 78 0 16 3 52 58 0 1 6 34 14 0 5 16 3 52 2 0 1 1 59 0 52 1 0 2 33 26 0 20 30 0 20 49 0 20 50 0 16 0 16 1 48 2 48 1 16 1 16 2 49 3 32 25 0 20 60 0 48 0 17 4 51 62 0 1 1 1 2 1 4 16 0 52 61 0 2 5 16 4 50)
- :constants (
- "first"
- "="
- "type-of"
- "symbol"
- "symbol-name"
- "rest"
- "raw!"
- "render-dom-raw"
- "<>"
- "render-dom-fragment"
- "lake"
- "render-dom-lake"
- "marsh"
- "render-dom-marsh"
- "starts-with?"
- "html:"
- "render-dom-element"
- "slice"
- 5
- "render-dom-form?"
- "contains?"
- "HTML_TAGS"
- ">"
- "len"
- 0
- "keyword"
- "dispatch-render-form"
- "env-has?"
- "macro?"
- "env-get"
- "render-to-dom"
- "expand-macro"
- "~"
- "island?"
- "scope-peek"
- "sx-render-markers"
- "dom-create-element"
- "span"
- "dom-set-attr"
- "data-sx-island"
- "component-name"
- "render-dom-island"
- "component?"
- "render-dom-component"
- "render-dom-unknown-component"
- "index-of"
- "-"
- "deref"
- "island-scope?"
- "trampoline"
- "eval-expr"
- "signal?"
- "reactive-text"
- "create-text-node"
- "str"
- "contains-deref?"
- "computed"
- (code :upvalue-count 2
- :bytecode (20 0 0 20 1 0 18 0 18 1 48 2 49 1 50)
- :constants (
- "trampoline"
- "eval-expr"))
- "lambda?"
- "list"
- "create-fragment"
- "for-each"
- (code :arity 1 :upvalue-count 3
- :bytecode (20 0 0 16 0 18 0 18 1 48 3 17 1 16 1 52 2 0 1 52 1 0 1 33 12 0 20 3 0 18 2 16 1 49 2 32 1 0 2 50)
- :constants (
- "render-to-dom"
- "not"
- "spread?"
- "dom-append"))))
- "render-dom-element"
- (code :arity 4
- :bytecode (16 0 1 1 0 52 0 0 2 33 6 0 20 2 0 32 20 0 16 0 1 3 0 52 0 0 2 33 6 0 20 4 0 32 2 0 16 3 17 4 20 5 0 16 0 16 4 48 2 17 5 1 7 0 2 52 6 0 2 5 51 9 0 1 1 1 2 1 5 1 0 1 4 1 11 0 1 12 0 1 13 0 4 52 10 0 4 16 1 52 8 0 3 5 51 15 0 1 5 1 7 0 52 16 0 1 52 14 0 2 5 1 7 0 52 17 0 1 5 16 5 50)
- :constants (
- "="
- "svg"
- "SVG_NS"
- "math"
- "MATH_NS"
- "dom-create-element"
- "scope-push!"
- "element-attrs"
- "reduce"
- (code :arity 2 :upvalue-count 5
- :bytecode (16 0 1 1 0 52 0 0 2 17 2 16 2 33 29 0 16 0 1 1 0 4 1 3 0 16 0 1 3 0 52 0 0 2 52 4 0 1 52 2 0 5 32 58 2 16 1 52 6 0 1 1 7 0 52 5 0 2 6 33 24 0 5 16 0 1 3 0 52 0 0 2 52 4 0 1 18 0 52 9 0 1 52 8 0 2 33 154 1 20 10 0 16 1 48 1 17 3 18 0 16 0 1 3 0 52 0 0 2 52 4 0 1 52 11 0 2 17 4 16 3 1 13 0 52 12 0 2 33 51 0 20 14 0 20 15 0 16 4 18 1 48 2 48 1 17 5 20 16 0 16 5 48 1 33 21 0 20 17 0 18 2 16 3 1 19 0 52 18 0 2 16 5 48 3 32 1 0 2 32 31 1 16 3 1 20 0 52 5 0 2 33 42 0 20 14 0 20 15 0 16 4 18 1 48 2 48 1 17 5 20 21 0 16 5 48 1 33 12 0 20 22 0 18 2 16 5 48 2 32 1 0 2 32 233 0 16 3 1 23 0 52 5 0 2 33 30 0 20 14 0 20 15 0 16 4 18 1 48 2 48 1 17 5 16 5 1 25 0 18 2 52 24 0 3 32 191 0 16 3 1 26 0 52 5 0 2 33 35 0 20 14 0 20 15 0 16 4 18 1 48 2 48 1 17 5 20 27 0 18 2 1 26 0 16 5 52 28 0 1 48 3 32 144 0 20 29 0 48 0 33 19 0 20 30 0 18 2 16 3 51 31 0 1 4 0 1 48 3 32 117 0 20 14 0 20 15 0 16 4 18 1 48 2 48 1 17 5 16 5 52 32 0 1 6 34 8 0 5 16 5 4 52 5 0 2 33 4 0 2 32 76 0 20 34 0 16 3 52 33 0 2 33 24 0 16 5 33 15 0 20 27 0 18 2 16 3 1 35 0 48 3 32 1 0 2 32 40 0 16 5 3 52 5 0 2 33 15 0 20 27 0 18 2 16 3 1 35 0 48 3 32 15 0 20 27 0 18 2 16 3 16 5 52 28 0 1 48 3 5 16 0 1 1 0 3 1 3 0 16 0 1 3 0 52 0 0 2 52 4 0 1 52 2 0 5 32 116 0 20 37 0 18 3 52 33 0 2 52 36 0 1 33 76 0 20 38 0 16 1 18 1 18 4 48 3 17 3 16 3 52 39 0 1 6 33 6 0 5 20 29 0 48 0 33 19 0 20 40 0 18 2 51 41 0 1 1 0 1 0 4 48 2 32 22 0 16 3 52 39 0 1 33 4 0 2 32 9 0 20 42 0 18 2 16 3 48 2 32 1 0 2 5 16 0 1 3 0 16 0 1 3 0 52 0 0 2 52 4 0 1 52 2 0 3 50)
- :constants (
- "get"
- "skip"
- "assoc"
- "i"
- "inc"
- "="
- "type-of"
- "keyword"
- "<"
- "len"
- "keyword-name"
- "nth"
- "starts-with?"
- "on-"
- "trampoline"
- "eval-expr"
- "callable?"
- "dom-on"
- "slice"
- 3
- "bind"
- "signal?"
- "bind-input"
- "ref"
- "dict-set!"
- "current"
- "key"
- "dom-set-attr"
- "str"
- "island-scope?"
- "reactive-attr"
- (code :upvalue-count 2
- :bytecode (20 0 0 20 1 0 18 0 18 1 48 2 49 1 50)
- :constants (
- "trampoline"
- "eval-expr"))
- "nil?"
- "contains?"
- "BOOLEAN_ATTRS"
- ""
- "not"
- "VOID_ELEMENTS"
- "render-to-dom"
- "spread?"
- "reactive-spread"
- (code :upvalue-count 3
- :bytecode (20 0 0 18 0 18 1 18 2 49 3 50)
- :constants (
- "render-to-dom"))
- "dom-append"))
- "dict"
- "i"
- 0
- "skip"
- "for-each"
- (code :arity 1 :upvalue-count 1
- :bytecode (51 1 0 1 0 0 0 16 0 52 2 0 1 52 0 0 2 50)
- :constants (
- "for-each"
- (code :arity 1 :upvalue-count 2
- :bytecode (18 0 16 0 52 0 0 2 17 1 16 0 1 2 0 52 1 0 2 33 64 0 20 3 0 18 1 1 2 0 48 2 17 2 20 4 0 18 1 1 2 0 16 2 6 33 14 0 5 16 2 1 6 0 52 1 0 2 52 5 0 1 33 14 0 16 2 1 8 0 16 1 52 7 0 3 32 2 0 16 1 49 3 32 91 0 16 0 1 9 0 52 1 0 2 33 64 0 20 3 0 18 1 1 9 0 48 2 17 2 20 4 0 18 1 1 9 0 16 2 6 33 14 0 5 16 2 1 6 0 52 1 0 2 52 5 0 1 33 14 0 16 2 1 10 0 16 1 52 7 0 3 32 2 0 16 1 49 3 32 15 0 20 4 0 18 1 16 0 16 1 52 7 0 1 49 3 50)
- :constants (
- "dict-get"
- "="
- "class"
- "dom-get-attr"
- "dom-set-attr"
- "not"
- ""
- "str"
- " "
- "style"
- ";"))
- "keys"))
- "scope-emitted"
- "scope-pop!"))
- "render-dom-component"
- (code :arity 4
- :bytecode (52 0 0 0 17 4 52 1 0 0 17 5 51 3 0 1 1 1 2 1 4 1 5 1 4 0 1 5 0 1 6 0 4 52 0 0 4 16 1 52 2 0 3 5 20 7 0 16 0 52 8 0 1 16 2 48 2 17 6 51 10 0 1 6 1 4 16 0 52 11 0 1 52 9 0 2 5 16 0 52 12 0 1 33 38 0 20 13 0 48 0 17 7 51 14 0 1 2 1 3 1 7 16 5 52 9 0 2 5 20 15 0 16 6 1 16 0 16 7 48 3 32 1 0 2 5 20 17 0 16 0 52 18 0 1 16 6 16 3 49 3 50)
- :constants (
- "dict"
- "list"
- "reduce"
- (code :arity 2 :upvalue-count 4
- :bytecode (16 0 1 1 0 52 0 0 2 17 2 16 2 33 29 0 16 0 1 1 0 4 1 3 0 16 0 1 3 0 52 0 0 2 52 4 0 1 52 2 0 5 32 154 0 16 1 52 6 0 1 1 7 0 52 5 0 2 6 33 24 0 5 16 0 1 3 0 52 0 0 2 52 4 0 1 18 0 52 9 0 1 52 8 0 2 33 78 0 20 10 0 20 11 0 18 0 16 0 1 3 0 52 0 0 2 52 4 0 1 52 12 0 2 18 1 48 2 48 1 17 3 18 2 20 14 0 16 1 48 1 16 3 52 13 0 3 5 16 0 1 1 0 3 1 3 0 16 0 1 3 0 52 0 0 2 52 4 0 1 52 2 0 5 32 32 0 20 15 0 18 3 16 1 48 2 5 16 0 1 3 0 16 0 1 3 0 52 0 0 2 52 4 0 1 52 2 0 3 50)
- :constants (
- "get"
- "skip"
- "assoc"
- "i"
- "inc"
- "="
- "type-of"
- "keyword"
- "<"
- "len"
- "trampoline"
- "eval-expr"
- "nth"
- "dict-set!"
- "keyword-name"
- "append!"))
- "i"
- 0
- "skip"
- "env-merge"
- "component-closure"
- "for-each"
- (code :arity 1 :upvalue-count 2
- :bytecode (20 0 0 18 0 16 0 18 1 16 0 52 1 0 2 33 11 0 18 1 16 0 52 2 0 2 32 1 0 2 49 3 50)
- :constants (
- "env-bind!"
- "dict-has?"
- "dict-get"))
- "component-params"
- "component-has-children?"
- "create-fragment"
- (code :arity 1 :upvalue-count 3
- :bytecode (20 0 0 16 0 18 0 18 1 48 3 17 1 16 1 52 2 0 1 52 1 0 1 33 12 0 20 3 0 18 2 16 1 49 2 32 1 0 2 50)
- :constants (
- "render-to-dom"
- "not"
- "spread?"
- "dom-append"))
- "env-bind!"
- "children"
- "render-to-dom"
- "component-body"))
- "render-dom-fragment"
- (code :arity 3
- :bytecode (20 0 0 48 0 17 3 51 2 0 1 1 1 2 1 3 16 0 52 1 0 2 5 16 3 50)
- :constants (
- "create-fragment"
- "for-each"
- (code :arity 1 :upvalue-count 3
- :bytecode (20 0 0 16 0 18 0 18 1 48 3 17 1 16 1 52 2 0 1 52 1 0 1 33 12 0 20 3 0 18 2 16 1 49 2 32 1 0 2 50)
- :constants (
- "render-to-dom"
- "not"
- "spread?"
- "dom-append"))))
- "render-dom-raw"
- (code :arity 2
- :bytecode (20 0 0 48 0 17 2 51 2 0 1 1 1 2 16 0 52 1 0 2 5 16 2 50)
- :constants (
- "create-fragment"
- "for-each"
- (code :arity 1 :upvalue-count 2
- :bytecode (20 0 0 20 1 0 16 0 18 0 48 2 48 1 17 1 16 1 52 3 0 1 1 4 0 52 2 0 2 33 17 0 20 5 0 18 1 20 6 0 16 1 48 1 49 2 32 68 0 16 1 52 3 0 1 1 7 0 52 2 0 2 33 17 0 20 5 0 18 1 20 8 0 16 1 48 1 49 2 32 35 0 16 1 52 10 0 1 52 9 0 1 33 21 0 20 5 0 18 1 20 11 0 16 1 52 12 0 1 48 1 49 2 32 1 0 2 50)
- :constants (
- "trampoline"
- "eval-expr"
- "="
- "type-of"
- "string"
- "dom-append"
- "dom-parse-html"
- "dom-node"
- "dom-clone"
- "not"
- "nil?"
- "create-text-node"
- "str"))))
- "render-dom-unknown-component"
- (code :arity 1
- :bytecode (1 2 0 16 0 52 1 0 2 52 0 0 1 50)
- :constants (
- "error"
- "str"
- "Unknown component: "))
- "RENDER_DOM_FORMS"
- "list"
- "if"
- "when"
- "cond"
- "case"
- "let"
- "let*"
- "letrec"
- "begin"
- "do"
- "define"
- "defcomp"
- "defisland"
- "defmacro"
- "defstyle"
- "map"
- "map-indexed"
- "filter"
- "for-each"
- "portal"
- "error-boundary"
- "scope"
- "provide"
- "cyst"
- "render-dom-form?"
- (code :arity 1
- :bytecode (20 1 0 16 0 52 0 0 2 50)
- :constants (
- "contains?"
- "RENDER_DOM_FORMS"))
- "dispatch-render-form"
- (code :arity 4
- :bytecode (16 0 1 1 0 52 0 0 2 33 226 0 20 2 0 48 0 33 124 0 20 3 0 1 4 0 48 1 17 4 52 5 0 0 17 5 2 17 6 20 6 0 51 7 0 1 1 1 2 1 3 1 4 1 5 1 6 48 1 5 16 6 52 8 0 1 33 5 0 16 6 32 67 0 20 9 0 48 0 17 7 20 10 0 16 7 16 4 48 2 5 16 6 33 41 0 20 11 0 16 6 48 1 33 10 0 20 12 0 16 6 48 1 32 6 0 16 6 52 5 0 1 17 5 5 20 10 0 16 7 16 6 48 2 32 1 0 2 5 16 7 32 91 0 20 13 0 20 14 0 16 1 1 16 0 52 15 0 2 16 2 48 2 48 1 17 4 16 4 33 21 0 20 17 0 16 1 1 18 0 52 15 0 2 16 2 16 3 49 3 32 42 0 16 1 52 20 0 1 1 21 0 52 19 0 2 33 21 0 20 17 0 16 1 1 21 0 52 15 0 2 16 2 16 3 49 3 32 5 0 20 9 0 49 0 32 217 7 16 0 1 22 0 52 0 0 2 33 180 0 20 2 0 48 0 33 95 0 20 3 0 1 23 0 48 1 17 4 52 5 0 0 17 5 2 17 6 20 6 0 51 24 0 1 4 1 5 1 1 1 2 1 3 1 6 48 1 5 16 6 52 8 0 1 33 5 0 16 6 32 38 0 20 9 0 48 0 17 7 20 10 0 16 7 16 4 48 2 5 16 6 33 12 0 20 10 0 16 7 16 6 48 2 32 1 0 2 5 16 7 32 74 0 20 13 0 20 14 0 16 1 1 16 0 52 15 0 2 16 2 48 2 48 1 52 25 0 1 33 8 0 20 9 0 49 0 32 38 0 20 9 0 48 0 17 4 51 27 0 1 4 1 1 1 2 1 3 1 18 0 16 1 52 20 0 1 52 28 0 2 52 26 0 2 5 16 4 32 25 7 16 0 1 29 0 52 0 0 2 33 145 0 20 2 0 48 0 33 95 0 20 3 0 1 30 0 48 1 17 4 52 5 0 0 17 5 2 17 6 20 6 0 51 31 0 1 1 1 2 1 4 1 5 1 3 1 6 48 1 5 16 6 52 8 0 1 33 5 0 16 6 32 38 0 20 9 0 48 0 17 7 20 10 0 16 7 16 4 48 2 5 16 6 33 12 0 20 10 0 16 7 16 6 48 2 32 1 0 2 5 16 7 32 39 0 20 32 0 16 1 52 33 0 1 16 2 48 2 17 4 16 4 33 14 0 20 17 0 16 4 16 2 16 3 49 3 32 5 0 20 9 0 49 0 32 124 6 16 0 1 34 0 52 0 0 2 33 26 0 20 17 0 20 13 0 20 14 0 16 1 16 2 48 2 48 1 16 2 16 3 49 3 32 86 6 16 0 1 35 0 52 0 0 2 6 34 10 0 5 16 0 1 36 0 52 0 0 2 33 96 0 20 37 0 16 1 1 16 0 52 15 0 2 16 2 48 2 17 4 16 1 52 20 0 1 1 21 0 52 0 0 2 33 21 0 20 17 0 16 1 1 18 0 52 15 0 2 16 4 16 3 49 3 32 38 0 20 9 0 48 0 17 5 51 38 0 1 1 1 4 1 3 1 5 1 18 0 16 1 52 20 0 1 52 28 0 2 52 26 0 2 5 16 5 32 220 5 16 0 1 39 0 52 0 0 2 33 109 0 16 1 1 16 0 52 15 0 2 17 4 16 1 1 18 0 52 40 0 2 17 5 20 41 0 16 2 48 1 17 6 51 42 0 1 6 16 4 52 26 0 2 5 51 43 0 1 6 16 4 52 26 0 2 5 16 5 52 20 0 1 1 16 0 52 19 0 2 33 18 0 51 44 0 1 6 16 5 52 45 0 1 52 26 0 2 32 1 0 2 5 20 17 0 16 5 52 46 0 1 16 6 16 3 49 3 32 99 5 16 0 1 47 0 52 0 0 2 6 34 10 0 5 16 0 1 48 0 52 0 0 2 33 78 0 16 1 52 20 0 1 1 18 0 52 0 0 2 33 21 0 20 17 0 16 1 1 16 0 52 15 0 2 16 2 16 3 49 3 32 38 0 20 9 0 48 0 17 4 51 38 0 1 1 1 2 1 3 1 4 1 16 0 16 1 52 20 0 1 52 28 0 2 52 26 0 2 5 16 4 32 251 4 20 49 0 16 0 48 1 33 23 0 20 13 0 20 14 0 16 1 16 2 48 2 48 1 5 20 9 0 49 0 32 218 4 16 0 1 50 0 52 0 0 2 33 31 1 16 1 1 18 0 52 15 0 2 17 4 20 2 0 48 0 6 33 77 0 5 16 4 52 51 0 1 1 5 0 52 0 0 2 6 33 59 0 5 16 4 52 20 0 1 1 16 0 52 19 0 2 6 33 41 0 5 16 4 52 52 0 1 52 51 0 1 1 53 0 52 0 0 2 6 33 19 0 5 20 54 0 16 4 52 52 0 1 48 1 1 55 0 52 0 0 2 33 111 0 20 13 0 20 14 0 16 1 1 16 0 52 15 0 2 16 2 48 2 48 1 17 5 20 13 0 20 14 0 16 4 1 16 0 52 15 0 2 16 2 48 2 48 1 17 6 20 56 0 16 6 48 1 33 16 0 20 57 0 16 5 16 6 16 2 16 3 49 4 32 36 0 20 55 0 16 6 48 1 17 7 20 9 0 48 0 17 8 51 58 0 1 5 1 2 1 3 1 8 16 7 52 26 0 2 5 16 8 32 73 0 20 13 0 20 14 0 16 1 1 16 0 52 15 0 2 16 2 48 2 48 1 17 5 20 13 0 20 14 0 16 1 1 18 0 52 15 0 2 16 2 48 2 48 1 17 6 20 9 0 48 0 17 7 51 58 0 1 5 1 2 1 3 1 7 16 6 52 26 0 2 5 16 7 32 175 3 16 0 1 59 0 52 0 0 2 33 76 0 20 13 0 20 14 0 16 1 1 16 0 52 15 0 2 16 2 48 2 48 1 17 4 20 13 0 20 14 0 16 1 1 18 0 52 15 0 2 16 2 48 2 48 1 17 5 20 9 0 48 0 17 6 51 61 0 1 4 1 2 1 3 1 6 16 5 52 60 0 2 5 16 6 32 87 3 16 0 1 62 0 52 0 0 2 33 26 0 20 17 0 20 13 0 20 14 0 16 1 16 2 48 2 48 1 16 2 16 3 49 3 32 49 3 16 0 1 63 0 52 0 0 2 33 18 0 20 64 0 16 1 52 33 0 1 16 2 16 3 49 3 32 19 3 16 0 1 65 0 52 0 0 2 33 18 0 20 66 0 16 1 52 33 0 1 16 2 16 3 49 3 32 245 2 16 0 1 26 0 52 0 0 2 33 76 0 20 13 0 20 14 0 16 1 1 16 0 52 15 0 2 16 2 48 2 48 1 17 4 20 13 0 20 14 0 16 1 1 18 0 52 15 0 2 16 2 48 2 48 1 17 5 20 9 0 48 0 17 6 51 58 0 1 4 1 2 1 3 1 6 16 5 52 26 0 2 5 16 6 32 157 2 16 0 1 67 0 52 0 0 2 33 188 0 20 13 0 20 14 0 16 1 1 16 0 52 15 0 2 16 2 48 2 48 1 17 4 16 1 1 18 0 52 40 0 2 17 5 2 17 6 2 17 7 20 9 0 48 0 17 8 16 5 52 20 0 1 1 18 0 52 68 0 2 6 33 41 0 5 16 5 52 52 0 1 52 51 0 1 1 69 0 52 0 0 2 6 33 19 0 5 20 70 0 16 5 52 52 0 1 48 1 1 71 0 52 0 0 2 33 38 0 20 13 0 20 14 0 16 5 1 16 0 52 15 0 2 16 2 48 2 48 1 17 6 5 16 5 1 18 0 52 40 0 2 17 7 32 4 0 16 5 17 7 5 16 4 16 6 52 72 0 2 5 51 73 0 1 8 1 2 1 3 16 7 52 26 0 2 5 16 4 52 74 0 1 5 16 8 32 213 1 16 0 1 75 0 52 0 0 2 33 103 0 20 13 0 20 14 0 16 1 1 16 0 52 15 0 2 16 2 48 2 48 1 17 4 20 13 0 20 14 0 16 1 1 18 0 52 15 0 2 16 2 48 2 48 1 17 5 20 9 0 48 0 17 6 16 4 16 5 52 72 0 2 5 51 27 0 1 6 1 1 1 2 1 3 1 21 0 16 1 52 20 0 1 52 28 0 2 52 26 0 2 5 16 4 52 74 0 1 5 16 6 32 98 1 16 0 1 76 0 52 0 0 2 33 63 1 16 1 52 20 0 1 1 18 0 52 19 0 2 6 33 47 0 5 16 1 1 16 0 52 15 0 2 52 51 0 1 1 69 0 52 0 0 2 6 33 22 0 5 20 70 0 16 1 1 16 0 52 15 0 2 48 1 1 77 0 52 0 0 2 33 28 0 20 13 0 20 14 0 16 1 1 18 0 52 15 0 2 16 2 48 2 48 1 52 78 0 1 32 5 0 20 79 0 48 0 17 4 20 81 0 16 4 52 80 0 2 17 5 16 5 6 33 11 0 5 20 82 0 16 5 1 83 0 48 2 33 5 0 16 5 32 178 0 20 84 0 1 85 0 2 48 2 17 6 52 5 0 0 17 7 16 1 52 20 0 1 1 18 0 52 19 0 2 6 33 47 0 5 16 1 1 16 0 52 15 0 2 52 51 0 1 1 69 0 52 0 0 2 6 33 22 0 5 20 70 0 16 1 1 16 0 52 15 0 2 48 1 1 77 0 52 0 0 2 33 12 0 16 1 1 21 0 52 40 0 2 32 9 0 16 1 1 16 0 52 40 0 2 17 8 20 86 0 16 6 1 87 0 16 4 48 3 5 20 88 0 51 89 0 1 7 51 90 0 1 2 1 3 1 8 48 2 17 9 20 10 0 16 6 16 9 48 2 5 20 91 0 16 6 1 92 0 16 7 48 3 5 20 81 0 16 4 16 6 52 93 0 3 5 16 6 32 23 0 20 17 0 20 13 0 20 14 0 16 1 16 2 48 2 48 1 16 2 16 3 49 3 50)
- :constants (
- "="
- "if"
- "island-scope?"
- "create-comment"
- "r-if"
- "list"
- "effect"
- (code :upvalue-count 6
- :bytecode (20 0 0 20 1 0 18 0 1 3 0 52 2 0 2 18 1 48 2 48 1 17 1 16 1 33 21 0 20 4 0 18 0 1 5 0 52 2 0 2 18 1 18 2 48 3 32 42 0 18 0 52 7 0 1 1 8 0 52 6 0 2 33 21 0 20 4 0 18 0 1 8 0 52 2 0 2 18 1 18 2 48 3 32 5 0 20 9 0 48 0 17 0 20 10 0 18 3 48 1 33 51 0 51 12 0 18 4 52 11 0 2 5 20 13 0 16 0 48 1 33 10 0 20 14 0 16 0 48 1 32 6 0 16 0 52 15 0 1 19 4 5 20 16 0 18 3 16 0 49 2 32 4 0 16 0 19 5 50)
- :constants (
- "trampoline"
- "eval-expr"
- "nth"
- 1
- "render-to-dom"
- 2
- ">"
- "len"
- 3
- "create-fragment"
- "dom-parent"
- "for-each"
- (code :arity 1
- :bytecode (20 0 0 16 0 49 1 50)
- :constants (
- "dom-remove"))
- "dom-is-fragment?"
- "dom-child-nodes"
- "list"
- "dom-insert-after"))
- "spread?"
- "create-fragment"
- "dom-append"
- "dom-is-fragment?"
- "dom-child-nodes"
- "trampoline"
- "eval-expr"
- "nth"
- 1
- "render-to-dom"
- 2
- ">"
- "len"
- 3
- "when"
- "r-when"
- (code :upvalue-count 6
- :bytecode (20 0 0 18 0 48 1 33 103 0 51 2 0 18 1 52 1 0 2 5 52 3 0 0 19 1 5 20 4 0 20 5 0 18 2 1 7 0 52 6 0 2 18 3 48 2 48 1 33 58 0 20 8 0 48 0 17 0 51 9 0 1 0 0 2 0 3 0 4 1 11 0 18 2 52 12 0 1 52 10 0 2 52 1 0 2 5 20 13 0 16 0 48 1 19 1 5 20 14 0 18 0 16 0 49 2 32 1 0 2 32 78 0 20 4 0 20 5 0 18 2 1 7 0 52 6 0 2 18 3 48 2 48 1 33 53 0 20 8 0 48 0 17 0 51 9 0 1 0 0 2 0 3 0 4 1 11 0 18 2 52 12 0 1 52 10 0 2 52 1 0 2 5 20 13 0 16 0 48 1 19 1 5 16 0 19 5 32 1 0 2 50)
- :constants (
- "dom-parent"
- "for-each"
- (code :arity 1
- :bytecode (20 0 0 16 0 49 1 50)
- :constants (
- "dom-remove"))
- "list"
- "trampoline"
- "eval-expr"
- "nth"
- 1
- "create-fragment"
- (code :arity 1 :upvalue-count 4
- :bytecode (20 0 0 18 0 20 1 0 18 1 16 0 52 2 0 2 18 2 18 3 48 3 49 2 50)
- :constants (
- "dom-append"
- "render-to-dom"
- "nth"))
- "range"
- 2
- "len"
- "dom-child-nodes"
- "dom-insert-after"))
- "not"
- "for-each"
- (code :arity 1 :upvalue-count 4
- :bytecode (20 0 0 18 0 20 1 0 18 1 16 0 52 2 0 2 18 2 18 3 48 3 49 2 50)
- :constants (
- "dom-append"
- "render-to-dom"
- "nth"))
- "range"
- "cond"
- "r-cond"
- (code :upvalue-count 6
- :bytecode (20 0 0 18 0 52 1 0 1 18 1 48 2 17 0 20 2 0 18 2 48 1 33 80 0 51 4 0 18 3 52 3 0 2 5 52 5 0 0 19 3 5 16 0 33 54 0 20 6 0 16 0 18 1 18 4 48 3 17 1 20 7 0 16 1 48 1 33 10 0 20 8 0 16 1 48 1 32 6 0 16 1 52 5 0 1 19 3 5 20 9 0 18 2 16 1 49 2 32 1 0 2 32 55 0 16 0 33 49 0 20 6 0 16 0 18 1 18 4 48 3 17 1 20 7 0 16 1 48 1 33 10 0 20 8 0 16 1 48 1 32 6 0 16 1 52 5 0 1 19 3 5 16 1 19 5 32 1 0 2 50)
- :constants (
- "eval-cond"
- "rest"
- "dom-parent"
- "for-each"
- (code :arity 1
- :bytecode (20 0 0 16 0 49 1 50)
- :constants (
- "dom-remove"))
- "list"
- "render-to-dom"
- "dom-is-fragment?"
- "dom-child-nodes"
- "dom-insert-after"))
- "eval-cond"
- "rest"
- "case"
- "let"
- "let*"
- "process-bindings"
- (code :arity 1 :upvalue-count 4
- :bytecode (20 0 0 18 0 16 0 52 1 0 2 18 1 18 2 48 3 17 1 16 1 52 3 0 1 52 2 0 1 33 12 0 20 4 0 18 3 16 1 49 2 32 1 0 2 50)
- :constants (
- "render-to-dom"
- "nth"
- "not"
- "spread?"
- "dom-append"))
- "letrec"
- "slice"
- "env-extend"
- (code :arity 1 :upvalue-count 1
- :bytecode (16 0 52 2 0 1 52 1 0 1 1 3 0 52 0 0 2 33 14 0 20 4 0 16 0 52 2 0 1 48 1 32 10 0 16 0 52 2 0 1 52 5 0 1 17 1 20 6 0 18 0 16 1 2 49 3 50)
- :constants (
- "="
- "type-of"
- "first"
- "symbol"
- "symbol-name"
- "str"
- "env-bind!"))
- (code :arity 1 :upvalue-count 1
- :bytecode (16 0 52 2 0 1 52 1 0 1 1 3 0 52 0 0 2 33 14 0 20 4 0 16 0 52 2 0 1 48 1 32 10 0 16 0 52 2 0 1 52 5 0 1 17 1 20 6 0 18 0 16 1 20 7 0 20 8 0 16 0 1 10 0 52 9 0 2 18 0 48 2 48 1 49 3 50)
- :constants (
- "="
- "type-of"
- "first"
- "symbol"
- "symbol-name"
- "str"
- "env-set!"
- "trampoline"
- "eval-expr"
- "nth"
- 1))
- (code :arity 1 :upvalue-count 1
- :bytecode (20 0 0 20 1 0 16 0 18 0 48 2 49 1 50)
- :constants (
- "trampoline"
- "eval-expr"))
- "init"
- "last"
- "begin"
- "do"
- "definition-form?"
- "map"
- "type-of"
- "first"
- "symbol"
- "symbol-name"
- "deref"
- "signal?"
- "reactive-list"
- (code :arity 1 :upvalue-count 4
- :bytecode (18 0 52 0 0 1 33 20 0 20 1 0 18 0 16 0 52 2 0 1 18 1 18 2 48 4 32 21 0 20 3 0 18 0 16 0 52 2 0 1 52 4 0 2 18 1 18 2 48 3 17 1 20 5 0 18 3 16 1 49 2 50)
- :constants (
- "lambda?"
- "render-lambda-dom"
- "list"
- "render-to-dom"
- "apply"
- "dom-append"))
- "map-indexed"
- "for-each-indexed"
- (code :arity 2 :upvalue-count 4
- :bytecode (18 0 52 0 0 1 33 22 0 20 1 0 18 0 16 0 16 1 52 2 0 2 18 1 18 2 48 4 32 23 0 20 3 0 18 0 16 0 16 1 52 2 0 2 52 4 0 2 18 1 18 2 48 3 17 2 20 5 0 18 3 16 2 49 2 50)
- :constants (
- "lambda?"
- "render-lambda-dom"
- "list"
- "render-to-dom"
- "apply"
- "dom-append"))
- "filter"
- "portal"
- "render-dom-portal"
- "error-boundary"
- "render-dom-error-boundary"
- "scope"
- ">="
- "keyword"
- "keyword-name"
- "value"
- "scope-push!"
- (code :arity 1 :upvalue-count 3
- :bytecode (20 0 0 18 0 20 1 0 16 0 18 1 18 2 48 3 49 2 50)
- :constants (
- "dom-append"
- "render-to-dom"))
- "scope-pop!"
- "provide"
- "cyst"
- "key"
- "str"
- "next-cyst-id"
- "get"
- "*memo-cache*"
- "host-get"
- "isConnected"
- "dom-create-element"
- "div"
- "dom-set-attr"
- "data-sx-cyst"
- "with-island-scope"
- (code :arity 1 :upvalue-count 1
- :bytecode (20 0 0 18 0 16 0 49 2 50)
- :constants (
- "append!"))
- (code :upvalue-count 3
- :bytecode (20 0 0 48 0 17 0 51 2 0 1 0 0 0 0 1 18 2 52 1 0 2 5 16 0 50)
- :constants (
- "create-fragment"
- "for-each"
- (code :arity 1 :upvalue-count 3
- :bytecode (20 0 0 18 0 20 1 0 16 0 18 1 18 2 48 3 49 2 50)
- :constants (
- "dom-append"
- "render-to-dom"))))
- "dom-set-data"
- "sx-disposers"
- "dict-set!"))
- "render-lambda-dom"
- (code :arity 4
- :bytecode (20 0 0 16 0 52 1 0 1 16 2 48 2 17 4 51 3 0 1 4 1 1 16 0 52 4 0 1 52 2 0 2 5 20 5 0 16 0 52 6 0 1 16 4 16 3 49 3 50)
- :constants (
- "env-merge"
- "lambda-closure"
- "for-each-indexed"
- (code :arity 2 :upvalue-count 2
- :bytecode (20 0 0 18 0 16 1 18 1 16 0 52 1 0 2 49 3 50)
- :constants (
- "env-bind!"
- "nth"))
- "lambda-params"
- "render-to-dom"
- "lambda-body"))
- "render-dom-island"
- (code :arity 4
- :bytecode (52 0 0 0 17 4 52 1 0 0 17 5 51 3 0 1 1 1 2 1 4 1 5 1 4 0 1 5 0 1 6 0 4 52 0 0 4 16 1 52 2 0 3 5 20 7 0 16 0 52 8 0 1 16 2 48 2 17 6 16 0 52 9 0 1 17 7 51 11 0 1 6 1 4 16 0 52 12 0 1 52 10 0 2 5 16 0 52 13 0 1 33 38 0 20 14 0 48 0 17 8 51 15 0 1 8 1 2 1 3 16 5 52 10 0 2 5 20 16 0 16 6 1 17 0 16 8 48 3 32 1 0 2 5 20 18 0 1 19 0 2 48 2 17 8 52 1 0 0 17 9 20 20 0 16 8 1 21 0 16 7 48 3 5 20 22 0 16 8 1 23 0 48 2 5 20 24 0 51 25 0 1 9 51 26 0 1 0 1 6 1 3 48 2 17 10 20 27 0 16 8 16 10 48 2 5 20 28 0 16 8 1 29 0 16 9 48 3 5 16 8 50)
- :constants (
- "dict"
- "list"
- "reduce"
- (code :arity 2 :upvalue-count 4
- :bytecode (16 0 1 1 0 52 0 0 2 17 2 16 2 33 29 0 16 0 1 1 0 4 1 3 0 16 0 1 3 0 52 0 0 2 52 4 0 1 52 2 0 5 32 154 0 16 1 52 6 0 1 1 7 0 52 5 0 2 6 33 24 0 5 16 0 1 3 0 52 0 0 2 52 4 0 1 18 0 52 9 0 1 52 8 0 2 33 78 0 20 10 0 20 11 0 18 0 16 0 1 3 0 52 0 0 2 52 4 0 1 52 12 0 2 18 1 48 2 48 1 17 3 18 2 20 14 0 16 1 48 1 16 3 52 13 0 3 5 16 0 1 1 0 3 1 3 0 16 0 1 3 0 52 0 0 2 52 4 0 1 52 2 0 5 32 32 0 20 15 0 18 3 16 1 48 2 5 16 0 1 3 0 16 0 1 3 0 52 0 0 2 52 4 0 1 52 2 0 3 50)
- :constants (
- "get"
- "skip"
- "assoc"
- "i"
- "inc"
- "="
- "type-of"
- "keyword"
- "<"
- "len"
- "trampoline"
- "eval-expr"
- "nth"
- "dict-set!"
- "keyword-name"
- "append!"))
- "i"
- 0
- "skip"
- "env-merge"
- "component-closure"
- "component-name"
- "for-each"
- (code :arity 1 :upvalue-count 2
- :bytecode (20 0 0 18 0 16 0 18 1 16 0 52 1 0 2 33 11 0 18 1 16 0 52 2 0 2 32 1 0 2 49 3 50)
- :constants (
- "env-bind!"
- "dict-has?"
- "dict-get"))
- "component-params"
- "component-has-children?"
- "create-fragment"
- (code :arity 1 :upvalue-count 3
- :bytecode (20 0 0 18 0 20 1 0 16 0 18 1 18 2 48 3 49 2 50)
- :constants (
- "dom-append"
- "render-to-dom"))
- "env-bind!"
- "children"
- "dom-create-element"
- "span"
- "dom-set-attr"
- "data-sx-island"
- "mark-processed!"
- "island-hydrated"
- "with-island-scope"
- (code :arity 1 :upvalue-count 1
- :bytecode (20 0 0 18 0 16 0 49 2 50)
- :constants (
- "append!"))
- (code :upvalue-count 3
- :bytecode (20 0 0 18 0 52 1 0 1 18 1 18 2 49 3 50)
- :constants (
- "render-to-dom"
- "component-body"))
- "dom-append"
- "dom-set-data"
- "sx-disposers"))
- "render-dom-lake"
- (code :arity 3
- :bytecode (2 17 3 1 0 0 17 4 52 1 0 0 17 5 51 3 0 1 0 1 1 1 3 1 4 1 5 1 5 0 1 6 0 1 7 0 4 52 4 0 4 16 0 52 2 0 3 5 20 8 0 16 4 2 48 2 17 6 20 9 0 16 6 1 10 0 16 3 6 34 4 0 5 1 11 0 48 3 5 51 13 0 1 6 1 1 1 2 16 5 52 12 0 2 5 16 6 50)
- :constants (
- "div"
- "list"
- "reduce"
- (code :arity 2 :upvalue-count 5
- :bytecode (16 0 1 1 0 52 0 0 2 17 2 16 2 33 29 0 16 0 1 1 0 4 1 3 0 16 0 1 3 0 52 0 0 2 52 4 0 1 52 2 0 5 32 187 0 16 1 52 6 0 1 1 7 0 52 5 0 2 6 33 24 0 5 16 0 1 3 0 52 0 0 2 52 4 0 1 18 0 52 9 0 1 52 8 0 2 33 111 0 20 10 0 16 1 48 1 17 3 20 11 0 20 12 0 18 0 16 0 1 3 0 52 0 0 2 52 4 0 1 52 13 0 2 18 1 48 2 48 1 17 4 16 3 1 14 0 52 5 0 2 33 7 0 16 4 19 2 32 20 0 16 3 1 15 0 52 5 0 2 33 7 0 16 4 19 3 32 1 0 2 5 16 0 1 1 0 3 1 3 0 16 0 1 3 0 52 0 0 2 52 4 0 1 52 2 0 5 32 32 0 20 16 0 18 4 16 1 48 2 5 16 0 1 3 0 16 0 1 3 0 52 0 0 2 52 4 0 1 52 2 0 3 50)
- :constants (
- "get"
- "skip"
- "assoc"
- "i"
- "inc"
- "="
- "type-of"
- "keyword"
- "<"
- "len"
- "keyword-name"
- "trampoline"
- "eval-expr"
- "nth"
- "id"
- "tag"
- "append!"))
- "dict"
- "i"
- 0
- "skip"
- "dom-create-element"
- "dom-set-attr"
- "data-sx-lake"
- ""
- "for-each"
- (code :arity 1 :upvalue-count 3
- :bytecode (20 0 0 18 0 20 1 0 16 0 18 1 18 2 48 3 49 2 50)
- :constants (
- "dom-append"
- "render-to-dom"))))
- "render-dom-marsh"
- (code :arity 3
- :bytecode (2 17 3 1 0 0 17 4 2 17 5 52 1 0 0 17 6 51 3 0 1 0 1 1 1 3 1 4 1 5 1 6 1 5 0 1 6 0 1 7 0 4 52 4 0 4 16 0 52 2 0 3 5 20 8 0 16 4 2 48 2 17 7 20 9 0 16 7 1 10 0 16 3 6 34 4 0 5 1 11 0 48 3 5 16 5 33 15 0 20 12 0 16 7 1 13 0 16 5 48 3 32 1 0 2 5 20 12 0 16 7 1 14 0 16 1 48 3 5 51 16 0 1 7 1 1 1 2 16 6 52 15 0 2 5 16 7 50)
- :constants (
- "div"
- "list"
- "reduce"
- (code :arity 2 :upvalue-count 6
- :bytecode (16 0 1 1 0 52 0 0 2 17 2 16 2 33 29 0 16 0 1 1 0 4 1 3 0 16 0 1 3 0 52 0 0 2 52 4 0 1 52 2 0 5 32 206 0 16 1 52 6 0 1 1 7 0 52 5 0 2 6 33 24 0 5 16 0 1 3 0 52 0 0 2 52 4 0 1 18 0 52 9 0 1 52 8 0 2 33 130 0 20 10 0 16 1 48 1 17 3 20 11 0 20 12 0 18 0 16 0 1 3 0 52 0 0 2 52 4 0 1 52 13 0 2 18 1 48 2 48 1 17 4 16 3 1 14 0 52 5 0 2 33 7 0 16 4 19 2 32 39 0 16 3 1 15 0 52 5 0 2 33 7 0 16 4 19 3 32 20 0 16 3 1 16 0 52 5 0 2 33 7 0 16 4 19 4 32 1 0 2 5 16 0 1 1 0 3 1 3 0 16 0 1 3 0 52 0 0 2 52 4 0 1 52 2 0 5 32 32 0 20 17 0 18 5 16 1 48 2 5 16 0 1 3 0 16 0 1 3 0 52 0 0 2 52 4 0 1 52 2 0 3 50)
- :constants (
- "get"
- "skip"
- "assoc"
- "i"
- "inc"
- "="
- "type-of"
- "keyword"
- "<"
- "len"
- "keyword-name"
- "trampoline"
- "eval-expr"
- "nth"
- "id"
- "tag"
- "transform"
- "append!"))
- "dict"
- "i"
- 0
- "skip"
- "dom-create-element"
- "dom-set-attr"
- "data-sx-marsh"
- ""
- "dom-set-data"
- "sx-marsh-transform"
- "sx-marsh-env"
- "for-each"
- (code :arity 1 :upvalue-count 3
- :bytecode (20 0 0 18 0 20 1 0 16 0 18 1 18 2 48 3 49 2 50)
- :constants (
- "dom-append"
- "render-to-dom"))))
- "reactive-text"
- (code :arity 1
- :bytecode (20 0 0 20 2 0 16 0 48 1 52 1 0 1 48 1 17 1 20 3 0 51 4 0 1 1 1 0 48 1 5 16 1 50)
- :constants (
- "create-text-node"
- "str"
- "deref"
- "effect"
- (code :upvalue-count 2
- :bytecode (20 0 0 18 0 20 2 0 18 1 48 1 52 1 0 1 49 2 50)
- :constants (
- "dom-set-text-content"
- "str"
- "deref"))))
- "reactive-attr"
- (code :arity 3
- :bytecode (20 0 0 16 0 1 1 0 48 2 6 34 4 0 5 1 2 0 17 3 16 3 52 3 0 1 33 5 0 16 1 32 11 0 16 3 1 5 0 16 1 52 4 0 3 17 4 20 6 0 16 0 1 1 0 16 4 48 3 5 20 7 0 51 8 0 1 2 1 0 1 1 49 1 50)
- :constants (
- "dom-get-attr"
- "data-sx-reactive-attrs"
- ""
- "empty?"
- "str"
- ","
- "dom-set-attr"
- "effect"
- (code :upvalue-count 3
- :bytecode (18 0 48 0 17 0 20 0 0 16 0 48 1 33 10 0 20 1 0 16 0 48 1 32 2 0 16 0 17 1 16 1 52 2 0 1 6 34 8 0 5 16 1 4 52 3 0 2 33 12 0 20 4 0 18 1 18 2 49 2 32 40 0 16 1 3 52 3 0 2 33 15 0 20 5 0 18 1 18 2 1 6 0 49 3 32 15 0 20 5 0 18 1 18 2 16 1 52 7 0 1 49 3 50)
- :constants (
- "signal?"
- "deref"
- "nil?"
- "="
- "dom-remove-attr"
- "dom-set-attr"
- ""
- "str"))))
- "reactive-spread"
- (code :arity 2
- :bytecode (52 0 0 0 17 2 52 0 0 0 17 3 20 1 0 16 0 1 2 0 48 2 6 34 4 0 5 1 3 0 17 4 20 4 0 16 0 1 2 0 16 4 52 5 0 1 33 6 0 1 6 0 32 9 0 16 4 1 8 0 52 7 0 2 48 3 5 20 9 0 51 10 0 1 2 1 0 1 3 1 1 49 1 50)
- :constants (
- "list"
- "dom-get-attr"
- "data-sx-reactive-attrs"
- ""
- "dom-set-attr"
- "empty?"
- "_spread"
- "str"
- ",_spread"
- "effect"
- (code :upvalue-count 4
- :bytecode (18 0 52 1 0 1 52 0 0 1 33 95 0 20 2 0 18 1 1 3 0 48 2 6 34 4 0 5 1 4 0 17 0 51 6 0 16 0 1 8 0 52 7 0 2 52 5 0 2 17 1 51 9 0 0 0 16 1 52 5 0 2 17 2 16 2 52 1 0 1 33 13 0 20 10 0 18 1 1 3 0 48 2 32 19 0 20 11 0 18 1 1 3 0 1 8 0 16 2 52 12 0 2 48 3 32 1 0 2 5 51 14 0 0 1 18 2 52 13 0 2 5 18 3 48 0 17 0 16 0 52 15 0 1 33 179 0 16 0 52 16 0 1 17 1 16 1 1 3 0 52 17 0 2 6 34 4 0 5 1 4 0 17 2 51 6 0 16 2 1 8 0 52 7 0 2 52 5 0 2 17 3 51 18 0 16 1 52 19 0 1 52 5 0 2 17 4 16 3 19 0 5 16 4 19 2 5 16 3 52 1 0 1 52 0 0 1 33 72 0 20 2 0 18 1 1 3 0 48 2 6 34 4 0 5 1 4 0 17 5 20 11 0 18 1 1 3 0 16 5 6 33 14 0 5 16 5 1 4 0 52 20 0 2 52 0 0 1 33 14 0 16 5 1 8 0 16 2 52 21 0 3 32 2 0 16 2 48 3 32 1 0 2 5 51 22 0 0 1 1 1 16 4 52 13 0 2 5 20 23 0 49 0 32 13 0 52 24 0 0 19 0 5 52 24 0 0 19 2 50)
- :constants (
- "not"
- "empty?"
- "dom-get-attr"
- "class"
- ""
- "filter"
- (code :arity 1
- :bytecode (16 0 1 2 0 52 1 0 2 52 0 0 1 50)
- :constants (
- "not"
- "="
- ""))
- "split"
- " "
- (code :arity 1 :upvalue-count 1
- :bytecode (51 2 0 1 0 18 0 52 1 0 2 52 0 0 1 50)
- :constants (
- "not"
- "some"
- (code :arity 1 :upvalue-count 1
- :bytecode (16 0 18 0 52 0 0 2 50)
- :constants (
- "="))))
- "dom-remove-attr"
- "dom-set-attr"
- "join"
- "for-each"
- (code :arity 1 :upvalue-count 1
- :bytecode (20 0 0 18 0 16 0 49 2 50)
- :constants (
- "dom-remove-attr"))
- "spread?"
- "spread-attrs"
- "dict-get"
- (code :arity 1
- :bytecode (16 0 1 2 0 52 1 0 2 52 0 0 1 50)
- :constants (
- "not"
- "="
- "class"))
- "keys"
- "="
- "str"
- (code :arity 1 :upvalue-count 2
- :bytecode (20 0 0 18 0 16 0 18 1 16 0 52 2 0 2 52 1 0 1 49 3 50)
- :constants (
- "dom-set-attr"
- "str"
- "dict-get"))
- "run-post-render-hooks"
- "list"))))
- "reactive-fragment"
- (code :arity 4
- :bytecode (20 0 0 1 1 0 48 1 17 4 52 2 0 0 17 5 20 3 0 51 4 0 1 5 1 0 1 1 1 4 48 1 5 16 4 50)
- :constants (
- "create-comment"
- "island-fragment"
- "list"
- "effect"
- (code :upvalue-count 4
- :bytecode (51 1 0 18 0 52 0 0 2 5 52 2 0 0 19 0 5 18 1 48 0 33 28 0 18 2 48 0 17 0 20 3 0 16 0 48 1 19 0 5 20 4 0 18 3 16 0 49 2 32 1 0 2 50)
- :constants (
- "for-each"
- (code :arity 1
- :bytecode (20 0 0 16 0 49 1 50)
- :constants (
- "dom-remove"))
- "list"
- "dom-child-nodes"
- "dom-insert-after"))))
- "render-list-item"
- (code :arity 4
- :bytecode (16 0 52 0 0 1 33 20 0 20 1 0 16 0 16 1 52 2 0 1 16 2 16 3 49 4 32 21 0 20 3 0 16 0 16 1 52 2 0 1 52 4 0 2 16 2 16 3 49 3 50)
- :constants (
- "lambda?"
- "render-lambda-dom"
- "list"
- "render-to-dom"
- "apply"))
- "extract-key"
- (code :arity 2
- :bytecode (20 0 0 16 0 1 1 0 48 2 17 2 16 2 33 16 0 20 2 0 16 0 1 1 0 48 2 5 16 2 32 35 0 20 3 0 16 0 1 1 0 48 2 17 3 16 3 33 9 0 16 3 52 4 0 1 32 9 0 1 5 0 16 1 52 4 0 2 50)
- :constants (
- "dom-get-attr"
- "key"
- "dom-remove-attr"
- "dom-get-data"
- "str"
- "__idx_"))
- "reactive-list"
- (code :arity 4
- :bytecode (20 0 0 48 0 17 4 20 1 0 1 2 0 48 1 17 5 52 3 0 0 17 6 52 4 0 0 17 7 20 5 0 16 4 16 5 48 2 5 20 6 0 51 7 0 1 1 1 5 1 0 1 2 1 3 1 6 1 7 1 4 48 1 5 16 4 50)
- :constants (
- "create-fragment"
- "create-comment"
- "island-list"
- "dict"
- "list"
- "dom-append"
- "effect"
- (code :upvalue-count 8
- :bytecode (20 0 0 18 0 48 1 17 0 20 1 0 18 1 48 1 33 133 0 52 2 0 0 17 1 52 3 0 0 17 2 4 17 3 51 5 0 0 2 0 3 0 4 1 3 0 5 1 1 1 2 16 0 52 4 0 2 5 16 3 52 6 0 1 33 41 0 20 7 0 18 1 48 1 5 20 8 0 48 0 17 4 51 10 0 1 4 1 1 16 2 52 9 0 2 5 20 11 0 18 1 16 4 48 2 32 31 0 51 12 0 1 1 0 5 18 6 52 9 0 2 5 18 1 17 4 51 13 0 1 1 1 4 16 2 52 9 0 2 5 16 1 19 5 5 16 2 19 6 32 21 0 51 14 0 0 2 0 3 0 4 0 5 0 6 0 7 16 0 52 4 0 2 50)
- :constants (
- "deref"
- "dom-parent"
- "dict"
- "list"
- "for-each-indexed"
- (code :arity 2 :upvalue-count 7
- :bytecode (20 0 0 18 0 16 1 18 1 18 2 48 4 17 2 20 1 0 16 2 16 0 48 2 17 3 18 3 52 2 0 1 6 33 14 0 5 16 3 1 4 0 52 3 0 2 52 2 0 1 33 6 0 3 19 3 32 1 0 2 5 18 4 16 3 52 5 0 2 33 19 0 18 5 16 3 18 4 16 3 52 7 0 2 52 6 0 3 32 10 0 18 5 16 3 16 2 52 6 0 3 5 20 8 0 18 6 16 3 49 2 50)
- :constants (
- "render-list-item"
- "extract-key"
- "not"
- "starts-with?"
- "__idx_"
- "dict-has?"
- "dict-set!"
- "dict-get"
- "append!"))
- "not"
- "dom-remove-children-after"
- "create-fragment"
- "for-each"
- (code :arity 1 :upvalue-count 2
- :bytecode (20 0 0 18 0 18 1 16 0 52 1 0 2 49 2 50)
- :constants (
- "dom-append"
- "dict-get"))
- "dom-insert-after"
- (code :arity 1 :upvalue-count 2
- :bytecode (18 0 16 0 52 1 0 2 52 0 0 1 33 16 0 20 2 0 18 1 16 0 52 3 0 2 49 1 32 1 0 2 50)
- :constants (
- "not"
- "dict-has?"
- "dom-remove"
- "dict-get"))
- (code :arity 1 :upvalue-count 2
- :bytecode (18 0 16 0 52 0 0 2 17 1 20 1 0 18 1 48 1 17 2 16 1 16 2 52 3 0 2 52 2 0 1 33 12 0 20 4 0 18 1 16 1 48 2 32 1 0 2 5 16 1 19 1 50)
- :constants (
- "dict-get"
- "dom-next-sibling"
- "not"
- "identical?"
- "dom-insert-after"))
- (code :arity 2 :upvalue-count 6
- :bytecode (20 0 0 18 0 16 1 18 1 18 2 48 4 17 2 20 1 0 16 2 16 0 48 2 17 3 18 3 16 3 16 2 52 2 0 3 5 20 3 0 18 4 16 3 48 2 5 20 4 0 18 5 16 2 49 2 50)
- :constants (
- "render-list-item"
- "extract-key"
- "dict-set!"
- "append!"
- "dom-append"))))))
- "bind-input"
- (code :arity 2
- :bytecode (20 1 0 16 0 1 2 0 48 2 6 34 4 0 5 1 3 0 52 0 0 1 17 2 16 2 1 5 0 52 4 0 2 6 34 10 0 5 16 2 1 6 0 52 4 0 2 17 3 16 3 33 20 0 20 7 0 16 0 1 8 0 20 9 0 16 1 48 1 48 3 32 21 0 20 7 0 16 0 1 10 0 20 9 0 16 1 48 1 52 11 0 1 48 3 5 20 12 0 51 13 0 1 3 1 0 1 1 48 1 5 20 14 0 16 0 16 3 33 6 0 1 15 0 32 3 0 1 16 0 51 17 0 1 3 1 1 1 0 49 3 50)
- :constants (
- "lower"
- "dom-get-attr"
- "type"
- ""
- "="
- "checkbox"
- "radio"
- "dom-set-prop"
- "checked"
- "deref"
- "value"
- "str"
- "effect"
- (code :upvalue-count 3
- :bytecode (18 0 33 20 0 20 0 0 18 1 1 1 0 20 2 0 18 2 48 1 49 3 32 48 0 20 2 0 18 2 48 1 52 3 0 1 17 0 20 5 0 18 1 1 6 0 48 2 16 0 52 4 0 2 33 15 0 20 0 0 18 1 1 6 0 16 0 49 3 32 1 0 2 50)
- :constants (
- "dom-set-prop"
- "checked"
- "deref"
- "str"
- "!="
- "dom-get-prop"
- "value"))
- "dom-on"
- "change"
- "input"
- (code :arity 1 :upvalue-count 3
- :bytecode (18 0 33 20 0 20 0 0 18 1 20 1 0 18 2 1 2 0 48 2 49 2 32 17 0 20 0 0 18 1 20 1 0 18 2 1 3 0 48 2 49 2 50)
- :constants (
- "reset!"
- "dom-get-prop"
- "checked"
- "value"))))
- "*use-cek-reactive*"
- "enable-cek-reactive!"
- (code
- :bytecode (3 21 0 0 50)
- :constants (
- "*use-cek-reactive*"))
- "cek-reactive-text"
- (code :arity 2
- :bytecode (20 0 0 1 1 0 48 1 17 2 51 2 0 1 2 17 3 20 3 0 20 4 0 16 0 16 1 20 6 0 16 1 16 3 3 48 3 52 5 0 1 48 3 48 1 17 4 20 7 0 16 2 16 4 52 8 0 1 48 2 5 16 2 50)
- :constants (
- "create-text-node"
- ""
- (code :arity 1 :upvalue-count 1
- :bytecode (20 0 0 18 0 16 0 52 1 0 1 49 2 50)
- :constants (
- "dom-set-text-content"
- "str"))
- "cek-run"
- "make-cek-state"
- "list"
- "make-reactive-reset-frame"
- "dom-set-text-content"
- "str"))
- "cek-reactive-attr"
- (code :arity 4
- :bytecode (51 0 0 1 0 1 1 17 4 20 1 0 16 0 1 2 0 48 2 6 34 4 0 5 1 3 0 17 5 16 5 52 4 0 1 33 5 0 16 1 32 11 0 16 5 1 6 0 16 1 52 5 0 3 17 6 20 7 0 16 0 1 2 0 16 6 48 3 5 20 8 0 20 9 0 16 2 16 3 20 11 0 16 3 16 4 3 48 3 52 10 0 1 48 3 48 1 17 5 20 12 0 16 4 16 5 52 10 0 1 49 2 50)
- :constants (
- (code :arity 1 :upvalue-count 2
- :bytecode (16 0 52 0 0 1 6 34 8 0 5 16 0 4 52 1 0 2 33 12 0 20 2 0 18 0 18 1 49 2 32 40 0 16 0 3 52 1 0 2 33 15 0 20 3 0 18 0 18 1 1 4 0 49 3 32 15 0 20 3 0 18 0 18 1 16 0 52 5 0 1 49 3 50)
- :constants (
- "nil?"
- "="
- "dom-remove-attr"
- "dom-set-attr"
- ""
- "str"))
- "dom-get-attr"
- "data-sx-reactive-attrs"
- ""
- "empty?"
- "str"
- ","
- "dom-set-attr"
- "cek-run"
- "make-cek-state"
- "list"
- "make-reactive-reset-frame"
- "cek-call"))
- "render-dom-portal"
- (code :arity 3
- :bytecode (20 0 0 20 1 0 16 0 52 2 0 1 16 1 48 2 48 1 17 3 20 3 0 16 3 48 1 6 34 8 0 5 20 4 0 16 3 48 1 17 4 16 4 52 5 0 1 33 20 0 20 6 0 1 8 0 16 3 1 9 0 52 7 0 3 49 1 32 75 0 20 6 0 1 8 0 16 3 52 7 0 2 48 1 17 5 20 10 0 48 0 17 6 51 12 0 1 6 1 1 1 2 16 0 52 13 0 1 52 11 0 2 5 20 14 0 16 6 48 1 17 7 20 15 0 16 4 16 6 48 2 5 20 16 0 51 17 0 1 7 48 1 5 16 5 50)
- :constants (
- "trampoline"
- "eval-expr"
- "first"
- "dom-query"
- "dom-ensure-element"
- "not"
- "create-comment"
- "str"
- "portal: "
- " (not found)"
- "create-fragment"
- "for-each"
- (code :arity 1 :upvalue-count 3
- :bytecode (20 0 0 18 0 20 1 0 16 0 18 1 18 2 48 3 49 2 50)
- :constants (
- "dom-append"
- "render-to-dom"))
- "rest"
- "dom-child-nodes"
- "dom-append"
- "register-in-scope"
- (code :upvalue-count 1
- :bytecode (51 1 0 18 0 52 0 0 2 50)
- :constants (
- "for-each"
- (code :arity 1
- :bytecode (20 0 0 16 0 49 1 50)
- :constants (
- "dom-remove"))))))
- "render-dom-error-boundary"
- (code :arity 3
- :bytecode (16 0 52 0 0 1 17 3 16 0 52 1 0 1 17 4 20 2 0 1 3 0 2 48 2 17 5 20 4 0 1 5 0 48 1 17 6 20 6 0 16 5 1 7 0 1 8 0 48 3 5 20 9 0 51 10 0 1 6 1 5 1 1 1 2 1 4 1 3 48 1 5 16 5 50)
- :constants (
- "first"
- "rest"
- "dom-create-element"
- "div"
- "signal"
- 0
- "dom-set-attr"
- "data-sx-boundary"
- "true"
- "effect"
- (code :upvalue-count 6
- :bytecode (20 0 0 18 0 48 1 5 20 1 0 18 1 1 2 0 1 3 0 48 3 5 1 5 0 2 52 4 0 2 5 20 6 0 51 7 0 0 2 0 3 0 4 0 1 51 8 0 0 5 0 2 0 0 0 3 0 1 49 2 50)
- :constants (
- "deref"
- "dom-set-prop"
- "innerHTML"
- ""
- "scope-push!"
- "sx-island-scope"
- "try-catch"
- (code :upvalue-count 4
- :bytecode (20 0 0 48 0 17 0 51 2 0 1 0 0 0 0 1 18 2 52 1 0 2 5 20 3 0 18 3 16 0 48 2 5 1 5 0 52 4 0 1 50)
- :constants (
- "create-fragment"
- "for-each"
- (code :arity 1 :upvalue-count 3
- :bytecode (20 0 0 18 0 20 1 0 16 0 18 1 18 2 48 3 49 2 50)
- :constants (
- "dom-append"
- "render-to-dom"))
- "dom-append"
- "scope-pop!"
- "sx-island-scope"))
- (code :arity 1 :upvalue-count 5
- :bytecode (1 1 0 52 0 0 1 5 20 2 0 20 3 0 18 0 18 1 48 2 48 1 17 1 51 4 0 0 2 17 2 16 1 52 5 0 1 33 22 0 20 6 0 16 1 16 0 16 2 52 7 0 2 18 1 18 3 48 4 32 23 0 20 8 0 16 1 16 0 16 2 52 7 0 2 52 9 0 2 18 1 18 3 48 3 17 3 20 10 0 18 4 16 3 49 2 50)
- :constants (
- "scope-pop!"
- "sx-island-scope"
- "trampoline"
- "eval-expr"
- (code :upvalue-count 1
- :bytecode (20 0 0 18 0 51 1 0 49 2 50)
- :constants (
- "swap!"
- (code :arity 1
- :bytecode (16 0 1 1 0 52 0 0 2 50)
- :constants (
- "+"
- 1))))
- "lambda?"
- "render-lambda-dom"
- "list"
- "render-to-dom"
- "apply"
- "dom-append")))))))))
diff --git a/shared/static/wasm/sx/adapter-dom.sxbc.json b/shared/static/wasm/sx/adapter-dom.sxbc.json
deleted file mode 100644
index fae0e6a8..00000000
--- a/shared/static/wasm/sx/adapter-dom.sxbc.json
+++ /dev/null
@@ -1 +0,0 @@
-{"magic":"SXBC","version":1,"hash":"3bc60b6ea15ee2ba","module":{"bytecode":[1,1,0,128,0,0,5,1,3,0,128,2,0,5,51,5,0,128,4,0,5,52,7,0,0,128,6,0,5,1,9,0,128,8,0,5,51,11,0,128,10,0,5,51,13,0,128,12,0,5,51,15,0,128,14,0,5,51,17,0,128,16,0,5,51,19,0,128,18,0,5,51,21,0,128,20,0,5,51,23,0,128,22,0,5,51,25,0,128,24,0,5,51,27,0,128,26,0,5,51,29,0,128,28,0,5,1,32,0,1,33,0,1,34,0,1,35,0,1,36,0,1,37,0,1,38,0,1,39,0,1,40,0,1,41,0,1,42,0,1,43,0,1,44,0,1,45,0,1,46,0,1,47,0,1,48,0,1,49,0,1,50,0,1,51,0,1,52,0,1,53,0,1,54,0,52,31,0,23,128,30,0,5,51,56,0,128,55,0,5,51,58,0,128,57,0,5,51,60,0,128,59,0,5,51,62,0,128,61,0,5,51,64,0,128,63,0,5,51,66,0,128,65,0,5,51,68,0,128,67,0,5,51,70,0,128,69,0,5,51,72,0,128,71,0,5,51,74,0,128,73,0,5,51,76,0,128,75,0,5,51,78,0,128,77,0,5,51,80,0,128,79,0,5,51,82,0,128,81,0,5,3,128,83,0,5,51,85,0,128,84,0,5,51,87,0,128,86,0,5,51,89,0,128,88,0,5,51,91,0,128,90,0,5,51,93,0,128,92,0,50],"constants":[{"t":"s","v":"SVG_NS"},{"t":"s","v":"http://www.w3.org/2000/svg"},{"t":"s","v":"MATH_NS"},{"t":"s","v":"http://www.w3.org/1998/Math/MathML"},{"t":"s","v":"island-scope?"},{"t":"code","v":{"bytecode":[1,3,0,52,2,0,1,52,1,0,1,52,0,0,1,50],"constants":[{"t":"s","v":"not"},{"t":"s","v":"nil?"},{"t":"s","v":"scope-peek"},{"t":"s","v":"sx-island-scope"}]}},{"t":"s","v":"*memo-cache*"},{"t":"s","v":"dict"},{"t":"s","v":"*cyst-counter*"},{"t":"n","v":0},{"t":"s","v":"next-cyst-id"},{"t":"code","v":{"bytecode":[20,1,0,1,2,0,52,0,0,2,21,1,0,5,1,4,0,20,1,0,52,3,0,2,50],"constants":[{"t":"s","v":"+"},{"t":"s","v":"*cyst-counter*"},{"t":"n","v":1},{"t":"s","v":"str"},{"t":"s","v":"sx-cyst-"}]}},{"t":"s","v":"contains-deref?"},{"t":"code","v":{"bytecode":[16,0,52,1,0,1,52,0,0,1,33,4,0,4,32,69,0,16,0,52,2,0,1,33,4,0,4,32,56,0,16,0,52,5,0,1,52,4,0,1,1,6,0,52,3,0,2,6,33,19,0,5,20,7,0,16,0,52,5,0,1,48,1,1,8,0,52,3,0,2,33,4,0,3,32,9,0,20,10,0,16,0,52,9,0,2,50],"constants":[{"t":"s","v":"not"},{"t":"s","v":"list?"},{"t":"s","v":"empty?"},{"t":"s","v":"="},{"t":"s","v":"type-of"},{"t":"s","v":"first"},{"t":"s","v":"symbol"},{"t":"s","v":"symbol-name"},{"t":"s","v":"deref"},{"t":"s","v":"some"},{"t":"s","v":"contains-deref?"}],"arity":1}},{"t":"s","v":"dom-on"},{"t":"code","v":{"bytecode":[20,0,0,16,0,16,1,16,2,52,1,0,1,33,36,0,1,3,0,16,2,52,5,0,1,52,4,0,1,52,2,0,2,33,8,0,51,6,0,1,2,32,5,0,51,7,0,1,2,32,2,0,16,2,49,3,50],"constants":[{"t":"s","v":"dom-listen"},{"t":"s","v":"lambda?"},{"t":"s","v":"="},{"t":"n","v":0},{"t":"s","v":"len"},{"t":"s","v":"lambda-params"},{"t":"code","v":{"bytecode":[20,0,0,20,1,0,18,0,52,2,0,0,48,2,48,1,5,20,3,0,49,0,50],"constants":[{"t":"s","v":"trampoline"},{"t":"s","v":"call-lambda"},{"t":"s","v":"list"},{"t":"s","v":"run-post-render-hooks"}],"arity":1,"upvalue-count":1}},{"t":"code","v":{"bytecode":[20,0,0,20,1,0,18,0,16,0,52,2,0,1,48,2,48,1,5,20,3,0,49,0,50],"constants":[{"t":"s","v":"trampoline"},{"t":"s","v":"call-lambda"},{"t":"s","v":"list"},{"t":"s","v":"run-post-render-hooks"}],"arity":1,"upvalue-count":1}}],"arity":3}},{"t":"s","v":"render-to-dom"},{"t":"code","v":{"bytecode":[20,0,0,3,48,1,5,16,0,52,1,0,1,6,1,2,0,52,3,0,2,33,9,0,5,20,4,0,49,0,32,106,1,6,1,5,0,52,3,0,2,33,9,0,5,20,4,0,49,0,32,86,1,6,1,6,0,52,3,0,2,33,15,0,5,20,7,0,16,0,52,8,0,1,49,1,32,60,1,6,1,9,0,52,3,0,2,33,11,0,5,20,10,0,16,0,49,1,32,38,1,6,1,11,0,52,3,0,2,33,15,0,5,20,10,0,16,0,52,12,0,1,49,1,32,12,1,6,1,13,0,52,3,0,2,33,27,0,5,20,14,0,20,15,0,20,16,0,16,0,16,1,48,2,48,1,16,1,16,2,49,3,32,230,0,6,1,17,0,52,3,0,2,33,16,0,5,20,10,0,20,18,0,16,0,48,1,49,1,32,203,0,6,1,19,0,52,3,0,2,33,6,0,5,16,0,32,186,0,6,1,20,0,52,3,0,2,33,36,0,5,20,22,0,48,0,52,21,0,1,33,16,0,1,24,0,16,0,52,25,0,1,52,23,0,2,32,1,0,2,5,16,0,32,139,0,6,1,26,0,52,3,0,2,33,26,0,5,16,0,1,28,0,52,27,0,2,33,5,0,16,0,32,5,0,20,4,0,49,0,32,102,0,6,1,29,0,52,3,0,2,33,32,0,5,16,0,52,30,0,1,33,8,0,20,4,0,49,0,32,11,0,20,31,0,16,0,16,1,16,2,49,3,32,59,0,5,20,32,0,16,0,48,1,33,37,0,20,22,0,48,0,33,10,0,20,33,0,16,0,49,1,32,16,0,20,10,0,20,34,0,16,0,48,1,52,12,0,1,49,1,32,11,0,20,10,0,16,0,52,12,0,1,49,1,50],"constants":[{"t":"s","v":"set-render-active!"},{"t":"s","v":"type-of"},{"t":"s","v":"nil"},{"t":"s","v":"="},{"t":"s","v":"create-fragment"},{"t":"s","v":"boolean"},{"t":"s","v":"raw-html"},{"t":"s","v":"dom-parse-html"},{"t":"s","v":"raw-html-content"},{"t":"s","v":"string"},{"t":"s","v":"create-text-node"},{"t":"s","v":"number"},{"t":"s","v":"str"},{"t":"s","v":"symbol"},{"t":"s","v":"render-to-dom"},{"t":"s","v":"trampoline"},{"t":"s","v":"eval-expr"},{"t":"s","v":"keyword"},{"t":"s","v":"keyword-name"},{"t":"s","v":"dom-node"},{"t":"s","v":"spread"},{"t":"s","v":"not"},{"t":"s","v":"island-scope?"},{"t":"s","v":"scope-emit!"},{"t":"s","v":"element-attrs"},{"t":"s","v":"spread-attrs"},{"t":"s","v":"dict"},{"t":"s","v":"has-key?"},{"t":"s","v":"__host_handle"},{"t":"s","v":"list"},{"t":"s","v":"empty?"},{"t":"s","v":"render-dom-list"},{"t":"s","v":"signal?"},{"t":"s","v":"reactive-text"},{"t":"s","v":"deref"}],"arity":3}},{"t":"s","v":"render-dom-list"},{"t":"code","v":{"bytecode":[16,0,52,0,0,1,17,3,16,3,52,2,0,1,1,3,0,52,1,0,2,33,253,2,20,4,0,16,3,48,1,17,4,16,0,52,5,0,1,17,5,16,4,1,6,0,52,1,0,2,33,12,0,20,7,0,16,5,16,1,49,2,32,209,2,16,4,1,8,0,52,1,0,2,33,14,0,20,9,0,16,5,16,1,16,2,49,3,32,183,2,16,4,1,10,0,52,1,0,2,33,14,0,20,11,0,16,5,16,1,16,2,49,3,32,157,2,16,4,1,12,0,52,1,0,2,33,14,0,20,13,0,16,5,16,1,16,2,49,3,32,131,2,16,4,1,15,0,52,14,0,2,33,23,0,20,16,0,16,4,1,18,0,52,17,0,2,16,5,16,1,16,2,49,4,32,96,2,20,19,0,16,4,48,1,33,91,0,20,21,0,16,4,52,20,0,2,6,33,43,0,5,16,5,52,23,0,1,1,24,0,52,22,0,2,6,33,18,0,5,16,5,52,0,0,1,52,2,0,1,1,25,0,52,1,0,2,6,34,3,0,5,16,2,33,16,0,20,16,0,16,4,16,5,16,1,16,2,49,4,32,13,0,20,26,0,16,4,16,0,16,1,16,2,49,4,32,251,1,20,27,0,16,1,16,4,48,2,6,33,14,0,5,20,29,0,16,1,16,4,48,2,52,28,0,1,33,30,0,20,30,0,20,31,0,20,29,0,16,1,16,4,48,2,16,5,16,1,48,3,16,1,16,2,49,3,32,191,1,20,21,0,16,4,52,20,0,2,33,16,0,20,16,0,16,4,16,5,16,1,16,2,49,4,32,163,1,16,4,1,32,0,52,14,0,2,6,33,28,0,5,20,27,0,16,1,16,4,48,2,6,33,14,0,5,20,29,0,16,1,16,4,48,2,52,33,0,1,33,77,0,1,35,0,52,34,0,1,33,44,0,20,29,0,16,1,16,4,48,2,17,6,20,36,0,1,37,0,2,48,2,17,7,20,38,0,16,7,1,39,0,16,6,52,40,0,1,48,3,5,16,7,32,20,0,20,41,0,20,29,0,16,1,16,4,48,2,16,5,16,1,16,2,49,4,32,42,1,16,4,1,32,0,52,14,0,2,33,46,0,20,29,0,16,1,16,4,48,2,17,6,16,6,52,42,0,1,33,16,0,20,43,0,16,6,16,5,16,1,16,2,49,4,32,7,0,20,44,0,16,4,49,1,32,240,0,16,4,1,46,0,52,45,0,2,1,24,0,52,22,0,2,6,33,36,0,5,16,5,52,23,0,1,1,24,0,52,22,0,2,6,33,18,0,5,16,5,52,0,0,1,52,2,0,1,1,25,0,52,1,0,2,33,16,0,20,16,0,16,4,16,5,16,1,16,2,49,4,32,165,0,16,2,33,16,0,20,16,0,16,4,16,5,16,1,16,2,49,4,32,144,0,16,4,1,47,0,52,1,0,2,6,33,6,0,5,20,48,0,48,0,33,59,0,20,49,0,20,50,0,16,5,52,0,0,1,16,1,48,2,48,1,17,6,20,51,0,16,6,48,1,33,10,0,20,52,0,16,6,49,1,32,16,0,20,53,0,20,47,0,16,6,48,1,52,54,0,1,49,1,32,63,0,20,48,0,48,0,6,33,8,0,5,20,55,0,16,0,48,1,33,20,0,20,52,0,20,56,0,51,57,0,1,0,1,1,48,1,49,1,32,23,0,20,30,0,20,49,0,20,50,0,16,0,16,1,48,2,48,1,16,1,16,2,49,3,32,78,0,16,3,52,58,0,1,6,34,14,0,5,16,3,52,2,0,1,1,59,0,52,1,0,2,33,26,0,20,30,0,20,49,0,20,50,0,16,0,16,1,48,2,48,1,16,1,16,2,49,3,32,25,0,20,60,0,48,0,17,4,51,62,0,1,1,1,2,1,4,16,0,52,61,0,2,5,16,4,50],"constants":[{"t":"s","v":"first"},{"t":"s","v":"="},{"t":"s","v":"type-of"},{"t":"s","v":"symbol"},{"t":"s","v":"symbol-name"},{"t":"s","v":"rest"},{"t":"s","v":"raw!"},{"t":"s","v":"render-dom-raw"},{"t":"s","v":"<>"},{"t":"s","v":"render-dom-fragment"},{"t":"s","v":"lake"},{"t":"s","v":"render-dom-lake"},{"t":"s","v":"marsh"},{"t":"s","v":"render-dom-marsh"},{"t":"s","v":"starts-with?"},{"t":"s","v":"html:"},{"t":"s","v":"render-dom-element"},{"t":"s","v":"slice"},{"t":"n","v":5},{"t":"s","v":"render-dom-form?"},{"t":"s","v":"contains?"},{"t":"s","v":"HTML_TAGS"},{"t":"s","v":">"},{"t":"s","v":"len"},{"t":"n","v":0},{"t":"s","v":"keyword"},{"t":"s","v":"dispatch-render-form"},{"t":"s","v":"env-has?"},{"t":"s","v":"macro?"},{"t":"s","v":"env-get"},{"t":"s","v":"render-to-dom"},{"t":"s","v":"expand-macro"},{"t":"s","v":"~"},{"t":"s","v":"island?"},{"t":"s","v":"scope-peek"},{"t":"s","v":"sx-render-markers"},{"t":"s","v":"dom-create-element"},{"t":"s","v":"span"},{"t":"s","v":"dom-set-attr"},{"t":"s","v":"data-sx-island"},{"t":"s","v":"component-name"},{"t":"s","v":"render-dom-island"},{"t":"s","v":"component?"},{"t":"s","v":"render-dom-component"},{"t":"s","v":"render-dom-unknown-component"},{"t":"s","v":"index-of"},{"t":"s","v":"-"},{"t":"s","v":"deref"},{"t":"s","v":"island-scope?"},{"t":"s","v":"trampoline"},{"t":"s","v":"eval-expr"},{"t":"s","v":"signal?"},{"t":"s","v":"reactive-text"},{"t":"s","v":"create-text-node"},{"t":"s","v":"str"},{"t":"s","v":"contains-deref?"},{"t":"s","v":"computed"},{"t":"code","v":{"bytecode":[20,0,0,20,1,0,18,0,18,1,48,2,49,1,50],"constants":[{"t":"s","v":"trampoline"},{"t":"s","v":"eval-expr"}],"upvalue-count":2}},{"t":"s","v":"lambda?"},{"t":"s","v":"list"},{"t":"s","v":"create-fragment"},{"t":"s","v":"for-each"},{"t":"code","v":{"bytecode":[20,0,0,16,0,18,0,18,1,48,3,17,1,16,1,52,2,0,1,52,1,0,1,33,12,0,20,3,0,18,2,16,1,49,2,32,1,0,2,50],"constants":[{"t":"s","v":"render-to-dom"},{"t":"s","v":"not"},{"t":"s","v":"spread?"},{"t":"s","v":"dom-append"}],"arity":1,"upvalue-count":3}}],"arity":3}},{"t":"s","v":"render-dom-element"},{"t":"code","v":{"bytecode":[16,0,1,1,0,52,0,0,2,33,6,0,20,2,0,32,20,0,16,0,1,3,0,52,0,0,2,33,6,0,20,4,0,32,2,0,16,3,17,4,20,5,0,16,0,16,4,48,2,17,5,1,7,0,2,52,6,0,2,5,51,9,0,1,1,1,2,1,5,1,0,1,4,1,11,0,1,12,0,1,13,0,4,52,10,0,4,16,1,52,8,0,3,5,51,15,0,1,5,1,7,0,52,16,0,1,52,14,0,2,5,1,7,0,52,17,0,1,5,16,5,50],"constants":[{"t":"s","v":"="},{"t":"s","v":"svg"},{"t":"s","v":"SVG_NS"},{"t":"s","v":"math"},{"t":"s","v":"MATH_NS"},{"t":"s","v":"dom-create-element"},{"t":"s","v":"scope-push!"},{"t":"s","v":"element-attrs"},{"t":"s","v":"reduce"},{"t":"code","v":{"bytecode":[16,0,1,1,0,52,0,0,2,17,2,16,2,33,29,0,16,0,1,1,0,4,1,3,0,16,0,1,3,0,52,0,0,2,52,4,0,1,52,2,0,5,32,58,2,16,1,52,6,0,1,1,7,0,52,5,0,2,6,33,24,0,5,16,0,1,3,0,52,0,0,2,52,4,0,1,18,0,52,9,0,1,52,8,0,2,33,154,1,20,10,0,16,1,48,1,17,3,18,0,16,0,1,3,0,52,0,0,2,52,4,0,1,52,11,0,2,17,4,16,3,1,13,0,52,12,0,2,33,51,0,20,14,0,20,15,0,16,4,18,1,48,2,48,1,17,5,20,16,0,16,5,48,1,33,21,0,20,17,0,18,2,16,3,1,19,0,52,18,0,2,16,5,48,3,32,1,0,2,32,31,1,16,3,1,20,0,52,5,0,2,33,42,0,20,14,0,20,15,0,16,4,18,1,48,2,48,1,17,5,20,21,0,16,5,48,1,33,12,0,20,22,0,18,2,16,5,48,2,32,1,0,2,32,233,0,16,3,1,23,0,52,5,0,2,33,30,0,20,14,0,20,15,0,16,4,18,1,48,2,48,1,17,5,16,5,1,25,0,18,2,52,24,0,3,32,191,0,16,3,1,26,0,52,5,0,2,33,35,0,20,14,0,20,15,0,16,4,18,1,48,2,48,1,17,5,20,27,0,18,2,1,26,0,16,5,52,28,0,1,48,3,32,144,0,20,29,0,48,0,33,19,0,20,30,0,18,2,16,3,51,31,0,1,4,0,1,48,3,32,117,0,20,14,0,20,15,0,16,4,18,1,48,2,48,1,17,5,16,5,52,32,0,1,6,34,8,0,5,16,5,4,52,5,0,2,33,4,0,2,32,76,0,20,34,0,16,3,52,33,0,2,33,24,0,16,5,33,15,0,20,27,0,18,2,16,3,1,35,0,48,3,32,1,0,2,32,40,0,16,5,3,52,5,0,2,33,15,0,20,27,0,18,2,16,3,1,35,0,48,3,32,15,0,20,27,0,18,2,16,3,16,5,52,28,0,1,48,3,5,16,0,1,1,0,3,1,3,0,16,0,1,3,0,52,0,0,2,52,4,0,1,52,2,0,5,32,116,0,20,37,0,18,3,52,33,0,2,52,36,0,1,33,76,0,20,38,0,16,1,18,1,18,4,48,3,17,3,16,3,52,39,0,1,6,33,6,0,5,20,29,0,48,0,33,19,0,20,40,0,18,2,51,41,0,1,1,0,1,0,4,48,2,32,22,0,16,3,52,39,0,1,33,4,0,2,32,9,0,20,42,0,18,2,16,3,48,2,32,1,0,2,5,16,0,1,3,0,16,0,1,3,0,52,0,0,2,52,4,0,1,52,2,0,3,50],"constants":[{"t":"s","v":"get"},{"t":"s","v":"skip"},{"t":"s","v":"assoc"},{"t":"s","v":"i"},{"t":"s","v":"inc"},{"t":"s","v":"="},{"t":"s","v":"type-of"},{"t":"s","v":"keyword"},{"t":"s","v":"<"},{"t":"s","v":"len"},{"t":"s","v":"keyword-name"},{"t":"s","v":"nth"},{"t":"s","v":"starts-with?"},{"t":"s","v":"on-"},{"t":"s","v":"trampoline"},{"t":"s","v":"eval-expr"},{"t":"s","v":"callable?"},{"t":"s","v":"dom-on"},{"t":"s","v":"slice"},{"t":"n","v":3},{"t":"s","v":"bind"},{"t":"s","v":"signal?"},{"t":"s","v":"bind-input"},{"t":"s","v":"ref"},{"t":"s","v":"dict-set!"},{"t":"s","v":"current"},{"t":"s","v":"key"},{"t":"s","v":"dom-set-attr"},{"t":"s","v":"str"},{"t":"s","v":"island-scope?"},{"t":"s","v":"reactive-attr"},{"t":"code","v":{"bytecode":[20,0,0,20,1,0,18,0,18,1,48,2,49,1,50],"constants":[{"t":"s","v":"trampoline"},{"t":"s","v":"eval-expr"}],"upvalue-count":2}},{"t":"s","v":"nil?"},{"t":"s","v":"contains?"},{"t":"s","v":"BOOLEAN_ATTRS"},{"t":"s","v":""},{"t":"s","v":"not"},{"t":"s","v":"VOID_ELEMENTS"},{"t":"s","v":"render-to-dom"},{"t":"s","v":"spread?"},{"t":"s","v":"reactive-spread"},{"t":"code","v":{"bytecode":[20,0,0,18,0,18,1,18,2,49,3,50],"constants":[{"t":"s","v":"render-to-dom"}],"upvalue-count":3}},{"t":"s","v":"dom-append"}],"arity":2,"upvalue-count":5}},{"t":"s","v":"dict"},{"t":"s","v":"i"},{"t":"n","v":0},{"t":"s","v":"skip"},{"t":"s","v":"for-each"},{"t":"code","v":{"bytecode":[51,1,0,1,0,0,0,16,0,52,2,0,1,52,0,0,2,50],"constants":[{"t":"s","v":"for-each"},{"t":"code","v":{"bytecode":[18,0,16,0,52,0,0,2,17,1,16,0,1,2,0,52,1,0,2,33,64,0,20,3,0,18,1,1,2,0,48,2,17,2,20,4,0,18,1,1,2,0,16,2,6,33,14,0,5,16,2,1,6,0,52,1,0,2,52,5,0,1,33,14,0,16,2,1,8,0,16,1,52,7,0,3,32,2,0,16,1,49,3,32,91,0,16,0,1,9,0,52,1,0,2,33,64,0,20,3,0,18,1,1,9,0,48,2,17,2,20,4,0,18,1,1,9,0,16,2,6,33,14,0,5,16,2,1,6,0,52,1,0,2,52,5,0,1,33,14,0,16,2,1,10,0,16,1,52,7,0,3,32,2,0,16,1,49,3,32,15,0,20,4,0,18,1,16,0,16,1,52,7,0,1,49,3,50],"constants":[{"t":"s","v":"dict-get"},{"t":"s","v":"="},{"t":"s","v":"class"},{"t":"s","v":"dom-get-attr"},{"t":"s","v":"dom-set-attr"},{"t":"s","v":"not"},{"t":"s","v":""},{"t":"s","v":"str"},{"t":"s","v":" "},{"t":"s","v":"style"},{"t":"s","v":";"}],"arity":1,"upvalue-count":2}},{"t":"s","v":"keys"}],"arity":1,"upvalue-count":1}},{"t":"s","v":"scope-emitted"},{"t":"s","v":"scope-pop!"}],"arity":4}},{"t":"s","v":"render-dom-component"},{"t":"code","v":{"bytecode":[52,0,0,0,17,4,52,1,0,0,17,5,51,3,0,1,1,1,2,1,4,1,5,1,4,0,1,5,0,1,6,0,4,52,0,0,4,16,1,52,2,0,3,5,20,7,0,16,0,52,8,0,1,16,2,48,2,17,6,51,10,0,1,6,1,4,16,0,52,11,0,1,52,9,0,2,5,16,0,52,12,0,1,33,38,0,20,13,0,48,0,17,7,51,14,0,1,2,1,3,1,7,16,5,52,9,0,2,5,20,15,0,16,6,1,16,0,16,7,48,3,32,1,0,2,5,20,17,0,16,0,52,18,0,1,16,6,16,3,49,3,50],"constants":[{"t":"s","v":"dict"},{"t":"s","v":"list"},{"t":"s","v":"reduce"},{"t":"code","v":{"bytecode":[16,0,1,1,0,52,0,0,2,17,2,16,2,33,29,0,16,0,1,1,0,4,1,3,0,16,0,1,3,0,52,0,0,2,52,4,0,1,52,2,0,5,32,154,0,16,1,52,6,0,1,1,7,0,52,5,0,2,6,33,24,0,5,16,0,1,3,0,52,0,0,2,52,4,0,1,18,0,52,9,0,1,52,8,0,2,33,78,0,20,10,0,20,11,0,18,0,16,0,1,3,0,52,0,0,2,52,4,0,1,52,12,0,2,18,1,48,2,48,1,17,3,18,2,20,14,0,16,1,48,1,16,3,52,13,0,3,5,16,0,1,1,0,3,1,3,0,16,0,1,3,0,52,0,0,2,52,4,0,1,52,2,0,5,32,32,0,20,15,0,18,3,16,1,48,2,5,16,0,1,3,0,16,0,1,3,0,52,0,0,2,52,4,0,1,52,2,0,3,50],"constants":[{"t":"s","v":"get"},{"t":"s","v":"skip"},{"t":"s","v":"assoc"},{"t":"s","v":"i"},{"t":"s","v":"inc"},{"t":"s","v":"="},{"t":"s","v":"type-of"},{"t":"s","v":"keyword"},{"t":"s","v":"<"},{"t":"s","v":"len"},{"t":"s","v":"trampoline"},{"t":"s","v":"eval-expr"},{"t":"s","v":"nth"},{"t":"s","v":"dict-set!"},{"t":"s","v":"keyword-name"},{"t":"s","v":"append!"}],"arity":2,"upvalue-count":4}},{"t":"s","v":"i"},{"t":"n","v":0},{"t":"s","v":"skip"},{"t":"s","v":"env-merge"},{"t":"s","v":"component-closure"},{"t":"s","v":"for-each"},{"t":"code","v":{"bytecode":[20,0,0,18,0,16,0,18,1,16,0,52,1,0,2,33,11,0,18,1,16,0,52,2,0,2,32,1,0,2,49,3,50],"constants":[{"t":"s","v":"env-bind!"},{"t":"s","v":"dict-has?"},{"t":"s","v":"dict-get"}],"arity":1,"upvalue-count":2}},{"t":"s","v":"component-params"},{"t":"s","v":"component-has-children?"},{"t":"s","v":"create-fragment"},{"t":"code","v":{"bytecode":[20,0,0,16,0,18,0,18,1,48,3,17,1,16,1,52,2,0,1,52,1,0,1,33,12,0,20,3,0,18,2,16,1,49,2,32,1,0,2,50],"constants":[{"t":"s","v":"render-to-dom"},{"t":"s","v":"not"},{"t":"s","v":"spread?"},{"t":"s","v":"dom-append"}],"arity":1,"upvalue-count":3}},{"t":"s","v":"env-bind!"},{"t":"s","v":"children"},{"t":"s","v":"render-to-dom"},{"t":"s","v":"component-body"}],"arity":4}},{"t":"s","v":"render-dom-fragment"},{"t":"code","v":{"bytecode":[20,0,0,48,0,17,3,51,2,0,1,1,1,2,1,3,16,0,52,1,0,2,5,16,3,50],"constants":[{"t":"s","v":"create-fragment"},{"t":"s","v":"for-each"},{"t":"code","v":{"bytecode":[20,0,0,16,0,18,0,18,1,48,3,17,1,16,1,52,2,0,1,52,1,0,1,33,12,0,20,3,0,18,2,16,1,49,2,32,1,0,2,50],"constants":[{"t":"s","v":"render-to-dom"},{"t":"s","v":"not"},{"t":"s","v":"spread?"},{"t":"s","v":"dom-append"}],"arity":1,"upvalue-count":3}}],"arity":3}},{"t":"s","v":"render-dom-raw"},{"t":"code","v":{"bytecode":[20,0,0,48,0,17,2,51,2,0,1,1,1,2,16,0,52,1,0,2,5,16,2,50],"constants":[{"t":"s","v":"create-fragment"},{"t":"s","v":"for-each"},{"t":"code","v":{"bytecode":[20,0,0,20,1,0,16,0,18,0,48,2,48,1,17,1,16,1,52,3,0,1,1,4,0,52,2,0,2,33,17,0,20,5,0,18,1,20,6,0,16,1,48,1,49,2,32,68,0,16,1,52,3,0,1,1,7,0,52,2,0,2,33,17,0,20,5,0,18,1,20,8,0,16,1,48,1,49,2,32,35,0,16,1,52,10,0,1,52,9,0,1,33,21,0,20,5,0,18,1,20,11,0,16,1,52,12,0,1,48,1,49,2,32,1,0,2,50],"constants":[{"t":"s","v":"trampoline"},{"t":"s","v":"eval-expr"},{"t":"s","v":"="},{"t":"s","v":"type-of"},{"t":"s","v":"string"},{"t":"s","v":"dom-append"},{"t":"s","v":"dom-parse-html"},{"t":"s","v":"dom-node"},{"t":"s","v":"dom-clone"},{"t":"s","v":"not"},{"t":"s","v":"nil?"},{"t":"s","v":"create-text-node"},{"t":"s","v":"str"}],"arity":1,"upvalue-count":2}}],"arity":2}},{"t":"s","v":"render-dom-unknown-component"},{"t":"code","v":{"bytecode":[1,2,0,16,0,52,1,0,2,52,0,0,1,50],"constants":[{"t":"s","v":"error"},{"t":"s","v":"str"},{"t":"s","v":"Unknown component: "}],"arity":1}},{"t":"s","v":"RENDER_DOM_FORMS"},{"t":"s","v":"list"},{"t":"s","v":"if"},{"t":"s","v":"when"},{"t":"s","v":"cond"},{"t":"s","v":"case"},{"t":"s","v":"let"},{"t":"s","v":"let*"},{"t":"s","v":"letrec"},{"t":"s","v":"begin"},{"t":"s","v":"do"},{"t":"s","v":"define"},{"t":"s","v":"defcomp"},{"t":"s","v":"defisland"},{"t":"s","v":"defmacro"},{"t":"s","v":"defstyle"},{"t":"s","v":"map"},{"t":"s","v":"map-indexed"},{"t":"s","v":"filter"},{"t":"s","v":"for-each"},{"t":"s","v":"portal"},{"t":"s","v":"error-boundary"},{"t":"s","v":"scope"},{"t":"s","v":"provide"},{"t":"s","v":"cyst"},{"t":"s","v":"render-dom-form?"},{"t":"code","v":{"bytecode":[20,1,0,16,0,52,0,0,2,50],"constants":[{"t":"s","v":"contains?"},{"t":"s","v":"RENDER_DOM_FORMS"}],"arity":1}},{"t":"s","v":"dispatch-render-form"},{"t":"code","v":{"bytecode":[16,0,1,1,0,52,0,0,2,33,226,0,20,2,0,48,0,33,124,0,20,3,0,1,4,0,48,1,17,4,52,5,0,0,17,5,2,17,6,20,6,0,51,7,0,1,1,1,2,1,3,1,4,1,5,1,6,48,1,5,16,6,52,8,0,1,33,5,0,16,6,32,67,0,20,9,0,48,0,17,7,20,10,0,16,7,16,4,48,2,5,16,6,33,41,0,20,11,0,16,6,48,1,33,10,0,20,12,0,16,6,48,1,32,6,0,16,6,52,5,0,1,17,5,5,20,10,0,16,7,16,6,48,2,32,1,0,2,5,16,7,32,91,0,20,13,0,20,14,0,16,1,1,16,0,52,15,0,2,16,2,48,2,48,1,17,4,16,4,33,21,0,20,17,0,16,1,1,18,0,52,15,0,2,16,2,16,3,49,3,32,42,0,16,1,52,20,0,1,1,21,0,52,19,0,2,33,21,0,20,17,0,16,1,1,21,0,52,15,0,2,16,2,16,3,49,3,32,5,0,20,9,0,49,0,32,217,7,16,0,1,22,0,52,0,0,2,33,180,0,20,2,0,48,0,33,95,0,20,3,0,1,23,0,48,1,17,4,52,5,0,0,17,5,2,17,6,20,6,0,51,24,0,1,4,1,5,1,1,1,2,1,3,1,6,48,1,5,16,6,52,8,0,1,33,5,0,16,6,32,38,0,20,9,0,48,0,17,7,20,10,0,16,7,16,4,48,2,5,16,6,33,12,0,20,10,0,16,7,16,6,48,2,32,1,0,2,5,16,7,32,74,0,20,13,0,20,14,0,16,1,1,16,0,52,15,0,2,16,2,48,2,48,1,52,25,0,1,33,8,0,20,9,0,49,0,32,38,0,20,9,0,48,0,17,4,51,27,0,1,4,1,1,1,2,1,3,1,18,0,16,1,52,20,0,1,52,28,0,2,52,26,0,2,5,16,4,32,25,7,16,0,1,29,0,52,0,0,2,33,145,0,20,2,0,48,0,33,95,0,20,3,0,1,30,0,48,1,17,4,52,5,0,0,17,5,2,17,6,20,6,0,51,31,0,1,1,1,2,1,4,1,5,1,3,1,6,48,1,5,16,6,52,8,0,1,33,5,0,16,6,32,38,0,20,9,0,48,0,17,7,20,10,0,16,7,16,4,48,2,5,16,6,33,12,0,20,10,0,16,7,16,6,48,2,32,1,0,2,5,16,7,32,39,0,20,32,0,16,1,52,33,0,1,16,2,48,2,17,4,16,4,33,14,0,20,17,0,16,4,16,2,16,3,49,3,32,5,0,20,9,0,49,0,32,124,6,16,0,1,34,0,52,0,0,2,33,26,0,20,17,0,20,13,0,20,14,0,16,1,16,2,48,2,48,1,16,2,16,3,49,3,32,86,6,16,0,1,35,0,52,0,0,2,6,34,10,0,5,16,0,1,36,0,52,0,0,2,33,96,0,20,37,0,16,1,1,16,0,52,15,0,2,16,2,48,2,17,4,16,1,52,20,0,1,1,21,0,52,0,0,2,33,21,0,20,17,0,16,1,1,18,0,52,15,0,2,16,4,16,3,49,3,32,38,0,20,9,0,48,0,17,5,51,38,0,1,1,1,4,1,3,1,5,1,18,0,16,1,52,20,0,1,52,28,0,2,52,26,0,2,5,16,5,32,220,5,16,0,1,39,0,52,0,0,2,33,109,0,16,1,1,16,0,52,15,0,2,17,4,16,1,1,18,0,52,40,0,2,17,5,20,41,0,16,2,48,1,17,6,51,42,0,1,6,16,4,52,26,0,2,5,51,43,0,1,6,16,4,52,26,0,2,5,16,5,52,20,0,1,1,16,0,52,19,0,2,33,18,0,51,44,0,1,6,16,5,52,45,0,1,52,26,0,2,32,1,0,2,5,20,17,0,16,5,52,46,0,1,16,6,16,3,49,3,32,99,5,16,0,1,47,0,52,0,0,2,6,34,10,0,5,16,0,1,48,0,52,0,0,2,33,78,0,16,1,52,20,0,1,1,18,0,52,0,0,2,33,21,0,20,17,0,16,1,1,16,0,52,15,0,2,16,2,16,3,49,3,32,38,0,20,9,0,48,0,17,4,51,38,0,1,1,1,2,1,3,1,4,1,16,0,16,1,52,20,0,1,52,28,0,2,52,26,0,2,5,16,4,32,251,4,20,49,0,16,0,48,1,33,23,0,20,13,0,20,14,0,16,1,16,2,48,2,48,1,5,20,9,0,49,0,32,218,4,16,0,1,50,0,52,0,0,2,33,31,1,16,1,1,18,0,52,15,0,2,17,4,20,2,0,48,0,6,33,77,0,5,16,4,52,51,0,1,1,5,0,52,0,0,2,6,33,59,0,5,16,4,52,20,0,1,1,16,0,52,19,0,2,6,33,41,0,5,16,4,52,52,0,1,52,51,0,1,1,53,0,52,0,0,2,6,33,19,0,5,20,54,0,16,4,52,52,0,1,48,1,1,55,0,52,0,0,2,33,111,0,20,13,0,20,14,0,16,1,1,16,0,52,15,0,2,16,2,48,2,48,1,17,5,20,13,0,20,14,0,16,4,1,16,0,52,15,0,2,16,2,48,2,48,1,17,6,20,56,0,16,6,48,1,33,16,0,20,57,0,16,5,16,6,16,2,16,3,49,4,32,36,0,20,55,0,16,6,48,1,17,7,20,9,0,48,0,17,8,51,58,0,1,5,1,2,1,3,1,8,16,7,52,26,0,2,5,16,8,32,73,0,20,13,0,20,14,0,16,1,1,16,0,52,15,0,2,16,2,48,2,48,1,17,5,20,13,0,20,14,0,16,1,1,18,0,52,15,0,2,16,2,48,2,48,1,17,6,20,9,0,48,0,17,7,51,58,0,1,5,1,2,1,3,1,7,16,6,52,26,0,2,5,16,7,32,175,3,16,0,1,59,0,52,0,0,2,33,76,0,20,13,0,20,14,0,16,1,1,16,0,52,15,0,2,16,2,48,2,48,1,17,4,20,13,0,20,14,0,16,1,1,18,0,52,15,0,2,16,2,48,2,48,1,17,5,20,9,0,48,0,17,6,51,61,0,1,4,1,2,1,3,1,6,16,5,52,60,0,2,5,16,6,32,87,3,16,0,1,62,0,52,0,0,2,33,26,0,20,17,0,20,13,0,20,14,0,16,1,16,2,48,2,48,1,16,2,16,3,49,3,32,49,3,16,0,1,63,0,52,0,0,2,33,18,0,20,64,0,16,1,52,33,0,1,16,2,16,3,49,3,32,19,3,16,0,1,65,0,52,0,0,2,33,18,0,20,66,0,16,1,52,33,0,1,16,2,16,3,49,3,32,245,2,16,0,1,26,0,52,0,0,2,33,76,0,20,13,0,20,14,0,16,1,1,16,0,52,15,0,2,16,2,48,2,48,1,17,4,20,13,0,20,14,0,16,1,1,18,0,52,15,0,2,16,2,48,2,48,1,17,5,20,9,0,48,0,17,6,51,58,0,1,4,1,2,1,3,1,6,16,5,52,26,0,2,5,16,6,32,157,2,16,0,1,67,0,52,0,0,2,33,188,0,20,13,0,20,14,0,16,1,1,16,0,52,15,0,2,16,2,48,2,48,1,17,4,16,1,1,18,0,52,40,0,2,17,5,2,17,6,2,17,7,20,9,0,48,0,17,8,16,5,52,20,0,1,1,18,0,52,68,0,2,6,33,41,0,5,16,5,52,52,0,1,52,51,0,1,1,69,0,52,0,0,2,6,33,19,0,5,20,70,0,16,5,52,52,0,1,48,1,1,71,0,52,0,0,2,33,38,0,20,13,0,20,14,0,16,5,1,16,0,52,15,0,2,16,2,48,2,48,1,17,6,5,16,5,1,18,0,52,40,0,2,17,7,32,4,0,16,5,17,7,5,16,4,16,6,52,72,0,2,5,51,73,0,1,8,1,2,1,3,16,7,52,26,0,2,5,16,4,52,74,0,1,5,16,8,32,213,1,16,0,1,75,0,52,0,0,2,33,103,0,20,13,0,20,14,0,16,1,1,16,0,52,15,0,2,16,2,48,2,48,1,17,4,20,13,0,20,14,0,16,1,1,18,0,52,15,0,2,16,2,48,2,48,1,17,5,20,9,0,48,0,17,6,16,4,16,5,52,72,0,2,5,51,27,0,1,6,1,1,1,2,1,3,1,21,0,16,1,52,20,0,1,52,28,0,2,52,26,0,2,5,16,4,52,74,0,1,5,16,6,32,98,1,16,0,1,76,0,52,0,0,2,33,63,1,16,1,52,20,0,1,1,18,0,52,19,0,2,6,33,47,0,5,16,1,1,16,0,52,15,0,2,52,51,0,1,1,69,0,52,0,0,2,6,33,22,0,5,20,70,0,16,1,1,16,0,52,15,0,2,48,1,1,77,0,52,0,0,2,33,28,0,20,13,0,20,14,0,16,1,1,18,0,52,15,0,2,16,2,48,2,48,1,52,78,0,1,32,5,0,20,79,0,48,0,17,4,20,81,0,16,4,52,80,0,2,17,5,16,5,6,33,11,0,5,20,82,0,16,5,1,83,0,48,2,33,5,0,16,5,32,178,0,20,84,0,1,85,0,2,48,2,17,6,52,5,0,0,17,7,16,1,52,20,0,1,1,18,0,52,19,0,2,6,33,47,0,5,16,1,1,16,0,52,15,0,2,52,51,0,1,1,69,0,52,0,0,2,6,33,22,0,5,20,70,0,16,1,1,16,0,52,15,0,2,48,1,1,77,0,52,0,0,2,33,12,0,16,1,1,21,0,52,40,0,2,32,9,0,16,1,1,16,0,52,40,0,2,17,8,20,86,0,16,6,1,87,0,16,4,48,3,5,20,88,0,51,89,0,1,7,51,90,0,1,2,1,3,1,8,48,2,17,9,20,10,0,16,6,16,9,48,2,5,20,91,0,16,6,1,92,0,16,7,48,3,5,20,81,0,16,4,16,6,52,93,0,3,5,16,6,32,23,0,20,17,0,20,13,0,20,14,0,16,1,16,2,48,2,48,1,16,2,16,3,49,3,50],"constants":[{"t":"s","v":"="},{"t":"s","v":"if"},{"t":"s","v":"island-scope?"},{"t":"s","v":"create-comment"},{"t":"s","v":"r-if"},{"t":"s","v":"list"},{"t":"s","v":"effect"},{"t":"code","v":{"bytecode":[20,0,0,20,1,0,18,0,1,3,0,52,2,0,2,18,1,48,2,48,1,17,1,16,1,33,21,0,20,4,0,18,0,1,5,0,52,2,0,2,18,1,18,2,48,3,32,42,0,18,0,52,7,0,1,1,8,0,52,6,0,2,33,21,0,20,4,0,18,0,1,8,0,52,2,0,2,18,1,18,2,48,3,32,5,0,20,9,0,48,0,17,0,20,10,0,18,3,48,1,33,51,0,51,12,0,18,4,52,11,0,2,5,20,13,0,16,0,48,1,33,10,0,20,14,0,16,0,48,1,32,6,0,16,0,52,15,0,1,19,4,5,20,16,0,18,3,16,0,49,2,32,4,0,16,0,19,5,50],"constants":[{"t":"s","v":"trampoline"},{"t":"s","v":"eval-expr"},{"t":"s","v":"nth"},{"t":"n","v":1},{"t":"s","v":"render-to-dom"},{"t":"n","v":2},{"t":"s","v":">"},{"t":"s","v":"len"},{"t":"n","v":3},{"t":"s","v":"create-fragment"},{"t":"s","v":"dom-parent"},{"t":"s","v":"for-each"},{"t":"code","v":{"bytecode":[20,0,0,16,0,49,1,50],"constants":[{"t":"s","v":"dom-remove"}],"arity":1}},{"t":"s","v":"dom-is-fragment?"},{"t":"s","v":"dom-child-nodes"},{"t":"s","v":"list"},{"t":"s","v":"dom-insert-after"}],"upvalue-count":6}},{"t":"s","v":"spread?"},{"t":"s","v":"create-fragment"},{"t":"s","v":"dom-append"},{"t":"s","v":"dom-is-fragment?"},{"t":"s","v":"dom-child-nodes"},{"t":"s","v":"trampoline"},{"t":"s","v":"eval-expr"},{"t":"s","v":"nth"},{"t":"n","v":1},{"t":"s","v":"render-to-dom"},{"t":"n","v":2},{"t":"s","v":">"},{"t":"s","v":"len"},{"t":"n","v":3},{"t":"s","v":"when"},{"t":"s","v":"r-when"},{"t":"code","v":{"bytecode":[20,0,0,18,0,48,1,33,103,0,51,2,0,18,1,52,1,0,2,5,52,3,0,0,19,1,5,20,4,0,20,5,0,18,2,1,7,0,52,6,0,2,18,3,48,2,48,1,33,58,0,20,8,0,48,0,17,0,51,9,0,1,0,0,2,0,3,0,4,1,11,0,18,2,52,12,0,1,52,10,0,2,52,1,0,2,5,20,13,0,16,0,48,1,19,1,5,20,14,0,18,0,16,0,49,2,32,1,0,2,32,78,0,20,4,0,20,5,0,18,2,1,7,0,52,6,0,2,18,3,48,2,48,1,33,53,0,20,8,0,48,0,17,0,51,9,0,1,0,0,2,0,3,0,4,1,11,0,18,2,52,12,0,1,52,10,0,2,52,1,0,2,5,20,13,0,16,0,48,1,19,1,5,16,0,19,5,32,1,0,2,50],"constants":[{"t":"s","v":"dom-parent"},{"t":"s","v":"for-each"},{"t":"code","v":{"bytecode":[20,0,0,16,0,49,1,50],"constants":[{"t":"s","v":"dom-remove"}],"arity":1}},{"t":"s","v":"list"},{"t":"s","v":"trampoline"},{"t":"s","v":"eval-expr"},{"t":"s","v":"nth"},{"t":"n","v":1},{"t":"s","v":"create-fragment"},{"t":"code","v":{"bytecode":[20,0,0,18,0,20,1,0,18,1,16,0,52,2,0,2,18,2,18,3,48,3,49,2,50],"constants":[{"t":"s","v":"dom-append"},{"t":"s","v":"render-to-dom"},{"t":"s","v":"nth"}],"arity":1,"upvalue-count":4}},{"t":"s","v":"range"},{"t":"n","v":2},{"t":"s","v":"len"},{"t":"s","v":"dom-child-nodes"},{"t":"s","v":"dom-insert-after"}],"upvalue-count":6}},{"t":"s","v":"not"},{"t":"s","v":"for-each"},{"t":"code","v":{"bytecode":[20,0,0,18,0,20,1,0,18,1,16,0,52,2,0,2,18,2,18,3,48,3,49,2,50],"constants":[{"t":"s","v":"dom-append"},{"t":"s","v":"render-to-dom"},{"t":"s","v":"nth"}],"arity":1,"upvalue-count":4}},{"t":"s","v":"range"},{"t":"s","v":"cond"},{"t":"s","v":"r-cond"},{"t":"code","v":{"bytecode":[20,0,0,18,0,52,1,0,1,18,1,48,2,17,0,20,2,0,18,2,48,1,33,80,0,51,4,0,18,3,52,3,0,2,5,52,5,0,0,19,3,5,16,0,33,54,0,20,6,0,16,0,18,1,18,4,48,3,17,1,20,7,0,16,1,48,1,33,10,0,20,8,0,16,1,48,1,32,6,0,16,1,52,5,0,1,19,3,5,20,9,0,18,2,16,1,49,2,32,1,0,2,32,55,0,16,0,33,49,0,20,6,0,16,0,18,1,18,4,48,3,17,1,20,7,0,16,1,48,1,33,10,0,20,8,0,16,1,48,1,32,6,0,16,1,52,5,0,1,19,3,5,16,1,19,5,32,1,0,2,50],"constants":[{"t":"s","v":"eval-cond"},{"t":"s","v":"rest"},{"t":"s","v":"dom-parent"},{"t":"s","v":"for-each"},{"t":"code","v":{"bytecode":[20,0,0,16,0,49,1,50],"constants":[{"t":"s","v":"dom-remove"}],"arity":1}},{"t":"s","v":"list"},{"t":"s","v":"render-to-dom"},{"t":"s","v":"dom-is-fragment?"},{"t":"s","v":"dom-child-nodes"},{"t":"s","v":"dom-insert-after"}],"upvalue-count":6}},{"t":"s","v":"eval-cond"},{"t":"s","v":"rest"},{"t":"s","v":"case"},{"t":"s","v":"let"},{"t":"s","v":"let*"},{"t":"s","v":"process-bindings"},{"t":"code","v":{"bytecode":[20,0,0,18,0,16,0,52,1,0,2,18,1,18,2,48,3,17,1,16,1,52,3,0,1,52,2,0,1,33,12,0,20,4,0,18,3,16,1,49,2,32,1,0,2,50],"constants":[{"t":"s","v":"render-to-dom"},{"t":"s","v":"nth"},{"t":"s","v":"not"},{"t":"s","v":"spread?"},{"t":"s","v":"dom-append"}],"arity":1,"upvalue-count":4}},{"t":"s","v":"letrec"},{"t":"s","v":"slice"},{"t":"s","v":"env-extend"},{"t":"code","v":{"bytecode":[16,0,52,2,0,1,52,1,0,1,1,3,0,52,0,0,2,33,14,0,20,4,0,16,0,52,2,0,1,48,1,32,10,0,16,0,52,2,0,1,52,5,0,1,17,1,20,6,0,18,0,16,1,2,49,3,50],"constants":[{"t":"s","v":"="},{"t":"s","v":"type-of"},{"t":"s","v":"first"},{"t":"s","v":"symbol"},{"t":"s","v":"symbol-name"},{"t":"s","v":"str"},{"t":"s","v":"env-bind!"}],"arity":1,"upvalue-count":1}},{"t":"code","v":{"bytecode":[16,0,52,2,0,1,52,1,0,1,1,3,0,52,0,0,2,33,14,0,20,4,0,16,0,52,2,0,1,48,1,32,10,0,16,0,52,2,0,1,52,5,0,1,17,1,20,6,0,18,0,16,1,20,7,0,20,8,0,16,0,1,10,0,52,9,0,2,18,0,48,2,48,1,49,3,50],"constants":[{"t":"s","v":"="},{"t":"s","v":"type-of"},{"t":"s","v":"first"},{"t":"s","v":"symbol"},{"t":"s","v":"symbol-name"},{"t":"s","v":"str"},{"t":"s","v":"env-set!"},{"t":"s","v":"trampoline"},{"t":"s","v":"eval-expr"},{"t":"s","v":"nth"},{"t":"n","v":1}],"arity":1,"upvalue-count":1}},{"t":"code","v":{"bytecode":[20,0,0,20,1,0,16,0,18,0,48,2,49,1,50],"constants":[{"t":"s","v":"trampoline"},{"t":"s","v":"eval-expr"}],"arity":1,"upvalue-count":1}},{"t":"s","v":"init"},{"t":"s","v":"last"},{"t":"s","v":"begin"},{"t":"s","v":"do"},{"t":"s","v":"definition-form?"},{"t":"s","v":"map"},{"t":"s","v":"type-of"},{"t":"s","v":"first"},{"t":"s","v":"symbol"},{"t":"s","v":"symbol-name"},{"t":"s","v":"deref"},{"t":"s","v":"signal?"},{"t":"s","v":"reactive-list"},{"t":"code","v":{"bytecode":[18,0,52,0,0,1,33,20,0,20,1,0,18,0,16,0,52,2,0,1,18,1,18,2,48,4,32,21,0,20,3,0,18,0,16,0,52,2,0,1,52,4,0,2,18,1,18,2,48,3,17,1,20,5,0,18,3,16,1,49,2,50],"constants":[{"t":"s","v":"lambda?"},{"t":"s","v":"render-lambda-dom"},{"t":"s","v":"list"},{"t":"s","v":"render-to-dom"},{"t":"s","v":"apply"},{"t":"s","v":"dom-append"}],"arity":1,"upvalue-count":4}},{"t":"s","v":"map-indexed"},{"t":"s","v":"for-each-indexed"},{"t":"code","v":{"bytecode":[18,0,52,0,0,1,33,22,0,20,1,0,18,0,16,0,16,1,52,2,0,2,18,1,18,2,48,4,32,23,0,20,3,0,18,0,16,0,16,1,52,2,0,2,52,4,0,2,18,1,18,2,48,3,17,2,20,5,0,18,3,16,2,49,2,50],"constants":[{"t":"s","v":"lambda?"},{"t":"s","v":"render-lambda-dom"},{"t":"s","v":"list"},{"t":"s","v":"render-to-dom"},{"t":"s","v":"apply"},{"t":"s","v":"dom-append"}],"arity":2,"upvalue-count":4}},{"t":"s","v":"filter"},{"t":"s","v":"portal"},{"t":"s","v":"render-dom-portal"},{"t":"s","v":"error-boundary"},{"t":"s","v":"render-dom-error-boundary"},{"t":"s","v":"scope"},{"t":"s","v":">="},{"t":"s","v":"keyword"},{"t":"s","v":"keyword-name"},{"t":"s","v":"value"},{"t":"s","v":"scope-push!"},{"t":"code","v":{"bytecode":[20,0,0,18,0,20,1,0,16,0,18,1,18,2,48,3,49,2,50],"constants":[{"t":"s","v":"dom-append"},{"t":"s","v":"render-to-dom"}],"arity":1,"upvalue-count":3}},{"t":"s","v":"scope-pop!"},{"t":"s","v":"provide"},{"t":"s","v":"cyst"},{"t":"s","v":"key"},{"t":"s","v":"str"},{"t":"s","v":"next-cyst-id"},{"t":"s","v":"get"},{"t":"s","v":"*memo-cache*"},{"t":"s","v":"host-get"},{"t":"s","v":"isConnected"},{"t":"s","v":"dom-create-element"},{"t":"s","v":"div"},{"t":"s","v":"dom-set-attr"},{"t":"s","v":"data-sx-cyst"},{"t":"s","v":"with-island-scope"},{"t":"code","v":{"bytecode":[20,0,0,18,0,16,0,49,2,50],"constants":[{"t":"s","v":"append!"}],"arity":1,"upvalue-count":1}},{"t":"code","v":{"bytecode":[20,0,0,48,0,17,0,51,2,0,1,0,0,0,0,1,18,2,52,1,0,2,5,16,0,50],"constants":[{"t":"s","v":"create-fragment"},{"t":"s","v":"for-each"},{"t":"code","v":{"bytecode":[20,0,0,18,0,20,1,0,16,0,18,1,18,2,48,3,49,2,50],"constants":[{"t":"s","v":"dom-append"},{"t":"s","v":"render-to-dom"}],"arity":1,"upvalue-count":3}}],"upvalue-count":3}},{"t":"s","v":"dom-set-data"},{"t":"s","v":"sx-disposers"},{"t":"s","v":"dict-set!"}],"arity":4}},{"t":"s","v":"render-lambda-dom"},{"t":"code","v":{"bytecode":[20,0,0,16,0,52,1,0,1,16,2,48,2,17,4,51,3,0,1,4,1,1,16,0,52,4,0,1,52,2,0,2,5,20,5,0,16,0,52,6,0,1,16,4,16,3,49,3,50],"constants":[{"t":"s","v":"env-merge"},{"t":"s","v":"lambda-closure"},{"t":"s","v":"for-each-indexed"},{"t":"code","v":{"bytecode":[20,0,0,18,0,16,1,18,1,16,0,52,1,0,2,49,3,50],"constants":[{"t":"s","v":"env-bind!"},{"t":"s","v":"nth"}],"arity":2,"upvalue-count":2}},{"t":"s","v":"lambda-params"},{"t":"s","v":"render-to-dom"},{"t":"s","v":"lambda-body"}],"arity":4}},{"t":"s","v":"render-dom-island"},{"t":"code","v":{"bytecode":[52,0,0,0,17,4,52,1,0,0,17,5,51,3,0,1,1,1,2,1,4,1,5,1,4,0,1,5,0,1,6,0,4,52,0,0,4,16,1,52,2,0,3,5,20,7,0,16,0,52,8,0,1,16,2,48,2,17,6,16,0,52,9,0,1,17,7,51,11,0,1,6,1,4,16,0,52,12,0,1,52,10,0,2,5,16,0,52,13,0,1,33,38,0,20,14,0,48,0,17,8,51,15,0,1,8,1,2,1,3,16,5,52,10,0,2,5,20,16,0,16,6,1,17,0,16,8,48,3,32,1,0,2,5,20,18,0,1,19,0,2,48,2,17,8,52,1,0,0,17,9,20,20,0,16,8,1,21,0,16,7,48,3,5,20,22,0,16,8,1,23,0,48,2,5,20,24,0,51,25,0,1,9,51,26,0,1,0,1,6,1,3,48,2,17,10,20,27,0,16,8,16,10,48,2,5,20,28,0,16,8,1,29,0,16,9,48,3,5,16,8,50],"constants":[{"t":"s","v":"dict"},{"t":"s","v":"list"},{"t":"s","v":"reduce"},{"t":"code","v":{"bytecode":[16,0,1,1,0,52,0,0,2,17,2,16,2,33,29,0,16,0,1,1,0,4,1,3,0,16,0,1,3,0,52,0,0,2,52,4,0,1,52,2,0,5,32,154,0,16,1,52,6,0,1,1,7,0,52,5,0,2,6,33,24,0,5,16,0,1,3,0,52,0,0,2,52,4,0,1,18,0,52,9,0,1,52,8,0,2,33,78,0,20,10,0,20,11,0,18,0,16,0,1,3,0,52,0,0,2,52,4,0,1,52,12,0,2,18,1,48,2,48,1,17,3,18,2,20,14,0,16,1,48,1,16,3,52,13,0,3,5,16,0,1,1,0,3,1,3,0,16,0,1,3,0,52,0,0,2,52,4,0,1,52,2,0,5,32,32,0,20,15,0,18,3,16,1,48,2,5,16,0,1,3,0,16,0,1,3,0,52,0,0,2,52,4,0,1,52,2,0,3,50],"constants":[{"t":"s","v":"get"},{"t":"s","v":"skip"},{"t":"s","v":"assoc"},{"t":"s","v":"i"},{"t":"s","v":"inc"},{"t":"s","v":"="},{"t":"s","v":"type-of"},{"t":"s","v":"keyword"},{"t":"s","v":"<"},{"t":"s","v":"len"},{"t":"s","v":"trampoline"},{"t":"s","v":"eval-expr"},{"t":"s","v":"nth"},{"t":"s","v":"dict-set!"},{"t":"s","v":"keyword-name"},{"t":"s","v":"append!"}],"arity":2,"upvalue-count":4}},{"t":"s","v":"i"},{"t":"n","v":0},{"t":"s","v":"skip"},{"t":"s","v":"env-merge"},{"t":"s","v":"component-closure"},{"t":"s","v":"component-name"},{"t":"s","v":"for-each"},{"t":"code","v":{"bytecode":[20,0,0,18,0,16,0,18,1,16,0,52,1,0,2,33,11,0,18,1,16,0,52,2,0,2,32,1,0,2,49,3,50],"constants":[{"t":"s","v":"env-bind!"},{"t":"s","v":"dict-has?"},{"t":"s","v":"dict-get"}],"arity":1,"upvalue-count":2}},{"t":"s","v":"component-params"},{"t":"s","v":"component-has-children?"},{"t":"s","v":"create-fragment"},{"t":"code","v":{"bytecode":[20,0,0,18,0,20,1,0,16,0,18,1,18,2,48,3,49,2,50],"constants":[{"t":"s","v":"dom-append"},{"t":"s","v":"render-to-dom"}],"arity":1,"upvalue-count":3}},{"t":"s","v":"env-bind!"},{"t":"s","v":"children"},{"t":"s","v":"dom-create-element"},{"t":"s","v":"span"},{"t":"s","v":"dom-set-attr"},{"t":"s","v":"data-sx-island"},{"t":"s","v":"mark-processed!"},{"t":"s","v":"island-hydrated"},{"t":"s","v":"with-island-scope"},{"t":"code","v":{"bytecode":[20,0,0,18,0,16,0,49,2,50],"constants":[{"t":"s","v":"append!"}],"arity":1,"upvalue-count":1}},{"t":"code","v":{"bytecode":[20,0,0,18,0,52,1,0,1,18,1,18,2,49,3,50],"constants":[{"t":"s","v":"render-to-dom"},{"t":"s","v":"component-body"}],"upvalue-count":3}},{"t":"s","v":"dom-append"},{"t":"s","v":"dom-set-data"},{"t":"s","v":"sx-disposers"}],"arity":4}},{"t":"s","v":"render-dom-lake"},{"t":"code","v":{"bytecode":[2,17,3,1,0,0,17,4,52,1,0,0,17,5,51,3,0,1,0,1,1,1,3,1,4,1,5,1,5,0,1,6,0,1,7,0,4,52,4,0,4,16,0,52,2,0,3,5,20,8,0,16,4,2,48,2,17,6,20,9,0,16,6,1,10,0,16,3,6,34,4,0,5,1,11,0,48,3,5,51,13,0,1,6,1,1,1,2,16,5,52,12,0,2,5,16,6,50],"constants":[{"t":"s","v":"div"},{"t":"s","v":"list"},{"t":"s","v":"reduce"},{"t":"code","v":{"bytecode":[16,0,1,1,0,52,0,0,2,17,2,16,2,33,29,0,16,0,1,1,0,4,1,3,0,16,0,1,3,0,52,0,0,2,52,4,0,1,52,2,0,5,32,187,0,16,1,52,6,0,1,1,7,0,52,5,0,2,6,33,24,0,5,16,0,1,3,0,52,0,0,2,52,4,0,1,18,0,52,9,0,1,52,8,0,2,33,111,0,20,10,0,16,1,48,1,17,3,20,11,0,20,12,0,18,0,16,0,1,3,0,52,0,0,2,52,4,0,1,52,13,0,2,18,1,48,2,48,1,17,4,16,3,1,14,0,52,5,0,2,33,7,0,16,4,19,2,32,20,0,16,3,1,15,0,52,5,0,2,33,7,0,16,4,19,3,32,1,0,2,5,16,0,1,1,0,3,1,3,0,16,0,1,3,0,52,0,0,2,52,4,0,1,52,2,0,5,32,32,0,20,16,0,18,4,16,1,48,2,5,16,0,1,3,0,16,0,1,3,0,52,0,0,2,52,4,0,1,52,2,0,3,50],"constants":[{"t":"s","v":"get"},{"t":"s","v":"skip"},{"t":"s","v":"assoc"},{"t":"s","v":"i"},{"t":"s","v":"inc"},{"t":"s","v":"="},{"t":"s","v":"type-of"},{"t":"s","v":"keyword"},{"t":"s","v":"<"},{"t":"s","v":"len"},{"t":"s","v":"keyword-name"},{"t":"s","v":"trampoline"},{"t":"s","v":"eval-expr"},{"t":"s","v":"nth"},{"t":"s","v":"id"},{"t":"s","v":"tag"},{"t":"s","v":"append!"}],"arity":2,"upvalue-count":5}},{"t":"s","v":"dict"},{"t":"s","v":"i"},{"t":"n","v":0},{"t":"s","v":"skip"},{"t":"s","v":"dom-create-element"},{"t":"s","v":"dom-set-attr"},{"t":"s","v":"data-sx-lake"},{"t":"s","v":""},{"t":"s","v":"for-each"},{"t":"code","v":{"bytecode":[20,0,0,18,0,20,1,0,16,0,18,1,18,2,48,3,49,2,50],"constants":[{"t":"s","v":"dom-append"},{"t":"s","v":"render-to-dom"}],"arity":1,"upvalue-count":3}}],"arity":3}},{"t":"s","v":"render-dom-marsh"},{"t":"code","v":{"bytecode":[2,17,3,1,0,0,17,4,2,17,5,52,1,0,0,17,6,51,3,0,1,0,1,1,1,3,1,4,1,5,1,6,1,5,0,1,6,0,1,7,0,4,52,4,0,4,16,0,52,2,0,3,5,20,8,0,16,4,2,48,2,17,7,20,9,0,16,7,1,10,0,16,3,6,34,4,0,5,1,11,0,48,3,5,16,5,33,15,0,20,12,0,16,7,1,13,0,16,5,48,3,32,1,0,2,5,20,12,0,16,7,1,14,0,16,1,48,3,5,51,16,0,1,7,1,1,1,2,16,6,52,15,0,2,5,16,7,50],"constants":[{"t":"s","v":"div"},{"t":"s","v":"list"},{"t":"s","v":"reduce"},{"t":"code","v":{"bytecode":[16,0,1,1,0,52,0,0,2,17,2,16,2,33,29,0,16,0,1,1,0,4,1,3,0,16,0,1,3,0,52,0,0,2,52,4,0,1,52,2,0,5,32,206,0,16,1,52,6,0,1,1,7,0,52,5,0,2,6,33,24,0,5,16,0,1,3,0,52,0,0,2,52,4,0,1,18,0,52,9,0,1,52,8,0,2,33,130,0,20,10,0,16,1,48,1,17,3,20,11,0,20,12,0,18,0,16,0,1,3,0,52,0,0,2,52,4,0,1,52,13,0,2,18,1,48,2,48,1,17,4,16,3,1,14,0,52,5,0,2,33,7,0,16,4,19,2,32,39,0,16,3,1,15,0,52,5,0,2,33,7,0,16,4,19,3,32,20,0,16,3,1,16,0,52,5,0,2,33,7,0,16,4,19,4,32,1,0,2,5,16,0,1,1,0,3,1,3,0,16,0,1,3,0,52,0,0,2,52,4,0,1,52,2,0,5,32,32,0,20,17,0,18,5,16,1,48,2,5,16,0,1,3,0,16,0,1,3,0,52,0,0,2,52,4,0,1,52,2,0,3,50],"constants":[{"t":"s","v":"get"},{"t":"s","v":"skip"},{"t":"s","v":"assoc"},{"t":"s","v":"i"},{"t":"s","v":"inc"},{"t":"s","v":"="},{"t":"s","v":"type-of"},{"t":"s","v":"keyword"},{"t":"s","v":"<"},{"t":"s","v":"len"},{"t":"s","v":"keyword-name"},{"t":"s","v":"trampoline"},{"t":"s","v":"eval-expr"},{"t":"s","v":"nth"},{"t":"s","v":"id"},{"t":"s","v":"tag"},{"t":"s","v":"transform"},{"t":"s","v":"append!"}],"arity":2,"upvalue-count":6}},{"t":"s","v":"dict"},{"t":"s","v":"i"},{"t":"n","v":0},{"t":"s","v":"skip"},{"t":"s","v":"dom-create-element"},{"t":"s","v":"dom-set-attr"},{"t":"s","v":"data-sx-marsh"},{"t":"s","v":""},{"t":"s","v":"dom-set-data"},{"t":"s","v":"sx-marsh-transform"},{"t":"s","v":"sx-marsh-env"},{"t":"s","v":"for-each"},{"t":"code","v":{"bytecode":[20,0,0,18,0,20,1,0,16,0,18,1,18,2,48,3,49,2,50],"constants":[{"t":"s","v":"dom-append"},{"t":"s","v":"render-to-dom"}],"arity":1,"upvalue-count":3}}],"arity":3}},{"t":"s","v":"reactive-text"},{"t":"code","v":{"bytecode":[20,0,0,20,2,0,16,0,48,1,52,1,0,1,48,1,17,1,20,3,0,51,4,0,1,1,1,0,48,1,5,16,1,50],"constants":[{"t":"s","v":"create-text-node"},{"t":"s","v":"str"},{"t":"s","v":"deref"},{"t":"s","v":"effect"},{"t":"code","v":{"bytecode":[20,0,0,18,0,20,2,0,18,1,48,1,52,1,0,1,49,2,50],"constants":[{"t":"s","v":"dom-set-text-content"},{"t":"s","v":"str"},{"t":"s","v":"deref"}],"upvalue-count":2}}],"arity":1}},{"t":"s","v":"reactive-attr"},{"t":"code","v":{"bytecode":[20,0,0,16,0,1,1,0,48,2,6,34,4,0,5,1,2,0,17,3,16,3,52,3,0,1,33,5,0,16,1,32,11,0,16,3,1,5,0,16,1,52,4,0,3,17,4,20,6,0,16,0,1,1,0,16,4,48,3,5,20,7,0,51,8,0,1,2,1,0,1,1,49,1,50],"constants":[{"t":"s","v":"dom-get-attr"},{"t":"s","v":"data-sx-reactive-attrs"},{"t":"s","v":""},{"t":"s","v":"empty?"},{"t":"s","v":"str"},{"t":"s","v":","},{"t":"s","v":"dom-set-attr"},{"t":"s","v":"effect"},{"t":"code","v":{"bytecode":[18,0,48,0,17,0,20,0,0,16,0,48,1,33,10,0,20,1,0,16,0,48,1,32,2,0,16,0,17,1,16,1,52,2,0,1,6,34,8,0,5,16,1,4,52,3,0,2,33,12,0,20,4,0,18,1,18,2,49,2,32,40,0,16,1,3,52,3,0,2,33,15,0,20,5,0,18,1,18,2,1,6,0,49,3,32,15,0,20,5,0,18,1,18,2,16,1,52,7,0,1,49,3,50],"constants":[{"t":"s","v":"signal?"},{"t":"s","v":"deref"},{"t":"s","v":"nil?"},{"t":"s","v":"="},{"t":"s","v":"dom-remove-attr"},{"t":"s","v":"dom-set-attr"},{"t":"s","v":""},{"t":"s","v":"str"}],"upvalue-count":3}}],"arity":3}},{"t":"s","v":"reactive-spread"},{"t":"code","v":{"bytecode":[52,0,0,0,17,2,52,0,0,0,17,3,20,1,0,16,0,1,2,0,48,2,6,34,4,0,5,1,3,0,17,4,20,4,0,16,0,1,2,0,16,4,52,5,0,1,33,6,0,1,6,0,32,9,0,16,4,1,8,0,52,7,0,2,48,3,5,20,9,0,51,10,0,1,2,1,0,1,3,1,1,49,1,50],"constants":[{"t":"s","v":"list"},{"t":"s","v":"dom-get-attr"},{"t":"s","v":"data-sx-reactive-attrs"},{"t":"s","v":""},{"t":"s","v":"dom-set-attr"},{"t":"s","v":"empty?"},{"t":"s","v":"_spread"},{"t":"s","v":"str"},{"t":"s","v":",_spread"},{"t":"s","v":"effect"},{"t":"code","v":{"bytecode":[18,0,52,1,0,1,52,0,0,1,33,95,0,20,2,0,18,1,1,3,0,48,2,6,34,4,0,5,1,4,0,17,0,51,6,0,16,0,1,8,0,52,7,0,2,52,5,0,2,17,1,51,9,0,0,0,16,1,52,5,0,2,17,2,16,2,52,1,0,1,33,13,0,20,10,0,18,1,1,3,0,48,2,32,19,0,20,11,0,18,1,1,3,0,1,8,0,16,2,52,12,0,2,48,3,32,1,0,2,5,51,14,0,0,1,18,2,52,13,0,2,5,18,3,48,0,17,0,16,0,52,15,0,1,33,179,0,16,0,52,16,0,1,17,1,16,1,1,3,0,52,17,0,2,6,34,4,0,5,1,4,0,17,2,51,6,0,16,2,1,8,0,52,7,0,2,52,5,0,2,17,3,51,18,0,16,1,52,19,0,1,52,5,0,2,17,4,16,3,19,0,5,16,4,19,2,5,16,3,52,1,0,1,52,0,0,1,33,72,0,20,2,0,18,1,1,3,0,48,2,6,34,4,0,5,1,4,0,17,5,20,11,0,18,1,1,3,0,16,5,6,33,14,0,5,16,5,1,4,0,52,20,0,2,52,0,0,1,33,14,0,16,5,1,8,0,16,2,52,21,0,3,32,2,0,16,2,48,3,32,1,0,2,5,51,22,0,0,1,1,1,16,4,52,13,0,2,5,20,23,0,49,0,32,13,0,52,24,0,0,19,0,5,52,24,0,0,19,2,50],"constants":[{"t":"s","v":"not"},{"t":"s","v":"empty?"},{"t":"s","v":"dom-get-attr"},{"t":"s","v":"class"},{"t":"s","v":""},{"t":"s","v":"filter"},{"t":"code","v":{"bytecode":[16,0,1,2,0,52,1,0,2,52,0,0,1,50],"constants":[{"t":"s","v":"not"},{"t":"s","v":"="},{"t":"s","v":""}],"arity":1}},{"t":"s","v":"split"},{"t":"s","v":" "},{"t":"code","v":{"bytecode":[51,2,0,1,0,18,0,52,1,0,2,52,0,0,1,50],"constants":[{"t":"s","v":"not"},{"t":"s","v":"some"},{"t":"code","v":{"bytecode":[16,0,18,0,52,0,0,2,50],"constants":[{"t":"s","v":"="}],"arity":1,"upvalue-count":1}}],"arity":1,"upvalue-count":1}},{"t":"s","v":"dom-remove-attr"},{"t":"s","v":"dom-set-attr"},{"t":"s","v":"join"},{"t":"s","v":"for-each"},{"t":"code","v":{"bytecode":[20,0,0,18,0,16,0,49,2,50],"constants":[{"t":"s","v":"dom-remove-attr"}],"arity":1,"upvalue-count":1}},{"t":"s","v":"spread?"},{"t":"s","v":"spread-attrs"},{"t":"s","v":"dict-get"},{"t":"code","v":{"bytecode":[16,0,1,2,0,52,1,0,2,52,0,0,1,50],"constants":[{"t":"s","v":"not"},{"t":"s","v":"="},{"t":"s","v":"class"}],"arity":1}},{"t":"s","v":"keys"},{"t":"s","v":"="},{"t":"s","v":"str"},{"t":"code","v":{"bytecode":[20,0,0,18,0,16,0,18,1,16,0,52,2,0,2,52,1,0,1,49,3,50],"constants":[{"t":"s","v":"dom-set-attr"},{"t":"s","v":"str"},{"t":"s","v":"dict-get"}],"arity":1,"upvalue-count":2}},{"t":"s","v":"run-post-render-hooks"},{"t":"s","v":"list"}],"upvalue-count":4}}],"arity":2}},{"t":"s","v":"reactive-fragment"},{"t":"code","v":{"bytecode":[20,0,0,1,1,0,48,1,17,4,52,2,0,0,17,5,20,3,0,51,4,0,1,5,1,0,1,1,1,4,48,1,5,16,4,50],"constants":[{"t":"s","v":"create-comment"},{"t":"s","v":"island-fragment"},{"t":"s","v":"list"},{"t":"s","v":"effect"},{"t":"code","v":{"bytecode":[51,1,0,18,0,52,0,0,2,5,52,2,0,0,19,0,5,18,1,48,0,33,28,0,18,2,48,0,17,0,20,3,0,16,0,48,1,19,0,5,20,4,0,18,3,16,0,49,2,32,1,0,2,50],"constants":[{"t":"s","v":"for-each"},{"t":"code","v":{"bytecode":[20,0,0,16,0,49,1,50],"constants":[{"t":"s","v":"dom-remove"}],"arity":1}},{"t":"s","v":"list"},{"t":"s","v":"dom-child-nodes"},{"t":"s","v":"dom-insert-after"}],"upvalue-count":4}}],"arity":4}},{"t":"s","v":"render-list-item"},{"t":"code","v":{"bytecode":[16,0,52,0,0,1,33,20,0,20,1,0,16,0,16,1,52,2,0,1,16,2,16,3,49,4,32,21,0,20,3,0,16,0,16,1,52,2,0,1,52,4,0,2,16,2,16,3,49,3,50],"constants":[{"t":"s","v":"lambda?"},{"t":"s","v":"render-lambda-dom"},{"t":"s","v":"list"},{"t":"s","v":"render-to-dom"},{"t":"s","v":"apply"}],"arity":4}},{"t":"s","v":"extract-key"},{"t":"code","v":{"bytecode":[20,0,0,16,0,1,1,0,48,2,17,2,16,2,33,16,0,20,2,0,16,0,1,1,0,48,2,5,16,2,32,35,0,20,3,0,16,0,1,1,0,48,2,17,3,16,3,33,9,0,16,3,52,4,0,1,32,9,0,1,5,0,16,1,52,4,0,2,50],"constants":[{"t":"s","v":"dom-get-attr"},{"t":"s","v":"key"},{"t":"s","v":"dom-remove-attr"},{"t":"s","v":"dom-get-data"},{"t":"s","v":"str"},{"t":"s","v":"__idx_"}],"arity":2}},{"t":"s","v":"reactive-list"},{"t":"code","v":{"bytecode":[20,0,0,48,0,17,4,20,1,0,1,2,0,48,1,17,5,52,3,0,0,17,6,52,4,0,0,17,7,20,5,0,16,4,16,5,48,2,5,20,6,0,51,7,0,1,1,1,5,1,0,1,2,1,3,1,6,1,7,1,4,48,1,5,16,4,50],"constants":[{"t":"s","v":"create-fragment"},{"t":"s","v":"create-comment"},{"t":"s","v":"island-list"},{"t":"s","v":"dict"},{"t":"s","v":"list"},{"t":"s","v":"dom-append"},{"t":"s","v":"effect"},{"t":"code","v":{"bytecode":[20,0,0,18,0,48,1,17,0,20,1,0,18,1,48,1,33,133,0,52,2,0,0,17,1,52,3,0,0,17,2,4,17,3,51,5,0,0,2,0,3,0,4,1,3,0,5,1,1,1,2,16,0,52,4,0,2,5,16,3,52,6,0,1,33,41,0,20,7,0,18,1,48,1,5,20,8,0,48,0,17,4,51,10,0,1,4,1,1,16,2,52,9,0,2,5,20,11,0,18,1,16,4,48,2,32,31,0,51,12,0,1,1,0,5,18,6,52,9,0,2,5,18,1,17,4,51,13,0,1,1,1,4,16,2,52,9,0,2,5,16,1,19,5,5,16,2,19,6,32,21,0,51,14,0,0,2,0,3,0,4,0,5,0,6,0,7,16,0,52,4,0,2,50],"constants":[{"t":"s","v":"deref"},{"t":"s","v":"dom-parent"},{"t":"s","v":"dict"},{"t":"s","v":"list"},{"t":"s","v":"for-each-indexed"},{"t":"code","v":{"bytecode":[20,0,0,18,0,16,1,18,1,18,2,48,4,17,2,20,1,0,16,2,16,0,48,2,17,3,18,3,52,2,0,1,6,33,14,0,5,16,3,1,4,0,52,3,0,2,52,2,0,1,33,6,0,3,19,3,32,1,0,2,5,18,4,16,3,52,5,0,2,33,19,0,18,5,16,3,18,4,16,3,52,7,0,2,52,6,0,3,32,10,0,18,5,16,3,16,2,52,6,0,3,5,20,8,0,18,6,16,3,49,2,50],"constants":[{"t":"s","v":"render-list-item"},{"t":"s","v":"extract-key"},{"t":"s","v":"not"},{"t":"s","v":"starts-with?"},{"t":"s","v":"__idx_"},{"t":"s","v":"dict-has?"},{"t":"s","v":"dict-set!"},{"t":"s","v":"dict-get"},{"t":"s","v":"append!"}],"arity":2,"upvalue-count":7}},{"t":"s","v":"not"},{"t":"s","v":"dom-remove-children-after"},{"t":"s","v":"create-fragment"},{"t":"s","v":"for-each"},{"t":"code","v":{"bytecode":[20,0,0,18,0,18,1,16,0,52,1,0,2,49,2,50],"constants":[{"t":"s","v":"dom-append"},{"t":"s","v":"dict-get"}],"arity":1,"upvalue-count":2}},{"t":"s","v":"dom-insert-after"},{"t":"code","v":{"bytecode":[18,0,16,0,52,1,0,2,52,0,0,1,33,16,0,20,2,0,18,1,16,0,52,3,0,2,49,1,32,1,0,2,50],"constants":[{"t":"s","v":"not"},{"t":"s","v":"dict-has?"},{"t":"s","v":"dom-remove"},{"t":"s","v":"dict-get"}],"arity":1,"upvalue-count":2}},{"t":"code","v":{"bytecode":[18,0,16,0,52,0,0,2,17,1,20,1,0,18,1,48,1,17,2,16,1,16,2,52,3,0,2,52,2,0,1,33,12,0,20,4,0,18,1,16,1,48,2,32,1,0,2,5,16,1,19,1,50],"constants":[{"t":"s","v":"dict-get"},{"t":"s","v":"dom-next-sibling"},{"t":"s","v":"not"},{"t":"s","v":"identical?"},{"t":"s","v":"dom-insert-after"}],"arity":1,"upvalue-count":2}},{"t":"code","v":{"bytecode":[20,0,0,18,0,16,1,18,1,18,2,48,4,17,2,20,1,0,16,2,16,0,48,2,17,3,18,3,16,3,16,2,52,2,0,3,5,20,3,0,18,4,16,3,48,2,5,20,4,0,18,5,16,2,49,2,50],"constants":[{"t":"s","v":"render-list-item"},{"t":"s","v":"extract-key"},{"t":"s","v":"dict-set!"},{"t":"s","v":"append!"},{"t":"s","v":"dom-append"}],"arity":2,"upvalue-count":6}}],"upvalue-count":8}}],"arity":4}},{"t":"s","v":"bind-input"},{"t":"code","v":{"bytecode":[20,1,0,16,0,1,2,0,48,2,6,34,4,0,5,1,3,0,52,0,0,1,17,2,16,2,1,5,0,52,4,0,2,6,34,10,0,5,16,2,1,6,0,52,4,0,2,17,3,16,3,33,20,0,20,7,0,16,0,1,8,0,20,9,0,16,1,48,1,48,3,32,21,0,20,7,0,16,0,1,10,0,20,9,0,16,1,48,1,52,11,0,1,48,3,5,20,12,0,51,13,0,1,3,1,0,1,1,48,1,5,20,14,0,16,0,16,3,33,6,0,1,15,0,32,3,0,1,16,0,51,17,0,1,3,1,1,1,0,49,3,50],"constants":[{"t":"s","v":"lower"},{"t":"s","v":"dom-get-attr"},{"t":"s","v":"type"},{"t":"s","v":""},{"t":"s","v":"="},{"t":"s","v":"checkbox"},{"t":"s","v":"radio"},{"t":"s","v":"dom-set-prop"},{"t":"s","v":"checked"},{"t":"s","v":"deref"},{"t":"s","v":"value"},{"t":"s","v":"str"},{"t":"s","v":"effect"},{"t":"code","v":{"bytecode":[18,0,33,20,0,20,0,0,18,1,1,1,0,20,2,0,18,2,48,1,49,3,32,48,0,20,2,0,18,2,48,1,52,3,0,1,17,0,20,5,0,18,1,1,6,0,48,2,16,0,52,4,0,2,33,15,0,20,0,0,18,1,1,6,0,16,0,49,3,32,1,0,2,50],"constants":[{"t":"s","v":"dom-set-prop"},{"t":"s","v":"checked"},{"t":"s","v":"deref"},{"t":"s","v":"str"},{"t":"s","v":"!="},{"t":"s","v":"dom-get-prop"},{"t":"s","v":"value"}],"upvalue-count":3}},{"t":"s","v":"dom-on"},{"t":"s","v":"change"},{"t":"s","v":"input"},{"t":"code","v":{"bytecode":[18,0,33,20,0,20,0,0,18,1,20,1,0,18,2,1,2,0,48,2,49,2,32,17,0,20,0,0,18,1,20,1,0,18,2,1,3,0,48,2,49,2,50],"constants":[{"t":"s","v":"reset!"},{"t":"s","v":"dom-get-prop"},{"t":"s","v":"checked"},{"t":"s","v":"value"}],"arity":1,"upvalue-count":3}}],"arity":2}},{"t":"s","v":"*use-cek-reactive*"},{"t":"s","v":"enable-cek-reactive!"},{"t":"code","v":{"bytecode":[3,21,0,0,50],"constants":[{"t":"s","v":"*use-cek-reactive*"}]}},{"t":"s","v":"cek-reactive-text"},{"t":"code","v":{"bytecode":[20,0,0,1,1,0,48,1,17,2,51,2,0,1,2,17,3,20,3,0,20,4,0,16,0,16,1,20,6,0,16,1,16,3,3,48,3,52,5,0,1,48,3,48,1,17,4,20,7,0,16,2,16,4,52,8,0,1,48,2,5,16,2,50],"constants":[{"t":"s","v":"create-text-node"},{"t":"s","v":""},{"t":"code","v":{"bytecode":[20,0,0,18,0,16,0,52,1,0,1,49,2,50],"constants":[{"t":"s","v":"dom-set-text-content"},{"t":"s","v":"str"}],"arity":1,"upvalue-count":1}},{"t":"s","v":"cek-run"},{"t":"s","v":"make-cek-state"},{"t":"s","v":"list"},{"t":"s","v":"make-reactive-reset-frame"},{"t":"s","v":"dom-set-text-content"},{"t":"s","v":"str"}],"arity":2}},{"t":"s","v":"cek-reactive-attr"},{"t":"code","v":{"bytecode":[51,0,0,1,0,1,1,17,4,20,1,0,16,0,1,2,0,48,2,6,34,4,0,5,1,3,0,17,5,16,5,52,4,0,1,33,5,0,16,1,32,11,0,16,5,1,6,0,16,1,52,5,0,3,17,6,20,7,0,16,0,1,2,0,16,6,48,3,5,20,8,0,20,9,0,16,2,16,3,20,11,0,16,3,16,4,3,48,3,52,10,0,1,48,3,48,1,17,5,20,12,0,16,4,16,5,52,10,0,1,49,2,50],"constants":[{"t":"code","v":{"bytecode":[16,0,52,0,0,1,6,34,8,0,5,16,0,4,52,1,0,2,33,12,0,20,2,0,18,0,18,1,49,2,32,40,0,16,0,3,52,1,0,2,33,15,0,20,3,0,18,0,18,1,1,4,0,49,3,32,15,0,20,3,0,18,0,18,1,16,0,52,5,0,1,49,3,50],"constants":[{"t":"s","v":"nil?"},{"t":"s","v":"="},{"t":"s","v":"dom-remove-attr"},{"t":"s","v":"dom-set-attr"},{"t":"s","v":""},{"t":"s","v":"str"}],"arity":1,"upvalue-count":2}},{"t":"s","v":"dom-get-attr"},{"t":"s","v":"data-sx-reactive-attrs"},{"t":"s","v":""},{"t":"s","v":"empty?"},{"t":"s","v":"str"},{"t":"s","v":","},{"t":"s","v":"dom-set-attr"},{"t":"s","v":"cek-run"},{"t":"s","v":"make-cek-state"},{"t":"s","v":"list"},{"t":"s","v":"make-reactive-reset-frame"},{"t":"s","v":"cek-call"}],"arity":4}},{"t":"s","v":"render-dom-portal"},{"t":"code","v":{"bytecode":[20,0,0,20,1,0,16,0,52,2,0,1,16,1,48,2,48,1,17,3,20,3,0,16,3,48,1,6,34,8,0,5,20,4,0,16,3,48,1,17,4,16,4,52,5,0,1,33,20,0,20,6,0,1,8,0,16,3,1,9,0,52,7,0,3,49,1,32,75,0,20,6,0,1,8,0,16,3,52,7,0,2,48,1,17,5,20,10,0,48,0,17,6,51,12,0,1,6,1,1,1,2,16,0,52,13,0,1,52,11,0,2,5,20,14,0,16,6,48,1,17,7,20,15,0,16,4,16,6,48,2,5,20,16,0,51,17,0,1,7,48,1,5,16,5,50],"constants":[{"t":"s","v":"trampoline"},{"t":"s","v":"eval-expr"},{"t":"s","v":"first"},{"t":"s","v":"dom-query"},{"t":"s","v":"dom-ensure-element"},{"t":"s","v":"not"},{"t":"s","v":"create-comment"},{"t":"s","v":"str"},{"t":"s","v":"portal: "},{"t":"s","v":" (not found)"},{"t":"s","v":"create-fragment"},{"t":"s","v":"for-each"},{"t":"code","v":{"bytecode":[20,0,0,18,0,20,1,0,16,0,18,1,18,2,48,3,49,2,50],"constants":[{"t":"s","v":"dom-append"},{"t":"s","v":"render-to-dom"}],"arity":1,"upvalue-count":3}},{"t":"s","v":"rest"},{"t":"s","v":"dom-child-nodes"},{"t":"s","v":"dom-append"},{"t":"s","v":"register-in-scope"},{"t":"code","v":{"bytecode":[51,1,0,18,0,52,0,0,2,50],"constants":[{"t":"s","v":"for-each"},{"t":"code","v":{"bytecode":[20,0,0,16,0,49,1,50],"constants":[{"t":"s","v":"dom-remove"}],"arity":1}}],"upvalue-count":1}}],"arity":3}},{"t":"s","v":"render-dom-error-boundary"},{"t":"code","v":{"bytecode":[16,0,52,0,0,1,17,3,16,0,52,1,0,1,17,4,20,2,0,1,3,0,2,48,2,17,5,20,4,0,1,5,0,48,1,17,6,20,6,0,16,5,1,7,0,1,8,0,48,3,5,20,9,0,51,10,0,1,6,1,5,1,1,1,2,1,4,1,3,48,1,5,16,5,50],"constants":[{"t":"s","v":"first"},{"t":"s","v":"rest"},{"t":"s","v":"dom-create-element"},{"t":"s","v":"div"},{"t":"s","v":"signal"},{"t":"n","v":0},{"t":"s","v":"dom-set-attr"},{"t":"s","v":"data-sx-boundary"},{"t":"s","v":"true"},{"t":"s","v":"effect"},{"t":"code","v":{"bytecode":[20,0,0,18,0,48,1,5,20,1,0,18,1,1,2,0,1,3,0,48,3,5,1,5,0,2,52,4,0,2,5,20,6,0,51,7,0,0,2,0,3,0,4,0,1,51,8,0,0,5,0,2,0,0,0,3,0,1,49,2,50],"constants":[{"t":"s","v":"deref"},{"t":"s","v":"dom-set-prop"},{"t":"s","v":"innerHTML"},{"t":"s","v":""},{"t":"s","v":"scope-push!"},{"t":"s","v":"sx-island-scope"},{"t":"s","v":"try-catch"},{"t":"code","v":{"bytecode":[20,0,0,48,0,17,0,51,2,0,1,0,0,0,0,1,18,2,52,1,0,2,5,20,3,0,18,3,16,0,48,2,5,1,5,0,52,4,0,1,50],"constants":[{"t":"s","v":"create-fragment"},{"t":"s","v":"for-each"},{"t":"code","v":{"bytecode":[20,0,0,18,0,20,1,0,16,0,18,1,18,2,48,3,49,2,50],"constants":[{"t":"s","v":"dom-append"},{"t":"s","v":"render-to-dom"}],"arity":1,"upvalue-count":3}},{"t":"s","v":"dom-append"},{"t":"s","v":"scope-pop!"},{"t":"s","v":"sx-island-scope"}],"upvalue-count":4}},{"t":"code","v":{"bytecode":[1,1,0,52,0,0,1,5,20,2,0,20,3,0,18,0,18,1,48,2,48,1,17,1,51,4,0,0,2,17,2,16,1,52,5,0,1,33,22,0,20,6,0,16,1,16,0,16,2,52,7,0,2,18,1,18,3,48,4,32,23,0,20,8,0,16,1,16,0,16,2,52,7,0,2,52,9,0,2,18,1,18,3,48,3,17,3,20,10,0,18,4,16,3,49,2,50],"constants":[{"t":"s","v":"scope-pop!"},{"t":"s","v":"sx-island-scope"},{"t":"s","v":"trampoline"},{"t":"s","v":"eval-expr"},{"t":"code","v":{"bytecode":[20,0,0,18,0,51,1,0,49,2,50],"constants":[{"t":"s","v":"swap!"},{"t":"code","v":{"bytecode":[16,0,1,1,0,52,0,0,2,50],"constants":[{"t":"s","v":"+"},{"t":"n","v":1}],"arity":1}}],"upvalue-count":1}},{"t":"s","v":"lambda?"},{"t":"s","v":"render-lambda-dom"},{"t":"s","v":"list"},{"t":"s","v":"render-to-dom"},{"t":"s","v":"apply"},{"t":"s","v":"dom-append"}],"arity":1,"upvalue-count":5}}],"upvalue-count":6}}],"arity":3}}]}}
\ No newline at end of file
diff --git a/shared/static/wasm/sx/boot.sxbc b/shared/static/wasm/sx/boot.sxbc
deleted file mode 100644
index 373a23a5..00000000
--- a/shared/static/wasm/sx/boot.sxbc
+++ /dev/null
@@ -1,464 +0,0 @@
-(sxbc 1 "8dd29bf7bc354b48"
- (code
- :bytecode (1 1 0 128 0 0 5 51 3 0 128 2 0 5 51 5 0 128 4 0 5 51 7 0 128 6 0 5 51 9 0 128 8 0 5 51 11 0 128 10 0 5 51 13 0 128 12 0 5 51 15 0 128 14 0 5 51 17 0 128 16 0 5 52 19 0 0 128 18 0 5 51 21 0 128 20 0 5 51 23 0 128 22 0 5 51 25 0 128 24 0 5 51 27 0 128 26 0 5 51 29 0 128 28 0 5 51 31 0 128 30 0 5 52 19 0 0 128 32 0 5 52 19 0 0 128 33 0 5 51 35 0 128 34 0 5 51 37 0 128 36 0 5 51 39 0 128 38 0 5 51 41 0 128 40 0 5 51 43 0 128 42 0 50)
- :constants (
- "HEAD_HOIST_SELECTOR"
- "meta, title, link[rel='canonical'], script[type='application/ld+json']"
- "hoist-head-elements-full"
- (code :arity 1
- :bytecode (20 0 0 16 0 20 1 0 48 2 17 1 51 3 0 16 1 52 2 0 2 50)
- :constants (
- "dom-query-all"
- "HEAD_HOIST_SELECTOR"
- "for-each"
- (code :arity 1
- :bytecode (20 1 0 16 0 48 1 52 0 0 1 17 1 16 1 1 3 0 52 2 0 2 33 30 0 20 4 0 20 5 0 16 0 48 1 48 1 5 20 6 0 20 7 0 16 0 48 1 16 0 49 2 32 205 0 16 1 1 8 0 52 2 0 2 33 103 0 20 9 0 16 0 1 10 0 48 2 17 2 20 9 0 16 0 1 11 0 48 2 17 3 16 2 33 20 0 20 12 0 1 14 0 16 2 1 15 0 52 13 0 3 48 1 32 1 0 2 5 16 3 33 20 0 20 12 0 1 16 0 16 3 1 15 0 52 13 0 3 48 1 32 1 0 2 5 20 6 0 20 7 0 16 0 48 1 16 0 48 2 5 20 17 0 16 0 49 1 32 90 0 16 1 1 18 0 52 2 0 2 6 33 18 0 5 20 9 0 16 0 1 19 0 48 2 1 20 0 52 2 0 2 33 34 0 20 12 0 1 21 0 48 1 5 20 6 0 20 7 0 16 0 48 1 16 0 48 2 5 20 17 0 16 0 49 1 32 22 0 20 6 0 20 7 0 16 0 48 1 16 0 48 2 5 20 17 0 16 0 49 1 50)
- :constants (
- "lower"
- "dom-tag-name"
- "="
- "title"
- "set-document-title"
- "dom-text-content"
- "dom-remove-child"
- "dom-parent"
- "meta"
- "dom-get-attr"
- "name"
- "property"
- "remove-head-element"
- "str"
- "meta[name=\""
- "\"]"
- "meta[property=\""
- "dom-append-to-head"
- "link"
- "rel"
- "canonical"
- "link[rel=\"canonical\"]"))))
- "sx-mount"
- (code :arity 3
- :bytecode (20 0 0 16 0 48 1 17 3 16 3 33 90 0 20 2 0 16 3 48 1 52 1 0 1 33 42 0 20 3 0 16 1 16 2 48 2 17 4 20 4 0 16 3 1 5 0 48 2 5 20 6 0 16 3 16 4 48 2 5 20 7 0 16 3 48 1 32 1 0 2 5 20 8 0 16 3 48 1 5 20 9 0 16 3 48 1 5 20 10 0 16 3 48 1 5 20 11 0 49 0 32 1 0 2 50)
- :constants (
- "resolve-mount-target"
- "empty?"
- "dom-child-list"
- "sx-render-with-env"
- "dom-set-text-content"
- ""
- "dom-append"
- "hoist-head-elements-full"
- "process-elements"
- "sx-hydrate-elements"
- "sx-hydrate-islands"
- "run-post-render-hooks"))
- "resolve-suspense"
- (code :arity 2
- :bytecode (20 0 0 2 48 1 5 20 1 0 1 3 0 16 0 1 4 0 52 2 0 3 48 1 17 2 16 2 33 93 0 20 5 0 16 1 48 1 17 3 20 6 0 2 48 1 17 4 20 7 0 16 2 1 8 0 48 2 5 51 10 0 1 2 1 4 16 3 52 9 0 2 5 20 11 0 16 2 48 1 5 20 12 0 16 2 48 1 5 20 13 0 16 2 48 1 5 20 14 0 48 0 5 20 15 0 16 2 1 16 0 1 17 0 16 0 65 1 0 49 3 32 14 0 20 18 0 1 19 0 16 0 52 2 0 2 49 1 50)
- :constants (
- "process-sx-scripts"
- "dom-query"
- "str"
- "[data-suspense=\""
- "\"]"
- "parse"
- "get-render-env"
- "dom-set-text-content"
- ""
- "for-each"
- (code :arity 1 :upvalue-count 2
- :bytecode (20 0 0 18 0 20 1 0 16 0 18 1 2 48 3 49 2 50)
- :constants (
- "dom-append"
- "render-to-dom"))
- "process-elements"
- "sx-hydrate-elements"
- "sx-hydrate-islands"
- "run-post-render-hooks"
- "dom-dispatch"
- "sx:resolved"
- "id"
- "log-warn"
- "resolveSuspense: no element for id="))
- "sx-hydrate-elements"
- (code :arity 1
- :bytecode (20 0 0 16 0 6 34 6 0 5 20 1 0 48 0 1 2 0 48 2 17 1 51 4 0 16 1 52 3 0 2 50)
- :constants (
- "dom-query-all"
- "dom-body"
- "[data-sx]"
- "for-each"
- (code :arity 1
- :bytecode (20 1 0 16 0 1 2 0 48 2 52 0 0 1 33 22 0 20 3 0 16 0 1 2 0 48 2 5 20 4 0 16 0 2 49 2 32 1 0 2 50)
- :constants (
- "not"
- "is-processed?"
- "hydrated"
- "mark-processed!"
- "sx-update-element"))))
- "sx-update-element"
- (code :arity 2
- :bytecode (20 0 0 16 0 48 1 17 2 16 2 33 96 0 20 1 0 16 2 1 2 0 48 2 17 3 16 3 33 75 0 20 3 0 16 2 48 1 17 4 20 4 0 16 4 16 1 48 2 17 5 20 5 0 16 3 16 5 48 2 17 6 20 6 0 16 2 1 7 0 48 2 5 20 8 0 16 2 16 6 48 2 5 16 1 33 14 0 20 9 0 16 2 16 4 16 1 49 3 32 1 0 2 32 1 0 2 32 1 0 2 50)
- :constants (
- "resolve-mount-target"
- "dom-get-attr"
- "data-sx"
- "parse-env-attr"
- "merge-envs"
- "sx-render-with-env"
- "dom-set-text-content"
- ""
- "dom-append"
- "store-env-attr"))
- "sx-render-component"
- (code :arity 3
- :bytecode (16 0 1 1 0 52 0 0 2 33 5 0 16 0 32 9 0 1 1 0 16 0 52 2 0 2 17 3 20 3 0 16 2 48 1 17 4 20 4 0 16 4 16 3 48 2 17 5 16 5 52 6 0 1 52 5 0 1 33 16 0 1 8 0 16 3 52 2 0 2 52 7 0 1 32 40 0 16 3 52 10 0 1 52 9 0 1 17 6 51 12 0 1 6 1 1 16 1 52 13 0 1 52 11 0 2 5 20 14 0 16 6 16 4 2 49 3 50)
- :constants (
- "starts-with?"
- "~"
- "str"
- "get-render-env"
- "env-get"
- "not"
- "component?"
- "error"
- "Unknown component: "
- "list"
- "make-symbol"
- "for-each"
- (code :arity 1 :upvalue-count 2
- :bytecode (20 0 0 18 0 20 1 0 20 2 0 16 0 48 1 48 1 48 2 5 20 0 0 18 0 18 1 16 0 52 3 0 2 49 2 50)
- :constants (
- "append!"
- "make-keyword"
- "to-kebab"
- "dict-get"))
- "keys"
- "render-to-dom"))
- "process-sx-scripts"
- (code :arity 1
- :bytecode (20 0 0 16 0 48 1 17 1 51 2 0 16 1 52 1 0 2 50)
- :constants (
- "query-sx-scripts"
- "for-each"
- (code :arity 1
- :bytecode (20 1 0 16 0 1 2 0 48 2 52 0 0 1 33 173 0 20 3 0 16 0 1 2 0 48 2 5 20 4 0 16 0 48 1 17 1 20 5 0 16 0 1 6 0 48 2 33 12 0 20 7 0 16 0 16 1 49 2 32 125 0 16 1 52 8 0 1 6 34 11 0 5 16 1 52 10 0 1 52 9 0 1 33 4 0 2 32 97 0 20 5 0 16 0 1 11 0 48 2 33 21 0 20 12 0 16 1 48 1 17 2 51 14 0 16 2 52 13 0 2 32 63 0 20 5 0 16 0 1 15 0 48 2 33 43 0 20 16 0 16 0 1 15 0 48 2 17 2 20 17 0 16 2 48 1 17 3 16 3 33 13 0 20 18 0 16 3 16 1 2 49 3 32 1 0 2 32 7 0 20 19 0 16 1 49 1 32 1 0 2 50)
- :constants (
- "not"
- "is-processed?"
- "script"
- "mark-processed!"
- "dom-text-content"
- "dom-has-attr?"
- "data-components"
- "process-component-script"
- "nil?"
- "empty?"
- "trim"
- "data-init"
- "sx-parse"
- "for-each"
- (code :arity 1
- :bytecode (20 0 0 16 0 49 1 50)
- :constants (
- "cek-eval"))
- "data-mount"
- "dom-get-attr"
- "dom-query"
- "sx-mount"
- "sx-load-components"))))
- "process-component-script"
- (code :arity 2
- :bytecode (20 0 0 16 0 1 1 0 48 2 17 2 16 2 52 2 0 1 33 38 0 16 1 6 33 15 0 5 16 1 52 5 0 1 52 4 0 1 52 3 0 1 33 10 0 20 6 0 16 1 49 1 32 1 0 2 32 239 0 16 1 6 33 15 0 5 16 1 52 5 0 1 52 4 0 1 52 3 0 1 17 3 20 7 0 1 8 0 48 1 17 4 16 4 16 2 52 9 0 2 33 103 0 16 3 33 41 0 20 10 0 1 8 0 16 2 48 2 5 20 10 0 1 11 0 16 1 48 2 5 20 6 0 16 1 48 1 5 20 12 0 1 13 0 48 1 32 54 0 20 7 0 1 11 0 48 1 17 5 16 5 33 28 0 20 6 0 16 5 48 1 5 20 12 0 1 15 0 16 2 1 16 0 52 14 0 3 48 1 32 11 0 20 17 0 48 0 5 20 18 0 48 0 32 84 0 16 3 33 50 0 20 10 0 1 8 0 16 2 48 2 5 20 10 0 1 11 0 16 1 48 2 5 20 6 0 16 1 48 1 5 20 12 0 1 19 0 16 2 1 16 0 52 14 0 3 48 1 32 29 0 20 20 0 1 8 0 48 1 5 20 20 0 1 11 0 48 1 5 20 17 0 48 0 5 20 18 0 48 0 5 20 21 0 16 2 49 1 50)
- :constants (
- "dom-get-attr"
- "data-hash"
- "nil?"
- "not"
- "empty?"
- "trim"
- "sx-load-components"
- "local-storage-get"
- "sx-components-hash"
- "="
- "local-storage-set"
- "sx-components-src"
- "log-info"
- "components: downloaded (cookie stale)"
- "str"
- "components: cached ("
- ")"
- "clear-sx-comp-cookie"
- "browser-reload"
- "components: downloaded ("
- "local-storage-remove"
- "set-sx-comp-cookie"))
- "_page-routes"
- "list"
- "process-page-scripts"
- (code
- :bytecode (20 0 0 48 0 17 0 20 1 0 1 3 0 16 0 52 4 0 1 1 5 0 52 2 0 3 48 1 5 51 7 0 16 0 52 6 0 2 5 20 1 0 1 8 0 20 9 0 52 4 0 1 1 10 0 52 2 0 3 49 1 50)
- :constants (
- "query-page-scripts"
- "log-info"
- "str"
- "pages: found "
- "len"
- " script tags"
- "for-each"
- (code :arity 1
- :bytecode (20 1 0 16 0 1 2 0 48 2 52 0 0 1 33 128 0 20 3 0 16 0 1 2 0 48 2 5 20 4 0 16 0 48 1 17 1 20 5 0 1 7 0 16 1 33 9 0 16 1 52 8 0 1 32 3 0 1 9 0 52 6 0 2 48 1 5 16 1 6 33 15 0 5 16 1 52 11 0 1 52 10 0 1 52 0 0 1 33 43 0 20 12 0 16 1 48 1 17 2 20 5 0 1 13 0 16 2 52 8 0 1 1 14 0 52 6 0 3 48 1 5 51 16 0 16 2 52 15 0 2 32 8 0 20 17 0 1 18 0 49 1 32 1 0 2 50)
- :constants (
- "not"
- "is-processed?"
- "pages"
- "mark-processed!"
- "dom-text-content"
- "log-info"
- "str"
- "pages: script text length="
- "len"
- 0
- "empty?"
- "trim"
- "parse"
- "pages: parsed "
- " entries"
- "for-each"
- (code :arity 1
- :bytecode (20 0 0 20 1 0 16 0 1 3 0 20 4 0 16 0 1 6 0 52 5 0 2 48 1 65 1 0 52 2 0 2 49 2 50)
- :constants (
- "append!"
- "_page-routes"
- "merge"
- "parsed"
- "parse-route-pattern"
- "get"
- "path"))
- "log-warn"
- "pages: script tag is empty"))
- "pages: "
- "_page-routes"
- " routes loaded"))
- "sx-hydrate-islands"
- (code :arity 1
- :bytecode (20 0 0 16 0 6 34 6 0 5 20 1 0 48 0 1 2 0 48 2 17 1 20 3 0 1 5 0 16 1 52 6 0 1 1 7 0 16 0 33 6 0 1 8 0 32 3 0 1 9 0 52 4 0 4 48 1 5 51 11 0 16 1 52 10 0 2 50)
- :constants (
- "dom-query-all"
- "dom-body"
- "[data-sx-island]"
- "log-info"
- "str"
- "sx-hydrate-islands: "
- "len"
- " island(s) in "
- "subtree"
- "document"
- "for-each"
- (code :arity 1
- :bytecode (20 0 0 16 0 1 1 0 48 2 33 25 0 20 2 0 1 4 0 20 5 0 16 0 1 6 0 48 2 52 3 0 2 49 1 32 41 0 20 2 0 1 7 0 20 5 0 16 0 1 6 0 48 2 52 3 0 2 48 1 5 20 8 0 16 0 1 1 0 48 2 5 20 9 0 16 0 49 1 50)
- :constants (
- "is-processed?"
- "island-hydrated"
- "log-info"
- "str"
- " skip (already hydrated): "
- "dom-get-attr"
- "data-sx-island"
- " hydrating: "
- "mark-processed!"
- "hydrate-island"))))
- "hydrate-island"
- (code :arity 1
- :bytecode (20 0 0 16 0 1 1 0 48 2 17 1 20 0 0 16 0 1 2 0 48 2 6 34 4 0 5 1 3 0 17 2 1 5 0 16 1 52 4 0 2 17 3 20 6 0 2 48 1 17 4 20 7 0 16 4 16 3 48 2 17 5 16 5 52 9 0 1 6 34 7 0 5 16 5 52 10 0 1 52 8 0 1 33 17 0 20 11 0 1 12 0 16 3 52 4 0 2 49 1 32 149 0 20 14 0 16 2 48 1 52 13 0 1 6 34 4 0 5 65 0 0 17 6 52 15 0 0 17 7 20 16 0 16 5 52 17 0 1 16 4 48 2 17 8 51 19 0 1 8 1 6 16 5 52 20 0 1 52 18 0 2 5 20 21 0 51 22 0 1 7 1 5 1 8 51 23 0 1 3 48 2 17 9 20 24 0 16 0 1 25 0 48 2 5 20 26 0 16 0 16 9 48 2 5 20 27 0 16 0 1 28 0 16 7 48 3 5 20 29 0 16 0 48 1 5 20 30 0 1 31 0 16 3 1 32 0 16 7 52 33 0 1 1 34 0 52 4 0 5 49 1 50)
- :constants (
- "dom-get-attr"
- "data-sx-island"
- "data-sx-state"
- "{}"
- "str"
- "~"
- "get-render-env"
- "env-get"
- "not"
- "component?"
- "island?"
- "log-warn"
- "hydrate-island: unknown island "
- "first"
- "sx-parse"
- "list"
- "env-merge"
- "component-closure"
- "for-each"
- (code :arity 1 :upvalue-count 2
- :bytecode (20 0 0 18 0 16 0 18 1 16 0 52 1 0 2 33 11 0 18 1 16 0 52 2 0 2 32 1 0 2 49 3 50)
- :constants (
- "env-bind!"
- "dict-has?"
- "dict-get"))
- "component-params"
- "cek-try"
- (code :upvalue-count 3
- :bytecode (20 0 0 51 1 0 0 0 51 2 0 0 1 0 2 49 2 50)
- :constants (
- "with-island-scope"
- (code :arity 1 :upvalue-count 1
- :bytecode (20 0 0 18 0 16 0 49 2 50)
- :constants (
- "append!"))
- (code :upvalue-count 2
- :bytecode (20 0 0 18 0 52 1 0 1 18 1 2 49 3 50)
- :constants (
- "render-to-dom"
- "component-body"))))
- (code :arity 1 :upvalue-count 1
- :bytecode (20 0 0 1 2 0 18 0 1 3 0 16 0 52 1 0 4 48 1 5 20 4 0 1 5 0 2 48 2 17 1 20 6 0 16 1 1 7 0 1 8 0 48 3 5 20 6 0 16 1 1 9 0 1 10 0 48 3 5 20 11 0 16 1 1 12 0 18 0 1 13 0 16 0 52 1 0 4 48 2 5 16 1 50)
- :constants (
- "log-warn"
- "str"
- "hydrate-island FAILED: "
- " — "
- "dom-create-element"
- "div"
- "dom-set-attr"
- "class"
- "sx-island-error"
- "style"
- "padding:8px;margin:4px 0;border:1px solid #ef4444;border-radius:4px;background:#fef2f2;color:#b91c1c;font-family:monospace;font-size:12px;white-space:pre-wrap"
- "dom-set-text-content"
- "Island error: "
- "
-"))
- "dom-set-text-content"
- ""
- "dom-append"
- "dom-set-data"
- "sx-disposers"
- "process-elements"
- "log-info"
- "hydrated island: "
- " ("
- "len"
- " disposers)"))
- "dispose-island"
- (code :arity 1
- :bytecode (20 0 0 16 0 1 1 0 48 2 17 1 16 1 33 24 0 51 3 0 16 1 52 2 0 2 5 20 4 0 16 0 1 1 0 2 48 3 32 1 0 2 5 20 5 0 16 0 1 6 0 49 2 50)
- :constants (
- "dom-get-data"
- "sx-disposers"
- "for-each"
- (code :arity 1
- :bytecode (20 0 0 16 0 48 1 33 7 0 16 0 49 0 32 1 0 2 50)
- :constants (
- "callable?"))
- "dom-set-data"
- "clear-processed!"
- "island-hydrated"))
- "dispose-islands-in"
- (code :arity 1
- :bytecode (16 0 33 98 0 20 0 0 16 0 1 1 0 48 2 17 1 16 1 6 33 11 0 5 16 1 52 3 0 1 52 2 0 1 33 62 0 51 5 0 16 1 52 4 0 2 17 2 16 2 52 3 0 1 52 2 0 1 33 34 0 20 6 0 1 8 0 16 2 52 9 0 1 1 10 0 52 7 0 3 48 1 5 20 12 0 16 2 52 11 0 2 32 1 0 2 32 1 0 2 32 1 0 2 50)
- :constants (
- "dom-query-all"
- "[data-sx-island]"
- "not"
- "empty?"
- "filter"
- (code :arity 1
- :bytecode (20 1 0 16 0 1 2 0 48 2 52 0 0 1 50)
- :constants (
- "not"
- "is-processed?"
- "island-hydrated"))
- "log-info"
- "str"
- "disposing "
- "len"
- " island(s)"
- "for-each"
- "dispose-island"))
- "force-dispose-islands-in"
- (code :arity 1
- :bytecode (16 0 33 70 0 20 0 0 16 0 1 1 0 48 2 17 1 16 1 6 33 11 0 5 16 1 52 3 0 1 52 2 0 1 33 34 0 20 4 0 1 6 0 16 1 52 7 0 1 1 8 0 52 5 0 3 48 1 5 20 10 0 16 1 52 9 0 2 32 1 0 2 32 1 0 2 50)
- :constants (
- "dom-query-all"
- "[data-sx-island]"
- "not"
- "empty?"
- "log-info"
- "str"
- "force-disposing "
- "len"
- " island(s)"
- "for-each"
- "dispose-island"))
- "*pre-render-hooks*"
- "*post-render-hooks*"
- "register-pre-render-hook"
- (code :arity 1
- :bytecode (20 0 0 20 1 0 16 0 49 2 50)
- :constants (
- "append!"
- "*pre-render-hooks*"))
- "register-post-render-hook"
- (code :arity 1
- :bytecode (20 0 0 20 1 0 16 0 49 2 50)
- :constants (
- "append!"
- "*post-render-hooks*"))
- "run-pre-render-hooks"
- (code
- :bytecode (51 1 0 20 2 0 52 0 0 2 50)
- :constants (
- "for-each"
- (code :arity 1
- :bytecode (20 0 0 16 0 2 49 2 50)
- :constants (
- "cek-call"))
- "*pre-render-hooks*"))
- "run-post-render-hooks"
- (code
- :bytecode (20 0 0 1 2 0 20 4 0 52 3 0 1 1 5 0 52 1 0 3 48 1 5 51 7 0 20 4 0 52 6 0 2 50)
- :constants (
- "log-info"
- "str"
- "run-post-render-hooks: "
- "len"
- "*post-render-hooks*"
- " hooks"
- "for-each"
- (code :arity 1
- :bytecode (20 0 0 1 2 0 16 0 52 3 0 1 1 4 0 20 5 0 16 0 48 1 1 6 0 16 0 52 7 0 1 52 1 0 6 48 1 5 20 8 0 16 0 2 49 2 50)
- :constants (
- "log-info"
- "str"
- " hook type: "
- "type-of"
- " callable: "
- "callable?"
- " lambda: "
- "lambda?"
- "cek-call"))))
- "boot-init"
- (code
- :bytecode (20 0 0 1 2 0 20 3 0 52 1 0 2 48 1 5 20 4 0 48 0 5 20 5 0 48 0 5 20 6 0 2 48 1 5 20 7 0 2 48 1 5 20 8 0 2 48 1 5 20 9 0 48 0 5 20 10 0 2 48 1 5 20 11 0 20 12 0 48 0 1 13 0 51 14 0 49 3 50)
- :constants (
- "log-info"
- "str"
- "sx-browser "
- "SX_VERSION"
- "init-css-tracking"
- "process-page-scripts"
- "process-sx-scripts"
- "sx-hydrate-elements"
- "sx-hydrate-islands"
- "run-post-render-hooks"
- "process-elements"
- "dom-listen"
- "dom-window"
- "popstate"
- (code :arity 1
- :bytecode (20 0 0 1 1 0 49 1 50)
- :constants (
- "handle-popstate"
- 0)))))))
diff --git a/shared/static/wasm/sx/boot.sxbc.json b/shared/static/wasm/sx/boot.sxbc.json
deleted file mode 100644
index 83f4805a..00000000
--- a/shared/static/wasm/sx/boot.sxbc.json
+++ /dev/null
@@ -1 +0,0 @@
-{"magic":"SXBC","version":1,"hash":"8dd29bf7bc354b48","module":{"bytecode":[1,1,0,128,0,0,5,51,3,0,128,2,0,5,51,5,0,128,4,0,5,51,7,0,128,6,0,5,51,9,0,128,8,0,5,51,11,0,128,10,0,5,51,13,0,128,12,0,5,51,15,0,128,14,0,5,51,17,0,128,16,0,5,52,19,0,0,128,18,0,5,51,21,0,128,20,0,5,51,23,0,128,22,0,5,51,25,0,128,24,0,5,51,27,0,128,26,0,5,51,29,0,128,28,0,5,51,31,0,128,30,0,5,52,19,0,0,128,32,0,5,52,19,0,0,128,33,0,5,51,35,0,128,34,0,5,51,37,0,128,36,0,5,51,39,0,128,38,0,5,51,41,0,128,40,0,5,51,43,0,128,42,0,50],"constants":[{"t":"s","v":"HEAD_HOIST_SELECTOR"},{"t":"s","v":"meta, title, link[rel='canonical'], script[type='application/ld+json']"},{"t":"s","v":"hoist-head-elements-full"},{"t":"code","v":{"bytecode":[20,0,0,16,0,20,1,0,48,2,17,1,51,3,0,16,1,52,2,0,2,50],"constants":[{"t":"s","v":"dom-query-all"},{"t":"s","v":"HEAD_HOIST_SELECTOR"},{"t":"s","v":"for-each"},{"t":"code","v":{"bytecode":[20,1,0,16,0,48,1,52,0,0,1,17,1,16,1,1,3,0,52,2,0,2,33,30,0,20,4,0,20,5,0,16,0,48,1,48,1,5,20,6,0,20,7,0,16,0,48,1,16,0,49,2,32,205,0,16,1,1,8,0,52,2,0,2,33,103,0,20,9,0,16,0,1,10,0,48,2,17,2,20,9,0,16,0,1,11,0,48,2,17,3,16,2,33,20,0,20,12,0,1,14,0,16,2,1,15,0,52,13,0,3,48,1,32,1,0,2,5,16,3,33,20,0,20,12,0,1,16,0,16,3,1,15,0,52,13,0,3,48,1,32,1,0,2,5,20,6,0,20,7,0,16,0,48,1,16,0,48,2,5,20,17,0,16,0,49,1,32,90,0,16,1,1,18,0,52,2,0,2,6,33,18,0,5,20,9,0,16,0,1,19,0,48,2,1,20,0,52,2,0,2,33,34,0,20,12,0,1,21,0,48,1,5,20,6,0,20,7,0,16,0,48,1,16,0,48,2,5,20,17,0,16,0,49,1,32,22,0,20,6,0,20,7,0,16,0,48,1,16,0,48,2,5,20,17,0,16,0,49,1,50],"constants":[{"t":"s","v":"lower"},{"t":"s","v":"dom-tag-name"},{"t":"s","v":"="},{"t":"s","v":"title"},{"t":"s","v":"set-document-title"},{"t":"s","v":"dom-text-content"},{"t":"s","v":"dom-remove-child"},{"t":"s","v":"dom-parent"},{"t":"s","v":"meta"},{"t":"s","v":"dom-get-attr"},{"t":"s","v":"name"},{"t":"s","v":"property"},{"t":"s","v":"remove-head-element"},{"t":"s","v":"str"},{"t":"s","v":"meta[name=\""},{"t":"s","v":"\"]"},{"t":"s","v":"meta[property=\""},{"t":"s","v":"dom-append-to-head"},{"t":"s","v":"link"},{"t":"s","v":"rel"},{"t":"s","v":"canonical"},{"t":"s","v":"link[rel=\"canonical\"]"}],"arity":1}}],"arity":1}},{"t":"s","v":"sx-mount"},{"t":"code","v":{"bytecode":[20,0,0,16,0,48,1,17,3,16,3,33,90,0,20,2,0,16,3,48,1,52,1,0,1,33,42,0,20,3,0,16,1,16,2,48,2,17,4,20,4,0,16,3,1,5,0,48,2,5,20,6,0,16,3,16,4,48,2,5,20,7,0,16,3,48,1,32,1,0,2,5,20,8,0,16,3,48,1,5,20,9,0,16,3,48,1,5,20,10,0,16,3,48,1,5,20,11,0,49,0,32,1,0,2,50],"constants":[{"t":"s","v":"resolve-mount-target"},{"t":"s","v":"empty?"},{"t":"s","v":"dom-child-list"},{"t":"s","v":"sx-render-with-env"},{"t":"s","v":"dom-set-text-content"},{"t":"s","v":""},{"t":"s","v":"dom-append"},{"t":"s","v":"hoist-head-elements-full"},{"t":"s","v":"process-elements"},{"t":"s","v":"sx-hydrate-elements"},{"t":"s","v":"sx-hydrate-islands"},{"t":"s","v":"run-post-render-hooks"}],"arity":3}},{"t":"s","v":"resolve-suspense"},{"t":"code","v":{"bytecode":[20,0,0,2,48,1,5,20,1,0,1,3,0,16,0,1,4,0,52,2,0,3,48,1,17,2,16,2,33,93,0,20,5,0,16,1,48,1,17,3,20,6,0,2,48,1,17,4,20,7,0,16,2,1,8,0,48,2,5,51,10,0,1,2,1,4,16,3,52,9,0,2,5,20,11,0,16,2,48,1,5,20,12,0,16,2,48,1,5,20,13,0,16,2,48,1,5,20,14,0,48,0,5,20,15,0,16,2,1,16,0,1,17,0,16,0,65,1,0,49,3,32,14,0,20,18,0,1,19,0,16,0,52,2,0,2,49,1,50],"constants":[{"t":"s","v":"process-sx-scripts"},{"t":"s","v":"dom-query"},{"t":"s","v":"str"},{"t":"s","v":"[data-suspense=\""},{"t":"s","v":"\"]"},{"t":"s","v":"parse"},{"t":"s","v":"get-render-env"},{"t":"s","v":"dom-set-text-content"},{"t":"s","v":""},{"t":"s","v":"for-each"},{"t":"code","v":{"bytecode":[20,0,0,18,0,20,1,0,16,0,18,1,2,48,3,49,2,50],"constants":[{"t":"s","v":"dom-append"},{"t":"s","v":"render-to-dom"}],"arity":1,"upvalue-count":2}},{"t":"s","v":"process-elements"},{"t":"s","v":"sx-hydrate-elements"},{"t":"s","v":"sx-hydrate-islands"},{"t":"s","v":"run-post-render-hooks"},{"t":"s","v":"dom-dispatch"},{"t":"s","v":"sx:resolved"},{"t":"s","v":"id"},{"t":"s","v":"log-warn"},{"t":"s","v":"resolveSuspense: no element for id="}],"arity":2}},{"t":"s","v":"sx-hydrate-elements"},{"t":"code","v":{"bytecode":[20,0,0,16,0,6,34,6,0,5,20,1,0,48,0,1,2,0,48,2,17,1,51,4,0,16,1,52,3,0,2,50],"constants":[{"t":"s","v":"dom-query-all"},{"t":"s","v":"dom-body"},{"t":"s","v":"[data-sx]"},{"t":"s","v":"for-each"},{"t":"code","v":{"bytecode":[20,1,0,16,0,1,2,0,48,2,52,0,0,1,33,22,0,20,3,0,16,0,1,2,0,48,2,5,20,4,0,16,0,2,49,2,32,1,0,2,50],"constants":[{"t":"s","v":"not"},{"t":"s","v":"is-processed?"},{"t":"s","v":"hydrated"},{"t":"s","v":"mark-processed!"},{"t":"s","v":"sx-update-element"}],"arity":1}}],"arity":1}},{"t":"s","v":"sx-update-element"},{"t":"code","v":{"bytecode":[20,0,0,16,0,48,1,17,2,16,2,33,96,0,20,1,0,16,2,1,2,0,48,2,17,3,16,3,33,75,0,20,3,0,16,2,48,1,17,4,20,4,0,16,4,16,1,48,2,17,5,20,5,0,16,3,16,5,48,2,17,6,20,6,0,16,2,1,7,0,48,2,5,20,8,0,16,2,16,6,48,2,5,16,1,33,14,0,20,9,0,16,2,16,4,16,1,49,3,32,1,0,2,32,1,0,2,32,1,0,2,50],"constants":[{"t":"s","v":"resolve-mount-target"},{"t":"s","v":"dom-get-attr"},{"t":"s","v":"data-sx"},{"t":"s","v":"parse-env-attr"},{"t":"s","v":"merge-envs"},{"t":"s","v":"sx-render-with-env"},{"t":"s","v":"dom-set-text-content"},{"t":"s","v":""},{"t":"s","v":"dom-append"},{"t":"s","v":"store-env-attr"}],"arity":2}},{"t":"s","v":"sx-render-component"},{"t":"code","v":{"bytecode":[16,0,1,1,0,52,0,0,2,33,5,0,16,0,32,9,0,1,1,0,16,0,52,2,0,2,17,3,20,3,0,16,2,48,1,17,4,20,4,0,16,4,16,3,48,2,17,5,16,5,52,6,0,1,52,5,0,1,33,16,0,1,8,0,16,3,52,2,0,2,52,7,0,1,32,40,0,16,3,52,10,0,1,52,9,0,1,17,6,51,12,0,1,6,1,1,16,1,52,13,0,1,52,11,0,2,5,20,14,0,16,6,16,4,2,49,3,50],"constants":[{"t":"s","v":"starts-with?"},{"t":"s","v":"~"},{"t":"s","v":"str"},{"t":"s","v":"get-render-env"},{"t":"s","v":"env-get"},{"t":"s","v":"not"},{"t":"s","v":"component?"},{"t":"s","v":"error"},{"t":"s","v":"Unknown component: "},{"t":"s","v":"list"},{"t":"s","v":"make-symbol"},{"t":"s","v":"for-each"},{"t":"code","v":{"bytecode":[20,0,0,18,0,20,1,0,20,2,0,16,0,48,1,48,1,48,2,5,20,0,0,18,0,18,1,16,0,52,3,0,2,49,2,50],"constants":[{"t":"s","v":"append!"},{"t":"s","v":"make-keyword"},{"t":"s","v":"to-kebab"},{"t":"s","v":"dict-get"}],"arity":1,"upvalue-count":2}},{"t":"s","v":"keys"},{"t":"s","v":"render-to-dom"}],"arity":3}},{"t":"s","v":"process-sx-scripts"},{"t":"code","v":{"bytecode":[20,0,0,16,0,48,1,17,1,51,2,0,16,1,52,1,0,2,50],"constants":[{"t":"s","v":"query-sx-scripts"},{"t":"s","v":"for-each"},{"t":"code","v":{"bytecode":[20,1,0,16,0,1,2,0,48,2,52,0,0,1,33,173,0,20,3,0,16,0,1,2,0,48,2,5,20,4,0,16,0,48,1,17,1,20,5,0,16,0,1,6,0,48,2,33,12,0,20,7,0,16,0,16,1,49,2,32,125,0,16,1,52,8,0,1,6,34,11,0,5,16,1,52,10,0,1,52,9,0,1,33,4,0,2,32,97,0,20,5,0,16,0,1,11,0,48,2,33,21,0,20,12,0,16,1,48,1,17,2,51,14,0,16,2,52,13,0,2,32,63,0,20,5,0,16,0,1,15,0,48,2,33,43,0,20,16,0,16,0,1,15,0,48,2,17,2,20,17,0,16,2,48,1,17,3,16,3,33,13,0,20,18,0,16,3,16,1,2,49,3,32,1,0,2,32,7,0,20,19,0,16,1,49,1,32,1,0,2,50],"constants":[{"t":"s","v":"not"},{"t":"s","v":"is-processed?"},{"t":"s","v":"script"},{"t":"s","v":"mark-processed!"},{"t":"s","v":"dom-text-content"},{"t":"s","v":"dom-has-attr?"},{"t":"s","v":"data-components"},{"t":"s","v":"process-component-script"},{"t":"s","v":"nil?"},{"t":"s","v":"empty?"},{"t":"s","v":"trim"},{"t":"s","v":"data-init"},{"t":"s","v":"sx-parse"},{"t":"s","v":"for-each"},{"t":"code","v":{"bytecode":[20,0,0,16,0,49,1,50],"constants":[{"t":"s","v":"cek-eval"}],"arity":1}},{"t":"s","v":"data-mount"},{"t":"s","v":"dom-get-attr"},{"t":"s","v":"dom-query"},{"t":"s","v":"sx-mount"},{"t":"s","v":"sx-load-components"}],"arity":1}}],"arity":1}},{"t":"s","v":"process-component-script"},{"t":"code","v":{"bytecode":[20,0,0,16,0,1,1,0,48,2,17,2,16,2,52,2,0,1,33,38,0,16,1,6,33,15,0,5,16,1,52,5,0,1,52,4,0,1,52,3,0,1,33,10,0,20,6,0,16,1,49,1,32,1,0,2,32,239,0,16,1,6,33,15,0,5,16,1,52,5,0,1,52,4,0,1,52,3,0,1,17,3,20,7,0,1,8,0,48,1,17,4,16,4,16,2,52,9,0,2,33,103,0,16,3,33,41,0,20,10,0,1,8,0,16,2,48,2,5,20,10,0,1,11,0,16,1,48,2,5,20,6,0,16,1,48,1,5,20,12,0,1,13,0,48,1,32,54,0,20,7,0,1,11,0,48,1,17,5,16,5,33,28,0,20,6,0,16,5,48,1,5,20,12,0,1,15,0,16,2,1,16,0,52,14,0,3,48,1,32,11,0,20,17,0,48,0,5,20,18,0,48,0,32,84,0,16,3,33,50,0,20,10,0,1,8,0,16,2,48,2,5,20,10,0,1,11,0,16,1,48,2,5,20,6,0,16,1,48,1,5,20,12,0,1,19,0,16,2,1,16,0,52,14,0,3,48,1,32,29,0,20,20,0,1,8,0,48,1,5,20,20,0,1,11,0,48,1,5,20,17,0,48,0,5,20,18,0,48,0,5,20,21,0,16,2,49,1,50],"constants":[{"t":"s","v":"dom-get-attr"},{"t":"s","v":"data-hash"},{"t":"s","v":"nil?"},{"t":"s","v":"not"},{"t":"s","v":"empty?"},{"t":"s","v":"trim"},{"t":"s","v":"sx-load-components"},{"t":"s","v":"local-storage-get"},{"t":"s","v":"sx-components-hash"},{"t":"s","v":"="},{"t":"s","v":"local-storage-set"},{"t":"s","v":"sx-components-src"},{"t":"s","v":"log-info"},{"t":"s","v":"components: downloaded (cookie stale)"},{"t":"s","v":"str"},{"t":"s","v":"components: cached ("},{"t":"s","v":")"},{"t":"s","v":"clear-sx-comp-cookie"},{"t":"s","v":"browser-reload"},{"t":"s","v":"components: downloaded ("},{"t":"s","v":"local-storage-remove"},{"t":"s","v":"set-sx-comp-cookie"}],"arity":2}},{"t":"s","v":"_page-routes"},{"t":"s","v":"list"},{"t":"s","v":"process-page-scripts"},{"t":"code","v":{"bytecode":[20,0,0,48,0,17,0,20,1,0,1,3,0,16,0,52,4,0,1,1,5,0,52,2,0,3,48,1,5,51,7,0,16,0,52,6,0,2,5,20,1,0,1,8,0,20,9,0,52,4,0,1,1,10,0,52,2,0,3,49,1,50],"constants":[{"t":"s","v":"query-page-scripts"},{"t":"s","v":"log-info"},{"t":"s","v":"str"},{"t":"s","v":"pages: found "},{"t":"s","v":"len"},{"t":"s","v":" script tags"},{"t":"s","v":"for-each"},{"t":"code","v":{"bytecode":[20,1,0,16,0,1,2,0,48,2,52,0,0,1,33,128,0,20,3,0,16,0,1,2,0,48,2,5,20,4,0,16,0,48,1,17,1,20,5,0,1,7,0,16,1,33,9,0,16,1,52,8,0,1,32,3,0,1,9,0,52,6,0,2,48,1,5,16,1,6,33,15,0,5,16,1,52,11,0,1,52,10,0,1,52,0,0,1,33,43,0,20,12,0,16,1,48,1,17,2,20,5,0,1,13,0,16,2,52,8,0,1,1,14,0,52,6,0,3,48,1,5,51,16,0,16,2,52,15,0,2,32,8,0,20,17,0,1,18,0,49,1,32,1,0,2,50],"constants":[{"t":"s","v":"not"},{"t":"s","v":"is-processed?"},{"t":"s","v":"pages"},{"t":"s","v":"mark-processed!"},{"t":"s","v":"dom-text-content"},{"t":"s","v":"log-info"},{"t":"s","v":"str"},{"t":"s","v":"pages: script text length="},{"t":"s","v":"len"},{"t":"n","v":0},{"t":"s","v":"empty?"},{"t":"s","v":"trim"},{"t":"s","v":"parse"},{"t":"s","v":"pages: parsed "},{"t":"s","v":" entries"},{"t":"s","v":"for-each"},{"t":"code","v":{"bytecode":[20,0,0,20,1,0,16,0,1,3,0,20,4,0,16,0,1,6,0,52,5,0,2,48,1,65,1,0,52,2,0,2,49,2,50],"constants":[{"t":"s","v":"append!"},{"t":"s","v":"_page-routes"},{"t":"s","v":"merge"},{"t":"s","v":"parsed"},{"t":"s","v":"parse-route-pattern"},{"t":"s","v":"get"},{"t":"s","v":"path"}],"arity":1}},{"t":"s","v":"log-warn"},{"t":"s","v":"pages: script tag is empty"}],"arity":1}},{"t":"s","v":"pages: "},{"t":"s","v":"_page-routes"},{"t":"s","v":" routes loaded"}]}},{"t":"s","v":"sx-hydrate-islands"},{"t":"code","v":{"bytecode":[20,0,0,16,0,6,34,6,0,5,20,1,0,48,0,1,2,0,48,2,17,1,20,3,0,1,5,0,16,1,52,6,0,1,1,7,0,16,0,33,6,0,1,8,0,32,3,0,1,9,0,52,4,0,4,48,1,5,51,11,0,16,1,52,10,0,2,50],"constants":[{"t":"s","v":"dom-query-all"},{"t":"s","v":"dom-body"},{"t":"s","v":"[data-sx-island]"},{"t":"s","v":"log-info"},{"t":"s","v":"str"},{"t":"s","v":"sx-hydrate-islands: "},{"t":"s","v":"len"},{"t":"s","v":" island(s) in "},{"t":"s","v":"subtree"},{"t":"s","v":"document"},{"t":"s","v":"for-each"},{"t":"code","v":{"bytecode":[20,0,0,16,0,1,1,0,48,2,33,25,0,20,2,0,1,4,0,20,5,0,16,0,1,6,0,48,2,52,3,0,2,49,1,32,41,0,20,2,0,1,7,0,20,5,0,16,0,1,6,0,48,2,52,3,0,2,48,1,5,20,8,0,16,0,1,1,0,48,2,5,20,9,0,16,0,49,1,50],"constants":[{"t":"s","v":"is-processed?"},{"t":"s","v":"island-hydrated"},{"t":"s","v":"log-info"},{"t":"s","v":"str"},{"t":"s","v":" skip (already hydrated): "},{"t":"s","v":"dom-get-attr"},{"t":"s","v":"data-sx-island"},{"t":"s","v":" hydrating: "},{"t":"s","v":"mark-processed!"},{"t":"s","v":"hydrate-island"}],"arity":1}}],"arity":1}},{"t":"s","v":"hydrate-island"},{"t":"code","v":{"bytecode":[20,0,0,16,0,1,1,0,48,2,17,1,20,0,0,16,0,1,2,0,48,2,6,34,4,0,5,1,3,0,17,2,1,5,0,16,1,52,4,0,2,17,3,20,6,0,2,48,1,17,4,20,7,0,16,4,16,3,48,2,17,5,16,5,52,9,0,1,6,34,7,0,5,16,5,52,10,0,1,52,8,0,1,33,17,0,20,11,0,1,12,0,16,3,52,4,0,2,49,1,32,149,0,20,14,0,16,2,48,1,52,13,0,1,6,34,4,0,5,65,0,0,17,6,52,15,0,0,17,7,20,16,0,16,5,52,17,0,1,16,4,48,2,17,8,51,19,0,1,8,1,6,16,5,52,20,0,1,52,18,0,2,5,20,21,0,51,22,0,1,7,1,5,1,8,51,23,0,1,3,48,2,17,9,20,24,0,16,0,1,25,0,48,2,5,20,26,0,16,0,16,9,48,2,5,20,27,0,16,0,1,28,0,16,7,48,3,5,20,29,0,16,0,48,1,5,20,30,0,1,31,0,16,3,1,32,0,16,7,52,33,0,1,1,34,0,52,4,0,5,49,1,50],"constants":[{"t":"s","v":"dom-get-attr"},{"t":"s","v":"data-sx-island"},{"t":"s","v":"data-sx-state"},{"t":"s","v":"{}"},{"t":"s","v":"str"},{"t":"s","v":"~"},{"t":"s","v":"get-render-env"},{"t":"s","v":"env-get"},{"t":"s","v":"not"},{"t":"s","v":"component?"},{"t":"s","v":"island?"},{"t":"s","v":"log-warn"},{"t":"s","v":"hydrate-island: unknown island "},{"t":"s","v":"first"},{"t":"s","v":"sx-parse"},{"t":"s","v":"list"},{"t":"s","v":"env-merge"},{"t":"s","v":"component-closure"},{"t":"s","v":"for-each"},{"t":"code","v":{"bytecode":[20,0,0,18,0,16,0,18,1,16,0,52,1,0,2,33,11,0,18,1,16,0,52,2,0,2,32,1,0,2,49,3,50],"constants":[{"t":"s","v":"env-bind!"},{"t":"s","v":"dict-has?"},{"t":"s","v":"dict-get"}],"arity":1,"upvalue-count":2}},{"t":"s","v":"component-params"},{"t":"s","v":"cek-try"},{"t":"code","v":{"bytecode":[20,0,0,51,1,0,0,0,51,2,0,0,1,0,2,49,2,50],"constants":[{"t":"s","v":"with-island-scope"},{"t":"code","v":{"bytecode":[20,0,0,18,0,16,0,49,2,50],"constants":[{"t":"s","v":"append!"}],"arity":1,"upvalue-count":1}},{"t":"code","v":{"bytecode":[20,0,0,18,0,52,1,0,1,18,1,2,49,3,50],"constants":[{"t":"s","v":"render-to-dom"},{"t":"s","v":"component-body"}],"upvalue-count":2}}],"upvalue-count":3}},{"t":"code","v":{"bytecode":[20,0,0,1,2,0,18,0,1,3,0,16,0,52,1,0,4,48,1,5,20,4,0,1,5,0,2,48,2,17,1,20,6,0,16,1,1,7,0,1,8,0,48,3,5,20,6,0,16,1,1,9,0,1,10,0,48,3,5,20,11,0,16,1,1,12,0,18,0,1,13,0,16,0,52,1,0,4,48,2,5,16,1,50],"constants":[{"t":"s","v":"log-warn"},{"t":"s","v":"str"},{"t":"s","v":"hydrate-island FAILED: "},{"t":"s","v":" — "},{"t":"s","v":"dom-create-element"},{"t":"s","v":"div"},{"t":"s","v":"dom-set-attr"},{"t":"s","v":"class"},{"t":"s","v":"sx-island-error"},{"t":"s","v":"style"},{"t":"s","v":"padding:8px;margin:4px 0;border:1px solid #ef4444;border-radius:4px;background:#fef2f2;color:#b91c1c;font-family:monospace;font-size:12px;white-space:pre-wrap"},{"t":"s","v":"dom-set-text-content"},{"t":"s","v":"Island error: "},{"t":"s","v":"\n"}],"arity":1,"upvalue-count":1}},{"t":"s","v":"dom-set-text-content"},{"t":"s","v":""},{"t":"s","v":"dom-append"},{"t":"s","v":"dom-set-data"},{"t":"s","v":"sx-disposers"},{"t":"s","v":"process-elements"},{"t":"s","v":"log-info"},{"t":"s","v":"hydrated island: "},{"t":"s","v":" ("},{"t":"s","v":"len"},{"t":"s","v":" disposers)"}],"arity":1}},{"t":"s","v":"dispose-island"},{"t":"code","v":{"bytecode":[20,0,0,16,0,1,1,0,48,2,17,1,16,1,33,24,0,51,3,0,16,1,52,2,0,2,5,20,4,0,16,0,1,1,0,2,48,3,32,1,0,2,5,20,5,0,16,0,1,6,0,49,2,50],"constants":[{"t":"s","v":"dom-get-data"},{"t":"s","v":"sx-disposers"},{"t":"s","v":"for-each"},{"t":"code","v":{"bytecode":[20,0,0,16,0,48,1,33,7,0,16,0,49,0,32,1,0,2,50],"constants":[{"t":"s","v":"callable?"}],"arity":1}},{"t":"s","v":"dom-set-data"},{"t":"s","v":"clear-processed!"},{"t":"s","v":"island-hydrated"}],"arity":1}},{"t":"s","v":"dispose-islands-in"},{"t":"code","v":{"bytecode":[16,0,33,98,0,20,0,0,16,0,1,1,0,48,2,17,1,16,1,6,33,11,0,5,16,1,52,3,0,1,52,2,0,1,33,62,0,51,5,0,16,1,52,4,0,2,17,2,16,2,52,3,0,1,52,2,0,1,33,34,0,20,6,0,1,8,0,16,2,52,9,0,1,1,10,0,52,7,0,3,48,1,5,20,12,0,16,2,52,11,0,2,32,1,0,2,32,1,0,2,32,1,0,2,50],"constants":[{"t":"s","v":"dom-query-all"},{"t":"s","v":"[data-sx-island]"},{"t":"s","v":"not"},{"t":"s","v":"empty?"},{"t":"s","v":"filter"},{"t":"code","v":{"bytecode":[20,1,0,16,0,1,2,0,48,2,52,0,0,1,50],"constants":[{"t":"s","v":"not"},{"t":"s","v":"is-processed?"},{"t":"s","v":"island-hydrated"}],"arity":1}},{"t":"s","v":"log-info"},{"t":"s","v":"str"},{"t":"s","v":"disposing "},{"t":"s","v":"len"},{"t":"s","v":" island(s)"},{"t":"s","v":"for-each"},{"t":"s","v":"dispose-island"}],"arity":1}},{"t":"s","v":"force-dispose-islands-in"},{"t":"code","v":{"bytecode":[16,0,33,70,0,20,0,0,16,0,1,1,0,48,2,17,1,16,1,6,33,11,0,5,16,1,52,3,0,1,52,2,0,1,33,34,0,20,4,0,1,6,0,16,1,52,7,0,1,1,8,0,52,5,0,3,48,1,5,20,10,0,16,1,52,9,0,2,32,1,0,2,32,1,0,2,50],"constants":[{"t":"s","v":"dom-query-all"},{"t":"s","v":"[data-sx-island]"},{"t":"s","v":"not"},{"t":"s","v":"empty?"},{"t":"s","v":"log-info"},{"t":"s","v":"str"},{"t":"s","v":"force-disposing "},{"t":"s","v":"len"},{"t":"s","v":" island(s)"},{"t":"s","v":"for-each"},{"t":"s","v":"dispose-island"}],"arity":1}},{"t":"s","v":"*pre-render-hooks*"},{"t":"s","v":"*post-render-hooks*"},{"t":"s","v":"register-pre-render-hook"},{"t":"code","v":{"bytecode":[20,0,0,20,1,0,16,0,49,2,50],"constants":[{"t":"s","v":"append!"},{"t":"s","v":"*pre-render-hooks*"}],"arity":1}},{"t":"s","v":"register-post-render-hook"},{"t":"code","v":{"bytecode":[20,0,0,20,1,0,16,0,49,2,50],"constants":[{"t":"s","v":"append!"},{"t":"s","v":"*post-render-hooks*"}],"arity":1}},{"t":"s","v":"run-pre-render-hooks"},{"t":"code","v":{"bytecode":[51,1,0,20,2,0,52,0,0,2,50],"constants":[{"t":"s","v":"for-each"},{"t":"code","v":{"bytecode":[20,0,0,16,0,2,49,2,50],"constants":[{"t":"s","v":"cek-call"}],"arity":1}},{"t":"s","v":"*pre-render-hooks*"}]}},{"t":"s","v":"run-post-render-hooks"},{"t":"code","v":{"bytecode":[20,0,0,1,2,0,20,4,0,52,3,0,1,1,5,0,52,1,0,3,48,1,5,51,7,0,20,4,0,52,6,0,2,50],"constants":[{"t":"s","v":"log-info"},{"t":"s","v":"str"},{"t":"s","v":"run-post-render-hooks: "},{"t":"s","v":"len"},{"t":"s","v":"*post-render-hooks*"},{"t":"s","v":" hooks"},{"t":"s","v":"for-each"},{"t":"code","v":{"bytecode":[20,0,0,1,2,0,16,0,52,3,0,1,1,4,0,20,5,0,16,0,48,1,1,6,0,16,0,52,7,0,1,52,1,0,6,48,1,5,20,8,0,16,0,2,49,2,50],"constants":[{"t":"s","v":"log-info"},{"t":"s","v":"str"},{"t":"s","v":" hook type: "},{"t":"s","v":"type-of"},{"t":"s","v":" callable: "},{"t":"s","v":"callable?"},{"t":"s","v":" lambda: "},{"t":"s","v":"lambda?"},{"t":"s","v":"cek-call"}],"arity":1}}]}},{"t":"s","v":"boot-init"},{"t":"code","v":{"bytecode":[20,0,0,1,2,0,20,3,0,52,1,0,2,48,1,5,20,4,0,48,0,5,20,5,0,48,0,5,20,6,0,2,48,1,5,20,7,0,2,48,1,5,20,8,0,2,48,1,5,20,9,0,48,0,5,20,10,0,2,48,1,5,20,11,0,20,12,0,48,0,1,13,0,51,14,0,49,3,50],"constants":[{"t":"s","v":"log-info"},{"t":"s","v":"str"},{"t":"s","v":"sx-browser "},{"t":"s","v":"SX_VERSION"},{"t":"s","v":"init-css-tracking"},{"t":"s","v":"process-page-scripts"},{"t":"s","v":"process-sx-scripts"},{"t":"s","v":"sx-hydrate-elements"},{"t":"s","v":"sx-hydrate-islands"},{"t":"s","v":"run-post-render-hooks"},{"t":"s","v":"process-elements"},{"t":"s","v":"dom-listen"},{"t":"s","v":"dom-window"},{"t":"s","v":"popstate"},{"t":"code","v":{"bytecode":[20,0,0,1,1,0,49,1,50],"constants":[{"t":"s","v":"handle-popstate"},{"t":"n","v":0}],"arity":1}}]}}]}}
\ No newline at end of file
diff --git a/shared/static/wasm/sx/orchestration.sx b/shared/static/wasm/sx/orchestration.sx
index aab32928..06e5a667 100644
--- a/shared/static/wasm/sx/orchestration.sx
+++ b/shared/static/wasm/sx/orchestration.sx
@@ -299,7 +299,11 @@
()
(let
((swap-result (swap-dom-nodes target content swap-style)))
- (post-swap (or swap-result target)))))))))))))
+ (post-swap
+ (if
+ (= swap-style "outerHTML")
+ (dom-parent (or swap-result target))
+ (or swap-result target))))))))))))))
(define
handle-html-response
@@ -325,8 +329,15 @@
use-transition
(fn
()
- (swap-html-string target html swap-style)
- (post-swap target))))
+ (let
+ ((swap-root (swap-html-string target html swap-style)))
+ (log-info
+ (str
+ "swap-root: "
+ (if swap-root (dom-tag-name swap-root) "nil")
+ " target: "
+ (dom-tag-name target)))
+ (post-swap (or swap-root target))))))
(let
((container (dom-create-element "div" nil)))
(dom-set-inner-html container (dom-body-inner-html doc))
diff --git a/shared/static/wasm/sx/orchestration.sxbc b/shared/static/wasm/sx/orchestration.sxbc
deleted file mode 100644
index 0431415e..00000000
--- a/shared/static/wasm/sx/orchestration.sxbc
+++ /dev/null
@@ -1,1193 +0,0 @@
-(sxbc 1 "1056e285184b2535"
- (code
- :bytecode (52 1 0 0 128 0 0 5 1 3 0 128 2 0 5 51 5 0 128 4 0 5 51 7 0 128 6 0 5 51 9 0 128 8 0 5 51 11 0 128 10 0 5 51 13 0 128 12 0 5 51 15 0 128 14 0 5 51 17 0 128 16 0 5 51 19 0 128 18 0 5 51 21 0 128 20 0 5 51 23 0 128 22 0 5 51 25 0 128 24 0 5 51 27 0 128 26 0 5 51 29 0 128 28 0 5 51 31 0 128 30 0 5 51 33 0 128 32 0 5 51 35 0 128 34 0 5 51 37 0 128 36 0 5 52 1 0 0 128 38 0 5 1 40 0 128 39 0 5 51 42 0 128 41 0 5 51 44 0 128 43 0 5 51 46 0 128 45 0 5 51 48 0 128 47 0 5 51 50 0 128 49 0 5 51 52 0 128 51 0 5 51 54 0 128 53 0 5 52 1 0 0 128 55 0 5 51 57 0 128 56 0 5 51 59 0 128 58 0 5 51 61 0 128 60 0 5 51 63 0 128 62 0 5 3 128 64 0 5 52 66 0 0 128 65 0 5 51 68 0 128 67 0 5 51 70 0 128 69 0 5 51 72 0 128 71 0 5 51 74 0 128 73 0 5 51 76 0 128 75 0 5 51 78 0 128 77 0 5 51 80 0 128 79 0 5 51 82 0 128 81 0 5 51 84 0 128 83 0 5 51 86 0 128 85 0 5 51 88 0 128 87 0 5 51 90 0 128 89 0 5 51 92 0 128 91 0 5 51 94 0 128 93 0 5 51 96 0 128 95 0 5 51 98 0 128 97 0 5 51 100 0 128 99 0 5 51 102 0 128 101 0 5 1 105 0 52 104 0 1 128 103 0 5 51 107 0 128 106 0 5 51 109 0 128 108 0 5 51 111 0 128 110 0 5 51 113 0 128 112 0 5 51 115 0 128 114 0 50)
- :constants (
- "_preload-cache"
- "dict"
- "_css-hash"
- ""
- "dispatch-trigger-events"
- (code :arity 2
- :bytecode (16 1 33 55 0 20 0 0 16 1 48 1 17 2 16 2 33 20 0 51 2 0 1 0 1 2 16 2 52 3 0 1 52 1 0 2 32 18 0 51 4 0 1 0 16 1 1 6 0 52 5 0 2 52 1 0 2 32 1 0 2 50)
- :constants (
- "try-parse-json"
- "for-each"
- (code :arity 1 :upvalue-count 2
- :bytecode (20 0 0 18 0 16 0 18 1 16 0 52 1 0 2 49 3 50)
- :constants (
- "dom-dispatch"
- "get"))
- "keys"
- (code :arity 1 :upvalue-count 1
- :bytecode (16 0 52 0 0 1 17 1 16 1 52 2 0 1 52 1 0 1 33 16 0 20 3 0 18 0 16 1 52 4 0 0 49 3 32 1 0 2 50)
- :constants (
- "trim"
- "not"
- "empty?"
- "dom-dispatch"
- "dict"))
- "split"
- ","))
- "init-css-tracking"
- (code
- :bytecode (20 0 0 1 1 0 48 1 17 0 16 0 33 29 0 20 2 0 16 0 1 3 0 48 2 17 1 16 1 33 8 0 16 1 21 4 0 32 1 0 2 32 1 0 2 50)
- :constants (
- "dom-query"
- "meta[name=\"sx-css-classes\"]"
- "dom-get-attr"
- "content"
- "_css-hash"))
- "execute-request"
- (code :arity 3
- :bytecode (20 0 0 16 0 48 1 6 34 3 0 5 16 1 17 3 16 3 52 1 0 1 33 9 0 20 2 0 2 49 1 32 249 0 16 3 1 4 0 52 3 0 2 17 4 16 3 1 5 0 52 3 0 2 17 5 20 6 0 16 0 1 7 0 48 2 17 6 16 6 6 33 12 0 5 20 9 0 16 6 48 1 52 8 0 1 33 9 0 20 2 0 2 49 1 32 185 0 20 6 0 16 0 1 10 0 48 2 17 6 16 6 6 33 12 0 5 20 11 0 16 6 48 1 52 8 0 1 33 9 0 20 2 0 2 49 1 32 143 0 20 6 0 16 0 1 12 0 48 2 17 6 16 6 33 10 0 20 13 0 16 6 48 1 32 1 0 2 17 7 16 6 6 33 7 0 5 16 7 52 1 0 1 33 9 0 20 2 0 2 49 1 32 88 0 16 4 52 1 0 1 6 34 23 0 5 16 5 52 1 0 1 6 34 12 0 5 20 14 0 16 0 48 1 52 8 0 1 33 9 0 20 2 0 2 49 1 32 43 0 20 15 0 16 0 16 4 16 4 16 5 16 7 33 23 0 16 2 6 34 5 0 5 52 17 0 0 1 18 0 16 7 52 16 0 3 32 2 0 16 2 49 5 50)
- :constants (
- "get-verb-info"
- "nil?"
- "promise-resolve"
- "get"
- "method"
- "url"
- "dom-get-attr"
- "sx-media"
- "not"
- "browser-media-matches?"
- "sx-confirm"
- "browser-confirm"
- "sx-prompt"
- "browser-prompt"
- "validate-for-request"
- "do-fetch"
- "assoc"
- "dict"
- "SX-Prompt"))
- "do-fetch"
- (code :arity 5
- :bytecode (20 0 0 16 0 1 1 0 48 2 17 5 16 5 1 3 0 52 2 0 2 33 10 0 20 4 0 16 0 48 1 32 1 0 2 5 20 5 0 16 0 48 1 17 6 16 6 6 33 13 0 5 16 0 16 6 52 7 0 2 52 6 0 1 33 10 0 20 8 0 16 6 48 1 32 1 0 2 5 20 9 0 48 0 17 6 20 10 0 16 0 16 6 48 2 5 20 5 0 16 0 48 1 17 7 16 7 33 12 0 20 11 0 16 7 16 6 48 2 32 1 0 2 5 20 12 0 16 0 16 2 16 3 48 3 17 7 16 7 1 14 0 52 13 0 2 17 8 16 7 1 15 0 52 13 0 2 17 9 16 7 1 16 0 52 13 0 2 17 10 20 17 0 16 0 20 18 0 48 0 20 19 0 48 3 17 11 20 20 0 48 0 17 12 16 4 33 20 0 51 22 0 1 11 1 4 16 4 52 23 0 1 52 21 0 2 32 1 0 2 5 16 10 33 14 0 16 11 1 25 0 16 10 52 24 0 3 32 1 0 2 5 16 12 33 14 0 16 11 1 26 0 16 12 52 24 0 3 32 1 0 2 5 20 27 0 20 28 0 16 8 48 2 17 13 20 29 0 16 0 48 1 17 14 20 30 0 16 0 48 1 17 15 20 31 0 16 0 48 1 17 16 20 32 0 16 0 1 33 0 48 2 5 20 34 0 16 0 1 35 0 1 36 0 48 3 5 20 37 0 16 0 1 38 0 1 14 0 16 8 1 40 0 16 2 52 39 0 4 48 3 5 20 41 0 1 14 0 16 8 1 40 0 16 2 1 42 0 16 11 1 15 0 16 9 1 43 0 20 44 0 16 6 48 1 1 45 0 20 46 0 16 8 48 1 1 47 0 16 13 52 39 0 14 51 48 0 1 0 1 15 1 16 1 14 1 8 1 1 1 4 1 2 51 49 0 1 0 1 15 1 16 1 14 1 2 1 8 49 3 50)
- :constants (
- "dom-get-attr"
- "sx-sync"
- "="
- "replace"
- "abort-previous"
- "resolve-target"
- "not"
- "identical?"
- "abort-previous-target"
- "new-abort-controller"
- "track-controller"
- "track-controller-target"
- "build-request-body"
- "get"
- "url"
- "body"
- "content-type"
- "build-request-headers"
- "loaded-component-names"
- "_css-hash"
- "csrf-token"
- "for-each"
- (code :arity 1 :upvalue-count 2
- :bytecode (18 0 16 0 18 1 16 0 52 1 0 2 52 0 0 3 50)
- :constants (
- "dict-set!"
- "get"))
- "keys"
- "dict-set!"
- "Content-Type"
- "X-CSRFToken"
- "preload-cache-get"
- "_preload-cache"
- "apply-optimistic"
- "show-indicator"
- "disable-elements"
- "dom-add-class"
- "sx-request"
- "dom-set-attr"
- "aria-busy"
- "true"
- "dom-dispatch"
- "sx:beforeRequest"
- "dict"
- "method"
- "fetch-request"
- "headers"
- "signal"
- "controller-signal"
- "cross-origin"
- "cross-origin?"
- "preloaded"
- (code :arity 4 :upvalue-count 8
- :bytecode (20 0 0 18 0 18 1 18 2 48 3 5 20 1 0 18 3 48 1 5 16 0 52 2 0 1 33 86 0 20 3 0 18 0 1 4 0 1 6 0 16 1 1 7 0 16 3 52 5 0 4 48 3 5 16 3 6 33 14 0 5 16 3 52 9 0 1 1 10 0 52 8 0 2 33 20 0 20 11 0 18 0 18 4 18 5 18 6 16 2 16 3 49 6 32 15 0 20 12 0 18 0 18 5 18 7 18 4 18 6 49 5 32 37 0 20 3 0 18 0 1 13 0 1 6 0 16 1 52 5 0 2 48 3 5 20 11 0 18 0 18 4 18 5 18 6 16 2 16 3 49 6 50)
- :constants (
- "clear-loading-state"
- "revert-optimistic"
- "not"
- "dom-dispatch"
- "sx:responseError"
- "dict"
- "status"
- "text"
- ">"
- "len"
- 0
- "handle-fetch-success"
- "handle-retry"
- "sx:afterRequest"))
- (code :arity 1 :upvalue-count 6
- :bytecode (20 0 0 18 0 18 1 18 2 48 3 5 20 1 0 18 3 48 1 5 20 3 0 16 0 48 1 52 2 0 1 33 47 0 20 4 0 1 6 0 18 4 1 7 0 18 5 1 8 0 16 0 52 5 0 6 48 1 5 20 9 0 18 0 1 10 0 1 12 0 16 0 52 11 0 2 49 3 32 1 0 2 50)
- :constants (
- "clear-loading-state"
- "revert-optimistic"
- "not"
- "abort-error?"
- "log-warn"
- "str"
- "sx:fetch error "
- " "
- " — "
- "dom-dispatch"
- "sx:requestError"
- "dict"
- "error"))))
- "handle-fetch-success"
- (code :arity 6
- :bytecode (20 0 0 16 4 48 1 17 6 16 6 1 2 0 52 1 0 2 17 7 16 7 33 8 0 16 7 21 3 0 32 1 0 2 5 20 4 0 16 0 16 6 1 5 0 52 1 0 2 48 2 5 20 6 0 16 0 16 6 16 5 48 3 5 16 6 1 7 0 52 1 0 2 33 17 0 20 8 0 16 6 1 7 0 52 1 0 2 49 1 32 31 1 16 6 1 9 0 52 1 0 2 33 8 0 20 10 0 49 0 32 11 1 16 6 1 11 0 52 1 0 2 33 17 0 20 12 0 16 6 1 11 0 52 1 0 2 49 1 32 238 0 16 6 1 13 0 52 1 0 2 33 17 0 20 14 0 16 6 1 13 0 52 1 0 2 48 1 32 7 0 20 15 0 16 0 48 1 17 7 20 16 0 16 6 1 17 0 52 1 0 2 6 34 11 0 5 20 18 0 16 0 1 19 0 48 2 20 20 0 20 21 0 48 0 1 22 0 48 2 48 2 17 8 16 8 1 23 0 52 1 0 2 17 9 16 8 1 24 0 52 1 0 2 17 10 16 6 1 25 0 52 1 0 2 6 34 4 0 5 1 26 0 17 11 16 11 1 28 0 52 27 0 2 33 18 0 20 29 0 16 0 16 7 16 5 16 9 16 10 48 5 32 15 0 20 30 0 16 0 16 7 16 5 16 9 16 10 48 5 5 20 4 0 16 0 16 6 1 31 0 52 1 0 2 48 2 5 20 32 0 16 0 16 1 16 6 48 3 5 20 33 0 51 34 0 1 6 1 0 1 35 0 48 2 5 20 36 0 16 0 1 37 0 1 39 0 16 7 1 40 0 16 9 52 38 0 4 49 3 50)
- :constants (
- "process-response-headers"
- "get"
- "css-hash"
- "_css-hash"
- "dispatch-trigger-events"
- "trigger"
- "process-cache-directives"
- "redirect"
- "browser-navigate"
- "refresh"
- "browser-reload"
- "location"
- "fetch-location"
- "retarget"
- "dom-query"
- "resolve-target"
- "parse-swap-spec"
- "reswap"
- "dom-get-attr"
- "sx-swap"
- "dom-has-class?"
- "dom-body"
- "sx-transitions"
- "style"
- "transition"
- "content-type"
- ""
- "contains?"
- "text/sx"
- "handle-sx-response"
- "handle-html-response"
- "trigger-swap"
- "handle-history"
- "set-timeout"
- (code :upvalue-count 2
- :bytecode (18 0 1 1 0 52 0 0 2 33 19 0 20 2 0 18 1 18 0 1 1 0 52 0 0 2 48 2 32 1 0 2 5 20 3 0 18 1 49 1 50)
- :constants (
- "get"
- "trigger-settle"
- "dispatch-trigger-events"
- "process-settle-hooks"))
- 20
- "dom-dispatch"
- "sx:afterSwap"
- "dict"
- "target"
- "swap"))
- "handle-sx-response"
- (code :arity 5
- :bytecode (20 0 0 16 2 48 1 17 5 20 1 0 16 5 48 1 17 6 16 6 52 2 0 1 17 7 16 7 52 4 0 1 52 3 0 1 33 106 0 20 5 0 16 7 48 1 17 8 20 6 0 1 7 0 2 48 2 17 9 20 8 0 16 9 16 8 48 2 5 20 9 0 16 9 51 10 0 48 2 5 20 11 0 16 0 1 12 0 48 2 17 10 16 10 33 12 0 20 13 0 16 9 16 10 48 2 32 7 0 20 14 0 16 9 48 1 17 11 20 15 0 16 1 48 1 5 20 16 0 16 4 51 17 0 1 1 1 11 1 3 49 2 32 1 0 2 50)
- :constants (
- "strip-component-scripts"
- "extract-response-css"
- "trim"
- "not"
- "empty?"
- "sx-render"
- "dom-create-element"
- "div"
- "dom-append"
- "process-oob-swaps"
- (code :arity 3
- :bytecode (20 0 0 16 0 48 1 5 20 1 0 16 0 16 1 16 2 48 3 5 20 2 0 16 0 48 1 5 20 3 0 16 0 49 1 50)
- :constants (
- "dispose-islands-in"
- "swap-dom-nodes"
- "sx-hydrate"
- "process-elements"))
- "dom-get-attr"
- "sx-select"
- "select-from-container"
- "children-to-fragment"
- "dispose-islands-in"
- "with-transition"
- (code :upvalue-count 3
- :bytecode (20 0 0 18 0 18 1 18 2 48 3 17 0 20 1 0 16 0 6 34 3 0 5 18 0 49 1 50)
- :constants (
- "swap-dom-nodes"
- "post-swap"))))
- "handle-html-response"
- (code :arity 5
- :bytecode (20 0 0 16 2 48 1 17 5 16 5 33 119 0 20 1 0 16 0 1 2 0 48 2 17 6 20 3 0 16 1 48 1 5 16 6 33 30 0 20 4 0 16 5 16 6 48 2 17 7 20 5 0 16 4 51 6 0 1 1 1 7 1 3 49 2 32 61 0 20 7 0 1 8 0 2 48 2 17 7 20 9 0 16 7 20 10 0 16 5 48 1 48 2 5 20 11 0 16 7 51 12 0 48 2 5 20 13 0 16 7 48 1 5 20 5 0 16 4 51 14 0 1 1 1 7 1 3 49 2 32 1 0 2 50)
- :constants (
- "dom-parse-html-document"
- "dom-get-attr"
- "sx-select"
- "dispose-islands-in"
- "select-html-from-doc"
- "with-transition"
- (code :upvalue-count 3
- :bytecode (20 0 0 18 0 18 1 18 2 48 3 5 20 1 0 18 0 49 1 50)
- :constants (
- "swap-html-string"
- "post-swap"))
- "dom-create-element"
- "div"
- "dom-set-inner-html"
- "dom-body-inner-html"
- "process-oob-swaps"
- (code :arity 3
- :bytecode (20 0 0 16 0 48 1 5 20 1 0 16 0 16 1 16 2 48 3 5 20 2 0 16 0 49 1 50)
- :constants (
- "dispose-islands-in"
- "swap-dom-nodes"
- "post-swap"))
- "hoist-head-elements"
- (code :upvalue-count 3
- :bytecode (20 0 0 18 0 20 1 0 18 1 48 1 18 2 48 3 5 20 2 0 18 0 49 1 50)
- :constants (
- "swap-dom-nodes"
- "children-to-fragment"
- "post-swap"))))
- "handle-retry"
- (code :arity 5
- :bytecode (20 0 0 16 0 1 1 0 48 2 17 5 20 2 0 16 5 48 1 17 6 16 6 33 97 0 20 0 0 16 0 1 3 0 48 2 6 34 10 0 5 16 6 1 5 0 52 4 0 2 17 7 16 7 16 6 1 5 0 52 4 0 2 52 6 0 2 17 8 20 7 0 16 0 1 3 0 20 9 0 16 8 16 6 1 10 0 52 4 0 2 48 2 52 8 0 1 48 3 5 20 11 0 51 12 0 1 0 1 1 1 2 1 3 1 4 16 8 49 2 32 1 0 2 50)
- :constants (
- "dom-get-attr"
- "sx-retry"
- "parse-retry-spec"
- "data-sx-retry-ms"
- "get"
- "start-ms"
- "parse-int"
- "dom-set-attr"
- "str"
- "next-retry-ms"
- "cap-ms"
- "set-timeout"
- (code :upvalue-count 5
- :bytecode (20 0 0 18 0 18 1 18 2 18 3 18 4 49 5 50)
- :constants (
- "do-fetch"))))
- "bind-triggers"
- (code :arity 2
- :bytecode (20 0 0 20 1 0 16 0 1 2 0 48 2 48 1 6 34 13 0 5 20 3 0 20 4 0 16 0 48 1 48 1 17 2 51 6 0 1 0 1 1 16 2 52 5 0 2 50)
- :constants (
- "parse-trigger-spec"
- "dom-get-attr"
- "sx-trigger"
- "default-trigger"
- "dom-tag-name"
- "for-each"
- (code :arity 1 :upvalue-count 2
- :bytecode (20 0 0 16 0 48 1 17 1 16 0 1 2 0 52 1 0 2 17 2 16 1 1 4 0 52 3 0 2 33 22 0 20 5 0 51 6 0 0 0 16 2 1 7 0 52 1 0 2 49 2 32 152 0 16 1 1 8 0 52 3 0 2 33 25 0 20 9 0 18 0 51 6 0 0 0 4 16 2 1 10 0 52 1 0 2 49 4 32 115 0 16 1 1 11 0 52 3 0 2 33 30 0 20 12 0 51 6 0 0 0 16 2 1 10 0 52 1 0 2 6 34 4 0 5 1 13 0 49 2 32 73 0 16 1 1 14 0 52 3 0 2 33 25 0 20 9 0 18 0 51 6 0 0 0 3 16 2 1 10 0 52 1 0 2 49 4 32 36 0 16 1 1 15 0 52 3 0 2 33 23 0 20 16 0 18 0 16 0 1 15 0 52 1 0 2 16 2 18 1 49 4 32 1 0 2 50)
- :constants (
- "classify-trigger"
- "get"
- "modifiers"
- "="
- "poll"
- "set-interval"
- (code :upvalue-count 1
- :bytecode (20 0 0 18 0 2 2 49 3 50)
- :constants (
- "execute-request"))
- "interval"
- "intersect"
- "observe-intersection"
- "delay"
- "load"
- "set-timeout"
- 0
- "revealed"
- "event"
- "bind-event"))))
- "bind-event"
- (code :arity 4
- :bytecode (2 17 4 2 17 5 16 2 1 1 0 52 0 0 2 33 17 0 20 2 0 16 2 1 1 0 52 0 0 2 48 1 32 2 0 16 0 17 6 16 6 33 49 0 20 3 0 16 6 16 1 51 4 0 1 2 1 0 1 5 1 1 1 4 16 2 1 5 0 52 0 0 2 33 11 0 1 5 0 3 52 6 0 2 32 1 0 2 49 4 32 1 0 2 50)
- :constants (
- "get"
- "from"
- "dom-query"
- "dom-add-listener"
- (code :arity 1 :upvalue-count 5
- :bytecode (3 17 1 18 0 1 1 0 52 0 0 2 33 33 0 20 2 0 18 1 48 1 17 2 16 2 18 2 52 3 0 2 33 6 0 4 17 1 32 4 0 16 2 19 2 32 1 0 2 5 16 1 6 33 26 0 5 18 3 1 5 0 52 3 0 2 6 33 8 0 5 20 6 0 16 0 48 1 52 4 0 1 33 36 1 18 3 1 7 0 52 3 0 2 6 34 25 0 5 18 3 1 5 0 52 3 0 2 6 33 11 0 5 20 8 0 18 1 1 9 0 48 2 33 10 0 20 10 0 16 0 48 1 32 1 0 2 5 20 11 0 18 1 48 1 17 2 18 3 1 5 0 52 3 0 2 6 33 50 0 5 16 2 1 12 0 52 0 0 2 1 13 0 52 3 0 2 6 33 29 0 5 20 8 0 18 1 1 9 0 48 2 6 33 14 0 5 18 0 1 14 0 52 0 0 2 52 4 0 1 17 3 4 17 4 16 3 33 34 0 20 15 0 20 16 0 16 2 1 17 0 52 0 0 2 48 1 20 18 0 18 1 1 19 0 48 2 48 2 17 4 32 1 0 2 5 16 4 33 29 0 20 20 0 16 2 1 17 0 52 0 0 2 48 1 5 20 21 0 1 22 0 1 22 0 49 2 32 84 0 16 3 33 24 0 20 23 0 1 25 0 16 2 1 17 0 52 0 0 2 52 24 0 2 48 1 32 1 0 2 5 18 0 1 14 0 52 0 0 2 33 32 0 20 26 0 18 4 48 1 5 20 27 0 51 28 0 0 1 18 0 1 14 0 52 0 0 2 48 2 19 4 32 9 0 20 29 0 18 1 2 2 49 3 32 1 0 2 50)
- :constants (
- "get"
- "changed"
- "dom-value"
- "="
- "not"
- "click"
- "event-modifier-key?"
- "submit"
- "dom-has-attr?"
- "href"
- "prevent-default"
- "get-verb-info"
- "method"
- "GET"
- "delay"
- "try-client-route"
- "url-pathname"
- "url"
- "dom-get-attr"
- "sx-target"
- "browser-push-state"
- "browser-scroll-to"
- 0
- "log-info"
- "str"
- "sx:route server fetch "
- "clear-timeout"
- "set-timeout"
- (code :upvalue-count 1
- :bytecode (20 0 0 18 0 2 2 49 3 50)
- :constants (
- "execute-request"))
- "execute-request"))
- "once"
- "dict"))
- "post-swap"
- (code :arity 1
- :bytecode (20 0 0 1 2 0 16 0 33 10 0 20 3 0 16 0 48 1 32 3 0 1 4 0 52 1 0 2 48 1 5 20 5 0 16 0 48 1 5 20 6 0 16 0 48 1 5 20 7 0 16 0 48 1 5 20 8 0 16 0 48 1 5 20 9 0 48 0 5 20 10 0 16 0 49 1 50)
- :constants (
- "log-info"
- "str"
- "post-swap: root="
- "dom-tag-name"
- "nil"
- "activate-scripts"
- "sx-process-scripts"
- "sx-hydrate"
- "sx-hydrate-islands"
- "run-post-render-hooks"
- "process-elements"))
- "process-settle-hooks"
- (code :arity 1
- :bytecode (20 0 0 16 0 1 1 0 48 2 17 1 16 1 6 33 11 0 5 16 1 52 3 0 1 52 2 0 1 33 21 0 20 4 0 16 1 48 1 17 2 51 6 0 16 2 52 5 0 2 32 1 0 2 50)
- :constants (
- "dom-get-attr"
- "sx-on-settle"
- "not"
- "empty?"
- "sx-parse"
- "for-each"
- (code :arity 1
- :bytecode (20 0 0 16 0 20 1 0 52 2 0 0 48 1 49 2 50)
- :constants (
- "eval-expr"
- "env-extend"
- "dict"))))
- "activate-scripts"
- (code :arity 1
- :bytecode (16 0 33 24 0 20 0 0 16 0 1 1 0 48 2 17 1 51 3 0 16 1 52 2 0 2 32 1 0 2 50)
- :constants (
- "dom-query-all"
- "script"
- "for-each"
- (code :arity 1
- :bytecode (20 1 0 16 0 1 2 0 48 2 52 0 0 1 6 33 15 0 5 20 1 0 16 0 1 3 0 48 2 52 0 0 1 33 42 0 20 4 0 16 0 48 1 17 1 20 5 0 16 1 1 3 0 1 6 0 48 3 5 20 7 0 20 8 0 16 0 48 1 16 1 16 0 49 3 32 1 0 2 50)
- :constants (
- "not"
- "dom-has-attr?"
- "data-components"
- "data-sx-activated"
- "create-script-clone"
- "dom-set-attr"
- "true"
- "dom-replace-child"
- "dom-parent"))))
- "process-oob-swaps"
- (code :arity 2
- :bytecode (20 0 0 16 0 48 1 17 2 51 2 0 1 1 16 2 52 1 0 2 50)
- :constants (
- "find-oob-swaps"
- "for-each"
- (code :arity 1 :upvalue-count 1
- :bytecode (16 0 1 1 0 52 0 0 2 17 1 20 2 0 16 1 48 1 17 2 16 0 1 3 0 52 0 0 2 17 3 16 0 1 4 0 52 0 0 2 17 4 20 5 0 16 3 48 1 33 17 0 20 6 0 20 5 0 16 3 48 1 16 3 48 2 32 1 0 2 5 16 2 33 13 0 18 0 16 2 16 3 16 4 49 3 32 1 0 2 50)
- :constants (
- "get"
- "target-id"
- "dom-query-by-id"
- "element"
- "swap-type"
- "dom-parent"
- "dom-remove-child"))))
- "hoist-head-elements"
- (code :arity 1
- :bytecode (51 1 0 20 2 0 16 0 1 3 0 48 2 52 0 0 2 5 51 1 0 20 2 0 16 0 1 4 0 48 2 52 0 0 2 50)
- :constants (
- "for-each"
- (code :arity 1
- :bytecode (20 0 0 16 0 48 1 33 17 0 20 1 0 20 0 0 16 0 48 1 16 0 48 2 32 1 0 2 5 20 2 0 16 0 49 1 50)
- :constants (
- "dom-parent"
- "dom-remove-child"
- "dom-append-to-head"))
- "dom-query-all"
- "style[data-sx-css]"
- "link[rel=\"stylesheet\"]"))
- "process-boosted"
- (code :arity 1
- :bytecode (51 1 0 20 2 0 16 0 6 34 6 0 5 20 3 0 48 0 1 4 0 48 2 52 0 0 2 50)
- :constants (
- "for-each"
- (code :arity 1
- :bytecode (20 0 0 16 0 49 1 50)
- :constants (
- "boost-descendants"))
- "dom-query-all"
- "dom-body"
- "[sx-boost]"))
- "boost-descendants"
- (code :arity 1
- :bytecode (20 0 0 16 0 1 1 0 48 2 17 1 51 3 0 1 1 20 4 0 16 0 1 5 0 48 2 52 2 0 2 5 51 6 0 1 1 20 4 0 16 0 1 7 0 48 2 52 2 0 2 50)
- :constants (
- "dom-get-attr"
- "sx-boost"
- "for-each"
- (code :arity 1 :upvalue-count 1
- :bytecode (20 1 0 16 0 1 2 0 48 2 52 0 0 1 6 33 8 0 5 20 3 0 16 0 48 1 33 160 0 20 4 0 16 0 1 2 0 48 2 5 20 5 0 16 0 1 6 0 48 2 52 0 0 1 6 33 21 0 5 18 0 6 33 14 0 5 18 0 1 8 0 52 7 0 2 52 0 0 1 33 15 0 20 9 0 16 0 1 6 0 18 0 48 3 32 1 0 2 5 20 5 0 16 0 1 10 0 48 2 52 0 0 1 33 16 0 20 9 0 16 0 1 10 0 1 11 0 48 3 32 1 0 2 5 20 5 0 16 0 1 12 0 48 2 52 0 0 1 33 16 0 20 9 0 16 0 1 12 0 1 8 0 48 3 32 1 0 2 5 20 13 0 16 0 20 14 0 16 0 1 15 0 48 2 49 2 32 1 0 2 50)
- :constants (
- "not"
- "is-processed?"
- "boost"
- "should-boost-link?"
- "mark-processed!"
- "dom-has-attr?"
- "sx-target"
- "="
- "true"
- "dom-set-attr"
- "sx-swap"
- "innerHTML"
- "sx-push-url"
- "bind-client-route-link"
- "dom-get-attr"
- "href"))
- "dom-query-all"
- "a[href]"
- (code :arity 1 :upvalue-count 1
- :bytecode (20 1 0 16 0 1 2 0 48 2 52 0 0 1 6 33 8 0 5 20 3 0 16 0 48 1 33 165 0 20 4 0 16 0 1 2 0 48 2 5 20 6 0 16 0 1 7 0 48 2 6 34 4 0 5 1 8 0 52 5 0 1 17 1 20 6 0 16 0 1 9 0 48 2 6 34 6 0 5 20 10 0 48 0 17 2 20 11 0 16 0 1 12 0 48 2 52 0 0 1 6 33 21 0 5 18 0 6 33 14 0 5 18 0 1 14 0 52 13 0 2 52 0 0 1 33 15 0 20 15 0 16 0 1 12 0 18 0 48 3 32 1 0 2 5 20 11 0 16 0 1 16 0 48 2 52 0 0 1 33 16 0 20 15 0 16 0 1 16 0 1 17 0 48 3 32 1 0 2 5 20 18 0 16 0 16 1 16 2 49 3 32 1 0 2 50)
- :constants (
- "not"
- "is-processed?"
- "boost"
- "should-boost-form?"
- "mark-processed!"
- "upper"
- "dom-get-attr"
- "method"
- "GET"
- "action"
- "browser-location-href"
- "dom-has-attr?"
- "sx-target"
- "="
- "true"
- "dom-set-attr"
- "sx-swap"
- "innerHTML"
- "bind-boost-form"))
- "form"))
- "_page-data-cache"
- "_page-data-cache-ttl"
- 30000
- "page-data-cache-key"
- (code :arity 2
- :bytecode (16 0 17 2 16 1 52 0 0 1 6 34 11 0 5 16 1 52 2 0 1 52 1 0 1 33 5 0 16 2 32 42 0 52 3 0 0 17 3 51 5 0 1 3 1 1 16 1 52 2 0 1 52 4 0 2 5 16 2 1 7 0 1 9 0 16 3 52 8 0 2 52 6 0 3 50)
- :constants (
- "nil?"
- "empty?"
- "keys"
- "list"
- "for-each"
- (code :arity 1 :upvalue-count 2
- :bytecode (20 0 0 18 0 16 0 1 2 0 18 1 16 0 52 3 0 2 52 1 0 3 49 2 50)
- :constants (
- "append!"
- "str"
- "="
- "get"))
- "str"
- ":"
- "join"
- "&"))
- "page-data-cache-get"
- (code :arity 1
- :bytecode (20 1 0 16 0 52 0 0 2 17 1 16 1 52 2 0 1 33 4 0 2 32 52 0 20 5 0 48 0 16 1 1 6 0 52 0 0 2 52 4 0 2 20 7 0 52 3 0 2 33 15 0 20 1 0 16 0 2 52 8 0 3 5 2 32 9 0 16 1 1 9 0 52 0 0 2 50)
- :constants (
- "get"
- "_page-data-cache"
- "nil?"
- ">"
- "-"
- "now-ms"
- "ts"
- "_page-data-cache-ttl"
- "dict-set!"
- "data"))
- "page-data-cache-set"
- (code :arity 2
- :bytecode (20 1 0 16 0 1 2 0 16 1 1 3 0 20 4 0 48 0 65 2 0 52 0 0 3 50)
- :constants (
- "dict-set!"
- "_page-data-cache"
- "data"
- "ts"
- "now-ms"))
- "invalidate-page-cache"
- (code :arity 1
- :bytecode (51 1 0 1 0 20 3 0 52 2 0 1 52 0 0 2 5 20 4 0 1 5 0 1 6 0 1 7 0 16 0 65 2 0 48 1 5 20 8 0 1 10 0 16 0 52 9 0 2 49 1 50)
- :constants (
- "for-each"
- (code :arity 1 :upvalue-count 1
- :bytecode (16 0 18 0 52 0 0 2 6 34 16 0 5 16 0 18 0 1 3 0 52 2 0 2 52 1 0 2 33 13 0 20 5 0 16 0 2 52 4 0 3 32 1 0 2 50)
- :constants (
- "="
- "starts-with?"
- "str"
- ":"
- "dict-set!"
- "_page-data-cache"))
- "keys"
- "_page-data-cache"
- "sw-post-message"
- "type"
- "invalidate"
- "page"
- "log-info"
- "str"
- "sx:cache invalidate "))
- "invalidate-all-page-cache"
- (code
- :bytecode (52 0 0 0 21 1 0 5 20 2 0 1 3 0 1 4 0 1 5 0 1 6 0 65 2 0 48 1 5 20 7 0 1 8 0 49 1 50)
- :constants (
- "dict"
- "_page-data-cache"
- "sw-post-message"
- "type"
- "invalidate"
- "page"
- "*"
- "log-info"
- "sx:cache invalidate *"))
- "update-page-cache"
- (code :arity 2
- :bytecode (20 0 0 16 0 52 1 0 0 48 2 17 2 20 2 0 16 2 16 1 48 2 5 20 3 0 1 5 0 16 0 52 4 0 2 49 1 50)
- :constants (
- "page-data-cache-key"
- "dict"
- "page-data-cache-set"
- "log-info"
- "str"
- "sx:cache update "))
- "process-cache-directives"
- (code :arity 3
- :bytecode (20 0 0 16 0 1 1 0 48 2 17 3 16 3 33 30 0 16 3 1 3 0 52 2 0 2 33 8 0 20 4 0 48 0 32 7 0 20 5 0 16 3 48 1 32 1 0 2 5 16 1 1 7 0 52 6 0 2 17 3 16 3 33 30 0 16 3 1 3 0 52 2 0 2 33 8 0 20 4 0 48 0 32 7 0 20 5 0 16 3 48 1 32 1 0 2 5 16 1 1 8 0 52 6 0 2 17 3 16 3 33 30 0 20 9 0 16 2 48 1 17 4 16 4 33 12 0 20 10 0 16 3 16 4 49 2 32 1 0 2 32 1 0 2 50)
- :constants (
- "dom-get-attr"
- "sx-cache-invalidate"
- "="
- "*"
- "invalidate-all-page-cache"
- "invalidate-page-cache"
- "get"
- "cache-invalidate"
- "cache-update"
- "parse-sx-data"
- "update-page-cache"))
- "_optimistic-snapshots"
- "optimistic-cache-update"
- (code :arity 2
- :bytecode (20 0 0 16 0 48 1 17 2 16 2 33 35 0 16 1 16 2 48 1 17 3 20 2 0 16 0 16 2 52 1 0 3 5 20 3 0 16 0 16 3 48 2 5 16 3 32 1 0 2 50)
- :constants (
- "page-data-cache-get"
- "dict-set!"
- "_optimistic-snapshots"
- "page-data-cache-set"))
- "optimistic-cache-revert"
- (code :arity 1
- :bytecode (20 1 0 16 0 52 0 0 2 17 1 16 1 33 25 0 20 2 0 16 0 16 1 48 2 5 20 1 0 16 0 52 3 0 2 5 16 1 32 1 0 2 50)
- :constants (
- "get"
- "_optimistic-snapshots"
- "page-data-cache-set"
- "dict-delete!"))
- "optimistic-cache-confirm"
- (code :arity 1
- :bytecode (20 1 0 16 0 52 0 0 2 50)
- :constants (
- "dict-delete!"
- "_optimistic-snapshots"))
- "submit-mutation"
- (code :arity 6
- :bytecode (20 0 0 16 0 16 1 48 2 17 6 20 1 0 16 6 16 4 48 2 17 7 16 7 33 14 0 20 2 0 16 0 16 1 16 7 48 3 32 1 0 2 5 20 3 0 16 2 16 3 51 4 0 1 6 1 0 1 1 1 5 51 5 0 1 6 1 0 1 1 1 5 49 4 50)
- :constants (
- "page-data-cache-key"
- "optimistic-cache-update"
- "try-rerender-page"
- "execute-action"
- (code :arity 1 :upvalue-count 4
- :bytecode (16 0 33 12 0 20 0 0 18 0 16 0 48 2 32 1 0 2 5 20 1 0 18 0 48 1 5 16 0 33 14 0 20 2 0 18 1 18 2 16 0 48 3 32 1 0 2 5 20 3 0 1 5 0 18 1 52 4 0 2 48 1 5 18 3 33 10 0 18 3 1 6 0 49 1 32 1 0 2 50)
- :constants (
- "page-data-cache-set"
- "optimistic-cache-confirm"
- "try-rerender-page"
- "log-info"
- "str"
- "sx:optimistic confirmed "
- "confirmed"))
- (code :arity 1 :upvalue-count 4
- :bytecode (20 0 0 18 0 48 1 17 1 16 1 33 14 0 20 1 0 18 1 18 2 16 1 48 3 32 1 0 2 5 20 2 0 1 4 0 18 1 1 5 0 16 0 52 3 0 4 48 1 5 18 3 33 10 0 18 3 1 6 0 49 1 32 1 0 2 50)
- :constants (
- "optimistic-cache-revert"
- "try-rerender-page"
- "log-warn"
- "str"
- "sx:optimistic reverted "
- ": "
- "reverted"))))
- "_is-online"
- "_offline-queue"
- "list"
- "offline-is-online?"
- (code
- :bytecode (20 0 0 50)
- :constants (
- "_is-online"))
- "offline-set-online!"
- (code :arity 1
- :bytecode (16 0 21 0 0 50)
- :constants (
- "_is-online"))
- "offline-queue-mutation"
- (code :arity 5
- :bytecode (20 0 0 16 2 16 3 48 2 17 5 1 2 0 16 0 1 3 0 16 1 1 4 0 16 2 1 5 0 16 3 1 6 0 20 7 0 48 0 1 8 0 1 9 0 52 1 0 12 17 6 20 10 0 20 11 0 16 6 48 2 5 20 12 0 16 5 16 4 48 2 17 7 16 7 33 14 0 20 13 0 16 2 16 3 16 7 48 3 32 1 0 2 5 20 14 0 1 16 0 16 0 1 17 0 20 11 0 52 18 0 1 1 19 0 52 15 0 5 48 1 5 16 6 50)
- :constants (
- "page-data-cache-key"
- "dict"
- "action"
- "payload"
- "page"
- "params"
- "timestamp"
- "now-ms"
- "status"
- "pending"
- "append!"
- "_offline-queue"
- "optimistic-cache-update"
- "try-rerender-page"
- "log-info"
- "str"
- "sx:offline queued "
- " ("
- "len"
- " pending)"))
- "offline-sync"
- (code
- :bytecode (51 1 0 20 2 0 52 0 0 2 17 0 16 0 52 4 0 1 52 3 0 1 33 34 0 20 5 0 1 7 0 16 0 52 8 0 1 1 9 0 52 6 0 3 48 1 5 51 11 0 16 0 52 10 0 2 32 1 0 2 50)
- :constants (
- "filter"
- (code :arity 1
- :bytecode (16 0 1 2 0 52 1 0 2 1 3 0 52 0 0 2 50)
- :constants (
- "="
- "get"
- "status"
- "pending"))
- "_offline-queue"
- "not"
- "empty?"
- "log-info"
- "str"
- "sx:offline syncing "
- "len"
- " mutations"
- "for-each"
- (code :arity 1
- :bytecode (20 0 0 16 0 1 2 0 52 1 0 2 16 0 1 3 0 52 1 0 2 51 4 0 1 0 51 5 0 1 0 49 4 50)
- :constants (
- "execute-action"
- "get"
- "action"
- "payload"
- (code :arity 1 :upvalue-count 1
- :bytecode (18 0 1 1 0 1 2 0 52 0 0 3 5 20 3 0 1 5 0 18 0 1 7 0 52 6 0 2 52 4 0 2 49 1 50)
- :constants (
- "dict-set!"
- "status"
- "synced"
- "log-info"
- "str"
- "sx:offline synced "
- "get"
- "action"))
- (code :arity 1 :upvalue-count 1
- :bytecode (18 0 1 1 0 1 2 0 52 0 0 3 5 20 3 0 1 5 0 18 0 1 7 0 52 6 0 2 1 8 0 16 0 52 4 0 4 49 1 50)
- :constants (
- "dict-set!"
- "status"
- "failed"
- "log-warn"
- "str"
- "sx:offline sync failed "
- "get"
- "action"
- ": "))))))
- "offline-pending-count"
- (code
- :bytecode (51 2 0 20 3 0 52 1 0 2 52 0 0 1 50)
- :constants (
- "len"
- "filter"
- (code :arity 1
- :bytecode (16 0 1 2 0 52 1 0 2 1 3 0 52 0 0 2 50)
- :constants (
- "="
- "get"
- "status"
- "pending"))
- "_offline-queue"))
- "offline-aware-mutation"
- (code :arity 6
- :bytecode (20 0 0 33 20 0 20 1 0 16 0 16 1 16 2 16 3 16 4 16 5 49 6 32 32 0 20 2 0 16 2 16 3 16 0 16 1 16 4 48 5 5 16 5 33 10 0 16 5 1 3 0 49 1 32 1 0 2 50)
- :constants (
- "_is-online"
- "submit-mutation"
- "offline-queue-mutation"
- "queued"))
- "current-page-layout"
- (code
- :bytecode (20 0 0 20 1 0 48 0 48 1 17 0 20 2 0 16 0 20 3 0 48 2 17 1 16 1 52 4 0 1 33 6 0 1 5 0 32 17 0 16 1 1 7 0 52 6 0 2 6 34 4 0 5 1 5 0 50)
- :constants (
- "url-pathname"
- "browser-location-href"
- "find-matching-route"
- "_page-routes"
- "nil?"
- ""
- "get"
- "layout"))
- "swap-rendered-content"
- (code :arity 3
- :bytecode (20 0 0 16 0 48 1 5 20 1 0 16 0 1 2 0 48 2 5 20 3 0 16 0 16 1 48 2 5 20 4 0 16 0 48 1 5 20 5 0 16 0 48 1 5 20 6 0 16 0 48 1 5 20 7 0 16 0 48 1 5 20 8 0 48 0 5 20 9 0 16 0 1 10 0 1 12 0 16 2 52 11 0 2 48 3 5 20 13 0 1 15 0 16 2 52 14 0 2 49 1 50)
- :constants (
- "dispose-islands-in"
- "dom-set-text-content"
- ""
- "dom-append"
- "hoist-head-elements-full"
- "process-elements"
- "sx-hydrate-elements"
- "sx-hydrate-islands"
- "run-post-render-hooks"
- "dom-dispatch"
- "sx:clientRoute"
- "dict"
- "pathname"
- "log-info"
- "str"
- "sx:route client "))
- "resolve-route-target"
- (code :arity 1
- :bytecode (16 0 6 33 14 0 5 16 0 1 2 0 52 1 0 2 52 0 0 1 33 10 0 20 3 0 16 0 49 1 32 1 0 2 50)
- :constants (
- "not"
- "="
- "true"
- "dom-query"))
- "deps-satisfied?"
- (code :arity 1
- :bytecode (16 0 1 1 0 52 0 0 2 17 1 20 2 0 48 0 17 2 16 1 52 3 0 1 6 34 7 0 5 16 1 52 4 0 1 33 4 0 3 32 11 0 51 6 0 1 2 16 1 52 5 0 2 50)
- :constants (
- "get"
- "deps"
- "loaded-component-names"
- "nil?"
- "empty?"
- "every?"
- (code :arity 1 :upvalue-count 1
- :bytecode (18 0 16 0 52 0 0 2 50)
- :constants (
- "contains?"))))
- "try-client-route"
- (code :arity 2
- :bytecode (20 0 0 16 0 20 1 0 48 2 17 2 16 2 52 2 0 1 33 29 0 20 3 0 1 5 0 20 1 0 52 6 0 1 1 7 0 16 0 52 4 0 4 48 1 5 4 32 233 2 16 2 1 9 0 52 8 0 2 6 34 4 0 5 1 10 0 17 3 20 11 0 48 0 17 4 16 3 16 4 52 13 0 2 52 12 0 1 33 29 0 20 3 0 1 14 0 16 4 1 15 0 16 3 1 16 0 16 0 52 4 0 6 48 1 5 4 32 163 2 16 2 1 17 0 52 8 0 2 17 5 16 2 1 18 0 52 8 0 2 6 34 4 0 5 65 0 0 17 6 16 2 1 19 0 52 8 0 2 17 7 16 2 1 20 0 52 8 0 2 17 8 16 5 52 2 0 1 6 34 7 0 5 16 5 52 21 0 1 33 19 0 20 22 0 1 23 0 16 0 52 4 0 2 48 1 5 4 32 72 2 20 24 0 16 1 48 1 17 9 16 9 52 2 0 1 33 19 0 20 22 0 1 25 0 16 1 52 4 0 2 48 1 5 4 32 35 2 20 26 0 16 2 48 1 52 12 0 1 33 19 0 20 3 0 1 27 0 16 8 52 4 0 2 48 1 5 4 32 2 2 16 2 1 28 0 52 8 0 2 17 10 16 10 6 33 11 0 5 16 10 52 21 0 1 52 12 0 1 17 11 16 2 1 29 0 52 8 0 2 17 12 16 12 33 78 0 16 12 1 30 0 52 8 0 2 6 34 5 0 5 52 31 0 0 17 13 16 12 1 32 0 52 8 0 2 6 34 5 0 5 52 31 0 0 17 14 20 3 0 1 33 0 16 8 1 34 0 16 13 52 6 0 1 1 35 0 16 14 52 6 0 1 1 36 0 52 4 0 7 48 1 32 1 0 2 5 16 11 33 10 0 20 37 0 16 10 48 1 32 1 0 2 5 16 2 1 38 0 52 8 0 2 33 44 0 20 3 0 1 39 0 16 0 52 4 0 2 48 1 5 20 40 0 16 9 16 0 20 41 0 16 9 20 42 0 48 0 20 43 0 48 3 48 3 5 3 32 59 1 16 2 1 44 0 52 8 0 2 33 194 0 20 45 0 16 8 16 7 48 2 17 13 20 46 0 16 13 48 1 17 14 16 14 33 123 0 16 6 16 7 16 14 52 47 0 3 17 15 16 11 33 36 0 20 3 0 1 48 0 16 0 52 4 0 2 48 1 5 20 49 0 16 5 16 15 51 50 0 1 0 1 9 48 3 5 3 32 67 0 20 51 0 16 5 16 15 48 2 17 16 16 16 52 2 0 1 33 19 0 20 22 0 1 52 0 16 0 52 4 0 2 48 1 5 4 32 28 0 20 3 0 1 53 0 16 0 52 4 0 2 48 1 5 20 54 0 16 9 16 16 16 0 48 3 5 3 32 43 0 20 3 0 1 55 0 16 0 52 4 0 2 48 1 5 20 56 0 16 8 16 7 51 57 0 1 13 1 6 1 7 1 11 1 5 1 0 1 9 48 3 5 3 32 109 0 16 11 33 42 0 20 3 0 1 58 0 16 0 52 4 0 2 48 1 5 20 49 0 16 5 16 6 16 7 52 47 0 2 51 59 0 1 0 1 9 48 3 5 3 32 62 0 16 6 16 7 52 47 0 2 17 13 20 51 0 16 5 16 13 48 2 17 14 16 14 52 2 0 1 33 19 0 20 3 0 1 60 0 16 0 52 4 0 2 48 1 5 4 32 13 0 20 54 0 16 9 16 14 16 0 48 3 5 3 50)
- :constants (
- "find-matching-route"
- "_page-routes"
- "nil?"
- "log-info"
- "str"
- "sx:route no match ("
- "len"
- " routes) "
- "get"
- "layout"
- ""
- "current-page-layout"
- "not"
- "="
- "sx:route server (layout: "
- " -> "
- ") "
- "content"
- "closure"
- "params"
- "name"
- "empty?"
- "log-warn"
- "sx:route no content for "
- "resolve-route-target"
- "sx:route target not found: "
- "deps-satisfied?"
- "sx:route deps miss for "
- "io-deps"
- "render-plan"
- "server"
- "list"
- "client"
- "sx:route plan "
- " — "
- " server, "
- " client"
- "register-io-deps"
- "stream"
- "sx:route streaming "
- "fetch-streaming"
- "build-request-headers"
- "loaded-component-names"
- "_css-hash"
- "has-data"
- "page-data-cache-key"
- "page-data-cache-get"
- "merge"
- "sx:route client+cache+async "
- "try-async-eval-content"
- (code :arity 1 :upvalue-count 2
- :bytecode (16 0 52 0 0 1 33 48 0 20 1 0 1 3 0 18 0 1 4 0 52 2 0 3 48 1 5 20 5 0 18 1 18 0 20 6 0 18 1 20 7 0 48 0 20 8 0 48 3 1 9 0 49 4 32 11 0 20 10 0 18 1 16 0 18 0 49 3 50)
- :constants (
- "nil?"
- "log-warn"
- "str"
- "sx:route cache+async eval failed for "
- " — server fallback"
- "fetch-and-restore"
- "build-request-headers"
- "loaded-component-names"
- "_css-hash"
- 0
- "swap-rendered-content"))
- "try-eval-content"
- "sx:route cached eval failed for "
- "sx:route client+cache "
- "swap-rendered-content"
- "sx:route client+data "
- "resolve-page-data"
- (code :arity 1 :upvalue-count 7
- :bytecode (20 0 0 18 0 16 0 48 2 5 18 1 18 2 16 0 52 1 0 3 17 1 18 3 33 19 0 20 2 0 18 4 16 1 51 3 0 0 5 0 6 49 3 32 79 0 20 4 0 18 4 16 1 48 2 17 2 16 2 52 5 0 1 33 48 0 20 6 0 1 8 0 18 5 1 9 0 52 7 0 3 48 1 5 20 10 0 18 6 18 5 20 11 0 18 6 20 12 0 48 0 20 13 0 48 3 1 14 0 49 4 32 11 0 20 15 0 18 6 16 2 18 5 49 3 50)
- :constants (
- "page-data-cache-set"
- "merge"
- "try-async-eval-content"
- (code :arity 1 :upvalue-count 2
- :bytecode (16 0 52 0 0 1 33 48 0 20 1 0 1 3 0 18 0 1 4 0 52 2 0 3 48 1 5 20 5 0 18 1 18 0 20 6 0 18 1 20 7 0 48 0 20 8 0 48 3 1 9 0 49 4 32 11 0 20 10 0 18 1 16 0 18 0 49 3 50)
- :constants (
- "nil?"
- "log-warn"
- "str"
- "sx:route data+async eval failed for "
- " — server fallback"
- "fetch-and-restore"
- "build-request-headers"
- "loaded-component-names"
- "_css-hash"
- 0
- "swap-rendered-content"))
- "try-eval-content"
- "nil?"
- "log-warn"
- "str"
- "sx:route data eval failed for "
- " — server fallback"
- "fetch-and-restore"
- "build-request-headers"
- "loaded-component-names"
- "_css-hash"
- 0
- "swap-rendered-content"))
- "sx:route client+async "
- (code :arity 1 :upvalue-count 2
- :bytecode (16 0 52 0 0 1 33 48 0 20 1 0 1 3 0 18 0 1 4 0 52 2 0 3 48 1 5 20 5 0 18 1 18 0 20 6 0 18 1 20 7 0 48 0 20 8 0 48 3 1 9 0 49 4 32 11 0 20 10 0 18 1 16 0 18 0 49 3 50)
- :constants (
- "nil?"
- "log-warn"
- "str"
- "sx:route async eval failed for "
- " — server fallback"
- "fetch-and-restore"
- "build-request-headers"
- "loaded-component-names"
- "_css-hash"
- 0
- "swap-rendered-content"))
- "sx:route server (eval failed) "))
- "bind-client-route-link"
- (code :arity 2
- :bytecode (20 0 0 16 0 16 1 51 1 0 1 0 1 1 49 3 50)
- :constants (
- "bind-client-route-click"
- (code :upvalue-count 2
- :bytecode (20 0 0 18 0 18 1 49 2 50)
- :constants (
- "bind-boost-link"))))
- "process-sse"
- (code :arity 1
- :bytecode (51 1 0 20 2 0 16 0 6 34 6 0 5 20 3 0 48 0 1 4 0 48 2 52 0 0 2 50)
- :constants (
- "for-each"
- (code :arity 1
- :bytecode (20 1 0 16 0 1 2 0 48 2 52 0 0 1 33 21 0 20 3 0 16 0 1 2 0 48 2 5 20 4 0 16 0 49 1 32 1 0 2 50)
- :constants (
- "not"
- "is-processed?"
- "sse"
- "mark-processed!"
- "bind-sse"))
- "dom-query-all"
- "dom-body"
- "[sx-sse]"))
- "bind-sse"
- (code :arity 1
- :bytecode (20 0 0 16 0 1 1 0 48 2 17 1 16 1 33 37 0 20 2 0 16 1 16 0 48 2 17 2 20 3 0 16 0 48 1 17 3 20 4 0 16 2 16 3 51 5 0 1 0 49 3 32 1 0 2 50)
- :constants (
- "dom-get-attr"
- "sx-sse"
- "event-source-connect"
- "parse-sse-swap"
- "event-source-listen"
- (code :arity 1 :upvalue-count 1
- :bytecode (20 0 0 18 0 16 0 49 2 50)
- :constants (
- "bind-sse-swap"))))
- "bind-sse-swap"
- (code :arity 2
- :bytecode (20 0 0 16 0 48 1 17 2 20 1 0 20 2 0 16 0 1 3 0 48 2 20 4 0 20 5 0 48 0 1 6 0 48 2 48 2 17 3 16 3 1 8 0 52 7 0 2 17 4 16 3 1 9 0 52 7 0 2 17 5 16 1 52 10 0 1 17 6 16 6 52 12 0 1 52 11 0 1 33 88 0 20 13 0 16 2 48 1 5 16 6 1 15 0 52 14 0 2 33 49 0 20 16 0 16 6 48 1 17 7 20 17 0 1 18 0 2 48 2 17 8 20 19 0 16 8 16 7 48 2 5 20 20 0 16 5 51 21 0 1 2 1 8 1 4 49 2 32 16 0 20 20 0 16 5 51 22 0 1 2 1 6 1 4 49 2 32 1 0 2 50)
- :constants (
- "resolve-target"
- "parse-swap-spec"
- "dom-get-attr"
- "sx-swap"
- "dom-has-class?"
- "dom-body"
- "sx-transitions"
- "get"
- "style"
- "transition"
- "trim"
- "not"
- "empty?"
- "dispose-islands-in"
- "starts-with?"
- "("
- "sx-render"
- "dom-create-element"
- "div"
- "dom-append"
- "with-transition"
- (code :upvalue-count 3
- :bytecode (20 0 0 18 0 20 1 0 18 1 48 1 18 2 48 3 5 20 2 0 18 0 49 1 50)
- :constants (
- "swap-dom-nodes"
- "children-to-fragment"
- "post-swap"))
- (code :upvalue-count 3
- :bytecode (20 0 0 18 0 18 1 18 2 48 3 5 20 1 0 18 0 49 1 50)
- :constants (
- "swap-html-string"
- "post-swap"))))
- "bind-inline-handlers"
- (code :arity 1
- :bytecode (51 1 0 20 2 0 16 0 6 34 6 0 5 20 3 0 48 0 1 4 0 48 2 52 0 0 2 50)
- :constants (
- "for-each"
- (code :arity 1
- :bytecode (51 1 0 1 0 20 2 0 16 0 48 1 52 0 0 2 50)
- :constants (
- "for-each"
- (code :arity 1 :upvalue-count 1
- :bytecode (16 0 52 0 0 1 17 1 16 0 1 2 0 52 1 0 2 17 2 16 1 1 4 0 52 3 0 2 33 83 0 16 1 1 6 0 52 5 0 2 17 3 20 8 0 18 0 1 10 0 16 3 52 9 0 2 48 2 52 7 0 1 33 45 0 20 11 0 18 0 1 10 0 16 3 52 9 0 2 48 2 5 20 12 0 16 2 48 1 17 4 20 13 0 18 0 16 3 51 14 0 0 0 1 4 49 3 32 1 0 2 32 1 0 2 50)
- :constants (
- "first"
- "nth"
- 1
- "starts-with?"
- "sx-on:"
- "slice"
- 6
- "not"
- "is-processed?"
- "str"
- "on:"
- "mark-processed!"
- "sx-parse"
- "dom-on"
- (code :arity 1 :upvalue-count 2
- :bytecode (20 0 0 52 1 0 0 48 1 17 1 20 2 0 16 1 1 3 0 16 0 48 3 5 20 2 0 16 1 1 4 0 18 0 48 3 5 20 2 0 16 1 1 5 0 20 6 0 16 0 48 1 48 3 5 51 8 0 1 1 18 1 52 7 0 2 50)
- :constants (
- "env-extend"
- "dict"
- "env-bind!"
- "event"
- "this"
- "detail"
- "event-detail"
- "for-each"
- (code :arity 1 :upvalue-count 1
- :bytecode (20 0 0 16 0 18 0 49 2 50)
- :constants (
- "eval-expr"))))))
- "dom-attr-list"))
- "dom-query-all"
- "dom-body"
- "[sx-on\\:]"))
- "bind-preload-for"
- (code :arity 1
- :bytecode (20 0 0 16 0 1 1 0 48 2 17 1 16 1 33 76 0 16 1 1 3 0 52 2 0 2 33 13 0 1 3 0 1 5 0 52 4 0 2 32 7 0 1 6 0 52 4 0 1 17 2 16 1 1 3 0 52 2 0 2 33 6 0 1 7 0 32 3 0 1 8 0 17 3 20 9 0 16 0 16 2 16 3 51 10 0 1 0 49 4 32 1 0 2 50)
- :constants (
- "dom-get-attr"
- "sx-preload"
- "="
- "mousedown"
- "list"
- "touchstart"
- "mouseover"
- 0
- 100
- "bind-preload"
- (code :upvalue-count 1
- :bytecode (20 0 0 18 0 48 1 17 0 16 0 33 32 0 20 1 0 16 0 1 3 0 52 2 0 2 20 4 0 18 0 20 5 0 48 0 20 6 0 48 3 49 2 32 1 0 2 50)
- :constants (
- "get-verb-info"
- "do-preload"
- "get"
- "url"
- "build-request-headers"
- "loaded-component-names"
- "_css-hash"))))
- "do-preload"
- (code :arity 2
- :bytecode (20 1 0 20 2 0 16 0 48 2 52 0 0 1 33 15 0 20 3 0 16 0 16 1 20 2 0 49 3 32 1 0 2 50)
- :constants (
- "nil?"
- "preload-cache-get"
- "_preload-cache"
- "fetch-preload"))
- "VERB_SELECTOR"
- "str"
- "[sx-get],[sx-post],[sx-put],[sx-delete],[sx-patch]"
- "process-elements"
- (code :arity 1
- :bytecode (20 0 0 16 0 6 34 6 0 5 20 1 0 48 0 20 2 0 48 2 17 1 51 4 0 16 1 52 3 0 2 5 20 5 0 16 0 48 1 5 20 6 0 16 0 48 1 5 20 7 0 16 0 48 1 5 20 8 0 16 0 49 1 50)
- :constants (
- "dom-query-all"
- "dom-body"
- "VERB_SELECTOR"
- "for-each"
- (code :arity 1
- :bytecode (20 1 0 16 0 1 2 0 48 2 52 0 0 1 33 21 0 20 3 0 16 0 1 2 0 48 2 5 20 4 0 16 0 49 1 32 1 0 2 50)
- :constants (
- "not"
- "is-processed?"
- "verb"
- "mark-processed!"
- "process-one"))
- "process-boosted"
- "process-sse"
- "bind-inline-handlers"
- "process-emit-elements"))
- "process-one"
- (code :arity 1
- :bytecode (20 0 0 16 0 48 1 17 1 16 1 33 41 0 20 2 0 16 0 1 3 0 48 2 52 1 0 1 33 20 0 20 4 0 16 0 16 1 48 2 5 20 5 0 16 0 49 1 32 1 0 2 32 1 0 2 50)
- :constants (
- "get-verb-info"
- "not"
- "dom-has-attr?"
- "sx-disable"
- "bind-triggers"
- "bind-preload-for"))
- "process-emit-elements"
- (code :arity 1
- :bytecode (20 0 0 16 0 6 34 6 0 5 20 1 0 48 0 1 2 0 48 2 17 1 51 4 0 16 1 52 3 0 2 50)
- :constants (
- "dom-query-all"
- "dom-body"
- "[data-sx-emit]"
- "for-each"
- (code :arity 1
- :bytecode (20 1 0 16 0 1 2 0 48 2 52 0 0 1 33 52 0 20 3 0 16 0 1 2 0 48 2 5 20 4 0 16 0 1 5 0 48 2 17 1 16 1 33 20 0 20 6 0 16 0 1 7 0 51 8 0 1 0 1 1 49 3 32 1 0 2 32 1 0 2 50)
- :constants (
- "not"
- "is-processed?"
- "emit"
- "mark-processed!"
- "dom-get-attr"
- "data-sx-emit"
- "dom-on"
- "click"
- (code :arity 1 :upvalue-count 2
- :bytecode (20 0 0 18 0 1 1 0 48 2 17 1 16 1 33 10 0 20 2 0 16 1 48 1 32 4 0 52 3 0 0 17 2 20 4 0 18 0 18 1 16 2 49 3 50)
- :constants (
- "dom-get-attr"
- "data-sx-emit-detail"
- "json-parse"
- "dict"
- "dom-dispatch"))))))
- "handle-popstate"
- (code :arity 1
- :bytecode (20 0 0 48 0 17 1 20 1 0 1 2 0 48 1 17 2 16 2 33 44 0 20 3 0 16 2 1 4 0 48 2 17 4 16 4 6 33 14 0 5 16 4 1 7 0 52 6 0 2 52 5 0 1 33 5 0 16 4 32 1 0 2 32 1 0 2 17 3 16 3 6 34 4 0 5 1 8 0 17 3 20 1 0 16 3 48 1 17 4 20 9 0 16 1 48 1 17 5 16 4 33 58 0 20 10 0 16 5 16 3 48 2 33 13 0 20 11 0 1 12 0 16 0 49 2 32 30 0 20 13 0 16 4 20 14 0 48 0 20 15 0 48 3 17 6 20 16 0 16 4 16 1 16 6 16 0 49 4 32 1 0 2 50)
- :constants (
- "browser-location-href"
- "dom-query"
- "[sx-boost]"
- "dom-get-attr"
- "sx-boost"
- "not"
- "="
- "true"
- "#main-panel"
- "url-pathname"
- "try-client-route"
- "browser-scroll-to"
- 0
- "build-request-headers"
- "loaded-component-names"
- "_css-hash"
- "fetch-and-restore"))
- "engine-init"
- (code
- :bytecode (20 0 0 48 0 5 20 1 0 2 48 1 5 20 2 0 2 48 1 5 20 3 0 2 49 1 50)
- :constants (
- "init-css-tracking"
- "sx-process-scripts"
- "sx-hydrate"
- "process-elements")))))
diff --git a/shared/static/wasm/sx/orchestration.sxbc.json b/shared/static/wasm/sx/orchestration.sxbc.json
deleted file mode 100644
index 8bd538e9..00000000
--- a/shared/static/wasm/sx/orchestration.sxbc.json
+++ /dev/null
@@ -1 +0,0 @@
-{"magic":"SXBC","version":1,"hash":"1056e285184b2535","module":{"bytecode":[52,1,0,0,128,0,0,5,1,3,0,128,2,0,5,51,5,0,128,4,0,5,51,7,0,128,6,0,5,51,9,0,128,8,0,5,51,11,0,128,10,0,5,51,13,0,128,12,0,5,51,15,0,128,14,0,5,51,17,0,128,16,0,5,51,19,0,128,18,0,5,51,21,0,128,20,0,5,51,23,0,128,22,0,5,51,25,0,128,24,0,5,51,27,0,128,26,0,5,51,29,0,128,28,0,5,51,31,0,128,30,0,5,51,33,0,128,32,0,5,51,35,0,128,34,0,5,51,37,0,128,36,0,5,52,1,0,0,128,38,0,5,1,40,0,128,39,0,5,51,42,0,128,41,0,5,51,44,0,128,43,0,5,51,46,0,128,45,0,5,51,48,0,128,47,0,5,51,50,0,128,49,0,5,51,52,0,128,51,0,5,51,54,0,128,53,0,5,52,1,0,0,128,55,0,5,51,57,0,128,56,0,5,51,59,0,128,58,0,5,51,61,0,128,60,0,5,51,63,0,128,62,0,5,3,128,64,0,5,52,66,0,0,128,65,0,5,51,68,0,128,67,0,5,51,70,0,128,69,0,5,51,72,0,128,71,0,5,51,74,0,128,73,0,5,51,76,0,128,75,0,5,51,78,0,128,77,0,5,51,80,0,128,79,0,5,51,82,0,128,81,0,5,51,84,0,128,83,0,5,51,86,0,128,85,0,5,51,88,0,128,87,0,5,51,90,0,128,89,0,5,51,92,0,128,91,0,5,51,94,0,128,93,0,5,51,96,0,128,95,0,5,51,98,0,128,97,0,5,51,100,0,128,99,0,5,51,102,0,128,101,0,5,1,105,0,52,104,0,1,128,103,0,5,51,107,0,128,106,0,5,51,109,0,128,108,0,5,51,111,0,128,110,0,5,51,113,0,128,112,0,5,51,115,0,128,114,0,50],"constants":[{"t":"s","v":"_preload-cache"},{"t":"s","v":"dict"},{"t":"s","v":"_css-hash"},{"t":"s","v":""},{"t":"s","v":"dispatch-trigger-events"},{"t":"code","v":{"bytecode":[16,1,33,55,0,20,0,0,16,1,48,1,17,2,16,2,33,20,0,51,2,0,1,0,1,2,16,2,52,3,0,1,52,1,0,2,32,18,0,51,4,0,1,0,16,1,1,6,0,52,5,0,2,52,1,0,2,32,1,0,2,50],"constants":[{"t":"s","v":"try-parse-json"},{"t":"s","v":"for-each"},{"t":"code","v":{"bytecode":[20,0,0,18,0,16,0,18,1,16,0,52,1,0,2,49,3,50],"constants":[{"t":"s","v":"dom-dispatch"},{"t":"s","v":"get"}],"arity":1,"upvalue-count":2}},{"t":"s","v":"keys"},{"t":"code","v":{"bytecode":[16,0,52,0,0,1,17,1,16,1,52,2,0,1,52,1,0,1,33,16,0,20,3,0,18,0,16,1,52,4,0,0,49,3,32,1,0,2,50],"constants":[{"t":"s","v":"trim"},{"t":"s","v":"not"},{"t":"s","v":"empty?"},{"t":"s","v":"dom-dispatch"},{"t":"s","v":"dict"}],"arity":1,"upvalue-count":1}},{"t":"s","v":"split"},{"t":"s","v":","}],"arity":2}},{"t":"s","v":"init-css-tracking"},{"t":"code","v":{"bytecode":[20,0,0,1,1,0,48,1,17,0,16,0,33,29,0,20,2,0,16,0,1,3,0,48,2,17,1,16,1,33,8,0,16,1,21,4,0,32,1,0,2,32,1,0,2,50],"constants":[{"t":"s","v":"dom-query"},{"t":"s","v":"meta[name=\"sx-css-classes\"]"},{"t":"s","v":"dom-get-attr"},{"t":"s","v":"content"},{"t":"s","v":"_css-hash"}]}},{"t":"s","v":"execute-request"},{"t":"code","v":{"bytecode":[20,0,0,16,0,48,1,6,34,3,0,5,16,1,17,3,16,3,52,1,0,1,33,9,0,20,2,0,2,49,1,32,249,0,16,3,1,4,0,52,3,0,2,17,4,16,3,1,5,0,52,3,0,2,17,5,20,6,0,16,0,1,7,0,48,2,17,6,16,6,6,33,12,0,5,20,9,0,16,6,48,1,52,8,0,1,33,9,0,20,2,0,2,49,1,32,185,0,20,6,0,16,0,1,10,0,48,2,17,6,16,6,6,33,12,0,5,20,11,0,16,6,48,1,52,8,0,1,33,9,0,20,2,0,2,49,1,32,143,0,20,6,0,16,0,1,12,0,48,2,17,6,16,6,33,10,0,20,13,0,16,6,48,1,32,1,0,2,17,7,16,6,6,33,7,0,5,16,7,52,1,0,1,33,9,0,20,2,0,2,49,1,32,88,0,16,4,52,1,0,1,6,34,23,0,5,16,5,52,1,0,1,6,34,12,0,5,20,14,0,16,0,48,1,52,8,0,1,33,9,0,20,2,0,2,49,1,32,43,0,20,15,0,16,0,16,4,16,4,16,5,16,7,33,23,0,16,2,6,34,5,0,5,52,17,0,0,1,18,0,16,7,52,16,0,3,32,2,0,16,2,49,5,50],"constants":[{"t":"s","v":"get-verb-info"},{"t":"s","v":"nil?"},{"t":"s","v":"promise-resolve"},{"t":"s","v":"get"},{"t":"s","v":"method"},{"t":"s","v":"url"},{"t":"s","v":"dom-get-attr"},{"t":"s","v":"sx-media"},{"t":"s","v":"not"},{"t":"s","v":"browser-media-matches?"},{"t":"s","v":"sx-confirm"},{"t":"s","v":"browser-confirm"},{"t":"s","v":"sx-prompt"},{"t":"s","v":"browser-prompt"},{"t":"s","v":"validate-for-request"},{"t":"s","v":"do-fetch"},{"t":"s","v":"assoc"},{"t":"s","v":"dict"},{"t":"s","v":"SX-Prompt"}],"arity":3}},{"t":"s","v":"do-fetch"},{"t":"code","v":{"bytecode":[20,0,0,16,0,1,1,0,48,2,17,5,16,5,1,3,0,52,2,0,2,33,10,0,20,4,0,16,0,48,1,32,1,0,2,5,20,5,0,16,0,48,1,17,6,16,6,6,33,13,0,5,16,0,16,6,52,7,0,2,52,6,0,1,33,10,0,20,8,0,16,6,48,1,32,1,0,2,5,20,9,0,48,0,17,6,20,10,0,16,0,16,6,48,2,5,20,5,0,16,0,48,1,17,7,16,7,33,12,0,20,11,0,16,7,16,6,48,2,32,1,0,2,5,20,12,0,16,0,16,2,16,3,48,3,17,7,16,7,1,14,0,52,13,0,2,17,8,16,7,1,15,0,52,13,0,2,17,9,16,7,1,16,0,52,13,0,2,17,10,20,17,0,16,0,20,18,0,48,0,20,19,0,48,3,17,11,20,20,0,48,0,17,12,16,4,33,20,0,51,22,0,1,11,1,4,16,4,52,23,0,1,52,21,0,2,32,1,0,2,5,16,10,33,14,0,16,11,1,25,0,16,10,52,24,0,3,32,1,0,2,5,16,12,33,14,0,16,11,1,26,0,16,12,52,24,0,3,32,1,0,2,5,20,27,0,20,28,0,16,8,48,2,17,13,20,29,0,16,0,48,1,17,14,20,30,0,16,0,48,1,17,15,20,31,0,16,0,48,1,17,16,20,32,0,16,0,1,33,0,48,2,5,20,34,0,16,0,1,35,0,1,36,0,48,3,5,20,37,0,16,0,1,38,0,1,14,0,16,8,1,40,0,16,2,52,39,0,4,48,3,5,20,41,0,1,14,0,16,8,1,40,0,16,2,1,42,0,16,11,1,15,0,16,9,1,43,0,20,44,0,16,6,48,1,1,45,0,20,46,0,16,8,48,1,1,47,0,16,13,52,39,0,14,51,48,0,1,0,1,15,1,16,1,14,1,8,1,1,1,4,1,2,51,49,0,1,0,1,15,1,16,1,14,1,2,1,8,49,3,50],"constants":[{"t":"s","v":"dom-get-attr"},{"t":"s","v":"sx-sync"},{"t":"s","v":"="},{"t":"s","v":"replace"},{"t":"s","v":"abort-previous"},{"t":"s","v":"resolve-target"},{"t":"s","v":"not"},{"t":"s","v":"identical?"},{"t":"s","v":"abort-previous-target"},{"t":"s","v":"new-abort-controller"},{"t":"s","v":"track-controller"},{"t":"s","v":"track-controller-target"},{"t":"s","v":"build-request-body"},{"t":"s","v":"get"},{"t":"s","v":"url"},{"t":"s","v":"body"},{"t":"s","v":"content-type"},{"t":"s","v":"build-request-headers"},{"t":"s","v":"loaded-component-names"},{"t":"s","v":"_css-hash"},{"t":"s","v":"csrf-token"},{"t":"s","v":"for-each"},{"t":"code","v":{"bytecode":[18,0,16,0,18,1,16,0,52,1,0,2,52,0,0,3,50],"constants":[{"t":"s","v":"dict-set!"},{"t":"s","v":"get"}],"arity":1,"upvalue-count":2}},{"t":"s","v":"keys"},{"t":"s","v":"dict-set!"},{"t":"s","v":"Content-Type"},{"t":"s","v":"X-CSRFToken"},{"t":"s","v":"preload-cache-get"},{"t":"s","v":"_preload-cache"},{"t":"s","v":"apply-optimistic"},{"t":"s","v":"show-indicator"},{"t":"s","v":"disable-elements"},{"t":"s","v":"dom-add-class"},{"t":"s","v":"sx-request"},{"t":"s","v":"dom-set-attr"},{"t":"s","v":"aria-busy"},{"t":"s","v":"true"},{"t":"s","v":"dom-dispatch"},{"t":"s","v":"sx:beforeRequest"},{"t":"s","v":"dict"},{"t":"s","v":"method"},{"t":"s","v":"fetch-request"},{"t":"s","v":"headers"},{"t":"s","v":"signal"},{"t":"s","v":"controller-signal"},{"t":"s","v":"cross-origin"},{"t":"s","v":"cross-origin?"},{"t":"s","v":"preloaded"},{"t":"code","v":{"bytecode":[20,0,0,18,0,18,1,18,2,48,3,5,20,1,0,18,3,48,1,5,16,0,52,2,0,1,33,86,0,20,3,0,18,0,1,4,0,1,6,0,16,1,1,7,0,16,3,52,5,0,4,48,3,5,16,3,6,33,14,0,5,16,3,52,9,0,1,1,10,0,52,8,0,2,33,20,0,20,11,0,18,0,18,4,18,5,18,6,16,2,16,3,49,6,32,15,0,20,12,0,18,0,18,5,18,7,18,4,18,6,49,5,32,37,0,20,3,0,18,0,1,13,0,1,6,0,16,1,52,5,0,2,48,3,5,20,11,0,18,0,18,4,18,5,18,6,16,2,16,3,49,6,50],"constants":[{"t":"s","v":"clear-loading-state"},{"t":"s","v":"revert-optimistic"},{"t":"s","v":"not"},{"t":"s","v":"dom-dispatch"},{"t":"s","v":"sx:responseError"},{"t":"s","v":"dict"},{"t":"s","v":"status"},{"t":"s","v":"text"},{"t":"s","v":">"},{"t":"s","v":"len"},{"t":"n","v":0},{"t":"s","v":"handle-fetch-success"},{"t":"s","v":"handle-retry"},{"t":"s","v":"sx:afterRequest"}],"arity":4,"upvalue-count":8}},{"t":"code","v":{"bytecode":[20,0,0,18,0,18,1,18,2,48,3,5,20,1,0,18,3,48,1,5,20,3,0,16,0,48,1,52,2,0,1,33,47,0,20,4,0,1,6,0,18,4,1,7,0,18,5,1,8,0,16,0,52,5,0,6,48,1,5,20,9,0,18,0,1,10,0,1,12,0,16,0,52,11,0,2,49,3,32,1,0,2,50],"constants":[{"t":"s","v":"clear-loading-state"},{"t":"s","v":"revert-optimistic"},{"t":"s","v":"not"},{"t":"s","v":"abort-error?"},{"t":"s","v":"log-warn"},{"t":"s","v":"str"},{"t":"s","v":"sx:fetch error "},{"t":"s","v":" "},{"t":"s","v":" — "},{"t":"s","v":"dom-dispatch"},{"t":"s","v":"sx:requestError"},{"t":"s","v":"dict"},{"t":"s","v":"error"}],"arity":1,"upvalue-count":6}}],"arity":5}},{"t":"s","v":"handle-fetch-success"},{"t":"code","v":{"bytecode":[20,0,0,16,4,48,1,17,6,16,6,1,2,0,52,1,0,2,17,7,16,7,33,8,0,16,7,21,3,0,32,1,0,2,5,20,4,0,16,0,16,6,1,5,0,52,1,0,2,48,2,5,20,6,0,16,0,16,6,16,5,48,3,5,16,6,1,7,0,52,1,0,2,33,17,0,20,8,0,16,6,1,7,0,52,1,0,2,49,1,32,31,1,16,6,1,9,0,52,1,0,2,33,8,0,20,10,0,49,0,32,11,1,16,6,1,11,0,52,1,0,2,33,17,0,20,12,0,16,6,1,11,0,52,1,0,2,49,1,32,238,0,16,6,1,13,0,52,1,0,2,33,17,0,20,14,0,16,6,1,13,0,52,1,0,2,48,1,32,7,0,20,15,0,16,0,48,1,17,7,20,16,0,16,6,1,17,0,52,1,0,2,6,34,11,0,5,20,18,0,16,0,1,19,0,48,2,20,20,0,20,21,0,48,0,1,22,0,48,2,48,2,17,8,16,8,1,23,0,52,1,0,2,17,9,16,8,1,24,0,52,1,0,2,17,10,16,6,1,25,0,52,1,0,2,6,34,4,0,5,1,26,0,17,11,16,11,1,28,0,52,27,0,2,33,18,0,20,29,0,16,0,16,7,16,5,16,9,16,10,48,5,32,15,0,20,30,0,16,0,16,7,16,5,16,9,16,10,48,5,5,20,4,0,16,0,16,6,1,31,0,52,1,0,2,48,2,5,20,32,0,16,0,16,1,16,6,48,3,5,20,33,0,51,34,0,1,6,1,0,1,35,0,48,2,5,20,36,0,16,0,1,37,0,1,39,0,16,7,1,40,0,16,9,52,38,0,4,49,3,50],"constants":[{"t":"s","v":"process-response-headers"},{"t":"s","v":"get"},{"t":"s","v":"css-hash"},{"t":"s","v":"_css-hash"},{"t":"s","v":"dispatch-trigger-events"},{"t":"s","v":"trigger"},{"t":"s","v":"process-cache-directives"},{"t":"s","v":"redirect"},{"t":"s","v":"browser-navigate"},{"t":"s","v":"refresh"},{"t":"s","v":"browser-reload"},{"t":"s","v":"location"},{"t":"s","v":"fetch-location"},{"t":"s","v":"retarget"},{"t":"s","v":"dom-query"},{"t":"s","v":"resolve-target"},{"t":"s","v":"parse-swap-spec"},{"t":"s","v":"reswap"},{"t":"s","v":"dom-get-attr"},{"t":"s","v":"sx-swap"},{"t":"s","v":"dom-has-class?"},{"t":"s","v":"dom-body"},{"t":"s","v":"sx-transitions"},{"t":"s","v":"style"},{"t":"s","v":"transition"},{"t":"s","v":"content-type"},{"t":"s","v":""},{"t":"s","v":"contains?"},{"t":"s","v":"text/sx"},{"t":"s","v":"handle-sx-response"},{"t":"s","v":"handle-html-response"},{"t":"s","v":"trigger-swap"},{"t":"s","v":"handle-history"},{"t":"s","v":"set-timeout"},{"t":"code","v":{"bytecode":[18,0,1,1,0,52,0,0,2,33,19,0,20,2,0,18,1,18,0,1,1,0,52,0,0,2,48,2,32,1,0,2,5,20,3,0,18,1,49,1,50],"constants":[{"t":"s","v":"get"},{"t":"s","v":"trigger-settle"},{"t":"s","v":"dispatch-trigger-events"},{"t":"s","v":"process-settle-hooks"}],"upvalue-count":2}},{"t":"n","v":20},{"t":"s","v":"dom-dispatch"},{"t":"s","v":"sx:afterSwap"},{"t":"s","v":"dict"},{"t":"s","v":"target"},{"t":"s","v":"swap"}],"arity":6}},{"t":"s","v":"handle-sx-response"},{"t":"code","v":{"bytecode":[20,0,0,16,2,48,1,17,5,20,1,0,16,5,48,1,17,6,16,6,52,2,0,1,17,7,16,7,52,4,0,1,52,3,0,1,33,106,0,20,5,0,16,7,48,1,17,8,20,6,0,1,7,0,2,48,2,17,9,20,8,0,16,9,16,8,48,2,5,20,9,0,16,9,51,10,0,48,2,5,20,11,0,16,0,1,12,0,48,2,17,10,16,10,33,12,0,20,13,0,16,9,16,10,48,2,32,7,0,20,14,0,16,9,48,1,17,11,20,15,0,16,1,48,1,5,20,16,0,16,4,51,17,0,1,1,1,11,1,3,49,2,32,1,0,2,50],"constants":[{"t":"s","v":"strip-component-scripts"},{"t":"s","v":"extract-response-css"},{"t":"s","v":"trim"},{"t":"s","v":"not"},{"t":"s","v":"empty?"},{"t":"s","v":"sx-render"},{"t":"s","v":"dom-create-element"},{"t":"s","v":"div"},{"t":"s","v":"dom-append"},{"t":"s","v":"process-oob-swaps"},{"t":"code","v":{"bytecode":[20,0,0,16,0,48,1,5,20,1,0,16,0,16,1,16,2,48,3,5,20,2,0,16,0,48,1,5,20,3,0,16,0,49,1,50],"constants":[{"t":"s","v":"dispose-islands-in"},{"t":"s","v":"swap-dom-nodes"},{"t":"s","v":"sx-hydrate"},{"t":"s","v":"process-elements"}],"arity":3}},{"t":"s","v":"dom-get-attr"},{"t":"s","v":"sx-select"},{"t":"s","v":"select-from-container"},{"t":"s","v":"children-to-fragment"},{"t":"s","v":"dispose-islands-in"},{"t":"s","v":"with-transition"},{"t":"code","v":{"bytecode":[20,0,0,18,0,18,1,18,2,48,3,17,0,20,1,0,16,0,6,34,3,0,5,18,0,49,1,50],"constants":[{"t":"s","v":"swap-dom-nodes"},{"t":"s","v":"post-swap"}],"upvalue-count":3}}],"arity":5}},{"t":"s","v":"handle-html-response"},{"t":"code","v":{"bytecode":[20,0,0,16,2,48,1,17,5,16,5,33,119,0,20,1,0,16,0,1,2,0,48,2,17,6,20,3,0,16,1,48,1,5,16,6,33,30,0,20,4,0,16,5,16,6,48,2,17,7,20,5,0,16,4,51,6,0,1,1,1,7,1,3,49,2,32,61,0,20,7,0,1,8,0,2,48,2,17,7,20,9,0,16,7,20,10,0,16,5,48,1,48,2,5,20,11,0,16,7,51,12,0,48,2,5,20,13,0,16,7,48,1,5,20,5,0,16,4,51,14,0,1,1,1,7,1,3,49,2,32,1,0,2,50],"constants":[{"t":"s","v":"dom-parse-html-document"},{"t":"s","v":"dom-get-attr"},{"t":"s","v":"sx-select"},{"t":"s","v":"dispose-islands-in"},{"t":"s","v":"select-html-from-doc"},{"t":"s","v":"with-transition"},{"t":"code","v":{"bytecode":[20,0,0,18,0,18,1,18,2,48,3,5,20,1,0,18,0,49,1,50],"constants":[{"t":"s","v":"swap-html-string"},{"t":"s","v":"post-swap"}],"upvalue-count":3}},{"t":"s","v":"dom-create-element"},{"t":"s","v":"div"},{"t":"s","v":"dom-set-inner-html"},{"t":"s","v":"dom-body-inner-html"},{"t":"s","v":"process-oob-swaps"},{"t":"code","v":{"bytecode":[20,0,0,16,0,48,1,5,20,1,0,16,0,16,1,16,2,48,3,5,20,2,0,16,0,49,1,50],"constants":[{"t":"s","v":"dispose-islands-in"},{"t":"s","v":"swap-dom-nodes"},{"t":"s","v":"post-swap"}],"arity":3}},{"t":"s","v":"hoist-head-elements"},{"t":"code","v":{"bytecode":[20,0,0,18,0,20,1,0,18,1,48,1,18,2,48,3,5,20,2,0,18,0,49,1,50],"constants":[{"t":"s","v":"swap-dom-nodes"},{"t":"s","v":"children-to-fragment"},{"t":"s","v":"post-swap"}],"upvalue-count":3}}],"arity":5}},{"t":"s","v":"handle-retry"},{"t":"code","v":{"bytecode":[20,0,0,16,0,1,1,0,48,2,17,5,20,2,0,16,5,48,1,17,6,16,6,33,97,0,20,0,0,16,0,1,3,0,48,2,6,34,10,0,5,16,6,1,5,0,52,4,0,2,17,7,16,7,16,6,1,5,0,52,4,0,2,52,6,0,2,17,8,20,7,0,16,0,1,3,0,20,9,0,16,8,16,6,1,10,0,52,4,0,2,48,2,52,8,0,1,48,3,5,20,11,0,51,12,0,1,0,1,1,1,2,1,3,1,4,16,8,49,2,32,1,0,2,50],"constants":[{"t":"s","v":"dom-get-attr"},{"t":"s","v":"sx-retry"},{"t":"s","v":"parse-retry-spec"},{"t":"s","v":"data-sx-retry-ms"},{"t":"s","v":"get"},{"t":"s","v":"start-ms"},{"t":"s","v":"parse-int"},{"t":"s","v":"dom-set-attr"},{"t":"s","v":"str"},{"t":"s","v":"next-retry-ms"},{"t":"s","v":"cap-ms"},{"t":"s","v":"set-timeout"},{"t":"code","v":{"bytecode":[20,0,0,18,0,18,1,18,2,18,3,18,4,49,5,50],"constants":[{"t":"s","v":"do-fetch"}],"upvalue-count":5}}],"arity":5}},{"t":"s","v":"bind-triggers"},{"t":"code","v":{"bytecode":[20,0,0,20,1,0,16,0,1,2,0,48,2,48,1,6,34,13,0,5,20,3,0,20,4,0,16,0,48,1,48,1,17,2,51,6,0,1,0,1,1,16,2,52,5,0,2,50],"constants":[{"t":"s","v":"parse-trigger-spec"},{"t":"s","v":"dom-get-attr"},{"t":"s","v":"sx-trigger"},{"t":"s","v":"default-trigger"},{"t":"s","v":"dom-tag-name"},{"t":"s","v":"for-each"},{"t":"code","v":{"bytecode":[20,0,0,16,0,48,1,17,1,16,0,1,2,0,52,1,0,2,17,2,16,1,1,4,0,52,3,0,2,33,22,0,20,5,0,51,6,0,0,0,16,2,1,7,0,52,1,0,2,49,2,32,152,0,16,1,1,8,0,52,3,0,2,33,25,0,20,9,0,18,0,51,6,0,0,0,4,16,2,1,10,0,52,1,0,2,49,4,32,115,0,16,1,1,11,0,52,3,0,2,33,30,0,20,12,0,51,6,0,0,0,16,2,1,10,0,52,1,0,2,6,34,4,0,5,1,13,0,49,2,32,73,0,16,1,1,14,0,52,3,0,2,33,25,0,20,9,0,18,0,51,6,0,0,0,3,16,2,1,10,0,52,1,0,2,49,4,32,36,0,16,1,1,15,0,52,3,0,2,33,23,0,20,16,0,18,0,16,0,1,15,0,52,1,0,2,16,2,18,1,49,4,32,1,0,2,50],"constants":[{"t":"s","v":"classify-trigger"},{"t":"s","v":"get"},{"t":"s","v":"modifiers"},{"t":"s","v":"="},{"t":"s","v":"poll"},{"t":"s","v":"set-interval"},{"t":"code","v":{"bytecode":[20,0,0,18,0,2,2,49,3,50],"constants":[{"t":"s","v":"execute-request"}],"upvalue-count":1}},{"t":"s","v":"interval"},{"t":"s","v":"intersect"},{"t":"s","v":"observe-intersection"},{"t":"s","v":"delay"},{"t":"s","v":"load"},{"t":"s","v":"set-timeout"},{"t":"n","v":0},{"t":"s","v":"revealed"},{"t":"s","v":"event"},{"t":"s","v":"bind-event"}],"arity":1,"upvalue-count":2}}],"arity":2}},{"t":"s","v":"bind-event"},{"t":"code","v":{"bytecode":[2,17,4,2,17,5,16,2,1,1,0,52,0,0,2,33,17,0,20,2,0,16,2,1,1,0,52,0,0,2,48,1,32,2,0,16,0,17,6,16,6,33,49,0,20,3,0,16,6,16,1,51,4,0,1,2,1,0,1,5,1,1,1,4,16,2,1,5,0,52,0,0,2,33,11,0,1,5,0,3,52,6,0,2,32,1,0,2,49,4,32,1,0,2,50],"constants":[{"t":"s","v":"get"},{"t":"s","v":"from"},{"t":"s","v":"dom-query"},{"t":"s","v":"dom-add-listener"},{"t":"code","v":{"bytecode":[3,17,1,18,0,1,1,0,52,0,0,2,33,33,0,20,2,0,18,1,48,1,17,2,16,2,18,2,52,3,0,2,33,6,0,4,17,1,32,4,0,16,2,19,2,32,1,0,2,5,16,1,6,33,26,0,5,18,3,1,5,0,52,3,0,2,6,33,8,0,5,20,6,0,16,0,48,1,52,4,0,1,33,36,1,18,3,1,7,0,52,3,0,2,6,34,25,0,5,18,3,1,5,0,52,3,0,2,6,33,11,0,5,20,8,0,18,1,1,9,0,48,2,33,10,0,20,10,0,16,0,48,1,32,1,0,2,5,20,11,0,18,1,48,1,17,2,18,3,1,5,0,52,3,0,2,6,33,50,0,5,16,2,1,12,0,52,0,0,2,1,13,0,52,3,0,2,6,33,29,0,5,20,8,0,18,1,1,9,0,48,2,6,33,14,0,5,18,0,1,14,0,52,0,0,2,52,4,0,1,17,3,4,17,4,16,3,33,34,0,20,15,0,20,16,0,16,2,1,17,0,52,0,0,2,48,1,20,18,0,18,1,1,19,0,48,2,48,2,17,4,32,1,0,2,5,16,4,33,29,0,20,20,0,16,2,1,17,0,52,0,0,2,48,1,5,20,21,0,1,22,0,1,22,0,49,2,32,84,0,16,3,33,24,0,20,23,0,1,25,0,16,2,1,17,0,52,0,0,2,52,24,0,2,48,1,32,1,0,2,5,18,0,1,14,0,52,0,0,2,33,32,0,20,26,0,18,4,48,1,5,20,27,0,51,28,0,0,1,18,0,1,14,0,52,0,0,2,48,2,19,4,32,9,0,20,29,0,18,1,2,2,49,3,32,1,0,2,50],"constants":[{"t":"s","v":"get"},{"t":"s","v":"changed"},{"t":"s","v":"dom-value"},{"t":"s","v":"="},{"t":"s","v":"not"},{"t":"s","v":"click"},{"t":"s","v":"event-modifier-key?"},{"t":"s","v":"submit"},{"t":"s","v":"dom-has-attr?"},{"t":"s","v":"href"},{"t":"s","v":"prevent-default"},{"t":"s","v":"get-verb-info"},{"t":"s","v":"method"},{"t":"s","v":"GET"},{"t":"s","v":"delay"},{"t":"s","v":"try-client-route"},{"t":"s","v":"url-pathname"},{"t":"s","v":"url"},{"t":"s","v":"dom-get-attr"},{"t":"s","v":"sx-target"},{"t":"s","v":"browser-push-state"},{"t":"s","v":"browser-scroll-to"},{"t":"n","v":0},{"t":"s","v":"log-info"},{"t":"s","v":"str"},{"t":"s","v":"sx:route server fetch "},{"t":"s","v":"clear-timeout"},{"t":"s","v":"set-timeout"},{"t":"code","v":{"bytecode":[20,0,0,18,0,2,2,49,3,50],"constants":[{"t":"s","v":"execute-request"}],"upvalue-count":1}},{"t":"s","v":"execute-request"}],"arity":1,"upvalue-count":5}},{"t":"s","v":"once"},{"t":"s","v":"dict"}],"arity":4}},{"t":"s","v":"post-swap"},{"t":"code","v":{"bytecode":[20,0,0,1,2,0,16,0,33,10,0,20,3,0,16,0,48,1,32,3,0,1,4,0,52,1,0,2,48,1,5,20,5,0,16,0,48,1,5,20,6,0,16,0,48,1,5,20,7,0,16,0,48,1,5,20,8,0,16,0,48,1,5,20,9,0,48,0,5,20,10,0,16,0,49,1,50],"constants":[{"t":"s","v":"log-info"},{"t":"s","v":"str"},{"t":"s","v":"post-swap: root="},{"t":"s","v":"dom-tag-name"},{"t":"s","v":"nil"},{"t":"s","v":"activate-scripts"},{"t":"s","v":"sx-process-scripts"},{"t":"s","v":"sx-hydrate"},{"t":"s","v":"sx-hydrate-islands"},{"t":"s","v":"run-post-render-hooks"},{"t":"s","v":"process-elements"}],"arity":1}},{"t":"s","v":"process-settle-hooks"},{"t":"code","v":{"bytecode":[20,0,0,16,0,1,1,0,48,2,17,1,16,1,6,33,11,0,5,16,1,52,3,0,1,52,2,0,1,33,21,0,20,4,0,16,1,48,1,17,2,51,6,0,16,2,52,5,0,2,32,1,0,2,50],"constants":[{"t":"s","v":"dom-get-attr"},{"t":"s","v":"sx-on-settle"},{"t":"s","v":"not"},{"t":"s","v":"empty?"},{"t":"s","v":"sx-parse"},{"t":"s","v":"for-each"},{"t":"code","v":{"bytecode":[20,0,0,16,0,20,1,0,52,2,0,0,48,1,49,2,50],"constants":[{"t":"s","v":"eval-expr"},{"t":"s","v":"env-extend"},{"t":"s","v":"dict"}],"arity":1}}],"arity":1}},{"t":"s","v":"activate-scripts"},{"t":"code","v":{"bytecode":[16,0,33,24,0,20,0,0,16,0,1,1,0,48,2,17,1,51,3,0,16,1,52,2,0,2,32,1,0,2,50],"constants":[{"t":"s","v":"dom-query-all"},{"t":"s","v":"script"},{"t":"s","v":"for-each"},{"t":"code","v":{"bytecode":[20,1,0,16,0,1,2,0,48,2,52,0,0,1,6,33,15,0,5,20,1,0,16,0,1,3,0,48,2,52,0,0,1,33,42,0,20,4,0,16,0,48,1,17,1,20,5,0,16,1,1,3,0,1,6,0,48,3,5,20,7,0,20,8,0,16,0,48,1,16,1,16,0,49,3,32,1,0,2,50],"constants":[{"t":"s","v":"not"},{"t":"s","v":"dom-has-attr?"},{"t":"s","v":"data-components"},{"t":"s","v":"data-sx-activated"},{"t":"s","v":"create-script-clone"},{"t":"s","v":"dom-set-attr"},{"t":"s","v":"true"},{"t":"s","v":"dom-replace-child"},{"t":"s","v":"dom-parent"}],"arity":1}}],"arity":1}},{"t":"s","v":"process-oob-swaps"},{"t":"code","v":{"bytecode":[20,0,0,16,0,48,1,17,2,51,2,0,1,1,16,2,52,1,0,2,50],"constants":[{"t":"s","v":"find-oob-swaps"},{"t":"s","v":"for-each"},{"t":"code","v":{"bytecode":[16,0,1,1,0,52,0,0,2,17,1,20,2,0,16,1,48,1,17,2,16,0,1,3,0,52,0,0,2,17,3,16,0,1,4,0,52,0,0,2,17,4,20,5,0,16,3,48,1,33,17,0,20,6,0,20,5,0,16,3,48,1,16,3,48,2,32,1,0,2,5,16,2,33,13,0,18,0,16,2,16,3,16,4,49,3,32,1,0,2,50],"constants":[{"t":"s","v":"get"},{"t":"s","v":"target-id"},{"t":"s","v":"dom-query-by-id"},{"t":"s","v":"element"},{"t":"s","v":"swap-type"},{"t":"s","v":"dom-parent"},{"t":"s","v":"dom-remove-child"}],"arity":1,"upvalue-count":1}}],"arity":2}},{"t":"s","v":"hoist-head-elements"},{"t":"code","v":{"bytecode":[51,1,0,20,2,0,16,0,1,3,0,48,2,52,0,0,2,5,51,1,0,20,2,0,16,0,1,4,0,48,2,52,0,0,2,50],"constants":[{"t":"s","v":"for-each"},{"t":"code","v":{"bytecode":[20,0,0,16,0,48,1,33,17,0,20,1,0,20,0,0,16,0,48,1,16,0,48,2,32,1,0,2,5,20,2,0,16,0,49,1,50],"constants":[{"t":"s","v":"dom-parent"},{"t":"s","v":"dom-remove-child"},{"t":"s","v":"dom-append-to-head"}],"arity":1}},{"t":"s","v":"dom-query-all"},{"t":"s","v":"style[data-sx-css]"},{"t":"s","v":"link[rel=\"stylesheet\"]"}],"arity":1}},{"t":"s","v":"process-boosted"},{"t":"code","v":{"bytecode":[51,1,0,20,2,0,16,0,6,34,6,0,5,20,3,0,48,0,1,4,0,48,2,52,0,0,2,50],"constants":[{"t":"s","v":"for-each"},{"t":"code","v":{"bytecode":[20,0,0,16,0,49,1,50],"constants":[{"t":"s","v":"boost-descendants"}],"arity":1}},{"t":"s","v":"dom-query-all"},{"t":"s","v":"dom-body"},{"t":"s","v":"[sx-boost]"}],"arity":1}},{"t":"s","v":"boost-descendants"},{"t":"code","v":{"bytecode":[20,0,0,16,0,1,1,0,48,2,17,1,51,3,0,1,1,20,4,0,16,0,1,5,0,48,2,52,2,0,2,5,51,6,0,1,1,20,4,0,16,0,1,7,0,48,2,52,2,0,2,50],"constants":[{"t":"s","v":"dom-get-attr"},{"t":"s","v":"sx-boost"},{"t":"s","v":"for-each"},{"t":"code","v":{"bytecode":[20,1,0,16,0,1,2,0,48,2,52,0,0,1,6,33,8,0,5,20,3,0,16,0,48,1,33,160,0,20,4,0,16,0,1,2,0,48,2,5,20,5,0,16,0,1,6,0,48,2,52,0,0,1,6,33,21,0,5,18,0,6,33,14,0,5,18,0,1,8,0,52,7,0,2,52,0,0,1,33,15,0,20,9,0,16,0,1,6,0,18,0,48,3,32,1,0,2,5,20,5,0,16,0,1,10,0,48,2,52,0,0,1,33,16,0,20,9,0,16,0,1,10,0,1,11,0,48,3,32,1,0,2,5,20,5,0,16,0,1,12,0,48,2,52,0,0,1,33,16,0,20,9,0,16,0,1,12,0,1,8,0,48,3,32,1,0,2,5,20,13,0,16,0,20,14,0,16,0,1,15,0,48,2,49,2,32,1,0,2,50],"constants":[{"t":"s","v":"not"},{"t":"s","v":"is-processed?"},{"t":"s","v":"boost"},{"t":"s","v":"should-boost-link?"},{"t":"s","v":"mark-processed!"},{"t":"s","v":"dom-has-attr?"},{"t":"s","v":"sx-target"},{"t":"s","v":"="},{"t":"s","v":"true"},{"t":"s","v":"dom-set-attr"},{"t":"s","v":"sx-swap"},{"t":"s","v":"innerHTML"},{"t":"s","v":"sx-push-url"},{"t":"s","v":"bind-client-route-link"},{"t":"s","v":"dom-get-attr"},{"t":"s","v":"href"}],"arity":1,"upvalue-count":1}},{"t":"s","v":"dom-query-all"},{"t":"s","v":"a[href]"},{"t":"code","v":{"bytecode":[20,1,0,16,0,1,2,0,48,2,52,0,0,1,6,33,8,0,5,20,3,0,16,0,48,1,33,165,0,20,4,0,16,0,1,2,0,48,2,5,20,6,0,16,0,1,7,0,48,2,6,34,4,0,5,1,8,0,52,5,0,1,17,1,20,6,0,16,0,1,9,0,48,2,6,34,6,0,5,20,10,0,48,0,17,2,20,11,0,16,0,1,12,0,48,2,52,0,0,1,6,33,21,0,5,18,0,6,33,14,0,5,18,0,1,14,0,52,13,0,2,52,0,0,1,33,15,0,20,15,0,16,0,1,12,0,18,0,48,3,32,1,0,2,5,20,11,0,16,0,1,16,0,48,2,52,0,0,1,33,16,0,20,15,0,16,0,1,16,0,1,17,0,48,3,32,1,0,2,5,20,18,0,16,0,16,1,16,2,49,3,32,1,0,2,50],"constants":[{"t":"s","v":"not"},{"t":"s","v":"is-processed?"},{"t":"s","v":"boost"},{"t":"s","v":"should-boost-form?"},{"t":"s","v":"mark-processed!"},{"t":"s","v":"upper"},{"t":"s","v":"dom-get-attr"},{"t":"s","v":"method"},{"t":"s","v":"GET"},{"t":"s","v":"action"},{"t":"s","v":"browser-location-href"},{"t":"s","v":"dom-has-attr?"},{"t":"s","v":"sx-target"},{"t":"s","v":"="},{"t":"s","v":"true"},{"t":"s","v":"dom-set-attr"},{"t":"s","v":"sx-swap"},{"t":"s","v":"innerHTML"},{"t":"s","v":"bind-boost-form"}],"arity":1,"upvalue-count":1}},{"t":"s","v":"form"}],"arity":1}},{"t":"s","v":"_page-data-cache"},{"t":"s","v":"_page-data-cache-ttl"},{"t":"n","v":30000},{"t":"s","v":"page-data-cache-key"},{"t":"code","v":{"bytecode":[16,0,17,2,16,1,52,0,0,1,6,34,11,0,5,16,1,52,2,0,1,52,1,0,1,33,5,0,16,2,32,42,0,52,3,0,0,17,3,51,5,0,1,3,1,1,16,1,52,2,0,1,52,4,0,2,5,16,2,1,7,0,1,9,0,16,3,52,8,0,2,52,6,0,3,50],"constants":[{"t":"s","v":"nil?"},{"t":"s","v":"empty?"},{"t":"s","v":"keys"},{"t":"s","v":"list"},{"t":"s","v":"for-each"},{"t":"code","v":{"bytecode":[20,0,0,18,0,16,0,1,2,0,18,1,16,0,52,3,0,2,52,1,0,3,49,2,50],"constants":[{"t":"s","v":"append!"},{"t":"s","v":"str"},{"t":"s","v":"="},{"t":"s","v":"get"}],"arity":1,"upvalue-count":2}},{"t":"s","v":"str"},{"t":"s","v":":"},{"t":"s","v":"join"},{"t":"s","v":"&"}],"arity":2}},{"t":"s","v":"page-data-cache-get"},{"t":"code","v":{"bytecode":[20,1,0,16,0,52,0,0,2,17,1,16,1,52,2,0,1,33,4,0,2,32,52,0,20,5,0,48,0,16,1,1,6,0,52,0,0,2,52,4,0,2,20,7,0,52,3,0,2,33,15,0,20,1,0,16,0,2,52,8,0,3,5,2,32,9,0,16,1,1,9,0,52,0,0,2,50],"constants":[{"t":"s","v":"get"},{"t":"s","v":"_page-data-cache"},{"t":"s","v":"nil?"},{"t":"s","v":">"},{"t":"s","v":"-"},{"t":"s","v":"now-ms"},{"t":"s","v":"ts"},{"t":"s","v":"_page-data-cache-ttl"},{"t":"s","v":"dict-set!"},{"t":"s","v":"data"}],"arity":1}},{"t":"s","v":"page-data-cache-set"},{"t":"code","v":{"bytecode":[20,1,0,16,0,1,2,0,16,1,1,3,0,20,4,0,48,0,65,2,0,52,0,0,3,50],"constants":[{"t":"s","v":"dict-set!"},{"t":"s","v":"_page-data-cache"},{"t":"s","v":"data"},{"t":"s","v":"ts"},{"t":"s","v":"now-ms"}],"arity":2}},{"t":"s","v":"invalidate-page-cache"},{"t":"code","v":{"bytecode":[51,1,0,1,0,20,3,0,52,2,0,1,52,0,0,2,5,20,4,0,1,5,0,1,6,0,1,7,0,16,0,65,2,0,48,1,5,20,8,0,1,10,0,16,0,52,9,0,2,49,1,50],"constants":[{"t":"s","v":"for-each"},{"t":"code","v":{"bytecode":[16,0,18,0,52,0,0,2,6,34,16,0,5,16,0,18,0,1,3,0,52,2,0,2,52,1,0,2,33,13,0,20,5,0,16,0,2,52,4,0,3,32,1,0,2,50],"constants":[{"t":"s","v":"="},{"t":"s","v":"starts-with?"},{"t":"s","v":"str"},{"t":"s","v":":"},{"t":"s","v":"dict-set!"},{"t":"s","v":"_page-data-cache"}],"arity":1,"upvalue-count":1}},{"t":"s","v":"keys"},{"t":"s","v":"_page-data-cache"},{"t":"s","v":"sw-post-message"},{"t":"s","v":"type"},{"t":"s","v":"invalidate"},{"t":"s","v":"page"},{"t":"s","v":"log-info"},{"t":"s","v":"str"},{"t":"s","v":"sx:cache invalidate "}],"arity":1}},{"t":"s","v":"invalidate-all-page-cache"},{"t":"code","v":{"bytecode":[52,0,0,0,21,1,0,5,20,2,0,1,3,0,1,4,0,1,5,0,1,6,0,65,2,0,48,1,5,20,7,0,1,8,0,49,1,50],"constants":[{"t":"s","v":"dict"},{"t":"s","v":"_page-data-cache"},{"t":"s","v":"sw-post-message"},{"t":"s","v":"type"},{"t":"s","v":"invalidate"},{"t":"s","v":"page"},{"t":"s","v":"*"},{"t":"s","v":"log-info"},{"t":"s","v":"sx:cache invalidate *"}]}},{"t":"s","v":"update-page-cache"},{"t":"code","v":{"bytecode":[20,0,0,16,0,52,1,0,0,48,2,17,2,20,2,0,16,2,16,1,48,2,5,20,3,0,1,5,0,16,0,52,4,0,2,49,1,50],"constants":[{"t":"s","v":"page-data-cache-key"},{"t":"s","v":"dict"},{"t":"s","v":"page-data-cache-set"},{"t":"s","v":"log-info"},{"t":"s","v":"str"},{"t":"s","v":"sx:cache update "}],"arity":2}},{"t":"s","v":"process-cache-directives"},{"t":"code","v":{"bytecode":[20,0,0,16,0,1,1,0,48,2,17,3,16,3,33,30,0,16,3,1,3,0,52,2,0,2,33,8,0,20,4,0,48,0,32,7,0,20,5,0,16,3,48,1,32,1,0,2,5,16,1,1,7,0,52,6,0,2,17,3,16,3,33,30,0,16,3,1,3,0,52,2,0,2,33,8,0,20,4,0,48,0,32,7,0,20,5,0,16,3,48,1,32,1,0,2,5,16,1,1,8,0,52,6,0,2,17,3,16,3,33,30,0,20,9,0,16,2,48,1,17,4,16,4,33,12,0,20,10,0,16,3,16,4,49,2,32,1,0,2,32,1,0,2,50],"constants":[{"t":"s","v":"dom-get-attr"},{"t":"s","v":"sx-cache-invalidate"},{"t":"s","v":"="},{"t":"s","v":"*"},{"t":"s","v":"invalidate-all-page-cache"},{"t":"s","v":"invalidate-page-cache"},{"t":"s","v":"get"},{"t":"s","v":"cache-invalidate"},{"t":"s","v":"cache-update"},{"t":"s","v":"parse-sx-data"},{"t":"s","v":"update-page-cache"}],"arity":3}},{"t":"s","v":"_optimistic-snapshots"},{"t":"s","v":"optimistic-cache-update"},{"t":"code","v":{"bytecode":[20,0,0,16,0,48,1,17,2,16,2,33,35,0,16,1,16,2,48,1,17,3,20,2,0,16,0,16,2,52,1,0,3,5,20,3,0,16,0,16,3,48,2,5,16,3,32,1,0,2,50],"constants":[{"t":"s","v":"page-data-cache-get"},{"t":"s","v":"dict-set!"},{"t":"s","v":"_optimistic-snapshots"},{"t":"s","v":"page-data-cache-set"}],"arity":2}},{"t":"s","v":"optimistic-cache-revert"},{"t":"code","v":{"bytecode":[20,1,0,16,0,52,0,0,2,17,1,16,1,33,25,0,20,2,0,16,0,16,1,48,2,5,20,1,0,16,0,52,3,0,2,5,16,1,32,1,0,2,50],"constants":[{"t":"s","v":"get"},{"t":"s","v":"_optimistic-snapshots"},{"t":"s","v":"page-data-cache-set"},{"t":"s","v":"dict-delete!"}],"arity":1}},{"t":"s","v":"optimistic-cache-confirm"},{"t":"code","v":{"bytecode":[20,1,0,16,0,52,0,0,2,50],"constants":[{"t":"s","v":"dict-delete!"},{"t":"s","v":"_optimistic-snapshots"}],"arity":1}},{"t":"s","v":"submit-mutation"},{"t":"code","v":{"bytecode":[20,0,0,16,0,16,1,48,2,17,6,20,1,0,16,6,16,4,48,2,17,7,16,7,33,14,0,20,2,0,16,0,16,1,16,7,48,3,32,1,0,2,5,20,3,0,16,2,16,3,51,4,0,1,6,1,0,1,1,1,5,51,5,0,1,6,1,0,1,1,1,5,49,4,50],"constants":[{"t":"s","v":"page-data-cache-key"},{"t":"s","v":"optimistic-cache-update"},{"t":"s","v":"try-rerender-page"},{"t":"s","v":"execute-action"},{"t":"code","v":{"bytecode":[16,0,33,12,0,20,0,0,18,0,16,0,48,2,32,1,0,2,5,20,1,0,18,0,48,1,5,16,0,33,14,0,20,2,0,18,1,18,2,16,0,48,3,32,1,0,2,5,20,3,0,1,5,0,18,1,52,4,0,2,48,1,5,18,3,33,10,0,18,3,1,6,0,49,1,32,1,0,2,50],"constants":[{"t":"s","v":"page-data-cache-set"},{"t":"s","v":"optimistic-cache-confirm"},{"t":"s","v":"try-rerender-page"},{"t":"s","v":"log-info"},{"t":"s","v":"str"},{"t":"s","v":"sx:optimistic confirmed "},{"t":"s","v":"confirmed"}],"arity":1,"upvalue-count":4}},{"t":"code","v":{"bytecode":[20,0,0,18,0,48,1,17,1,16,1,33,14,0,20,1,0,18,1,18,2,16,1,48,3,32,1,0,2,5,20,2,0,1,4,0,18,1,1,5,0,16,0,52,3,0,4,48,1,5,18,3,33,10,0,18,3,1,6,0,49,1,32,1,0,2,50],"constants":[{"t":"s","v":"optimistic-cache-revert"},{"t":"s","v":"try-rerender-page"},{"t":"s","v":"log-warn"},{"t":"s","v":"str"},{"t":"s","v":"sx:optimistic reverted "},{"t":"s","v":": "},{"t":"s","v":"reverted"}],"arity":1,"upvalue-count":4}}],"arity":6}},{"t":"s","v":"_is-online"},{"t":"s","v":"_offline-queue"},{"t":"s","v":"list"},{"t":"s","v":"offline-is-online?"},{"t":"code","v":{"bytecode":[20,0,0,50],"constants":[{"t":"s","v":"_is-online"}]}},{"t":"s","v":"offline-set-online!"},{"t":"code","v":{"bytecode":[16,0,21,0,0,50],"constants":[{"t":"s","v":"_is-online"}],"arity":1}},{"t":"s","v":"offline-queue-mutation"},{"t":"code","v":{"bytecode":[20,0,0,16,2,16,3,48,2,17,5,1,2,0,16,0,1,3,0,16,1,1,4,0,16,2,1,5,0,16,3,1,6,0,20,7,0,48,0,1,8,0,1,9,0,52,1,0,12,17,6,20,10,0,20,11,0,16,6,48,2,5,20,12,0,16,5,16,4,48,2,17,7,16,7,33,14,0,20,13,0,16,2,16,3,16,7,48,3,32,1,0,2,5,20,14,0,1,16,0,16,0,1,17,0,20,11,0,52,18,0,1,1,19,0,52,15,0,5,48,1,5,16,6,50],"constants":[{"t":"s","v":"page-data-cache-key"},{"t":"s","v":"dict"},{"t":"s","v":"action"},{"t":"s","v":"payload"},{"t":"s","v":"page"},{"t":"s","v":"params"},{"t":"s","v":"timestamp"},{"t":"s","v":"now-ms"},{"t":"s","v":"status"},{"t":"s","v":"pending"},{"t":"s","v":"append!"},{"t":"s","v":"_offline-queue"},{"t":"s","v":"optimistic-cache-update"},{"t":"s","v":"try-rerender-page"},{"t":"s","v":"log-info"},{"t":"s","v":"str"},{"t":"s","v":"sx:offline queued "},{"t":"s","v":" ("},{"t":"s","v":"len"},{"t":"s","v":" pending)"}],"arity":5}},{"t":"s","v":"offline-sync"},{"t":"code","v":{"bytecode":[51,1,0,20,2,0,52,0,0,2,17,0,16,0,52,4,0,1,52,3,0,1,33,34,0,20,5,0,1,7,0,16,0,52,8,0,1,1,9,0,52,6,0,3,48,1,5,51,11,0,16,0,52,10,0,2,32,1,0,2,50],"constants":[{"t":"s","v":"filter"},{"t":"code","v":{"bytecode":[16,0,1,2,0,52,1,0,2,1,3,0,52,0,0,2,50],"constants":[{"t":"s","v":"="},{"t":"s","v":"get"},{"t":"s","v":"status"},{"t":"s","v":"pending"}],"arity":1}},{"t":"s","v":"_offline-queue"},{"t":"s","v":"not"},{"t":"s","v":"empty?"},{"t":"s","v":"log-info"},{"t":"s","v":"str"},{"t":"s","v":"sx:offline syncing "},{"t":"s","v":"len"},{"t":"s","v":" mutations"},{"t":"s","v":"for-each"},{"t":"code","v":{"bytecode":[20,0,0,16,0,1,2,0,52,1,0,2,16,0,1,3,0,52,1,0,2,51,4,0,1,0,51,5,0,1,0,49,4,50],"constants":[{"t":"s","v":"execute-action"},{"t":"s","v":"get"},{"t":"s","v":"action"},{"t":"s","v":"payload"},{"t":"code","v":{"bytecode":[18,0,1,1,0,1,2,0,52,0,0,3,5,20,3,0,1,5,0,18,0,1,7,0,52,6,0,2,52,4,0,2,49,1,50],"constants":[{"t":"s","v":"dict-set!"},{"t":"s","v":"status"},{"t":"s","v":"synced"},{"t":"s","v":"log-info"},{"t":"s","v":"str"},{"t":"s","v":"sx:offline synced "},{"t":"s","v":"get"},{"t":"s","v":"action"}],"arity":1,"upvalue-count":1}},{"t":"code","v":{"bytecode":[18,0,1,1,0,1,2,0,52,0,0,3,5,20,3,0,1,5,0,18,0,1,7,0,52,6,0,2,1,8,0,16,0,52,4,0,4,49,1,50],"constants":[{"t":"s","v":"dict-set!"},{"t":"s","v":"status"},{"t":"s","v":"failed"},{"t":"s","v":"log-warn"},{"t":"s","v":"str"},{"t":"s","v":"sx:offline sync failed "},{"t":"s","v":"get"},{"t":"s","v":"action"},{"t":"s","v":": "}],"arity":1,"upvalue-count":1}}],"arity":1}}]}},{"t":"s","v":"offline-pending-count"},{"t":"code","v":{"bytecode":[51,2,0,20,3,0,52,1,0,2,52,0,0,1,50],"constants":[{"t":"s","v":"len"},{"t":"s","v":"filter"},{"t":"code","v":{"bytecode":[16,0,1,2,0,52,1,0,2,1,3,0,52,0,0,2,50],"constants":[{"t":"s","v":"="},{"t":"s","v":"get"},{"t":"s","v":"status"},{"t":"s","v":"pending"}],"arity":1}},{"t":"s","v":"_offline-queue"}]}},{"t":"s","v":"offline-aware-mutation"},{"t":"code","v":{"bytecode":[20,0,0,33,20,0,20,1,0,16,0,16,1,16,2,16,3,16,4,16,5,49,6,32,32,0,20,2,0,16,2,16,3,16,0,16,1,16,4,48,5,5,16,5,33,10,0,16,5,1,3,0,49,1,32,1,0,2,50],"constants":[{"t":"s","v":"_is-online"},{"t":"s","v":"submit-mutation"},{"t":"s","v":"offline-queue-mutation"},{"t":"s","v":"queued"}],"arity":6}},{"t":"s","v":"current-page-layout"},{"t":"code","v":{"bytecode":[20,0,0,20,1,0,48,0,48,1,17,0,20,2,0,16,0,20,3,0,48,2,17,1,16,1,52,4,0,1,33,6,0,1,5,0,32,17,0,16,1,1,7,0,52,6,0,2,6,34,4,0,5,1,5,0,50],"constants":[{"t":"s","v":"url-pathname"},{"t":"s","v":"browser-location-href"},{"t":"s","v":"find-matching-route"},{"t":"s","v":"_page-routes"},{"t":"s","v":"nil?"},{"t":"s","v":""},{"t":"s","v":"get"},{"t":"s","v":"layout"}]}},{"t":"s","v":"swap-rendered-content"},{"t":"code","v":{"bytecode":[20,0,0,16,0,48,1,5,20,1,0,16,0,1,2,0,48,2,5,20,3,0,16,0,16,1,48,2,5,20,4,0,16,0,48,1,5,20,5,0,16,0,48,1,5,20,6,0,16,0,48,1,5,20,7,0,16,0,48,1,5,20,8,0,48,0,5,20,9,0,16,0,1,10,0,1,12,0,16,2,52,11,0,2,48,3,5,20,13,0,1,15,0,16,2,52,14,0,2,49,1,50],"constants":[{"t":"s","v":"dispose-islands-in"},{"t":"s","v":"dom-set-text-content"},{"t":"s","v":""},{"t":"s","v":"dom-append"},{"t":"s","v":"hoist-head-elements-full"},{"t":"s","v":"process-elements"},{"t":"s","v":"sx-hydrate-elements"},{"t":"s","v":"sx-hydrate-islands"},{"t":"s","v":"run-post-render-hooks"},{"t":"s","v":"dom-dispatch"},{"t":"s","v":"sx:clientRoute"},{"t":"s","v":"dict"},{"t":"s","v":"pathname"},{"t":"s","v":"log-info"},{"t":"s","v":"str"},{"t":"s","v":"sx:route client "}],"arity":3}},{"t":"s","v":"resolve-route-target"},{"t":"code","v":{"bytecode":[16,0,6,33,14,0,5,16,0,1,2,0,52,1,0,2,52,0,0,1,33,10,0,20,3,0,16,0,49,1,32,1,0,2,50],"constants":[{"t":"s","v":"not"},{"t":"s","v":"="},{"t":"s","v":"true"},{"t":"s","v":"dom-query"}],"arity":1}},{"t":"s","v":"deps-satisfied?"},{"t":"code","v":{"bytecode":[16,0,1,1,0,52,0,0,2,17,1,20,2,0,48,0,17,2,16,1,52,3,0,1,6,34,7,0,5,16,1,52,4,0,1,33,4,0,3,32,11,0,51,6,0,1,2,16,1,52,5,0,2,50],"constants":[{"t":"s","v":"get"},{"t":"s","v":"deps"},{"t":"s","v":"loaded-component-names"},{"t":"s","v":"nil?"},{"t":"s","v":"empty?"},{"t":"s","v":"every?"},{"t":"code","v":{"bytecode":[18,0,16,0,52,0,0,2,50],"constants":[{"t":"s","v":"contains?"}],"arity":1,"upvalue-count":1}}],"arity":1}},{"t":"s","v":"try-client-route"},{"t":"code","v":{"bytecode":[20,0,0,16,0,20,1,0,48,2,17,2,16,2,52,2,0,1,33,29,0,20,3,0,1,5,0,20,1,0,52,6,0,1,1,7,0,16,0,52,4,0,4,48,1,5,4,32,233,2,16,2,1,9,0,52,8,0,2,6,34,4,0,5,1,10,0,17,3,20,11,0,48,0,17,4,16,3,16,4,52,13,0,2,52,12,0,1,33,29,0,20,3,0,1,14,0,16,4,1,15,0,16,3,1,16,0,16,0,52,4,0,6,48,1,5,4,32,163,2,16,2,1,17,0,52,8,0,2,17,5,16,2,1,18,0,52,8,0,2,6,34,4,0,5,65,0,0,17,6,16,2,1,19,0,52,8,0,2,17,7,16,2,1,20,0,52,8,0,2,17,8,16,5,52,2,0,1,6,34,7,0,5,16,5,52,21,0,1,33,19,0,20,22,0,1,23,0,16,0,52,4,0,2,48,1,5,4,32,72,2,20,24,0,16,1,48,1,17,9,16,9,52,2,0,1,33,19,0,20,22,0,1,25,0,16,1,52,4,0,2,48,1,5,4,32,35,2,20,26,0,16,2,48,1,52,12,0,1,33,19,0,20,3,0,1,27,0,16,8,52,4,0,2,48,1,5,4,32,2,2,16,2,1,28,0,52,8,0,2,17,10,16,10,6,33,11,0,5,16,10,52,21,0,1,52,12,0,1,17,11,16,2,1,29,0,52,8,0,2,17,12,16,12,33,78,0,16,12,1,30,0,52,8,0,2,6,34,5,0,5,52,31,0,0,17,13,16,12,1,32,0,52,8,0,2,6,34,5,0,5,52,31,0,0,17,14,20,3,0,1,33,0,16,8,1,34,0,16,13,52,6,0,1,1,35,0,16,14,52,6,0,1,1,36,0,52,4,0,7,48,1,32,1,0,2,5,16,11,33,10,0,20,37,0,16,10,48,1,32,1,0,2,5,16,2,1,38,0,52,8,0,2,33,44,0,20,3,0,1,39,0,16,0,52,4,0,2,48,1,5,20,40,0,16,9,16,0,20,41,0,16,9,20,42,0,48,0,20,43,0,48,3,48,3,5,3,32,59,1,16,2,1,44,0,52,8,0,2,33,194,0,20,45,0,16,8,16,7,48,2,17,13,20,46,0,16,13,48,1,17,14,16,14,33,123,0,16,6,16,7,16,14,52,47,0,3,17,15,16,11,33,36,0,20,3,0,1,48,0,16,0,52,4,0,2,48,1,5,20,49,0,16,5,16,15,51,50,0,1,0,1,9,48,3,5,3,32,67,0,20,51,0,16,5,16,15,48,2,17,16,16,16,52,2,0,1,33,19,0,20,22,0,1,52,0,16,0,52,4,0,2,48,1,5,4,32,28,0,20,3,0,1,53,0,16,0,52,4,0,2,48,1,5,20,54,0,16,9,16,16,16,0,48,3,5,3,32,43,0,20,3,0,1,55,0,16,0,52,4,0,2,48,1,5,20,56,0,16,8,16,7,51,57,0,1,13,1,6,1,7,1,11,1,5,1,0,1,9,48,3,5,3,32,109,0,16,11,33,42,0,20,3,0,1,58,0,16,0,52,4,0,2,48,1,5,20,49,0,16,5,16,6,16,7,52,47,0,2,51,59,0,1,0,1,9,48,3,5,3,32,62,0,16,6,16,7,52,47,0,2,17,13,20,51,0,16,5,16,13,48,2,17,14,16,14,52,2,0,1,33,19,0,20,3,0,1,60,0,16,0,52,4,0,2,48,1,5,4,32,13,0,20,54,0,16,9,16,14,16,0,48,3,5,3,50],"constants":[{"t":"s","v":"find-matching-route"},{"t":"s","v":"_page-routes"},{"t":"s","v":"nil?"},{"t":"s","v":"log-info"},{"t":"s","v":"str"},{"t":"s","v":"sx:route no match ("},{"t":"s","v":"len"},{"t":"s","v":" routes) "},{"t":"s","v":"get"},{"t":"s","v":"layout"},{"t":"s","v":""},{"t":"s","v":"current-page-layout"},{"t":"s","v":"not"},{"t":"s","v":"="},{"t":"s","v":"sx:route server (layout: "},{"t":"s","v":" -> "},{"t":"s","v":") "},{"t":"s","v":"content"},{"t":"s","v":"closure"},{"t":"s","v":"params"},{"t":"s","v":"name"},{"t":"s","v":"empty?"},{"t":"s","v":"log-warn"},{"t":"s","v":"sx:route no content for "},{"t":"s","v":"resolve-route-target"},{"t":"s","v":"sx:route target not found: "},{"t":"s","v":"deps-satisfied?"},{"t":"s","v":"sx:route deps miss for "},{"t":"s","v":"io-deps"},{"t":"s","v":"render-plan"},{"t":"s","v":"server"},{"t":"s","v":"list"},{"t":"s","v":"client"},{"t":"s","v":"sx:route plan "},{"t":"s","v":" — "},{"t":"s","v":" server, "},{"t":"s","v":" client"},{"t":"s","v":"register-io-deps"},{"t":"s","v":"stream"},{"t":"s","v":"sx:route streaming "},{"t":"s","v":"fetch-streaming"},{"t":"s","v":"build-request-headers"},{"t":"s","v":"loaded-component-names"},{"t":"s","v":"_css-hash"},{"t":"s","v":"has-data"},{"t":"s","v":"page-data-cache-key"},{"t":"s","v":"page-data-cache-get"},{"t":"s","v":"merge"},{"t":"s","v":"sx:route client+cache+async "},{"t":"s","v":"try-async-eval-content"},{"t":"code","v":{"bytecode":[16,0,52,0,0,1,33,48,0,20,1,0,1,3,0,18,0,1,4,0,52,2,0,3,48,1,5,20,5,0,18,1,18,0,20,6,0,18,1,20,7,0,48,0,20,8,0,48,3,1,9,0,49,4,32,11,0,20,10,0,18,1,16,0,18,0,49,3,50],"constants":[{"t":"s","v":"nil?"},{"t":"s","v":"log-warn"},{"t":"s","v":"str"},{"t":"s","v":"sx:route cache+async eval failed for "},{"t":"s","v":" — server fallback"},{"t":"s","v":"fetch-and-restore"},{"t":"s","v":"build-request-headers"},{"t":"s","v":"loaded-component-names"},{"t":"s","v":"_css-hash"},{"t":"n","v":0},{"t":"s","v":"swap-rendered-content"}],"arity":1,"upvalue-count":2}},{"t":"s","v":"try-eval-content"},{"t":"s","v":"sx:route cached eval failed for "},{"t":"s","v":"sx:route client+cache "},{"t":"s","v":"swap-rendered-content"},{"t":"s","v":"sx:route client+data "},{"t":"s","v":"resolve-page-data"},{"t":"code","v":{"bytecode":[20,0,0,18,0,16,0,48,2,5,18,1,18,2,16,0,52,1,0,3,17,1,18,3,33,19,0,20,2,0,18,4,16,1,51,3,0,0,5,0,6,49,3,32,79,0,20,4,0,18,4,16,1,48,2,17,2,16,2,52,5,0,1,33,48,0,20,6,0,1,8,0,18,5,1,9,0,52,7,0,3,48,1,5,20,10,0,18,6,18,5,20,11,0,18,6,20,12,0,48,0,20,13,0,48,3,1,14,0,49,4,32,11,0,20,15,0,18,6,16,2,18,5,49,3,50],"constants":[{"t":"s","v":"page-data-cache-set"},{"t":"s","v":"merge"},{"t":"s","v":"try-async-eval-content"},{"t":"code","v":{"bytecode":[16,0,52,0,0,1,33,48,0,20,1,0,1,3,0,18,0,1,4,0,52,2,0,3,48,1,5,20,5,0,18,1,18,0,20,6,0,18,1,20,7,0,48,0,20,8,0,48,3,1,9,0,49,4,32,11,0,20,10,0,18,1,16,0,18,0,49,3,50],"constants":[{"t":"s","v":"nil?"},{"t":"s","v":"log-warn"},{"t":"s","v":"str"},{"t":"s","v":"sx:route data+async eval failed for "},{"t":"s","v":" — server fallback"},{"t":"s","v":"fetch-and-restore"},{"t":"s","v":"build-request-headers"},{"t":"s","v":"loaded-component-names"},{"t":"s","v":"_css-hash"},{"t":"n","v":0},{"t":"s","v":"swap-rendered-content"}],"arity":1,"upvalue-count":2}},{"t":"s","v":"try-eval-content"},{"t":"s","v":"nil?"},{"t":"s","v":"log-warn"},{"t":"s","v":"str"},{"t":"s","v":"sx:route data eval failed for "},{"t":"s","v":" — server fallback"},{"t":"s","v":"fetch-and-restore"},{"t":"s","v":"build-request-headers"},{"t":"s","v":"loaded-component-names"},{"t":"s","v":"_css-hash"},{"t":"n","v":0},{"t":"s","v":"swap-rendered-content"}],"arity":1,"upvalue-count":7}},{"t":"s","v":"sx:route client+async "},{"t":"code","v":{"bytecode":[16,0,52,0,0,1,33,48,0,20,1,0,1,3,0,18,0,1,4,0,52,2,0,3,48,1,5,20,5,0,18,1,18,0,20,6,0,18,1,20,7,0,48,0,20,8,0,48,3,1,9,0,49,4,32,11,0,20,10,0,18,1,16,0,18,0,49,3,50],"constants":[{"t":"s","v":"nil?"},{"t":"s","v":"log-warn"},{"t":"s","v":"str"},{"t":"s","v":"sx:route async eval failed for "},{"t":"s","v":" — server fallback"},{"t":"s","v":"fetch-and-restore"},{"t":"s","v":"build-request-headers"},{"t":"s","v":"loaded-component-names"},{"t":"s","v":"_css-hash"},{"t":"n","v":0},{"t":"s","v":"swap-rendered-content"}],"arity":1,"upvalue-count":2}},{"t":"s","v":"sx:route server (eval failed) "}],"arity":2}},{"t":"s","v":"bind-client-route-link"},{"t":"code","v":{"bytecode":[20,0,0,16,0,16,1,51,1,0,1,0,1,1,49,3,50],"constants":[{"t":"s","v":"bind-client-route-click"},{"t":"code","v":{"bytecode":[20,0,0,18,0,18,1,49,2,50],"constants":[{"t":"s","v":"bind-boost-link"}],"upvalue-count":2}}],"arity":2}},{"t":"s","v":"process-sse"},{"t":"code","v":{"bytecode":[51,1,0,20,2,0,16,0,6,34,6,0,5,20,3,0,48,0,1,4,0,48,2,52,0,0,2,50],"constants":[{"t":"s","v":"for-each"},{"t":"code","v":{"bytecode":[20,1,0,16,0,1,2,0,48,2,52,0,0,1,33,21,0,20,3,0,16,0,1,2,0,48,2,5,20,4,0,16,0,49,1,32,1,0,2,50],"constants":[{"t":"s","v":"not"},{"t":"s","v":"is-processed?"},{"t":"s","v":"sse"},{"t":"s","v":"mark-processed!"},{"t":"s","v":"bind-sse"}],"arity":1}},{"t":"s","v":"dom-query-all"},{"t":"s","v":"dom-body"},{"t":"s","v":"[sx-sse]"}],"arity":1}},{"t":"s","v":"bind-sse"},{"t":"code","v":{"bytecode":[20,0,0,16,0,1,1,0,48,2,17,1,16,1,33,37,0,20,2,0,16,1,16,0,48,2,17,2,20,3,0,16,0,48,1,17,3,20,4,0,16,2,16,3,51,5,0,1,0,49,3,32,1,0,2,50],"constants":[{"t":"s","v":"dom-get-attr"},{"t":"s","v":"sx-sse"},{"t":"s","v":"event-source-connect"},{"t":"s","v":"parse-sse-swap"},{"t":"s","v":"event-source-listen"},{"t":"code","v":{"bytecode":[20,0,0,18,0,16,0,49,2,50],"constants":[{"t":"s","v":"bind-sse-swap"}],"arity":1,"upvalue-count":1}}],"arity":1}},{"t":"s","v":"bind-sse-swap"},{"t":"code","v":{"bytecode":[20,0,0,16,0,48,1,17,2,20,1,0,20,2,0,16,0,1,3,0,48,2,20,4,0,20,5,0,48,0,1,6,0,48,2,48,2,17,3,16,3,1,8,0,52,7,0,2,17,4,16,3,1,9,0,52,7,0,2,17,5,16,1,52,10,0,1,17,6,16,6,52,12,0,1,52,11,0,1,33,88,0,20,13,0,16,2,48,1,5,16,6,1,15,0,52,14,0,2,33,49,0,20,16,0,16,6,48,1,17,7,20,17,0,1,18,0,2,48,2,17,8,20,19,0,16,8,16,7,48,2,5,20,20,0,16,5,51,21,0,1,2,1,8,1,4,49,2,32,16,0,20,20,0,16,5,51,22,0,1,2,1,6,1,4,49,2,32,1,0,2,50],"constants":[{"t":"s","v":"resolve-target"},{"t":"s","v":"parse-swap-spec"},{"t":"s","v":"dom-get-attr"},{"t":"s","v":"sx-swap"},{"t":"s","v":"dom-has-class?"},{"t":"s","v":"dom-body"},{"t":"s","v":"sx-transitions"},{"t":"s","v":"get"},{"t":"s","v":"style"},{"t":"s","v":"transition"},{"t":"s","v":"trim"},{"t":"s","v":"not"},{"t":"s","v":"empty?"},{"t":"s","v":"dispose-islands-in"},{"t":"s","v":"starts-with?"},{"t":"s","v":"("},{"t":"s","v":"sx-render"},{"t":"s","v":"dom-create-element"},{"t":"s","v":"div"},{"t":"s","v":"dom-append"},{"t":"s","v":"with-transition"},{"t":"code","v":{"bytecode":[20,0,0,18,0,20,1,0,18,1,48,1,18,2,48,3,5,20,2,0,18,0,49,1,50],"constants":[{"t":"s","v":"swap-dom-nodes"},{"t":"s","v":"children-to-fragment"},{"t":"s","v":"post-swap"}],"upvalue-count":3}},{"t":"code","v":{"bytecode":[20,0,0,18,0,18,1,18,2,48,3,5,20,1,0,18,0,49,1,50],"constants":[{"t":"s","v":"swap-html-string"},{"t":"s","v":"post-swap"}],"upvalue-count":3}}],"arity":2}},{"t":"s","v":"bind-inline-handlers"},{"t":"code","v":{"bytecode":[51,1,0,20,2,0,16,0,6,34,6,0,5,20,3,0,48,0,1,4,0,48,2,52,0,0,2,50],"constants":[{"t":"s","v":"for-each"},{"t":"code","v":{"bytecode":[51,1,0,1,0,20,2,0,16,0,48,1,52,0,0,2,50],"constants":[{"t":"s","v":"for-each"},{"t":"code","v":{"bytecode":[16,0,52,0,0,1,17,1,16,0,1,2,0,52,1,0,2,17,2,16,1,1,4,0,52,3,0,2,33,83,0,16,1,1,6,0,52,5,0,2,17,3,20,8,0,18,0,1,10,0,16,3,52,9,0,2,48,2,52,7,0,1,33,45,0,20,11,0,18,0,1,10,0,16,3,52,9,0,2,48,2,5,20,12,0,16,2,48,1,17,4,20,13,0,18,0,16,3,51,14,0,0,0,1,4,49,3,32,1,0,2,32,1,0,2,50],"constants":[{"t":"s","v":"first"},{"t":"s","v":"nth"},{"t":"n","v":1},{"t":"s","v":"starts-with?"},{"t":"s","v":"sx-on:"},{"t":"s","v":"slice"},{"t":"n","v":6},{"t":"s","v":"not"},{"t":"s","v":"is-processed?"},{"t":"s","v":"str"},{"t":"s","v":"on:"},{"t":"s","v":"mark-processed!"},{"t":"s","v":"sx-parse"},{"t":"s","v":"dom-on"},{"t":"code","v":{"bytecode":[20,0,0,52,1,0,0,48,1,17,1,20,2,0,16,1,1,3,0,16,0,48,3,5,20,2,0,16,1,1,4,0,18,0,48,3,5,20,2,0,16,1,1,5,0,20,6,0,16,0,48,1,48,3,5,51,8,0,1,1,18,1,52,7,0,2,50],"constants":[{"t":"s","v":"env-extend"},{"t":"s","v":"dict"},{"t":"s","v":"env-bind!"},{"t":"s","v":"event"},{"t":"s","v":"this"},{"t":"s","v":"detail"},{"t":"s","v":"event-detail"},{"t":"s","v":"for-each"},{"t":"code","v":{"bytecode":[20,0,0,16,0,18,0,49,2,50],"constants":[{"t":"s","v":"eval-expr"}],"arity":1,"upvalue-count":1}}],"arity":1,"upvalue-count":2}}],"arity":1,"upvalue-count":1}},{"t":"s","v":"dom-attr-list"}],"arity":1}},{"t":"s","v":"dom-query-all"},{"t":"s","v":"dom-body"},{"t":"s","v":"[sx-on\\:]"}],"arity":1}},{"t":"s","v":"bind-preload-for"},{"t":"code","v":{"bytecode":[20,0,0,16,0,1,1,0,48,2,17,1,16,1,33,76,0,16,1,1,3,0,52,2,0,2,33,13,0,1,3,0,1,5,0,52,4,0,2,32,7,0,1,6,0,52,4,0,1,17,2,16,1,1,3,0,52,2,0,2,33,6,0,1,7,0,32,3,0,1,8,0,17,3,20,9,0,16,0,16,2,16,3,51,10,0,1,0,49,4,32,1,0,2,50],"constants":[{"t":"s","v":"dom-get-attr"},{"t":"s","v":"sx-preload"},{"t":"s","v":"="},{"t":"s","v":"mousedown"},{"t":"s","v":"list"},{"t":"s","v":"touchstart"},{"t":"s","v":"mouseover"},{"t":"n","v":0},{"t":"n","v":100},{"t":"s","v":"bind-preload"},{"t":"code","v":{"bytecode":[20,0,0,18,0,48,1,17,0,16,0,33,32,0,20,1,0,16,0,1,3,0,52,2,0,2,20,4,0,18,0,20,5,0,48,0,20,6,0,48,3,49,2,32,1,0,2,50],"constants":[{"t":"s","v":"get-verb-info"},{"t":"s","v":"do-preload"},{"t":"s","v":"get"},{"t":"s","v":"url"},{"t":"s","v":"build-request-headers"},{"t":"s","v":"loaded-component-names"},{"t":"s","v":"_css-hash"}],"upvalue-count":1}}],"arity":1}},{"t":"s","v":"do-preload"},{"t":"code","v":{"bytecode":[20,1,0,20,2,0,16,0,48,2,52,0,0,1,33,15,0,20,3,0,16,0,16,1,20,2,0,49,3,32,1,0,2,50],"constants":[{"t":"s","v":"nil?"},{"t":"s","v":"preload-cache-get"},{"t":"s","v":"_preload-cache"},{"t":"s","v":"fetch-preload"}],"arity":2}},{"t":"s","v":"VERB_SELECTOR"},{"t":"s","v":"str"},{"t":"s","v":"[sx-get],[sx-post],[sx-put],[sx-delete],[sx-patch]"},{"t":"s","v":"process-elements"},{"t":"code","v":{"bytecode":[20,0,0,16,0,6,34,6,0,5,20,1,0,48,0,20,2,0,48,2,17,1,51,4,0,16,1,52,3,0,2,5,20,5,0,16,0,48,1,5,20,6,0,16,0,48,1,5,20,7,0,16,0,48,1,5,20,8,0,16,0,49,1,50],"constants":[{"t":"s","v":"dom-query-all"},{"t":"s","v":"dom-body"},{"t":"s","v":"VERB_SELECTOR"},{"t":"s","v":"for-each"},{"t":"code","v":{"bytecode":[20,1,0,16,0,1,2,0,48,2,52,0,0,1,33,21,0,20,3,0,16,0,1,2,0,48,2,5,20,4,0,16,0,49,1,32,1,0,2,50],"constants":[{"t":"s","v":"not"},{"t":"s","v":"is-processed?"},{"t":"s","v":"verb"},{"t":"s","v":"mark-processed!"},{"t":"s","v":"process-one"}],"arity":1}},{"t":"s","v":"process-boosted"},{"t":"s","v":"process-sse"},{"t":"s","v":"bind-inline-handlers"},{"t":"s","v":"process-emit-elements"}],"arity":1}},{"t":"s","v":"process-one"},{"t":"code","v":{"bytecode":[20,0,0,16,0,48,1,17,1,16,1,33,41,0,20,2,0,16,0,1,3,0,48,2,52,1,0,1,33,20,0,20,4,0,16,0,16,1,48,2,5,20,5,0,16,0,49,1,32,1,0,2,32,1,0,2,50],"constants":[{"t":"s","v":"get-verb-info"},{"t":"s","v":"not"},{"t":"s","v":"dom-has-attr?"},{"t":"s","v":"sx-disable"},{"t":"s","v":"bind-triggers"},{"t":"s","v":"bind-preload-for"}],"arity":1}},{"t":"s","v":"process-emit-elements"},{"t":"code","v":{"bytecode":[20,0,0,16,0,6,34,6,0,5,20,1,0,48,0,1,2,0,48,2,17,1,51,4,0,16,1,52,3,0,2,50],"constants":[{"t":"s","v":"dom-query-all"},{"t":"s","v":"dom-body"},{"t":"s","v":"[data-sx-emit]"},{"t":"s","v":"for-each"},{"t":"code","v":{"bytecode":[20,1,0,16,0,1,2,0,48,2,52,0,0,1,33,52,0,20,3,0,16,0,1,2,0,48,2,5,20,4,0,16,0,1,5,0,48,2,17,1,16,1,33,20,0,20,6,0,16,0,1,7,0,51,8,0,1,0,1,1,49,3,32,1,0,2,32,1,0,2,50],"constants":[{"t":"s","v":"not"},{"t":"s","v":"is-processed?"},{"t":"s","v":"emit"},{"t":"s","v":"mark-processed!"},{"t":"s","v":"dom-get-attr"},{"t":"s","v":"data-sx-emit"},{"t":"s","v":"dom-on"},{"t":"s","v":"click"},{"t":"code","v":{"bytecode":[20,0,0,18,0,1,1,0,48,2,17,1,16,1,33,10,0,20,2,0,16,1,48,1,32,4,0,52,3,0,0,17,2,20,4,0,18,0,18,1,16,2,49,3,50],"constants":[{"t":"s","v":"dom-get-attr"},{"t":"s","v":"data-sx-emit-detail"},{"t":"s","v":"json-parse"},{"t":"s","v":"dict"},{"t":"s","v":"dom-dispatch"}],"arity":1,"upvalue-count":2}}],"arity":1}}],"arity":1}},{"t":"s","v":"handle-popstate"},{"t":"code","v":{"bytecode":[20,0,0,48,0,17,1,20,1,0,1,2,0,48,1,17,2,16,2,33,44,0,20,3,0,16,2,1,4,0,48,2,17,4,16,4,6,33,14,0,5,16,4,1,7,0,52,6,0,2,52,5,0,1,33,5,0,16,4,32,1,0,2,32,1,0,2,17,3,16,3,6,34,4,0,5,1,8,0,17,3,20,1,0,16,3,48,1,17,4,20,9,0,16,1,48,1,17,5,16,4,33,58,0,20,10,0,16,5,16,3,48,2,33,13,0,20,11,0,1,12,0,16,0,49,2,32,30,0,20,13,0,16,4,20,14,0,48,0,20,15,0,48,3,17,6,20,16,0,16,4,16,1,16,6,16,0,49,4,32,1,0,2,50],"constants":[{"t":"s","v":"browser-location-href"},{"t":"s","v":"dom-query"},{"t":"s","v":"[sx-boost]"},{"t":"s","v":"dom-get-attr"},{"t":"s","v":"sx-boost"},{"t":"s","v":"not"},{"t":"s","v":"="},{"t":"s","v":"true"},{"t":"s","v":"#main-panel"},{"t":"s","v":"url-pathname"},{"t":"s","v":"try-client-route"},{"t":"s","v":"browser-scroll-to"},{"t":"n","v":0},{"t":"s","v":"build-request-headers"},{"t":"s","v":"loaded-component-names"},{"t":"s","v":"_css-hash"},{"t":"s","v":"fetch-and-restore"}],"arity":1}},{"t":"s","v":"engine-init"},{"t":"code","v":{"bytecode":[20,0,0,48,0,5,20,1,0,2,48,1,5,20,2,0,2,48,1,5,20,3,0,2,49,1,50],"constants":[{"t":"s","v":"init-css-tracking"},{"t":"s","v":"sx-process-scripts"},{"t":"s","v":"sx-hydrate"},{"t":"s","v":"process-elements"}]}}]}}
\ No newline at end of file
diff --git a/tests/playwright/navigation.spec.js b/tests/playwright/navigation.spec.js
index 02f5a30e..386a76cb 100644
--- a/tests/playwright/navigation.spec.js
+++ b/tests/playwright/navigation.spec.js
@@ -1,120 +1,12 @@
// Navigation tests for sx-docs
-// Verifies client-side navigation works correctly after sx-host migration.
+// Verifies navigation works correctly with the OCaml sx-host.
const { test, expect } = require('playwright/test');
const BASE_URL = process.env.SX_TEST_URL || 'http://localhost:8013';
-test.describe('Client-side Navigation', () => {
+test.describe('Page Navigation', () => {
- test('layout stays vertical after clicking nav link', async ({ page }) => {
- await page.goto(BASE_URL + '/sx/(geography)', { waitUntil: 'networkidle' });
- await page.waitForTimeout(2000);
-
- // Click "Reactive Islands" nav link
- await page.click('a[href*="geography.(reactive"]:not([href*="runtime"])');
- await page.waitForTimeout(3000);
-
- // Page should have navigated
- expect(page.url()).toContain('reactive');
-
- // After navigation, the page title/heading should be visible and centered
- // NOT pushed to the right side by the header
- const heading = await page.locator('h1, h2').first().boundingBox();
- const viewport = page.viewportSize();
-
- if (heading && viewport) {
- // The heading should be centered-ish, not pushed far right
- // If it's past 60% of viewport width, layout is broken (side-by-side)
- expect(heading.x).toBeLessThan(viewport.width * 0.5);
- }
-
- // The page should NOT have two visible columns where header and content
- // are side by side
- const screenshot = await page.screenshot();
- // Just verify the content area starts near the top
- if (heading) {
- expect(heading.y).toBeLessThan(400); // Content should be within first 400px
- }
- });
-
- test('content updates after navigation', async ({ page }) => {
- await page.goto(BASE_URL + '/sx/(geography)', { waitUntil: 'networkidle' });
-
- // Geography page should have "Geography" heading
- const geoText = await page.textContent('body');
- expect(geoText).toContain('Geography');
-
- // Click on "CEK Machine" link
- const cekLink = page.locator('a:has-text("CEK Machine")');
- if (await cekLink.count() > 0) {
- await cekLink.first().click();
- await page.waitForTimeout(3000);
-
- // Content should now mention CEK
- const bodyText = await page.textContent('body');
- expect(bodyText).toContain('CEK');
- }
- });
-
- test('no raw SX component calls visible after navigation', async ({ page }) => {
- await page.goto(BASE_URL + '/sx/(geography)', { waitUntil: 'networkidle' });
-
- // Click a nav link
- await page.click('a[href*="hypermedia"]:not([href*="example"])');
- await page.waitForTimeout(3000);
-
- // Check no raw SX calls visible in the main content area
- const mainText = await page.locator('#main-panel, #root-panel, main').first().textContent();
- // ~cssx/tw calls should be expanded, not visible as text
- const rawCssx = (mainText.match(/~cssx\/tw/g) || []).length;
- expect(rawCssx).toBeLessThan(3); // Allow a few in documentation text
- });
-
- test('header island survives navigation', async ({ page }) => {
- await page.goto(BASE_URL + '/sx/(geography)', { waitUntil: 'networkidle' });
- await page.waitForSelector('[data-sx-island="layouts/header"]', { timeout: 10000 });
-
- // Header should have the logo
- const headerText = await page.locator('[data-sx-island="layouts/header"]').textContent();
- expect(headerText).toContain('sx');
-
- // Navigate
- await page.click('a[href*="hypermedia"]:not([href*="example"])');
- await page.waitForTimeout(3000);
-
- // Header should still be present and have content
- const headerAfter = await page.locator('[data-sx-island="layouts/header"]');
- await expect(headerAfter).toBeVisible();
- const headerTextAfter = await headerAfter.textContent();
- expect(headerTextAfter).toContain('sx');
- });
-
- test('navigation does not create side-by-side layout', async ({ page }) => {
- await page.goto(BASE_URL + '/sx/(geography)', { waitUntil: 'networkidle' });
- await page.waitForTimeout(2000);
-
- // Navigate to Hypermedia
- await page.click('a[href*="geography.(hypermedia"]:not([href*="example"])');
- await page.waitForTimeout(3000);
-
- // The header/nav should NOT be beside the content (side by side)
- // Check that there's no element with the logo text at x < 300
- // while content heading is at x > 300
- const logo = await page.locator('[data-sx-island="layouts/header"]').boundingBox();
- const heading = await page.locator('h1, h2').first().boundingBox();
-
- if (logo && heading) {
- // Both should be roughly centered, not one left and one right
- const logoCenter = logo.x + logo.width / 2;
- const headingCenter = heading.x + heading.width / 2;
- const drift = Math.abs(logoCenter - headingCenter);
- // If drift > 300px, they're side by side (broken layout)
- expect(drift).toBeLessThan(300);
- }
- });
-
- test('browser back button restores previous page content', async ({ page }) => {
- // Collect console errors
+ test('clicking nav button navigates to new page', async ({ page }) => {
const errors = [];
page.on('console', msg => {
if (msg.type() === 'error') errors.push(msg.text());
@@ -123,89 +15,127 @@ test.describe('Client-side Navigation', () => {
await page.goto(BASE_URL + '/sx/(geography)', { waitUntil: 'networkidle' });
await page.waitForTimeout(2000);
- // Navigate forward to Hypermedia
- await page.click('a[href*="geography.(hypermedia"]:not([href*="example"])');
+ // Click "Reactive Islands" nav link
+ await page.click('a[href*="geography.(reactive)"]:not([href*="runtime"])');
await page.waitForTimeout(3000);
- // Verify navigation worked — URL must contain hypermedia
- expect(page.url()).toContain('hypermedia');
+ // Should have navigated — URL must contain reactive
+ expect(page.url()).toContain('reactive');
- // Go back
- await page.goBack();
- await page.waitForTimeout(3000);
+ // Page should show Reactive Islands content
+ const body = await page.textContent('body');
+ expect(body).toContain('Reactive Islands');
- // URL should return
- expect(page.url()).toContain('geography');
- expect(page.url()).not.toContain('hypermedia');
-
- // Content MUST change back — the main heading should say Geography,
- // NOT still show Hypermedia content
- const heading = await page.locator('#main-panel h1, #main-panel h2').first();
- await expect(heading).toContainText('Geography', { timeout: 5000 });
-
- // No JIT errors should have occurred during navigation
- const jitErrors = errors.filter(e => e.includes('Not callable: nil'));
- expect(jitErrors.length).toBe(0);
+ // No SX evaluation errors
+ const sxErrors = errors.filter(e => e.includes('Undefined symbol'));
+ expect(sxErrors).toHaveLength(0);
});
- test('back button preserves layout (no side-by-side)', async ({ page }) => {
- await page.goto(BASE_URL + '/sx/(geography)', { waitUntil: 'networkidle' });
- await page.waitForTimeout(2000);
-
- // Navigate forward
- await page.click('a[href*="geography.(reactive"]:not([href*="runtime"])');
- await page.waitForTimeout(3000);
-
- // Go back
- await page.goBack();
- await page.waitForTimeout(3000);
-
- // Check layout is vertical — heading should be within top part of page
- const heading = await page.locator('h1, h2').first().boundingBox();
- if (heading) {
- expect(heading.y).toBeLessThan(500);
- const viewport = page.viewportSize();
- if (viewport) {
- expect(heading.x).toBeLessThan(viewport.width * 0.5);
- }
- }
- });
-
- test('no JIT errors during navigation', async ({ page }) => {
+ test('clicking header logo navigates home', async ({ page }) => {
const errors = [];
page.on('console', msg => {
- if (msg.type() === 'error' && msg.text().includes('FAIL')) {
- errors.push(msg.text());
- }
+ if (msg.type() === 'error') errors.push(msg.text());
});
await page.goto(BASE_URL + '/sx/(geography)', { waitUntil: 'networkidle' });
await page.waitForTimeout(2000);
- // Navigate
- await page.click('a[href*="geography.(hypermedia"]:not([href*="example"])');
+ // Click the logo in the header island
+ await page.click('[data-sx-island="layouts/header"] a[href="/sx/"]');
await page.waitForTimeout(3000);
- // Check for JIT errors — these indicate broken CSSX function resolution
- const jitErrors = errors.filter(e => e.includes('Not callable: nil'));
- expect(jitErrors.length).toBe(0);
+ // Should have navigated to home
+ expect(page.url()).toMatch(/\/sx\/?$/);
+
+ // No SX evaluation errors
+ const sxErrors = errors.filter(e => e.includes('Undefined symbol'));
+ expect(sxErrors).toHaveLength(0);
});
- test('full page width is used (no side-by-side split)', async ({ page }) => {
+ test('back button works after navigation', async ({ page }) => {
+ const errors = [];
+ page.on('console', msg => {
+ if (msg.type() === 'error') errors.push(msg.text());
+ });
+
+ await page.goto(BASE_URL + '/sx/(geography)', { waitUntil: 'networkidle' });
+ await page.waitForTimeout(2000);
+
+ // Navigate to Reactive Islands
+ await page.click('a[href*="geography.(reactive)"]:not([href*="runtime"])');
+ await page.waitForTimeout(3000);
+ expect(page.url()).toContain('reactive');
+
+ // Go back
+ await page.goBack();
+ await page.waitForTimeout(3000);
+
+ // Should be back at Geography
+ expect(page.url()).toContain('geography');
+ expect(page.url()).not.toContain('reactive');
+
+ // Geography heading should be visible
+ const heading = await page.locator('h1, h2').first();
+ await expect(heading).toContainText('Geography', { timeout: 5000 });
+
+ // No SX errors
+ const sxErrors = errors.filter(e => e.includes('Undefined symbol'));
+ expect(sxErrors).toHaveLength(0);
+ });
+
+ test('no console errors on page load', async ({ page }) => {
+ const errors = [];
+ page.on('console', msg => {
+ if (msg.type() === 'error' && !msg.text().includes('404'))
+ errors.push(msg.text());
+ });
+
+ await page.goto(BASE_URL + '/sx/(geography)', { waitUntil: 'networkidle' });
+ await page.waitForTimeout(3000);
+
+ // No JIT or SX errors
+ const sxErrors = errors.filter(e =>
+ e.includes('Undefined symbol') || e.includes('Not callable'));
+ expect(sxErrors).toHaveLength(0);
+ });
+
+ test('copyright shows current route after SX navigation', async ({ page }) => {
+ await page.goto(BASE_URL + '/sx/', { waitUntil: 'networkidle' });
+ await page.waitForTimeout(3000);
+
+ // Mark the page to verify SX navigation (not full reload)
+ await page.evaluate(() => window.__sx_nav_marker = true);
+
+ // Before: copyright shows the current path
+ const before = await page.evaluate(() =>
+ document.querySelector('[data-sx-lake="copyright"]')?.textContent);
+ expect(before).toContain('/sx/');
+
+ // Navigate via SX (sx-get link)
+ await page.click('a[sx-get*="(geography)"]');
+ await page.waitForTimeout(3000);
+
+ // Verify SX navigation (marker survives SX nav, lost on reload)
+ const marker = await page.evaluate(() => window.__sx_nav_marker);
+ expect(marker).toBe(true);
+
+ // After: copyright must still show a route path
+ const after = await page.evaluate(() =>
+ document.querySelector('[data-sx-lake="copyright"]')?.textContent);
+ expect(after).toContain('geography');
+ });
+
+ test('header island renders with SSR', async ({ page }) => {
await page.goto(BASE_URL + '/sx/(geography)', { waitUntil: 'networkidle' });
- // Navigate to a child page
- await page.click('a[href*="reactive"]:not([href*="runtime"])');
- await page.waitForTimeout(3000);
+ // Header should be visible
+ const header = page.locator('[data-sx-island="layouts/header"]');
+ await expect(header).toBeVisible();
- // The main content area should use most of the viewport width
- const viewport = page.viewportSize();
- const content = await page.locator('h1, h2, [id="main-panel"]').first().boundingBox();
+ // Should contain the logo
+ await expect(header).toContainText('sx');
- if (content && viewport) {
- // Content should not be squeezed to one side
- // It should start within the first 40% of viewport width
- expect(content.x).toBeLessThan(viewport.width * 0.4);
- }
+ // Should contain copyright
+ await expect(header).toContainText('Giles Bradshaw');
});
});
diff --git a/web/adapter-dom.sx b/web/adapter-dom.sx
index 38c670ba..55416866 100644
--- a/web/adapter-dom.sx
+++ b/web/adapter-dom.sx
@@ -4,64 +4,1335 @@
(define island-scope? (fn () (not (nil? (scope-peek "sx-island-scope")))))
-(begin (define *memo-cache* (dict)) (define *cyst-counter* 0) (define next-cyst-id (fn () (set! *cyst-counter* (+ *cyst-counter* 1)) (str "sx-cyst-" *cyst-counter*))))
+(begin
+ (define *memo-cache* (dict))
+ (define *cyst-counter* 0)
+ (define
+ next-cyst-id
+ (fn
+ ()
+ (set! *cyst-counter* (+ *cyst-counter* 1))
+ (str "sx-cyst-" *cyst-counter*))))
-(define contains-deref? (fn (expr) (if (not (list? expr)) false (if (empty? expr) false (if (and (= (type-of (first expr)) "symbol") (= (symbol-name (first expr)) "deref")) true (some contains-deref? expr))))))
+(define
+ contains-deref?
+ (fn
+ (expr)
+ (if
+ (not (list? expr))
+ false
+ (if
+ (empty? expr)
+ false
+ (if
+ (and
+ (= (type-of (first expr)) "symbol")
+ (= (symbol-name (first expr)) "deref"))
+ true
+ (some contains-deref? expr))))))
-(define dom-on :effects (io) (fn (el name handler) (dom-listen el name (if (lambda? handler) (if (= 0 (len (lambda-params handler))) (fn (_e) (trampoline (call-lambda handler (list))) (run-post-render-hooks)) (fn (e) (trampoline (call-lambda handler (list e))) (run-post-render-hooks))) handler))))
+(define
+ dom-on
+ :effects (io)
+ (fn
+ (el name handler)
+ (dom-listen
+ el
+ name
+ (if
+ (lambda? handler)
+ (if
+ (= 0 (len (lambda-params handler)))
+ (fn
+ (_e)
+ (trampoline (call-lambda handler (list)))
+ (run-post-render-hooks))
+ (fn
+ (e)
+ (trampoline (call-lambda handler (list e)))
+ (run-post-render-hooks)))
+ handler))))
-(define render-to-dom :effects (render) (fn (expr (env :as dict) (ns :as string)) (set-render-active! true) (case (type-of expr) "nil" (create-fragment) "boolean" (create-fragment) "raw-html" (dom-parse-html (raw-html-content expr)) "string" (create-text-node expr) "number" (create-text-node (str expr)) "symbol" (render-to-dom (trampoline (eval-expr expr env)) env ns) "keyword" (create-text-node (keyword-name expr)) "dom-node" expr "spread" (do (when (not (island-scope?)) (scope-emit! "element-attrs" (spread-attrs expr))) expr) "dict" (if (has-key? expr "__host_handle") expr (create-fragment)) "list" (if (empty? expr) (create-fragment) (render-dom-list expr env ns)) :else (if (signal? expr) (if (island-scope?) (reactive-text expr) (create-text-node (str (deref expr)))) (create-text-node (str expr))))))
+(define
+ render-to-dom
+ :effects (render)
+ (fn
+ (expr (env :as dict) (ns :as string))
+ (set-render-active! true)
+ (case
+ (type-of expr)
+ "nil"
+ (create-fragment)
+ "boolean"
+ (create-fragment)
+ "raw-html"
+ (dom-parse-html (raw-html-content expr))
+ "string"
+ (create-text-node expr)
+ "number"
+ (create-text-node (str expr))
+ "symbol"
+ (render-to-dom (trampoline (eval-expr expr env)) env ns)
+ "keyword"
+ (create-text-node (keyword-name expr))
+ "dom-node"
+ expr
+ "spread"
+ (do
+ (when
+ (not (island-scope?))
+ (scope-emit! "element-attrs" (spread-attrs expr)))
+ expr)
+ "dict"
+ (if (has-key? expr "__host_handle") expr (create-fragment))
+ "list"
+ (if (empty? expr) (create-fragment) (render-dom-list expr env ns))
+ :else (if
+ (signal? expr)
+ (if
+ (island-scope?)
+ (reactive-text expr)
+ (create-text-node (str (deref expr))))
+ (create-text-node (str expr))))))
-(define render-dom-list :effects (render) (fn (expr (env :as dict) (ns :as string)) (let ((head (first expr))) (cond (= (type-of head) "symbol") (let ((name (symbol-name head)) (args (rest expr))) (cond (= name "raw!") (render-dom-raw args env) (= name "<>") (render-dom-fragment args env ns) (= name "lake") (render-dom-lake args env ns) (= name "marsh") (render-dom-marsh args env ns) (starts-with? name "html:") (render-dom-element (slice name 5) args env ns) (render-dom-form? name) (if (and (contains? HTML_TAGS name) (or (and (> (len args) 0) (= (type-of (first args)) "keyword")) ns)) (render-dom-element name args env ns) (dispatch-render-form name expr env ns)) (and (env-has? env name) (macro? (env-get env name))) (render-to-dom (expand-macro (env-get env name) args env) env ns) (contains? HTML_TAGS name) (render-dom-element name args env ns) (and (starts-with? name "~") (env-has? env name) (island? (env-get env name))) (if (scope-peek "sx-render-markers") (let ((island (env-get env name)) (marker (dom-create-element "span" nil))) (dom-set-attr marker "data-sx-island" (component-name island)) marker) (render-dom-island (env-get env name) args env ns)) (starts-with? name "~") (let ((comp (env-get env name))) (if (component? comp) (render-dom-component comp args env ns) (render-dom-unknown-component name))) (and (> (index-of name "-") 0) (> (len args) 0) (= (type-of (first args)) "keyword")) (render-dom-element name args env ns) ns (render-dom-element name args env ns) (and (= name "deref") (island-scope?)) (let ((sig-or-val (trampoline (eval-expr (first args) env)))) (if (signal? sig-or-val) (reactive-text sig-or-val) (create-text-node (str (deref sig-or-val))))) (and (island-scope?) (contains-deref? expr)) (reactive-text (computed (fn () (trampoline (eval-expr expr env))))) :else (render-to-dom (trampoline (eval-expr expr env)) env ns))) (or (lambda? head) (= (type-of head) "list")) (render-to-dom (trampoline (eval-expr expr env)) env ns) :else (let ((frag (create-fragment))) (for-each (fn (x) (let ((result (render-to-dom x env ns))) (when (not (spread? result)) (dom-append frag result)))) expr) frag)))))
+(define
+ render-dom-list
+ :effects (render)
+ (fn
+ (expr (env :as dict) (ns :as string))
+ (let
+ ((head (first expr)))
+ (cond
+ (= (type-of head) "symbol")
+ (let
+ ((name (symbol-name head)) (args (rest expr)))
+ (cond
+ (= name "raw!")
+ (render-dom-raw args env)
+ (= name "<>")
+ (render-dom-fragment args env ns)
+ (= name "lake")
+ (render-dom-lake args env ns)
+ (= name "marsh")
+ (render-dom-marsh args env ns)
+ (starts-with? name "html:")
+ (render-dom-element (slice name 5) args env ns)
+ (render-dom-form? name)
+ (if
+ (and
+ (contains? HTML_TAGS name)
+ (or
+ (and
+ (> (len args) 0)
+ (= (type-of (first args)) "keyword"))
+ ns))
+ (render-dom-element name args env ns)
+ (dispatch-render-form name expr env ns))
+ (and (env-has? env name) (macro? (env-get env name)))
+ (render-to-dom (expand-macro (env-get env name) args env) env ns)
+ (contains? HTML_TAGS name)
+ (render-dom-element name args env ns)
+ (and
+ (starts-with? name "~")
+ (env-has? env name)
+ (island? (env-get env name)))
+ (if
+ (scope-peek "sx-render-markers")
+ (let
+ ((island (env-get env name))
+ (marker (dom-create-element "span" nil))
+ (kw-state (dict)))
+ (reduce
+ (fn
+ (state arg)
+ (let
+ ((skip (get state "skip")))
+ (if
+ skip
+ (assoc state "skip" false "i" (inc (get state "i")))
+ (if
+ (and
+ (= (type-of arg) "keyword")
+ (< (inc (get state "i")) (len args)))
+ (let
+ ((kname (keyword-name arg))
+ (kval
+ (trampoline
+ (eval-expr
+ (nth args (inc (get state "i")))
+ env))))
+ (dict-set! kw-state kname kval)
+ (assoc
+ state
+ "skip"
+ true
+ "i"
+ (inc (get state "i"))))
+ (assoc state "i" (inc (get state "i")))))))
+ (dict "i" 0 "skip" false)
+ args)
+ (dom-set-attr marker "data-sx-island" (component-name island))
+ (when
+ (not (empty-dict? kw-state))
+ (dom-set-attr
+ marker
+ "data-sx-state"
+ (sx-serialize kw-state)))
+ marker)
+ (render-dom-island (env-get env name) args env ns))
+ (starts-with? name "~")
+ (let
+ ((comp (env-get env name)))
+ (if
+ (component? comp)
+ (render-dom-component comp args env ns)
+ (render-dom-unknown-component name)))
+ (and
+ (> (index-of name "-") 0)
+ (> (len args) 0)
+ (= (type-of (first args)) "keyword"))
+ (render-dom-element name args env ns)
+ ns
+ (render-dom-element name args env ns)
+ (and (= name "deref") (island-scope?))
+ (let
+ ((sig-or-val (trampoline (eval-expr (first args) env))))
+ (if
+ (signal? sig-or-val)
+ (reactive-text sig-or-val)
+ (create-text-node (str (deref sig-or-val)))))
+ (and (island-scope?) (contains-deref? expr))
+ (reactive-text
+ (computed (fn () (trampoline (eval-expr expr env)))))
+ :else (render-to-dom (trampoline (eval-expr expr env)) env ns)))
+ (or (lambda? head) (= (type-of head) "list"))
+ (render-to-dom (trampoline (eval-expr expr env)) env ns)
+ :else (let
+ ((frag (create-fragment)))
+ (for-each
+ (fn
+ (x)
+ (let
+ ((result (render-to-dom x env ns)))
+ (when (not (spread? result)) (dom-append frag result))))
+ expr)
+ frag)))))
-(define render-dom-element :effects (render) (fn ((tag :as string) (args :as list) (env :as dict) (ns :as string)) (let ((new-ns (cond (= tag "svg") SVG_NS (= tag "math") MATH_NS :else ns)) (el (dom-create-element tag new-ns))) (scope-push! "element-attrs" nil) (reduce (fn (state arg) (let ((skip (get state "skip"))) (if skip (assoc state "skip" false "i" (inc (get state "i"))) (if (and (= (type-of arg) "keyword") (< (inc (get state "i")) (len args))) (let ((attr-name (keyword-name arg)) (attr-expr (nth args (inc (get state "i"))))) (cond (starts-with? attr-name "on-") (let ((attr-val (trampoline (eval-expr attr-expr env)))) (when (callable? attr-val) (dom-on el (slice attr-name 3) attr-val))) (= attr-name "bind") (let ((attr-val (trampoline (eval-expr attr-expr env)))) (when (signal? attr-val) (bind-input el attr-val))) (= attr-name "ref") (let ((attr-val (trampoline (eval-expr attr-expr env)))) (dict-set! attr-val "current" el)) (= attr-name "key") (let ((attr-val (trampoline (eval-expr attr-expr env)))) (dom-set-attr el "key" (str attr-val))) (island-scope?) (reactive-attr el attr-name (fn () (trampoline (eval-expr attr-expr env)))) :else (let ((attr-val (trampoline (eval-expr attr-expr env)))) (cond (or (nil? attr-val) (= attr-val false)) nil (contains? BOOLEAN_ATTRS attr-name) (when attr-val (dom-set-attr el attr-name "")) (= attr-val true) (dom-set-attr el attr-name "") :else (dom-set-attr el attr-name (str attr-val))))) (assoc state "skip" true "i" (inc (get state "i")))) (do (when (not (contains? VOID_ELEMENTS tag)) (let ((child (render-to-dom arg env new-ns))) (cond (and (spread? child) (island-scope?)) (reactive-spread el (fn () (render-to-dom arg env new-ns))) (spread? child) nil :else (dom-append el child)))) (assoc state "i" (inc (get state "i")))))))) (dict "i" 0 "skip" false) args) (for-each (fn (spread-dict) (for-each (fn ((key :as string)) (let ((val (dict-get spread-dict key))) (if (= key "class") (let ((existing (dom-get-attr el "class"))) (dom-set-attr el "class" (if (and existing (not (= existing ""))) (str existing " " val) val))) (if (= key "style") (let ((existing (dom-get-attr el "style"))) (dom-set-attr el "style" (if (and existing (not (= existing ""))) (str existing ";" val) val))) (dom-set-attr el key (str val)))))) (keys spread-dict))) (scope-emitted "element-attrs")) (scope-pop! "element-attrs") el)))
+(define
+ render-dom-element
+ :effects (render)
+ (fn
+ ((tag :as string) (args :as list) (env :as dict) (ns :as string))
+ (let
+ ((new-ns (cond (= tag "svg") SVG_NS (= tag "math") MATH_NS :else ns))
+ (el (dom-create-element tag new-ns)))
+ (scope-push! "element-attrs" nil)
+ (reduce
+ (fn
+ (state arg)
+ (let
+ ((skip (get state "skip")))
+ (if
+ skip
+ (assoc state "skip" false "i" (inc (get state "i")))
+ (if
+ (and
+ (= (type-of arg) "keyword")
+ (< (inc (get state "i")) (len args)))
+ (let
+ ((attr-name (keyword-name arg))
+ (attr-expr (nth args (inc (get state "i")))))
+ (cond
+ (starts-with? attr-name "on-")
+ (let
+ ((attr-val (trampoline (eval-expr attr-expr env))))
+ (when
+ (callable? attr-val)
+ (dom-on el (slice attr-name 3) attr-val)))
+ (= attr-name "bind")
+ (let
+ ((attr-val (trampoline (eval-expr attr-expr env))))
+ (when (signal? attr-val) (bind-input el attr-val)))
+ (= attr-name "ref")
+ (let
+ ((attr-val (trampoline (eval-expr attr-expr env))))
+ (dict-set! attr-val "current" el))
+ (= attr-name "key")
+ (let
+ ((attr-val (trampoline (eval-expr attr-expr env))))
+ (dom-set-attr el "key" (str attr-val)))
+ (island-scope?)
+ (reactive-attr
+ el
+ attr-name
+ (fn () (trampoline (eval-expr attr-expr env))))
+ :else (let
+ ((attr-val (trampoline (eval-expr attr-expr env))))
+ (cond
+ (or (nil? attr-val) (= attr-val false))
+ nil
+ (contains? BOOLEAN_ATTRS attr-name)
+ (when attr-val (dom-set-attr el attr-name ""))
+ (= attr-val true)
+ (dom-set-attr el attr-name "")
+ :else (dom-set-attr el attr-name (str attr-val)))))
+ (assoc state "skip" true "i" (inc (get state "i"))))
+ (do
+ (when
+ (not (contains? VOID_ELEMENTS tag))
+ (let
+ ((child (render-to-dom arg env new-ns)))
+ (cond
+ (and (spread? child) (island-scope?))
+ (reactive-spread
+ el
+ (fn () (render-to-dom arg env new-ns)))
+ (spread? child)
+ nil
+ :else (dom-append el child))))
+ (assoc state "i" (inc (get state "i"))))))))
+ (dict "i" 0 "skip" false)
+ args)
+ (for-each
+ (fn
+ (spread-dict)
+ (for-each
+ (fn
+ ((key :as string))
+ (let
+ ((val (dict-get spread-dict key)))
+ (if
+ (= key "class")
+ (let
+ ((existing (dom-get-attr el "class")))
+ (dom-set-attr
+ el
+ "class"
+ (if
+ (and existing (not (= existing "")))
+ (str existing " " val)
+ val)))
+ (if
+ (= key "style")
+ (let
+ ((existing (dom-get-attr el "style")))
+ (dom-set-attr
+ el
+ "style"
+ (if
+ (and existing (not (= existing "")))
+ (str existing ";" val)
+ val)))
+ (dom-set-attr el key (str val))))))
+ (keys spread-dict)))
+ (scope-emitted "element-attrs"))
+ (scope-pop! "element-attrs")
+ el)))
-(define render-dom-component :effects (render) (fn ((comp :as component) (args :as list) (env :as dict) (ns :as string)) (let ((kwargs (dict)) (children (list))) (reduce (fn (state arg) (let ((skip (get state "skip"))) (if skip (assoc state "skip" false "i" (inc (get state "i"))) (if (and (= (type-of arg) "keyword") (< (inc (get state "i")) (len args))) (let ((val (trampoline (eval-expr (nth args (inc (get state "i"))) env)))) (dict-set! kwargs (keyword-name arg) val) (assoc state "skip" true "i" (inc (get state "i")))) (do (append! children arg) (assoc state "i" (inc (get state "i")))))))) (dict "i" 0 "skip" false) args) (let ((local (env-merge (component-closure comp) env))) (for-each (fn (p) (env-bind! local p (if (dict-has? kwargs p) (dict-get kwargs p) nil))) (component-params comp)) (when (component-has-children? comp) (let ((child-frag (create-fragment))) (for-each (fn (c) (let ((result (render-to-dom c env ns))) (when (not (spread? result)) (dom-append child-frag result)))) children) (env-bind! local "children" child-frag))) (render-to-dom (component-body comp) local ns)))))
+(define
+ render-dom-component
+ :effects (render)
+ (fn
+ ((comp :as component) (args :as list) (env :as dict) (ns :as string))
+ (let
+ ((kwargs (dict)) (children (list)))
+ (reduce
+ (fn
+ (state arg)
+ (let
+ ((skip (get state "skip")))
+ (if
+ skip
+ (assoc state "skip" false "i" (inc (get state "i")))
+ (if
+ (and
+ (= (type-of arg) "keyword")
+ (< (inc (get state "i")) (len args)))
+ (let
+ ((val (trampoline (eval-expr (nth args (inc (get state "i"))) env))))
+ (dict-set! kwargs (keyword-name arg) val)
+ (assoc state "skip" true "i" (inc (get state "i"))))
+ (do
+ (append! children arg)
+ (assoc state "i" (inc (get state "i"))))))))
+ (dict "i" 0 "skip" false)
+ args)
+ (let
+ ((local (env-merge (component-closure comp) env)))
+ (for-each
+ (fn
+ (p)
+ (env-bind!
+ local
+ p
+ (if (dict-has? kwargs p) (dict-get kwargs p) nil)))
+ (component-params comp))
+ (when
+ (component-has-children? comp)
+ (let
+ ((child-frag (create-fragment)))
+ (for-each
+ (fn
+ (c)
+ (let
+ ((result (render-to-dom c env ns)))
+ (when
+ (not (spread? result))
+ (dom-append child-frag result))))
+ children)
+ (env-bind! local "children" child-frag)))
+ (render-to-dom (component-body comp) local ns)))))
-(define render-dom-fragment :effects (render) (fn ((args :as list) (env :as dict) (ns :as string)) (let ((frag (create-fragment))) (for-each (fn (x) (let ((result (render-to-dom x env ns))) (when (not (spread? result)) (dom-append frag result)))) args) frag)))
+(define
+ render-dom-fragment
+ :effects (render)
+ (fn
+ ((args :as list) (env :as dict) (ns :as string))
+ (let
+ ((frag (create-fragment)))
+ (for-each
+ (fn
+ (x)
+ (let
+ ((result (render-to-dom x env ns)))
+ (when (not (spread? result)) (dom-append frag result))))
+ args)
+ frag)))
-(define render-dom-raw :effects (render) (fn ((args :as list) (env :as dict)) (let ((frag (create-fragment))) (for-each (fn (arg) (let ((val (trampoline (eval-expr arg env)))) (cond (= (type-of val) "string") (dom-append frag (dom-parse-html val)) (= (type-of val) "dom-node") (dom-append frag (dom-clone val)) (not (nil? val)) (dom-append frag (create-text-node (str val)))))) args) frag)))
+(define
+ render-dom-raw
+ :effects (render)
+ (fn
+ ((args :as list) (env :as dict))
+ (let
+ ((frag (create-fragment)))
+ (for-each
+ (fn
+ (arg)
+ (let
+ ((val (trampoline (eval-expr arg env))))
+ (cond
+ (= (type-of val) "string")
+ (dom-append frag (dom-parse-html val))
+ (= (type-of val) "dom-node")
+ (dom-append frag (dom-clone val))
+ (not (nil? val))
+ (dom-append frag (create-text-node (str val))))))
+ args)
+ frag)))
-(define render-dom-unknown-component :effects (render) (fn ((name :as string)) (error (str "Unknown component: " name))))
+(define
+ render-dom-unknown-component
+ :effects (render)
+ (fn ((name :as string)) (error (str "Unknown component: " name))))
-(define RENDER_DOM_FORMS (list "if" "when" "cond" "case" "let" "let*" "letrec" "begin" "do" "define" "defcomp" "defisland" "defmacro" "defstyle" "map" "map-indexed" "filter" "for-each" "portal" "error-boundary" "scope" "provide" "cyst"))
+(define
+ RENDER_DOM_FORMS
+ (list
+ "if"
+ "when"
+ "cond"
+ "case"
+ "let"
+ "let*"
+ "letrec"
+ "begin"
+ "do"
+ "define"
+ "defcomp"
+ "defisland"
+ "defmacro"
+ "defstyle"
+ "map"
+ "map-indexed"
+ "filter"
+ "for-each"
+ "portal"
+ "error-boundary"
+ "scope"
+ "provide"
+ "cyst"))
-(define render-dom-form? :effects () (fn ((name :as string)) (contains? RENDER_DOM_FORMS name)))
+(define
+ render-dom-form?
+ :effects ()
+ (fn ((name :as string)) (contains? RENDER_DOM_FORMS name)))
-(define dispatch-render-form :effects (render) (fn ((name :as string) expr (env :as dict) (ns :as string)) (cond (= name "if") (if (island-scope?) (let ((marker (create-comment "r-if")) (current-nodes (list)) (initial-result nil)) (effect (fn () (let ((result (let ((cond-val (trampoline (eval-expr (nth expr 1) env)))) (if cond-val (render-to-dom (nth expr 2) env ns) (if (> (len expr) 3) (render-to-dom (nth expr 3) env ns) (create-fragment)))))) (if (dom-parent marker) (do (for-each (fn (n) (dom-remove n)) current-nodes) (set! current-nodes (if (dom-is-fragment? result) (dom-child-nodes result) (list result))) (dom-insert-after marker result)) (set! initial-result result))))) (if (spread? initial-result) initial-result (let ((frag (create-fragment))) (dom-append frag marker) (when initial-result (set! current-nodes (if (dom-is-fragment? initial-result) (dom-child-nodes initial-result) (list initial-result))) (dom-append frag initial-result)) frag))) (let ((cond-val (trampoline (eval-expr (nth expr 1) env)))) (if cond-val (render-to-dom (nth expr 2) env ns) (if (> (len expr) 3) (render-to-dom (nth expr 3) env ns) (create-fragment))))) (= name "when") (if (island-scope?) (let ((marker (create-comment "r-when")) (current-nodes (list)) (initial-result nil)) (effect (fn () (if (dom-parent marker) (do (for-each (fn (n) (dom-remove n)) current-nodes) (set! current-nodes (list)) (when (trampoline (eval-expr (nth expr 1) env)) (let ((frag (create-fragment))) (for-each (fn (i) (dom-append frag (render-to-dom (nth expr i) env ns))) (range 2 (len expr))) (set! current-nodes (dom-child-nodes frag)) (dom-insert-after marker frag)))) (when (trampoline (eval-expr (nth expr 1) env)) (let ((frag (create-fragment))) (for-each (fn (i) (dom-append frag (render-to-dom (nth expr i) env ns))) (range 2 (len expr))) (set! current-nodes (dom-child-nodes frag)) (set! initial-result frag)))))) (if (spread? initial-result) initial-result (let ((frag (create-fragment))) (dom-append frag marker) (when initial-result (dom-append frag initial-result)) frag))) (if (not (trampoline (eval-expr (nth expr 1) env))) (create-fragment) (let ((frag (create-fragment))) (for-each (fn (i) (dom-append frag (render-to-dom (nth expr i) env ns))) (range 2 (len expr))) frag))) (= name "cond") (if (island-scope?) (let ((marker (create-comment "r-cond")) (current-nodes (list)) (initial-result nil)) (effect (fn () (let ((branch (eval-cond (rest expr) env))) (if (dom-parent marker) (do (for-each (fn (n) (dom-remove n)) current-nodes) (set! current-nodes (list)) (when branch (let ((result (render-to-dom branch env ns))) (set! current-nodes (if (dom-is-fragment? result) (dom-child-nodes result) (list result))) (dom-insert-after marker result)))) (when branch (let ((result (render-to-dom branch env ns))) (set! current-nodes (if (dom-is-fragment? result) (dom-child-nodes result) (list result))) (set! initial-result result))))))) (if (spread? initial-result) initial-result (let ((frag (create-fragment))) (dom-append frag marker) (when initial-result (dom-append frag initial-result)) frag))) (let ((branch (eval-cond (rest expr) env))) (if branch (render-to-dom branch env ns) (create-fragment)))) (= name "case") (render-to-dom (trampoline (eval-expr expr env)) env ns) (or (= name "let") (= name "let*")) (let ((local (process-bindings (nth expr 1) env))) (if (= (len expr) 3) (render-to-dom (nth expr 2) local ns) (let ((frag (create-fragment))) (for-each (fn (i) (let ((result (render-to-dom (nth expr i) local ns))) (when (not (spread? result)) (dom-append frag result)))) (range 2 (len expr))) frag))) (= name "letrec") (let ((bindings (nth expr 1)) (body (slice expr 2)) (local (env-extend env))) (for-each (fn (pair) (let ((pname (if (= (type-of (first pair)) "symbol") (symbol-name (first pair)) (str (first pair))))) (env-bind! local pname nil))) bindings) (for-each (fn (pair) (let ((pname (if (= (type-of (first pair)) "symbol") (symbol-name (first pair)) (str (first pair))))) (env-set! local pname (trampoline (eval-expr (nth pair 1) local))))) bindings) (when (> (len body) 1) (for-each (fn (e) (trampoline (eval-expr e local))) (init body))) (render-to-dom (last body) local ns)) (or (= name "begin") (= name "do")) (if (= (len expr) 2) (render-to-dom (nth expr 1) env ns) (let ((frag (create-fragment))) (for-each (fn (i) (let ((result (render-to-dom (nth expr i) env ns))) (when (not (spread? result)) (dom-append frag result)))) (range 1 (len expr))) frag)) (definition-form? name) (do (trampoline (eval-expr expr env)) (create-fragment)) (= name "map") (let ((coll-expr (nth expr 2))) (if (and (island-scope?) (= (type-of coll-expr) "list") (> (len coll-expr) 1) (= (type-of (first coll-expr)) "symbol") (= (symbol-name (first coll-expr)) "deref")) (let ((f (trampoline (eval-expr (nth expr 1) env))) (sig (trampoline (eval-expr (nth coll-expr 1) env)))) (if (signal? sig) (reactive-list f sig env ns) (let ((coll (deref sig)) (frag (create-fragment))) (for-each (fn (item) (let ((val (if (lambda? f) (render-lambda-dom f (list item) env ns) (render-to-dom (apply f (list item)) env ns)))) (dom-append frag val))) coll) frag))) (let ((f (trampoline (eval-expr (nth expr 1) env))) (coll (trampoline (eval-expr (nth expr 2) env))) (frag (create-fragment))) (for-each (fn (item) (let ((val (if (lambda? f) (render-lambda-dom f (list item) env ns) (render-to-dom (apply f (list item)) env ns)))) (dom-append frag val))) coll) frag))) (= name "map-indexed") (let ((f (trampoline (eval-expr (nth expr 1) env))) (coll (trampoline (eval-expr (nth expr 2) env))) (frag (create-fragment))) (for-each-indexed (fn (i item) (let ((val (if (lambda? f) (render-lambda-dom f (list i item) env ns) (render-to-dom (apply f (list i item)) env ns)))) (dom-append frag val))) coll) frag) (= name "filter") (render-to-dom (trampoline (eval-expr expr env)) env ns) (= name "portal") (render-dom-portal (rest expr) env ns) (= name "error-boundary") (render-dom-error-boundary (rest expr) env ns) (= name "for-each") (let ((f (trampoline (eval-expr (nth expr 1) env))) (coll (trampoline (eval-expr (nth expr 2) env))) (frag (create-fragment))) (for-each (fn (item) (let ((val (if (lambda? f) (render-lambda-dom f (list item) env ns) (render-to-dom (apply f (list item)) env ns)))) (dom-append frag val))) coll) frag) (= name "scope") (let ((scope-name (trampoline (eval-expr (nth expr 1) env))) (rest-args (slice expr 2)) (scope-val nil) (body-exprs nil) (frag (create-fragment))) (if (and (>= (len rest-args) 2) (= (type-of (first rest-args)) "keyword") (= (keyword-name (first rest-args)) "value")) (do (set! scope-val (trampoline (eval-expr (nth rest-args 1) env))) (set! body-exprs (slice rest-args 2))) (set! body-exprs rest-args)) (scope-push! scope-name scope-val) (for-each (fn (e) (dom-append frag (render-to-dom e env ns))) body-exprs) (scope-pop! scope-name) frag) (= name "provide") (let ((prov-name (trampoline (eval-expr (nth expr 1) env))) (prov-val (trampoline (eval-expr (nth expr 2) env))) (frag (create-fragment))) (scope-push! prov-name prov-val) (for-each (fn (i) (dom-append frag (render-to-dom (nth expr i) env ns))) (range 3 (len expr))) (scope-pop! prov-name) frag) (= name "cyst") (let ((cyst-key (if (and (> (len expr) 2) (= (type-of (nth expr 1)) "keyword") (= (keyword-name (nth expr 1)) "key")) (str (trampoline (eval-expr (nth expr 2) env))) (next-cyst-id))) (cached (get *memo-cache* cyst-key))) (if (and cached (host-get cached "isConnected")) cached (let ((container (dom-create-element "div" nil)) (disposers (list)) (body-exprs (if (and (> (len expr) 2) (= (type-of (nth expr 1)) "keyword") (= (keyword-name (nth expr 1)) "key")) (slice expr 3) (slice expr 1)))) (dom-set-attr container "data-sx-cyst" cyst-key) (let ((body-dom (with-island-scope (fn (d) (append! disposers d)) (fn () (let ((frag (create-fragment))) (for-each (fn (child) (dom-append frag (render-to-dom child env ns))) body-exprs) frag))))) (dom-append container body-dom) (dom-set-data container "sx-disposers" disposers) (dict-set! *memo-cache* cyst-key container) container)))) :else (render-to-dom (trampoline (eval-expr expr env)) env ns))))
+(define
+ dispatch-render-form
+ :effects (render)
+ (fn
+ ((name :as string) expr (env :as dict) (ns :as string))
+ (cond
+ (= name "if")
+ (if
+ (island-scope?)
+ (let
+ ((marker (create-comment "r-if"))
+ (current-nodes (list))
+ (initial-result nil))
+ (effect
+ (fn
+ ()
+ (let
+ ((result (let ((cond-val (trampoline (eval-expr (nth expr 1) env)))) (if cond-val (render-to-dom (nth expr 2) env ns) (if (> (len expr) 3) (render-to-dom (nth expr 3) env ns) (create-fragment))))))
+ (if
+ (dom-parent marker)
+ (do
+ (for-each (fn (n) (dom-remove n)) current-nodes)
+ (set!
+ current-nodes
+ (if
+ (dom-is-fragment? result)
+ (dom-child-nodes result)
+ (list result)))
+ (dom-insert-after marker result))
+ (set! initial-result result)))))
+ (if
+ (spread? initial-result)
+ initial-result
+ (let
+ ((frag (create-fragment)))
+ (dom-append frag marker)
+ (when
+ initial-result
+ (set!
+ current-nodes
+ (if
+ (dom-is-fragment? initial-result)
+ (dom-child-nodes initial-result)
+ (list initial-result)))
+ (dom-append frag initial-result))
+ frag)))
+ (let
+ ((cond-val (trampoline (eval-expr (nth expr 1) env))))
+ (if
+ cond-val
+ (render-to-dom (nth expr 2) env ns)
+ (if
+ (> (len expr) 3)
+ (render-to-dom (nth expr 3) env ns)
+ (create-fragment)))))
+ (= name "when")
+ (if
+ (island-scope?)
+ (let
+ ((marker (create-comment "r-when"))
+ (current-nodes (list))
+ (initial-result nil))
+ (effect
+ (fn
+ ()
+ (if
+ (dom-parent marker)
+ (do
+ (for-each (fn (n) (dom-remove n)) current-nodes)
+ (set! current-nodes (list))
+ (when
+ (trampoline (eval-expr (nth expr 1) env))
+ (let
+ ((frag (create-fragment)))
+ (for-each
+ (fn
+ (i)
+ (dom-append
+ frag
+ (render-to-dom (nth expr i) env ns)))
+ (range 2 (len expr)))
+ (set! current-nodes (dom-child-nodes frag))
+ (dom-insert-after marker frag))))
+ (when
+ (trampoline (eval-expr (nth expr 1) env))
+ (let
+ ((frag (create-fragment)))
+ (for-each
+ (fn
+ (i)
+ (dom-append frag (render-to-dom (nth expr i) env ns)))
+ (range 2 (len expr)))
+ (set! current-nodes (dom-child-nodes frag))
+ (set! initial-result frag))))))
+ (if
+ (spread? initial-result)
+ initial-result
+ (let
+ ((frag (create-fragment)))
+ (dom-append frag marker)
+ (when initial-result (dom-append frag initial-result))
+ frag)))
+ (if
+ (not (trampoline (eval-expr (nth expr 1) env)))
+ (create-fragment)
+ (let
+ ((frag (create-fragment)))
+ (for-each
+ (fn
+ (i)
+ (dom-append frag (render-to-dom (nth expr i) env ns)))
+ (range 2 (len expr)))
+ frag)))
+ (= name "cond")
+ (if
+ (island-scope?)
+ (let
+ ((marker (create-comment "r-cond"))
+ (current-nodes (list))
+ (initial-result nil))
+ (effect
+ (fn
+ ()
+ (let
+ ((branch (eval-cond (rest expr) env)))
+ (if
+ (dom-parent marker)
+ (do
+ (for-each (fn (n) (dom-remove n)) current-nodes)
+ (set! current-nodes (list))
+ (when
+ branch
+ (let
+ ((result (render-to-dom branch env ns)))
+ (set!
+ current-nodes
+ (if
+ (dom-is-fragment? result)
+ (dom-child-nodes result)
+ (list result)))
+ (dom-insert-after marker result))))
+ (when
+ branch
+ (let
+ ((result (render-to-dom branch env ns)))
+ (set!
+ current-nodes
+ (if
+ (dom-is-fragment? result)
+ (dom-child-nodes result)
+ (list result)))
+ (set! initial-result result)))))))
+ (if
+ (spread? initial-result)
+ initial-result
+ (let
+ ((frag (create-fragment)))
+ (dom-append frag marker)
+ (when initial-result (dom-append frag initial-result))
+ frag)))
+ (let
+ ((branch (eval-cond (rest expr) env)))
+ (if branch (render-to-dom branch env ns) (create-fragment))))
+ (= name "case")
+ (render-to-dom (trampoline (eval-expr expr env)) env ns)
+ (or (= name "let") (= name "let*"))
+ (let
+ ((local (process-bindings (nth expr 1) env)))
+ (if
+ (= (len expr) 3)
+ (render-to-dom (nth expr 2) local ns)
+ (let
+ ((frag (create-fragment)))
+ (for-each
+ (fn
+ (i)
+ (let
+ ((result (render-to-dom (nth expr i) local ns)))
+ (when (not (spread? result)) (dom-append frag result))))
+ (range 2 (len expr)))
+ frag)))
+ (= name "letrec")
+ (let
+ ((bindings (nth expr 1))
+ (body (slice expr 2))
+ (local (env-extend env)))
+ (for-each
+ (fn
+ (pair)
+ (let
+ ((pname (if (= (type-of (first pair)) "symbol") (symbol-name (first pair)) (str (first pair)))))
+ (env-bind! local pname nil)))
+ bindings)
+ (for-each
+ (fn
+ (pair)
+ (let
+ ((pname (if (= (type-of (first pair)) "symbol") (symbol-name (first pair)) (str (first pair)))))
+ (env-set!
+ local
+ pname
+ (trampoline (eval-expr (nth pair 1) local)))))
+ bindings)
+ (when
+ (> (len body) 1)
+ (for-each (fn (e) (trampoline (eval-expr e local))) (init body)))
+ (render-to-dom (last body) local ns))
+ (or (= name "begin") (= name "do"))
+ (if
+ (= (len expr) 2)
+ (render-to-dom (nth expr 1) env ns)
+ (let
+ ((frag (create-fragment)))
+ (for-each
+ (fn
+ (i)
+ (let
+ ((result (render-to-dom (nth expr i) env ns)))
+ (when (not (spread? result)) (dom-append frag result))))
+ (range 1 (len expr)))
+ frag))
+ (definition-form? name)
+ (do (trampoline (eval-expr expr env)) (create-fragment))
+ (= name "map")
+ (let
+ ((coll-expr (nth expr 2)))
+ (if
+ (and
+ (island-scope?)
+ (= (type-of coll-expr) "list")
+ (> (len coll-expr) 1)
+ (= (type-of (first coll-expr)) "symbol")
+ (= (symbol-name (first coll-expr)) "deref"))
+ (let
+ ((f (trampoline (eval-expr (nth expr 1) env)))
+ (sig (trampoline (eval-expr (nth coll-expr 1) env))))
+ (if
+ (signal? sig)
+ (reactive-list f sig env ns)
+ (let
+ ((coll (deref sig)) (frag (create-fragment)))
+ (for-each
+ (fn
+ (item)
+ (let
+ ((val (if (lambda? f) (render-lambda-dom f (list item) env ns) (render-to-dom (apply f (list item)) env ns))))
+ (dom-append frag val)))
+ coll)
+ frag)))
+ (let
+ ((f (trampoline (eval-expr (nth expr 1) env)))
+ (coll (trampoline (eval-expr (nth expr 2) env)))
+ (frag (create-fragment)))
+ (for-each
+ (fn
+ (item)
+ (let
+ ((val (if (lambda? f) (render-lambda-dom f (list item) env ns) (render-to-dom (apply f (list item)) env ns))))
+ (dom-append frag val)))
+ coll)
+ frag)))
+ (= name "map-indexed")
+ (let
+ ((f (trampoline (eval-expr (nth expr 1) env)))
+ (coll (trampoline (eval-expr (nth expr 2) env)))
+ (frag (create-fragment)))
+ (for-each-indexed
+ (fn
+ (i item)
+ (let
+ ((val (if (lambda? f) (render-lambda-dom f (list i item) env ns) (render-to-dom (apply f (list i item)) env ns))))
+ (dom-append frag val)))
+ coll)
+ frag)
+ (= name "filter")
+ (render-to-dom (trampoline (eval-expr expr env)) env ns)
+ (= name "portal")
+ (render-dom-portal (rest expr) env ns)
+ (= name "error-boundary")
+ (render-dom-error-boundary (rest expr) env ns)
+ (= name "for-each")
+ (let
+ ((f (trampoline (eval-expr (nth expr 1) env)))
+ (coll (trampoline (eval-expr (nth expr 2) env)))
+ (frag (create-fragment)))
+ (for-each
+ (fn
+ (item)
+ (let
+ ((val (if (lambda? f) (render-lambda-dom f (list item) env ns) (render-to-dom (apply f (list item)) env ns))))
+ (dom-append frag val)))
+ coll)
+ frag)
+ (= name "scope")
+ (let
+ ((scope-name (trampoline (eval-expr (nth expr 1) env)))
+ (rest-args (slice expr 2))
+ (scope-val nil)
+ (body-exprs nil)
+ (frag (create-fragment)))
+ (if
+ (and
+ (>= (len rest-args) 2)
+ (= (type-of (first rest-args)) "keyword")
+ (= (keyword-name (first rest-args)) "value"))
+ (do
+ (set! scope-val (trampoline (eval-expr (nth rest-args 1) env)))
+ (set! body-exprs (slice rest-args 2)))
+ (set! body-exprs rest-args))
+ (scope-push! scope-name scope-val)
+ (for-each
+ (fn (e) (dom-append frag (render-to-dom e env ns)))
+ body-exprs)
+ (scope-pop! scope-name)
+ frag)
+ (= name "provide")
+ (let
+ ((prov-name (trampoline (eval-expr (nth expr 1) env)))
+ (prov-val (trampoline (eval-expr (nth expr 2) env)))
+ (frag (create-fragment)))
+ (scope-push! prov-name prov-val)
+ (for-each
+ (fn (i) (dom-append frag (render-to-dom (nth expr i) env ns)))
+ (range 3 (len expr)))
+ (scope-pop! prov-name)
+ frag)
+ (= name "cyst")
+ (let
+ ((cyst-key (if (and (> (len expr) 2) (= (type-of (nth expr 1)) "keyword") (= (keyword-name (nth expr 1)) "key")) (str (trampoline (eval-expr (nth expr 2) env))) (next-cyst-id)))
+ (cached (get *memo-cache* cyst-key)))
+ (if
+ (and cached (host-get cached "isConnected"))
+ cached
+ (let
+ ((container (dom-create-element "div" nil))
+ (disposers (list))
+ (body-exprs
+ (if
+ (and
+ (> (len expr) 2)
+ (= (type-of (nth expr 1)) "keyword")
+ (= (keyword-name (nth expr 1)) "key"))
+ (slice expr 3)
+ (slice expr 1))))
+ (dom-set-attr container "data-sx-cyst" cyst-key)
+ (let
+ ((body-dom (with-island-scope (fn (d) (append! disposers d)) (fn () (let ((frag (create-fragment))) (for-each (fn (child) (dom-append frag (render-to-dom child env ns))) body-exprs) frag)))))
+ (dom-append container body-dom)
+ (dom-set-data container "sx-disposers" disposers)
+ (dict-set! *memo-cache* cyst-key container)
+ container))))
+ :else (render-to-dom (trampoline (eval-expr expr env)) env ns))))
-(define render-lambda-dom :effects (render) (fn ((f :as lambda) (args :as list) (env :as dict) (ns :as string)) (let ((local (env-merge (lambda-closure f) env))) (for-each-indexed (fn (i p) (env-bind! local p (nth args i))) (lambda-params f)) (render-to-dom (lambda-body f) local ns))))
+(define
+ render-lambda-dom
+ :effects (render)
+ (fn
+ ((f :as lambda) (args :as list) (env :as dict) (ns :as string))
+ (let
+ ((local (env-merge (lambda-closure f) env)))
+ (for-each-indexed
+ (fn (i p) (env-bind! local p (nth args i)))
+ (lambda-params f))
+ (render-to-dom (lambda-body f) local ns))))
-(define render-dom-island :effects (render mutation) (fn ((island :as island) (args :as list) (env :as dict) (ns :as string)) (let ((kwargs (dict)) (children (list))) (reduce (fn (state arg) (let ((skip (get state "skip"))) (if skip (assoc state "skip" false "i" (inc (get state "i"))) (if (and (= (type-of arg) "keyword") (< (inc (get state "i")) (len args))) (let ((val (trampoline (eval-expr (nth args (inc (get state "i"))) env)))) (dict-set! kwargs (keyword-name arg) val) (assoc state "skip" true "i" (inc (get state "i")))) (do (append! children arg) (assoc state "i" (inc (get state "i")))))))) (dict "i" 0 "skip" false) args) (let ((local (env-merge (component-closure island) env)) (island-name (component-name island))) (for-each (fn (p) (env-bind! local p (if (dict-has? kwargs p) (dict-get kwargs p) nil))) (component-params island)) (when (component-has-children? island) (let ((child-frag (create-fragment))) (for-each (fn (c) (dom-append child-frag (render-to-dom c env ns))) children) (env-bind! local "children" child-frag))) (let ((container (dom-create-element "span" nil)) (disposers (list))) (dom-set-attr container "data-sx-island" island-name) (mark-processed! container "island-hydrated") (let ((body-dom (with-island-scope (fn (disposable) (append! disposers disposable)) (fn () (render-to-dom (component-body island) local ns))))) (dom-append container body-dom) (dom-set-data container "sx-disposers" disposers) container))))))
+(define
+ render-dom-island
+ :effects (render mutation)
+ (fn
+ ((island :as island) (args :as list) (env :as dict) (ns :as string))
+ (let
+ ((kwargs (dict)) (children (list)))
+ (reduce
+ (fn
+ (state arg)
+ (let
+ ((skip (get state "skip")))
+ (if
+ skip
+ (assoc state "skip" false "i" (inc (get state "i")))
+ (if
+ (and
+ (= (type-of arg) "keyword")
+ (< (inc (get state "i")) (len args)))
+ (let
+ ((val (trampoline (eval-expr (nth args (inc (get state "i"))) env))))
+ (dict-set! kwargs (keyword-name arg) val)
+ (assoc state "skip" true "i" (inc (get state "i"))))
+ (do
+ (append! children arg)
+ (assoc state "i" (inc (get state "i"))))))))
+ (dict "i" 0 "skip" false)
+ args)
+ (let
+ ((local (env-merge (component-closure island) env))
+ (island-name (component-name island)))
+ (for-each
+ (fn
+ (p)
+ (env-bind!
+ local
+ p
+ (if (dict-has? kwargs p) (dict-get kwargs p) nil)))
+ (component-params island))
+ (when
+ (component-has-children? island)
+ (let
+ ((child-frag (create-fragment)))
+ (for-each
+ (fn (c) (dom-append child-frag (render-to-dom c env ns)))
+ children)
+ (env-bind! local "children" child-frag)))
+ (let
+ ((container (dom-create-element "span" nil)) (disposers (list)))
+ (begin
+ (dom-set-attr container "data-sx-island" island-name)
+ (when
+ (not (empty-dict? kwargs))
+ (dom-set-attr container "data-sx-state" (sx-serialize kwargs))))
+ (mark-processed! container "island-hydrated")
+ (let
+ ((body-dom (with-island-scope (fn (disposable) (append! disposers disposable)) (fn () (render-to-dom (component-body island) local ns)))))
+ (dom-append container body-dom)
+ (dom-set-data container "sx-disposers" disposers)
+ container))))))
-(define render-dom-lake :effects (render) (fn ((args :as list) (env :as dict) (ns :as string)) (let ((lake-id nil) (lake-tag "div") (children (list))) (reduce (fn (state arg) (let ((skip (get state "skip"))) (if skip (assoc state "skip" false "i" (inc (get state "i"))) (if (and (= (type-of arg) "keyword") (< (inc (get state "i")) (len args))) (let ((kname (keyword-name arg)) (kval (trampoline (eval-expr (nth args (inc (get state "i"))) env)))) (cond (= kname "id") (set! lake-id kval) (= kname "tag") (set! lake-tag kval)) (assoc state "skip" true "i" (inc (get state "i")))) (do (append! children arg) (assoc state "i" (inc (get state "i")))))))) (dict "i" 0 "skip" false) args) (let ((el (dom-create-element lake-tag nil))) (dom-set-attr el "data-sx-lake" (or lake-id "")) (for-each (fn (c) (dom-append el (render-to-dom c env ns))) children) el))))
+(define
+ render-dom-lake
+ :effects (render)
+ (fn
+ ((args :as list) (env :as dict) (ns :as string))
+ (let
+ ((lake-id nil) (lake-tag "div") (children (list)))
+ (reduce
+ (fn
+ (state arg)
+ (let
+ ((skip (get state "skip")))
+ (if
+ skip
+ (assoc state "skip" false "i" (inc (get state "i")))
+ (if
+ (and
+ (= (type-of arg) "keyword")
+ (< (inc (get state "i")) (len args)))
+ (let
+ ((kname (keyword-name arg))
+ (kval
+ (trampoline
+ (eval-expr (nth args (inc (get state "i"))) env))))
+ (cond
+ (= kname "id")
+ (set! lake-id kval)
+ (= kname "tag")
+ (set! lake-tag kval))
+ (assoc state "skip" true "i" (inc (get state "i"))))
+ (do
+ (append! children arg)
+ (assoc state "i" (inc (get state "i"))))))))
+ (dict "i" 0 "skip" false)
+ args)
+ (let
+ ((el (dom-create-element lake-tag nil)))
+ (dom-set-attr el "data-sx-lake" (or lake-id ""))
+ (for-each
+ (fn (c) (dom-append el (render-to-dom c env ns)))
+ children)
+ el))))
-(define render-dom-marsh :effects (render) (fn ((args :as list) (env :as dict) (ns :as string)) (let ((marsh-id nil) (marsh-tag "div") (marsh-transform nil) (children (list))) (reduce (fn (state arg) (let ((skip (get state "skip"))) (if skip (assoc state "skip" false "i" (inc (get state "i"))) (if (and (= (type-of arg) "keyword") (< (inc (get state "i")) (len args))) (let ((kname (keyword-name arg)) (kval (trampoline (eval-expr (nth args (inc (get state "i"))) env)))) (cond (= kname "id") (set! marsh-id kval) (= kname "tag") (set! marsh-tag kval) (= kname "transform") (set! marsh-transform kval)) (assoc state "skip" true "i" (inc (get state "i")))) (do (append! children arg) (assoc state "i" (inc (get state "i")))))))) (dict "i" 0 "skip" false) args) (let ((el (dom-create-element marsh-tag nil))) (dom-set-attr el "data-sx-marsh" (or marsh-id "")) (when marsh-transform (dom-set-data el "sx-marsh-transform" marsh-transform)) (dom-set-data el "sx-marsh-env" env) (for-each (fn (c) (dom-append el (render-to-dom c env ns))) children) el))))
+(define
+ render-dom-marsh
+ :effects (render)
+ (fn
+ ((args :as list) (env :as dict) (ns :as string))
+ (let
+ ((marsh-id nil)
+ (marsh-tag "div")
+ (marsh-transform nil)
+ (children (list)))
+ (reduce
+ (fn
+ (state arg)
+ (let
+ ((skip (get state "skip")))
+ (if
+ skip
+ (assoc state "skip" false "i" (inc (get state "i")))
+ (if
+ (and
+ (= (type-of arg) "keyword")
+ (< (inc (get state "i")) (len args)))
+ (let
+ ((kname (keyword-name arg))
+ (kval
+ (trampoline
+ (eval-expr (nth args (inc (get state "i"))) env))))
+ (cond
+ (= kname "id")
+ (set! marsh-id kval)
+ (= kname "tag")
+ (set! marsh-tag kval)
+ (= kname "transform")
+ (set! marsh-transform kval))
+ (assoc state "skip" true "i" (inc (get state "i"))))
+ (do
+ (append! children arg)
+ (assoc state "i" (inc (get state "i"))))))))
+ (dict "i" 0 "skip" false)
+ args)
+ (let
+ ((el (dom-create-element marsh-tag nil)))
+ (dom-set-attr el "data-sx-marsh" (or marsh-id ""))
+ (when
+ marsh-transform
+ (dom-set-data el "sx-marsh-transform" marsh-transform))
+ (dom-set-data el "sx-marsh-env" env)
+ (for-each
+ (fn (c) (dom-append el (render-to-dom c env ns)))
+ children)
+ el))))
-(define reactive-text :effects (render mutation) (fn (sig) (let ((node (create-text-node (str (deref sig))))) (effect (fn () (dom-set-text-content node (str (deref sig))))) node)))
+(define
+ reactive-text
+ :effects (render mutation)
+ (fn
+ (sig)
+ (let
+ ((node (create-text-node (str (deref sig)))))
+ (effect (fn () (dom-set-text-content node (str (deref sig)))))
+ node)))
-(define reactive-attr :effects (render mutation) (fn (el (attr-name :as string) (compute-fn :as lambda)) (let ((existing (or (dom-get-attr el "data-sx-reactive-attrs") "")) (updated (if (empty? existing) attr-name (str existing "," attr-name)))) (dom-set-attr el "data-sx-reactive-attrs" updated)) (effect (fn () (let ((raw (compute-fn))) (let ((val (if (signal? raw) (deref raw) raw))) (cond (or (nil? val) (= val false)) (dom-remove-attr el attr-name) (= val true) (dom-set-attr el attr-name "") :else (dom-set-attr el attr-name (str val)))))))))
+(define
+ reactive-attr
+ :effects (render mutation)
+ (fn
+ (el (attr-name :as string) (compute-fn :as lambda))
+ (let
+ ((existing (or (dom-get-attr el "data-sx-reactive-attrs") ""))
+ (updated
+ (if (empty? existing) attr-name (str existing "," attr-name))))
+ (dom-set-attr el "data-sx-reactive-attrs" updated))
+ (effect
+ (fn
+ ()
+ (let
+ ((raw (compute-fn)))
+ (let
+ ((val (if (signal? raw) (deref raw) raw)))
+ (cond
+ (or (nil? val) (= val false))
+ (dom-remove-attr el attr-name)
+ (= val true)
+ (dom-set-attr el attr-name "")
+ :else (dom-set-attr el attr-name (str val)))))))))
-(define reactive-spread :effects (render mutation) (fn (el (render-fn :as lambda)) (let ((prev-classes (list)) (prev-extra-keys (list))) (let ((existing (or (dom-get-attr el "data-sx-reactive-attrs") ""))) (dom-set-attr el "data-sx-reactive-attrs" (if (empty? existing) "_spread" (str existing ",_spread")))) (effect (fn () (when (not (empty? prev-classes)) (let ((current (or (dom-get-attr el "class") "")) (tokens (filter (fn (c) (not (= c ""))) (split current " "))) (kept (filter (fn (c) (not (some (fn (pc) (= pc c)) prev-classes))) tokens))) (if (empty? kept) (dom-remove-attr el "class") (dom-set-attr el "class" (join " " kept))))) (for-each (fn (k) (dom-remove-attr el k)) prev-extra-keys) (let ((result (render-fn))) (if (spread? result) (let ((attrs (spread-attrs result)) (cls-str (or (dict-get attrs "class") "")) (new-classes (filter (fn (c) (not (= c ""))) (split cls-str " "))) (extra-keys (filter (fn (k) (not (= k "class"))) (keys attrs)))) (set! prev-classes new-classes) (set! prev-extra-keys extra-keys) (when (not (empty? new-classes)) (let ((current (or (dom-get-attr el "class") ""))) (dom-set-attr el "class" (if (and current (not (= current ""))) (str current " " cls-str) cls-str)))) (for-each (fn (k) (dom-set-attr el k (str (dict-get attrs k)))) extra-keys) (run-post-render-hooks)) (do (set! prev-classes (list)) (set! prev-extra-keys (list))))))))))
+(define
+ reactive-spread
+ :effects (render mutation)
+ (fn
+ (el (render-fn :as lambda))
+ (let
+ ((prev-classes (list)) (prev-extra-keys (list)))
+ (let
+ ((existing (or (dom-get-attr el "data-sx-reactive-attrs") "")))
+ (dom-set-attr
+ el
+ "data-sx-reactive-attrs"
+ (if (empty? existing) "_spread" (str existing ",_spread"))))
+ (effect
+ (fn
+ ()
+ (when
+ (not (empty? prev-classes))
+ (let
+ ((current (or (dom-get-attr el "class") ""))
+ (tokens
+ (filter (fn (c) (not (= c ""))) (split current " ")))
+ (kept
+ (filter
+ (fn (c) (not (some (fn (pc) (= pc c)) prev-classes)))
+ tokens)))
+ (if
+ (empty? kept)
+ (dom-remove-attr el "class")
+ (dom-set-attr el "class" (join " " kept)))))
+ (for-each (fn (k) (dom-remove-attr el k)) prev-extra-keys)
+ (let
+ ((result (render-fn)))
+ (if
+ (spread? result)
+ (let
+ ((attrs (spread-attrs result))
+ (cls-str (or (dict-get attrs "class") ""))
+ (new-classes
+ (filter (fn (c) (not (= c ""))) (split cls-str " ")))
+ (extra-keys
+ (filter (fn (k) (not (= k "class"))) (keys attrs))))
+ (set! prev-classes new-classes)
+ (set! prev-extra-keys extra-keys)
+ (when
+ (not (empty? new-classes))
+ (let
+ ((current (or (dom-get-attr el "class") "")))
+ (dom-set-attr
+ el
+ "class"
+ (if
+ (and current (not (= current "")))
+ (str current " " cls-str)
+ cls-str))))
+ (for-each
+ (fn (k) (dom-set-attr el k (str (dict-get attrs k))))
+ extra-keys)
+ (run-post-render-hooks))
+ (do (set! prev-classes (list)) (set! prev-extra-keys (list))))))))))
-(define reactive-fragment :effects (render mutation) (fn ((test-fn :as lambda) (render-fn :as lambda) (env :as dict) (ns :as string)) (let ((marker (create-comment "island-fragment")) (current-nodes (list))) (effect (fn () (for-each (fn (n) (dom-remove n)) current-nodes) (set! current-nodes (list)) (when (test-fn) (let ((frag (render-fn))) (set! current-nodes (dom-child-nodes frag)) (dom-insert-after marker frag))))) marker)))
+(define
+ reactive-fragment
+ :effects (render mutation)
+ (fn
+ ((test-fn :as lambda)
+ (render-fn :as lambda)
+ (env :as dict)
+ (ns :as string))
+ (let
+ ((marker (create-comment "island-fragment")) (current-nodes (list)))
+ (effect
+ (fn
+ ()
+ (for-each (fn (n) (dom-remove n)) current-nodes)
+ (set! current-nodes (list))
+ (when
+ (test-fn)
+ (let
+ ((frag (render-fn)))
+ (set! current-nodes (dom-child-nodes frag))
+ (dom-insert-after marker frag)))))
+ marker)))
-(define render-list-item :effects (render) (fn ((map-fn :as lambda) item (env :as dict) (ns :as string)) (if (lambda? map-fn) (render-lambda-dom map-fn (list item) env ns) (render-to-dom (apply map-fn (list item)) env ns))))
+(define
+ render-list-item
+ :effects (render)
+ (fn
+ ((map-fn :as lambda) item (env :as dict) (ns :as string))
+ (if
+ (lambda? map-fn)
+ (render-lambda-dom map-fn (list item) env ns)
+ (render-to-dom (apply map-fn (list item)) env ns))))
-(define extract-key :effects (render) (fn (node (index :as number)) (let ((k (dom-get-attr node "key"))) (if k (do (dom-remove-attr node "key") k) (let ((dk (dom-get-data node "key"))) (if dk (str dk) (str "__idx_" index)))))))
+(define
+ extract-key
+ :effects (render)
+ (fn
+ (node (index :as number))
+ (let
+ ((k (dom-get-attr node "key")))
+ (if
+ k
+ (do (dom-remove-attr node "key") k)
+ (let
+ ((dk (dom-get-data node "key")))
+ (if dk (str dk) (str "__idx_" index)))))))
-(define reactive-list :effects (render mutation) (fn ((map-fn :as lambda) (items-sig :as signal) (env :as dict) (ns :as string)) (let ((container (create-fragment)) (marker (create-comment "island-list")) (key-map (dict)) (key-order (list))) (dom-append container marker) (effect (fn () (let ((items (deref items-sig))) (if (dom-parent marker) (let ((new-map (dict)) (new-keys (list)) (has-keys false)) (for-each-indexed (fn (idx item) (let ((rendered (render-list-item map-fn item env ns)) (key (extract-key rendered idx))) (when (and (not has-keys) (not (starts-with? key "__idx_"))) (set! has-keys true)) (if (dict-has? key-map key) (dict-set! new-map key (dict-get key-map key)) (dict-set! new-map key rendered)) (append! new-keys key))) items) (if (not has-keys) (do (dom-remove-children-after marker) (let ((frag (create-fragment))) (for-each (fn (k) (dom-append frag (dict-get new-map k))) new-keys) (dom-insert-after marker frag))) (do (for-each (fn (old-key) (when (not (dict-has? new-map old-key)) (dom-remove (dict-get key-map old-key)))) key-order) (let ((cursor marker)) (for-each (fn (k) (let ((node (dict-get new-map k)) (next (dom-next-sibling cursor))) (when (not (identical? node next)) (dom-insert-after cursor node)) (set! cursor node))) new-keys)))) (set! key-map new-map) (set! key-order new-keys)) (for-each-indexed (fn (idx item) (let ((rendered (render-list-item map-fn item env ns)) (key (extract-key rendered idx))) (dict-set! key-map key rendered) (append! key-order key) (dom-append container rendered))) items))))) container)))
+(define
+ reactive-list
+ :effects (render mutation)
+ (fn
+ ((map-fn :as lambda)
+ (items-sig :as signal)
+ (env :as dict)
+ (ns :as string))
+ (let
+ ((container (create-fragment))
+ (marker (create-comment "island-list"))
+ (key-map (dict))
+ (key-order (list)))
+ (dom-append container marker)
+ (effect
+ (fn
+ ()
+ (let
+ ((items (deref items-sig)))
+ (if
+ (dom-parent marker)
+ (let
+ ((new-map (dict)) (new-keys (list)) (has-keys false))
+ (for-each-indexed
+ (fn
+ (idx item)
+ (let
+ ((rendered (render-list-item map-fn item env ns))
+ (key (extract-key rendered idx)))
+ (when
+ (and
+ (not has-keys)
+ (not (starts-with? key "__idx_")))
+ (set! has-keys true))
+ (if
+ (dict-has? key-map key)
+ (dict-set! new-map key (dict-get key-map key))
+ (dict-set! new-map key rendered))
+ (append! new-keys key)))
+ items)
+ (if
+ (not has-keys)
+ (do
+ (dom-remove-children-after marker)
+ (let
+ ((frag (create-fragment)))
+ (for-each
+ (fn (k) (dom-append frag (dict-get new-map k)))
+ new-keys)
+ (dom-insert-after marker frag)))
+ (do
+ (for-each
+ (fn
+ (old-key)
+ (when
+ (not (dict-has? new-map old-key))
+ (dom-remove (dict-get key-map old-key))))
+ key-order)
+ (let
+ ((cursor marker))
+ (for-each
+ (fn
+ (k)
+ (let
+ ((node (dict-get new-map k))
+ (next (dom-next-sibling cursor)))
+ (when
+ (not (identical? node next))
+ (dom-insert-after cursor node))
+ (set! cursor node)))
+ new-keys))))
+ (set! key-map new-map)
+ (set! key-order new-keys))
+ (for-each-indexed
+ (fn
+ (idx item)
+ (let
+ ((rendered (render-list-item map-fn item env ns))
+ (key (extract-key rendered idx)))
+ (dict-set! key-map key rendered)
+ (append! key-order key)
+ (dom-append container rendered)))
+ items)))))
+ container)))
-(define bind-input :effects (render mutation) (fn (el (sig :as signal)) (let ((input-type (lower (or (dom-get-attr el "type") ""))) (is-checkbox (or (= input-type "checkbox") (= input-type "radio")))) (if is-checkbox (dom-set-prop el "checked" (deref sig)) (dom-set-prop el "value" (str (deref sig)))) (effect (fn () (if is-checkbox (dom-set-prop el "checked" (deref sig)) (let ((v (str (deref sig)))) (when (!= (dom-get-prop el "value") v) (dom-set-prop el "value" v)))))) (dom-on el (if is-checkbox "change" "input") (fn (e) (if is-checkbox (reset! sig (dom-get-prop el "checked")) (reset! sig (dom-get-prop el "value"))))))))
+(define
+ bind-input
+ :effects (render mutation)
+ (fn
+ (el (sig :as signal))
+ (let
+ ((input-type (lower (or (dom-get-attr el "type") "")))
+ (is-checkbox (or (= input-type "checkbox") (= input-type "radio"))))
+ (if
+ is-checkbox
+ (dom-set-prop el "checked" (deref sig))
+ (dom-set-prop el "value" (str (deref sig))))
+ (effect
+ (fn
+ ()
+ (if
+ is-checkbox
+ (dom-set-prop el "checked" (deref sig))
+ (let
+ ((v (str (deref sig))))
+ (when
+ (!= (dom-get-prop el "value") v)
+ (dom-set-prop el "value" v))))))
+ (dom-on
+ el
+ (if is-checkbox "change" "input")
+ (fn
+ (e)
+ (if
+ is-checkbox
+ (reset! sig (dom-get-prop el "checked"))
+ (reset! sig (dom-get-prop el "value"))))))))
(define *use-cek-reactive* true)
(define enable-cek-reactive! (fn () (set! *use-cek-reactive* true)))
-(define cek-reactive-text :effects (render mutation) (fn (expr env) (let ((node (create-text-node "")) (update-fn (fn (val) (dom-set-text-content node (str val))))) (let ((initial (cek-run (make-cek-state expr env (list (make-reactive-reset-frame env update-fn true)))))) (dom-set-text-content node (str initial)) node))))
+(define
+ cek-reactive-text
+ :effects (render mutation)
+ (fn
+ (expr env)
+ (let
+ ((node (create-text-node ""))
+ (update-fn (fn (val) (dom-set-text-content node (str val)))))
+ (let
+ ((initial (cek-run (make-cek-state expr env (list (make-reactive-reset-frame env update-fn true))))))
+ (dom-set-text-content node (str initial))
+ node))))
-(define cek-reactive-attr :effects (render mutation) (fn (el attr-name expr env) (let ((update-fn (fn (val) (cond (or (nil? val) (= val false)) (dom-remove-attr el attr-name) (= val true) (dom-set-attr el attr-name "") :else (dom-set-attr el attr-name (str val)))))) (let ((existing (or (dom-get-attr el "data-sx-reactive-attrs") "")) (updated (if (empty? existing) attr-name (str existing "," attr-name)))) (dom-set-attr el "data-sx-reactive-attrs" updated)) (let ((initial (cek-run (make-cek-state expr env (list (make-reactive-reset-frame env update-fn true)))))) (cek-call update-fn (list initial))))))
+(define
+ cek-reactive-attr
+ :effects (render mutation)
+ (fn
+ (el attr-name expr env)
+ (let
+ ((update-fn (fn (val) (cond (or (nil? val) (= val false)) (dom-remove-attr el attr-name) (= val true) (dom-set-attr el attr-name "") :else (dom-set-attr el attr-name (str val))))))
+ (let
+ ((existing (or (dom-get-attr el "data-sx-reactive-attrs") ""))
+ (updated
+ (if (empty? existing) attr-name (str existing "," attr-name))))
+ (dom-set-attr el "data-sx-reactive-attrs" updated))
+ (let
+ ((initial (cek-run (make-cek-state expr env (list (make-reactive-reset-frame env update-fn true))))))
+ (cek-call update-fn (list initial))))))
-(define render-dom-portal :effects (render) (fn ((args :as list) (env :as dict) (ns :as string)) (let ((selector (trampoline (eval-expr (first args) env))) (target (or (dom-query selector) (dom-ensure-element selector)))) (if (not target) (create-comment (str "portal: " selector " (not found)")) (let ((marker (create-comment (str "portal: " selector))) (frag (create-fragment))) (for-each (fn (child) (dom-append frag (render-to-dom child env ns))) (rest args)) (let ((portal-nodes (dom-child-nodes frag))) (dom-append target frag) (register-in-scope (fn () (for-each (fn (n) (dom-remove n)) portal-nodes)))) marker)))))
+(define
+ render-dom-portal
+ :effects (render)
+ (fn
+ ((args :as list) (env :as dict) (ns :as string))
+ (let
+ ((selector (trampoline (eval-expr (first args) env)))
+ (target (or (dom-query selector) (dom-ensure-element selector))))
+ (if
+ (not target)
+ (create-comment (str "portal: " selector " (not found)"))
+ (let
+ ((marker (create-comment (str "portal: " selector)))
+ (frag (create-fragment)))
+ (for-each
+ (fn (child) (dom-append frag (render-to-dom child env ns)))
+ (rest args))
+ (let
+ ((portal-nodes (dom-child-nodes frag)))
+ (dom-append target frag)
+ (register-in-scope
+ (fn () (for-each (fn (n) (dom-remove n)) portal-nodes))))
+ marker)))))
-(define render-dom-error-boundary :effects (render) (fn ((args :as list) (env :as dict) (ns :as string)) (let ((fallback-expr (first args)) (body-exprs (rest args)) (container (dom-create-element "div" nil)) (retry-version (signal 0))) (dom-set-attr container "data-sx-boundary" "true") (effect (fn () (deref retry-version) (dom-set-prop container "innerHTML" "") (scope-push! "sx-island-scope" nil) (try-catch (fn () (let ((frag (create-fragment))) (for-each (fn (child) (dom-append frag (render-to-dom child env ns))) body-exprs) (dom-append container frag)) (scope-pop! "sx-island-scope")) (fn (err) (scope-pop! "sx-island-scope") (let ((fallback-fn (trampoline (eval-expr fallback-expr env))) (retry-fn (fn () (swap! retry-version (fn (n) (+ n 1)))))) (let ((fallback-dom (if (lambda? fallback-fn) (render-lambda-dom fallback-fn (list err retry-fn) env ns) (render-to-dom (apply fallback-fn (list err retry-fn)) env ns)))) (dom-append container fallback-dom))))))) container)))
+(define
+ render-dom-error-boundary
+ :effects (render)
+ (fn
+ ((args :as list) (env :as dict) (ns :as string))
+ (let
+ ((fallback-expr (first args))
+ (body-exprs (rest args))
+ (container (dom-create-element "div" nil))
+ (retry-version (signal 0)))
+ (dom-set-attr container "data-sx-boundary" "true")
+ (effect
+ (fn
+ ()
+ (deref retry-version)
+ (dom-set-prop container "innerHTML" "")
+ (scope-push! "sx-island-scope" nil)
+ (try-catch
+ (fn
+ ()
+ (let
+ ((frag (create-fragment)))
+ (for-each
+ (fn
+ (child)
+ (dom-append frag (render-to-dom child env ns)))
+ body-exprs)
+ (dom-append container frag))
+ (scope-pop! "sx-island-scope"))
+ (fn
+ (err)
+ (scope-pop! "sx-island-scope")
+ (let
+ ((fallback-fn (trampoline (eval-expr fallback-expr env)))
+ (retry-fn
+ (fn () (swap! retry-version (fn (n) (+ n 1))))))
+ (let
+ ((fallback-dom (if (lambda? fallback-fn) (render-lambda-dom fallback-fn (list err retry-fn) env ns) (render-to-dom (apply fallback-fn (list err retry-fn)) env ns))))
+ (dom-append container fallback-dom)))))))
+ container)))
diff --git a/web/orchestration.sx b/web/orchestration.sx
index aab32928..06e5a667 100644
--- a/web/orchestration.sx
+++ b/web/orchestration.sx
@@ -299,7 +299,11 @@
()
(let
((swap-result (swap-dom-nodes target content swap-style)))
- (post-swap (or swap-result target)))))))))))))
+ (post-swap
+ (if
+ (= swap-style "outerHTML")
+ (dom-parent (or swap-result target))
+ (or swap-result target))))))))))))))
(define
handle-html-response
@@ -325,8 +329,15 @@
use-transition
(fn
()
- (swap-html-string target html swap-style)
- (post-swap target))))
+ (let
+ ((swap-root (swap-html-string target html swap-style)))
+ (log-info
+ (str
+ "swap-root: "
+ (if swap-root (dom-tag-name swap-root) "nil")
+ " target: "
+ (dom-tag-name target)))
+ (post-swap (or swap-root target))))))
(let
((container (dom-create-element "div" nil)))
(dom-set-inner-html container (dom-body-inner-html doc))