Some public View extension methods prefixed with ouds have been renamed to remove the prefix, aligning with the naming style of typography helpers.
The old methods are deprecated and will be removed in a future major version.
The tab bar component has a new initializer with a binding for the selected tab, deprecating the older one.
- Use version 1.3 or older
The following View extension methods have been deprecated in favor of unprefixed versions.
The old methods still compile with a deprecation warning.
Impact: Low
| Deprecated | Replacement |
|---|---|
.oudsForegroundStyle(_:) |
.foregroundStyle(_:) |
.oudsForegroundColor(_:) |
.foregroundColor(_:) |
.oudsBackground(_:) |
.background(_:) |
.oudsAccentColor(_:) |
.accentColor(_:) |
.oudsShadow(_:) |
.shadow(_:) |
.oudsBorder(style:width:radius:color:) |
.border(style:width:radius:color:) |
.oudsColoredSurface(_:) |
.coloredSurface(_:) |
.oudsGridMargin(_:) |
.gridMargin(_:) |
.oudsRequestAccessibleFocus(_:) |
.requestAccessibleFocus(_:) |
.oudsRequestAccessibleFocus(_:for:) |
.requestAccessibleFocus(_:for:) |
.oudsHorizontalDivider(dividerColor:) |
.horizontal(color:) |
.oudsVerticalDivider(color:) |
.vertical(color:) |
Before (v1.3.x):
Text("Hello")
.oudsForegroundColor(theme.colors.contentDefault)
.oudsBackground(theme.colors.bgPrimary)
// Etc.
SomeView()
.oudsBorder(style: theme.borders.styleDefault,
width: theme.borders.widthThin,
radius: theme.borders.radiusMedium,
color: theme.colors.borderDefault)
.oudsShadow(theme.elevations.emphasized)
// Etc.After (v1.4.0):
Text("Hello")
.foregroundColor(theme.colors.contentDefault)
.background(theme.colors.bgPrimary)
SomeView()
.border(style: theme.borders.styleDefault,
width: theme.borders.widthThin,
radius: theme.borders.radiusMedium,
color: theme.colors.borderDefault)
.shadow(theme.elevations.emphasized)Required Action:
- Replace deprecated
ouds-prefixed calls with their unprefixed counterparts
Reason for Change: User feedback indicated the ouds prefix on methods was redundant and verbose given that parameter types are strongly typed OUDS tokens which prevent any ambiguity with native SwiftUI overloads.
The OUDSTabBar(selected:count:content:) initializer that accepted a plain Int for the initially selected tab is now deprecated.
A new OUDSTabBar(selectedTab:count:content:) initializer replaces it, accepting a Binding<Int> that is updated whenever the user taps a tab — keeping the parent view in sync with the tab bar selection without any extra code.
Impact: Low
Before (v1.3.x):
// The initial tab is fixed at 0; user interactions are not propagated back.
OUDSTabBar(selected: 0, count: 3) {
SomeView().tabItem { Label("Home", image: "ic_home") }.tag(0)
OtherView().tabItem { Label("Search", image: "ic_search") }.tag(1)
LastView().tabItem { Label("Profile", image: "ic_profile") }.tag(2)
}After (v1.4.0):
// Declare a @State to hold the selected tab index.
@State private var selectedTab = 0
// Pass it as a Binding: the tab bar updates selectedTab when the user taps a tab,
// and programmatically changing selectedTab switches the displayed tab.
OUDSTabBar(selectedTab: $selectedTab, count: 3) {
SomeView().tabItem { Label("Home", image: "ic_home") }.tag(0)
OtherView().tabItem { Label("Search", image: "ic_search") }.tag(1)
LastView().tabItem { Label("Profile", image: "ic_profile") }.tag(2)
}Required Action:
- Replace
OUDSTabBar(selected:count:content:)calls withOUDSTabBar(selectedTab:count:content:) - Declare a
@State private var selectedTab: Int(or use an existing state/binding) and pass it as$selectedTab - Remove any manual workaround you may have used to track or drive tab selection from outside the component
Reason for Change: The original initializer only accepted a one-time initial value (Int) with no way to observe or control the selected tab from outside the component.
The new initializer uses a Binding<Int> so the selected tab is always in sync with the parent view: user taps update the binding, and external state changes switch the visible tab.
- Backward Compatibility: Yes
- v1.4.0 Support: Until release of next minor version
The design team confirms that any logic related to grids, gutters and spacings are related to the horizontal size class.
Thus existence of oudsVerticalSizeClass, used nowhere, is a non-sense; this property has been removed.
- Use version 1.2 or older
Impact: Low
Before (v1.x):
@Environment(\.oudsVerticalSizeClass) var sizeClass // Or any other name for propertyAfter (v1.3.0):
// Property removedRequired Action:
- Remove us of
oudsVerticalSizeClassenvironment object
Reason for Change: Not used, not relevant, must not be considered even if design side
Note: This property comes back with v1.4.0 as some users still used it
Impact: Low
Before (v1.x):
var someIconForBulletList: OUDSBulletList.UnorderedIcon {
.free(someImage)
}After (v1.3.0):
var someIconForBulletList: OUDSBulletList.UnorderedAsset {
.icon(someImage)
}Required Action:
- Rename any use of
OUDSBulletList.UnorderedIcontoOUDSBulletList.UnorderedAsset - Case
.freemust be replaced by.icon
Reason for Change: "asset" word has a better meaning than "icon", and is aligned with Android OUDS library API
- Backward Compatibility: No
- v1.2.0 Support: Until release of next minor version
The Orange Business Tools theme has been renamed by the design team to Orange Compact Thus the theme name is more accurate and does not have ambiguity anymore with Orange Business company.
- Use version 1.x
Impact: High
Before (v1.x):
import OUDSThemeOrangeBusinessToolsAfter (v1.2.0):
import OUDSThemeOrangeCompactRequired Action:
- If you use individual imports, rename the name of the Swift Package product from
OUDSThemeOrangeCompacttoOUDSThemeOrangeCompact
Reason for Change: Use more accurate name for the theme
Impact: High
Before (v1.x):
OrangeBusinessToolsTheme()After (v1.2.0):
OrangeCompactTheme()Required Action:
- If you instanciated
OrangeCompactThemeobject, use insteadOrangeCompactThemename
Reason for Change: Use more accurate name for the theme
Impact: High
Required Action:
- Wherever you use the name "OrangeBusinessTools" (whatever the case or the style), in documentation, tests or source code, replace instead by "OrangeCompact"
Reason for Change: Use more accurate name for the theme
- Backward Compatibility: No
- v1.1.0 Support: Until release of next minor version
Some "multiple" object tokens have been renamed from plural form to singular form. Component tokens of button for borders have been shortened.
- Use version 1.0.0
Impact: High
Before (v1.0.0):
// Old namings of objects
MultipleElevationCompositeRawTokens
MultipleColorSemanticTokens
MultipleFontCompositeSemanticTokens
MultipleFontLetterSpacingSemanticTokens
MultipleFontLineHeightSemanticTokens
MultipleFontSizeSemanticTokens
MultipleSizeSemanticTokens
MultipleSpaceSemanticTokensAfter (v1.1.0):
// Use new namings without final 's'
MultipleElevationCompositeRawToken
MultipleColorSemanticToken
MultipleFontCompositeSemanticToken
MultipleFontLetterSpacingSemanticToken
MultipleFontLineHeightSemanticToken
MultipleFontSizeSemanticToken
MultipleSizeSemanticToken
MultipleSpaceSemanticTokenRequired Action:
- Step 1: Rename all
MultipleColorSemanticTokensuses toMultipleColorSemanticToken - Step 2: Rename all
MultipleElevationCompositeRawTokensuses toMultipleElevationCompositeRawToken - Step 3: Rename all
MultipleFontCompositeSemanticTokensuses toMultipleFontCompositeSemanticToken - Step 4: Rename all
MultipleFontLetterSpacingSemanticTokensuses toMultipleFontLetterSpacingSemanticToken - Step 5: Rename all
MultipleFontLineHeightSemanticTokensuses toMultipleFontLineHeightSemanticToken - Step 6: Rename all
MultipleFontSizeSemanticTokensuses toMultipleFontSizeSemanticToken - Step 7: Rename all
MultipleSizeSemanticTokensuses toMultipleSizeSemanticToken - Step 8: Rename all
MultipleSpaceSemanticTokensuses toMultipleSpaceSemanticToken
Reason for Change: Bring consistency between objects exposed by the API; plural form is not correct
Impact: High
Before (v1.0.0):
// Old namings of objects
buttonBorderRadiusDefault
buttonBorderRadiusRounded
buttonBorderRadiusSocial
buttonBorderWidthDefault
buttonBorderWidthDefaultInteraction
buttonBorderWidthDefaultInteractionMonoAfter (v1.1.0):
// Use new namings without 'button' prefix
borderRadiusDefault
borderRadiusRounded
borderRadiusSocial
borderWidthDefault
borderWidthDefaultInteraction
borderWidthDefaultInteractionMonoRequired Action:
- Step 1: Rename all
buttonBorderRadiusDefaultuses toborderRadiusDefault - Step 2: Rename all
buttonBorderRadiusRoundeduses toborderRadiusRounded - Step 3: Rename all
buttonBorderRadiusSocialuses toborderRadiusSocial - Step 4: Rename all
buttonBorderWidthDefaultuses toborderWidthDefault - Step 5: Rename all
buttonBorderWidthDefaultInteractionuses tobuttonBorderWidthDefaultInteraction - Step 6: Rename all
buttonBorderWidthDefaultInteractionMonouses toborderWidthDefaultInteractionMono
Reason for Change: Tokens names must be shortened and must not repeat the component name
- Backward Compatibility: No
- v1.0.0 Support: Until release of version v1.1.0
If you encounter issues: