Fix keyboard shortcuts + trigger filter + sx-on event mapping

1. parse-trigger-spec: strip [condition] from event names, store as
   "filter" modifier
2. bind-event: native SX filter for key=='X' patterns (extracts key
   char and checks event.key + not-input guard)
3. bind-event from: modifier: resolve "body"/"document"/"window" to
   direct DOM references instead of dom-query
4. sx-platform-2.js: global keyboard dispatch — WASM host-callbacks
   on document/body don't fire, so keyboard triggers with from:body
   are handled from JS, calling execute-request via K.eval
5. bind-inline-handlers: map afterSwap/beforeRequest to sx: prefix,
   eval JS bodies via Function constructor

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-01 23:19:25 +00:00
parent 235d73d837
commit 683e334546
34 changed files with 278 additions and 118 deletions

View File

@@ -398,6 +398,22 @@
"children:", islands[j].children.length);
}
console.log("[sx] boot done");
// Global keyboard shortcut dispatch — WASM host-callbacks on
// document/body don't fire, so handle from:body keyboard
// triggers in JS and call execute-request via the SX engine.
document.addEventListener("keyup", function(e) {
if (e.target && e.target.matches && e.target.matches("input,textarea,select")) return;
var sel = '[sx-trigger*="key==\'' + e.key + '\'"]';
var els = document.querySelectorAll(sel);
for (var i = 0; i < els.length; i++) {
var el = els[i];
if (!el.id) el.id = "_sx_kbd_" + Math.random().toString(36).slice(2);
try {
K.eval('(execute-request (dom-query-by-id "' + el.id + '") nil nil)');
} catch(err) { console.warn("[sx] keyboard dispatch error:", err); }
}
});
}
}
};