Skip to documentation
BoobstrapDocs
Get started

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.

Maintenance releaseNo breaking changev0.7.0 current
Current release

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.

Available now: install @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.

React · Controlled password toggle
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.

HTML · Logical text alignment
<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.