All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- Added a
selectionColorsparameter toUnstyledTextFieldfor styling text selection handles and background. (#374)
- Themes now default text selection colors to
Color.Unspecifiedinstead of inheriting parent selection styling. - Deprecated
minimumInteractiveComponentSize,ComponentInteractiveSize, anddefaultComponentInteractiveSize. These APIs will be removed in 3.0. It is now up to you to implement this behavior if it is a requirement for your design system.
- Added focus-visible support to
focusRing, includingFocusVisibilityProvider,collectIsFocusVisibleAsState, andFocusRingVisibility.Focusedfor opting into the previous focus-only behavior. (#349) - Added a dedicated
visual-regressionsmodule for desktop screenshot regression coverage.
- Theme's
minimumInteractiveComponentSize()now applies touch-sized minimum bounds on devices that support touch input instead of forcing it depending on the platform target. - Improved Bottom Sheet layout performance by reducing repeated measurement calculations.
UnstyledDialogandUnstyledModalBottomSheetoverlay lambdas now use dedicated overlay scopes, withScrimavailable directly from those scopes.
- Removed the separate
composeunstyled-scrimartifact. UseScrimfromcomposeunstyled-modal,composeunstyled-dialog, orcomposeunstyled-modal-bottom-sheetinstead.
- Fixed fully expanded bottom sheets with short lazy content anchoring incorrectly instead of staying aligned to the bottom of the container. (#356)
- Fixed fully expanded bottom sheets clipping content when the sheet modifier adds height, such as top padding. (#356)
- Fixed a visual glitch where bottom sheets could briefly jump past their expanded position when flung by touch.
- Added recomposition test coverage for Bottom Sheet, Modal Bottom Sheet, and Toggle Switch.
- Added screenshot test coverage for Bottom Sheet and Modal Bottom Sheet demos.
- Tooltip now has a dedicated
TooltipHostfor rendering tooltip panels instead of leakingPortal.
- Dropdown menus now render in our own
Modal()instead of a platform popup. - Dropdown Menu and Tooltip now expose shared anchor placement APIs from
composeunstyled-anchored-apiwithout exposing the internal anchored layout implementation transitively. UnstyledIconnow defaultscontentDescriptiontonullfor decorative icons.
- Fixed
UnstyledSwitchalways animating to enabled even if its original state was enabled. - Fixed bottom sheet content-dependent detent measurement when sheet modifiers add padding or fixed height content is taller than the visible sheet. (#316)
- Fixed dropdown menus being placed incorrectly on the first frame when initially expanded. (#308)
- Fixed modal bottom sheets animating before their modal window is attached. (#287)
- Modules! You can now pick and choose only the APIs that you want to use instead of being forced
to add the full library to your codebase.
composeunstyled-primitivescontinues to aggregate all primitives for users who prefer a single dependency. - Added the following new modules:
composeunstyled-anchored,composeunstyled-bottom-sheet,composeunstyled-build-modifier,composeunstyled-button,composeunstyled-checkbox,composeunstyled-colored-indication,composeunstyled-dialog,composeunstyled-disclosure,composeunstyled-dropdown-menu,composeunstyled-escape-handler,composeunstyled-focus-ring,composeunstyled-icon,composeunstyled-modal,composeunstyled-modal-bottom-sheet,composeunstyled-outline,composeunstyled-portal,composeunstyled-progress,composeunstyled-radio-group,composeunstyled-scrim,composeunstyled-scrollbars,composeunstyled-separators,composeunstyled-slider,composeunstyled-stack,composeunstyled-tab-group,composeunstyled-text-field,composeunstyled-toggle-switch,composeunstyled-tooltip,composeunstyled-tri-state-checkbox, andcomposeunstyled-window-container-size. - New Modal API: The Modal API has been revamped in order to make building custom modals easier, without having to manage platform-specific modal lifecycles directly.
- Added
PortalHostandPortalfor rendering content into a same-window portal without changing parent layout. - Added anchored positioning APIs for placing floating content relative to an anchor.
- Added
Scrimas a scoped modal primitive. - Added
Sheetas the measured bottom sheet panel andUnstyledBottomSheetas the bottom sheet container. - Added public
BottomSheetStateandModalBottomSheetStateconstructors so design systems can wrap primitive state in their own state objects. - Compose Unstyled now uses Kotlin
2.3.20and Compose Multiplatform1.11.0-alpha01.
- The
composeunstyledartifact is removed. Usecomposeunstyled-primitivesfor the aggregate dependency, or depend on the individual modules you need. - All deprecated APIs are now removed. If you have breaking changes moving to this version,
downgrade to the latest 1.x.x version and use
ReplaceWith()to smoothly migrate to the latest APIs. - Removed the
com.composables.corepackage. - Removed
ComposeUnstyledFlags.
- Decoupled theming from primitives. Primitives no longer read
LocalContentColororLocalTextStyle; users are responsible for styling primitives with their theming API of choice. - Moved
Text,LocalContentColor,LocalTextStyle,ProvideContentColor, andProvideTextStyleto the theming module. - The
BottomSheetAPI has been reworked and split into two composables.UnstyledBottomSheetworks as the area in which the bottom sheet can move on, while theSheetdoes the actual rendering. - Bottom sheet animations can now be customized per state change with animation specs, and modal bottom sheets can use a separate dismiss animation spec.
- Modal Bottom Sheet does not have its own independent
Sheetcomposable anymore. It reusesBottomSheet'sSheetAPI. - Modal Bottom Sheet now has a separate
overlayslot for passing any dimming overlay such as a scrim. - Modal Bottom Sheet is now IME-aware by default through
ModalBottomSheetProperties.offsetForIme. UnstyledDialogvisibility is now controlled by avisibleparameter, andDialogPanelsupports an optionalpaneTitlefor accessibility.UnstyledDisclosureis now controlled byexpandedandonExpandedChange.UnstyledDropdownMenunow uses scopedDropdownMenuPanelandMenuItemAPIs, supports anchored side/alignment offsets, and supports Home/End keyboard navigation inside menus.UnstyledTooltipnow uses a scopedTooltipPanelAPI withTooltipPlacementinstead of arrow-specific parameters.UnstyledTabGroupnow uses generic tab keys and scopedTabList,Tab, andTabPanelAPIs.UnstyledTextFieldnow usesTextFieldState, exposes a scopedTextInputslot, and passes through the newerBasicTextFieldtransformation, line limit, keyboard, layout, and scroll parameters.UnstyledSlidernow exposestrackandthumbslots withSliderState, supports horizontal and vertical orientations, reverse direction, stepped values, keyboard control, and custom thumb sizing.- Checkbox, tri-state checkbox, and radio group indicators are now scoped child APIs
(
CheckedIndicator,StateIndicator, andSelectedIndicator) that receive the primitive interaction source. - Radio groups now support generic value types and scope
RadioButtontoRadioGroupScope. - Toggle switch behavior and thumb placement are now split between
UnstyledSwitchand the scopedSwitchThumbAPI. - Scroll area state APIs moved into the scrollbars module and were renamed to
ScrollbarState. TheScrollAreacontainer was removed so scrollbars do not impose layout or styling choices. - Scrollbars are now standalone vertical and horizontal primitives with caller-provided thumbs and
ThumbVisibilitycontrol. - Component primitives no longer choose internal layout, alignment, or sizing for their content. Design systems are now responsible for arranging primitive slots and indicators.
- Tooltips now hide on Escape only while visible and keep keyboard focus and hover visibility handling separate.
- Scrollbars now support dynamic sizing. (#78)
- Scrollbars now stay visible while their thumb is dragged.
- Bottom Sheet content is now constrained to the visible sheet height. No need to hardcode a size if your content is scrollable. (#134)
- Dialog, Modal Bottom Sheet, and Scrim now synchronize their exit lifecycle through shared modal state, preventing the modal window from being removed before animated fragments finish exiting.
- Dialog no longer freezes when it is initially visible without a scrim.
- Fix dialog freeze when initially visible without a scrim. (Fixes #128)
- Fix stepped slider snapping behavior. (Fixes #81)
- Fix modals not inheriting
LocalLayoutDirectionfrom their parent. (Fixes #192) - Prevent unnecessary theme recompositions when theme values do not change.
- Add new
ScrollAreacomponent in thecom.composeunstyledpackage. Old packages will be removed in 2.0.
- All component primitives are now prefixed with
Unstyled-. - Library minSDK is now 23.
- Bump compileSDK to 36.
- Add new
demo-system-ui-stylingmodule that showcases how to style System UI in modals.
- Fix state TextField visual transformation mapping (Fixes #207)
- Apply visualTransformation when TextField is non-editable (Fixes #206)
- Add textDecoration parameter to UnstyledTextField (Fixes #205)
- Add textDecoration parameter to UnstyledText (Fixes #205)
- Automatically focus dialog panel content on displayed (Fixes #204)
- Fix iOS DropdownMenu enter animations (Fixes #159)
- Fix Modals updating System UI appearance (Fixes #198)
- ScrollAreaState now exposes a new
isScrollInProgressproperty
- Scrollbars Thumb HideWhileIdle hides while scrolling #114
- Add onTextLayout parameter to Text (#185)
- Begin of prefixing all components with
Unstyled-prefix, so it's simpler to differenciate with other design systems components.
- Dialog's enter animations now work correctly on iOS.
- Add
autoSizeparameter to Text (#183)
- Fix a bug where ScrollArea would trigger overscroll effect to the wrong axis
- Remove TextField placeholder on any character entered including space
- Change token names of PlatformTheme so that they do not override user's
- Fix inverted colors for RadioGroup
- Fix a Slider bug where Thumb would immediately jump while dragged
- Deprecate ScrollArea with overscroll effect parameter
Allow customization of Platform Themes (b2c2a26d)
- Tint TextField's contents according to LocalContentColor (1b3fb2bd)
- Fix a crash when updating BottomSheet's detents (7961afd1)
- Fix bug where Modifier.onFocusChanged wouldn't work with TextField (e3f0bd6c)
- Introduce Platform Themes. Platform Themes provide a native look and feel depending on the platform you are running on, such as platform fonts, text sizes, emojis on Web, touch indications, and interactive sizing for controls.
- Add option to animate
ColoredIndication's color changes - Add getter to MutableThemeProperties
- Updated demos to use Platform Theme instead of hardcoded styles
- Ensure modal is added before monitoring its state ( fixes #151)