---
package: "@webjsdev/core"
version: 0.7.11
date: 2026-06-04T19:45:32.800Z
commit_count: 8
---
## Features

- **drive a webjs-frame by id from outside it, plus _top and aria-busy** ([#338](https://github.com/webjsdev/webjs/pull/338)) [`430e6cca`](https://github.com/webjsdev/webjs/commit/430e6cca)
  * feat: drive a webjs-frame by id from outside it, plus aria-busy
  
  A swap was scoped to a frame only when the trigger was DOM-nested inside it
  (closest-only). Add external frame targeting: a link or form carrying
- **recover from a failed navigation in place instead of a full reload** ([#339](https://github.com/webjsdev/webjs/pull/339)) [`43eaf64f`](https://github.com/webjsdev/webjs/commit/43eaf64f)
  * feat: recover from a failed navigation in place instead of a full reload
  
  On a non-HTML error response (a JSON 500), a transport failure, or an
  unparseable HTML body, fetchAndApply did a destructive location.href full
- **form submission-state events + aria-busy + an optimistic() helper** ([#340](https://github.com/webjsdev/webjs/pull/340)) [`342ae484`](https://github.com/webjsdev/webjs/commit/342ae484)
  A form submitting through the JS-enhanced router had no signal for a pending
  state. The router now sets the native aria-busy on the form for the in-flight
  duration (the readable is-this-form-submitting primitive) and dispatches a
  bubbling webjs:submit-start ({ form, url }) at the start and webjs:submit-end
- **view transitions on partial swaps + data-webjs-permanent** ([#343](https://github.com/webjsdev/webjs/pull/343)) [`77c1216d`](https://github.com/webjsdev/webjs/commit/77c1216d)
  View Transitions only wrapped the full-body fallback, never the partial
  layout-marker swap or the webjs-frame swap (the common designed-for paths).
  Wrap all three swap paths in document.startViewTransition via runWithTransition,
  gated by an opt-in <meta name="view-transition" content="same-origin"> (OFF
- **src-driven <webjs-frame> self-loading + server subtree render** ([#346](https://github.com/webjsdev/webjs/pull/346)) [`86f6ae44`](https://github.com/webjsdev/webjs/commit/86f6ae44)
  * feat: src-driven webjs-frame self-loading + server subtree render
  
  A <webjs-frame> could not self-load a region's content, forcing the
  fetch-in-handler anti-pattern for deferred content (comments, a recommendations
- **add the <webjs-stream> stream-action protocol (HTTP + live channel)** ([#347](https://github.com/webjsdev/webjs/pull/347)) [`a489c97d`](https://github.com/webjsdev/webjs/commit/a489c97d)
  * feat: add the <webjs-stream> surgical DOM-update applier
  
  Ship one small custom element that reads a server-sent <template> carrying an
  action + target id and applies it via native DOM (append/prepend/before/after/
- **ship a rich dev error overlay pushed live over SSE** ([#348](https://github.com/webjsdev/webjs/pull/348)) [`30772213`](https://github.com/webjsdev/webjs/commit/30772213)
  * feat: ship a rich dev error overlay pushed live over SSE
  
  A dev SSR render crash, a non-erasable-TS strip failure, and a failed rebuild
  each push a structured error frame (message, parsed file:line:col, a source

## Fixes

- **reconcile plain .map() arrays in place instead of rebuilding (#353)** ([#354](https://github.com/webjsdev/webjs/pull/354)) [`950026a8`](https://github.com/webjsdev/webjs/commit/950026a8)
  * fix: reconcile plain .map() arrays in place instead of rebuilding
  
  A `.map()` / list interpolation used to rebuild its entire child part on
  ANY change to the array's rendered output, replacing every DOM node. The
