Skip to content

1.14.0 — 2026-05-26

Patch — 1.14.1 (2026-05-28)

Motion fix: prefersReducedMotion() and reducedMotionSignal() now refresh their cached reduced-motion media query when window.matchMedia changes, preventing stale preference reads in tests and other environments that swap the media-query implementation at runtime.

Drop-in replacement for 1.14.0 — no migration needed. · CHANGELOG · Motion guide

Version 1.14.0 graduates four modules into batteries-included tiers and lands additive expansions across most of the rest of the framework. There are no breaking changes — 1.13.x and earlier APIs continue to work unchanged.

TIP

Use the per-module guides linked from each section for full reference. This page summarises what changed; the guides cover how to use it.

Headlines

  • @bquery/bquery/media batteries-included. 25+ new composables for preferences, page state, element observers, pointer/scroll, platform integrations, and clipboard image support. Every composable accepts an optional { signal: AbortSignal }.
  • @bquery/bquery/plugin batteries-included. Hook bus, DI container, async install, plugin metadata + dependencies, namespaced directives, unuse / uninstall.
  • @bquery/bquery/devtools batteries-included. Ring-buffered timeline, structured event types, filterable / subscribable timelines, signal & store diffs, traces, snapshot import/export, browser bridge, perf helpers.
  • @bquery/bquery/testing batteries-included. screen / within, userEvent, fireEvent.* shortcuts, reactive harnesses, module mocks, a11y helpers.

Additive expansions also landed in router, view, a11y, i18n, dnd, storybook, concurrency, ssr, and server.

Media (batteries-included)

New reactive composables in @bquery/bquery/media:

  • Preference signalsusePreferredColorScheme, usePreferredContrast, usePreferredReducedTransparency, usePreferredLanguage, usePreferredLanguages.
  • Page stateuseOnlineStatus, usePageVisibility, useDocumentFocus, useWindowFocus, useIdle.
  • Element observersuseElementSize, useElementBounding, useElementVisibility, useHover, useFocus, useFocusWithin, useActiveElement.
  • Pointer / scrollusePointer, useScroll.
  • Platform integrationsusePermission, useWakeLock, useShare, useShareSupported, useBroadcastChannel, useEventListener, useMediaDevices, useStorage.
  • ClipboardisSupported, isImageSupported, readImage, writeImage, clipboardText.

Every composable accepts { signal: AbortSignal } for automatic teardown. See Media guide.

Plugin (batteries-included)

@bquery/bquery/plugin gains:

  • Hook busaddFilter / applyFilters / removeFilter / listFilters and addAction / doAction / removeAction / listActions.
  • Container DIcreateInjectionKey / provide / inject / hasProvided / resetDi.
  • Plugin-scoped cleanupctx.onCleanup.
  • Removalunuse(name) / uninstall(name) detach plugin-owned directives, hooks, and DI bindings.
  • Async installinstall() may return void | Promise<void>. Concurrent installs of the same plugin are serialised.
  • Plugin metadataversion, description, dependencies, dependencyMode: 'error' | 'warn'.
  • IntrospectiongetPluginInfo, getInstalledPlugins({ withMetadata: true }).
  • Directive lifecycle{ mounted, unmounted } objects.
  • Namespaced directives — names like tooltip:arrow.

See Plugin guide.

Devtools (batteries-included)

@bquery/bquery/devtools gains:

  • Ring-buffered timelinemaxTimelineEntries (default 1000); expanded TimelineEntry with optional payload / source / duration.
  • New event typessignal:create, signal:dispose, effect:dispose, component:mount, component:unmount, component:render, route:guard, error:caught, measure, mark.
  • Filter & subscribefilterTimeline({ types, since, until, search }), subscribeTimeline(listener).
  • Privacy-aware inspectioninspectSignals({ includeValues: false }).
  • DiffsdiffSignals, diffStores.
  • TracestraceSignal, untraceSignal.
  • EffectsinspectEffects.
  • SnapshotsexportDevtoolsSnapshot, importDevtoolsSnapshot.
  • BridgeinstallBrowserBridge() for future extension panels.
  • Perf helperstime(label, fn), measureRender(tagName, fn), getPerformanceSummary().

See Devtools guide.

Testing (batteries-included)

@bquery/bquery/testing gains:

  • Auto cleanupcleanup, autoCleanup.
  • fireEvent.* shortcutsclick, input, change, submit, focus, blur, dblClick, keyDown, keyUp.
  • userEvent namespaceclick, dblClick, hover, unhover, type, clear, selectOptions, tab, paste.
  • Shadow-DOM-aware queriesscreen, within(el) with getByRole / getByText / getByLabelText / getByPlaceholderText / getByTestId plus query* / find* variants.
  • Reactive harnessesmockComputed, mockEffect.
  • Async helperstick, nextTick, flushPromises, runScheduled.
  • Module mocksmockStore, mockI18n, mockForm, mockFetch, mockWebSocket.
  • Snapshot / a11y helpersprettyDOM, getReactiveSummary, expectAccessible.

See Testing guide.

Additive module expansions

  • RouterNavigationResult, pushResult / replaceResult, beforeResolve, resolveRoute, dynamic addRoute / removeRoute / hasRoute, isReady, lastNavigation, useNavigation.
  • ViewparseDirective, ParsedDirective, new bq-once / bq-init / bq-pre / bq-cloak / bq-html-safe / bq-memo, full bq-on modifier system.
  • A11ycreateLiveRegion, keyboardUserSignal, focusVisible, prefersReducedTransparency / prefersReducedData / forcedColors, inert / scrollLock / autoFocus.
  • i18nnegotiateLocale, detectLocale, isRTL, formatRelativeTime / formatList / formatDisplayName / segment.
  • DnD — programmatic handle APIs, grid / delay / touchStartThreshold / keyboard / keyboardStep, 'viewport' bounds, reactive useDraggable / useDroppable / useSortable.
  • StorybookclassMap, styleMap, ifDefined, repeat, storyText, unsafeHtml, storySvg.
  • ConcurrencywithTransferables, createSharedBuffer, RPC maxInFlight, pool priorities, pause / resume / onIdle, rolling reactive metrics.
  • SSRflushBoundary, createSSRCache, createSSRMetrics, createEdgeHandler, cache-aware renderToResponse, multi-chunk renderToStream.
  • ServerServerHttpError, ctx.body / ctx.cookies / ctx.setCookie / ctx.accepts / ctx.stream / ctx.sse / ctx.renderStream / ctx.renderResponse, app.listen().

Migration notes

There are no breaking changes in 1.14.0. All 1.13.x and earlier APIs continue to work unchanged.

If you previously polyfilled any of the new media composables manually, you can now delete those polyfills and import from @bquery/bquery/media.

Engines

Publish and local validation target Node.js ≥ 24.0.0 and Bun ≥ 1.3.13. See Supported Runtimes.

Released under the MIT License.