Changelog
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.
[1.0.4] - 2026-06-02
Added
- Hover & press interaction states on all interactive components —
Button,ActionButton,IconButton,MenuButton,SocialLoginButton,FloatingActionButton,Card,Container(whenonPressis set),Checkbox, andInputWrappernow animate their opacity on hover (web/desktop) and press, with a smooth 150ms timing transition. The animation is automatically disabled while a button is loading or has noonPresshandler. usePressableInteractionhook exported from@multinaire/ui— returns ananimatedStyleand a set ofoverrideProps(onHoverIn,onHoverOut,onPressIn,onPressOut) you can spread onto anyPressableto add the same hover/press opacity feedback used by the built-in components.useButtonStyleshook is now exported from@multinaire/ui(previously an internal button helper) — resolves the background, foreground, and disabled styles for a given buttontype.
Changed
- All interactive components migrated from
TouchableOpacitytoPressable— this enables hover support on web/desktop and aligns with the React Native recommended interaction primitive. The previousactiveOpacityfeedback is replaced by the newusePressableInteractionanimation. AnimatedTouchableOpacityexport renamed toAnimatedPressable— anAnimated-wrappedPressable. Update any imports ofAnimatedTouchableOpacitytoAnimatedPressable. See the migration guide.- Minimum Node version raised to
>=22(was>=18).
Fixed
Popupsafe-area insets on Android — popup content is now wrapped in aSafeAreaProviderwith explicit initial metrics so the safe-area insets resolve correctly inside the Modal's Android window.Popupopen delay removed — the child content no longer waits on a 50mssetTimeoutbefore rendering, so popups open immediately.ListPickerlayout on Android — now renders using the dialog layout on Android (previously only when the popuptypewasdialog), preventing clipped sheet content.
[1.0.3] - 2026-05-20
Added
testIDauto-detection onTypography— whenchildrenis a string, the component automatically setstestIDto that string value so text elements are addressable in tests without extra configuration.testIDfallback toplaceholderonInput,PickerButton, andMediaPickerButton— when no explicittestIDis provided, theplaceholdervalue is used as the test identifier.- Built-in
testIDonInputWrapperclear button — always"clear-input". - Built-in
testIDmarkers onPagination— the animated label receives the current item value as itstestID; the focused step container receives"<item>-is-focused". - Built-in
testIDmarkers onDateTimePickernavigation buttons — previous icon is"previous", next icon is"next".
Changed
LocalizationProvider.defaultLanguage— the'system'option is renamed to'auto'. Update any explicitdefaultLanguage="system"todefaultLanguage="auto".LocalizationContext.language— type narrowed from'system' | LanguagetoLanguage; the active locale is always a concrete code.LocalizationContext.languages— type narrowed from('system' | Language)[]toLanguage[]; the array no longer includes'system'as a first entry.LocalizationContext.changeLanguage— parameter type narrowed from'system' | LanguagetoLanguage.
Fixed
StackHeadertop safe area — simplified the safe-area condition: the inset is now skipped only when the parent navigator is atabordrawer. The grandparent-stack detection introduced in 1.0.2 has been removed.
Removed
useScreenOptionsdeprecated properties —stack,stackWithOverrides,topTab,topTabWithOverrides,bottomTab,bottomTabWithOverrides,sideBar,sideBarWithOverrideshave been removed (deprecated in 1.0.2). UseuseScreenOptions(type).screenOptionsinstead.
[1.0.2] - 2026-05-09
Added
testIDprop on all interactive components —Button,ActionButton,IconButton,MenuButton,SocialLoginButton,FloatingActionButton,BottomTabButton,SideBarButton,TopTabButton,Container,Icon,Badge,Card,Input,InputWrapper,Checkbox,Toggle,PickerButton,MediaPickerButton,ListPickerItem. When atitleis available the prop defaults to the title value so most components are automatically addressable without extra configuration.- Built-in
testIDmarkers on structural elements: Popup overlay ("modal-overlay"), PopupHeader close button ("modal-close"), StackHeader back button ("navigation-back"), StackHeader close button ("navigation-close"). defaultLanguageprop onMultinaireUIandLocalizationProvider— set the initial language. Pass'system'(default) to auto-detect from the device locale viaexpo-localization, or a locale code (e.g.'fr') to hard-code the startup language.languagesarray inLocalizationContext— ordered list of all supported locales derived from thetranslationsprop. Always starts with'system'so you can offer an "Auto-detect" option in a language picker.defaultThemeModeprop onMultinaireUIandThemeProvider— set the initial theme mode ('system'|'light'|'dark'). Defaults to'system'.themeModesarray inThemeContext— always['system', 'light', 'dark'].TranslationSchemaaugmentation interface — declare your locale types once in a.d.tsfile and get type-safe locale codes (Language) and translation keys (TranslationKey) across all components and hooks.LanguageandTranslationKeytypes exported from@multinaire/ui.backTitleprop onStackHeader— override the back-button label. Defaults to'Back'.closeTitleprop onStackHeader— override the modal close-button label. Defaults to'Close'.confirmTitleprop onDateTimePicker— override the confirm button label. Defaults to'Confirm'.previousTitle,nextTitle,doneTitleprops onPageContainer— override the navigation button labels. Defaults are'Previous','Next','Done'.NavigatorTypetype ('stack' | 'top-tab' | 'bottom-tab' | 'side-bar') exported from@multinaire/ui.useScreenOptions(type)now accepts a navigator type and returns a unifiedscreenOptionsfunction plustitle(),tabBarLabel(), andtabBarIcon()helper functions for type-safe screen configuration.
Changed
Toggledefaultcolorchanged from'primary'to'success'. Passcolor="primary"explicitly to preserve the previous appearance.- String props that display user-facing text (button titles, input labels, placeholders, error messages, popup titles, etc.) are now typed as
TranslationKey. WhenTranslationSchemais augmented this provides compile-time checking that only defined keys are passed. Without augmentation the type staysstring. TypographyProps.childrenis now typed asTranslationKey | Exclude<ReactNode, string>. String literals passed as children must be valid translation keys whenTranslationSchemais in use.useScreenOptionslegacy return properties (stack,topTab,bottomTab,sideBar, and their*WithOverridesvariants) are deprecated. They continue to work but will be removed in a future minor version. Migrate touseScreenOptions(type).screenOptions.
Fixed
Toggleinternal state was updated even whenonChangewas not provided. State now only updates when a handler is present.- Tab bar icon color no longer falls back to
'transparent'; the color is correctly cast from the theme context. Containerwith bothsafeAreaEdgesandonPressnow throws a descriptive runtime error — these two props are mutually exclusive.StackHeadertop safe area — stacks nested inside another user stack no longer double-apply the top safe area inset. The header now checks for a grandparent navigator to detect genuine nesting, covering the common Expo Router case.StackHeaderdesktop title — when navigating back, the right-side container switched to a column layout but keptflex={1}, which prevented the title from rendering. The flex is now only applied when there is no back button (row layout).
Deprecated
useScreenOptions()return properties:stack,stackWithOverrides,topTab,topTabWithOverrides,bottomTab,bottomTabWithOverrides,sideBar,sideBarWithOverrides. UseuseScreenOptions(type).screenOptionsinstead.createTabSceenOptions(typo) renamed tocreateTabScreenOptions. The old name is no longer exported.
[1.0.1] - 2026-04-18
Changed
useUIrenamed touseTheme— the hook was shipped under the wrong name in 1.0.0. Update every call site:const { colors, variables, fonts } = useTheme().
[1.0.0] - 2026-04-17
Breaking Changes
Package renamed: @multinaire/multinaire-design → @multinaire/ui
All Multinaire prefixes removed from the public API. Update every import accordingly.
Provider / root entry point
| Before | After |
|---|---|
MultinaireDesignProvider (default export) | MultinaireUI (named + default export) |
MultinaireDesignProps | MultinaireUIProps |
Hooks
| Before | After |
|---|---|
useMultinaireTheme | useTheme |
useMultinaireThemeMode | useThemeMode |
useMultinaireLocalization | useLocalization |
useMultinaireModal | usePopup |
useMultinaireKeyboard | useKeyboard |
useMultinaireResponsiveDesign | useResponsiveDesign |
useMultinaireLoadingAnimation | useAnimate |
Icons
| Before | After |
|---|---|
MultinaireIcons | Icons |
Components — renamed
| Before | After |
|---|---|
MultinaireText | Typography |
MultinaireImage | Photo |
MultinaireLoading | Animate |
MultinaireScrollView | ScrollContainer |
MultinaireSwitch | Toggle |
MultinaireModal | Popup |
MultinaireModalHeader | PopupHeader |
MultinaireModalToggleButton | PopupToggleButton |
MultinaireKeyboardAvoidingView | KeyboardAvoidingContainer |
MultinaireListView | ListContainer |
MultinairePageView | PageContainer |
MultinaireTabView | TabContainer |
All other Multinaire* components drop the prefix (e.g. MultinaireButton → Button).
Prop types renamed to match their component names exactly:
| Old name | New name |
|---|---|
TextProps | TypographyProps |
ImageProps | PhotoProps |
SwitchProps | ToggleProps |
KeyboardAvoidingViewProps | KeyboardAvoidingContainerProps |
ScrollViewProps | ScrollContainerProps |
ListViewProps | ListContainerProps |
TabViewProps | TabContainerProps |
PageViewProps | PageContainerProps |
ListPickerItem | ListPickerItemData |
DatePickerProps | DateTimePickerProps |
Removed
MenuButton.typeprop ('default' | 'warning' | 'error') — foreground color is now alwaysonBackgroundButtonType.destructive— use'error'instead
Changed
Pageanimation changed from fade to directional slide (forward slides in from the right, backward from the left)
Added
MultinaireUIis now also the default export of@multinaire/ui
See the Migration Guide for a full upgrade walkthrough.