Releases: githyperplexed/bubbles
Releases · githyperplexed/bubbles
v0.8.1
v0.8.0
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 viaaria-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 thanrole="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
Added
iconandcontentnow also accept a render callback —(host) => teardown— alongside anHTMLElement. 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 (Sveltemount/unmount, ReactcreateRoot) no longer create a host element or track the unmount themselves. Passing anHTMLElementis unchanged. Exposes aBubbleSlottype.
v0.6.0
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/playwrightend-to-end scan. - Playground now exposes the existing
ricochetoption as a slider, with snippet and shareable-URL round-trip.
v0.5.1
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 indist/resolve instead of pointing at omitted files — a consumer's "go to definition" lands on the real source.
Added
enginesdeclares the supported Node range (>=18).
Full changelog: https://github.com/githyperplexed/bubbles/blob/main/CHANGELOG.md
v0.5.0
Added
panelWidthandpanelMaxHeightnow accept a CSS string —<n>pxor<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 aPanelLengthtype for the accepted values.
Full changelog: https://github.com/githyperplexed/bubbles/blob/main/CHANGELOG.md
v0.4.0
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
Added
manager.active()— the id of the bubble whose panel shows while open (and that leads the row when it next opens);undefinedwhile 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 tostatechange,activechange,add,dismiss, andremoveevents; returns an unsubscribe function. Deliveries are deferred to a microtask and coalesced.dismissevent — 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 matchingremovewith reasonuser.
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
Added
theme: "auto"— follows the user'sprefers-color-schemeand repaints live when it changes; pass"dark"or"light"to force a preset- Per-bubble
panelWidthandpanelMaxHeightoverrides onadd(), winning over the manager's values and survivingconfigure()repaints ricochetmanager option — the fraction of speed a flung bubble keeps when it bounces off the top/bottom screen gap (default0.4, clamped to0–1, retunable live viaconfigure())
Changed
- The default theme is now
"auto"(was"dark") — passtheme: "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
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()withadd,remove,configure,toggle,state, anddestroy - Theming:
dark/lightpresets 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-motionsupport across every animation
Try the live demo: https://bubbles.hyperplexed.io