Fix event-bridge + add client? primitive + header store foundation

- Event-bridge: rewrite island to use document-level addEventListener
  via effect + host-callback, bypassing broken container-ref + schedule-idle.
  Also use host-get for event-detail (WASM host handles).

- Add client? primitive: false on server (sx_primitives._is_client ref),
  true in browser (sx_browser.ml sets ref). Enables SSR-safe conditional
  logic for client-only features like def-store.

- Header island: use def-store for idx/shade signals when client? is true,
  falling back to plain signals on server. Foundation for SPA nav state
  preservation (store registry persistence still needs work).

- Remove unused client? K.eval override from sx-platform.js.

100 passed, 1 skipped (isomorphic nav — store registry resets on SPA nav), 0 failed.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-03-28 10:05:32 +00:00
parent 919ce927b1
commit 0cae1fbb6b
41 changed files with 22 additions and 16 deletions

View File

@@ -232,8 +232,7 @@ test.describe('Reactive island interactions', () => {
}
});
test.fixme('event-bridge: sender triggers receiver update', async ({ page }) => {
// BUG: on-event handler receives CustomEvent but swap!/signal update doesn't propagate to DOM
test('event-bridge: sender triggers receiver update', async ({ page }) => {
await page.goto(BASE_URL + '/sx/(geography.(reactive.(examples.event-bridge-demo)))', { waitUntil: 'networkidle' });
await page.waitForTimeout(2000);

View File

@@ -177,7 +177,7 @@ test.describe('Isomorphic SSR', () => {
});
test.fixme('navigation preserves header island state', async ({ page }) => {
// BUG: header island inside #main-panel swap boundary — needs structural layout change or store-based state
// BUG: def-store state not persisting — *store-registry* likely reset during SPA nav component reload
await page.goto(BASE_URL + '/sx/', { waitUntil: 'networkidle' });
// Wait for header island to hydrate