Skip to content

Releases: githyperplexed/bubbles

v0.8.1

18 Jun 17:54

Choose a tag to compare

Fixed

  • Removed the hidden aria-owns bubble group owner so default axe scans no longer flag package consumers for loose hidden content outside landmarks.
  • Playground accessibility scans now target the non-modal panel role=region and keep panel title bars out of banner landmarks.

v0.8.0

18 Jun 16:39

Choose a tag to compare

Accessibility release.

Added

  • Screen-reader announcements through a polite live region: bubbles entering and leaving, and the flock expanding (with item count) or collapsing.
  • Group semantics — a hidden role="group" owns every bubble via aria-owns, so assistive tech reads the flock as one named set. Accessibility tree only; no position/z-order/drag impact.

Changed

  • The expanded panel is now role="region" (a disclosure) rather than role="dialog", matching its non-modal, focus-free-in/out behavior.

Fixed

  • Deleting the last bubble in the open row no longer strands keyboard focus on <body>; it returns to the prior external focus or a registered trigger.

v0.7.0

15 Jun 17:26

Choose a tag to compare

Added

  • icon and content now also accept a render callback — (host) => teardown — alongside an HTMLElement. The callback is handed a host element to populate and may return a cleanup that the manager runs when the bubble is removed or the manager is destroyed, so framework consumers (Svelte mount/unmount, React createRoot) no longer create a host element or track the unmount themselves. Passing an HTMLElement is unchanged. Exposes a BubbleSlot type.

v0.6.0

15 Jun 15:39

Choose a tag to compare

Fixed

  • A right-click (or any non-primary pointer button) on a bubble no longer activates or drags it — the press falls through to the browser/host page context menu.

Changed

  • The built-in fallback bubble icon (shown only when a bubble has no icon) is now an ellipsis glyph instead of a chat bubble.
  • Trailing bubbles track the leader more tightly during a group drag, and bubbles settle against the edge a touch crisper — the shared chase/snap spring is stiffer and damped to match.

Internal

  • Playground accessibility overhaul (real radio groups, hidden decorative icons, semantic shortcut docs, new-tab link announcements, WCAG-contrast glyph ink) plus an @axe-core/playwright end-to-end scan.
  • Playground now exposes the existing ricochet option as a slider, with snippet and shareable-URL round-trip.

v0.5.1

15 Jun 01:36

Choose a tag to compare

Packaging-only patch — the library runtime is identical to 0.5.0.

Fixed

  • The published package now includes src/, so the declaration and source maps in dist/ resolve instead of pointing at omitted files — a consumer's "go to definition" lands on the real source.

Added

  • engines declares the supported Node range (>=18).

Full changelog: https://github.com/githyperplexed/bubbles/blob/main/CHANGELOG.md

v0.5.0

15 Jun 00:14
bb1fd60

Choose a tag to compare

Added

  • panelWidth and panelMaxHeight now accept a CSS string<n>px or <n>% — alongside the existing px number, so a panel can size against the viewport (e.g. panelMaxHeight: 80%). A percentage resolves live, tracking viewport resizes, while the viewport still caps the result; an invalid value throws at the call. Exports a PanelLength type for the accepted values.

Full changelog: https://github.com/githyperplexed/bubbles/blob/main/CHANGELOG.md

v0.4.0

13 Jun 22:11

Choose a tag to compare

Added

  • manager.registerTrigger(el) — mark one of your own controls (a launcher button, a menu item) as a trigger so a press on it is exempt from tap-away; returns a function that unregisters it. Without it, a control that opens or switches a bubble would collapse the flock a beat before your handler reopens it.
  • Tap-away to collapse — pressing anywhere outside the open row now collapses the group home, alongside tapping the active bubble and pressing Escape. The press is only a signal: it is never consumed, so the page behind the non-modal panel stays interactive.

Changed

  • The focus ring now marks the focused bubble whatever moved focus there — mouse, keyboard, or a programmatic activate() — instead of keyboard focus (:focus-visible) only. Focus restores on tap rather than on grab, so dragging or flinging the group no longer rings a bubble.

Full changelog: https://github.com/githyperplexed/bubbles/blob/main/CHANGELOG.md

v0.3.0

13 Jun 03:16

Choose a tag to compare

Added

  • manager.active() — the id of the bubble whose panel shows while open (and that leads the row when it next opens); undefined while no bubbles are mounted.
  • manager.activate(id) — make a bubble active and bring its panel forward (expands a docked group on it, switches an open row to it), moving keyboard focus with it.
  • manager.on(event, handler) — subscribe to statechange, activechange, add, dismiss, and remove events; returns an unsubscribe function. Deliveries are deferred to a microtask and coalesced.
  • dismiss event — fires the instant the user commits to dismissing a bubble (releases it on the target, or presses Delete), before the exit animation, so UI tracking the action stays snappy instead of lagging the fly-off; always followed by a matching remove with reason user.

Changed

  • Dragging a bubble onto the dismiss target now closes the gap in the remaining bubbles and hands off the active panel the instant you release, instead of after the dismissed bubble finishes animating off-screen.

Full changelog: https://github.com/githyperplexed/bubbles/blob/main/CHANGELOG.md

v0.2.0

12 Jun 21:07

Choose a tag to compare

Added

  • theme: "auto" — follows the user's prefers-color-scheme and repaints live when it changes; pass "dark" or "light" to force a preset
  • Per-bubble panelWidth and panelMaxHeight overrides on add(), winning over the manager's values and surviving configure() repaints
  • ricochet manager option — the fraction of speed a flung bubble keeps when it bounces off the top/bottom screen gap (default 0.4, clamped to 0–1, retunable live via configure())

Changed

  • The default theme is now "auto" (was "dark") — pass theme: "dark" to keep the old default
  • Re-adding a mounted bubble now refreshes its label, onDismiss, and panel sizing overrides in place (previously a no-op unless the bubble was mid-dismissal)

Try the live demo: https://bubbles.hyperplexed.io

v0.1.0

12 Jun 19:38

Choose a tag to compare

Initial release of @hyperplexed/bubbles — Android-style app bubbles for the web.

  • Floating, draggable bubbles that snap to screen edges with spring physics
  • Group behavior: docked stack with chained trail drags, momentum flings, and a magnetic drag-to-dismiss target
  • Expandable content panels — tap the stack to open a centered row with the active bubble's panel
  • Manager API: createBubbles() with add, remove, configure, toggle, state, and destroy
  • Theming: dark/light presets with per-token color overrides
  • Options for dock side, vertical position, panel sizing, bubble cap, and initial state
  • Full keyboard accessibility — single tab stop, arrow-key navigation, ARIA semantics
  • prefers-reduced-motion support across every animation

Try the live demo: https://bubbles.hyperplexed.io