# Versions

## 0.4.0

_Sep 4, 2026_

- **Breaking change:** Correctly infer optional values in `useControlled` while preserving the frozen `EMPTY_ARRAY` singleton. The returned value and setter now include `undefined` when both the controlled and default values can be `undefined` (#5203, #5620) by @jjenzz and @michaldudak
- **Breaking change:** Enforce matching store state key/value types. Broad `Partial<State>` arguments must be narrowed to an exact known subset before calling `Store.update` or `ReactStore.useSyncedValues` (#5423) by @jjenzz
- Add `clamp`, `areArraysEqual`, `formatNumber`, `stringifyLocale`, and shadow DOM utilities (#5167) by @romgrk
- Make animation frame cancellation idempotent (#5533) by @gilsmt
- Add `createLogOnce`, `reactMajor`, an iOS media query, and a stale event target fallback (#5540) by @romgrk
- Expand store selectors and add configurable memoization (#5489) by @romgrk

## 0.3.2

_Aug 4, 2026_

- Add `useIdleCallback` (#5229) by @bernardobelchior
- Fix `usePreviousValue` equality comparison (#5264) by @lyzno1
- Fix `useScrollLock` handoff with external overlays (#4665) by @atomiks

## 0.3.1

_Jun 18, 2026_

Same code as 0.3.0.

## 0.3.0

_Jun 11, 2026_

- **Breaking change:** Replace `@base-ui/utils/detectBrowser` with the new `@base-ui/utils/platform` namespace (#4920) by @romgrk
- Fix `useStore` returning stale values when the store or selector arguments change (#4866) by @chuganzy
- Update `reselect` to 5.2.0 (#4910) by @IzumiSy
- Build the package with a flat output structure (#4959) by @brijeshb42

## 0.2.9

_May 19, 2026_

- Improve `ReactStore` mount performance with interaction splitting (#4661) by @atomiks
- Add `getDefaultFormSubmitter` helper (#4713) by @michaldudak
- Do not use `Math.random()` in `useStableCallback` (#4732) by @michaldudak

## 0.2.8

_Apr 20, 2026_

- Deprecate `isMouseWithinBounds` (#4604) by @atomiks

## 0.2.7

_Apr 13, 2026_

- Update `StoreInspector` to use shadow DOM-safe DOM utilities (#4412) by @atomiks
- Move `createSelectorMemoized` into a separate module to reduce bundle size (#4336) by @atomiks
- Disallow optional and default parameters in `createSelector` combiners (#4299) by @JCQuintas
- Add `addEventListener` and `mergeCleanups` helpers (#4504) by @atomiks
- Fix `useControlled` warnings for circular or unserializable default values (#4452) by @Profesor08
- Support pointer events in `isMouseWithinBounds` (#4528) by @atomiks

## 0.2.6

_Mar 12, 2026_

- Add `createFormatErrorMessage` factory function (#4190) by @brijeshb42

## 0.2.5

_Feb 12, 2026_

- Refactor `ReactStore` and speed up `useStore` (#3384, #3445) by @romgrk
- Reduce `useScrollLock` style recalculation with classic scrollbars (#3854) by @mdm317
- Fix event handling in `useEnhancedClickHandler` (#3981) by @sai6855

## 0.2.4

_Jan 15, 2026_

- Add `visuallyHiddenInput` for visually hidden form controls (#3606) by @atomiks
- Improve `useScrollLock` stable scrollbar gutter detection for custom scrollbars (#3575) by @chuganzy
- Fix `ReactStore` synced value updates when detached triggers remount (#3724) by @atomiks

## 0.2.3

_Dec 11, 2025_

- Rename package from `@base-ui-components/utils` to `@base-ui/utils` (#3462) by @mnajdova

## 0.2.2

_Dec 4, 2025_

- Use raw `useSyncExternalStore` with React 19+ in `useStore` (#3360) by @romgrk

## 0.2.1

_Nov 27, 2025_

- Fix React <=18 ref access in `getReactElementRef` (#3257) by @atomiks
- Make `useScrollLock` cleanup safely check `removeEventListener` (#3264) by @Copilot
- Improve `ReactStore.useSyncedValues` performance for stable objects (#3277) by @michaldudak
- Avoid recreating `ReactStore.useStateSetter` callbacks (#3316) by @romgrk

## 0.2.0

_Nov 17, 2025_

- Add infrastructure to support nested stores (#3037) by @michaldudak
- Export `useScrollLock` (#3233) by @atomiks

## 0.1.0

_Jul 30, 2025_

Initial release
