bloom_js_native 0.3.7 copy "bloom_js_native: ^0.3.7" to clipboard
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 @keyframes dedup state is now scoped to each top-level SSR render via zones instead of a shared global set, so concurrent renderToStreamWithSuspense streams can no longer drop or duplicate each other's @keyframes blocks. renderToStream renders eagerly (chunking stays lazy) with identical bytes.
  • Guard redirect loop detection (#17): new BloomRouter.resolveRedirects follows guard redirect chains with visited-set + hop-budget (maxRedirects, default 10) protection, throwing BloomRedirectLoopException on cycles instead of recursing forever; the browser controller resolves redirects up-front into a single history entry. Also adds GuardResult.deny() for blocking without redirecting.
  • Bounded hot-reload signal registry (#19): the window-global registry backing signal(initialValue, key: ...) is now capped at kMaxSignalRegistryEntries (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 ForEach API 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 that key: is required for any list that can reorder, insert, or remove items.

0.3.6 - 2026-08-31 #

Added #

  • Browser-only BrowserRealtimeClient WebSocket 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-in key parameter that, when hot-reload tracking is active (used by bloom 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 a window-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 private mount.dart helper) for use by the new signal() wrapper.

0.3.4 - 2026-08-26 #

Added #

  • mount()/mountToElement() now support an opt-in hot-reload tracking mode (used by bloom js dev --experimental-ddc's in-page fast remount): when active, the currently-mounted BloomMountHandle is tracked and disposable via a dev-only bloomDisposeActiveMount() 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/browser with no CDN and no build step; documented the lib/design/tokens.dart + Style() pattern for design tokens and bloom fonts optimize + fontStylesheetLink() for fonts, replacing hand-written web/index.html styling/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 from lib/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 by bloom 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): BloomRpcContract with 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): responsive srcset/sizes, priority for LCP, and decorative-image handling.
  • Scoped CSS (scoped_css.dart): deterministic scoped class generation, including @media and @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 decoded CustomEvent payloads.
  • 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-live region; previously they only wrote to a signal that nothing displayed.
  • Error boundaries now cover reactive rebuild paths.

Known limitations #

  • defineCustomElement uses eval() to construct the custom-element class and therefore does not work under a Content-Security-Policy without unsafe-eval. Consuming custom elements via customElement() 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.
  • Built-in NPM vendor manager & ESM importmaps (NpmRegistry).
  • HTML element subclasses (Div, Span, Button, Input, Form, H1H6, etc.) ensuring 0 analyzer warnings.
0
likes
150
points
641
downloads

Documentation

API reference

Publisher

unverified uploader

Weekly Downloads

Reactive Dart web framework for real DOM apps — SSR, SSG, ISR-friendly rendering, signals, SEO, and browser APIs. Not Flutter web.

Repository (GitHub)
View/report issues

Topics

#bloom #web #dom #signals #ssr

License

MIT (license)

Dependencies

http, meta, signals_core, web

More

Packages that depend on bloom_js_native