RTL-ready props and flash-free themes
Consistent variant and RTL prop names, server-resolved theme palettes, and hardened overlays, focus, and keyboard handling.
New features
- Added
onModeChangeandattributesto ThemeScope, andonColorModeChangeto VortexProvider. - Added the
flaretheme override, which also themes primary buttons. - Exported
DrawerSnapPoint.
Improvements
- Resolved ThemeScope palettes in server-rendered markup, and saved and system color modes before hydration, so themed scopes no longer flash on load.
- Made a controlled
colorModeown its boundary. Setters rendered beneath it have no effect. - Changed focus rings to an outline with a transparent gap. Inset rings use
currentColor. - Improved Drawer keyboard access, focus order, snap offsets, and nested release. Drawer warns in development when a handle is misplaced or duplicated.
- Improved ZoomImage focus: it manages dialog focus, focuses the close button during keyboard navigation, and uses the custom image renderer in its overlay.
- Gave the Toast region an accessible name. Toast actions keep keyboard handling and focus visibility.
- Improved Interactive semantics: it honors explicit roles, keeps native semantics and focus rings, and resolves
typeonly when rendering a<button>.
Bug fixes
- Fixed Interactive links activating with Space.
- Fixed Badge action and dismiss controls sharing one control. Unrecognised attributes stay on the badge root.
- Fixed Card firing duplicate click callbacks.
- Fixed Floating attribute forwarding, style precedence, rem-based spacing, and trigger-width measurement. Open callbacks no longer fire while disabled.
- Fixed Select, TextField, and TextArea focus, disabled, and placeholder styling. The multi-select search input keeps a minimum width while closed.
- Fixed Avatar fallback fill bleeding around photos. Its border now paints above the image.
- Fixed useShortcuts not dispatching keyboard shortcuts outside unrelated scopes.
- Fixed useCanDismiss losing nested dismissal order when overlays unmount out of order.
- Fixed useScrollLock cleanup so unmounting releases its lock while other owners keep scrolling locked.
- Fixed
body-xsfont weights and theheading-smdesktop line height. The primary border color now usesbrandPrimary500.
Breaking changes
- Required React 19. The
reactandreact-dompeer dependencies are now^19. - Required Node
>=22.12.0for thevortexCLI. - Renamed the visual
typeprop tovarianton Avatar, Badge, BreakpointsIndicator, Select, Shortcut, TextArea, and TextField, and tolayouton Alert and Toast.
Before → After
// Before
<Badge type="outline" />
<Alert type="inline" />
// After
<Badge variant="outline" />
<Alert layout="inline" />- Renamed
leftIconandrightIcontostartIconandendIconon Button, Link, ListItem, and Badge. - Renamed
isExternaltoopenInNewTabon Interactive, Button, Link, and ListItem.
Before → After
// Before
<Button leftIcon={Bolt} rightIcon={Arrow} />
<Link href="…" isExternal />
// After
<Button startIcon={Bolt} endIcon={Arrow} />
<Link href="…" openInNewTab />- Renamed Floating positions
left-*andright-*tostart-*andend-*. They now mirror in RTL, and submenus default toend-top. - Removed
forcePositionfrom Floating, Popover, and DropdownMenu. UsefallbackPositions={false}instead. RemovedfallbackMinWidth, which had no effect. - Removed
TextField.Field,TextField.StartSlot, andTextField.EndSlot, along with their prop types. - Restricted Drawer snap points to numbers or
pxstrings."50%"previously rendered as50px. - Limited Drawer.Close render-prop attributes to
onClick. - Renamed the
themes/overrides/reddit/*export tothemes/overrides/flare/*.

