From 86363d9f34ff9432ab7fcbb094724e6623e5f7ad Mon Sep 17 00:00:00 2001 From: giles Date: Wed, 11 Mar 2026 03:51:59 +0000 Subject: [PATCH] Fix browser: set render-active in DOM adapter + on adapter init MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Browser always evaluates in render context — _renderMode must be true when DOM adapter is loaded, and render-to-dom must call set-render-active!. Fixes 'Undefined symbol: <>' error in browser. Co-Authored-By: Claude Opus 4.6 --- shared/static/scripts/sx-browser.js | 6 ++++-- shared/sx/ref/adapter-dom.sx | 1 + shared/sx/ref/bootstrap_js.py | 1 + 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/shared/static/scripts/sx-browser.js b/shared/static/scripts/sx-browser.js index 9d00e02..5d48f5a 100644 --- a/shared/static/scripts/sx-browser.js +++ b/shared/static/scripts/sx-browser.js @@ -14,7 +14,7 @@ // ========================================================================= var NIL = Object.freeze({ _nil: true, toString: function() { return "nil"; } }); - var SX_VERSION = "2026-03-11T03:49:41Z"; + var SX_VERSION = "2026-03-11T03:51:49Z"; function isNil(x) { return x === NIL || x === null || x === undefined; } function isSxTruthy(x) { return x !== false && !isNil(x); } @@ -1537,7 +1537,8 @@ return result; }, args); var MATH_NS = "http://www.w3.org/1998/Math/MathML"; // render-to-dom - var renderToDom = function(expr, env, ns) { return (function() { var _m = typeOf(expr); if (_m == "nil") return createFragment(); if (_m == "boolean") return createFragment(); if (_m == "raw-html") return domParseHtml(rawHtmlContent(expr)); if (_m == "string") return createTextNode(expr); if (_m == "number") return createTextNode((String(expr))); if (_m == "symbol") return renderToDom(trampoline(evalExpr(expr, env)), env, ns); if (_m == "keyword") return createTextNode(keywordName(expr)); if (_m == "dom-node") return expr; if (_m == "dict") return createFragment(); if (_m == "list") return (isSxTruthy(isEmpty(expr)) ? createFragment() : renderDomList(expr, env, ns)); return (isSxTruthy(isSignal(expr)) ? (isSxTruthy(_islandScope) ? reactiveText(expr) : createTextNode((String(deref(expr))))) : createTextNode((String(expr)))); })(); }; + var renderToDom = function(expr, env, ns) { setRenderActiveB(true); +return (function() { var _m = typeOf(expr); if (_m == "nil") return createFragment(); if (_m == "boolean") return createFragment(); if (_m == "raw-html") return domParseHtml(rawHtmlContent(expr)); if (_m == "string") return createTextNode(expr); if (_m == "number") return createTextNode((String(expr))); if (_m == "symbol") return renderToDom(trampoline(evalExpr(expr, env)), env, ns); if (_m == "keyword") return createTextNode(keywordName(expr)); if (_m == "dom-node") return expr; if (_m == "dict") return createFragment(); if (_m == "list") return (isSxTruthy(isEmpty(expr)) ? createFragment() : renderDomList(expr, env, ns)); return (isSxTruthy(isSignal(expr)) ? (isSxTruthy(_islandScope) ? reactiveText(expr) : createTextNode((String(deref(expr))))) : createTextNode((String(expr)))); })(); }; // render-dom-list var renderDomList = function(expr, env, ns) { return (function() { @@ -3459,6 +3460,7 @@ return (isSxTruthy((_batchDepth == 0)) ? (function() { // Register DOM adapter as the render dispatch target for the evaluator. _renderExprFn = function(expr, env) { return renderToDom(expr, env, null); }; + _renderMode = true; // Browser always evaluates in render context. var SVG_NS = "http://www.w3.org/2000/svg"; var MATH_NS = "http://www.w3.org/1998/Math/MathML"; diff --git a/shared/sx/ref/adapter-dom.sx b/shared/sx/ref/adapter-dom.sx index 796e02b..e659b99 100644 --- a/shared/sx/ref/adapter-dom.sx +++ b/shared/sx/ref/adapter-dom.sx @@ -20,6 +20,7 @@ (define render-to-dom (fn (expr env ns) + (set-render-active! true) (case (type-of expr) ;; nil / boolean false / boolean true → empty fragment "nil" (create-fragment) diff --git a/shared/sx/ref/bootstrap_js.py b/shared/sx/ref/bootstrap_js.py index 0ba9161..9eb30eb 100644 --- a/shared/sx/ref/bootstrap_js.py +++ b/shared/sx/ref/bootstrap_js.py @@ -2776,6 +2776,7 @@ PLATFORM_DOM_JS = """ // Register DOM adapter as the render dispatch target for the evaluator. _renderExprFn = function(expr, env) { return renderToDom(expr, env, null); }; + _renderMode = true; // Browser always evaluates in render context. var SVG_NS = "http://www.w3.org/2000/svg"; var MATH_NS = "http://www.w3.org/1998/Math/MathML";