What's new in v0.7
A focused maintenance release. v0.7 hardens every controller's destroy path, expands adapter parity for sidebar, dialog, and password, ships CSS-only additions and accessibility refinements, and widens the TypeScript surface to match the new optional APIs.
A safer, more complete public framework contract
Version 0.7 is additive. Every v0.6 selector and behavior remains available. The release hardens controller teardown so multi-instance SPA usage no longer leaks state, brings the Vue and React dialog and password adapters to parity with the vanilla controller, ships the .bs-text-start / .bs-text-end logical-property companions, and tightens the CSS focus and reduced-motion story.
@boobstrap/boobstrap@0.7.0 from npm or use the version-pinned CDN URL in the installation guide. Official Alpine, React, and Vue adapters are published at the same version.Hardened controller destroy paths
Dialog.destroy() no longer fires bs:dialog:hidden for a torn-down controller or restores focus to a stale target. Sidebar.destroy() and Navbar.destroy() recompute the body open-class via syncDocumentState() instead of unconditionally removing it, so multi-instance sidebars and navbars no longer leak the open class. Accordion.destroy() cascades to each child Collapse.
Combobox, Tabs, and Toast hardening
Combobox.destroy() snapshots and restores the original role, aria-autocomplete, aria-controls, listbox id/role, and option id/role values captured at construction. Tabs.handleKeydown now skips disabled tabs in arrow navigation and never focuses a disabled tab. Toast.show() clears any pending autohide timer and resets remaining so pointerenter / focusin before the first show() cannot schedule a hide against a never-shown toast.
Adapter parity
The Sidebar shortcut (Ctrl/Cmd+B-style) is now guarded across vanilla, Alpine, React, and Vue so it cannot steal focus from text inputs or open dialogs. useDialog (Vue) gains data-bs-dialog-close-on-backdrop support to match the vanilla controller. usePassword (React) now exposes visible as reactive state and accepts visible / defaultVisible / onVisibleChange for controlled mode.
import { useState } from "react";
import { usePassword } from "@boobstrap/react";
function PasswordField() {
const [visible, setVisible] = useState(false);
const password = usePassword({
visible,
onVisibleChange: (nextVisible) => setVisible(nextVisible),
});
return (
<div {...password.getRootProps()}>
<input {...password.getInputProps()} />
<button {...password.getToggleProps()}>Toggle</button>
</div>
);
}New bs-text-start and bs-text-end utilities
Logical-property companions to the existing bs-text-left / bs-text-right aliases. The new utilities flip automatically with dir="rtl" so right-to-left layouts stay correct without authoring effort. The physical aliases remain for backward compatibility.
<p class="bs-text-start">Aligned to the start edge (left in LTR, right in RTL).</p>
<p class="bs-text-end">Aligned to the end edge.</p>Focus styles
Added explicit :focus-visible outlines for .bs-navbar-link, .bs-navbar-toggle, .bs-nav-link, .bs-breadcrumb, .bs-page-nav-link, .bs-pagination-link, .bs-sidebar-menu-button, .bs-sidebar-menu-sub-button, .bs-sidebar-trigger, and .bs-sidebar-rail. Replaced the bare outline-offset override on .bs-table-responsive with a self-contained outline declaration so the rule actually shows a ring.
Token alignment and reduced motion
--bs-btn-size-lg now aliases --bs-control-size-xl, removing the previous 0.10 rem drift between LG buttons and LG form controls. Added an explicit prefers-reduced-motion override for .bs-spinner so the single-frame flicker from the global animation-iteration-count: 1 reset is no longer visible. Hard-coded #fff in form radio, checkbox, and switch controls now uses var(--bs-color-primary-contrast) so dark/light/palette variants stay consistent.
RTL property cleanup
Replaced remaining border-bottom, padding-top, margin-bottom, and text-align: left rules with their logical equivalents (border-block-end, padding-block-start, margin-block-end, text-align: start) in code, list, table, card, alert, and utilities/typography.
TypeScript surface
Dialog.show, hide, and toggle now accept DialogTransitionOptions (extends FocusTransitionOptions with returnValue). Existing FocusTransitionOptions call sites continue to compile. InputMask.format() returns boolean | string (formatted value when the input changed, otherwise false). formatMask(value, pattern) drops the never-implemented placeholder? parameter.
Packaging
packages/alpine/package.json now includes LICENSE and README.md in files so the published Alpine adapter ships the same license artefacts as React and Vue. The official Alpine, React, and Vue adapter peer range for @boobstrap/boobstrap bumped to ^0.7.0.
Release confidence
The release gate still covers RTL behavior, accessibility resilience, and the minified artifact in addition to strict TypeScript fixtures, adapter conformance, distributable token verification, and Playwright visual baselines. Public surface: 1,099 classes and 109 tokens. Lifecycle: 50 events across 17 controllers.
Upgrade the peer range
If your application depends on @boobstrap/alpine, @boobstrap/react, or @boobstrap/vue, upgrade @boobstrap/boobstrap to ^0.7.0 so npm v7+ resolves cleanly.
Adopt the logical text utilities
Replace bs-text-left / bs-text-right with bs-text-start / bs-text-end in RTL-aware code; the physical aliases remain available.
Use usePassword controlled mode
New visible / defaultVisible / onVisibleChange options on usePassword let a parent component own password visibility state. Existing uncontrolled usage is unchanged.
Drop application-side sidebar shortcuts
If application code implemented its own Ctrl/Cmd+B-style sidebar shortcut, remove it and pass the shortcut option to the framework instead — the framework now guards against text input and open-dialog focus.