bloom_js_native 0.3.7
bloom_js_native: ^0.3.7 copied to clipboard
Reactive Dart web framework for real DOM apps — SSR, SSG, ISR-friendly rendering, signals, SEO, and browser APIs. Not Flutter web.
Changelog #
0.3.7 - 2026-09-04 #
Fixed #
- Per-render keyframe dedup scope (#16): animation
@keyframesdedup state is now scoped to each top-level SSR render via zones instead of a shared global set, so concurrentrenderToStreamWithSuspensestreams can no longer drop or duplicate each other's@keyframesblocks.renderToStreamrenders eagerly (chunking stays lazy) with identical bytes. - Guard redirect loop detection (#17): new
BloomRouter.resolveRedirectsfollows guard redirect chains with visited-set + hop-budget (maxRedirects, default 10) protection, throwingBloomRedirectLoopExceptionon cycles instead of recursing forever; the browser controller resolves redirects up-front into a single history entry. Also addsGuardResult.deny()for blocking without redirecting. - Bounded hot-reload signal registry (#19): the
window-global registry backingsignal(initialValue, key: ...)is now capped atkMaxSignalRegistryEntries(512) entries with least-recently-used eviction — every write refreshes its key's recency, so live carryover state survives while stale keys left by renamed or removed call sites are pruned, and an evicted key falls back to the documented clean reset. Covered by a browser eviction test.
Added #
- Hostile SSR attribute-name regression tests (#19): attribute names were already validated against the same identifier rules as tag names; added explicit tests for the hardening audit's hostile names (
onload=alert(1),a>b) on both the HTML and SVG render paths to lock the behavior in. - ForEach keyless tradeoff documented (#19): the
ForEachAPI docs and COOKBOOK Section 6 now state explicitly that unkeyed lists rebuild the whole list region on every update — dropping per-item reactive regions and effects (input focus, text selection, local DOM state, in-flight CSS animations) — and thatkey:is required for any list that can reorder, insert, or remove items.
0.3.6 - 2026-08-31 #
Added #
- Browser-only
BrowserRealtimeClientWebSocket transport with channel multiplexing, presence, heartbeat, reconnect, and resubscription. - Expanded cookbook guidance for font manifests, visual parity, responsive CSS, hydration, and raw HTML/SVG behavior.
0.3.5 - 2026-08-26 #
Added #
signal<T>(initialValue, {key})— an opt-inkeyparameter that, when hot-reload tracking is active (used bybloom js dev's DDC fast dev-loop), preserves a top-level signal's mutated value across an in-page hot remount by carrying it over via awindow-global registry. Zero overhead when no key is given or tracking is inactive (the default, including all production builds). Falls back to a clean reset on any type mismatch between edits rather than risking silent corruption.isHotReloadTrackingActive()exposed publicly (was previously a privatemount.darthelper) for use by the newsignal()wrapper.
0.3.4 - 2026-08-26 #
Added #
mount()/mountToElement()now support an opt-in hot-reload tracking mode (used bybloom js dev --experimental-ddc's in-page fast remount): when active, the currently-mountedBloomMountHandleis tracked and disposable via a dev-onlybloomDisposeActiveMount()hook, with zero overhead when inactive (the default, including all production builds).
0.3.3 - 2026-08-24 #
Added #
- COOKBOOK.md: documented the real
bloom add npm:<package>workflow (vendoring, generated@JS()bindings, importmap/bootstrap wiring) and how to use@tailwindcss/browserwith no CDN and no build step; documented thelib/design/tokens.dart+Style()pattern for design tokens andbloom fonts optimize+fontStylesheetLink()for fonts, replacing hand-writtenweb/index.htmlstyling/font tags in all guidance.
0.3.2 - 2026-08-24 #
Added #
- COOKBOOK.md: new "Best Practices & Common Pitfalls Checklist" section (reactivity, nullable event fields, the two-entry-point rule, SSR/hydration gotchas, disposal, styling, testing) consolidated as a pre-flight reference.
0.3.1 - 2026-08-24 #
Added #
- COOKBOOK.md: new "Project Structure & Multi-File Apps" section (recommended
lib/routes/,lib/components/,lib/state/layout) and a "UI Component Primitives" section covering all 47+ exports fromlib/src/ui.dart.
0.3.0 - 2026-08-24 #
Added #
- UI primitives library: 45+ reusable, accessible UI components (tier 1 + tier 2 — accordion through toggle group).
fontStylesheetLink(): helper for linking the stylesheet generated bybloom fonts optimize.- Backend-for-Frontend support (dev proxy, RPC mount, env split).
Fixed #
- Soft reset no longer permanently poisons regions.
0.2.0 - 2026-08-23 #
Added #
- Typed RPC (
rpc.dart):BloomRpcContractwith path parameters, typed input/output codecs, and stable cache keys. - i18n (
i18n.dart): ICU message formatting (plural, select, nested sub-patterns), locale resolution, and reactive locale switching. Number/date formatting is hand-rolled and is not full CLDR. - Images (
image.dart): responsivesrcset/sizes,priorityfor LCP, and decorative-image handling. - Scoped CSS (
scoped_css.dart): deterministic scoped class generation, including@mediaand@keyframes. - Islands (
island_node.dart,islands.dart): server-emitted island placeholders plus a browser orchestrator with per-island failure isolation. The SSR half is pure Dart and safe to import from a server. - Web components (
web_components.dart): consume custom elements with rich JS properties and decodedCustomEventpayloads. - Cooperative scheduler (
transition.dart): real priority-based time slicing replacing the previous microtask stub. - Async form validators, typed form fields, and field arrays.
- Router query strings, fragments, and focus/aria-live route announcements.
- SSR cache dehydration/hydration and infinite queries.
Fixed #
- Route announcements now render into a real
aria-liveregion; previously they only wrote to a signal that nothing displayed. - Error boundaries now cover reactive rebuild paths.
Known limitations #
defineCustomElementuseseval()to construct the custom-element class and therefore does not work under a Content-Security-Policy withoutunsafe-eval. Consuming custom elements viacustomElement()is unaffected.
0.1.0 - 2026-08-21 #
- Initial release of
bloom_js_native. - Pure Dart AST descriptor tree (
BloomNode,ElNode,TextNode,LiveNode,ShowNode,ForEachNode,FragmentNode). - Fine-grained signals reactivity binding (
signal,computed,effect,batch). - Dual-backend architecture:
- Browser DOM mounting via
package:bloom_js_native/browser.dart(package:web). - Instant sub-millisecond SSR via
renderToHtml()with automatic XSS escaping.
- Browser DOM mounting via
- Built-in NPM vendor manager & ESM importmaps (
NpmRegistry). - HTML element subclasses (
Div,Span,Button,Input,Form,H1–H6, etc.) ensuring 0 analyzer warnings.