Island disposal, reactive lists, input binding, and Phase 2 plan
- Effect and computed auto-register disposers with island scope via register-in-scope; dispose-islands-in called before every swap point (orchestration.sx) to clean up intervals/subscriptions on navigation. - Map + deref inside islands auto-upgrades to reactive-list for signal- bound list rendering. Demo island with add/remove items. - New :bind attribute for two-way signal-input binding (text, checkbox, radio, textarea, select). bind-input in adapter-dom.sx handles both signal→element (effect) and element→signal (event listener). - Phase 2 plan page at /reactive-islands/phase2 covering input binding, keyed reconciliation, reactive class/style, refs, portals, error boundaries, suspense, and transitions. - Updated status tables in overview and plan pages. - Fixed stopwatch reset (fn body needs do wrapper for multiple exprs). Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -14,7 +14,7 @@
|
||||
// =========================================================================
|
||||
|
||||
var NIL = Object.freeze({ _nil: true, toString: function() { return "nil"; } });
|
||||
var SX_VERSION = "2026-03-08T15:15:32Z";
|
||||
var SX_VERSION = "2026-03-08T16:03:46Z";
|
||||
|
||||
function isNil(x) { return x === NIL || x === null || x === undefined; }
|
||||
function isSxTruthy(x) { return x !== false && !isNil(x); }
|
||||
@@ -1492,7 +1492,7 @@ return result; }, args);
|
||||
return (isSxTruthy(skip) ? assoc(state, "skip", false, "i", (get(state, "i") + 1)) : (isSxTruthy((isSxTruthy((typeOf(arg) == "keyword")) && ((get(state, "i") + 1) < len(args)))) ? (function() {
|
||||
var attrName = keywordName(arg);
|
||||
var attrVal = trampoline(evalExpr(nth(args, (get(state, "i") + 1)), env));
|
||||
(isSxTruthy(sxOr(isNil(attrVal), (attrVal == false))) ? NIL : (isSxTruthy((isSxTruthy(startsWith(attrName, "on-")) && isCallable(attrVal))) ? domListen(el, slice(attrName, 3), attrVal) : (isSxTruthy(contains(BOOLEAN_ATTRS, attrName)) ? (isSxTruthy(attrVal) ? domSetAttr(el, attrName, "") : NIL) : (isSxTruthy((attrVal == true)) ? domSetAttr(el, attrName, "") : domSetAttr(el, attrName, (String(attrVal)))))));
|
||||
(isSxTruthy(sxOr(isNil(attrVal), (attrVal == false))) ? NIL : (isSxTruthy((isSxTruthy(startsWith(attrName, "on-")) && isCallable(attrVal))) ? domListen(el, slice(attrName, 3), attrVal) : (isSxTruthy((isSxTruthy((attrName == "bind")) && isSignal(attrVal))) ? bindInput(el, attrVal) : (isSxTruthy(contains(BOOLEAN_ATTRS, attrName)) ? (isSxTruthy(attrVal) ? domSetAttr(el, attrName, "") : NIL) : (isSxTruthy((attrVal == true)) ? domSetAttr(el, attrName, "") : domSetAttr(el, attrName, (String(attrVal))))))));
|
||||
return assoc(state, "skip", true, "i", (get(state, "i") + 1));
|
||||
})() : ((isSxTruthy(!isSxTruthy(contains(VOID_ELEMENTS, tag))) ? domAppend(el, renderToDom(arg, env, newNs)) : NIL), assoc(state, "i", (get(state, "i") + 1)))));
|
||||
})(); }, {["i"]: 0, ["skip"]: false}, args);
|
||||
@@ -1572,6 +1572,20 @@ return result; }, args);
|
||||
{ var _c = range(1, len(expr)); for (var _i = 0; _i < _c.length; _i++) { var i = _c[_i]; domAppend(frag, renderToDom(nth(expr, i), env, ns)); } }
|
||||
return frag;
|
||||
})() : (isSxTruthy(isDefinitionForm(name)) ? (trampoline(evalExpr(expr, env)), createFragment()) : (isSxTruthy((name == "map")) ? (function() {
|
||||
var collExpr = nth(expr, 2);
|
||||
return (isSxTruthy((isSxTruthy(_islandScope) && isSxTruthy((typeOf(collExpr) == "list")) && isSxTruthy((len(collExpr) > 1)) && (first(collExpr) == "deref"))) ? (function() {
|
||||
var f = trampoline(evalExpr(nth(expr, 1), env));
|
||||
var sig = trampoline(evalExpr(nth(collExpr, 1), env));
|
||||
return (isSxTruthy(isSignal(sig)) ? reactiveList(f, sig, env, ns) : (function() {
|
||||
var coll = deref(sig);
|
||||
var frag = createFragment();
|
||||
{ var _c = coll; for (var _i = 0; _i < _c.length; _i++) { var item = _c[_i]; (function() {
|
||||
var val = (isSxTruthy(isLambda(f)) ? renderLambdaDom(f, [item], env, ns) : renderToDom(apply(f, [item]), env, ns));
|
||||
return domAppend(frag, val);
|
||||
})(); } }
|
||||
return frag;
|
||||
})());
|
||||
})() : (function() {
|
||||
var f = trampoline(evalExpr(nth(expr, 1), env));
|
||||
var coll = trampoline(evalExpr(nth(expr, 2), env));
|
||||
var frag = createFragment();
|
||||
@@ -1580,6 +1594,7 @@ return result; }, args);
|
||||
return domAppend(frag, val);
|
||||
})(); } }
|
||||
return frag;
|
||||
})());
|
||||
})() : (isSxTruthy((name == "map-indexed")) ? (function() {
|
||||
var f = trampoline(evalExpr(nth(expr, 1), env));
|
||||
var coll = trampoline(evalExpr(nth(expr, 2), env));
|
||||
@@ -1680,15 +1695,29 @@ return (isSxTruthy(testFn()) ? (function() {
|
||||
var parent = domParent(marker);
|
||||
return (isSxTruthy(parent) ? (domRemoveChildrenAfter(marker), (function() {
|
||||
var items = deref(itemsSig);
|
||||
return forEach(function(item) { return (function() {
|
||||
var frag = createFragment();
|
||||
{ var _c = items; for (var _i = 0; _i < _c.length; _i++) { var item = _c[_i]; (function() {
|
||||
var rendered = (isSxTruthy(isLambda(mapFn)) ? renderLambdaDom(mapFn, [item], env, ns) : renderToDom(apply(mapFn, [item]), env, ns));
|
||||
return domInsertAfter(marker, rendered);
|
||||
})(); }, reverse(items));
|
||||
return domAppend(frag, rendered);
|
||||
})(); } }
|
||||
return domInsertAfter(marker, frag);
|
||||
})()) : NIL);
|
||||
})(); });
|
||||
return container;
|
||||
})(); };
|
||||
|
||||
// bind-input
|
||||
var bindInput = function(el, sig) { return (function() {
|
||||
var inputType = lower(sxOr(domGetAttr(el, "type"), ""));
|
||||
var isCheckbox = sxOr((inputType == "checkbox"), (inputType == "radio"));
|
||||
(isSxTruthy(isCheckbox) ? domSetProp(el, "checked", deref(sig)) : domSetProp(el, "value", (String(deref(sig)))));
|
||||
effect(function() { return (isSxTruthy(isCheckbox) ? domSetProp(el, "checked", deref(sig)) : (function() {
|
||||
var v = (String(deref(sig)));
|
||||
return (isSxTruthy((domGetProp(el, "value") != v)) ? domSetProp(el, "value", v) : NIL);
|
||||
})()); });
|
||||
return domListen(el, (isSxTruthy(isCheckbox) ? "change" : "input"), function(e) { return (isSxTruthy(isCheckbox) ? reset_b(sig, domGetProp(el, "checked")) : reset_b(sig, domGetProp(el, "value"))); });
|
||||
})(); };
|
||||
|
||||
|
||||
// === Transpiled from engine ===
|
||||
|
||||
@@ -2049,12 +2078,14 @@ return forEach(function(attr) { return (isSxTruthy(!isSxTruthy(domHasAttr(newEl,
|
||||
var rendered = sxRender(trimmed);
|
||||
var container = domCreateElement("div", NIL);
|
||||
domAppend(container, rendered);
|
||||
processOobSwaps(container, function(t, oob, s) { swapDomNodes(t, oob, s);
|
||||
processOobSwaps(container, function(t, oob, s) { disposeIslandsIn(t);
|
||||
swapDomNodes(t, oob, s);
|
||||
sxHydrate(t);
|
||||
return processElements(t); });
|
||||
return (function() {
|
||||
var selectSel = domGetAttr(el, "sx-select");
|
||||
var content = (isSxTruthy(selectSel) ? selectFromContainer(container, selectSel) : childrenToFragment(container));
|
||||
disposeIslandsIn(target);
|
||||
return withTransition(useTransition, function() { swapDomNodes(target, content, swapStyle);
|
||||
return postSwap(target); });
|
||||
})();
|
||||
@@ -2068,6 +2099,7 @@ return postSwap(target); });
|
||||
var doc = domParseHtmlDocument(text);
|
||||
return (isSxTruthy(doc) ? (function() {
|
||||
var selectSel = domGetAttr(el, "sx-select");
|
||||
disposeIslandsIn(target);
|
||||
return (isSxTruthy(selectSel) ? (function() {
|
||||
var html = selectHtmlFromDoc(doc, selectSel);
|
||||
return withTransition(useTransition, function() { swapHtmlString(target, html, swapStyle);
|
||||
@@ -2075,7 +2107,8 @@ return postSwap(target); });
|
||||
})() : (function() {
|
||||
var container = domCreateElement("div", NIL);
|
||||
domSetInnerHtml(container, domBodyInnerHtml(doc));
|
||||
processOobSwaps(container, function(t, oob, s) { swapDomNodes(t, oob, s);
|
||||
processOobSwaps(container, function(t, oob, s) { disposeIslandsIn(t);
|
||||
swapDomNodes(t, oob, s);
|
||||
return postSwap(t); });
|
||||
hoistHeadElements(container);
|
||||
return withTransition(useTransition, function() { swapDomNodes(target, childrenToFragment(container), swapStyle);
|
||||
@@ -2363,7 +2396,7 @@ return logWarn((String("sx:offline sync failed ") + String(get(entry, "action"))
|
||||
})(); };
|
||||
|
||||
// swap-rendered-content
|
||||
var swapRenderedContent = function(target, rendered, pathname) { return (domSetTextContent(target, ""), domAppend(target, rendered), hoistHeadElementsFull(target), processElements(target), sxHydrateElements(target), domDispatch(target, "sx:clientRoute", {["pathname"]: pathname}), logInfo((String("sx:route client ") + String(pathname)))); };
|
||||
var swapRenderedContent = function(target, rendered, pathname) { return (disposeIslandsIn(target), domSetTextContent(target, ""), domAppend(target, rendered), hoistHeadElementsFull(target), processElements(target), sxHydrateElements(target), domDispatch(target, "sx:clientRoute", {["pathname"]: pathname}), logInfo((String("sx:route client ") + String(pathname)))); };
|
||||
|
||||
// resolve-route-target
|
||||
var resolveRouteTarget = function(targetSel) { return (isSxTruthy((isSxTruthy(targetSel) && !isSxTruthy((targetSel == "true")))) ? domQuery(targetSel) : NIL); };
|
||||
@@ -2453,14 +2486,14 @@ return (function() {
|
||||
var swapStyle = get(swapSpec, "style");
|
||||
var useTransition = get(swapSpec, "transition");
|
||||
var trimmed = trim(data);
|
||||
return (isSxTruthy(!isSxTruthy(isEmpty(trimmed))) ? (isSxTruthy(startsWith(trimmed, "(")) ? (function() {
|
||||
return (isSxTruthy(!isSxTruthy(isEmpty(trimmed))) ? (disposeIslandsIn(target), (isSxTruthy(startsWith(trimmed, "(")) ? (function() {
|
||||
var rendered = sxRender(trimmed);
|
||||
var container = domCreateElement("div", NIL);
|
||||
domAppend(container, rendered);
|
||||
return withTransition(useTransition, function() { swapDomNodes(target, childrenToFragment(container), swapStyle);
|
||||
return postSwap(target); });
|
||||
})() : withTransition(useTransition, function() { swapHtmlString(target, trimmed, swapStyle);
|
||||
return postSwap(target); })) : NIL);
|
||||
return postSwap(target); }))) : NIL);
|
||||
})(); };
|
||||
|
||||
// bind-inline-handlers
|
||||
@@ -2722,6 +2755,12 @@ callExpr.push(dictGet(kwargs, k)); } }
|
||||
return (isSxTruthy(disposers) ? (forEach(function(d) { return (isSxTruthy(isCallable(d)) ? d() : NIL); }, disposers), domSetData(el, "sx-disposers", NIL)) : NIL);
|
||||
})(); };
|
||||
|
||||
// dispose-islands-in
|
||||
var disposeIslandsIn = function(root) { return (isSxTruthy(root) ? (function() {
|
||||
var islands = domQueryAll(root, "[data-sx-island]");
|
||||
return (isSxTruthy((isSxTruthy(islands) && !isSxTruthy(isEmpty(islands)))) ? (logInfo((String("disposing ") + String(len(islands)) + String(" island(s)"))), forEach(disposeIsland, islands)) : NIL);
|
||||
})() : NIL); };
|
||||
|
||||
// boot-init
|
||||
var bootInit = function() { return (logInfo((String("sx-browser ") + String(SX_VERSION))), initCssTracking(), processPageScripts(), processSxScripts(NIL), sxHydrateElements(NIL), sxHydrateIslands(NIL), processElements(NIL)); };
|
||||
|
||||
@@ -2850,6 +2889,7 @@ return (function() {
|
||||
})();
|
||||
})(); };
|
||||
recompute();
|
||||
registerInScope(function() { return disposeComputed(s); });
|
||||
return s;
|
||||
})();
|
||||
})(); };
|
||||
@@ -2874,12 +2914,16 @@ return (function() {
|
||||
})();
|
||||
})()) : NIL); };
|
||||
runEffect();
|
||||
return function() { disposed = true;
|
||||
return (function() {
|
||||
var disposeFn = function() { disposed = true;
|
||||
if (isSxTruthy(cleanupFn)) {
|
||||
invoke(cleanupFn);
|
||||
}
|
||||
{ var _c = deps; for (var _i = 0; _i < _c.length; _i++) { var dep = _c[_i]; signalRemoveSub(dep, runEffect); } }
|
||||
return (deps = []); };
|
||||
registerInScope(disposeFn);
|
||||
return disposeFn;
|
||||
})();
|
||||
})();
|
||||
})(); };
|
||||
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
// =========================================================================
|
||||
|
||||
var NIL = Object.freeze({ _nil: true, toString: function() { return "nil"; } });
|
||||
var SX_VERSION = "2026-03-08T15:15:32Z";
|
||||
var SX_VERSION = "2026-03-08T16:03:46Z";
|
||||
|
||||
function isNil(x) { return x === NIL || x === null || x === undefined; }
|
||||
function isSxTruthy(x) { return x !== false && !isNil(x); }
|
||||
@@ -1492,7 +1492,7 @@ return result; }, args);
|
||||
return (isSxTruthy(skip) ? assoc(state, "skip", false, "i", (get(state, "i") + 1)) : (isSxTruthy((isSxTruthy((typeOf(arg) == "keyword")) && ((get(state, "i") + 1) < len(args)))) ? (function() {
|
||||
var attrName = keywordName(arg);
|
||||
var attrVal = trampoline(evalExpr(nth(args, (get(state, "i") + 1)), env));
|
||||
(isSxTruthy(sxOr(isNil(attrVal), (attrVal == false))) ? NIL : (isSxTruthy((isSxTruthy(startsWith(attrName, "on-")) && isCallable(attrVal))) ? domListen(el, slice(attrName, 3), attrVal) : (isSxTruthy(contains(BOOLEAN_ATTRS, attrName)) ? (isSxTruthy(attrVal) ? domSetAttr(el, attrName, "") : NIL) : (isSxTruthy((attrVal == true)) ? domSetAttr(el, attrName, "") : domSetAttr(el, attrName, (String(attrVal)))))));
|
||||
(isSxTruthy(sxOr(isNil(attrVal), (attrVal == false))) ? NIL : (isSxTruthy((isSxTruthy(startsWith(attrName, "on-")) && isCallable(attrVal))) ? domListen(el, slice(attrName, 3), attrVal) : (isSxTruthy((isSxTruthy((attrName == "bind")) && isSignal(attrVal))) ? bindInput(el, attrVal) : (isSxTruthy(contains(BOOLEAN_ATTRS, attrName)) ? (isSxTruthy(attrVal) ? domSetAttr(el, attrName, "") : NIL) : (isSxTruthy((attrVal == true)) ? domSetAttr(el, attrName, "") : domSetAttr(el, attrName, (String(attrVal))))))));
|
||||
return assoc(state, "skip", true, "i", (get(state, "i") + 1));
|
||||
})() : ((isSxTruthy(!isSxTruthy(contains(VOID_ELEMENTS, tag))) ? domAppend(el, renderToDom(arg, env, newNs)) : NIL), assoc(state, "i", (get(state, "i") + 1)))));
|
||||
})(); }, {["i"]: 0, ["skip"]: false}, args);
|
||||
@@ -1572,6 +1572,20 @@ return result; }, args);
|
||||
{ var _c = range(1, len(expr)); for (var _i = 0; _i < _c.length; _i++) { var i = _c[_i]; domAppend(frag, renderToDom(nth(expr, i), env, ns)); } }
|
||||
return frag;
|
||||
})() : (isSxTruthy(isDefinitionForm(name)) ? (trampoline(evalExpr(expr, env)), createFragment()) : (isSxTruthy((name == "map")) ? (function() {
|
||||
var collExpr = nth(expr, 2);
|
||||
return (isSxTruthy((isSxTruthy(_islandScope) && isSxTruthy((typeOf(collExpr) == "list")) && isSxTruthy((len(collExpr) > 1)) && (first(collExpr) == "deref"))) ? (function() {
|
||||
var f = trampoline(evalExpr(nth(expr, 1), env));
|
||||
var sig = trampoline(evalExpr(nth(collExpr, 1), env));
|
||||
return (isSxTruthy(isSignal(sig)) ? reactiveList(f, sig, env, ns) : (function() {
|
||||
var coll = deref(sig);
|
||||
var frag = createFragment();
|
||||
{ var _c = coll; for (var _i = 0; _i < _c.length; _i++) { var item = _c[_i]; (function() {
|
||||
var val = (isSxTruthy(isLambda(f)) ? renderLambdaDom(f, [item], env, ns) : renderToDom(apply(f, [item]), env, ns));
|
||||
return domAppend(frag, val);
|
||||
})(); } }
|
||||
return frag;
|
||||
})());
|
||||
})() : (function() {
|
||||
var f = trampoline(evalExpr(nth(expr, 1), env));
|
||||
var coll = trampoline(evalExpr(nth(expr, 2), env));
|
||||
var frag = createFragment();
|
||||
@@ -1580,6 +1594,7 @@ return result; }, args);
|
||||
return domAppend(frag, val);
|
||||
})(); } }
|
||||
return frag;
|
||||
})());
|
||||
})() : (isSxTruthy((name == "map-indexed")) ? (function() {
|
||||
var f = trampoline(evalExpr(nth(expr, 1), env));
|
||||
var coll = trampoline(evalExpr(nth(expr, 2), env));
|
||||
@@ -1680,15 +1695,29 @@ return (isSxTruthy(testFn()) ? (function() {
|
||||
var parent = domParent(marker);
|
||||
return (isSxTruthy(parent) ? (domRemoveChildrenAfter(marker), (function() {
|
||||
var items = deref(itemsSig);
|
||||
return forEach(function(item) { return (function() {
|
||||
var frag = createFragment();
|
||||
{ var _c = items; for (var _i = 0; _i < _c.length; _i++) { var item = _c[_i]; (function() {
|
||||
var rendered = (isSxTruthy(isLambda(mapFn)) ? renderLambdaDom(mapFn, [item], env, ns) : renderToDom(apply(mapFn, [item]), env, ns));
|
||||
return domInsertAfter(marker, rendered);
|
||||
})(); }, reverse(items));
|
||||
return domAppend(frag, rendered);
|
||||
})(); } }
|
||||
return domInsertAfter(marker, frag);
|
||||
})()) : NIL);
|
||||
})(); });
|
||||
return container;
|
||||
})(); };
|
||||
|
||||
// bind-input
|
||||
var bindInput = function(el, sig) { return (function() {
|
||||
var inputType = lower(sxOr(domGetAttr(el, "type"), ""));
|
||||
var isCheckbox = sxOr((inputType == "checkbox"), (inputType == "radio"));
|
||||
(isSxTruthy(isCheckbox) ? domSetProp(el, "checked", deref(sig)) : domSetProp(el, "value", (String(deref(sig)))));
|
||||
effect(function() { return (isSxTruthy(isCheckbox) ? domSetProp(el, "checked", deref(sig)) : (function() {
|
||||
var v = (String(deref(sig)));
|
||||
return (isSxTruthy((domGetProp(el, "value") != v)) ? domSetProp(el, "value", v) : NIL);
|
||||
})()); });
|
||||
return domListen(el, (isSxTruthy(isCheckbox) ? "change" : "input"), function(e) { return (isSxTruthy(isCheckbox) ? reset_b(sig, domGetProp(el, "checked")) : reset_b(sig, domGetProp(el, "value"))); });
|
||||
})(); };
|
||||
|
||||
|
||||
// === Transpiled from engine ===
|
||||
|
||||
@@ -2049,12 +2078,14 @@ return forEach(function(attr) { return (isSxTruthy(!isSxTruthy(domHasAttr(newEl,
|
||||
var rendered = sxRender(trimmed);
|
||||
var container = domCreateElement("div", NIL);
|
||||
domAppend(container, rendered);
|
||||
processOobSwaps(container, function(t, oob, s) { swapDomNodes(t, oob, s);
|
||||
processOobSwaps(container, function(t, oob, s) { disposeIslandsIn(t);
|
||||
swapDomNodes(t, oob, s);
|
||||
sxHydrate(t);
|
||||
return processElements(t); });
|
||||
return (function() {
|
||||
var selectSel = domGetAttr(el, "sx-select");
|
||||
var content = (isSxTruthy(selectSel) ? selectFromContainer(container, selectSel) : childrenToFragment(container));
|
||||
disposeIslandsIn(target);
|
||||
return withTransition(useTransition, function() { swapDomNodes(target, content, swapStyle);
|
||||
return postSwap(target); });
|
||||
})();
|
||||
@@ -2068,6 +2099,7 @@ return postSwap(target); });
|
||||
var doc = domParseHtmlDocument(text);
|
||||
return (isSxTruthy(doc) ? (function() {
|
||||
var selectSel = domGetAttr(el, "sx-select");
|
||||
disposeIslandsIn(target);
|
||||
return (isSxTruthy(selectSel) ? (function() {
|
||||
var html = selectHtmlFromDoc(doc, selectSel);
|
||||
return withTransition(useTransition, function() { swapHtmlString(target, html, swapStyle);
|
||||
@@ -2075,7 +2107,8 @@ return postSwap(target); });
|
||||
})() : (function() {
|
||||
var container = domCreateElement("div", NIL);
|
||||
domSetInnerHtml(container, domBodyInnerHtml(doc));
|
||||
processOobSwaps(container, function(t, oob, s) { swapDomNodes(t, oob, s);
|
||||
processOobSwaps(container, function(t, oob, s) { disposeIslandsIn(t);
|
||||
swapDomNodes(t, oob, s);
|
||||
return postSwap(t); });
|
||||
hoistHeadElements(container);
|
||||
return withTransition(useTransition, function() { swapDomNodes(target, childrenToFragment(container), swapStyle);
|
||||
@@ -2363,7 +2396,7 @@ return logWarn((String("sx:offline sync failed ") + String(get(entry, "action"))
|
||||
})(); };
|
||||
|
||||
// swap-rendered-content
|
||||
var swapRenderedContent = function(target, rendered, pathname) { return (domSetTextContent(target, ""), domAppend(target, rendered), hoistHeadElementsFull(target), processElements(target), sxHydrateElements(target), domDispatch(target, "sx:clientRoute", {["pathname"]: pathname}), logInfo((String("sx:route client ") + String(pathname)))); };
|
||||
var swapRenderedContent = function(target, rendered, pathname) { return (disposeIslandsIn(target), domSetTextContent(target, ""), domAppend(target, rendered), hoistHeadElementsFull(target), processElements(target), sxHydrateElements(target), domDispatch(target, "sx:clientRoute", {["pathname"]: pathname}), logInfo((String("sx:route client ") + String(pathname)))); };
|
||||
|
||||
// resolve-route-target
|
||||
var resolveRouteTarget = function(targetSel) { return (isSxTruthy((isSxTruthy(targetSel) && !isSxTruthy((targetSel == "true")))) ? domQuery(targetSel) : NIL); };
|
||||
@@ -2453,14 +2486,14 @@ return (function() {
|
||||
var swapStyle = get(swapSpec, "style");
|
||||
var useTransition = get(swapSpec, "transition");
|
||||
var trimmed = trim(data);
|
||||
return (isSxTruthy(!isSxTruthy(isEmpty(trimmed))) ? (isSxTruthy(startsWith(trimmed, "(")) ? (function() {
|
||||
return (isSxTruthy(!isSxTruthy(isEmpty(trimmed))) ? (disposeIslandsIn(target), (isSxTruthy(startsWith(trimmed, "(")) ? (function() {
|
||||
var rendered = sxRender(trimmed);
|
||||
var container = domCreateElement("div", NIL);
|
||||
domAppend(container, rendered);
|
||||
return withTransition(useTransition, function() { swapDomNodes(target, childrenToFragment(container), swapStyle);
|
||||
return postSwap(target); });
|
||||
})() : withTransition(useTransition, function() { swapHtmlString(target, trimmed, swapStyle);
|
||||
return postSwap(target); })) : NIL);
|
||||
return postSwap(target); }))) : NIL);
|
||||
})(); };
|
||||
|
||||
// bind-inline-handlers
|
||||
@@ -2722,6 +2755,12 @@ callExpr.push(dictGet(kwargs, k)); } }
|
||||
return (isSxTruthy(disposers) ? (forEach(function(d) { return (isSxTruthy(isCallable(d)) ? d() : NIL); }, disposers), domSetData(el, "sx-disposers", NIL)) : NIL);
|
||||
})(); };
|
||||
|
||||
// dispose-islands-in
|
||||
var disposeIslandsIn = function(root) { return (isSxTruthy(root) ? (function() {
|
||||
var islands = domQueryAll(root, "[data-sx-island]");
|
||||
return (isSxTruthy((isSxTruthy(islands) && !isSxTruthy(isEmpty(islands)))) ? (logInfo((String("disposing ") + String(len(islands)) + String(" island(s)"))), forEach(disposeIsland, islands)) : NIL);
|
||||
})() : NIL); };
|
||||
|
||||
// boot-init
|
||||
var bootInit = function() { return (logInfo((String("sx-browser ") + String(SX_VERSION))), initCssTracking(), processPageScripts(), processSxScripts(NIL), sxHydrateElements(NIL), sxHydrateIslands(NIL), processElements(NIL)); };
|
||||
|
||||
@@ -2850,6 +2889,7 @@ return (function() {
|
||||
})();
|
||||
})(); };
|
||||
recompute();
|
||||
registerInScope(function() { return disposeComputed(s); });
|
||||
return s;
|
||||
})();
|
||||
})(); };
|
||||
@@ -2874,12 +2914,16 @@ return (function() {
|
||||
})();
|
||||
})()) : NIL); };
|
||||
runEffect();
|
||||
return function() { disposed = true;
|
||||
return (function() {
|
||||
var disposeFn = function() { disposed = true;
|
||||
if (isSxTruthy(cleanupFn)) {
|
||||
invoke(cleanupFn);
|
||||
}
|
||||
{ var _c = deps; for (var _i = 0; _i < _c.length; _i++) { var dep = _c[_i]; signalRemoveSub(dep, runEffect); } }
|
||||
return (deps = []); };
|
||||
registerInScope(disposeFn);
|
||||
return disposeFn;
|
||||
})();
|
||||
})();
|
||||
})(); };
|
||||
|
||||
|
||||
Reference in New Issue
Block a user