From 2a3436b0f8ea7070cae0d5f938827556f3232424 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Lapersonne Date: Mon, 21 Oct 2024 11:34:17 +0200 Subject: [PATCH 01/30] Prepare next version Signed-off-by: Pierre-Yves Lapersonne --- CHANGELOG.md | 2 ++ Showcase/Showcase.xcodeproj/project.pbxproj | 8 ++++---- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ef2a0e2ee..612ba6dc1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,8 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [Unreleased](https://github.com/Orange-OpenSource/ouds-ios/compare/0.4.1...develop) + ## [0.4.1](https://github.com/Orange-OpenSource/ouds-ios/compare/0.4.0...0.4.1) - 2024-10-21 ### Fixed diff --git a/Showcase/Showcase.xcodeproj/project.pbxproj b/Showcase/Showcase.xcodeproj/project.pbxproj index 816e5f03b..e0488b966 100644 --- a/Showcase/Showcase.xcodeproj/project.pbxproj +++ b/Showcase/Showcase.xcodeproj/project.pbxproj @@ -976,7 +976,7 @@ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 12; + CURRENT_PROJECT_VERSION = 13; DEVELOPMENT_ASSET_PATHS = "\"Showcase/Preview Content\""; DEVELOPMENT_TEAM = MG2LSJNJB6; ENABLE_PREVIEWS = YES; @@ -992,7 +992,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 0.4.1; + MARKETING_VERSION = 0.5.0; PRODUCT_BUNDLE_IDENTIFIER = "com.orange.ouds.demoapp-debug"; PRODUCT_NAME = "OUDS Showcase"; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; @@ -1014,7 +1014,7 @@ ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 12; + CURRENT_PROJECT_VERSION = 13; DEVELOPMENT_ASSET_PATHS = "\"Showcase/Preview Content\""; DEVELOPMENT_TEAM = ""; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = MG2LSJNJB6; @@ -1031,7 +1031,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 0.4.1; + MARKETING_VERSION = 0.5.0; PRODUCT_BUNDLE_IDENTIFIER = com.orange.ouds.demoapp; PRODUCT_NAME = "OUDS Showcase"; PROVISIONING_PROFILE_SPECIFIER = ""; From 2bc3ea527bc5185cefbcebd17b16169fb8c9d232 Mon Sep 17 00:00:00 2001 From: "Boosted Bot [bot]" <130566815+boosted-bot@users.noreply.github.com> Date: Mon, 21 Oct 2024 14:45:06 +0200 Subject: [PATCH 02/30] =?UTF-8?q?refactor(=F0=9F=A4=96):=20update=20`Opaci?= =?UTF-8?q?tyRawTokens`=20(tokenator=20generation=2020241021134644)=20(#22?= =?UTF-8?q?5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Pierre-Yves Lapersonne Co-authored-by: boosted-bot Co-authored-by: Pierre-Yves Lapersonne --- CHANGELOG.md | 4 ++++ .../Sources/Values/OpacityRawTokens+Values.swift | 9 +-------- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 612ba6dc1..dcb21dd73 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased](https://github.com/Orange-OpenSource/ouds-ios/compare/0.4.1...develop) +### Changed + +- [Library] Update `OpacityRawTokens` (tokenator *20241021134644*) + ## [0.4.1](https://github.com/Orange-OpenSource/ouds-ios/compare/0.4.0...0.4.1) - 2024-10-21 ### Fixed diff --git a/OUDS/Core/Tokens/RawTokens/Sources/Values/OpacityRawTokens+Values.swift b/OUDS/Core/Tokens/RawTokens/Sources/Values/OpacityRawTokens+Values.swift index 2a8f15ee1..20ddb1d34 100644 --- a/OUDS/Core/Tokens/RawTokens/Sources/Values/OpacityRawTokens+Values.swift +++ b/OUDS/Core/Tokens/RawTokens/Sources/Values/OpacityRawTokens+Values.swift @@ -11,16 +11,9 @@ // Software description: A SwiftUI components library with code examples for Orange Unified Design System // -// ଘ( ・ω・)_/゚・:*:・。☆ -// [File to generate with the tokenator] - // swiftlint:disable missing_docs -/// Extracted in a separated file to help the *Figma* JSON to Swift parser to generate files to include easily. extension OpacityRawTokens { - - // MARK: Primitive token - Opacity - public static let opacity0: OpacityRawToken = 0 public static let opacity100: OpacityRawToken = 0.04 public static let opacity200: OpacityRawToken = 0.08 @@ -29,7 +22,7 @@ extension OpacityRawTokens { public static let opacity500: OpacityRawToken = 0.32 public static let opacity600: OpacityRawToken = 0.48 public static let opacity700: OpacityRawToken = 0.64 - public static let opacity800: OpacityRawToken = 0.80 + public static let opacity800: OpacityRawToken = 0.8 public static let opacity900: OpacityRawToken = 1 } From 183f0e6079459ee45ee37f2e0776c1edc799efae Mon Sep 17 00:00:00 2001 From: Pierre-Yves Lapersonne Date: Mon, 21 Oct 2024 15:26:56 +0200 Subject: [PATCH 03/30] refactor: remove typography semantic token `fontWeightCode` (#210) (#226) Signed-off-by: Pierre-Yves Lapersonne --- CHANGELOG.md | 4 ++++ .../OUDSTheme+TypographySemanticTokens.swift | 1 - .../MockThemes/MockTheme+TypographySemanticTokens.swift | 1 - .../TestThemeOverrideOfTypographySemanticTokens.swift | 5 ----- .../Sources/Values/TypographySemanticTokens.swift | 1 - 5 files changed, 4 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index dcb21dd73..d88416498 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - [Library] Update `OpacityRawTokens` (tokenator *20241021134644*) +### Removed + +- [Library] Semantic token `fontWeightCode` ([#210](https://github.com/Orange-OpenSource/ouds-ios/issues/210)) + ## [0.4.1](https://github.com/Orange-OpenSource/ouds-ios/compare/0.4.0...0.4.1) - 2024-10-21 ### Fixed diff --git a/OUDS/Core/OUDS/Sources/OUDSTheme/OUDSTheme+SemanticTokens/OUDSTheme+TypographySemanticTokens.swift b/OUDS/Core/OUDS/Sources/OUDSTheme/OUDSTheme+SemanticTokens/OUDSTheme+TypographySemanticTokens.swift index 2b8196c3d..3c69ea962 100644 --- a/OUDS/Core/OUDS/Sources/OUDSTheme/OUDSTheme+SemanticTokens/OUDSTheme+TypographySemanticTokens.swift +++ b/OUDS/Core/OUDS/Sources/OUDSTheme/OUDSTheme+SemanticTokens/OUDSTheme+TypographySemanticTokens.swift @@ -43,7 +43,6 @@ extension OUDSTheme: TypographySemanticTokens { @objc open var fontWeightBodyStrong: TypographyFontWeightSemanticToken { fontWeightStrong } @objc open var fontWeightLabelDefault: TypographyFontWeightSemanticToken { fontWeightDefault } @objc open var fontWeightLabelStrong: TypographyFontWeightSemanticToken { fontWeightStrong } - @objc open var fontWeightCode: TypographyFontWeightSemanticToken { TypographyRawTokens.fontWeight400 } // MARK: Semantic token - Typography - Font - Size diff --git a/OUDS/Core/OUDS/Tests/OUDSTheme/MockThemes/MockTheme+TypographySemanticTokens.swift b/OUDS/Core/OUDS/Tests/OUDSTheme/MockThemes/MockTheme+TypographySemanticTokens.swift index f8d63573d..886efeab9 100644 --- a/OUDS/Core/OUDS/Tests/OUDSTheme/MockThemes/MockTheme+TypographySemanticTokens.swift +++ b/OUDS/Core/OUDS/Tests/OUDSTheme/MockThemes/MockTheme+TypographySemanticTokens.swift @@ -45,7 +45,6 @@ extension MockTheme { override open var fontWeightBodyStrong: TypographyFontWeightSemanticToken { Self.mockThemeTypographyFontWeightRawToken } override open var fontWeightLabelDefault: TypographyFontWeightSemanticToken { Self.mockThemeTypographyFontWeightRawToken } override open var fontWeightLabelStrong: TypographyFontWeightSemanticToken { Self.mockThemeTypographyFontWeightRawToken } - override open var fontWeightCode: TypographyFontWeightSemanticToken { Self.mockThemeTypographyFontWeightRawToken } // MARK: Semantic token - Typography - Font - Size diff --git a/OUDS/Core/OUDS/Tests/OUDSTheme/TestThemeOverrideOfTypographySemanticTokens.swift b/OUDS/Core/OUDS/Tests/OUDSTheme/TestThemeOverrideOfTypographySemanticTokens.swift index 3f4f445d1..21cb469d5 100644 --- a/OUDS/Core/OUDS/Tests/OUDSTheme/TestThemeOverrideOfTypographySemanticTokens.swift +++ b/OUDS/Core/OUDS/Tests/OUDSTheme/TestThemeOverrideOfTypographySemanticTokens.swift @@ -97,11 +97,6 @@ final class TestThemeOverrideOfTypographySemanticTokens: XCTestCase { XCTAssertTrue(inheritedTheme.fontWeightLabelStrong == MockTheme.mockThemeTypographyFontWeightRawToken) } - func testInheritedThemeCanOverrideSemanticTokenFontWeightCode() throws { - XCTAssertNotEqual(inheritedTheme.fontWeightCode, abstractTheme.fontWeightCode) - XCTAssertTrue(inheritedTheme.fontWeightCode == MockTheme.mockThemeTypographyFontWeightRawToken) - } - // MARK: - Semantic token - Typography - Font - Size func testInheritedThemeCanOverrideSemanticTokenFontSizeDisplayLarge() throws { diff --git a/OUDS/Core/Tokens/SemanticTokens/Sources/Values/TypographySemanticTokens.swift b/OUDS/Core/Tokens/SemanticTokens/Sources/Values/TypographySemanticTokens.swift index 48c942d26..3f91f5c82 100644 --- a/OUDS/Core/Tokens/SemanticTokens/Sources/Values/TypographySemanticTokens.swift +++ b/OUDS/Core/Tokens/SemanticTokens/Sources/Values/TypographySemanticTokens.swift @@ -44,7 +44,6 @@ public protocol TypographySemanticTokens { var fontWeightBodyStrong: TypographyFontWeightSemanticToken { get } var fontWeightLabelDefault: TypographyFontWeightSemanticToken { get } var fontWeightLabelStrong: TypographyFontWeightSemanticToken { get } - var fontWeightCode: TypographyFontWeightSemanticToken { get } // MARK: - Semantic token - Typography - Font - Size From 1650e287e012701b7cc03f7d14e128a064de0a77 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Lapersonne Date: Mon, 21 Oct 2024 15:40:42 +0200 Subject: [PATCH 04/30] feat: add `borderWidthFocusInset`, rename `borderWidthOutsideFocus` (#207) (#227) Signed-off-by: Pierre-Yves Lapersonne --- CHANGELOG.md | 5 +++++ .../OUDSTheme+BorderSemanticTokens.swift | 3 ++- .../MockThemes/MockTheme+BorderSemanticTokens.swift | 3 ++- .../TestThemeOverrideOfBorderSemanticTokens.swift | 11 ++++++++--- .../Sources/Values/BorderSemanticTokens.swift | 3 ++- .../Pages/Tokens/Border/BorderTokenPage.swift | 9 ++++++--- 6 files changed, 25 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d88416498..69766cb7d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,8 +6,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased](https://github.com/Orange-OpenSource/ouds-ios/compare/0.4.1...develop) +### Added + +- [Library] Semantic token `borderWidthFocusInset` ([#207](https://github.com/Orange-OpenSource/ouds-ios/issues/207)) + ### Changed +- [Library] Rename `borderWidthOutsideFocus` to `borderWidthFocus` ([#207](https://github.com/Orange-OpenSource/ouds-ios/issues/207)) - [Library] Update `OpacityRawTokens` (tokenator *20241021134644*) ### Removed diff --git a/OUDS/Core/OUDS/Sources/OUDSTheme/OUDSTheme+SemanticTokens/OUDSTheme+BorderSemanticTokens.swift b/OUDS/Core/OUDS/Sources/OUDSTheme/OUDSTheme+SemanticTokens/OUDSTheme+BorderSemanticTokens.swift index c95e14fa5..076dd56e6 100644 --- a/OUDS/Core/OUDS/Sources/OUDSTheme/OUDSTheme+SemanticTokens/OUDSTheme+BorderSemanticTokens.swift +++ b/OUDS/Core/OUDS/Sources/OUDSTheme/OUDSTheme+SemanticTokens/OUDSTheme+BorderSemanticTokens.swift @@ -32,7 +32,8 @@ extension OUDSTheme: BorderSemanticTokens { @objc open var borderWidthMedium: BorderWidthSemanticToken { BorderRawTokens.borderWidth50 } @objc open var borderWidthThick: BorderWidthSemanticToken { BorderRawTokens.borderWidth75 } @objc open var borderWidthThicker: BorderWidthSemanticToken { BorderRawTokens.borderWidth100 } - @objc open var borderWidthOutsideFocus: BorderWidthSemanticToken { BorderRawTokens.borderWidth50 } + @objc open var borderWidthFocus: BorderWidthSemanticToken { BorderRawTokens.borderWidth50 } + @objc open var borderWidthFocusInset: BorderWidthSemanticToken { BorderRawTokens.borderWidth75 } // MARK: Semantic token - Border - Radius diff --git a/OUDS/Core/OUDS/Tests/OUDSTheme/MockThemes/MockTheme+BorderSemanticTokens.swift b/OUDS/Core/OUDS/Tests/OUDSTheme/MockThemes/MockTheme+BorderSemanticTokens.swift index 28fd46b6c..07a592d6a 100644 --- a/OUDS/Core/OUDS/Tests/OUDSTheme/MockThemes/MockTheme+BorderSemanticTokens.swift +++ b/OUDS/Core/OUDS/Tests/OUDSTheme/MockThemes/MockTheme+BorderSemanticTokens.swift @@ -29,7 +29,8 @@ extension MockTheme { override open var borderWidthMedium: BorderWidthSemanticToken { Self.mockThemeBorderWidthRawToken } override open var borderWidthThick: BorderWidthSemanticToken { Self.mockThemeBorderWidthRawToken } override open var borderWidthThicker: BorderWidthSemanticToken { Self.mockThemeBorderWidthRawToken } - override open var borderWidthOutsideFocus: BorderWidthSemanticToken { Self.mockThemeBorderWidthRawToken } + override open var borderWidthFocus: BorderWidthSemanticToken { Self.mockThemeBorderWidthRawToken } + override open var borderWidthFocusInset: BorderWidthSemanticToken { Self.mockThemeBorderWidthRawToken } // MARK: Semantic token - Border - Radius diff --git a/OUDS/Core/OUDS/Tests/OUDSTheme/TestThemeOverrideOfBorderSemanticTokens.swift b/OUDS/Core/OUDS/Tests/OUDSTheme/TestThemeOverrideOfBorderSemanticTokens.swift index 35c49cc1f..bc73f6e07 100644 --- a/OUDS/Core/OUDS/Tests/OUDSTheme/TestThemeOverrideOfBorderSemanticTokens.swift +++ b/OUDS/Core/OUDS/Tests/OUDSTheme/TestThemeOverrideOfBorderSemanticTokens.swift @@ -63,9 +63,14 @@ final class TestThemeOverrideOfBorderSemanticTokens: XCTestCase { XCTAssertTrue(inheritedTheme.borderWidthThicker == MockTheme.mockThemeBorderWidthRawToken) } - func testInheritedThemeCanOverrideSemanticTokenBorderWidthOutsideFocus() throws { - XCTAssertNotEqual(inheritedTheme.borderWidthOutsideFocus, abstractTheme.borderWidthOutsideFocus) - XCTAssertTrue(inheritedTheme.borderWidthOutsideFocus == MockTheme.mockThemeBorderWidthRawToken) + func testInheritedThemeCanOverrideSemanticTokenBorderWidthFocus() throws { + XCTAssertNotEqual(inheritedTheme.borderWidthFocus, abstractTheme.borderWidthFocus) + XCTAssertTrue(inheritedTheme.borderWidthFocus == MockTheme.mockThemeBorderWidthRawToken) + } + + func testInheritedThemeCanOverrideSemanticTokenBorderWidthFocusInset() throws { + XCTAssertNotEqual(inheritedTheme.borderWidthFocusInset, abstractTheme.borderWidthFocusInset) + XCTAssertTrue(inheritedTheme.borderWidthFocusInset == MockTheme.mockThemeBorderWidthRawToken) } // MARK: - Semantic token - Border - Radius diff --git a/OUDS/Core/Tokens/SemanticTokens/Sources/Values/BorderSemanticTokens.swift b/OUDS/Core/Tokens/SemanticTokens/Sources/Values/BorderSemanticTokens.swift index 6bb941eb8..502ff61e1 100644 --- a/OUDS/Core/Tokens/SemanticTokens/Sources/Values/BorderSemanticTokens.swift +++ b/OUDS/Core/Tokens/SemanticTokens/Sources/Values/BorderSemanticTokens.swift @@ -30,7 +30,8 @@ public protocol BorderSemanticTokens { var borderWidthMedium: BorderWidthSemanticToken { get } var borderWidthThick: BorderWidthSemanticToken { get } var borderWidthThicker: BorderWidthSemanticToken { get } - var borderWidthOutsideFocus: BorderWidthSemanticToken { get } + var borderWidthFocus: BorderWidthSemanticToken { get } + var borderWidthFocusInset: BorderWidthSemanticToken { get } // MARK: - Semantic token - Border - Radius diff --git a/Showcase/Showcase/Pages/Tokens/Border/BorderTokenPage.swift b/Showcase/Showcase/Pages/Tokens/Border/BorderTokenPage.swift index 1441b7cb1..1207b7a47 100644 --- a/Showcase/Showcase/Pages/Tokens/Border/BorderTokenPage.swift +++ b/Showcase/Showcase/Pages/Tokens/Border/BorderTokenPage.swift @@ -146,7 +146,8 @@ private enum NamedBorderWidth: String, CaseIterable { case borderWidthMedium case borderWidthThick case borderWidthThicker - case borderWidthOutsideFocus + case borderWidthFocus + case borderWidthFocusInset func token(from theme: OUDSTheme) -> BorderWidthSemanticToken { switch self { @@ -162,8 +163,10 @@ private enum NamedBorderWidth: String, CaseIterable { return theme.borderWidthThick case .borderWidthThicker: return theme.borderWidthThicker - case .borderWidthOutsideFocus: - return theme.borderWidthOutsideFocus + case .borderWidthFocus: + return theme.borderWidthFocus + case .borderWidthFocusInset: + return theme.borderWidthFocusInset } } } From 840586cb8ccae6d197b3f006d8017d2272fe1a7d Mon Sep 17 00:00:00 2001 From: Pierre-Yves Lapersonne Date: Mon, 21 Oct 2024 15:51:22 +0200 Subject: [PATCH 05/30] refactor: remove `elevation*Focus*` semantic tokens (#209) (#228) Following tokens have been removed: `elevationBlurFocus`, `elevationXFocus`, `elevationYFocus`, `elevationColorFocus` and `elevationFocus` Signed-off-by: Pierre-Yves Lapersonne --- CHANGELOG.md | 1 + .../OUDSTheme+ElevationSemanticTokens.swift | 9 ----- .../MockTheme+ElevationSemanticTokens.swift | 9 ----- ...emeOverrideOfElevationSemanticTokens.swift | 25 -------------- ...InverseTheme+ElevationSemanticTokens.swift | 34 ------------------- .../Tests/TestInverseThemeElevation.swift | 5 --- .../Values/ElevationSemanticTokens.swift | 5 --- .../Tokens/Elevation/ElevationTokenPage.swift | 3 -- 8 files changed, 1 insertion(+), 90 deletions(-) delete mode 100644 OUDS/Core/Themes/Inverse/Sources/InverseTheme+ElevationSemanticTokens.swift diff --git a/CHANGELOG.md b/CHANGELOG.md index 69766cb7d..b1ffff002 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Removed +- [Library] Semantic tokens `elevationBlurFocus`, `elevationXFocus`, `elevationYFocus`, `elevationColorFocus` ([#209](https://github.com/Orange-OpenSource/ouds-ios/issues/209)) - [Library] Semantic token `fontWeightCode` ([#210](https://github.com/Orange-OpenSource/ouds-ios/issues/210)) ## [0.4.1](https://github.com/Orange-OpenSource/ouds-ios/compare/0.4.0...0.4.1) - 2024-10-21 diff --git a/OUDS/Core/OUDS/Sources/OUDSTheme/OUDSTheme+SemanticTokens/OUDSTheme+ElevationSemanticTokens.swift b/OUDS/Core/OUDS/Sources/OUDSTheme/OUDSTheme+SemanticTokens/OUDSTheme+ElevationSemanticTokens.swift index 4bd1a2440..a3be621bd 100644 --- a/OUDS/Core/OUDS/Sources/OUDSTheme/OUDSTheme+SemanticTokens/OUDSTheme+ElevationSemanticTokens.swift +++ b/OUDS/Core/OUDS/Sources/OUDSTheme/OUDSTheme+SemanticTokens/OUDSTheme+ElevationSemanticTokens.swift @@ -18,8 +18,6 @@ import OUDSTokensSemantic // ଘ( ・ω・)_/゚・:*:・。☆ // [File to generate with the tokenator] -// swiftlint:disable line_length - /// Defines basic values common to all themes for `ElevationSemanticTokenss`. /// These values can be overriden inside `OUDSTheme` subclasses (in extensions or not, in the same module or not) thanks to the `@objc open` combination. /// The aim of this extensions is to make relationships between all semantic tokens for elevations and associated raw tokens. @@ -36,7 +34,6 @@ extension OUDSTheme: ElevationSemanticTokens { @objc open var elevationXStickyDefault: ElevationXSemanticToken { ElevationRawTokens.elevationX0 } @objc open var elevationXStickyEmphasized: ElevationXSemanticToken { ElevationRawTokens.elevationX0 } @objc open var elevationXStickyNavigationScrolled: ElevationXSemanticToken { ElevationRawTokens.elevationX0 } - @objc open var elevationXFocus: ElevationXSemanticToken { ElevationRawTokens.elevationX0 } // MARK: Semantic token - Elevation - Y @@ -48,7 +45,6 @@ extension OUDSTheme: ElevationSemanticTokens { @objc open var elevationYStickyDefault: ElevationYSemanticToken { ElevationRawTokens.elevationY300 } @objc open var elevationYStickyEmphasized: ElevationYSemanticToken { ElevationRawTokens.elevationY300 } @objc open var elevationYStickyNavigationScrolled: ElevationYSemanticToken { ElevationRawTokens.elevationY300 } - @objc open var elevationYFocus: ElevationYSemanticToken { ElevationRawTokens.elevationY0 } // MARK: Semantic token - Elevation - Blur @@ -60,7 +56,6 @@ extension OUDSTheme: ElevationSemanticTokens { @objc open var elevationBlurStickyDefault: ElevationBlurSemanticToken { ElevationRawTokens.elevationBlur400 } @objc open var elevationBlurStickyEmphasized: ElevationBlurSemanticToken { ElevationRawTokens.elevationBlur400 } @objc open var elevationBlurStickyNavigationScrolled: ElevationBlurSemanticToken { ElevationRawTokens.elevationBlur400 } - @objc open var elevationBlurFocus: ElevationBlurSemanticToken { ElevationRawTokens.elevationBlur0 } // MARK: Semantic token - Elevation - Color @@ -72,7 +67,6 @@ extension OUDSTheme: ElevationSemanticTokens { @objc open var elevationColorStickyDefault: ElevationColorSemanticToken { ElevationColorSemanticToken(ColorRawTokens.colorTransparentBlack300) } @objc open var elevationColorStickyEmphasized: ElevationColorSemanticToken { ElevationColorSemanticToken(ColorRawTokens.colorTransparentBlack300) } @objc open var elevationColorStickyNavigationScrolled: ElevationColorSemanticToken { ElevationColorSemanticToken(ColorRawTokens.colorTransparentBlack300) } - @objc open var elevationColorFocus: ElevationColorSemanticToken { ElevationColorSemanticToken(light: ColorRawTokens.colorFunctionalBlack, dark: ColorRawTokens.colorFunctionalLightGray160) } // MARK: Semantic token - Elevation - Box shadow @@ -84,7 +78,4 @@ extension OUDSTheme: ElevationSemanticTokens { @objc open var elevationStickyDefault: ElevationCompositeSemanticToken { ElevationCompositeSemanticToken(ElevationRawTokens.elevationBottom_3_300) } @objc open var elevationStickyEmphasized: ElevationCompositeSemanticToken { ElevationCompositeSemanticToken(ElevationRawTokens.elevationBottom_3_300) } @objc open var elevationStickyNavigationScrolled: ElevationCompositeSemanticToken { ElevationCompositeSemanticToken(ElevationRawTokens.elevationBottom_3_300) } - @objc open var elevationFocus: ElevationCompositeSemanticToken { ElevationCompositeSemanticToken(light: ElevationCompositeRawToken(x: 0, y: 0, blur: 0, color: ColorRawTokens.colorFunctionalBlack), dark: ElevationCompositeRawToken(x: 0, y: 0, blur: 0, color: ColorRawTokens.colorFunctionalLightGray160)) } } - -// swiftlint:enable line_length diff --git a/OUDS/Core/OUDS/Tests/OUDSTheme/MockThemes/MockTheme+ElevationSemanticTokens.swift b/OUDS/Core/OUDS/Tests/OUDSTheme/MockThemes/MockTheme+ElevationSemanticTokens.swift index c20e66a3f..1a5e62d7f 100644 --- a/OUDS/Core/OUDS/Tests/OUDSTheme/MockThemes/MockTheme+ElevationSemanticTokens.swift +++ b/OUDS/Core/OUDS/Tests/OUDSTheme/MockThemes/MockTheme+ElevationSemanticTokens.swift @@ -37,7 +37,6 @@ extension MockTheme { override open var elevationXStickyDefault: ElevationYSemanticToken { Self.mockThemeElevationXRawToken } override open var elevationXStickyEmphasized: ElevationYSemanticToken { Self.mockThemeElevationXRawToken } override open var elevationXStickyNavigationScrolled: ElevationYSemanticToken { Self.mockThemeElevationXRawToken } - override open var elevationXFocus: ElevationYSemanticToken { Self.mockThemeElevationXRawToken } // MARK: Semantic token - Elevation - Y @@ -49,7 +48,6 @@ extension MockTheme { override open var elevationYStickyDefault: ElevationYSemanticToken { Self.mockThemeElevationYRawToken } override open var elevationYStickyEmphasized: ElevationYSemanticToken { Self.mockThemeElevationYRawToken } override open var elevationYStickyNavigationScrolled: ElevationYSemanticToken { Self.mockThemeElevationYRawToken } - override open var elevationYFocus: ElevationYSemanticToken { Self.mockThemeElevationYRawToken } // MARK: Semantic token - Elevation - Blur @@ -61,7 +59,6 @@ extension MockTheme { override open var elevationBlurStickyDefault: ElevationBlurSemanticToken { Self.mockThemeElevationBlurRawToken } override open var elevationBlurStickyEmphasized: ElevationBlurSemanticToken { Self.mockThemeElevationBlurRawToken } override open var elevationBlurStickyNavigationScrolled: ElevationBlurSemanticToken { Self.mockThemeElevationBlurRawToken } - override open var elevationBlurFocus: ElevationBlurSemanticToken { Self.mockThemeElevationBlurRawToken } // MARK: Semantic token - Elevation - Color - None @@ -95,10 +92,6 @@ extension MockTheme { override open var elevationColorStickyNavigationScrolled: ElevationColorSemanticToken { Self.mockThemeElevationMultipleColorSemanticToken } - // MARK: Semantic token - Elevation - Color - Focus - - override open var elevationColorFocus: ElevationColorSemanticToken { Self.mockThemeElevationMultipleColorSemanticToken } - // MARK: Semantic token - Elevation - Box shadow override open var elevationRaised: ElevationCompositeSemanticToken { Self.mockThemeElevationCompositeSemanticToken } @@ -114,7 +107,5 @@ extension MockTheme { override open var elevationStickyEmphasized: ElevationCompositeSemanticToken { Self.mockThemeElevationCompositeSemanticToken } override open var elevationStickyNavigationScrolled: ElevationCompositeSemanticToken { Self.mockThemeElevationCompositeSemanticToken } - - override open var elevationFocus: ElevationCompositeSemanticToken { Self.mockThemeElevationCompositeSemanticToken } } // swiftlint:enable identifier_name diff --git a/OUDS/Core/OUDS/Tests/OUDSTheme/TestThemeOverrideOfElevationSemanticTokens.swift b/OUDS/Core/OUDS/Tests/OUDSTheme/TestThemeOverrideOfElevationSemanticTokens.swift index f14a67b4c..5a2c26496 100644 --- a/OUDS/Core/OUDS/Tests/OUDSTheme/TestThemeOverrideOfElevationSemanticTokens.swift +++ b/OUDS/Core/OUDS/Tests/OUDSTheme/TestThemeOverrideOfElevationSemanticTokens.swift @@ -74,11 +74,6 @@ final class TestThemeOverrideOfElevationSemanticTokens: XCTestCase { XCTAssertTrue(inheritedTheme.elevationXStickyNavigationScrolled == MockTheme.mockThemeElevationXRawToken) } - func testInheritedThemeCanOverrideSemanticTokenElevationXFocus() throws { - XCTAssertNotEqual(inheritedTheme.elevationXFocus, abstractTheme.elevationXFocus) - XCTAssertTrue(inheritedTheme.elevationXFocus == MockTheme.mockThemeElevationXRawToken) - } - // MARK: - Semantic token - Elevation - Y func testInheritedThemeCanOverrideSemanticTokenElevationYNone() throws { @@ -121,11 +116,6 @@ final class TestThemeOverrideOfElevationSemanticTokens: XCTestCase { XCTAssertTrue(inheritedTheme.elevationYStickyNavigationScrolled == MockTheme.mockThemeElevationYRawToken) } - func testInheritedThemeCanOverrideSemanticTokenElevationYFocus() throws { - XCTAssertNotEqual(inheritedTheme.elevationYFocus, abstractTheme.elevationYFocus) - XCTAssertTrue(inheritedTheme.elevationYFocus == MockTheme.mockThemeElevationYRawToken) - } - // MARK: - Semantic token - Elevation - Blur func testInheritedThemeCanOverrideSemanticTokenElevationBlurNone() throws { @@ -168,11 +158,6 @@ final class TestThemeOverrideOfElevationSemanticTokens: XCTestCase { XCTAssertTrue(inheritedTheme.elevationBlurStickyNavigationScrolled == MockTheme.mockThemeElevationBlurRawToken) } - func testInheritedThemeCanOverrideSemanticTokenElevationBlurFocus() throws { - XCTAssertNotEqual(inheritedTheme.elevationBlurFocus, abstractTheme.elevationBlurFocus) - XCTAssertTrue(inheritedTheme.elevationBlurFocus == MockTheme.mockThemeElevationBlurRawToken) - } - // MARK: - Semantic token - Elevation - Color - None func testInheritedThemeCanOverrideSemanticTokenElevationColorNone() throws { @@ -215,11 +200,6 @@ final class TestThemeOverrideOfElevationSemanticTokens: XCTestCase { XCTAssertTrue(inheritedTheme.elevationColorStickyNavigationScrolled == MockTheme.mockThemeElevationMultipleColorSemanticToken) } - func testInheritedThemeCanOverrideSemanticTokenElevationColorFocus() throws { - XCTAssertNotEqual(inheritedTheme.elevationColorFocus, abstractTheme.elevationColorFocus) - XCTAssertTrue(inheritedTheme.elevationColorFocus == MockTheme.mockThemeElevationMultipleColorSemanticToken) - } - func testInheritedThemeCanOverrideSemanticTokenElevationCompositeRaised() throws { XCTAssertNotEqual(inheritedTheme.elevationRaised, abstractTheme.elevationRaised) XCTAssertTrue(inheritedTheme.elevationRaised == MockTheme.mockThemeElevationCompositeSemanticToken) @@ -254,11 +234,6 @@ final class TestThemeOverrideOfElevationSemanticTokens: XCTestCase { XCTAssertNotEqual(inheritedTheme.elevationStickyNavigationScrolled, abstractTheme.elevationStickyNavigationScrolled) XCTAssertTrue(inheritedTheme.elevationStickyNavigationScrolled == MockTheme.mockThemeElevationCompositeSemanticToken) } - - func testInheritedThemeCanOverrideSemanticTokenElevationCompositeFocus() throws { - XCTAssertNotEqual(inheritedTheme.elevationFocus, abstractTheme.elevationFocus) - XCTAssertTrue(inheritedTheme.elevationFocus == MockTheme.mockThemeElevationCompositeSemanticToken) - } } // swiftlint:enable required_deinit diff --git a/OUDS/Core/Themes/Inverse/Sources/InverseTheme+ElevationSemanticTokens.swift b/OUDS/Core/Themes/Inverse/Sources/InverseTheme+ElevationSemanticTokens.swift deleted file mode 100644 index 889f1ac8b..000000000 --- a/OUDS/Core/Themes/Inverse/Sources/InverseTheme+ElevationSemanticTokens.swift +++ /dev/null @@ -1,34 +0,0 @@ -// -// Software Name: OUDS iOS -// SPDX-FileCopyrightText: Copyright (c) Orange SA -// SPDX-License-Identifier: MIT -// -// This software is distributed under the MIT license, -// the text of which is available at https://opensource.org/license/MIT/ -// or see the "LICENSE" file for more details. -// -// Authors: See CONTRIBUTORS.txt -// Software description: A SwiftUI components library with code examples for Orange Unified Design System -// - -import Foundation -import OUDSTokensRaw -import OUDSTokensSemantic - -// ଘ( ・ω・)_/゚・:*:・。☆ -// [File to generate with the tokenator] - -// swiftlint:disable line_length - -extension InverseTheme { - - // MARK: Semantic token - Elevation - Color - - override public var elevationColorFocus: ElevationColorSemanticToken { MultipleColorTokens( ColorRawTokens.colorFunctionalLightGray160) } - - // MARK: Semantic token - Elevation - Box shadow - - override public var elevationFocus: ElevationCompositeSemanticToken { ElevationCompositeSemanticToken(light: ElevationCompositeRawToken(x: 0, y: 0, blur: 0, color: ColorRawTokens.colorFunctionalLightGray160), dark: ElevationCompositeRawToken(x: 0, y: 0, blur: 0, color: ColorRawTokens.colorFunctionalLightGray160)) } -} - -// swiftlint:enable line_length diff --git a/OUDS/Core/Themes/Inverse/Tests/TestInverseThemeElevation.swift b/OUDS/Core/Themes/Inverse/Tests/TestInverseThemeElevation.swift index 6262cb9af..42af10f72 100644 --- a/OUDS/Core/Themes/Inverse/Tests/TestInverseThemeElevation.swift +++ b/OUDS/Core/Themes/Inverse/Tests/TestInverseThemeElevation.swift @@ -37,11 +37,6 @@ final class TestInverseThemeElevationColors: XCTestCase { XCTAssertEqual(inverseTheme.elevationColorStickyDefault.light, inverseTheme.elevationColorStickyDefault.dark) XCTAssertEqual(inverseTheme.elevationColorStickyEmphasized.light, inverseTheme.elevationColorStickyEmphasized.dark) XCTAssertEqual(inverseTheme.elevationColorStickyNavigationScrolled.light, inverseTheme.elevationColorStickyNavigationScrolled.dark) - XCTAssertEqual(inverseTheme.elevationColorFocus.light, inverseTheme.elevationColorFocus.dark) - } - - func testElevationEquality() throws { - XCTAssertEqual(inverseTheme.elevationFocus.light, inverseTheme.elevationFocus.dark) } } diff --git a/OUDS/Core/Tokens/SemanticTokens/Sources/Values/ElevationSemanticTokens.swift b/OUDS/Core/Tokens/SemanticTokens/Sources/Values/ElevationSemanticTokens.swift index 02c6fecff..3a7da714a 100644 --- a/OUDS/Core/Tokens/SemanticTokens/Sources/Values/ElevationSemanticTokens.swift +++ b/OUDS/Core/Tokens/SemanticTokens/Sources/Values/ElevationSemanticTokens.swift @@ -33,7 +33,6 @@ public protocol ElevationSemanticTokens { var elevationXStickyDefault: ElevationXSemanticToken { get } var elevationXStickyEmphasized: ElevationXSemanticToken { get } var elevationXStickyNavigationScrolled: ElevationXSemanticToken { get } - var elevationXFocus: ElevationXSemanticToken { get } // MARK: Semantic token - Elevation - Y @@ -45,7 +44,6 @@ public protocol ElevationSemanticTokens { var elevationYStickyDefault: ElevationYSemanticToken { get } var elevationYStickyEmphasized: ElevationYSemanticToken { get } var elevationYStickyNavigationScrolled: ElevationYSemanticToken { get } - var elevationYFocus: ElevationYSemanticToken { get } // MARK: Semantic token - Elevation - Blur @@ -57,7 +55,6 @@ public protocol ElevationSemanticTokens { var elevationBlurStickyDefault: ElevationBlurSemanticToken { get } var elevationBlurStickyEmphasized: ElevationBlurSemanticToken { get } var elevationBlurStickyNavigationScrolled: ElevationBlurSemanticToken { get } - var elevationBlurFocus: ElevationBlurSemanticToken { get } // MARK: Semantic token - Elevation - Color @@ -69,7 +66,6 @@ public protocol ElevationSemanticTokens { var elevationColorStickyDefault: ElevationColorSemanticToken { get } var elevationColorStickyEmphasized: ElevationColorSemanticToken { get } var elevationColorStickyNavigationScrolled: ElevationColorSemanticToken { get } - var elevationColorFocus: ElevationColorSemanticToken { get } // MARK: Semantic token - Elevation - Box shadow @@ -81,7 +77,6 @@ public protocol ElevationSemanticTokens { var elevationStickyDefault: ElevationCompositeSemanticToken { get } var elevationStickyEmphasized: ElevationCompositeSemanticToken { get } var elevationStickyNavigationScrolled: ElevationCompositeSemanticToken { get } - var elevationFocus: ElevationCompositeSemanticToken { get } } // swiftlint:enable missing_docs diff --git a/Showcase/Showcase/Pages/Tokens/Elevation/ElevationTokenPage.swift b/Showcase/Showcase/Pages/Tokens/Elevation/ElevationTokenPage.swift index f2f99f942..72d0ad395 100644 --- a/Showcase/Showcase/Pages/Tokens/Elevation/ElevationTokenPage.swift +++ b/Showcase/Showcase/Pages/Tokens/Elevation/ElevationTokenPage.swift @@ -56,7 +56,6 @@ struct ElevationTokenPage: View { private enum NamedElevation: String, CaseIterable { case elevationNone - case elevationFocus case elevationRaised case elevationStickyNavigationScrolled case elevationOverlayDefault @@ -69,8 +68,6 @@ private enum NamedElevation: String, CaseIterable { switch self { case .elevationNone: return theme.elevationNone - case .elevationFocus: - return theme.elevationFocus case .elevationRaised: return theme.elevationRaised case .elevationStickyNavigationScrolled: From 9976083095779932accb239a6d6522e6fa1d6ee4 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Lapersonne Date: Tue, 22 Oct 2024 09:36:20 +0200 Subject: [PATCH 06/30] ci: upgrade to Swift 6 and Xcode 16 (#201) (#230) Signed-off-by: Pierre-Yves Lapersonne --- .github/CONTRIBUTING.md | 6 +++--- .github/DEVELOP.md | 7 ++++--- CHANGELOG.md | 8 +++++++- .../OUDS/Sources/OUDSTheme/OUDSTheme.swift | 5 ++++- .../OUDSTheme/MockThemes/OtherMockTheme.swift | 2 +- .../Themes/Inverse/Sources/InverseTheme.swift | 2 +- .../Themes/Orange/Sources/OrangeTheme.swift | 2 +- .../ElevationCompositeRawToken.swift | 2 +- .../TypographyCompositeRawToken.swift | 2 +- .../Multiples/MultipleColorTokens.swift | 2 +- .../Multiples/MultipleElevationTokens.swift | 2 +- .../MultipleFontLetterSpacingTokens.swift | 2 +- .../MultipleFontLineHeightTokens.swift | 2 +- .../Multiples/MultipleFontSizeTokens.swift | 2 +- .../Multiples/MultipleSizingTokens.swift | 2 +- .../Multiples/MultipleSpacingTokens.swift | 2 +- .../Multiples/MultipleTypographyTokens.swift | 2 +- .../Sources/Extensions/Font+extensions.swift | 3 +-- Package.swift | 4 ++-- README.md | 4 +++- Showcase/Showcase.xcodeproj/project.pbxproj | 8 ++++---- .../Pages/ThemeSelection/ThemeSelection.swift | 19 ++++++++++++------- .../Pages/Utils/ShowcaseElement.swift | 1 + Showcase/fastlane/Fastfile | 2 +- 24 files changed, 55 insertions(+), 38 deletions(-) diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 6083d96ed..8558d67a2 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -21,7 +21,7 @@ The [issue tracker](https://github.com/Orange-OpenSource/ouds-ios/issues) is the Our bug tracker utilizes several labels to help organize and identify issues. Here's what they represent and how we use them: -- `feature` - Issues asking for a new feature to be added, or an existing one to be extended or modified. New features require a minor version bump (e.g., `v1.0.0` to `v1.1.0`). +- `feature` - Issues asking for a new feature to be added, or an existing one to be extended or modified. New features require a minor version bump (e.g., `v1.0.0` to `v1.1.0`) or a major version bump if public API broken (e.g., `v1.0.0` to `v2.0.0`) - `help wanted` - Issues we need or would love help from the community to resolve. For a complete look at our labels, see the [project labels page](https://github.com/Orange-OpenSource/ouds-ios/labels). @@ -75,11 +75,11 @@ Adhering to the following process is the best way to get your work included in t 1. [Fork](https://help.github.com/articles/fork-a-repo/) the project, clone your fork, and configure the remotes: ```bash - # Clone your fork of the repo into the current directory + # Clone your fork of the repo into the current directory (use either SSH or HTTPS) git clone https://github.com//ouds-ios.git # Navigate to the newly cloned directory cd ouds-ios - # Assign the original repo to a remote called "upstream" (you can use of course SSH instead of HTTPS) + # Assign the original repo to a remote called "upstream" (use either SSH or HTTPS) git remote add upstream https://github.com/Orange-OpenSource/ouds-ios.git ``` diff --git a/.github/DEVELOP.md b/.github/DEVELOP.md index 21c0305b4..45cfe8718 100644 --- a/.github/DEVELOP.md +++ b/.github/DEVELOP.md @@ -60,8 +60,9 @@ rbenv global 3.1.2 ruby --version ``` -We use also for our GitLab CI runners **Xcode 15.3**, we suggest you use this version or newer if you want but beware. -**Xcode 16** use will come. +We use also for our GitLab CI runners **Xcode 16**, we suggest you use this version or newer if you want. + +**Xcode 16** and **Swift 6** are used for this project. You must use this configuration. ## Build showcase demo app @@ -277,4 +278,4 @@ Our currant plan does not allow to make GitHub mirroring, so we use GitHub HTTP If you want to set up your runners, feel free to have a look on */docs_release/README.md* However of course you will have to define all the variables, secrets and have the mandatory files listed above. -You can find more details about the pipelines and script [in the wiki](https://github.com/Orange-OpenSource/ouds-ios/wiki/5-%E2%80%90-About-continuous-integration-and-delivery). \ No newline at end of file +You can find more details about the pipelines and script [in the wiki](https://github.com/Orange-OpenSource/ouds-ios/wiki/5-%E2%80%90-About-continuous-integration-and-delivery). diff --git a/CHANGELOG.md b/CHANGELOG.md index b1ffff002..868b21bb8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed +- [Library/DemoApp] Migration to Swift 6 +- [Library/DemoApp] Migration from *Xcode 15.3* to to *Xcode 16* ([#201](https://github.com/Orange-OpenSource/ouds-ios/issues/201)) - [Library] Rename `borderWidthOutsideFocus` to `borderWidthFocus` ([#207](https://github.com/Orange-OpenSource/ouds-ios/issues/207)) - [Library] Update `OpacityRawTokens` (tokenator *20241021134644*) @@ -20,11 +22,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - [Library] Semantic tokens `elevationBlurFocus`, `elevationXFocus`, `elevationYFocus`, `elevationColorFocus` ([#209](https://github.com/Orange-OpenSource/ouds-ios/issues/209)) - [Library] Semantic token `fontWeightCode` ([#210](https://github.com/Orange-OpenSource/ouds-ios/issues/210)) +### Fixed + +- [DemoApp] Hide from Voice Over decorative image in theme selector (a11y) + ## [0.4.1](https://github.com/Orange-OpenSource/ouds-ios/compare/0.4.0...0.4.1) - 2024-10-21 ### Fixed -- [Demoapp] App crash on color token page opening ([#215](https://github.com/Orange-OpenSource/ouds-ios/issues/215)) +- [DemoApp] App crash on color token page opening ([#215](https://github.com/Orange-OpenSource/ouds-ios/issues/215)) ## [0.4.0](https://github.com/Orange-OpenSource/ouds-ios/compare/0.3.0...0.4.0) - 2024-10-18 diff --git a/OUDS/Core/OUDS/Sources/OUDSTheme/OUDSTheme.swift b/OUDS/Core/OUDS/Sources/OUDSTheme/OUDSTheme.swift index e6d36631a..e9a8e294f 100644 --- a/OUDS/Core/OUDS/Sources/OUDSTheme/OUDSTheme.swift +++ b/OUDS/Core/OUDS/Sources/OUDSTheme/OUDSTheme.swift @@ -21,8 +21,11 @@ import OUDSTokensSemantic /// We allow this theme to be derivated and be overriden. /// /// `OUDSTheme` can be seen as a kind of "abstract class" in _object oriented paradigm_. +/// +/// Because `OUDSTheme` is not a *final* class, its type cannot be seen as `Sendable`, that is the reason why this conformity is unchecked. +/// /// **Warning: You are not supposed to use this abstract default theme directly. Please prefer `OrangeTheme` instead** -open class OUDSTheme { +open class OUDSTheme: @unchecked Sendable { /// A theme can have a custom font which is not the system font public let customFontFamily: TypographyFontFamilySemanticToken? diff --git a/OUDS/Core/OUDS/Tests/OUDSTheme/MockThemes/OtherMockTheme.swift b/OUDS/Core/OUDS/Tests/OUDSTheme/MockThemes/OtherMockTheme.swift index 3dc62e1f1..9cc238c6e 100644 --- a/OUDS/Core/OUDS/Tests/OUDSTheme/MockThemes/OtherMockTheme.swift +++ b/OUDS/Core/OUDS/Tests/OUDSTheme/MockThemes/OtherMockTheme.swift @@ -20,7 +20,7 @@ import OUDSTokensSemantic /// Some color semantic tokens may be not implemented, making fatalError() be triggered at `OUDSTheme` level and tests crash. /// Thus we use another mock theme to make comparisons with `MockTheme` and ensure pverriding property of tokens is still working. /// This case of not implemented token only happns with color tokens. (╯° °)╯︵ ┻━┻ -final class OtherMockTheme: MockTheme { +final class OtherMockTheme: MockTheme, @unchecked Sendable { static let otherMockThemeMultipleColorTokens: ColorSemanticToken = MultipleColorTokens("#FF0000") diff --git a/OUDS/Core/Themes/Inverse/Sources/InverseTheme.swift b/OUDS/Core/Themes/Inverse/Sources/InverseTheme.swift index 9d29962ef..5e764fe3d 100644 --- a/OUDS/Core/Themes/Inverse/Sources/InverseTheme.swift +++ b/OUDS/Core/Themes/Inverse/Sources/InverseTheme.swift @@ -15,7 +15,7 @@ import OUDSThemesOrange /// This is an override of the default basic `OrangeTheme` with some inverted colors. /// It can overrides any properties from its superclass, and can be derived too. -open class InverseTheme: OrangeTheme { +open class InverseTheme: OrangeTheme, @unchecked Sendable { deinit { } diff --git a/OUDS/Core/Themes/Orange/Sources/OrangeTheme.swift b/OUDS/Core/Themes/Orange/Sources/OrangeTheme.swift index 371c1a3dc..293368bec 100644 --- a/OUDS/Core/Themes/Orange/Sources/OrangeTheme.swift +++ b/OUDS/Core/Themes/Orange/Sources/OrangeTheme.swift @@ -15,7 +15,7 @@ import OUDS /// This is an override of the default basic `OUDSTheme` and should be seen as the default theme for the OUDS library. /// It can overrides any properties from its superclass, and can be derived too. -open class OrangeTheme: OUDSTheme { +open class OrangeTheme: OUDSTheme, @unchecked Sendable { deinit { } diff --git a/OUDS/Core/Tokens/RawTokens/Sources/Composites/ElevationCompositeRawToken.swift b/OUDS/Core/Tokens/RawTokens/Sources/Composites/ElevationCompositeRawToken.swift index a7016fe5b..bf2ec32c1 100644 --- a/OUDS/Core/Tokens/RawTokens/Sources/Composites/ElevationCompositeRawToken.swift +++ b/OUDS/Core/Tokens/RawTokens/Sources/Composites/ElevationCompositeRawToken.swift @@ -15,7 +15,7 @@ import Foundation /// In the global design system, composite tokens are defined for elevation effects. /// It is defined as a `final class` and `NSObject` so as to be shared through `@objc` with extensions and protocols within modules. -public final class ElevationCompositeRawToken: NSObject { // For @objc compatibility +public final class ElevationCompositeRawToken: NSObject, Sendable { // NSObject for @objc compatibility /// The X offset for the elevation public let x: ElevationRawToken diff --git a/OUDS/Core/Tokens/RawTokens/Sources/Composites/TypographyCompositeRawToken.swift b/OUDS/Core/Tokens/RawTokens/Sources/Composites/TypographyCompositeRawToken.swift index 4418d77e8..228db285a 100644 --- a/OUDS/Core/Tokens/RawTokens/Sources/Composites/TypographyCompositeRawToken.swift +++ b/OUDS/Core/Tokens/RawTokens/Sources/Composites/TypographyCompositeRawToken.swift @@ -18,7 +18,7 @@ infix operator <| /// Composite raw tokens are here to pack a set of specific values according to the global design system tool. /// Here a *typography* is finaly defined by some specific values. -public struct TypographyCompositeRawToken: Equatable { +public struct TypographyCompositeRawToken: Equatable, Sendable { // Font family is not included here because this is the only thing which can vary diff --git a/OUDS/Core/Tokens/SemanticTokens/Sources/Multiples/MultipleColorTokens.swift b/OUDS/Core/Tokens/SemanticTokens/Sources/Multiples/MultipleColorTokens.swift index 7c75d8327..80f42a9ce 100644 --- a/OUDS/Core/Tokens/SemanticTokens/Sources/Multiples/MultipleColorTokens.swift +++ b/OUDS/Core/Tokens/SemanticTokens/Sources/Multiples/MultipleColorTokens.swift @@ -18,7 +18,7 @@ import SwiftUI /// Kind of semantic tokens which will wrap a combination of `ColorRawToken` depending to color scheme. /// Kind of composite token with multiple values, but not named "composite" because this word is already used in the design system. /// Allows to gather the multiple-value tokens from Figma inside one object. -public final class MultipleColorTokens: NSObject { +public final class MultipleColorTokens: NSObject, Sendable { /// For **light** mode scheme public let light: ColorRawToken diff --git a/OUDS/Core/Tokens/SemanticTokens/Sources/Multiples/MultipleElevationTokens.swift b/OUDS/Core/Tokens/SemanticTokens/Sources/Multiples/MultipleElevationTokens.swift index fb2b15bad..62785a24e 100644 --- a/OUDS/Core/Tokens/SemanticTokens/Sources/Multiples/MultipleElevationTokens.swift +++ b/OUDS/Core/Tokens/SemanticTokens/Sources/Multiples/MultipleElevationTokens.swift @@ -18,7 +18,7 @@ import SwiftUI /// Semantic tokens which will wrap a combination of `ElevationCompositeRawToken` depending to color scheme. /// Kind of composite token with multiple values, but not named "composite" because this word is already used in the design system. /// Allows to gather the multiple-value tokens from Figma inside one object. -public final class MultipleElevationTokens: NSObject { +public final class MultipleElevationTokens: NSObject, Sendable { /// For **light** mode scheme public let light: ElevationCompositeRawToken diff --git a/OUDS/Core/Tokens/SemanticTokens/Sources/Multiples/MultipleFontLetterSpacingTokens.swift b/OUDS/Core/Tokens/SemanticTokens/Sources/Multiples/MultipleFontLetterSpacingTokens.swift index afb99e1da..d83e40e44 100644 --- a/OUDS/Core/Tokens/SemanticTokens/Sources/Multiples/MultipleFontLetterSpacingTokens.swift +++ b/OUDS/Core/Tokens/SemanticTokens/Sources/Multiples/MultipleFontLetterSpacingTokens.swift @@ -16,7 +16,7 @@ import OUDSTokensRaw /// Kind of semantic tokens which will wrap a combination of `MultipleFontLetterSpacingTokens` depending to size classes. /// Allows to gather the multiple-value tokens from Figma inside one object. -public final class MultipleFontLetterSpacingTokens: NSObject { +public final class MultipleFontLetterSpacingTokens: NSObject, Sendable { /// For **extra-compact** and **compact** viewports public let compact: TypographyFontLetterSpacingSemanticToken diff --git a/OUDS/Core/Tokens/SemanticTokens/Sources/Multiples/MultipleFontLineHeightTokens.swift b/OUDS/Core/Tokens/SemanticTokens/Sources/Multiples/MultipleFontLineHeightTokens.swift index 20034aa22..8b5d8ebba 100644 --- a/OUDS/Core/Tokens/SemanticTokens/Sources/Multiples/MultipleFontLineHeightTokens.swift +++ b/OUDS/Core/Tokens/SemanticTokens/Sources/Multiples/MultipleFontLineHeightTokens.swift @@ -16,7 +16,7 @@ import OUDSTokensRaw /// Kind of semantic tokens which will wrap a combination of `TypographyFontLineHeightSemanticToken` depending to size classes. /// Allows to gather the multiple-value tokens from Figma inside one object. -public final class MultipleFontLineHeightTokens: NSObject { +public final class MultipleFontLineHeightTokens: NSObject, Sendable { /// For **extra-compact** and **compact** viewports public let compact: TypographyFontLineHeightSemanticToken diff --git a/OUDS/Core/Tokens/SemanticTokens/Sources/Multiples/MultipleFontSizeTokens.swift b/OUDS/Core/Tokens/SemanticTokens/Sources/Multiples/MultipleFontSizeTokens.swift index fd3b3506e..018a717ba 100644 --- a/OUDS/Core/Tokens/SemanticTokens/Sources/Multiples/MultipleFontSizeTokens.swift +++ b/OUDS/Core/Tokens/SemanticTokens/Sources/Multiples/MultipleFontSizeTokens.swift @@ -16,7 +16,7 @@ import OUDSTokensRaw /// Kind of semantic tokens which will wrap a combination of `TypographyFontSizeSemanticToken` depending to size classes. /// Allows to gather the multiple-value tokens from Figma inside one object. -public final class MultipleFontSizeTokens: NSObject { +public final class MultipleFontSizeTokens: NSObject, Sendable { /// For **extra-compact** and **compact** viewports public let compact: TypographyFontSizeSemanticToken diff --git a/OUDS/Core/Tokens/SemanticTokens/Sources/Multiples/MultipleSizingTokens.swift b/OUDS/Core/Tokens/SemanticTokens/Sources/Multiples/MultipleSizingTokens.swift index a4228cc18..49ab0910f 100644 --- a/OUDS/Core/Tokens/SemanticTokens/Sources/Multiples/MultipleSizingTokens.swift +++ b/OUDS/Core/Tokens/SemanticTokens/Sources/Multiples/MultipleSizingTokens.swift @@ -16,7 +16,7 @@ import Foundation /// Kind of semantic tokens which will wrap a combination of `SizingSemanticToken` depending to viewports / size classes. /// Kind of composite token with multiple values, but not named "composite" because this word is already used in the design system. /// Allows to gather the multiple-value tokens from Figma inside one object. -public final class MultipleSizingTokens: NSObject { +public final class MultipleSizingTokens: NSObject, Sendable { /// For **extra-compact** and **compact** viewports public let compact: SizingSemanticToken diff --git a/OUDS/Core/Tokens/SemanticTokens/Sources/Multiples/MultipleSpacingTokens.swift b/OUDS/Core/Tokens/SemanticTokens/Sources/Multiples/MultipleSpacingTokens.swift index 7e6a62084..ef0f9ba41 100644 --- a/OUDS/Core/Tokens/SemanticTokens/Sources/Multiples/MultipleSpacingTokens.swift +++ b/OUDS/Core/Tokens/SemanticTokens/Sources/Multiples/MultipleSpacingTokens.swift @@ -18,7 +18,7 @@ import SwiftUI /// Kind of semantic tokens which will wrap a combination of `DimensionRawToken` depending to size classes. /// Kind of composite token with multiple values, but not named "composite" because this word is already used in the design system. /// Allows to gather the multiple-value tokens from Figma inside one object. -public final class MultipleSpacingTokens: NSObject { +public final class MultipleSpacingTokens: NSObject, Sendable { /// For **extra-compact** and **compact** viewports public let compact: DimensionRawToken diff --git a/OUDS/Core/Tokens/SemanticTokens/Sources/Multiples/MultipleTypographyTokens.swift b/OUDS/Core/Tokens/SemanticTokens/Sources/Multiples/MultipleTypographyTokens.swift index 47d3b20ae..ac8b20860 100644 --- a/OUDS/Core/Tokens/SemanticTokens/Sources/Multiples/MultipleTypographyTokens.swift +++ b/OUDS/Core/Tokens/SemanticTokens/Sources/Multiples/MultipleTypographyTokens.swift @@ -17,7 +17,7 @@ import OUDSTokensRaw /// Kind of semantic tokens which will wrap a combination of `TypographyCompositeRawToken` depending to size classes. /// Kind of composite token with multiple values, but not named "composite" because this word is already used in the design system. /// Allows to gather the multiple-value tokens from Figma inside one object. -public final class MultipleTypographyTokens: NSObject { +public final class MultipleTypographyTokens: NSObject, Sendable { /// For **extra-compact** and **compact** viewports public let compact: TypographyCompositeRawToken diff --git a/OUDS/Foundations/Sources/Extensions/Font+extensions.swift b/OUDS/Foundations/Sources/Extensions/Font+extensions.swift index 3baab8673..12f138644 100644 --- a/OUDS/Foundations/Sources/Extensions/Font+extensions.swift +++ b/OUDS/Foundations/Sources/Extensions/Font+extensions.swift @@ -13,8 +13,7 @@ import SwiftUI -// TODO: Xcode 16 - Add @retroactive -extension Font.Weight: CustomStringConvertible { +extension Font.Weight: @retroactive CustomStringConvertible { /// Computes from the current `self` value a description of the object which can be used later /// for example for font loading by appending this value to the font name. diff --git a/Package.swift b/Package.swift index 62a14e217..141a117c2 100644 --- a/Package.swift +++ b/Package.swift @@ -1,4 +1,4 @@ -// swift-tools-version: 5.10 +// swift-tools-version: 6.0 // // Software Name: OUDS iOS @@ -122,5 +122,5 @@ let package = Package( path: "OUDS/Foundations/TestsUtils"), ], - swiftLanguageVersions: [.v5] + swiftLanguageModes: [.v6] ) diff --git a/README.md b/README.md index 392ba00d1..ae1b77670 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,9 @@ [![Code size](https://img.shields.io/github/languages/code-size/Orange-OpenSource/ouds-ios?style=for-the-badge)](https://github.com/Orange-OpenSource/ouds-ios) [![Opened issues](https://img.shields.io/github/issues-raw/Orange-OpenSource/ouds-ios?style=for-the-badge)](https://github.com/Orange-OpenSource/ouds-ios/issues) -[![iOS 15.0](https://img.shields.io/badge/iOS-15.0-informational.svg?style=for-the-badge)](https://developer.apple.com/support/app-store "iOS 15 supports") +[![iOS 15.0](https://img.shields.io/badge/iOS-15.0-FF1AB2?style=for-the-badge)](https://developer.apple.com/support/app-store "iOS 15 supports") +[![Xcode 16](https://img.shields.io/badge/Xcode-16-blue?style=for-the-badge)](https://developer.apple.com/documentation/xcode-release-notes/xcode-16-release-notes) +[![Swift 6](https://img.shields.io/badge/Swift-6-orange?style=for-the-badge) ## Content diff --git a/Showcase/Showcase.xcodeproj/project.pbxproj b/Showcase/Showcase.xcodeproj/project.pbxproj index e0488b966..1b36757ba 100644 --- a/Showcase/Showcase.xcodeproj/project.pbxproj +++ b/Showcase/Showcase.xcodeproj/project.pbxproj @@ -819,7 +819,7 @@ SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; SWIFT_EMIT_LOC_STRINGS = NO; - SWIFT_VERSION = 5.0; + SWIFT_VERSION = 6.0; TARGETED_DEVICE_FAMILY = "1,2"; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/OUDS Showcase.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/OUDS Showcase"; }; @@ -843,7 +843,7 @@ SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; SWIFT_EMIT_LOC_STRINGS = NO; - SWIFT_VERSION = 5.0; + SWIFT_VERSION = 6.0; TARGETED_DEVICE_FAMILY = "1,2"; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/OUDS Showcase.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/OUDS Showcase"; }; @@ -1000,7 +1000,7 @@ SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; SWIFT_EMIT_LOC_STRINGS = YES; - SWIFT_VERSION = 5.0; + SWIFT_VERSION = 6.0; TARGETED_DEVICE_FAMILY = "1,2"; }; name = Debug; @@ -1041,7 +1041,7 @@ SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; SWIFT_EMIT_LOC_STRINGS = YES; - SWIFT_VERSION = 5.0; + SWIFT_VERSION = 6.0; TARGETED_DEVICE_FAMILY = "1,2"; }; name = Release; diff --git a/Showcase/Showcase/Pages/ThemeSelection/ThemeSelection.swift b/Showcase/Showcase/Pages/ThemeSelection/ThemeSelection.swift index 2a86e82a6..93c66a3f3 100644 --- a/Showcase/Showcase/Pages/ThemeSelection/ThemeSelection.swift +++ b/Showcase/Showcase/Pages/ThemeSelection/ThemeSelection.swift @@ -16,12 +16,21 @@ import OUDSThemesInverse import OUDSThemesOrange import SwiftUI -// MARK: - Extension of OUDSTheme +// MARK: - Extensions of OUDSTheme + +extension OUDSTheme: @retroactive Equatable { + + // MARK: Equtabable + + public static func == (lhs: OUDSTheme, rhs: OUDSTheme) -> Bool { + lhs.name == rhs.name + } +} /// Extension of the `OUDSTheme` to add both `Identifiable` and `Hashable`. /// An `OUDSTheme` must be `Identifiable` to be enumerated like in `ForEach`(e.g. used to build the list of elements in picker). /// It must be `Hashable` because it is used in a picker than need `Hashable` element. -extension OUDSTheme: Identifiable, Hashable { +extension OUDSTheme: @retroactive Identifiable, @retroactive Hashable { var name: String { if self is InverseTheme { // Is also an OrangeTheme, should be checked before @@ -43,10 +52,6 @@ extension OUDSTheme: Identifiable, Hashable { // MARK: Hashable - public static func == (lhs: OUDSTheme, rhs: OUDSTheme) -> Bool { - lhs.name == rhs.name - } - public func hash(into hasher: inout Hasher) { hasher.combine(name) } @@ -112,7 +117,7 @@ struct ThemeSelectionButton: View { } .pickerStyle(.automatic) } label: { - Image(systemName: "paintpalette") + Image(systemName: "paintpalette").accessibilityHidden(true) } .foregroundColor(themeProvider.currentTheme.colorContentBrandPrimary.color(for: colorScheme)) } diff --git a/Showcase/Showcase/Pages/Utils/ShowcaseElement.swift b/Showcase/Showcase/Pages/Utils/ShowcaseElement.swift index 805126688..9b415f8e6 100644 --- a/Showcase/Showcase/Pages/Utils/ShowcaseElement.swift +++ b/Showcase/Showcase/Pages/Utils/ShowcaseElement.swift @@ -13,6 +13,7 @@ import SwiftUI +@MainActor protocol ShowcaseElement { var name: String { get } var imageName: String { get } diff --git a/Showcase/fastlane/Fastfile b/Showcase/fastlane/Fastfile index 136788084..38edd484e 100644 --- a/Showcase/fastlane/Fastfile +++ b/Showcase/fastlane/Fastfile @@ -65,7 +65,7 @@ default_platform(:ios) platform :ios do before_all do |lane, options| - xcversion(version: "~> 15.3") + xcversion(version: "~> 16.0") end # ------------------------------------------------------------ From 5f4ec7e6d30fcb7b0b690d336eaaff273b418370 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Lapersonne Date: Tue, 22 Oct 2024 09:45:16 +0200 Subject: [PATCH 07/30] docs: update Swift 6 badge hyperlink to point to Apple announcement --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ae1b77670..d7369c019 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,7 @@ [![iOS 15.0](https://img.shields.io/badge/iOS-15.0-FF1AB2?style=for-the-badge)](https://developer.apple.com/support/app-store "iOS 15 supports") [![Xcode 16](https://img.shields.io/badge/Xcode-16-blue?style=for-the-badge)](https://developer.apple.com/documentation/xcode-release-notes/xcode-16-release-notes) -[![Swift 6](https://img.shields.io/badge/Swift-6-orange?style=for-the-badge) +[![Swift 6](https://img.shields.io/badge/Swift-6-orange?style=for-the-badge)](https://www.swift.org/blog/announcing-swift-6/) ## Content From bb7c8f3b1cb8190e1918cb957ee9548e19dcc593 Mon Sep 17 00:00:00 2001 From: "Boosted Bot [bot]" <130566815+boosted-bot@users.noreply.github.com> Date: Tue, 22 Oct 2024 09:57:39 +0200 Subject: [PATCH 08/30] =?UTF-8?q?chore(=F0=9F=A4=96):=20update=20`ColorRaw?= =?UTF-8?q?Tokens`=20(tokenator=20generation=2020241021180411)=20(#229)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Pierre-Yves Lapersonne Co-authored-by: boosted-bot Co-authored-by: Pierre-Yves Lapersonne --- CHANGELOG.md | 1 + .../Values/ColorRawTokens+Values.swift | 227 +++++++----------- 2 files changed, 90 insertions(+), 138 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 868b21bb8..0faa7d280 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed +- [Library] Update `ColorRawTokens` (tokenator *20241021180411*) - [Library/DemoApp] Migration to Swift 6 - [Library/DemoApp] Migration from *Xcode 15.3* to to *Xcode 16* ([#201](https://github.com/Orange-OpenSource/ouds-ios/issues/201)) - [Library] Rename `borderWidthOutsideFocus` to `borderWidthFocus` ([#207](https://github.com/Orange-OpenSource/ouds-ios/issues/207)) diff --git a/OUDS/Core/Tokens/RawTokens/Sources/Values/ColorRawTokens+Values.swift b/OUDS/Core/Tokens/RawTokens/Sources/Values/ColorRawTokens+Values.swift index b0edabd4c..7d966debb 100644 --- a/OUDS/Core/Tokens/RawTokens/Sources/Values/ColorRawTokens+Values.swift +++ b/OUDS/Core/Tokens/RawTokens/Sources/Values/ColorRawTokens+Values.swift @@ -2,45 +2,73 @@ // Software Name: OUDS iOS // SPDX-FileCopyrightText: Copyright (c) Orange SA // SPDX-License-Identifier: MIT -// +// // This software is distributed under the MIT license, // the text of which is available at https://opensource.org/license/MIT/ // or see the "LICENSE" file for more details. -// +// // Authors: See CONTRIBUTORS.txt -// Software description: A SwiftUI components library with code examples for Orange Unified Design System +// Software description: A SwiftUI components library with code examples for Orange Unified Design System // -// ଘ( ・ω・)_/゚・:*:・。☆ -// [File to generate with the tokenator] - // swiftlint:disable missing_docs -/// Extracted in a separated file to help the *Figma* JSON to Swift parser to generate files to include easily. extension ColorRawTokens { - - // MARK: Primitive token - Colors - Black, white - - public static let colorFunctionalWhite: ColorRawToken = "#FFFFFF" + public static let colorDecorativeAmber100: ColorRawToken = "#FFF0CC" + public static let colorDecorativeAmber200: ColorRawToken = "#FFE199" + public static let colorDecorativeAmber300: ColorRawToken = "#FFD266" + public static let colorDecorativeAmber400: ColorRawToken = "#FFC333" + public static let colorDecorativeAmber500: ColorRawToken = "#FFB400" + public static let colorDecorativeAmber600: ColorRawToken = "#CC9000" + public static let colorDecorativeAmber700: ColorRawToken = "#996C00" + public static let colorDecorativeAmber800: ColorRawToken = "#664800" + public static let colorDecorativeAmber900: ColorRawToken = "#332400" + public static let colorDecorativeAmethyst100: ColorRawToken = "#F1ECF9" + public static let colorDecorativeAmethyst200: ColorRawToken = "#E0D4F2" + public static let colorDecorativeAmethyst300: ColorRawToken = "#C5ADE6" + public static let colorDecorativeAmethyst400: ColorRawToken = "#A885D8" + public static let colorDecorativeAmethyst500: ColorRawToken = "#8D60CD" + public static let colorDecorativeAmethyst600: ColorRawToken = "#5B2F98" + public static let colorDecorativeAmethyst700: ColorRawToken = "#432371" + public static let colorDecorativeAmethyst800: ColorRawToken = "#2C174A" + public static let colorDecorativeAmethyst900: ColorRawToken = "#150B23" + public static let colorDecorativeDeepPeach100: ColorRawToken = "#FBEBDF" + public static let colorDecorativeDeepPeach200: ColorRawToken = "#F4CFB2" + public static let colorDecorativeDeepPeach300: ColorRawToken = "#E3B591" + public static let colorDecorativeDeepPeach400: ColorRawToken = "#C19372" + public static let colorDecorativeDeepPeach500: ColorRawToken = "#CF7E3F" + public static let colorDecorativeDeepPeach600: ColorRawToken = "#AA6631" + public static let colorDecorativeDeepPeach700: ColorRawToken = "#7E4F2A" + public static let colorDecorativeDeepPeach800: ColorRawToken = "#553720" + public static let colorDecorativeDeepPeach900: ColorRawToken = "#2E2014" + public static let colorDecorativeEmerald100: ColorRawToken = "#E5F5ED" + public static let colorDecorativeEmerald200: ColorRawToken = "#C0E8D4" + public static let colorDecorativeEmerald300: ColorRawToken = "#9BDABA" + public static let colorDecorativeEmerald400: ColorRawToken = "#75CCA1" + public static let colorDecorativeEmerald500: ColorRawToken = "#50BE87" + public static let colorDecorativeEmerald600: ColorRawToken = "#3BA06E" + public static let colorDecorativeEmerald700: ColorRawToken = "#2E7B54" + public static let colorDecorativeEmerald800: ColorRawToken = "#20563B" + public static let colorDecorativeEmerald900: ColorRawToken = "#123021" + public static let colorDecorativeShockingPink100: ColorRawToken = "#FFE5F6" + public static let colorDecorativeShockingPink200: ColorRawToken = "#FFB4E6" + public static let colorDecorativeShockingPink300: ColorRawToken = "#FF80D4" + public static let colorDecorativeShockingPink400: ColorRawToken = "#FF4DC3" + public static let colorDecorativeShockingPink500: ColorRawToken = "#FF1AB2" + public static let colorDecorativeShockingPink600: ColorRawToken = "#E50099" + public static let colorDecorativeShockingPink700: ColorRawToken = "#B20077" + public static let colorDecorativeShockingPink800: ColorRawToken = "#800055" + public static let colorDecorativeShockingPink900: ColorRawToken = "#4D0033" + public static let colorDecorativeSky100: ColorRawToken = "#D2ECF9" + public static let colorDecorativeSky200: ColorRawToken = "#A5DAF3" + public static let colorDecorativeSky300: ColorRawToken = "#79C7EC" + public static let colorDecorativeSky400: ColorRawToken = "#4AB4E6" + public static let colorDecorativeSky500: ColorRawToken = "#1FA2E0" + public static let colorDecorativeSky600: ColorRawToken = "#1982B3" + public static let colorDecorativeSky700: ColorRawToken = "#136186" + public static let colorDecorativeSky800: ColorRawToken = "#0C415A" + public static let colorDecorativeSky900: ColorRawToken = "#06202D" public static let colorFunctionalBlack: ColorRawToken = "#000000" - - // MARK: Primitive token - Colors - Functional light gray - - public static let colorFunctionalLightGray80: ColorRawToken = "#F4F4F4" - public static let colorFunctionalLightGray160: ColorRawToken = "#EEEEEE" - public static let colorFunctionalLightGray240: ColorRawToken = "#E0E0E0" - public static let colorFunctionalLightGray320: ColorRawToken = "#D6D6D6" - public static let colorFunctionalLightGray400: ColorRawToken = "#CCCCCC" - public static let colorFunctionalLightGray480: ColorRawToken = "#C2C2C2" - public static let colorFunctionalLightGray560: ColorRawToken = "#BBBBBB" - public static let colorFunctionalLightGray640: ColorRawToken = "#ADADAD" - public static let colorFunctionalLightGray720: ColorRawToken = "#A3A3A3" - public static let colorFunctionalLightGray800: ColorRawToken = "#999999" - public static let colorFunctionalLightGray880: ColorRawToken = "#8F8F8F" - public static let colorFunctionalLightGray960: ColorRawToken = "#858585" - - // MARK: Primitive token - Colors - Functional dark gray - public static let colorFunctionalDarkGray80: ColorRawToken = "#7A7A7A" public static let colorFunctionalDarkGray160: ColorRawToken = "#707070" public static let colorFunctionalDarkGray240: ColorRawToken = "#666666" @@ -53,9 +81,36 @@ extension ColorRawTokens { public static let colorFunctionalDarkGray800: ColorRawToken = "#1F1F1F" public static let colorFunctionalDarkGray880: ColorRawToken = "#141414" public static let colorFunctionalDarkGray960: ColorRawToken = "#0A0A0A" - - // MARK: Primitive token - Colors - Functional scarlet - + public static let colorFunctionalDodgerBlue100: ColorRawToken = "#F0FAFF" + public static let colorFunctionalDodgerBlue200: ColorRawToken = "#BDE7FF" + public static let colorFunctionalDodgerBlue300: ColorRawToken = "#8AD5FF" + public static let colorFunctionalDodgerBlue400: ColorRawToken = "#57C3FF" + public static let colorFunctionalDodgerBlue500: ColorRawToken = "#26B2FF" + public static let colorFunctionalDodgerBlue600: ColorRawToken = "#009BF0" + public static let colorFunctionalDodgerBlue700: ColorRawToken = "#007ABD" + public static let colorFunctionalDodgerBlue800: ColorRawToken = "#00598A" + public static let colorFunctionalDodgerBlue900: ColorRawToken = "#003857" + public static let colorFunctionalLightGray80: ColorRawToken = "#F4F4F4" + public static let colorFunctionalLightGray160: ColorRawToken = "#EEEEEE" + public static let colorFunctionalLightGray240: ColorRawToken = "#E0E0E0" + public static let colorFunctionalLightGray320: ColorRawToken = "#D6D6D6" + public static let colorFunctionalLightGray400: ColorRawToken = "#CCCCCC" + public static let colorFunctionalLightGray480: ColorRawToken = "#C2C2C2" + public static let colorFunctionalLightGray560: ColorRawToken = "#BBBBBB" + public static let colorFunctionalLightGray640: ColorRawToken = "#ADADAD" + public static let colorFunctionalLightGray720: ColorRawToken = "#A3A3A3" + public static let colorFunctionalLightGray800: ColorRawToken = "#999999" + public static let colorFunctionalLightGray880: ColorRawToken = "#8F8F8F" + public static let colorFunctionalLightGray960: ColorRawToken = "#858585" + public static let colorFunctionalMalachite100: ColorRawToken = "#EDFCF0" + public static let colorFunctionalMalachite200: ColorRawToken = "#C1F6CA" + public static let colorFunctionalMalachite300: ColorRawToken = "#94F0A4" + public static let colorFunctionalMalachite400: ColorRawToken = "#67E97E" + public static let colorFunctionalMalachite500: ColorRawToken = "#3DE35A" + public static let colorFunctionalMalachite600: ColorRawToken = "#1ECD3C" + public static let colorFunctionalMalachite700: ColorRawToken = "#17A02F" + public static let colorFunctionalMalachite800: ColorRawToken = "#0E621D" + public static let colorFunctionalMalachite900: ColorRawToken = "#0A4715" public static let colorFunctionalScarlet100: ColorRawToken = "#FFE5E6" public static let colorFunctionalScarlet200: ColorRawToken = "#FFB2B3" public static let colorFunctionalScarlet300: ColorRawToken = "#FF8081" @@ -65,117 +120,16 @@ extension ColorRawTokens { public static let colorFunctionalScarlet700: ColorRawToken = "#B20002" public static let colorFunctionalScarlet800: ColorRawToken = "#800001" public static let colorFunctionalScarlet900: ColorRawToken = "#4D0001" - - // MARK: Primitive token - Colors - Functional sun - public static let colorFunctionalSun100: ColorRawToken = "#FFF7D6" public static let colorFunctionalSun200: ColorRawToken = "#FFED99" public static let colorFunctionalSun300: ColorRawToken = "#FFE270" public static let colorFunctionalSun400: ColorRawToken = "#FFD73D" - public static let colorFunctionalSun500: ColorRawToken = "#FFD0D0" + public static let colorFunctionalSun500: ColorRawToken = "#FFD000" public static let colorFunctionalSun600: ColorRawToken = "#D6AA00" public static let colorFunctionalSun700: ColorRawToken = "#A38200" public static let colorFunctionalSun800: ColorRawToken = "#665100" public static let colorFunctionalSun900: ColorRawToken = "#3D3100" - - // MARK: Primitive token - Colors - Functional malachite - - public static let colorFunctionalMalachite100: ColorRawToken = "#EDFCF0" - public static let colorFunctionalMalachite200: ColorRawToken = "#C1F6CA" - public static let colorFunctionalMalachite300: ColorRawToken = "#94F0A4" - public static let colorFunctionalMalachite400: ColorRawToken = "#67E97E" - public static let colorFunctionalMalachite500: ColorRawToken = "#3DE35A" - public static let colorFunctionalMalachite600: ColorRawToken = "#1ECD3C" - public static let colorFunctionalMalachite700: ColorRawToken = "#17A02F" - public static let colorFunctionalMalachite800: ColorRawToken = "#0E621D" - public static let colorFunctionalMalachite900: ColorRawToken = "#0A4715" - - // MARK: Primitive token - Colors - Functional dodger blue - - public static let colorFunctionalDodgerBlue100: ColorRawToken = "#F0FAFF" - public static let colorFunctionalDodgerBlue200: ColorRawToken = "#BDE7FF" - public static let colorFunctionalDodgerBlue300: ColorRawToken = "#8AD5FF" - public static let colorFunctionalDodgerBlue400: ColorRawToken = "#57C3FF" - public static let colorFunctionalDodgerBlue500: ColorRawToken = "#26B2FF" - public static let colorFunctionalDodgerBlue600: ColorRawToken = "#009BF0" - public static let colorFunctionalDodgerBlue700: ColorRawToken = "#007ABD" - public static let colorFunctionalDodgerBlue800: ColorRawToken = "#00598A" - public static let colorFunctionalDodgerBlue900: ColorRawToken = "#003857" - - // MARK: Primitive token - Colors - Orange - Emerald - - public static let colorDecorativeEmerald100: ColorRawToken = "#E5F5ED" - public static let colorDecorativeEmerald200: ColorRawToken = "#C0E8DA" - public static let colorDecorativeEmerald300: ColorRawToken = "#9BDABA" - public static let colorDecorativeEmerald400: ColorRawToken = "#75CCA1" - public static let colorDecorativeEmerald500: ColorRawToken = "#50BE87" - public static let colorDecorativeEmerald600: ColorRawToken = "#3BA06E" - public static let colorDecorativeEmerald700: ColorRawToken = "#2E7B54" - public static let colorDecorativeEmerald800: ColorRawToken = "#20563B" - public static let colorDecorativeEmerald900: ColorRawToken = "#123021" - - // MARK: Primitive token - Colors - Orange - Sky - - public static let colorDecorativeSky100: ColorRawToken = "#D2ECF9" - public static let colorDecorativeSky200: ColorRawToken = "#A5DAF3" - public static let colorDecorativeSky300: ColorRawToken = "#79C7EC" - public static let colorDecorativeSky400: ColorRawToken = "#4AB4E6" - public static let colorDecorativeSky500: ColorRawToken = "#1FA2E0" - public static let colorDecorativeSky600: ColorRawToken = "#1982B3" - public static let colorDecorativeSky700: ColorRawToken = "#136186" - public static let colorDecorativeSky800: ColorRawToken = "#0C415A" - public static let colorDecorativeSky900: ColorRawToken = "#06202D" - - // MARK: Primitive token - Colors - Orange - Amber - - public static let colorDecorativeAmber100: ColorRawToken = "#FFF0CC" - public static let colorDecorativeAmber200: ColorRawToken = "#FFE199" - public static let colorDecorativeAmber300: ColorRawToken = "#FFD266" - public static let colorDecorativeAmber400: ColorRawToken = "#FFC333" - public static let colorDecorativeAmber500: ColorRawToken = "#FFB400" - public static let colorDecorativeAmber600: ColorRawToken = "#CC9000" - public static let colorDecorativeAmber700: ColorRawToken = "#996C00" - public static let colorDecorativeAmber800: ColorRawToken = "#664800" - public static let colorDecorativeAmber900: ColorRawToken = "#332400" - - // MARK: Primitive token - Colors - Orange - Amethyst - - public static let colorDecorativeAmethyst100: ColorRawToken = "#F1ECF9" - public static let colorDecorativeAmethyst200: ColorRawToken = "#E0D4F2" - public static let colorDecorativeAmethyst300: ColorRawToken = "#C5ADE6" - public static let colorDecorativeAmethyst400: ColorRawToken = "#A885D8" - public static let colorDecorativeAmethyst500: ColorRawToken = "#8D60CD" - public static let colorDecorativeAmethyst600: ColorRawToken = "#5B2F98" - public static let colorDecorativeAmethyst700: ColorRawToken = "#432371" - public static let colorDecorativeAmethyst800: ColorRawToken = "#2C174A" - public static let colorDecorativeAmethyst900: ColorRawToken = "#150B23" - - // MARK: Primitive token - Colors - Orange - Shocking Pink - - public static let colorDecorativeShockingPink100: ColorRawToken = "#FFE5F6" - public static let colorDecorativeShockingPink200: ColorRawToken = "#FFB4E6" - public static let colorDecorativeShockingPink300: ColorRawToken = "#FF80D4" - public static let colorDecorativeShockingPink400: ColorRawToken = "#FF4DC3" - public static let colorDecorativeShockingPink500: ColorRawToken = "#FF1AB2" - public static let colorDecorativeShockingPink600: ColorRawToken = "#E50099" - public static let colorDecorativeShockingPink700: ColorRawToken = "#B20077" - public static let colorDecorativeShockingPink800: ColorRawToken = "#800055" - public static let colorDecorativeShockingPink900: ColorRawToken = "#4D0033" - - // MARK: Primitive token - Colors - Orange - Deep Peach - - public static let colorDecorativeDeepPeach100: ColorRawToken = "#FBEBDF" - public static let colorDecorativeDeepPeach200: ColorRawToken = "#F4CFB2" - public static let colorDecorativeDeepPeach300: ColorRawToken = "#E3B591" - public static let colorDecorativeDeepPeach400: ColorRawToken = "#C19372" - public static let colorDecorativeDeepPeach500: ColorRawToken = "#CF7E3F" - public static let colorDecorativeDeepPeach600: ColorRawToken = "#AA6631" - public static let colorDecorativeDeepPeach700: ColorRawToken = "#7E4F2A" - public static let colorDecorativeDeepPeach800: ColorRawToken = "#553720" - public static let colorDecorativeDeepPeach900: ColorRawToken = "#2E2014" - - // MARK: Primitive token - Colors - Transparent black - + public static let colorFunctionalWhite: ColorRawToken = "#FFFFFF" public static let colorTransparentBlack0: ColorRawToken = apply(opacity: OpacityRawTokens.opacity0, on: colorFunctionalBlack) public static let colorTransparentBlack100: ColorRawToken = apply(opacity: OpacityRawTokens.opacity100, on: colorFunctionalBlack) public static let colorTransparentBlack200: ColorRawToken = apply(opacity: OpacityRawTokens.opacity200, on: colorFunctionalBlack) @@ -186,9 +140,6 @@ extension ColorRawTokens { public static let colorTransparentBlack700: ColorRawToken = apply(opacity: OpacityRawTokens.opacity700, on: colorFunctionalBlack) public static let colorTransparentBlack800: ColorRawToken = apply(opacity: OpacityRawTokens.opacity800, on: colorFunctionalBlack) public static let colorTransparentBlack900: ColorRawToken = apply(opacity: OpacityRawTokens.opacity900, on: colorFunctionalBlack) - - // MARK: Primitive token - Colors - Transparent white - public static let colorTransparentWhite0: ColorRawToken = apply(opacity: OpacityRawTokens.opacity0, on: colorFunctionalWhite) public static let colorTransparentWhite100: ColorRawToken = apply(opacity: OpacityRawTokens.opacity100, on: colorFunctionalWhite) public static let colorTransparentWhite200: ColorRawToken = apply(opacity: OpacityRawTokens.opacity200, on: colorFunctionalWhite) From 9179fcdaca337bcb3dfd36cca2073d62e90a267e Mon Sep 17 00:00:00 2001 From: "Boosted Bot [bot]" <130566815+boosted-bot@users.noreply.github.com> Date: Tue, 22 Oct 2024 11:02:21 +0200 Subject: [PATCH 09/30] =?UTF-8?q?chore(=F0=9F=A4=96):=20update=20`BorderRa?= =?UTF-8?q?wTokens`=20(tokenator=20generation=2020241022102003)=20(#232)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Pierre-Yves Lapersonne Co-authored-by: boosted-bot Co-authored-by: Pierre-Yves Lapersonne --- CHANGELOG.md | 1 + .../Values/BorderRawTokens+Values.swift | 63 +++++++------------ 2 files changed, 25 insertions(+), 39 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0faa7d280..54fee623f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed +- [Library] Update `BorderRawTokens` (tokenator *20241022102003*) - [Library] Update `ColorRawTokens` (tokenator *20241021180411*) - [Library/DemoApp] Migration to Swift 6 - [Library/DemoApp] Migration from *Xcode 15.3* to to *Xcode 16* ([#201](https://github.com/Orange-OpenSource/ouds-ios/issues/201)) diff --git a/OUDS/Core/Tokens/RawTokens/Sources/Values/BorderRawTokens+Values.swift b/OUDS/Core/Tokens/RawTokens/Sources/Values/BorderRawTokens+Values.swift index 5c1253c46..976a05194 100644 --- a/OUDS/Core/Tokens/RawTokens/Sources/Values/BorderRawTokens+Values.swift +++ b/OUDS/Core/Tokens/RawTokens/Sources/Values/BorderRawTokens+Values.swift @@ -2,57 +2,42 @@ // Software Name: OUDS iOS // SPDX-FileCopyrightText: Copyright (c) Orange SA // SPDX-License-Identifier: MIT -// +// // This software is distributed under the MIT license, // the text of which is available at https://opensource.org/license/MIT/ // or see the "LICENSE" file for more details. -// +// // Authors: See CONTRIBUTORS.txt -// Software description: A SwiftUI components library with code examples for Orange Unified Design System +// Software description: A SwiftUI components library with code examples for Orange Unified Design System // -// ଘ( ・ω・)_/゚・:*:・。☆ -// [File to generate with the tokenator] - // swiftlint:disable missing_docs -/// Extracted in this separated file to help the *Figma* JSON to Swift parser to generate files to include easily. extension BorderRawTokens { - - /// Double type because used below for computations with Double values, output of the parser public static let borderBase: Double = 4 - - // MARK: Primitive token - Border - Width - - public static let borderWidth0: BorderWidthRawToken = borderBase * 0 - public static let borderWidth25: BorderWidthRawToken = borderBase * 0.25 - public static let borderWidth50: BorderWidthRawToken = borderBase * 0.5 - public static let borderWidth75: BorderWidthRawToken = borderBase * 0.75 - public static let borderWidth100: BorderWidthRawToken = borderBase * 1 - public static let borderWidth150: BorderWidthRawToken = borderBase * 1.5 - public static let borderWidth200: BorderWidthRawToken = borderBase * 2 - - // MARK: Primitive token - Border - Radius - - public static let borderRadius0: BorderRadiusRawToken = borderBase * 0 - public static let borderRadius25: BorderRadiusRawToken = borderBase * 0.25 - public static let borderRadius50: BorderRadiusRawToken = borderBase * 0.5 - public static let borderRadius75: BorderRadiusRawToken = borderBase * 0.75 - public static let borderRadius100: BorderRadiusRawToken = borderBase * 1 - public static let borderRadius150: BorderRadiusRawToken = borderBase * 1.5 - public static let borderRadius200: BorderRadiusRawToken = borderBase * 2 - public static let borderRadius300: BorderRadiusRawToken = borderBase * 3 - public static let borderRadius400: BorderRadiusRawToken = borderBase * 4 - public static let borderRadius500: BorderRadiusRawToken = borderBase * 5 - public static let borderRadius600: BorderRadiusRawToken = borderBase * 6 - public static let borderRadius800: BorderRadiusRawToken = borderBase * 8 - - // MARK: Primitive token - Border - Style - - public static let borderStyleNone: BorderStyleRawToken = "none" - public static let borderStyleSolid: BorderStyleRawToken = "solid" + public static let borderRadius0: BorderRadiusRawToken = borderBase * 0 // 0 + public static let borderRadius25: BorderRadiusRawToken = borderBase * 0.25 // 1 + public static let borderRadius50: BorderRadiusRawToken = borderBase * 0.5 // 2 + public static let borderRadius75: BorderRadiusRawToken = borderBase * 0.75 // 3 + public static let borderRadius100: BorderRadiusRawToken = borderBase * 1 // 4 + public static let borderRadius150: BorderRadiusRawToken = borderBase * 1.5 // 6 + public static let borderRadius200: BorderRadiusRawToken = borderBase * 2 // 8 + public static let borderRadius300: BorderRadiusRawToken = borderBase * 3 // 12 + public static let borderRadius400: BorderRadiusRawToken = borderBase * 4 // 16 + public static let borderRadius500: BorderRadiusRawToken = borderBase * 5 // 20 + public static let borderRadius600: BorderRadiusRawToken = borderBase * 6 // 24 + public static let borderRadius800: BorderRadiusRawToken = borderBase * 8 // 32 public static let borderStyleDashed: BorderStyleRawToken = "dashed" public static let borderStyleDotted: BorderStyleRawToken = "dotted" + public static let borderStyleNone: BorderStyleRawToken = "none" + public static let borderStyleSolid: BorderStyleRawToken = "solid" + public static let borderWidth0: BorderWidthRawToken = borderBase * 0 // 0 + public static let borderWidth25: BorderWidthRawToken = borderBase * 0.25 // 1 + public static let borderWidth50: BorderWidthRawToken = borderBase * 0.5 // 2 + public static let borderWidth75: BorderWidthRawToken = borderBase * 0.75 // 3 + public static let borderWidth100: BorderWidthRawToken = borderBase * 1 // 4 + public static let borderWidth150: BorderWidthRawToken = borderBase * 1.5 // 6 + public static let borderWidth200: BorderWidthRawToken = borderBase * 2 // 8 } // swiftlint:enable missing_docs From b530a4fe3a9e14c23d4ab04d9d544fac52ec1ddb Mon Sep 17 00:00:00 2001 From: Pierre-Yves Lapersonne Date: Tue, 22 Oct 2024 11:56:28 +0200 Subject: [PATCH 10/30] refactor: update color semantic tokens (#208) (#232) Signed-off-by: Pierre-Yves Lapersonne --- CHANGELOG.md | 9 + .../OUDSTheme+ColorSemanticTokens.swift | 202 +++--- .../MockTheme+ColorSemanticTokens.swift | 202 +++--- .../OUDSTheme/MockThemes/OtherMockTheme.swift | 204 +++--- ...stThemeOverrideOfColorSemanticTokens.swift | 602 +++++++++--------- .../InverseTheme+ColorSemanticTokens.swift | 188 +++--- .../Tests/TestInverseThemeColors.swift | 408 ++++++------ .../OrangeTheme+SemanticColorTokens.swift | 14 +- .../Sources/Values/ColorSemanticTokens.swift | 202 +++--- .../TestsUtils/XCTestCase+extensions.swift | 4 +- .../Pages/Tokens/Color/ColorTokenPage.swift | 2 +- .../Color/NamedColor/NamedColor+Action.swift | 223 ++++--- .../Color/NamedColor/NamedColor+Always.swift | 42 +- .../NamedColor/NamedColor+Background.swift | 36 +- .../Color/NamedColor/NamedColor+Border.swift | 40 +- .../Color/NamedColor/NamedColor+Content.swift | 18 +- .../NamedColor/NamedColor+Decorative.swift | 90 +-- .../NamedColor/NamedColor+Elevation.swift | 48 +- .../NamedColor/NamedColor+OnContent.swift | 110 ++-- .../Dimension/Spacing/SpacingTokenPage.swift | 2 +- 20 files changed, 1251 insertions(+), 1395 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 54fee623f..3ed38467f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed +- [Library] Rename all color semantic tokens `*OnBackground*` to `*OnBg*` ([#208](https://github.com/Orange-OpenSource/ouds-ios/issues/208)) +- [Library] Rename `colorDecorativeBrandTertiary` to `colorDecorativeTertiary` +- [Library] Rename `colorDecorativeBrandPrimary` to `colorDecorativePrimary` ([#208](https://github.com/Orange-OpenSource/ouds-ios/issues/208)) +- [Library] Rename `colorDecorativeSkinTint*` to `colorDecorativeSkinTint*` +- [Library] Rename `colorActionVisitedOnBackgroundEmphasized` to `colorActionVisitedOnBgEmphasized` ([#208](https://github.com/Orange-OpenSource/ouds-ios/issues/208)) +- [Library] Update color semantic tokens ([#208](https://github.com/Orange-OpenSource/ouds-ios/issues/208)) - [Library] Update `BorderRawTokens` (tokenator *20241022102003*) - [Library] Update `ColorRawTokens` (tokenator *20241021180411*) - [Library/DemoApp] Migration to Swift 6 @@ -21,6 +27,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Removed +- [Library] Semantic tokens `colorDecorativeBrandTertiaryMuted`, `colorDecorativeBrandTertiaryEmphasized` ([#208](https://github.com/Orange-OpenSource/ouds-ios/issues/208)) +- [Library] Semantic tokens `colorDecorativeBrandSecondaryMuted`, `colorDecorativeBrandSecondaryEmphasized` ([#208](https://github.com/Orange-OpenSource/ouds-ios/issues/208)) +- [Library] Semantic tokens `colorDecorativeBrandPrimaryMuted`, `colorDecorativeBrandPrimaryEmphasized` ([#208](https://github.com/Orange-OpenSource/ouds-ios/issues/208)) - [Library] Semantic tokens `elevationBlurFocus`, `elevationXFocus`, `elevationYFocus`, `elevationColorFocus` ([#209](https://github.com/Orange-OpenSource/ouds-ios/issues/209)) - [Library] Semantic token `fontWeightCode` ([#210](https://github.com/Orange-OpenSource/ouds-ios/issues/210)) diff --git a/OUDS/Core/OUDS/Sources/OUDSTheme/OUDSTheme+SemanticTokens/OUDSTheme+ColorSemanticTokens.swift b/OUDS/Core/OUDS/Sources/OUDSTheme/OUDSTheme+SemanticTokens/OUDSTheme+ColorSemanticTokens.swift index ae2814050..13304bae8 100644 --- a/OUDS/Core/OUDS/Sources/OUDSTheme/OUDSTheme+SemanticTokens/OUDSTheme+ColorSemanticTokens.swift +++ b/OUDS/Core/OUDS/Sources/OUDSTheme/OUDSTheme+SemanticTokens/OUDSTheme+ColorSemanticTokens.swift @@ -49,29 +49,29 @@ extension OUDSTheme: ColorSemanticTokens { @objc open var colorBackgroundStatusNeutral: ColorSemanticToken { MultipleColorTokens(light: ColorRawTokens.colorFunctionalLightGray80, dark: ColorRawTokens.colorFunctionalDarkGray720) } - @objc open var colorBackgroundStatusNeutralOnBackgroundEmphasized: ColorSemanticToken { MultipleColorTokens(light: ColorRawTokens.colorFunctionalDarkGray720, dark: ColorRawTokens.colorFunctionalDarkGray720) } + @objc open var colorBackgroundStatusNeutralOnBgEmphasized: ColorSemanticToken { MultipleColorTokens(light: ColorRawTokens.colorFunctionalDarkGray720, dark: ColorRawTokens.colorFunctionalDarkGray720) } @objc open var colorBackgroundStatusPositiveMuted: ColorSemanticToken { MultipleColorTokens(light: ColorRawTokens.colorFunctionalMalachite100, dark: ColorRawTokens.colorFunctionalMalachite900) } - @objc open var colorBackgroundStatusPositiveMutedOnBackgroundEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalMalachite900) } + @objc open var colorBackgroundStatusPositiveMutedOnBgEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalMalachite900) } @objc open var colorBackgroundStatusPositiveEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalMalachite500) } @objc open var colorBackgroundStatusInfoMuted: ColorSemanticToken { MultipleColorTokens(light: ColorRawTokens.colorFunctionalDodgerBlue100, dark: ColorRawTokens.colorFunctionalDodgerBlue900) } - @objc open var colorBackgroundStatusInfoMutedOnBackgroundEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalDodgerBlue900) } + @objc open var colorBackgroundStatusInfoMutedOnBgEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalDodgerBlue900) } @objc open var colorBackgroundStatusInfoEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalDodgerBlue500) } @objc open var colorBackgroundStatusWarningMuted: ColorSemanticToken { MultipleColorTokens(light: ColorRawTokens.colorFunctionalSun100, dark: ColorRawTokens.colorFunctionalSun900) } - @objc open var colorBackgroundStatusWarningMutedOnBackgroundEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalSun900) } + @objc open var colorBackgroundStatusWarningMutedOnBgEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalSun900) } @objc open var colorBackgroundStatusWarningEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalSun500) } @objc open var colorBackgroundStatusNegativeMuted: ColorSemanticToken { MultipleColorTokens(light: ColorRawTokens.colorFunctionalScarlet100, dark: ColorRawTokens.colorFunctionalScarlet900) } - @objc open var colorBackgroundStatusNegativeMutedOnBackgroundEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalScarlet900) } + @objc open var colorBackgroundStatusNegativeMutedOnBgEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalScarlet900) } @objc open var colorBackgroundStatusNegativeEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalScarlet600) } @@ -79,7 +79,7 @@ extension OUDSTheme: ColorSemanticTokens { @objc open var colorBackgroundStatusAccentMuted: ColorSemanticToken { fatalError("🤖 Raw token unavailable for colorBackgroundStatusAccentMuted!") } // WARNING: #124 - Colors to use are part of Orange Theme so are not reachable at this level, as a workaround add raw values - @objc open var colorBackgroundStatusAccentMutedOnBackgroundEmphasized: ColorSemanticToken { fatalError("🤖 Raw token unavailable for colorBackgroundStatusAccentMutedOnBackgroundEmphasized!") } + @objc open var colorBackgroundStatusAccentMutedOnBgEmphasized: ColorSemanticToken { fatalError("🤖 Raw token unavailable for colorBackgroundStatusAccentMutedOnBgEmphasized!") } @objc open var colorBackgroundStatusAccentEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalSun500) } @@ -87,15 +87,15 @@ extension OUDSTheme: ColorSemanticTokens { @objc open var colorContentDefault: ColorSemanticToken { MultipleColorTokens(light: ColorRawTokens.colorFunctionalBlack, dark: ColorRawTokens.colorFunctionalLightGray160) } - @objc open var colorContentContentDefaultOnBackgroundEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalLightGray160) } + @objc open var colorContentContentDefaultOnBgEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalLightGray160) } @objc open var colorContentMuted: ColorSemanticToken { MultipleColorTokens(light: ColorRawTokens.colorFunctionalDarkGray400, dark: ColorRawTokens.colorFunctionalLightGray400) } - @objc open var colorContentContentMutedOnBackgroundEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalLightGray400) } + @objc open var colorContentContentMutedOnBgEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalLightGray400) } @objc open var colorContentDisabled: ColorSemanticToken { MultipleColorTokens(light: ColorRawTokens.colorFunctionalLightGray400, dark: ColorRawTokens.colorFunctionalDarkGray400) } - @objc open var colorContentContentDisabledOnBackgroundEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalDarkGray400) } + @objc open var colorContentContentDisabledOnBgEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalDarkGray400) } // WARNING: #124 - Colors to use are part of Orange Theme so are not reachable at this level, as a workaround add raw values @objc open var colorContentBrandPrimary: ColorSemanticToken { fatalError("🤖 Raw token unavailable for colorContentBrandPrimary!") } @@ -116,56 +116,56 @@ extension OUDSTheme: ColorSemanticTokens { // MARK: Semantic token - Colors - Content - On Background - @objc open var colorContentOnBackgroundPrimary: ColorSemanticToken { MultipleColorTokens(light: ColorRawTokens.colorFunctionalWhite, dark: ColorRawTokens.colorFunctionalBlack) } + @objc open var colorContentOnBgPrimary: ColorSemanticToken { MultipleColorTokens(light: ColorRawTokens.colorFunctionalWhite, dark: ColorRawTokens.colorFunctionalBlack) } - @objc open var colorContentOnBackgroundSecondary: ColorSemanticToken { fatalError("🤖 No value defined for colorContentOnBackgroundSecondary!") } + @objc open var colorContentOnBgSecondary: ColorSemanticToken { fatalError("🤖 No value defined for colorContentOnBgSecondary!") } - @objc open var colorContentOnBackgroundTertiary: ColorSemanticToken { fatalError("🤖 No value defined for colorContentOnBackgroundTertiary!") } + @objc open var colorContentOnBgTertiary: ColorSemanticToken { fatalError("🤖 No value defined for colorContentOnBgTertiary!") } - @objc open var colorContentOnBackgroundStatusPositiveMuted: ColorSemanticToken { MultipleColorTokens(light: ColorRawTokens.colorFunctionalBlack, dark: ColorRawTokens.colorFunctionalLightGray160) } + @objc open var colorContentOnBgStatusPositiveMuted: ColorSemanticToken { MultipleColorTokens(light: ColorRawTokens.colorFunctionalBlack, dark: ColorRawTokens.colorFunctionalLightGray160) } - @objc open var colorContentOnBackgroundStatusPositiveMutedOnBackgroundEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalLightGray160) } + @objc open var colorContentOnBgStatusPositiveMutedOnBgEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalLightGray160) } - @objc open var colorContentOnBackgroundStatusPositiveEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalBlack) } + @objc open var colorContentOnBgStatusPositiveEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalBlack) } - @objc open var colorContentOnBackgroundStatusInfoMuted: ColorSemanticToken { MultipleColorTokens(light: ColorRawTokens.colorFunctionalBlack, dark: ColorRawTokens.colorFunctionalLightGray160) } + @objc open var colorContentOnBgStatusInfoMuted: ColorSemanticToken { MultipleColorTokens(light: ColorRawTokens.colorFunctionalBlack, dark: ColorRawTokens.colorFunctionalLightGray160) } - @objc open var colorContentOnBackgroundStatusInfoMutedOnBackgroundEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalLightGray160) } + @objc open var colorContentOnBgStatusInfoMutedOnBgEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalLightGray160) } - @objc open var colorContentOnBackgroundStatusInfoEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalBlack) } + @objc open var colorContentOnBgStatusInfoEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalBlack) } - @objc open var colorContentOnBackgroundStatusWarningMuted: ColorSemanticToken { MultipleColorTokens(light: ColorRawTokens.colorFunctionalBlack, dark: ColorRawTokens.colorFunctionalLightGray160) } + @objc open var colorContentOnBgStatusWarningMuted: ColorSemanticToken { MultipleColorTokens(light: ColorRawTokens.colorFunctionalBlack, dark: ColorRawTokens.colorFunctionalLightGray160) } - @objc open var colorContentOnBackgroundStatusWarningMutedOnBackgroundEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalLightGray160) } + @objc open var colorContentOnBgStatusWarningMutedOnBgEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalLightGray160) } - @objc open var colorContentOnBackgroundStatusWarningEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalBlack) } + @objc open var colorContentOnBgStatusWarningEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalBlack) } - @objc open var colorContentOnBackgroundStatusNegativeMuted: ColorSemanticToken { MultipleColorTokens(light: ColorRawTokens.colorFunctionalBlack, dark: ColorRawTokens.colorFunctionalLightGray160) } + @objc open var colorContentOnBgStatusNegativeMuted: ColorSemanticToken { MultipleColorTokens(light: ColorRawTokens.colorFunctionalBlack, dark: ColorRawTokens.colorFunctionalLightGray160) } - @objc open var colorContentOnBackgroundStatusNegativeMutedOnBackgroundEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalLightGray160) } + @objc open var colorContentOnBgStatusNegativeMutedOnBgEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalLightGray160) } - @objc open var colorContentOnBackgroundStatusNegativeEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalWhite) } + @objc open var colorContentOnBgStatusNegativeEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalWhite) } - @objc open var colorContentOnBackgroundStatusAccentMuted: ColorSemanticToken { MultipleColorTokens(light: ColorRawTokens.colorFunctionalBlack, dark: ColorRawTokens.colorFunctionalLightGray160) } + @objc open var colorContentOnBgStatusAccentMuted: ColorSemanticToken { MultipleColorTokens(light: ColorRawTokens.colorFunctionalBlack, dark: ColorRawTokens.colorFunctionalLightGray160) } - @objc open var colorContentOnBackgroundStatusAccentMutedOnBackgroundEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalLightGray160) } + @objc open var colorContentOnBgStatusAccentMutedOnBgEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalLightGray160) } - @objc open var colorContentOnBackgroundStatusAccentedEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalBlack) } + @objc open var colorContentOnBgStatusAccentedEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalBlack) } // MARK: Semantic token - Colors - Border @objc open var colorBorderDefault: ColorSemanticToken { MultipleColorTokens(light: ColorRawTokens.colorFunctionalLightGray400, dark: ColorRawTokens.colorFunctionalDarkGray400) } - @objc open var colorBorderDefaultOnBackgroundEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalDarkGray400) } + @objc open var colorBorderDefaultOnBgEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalDarkGray400) } @objc open var colorBorderEmphasized: ColorSemanticToken { MultipleColorTokens(light: ColorRawTokens.colorFunctionalBlack, dark: ColorRawTokens.colorFunctionalLightGray160) } - @objc open var colorBorderEmphasizedOnBackgroundEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalLightGray160) } + @objc open var colorBorderEmphasizedOnBgEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalLightGray160) } @objc open var colorBorderFocus: ColorSemanticToken { MultipleColorTokens(light: ColorRawTokens.colorFunctionalWhite, dark: ColorRawTokens.colorFunctionalDarkGray880) } // WARNING: #124 - Colors to use are part of Orange Theme so are not reachable at this level, as a workaround add raw values - @objc open var colorBorderBrandPrimaryOnBackgroundEmphasized: ColorSemanticToken { fatalError("🤖 Raw token unavailable for colorBorderBrandPrimaryOnBackgroundEmphasized!") } + @objc open var colorBorderBrandPrimaryOnBgEmphasized: ColorSemanticToken { fatalError("🤖 Raw token unavailable for colorBorderBrandPrimaryOnBgEmphasized!") } // WARNING: #124 - Colors to use are part of Orange Theme so are not reachable at this level, as a workaround add raw values @objc open var colorBorderBrandPrimary: ColorSemanticToken { fatalError("🤖 Raw token unavailable for colorBorderBrandPrimary!") } @@ -184,11 +184,11 @@ extension OUDSTheme: ColorSemanticTokens { @objc open var colorBorderStatusAccent: ColorSemanticToken { fatalError("🤖 No value defined for colorBorderStatusAccent!") } - @objc open var colorBorderOnBackgroundBrandPrimary: ColorSemanticToken { MultipleColorTokens(light: ColorRawTokens.colorFunctionalWhite, dark: ColorRawTokens.colorFunctionalBlack) } + @objc open var colorBorderOnBgBrandPrimary: ColorSemanticToken { MultipleColorTokens(light: ColorRawTokens.colorFunctionalWhite, dark: ColorRawTokens.colorFunctionalBlack) } - @objc open var colorBorderOnBackgroundBrandSecondary: ColorSemanticToken { fatalError("🤖 No value defined for colorBorderOnBackgroundBrandSecondary!") } + @objc open var colorBorderOnBgBrandSecondary: ColorSemanticToken { fatalError("🤖 No value defined for colorBorderOnBgBrandSecondary!") } - @objc open var colorBorderOnBackgroundBrandTertiary: ColorSemanticToken { fatalError("🤖 No value defined for colorBorderOnBackgroundBrandTertiary!") } + @objc open var colorBorderOnBgBrandTertiary: ColorSemanticToken { fatalError("🤖 No value defined for colorBorderOnBgBrandTertiary!") } // MARK: Semantic token - Colors - Action @@ -196,59 +196,59 @@ extension OUDSTheme: ColorSemanticTokens { @objc open var colorActionSelected: ColorSemanticToken { fatalError("🤖 Raw token unavailable for colorActionSelected!") } // WARNING: #124 - Colors to use are part of Orange Theme so are not reachable at this level, as a workaround add raw values - @objc open var colorActionSelectedOnBackgroundEmphasized: ColorSemanticToken { fatalError("🤖 Raw token unavailable for colorActionSelectedOnBackgroundEmphasized!") } + @objc open var colorActionSelectedOnBgEmphasized: ColorSemanticToken { fatalError("🤖 Raw token unavailable for colorActionSelectedOnBgEmphasized!") } @objc open var colorActionDisabled: ColorSemanticToken { MultipleColorTokens(light: ColorRawTokens.colorFunctionalLightGray400, dark: ColorRawTokens.colorFunctionalDarkGray400) } - @objc open var colorActionDisabledOnBackgroundEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalDarkGray400) } + @objc open var colorActionDisabledOnBgEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalDarkGray400) } @objc open var colorActionVisited: ColorSemanticToken { MultipleColorTokens(light: ColorRawTokens.colorDecorativeAmethyst600, dark: ColorRawTokens.colorDecorativeAmethyst400) } - @objc open var colorActionVistedOnBackgroundEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorDecorativeAmethyst400) } + @objc open var colorActionVistedOnBgEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorDecorativeAmethyst400) } @objc open var colorActionPrimaryEnabled: ColorSemanticToken { MultipleColorTokens(light: ColorRawTokens.colorFunctionalBlack, dark: ColorRawTokens.colorFunctionalLightGray160) } - @objc open var colorActionPrimaryEnabledOnBackgroundEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalLightGray160) } + @objc open var colorActionPrimaryEnabledOnBgEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalLightGray160) } @objc open var colorActionPrimaryHover: ColorSemanticToken { MultipleColorTokens(light: ColorRawTokens.colorFunctionalDarkGray400, dark: ColorRawTokens.colorFunctionalLightGray400) } - @objc open var colorActionPrimaryHoverOnBackgroundEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalLightGray400) } + @objc open var colorActionPrimaryHoverOnBgEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalLightGray400) } // WARNING: #124 - Colors to use are part of Orange Theme so are not reachable at this level, as a workaround add raw values @objc open var colorActionPrimaryPressed: ColorSemanticToken { fatalError("🤖 Raw token unavailable for colorActionPrimaryPressed!") } // WARNING: #124 - Colors to use are part of Orange Theme so are not reachable at this level, as a workaround add raw values - @objc open var colorActionPrimaryPressedOnBackgroundEmphasized: ColorSemanticToken { fatalError("🤖 Raw token unavailable for colorActionPrimaryPressedOnBackgroundEmphasized!") } + @objc open var colorActionPrimaryPressedOnBgEmphasized: ColorSemanticToken { fatalError("🤖 Raw token unavailable for colorActionPrimaryPressedOnBgEmphasized!") } // WARNING: #124 - Colors to use are part of Orange Theme so are not reachable at this level, as a workaround add raw values @objc open var colorActionPrimaryLoading: ColorSemanticToken { fatalError("🤖 Raw token unavailable for colorActionPrimaryLoading!") } // WARNING: #124 - Colors to use are part of Orange Theme so are not reachable at this level, as a workaround add raw values - @objc open var colorActionPrimaryLoadingOnBackgroundEmphasized: ColorSemanticToken { fatalError("🤖 Raw token unavailable for colorActionPrimaryLoadingOnBackgroundEmphasized!") } + @objc open var colorActionPrimaryLoadingOnBgEmphasized: ColorSemanticToken { fatalError("🤖 Raw token unavailable for colorActionPrimaryLoadingOnBgEmphasized!") } @objc open var colorActionPrimaryFocus: ColorSemanticToken { MultipleColorTokens(light: ColorRawTokens.colorFunctionalDarkGray400, dark: ColorRawTokens.colorFunctionalLightGray400) } - @objc open var colorActionPrimaryFocusOnBackgroundEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalLightGray400) } + @objc open var colorActionPrimaryFocusOnBgEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalLightGray400) } @objc open var colorActionSecondaryEnabled: ColorSemanticToken { MultipleColorTokens(light: ColorRawTokens.colorFunctionalLightGray80, dark: ColorRawTokens.colorFunctionalLightGray160) } - @objc open var colorActionSecondaryEnabledOnBackgroundEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalDarkGray720) } + @objc open var colorActionSecondaryEnabledOnBgEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalDarkGray720) } @objc open var colorActionSecondaryHover: ColorSemanticToken { MultipleColorTokens(light: ColorRawTokens.colorFunctionalLightGray160, dark: ColorRawTokens.colorFunctionalDarkGray640) } - @objc open var colorActionSecondaryHoverOnBackgroundEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalLightGray160) } + @objc open var colorActionSecondaryHoverOnBgEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalLightGray160) } @objc open var colorActionSecondaryPressed: ColorSemanticToken { MultipleColorTokens(light: ColorRawTokens.colorFunctionalLightGray160, dark: ColorRawTokens.colorFunctionalDarkGray640) } - @objc open var colorActionSecondaryPressedOnBackgroundEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalDarkGray640) } + @objc open var colorActionSecondaryPressedOnBgEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalDarkGray640) } @objc open var colorActionSecondaryLoading: ColorSemanticToken { MultipleColorTokens(light: ColorRawTokens.colorFunctionalLightGray160, dark: ColorRawTokens.colorFunctionalDarkGray640) } - @objc open var colorActionSecondaryLoadingOnBackgroundEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalDarkGray640) } + @objc open var colorActionSecondaryLoadingOnBgEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalDarkGray640) } @objc open var colorActionSecondaryFocus: ColorSemanticToken { MultipleColorTokens(light: ColorRawTokens.colorFunctionalLightGray160, dark: ColorRawTokens.colorFunctionalDarkGray640) } - @objc open var colorActionSecondaryFocusOnBackgroundEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalDarkGray640) } + @objc open var colorActionSecondaryFocusOnBgEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalDarkGray640) } @objc open var colorActionNegativeEnabled: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalScarlet600) } @@ -260,51 +260,51 @@ extension OUDSTheme: ColorSemanticTokens { @objc open var colorActionNegativeFocus: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalScarlet700) } - @objc open var colorActionOnBackgroundActionDisabled: ColorSemanticToken { MultipleColorTokens(light: ColorRawTokens.colorFunctionalWhite, dark: ColorRawTokens.colorFunctionalBlack) } + @objc open var colorActionOnBgActionDisabled: ColorSemanticToken { MultipleColorTokens(light: ColorRawTokens.colorFunctionalWhite, dark: ColorRawTokens.colorFunctionalBlack) } - @objc open var colorActionOnBackgroundActionDisabledOnBackgroundEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalBlack) } + @objc open var colorActionOnBgActionDisabledOnBgEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalBlack) } - @objc open var colorActionOnBackgroundActionNegative: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalWhite) } + @objc open var colorActionOnBgActionNegative: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalWhite) } - @objc open var colorActionOnBackgroundActionPrimaryEnabled: ColorSemanticToken { MultipleColorTokens(light: ColorRawTokens.colorFunctionalWhite, dark: ColorRawTokens.colorFunctionalBlack) } + @objc open var colorActionOnBgActionPrimaryEnabled: ColorSemanticToken { MultipleColorTokens(light: ColorRawTokens.colorFunctionalWhite, dark: ColorRawTokens.colorFunctionalBlack) } - @objc open var colorActionOnBackgroundActionPrimaryEnabledOnBackgroundEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalBlack) } + @objc open var colorActionOnBgActionPrimaryEnabledOnBgEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalBlack) } - @objc open var colorActionOnBackgroundActionPrimaryHover: ColorSemanticToken { MultipleColorTokens(light: ColorRawTokens.colorFunctionalWhite, dark: ColorRawTokens.colorFunctionalBlack) } + @objc open var colorActionOnBgActionPrimaryHover: ColorSemanticToken { MultipleColorTokens(light: ColorRawTokens.colorFunctionalWhite, dark: ColorRawTokens.colorFunctionalBlack) } - @objc open var colorActionOnBackgroundActionPrimaryHoverOnBackgroundEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalBlack) } + @objc open var colorActionOnBgActionPrimaryHoverOnBgEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalBlack) } - @objc open var colorActionOnBackgroundActionPrimaryPressed: ColorSemanticToken { MultipleColorTokens(light: ColorRawTokens.colorFunctionalWhite, dark: ColorRawTokens.colorFunctionalBlack) } + @objc open var colorActionOnBgActionPrimaryPressed: ColorSemanticToken { MultipleColorTokens(light: ColorRawTokens.colorFunctionalWhite, dark: ColorRawTokens.colorFunctionalBlack) } - @objc open var colorActionOnBackgroundActionPrimaryPressedOnBackgroundEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalBlack) } + @objc open var colorActionOnBgActionPrimaryPressedOnBgEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalBlack) } - @objc open var colorActionOnBackgroundActionPrimaryLoading: ColorSemanticToken { MultipleColorTokens(light: ColorRawTokens.colorFunctionalWhite, dark: ColorRawTokens.colorFunctionalBlack) } + @objc open var colorActionOnBgActionPrimaryLoading: ColorSemanticToken { MultipleColorTokens(light: ColorRawTokens.colorFunctionalWhite, dark: ColorRawTokens.colorFunctionalBlack) } - @objc open var colorActionOnBackgroundActionPrimaryLoadingOnBackgroundEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalBlack) } + @objc open var colorActionOnBgActionPrimaryLoadingOnBgEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalBlack) } - @objc open var colorActionOnBackgroundActionPrimaryFocus: ColorSemanticToken { MultipleColorTokens(light: ColorRawTokens.colorFunctionalWhite, dark: ColorRawTokens.colorFunctionalBlack) } + @objc open var colorActionOnBgActionPrimaryFocus: ColorSemanticToken { MultipleColorTokens(light: ColorRawTokens.colorFunctionalWhite, dark: ColorRawTokens.colorFunctionalBlack) } - @objc open var colorActionOnBackgroundActionPrimaryFocusOnBackgroundEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalBlack) } + @objc open var colorActionOnBgActionPrimaryFocusOnBgEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalBlack) } - @objc open var colorActionOnBackgroundActionSecondaryEnabled: ColorSemanticToken { fatalError("🤖 No value defined for colorActionOnBackgroundActionSecondaryEnabled!") } + @objc open var colorActionOnBgActionSecondaryEnabled: ColorSemanticToken { fatalError("🤖 No value defined for colorActionOnBgActionSecondaryEnabled!") } - @objc open var colorActionOnBackgroundActionSecondaryEnabledOnBackgroundEmphasized: ColorSemanticToken { fatalError("🤖 No value defined for colorActionOnBackgroundActionSecondaryEnabledOnBackgroundEmphasized!") } + @objc open var colorActionOnBgActionSecondaryEnabledOnBgEmphasized: ColorSemanticToken { fatalError("🤖 No value defined for colorActionOnBgActionSecondaryEnabledOnBgEmphasized!") } - @objc open var colorActionOnBackgroundActionSecondaryHover: ColorSemanticToken { fatalError("🤖 No value defined for colorActionOnBackgroundActionSecondaryHover!") } + @objc open var colorActionOnBgActionSecondaryHover: ColorSemanticToken { fatalError("🤖 No value defined for colorActionOnBgActionSecondaryHover!") } - @objc open var colorActionOnBackgroundActionSecondaryHoverOnBackgroundEmphasized: ColorSemanticToken { fatalError("🤖 No value defined for colorActionOnBackgroundActionSecondaryHoverOnBackgroundEmphasized!") } + @objc open var colorActionOnBgActionSecondaryHoverOnBgEmphasized: ColorSemanticToken { fatalError("🤖 No value defined for colorActionOnBgActionSecondaryHoverOnBgEmphasized!") } - @objc open var colorActionOnBackgroundActionSecondaryPressed: ColorSemanticToken { fatalError("🤖 No value defined for colorActionOnBackgroundActionSecondaryPressed!") } + @objc open var colorActionOnBgActionSecondaryPressed: ColorSemanticToken { fatalError("🤖 No value defined for colorActionOnBgActionSecondaryPressed!") } - @objc open var colorActionOnBackgroundActionSecondaryPressedOnBackgroundEmphasized: ColorSemanticToken { fatalError("🤖 No value defined for colorActionOnBackgroundActionSecondaryPressedOnBackgroundEmphasized!") } + @objc open var colorActionOnBgActionSecondaryPressedOnBgEmphasized: ColorSemanticToken { fatalError("🤖 No value defined for colorActionOnBgActionSecondaryPressedOnBgEmphasized!") } - @objc open var colorActionOnBackgroundActionSecondaryLoading: ColorSemanticToken { fatalError("🤖 No value defined for colorActionOnBackgroundActionSecondaryLoading!") } + @objc open var colorActionOnBgActionSecondaryLoading: ColorSemanticToken { fatalError("🤖 No value defined for colorActionOnBgActionSecondaryLoading!") } - @objc open var colorActionOnBackgroundActionSecondaryLoadingOnBackgroundEmphasized: ColorSemanticToken { fatalError("🤖 No value defined for colorActionOnBackgroundActionSecondaryLoadingOnBackgroundEmphasized!") } + @objc open var colorActionOnBgActionSecondaryLoadingOnBgEmphasized: ColorSemanticToken { fatalError("🤖 No value defined for colorActionOnBgActionSecondaryLoadingOnBgEmphasized!") } - @objc open var colorActionOnBackgroundActionSecondaryFocus: ColorSemanticToken { fatalError("🤖 No value defined for colorActionOnBackgroundActionSecondaryFocus!") } + @objc open var colorActionOnBgActionSecondaryFocus: ColorSemanticToken { fatalError("🤖 No value defined for colorActionOnBgActionSecondaryFocus!") } - @objc open var colorActionOnBackgroundActionSecondaryFocusOnBackgroundEmphasized: ColorSemanticToken { fatalError("🤖 No value defined for colorActionOnBackgroundActionSecondaryFocusOnBackgroundEmphasized!") } + @objc open var colorActionOnBgActionSecondaryFocusOnBgEmphasized: ColorSemanticToken { fatalError("🤖 No value defined for colorActionOnBgActionSecondaryFocusOnBgEmphasized!") } // MARK: Semantic token - Colors - Always @@ -322,19 +322,19 @@ extension OUDSTheme: ColorSemanticTokens { @objc open var colorAlwaysAccent: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalSun500) } - @objc open var colorAlwaysOnBackgroundBlack: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalWhite) } + @objc open var colorAlwaysOnBgBlack: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalWhite) } - @objc open var colorAlwaysOnBackgroundWhite: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalBlack) } + @objc open var colorAlwaysOnBgWhite: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalBlack) } - @objc open var colorAlwaysOnBackgroundWarning: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalBlack) } + @objc open var colorAlwaysOnBgWarning: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalBlack) } - @objc open var colorAlwaysOnBackgroundNegative: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalWhite) } + @objc open var colorAlwaysOnBgNegative: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalWhite) } - @objc open var colorAlwaysOnBackgroundPositive: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalBlack) } + @objc open var colorAlwaysOnBgPositive: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalBlack) } - @objc open var colorAlwaysOnBackgroundInfo: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalBlack) } + @objc open var colorAlwaysOnBgInfo: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalBlack) } - @objc open var colorAlwaysOnBackgroundAccent: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalBlack) } + @objc open var colorAlwaysOnBgAccent: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalBlack) } // MARK: Semantic token - Colors - Transparent @@ -344,50 +344,38 @@ extension OUDSTheme: ColorSemanticTokens { @objc open var colorElevationRaised: ColorSemanticToken { MultipleColorTokens(light: ColorRawTokens.colorFunctionalWhite, dark: ColorRawTokens.colorFunctionalDarkGray800) } - @objc open var colorElevationRaisedOnBackgroundSecondary: ColorSemanticToken { MultipleColorTokens(light: ColorRawTokens.colorFunctionalWhite, dark: ColorRawTokens.colorFunctionalDarkGray720) } + @objc open var colorElevationRaisedOnBgSecondary: ColorSemanticToken { MultipleColorTokens(light: ColorRawTokens.colorFunctionalWhite, dark: ColorRawTokens.colorFunctionalDarkGray720) } - @objc open var colorElevationRaisedOnBackgroundEmphasized: ColorSemanticToken { MultipleColorTokens(light: ColorRawTokens.colorFunctionalDarkGray800, dark: ColorRawTokens.colorFunctionalDarkGray560) } + @objc open var colorElevationRaisedOnBgEmphasized: ColorSemanticToken { MultipleColorTokens(light: ColorRawTokens.colorFunctionalDarkGray800, dark: ColorRawTokens.colorFunctionalDarkGray560) } @objc open var colorElevationDrag: ColorSemanticToken { MultipleColorTokens(light: ColorRawTokens.colorFunctionalLightGray80, dark: ColorRawTokens.colorFunctionalDarkGray720) } - @objc open var colorElevationDragOnBackgroundSecondary: ColorSemanticToken { MultipleColorTokens(light: ColorRawTokens.colorFunctionalLightGray80, dark: ColorRawTokens.colorFunctionalDarkGray640) } + @objc open var colorElevationDragOnBgSecondary: ColorSemanticToken { MultipleColorTokens(light: ColorRawTokens.colorFunctionalLightGray80, dark: ColorRawTokens.colorFunctionalDarkGray640) } - @objc open var colorElevationDragOnBackgroundEmphasized: ColorSemanticToken { MultipleColorTokens(light: ColorRawTokens.colorFunctionalDarkGray720, dark: ColorRawTokens.colorFunctionalDarkGray480) } + @objc open var colorElevationDragOnBgEmphasized: ColorSemanticToken { MultipleColorTokens(light: ColorRawTokens.colorFunctionalDarkGray720, dark: ColorRawTokens.colorFunctionalDarkGray480) } @objc open var colorElevationOverlayDefault: ColorSemanticToken { MultipleColorTokens(light: ColorRawTokens.colorFunctionalWhite, dark: ColorRawTokens.colorFunctionalDarkGray720) } - @objc open var colorElevationOverlayDefaultOnBackgroundSecondary: ColorSemanticToken { MultipleColorTokens(light: ColorRawTokens.colorFunctionalWhite, dark: ColorRawTokens.colorFunctionalDarkGray640) } + @objc open var colorElevationOverlayDefaultOnBgSecondary: ColorSemanticToken { MultipleColorTokens(light: ColorRawTokens.colorFunctionalWhite, dark: ColorRawTokens.colorFunctionalDarkGray640) } - @objc open var colorElevationOverlayDefaultOnBackgroundEmphasized: ColorSemanticToken { MultipleColorTokens(light: ColorRawTokens.colorFunctionalDarkGray720, dark: ColorRawTokens.colorFunctionalDarkGray480) } + @objc open var colorElevationOverlayDefaultOnBgEmphasized: ColorSemanticToken { MultipleColorTokens(light: ColorRawTokens.colorFunctionalDarkGray720, dark: ColorRawTokens.colorFunctionalDarkGray480) } @objc open var colorElevationOverlayEmphasized: ColorSemanticToken { MultipleColorTokens(light: ColorRawTokens.colorFunctionalDarkGray640, dark: ColorRawTokens.colorFunctionalDarkGray480) } - @objc open var colorElevationOverlayEmphasizedOnBackgroundSecondary: ColorSemanticToken { MultipleColorTokens(light: ColorRawTokens.colorFunctionalDarkGray640, dark: ColorRawTokens.colorFunctionalDarkGray480) } + @objc open var colorElevationOverlayEmphasizedOnBgSecondary: ColorSemanticToken { MultipleColorTokens(light: ColorRawTokens.colorFunctionalDarkGray640, dark: ColorRawTokens.colorFunctionalDarkGray480) } - @objc open var colorElevationOverlayEmphasizedOnBackgroundEmphasized: ColorSemanticToken { MultipleColorTokens(light: ColorRawTokens.colorFunctionalLightGray80, dark: ColorRawTokens.colorFunctionalDarkGray480) } + @objc open var colorElevationOverlayEmphasizedOnBgEmphasized: ColorSemanticToken { MultipleColorTokens(light: ColorRawTokens.colorFunctionalLightGray80, dark: ColorRawTokens.colorFunctionalDarkGray480) } @objc open var colorElevationModal: ColorSemanticToken { MultipleColorTokens(light: ColorRawTokens.colorFunctionalWhite, dark: ColorRawTokens.colorFunctionalDarkGray640) } // MARK: Semantic token - Colors - Decorative // WARNING: #124 - Colors to use are part of Orange Theme so are not reachable at this level, as a workaround add raw values - @objc open var colorDecorativeBrandPrimary: ColorSemanticToken { fatalError("🤖 Raw token unavailable for colorDecorativeBrandPrimary!") } - - @objc open var colorDecorativeBrandPrimaryMuted: ColorSemanticToken { fatalError("🤖 No value defined for colorDecorativeBrandPrimaryMuted!") } - - @objc open var colorDecorativeBrandPrimaryEmphasized: ColorSemanticToken { fatalError("🤖 No value defined for colorDecorativeBrandPrimaryEmphasized!") } + @objc open var colorDecorativePrimary: ColorSemanticToken { fatalError("🤖 Raw token unavailable for colorDecorativePrimary!") } @objc open var colorDecorativeSecondary: ColorSemanticToken { MultipleColorTokens(light: ColorRawTokens.colorFunctionalBlack, dark: ColorRawTokens.colorFunctionalLightGray160) } - @objc open var colorDecorativeSecondaryMuted: ColorSemanticToken { fatalError("🤖 No value defined for colorDecorativeSecondaryMuted!") } - - @objc open var colorDecorativeSecondaryEmphasized: ColorSemanticToken { fatalError("🤖 No value defined for colorDecorativeSecondaryEmphasized!") } - - @objc open var colorDecorativeBrandTertiary: ColorSemanticToken { MultipleColorTokens(light: ColorRawTokens.colorFunctionalBlack, dark: ColorRawTokens.colorFunctionalDarkGray880) } - - @objc open var colorDecorativeBrandTertiaryMuted: ColorSemanticToken { fatalError("🤖 No value defined for colorDecorativeBrandTertiaryMuted!") } - - @objc open var colorDecorativeBrandTertiaryEmphasized: ColorSemanticToken { fatalError("🤖 No value defined for colorDecorativeBrandTertiaryEmphasized!") } + @objc open var colorDecorativeTertiary: ColorSemanticToken { MultipleColorTokens(light: ColorRawTokens.colorFunctionalBlack, dark: ColorRawTokens.colorFunctionalDarkGray880) } @objc open var colorDecorativeNeutralMuted: ColorSemanticToken { MultipleColorTokens(light: ColorRawTokens.colorFunctionalLightGray160, dark: ColorRawTokens.colorFunctionalDarkGray560) } @@ -425,23 +413,23 @@ extension OUDSTheme: ColorSemanticTokens { @objc open var colorDecorativeAccent5Emphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorDecorativeShockingPink300) } - @objc open var colorDecorativeSkintTint100: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorDecorativeDeepPeach100) } + @objc open var colorDecorativeSkinTint100: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorDecorativeDeepPeach100) } - @objc open var colorDecorativeSkintTint200: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorDecorativeDeepPeach200) } + @objc open var colorDecorativeSkinTint200: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorDecorativeDeepPeach200) } - @objc open var colorDecorativeSkintTint300: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorDecorativeDeepPeach300) } + @objc open var colorDecorativeSkinTint300: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorDecorativeDeepPeach300) } - @objc open var colorDecorativeSkintTint400: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorDecorativeDeepPeach400) } + @objc open var colorDecorativeSkinTint400: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorDecorativeDeepPeach400) } - @objc open var colorDecorativeSkintTint500: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorDecorativeDeepPeach500) } + @objc open var colorDecorativeSkinTint500: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorDecorativeDeepPeach500) } - @objc open var colorDecorativeSkintTint600: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorDecorativeDeepPeach600) } + @objc open var colorDecorativeSkinTint600: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorDecorativeDeepPeach600) } - @objc open var colorDecorativeSkintTint700: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorDecorativeDeepPeach700) } + @objc open var colorDecorativeSkinTint700: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorDecorativeDeepPeach700) } - @objc open var colorDecorativeSkintTint800: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorDecorativeDeepPeach800) } + @objc open var colorDecorativeSkinTint800: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorDecorativeDeepPeach800) } - @objc open var colorDecorativeSkintTint900: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorDecorativeDeepPeach900) } + @objc open var colorDecorativeSkinTint900: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorDecorativeDeepPeach900) } // MARK: Semantic token - Colors - Chart diff --git a/OUDS/Core/OUDS/Tests/OUDSTheme/MockThemes/MockTheme+ColorSemanticTokens.swift b/OUDS/Core/OUDS/Tests/OUDSTheme/MockThemes/MockTheme+ColorSemanticTokens.swift index cbc7cdee7..8ebb57514 100644 --- a/OUDS/Core/OUDS/Tests/OUDSTheme/MockThemes/MockTheme+ColorSemanticTokens.swift +++ b/OUDS/Core/OUDS/Tests/OUDSTheme/MockThemes/MockTheme+ColorSemanticTokens.swift @@ -39,35 +39,35 @@ extension MockTheme { override open var colorBackgroundStatusNeutral: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - override open var colorBackgroundStatusNeutralOnBackgroundEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorBackgroundStatusNeutralOnBgEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } override open var colorBackgroundStatusPositiveMuted: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - override open var colorBackgroundStatusPositiveMutedOnBackgroundEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorBackgroundStatusPositiveMutedOnBgEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } override open var colorBackgroundStatusPositiveEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } override open var colorBackgroundStatusInfoMuted: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - override open var colorBackgroundStatusInfoMutedOnBackgroundEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorBackgroundStatusInfoMutedOnBgEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } override open var colorBackgroundStatusInfoEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } override open var colorBackgroundStatusWarningMuted: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - override open var colorBackgroundStatusWarningMutedOnBackgroundEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorBackgroundStatusWarningMutedOnBgEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } override open var colorBackgroundStatusWarningEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } override open var colorBackgroundStatusNegativeMuted: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - override open var colorBackgroundStatusNegativeMutedOnBackgroundEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorBackgroundStatusNegativeMutedOnBgEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } override open var colorBackgroundStatusNegativeEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } override open var colorBackgroundStatusAccentMuted: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - override open var colorBackgroundStatusAccentMutedOnBackgroundEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorBackgroundStatusAccentMutedOnBgEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } override open var colorBackgroundStatusAccentEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } @@ -75,15 +75,15 @@ extension MockTheme { override open var colorContentDefault: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - override open var colorContentContentDefaultOnBackgroundEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorContentContentDefaultOnBgEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } override open var colorContentMuted: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - override open var colorContentContentMutedOnBackgroundEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorContentContentMutedOnBgEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } override open var colorContentDisabled: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - override open var colorContentContentDisabledOnBackgroundEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorContentContentDisabledOnBgEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } override open var colorContentBrandPrimary: ColorSemanticToken { Self.mockThemeMultipleColorTokens } @@ -103,55 +103,55 @@ extension MockTheme { // MARK: Semantic token - Colors - Content - On Background - override open var colorContentOnBackgroundPrimary: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorContentOnBgPrimary: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - override open var colorContentOnBackgroundSecondary: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorContentOnBgSecondary: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - override open var colorContentOnBackgroundTertiary: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorContentOnBgTertiary: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - override open var colorContentOnBackgroundStatusPositiveMuted: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorContentOnBgStatusPositiveMuted: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - override open var colorContentOnBackgroundStatusPositiveMutedOnBackgroundEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorContentOnBgStatusPositiveMutedOnBgEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - override open var colorContentOnBackgroundStatusPositiveEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorContentOnBgStatusPositiveEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - override open var colorContentOnBackgroundStatusInfoMuted: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorContentOnBgStatusInfoMuted: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - override open var colorContentOnBackgroundStatusInfoMutedOnBackgroundEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorContentOnBgStatusInfoMutedOnBgEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - override open var colorContentOnBackgroundStatusInfoEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorContentOnBgStatusInfoEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - override open var colorContentOnBackgroundStatusWarningMuted: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorContentOnBgStatusWarningMuted: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - override open var colorContentOnBackgroundStatusWarningMutedOnBackgroundEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorContentOnBgStatusWarningMutedOnBgEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - override open var colorContentOnBackgroundStatusWarningEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorContentOnBgStatusWarningEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - override open var colorContentOnBackgroundStatusNegativeMuted: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorContentOnBgStatusNegativeMuted: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - override open var colorContentOnBackgroundStatusNegativeMutedOnBackgroundEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorContentOnBgStatusNegativeMutedOnBgEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - override open var colorContentOnBackgroundStatusNegativeEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorContentOnBgStatusNegativeEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - override open var colorContentOnBackgroundStatusAccentMuted: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorContentOnBgStatusAccentMuted: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - override open var colorContentOnBackgroundStatusAccentMutedOnBackgroundEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorContentOnBgStatusAccentMutedOnBgEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - override open var colorContentOnBackgroundStatusAccentedEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorContentOnBgStatusAccentedEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } // MARK: Semantic token - Colors - Border override open var colorBorderDefault: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - override open var colorBorderDefaultOnBackgroundEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorBorderDefaultOnBgEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } override open var colorBorderEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - override open var colorBorderEmphasizedOnBackgroundEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorBorderEmphasizedOnBgEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } override open var colorBorderFocus: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - override open var colorBorderBrandPrimaryOnBackgroundEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorBorderBrandPrimaryOnBgEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } override open var colorBorderBrandPrimary: ColorSemanticToken { Self.mockThemeMultipleColorTokens } @@ -169,65 +169,65 @@ extension MockTheme { override open var colorBorderStatusAccent: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - override open var colorBorderOnBackgroundBrandPrimary: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorBorderOnBgBrandPrimary: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - override open var colorBorderOnBackgroundBrandSecondary: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorBorderOnBgBrandSecondary: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - override open var colorBorderOnBackgroundBrandTertiary: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorBorderOnBgBrandTertiary: ColorSemanticToken { Self.mockThemeMultipleColorTokens } // MARK: Semantic token - Colors - Action override open var colorActionSelected: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - override open var colorActionSelectedOnBackgroundEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorActionSelectedOnBgEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } override open var colorActionDisabled: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - override open var colorActionDisabledOnBackgroundEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorActionDisabledOnBgEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } override open var colorActionVisited: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - override open var colorActionVistedOnBackgroundEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorActionVistedOnBgEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } override open var colorActionPrimaryEnabled: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - override open var colorActionPrimaryEnabledOnBackgroundEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorActionPrimaryEnabledOnBgEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } override open var colorActionPrimaryHover: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - override open var colorActionPrimaryHoverOnBackgroundEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorActionPrimaryHoverOnBgEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } override open var colorActionPrimaryPressed: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - override open var colorActionPrimaryPressedOnBackgroundEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorActionPrimaryPressedOnBgEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } override open var colorActionPrimaryLoading: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - override open var colorActionPrimaryLoadingOnBackgroundEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorActionPrimaryLoadingOnBgEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } override open var colorActionPrimaryFocus: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - override open var colorActionPrimaryFocusOnBackgroundEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorActionPrimaryFocusOnBgEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } override open var colorActionSecondaryEnabled: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - override open var colorActionSecondaryEnabledOnBackgroundEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorActionSecondaryEnabledOnBgEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } override open var colorActionSecondaryHover: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - override open var colorActionSecondaryHoverOnBackgroundEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorActionSecondaryHoverOnBgEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } override open var colorActionSecondaryPressed: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - override open var colorActionSecondaryPressedOnBackgroundEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorActionSecondaryPressedOnBgEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } override open var colorActionSecondaryLoading: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - override open var colorActionSecondaryLoadingOnBackgroundEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorActionSecondaryLoadingOnBgEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } override open var colorActionSecondaryFocus: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - override open var colorActionSecondaryFocusOnBackgroundEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorActionSecondaryFocusOnBgEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } override open var colorActionNegativeEnabled: ColorSemanticToken { Self.mockThemeMultipleColorTokens } @@ -239,51 +239,51 @@ extension MockTheme { override open var colorActionNegativeFocus: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - override open var colorActionOnBackgroundActionDisabled: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorActionOnBgActionDisabled: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - override open var colorActionOnBackgroundActionDisabledOnBackgroundEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorActionOnBgActionDisabledOnBgEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - override open var colorActionOnBackgroundActionNegative: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorActionOnBgActionNegative: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - override open var colorActionOnBackgroundActionPrimaryEnabled: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorActionOnBgActionPrimaryEnabled: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - override open var colorActionOnBackgroundActionPrimaryEnabledOnBackgroundEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorActionOnBgActionPrimaryEnabledOnBgEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - override open var colorActionOnBackgroundActionPrimaryHover: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorActionOnBgActionPrimaryHover: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - override open var colorActionOnBackgroundActionPrimaryHoverOnBackgroundEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorActionOnBgActionPrimaryHoverOnBgEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - override open var colorActionOnBackgroundActionPrimaryPressed: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorActionOnBgActionPrimaryPressed: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - override open var colorActionOnBackgroundActionPrimaryPressedOnBackgroundEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorActionOnBgActionPrimaryPressedOnBgEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - override open var colorActionOnBackgroundActionPrimaryLoading: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorActionOnBgActionPrimaryLoading: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - override open var colorActionOnBackgroundActionPrimaryLoadingOnBackgroundEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorActionOnBgActionPrimaryLoadingOnBgEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - override open var colorActionOnBackgroundActionPrimaryFocus: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorActionOnBgActionPrimaryFocus: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - override open var colorActionOnBackgroundActionPrimaryFocusOnBackgroundEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorActionOnBgActionPrimaryFocusOnBgEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - override open var colorActionOnBackgroundActionSecondaryEnabled: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorActionOnBgActionSecondaryEnabled: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - override open var colorActionOnBackgroundActionSecondaryEnabledOnBackgroundEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorActionOnBgActionSecondaryEnabledOnBgEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - override open var colorActionOnBackgroundActionSecondaryHover: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorActionOnBgActionSecondaryHover: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - override open var colorActionOnBackgroundActionSecondaryHoverOnBackgroundEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorActionOnBgActionSecondaryHoverOnBgEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - override open var colorActionOnBackgroundActionSecondaryPressed: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorActionOnBgActionSecondaryPressed: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - override open var colorActionOnBackgroundActionSecondaryPressedOnBackgroundEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorActionOnBgActionSecondaryPressedOnBgEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - override open var colorActionOnBackgroundActionSecondaryLoading: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorActionOnBgActionSecondaryLoading: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - override open var colorActionOnBackgroundActionSecondaryLoadingOnBackgroundEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorActionOnBgActionSecondaryLoadingOnBgEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - override open var colorActionOnBackgroundActionSecondaryFocus: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorActionOnBgActionSecondaryFocus: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - override open var colorActionOnBackgroundActionSecondaryFocusOnBackgroundEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorActionOnBgActionSecondaryFocusOnBgEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } // MARK: Semantic token - Colors - Always @@ -301,19 +301,19 @@ extension MockTheme { override open var colorAlwaysAccent: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - override open var colorAlwaysOnBackgroundBlack: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorAlwaysOnBgBlack: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - override open var colorAlwaysOnBackgroundWhite: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorAlwaysOnBgWhite: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - override open var colorAlwaysOnBackgroundWarning: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorAlwaysOnBgWarning: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - override open var colorAlwaysOnBackgroundNegative: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorAlwaysOnBgNegative: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - override open var colorAlwaysOnBackgroundPositive: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorAlwaysOnBgPositive: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - override open var colorAlwaysOnBackgroundInfo: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorAlwaysOnBgInfo: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - override open var colorAlwaysOnBackgroundAccent: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorAlwaysOnBgAccent: ColorSemanticToken { Self.mockThemeMultipleColorTokens } // MARK: Semantic token - Colors - Transparent @@ -323,49 +323,37 @@ extension MockTheme { override open var colorElevationRaised: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - override open var colorElevationRaisedOnBackgroundSecondary: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorElevationRaisedOnBgSecondary: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - override open var colorElevationRaisedOnBackgroundEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorElevationRaisedOnBgEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } override open var colorElevationDrag: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - override open var colorElevationDragOnBackgroundSecondary: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorElevationDragOnBgSecondary: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - override open var colorElevationDragOnBackgroundEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorElevationDragOnBgEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } override open var colorElevationOverlayDefault: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - override open var colorElevationOverlayDefaultOnBackgroundSecondary: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorElevationOverlayDefaultOnBgSecondary: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - override open var colorElevationOverlayDefaultOnBackgroundEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorElevationOverlayDefaultOnBgEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } override open var colorElevationOverlayEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - override open var colorElevationOverlayEmphasizedOnBackgroundSecondary: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorElevationOverlayEmphasizedOnBgSecondary: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - override open var colorElevationOverlayEmphasizedOnBackgroundEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorElevationOverlayEmphasizedOnBgEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } override open var colorElevationModal: ColorSemanticToken { Self.mockThemeMultipleColorTokens } // MARK: Semantic token - Colors - Decorative - override open var colorDecorativeBrandPrimary: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - - override open var colorDecorativeBrandPrimaryMuted: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - - override open var colorDecorativeBrandPrimaryEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorDecorativePrimary: ColorSemanticToken { Self.mockThemeMultipleColorTokens } override open var colorDecorativeSecondary: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - override open var colorDecorativeSecondaryMuted: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - - override open var colorDecorativeSecondaryEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - - override open var colorDecorativeBrandTertiary: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - - override open var colorDecorativeBrandTertiaryMuted: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - - override open var colorDecorativeBrandTertiaryEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorDecorativeTertiary: ColorSemanticToken { Self.mockThemeMultipleColorTokens } override open var colorDecorativeNeutralMuted: ColorSemanticToken { Self.mockThemeMultipleColorTokens } @@ -403,23 +391,23 @@ extension MockTheme { override open var colorDecorativeAccent5Emphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - override open var colorDecorativeSkintTint100: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorDecorativeSkinTint100: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - override open var colorDecorativeSkintTint200: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorDecorativeSkinTint200: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - override open var colorDecorativeSkintTint300: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorDecorativeSkinTint300: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - override open var colorDecorativeSkintTint400: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorDecorativeSkinTint400: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - override open var colorDecorativeSkintTint500: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorDecorativeSkinTint500: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - override open var colorDecorativeSkintTint600: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorDecorativeSkinTint600: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - override open var colorDecorativeSkintTint700: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorDecorativeSkinTint700: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - override open var colorDecorativeSkintTint800: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorDecorativeSkinTint800: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - override open var colorDecorativeSkintTint900: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorDecorativeSkinTint900: ColorSemanticToken { Self.mockThemeMultipleColorTokens } // MARK: Semantic token - Colors - Chart diff --git a/OUDS/Core/OUDS/Tests/OUDSTheme/MockThemes/OtherMockTheme.swift b/OUDS/Core/OUDS/Tests/OUDSTheme/MockThemes/OtherMockTheme.swift index 9cc238c6e..44713fcc6 100644 --- a/OUDS/Core/OUDS/Tests/OUDSTheme/MockThemes/OtherMockTheme.swift +++ b/OUDS/Core/OUDS/Tests/OUDSTheme/MockThemes/OtherMockTheme.swift @@ -14,7 +14,6 @@ import OUDSTokensSemantic // swiftlint:disable required_deinit -// swiftlint:disable type_body_length // swiftlint:disable file_length /// Some color semantic tokens may be not implemented, making fatalError() be triggered at `OUDSTheme` level and tests crash. @@ -42,35 +41,35 @@ final class OtherMockTheme: MockTheme, @unchecked Sendable { override var colorBackgroundStatusNeutral: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - override var colorBackgroundStatusNeutralOnBackgroundEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorBackgroundStatusNeutralOnBgEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } override var colorBackgroundStatusPositiveMuted: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - override var colorBackgroundStatusPositiveMutedOnBackgroundEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorBackgroundStatusPositiveMutedOnBgEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } override var colorBackgroundStatusPositiveEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } override var colorBackgroundStatusInfoMuted: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - override var colorBackgroundStatusInfoMutedOnBackgroundEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorBackgroundStatusInfoMutedOnBgEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } override var colorBackgroundStatusInfoEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } override var colorBackgroundStatusWarningMuted: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - override var colorBackgroundStatusWarningMutedOnBackgroundEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorBackgroundStatusWarningMutedOnBgEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } override var colorBackgroundStatusWarningEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } override var colorBackgroundStatusNegativeMuted: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - override var colorBackgroundStatusNegativeMutedOnBackgroundEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorBackgroundStatusNegativeMutedOnBgEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } override var colorBackgroundStatusNegativeEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } override var colorBackgroundStatusAccentMuted: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - override var colorBackgroundStatusAccentMutedOnBackgroundEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorBackgroundStatusAccentMutedOnBgEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } override var colorBackgroundStatusAccentEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } @@ -78,15 +77,15 @@ final class OtherMockTheme: MockTheme, @unchecked Sendable { override var colorContentDefault: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - override var colorContentContentDefaultOnBackgroundEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorContentContentDefaultOnBgEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } override var colorContentMuted: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - override var colorContentContentMutedOnBackgroundEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorContentContentMutedOnBgEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } override var colorContentDisabled: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - override var colorContentContentDisabledOnBackgroundEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorContentContentDisabledOnBgEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } override var colorContentBrandPrimary: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } @@ -106,55 +105,55 @@ final class OtherMockTheme: MockTheme, @unchecked Sendable { // MARK: Semantic token - Colors - Content - On Background - override var colorContentOnBackgroundPrimary: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorContentOnBgPrimary: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - override var colorContentOnBackgroundSecondary: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorContentOnBgSecondary: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - override var colorContentOnBackgroundTertiary: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorContentOnBgTertiary: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - override var colorContentOnBackgroundStatusPositiveMuted: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorContentOnBgStatusPositiveMuted: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - override var colorContentOnBackgroundStatusPositiveMutedOnBackgroundEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorContentOnBgStatusPositiveMutedOnBgEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - override var colorContentOnBackgroundStatusPositiveEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorContentOnBgStatusPositiveEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - override var colorContentOnBackgroundStatusInfoMuted: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorContentOnBgStatusInfoMuted: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - override var colorContentOnBackgroundStatusInfoMutedOnBackgroundEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorContentOnBgStatusInfoMutedOnBgEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - override var colorContentOnBackgroundStatusInfoEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorContentOnBgStatusInfoEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - override var colorContentOnBackgroundStatusWarningMuted: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorContentOnBgStatusWarningMuted: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - override var colorContentOnBackgroundStatusWarningMutedOnBackgroundEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorContentOnBgStatusWarningMutedOnBgEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - override var colorContentOnBackgroundStatusWarningEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorContentOnBgStatusWarningEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - override var colorContentOnBackgroundStatusNegativeMuted: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorContentOnBgStatusNegativeMuted: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - override var colorContentOnBackgroundStatusNegativeMutedOnBackgroundEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorContentOnBgStatusNegativeMutedOnBgEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - override var colorContentOnBackgroundStatusNegativeEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorContentOnBgStatusNegativeEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - override var colorContentOnBackgroundStatusAccentMuted: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorContentOnBgStatusAccentMuted: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - override var colorContentOnBackgroundStatusAccentMutedOnBackgroundEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorContentOnBgStatusAccentMutedOnBgEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - override var colorContentOnBackgroundStatusAccentedEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorContentOnBgStatusAccentedEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } // MARK: Semantic token - Colors - Border override var colorBorderDefault: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - override var colorBorderDefaultOnBackgroundEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorBorderDefaultOnBgEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } override var colorBorderEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - override var colorBorderEmphasizedOnBackgroundEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorBorderEmphasizedOnBgEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } override var colorBorderFocus: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - override var colorBorderBrandPrimaryOnBackgroundEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorBorderBrandPrimaryOnBgEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } override var colorBorderBrandPrimary: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } @@ -172,65 +171,65 @@ final class OtherMockTheme: MockTheme, @unchecked Sendable { override var colorBorderStatusAccent: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - override var colorBorderOnBackgroundBrandPrimary: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorBorderOnBgBrandPrimary: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - override var colorBorderOnBackgroundBrandSecondary: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorBorderOnBgBrandSecondary: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - override var colorBorderOnBackgroundBrandTertiary: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorBorderOnBgBrandTertiary: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } // MARK: Semantic token - Colors - Action override var colorActionSelected: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - override var colorActionSelectedOnBackgroundEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorActionSelectedOnBgEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } override var colorActionDisabled: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - override var colorActionDisabledOnBackgroundEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorActionDisabledOnBgEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } override var colorActionVisited: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - override var colorActionVistedOnBackgroundEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorActionVistedOnBgEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } override var colorActionPrimaryEnabled: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - override var colorActionPrimaryEnabledOnBackgroundEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorActionPrimaryEnabledOnBgEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } override var colorActionPrimaryHover: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - override var colorActionPrimaryHoverOnBackgroundEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorActionPrimaryHoverOnBgEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } override var colorActionPrimaryPressed: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - override var colorActionPrimaryPressedOnBackgroundEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorActionPrimaryPressedOnBgEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } override var colorActionPrimaryLoading: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - override var colorActionPrimaryLoadingOnBackgroundEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorActionPrimaryLoadingOnBgEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } override var colorActionPrimaryFocus: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - override var colorActionPrimaryFocusOnBackgroundEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorActionPrimaryFocusOnBgEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } override var colorActionSecondaryEnabled: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - override var colorActionSecondaryEnabledOnBackgroundEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorActionSecondaryEnabledOnBgEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } override var colorActionSecondaryHover: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - override var colorActionSecondaryHoverOnBackgroundEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorActionSecondaryHoverOnBgEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } override var colorActionSecondaryPressed: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - override var colorActionSecondaryPressedOnBackgroundEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorActionSecondaryPressedOnBgEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } override var colorActionSecondaryLoading: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - override var colorActionSecondaryLoadingOnBackgroundEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorActionSecondaryLoadingOnBgEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } override var colorActionSecondaryFocus: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - override var colorActionSecondaryFocusOnBackgroundEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorActionSecondaryFocusOnBgEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } override var colorActionNegativeEnabled: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } @@ -242,51 +241,51 @@ final class OtherMockTheme: MockTheme, @unchecked Sendable { override var colorActionNegativeFocus: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - override var colorActionOnBackgroundActionDisabled: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorActionOnBgActionDisabled: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - override var colorActionOnBackgroundActionDisabledOnBackgroundEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorActionOnBgActionDisabledOnBgEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - override var colorActionOnBackgroundActionNegative: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorActionOnBgActionNegative: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - override var colorActionOnBackgroundActionPrimaryEnabled: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorActionOnBgActionPrimaryEnabled: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - override var colorActionOnBackgroundActionPrimaryEnabledOnBackgroundEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorActionOnBgActionPrimaryEnabledOnBgEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - override var colorActionOnBackgroundActionPrimaryHover: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorActionOnBgActionPrimaryHover: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - override var colorActionOnBackgroundActionPrimaryHoverOnBackgroundEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorActionOnBgActionPrimaryHoverOnBgEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - override var colorActionOnBackgroundActionPrimaryPressed: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorActionOnBgActionPrimaryPressed: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - override var colorActionOnBackgroundActionPrimaryPressedOnBackgroundEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorActionOnBgActionPrimaryPressedOnBgEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - override var colorActionOnBackgroundActionPrimaryLoading: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorActionOnBgActionPrimaryLoading: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - override var colorActionOnBackgroundActionPrimaryLoadingOnBackgroundEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorActionOnBgActionPrimaryLoadingOnBgEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - override var colorActionOnBackgroundActionPrimaryFocus: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorActionOnBgActionPrimaryFocus: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - override var colorActionOnBackgroundActionPrimaryFocusOnBackgroundEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorActionOnBgActionPrimaryFocusOnBgEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - override var colorActionOnBackgroundActionSecondaryEnabled: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorActionOnBgActionSecondaryEnabled: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - override var colorActionOnBackgroundActionSecondaryEnabledOnBackgroundEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorActionOnBgActionSecondaryEnabledOnBgEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - override var colorActionOnBackgroundActionSecondaryHover: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorActionOnBgActionSecondaryHover: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - override var colorActionOnBackgroundActionSecondaryHoverOnBackgroundEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorActionOnBgActionSecondaryHoverOnBgEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - override var colorActionOnBackgroundActionSecondaryPressed: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorActionOnBgActionSecondaryPressed: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - override var colorActionOnBackgroundActionSecondaryPressedOnBackgroundEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorActionOnBgActionSecondaryPressedOnBgEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - override var colorActionOnBackgroundActionSecondaryLoading: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorActionOnBgActionSecondaryLoading: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - override var colorActionOnBackgroundActionSecondaryLoadingOnBackgroundEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorActionOnBgActionSecondaryLoadingOnBgEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - override var colorActionOnBackgroundActionSecondaryFocus: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorActionOnBgActionSecondaryFocus: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - override var colorActionOnBackgroundActionSecondaryFocusOnBackgroundEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorActionOnBgActionSecondaryFocusOnBgEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } // MARK: Semantic token - Colors - Always @@ -304,19 +303,19 @@ final class OtherMockTheme: MockTheme, @unchecked Sendable { override var colorAlwaysAccent: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - override var colorAlwaysOnBackgroundBlack: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorAlwaysOnBgBlack: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - override var colorAlwaysOnBackgroundWhite: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorAlwaysOnBgWhite: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - override var colorAlwaysOnBackgroundWarning: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorAlwaysOnBgWarning: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - override var colorAlwaysOnBackgroundNegative: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorAlwaysOnBgNegative: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - override var colorAlwaysOnBackgroundPositive: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorAlwaysOnBgPositive: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - override var colorAlwaysOnBackgroundInfo: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorAlwaysOnBgInfo: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - override var colorAlwaysOnBackgroundAccent: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorAlwaysOnBgAccent: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } // MARK: Semantic token - Colors - Transparent @@ -326,49 +325,37 @@ final class OtherMockTheme: MockTheme, @unchecked Sendable { override var colorElevationRaised: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - override var colorElevationRaisedOnBackgroundSecondary: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorElevationRaisedOnBgSecondary: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - override var colorElevationRaisedOnBackgroundEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorElevationRaisedOnBgEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } override var colorElevationDrag: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - override var colorElevationDragOnBackgroundSecondary: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorElevationDragOnBgSecondary: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - override var colorElevationDragOnBackgroundEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorElevationDragOnBgEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } override var colorElevationOverlayDefault: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - override var colorElevationOverlayDefaultOnBackgroundSecondary: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorElevationOverlayDefaultOnBgSecondary: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - override var colorElevationOverlayDefaultOnBackgroundEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorElevationOverlayDefaultOnBgEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } override var colorElevationOverlayEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - override var colorElevationOverlayEmphasizedOnBackgroundSecondary: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorElevationOverlayEmphasizedOnBgSecondary: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - override var colorElevationOverlayEmphasizedOnBackgroundEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorElevationOverlayEmphasizedOnBgEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } override var colorElevationModal: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } // MARK: Semantic token - Colors - Decorative - override var colorDecorativeBrandPrimary: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - - override var colorDecorativeBrandPrimaryMuted: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - - override var colorDecorativeBrandPrimaryEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorDecorativePrimary: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } override var colorDecorativeSecondary: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - override var colorDecorativeSecondaryMuted: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - - override var colorDecorativeSecondaryEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - - override var colorDecorativeBrandTertiary: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - - override var colorDecorativeBrandTertiaryMuted: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - - override var colorDecorativeBrandTertiaryEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorDecorativeTertiary: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } override var colorDecorativeNeutralMuted: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } @@ -406,23 +393,23 @@ final class OtherMockTheme: MockTheme, @unchecked Sendable { override var colorDecorativeAccent5Emphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - override var colorDecorativeSkintTint100: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorDecorativeSkinTint100: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - override var colorDecorativeSkintTint200: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorDecorativeSkinTint200: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - override var colorDecorativeSkintTint300: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorDecorativeSkinTint300: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - override var colorDecorativeSkintTint400: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorDecorativeSkinTint400: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - override var colorDecorativeSkintTint500: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorDecorativeSkinTint500: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - override var colorDecorativeSkintTint600: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorDecorativeSkinTint600: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - override var colorDecorativeSkintTint700: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorDecorativeSkinTint700: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - override var colorDecorativeSkintTint800: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorDecorativeSkinTint800: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - override var colorDecorativeSkintTint900: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorDecorativeSkinTint900: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } // MARK: Semantic token - Colors - Chart @@ -546,5 +533,4 @@ final class OtherMockTheme: MockTheme, @unchecked Sendable { } // swiftlint:enable required_deinit -// swiftlint:enable type_body_length // swiftlint:enable file_length diff --git a/OUDS/Core/OUDS/Tests/OUDSTheme/TestThemeOverrideOfColorSemanticTokens.swift b/OUDS/Core/OUDS/Tests/OUDSTheme/TestThemeOverrideOfColorSemanticTokens.swift index 9ebea607e..19b4c36ef 100644 --- a/OUDS/Core/OUDS/Tests/OUDSTheme/TestThemeOverrideOfColorSemanticTokens.swift +++ b/OUDS/Core/OUDS/Tests/OUDSTheme/TestThemeOverrideOfColorSemanticTokens.swift @@ -16,7 +16,6 @@ import OUDSTokensSemantic import XCTest // swiftlint:disable type_body_length -// swiftlint:disable line_length // swiftlint:disable file_length // swiftlint:disable implicitly_unwrapped_optional // swiftlint:disable required_deinit @@ -77,9 +76,9 @@ final class TestThemeOverrideOfColorSemanticTokens: XCTestCase { XCTAssertTrue(inheritedTheme.colorBackgroundStatusNeutral == OtherMockTheme.otherMockThemeMultipleColorTokens) } - func testInheritedThemeCanOverrideSemanticTokenColorBackgroundStatusNeutralOnBackgroundEmphasized() throws { - XCTAssertNotEqual(inheritedTheme.colorBackgroundStatusNeutralOnBackgroundEmphasized, abstractTheme.colorBackgroundStatusNeutralOnBackgroundEmphasized) - XCTAssertTrue(inheritedTheme.colorBackgroundStatusNeutralOnBackgroundEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorBackgroundStatusNeutralOnBgEmphasized() throws { + XCTAssertNotEqual(inheritedTheme.colorBackgroundStatusNeutralOnBgEmphasized, abstractTheme.colorBackgroundStatusNeutralOnBgEmphasized) + XCTAssertTrue(inheritedTheme.colorBackgroundStatusNeutralOnBgEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) } func testInheritedThemeCanOverrideSemanticTokenColorBackgroundStatusPositiveMuted() throws { @@ -87,9 +86,9 @@ final class TestThemeOverrideOfColorSemanticTokens: XCTestCase { XCTAssertTrue(inheritedTheme.colorBackgroundStatusPositiveMuted == OtherMockTheme.otherMockThemeMultipleColorTokens) } - func testInheritedThemeCanOverrideSemanticTokenColorBackgroundStatusPositiveMutedOnBackgroundEmphasized() throws { - XCTAssertNotEqual(inheritedTheme.colorBackgroundStatusPositiveMutedOnBackgroundEmphasized, abstractTheme.colorBackgroundStatusPositiveMutedOnBackgroundEmphasized) - XCTAssertTrue(inheritedTheme.colorBackgroundStatusPositiveMutedOnBackgroundEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorBackgroundStatusPositiveMutedOnBgEmphasized() throws { + XCTAssertNotEqual(inheritedTheme.colorBackgroundStatusPositiveMutedOnBgEmphasized, abstractTheme.colorBackgroundStatusPositiveMutedOnBgEmphasized) + XCTAssertTrue(inheritedTheme.colorBackgroundStatusPositiveMutedOnBgEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) } func testInheritedThemeCanOverrideSemanticTokenColorBackgroundStatusPositiveEmphasized() throws { @@ -102,9 +101,9 @@ final class TestThemeOverrideOfColorSemanticTokens: XCTestCase { XCTAssertTrue(inheritedTheme.colorBackgroundStatusInfoMuted == OtherMockTheme.otherMockThemeMultipleColorTokens) } - func testInheritedThemeCanOverrideSemanticTokenColorBackgroundStatusInfoMutedOnBackgroundEmphasized() throws { - XCTAssertNotEqual(inheritedTheme.colorBackgroundStatusInfoMutedOnBackgroundEmphasized, abstractTheme.colorBackgroundStatusInfoMutedOnBackgroundEmphasized) - XCTAssertTrue(inheritedTheme.colorBackgroundStatusInfoMutedOnBackgroundEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorBackgroundStatusInfoMutedOnBgEmphasized() throws { + XCTAssertNotEqual(inheritedTheme.colorBackgroundStatusInfoMutedOnBgEmphasized, abstractTheme.colorBackgroundStatusInfoMutedOnBgEmphasized) + XCTAssertTrue(inheritedTheme.colorBackgroundStatusInfoMutedOnBgEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) } func testInheritedThemeCanOverrideSemanticTokenColorBackgroundStatusInfoEmphasized() throws { @@ -117,9 +116,9 @@ final class TestThemeOverrideOfColorSemanticTokens: XCTestCase { XCTAssertTrue(inheritedTheme.colorBackgroundStatusWarningMuted == OtherMockTheme.otherMockThemeMultipleColorTokens) } - func testInheritedThemeCanOverrideSemanticTokenColorBackgroundStatusWarningMutedOnBackgroundEmphasized() throws { - XCTAssertNotEqual(inheritedTheme.colorBackgroundStatusWarningMutedOnBackgroundEmphasized, abstractTheme.colorBackgroundStatusWarningMutedOnBackgroundEmphasized) - XCTAssertTrue(inheritedTheme.colorBackgroundStatusWarningMutedOnBackgroundEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorBackgroundStatusWarningMutedOnBgEmphasized() throws { + XCTAssertNotEqual(inheritedTheme.colorBackgroundStatusWarningMutedOnBgEmphasized, abstractTheme.colorBackgroundStatusWarningMutedOnBgEmphasized) + XCTAssertTrue(inheritedTheme.colorBackgroundStatusWarningMutedOnBgEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) } func testInheritedThemeCanOverrideSemanticTokenColorBackgroundStatusWarningEmphasized() throws { @@ -132,9 +131,9 @@ final class TestThemeOverrideOfColorSemanticTokens: XCTestCase { XCTAssertTrue(inheritedTheme.colorBackgroundStatusNegativeMuted == OtherMockTheme.otherMockThemeMultipleColorTokens) } - func testInheritedThemeCanOverrideSemanticTokenColorBackgroundStatusNegativeMutedOnBackgroundEmphasized() throws { - XCTAssertNotEqual(inheritedTheme.colorBackgroundStatusNegativeMutedOnBackgroundEmphasized, abstractTheme.colorBackgroundStatusNegativeMutedOnBackgroundEmphasized) - XCTAssertTrue(inheritedTheme.colorBackgroundStatusNegativeMutedOnBackgroundEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorBackgroundStatusNegativeMutedOnBgEmphasized() throws { + XCTAssertNotEqual(inheritedTheme.colorBackgroundStatusNegativeMutedOnBgEmphasized, abstractTheme.colorBackgroundStatusNegativeMutedOnBgEmphasized) + XCTAssertTrue(inheritedTheme.colorBackgroundStatusNegativeMutedOnBgEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) } func testInheritedThemeCanOverrideSemanticTokenColorBackgroundStatusNegativeEmphasized() throws { @@ -147,9 +146,9 @@ final class TestThemeOverrideOfColorSemanticTokens: XCTestCase { XCTAssertTrue(inheritedTheme.colorBackgroundStatusAccentMuted == OtherMockTheme.otherMockThemeMultipleColorTokens) } - func testInheritedThemeCanOverrideSemanticTokenColorBackgroundStatusAccentMutedOnBackgroundEmphasized() throws { - XCTAssertNotEqual(inheritedTheme.colorBackgroundStatusAccentMutedOnBackgroundEmphasized, abstractTheme.colorBackgroundStatusAccentMutedOnBackgroundEmphasized) - XCTAssertTrue(inheritedTheme.colorBackgroundStatusAccentMutedOnBackgroundEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorBackgroundStatusAccentMutedOnBgEmphasized() throws { + XCTAssertNotEqual(inheritedTheme.colorBackgroundStatusAccentMutedOnBgEmphasized, abstractTheme.colorBackgroundStatusAccentMutedOnBgEmphasized) + XCTAssertTrue(inheritedTheme.colorBackgroundStatusAccentMutedOnBgEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) } func testInheritedThemeCanOverrideSemanticTokenColorBackgroundStatusAccentEmphasized() throws { @@ -164,9 +163,9 @@ final class TestThemeOverrideOfColorSemanticTokens: XCTestCase { XCTAssertTrue(inheritedTheme.colorContentDefault == OtherMockTheme.otherMockThemeMultipleColorTokens) } - func testInheritedThemeCanOverrideSemanticTokenColorContentContentDefaultOnBackgroundEmphasized() throws { - XCTAssertNotEqual(inheritedTheme.colorContentContentDefaultOnBackgroundEmphasized, abstractTheme.colorContentContentDefaultOnBackgroundEmphasized) - XCTAssertTrue(inheritedTheme.colorContentContentDefaultOnBackgroundEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorContentContentDefaultOnBgEmphasized() throws { + XCTAssertNotEqual(inheritedTheme.colorContentContentDefaultOnBgEmphasized, abstractTheme.colorContentContentDefaultOnBgEmphasized) + XCTAssertTrue(inheritedTheme.colorContentContentDefaultOnBgEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) } func testInheritedThemeCanOverrideSemanticTokenColorContentMuted() throws { @@ -174,9 +173,9 @@ final class TestThemeOverrideOfColorSemanticTokens: XCTestCase { XCTAssertTrue(inheritedTheme.colorContentMuted == OtherMockTheme.otherMockThemeMultipleColorTokens) } - func testInheritedThemeCanOverrideSemanticTokenColorContentContentMutedOnBackgroundEmphasized() throws { - XCTAssertNotEqual(inheritedTheme.colorContentContentMutedOnBackgroundEmphasized, abstractTheme.colorContentContentMutedOnBackgroundEmphasized) - XCTAssertTrue(inheritedTheme.colorContentContentMutedOnBackgroundEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorContentContentMutedOnBgEmphasized() throws { + XCTAssertNotEqual(inheritedTheme.colorContentContentMutedOnBgEmphasized, abstractTheme.colorContentContentMutedOnBgEmphasized) + XCTAssertTrue(inheritedTheme.colorContentContentMutedOnBgEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) } func testInheritedThemeCanOverrideSemanticTokenColorContentDisabled() throws { @@ -184,9 +183,9 @@ final class TestThemeOverrideOfColorSemanticTokens: XCTestCase { XCTAssertTrue(inheritedTheme.colorContentDisabled == OtherMockTheme.otherMockThemeMultipleColorTokens) } - func testInheritedThemeCanOverrideSemanticTokenColorContentContentDisabledOnBackgroundEmphasized() throws { - XCTAssertNotEqual(inheritedTheme.colorContentContentDisabledOnBackgroundEmphasized, abstractTheme.colorContentContentDisabledOnBackgroundEmphasized) - XCTAssertTrue(inheritedTheme.colorContentContentDisabledOnBackgroundEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorContentContentDisabledOnBgEmphasized() throws { + XCTAssertNotEqual(inheritedTheme.colorContentContentDisabledOnBgEmphasized, abstractTheme.colorContentContentDisabledOnBgEmphasized) + XCTAssertTrue(inheritedTheme.colorContentContentDisabledOnBgEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) } func testInheritedThemeCanOverrideSemanticTokenColorContentBrandPrimary() throws { @@ -231,94 +230,94 @@ final class TestThemeOverrideOfColorSemanticTokens: XCTestCase { // MARK: Semantic token - Colors - Content - On Background - func testInheritedThemeCanOverrideSemanticTokenColorContentOnBackgroundPrimary() throws { - XCTAssertNotEqual(inheritedTheme.colorContentOnBackgroundPrimary, abstractTheme.colorContentOnBackgroundPrimary) - XCTAssertTrue(inheritedTheme.colorContentOnBackgroundPrimary == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorContentOnBgPrimary() throws { + XCTAssertNotEqual(inheritedTheme.colorContentOnBgPrimary, abstractTheme.colorContentOnBgPrimary) + XCTAssertTrue(inheritedTheme.colorContentOnBgPrimary == OtherMockTheme.otherMockThemeMultipleColorTokens) } - func testInheritedThemeCanOverrideSemanticTokenColorContentOnBackgroundSecondary() throws { - XCTAssertNotEqual(inheritedTheme.colorContentOnBackgroundSecondary, abstractTheme.colorContentOnBackgroundSecondary) - XCTAssertTrue(inheritedTheme.colorContentOnBackgroundSecondary == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorContentOnBgSecondary() throws { + XCTAssertNotEqual(inheritedTheme.colorContentOnBgSecondary, abstractTheme.colorContentOnBgSecondary) + XCTAssertTrue(inheritedTheme.colorContentOnBgSecondary == OtherMockTheme.otherMockThemeMultipleColorTokens) } - func testInheritedThemeCanOverrideSemanticTokenColorContentOnBackgroundTertiary() throws { - XCTAssertNotEqual(inheritedTheme.colorContentOnBackgroundTertiary, abstractTheme.colorContentOnBackgroundTertiary) - XCTAssertTrue(inheritedTheme.colorContentOnBackgroundTertiary == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorContentOnBgTertiary() throws { + XCTAssertNotEqual(inheritedTheme.colorContentOnBgTertiary, abstractTheme.colorContentOnBgTertiary) + XCTAssertTrue(inheritedTheme.colorContentOnBgTertiary == OtherMockTheme.otherMockThemeMultipleColorTokens) } - func testInheritedThemeCanOverrideSemanticTokenColorContentOnBackgroundStatusPositiveMuted() throws { - XCTAssertNotEqual(inheritedTheme.colorContentOnBackgroundStatusPositiveMuted, abstractTheme.colorContentOnBackgroundStatusPositiveMuted) - XCTAssertTrue(inheritedTheme.colorContentOnBackgroundStatusPositiveMuted == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorContentOnBgStatusPositiveMuted() throws { + XCTAssertNotEqual(inheritedTheme.colorContentOnBgStatusPositiveMuted, abstractTheme.colorContentOnBgStatusPositiveMuted) + XCTAssertTrue(inheritedTheme.colorContentOnBgStatusPositiveMuted == OtherMockTheme.otherMockThemeMultipleColorTokens) } - func testInheritedThemeCanOverrideSemanticTokenColorContentOnBackgroundStatusPositiveMutedOnBackgroundEmphasized() throws { - XCTAssertNotEqual(inheritedTheme.colorContentOnBackgroundStatusPositiveMutedOnBackgroundEmphasized, abstractTheme.colorContentOnBackgroundStatusPositiveMutedOnBackgroundEmphasized) - XCTAssertTrue(inheritedTheme.colorContentOnBackgroundStatusPositiveMutedOnBackgroundEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorContentOnBgStatusPositiveMutedOnBgEmphasized() throws { + XCTAssertNotEqual(inheritedTheme.colorContentOnBgStatusPositiveMutedOnBgEmphasized, abstractTheme.colorContentOnBgStatusPositiveMutedOnBgEmphasized) + XCTAssertTrue(inheritedTheme.colorContentOnBgStatusPositiveMutedOnBgEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) } - func testInheritedThemeCanOverrideSemanticTokenColorContentOnBackgroundStatusPositiveEmphasized() throws { - XCTAssertNotEqual(inheritedTheme.colorContentOnBackgroundStatusPositiveEmphasized, abstractTheme.colorContentOnBackgroundStatusPositiveEmphasized) - XCTAssertTrue(inheritedTheme.colorContentOnBackgroundStatusPositiveEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorContentOnBgStatusPositiveEmphasized() throws { + XCTAssertNotEqual(inheritedTheme.colorContentOnBgStatusPositiveEmphasized, abstractTheme.colorContentOnBgStatusPositiveEmphasized) + XCTAssertTrue(inheritedTheme.colorContentOnBgStatusPositiveEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) } - func testInheritedThemeCanOverrideSemanticTokenColorContentOnBackgroundStatusInfoMuted() throws { - XCTAssertNotEqual(inheritedTheme.colorContentOnBackgroundStatusInfoMuted, abstractTheme.colorContentOnBackgroundStatusInfoMuted) - XCTAssertTrue(inheritedTheme.colorContentOnBackgroundStatusInfoMuted == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorContentOnBgStatusInfoMuted() throws { + XCTAssertNotEqual(inheritedTheme.colorContentOnBgStatusInfoMuted, abstractTheme.colorContentOnBgStatusInfoMuted) + XCTAssertTrue(inheritedTheme.colorContentOnBgStatusInfoMuted == OtherMockTheme.otherMockThemeMultipleColorTokens) } - func testInheritedThemeCanOverrideSemanticTokenColorContentOnBackgroundStatusInfoMutedOnBackgroundEmphasized() throws { - XCTAssertNotEqual(inheritedTheme.colorContentOnBackgroundStatusInfoMutedOnBackgroundEmphasized, abstractTheme.colorContentOnBackgroundStatusInfoMutedOnBackgroundEmphasized) - XCTAssertTrue(inheritedTheme.colorContentOnBackgroundStatusInfoMutedOnBackgroundEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorContentOnBgStatusInfoMutedOnBgEmphasized() throws { + XCTAssertNotEqual(inheritedTheme.colorContentOnBgStatusInfoMutedOnBgEmphasized, abstractTheme.colorContentOnBgStatusInfoMutedOnBgEmphasized) + XCTAssertTrue(inheritedTheme.colorContentOnBgStatusInfoMutedOnBgEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) } - func testInheritedThemeCanOverrideSemanticTokenColorContentOnBackgroundStatusInfoEmphasized() throws { - XCTAssertNotEqual(inheritedTheme.colorContentOnBackgroundStatusInfoEmphasized, abstractTheme.colorContentOnBackgroundStatusInfoEmphasized) - XCTAssertTrue(inheritedTheme.colorContentOnBackgroundStatusInfoEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorContentOnBgStatusInfoEmphasized() throws { + XCTAssertNotEqual(inheritedTheme.colorContentOnBgStatusInfoEmphasized, abstractTheme.colorContentOnBgStatusInfoEmphasized) + XCTAssertTrue(inheritedTheme.colorContentOnBgStatusInfoEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) } - func testInheritedThemeCanOverrideSemanticTokenColorContentOnBackgroundStatusWarningMuted() throws { - XCTAssertNotEqual(inheritedTheme.colorContentOnBackgroundStatusWarningMuted, abstractTheme.colorContentOnBackgroundStatusWarningMuted) - XCTAssertTrue(inheritedTheme.colorContentOnBackgroundStatusWarningMuted == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorContentOnBgStatusWarningMuted() throws { + XCTAssertNotEqual(inheritedTheme.colorContentOnBgStatusWarningMuted, abstractTheme.colorContentOnBgStatusWarningMuted) + XCTAssertTrue(inheritedTheme.colorContentOnBgStatusWarningMuted == OtherMockTheme.otherMockThemeMultipleColorTokens) } - func testInheritedThemeCanOverrideSemanticTokenColorContentOnBackgroundStatusWarningMutedOnBackgroundEmphasized() throws { - XCTAssertNotEqual(inheritedTheme.colorContentOnBackgroundStatusWarningMutedOnBackgroundEmphasized, abstractTheme.colorContentOnBackgroundStatusWarningMutedOnBackgroundEmphasized) - XCTAssertTrue(inheritedTheme.colorContentOnBackgroundStatusWarningMutedOnBackgroundEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorContentOnBgStatusWarningMutedOnBgEmphasized() throws { + XCTAssertNotEqual(inheritedTheme.colorContentOnBgStatusWarningMutedOnBgEmphasized, abstractTheme.colorContentOnBgStatusWarningMutedOnBgEmphasized) + XCTAssertTrue(inheritedTheme.colorContentOnBgStatusWarningMutedOnBgEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) } - func testInheritedThemeCanOverrideSemanticTokenColorContentOnBackgroundStatusWarningEmphasized() throws { - XCTAssertNotEqual(inheritedTheme.colorContentOnBackgroundStatusWarningEmphasized, abstractTheme.colorContentOnBackgroundStatusWarningEmphasized) - XCTAssertTrue(inheritedTheme.colorContentOnBackgroundStatusWarningEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorContentOnBgStatusWarningEmphasized() throws { + XCTAssertNotEqual(inheritedTheme.colorContentOnBgStatusWarningEmphasized, abstractTheme.colorContentOnBgStatusWarningEmphasized) + XCTAssertTrue(inheritedTheme.colorContentOnBgStatusWarningEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) } - func testInheritedThemeCanOverrideSemanticTokenColorContentOnBackgroundStatusNegativeMuted() throws { - XCTAssertNotEqual(inheritedTheme.colorContentOnBackgroundStatusNegativeMuted, abstractTheme.colorContentOnBackgroundStatusNegativeMuted) - XCTAssertTrue(inheritedTheme.colorContentOnBackgroundStatusNegativeMuted == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorContentOnBgStatusNegativeMuted() throws { + XCTAssertNotEqual(inheritedTheme.colorContentOnBgStatusNegativeMuted, abstractTheme.colorContentOnBgStatusNegativeMuted) + XCTAssertTrue(inheritedTheme.colorContentOnBgStatusNegativeMuted == OtherMockTheme.otherMockThemeMultipleColorTokens) } - func testInheritedThemeCanOverrideSemanticTokenColorContentOnBackgroundStatusNegativeMutedOnBackgroundEmphasized() throws { - XCTAssertNotEqual(inheritedTheme.colorContentOnBackgroundStatusNegativeMutedOnBackgroundEmphasized, abstractTheme.colorContentOnBackgroundStatusNegativeMutedOnBackgroundEmphasized) - XCTAssertTrue(inheritedTheme.colorContentOnBackgroundStatusNegativeMutedOnBackgroundEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorContentOnBgStatusNegativeMutedOnBgEmphasized() throws { + XCTAssertNotEqual(inheritedTheme.colorContentOnBgStatusNegativeMutedOnBgEmphasized, abstractTheme.colorContentOnBgStatusNegativeMutedOnBgEmphasized) + XCTAssertTrue(inheritedTheme.colorContentOnBgStatusNegativeMutedOnBgEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) } - func testInheritedThemeCanOverrideSemanticTokenColorContentOnBackgroundStatusNegativeEmphasized() throws { - XCTAssertNotEqual(inheritedTheme.colorContentOnBackgroundStatusNegativeEmphasized, abstractTheme.colorContentOnBackgroundStatusNegativeEmphasized) - XCTAssertTrue(inheritedTheme.colorContentOnBackgroundStatusNegativeEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorContentOnBgStatusNegativeEmphasized() throws { + XCTAssertNotEqual(inheritedTheme.colorContentOnBgStatusNegativeEmphasized, abstractTheme.colorContentOnBgStatusNegativeEmphasized) + XCTAssertTrue(inheritedTheme.colorContentOnBgStatusNegativeEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) } - func testInheritedThemeCanOverrideSemanticTokenColorContentOnBackgroundStatusAccentMuted() throws { - XCTAssertNotEqual(inheritedTheme.colorContentOnBackgroundStatusAccentMuted, abstractTheme.colorContentOnBackgroundStatusAccentMuted) - XCTAssertTrue(inheritedTheme.colorContentOnBackgroundStatusAccentMuted == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorContentOnBgStatusAccentMuted() throws { + XCTAssertNotEqual(inheritedTheme.colorContentOnBgStatusAccentMuted, abstractTheme.colorContentOnBgStatusAccentMuted) + XCTAssertTrue(inheritedTheme.colorContentOnBgStatusAccentMuted == OtherMockTheme.otherMockThemeMultipleColorTokens) } - func testInheritedThemeCanOverrideSemanticTokenColorContentOnBackgroundStatusAccentMutedOnBackgroundEmphasized() throws { - XCTAssertNotEqual(inheritedTheme.colorContentOnBackgroundStatusAccentMutedOnBackgroundEmphasized, abstractTheme.colorContentOnBackgroundStatusAccentMutedOnBackgroundEmphasized) - XCTAssertTrue(inheritedTheme.colorContentOnBackgroundStatusAccentMutedOnBackgroundEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorContentOnBgStatusAccentMutedOnBgEmphasized() throws { + XCTAssertNotEqual(inheritedTheme.colorContentOnBgStatusAccentMutedOnBgEmphasized, abstractTheme.colorContentOnBgStatusAccentMutedOnBgEmphasized) + XCTAssertTrue(inheritedTheme.colorContentOnBgStatusAccentMutedOnBgEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) } - func testInheritedThemeCanOverrideSemanticTokenColorContentOnBackgroundStatusAccentedEmphasized() throws { - XCTAssertNotEqual(inheritedTheme.colorContentOnBackgroundStatusAccentedEmphasized, abstractTheme.colorContentOnBackgroundStatusAccentedEmphasized) - XCTAssertTrue(inheritedTheme.colorContentOnBackgroundStatusAccentedEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorContentOnBgStatusAccentedEmphasized() throws { + XCTAssertNotEqual(inheritedTheme.colorContentOnBgStatusAccentedEmphasized, abstractTheme.colorContentOnBgStatusAccentedEmphasized) + XCTAssertTrue(inheritedTheme.colorContentOnBgStatusAccentedEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) } // MARK: Semantic token - Colors - Border @@ -328,9 +327,9 @@ final class TestThemeOverrideOfColorSemanticTokens: XCTestCase { XCTAssertTrue(inheritedTheme.colorBorderDefault == OtherMockTheme.otherMockThemeMultipleColorTokens) } - func testInheritedThemeCanOverrideSemanticTokenColorBorderDefaultOnBackgroundEmphasized() throws { - XCTAssertNotEqual(inheritedTheme.colorBorderDefaultOnBackgroundEmphasized, abstractTheme.colorBorderDefaultOnBackgroundEmphasized) - XCTAssertTrue(inheritedTheme.colorBorderDefaultOnBackgroundEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorBorderDefaultOnBgEmphasized() throws { + XCTAssertNotEqual(inheritedTheme.colorBorderDefaultOnBgEmphasized, abstractTheme.colorBorderDefaultOnBgEmphasized) + XCTAssertTrue(inheritedTheme.colorBorderDefaultOnBgEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) } func testInheritedThemeCanOverrideSemanticTokenColorBorderEmphasized() throws { @@ -338,9 +337,9 @@ final class TestThemeOverrideOfColorSemanticTokens: XCTestCase { XCTAssertTrue(inheritedTheme.colorBorderEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) } - func testInheritedThemeCanOverrideSemanticTokenColorBorderEmphasizedOnBackgroundEmphasized() throws { - XCTAssertNotEqual(inheritedTheme.colorBorderEmphasizedOnBackgroundEmphasized, abstractTheme.colorBorderEmphasizedOnBackgroundEmphasized) - XCTAssertTrue(inheritedTheme.colorBorderEmphasizedOnBackgroundEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorBorderEmphasizedOnBgEmphasized() throws { + XCTAssertNotEqual(inheritedTheme.colorBorderEmphasizedOnBgEmphasized, abstractTheme.colorBorderEmphasizedOnBgEmphasized) + XCTAssertTrue(inheritedTheme.colorBorderEmphasizedOnBgEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) } func testInheritedThemeCanOverrideSemanticTokenColorBorderFocus() throws { @@ -348,9 +347,9 @@ final class TestThemeOverrideOfColorSemanticTokens: XCTestCase { XCTAssertTrue(inheritedTheme.colorBorderFocus == OtherMockTheme.otherMockThemeMultipleColorTokens) } - func testInheritedThemeCanOverrideSemanticTokenColorBorderBrandPrimaryOnBackgroundEmphasized() throws { - XCTAssertNotEqual(inheritedTheme.colorBorderBrandPrimaryOnBackgroundEmphasized, abstractTheme.colorBorderBrandPrimaryOnBackgroundEmphasized) - XCTAssertTrue(inheritedTheme.colorBorderBrandPrimaryOnBackgroundEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorBorderBrandPrimaryOnBgEmphasized() throws { + XCTAssertNotEqual(inheritedTheme.colorBorderBrandPrimaryOnBgEmphasized, abstractTheme.colorBorderBrandPrimaryOnBgEmphasized) + XCTAssertTrue(inheritedTheme.colorBorderBrandPrimaryOnBgEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) } func testInheritedThemeCanOverrideSemanticTokenColorBorderBrandPrimary() throws { @@ -393,19 +392,19 @@ final class TestThemeOverrideOfColorSemanticTokens: XCTestCase { XCTAssertTrue(inheritedTheme.colorBorderStatusAccent == OtherMockTheme.otherMockThemeMultipleColorTokens) } - func testInheritedThemeCanOverrideSemanticTokenColorBorderOnBackgroundBrandPrimary() throws { - XCTAssertNotEqual(inheritedTheme.colorBorderOnBackgroundBrandPrimary, abstractTheme.colorBorderOnBackgroundBrandPrimary) - XCTAssertTrue(inheritedTheme.colorBorderOnBackgroundBrandPrimary == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorBorderOnBgBrandPrimary() throws { + XCTAssertNotEqual(inheritedTheme.colorBorderOnBgBrandPrimary, abstractTheme.colorBorderOnBgBrandPrimary) + XCTAssertTrue(inheritedTheme.colorBorderOnBgBrandPrimary == OtherMockTheme.otherMockThemeMultipleColorTokens) } - func testInheritedThemeCanOverrideSemanticTokenColorBorderOnBackgroundBrandSecondary() throws { - XCTAssertNotEqual(inheritedTheme.colorBorderOnBackgroundBrandSecondary, abstractTheme.colorBorderOnBackgroundBrandSecondary) - XCTAssertTrue(inheritedTheme.colorBorderOnBackgroundBrandSecondary == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorBorderOnBgBrandSecondary() throws { + XCTAssertNotEqual(inheritedTheme.colorBorderOnBgBrandSecondary, abstractTheme.colorBorderOnBgBrandSecondary) + XCTAssertTrue(inheritedTheme.colorBorderOnBgBrandSecondary == OtherMockTheme.otherMockThemeMultipleColorTokens) } - func testInheritedThemeCanOverrideSemanticTokenColorBorderOnBackgroundBrandTertiary() throws { - XCTAssertNotEqual(inheritedTheme.colorBorderOnBackgroundBrandTertiary, abstractTheme.colorBorderOnBackgroundBrandTertiary) - XCTAssertTrue(inheritedTheme.colorBorderOnBackgroundBrandTertiary == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorBorderOnBgBrandTertiary() throws { + XCTAssertNotEqual(inheritedTheme.colorBorderOnBgBrandTertiary, abstractTheme.colorBorderOnBgBrandTertiary) + XCTAssertTrue(inheritedTheme.colorBorderOnBgBrandTertiary == OtherMockTheme.otherMockThemeMultipleColorTokens) } // MARK: Semantic token - Colors - Action @@ -415,9 +414,9 @@ final class TestThemeOverrideOfColorSemanticTokens: XCTestCase { XCTAssertTrue(inheritedTheme.colorActionSelected == OtherMockTheme.otherMockThemeMultipleColorTokens) } - func testInheritedThemeCanOverrideSemanticTokenColorActionSelectedOnBackgroundEmphasized() throws { - XCTAssertNotEqual(inheritedTheme.colorActionSelectedOnBackgroundEmphasized, abstractTheme.colorActionSelectedOnBackgroundEmphasized) - XCTAssertTrue(inheritedTheme.colorActionSelectedOnBackgroundEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorActionSelectedOnBgEmphasized() throws { + XCTAssertNotEqual(inheritedTheme.colorActionSelectedOnBgEmphasized, abstractTheme.colorActionSelectedOnBgEmphasized) + XCTAssertTrue(inheritedTheme.colorActionSelectedOnBgEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) } func testInheritedThemeCanOverrideSemanticTokenColorActionDisabled() throws { @@ -425,9 +424,9 @@ final class TestThemeOverrideOfColorSemanticTokens: XCTestCase { XCTAssertTrue(inheritedTheme.colorActionDisabled == OtherMockTheme.otherMockThemeMultipleColorTokens) } - func testInheritedThemeCanOverrideSemanticTokenColorActionDisabledOnBackgroundEmphasized() throws { - XCTAssertNotEqual(inheritedTheme.colorActionDisabledOnBackgroundEmphasized, abstractTheme.colorActionDisabledOnBackgroundEmphasized) - XCTAssertTrue(inheritedTheme.colorActionDisabledOnBackgroundEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorActionDisabledOnBgEmphasized() throws { + XCTAssertNotEqual(inheritedTheme.colorActionDisabledOnBgEmphasized, abstractTheme.colorActionDisabledOnBgEmphasized) + XCTAssertTrue(inheritedTheme.colorActionDisabledOnBgEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) } func testInheritedThemeCanOverrideSemanticTokenColorActionVisited() throws { @@ -435,9 +434,9 @@ final class TestThemeOverrideOfColorSemanticTokens: XCTestCase { XCTAssertTrue(inheritedTheme.colorActionVisited == OtherMockTheme.otherMockThemeMultipleColorTokens) } - func testInheritedThemeCanOverrideSemanticTokenColorActionVistedOnBackgroundEmphasized() throws { - XCTAssertNotEqual(inheritedTheme.colorActionVistedOnBackgroundEmphasized, abstractTheme.colorActionVistedOnBackgroundEmphasized) - XCTAssertTrue(inheritedTheme.colorActionVistedOnBackgroundEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorActionVistedOnBgEmphasized() throws { + XCTAssertNotEqual(inheritedTheme.colorActionVistedOnBgEmphasized, abstractTheme.colorActionVistedOnBgEmphasized) + XCTAssertTrue(inheritedTheme.colorActionVistedOnBgEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) } func testInheritedThemeCanOverrideSemanticTokenColorActionPrimaryEnabled() throws { @@ -445,9 +444,9 @@ final class TestThemeOverrideOfColorSemanticTokens: XCTestCase { XCTAssertTrue(inheritedTheme.colorActionPrimaryEnabled == OtherMockTheme.otherMockThemeMultipleColorTokens) } - func testInheritedThemeCanOverrideSemanticTokenColorActionPrimaryEnabledOnBackgroundEmphasized() throws { - XCTAssertNotEqual(inheritedTheme.colorActionPrimaryEnabledOnBackgroundEmphasized, abstractTheme.colorActionPrimaryEnabledOnBackgroundEmphasized) - XCTAssertTrue(inheritedTheme.colorActionPrimaryEnabledOnBackgroundEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorActionPrimaryEnabledOnBgEmphasized() throws { + XCTAssertNotEqual(inheritedTheme.colorActionPrimaryEnabledOnBgEmphasized, abstractTheme.colorActionPrimaryEnabledOnBgEmphasized) + XCTAssertTrue(inheritedTheme.colorActionPrimaryEnabledOnBgEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) } func testInheritedThemeCanOverrideSemanticTokenColorActionPrimaryHover() throws { @@ -455,9 +454,9 @@ final class TestThemeOverrideOfColorSemanticTokens: XCTestCase { XCTAssertTrue(inheritedTheme.colorActionPrimaryHover == OtherMockTheme.otherMockThemeMultipleColorTokens) } - func testInheritedThemeCanOverrideSemanticTokenColorActionPrimaryHoverOnBackgroundEmphasized() throws { - XCTAssertNotEqual(inheritedTheme.colorActionPrimaryHoverOnBackgroundEmphasized, abstractTheme.colorActionPrimaryHoverOnBackgroundEmphasized) - XCTAssertTrue(inheritedTheme.colorActionPrimaryHoverOnBackgroundEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorActionPrimaryHoverOnBgEmphasized() throws { + XCTAssertNotEqual(inheritedTheme.colorActionPrimaryHoverOnBgEmphasized, abstractTheme.colorActionPrimaryHoverOnBgEmphasized) + XCTAssertTrue(inheritedTheme.colorActionPrimaryHoverOnBgEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) } func testInheritedThemeCanOverrideSemanticTokenColorActionPrimaryPressed() throws { @@ -465,9 +464,9 @@ final class TestThemeOverrideOfColorSemanticTokens: XCTestCase { XCTAssertTrue(inheritedTheme.colorActionPrimaryPressed == OtherMockTheme.otherMockThemeMultipleColorTokens) } - func testInheritedThemeCanOverrideSemanticTokenColorActionPrimaryPressedOnBackgroundEmphasized() throws { - XCTAssertNotEqual(inheritedTheme.colorActionPrimaryPressedOnBackgroundEmphasized, abstractTheme.colorActionPrimaryPressedOnBackgroundEmphasized) - XCTAssertTrue(inheritedTheme.colorActionPrimaryPressedOnBackgroundEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorActionPrimaryPressedOnBgEmphasized() throws { + XCTAssertNotEqual(inheritedTheme.colorActionPrimaryPressedOnBgEmphasized, abstractTheme.colorActionPrimaryPressedOnBgEmphasized) + XCTAssertTrue(inheritedTheme.colorActionPrimaryPressedOnBgEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) } func testInheritedThemeCanOverrideSemanticTokenColorActionPrimaryLoading() throws { @@ -475,9 +474,9 @@ final class TestThemeOverrideOfColorSemanticTokens: XCTestCase { XCTAssertTrue(inheritedTheme.colorActionPrimaryLoading == OtherMockTheme.otherMockThemeMultipleColorTokens) } - func testInheritedThemeCanOverrideSemanticTokenColorActionPrimaryLoadingOnBackgroundEmphasized() throws { - XCTAssertNotEqual(inheritedTheme.colorActionPrimaryLoadingOnBackgroundEmphasized, abstractTheme.colorActionPrimaryLoadingOnBackgroundEmphasized) - XCTAssertTrue(inheritedTheme.colorActionPrimaryLoadingOnBackgroundEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorActionPrimaryLoadingOnBgEmphasized() throws { + XCTAssertNotEqual(inheritedTheme.colorActionPrimaryLoadingOnBgEmphasized, abstractTheme.colorActionPrimaryLoadingOnBgEmphasized) + XCTAssertTrue(inheritedTheme.colorActionPrimaryLoadingOnBgEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) } func testInheritedThemeCanOverrideSemanticTokenColorActionPrimaryFocus() throws { @@ -485,9 +484,9 @@ final class TestThemeOverrideOfColorSemanticTokens: XCTestCase { XCTAssertTrue(inheritedTheme.colorActionPrimaryFocus == OtherMockTheme.otherMockThemeMultipleColorTokens) } - func testInheritedThemeCanOverrideSemanticTokenColorActionPrimaryFocusOnBackgroundEmphasized() throws { - XCTAssertNotEqual(inheritedTheme.colorActionPrimaryFocusOnBackgroundEmphasized, abstractTheme.colorActionPrimaryFocusOnBackgroundEmphasized) - XCTAssertTrue(inheritedTheme.colorActionPrimaryFocusOnBackgroundEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorActionPrimaryFocusOnBgEmphasized() throws { + XCTAssertNotEqual(inheritedTheme.colorActionPrimaryFocusOnBgEmphasized, abstractTheme.colorActionPrimaryFocusOnBgEmphasized) + XCTAssertTrue(inheritedTheme.colorActionPrimaryFocusOnBgEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) } func testInheritedThemeCanOverrideSemanticTokenColorActionSecondaryEnabled() throws { @@ -495,9 +494,9 @@ final class TestThemeOverrideOfColorSemanticTokens: XCTestCase { XCTAssertTrue(inheritedTheme.colorActionSecondaryEnabled == OtherMockTheme.otherMockThemeMultipleColorTokens) } - func testInheritedThemeCanOverrideSemanticTokenColorActionSecondaryEnabledOnBackgroundEmphasized() throws { - XCTAssertNotEqual(inheritedTheme.colorActionSecondaryEnabledOnBackgroundEmphasized, abstractTheme.colorActionSecondaryEnabledOnBackgroundEmphasized) - XCTAssertTrue(inheritedTheme.colorActionSecondaryEnabledOnBackgroundEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorActionSecondaryEnabledOnBgEmphasized() throws { + XCTAssertNotEqual(inheritedTheme.colorActionSecondaryEnabledOnBgEmphasized, abstractTheme.colorActionSecondaryEnabledOnBgEmphasized) + XCTAssertTrue(inheritedTheme.colorActionSecondaryEnabledOnBgEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) } func testInheritedThemeCanOverrideSemanticTokenColorActionSecondaryHover() throws { @@ -505,9 +504,9 @@ final class TestThemeOverrideOfColorSemanticTokens: XCTestCase { XCTAssertTrue(inheritedTheme.colorActionSecondaryHover == OtherMockTheme.otherMockThemeMultipleColorTokens) } - func testInheritedThemeCanOverrideSemanticTokenColorActionSecondaryHoverOnBackgroundEmphasized() throws { - XCTAssertNotEqual(inheritedTheme.colorActionSecondaryHoverOnBackgroundEmphasized, abstractTheme.colorActionSecondaryHoverOnBackgroundEmphasized) - XCTAssertTrue(inheritedTheme.colorActionSecondaryHoverOnBackgroundEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorActionSecondaryHoverOnBgEmphasized() throws { + XCTAssertNotEqual(inheritedTheme.colorActionSecondaryHoverOnBgEmphasized, abstractTheme.colorActionSecondaryHoverOnBgEmphasized) + XCTAssertTrue(inheritedTheme.colorActionSecondaryHoverOnBgEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) } func testInheritedThemeCanOverrideSemanticTokenColorActionSecondaryPressed() throws { @@ -515,9 +514,9 @@ final class TestThemeOverrideOfColorSemanticTokens: XCTestCase { XCTAssertTrue(inheritedTheme.colorActionSecondaryPressed == OtherMockTheme.otherMockThemeMultipleColorTokens) } - func testInheritedThemeCanOverrideSemanticTokenColorActionSecondaryPressedOnBackgroundEmphasized() throws { - XCTAssertNotEqual(inheritedTheme.colorActionSecondaryPressedOnBackgroundEmphasized, abstractTheme.colorActionSecondaryPressedOnBackgroundEmphasized) - XCTAssertTrue(inheritedTheme.colorActionSecondaryPressedOnBackgroundEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorActionSecondaryPressedOnBgEmphasized() throws { + XCTAssertNotEqual(inheritedTheme.colorActionSecondaryPressedOnBgEmphasized, abstractTheme.colorActionSecondaryPressedOnBgEmphasized) + XCTAssertTrue(inheritedTheme.colorActionSecondaryPressedOnBgEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) } func testInheritedThemeCanOverrideSemanticTokenColorActionSecondaryLoading() throws { @@ -525,9 +524,9 @@ final class TestThemeOverrideOfColorSemanticTokens: XCTestCase { XCTAssertTrue(inheritedTheme.colorActionSecondaryLoading == OtherMockTheme.otherMockThemeMultipleColorTokens) } - func testInheritedThemeCanOverrideSemanticTokenColorActionSecondaryLoadingOnBackgroundEmphasized() throws { - XCTAssertNotEqual(inheritedTheme.colorActionSecondaryLoadingOnBackgroundEmphasized, abstractTheme.colorActionSecondaryLoadingOnBackgroundEmphasized) - XCTAssertTrue(inheritedTheme.colorActionSecondaryLoadingOnBackgroundEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorActionSecondaryLoadingOnBgEmphasized() throws { + XCTAssertNotEqual(inheritedTheme.colorActionSecondaryLoadingOnBgEmphasized, abstractTheme.colorActionSecondaryLoadingOnBgEmphasized) + XCTAssertTrue(inheritedTheme.colorActionSecondaryLoadingOnBgEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) } func testInheritedThemeCanOverrideSemanticTokenColorActionSecondaryFocus() throws { @@ -535,9 +534,9 @@ final class TestThemeOverrideOfColorSemanticTokens: XCTestCase { XCTAssertTrue(inheritedTheme.colorActionSecondaryFocus == OtherMockTheme.otherMockThemeMultipleColorTokens) } - func testInheritedThemeCanOverrideSemanticTokenColorActionSecondaryFocusOnBackgroundEmphasized() throws { - XCTAssertNotEqual(inheritedTheme.colorActionSecondaryFocusOnBackgroundEmphasized, abstractTheme.colorActionSecondaryFocusOnBackgroundEmphasized) - XCTAssertTrue(inheritedTheme.colorActionSecondaryFocusOnBackgroundEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorActionSecondaryFocusOnBgEmphasized() throws { + XCTAssertNotEqual(inheritedTheme.colorActionSecondaryFocusOnBgEmphasized, abstractTheme.colorActionSecondaryFocusOnBgEmphasized) + XCTAssertTrue(inheritedTheme.colorActionSecondaryFocusOnBgEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) } func testInheritedThemeCanOverrideSemanticTokenColorActionNegativeEnabled() throws { @@ -565,119 +564,119 @@ final class TestThemeOverrideOfColorSemanticTokens: XCTestCase { XCTAssertTrue(inheritedTheme.colorActionNegativeFocus == OtherMockTheme.otherMockThemeMultipleColorTokens) } - func testInheritedThemeCanOverrideSemanticTokenColorActionOnBackgroundActionDisabled() throws { - XCTAssertNotEqual(inheritedTheme.colorActionOnBackgroundActionDisabled, abstractTheme.colorActionOnBackgroundActionDisabled) - XCTAssertTrue(inheritedTheme.colorActionOnBackgroundActionDisabled == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorActionOnBgActionDisabled() throws { + XCTAssertNotEqual(inheritedTheme.colorActionOnBgActionDisabled, abstractTheme.colorActionOnBgActionDisabled) + XCTAssertTrue(inheritedTheme.colorActionOnBgActionDisabled == OtherMockTheme.otherMockThemeMultipleColorTokens) } - func testInheritedThemeCanOverrideSemanticTokenColorActionOnBackgroundActionDisabledOnBackgroundEmphasized() throws { - XCTAssertNotEqual(inheritedTheme.colorActionOnBackgroundActionDisabledOnBackgroundEmphasized, abstractTheme.colorActionOnBackgroundActionDisabledOnBackgroundEmphasized) - XCTAssertTrue(inheritedTheme.colorActionOnBackgroundActionDisabledOnBackgroundEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorActionOnBgActionDisabledOnBgEmphasized() throws { + XCTAssertNotEqual(inheritedTheme.colorActionOnBgActionDisabledOnBgEmphasized, abstractTheme.colorActionOnBgActionDisabledOnBgEmphasized) + XCTAssertTrue(inheritedTheme.colorActionOnBgActionDisabledOnBgEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) } - func testInheritedThemeCanOverrideSemanticTokenColorActionOnBackgroundActionNegative() throws { - XCTAssertNotEqual(inheritedTheme.colorActionOnBackgroundActionNegative, abstractTheme.colorActionOnBackgroundActionNegative) - XCTAssertTrue(inheritedTheme.colorActionOnBackgroundActionNegative == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorActionOnBgActionNegative() throws { + XCTAssertNotEqual(inheritedTheme.colorActionOnBgActionNegative, abstractTheme.colorActionOnBgActionNegative) + XCTAssertTrue(inheritedTheme.colorActionOnBgActionNegative == OtherMockTheme.otherMockThemeMultipleColorTokens) } - func testInheritedThemeCanOverrideSemanticTokenColorActionOnBackgroundActionPrimaryEnabled() throws { - XCTAssertNotEqual(inheritedTheme.colorActionOnBackgroundActionPrimaryEnabled, abstractTheme.colorActionOnBackgroundActionPrimaryEnabled) - XCTAssertTrue(inheritedTheme.colorActionOnBackgroundActionPrimaryEnabled == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorActionOnBgActionPrimaryEnabled() throws { + XCTAssertNotEqual(inheritedTheme.colorActionOnBgActionPrimaryEnabled, abstractTheme.colorActionOnBgActionPrimaryEnabled) + XCTAssertTrue(inheritedTheme.colorActionOnBgActionPrimaryEnabled == OtherMockTheme.otherMockThemeMultipleColorTokens) } - func testInheritedThemeCanOverrideSemanticTokenColorActionOnBackgroundActionPrimaryEnabledOnBackgroundEmphasized() throws { - XCTAssertNotEqual(inheritedTheme.colorActionOnBackgroundActionPrimaryEnabledOnBackgroundEmphasized, abstractTheme.colorActionOnBackgroundActionPrimaryEnabledOnBackgroundEmphasized) - XCTAssertTrue(inheritedTheme.colorActionOnBackgroundActionPrimaryEnabledOnBackgroundEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorActionOnBgActionPrimaryEnabledOnBgEmphasized() throws { + XCTAssertNotEqual(inheritedTheme.colorActionOnBgActionPrimaryEnabledOnBgEmphasized, abstractTheme.colorActionOnBgActionPrimaryEnabledOnBgEmphasized) + XCTAssertTrue(inheritedTheme.colorActionOnBgActionPrimaryEnabledOnBgEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) } - func testInheritedThemeCanOverrideSemanticTokenColorActionOnBackgroundActionPrimaryHover() throws { - XCTAssertNotEqual(inheritedTheme.colorActionOnBackgroundActionPrimaryHover, abstractTheme.colorActionOnBackgroundActionPrimaryHover) - XCTAssertTrue(inheritedTheme.colorActionOnBackgroundActionPrimaryHover == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorActionOnBgActionPrimaryHover() throws { + XCTAssertNotEqual(inheritedTheme.colorActionOnBgActionPrimaryHover, abstractTheme.colorActionOnBgActionPrimaryHover) + XCTAssertTrue(inheritedTheme.colorActionOnBgActionPrimaryHover == OtherMockTheme.otherMockThemeMultipleColorTokens) } - func testInheritedThemeCanOverrideSemanticTokenColorActionOnBackgroundActionPrimaryHoverOnBackgroundEmphasized() throws { - XCTAssertNotEqual(inheritedTheme.colorActionOnBackgroundActionPrimaryHoverOnBackgroundEmphasized, abstractTheme.colorActionOnBackgroundActionPrimaryHoverOnBackgroundEmphasized) - XCTAssertTrue(inheritedTheme.colorActionOnBackgroundActionPrimaryHoverOnBackgroundEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorActionOnBgActionPrimaryHoverOnBgEmphasized() throws { + XCTAssertNotEqual(inheritedTheme.colorActionOnBgActionPrimaryHoverOnBgEmphasized, abstractTheme.colorActionOnBgActionPrimaryHoverOnBgEmphasized) + XCTAssertTrue(inheritedTheme.colorActionOnBgActionPrimaryHoverOnBgEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) } - func testInheritedThemeCanOverrideSemanticTokenColorActionOnBackgroundActionPrimaryPressed() throws { - XCTAssertNotEqual(inheritedTheme.colorActionOnBackgroundActionPrimaryPressed, abstractTheme.colorActionOnBackgroundActionPrimaryPressed) - XCTAssertTrue(inheritedTheme.colorActionOnBackgroundActionPrimaryPressed == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorActionOnBgActionPrimaryPressed() throws { + XCTAssertNotEqual(inheritedTheme.colorActionOnBgActionPrimaryPressed, abstractTheme.colorActionOnBgActionPrimaryPressed) + XCTAssertTrue(inheritedTheme.colorActionOnBgActionPrimaryPressed == OtherMockTheme.otherMockThemeMultipleColorTokens) } - func testInheritedThemeCanOverrideSemanticTokenColorActionOnBackgroundActionPrimaryPressedOnBackgroundEmphasized() throws { - XCTAssertNotEqual(inheritedTheme.colorActionOnBackgroundActionPrimaryPressedOnBackgroundEmphasized, abstractTheme.colorActionOnBackgroundActionPrimaryPressedOnBackgroundEmphasized) - XCTAssertTrue(inheritedTheme.colorActionOnBackgroundActionPrimaryPressedOnBackgroundEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorActionOnBgActionPrimaryPressedOnBgEmphasized() throws { + XCTAssertNotEqual(inheritedTheme.colorActionOnBgActionPrimaryPressedOnBgEmphasized, abstractTheme.colorActionOnBgActionPrimaryPressedOnBgEmphasized) + XCTAssertTrue(inheritedTheme.colorActionOnBgActionPrimaryPressedOnBgEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) } - func testInheritedThemeCanOverrideSemanticTokenColorActionOnBackgroundActionPrimaryLoading() throws { - XCTAssertNotEqual(inheritedTheme.colorActionOnBackgroundActionPrimaryLoading, abstractTheme.colorActionOnBackgroundActionPrimaryLoading) - XCTAssertTrue(inheritedTheme.colorActionOnBackgroundActionPrimaryLoading == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorActionOnBgActionPrimaryLoading() throws { + XCTAssertNotEqual(inheritedTheme.colorActionOnBgActionPrimaryLoading, abstractTheme.colorActionOnBgActionPrimaryLoading) + XCTAssertTrue(inheritedTheme.colorActionOnBgActionPrimaryLoading == OtherMockTheme.otherMockThemeMultipleColorTokens) } - func testInheritedThemeCanOverrideSemanticTokenColorActionOnBackgroundActionPrimaryLoadingOnBackgroundEmphasized() throws { - XCTAssertNotEqual(inheritedTheme.colorActionOnBackgroundActionPrimaryLoadingOnBackgroundEmphasized, abstractTheme.colorActionOnBackgroundActionPrimaryLoadingOnBackgroundEmphasized) - XCTAssertTrue(inheritedTheme.colorActionOnBackgroundActionPrimaryLoadingOnBackgroundEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorActionOnBgActionPrimaryLoadingOnBgEmphasized() throws { + XCTAssertNotEqual(inheritedTheme.colorActionOnBgActionPrimaryLoadingOnBgEmphasized, abstractTheme.colorActionOnBgActionPrimaryLoadingOnBgEmphasized) + XCTAssertTrue(inheritedTheme.colorActionOnBgActionPrimaryLoadingOnBgEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) } - func testInheritedThemeCanOverrideSemanticTokenColorActionOnBackgroundActionPrimaryFocus() throws { - XCTAssertNotEqual(inheritedTheme.colorActionOnBackgroundActionPrimaryFocus, abstractTheme.colorActionOnBackgroundActionPrimaryFocus) - XCTAssertTrue(inheritedTheme.colorActionOnBackgroundActionPrimaryFocus == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorActionOnBgActionPrimaryFocus() throws { + XCTAssertNotEqual(inheritedTheme.colorActionOnBgActionPrimaryFocus, abstractTheme.colorActionOnBgActionPrimaryFocus) + XCTAssertTrue(inheritedTheme.colorActionOnBgActionPrimaryFocus == OtherMockTheme.otherMockThemeMultipleColorTokens) } - func testInheritedThemeCanOverrideSemanticTokenColorActionOnBackgroundActionPrimaryFocusOnBackgroundEmphasized() throws { - XCTAssertNotEqual(inheritedTheme.colorActionOnBackgroundActionPrimaryFocusOnBackgroundEmphasized, abstractTheme.colorActionOnBackgroundActionPrimaryFocusOnBackgroundEmphasized) - XCTAssertTrue(inheritedTheme.colorActionOnBackgroundActionPrimaryFocusOnBackgroundEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorActionOnBgActionPrimaryFocusOnBgEmphasized() throws { + XCTAssertNotEqual(inheritedTheme.colorActionOnBgActionPrimaryFocusOnBgEmphasized, abstractTheme.colorActionOnBgActionPrimaryFocusOnBgEmphasized) + XCTAssertTrue(inheritedTheme.colorActionOnBgActionPrimaryFocusOnBgEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) } - func testInheritedThemeCanOverrideSemanticTokenColorActionOnBackgroundActionSecondaryEnabled() throws { - XCTAssertNotEqual(inheritedTheme.colorActionOnBackgroundActionSecondaryEnabled, abstractTheme.colorActionOnBackgroundActionSecondaryEnabled) - XCTAssertTrue(inheritedTheme.colorActionOnBackgroundActionSecondaryEnabled == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorActionOnBgActionSecondaryEnabled() throws { + XCTAssertNotEqual(inheritedTheme.colorActionOnBgActionSecondaryEnabled, abstractTheme.colorActionOnBgActionSecondaryEnabled) + XCTAssertTrue(inheritedTheme.colorActionOnBgActionSecondaryEnabled == OtherMockTheme.otherMockThemeMultipleColorTokens) } - func testInheritedThemeCanOverrideSemanticTokenColorActionOnBackgroundActionSecondaryEnabledOnBackgroundEmphasized() throws { - XCTAssertNotEqual(inheritedTheme.colorActionOnBackgroundActionSecondaryEnabledOnBackgroundEmphasized, abstractTheme.colorActionOnBackgroundActionSecondaryEnabledOnBackgroundEmphasized) - XCTAssertTrue(inheritedTheme.colorActionOnBackgroundActionSecondaryEnabledOnBackgroundEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorActionOnBgActionSecondaryEnabledOnBgEmphasized() throws { + XCTAssertNotEqual(inheritedTheme.colorActionOnBgActionSecondaryEnabledOnBgEmphasized, abstractTheme.colorActionOnBgActionSecondaryEnabledOnBgEmphasized) + XCTAssertTrue(inheritedTheme.colorActionOnBgActionSecondaryEnabledOnBgEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) } - func testInheritedThemeCanOverrideSemanticTokenColorActionOnBackgroundActionSecondaryHover() throws { - XCTAssertNotEqual(inheritedTheme.colorActionOnBackgroundActionSecondaryHover, abstractTheme.colorActionOnBackgroundActionSecondaryHover) - XCTAssertTrue(inheritedTheme.colorActionOnBackgroundActionSecondaryHover == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorActionOnBgActionSecondaryHover() throws { + XCTAssertNotEqual(inheritedTheme.colorActionOnBgActionSecondaryHover, abstractTheme.colorActionOnBgActionSecondaryHover) + XCTAssertTrue(inheritedTheme.colorActionOnBgActionSecondaryHover == OtherMockTheme.otherMockThemeMultipleColorTokens) } - func testInheritedThemeCanOverrideSemanticTokenColorActionOnBackgroundActionSecondaryHoverOnBackgroundEmphasized() throws { - XCTAssertNotEqual(inheritedTheme.colorActionOnBackgroundActionSecondaryHoverOnBackgroundEmphasized, abstractTheme.colorActionOnBackgroundActionSecondaryHoverOnBackgroundEmphasized) - XCTAssertTrue(inheritedTheme.colorActionOnBackgroundActionSecondaryHoverOnBackgroundEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorActionOnBgActionSecondaryHoverOnBgEmphasized() throws { + XCTAssertNotEqual(inheritedTheme.colorActionOnBgActionSecondaryHoverOnBgEmphasized, abstractTheme.colorActionOnBgActionSecondaryHoverOnBgEmphasized) + XCTAssertTrue(inheritedTheme.colorActionOnBgActionSecondaryHoverOnBgEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) } - func testInheritedThemeCanOverrideSemanticTokenColorActionOnBackgroundActionSecondaryPressed() throws { - XCTAssertNotEqual(inheritedTheme.colorActionOnBackgroundActionSecondaryPressed, abstractTheme.colorActionOnBackgroundActionSecondaryPressed) - XCTAssertTrue(inheritedTheme.colorActionOnBackgroundActionSecondaryPressed == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorActionOnBgActionSecondaryPressed() throws { + XCTAssertNotEqual(inheritedTheme.colorActionOnBgActionSecondaryPressed, abstractTheme.colorActionOnBgActionSecondaryPressed) + XCTAssertTrue(inheritedTheme.colorActionOnBgActionSecondaryPressed == OtherMockTheme.otherMockThemeMultipleColorTokens) } - func testInheritedThemeCanOverrideSemanticTokenColorActionOnBackgroundActionSecondaryPressedOnBackgroundEmphasized() throws { - XCTAssertNotEqual(inheritedTheme.colorActionOnBackgroundActionSecondaryPressedOnBackgroundEmphasized, abstractTheme.colorActionOnBackgroundActionSecondaryPressedOnBackgroundEmphasized) - XCTAssertTrue(inheritedTheme.colorActionOnBackgroundActionSecondaryPressedOnBackgroundEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorActionOnBgActionSecondaryPressedOnBgEmphasized() throws { + XCTAssertNotEqual(inheritedTheme.colorActionOnBgActionSecondaryPressedOnBgEmphasized, abstractTheme.colorActionOnBgActionSecondaryPressedOnBgEmphasized) + XCTAssertTrue(inheritedTheme.colorActionOnBgActionSecondaryPressedOnBgEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) } - func testInheritedThemeCanOverrideSemanticTokenColorActionOnBackgroundActionSecondaryLoading() throws { - XCTAssertNotEqual(inheritedTheme.colorActionOnBackgroundActionSecondaryLoading, abstractTheme.colorActionOnBackgroundActionSecondaryLoading) - XCTAssertTrue(inheritedTheme.colorActionOnBackgroundActionSecondaryLoading == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorActionOnBgActionSecondaryLoading() throws { + XCTAssertNotEqual(inheritedTheme.colorActionOnBgActionSecondaryLoading, abstractTheme.colorActionOnBgActionSecondaryLoading) + XCTAssertTrue(inheritedTheme.colorActionOnBgActionSecondaryLoading == OtherMockTheme.otherMockThemeMultipleColorTokens) } - func testInheritedThemeCanOverrideSemanticTokenColorActionOnBackgroundActionSecondaryLoadingOnBackgroundEmphasized() throws { - XCTAssertNotEqual(inheritedTheme.colorActionOnBackgroundActionSecondaryLoadingOnBackgroundEmphasized, abstractTheme.colorActionOnBackgroundActionSecondaryLoadingOnBackgroundEmphasized) - XCTAssertTrue(inheritedTheme.colorActionOnBackgroundActionSecondaryLoadingOnBackgroundEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorActionOnBgActionSecondaryLoadingOnBgEmphasized() throws { + XCTAssertNotEqual(inheritedTheme.colorActionOnBgActionSecondaryLoadingOnBgEmphasized, abstractTheme.colorActionOnBgActionSecondaryLoadingOnBgEmphasized) + XCTAssertTrue(inheritedTheme.colorActionOnBgActionSecondaryLoadingOnBgEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) } - func testInheritedThemeCanOverrideSemanticTokenColorActionOnBackgroundActionSecondaryFocus() throws { - XCTAssertNotEqual(inheritedTheme.colorActionOnBackgroundActionSecondaryFocus, abstractTheme.colorActionOnBackgroundActionSecondaryFocus) - XCTAssertTrue(inheritedTheme.colorActionOnBackgroundActionSecondaryFocus == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorActionOnBgActionSecondaryFocus() throws { + XCTAssertNotEqual(inheritedTheme.colorActionOnBgActionSecondaryFocus, abstractTheme.colorActionOnBgActionSecondaryFocus) + XCTAssertTrue(inheritedTheme.colorActionOnBgActionSecondaryFocus == OtherMockTheme.otherMockThemeMultipleColorTokens) } - func testInheritedThemeCanOverrideSemanticTokenColorActionOnBackgroundActionSecondaryFocusOnBackgroundEmphasized() throws { - XCTAssertNotEqual(inheritedTheme.colorActionOnBackgroundActionSecondaryFocusOnBackgroundEmphasized, abstractTheme.colorActionOnBackgroundActionSecondaryFocusOnBackgroundEmphasized) - XCTAssertTrue(inheritedTheme.colorActionOnBackgroundActionSecondaryFocusOnBackgroundEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorActionOnBgActionSecondaryFocusOnBgEmphasized() throws { + XCTAssertNotEqual(inheritedTheme.colorActionOnBgActionSecondaryFocusOnBgEmphasized, abstractTheme.colorActionOnBgActionSecondaryFocusOnBgEmphasized) + XCTAssertTrue(inheritedTheme.colorActionOnBgActionSecondaryFocusOnBgEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) } // MARK: Semantic token - Colors - Always @@ -717,39 +716,39 @@ final class TestThemeOverrideOfColorSemanticTokens: XCTestCase { XCTAssertTrue(inheritedTheme.colorAlwaysAccent == OtherMockTheme.otherMockThemeMultipleColorTokens) } - func testInheritedThemeCanOverrideSemanticTokenColorAlwaysOnBackgroundBlack() throws { - XCTAssertNotEqual(inheritedTheme.colorAlwaysOnBackgroundBlack, abstractTheme.colorAlwaysOnBackgroundBlack) - XCTAssertTrue(inheritedTheme.colorAlwaysOnBackgroundBlack == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorAlwaysOnBgBlack() throws { + XCTAssertNotEqual(inheritedTheme.colorAlwaysOnBgBlack, abstractTheme.colorAlwaysOnBgBlack) + XCTAssertTrue(inheritedTheme.colorAlwaysOnBgBlack == OtherMockTheme.otherMockThemeMultipleColorTokens) } - func testInheritedThemeCanOverrideSemanticTokenColorAlwaysOnBackgroundWhite() throws { - XCTAssertNotEqual(inheritedTheme.colorAlwaysOnBackgroundWhite, abstractTheme.colorAlwaysOnBackgroundWhite) - XCTAssertTrue(inheritedTheme.colorAlwaysOnBackgroundWhite == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorAlwaysOnBgWhite() throws { + XCTAssertNotEqual(inheritedTheme.colorAlwaysOnBgWhite, abstractTheme.colorAlwaysOnBgWhite) + XCTAssertTrue(inheritedTheme.colorAlwaysOnBgWhite == OtherMockTheme.otherMockThemeMultipleColorTokens) } - func testInheritedThemeCanOverrideSemanticTokenColorAlwaysOnBackgroundWarning() throws { - XCTAssertNotEqual(inheritedTheme.colorAlwaysOnBackgroundWarning, abstractTheme.colorAlwaysOnBackgroundWarning) - XCTAssertTrue(inheritedTheme.colorAlwaysOnBackgroundWarning == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorAlwaysOnBgWarning() throws { + XCTAssertNotEqual(inheritedTheme.colorAlwaysOnBgWarning, abstractTheme.colorAlwaysOnBgWarning) + XCTAssertTrue(inheritedTheme.colorAlwaysOnBgWarning == OtherMockTheme.otherMockThemeMultipleColorTokens) } - func testInheritedThemeCanOverrideSemanticTokenColorAlwaysOnBackgroundNegative() throws { - XCTAssertNotEqual(inheritedTheme.colorAlwaysOnBackgroundNegative, abstractTheme.colorAlwaysOnBackgroundNegative) - XCTAssertTrue(inheritedTheme.colorAlwaysOnBackgroundNegative == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorAlwaysOnBgNegative() throws { + XCTAssertNotEqual(inheritedTheme.colorAlwaysOnBgNegative, abstractTheme.colorAlwaysOnBgNegative) + XCTAssertTrue(inheritedTheme.colorAlwaysOnBgNegative == OtherMockTheme.otherMockThemeMultipleColorTokens) } - func testInheritedThemeCanOverrideSemanticTokenColorAlwaysOnBackgroundPositive() throws { - XCTAssertNotEqual(inheritedTheme.colorAlwaysOnBackgroundPositive, abstractTheme.colorAlwaysOnBackgroundPositive) - XCTAssertTrue(inheritedTheme.colorAlwaysOnBackgroundPositive == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorAlwaysOnBgPositive() throws { + XCTAssertNotEqual(inheritedTheme.colorAlwaysOnBgPositive, abstractTheme.colorAlwaysOnBgPositive) + XCTAssertTrue(inheritedTheme.colorAlwaysOnBgPositive == OtherMockTheme.otherMockThemeMultipleColorTokens) } - func testInheritedThemeCanOverrideSemanticTokenColorAlwaysOnBackgroundInfo() throws { - XCTAssertNotEqual(inheritedTheme.colorAlwaysOnBackgroundInfo, abstractTheme.colorAlwaysOnBackgroundInfo) - XCTAssertTrue(inheritedTheme.colorAlwaysOnBackgroundInfo == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorAlwaysOnBgInfo() throws { + XCTAssertNotEqual(inheritedTheme.colorAlwaysOnBgInfo, abstractTheme.colorAlwaysOnBgInfo) + XCTAssertTrue(inheritedTheme.colorAlwaysOnBgInfo == OtherMockTheme.otherMockThemeMultipleColorTokens) } - func testInheritedThemeCanOverrideSemanticTokenColorAlwaysOnBackgroundAccent() throws { - XCTAssertNotEqual(inheritedTheme.colorAlwaysOnBackgroundAccent, abstractTheme.colorAlwaysOnBackgroundAccent) - XCTAssertTrue(inheritedTheme.colorAlwaysOnBackgroundAccent == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorAlwaysOnBgAccent() throws { + XCTAssertNotEqual(inheritedTheme.colorAlwaysOnBgAccent, abstractTheme.colorAlwaysOnBgAccent) + XCTAssertTrue(inheritedTheme.colorAlwaysOnBgAccent == OtherMockTheme.otherMockThemeMultipleColorTokens) } // MARK: Semantic token - Colors - Transparent @@ -766,14 +765,14 @@ final class TestThemeOverrideOfColorSemanticTokens: XCTestCase { XCTAssertTrue(inheritedTheme.colorElevationRaised == OtherMockTheme.otherMockThemeMultipleColorTokens) } - func testInheritedThemeCanOverrideSemanticTokenColorElevationRaisedOnBackgroundSecondary() throws { - XCTAssertNotEqual(inheritedTheme.colorElevationRaisedOnBackgroundSecondary, abstractTheme.colorElevationRaisedOnBackgroundSecondary) - XCTAssertTrue(inheritedTheme.colorElevationRaisedOnBackgroundSecondary == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorElevationRaisedOnBgSecondary() throws { + XCTAssertNotEqual(inheritedTheme.colorElevationRaisedOnBgSecondary, abstractTheme.colorElevationRaisedOnBgSecondary) + XCTAssertTrue(inheritedTheme.colorElevationRaisedOnBgSecondary == OtherMockTheme.otherMockThemeMultipleColorTokens) } - func testInheritedThemeCanOverrideSemanticTokenColorElevationRaisedOnBackgroundEmphasized() throws { - XCTAssertNotEqual(inheritedTheme.colorElevationRaisedOnBackgroundEmphasized, abstractTheme.colorElevationRaisedOnBackgroundEmphasized) - XCTAssertTrue(inheritedTheme.colorElevationRaisedOnBackgroundEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorElevationRaisedOnBgEmphasized() throws { + XCTAssertNotEqual(inheritedTheme.colorElevationRaisedOnBgEmphasized, abstractTheme.colorElevationRaisedOnBgEmphasized) + XCTAssertTrue(inheritedTheme.colorElevationRaisedOnBgEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) } func testInheritedThemeCanOverrideSemanticTokenColorElevationDrag() throws { @@ -781,14 +780,14 @@ final class TestThemeOverrideOfColorSemanticTokens: XCTestCase { XCTAssertTrue(inheritedTheme.colorElevationDrag == OtherMockTheme.otherMockThemeMultipleColorTokens) } - func testInheritedThemeCanOverrideSemanticTokenColorElevationDragOnBackgroundSecondary() throws { - XCTAssertNotEqual(inheritedTheme.colorElevationDragOnBackgroundSecondary, abstractTheme.colorElevationDragOnBackgroundSecondary) - XCTAssertTrue(inheritedTheme.colorElevationDragOnBackgroundSecondary == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorElevationDragOnBgSecondary() throws { + XCTAssertNotEqual(inheritedTheme.colorElevationDragOnBgSecondary, abstractTheme.colorElevationDragOnBgSecondary) + XCTAssertTrue(inheritedTheme.colorElevationDragOnBgSecondary == OtherMockTheme.otherMockThemeMultipleColorTokens) } - func testInheritedThemeCanOverrideSemanticTokenColorElevationDragOnBackgroundEmphasized() throws { - XCTAssertNotEqual(inheritedTheme.colorElevationDragOnBackgroundEmphasized, abstractTheme.colorElevationDragOnBackgroundEmphasized) - XCTAssertTrue(inheritedTheme.colorElevationDragOnBackgroundEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorElevationDragOnBgEmphasized() throws { + XCTAssertNotEqual(inheritedTheme.colorElevationDragOnBgEmphasized, abstractTheme.colorElevationDragOnBgEmphasized) + XCTAssertTrue(inheritedTheme.colorElevationDragOnBgEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) } func testInheritedThemeCanOverrideSemanticTokenColorElevationOverlayDefault() throws { @@ -796,14 +795,14 @@ final class TestThemeOverrideOfColorSemanticTokens: XCTestCase { XCTAssertTrue(inheritedTheme.colorElevationOverlayDefault == OtherMockTheme.otherMockThemeMultipleColorTokens) } - func testInheritedThemeCanOverrideSemanticTokenColorElevationOverlayDefaultOnBackgroundSecondary() throws { - XCTAssertNotEqual(inheritedTheme.colorElevationOverlayDefaultOnBackgroundSecondary, abstractTheme.colorElevationOverlayDefaultOnBackgroundSecondary) - XCTAssertTrue(inheritedTheme.colorElevationOverlayDefaultOnBackgroundSecondary == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorElevationOverlayDefaultOnBgSecondary() throws { + XCTAssertNotEqual(inheritedTheme.colorElevationOverlayDefaultOnBgSecondary, abstractTheme.colorElevationOverlayDefaultOnBgSecondary) + XCTAssertTrue(inheritedTheme.colorElevationOverlayDefaultOnBgSecondary == OtherMockTheme.otherMockThemeMultipleColorTokens) } - func testInheritedThemeCanOverrideSemanticTokenColorElevationOverlayDefaultOnBackgroundEmphasized() throws { - XCTAssertNotEqual(inheritedTheme.colorElevationOverlayDefaultOnBackgroundEmphasized, abstractTheme.colorElevationOverlayDefaultOnBackgroundEmphasized) - XCTAssertTrue(inheritedTheme.colorElevationOverlayDefaultOnBackgroundEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorElevationOverlayDefaultOnBgEmphasized() throws { + XCTAssertNotEqual(inheritedTheme.colorElevationOverlayDefaultOnBgEmphasized, abstractTheme.colorElevationOverlayDefaultOnBgEmphasized) + XCTAssertTrue(inheritedTheme.colorElevationOverlayDefaultOnBgEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) } func testInheritedThemeCanOverrideSemanticTokenColorElevationOverlayEmphasized() throws { @@ -811,14 +810,14 @@ final class TestThemeOverrideOfColorSemanticTokens: XCTestCase { XCTAssertTrue(inheritedTheme.colorElevationOverlayEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) } - func testInheritedThemeCanOverrideSemanticTokenColorElevationOverlayEmphasizedOnBackgroundSecondary() throws { - XCTAssertNotEqual(inheritedTheme.colorElevationOverlayEmphasizedOnBackgroundSecondary, abstractTheme.colorElevationOverlayEmphasizedOnBackgroundSecondary) - XCTAssertTrue(inheritedTheme.colorElevationOverlayEmphasizedOnBackgroundSecondary == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorElevationOverlayEmphasizedOnBgSecondary() throws { + XCTAssertNotEqual(inheritedTheme.colorElevationOverlayEmphasizedOnBgSecondary, abstractTheme.colorElevationOverlayEmphasizedOnBgSecondary) + XCTAssertTrue(inheritedTheme.colorElevationOverlayEmphasizedOnBgSecondary == OtherMockTheme.otherMockThemeMultipleColorTokens) } - func testInheritedThemeCanOverrideSemanticTokenColorElevationOverlayEmphasizedOnBackgroundEmphasized() throws { - XCTAssertNotEqual(inheritedTheme.colorElevationOverlayEmphasizedOnBackgroundEmphasized, abstractTheme.colorElevationOverlayEmphasizedOnBackgroundEmphasized) - XCTAssertTrue(inheritedTheme.colorElevationOverlayEmphasizedOnBackgroundEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorElevationOverlayEmphasizedOnBgEmphasized() throws { + XCTAssertNotEqual(inheritedTheme.colorElevationOverlayEmphasizedOnBgEmphasized, abstractTheme.colorElevationOverlayEmphasizedOnBgEmphasized) + XCTAssertTrue(inheritedTheme.colorElevationOverlayEmphasizedOnBgEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) } func testInheritedThemeCanOverrideSemanticTokenColorElevationModal() throws { @@ -828,19 +827,9 @@ final class TestThemeOverrideOfColorSemanticTokens: XCTestCase { // MARK: Semantic token - Colors - Decorative - func testInheritedThemeCanOverrideSemanticTokenColorDecorativeBrandPrimary() throws { - XCTAssertNotEqual(inheritedTheme.colorDecorativeBrandPrimary, abstractTheme.colorDecorativeBrandPrimary) - XCTAssertTrue(inheritedTheme.colorDecorativeBrandPrimary == OtherMockTheme.otherMockThemeMultipleColorTokens) - } - - func testInheritedThemeCanOverrideSemanticTokenColorDecorativeBrandPrimaryMuted() throws { - XCTAssertNotEqual(inheritedTheme.colorDecorativeBrandPrimaryMuted, abstractTheme.colorDecorativeBrandPrimaryMuted) - XCTAssertTrue(inheritedTheme.colorDecorativeBrandPrimaryMuted == OtherMockTheme.otherMockThemeMultipleColorTokens) - } - - func testInheritedThemeCanOverrideSemanticTokenColorDecorativeBrandPrimaryEmphasized() throws { - XCTAssertNotEqual(inheritedTheme.colorDecorativeBrandPrimaryEmphasized, abstractTheme.colorDecorativeBrandPrimaryEmphasized) - XCTAssertTrue(inheritedTheme.colorDecorativeBrandPrimaryEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorDecorativePrimary() throws { + XCTAssertNotEqual(inheritedTheme.colorDecorativePrimary, abstractTheme.colorDecorativePrimary) + XCTAssertTrue(inheritedTheme.colorDecorativePrimary == OtherMockTheme.otherMockThemeMultipleColorTokens) } func testInheritedThemeCanOverrideSemanticTokenColorDecorativeSecondary() throws { @@ -848,29 +837,9 @@ final class TestThemeOverrideOfColorSemanticTokens: XCTestCase { XCTAssertTrue(inheritedTheme.colorDecorativeSecondary == OtherMockTheme.otherMockThemeMultipleColorTokens) } - func testInheritedThemeCanOverrideSemanticTokenColorDecorativeSecondaryMuted() throws { - XCTAssertNotEqual(inheritedTheme.colorDecorativeSecondaryMuted, abstractTheme.colorDecorativeSecondaryMuted) - XCTAssertTrue(inheritedTheme.colorDecorativeSecondaryMuted == OtherMockTheme.otherMockThemeMultipleColorTokens) - } - - func testInheritedThemeCanOverrideSemanticTokenColorDecorativeSecondaryEmphasized() throws { - XCTAssertNotEqual(inheritedTheme.colorDecorativeSecondaryEmphasized, abstractTheme.colorDecorativeSecondaryEmphasized) - XCTAssertTrue(inheritedTheme.colorDecorativeSecondaryEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) - } - - func testInheritedThemeCanOverrideSemanticTokenColorDecorativeBrandTertiary() throws { - XCTAssertNotEqual(inheritedTheme.colorDecorativeBrandTertiary, abstractTheme.colorDecorativeBrandTertiary) - XCTAssertTrue(inheritedTheme.colorDecorativeBrandTertiary == OtherMockTheme.otherMockThemeMultipleColorTokens) - } - - func testInheritedThemeCanOverrideSemanticTokenColorDecorativeBrandTertiaryMuted() throws { - XCTAssertNotEqual(inheritedTheme.colorDecorativeBrandTertiaryMuted, abstractTheme.colorDecorativeBrandTertiaryMuted) - XCTAssertTrue(inheritedTheme.colorDecorativeBrandTertiaryMuted == OtherMockTheme.otherMockThemeMultipleColorTokens) - } - - func testInheritedThemeCanOverrideSemanticTokenColorDecorativeBrandTertiaryEmphasized() throws { - XCTAssertNotEqual(inheritedTheme.colorDecorativeBrandTertiaryEmphasized, abstractTheme.colorDecorativeBrandTertiaryEmphasized) - XCTAssertTrue(inheritedTheme.colorDecorativeBrandTertiaryEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorDecorativeTertiary() throws { + XCTAssertNotEqual(inheritedTheme.colorDecorativeTertiary, abstractTheme.colorDecorativeTertiary) + XCTAssertTrue(inheritedTheme.colorDecorativeTertiary == OtherMockTheme.otherMockThemeMultipleColorTokens) } func testInheritedThemeCanOverrideSemanticTokenColorDecorativeNeutralMuted() throws { @@ -963,49 +932,49 @@ final class TestThemeOverrideOfColorSemanticTokens: XCTestCase { XCTAssertTrue(inheritedTheme.colorDecorativeAccent5Emphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) } - func testInheritedThemeCanOverrideSemanticTokenColorDecorativeSkintTint100() throws { - XCTAssertNotEqual(inheritedTheme.colorDecorativeSkintTint100, abstractTheme.colorDecorativeSkintTint100) - XCTAssertTrue(inheritedTheme.colorDecorativeSkintTint100 == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorDecorativeSkinTint100() throws { + XCTAssertNotEqual(inheritedTheme.colorDecorativeSkinTint100, abstractTheme.colorDecorativeSkinTint100) + XCTAssertTrue(inheritedTheme.colorDecorativeSkinTint100 == OtherMockTheme.otherMockThemeMultipleColorTokens) } - func testInheritedThemeCanOverrideSemanticTokenColorDecorativeSkintTint200() throws { - XCTAssertNotEqual(inheritedTheme.colorDecorativeSkintTint200, abstractTheme.colorDecorativeSkintTint200) - XCTAssertTrue(inheritedTheme.colorDecorativeSkintTint200 == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorDecorativeSkinTint200() throws { + XCTAssertNotEqual(inheritedTheme.colorDecorativeSkinTint200, abstractTheme.colorDecorativeSkinTint200) + XCTAssertTrue(inheritedTheme.colorDecorativeSkinTint200 == OtherMockTheme.otherMockThemeMultipleColorTokens) } - func testInheritedThemeCanOverrideSemanticTokenColorDecorativeSkintTint300() throws { - XCTAssertNotEqual(inheritedTheme.colorDecorativeSkintTint300, abstractTheme.colorDecorativeSkintTint300) - XCTAssertTrue(inheritedTheme.colorDecorativeSkintTint300 == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorDecorativeSkinTint300() throws { + XCTAssertNotEqual(inheritedTheme.colorDecorativeSkinTint300, abstractTheme.colorDecorativeSkinTint300) + XCTAssertTrue(inheritedTheme.colorDecorativeSkinTint300 == OtherMockTheme.otherMockThemeMultipleColorTokens) } - func testInheritedThemeCanOverrideSemanticTokenColorDecorativeSkintTint400() throws { - XCTAssertNotEqual(inheritedTheme.colorDecorativeSkintTint400, abstractTheme.colorDecorativeSkintTint400) - XCTAssertTrue(inheritedTheme.colorDecorativeSkintTint400 == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorDecorativeSkinTint400() throws { + XCTAssertNotEqual(inheritedTheme.colorDecorativeSkinTint400, abstractTheme.colorDecorativeSkinTint400) + XCTAssertTrue(inheritedTheme.colorDecorativeSkinTint400 == OtherMockTheme.otherMockThemeMultipleColorTokens) } - func testInheritedThemeCanOverrideSemanticTokenColorDecorativeSkintTint500() throws { - XCTAssertNotEqual(inheritedTheme.colorDecorativeSkintTint500, abstractTheme.colorDecorativeSkintTint500) - XCTAssertTrue(inheritedTheme.colorDecorativeSkintTint500 == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorDecorativeSkinTint500() throws { + XCTAssertNotEqual(inheritedTheme.colorDecorativeSkinTint500, abstractTheme.colorDecorativeSkinTint500) + XCTAssertTrue(inheritedTheme.colorDecorativeSkinTint500 == OtherMockTheme.otherMockThemeMultipleColorTokens) } - func testInheritedThemeCanOverrideSemanticTokenColorDecorativeSkintTint600() throws { - XCTAssertNotEqual(inheritedTheme.colorDecorativeSkintTint600, abstractTheme.colorDecorativeSkintTint600) - XCTAssertTrue(inheritedTheme.colorDecorativeSkintTint600 == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorDecorativeSkinTint600() throws { + XCTAssertNotEqual(inheritedTheme.colorDecorativeSkinTint600, abstractTheme.colorDecorativeSkinTint600) + XCTAssertTrue(inheritedTheme.colorDecorativeSkinTint600 == OtherMockTheme.otherMockThemeMultipleColorTokens) } - func testInheritedThemeCanOverrideSemanticTokenColorDecorativeSkintTint700() throws { - XCTAssertNotEqual(inheritedTheme.colorDecorativeSkintTint700, abstractTheme.colorDecorativeSkintTint700) - XCTAssertTrue(inheritedTheme.colorDecorativeSkintTint700 == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorDecorativeSkinTint700() throws { + XCTAssertNotEqual(inheritedTheme.colorDecorativeSkinTint700, abstractTheme.colorDecorativeSkinTint700) + XCTAssertTrue(inheritedTheme.colorDecorativeSkinTint700 == OtherMockTheme.otherMockThemeMultipleColorTokens) } - func testInheritedThemeCanOverrideSemanticTokenColorDecorativeSkintTint800() throws { - XCTAssertNotEqual(inheritedTheme.colorDecorativeSkintTint800, abstractTheme.colorDecorativeSkintTint800) - XCTAssertTrue(inheritedTheme.colorDecorativeSkintTint800 == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorDecorativeSkinTint800() throws { + XCTAssertNotEqual(inheritedTheme.colorDecorativeSkinTint800, abstractTheme.colorDecorativeSkinTint800) + XCTAssertTrue(inheritedTheme.colorDecorativeSkinTint800 == OtherMockTheme.otherMockThemeMultipleColorTokens) } - func testInheritedThemeCanOverrideSemanticTokenColorDecorativeSkintTint900() throws { - XCTAssertNotEqual(inheritedTheme.colorDecorativeSkintTint900, abstractTheme.colorDecorativeSkintTint900) - XCTAssertTrue(inheritedTheme.colorDecorativeSkintTint900 == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorDecorativeSkinTint900() throws { + XCTAssertNotEqual(inheritedTheme.colorDecorativeSkinTint900, abstractTheme.colorDecorativeSkinTint900) + XCTAssertTrue(inheritedTheme.colorDecorativeSkinTint900 == OtherMockTheme.otherMockThemeMultipleColorTokens) } // MARK: Semantic token - Colors - Chart @@ -1307,6 +1276,5 @@ final class TestThemeOverrideOfColorSemanticTokens: XCTestCase { } // swiftlint:enable type_body_length -// swiftlint:enable line_length // swiftlint:enable implicitly_unwrapped_optional // swiftlint:enable required_deinit diff --git a/OUDS/Core/Themes/Inverse/Sources/InverseTheme+ColorSemanticTokens.swift b/OUDS/Core/Themes/Inverse/Sources/InverseTheme+ColorSemanticTokens.swift index 71646c6fb..ae6cf4e2e 100644 --- a/OUDS/Core/Themes/Inverse/Sources/InverseTheme+ColorSemanticTokens.swift +++ b/OUDS/Core/Themes/Inverse/Sources/InverseTheme+ColorSemanticTokens.swift @@ -45,35 +45,35 @@ extension InverseTheme { override public var colorBackgroundStatusNeutral: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalDarkGray720) } - override public var colorBackgroundStatusNeutralOnBackgroundEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalLightGray80) } + override public var colorBackgroundStatusNeutralOnBgEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalLightGray80) } override public var colorBackgroundStatusPositiveMuted: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalMalachite100) } - override public var colorBackgroundStatusPositiveMutedOnBackgroundEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalMalachite100) } + override public var colorBackgroundStatusPositiveMutedOnBgEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalMalachite100) } override public var colorBackgroundStatusPositiveEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalMalachite500) } override public var colorBackgroundStatusInfoMuted: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalDodgerBlue900) } - override public var colorBackgroundStatusInfoMutedOnBackgroundEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalDodgerBlue100) } + override public var colorBackgroundStatusInfoMutedOnBgEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalDodgerBlue100) } override public var colorBackgroundStatusInfoEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalDodgerBlue500) } override public var colorBackgroundStatusWarningMuted: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalSun900) } - override public var colorBackgroundStatusWarningMutedOnBackgroundEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalSun100) } + override public var colorBackgroundStatusWarningMutedOnBgEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalSun100) } override public var colorBackgroundStatusWarningEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalSun500) } override public var colorBackgroundStatusNegativeMuted: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalScarlet900) } - override public var colorBackgroundStatusNegativeMutedOnBackgroundEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalScarlet100) } + override public var colorBackgroundStatusNegativeMutedOnBgEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalScarlet100) } override public var colorBackgroundStatusNegativeEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalScarlet600) } override public var colorBackgroundStatusAccentMuted: ColorSemanticToken { MultipleColorTokens(OrangeBrandColorRawTokens.colorWarmGray900) } - override public var colorBackgroundStatusAccentMutedOnBackgroundEmphasized: ColorSemanticToken { MultipleColorTokens(OrangeBrandColorRawTokens.colorWarmGray100) } + override public var colorBackgroundStatusAccentMutedOnBgEmphasized: ColorSemanticToken { MultipleColorTokens(OrangeBrandColorRawTokens.colorWarmGray100) } override public var colorBackgroundStatusAccentEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalSun500) } @@ -81,15 +81,15 @@ extension InverseTheme { override public var colorContentDefault: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalLightGray160) } - override public var colorContentContentDefaultOnBackgroundEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalBlack) } + override public var colorContentContentDefaultOnBgEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalBlack) } override public var colorContentMuted: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalLightGray400) } - override public var colorContentContentMutedOnBackgroundEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalDarkGray400) } + override public var colorContentContentMutedOnBgEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalDarkGray400) } override public var colorContentDisabled: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalDarkGray400) } - override public var colorContentContentDisabledOnBackgroundEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalLightGray400) } + override public var colorContentContentDisabledOnBgEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalLightGray400) } override public var colorContentBrandPrimary: ColorSemanticToken { MultipleColorTokens(OrangeBrandColorRawTokens.colorOrange500) } @@ -109,55 +109,55 @@ extension InverseTheme { // MARK: Semantic token - Colors - Content - On Background - override public var colorContentOnBackgroundPrimary: ColorSemanticToken { MultipleColorTokens( ColorRawTokens.colorFunctionalBlack) } + override public var colorContentOnBgPrimary: ColorSemanticToken { MultipleColorTokens( ColorRawTokens.colorFunctionalBlack) } - override public var colorContentOnBackgroundSecondary: ColorSemanticToken { fatalError("🤖 No value defined for colorContentOnBackgroundSecondary!") } + override public var colorContentOnBgSecondary: ColorSemanticToken { fatalError("🤖 No value defined for colorContentOnBgSecondary!") } - override public var colorContentOnBackgroundTertiary: ColorSemanticToken { fatalError("🤖 No value defined for colorContentOnBackgroundTertiary!") } + override public var colorContentOnBgTertiary: ColorSemanticToken { fatalError("🤖 No value defined for colorContentOnBgTertiary!") } - override public var colorContentOnBackgroundStatusPositiveMuted: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalLightGray160) } + override public var colorContentOnBgStatusPositiveMuted: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalLightGray160) } - override public var colorContentOnBackgroundStatusPositiveMutedOnBackgroundEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalBlack) } + override public var colorContentOnBgStatusPositiveMutedOnBgEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalBlack) } - override public var colorContentOnBackgroundStatusPositiveEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalBlack) } + override public var colorContentOnBgStatusPositiveEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalBlack) } - override public var colorContentOnBackgroundStatusInfoMuted: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalLightGray160) } + override public var colorContentOnBgStatusInfoMuted: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalLightGray160) } - override public var colorContentOnBackgroundStatusInfoMutedOnBackgroundEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalLightGray160) } + override public var colorContentOnBgStatusInfoMutedOnBgEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalLightGray160) } - override public var colorContentOnBackgroundStatusInfoEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalBlack) } + override public var colorContentOnBgStatusInfoEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalBlack) } - override public var colorContentOnBackgroundStatusWarningMuted: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalLightGray160) } + override public var colorContentOnBgStatusWarningMuted: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalLightGray160) } - override public var colorContentOnBackgroundStatusWarningMutedOnBackgroundEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalBlack) } + override public var colorContentOnBgStatusWarningMutedOnBgEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalBlack) } - override public var colorContentOnBackgroundStatusWarningEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalBlack) } + override public var colorContentOnBgStatusWarningEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalBlack) } - override public var colorContentOnBackgroundStatusNegativeMuted: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalLightGray160) } + override public var colorContentOnBgStatusNegativeMuted: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalLightGray160) } - override public var colorContentOnBackgroundStatusNegativeMutedOnBackgroundEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalBlack) } + override public var colorContentOnBgStatusNegativeMutedOnBgEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalBlack) } - override public var colorContentOnBackgroundStatusNegativeEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalWhite) } + override public var colorContentOnBgStatusNegativeEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalWhite) } - override public var colorContentOnBackgroundStatusAccentMuted: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalLightGray160) } + override public var colorContentOnBgStatusAccentMuted: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalLightGray160) } - override public var colorContentOnBackgroundStatusAccentMutedOnBackgroundEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalBlack) } + override public var colorContentOnBgStatusAccentMutedOnBgEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalBlack) } - override public var colorContentOnBackgroundStatusAccentedEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalBlack) } + override public var colorContentOnBgStatusAccentedEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalBlack) } // MARK: Semantic token - Colors - Border override public var colorBorderDefault: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalDarkGray400) } - override public var colorBorderDefaultOnBackgroundEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalLightGray400) } + override public var colorBorderDefaultOnBgEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalLightGray400) } override public var colorBorderEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalLightGray160) } - override public var colorBorderEmphasizedOnBackgroundEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalBlack) } + override public var colorBorderEmphasizedOnBgEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalBlack) } override public var colorBorderFocus: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalDarkGray880) } - override public var colorBorderBrandPrimaryOnBackgroundEmphasized: ColorSemanticToken { MultipleColorTokens(OrangeBrandColorRawTokens.colorOrange550) } + override public var colorBorderBrandPrimaryOnBgEmphasized: ColorSemanticToken { MultipleColorTokens(OrangeBrandColorRawTokens.colorOrange550) } override public var colorBorderBrandPrimary: ColorSemanticToken { MultipleColorTokens(OrangeBrandColorRawTokens.colorOrange500) } @@ -175,65 +175,65 @@ extension InverseTheme { override public var colorBorderStatusAccent: ColorSemanticToken { fatalError("🤖 No value defined for colorBorderStatusAccent!") } - override public var colorBorderOnBackgroundBrandPrimary: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalBlack) } + override public var colorBorderOnBgBrandPrimary: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalBlack) } - override public var colorBorderOnBackgroundBrandSecondary: ColorSemanticToken { fatalError("🤖 No value defined for colorBorderOnBackgroundBrandSecondary!") } + override public var colorBorderOnBgBrandSecondary: ColorSemanticToken { fatalError("🤖 No value defined for colorBorderOnBgBrandSecondary!") } - override public var colorBorderOnBackgroundBrandTertiary: ColorSemanticToken { fatalError("🤖 No value defined for colorBorderOnBackgroundBrandTertiary!") } + override public var colorBorderOnBgBrandTertiary: ColorSemanticToken { fatalError("🤖 No value defined for colorBorderOnBgBrandTertiary!") } // MARK: Semantic token - Colors - Action override public var colorActionSelected: ColorSemanticToken { MultipleColorTokens(OrangeBrandColorRawTokens.colorOrange500) } - override public var colorActionSelectedOnBackgroundEmphasized: ColorSemanticToken { MultipleColorTokens(OrangeBrandColorRawTokens.colorOrange550) } + override public var colorActionSelectedOnBgEmphasized: ColorSemanticToken { MultipleColorTokens(OrangeBrandColorRawTokens.colorOrange550) } override public var colorActionDisabled: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalDarkGray400) } - override public var colorActionDisabledOnBackgroundEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalLightGray400) } + override public var colorActionDisabledOnBgEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalLightGray400) } override public var colorActionVisited: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorDecorativeAmethyst400) } - override public var colorActionVistedOnBackgroundEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorDecorativeAmethyst600) } + override public var colorActionVistedOnBgEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorDecorativeAmethyst600) } override public var colorActionPrimaryEnabled: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalLightGray160) } - override public var colorActionPrimaryEnabledOnBackgroundEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalBlack) } + override public var colorActionPrimaryEnabledOnBgEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalBlack) } override public var colorActionPrimaryHover: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalLightGray400) } - override public var colorActionPrimaryHoverOnBackgroundEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalDarkGray400) } + override public var colorActionPrimaryHoverOnBgEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalDarkGray400) } override public var colorActionPrimaryPressed: ColorSemanticToken { MultipleColorTokens(OrangeBrandColorRawTokens.colorOrange500) } - override public var colorActionPrimaryPressedOnBackgroundEmphasized: ColorSemanticToken { MultipleColorTokens(OrangeBrandColorRawTokens.colorOrange550) } + override public var colorActionPrimaryPressedOnBgEmphasized: ColorSemanticToken { MultipleColorTokens(OrangeBrandColorRawTokens.colorOrange550) } override public var colorActionPrimaryLoading: ColorSemanticToken { MultipleColorTokens(OrangeBrandColorRawTokens.colorOrange500) } - override public var colorActionPrimaryLoadingOnBackgroundEmphasized: ColorSemanticToken { MultipleColorTokens(OrangeBrandColorRawTokens.colorOrange550) } + override public var colorActionPrimaryLoadingOnBgEmphasized: ColorSemanticToken { MultipleColorTokens(OrangeBrandColorRawTokens.colorOrange550) } override public var colorActionPrimaryFocus: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalLightGray400) } - override public var colorActionPrimaryFocusOnBackgroundEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalDarkGray400) } + override public var colorActionPrimaryFocusOnBgEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalDarkGray400) } override public var colorActionSecondaryEnabled: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalLightGray160) } - override public var colorActionSecondaryEnabledOnBackgroundEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalLightGray80) } + override public var colorActionSecondaryEnabledOnBgEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalLightGray80) } override public var colorActionSecondaryHover: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalDarkGray640) } - override public var colorActionSecondaryHoverOnBackgroundEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalLightGray160) } + override public var colorActionSecondaryHoverOnBgEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalLightGray160) } override public var colorActionSecondaryPressed: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalDarkGray640) } - override public var colorActionSecondaryPressedOnBackgroundEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalLightGray160) } + override public var colorActionSecondaryPressedOnBgEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalLightGray160) } override public var colorActionSecondaryLoading: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalDarkGray640) } - override public var colorActionSecondaryLoadingOnBackgroundEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalLightGray160) } + override public var colorActionSecondaryLoadingOnBgEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalLightGray160) } override public var colorActionSecondaryFocus: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalDarkGray640) } - override public var colorActionSecondaryFocusOnBackgroundEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalLightGray160) } + override public var colorActionSecondaryFocusOnBgEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalLightGray160) } override public var colorActionNegativeEnabled: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalScarlet600) } @@ -245,99 +245,87 @@ extension InverseTheme { override public var colorActionNegativeFocus: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalScarlet700) } - override public var colorActionOnBackgroundActionDisabled: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalBlack) } + override public var colorActionOnBgActionDisabled: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalBlack) } - override public var colorActionOnBackgroundActionDisabledOnBackgroundEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalWhite) } + override public var colorActionOnBgActionDisabledOnBgEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalWhite) } - override public var colorActionOnBackgroundActionNegative: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalWhite) } + override public var colorActionOnBgActionNegative: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalWhite) } - override public var colorActionOnBackgroundActionPrimaryEnabled: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalBlack) } + override public var colorActionOnBgActionPrimaryEnabled: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalBlack) } - override public var colorActionOnBackgroundActionPrimaryEnabledOnBackgroundEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalWhite) } + override public var colorActionOnBgActionPrimaryEnabledOnBgEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalWhite) } - override public var colorActionOnBackgroundActionPrimaryHover: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalBlack) } + override public var colorActionOnBgActionPrimaryHover: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalBlack) } - override public var colorActionOnBackgroundActionPrimaryHoverOnBackgroundEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalWhite) } + override public var colorActionOnBgActionPrimaryHoverOnBgEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalWhite) } - override public var colorActionOnBackgroundActionPrimaryPressed: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalBlack) } + override public var colorActionOnBgActionPrimaryPressed: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalBlack) } - override public var colorActionOnBackgroundActionPrimaryPressedOnBackgroundEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalWhite) } + override public var colorActionOnBgActionPrimaryPressedOnBgEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalWhite) } - override public var colorActionOnBackgroundActionPrimaryLoading: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalBlack) } + override public var colorActionOnBgActionPrimaryLoading: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalBlack) } - override public var colorActionOnBackgroundActionPrimaryLoadingOnBackgroundEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalWhite) } + override public var colorActionOnBgActionPrimaryLoadingOnBgEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalWhite) } - override public var colorActionOnBackgroundActionPrimaryFocus: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalBlack) } + override public var colorActionOnBgActionPrimaryFocus: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalBlack) } - override public var colorActionOnBackgroundActionPrimaryFocusOnBackgroundEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalWhite) } + override public var colorActionOnBgActionPrimaryFocusOnBgEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalWhite) } - override public var colorActionOnBackgroundActionSecondaryEnabled: ColorSemanticToken { fatalError("🤖 No value defined for colorActionOnBackgroundActionSecondaryEnabled!") } + override public var colorActionOnBgActionSecondaryEnabled: ColorSemanticToken { fatalError("🤖 No value defined for colorActionOnBgActionSecondaryEnabled!") } - override public var colorActionOnBackgroundActionSecondaryEnabledOnBackgroundEmphasized: ColorSemanticToken { fatalError("🤖 No value defined for colorActionOnBackgroundActionSecondaryEnabledOnBackgroundEmphasized!") } + override public var colorActionOnBgActionSecondaryEnabledOnBgEmphasized: ColorSemanticToken { fatalError("🤖 No value defined for colorActionOnBgActionSecondaryEnabledOnBgEmphasized!") } - override public var colorActionOnBackgroundActionSecondaryHover: ColorSemanticToken { fatalError("🤖 No value defined for colorActionOnBackgroundActionSecondaryHover!") } + override public var colorActionOnBgActionSecondaryHover: ColorSemanticToken { fatalError("🤖 No value defined for colorActionOnBgActionSecondaryHover!") } - override public var colorActionOnBackgroundActionSecondaryHoverOnBackgroundEmphasized: ColorSemanticToken { fatalError("🤖 No value defined for colorActionOnBackgroundActionSecondaryHoverOnBackgroundEmphasized!") } + override public var colorActionOnBgActionSecondaryHoverOnBgEmphasized: ColorSemanticToken { fatalError("🤖 No value defined for colorActionOnBgActionSecondaryHoverOnBgEmphasized!") } - override public var colorActionOnBackgroundActionSecondaryPressed: ColorSemanticToken { fatalError("🤖 No value defined for colorActionOnBackgroundActionSecondaryPressed!") } + override public var colorActionOnBgActionSecondaryPressed: ColorSemanticToken { fatalError("🤖 No value defined for colorActionOnBgActionSecondaryPressed!") } - override public var colorActionOnBackgroundActionSecondaryPressedOnBackgroundEmphasized: ColorSemanticToken { fatalError("🤖 No value defined for colorActionOnBackgroundActionSecondaryPressedOnBackgroundEmphasized!") } + override public var colorActionOnBgActionSecondaryPressedOnBgEmphasized: ColorSemanticToken { fatalError("🤖 No value defined for colorActionOnBgActionSecondaryPressedOnBgEmphasized!") } - override public var colorActionOnBackgroundActionSecondaryLoading: ColorSemanticToken { fatalError("🤖 No value defined for colorActionOnBackgroundActionSecondaryLoading!") } + override public var colorActionOnBgActionSecondaryLoading: ColorSemanticToken { fatalError("🤖 No value defined for colorActionOnBgActionSecondaryLoading!") } - override public var colorActionOnBackgroundActionSecondaryLoadingOnBackgroundEmphasized: ColorSemanticToken { fatalError("🤖 No value defined for colorActionOnBackgroundActionSecondaryLoadingOnBackgroundEmphasized!") } + override public var colorActionOnBgActionSecondaryLoadingOnBgEmphasized: ColorSemanticToken { fatalError("🤖 No value defined for colorActionOnBgActionSecondaryLoadingOnBgEmphasized!") } - override public var colorActionOnBackgroundActionSecondaryFocus: ColorSemanticToken { fatalError("🤖 No value defined for colorActionOnBackgroundActionSecondaryFocus!") } + override public var colorActionOnBgActionSecondaryFocus: ColorSemanticToken { fatalError("🤖 No value defined for colorActionOnBgActionSecondaryFocus!") } - override public var colorActionOnBackgroundActionSecondaryFocusOnBackgroundEmphasized: ColorSemanticToken { fatalError("🤖 No value defined for colorActionOnBackgroundActionSecondaryFocusOnBackgroundEmphasized!") } + override public var colorActionOnBgActionSecondaryFocusOnBgEmphasized: ColorSemanticToken { fatalError("🤖 No value defined for colorActionOnBgActionSecondaryFocusOnBgEmphasized!") } // MARK: Semantic token - Colors - Elevation override public var colorElevationRaised: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalDarkGray800) } - override public var colorElevationRaisedOnBackgroundSecondary: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalDarkGray640) } + override public var colorElevationRaisedOnBgSecondary: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalDarkGray640) } - override public var colorElevationRaisedOnBackgroundEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalWhite) } + override public var colorElevationRaisedOnBgEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalWhite) } override public var colorElevationDrag: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalDarkGray720) } - override public var colorElevationDragOnBackgroundSecondary: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalDarkGray480) } + override public var colorElevationDragOnBgSecondary: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalDarkGray480) } - override public var colorElevationDragOnBackgroundEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalLightGray80) } + override public var colorElevationDragOnBgEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalLightGray80) } override public var colorElevationOverlayDefault: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalDarkGray720) } - override public var colorElevationOverlayDefaultOnBackgroundSecondary: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalDarkGray560) } + override public var colorElevationOverlayDefaultOnBgSecondary: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalDarkGray560) } - override public var colorElevationOverlayDefaultOnBackgroundEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalWhite) } + override public var colorElevationOverlayDefaultOnBgEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalWhite) } override public var colorElevationOverlayEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalLightGray80) } - override public var colorElevationOverlayEmphasizedOnBackgroundSecondary: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalLightGray80) } + override public var colorElevationOverlayEmphasizedOnBgSecondary: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalLightGray80) } - override public var colorElevationOverlayEmphasizedOnBackgroundEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalDarkGray640) } + override public var colorElevationOverlayEmphasizedOnBgEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalDarkGray640) } override public var colorElevationModal: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalDarkGray640) } // MARK: Semantic token - Colors - Decorative - override public var colorDecorativeBrandPrimary: ColorSemanticToken { MultipleColorTokens(OrangeBrandColorRawTokens.colorOrange500) } - - override public var colorDecorativeBrandPrimaryMuted: ColorSemanticToken { fatalError("🤖 No value defined for colorDecorativeBrandPrimaryMuted!") } - - override public var colorDecorativeBrandPrimaryEmphasized: ColorSemanticToken { fatalError("🤖 No value defined for colorDecorativeBrandPrimaryEmphasized!") } + override public var colorDecorativePrimary: ColorSemanticToken { MultipleColorTokens(OrangeBrandColorRawTokens.colorOrange500) } override public var colorDecorativeSecondary: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalWhite) } - override public var colorDecorativeSecondaryMuted: ColorSemanticToken { fatalError("🤖 No value defined for colorDecorativeSecondaryMuted!") } - - override public var colorDecorativeSecondaryEmphasized: ColorSemanticToken { fatalError("🤖 No value defined for colorDecorativeSecondaryEmphasized!") } - - override public var colorDecorativeBrandTertiary: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalBlack) } - - override public var colorDecorativeBrandTertiaryMuted: ColorSemanticToken { fatalError("🤖 No value defined for colorDecorativeBrandTertiaryMuted!") } - - override public var colorDecorativeBrandTertiaryEmphasized: ColorSemanticToken { fatalError("🤖 No value defined for colorDecorativeBrandTertiaryEmphasized!") } + override public var colorDecorativeTertiary: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalBlack) } override public var colorDecorativeNeutralMuted: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalDarkGray640) } @@ -375,23 +363,23 @@ extension InverseTheme { override public var colorDecorativeAccent5Emphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorDecorativeShockingPink300) } - override public var colorDecorativeSkintTint100: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorDecorativeDeepPeach100) } + override public var colorDecorativeSkinTint100: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorDecorativeDeepPeach100) } - override public var colorDecorativeSkintTint200: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorDecorativeDeepPeach200) } + override public var colorDecorativeSkinTint200: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorDecorativeDeepPeach200) } - override public var colorDecorativeSkintTint300: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorDecorativeDeepPeach300) } + override public var colorDecorativeSkinTint300: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorDecorativeDeepPeach300) } - override public var colorDecorativeSkintTint400: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorDecorativeDeepPeach400) } + override public var colorDecorativeSkinTint400: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorDecorativeDeepPeach400) } - override public var colorDecorativeSkintTint500: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorDecorativeDeepPeach500) } + override public var colorDecorativeSkinTint500: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorDecorativeDeepPeach500) } - override public var colorDecorativeSkintTint600: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorDecorativeDeepPeach600) } + override public var colorDecorativeSkinTint600: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorDecorativeDeepPeach600) } - override public var colorDecorativeSkintTint700: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorDecorativeDeepPeach700) } + override public var colorDecorativeSkinTint700: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorDecorativeDeepPeach700) } - override public var colorDecorativeSkintTint800: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorDecorativeDeepPeach800) } + override public var colorDecorativeSkinTint800: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorDecorativeDeepPeach800) } - override public var colorDecorativeSkintTint900: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorDecorativeDeepPeach900) } + override public var colorDecorativeSkinTint900: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorDecorativeDeepPeach900) } // MARK: Semantic token - Colors - Chart diff --git a/OUDS/Core/Themes/Inverse/Tests/TestInverseThemeColors.swift b/OUDS/Core/Themes/Inverse/Tests/TestInverseThemeColors.swift index e75da93d9..8f7785180 100644 --- a/OUDS/Core/Themes/Inverse/Tests/TestInverseThemeColors.swift +++ b/OUDS/Core/Themes/Inverse/Tests/TestInverseThemeColors.swift @@ -73,16 +73,16 @@ final class TestInverseThemeColors: XCTestCase { assertHomogeneity(inverseTheme.colorBackgroundStatusNeutral) } - func testColorsHomogeneityColorBackgroundStatusNeutralOnBackgroundEmphasized() throws { - assertHomogeneity(inverseTheme.colorBackgroundStatusNeutralOnBackgroundEmphasized) + func testColorsHomogeneityColorBackgroundStatusNeutralOnBgEmphasized() throws { + assertHomogeneity(inverseTheme.colorBackgroundStatusNeutralOnBgEmphasized) } func testColorsHomogeneityColorBackgroundStatusPositiveMuted() throws { assertHomogeneity(inverseTheme.colorBackgroundStatusPositiveMuted) } - func testColorsHomogeneityColorBackgroundStatusPositiveMutedOnBackgroundEmphasized() throws { - assertHomogeneity(inverseTheme.colorBackgroundStatusPositiveMutedOnBackgroundEmphasized) + func testColorsHomogeneityColorBackgroundStatusPositiveMutedOnBgEmphasized() throws { + assertHomogeneity(inverseTheme.colorBackgroundStatusPositiveMutedOnBgEmphasized) } func testColorsHomogeneityColorBackgroundStatusPositiveEmphasized() throws { @@ -93,8 +93,8 @@ final class TestInverseThemeColors: XCTestCase { assertHomogeneity(inverseTheme.colorBackgroundStatusInfoMuted) } - func testColorsHomogeneityColorBackgroundStatusInfoMutedOnBackgroundEmphasized() throws { - assertHomogeneity(inverseTheme.colorBackgroundStatusInfoMutedOnBackgroundEmphasized) + func testColorsHomogeneityColorBackgroundStatusInfoMutedOnBgEmphasized() throws { + assertHomogeneity(inverseTheme.colorBackgroundStatusInfoMutedOnBgEmphasized) } func testColorsHomogeneityColorBackgroundStatusInfoEmphasized() throws { @@ -105,8 +105,8 @@ final class TestInverseThemeColors: XCTestCase { assertHomogeneity(inverseTheme.colorBackgroundStatusWarningMuted) } - func testColorsHomogeneityColorBackgroundStatusWarningMutedOnBackgroundEmphasized() throws { - assertHomogeneity(inverseTheme.colorBackgroundStatusWarningMutedOnBackgroundEmphasized) + func testColorsHomogeneityColorBackgroundStatusWarningMutedOnBgEmphasized() throws { + assertHomogeneity(inverseTheme.colorBackgroundStatusWarningMutedOnBgEmphasized) } func testColorsHomogeneityColorBackgroundStatusWarningEmphasized() throws { @@ -117,8 +117,8 @@ final class TestInverseThemeColors: XCTestCase { assertHomogeneity(inverseTheme.colorBackgroundStatusNegativeMuted) } - func testColorsHomogeneityColorBackgroundStatusNegativeMutedOnBackgroundEmphasized() throws { - assertHomogeneity(inverseTheme.colorBackgroundStatusNegativeMutedOnBackgroundEmphasized) + func testColorsHomogeneityColorBackgroundStatusNegativeMutedOnBgEmphasized() throws { + assertHomogeneity(inverseTheme.colorBackgroundStatusNegativeMutedOnBgEmphasized) } func testColorsHomogeneityColorBackgroundStatusNegativeEmphasized() throws { @@ -129,8 +129,8 @@ final class TestInverseThemeColors: XCTestCase { assertHomogeneity(inverseTheme.colorBackgroundStatusAccentMuted) } - func testColorsHomogeneityColorBackgroundStatusAccentMutedOnBackgroundEmphasized() throws { - assertHomogeneity(inverseTheme.colorBackgroundStatusAccentMutedOnBackgroundEmphasized) + func testColorsHomogeneityColorBackgroundStatusAccentMutedOnBgEmphasized() throws { + assertHomogeneity(inverseTheme.colorBackgroundStatusAccentMutedOnBgEmphasized) } func testColorsHomogeneityColorBackgroundStatusAccentEmphasized() throws { @@ -143,24 +143,24 @@ final class TestInverseThemeColors: XCTestCase { assertHomogeneity(inverseTheme.colorContentDefault) } - func testColorsHomogeneityColorContentContentDefaultOnBackgroundEmphasized() throws { - assertHomogeneity(inverseTheme.colorContentContentDefaultOnBackgroundEmphasized) + func testColorsHomogeneityColorContentContentDefaultOnBgEmphasized() throws { + assertHomogeneity(inverseTheme.colorContentContentDefaultOnBgEmphasized) } func testColorsHomogeneityColorContentMuted() throws { assertHomogeneity(inverseTheme.colorContentMuted) } - func testColorsHomogeneityColorContentContentMutedOnBackgroundEmphasized() throws { - assertHomogeneity(inverseTheme.colorContentContentMutedOnBackgroundEmphasized) + func testColorsHomogeneityColorContentContentMutedOnBgEmphasized() throws { + assertHomogeneity(inverseTheme.colorContentContentMutedOnBgEmphasized) } func testColorsHomogeneityColorContentDisabled() throws { assertHomogeneity(inverseTheme.colorContentDisabled) } - func testColorsHomogeneityColorContentContentDisabledOnBackgroundEmphasized() throws { - assertHomogeneity(inverseTheme.colorContentContentDisabledOnBackgroundEmphasized) + func testColorsHomogeneityColorContentContentDisabledOnBgEmphasized() throws { + assertHomogeneity(inverseTheme.colorContentContentDisabledOnBgEmphasized) } func testColorsHomogeneityColorContentBrandPrimary() throws { @@ -200,78 +200,78 @@ final class TestInverseThemeColors: XCTestCase { // MARK: Semantic token - Colors - Content - On Background - func testColorsHomogeneityColorContentOnBackgroundPrimary() throws { - assertHomogeneity(inverseTheme.colorContentOnBackgroundPrimary) + func testColorsHomogeneityColorContentOnBgPrimary() throws { + assertHomogeneity(inverseTheme.colorContentOnBgPrimary) } // In InverseTheme token not implemented yet -// func testColorsHomogeneityColorContentOnBackgroundSecondary() throws { -// assertHomogeneity(inverseTheme.colorContentOnBackgroundSecondary) +// func testColorsHomogeneityColorContentOnBgSecondary() throws { +// assertHomogeneity(inverseTheme.colorContentOnBgSecondary) // } // In InverseTheme token not implemented yet -// func testColorsHomogeneityColorContentOnBackgroundTertiary() throws { -// assertHomogeneity(inverseTheme.colorContentOnBackgroundTertiary) +// func testColorsHomogeneityColorContentOnBgTertiary() throws { +// assertHomogeneity(inverseTheme.colorContentOnBgTertiary) // } - func testColorsHomogeneityColorContentOnBackgroundStatusPositiveMuted() throws { - assertHomogeneity(inverseTheme.colorContentOnBackgroundStatusPositiveMuted) + func testColorsHomogeneityColorContentOnBgStatusPositiveMuted() throws { + assertHomogeneity(inverseTheme.colorContentOnBgStatusPositiveMuted) } - func testColorsHomogeneityColorContentOnBackgroundStatusPositiveMutedOnBackgroundEmphasized() throws { - assertHomogeneity(inverseTheme.colorContentOnBackgroundStatusPositiveMutedOnBackgroundEmphasized) + func testColorsHomogeneityColorContentOnBgStatusPositiveMutedOnBgEmphasized() throws { + assertHomogeneity(inverseTheme.colorContentOnBgStatusPositiveMutedOnBgEmphasized) } - func testColorsHomogeneityColorContentOnBackgroundStatusPositiveEmphasized() throws { - assertHomogeneity(inverseTheme.colorContentOnBackgroundStatusPositiveEmphasized) + func testColorsHomogeneityColorContentOnBgStatusPositiveEmphasized() throws { + assertHomogeneity(inverseTheme.colorContentOnBgStatusPositiveEmphasized) } - func testColorsHomogeneityColorContentOnBackgroundStatusInfoMuted() throws { - assertHomogeneity(inverseTheme.colorContentOnBackgroundStatusInfoMuted) + func testColorsHomogeneityColorContentOnBgStatusInfoMuted() throws { + assertHomogeneity(inverseTheme.colorContentOnBgStatusInfoMuted) } - func testColorsHomogeneityColorContentOnBackgroundStatusInfoMutedOnBackgroundEmphasized() throws { - assertHomogeneity(inverseTheme.colorContentOnBackgroundStatusInfoMutedOnBackgroundEmphasized) + func testColorsHomogeneityColorContentOnBgStatusInfoMutedOnBgEmphasized() throws { + assertHomogeneity(inverseTheme.colorContentOnBgStatusInfoMutedOnBgEmphasized) } - func testColorsHomogeneityColorContentOnBackgroundStatusInfoEmphasized() throws { - assertHomogeneity(inverseTheme.colorContentOnBackgroundStatusInfoEmphasized) + func testColorsHomogeneityColorContentOnBgStatusInfoEmphasized() throws { + assertHomogeneity(inverseTheme.colorContentOnBgStatusInfoEmphasized) } - func testColorsHomogeneityColorContentOnBackgroundStatusWarningMuted() throws { - assertHomogeneity(inverseTheme.colorContentOnBackgroundStatusWarningMuted) + func testColorsHomogeneityColorContentOnBgStatusWarningMuted() throws { + assertHomogeneity(inverseTheme.colorContentOnBgStatusWarningMuted) } - func testColorsHomogeneityColorContentOnBackgroundStatusWarningMutedOnBackgroundEmphasized() throws { - assertHomogeneity(inverseTheme.colorContentOnBackgroundStatusWarningMutedOnBackgroundEmphasized) + func testColorsHomogeneityColorContentOnBgStatusWarningMutedOnBgEmphasized() throws { + assertHomogeneity(inverseTheme.colorContentOnBgStatusWarningMutedOnBgEmphasized) } - func testColorsHomogeneityColorContentOnBackgroundStatusWarningEmphasized() throws { - assertHomogeneity(inverseTheme.colorContentOnBackgroundStatusWarningEmphasized) + func testColorsHomogeneityColorContentOnBgStatusWarningEmphasized() throws { + assertHomogeneity(inverseTheme.colorContentOnBgStatusWarningEmphasized) } - func testColorsHomogeneityColorContentOnBackgroundStatusNegativeMuted() throws { - assertHomogeneity(inverseTheme.colorContentOnBackgroundStatusNegativeMuted) + func testColorsHomogeneityColorContentOnBgStatusNegativeMuted() throws { + assertHomogeneity(inverseTheme.colorContentOnBgStatusNegativeMuted) } - func testColorsHomogeneityColorContentOnBackgroundStatusNegativeMutedOnBackgroundEmphasized() throws { - assertHomogeneity(inverseTheme.colorContentOnBackgroundStatusNegativeMutedOnBackgroundEmphasized) + func testColorsHomogeneityColorContentOnBgStatusNegativeMutedOnBgEmphasized() throws { + assertHomogeneity(inverseTheme.colorContentOnBgStatusNegativeMutedOnBgEmphasized) } - func testColorsHomogeneityColorContentOnBackgroundStatusNegativeEmphasized() throws { - assertHomogeneity(inverseTheme.colorContentOnBackgroundStatusNegativeEmphasized) + func testColorsHomogeneityColorContentOnBgStatusNegativeEmphasized() throws { + assertHomogeneity(inverseTheme.colorContentOnBgStatusNegativeEmphasized) } - func testColorsHomogeneityColorContentOnBackgroundStatusAccentMuted() throws { - assertHomogeneity(inverseTheme.colorContentOnBackgroundStatusAccentMuted) + func testColorsHomogeneityColorContentOnBgStatusAccentMuted() throws { + assertHomogeneity(inverseTheme.colorContentOnBgStatusAccentMuted) } - func testColorsHomogeneityColorContentOnBackgroundStatusAccentMutedOnBackgroundEmphasized() throws { - assertHomogeneity(inverseTheme.colorContentOnBackgroundStatusAccentMutedOnBackgroundEmphasized) + func testColorsHomogeneityColorContentOnBgStatusAccentMutedOnBgEmphasized() throws { + assertHomogeneity(inverseTheme.colorContentOnBgStatusAccentMutedOnBgEmphasized) } - func testColorsHomogeneityColorContentOnBackgroundStatusAccentedEmphasized() throws { - assertHomogeneity(inverseTheme.colorContentOnBackgroundStatusAccentedEmphasized) + func testColorsHomogeneityColorContentOnBgStatusAccentedEmphasized() throws { + assertHomogeneity(inverseTheme.colorContentOnBgStatusAccentedEmphasized) } // MARK: Semantic token - Colors - Border @@ -280,24 +280,24 @@ final class TestInverseThemeColors: XCTestCase { assertHomogeneity(inverseTheme.colorBorderDefault) } - func testColorsHomogeneityColorBorderDefaultOnBackgroundEmphasized() throws { - assertHomogeneity(inverseTheme.colorBorderDefaultOnBackgroundEmphasized) + func testColorsHomogeneityColorBorderDefaultOnBgEmphasized() throws { + assertHomogeneity(inverseTheme.colorBorderDefaultOnBgEmphasized) } func testColorsHomogeneityColorBorderEmphasized() throws { assertHomogeneity(inverseTheme.colorBorderEmphasized) } - func testColorsHomogeneityColorBorderEmphasizedOnBackgroundEmphasized() throws { - assertHomogeneity(inverseTheme.colorBorderEmphasizedOnBackgroundEmphasized) + func testColorsHomogeneityColorBorderEmphasizedOnBgEmphasized() throws { + assertHomogeneity(inverseTheme.colorBorderEmphasizedOnBgEmphasized) } func testColorsHomogeneityColorBorderFocus() throws { assertHomogeneity(inverseTheme.colorBorderFocus) } - func testColorsHomogeneityColorBorderBrandPrimaryOnBackgroundEmphasized() throws { - assertHomogeneity(inverseTheme.colorBorderBrandPrimaryOnBackgroundEmphasized) + func testColorsHomogeneityColorBorderBrandPrimaryOnBgEmphasized() throws { + assertHomogeneity(inverseTheme.colorBorderBrandPrimaryOnBgEmphasized) } func testColorsHomogeneityColorBorderBrandPrimary() throws { @@ -339,18 +339,18 @@ final class TestInverseThemeColors: XCTestCase { // assertHomogeneity(inverseTheme.colorBorderStatusAccent) // } - func testColorsHomogeneityColorBorderOnBackgroundBrandPrimary() throws { - assertHomogeneity(inverseTheme.colorBorderOnBackgroundBrandPrimary) + func testColorsHomogeneityColorBorderOnBgBrandPrimary() throws { + assertHomogeneity(inverseTheme.colorBorderOnBgBrandPrimary) } // In InverseTheme token not implemented yet -// func testColorsHomogeneityColorBorderOnBackgroundBrandSecondary() throws { -// assertHomogeneity(inverseTheme.colorBorderOnBackgroundBrandSecondary) +// func testColorsHomogeneityColorBorderOnBgBrandSecondary() throws { +// assertHomogeneity(inverseTheme.colorBorderOnBgBrandSecondary) // } // In InverseTheme token not implemented yet -// func testColorsHomogeneityColorBorderOnBackgroundBrandTertiary() throws { -// assertHomogeneity(inverseTheme.colorBorderOnBackgroundBrandTertiary) +// func testColorsHomogeneityColorBorderOnBgBrandTertiary() throws { +// assertHomogeneity(inverseTheme.colorBorderOnBgBrandTertiary) // } // MARK: Semantic token - Colors - Action @@ -359,104 +359,104 @@ final class TestInverseThemeColors: XCTestCase { assertHomogeneity(inverseTheme.colorActionSelected) } - func testColorsHomogeneityColorActionSelectedOnBackgroundEmphasized() throws { - assertHomogeneity(inverseTheme.colorActionSelectedOnBackgroundEmphasized) + func testColorsHomogeneityColorActionSelectedOnBgEmphasized() throws { + assertHomogeneity(inverseTheme.colorActionSelectedOnBgEmphasized) } func testColorsHomogeneityColorActionDisabled() throws { assertHomogeneity(inverseTheme.colorActionDisabled) } - func testColorsHomogeneityColorActionDisabledOnBackgroundEmphasized() throws { - assertHomogeneity(inverseTheme.colorActionDisabledOnBackgroundEmphasized) + func testColorsHomogeneityColorActionDisabledOnBgEmphasized() throws { + assertHomogeneity(inverseTheme.colorActionDisabledOnBgEmphasized) } func testColorsHomogeneityColorActionVisited() throws { assertHomogeneity(inverseTheme.colorActionVisited) } - func testColorsHomogeneityColorActionVistedOnBackgroundEmphasized() throws { - assertHomogeneity(inverseTheme.colorActionVistedOnBackgroundEmphasized) + func testColorsHomogeneityColorActionVistedOnBgEmphasized() throws { + assertHomogeneity(inverseTheme.colorActionVistedOnBgEmphasized) } func testColorsHomogeneityColorActionPrimaryEnabled() throws { assertHomogeneity(inverseTheme.colorActionPrimaryEnabled) } - func testColorsHomogeneityColorActionPrimaryEnabledOnBackgroundEmphasized() throws { - assertHomogeneity(inverseTheme.colorActionPrimaryEnabledOnBackgroundEmphasized) + func testColorsHomogeneityColorActionPrimaryEnabledOnBgEmphasized() throws { + assertHomogeneity(inverseTheme.colorActionPrimaryEnabledOnBgEmphasized) } func testColorsHomogeneityColorActionPrimaryHover() throws { assertHomogeneity(inverseTheme.colorActionPrimaryHover) } - func testColorsHomogeneityColorActionPrimaryHoverOnBackgroundEmphasized() throws { - assertHomogeneity(inverseTheme.colorActionPrimaryHoverOnBackgroundEmphasized) + func testColorsHomogeneityColorActionPrimaryHoverOnBgEmphasized() throws { + assertHomogeneity(inverseTheme.colorActionPrimaryHoverOnBgEmphasized) } func testColorsHomogeneityColorActionPrimaryPressed() throws { assertHomogeneity(inverseTheme.colorActionPrimaryPressed) } - func testColorsHomogeneityColorActionPrimaryPressedOnBackgroundEmphasized() throws { - assertHomogeneity(inverseTheme.colorActionPrimaryPressedOnBackgroundEmphasized) + func testColorsHomogeneityColorActionPrimaryPressedOnBgEmphasized() throws { + assertHomogeneity(inverseTheme.colorActionPrimaryPressedOnBgEmphasized) } func testColorsHomogeneityColorActionPrimaryLoading() throws { assertHomogeneity(inverseTheme.colorActionPrimaryLoading) } - func testColorsHomogeneityColorActionPrimaryLoadingOnBackgroundEmphasized() throws { - assertHomogeneity(inverseTheme.colorActionPrimaryLoadingOnBackgroundEmphasized) + func testColorsHomogeneityColorActionPrimaryLoadingOnBgEmphasized() throws { + assertHomogeneity(inverseTheme.colorActionPrimaryLoadingOnBgEmphasized) } func testColorsHomogeneityColorActionPrimaryFocus() throws { assertHomogeneity(inverseTheme.colorActionPrimaryFocus) } - func testColorsHomogeneityColorActionPrimaryFocusOnBackgroundEmphasized() throws { - assertHomogeneity(inverseTheme.colorActionPrimaryFocusOnBackgroundEmphasized) + func testColorsHomogeneityColorActionPrimaryFocusOnBgEmphasized() throws { + assertHomogeneity(inverseTheme.colorActionPrimaryFocusOnBgEmphasized) } func testColorsHomogeneityColorActionSecondaryEnabled() throws { assertHomogeneity(inverseTheme.colorActionSecondaryEnabled) } - func testColorsHomogeneityColorActionSecondaryEnabledOnBackgroundEmphasized() throws { - assertHomogeneity(inverseTheme.colorActionSecondaryEnabledOnBackgroundEmphasized) + func testColorsHomogeneityColorActionSecondaryEnabledOnBgEmphasized() throws { + assertHomogeneity(inverseTheme.colorActionSecondaryEnabledOnBgEmphasized) } func testColorsHomogeneityColorActionSecondaryHover() throws { assertHomogeneity(inverseTheme.colorActionSecondaryHover) } - func testColorsHomogeneityColorActionSecondaryHoverOnBackgroundEmphasized() throws { - assertHomogeneity(inverseTheme.colorActionSecondaryHoverOnBackgroundEmphasized) + func testColorsHomogeneityColorActionSecondaryHoverOnBgEmphasized() throws { + assertHomogeneity(inverseTheme.colorActionSecondaryHoverOnBgEmphasized) } func testColorsHomogeneityColorActionSecondaryPressed() throws { assertHomogeneity(inverseTheme.colorActionSecondaryPressed) } - func testColorsHomogeneityColorActionSecondaryPressedOnBackgroundEmphasized() throws { - assertHomogeneity(inverseTheme.colorActionSecondaryPressedOnBackgroundEmphasized) + func testColorsHomogeneityColorActionSecondaryPressedOnBgEmphasized() throws { + assertHomogeneity(inverseTheme.colorActionSecondaryPressedOnBgEmphasized) } func testColorsHomogeneityColorActionSecondaryLoading() throws { assertHomogeneity(inverseTheme.colorActionSecondaryLoading) } - func testColorsHomogeneityColorActionSecondaryLoadingOnBackgroundEmphasized() throws { - assertHomogeneity(inverseTheme.colorActionSecondaryLoadingOnBackgroundEmphasized) + func testColorsHomogeneityColorActionSecondaryLoadingOnBgEmphasized() throws { + assertHomogeneity(inverseTheme.colorActionSecondaryLoadingOnBgEmphasized) } func testColorsHomogeneityColorActionSecondaryFocus() throws { assertHomogeneity(inverseTheme.colorActionSecondaryFocus) } - func testColorsHomogeneityColorActionSecondaryFocusOnBackgroundEmphasized() throws { - assertHomogeneity(inverseTheme.colorActionSecondaryFocusOnBackgroundEmphasized) + func testColorsHomogeneityColorActionSecondaryFocusOnBgEmphasized() throws { + assertHomogeneity(inverseTheme.colorActionSecondaryFocusOnBgEmphasized) } func testColorsHomogeneityColorActionNegativeEnabled() throws { @@ -479,106 +479,106 @@ final class TestInverseThemeColors: XCTestCase { assertHomogeneity(inverseTheme.colorActionNegativeFocus) } - func testColorsHomogeneityColorActionOnBackgroundActionDisabled() throws { - assertHomogeneity(inverseTheme.colorActionOnBackgroundActionDisabled) + func testColorsHomogeneityColorActionOnBgActionDisabled() throws { + assertHomogeneity(inverseTheme.colorActionOnBgActionDisabled) } - func testColorsHomogeneityColorActionOnBackgroundActionDisabledOnBackgroundEmphasized() throws { - assertHomogeneity(inverseTheme.colorActionOnBackgroundActionDisabledOnBackgroundEmphasized) + func testColorsHomogeneityColorActionOnBgActionDisabledOnBgEmphasized() throws { + assertHomogeneity(inverseTheme.colorActionOnBgActionDisabledOnBgEmphasized) } - func testColorsHomogeneityColorActionOnBackgroundActionNegative() throws { - assertHomogeneity(inverseTheme.colorActionOnBackgroundActionNegative) + func testColorsHomogeneityColorActionOnBgActionNegative() throws { + assertHomogeneity(inverseTheme.colorActionOnBgActionNegative) } - func testColorsHomogeneityColorActionOnBackgroundActionPrimaryEnabled() throws { - assertHomogeneity(inverseTheme.colorActionOnBackgroundActionPrimaryEnabled) + func testColorsHomogeneityColorActionOnBgActionPrimaryEnabled() throws { + assertHomogeneity(inverseTheme.colorActionOnBgActionPrimaryEnabled) } - func testColorsHomogeneityColorActionOnBackgroundActionPrimaryEnabledOnBackgroundEmphasized() throws { - assertHomogeneity(inverseTheme.colorActionOnBackgroundActionPrimaryEnabledOnBackgroundEmphasized) + func testColorsHomogeneityColorActionOnBgActionPrimaryEnabledOnBgEmphasized() throws { + assertHomogeneity(inverseTheme.colorActionOnBgActionPrimaryEnabledOnBgEmphasized) } - func testColorsHomogeneityColorActionOnBackgroundActionPrimaryHover() throws { - assertHomogeneity(inverseTheme.colorActionOnBackgroundActionPrimaryHover) + func testColorsHomogeneityColorActionOnBgActionPrimaryHover() throws { + assertHomogeneity(inverseTheme.colorActionOnBgActionPrimaryHover) } - func testColorsHomogeneityColorActionOnBackgroundActionPrimaryHoverOnBackgroundEmphasized() throws { - assertHomogeneity(inverseTheme.colorActionOnBackgroundActionPrimaryHoverOnBackgroundEmphasized) + func testColorsHomogeneityColorActionOnBgActionPrimaryHoverOnBgEmphasized() throws { + assertHomogeneity(inverseTheme.colorActionOnBgActionPrimaryHoverOnBgEmphasized) } - func testColorsHomogeneityColorActionOnBackgroundActionPrimaryPressed() throws { - assertHomogeneity(inverseTheme.colorActionOnBackgroundActionPrimaryPressed) + func testColorsHomogeneityColorActionOnBgActionPrimaryPressed() throws { + assertHomogeneity(inverseTheme.colorActionOnBgActionPrimaryPressed) } - func testColorsHomogeneityColorActionOnBackgroundActionPrimaryPressedOnBackgroundEmphasized() throws { - assertHomogeneity(inverseTheme.colorActionOnBackgroundActionPrimaryPressedOnBackgroundEmphasized) + func testColorsHomogeneityColorActionOnBgActionPrimaryPressedOnBgEmphasized() throws { + assertHomogeneity(inverseTheme.colorActionOnBgActionPrimaryPressedOnBgEmphasized) } - func testColorsHomogeneityColorActionOnBackgroundActionPrimaryLoading() throws { - assertHomogeneity(inverseTheme.colorActionOnBackgroundActionPrimaryLoading) + func testColorsHomogeneityColorActionOnBgActionPrimaryLoading() throws { + assertHomogeneity(inverseTheme.colorActionOnBgActionPrimaryLoading) } - func testColorsHomogeneityColorActionOnBackgroundActionPrimaryLoadingOnBackgroundEmphasized() throws { - assertHomogeneity(inverseTheme.colorActionOnBackgroundActionPrimaryLoadingOnBackgroundEmphasized) + func testColorsHomogeneityColorActionOnBgActionPrimaryLoadingOnBgEmphasized() throws { + assertHomogeneity(inverseTheme.colorActionOnBgActionPrimaryLoadingOnBgEmphasized) } - func testColorsHomogeneityColorActionOnBackgroundActionPrimaryFocus() throws { - assertHomogeneity(inverseTheme.colorActionOnBackgroundActionPrimaryFocus) + func testColorsHomogeneityColorActionOnBgActionPrimaryFocus() throws { + assertHomogeneity(inverseTheme.colorActionOnBgActionPrimaryFocus) } - func testColorsHomogeneityColorActionOnBackgroundActionPrimaryFocusOnBackgroundEmphasized() throws { - assertHomogeneity(inverseTheme.colorActionOnBackgroundActionPrimaryFocusOnBackgroundEmphasized) + func testColorsHomogeneityColorActionOnBgActionPrimaryFocusOnBgEmphasized() throws { + assertHomogeneity(inverseTheme.colorActionOnBgActionPrimaryFocusOnBgEmphasized) } // In InverseTheme token not implemented yet -// func testColorsHomogeneityColorActionOnBackgroundActionSecondaryEnabled() throws { -// assertHomogeneity(inverseTheme.colorActionOnBackgroundActionSecondaryEnabled) +// func testColorsHomogeneityColorActionOnBgActionSecondaryEnabled() throws { +// assertHomogeneity(inverseTheme.colorActionOnBgActionSecondaryEnabled) // } // In InverseTheme token not implemented yet -// func testColorsHomogeneityColorActionOnBackgroundActionSecondaryEnabledOnBackgroundEmphasized() throws { -// assertHomogeneity(inverseTheme.colorActionOnBackgroundActionSecondaryEnabledOnBackgroundEmphasized) +// func testColorsHomogeneityColorActionOnBgActionSecondaryEnabledOnBgEmphasized() throws { +// assertHomogeneity(inverseTheme.colorActionOnBgActionSecondaryEnabledOnBgEmphasized) // } // In InverseTheme token not implemented yet -// func testColorsHomogeneityColorActionOnBackgroundActionSecondaryHover() throws { -// assertHomogeneity(inverseTheme.colorActionOnBackgroundActionSecondaryHover) +// func testColorsHomogeneityColorActionOnBgActionSecondaryHover() throws { +// assertHomogeneity(inverseTheme.colorActionOnBgActionSecondaryHover) // } // In InverseTheme token not implemented yet -// func testColorsHomogeneityColorActionOnBackgroundActionSecondaryHoverOnBackgroundEmphasized() throws { -// assertHomogeneity(inverseTheme.colorActionOnBackgroundActionSecondaryHoverOnBackgroundEmphasized) +// func testColorsHomogeneityColorActionOnBgActionSecondaryHoverOnBgEmphasized() throws { +// assertHomogeneity(inverseTheme.colorActionOnBgActionSecondaryHoverOnBgEmphasized) // } // In InverseTheme token not implemented yet -// func testColorsHomogeneityColorActionOnBackgroundActionSecondaryPressed() throws { -// assertHomogeneity(inverseTheme.colorActionOnBackgroundActionSecondaryPressed) +// func testColorsHomogeneityColorActionOnBgActionSecondaryPressed() throws { +// assertHomogeneity(inverseTheme.colorActionOnBgActionSecondaryPressed) // } // In InverseTheme token not implemented yet -// func testColorsHomogeneityColorActionOnBackgroundActionSecondaryPressedOnBackgroundEmphasized() throws { -// assertHomogeneity(inverseTheme.colorActionOnBackgroundActionSecondaryPressedOnBackgroundEmphasized) +// func testColorsHomogeneityColorActionOnBgActionSecondaryPressedOnBgEmphasized() throws { +// assertHomogeneity(inverseTheme.colorActionOnBgActionSecondaryPressedOnBgEmphasized) // } // In InverseTheme token not implemented yet -// func testColorsHomogeneityColorActionOnBackgroundActionSecondaryLoading() throws { -// assertHomogeneity(inverseTheme.colorActionOnBackgroundActionSecondaryLoading) +// func testColorsHomogeneityColorActionOnBgActionSecondaryLoading() throws { +// assertHomogeneity(inverseTheme.colorActionOnBgActionSecondaryLoading) // } // In InverseTheme token not implemented yet -// func testColorsHomogeneityColorActionOnBackgroundActionSecondaryLoadingOnBackgroundEmphasized() throws { -// assertHomogeneity(inverseTheme.colorActionOnBackgroundActionSecondaryLoadingOnBackgroundEmphasized) +// func testColorsHomogeneityColorActionOnBgActionSecondaryLoadingOnBgEmphasized() throws { +// assertHomogeneity(inverseTheme.colorActionOnBgActionSecondaryLoadingOnBgEmphasized) // } // In InverseTheme token not implemented yet -// func testColorsHomogeneityColorActionOnBackgroundActionSecondaryFocus() throws { -// assertHomogeneity(inverseTheme.colorActionOnBackgroundActionSecondaryFocus) +// func testColorsHomogeneityColorActionOnBgActionSecondaryFocus() throws { +// assertHomogeneity(inverseTheme.colorActionOnBgActionSecondaryFocus) // } // In InverseTheme token not implemented yet -// func testColorsHomogeneityColorActionOnBackgroundActionSecondaryFocusOnBackgroundEmphasized() throws { -// assertHomogeneity(inverseTheme.colorActionOnBackgroundActionSecondaryFocusOnBackgroundEmphasized) +// func testColorsHomogeneityColorActionOnBgActionSecondaryFocusOnBgEmphasized() throws { +// assertHomogeneity(inverseTheme.colorActionOnBgActionSecondaryFocusOnBgEmphasized) // } // MARK: Semantic token - Colors - Always @@ -611,32 +611,32 @@ final class TestInverseThemeColors: XCTestCase { assertHomogeneity(inverseTheme.colorAlwaysAccent) } - func testColorsHomogeneityColorAlwaysOnBackgroundBlack() throws { - assertHomogeneity(inverseTheme.colorAlwaysOnBackgroundBlack) + func testColorsHomogeneityColorAlwaysOnBgBlack() throws { + assertHomogeneity(inverseTheme.colorAlwaysOnBgBlack) } - func testColorsHomogeneityColorAlwaysOnBackgroundWhite() throws { - assertHomogeneity(inverseTheme.colorAlwaysOnBackgroundWhite) + func testColorsHomogeneityColorAlwaysOnBgWhite() throws { + assertHomogeneity(inverseTheme.colorAlwaysOnBgWhite) } - func testColorsHomogeneityColorAlwaysOnBackgroundWarning() throws { - assertHomogeneity(inverseTheme.colorAlwaysOnBackgroundWarning) + func testColorsHomogeneityColorAlwaysOnBgWarning() throws { + assertHomogeneity(inverseTheme.colorAlwaysOnBgWarning) } - func testColorsHomogeneityColorAlwaysOnBackgroundNegative() throws { - assertHomogeneity(inverseTheme.colorAlwaysOnBackgroundNegative) + func testColorsHomogeneityColorAlwaysOnBgNegative() throws { + assertHomogeneity(inverseTheme.colorAlwaysOnBgNegative) } - func testColorsHomogeneityColorAlwaysOnBackgroundPositive() throws { - assertHomogeneity(inverseTheme.colorAlwaysOnBackgroundPositive) + func testColorsHomogeneityColorAlwaysOnBgPositive() throws { + assertHomogeneity(inverseTheme.colorAlwaysOnBgPositive) } - func testColorsHomogeneityColorAlwaysOnBackgroundInfo() throws { - assertHomogeneity(inverseTheme.colorAlwaysOnBackgroundInfo) + func testColorsHomogeneityColorAlwaysOnBgInfo() throws { + assertHomogeneity(inverseTheme.colorAlwaysOnBgInfo) } - func testColorsHomogeneityColorAlwaysOnBackgroundAccent() throws { - assertHomogeneity(inverseTheme.colorAlwaysOnBackgroundAccent) + func testColorsHomogeneityColorAlwaysOnBgAccent() throws { + assertHomogeneity(inverseTheme.colorAlwaysOnBgAccent) } // MARK: Semantic token - Colors - Transparent @@ -651,48 +651,48 @@ final class TestInverseThemeColors: XCTestCase { assertHomogeneity(inverseTheme.colorElevationRaised) } - func testColorsHomogeneityColorElevationRaisedOnBackgroundSecondary() throws { - assertHomogeneity(inverseTheme.colorElevationRaisedOnBackgroundSecondary) + func testColorsHomogeneityColorElevationRaisedOnBgSecondary() throws { + assertHomogeneity(inverseTheme.colorElevationRaisedOnBgSecondary) } - func testColorsHomogeneityColorElevationRaisedOnBackgroundEmphasized() throws { - assertHomogeneity(inverseTheme.colorElevationRaisedOnBackgroundEmphasized) + func testColorsHomogeneityColorElevationRaisedOnBgEmphasized() throws { + assertHomogeneity(inverseTheme.colorElevationRaisedOnBgEmphasized) } func testColorsHomogeneityColorElevationDrag() throws { assertHomogeneity(inverseTheme.colorElevationDrag) } - func testColorsHomogeneityColorElevationDragOnBackgroundSecondary() throws { - assertHomogeneity(inverseTheme.colorElevationDragOnBackgroundSecondary) + func testColorsHomogeneityColorElevationDragOnBgSecondary() throws { + assertHomogeneity(inverseTheme.colorElevationDragOnBgSecondary) } - func testColorsHomogeneityColorElevationDragOnBackgroundEmphasized() throws { - assertHomogeneity(inverseTheme.colorElevationDragOnBackgroundEmphasized) + func testColorsHomogeneityColorElevationDragOnBgEmphasized() throws { + assertHomogeneity(inverseTheme.colorElevationDragOnBgEmphasized) } func testColorsHomogeneityColorElevationOverlayDefault() throws { assertHomogeneity(inverseTheme.colorElevationOverlayDefault) } - func testColorsHomogeneityColorElevationOverlayDefaultOnBackgroundSecondary() throws { - assertHomogeneity(inverseTheme.colorElevationOverlayDefaultOnBackgroundSecondary) + func testColorsHomogeneityColorElevationOverlayDefaultOnBgSecondary() throws { + assertHomogeneity(inverseTheme.colorElevationOverlayDefaultOnBgSecondary) } - func testColorsHomogeneityColorElevationOverlayDefaultOnBackgroundEmphasized() throws { - assertHomogeneity(inverseTheme.colorElevationOverlayDefaultOnBackgroundEmphasized) + func testColorsHomogeneityColorElevationOverlayDefaultOnBgEmphasized() throws { + assertHomogeneity(inverseTheme.colorElevationOverlayDefaultOnBgEmphasized) } func testColorsHomogeneityColorElevationOverlayEmphasized() throws { assertHomogeneity(inverseTheme.colorElevationOverlayEmphasized) } - func testColorsHomogeneityColorElevationOverlayEmphasizedOnBackgroundSecondary() throws { - assertHomogeneity(inverseTheme.colorElevationOverlayEmphasizedOnBackgroundSecondary) + func testColorsHomogeneityColorElevationOverlayEmphasizedOnBgSecondary() throws { + assertHomogeneity(inverseTheme.colorElevationOverlayEmphasizedOnBgSecondary) } - func testColorsHomogeneityColorElevationOverlayEmphasizedOnBackgroundEmphasized() throws { - assertHomogeneity(inverseTheme.colorElevationOverlayEmphasizedOnBackgroundEmphasized) + func testColorsHomogeneityColorElevationOverlayEmphasizedOnBgEmphasized() throws { + assertHomogeneity(inverseTheme.colorElevationOverlayEmphasizedOnBgEmphasized) } func testColorsHomogeneityColorElevationModal() throws { @@ -702,47 +702,17 @@ final class TestInverseThemeColors: XCTestCase { // MARK: Semantic token - Colors - Decorative func testColorsHomogeneityColorDecorativeBrandPrimary() throws { - assertHomogeneity(inverseTheme.colorDecorativeBrandPrimary) + assertHomogeneity(inverseTheme.colorDecorativePrimary) } - // In InverseTheme token not implemented yet -// func testColorsHomogeneityColorDecorativeBrandPrimaryMuted() throws { -// assertHomogeneity(inverseTheme.colorDecorativeBrandPrimaryMuted) -// } - - // In InverseTheme token not implemented yet -// func testColorsHomogeneityColorDecorativeBrandPrimaryEmphasized() throws { -// assertHomogeneity(inverseTheme.colorDecorativeBrandPrimaryEmphasized) -// } - func testColorsHomogeneityColorDecorativeSecondary() throws { assertHomogeneity(inverseTheme.colorDecorativeSecondary) } - // In InverseTheme token not implemented yet -// func testColorsHomogeneityColorDecorativeSecondaryMuted() throws { -// assertHomogeneity(inverseTheme.colorDecorativeSecondaryMuted) -// } - - // In InverseTheme token not implemented yet -// func testColorsHomogeneityColorDecorativeSecondaryEmphasized() throws { -// assertHomogeneity(inverseTheme.colorDecorativeSecondaryEmphasized) -// } - - func testColorsHomogeneityColorDecorativeBrandTertiary() throws { - assertHomogeneity(inverseTheme.colorDecorativeBrandTertiary) + func testColorsHomogeneityColorDecorativeTertiary() throws { + assertHomogeneity(inverseTheme.colorDecorativeTertiary) } - // In InverseTheme token not implemented yet -// func testColorsHomogeneityColorDecorativeBrandTertiaryMuted() throws { -// assertHomogeneity(inverseTheme.colorDecorativeBrandTertiaryMuted) -// } - - // In InverseTheme token not implemented yet -// func testColorsHomogeneityColorDecorativeBrandTertiaryEmphasized() throws { -// assertHomogeneity(inverseTheme.colorDecorativeBrandTertiaryEmphasized) -// } - func testColorsHomogeneityColorDecorativeNeutralMuted() throws { assertHomogeneity(inverseTheme.colorDecorativeNeutralMuted) } @@ -815,40 +785,40 @@ final class TestInverseThemeColors: XCTestCase { assertHomogeneity(inverseTheme.colorDecorativeAccent5Emphasized) } - func testColorsHomogeneityColorDecorativeSkintTint100() throws { - assertHomogeneity(inverseTheme.colorDecorativeSkintTint100) + func testColorsHomogeneityColorDecorativeSkinTint100() throws { + assertHomogeneity(inverseTheme.colorDecorativeSkinTint100) } - func testColorsHomogeneityColorDecorativeSkintTint200() throws { - assertHomogeneity(inverseTheme.colorDecorativeSkintTint200) + func testColorsHomogeneityColorDecorativeSkinTint200() throws { + assertHomogeneity(inverseTheme.colorDecorativeSkinTint200) } - func testColorsHomogeneityColorDecorativeSkintTint300() throws { - assertHomogeneity(inverseTheme.colorDecorativeSkintTint300) + func testColorsHomogeneityColorDecorativeSkinTint300() throws { + assertHomogeneity(inverseTheme.colorDecorativeSkinTint300) } - func testColorsHomogeneityColorDecorativeSkintTint400() throws { - assertHomogeneity(inverseTheme.colorDecorativeSkintTint400) + func testColorsHomogeneityColorDecorativeSkinTint400() throws { + assertHomogeneity(inverseTheme.colorDecorativeSkinTint400) } - func testColorsHomogeneityColorDecorativeSkintTint500() throws { - assertHomogeneity(inverseTheme.colorDecorativeSkintTint500) + func testColorsHomogeneityColorDecorativeSkinTint500() throws { + assertHomogeneity(inverseTheme.colorDecorativeSkinTint500) } - func testColorsHomogeneityColorDecorativeSkintTint600() throws { - assertHomogeneity(inverseTheme.colorDecorativeSkintTint600) + func testColorsHomogeneityColorDecorativeSkinTint600() throws { + assertHomogeneity(inverseTheme.colorDecorativeSkinTint600) } - func testColorsHomogeneityColorDecorativeSkintTint700() throws { - assertHomogeneity(inverseTheme.colorDecorativeSkintTint700) + func testColorsHomogeneityColorDecorativeSkinTint700() throws { + assertHomogeneity(inverseTheme.colorDecorativeSkinTint700) } - func testColorsHomogeneityColorDecorativeSkintTint800() throws { - assertHomogeneity(inverseTheme.colorDecorativeSkintTint800) + func testColorsHomogeneityColorDecorativeSkinTint800() throws { + assertHomogeneity(inverseTheme.colorDecorativeSkinTint800) } - func testColorsHomogeneityColorDecorativeSkintTint900() throws { - assertHomogeneity(inverseTheme.colorDecorativeSkintTint900) + func testColorsHomogeneityColorDecorativeSkinTint900() throws { + assertHomogeneity(inverseTheme.colorDecorativeSkinTint900) } // MARK: Semantic token - Colors - Chart diff --git a/OUDS/Core/Themes/Orange/Sources/OrangeTheme+SemanticColorTokens.swift b/OUDS/Core/Themes/Orange/Sources/OrangeTheme+SemanticColorTokens.swift index 591d62c7a..a655e3f3f 100644 --- a/OUDS/Core/Themes/Orange/Sources/OrangeTheme+SemanticColorTokens.swift +++ b/OUDS/Core/Themes/Orange/Sources/OrangeTheme+SemanticColorTokens.swift @@ -34,7 +34,7 @@ extension OrangeTheme { override open var colorBackgroundStatusAccentMuted: ColorSemanticToken { MultipleColorTokens(light: OrangeBrandColorRawTokens.colorWarmGray100, dark: OrangeBrandColorRawTokens.colorWarmGray900) } // NOTE: Defined here because use values available only in this Orange theme, open for InverseTheme overriding - override open var colorBackgroundStatusAccentMutedOnBackgroundEmphasized: ColorSemanticToken { MultipleColorTokens(OrangeBrandColorRawTokens.colorWarmGray900) } + override open var colorBackgroundStatusAccentMutedOnBgEmphasized: ColorSemanticToken { MultipleColorTokens(OrangeBrandColorRawTokens.colorWarmGray900) } // MARK: Semantic token - Colors - Content @@ -44,7 +44,7 @@ extension OrangeTheme { // MARK: Semantic token - Colors - Border // NOTE: Defined here because use values available only in this Orange theme, open for InverseTheme overriding - override open var colorBorderBrandPrimaryOnBackgroundEmphasized: ColorSemanticToken { MultipleColorTokens(OrangeBrandColorRawTokens.colorOrange500) } + override open var colorBorderBrandPrimaryOnBgEmphasized: ColorSemanticToken { MultipleColorTokens(OrangeBrandColorRawTokens.colorOrange500) } // NOTE: Defined here because use values available only in this Orange theme, open for InverseTheme overriding override open var colorBorderBrandPrimary: ColorSemanticToken { MultipleColorTokens(light: OrangeBrandColorRawTokens.colorOrange550, dark: OrangeBrandColorRawTokens.colorOrange500) } @@ -55,30 +55,30 @@ extension OrangeTheme { override open var colorActionSelected: ColorSemanticToken { MultipleColorTokens(light: OrangeBrandColorRawTokens.colorOrange550, dark: OrangeBrandColorRawTokens.colorOrange500) } // NOTE: Defined here because use values available only in this Orange theme, open for InverseTheme overriding - override open var colorActionSelectedOnBackgroundEmphasized: ColorSemanticToken { MultipleColorTokens(OrangeBrandColorRawTokens.colorOrange500) } + override open var colorActionSelectedOnBgEmphasized: ColorSemanticToken { MultipleColorTokens(OrangeBrandColorRawTokens.colorOrange500) } // NOTE: Defined here because use values available only in this Orange theme, open for InverseTheme overriding override open var colorActionPrimaryPressed: ColorSemanticToken { MultipleColorTokens(light: OrangeBrandColorRawTokens.colorOrange550, dark: OrangeBrandColorRawTokens.colorOrange500) } // NOTE: Defined here because use values available only in this Orange theme, open for InverseTheme overriding - override open var colorActionPrimaryPressedOnBackgroundEmphasized: ColorSemanticToken { MultipleColorTokens(OrangeBrandColorRawTokens.colorOrange500) } + override open var colorActionPrimaryPressedOnBgEmphasized: ColorSemanticToken { MultipleColorTokens(OrangeBrandColorRawTokens.colorOrange500) } // NOTE: Defined here because use values available only in this Orange theme, open for InverseTheme overriding override open var colorActionPrimaryLoading: ColorSemanticToken { MultipleColorTokens(light: OrangeBrandColorRawTokens.colorOrange550, dark: OrangeBrandColorRawTokens.colorOrange500) } // NOTE: Defined here because use values available only in this Orange theme, open for InverseTheme overriding - override open var colorActionPrimaryLoadingOnBackgroundEmphasized: ColorSemanticToken { MultipleColorTokens(OrangeBrandColorRawTokens.colorOrange500) } + override open var colorActionPrimaryLoadingOnBgEmphasized: ColorSemanticToken { MultipleColorTokens(OrangeBrandColorRawTokens.colorOrange500) } // NOTE: Defined here because use values available only in this Orange theme, open for InverseTheme overriding override open var colorActionPrimaryFocus: ColorSemanticToken { MultipleColorTokens(light: ColorRawTokens.colorFunctionalDarkGray400, dark: ColorRawTokens.colorFunctionalLightGray400) } // NOTE: Defined here because use values available only in this Orange theme, open for InverseTheme overriding - override open var colorActionPrimaryFocusOnBackgroundEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalLightGray400) } + override open var colorActionPrimaryFocusOnBgEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalLightGray400) } // MARK: Semantic token - Colors - Elevation // NOTE: Defined here because use values available only in this Orange theme, open for InverseTheme overriding - override open var colorDecorativeBrandPrimary: ColorSemanticToken { MultipleColorTokens(OrangeBrandColorRawTokens.colorOrange500) } + override open var colorDecorativePrimary: ColorSemanticToken { MultipleColorTokens(OrangeBrandColorRawTokens.colorOrange500) } // MARK: Semantic token - Colors - Chart diff --git a/OUDS/Core/Tokens/SemanticTokens/Sources/Values/ColorSemanticTokens.swift b/OUDS/Core/Tokens/SemanticTokens/Sources/Values/ColorSemanticTokens.swift index 85b706e3f..54c35ea91 100644 --- a/OUDS/Core/Tokens/SemanticTokens/Sources/Values/ColorSemanticTokens.swift +++ b/OUDS/Core/Tokens/SemanticTokens/Sources/Values/ColorSemanticTokens.swift @@ -45,35 +45,35 @@ public protocol ColorSemanticTokens { var colorBackgroundStatusNeutral: ColorSemanticToken { get } - var colorBackgroundStatusNeutralOnBackgroundEmphasized: ColorSemanticToken { get } + var colorBackgroundStatusNeutralOnBgEmphasized: ColorSemanticToken { get } var colorBackgroundStatusPositiveMuted: ColorSemanticToken { get } - var colorBackgroundStatusPositiveMutedOnBackgroundEmphasized: ColorSemanticToken { get } + var colorBackgroundStatusPositiveMutedOnBgEmphasized: ColorSemanticToken { get } var colorBackgroundStatusPositiveEmphasized: ColorSemanticToken { get } var colorBackgroundStatusInfoMuted: ColorSemanticToken { get } - var colorBackgroundStatusInfoMutedOnBackgroundEmphasized: ColorSemanticToken { get } + var colorBackgroundStatusInfoMutedOnBgEmphasized: ColorSemanticToken { get } var colorBackgroundStatusInfoEmphasized: ColorSemanticToken { get } var colorBackgroundStatusWarningMuted: ColorSemanticToken { get } - var colorBackgroundStatusWarningMutedOnBackgroundEmphasized: ColorSemanticToken { get } + var colorBackgroundStatusWarningMutedOnBgEmphasized: ColorSemanticToken { get } var colorBackgroundStatusWarningEmphasized: ColorSemanticToken { get } var colorBackgroundStatusNegativeMuted: ColorSemanticToken { get } - var colorBackgroundStatusNegativeMutedOnBackgroundEmphasized: ColorSemanticToken { get } + var colorBackgroundStatusNegativeMutedOnBgEmphasized: ColorSemanticToken { get } var colorBackgroundStatusNegativeEmphasized: ColorSemanticToken { get } var colorBackgroundStatusAccentMuted: ColorSemanticToken { get } - var colorBackgroundStatusAccentMutedOnBackgroundEmphasized: ColorSemanticToken { get } + var colorBackgroundStatusAccentMutedOnBgEmphasized: ColorSemanticToken { get } var colorBackgroundStatusAccentEmphasized: ColorSemanticToken { get } @@ -81,15 +81,15 @@ public protocol ColorSemanticTokens { var colorContentDefault: ColorSemanticToken { get } - var colorContentContentDefaultOnBackgroundEmphasized: ColorSemanticToken { get } + var colorContentContentDefaultOnBgEmphasized: ColorSemanticToken { get } var colorContentMuted: ColorSemanticToken { get } - var colorContentContentMutedOnBackgroundEmphasized: ColorSemanticToken { get } + var colorContentContentMutedOnBgEmphasized: ColorSemanticToken { get } var colorContentDisabled: ColorSemanticToken { get } - var colorContentContentDisabledOnBackgroundEmphasized: ColorSemanticToken { get } + var colorContentContentDisabledOnBgEmphasized: ColorSemanticToken { get } var colorContentBrandPrimary: ColorSemanticToken { get } @@ -109,55 +109,55 @@ public protocol ColorSemanticTokens { // MARK: Semantic token - Colors - Content - On Background - var colorContentOnBackgroundPrimary: ColorSemanticToken { get } + var colorContentOnBgPrimary: ColorSemanticToken { get } - var colorContentOnBackgroundSecondary: ColorSemanticToken { get } + var colorContentOnBgSecondary: ColorSemanticToken { get } - var colorContentOnBackgroundTertiary: ColorSemanticToken { get } + var colorContentOnBgTertiary: ColorSemanticToken { get } - var colorContentOnBackgroundStatusPositiveMuted: ColorSemanticToken { get } + var colorContentOnBgStatusPositiveMuted: ColorSemanticToken { get } - var colorContentOnBackgroundStatusPositiveMutedOnBackgroundEmphasized: ColorSemanticToken { get } + var colorContentOnBgStatusPositiveMutedOnBgEmphasized: ColorSemanticToken { get } - var colorContentOnBackgroundStatusPositiveEmphasized: ColorSemanticToken { get } + var colorContentOnBgStatusPositiveEmphasized: ColorSemanticToken { get } - var colorContentOnBackgroundStatusInfoMuted: ColorSemanticToken { get } + var colorContentOnBgStatusInfoMuted: ColorSemanticToken { get } - var colorContentOnBackgroundStatusInfoMutedOnBackgroundEmphasized: ColorSemanticToken { get } + var colorContentOnBgStatusInfoMutedOnBgEmphasized: ColorSemanticToken { get } - var colorContentOnBackgroundStatusInfoEmphasized: ColorSemanticToken { get } + var colorContentOnBgStatusInfoEmphasized: ColorSemanticToken { get } - var colorContentOnBackgroundStatusWarningMuted: ColorSemanticToken { get } + var colorContentOnBgStatusWarningMuted: ColorSemanticToken { get } - var colorContentOnBackgroundStatusWarningMutedOnBackgroundEmphasized: ColorSemanticToken { get } + var colorContentOnBgStatusWarningMutedOnBgEmphasized: ColorSemanticToken { get } - var colorContentOnBackgroundStatusWarningEmphasized: ColorSemanticToken { get } + var colorContentOnBgStatusWarningEmphasized: ColorSemanticToken { get } - var colorContentOnBackgroundStatusNegativeMuted: ColorSemanticToken { get } + var colorContentOnBgStatusNegativeMuted: ColorSemanticToken { get } - var colorContentOnBackgroundStatusNegativeMutedOnBackgroundEmphasized: ColorSemanticToken { get } + var colorContentOnBgStatusNegativeMutedOnBgEmphasized: ColorSemanticToken { get } - var colorContentOnBackgroundStatusNegativeEmphasized: ColorSemanticToken { get } + var colorContentOnBgStatusNegativeEmphasized: ColorSemanticToken { get } - var colorContentOnBackgroundStatusAccentMuted: ColorSemanticToken { get } + var colorContentOnBgStatusAccentMuted: ColorSemanticToken { get } - var colorContentOnBackgroundStatusAccentMutedOnBackgroundEmphasized: ColorSemanticToken { get } + var colorContentOnBgStatusAccentMutedOnBgEmphasized: ColorSemanticToken { get } - var colorContentOnBackgroundStatusAccentedEmphasized: ColorSemanticToken { get } + var colorContentOnBgStatusAccentedEmphasized: ColorSemanticToken { get } // MARK: Semantic token - Colors - Border var colorBorderDefault: ColorSemanticToken { get } - var colorBorderDefaultOnBackgroundEmphasized: ColorSemanticToken { get } + var colorBorderDefaultOnBgEmphasized: ColorSemanticToken { get } var colorBorderEmphasized: ColorSemanticToken { get } - var colorBorderEmphasizedOnBackgroundEmphasized: ColorSemanticToken { get } + var colorBorderEmphasizedOnBgEmphasized: ColorSemanticToken { get } var colorBorderFocus: ColorSemanticToken { get } - var colorBorderBrandPrimaryOnBackgroundEmphasized: ColorSemanticToken { get } + var colorBorderBrandPrimaryOnBgEmphasized: ColorSemanticToken { get } var colorBorderBrandPrimary: ColorSemanticToken { get } @@ -175,65 +175,65 @@ public protocol ColorSemanticTokens { var colorBorderStatusAccent: ColorSemanticToken { get } - var colorBorderOnBackgroundBrandPrimary: ColorSemanticToken { get } + var colorBorderOnBgBrandPrimary: ColorSemanticToken { get } - var colorBorderOnBackgroundBrandSecondary: ColorSemanticToken { get } + var colorBorderOnBgBrandSecondary: ColorSemanticToken { get } - var colorBorderOnBackgroundBrandTertiary: ColorSemanticToken { get } + var colorBorderOnBgBrandTertiary: ColorSemanticToken { get } // MARK: Semantic token - Colors - Action var colorActionSelected: ColorSemanticToken { get } - var colorActionSelectedOnBackgroundEmphasized: ColorSemanticToken { get } + var colorActionSelectedOnBgEmphasized: ColorSemanticToken { get } var colorActionDisabled: ColorSemanticToken { get } - var colorActionDisabledOnBackgroundEmphasized: ColorSemanticToken { get } + var colorActionDisabledOnBgEmphasized: ColorSemanticToken { get } var colorActionVisited: ColorSemanticToken { get } - var colorActionVistedOnBackgroundEmphasized: ColorSemanticToken { get } + var colorActionVistedOnBgEmphasized: ColorSemanticToken { get } var colorActionPrimaryEnabled: ColorSemanticToken { get } - var colorActionPrimaryEnabledOnBackgroundEmphasized: ColorSemanticToken { get } + var colorActionPrimaryEnabledOnBgEmphasized: ColorSemanticToken { get } var colorActionPrimaryHover: ColorSemanticToken { get } - var colorActionPrimaryHoverOnBackgroundEmphasized: ColorSemanticToken { get } + var colorActionPrimaryHoverOnBgEmphasized: ColorSemanticToken { get } var colorActionPrimaryPressed: ColorSemanticToken { get } - var colorActionPrimaryPressedOnBackgroundEmphasized: ColorSemanticToken { get } + var colorActionPrimaryPressedOnBgEmphasized: ColorSemanticToken { get } var colorActionPrimaryLoading: ColorSemanticToken { get } - var colorActionPrimaryLoadingOnBackgroundEmphasized: ColorSemanticToken { get } + var colorActionPrimaryLoadingOnBgEmphasized: ColorSemanticToken { get } var colorActionPrimaryFocus: ColorSemanticToken { get } - var colorActionPrimaryFocusOnBackgroundEmphasized: ColorSemanticToken { get } + var colorActionPrimaryFocusOnBgEmphasized: ColorSemanticToken { get } var colorActionSecondaryEnabled: ColorSemanticToken { get } - var colorActionSecondaryEnabledOnBackgroundEmphasized: ColorSemanticToken { get } + var colorActionSecondaryEnabledOnBgEmphasized: ColorSemanticToken { get } var colorActionSecondaryHover: ColorSemanticToken { get } - var colorActionSecondaryHoverOnBackgroundEmphasized: ColorSemanticToken { get } + var colorActionSecondaryHoverOnBgEmphasized: ColorSemanticToken { get } var colorActionSecondaryPressed: ColorSemanticToken { get } - var colorActionSecondaryPressedOnBackgroundEmphasized: ColorSemanticToken { get } + var colorActionSecondaryPressedOnBgEmphasized: ColorSemanticToken { get } var colorActionSecondaryLoading: ColorSemanticToken { get } - var colorActionSecondaryLoadingOnBackgroundEmphasized: ColorSemanticToken { get } + var colorActionSecondaryLoadingOnBgEmphasized: ColorSemanticToken { get } var colorActionSecondaryFocus: ColorSemanticToken { get } - var colorActionSecondaryFocusOnBackgroundEmphasized: ColorSemanticToken { get } + var colorActionSecondaryFocusOnBgEmphasized: ColorSemanticToken { get } var colorActionNegativeEnabled: ColorSemanticToken { get } @@ -245,51 +245,51 @@ public protocol ColorSemanticTokens { var colorActionNegativeFocus: ColorSemanticToken { get } - var colorActionOnBackgroundActionDisabled: ColorSemanticToken { get } + var colorActionOnBgActionDisabled: ColorSemanticToken { get } - var colorActionOnBackgroundActionDisabledOnBackgroundEmphasized: ColorSemanticToken { get } + var colorActionOnBgActionDisabledOnBgEmphasized: ColorSemanticToken { get } - var colorActionOnBackgroundActionNegative: ColorSemanticToken { get } + var colorActionOnBgActionNegative: ColorSemanticToken { get } - var colorActionOnBackgroundActionPrimaryEnabled: ColorSemanticToken { get } + var colorActionOnBgActionPrimaryEnabled: ColorSemanticToken { get } - var colorActionOnBackgroundActionPrimaryEnabledOnBackgroundEmphasized: ColorSemanticToken { get } + var colorActionOnBgActionPrimaryEnabledOnBgEmphasized: ColorSemanticToken { get } - var colorActionOnBackgroundActionPrimaryHover: ColorSemanticToken { get } + var colorActionOnBgActionPrimaryHover: ColorSemanticToken { get } - var colorActionOnBackgroundActionPrimaryHoverOnBackgroundEmphasized: ColorSemanticToken { get } + var colorActionOnBgActionPrimaryHoverOnBgEmphasized: ColorSemanticToken { get } - var colorActionOnBackgroundActionPrimaryPressed: ColorSemanticToken { get } + var colorActionOnBgActionPrimaryPressed: ColorSemanticToken { get } - var colorActionOnBackgroundActionPrimaryPressedOnBackgroundEmphasized: ColorSemanticToken { get } + var colorActionOnBgActionPrimaryPressedOnBgEmphasized: ColorSemanticToken { get } - var colorActionOnBackgroundActionPrimaryLoading: ColorSemanticToken { get } + var colorActionOnBgActionPrimaryLoading: ColorSemanticToken { get } - var colorActionOnBackgroundActionPrimaryLoadingOnBackgroundEmphasized: ColorSemanticToken { get } + var colorActionOnBgActionPrimaryLoadingOnBgEmphasized: ColorSemanticToken { get } - var colorActionOnBackgroundActionPrimaryFocus: ColorSemanticToken { get } + var colorActionOnBgActionPrimaryFocus: ColorSemanticToken { get } - var colorActionOnBackgroundActionPrimaryFocusOnBackgroundEmphasized: ColorSemanticToken { get } + var colorActionOnBgActionPrimaryFocusOnBgEmphasized: ColorSemanticToken { get } - var colorActionOnBackgroundActionSecondaryEnabled: ColorSemanticToken { get } + var colorActionOnBgActionSecondaryEnabled: ColorSemanticToken { get } - var colorActionOnBackgroundActionSecondaryEnabledOnBackgroundEmphasized: ColorSemanticToken { get } + var colorActionOnBgActionSecondaryEnabledOnBgEmphasized: ColorSemanticToken { get } - var colorActionOnBackgroundActionSecondaryHover: ColorSemanticToken { get } + var colorActionOnBgActionSecondaryHover: ColorSemanticToken { get } - var colorActionOnBackgroundActionSecondaryHoverOnBackgroundEmphasized: ColorSemanticToken { get } + var colorActionOnBgActionSecondaryHoverOnBgEmphasized: ColorSemanticToken { get } - var colorActionOnBackgroundActionSecondaryPressed: ColorSemanticToken { get } + var colorActionOnBgActionSecondaryPressed: ColorSemanticToken { get } - var colorActionOnBackgroundActionSecondaryPressedOnBackgroundEmphasized: ColorSemanticToken { get } + var colorActionOnBgActionSecondaryPressedOnBgEmphasized: ColorSemanticToken { get } - var colorActionOnBackgroundActionSecondaryLoading: ColorSemanticToken { get } + var colorActionOnBgActionSecondaryLoading: ColorSemanticToken { get } - var colorActionOnBackgroundActionSecondaryLoadingOnBackgroundEmphasized: ColorSemanticToken { get } + var colorActionOnBgActionSecondaryLoadingOnBgEmphasized: ColorSemanticToken { get } - var colorActionOnBackgroundActionSecondaryFocus: ColorSemanticToken { get } + var colorActionOnBgActionSecondaryFocus: ColorSemanticToken { get } - var colorActionOnBackgroundActionSecondaryFocusOnBackgroundEmphasized: ColorSemanticToken { get } + var colorActionOnBgActionSecondaryFocusOnBgEmphasized: ColorSemanticToken { get } // MARK: Semantic token - Colors - Always @@ -307,19 +307,19 @@ public protocol ColorSemanticTokens { var colorAlwaysAccent: ColorSemanticToken { get } - var colorAlwaysOnBackgroundBlack: ColorSemanticToken { get } + var colorAlwaysOnBgBlack: ColorSemanticToken { get } - var colorAlwaysOnBackgroundWhite: ColorSemanticToken { get } + var colorAlwaysOnBgWhite: ColorSemanticToken { get } - var colorAlwaysOnBackgroundWarning: ColorSemanticToken { get } + var colorAlwaysOnBgWarning: ColorSemanticToken { get } - var colorAlwaysOnBackgroundNegative: ColorSemanticToken { get } + var colorAlwaysOnBgNegative: ColorSemanticToken { get } - var colorAlwaysOnBackgroundPositive: ColorSemanticToken { get } + var colorAlwaysOnBgPositive: ColorSemanticToken { get } - var colorAlwaysOnBackgroundInfo: ColorSemanticToken { get } + var colorAlwaysOnBgInfo: ColorSemanticToken { get } - var colorAlwaysOnBackgroundAccent: ColorSemanticToken { get } + var colorAlwaysOnBgAccent: ColorSemanticToken { get } // MARK: Semantic token - Colors - Transparent @@ -329,49 +329,37 @@ public protocol ColorSemanticTokens { var colorElevationRaised: ColorSemanticToken { get } - var colorElevationRaisedOnBackgroundSecondary: ColorSemanticToken { get } + var colorElevationRaisedOnBgSecondary: ColorSemanticToken { get } - var colorElevationRaisedOnBackgroundEmphasized: ColorSemanticToken { get } + var colorElevationRaisedOnBgEmphasized: ColorSemanticToken { get } var colorElevationDrag: ColorSemanticToken { get } - var colorElevationDragOnBackgroundSecondary: ColorSemanticToken { get } + var colorElevationDragOnBgSecondary: ColorSemanticToken { get } - var colorElevationDragOnBackgroundEmphasized: ColorSemanticToken { get } + var colorElevationDragOnBgEmphasized: ColorSemanticToken { get } var colorElevationOverlayDefault: ColorSemanticToken { get } - var colorElevationOverlayDefaultOnBackgroundSecondary: ColorSemanticToken { get } + var colorElevationOverlayDefaultOnBgSecondary: ColorSemanticToken { get } - var colorElevationOverlayDefaultOnBackgroundEmphasized: ColorSemanticToken { get } + var colorElevationOverlayDefaultOnBgEmphasized: ColorSemanticToken { get } var colorElevationOverlayEmphasized: ColorSemanticToken { get } - var colorElevationOverlayEmphasizedOnBackgroundSecondary: ColorSemanticToken { get } + var colorElevationOverlayEmphasizedOnBgSecondary: ColorSemanticToken { get } - var colorElevationOverlayEmphasizedOnBackgroundEmphasized: ColorSemanticToken { get } + var colorElevationOverlayEmphasizedOnBgEmphasized: ColorSemanticToken { get } var colorElevationModal: ColorSemanticToken { get } // MARK: Semantic token - Colors - Decorative - var colorDecorativeBrandPrimary: ColorSemanticToken { get } - - var colorDecorativeBrandPrimaryMuted: ColorSemanticToken { get } - - var colorDecorativeBrandPrimaryEmphasized: ColorSemanticToken { get } + var colorDecorativePrimary: ColorSemanticToken { get } var colorDecorativeSecondary: ColorSemanticToken { get } - var colorDecorativeSecondaryMuted: ColorSemanticToken { get } - - var colorDecorativeSecondaryEmphasized: ColorSemanticToken { get } - - var colorDecorativeBrandTertiary: ColorSemanticToken { get } - - var colorDecorativeBrandTertiaryMuted: ColorSemanticToken { get } - - var colorDecorativeBrandTertiaryEmphasized: ColorSemanticToken { get } + var colorDecorativeTertiary: ColorSemanticToken { get } var colorDecorativeNeutralMuted: ColorSemanticToken { get } @@ -409,23 +397,23 @@ public protocol ColorSemanticTokens { var colorDecorativeAccent5Emphasized: ColorSemanticToken { get } - var colorDecorativeSkintTint100: ColorSemanticToken { get } + var colorDecorativeSkinTint100: ColorSemanticToken { get } - var colorDecorativeSkintTint200: ColorSemanticToken { get } + var colorDecorativeSkinTint200: ColorSemanticToken { get } - var colorDecorativeSkintTint300: ColorSemanticToken { get } + var colorDecorativeSkinTint300: ColorSemanticToken { get } - var colorDecorativeSkintTint400: ColorSemanticToken { get } + var colorDecorativeSkinTint400: ColorSemanticToken { get } - var colorDecorativeSkintTint500: ColorSemanticToken { get } + var colorDecorativeSkinTint500: ColorSemanticToken { get } - var colorDecorativeSkintTint600: ColorSemanticToken { get } + var colorDecorativeSkinTint600: ColorSemanticToken { get } - var colorDecorativeSkintTint700: ColorSemanticToken { get } + var colorDecorativeSkinTint700: ColorSemanticToken { get } - var colorDecorativeSkintTint800: ColorSemanticToken { get } + var colorDecorativeSkinTint800: ColorSemanticToken { get } - var colorDecorativeSkintTint900: ColorSemanticToken { get } + var colorDecorativeSkinTint900: ColorSemanticToken { get } // MARK: Semantic token - Colors - Chart diff --git a/OUDS/Foundations/TestsUtils/XCTestCase+extensions.swift b/OUDS/Foundations/TestsUtils/XCTestCase+extensions.swift index b6b084c81..867929232 100644 --- a/OUDS/Foundations/TestsUtils/XCTestCase+extensions.swift +++ b/OUDS/Foundations/TestsUtils/XCTestCase+extensions.swift @@ -36,14 +36,14 @@ extension XCTestCase { public func XCTAssertColorLighterThan(_ left: String, _ right: String, file: StaticString = #file, line: UInt = #line) { let leftBrightness = hexadecimalStringToInt(left) let rightBrightness = hexadecimalStringToInt(right) - XCTAssertGreaterThan(leftBrightness, rightBrightness, "Right color is not lighter than the left color", file: file, line: line) + XCTAssertGreaterThan(leftBrightness, rightBrightness, "Right color is not lighter than the left color", file: (file), line: line) } /// Compares two colors in hexadecimal values and asserts if `left` is "darker" than `right`, i.e. has a lower integer value public func XCTAssertColorDarkerThan(_ left: String, _ right: String, file: StaticString = #file, line: UInt = #line) { let leftBrightness = hexadecimalStringToInt(left) let rightBrightness = hexadecimalStringToInt(right) - XCTAssertLessThan(leftBrightness, rightBrightness, "Right color is not darker than the left color", file: file, line: line) + XCTAssertLessThan(leftBrightness, rightBrightness, "Right color is not darker than the left color", file: (file), line: line) } // MARK: - Helpers diff --git a/Showcase/Showcase/Pages/Tokens/Color/ColorTokenPage.swift b/Showcase/Showcase/Pages/Tokens/Color/ColorTokenPage.swift index 24c02e598..72289cbae 100644 --- a/Showcase/Showcase/Pages/Tokens/Color/ColorTokenPage.swift +++ b/Showcase/Showcase/Pages/Tokens/Color/ColorTokenPage.swift @@ -84,7 +84,7 @@ struct ColorTokenPage: View { } private func illustrationForContentOnBackground() -> some View { - ForEach(NamedColor.ContentOnBackground.allCases, id: \.rawValue) { namedColorToken in + ForEach(NamedColor.ContentOnBg.allCases, id: \.rawValue) { namedColorToken in illustration(for: namedColorToken.token(from: theme), name: namedColorToken.rawValue) } } diff --git a/Showcase/Showcase/Pages/Tokens/Color/NamedColor/NamedColor+Action.swift b/Showcase/Showcase/Pages/Tokens/Color/NamedColor/NamedColor+Action.swift index 1d1660bf9..f1a12259b 100644 --- a/Showcase/Showcase/Pages/Tokens/Color/NamedColor/NamedColor+Action.swift +++ b/Showcase/Showcase/Pages/Tokens/Color/NamedColor/NamedColor+Action.swift @@ -21,117 +21,116 @@ extension NamedColor { enum Action: String, CaseIterable { case colorActionSelected - case colorActionSelectedOnBackgroundEmphasized + case colorActionSelectedOnBgEmphasized case colorActionDisabled - case colorActionDisabledOnBackgroundEmphasized + case colorActionDisabledOnBgEmphasized case colorActionVisited - case colorActionVistedOnBackgroundEmphasized + case colorActionVistedOnBgEmphasized case colorActionPrimaryEnabled - case colorActionPrimaryEnabledOnBackgroundEmphasized + case colorActionPrimaryEnabledOnBgEmphasized case colorActionPrimaryHover - case colorActionPrimaryHoverOnBackgroundEmphasized - // NOTE: #124 - Following case(s) is / are not managed because not defined values! -// case colorActionPrimaryPressed - case colorActionPrimaryPressedOnBackgroundEmphasized + case colorActionPrimaryHoverOnBgEmphasized + case colorActionPrimaryPressed + case colorActionPrimaryPressedOnBgEmphasized case colorActionPrimaryLoading - case colorActionPrimaryLoadingOnBackgroundEmphasized + case colorActionPrimaryLoadingOnBgEmphasized case colorActionPrimaryFocus - case colorActionPrimaryFocusOnBackgroundEmphasized + case colorActionPrimaryFocusOnBgEmphasized case colorActionSecondaryEnabled - case colorActionSecondaryEnabledOnBackgroundEmphasized + case colorActionSecondaryEnabledOnBgEmphasized case colorActionSecondaryHover - case colorActionSecondaryHoverOnBackgroundEmphasized + case colorActionSecondaryHoverOnBgEmphasized case colorActionSecondaryPressed - case colorActionSecondaryPressedOnBackgroundEmphasized + case colorActionSecondaryPressedOnBgEmphasized case colorActionSecondaryLoading - case colorActionSecondaryLoadingOnBackgroundEmphasized + case colorActionSecondaryLoadingOnBgEmphasized case colorActionSecondaryFocus - case colorActionSecondaryFocusOnBackgroundEmphasized + case colorActionSecondaryFocusOnBgEmphasized case colorActionNegativeEnabled case colorActionNegativeHover case colorActionNegativePressed case colorActionNegativeLoading case colorActionNegativeFocus - case colorActionOnBackgroundActionDisabled - case colorActionOnBackgroundActionDisabledOnBackgroundEmphasized - case colorActionOnBackgroundActionNegative - case colorActionOnBackgroundActionPrimaryEnabled - case colorActionOnBackgroundActionPrimaryEnabledOnBackgroundEmphasized - case colorActionOnBackgroundActionPrimaryHover - case colorActionOnBackgroundActionPrimaryHoverOnBackgroundEmphasized - case colorActionOnBackgroundActionPrimaryPressed - case colorActionOnBackgroundActionPrimaryPressedOnBackgroundEmphasized - case colorActionOnBackgroundActionPrimaryLoading - case colorActionOnBackgroundActionPrimaryLoadingOnBackgroundEmphasized - case colorActionOnBackgroundActionPrimaryFocus - case colorActionOnBackgroundActionPrimaryFocusOnBackgroundEmphasized + case colorActionOnBgActionDisabled + case colorActionOnBgActionDisabledOnBgEmphasized + case colorActionOnBgActionNegative + case colorActionOnBgActionPrimaryEnabled + case colorActionOnBgActionPrimaryEnabledOnBgEmphasized + case colorActionOnBgActionPrimaryHover + case colorActionOnBgActionPrimaryHoverOnBgEmphasized + case colorActionOnBgActionPrimaryPressed + case colorActionOnBgActionPrimaryPressedOnBgEmphasized + case colorActionOnBgActionPrimaryLoading + case colorActionOnBgActionPrimaryLoadingOnBgEmphasized + case colorActionOnBgActionPrimaryFocus + case colorActionOnBgActionPrimaryFocusOnBgEmphasized // NOTE: #124 - Following case(s) is / are not managed because not defined values! -// case colorActionOnBackgroundActionSecondaryEnabled -// case colorActionOnBackgroundActionSecondaryEnabledOnBackgroundEmphasized -// case colorActionOnBackgroundActionSecondaryHover -// case colorActionOnBackgroundActionSecondaryHoverOnBackgroundEmphasized -// case colorActionOnBackgroundActionSecondaryPressed -// case colorActionOnBackgroundActionSecondaryPressedOnBackgroundEmphasized -// case colorActionOnBackgroundActionSecondaryLoading -// case colorActionOnBackgroundActionSecondaryLoadingOnBackgroundEmphasized -// case colorActionOnBackgroundActionSecondaryFocus -// case colorActionOnBackgroundActionSecondaryFocusOnBackgroundEmphasized +// case colorActionOnBgActionSecondaryEnabled +// case colorActionOnBgActionSecondaryEnabledOnBgEmphasized +// case colorActionOnBgActionSecondaryHover +// case colorActionOnBgActionSecondaryHoverOnBgEmphasized +// case colorActionOnBgActionSecondaryPressed +// case colorActionOnBgActionSecondaryPressedOnBgEmphasized +// case colorActionOnBgActionSecondaryLoading +// case colorActionOnBgActionSecondaryLoadingOnBgEmphasized +// case colorActionOnBgActionSecondaryFocus +// case colorActionOnBgActionSecondaryFocusOnBgEmphasized func token(from theme: OUDSTheme) -> ColorSemanticToken { switch self { case .colorActionSelected: return theme.colorActionSelected - case .colorActionSelectedOnBackgroundEmphasized: - return theme.colorActionSelectedOnBackgroundEmphasized + case .colorActionSelectedOnBgEmphasized: + return theme.colorActionSelectedOnBgEmphasized case .colorActionDisabled: return theme.colorActionDisabled - case .colorActionDisabledOnBackgroundEmphasized: - return theme.colorActionDisabledOnBackgroundEmphasized + case .colorActionDisabledOnBgEmphasized: + return theme.colorActionDisabledOnBgEmphasized case .colorActionVisited: return theme.colorActionVisited - case .colorActionVistedOnBackgroundEmphasized: - return theme.colorActionVistedOnBackgroundEmphasized + case .colorActionVistedOnBgEmphasized: + return theme.colorActionVistedOnBgEmphasized case .colorActionPrimaryEnabled: return theme.colorActionPrimaryEnabled - case .colorActionPrimaryEnabledOnBackgroundEmphasized: - return theme.colorActionPrimaryEnabledOnBackgroundEmphasized + case .colorActionPrimaryEnabledOnBgEmphasized: + return theme.colorActionPrimaryEnabledOnBgEmphasized case .colorActionPrimaryHover: return theme.colorActionPrimaryHover - case .colorActionPrimaryHoverOnBackgroundEmphasized: - return theme.colorActionPrimaryHoverOnBackgroundEmphasized + case .colorActionPrimaryHoverOnBgEmphasized: + return theme.colorActionPrimaryHoverOnBgEmphasized // NOTE: #124 - Following case(s) is / are not managed because not defined values! -// case .colorActionPrimaryPressed: -// return theme.colorActionPrimaryPressed - case .colorActionPrimaryPressedOnBackgroundEmphasized: - return theme.colorActionPrimaryPressedOnBackgroundEmphasized + case .colorActionPrimaryPressed: + return theme.colorActionPrimaryPressed + case .colorActionPrimaryPressedOnBgEmphasized: + return theme.colorActionPrimaryPressedOnBgEmphasized case .colorActionPrimaryLoading: return theme.colorActionPrimaryLoading - case .colorActionPrimaryLoadingOnBackgroundEmphasized: - return theme.colorActionPrimaryLoadingOnBackgroundEmphasized + case .colorActionPrimaryLoadingOnBgEmphasized: + return theme.colorActionPrimaryLoadingOnBgEmphasized case .colorActionPrimaryFocus: return theme.colorActionPrimaryFocus - case .colorActionPrimaryFocusOnBackgroundEmphasized: - return theme.colorActionPrimaryFocusOnBackgroundEmphasized + case .colorActionPrimaryFocusOnBgEmphasized: + return theme.colorActionPrimaryFocusOnBgEmphasized case .colorActionSecondaryEnabled: return theme.colorActionSecondaryEnabled - case .colorActionSecondaryEnabledOnBackgroundEmphasized: - return theme.colorActionSecondaryEnabledOnBackgroundEmphasized + case .colorActionSecondaryEnabledOnBgEmphasized: + return theme.colorActionSecondaryEnabledOnBgEmphasized case .colorActionSecondaryHover: return theme.colorActionSecondaryHover - case .colorActionSecondaryHoverOnBackgroundEmphasized: - return theme.colorActionSecondaryHoverOnBackgroundEmphasized + case .colorActionSecondaryHoverOnBgEmphasized: + return theme.colorActionSecondaryHoverOnBgEmphasized case .colorActionSecondaryPressed: return theme.colorActionSecondaryPressed - case .colorActionSecondaryPressedOnBackgroundEmphasized: - return theme.colorActionSecondaryPressedOnBackgroundEmphasized + case .colorActionSecondaryPressedOnBgEmphasized: + return theme.colorActionSecondaryPressedOnBgEmphasized case .colorActionSecondaryLoading: return theme.colorActionSecondaryLoading - case .colorActionSecondaryLoadingOnBackgroundEmphasized: - return theme.colorActionSecondaryLoadingOnBackgroundEmphasized + case .colorActionSecondaryLoadingOnBgEmphasized: + return theme.colorActionSecondaryLoadingOnBgEmphasized case .colorActionSecondaryFocus: return theme.colorActionSecondaryFocus - case .colorActionSecondaryFocusOnBackgroundEmphasized: - return theme.colorActionSecondaryFocusOnBackgroundEmphasized + case .colorActionSecondaryFocusOnBgEmphasized: + return theme.colorActionSecondaryFocusOnBgEmphasized case .colorActionNegativeEnabled: return theme.colorActionNegativeEnabled case .colorActionNegativeHover: @@ -142,53 +141,53 @@ extension NamedColor { return theme.colorActionNegativeLoading case .colorActionNegativeFocus: return theme.colorActionNegativeFocus - case .colorActionOnBackgroundActionDisabled: - return theme.colorActionOnBackgroundActionDisabled - case .colorActionOnBackgroundActionDisabledOnBackgroundEmphasized: - return theme.colorActionOnBackgroundActionDisabledOnBackgroundEmphasized - case .colorActionOnBackgroundActionNegative: - return theme.colorActionOnBackgroundActionNegative - case .colorActionOnBackgroundActionPrimaryEnabled: - return theme.colorActionOnBackgroundActionPrimaryEnabled - case .colorActionOnBackgroundActionPrimaryEnabledOnBackgroundEmphasized: - return theme.colorActionOnBackgroundActionPrimaryEnabledOnBackgroundEmphasized - case .colorActionOnBackgroundActionPrimaryHover: - return theme.colorActionOnBackgroundActionPrimaryHover - case .colorActionOnBackgroundActionPrimaryHoverOnBackgroundEmphasized: - return theme.colorActionOnBackgroundActionPrimaryHoverOnBackgroundEmphasized - case .colorActionOnBackgroundActionPrimaryPressed: - return theme.colorActionOnBackgroundActionPrimaryPressed - case .colorActionOnBackgroundActionPrimaryPressedOnBackgroundEmphasized: - return theme.colorActionOnBackgroundActionPrimaryPressedOnBackgroundEmphasized - case .colorActionOnBackgroundActionPrimaryLoading: - return theme.colorActionOnBackgroundActionPrimaryLoading - case .colorActionOnBackgroundActionPrimaryLoadingOnBackgroundEmphasized: - return theme.colorActionOnBackgroundActionPrimaryLoadingOnBackgroundEmphasized - case .colorActionOnBackgroundActionPrimaryFocus: - return theme.colorActionOnBackgroundActionPrimaryFocus - case .colorActionOnBackgroundActionPrimaryFocusOnBackgroundEmphasized: - return theme.colorActionOnBackgroundActionPrimaryFocusOnBackgroundEmphasized + case .colorActionOnBgActionDisabled: + return theme.colorActionOnBgActionDisabled + case .colorActionOnBgActionDisabledOnBgEmphasized: + return theme.colorActionOnBgActionDisabledOnBgEmphasized + case .colorActionOnBgActionNegative: + return theme.colorActionOnBgActionNegative + case .colorActionOnBgActionPrimaryEnabled: + return theme.colorActionOnBgActionPrimaryEnabled + case .colorActionOnBgActionPrimaryEnabledOnBgEmphasized: + return theme.colorActionOnBgActionPrimaryEnabledOnBgEmphasized + case .colorActionOnBgActionPrimaryHover: + return theme.colorActionOnBgActionPrimaryHover + case .colorActionOnBgActionPrimaryHoverOnBgEmphasized: + return theme.colorActionOnBgActionPrimaryHoverOnBgEmphasized + case .colorActionOnBgActionPrimaryPressed: + return theme.colorActionOnBgActionPrimaryPressed + case .colorActionOnBgActionPrimaryPressedOnBgEmphasized: + return theme.colorActionOnBgActionPrimaryPressedOnBgEmphasized + case .colorActionOnBgActionPrimaryLoading: + return theme.colorActionOnBgActionPrimaryLoading + case .colorActionOnBgActionPrimaryLoadingOnBgEmphasized: + return theme.colorActionOnBgActionPrimaryLoadingOnBgEmphasized + case .colorActionOnBgActionPrimaryFocus: + return theme.colorActionOnBgActionPrimaryFocus + case .colorActionOnBgActionPrimaryFocusOnBgEmphasized: + return theme.colorActionOnBgActionPrimaryFocusOnBgEmphasized // NOTE: #124 - Following case(s) is / are not managed because not defined values! -// case .colorActionOnBackgroundActionSecondaryEnabled: -// return theme.colorActionOnBackgroundActionSecondaryEnabled -// case .colorActionOnBackgroundActionSecondaryEnabledOnBackgroundEmphasized: -// return theme.colorActionOnBackgroundActionSecondaryEnabledOnBackgroundEmphasized -// case .colorActionOnBackgroundActionSecondaryHover: -// return theme.colorActionOnBackgroundActionSecondaryHover -// case .colorActionOnBackgroundActionSecondaryHoverOnBackgroundEmphasized: -// return theme.colorActionOnBackgroundActionSecondaryHoverOnBackgroundEmphasized -// case .colorActionOnBackgroundActionSecondaryPressed: -// return theme.colorActionOnBackgroundActionSecondaryPressed -// case .colorActionOnBackgroundActionSecondaryPressedOnBackgroundEmphasized: -// return theme.colorActionOnBackgroundActionSecondaryPressedOnBackgroundEmphasized -// case .colorActionOnBackgroundActionSecondaryLoading: -// return theme.colorActionOnBackgroundActionSecondaryLoading -// case .colorActionOnBackgroundActionSecondaryLoadingOnBackgroundEmphasized: -// return theme.colorActionOnBackgroundActionSecondaryLoadingOnBackgroundEmphasized -// case .colorActionOnBackgroundActionSecondaryFocus: -// return theme.colorActionOnBackgroundActionSecondaryFocus -// case .colorActionOnBackgroundActionSecondaryFocusOnBackgroundEmphasized: -// return theme.colorActionOnBackgroundActionSecondaryFocusOnBackgroundEmphasized +// case .colorActionOnBgActionSecondaryEnabled: +// return theme.colorActionOnBgActionSecondaryEnabled +// case .colorActionOnBgActionSecondaryEnabledOnBgEmphasized: +// return theme.colorActionOnBgActionSecondaryEnabledOnBgEmphasized +// case .colorActionOnBgActionSecondaryHover: +// return theme.colorActionOnBgActionSecondaryHover +// case .colorActionOnBgActionSecondaryHoverOnBgEmphasized: +// return theme.colorActionOnBgActionSecondaryHoverOnBgEmphasized +// case .colorActionOnBgActionSecondaryPressed: +// return theme.colorActionOnBgActionSecondaryPressed +// case .colorActionOnBgActionSecondaryPressedOnBgEmphasized: +// return theme.colorActionOnBgActionSecondaryPressedOnBgEmphasized +// case .colorActionOnBgActionSecondaryLoading: +// return theme.colorActionOnBgActionSecondaryLoading +// case .colorActionOnBgActionSecondaryLoadingOnBgEmphasized: +// return theme.colorActionOnBgActionSecondaryLoadingOnBgEmphasized +// case .colorActionOnBgActionSecondaryFocus: +// return theme.colorActionOnBgActionSecondaryFocus +// case .colorActionOnBgActionSecondaryFocusOnBgEmphasized: +// return theme.colorActionOnBgActionSecondaryFocusOnBgEmphasized } } } diff --git a/Showcase/Showcase/Pages/Tokens/Color/NamedColor/NamedColor+Always.swift b/Showcase/Showcase/Pages/Tokens/Color/NamedColor/NamedColor+Always.swift index 4ba47b3da..8adf2be5e 100644 --- a/Showcase/Showcase/Pages/Tokens/Color/NamedColor/NamedColor+Always.swift +++ b/Showcase/Showcase/Pages/Tokens/Color/NamedColor/NamedColor+Always.swift @@ -24,13 +24,13 @@ extension NamedColor { case colorAlwaysPositive case colorAlwaysInfo case colorAlwaysAccent - case colorAlwaysOnBackgroundBlack - case colorAlwaysOnBackgroundWhite - case colorAlwaysOnBackgroundWarning - case colorAlwaysOnBackgroundNegative - case colorAlwaysOnBackgroundPositive - case colorAlwaysOnBackgroundInfo - case colorAlwaysOnBackgroundAccent + case colorAlwaysOnBgBlack + case colorAlwaysOnBgWhite + case colorAlwaysOnBgWarning + case colorAlwaysOnBgNegative + case colorAlwaysOnBgPositive + case colorAlwaysOnBgInfo + case colorAlwaysOnBgAccent func token(from theme: OUDSTheme) -> ColorSemanticToken { switch self { @@ -48,20 +48,20 @@ extension NamedColor { return theme.colorAlwaysInfo case .colorAlwaysAccent: return theme.colorAlwaysAccent - case .colorAlwaysOnBackgroundBlack: - return theme.colorAlwaysOnBackgroundBlack - case .colorAlwaysOnBackgroundWhite: - return theme.colorAlwaysOnBackgroundWhite - case .colorAlwaysOnBackgroundWarning: - return theme.colorAlwaysOnBackgroundWarning - case .colorAlwaysOnBackgroundNegative: - return theme.colorAlwaysOnBackgroundNegative - case .colorAlwaysOnBackgroundPositive: - return theme.colorAlwaysOnBackgroundPositive - case .colorAlwaysOnBackgroundInfo: - return theme.colorAlwaysOnBackgroundInfo - case .colorAlwaysOnBackgroundAccent: - return theme.colorAlwaysOnBackgroundAccent + case .colorAlwaysOnBgBlack: + return theme.colorAlwaysOnBgBlack + case .colorAlwaysOnBgWhite: + return theme.colorAlwaysOnBgWhite + case .colorAlwaysOnBgWarning: + return theme.colorAlwaysOnBgWarning + case .colorAlwaysOnBgNegative: + return theme.colorAlwaysOnBgNegative + case .colorAlwaysOnBgPositive: + return theme.colorAlwaysOnBgPositive + case .colorAlwaysOnBgInfo: + return theme.colorAlwaysOnBgInfo + case .colorAlwaysOnBgAccent: + return theme.colorAlwaysOnBgAccent } } } diff --git a/Showcase/Showcase/Pages/Tokens/Color/NamedColor/NamedColor+Background.swift b/Showcase/Showcase/Pages/Tokens/Color/NamedColor/NamedColor+Background.swift index 65d1353dd..528730c66 100644 --- a/Showcase/Showcase/Pages/Tokens/Color/NamedColor/NamedColor+Background.swift +++ b/Showcase/Showcase/Pages/Tokens/Color/NamedColor/NamedColor+Background.swift @@ -29,21 +29,21 @@ extension NamedColor { // case colorBackgroundBrandSecondary // case colorBackgroundBrandTertiary case colorBackgroundStatusNeutral - case colorBackgroundStatusNeutralOnBackgroundEmphasized + case colorBackgroundStatusNeutralOnBgEmphasized case colorBackgroundStatusPositiveMuted - case colorBackgroundStatusPositiveMutedOnBackgroundEmphasized + case colorBackgroundStatusPositiveMutedOnBgEmphasized case colorBackgroundStatusPositiveEmphasized case colorBackgroundStatusInfoMuted - case colorBackgroundStatusInfoMutedOnBackgroundEmphasized + case colorBackgroundStatusInfoMutedOnBgEmphasized case colorBackgroundStatusInfoEmphasized case colorBackgroundStatusWarningMuted - case colorBackgroundStatusWarningMutedOnBackgroundEmphasized + case colorBackgroundStatusWarningMutedOnBgEmphasized case colorBackgroundStatusWarningEmphasized case colorBackgroundStatusNegativeMuted - case colorBackgroundStatusNegativeMutedOnBackgroundEmphasized + case colorBackgroundStatusNegativeMutedOnBgEmphasized case colorBackgroundStatusNegativeEmphasized case colorBackgroundStatusAccentMuted - case colorBackgroundStatusAccentMutedOnBackgroundEmphasized + case colorBackgroundStatusAccentMutedOnBgEmphasized case colorBackgroundStatusAccentEmphasized func token(from theme: OUDSTheme) -> ColorSemanticToken { @@ -66,36 +66,36 @@ extension NamedColor { // return theme.colorBackgroundBrandTertiary case .colorBackgroundStatusNeutral: return theme.colorBackgroundStatusNeutral - case .colorBackgroundStatusNeutralOnBackgroundEmphasized: - return theme.colorBackgroundStatusNeutralOnBackgroundEmphasized + case .colorBackgroundStatusNeutralOnBgEmphasized: + return theme.colorBackgroundStatusNeutralOnBgEmphasized case .colorBackgroundStatusPositiveMuted: return theme.colorBackgroundStatusPositiveMuted - case .colorBackgroundStatusPositiveMutedOnBackgroundEmphasized: - return theme.colorBackgroundStatusPositiveMutedOnBackgroundEmphasized + case .colorBackgroundStatusPositiveMutedOnBgEmphasized: + return theme.colorBackgroundStatusPositiveMutedOnBgEmphasized case .colorBackgroundStatusPositiveEmphasized: return theme.colorBackgroundStatusPositiveEmphasized case .colorBackgroundStatusInfoMuted: return theme.colorBackgroundStatusInfoMuted - case .colorBackgroundStatusInfoMutedOnBackgroundEmphasized: - return theme.colorBackgroundStatusInfoMutedOnBackgroundEmphasized + case .colorBackgroundStatusInfoMutedOnBgEmphasized: + return theme.colorBackgroundStatusInfoMutedOnBgEmphasized case .colorBackgroundStatusInfoEmphasized: return theme.colorBackgroundStatusInfoEmphasized case .colorBackgroundStatusWarningMuted: return theme.colorBackgroundStatusWarningMuted - case .colorBackgroundStatusWarningMutedOnBackgroundEmphasized: - return theme.colorBackgroundStatusWarningMutedOnBackgroundEmphasized + case .colorBackgroundStatusWarningMutedOnBgEmphasized: + return theme.colorBackgroundStatusWarningMutedOnBgEmphasized case .colorBackgroundStatusWarningEmphasized: return theme.colorBackgroundStatusWarningEmphasized case .colorBackgroundStatusNegativeMuted: return theme.colorBackgroundStatusNegativeMuted - case .colorBackgroundStatusNegativeMutedOnBackgroundEmphasized: - return theme.colorBackgroundStatusNegativeMutedOnBackgroundEmphasized + case .colorBackgroundStatusNegativeMutedOnBgEmphasized: + return theme.colorBackgroundStatusNegativeMutedOnBgEmphasized case .colorBackgroundStatusNegativeEmphasized: return theme.colorBackgroundStatusNegativeEmphasized case .colorBackgroundStatusAccentMuted: return theme.colorBackgroundStatusAccentMuted - case .colorBackgroundStatusAccentMutedOnBackgroundEmphasized: - return theme.colorBackgroundStatusAccentMutedOnBackgroundEmphasized + case .colorBackgroundStatusAccentMutedOnBgEmphasized: + return theme.colorBackgroundStatusAccentMutedOnBgEmphasized case .colorBackgroundStatusAccentEmphasized: return theme.colorBackgroundStatusAccentEmphasized } diff --git a/Showcase/Showcase/Pages/Tokens/Color/NamedColor/NamedColor+Border.swift b/Showcase/Showcase/Pages/Tokens/Color/NamedColor/NamedColor+Border.swift index cff8e68bf..cffbac843 100644 --- a/Showcase/Showcase/Pages/Tokens/Color/NamedColor/NamedColor+Border.swift +++ b/Showcase/Showcase/Pages/Tokens/Color/NamedColor/NamedColor+Border.swift @@ -14,17 +14,15 @@ import OUDS import OUDSTokensSemantic -// swiftlint:disable identifier_name - extension NamedColor { enum Border: String, CaseIterable { case colorBorderDefault - case colorBorderDefaultOnBackgroundEmphasized + case colorBorderDefaultOnBgEmphasized case colorBorderEmphasized - case colorBorderEmphasizedOnBackgroundEmphasized + case colorBorderEmphasizedOnBgEmphasized case colorBorderFocus - case colorBorderBrandPrimaryOnBackgroundEmphasized + case colorBorderBrandPrimaryOnBgEmphasized case colorBorderBrandPrimary // NOTE: #124 - Following case(s) is / are not managed because not defined values! // case colorBorderBrandSecondary @@ -34,25 +32,25 @@ extension NamedColor { // case colorBorderStatusWarning // case colorBorderStatusNegative // case colorBorderStatusAccent - case colorBorderOnBackgroundBrandPrimary + case colorBorderOnBgBrandPrimary // NOTE: #124 - Following case(s) is / are not managed because not defined values! - // case colorBorderOnBackgroundBrandSecondary - // case colorBorderOnBackgroundBrandTertiary + // case colorBorderOnBgBrandSecondary + // case colorBorderOnBgBrandTertiary func token(from theme: OUDSTheme) -> ColorSemanticToken { switch self { case .colorBorderDefault: return theme.colorBorderDefault - case .colorBorderDefaultOnBackgroundEmphasized: - return theme.colorBorderDefaultOnBackgroundEmphasized + case .colorBorderDefaultOnBgEmphasized: + return theme.colorBorderDefaultOnBgEmphasized case .colorBorderEmphasized: return theme.colorBorderEmphasized - case .colorBorderEmphasizedOnBackgroundEmphasized: - return theme.colorBorderEmphasizedOnBackgroundEmphasized + case .colorBorderEmphasizedOnBgEmphasized: + return theme.colorBorderEmphasizedOnBgEmphasized case .colorBorderFocus: return theme.colorBorderFocus - case .colorBorderBrandPrimaryOnBackgroundEmphasized: - return theme.colorBorderBrandPrimaryOnBackgroundEmphasized + case .colorBorderBrandPrimaryOnBgEmphasized: + return theme.colorBorderBrandPrimaryOnBgEmphasized case .colorBorderBrandPrimary: return theme.colorBorderBrandPrimary // NOTE: #124 - Following case(s) is / are not managed because not defined values! @@ -70,16 +68,14 @@ extension NamedColor { // return theme.colorBorderStatusNegative // case .colorBorderStatusAccent: // return theme.colorBorderStatusAccent - case .colorBorderOnBackgroundBrandPrimary: - return theme.colorBorderOnBackgroundBrandPrimary + case .colorBorderOnBgBrandPrimary: + return theme.colorBorderOnBgBrandPrimary // NOTE: #124 - Following case(s) is / are not managed because not defined values! -// case .colorBorderOnBackgroundBrandSecondary: -// return theme.colorBorderOnBackgroundBrandSecondary -// case .colorBorderOnBackgroundBrandTertiary: -// return theme.colorBorderOnBackgroundBrandTertiary +// case .colorBorderOnBgBrandSecondary: +// return theme.colorBorderOnBgBrandSecondary +// case .colorBorderOnBgBrandTertiary: +// return theme.colorBorderOnBgBrandTertiary } } } } - -// swiftlint:enable identifier_name diff --git a/Showcase/Showcase/Pages/Tokens/Color/NamedColor/NamedColor+Content.swift b/Showcase/Showcase/Pages/Tokens/Color/NamedColor/NamedColor+Content.swift index c3f7fb399..17019c846 100644 --- a/Showcase/Showcase/Pages/Tokens/Color/NamedColor/NamedColor+Content.swift +++ b/Showcase/Showcase/Pages/Tokens/Color/NamedColor/NamedColor+Content.swift @@ -20,11 +20,11 @@ extension NamedColor { enum Content: String, CaseIterable { case colorContentDefault - case colorContentContentDefaultOnBackgroundEmphasized + case colorContentContentDefaultOnBgEmphasized case colorContentMuted - case colorContentContentMutedOnBackgroundEmphasized + case colorContentContentMutedOnBgEmphasized case colorContentDisabled - case colorContentContentDisabledOnBackgroundEmphasized + case colorContentContentDisabledOnBgEmphasized case colorContentBrandPrimary // NOTE: #124 - Following case(s) is / are not managed because not defined values! // case colorContentBrandSecondary @@ -40,16 +40,16 @@ extension NamedColor { switch self { case .colorContentDefault: return theme.colorContentDefault - case .colorContentContentDefaultOnBackgroundEmphasized: - return theme.colorContentContentDefaultOnBackgroundEmphasized + case .colorContentContentDefaultOnBgEmphasized: + return theme.colorContentContentDefaultOnBgEmphasized case .colorContentMuted: return theme.colorContentMuted - case .colorContentContentMutedOnBackgroundEmphasized: - return theme.colorContentContentMutedOnBackgroundEmphasized + case .colorContentContentMutedOnBgEmphasized: + return theme.colorContentContentMutedOnBgEmphasized case .colorContentDisabled: return theme.colorContentDisabled - case .colorContentContentDisabledOnBackgroundEmphasized: - return theme.colorContentContentDisabledOnBackgroundEmphasized + case .colorContentContentDisabledOnBgEmphasized: + return theme.colorContentContentDisabledOnBgEmphasized case .colorContentBrandPrimary: return theme.colorContentBrandPrimary // NOTE: #124 - Following case(s) is / are not managed because not defined values! diff --git a/Showcase/Showcase/Pages/Tokens/Color/NamedColor/NamedColor+Decorative.swift b/Showcase/Showcase/Pages/Tokens/Color/NamedColor/NamedColor+Decorative.swift index ef9d68799..95abf24fc 100644 --- a/Showcase/Showcase/Pages/Tokens/Color/NamedColor/NamedColor+Decorative.swift +++ b/Showcase/Showcase/Pages/Tokens/Color/NamedColor/NamedColor+Decorative.swift @@ -19,18 +19,9 @@ import OUDSTokensSemantic extension NamedColor { enum Decorative: String, CaseIterable { - case colorDecorativeBrandPrimary - // NOTE: #124 - Following case(s) is / are not managed because not defined values! - // case colorDecorativeBrandPrimaryMuted - // case colorDecorativeBrandPrimaryEmphasized + case colorDecorativePrimary case colorDecorativeSecondary - // NOTE: #124 - Following case(s) is / are not managed because not defined values! - // case colorDecorativeSecondaryMuted - // case colorDecorativeSecondaryEmphasized - case colorDecorativeBrandTertiary - // NOTE: #124 - Following case(s) is / are not managed because not defined values! - // case colorDecorativeBrandTertiaryMuted - // case colorDecorativeBrandTertiaryEmphasized + case colorDecorativeTertiary case colorDecorativeNeutralMuted case colorDecorativeNeutralDefault case colorDecorativeNeutralEmphasized @@ -49,39 +40,24 @@ extension NamedColor { case colorDecorativeAccent5Muted case colorDecorativeAccent5Default case colorDecorativeAccent5Emphasized - case colorDecorativeSkintTint100 - case colorDecorativeSkintTint200 - case colorDecorativeSkintTint300 - case colorDecorativeSkintTint400 - case colorDecorativeSkintTint500 - case colorDecorativeSkintTint600 - case colorDecorativeSkintTint700 - case colorDecorativeSkintTint800 - case colorDecorativeSkintTint900 + case colorDecorativeSkinTint100 + case colorDecorativeSkinTint200 + case colorDecorativeSkinTint300 + case colorDecorativeSkinTint400 + case colorDecorativeSkinTint500 + case colorDecorativeSkinTint600 + case colorDecorativeSkinTint700 + case colorDecorativeSkinTint800 + case colorDecorativeSkinTint900 func token(from theme: OUDSTheme) -> ColorSemanticToken { switch self { - case .colorDecorativeBrandPrimary: - return theme.colorDecorativeBrandPrimary - // NOTE: #124 - Following case(s) is / are not managed because not defined values! -// case .colorDecorativeBrandPrimaryMuted: -// return theme.colorDecorativeBrandPrimaryMuted -// case .colorDecorativeBrandPrimaryEmphasized: -// return theme.colorDecorativeBrandPrimaryEmphasized + case .colorDecorativePrimary: + return theme.colorDecorativePrimary case .colorDecorativeSecondary: return theme.colorDecorativeSecondary - // NOTE: #124 - Following case(s) is / are not managed because not defined values! -// case .colorDecorativeSecondaryMuted: -// return theme.colorDecorativeSecondaryMuted -// case .colorDecorativeSecondaryEmphasized: -// return theme.colorDecorativeSecondaryEmphasized - case .colorDecorativeBrandTertiary: - return theme.colorDecorativeBrandTertiary - // NOTE: #124 - Following case(s) is / are not managed because not defined values! -// case .colorDecorativeBrandTertiaryMuted: -// return theme.colorDecorativeBrandTertiaryMuted -// case .colorDecorativeBrandTertiaryEmphasized: -// return theme.colorDecorativeBrandTertiaryEmphasized + case .colorDecorativeTertiary: + return theme.colorDecorativeTertiary case .colorDecorativeNeutralMuted: return theme.colorDecorativeNeutralMuted case .colorDecorativeNeutralDefault: @@ -118,24 +94,24 @@ extension NamedColor { return theme.colorDecorativeAccent5Default case .colorDecorativeAccent5Emphasized: return theme.colorDecorativeAccent5Emphasized - case .colorDecorativeSkintTint100: - return theme.colorDecorativeSkintTint100 - case .colorDecorativeSkintTint200: - return theme.colorDecorativeSkintTint200 - case .colorDecorativeSkintTint300: - return theme.colorDecorativeSkintTint300 - case .colorDecorativeSkintTint400: - return theme.colorDecorativeSkintTint400 - case .colorDecorativeSkintTint500: - return theme.colorDecorativeSkintTint500 - case .colorDecorativeSkintTint600: - return theme.colorDecorativeSkintTint600 - case .colorDecorativeSkintTint700: - return theme.colorDecorativeSkintTint700 - case .colorDecorativeSkintTint800: - return theme.colorDecorativeSkintTint800 - case .colorDecorativeSkintTint900: - return theme.colorDecorativeSkintTint900 + case .colorDecorativeSkinTint100: + return theme.colorDecorativeSkinTint100 + case .colorDecorativeSkinTint200: + return theme.colorDecorativeSkinTint200 + case .colorDecorativeSkinTint300: + return theme.colorDecorativeSkinTint300 + case .colorDecorativeSkinTint400: + return theme.colorDecorativeSkinTint400 + case .colorDecorativeSkinTint500: + return theme.colorDecorativeSkinTint500 + case .colorDecorativeSkinTint600: + return theme.colorDecorativeSkinTint600 + case .colorDecorativeSkinTint700: + return theme.colorDecorativeSkinTint700 + case .colorDecorativeSkinTint800: + return theme.colorDecorativeSkinTint800 + case .colorDecorativeSkinTint900: + return theme.colorDecorativeSkinTint900 } } } diff --git a/Showcase/Showcase/Pages/Tokens/Color/NamedColor/NamedColor+Elevation.swift b/Showcase/Showcase/Pages/Tokens/Color/NamedColor/NamedColor+Elevation.swift index b1eff5029..92097ffd3 100644 --- a/Showcase/Showcase/Pages/Tokens/Color/NamedColor/NamedColor+Elevation.swift +++ b/Showcase/Showcase/Pages/Tokens/Color/NamedColor/NamedColor+Elevation.swift @@ -20,45 +20,45 @@ extension NamedColor { enum Elevation: String, CaseIterable { case colorElevationRaised - case colorElevationRaisedOnBackgroundSecondary - case colorElevationRaisedOnBackgroundEmphasized + case colorElevationRaisedOnBgSecondary + case colorElevationRaisedOnBgEmphasized case colorElevationDrag - case colorElevationDragOnBackgroundSecondary - case colorElevationDragOnBackgroundEmphasized + case colorElevationDragOnBgSecondary + case colorElevationDragOnBgEmphasized case colorElevationOverlayDefault - case colorElevationOverlayDefaultOnBackgroundSecondary - case colorElevationOverlayDefaultOnBackgroundEmphasized + case colorElevationOverlayDefaultOnBgSecondary + case colorElevationOverlayDefaultOnBgEmphasized case colorElevationOverlayEmphasized - case colorElevationOverlayEmphasizedOnBackgroundSecondary - case colorElevationOverlayEmphasizedOnBackgroundEmphasized + case colorElevationOverlayEmphasizedOnBgSecondary + case colorElevationOverlayEmphasizedOnBgEmphasized case colorElevationModal func token(from theme: OUDSTheme) -> ColorSemanticToken { switch self { case .colorElevationRaised: return theme.colorElevationRaised - case .colorElevationRaisedOnBackgroundSecondary: - return theme.colorElevationRaisedOnBackgroundSecondary - case .colorElevationRaisedOnBackgroundEmphasized: - return theme.colorElevationRaisedOnBackgroundEmphasized + case .colorElevationRaisedOnBgSecondary: + return theme.colorElevationRaisedOnBgSecondary + case .colorElevationRaisedOnBgEmphasized: + return theme.colorElevationRaisedOnBgEmphasized case .colorElevationDrag: return theme.colorElevationDrag - case .colorElevationDragOnBackgroundSecondary: - return theme.colorElevationDragOnBackgroundSecondary - case .colorElevationDragOnBackgroundEmphasized: - return theme.colorElevationDragOnBackgroundEmphasized + case .colorElevationDragOnBgSecondary: + return theme.colorElevationDragOnBgSecondary + case .colorElevationDragOnBgEmphasized: + return theme.colorElevationDragOnBgEmphasized case .colorElevationOverlayDefault: return theme.colorElevationOverlayDefault - case .colorElevationOverlayDefaultOnBackgroundSecondary: - return theme.colorElevationOverlayDefaultOnBackgroundSecondary - case .colorElevationOverlayDefaultOnBackgroundEmphasized: - return theme.colorElevationOverlayDefaultOnBackgroundEmphasized + case .colorElevationOverlayDefaultOnBgSecondary: + return theme.colorElevationOverlayDefaultOnBgSecondary + case .colorElevationOverlayDefaultOnBgEmphasized: + return theme.colorElevationOverlayDefaultOnBgEmphasized case .colorElevationOverlayEmphasized: return theme.colorElevationOverlayEmphasized - case .colorElevationOverlayEmphasizedOnBackgroundSecondary: - return theme.colorElevationOverlayEmphasizedOnBackgroundSecondary - case .colorElevationOverlayEmphasizedOnBackgroundEmphasized: - return theme.colorElevationOverlayEmphasizedOnBackgroundEmphasized + case .colorElevationOverlayEmphasizedOnBgSecondary: + return theme.colorElevationOverlayEmphasizedOnBgSecondary + case .colorElevationOverlayEmphasizedOnBgEmphasized: + return theme.colorElevationOverlayEmphasizedOnBgEmphasized case .colorElevationModal: return theme.colorElevationModal } diff --git a/Showcase/Showcase/Pages/Tokens/Color/NamedColor/NamedColor+OnContent.swift b/Showcase/Showcase/Pages/Tokens/Color/NamedColor/NamedColor+OnContent.swift index 163269393..89a80e242 100644 --- a/Showcase/Showcase/Pages/Tokens/Color/NamedColor/NamedColor+OnContent.swift +++ b/Showcase/Showcase/Pages/Tokens/Color/NamedColor/NamedColor+OnContent.swift @@ -18,66 +18,66 @@ import OUDSTokensSemantic extension NamedColor { - enum ContentOnBackground: String, CaseIterable { - case colorContentOnBackgroundPrimary + enum ContentOnBg: String, CaseIterable { + case colorContentOnBgPrimary // NOTE: #124 - Following case(s) is / are not managed because not defined values! - // case colorContentOnBackgroundSecondary - // case colorContentOnBackgroundTertiary - case colorContentOnBackgroundStatusPositiveMuted - case colorContentOnBackgroundStatusPositiveMutedOnBackgroundEmphasized - case colorContentOnBackgroundStatusPositiveEmphasized - case colorContentOnBackgroundStatusInfoMuted - case colorContentOnBackgroundStatusInfoMutedOnBackgroundEmphasized - case colorContentOnBackgroundStatusInfoEmphasized - case colorContentOnBackgroundStatusWarningMuted - case colorContentOnBackgroundStatusWarningMutedOnBackgroundEmphasized - case colorContentOnBackgroundStatusWarningEmphasized - case colorContentOnBackgroundStatusNegativeMuted - case colorContentOnBackgroundStatusNegativeMutedOnBackgroundEmphasized - case colorContentOnBackgroundStatusNegativeEmphasized - case colorContentOnBackgroundStatusAccentMuted - case colorContentOnBackgroundStatusAccentMutedOnBackgroundEmphasized - case colorContentOnBackgroundStatusAccentedEmphasized + // case colorContentOnBgSecondary + // case colorContentOnBgTertiary + case colorContentOnBgStatusPositiveMuted + case colorContentOnBgStatusPositiveMutedOnBgEmphasized + case colorContentOnBgStatusPositiveEmphasized + case colorContentOnBgStatusInfoMuted + case colorContentOnBgStatusInfoMutedOnBgEmphasized + case colorContentOnBgStatusInfoEmphasized + case colorContentOnBgStatusWarningMuted + case colorContentOnBgStatusWarningMutedOnBgEmphasized + case colorContentOnBgStatusWarningEmphasized + case colorContentOnBgStatusNegativeMuted + case colorContentOnBgStatusNegativeMutedOnBgEmphasized + case colorContentOnBgStatusNegativeEmphasized + case colorContentOnBgStatusAccentMuted + case colorContentOnBgStatusAccentMutedOnBgEmphasized + case colorContentOnBgStatusAccentedEmphasized func token(from theme: OUDSTheme) -> ColorSemanticToken { switch self { - case .colorContentOnBackgroundPrimary: - return theme.colorContentOnBackgroundPrimary + case .colorContentOnBgPrimary: + return theme.colorContentOnBgPrimary // NOTE: #124 - Following case(s) is / are not managed because not defined values! -// case .colorContentOnBackgroundSecondary: -// return theme.colorContentOnBackgroundSecondary -// case .colorContentOnBackgroundTertiary: -// return theme.colorContentOnBackgroundTertiary - case .colorContentOnBackgroundStatusPositiveMuted: - return theme.colorContentOnBackgroundStatusPositiveMuted - case .colorContentOnBackgroundStatusPositiveMutedOnBackgroundEmphasized: - return theme.colorContentOnBackgroundStatusPositiveMutedOnBackgroundEmphasized - case .colorContentOnBackgroundStatusPositiveEmphasized: - return theme.colorContentOnBackgroundStatusPositiveEmphasized - case .colorContentOnBackgroundStatusInfoMuted: - return theme.colorContentOnBackgroundStatusInfoMuted - case .colorContentOnBackgroundStatusInfoMutedOnBackgroundEmphasized: - return theme.colorContentOnBackgroundStatusInfoMutedOnBackgroundEmphasized - case .colorContentOnBackgroundStatusInfoEmphasized: - return theme.colorContentOnBackgroundStatusInfoEmphasized - case .colorContentOnBackgroundStatusWarningMuted: - return theme.colorContentOnBackgroundStatusWarningMuted - case .colorContentOnBackgroundStatusWarningMutedOnBackgroundEmphasized: - return theme.colorContentOnBackgroundStatusWarningMutedOnBackgroundEmphasized - case .colorContentOnBackgroundStatusWarningEmphasized: - return theme.colorContentOnBackgroundStatusWarningEmphasized - case .colorContentOnBackgroundStatusNegativeMuted: - return theme.colorContentOnBackgroundStatusNegativeMuted - case .colorContentOnBackgroundStatusNegativeMutedOnBackgroundEmphasized: - return theme.colorContentOnBackgroundStatusNegativeMutedOnBackgroundEmphasized - case .colorContentOnBackgroundStatusNegativeEmphasized: - return theme.colorContentOnBackgroundStatusNegativeEmphasized - case .colorContentOnBackgroundStatusAccentMuted: - return theme.colorContentOnBackgroundStatusAccentMuted - case .colorContentOnBackgroundStatusAccentMutedOnBackgroundEmphasized: - return theme.colorContentOnBackgroundStatusAccentMutedOnBackgroundEmphasized - case .colorContentOnBackgroundStatusAccentedEmphasized: - return theme.colorContentOnBackgroundStatusAccentedEmphasized +// case .colorContentOnBgSecondary: +// return theme.colorContentOnBgSecondary +// case .colorContentOnBgTertiary: +// return theme.colorContentOnBgTertiary + case .colorContentOnBgStatusPositiveMuted: + return theme.colorContentOnBgStatusPositiveMuted + case .colorContentOnBgStatusPositiveMutedOnBgEmphasized: + return theme.colorContentOnBgStatusPositiveMutedOnBgEmphasized + case .colorContentOnBgStatusPositiveEmphasized: + return theme.colorContentOnBgStatusPositiveEmphasized + case .colorContentOnBgStatusInfoMuted: + return theme.colorContentOnBgStatusInfoMuted + case .colorContentOnBgStatusInfoMutedOnBgEmphasized: + return theme.colorContentOnBgStatusInfoMutedOnBgEmphasized + case .colorContentOnBgStatusInfoEmphasized: + return theme.colorContentOnBgStatusInfoEmphasized + case .colorContentOnBgStatusWarningMuted: + return theme.colorContentOnBgStatusWarningMuted + case .colorContentOnBgStatusWarningMutedOnBgEmphasized: + return theme.colorContentOnBgStatusWarningMutedOnBgEmphasized + case .colorContentOnBgStatusWarningEmphasized: + return theme.colorContentOnBgStatusWarningEmphasized + case .colorContentOnBgStatusNegativeMuted: + return theme.colorContentOnBgStatusNegativeMuted + case .colorContentOnBgStatusNegativeMutedOnBgEmphasized: + return theme.colorContentOnBgStatusNegativeMutedOnBgEmphasized + case .colorContentOnBgStatusNegativeEmphasized: + return theme.colorContentOnBgStatusNegativeEmphasized + case .colorContentOnBgStatusAccentMuted: + return theme.colorContentOnBgStatusAccentMuted + case .colorContentOnBgStatusAccentMutedOnBgEmphasized: + return theme.colorContentOnBgStatusAccentMutedOnBgEmphasized + case .colorContentOnBgStatusAccentedEmphasized: + return theme.colorContentOnBgStatusAccentedEmphasized } } } diff --git a/Showcase/Showcase/Pages/Tokens/Dimension/Spacing/SpacingTokenPage.swift b/Showcase/Showcase/Pages/Tokens/Dimension/Spacing/SpacingTokenPage.swift index 81b205cd2..f58963687 100644 --- a/Showcase/Showcase/Pages/Tokens/Dimension/Spacing/SpacingTokenPage.swift +++ b/Showcase/Showcase/Pages/Tokens/Dimension/Spacing/SpacingTokenPage.swift @@ -47,7 +47,7 @@ struct SpacingTokenPage: View { return ShowcaseTokenIllustration(tokenName: name, tokenValue: value) { ZStack { Rectangle() - .fill(theme.colorAlwaysOnBackgroundAccent.color(for: colorScheme)) + .fill(theme.colorAlwaysOnBgAccent.color(for: colorScheme)) .frame(width: 64, height: 64, alignment: .center) Rectangle() .fill(.blue) From 9a77929a92b98d6d4ee14a7a537f8410b5f2f6f8 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Lapersonne Date: Tue, 22 Oct 2024 12:52:00 +0200 Subject: [PATCH 11/30] chore: update `SwiftLint` to v0.57.0, apply strict mode for linter warnings (#233) SwiftLint was old, we used v0.52. New rules have been apllied, needed v0.57. To be sure no compiling code will be sbumitted with warnings, apply strict mode to convert warnings as errors. Related to Renovate pull request #77 Signed-off-by: Pierre-Yves Lapersonne --- .github/DEVELOP.md | 10 ++++++++-- .swiftlint.yml | 15 ++++++++++----- CHANGELOG.md | 5 +++-- Showcase/Podfile | 2 +- Showcase/Podfile.lock | 8 ++++---- 5 files changed, 26 insertions(+), 14 deletions(-) diff --git a/.github/DEVELOP.md b/.github/DEVELOP.md index 45cfe8718..88368fbf5 100644 --- a/.github/DEVELOP.md +++ b/.github/DEVELOP.md @@ -30,19 +30,25 @@ If some tools are missing, pick the suitable command line below and check versio bundle install # Use CocoaPods to install other dependencies not available as rubygems (thanks to Podfile and Podfile.lock files) -bundle exec pod install +bundle exec pod install --repo-update + +# Update your references +brew update # For Periphery (https://github.com/peripheryapp/periphery) for dead code hunt (at least 2.21.0) brew install peripheryapp/periphery/periphery # For gitleaks (https://github.com/gitleaks/gitleaks) for secrets leaks hunt (at least 8.18.1) brew install gitleaks +# or `brew reinstall gitleaks` to get updates if old version installed -# For SwiftLint (at least 0.52.4) +# For SwiftLint (at least 0.57.0) brew install swiftlint +# or `brew reinstall swiftlint` to get updates if old version installed # For SwiftFormat (at least 0.52.4) brew install swiftformat +# or `brew reinstall swiftformat` to get updates if old version installed ``` Ensure you have the suitable _Ruby_ version. We recommend the use of [rbenv](https://github.com/rbenv/rbenv) to load the suitable version of ruby. diff --git a/.swiftlint.yml b/.swiftlint.yml index a7a07b39b..ea7d6b244 100644 --- a/.swiftlint.yml +++ b/.swiftlint.yml @@ -12,7 +12,9 @@ # # More details at https://realm.github.io/SwiftLint +# Expected SwiftLint v0.57.0 (at least) +strict: true # ======== # Included @@ -32,8 +34,6 @@ excluded: - Showcase/Pods - Showcase/DerivedData -strict: true - # ============== # Disabled rules # ============== @@ -57,6 +57,14 @@ disabled_rules: - vertical_whitespace_between_cases - vertical_whitespace_opening_braces +# ============== +# Analyzer rules +# ============== + +analyzer_rules: +- explicit_self +- unused_import + # ===================================== # Opt-in rules (not enabled by default) # ===================================== @@ -64,7 +72,6 @@ disabled_rules: opt_in_rules: - accessibility_label_for_image - accessibility_trait_for_button -- anyobject_protocol - array_init - closure_body_length - closure_end_indentation @@ -79,7 +86,6 @@ opt_in_rules: - empty_string - empty_xctest_method - explicit_init -- explicit_self - fallthrough - fatal_error_message - first_where @@ -140,7 +146,6 @@ opt_in_rules: - unneeded_parentheses_in_closure_argument - unowned_variable_capture - untyped_error_in_catch -- unused_import - unused_optional_binding - vertical_parameter_alignment - vertical_parameter_alignment_on_call diff --git a/CHANGELOG.md b/CHANGELOG.md index 3ed38467f..5b2bafce8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed +- [Tool] Improve configuration of SwiftLint, update to v0.57.0 ([#77](https://github.com/Orange-OpenSource/ouds-ios/pull/77)) - [Library] Rename all color semantic tokens `*OnBackground*` to `*OnBg*` ([#208](https://github.com/Orange-OpenSource/ouds-ios/issues/208)) - [Library] Rename `colorDecorativeBrandTertiary` to `colorDecorativeTertiary` - [Library] Rename `colorDecorativeBrandPrimary` to `colorDecorativePrimary` ([#208](https://github.com/Orange-OpenSource/ouds-ios/issues/208)) @@ -20,8 +21,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - [Library] Update color semantic tokens ([#208](https://github.com/Orange-OpenSource/ouds-ios/issues/208)) - [Library] Update `BorderRawTokens` (tokenator *20241022102003*) - [Library] Update `ColorRawTokens` (tokenator *20241021180411*) -- [Library/DemoApp] Migration to Swift 6 -- [Library/DemoApp] Migration from *Xcode 15.3* to to *Xcode 16* ([#201](https://github.com/Orange-OpenSource/ouds-ios/issues/201)) +- [Tool] Migration to Swift 6 +- [Tool] Migration from *Xcode 15.3* to to *Xcode 16* ([#201](https://github.com/Orange-OpenSource/ouds-ios/issues/201)) - [Library] Rename `borderWidthOutsideFocus` to `borderWidthFocus` ([#207](https://github.com/Orange-OpenSource/ouds-ios/issues/207)) - [Library] Update `OpacityRawTokens` (tokenator *20241021134644*) diff --git a/Showcase/Podfile b/Showcase/Podfile index 3d484b7f0..75da0bc47 100644 --- a/Showcase/Podfile +++ b/Showcase/Podfile @@ -16,7 +16,7 @@ use_frameworks! platform :ios, '15.0' target 'Showcase' do - pod 'SwiftLint', '0.56.1' + pod 'SwiftLint', '0.57.0' pod 'SwiftFormat/CLI', '0.54.3' end diff --git a/Showcase/Podfile.lock b/Showcase/Podfile.lock index e486e484b..16923568f 100644 --- a/Showcase/Podfile.lock +++ b/Showcase/Podfile.lock @@ -1,10 +1,10 @@ PODS: - SwiftFormat/CLI (0.54.3) - - SwiftLint (0.56.1) + - SwiftLint (0.57.0) DEPENDENCIES: - SwiftFormat/CLI (= 0.54.3) - - SwiftLint (= 0.56.1) + - SwiftLint (= 0.57.0) SPEC REPOS: trunk: @@ -13,8 +13,8 @@ SPEC REPOS: SPEC CHECKSUMS: SwiftFormat: 0e575b1d412d27cd5906c59fab64a806ba8f2b8e - SwiftLint: c5fa0b7eece474d43d2178b581a1242a16267347 + SwiftLint: eb47480d47c982481592c195c221d11013a679cc -PODFILE CHECKSUM: d4eaef68c29378eeba698b5b3aa1a53cad7903d2 +PODFILE CHECKSUM: bfef5a8fc64db26e764a569d0867dc51654ba6b9 COCOAPODS: 1.15.2 From d4238e743973483026c7d0441ef2883b22eeb111 Mon Sep 17 00:00:00 2001 From: "Boosted Bot [bot]" <130566815+boosted-bot@users.noreply.github.com> Date: Tue, 22 Oct 2024 15:14:24 +0200 Subject: [PATCH 12/30] =?UTF-8?q?chore(=F0=9F=A4=96):=20update=20`Dimensio?= =?UTF-8?q?nRawTokens`=20(tokenator=20generation=2020241022132646)=20(#234?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Pierre-Yves Lapersonne Co-authored-by: boosted-bot Co-authored-by: Pierre-Yves Lapersonne --- CHANGELOG.md | 1 + .../Values/DimensionRawTokens+Values.swift | 79 ++++++++----------- 2 files changed, 36 insertions(+), 44 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5b2bafce8..c45c4590c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed +- [Library] Update `DimensionRawTokens` (tokenator *20241022132646*) - [Tool] Improve configuration of SwiftLint, update to v0.57.0 ([#77](https://github.com/Orange-OpenSource/ouds-ios/pull/77)) - [Library] Rename all color semantic tokens `*OnBackground*` to `*OnBg*` ([#208](https://github.com/Orange-OpenSource/ouds-ios/issues/208)) - [Library] Rename `colorDecorativeBrandTertiary` to `colorDecorativeTertiary` diff --git a/OUDS/Core/Tokens/RawTokens/Sources/Values/DimensionRawTokens+Values.swift b/OUDS/Core/Tokens/RawTokens/Sources/Values/DimensionRawTokens+Values.swift index 34afdfbf1..0b006a238 100644 --- a/OUDS/Core/Tokens/RawTokens/Sources/Values/DimensionRawTokens+Values.swift +++ b/OUDS/Core/Tokens/RawTokens/Sources/Values/DimensionRawTokens+Values.swift @@ -11,54 +11,45 @@ // Software description: A SwiftUI components library with code examples for Orange Unified Design System // -// ଘ( ・ω・)_/゚・:*:・。☆ -// [File to generate with the tokenator] - // swiftlint:disable missing_docs -/// Extracted in a separated file to help the *Figma* JSON to Swift parser to generate files to include easily. extension DimensionRawTokens { - - /// Double type because used below for computations with Double values, output of the parser public static let dimensionBase: Double = 4 - - // MARK: Primitive token - Dimension - - public static let dimension0: DimensionRawToken = dimensionBase * 0 - public static let dimension25: DimensionRawToken = dimensionBase * 0.5 - public static let dimension50: DimensionRawToken = dimensionBase * 1 - public static let dimension75: DimensionRawToken = dimensionBase * 1.5 - public static let dimension100: DimensionRawToken = dimensionBase * 2 - public static let dimension125: DimensionRawToken = dimensionBase * 2.5 - public static let dimension150: DimensionRawToken = dimensionBase * 3 - public static let dimension200: DimensionRawToken = dimensionBase * 4 - public static let dimension250: DimensionRawToken = dimensionBase * 5 - public static let dimension300: DimensionRawToken = dimensionBase * 6 - public static let dimension350: DimensionRawToken = dimensionBase * 7 - public static let dimension400: DimensionRawToken = dimensionBase * 8 - public static let dimension450: DimensionRawToken = dimensionBase * 9 - public static let dimension500: DimensionRawToken = dimensionBase * 10 - public static let dimension550: DimensionRawToken = dimensionBase * 11 - public static let dimension600: DimensionRawToken = dimensionBase * 12 - public static let dimension650: DimensionRawToken = dimensionBase * 13 - public static let dimension700: DimensionRawToken = dimensionBase * 14 - public static let dimension750: DimensionRawToken = dimensionBase * 15 - public static let dimension800: DimensionRawToken = dimensionBase * 16 - public static let dimension850: DimensionRawToken = dimensionBase * 17 - public static let dimension900: DimensionRawToken = dimensionBase * 18 - public static let dimension1000: DimensionRawToken = dimensionBase * 20 - public static let dimension1200: DimensionRawToken = dimensionBase * 24 - public static let dimension1400: DimensionRawToken = dimensionBase * 28 - public static let dimension1600: DimensionRawToken = dimensionBase * 32 - public static let dimension1800: DimensionRawToken = dimensionBase * 36 - public static let dimension2000: DimensionRawToken = dimensionBase * 40 - public static let dimension3000: DimensionRawToken = dimensionBase * 80 - public static let dimension4000: DimensionRawToken = dimensionBase * 120 - public static let dimension5000: DimensionRawToken = dimensionBase * 140 - public static let dimension6000: DimensionRawToken = dimensionBase * 160 - public static let dimension7000: DimensionRawToken = dimensionBase * 180 - public static let dimension9000: DimensionRawToken = dimensionBase * 220 - public static let dimension11000: DimensionRawToken = dimensionBase * 260 + public static let dimension0: DimensionRawToken = dimensionBase * 0 // 0 + public static let dimension25: DimensionRawToken = dimensionBase * 0.5 // 2 + public static let dimension50: DimensionRawToken = dimensionBase * 1 // 4 + public static let dimension75: DimensionRawToken = dimensionBase * 1.5 // 6 + public static let dimension100: DimensionRawToken = dimensionBase * 2 // 8 + public static let dimension125: DimensionRawToken = dimensionBase * 2.5 // 10 + public static let dimension150: DimensionRawToken = dimensionBase * 3 // 12 + public static let dimension200: DimensionRawToken = dimensionBase * 4 // 16 + public static let dimension250: DimensionRawToken = dimensionBase * 5 // 20 + public static let dimension300: DimensionRawToken = dimensionBase * 6 // 24 + public static let dimension350: DimensionRawToken = dimensionBase * 7 // 28 + public static let dimension400: DimensionRawToken = dimensionBase * 8 // 32 + public static let dimension450: DimensionRawToken = dimensionBase * 9 // 36 + public static let dimension500: DimensionRawToken = dimensionBase * 10 // 40 + public static let dimension550: DimensionRawToken = dimensionBase * 11 // 44 + public static let dimension600: DimensionRawToken = dimensionBase * 12 // 48 + public static let dimension650: DimensionRawToken = dimensionBase * 13 // 52 + public static let dimension700: DimensionRawToken = dimensionBase * 14 // 56 + public static let dimension750: DimensionRawToken = dimensionBase * 15 // 60 + public static let dimension800: DimensionRawToken = dimensionBase * 16 // 64 + public static let dimension850: DimensionRawToken = dimensionBase * 17 // 68 + public static let dimension900: DimensionRawToken = dimensionBase * 18 // 72 + public static let dimension1000: DimensionRawToken = dimensionBase * 20 // 80 + public static let dimension1200: DimensionRawToken = dimensionBase * 24 // 96 + public static let dimension1400: DimensionRawToken = dimensionBase * 28 // 112 + public static let dimension1600: DimensionRawToken = dimensionBase * 32 // 128 + public static let dimension1800: DimensionRawToken = dimensionBase * 36 // 144 + public static let dimension2000: DimensionRawToken = dimensionBase * 40 // 160 + public static let dimension3000: DimensionRawToken = dimensionBase * 80 // 320 + public static let dimension4000: DimensionRawToken = dimensionBase * 120 // 480 + public static let dimension5000: DimensionRawToken = dimensionBase * 140 // 560 + public static let dimension6000: DimensionRawToken = dimensionBase * 160 // 640 + public static let dimension7000: DimensionRawToken = dimensionBase * 180 // 720 + public static let dimension9000: DimensionRawToken = dimensionBase * 220 // 880 + public static let dimension11000: DimensionRawToken = dimensionBase * 260 // 1040 } // swiftlint:enable missing_docs From 73f27447a715b66598050d6cd84a235a5aee3dde Mon Sep 17 00:00:00 2001 From: "Boosted Bot [bot]" <130566815+boosted-bot@users.noreply.github.com> Date: Wed, 23 Oct 2024 10:13:49 +0200 Subject: [PATCH 13/30] =?UTF-8?q?chore(=F0=9F=A4=96):=20update`ElevationRa?= =?UTF-8?q?wTokens`=20(tokenator=20generation=2020241022174330)=20(#235)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Pierre-Yves Lapersonne Co-authored-by: boosted-bot Co-authored-by: Pierre-Yves Lapersonne --- CHANGELOG.md | 1 + .../Values/ElevationRawTokens+Values.swift | 29 +++++-------------- 2 files changed, 9 insertions(+), 21 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c45c4590c..5b495c7ff 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed +- [Library] Update `ElevationRawTokens` (tokenator *20241022174330*) - [Library] Update `DimensionRawTokens` (tokenator *20241022132646*) - [Tool] Improve configuration of SwiftLint, update to v0.57.0 ([#77](https://github.com/Orange-OpenSource/ouds-ios/pull/77)) - [Library] Rename all color semantic tokens `*OnBackground*` to `*OnBg*` ([#208](https://github.com/Orange-OpenSource/ouds-ios/issues/208)) diff --git a/OUDS/Core/Tokens/RawTokens/Sources/Values/ElevationRawTokens+Values.swift b/OUDS/Core/Tokens/RawTokens/Sources/Values/ElevationRawTokens+Values.swift index 78d260723..73b8acf65 100644 --- a/OUDS/Core/Tokens/RawTokens/Sources/Values/ElevationRawTokens+Values.swift +++ b/OUDS/Core/Tokens/RawTokens/Sources/Values/ElevationRawTokens+Values.swift @@ -11,30 +11,9 @@ // Software description: A SwiftUI components library with code examples for Orange Unified Design System // -// ଘ( ・ω・)_/゚・:*:・。☆ -// [File to generate with the tokenator] - // swiftlint:disable missing_docs -/// Extracted in a separated file to help the *Figma* JSON to Swift parser to generate files to include easily. extension ElevationRawTokens { - - // MARK: Primitive token - Elevation - X - - public static let elevationX0: ElevationRawToken = 0 - - // MARK: Primitive token - Elevation - Y - - public static let elevationY0: ElevationRawToken = 0 - public static let elevationY100: ElevationRawToken = 1 - public static let elevationY200: ElevationRawToken = 2 - public static let elevationY300: ElevationRawToken = 4 - public static let elevationY400: ElevationRawToken = 8 - public static let elevationY500: ElevationRawToken = 12 - public static let elevationY600: ElevationRawToken = 20 - - // MARK: Primitive token - Elevation - Blur - public static let elevationBlur0: ElevationRawToken = 0 public static let elevationBlur100: ElevationRawToken = 1 public static let elevationBlur200: ElevationRawToken = 2 @@ -43,6 +22,14 @@ extension ElevationRawTokens { public static let elevationBlur500: ElevationRawToken = 8 public static let elevationBlur600: ElevationRawToken = 12 public static let elevationBlur700: ElevationRawToken = 20 + public static let elevationX0: ElevationRawToken = 0 + public static let elevationY0: ElevationRawToken = 0 + public static let elevationY100: ElevationRawToken = 1 + public static let elevationY200: ElevationRawToken = 2 + public static let elevationY300: ElevationRawToken = 4 + public static let elevationY400: ElevationRawToken = 8 + public static let elevationY500: ElevationRawToken = 12 + public static let elevationY600: ElevationRawToken = 20 } // swiftlint:enable missing_docs From d68fddd7cdbe7dd072a8c2a82d2baae906a29791 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Lapersonne Date: Thu, 24 Oct 2024 10:07:06 +0200 Subject: [PATCH 14/30] ci: add app details in GitHub issue template of bugs Signed-off-by: Pierre-Yves Lapersonne --- .github/ISSUE_TEMPLATE/bug_report.yml | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 2ce6776e1..6d69938e6 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -31,9 +31,23 @@ body: id: app-version attributes: label: App version - placeholder: v1.0.1 (build 42) + placeholder: 0.5.0 validations: required: true + - type: input + id: app-build-number + attributes: + label: App build number + placeholder: "13" + validations: + required: true + - type: input + id: app-build-type + attributes: + label: App build type + placeholder: alpha, beta, prod, DEBUG + validations: + required: true - type: input id: app-orientation attributes: From 7ef3dba09e747cd515ac6d83130cdc1d3b7e5f61 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Lapersonne Date: Thu, 24 Oct 2024 11:55:14 +0200 Subject: [PATCH 15/30] fix: duplicated section in color page for content on background (#236) (#239) Signed-off-by: Pierre-Yves Lapersonne --- CHANGELOG.md | 1 + Showcase/Showcase/Pages/Tokens/Color/ColorTokenPage.swift | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5b495c7ff..8af407888 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -38,6 +38,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed +- [DemoApp] Remove duplicated section in color page for content on background values ([#236](https://github.com/Orange-OpenSource/ouds-ios/issues/236)) - [DemoApp] Hide from Voice Over decorative image in theme selector (a11y) ## [0.4.1](https://github.com/Orange-OpenSource/ouds-ios/compare/0.4.0...0.4.1) - 2024-10-21 diff --git a/Showcase/Showcase/Pages/Tokens/Color/ColorTokenPage.swift b/Showcase/Showcase/Pages/Tokens/Color/ColorTokenPage.swift index 72289cbae..0ea68508c 100644 --- a/Showcase/Showcase/Pages/Tokens/Color/ColorTokenPage.swift +++ b/Showcase/Showcase/Pages/Tokens/Color/ColorTokenPage.swift @@ -30,7 +30,6 @@ struct ColorTokenPage: View { Section { illustrationForAlways() } header: { header("Always") } Section { illustrationForContent() } header: { header("Content") } Section { illustrationForContentOnBackground() } header: { header("Content On Background") } - Section { illustrationForContentOnBackground() } header: { header("Content On Background") } Section { illustrationForBorder() } header: { header("Border") } Section { illustrationForeElevation() } header: { header("Elevation") } Section { illustrationForDecorative() } header: { header("Decorative") } From 8341401de42175adce155e262cb6e6dbc00b114c Mon Sep 17 00:00:00 2001 From: LudovicPinel Date: Thu, 24 Oct 2024 17:07:33 +0200 Subject: [PATCH 16/30] feat: adjust space tokens screen with all categories (#178) (#238) Closes #178 Reviewed-by: Pierre-Yves Lapersonne --- CHANGELOG.md | 1 + NOTICE.txt | 1 + Showcase/Showcase.xcodeproj/project.pbxproj | 92 +++-- .../xcshareddata/swiftpm/Package.resolved | 24 ++ Showcase/Showcase/MainView.swift | 6 +- Showcase/Showcase/Pages/About/AboutPage.swift | 10 +- .../Pages/Components/ComponentsPage.swift | 1 + .../Pages/Components/EmptyState.swift | 4 +- .../Pages/ThemeSelection/ThemeSelection.swift | 1 + .../Pages/Tokens/Border/BorderTokenPage.swift | 6 +- .../Pages/Tokens/Color/ColorTokenPage.swift | 58 ++-- .../Dimension/DimensionTokenElement.swift | 4 +- .../SizeTokenElement.swift} | 8 +- .../SizeTokenPage.swift} | 2 +- .../NamedSpace/NameSpace+GapInline.swift | 44 +++ .../Space/NamedSpace/NameSpace+GapStack.swift | 44 +++ .../NamedSpace/NameSpace+PaddingInline.swift | 47 +++ .../NameSpace+PaddingInlineWithArrow.swift | 50 +++ .../NameSpace+PaddingInlineWithIcon.swift | 50 +++ .../NamedSpace/NameSpace+PaddingInset.swift | 56 +++ .../NamedSpace/NameSpace+PaddingStack.swift | 47 +++ .../Space/NamedSpace/NamedSpace+Fixed.swift | 62 ++++ .../Space/NamedSpace/NamedSpace+Scaled.swift | 56 +++ .../SpaceTokenElement.swift} | 8 +- .../Dimension/Space/SpaceTokenPage.swift | 326 ++++++++++++++++++ .../Dimension/Spacing/SpacingTokenPage.swift | 98 ------ .../Pages/Utils/ShowcaseElementsPage.swift | 2 +- .../Utils/ShowcaseSectionHeaderStyle.swift | 33 ++ .../Tokens/ic_vector.imageset/Contents.json | 12 + .../Tokens/ic_vector.imageset/ic_vector.svg | 3 + .../Resources/en.lproj/Localizable.strings | 35 +- 31 files changed, 1014 insertions(+), 177 deletions(-) create mode 100644 Showcase/Showcase.xcworkspace/xcshareddata/swiftpm/Package.resolved rename Showcase/Showcase/Pages/Tokens/Dimension/{Sizing/SizingTokenElement.swift => Size/SizeTokenElement.swift} (74%) rename Showcase/Showcase/Pages/Tokens/Dimension/{Sizing/SizingTokenPage.swift => Size/SizeTokenPage.swift} (98%) create mode 100644 Showcase/Showcase/Pages/Tokens/Dimension/Space/NamedSpace/NameSpace+GapInline.swift create mode 100644 Showcase/Showcase/Pages/Tokens/Dimension/Space/NamedSpace/NameSpace+GapStack.swift create mode 100644 Showcase/Showcase/Pages/Tokens/Dimension/Space/NamedSpace/NameSpace+PaddingInline.swift create mode 100644 Showcase/Showcase/Pages/Tokens/Dimension/Space/NamedSpace/NameSpace+PaddingInlineWithArrow.swift create mode 100644 Showcase/Showcase/Pages/Tokens/Dimension/Space/NamedSpace/NameSpace+PaddingInlineWithIcon.swift create mode 100644 Showcase/Showcase/Pages/Tokens/Dimension/Space/NamedSpace/NameSpace+PaddingInset.swift create mode 100644 Showcase/Showcase/Pages/Tokens/Dimension/Space/NamedSpace/NameSpace+PaddingStack.swift create mode 100644 Showcase/Showcase/Pages/Tokens/Dimension/Space/NamedSpace/NamedSpace+Fixed.swift create mode 100644 Showcase/Showcase/Pages/Tokens/Dimension/Space/NamedSpace/NamedSpace+Scaled.swift rename Showcase/Showcase/Pages/Tokens/Dimension/{Spacing/SpacingTokenElement.swift => Space/SpaceTokenElement.swift} (73%) create mode 100644 Showcase/Showcase/Pages/Tokens/Dimension/Space/SpaceTokenPage.swift delete mode 100644 Showcase/Showcase/Pages/Tokens/Dimension/Spacing/SpacingTokenPage.swift create mode 100644 Showcase/Showcase/Pages/Utils/ShowcaseSectionHeaderStyle.swift create mode 100644 Showcase/Showcase/Resources/Assets.xcassets/Tokens/ic_vector.imageset/Contents.json create mode 100644 Showcase/Showcase/Resources/Assets.xcassets/Tokens/ic_vector.imageset/ic_vector.svg diff --git a/CHANGELOG.md b/CHANGELOG.md index 8af407888..61552457e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added +- [DemoApp] Update space tokens screen with all categories ([#178](https://github.com/Orange-OpenSource/ouds-ios/issues/178)) - [Library] Semantic token `borderWidthFocusInset` ([#207](https://github.com/Orange-OpenSource/ouds-ios/issues/207)) ### Changed diff --git a/NOTICE.txt b/NOTICE.txt index 70613f138..c97a8ab5e 100644 --- a/NOTICE.txt +++ b/NOTICE.txt @@ -75,6 +75,7 @@ Any use or displaying shall constitute an infringement under intellectual proper ./Showcase/Showcase/Resources/Assets.xcassets/Tokens/ic_filter_effects.imageset/ic_filter_effects.svg ./Showcase/Showcase/Resources/Assets.xcassets/Tokens/ic_layers.imageset/ic_layers.svg ./Showcase/Showcase/Resources/Assets.xcassets/Tokens/ic_palette.imageset/ic_palette.svg +./Showcase/Showcase/Resources/Assets.xcassets/Tokens/ic_vector.imageset/ic_vector.svg ./Showcase/Showcase/Resources/Assets.xcassets/Tokens/ic_typography.imageset/ic_typography.svg ./Showcase/Showcase/Resources/Assets.xcassets/Tokens/ic_union.imageset/ic_union.svg diff --git a/Showcase/Showcase.xcodeproj/project.pbxproj b/Showcase/Showcase.xcodeproj/project.pbxproj index 1b36757ba..03b20bfcc 100644 --- a/Showcase/Showcase.xcodeproj/project.pbxproj +++ b/Showcase/Showcase.xcodeproj/project.pbxproj @@ -33,8 +33,8 @@ 0740A99A2C9874670069D24A /* SnapshotTesting in Frameworks */ = {isa = PBXBuildFile; productRef = 0740A9992C9874670069D24A /* SnapshotTesting */; }; 0740A99B2C9874E70069D24A /* Snapshot.swift in Sources */ = {isa = PBXBuildFile; fileRef = 074008222C942810006B8729 /* Snapshot.swift */; }; 0747947A2CAE882A0033C2D8 /* EmptyState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 074794792CAE882A0033C2D8 /* EmptyState.swift */; }; - 075114DB2CB7D28D00B8B759 /* SizingTokenElement.swift in Sources */ = {isa = PBXBuildFile; fileRef = 075114D82CB7D28D00B8B759 /* SizingTokenElement.swift */; }; - 075114DC2CB7D28D00B8B759 /* SizingTokenPage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 075114D92CB7D28D00B8B759 /* SizingTokenPage.swift */; }; + 075114DB2CB7D28D00B8B759 /* SizeTokenElement.swift in Sources */ = {isa = PBXBuildFile; fileRef = 075114D82CB7D28D00B8B759 /* SizeTokenElement.swift */; }; + 075114DC2CB7D28D00B8B759 /* SizeTokenPage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 075114D92CB7D28D00B8B759 /* SizeTokenPage.swift */; }; 075114E02CB7FDC200B8B759 /* ColorTokenElement.swift in Sources */ = {isa = PBXBuildFile; fileRef = 075114DE2CB7FDC200B8B759 /* ColorTokenElement.swift */; }; 075114E12CB7FDC200B8B759 /* ColorTokenPage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 075114DF2CB7FDC200B8B759 /* ColorTokenPage.swift */; }; 075114E82CB81F0E00B8B759 /* ShowcaseTokenIllustration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 075114E72CB81F0E00B8B759 /* ShowcaseTokenIllustration.swift */; }; @@ -48,8 +48,8 @@ 0765B4A22CC15C0500E69359 /* NamedColor+OnContent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0765B4A12CC15C0500E69359 /* NamedColor+OnContent.swift */; }; 0765B4A42CC15C3E00E69359 /* NamedColor+Chart.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0765B4A32CC15C3E00E69359 /* NamedColor+Chart.swift */; }; 0765B4A62CC15C9D00E69359 /* NamedColor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0765B4A52CC15C9D00E69359 /* NamedColor.swift */; }; - 077CCE572CB426090059CC28 /* SpacingTokenElement.swift in Sources */ = {isa = PBXBuildFile; fileRef = 077CCE512CB426090059CC28 /* SpacingTokenElement.swift */; }; - 077CCE582CB426090059CC28 /* SpacingTokenPage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 077CCE522CB426090059CC28 /* SpacingTokenPage.swift */; }; + 077CCE572CB426090059CC28 /* SpaceTokenElement.swift in Sources */ = {isa = PBXBuildFile; fileRef = 077CCE512CB426090059CC28 /* SpaceTokenElement.swift */; }; + 077CCE582CB426090059CC28 /* SpaceTokenPage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 077CCE522CB426090059CC28 /* SpaceTokenPage.swift */; }; 077CCE592CB426090059CC28 /* DimensionTokenElement.swift in Sources */ = {isa = PBXBuildFile; fileRef = 077CCE542CB426090059CC28 /* DimensionTokenElement.swift */; }; 077CCE5C2CB431C50059CC28 /* ShowcaseVariantElement.swift in Sources */ = {isa = PBXBuildFile; fileRef = 077CCE5B2CB431C50059CC28 /* ShowcaseVariantElement.swift */; }; 07CF426B2CA30728000BD03E /* TokensPage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 07CF426A2CA30728000BD03E /* TokensPage.swift */; }; @@ -62,6 +62,16 @@ 07CF42842CA45DA9000BD03E /* BorderTokenElement.swift in Sources */ = {isa = PBXBuildFile; fileRef = 07CF42812CA45DA9000BD03E /* BorderTokenElement.swift */; }; 07CF42852CA45DA9000BD03E /* BorderTokenPage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 07CF42822CA45DA9000BD03E /* BorderTokenPage.swift */; }; 07CF42892CA55BC8000BD03E /* ThemeSelection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 07CF42882CA55BC8000BD03E /* ThemeSelection.swift */; }; + 07F0FA8A2CC935FF000F166F /* NameSpace+PaddingInlineWithIcon.swift in Sources */ = {isa = PBXBuildFile; fileRef = 07F0FA892CC935FF000F166F /* NameSpace+PaddingInlineWithIcon.swift */; }; + 07F0FA8C2CC9408C000F166F /* NameSpace+PaddingInlineWithArrow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 07F0FA8B2CC9408C000F166F /* NameSpace+PaddingInlineWithArrow.swift */; }; + 07F7533B2CC785620007450D /* ShowcaseSectionHeaderStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 07F7533A2CC785620007450D /* ShowcaseSectionHeaderStyle.swift */; }; + 07F75A372CC644C80004F1AD /* NamedSpace+Scaled.swift in Sources */ = {isa = PBXBuildFile; fileRef = 07F75A362CC644C80004F1AD /* NamedSpace+Scaled.swift */; }; + 07F75A392CC6462D0004F1AD /* NamedSpace+Fixed.swift in Sources */ = {isa = PBXBuildFile; fileRef = 07F75A382CC6462D0004F1AD /* NamedSpace+Fixed.swift */; }; + 07F75A3B2CC651EB0004F1AD /* NameSpace+PaddingInline.swift in Sources */ = {isa = PBXBuildFile; fileRef = 07F75A3A2CC651EB0004F1AD /* NameSpace+PaddingInline.swift */; }; + 07F75A3D2CC653BD0004F1AD /* NameSpace+PaddingInset.swift in Sources */ = {isa = PBXBuildFile; fileRef = 07F75A3C2CC653BD0004F1AD /* NameSpace+PaddingInset.swift */; }; + 07F75A3F2CC653CD0004F1AD /* NameSpace+GapInline.swift in Sources */ = {isa = PBXBuildFile; fileRef = 07F75A3E2CC653CD0004F1AD /* NameSpace+GapInline.swift */; }; + 07F75A412CC653EB0004F1AD /* NameSpace+GapStack.swift in Sources */ = {isa = PBXBuildFile; fileRef = 07F75A402CC653EB0004F1AD /* NameSpace+GapStack.swift */; }; + 07F75A432CC654050004F1AD /* NameSpace+PaddingStack.swift in Sources */ = {isa = PBXBuildFile; fileRef = 07F75A422CC654050004F1AD /* NameSpace+PaddingStack.swift */; }; 51087A7B2C46DF9F00160CCF /* Bundle+extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51087A7A2C46DF9F00160CCF /* Bundle+extension.swift */; }; 510A9CD02C5679A300430620 /* OUDSComponents in Frameworks */ = {isa = PBXBuildFile; productRef = 510A9CCF2C5679A300430620 /* OUDSComponents */; }; 512364792C3D7B2D00572FD5 /* Podfile.lock in Resources */ = {isa = PBXBuildFile; fileRef = 512364782C3D7B2D00572FD5 /* Podfile.lock */; }; @@ -112,8 +122,8 @@ 0740A98F2C9873500069D24A /* ShowcaseTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ShowcaseTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 0740A99C2C9888CF0069D24A /* ShowcaseUITestPlan.xctestplan */ = {isa = PBXFileReference; lastKnownFileType = text; name = ShowcaseUITestPlan.xctestplan; path = ../ShowcaseUITestPlan.xctestplan; sourceTree = ""; }; 074794792CAE882A0033C2D8 /* EmptyState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EmptyState.swift; sourceTree = ""; }; - 075114D82CB7D28D00B8B759 /* SizingTokenElement.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SizingTokenElement.swift; sourceTree = ""; }; - 075114D92CB7D28D00B8B759 /* SizingTokenPage.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SizingTokenPage.swift; sourceTree = ""; }; + 075114D82CB7D28D00B8B759 /* SizeTokenElement.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SizeTokenElement.swift; sourceTree = ""; }; + 075114D92CB7D28D00B8B759 /* SizeTokenPage.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SizeTokenPage.swift; sourceTree = ""; }; 075114DE2CB7FDC200B8B759 /* ColorTokenElement.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ColorTokenElement.swift; sourceTree = ""; }; 075114DF2CB7FDC200B8B759 /* ColorTokenPage.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ColorTokenPage.swift; sourceTree = ""; }; 075114E72CB81F0E00B8B759 /* ShowcaseTokenIllustration.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShowcaseTokenIllustration.swift; sourceTree = ""; }; @@ -127,8 +137,8 @@ 0765B4A12CC15C0500E69359 /* NamedColor+OnContent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NamedColor+OnContent.swift"; sourceTree = ""; }; 0765B4A32CC15C3E00E69359 /* NamedColor+Chart.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NamedColor+Chart.swift"; sourceTree = ""; }; 0765B4A52CC15C9D00E69359 /* NamedColor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NamedColor.swift; sourceTree = ""; }; - 077CCE512CB426090059CC28 /* SpacingTokenElement.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SpacingTokenElement.swift; sourceTree = ""; }; - 077CCE522CB426090059CC28 /* SpacingTokenPage.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SpacingTokenPage.swift; sourceTree = ""; }; + 077CCE512CB426090059CC28 /* SpaceTokenElement.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SpaceTokenElement.swift; sourceTree = ""; }; + 077CCE522CB426090059CC28 /* SpaceTokenPage.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SpaceTokenPage.swift; sourceTree = ""; }; 077CCE542CB426090059CC28 /* DimensionTokenElement.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DimensionTokenElement.swift; sourceTree = ""; }; 077CCE5B2CB431C50059CC28 /* ShowcaseVariantElement.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShowcaseVariantElement.swift; sourceTree = ""; }; 07CEDD802C7DB921003E1885 /* generateDoc.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; name = generateDoc.sh; path = ../generateDoc.sh; sourceTree = ""; }; @@ -142,6 +152,16 @@ 07CF42812CA45DA9000BD03E /* BorderTokenElement.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BorderTokenElement.swift; sourceTree = ""; }; 07CF42822CA45DA9000BD03E /* BorderTokenPage.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BorderTokenPage.swift; sourceTree = ""; }; 07CF42882CA55BC8000BD03E /* ThemeSelection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThemeSelection.swift; sourceTree = ""; }; + 07F0FA892CC935FF000F166F /* NameSpace+PaddingInlineWithIcon.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NameSpace+PaddingInlineWithIcon.swift"; sourceTree = ""; }; + 07F0FA8B2CC9408C000F166F /* NameSpace+PaddingInlineWithArrow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NameSpace+PaddingInlineWithArrow.swift"; sourceTree = ""; }; + 07F7533A2CC785620007450D /* ShowcaseSectionHeaderStyle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShowcaseSectionHeaderStyle.swift; sourceTree = ""; }; + 07F75A362CC644C80004F1AD /* NamedSpace+Scaled.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NamedSpace+Scaled.swift"; sourceTree = ""; }; + 07F75A382CC6462D0004F1AD /* NamedSpace+Fixed.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NamedSpace+Fixed.swift"; sourceTree = ""; }; + 07F75A3A2CC651EB0004F1AD /* NameSpace+PaddingInline.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NameSpace+PaddingInline.swift"; sourceTree = ""; }; + 07F75A3C2CC653BD0004F1AD /* NameSpace+PaddingInset.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NameSpace+PaddingInset.swift"; sourceTree = ""; }; + 07F75A3E2CC653CD0004F1AD /* NameSpace+GapInline.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NameSpace+GapInline.swift"; sourceTree = ""; }; + 07F75A402CC653EB0004F1AD /* NameSpace+GapStack.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NameSpace+GapStack.swift"; sourceTree = ""; }; + 07F75A422CC654050004F1AD /* NameSpace+PaddingStack.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NameSpace+PaddingStack.swift"; sourceTree = ""; }; 07FDCD912C296A500009AA13 /* OUDS Showcase.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "OUDS Showcase.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 07FDCDA52C296B4B0009AA13 /* .gitattributes */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = .gitattributes; path = ../.gitattributes; sourceTree = ""; }; 07FDCDA72C296B7A0009AA13 /* README.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; name = README.md; path = ../README.md; sourceTree = ""; }; @@ -217,6 +237,7 @@ children = ( 0735430F2CA15440001187EA /* Cards */, 51BD760F2C466FCF0033365D /* ShowcaseElementsPage.swift */, + 07F7533A2CC785620007450D /* ShowcaseSectionHeaderStyle.swift */, 51E3FF0A2CAFD9AE00F1BC59 /* ShowcaseElementPage.swift */, 073543152CA17275001187EA /* ShowcaseElement.swift */, 077CCE5B2CB431C50059CC28 /* ShowcaseVariantElement.swift */, @@ -261,13 +282,13 @@ path = ShowcaseTests; sourceTree = ""; }; - 075114DA2CB7D28D00B8B759 /* Sizing */ = { + 075114DA2CB7D28D00B8B759 /* Size */ = { isa = PBXGroup; children = ( - 075114D82CB7D28D00B8B759 /* SizingTokenElement.swift */, - 075114D92CB7D28D00B8B759 /* SizingTokenPage.swift */, + 075114D82CB7D28D00B8B759 /* SizeTokenElement.swift */, + 075114D92CB7D28D00B8B759 /* SizeTokenPage.swift */, ); - path = Sizing; + path = Size; sourceTree = ""; }; 075114DD2CB7FD7E00B8B759 /* Color */ = { @@ -306,20 +327,21 @@ name = "Recovered References"; sourceTree = ""; }; - 077CCE532CB426090059CC28 /* Spacing */ = { + 077CCE532CB426090059CC28 /* Space */ = { isa = PBXGroup; children = ( - 077CCE512CB426090059CC28 /* SpacingTokenElement.swift */, - 077CCE522CB426090059CC28 /* SpacingTokenPage.swift */, + 07F75A352CC644940004F1AD /* NamedSpace */, + 077CCE512CB426090059CC28 /* SpaceTokenElement.swift */, + 077CCE522CB426090059CC28 /* SpaceTokenPage.swift */, ); - path = Spacing; + path = Space; sourceTree = ""; }; 077CCE562CB426090059CC28 /* Dimension */ = { isa = PBXGroup; children = ( - 077CCE532CB426090059CC28 /* Spacing */, - 075114DA2CB7D28D00B8B759 /* Sizing */, + 077CCE532CB426090059CC28 /* Space */, + 075114DA2CB7D28D00B8B759 /* Size */, 077CCE542CB426090059CC28 /* DimensionTokenElement.swift */, ); path = Dimension; @@ -360,6 +382,22 @@ path = ThemeSelection; sourceTree = ""; }; + 07F75A352CC644940004F1AD /* NamedSpace */ = { + isa = PBXGroup; + children = ( + 07F75A362CC644C80004F1AD /* NamedSpace+Scaled.swift */, + 07F0FA892CC935FF000F166F /* NameSpace+PaddingInlineWithIcon.swift */, + 07F75A382CC6462D0004F1AD /* NamedSpace+Fixed.swift */, + 07F75A3A2CC651EB0004F1AD /* NameSpace+PaddingInline.swift */, + 07F75A3C2CC653BD0004F1AD /* NameSpace+PaddingInset.swift */, + 07F75A422CC654050004F1AD /* NameSpace+PaddingStack.swift */, + 07F75A3E2CC653CD0004F1AD /* NameSpace+GapInline.swift */, + 07F75A402CC653EB0004F1AD /* NameSpace+GapStack.swift */, + 07F0FA8B2CC9408C000F166F /* NameSpace+PaddingInlineWithArrow.swift */, + ); + path = NamedSpace; + sourceTree = ""; + }; 07FDCD882C296A500009AA13 = { isa = PBXGroup; children = ( @@ -718,48 +756,58 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 075114DC2CB7D28D00B8B759 /* SizingTokenPage.swift in Sources */, + 07F75A3D2CC653BD0004F1AD /* NameSpace+PaddingInset.swift in Sources */, + 075114DC2CB7D28D00B8B759 /* SizeTokenPage.swift in Sources */, 077CCE592CB426090059CC28 /* DimensionTokenElement.swift in Sources */, 07CF42852CA45DA9000BD03E /* BorderTokenPage.swift in Sources */, 0765B4982CC15A4000E69359 /* NamedColor+Always.swift in Sources */, + 07F75A392CC6462D0004F1AD /* NamedSpace+Fixed.swift in Sources */, 07CF42842CA45DA9000BD03E /* BorderTokenElement.swift in Sources */, 07CF42802CA41325000BD03E /* OpacityTokenPage.swift in Sources */, 075114E02CB7FDC200B8B759 /* ColorTokenElement.swift in Sources */, + 07F75A3B2CC651EB0004F1AD /* NameSpace+PaddingInline.swift in Sources */, 0747947A2CAE882A0033C2D8 /* EmptyState.swift in Sources */, 51BD762B2C466FCF0033365D /* MainView.swift in Sources */, 07CF42742CA3EC58000BD03E /* CardIllustration.swift in Sources */, + 07F0FA8A2CC935FF000F166F /* NameSpace+PaddingInlineWithIcon.swift in Sources */, + 07F0FA8C2CC9408C000F166F /* NameSpace+PaddingInlineWithArrow.swift in Sources */, 07CF42782CA3F4BE000BD03E /* ElevationTokenElement.swift in Sources */, 0765B4A42CC15C3E00E69359 /* NamedColor+Chart.swift in Sources */, 07CF42792CA3F4BE000BD03E /* ElevationTokenPage.swift in Sources */, 075114E12CB7FDC200B8B759 /* ColorTokenPage.swift in Sources */, 0735432A2CA192F9001187EA /* TokenElement.swift in Sources */, + 07F7533B2CC785620007450D /* ShowcaseSectionHeaderStyle.swift in Sources */, 073543182CA172CA001187EA /* TypographyTokenElement.swift in Sources */, 077CCE5C2CB431C50059CC28 /* ShowcaseVariantElement.swift in Sources */, - 077CCE582CB426090059CC28 /* SpacingTokenPage.swift in Sources */, + 077CCE582CB426090059CC28 /* SpaceTokenPage.swift in Sources */, + 07F75A3F2CC653CD0004F1AD /* NameSpace+GapInline.swift in Sources */, 51BD76292C466FCF0033365D /* WebView.swift in Sources */, 51BD76232C466FCF0033365D /* ShowcaseElementsPage.swift in Sources */, 0765B49C2CC15B2E00E69359 /* NamedColor+Elevation.swift in Sources */, 51E3FF0B2CAFD9AE00F1BC59 /* ShowcaseElementPage.swift in Sources */, 0765B4942CC1597C00E69359 /* NamedColor+Background.swift in Sources */, - 075114DB2CB7D28D00B8B759 /* SizingTokenElement.swift in Sources */, + 075114DB2CB7D28D00B8B759 /* SizeTokenElement.swift in Sources */, 073543162CA17275001187EA /* ShowcaseElement.swift in Sources */, 0765B4A02CC15BBC00E69359 /* NamedColor+Content.swift in Sources */, 0765B49A2CC15ACE00E69359 /* NamedColor+Border.swift in Sources */, 51087A7B2C46DF9F00160CCF /* Bundle+extension.swift in Sources */, 0765B4962CC159F600E69359 /* NamedColor+Action.swift in Sources */, 0765B4A22CC15C0500E69359 /* NamedColor+OnContent.swift in Sources */, - 077CCE572CB426090059CC28 /* SpacingTokenElement.swift in Sources */, + 077CCE572CB426090059CC28 /* SpaceTokenElement.swift in Sources */, 0735431B2CA18C48001187EA /* TypographyTokenPage.swift in Sources */, + 07F75A412CC653EB0004F1AD /* NameSpace+GapStack.swift in Sources */, 51BD76222C466FCF0033365D /* ComponentsPage.swift in Sources */, 07CF42892CA55BC8000BD03E /* ThemeSelection.swift in Sources */, 075114E82CB81F0E00B8B759 /* ShowcaseTokenIllustration.swift in Sources */, 07CF427F2CA41325000BD03E /* OpacityTokenElement.swift in Sources */, 07CF426B2CA30728000BD03E /* TokensPage.swift in Sources */, + 07F75A372CC644C80004F1AD /* NamedSpace+Scaled.swift in Sources */, 0765B4A62CC15C9D00E69359 /* NamedColor.swift in Sources */, 073543112CA154DE001187EA /* Card.swift in Sources */, 51BD76212C466FCF0033365D /* AboutPage.swift in Sources */, 51BD762A2C466FCF0033365D /* Showcase.swift in Sources */, 0765B49E2CC15B7E00E69359 /* NamedColor+Decorative.swift in Sources */, + 07F75A432CC654050004F1AD /* NameSpace+PaddingStack.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/Showcase/Showcase.xcworkspace/xcshareddata/swiftpm/Package.resolved b/Showcase/Showcase.xcworkspace/xcshareddata/swiftpm/Package.resolved new file mode 100644 index 000000000..dfb105775 --- /dev/null +++ b/Showcase/Showcase.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -0,0 +1,24 @@ +{ + "originHash" : "c48bd6ce1dff61368be114be7113f793bf250d75bd26b7706f31d9a229918712", + "pins" : [ + { + "identity" : "swift-snapshot-testing", + "kind" : "remoteSourceControl", + "location" : "https://github.com/pointfreeco/swift-snapshot-testing.git", + "state" : { + "revision" : "7b0bbbae90c41f848f90ac7b4df6c4f50068256d", + "version" : "1.17.5" + } + }, + { + "identity" : "swift-syntax", + "kind" : "remoteSourceControl", + "location" : "https://github.com/swiftlang/swift-syntax", + "state" : { + "revision" : "515f79b522918f83483068d99c68daeb5116342d", + "version" : "600.0.0-prerelease-2024-09-04" + } + } + ], + "version" : 3 +} diff --git a/Showcase/Showcase/MainView.swift b/Showcase/Showcase/MainView.swift index e9dbd1e2f..7832109d3 100644 --- a/Showcase/Showcase/MainView.swift +++ b/Showcase/Showcase/MainView.swift @@ -24,15 +24,15 @@ struct MainView: View { TabView { TokensPage() .tabItem { - Label("app_bottomBar_tokens", image: "ic_token") + Label("app_bottomBar_tokens_label", image: "ic_token") } ComponentsPage() .tabItem { - Label("app_bottomBar_components", image: "ic_component_atom") + Label("app_bottomBar_components_label", image: "ic_component_atom") } AboutPage() .tabItem { - Label("app_bottomBar_about", image: "ic_info") + Label("app_bottomBar_about_label", image: "ic_info") } } .accentColor(theme.colorContentBrandPrimary.color(for: colorScheme)) diff --git a/Showcase/Showcase/Pages/About/AboutPage.swift b/Showcase/Showcase/Pages/About/AboutPage.swift index 2d9706138..45d7e54ea 100644 --- a/Showcase/Showcase/Pages/About/AboutPage.swift +++ b/Showcase/Showcase/Pages/About/AboutPage.swift @@ -41,16 +41,16 @@ struct AboutPage: View { List { NavigationLink { WebView(from: privacyPolicyUrl) - .navigationTitle("app_about_label_privacyPolicy") + .navigationTitle("app_about_privacyPolicy_label") } label: { - Text("app_about_label_privacyPolicy") + Text("app_about_privacyPolicy_label") } NavigationLink { WebView(from: legalInformationUrl) - .navigationTitle("app_about_label_legalInformation") + .navigationTitle("app_about_legalInformation_label") } label: { - Text("app_about_label_legalInformation") + Text("app_about_legalInformation_label") } // TODO: Only for debug purposes, should be displayed in another way @@ -61,7 +61,7 @@ struct AboutPage: View { Text("Build details (GitHub): \(buildDetails)") } } - .navigationTitle("app_bottomBar_about") + .navigationTitle("app_bottomBar_about_label") } } } diff --git a/Showcase/Showcase/Pages/Components/ComponentsPage.swift b/Showcase/Showcase/Pages/Components/ComponentsPage.swift index cbeab94aa..aa10b49d2 100644 --- a/Showcase/Showcase/Pages/Components/ComponentsPage.swift +++ b/Showcase/Showcase/Pages/Components/ComponentsPage.swift @@ -23,6 +23,7 @@ struct ComponentsPage: View { var body: some View { NavigationView { EmptyState() + .navigationTitle("app_bottomBar_component_label") } } } diff --git a/Showcase/Showcase/Pages/Components/EmptyState.swift b/Showcase/Showcase/Pages/Components/EmptyState.swift index 002c05d58..f0f6fc863 100644 --- a/Showcase/Showcase/Pages/Components/EmptyState.swift +++ b/Showcase/Showcase/Pages/Components/EmptyState.swift @@ -26,9 +26,9 @@ struct EmptyState: View { .frame(width: 160, height: 160, alignment: .center) VStack(alignment: .center, spacing: theme.spaceFixedShorter) { - Text("app_component_empty_content_text") + Text("app_component_emptyContent_text") .typeHeadingMedium(theme) - Text("app_component_empty_content_description_text") + Text("app_component_emptyContent_description_text") .typeBodyDefaultSmall(theme) } .padding(.vertical, theme.spaceFixedMedium) diff --git a/Showcase/Showcase/Pages/ThemeSelection/ThemeSelection.swift b/Showcase/Showcase/Pages/ThemeSelection/ThemeSelection.swift index 93c66a3f3..9197cb8db 100644 --- a/Showcase/Showcase/Pages/ThemeSelection/ThemeSelection.swift +++ b/Showcase/Showcase/Pages/ThemeSelection/ThemeSelection.swift @@ -116,6 +116,7 @@ struct ThemeSelectionButton: View { } } .pickerStyle(.automatic) + .accessibilityLabel("app_topBar_theme_button_a11y") } label: { Image(systemName: "paintpalette").accessibilityHidden(true) } diff --git a/Showcase/Showcase/Pages/Tokens/Border/BorderTokenPage.swift b/Showcase/Showcase/Pages/Tokens/Border/BorderTokenPage.swift index 1207b7a47..8efe925cd 100644 --- a/Showcase/Showcase/Pages/Tokens/Border/BorderTokenPage.swift +++ b/Showcase/Showcase/Pages/Tokens/Border/BorderTokenPage.swift @@ -32,7 +32,7 @@ struct BorderTokenPage: View { } } } header: { - Text("Width") + Text("app_tokens_border_width_label") .typeHeadingLarge(theme) .foregroundStyle(theme.colorContentDefault.color(for: colorScheme)) } @@ -44,7 +44,7 @@ struct BorderTokenPage: View { } } } header: { - Text("Radius") + Text("app_tokens_border_radius_label") .typeHeadingLarge(theme) .foregroundStyle(theme.colorContentDefault.color(for: colorScheme)) } @@ -56,7 +56,7 @@ struct BorderTokenPage: View { } } } header: { - Text("Style") + Text("app_tokens_border_style_label") .typeHeadingLarge(theme) .foregroundStyle(theme.colorContentDefault.color(for: colorScheme)) } diff --git a/Showcase/Showcase/Pages/Tokens/Color/ColorTokenPage.swift b/Showcase/Showcase/Pages/Tokens/Color/ColorTokenPage.swift index 0ea68508c..dd8ae5ee5 100644 --- a/Showcase/Showcase/Pages/Tokens/Color/ColorTokenPage.swift +++ b/Showcase/Showcase/Pages/Tokens/Color/ColorTokenPage.swift @@ -41,62 +41,78 @@ struct ColorTokenPage: View { // MARK: Private helpers private func header(_ text: String) -> some View { - Text(text) - .typeHeadingMedium(theme) - .frame(maxWidth: .infinity, alignment: .leading) + Text(text).showcaseSectionHeaderStyle() } private func illustrationForBackground() -> some View { - ForEach(NamedColor.Background.allCases, id: \.rawValue) { namedColorToken in - illustration(for: namedColorToken.token(from: theme), name: namedColorToken.rawValue) + VStack(alignment: .leading, spacing: theme.spaceFixedNone) { + ForEach(NamedColor.Background.allCases, id: \.rawValue) { namedColorToken in + illustration(for: namedColorToken.token(from: theme), name: namedColorToken.rawValue) + } } } private func illustrationForAction() -> some View { - ForEach(NamedColor.Action.allCases, id: \.rawValue) { namedColorToken in - illustration(for: namedColorToken.token(from: theme), name: namedColorToken.rawValue) + VStack(alignment: .leading, spacing: theme.spaceFixedNone) { + ForEach(NamedColor.Action.allCases, id: \.rawValue) { namedColorToken in + illustration(for: namedColorToken.token(from: theme), name: namedColorToken.rawValue) + } } } private func illustrationForAlways() -> some View { - ForEach(NamedColor.Always.allCases, id: \.rawValue) { namedColorToken in - illustration(for: namedColorToken.token(from: theme), name: namedColorToken.rawValue) + VStack(alignment: .leading, spacing: theme.spaceFixedNone) { + ForEach(NamedColor.Always.allCases, id: \.rawValue) { namedColorToken in + illustration(for: namedColorToken.token(from: theme), name: namedColorToken.rawValue) + } } } private func illustrationForChart() -> some View { - ForEach(NamedColor.Chart.allCases, id: \.rawValue) { namedColorToken in - illustration(for: namedColorToken.token(from: theme), name: namedColorToken.rawValue) + VStack(alignment: .leading, spacing: theme.spaceFixedNone) { + ForEach(NamedColor.Chart.allCases, id: \.rawValue) { namedColorToken in + illustration(for: namedColorToken.token(from: theme), name: namedColorToken.rawValue) + } } } private func illustrationForBorder() -> some View { - ForEach(NamedColor.Border.allCases, id: \.rawValue) { namedColorToken in - illustration(for: namedColorToken.token(from: theme), name: namedColorToken.rawValue) + VStack(alignment: .leading, spacing: theme.spaceFixedNone) { + ForEach(NamedColor.Border.allCases, id: \.rawValue) { namedColorToken in + illustration(for: namedColorToken.token(from: theme), name: namedColorToken.rawValue) + } } } private func illustrationForContent() -> some View { - ForEach(NamedColor.Content.allCases, id: \.rawValue) { namedColorToken in - illustration(for: namedColorToken.token(from: theme), name: namedColorToken.rawValue) + VStack(alignment: .leading, spacing: theme.spaceFixedNone) { + ForEach(NamedColor.Content.allCases, id: \.rawValue) { namedColorToken in + illustration(for: namedColorToken.token(from: theme), name: namedColorToken.rawValue) + } } } private func illustrationForContentOnBackground() -> some View { - ForEach(NamedColor.ContentOnBg.allCases, id: \.rawValue) { namedColorToken in - illustration(for: namedColorToken.token(from: theme), name: namedColorToken.rawValue) + VStack(alignment: .leading, spacing: theme.spaceFixedNone) { + ForEach(NamedColor.ContentOnBg.allCases, id: \.rawValue) { namedColorToken in + illustration(for: namedColorToken.token(from: theme), name: namedColorToken.rawValue) + } } } private func illustrationForDecorative() -> some View { - ForEach(NamedColor.Decorative.allCases, id: \.rawValue) { namedColorToken in - illustration(for: namedColorToken.token(from: theme), name: namedColorToken.rawValue) + VStack(alignment: .leading, spacing: theme.spaceFixedNone) { + ForEach(NamedColor.Decorative.allCases, id: \.rawValue) { namedColorToken in + illustration(for: namedColorToken.token(from: theme), name: namedColorToken.rawValue) + } } } private func illustrationForeElevation() -> some View { - ForEach(NamedColor.Elevation.allCases, id: \.rawValue) { namedColorToken in - illustration(for: namedColorToken.token(from: theme), name: namedColorToken.rawValue) + VStack(alignment: .leading, spacing: theme.spaceFixedNone) { + ForEach(NamedColor.Elevation.allCases, id: \.rawValue) { namedColorToken in + illustration(for: namedColorToken.token(from: theme), name: namedColorToken.rawValue) + } } } diff --git a/Showcase/Showcase/Pages/Tokens/Dimension/DimensionTokenElement.swift b/Showcase/Showcase/Pages/Tokens/Dimension/DimensionTokenElement.swift index 1b03ed0bf..3444efeed 100644 --- a/Showcase/Showcase/Pages/Tokens/Dimension/DimensionTokenElement.swift +++ b/Showcase/Showcase/Pages/Tokens/Dimension/DimensionTokenElement.swift @@ -20,8 +20,8 @@ struct DimensionTokenElement: TokenElement { let pageDescription: AnyView let variants: [TokenElement] = [ - SizingTokenElement(), - SpacingTokenElement(), + SizeTokenElement(), + SpaceTokenElement(), ] init() { diff --git a/Showcase/Showcase/Pages/Tokens/Dimension/Sizing/SizingTokenElement.swift b/Showcase/Showcase/Pages/Tokens/Dimension/Size/SizeTokenElement.swift similarity index 74% rename from Showcase/Showcase/Pages/Tokens/Dimension/Sizing/SizingTokenElement.swift rename to Showcase/Showcase/Pages/Tokens/Dimension/Size/SizeTokenElement.swift index 67e0560e0..d8d6af26f 100644 --- a/Showcase/Showcase/Pages/Tokens/Dimension/Sizing/SizingTokenElement.swift +++ b/Showcase/Showcase/Pages/Tokens/Dimension/Size/SizeTokenElement.swift @@ -13,16 +13,16 @@ import SwiftUI -struct SizingTokenElement: TokenElement { +struct SizeTokenElement: TokenElement { let name: String let imageName: String let description: String let pageDescription: AnyView init() { - name = "app_tokens_dimension_sizing_label" + name = "app_tokens_dimension_size_label" imageName = "ic_dimension" - description = "app_tokens_dimension_sizing_description_text" - pageDescription = AnyView(SizingTokenPage()) + description = "app_tokens_dimension_size_description_text" + pageDescription = AnyView(SizeTokenPage()) } } diff --git a/Showcase/Showcase/Pages/Tokens/Dimension/Sizing/SizingTokenPage.swift b/Showcase/Showcase/Pages/Tokens/Dimension/Size/SizeTokenPage.swift similarity index 98% rename from Showcase/Showcase/Pages/Tokens/Dimension/Sizing/SizingTokenPage.swift rename to Showcase/Showcase/Pages/Tokens/Dimension/Size/SizeTokenPage.swift index fcfb043da..8d70f033c 100644 --- a/Showcase/Showcase/Pages/Tokens/Dimension/Sizing/SizingTokenPage.swift +++ b/Showcase/Showcase/Pages/Tokens/Dimension/Size/SizeTokenPage.swift @@ -15,7 +15,7 @@ import OUDS import OUDSTokensSemantic import SwiftUI -struct SizingTokenPage: View { +struct SizeTokenPage: View { @Environment(\.theme) private var theme @Environment(\.horizontalSizeClass) private var horizontalSizeClass diff --git a/Showcase/Showcase/Pages/Tokens/Dimension/Space/NamedSpace/NameSpace+GapInline.swift b/Showcase/Showcase/Pages/Tokens/Dimension/Space/NamedSpace/NameSpace+GapInline.swift new file mode 100644 index 000000000..c5dabb584 --- /dev/null +++ b/Showcase/Showcase/Pages/Tokens/Dimension/Space/NamedSpace/NameSpace+GapInline.swift @@ -0,0 +1,44 @@ +// +// Software Name: OUDS iOS +// SPDX-FileCopyrightText: Copyright (c) Orange SA +// SPDX-License-Identifier: MIT +// +// This software is distributed under the MIT license, +// the text of which is available at https://opensource.org/license/MIT/ +// or see the "LICENSE" file for more details. +// +// Authors: See CONTRIBUTORS.txt +// Software description: A SwiftUI components library with code examples for Orange Unified Design System +// + +import OUDS +import OUDSTokensSemantic + +extension NamedSpace { + + enum GapInline: String, CaseIterable { + case spaceColumnGapNone + case spaceColumnGapShorter + case spaceColumnGapShort + case spaceColumnGapMedium + case spaceColumnGapTall + case spaceColumnGapTaller + + func token(from theme: OUDSTheme) -> SpacingSemanticToken { + switch self { + case .spaceColumnGapNone: + return theme.spaceColumnGapNone + case .spaceColumnGapShorter: + return theme.spaceColumnGapShorter + case .spaceColumnGapShort: + return theme.spaceColumnGapShort + case .spaceColumnGapMedium: + return theme.spaceColumnGapMedium + case .spaceColumnGapTall: + return theme.spaceColumnGapTall + case .spaceColumnGapTaller: + return theme.spaceColumnGapTaller + } + } + } +} diff --git a/Showcase/Showcase/Pages/Tokens/Dimension/Space/NamedSpace/NameSpace+GapStack.swift b/Showcase/Showcase/Pages/Tokens/Dimension/Space/NamedSpace/NameSpace+GapStack.swift new file mode 100644 index 000000000..36e5022e8 --- /dev/null +++ b/Showcase/Showcase/Pages/Tokens/Dimension/Space/NamedSpace/NameSpace+GapStack.swift @@ -0,0 +1,44 @@ +// +// Software Name: OUDS iOS +// SPDX-FileCopyrightText: Copyright (c) Orange SA +// SPDX-License-Identifier: MIT +// +// This software is distributed under the MIT license, +// the text of which is available at https://opensource.org/license/MIT/ +// or see the "LICENSE" file for more details. +// +// Authors: See CONTRIBUTORS.txt +// Software description: A SwiftUI components library with code examples for Orange Unified Design System +// + +import OUDS +import OUDSTokensSemantic + +extension NamedSpace { + + enum GapStack: String, CaseIterable { + case spaceRowGapNone + case spaceRowGapShortest + case spaceRowGapShorter + case spaceRowGapShort + case spaceRowGapMedium + case spaceRowGapTall + + func token(from theme: OUDSTheme) -> SpacingSemanticToken { + switch self { + case .spaceRowGapNone: + return theme.spaceRowGapNone + case .spaceRowGapShortest: + return theme.spaceRowGapShortest + case .spaceRowGapShorter: + return theme.spaceRowGapShorter + case .spaceRowGapShort: + return theme.spaceRowGapShort + case .spaceRowGapMedium: + return theme.spaceRowGapMedium + case .spaceRowGapTall: + return theme.spaceRowGapTall + } + } + } +} diff --git a/Showcase/Showcase/Pages/Tokens/Dimension/Space/NamedSpace/NameSpace+PaddingInline.swift b/Showcase/Showcase/Pages/Tokens/Dimension/Space/NamedSpace/NameSpace+PaddingInline.swift new file mode 100644 index 000000000..a80a23a0c --- /dev/null +++ b/Showcase/Showcase/Pages/Tokens/Dimension/Space/NamedSpace/NameSpace+PaddingInline.swift @@ -0,0 +1,47 @@ +// +// Software Name: OUDS iOS +// SPDX-FileCopyrightText: Copyright (c) Orange SA +// SPDX-License-Identifier: MIT +// +// This software is distributed under the MIT license, +// the text of which is available at https://opensource.org/license/MIT/ +// or see the "LICENSE" file for more details. +// +// Authors: See CONTRIBUTORS.txt +// Software description: A SwiftUI components library with code examples for Orange Unified Design System +// + +import OUDS +import OUDSTokensSemantic + +extension NamedSpace { + + enum PaddingInline: String, CaseIterable { + case spacePaddingInlineNone + case spacePaddingInlineShorter + case spacePaddingInlineShort + case spacePaddingInlineMedium + case spacePaddingInlineTall + case spacePaddingInlineTaller + case spacePaddingInlineTallest + + func token(from theme: OUDSTheme) -> SpacingSemanticToken { + switch self { + case .spacePaddingInlineNone: + return theme.spacePaddingInlineNone + case .spacePaddingInlineShorter: + return theme.spacePaddingInlineShorter + case .spacePaddingInlineShort: + return theme.spacePaddingInlineShort + case .spacePaddingInlineMedium: + return theme.spacePaddingInlineMedium + case .spacePaddingInlineTall: + return theme.spacePaddingInlineTall + case .spacePaddingInlineTaller: + return theme.spacePaddingInlineTaller + case .spacePaddingInlineTallest: + return theme.spacePaddingInlineTallest + } + } + } +} diff --git a/Showcase/Showcase/Pages/Tokens/Dimension/Space/NamedSpace/NameSpace+PaddingInlineWithArrow.swift b/Showcase/Showcase/Pages/Tokens/Dimension/Space/NamedSpace/NameSpace+PaddingInlineWithArrow.swift new file mode 100644 index 000000000..b719542ee --- /dev/null +++ b/Showcase/Showcase/Pages/Tokens/Dimension/Space/NamedSpace/NameSpace+PaddingInlineWithArrow.swift @@ -0,0 +1,50 @@ +// +// Software Name: OUDS iOS +// SPDX-FileCopyrightText: Copyright (c) Orange SA +// SPDX-License-Identifier: MIT +// +// This software is distributed under the MIT license, +// the text of which is available at https://opensource.org/license/MIT/ +// or see the "LICENSE" file for more details. +// +// Authors: See CONTRIBUTORS.txt +// Software description: A SwiftUI components library with code examples for Orange Unified Design System +// + +import OUDS +import OUDSTokensSemantic + +extension NamedSpace { + + enum PaddingInlineWithArrow: String, CaseIterable { + case spacePaddingInlineWithArrowNone + case spacePaddingInlineWithArrowShortest + case spacePaddingInlineWithArrowShorter + case spacePaddingInlineWithArrowShort + case spacePaddingInlineWithArrowMedium + case spacePaddingInlineWithArrowTall + case spacePaddingInlineWithArrowTaller + case spacePaddingInlineWithArrowTallest + + func token(from theme: OUDSTheme) -> SpacingSemanticToken { + switch self { + case .spacePaddingInlineWithArrowNone: + return theme.spacePaddingInlineWithArrowNone + case .spacePaddingInlineWithArrowShortest: + return theme.spacePaddingInlineWithArrowShortest + case .spacePaddingInlineWithArrowShorter: + return theme.spacePaddingInlineWithArrowShorter + case .spacePaddingInlineWithArrowShort: + return theme.spacePaddingInlineWithArrowShort + case .spacePaddingInlineWithArrowMedium: + return theme.spacePaddingInlineWithArrowMedium + case .spacePaddingInlineWithArrowTall: + return theme.spacePaddingInlineWithArrowTall + case .spacePaddingInlineWithArrowTaller: + return theme.spacePaddingInlineWithArrowTaller + case .spacePaddingInlineWithArrowTallest: + return theme.spacePaddingInlineWithArrowTallest + } + } + } +} diff --git a/Showcase/Showcase/Pages/Tokens/Dimension/Space/NamedSpace/NameSpace+PaddingInlineWithIcon.swift b/Showcase/Showcase/Pages/Tokens/Dimension/Space/NamedSpace/NameSpace+PaddingInlineWithIcon.swift new file mode 100644 index 000000000..d71533434 --- /dev/null +++ b/Showcase/Showcase/Pages/Tokens/Dimension/Space/NamedSpace/NameSpace+PaddingInlineWithIcon.swift @@ -0,0 +1,50 @@ +// +// Software Name: OUDS iOS +// SPDX-FileCopyrightText: Copyright (c) Orange SA +// SPDX-License-Identifier: MIT +// +// This software is distributed under the MIT license, +// the text of which is available at https://opensource.org/license/MIT/ +// or see the "LICENSE" file for more details. +// +// Authors: See CONTRIBUTORS.txt +// Software description: A SwiftUI components library with code examples for Orange Unified Design System +// + +import OUDS +import OUDSTokensSemantic + +extension NamedSpace { + + enum PaddingInlineWithIcon: String, CaseIterable { + case spacePaddingInlineWithIconNone + case spacePaddingInlineWithIconShortest + case spacePaddingInlineWithIconShorter + case spacePaddingInlineWithIconShort + case spacePaddingInlineWithIconMedium + case spacePaddingInlineWithIconTall + case spacePaddingInlineWithIconTaller + case spacePaddingInlineWithIconTallest + + func token(from theme: OUDSTheme) -> SpacingSemanticToken { + switch self { + case .spacePaddingInlineWithIconNone: + return theme.spacePaddingInlineWithIconNone + case .spacePaddingInlineWithIconShortest: + return theme.spacePaddingInlineWithIconShortest + case .spacePaddingInlineWithIconShorter: + return theme.spacePaddingInlineWithIconShorter + case .spacePaddingInlineWithIconShort: + return theme.spacePaddingInlineWithIconShort + case .spacePaddingInlineWithIconMedium: + return theme.spacePaddingInlineWithIconMedium + case .spacePaddingInlineWithIconTall: + return theme.spacePaddingInlineWithIconTall + case .spacePaddingInlineWithIconTaller: + return theme.spacePaddingInlineWithIconTaller + case .spacePaddingInlineWithIconTallest: + return theme.spacePaddingInlineWithIconTallest + } + } + } +} diff --git a/Showcase/Showcase/Pages/Tokens/Dimension/Space/NamedSpace/NameSpace+PaddingInset.swift b/Showcase/Showcase/Pages/Tokens/Dimension/Space/NamedSpace/NameSpace+PaddingInset.swift new file mode 100644 index 000000000..38a5d6fd7 --- /dev/null +++ b/Showcase/Showcase/Pages/Tokens/Dimension/Space/NamedSpace/NameSpace+PaddingInset.swift @@ -0,0 +1,56 @@ +// +// Software Name: OUDS iOS +// SPDX-FileCopyrightText: Copyright (c) Orange SA +// SPDX-License-Identifier: MIT +// +// This software is distributed under the MIT license, +// the text of which is available at https://opensource.org/license/MIT/ +// or see the "LICENSE" file for more details. +// +// Authors: See CONTRIBUTORS.txt +// Software description: A SwiftUI components library with code examples for Orange Unified Design System +// + +import OUDS +import OUDSTokensSemantic + +extension NamedSpace { + + enum PaddingInset: String, CaseIterable { + case spaceInsetNone + case spaceInsetSmash + case spaceInsetShortest + case spaceInsetShorter + case spaceInsetShort + case spaceInsetMedium + case spaceInsetTall + case spaceInsetTaller + case spaceInsetTallest + case spaceInsetSpacious + + func token(from theme: OUDSTheme) -> SpacingSemanticToken { + switch self { + case .spaceInsetNone: + return theme.spaceInsetNone + case .spaceInsetSmash: + return theme.spaceInsetSmash + case .spaceInsetShortest: + return theme.spaceInsetShortest + case .spaceInsetShorter: + return theme.spaceInsetShorter + case .spaceInsetShort: + return theme.spaceInsetShort + case .spaceInsetMedium: + return theme.spaceInsetMedium + case .spaceInsetTall: + return theme.spaceInsetTall + case .spaceInsetTaller: + return theme.spaceInsetTaller + case .spaceInsetTallest: + return theme.spaceInsetTallest + case .spaceInsetSpacious: + return theme.spaceInsetSpacious + } + } + } +} diff --git a/Showcase/Showcase/Pages/Tokens/Dimension/Space/NamedSpace/NameSpace+PaddingStack.swift b/Showcase/Showcase/Pages/Tokens/Dimension/Space/NamedSpace/NameSpace+PaddingStack.swift new file mode 100644 index 000000000..d2adcc57a --- /dev/null +++ b/Showcase/Showcase/Pages/Tokens/Dimension/Space/NamedSpace/NameSpace+PaddingStack.swift @@ -0,0 +1,47 @@ +// +// Software Name: OUDS iOS +// SPDX-FileCopyrightText: Copyright (c) Orange SA +// SPDX-License-Identifier: MIT +// +// This software is distributed under the MIT license, +// the text of which is available at https://opensource.org/license/MIT/ +// or see the "LICENSE" file for more details. +// +// Authors: See CONTRIBUTORS.txt +// Software description: A SwiftUI components library with code examples for Orange Unified Design System +// + +import OUDS +import OUDSTokensSemantic + +extension NamedSpace { + + enum PaddingStack: String, CaseIterable { + case spacePaddingBlockNone + case spacePaddingBlockShorter + case spacePaddingBlockShort + case spacePaddingBlockMedium + case spacePaddingBlockTall + case spacePaddingBlockTaller + case spacePaddingBlockTallest + + func token(from theme: OUDSTheme) -> SpacingSemanticToken { + switch self { + case .spacePaddingBlockNone: + return theme.spacePaddingBlockNone + case .spacePaddingBlockShorter: + return theme.spacePaddingBlockShorter + case .spacePaddingBlockShort: + return theme.spacePaddingBlockShort + case .spacePaddingBlockMedium: + return theme.spacePaddingBlockMedium + case .spacePaddingBlockTall: + return theme.spacePaddingBlockTall + case .spacePaddingBlockTaller: + return theme.spacePaddingBlockTaller + case .spacePaddingBlockTallest: + return theme.spacePaddingBlockTallest + } + } + } +} diff --git a/Showcase/Showcase/Pages/Tokens/Dimension/Space/NamedSpace/NamedSpace+Fixed.swift b/Showcase/Showcase/Pages/Tokens/Dimension/Space/NamedSpace/NamedSpace+Fixed.swift new file mode 100644 index 000000000..88872784b --- /dev/null +++ b/Showcase/Showcase/Pages/Tokens/Dimension/Space/NamedSpace/NamedSpace+Fixed.swift @@ -0,0 +1,62 @@ +// +// Software Name: OUDS iOS +// SPDX-FileCopyrightText: Copyright (c) Orange SA +// SPDX-License-Identifier: MIT +// +// This software is distributed under the MIT license, +// the text of which is available at https://opensource.org/license/MIT/ +// or see the "LICENSE" file for more details. +// +// Authors: See CONTRIBUTORS.txt +// Software description: A SwiftUI components library with code examples for Orange Unified Design System +// + +import OUDS +import OUDSTokensSemantic + +extension NamedSpace { + + enum Fixed: String, CaseIterable { + case spaceFixedNone + case spaceFixedSmash + case spaceFixedShortest + case spaceFixedShorter + case spaceFixedShort + case spaceFixedMedium + case spaceFixedTall + case spaceFixedTaller + case spaceFixedTallest + case spaceFixedSpacious + case spaceFixedHuge + case spaceFixedJumbo + + func token(from theme: OUDSTheme) -> SpacingSemanticToken { + switch self { + case .spaceFixedNone: + return theme.spaceFixedNone + case .spaceFixedSmash: + return theme.spaceFixedSmash + case .spaceFixedShortest: + return theme.spaceFixedShortest + case .spaceFixedShorter: + return theme.spaceFixedShorter + case .spaceFixedShort: + return theme.spaceFixedShort + case .spaceFixedMedium: + return theme.spaceFixedMedium + case .spaceFixedTall: + return theme.spaceFixedTall + case .spaceFixedTaller: + return theme.spaceFixedTaller + case .spaceFixedTallest: + return theme.spaceFixedTallest + case .spaceFixedSpacious: + return theme.spaceFixedSpacious + case .spaceFixedHuge: + return theme.spaceFixedHuge + case .spaceFixedJumbo: + return theme.spaceFixedJumbo + } + } + } +} diff --git a/Showcase/Showcase/Pages/Tokens/Dimension/Space/NamedSpace/NamedSpace+Scaled.swift b/Showcase/Showcase/Pages/Tokens/Dimension/Space/NamedSpace/NamedSpace+Scaled.swift new file mode 100644 index 000000000..023a52bcf --- /dev/null +++ b/Showcase/Showcase/Pages/Tokens/Dimension/Space/NamedSpace/NamedSpace+Scaled.swift @@ -0,0 +1,56 @@ +// +// Software Name: OUDS iOS +// SPDX-FileCopyrightText: Copyright (c) Orange SA +// SPDX-License-Identifier: MIT +// +// This software is distributed under the MIT license, +// the text of which is available at https://opensource.org/license/MIT/ +// or see the "LICENSE" file for more details. +// +// Authors: See CONTRIBUTORS.txt +// Software description: A SwiftUI components library with code examples for Orange Unified Design System +// + +import OUDS +import OUDSTokensSemantic + +extension NamedSpace { + + enum Scaled: String, CaseIterable { + case spaceScaledNone + case spaceScaledSmash + case spaceScaledShortest + case spaceScaledShorter + case spaceScaledShort + case spaceScaledMedium + case spaceScaledTall + case spaceScaledTaller + case spaceScaledTallest + case spaceScaledSpacious + + func token(from theme: OUDSTheme) -> MultipleSpacingTokens { + switch self { + case .spaceScaledNone: + return theme.spaceScaledNone + case .spaceScaledSmash: + return theme.spaceScaledSmash + case .spaceScaledShortest: + return theme.spaceScaledShortest + case .spaceScaledShorter: + return theme.spaceScaledShorter + case .spaceScaledShort: + return theme.spaceScaledShort + case .spaceScaledMedium: + return theme.spaceScaledMedium + case .spaceScaledTall: + return theme.spaceScaledTall + case .spaceScaledTaller: + return theme.spaceScaledTaller + case .spaceScaledTallest: + return theme.spaceScaledTallest + case .spaceScaledSpacious: + return theme.spaceScaledSpacious + } + } + } +} diff --git a/Showcase/Showcase/Pages/Tokens/Dimension/Spacing/SpacingTokenElement.swift b/Showcase/Showcase/Pages/Tokens/Dimension/Space/SpaceTokenElement.swift similarity index 73% rename from Showcase/Showcase/Pages/Tokens/Dimension/Spacing/SpacingTokenElement.swift rename to Showcase/Showcase/Pages/Tokens/Dimension/Space/SpaceTokenElement.swift index 9198adb30..b142b9c24 100644 --- a/Showcase/Showcase/Pages/Tokens/Dimension/Spacing/SpacingTokenElement.swift +++ b/Showcase/Showcase/Pages/Tokens/Dimension/Space/SpaceTokenElement.swift @@ -13,16 +13,16 @@ import SwiftUI -struct SpacingTokenElement: TokenElement { +struct SpaceTokenElement: TokenElement { let name: String let imageName: String let description: String let pageDescription: AnyView init() { - name = "app_tokens_dimension_spacing_label" + name = "app_tokens_dimension_space_label" imageName = "ic_dimension" - description = "app_tokens_dimension_spacing_description_text" - pageDescription = AnyView(SpacingTokenPage()) + description = "app_tokens_dimension_space_description_text" + pageDescription = AnyView(SpaceTokenPage()) } } diff --git a/Showcase/Showcase/Pages/Tokens/Dimension/Space/SpaceTokenPage.swift b/Showcase/Showcase/Pages/Tokens/Dimension/Space/SpaceTokenPage.swift new file mode 100644 index 000000000..72d8e7a69 --- /dev/null +++ b/Showcase/Showcase/Pages/Tokens/Dimension/Space/SpaceTokenPage.swift @@ -0,0 +1,326 @@ +// +// Software Name: OUDS iOS +// SPDX-FileCopyrightText: Copyright (c) Orange SA +// SPDX-License-Identifier: MIT +// +// This software is distributed under the MIT license, +// the text of which is available at https://opensource.org/license/MIT/ +// or see the "LICENSE" file for more details. +// +// Authors: See CONTRIBUTORS.txt +// Software description: A SwiftUI components library with code examples for Orange Unified Design System +// + +import OUDS +import OUDSTokensRaw +import OUDSTokensSemantic +import SwiftUI + +// MARK: - Internal constants + +private let kIillustrationHeight = 72.0 +private let kIllustrationWidth = 72.0 + +// MARK: - Space Token Page + +struct SpaceTokenPage: View { + + @Environment(\.theme) private var theme + @Environment(\.horizontalSizeClass) private var horizontalSizeClass + @Environment(\.verticalSizeClass) private var verticalSizeClass + @Environment(\.colorScheme) private var colorScheme + + // MARK: Body + + var body: some View { + Group { + // Basic Space Tokens + Section { illustrationForScaledSpaces() } header: { + header("app_tokens_dimension_space_scaled_label") + } + Section { illustrationForFixedSpacings() } header: { header("app_tokens_dimension_space_fixed_label") + } + // Padding Sapce Tokens + Section { illustrationForPaddingInline() } header: { + header("app_tokens_dimension_space_paddingInline_label") + } + Section { illustrationForPaddingInlineWithIcon() } header: { + header("app_tokens_dimension_space_paddingInlineWithIcon_label") + } + Section { illustrationForPaddingInlineWithArrow() } header: { + header("app_tokens_dimension_space_paddingInlineWithArrow_label") + } + Section { illustrationForPaddingInset() } header: { + header("app_tokens_dimension_space_paddingInset_label") + } + Section { illustrationForPaddingStack() } header: { + header("app_tokens_dimension_space_paddingStack_label") + } + // Gap Space Tokens + Section { illustrationForGapInline() } header: { + header("app_tokens_dimension_space_gapInline_label") + } + Section { illustrationForGapStack() } header: { + header("app_tokens_dimension_space_gapStack_label") + } + } + .padding(.horizontal, theme.spaceFixedMedium) + } + + // MARK: Fixed Sapces + + private func illustrationForFixedSpacings() -> some View { + VStack(alignment: .leading, spacing: theme.spaceFixedNone) { + ForEach(NamedSpace.Fixed.allCases, id: \.rawValue) { namedSpaceToken in + let token = namedSpaceToken.token(from: theme) + let name = namedSpaceToken.rawValue + // Fixed spacings are illustrated as a gap inline + illustation(for: Gap.inline(token), name: name) + } + } + } + + // MARK: Scaled Spaces + + private func illustrationForScaledSpaces() -> some View { + VStack(alignment: .leading, spacing: theme.spaceFixedNone) { + ForEach(NamedSpace.Scaled.allCases, id: \.rawValue) { namedSpaceToken in + illustration(for: namedSpaceToken) + } + } + } + + private func illustration(for namedSpaceToken: NamedSpace.Scaled) -> some View { + let token = namedSpaceToken.token(from: theme) + let name = namedSpaceToken.rawValue + let horizontalDimensionRawToken = token.dimension(for: horizontalSizeClass ?? .regular) + let verticalDimensionRawToken = token.dimension(for: verticalSizeClass ?? .regular) + + let value = String(format: "horizontal %@ (%.0f pt)\nvertical %@ (%.0f pt)", + horizontalSizeClass == .regular ? "regular" : "compact", + horizontalDimensionRawToken, + verticalSizeClass == .regular ? "regular" : "compact", + verticalDimensionRawToken) + + return ShowcaseTokenIllustration(tokenName: name, tokenValue: value) { + ZStack { + Rectangle() + .fill(theme.colorBackgroundEmphasized.color(for: colorScheme)) + .frame(width: kIllustrationWidth, height: kIillustrationHeight, alignment: .center) + Rectangle() + .fill(theme.colorAlwaysInfo.color(for: colorScheme)) + .opacity(0.5) + .frame(width: horizontalDimensionRawToken, height: kIillustrationHeight, alignment: .center) + + Rectangle() + .fill(theme.colorAlwaysInfo.color(for: colorScheme)) + .opacity(0.5) + .frame(width: kIllustrationWidth, height: verticalDimensionRawToken, alignment: .center) + } + } + } + + // MARK: Padding illustrations + + private func illustrationForPaddingInline() -> some View { + VStack(alignment: .leading, spacing: theme.spaceFixedNone) { + ForEach(NamedSpace.PaddingInline.allCases, id: \.rawValue) { namedSpaceToken in + let token = namedSpaceToken.token(from: theme) + let name = namedSpaceToken.rawValue + illustation(for: Padding.inline(token), name: name) + } + } + } + + private func illustrationForPaddingInlineWithIcon() -> some View { + VStack(alignment: .leading, spacing: theme.spaceFixedNone) { + ForEach(NamedSpace.PaddingInlineWithIcon.allCases, id: \.rawValue) { namedSpaceToken in + let token = namedSpaceToken.token(from: theme) + let name = namedSpaceToken.rawValue + illustation( + for: Padding.inlineWithIcon(token), + name: name, + additionalAsset: (icon: Image(decorative: "ic_token"), horizontalPadding: 1)) + } + } + } + private func illustrationForPaddingInlineWithArrow() -> some View { + VStack(alignment: .leading, spacing: theme.spaceFixedNone) { + ForEach(NamedSpace.PaddingInlineWithArrow.allCases, id: \.rawValue) { namedSpaceToken in + let token = namedSpaceToken.token(from: theme) + let name = namedSpaceToken.rawValue + illustation( + for: Padding.inlineWithArrow(token), + name: name, + additionalAsset: (icon: Image(decorative: "ic_vector"), horizontalPadding: 5)) + } + } + } + + private func illustrationForPaddingInset() -> some View { + VStack(alignment: .leading, spacing: theme.spaceFixedNone) { + ForEach(NamedSpace.PaddingInset.allCases, id: \.rawValue) { namedSpaceToken in + let token = namedSpaceToken.token(from: theme) + let name = namedSpaceToken.rawValue + illustation(for: Padding.inset(token), name: name) + } + } + } + + private func illustrationForPaddingStack() -> some View { + VStack(alignment: .leading, spacing: theme.spaceFixedNone) { + ForEach(NamedSpace.PaddingStack.allCases, id: \.rawValue) { namedSpaceToken in + let token = namedSpaceToken.token(from: theme) + let name = namedSpaceToken.rawValue + illustation(for: Padding.stack(token), name: name) + } + } + } + + // MARK: Gap illustrations + + private func illustrationForGapInline() -> some View { + VStack(alignment: .leading, spacing: theme.spaceFixedNone) { + ForEach(NamedSpace.GapInline.allCases, id: \.rawValue) { namedSpaceToken in + let token = namedSpaceToken.token(from: theme) + let name = namedSpaceToken.rawValue + illustation(for: Gap.inline(token), name: name) + } + } + } + + private func illustrationForGapStack() -> some View { + VStack(alignment: .leading, spacing: theme.spaceFixedNone) { + ForEach(NamedSpace.GapStack.allCases, id: \.rawValue) { namedSpaceToken in + let token = namedSpaceToken.token(from: theme) + let name = namedSpaceToken.rawValue + illustation(for: Gap.stack(token), name: name) + } + } + } + + // MARK: Common helpers + + private func header(_ text: LocalizedStringKey) -> some View { + Text(text).showcaseSectionHeaderStyle() + } + + @ViewBuilder + private func illustation(for paddingType: Padding, name: String, additionalAsset: (icon: Image, horizontalPadding: Double)? = nil) -> some View { + let value = String(format: "%.2f (pt)", paddingType.dimension) + + ShowcaseTokenIllustration(tokenName: name, tokenValue: value) { + ZStack(alignment: .leading) { + Rectangle() + .fill(theme.colorAlwaysInfo.color(for: colorScheme)) + + Rectangle() + .fill(theme.colorBackgroundEmphasized.color(for: colorScheme)) + .modifier(PaddingModifier(padding: paddingType)) + + if let additionalAsset { + VStack(alignment: .leading) { + additionalAsset.icon + .renderingMode(.template) + .resizable() + .aspectRatio(contentMode: .fit) + .foregroundColor(theme.colorAlwaysInfo.color(for: colorScheme)) + } + .padding(.horizontal, additionalAsset.horizontalPadding) + .frame(width: 24, alignment: .leading) + .modifier(PaddingModifier(padding: paddingType)) + } + } + .frame(width: kIllustrationWidth, height: kIillustrationHeight, alignment: .leading) + } + } + + @ViewBuilder + private func illustation(for gapType: Gap, name: String) -> some View { + let value = String(format: "%.2f (pt)", gapType.dimension) + + ShowcaseTokenIllustration(tokenName: name, tokenValue: value) { + ZStack { + Rectangle() + .fill(theme.colorBackgroundEmphasized.color(for: colorScheme)) + + Rectangle() + .fill(theme.colorAlwaysInfo.color(for: colorScheme)) + .modifier(GapModifier(gap: gapType)) + } + .frame(width: kIllustrationWidth, height: kIillustrationHeight, alignment: .center) + } + } +} + +// MARK: - Gap + +enum Gap { + case inline(DimensionRawToken) + case stack(DimensionRawToken) + + var dimension: DimensionRawToken { + switch self { + case .inline(let dimension), .stack(let dimension): + return dimension + } + } +} + +// MARK: - Gap Modifier + +private struct GapModifier: ViewModifier { + + let gap: Gap + + func body(content: Content) -> some View { + switch gap { + case .inline(let dimensionRawToken): + content.frame(width: dimensionRawToken, height: kIillustrationHeight, alignment: .center) + + case .stack(let dimensionRawToken): + content.frame(width: kIllustrationWidth, height: dimensionRawToken, alignment: .center) + } + } +} + +// MARK: - Padding + +enum Padding { + case inline(DimensionRawToken) + case stack(DimensionRawToken) + case inset(DimensionRawToken) + case inlineWithIcon(DimensionRawToken) + case inlineWithArrow(DimensionRawToken) + + var dimension: DimensionRawToken { + switch self { + case .inline(let dimension), .stack(let dimension), .inset(let dimension), .inlineWithIcon(let dimension), .inlineWithArrow(let dimension): + return dimension + } + } +} + +// MARK: - Padding Modifier + +private struct PaddingModifier: ViewModifier { + + let padding: Padding + + func body(content: Content) -> some View { + switch padding { + case .inline(let dimension), .inlineWithIcon(let dimension), .inlineWithArrow(let dimension): + content.padding(.leading, dimension) + case .stack(let dimension): + content.padding(.top, dimension) + case .inset(let dimension): + content + .padding(.top, dimension) + .padding(.leading, dimension) + } + } +} + +// MARK: - Named Space + +enum NamedSpace { } diff --git a/Showcase/Showcase/Pages/Tokens/Dimension/Spacing/SpacingTokenPage.swift b/Showcase/Showcase/Pages/Tokens/Dimension/Spacing/SpacingTokenPage.swift deleted file mode 100644 index f58963687..000000000 --- a/Showcase/Showcase/Pages/Tokens/Dimension/Spacing/SpacingTokenPage.swift +++ /dev/null @@ -1,98 +0,0 @@ -// -// Software Name: OUDS iOS -// SPDX-FileCopyrightText: Copyright (c) Orange SA -// SPDX-License-Identifier: MIT -// -// This software is distributed under the MIT license, -// the text of which is available at https://opensource.org/license/MIT/ -// or see the "LICENSE" file for more details. -// -// Authors: See CONTRIBUTORS.txt -// Software description: A SwiftUI components library with code examples for Orange Unified Design System -// - -import OUDS -import OUDSTokensSemantic -import SwiftUI - -struct SpacingTokenPage: View { - - @Environment(\.theme) private var theme - @Environment(\.horizontalSizeClass) private var horizontalSizeClass - @Environment(\.verticalSizeClass) private var verticalSizeClass - @Environment(\.colorScheme) private var colorScheme - - // MARK: Body - - var body: some View { - VStack(alignment: .leading, spacing: theme.spaceFixedNone) { - ForEach(NamedSpacing.allCases, id: \.rawValue) { spacingName in - illustration(for: spacingName) - } - } - .frame(maxWidth: .infinity) - .padding(.horizontal, theme.spaceFixedMedium) - } - - // MARK: Private helpers - - private func illustration(for namedSpacing: NamedSpacing) -> some View { - let token = namedSpacing.token(from: theme) - let name = namedSpacing.rawValue - let horizontalDimensionRawToken = token.dimension(for: horizontalSizeClass ?? .regular) - let value = String(format: "horizontal %@\n %.0f pt", - horizontalSizeClass == .regular ? "regular" : "compact", - horizontalDimensionRawToken) - - return ShowcaseTokenIllustration(tokenName: name, tokenValue: value) { - ZStack { - Rectangle() - .fill(theme.colorAlwaysOnBgAccent.color(for: colorScheme)) - .frame(width: 64, height: 64, alignment: .center) - Rectangle() - .fill(.blue) - .frame(width: horizontalDimensionRawToken, height: 64, alignment: .center) - } - } - } -} - -// MARK: - Named Spacing - -private enum NamedSpacing: String, CaseIterable { - case spaceScaledNone - case spaceScaledSmash - case spaceScaledShortest - case spaceScaledShorter - case spaceScaledShort - case spaceScaledMedium - case spaceScaledTall - case spaceScaledTaller - case spaceScaledTallest - case spaceScaledSpacious - - func token(from theme: OUDSTheme) -> MultipleSpacingTokens { - switch self { - case .spaceScaledNone: - return theme.spaceScaledNone - case .spaceScaledSmash: - return theme.spaceScaledSmash - case .spaceScaledShortest: - return theme.spaceScaledShortest - case .spaceScaledShorter: - return theme.spaceScaledShorter - case .spaceScaledShort: - return theme.spaceScaledShort - case .spaceScaledMedium: - return theme.spaceScaledMedium - case .spaceScaledTall: - return theme.spaceScaledTall - case .spaceScaledTaller: - return theme.spaceScaledTaller - case .spaceScaledTallest: - return theme.spaceScaledTallest - case .spaceScaledSpacious: - return theme.spaceScaledSpacious - } - } -} diff --git a/Showcase/Showcase/Pages/Utils/ShowcaseElementsPage.swift b/Showcase/Showcase/Pages/Utils/ShowcaseElementsPage.swift index 3b80decaa..2f807f252 100644 --- a/Showcase/Showcase/Pages/Utils/ShowcaseElementsPage.swift +++ b/Showcase/Showcase/Pages/Utils/ShowcaseElementsPage.swift @@ -45,7 +45,7 @@ struct ShowcaseElementsPage: View { } .padding(.all, theme.spaceFixedMedium) .navigationbarMenuForThemeSelection() - .oudsNavigationTitle("app_bottomBar_tokens") + .oudsNavigationTitle("app_bottomBar_tokens_label") } .background(theme.colorBackgroundPrimary.color(for: colorScheme)) } diff --git a/Showcase/Showcase/Pages/Utils/ShowcaseSectionHeaderStyle.swift b/Showcase/Showcase/Pages/Utils/ShowcaseSectionHeaderStyle.swift new file mode 100644 index 000000000..dd6c066c3 --- /dev/null +++ b/Showcase/Showcase/Pages/Utils/ShowcaseSectionHeaderStyle.swift @@ -0,0 +1,33 @@ +// +// Software Name: OUDS iOS +// SPDX-FileCopyrightText: Copyright (c) Orange SA +// SPDX-License-Identifier: MIT +// +// This software is distributed under the MIT license, +// the text of which is available at https://opensource.org/license/MIT/ +// or see the "LICENSE" file for more details. +// +// Authors: See CONTRIBUTORS.txt +// Software description: A SwiftUI components library with code examples for Orange Unified Design System +// + +import OUDS +import OUDSTokensSemantic +import SwiftUI + +struct ShowcaseSectionHeaderModifier: ViewModifier { + + @Environment(\.theme) private var theme + + func body(content: Content) -> some View { + content + .typeHeadingMedium(theme) + .frame(maxWidth: .infinity, alignment: .leading) + } +} + +extension Text { + func showcaseSectionHeaderStyle() -> some View { + self.modifier(ShowcaseSectionHeaderModifier()) + } +} diff --git a/Showcase/Showcase/Resources/Assets.xcassets/Tokens/ic_vector.imageset/Contents.json b/Showcase/Showcase/Resources/Assets.xcassets/Tokens/ic_vector.imageset/Contents.json new file mode 100644 index 000000000..6f7816e89 --- /dev/null +++ b/Showcase/Showcase/Resources/Assets.xcassets/Tokens/ic_vector.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "ic_vector.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Showcase/Showcase/Resources/Assets.xcassets/Tokens/ic_vector.imageset/ic_vector.svg b/Showcase/Showcase/Resources/Assets.xcassets/Tokens/ic_vector.imageset/ic_vector.svg new file mode 100644 index 000000000..13b45169d --- /dev/null +++ b/Showcase/Showcase/Resources/Assets.xcassets/Tokens/ic_vector.imageset/ic_vector.svg @@ -0,0 +1,3 @@ + + + diff --git a/Showcase/Showcase/Resources/en.lproj/Localizable.strings b/Showcase/Showcase/Resources/en.lproj/Localizable.strings index 148d7cafc..8fb65da79 100644 --- a/Showcase/Showcase/Resources/en.lproj/Localizable.strings +++ b/Showcase/Showcase/Resources/en.lproj/Localizable.strings @@ -13,18 +13,22 @@ // MARK: - bottomBar -"app_bottomBar_components" = "Components"; -"app_bottomBar_tokens" = "Tokens"; -"app_bottomBar_about" = "About"; +"app_bottomBar_components_label" = "Components"; +"app_bottomBar_tokens_label" = "Tokens"; +"app_bottomBar_about_label" = "About"; +"app_topBar_theme_button_a11y" = "Change theme"; // MARK: - About Screen -"app_about_label_legalInformation" = "Legal information"; -"app_about_label_privacyPolicy" = "Privacy policy"; +"app_about_legalInformation_label" = "Legal information"; +"app_about_privacyPolicy_label" = "Privacy policy"; // MARK: - Tokens Screen "app_tokens_border_label" = "Border"; +"app_tokens_border_width_label" = "Width"; +"app_tokens_border_radius_label" = "Radius"; +"app_tokens_border_style_label" = "Style"; "app_tokens_border_description_text" = "Borders are used for the stroke colours on components and also for the colours of divider lines for components like tables."; "app_tokens_color_label" = "Color"; @@ -33,11 +37,20 @@ "app_tokens_dimension_label" = "Dimension"; "app_tokens_dimension_description_text" = "Dimension provides standard sizing and spacing to ensure visual consistency across the UI."; -"app_tokens_dimension_spacing_label" = "Spacing"; -"app_tokens_dimension_spacing_description_text" = "Space refers to the measurements used to define the spacing between UI elements."; +"app_tokens_dimension_space_label" = "Space"; +"app_tokens_dimension_space_description_text" = "Space refers to the measurements used to define the spacing between UI elements."; +"app_tokens_dimension_space_scaled_label" = "Scaled"; +"app_tokens_dimension_space_fixed_label" = "Fixed"; +"app_tokens_dimension_space_paddingInline_label" = "Padding inline"; +"app_tokens_dimension_space_paddingInlineWithIcon_label" = "Padding inline with icon"; +"app_tokens_dimension_space_paddingInlineWithArrow_label" = "Padding inline with arrow"; +"app_tokens_dimension_space_paddingInset_label" = "Padding inset"; +"app_tokens_dimension_space_paddingStack_label" = "Padding stack"; +"app_tokens_dimension_space_gapInline_label" = "Gap inline"; +"app_tokens_dimension_space_gapStack_label" = "Gap stack"; -"app_tokens_dimension_sizing_label" = "Sizing"; -"app_tokens_dimension_sizing_description_text" = "Size refers to the specific measurements used to define the dimensions of UI elements within the design system."; +"app_tokens_dimension_size_label" = "Size"; +"app_tokens_dimension_size_description_text" = "Size refers to the specific measurements used to define the dimensions of UI elements within the design system."; "app_tokens_elevation_label" = "Elevation"; "app_tokens_elevation_description_text" = "Shadows are used to give the impression of distance or elevation between surfaces, which adds depth to our designs."; @@ -50,5 +63,5 @@ // MARK: - Component Screen -"app_component_empty_content_text" = "No content"; -"app_component_empty_content_description_text" = "This content is under construction and will be available very soon"; +"app_component_emptyContent_text" = "No content"; +"app_component_emptyContent_description_text" = "This content is under construction and will be available very soon"; From ede91b2a604a5904c58e272247bce9673892e88e Mon Sep 17 00:00:00 2001 From: LudovicPinel Date: Thu, 24 Oct 2024 17:12:42 +0200 Subject: [PATCH 17/30] refactor: typography screen to use right color on token name (#213) (#244) Reviewed-by: Pierre-Yves Lapersonne --- CHANGELOG.md | 1 + .../Typography/TypographyTokenPage.swift | 58 ++++++++++--------- 2 files changed, 33 insertions(+), 26 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 61552457e..7a38c6a81 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -39,6 +39,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed +- [DemoApp] Update typography screen to use right color on token name ([#213](https://github.com/Orange-OpenSource/ouds-ios/issues/213)) - [DemoApp] Remove duplicated section in color page for content on background values ([#236](https://github.com/Orange-OpenSource/ouds-ios/issues/236)) - [DemoApp] Hide from Voice Over decorative image in theme selector (a11y) diff --git a/Showcase/Showcase/Pages/Tokens/Typography/TypographyTokenPage.swift b/Showcase/Showcase/Pages/Tokens/Typography/TypographyTokenPage.swift index 0b8b48b8f..a2d185a08 100644 --- a/Showcase/Showcase/Pages/Tokens/Typography/TypographyTokenPage.swift +++ b/Showcase/Showcase/Pages/Tokens/Typography/TypographyTokenPage.swift @@ -31,7 +31,7 @@ struct TypographyTokenPage: View { } } .frame(maxWidth: .infinity, alignment: .leading) - .padding(.horizontal, theme.spaceFixedShort) + .padding(.horizontal, theme.spaceFixedMedium) .navigationTitle(LocalizedStringKey("app_tokens_typography_label")) } @@ -43,7 +43,7 @@ struct TypographyTokenPage: View { VStack(alignment: .leading, spacing: theme.spaceFixedNone) { typgraphyIllustration(from: namedTypography) - .foregroundStyle(theme.colorContentMuted.color(for: colorScheme)) + .foregroundStyle(theme.colorContentDefault.color(for: colorScheme)) Group { Text("family (\(theme.customFontFamily ?? "system")), ") @@ -54,7 +54,7 @@ struct TypographyTokenPage: View { } .typeBodyDefaultMedium(theme) .fixedSize(horizontal: false, vertical: true) - .foregroundStyle(theme.colorContentDefault.color(for: colorScheme)) + .foregroundStyle(theme.colorContentMuted.color(for: colorScheme)) } .frame(maxWidth: .infinity, alignment: .leading) .padding(.vertical, theme.spaceFixedShorter) @@ -64,55 +64,61 @@ struct TypographyTokenPage: View { private func typgraphyIllustration(from namedTypography: NamedTypography) -> some View { switch namedTypography { case .displayLarge: - Text(namedTypography.rawValue).typeDisplayLarge(theme) + Text(namedTypography.rawValue.camelCase).typeDisplayLarge(theme) case .displayMedium: - Text(namedTypography.rawValue).typeDisplayMedium(theme) + Text(namedTypography.rawValue.camelCase).typeDisplayMedium(theme) case .displaySmall: - Text(namedTypography.rawValue).typeDisplaySmall(theme) + Text(namedTypography.rawValue.camelCase).typeDisplaySmall(theme) case .headingXLarge: - Text(namedTypography.rawValue).typeHeadingXLarge(theme) + Text(namedTypography.rawValue.camelCase).typeHeadingXLarge(theme) case .headingLarge: - Text(namedTypography.rawValue).typeHeadingLarge(theme) + Text(namedTypography.rawValue.camelCase).typeHeadingLarge(theme) case .headingMedium: - Text(namedTypography.rawValue).typeHeadingMedium(theme) + Text(namedTypography.rawValue.camelCase).typeHeadingMedium(theme) case .headingSmall: - Text(namedTypography.rawValue).typeHeadingSmall(theme) + Text(namedTypography.rawValue.camelCase).typeHeadingSmall(theme) case .bodyDefaultLarge: - Text(namedTypography.rawValue).typeBodyDefaultLarge(theme) + Text(namedTypography.rawValue.camelCase).typeBodyDefaultLarge(theme) case .bodyDefaultMedium: - Text(namedTypography.rawValue).typeBodyDefaultMedium(theme) + Text(namedTypography.rawValue.camelCase).typeBodyDefaultMedium(theme) case .bodyDefaultSmall: - Text(namedTypography.rawValue).typeBodyDefaultSmall(theme) + Text(namedTypography.rawValue.camelCase).typeBodyDefaultSmall(theme) case .bodyStrongLarge: - Text(namedTypography.rawValue).typeBodyStrongLarge(theme) + Text(namedTypography.rawValue.camelCase).typeBodyStrongLarge(theme) case .bodyStrongMedium: - Text(namedTypography.rawValue).typeBodyStrongMedium(theme) + Text(namedTypography.rawValue.camelCase).typeBodyStrongMedium(theme) case .bodyStrongSmall: - Text(namedTypography.rawValue).typeBodyStrongSmall(theme) + Text(namedTypography.rawValue.camelCase).typeBodyStrongSmall(theme) case .labelDefaultXLarge: - Text(namedTypography.rawValue).typeLabelDefaultXLarge(theme) + Text(namedTypography.rawValue.camelCase).typeLabelDefaultXLarge(theme) case .labelDefaultLarge: - Text(namedTypography.rawValue).typeLabelDefaultLarge(theme) + Text(namedTypography.rawValue.camelCase).typeLabelDefaultLarge(theme) case .labelDefaultMedium: - Text(namedTypography.rawValue).typeLabelDefaultMedium(theme) + Text(namedTypography.rawValue.camelCase).typeLabelDefaultMedium(theme) case .labelDefaultSmall: - Text(namedTypography.rawValue).typeLabelDefaultSmall(theme) + Text(namedTypography.rawValue.camelCase).typeLabelDefaultSmall(theme) case .labelStrongXLarge: - Text(namedTypography.rawValue).typeLabelStrongXLarge(theme) + Text(namedTypography.rawValue.camelCase).typeLabelStrongXLarge(theme) case .labelStrongLarge: - Text(namedTypography.rawValue).typeLabelStrongLarge(theme) + Text(namedTypography.rawValue.camelCase).typeLabelStrongLarge(theme) case .labelStrongMedium: - Text(namedTypography.rawValue).typeLabelStrongMedium(theme) + Text(namedTypography.rawValue.camelCase).typeLabelStrongMedium(theme) case .labelStrongSmall: - Text(namedTypography.rawValue).typeLabelStrongSmall(theme) + Text(namedTypography.rawValue.camelCase).typeLabelStrongSmall(theme) case .codeSmall: - Text(namedTypography.rawValue).typeCodeMedium(theme) + Text(namedTypography.rawValue.camelCase).typeCodeMedium(theme) case .codeMedium: - Text(namedTypography.rawValue).typeCodeMedium(theme) + Text(namedTypography.rawValue.camelCase).typeCodeMedium(theme) } } } +extension String { + var camelCase: String { + self.prefix(1).capitalized + self.dropFirst() + } +} + // MARK: - Named Typography private enum NamedTypography: String, CaseIterable { From d563769dd9a1019d1208e9ff95036417c7a7d75b Mon Sep 17 00:00:00 2001 From: Pierre-Yves Lapersonne Date: Thu, 24 Oct 2024 17:34:45 +0200 Subject: [PATCH 18/30] refactor: rename `*Spacing*Tokens` and `*Sizing*Tokens` to `*Space*Tokens` and `*Size*Tokens`, various cleanings (#237) (#246 - Rename tokens types - Clean some files and warnings Signed-off-by: Pierre-Yves Lapersonne --- CHANGELOG.md | 1 + .../OUDSTheme+ButtonsComponentTokens.swift | 6 +- .../OUDSTheme+SizingSemanticTokens.swift | 112 +++++---- .../OUDSTheme+SpacingSemanticTokens.swift | 214 +++++++++--------- .../MockTheme+SizingSemanticTokens.swift | 106 ++++----- .../MockTheme+SpacingSemanticTokens.swift | 210 ++++++++--------- .../OUDSTheme/MockThemes/MockTheme.swift | 2 +- ...stThemeOverrideOfSizeSemanticTokens.swift} | 2 +- ...tThemeOverrideOfSpaceSemanticTokens.swift} | 2 +- .../Values/ButtonsComponentTokens.swift | 6 +- ...gTokens.swift => MultipleSizeTokens.swift} | 20 +- ...Tokens.swift => MultipleSpaceTokens.swift} | 4 +- .../SizingSemanticTokens+Aliases.swift | 2 +- .../SpacingSemanticTokens+Aliases.swift | 13 +- .../Sources/Values/SizeSemanticTokens.swift | 89 ++++++++ .../Sources/Values/SizingSemanticTokens.swift | 89 -------- .../Sources/Values/SpaceSemanticTokens.swift | 152 +++++++++++++ .../Values/SpacingSemanticTokens.swift | 152 ------------- .../OUDSTokensSemantic.md | 4 +- .../MultipleColorSemanticTokenTests.swift | 2 +- .../MultipleElevationTokensTests.swift | 2 +- ...MultipleFontLetterSpacingTokensTests.swift | 2 +- .../MultipleFontLineHeightTokensTests.swift | 2 +- .../MultipleFontSizeTokensTests.swift | 2 +- .../MultipleSizingSemanticTokenTests.swift | 20 +- .../MultipleSpacingTokensTests.swift | 14 +- .../MultipleTypographyTokensTests.swift | 2 +- Package.resolved | 18 +- .../Tokens/Dimension/Size/SizeTokenPage.swift | 2 +- .../NamedSpace/NameSpace+GapInline.swift | 2 +- .../Space/NamedSpace/NameSpace+GapStack.swift | 2 +- .../NamedSpace/NameSpace+PaddingInline.swift | 2 +- .../NameSpace+PaddingInlineWithArrow.swift | 2 +- .../NameSpace+PaddingInlineWithIcon.swift | 2 +- .../NamedSpace/NameSpace+PaddingInset.swift | 2 +- .../NamedSpace/NameSpace+PaddingStack.swift | 2 +- .../Space/NamedSpace/NamedSpace+Fixed.swift | 2 +- .../Space/NamedSpace/NamedSpace+Scaled.swift | 2 +- 38 files changed, 632 insertions(+), 638 deletions(-) rename OUDS/Core/OUDS/Tests/OUDSTheme/{TestThemeOverrideOfSizingSemanticTokens.swift => TestThemeOverrideOfSizeSemanticTokens.swift} (99%) rename OUDS/Core/OUDS/Tests/OUDSTheme/{TestThemeOverrideOfSpacingSemanticTokens.swift => TestThemeOverrideOfSpaceSemanticTokens.swift} (99%) rename OUDS/Core/Tokens/SemanticTokens/Sources/Multiples/{MultipleSizingTokens.swift => MultipleSizeTokens.swift} (69%) rename OUDS/Core/Tokens/SemanticTokens/Sources/Multiples/{MultipleSpacingTokens.swift => MultipleSpaceTokens.swift} (93%) create mode 100644 OUDS/Core/Tokens/SemanticTokens/Sources/Values/SizeSemanticTokens.swift delete mode 100644 OUDS/Core/Tokens/SemanticTokens/Sources/Values/SizingSemanticTokens.swift create mode 100644 OUDS/Core/Tokens/SemanticTokens/Sources/Values/SpaceSemanticTokens.swift delete mode 100644 OUDS/Core/Tokens/SemanticTokens/Sources/Values/SpacingSemanticTokens.swift diff --git a/CHANGELOG.md b/CHANGELOG.md index 7a38c6a81..bba7c8ca1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed +- [Library] Rename `*Spacing*Tokens` and `*Sizing*Tokens` to `*Space*Tokens` and `*Size*Tokens` ([#237](https://github.com/Orange-OpenSource/ouds-ios/issues/237)) - [Library] Update `ElevationRawTokens` (tokenator *20241022174330*) - [Library] Update `DimensionRawTokens` (tokenator *20241022132646*) - [Tool] Improve configuration of SwiftLint, update to v0.57.0 ([#77](https://github.com/Orange-OpenSource/ouds-ios/pull/77)) diff --git a/OUDS/Core/OUDS/Sources/OUDSTheme/OUDSTheme+ComponentTokens/OUDSTheme+ButtonsComponentTokens.swift b/OUDS/Core/OUDS/Sources/OUDSTheme/OUDSTheme+ComponentTokens/OUDSTheme+ButtonsComponentTokens.swift index e7f847381..6bc92928d 100644 --- a/OUDS/Core/OUDS/Sources/OUDSTheme/OUDSTheme+ComponentTokens/OUDSTheme+ButtonsComponentTokens.swift +++ b/OUDS/Core/OUDS/Sources/OUDSTheme/OUDSTheme+ComponentTokens/OUDSTheme+ButtonsComponentTokens.swift @@ -22,7 +22,7 @@ import OUDSTokensSemantic /// **Warning: These are random and dumb values** extension OUDSTheme: ButtonsComponentTokens { - @objc open var buttonInternalSpacing: SpacingPaddingInlineSemanticToken { spacePaddingInlineShort } + @objc open var buttonInternalSpacing: SpacePaddingInlineSemanticToken { spacePaddingInlineShort } @objc open var buttonBorderStyle: BorderStyleSemanticToken { borderStyleDefault } @objc open var buttonBorderColor: ColorSemanticToken { colorBorderDefault } @@ -32,8 +32,8 @@ extension OUDSTheme: ButtonsComponentTokens { @objc open var buttonForegroundColor: ColorSemanticToken { colorContentBrandPrimary } @objc open var buttonBackgroundColor: ColorSemanticToken { colorBackgroundBrandPrimary } - @objc open var buttonWidth: SizingSemanticToken { DimensionRawTokens.dimension3000 } - @objc open var buttonHeight: SizingSemanticToken { DimensionRawTokens.dimension1000 } + @objc open var buttonWidth: SizeSemanticToken { DimensionRawTokens.dimension3000 } + @objc open var buttonHeight: SizeSemanticToken { DimensionRawTokens.dimension1000 } @objc open var buttonTypography: MultipleTypographyTokens { typeDisplayMedium } } diff --git a/OUDS/Core/OUDS/Sources/OUDSTheme/OUDSTheme+SemanticTokens/OUDSTheme+SizingSemanticTokens.swift b/OUDS/Core/OUDS/Sources/OUDSTheme/OUDSTheme+SemanticTokens/OUDSTheme+SizingSemanticTokens.swift index e2975b5fa..0338107ca 100644 --- a/OUDS/Core/OUDS/Sources/OUDSTheme/OUDSTheme+SemanticTokens/OUDSTheme+SizingSemanticTokens.swift +++ b/OUDS/Core/OUDS/Sources/OUDSTheme/OUDSTheme+SemanticTokens/OUDSTheme+SizingSemanticTokens.swift @@ -18,84 +18,80 @@ import OUDSTokensSemantic // ଘ( ・ω・)_/゚・:*:・。☆ // [File to generate with the tokenator] -// swiftlint:disable line_length - -/// Defines basic values common to all themes for `SizingSemanticTokens`. +/// Defines basic values common to all themes for `SizeSemanticTokens`. /// These values can be overriden inside `OUDSTheme` subclasses (in extensions or not, in the same module or not) thanks to the `@objc open` combination. -extension OUDSTheme: SizingSemanticTokens { +extension OUDSTheme: SizeSemanticTokens { // MARK: - Semantic token - Sizing - Icon with typography - @objc open var sizeIconWithHeadingXLargeShort: MultipleSizingTokens { MultipleSizingTokens(compact: DimensionRawTokens.dimension550, regular: DimensionRawTokens.dimension650) } - @objc open var sizeIconWithHeadingXLargeMedium: MultipleSizingTokens { MultipleSizingTokens(compact: DimensionRawTokens.dimension600, regular: DimensionRawTokens.dimension700) } - @objc open var sizeIconWithHeadingXLargeTall: MultipleSizingTokens { MultipleSizingTokens(compact: DimensionRawTokens.dimension650, regular: DimensionRawTokens.dimension800) } + @objc open var sizeIconWithHeadingXLargeShort: MultipleSizeTokens { MultipleSizeTokens(compact: DimensionRawTokens.dimension550, regular: DimensionRawTokens.dimension650) } + @objc open var sizeIconWithHeadingXLargeMedium: MultipleSizeTokens { MultipleSizeTokens(compact: DimensionRawTokens.dimension600, regular: DimensionRawTokens.dimension700) } + @objc open var sizeIconWithHeadingXLargeTall: MultipleSizeTokens { MultipleSizeTokens(compact: DimensionRawTokens.dimension650, regular: DimensionRawTokens.dimension800) } - @objc open var sizeIconWithHeadingLargeShort: MultipleSizingTokens { MultipleSizingTokens(compact: DimensionRawTokens.dimension500, regular: DimensionRawTokens.dimension550) } - @objc open var sizeIconWithHeadingLargeMedium: MultipleSizingTokens { MultipleSizingTokens(compact: DimensionRawTokens.dimension550, regular: DimensionRawTokens.dimension600) } - @objc open var sizeIconWithHeadingLargeTall: MultipleSizingTokens { MultipleSizingTokens(compact: DimensionRawTokens.dimension600, regular: DimensionRawTokens.dimension650) } + @objc open var sizeIconWithHeadingLargeShort: MultipleSizeTokens { MultipleSizeTokens(compact: DimensionRawTokens.dimension500, regular: DimensionRawTokens.dimension550) } + @objc open var sizeIconWithHeadingLargeMedium: MultipleSizeTokens { MultipleSizeTokens(compact: DimensionRawTokens.dimension550, regular: DimensionRawTokens.dimension600) } + @objc open var sizeIconWithHeadingLargeTall: MultipleSizeTokens { MultipleSizeTokens(compact: DimensionRawTokens.dimension600, regular: DimensionRawTokens.dimension650) } - @objc open var sizeIconWithHeadingMediumShort: MultipleSizingTokens { MultipleSizingTokens(compact: DimensionRawTokens.dimension400, regular: DimensionRawTokens.dimension500) } - @objc open var sizeIconWithHeadingMediumMedium: MultipleSizingTokens { MultipleSizingTokens(compact: DimensionRawTokens.dimension500, regular: DimensionRawTokens.dimension550) } - @objc open var sizeIconWithHeadingMediumTall: MultipleSizingTokens { MultipleSizingTokens(compact: DimensionRawTokens.dimension550, regular: DimensionRawTokens.dimension600) } + @objc open var sizeIconWithHeadingMediumShort: MultipleSizeTokens { MultipleSizeTokens(compact: DimensionRawTokens.dimension400, regular: DimensionRawTokens.dimension500) } + @objc open var sizeIconWithHeadingMediumMedium: MultipleSizeTokens { MultipleSizeTokens(compact: DimensionRawTokens.dimension500, regular: DimensionRawTokens.dimension550) } + @objc open var sizeIconWithHeadingMediumTall: MultipleSizeTokens { MultipleSizeTokens(compact: DimensionRawTokens.dimension550, regular: DimensionRawTokens.dimension600) } - @objc open var sizeIconWithHeadingSmallShort: MultipleSizingTokens { MultipleSizingTokens(DimensionRawTokens.dimension400) } - @objc open var sizeIconWithHeadingSmallMedium: MultipleSizingTokens { MultipleSizingTokens(DimensionRawTokens.dimension500) } - @objc open var sizeIconWithHeadingSmallTall: MultipleSizingTokens { MultipleSizingTokens(DimensionRawTokens.dimension550) } + @objc open var sizeIconWithHeadingSmallShort: MultipleSizeTokens { MultipleSizeTokens(DimensionRawTokens.dimension400) } + @objc open var sizeIconWithHeadingSmallMedium: MultipleSizeTokens { MultipleSizeTokens(DimensionRawTokens.dimension500) } + @objc open var sizeIconWithHeadingSmallTall: MultipleSizeTokens { MultipleSizeTokens(DimensionRawTokens.dimension550) } - @objc open var sizeIconWithBodyLargeShort: MultipleSizingTokens { MultipleSizingTokens(DimensionRawTokens.dimension250) } - @objc open var sizeIconWithBodyLargeMedium: MultipleSizingTokens { MultipleSizingTokens(DimensionRawTokens.dimension300) } - @objc open var sizeIconWithBodyLargeTall: MultipleSizingTokens { MultipleSizingTokens(DimensionRawTokens.dimension350) } + @objc open var sizeIconWithBodyLargeShort: MultipleSizeTokens { MultipleSizeTokens(DimensionRawTokens.dimension250) } + @objc open var sizeIconWithBodyLargeMedium: MultipleSizeTokens { MultipleSizeTokens(DimensionRawTokens.dimension300) } + @objc open var sizeIconWithBodyLargeTall: MultipleSizeTokens { MultipleSizeTokens(DimensionRawTokens.dimension350) } - @objc open var sizeIconWithBodyMediumShort: MultipleSizingTokens { MultipleSizingTokens(DimensionRawTokens.dimension200) } - @objc open var sizeIconWithBodyMediumMedium: MultipleSizingTokens { MultipleSizingTokens(DimensionRawTokens.dimension250) } - @objc open var sizeIconWithBodyMediumTall: MultipleSizingTokens { MultipleSizingTokens(DimensionRawTokens.dimension300) } + @objc open var sizeIconWithBodyMediumShort: MultipleSizeTokens { MultipleSizeTokens(DimensionRawTokens.dimension200) } + @objc open var sizeIconWithBodyMediumMedium: MultipleSizeTokens { MultipleSizeTokens(DimensionRawTokens.dimension250) } + @objc open var sizeIconWithBodyMediumTall: MultipleSizeTokens { MultipleSizeTokens(DimensionRawTokens.dimension300) } - @objc open var sizeIconWithBodySmallShort: MultipleSizingTokens { MultipleSizingTokens(DimensionRawTokens.dimension150) } - @objc open var sizeIconWithBodySmallMedium: MultipleSizingTokens { MultipleSizingTokens(DimensionRawTokens.dimension200) } - @objc open var sizeIconWithBodySmallTall: MultipleSizingTokens { MultipleSizingTokens(DimensionRawTokens.dimension250) } + @objc open var sizeIconWithBodySmallShort: MultipleSizeTokens { MultipleSizeTokens(DimensionRawTokens.dimension150) } + @objc open var sizeIconWithBodySmallMedium: MultipleSizeTokens { MultipleSizeTokens(DimensionRawTokens.dimension200) } + @objc open var sizeIconWithBodySmallTall: MultipleSizeTokens { MultipleSizeTokens(DimensionRawTokens.dimension250) } - @objc open var sizeIconWithLabelXLargeSizeShort: SizingSemanticToken { dimensionXS } - @objc open var sizeIconWithLabelXLargeSizeMedium: SizingSemanticToken { dimensionMD } - @objc open var sizeIconWithLabelXLargeSizeTall: SizingSemanticToken { dimensionLG } + @objc open var sizeIconWithLabelXLargeSizeShort: SizeSemanticToken { dimensionXS } + @objc open var sizeIconWithLabelXLargeSizeMedium: SizeSemanticToken { dimensionMD } + @objc open var sizeIconWithLabelXLargeSizeTall: SizeSemanticToken { dimensionLG } - @objc open var sizeIconWithLabelLargeSizeShorter: SizingSemanticToken { dimension4XS } - @objc open var sizeIconWithLabelLargeSizeShort: SizingSemanticToken { dimension3XS } - @objc open var sizeIconWithLabelLargeSizeMedium: SizingSemanticToken { dimension2XS } - @objc open var sizeIconWithLabelLargeSizeTall: SizingSemanticToken { dimensionXS } - @objc open var sizeIconWithLabelLargeSizeTaller: SizingSemanticToken { dimensionLG } + @objc open var sizeIconWithLabelLargeSizeShorter: SizeSemanticToken { dimension4XS } + @objc open var sizeIconWithLabelLargeSizeShort: SizeSemanticToken { dimension3XS } + @objc open var sizeIconWithLabelLargeSizeMedium: SizeSemanticToken { dimension2XS } + @objc open var sizeIconWithLabelLargeSizeTall: SizeSemanticToken { dimensionXS } + @objc open var sizeIconWithLabelLargeSizeTaller: SizeSemanticToken { dimensionLG } - @objc open var sizeIconWithLabelMediumSizeShort: SizingSemanticToken { dimension5XS } - @objc open var sizeIconWithLabelMediumSizeMedium: SizingSemanticToken { dimension4XS } - @objc open var sizeIconWithLabelMediumSizeTall: SizingSemanticToken { dimension3XS } + @objc open var sizeIconWithLabelMediumSizeShort: SizeSemanticToken { dimension5XS } + @objc open var sizeIconWithLabelMediumSizeMedium: SizeSemanticToken { dimension4XS } + @objc open var sizeIconWithLabelMediumSizeTall: SizeSemanticToken { dimension3XS } - @objc open var sizeIconWithLabelSmallSizeShort: SizingSemanticToken { dimension6XS } - @objc open var sizeIconWithLabelSmallSizeMedium: SizingSemanticToken { dimension5XS } - @objc open var sizeIconWithLabelSmallSizeTall: SizingSemanticToken { dimension4XS } + @objc open var sizeIconWithLabelSmallSizeShort: SizeSemanticToken { dimension6XS } + @objc open var sizeIconWithLabelSmallSizeMedium: SizeSemanticToken { dimension5XS } + @objc open var sizeIconWithLabelSmallSizeTall: SizeSemanticToken { dimension4XS } // MARK: - Semantic token - Sizing - Icon decorative - @objc open var sizeIconDecorativeShortest: SizingSemanticToken { DimensionRawTokens.dimension200 } - @objc open var sizeIconDecorativeShorter: SizingSemanticToken { DimensionRawTokens.dimension300 } - @objc open var sizeIconDecorativeShort: SizingSemanticToken { DimensionRawTokens.dimension400 } - @objc open var sizeIconDecorativeMedium: SizingSemanticToken { DimensionRawTokens.dimension500 } - @objc open var sizeIconDecorativeTall: SizingSemanticToken { DimensionRawTokens.dimension600 } - @objc open var sizeIconDecorativeTaller: SizingSemanticToken { DimensionRawTokens.dimension700 } - @objc open var sizeIconDecorativeTallest: SizingSemanticToken { DimensionRawTokens.dimension900 } + @objc open var sizeIconDecorativeShortest: SizeSemanticToken { DimensionRawTokens.dimension200 } + @objc open var sizeIconDecorativeShorter: SizeSemanticToken { DimensionRawTokens.dimension300 } + @objc open var sizeIconDecorativeShort: SizeSemanticToken { DimensionRawTokens.dimension400 } + @objc open var sizeIconDecorativeMedium: SizeSemanticToken { DimensionRawTokens.dimension500 } + @objc open var sizeIconDecorativeTall: SizeSemanticToken { DimensionRawTokens.dimension600 } + @objc open var sizeIconDecorativeTaller: SizeSemanticToken { DimensionRawTokens.dimension700 } + @objc open var sizeIconDecorativeTallest: SizeSemanticToken { DimensionRawTokens.dimension900 } // MARK: - Semantic token - Sizing - Max width typography - @objc open var sizeMaxWidthTypeDisplaySmall: MultipleSizingTokens { MultipleSizingTokens(DimensionRawTokens.dimension9000) } - @objc open var sizeMaxWidthTypeDisplayMedium: MultipleSizingTokens { MultipleSizingTokens(DimensionRawTokens.dimension9000) } - @objc open var sizeMaxWidthTypeDisplayLarge: MultipleSizingTokens { MultipleSizingTokens(DimensionRawTokens.dimension9000) } + @objc open var sizeMaxWidthTypeDisplaySmall: MultipleSizeTokens { MultipleSizeTokens(DimensionRawTokens.dimension9000) } + @objc open var sizeMaxWidthTypeDisplayMedium: MultipleSizeTokens { MultipleSizeTokens(DimensionRawTokens.dimension9000) } + @objc open var sizeMaxWidthTypeDisplayLarge: MultipleSizeTokens { MultipleSizeTokens(DimensionRawTokens.dimension9000) } - @objc open var sizeMaxWidthTypeHeadingXLarge: MultipleSizingTokens { MultipleSizingTokens(DimensionRawTokens.dimension9000) } - @objc open var sizeMaxWidthTypeHeadingLarge: MultipleSizingTokens { MultipleSizingTokens(DimensionRawTokens.dimension9000) } - @objc open var sizeMaxWidthTypeHeadingMedium: MultipleSizingTokens { MultipleSizingTokens(DimensionRawTokens.dimension9000) } - @objc open var sizeMaxWidthTypeHeadingSmall: MultipleSizingTokens { MultipleSizingTokens(DimensionRawTokens.dimension6000) } + @objc open var sizeMaxWidthTypeHeadingXLarge: MultipleSizeTokens { MultipleSizeTokens(DimensionRawTokens.dimension9000) } + @objc open var sizeMaxWidthTypeHeadingLarge: MultipleSizeTokens { MultipleSizeTokens(DimensionRawTokens.dimension9000) } + @objc open var sizeMaxWidthTypeHeadingMedium: MultipleSizeTokens { MultipleSizeTokens(DimensionRawTokens.dimension9000) } + @objc open var sizeMaxWidthTypeHeadingSmall: MultipleSizeTokens { MultipleSizeTokens(DimensionRawTokens.dimension6000) } - @objc open var sizeMaxWidthTypeBodySmall: MultipleSizingTokens { MultipleSizingTokens(DimensionRawTokens.dimension6000) } - @objc open var sizeMaxWidthTypeBodyMedium: MultipleSizingTokens { MultipleSizingTokens(DimensionRawTokens.dimension6000) } - @objc open var sizeMaxWidthTypeBodyLarge: MultipleSizingTokens { MultipleSizingTokens(DimensionRawTokens.dimension6000) } + @objc open var sizeMaxWidthTypeBodySmall: MultipleSizeTokens { MultipleSizeTokens(DimensionRawTokens.dimension6000) } + @objc open var sizeMaxWidthTypeBodyMedium: MultipleSizeTokens { MultipleSizeTokens(DimensionRawTokens.dimension6000) } + @objc open var sizeMaxWidthTypeBodyLarge: MultipleSizeTokens { MultipleSizeTokens(DimensionRawTokens.dimension6000) } } - -// swiftlint:enable line_length diff --git a/OUDS/Core/OUDS/Sources/OUDSTheme/OUDSTheme+SemanticTokens/OUDSTheme+SpacingSemanticTokens.swift b/OUDS/Core/OUDS/Sources/OUDSTheme/OUDSTheme+SemanticTokens/OUDSTheme+SpacingSemanticTokens.swift index 00473ec23..511ead303 100644 --- a/OUDS/Core/OUDS/Sources/OUDSTheme/OUDSTheme+SemanticTokens/OUDSTheme+SpacingSemanticTokens.swift +++ b/OUDS/Core/OUDS/Sources/OUDSTheme/OUDSTheme+SemanticTokens/OUDSTheme+SpacingSemanticTokens.swift @@ -18,133 +18,133 @@ import OUDSTokensSemantic // ଘ( ・ω・)_/゚・:*:・。☆ // [File to generate with the tokenator] -/// Defines basic values common to all themes for `SpacingSemanticTokens`. +/// Defines basic values common to all themes for `SpaceSemanticTokens`. /// These values can be overriden inside `OUDSTheme` subclasses (in extensions or not, in the same module or not) thanks to the `@objc open` combination. -extension OUDSTheme: SpacingSemanticTokens { +extension OUDSTheme: SpaceSemanticTokens { // MARK: Semantic token - Spacing - Layout fluid - @objc open var spaceScaledNone: MultipleSpacingTokens { MultipleSpacingTokens(compact: DimensionRawTokens.dimension0, regular: DimensionRawTokens.dimension0) } - @objc open var spaceScaledSmash: MultipleSpacingTokens { MultipleSpacingTokens(compact: DimensionRawTokens.dimension25, regular: DimensionRawTokens.dimension50) } - @objc open var spaceScaledShortest: MultipleSpacingTokens { MultipleSpacingTokens(compact: DimensionRawTokens.dimension50, regular: DimensionRawTokens.dimension100) } - @objc open var spaceScaledShorter: MultipleSpacingTokens { MultipleSpacingTokens(compact: DimensionRawTokens.dimension100, regular: DimensionRawTokens.dimension150) } - @objc open var spaceScaledShort: MultipleSpacingTokens { MultipleSpacingTokens(compact: DimensionRawTokens.dimension150, regular: DimensionRawTokens.dimension200) } - @objc open var spaceScaledMedium: MultipleSpacingTokens { MultipleSpacingTokens(compact: DimensionRawTokens.dimension200, regular: DimensionRawTokens.dimension300) } - @objc open var spaceScaledTall: MultipleSpacingTokens { MultipleSpacingTokens(compact: DimensionRawTokens.dimension300, regular: DimensionRawTokens.dimension400) } - @objc open var spaceScaledTaller: MultipleSpacingTokens { MultipleSpacingTokens(compact: DimensionRawTokens.dimension400, regular: DimensionRawTokens.dimension500) } - @objc open var spaceScaledTallest: MultipleSpacingTokens { MultipleSpacingTokens(compact: DimensionRawTokens.dimension500, regular: DimensionRawTokens.dimension600) } - @objc open var spaceScaledSpacious: MultipleSpacingTokens { MultipleSpacingTokens(compact: DimensionRawTokens.dimension600, regular: DimensionRawTokens.dimension700) } + @objc open var spaceScaledNone: MultipleSpaceTokens { MultipleSpaceTokens(compact: DimensionRawTokens.dimension0, regular: DimensionRawTokens.dimension0) } + @objc open var spaceScaledSmash: MultipleSpaceTokens { MultipleSpaceTokens(compact: DimensionRawTokens.dimension25, regular: DimensionRawTokens.dimension50) } + @objc open var spaceScaledShortest: MultipleSpaceTokens { MultipleSpaceTokens(compact: DimensionRawTokens.dimension50, regular: DimensionRawTokens.dimension100) } + @objc open var spaceScaledShorter: MultipleSpaceTokens { MultipleSpaceTokens(compact: DimensionRawTokens.dimension100, regular: DimensionRawTokens.dimension150) } + @objc open var spaceScaledShort: MultipleSpaceTokens { MultipleSpaceTokens(compact: DimensionRawTokens.dimension150, regular: DimensionRawTokens.dimension200) } + @objc open var spaceScaledMedium: MultipleSpaceTokens { MultipleSpaceTokens(compact: DimensionRawTokens.dimension200, regular: DimensionRawTokens.dimension300) } + @objc open var spaceScaledTall: MultipleSpaceTokens { MultipleSpaceTokens(compact: DimensionRawTokens.dimension300, regular: DimensionRawTokens.dimension400) } + @objc open var spaceScaledTaller: MultipleSpaceTokens { MultipleSpaceTokens(compact: DimensionRawTokens.dimension400, regular: DimensionRawTokens.dimension500) } + @objc open var spaceScaledTallest: MultipleSpaceTokens { MultipleSpaceTokens(compact: DimensionRawTokens.dimension500, regular: DimensionRawTokens.dimension600) } + @objc open var spaceScaledSpacious: MultipleSpaceTokens { MultipleSpaceTokens(compact: DimensionRawTokens.dimension600, regular: DimensionRawTokens.dimension700) } // MARK: Semantic token - Spacing - Layout fix - @objc open var spaceFixedNone: SpacingSemanticToken { DimensionRawTokens.dimension0 } - @objc open var spaceFixedSmash: SpacingSemanticToken { DimensionRawTokens.dimension25 } - @objc open var spaceFixedShortest: SpacingSemanticToken { DimensionRawTokens.dimension50 } - @objc open var spaceFixedShorter: SpacingSemanticToken { DimensionRawTokens.dimension100 } - @objc open var spaceFixedShort: SpacingSemanticToken { DimensionRawTokens.dimension150 } - @objc open var spaceFixedMedium: SpacingSemanticToken { DimensionRawTokens.dimension200 } - @objc open var spaceFixedTall: SpacingSemanticToken { DimensionRawTokens.dimension300 } - @objc open var spaceFixedTaller: SpacingSemanticToken { DimensionRawTokens.dimension400 } - @objc open var spaceFixedTallest: SpacingSemanticToken { DimensionRawTokens.dimension500 } - @objc open var spaceFixedSpacious: SpacingSemanticToken { DimensionRawTokens.dimension600 } - @objc open var spaceFixedHuge: SpacingSemanticToken { DimensionRawTokens.dimension700 } - @objc open var spaceFixedJumbo: SpacingSemanticToken { DimensionRawTokens.dimension800 } + @objc open var spaceFixedNone: SpaceSemanticToken { DimensionRawTokens.dimension0 } + @objc open var spaceFixedSmash: SpaceSemanticToken { DimensionRawTokens.dimension25 } + @objc open var spaceFixedShortest: SpaceSemanticToken { DimensionRawTokens.dimension50 } + @objc open var spaceFixedShorter: SpaceSemanticToken { DimensionRawTokens.dimension100 } + @objc open var spaceFixedShort: SpaceSemanticToken { DimensionRawTokens.dimension150 } + @objc open var spaceFixedMedium: SpaceSemanticToken { DimensionRawTokens.dimension200 } + @objc open var spaceFixedTall: SpaceSemanticToken { DimensionRawTokens.dimension300 } + @objc open var spaceFixedTaller: SpaceSemanticToken { DimensionRawTokens.dimension400 } + @objc open var spaceFixedTallest: SpaceSemanticToken { DimensionRawTokens.dimension500 } + @objc open var spaceFixedSpacious: SpaceSemanticToken { DimensionRawTokens.dimension600 } + @objc open var spaceFixedHuge: SpaceSemanticToken { DimensionRawTokens.dimension700 } + @objc open var spaceFixedJumbo: SpaceSemanticToken { DimensionRawTokens.dimension800 } // MARK: Semantic token - Spacing - Padding - Padding inline - @objc open var spacePaddingInlineNone: SpacingPaddingInlineSemanticToken { DimensionRawTokens.dimension0 } - @objc open var spacePaddingInlineShorter: SpacingPaddingInlineSemanticToken { DimensionRawTokens.dimension50 } - @objc open var spacePaddingInlineShort: SpacingPaddingInlineSemanticToken { DimensionRawTokens.dimension100 } - @objc open var spacePaddingInlineMedium: SpacingPaddingInlineSemanticToken { DimensionRawTokens.dimension200 } - @objc open var spacePaddingInlineTall: SpacingPaddingInlineSemanticToken { DimensionRawTokens.dimension300 } - @objc open var spacePaddingInlineTaller: SpacingPaddingInlineSemanticToken { DimensionRawTokens.dimension350 } - @objc open var spacePaddingInlineTallest: SpacingPaddingInlineSemanticToken { DimensionRawTokens.dimension400 } - - @objc open var spacePaddingInlineWithIconNone: SpacingPaddingInlineSemanticToken { dimensionNone } - @objc open var spacePaddingInlineWithIconShortest: SpacingPaddingInlineSemanticToken { dimension10XS } - @objc open var spacePaddingInlineWithIconShorter: SpacingPaddingInlineSemanticToken { dimension9XS } - @objc open var spacePaddingInlineWithIconShort: SpacingPaddingInlineSemanticToken { dimension7XS } - @objc open var spacePaddingInlineWithIconMedium: SpacingPaddingInlineSemanticToken { dimension5XS } - @objc open var spacePaddingInlineWithIconTall: SpacingPaddingInlineSemanticToken { dimension4XS } - @objc open var spacePaddingInlineWithIconTaller: SpacingPaddingInlineSemanticToken { dimension3XS } - @objc open var spacePaddingInlineWithIconTallest: SpacingPaddingInlineSemanticToken { dimension2XS } - - @objc open var spacePaddingInlineWithArrowNone: SpacingPaddingInlineSemanticToken { dimensionNone } - @objc open var spacePaddingInlineWithArrowShortest: SpacingPaddingInlineSemanticToken { dimension10XS } - @objc open var spacePaddingInlineWithArrowShorter: SpacingPaddingInlineSemanticToken { dimension9XS } - @objc open var spacePaddingInlineWithArrowShort: SpacingPaddingInlineSemanticToken { dimension8XS } - @objc open var spacePaddingInlineWithArrowMedium: SpacingPaddingInlineSemanticToken { dimension7XS } - @objc open var spacePaddingInlineWithArrowTall: SpacingPaddingInlineSemanticToken { dimension5XS } - @objc open var spacePaddingInlineWithArrowTaller: SpacingPaddingInlineSemanticToken { dimension4XS } - @objc open var spacePaddingInlineWithArrowTallest: SpacingPaddingInlineSemanticToken { dimension3XS } + @objc open var spacePaddingInlineNone: SpacePaddingInlineSemanticToken { DimensionRawTokens.dimension0 } + @objc open var spacePaddingInlineShorter: SpacePaddingInlineSemanticToken { DimensionRawTokens.dimension50 } + @objc open var spacePaddingInlineShort: SpacePaddingInlineSemanticToken { DimensionRawTokens.dimension100 } + @objc open var spacePaddingInlineMedium: SpacePaddingInlineSemanticToken { DimensionRawTokens.dimension200 } + @objc open var spacePaddingInlineTall: SpacePaddingInlineSemanticToken { DimensionRawTokens.dimension300 } + @objc open var spacePaddingInlineTaller: SpacePaddingInlineSemanticToken { DimensionRawTokens.dimension350 } + @objc open var spacePaddingInlineTallest: SpacePaddingInlineSemanticToken { DimensionRawTokens.dimension400 } + + @objc open var spacePaddingInlineWithIconNone: SpacePaddingInlineSemanticToken { dimensionNone } + @objc open var spacePaddingInlineWithIconShortest: SpacePaddingInlineSemanticToken { dimension10XS } + @objc open var spacePaddingInlineWithIconShorter: SpacePaddingInlineSemanticToken { dimension9XS } + @objc open var spacePaddingInlineWithIconShort: SpacePaddingInlineSemanticToken { dimension7XS } + @objc open var spacePaddingInlineWithIconMedium: SpacePaddingInlineSemanticToken { dimension5XS } + @objc open var spacePaddingInlineWithIconTall: SpacePaddingInlineSemanticToken { dimension4XS } + @objc open var spacePaddingInlineWithIconTaller: SpacePaddingInlineSemanticToken { dimension3XS } + @objc open var spacePaddingInlineWithIconTallest: SpacePaddingInlineSemanticToken { dimension2XS } + + @objc open var spacePaddingInlineWithArrowNone: SpacePaddingInlineSemanticToken { dimensionNone } + @objc open var spacePaddingInlineWithArrowShortest: SpacePaddingInlineSemanticToken { dimension10XS } + @objc open var spacePaddingInlineWithArrowShorter: SpacePaddingInlineSemanticToken { dimension9XS } + @objc open var spacePaddingInlineWithArrowShort: SpacePaddingInlineSemanticToken { dimension8XS } + @objc open var spacePaddingInlineWithArrowMedium: SpacePaddingInlineSemanticToken { dimension7XS } + @objc open var spacePaddingInlineWithArrowTall: SpacePaddingInlineSemanticToken { dimension5XS } + @objc open var spacePaddingInlineWithArrowTaller: SpacePaddingInlineSemanticToken { dimension4XS } + @objc open var spacePaddingInlineWithArrowTallest: SpacePaddingInlineSemanticToken { dimension3XS } // MARK: Semantic token - Padding - Padding stack - @objc open var spacePaddingBlockNone: SpacingPaddingInlineSemanticToken { dimensionNone } - @objc open var spacePaddingBlockShorter: SpacingPaddingInlineSemanticToken { dimension9XS } - @objc open var spacePaddingBlockShort: SpacingPaddingInlineSemanticToken { dimension7XS } - @objc open var spacePaddingBlockMedium: SpacingPaddingInlineSemanticToken { dimension6XS } - @objc open var spacePaddingBlockTall: SpacingPaddingInlineSemanticToken { dimension5XS } - @objc open var spacePaddingBlockTaller: SpacingPaddingInlineSemanticToken { dimension3XS } - @objc open var spacePaddingBlockTallest: SpacingPaddingInlineSemanticToken { dimensionXS } - - @objc open var spacePaddingBlockWithIconNone: SpacingPaddingInlineSemanticToken { dimensionNone } - @objc open var spacePaddingBlockWithIconShortest: SpacingPaddingInlineSemanticToken { dimension10XS } - @objc open var spacePaddingBlockWithIconShorter: SpacingPaddingInlineSemanticToken { dimension9XS } - @objc open var spacePaddingBlockWithIconShort: SpacingPaddingInlineSemanticToken { dimension8XS } - @objc open var spacePaddingBlockWithIconMedium: SpacingPaddingInlineSemanticToken { dimension7XS } - @objc open var spacePaddingBlockWithIconTall: SpacingPaddingInlineSemanticToken { dimension6XS } - @objc open var spacePaddingBlockWithIconTaller: SpacingPaddingInlineSemanticToken { dimension5XS } + @objc open var spacePaddingBlockNone: SpacePaddingInlineSemanticToken { dimensionNone } + @objc open var spacePaddingBlockShorter: SpacePaddingInlineSemanticToken { dimension9XS } + @objc open var spacePaddingBlockShort: SpacePaddingInlineSemanticToken { dimension7XS } + @objc open var spacePaddingBlockMedium: SpacePaddingInlineSemanticToken { dimension6XS } + @objc open var spacePaddingBlockTall: SpacePaddingInlineSemanticToken { dimension5XS } + @objc open var spacePaddingBlockTaller: SpacePaddingInlineSemanticToken { dimension3XS } + @objc open var spacePaddingBlockTallest: SpacePaddingInlineSemanticToken { dimensionXS } + + @objc open var spacePaddingBlockWithIconNone: SpacePaddingInlineSemanticToken { dimensionNone } + @objc open var spacePaddingBlockWithIconShortest: SpacePaddingInlineSemanticToken { dimension10XS } + @objc open var spacePaddingBlockWithIconShorter: SpacePaddingInlineSemanticToken { dimension9XS } + @objc open var spacePaddingBlockWithIconShort: SpacePaddingInlineSemanticToken { dimension8XS } + @objc open var spacePaddingBlockWithIconMedium: SpacePaddingInlineSemanticToken { dimension7XS } + @objc open var spacePaddingBlockWithIconTall: SpacePaddingInlineSemanticToken { dimension6XS } + @objc open var spacePaddingBlockWithIconTaller: SpacePaddingInlineSemanticToken { dimension5XS } // MARK: Semantic token - Space - Padding inset - @objc open var spaceInsetNone: SpacingPaddingInlineSemanticToken { dimensionNone } - @objc open var spaceInsetSmash: SpacingPaddingInlineSemanticToken { dimension10XS } - @objc open var spaceInsetShortest: SpacingPaddingInlineSemanticToken { dimension9XS } - @objc open var spaceInsetShorter: SpacingPaddingInlineSemanticToken { dimension8XS } - @objc open var spaceInsetShort: SpacingPaddingInlineSemanticToken { dimension7XS } - @objc open var spaceInsetMedium: SpacingPaddingInlineSemanticToken { dimension6XS } - @objc open var spaceInsetTall: SpacingPaddingInlineSemanticToken { dimension5XS } - @objc open var spaceInsetTaller: SpacingPaddingInlineSemanticToken { dimension3XS } - @objc open var spaceInsetTallest: SpacingPaddingInlineSemanticToken { dimensionXS } - @objc open var spaceInsetSpacious: SpacingPaddingInlineSemanticToken { dimensionMD } + @objc open var spaceInsetNone: SpacePaddingInlineSemanticToken { dimensionNone } + @objc open var spaceInsetSmash: SpacePaddingInlineSemanticToken { dimension10XS } + @objc open var spaceInsetShortest: SpacePaddingInlineSemanticToken { dimension9XS } + @objc open var spaceInsetShorter: SpacePaddingInlineSemanticToken { dimension8XS } + @objc open var spaceInsetShort: SpacePaddingInlineSemanticToken { dimension7XS } + @objc open var spaceInsetMedium: SpacePaddingInlineSemanticToken { dimension6XS } + @objc open var spaceInsetTall: SpacePaddingInlineSemanticToken { dimension5XS } + @objc open var spaceInsetTaller: SpacePaddingInlineSemanticToken { dimension3XS } + @objc open var spaceInsetTallest: SpacePaddingInlineSemanticToken { dimensionXS } + @objc open var spaceInsetSpacious: SpacePaddingInlineSemanticToken { dimensionMD } // MARK: Semantic token - Padding - Gap inline - @objc open var spaceColumnGapNone: SpacingPaddingInlineSemanticToken { dimensionNone } - @objc open var spaceColumnGapShorter: SpacingPaddingInlineSemanticToken { dimension9XS } - @objc open var spaceColumnGapShort: SpacingPaddingInlineSemanticToken { dimension7XS } - @objc open var spaceColumnGapMedium: SpacingPaddingInlineSemanticToken { dimension5XS } - @objc open var spaceColumnGapTall: SpacingPaddingInlineSemanticToken { dimension3XS } - @objc open var spaceColumnGapTaller: SpacingPaddingInlineSemanticToken { dimensionXS } - - @objc open var spaceColumnGapWithIconNone: SpacingPaddingInlineSemanticToken { dimensionNone } - @objc open var spaceColumnGapWithIconShortest: SpacingPaddingInlineSemanticToken { dimension10XS } - @objc open var spaceColumnGapWithIconShorter: SpacingPaddingInlineSemanticToken { dimension9XS } - @objc open var spaceColumnGapWithIconShort: SpacingPaddingInlineSemanticToken { dimension8XS } - @objc open var spaceColumnGapWithIconMedium: SpacingPaddingInlineSemanticToken { dimension7XS } - @objc open var spaceColumnGapWithIconTall: SpacingPaddingInlineSemanticToken { dimension5XS } - - @objc open var spaceColumnGapWithArrowNone: SpacingPaddingInlineSemanticToken { dimensionNone } - @objc open var spaceColumnGapWithArrowShortest: SpacingPaddingInlineSemanticToken { dimension10XS } - @objc open var spaceColumnGapWithArrowShorter: SpacingPaddingInlineSemanticToken { dimension9XS } - @objc open var spaceColumnGapWithArrowShort: SpacingPaddingInlineSemanticToken { dimension8XS } - @objc open var spaceColumnGapWithArrowMedium: SpacingPaddingInlineSemanticToken { dimension7XS } - @objc open var spaceColumnGapWithArrowTall: SpacingPaddingInlineSemanticToken { dimension5XS } + @objc open var spaceColumnGapNone: SpacePaddingInlineSemanticToken { dimensionNone } + @objc open var spaceColumnGapShorter: SpacePaddingInlineSemanticToken { dimension9XS } + @objc open var spaceColumnGapShort: SpacePaddingInlineSemanticToken { dimension7XS } + @objc open var spaceColumnGapMedium: SpacePaddingInlineSemanticToken { dimension5XS } + @objc open var spaceColumnGapTall: SpacePaddingInlineSemanticToken { dimension3XS } + @objc open var spaceColumnGapTaller: SpacePaddingInlineSemanticToken { dimensionXS } + + @objc open var spaceColumnGapWithIconNone: SpacePaddingInlineSemanticToken { dimensionNone } + @objc open var spaceColumnGapWithIconShortest: SpacePaddingInlineSemanticToken { dimension10XS } + @objc open var spaceColumnGapWithIconShorter: SpacePaddingInlineSemanticToken { dimension9XS } + @objc open var spaceColumnGapWithIconShort: SpacePaddingInlineSemanticToken { dimension8XS } + @objc open var spaceColumnGapWithIconMedium: SpacePaddingInlineSemanticToken { dimension7XS } + @objc open var spaceColumnGapWithIconTall: SpacePaddingInlineSemanticToken { dimension5XS } + + @objc open var spaceColumnGapWithArrowNone: SpacePaddingInlineSemanticToken { dimensionNone } + @objc open var spaceColumnGapWithArrowShortest: SpacePaddingInlineSemanticToken { dimension10XS } + @objc open var spaceColumnGapWithArrowShorter: SpacePaddingInlineSemanticToken { dimension9XS } + @objc open var spaceColumnGapWithArrowShort: SpacePaddingInlineSemanticToken { dimension8XS } + @objc open var spaceColumnGapWithArrowMedium: SpacePaddingInlineSemanticToken { dimension7XS } + @objc open var spaceColumnGapWithArrowTall: SpacePaddingInlineSemanticToken { dimension5XS } // MARK: Semantic token - Padding - Gap stack - @objc open var spaceRowGapNone: SpacingGapStackSemanticToken { dimensionNone } - @objc open var spaceRowGapShortest: SpacingGapStackSemanticToken { dimension10XS } - @objc open var spaceRowGapShorter: SpacingGapStackSemanticToken { dimension9XS } - @objc open var spaceRowGapShort: SpacingGapStackSemanticToken { dimension8XS } - @objc open var spaceRowGapMedium: SpacingGapStackSemanticToken { dimension7XS } - @objc open var spaceRowGapTall: SpacingGapStackSemanticToken { dimension5XS } - - @objc open var spaceRowGapWithIconNone: SpacingGapStackSemanticToken { dimensionNone } - @objc open var spaceRowGapWithIconShortest: SpacingGapStackSemanticToken { dimension10XS } - @objc open var spaceRowGapWithIconShorter: SpacingGapStackSemanticToken { dimension9XS } - @objc open var spaceRowGapWithIconShort: SpacingGapStackSemanticToken { dimension8XS } - @objc open var spaceRowGapWithIconMedium: SpacingGapStackSemanticToken { dimension7XS } - @objc open var spaceRowGapWithIconTall: SpacingGapStackSemanticToken { dimension5XS } + @objc open var spaceRowGapNone: SpaceGapStackSemanticToken { dimensionNone } + @objc open var spaceRowGapShortest: SpaceGapStackSemanticToken { dimension10XS } + @objc open var spaceRowGapShorter: SpaceGapStackSemanticToken { dimension9XS } + @objc open var spaceRowGapShort: SpaceGapStackSemanticToken { dimension8XS } + @objc open var spaceRowGapMedium: SpaceGapStackSemanticToken { dimension7XS } + @objc open var spaceRowGapTall: SpaceGapStackSemanticToken { dimension5XS } + + @objc open var spaceRowGapWithIconNone: SpaceGapStackSemanticToken { dimensionNone } + @objc open var spaceRowGapWithIconShortest: SpaceGapStackSemanticToken { dimension10XS } + @objc open var spaceRowGapWithIconShorter: SpaceGapStackSemanticToken { dimension9XS } + @objc open var spaceRowGapWithIconShort: SpaceGapStackSemanticToken { dimension8XS } + @objc open var spaceRowGapWithIconMedium: SpaceGapStackSemanticToken { dimension7XS } + @objc open var spaceRowGapWithIconTall: SpaceGapStackSemanticToken { dimension5XS } } diff --git a/OUDS/Core/OUDS/Tests/OUDSTheme/MockThemes/MockTheme+SizingSemanticTokens.swift b/OUDS/Core/OUDS/Tests/OUDSTheme/MockThemes/MockTheme+SizingSemanticTokens.swift index 549f40169..97b805c75 100644 --- a/OUDS/Core/OUDS/Tests/OUDSTheme/MockThemes/MockTheme+SizingSemanticTokens.swift +++ b/OUDS/Core/OUDS/Tests/OUDSTheme/MockThemes/MockTheme+SizingSemanticTokens.swift @@ -17,78 +17,78 @@ import OUDSTokensSemantic extension MockTheme { static let mockThemeSizeRawToken: DimensionRawToken = 118_000 - static let mockThemeSizeCompositeToken = MultipleSizingTokens(compact: 1, regular: 151) + static let mockThemeSizeCompositeToken = MultipleSizeTokens(compact: 1, regular: 151) // MARK: - Semantic token - Sizing - Icon with typography - override open var sizeIconWithHeadingXLargeShort: MultipleSizingTokens { Self.mockThemeSizeCompositeToken } - override open var sizeIconWithHeadingXLargeMedium: MultipleSizingTokens { Self.mockThemeSizeCompositeToken } - override open var sizeIconWithHeadingXLargeTall: MultipleSizingTokens { Self.mockThemeSizeCompositeToken } + override open var sizeIconWithHeadingXLargeShort: MultipleSizeTokens { Self.mockThemeSizeCompositeToken } + override open var sizeIconWithHeadingXLargeMedium: MultipleSizeTokens { Self.mockThemeSizeCompositeToken } + override open var sizeIconWithHeadingXLargeTall: MultipleSizeTokens { Self.mockThemeSizeCompositeToken } - override open var sizeIconWithHeadingLargeShort: MultipleSizingTokens { Self.mockThemeSizeCompositeToken } - override open var sizeIconWithHeadingLargeMedium: MultipleSizingTokens { Self.mockThemeSizeCompositeToken } - override open var sizeIconWithHeadingLargeTall: MultipleSizingTokens { Self.mockThemeSizeCompositeToken } + override open var sizeIconWithHeadingLargeShort: MultipleSizeTokens { Self.mockThemeSizeCompositeToken } + override open var sizeIconWithHeadingLargeMedium: MultipleSizeTokens { Self.mockThemeSizeCompositeToken } + override open var sizeIconWithHeadingLargeTall: MultipleSizeTokens { Self.mockThemeSizeCompositeToken } - override open var sizeIconWithHeadingMediumShort: MultipleSizingTokens { Self.mockThemeSizeCompositeToken } - override open var sizeIconWithHeadingMediumMedium: MultipleSizingTokens { Self.mockThemeSizeCompositeToken } - override open var sizeIconWithHeadingMediumTall: MultipleSizingTokens { Self.mockThemeSizeCompositeToken } + override open var sizeIconWithHeadingMediumShort: MultipleSizeTokens { Self.mockThemeSizeCompositeToken } + override open var sizeIconWithHeadingMediumMedium: MultipleSizeTokens { Self.mockThemeSizeCompositeToken } + override open var sizeIconWithHeadingMediumTall: MultipleSizeTokens { Self.mockThemeSizeCompositeToken } - override open var sizeIconWithHeadingSmallShort: MultipleSizingTokens { Self.mockThemeSizeCompositeToken } - override open var sizeIconWithHeadingSmallMedium: MultipleSizingTokens { Self.mockThemeSizeCompositeToken } - override open var sizeIconWithHeadingSmallTall: MultipleSizingTokens { Self.mockThemeSizeCompositeToken } + override open var sizeIconWithHeadingSmallShort: MultipleSizeTokens { Self.mockThemeSizeCompositeToken } + override open var sizeIconWithHeadingSmallMedium: MultipleSizeTokens { Self.mockThemeSizeCompositeToken } + override open var sizeIconWithHeadingSmallTall: MultipleSizeTokens { Self.mockThemeSizeCompositeToken } - override open var sizeIconWithBodyLargeShort: MultipleSizingTokens { Self.mockThemeSizeCompositeToken } - override open var sizeIconWithBodyLargeMedium: MultipleSizingTokens { Self.mockThemeSizeCompositeToken } - override open var sizeIconWithBodyLargeTall: MultipleSizingTokens { Self.mockThemeSizeCompositeToken } + override open var sizeIconWithBodyLargeShort: MultipleSizeTokens { Self.mockThemeSizeCompositeToken } + override open var sizeIconWithBodyLargeMedium: MultipleSizeTokens { Self.mockThemeSizeCompositeToken } + override open var sizeIconWithBodyLargeTall: MultipleSizeTokens { Self.mockThemeSizeCompositeToken } - override open var sizeIconWithBodyMediumShort: MultipleSizingTokens { Self.mockThemeSizeCompositeToken } - override open var sizeIconWithBodyMediumMedium: MultipleSizingTokens { Self.mockThemeSizeCompositeToken } - override open var sizeIconWithBodyMediumTall: MultipleSizingTokens { Self.mockThemeSizeCompositeToken } + override open var sizeIconWithBodyMediumShort: MultipleSizeTokens { Self.mockThemeSizeCompositeToken } + override open var sizeIconWithBodyMediumMedium: MultipleSizeTokens { Self.mockThemeSizeCompositeToken } + override open var sizeIconWithBodyMediumTall: MultipleSizeTokens { Self.mockThemeSizeCompositeToken } - override open var sizeIconWithBodySmallShort: MultipleSizingTokens { Self.mockThemeSizeCompositeToken } - override open var sizeIconWithBodySmallMedium: MultipleSizingTokens { Self.mockThemeSizeCompositeToken } - override open var sizeIconWithBodySmallTall: MultipleSizingTokens { Self.mockThemeSizeCompositeToken } + override open var sizeIconWithBodySmallShort: MultipleSizeTokens { Self.mockThemeSizeCompositeToken } + override open var sizeIconWithBodySmallMedium: MultipleSizeTokens { Self.mockThemeSizeCompositeToken } + override open var sizeIconWithBodySmallTall: MultipleSizeTokens { Self.mockThemeSizeCompositeToken } - override open var sizeIconWithLabelXLargeSizeShort: SizingSemanticToken { Self.mockThemeSizeRawToken } - override open var sizeIconWithLabelXLargeSizeMedium: SizingSemanticToken { Self.mockThemeSizeRawToken } - override open var sizeIconWithLabelXLargeSizeTall: SizingSemanticToken { Self.mockThemeSizeRawToken } + override open var sizeIconWithLabelXLargeSizeShort: SizeSemanticToken { Self.mockThemeSizeRawToken } + override open var sizeIconWithLabelXLargeSizeMedium: SizeSemanticToken { Self.mockThemeSizeRawToken } + override open var sizeIconWithLabelXLargeSizeTall: SizeSemanticToken { Self.mockThemeSizeRawToken } - override open var sizeIconWithLabelLargeSizeShorter: SizingSemanticToken { Self.mockThemeSizeRawToken } - override open var sizeIconWithLabelLargeSizeShort: SizingSemanticToken { Self.mockThemeSizeRawToken } - override open var sizeIconWithLabelLargeSizeMedium: SizingSemanticToken { Self.mockThemeSizeRawToken } - override open var sizeIconWithLabelLargeSizeTall: SizingSemanticToken { Self.mockThemeSizeRawToken } - override open var sizeIconWithLabelLargeSizeTaller: SizingSemanticToken { Self.mockThemeSizeRawToken } + override open var sizeIconWithLabelLargeSizeShorter: SizeSemanticToken { Self.mockThemeSizeRawToken } + override open var sizeIconWithLabelLargeSizeShort: SizeSemanticToken { Self.mockThemeSizeRawToken } + override open var sizeIconWithLabelLargeSizeMedium: SizeSemanticToken { Self.mockThemeSizeRawToken } + override open var sizeIconWithLabelLargeSizeTall: SizeSemanticToken { Self.mockThemeSizeRawToken } + override open var sizeIconWithLabelLargeSizeTaller: SizeSemanticToken { Self.mockThemeSizeRawToken } - override open var sizeIconWithLabelMediumSizeShort: SizingSemanticToken { Self.mockThemeSizeRawToken } - override open var sizeIconWithLabelMediumSizeMedium: SizingSemanticToken { Self.mockThemeSizeRawToken } - override open var sizeIconWithLabelMediumSizeTall: SizingSemanticToken { Self.mockThemeSizeRawToken } + override open var sizeIconWithLabelMediumSizeShort: SizeSemanticToken { Self.mockThemeSizeRawToken } + override open var sizeIconWithLabelMediumSizeMedium: SizeSemanticToken { Self.mockThemeSizeRawToken } + override open var sizeIconWithLabelMediumSizeTall: SizeSemanticToken { Self.mockThemeSizeRawToken } - override open var sizeIconWithLabelSmallSizeShort: SizingSemanticToken { Self.mockThemeSizeRawToken } - override open var sizeIconWithLabelSmallSizeMedium: SizingSemanticToken { Self.mockThemeSizeRawToken } - override open var sizeIconWithLabelSmallSizeTall: SizingSemanticToken { Self.mockThemeSizeRawToken } + override open var sizeIconWithLabelSmallSizeShort: SizeSemanticToken { Self.mockThemeSizeRawToken } + override open var sizeIconWithLabelSmallSizeMedium: SizeSemanticToken { Self.mockThemeSizeRawToken } + override open var sizeIconWithLabelSmallSizeTall: SizeSemanticToken { Self.mockThemeSizeRawToken } // MARK: - Semantic token - Sizing - Icon decorative - override open var sizeIconDecorativeShortest: SizingSemanticToken { Self.mockThemeSizeRawToken } - override open var sizeIconDecorativeShorter: SizingSemanticToken { Self.mockThemeSizeRawToken } - override open var sizeIconDecorativeShort: SizingSemanticToken { Self.mockThemeSizeRawToken } - override open var sizeIconDecorativeMedium: SizingSemanticToken { Self.mockThemeSizeRawToken } - override open var sizeIconDecorativeTall: SizingSemanticToken { Self.mockThemeSizeRawToken } - override open var sizeIconDecorativeTaller: SizingSemanticToken { Self.mockThemeSizeRawToken } - override open var sizeIconDecorativeTallest: SizingSemanticToken { Self.mockThemeSizeRawToken } + override open var sizeIconDecorativeShortest: SizeSemanticToken { Self.mockThemeSizeRawToken } + override open var sizeIconDecorativeShorter: SizeSemanticToken { Self.mockThemeSizeRawToken } + override open var sizeIconDecorativeShort: SizeSemanticToken { Self.mockThemeSizeRawToken } + override open var sizeIconDecorativeMedium: SizeSemanticToken { Self.mockThemeSizeRawToken } + override open var sizeIconDecorativeTall: SizeSemanticToken { Self.mockThemeSizeRawToken } + override open var sizeIconDecorativeTaller: SizeSemanticToken { Self.mockThemeSizeRawToken } + override open var sizeIconDecorativeTallest: SizeSemanticToken { Self.mockThemeSizeRawToken } // MARK: - Semantic token - Sizing - Max width typography - override open var sizeMaxWidthTypeDisplayLarge: MultipleSizingTokens { Self.mockThemeSizeCompositeToken } - override open var sizeMaxWidthTypeDisplayMedium: MultipleSizingTokens { Self.mockThemeSizeCompositeToken } - override open var sizeMaxWidthTypeDisplaySmall: MultipleSizingTokens { Self.mockThemeSizeCompositeToken } + override open var sizeMaxWidthTypeDisplayLarge: MultipleSizeTokens { Self.mockThemeSizeCompositeToken } + override open var sizeMaxWidthTypeDisplayMedium: MultipleSizeTokens { Self.mockThemeSizeCompositeToken } + override open var sizeMaxWidthTypeDisplaySmall: MultipleSizeTokens { Self.mockThemeSizeCompositeToken } - override open var sizeMaxWidthTypeHeadingXLarge: MultipleSizingTokens { Self.mockThemeSizeCompositeToken } - override open var sizeMaxWidthTypeHeadingLarge: MultipleSizingTokens { Self.mockThemeSizeCompositeToken } - override open var sizeMaxWidthTypeHeadingMedium: MultipleSizingTokens { Self.mockThemeSizeCompositeToken } - override open var sizeMaxWidthTypeHeadingSmall: MultipleSizingTokens { Self.mockThemeSizeCompositeToken } + override open var sizeMaxWidthTypeHeadingXLarge: MultipleSizeTokens { Self.mockThemeSizeCompositeToken } + override open var sizeMaxWidthTypeHeadingLarge: MultipleSizeTokens { Self.mockThemeSizeCompositeToken } + override open var sizeMaxWidthTypeHeadingMedium: MultipleSizeTokens { Self.mockThemeSizeCompositeToken } + override open var sizeMaxWidthTypeHeadingSmall: MultipleSizeTokens { Self.mockThemeSizeCompositeToken } - override open var sizeMaxWidthTypeBodyLarge: MultipleSizingTokens { Self.mockThemeSizeCompositeToken } - override open var sizeMaxWidthTypeBodyMedium: MultipleSizingTokens { Self.mockThemeSizeCompositeToken } - override open var sizeMaxWidthTypeBodySmall: MultipleSizingTokens { Self.mockThemeSizeCompositeToken } + override open var sizeMaxWidthTypeBodyLarge: MultipleSizeTokens { Self.mockThemeSizeCompositeToken } + override open var sizeMaxWidthTypeBodyMedium: MultipleSizeTokens { Self.mockThemeSizeCompositeToken } + override open var sizeMaxWidthTypeBodySmall: MultipleSizeTokens { Self.mockThemeSizeCompositeToken } } diff --git a/OUDS/Core/OUDS/Tests/OUDSTheme/MockThemes/MockTheme+SpacingSemanticTokens.swift b/OUDS/Core/OUDS/Tests/OUDSTheme/MockThemes/MockTheme+SpacingSemanticTokens.swift index 099895629..e77b5a86a 100644 --- a/OUDS/Core/OUDS/Tests/OUDSTheme/MockThemes/MockTheme+SpacingSemanticTokens.swift +++ b/OUDS/Core/OUDS/Tests/OUDSTheme/MockThemes/MockTheme+SpacingSemanticTokens.swift @@ -17,130 +17,130 @@ import OUDSTokensSemantic extension MockTheme { static let mockThemeSpaceRawToken: DimensionRawToken = 911 - static let mockThemeSpaceSemanticToken = MultipleSpacingTokens(compact: 1, regular: 151) + static let mockThemeSpaceSemanticToken = MultipleSpaceTokens(compact: 1, regular: 151) // MARK: Semantic token - Spacing - Layout fluid - override open var spaceScaledNone: MultipleSpacingTokens { Self.mockThemeSpaceSemanticToken } - override open var spaceScaledSmash: MultipleSpacingTokens { Self.mockThemeSpaceSemanticToken } - override open var spaceScaledShortest: MultipleSpacingTokens { Self.mockThemeSpaceSemanticToken } - override open var spaceScaledShorter: MultipleSpacingTokens { Self.mockThemeSpaceSemanticToken } - override open var spaceScaledShort: MultipleSpacingTokens { Self.mockThemeSpaceSemanticToken } - override open var spaceScaledMedium: MultipleSpacingTokens { Self.mockThemeSpaceSemanticToken } - override open var spaceScaledTall: MultipleSpacingTokens { Self.mockThemeSpaceSemanticToken } - override open var spaceScaledTaller: MultipleSpacingTokens { Self.mockThemeSpaceSemanticToken } - override open var spaceScaledTallest: MultipleSpacingTokens { Self.mockThemeSpaceSemanticToken } - override open var spaceScaledSpacious: MultipleSpacingTokens { Self.mockThemeSpaceSemanticToken } + override open var spaceScaledNone: MultipleSpaceTokens { Self.mockThemeSpaceSemanticToken } + override open var spaceScaledSmash: MultipleSpaceTokens { Self.mockThemeSpaceSemanticToken } + override open var spaceScaledShortest: MultipleSpaceTokens { Self.mockThemeSpaceSemanticToken } + override open var spaceScaledShorter: MultipleSpaceTokens { Self.mockThemeSpaceSemanticToken } + override open var spaceScaledShort: MultipleSpaceTokens { Self.mockThemeSpaceSemanticToken } + override open var spaceScaledMedium: MultipleSpaceTokens { Self.mockThemeSpaceSemanticToken } + override open var spaceScaledTall: MultipleSpaceTokens { Self.mockThemeSpaceSemanticToken } + override open var spaceScaledTaller: MultipleSpaceTokens { Self.mockThemeSpaceSemanticToken } + override open var spaceScaledTallest: MultipleSpaceTokens { Self.mockThemeSpaceSemanticToken } + override open var spaceScaledSpacious: MultipleSpaceTokens { Self.mockThemeSpaceSemanticToken } // MARK: Semantic token - Spacing - Layout fix - override open var spaceFixedNone: SpacingSemanticToken { Self.mockThemeSpaceRawToken } - override open var spaceFixedSmash: SpacingSemanticToken { Self.mockThemeSpaceRawToken } - override open var spaceFixedShortest: SpacingSemanticToken { Self.mockThemeSpaceRawToken } - override open var spaceFixedShorter: SpacingSemanticToken { Self.mockThemeSpaceRawToken } - override open var spaceFixedShort: SpacingSemanticToken { Self.mockThemeSpaceRawToken } - override open var spaceFixedMedium: SpacingSemanticToken { Self.mockThemeSpaceRawToken } - override open var spaceFixedTall: SpacingSemanticToken { Self.mockThemeSpaceRawToken } - override open var spaceFixedTaller: SpacingSemanticToken { Self.mockThemeSpaceRawToken } - override open var spaceFixedTallest: SpacingSemanticToken { Self.mockThemeSpaceRawToken } - override open var spaceFixedSpacious: SpacingSemanticToken { Self.mockThemeSpaceRawToken } - override open var spaceFixedHuge: SpacingSemanticToken { Self.mockThemeSpaceRawToken } - override open var spaceFixedJumbo: SpacingSemanticToken { Self.mockThemeSpaceRawToken } + override open var spaceFixedNone: SpaceSemanticToken { Self.mockThemeSpaceRawToken } + override open var spaceFixedSmash: SpaceSemanticToken { Self.mockThemeSpaceRawToken } + override open var spaceFixedShortest: SpaceSemanticToken { Self.mockThemeSpaceRawToken } + override open var spaceFixedShorter: SpaceSemanticToken { Self.mockThemeSpaceRawToken } + override open var spaceFixedShort: SpaceSemanticToken { Self.mockThemeSpaceRawToken } + override open var spaceFixedMedium: SpaceSemanticToken { Self.mockThemeSpaceRawToken } + override open var spaceFixedTall: SpaceSemanticToken { Self.mockThemeSpaceRawToken } + override open var spaceFixedTaller: SpaceSemanticToken { Self.mockThemeSpaceRawToken } + override open var spaceFixedTallest: SpaceSemanticToken { Self.mockThemeSpaceRawToken } + override open var spaceFixedSpacious: SpaceSemanticToken { Self.mockThemeSpaceRawToken } + override open var spaceFixedHuge: SpaceSemanticToken { Self.mockThemeSpaceRawToken } + override open var spaceFixedJumbo: SpaceSemanticToken { Self.mockThemeSpaceRawToken } // MARK: Semantic token - Spacing - Padding - Padding inline - override open var spacePaddingInlineNone: SpacingPaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } - override open var spacePaddingInlineShorter: SpacingPaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } - override open var spacePaddingInlineShort: SpacingPaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } - override open var spacePaddingInlineMedium: SpacingPaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } - override open var spacePaddingInlineTall: SpacingPaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } - override open var spacePaddingInlineTaller: SpacingPaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } - override open var spacePaddingInlineTallest: SpacingPaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } - - override open var spacePaddingInlineWithIconNone: SpacingPaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } - override open var spacePaddingInlineWithIconShortest: SpacingPaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } - override open var spacePaddingInlineWithIconShorter: SpacingPaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } - override open var spacePaddingInlineWithIconShort: SpacingPaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } - override open var spacePaddingInlineWithIconMedium: SpacingPaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } - override open var spacePaddingInlineWithIconTall: SpacingPaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } - override open var spacePaddingInlineWithIconTaller: SpacingPaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } - override open var spacePaddingInlineWithIconTallest: SpacingPaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } - - override open var spacePaddingInlineWithArrowNone: SpacingPaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } - override open var spacePaddingInlineWithArrowShortest: SpacingPaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } - override open var spacePaddingInlineWithArrowShorter: SpacingPaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } - override open var spacePaddingInlineWithArrowShort: SpacingPaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } - override open var spacePaddingInlineWithArrowMedium: SpacingPaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } - override open var spacePaddingInlineWithArrowTall: SpacingPaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } - override open var spacePaddingInlineWithArrowTaller: SpacingPaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } - override open var spacePaddingInlineWithArrowTallest: SpacingPaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } + override open var spacePaddingInlineNone: SpacePaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } + override open var spacePaddingInlineShorter: SpacePaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } + override open var spacePaddingInlineShort: SpacePaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } + override open var spacePaddingInlineMedium: SpacePaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } + override open var spacePaddingInlineTall: SpacePaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } + override open var spacePaddingInlineTaller: SpacePaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } + override open var spacePaddingInlineTallest: SpacePaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } + + override open var spacePaddingInlineWithIconNone: SpacePaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } + override open var spacePaddingInlineWithIconShortest: SpacePaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } + override open var spacePaddingInlineWithIconShorter: SpacePaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } + override open var spacePaddingInlineWithIconShort: SpacePaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } + override open var spacePaddingInlineWithIconMedium: SpacePaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } + override open var spacePaddingInlineWithIconTall: SpacePaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } + override open var spacePaddingInlineWithIconTaller: SpacePaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } + override open var spacePaddingInlineWithIconTallest: SpacePaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } + + override open var spacePaddingInlineWithArrowNone: SpacePaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } + override open var spacePaddingInlineWithArrowShortest: SpacePaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } + override open var spacePaddingInlineWithArrowShorter: SpacePaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } + override open var spacePaddingInlineWithArrowShort: SpacePaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } + override open var spacePaddingInlineWithArrowMedium: SpacePaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } + override open var spacePaddingInlineWithArrowTall: SpacePaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } + override open var spacePaddingInlineWithArrowTaller: SpacePaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } + override open var spacePaddingInlineWithArrowTallest: SpacePaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } // MARK: Semantic token - Padding - Padding stack - override open var spacePaddingBlockNone: SpacingPaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } - override open var spacePaddingBlockShorter: SpacingPaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } - override open var spacePaddingBlockShort: SpacingPaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } - override open var spacePaddingBlockMedium: SpacingPaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } - override open var spacePaddingBlockTall: SpacingPaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } - override open var spacePaddingBlockTaller: SpacingPaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } - override open var spacePaddingBlockTallest: SpacingPaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } - - override open var spacePaddingBlockWithIconNone: SpacingPaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } - override open var spacePaddingBlockWithIconShortest: SpacingPaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } - override open var spacePaddingBlockWithIconShorter: SpacingPaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } - override open var spacePaddingBlockWithIconShort: SpacingPaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } - override open var spacePaddingBlockWithIconMedium: SpacingPaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } - override open var spacePaddingBlockWithIconTall: SpacingPaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } - override open var spacePaddingBlockWithIconTaller: SpacingPaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } + override open var spacePaddingBlockNone: SpacePaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } + override open var spacePaddingBlockShorter: SpacePaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } + override open var spacePaddingBlockShort: SpacePaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } + override open var spacePaddingBlockMedium: SpacePaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } + override open var spacePaddingBlockTall: SpacePaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } + override open var spacePaddingBlockTaller: SpacePaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } + override open var spacePaddingBlockTallest: SpacePaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } + + override open var spacePaddingBlockWithIconNone: SpacePaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } + override open var spacePaddingBlockWithIconShortest: SpacePaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } + override open var spacePaddingBlockWithIconShorter: SpacePaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } + override open var spacePaddingBlockWithIconShort: SpacePaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } + override open var spacePaddingBlockWithIconMedium: SpacePaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } + override open var spacePaddingBlockWithIconTall: SpacePaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } + override open var spacePaddingBlockWithIconTaller: SpacePaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } // MARK: Semantic token - Padding - Padding inset - override open var spaceInsetNone: SpacingPaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } - override open var spaceInsetSmash: SpacingPaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } - override open var spaceInsetShortest: SpacingPaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } - override open var spaceInsetShorter: SpacingPaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } - override open var spaceInsetShort: SpacingPaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } - override open var spaceInsetMedium: SpacingPaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } - override open var spaceInsetTall: SpacingPaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } - override open var spaceInsetTaller: SpacingPaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } - override open var spaceInsetTallest: SpacingPaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } - override open var spaceInsetSpacious: SpacingPaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } + override open var spaceInsetNone: SpacePaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } + override open var spaceInsetSmash: SpacePaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } + override open var spaceInsetShortest: SpacePaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } + override open var spaceInsetShorter: SpacePaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } + override open var spaceInsetShort: SpacePaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } + override open var spaceInsetMedium: SpacePaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } + override open var spaceInsetTall: SpacePaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } + override open var spaceInsetTaller: SpacePaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } + override open var spaceInsetTallest: SpacePaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } + override open var spaceInsetSpacious: SpacePaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } // MARK: Semantic token - Padding - Gap inline - override open var spaceColumnGapNone: SpacingPaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } - override open var spaceColumnGapShorter: SpacingPaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } - override open var spaceColumnGapShort: SpacingPaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } - override open var spaceColumnGapMedium: SpacingPaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } - override open var spaceColumnGapTall: SpacingPaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } - override open var spaceColumnGapTaller: SpacingPaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } - - override open var spaceColumnGapWithIconNone: SpacingPaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } - override open var spaceColumnGapWithIconShortest: SpacingPaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } - override open var spaceColumnGapWithIconShorter: SpacingPaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } - override open var spaceColumnGapWithIconShort: SpacingPaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } - override open var spaceColumnGapWithIconMedium: SpacingPaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } - override open var spaceColumnGapWithIconTall: SpacingPaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } - - override open var spaceColumnGapWithArrowNone: SpacingPaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } - override open var spaceColumnGapWithArrowShortest: SpacingPaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } - override open var spaceColumnGapWithArrowShorter: SpacingPaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } - override open var spaceColumnGapWithArrowShort: SpacingPaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } - override open var spaceColumnGapWithArrowMedium: SpacingPaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } - override open var spaceColumnGapWithArrowTall: SpacingPaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } + override open var spaceColumnGapNone: SpacePaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } + override open var spaceColumnGapShorter: SpacePaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } + override open var spaceColumnGapShort: SpacePaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } + override open var spaceColumnGapMedium: SpacePaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } + override open var spaceColumnGapTall: SpacePaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } + override open var spaceColumnGapTaller: SpacePaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } + + override open var spaceColumnGapWithIconNone: SpacePaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } + override open var spaceColumnGapWithIconShortest: SpacePaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } + override open var spaceColumnGapWithIconShorter: SpacePaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } + override open var spaceColumnGapWithIconShort: SpacePaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } + override open var spaceColumnGapWithIconMedium: SpacePaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } + override open var spaceColumnGapWithIconTall: SpacePaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } + + override open var spaceColumnGapWithArrowNone: SpacePaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } + override open var spaceColumnGapWithArrowShortest: SpacePaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } + override open var spaceColumnGapWithArrowShorter: SpacePaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } + override open var spaceColumnGapWithArrowShort: SpacePaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } + override open var spaceColumnGapWithArrowMedium: SpacePaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } + override open var spaceColumnGapWithArrowTall: SpacePaddingInlineSemanticToken { Self.mockThemeSpaceRawToken } // MARK: Semantic token - Padding - Gap stack - override open var spaceRowGapNone: SpacingGapStackSemanticToken { Self.mockThemeSpaceRawToken } - override open var spaceRowGapShortest: SpacingGapStackSemanticToken { Self.mockThemeSpaceRawToken } - override open var spaceRowGapShorter: SpacingGapStackSemanticToken { Self.mockThemeSpaceRawToken } - override open var spaceRowGapShort: SpacingGapStackSemanticToken { Self.mockThemeSpaceRawToken } - override open var spaceRowGapMedium: SpacingGapStackSemanticToken { Self.mockThemeSpaceRawToken } - override open var spaceRowGapTall: SpacingGapStackSemanticToken { Self.mockThemeSpaceRawToken } - override open var spaceRowGapWithIconNone: SpacingGapStackSemanticToken { Self.mockThemeSpaceRawToken } - override open var spaceRowGapWithIconShortest: SpacingGapStackSemanticToken { Self.mockThemeSpaceRawToken } - override open var spaceRowGapWithIconShorter: SpacingGapStackSemanticToken { Self.mockThemeSpaceRawToken } - override open var spaceRowGapWithIconShort: SpacingGapStackSemanticToken { Self.mockThemeSpaceRawToken } - override open var spaceRowGapWithIconMedium: SpacingGapStackSemanticToken { Self.mockThemeSpaceRawToken } - override open var spaceRowGapWithIconTall: SpacingGapStackSemanticToken { Self.mockThemeSpaceRawToken } + override open var spaceRowGapNone: SpaceGapStackSemanticToken { Self.mockThemeSpaceRawToken } + override open var spaceRowGapShortest: SpaceGapStackSemanticToken { Self.mockThemeSpaceRawToken } + override open var spaceRowGapShorter: SpaceGapStackSemanticToken { Self.mockThemeSpaceRawToken } + override open var spaceRowGapShort: SpaceGapStackSemanticToken { Self.mockThemeSpaceRawToken } + override open var spaceRowGapMedium: SpaceGapStackSemanticToken { Self.mockThemeSpaceRawToken } + override open var spaceRowGapTall: SpaceGapStackSemanticToken { Self.mockThemeSpaceRawToken } + override open var spaceRowGapWithIconNone: SpaceGapStackSemanticToken { Self.mockThemeSpaceRawToken } + override open var spaceRowGapWithIconShortest: SpaceGapStackSemanticToken { Self.mockThemeSpaceRawToken } + override open var spaceRowGapWithIconShorter: SpaceGapStackSemanticToken { Self.mockThemeSpaceRawToken } + override open var spaceRowGapWithIconShort: SpaceGapStackSemanticToken { Self.mockThemeSpaceRawToken } + override open var spaceRowGapWithIconMedium: SpaceGapStackSemanticToken { Self.mockThemeSpaceRawToken } + override open var spaceRowGapWithIconTall: SpaceGapStackSemanticToken { Self.mockThemeSpaceRawToken } } diff --git a/OUDS/Core/OUDS/Tests/OUDSTheme/MockThemes/MockTheme.swift b/OUDS/Core/OUDS/Tests/OUDSTheme/MockThemes/MockTheme.swift index 67b6b53d4..823cf10fc 100644 --- a/OUDS/Core/OUDS/Tests/OUDSTheme/MockThemes/MockTheme.swift +++ b/OUDS/Core/OUDS/Tests/OUDSTheme/MockThemes/MockTheme.swift @@ -16,7 +16,7 @@ import OUDS import OUDSTokensSemantic /// A mock theme for tests -open class MockTheme: OUDSTheme { +open class MockTheme: OUDSTheme, @unchecked Sendable { convenience init() { self.init(customFont: nil) diff --git a/OUDS/Core/OUDS/Tests/OUDSTheme/TestThemeOverrideOfSizingSemanticTokens.swift b/OUDS/Core/OUDS/Tests/OUDSTheme/TestThemeOverrideOfSizeSemanticTokens.swift similarity index 99% rename from OUDS/Core/OUDS/Tests/OUDSTheme/TestThemeOverrideOfSizingSemanticTokens.swift rename to OUDS/Core/OUDS/Tests/OUDSTheme/TestThemeOverrideOfSizeSemanticTokens.swift index ee34352ab..c4098b05d 100644 --- a/OUDS/Core/OUDS/Tests/OUDSTheme/TestThemeOverrideOfSizingSemanticTokens.swift +++ b/OUDS/Core/OUDS/Tests/OUDSTheme/TestThemeOverrideOfSizeSemanticTokens.swift @@ -21,7 +21,7 @@ import XCTest /// In fact the `OUDSTheme` object is a class, which can be seen as an _asbtract class_, exposing through its extensions and protocols _sizing semantic tokens_. /// These semantic tokens should be overriden by subclass like the `OrangeTheme` default theme. /// **These tests checks if any _sizing semantic tokens_ can be surcharged by a child theme** -final class TestThemeOverrideOfSizingSemanticTokens: XCTestCase { +final class TestThemeOverrideOfSizeSemanticTokens: XCTestCase { private var abstractTheme: OUDSTheme! private var inheritedTheme: OUDSTheme! diff --git a/OUDS/Core/OUDS/Tests/OUDSTheme/TestThemeOverrideOfSpacingSemanticTokens.swift b/OUDS/Core/OUDS/Tests/OUDSTheme/TestThemeOverrideOfSpaceSemanticTokens.swift similarity index 99% rename from OUDS/Core/OUDS/Tests/OUDSTheme/TestThemeOverrideOfSpacingSemanticTokens.swift rename to OUDS/Core/OUDS/Tests/OUDSTheme/TestThemeOverrideOfSpaceSemanticTokens.swift index 6e5f4b564..6f344b4f8 100644 --- a/OUDS/Core/OUDS/Tests/OUDSTheme/TestThemeOverrideOfSpacingSemanticTokens.swift +++ b/OUDS/Core/OUDS/Tests/OUDSTheme/TestThemeOverrideOfSpaceSemanticTokens.swift @@ -23,7 +23,7 @@ import XCTest /// In factn the `OUDSTheme` object is a class, which can be seens as an _asbtract class_, exposing through its extensions and protocols _spacing semantic tokens_. /// These semantic tokens should be overriden by subclass like the `OrangeTheme` default theme. /// **These tests checks if any _spacing semantic tokens_ can be surcharged by a child theme** -final class TestThemeOverrideOfSpacingSemanticTokens: XCTestCase { +final class TestThemeOverrideOfSpaceSemanticTokens: XCTestCase { private var abstractTheme: OUDSTheme! private var inheritedTheme: OUDSTheme! diff --git a/OUDS/Core/Tokens/ComponentTokens/Sources/Values/ButtonsComponentTokens.swift b/OUDS/Core/Tokens/ComponentTokens/Sources/Values/ButtonsComponentTokens.swift index af095e648..16af56809 100644 --- a/OUDS/Core/Tokens/ComponentTokens/Sources/Values/ButtonsComponentTokens.swift +++ b/OUDS/Core/Tokens/ComponentTokens/Sources/Values/ButtonsComponentTokens.swift @@ -25,7 +25,7 @@ public protocol ButtonsComponentTokens { 2. Maybe a composite tokens should be defined and used to gather all these atomic semantic tokens */ - var buttonInternalSpacing: SpacingPaddingInlineSemanticToken { get } + var buttonInternalSpacing: SpacePaddingInlineSemanticToken { get } var buttonBorderStyle: BorderStyleSemanticToken { get } var buttonBorderColor: ColorSemanticToken { get } @@ -35,8 +35,8 @@ public protocol ButtonsComponentTokens { var buttonForegroundColor: ColorSemanticToken { get } var buttonBackgroundColor: ColorSemanticToken { get } - var buttonWidth: SizingSemanticToken { get } - var buttonHeight: SizingSemanticToken { get } + var buttonWidth: SizeSemanticToken { get } + var buttonHeight: SizeSemanticToken { get } var buttonTypography: MultipleTypographyTokens { get } } diff --git a/OUDS/Core/Tokens/SemanticTokens/Sources/Multiples/MultipleSizingTokens.swift b/OUDS/Core/Tokens/SemanticTokens/Sources/Multiples/MultipleSizeTokens.swift similarity index 69% rename from OUDS/Core/Tokens/SemanticTokens/Sources/Multiples/MultipleSizingTokens.swift rename to OUDS/Core/Tokens/SemanticTokens/Sources/Multiples/MultipleSizeTokens.swift index 49ab0910f..6c38b3b9b 100644 --- a/OUDS/Core/Tokens/SemanticTokens/Sources/Multiples/MultipleSizingTokens.swift +++ b/OUDS/Core/Tokens/SemanticTokens/Sources/Multiples/MultipleSizeTokens.swift @@ -13,29 +13,29 @@ import Foundation -/// Kind of semantic tokens which will wrap a combination of `SizingSemanticToken` depending to viewports / size classes. +/// Kind of semantic tokens which will wrap a combination of `SizeSemanticToken` depending to viewports / size classes. /// Kind of composite token with multiple values, but not named "composite" because this word is already used in the design system. /// Allows to gather the multiple-value tokens from Figma inside one object. -public final class MultipleSizingTokens: NSObject, Sendable { +public final class MultipleSizeTokens: NSObject, Sendable { /// For **extra-compact** and **compact** viewports - public let compact: SizingSemanticToken + public let compact: SizeSemanticToken /// For **regular** and **medium** viewports - public let regular: SizingSemanticToken + public let regular: SizeSemanticToken /// Initializes a new sizing composite semantic token. - /// - Parameter value: The `SizingSemanticToken` to apply if device in *compact* mode or *regular* mode - public init(_ value: SizingSemanticToken) { + /// - Parameter value: The `SizeSemanticToken` to apply if device in *compact* mode or *regular* mode + public init(_ value: SizeSemanticToken) { self.compact = value self.regular = value } /// Initializes a new sizing composite semantic token. /// - Parameters: - /// - compact: The `SizingSemanticToken` to apply if device in *compact* mode - /// - regular: The `SizingSemanticToken` to apply if device in *regular* mode - public init(compact: SizingSemanticToken, regular: SizingSemanticToken) { + /// - compact: The `SizeSemanticToken` to apply if device in *compact* mode + /// - regular: The `SizeSemanticToken` to apply if device in *regular* mode + public init(compact: SizeSemanticToken, regular: SizeSemanticToken) { self.compact = compact self.regular = regular } @@ -46,7 +46,7 @@ public final class MultipleSizingTokens: NSObject, Sendable { /// as a `MultipleSizingTokens`. Otherwise returns `false`. /// `isEqual` override is preferred for `NSObject`. override public func isEqual(_ object: Any?) -> Bool { - guard let other = object as? MultipleSizingTokens else { + guard let other = object as? MultipleSizeTokens else { return false } return self.compact == other.compact && self.regular == other.regular diff --git a/OUDS/Core/Tokens/SemanticTokens/Sources/Multiples/MultipleSpacingTokens.swift b/OUDS/Core/Tokens/SemanticTokens/Sources/Multiples/MultipleSpaceTokens.swift similarity index 93% rename from OUDS/Core/Tokens/SemanticTokens/Sources/Multiples/MultipleSpacingTokens.swift rename to OUDS/Core/Tokens/SemanticTokens/Sources/Multiples/MultipleSpaceTokens.swift index ef0f9ba41..2d67275b0 100644 --- a/OUDS/Core/Tokens/SemanticTokens/Sources/Multiples/MultipleSpacingTokens.swift +++ b/OUDS/Core/Tokens/SemanticTokens/Sources/Multiples/MultipleSpaceTokens.swift @@ -18,7 +18,7 @@ import SwiftUI /// Kind of semantic tokens which will wrap a combination of `DimensionRawToken` depending to size classes. /// Kind of composite token with multiple values, but not named "composite" because this word is already used in the design system. /// Allows to gather the multiple-value tokens from Figma inside one object. -public final class MultipleSpacingTokens: NSObject, Sendable { +public final class MultipleSpaceTokens: NSObject, Sendable { /// For **extra-compact** and **compact** viewports public let compact: DimensionRawToken @@ -41,7 +41,7 @@ public final class MultipleSpacingTokens: NSObject, Sendable { /// as a `MultipleSpacingTokens`. Otherwise returns `false`. /// `isEqual` override is preferred for `NSObject`. override public func isEqual(_ object: Any?) -> Bool { - guard let other = object as? MultipleSpacingTokens else { return false } + guard let other = object as? MultipleSpaceTokens else { return false } return self.compact == other.compact && self.regular == other.regular } diff --git a/OUDS/Core/Tokens/SemanticTokens/Sources/TypeAliases/SizingSemanticTokens+Aliases.swift b/OUDS/Core/Tokens/SemanticTokens/Sources/TypeAliases/SizingSemanticTokens+Aliases.swift index 3be331526..d84fc1dc3 100644 --- a/OUDS/Core/Tokens/SemanticTokens/Sources/TypeAliases/SizingSemanticTokens+Aliases.swift +++ b/OUDS/Core/Tokens/SemanticTokens/Sources/TypeAliases/SizingSemanticTokens+Aliases.swift @@ -14,4 +14,4 @@ import OUDSTokensRaw /// Basically a size semantic token for width and height is a dimension raw token, it has the same final type, to keep grammar clean and clear with design system grammar. -public typealias SizingSemanticToken = DimensionRawToken +public typealias SizeSemanticToken = DimensionRawToken diff --git a/OUDS/Core/Tokens/SemanticTokens/Sources/TypeAliases/SpacingSemanticTokens+Aliases.swift b/OUDS/Core/Tokens/SemanticTokens/Sources/TypeAliases/SpacingSemanticTokens+Aliases.swift index 89ceb46c2..96840440e 100644 --- a/OUDS/Core/Tokens/SemanticTokens/Sources/TypeAliases/SpacingSemanticTokens+Aliases.swift +++ b/OUDS/Core/Tokens/SemanticTokens/Sources/TypeAliases/SpacingSemanticTokens+Aliases.swift @@ -14,19 +14,16 @@ import OUDSTokensRaw /// Basically a space semantic token for layout is a dimension raw token, it has the same final type, to keep grammar clean and clear with design system grammar. -public typealias SpacingSemanticToken = DimensionRawToken +public typealias SpaceSemanticToken = DimensionRawToken /// Basically a space semantic token for padding inline is a dimension raw token, it has the same final type, to keep grammar clean and clear with design system grammar. -public typealias SpacingPaddingInlineSemanticToken = DimensionRawToken +public typealias SpacePaddingInlineSemanticToken = DimensionRawToken /// Basically a space semantic token for padding block is a dimension raw token, it has the same final type, to keep grammar clean and clear with design system grammar. -public typealias SpacingPaddingBlockSemanticToken = DimensionRawToken - -/// Basically a space semantic token for padding inset is a dimension raw token, it has the same final type, to keep grammar clean and clear with design system grammar. -public typealias SpacingPaddingInsetSemanticToken = DimensionRawToken +public typealias SpacePaddingBlockSemanticToken = DimensionRawToken /// Basically a space semantic token for gap inline is a dimension raw token, it has the same final type, to keep grammar clean and clear with design system grammar. -public typealias SpacingGapInlineSemanticToken = DimensionRawToken +public typealias SpaceGapInlineSemanticToken = DimensionRawToken /// Basically a space semantic token for gap stack is a dimension raw token, it has the same final type, to keep grammar clean and clear with design system grammar. -public typealias SpacingGapStackSemanticToken = DimensionRawToken +public typealias SpaceGapStackSemanticToken = DimensionRawToken diff --git a/OUDS/Core/Tokens/SemanticTokens/Sources/Values/SizeSemanticTokens.swift b/OUDS/Core/Tokens/SemanticTokens/Sources/Values/SizeSemanticTokens.swift new file mode 100644 index 000000000..dbd077f9a --- /dev/null +++ b/OUDS/Core/Tokens/SemanticTokens/Sources/Values/SizeSemanticTokens.swift @@ -0,0 +1,89 @@ +// +// Software Name: OUDS iOS +// SPDX-FileCopyrightText: Copyright (c) Orange SA +// SPDX-License-Identifier: MIT +// +// This software is distributed under the MIT license, +// the text of which is available at https://opensource.org/license/MIT/ +// or see the "LICENSE" file for more details. +// +// Authors: See CONTRIBUTORS.txt +// Software description: A SwiftUI components library with code examples for Orange Unified Design System +// + +// ଘ( ・ω・)_/゚・:*:・。☆ +// [File to generate with the tokenator] + +// swiftlint:disable missing_docs + +/// This is a group of semantic tokens for **sizing**. +/// It defines all `SizeSemanticToken` a theme must have. +/// +/// In the future this file should be generated by a parser converting Figma JSON to Swift code. +public protocol SizeSemanticTokens { + + // MARK: - Semantic token - Sizing - Icon with typography + + var sizeIconWithHeadingXLargeShort: MultipleSizeTokens { get } + var sizeIconWithHeadingXLargeMedium: MultipleSizeTokens { get } + var sizeIconWithHeadingXLargeTall: MultipleSizeTokens { get } + + var sizeIconWithHeadingLargeShort: MultipleSizeTokens { get } + var sizeIconWithHeadingLargeMedium: MultipleSizeTokens { get } + var sizeIconWithHeadingLargeTall: MultipleSizeTokens { get } + + var sizeIconWithHeadingMediumShort: MultipleSizeTokens { get } + var sizeIconWithHeadingMediumMedium: MultipleSizeTokens { get } + var sizeIconWithHeadingMediumTall: MultipleSizeTokens { get } + + var sizeIconWithHeadingSmallShort: MultipleSizeTokens { get } + var sizeIconWithHeadingSmallMedium: MultipleSizeTokens { get } + var sizeIconWithHeadingSmallTall: MultipleSizeTokens { get } + + var sizeIconWithBodyLargeShort: MultipleSizeTokens { get } + var sizeIconWithBodyLargeMedium: MultipleSizeTokens { get } + var sizeIconWithBodyLargeTall: MultipleSizeTokens { get } + + var sizeIconWithBodyMediumShort: MultipleSizeTokens { get } + var sizeIconWithBodyMediumMedium: MultipleSizeTokens { get } + var sizeIconWithBodyMediumTall: MultipleSizeTokens { get } + + var sizeIconWithBodySmallShort: MultipleSizeTokens { get } + var sizeIconWithBodySmallMedium: MultipleSizeTokens { get } + var sizeIconWithBodySmallTall: MultipleSizeTokens { get } + + var sizeIconWithLabelXLargeSizeShort: SizeSemanticToken { get } + var sizeIconWithLabelXLargeSizeMedium: SizeSemanticToken { get } + var sizeIconWithLabelXLargeSizeTall: SizeSemanticToken { get } + + var sizeIconWithLabelLargeSizeShorter: SizeSemanticToken { get } + var sizeIconWithLabelLargeSizeShort: SizeSemanticToken { get } + var sizeIconWithLabelLargeSizeMedium: SizeSemanticToken { get } + var sizeIconWithLabelLargeSizeTall: SizeSemanticToken { get } + var sizeIconWithLabelLargeSizeTaller: SizeSemanticToken { get } + + var sizeIconWithLabelMediumSizeShort: SizeSemanticToken { get } + var sizeIconWithLabelMediumSizeMedium: SizeSemanticToken { get } + var sizeIconWithLabelMediumSizeTall: SizeSemanticToken { get } + + var sizeIconWithLabelSmallSizeShort: SizeSemanticToken { get } + var sizeIconWithLabelSmallSizeMedium: SizeSemanticToken { get } + var sizeIconWithLabelSmallSizeTall: SizeSemanticToken { get } + + // MARK: - Semantic token - Sizing - Max width typography + + var sizeMaxWidthTypeDisplayLarge: MultipleSizeTokens { get } + var sizeMaxWidthTypeDisplayMedium: MultipleSizeTokens { get } + var sizeMaxWidthTypeDisplaySmall: MultipleSizeTokens { get } + + var sizeMaxWidthTypeHeadingXLarge: MultipleSizeTokens { get } + var sizeMaxWidthTypeHeadingLarge: MultipleSizeTokens { get } + var sizeMaxWidthTypeHeadingMedium: MultipleSizeTokens { get } + var sizeMaxWidthTypeHeadingSmall: MultipleSizeTokens { get } + + var sizeMaxWidthTypeBodyLarge: MultipleSizeTokens { get } + var sizeMaxWidthTypeBodyMedium: MultipleSizeTokens { get } + var sizeMaxWidthTypeBodySmall: MultipleSizeTokens { get } +} + +// swiftlint:enable missing_docs diff --git a/OUDS/Core/Tokens/SemanticTokens/Sources/Values/SizingSemanticTokens.swift b/OUDS/Core/Tokens/SemanticTokens/Sources/Values/SizingSemanticTokens.swift deleted file mode 100644 index 618f052d5..000000000 --- a/OUDS/Core/Tokens/SemanticTokens/Sources/Values/SizingSemanticTokens.swift +++ /dev/null @@ -1,89 +0,0 @@ -// -// Software Name: OUDS iOS -// SPDX-FileCopyrightText: Copyright (c) Orange SA -// SPDX-License-Identifier: MIT -// -// This software is distributed under the MIT license, -// the text of which is available at https://opensource.org/license/MIT/ -// or see the "LICENSE" file for more details. -// -// Authors: See CONTRIBUTORS.txt -// Software description: A SwiftUI components library with code examples for Orange Unified Design System -// - -// ଘ( ・ω・)_/゚・:*:・。☆ -// [File to generate with the tokenator] - -// swiftlint:disable missing_docs - -/// This is a group of semantic tokens for **sizing**. -/// It defines all `SizingSemanticToken` a theme must have. -/// -/// In the future this file should be generated by a parser converting Figma JSON to Swift code. -public protocol SizingSemanticTokens { - - // MARK: - Semantic token - Sizing - Icon with typography - - var sizeIconWithHeadingXLargeShort: MultipleSizingTokens { get } - var sizeIconWithHeadingXLargeMedium: MultipleSizingTokens { get } - var sizeIconWithHeadingXLargeTall: MultipleSizingTokens { get } - - var sizeIconWithHeadingLargeShort: MultipleSizingTokens { get } - var sizeIconWithHeadingLargeMedium: MultipleSizingTokens { get } - var sizeIconWithHeadingLargeTall: MultipleSizingTokens { get } - - var sizeIconWithHeadingMediumShort: MultipleSizingTokens { get } - var sizeIconWithHeadingMediumMedium: MultipleSizingTokens { get } - var sizeIconWithHeadingMediumTall: MultipleSizingTokens { get } - - var sizeIconWithHeadingSmallShort: MultipleSizingTokens { get } - var sizeIconWithHeadingSmallMedium: MultipleSizingTokens { get } - var sizeIconWithHeadingSmallTall: MultipleSizingTokens { get } - - var sizeIconWithBodyLargeShort: MultipleSizingTokens { get } - var sizeIconWithBodyLargeMedium: MultipleSizingTokens { get } - var sizeIconWithBodyLargeTall: MultipleSizingTokens { get } - - var sizeIconWithBodyMediumShort: MultipleSizingTokens { get } - var sizeIconWithBodyMediumMedium: MultipleSizingTokens { get } - var sizeIconWithBodyMediumTall: MultipleSizingTokens { get } - - var sizeIconWithBodySmallShort: MultipleSizingTokens { get } - var sizeIconWithBodySmallMedium: MultipleSizingTokens { get } - var sizeIconWithBodySmallTall: MultipleSizingTokens { get } - - var sizeIconWithLabelXLargeSizeShort: SizingSemanticToken { get } - var sizeIconWithLabelXLargeSizeMedium: SizingSemanticToken { get } - var sizeIconWithLabelXLargeSizeTall: SizingSemanticToken { get } - - var sizeIconWithLabelLargeSizeShorter: SizingSemanticToken { get } - var sizeIconWithLabelLargeSizeShort: SizingSemanticToken { get } - var sizeIconWithLabelLargeSizeMedium: SizingSemanticToken { get } - var sizeIconWithLabelLargeSizeTall: SizingSemanticToken { get } - var sizeIconWithLabelLargeSizeTaller: SizingSemanticToken { get } - - var sizeIconWithLabelMediumSizeShort: SizingSemanticToken { get } - var sizeIconWithLabelMediumSizeMedium: SizingSemanticToken { get } - var sizeIconWithLabelMediumSizeTall: SizingSemanticToken { get } - - var sizeIconWithLabelSmallSizeShort: SizingSemanticToken { get } - var sizeIconWithLabelSmallSizeMedium: SizingSemanticToken { get } - var sizeIconWithLabelSmallSizeTall: SizingSemanticToken { get } - - // MARK: - Semantic token - Sizing - Max width typography - - var sizeMaxWidthTypeDisplayLarge: MultipleSizingTokens { get } - var sizeMaxWidthTypeDisplayMedium: MultipleSizingTokens { get } - var sizeMaxWidthTypeDisplaySmall: MultipleSizingTokens { get } - - var sizeMaxWidthTypeHeadingXLarge: MultipleSizingTokens { get } - var sizeMaxWidthTypeHeadingLarge: MultipleSizingTokens { get } - var sizeMaxWidthTypeHeadingMedium: MultipleSizingTokens { get } - var sizeMaxWidthTypeHeadingSmall: MultipleSizingTokens { get } - - var sizeMaxWidthTypeBodyLarge: MultipleSizingTokens { get } - var sizeMaxWidthTypeBodyMedium: MultipleSizingTokens { get } - var sizeMaxWidthTypeBodySmall: MultipleSizingTokens { get } -} - -// swiftlint:enable missing_docs diff --git a/OUDS/Core/Tokens/SemanticTokens/Sources/Values/SpaceSemanticTokens.swift b/OUDS/Core/Tokens/SemanticTokens/Sources/Values/SpaceSemanticTokens.swift new file mode 100644 index 000000000..77f368e5d --- /dev/null +++ b/OUDS/Core/Tokens/SemanticTokens/Sources/Values/SpaceSemanticTokens.swift @@ -0,0 +1,152 @@ +// +// Software Name: OUDS iOS +// SPDX-FileCopyrightText: Copyright (c) Orange SA +// SPDX-License-Identifier: MIT +// +// This software is distributed under the MIT license, +// the text of which is available at https://opensource.org/license/MIT/ +// or see the "LICENSE" file for more details. +// +// Authors: See CONTRIBUTORS.txt +// Software description: A SwiftUI components library with code examples for Orange Unified Design System +// + +// ଘ( ・ω・)_/゚・:*:・。☆ +// [File to generate with the tokenator] + +// swiftlint:disable missing_docs + +/// This is a group of semantic tokens for **spacing**. +/// It defines all `SpaceSemanticToken` a theme must have. +/// +/// In the future this file should be generated by a parser converting Figma JSON to Swift code. +public protocol SpaceSemanticTokens { + + // MARK: Semantic token - Spacing - Scaled + + var spaceScaledNone: MultipleSpaceTokens { get } + var spaceScaledSmash: MultipleSpaceTokens { get } + var spaceScaledShortest: MultipleSpaceTokens { get } + var spaceScaledShorter: MultipleSpaceTokens { get } + var spaceScaledShort: MultipleSpaceTokens { get } + var spaceScaledMedium: MultipleSpaceTokens { get } + var spaceScaledTall: MultipleSpaceTokens { get } + var spaceScaledTaller: MultipleSpaceTokens { get } + var spaceScaledTallest: MultipleSpaceTokens { get } + var spaceScaledSpacious: MultipleSpaceTokens { get } + + // MARK: Semantic token - Spacing - Fixed + + var spaceFixedNone: SpaceSemanticToken { get } + var spaceFixedSmash: SpaceSemanticToken { get } + var spaceFixedShortest: SpaceSemanticToken { get } + var spaceFixedShorter: SpaceSemanticToken { get } + var spaceFixedShort: SpaceSemanticToken { get } + var spaceFixedMedium: SpaceSemanticToken { get } + var spaceFixedTall: SpaceSemanticToken { get } + var spaceFixedTaller: SpaceSemanticToken { get } + var spaceFixedTallest: SpaceSemanticToken { get } + var spaceFixedSpacious: SpaceSemanticToken { get } + var spaceFixedHuge: SpaceSemanticToken { get } + var spaceFixedJumbo: SpaceSemanticToken { get } + + // MARK: Semantic token - Spacing - Padding - Padding inline + + var spacePaddingInlineNone: SpacePaddingInlineSemanticToken { get } + var spacePaddingInlineShorter: SpacePaddingInlineSemanticToken { get } + var spacePaddingInlineShort: SpacePaddingInlineSemanticToken { get } + var spacePaddingInlineMedium: SpacePaddingInlineSemanticToken { get } + var spacePaddingInlineTall: SpacePaddingInlineSemanticToken { get } + var spacePaddingInlineTaller: SpacePaddingInlineSemanticToken { get } + var spacePaddingInlineTallest: SpacePaddingInlineSemanticToken { get } + + var spacePaddingInlineWithIconNone: SpacePaddingInlineSemanticToken { get } + var spacePaddingInlineWithIconShortest: SpacePaddingInlineSemanticToken { get } + var spacePaddingInlineWithIconShorter: SpacePaddingInlineSemanticToken { get } + var spacePaddingInlineWithIconShort: SpacePaddingInlineSemanticToken { get } + var spacePaddingInlineWithIconMedium: SpacePaddingInlineSemanticToken { get } + var spacePaddingInlineWithIconTall: SpacePaddingInlineSemanticToken { get } + var spacePaddingInlineWithIconTaller: SpacePaddingInlineSemanticToken { get } + var spacePaddingInlineWithIconTallest: SpacePaddingInlineSemanticToken { get } + + var spacePaddingInlineWithArrowNone: SpacePaddingInlineSemanticToken { get } + var spacePaddingInlineWithArrowShortest: SpacePaddingInlineSemanticToken { get } + var spacePaddingInlineWithArrowShorter: SpacePaddingInlineSemanticToken { get } + var spacePaddingInlineWithArrowShort: SpacePaddingInlineSemanticToken { get } + var spacePaddingInlineWithArrowMedium: SpacePaddingInlineSemanticToken { get } + var spacePaddingInlineWithArrowTall: SpacePaddingInlineSemanticToken { get } + var spacePaddingInlineWithArrowTaller: SpacePaddingInlineSemanticToken { get } + var spacePaddingInlineWithArrowTallest: SpacePaddingInlineSemanticToken { get } + + // MARK: Semantic token - Spacing - Padding - Padding stack + + var spacePaddingBlockNone: SpacePaddingInlineSemanticToken { get } + var spacePaddingBlockShorter: SpacePaddingInlineSemanticToken { get } + var spacePaddingBlockShort: SpacePaddingInlineSemanticToken { get } + var spacePaddingBlockMedium: SpacePaddingInlineSemanticToken { get } + var spacePaddingBlockTall: SpacePaddingInlineSemanticToken { get } + var spacePaddingBlockTaller: SpacePaddingInlineSemanticToken { get } + var spacePaddingBlockTallest: SpacePaddingInlineSemanticToken { get } + + var spacePaddingBlockWithIconNone: SpacePaddingInlineSemanticToken { get } + var spacePaddingBlockWithIconShortest: SpacePaddingInlineSemanticToken { get } + var spacePaddingBlockWithIconShorter: SpacePaddingInlineSemanticToken { get } + var spacePaddingBlockWithIconShort: SpacePaddingInlineSemanticToken { get } + var spacePaddingBlockWithIconMedium: SpacePaddingInlineSemanticToken { get } + var spacePaddingBlockWithIconTall: SpacePaddingInlineSemanticToken { get } + var spacePaddingBlockWithIconTaller: SpacePaddingInlineSemanticToken { get } + + // MARK: Semantic token - Spacing - Padding - Padding inset + + var spaceInsetNone: SpacePaddingInlineSemanticToken { get } + var spaceInsetSmash: SpacePaddingInlineSemanticToken { get } + var spaceInsetShortest: SpacePaddingInlineSemanticToken { get } + var spaceInsetShorter: SpacePaddingInlineSemanticToken { get } + var spaceInsetShort: SpacePaddingInlineSemanticToken { get } + var spaceInsetMedium: SpacePaddingInlineSemanticToken { get } + var spaceInsetTall: SpacePaddingInlineSemanticToken { get } + var spaceInsetTaller: SpacePaddingInlineSemanticToken { get } + var spaceInsetTallest: SpacePaddingInlineSemanticToken { get } + var spaceInsetSpacious: SpacePaddingInlineSemanticToken { get } + + // MARK: Semantic token - Spacing - Padding - Gap inline + + var spaceColumnGapNone: SpacePaddingInlineSemanticToken { get } + var spaceColumnGapShorter: SpacePaddingInlineSemanticToken { get } + var spaceColumnGapShort: SpacePaddingInlineSemanticToken { get } + var spaceColumnGapMedium: SpacePaddingInlineSemanticToken { get } + var spaceColumnGapTall: SpacePaddingInlineSemanticToken { get } + var spaceColumnGapTaller: SpacePaddingInlineSemanticToken { get } + + var spaceColumnGapWithIconNone: SpacePaddingInlineSemanticToken { get } + var spaceColumnGapWithIconShortest: SpacePaddingInlineSemanticToken { get } + var spaceColumnGapWithIconShorter: SpacePaddingInlineSemanticToken { get } + var spaceColumnGapWithIconShort: SpacePaddingInlineSemanticToken { get } + var spaceColumnGapWithIconMedium: SpacePaddingInlineSemanticToken { get } + var spaceColumnGapWithIconTall: SpacePaddingInlineSemanticToken { get } + + var spaceColumnGapWithArrowNone: SpacePaddingInlineSemanticToken { get } + var spaceColumnGapWithArrowShortest: SpacePaddingInlineSemanticToken { get } + var spaceColumnGapWithArrowShorter: SpacePaddingInlineSemanticToken { get } + var spaceColumnGapWithArrowShort: SpacePaddingInlineSemanticToken { get } + var spaceColumnGapWithArrowMedium: SpacePaddingInlineSemanticToken { get } + var spaceColumnGapWithArrowTall: SpacePaddingInlineSemanticToken { get } + + // MARK: Semantic token - Spacing - Padding - Gap stack + + var spaceRowGapNone: SpaceGapStackSemanticToken { get } + var spaceRowGapShortest: SpaceGapStackSemanticToken { get } + var spaceRowGapShorter: SpaceGapStackSemanticToken { get } + var spaceRowGapShort: SpaceGapStackSemanticToken { get } + var spaceRowGapMedium: SpaceGapStackSemanticToken { get } + var spaceRowGapTall: SpaceGapStackSemanticToken { get } + + var spaceRowGapWithIconNone: SpaceGapStackSemanticToken { get } + var spaceRowGapWithIconShortest: SpaceGapStackSemanticToken { get } + var spaceRowGapWithIconShorter: SpaceGapStackSemanticToken { get } + var spaceRowGapWithIconShort: SpaceGapStackSemanticToken { get } + var spaceRowGapWithIconMedium: SpaceGapStackSemanticToken { get } + var spaceRowGapWithIconTall: SpaceGapStackSemanticToken { get } +} + +// swiftlint:enable missing_docs diff --git a/OUDS/Core/Tokens/SemanticTokens/Sources/Values/SpacingSemanticTokens.swift b/OUDS/Core/Tokens/SemanticTokens/Sources/Values/SpacingSemanticTokens.swift deleted file mode 100644 index d47682e13..000000000 --- a/OUDS/Core/Tokens/SemanticTokens/Sources/Values/SpacingSemanticTokens.swift +++ /dev/null @@ -1,152 +0,0 @@ -// -// Software Name: OUDS iOS -// SPDX-FileCopyrightText: Copyright (c) Orange SA -// SPDX-License-Identifier: MIT -// -// This software is distributed under the MIT license, -// the text of which is available at https://opensource.org/license/MIT/ -// or see the "LICENSE" file for more details. -// -// Authors: See CONTRIBUTORS.txt -// Software description: A SwiftUI components library with code examples for Orange Unified Design System -// - -// ଘ( ・ω・)_/゚・:*:・。☆ -// [File to generate with the tokenator] - -// swiftlint:disable missing_docs - -/// This is a group of semantic tokens for **spacing**. -/// It defines all `SpacingSemanticToken` a theme must have. -/// -/// In the future this file should be generated by a parser converting Figma JSON to Swift code. -public protocol SpacingSemanticTokens { - - // MARK: Semantic token - Spacing - Scaled - - var spaceScaledNone: MultipleSpacingTokens { get } - var spaceScaledSmash: MultipleSpacingTokens { get } - var spaceScaledShortest: MultipleSpacingTokens { get } - var spaceScaledShorter: MultipleSpacingTokens { get } - var spaceScaledShort: MultipleSpacingTokens { get } - var spaceScaledMedium: MultipleSpacingTokens { get } - var spaceScaledTall: MultipleSpacingTokens { get } - var spaceScaledTaller: MultipleSpacingTokens { get } - var spaceScaledTallest: MultipleSpacingTokens { get } - var spaceScaledSpacious: MultipleSpacingTokens { get } - - // MARK: Semantic token - Spacing - Fixed - - var spaceFixedNone: SpacingSemanticToken { get } - var spaceFixedSmash: SpacingSemanticToken { get } - var spaceFixedShortest: SpacingSemanticToken { get } - var spaceFixedShorter: SpacingSemanticToken { get } - var spaceFixedShort: SpacingSemanticToken { get } - var spaceFixedMedium: SpacingSemanticToken { get } - var spaceFixedTall: SpacingSemanticToken { get } - var spaceFixedTaller: SpacingSemanticToken { get } - var spaceFixedTallest: SpacingSemanticToken { get } - var spaceFixedSpacious: SpacingSemanticToken { get } - var spaceFixedHuge: SpacingSemanticToken { get } - var spaceFixedJumbo: SpacingSemanticToken { get } - - // MARK: Semantic token - Spacing - Padding - Padding inline - - var spacePaddingInlineNone: SpacingPaddingInlineSemanticToken { get } - var spacePaddingInlineShorter: SpacingPaddingInlineSemanticToken { get } - var spacePaddingInlineShort: SpacingPaddingInlineSemanticToken { get } - var spacePaddingInlineMedium: SpacingPaddingInlineSemanticToken { get } - var spacePaddingInlineTall: SpacingPaddingInlineSemanticToken { get } - var spacePaddingInlineTaller: SpacingPaddingInlineSemanticToken { get } - var spacePaddingInlineTallest: SpacingPaddingInlineSemanticToken { get } - - var spacePaddingInlineWithIconNone: SpacingPaddingInlineSemanticToken { get } - var spacePaddingInlineWithIconShortest: SpacingPaddingInlineSemanticToken { get } - var spacePaddingInlineWithIconShorter: SpacingPaddingInlineSemanticToken { get } - var spacePaddingInlineWithIconShort: SpacingPaddingInlineSemanticToken { get } - var spacePaddingInlineWithIconMedium: SpacingPaddingInlineSemanticToken { get } - var spacePaddingInlineWithIconTall: SpacingPaddingInlineSemanticToken { get } - var spacePaddingInlineWithIconTaller: SpacingPaddingInlineSemanticToken { get } - var spacePaddingInlineWithIconTallest: SpacingPaddingInlineSemanticToken { get } - - var spacePaddingInlineWithArrowNone: SpacingPaddingInlineSemanticToken { get } - var spacePaddingInlineWithArrowShortest: SpacingPaddingInlineSemanticToken { get } - var spacePaddingInlineWithArrowShorter: SpacingPaddingInlineSemanticToken { get } - var spacePaddingInlineWithArrowShort: SpacingPaddingInlineSemanticToken { get } - var spacePaddingInlineWithArrowMedium: SpacingPaddingInlineSemanticToken { get } - var spacePaddingInlineWithArrowTall: SpacingPaddingInlineSemanticToken { get } - var spacePaddingInlineWithArrowTaller: SpacingPaddingInlineSemanticToken { get } - var spacePaddingInlineWithArrowTallest: SpacingPaddingInlineSemanticToken { get } - - // MARK: Semantic token - Spacing - Padding - Padding stack - - var spacePaddingBlockNone: SpacingPaddingInlineSemanticToken { get } - var spacePaddingBlockShorter: SpacingPaddingInlineSemanticToken { get } - var spacePaddingBlockShort: SpacingPaddingInlineSemanticToken { get } - var spacePaddingBlockMedium: SpacingPaddingInlineSemanticToken { get } - var spacePaddingBlockTall: SpacingPaddingInlineSemanticToken { get } - var spacePaddingBlockTaller: SpacingPaddingInlineSemanticToken { get } - var spacePaddingBlockTallest: SpacingPaddingInlineSemanticToken { get } - - var spacePaddingBlockWithIconNone: SpacingPaddingInlineSemanticToken { get } - var spacePaddingBlockWithIconShortest: SpacingPaddingInlineSemanticToken { get } - var spacePaddingBlockWithIconShorter: SpacingPaddingInlineSemanticToken { get } - var spacePaddingBlockWithIconShort: SpacingPaddingInlineSemanticToken { get } - var spacePaddingBlockWithIconMedium: SpacingPaddingInlineSemanticToken { get } - var spacePaddingBlockWithIconTall: SpacingPaddingInlineSemanticToken { get } - var spacePaddingBlockWithIconTaller: SpacingPaddingInlineSemanticToken { get } - - // MARK: Semantic token - Spacing - Padding - Padding inset - - var spaceInsetNone: SpacingPaddingInlineSemanticToken { get } - var spaceInsetSmash: SpacingPaddingInlineSemanticToken { get } - var spaceInsetShortest: SpacingPaddingInlineSemanticToken { get } - var spaceInsetShorter: SpacingPaddingInlineSemanticToken { get } - var spaceInsetShort: SpacingPaddingInlineSemanticToken { get } - var spaceInsetMedium: SpacingPaddingInlineSemanticToken { get } - var spaceInsetTall: SpacingPaddingInlineSemanticToken { get } - var spaceInsetTaller: SpacingPaddingInlineSemanticToken { get } - var spaceInsetTallest: SpacingPaddingInlineSemanticToken { get } - var spaceInsetSpacious: SpacingPaddingInlineSemanticToken { get } - - // MARK: Semantic token - Spacing - Padding - Gap inline - - var spaceColumnGapNone: SpacingPaddingInlineSemanticToken { get } - var spaceColumnGapShorter: SpacingPaddingInlineSemanticToken { get } - var spaceColumnGapShort: SpacingPaddingInlineSemanticToken { get } - var spaceColumnGapMedium: SpacingPaddingInlineSemanticToken { get } - var spaceColumnGapTall: SpacingPaddingInlineSemanticToken { get } - var spaceColumnGapTaller: SpacingPaddingInlineSemanticToken { get } - - var spaceColumnGapWithIconNone: SpacingPaddingInlineSemanticToken { get } - var spaceColumnGapWithIconShortest: SpacingPaddingInlineSemanticToken { get } - var spaceColumnGapWithIconShorter: SpacingPaddingInlineSemanticToken { get } - var spaceColumnGapWithIconShort: SpacingPaddingInlineSemanticToken { get } - var spaceColumnGapWithIconMedium: SpacingPaddingInlineSemanticToken { get } - var spaceColumnGapWithIconTall: SpacingPaddingInlineSemanticToken { get } - - var spaceColumnGapWithArrowNone: SpacingPaddingInlineSemanticToken { get } - var spaceColumnGapWithArrowShortest: SpacingPaddingInlineSemanticToken { get } - var spaceColumnGapWithArrowShorter: SpacingPaddingInlineSemanticToken { get } - var spaceColumnGapWithArrowShort: SpacingPaddingInlineSemanticToken { get } - var spaceColumnGapWithArrowMedium: SpacingPaddingInlineSemanticToken { get } - var spaceColumnGapWithArrowTall: SpacingPaddingInlineSemanticToken { get } - - // MARK: Semantic token - Spacing - Padding - Gap stack - - var spaceRowGapNone: SpacingGapStackSemanticToken { get } - var spaceRowGapShortest: SpacingGapStackSemanticToken { get } - var spaceRowGapShorter: SpacingGapStackSemanticToken { get } - var spaceRowGapShort: SpacingGapStackSemanticToken { get } - var spaceRowGapMedium: SpacingGapStackSemanticToken { get } - var spaceRowGapTall: SpacingGapStackSemanticToken { get } - - var spaceRowGapWithIconNone: SpacingGapStackSemanticToken { get } - var spaceRowGapWithIconShortest: SpacingGapStackSemanticToken { get } - var spaceRowGapWithIconShorter: SpacingGapStackSemanticToken { get } - var spaceRowGapWithIconShort: SpacingGapStackSemanticToken { get } - var spaceRowGapWithIconMedium: SpacingGapStackSemanticToken { get } - var spaceRowGapWithIconTall: SpacingGapStackSemanticToken { get } -} - -// swiftlint:enable missing_docs diff --git a/OUDS/Core/Tokens/SemanticTokens/Sources/_OUDSTokensSemantic.docc/OUDSTokensSemantic.md b/OUDS/Core/Tokens/SemanticTokens/Sources/_OUDSTokensSemantic.docc/OUDSTokensSemantic.md index 425ca4437..45e21472c 100644 --- a/OUDS/Core/Tokens/SemanticTokens/Sources/_OUDSTokensSemantic.docc/OUDSTokensSemantic.md +++ b/OUDS/Core/Tokens/SemanticTokens/Sources/_OUDSTokensSemantic.docc/OUDSTokensSemantic.md @@ -80,6 +80,6 @@ If you update the value, keep also the CHANGELOG and/or RELEASE NOTE updated so - ``ElevationSemanticTokens`` - ``GridSemanticTokens`` - ``OpacitySemanticTokens`` -- ``SizingSemanticTokens`` -- ``SpacingSemanticTokens`` +- ``SizeSemanticTokens`` +- ``SpaceSemanticTokens`` - ``TypographySemanticTokens`` diff --git a/OUDS/Core/Tokens/SemanticTokens/Tests/Multiples/MultipleColorSemanticTokenTests.swift b/OUDS/Core/Tokens/SemanticTokens/Tests/Multiples/MultipleColorSemanticTokenTests.swift index 7c20a62c9..0f58d1dd3 100644 --- a/OUDS/Core/Tokens/SemanticTokens/Tests/Multiples/MultipleColorSemanticTokenTests.swift +++ b/OUDS/Core/Tokens/SemanticTokens/Tests/Multiples/MultipleColorSemanticTokenTests.swift @@ -62,7 +62,7 @@ final class MultipleColorRawTokenTests: XCTestCase { let third = MultipleColorTokens(light: ColorRawTokens.colorFunctionalMalachite300, dark: ColorRawTokens.colorFunctionalSun100) let fourth = MultipleColorTokens(light: ColorRawTokens.colorFunctionalDarkGray80, dark: ColorRawTokens.colorFunctionalScarlet900) let fifth = MultipleColorTokens(light: ColorRawTokens.colorFunctionalMalachite300, dark: ColorRawTokens.colorFunctionalScarlet900) - let sixth = MultipleSizingTokens(compact: 12, regular: 12) + let sixth = MultipleSizeTokens(compact: 12, regular: 12) XCTAssertTrue(first.isEqual(first)) XCTAssertFalse(first.isEqual(second)) diff --git a/OUDS/Core/Tokens/SemanticTokens/Tests/Multiples/MultipleElevationTokensTests.swift b/OUDS/Core/Tokens/SemanticTokens/Tests/Multiples/MultipleElevationTokensTests.swift index b054d253f..559c83005 100644 --- a/OUDS/Core/Tokens/SemanticTokens/Tests/Multiples/MultipleElevationTokensTests.swift +++ b/OUDS/Core/Tokens/SemanticTokens/Tests/Multiples/MultipleElevationTokensTests.swift @@ -47,7 +47,7 @@ final class MultipleElevationTokensTests: XCTestCase { let third = MultipleElevationTokens(light: ElevationRawTokens.elevationBottom_4_100, dark: ElevationRawTokens.elevationBottom_3_500) let fourth = MultipleElevationTokens(light: ElevationRawTokens.elevationBottom_3_300, dark: ElevationRawTokens.elevationBottom_2_500) let fifth = MultipleElevationTokens(light: ElevationRawTokens.elevationBottom_4_100, dark: ElevationRawTokens.elevationBottom_2_500) - let sixth = MultipleSizingTokens(compact: 12, regular: 12) + let sixth = MultipleSizeTokens(compact: 12, regular: 12) XCTAssertTrue(first.isEqual(first)) XCTAssertFalse(first.isEqual(second)) diff --git a/OUDS/Core/Tokens/SemanticTokens/Tests/Multiples/MultipleFontLetterSpacingTokensTests.swift b/OUDS/Core/Tokens/SemanticTokens/Tests/Multiples/MultipleFontLetterSpacingTokensTests.swift index 0ce50b0a9..387b0b039 100644 --- a/OUDS/Core/Tokens/SemanticTokens/Tests/Multiples/MultipleFontLetterSpacingTokensTests.swift +++ b/OUDS/Core/Tokens/SemanticTokens/Tests/Multiples/MultipleFontLetterSpacingTokensTests.swift @@ -47,7 +47,7 @@ final class MultipleFontLetterSpacingTokensTests: XCTestCase { let third = MultipleFontLetterSpacingTokens(compact: TypographyRawTokens.fontLetterSpacing300, regular: TypographyRawTokens.fontLineHeight250) let fourth = MultipleFontLetterSpacingTokens(compact: TypographyRawTokens.fontLetterSpacing650, regular: TypographyRawTokens.fontLineHeight850) let fifth = MultipleFontLetterSpacingTokens(compact: TypographyRawTokens.fontLetterSpacing300, regular: TypographyRawTokens.fontLetterSpacing300) - let sixth = MultipleSizingTokens(compact: 12, regular: 12) + let sixth = MultipleSizeTokens(compact: 12, regular: 12) XCTAssertTrue(first.isEqual(first)) XCTAssertFalse(first.isEqual(second)) diff --git a/OUDS/Core/Tokens/SemanticTokens/Tests/Multiples/MultipleFontLineHeightTokensTests.swift b/OUDS/Core/Tokens/SemanticTokens/Tests/Multiples/MultipleFontLineHeightTokensTests.swift index 8f87b9237..cdd34b5d8 100644 --- a/OUDS/Core/Tokens/SemanticTokens/Tests/Multiples/MultipleFontLineHeightTokensTests.swift +++ b/OUDS/Core/Tokens/SemanticTokens/Tests/Multiples/MultipleFontLineHeightTokensTests.swift @@ -47,7 +47,7 @@ final class MultipleFontLineHeightTokensTests: XCTestCase { let third = MultipleFontLineHeightTokens(compact: TypographyRawTokens.fontLineHeight450, regular: TypographyRawTokens.fontLineHeight550) let fourth = MultipleFontLineHeightTokens(compact: TypographyRawTokens.fontLineHeight650, regular: TypographyRawTokens.fontLineHeight750) let fifth = MultipleFontLineHeightTokens(compact: TypographyRawTokens.fontLineHeight450, regular: TypographyRawTokens.fontLineHeight450) - let sixth = MultipleSizingTokens(compact: 12, regular: 12) + let sixth = MultipleSizeTokens(compact: 12, regular: 12) XCTAssertTrue(first.isEqual(first)) XCTAssertFalse(first.isEqual(second)) diff --git a/OUDS/Core/Tokens/SemanticTokens/Tests/Multiples/MultipleFontSizeTokensTests.swift b/OUDS/Core/Tokens/SemanticTokens/Tests/Multiples/MultipleFontSizeTokensTests.swift index d06f67f19..c0dc5ae4d 100644 --- a/OUDS/Core/Tokens/SemanticTokens/Tests/Multiples/MultipleFontSizeTokensTests.swift +++ b/OUDS/Core/Tokens/SemanticTokens/Tests/Multiples/MultipleFontSizeTokensTests.swift @@ -47,7 +47,7 @@ final class MultipleFontSizeTokensTests: XCTestCase { let third = MultipleFontSizeTokens(compact: TypographyRawTokens.fontSize200, regular: TypographyRawTokens.fontSize950) let fourth = MultipleFontSizeTokens(compact: TypographyRawTokens.fontSize550, regular: TypographyRawTokens.fontSize450) let fifth = MultipleFontSizeTokens(compact: TypographyRawTokens.fontSize200, regular: TypographyRawTokens.fontSize450) - let sixth = MultipleSizingTokens(compact: 12, regular: 12) + let sixth = MultipleSizeTokens(compact: 12, regular: 12) XCTAssertTrue(first.isEqual(first)) XCTAssertFalse(first.isEqual(second)) diff --git a/OUDS/Core/Tokens/SemanticTokens/Tests/Multiples/MultipleSizingSemanticTokenTests.swift b/OUDS/Core/Tokens/SemanticTokens/Tests/Multiples/MultipleSizingSemanticTokenTests.swift index 60475931c..7f1a4b640 100644 --- a/OUDS/Core/Tokens/SemanticTokens/Tests/Multiples/MultipleSizingSemanticTokenTests.swift +++ b/OUDS/Core/Tokens/SemanticTokens/Tests/Multiples/MultipleSizingSemanticTokenTests.swift @@ -21,8 +21,8 @@ final class MultipleSizingTokensTests: XCTestCase { /// Tests if compact and regular values are preserved when defined func testInitWithOneValues() { - let unique: SizingSemanticToken = 888 - let token = MultipleSizingTokens(unique) + let unique: SizeSemanticToken = 888 + let token = MultipleSizeTokens(unique) XCTAssertTrue(token.compact == unique) XCTAssertTrue(token.regular == unique) @@ -30,9 +30,9 @@ final class MultipleSizingTokensTests: XCTestCase { /// Tests if compact and regular values are preserved when defined func testInitTwoValues() { - let compact: SizingSemanticToken = 123 - let regular: SizingSemanticToken = 456 - let token = MultipleSizingTokens(compact: compact, regular: regular) + let compact: SizeSemanticToken = 123 + let regular: SizeSemanticToken = 456 + let token = MultipleSizeTokens(compact: compact, regular: regular) XCTAssertTrue(token.compact == compact) XCTAssertTrue(token.regular == regular) @@ -41,11 +41,11 @@ final class MultipleSizingTokensTests: XCTestCase { /// Tests comparisons between two `MultipleSizingTokens` to ensure tokens are considered as equal /// if an only if they have the same compact and regular values and have the same types. func testIsEqual() { - let first = MultipleSizingTokens(compact: 12, regular: 34) - let second = MultipleSizingTokens(compact: 56, regular: 78) - let third = MultipleSizingTokens(compact: 12, regular: 78) - let fourth = MultipleSizingTokens(compact: 56, regular: 34) - let fifth = MultipleSizingTokens(compact: 12, regular: 34) + let first = MultipleSizeTokens(compact: 12, regular: 34) + let second = MultipleSizeTokens(compact: 56, regular: 78) + let third = MultipleSizeTokens(compact: 12, regular: 78) + let fourth = MultipleSizeTokens(compact: 56, regular: 34) + let fifth = MultipleSizeTokens(compact: 12, regular: 34) let sixth = MultipleColorTokens("#000000") XCTAssertTrue(first.isEqual(first)) diff --git a/OUDS/Core/Tokens/SemanticTokens/Tests/Multiples/MultipleSpacingTokensTests.swift b/OUDS/Core/Tokens/SemanticTokens/Tests/Multiples/MultipleSpacingTokensTests.swift index 43376323a..18e076c78 100644 --- a/OUDS/Core/Tokens/SemanticTokens/Tests/Multiples/MultipleSpacingTokensTests.swift +++ b/OUDS/Core/Tokens/SemanticTokens/Tests/Multiples/MultipleSpacingTokensTests.swift @@ -24,7 +24,7 @@ final class MultipleSpacingTokensTests: XCTestCase { func testInit() { let compact: DimensionRawToken = 123 let regular: DimensionRawToken = 456 - let token = MultipleSpacingTokens(compact: compact, regular: regular) + let token = MultipleSpaceTokens(compact: compact, regular: regular) XCTAssertTrue(token.compact == compact) XCTAssertTrue(token.regular == regular) @@ -33,12 +33,12 @@ final class MultipleSpacingTokensTests: XCTestCase { /// Tests comparisons between two `MultipleSpacingTokens` to ensure tokens are considered as equal /// if an only if they have the same compact and regular values and have the same types. func testIsEqual() { - let first = MultipleSpacingTokens(compact: 12, regular: 34) - let second = MultipleSpacingTokens(compact: 56, regular: 78) - let third = MultipleSpacingTokens(compact: 12, regular: 78) - let fourth = MultipleSpacingTokens(compact: 56, regular: 34) - let fifth = MultipleSpacingTokens(compact: 12, regular: 34) - let sixth = MultipleSizingTokens(compact: 0, regular: 00) + let first = MultipleSpaceTokens(compact: 12, regular: 34) + let second = MultipleSpaceTokens(compact: 56, regular: 78) + let third = MultipleSpaceTokens(compact: 12, regular: 78) + let fourth = MultipleSpaceTokens(compact: 56, regular: 34) + let fifth = MultipleSpaceTokens(compact: 12, regular: 34) + let sixth = MultipleSizeTokens(compact: 0, regular: 00) XCTAssertTrue(first.isEqual(first)) XCTAssertFalse(first.isEqual(second)) diff --git a/OUDS/Core/Tokens/SemanticTokens/Tests/Multiples/MultipleTypographyTokensTests.swift b/OUDS/Core/Tokens/SemanticTokens/Tests/Multiples/MultipleTypographyTokensTests.swift index 241c948a0..4943fc422 100644 --- a/OUDS/Core/Tokens/SemanticTokens/Tests/Multiples/MultipleTypographyTokensTests.swift +++ b/OUDS/Core/Tokens/SemanticTokens/Tests/Multiples/MultipleTypographyTokensTests.swift @@ -47,7 +47,7 @@ final class MultipleTypographyTokensTests: XCTestCase { let third = MultipleTypographyTokens(compact: TypographyRawTokens.typeRegular150, regular: TypographyRawTokens.typeBold750) let fourth = MultipleTypographyTokens(compact: TypographyRawTokens.typeBold850, regular: TypographyRawTokens.typeBold550) let fifth = MultipleTypographyTokens(compact: TypographyRawTokens.typeRegular150, regular: TypographyRawTokens.typeBold550) - let sixth = MultipleSizingTokens(compact: 0, regular: 0) + let sixth = MultipleSizeTokens(compact: 0, regular: 0) XCTAssertTrue(first.isEqual(first)) XCTAssertFalse(first.isEqual(second)) diff --git a/Package.resolved b/Package.resolved index faaccc756..da3f754c4 100644 --- a/Package.resolved +++ b/Package.resolved @@ -1,22 +1,22 @@ { - "originHash" : "e71a5b08dd41106aab31bef69b8183c27372e20aad985d3798a43491894b7e7c", + "originHash" : "b0e966f4ace0da078a6fcc1dcd094050f4d63b9437f87a3a6b4948c17b90db4e", "pins" : [ { - "identity" : "swift-docc-plugin", + "identity" : "swift-snapshot-testing", "kind" : "remoteSourceControl", - "location" : "https://github.com/apple/swift-docc-plugin", + "location" : "https://github.com/pointfreeco/swift-snapshot-testing.git", "state" : { - "revision" : "2eb22993b3dfd0c0d32729b357c8dabb6cd44680", - "version" : "1.4.2" + "revision" : "7b0bbbae90c41f848f90ac7b4df6c4f50068256d", + "version" : "1.17.5" } }, { - "identity" : "swift-docc-symbolkit", + "identity" : "swift-syntax", "kind" : "remoteSourceControl", - "location" : "https://github.com/swiftlang/swift-docc-symbolkit", + "location" : "https://github.com/swiftlang/swift-syntax", "state" : { - "revision" : "b45d1f2ed151d057b54504d653e0da5552844e34", - "version" : "1.0.0" + "revision" : "515f79b522918f83483068d99c68daeb5116342d", + "version" : "600.0.0-prerelease-2024-09-04" } } ], diff --git a/Showcase/Showcase/Pages/Tokens/Dimension/Size/SizeTokenPage.swift b/Showcase/Showcase/Pages/Tokens/Dimension/Size/SizeTokenPage.swift index 8d70f033c..d8dad5507 100644 --- a/Showcase/Showcase/Pages/Tokens/Dimension/Size/SizeTokenPage.swift +++ b/Showcase/Showcase/Pages/Tokens/Dimension/Size/SizeTokenPage.swift @@ -69,7 +69,7 @@ private enum NamedSizing: String, CaseIterable { case sizeIconDecorativeTaller case sizeIconDecorativeTallest - func token(from theme: OUDSTheme) -> SizingSemanticToken { + func token(from theme: OUDSTheme) -> SizeSemanticToken { switch self { case .sizeIconDecorativeShortest: return theme.sizeIconDecorativeShortest diff --git a/Showcase/Showcase/Pages/Tokens/Dimension/Space/NamedSpace/NameSpace+GapInline.swift b/Showcase/Showcase/Pages/Tokens/Dimension/Space/NamedSpace/NameSpace+GapInline.swift index c5dabb584..e965fb6a8 100644 --- a/Showcase/Showcase/Pages/Tokens/Dimension/Space/NamedSpace/NameSpace+GapInline.swift +++ b/Showcase/Showcase/Pages/Tokens/Dimension/Space/NamedSpace/NameSpace+GapInline.swift @@ -24,7 +24,7 @@ extension NamedSpace { case spaceColumnGapTall case spaceColumnGapTaller - func token(from theme: OUDSTheme) -> SpacingSemanticToken { + func token(from theme: OUDSTheme) -> SpaceSemanticToken { switch self { case .spaceColumnGapNone: return theme.spaceColumnGapNone diff --git a/Showcase/Showcase/Pages/Tokens/Dimension/Space/NamedSpace/NameSpace+GapStack.swift b/Showcase/Showcase/Pages/Tokens/Dimension/Space/NamedSpace/NameSpace+GapStack.swift index 36e5022e8..b7518726c 100644 --- a/Showcase/Showcase/Pages/Tokens/Dimension/Space/NamedSpace/NameSpace+GapStack.swift +++ b/Showcase/Showcase/Pages/Tokens/Dimension/Space/NamedSpace/NameSpace+GapStack.swift @@ -24,7 +24,7 @@ extension NamedSpace { case spaceRowGapMedium case spaceRowGapTall - func token(from theme: OUDSTheme) -> SpacingSemanticToken { + func token(from theme: OUDSTheme) -> SpaceSemanticToken { switch self { case .spaceRowGapNone: return theme.spaceRowGapNone diff --git a/Showcase/Showcase/Pages/Tokens/Dimension/Space/NamedSpace/NameSpace+PaddingInline.swift b/Showcase/Showcase/Pages/Tokens/Dimension/Space/NamedSpace/NameSpace+PaddingInline.swift index a80a23a0c..96fc07590 100644 --- a/Showcase/Showcase/Pages/Tokens/Dimension/Space/NamedSpace/NameSpace+PaddingInline.swift +++ b/Showcase/Showcase/Pages/Tokens/Dimension/Space/NamedSpace/NameSpace+PaddingInline.swift @@ -25,7 +25,7 @@ extension NamedSpace { case spacePaddingInlineTaller case spacePaddingInlineTallest - func token(from theme: OUDSTheme) -> SpacingSemanticToken { + func token(from theme: OUDSTheme) -> SpaceSemanticToken { switch self { case .spacePaddingInlineNone: return theme.spacePaddingInlineNone diff --git a/Showcase/Showcase/Pages/Tokens/Dimension/Space/NamedSpace/NameSpace+PaddingInlineWithArrow.swift b/Showcase/Showcase/Pages/Tokens/Dimension/Space/NamedSpace/NameSpace+PaddingInlineWithArrow.swift index b719542ee..f22b59b5a 100644 --- a/Showcase/Showcase/Pages/Tokens/Dimension/Space/NamedSpace/NameSpace+PaddingInlineWithArrow.swift +++ b/Showcase/Showcase/Pages/Tokens/Dimension/Space/NamedSpace/NameSpace+PaddingInlineWithArrow.swift @@ -26,7 +26,7 @@ extension NamedSpace { case spacePaddingInlineWithArrowTaller case spacePaddingInlineWithArrowTallest - func token(from theme: OUDSTheme) -> SpacingSemanticToken { + func token(from theme: OUDSTheme) -> SpaceSemanticToken { switch self { case .spacePaddingInlineWithArrowNone: return theme.spacePaddingInlineWithArrowNone diff --git a/Showcase/Showcase/Pages/Tokens/Dimension/Space/NamedSpace/NameSpace+PaddingInlineWithIcon.swift b/Showcase/Showcase/Pages/Tokens/Dimension/Space/NamedSpace/NameSpace+PaddingInlineWithIcon.swift index d71533434..e9d4f8ef4 100644 --- a/Showcase/Showcase/Pages/Tokens/Dimension/Space/NamedSpace/NameSpace+PaddingInlineWithIcon.swift +++ b/Showcase/Showcase/Pages/Tokens/Dimension/Space/NamedSpace/NameSpace+PaddingInlineWithIcon.swift @@ -26,7 +26,7 @@ extension NamedSpace { case spacePaddingInlineWithIconTaller case spacePaddingInlineWithIconTallest - func token(from theme: OUDSTheme) -> SpacingSemanticToken { + func token(from theme: OUDSTheme) -> SpaceSemanticToken { switch self { case .spacePaddingInlineWithIconNone: return theme.spacePaddingInlineWithIconNone diff --git a/Showcase/Showcase/Pages/Tokens/Dimension/Space/NamedSpace/NameSpace+PaddingInset.swift b/Showcase/Showcase/Pages/Tokens/Dimension/Space/NamedSpace/NameSpace+PaddingInset.swift index 38a5d6fd7..cd1e83bd1 100644 --- a/Showcase/Showcase/Pages/Tokens/Dimension/Space/NamedSpace/NameSpace+PaddingInset.swift +++ b/Showcase/Showcase/Pages/Tokens/Dimension/Space/NamedSpace/NameSpace+PaddingInset.swift @@ -28,7 +28,7 @@ extension NamedSpace { case spaceInsetTallest case spaceInsetSpacious - func token(from theme: OUDSTheme) -> SpacingSemanticToken { + func token(from theme: OUDSTheme) -> SpaceSemanticToken { switch self { case .spaceInsetNone: return theme.spaceInsetNone diff --git a/Showcase/Showcase/Pages/Tokens/Dimension/Space/NamedSpace/NameSpace+PaddingStack.swift b/Showcase/Showcase/Pages/Tokens/Dimension/Space/NamedSpace/NameSpace+PaddingStack.swift index d2adcc57a..8507a7443 100644 --- a/Showcase/Showcase/Pages/Tokens/Dimension/Space/NamedSpace/NameSpace+PaddingStack.swift +++ b/Showcase/Showcase/Pages/Tokens/Dimension/Space/NamedSpace/NameSpace+PaddingStack.swift @@ -25,7 +25,7 @@ extension NamedSpace { case spacePaddingBlockTaller case spacePaddingBlockTallest - func token(from theme: OUDSTheme) -> SpacingSemanticToken { + func token(from theme: OUDSTheme) -> SpaceSemanticToken { switch self { case .spacePaddingBlockNone: return theme.spacePaddingBlockNone diff --git a/Showcase/Showcase/Pages/Tokens/Dimension/Space/NamedSpace/NamedSpace+Fixed.swift b/Showcase/Showcase/Pages/Tokens/Dimension/Space/NamedSpace/NamedSpace+Fixed.swift index 88872784b..6b545f9c7 100644 --- a/Showcase/Showcase/Pages/Tokens/Dimension/Space/NamedSpace/NamedSpace+Fixed.swift +++ b/Showcase/Showcase/Pages/Tokens/Dimension/Space/NamedSpace/NamedSpace+Fixed.swift @@ -30,7 +30,7 @@ extension NamedSpace { case spaceFixedHuge case spaceFixedJumbo - func token(from theme: OUDSTheme) -> SpacingSemanticToken { + func token(from theme: OUDSTheme) -> SpaceSemanticToken { switch self { case .spaceFixedNone: return theme.spaceFixedNone diff --git a/Showcase/Showcase/Pages/Tokens/Dimension/Space/NamedSpace/NamedSpace+Scaled.swift b/Showcase/Showcase/Pages/Tokens/Dimension/Space/NamedSpace/NamedSpace+Scaled.swift index 023a52bcf..222338d01 100644 --- a/Showcase/Showcase/Pages/Tokens/Dimension/Space/NamedSpace/NamedSpace+Scaled.swift +++ b/Showcase/Showcase/Pages/Tokens/Dimension/Space/NamedSpace/NamedSpace+Scaled.swift @@ -28,7 +28,7 @@ extension NamedSpace { case spaceScaledTallest case spaceScaledSpacious - func token(from theme: OUDSTheme) -> MultipleSpacingTokens { + func token(from theme: OUDSTheme) -> MultipleSpaceTokens { switch self { case .spaceScaledNone: return theme.spaceScaledNone From ca2aebdd95244b9e28497eddea3fa17acf09771e Mon Sep 17 00:00:00 2001 From: Pierre-Yves Lapersonne Date: Thu, 24 Oct 2024 18:28:51 +0200 Subject: [PATCH 19/30] feat: add font weight semantic token `fontWeightCode` (#242) (#248) Signed-off-by: Pierre-Yves Lapersonne --- CHANGELOG.md | 2 +- .../OUDSTheme+TypographySemanticTokens.swift | 1 + .../MockTheme+TypographySemanticTokens.swift | 3 +++ ...tThemeOverrideOfTypographySemanticTokens.swift | 15 +++++++++++++++ .../Sources/Values/TypographySemanticTokens.swift | 1 + 5 files changed, 21 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bba7c8ca1..c4f49483a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added +- [Library] Semantic token `fontWeightCode` ([#242](https://github.com/Orange-OpenSource/ouds-ios/issues/242)) - [DemoApp] Update space tokens screen with all categories ([#178](https://github.com/Orange-OpenSource/ouds-ios/issues/178)) - [Library] Semantic token `borderWidthFocusInset` ([#207](https://github.com/Orange-OpenSource/ouds-ios/issues/207)) @@ -36,7 +37,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - [Library] Semantic tokens `colorDecorativeBrandSecondaryMuted`, `colorDecorativeBrandSecondaryEmphasized` ([#208](https://github.com/Orange-OpenSource/ouds-ios/issues/208)) - [Library] Semantic tokens `colorDecorativeBrandPrimaryMuted`, `colorDecorativeBrandPrimaryEmphasized` ([#208](https://github.com/Orange-OpenSource/ouds-ios/issues/208)) - [Library] Semantic tokens `elevationBlurFocus`, `elevationXFocus`, `elevationYFocus`, `elevationColorFocus` ([#209](https://github.com/Orange-OpenSource/ouds-ios/issues/209)) -- [Library] Semantic token `fontWeightCode` ([#210](https://github.com/Orange-OpenSource/ouds-ios/issues/210)) ### Fixed diff --git a/OUDS/Core/OUDS/Sources/OUDSTheme/OUDSTheme+SemanticTokens/OUDSTheme+TypographySemanticTokens.swift b/OUDS/Core/OUDS/Sources/OUDSTheme/OUDSTheme+SemanticTokens/OUDSTheme+TypographySemanticTokens.swift index 3c69ea962..710518e8e 100644 --- a/OUDS/Core/OUDS/Sources/OUDSTheme/OUDSTheme+SemanticTokens/OUDSTheme+TypographySemanticTokens.swift +++ b/OUDS/Core/OUDS/Sources/OUDSTheme/OUDSTheme+SemanticTokens/OUDSTheme+TypographySemanticTokens.swift @@ -36,6 +36,7 @@ extension OUDSTheme: TypographySemanticTokens { // MARK: Semantic token - Typography - Font - Weight @objc open var fontWeightDefault: TypographyFontWeightSemanticToken { TypographyRawTokens.fontWeight400 } + @objc open var fontWeightCode: TypographyFontWeightSemanticToken { TypographyRawTokens.fontWeight400 } @objc open var fontWeightStrong: TypographyFontWeightSemanticToken { TypographyRawTokens.fontWeight700 } @objc open var fontWeightDisplay: TypographyFontWeightSemanticToken { fontWeightStrong } @objc open var fontWeightHeading: TypographyFontWeightSemanticToken { fontWeightStrong } diff --git a/OUDS/Core/OUDS/Tests/OUDSTheme/MockThemes/MockTheme+TypographySemanticTokens.swift b/OUDS/Core/OUDS/Tests/OUDSTheme/MockThemes/MockTheme+TypographySemanticTokens.swift index 886efeab9..bda20ecca 100644 --- a/OUDS/Core/OUDS/Tests/OUDSTheme/MockThemes/MockTheme+TypographySemanticTokens.swift +++ b/OUDS/Core/OUDS/Tests/OUDSTheme/MockThemes/MockTheme+TypographySemanticTokens.swift @@ -39,6 +39,9 @@ extension MockTheme { // MARK: Semantic token - Typography - Font - Weight + override open var fontWeightDefault: TypographyFontWeightSemanticToken { Self.mockThemeTypographyFontWeightRawToken } + override open var fontWeightCode: TypographyFontWeightSemanticToken { Self.mockThemeTypographyFontWeightRawToken } + override open var fontWeightStrong: TypographyFontWeightSemanticToken { Self.mockThemeTypographyFontWeightRawToken } override open var fontWeightDisplay: TypographyFontWeightSemanticToken { Self.mockThemeTypographyFontWeightRawToken } override open var fontWeightHeading: TypographyFontWeightSemanticToken { Self.mockThemeTypographyFontWeightRawToken } override open var fontWeightBodyDefault: TypographyFontWeightSemanticToken { Self.mockThemeTypographyFontWeightRawToken } diff --git a/OUDS/Core/OUDS/Tests/OUDSTheme/TestThemeOverrideOfTypographySemanticTokens.swift b/OUDS/Core/OUDS/Tests/OUDSTheme/TestThemeOverrideOfTypographySemanticTokens.swift index 21cb469d5..c0d07498c 100644 --- a/OUDS/Core/OUDS/Tests/OUDSTheme/TestThemeOverrideOfTypographySemanticTokens.swift +++ b/OUDS/Core/OUDS/Tests/OUDSTheme/TestThemeOverrideOfTypographySemanticTokens.swift @@ -67,6 +67,21 @@ final class TestThemeOverrideOfTypographySemanticTokens: XCTestCase { // MARK: - Semantic token - Typography - Font - Weight + func testInheritedThemeCanOverrideSemanticTokenFontWeightDefault() throws { + XCTAssertNotEqual(inheritedTheme.fontWeightDefault, abstractTheme.fontWeightDefault) + XCTAssertTrue(inheritedTheme.fontWeightDefault == MockTheme.mockThemeTypographyFontWeightRawToken) + } + + func testInheritedThemeCanOverrideSemanticTokenFontWeightCode() throws { + XCTAssertNotEqual(inheritedTheme.fontWeightCode, abstractTheme.fontWeightCode) + XCTAssertTrue(inheritedTheme.fontWeightCode == MockTheme.mockThemeTypographyFontWeightRawToken) + } + + func testInheritedThemeCanOverrideSemanticTokenFontWeightStrong() throws { + XCTAssertNotEqual(inheritedTheme.fontWeightStrong, abstractTheme.fontWeightStrong) + XCTAssertTrue(inheritedTheme.fontWeightStrong == MockTheme.mockThemeTypographyFontWeightRawToken) + } + func testInheritedThemeCanOverrideSemanticTokenFontWeightDisplay() throws { XCTAssertNotEqual(inheritedTheme.fontWeightDisplay, abstractTheme.fontWeightDisplay) XCTAssertTrue(inheritedTheme.fontWeightDisplay == MockTheme.mockThemeTypographyFontWeightRawToken) diff --git a/OUDS/Core/Tokens/SemanticTokens/Sources/Values/TypographySemanticTokens.swift b/OUDS/Core/Tokens/SemanticTokens/Sources/Values/TypographySemanticTokens.swift index 3f91f5c82..e076f72cb 100644 --- a/OUDS/Core/Tokens/SemanticTokens/Sources/Values/TypographySemanticTokens.swift +++ b/OUDS/Core/Tokens/SemanticTokens/Sources/Values/TypographySemanticTokens.swift @@ -37,6 +37,7 @@ public protocol TypographySemanticTokens { // MARK: - Semantic token - Typography - Font - Weight var fontWeightDefault: TypographyFontWeightSemanticToken { get } + var fontWeightCode: TypographyFontWeightSemanticToken { get } var fontWeightStrong: TypographyFontWeightSemanticToken { get } var fontWeightDisplay: TypographyFontWeightSemanticToken { get } var fontWeightHeading: TypographyFontWeightSemanticToken { get } From bfd6e46608058b2141926685731b744db9e5531a Mon Sep 17 00:00:00 2001 From: Pierre-Yves Lapersonne Date: Thu, 24 Oct 2024 18:47:30 +0200 Subject: [PATCH 20/30] refactor: update value of border semantic token `borderWidthFocusInset` (#241) (#249) Signed-off-by: Pierre-Yves Lapersonne --- CHANGELOG.md | 2 +- .../OUDSTheme+BorderSemanticTokens.swift | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c4f49483a..31cfa5342 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,9 +8,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added +- [Library] Semantic token `borderWidthFocusInset` (value of `borderWidth100`) ([#207](https://github.com/Orange-OpenSource/ouds-ios/issues/207), [#241](https://github.com/Orange-OpenSource/ouds-ios/issues/241)) - [Library] Semantic token `fontWeightCode` ([#242](https://github.com/Orange-OpenSource/ouds-ios/issues/242)) - [DemoApp] Update space tokens screen with all categories ([#178](https://github.com/Orange-OpenSource/ouds-ios/issues/178)) -- [Library] Semantic token `borderWidthFocusInset` ([#207](https://github.com/Orange-OpenSource/ouds-ios/issues/207)) ### Changed diff --git a/OUDS/Core/OUDS/Sources/OUDSTheme/OUDSTheme+SemanticTokens/OUDSTheme+BorderSemanticTokens.swift b/OUDS/Core/OUDS/Sources/OUDSTheme/OUDSTheme+SemanticTokens/OUDSTheme+BorderSemanticTokens.swift index 076dd56e6..25b3e665e 100644 --- a/OUDS/Core/OUDS/Sources/OUDSTheme/OUDSTheme+SemanticTokens/OUDSTheme+BorderSemanticTokens.swift +++ b/OUDS/Core/OUDS/Sources/OUDSTheme/OUDSTheme+SemanticTokens/OUDSTheme+BorderSemanticTokens.swift @@ -33,7 +33,7 @@ extension OUDSTheme: BorderSemanticTokens { @objc open var borderWidthThick: BorderWidthSemanticToken { BorderRawTokens.borderWidth75 } @objc open var borderWidthThicker: BorderWidthSemanticToken { BorderRawTokens.borderWidth100 } @objc open var borderWidthFocus: BorderWidthSemanticToken { BorderRawTokens.borderWidth50 } - @objc open var borderWidthFocusInset: BorderWidthSemanticToken { BorderRawTokens.borderWidth75 } + @objc open var borderWidthFocusInset: BorderWidthSemanticToken { BorderRawTokens.borderWidth100 } // MARK: Semantic token - Border - Radius From 1c9c8b883f5a3439488a9769f42e486cdb51328e Mon Sep 17 00:00:00 2001 From: "Boosted Bot [bot]" <130566815+boosted-bot@users.noreply.github.com> Date: Fri, 25 Oct 2024 10:20:55 +0200 Subject: [PATCH 21/30] =?UTF-8?q?chore(=F0=9F=A4=96):=20update=20`OpacityS?= =?UTF-8?q?emanticTokens`=20(tokenator=20*20241025101305*)=20(#251)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Pierre-Yves Lapersonne Co-authored-by: boosted-bot Co-authored-by: Pierre-Yves Lapersonne --- CHANGELOG.md | 1 + .../OUDSTheme+OpacitySemanticTokens.swift | 14 ++++---------- 2 files changed, 5 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 31cfa5342..5608e0fe7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed +- [Library] Update `OpacitySemanticTokens` (tokenator *20241025101305*) - [Library] Rename `*Spacing*Tokens` and `*Sizing*Tokens` to `*Space*Tokens` and `*Size*Tokens` ([#237](https://github.com/Orange-OpenSource/ouds-ios/issues/237)) - [Library] Update `ElevationRawTokens` (tokenator *20241022174330*) - [Library] Update `DimensionRawTokens` (tokenator *20241022132646*) diff --git a/OUDS/Core/OUDS/Sources/OUDSTheme/OUDSTheme+SemanticTokens/OUDSTheme+OpacitySemanticTokens.swift b/OUDS/Core/OUDS/Sources/OUDSTheme/OUDSTheme+SemanticTokens/OUDSTheme+OpacitySemanticTokens.swift index d898d8cbc..e45c2929f 100644 --- a/OUDS/Core/OUDS/Sources/OUDSTheme/OUDSTheme+SemanticTokens/OUDSTheme+OpacitySemanticTokens.swift +++ b/OUDS/Core/OUDS/Sources/OUDSTheme/OUDSTheme+SemanticTokens/OUDSTheme+OpacitySemanticTokens.swift @@ -15,17 +15,11 @@ import Foundation import OUDSTokensRaw import OUDSTokensSemantic -// ଘ( ・ω・)_/゚・:*:・。☆ -// [File to generate with the tokenator] - -/// Defines basic values common to all themes for `OpacitySemanticTokens`. -/// These values can be overriden inside `OUDSTheme` subclasses (in extensions or not, in the same module or not) thanks to the `@objc open` combination. extension OUDSTheme: OpacitySemanticTokens { - - @objc open var opacityTransparent: OpacitySemanticToken { OpacityRawTokens.opacity0 } - @objc open var opacityWeaker: OpacitySemanticToken { OpacityRawTokens.opacity100 } - @objc open var opacityWeak: OpacitySemanticToken { OpacityRawTokens.opacity300 } @objc open var opacityMedium: OpacitySemanticToken { OpacityRawTokens.opacity500 } - @objc open var opacityStrong: OpacitySemanticToken { OpacityRawTokens.opacity700 } @objc open var opacityOpaque: OpacitySemanticToken { OpacityRawTokens.opacity900 } + @objc open var opacityStrong: OpacitySemanticToken { OpacityRawTokens.opacity700 } + @objc open var opacityTransparent: OpacitySemanticToken { OpacityRawTokens.opacity0 } + @objc open var opacityWeak: OpacitySemanticToken { OpacityRawTokens.opacity300 } + @objc open var opacityWeaker: OpacitySemanticToken { OpacityRawTokens.opacity100 } } From 68c451c5d87a3fe632edb96a3642b032d46a66b7 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Lapersonne Date: Fri, 25 Oct 2024 16:13:43 +0200 Subject: [PATCH 22/30] refactor: improve tokenator integration and documentation, extract composite tokens (#254) - [Library] Rename color semantic tokens colorBackground* to colorBg* - Rename MultipleSpacingTokens to MultipleSpaceTokens and MultipleSizingTokens to MultipleSizeTokens - [Library] Extract composite semantic tokens from semantic tokens (ElevationSemanticTokens, TypographySemanticTokens) - [Library] Improve documentation about the use of semantic tokens - Add warnings and details in top of tokens files (in comments) Signed-off-by: Pierre-Yves Lapersonne --- CHANGELOG.md | 4 + .../_OUDSComponents.docc/_OUDSComponents.md | 2 +- .../OUDSTheme+ButtonsComponentTokens.swift | 2 +- .../OUDSTheme+BorderSemanticTokens.swift | 2 + .../OUDSTheme+ColorSemanticTokens.swift | 51 +++--- .../OUDSTheme+DimensionSemanticTokens.swift | 2 + ...eme+ElevationCompositeSemanticTokens.swift | 49 ++++++ .../OUDSTheme+ElevationSemanticTokens.swift | 15 +- .../OUDSTheme+GridSemanticTokens.swift | 2 + ...ift => OUDSTheme+SizeSemanticTokens.swift} | 2 + ...ft => OUDSTheme+SpaceSemanticTokens.swift} | 2 + ...me+TypographyCompositeSemanticTokens.swift | 71 ++++++++ .../OUDSTheme+TypographySemanticTokens.swift | 40 +---- .../Sources/OUDSTheme/OUDSThemeableView.swift | 17 ++ .../OUDS/Sources/_OUDS.docc/GettingStarted.md | 13 ++ OUDS/Core/OUDS/Sources/_OUDS.docc/Themes.md | 111 ++++++------ OUDS/Core/OUDS/Sources/_OUDS.docc/Tokens.md | 127 ++++++-------- .../MockTheme+ColorSemanticTokens.swift | 48 +++--- ...eme+ElevationCompositeSemanticTokens.swift | 39 +++++ .../MockTheme+ElevationSemanticTokens.swift | 18 -- ...ift => MockTheme+SizeSemanticTokens.swift} | 0 ...ft => MockTheme+SpaceSemanticTokens.swift} | 0 ...me+TypographyCompositeSemanticTokens.swift | 58 +++++++ .../MockTheme+TypographySemanticTokens.swift | 39 ----- .../OUDSTheme/MockThemes/OtherMockTheme.swift | 48 +++--- ...stThemeOverrideOfColorSemanticTokens.swift | 144 ++++++++-------- ...deOfCompositeElevationSemanticTokens.swift | 78 +++++++++ ...eOfTypographyCompositeSemanticTokens.swift | 163 ++++++++++++++++++ ...meOverrideOfTypographySemanticTokens.swift | 125 -------------- .../InverseTheme+ColorSemanticTokens.swift | 48 +++--- .../Tests/TestInverseThemeColors.swift | 52 +++--- .../OrangeTheme+SemanticColorTokens.swift | 8 +- .../OUDSTokensComponent.md | 60 +------ .../ElevationRawTokens+Composites.swift | 6 +- .../Sources/Values/GridRawTokens+Values.swift | 2 + .../TypographyRawTokens+Composites.swift | 6 +- .../Values/TypographyRawTokens+Values.swift | 1 + .../Multiples/MultipleSizeTokens.swift | 2 +- .../Multiples/MultipleSpaceTokens.swift | 2 +- .../ColorSemanticTokens+Aliases.swift | 4 +- .../ElevationSemanticTokens+Aliases.swift | 6 +- .../GridSemanticTokens+Aliases.swift | 2 +- .../SizingSemanticTokens+Aliases.swift | 3 +- .../Sources/Values/BorderSemanticTokens.swift | 2 + .../Sources/Values/ColorSemanticTokens.swift | 51 +++--- .../Values/DimensionSemanticTokens.swift | 2 + .../ElevationCompositeSemanticTokens.swift | 42 +++++ .../Values/ElevationSemanticTokens.swift | 20 +-- .../Sources/Values/GridSemanticTokens.swift | 2 + .../Values/OpacitySemanticTokens.swift | 2 + .../Sources/Values/SizeSemanticTokens.swift | 2 + .../Sources/Values/SpaceSemanticTokens.swift | 2 + .../TypographyCompositeSemanticTokens.swift | 70 ++++++++ .../Values/TypographySemanticTokens.swift | 47 +---- .../OUDSTokensSemantic.md | 82 ++++++++- ...t => MultipleSizeSemanticTokenTests.swift} | 6 +- ...s.swift => MultipleSpaceTokensTests.swift} | 6 +- .../Sources/_OUDSModules.docc/OUDSModules.md | 2 +- OUDS/README.md | 87 +++------- .../Pages/Tokens/Border/BorderTokenPage.swift | 2 +- .../Pages/Tokens/Color/ColorTokenPage.swift | 2 +- .../NamedColor/NamedColor+Background.swift | 148 ++++++++-------- .../Tokens/Dimension/Size/SizeTokenPage.swift | 2 +- .../Dimension/Space/SpaceTokenPage.swift | 6 +- .../Tokens/Elevation/ElevationTokenPage.swift | 2 +- .../Tokens/Opacity/OpacityTokenPage.swift | 2 +- .../Pages/Utils/ShowcaseElementPage.swift | 6 +- .../Pages/Utils/ShowcaseElementsPage.swift | 2 +- 68 files changed, 1193 insertions(+), 878 deletions(-) create mode 100644 OUDS/Core/OUDS/Sources/OUDSTheme/OUDSTheme+SemanticTokens/OUDSTheme+ElevationCompositeSemanticTokens.swift rename OUDS/Core/OUDS/Sources/OUDSTheme/OUDSTheme+SemanticTokens/{OUDSTheme+SizingSemanticTokens.swift => OUDSTheme+SizeSemanticTokens.swift} (97%) rename OUDS/Core/OUDS/Sources/OUDSTheme/OUDSTheme+SemanticTokens/{OUDSTheme+SpacingSemanticTokens.swift => OUDSTheme+SpaceSemanticTokens.swift} (98%) create mode 100644 OUDS/Core/OUDS/Sources/OUDSTheme/OUDSTheme+SemanticTokens/OUDSTheme+TypographyCompositeSemanticTokens.swift create mode 100644 OUDS/Core/OUDS/Tests/OUDSTheme/MockThemes/MockTheme+ElevationCompositeSemanticTokens.swift rename OUDS/Core/OUDS/Tests/OUDSTheme/MockThemes/{MockTheme+SizingSemanticTokens.swift => MockTheme+SizeSemanticTokens.swift} (100%) rename OUDS/Core/OUDS/Tests/OUDSTheme/MockThemes/{MockTheme+SpacingSemanticTokens.swift => MockTheme+SpaceSemanticTokens.swift} (100%) create mode 100644 OUDS/Core/OUDS/Tests/OUDSTheme/MockThemes/MockTheme+TypographyCompositeSemanticTokens.swift create mode 100644 OUDS/Core/OUDS/Tests/OUDSTheme/TestThemeOverrideOfCompositeElevationSemanticTokens.swift create mode 100644 OUDS/Core/OUDS/Tests/OUDSTheme/TestThemeOverrideOfTypographyCompositeSemanticTokens.swift create mode 100644 OUDS/Core/Tokens/SemanticTokens/Sources/Values/ElevationCompositeSemanticTokens.swift create mode 100644 OUDS/Core/Tokens/SemanticTokens/Sources/Values/TypographyCompositeSemanticTokens.swift rename OUDS/Core/Tokens/SemanticTokens/Tests/Multiples/{MultipleSizingSemanticTokenTests.swift => MultipleSizeSemanticTokenTests.swift} (87%) rename OUDS/Core/Tokens/SemanticTokens/Tests/Multiples/{MultipleSpacingTokensTests.swift => MultipleSpaceTokensTests.swift} (86%) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5608e0fe7..f7af68ff6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed +- [Library] Rename color semantic tokens `colorBackground*` to `colorBg*` +- [Library] Rename `MultipleSpacingTokens` to `MultipleSpaceTokens` and `MultipleSizingTokens` to `MultipleSizeTokens` +- [Library] Extract composite semantic tokens from semantic tokens (`ElevationSemanticTokens`, `TypographySemanticTokens`) +- [Library] Improve documentation about the use of semantic tokens - [Library] Update `OpacitySemanticTokens` (tokenator *20241025101305*) - [Library] Rename `*Spacing*Tokens` and `*Sizing*Tokens` to `*Space*Tokens` and `*Size*Tokens` ([#237](https://github.com/Orange-OpenSource/ouds-ios/issues/237)) - [Library] Update `ElevationRawTokens` (tokenator *20241022174330*) diff --git a/OUDS/Core/Components/Sources/_OUDSComponents.docc/_OUDSComponents.md b/OUDS/Core/Components/Sources/_OUDSComponents.docc/_OUDSComponents.md index 2a3106795..cbd707509 100644 --- a/OUDS/Core/Components/Sources/_OUDSComponents.docc/_OUDSComponents.md +++ b/OUDS/Core/Components/Sources/_OUDSComponents.docc/_OUDSComponents.md @@ -9,7 +9,7 @@ The catalog of all components provided by OUDS. It contains also `View` extensio ## Overview -Comming soon +❗**More details coming soon.**❗ ## Topics diff --git a/OUDS/Core/OUDS/Sources/OUDSTheme/OUDSTheme+ComponentTokens/OUDSTheme+ButtonsComponentTokens.swift b/OUDS/Core/OUDS/Sources/OUDSTheme/OUDSTheme+ComponentTokens/OUDSTheme+ButtonsComponentTokens.swift index 6bc92928d..785ed1dc9 100644 --- a/OUDS/Core/OUDS/Sources/OUDSTheme/OUDSTheme+ComponentTokens/OUDSTheme+ButtonsComponentTokens.swift +++ b/OUDS/Core/OUDS/Sources/OUDSTheme/OUDSTheme+ComponentTokens/OUDSTheme+ButtonsComponentTokens.swift @@ -30,7 +30,7 @@ extension OUDSTheme: ButtonsComponentTokens { @objc open var buttonBorderRadius: BorderRadiusSemanticToken { borderRadiusShort } @objc open var buttonForegroundColor: ColorSemanticToken { colorContentBrandPrimary } - @objc open var buttonBackgroundColor: ColorSemanticToken { colorBackgroundBrandPrimary } + @objc open var buttonBackgroundColor: ColorSemanticToken { colorBgBrandPrimary } @objc open var buttonWidth: SizeSemanticToken { DimensionRawTokens.dimension3000 } @objc open var buttonHeight: SizeSemanticToken { DimensionRawTokens.dimension1000 } diff --git a/OUDS/Core/OUDS/Sources/OUDSTheme/OUDSTheme+SemanticTokens/OUDSTheme+BorderSemanticTokens.swift b/OUDS/Core/OUDS/Sources/OUDSTheme/OUDSTheme+SemanticTokens/OUDSTheme+BorderSemanticTokens.swift index 25b3e665e..d7f7fb242 100644 --- a/OUDS/Core/OUDS/Sources/OUDSTheme/OUDSTheme+SemanticTokens/OUDSTheme+BorderSemanticTokens.swift +++ b/OUDS/Core/OUDS/Sources/OUDSTheme/OUDSTheme+SemanticTokens/OUDSTheme+BorderSemanticTokens.swift @@ -17,6 +17,8 @@ import OUDSTokensSemantic // ଘ( ・ω・)_/゚・:*:・。☆ // [File to generate with the tokenator] +// WARNING: Not synchronized anymore with the Figjam / Figma by developers team +// Create an issue for update https://github.com/Orange-OpenSource/ouds-ios/issues/new?template=token_update.yml /// Defines basic values common to all themes for `BorderSemanticTokens`. /// These values can be overriden inside `OUDSTheme` subclasses (in extensions or not, in the same module or not) thanks to the `@objc open` combination. diff --git a/OUDS/Core/OUDS/Sources/OUDSTheme/OUDSTheme+SemanticTokens/OUDSTheme+ColorSemanticTokens.swift b/OUDS/Core/OUDS/Sources/OUDSTheme/OUDSTheme+SemanticTokens/OUDSTheme+ColorSemanticTokens.swift index 13304bae8..882bcea31 100644 --- a/OUDS/Core/OUDS/Sources/OUDSTheme/OUDSTheme+SemanticTokens/OUDSTheme+ColorSemanticTokens.swift +++ b/OUDS/Core/OUDS/Sources/OUDSTheme/OUDSTheme+SemanticTokens/OUDSTheme+ColorSemanticTokens.swift @@ -17,7 +17,8 @@ import OUDSTokensSemantic // ଘ( ・ω・)_/゚・:*:・。☆ // [File to generate with the tokenator] -// WARNING: Not synchronized anymore with the Figjam +// WARNING: Not synchronized anymore with the Figjam / Figma by developers team +// Create an issue for update https://github.com/Orange-OpenSource/ouds-ios/issues/new?template=token_update.yml // swiftlint:disable line_length // swiftlint:disable identifier_name @@ -31,57 +32,57 @@ extension OUDSTheme: ColorSemanticTokens { // MARK: Semantic token - Colors - Background - @objc open var colorBackgroundPrimary: ColorSemanticToken { MultipleColorTokens(light: ColorRawTokens.colorFunctionalWhite, dark: ColorRawTokens.colorFunctionalDarkGray880) } + @objc open var colorBgPrimary: ColorSemanticToken { MultipleColorTokens(light: ColorRawTokens.colorFunctionalWhite, dark: ColorRawTokens.colorFunctionalDarkGray880) } - @objc open var colorBackgroundSecondary: ColorSemanticToken { MultipleColorTokens(light: ColorRawTokens.colorFunctionalLightGray80, dark: ColorRawTokens.colorFunctionalDarkGray800) } + @objc open var colorBgSecondary: ColorSemanticToken { MultipleColorTokens(light: ColorRawTokens.colorFunctionalLightGray80, dark: ColorRawTokens.colorFunctionalDarkGray800) } // WARNING: #124 - Colors to use are part of Orange Theme so are not reachable at this level, as a workaround add raw values - @objc open var colorBackgroundTertiary: ColorSemanticToken { fatalError("🤖 Raw token unavailable for colorBackgroundBrandSecondary!") } + @objc open var colorBgTertiary: ColorSemanticToken { fatalError("🤖 Raw token unavailable for colorBgTertiary!") } - @objc open var colorBackgroundEmphasized: ColorSemanticToken { MultipleColorTokens(light: ColorRawTokens.colorFunctionalDarkGray880, dark: ColorRawTokens.colorFunctionalDarkGray640) } + @objc open var colorBgEmphasized: ColorSemanticToken { MultipleColorTokens(light: ColorRawTokens.colorFunctionalDarkGray880, dark: ColorRawTokens.colorFunctionalDarkGray640) } // WARNING: #124 - Colors to use are part of Orange Theme so are not reachable at this level, as a workaround add raw values - @objc open var colorBackgroundBrandPrimary: ColorSemanticToken { fatalError("🤖 Raw token unavailable for colorBackgroundBrandPrimary!") } + @objc open var colorBgBrandPrimary: ColorSemanticToken { fatalError("🤖 Raw token unavailable for colorBgBrandPrimary!") } - @objc open var colorBackgroundBrandSecondary: ColorSemanticToken { fatalError("🤖 No value defined for colorBackgroundBrandSecondary!") } + @objc open var colorBgBrandSecondary: ColorSemanticToken { fatalError("🤖 No value defined for colorBgBrandSecondary!") } - @objc open var colorBackgroundBrandTertiary: ColorSemanticToken { fatalError("🤖 No value defined for colorBackgroundBrandTertiary!") } + @objc open var colorBgBrandTertiary: ColorSemanticToken { fatalError("🤖 No value defined for colorBgBrandTertiary!") } - @objc open var colorBackgroundStatusNeutral: ColorSemanticToken { MultipleColorTokens(light: ColorRawTokens.colorFunctionalLightGray80, dark: ColorRawTokens.colorFunctionalDarkGray720) } + @objc open var colorBgStatusNeutral: ColorSemanticToken { MultipleColorTokens(light: ColorRawTokens.colorFunctionalLightGray80, dark: ColorRawTokens.colorFunctionalDarkGray720) } - @objc open var colorBackgroundStatusNeutralOnBgEmphasized: ColorSemanticToken { MultipleColorTokens(light: ColorRawTokens.colorFunctionalDarkGray720, dark: ColorRawTokens.colorFunctionalDarkGray720) } + @objc open var colorBgStatusNeutralOnBgEmphasized: ColorSemanticToken { MultipleColorTokens(light: ColorRawTokens.colorFunctionalDarkGray720, dark: ColorRawTokens.colorFunctionalDarkGray720) } - @objc open var colorBackgroundStatusPositiveMuted: ColorSemanticToken { MultipleColorTokens(light: ColorRawTokens.colorFunctionalMalachite100, dark: ColorRawTokens.colorFunctionalMalachite900) } + @objc open var colorBgStatusPositiveMuted: ColorSemanticToken { MultipleColorTokens(light: ColorRawTokens.colorFunctionalMalachite100, dark: ColorRawTokens.colorFunctionalMalachite900) } - @objc open var colorBackgroundStatusPositiveMutedOnBgEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalMalachite900) } + @objc open var colorBgStatusPositiveMutedOnBgEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalMalachite900) } - @objc open var colorBackgroundStatusPositiveEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalMalachite500) } + @objc open var colorBgStatusPositiveEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalMalachite500) } - @objc open var colorBackgroundStatusInfoMuted: ColorSemanticToken { MultipleColorTokens(light: ColorRawTokens.colorFunctionalDodgerBlue100, dark: ColorRawTokens.colorFunctionalDodgerBlue900) } + @objc open var colorBgStatusInfoMuted: ColorSemanticToken { MultipleColorTokens(light: ColorRawTokens.colorFunctionalDodgerBlue100, dark: ColorRawTokens.colorFunctionalDodgerBlue900) } - @objc open var colorBackgroundStatusInfoMutedOnBgEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalDodgerBlue900) } + @objc open var colorBgStatusInfoMutedOnBgEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalDodgerBlue900) } - @objc open var colorBackgroundStatusInfoEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalDodgerBlue500) } + @objc open var colorBgStatusInfoEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalDodgerBlue500) } - @objc open var colorBackgroundStatusWarningMuted: ColorSemanticToken { MultipleColorTokens(light: ColorRawTokens.colorFunctionalSun100, dark: ColorRawTokens.colorFunctionalSun900) } + @objc open var colorBgStatusWarningMuted: ColorSemanticToken { MultipleColorTokens(light: ColorRawTokens.colorFunctionalSun100, dark: ColorRawTokens.colorFunctionalSun900) } - @objc open var colorBackgroundStatusWarningMutedOnBgEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalSun900) } + @objc open var colorBgStatusWarningMutedOnBgEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalSun900) } - @objc open var colorBackgroundStatusWarningEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalSun500) } + @objc open var colorBgStatusWarningEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalSun500) } - @objc open var colorBackgroundStatusNegativeMuted: ColorSemanticToken { MultipleColorTokens(light: ColorRawTokens.colorFunctionalScarlet100, dark: ColorRawTokens.colorFunctionalScarlet900) } + @objc open var colorBgStatusNegativeMuted: ColorSemanticToken { MultipleColorTokens(light: ColorRawTokens.colorFunctionalScarlet100, dark: ColorRawTokens.colorFunctionalScarlet900) } - @objc open var colorBackgroundStatusNegativeMutedOnBgEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalScarlet900) } + @objc open var colorBgStatusNegativeMutedOnBgEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalScarlet900) } - @objc open var colorBackgroundStatusNegativeEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalScarlet600) } + @objc open var colorBgStatusNegativeEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalScarlet600) } // WARNING: #124 - Colors to use are part of Orange Theme so are not reachable at this level, as a workaround add raw values - @objc open var colorBackgroundStatusAccentMuted: ColorSemanticToken { fatalError("🤖 Raw token unavailable for colorBackgroundStatusAccentMuted!") } + @objc open var colorBgStatusAccentMuted: ColorSemanticToken { fatalError("🤖 Raw token unavailable for colorBgStatusAccentMuted!") } // WARNING: #124 - Colors to use are part of Orange Theme so are not reachable at this level, as a workaround add raw values - @objc open var colorBackgroundStatusAccentMutedOnBgEmphasized: ColorSemanticToken { fatalError("🤖 Raw token unavailable for colorBackgroundStatusAccentMutedOnBgEmphasized!") } + @objc open var colorBgStatusAccentMutedOnBgEmphasized: ColorSemanticToken { fatalError("🤖 Raw token unavailable for colorBgStatusAccentMutedOnBgEmphasized!") } - @objc open var colorBackgroundStatusAccentEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalSun500) } + @objc open var colorBgStatusAccentEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalSun500) } // MARK: Semantic token - Colors - Content diff --git a/OUDS/Core/OUDS/Sources/OUDSTheme/OUDSTheme+SemanticTokens/OUDSTheme+DimensionSemanticTokens.swift b/OUDS/Core/OUDS/Sources/OUDSTheme/OUDSTheme+SemanticTokens/OUDSTheme+DimensionSemanticTokens.swift index ee98cef5c..f588d2c67 100644 --- a/OUDS/Core/OUDS/Sources/OUDSTheme/OUDSTheme+SemanticTokens/OUDSTheme+DimensionSemanticTokens.swift +++ b/OUDS/Core/OUDS/Sources/OUDSTheme/OUDSTheme+SemanticTokens/OUDSTheme+DimensionSemanticTokens.swift @@ -17,6 +17,8 @@ import OUDSTokensSemantic // ଘ( ・ω・)_/゚・:*:・。☆ // [File to generate with the tokenator] +// WARNING: Not synchronized anymore with the Figjam / Figma by developers team +// Create an issue for update https://github.com/Orange-OpenSource/ouds-ios/issues/new?template=token_update.yml /// Defines basic values common to all themes for `DimensionSemanticTokens`. /// These values can be overriden inside `OUDSTheme` subclasses (in extensions or not, in the same module or not) thanks to the `@objc open` combination. diff --git a/OUDS/Core/OUDS/Sources/OUDSTheme/OUDSTheme+SemanticTokens/OUDSTheme+ElevationCompositeSemanticTokens.swift b/OUDS/Core/OUDS/Sources/OUDSTheme/OUDSTheme+SemanticTokens/OUDSTheme+ElevationCompositeSemanticTokens.swift new file mode 100644 index 000000000..da6e61c52 --- /dev/null +++ b/OUDS/Core/OUDS/Sources/OUDSTheme/OUDSTheme+SemanticTokens/OUDSTheme+ElevationCompositeSemanticTokens.swift @@ -0,0 +1,49 @@ +// +// Software Name: OUDS iOS +// SPDX-FileCopyrightText: Copyright (c) Orange SA +// SPDX-License-Identifier: MIT +// +// This software is distributed under the MIT license, +// the text of which is available at https://opensource.org/license/MIT/ +// or see the "LICENSE" file for more details. +// +// Authors: See CONTRIBUTORS.txt +// Software description: A SwiftUI components library with code examples for Orange Unified Design System +// + +import Foundation +import OUDSTokensRaw +import OUDSTokensSemantic + +// ଘ( ・ω・)_/゚・:*:・。☆ +// [File to generate with the tokenator with Figma able to output composites and tokenatoer able to manage them] +// WARNING: Not synchronized anymore with the Figjam / Figma by developers team +// Create an issue for update https://github.com/Orange-OpenSource/ouds-ios/issues/new?template=token_update.yml + +/// Defines basic values common to all themes for `ElevationCompositeSemanticTokens`. +/// These values can be overriden inside `OUDSTheme` subclasses (in extensions or not, in the same module or not) thanks to the `@objc open` combination. +/// The aim of this extensions is to make relationships between all semantic tokens for elevations and associated raw tokens. +/// `OUDSTheme` can be seen as a kind of "abstract class" in _object oriented paradigm_. +/// +/// It defines in fact box shadows effects. +extension OUDSTheme: ElevationCompositeSemanticTokens { + + // MARK: Semantic token - Elevation - Box shadow + + @objc open var elevationNone: ElevationCompositeSemanticToken { ElevationCompositeSemanticToken(ElevationRawTokens.elevationBottom_0) } + + @objc open var elevationRaised: ElevationCompositeSemanticToken { ElevationCompositeSemanticToken(ElevationRawTokens.elevationBottom_1_500) } + + @objc open var elevationDrag: ElevationCompositeSemanticToken { ElevationCompositeSemanticToken(ElevationRawTokens.elevationBottom_3_500) } + + @objc open var elevationOverlayDefault: ElevationCompositeSemanticToken { ElevationCompositeSemanticToken(ElevationRawTokens.elevationBottom_2_400) } + + @objc open var elevationOverlayEmphasized: ElevationCompositeSemanticToken { ElevationCompositeSemanticToken(ElevationRawTokens.elevationBottom_5_300) } + + @objc open var elevationStickyDefault: ElevationCompositeSemanticToken { + ElevationCompositeSemanticToken(ElevationRawTokens.elevationBottom_3_300) } + + @objc open var elevationStickyEmphasized: ElevationCompositeSemanticToken { ElevationCompositeSemanticToken(ElevationRawTokens.elevationBottom_3_300) } + + @objc open var elevationStickyNavigationScrolled: ElevationCompositeSemanticToken { ElevationCompositeSemanticToken(ElevationRawTokens.elevationBottom_3_300) } +} diff --git a/OUDS/Core/OUDS/Sources/OUDSTheme/OUDSTheme+SemanticTokens/OUDSTheme+ElevationSemanticTokens.swift b/OUDS/Core/OUDS/Sources/OUDSTheme/OUDSTheme+SemanticTokens/OUDSTheme+ElevationSemanticTokens.swift index a3be621bd..9896f6822 100644 --- a/OUDS/Core/OUDS/Sources/OUDSTheme/OUDSTheme+SemanticTokens/OUDSTheme+ElevationSemanticTokens.swift +++ b/OUDS/Core/OUDS/Sources/OUDSTheme/OUDSTheme+SemanticTokens/OUDSTheme+ElevationSemanticTokens.swift @@ -17,8 +17,10 @@ import OUDSTokensSemantic // ଘ( ・ω・)_/゚・:*:・。☆ // [File to generate with the tokenator] +// WARNING: Not synchronized anymore with the Figjam / Figma by developers team +// Create an issue for update https://github.com/Orange-OpenSource/ouds-ios/issues/new?template=token_update.yml -/// Defines basic values common to all themes for `ElevationSemanticTokenss`. +/// Defines basic values common to all themes for `ElevationSemanticTokens`. /// These values can be overriden inside `OUDSTheme` subclasses (in extensions or not, in the same module or not) thanks to the `@objc open` combination. /// The aim of this extensions is to make relationships between all semantic tokens for elevations and associated raw tokens. /// `OUDSTheme` can be seen as a kind of "abstract class" in _object oriented paradigm_. @@ -67,15 +69,4 @@ extension OUDSTheme: ElevationSemanticTokens { @objc open var elevationColorStickyDefault: ElevationColorSemanticToken { ElevationColorSemanticToken(ColorRawTokens.colorTransparentBlack300) } @objc open var elevationColorStickyEmphasized: ElevationColorSemanticToken { ElevationColorSemanticToken(ColorRawTokens.colorTransparentBlack300) } @objc open var elevationColorStickyNavigationScrolled: ElevationColorSemanticToken { ElevationColorSemanticToken(ColorRawTokens.colorTransparentBlack300) } - - // MARK: Semantic token - Elevation - Box shadow - - @objc open var elevationNone: ElevationCompositeSemanticToken { ElevationCompositeSemanticToken(ElevationRawTokens.elevationBottom_0) } - @objc open var elevationRaised: ElevationCompositeSemanticToken { ElevationCompositeSemanticToken(ElevationRawTokens.elevationBottom_1_500) } - @objc open var elevationDrag: ElevationCompositeSemanticToken { ElevationCompositeSemanticToken(ElevationRawTokens.elevationBottom_3_500) } - @objc open var elevationOverlayDefault: ElevationCompositeSemanticToken { ElevationCompositeSemanticToken(ElevationRawTokens.elevationBottom_2_400) } - @objc open var elevationOverlayEmphasized: ElevationCompositeSemanticToken { ElevationCompositeSemanticToken(ElevationRawTokens.elevationBottom_5_300) } - @objc open var elevationStickyDefault: ElevationCompositeSemanticToken { ElevationCompositeSemanticToken(ElevationRawTokens.elevationBottom_3_300) } - @objc open var elevationStickyEmphasized: ElevationCompositeSemanticToken { ElevationCompositeSemanticToken(ElevationRawTokens.elevationBottom_3_300) } - @objc open var elevationStickyNavigationScrolled: ElevationCompositeSemanticToken { ElevationCompositeSemanticToken(ElevationRawTokens.elevationBottom_3_300) } } diff --git a/OUDS/Core/OUDS/Sources/OUDSTheme/OUDSTheme+SemanticTokens/OUDSTheme+GridSemanticTokens.swift b/OUDS/Core/OUDS/Sources/OUDSTheme/OUDSTheme+SemanticTokens/OUDSTheme+GridSemanticTokens.swift index 7fb858aad..9f39837dd 100644 --- a/OUDS/Core/OUDS/Sources/OUDSTheme/OUDSTheme+SemanticTokens/OUDSTheme+GridSemanticTokens.swift +++ b/OUDS/Core/OUDS/Sources/OUDSTheme/OUDSTheme+SemanticTokens/OUDSTheme+GridSemanticTokens.swift @@ -17,6 +17,8 @@ import OUDSTokensSemantic // ଘ( ・ω・)_/゚・:*:・。☆ // [File to generate with the tokenator] +// WARNING: Not synchronized anymore with the Figjam / Figma by developers team +// Create an issue for update https://github.com/Orange-OpenSource/ouds-ios/issues/new?template=token_update.yml /// Defines basic values common to all themes for `DimensionSemanticTokens`. /// These values can be overriden inside `OUDSTheme` subclasses (in extensions or not, in the same module or not) thanks to the `@objc open` combination. diff --git a/OUDS/Core/OUDS/Sources/OUDSTheme/OUDSTheme+SemanticTokens/OUDSTheme+SizingSemanticTokens.swift b/OUDS/Core/OUDS/Sources/OUDSTheme/OUDSTheme+SemanticTokens/OUDSTheme+SizeSemanticTokens.swift similarity index 97% rename from OUDS/Core/OUDS/Sources/OUDSTheme/OUDSTheme+SemanticTokens/OUDSTheme+SizingSemanticTokens.swift rename to OUDS/Core/OUDS/Sources/OUDSTheme/OUDSTheme+SemanticTokens/OUDSTheme+SizeSemanticTokens.swift index 0338107ca..9eb8a3255 100644 --- a/OUDS/Core/OUDS/Sources/OUDSTheme/OUDSTheme+SemanticTokens/OUDSTheme+SizingSemanticTokens.swift +++ b/OUDS/Core/OUDS/Sources/OUDSTheme/OUDSTheme+SemanticTokens/OUDSTheme+SizeSemanticTokens.swift @@ -17,6 +17,8 @@ import OUDSTokensSemantic // ଘ( ・ω・)_/゚・:*:・。☆ // [File to generate with the tokenator] +// WARNING: Not synchronized anymore with the Figjam / Figma by developers team +// Create an issue for update https://github.com/Orange-OpenSource/ouds-ios/issues/new?template=token_update.yml /// Defines basic values common to all themes for `SizeSemanticTokens`. /// These values can be overriden inside `OUDSTheme` subclasses (in extensions or not, in the same module or not) thanks to the `@objc open` combination. diff --git a/OUDS/Core/OUDS/Sources/OUDSTheme/OUDSTheme+SemanticTokens/OUDSTheme+SpacingSemanticTokens.swift b/OUDS/Core/OUDS/Sources/OUDSTheme/OUDSTheme+SemanticTokens/OUDSTheme+SpaceSemanticTokens.swift similarity index 98% rename from OUDS/Core/OUDS/Sources/OUDSTheme/OUDSTheme+SemanticTokens/OUDSTheme+SpacingSemanticTokens.swift rename to OUDS/Core/OUDS/Sources/OUDSTheme/OUDSTheme+SemanticTokens/OUDSTheme+SpaceSemanticTokens.swift index 511ead303..f6c42e129 100644 --- a/OUDS/Core/OUDS/Sources/OUDSTheme/OUDSTheme+SemanticTokens/OUDSTheme+SpacingSemanticTokens.swift +++ b/OUDS/Core/OUDS/Sources/OUDSTheme/OUDSTheme+SemanticTokens/OUDSTheme+SpaceSemanticTokens.swift @@ -17,6 +17,8 @@ import OUDSTokensSemantic // ଘ( ・ω・)_/゚・:*:・。☆ // [File to generate with the tokenator] +// WARNING: Not synchronized anymore with the Figjam / Figma by developers team +// Create an issue for update https://github.com/Orange-OpenSource/ouds-ios/issues/new?template=token_update.yml /// Defines basic values common to all themes for `SpaceSemanticTokens`. /// These values can be overriden inside `OUDSTheme` subclasses (in extensions or not, in the same module or not) thanks to the `@objc open` combination. diff --git a/OUDS/Core/OUDS/Sources/OUDSTheme/OUDSTheme+SemanticTokens/OUDSTheme+TypographyCompositeSemanticTokens.swift b/OUDS/Core/OUDS/Sources/OUDSTheme/OUDSTheme+SemanticTokens/OUDSTheme+TypographyCompositeSemanticTokens.swift new file mode 100644 index 000000000..0fcce8c85 --- /dev/null +++ b/OUDS/Core/OUDS/Sources/OUDSTheme/OUDSTheme+SemanticTokens/OUDSTheme+TypographyCompositeSemanticTokens.swift @@ -0,0 +1,71 @@ +// +// Software Name: OUDS iOS +// SPDX-FileCopyrightText: Copyright (c) Orange SA +// SPDX-License-Identifier: MIT +// +// This software is distributed under the MIT license, +// the text of which is available at https://opensource.org/license/MIT/ +// or see the "LICENSE" file for more details. +// +// Authors: See CONTRIBUTORS.txt +// Software description: A SwiftUI components library with code examples for Orange Unified Design System +// + +import Foundation +import OUDSTokensRaw +import OUDSTokensSemantic + +// ଘ( ・ω・)_/゚・:*:・。☆ +// [File to generate with the tokenator with Figma able to output composites and tokenatoer able to manage them] +// WARNING: Not synchronized anymore with the Figjam / Figma by developers team +// Create an issue for update https://github.com/Orange-OpenSource/ouds-ios/issues/new?template=token_update.yml + +// swiftlint:disable line_length + +/// Defines basic values common to all themes for `TypographyCompositeSemanticTokens`. +/// These values can be overriden inside `OUDSTheme` subclasses (in extensions or not, in the same module or not) thanks to the `@objc open` combination. +/// The aim of this extensions is to make relationships between all composite semantic tokens for typography and associated composite raw tokens. +/// `OUDSTheme` can be seen as a kind of "abstract class" in _object oriented paradigm_. +/// +extension OUDSTheme: TypographyCompositeSemanticTokens { + + // MARK: - Semantic tokens - Typography - Composites - Display + + @objc open var typeDisplayLarge: MultipleTypographyTokens { MultipleTypographyTokens(compact: TypographyRawTokens.typeBold850, regular: TypographyRawTokens.typeBold1450) } + @objc open var typeDisplayMedium: MultipleTypographyTokens { MultipleTypographyTokens(compact: TypographyRawTokens.typeBold750, regular: TypographyRawTokens.typeBold1050) } + @objc open var typeDisplaySmall: MultipleTypographyTokens { MultipleTypographyTokens(compact: TypographyRawTokens.typeBold650, regular: TypographyRawTokens.typeBold850) } + + // MARK: - Semantic tokens - Typography - Composites - Heading + + @objc open var typeHeadingXLarge: MultipleTypographyTokens { MultipleTypographyTokens(compact: TypographyRawTokens.typeBold550, regular: TypographyRawTokens.typeBold750) } + @objc open var typeHeadingLarge: MultipleTypographyTokens { MultipleTypographyTokens(compact: TypographyRawTokens.typeBold450, regular: TypographyRawTokens.typeBold550) } + @objc open var typeHeadingMedium: MultipleTypographyTokens { MultipleTypographyTokens(compact: TypographyRawTokens.typeBold350, regular: TypographyRawTokens.typeBold450) } + @objc open var typeHeadingSmall: MultipleTypographyTokens { MultipleTypographyTokens(compact: TypographyRawTokens.typeBold300, regular: TypographyRawTokens.typeBold350) } + + // MARK: - Semantic tokens - Typography - Composites - Body + + @objc open var typeBodyDefaultLarge: MultipleTypographyTokens { MultipleTypographyTokens(TypographyRawTokens.typeRegular250) } + @objc open var typeBodyDefaultMedium: MultipleTypographyTokens { MultipleTypographyTokens(TypographyRawTokens.typeRegular200) } + @objc open var typeBodyDefaultSmall: MultipleTypographyTokens { MultipleTypographyTokens(TypographyRawTokens.typeRegular150) } + @objc open var typeBodyStrongLarge: MultipleTypographyTokens { MultipleTypographyTokens(TypographyRawTokens.typeBold250) } + @objc open var typeBodyStrongMedium: MultipleTypographyTokens { MultipleTypographyTokens(TypographyRawTokens.typeBold200) } + @objc open var typeBodyStrongSmall: MultipleTypographyTokens { MultipleTypographyTokens(TypographyRawTokens.typeBold150) } + + // MARK: - Semantic tokens - Typography - Composites - Label + + @objc open var typeLabelDefaultXLarge: MultipleTypographyTokens { MultipleTypographyTokens(TypographyRawTokens.typeRegular250) } // NOTE: .typeRegular300 in Figjam but undefined + @objc open var typeLabelDefaultLarge: MultipleTypographyTokens { MultipleTypographyTokens(TypographyRawTokens.typeBold250) } + @objc open var typeLabelDefaultMedium: MultipleTypographyTokens { MultipleTypographyTokens(TypographyRawTokens.typeRegular200) } + @objc open var typeLabelDefaultSmall: MultipleTypographyTokens { MultipleTypographyTokens(TypographyRawTokens.typeRegular150) } + @objc open var typeLabelStrongXLarge: MultipleTypographyTokens { MultipleTypographyTokens(TypographyRawTokens.typeBold300) } + @objc open var typeLabelStrongLarge: MultipleTypographyTokens { MultipleTypographyTokens(TypographyRawTokens.typeBold250) } + @objc open var typeLabelStrongMedium: MultipleTypographyTokens { MultipleTypographyTokens(TypographyRawTokens.typeBold200) } + @objc open var typeLabelStrongSmall: MultipleTypographyTokens { MultipleTypographyTokens(TypographyRawTokens.typeBold150) } + + // MARK: - Semantic tokens - Typography - Composites - Code + + @objc open var typeCodeMedium: MultipleTypographyTokens { MultipleTypographyTokens(TypographyRawTokens.typeRegular200) } + @objc open var typeCodeSmall: MultipleTypographyTokens { MultipleTypographyTokens(TypographyRawTokens.typeRegular150) } +} + +// swiftlint:enable line_length diff --git a/OUDS/Core/OUDS/Sources/OUDSTheme/OUDSTheme+SemanticTokens/OUDSTheme+TypographySemanticTokens.swift b/OUDS/Core/OUDS/Sources/OUDSTheme/OUDSTheme+SemanticTokens/OUDSTheme+TypographySemanticTokens.swift index 710518e8e..8d5cccaee 100644 --- a/OUDS/Core/OUDS/Sources/OUDSTheme/OUDSTheme+SemanticTokens/OUDSTheme+TypographySemanticTokens.swift +++ b/OUDS/Core/OUDS/Sources/OUDSTheme/OUDSTheme+SemanticTokens/OUDSTheme+TypographySemanticTokens.swift @@ -17,6 +17,8 @@ import OUDSTokensSemantic // ଘ( ・ω・)_/゚・:*:・。☆ // [File to generate with the tokenator] +// WARNING: Not synchronized anymore with the Figjam / Figma by developers team +// Create an issue for update https://github.com/Orange-OpenSource/ouds-ios/issues/new?template=token_update.yml // swiftlint:disable line_length @@ -105,44 +107,6 @@ extension OUDSTheme: TypographySemanticTokens { @objc open var fontLetterSpacingLabelSmall: MultipleFontLetterSpacingTokens { MultipleFontLetterSpacingTokens(TypographyRawTokens.fontLetterSpacing150) } @objc open var fontLetterSpacingCodeMedium: MultipleFontLetterSpacingTokens { MultipleFontLetterSpacingTokens(TypographyRawTokens.fontLetterSpacing200) } @objc open var fontLetterSpacingCodeSmall: MultipleFontLetterSpacingTokens { MultipleFontLetterSpacingTokens(TypographyRawTokens.fontLetterSpacing150) } - - // MARK: - Semantic tokens - Typography - Composites - Display - - @objc open var typeDisplayLarge: MultipleTypographyTokens { MultipleTypographyTokens(compact: TypographyRawTokens.typeBold850, regular: TypographyRawTokens.typeBold1450) } - @objc open var typeDisplayMedium: MultipleTypographyTokens { MultipleTypographyTokens(compact: TypographyRawTokens.typeBold750, regular: TypographyRawTokens.typeBold1050) } - @objc open var typeDisplaySmall: MultipleTypographyTokens { MultipleTypographyTokens(compact: TypographyRawTokens.typeBold650, regular: TypographyRawTokens.typeBold850) } - - // MARK: - Semantic tokens - Typography - Composites - Heading - - @objc open var typeHeadingXLarge: MultipleTypographyTokens { MultipleTypographyTokens(compact: TypographyRawTokens.typeBold550, regular: TypographyRawTokens.typeBold750) } - @objc open var typeHeadingLarge: MultipleTypographyTokens { MultipleTypographyTokens(compact: TypographyRawTokens.typeBold450, regular: TypographyRawTokens.typeBold550) } - @objc open var typeHeadingMedium: MultipleTypographyTokens { MultipleTypographyTokens(compact: TypographyRawTokens.typeBold350, regular: TypographyRawTokens.typeBold450) } - @objc open var typeHeadingSmall: MultipleTypographyTokens { MultipleTypographyTokens(compact: TypographyRawTokens.typeBold300, regular: TypographyRawTokens.typeBold350) } - - // MARK: - Semantic tokens - Typography - Composites - Body - - @objc open var typeBodyDefaultLarge: MultipleTypographyTokens { MultipleTypographyTokens(TypographyRawTokens.typeRegular250) } - @objc open var typeBodyDefaultMedium: MultipleTypographyTokens { MultipleTypographyTokens(TypographyRawTokens.typeRegular200) } - @objc open var typeBodyDefaultSmall: MultipleTypographyTokens { MultipleTypographyTokens(TypographyRawTokens.typeRegular150) } - @objc open var typeBodyStrongLarge: MultipleTypographyTokens { MultipleTypographyTokens(TypographyRawTokens.typeBold250) } - @objc open var typeBodyStrongMedium: MultipleTypographyTokens { MultipleTypographyTokens(TypographyRawTokens.typeBold200) } - @objc open var typeBodyStrongSmall: MultipleTypographyTokens { MultipleTypographyTokens(TypographyRawTokens.typeBold150) } - - // MARK: - Semantic tokens - Typography - Composites - Label - - @objc open var typeLabelDefaultXLarge: MultipleTypographyTokens { MultipleTypographyTokens(TypographyRawTokens.typeRegular250) } // NOTE: .typeRegular300 in Figjam but undefined - @objc open var typeLabelDefaultLarge: MultipleTypographyTokens { MultipleTypographyTokens(TypographyRawTokens.typeBold250) } - @objc open var typeLabelDefaultMedium: MultipleTypographyTokens { MultipleTypographyTokens(TypographyRawTokens.typeRegular200) } - @objc open var typeLabelDefaultSmall: MultipleTypographyTokens { MultipleTypographyTokens(TypographyRawTokens.typeRegular150) } - @objc open var typeLabelStrongXLarge: MultipleTypographyTokens { MultipleTypographyTokens(TypographyRawTokens.typeBold300) } - @objc open var typeLabelStrongLarge: MultipleTypographyTokens { MultipleTypographyTokens(TypographyRawTokens.typeBold250) } - @objc open var typeLabelStrongMedium: MultipleTypographyTokens { MultipleTypographyTokens(TypographyRawTokens.typeBold200) } - @objc open var typeLabelStrongSmall: MultipleTypographyTokens { MultipleTypographyTokens(TypographyRawTokens.typeBold150) } - - // MARK: - Semantic tokens - Typography - Composites - Code - - @objc open var typeCodeMedium: MultipleTypographyTokens { MultipleTypographyTokens(TypographyRawTokens.typeRegular200) } - @objc open var typeCodeSmall: MultipleTypographyTokens { MultipleTypographyTokens(TypographyRawTokens.typeRegular150) } } // swiftlint:enable line_length diff --git a/OUDS/Core/OUDS/Sources/OUDSTheme/OUDSThemeableView.swift b/OUDS/Core/OUDS/Sources/OUDSTheme/OUDSThemeableView.swift index 38337a475..ccb2140cd 100644 --- a/OUDS/Core/OUDS/Sources/OUDSTheme/OUDSThemeableView.swift +++ b/OUDS/Core/OUDS/Sources/OUDSTheme/OUDSThemeableView.swift @@ -39,6 +39,23 @@ extension EnvironmentValues { /// This is a kind of root `SwiftUI.View` to add at the top level of your views tree so as to define /// as an environement variable the theme which will be applied. /// Any theme to apply must be a child of `OUDSTheme`, direct or not. +/// +/// To use this special `View` and apply the *theme*, you must wrap your app root view inside, like: +/// +/// // Make imports +/// import OUDS // For OUDSThemeableView +/// import OUDSThemesOrange // For OrangeTheme +/// +/// // Add themeable view to your root view to use the OrangeTheme +/// OUDSThemeableView(theme: OrangeTheme()) { +/// YourRootView() +/// } +/// +/// // Or use your custom theme if you want +/// OUDSThemeableView(theme: YourCustomTheme()) { +/// YourRootView() +/// } +/// public struct OUDSThemeableView: View where Content: View { private let theme: OUDSTheme diff --git a/OUDS/Core/OUDS/Sources/_OUDS.docc/GettingStarted.md b/OUDS/Core/OUDS/Sources/_OUDS.docc/GettingStarted.md index 16c2840dc..d3d09f2e7 100644 --- a/OUDS/Core/OUDS/Sources/_OUDS.docc/GettingStarted.md +++ b/OUDS/Core/OUDS/Sources/_OUDS.docc/GettingStarted.md @@ -12,6 +12,8 @@ If you want to add the iOS library of **Orange Unified Design System**, you need To do that, add a new _package dependency_ to your _Xcode_ project by refering to it with `https://github.com/Orange-OpenSource/ouds-ios`. You are free to choose wether or not you want a branch or a specific tag, pick the solution you want. +You can [refer to the wiki](https://github.com/Orange-OpenSource/ouds-ios/wiki/6-%E2%80%90-About-versions,-releases-and-builds) for more details about versions, releases and tags. + ### Import the library you need You should use one (or several) of the following imports for your needs, which are basically _Swift Package_ products. @@ -25,3 +27,14 @@ import OUDSTokensComponent // If you need to override or use directly componen import OUDSTokenSemantic // If you need to override or use directly semantic tokens import OUDSTokensRaw // If you need to override or use directly raw tokens ``` + +### Chose your theme + +You can: +1. Use the `OrangeTheme` which is the default one +2. Use the `InverseTheme` which is a special theme for dedicated use cases (like an extended dark mode) +3. Implement your own theme (see [Themes details](https://ios.unified-design-system.orange.com/documentation/ouds/themes)) + +### Apply your theme + +You will need to use for your root view the [`OUDSThemeableView`](https://ios.unified-design-system.orange.com/documentation/ouds/oudsthemeableview/). [This page may help](https://ios.unified-design-system.orange.com/documentation/ouds/themes) also. diff --git a/OUDS/Core/OUDS/Sources/_OUDS.docc/Themes.md b/OUDS/Core/OUDS/Sources/_OUDS.docc/Themes.md index a7c577038..19fb7d42c 100644 --- a/OUDS/Core/OUDS/Sources/_OUDS.docc/Themes.md +++ b/OUDS/Core/OUDS/Sources/_OUDS.docc/Themes.md @@ -15,102 +15,89 @@ _Themes_ have Swift _extensions_ so as to get the _tokens_ to define. These toke Not that other brands like _Parnasse_ or _Sosh_ can be implemented in a dedicated insternal repository with their own assets. +## Architecture + +A theme is, a fact, a big massive bucket of semantic tokens. We choose to pack all semantic tokens in protocols, so as to force any theme to manage them. Because Swift does not have notions of abstract classes compared to Kotlin, we have choosen to define an `OUDSTheme` which can be considered like an almost-abstract class. +Then, a white label theme may just inherit from this class and override the tokens it needs. The real, default theme to use, will be the `OrangeTheme` providing in its module brand colors and overriding some tokens with the suitable values. In fact, because the `OUDSTheme` and the `OrangeTheme` are isolated, the `OUDSTheme` cannot get the Orange brand colors, so some tokens cannot be defined at that level but remain overridable in the subclass. +The object oriented paradigm implementation in Swift is a bit different that the one found with Java or Kotlin. For example we do not have abstract classes and Swift relies a lot in composition with protocols and extensions. Thus a theme can be composed using protocols containing as properties the semantics tokens. These tokens must also be overridable. Any default values and logic can be in a kind of fake abstract class named OUDSTheme. This theme will be then subclassed using OOP inheritance in the real default theme named OrangeTheme. Any other theme can be a subclass of OrangeTheme (e.g. country specific theme) or OUDSTheme (for white label). +Themes must be able to override semantic tokens and components tokens, and use its own raw or semantic tokens without sharing them to other themes. The existing raw tokens, shared between all themes, are not overridable because their definitions are frozen. + ## Use themeable view ```swift // Make imports -import OUDS -import OUDSThemesOrange +import OUDS // For OUDSThemeableView +import OUDSThemesOrange // For OrangeTheme -// Add themeable view to your root view +// Add themeable view to your root view to use the OrangeTheme OUDSThemeableView(theme: OrangeTheme()) { YourRootView() } -``` - -## Define a custom theme if needed -```swift -class YourCustomTheme: OrangeTheme { } - -extension YourCustomTheme { - - // Override components tokens if needed - override var ftiBorderStyle: BorderStyleSemanticToken { borderStyleDrag } - override var ftiBorderWidth: BorderWidthSemanticToken { borderWidthThick } - - // Override colors semantic tokens if needed - override var colorBackgroundPrimary: ColorSemanticToken { - MultipleColorTokens(light: ColorRawTokens.ColorRawTokens.colorFunctionalSun500, dark: ColorRawTokens.ColorRawTokens.colorFunctionalSun800) - } - - // Etc. +// Or use your custom theme if you want +OUDSThemeableView(theme: YourCustomTheme()) { + YourRootView() } ``` -## How to create your own theme +## Define a custom theme if needed It is quite simple, you have to follow several steps. -First, create a _Swift class_ which will inherit from `OrangeTheme` or `OUDSTheme`. -You can see `OrangeTheme` as more specified and less abtract as `OUDSTheme` which is the base of all themes. We do not recommend to sue directly the `OUDSTheme` as is. +You will have to create a _Swift class_ which will inherit from `OrangeTheme` or `OUDSTheme`. +You can see `OrangeTheme` as more specified and less abtract as `OUDSTheme` which is the base of all themes. We do not recommend to use directly the `OUDSTheme` as is. Then, you should override the _semantic tokens_ and _components tokens_ you want ; we recommend to use _Swift extensions_ for clarity reasons. If your theme needs to define its own _raw tokens_, you can also define them using a `enum` and the _raw tokens types_. -For example: - +First, use the suitable imports: ```swift -import Foundation -import SwiftUI +import OUDS // To get OUDSTheme import OUDSTokensRaw // To get raw tokens import OUDSTokensSemantic // To get semantic tokens import OUDSTokensComponent // To get component tokens import OUDSThemesOrange // To override OrangeTheme (which is default theme) +``` -// Can be for example a country theme -class OrangeCustomTheme: OrangeTheme { } - -extension OrangeCustomTheme { // For FormsTextInputComponentTokens, used in component FormsTextInputComponent - - override public var ftiTitleFontWeight: TypographyFontWeightSemanticToken { fontWeightLabelStrong } - override public var ftiTitleFontSize: TypographyFontSizeSemanticToken { fontSizeLabelXLarge } - override public var ftiTitleColor: ColorSemanticToken { ColorRawTokens.colorFunctionalDodgerBlue500 } - - override public var ftiSubtitleFontWeight: TypographyFontWeightSemanticToken { fontWeightBodyDefault } - override public var ftiSubtitleFontSize: TypographyFontSizeSemanticToken { fontSizeLabelMedium } - override public var ftiSubtitleColor: ColorSemanticToken { ColorRawTokens.colorFunctionalMalachite500 } - - override public var ftiBackgroundColor: ColorSemanticToken { colorBackgroundDefault } +Then, declare the class: +``` +// If you jsut want to make a subtheme with some changes +final class YourCustomTheme: OrangeTheme { } - override public var ftiBorderColor: ColorSemanticToken { colorBorderEmphasized } +// Or for white label themes or themes with more configurations not that much related to OrangeTheme, choose the one you want +final class YourCustomTheme: OUDSTheme { } +``` - override public var ftiBorderStyle: BorderStyleSemanticToken { borderStyleDrag } +And define the theme by overriding the values you want: - override public var ftiBorderWidth: BorderWidthSemanticToken { borderWidthThick } -} +``` +extension YourCustomTheme { -extension OrangeCustomTheme { // For ColorSemanticTokens using anywhere + // Override components tokens + // Not define dyet + + // Override colors semantic tokens + override public var colorBgPrimary: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalDarkGray880) } + + // Override some fonts semantic tokens + public var fontFamily: TypographyFontFamilySemanticToken { TypographyRawTokens.fontFamilySystemSFPro } + public var fontFamilyBody: TypographyFontFamilySemanticToken { MyOwnFontRawTokens.someFontBody } - override var colorBackgroundPrimary: ColorSemanticToken { - MultipleColorTokens(light: ColorRawTokens.ColorRawTokens.colorFunctionalSun500, dark: ColorRawTokens.ColorRawTokens.colorFunctionalSun800) - } + // Etc. } ``` -And your own theme colors _raw tokens_: - -```swift - -public typealias MyThemeColorRawToken = ColorRawToken // Refer to type ColorRawToken for consistency +You can defined your own set of raw tokens, for example: +``` +public typealias MyOwnTypographyRawTokens = TypographyRawTokens // Refer to type TypographyRawTokens for consistency, declared in OUDSTokensRaw -public enum MyThemeColorRawTokens { +public enum MyOwnFontRawTokens { - public static let someAwesomeThemeExclusiveColor: MyThemeColorRawToken = "#12345600" + public static let someFontBody: MyOwnTypographyRawTokens = "Arial" } ``` -Then for your root view: +Finaly for your app root view: ```swift import SwiftUI @@ -119,10 +106,16 @@ import OUDS // To get ``OUDSThemeableView`` struct MyAppRootView: View { var body: some View { - OUDSThemeableView(theme: OrangeCustomTheme()) { + OUDSThemeableView(theme: YourCustomTheme()) { // ... } } } ``` +All components the OUDS library provides are based on themes, handle through the abstract `OUDSTheme`, exposing *semantic tokens*, defined by *raw tokens* assigned to usable final values. +In few words, if you want to change the look and feel for the OUDS components you use, you will have to override the matching *semantic tokens*, but it will bring side effects as these *semantic tokens* are shared accross several components. +In the future we will have components and *component tokens*. + +You are also able to define your components and your *semantic tokens* used by them. + diff --git a/OUDS/Core/OUDS/Sources/_OUDS.docc/Tokens.md b/OUDS/Core/OUDS/Sources/_OUDS.docc/Tokens.md index c5cbf9983..36fcd2ee8 100644 --- a/OUDS/Core/OUDS/Sources/_OUDS.docc/Tokens.md +++ b/OUDS/Core/OUDS/Sources/_OUDS.docc/Tokens.md @@ -23,77 +23,16 @@ flowchart TD ## Component tokens -These _tokens_ ([OUDSTokensComponent](https://ios.unified-design-system.orange.com/documentation/oudstokenscomponent/)) can be used to apply some style and configuration values to _components_. -Thus if a component needs to change for example its _background color_, and if a _component token_ is used for it, then only the value of this _token_ should be changed without any modification on the _component_ definition. -_Components_ use _component tokens_ exposed through the _theme_ to get their style values. - -Example with a fake component `FormsTextInputComponentTokens`: - -```swift -// Declare the component tokens -public protocol FormsTextInputComponentTokens { - var ftiTitleFontWeight: TypographyFontWeightSemanticToken { get } - var ftiTitleFontSize: TypographyFontSizeSemanticToken { get } - var ftiTitleColor: ColorSemanticToken { get } - - var ftiBorderColor: ColorSemanticToken { get } - var ftiBorderStyle: BorderStyleSemanticToken { get } - var ftiBorderWidth: BorderWidthSemanticToken { get } -} - -// Define the component tokens -extension OUDSTheme: FormsTextInputComponentTokens { - private static let defaultBlack: ColorSemanticToken = ColorRawTokens.colorFunctionalBlack - private static let defaultWhite: ColorSemanticToken = ColorRawTokens.colorFunctionalWhite - - @objc open var ftiTitleFontWeight: TypographyFontWeightSemanticToken { fontWeightHeading } - @objc open var ftiTitleFontSize: TypographyFontSizeSemanticToken { fontSizeLabelLarge } - @objc open var ftiTitleColor: ColorSemanticToken { colorContentBrandPrimaryLight ?? Self.defaultBlack } - - @objc open var ftiBorderColor: ColorSemanticToken { colorBorderEmphasizedLight ?? Self.defaultBlack } - @objc open var ftiBorderStyle: BorderStyleSemanticToken { borderStyleDefault } - @objc open var ftiBorderWidth: BorderWidthSemanticToken { borderWidthThin } -} - -// Then in the definition of the component FormsTextInput component, the theme will be called and the component tokens -// stored inside will be applied -// The View - -struct OUDSFormsTextInput: View { - - // ... - @Environment(\.theme) var theme - @Environment(\.colorScheme) var colorScheme - - public var body: some View { - VStack(spacing: theme.spacePaddingBlockComponentTall) { - Label( - title: { - Text("Example of OUDSFormsTextInput") - .fontWeight(theme.ftiTitleFontWeight.fontWeight) - .font(.system(size: theme.ftiTitleFontSize)) - .foregroundColor(theme.ftiTitleColor.color) - }, - icon: { /*@START_MENU_TOKEN@*/Image(systemName: "42.circle")/*@END_MENU_TOKEN@*/ } - ) - Text("Write bellow some awesome text!") - .fontWeight(theme.ftiSubtitleFontWeight.fontWeight) - .font(.system(size: theme.ftiSubtitleFontSize)) - .foregroundColor(theme.ftiSubtitleColor.color) - TextField(placeholder, text: $value) - } - .padding(theme.spacePaddingBlockComponentTall) - .background(theme.ftiBorderColor.color(for: colorScheme)) - .border(theme.ftiBorderColor.color(for: colorScheme), width: theme.ftiBorderWidth) - } -} -``` +No _tokens_ ([OUDSTokensComponent](https://ios.unified-design-system.orange.com/documentation/oudstokenscomponent/)) are defined for components yet. ## Semantic tokens +### What they are + These _tokens_ ([OUDSTokensSemantic](https://ios.unified-design-system.orange.com/documentation/oudstokenssemantic/)) can be used mainly for _component tokens_ to apply some style and configuration values. They can be seen as an high level of usage with functional meanings. -Thus if we need for example to change a warning color, supposing this color is defined as a _semantic token_, we only have to change its assigned value and all components using the _semantic token_ won't be impacted in their definition. + +A semantic token points to a raw token, and is used by components. A semantic token brings meanings, higher level notions. For example, a raw token can be a "red color", and a semantic token pointing to it can be a "danger information color". Semantic tokens are used by components tokens and shared definition of themes. They are splitted in kind of families, i.e. borders, dimensions, colors, spacings, elevations, sizings, opacities, grids and typographies. For some of theses tokens, like for borders, subfamilies can be defined likes width, radius and style. Finally, any of these raw tokens is associated to a raw value which will be - in the end - applied to SwiftUI views inside components. Type aliases will help to make a simple math between any semantic tokens and raw tokens. Thus if we need for example to change a warning color, supposing this color is defined as a _semantic token_, we only have to change its assigned value and all components using the _semantic token_ won't be impacted in their definition, only their rendering. In addition, there are hundreds of _semantics tokens_ and we needed to add them to the abstract root theme using extensions for clarity reasons to prevent to have a _Swift class_ with thousands of lines. Each _raw token_ "family" is then declared in its dedicated _Swift protocol_ any root theme must implement. Because we choose to split responsabilities and objects into their own modules, we faced troubles to make possible for children themes to override properties declared in _protocols_ and defined in _extensions_. @@ -104,22 +43,58 @@ To keep the same semantics as the ones used in our specifications, _typealias_ a Example with [OUDSTokensComponent/ColorSemanticTokens](https://ios.unified-design-system.orange.com/documentation/oudstokenssemantic/colorsemantictokens): ```swift -// Declare a semantic token for color +// Declare the semantic tokens protocol ColorSemanticTokens { - var sysColorBrandNeutralMutedWhite: ColorAliasSemanticToken? { get } + + var colorBgPrimary: ColorSemanticToken { get } + var colorBgSecondary: ColorSemanticToken { get } + var colorBgTertiary: ColorSemanticToken { get } + // ... } -// Define the semantic token +// Define the semantic tokens exposed through the theme extension OUDSTheme: ColorSemanticTokens { - @objc open var sysColorBrandNeutralMutedWhite: ColorAliasSemanticToken? { ColorRawTokens.colorFunctionalWhite } + // Color is available in the module of OUDSTheme + @objc open var colorBgPrimary: ColorSemanticToken { ColorRawTokens.colorFunctionalWhite } + + // If the semantic token refers to a raw token not stored in the OUDSTheme module, override later and throw error because unxpected state if used + @objc open var colorBgSecondary: ColorSemanticToken { fatalError("🤖 Raw token unavailable for colorBgSecondary!") } + + // Possible to have tokens not defined in lwoer level must only in themes implementation, throw error if used because unexpected state + @objc open var colorBgTertiary: ColorSemanticToken { fatalError("🤖 No value defined for colorBgTertiary!") } } -// Then any component and view can use the theme and get the stored colors, only manipulating them by their variable names. +// Add missing values +extension OrangeTheme: ColorSemanticTokens { + + // Define value value with the accessible token + @objc open var colorBgSecondary: ColorSemanticToken { OrangeBrandColorRawTokens.colorOrange200 } +} ``` +### Important notice + +You may see the source code can be more simple, or the source code does not follow the Swift guidelines, or plenty of warnings of SwiftLint are disabled, or things are dirty. + +In fact, rely to much on *Figma* and how the design system is implemented. +There are thousands of tokens, and we do now know if they will be used, how and by whom. In addition, the logic behind these tokens, their nature and names, is very tight to the web domain because the design team behind is more used to web environment than mobileones like Android and iOS. Some tokens like composite tokens are defined in *Figma* but *Figma* is not able to manage them, it is tinkering, and the outputed JSON cannot manage that too. +In addition, *Figma* exposts the tokens in JSON, which is then parsed with our own fork and implementation of _style dictionary_ tool which struggles to outputs the JSON to web, Kotlin and Swift assets. + +That is the reason why: +- some *SwiftLint* warnings on tokens are disabled: not possible to have doc of public tokens, too long names, too long lines, too long body, too long identifiers +- some tokens do not have full names, e.g. "colorBackground" are named "colorBg" +- somes tokens are defined without attached values, thus we throw `fatalError` because that state is not relevant +- some tokens in the *Figma* use colors defined in another module, thus we throw `fatalError` to force themes to override with the good and avaialble values +- we have thousands of tokens, as thousands of tokens are defined +- we do not know if there is dead code because API are public + +Feel free to send issues and contact us for further details or if you spotted something interesting. + ## Raw tokens +### What they are + _Raw tokens_ ([OUDSTokensRaw](https://ios.unified-design-system.orange.com/documentation/oudstokensraw/)) are smallest _tokens_ possible. They are associated to raw values and will be finaly the values assigned to the _components_ properties. In fact, we choose to use as most as possible primitive types for raw values, like `Int`, `Double`, `CGFloat` or `String` so as to handle the smallest types with few impacts on the memory for ecodesign principles. Indeed with hundreds of raw tokens, it will be more efficient to store primitive small types than *structs* or *classes*. @@ -143,7 +118,6 @@ public enum ColorRawTokens { } extension ColorRawTokens { // Gathers all color raw tokens, use enums for namespace optimization with static let public static let colorFunctionalWhite: ColorRawToken = "#FFFFFF" - public static let colorFunctionalScarlet400: ColorRawToken = "#FF4D4E" public static let colorTransparentBlack0: ColorRawToken = apply(opacity: OpacityRawTokens.opacity0, on: colorFunctionalBlack) ... } @@ -153,6 +127,11 @@ extension String { // The OUDS library still exposes this comptuer property Color(hexadecimalCode: self) } } + +// Themes can embed their own tokens +enum OrangeBrandColorRawTokens { + public static let colorOrange200: ColorOrangeBrandRawToken = "#FFC18A" +} ``` ## Add, edit or remove tokens @@ -162,8 +141,8 @@ You may need to [create an issue](https://github.com/Orange-OpenSource/ouds-ios/ ### For raw tokens -You can refer to the *OUDSTokensRaw* documentation or [get it online](https://ios.unified-design-system.orange.com/documentation/oudstokensraw/) +You can refer to the *OUDSTokensRaw* documentation or [get it online](https://ios.unified-design-system.orange.com/documentation/oudstokensraw/). [The wiki provides details](https://github.com/Orange-OpenSource/ouds-ios/wiki/0-%E2%80%90-How-to-update-tokens) also. ### For semantic tokens -You can refer to the *OUDSTokensSemantic* documentation or [get it online](https://ios.unified-design-system.orange.com/documentation/oudstokenssemantic/ +You can refer to the *OUDSTokensSemantic* documentation or [get it online](https://ios.unified-design-system.orange.com/documentation/oudstokenssemantic/). [The wiki provides details](https://github.com/Orange-OpenSource/ouds-ios/wiki/0-%E2%80%90-How-to-update-tokens) also. diff --git a/OUDS/Core/OUDS/Tests/OUDSTheme/MockThemes/MockTheme+ColorSemanticTokens.swift b/OUDS/Core/OUDS/Tests/OUDSTheme/MockThemes/MockTheme+ColorSemanticTokens.swift index 8ebb57514..75ebdce34 100644 --- a/OUDS/Core/OUDS/Tests/OUDSTheme/MockThemes/MockTheme+ColorSemanticTokens.swift +++ b/OUDS/Core/OUDS/Tests/OUDSTheme/MockThemes/MockTheme+ColorSemanticTokens.swift @@ -23,53 +23,53 @@ extension MockTheme { // MARK: Semantic token - Colors - Background - override open var colorBackgroundPrimary: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorBgPrimary: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - override open var colorBackgroundSecondary: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorBgSecondary: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - override open var colorBackgroundTertiary: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorBgTertiary: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - override open var colorBackgroundEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorBgEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - override open var colorBackgroundBrandPrimary: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorBgBrandPrimary: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - override open var colorBackgroundBrandSecondary: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorBgBrandSecondary: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - override open var colorBackgroundBrandTertiary: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorBgBrandTertiary: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - override open var colorBackgroundStatusNeutral: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorBgStatusNeutral: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - override open var colorBackgroundStatusNeutralOnBgEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorBgStatusNeutralOnBgEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - override open var colorBackgroundStatusPositiveMuted: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorBgStatusPositiveMuted: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - override open var colorBackgroundStatusPositiveMutedOnBgEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorBgStatusPositiveMutedOnBgEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - override open var colorBackgroundStatusPositiveEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorBgStatusPositiveEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - override open var colorBackgroundStatusInfoMuted: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorBgStatusInfoMuted: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - override open var colorBackgroundStatusInfoMutedOnBgEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorBgStatusInfoMutedOnBgEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - override open var colorBackgroundStatusInfoEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorBgStatusInfoEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - override open var colorBackgroundStatusWarningMuted: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorBgStatusWarningMuted: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - override open var colorBackgroundStatusWarningMutedOnBgEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorBgStatusWarningMutedOnBgEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - override open var colorBackgroundStatusWarningEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorBgStatusWarningEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - override open var colorBackgroundStatusNegativeMuted: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorBgStatusNegativeMuted: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - override open var colorBackgroundStatusNegativeMutedOnBgEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorBgStatusNegativeMutedOnBgEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - override open var colorBackgroundStatusNegativeEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorBgStatusNegativeEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - override open var colorBackgroundStatusAccentMuted: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorBgStatusAccentMuted: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - override open var colorBackgroundStatusAccentMutedOnBgEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorBgStatusAccentMutedOnBgEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } - override open var colorBackgroundStatusAccentEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } + override open var colorBgStatusAccentEmphasized: ColorSemanticToken { Self.mockThemeMultipleColorTokens } // MARK: Semantic token - Colors - Content - Status diff --git a/OUDS/Core/OUDS/Tests/OUDSTheme/MockThemes/MockTheme+ElevationCompositeSemanticTokens.swift b/OUDS/Core/OUDS/Tests/OUDSTheme/MockThemes/MockTheme+ElevationCompositeSemanticTokens.swift new file mode 100644 index 000000000..ac60ea9aa --- /dev/null +++ b/OUDS/Core/OUDS/Tests/OUDSTheme/MockThemes/MockTheme+ElevationCompositeSemanticTokens.swift @@ -0,0 +1,39 @@ +// +// Software Name: OUDS iOS +// SPDX-FileCopyrightText: Copyright (c) Orange SA +// SPDX-License-Identifier: MIT +// +// This software is distributed under the MIT license, +// the text of which is available at https://opensource.org/license/MIT/ +// or see the "LICENSE" file for more details. +// +// Authors: See CONTRIBUTORS.txt +// Software description: A SwiftUI components library with code examples for Orange Unified Design System +// + +import Foundation +import OUDSTokensRaw +import OUDSTokensSemantic + +extension MockTheme { + + static let mockThemeElevationCompositeSemanticToken = ElevationCompositeSemanticToken(ElevationRawTokens.elevationBottom_1_600) + + // MARK: Semantic token - Elevation - Box shadow + + override open var elevationNone: ElevationCompositeSemanticToken { Self.mockThemeElevationCompositeSemanticToken } + + override open var elevationRaised: ElevationCompositeSemanticToken { Self.mockThemeElevationCompositeSemanticToken } + + override open var elevationDrag: ElevationCompositeSemanticToken { Self.mockThemeElevationCompositeSemanticToken } + + override open var elevationOverlayDefault: ElevationCompositeSemanticToken { Self.mockThemeElevationCompositeSemanticToken } + + override open var elevationOverlayEmphasized: ElevationCompositeSemanticToken { Self.mockThemeElevationCompositeSemanticToken } + + override open var elevationStickyDefault: ElevationCompositeSemanticToken { Self.mockThemeElevationCompositeSemanticToken } + + override open var elevationStickyEmphasized: ElevationCompositeSemanticToken { Self.mockThemeElevationCompositeSemanticToken } + + override open var elevationStickyNavigationScrolled: ElevationCompositeSemanticToken { Self.mockThemeElevationCompositeSemanticToken } +} diff --git a/OUDS/Core/OUDS/Tests/OUDSTheme/MockThemes/MockTheme+ElevationSemanticTokens.swift b/OUDS/Core/OUDS/Tests/OUDSTheme/MockThemes/MockTheme+ElevationSemanticTokens.swift index 1a5e62d7f..f0742e68d 100644 --- a/OUDS/Core/OUDS/Tests/OUDSTheme/MockThemes/MockTheme+ElevationSemanticTokens.swift +++ b/OUDS/Core/OUDS/Tests/OUDSTheme/MockThemes/MockTheme+ElevationSemanticTokens.swift @@ -24,8 +24,6 @@ extension MockTheme { static let mockThemeElevationBlurRawToken: ElevationRawToken = 816 static let mockThemeElevationColorRawToken: ColorRawToken = ColorRawTokens.colorFunctionalMalachite500 static let mockThemeElevationMultipleColorSemanticToken = ElevationColorSemanticToken(mockThemeElevationColorRawToken) - static let mockThemeElevationCompositeRawToken = ElevationCompositeRawToken(x: 118, y: 712, blur: 118, color: ColorRawTokens.colorFunctionalDodgerBlue800) - static let mockThemeElevationCompositeSemanticToken = ElevationCompositeSemanticToken(ElevationRawTokens.elevationBottom_1_600) // MARK: Semantic token - Elevation - X @@ -91,21 +89,5 @@ extension MockTheme { // MARK: Semantic token - Elevation - Color - Sticky - Navigation scrolled override open var elevationColorStickyNavigationScrolled: ElevationColorSemanticToken { Self.mockThemeElevationMultipleColorSemanticToken } - - // MARK: Semantic token - Elevation - Box shadow - - override open var elevationRaised: ElevationCompositeSemanticToken { Self.mockThemeElevationCompositeSemanticToken } - - override open var elevationDrag: ElevationCompositeSemanticToken { Self.mockThemeElevationCompositeSemanticToken } - - override open var elevationOverlayDefault: ElevationCompositeSemanticToken { Self.mockThemeElevationCompositeSemanticToken } - - override open var elevationOverlayEmphasized: ElevationCompositeSemanticToken { Self.mockThemeElevationCompositeSemanticToken } - - override open var elevationStickyDefault: ElevationCompositeSemanticToken { Self.mockThemeElevationCompositeSemanticToken } - - override open var elevationStickyEmphasized: ElevationCompositeSemanticToken { Self.mockThemeElevationCompositeSemanticToken } - - override open var elevationStickyNavigationScrolled: ElevationCompositeSemanticToken { Self.mockThemeElevationCompositeSemanticToken } } // swiftlint:enable identifier_name diff --git a/OUDS/Core/OUDS/Tests/OUDSTheme/MockThemes/MockTheme+SizingSemanticTokens.swift b/OUDS/Core/OUDS/Tests/OUDSTheme/MockThemes/MockTheme+SizeSemanticTokens.swift similarity index 100% rename from OUDS/Core/OUDS/Tests/OUDSTheme/MockThemes/MockTheme+SizingSemanticTokens.swift rename to OUDS/Core/OUDS/Tests/OUDSTheme/MockThemes/MockTheme+SizeSemanticTokens.swift diff --git a/OUDS/Core/OUDS/Tests/OUDSTheme/MockThemes/MockTheme+SpacingSemanticTokens.swift b/OUDS/Core/OUDS/Tests/OUDSTheme/MockThemes/MockTheme+SpaceSemanticTokens.swift similarity index 100% rename from OUDS/Core/OUDS/Tests/OUDSTheme/MockThemes/MockTheme+SpacingSemanticTokens.swift rename to OUDS/Core/OUDS/Tests/OUDSTheme/MockThemes/MockTheme+SpaceSemanticTokens.swift diff --git a/OUDS/Core/OUDS/Tests/OUDSTheme/MockThemes/MockTheme+TypographyCompositeSemanticTokens.swift b/OUDS/Core/OUDS/Tests/OUDSTheme/MockThemes/MockTheme+TypographyCompositeSemanticTokens.swift new file mode 100644 index 000000000..d7abb4484 --- /dev/null +++ b/OUDS/Core/OUDS/Tests/OUDSTheme/MockThemes/MockTheme+TypographyCompositeSemanticTokens.swift @@ -0,0 +1,58 @@ +// +// Software Name: OUDS iOS +// SPDX-FileCopyrightText: Copyright (c) Orange SA +// SPDX-License-Identifier: MIT +// +// This software is distributed under the MIT license, +// the text of which is available at https://opensource.org/license/MIT/ +// or see the "LICENSE" file for more details. +// +// Authors: See CONTRIBUTORS.txt +// Software description: A SwiftUI components library with code examples for Orange Unified Design System +// + +import OUDSTokensRaw +import OUDSTokensSemantic + +extension MockTheme { + + static let mockThemeMultipleTypographyTokens = MultipleTypographyTokens(TypographyRawTokens.typeBold1850) + + // MARK: - Semantic tokens - Typography - Composites - Display + + override open var typeDisplayLarge: MultipleTypographyTokens { Self.mockThemeMultipleTypographyTokens } + override open var typeDisplayMedium: MultipleTypographyTokens { Self.mockThemeMultipleTypographyTokens } + override open var typeDisplaySmall: MultipleTypographyTokens { Self.mockThemeMultipleTypographyTokens } + + // MARK: - Semantic tokens - Typography - Composites - Heading + + override open var typeHeadingXLarge: MultipleTypographyTokens { Self.mockThemeMultipleTypographyTokens } + override open var typeHeadingLarge: MultipleTypographyTokens { Self.mockThemeMultipleTypographyTokens } + override open var typeHeadingMedium: MultipleTypographyTokens { Self.mockThemeMultipleTypographyTokens } + override open var typeHeadingSmall: MultipleTypographyTokens { Self.mockThemeMultipleTypographyTokens } + + // MARK: - Semantic tokens - Typography - Composites - Body + + override open var typeBodyDefaultLarge: MultipleTypographyTokens { Self.mockThemeMultipleTypographyTokens } + override open var typeBodyDefaultMedium: MultipleTypographyTokens { Self.mockThemeMultipleTypographyTokens } + override open var typeBodyDefaultSmall: MultipleTypographyTokens { Self.mockThemeMultipleTypographyTokens } + override open var typeBodyStrongLarge: MultipleTypographyTokens { Self.mockThemeMultipleTypographyTokens } + override open var typeBodyStrongMedium: MultipleTypographyTokens { Self.mockThemeMultipleTypographyTokens } + override open var typeBodyStrongSmall: MultipleTypographyTokens { Self.mockThemeMultipleTypographyTokens } + + // MARK: - Semantic tokens - Typography - Composites - Label + + override open var typeLabelDefaultXLarge: MultipleTypographyTokens { Self.mockThemeMultipleTypographyTokens } + override open var typeLabelDefaultLarge: MultipleTypographyTokens { Self.mockThemeMultipleTypographyTokens } + override open var typeLabelDefaultMedium: MultipleTypographyTokens { Self.mockThemeMultipleTypographyTokens } + override open var typeLabelDefaultSmall: MultipleTypographyTokens { Self.mockThemeMultipleTypographyTokens } + override open var typeLabelStrongXLarge: MultipleTypographyTokens { Self.mockThemeMultipleTypographyTokens } + override open var typeLabelStrongLarge: MultipleTypographyTokens { Self.mockThemeMultipleTypographyTokens } + override open var typeLabelStrongMedium: MultipleTypographyTokens { Self.mockThemeMultipleTypographyTokens } + override open var typeLabelStrongSmall: MultipleTypographyTokens { Self.mockThemeMultipleTypographyTokens } + + // MARK: - Semantic tokens - Typography - Composites - Code + + override open var typeCodeMedium: MultipleTypographyTokens { Self.mockThemeMultipleTypographyTokens } + override open var typeCodeSmall: MultipleTypographyTokens { Self.mockThemeMultipleTypographyTokens } +} diff --git a/OUDS/Core/OUDS/Tests/OUDSTheme/MockThemes/MockTheme+TypographySemanticTokens.swift b/OUDS/Core/OUDS/Tests/OUDSTheme/MockThemes/MockTheme+TypographySemanticTokens.swift index bda20ecca..0fbe38a97 100644 --- a/OUDS/Core/OUDS/Tests/OUDSTheme/MockThemes/MockTheme+TypographySemanticTokens.swift +++ b/OUDS/Core/OUDS/Tests/OUDSTheme/MockThemes/MockTheme+TypographySemanticTokens.swift @@ -23,7 +23,6 @@ extension MockTheme { static let mockThemeTypographyFontSizeRawToken: TypographyFontSizeRawToken = 666 static let mockThemeTypographyFontLineHeightRawToken: TypographyFontLineHeightRawToken = 321 static let mockThemeTypographyFontLetterSpacingRawToken: TypographyFontLetterSpacingRawToken = 21_092_024 - static let mockThemeMultipleTypographyTokens = MultipleTypographyTokens(TypographyRawTokens.typeBold1850) static let mockThemeMultipleTypographyFontSizeTokens = MultipleFontSizeTokens(mockThemeTypographyFontSizeRawToken) static let mockThemeMultipleTypographyLineHeightTokens = MultipleFontLineHeightTokens(mockThemeTypographyFontLineHeightRawToken) static let mockThemeMultipleTypographyLetterSpacingTokens = MultipleFontLetterSpacingTokens(mockThemeTypographyFontLetterSpacingRawToken) @@ -109,44 +108,6 @@ extension MockTheme { override open var fontLetterSpacingLabelSmall: MultipleFontLetterSpacingTokens { Self.mockThemeMultipleTypographyLetterSpacingTokens } override open var fontLetterSpacingCodeMedium: MultipleFontLetterSpacingTokens { Self.mockThemeMultipleTypographyLetterSpacingTokens } override open var fontLetterSpacingCodeSmall: MultipleFontLetterSpacingTokens { Self.mockThemeMultipleTypographyLetterSpacingTokens } - - // MARK: - Semantic tokens - Typography - Composites - Display - - override open var typeDisplayLarge: MultipleTypographyTokens { Self.mockThemeMultipleTypographyTokens } - override open var typeDisplayMedium: MultipleTypographyTokens { Self.mockThemeMultipleTypographyTokens } - override open var typeDisplaySmall: MultipleTypographyTokens { Self.mockThemeMultipleTypographyTokens } - - // MARK: - Semantic tokens - Typography - Composites - Heading - - override open var typeHeadingXLarge: MultipleTypographyTokens { Self.mockThemeMultipleTypographyTokens } - override open var typeHeadingLarge: MultipleTypographyTokens { Self.mockThemeMultipleTypographyTokens } - override open var typeHeadingMedium: MultipleTypographyTokens { Self.mockThemeMultipleTypographyTokens } - override open var typeHeadingSmall: MultipleTypographyTokens { Self.mockThemeMultipleTypographyTokens } - - // MARK: - Semantic tokens - Typography - Composites - Body - - override open var typeBodyDefaultLarge: MultipleTypographyTokens { Self.mockThemeMultipleTypographyTokens } - override open var typeBodyDefaultMedium: MultipleTypographyTokens { Self.mockThemeMultipleTypographyTokens } - override open var typeBodyDefaultSmall: MultipleTypographyTokens { Self.mockThemeMultipleTypographyTokens } - override open var typeBodyStrongLarge: MultipleTypographyTokens { Self.mockThemeMultipleTypographyTokens } - override open var typeBodyStrongMedium: MultipleTypographyTokens { Self.mockThemeMultipleTypographyTokens } - override open var typeBodyStrongSmall: MultipleTypographyTokens { Self.mockThemeMultipleTypographyTokens } - - // MARK: - Semantic tokens - Typography - Composites - Label - - override open var typeLabelDefaultXLarge: MultipleTypographyTokens { Self.mockThemeMultipleTypographyTokens } - override open var typeLabelDefaultLarge: MultipleTypographyTokens { Self.mockThemeMultipleTypographyTokens } - override open var typeLabelDefaultMedium: MultipleTypographyTokens { Self.mockThemeMultipleTypographyTokens } - override open var typeLabelDefaultSmall: MultipleTypographyTokens { Self.mockThemeMultipleTypographyTokens } - override open var typeLabelStrongXLarge: MultipleTypographyTokens { Self.mockThemeMultipleTypographyTokens } - override open var typeLabelStrongLarge: MultipleTypographyTokens { Self.mockThemeMultipleTypographyTokens } - override open var typeLabelStrongMedium: MultipleTypographyTokens { Self.mockThemeMultipleTypographyTokens } - override open var typeLabelStrongSmall: MultipleTypographyTokens { Self.mockThemeMultipleTypographyTokens } - - // MARK: - Semantic tokens - Typography - Composites - Code - - override open var typeCodeMedium: MultipleTypographyTokens { Self.mockThemeMultipleTypographyTokens } - override open var typeCodeSmall: MultipleTypographyTokens { Self.mockThemeMultipleTypographyTokens } } // swiftlint:enable identifier_name diff --git a/OUDS/Core/OUDS/Tests/OUDSTheme/MockThemes/OtherMockTheme.swift b/OUDS/Core/OUDS/Tests/OUDSTheme/MockThemes/OtherMockTheme.swift index 44713fcc6..135ca6ab1 100644 --- a/OUDS/Core/OUDS/Tests/OUDSTheme/MockThemes/OtherMockTheme.swift +++ b/OUDS/Core/OUDS/Tests/OUDSTheme/MockThemes/OtherMockTheme.swift @@ -25,53 +25,53 @@ final class OtherMockTheme: MockTheme, @unchecked Sendable { // MARK: Semantic token - Colors - Background - override var colorBackgroundPrimary: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorBgPrimary: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - override var colorBackgroundSecondary: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorBgSecondary: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - override var colorBackgroundTertiary: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorBgTertiary: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - override var colorBackgroundEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorBgEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - override var colorBackgroundBrandPrimary: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorBgBrandPrimary: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - override var colorBackgroundBrandSecondary: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorBgBrandSecondary: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - override var colorBackgroundBrandTertiary: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorBgBrandTertiary: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - override var colorBackgroundStatusNeutral: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorBgStatusNeutral: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - override var colorBackgroundStatusNeutralOnBgEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorBgStatusNeutralOnBgEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - override var colorBackgroundStatusPositiveMuted: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorBgStatusPositiveMuted: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - override var colorBackgroundStatusPositiveMutedOnBgEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorBgStatusPositiveMutedOnBgEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - override var colorBackgroundStatusPositiveEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorBgStatusPositiveEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - override var colorBackgroundStatusInfoMuted: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorBgStatusInfoMuted: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - override var colorBackgroundStatusInfoMutedOnBgEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorBgStatusInfoMutedOnBgEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - override var colorBackgroundStatusInfoEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorBgStatusInfoEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - override var colorBackgroundStatusWarningMuted: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorBgStatusWarningMuted: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - override var colorBackgroundStatusWarningMutedOnBgEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorBgStatusWarningMutedOnBgEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - override var colorBackgroundStatusWarningEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorBgStatusWarningEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - override var colorBackgroundStatusNegativeMuted: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorBgStatusNegativeMuted: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - override var colorBackgroundStatusNegativeMutedOnBgEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorBgStatusNegativeMutedOnBgEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - override var colorBackgroundStatusNegativeEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorBgStatusNegativeEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - override var colorBackgroundStatusAccentMuted: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorBgStatusAccentMuted: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - override var colorBackgroundStatusAccentMutedOnBgEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorBgStatusAccentMutedOnBgEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } - override var colorBackgroundStatusAccentEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } + override var colorBgStatusAccentEmphasized: ColorSemanticToken { Self.otherMockThemeMultipleColorTokens } // MARK: Semantic token - Colors - Content - Status diff --git a/OUDS/Core/OUDS/Tests/OUDSTheme/TestThemeOverrideOfColorSemanticTokens.swift b/OUDS/Core/OUDS/Tests/OUDSTheme/TestThemeOverrideOfColorSemanticTokens.swift index 19b4c36ef..d0e59f4f7 100644 --- a/OUDS/Core/OUDS/Tests/OUDSTheme/TestThemeOverrideOfColorSemanticTokens.swift +++ b/OUDS/Core/OUDS/Tests/OUDSTheme/TestThemeOverrideOfColorSemanticTokens.swift @@ -36,124 +36,124 @@ final class TestThemeOverrideOfColorSemanticTokens: XCTestCase { // MARK: Semantic token - Colors - Background - func testInheritedThemeCanOverrideSemanticTokenColorBackgroundPrimary() throws { - XCTAssertNotEqual(inheritedTheme.colorBackgroundPrimary, abstractTheme.colorBackgroundPrimary) - XCTAssertTrue(inheritedTheme.colorBackgroundPrimary == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorBgPrimary() throws { + XCTAssertNotEqual(inheritedTheme.colorBgPrimary, abstractTheme.colorBgPrimary) + XCTAssertTrue(inheritedTheme.colorBgPrimary == OtherMockTheme.otherMockThemeMultipleColorTokens) } - func testInheritedThemeCanOverrideSemanticTokenColorBackgroundSecondary() throws { - XCTAssertNotEqual(inheritedTheme.colorBackgroundSecondary, abstractTheme.colorBackgroundSecondary) - XCTAssertTrue(inheritedTheme.colorBackgroundSecondary == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorBgSecondary() throws { + XCTAssertNotEqual(inheritedTheme.colorBgSecondary, abstractTheme.colorBgSecondary) + XCTAssertTrue(inheritedTheme.colorBgSecondary == OtherMockTheme.otherMockThemeMultipleColorTokens) } - func testInheritedThemeCanOverrideSemanticTokenColorBackgroundTertiary() throws { - XCTAssertNotEqual(inheritedTheme.colorBackgroundTertiary, abstractTheme.colorBackgroundTertiary) - XCTAssertTrue(inheritedTheme.colorBackgroundTertiary == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorBgTertiary() throws { + XCTAssertNotEqual(inheritedTheme.colorBgTertiary, abstractTheme.colorBgTertiary) + XCTAssertTrue(inheritedTheme.colorBgTertiary == OtherMockTheme.otherMockThemeMultipleColorTokens) } - func testInheritedThemeCanOverrideSemanticTokenColorBackgroundEmphasized() throws { - XCTAssertNotEqual(inheritedTheme.colorBackgroundEmphasized, abstractTheme.colorBackgroundEmphasized) - XCTAssertTrue(inheritedTheme.colorBackgroundEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorBgEmphasized() throws { + XCTAssertNotEqual(inheritedTheme.colorBgEmphasized, abstractTheme.colorBgEmphasized) + XCTAssertTrue(inheritedTheme.colorBgEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) } - func testInheritedThemeCanOverrideSemanticTokenColorBackgroundBrandPrimary() throws { - XCTAssertNotEqual(inheritedTheme.colorBackgroundBrandPrimary, abstractTheme.colorBackgroundBrandPrimary) - XCTAssertTrue(inheritedTheme.colorBackgroundBrandPrimary == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorBgBrandPrimary() throws { + XCTAssertNotEqual(inheritedTheme.colorBgBrandPrimary, abstractTheme.colorBgBrandPrimary) + XCTAssertTrue(inheritedTheme.colorBgBrandPrimary == OtherMockTheme.otherMockThemeMultipleColorTokens) } - func testInheritedThemeCanOverrideSemanticTokenColorBackgroundBrandSecondary() throws { - XCTAssertNotEqual(inheritedTheme.colorBackgroundBrandSecondary, abstractTheme.colorBackgroundBrandSecondary) - XCTAssertTrue(inheritedTheme.colorBackgroundBrandSecondary == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorBgBrandSecondary() throws { + XCTAssertNotEqual(inheritedTheme.colorBgBrandSecondary, abstractTheme.colorBgBrandSecondary) + XCTAssertTrue(inheritedTheme.colorBgBrandSecondary == OtherMockTheme.otherMockThemeMultipleColorTokens) } - func testInheritedThemeCanOverrideSemanticTokenColorBackgroundBrandTertiary() throws { - XCTAssertNotEqual(inheritedTheme.colorBackgroundBrandTertiary, abstractTheme.colorBackgroundBrandTertiary) - XCTAssertTrue(inheritedTheme.colorBackgroundBrandTertiary == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorBgBrandTertiary() throws { + XCTAssertNotEqual(inheritedTheme.colorBgBrandTertiary, abstractTheme.colorBgBrandTertiary) + XCTAssertTrue(inheritedTheme.colorBgBrandTertiary == OtherMockTheme.otherMockThemeMultipleColorTokens) } - func testInheritedThemeCanOverrideSemanticTokenColorBackgroundStatusNeutral() throws { - XCTAssertNotEqual(inheritedTheme.colorBackgroundStatusNeutral, abstractTheme.colorBackgroundStatusNeutral) - XCTAssertTrue(inheritedTheme.colorBackgroundStatusNeutral == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorBgStatusNeutral() throws { + XCTAssertNotEqual(inheritedTheme.colorBgStatusNeutral, abstractTheme.colorBgStatusNeutral) + XCTAssertTrue(inheritedTheme.colorBgStatusNeutral == OtherMockTheme.otherMockThemeMultipleColorTokens) } - func testInheritedThemeCanOverrideSemanticTokenColorBackgroundStatusNeutralOnBgEmphasized() throws { - XCTAssertNotEqual(inheritedTheme.colorBackgroundStatusNeutralOnBgEmphasized, abstractTheme.colorBackgroundStatusNeutralOnBgEmphasized) - XCTAssertTrue(inheritedTheme.colorBackgroundStatusNeutralOnBgEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorBgStatusNeutralOnBgEmphasized() throws { + XCTAssertNotEqual(inheritedTheme.colorBgStatusNeutralOnBgEmphasized, abstractTheme.colorBgStatusNeutralOnBgEmphasized) + XCTAssertTrue(inheritedTheme.colorBgStatusNeutralOnBgEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) } - func testInheritedThemeCanOverrideSemanticTokenColorBackgroundStatusPositiveMuted() throws { - XCTAssertNotEqual(inheritedTheme.colorBackgroundStatusPositiveMuted, abstractTheme.colorBackgroundStatusPositiveMuted) - XCTAssertTrue(inheritedTheme.colorBackgroundStatusPositiveMuted == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorBgStatusPositiveMuted() throws { + XCTAssertNotEqual(inheritedTheme.colorBgStatusPositiveMuted, abstractTheme.colorBgStatusPositiveMuted) + XCTAssertTrue(inheritedTheme.colorBgStatusPositiveMuted == OtherMockTheme.otherMockThemeMultipleColorTokens) } - func testInheritedThemeCanOverrideSemanticTokenColorBackgroundStatusPositiveMutedOnBgEmphasized() throws { - XCTAssertNotEqual(inheritedTheme.colorBackgroundStatusPositiveMutedOnBgEmphasized, abstractTheme.colorBackgroundStatusPositiveMutedOnBgEmphasized) - XCTAssertTrue(inheritedTheme.colorBackgroundStatusPositiveMutedOnBgEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorBgStatusPositiveMutedOnBgEmphasized() throws { + XCTAssertNotEqual(inheritedTheme.colorBgStatusPositiveMutedOnBgEmphasized, abstractTheme.colorBgStatusPositiveMutedOnBgEmphasized) + XCTAssertTrue(inheritedTheme.colorBgStatusPositiveMutedOnBgEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) } - func testInheritedThemeCanOverrideSemanticTokenColorBackgroundStatusPositiveEmphasized() throws { - XCTAssertNotEqual(inheritedTheme.colorBackgroundStatusPositiveEmphasized, abstractTheme.colorBackgroundStatusPositiveEmphasized) - XCTAssertTrue(inheritedTheme.colorBackgroundStatusPositiveEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorBgStatusPositiveEmphasized() throws { + XCTAssertNotEqual(inheritedTheme.colorBgStatusPositiveEmphasized, abstractTheme.colorBgStatusPositiveEmphasized) + XCTAssertTrue(inheritedTheme.colorBgStatusPositiveEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) } - func testInheritedThemeCanOverrideSemanticTokenColorBackgroundStatusInfoMuted() throws { - XCTAssertNotEqual(inheritedTheme.colorBackgroundStatusInfoMuted, abstractTheme.colorBackgroundStatusInfoMuted) - XCTAssertTrue(inheritedTheme.colorBackgroundStatusInfoMuted == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorBgStatusInfoMuted() throws { + XCTAssertNotEqual(inheritedTheme.colorBgStatusInfoMuted, abstractTheme.colorBgStatusInfoMuted) + XCTAssertTrue(inheritedTheme.colorBgStatusInfoMuted == OtherMockTheme.otherMockThemeMultipleColorTokens) } - func testInheritedThemeCanOverrideSemanticTokenColorBackgroundStatusInfoMutedOnBgEmphasized() throws { - XCTAssertNotEqual(inheritedTheme.colorBackgroundStatusInfoMutedOnBgEmphasized, abstractTheme.colorBackgroundStatusInfoMutedOnBgEmphasized) - XCTAssertTrue(inheritedTheme.colorBackgroundStatusInfoMutedOnBgEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorBgStatusInfoMutedOnBgEmphasized() throws { + XCTAssertNotEqual(inheritedTheme.colorBgStatusInfoMutedOnBgEmphasized, abstractTheme.colorBgStatusInfoMutedOnBgEmphasized) + XCTAssertTrue(inheritedTheme.colorBgStatusInfoMutedOnBgEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) } - func testInheritedThemeCanOverrideSemanticTokenColorBackgroundStatusInfoEmphasized() throws { - XCTAssertNotEqual(inheritedTheme.colorBackgroundStatusInfoEmphasized, abstractTheme.colorBackgroundStatusInfoEmphasized) - XCTAssertTrue(inheritedTheme.colorBackgroundStatusInfoEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorBgStatusInfoEmphasized() throws { + XCTAssertNotEqual(inheritedTheme.colorBgStatusInfoEmphasized, abstractTheme.colorBgStatusInfoEmphasized) + XCTAssertTrue(inheritedTheme.colorBgStatusInfoEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) } - func testInheritedThemeCanOverrideSemanticTokenColorBackgroundStatusWarningMuted() throws { - XCTAssertNotEqual(inheritedTheme.colorBackgroundStatusWarningMuted, abstractTheme.colorBackgroundStatusWarningMuted) - XCTAssertTrue(inheritedTheme.colorBackgroundStatusWarningMuted == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorBgStatusWarningMuted() throws { + XCTAssertNotEqual(inheritedTheme.colorBgStatusWarningMuted, abstractTheme.colorBgStatusWarningMuted) + XCTAssertTrue(inheritedTheme.colorBgStatusWarningMuted == OtherMockTheme.otherMockThemeMultipleColorTokens) } - func testInheritedThemeCanOverrideSemanticTokenColorBackgroundStatusWarningMutedOnBgEmphasized() throws { - XCTAssertNotEqual(inheritedTheme.colorBackgroundStatusWarningMutedOnBgEmphasized, abstractTheme.colorBackgroundStatusWarningMutedOnBgEmphasized) - XCTAssertTrue(inheritedTheme.colorBackgroundStatusWarningMutedOnBgEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorBgStatusWarningMutedOnBgEmphasized() throws { + XCTAssertNotEqual(inheritedTheme.colorBgStatusWarningMutedOnBgEmphasized, abstractTheme.colorBgStatusWarningMutedOnBgEmphasized) + XCTAssertTrue(inheritedTheme.colorBgStatusWarningMutedOnBgEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) } - func testInheritedThemeCanOverrideSemanticTokenColorBackgroundStatusWarningEmphasized() throws { - XCTAssertNotEqual(inheritedTheme.colorBackgroundStatusWarningEmphasized, abstractTheme.colorBackgroundStatusWarningEmphasized) - XCTAssertTrue(inheritedTheme.colorBackgroundStatusWarningEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorBgStatusWarningEmphasized() throws { + XCTAssertNotEqual(inheritedTheme.colorBgStatusWarningEmphasized, abstractTheme.colorBgStatusWarningEmphasized) + XCTAssertTrue(inheritedTheme.colorBgStatusWarningEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) } - func testInheritedThemeCanOverrideSemanticTokenColorBackgroundStatusNegativeMuted() throws { - XCTAssertNotEqual(inheritedTheme.colorBackgroundStatusNegativeMuted, abstractTheme.colorBackgroundStatusNegativeMuted) - XCTAssertTrue(inheritedTheme.colorBackgroundStatusNegativeMuted == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorBgStatusNegativeMuted() throws { + XCTAssertNotEqual(inheritedTheme.colorBgStatusNegativeMuted, abstractTheme.colorBgStatusNegativeMuted) + XCTAssertTrue(inheritedTheme.colorBgStatusNegativeMuted == OtherMockTheme.otherMockThemeMultipleColorTokens) } - func testInheritedThemeCanOverrideSemanticTokenColorBackgroundStatusNegativeMutedOnBgEmphasized() throws { - XCTAssertNotEqual(inheritedTheme.colorBackgroundStatusNegativeMutedOnBgEmphasized, abstractTheme.colorBackgroundStatusNegativeMutedOnBgEmphasized) - XCTAssertTrue(inheritedTheme.colorBackgroundStatusNegativeMutedOnBgEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorBgStatusNegativeMutedOnBgEmphasized() throws { + XCTAssertNotEqual(inheritedTheme.colorBgStatusNegativeMutedOnBgEmphasized, abstractTheme.colorBgStatusNegativeMutedOnBgEmphasized) + XCTAssertTrue(inheritedTheme.colorBgStatusNegativeMutedOnBgEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) } - func testInheritedThemeCanOverrideSemanticTokenColorBackgroundStatusNegativeEmphasized() throws { - XCTAssertNotEqual(inheritedTheme.colorBackgroundStatusNegativeEmphasized, abstractTheme.colorBackgroundStatusNegativeEmphasized) - XCTAssertTrue(inheritedTheme.colorBackgroundStatusNegativeEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorBgStatusNegativeEmphasized() throws { + XCTAssertNotEqual(inheritedTheme.colorBgStatusNegativeEmphasized, abstractTheme.colorBgStatusNegativeEmphasized) + XCTAssertTrue(inheritedTheme.colorBgStatusNegativeEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) } - func testInheritedThemeCanOverrideSemanticTokenColorBackgroundStatusAccentMuted() throws { - XCTAssertNotEqual(inheritedTheme.colorBackgroundStatusAccentMuted, abstractTheme.colorBackgroundStatusAccentMuted) - XCTAssertTrue(inheritedTheme.colorBackgroundStatusAccentMuted == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorBgStatusAccentMuted() throws { + XCTAssertNotEqual(inheritedTheme.colorBgStatusAccentMuted, abstractTheme.colorBgStatusAccentMuted) + XCTAssertTrue(inheritedTheme.colorBgStatusAccentMuted == OtherMockTheme.otherMockThemeMultipleColorTokens) } - func testInheritedThemeCanOverrideSemanticTokenColorBackgroundStatusAccentMutedOnBgEmphasized() throws { - XCTAssertNotEqual(inheritedTheme.colorBackgroundStatusAccentMutedOnBgEmphasized, abstractTheme.colorBackgroundStatusAccentMutedOnBgEmphasized) - XCTAssertTrue(inheritedTheme.colorBackgroundStatusAccentMutedOnBgEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorBgStatusAccentMutedOnBgEmphasized() throws { + XCTAssertNotEqual(inheritedTheme.colorBgStatusAccentMutedOnBgEmphasized, abstractTheme.colorBgStatusAccentMutedOnBgEmphasized) + XCTAssertTrue(inheritedTheme.colorBgStatusAccentMutedOnBgEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) } - func testInheritedThemeCanOverrideSemanticTokenColorBackgroundStatusAccentEmphasized() throws { - XCTAssertNotEqual(inheritedTheme.colorBackgroundStatusAccentEmphasized, abstractTheme.colorBackgroundStatusAccentEmphasized) - XCTAssertTrue(inheritedTheme.colorBackgroundStatusAccentEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) + func testInheritedThemeCanOverrideSemanticTokenColorBgStatusAccentEmphasized() throws { + XCTAssertNotEqual(inheritedTheme.colorBgStatusAccentEmphasized, abstractTheme.colorBgStatusAccentEmphasized) + XCTAssertTrue(inheritedTheme.colorBgStatusAccentEmphasized == OtherMockTheme.otherMockThemeMultipleColorTokens) } // MARK: Semantic token - Colors - Content - Status diff --git a/OUDS/Core/OUDS/Tests/OUDSTheme/TestThemeOverrideOfCompositeElevationSemanticTokens.swift b/OUDS/Core/OUDS/Tests/OUDSTheme/TestThemeOverrideOfCompositeElevationSemanticTokens.swift new file mode 100644 index 000000000..0e0394499 --- /dev/null +++ b/OUDS/Core/OUDS/Tests/OUDSTheme/TestThemeOverrideOfCompositeElevationSemanticTokens.swift @@ -0,0 +1,78 @@ +// +// Software Name: OUDS iOS +// SPDX-FileCopyrightText: Copyright (c) Orange SA +// SPDX-License-Identifier: MIT +// +// This software is distributed under the MIT license, +// the text of which is available at https://opensource.org/license/MIT/ +// or see the "LICENSE" file for more details. +// +// Authors: See CONTRIBUTORS.txt +// Software description: A SwiftUI components library with code examples for Orange Unified Design System +// + +import OUDS +import XCTest + +// swiftlint:disable required_deinit +// swiftlint:disable implicitly_unwrapped_optional +// swiftlint:disable type_name + +/// The architecture of _OUDS iOS_ _Swift package_ library is based on _object oriented paradigm_ and overriding of classes. +/// In fact, the `OUDSTheme` object is a class, which can be seen as an _asbtract class_, exposing through its extensions and protocols _composite elevation semantic tokens_. +/// These semantic tokens should be overriden by subclass like the `OrangeTheme` default theme. +/// **These tests checks if any _composite elevation semantic tokens_ can be surcharged by a child theme** +final class TestThemeOverrideOfElevationCompositeSemanticTokens: XCTestCase { + + private var abstractTheme: OUDSTheme! + private var inheritedTheme: OUDSTheme! + + override func setUp() async throws { + abstractTheme = OUDSTheme() + inheritedTheme = MockTheme() + } + + func testInheritedThemeCanOverrideSemanticTokenElevationCompositeNone() throws { + XCTAssertNotEqual(inheritedTheme.elevationNone, abstractTheme.elevationNone) + XCTAssertTrue(inheritedTheme.elevationNone == MockTheme.mockThemeElevationCompositeSemanticToken) + } + + func testInheritedThemeCanOverrideSemanticTokenElevationCompositeRaised() throws { + XCTAssertNotEqual(inheritedTheme.elevationRaised, abstractTheme.elevationRaised) + XCTAssertTrue(inheritedTheme.elevationRaised == MockTheme.mockThemeElevationCompositeSemanticToken) + } + + func testInheritedThemeCanOverrideSemanticTokenElevationCompositeDrag() throws { + XCTAssertNotEqual(inheritedTheme.elevationDrag, abstractTheme.elevationDrag) + XCTAssertTrue(inheritedTheme.elevationDrag == MockTheme.mockThemeElevationCompositeSemanticToken) + } + + func testInheritedThemeCanOverrideSemanticTokenElevationCompositeOverlayDefault() throws { + XCTAssertNotEqual(inheritedTheme.elevationOverlayDefault, abstractTheme.elevationOverlayDefault) + XCTAssertTrue(inheritedTheme.elevationOverlayDefault == MockTheme.mockThemeElevationCompositeSemanticToken) + } + + func testInheritedThemeCanOverrideSemanticTokenElevationCompositeOverlayEmphasized() throws { + XCTAssertNotEqual(inheritedTheme.elevationOverlayEmphasized, abstractTheme.elevationOverlayEmphasized) + XCTAssertTrue(inheritedTheme.elevationOverlayEmphasized == MockTheme.mockThemeElevationCompositeSemanticToken) + } + + func testInheritedThemeCanOverrideSemanticTokenElevationCompositeStickyDefault() throws { + XCTAssertNotEqual(inheritedTheme.elevationStickyDefault, abstractTheme.elevationStickyDefault) + XCTAssertTrue(inheritedTheme.elevationStickyDefault == MockTheme.mockThemeElevationCompositeSemanticToken) + } + + func testInheritedThemeCanOverrideSemanticTokenElevationCompositeStickyEmphasized() throws { + XCTAssertNotEqual(inheritedTheme.elevationStickyEmphasized, abstractTheme.elevationStickyEmphasized) + XCTAssertTrue(inheritedTheme.elevationStickyEmphasized == MockTheme.mockThemeElevationCompositeSemanticToken) + } + + func testInheritedThemeCanOverrideSemanticTokenElevationCompositeStickyNavigationScrolled() throws { + XCTAssertNotEqual(inheritedTheme.elevationStickyNavigationScrolled, abstractTheme.elevationStickyNavigationScrolled) + XCTAssertTrue(inheritedTheme.elevationStickyNavigationScrolled == MockTheme.mockThemeElevationCompositeSemanticToken) + } +} + +// swiftlint:enable required_deinit +// swiftlint:enable implicitly_unwrapped_optional +// swiftlint:enable type_name diff --git a/OUDS/Core/OUDS/Tests/OUDSTheme/TestThemeOverrideOfTypographyCompositeSemanticTokens.swift b/OUDS/Core/OUDS/Tests/OUDSTheme/TestThemeOverrideOfTypographyCompositeSemanticTokens.swift new file mode 100644 index 000000000..21827b7e8 --- /dev/null +++ b/OUDS/Core/OUDS/Tests/OUDSTheme/TestThemeOverrideOfTypographyCompositeSemanticTokens.swift @@ -0,0 +1,163 @@ +// +// Software Name: OUDS iOS +// SPDX-FileCopyrightText: Copyright (c) Orange SA +// SPDX-License-Identifier: MIT +// +// This software is distributed under the MIT license, +// the text of which is available at https://opensource.org/license/MIT/ +// or see the "LICENSE" file for more details. +// +// Authors: See CONTRIBUTORS.txt +// Software description: A SwiftUI components library with code examples for Orange Unified Design System +// + +import OUDS +import XCTest + +// swiftlint:disable required_deinit +// swiftlint:disable implicitly_unwrapped_optional +// swiftlint:disable type_name + +/// The architecture of _OUDS iOS_ _Swift package_ library is based on _object oriented paradigm_ and overriding of classes. +/// In fact the `OUDSTheme` object is a class, which can be seen as an _asbtract class_, exposing through its extensions and protocols _typography semantic tokens_. +/// These semantic tokens should be overriden by subclass like the `OrangeTheme` default theme. +/// **These tests checks if any _typography semantic tokens_ can be surcharged by a child theme** +final class TestThemeOverrideOfTypographyCompositeSemanticTokens: XCTestCase { + + private var abstractTheme: OUDSTheme! + private var inheritedTheme: OUDSTheme! + + override func setUp() async throws { + abstractTheme = OUDSTheme() + inheritedTheme = MockTheme() + } + + // MARK: - Semantic tokens - Typography - Composites - Display + + func testInheritedThemeCanOverrideSemanticTokenTypeDisplayLarge() throws { + XCTAssertNotEqual(inheritedTheme.typeDisplayLarge, abstractTheme.typeDisplayLarge) + XCTAssertTrue(inheritedTheme.typeDisplayLarge == MockTheme.mockThemeMultipleTypographyTokens) + } + + func testInheritedThemeCanOverrideSemanticTokenTypeDisplayMedium() throws { + XCTAssertNotEqual(inheritedTheme.typeDisplayMedium, abstractTheme.typeDisplayMedium) + XCTAssertTrue(inheritedTheme.typeDisplayMedium == MockTheme.mockThemeMultipleTypographyTokens) + } + + func testInheritedThemeCanOverrideSemanticTokenTypeDisplaySmal() throws { + XCTAssertNotEqual(inheritedTheme.typeDisplaySmall, abstractTheme.typeDisplaySmall) + XCTAssertTrue(inheritedTheme.typeDisplaySmall == MockTheme.mockThemeMultipleTypographyTokens) + } + + // MARK: - Semantic tokens - Typography - Composites - Heading + + func testInheritedThemeCanOverrideSemanticTokenTypeHeadingXLarge() throws { + XCTAssertNotEqual(inheritedTheme.typeHeadingXLarge, abstractTheme.typeHeadingXLarge) + XCTAssertTrue(inheritedTheme.typeHeadingXLarge == MockTheme.mockThemeMultipleTypographyTokens) + } + + func testInheritedThemeCanOverrideSemanticTokenTypeHeadingLarge() throws { + XCTAssertNotEqual(inheritedTheme.typeHeadingLarge, abstractTheme.typeHeadingLarge) + XCTAssertTrue(inheritedTheme.typeHeadingLarge == MockTheme.mockThemeMultipleTypographyTokens) + } + + func testInheritedThemeCanOverrideSemanticTokenTypeHeadingMedium() throws { + XCTAssertNotEqual(inheritedTheme.typeHeadingMedium, abstractTheme.typeHeadingMedium) + XCTAssertTrue(inheritedTheme.typeHeadingMedium == MockTheme.mockThemeMultipleTypographyTokens) + } + + func testInheritedThemeCanOverrideSemanticTokenTypeHeadingSmall() throws { + XCTAssertNotEqual(inheritedTheme.typeHeadingSmall, abstractTheme.typeHeadingSmall) + XCTAssertTrue(inheritedTheme.typeHeadingSmall == MockTheme.mockThemeMultipleTypographyTokens) + } + + // MARK: - Semantic tokens - Typography - Composites - Body + + func testInheritedThemeCanOverrideSemanticTokenTypeDefaultLarge() throws { + XCTAssertNotEqual(inheritedTheme.typeBodyDefaultLarge, abstractTheme.typeBodyDefaultLarge) + XCTAssertTrue(inheritedTheme.typeBodyDefaultLarge == MockTheme.mockThemeMultipleTypographyTokens) + } + + func testInheritedThemeCanOverrideSemanticTokenTypeDefaultMedium() throws { + XCTAssertNotEqual(inheritedTheme.typeBodyDefaultMedium, abstractTheme.typeBodyDefaultMedium) + XCTAssertTrue(inheritedTheme.typeBodyDefaultMedium == MockTheme.mockThemeMultipleTypographyTokens) + } + + func testInheritedThemeCanOverrideSemanticTokenTypeDefaultSmall() throws { + XCTAssertNotEqual(inheritedTheme.typeBodyDefaultSmall, abstractTheme.typeBodyDefaultSmall) + XCTAssertTrue(inheritedTheme.typeBodyDefaultSmall == MockTheme.mockThemeMultipleTypographyTokens) + } + + func testInheritedThemeCanOverrideSemanticTokenTypeStrongLarge() throws { + XCTAssertNotEqual(inheritedTheme.typeBodyStrongLarge, abstractTheme.typeBodyStrongLarge) + XCTAssertTrue(inheritedTheme.typeBodyStrongLarge == MockTheme.mockThemeMultipleTypographyTokens) + } + + func testInheritedThemeCanOverrideSemanticTokenTypeStrongMedium() throws { + XCTAssertNotEqual(inheritedTheme.typeBodyStrongMedium, abstractTheme.typeBodyStrongMedium) + XCTAssertTrue(inheritedTheme.typeBodyStrongMedium == MockTheme.mockThemeMultipleTypographyTokens) + } + + func testInheritedThemeCanOverrideSemanticTokenTypeStrongSmall() throws { + XCTAssertNotEqual(inheritedTheme.typeBodyStrongSmall, abstractTheme.typeBodyStrongSmall) + XCTAssertTrue(inheritedTheme.typeBodyStrongSmall == MockTheme.mockThemeMultipleTypographyTokens) + } + + // MARK: - Semantic tokens - Typography - Composites - Label + + func testInheritedThemeCanOverrideSemanticTokenTypeLabelDefaultXLarge() throws { + XCTAssertNotEqual(inheritedTheme.typeLabelDefaultXLarge, abstractTheme.typeLabelDefaultXLarge) + XCTAssertTrue(inheritedTheme.typeLabelDefaultXLarge == MockTheme.mockThemeMultipleTypographyTokens) + } + + func testInheritedThemeCanOverrideSemanticTokenTypeLabelDefaultLarge() throws { + XCTAssertNotEqual(inheritedTheme.typeLabelDefaultLarge, abstractTheme.typeLabelDefaultLarge) + XCTAssertTrue(inheritedTheme.typeLabelDefaultLarge == MockTheme.mockThemeMultipleTypographyTokens) + } + + func testInheritedThemeCanOverrideSemanticTokenTypeLabelDefaultMedium() throws { + XCTAssertNotEqual(inheritedTheme.typeLabelDefaultMedium, abstractTheme.typeLabelDefaultMedium) + XCTAssertTrue(inheritedTheme.typeLabelDefaultMedium == MockTheme.mockThemeMultipleTypographyTokens) + } + + func testInheritedThemeCanOverrideSemanticTokenTypeLabelDefaultSmall() throws { + XCTAssertNotEqual(inheritedTheme.typeLabelDefaultSmall, abstractTheme.typeLabelDefaultSmall) + XCTAssertTrue(inheritedTheme.typeLabelDefaultSmall == MockTheme.mockThemeMultipleTypographyTokens) + } + + func testInheritedThemeCanOverrideSemanticTokenTypeLabelStrongXLarge() throws { + XCTAssertNotEqual(inheritedTheme.typeLabelStrongXLarge, abstractTheme.typeLabelStrongXLarge) + XCTAssertTrue(inheritedTheme.typeLabelStrongXLarge == MockTheme.mockThemeMultipleTypographyTokens) + } + + func testInheritedThemeCanOverrideSemanticTokenTypeLabelStrongLarge() throws { + XCTAssertNotEqual(inheritedTheme.typeLabelStrongLarge, abstractTheme.typeLabelStrongLarge) + XCTAssertTrue(inheritedTheme.typeLabelStrongLarge == MockTheme.mockThemeMultipleTypographyTokens) + } + + func testInheritedThemeCanOverrideSemanticTokenTypeLabelStrongMedium() throws { + XCTAssertNotEqual(inheritedTheme.typeLabelStrongMedium, abstractTheme.typeLabelStrongMedium) + XCTAssertTrue(inheritedTheme.typeLabelStrongMedium == MockTheme.mockThemeMultipleTypographyTokens) + } + + func testInheritedThemeCanOverrideSemanticTokenTypeLabelStrongSmall() throws { + XCTAssertNotEqual(inheritedTheme.typeLabelStrongSmall, abstractTheme.typeLabelStrongSmall) + XCTAssertTrue(inheritedTheme.typeLabelStrongSmall == MockTheme.mockThemeMultipleTypographyTokens) + } + + // MARK: - Semantic tokens - Typography - Composites - Code + + func testInheritedThemeCanOverrideSemanticTokenTypeCodeMedium() throws { + XCTAssertNotEqual(inheritedTheme.typeCodeMedium, abstractTheme.typeCodeMedium) + XCTAssertTrue(inheritedTheme.typeCodeMedium == MockTheme.mockThemeMultipleTypographyTokens) + } + + func testInheritedThemeCanOverrideSemanticTokenTypeCodeSmall() throws { + XCTAssertNotEqual(inheritedTheme.typeCodeSmall, abstractTheme.typeCodeSmall) + XCTAssertTrue(inheritedTheme.typeCodeSmall == MockTheme.mockThemeMultipleTypographyTokens) + } +} + +// swiftlint:enable required_deinit +// swiftlint:enable implicitly_unwrapped_optional +// swiftlint:enable type_name diff --git a/OUDS/Core/OUDS/Tests/OUDSTheme/TestThemeOverrideOfTypographySemanticTokens.swift b/OUDS/Core/OUDS/Tests/OUDSTheme/TestThemeOverrideOfTypographySemanticTokens.swift index c0d07498c..e82fe0b32 100644 --- a/OUDS/Core/OUDS/Tests/OUDSTheme/TestThemeOverrideOfTypographySemanticTokens.swift +++ b/OUDS/Core/OUDS/Tests/OUDSTheme/TestThemeOverrideOfTypographySemanticTokens.swift @@ -359,131 +359,6 @@ final class TestThemeOverrideOfTypographySemanticTokens: XCTestCase { XCTAssertNotEqual(inheritedTheme.fontLineHeightCodeSmall, abstractTheme.fontLineHeightCodeSmall) XCTAssertTrue(inheritedTheme.fontLineHeightCodeSmall == MockTheme.mockThemeMultipleTypographyLineHeightTokens) } - - // MARK: - Semantic tokens - Typography - Composites - Display - - func testInheritedThemeCanOverrideSemanticTokenTypeDisplayLarge() throws { - XCTAssertNotEqual(inheritedTheme.typeDisplayLarge, abstractTheme.typeDisplayLarge) - XCTAssertTrue(inheritedTheme.typeDisplayLarge == MockTheme.mockThemeMultipleTypographyTokens) - } - - func testInheritedThemeCanOverrideSemanticTokenTypeDisplayMedium() throws { - XCTAssertNotEqual(inheritedTheme.typeDisplayMedium, abstractTheme.typeDisplayMedium) - XCTAssertTrue(inheritedTheme.typeDisplayMedium == MockTheme.mockThemeMultipleTypographyTokens) - } - - func testInheritedThemeCanOverrideSemanticTokenTypeDisplaySmal() throws { - XCTAssertNotEqual(inheritedTheme.typeDisplaySmall, abstractTheme.typeDisplaySmall) - XCTAssertTrue(inheritedTheme.typeDisplaySmall == MockTheme.mockThemeMultipleTypographyTokens) - } - - // MARK: - Semantic tokens - Typography - Composites - Heading - - func testInheritedThemeCanOverrideSemanticTokenTypeHeadingXLarge() throws { - XCTAssertNotEqual(inheritedTheme.typeHeadingXLarge, abstractTheme.typeHeadingXLarge) - XCTAssertTrue(inheritedTheme.typeHeadingXLarge == MockTheme.mockThemeMultipleTypographyTokens) - } - - func testInheritedThemeCanOverrideSemanticTokenTypeHeadingLarge() throws { - XCTAssertNotEqual(inheritedTheme.typeHeadingLarge, abstractTheme.typeHeadingLarge) - XCTAssertTrue(inheritedTheme.typeHeadingLarge == MockTheme.mockThemeMultipleTypographyTokens) - } - - func testInheritedThemeCanOverrideSemanticTokenTypeHeadingMedium() throws { - XCTAssertNotEqual(inheritedTheme.typeHeadingMedium, abstractTheme.typeHeadingMedium) - XCTAssertTrue(inheritedTheme.typeHeadingMedium == MockTheme.mockThemeMultipleTypographyTokens) - } - - func testInheritedThemeCanOverrideSemanticTokenTypeHeadingSmall() throws { - XCTAssertNotEqual(inheritedTheme.typeHeadingSmall, abstractTheme.typeHeadingSmall) - XCTAssertTrue(inheritedTheme.typeHeadingSmall == MockTheme.mockThemeMultipleTypographyTokens) - } - - // MARK: - Semantic tokens - Typography - Composites - Body - - func testInheritedThemeCanOverrideSemanticTokenTypeDefaultLarge() throws { - XCTAssertNotEqual(inheritedTheme.typeBodyDefaultLarge, abstractTheme.typeBodyDefaultLarge) - XCTAssertTrue(inheritedTheme.typeBodyDefaultLarge == MockTheme.mockThemeMultipleTypographyTokens) - } - - func testInheritedThemeCanOverrideSemanticTokenTypeDefaultMedium() throws { - XCTAssertNotEqual(inheritedTheme.typeBodyDefaultMedium, abstractTheme.typeBodyDefaultMedium) - XCTAssertTrue(inheritedTheme.typeBodyDefaultMedium == MockTheme.mockThemeMultipleTypographyTokens) - } - - func testInheritedThemeCanOverrideSemanticTokenTypeDefaultSmall() throws { - XCTAssertNotEqual(inheritedTheme.typeBodyDefaultSmall, abstractTheme.typeBodyDefaultSmall) - XCTAssertTrue(inheritedTheme.typeBodyDefaultSmall == MockTheme.mockThemeMultipleTypographyTokens) - } - - func testInheritedThemeCanOverrideSemanticTokenTypeStrongLarge() throws { - XCTAssertNotEqual(inheritedTheme.typeBodyStrongLarge, abstractTheme.typeBodyStrongLarge) - XCTAssertTrue(inheritedTheme.typeBodyStrongLarge == MockTheme.mockThemeMultipleTypographyTokens) - } - - func testInheritedThemeCanOverrideSemanticTokenTypeStrongMedium() throws { - XCTAssertNotEqual(inheritedTheme.typeBodyStrongMedium, abstractTheme.typeBodyStrongMedium) - XCTAssertTrue(inheritedTheme.typeBodyStrongMedium == MockTheme.mockThemeMultipleTypographyTokens) - } - - func testInheritedThemeCanOverrideSemanticTokenTypeStrongSmall() throws { - XCTAssertNotEqual(inheritedTheme.typeBodyStrongSmall, abstractTheme.typeBodyStrongSmall) - XCTAssertTrue(inheritedTheme.typeBodyStrongSmall == MockTheme.mockThemeMultipleTypographyTokens) - } - - // MARK: - Semantic tokens - Typography - Composites - Label - - func testInheritedThemeCanOverrideSemanticTokenTypeLabelDefaultXLarge() throws { - XCTAssertNotEqual(inheritedTheme.typeLabelDefaultXLarge, abstractTheme.typeLabelDefaultXLarge) - XCTAssertTrue(inheritedTheme.typeLabelDefaultXLarge == MockTheme.mockThemeMultipleTypographyTokens) - } - - func testInheritedThemeCanOverrideSemanticTokenTypeLabelDefaultLarge() throws { - XCTAssertNotEqual(inheritedTheme.typeLabelDefaultLarge, abstractTheme.typeLabelDefaultLarge) - XCTAssertTrue(inheritedTheme.typeLabelDefaultLarge == MockTheme.mockThemeMultipleTypographyTokens) - } - - func testInheritedThemeCanOverrideSemanticTokenTypeLabelDefaultMedium() throws { - XCTAssertNotEqual(inheritedTheme.typeLabelDefaultMedium, abstractTheme.typeLabelDefaultMedium) - XCTAssertTrue(inheritedTheme.typeLabelDefaultMedium == MockTheme.mockThemeMultipleTypographyTokens) - } - - func testInheritedThemeCanOverrideSemanticTokenTypeLabelDefaultSmall() throws { - XCTAssertNotEqual(inheritedTheme.typeLabelDefaultSmall, abstractTheme.typeLabelDefaultSmall) - XCTAssertTrue(inheritedTheme.typeLabelDefaultSmall == MockTheme.mockThemeMultipleTypographyTokens) - } - - func testInheritedThemeCanOverrideSemanticTokenTypeLabelStrongXLarge() throws { - XCTAssertNotEqual(inheritedTheme.typeLabelStrongXLarge, abstractTheme.typeLabelStrongXLarge) - XCTAssertTrue(inheritedTheme.typeLabelStrongXLarge == MockTheme.mockThemeMultipleTypographyTokens) - } - - func testInheritedThemeCanOverrideSemanticTokenTypeLabelStrongLarge() throws { - XCTAssertNotEqual(inheritedTheme.typeLabelStrongLarge, abstractTheme.typeLabelStrongLarge) - XCTAssertTrue(inheritedTheme.typeLabelStrongLarge == MockTheme.mockThemeMultipleTypographyTokens) - } - - func testInheritedThemeCanOverrideSemanticTokenTypeLabelStrongMedium() throws { - XCTAssertNotEqual(inheritedTheme.typeLabelStrongMedium, abstractTheme.typeLabelStrongMedium) - XCTAssertTrue(inheritedTheme.typeLabelStrongMedium == MockTheme.mockThemeMultipleTypographyTokens) - } - - func testInheritedThemeCanOverrideSemanticTokenTypeLabelStrongSmall() throws { - XCTAssertNotEqual(inheritedTheme.typeLabelStrongSmall, abstractTheme.typeLabelStrongSmall) - XCTAssertTrue(inheritedTheme.typeLabelStrongSmall == MockTheme.mockThemeMultipleTypographyTokens) - } - - // MARK: - Semantic tokens - Typography - Composites - Code - - func testInheritedThemeCanOverrideSemanticTokenTypeCodeMedium() throws { - XCTAssertNotEqual(inheritedTheme.typeCodeMedium, abstractTheme.typeCodeMedium) - XCTAssertTrue(inheritedTheme.typeCodeMedium == MockTheme.mockThemeMultipleTypographyTokens) - } - - func testInheritedThemeCanOverrideSemanticTokenTypeCodeSmall() throws { - XCTAssertNotEqual(inheritedTheme.typeCodeSmall, abstractTheme.typeCodeSmall) - XCTAssertTrue(inheritedTheme.typeCodeSmall == MockTheme.mockThemeMultipleTypographyTokens) - } } // swiftlint:enable required_deinit diff --git a/OUDS/Core/Themes/Inverse/Sources/InverseTheme+ColorSemanticTokens.swift b/OUDS/Core/Themes/Inverse/Sources/InverseTheme+ColorSemanticTokens.swift index ae6cf4e2e..3b45e3345 100644 --- a/OUDS/Core/Themes/Inverse/Sources/InverseTheme+ColorSemanticTokens.swift +++ b/OUDS/Core/Themes/Inverse/Sources/InverseTheme+ColorSemanticTokens.swift @@ -29,53 +29,53 @@ extension InverseTheme { // MARK: Semantic token - Colors - Background - override public var colorBackgroundPrimary: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalDarkGray880) } + override public var colorBgPrimary: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalDarkGray880) } - override public var colorBackgroundSecondary: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalDarkGray720) } + override public var colorBgSecondary: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalDarkGray720) } - override public var colorBackgroundTertiary: ColorSemanticToken { MultipleColorTokens(OrangeBrandColorRawTokens.colorWarmGray900) } + override public var colorBgTertiary: ColorSemanticToken { MultipleColorTokens(OrangeBrandColorRawTokens.colorWarmGray900) } - override public var colorBackgroundEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalWhite) } + override public var colorBgEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalWhite) } - override public var colorBackgroundBrandPrimary: ColorSemanticToken { MultipleColorTokens(OrangeBrandColorRawTokens.colorOrange500) } + override public var colorBgBrandPrimary: ColorSemanticToken { MultipleColorTokens(OrangeBrandColorRawTokens.colorOrange500) } - override public var colorBackgroundBrandSecondary: ColorSemanticToken { fatalError("🤖 No value defined for colorBackgroundBrandSecondary!") } + override public var colorBgBrandSecondary: ColorSemanticToken { fatalError("🤖 No value defined for colorBgBrandSecondary!") } - override public var colorBackgroundBrandTertiary: ColorSemanticToken { fatalError("🤖 No value defined for colorBackgroundBrandTertiary!") } + override public var colorBgBrandTertiary: ColorSemanticToken { fatalError("🤖 No value defined for colorBgBrandTertiary!") } - override public var colorBackgroundStatusNeutral: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalDarkGray720) } + override public var colorBgStatusNeutral: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalDarkGray720) } - override public var colorBackgroundStatusNeutralOnBgEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalLightGray80) } + override public var colorBgStatusNeutralOnBgEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalLightGray80) } - override public var colorBackgroundStatusPositiveMuted: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalMalachite100) } + override public var colorBgStatusPositiveMuted: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalMalachite100) } - override public var colorBackgroundStatusPositiveMutedOnBgEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalMalachite100) } + override public var colorBgStatusPositiveMutedOnBgEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalMalachite100) } - override public var colorBackgroundStatusPositiveEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalMalachite500) } + override public var colorBgStatusPositiveEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalMalachite500) } - override public var colorBackgroundStatusInfoMuted: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalDodgerBlue900) } + override public var colorBgStatusInfoMuted: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalDodgerBlue900) } - override public var colorBackgroundStatusInfoMutedOnBgEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalDodgerBlue100) } + override public var colorBgStatusInfoMutedOnBgEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalDodgerBlue100) } - override public var colorBackgroundStatusInfoEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalDodgerBlue500) } + override public var colorBgStatusInfoEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalDodgerBlue500) } - override public var colorBackgroundStatusWarningMuted: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalSun900) } + override public var colorBgStatusWarningMuted: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalSun900) } - override public var colorBackgroundStatusWarningMutedOnBgEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalSun100) } + override public var colorBgStatusWarningMutedOnBgEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalSun100) } - override public var colorBackgroundStatusWarningEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalSun500) } + override public var colorBgStatusWarningEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalSun500) } - override public var colorBackgroundStatusNegativeMuted: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalScarlet900) } + override public var colorBgStatusNegativeMuted: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalScarlet900) } - override public var colorBackgroundStatusNegativeMutedOnBgEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalScarlet100) } + override public var colorBgStatusNegativeMutedOnBgEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalScarlet100) } - override public var colorBackgroundStatusNegativeEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalScarlet600) } + override public var colorBgStatusNegativeEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalScarlet600) } - override public var colorBackgroundStatusAccentMuted: ColorSemanticToken { MultipleColorTokens(OrangeBrandColorRawTokens.colorWarmGray900) } + override public var colorBgStatusAccentMuted: ColorSemanticToken { MultipleColorTokens(OrangeBrandColorRawTokens.colorWarmGray900) } - override public var colorBackgroundStatusAccentMutedOnBgEmphasized: ColorSemanticToken { MultipleColorTokens(OrangeBrandColorRawTokens.colorWarmGray100) } + override public var colorBgStatusAccentMutedOnBgEmphasized: ColorSemanticToken { MultipleColorTokens(OrangeBrandColorRawTokens.colorWarmGray100) } - override public var colorBackgroundStatusAccentEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalSun500) } + override public var colorBgStatusAccentEmphasized: ColorSemanticToken { MultipleColorTokens(ColorRawTokens.colorFunctionalSun500) } // MARK: Semantic token - Colors - Content diff --git a/OUDS/Core/Themes/Inverse/Tests/TestInverseThemeColors.swift b/OUDS/Core/Themes/Inverse/Tests/TestInverseThemeColors.swift index 8f7785180..da6af6c98 100644 --- a/OUDS/Core/Themes/Inverse/Tests/TestInverseThemeColors.swift +++ b/OUDS/Core/Themes/Inverse/Tests/TestInverseThemeColors.swift @@ -40,101 +40,101 @@ final class TestInverseThemeColors: XCTestCase { // MARK: Semantic token - Colors - Background func testColorsHomogeneityColorBackgroundPrimary() throws { - assertHomogeneity(inverseTheme.colorBackgroundPrimary) + assertHomogeneity(inverseTheme.colorBgPrimary) } func testColorsHomogeneityColorBackgroundSecondary() throws { - assertHomogeneity(inverseTheme.colorBackgroundSecondary) + assertHomogeneity(inverseTheme.colorBgSecondary) } func testColorsHomogeneityColorBackgroundTertiary() throws { - assertHomogeneity(inverseTheme.colorBackgroundTertiary) + assertHomogeneity(inverseTheme.colorBgTertiary) } func testColorsHomogeneityColorBackgroundEmphasized() throws { - assertHomogeneity(inverseTheme.colorBackgroundEmphasized) + assertHomogeneity(inverseTheme.colorBgEmphasized) } func testColorsHomogeneityColorBackgroundBrandPrimary() throws { - assertHomogeneity(inverseTheme.colorBackgroundBrandPrimary) + assertHomogeneity(inverseTheme.colorBgBrandPrimary) } // In InverseTheme token not implemented yet -// func testColorsHomogeneityColorBackgroundBrandSecondary() throws { -// assertHomogeneity(inverseTheme.colorBackgroundBrandSecondary) +// func testColorsHomogeneityColorBgBrandSecondary() throws { +// assertHomogeneity(inverseTheme.colorBgBrandSecondary) // } // In InverseTheme token not implemented yet -// func testColorsHomogeneityColorBackgroundBrandTertiary() throws { -// assertHomogeneity(inverseTheme.colorBackgroundBrandTertiary) +// func testColorsHomogeneityColorBgBrandTertiary() throws { +// assertHomogeneity(inverseTheme.colorBgBrandTertiary) // } func testColorsHomogeneityColorBackgroundStatusNeutral() throws { - assertHomogeneity(inverseTheme.colorBackgroundStatusNeutral) + assertHomogeneity(inverseTheme.colorBgStatusNeutral) } func testColorsHomogeneityColorBackgroundStatusNeutralOnBgEmphasized() throws { - assertHomogeneity(inverseTheme.colorBackgroundStatusNeutralOnBgEmphasized) + assertHomogeneity(inverseTheme.colorBgStatusNeutralOnBgEmphasized) } func testColorsHomogeneityColorBackgroundStatusPositiveMuted() throws { - assertHomogeneity(inverseTheme.colorBackgroundStatusPositiveMuted) + assertHomogeneity(inverseTheme.colorBgStatusPositiveMuted) } func testColorsHomogeneityColorBackgroundStatusPositiveMutedOnBgEmphasized() throws { - assertHomogeneity(inverseTheme.colorBackgroundStatusPositiveMutedOnBgEmphasized) + assertHomogeneity(inverseTheme.colorBgStatusPositiveMutedOnBgEmphasized) } func testColorsHomogeneityColorBackgroundStatusPositiveEmphasized() throws { - assertHomogeneity(inverseTheme.colorBackgroundStatusPositiveEmphasized) + assertHomogeneity(inverseTheme.colorBgStatusPositiveEmphasized) } func testColorsHomogeneityColorBackgroundStatusInfoMuted() throws { - assertHomogeneity(inverseTheme.colorBackgroundStatusInfoMuted) + assertHomogeneity(inverseTheme.colorBgStatusInfoMuted) } func testColorsHomogeneityColorBackgroundStatusInfoMutedOnBgEmphasized() throws { - assertHomogeneity(inverseTheme.colorBackgroundStatusInfoMutedOnBgEmphasized) + assertHomogeneity(inverseTheme.colorBgStatusInfoMutedOnBgEmphasized) } func testColorsHomogeneityColorBackgroundStatusInfoEmphasized() throws { - assertHomogeneity(inverseTheme.colorBackgroundStatusInfoEmphasized) + assertHomogeneity(inverseTheme.colorBgStatusInfoEmphasized) } func testColorsHomogeneityColorBackgroundStatusWarningMuted() throws { - assertHomogeneity(inverseTheme.colorBackgroundStatusWarningMuted) + assertHomogeneity(inverseTheme.colorBgStatusWarningMuted) } func testColorsHomogeneityColorBackgroundStatusWarningMutedOnBgEmphasized() throws { - assertHomogeneity(inverseTheme.colorBackgroundStatusWarningMutedOnBgEmphasized) + assertHomogeneity(inverseTheme.colorBgStatusWarningMutedOnBgEmphasized) } func testColorsHomogeneityColorBackgroundStatusWarningEmphasized() throws { - assertHomogeneity(inverseTheme.colorBackgroundStatusWarningEmphasized) + assertHomogeneity(inverseTheme.colorBgStatusWarningEmphasized) } func testColorsHomogeneityColorBackgroundStatusNegativeMuted() throws { - assertHomogeneity(inverseTheme.colorBackgroundStatusNegativeMuted) + assertHomogeneity(inverseTheme.colorBgStatusNegativeMuted) } func testColorsHomogeneityColorBackgroundStatusNegativeMutedOnBgEmphasized() throws { - assertHomogeneity(inverseTheme.colorBackgroundStatusNegativeMutedOnBgEmphasized) + assertHomogeneity(inverseTheme.colorBgStatusNegativeMutedOnBgEmphasized) } func testColorsHomogeneityColorBackgroundStatusNegativeEmphasized() throws { - assertHomogeneity(inverseTheme.colorBackgroundStatusNegativeEmphasized) + assertHomogeneity(inverseTheme.colorBgStatusNegativeEmphasized) } func testColorsHomogeneityColorBackgroundStatusAccentMuted() throws { - assertHomogeneity(inverseTheme.colorBackgroundStatusAccentMuted) + assertHomogeneity(inverseTheme.colorBgStatusAccentMuted) } func testColorsHomogeneityColorBackgroundStatusAccentMutedOnBgEmphasized() throws { - assertHomogeneity(inverseTheme.colorBackgroundStatusAccentMutedOnBgEmphasized) + assertHomogeneity(inverseTheme.colorBgStatusAccentMutedOnBgEmphasized) } func testColorsHomogeneityColorBackgroundStatusAccentEmphasized() throws { - assertHomogeneity(inverseTheme.colorBackgroundStatusAccentEmphasized) + assertHomogeneity(inverseTheme.colorBgStatusAccentEmphasized) } // MARK: Semantic token - Colors - Content - Status diff --git a/OUDS/Core/Themes/Orange/Sources/OrangeTheme+SemanticColorTokens.swift b/OUDS/Core/Themes/Orange/Sources/OrangeTheme+SemanticColorTokens.swift index a655e3f3f..697a3c4b6 100644 --- a/OUDS/Core/Themes/Orange/Sources/OrangeTheme+SemanticColorTokens.swift +++ b/OUDS/Core/Themes/Orange/Sources/OrangeTheme+SemanticColorTokens.swift @@ -25,16 +25,16 @@ extension OrangeTheme { // MARK: Semantic token - Colors - Background // NOTE: Defined here because use values available only in this Orange theme, open for InverseTheme overriding - override open var colorBackgroundTertiary: ColorSemanticToken { MultipleColorTokens(light: OrangeBrandColorRawTokens.colorWarmGray100, dark: OrangeBrandColorRawTokens.colorWarmGray900) } + override open var colorBgTertiary: ColorSemanticToken { MultipleColorTokens(light: OrangeBrandColorRawTokens.colorWarmGray100, dark: OrangeBrandColorRawTokens.colorWarmGray900) } // NOTE: Defined here because use values available only in this Orange theme, open for InverseTheme overriding - override open var colorBackgroundBrandPrimary: ColorSemanticToken { MultipleColorTokens(light: OrangeBrandColorRawTokens.colorOrange550, dark: OrangeBrandColorRawTokens.colorOrange500) } + override open var colorBgBrandPrimary: ColorSemanticToken { MultipleColorTokens(light: OrangeBrandColorRawTokens.colorOrange550, dark: OrangeBrandColorRawTokens.colorOrange500) } // NOTE: Defined here because use values available only in this Orange theme, open for InverseTheme overriding - override open var colorBackgroundStatusAccentMuted: ColorSemanticToken { MultipleColorTokens(light: OrangeBrandColorRawTokens.colorWarmGray100, dark: OrangeBrandColorRawTokens.colorWarmGray900) } + override open var colorBgStatusAccentMuted: ColorSemanticToken { MultipleColorTokens(light: OrangeBrandColorRawTokens.colorWarmGray100, dark: OrangeBrandColorRawTokens.colorWarmGray900) } // NOTE: Defined here because use values available only in this Orange theme, open for InverseTheme overriding - override open var colorBackgroundStatusAccentMutedOnBgEmphasized: ColorSemanticToken { MultipleColorTokens(OrangeBrandColorRawTokens.colorWarmGray900) } + override open var colorBgStatusAccentMutedOnBgEmphasized: ColorSemanticToken { MultipleColorTokens(OrangeBrandColorRawTokens.colorWarmGray900) } // MARK: Semantic token - Colors - Content diff --git a/OUDS/Core/Tokens/ComponentTokens/Sources/_OUDSTokensComponent.docc/OUDSTokensComponent.md b/OUDS/Core/Tokens/ComponentTokens/Sources/_OUDSTokensComponent.docc/OUDSTokensComponent.md index 51feb7d04..cd334cacb 100644 --- a/OUDS/Core/Tokens/ComponentTokens/Sources/_OUDSTokensComponent.docc/OUDSTokensComponent.md +++ b/OUDS/Core/Tokens/ComponentTokens/Sources/_OUDSTokensComponent.docc/OUDSTokensComponent.md @@ -7,65 +7,9 @@ These _tokens_ can be used to apply some style and configuration values to _comp Thus if a component need to change for example its _background color_, and if a _component token_ is used for it, then only the value of this _token_ should be changed without any modification on the _component_ definition. _Components_ use _component tokens_ exposed through the _theme_ to get their style values. -Example with a fake component named `FormsTextInputComponent` using component tokens in `FormsTextInputComponentTokens`: +We don't have any *component token* implemented yet. -```swift -// Declare component tokens -public protocol FormsTextInputComponentTokens { - var ftiTitleFontWeight: TypographyFontWeightSemanticToken { get } - var ftiTitleFontSize: TypographyFontSizeSemanticToken { get } - var ftiTitleColor: ColorSemanticToken { get } - - var ftiBorderColor: ColorSemanticToken { get } - var ftiBorderStyle: BorderStyleSemanticToken { get } - var ftiBorderWidth: BorderWidthSemanticToken { get } -} - -// Define the component tokens -extension OUDSTheme: FormsTextInputComponentTokens { - private static let defaultBlack: ColorSemanticToken = ColorRawTokens.colorFunctionalBlack - private static let defaultWhite: ColorSemanticToken = ColorRawTokens.colorFunctionalWhite - - @objc open var ftiTitleFontWeight: TypographyFontWeightSemanticToken { fontWeightHeading } - @objc open var ftiTitleFontSize: TypographyFontSizeSemanticToken { fontSizeLabelLarge } - @objc open var ftiTitleColor: ColorSemanticToken { colorContentBrandPrimaryLight ?? Self.defaultBlack } - - @objc open var ftiBorderColor: ColorSemanticToken { colorBorderEmphasizedLight ?? Self.defaultBlack } - @objc open var ftiBorderStyle: BorderStyleSemanticToken { borderStyleDefault } - @objc open var ftiBorderWidth: BorderWidthSemanticToken { borderWidthThin } -} - -// In the implementation of the component, the theme will be retrieved to get these component tokens -// The View - -struct OUDSFormsTextInput: View { - - // ... - @Environment(\.theme) var theme - - public var body: some View { - VStack(spacing: theme.spacePaddingBlockComponentTall) { - Label( - title: { - Text("Example of OUDSFormsTextInput") - .fontWeight(theme.ftiTitleFontWeight.fontWeight) - .font(.system(size: theme.ftiTitleFontSize)) - .foregroundColor(theme.ftiTitleColor.color) - }, - icon: { /*@START_MENU_TOKEN@*/Image(systemName: "42.circle")/*@END_MENU_TOKEN@*/ } - ) - Text("Write bellow some awesome text!") - .fontWeight(theme.ftiSubtitleFontWeight.fontWeight) - .font(.system(size: theme.ftiSubtitleFontSize)) - .foregroundColor(theme.ftiSubtitleColor.color) - TextField(placeholder, text: $value) - } - .padding(theme.spacePaddingBlockComponentTall) - .background(theme.ftiBorderColor.color(for: colorScheme)) - .border(theme.ftiBorderColor.color(for: colorScheme), width: theme.ftiBorderWidth) - } -} -``` +❗**More details coming soon.**❗ ## Topics diff --git a/OUDS/Core/Tokens/RawTokens/Sources/Values/ElevationRawTokens+Composites.swift b/OUDS/Core/Tokens/RawTokens/Sources/Values/ElevationRawTokens+Composites.swift index c0f40368b..63db830b0 100644 --- a/OUDS/Core/Tokens/RawTokens/Sources/Values/ElevationRawTokens+Composites.swift +++ b/OUDS/Core/Tokens/RawTokens/Sources/Values/ElevationRawTokens+Composites.swift @@ -12,11 +12,13 @@ // // ଘ( ・ω・)_/゚・:*:・。☆ -// [File to generate with the tokenator] +// [File to generate with the tokenator with Figma able to output composites and tokenatoer able to manage them] +// WARNING: Not synchronized anymore with the Figjam / Figma by developers team +// Create an issue for update https://github.com/Orange-OpenSource/ouds-ios/issues/new?template=token_update.yml // swiftlint:disable missing_docs -/// Extracted in a separated file because the the *Figma* JSON to Swift parser is not abale to process such composite tokens, and the *Figma* tool is not able to. +/// Extracted in a separated file because the *Figma* JSON to Swift, i.e. the *tokenator* parser is not able to process such composite tokens, and the *Figma* tool is not able to. /// /// **Beware, may result in desynchronization between generated raw tokens values and theses composite raw tokens** extension ElevationRawTokens { diff --git a/OUDS/Core/Tokens/RawTokens/Sources/Values/GridRawTokens+Values.swift b/OUDS/Core/Tokens/RawTokens/Sources/Values/GridRawTokens+Values.swift index b919ae8cc..874f3aa4e 100644 --- a/OUDS/Core/Tokens/RawTokens/Sources/Values/GridRawTokens+Values.swift +++ b/OUDS/Core/Tokens/RawTokens/Sources/Values/GridRawTokens+Values.swift @@ -13,6 +13,8 @@ // ଘ( ・ω・)_/゚・:*:・。☆ // [File to generate with the tokenator] +// WARNING: Not synchronized anymore with the Figjam / Figma by developers team +// Create an issue for update https://github.com/Orange-OpenSource/ouds-ios/issues/new?template=token_update.yml // swiftlint:disable missing_docs diff --git a/OUDS/Core/Tokens/RawTokens/Sources/Values/TypographyRawTokens+Composites.swift b/OUDS/Core/Tokens/RawTokens/Sources/Values/TypographyRawTokens+Composites.swift index 639b13d0c..734a9e74b 100644 --- a/OUDS/Core/Tokens/RawTokens/Sources/Values/TypographyRawTokens+Composites.swift +++ b/OUDS/Core/Tokens/RawTokens/Sources/Values/TypographyRawTokens+Composites.swift @@ -12,11 +12,13 @@ // // ଘ( ・ω・)_/゚・:*:・。☆ -// [File to generate with the tokenator] +// [File to generate with the tokenator with Figma able to output composites and tokenatoer able to manage them] +// WARNING: Not synchronized anymore with the Figjam / Figma by developers team +// Create an issue for update https://github.com/Orange-OpenSource/ouds-ios/issues/new?template=token_update.yml // swiftlint:disable missing_docs -/// Extracted in a separated file because the the *Figma* JSON to Swift parser is not abale to process such composite tokens, and the *Figma* tool is not able to. +/// Extracted in a separated file because the *Figma* JSON to Swift, i.e. the *tokenator* parser is not able to process such composite tokens, and the *Figma* tool is not able to. /// /// **Beware, may result in desynchronization between generated raw tokens values and theses composite raw tokens** extension TypographyRawTokens { diff --git a/OUDS/Core/Tokens/RawTokens/Sources/Values/TypographyRawTokens+Values.swift b/OUDS/Core/Tokens/RawTokens/Sources/Values/TypographyRawTokens+Values.swift index 1fe502f8e..5c9d7a8e5 100644 --- a/OUDS/Core/Tokens/RawTokens/Sources/Values/TypographyRawTokens+Values.swift +++ b/OUDS/Core/Tokens/RawTokens/Sources/Values/TypographyRawTokens+Values.swift @@ -13,6 +13,7 @@ // ଘ( ・ω・)_/゚・:*:・。☆ // [File to generate with the tokenator] +// WARNING: Not synchronized anymore with the Figjam / Figma by developers team // swiftlint:disable missing_docs diff --git a/OUDS/Core/Tokens/SemanticTokens/Sources/Multiples/MultipleSizeTokens.swift b/OUDS/Core/Tokens/SemanticTokens/Sources/Multiples/MultipleSizeTokens.swift index 6c38b3b9b..06dd0a043 100644 --- a/OUDS/Core/Tokens/SemanticTokens/Sources/Multiples/MultipleSizeTokens.swift +++ b/OUDS/Core/Tokens/SemanticTokens/Sources/Multiples/MultipleSizeTokens.swift @@ -43,7 +43,7 @@ public final class MultipleSizeTokens: NSObject, Sendable { deinit { } /// Returns `true` if `self` and `object` has the same `compact` and `regular` values and with `object` - /// as a `MultipleSizingTokens`. Otherwise returns `false`. + /// as a `MultipleSizeTokens`. Otherwise returns `false`. /// `isEqual` override is preferred for `NSObject`. override public func isEqual(_ object: Any?) -> Bool { guard let other = object as? MultipleSizeTokens else { diff --git a/OUDS/Core/Tokens/SemanticTokens/Sources/Multiples/MultipleSpaceTokens.swift b/OUDS/Core/Tokens/SemanticTokens/Sources/Multiples/MultipleSpaceTokens.swift index 2d67275b0..457ebbaa2 100644 --- a/OUDS/Core/Tokens/SemanticTokens/Sources/Multiples/MultipleSpaceTokens.swift +++ b/OUDS/Core/Tokens/SemanticTokens/Sources/Multiples/MultipleSpaceTokens.swift @@ -38,7 +38,7 @@ public final class MultipleSpaceTokens: NSObject, Sendable { deinit { } /// Returns `true` if `self` and `object` has the same `compact` and `regular` values and with `object` - /// as a `MultipleSpacingTokens`. Otherwise returns `false`. + /// as a `MultipleSpaceTokens`. Otherwise returns `false`. /// `isEqual` override is preferred for `NSObject`. override public func isEqual(_ object: Any?) -> Bool { guard let other = object as? MultipleSpaceTokens else { return false } diff --git a/OUDS/Core/Tokens/SemanticTokens/Sources/TypeAliases/ColorSemanticTokens+Aliases.swift b/OUDS/Core/Tokens/SemanticTokens/Sources/TypeAliases/ColorSemanticTokens+Aliases.swift index 1f445e90d..cb269c21e 100644 --- a/OUDS/Core/Tokens/SemanticTokens/Sources/TypeAliases/ColorSemanticTokens+Aliases.swift +++ b/OUDS/Core/Tokens/SemanticTokens/Sources/TypeAliases/ColorSemanticTokens+Aliases.swift @@ -11,7 +11,5 @@ // Software description: A SwiftUI components library with code examples for Orange Unified Design System // -import OUDSTokensRaw - -/// Basically a semantic color token, which can be either a functional or a decorative token, is a `String`, to keep grammar clean and clear with design system grammar. +/// Basically a color semantic token is a paire of `ColorRawToken` to use for light or dark color scheme, packed in a `MultipleColorTokens` object public typealias ColorSemanticToken = MultipleColorTokens diff --git a/OUDS/Core/Tokens/SemanticTokens/Sources/TypeAliases/ElevationSemanticTokens+Aliases.swift b/OUDS/Core/Tokens/SemanticTokens/Sources/TypeAliases/ElevationSemanticTokens+Aliases.swift index 9b6130329..eee9c6455 100644 --- a/OUDS/Core/Tokens/SemanticTokens/Sources/TypeAliases/ElevationSemanticTokens+Aliases.swift +++ b/OUDS/Core/Tokens/SemanticTokens/Sources/TypeAliases/ElevationSemanticTokens+Aliases.swift @@ -22,8 +22,10 @@ public typealias ElevationYSemanticToken = ElevationRawToken /// Basically an elevation semantic token for blur effect is a raw token for elevation, with the same final type, to keep grammar clean and clear with design system grammar. public typealias ElevationBlurSemanticToken = ElevationRawToken -/// Basically an elevation semantic token for shadow colors is a raw token for colors, to keep grammar clean and clear with design system grammar. +/// Basically an elevation color semantic token, used mainly for shadow colors, is a pair of color raw tokens. +/// A `MultipleColorTokens` contains `ColorRawToken` for light and dark modes. public typealias ElevationColorSemanticToken = MultipleColorTokens -/// Basically an elevation semantic token for box shadow is a raw token for box shadow, with the same final type, to keep grammar clean and clear with design system grammar. +/// Basically an elevationcomposite semantic token, used mainly for box shadow, is a pair of elevation composite raw tokens used depending to the color scheme. +/// A `MultipleElevationTokens` contains `ElevationCompositeRawToken` objects for light and dark modes, which contains `ElevationRawToken` and `ColorRawToken` values. public typealias ElevationCompositeSemanticToken = MultipleElevationTokens diff --git a/OUDS/Core/Tokens/SemanticTokens/Sources/TypeAliases/GridSemanticTokens+Aliases.swift b/OUDS/Core/Tokens/SemanticTokens/Sources/TypeAliases/GridSemanticTokens+Aliases.swift index 045ecb7ec..7412db3a1 100644 --- a/OUDS/Core/Tokens/SemanticTokens/Sources/TypeAliases/GridSemanticTokens+Aliases.swift +++ b/OUDS/Core/Tokens/SemanticTokens/Sources/TypeAliases/GridSemanticTokens+Aliases.swift @@ -19,5 +19,5 @@ public typealias GridExtraCompactSemanticToken = GridRawToken /// Basically a grid semantic token for iOS Compact values is a grid raw token, to keep grammar clean and clear with design system grammar. public typealias GridCompactSemanticToken = GridRawToken -/// Basically a grid semantic token for iOS Regulard values is a grid raw token, to keep grammar clean and clear with design system grammar. +/// Basically a grid semantic token for iOS Regular values is a grid raw token, to keep grammar clean and clear with design system grammar. public typealias GridRegularSemanticToken = GridRawToken diff --git a/OUDS/Core/Tokens/SemanticTokens/Sources/TypeAliases/SizingSemanticTokens+Aliases.swift b/OUDS/Core/Tokens/SemanticTokens/Sources/TypeAliases/SizingSemanticTokens+Aliases.swift index d84fc1dc3..371fc50cd 100644 --- a/OUDS/Core/Tokens/SemanticTokens/Sources/TypeAliases/SizingSemanticTokens+Aliases.swift +++ b/OUDS/Core/Tokens/SemanticTokens/Sources/TypeAliases/SizingSemanticTokens+Aliases.swift @@ -13,5 +13,6 @@ import OUDSTokensRaw -/// Basically a size semantic token for width and height is a dimension raw token, it has the same final type, to keep grammar clean and clear with design system grammar. +/// Basically a size semantic token, used for width and height values, is a dimension raw token, +/// it has the same final type, to keep grammar clean and clear with design system grammar. public typealias SizeSemanticToken = DimensionRawToken diff --git a/OUDS/Core/Tokens/SemanticTokens/Sources/Values/BorderSemanticTokens.swift b/OUDS/Core/Tokens/SemanticTokens/Sources/Values/BorderSemanticTokens.swift index 502ff61e1..e29a2dfc6 100644 --- a/OUDS/Core/Tokens/SemanticTokens/Sources/Values/BorderSemanticTokens.swift +++ b/OUDS/Core/Tokens/SemanticTokens/Sources/Values/BorderSemanticTokens.swift @@ -13,6 +13,8 @@ // ଘ( ・ω・)_/゚・:*:・。☆ // [File to generate with the tokenator] +// WARNING: Not synchronized anymore with the Figjam / Figma by developers team +// Create an issue for update https://github.com/Orange-OpenSource/ouds-ios/issues/new?template=token_update.yml // swiftlint:disable missing_docs diff --git a/OUDS/Core/Tokens/SemanticTokens/Sources/Values/ColorSemanticTokens.swift b/OUDS/Core/Tokens/SemanticTokens/Sources/Values/ColorSemanticTokens.swift index 54c35ea91..5dd36ffb1 100644 --- a/OUDS/Core/Tokens/SemanticTokens/Sources/Values/ColorSemanticTokens.swift +++ b/OUDS/Core/Tokens/SemanticTokens/Sources/Values/ColorSemanticTokens.swift @@ -13,7 +13,8 @@ // ଘ( ・ω・)_/゚・:*:・。☆ // [File to generate with the tokenator] -// WARNING: Not synchronized anymore with the Figjam +// WARNING: Not synchronized anymore with the Figjam / Figma by developers team +// Create an issue for update https://github.com/Orange-OpenSource/ouds-ios/issues/new?template=token_update.yml // swiftlint:disable missing_docs // swiftlint:disable identifier_name @@ -29,53 +30,53 @@ public protocol ColorSemanticTokens { // MARK: Semantic token - Colors - Background - var colorBackgroundPrimary: ColorSemanticToken { get } + var colorBgPrimary: ColorSemanticToken { get } - var colorBackgroundSecondary: ColorSemanticToken { get } + var colorBgSecondary: ColorSemanticToken { get } - var colorBackgroundTertiary: ColorSemanticToken { get } + var colorBgTertiary: ColorSemanticToken { get } - var colorBackgroundEmphasized: ColorSemanticToken { get } + var colorBgEmphasized: ColorSemanticToken { get } - var colorBackgroundBrandPrimary: ColorSemanticToken { get } + var colorBgBrandPrimary: ColorSemanticToken { get } - var colorBackgroundBrandSecondary: ColorSemanticToken { get } + var colorBgBrandSecondary: ColorSemanticToken { get } - var colorBackgroundBrandTertiary: ColorSemanticToken { get } + var colorBgBrandTertiary: ColorSemanticToken { get } - var colorBackgroundStatusNeutral: ColorSemanticToken { get } + var colorBgStatusNeutral: ColorSemanticToken { get } - var colorBackgroundStatusNeutralOnBgEmphasized: ColorSemanticToken { get } + var colorBgStatusNeutralOnBgEmphasized: ColorSemanticToken { get } - var colorBackgroundStatusPositiveMuted: ColorSemanticToken { get } + var colorBgStatusPositiveMuted: ColorSemanticToken { get } - var colorBackgroundStatusPositiveMutedOnBgEmphasized: ColorSemanticToken { get } + var colorBgStatusPositiveMutedOnBgEmphasized: ColorSemanticToken { get } - var colorBackgroundStatusPositiveEmphasized: ColorSemanticToken { get } + var colorBgStatusPositiveEmphasized: ColorSemanticToken { get } - var colorBackgroundStatusInfoMuted: ColorSemanticToken { get } + var colorBgStatusInfoMuted: ColorSemanticToken { get } - var colorBackgroundStatusInfoMutedOnBgEmphasized: ColorSemanticToken { get } + var colorBgStatusInfoMutedOnBgEmphasized: ColorSemanticToken { get } - var colorBackgroundStatusInfoEmphasized: ColorSemanticToken { get } + var colorBgStatusInfoEmphasized: ColorSemanticToken { get } - var colorBackgroundStatusWarningMuted: ColorSemanticToken { get } + var colorBgStatusWarningMuted: ColorSemanticToken { get } - var colorBackgroundStatusWarningMutedOnBgEmphasized: ColorSemanticToken { get } + var colorBgStatusWarningMutedOnBgEmphasized: ColorSemanticToken { get } - var colorBackgroundStatusWarningEmphasized: ColorSemanticToken { get } + var colorBgStatusWarningEmphasized: ColorSemanticToken { get } - var colorBackgroundStatusNegativeMuted: ColorSemanticToken { get } + var colorBgStatusNegativeMuted: ColorSemanticToken { get } - var colorBackgroundStatusNegativeMutedOnBgEmphasized: ColorSemanticToken { get } + var colorBgStatusNegativeMutedOnBgEmphasized: ColorSemanticToken { get } - var colorBackgroundStatusNegativeEmphasized: ColorSemanticToken { get } + var colorBgStatusNegativeEmphasized: ColorSemanticToken { get } - var colorBackgroundStatusAccentMuted: ColorSemanticToken { get } + var colorBgStatusAccentMuted: ColorSemanticToken { get } - var colorBackgroundStatusAccentMutedOnBgEmphasized: ColorSemanticToken { get } + var colorBgStatusAccentMutedOnBgEmphasized: ColorSemanticToken { get } - var colorBackgroundStatusAccentEmphasized: ColorSemanticToken { get } + var colorBgStatusAccentEmphasized: ColorSemanticToken { get } // MARK: Semantic token - Colors - Content - Status diff --git a/OUDS/Core/Tokens/SemanticTokens/Sources/Values/DimensionSemanticTokens.swift b/OUDS/Core/Tokens/SemanticTokens/Sources/Values/DimensionSemanticTokens.swift index 19b40db79..f52dd3b7d 100644 --- a/OUDS/Core/Tokens/SemanticTokens/Sources/Values/DimensionSemanticTokens.swift +++ b/OUDS/Core/Tokens/SemanticTokens/Sources/Values/DimensionSemanticTokens.swift @@ -13,6 +13,8 @@ // ଘ( ・ω・)_/゚・:*:・。☆ // [File to generate with the tokenator] +// WARNING: Not synchronized anymore with the Figjam / Figma by developers team +// Create an issue for update https://github.com/Orange-OpenSource/ouds-ios/issues/new?template=token_update.yml // swiftlint:disable missing_docs diff --git a/OUDS/Core/Tokens/SemanticTokens/Sources/Values/ElevationCompositeSemanticTokens.swift b/OUDS/Core/Tokens/SemanticTokens/Sources/Values/ElevationCompositeSemanticTokens.swift new file mode 100644 index 000000000..2e8b819d4 --- /dev/null +++ b/OUDS/Core/Tokens/SemanticTokens/Sources/Values/ElevationCompositeSemanticTokens.swift @@ -0,0 +1,42 @@ +// +// Software Name: OUDS iOS +// SPDX-FileCopyrightText: Copyright (c) Orange SA +// SPDX-License-Identifier: MIT +// +// This software is distributed under the MIT license, +// the text of which is available at https://opensource.org/license/MIT/ +// or see the "LICENSE" file for more details. +// +// Authors: See CONTRIBUTORS.txt +// Software description: A SwiftUI components library with code examples for Orange Unified Design System +// + +// swiftlint:disable missing_docs + +// ଘ( ・ω・)_/゚・:*:・。☆ +// [File to generate with the tokenator with Figma able to output composites and tokenatoer able to manage them] +// WARNING: Not synchronized anymore with the Figjam / Figma by developers team +// Create an issue for update https://github.com/Orange-OpenSource/ouds-ios/issues/new?template=token_update.yml + +/// This is a group of semantic tokens for **elevations**, but only **composite tokens**. +/// There are splitted and not declared in `ElevationSemanticTokens` as the *tokenator* tool parsing *Figma* JSON to Swift code is not able to manage them. +/// Thus we need to declare them in another file to prevent them to be erased. +/// +/// It declares in fact box shadows effects. +/// +/// This protocol makes themes able to provide and override `ElevationCompositeSemanticToken`. +/// `ElevationCompositeSemanticToken` refers to `MultipleElevationTokens`, which contains for light and dark color schemes `ElevationCompositeRawToken`. +/// This `ElevationCompositeRawToken` is not managed by tokenator yet as it is composed by three properties. +public protocol ElevationCompositeSemanticTokens { + + var elevationNone: ElevationCompositeSemanticToken { get } + var elevationRaised: ElevationCompositeSemanticToken { get } + var elevationDrag: ElevationCompositeSemanticToken { get } + var elevationOverlayDefault: ElevationCompositeSemanticToken { get } + var elevationOverlayEmphasized: ElevationCompositeSemanticToken { get } + var elevationStickyDefault: ElevationCompositeSemanticToken { get } + var elevationStickyEmphasized: ElevationCompositeSemanticToken { get } + var elevationStickyNavigationScrolled: ElevationCompositeSemanticToken { get } +} + +// swiftlint:enable missing_docs diff --git a/OUDS/Core/Tokens/SemanticTokens/Sources/Values/ElevationSemanticTokens.swift b/OUDS/Core/Tokens/SemanticTokens/Sources/Values/ElevationSemanticTokens.swift index 3a7da714a..eecf095cc 100644 --- a/OUDS/Core/Tokens/SemanticTokens/Sources/Values/ElevationSemanticTokens.swift +++ b/OUDS/Core/Tokens/SemanticTokens/Sources/Values/ElevationSemanticTokens.swift @@ -13,12 +13,17 @@ // ଘ( ・ω・)_/゚・:*:・。☆ // [File to generate with the tokenator] +// WARNING: Not synchronized anymore with the Figjam / Figma by developers team +// Create an issue for update https://github.com/Orange-OpenSource/ouds-ios/issues/new?template=token_update.yml // swiftlint:disable missing_docs /// This is a group of semantic tokens for **elevations**. -/// It defines all elevation semantic tokens a theme must have. (`ElevationXSemanticToken`,`ElevationYSemanticToken`, -/// `ElevationBlurSemanticToken` and `ElevationColorSemanticToken`) +/// It defines all elevation semantic tokens a theme must have (`ElevationXSemanticToken`,`ElevationYSemanticToken`, +/// `ElevationBlurSemanticToken` and `ElevationColorSemanticToken`). +/// +/// However the composite tokens (here for bow shadows) are defined in `ElevationCompositeSemanticTokens` because the *tokenator* +/// is not able to generate them yet, and they must be defined elsewhere to not be deleted. /// /// In the future this file should be generated by a parser converting Figma JSON to Swift code. public protocol ElevationSemanticTokens { @@ -66,17 +71,6 @@ public protocol ElevationSemanticTokens { var elevationColorStickyDefault: ElevationColorSemanticToken { get } var elevationColorStickyEmphasized: ElevationColorSemanticToken { get } var elevationColorStickyNavigationScrolled: ElevationColorSemanticToken { get } - - // MARK: Semantic token - Elevation - Box shadow - - var elevationNone: ElevationCompositeSemanticToken { get } - var elevationRaised: ElevationCompositeSemanticToken { get } - var elevationDrag: ElevationCompositeSemanticToken { get } - var elevationOverlayDefault: ElevationCompositeSemanticToken { get } - var elevationOverlayEmphasized: ElevationCompositeSemanticToken { get } - var elevationStickyDefault: ElevationCompositeSemanticToken { get } - var elevationStickyEmphasized: ElevationCompositeSemanticToken { get } - var elevationStickyNavigationScrolled: ElevationCompositeSemanticToken { get } } // swiftlint:enable missing_docs diff --git a/OUDS/Core/Tokens/SemanticTokens/Sources/Values/GridSemanticTokens.swift b/OUDS/Core/Tokens/SemanticTokens/Sources/Values/GridSemanticTokens.swift index 4cef8af1d..b258b0637 100644 --- a/OUDS/Core/Tokens/SemanticTokens/Sources/Values/GridSemanticTokens.swift +++ b/OUDS/Core/Tokens/SemanticTokens/Sources/Values/GridSemanticTokens.swift @@ -13,6 +13,8 @@ // ଘ( ・ω・)_/゚・:*:・。☆ // [File to generate with the tokenator] +// WARNING: Not synchronized anymore with the Figjam / Figma by developers team +// Create an issue for update https://github.com/Orange-OpenSource/ouds-ios/issues/new?template=token_update.yml // swiftlint:disable missing_docs diff --git a/OUDS/Core/Tokens/SemanticTokens/Sources/Values/OpacitySemanticTokens.swift b/OUDS/Core/Tokens/SemanticTokens/Sources/Values/OpacitySemanticTokens.swift index a4482878f..b30c3a42b 100644 --- a/OUDS/Core/Tokens/SemanticTokens/Sources/Values/OpacitySemanticTokens.swift +++ b/OUDS/Core/Tokens/SemanticTokens/Sources/Values/OpacitySemanticTokens.swift @@ -13,6 +13,8 @@ // ଘ( ・ω・)_/゚・:*:・。☆ // [File to generate with the tokenator] +// WARNING: Not synchronized anymore with the Figjam / Figma by developers team +// Create an issue for update https://github.com/Orange-OpenSource/ouds-ios/issues/new?template=token_update.yml // swiftlint:disable missing_docs diff --git a/OUDS/Core/Tokens/SemanticTokens/Sources/Values/SizeSemanticTokens.swift b/OUDS/Core/Tokens/SemanticTokens/Sources/Values/SizeSemanticTokens.swift index dbd077f9a..68b78bddc 100644 --- a/OUDS/Core/Tokens/SemanticTokens/Sources/Values/SizeSemanticTokens.swift +++ b/OUDS/Core/Tokens/SemanticTokens/Sources/Values/SizeSemanticTokens.swift @@ -13,6 +13,8 @@ // ଘ( ・ω・)_/゚・:*:・。☆ // [File to generate with the tokenator] +// WARNING: Not synchronized anymore with the Figjam / Figma by developers team +// Create an issue for update https://github.com/Orange-OpenSource/ouds-ios/issues/new?template=token_update.yml // swiftlint:disable missing_docs diff --git a/OUDS/Core/Tokens/SemanticTokens/Sources/Values/SpaceSemanticTokens.swift b/OUDS/Core/Tokens/SemanticTokens/Sources/Values/SpaceSemanticTokens.swift index 77f368e5d..8c9c84a03 100644 --- a/OUDS/Core/Tokens/SemanticTokens/Sources/Values/SpaceSemanticTokens.swift +++ b/OUDS/Core/Tokens/SemanticTokens/Sources/Values/SpaceSemanticTokens.swift @@ -13,6 +13,8 @@ // ଘ( ・ω・)_/゚・:*:・。☆ // [File to generate with the tokenator] +// WARNING: Not synchronized anymore with the Figjam / Figma by developers team +// Create an issue for update https://github.com/Orange-OpenSource/ouds-ios/issues/new?template=token_update.yml // swiftlint:disable missing_docs diff --git a/OUDS/Core/Tokens/SemanticTokens/Sources/Values/TypographyCompositeSemanticTokens.swift b/OUDS/Core/Tokens/SemanticTokens/Sources/Values/TypographyCompositeSemanticTokens.swift new file mode 100644 index 000000000..151560955 --- /dev/null +++ b/OUDS/Core/Tokens/SemanticTokens/Sources/Values/TypographyCompositeSemanticTokens.swift @@ -0,0 +1,70 @@ +// +// Software Name: OUDS iOS +// SPDX-FileCopyrightText: Copyright (c) Orange SA +// SPDX-License-Identifier: MIT +// +// This software is distributed under the MIT license, +// the text of which is available at https://opensource.org/license/MIT/ +// or see the "LICENSE" file for more details. +// +// Authors: See CONTRIBUTORS.txt +// Software description: A SwiftUI components library with code examples for Orange Unified Design System +// + +// ଘ( ・ω・)_/゚・:*:・。☆ +// [File to generate with the tokenator with Figma able to output composites and tokenatoer able to manage them] +// WARNING: Not synchronized anymore with the Figjam / Figma by developers team +// Create an issue for update https://github.com/Orange-OpenSource/ouds-ios/issues/new?template=token_update.yml + +// swiftlint:disable missing_docs + +/// This is a group of semantic tokens for **typography**, but only **composite tokens** in the end. +/// There are splitted and not declared in `TypographySemanticTokens` as the *tokenator* tool parsing *Figma* JSON to Swift code is not able to manage them. +/// Thus we need to declare them in another file to prevent them to be erased. +/// +/// It defines all composite typography semantic tokens a theme must have, i.e. tokens including properties for font family, font weight, font size or line height for example. +/// +/// This protocol makes themes able to provide and override `TypographyCompositeRawToken` gathered in `MultipleTypographyTokens` instances +/// This `TypographyCompositeRawToken` is not managed by tokenator yet as it is composed by several properties. +public protocol TypographyCompositeSemanticTokens { + + // MARK: - Semantic tokens - Typography - Composites - Display + + var typeDisplayLarge: MultipleTypographyTokens { get } + var typeDisplayMedium: MultipleTypographyTokens { get } + var typeDisplaySmall: MultipleTypographyTokens { get } + + // MARK: - Semantic tokens - Typography - Composites - Heading + + var typeHeadingXLarge: MultipleTypographyTokens { get } + var typeHeadingLarge: MultipleTypographyTokens { get } + var typeHeadingMedium: MultipleTypographyTokens { get } + var typeHeadingSmall: MultipleTypographyTokens { get } + + // MARK: - Semantic tokens - Typography - Composites - Body + + var typeBodyDefaultLarge: MultipleTypographyTokens { get } + var typeBodyDefaultMedium: MultipleTypographyTokens { get } + var typeBodyDefaultSmall: MultipleTypographyTokens { get } + var typeBodyStrongLarge: MultipleTypographyTokens { get } + var typeBodyStrongMedium: MultipleTypographyTokens { get } + var typeBodyStrongSmall: MultipleTypographyTokens { get } + + // MARK: - Semantic tokens - Typography - Composites - Label + + var typeLabelDefaultXLarge: MultipleTypographyTokens { get } + var typeLabelDefaultLarge: MultipleTypographyTokens { get } + var typeLabelDefaultMedium: MultipleTypographyTokens { get } + var typeLabelDefaultSmall: MultipleTypographyTokens { get } + var typeLabelStrongXLarge: MultipleTypographyTokens { get } + var typeLabelStrongLarge: MultipleTypographyTokens { get } + var typeLabelStrongMedium: MultipleTypographyTokens { get } + var typeLabelStrongSmall: MultipleTypographyTokens { get } + + // MARK: - Semantic tokens - Typography - Composites - Code + + var typeCodeMedium: MultipleTypographyTokens { get } + var typeCodeSmall: MultipleTypographyTokens { get } +} + +// swiftlint:enable missing_docs diff --git a/OUDS/Core/Tokens/SemanticTokens/Sources/Values/TypographySemanticTokens.swift b/OUDS/Core/Tokens/SemanticTokens/Sources/Values/TypographySemanticTokens.swift index e076f72cb..3e4b69f76 100644 --- a/OUDS/Core/Tokens/SemanticTokens/Sources/Values/TypographySemanticTokens.swift +++ b/OUDS/Core/Tokens/SemanticTokens/Sources/Values/TypographySemanticTokens.swift @@ -11,10 +11,10 @@ // Software description: A SwiftUI components library with code examples for Orange Unified Design System // -import OUDSTokensRaw - // ଘ( ・ω・)_/゚・:*:・。☆ // [File to generate with the tokenator] +// WARNING: Not synchronized anymore with the Figjam / Figma by developers team +// Create an issue for update https://github.com/Orange-OpenSource/ouds-ios/issues/new?template=token_update.yml // swiftlint:disable missing_docs @@ -22,12 +22,15 @@ import OUDSTokensRaw /// It defines all typography semantic tokens a theme must have /// (`TypographyFontFamilySemanticToken`, `TypographyFontWeightSemanticToken`, `TypographyFontSizeSemanticToken`, `TypographyFontLineHeightSemanticToken`). /// +/// However the composite tokens (here the ones gathering each type of semantic token here) are defined in `TypographyCompositeSemanticTokens` because the *tokenator* +/// is not able to generate them yet, and they must be defined elsewhere to not be deleted. +/// /// In the future this file should be generated by a parser converting Figma JSON to Swift code. public protocol TypographySemanticTokens { // MARK: - Semantic token - Typography - Font - Family - var fontFamily: TypographyFontFamilyRawToken { get } + var fontFamily: TypographyFontFamilySemanticToken { get } var fontFamilyDisplay: TypographyFontFamilySemanticToken { get } var fontFamilyHeading: TypographyFontFamilySemanticToken { get } var fontFamilyBody: TypographyFontFamilySemanticToken { get } @@ -106,44 +109,6 @@ public protocol TypographySemanticTokens { var fontLetterSpacingLabelSmall: MultipleFontLetterSpacingTokens { get } var fontLetterSpacingCodeMedium: MultipleFontLetterSpacingTokens { get } var fontLetterSpacingCodeSmall: MultipleFontLetterSpacingTokens { get } - - // MARK: - Semantic tokens - Typography - Composites - Display - - var typeDisplayLarge: MultipleTypographyTokens { get } - var typeDisplayMedium: MultipleTypographyTokens { get } - var typeDisplaySmall: MultipleTypographyTokens { get } - - // MARK: - Semantic tokens - Typography - Composites - Heading - - var typeHeadingXLarge: MultipleTypographyTokens { get } - var typeHeadingLarge: MultipleTypographyTokens { get } - var typeHeadingMedium: MultipleTypographyTokens { get } - var typeHeadingSmall: MultipleTypographyTokens { get } - - // MARK: - Semantic tokens - Typography - Composites - Body - - var typeBodyDefaultLarge: MultipleTypographyTokens { get } - var typeBodyDefaultMedium: MultipleTypographyTokens { get } - var typeBodyDefaultSmall: MultipleTypographyTokens { get } - var typeBodyStrongLarge: MultipleTypographyTokens { get } - var typeBodyStrongMedium: MultipleTypographyTokens { get } - var typeBodyStrongSmall: MultipleTypographyTokens { get } - - // MARK: - Semantic tokens - Typography - Composites - Label - - var typeLabelDefaultXLarge: MultipleTypographyTokens { get } - var typeLabelDefaultLarge: MultipleTypographyTokens { get } - var typeLabelDefaultMedium: MultipleTypographyTokens { get } - var typeLabelDefaultSmall: MultipleTypographyTokens { get } - var typeLabelStrongXLarge: MultipleTypographyTokens { get } - var typeLabelStrongLarge: MultipleTypographyTokens { get } - var typeLabelStrongMedium: MultipleTypographyTokens { get } - var typeLabelStrongSmall: MultipleTypographyTokens { get } - - // MARK: - Semantic tokens - Typography - Composites - Code - - var typeCodeMedium: MultipleTypographyTokens { get } - var typeCodeSmall: MultipleTypographyTokens { get } } // swiftlint:enable missing_docs diff --git a/OUDS/Core/Tokens/SemanticTokens/Sources/_OUDSTokensSemantic.docc/OUDSTokensSemantic.md b/OUDS/Core/Tokens/SemanticTokens/Sources/_OUDSTokensSemantic.docc/OUDSTokensSemantic.md index 45e21472c..6f7b5ba82 100644 --- a/OUDS/Core/Tokens/SemanticTokens/Sources/_OUDSTokensSemantic.docc/OUDSTokensSemantic.md +++ b/OUDS/Core/Tokens/SemanticTokens/Sources/_OUDSTokensSemantic.docc/OUDSTokensSemantic.md @@ -1,11 +1,11 @@ # ``OUDSTokensSemantic`` -These _tokens_ can be used mainly for _component tokens_ ([OUDSTokensComponent](https://ios.unified-design-system.orange.com/documentation/oudstokenscomponent/)) to apply some style and configuration values. +These _tokens_ can be used mainly for _component tokens_ ([OUDSTokensComponent](https://ios.unified-design-system.orange.com/documentation/oudstokenscomponent/)) to apply some style and configuration values ; today _component tokens_ or _components_ are not defined yet. They can be seen as an high level of usage with functional meanings. ## Overview -Thus if we need for example to change a warning color, supposing this color is defined as a _semantic token_, we onlyhave to change its assigned value and all components using the _semantic token_ won't be impacted in their definition. +Thus if we need for example to change a warning color, supposing this color is defined as a _semantic token_, we only have to change its assigned value and all components using the _semantic token_ won't be impacted in their definition. In addition, there are hundreds of _semantics tokens_ and we needed to add them to the abstract root theme using extensions for clarity reasons to prevent to have a _Swift class_ with thousands of lines. Each _raw token_ "family" is then declared in its dedicated _Swift protocol_ any root theme must implement. Because we choose to split responsabilities and objects into their own modules, we faced troubles to make possible for children themes to override properties declared in _protocols_ and defined in _extensions_. @@ -16,22 +16,40 @@ To keep the same semantics as the ones used in our specifications, _typealias_ a Example with ``ColorSemanticTokens``: ```swift -// Delcare the semantic tokens +// Declare the semantic tokens protocol ColorSemanticTokens { - var sysColorBrandNeutralMutedWhite: ColorAliasSemanticToken? { get } + + var colorBgPrimary: ColorSemanticToken { get } + var colorBgSecondary: ColorSemanticToken { get } + var colorBgTertiary: ColorSemanticToken { get } + // ... } // Define the semantic tokens exposed through the theme extension OUDSTheme: ColorSemanticTokens { - @objc open var sysColorBrandNeutralMutedWhite: ColorAliasSemanticToken? { ColorRawTokens.colorFunctionalWhite } + // Color is available in the module of OUDSTheme + @objc open var colorBgPrimary: ColorSemanticToken { ColorRawTokens.colorFunctionalWhite } + + // If the semantic token refers to a raw token not stored in the OUDSTheme module, override later and throw error because unxpected state if used + @objc open var colorBgSecondary: ColorSemanticToken { fatalError("🤖 Raw token unavailable for colorBgSecondary!") } + + // Possible to have tokens not defined in lwoer level must only in themes implementation, throw error if used because unexpected state + @objc open var colorBgTertiary: ColorSemanticToken { fatalError("🤖 No value defined for colorBgTertiary!") } +} + +// Add missing values +extension OrangeTheme: ColorSemanticTokens { + + // Define value value with the accessible token + @objc open var colorBgSecondary: ColorSemanticToken { OrangeBrandColorRawTokens.colorOrange200 } } ``` ## Architecture The *Multiples* folder contains some _composite class_ defined to pack double values for dedicated needs, like size classes management (_regular_ or _compact_ device modes), and also for color schemes management (_light_ and _dark_ modes). -Such *composites* are not the same as the ones defined in the *Figma* design system, they are just utilities to handle tuple of values, without the syntaxe of tuples and with some helper functions. +Such *composites* are not the same as the ones defined in the *Figma* design system, they are just utilities to handle tuple of values, without the syntax of tuples and with some helper functions. We would like to define one class for all combinations of things depending to light and dark modes, and another for regular and compact modes. However, it implies to use _Swift generics_ and it is not compatible with Objective-C runtime (we use through `@objc` keyword). We would like to define one class for all combinations of things depending to light and dark modes, and another for regular and compact modes. However, it implies to use _Swift generics_ and it is not compatible with Objective-C runtime (we use through `@objc` keyword). @@ -70,6 +88,56 @@ But beware, if you change the name of the property or if you move it from a `pro If you update the value, keep also the CHANGELOG and/or RELEASE NOTE updated so as to let yout users know the variables have been changed. +### Some note about composites + +The *tokenator* is not able today to generate composites tokens, i.e. tokens which contain by definition several properties. +For example, *elevation semantic token* dedicated to bow shadows are composed by several properties (x, y, blur, shadow). +*Typography semantic token* can be token containing several properties too (weght, size, spacinf, font family). +These are considered as *composite tokens*. They are defined in dedicated protocols and files. +Thus when the *tokenator* generates tokens without managing composites, the file can still be used as is with generated tokens, and the composites are not erased. + +## How to use semantic tokens + +In fact, the semantic tokens are declared and gathered in _Swift protocol_ so as to force any theme to implement them, and also to allow any theme to expose such properties wathever the implementation of the theme is. +Because *semantic tokens* have for values *raw tokens*, and these *raw tokens* have for values primitive types, and all these tokens are decalred with *type aliases* refering all together, you can handle a *semantic token* directly in your view because the final value will be used. +Thus, get the theme and call the needed property with some helpers. + +```swift +struct SomeView: View { + + @Environment(\.theme) private var theme // Supposed you used in your root view the `OUDSThemeableView` to register the theme + @Environment(\.colorScheme) private var colorScheme + + var body: some View { + Rectangle() + .frame(width: theme.sizeIconDecorativeTallest, height: theme.sizeIconDecorativeTallest) + .foregroundColor(theme.colorBgSecondary.color(for: colorScheme)) + .shadow(elevation: theme.elevationRaised.elevation(for: colorScheme)) + .padding(.bottom, theme.spaceFixedNone) + } +/* + - The theme provides size semantic tokens "sizeIconDecorativeTallest" and "sizeIconDecorativeTallest" + - The theme provides a color semantic token "colorBgSecondary" with values for light and dark scheme, and you can use the color(for:) helper + - The theme provides an elevation semantic token "elevationRaised" with values for compact and regualr size classes, and you can use the elevation(for:) helper + - The theme provides a space semantic token "spaceFixedNone" usable as is +*/ +} + +// Do not forget in your app to use the `OUDSThemeableView` for your theme, e.g. `OrangeTheme` +@main +struct Showcase: App { + + var body: some Scene { + WindowGroup { + OUDSThemeableView(theme: OrangeTheme()) { + // Your root view + ... + } + } + } +} +``` + ## Topics ### Group @@ -77,9 +145,11 @@ If you update the value, keep also the CHANGELOG and/or RELEASE NOTE updated so - ``BorderSemanticTokens`` - ``ColorSemanticTokens`` - ``DimensionSemanticTokens`` +- ``ElevationCompositeSemanticTokens`` - ``ElevationSemanticTokens`` - ``GridSemanticTokens`` - ``OpacitySemanticTokens`` - ``SizeSemanticTokens`` - ``SpaceSemanticTokens`` - ``TypographySemanticTokens`` +- ``TypographyCompositeSemanticTokens`` diff --git a/OUDS/Core/Tokens/SemanticTokens/Tests/Multiples/MultipleSizingSemanticTokenTests.swift b/OUDS/Core/Tokens/SemanticTokens/Tests/Multiples/MultipleSizeSemanticTokenTests.swift similarity index 87% rename from OUDS/Core/Tokens/SemanticTokens/Tests/Multiples/MultipleSizingSemanticTokenTests.swift rename to OUDS/Core/Tokens/SemanticTokens/Tests/Multiples/MultipleSizeSemanticTokenTests.swift index 7f1a4b640..492ba21b7 100644 --- a/OUDS/Core/Tokens/SemanticTokens/Tests/Multiples/MultipleSizingSemanticTokenTests.swift +++ b/OUDS/Core/Tokens/SemanticTokens/Tests/Multiples/MultipleSizeSemanticTokenTests.swift @@ -16,8 +16,8 @@ import XCTest // swiftlint:disable required_deinit -/// To ensure the `MultipleSizingTokens` is tested as a wrapper of semantic tokens for compact and regular size classes. -final class MultipleSizingTokensTests: XCTestCase { +/// To ensure the `MultipleSizeTokens` is tested as a wrapper of semantic tokens for compact and regular size classes. +final class MultipleSizeTokensTests: XCTestCase { /// Tests if compact and regular values are preserved when defined func testInitWithOneValues() { @@ -38,7 +38,7 @@ final class MultipleSizingTokensTests: XCTestCase { XCTAssertTrue(token.regular == regular) } - /// Tests comparisons between two `MultipleSizingTokens` to ensure tokens are considered as equal + /// Tests comparisons between two `MultipleSizeTokens` to ensure tokens are considered as equal /// if an only if they have the same compact and regular values and have the same types. func testIsEqual() { let first = MultipleSizeTokens(compact: 12, regular: 34) diff --git a/OUDS/Core/Tokens/SemanticTokens/Tests/Multiples/MultipleSpacingTokensTests.swift b/OUDS/Core/Tokens/SemanticTokens/Tests/Multiples/MultipleSpaceTokensTests.swift similarity index 86% rename from OUDS/Core/Tokens/SemanticTokens/Tests/Multiples/MultipleSpacingTokensTests.swift rename to OUDS/Core/Tokens/SemanticTokens/Tests/Multiples/MultipleSpaceTokensTests.swift index 18e076c78..8e9c60659 100644 --- a/OUDS/Core/Tokens/SemanticTokens/Tests/Multiples/MultipleSpacingTokensTests.swift +++ b/OUDS/Core/Tokens/SemanticTokens/Tests/Multiples/MultipleSpaceTokensTests.swift @@ -17,8 +17,8 @@ import XCTest // swiftlint:disable required_deinit -/// To ensure the `MultipleSpacingTokens` is tested as a wrapper of semantic tokens for compact and regular size classes. -final class MultipleSpacingTokensTests: XCTestCase { +/// To ensure the `MultipleSpaceTokens` is tested as a wrapper of semantic tokens for compact and regular size classes. +final class MultipleSpaceTokensTests: XCTestCase { /// Tests if compact and regular values are preserved when defined func testInit() { @@ -30,7 +30,7 @@ final class MultipleSpacingTokensTests: XCTestCase { XCTAssertTrue(token.regular == regular) } - /// Tests comparisons between two `MultipleSpacingTokens` to ensure tokens are considered as equal + /// Tests comparisons between two `MultipleSpaceTokens` to ensure tokens are considered as equal /// if an only if they have the same compact and regular values and have the same types. func testIsEqual() { let first = MultipleSpaceTokens(compact: 12, regular: 34) diff --git a/OUDS/Modules/Sources/_OUDSModules.docc/OUDSModules.md b/OUDS/Modules/Sources/_OUDSModules.docc/OUDSModules.md index 2dce9a470..e31fe06db 100644 --- a/OUDS/Modules/Sources/_OUDSModules.docc/OUDSModules.md +++ b/OUDS/Modules/Sources/_OUDSModules.docc/OUDSModules.md @@ -4,5 +4,5 @@ The catalog of all modules provided by OUDS. ## Overview -Comming soon +❗**More details coming soon.**❗ diff --git a/OUDS/README.md b/OUDS/README.md index 91dd0bee2..67f1f3d12 100644 --- a/OUDS/README.md +++ b/OUDS/README.md @@ -65,62 +65,7 @@ These _tokens_ can be used to apply some style and configuration values to _comp Thus if a component need to change for example its _background color_, and if a _component token_ is used for it, then only the value of this _token_ should be changed without any modification on the _component_ definition. _Components_ use _component tokens_ exposed through the _theme_ to get their style values. -Example with `FormsTextInputComponentTokens`: - -```swift -public protocol FormsTextInputComponentTokens { - var ftiTitleFontWeight: TypographyFontWeightSemanticToken { get } - var ftiTitleFontSize: TypographyFontSizeSemanticToken { get } - var ftiTitleColor: ColorSemanticToken { get } - - var ftiBorderColor: ColorSemanticToken { get } - var ftiBorderStyle: BorderStyleSemanticToken { get } - var ftiBorderWidth: BorderWidthSemanticToken { get } -} - -extension OUDSTheme: FormsTextInputComponentTokens { - private static let defaultBlack: ColorSemanticToken = ColorRawTokens.colorFunctionalBlack - private static let defaultWhite: ColorSemanticToken = ColorRawTokens.colorFunctionalWhite - - @objc open var ftiTitleFontWeight: TypographyFontWeightSemanticToken { fontWeightHeading } - @objc open var ftiTitleFontSize: TypographyFontSizeSemanticToken { fontSizeLabelLarge } - @objc open var ftiTitleColor: ColorSemanticToken { colorContentBrandPrimaryLight ?? Self.defaultBlack } - - @objc open var ftiBorderColor: ColorSemanticToken { colorBorderEmphasizedLight ?? Self.defaultBlack } - @objc open var ftiBorderStyle: BorderStyleSemanticToken { borderStyleDefault } - @objc open var ftiBorderWidth: BorderWidthSemanticToken { borderWidthThin } -} - -// The View - -struct OUDSFormsTextInput: View { - - // ... - @Environment(\.theme) var theme - - public var body: some View { - VStack(spacing: theme.spacePaddingBlockComponentTall) { - Label( - title: { - Text("Example of OUDSFormsTextInput") - .fontWeight(theme.ftiTitleFontWeight.fontWeight) - .font(.system(size: theme.ftiTitleFontSize)) - .foregroundColor(theme.ftiTitleColor.color) - }, - icon: { /*@START_MENU_TOKEN@*/Image(systemName: "42.circle")/*@END_MENU_TOKEN@*/ } - ) - Text("Write bellow some awesome text!") - .fontWeight(theme.ftiSubtitleFontWeight.fontWeight) - .font(.system(size: theme.ftiSubtitleFontSize)) - .foregroundColor(theme.ftiSubtitleColor.color) - TextField(placeholder, text: $value) - } - .padding(theme.spacePaddingBlockComponentTall) - .background(theme.ftiBorderColor.color(for: colorScheme)) - .border(theme.ftiBorderColor.color(for: colorScheme), width: theme.ftiBorderWidth) - } -} -``` +❗**More details coming soon.**❗ #### Semantic tokens @@ -131,16 +76,36 @@ In addition, there are hundreds of _semantics tokens_ and we needed to add them That is the reason why tokens are exposed as `@objc open` to be available and oveeridable anywhere. To keep the same semantics as the ones used in our specifications, _typealias_ are used to as to make the links to _primitive types_ and our logic of _tokens_. These type aliases are available for those who want to make their own theme. -Example with `ColorSemanticTokens`: +Example with `ColorSemanticTokens``: ```swift +// Declare the semantic tokens protocol ColorSemanticTokens { - var sysColorBrandNeutralMutedWhite: ColorAliasSemanticToken? { get } + + var colorBgPrimary: ColorSemanticToken { get } + var colorBgSecondary: ColorSemanticToken { get } + var colorBgTertiary: ColorSemanticToken { get } + // ... } +// Define the semantic tokens exposed through the theme extension OUDSTheme: ColorSemanticTokens { - @objc open var sysColorBrandNeutralMutedWhite: ColorAliasSemanticToken? { ColorRawTokens.colorFunctionalWhite } + // Color is available in the module of OUDSTheme + @objc open var colorBgPrimary: ColorSemanticToken { ColorRawTokens.colorFunctionalWhite } + + // If the semantic token refers to a raw token not stored in the OUDSTheme module, override later and throw error because unxpected state if used + @objc open var colorBgSecondary: ColorSemanticToken { fatalError("🤖 Raw token unavailable for colorBgSecondary!") } + + // Possible to have tokens not defined in lwoer level must only in themes implementation, throw error if used because unexpected state + @objc open var colorBgTertiary: ColorSemanticToken { fatalError("🤖 No value defined for colorBgTertiary!") } +} + +// Add missing values +extension OrangeTheme: ColorSemanticTokens { + + // Define value value with the accessible token + @objc open var colorBgSecondary: ColorSemanticToken { OrangeBrandColorRawTokens.colorOrange200 } } ``` @@ -246,7 +211,7 @@ extension OrangeCustomTheme { // For FormsTextInputComponentTokens, used in comp override public var ftiSubtitleFontSize: TypographyFontSizeSemanticToken { fontSizeLabelMedium } override public var ftiSubtitleColor: ColorSemanticToken { ColorRawTokens.colorFunctionalMalachite500 } - override public var ftiBackgroundColor: ColorSemanticToken { colorBackgroundPrimary } + override public var ftiBackgroundColor: ColorSemanticToken { colorBgrimary } override public var ftiBorderColor: ColorSemanticToken { colorBorderEmphasized } @@ -257,7 +222,7 @@ extension OrangeCustomTheme { // For FormsTextInputComponentTokens, used in comp extension OrangeCustomTheme { // For ColorSemanticTokens using anywhere - override var colorBackgroundPrimary: ColorSemanticToken { + override var colorBgPrimary: ColorSemanticToken { MultipleColorTokens(light: ColorRawTokens.ColorRawTokens.colorFunctionalSun500, dark: ColorRawTokens.ColorRawTokens.colorFunctionalSun800) } } diff --git a/Showcase/Showcase/Pages/Tokens/Border/BorderTokenPage.swift b/Showcase/Showcase/Pages/Tokens/Border/BorderTokenPage.swift index 8efe925cd..2eb687bda 100644 --- a/Showcase/Showcase/Pages/Tokens/Border/BorderTokenPage.swift +++ b/Showcase/Showcase/Pages/Tokens/Border/BorderTokenPage.swift @@ -68,7 +68,7 @@ struct BorderTokenPage: View { private var rectangle: some View { Rectangle() - .fill(theme.colorBackgroundSecondary.color(for: colorScheme)) + .fill(theme.colorBgSecondary.color(for: colorScheme)) .frame(width: 64, height: 64) } diff --git a/Showcase/Showcase/Pages/Tokens/Color/ColorTokenPage.swift b/Showcase/Showcase/Pages/Tokens/Color/ColorTokenPage.swift index dd8ae5ee5..19ca26ec0 100644 --- a/Showcase/Showcase/Pages/Tokens/Color/ColorTokenPage.swift +++ b/Showcase/Showcase/Pages/Tokens/Color/ColorTokenPage.swift @@ -144,7 +144,7 @@ private struct ExtraBorderModifier: ViewModifier { let color: ColorRawToken func body(content: Content) -> some View { - let defaultContentBackground = theme.colorBackgroundPrimary.color(for: colorScheme) + let defaultContentBackground = theme.colorBgPrimary.color(for: colorScheme) let addBorder = color.color == defaultContentBackground if addBorder { diff --git a/Showcase/Showcase/Pages/Tokens/Color/NamedColor/NamedColor+Background.swift b/Showcase/Showcase/Pages/Tokens/Color/NamedColor/NamedColor+Background.swift index 528730c66..2627daaf5 100644 --- a/Showcase/Showcase/Pages/Tokens/Color/NamedColor/NamedColor+Background.swift +++ b/Showcase/Showcase/Pages/Tokens/Color/NamedColor/NamedColor+Background.swift @@ -14,93 +14,89 @@ import OUDS import OUDSTokensSemantic -// swiftlint:disable identifier_name - extension NamedColor { enum Background: String, CaseIterable { - case colorBackgroundPrimary - case colorBackgroundSecondary + case colorBgPrimary + case colorBgSecondary // NOTE: #124 - Following case(s) is / are not managed because not defined values! - // case colorBackgroundTertiary - case colorBackgroundEmphasized - case colorBackgroundBrandPrimary + // case colorBgTertiary + case colorBgEmphasized + case colorBgBrandPrimary // NOTE: #124 - Following case(s) is / are not managed because not defined values! - // case colorBackgroundBrandSecondary - // case colorBackgroundBrandTertiary - case colorBackgroundStatusNeutral - case colorBackgroundStatusNeutralOnBgEmphasized - case colorBackgroundStatusPositiveMuted - case colorBackgroundStatusPositiveMutedOnBgEmphasized - case colorBackgroundStatusPositiveEmphasized - case colorBackgroundStatusInfoMuted - case colorBackgroundStatusInfoMutedOnBgEmphasized - case colorBackgroundStatusInfoEmphasized - case colorBackgroundStatusWarningMuted - case colorBackgroundStatusWarningMutedOnBgEmphasized - case colorBackgroundStatusWarningEmphasized - case colorBackgroundStatusNegativeMuted - case colorBackgroundStatusNegativeMutedOnBgEmphasized - case colorBackgroundStatusNegativeEmphasized - case colorBackgroundStatusAccentMuted - case colorBackgroundStatusAccentMutedOnBgEmphasized - case colorBackgroundStatusAccentEmphasized + // case colorBgBrandSecondary + // case colorBgBrandTertiary + case colorBgStatusNeutral + case colorBgStatusNeutralOnBgEmphasized + case colorBgStatusPositiveMuted + case colorBgStatusPositiveMutedOnBgEmphasized + case colorBgStatusPositiveEmphasized + case colorBgStatusInfoMuted + case colorBgStatusInfoMutedOnBgEmphasized + case colorBgStatusInfoEmphasized + case colorBgStatusWarningMuted + case colorBgStatusWarningMutedOnBgEmphasized + case colorBgStatusWarningEmphasized + case colorBgStatusNegativeMuted + case colorBgStatusNegativeMutedOnBgEmphasized + case colorBgStatusNegativeEmphasized + case colorBgStatusAccentMuted + case colorBgStatusAccentMutedOnBgEmphasized + case colorBgStatusAccentEmphasized func token(from theme: OUDSTheme) -> ColorSemanticToken { switch self { - case .colorBackgroundPrimary: - return theme.colorBackgroundPrimary - case .colorBackgroundSecondary: - return theme.colorBackgroundSecondary + case .colorBgPrimary: + return theme.colorBgPrimary + case .colorBgSecondary: + return theme.colorBgSecondary // NOTE: #124 - Following case(s) is / are not managed because not defined values! -// case .colorBackgroundTertiary: -// return theme.colorBackgroundTertiary - case .colorBackgroundEmphasized: - return theme.colorBackgroundEmphasized - case .colorBackgroundBrandPrimary: - return theme.colorBackgroundBrandPrimary +// case .colorBgTertiary: +// return theme.colorBgTertiary + case .colorBgEmphasized: + return theme.colorBgEmphasized + case .colorBgBrandPrimary: + return theme.colorBgBrandPrimary // NOTE: #124 - Following case(s) is / are not managed because not defined values! -// case .colorBackgroundBrandSecondary: -// return theme.colorBackgroundBrandSecondary -// case .colorBackgroundBrandTertiary: -// return theme.colorBackgroundBrandTertiary - case .colorBackgroundStatusNeutral: - return theme.colorBackgroundStatusNeutral - case .colorBackgroundStatusNeutralOnBgEmphasized: - return theme.colorBackgroundStatusNeutralOnBgEmphasized - case .colorBackgroundStatusPositiveMuted: - return theme.colorBackgroundStatusPositiveMuted - case .colorBackgroundStatusPositiveMutedOnBgEmphasized: - return theme.colorBackgroundStatusPositiveMutedOnBgEmphasized - case .colorBackgroundStatusPositiveEmphasized: - return theme.colorBackgroundStatusPositiveEmphasized - case .colorBackgroundStatusInfoMuted: - return theme.colorBackgroundStatusInfoMuted - case .colorBackgroundStatusInfoMutedOnBgEmphasized: - return theme.colorBackgroundStatusInfoMutedOnBgEmphasized - case .colorBackgroundStatusInfoEmphasized: - return theme.colorBackgroundStatusInfoEmphasized - case .colorBackgroundStatusWarningMuted: - return theme.colorBackgroundStatusWarningMuted - case .colorBackgroundStatusWarningMutedOnBgEmphasized: - return theme.colorBackgroundStatusWarningMutedOnBgEmphasized - case .colorBackgroundStatusWarningEmphasized: - return theme.colorBackgroundStatusWarningEmphasized - case .colorBackgroundStatusNegativeMuted: - return theme.colorBackgroundStatusNegativeMuted - case .colorBackgroundStatusNegativeMutedOnBgEmphasized: - return theme.colorBackgroundStatusNegativeMutedOnBgEmphasized - case .colorBackgroundStatusNegativeEmphasized: - return theme.colorBackgroundStatusNegativeEmphasized - case .colorBackgroundStatusAccentMuted: - return theme.colorBackgroundStatusAccentMuted - case .colorBackgroundStatusAccentMutedOnBgEmphasized: - return theme.colorBackgroundStatusAccentMutedOnBgEmphasized - case .colorBackgroundStatusAccentEmphasized: - return theme.colorBackgroundStatusAccentEmphasized +// case .colorBgBrandSecondary: +// return theme.colorBgBrandSecondary +// case .colorBgBrandTertiary: +// return theme.colorBgBrandTertiary + case .colorBgStatusNeutral: + return theme.colorBgStatusNeutral + case .colorBgStatusNeutralOnBgEmphasized: + return theme.colorBgStatusNeutralOnBgEmphasized + case .colorBgStatusPositiveMuted: + return theme.colorBgStatusPositiveMuted + case .colorBgStatusPositiveMutedOnBgEmphasized: + return theme.colorBgStatusPositiveMutedOnBgEmphasized + case .colorBgStatusPositiveEmphasized: + return theme.colorBgStatusPositiveEmphasized + case .colorBgStatusInfoMuted: + return theme.colorBgStatusInfoMuted + case .colorBgStatusInfoMutedOnBgEmphasized: + return theme.colorBgStatusInfoMutedOnBgEmphasized + case .colorBgStatusInfoEmphasized: + return theme.colorBgStatusInfoEmphasized + case .colorBgStatusWarningMuted: + return theme.colorBgStatusWarningMuted + case .colorBgStatusWarningMutedOnBgEmphasized: + return theme.colorBgStatusWarningMutedOnBgEmphasized + case .colorBgStatusWarningEmphasized: + return theme.colorBgStatusWarningEmphasized + case .colorBgStatusNegativeMuted: + return theme.colorBgStatusNegativeMuted + case .colorBgStatusNegativeMutedOnBgEmphasized: + return theme.colorBgStatusNegativeMutedOnBgEmphasized + case .colorBgStatusNegativeEmphasized: + return theme.colorBgStatusNegativeEmphasized + case .colorBgStatusAccentMuted: + return theme.colorBgStatusAccentMuted + case .colorBgStatusAccentMutedOnBgEmphasized: + return theme.colorBgStatusAccentMutedOnBgEmphasized + case .colorBgStatusAccentEmphasized: + return theme.colorBgStatusAccentEmphasized } } } } - -// swiftlint:enable identifier_name diff --git a/Showcase/Showcase/Pages/Tokens/Dimension/Size/SizeTokenPage.swift b/Showcase/Showcase/Pages/Tokens/Dimension/Size/SizeTokenPage.swift index d8dad5507..dad4dd435 100644 --- a/Showcase/Showcase/Pages/Tokens/Dimension/Size/SizeTokenPage.swift +++ b/Showcase/Showcase/Pages/Tokens/Dimension/Size/SizeTokenPage.swift @@ -44,7 +44,7 @@ struct SizeTokenPage: View { return ShowcaseTokenIllustration(tokenName: name, tokenValue: value) { ZStack { Rectangle() - .fill(theme.colorBackgroundEmphasized.color(for: colorScheme)) + .fill(theme.colorBgEmphasized.color(for: colorScheme)) .frame(width: 82, height: 82, alignment: .center) Image("ic_token") diff --git a/Showcase/Showcase/Pages/Tokens/Dimension/Space/SpaceTokenPage.swift b/Showcase/Showcase/Pages/Tokens/Dimension/Space/SpaceTokenPage.swift index 72d8e7a69..a0e40d374 100644 --- a/Showcase/Showcase/Pages/Tokens/Dimension/Space/SpaceTokenPage.swift +++ b/Showcase/Showcase/Pages/Tokens/Dimension/Space/SpaceTokenPage.swift @@ -105,7 +105,7 @@ struct SpaceTokenPage: View { return ShowcaseTokenIllustration(tokenName: name, tokenValue: value) { ZStack { Rectangle() - .fill(theme.colorBackgroundEmphasized.color(for: colorScheme)) + .fill(theme.colorBgEmphasized.color(for: colorScheme)) .frame(width: kIllustrationWidth, height: kIillustrationHeight, alignment: .center) Rectangle() .fill(theme.colorAlwaysInfo.color(for: colorScheme)) @@ -215,7 +215,7 @@ struct SpaceTokenPage: View { .fill(theme.colorAlwaysInfo.color(for: colorScheme)) Rectangle() - .fill(theme.colorBackgroundEmphasized.color(for: colorScheme)) + .fill(theme.colorBgEmphasized.color(for: colorScheme)) .modifier(PaddingModifier(padding: paddingType)) if let additionalAsset { @@ -242,7 +242,7 @@ struct SpaceTokenPage: View { ShowcaseTokenIllustration(tokenName: name, tokenValue: value) { ZStack { Rectangle() - .fill(theme.colorBackgroundEmphasized.color(for: colorScheme)) + .fill(theme.colorBgEmphasized.color(for: colorScheme)) Rectangle() .fill(theme.colorAlwaysInfo.color(for: colorScheme)) diff --git a/Showcase/Showcase/Pages/Tokens/Elevation/ElevationTokenPage.swift b/Showcase/Showcase/Pages/Tokens/Elevation/ElevationTokenPage.swift index 72d0ad395..642ca2934 100644 --- a/Showcase/Showcase/Pages/Tokens/Elevation/ElevationTokenPage.swift +++ b/Showcase/Showcase/Pages/Tokens/Elevation/ElevationTokenPage.swift @@ -45,7 +45,7 @@ struct ElevationTokenPage: View { return ShowcaseTokenIllustration(tokenName: name, tokenValue: value) { Rectangle() .frame(width: theme.sizeIconDecorativeTallest, height: theme.sizeIconDecorativeTallest) - .foregroundColor(theme.colorBackgroundSecondary.color(for: colorScheme)) + .foregroundColor(theme.colorBgSecondary.color(for: colorScheme)) .shadow(elevation: token) .padding(.bottom, 2) } diff --git a/Showcase/Showcase/Pages/Tokens/Opacity/OpacityTokenPage.swift b/Showcase/Showcase/Pages/Tokens/Opacity/OpacityTokenPage.swift index 454280d7d..30f487392 100644 --- a/Showcase/Showcase/Pages/Tokens/Opacity/OpacityTokenPage.swift +++ b/Showcase/Showcase/Pages/Tokens/Opacity/OpacityTokenPage.swift @@ -52,7 +52,7 @@ struct OpacityTokenPage: View { .accessibilityHidden(true) Rectangle() - .fill(theme.colorBackgroundEmphasized.color(for: colorScheme)) + .fill(theme.colorBgEmphasized.color(for: colorScheme)) .opacity(token) .frame(width: 48, height: 48) .oudsBorder(style: theme.borderStyleDefault, diff --git a/Showcase/Showcase/Pages/Utils/ShowcaseElementPage.swift b/Showcase/Showcase/Pages/Utils/ShowcaseElementPage.swift index 821581e64..c9b73f8c4 100644 --- a/Showcase/Showcase/Pages/Utils/ShowcaseElementPage.swift +++ b/Showcase/Showcase/Pages/Utils/ShowcaseElementPage.swift @@ -42,18 +42,18 @@ struct ShowcaseElementPage: View { .listRowSeparator(Visibility.hidden) .padding(.horizontal, theme.spaceFixedNone) .padding(.bottom, theme.spaceFixedMedium) - .background(theme.colorBackgroundPrimary.color(for: colorScheme)) + .background(theme.colorBgPrimary.color(for: colorScheme)) element.pageDescription .listRowInsets(EdgeInsets()) .listRowSeparator(Visibility.hidden) .padding(.bottom, theme.spaceFixedMedium) - .background(theme.colorBackgroundPrimary.color(for: colorScheme)) + .background(theme.colorBgPrimary.color(for: colorScheme)) } .listStyle(.plain) .padding(.top, theme.spaceFixedNone) .padding(.horizontal, theme.spaceFixedNone) - .background(theme.colorBackgroundPrimary.color(for: colorScheme)) + .background(theme.colorBgPrimary.color(for: colorScheme)) .navigationTitle(LocalizedStringKey(element.name)) .navigationbarMenuForThemeSelection() .oudsRequestAccessibleFocus(_requestFocus) diff --git a/Showcase/Showcase/Pages/Utils/ShowcaseElementsPage.swift b/Showcase/Showcase/Pages/Utils/ShowcaseElementsPage.swift index 2f807f252..bfbcd7e8c 100644 --- a/Showcase/Showcase/Pages/Utils/ShowcaseElementsPage.swift +++ b/Showcase/Showcase/Pages/Utils/ShowcaseElementsPage.swift @@ -47,7 +47,7 @@ struct ShowcaseElementsPage: View { .navigationbarMenuForThemeSelection() .oudsNavigationTitle("app_bottomBar_tokens_label") } - .background(theme.colorBackgroundPrimary.color(for: colorScheme)) + .background(theme.colorBgPrimary.color(for: colorScheme)) } .navigationViewStyle(.stack) } From 02741a732e8613b6d6c59cd80001861a3760ccf0 Mon Sep 17 00:00:00 2001 From: "Boosted Bot [bot]" <130566815+boosted-bot@users.noreply.github.com> Date: Fri, 25 Oct 2024 16:23:23 +0200 Subject: [PATCH 23/30] =?UTF-8?q?chore(=F0=9F=A4=96):=20update=20`BorderSe?= =?UTF-8?q?manticTokens`=20(tokenator=2020241025110844)=20(#252)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Pierre-Yves Lapersonne Co-authored-by: boosted-bot Co-authored-by: Pierre-Yves Lapersonne --- CHANGELOG.md | 1 + .../OUDSTheme+BorderSemanticTokens.swift | 44 ++++++------------- 2 files changed, 14 insertions(+), 31 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f7af68ff6..9b69a76f6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed +- [Library] Update `BorderSemanticTokens` (tokenator *20241025110844*) - [Library] Rename color semantic tokens `colorBackground*` to `colorBg*` - [Library] Rename `MultipleSpacingTokens` to `MultipleSpaceTokens` and `MultipleSizingTokens` to `MultipleSizeTokens` - [Library] Extract composite semantic tokens from semantic tokens (`ElevationSemanticTokens`, `TypographySemanticTokens`) diff --git a/OUDS/Core/OUDS/Sources/OUDSTheme/OUDSTheme+SemanticTokens/OUDSTheme+BorderSemanticTokens.swift b/OUDS/Core/OUDS/Sources/OUDSTheme/OUDSTheme+SemanticTokens/OUDSTheme+BorderSemanticTokens.swift index d7f7fb242..ebbf4e95d 100644 --- a/OUDS/Core/OUDS/Sources/OUDSTheme/OUDSTheme+SemanticTokens/OUDSTheme+BorderSemanticTokens.swift +++ b/OUDS/Core/OUDS/Sources/OUDSTheme/OUDSTheme+SemanticTokens/OUDSTheme+BorderSemanticTokens.swift @@ -2,51 +2,33 @@ // Software Name: OUDS iOS // SPDX-FileCopyrightText: Copyright (c) Orange SA // SPDX-License-Identifier: MIT -// +// // This software is distributed under the MIT license, // the text of which is available at https://opensource.org/license/MIT/ // or see the "LICENSE" file for more details. -// +// // Authors: See CONTRIBUTORS.txt -// Software description: A SwiftUI components library with code examples for Orange Unified Design System +// Software description: A SwiftUI components library with code examples for Orange Unified Design System // import Foundation import OUDSTokensRaw import OUDSTokensSemantic -// ଘ( ・ω・)_/゚・:*:・。☆ -// [File to generate with the tokenator] -// WARNING: Not synchronized anymore with the Figjam / Figma by developers team -// Create an issue for update https://github.com/Orange-OpenSource/ouds-ios/issues/new?template=token_update.yml - -/// Defines basic values common to all themes for `BorderSemanticTokens`. -/// These values can be overriden inside `OUDSTheme` subclasses (in extensions or not, in the same module or not) thanks to the `@objc open` combination. -/// The aim of this extensions is to make relationships between all semantic tokens for borders and associated raw tokens. -/// `OUDSTheme` can be seen as a kind of "abstract class" in _object oriented paradigm_. extension OUDSTheme: BorderSemanticTokens { - - // MARK: Semantic token - Border - Width - - @objc open var borderWidthNone: BorderWidthSemanticToken { BorderRawTokens.borderWidth0 } - @objc open var borderWidthDefault: BorderWidthSemanticToken { BorderRawTokens.borderWidth25 } - @objc open var borderWidthThin: BorderWidthSemanticToken { BorderRawTokens.borderWidth25 } - @objc open var borderWidthMedium: BorderWidthSemanticToken { BorderRawTokens.borderWidth50 } - @objc open var borderWidthThick: BorderWidthSemanticToken { BorderRawTokens.borderWidth75 } - @objc open var borderWidthThicker: BorderWidthSemanticToken { BorderRawTokens.borderWidth100 } - @objc open var borderWidthFocus: BorderWidthSemanticToken { BorderRawTokens.borderWidth50 } - @objc open var borderWidthFocusInset: BorderWidthSemanticToken { BorderRawTokens.borderWidth100 } - - // MARK: Semantic token - Border - Radius - - @objc open var borderRadiusNone: BorderRadiusSemanticToken { BorderRawTokens.borderRadius0 } @objc open var borderRadiusDefault: BorderRadiusSemanticToken { BorderRawTokens.borderRadius0 } - @objc open var borderRadiusShort: BorderRadiusSemanticToken { BorderRawTokens.borderRadius75 } @objc open var borderRadiusMedium: BorderRadiusSemanticToken { BorderRawTokens.borderRadius150 } + @objc open var borderRadiusNone: BorderRadiusSemanticToken { BorderRawTokens.borderRadius0 } + @objc open var borderRadiusShort: BorderRadiusSemanticToken { BorderRawTokens.borderRadius75 } @objc open var borderRadiusTall: BorderRadiusSemanticToken { BorderRawTokens.borderRadius300 } - - // MARK: Semantic token - Border - Style - @objc open var borderStyleDefault: BorderStyleSemanticToken { BorderRawTokens.borderStyleSolid } @objc open var borderStyleDrag: BorderStyleSemanticToken { BorderRawTokens.borderStyleDashed } + @objc open var borderWidthDefault: BorderWidthSemanticToken { BorderRawTokens.borderWidth25 } + @objc open var borderWidthFocus: BorderWidthSemanticToken { BorderRawTokens.borderWidth50 } + @objc open var borderWidthFocusInset: BorderWidthSemanticToken { BorderRawTokens.borderWidth100 } + @objc open var borderWidthMedium: BorderWidthSemanticToken { BorderRawTokens.borderWidth50 } + @objc open var borderWidthNone: BorderWidthSemanticToken { BorderRawTokens.borderWidth0 } + @objc open var borderWidthThick: BorderWidthSemanticToken { BorderRawTokens.borderWidth75 } + @objc open var borderWidthThicker: BorderWidthSemanticToken { BorderRawTokens.borderWidth100 } + @objc open var borderWidthThin: BorderWidthSemanticToken { BorderRawTokens.borderWidth25 } } From 5bd516bea345ed9e308f3a23aef7bc7a45a85db9 Mon Sep 17 00:00:00 2001 From: LudovicPinel Date: Mon, 28 Oct 2024 13:31:45 +0100 Subject: [PATCH 24/30] feat: add new size semantic tokens in size tokens page (#245) (#255) Signed-off-by: Pierre-Yves Lapersonne Co-authored-by: Pierre-Yves Lapersonne Co-authored-by: Ludovic Pinel --- CHANGELOG.md | 1 + .../Multiples/MultipleSizeTokens.swift | 8 + .../Multiples/MultipleSpaceTokens.swift | 2 +- .../Multiples/MultipleTypographyTokens.swift | 9 +- Showcase/Showcase.xcodeproj/project.pbxproj | 36 ++- .../xcshareddata/swiftpm/Package.resolved | 6 +- .../NamedSize/NamedSize+IconDecorative.swift | 46 ++++ .../NamedSize+IconWithTypography.swift | 209 ++++++++++++++++++ .../Tokens/Dimension/Size/SizeTokenPage.swift | 94 ++++---- .../NamedTypography+Illustration.swift | 82 +++++++ .../NamedTypography/NamedTypography.swift | 97 ++++++++ .../Typography/TypographyTokenPage.swift | 144 +----------- .../Resources/en.lproj/Localizable.strings | 2 + 13 files changed, 551 insertions(+), 185 deletions(-) create mode 100644 Showcase/Showcase/Pages/Tokens/Dimension/Size/NamedSize/NamedSize+IconDecorative.swift create mode 100644 Showcase/Showcase/Pages/Tokens/Dimension/Size/NamedSize/NamedSize+IconWithTypography.swift create mode 100644 Showcase/Showcase/Pages/Tokens/Typography/NamedTypography/NamedTypography+Illustration.swift create mode 100644 Showcase/Showcase/Pages/Tokens/Typography/NamedTypography/NamedTypography.swift diff --git a/CHANGELOG.md b/CHANGELOG.md index 9b69a76f6..7b3a94878 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added +- [DemoApp] Add new tokens in size tokens page ([#245](https://github.com/Orange-OpenSource/ouds-ios/issues/245)) - [Library] Semantic token `borderWidthFocusInset` (value of `borderWidth100`) ([#207](https://github.com/Orange-OpenSource/ouds-ios/issues/207), [#241](https://github.com/Orange-OpenSource/ouds-ios/issues/241)) - [Library] Semantic token `fontWeightCode` ([#242](https://github.com/Orange-OpenSource/ouds-ios/issues/242)) - [DemoApp] Update space tokens screen with all categories ([#178](https://github.com/Orange-OpenSource/ouds-ios/issues/178)) diff --git a/OUDS/Core/Tokens/SemanticTokens/Sources/Multiples/MultipleSizeTokens.swift b/OUDS/Core/Tokens/SemanticTokens/Sources/Multiples/MultipleSizeTokens.swift index 06dd0a043..8e14b32dd 100644 --- a/OUDS/Core/Tokens/SemanticTokens/Sources/Multiples/MultipleSizeTokens.swift +++ b/OUDS/Core/Tokens/SemanticTokens/Sources/Multiples/MultipleSizeTokens.swift @@ -12,6 +12,7 @@ // import Foundation +import SwiftUICore /// Kind of semantic tokens which will wrap a combination of `SizeSemanticToken` depending to viewports / size classes. /// Kind of composite token with multiple values, but not named "composite" because this word is already used in the design system. @@ -51,4 +52,11 @@ public final class MultipleSizeTokens: NSObject, Sendable { } return self.compact == other.compact && self.regular == other.regular } + + /// Returns the right dimension according to the `userInterfaceSizeClass`. + /// - Parameter userInterfaceSizeClass: The user interface size class (could be the horizontal or the vertical size class) + /// - Returns: The right size semantic token (pointing to the dimension raw token to use) + public func dimension(for userInterfaceSizeClass: UserInterfaceSizeClass) -> SizeSemanticToken { + userInterfaceSizeClass == .compact ? compact : regular + } } diff --git a/OUDS/Core/Tokens/SemanticTokens/Sources/Multiples/MultipleSpaceTokens.swift b/OUDS/Core/Tokens/SemanticTokens/Sources/Multiples/MultipleSpaceTokens.swift index 457ebbaa2..b27101e9e 100644 --- a/OUDS/Core/Tokens/SemanticTokens/Sources/Multiples/MultipleSpaceTokens.swift +++ b/OUDS/Core/Tokens/SemanticTokens/Sources/Multiples/MultipleSpaceTokens.swift @@ -13,7 +13,7 @@ import Foundation import OUDSTokensRaw -import SwiftUI +import SwiftUICore /// Kind of semantic tokens which will wrap a combination of `DimensionRawToken` depending to size classes. /// Kind of composite token with multiple values, but not named "composite" because this word is already used in the design system. diff --git a/OUDS/Core/Tokens/SemanticTokens/Sources/Multiples/MultipleTypographyTokens.swift b/OUDS/Core/Tokens/SemanticTokens/Sources/Multiples/MultipleTypographyTokens.swift index ac8b20860..a3f4c4bf7 100644 --- a/OUDS/Core/Tokens/SemanticTokens/Sources/Multiples/MultipleTypographyTokens.swift +++ b/OUDS/Core/Tokens/SemanticTokens/Sources/Multiples/MultipleTypographyTokens.swift @@ -11,8 +11,8 @@ // Software description: A SwiftUI components library with code examples for Orange Unified Design System // -import Foundation import OUDSTokensRaw +import SwiftUICore /// Kind of semantic tokens which will wrap a combination of `TypographyCompositeRawToken` depending to size classes. /// Kind of composite token with multiple values, but not named "composite" because this word is already used in the design system. @@ -50,4 +50,11 @@ public final class MultipleTypographyTokens: NSObject, Sendable { guard let object = object as? MultipleTypographyTokens else { return false } return self.compact == object.compact && self.regular == object.regular } + + /// Returns the composite raw token of typography to use according to the `userInterfaceSizeClass` (i.e. `compact` or `regular`) + /// - Parameter userInterfaceSizeClass: The user interface size class + /// - Returns: The composite raw token to use (of type `TypographyCompositeRawToken`) + public func typographyToken(for userInterfaceSizeClass: UserInterfaceSizeClass) -> TypographyCompositeRawToken { + userInterfaceSizeClass == .compact ? compact : regular + } } diff --git a/Showcase/Showcase.xcodeproj/project.pbxproj b/Showcase/Showcase.xcodeproj/project.pbxproj index 03b20bfcc..e14e94fcc 100644 --- a/Showcase/Showcase.xcodeproj/project.pbxproj +++ b/Showcase/Showcase.xcodeproj/project.pbxproj @@ -52,6 +52,10 @@ 077CCE582CB426090059CC28 /* SpaceTokenPage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 077CCE522CB426090059CC28 /* SpaceTokenPage.swift */; }; 077CCE592CB426090059CC28 /* DimensionTokenElement.swift in Sources */ = {isa = PBXBuildFile; fileRef = 077CCE542CB426090059CC28 /* DimensionTokenElement.swift */; }; 077CCE5C2CB431C50059CC28 /* ShowcaseVariantElement.swift in Sources */ = {isa = PBXBuildFile; fileRef = 077CCE5B2CB431C50059CC28 /* ShowcaseVariantElement.swift */; }; + 0784B2712CCB86C500299C10 /* NamedSize+IconWithTypography.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0784B26F2CCB86C500299C10 /* NamedSize+IconWithTypography.swift */; }; + 0784B2732CCB8CC800299C10 /* NamedSize+IconDecorative.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0784B2722CCB8CC800299C10 /* NamedSize+IconDecorative.swift */; }; + 0784B2762CCBD9C300299C10 /* NamedTypography.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0784B2752CCBD9C300299C10 /* NamedTypography.swift */; }; + 0784B2782CCBDD8900299C10 /* NamedTypography+Illustration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0784B2772CCBDD8900299C10 /* NamedTypography+Illustration.swift */; }; 07CF426B2CA30728000BD03E /* TokensPage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 07CF426A2CA30728000BD03E /* TokensPage.swift */; }; 07CF42722CA31AC3000BD03E /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 07CF42712CA31AC3000BD03E /* Assets.xcassets */; }; 07CF42742CA3EC58000BD03E /* CardIllustration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 07CF42732CA3EC58000BD03E /* CardIllustration.swift */; }; @@ -141,6 +145,10 @@ 077CCE522CB426090059CC28 /* SpaceTokenPage.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SpaceTokenPage.swift; sourceTree = ""; }; 077CCE542CB426090059CC28 /* DimensionTokenElement.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DimensionTokenElement.swift; sourceTree = ""; }; 077CCE5B2CB431C50059CC28 /* ShowcaseVariantElement.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShowcaseVariantElement.swift; sourceTree = ""; }; + 0784B26F2CCB86C500299C10 /* NamedSize+IconWithTypography.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NamedSize+IconWithTypography.swift"; sourceTree = ""; }; + 0784B2722CCB8CC800299C10 /* NamedSize+IconDecorative.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NamedSize+IconDecorative.swift"; sourceTree = ""; }; + 0784B2752CCBD9C300299C10 /* NamedTypography.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NamedTypography.swift; sourceTree = ""; }; + 0784B2772CCBDD8900299C10 /* NamedTypography+Illustration.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NamedTypography+Illustration.swift"; sourceTree = ""; }; 07CEDD802C7DB921003E1885 /* generateDoc.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; name = generateDoc.sh; path = ../generateDoc.sh; sourceTree = ""; }; 07CF426A2CA30728000BD03E /* TokensPage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TokensPage.swift; sourceTree = ""; }; 07CF42712CA31AC3000BD03E /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; @@ -249,6 +257,7 @@ 073543192CA17388001187EA /* Typography */ = { isa = PBXGroup; children = ( + 0784B2742CCBD9A900299C10 /* NamedTypography */, 073543172CA172CA001187EA /* TypographyTokenElement.swift */, 0735431A2CA18C48001187EA /* TypographyTokenPage.swift */, ); @@ -285,6 +294,7 @@ 075114DA2CB7D28D00B8B759 /* Size */ = { isa = PBXGroup; children = ( + 0784B2702CCB86C500299C10 /* NamedSize */, 075114D82CB7D28D00B8B759 /* SizeTokenElement.swift */, 075114D92CB7D28D00B8B759 /* SizeTokenPage.swift */, ); @@ -347,6 +357,24 @@ path = Dimension; sourceTree = ""; }; + 0784B2702CCB86C500299C10 /* NamedSize */ = { + isa = PBXGroup; + children = ( + 0784B26F2CCB86C500299C10 /* NamedSize+IconWithTypography.swift */, + 0784B2722CCB8CC800299C10 /* NamedSize+IconDecorative.swift */, + ); + path = NamedSize; + sourceTree = ""; + }; + 0784B2742CCBD9A900299C10 /* NamedTypography */ = { + isa = PBXGroup; + children = ( + 0784B2772CCBDD8900299C10 /* NamedTypography+Illustration.swift */, + 0784B2752CCBD9C300299C10 /* NamedTypography.swift */, + ); + path = NamedTypography; + sourceTree = ""; + }; 07CF42752CA3F461000BD03E /* Elevation */ = { isa = PBXGroup; children = ( @@ -793,6 +821,7 @@ 51087A7B2C46DF9F00160CCF /* Bundle+extension.swift in Sources */, 0765B4962CC159F600E69359 /* NamedColor+Action.swift in Sources */, 0765B4A22CC15C0500E69359 /* NamedColor+OnContent.swift in Sources */, + 0784B2782CCBDD8900299C10 /* NamedTypography+Illustration.swift in Sources */, 077CCE572CB426090059CC28 /* SpaceTokenElement.swift in Sources */, 0735431B2CA18C48001187EA /* TypographyTokenPage.swift in Sources */, 07F75A412CC653EB0004F1AD /* NameSpace+GapStack.swift in Sources */, @@ -805,9 +834,12 @@ 0765B4A62CC15C9D00E69359 /* NamedColor.swift in Sources */, 073543112CA154DE001187EA /* Card.swift in Sources */, 51BD76212C466FCF0033365D /* AboutPage.swift in Sources */, + 0784B2732CCB8CC800299C10 /* NamedSize+IconDecorative.swift in Sources */, 51BD762A2C466FCF0033365D /* Showcase.swift in Sources */, 0765B49E2CC15B7E00E69359 /* NamedColor+Decorative.swift in Sources */, 07F75A432CC654050004F1AD /* NameSpace+PaddingStack.swift in Sources */, + 0784B2762CCBD9C300299C10 /* NamedTypography.swift in Sources */, + 0784B2712CCB86C500299C10 /* NamedSize+IconWithTypography.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1156,8 +1188,8 @@ isa = XCRemoteSwiftPackageReference; repositoryURL = "https://github.com/pointfreeco/swift-snapshot-testing.git"; requirement = { - kind = upToNextMajorVersion; - minimumVersion = 1.17.5; + kind = exactVersion; + version = 1.17.6; }; }; /* End XCRemoteSwiftPackageReference section */ diff --git a/Showcase/Showcase.xcworkspace/xcshareddata/swiftpm/Package.resolved b/Showcase/Showcase.xcworkspace/xcshareddata/swiftpm/Package.resolved index dfb105775..cd9f08df4 100644 --- a/Showcase/Showcase.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/Showcase/Showcase.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -1,13 +1,13 @@ { - "originHash" : "c48bd6ce1dff61368be114be7113f793bf250d75bd26b7706f31d9a229918712", + "originHash" : "b0e966f4ace0da078a6fcc1dcd094050f4d63b9437f87a3a6b4948c17b90db4e", "pins" : [ { "identity" : "swift-snapshot-testing", "kind" : "remoteSourceControl", "location" : "https://github.com/pointfreeco/swift-snapshot-testing.git", "state" : { - "revision" : "7b0bbbae90c41f848f90ac7b4df6c4f50068256d", - "version" : "1.17.5" + "revision" : "42a086182681cf661f5c47c9b7dc3931de18c6d7", + "version" : "1.17.6" } }, { diff --git a/Showcase/Showcase/Pages/Tokens/Dimension/Size/NamedSize/NamedSize+IconDecorative.swift b/Showcase/Showcase/Pages/Tokens/Dimension/Size/NamedSize/NamedSize+IconDecorative.swift new file mode 100644 index 000000000..a2516792d --- /dev/null +++ b/Showcase/Showcase/Pages/Tokens/Dimension/Size/NamedSize/NamedSize+IconDecorative.swift @@ -0,0 +1,46 @@ +// +// Software Name: OUDS iOS +// SPDX-FileCopyrightText: Copyright (c) Orange SA +// SPDX-License-Identifier: MIT +// +// This software is distributed under the MIT license, +// the text of which is available at https://opensource.org/license/MIT/ +// or see the "LICENSE" file for more details. +// +// Authors: See CONTRIBUTORS.txt +// Software description: A SwiftUI components library with code examples for Orange Unified Design System +// + +import OUDS +import OUDSTokensSemantic + +extension NamedSize { + enum IconDecorative: String, CaseIterable { + case sizeIconDecorativeShortest + case sizeIconDecorativeShorter + case sizeIconDecorativeShort + case sizeIconDecorativeMedium + case sizeIconDecorativeTall + case sizeIconDecorativeTaller + case sizeIconDecorativeTallest + + func token(from theme: OUDSTheme) -> SizeSemanticToken { + switch self { + case .sizeIconDecorativeShortest: + return theme.sizeIconDecorativeShortest + case .sizeIconDecorativeShorter: + return theme.sizeIconDecorativeShorter + case .sizeIconDecorativeShort: + return theme.sizeIconDecorativeShort + case .sizeIconDecorativeMedium: + return theme.sizeIconDecorativeMedium + case .sizeIconDecorativeTall: + return theme.sizeIconDecorativeTall + case .sizeIconDecorativeTaller: + return theme.sizeIconDecorativeTaller + case .sizeIconDecorativeTallest: + return theme.sizeIconDecorativeTallest + } + } + } +} diff --git a/Showcase/Showcase/Pages/Tokens/Dimension/Size/NamedSize/NamedSize+IconWithTypography.swift b/Showcase/Showcase/Pages/Tokens/Dimension/Size/NamedSize/NamedSize+IconWithTypography.swift new file mode 100644 index 000000000..fe54c55ce --- /dev/null +++ b/Showcase/Showcase/Pages/Tokens/Dimension/Size/NamedSize/NamedSize+IconWithTypography.swift @@ -0,0 +1,209 @@ +// +// Software Name: OUDS iOS +// SPDX-FileCopyrightText: Copyright (c) Orange SA +// SPDX-License-Identifier: MIT +// +// This software is distributed under the MIT license, +// the text of which is available at https://opensource.org/license/MIT/ +// or see the "LICENSE" file for more details. +// +// Authors: See CONTRIBUTORS.txt +// Software description: A SwiftUI components library with code examples for Orange Unified Design System +// + +import OUDS +import OUDSTokensSemantic +import SwiftUICore + +extension NamedSize { + + enum IconWithTypography: String, CaseIterable { + case sizeIconWithHeadingXLargeShort + case sizeIconWithHeadingXLargeMedium + case sizeIconWithHeadingXLargeTall + case sizeIconWithHeadingLargeShort + case sizeIconWithHeadingLargeMedium + case sizeIconWithHeadingLargeTall + case sizeIconWithHeadingMediumShort + case sizeIconWithHeadingMediumMedium + case sizeIconWithHeadingMediumTall + case sizeIconWithHeadingSmallShort + case sizeIconWithHeadingSmallMedium + case sizeIconWithHeadingSmallTall + case sizeIconWithBodyLargeShort + case sizeIconWithBodyLargeMedium + case sizeIconWithBodyLargeTall + case sizeIconWithBodyMediumShort + case sizeIconWithBodyMediumMedium + case sizeIconWithBodyMediumTall + case sizeIconWithBodySmallShort + case sizeIconWithBodySmallMedium + case sizeIconWithBodySmallTall + case sizeIconWithLabelXLargeSizeShort + case sizeIconWithLabelXLargeSizeMedium + case sizeIconWithLabelXLargeSizeTall + case sizeIconWithLabelLargeSizeShorter + case sizeIconWithLabelLargeSizeShort + case sizeIconWithLabelLargeSizeMedium + case sizeIconWithLabelLargeSizeTall + case sizeIconWithLabelLargeSizeTaller + case sizeIconWithLabelMediumSizeShort + case sizeIconWithLabelMediumSizeMedium + case sizeIconWithLabelMediumSizeTall + case sizeIconWithLabelSmallSizeShort + case sizeIconWithLabelSmallSizeMedium + case sizeIconWithLabelSmallSizeTall + + var namedTypography: NamedTypography { + switch self { + case .sizeIconWithHeadingXLargeShort: + return .headingXLarge + case .sizeIconWithHeadingXLargeMedium: + return .headingXLarge + case .sizeIconWithHeadingXLargeTall: + return .headingXLarge + case .sizeIconWithHeadingLargeShort: + return .headingLarge + case .sizeIconWithHeadingLargeMedium: + return .headingLarge + case .sizeIconWithHeadingLargeTall: + return .headingLarge + case .sizeIconWithHeadingMediumShort: + return .headingMedium + case .sizeIconWithHeadingMediumMedium: + return .headingMedium + case .sizeIconWithHeadingMediumTall: + return .headingMedium + case .sizeIconWithHeadingSmallShort: + return .headingSmall + case .sizeIconWithHeadingSmallMedium: + return .headingSmall + case .sizeIconWithHeadingSmallTall: + return .headingSmall + case .sizeIconWithBodyLargeShort: + return .bodyDefaultLarge + case .sizeIconWithBodyLargeMedium: + return .bodyDefaultLarge + case .sizeIconWithBodyLargeTall: + return .bodyDefaultLarge + case .sizeIconWithBodyMediumShort: + return .bodyDefaultMedium + case .sizeIconWithBodyMediumMedium: + return .bodyDefaultMedium + case .sizeIconWithBodyMediumTall: + return .bodyDefaultMedium + case .sizeIconWithBodySmallShort: + return .bodyDefaultSmall + case .sizeIconWithBodySmallMedium: + return .bodyDefaultSmall + case .sizeIconWithBodySmallTall: + return .bodyDefaultSmall + case .sizeIconWithLabelXLargeSizeShort: + return .labelDefaultXLarge + case .sizeIconWithLabelXLargeSizeMedium: + return .labelDefaultXLarge + case .sizeIconWithLabelXLargeSizeTall: + return .labelDefaultXLarge + case .sizeIconWithLabelLargeSizeShorter: + return .labelDefaultXLarge + case .sizeIconWithLabelLargeSizeShort: + return .labelDefaultLarge + case .sizeIconWithLabelLargeSizeMedium: + return .labelDefaultLarge + case .sizeIconWithLabelLargeSizeTall: + return .labelDefaultLarge + case .sizeIconWithLabelLargeSizeTaller: + return .labelDefaultLarge + case .sizeIconWithLabelMediumSizeShort: + return .labelDefaultMedium + case .sizeIconWithLabelMediumSizeMedium: + return .labelDefaultMedium + case .sizeIconWithLabelMediumSizeTall: + return .labelDefaultMedium + case .sizeIconWithLabelSmallSizeShort: + return .labelDefaultSmall + case .sizeIconWithLabelSmallSizeMedium: + return .labelDefaultSmall + case .sizeIconWithLabelSmallSizeTall: + return .labelDefaultSmall + } + } + + // swiftlint:disable function_body_length + func token(fot theme: OUDSTheme, userInterfaceSizeClass: UserInterfaceSizeClass) -> SizeSemanticToken { + switch self { + case .sizeIconWithHeadingXLargeShort: + return theme.sizeIconWithHeadingXLargeShort.dimension(for: userInterfaceSizeClass) + case .sizeIconWithHeadingXLargeMedium: + return theme.sizeIconWithHeadingXLargeMedium.dimension(for: userInterfaceSizeClass) + case .sizeIconWithHeadingXLargeTall: + return theme.sizeIconWithHeadingXLargeTall.dimension(for: userInterfaceSizeClass) + case .sizeIconWithHeadingLargeShort: + return theme.sizeIconWithHeadingLargeShort.dimension(for: userInterfaceSizeClass) + case .sizeIconWithHeadingLargeMedium: + return theme.sizeIconWithHeadingLargeMedium.dimension(for: userInterfaceSizeClass) + case .sizeIconWithHeadingLargeTall: + return theme.sizeIconWithHeadingLargeTall.dimension(for: userInterfaceSizeClass) + case .sizeIconWithHeadingMediumShort: + return theme.sizeIconWithHeadingMediumShort.dimension(for: userInterfaceSizeClass) + case .sizeIconWithHeadingMediumMedium: + return theme.sizeIconWithHeadingMediumMedium.dimension(for: userInterfaceSizeClass) + case .sizeIconWithHeadingMediumTall: + return theme.sizeIconWithHeadingMediumTall.dimension(for: userInterfaceSizeClass) + case .sizeIconWithHeadingSmallShort: + return theme.sizeIconWithHeadingSmallShort.dimension(for: userInterfaceSizeClass) + case .sizeIconWithHeadingSmallMedium: + return theme.sizeIconWithHeadingSmallMedium.dimension(for: userInterfaceSizeClass) + case .sizeIconWithHeadingSmallTall: + return theme.sizeIconWithHeadingSmallTall.dimension(for: userInterfaceSizeClass) + case .sizeIconWithBodyLargeShort: + return theme.sizeIconWithBodyLargeShort.dimension(for: userInterfaceSizeClass) + case .sizeIconWithBodyLargeMedium: + return theme.sizeIconWithBodyLargeMedium.dimension(for: userInterfaceSizeClass) + case .sizeIconWithBodyLargeTall: + return theme.sizeIconWithBodyLargeTall.dimension(for: userInterfaceSizeClass) + case .sizeIconWithBodyMediumShort: + return theme.sizeIconWithBodyMediumShort.dimension(for: userInterfaceSizeClass) + case .sizeIconWithBodyMediumMedium: + return theme.sizeIconWithBodyMediumMedium.dimension(for: userInterfaceSizeClass) + case .sizeIconWithBodyMediumTall: + return theme.sizeIconWithBodyMediumTall.dimension(for: userInterfaceSizeClass) + case .sizeIconWithBodySmallShort: + return theme.sizeIconWithBodySmallShort.dimension(for: userInterfaceSizeClass) + case .sizeIconWithBodySmallMedium: + return theme.sizeIconWithBodySmallMedium.dimension(for: userInterfaceSizeClass) + case .sizeIconWithBodySmallTall: + return theme.sizeIconWithBodySmallTall.dimension(for: userInterfaceSizeClass) + case .sizeIconWithLabelXLargeSizeShort: + return theme.sizeIconWithLabelXLargeSizeShort + case .sizeIconWithLabelXLargeSizeMedium: + return theme.sizeIconWithLabelXLargeSizeMedium + case .sizeIconWithLabelXLargeSizeTall: + return theme.sizeIconWithLabelXLargeSizeTall + case .sizeIconWithLabelLargeSizeShorter: + return theme.sizeIconWithLabelLargeSizeShorter + case .sizeIconWithLabelLargeSizeShort: + return theme.sizeIconWithLabelLargeSizeShort + case .sizeIconWithLabelLargeSizeMedium: + return theme.sizeIconWithLabelLargeSizeMedium + case .sizeIconWithLabelLargeSizeTall: + return theme.sizeIconWithLabelLargeSizeTall + case .sizeIconWithLabelLargeSizeTaller: + return theme.sizeIconWithLabelLargeSizeTaller + case .sizeIconWithLabelMediumSizeShort: + return theme.sizeIconWithLabelMediumSizeShort + case .sizeIconWithLabelMediumSizeMedium: + return theme.sizeIconWithLabelMediumSizeMedium + case .sizeIconWithLabelMediumSizeTall: + return theme.sizeIconWithLabelMediumSizeTall + case .sizeIconWithLabelSmallSizeShort: + return theme.sizeIconWithLabelSmallSizeShort + case .sizeIconWithLabelSmallSizeMedium: + return theme.sizeIconWithLabelSmallSizeMedium + case .sizeIconWithLabelSmallSizeTall: + return theme.sizeIconWithLabelSmallSizeTall + } + } + // swiftlint:enable function_body_length + } +} diff --git a/Showcase/Showcase/Pages/Tokens/Dimension/Size/SizeTokenPage.swift b/Showcase/Showcase/Pages/Tokens/Dimension/Size/SizeTokenPage.swift index dad4dd435..5877029bd 100644 --- a/Showcase/Showcase/Pages/Tokens/Dimension/Size/SizeTokenPage.swift +++ b/Showcase/Showcase/Pages/Tokens/Dimension/Size/SizeTokenPage.swift @@ -19,26 +19,33 @@ struct SizeTokenPage: View { @Environment(\.theme) private var theme @Environment(\.horizontalSizeClass) private var horizontalSizeClass - @Environment(\.verticalSizeClass) private var verticalSizeClass @Environment(\.colorScheme) private var colorScheme // MARK: Body var body: some View { - VStack(alignment: .leading, spacing: theme.spaceFixedNone) { - ForEach(NamedSizing.allCases, id: \.rawValue) { sizingName in - illustration(for: sizingName) + Group { + Section { illustrationForIconDecorative() } header: { + header("app_tokens_dimension_size_iconDecorative_label") + } + Section { illustrationIconWithLabel() } header: { + header("app_tokens_dimension_size_iconWithLabel_label") } } - .frame(maxWidth: .infinity) .padding(.horizontal, theme.spaceFixedMedium) } - // MARK: Private helpers + // MARK: Illustration icon decorative - private func illustration(for namedSizing: NamedSizing) -> some View { - let token = namedSizing.token(from: theme) - let name = namedSizing.rawValue + private func illustrationForIconDecorative() -> some View { + ForEach(NamedSize.IconDecorative.allCases, id: \.rawValue) { namedSize in + illustrationIconDecorative(for: namedSize) + } + } + + private func illustrationIconDecorative(for namedSize: NamedSize.IconDecorative) -> some View { + let token = namedSize.token(from: theme) + let name = namedSize.rawValue let value = String(format: "(%.0f) pt", token) return ShowcaseTokenIllustration(tokenName: name, tokenValue: value) { @@ -50,41 +57,52 @@ struct SizeTokenPage: View { Image("ic_token") .resizable() .renderingMode(.template) - .foregroundColor(.blue) + .foregroundColor(theme.colorAlwaysInfo.color(for: colorScheme)) .frame(width: token, height: token, alignment: .center) .accessibilityHidden(true) } } } -} -// MARK: - Named Spacing - -private enum NamedSizing: String, CaseIterable { - case sizeIconDecorativeShortest - case sizeIconDecorativeShorter - case sizeIconDecorativeShort - case sizeIconDecorativeMedium - case sizeIconDecorativeTall - case sizeIconDecorativeTaller - case sizeIconDecorativeTallest - - func token(from theme: OUDSTheme) -> SizeSemanticToken { - switch self { - case .sizeIconDecorativeShortest: - return theme.sizeIconDecorativeShortest - case .sizeIconDecorativeShorter: - return theme.sizeIconDecorativeShorter - case .sizeIconDecorativeShort: - return theme.sizeIconDecorativeShort - case .sizeIconDecorativeMedium: - return theme.sizeIconDecorativeMedium - case .sizeIconDecorativeTall: - return theme.sizeIconDecorativeTall - case .sizeIconDecorativeTaller: - return theme.sizeIconDecorativeTaller - case .sizeIconDecorativeTallest: - return theme.sizeIconDecorativeTallest + // MARK: Illustration icon with label + + private func illustrationIconWithLabel() -> some View { + ForEach(NamedSize.IconWithTypography.allCases, id: \.rawValue) { namedIconSize in + illustrationIconWithLabel(for: namedIconSize) } } + + @ViewBuilder + private func illustrationIconWithLabel(for namedSize: NamedSize.IconWithTypography) -> some View { + let token = namedSize.token(fot: theme, userInterfaceSizeClass: horizontalSizeClass ?? .regular) + let namedTypography = namedSize.namedTypography + let value = String(format: "\(namedSize.rawValue) (%.0f) pt", token) + + HStack { + Image("ic_token") + .resizable() + .renderingMode(.template) + .foregroundColor(theme.colorAlwaysInfo.color(for: colorScheme)) + .frame(width: token, height: token, alignment: .center) + .accessibilityHidden(true) + + VStack(alignment: .leading) { + illustration(for: namedTypography, in: theme) + .foregroundStyle(theme.colorContentDefault.color(for: colorScheme)) + Text(value) + .typeBodyDefaultMedium(theme) + .foregroundStyle(theme.colorContentMuted.color(for: colorScheme)) + } + } + } + + // MARK: Common helpers + + private func header(_ text: LocalizedStringKey) -> some View { + Text(text).showcaseSectionHeaderStyle() + } } + +// MARK: - Named Size + +enum NamedSize { } diff --git a/Showcase/Showcase/Pages/Tokens/Typography/NamedTypography/NamedTypography+Illustration.swift b/Showcase/Showcase/Pages/Tokens/Typography/NamedTypography/NamedTypography+Illustration.swift new file mode 100644 index 000000000..1323630d9 --- /dev/null +++ b/Showcase/Showcase/Pages/Tokens/Typography/NamedTypography/NamedTypography+Illustration.swift @@ -0,0 +1,82 @@ +// +// Software Name: OUDS iOS +// SPDX-FileCopyrightText: Copyright (c) Orange SA +// SPDX-License-Identifier: MIT +// +// This software is distributed under the MIT license, +// the text of which is available at https://opensource.org/license/MIT/ +// or see the "LICENSE" file for more details. +// +// Authors: See CONTRIBUTORS.txt +// Software description: A SwiftUI components library with code examples for Orange Unified Design System +// + +import OUDS +import OUDSTokensSemantic +import SwiftUI + +// MARK: - Token Illustration + +// Used in Typography screen and SizeIconWithLabel +extension View { + + @ViewBuilder + func illustration(for namedTypography: NamedTypography, in theme: OUDSTheme) -> some View { + switch namedTypography { + case .displayLarge: + Text(namedTypography.rawValue.camelCase).typeDisplayLarge(theme) + case .displayMedium: + Text(namedTypography.rawValue.camelCase).typeDisplayMedium(theme) + case .displaySmall: + Text(namedTypography.rawValue.camelCase).typeDisplaySmall(theme) + case .headingXLarge: + Text(namedTypography.rawValue.camelCase).typeHeadingXLarge(theme) + case .headingLarge: + Text(namedTypography.rawValue.camelCase).typeHeadingLarge(theme) + case .headingMedium: + Text(namedTypography.rawValue.camelCase).typeHeadingMedium(theme) + case .headingSmall: + Text(namedTypography.rawValue.camelCase).typeHeadingSmall(theme) + case .bodyDefaultLarge: + Text(namedTypography.rawValue.camelCase).typeBodyDefaultLarge(theme) + case .bodyDefaultMedium: + Text(namedTypography.rawValue.camelCase).typeBodyDefaultMedium(theme) + case .bodyDefaultSmall: + Text(namedTypography.rawValue.camelCase).typeBodyDefaultSmall(theme) + case .bodyStrongLarge: + Text(namedTypography.rawValue.camelCase).typeBodyStrongLarge(theme) + case .bodyStrongMedium: + Text(namedTypography.rawValue.camelCase).typeBodyStrongMedium(theme) + case .bodyStrongSmall: + Text(namedTypography.rawValue.camelCase).typeBodyStrongSmall(theme) + case .labelDefaultXLarge: + Text(namedTypography.rawValue.camelCase).typeLabelDefaultXLarge(theme) + case .labelDefaultLarge: + Text(namedTypography.rawValue.camelCase).typeLabelDefaultLarge(theme) + case .labelDefaultMedium: + Text(namedTypography.rawValue.camelCase).typeLabelDefaultMedium(theme) + case .labelDefaultSmall: + Text(namedTypography.rawValue.camelCase).typeLabelDefaultSmall(theme) + case .labelStrongXLarge: + Text(namedTypography.rawValue.camelCase).typeLabelStrongXLarge(theme) + case .labelStrongLarge: + Text(namedTypography.rawValue.camelCase).typeLabelStrongLarge(theme) + case .labelStrongMedium: + Text(namedTypography.rawValue.camelCase).typeLabelStrongMedium(theme) + case .labelStrongSmall: + Text(namedTypography.rawValue.camelCase).typeLabelStrongSmall(theme) + case .codeSmall: + Text(namedTypography.rawValue.camelCase).typeCodeMedium(theme) + case .codeMedium: + Text(namedTypography.rawValue.camelCase).typeCodeMedium(theme) + } + } +} + +extension String { + // swiftlint:disable strict_fileprivate + fileprivate var camelCase: String { + self.prefix(1).capitalized + self.dropFirst() + } + // swiftlint:enable strict_fileprivate +} diff --git a/Showcase/Showcase/Pages/Tokens/Typography/NamedTypography/NamedTypography.swift b/Showcase/Showcase/Pages/Tokens/Typography/NamedTypography/NamedTypography.swift new file mode 100644 index 000000000..ee97cd0bb --- /dev/null +++ b/Showcase/Showcase/Pages/Tokens/Typography/NamedTypography/NamedTypography.swift @@ -0,0 +1,97 @@ +// +// Software Name: OUDS iOS +// SPDX-FileCopyrightText: Copyright (c) Orange SA +// SPDX-License-Identifier: MIT +// +// This software is distributed under the MIT license, +// the text of which is available at https://opensource.org/license/MIT/ +// or see the "LICENSE" file for more details. +// +// Authors: See CONTRIBUTORS.txt +// Software description: A SwiftUI components library with code examples for Orange Unified Design System +// + +import OUDS +import OUDSTokensSemantic +import SwiftUI + +// MARK: - Named Typography + +enum NamedTypography: String, CaseIterable { + case displayLarge + case displayMedium + case displaySmall + case headingXLarge + case headingLarge + case headingMedium + case headingSmall + case bodyDefaultLarge + case bodyDefaultMedium + case bodyDefaultSmall + case bodyStrongLarge + case bodyStrongMedium + case bodyStrongSmall + case labelDefaultXLarge + case labelDefaultLarge + case labelDefaultMedium + case labelDefaultSmall + case labelStrongXLarge + case labelStrongLarge + case labelStrongMedium + case labelStrongSmall + case codeMedium + case codeSmall + + // MARK: - Token Values + + func token(from theme: OUDSTheme) -> MultipleTypographyTokens { + switch self { + case .displayLarge: + return theme.typeDisplayLarge + case .displayMedium: + return theme.typeDisplayMedium + case .displaySmall: + return theme.typeDisplaySmall + case .headingXLarge: + return theme.typeHeadingXLarge + case .headingLarge: + return theme.typeHeadingLarge + case .headingMedium: + return theme.typeHeadingMedium + case .headingSmall: + return theme.typeHeadingSmall + case .bodyDefaultLarge: + return theme.typeBodyDefaultLarge + case .bodyDefaultMedium: + return theme.typeBodyDefaultMedium + case .bodyDefaultSmall: + return theme.typeBodyDefaultSmall + case .bodyStrongLarge: + return theme.typeBodyStrongLarge + case .bodyStrongMedium: + return theme.typeBodyStrongMedium + case .bodyStrongSmall: + return theme.typeBodyStrongSmall + case .labelDefaultXLarge: + return theme.typeLabelDefaultXLarge + case .labelDefaultLarge: + return theme.typeLabelDefaultLarge + case .labelDefaultMedium: + return theme.typeLabelDefaultMedium + case .labelDefaultSmall: + return theme.typeLabelDefaultSmall + case .labelStrongXLarge: + return theme.typeLabelStrongXLarge + case .labelStrongLarge: + return theme.typeLabelStrongLarge + case .labelStrongMedium: + return theme.typeLabelStrongMedium + case .labelStrongSmall: + return theme.typeLabelStrongSmall + case .codeSmall: + return theme.typeCodeSmall + case .codeMedium: + return theme.typeCodeMedium + } + } +} diff --git a/Showcase/Showcase/Pages/Tokens/Typography/TypographyTokenPage.swift b/Showcase/Showcase/Pages/Tokens/Typography/TypographyTokenPage.swift index a2d185a08..0c74a947e 100644 --- a/Showcase/Showcase/Pages/Tokens/Typography/TypographyTokenPage.swift +++ b/Showcase/Showcase/Pages/Tokens/Typography/TypographyTokenPage.swift @@ -21,6 +21,7 @@ struct TypographyTokenPage: View { @Environment(\.theme) private var theme @Environment(\.colorScheme) private var colorScheme + @Environment(\.horizontalSizeClass) private var horizontalSizeClass // MARK: Body @@ -30,7 +31,6 @@ struct TypographyTokenPage: View { illustration(from: typographyName) } } - .frame(maxWidth: .infinity, alignment: .leading) .padding(.horizontal, theme.spaceFixedMedium) .navigationTitle(LocalizedStringKey("app_tokens_typography_label")) } @@ -39,10 +39,11 @@ struct TypographyTokenPage: View { @ViewBuilder private func illustration(from namedTypography: NamedTypography) -> some View { - let token = namedTypography.token(from: theme).compact + let horizontalSizeClass = horizontalSizeClass ?? .regular + let token = namedTypography.token(from: theme).typographyToken(for: horizontalSizeClass) VStack(alignment: .leading, spacing: theme.spaceFixedNone) { - typgraphyIllustration(from: namedTypography) + illustration(for: namedTypography, in: theme) .foregroundStyle(theme.colorContentDefault.color(for: colorScheme)) Group { @@ -59,141 +60,4 @@ struct TypographyTokenPage: View { .frame(maxWidth: .infinity, alignment: .leading) .padding(.vertical, theme.spaceFixedShorter) } - - @ViewBuilder - private func typgraphyIllustration(from namedTypography: NamedTypography) -> some View { - switch namedTypography { - case .displayLarge: - Text(namedTypography.rawValue.camelCase).typeDisplayLarge(theme) - case .displayMedium: - Text(namedTypography.rawValue.camelCase).typeDisplayMedium(theme) - case .displaySmall: - Text(namedTypography.rawValue.camelCase).typeDisplaySmall(theme) - case .headingXLarge: - Text(namedTypography.rawValue.camelCase).typeHeadingXLarge(theme) - case .headingLarge: - Text(namedTypography.rawValue.camelCase).typeHeadingLarge(theme) - case .headingMedium: - Text(namedTypography.rawValue.camelCase).typeHeadingMedium(theme) - case .headingSmall: - Text(namedTypography.rawValue.camelCase).typeHeadingSmall(theme) - case .bodyDefaultLarge: - Text(namedTypography.rawValue.camelCase).typeBodyDefaultLarge(theme) - case .bodyDefaultMedium: - Text(namedTypography.rawValue.camelCase).typeBodyDefaultMedium(theme) - case .bodyDefaultSmall: - Text(namedTypography.rawValue.camelCase).typeBodyDefaultSmall(theme) - case .bodyStrongLarge: - Text(namedTypography.rawValue.camelCase).typeBodyStrongLarge(theme) - case .bodyStrongMedium: - Text(namedTypography.rawValue.camelCase).typeBodyStrongMedium(theme) - case .bodyStrongSmall: - Text(namedTypography.rawValue.camelCase).typeBodyStrongSmall(theme) - case .labelDefaultXLarge: - Text(namedTypography.rawValue.camelCase).typeLabelDefaultXLarge(theme) - case .labelDefaultLarge: - Text(namedTypography.rawValue.camelCase).typeLabelDefaultLarge(theme) - case .labelDefaultMedium: - Text(namedTypography.rawValue.camelCase).typeLabelDefaultMedium(theme) - case .labelDefaultSmall: - Text(namedTypography.rawValue.camelCase).typeLabelDefaultSmall(theme) - case .labelStrongXLarge: - Text(namedTypography.rawValue.camelCase).typeLabelStrongXLarge(theme) - case .labelStrongLarge: - Text(namedTypography.rawValue.camelCase).typeLabelStrongLarge(theme) - case .labelStrongMedium: - Text(namedTypography.rawValue.camelCase).typeLabelStrongMedium(theme) - case .labelStrongSmall: - Text(namedTypography.rawValue.camelCase).typeLabelStrongSmall(theme) - case .codeSmall: - Text(namedTypography.rawValue.camelCase).typeCodeMedium(theme) - case .codeMedium: - Text(namedTypography.rawValue.camelCase).typeCodeMedium(theme) - } - } -} - -extension String { - var camelCase: String { - self.prefix(1).capitalized + self.dropFirst() - } -} - -// MARK: - Named Typography - -private enum NamedTypography: String, CaseIterable { - case displayLarge - case displayMedium - case displaySmall - case headingXLarge - case headingLarge - case headingMedium - case headingSmall - case bodyDefaultLarge - case bodyDefaultMedium - case bodyDefaultSmall - case bodyStrongLarge - case bodyStrongMedium - case bodyStrongSmall - case labelDefaultXLarge - case labelDefaultLarge - case labelDefaultMedium - case labelDefaultSmall - case labelStrongXLarge - case labelStrongLarge - case labelStrongMedium - case labelStrongSmall - case codeMedium - case codeSmall - - func token(from theme: OUDSTheme) -> MultipleTypographyTokens { - switch self { - case .displayLarge: - return theme.typeDisplayLarge - case .displayMedium: - return theme.typeDisplayMedium - case .displaySmall: - return theme.typeDisplaySmall - case .headingXLarge: - return theme.typeHeadingXLarge - case .headingLarge: - return theme.typeHeadingLarge - case .headingMedium: - return theme.typeHeadingMedium - case .headingSmall: - return theme.typeHeadingSmall - case .bodyDefaultLarge: - return theme.typeBodyDefaultLarge - case .bodyDefaultMedium: - return theme.typeBodyDefaultMedium - case .bodyDefaultSmall: - return theme.typeBodyDefaultSmall - case .bodyStrongLarge: - return theme.typeBodyStrongLarge - case .bodyStrongMedium: - return theme.typeBodyStrongMedium - case .bodyStrongSmall: - return theme.typeBodyStrongSmall - case .labelDefaultXLarge: - return theme.typeLabelDefaultXLarge - case .labelDefaultLarge: - return theme.typeLabelDefaultLarge - case .labelDefaultMedium: - return theme.typeLabelDefaultMedium - case .labelDefaultSmall: - return theme.typeLabelDefaultSmall - case .labelStrongXLarge: - return theme.typeLabelStrongXLarge - case .labelStrongLarge: - return theme.typeLabelStrongLarge - case .labelStrongMedium: - return theme.typeLabelStrongMedium - case .labelStrongSmall: - return theme.typeLabelStrongSmall - case .codeSmall: - return theme.typeCodeSmall - case .codeMedium: - return theme.typeCodeMedium - } - } } diff --git a/Showcase/Showcase/Resources/en.lproj/Localizable.strings b/Showcase/Showcase/Resources/en.lproj/Localizable.strings index 8fb65da79..5143bd35c 100644 --- a/Showcase/Showcase/Resources/en.lproj/Localizable.strings +++ b/Showcase/Showcase/Resources/en.lproj/Localizable.strings @@ -51,6 +51,8 @@ "app_tokens_dimension_size_label" = "Size"; "app_tokens_dimension_size_description_text" = "Size refers to the specific measurements used to define the dimensions of UI elements within the design system."; +"app_tokens_dimension_size_iconWithLabel_label" = "Icon with label"; +"app_tokens_dimension_size_iconDecorative_label" = "Icon decorative"; "app_tokens_elevation_label" = "Elevation"; "app_tokens_elevation_description_text" = "Shadows are used to give the impression of distance or elevation between surfaces, which adds depth to our designs."; From 0e46c42db82bde61a962abe5f4adcec558180ede Mon Sep 17 00:00:00 2001 From: Pierre-Yves Lapersonne Date: Tue, 29 Oct 2024 14:01:22 +0100 Subject: [PATCH 25/30] ci: add GitHub Actions workflow to build the demo app and test the iOS library (#259) Signed-off-by: Pierre-Yves Lapersonne --- .github/DEVELOP.md | 22 ++++++-- .github/workflows/build-and-test.yml | 82 ++++++++++++++++++++++++++++ .gitignore | 3 + CHANGELOG.md | 1 + Showcase/fastlane/Fastfile | 31 ++++++++--- 5 files changed, 127 insertions(+), 12 deletions(-) create mode 100644 .github/workflows/build-and-test.yml diff --git a/.github/DEVELOP.md b/.github/DEVELOP.md index 88368fbf5..0783b0830 100644 --- a/.github/DEVELOP.md +++ b/.github/DEVELOP.md @@ -279,9 +279,23 @@ Do not forget if possible to enable the warnings in the end of the file to reduc ## CI/CD -We use GitLab CI for CI/CD with our own runners so as to keep private our sensitive files likes certificates and provisioning profiles. +### GitHub Action + +We use also *GitHub Actions* so as to define a workflow with some actions to build demo application and test the library. +It will help use to ensure code on pull requests or being merged compiles and has all tests green. +This workflow is defined in [this YAML](https://github.com/Orange-OpenSource/ouds-ios/blob/develop/.github/workflows/build-and-test.yml) + +We have also a *gitleaks* workflow making some scans on the code to loook fo secrets leaks, defined in [this YAML](https://github.com/Orange-OpenSource/ouds-ios/blob/develop/.github/workflows/gitleaks-action.yml). + +We use also two GitHub apps making controls on pull requests and defining wether or not prerequisites are filled or not. +There is on control to check if [PR template are all defined ](https://github.com/stilliard/github-task-list-completed), and one if [DCO is applied](https://probot.github.io/apps/dco/). + +### GitLab CI (internal) + +We use *GitLab CI*for CI/CD with our own runners so as to keep private our sensitive files likes certificates and provisioning profiles. Our currant plan does not allow to make GitHub mirroring, so we use GitHub HTTP REST API to download sources, before using Xcode to build and sign. -If you want to set up your runners, feel free to have a look on */docs_release/README.md* -However of course you will have to define all the variables, secrets and have the mandatory files listed above. +However of course you will have to define all the variables, secrets and have the mandatory files. + +You can find more details about the pipelines, how to set up runners and scripts to use [in the wiki](https://github.com/Orange-OpenSource/ouds-ios/wiki/5-%E2%80%90-About-continuous-integration-and-delivery). -You can find more details about the pipelines and script [in the wiki](https://github.com/Orange-OpenSource/ouds-ios/wiki/5-%E2%80%90-About-continuous-integration-and-delivery). +In few words, there is a pipeline containing some stages and jobs to build alpha, nightly/beta and production releases. diff --git a/.github/workflows/build-and-test.yml b/.github/workflows/build-and-test.yml new file mode 100644 index 000000000..8674651de --- /dev/null +++ b/.github/workflows/build-and-test.yml @@ -0,0 +1,82 @@ +# +# Software Name: Orange Unified Design System +# SPDX-FileCopyrightText: Copyright (c) Orange SA +# SPDX-License-Identifier: MIT +# +# This software is distributed under the MIT license, +# the text of which is available at https://opensource.org/license/MIT/ +# or see the "LICENSE" file for more details. +# +# Authors: See CONTRIBUTORS.txt +# Software description: A SwiftUI components library with code examples for Orange Unified Design System +# + +name: Build and Test + +on: + # For protected and most important branches + push: + branches: + - main + - develop + + # To trigger manually + workflow_dispatch: + + # Pull request events + pull_request: + types: + - opened + - synchronize + +jobs: + # Build the app (if there are linter errors or compiler issues, it will fail) + build: + runs-on: macos-latest + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Set up Xcode 16 + run: | + sudo xcode-select -s /Applications/Xcode_16.app/Contents/Developer + + - name: Set up Ruby + uses: ruby/setup-ruby@v1 + with: + ruby-version: '3.1' + + - name: Install Fastlane + run: | + bundle install + + - name: Build demo app + run: | + cd Showcase + bundle exec fastlane buildDebugApp + + # Test the library with unit tests + test: + runs-on: macos-latest + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Set up Xcode 16 + run: | + sudo xcode-select -s /Applications/Xcode_16.app/Contents/Developer + + - name: Set up Ruby + uses: ruby/setup-ruby@v1 + with: + ruby-version: '3.1' + + - name: Install Fastlane + run: | + bundle install + + - name: Run unit tests on demo app + run: | + cd Showcase + bundle exec pod install + bundle exec fastlane ios test diff --git a/.gitignore b/.gitignore index 2bd1c0ed8..39a2eced5 100644 --- a/.gitignore +++ b/.gitignore @@ -27,6 +27,9 @@ /Showcase/Showcase.xcworkspace/xcuserdata/ /DerivedData/ +# Produced by Fastlane +/Showcase/build/ + # Produced by Swift Package Manager /.swiftpm/xcode/xcshareddata/ /.swiftpm/xcode/xcuserdata/ diff --git a/CHANGELOG.md b/CHANGELOG.md index 7b3a94878..ff895597b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added +- [Tool] GitHub Actions workflow for CI/CD ([#256](https://github.com/Orange-OpenSource/ouds-ios/issues/256)) - [DemoApp] Add new tokens in size tokens page ([#245](https://github.com/Orange-OpenSource/ouds-ios/issues/245)) - [Library] Semantic token `borderWidthFocusInset` (value of `borderWidth100`) ([#207](https://github.com/Orange-OpenSource/ouds-ios/issues/207), [#241](https://github.com/Orange-OpenSource/ouds-ios/issues/241)) - [Library] Semantic token `fontWeightCode` ([#242](https://github.com/Orange-OpenSource/ouds-ios/issues/242)) diff --git a/Showcase/fastlane/Fastfile b/Showcase/fastlane/Fastfile index 38edd484e..610381d01 100644 --- a/Showcase/fastlane/Fastfile +++ b/Showcase/fastlane/Fastfile @@ -100,10 +100,17 @@ platform :ios do device: device, skip_build: true) - publish_mattermost_notification("🧪 ✅ No issue with tests") - + if MATTERMOST_HOOK_URL.nil? || MATTERMOST_HOOK_URL.empty? + puts "ℹ️ No MATTERMOST_HOOK_URL defined, it could mean this lane is called on GitHub Action workflow or locally" + else + publish_mattermost_notification("🧪 ✅ No issue with tests") + end rescue => error - publish_mattermost_notification("🧪 🚨 @channel Some issue occured with tests (:test)") + if MATTERMOST_HOOK_URL.nil? || MATTERMOST_HOOK_URL.empty? + puts "ℹ️ No MATTERMOST_HOOK_URL defined, it could mean this lane is called on GitHub Action workflow or locally" + else + publish_mattermost_notification("🧪 🚨 @channel Some issue occured with tests (:test)") + end raise error end end @@ -125,10 +132,17 @@ platform :ios do skip_build: true ) - publish_mattermost_notification("🧪 ✅ No issue with UI tests") - + if MATTERMOST_HOOK_URL.nil? || MATTERMOST_HOOK_URL.empty? + puts "ℹ️ No MATTERMOST_HOOK_URL defined, it could mean this lane is called on GitHub Action workflow or locally" + else + publish_mattermost_notification("🧪 ✅ No issue with UI tests") + end rescue => error - publish_mattermost_notification("🧪 🚨 @channel Some issue occured with tests (:test_ui)") + if MATTERMOST_HOOK_URL.nil? || MATTERMOST_HOOK_URL.empty? + puts "ℹ️ No MATTERMOST_HOOK_URL defined, it could mean this lane is called on GitHub Action workflow or locally" + else + publish_mattermost_notification("🧪 🚨 @channel Some issue occured with tests (:test_ui)") + end raise error end end @@ -167,10 +181,11 @@ platform :ios do scheme: OUDS_SCHEME, output_directory: 'build/', archive_path: 'build/', - output_name: 'oudsApp', + output_name: 'odsApp', configuration: 'Debug', include_symbols: true, - export_method: 'development' + skip_archive: true, + destination: "generic/platform=iOS Simulator" ) end From e066257511820def18e0f060f2bd827da06081dd Mon Sep 17 00:00:00 2001 From: Pierre-Yves Lapersonne Date: Tue, 29 Oct 2024 15:06:12 +0100 Subject: [PATCH 26/30] feat: add app icons for debug/dev, alpha, beta and production releases (#260) Alpha, beta and production app icons have been provided by design team. Debug / dev app icon has been tinkered for our own local purposes. Closes #260 Signed-off-by: Pierre-Yves Lapersonne --- CHANGELOG.md | 1 + Showcase/Showcase.xcodeproj/project.pbxproj | 2 +- .../AppIconAlpha.appiconset/Contents.json | 14 +++ .../AppIconAlpha.appiconset/UDSDemo-A_SQR.png | Bin 0 -> 59090 bytes .../AppIconBeta.appiconset/Contents.json | 14 +++ .../AppIconBeta.appiconset/UDSDemo-B_SQR.png | Bin 0 -> 59617 bytes .../AppIconDebug.appiconset/Contents.json | 14 +++ .../UDSDemo-DEBUG_SQR.png | Bin 0 -> 28013 bytes .../App-Store-512@2x.png | Bin 62549 -> 0 bytes .../AppIconDev.appiconset/Contents.json | 116 ------------------ .../AppIconDev.appiconset/iPad-App-76@1x.png | Bin 5984 -> 0 bytes .../AppIconDev.appiconset/iPad-App-76@2x.png | Bin 12039 -> 0 bytes .../iPad-Notification-20@1x.png | Bin 1988 -> 0 bytes .../iPad-Notification-20@2x.png | Bin 3342 -> 0 bytes .../iPad-Pro-App-83.5@2x.png | Bin 12127 -> 0 bytes .../iPad-Settings-29@1x.png | Bin 2603 -> 0 bytes .../iPad-Settings-29@2x.png | Bin 4578 -> 0 bytes .../iPad-Spotlight-40@1x.png | Bin 3342 -> 0 bytes .../iPad-Spotlight-40@2x.png | Bin 6364 -> 0 bytes .../iPhone-App-60@2x.png | Bin 9469 -> 0 bytes .../iPhone-App-60@3x.png | Bin 12924 -> 0 bytes .../iPhone-Notification-20@2x.png | Bin 3342 -> 0 bytes .../iPhone-Notification-20@3x.png | Bin 4786 -> 0 bytes .../iPhone-Settings-29@2x.png | Bin 4578 -> 0 bytes .../iPhone-Settings-29@3x.png | Bin 6913 -> 0 bytes .../iPhone-Spotlight-40@2x.png | Bin 6364 -> 0 bytes .../iPhone-Spotlight-40@3x.png | Bin 9469 -> 0 bytes .../App-Store-512@2x.png | Bin 55398 -> 0 bytes .../AppIconQualif.appiconset/Contents.json | 116 ------------------ .../iPad-App-76@1x.png | Bin 5781 -> 0 bytes .../iPad-App-76@2x.png | Bin 11022 -> 0 bytes .../iPad-Notification-20@1x.png | Bin 1910 -> 0 bytes .../iPad-Notification-20@2x.png | Bin 3142 -> 0 bytes .../iPad-Pro-App-83.5@2x.png | Bin 10957 -> 0 bytes .../iPad-Settings-29@1x.png | Bin 2460 -> 0 bytes .../iPad-Settings-29@2x.png | Bin 4221 -> 0 bytes .../iPad-Spotlight-40@1x.png | Bin 3142 -> 0 bytes .../iPad-Spotlight-40@2x.png | Bin 5890 -> 0 bytes .../iPhone-App-60@2x.png | Bin 8676 -> 0 bytes .../iPhone-App-60@3x.png | Bin 11894 -> 0 bytes .../iPhone-Notification-20@2x.png | Bin 3142 -> 0 bytes .../iPhone-Notification-20@3x.png | Bin 4471 -> 0 bytes .../iPhone-Settings-29@2x.png | Bin 4221 -> 0 bytes .../iPhone-Settings-29@3x.png | Bin 6380 -> 0 bytes .../iPhone-Spotlight-40@2x.png | Bin 5890 -> 0 bytes .../iPhone-Spotlight-40@3x.png | Bin 8676 -> 0 bytes .../App-Store-512@2x.png | Bin 27679 -> 0 bytes .../AppIconRelease.appiconset/Contents.json | 108 +--------------- .../Unified_App_IOS_SQR.png | Bin 0 -> 35285 bytes .../iPad-App-76@1x.png | Bin 3886 -> 0 bytes .../iPad-App-76@2x.png | Bin 6264 -> 0 bytes .../iPad-Notification-20@1x.png | Bin 1705 -> 0 bytes .../iPad-Notification-20@2x.png | Bin 2518 -> 0 bytes .../iPad-Pro-App-83.5@2x.png | Bin 6658 -> 0 bytes .../iPad-Settings-29@1x.png | Bin 1979 -> 0 bytes .../iPad-Settings-29@2x.png | Bin 3106 -> 0 bytes .../iPad-Spotlight-40@1x.png | Bin 2518 -> 0 bytes .../iPad-Spotlight-40@2x.png | Bin 4001 -> 0 bytes .../iPhone-App-60@2x.png | Bin 5262 -> 0 bytes .../iPhone-App-60@3x.png | Bin 6986 -> 0 bytes .../iPhone-Notification-20@2x.png | Bin 2518 -> 0 bytes .../iPhone-Notification-20@3x.png | Bin 3313 -> 0 bytes .../iPhone-Settings-29@2x.png | Bin 3106 -> 0 bytes .../iPhone-Settings-29@3x.png | Bin 3920 -> 0 bytes .../iPhone-Spotlight-40@2x.png | Bin 4001 -> 0 bytes .../iPhone-Spotlight-40@3x.png | Bin 5262 -> 0 bytes Showcase/fastlane/Fastfile | 9 +- 67 files changed, 54 insertions(+), 340 deletions(-) create mode 100644 Showcase/Showcase/Resources/Assets.xcassets/AppIconAlpha.appiconset/Contents.json create mode 100644 Showcase/Showcase/Resources/Assets.xcassets/AppIconAlpha.appiconset/UDSDemo-A_SQR.png create mode 100644 Showcase/Showcase/Resources/Assets.xcassets/AppIconBeta.appiconset/Contents.json create mode 100644 Showcase/Showcase/Resources/Assets.xcassets/AppIconBeta.appiconset/UDSDemo-B_SQR.png create mode 100644 Showcase/Showcase/Resources/Assets.xcassets/AppIconDebug.appiconset/Contents.json create mode 100644 Showcase/Showcase/Resources/Assets.xcassets/AppIconDebug.appiconset/UDSDemo-DEBUG_SQR.png delete mode 100644 Showcase/Showcase/Resources/Assets.xcassets/AppIconDev.appiconset/App-Store-512@2x.png delete mode 100644 Showcase/Showcase/Resources/Assets.xcassets/AppIconDev.appiconset/Contents.json delete mode 100644 Showcase/Showcase/Resources/Assets.xcassets/AppIconDev.appiconset/iPad-App-76@1x.png delete mode 100644 Showcase/Showcase/Resources/Assets.xcassets/AppIconDev.appiconset/iPad-App-76@2x.png delete mode 100644 Showcase/Showcase/Resources/Assets.xcassets/AppIconDev.appiconset/iPad-Notification-20@1x.png delete mode 100644 Showcase/Showcase/Resources/Assets.xcassets/AppIconDev.appiconset/iPad-Notification-20@2x.png delete mode 100644 Showcase/Showcase/Resources/Assets.xcassets/AppIconDev.appiconset/iPad-Pro-App-83.5@2x.png delete mode 100644 Showcase/Showcase/Resources/Assets.xcassets/AppIconDev.appiconset/iPad-Settings-29@1x.png delete mode 100644 Showcase/Showcase/Resources/Assets.xcassets/AppIconDev.appiconset/iPad-Settings-29@2x.png delete mode 100644 Showcase/Showcase/Resources/Assets.xcassets/AppIconDev.appiconset/iPad-Spotlight-40@1x.png delete mode 100644 Showcase/Showcase/Resources/Assets.xcassets/AppIconDev.appiconset/iPad-Spotlight-40@2x.png delete mode 100644 Showcase/Showcase/Resources/Assets.xcassets/AppIconDev.appiconset/iPhone-App-60@2x.png delete mode 100644 Showcase/Showcase/Resources/Assets.xcassets/AppIconDev.appiconset/iPhone-App-60@3x.png delete mode 100644 Showcase/Showcase/Resources/Assets.xcassets/AppIconDev.appiconset/iPhone-Notification-20@2x.png delete mode 100644 Showcase/Showcase/Resources/Assets.xcassets/AppIconDev.appiconset/iPhone-Notification-20@3x.png delete mode 100644 Showcase/Showcase/Resources/Assets.xcassets/AppIconDev.appiconset/iPhone-Settings-29@2x.png delete mode 100644 Showcase/Showcase/Resources/Assets.xcassets/AppIconDev.appiconset/iPhone-Settings-29@3x.png delete mode 100644 Showcase/Showcase/Resources/Assets.xcassets/AppIconDev.appiconset/iPhone-Spotlight-40@2x.png delete mode 100644 Showcase/Showcase/Resources/Assets.xcassets/AppIconDev.appiconset/iPhone-Spotlight-40@3x.png delete mode 100644 Showcase/Showcase/Resources/Assets.xcassets/AppIconQualif.appiconset/App-Store-512@2x.png delete mode 100644 Showcase/Showcase/Resources/Assets.xcassets/AppIconQualif.appiconset/Contents.json delete mode 100644 Showcase/Showcase/Resources/Assets.xcassets/AppIconQualif.appiconset/iPad-App-76@1x.png delete mode 100644 Showcase/Showcase/Resources/Assets.xcassets/AppIconQualif.appiconset/iPad-App-76@2x.png delete mode 100644 Showcase/Showcase/Resources/Assets.xcassets/AppIconQualif.appiconset/iPad-Notification-20@1x.png delete mode 100644 Showcase/Showcase/Resources/Assets.xcassets/AppIconQualif.appiconset/iPad-Notification-20@2x.png delete mode 100644 Showcase/Showcase/Resources/Assets.xcassets/AppIconQualif.appiconset/iPad-Pro-App-83.5@2x.png delete mode 100644 Showcase/Showcase/Resources/Assets.xcassets/AppIconQualif.appiconset/iPad-Settings-29@1x.png delete mode 100644 Showcase/Showcase/Resources/Assets.xcassets/AppIconQualif.appiconset/iPad-Settings-29@2x.png delete mode 100644 Showcase/Showcase/Resources/Assets.xcassets/AppIconQualif.appiconset/iPad-Spotlight-40@1x.png delete mode 100644 Showcase/Showcase/Resources/Assets.xcassets/AppIconQualif.appiconset/iPad-Spotlight-40@2x.png delete mode 100644 Showcase/Showcase/Resources/Assets.xcassets/AppIconQualif.appiconset/iPhone-App-60@2x.png delete mode 100644 Showcase/Showcase/Resources/Assets.xcassets/AppIconQualif.appiconset/iPhone-App-60@3x.png delete mode 100644 Showcase/Showcase/Resources/Assets.xcassets/AppIconQualif.appiconset/iPhone-Notification-20@2x.png delete mode 100644 Showcase/Showcase/Resources/Assets.xcassets/AppIconQualif.appiconset/iPhone-Notification-20@3x.png delete mode 100644 Showcase/Showcase/Resources/Assets.xcassets/AppIconQualif.appiconset/iPhone-Settings-29@2x.png delete mode 100644 Showcase/Showcase/Resources/Assets.xcassets/AppIconQualif.appiconset/iPhone-Settings-29@3x.png delete mode 100644 Showcase/Showcase/Resources/Assets.xcassets/AppIconQualif.appiconset/iPhone-Spotlight-40@2x.png delete mode 100644 Showcase/Showcase/Resources/Assets.xcassets/AppIconQualif.appiconset/iPhone-Spotlight-40@3x.png delete mode 100644 Showcase/Showcase/Resources/Assets.xcassets/AppIconRelease.appiconset/App-Store-512@2x.png create mode 100644 Showcase/Showcase/Resources/Assets.xcassets/AppIconRelease.appiconset/Unified_App_IOS_SQR.png delete mode 100644 Showcase/Showcase/Resources/Assets.xcassets/AppIconRelease.appiconset/iPad-App-76@1x.png delete mode 100644 Showcase/Showcase/Resources/Assets.xcassets/AppIconRelease.appiconset/iPad-App-76@2x.png delete mode 100644 Showcase/Showcase/Resources/Assets.xcassets/AppIconRelease.appiconset/iPad-Notification-20@1x.png delete mode 100644 Showcase/Showcase/Resources/Assets.xcassets/AppIconRelease.appiconset/iPad-Notification-20@2x.png delete mode 100644 Showcase/Showcase/Resources/Assets.xcassets/AppIconRelease.appiconset/iPad-Pro-App-83.5@2x.png delete mode 100644 Showcase/Showcase/Resources/Assets.xcassets/AppIconRelease.appiconset/iPad-Settings-29@1x.png delete mode 100644 Showcase/Showcase/Resources/Assets.xcassets/AppIconRelease.appiconset/iPad-Settings-29@2x.png delete mode 100644 Showcase/Showcase/Resources/Assets.xcassets/AppIconRelease.appiconset/iPad-Spotlight-40@1x.png delete mode 100644 Showcase/Showcase/Resources/Assets.xcassets/AppIconRelease.appiconset/iPad-Spotlight-40@2x.png delete mode 100644 Showcase/Showcase/Resources/Assets.xcassets/AppIconRelease.appiconset/iPhone-App-60@2x.png delete mode 100644 Showcase/Showcase/Resources/Assets.xcassets/AppIconRelease.appiconset/iPhone-App-60@3x.png delete mode 100644 Showcase/Showcase/Resources/Assets.xcassets/AppIconRelease.appiconset/iPhone-Notification-20@2x.png delete mode 100644 Showcase/Showcase/Resources/Assets.xcassets/AppIconRelease.appiconset/iPhone-Notification-20@3x.png delete mode 100644 Showcase/Showcase/Resources/Assets.xcassets/AppIconRelease.appiconset/iPhone-Settings-29@2x.png delete mode 100644 Showcase/Showcase/Resources/Assets.xcassets/AppIconRelease.appiconset/iPhone-Settings-29@3x.png delete mode 100644 Showcase/Showcase/Resources/Assets.xcassets/AppIconRelease.appiconset/iPhone-Spotlight-40@2x.png delete mode 100644 Showcase/Showcase/Resources/Assets.xcassets/AppIconRelease.appiconset/iPhone-Spotlight-40@3x.png diff --git a/CHANGELOG.md b/CHANGELOG.md index ff895597b..e664fea49 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added +- [DemoApp] App icons for debug, alpha, beta and production releases ([#140](https://github.com/Orange-OpenSource/ouds-ios/issues/140)) - [Tool] GitHub Actions workflow for CI/CD ([#256](https://github.com/Orange-OpenSource/ouds-ios/issues/256)) - [DemoApp] Add new tokens in size tokens page ([#245](https://github.com/Orange-OpenSource/ouds-ios/issues/245)) - [Library] Semantic token `borderWidthFocusInset` (value of `borderWidth100`) ([#207](https://github.com/Orange-OpenSource/ouds-ios/issues/207), [#241](https://github.com/Orange-OpenSource/ouds-ios/issues/241)) diff --git a/Showcase/Showcase.xcodeproj/project.pbxproj b/Showcase/Showcase.xcodeproj/project.pbxproj index e14e94fcc..0f54c9aaa 100644 --- a/Showcase/Showcase.xcodeproj/project.pbxproj +++ b/Showcase/Showcase.xcodeproj/project.pbxproj @@ -1052,7 +1052,7 @@ isa = XCBuildConfiguration; baseConfigurationReference = F98488CF05532E8CD405A8F8 /* Pods-Showcase.debug.xcconfig */; buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIconDev; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIconDebug; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES; CODE_SIGN_STYLE = Automatic; diff --git a/Showcase/Showcase/Resources/Assets.xcassets/AppIconAlpha.appiconset/Contents.json b/Showcase/Showcase/Resources/Assets.xcassets/AppIconAlpha.appiconset/Contents.json new file mode 100644 index 000000000..fbd714cdb --- /dev/null +++ b/Showcase/Showcase/Resources/Assets.xcassets/AppIconAlpha.appiconset/Contents.json @@ -0,0 +1,14 @@ +{ + "images" : [ + { + "filename" : "UDSDemo-A_SQR.png", + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Showcase/Showcase/Resources/Assets.xcassets/AppIconAlpha.appiconset/UDSDemo-A_SQR.png b/Showcase/Showcase/Resources/Assets.xcassets/AppIconAlpha.appiconset/UDSDemo-A_SQR.png new file mode 100644 index 0000000000000000000000000000000000000000..c4f7cc85aa7bcfa41bb1443518eaa5992270b3d9 GIT binary patch literal 59090 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%0DR}D0N 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 UMPB8X?L@90I%r{BY;=tFAMKk2(EtDd literal 0 HcmV?d00001 diff --git a/Showcase/Showcase/Resources/Assets.xcassets/AppIconDebug.appiconset/Contents.json b/Showcase/Showcase/Resources/Assets.xcassets/AppIconDebug.appiconset/Contents.json new file mode 100644 index 000000000..7210ebf6a --- /dev/null +++ b/Showcase/Showcase/Resources/Assets.xcassets/AppIconDebug.appiconset/Contents.json @@ -0,0 +1,14 @@ +{ + "images" : [ + { + "filename" : "UDSDemo-DEBUG_SQR.png", + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Showcase/Showcase/Resources/Assets.xcassets/AppIconDebug.appiconset/UDSDemo-DEBUG_SQR.png b/Showcase/Showcase/Resources/Assets.xcassets/AppIconDebug.appiconset/UDSDemo-DEBUG_SQR.png new file mode 100644 index 0000000000000000000000000000000000000000..e8b286bc4b27c66098301773ceb810366555aef8 GIT binary patch literal 28013 zcmc$`i91yP`#*lh#1t8dsElY4W#7tBj5b?j-$U7V#xBgf>ZQCW*@a|E_GI6e8B1lC zeP5Cx+Ym7rGv{~o{{H@k&*i#YmUEuVy*%#wemw8z{HLp<#?E?{6#xKs4fQ+v0B{8Q z@d$7f`VN@;`&t8lAfRza)i7{;wZSBrul?Oxl^!N&oxMXT!9G?jxRgI_YV~J#S51H7 zaNP7Cze}$^E8~Y#>ypkn^xSm3XP&x~Lz7FJPJ(w>Bv7Ysahy4Zzog47crsUxM*W^{ zcdCpvHdcum{c`uk8u+hKJ2T$T^larnLlc6>{^isKj-KZRZXIRDbKZgp{`-IRD--7E zdw}zn2=Ff_D{%hb|HEJZj|HI%r~?+Nm-(9d6-JNneBHiMObbkBSA_`H$m-+np3(2u_+`wZYa|#Rnhr`J0Ot+J)KnbhSh~~_`&sW~eq7*pv z^jQk=_frM)6pj2I7GQ8hCAcXGk~doo2&XC*>kofCSh_dD(FKDB@~7e&?x0@16yzsO z25OxG1nE&FCV&6qK%E)963uhjq&3#lCht4~&^4j%q9-DlFkPA}!gDq=vb=vrqM{Pr zJNmXi3)~yM4~?ct#buhJ*okR7IgWRb>UAoNI5Zx5VUdxhH0=YzLf~54H2{9xd;wqu zr1{(hqMkK0)x^wjCcq^^dr=sepaT}X9@Sg}5>Qf8`s{#ujmqz*e}|Z3JY1V|3UeWs zd-_TaEy4g7mv=X8>-2z#nn|J~V9_T@!US%~pK=?lqd`>3&MhXF#+h!@(=dI5xJUWAXJ^J|wf_<0|@7L`T)- zJ6c*jJW2q8HW$zZbKnLtDpZJPRKi}(&^e;DGP*M0s~Hu_X^&J0a6!cY&^@&pj6u(S zxm_vAjQ^F=!y%6ao6v+0cb9~dCBu~3E@uOrQ?=m4-gpfNSa}-o1AZA7Z~gF|6T08V;M$Tb+f$*ko=42?Q(o?PvD0is8PWELOJh@;DrmI z;|Vo96-$!)I~W_UazrMLBL&iR%b~9Ky+DEauOsvqZLsQ*-*3=(=sN!;-h zn0Y+65W=qFW7qB|$1fn_)FfzuCJ3DYynfGBd00UPgjR7`&!x=VOeq#nRGRosK!uL? zph!nCD*;vsGxcZ6Xs_j&0KgcI7W5nc7KTA!dj9#WG-u-)c)m#`IH=~6Q9JD6!$Vug zA}Qdrx2<&`;N!zUeg7TtcPWx36ma;JA-Qek-RnKEl6&|7AIx|Y&*4_k2&zhXpa-#a z6Ke(;!)!D2p^`PY{RHeXat?Q>D4_kj8FFr>Nt|Q6!e-B>j`VyP-WBX#s9irnwWH!uwJMNI>(-J;W(G@&AA4FX_}2MM)M%!PIZv3` zsStpT=5I}OuxFh?EB6LT-y=(LUZwtM!m!PuH^QVMXeQG&w&t=_;%1qnLy4ev0m`QL zBwEnNGm1_+J<5o(XBOlDhF@+@Sk($4uf3=^O+x?&g_0b=TY-XmR{o;@=$oX1gR2N% zz%ZGLa=sh?ixx`50oAv|Wk7GJfUY{25m(v%4C^fvbF5s*A z1u@d9t+Z{r$&*j513j%g(}!6sY<=#YaY4pdxYSpse&iNc_w1P-dki`BZ20R)O7B)U zZ9RUHl2cx1=m*XeW(={cG$>Vc=)E_eWYfp39*^7Z7&N+scIOAlp}TJQImc;5`l8$gg%5miGa*)~mq{_hNZUFRX`a zi3-z1s=M~|xgrUGF7RiWF+#JS0uzfVVEMHOHKd5kM26#EGsswCfT{&0;4PC(k-cGB zBTc1&y}S$d?d}CcweMlH;RbHjfUiF*o}6R!Iz8K+$6NCEuzffjv?Z~3Qw|H-GfKd9 zqV?;n!}rqAS8BTBs*@JLh!p&4o-FQHfEY3K;Q;xx9fRqwXS|2ENfC=VzY1 z;T_g5J_)w|yi*JQ8pjNv@F)PI>C?0WK?XCapO-P-VEKbVyDS8WInHSkSME-5Mz-nu zD~Nr+{Z|P+ud-G0D8vV{)R`@6$!@u-B^E=gSv(vZgP`CHD2D9(&2-5ynuDm-;kz4o zXu`%@pTA32wge5U!J)9VNpNQP=NQY`1^k!p`|=1>w>~5y;_>Dq@+%J4FtFEdQaeZUz;@w+$IzRMuoa?ynCz$6G9iob??G7Pe?UXw-dX#x){ z`NVYIIVHgTna~6u+r&fk0K)^O8{U3Iy;2$Kp!eda4x+J;VJe&C8X-?>>-k{%b}mEu zu-Rn8ZGE1hKhUTJ3%;DBSeLSwcfvLn@drNbhZclkngVfHmqo^!48^*ZeJ&0zafuOn zD2^B@D!3%HHU(DQv{)QCbZ)yZyy#TT%4=63b2YHqO$+dun`K<@DPouFf@$%caR%`9 z!(31#WwL2xTMq!$`YFT;t7>pWA%E{PYNDko@V8e>JFbUoqqQAbG zXt_P{D*&ANwJ)5wo#zF1mQsiZsml!F-lN+b?#0t} znG5)in`l*Y^ImQ=fnD~{A`zz7O+{o87>Qc#}r(SeHI*Gl0 z^4B!y78oigC^!uqMFr_jut%D5p#`htol_5YI2Z1@*GukbdX({zCb`*r5R{cdd#%Oi zlnRd=L=~6ZhY^6&Yt1I1(?Zer-nG|)(F)bzZaFkF>HPveGVp&`QU1+ec$Og~?)GJ< zx*80uQ1wENCU?V}mo6Yia}JgE(=reay;pH)vkpbNDVT?S{8dmEK>(cA80&l_`nMAH zr#|>UijQL9adSz3aYNK8{GvxaYGwp#HP7wv8pJ%u(GM(HXz>3Jyx6R7S*>dL z8m0QX1Ez5SA!q3BaXOb>1W4kR*(FaD#U72ZQ(cJcDa&Pre&=9r&$=jUnPMschNj4z-3L1~};Ug2Nk%fW_!^l#>p_%J12U!;1!sEiyyBwOzdQXuvl5-s{Vosr(~n`Rs?oyq6VYM*+tX<8@$B z*!aKp%)scciTn`}#HY`S33tcNh^Oe04}*`OB4k95S*S(vJw=a@Zzg)6@T)=VVS?64 zAcq$*{77`qv}XEB)>g*<(Bgs@xOBD#m$S@x&@)C~$=S;A`Cot|7~G~>7u13(l8`Wt z$HObJ@tK{63nAqV9@GxKq*$AzTX&+Qygw}9zi#_Mb7LsY$q$JaC&5n>h7@bZLtWdL z_+W-9Jkacd-anLZLY2QJ`g-UpP#rV!aFL?}hDOApZDb+9tYbUe;wRq5g(~s6wk`91 zdYvIvrI3qSMC=i0gQY-DIgtT(N$Uv~IK+{Ey}|30kIrk1*Tk^mV-Ub&G5Xg4!KuX1 z;J>TCh5eE2?FEAFklonKqojyerV-p3@BSi+Y^S+2Y1i zOXvn64~p8&;^sE%=9w@ej;3_g=w*iRjFN_LMsCSHR9F4+YbX7+&F?-dvxAeeku>`; z`wIR2-H-EmZ`t!J0_Wrn`7Yf97?Pcecq!h-YO^(|EuR&v%KMKRlbPQ*zOoOo1QUK# zDkz*bOHeZKNXeazj%~Vo=zW81GgxiZ>dVh<=_$l7+_lsjbQD4(^(KcJ{#}7?;znQmgxdIDjy$TM1 zk}Jk-?Xa|;R7Uomtvn*|f>EDT8uOx3=a)X4^+^lsb~wJGt>>hWFbgLhoGNA7m<}iI zzE>FCRL}1DpeX&DJzDDr$sI_3qX9s_nPX z+h@XYO%)bnm+5Jc&TH5pd|lEhl(~a#+R((x#)=c#3|@=K*`jT6(>6{Pr#P6R@?cwG z>sufbAf|&#ypnDdZ1uf4SSJ#jGS0DZh{5D$*JZ{4`y7LPa8JGqrt}Z$du53xWNQF9 zKx~P@KD75U4xY+ZSp@+)FEqBu;3Qo|8c(}EIv{xtO(>>&4KFj(iX1q#-mvs}K^ zyLj@+!^fLTFW--oM2blH9(e}AFYaA>V3esNGr2#JTVV}1w*Vq7T)zlpH^gz_(%0se zaJy@SraRvi(ur$OtULWCQOQ8{ZkEE?bLK}DVWzT7<)N1xRy=p2wd!ys_cz+DlOU^j zUP^?LCNcZ@9Kw=U>;TW^$Ygv@m@@gY$!asvf5;25*UqN5Gf z(+>7s4q<2|=3 zlEvW;*l_AmUvi`Ar?NiTlCL$FQ&tp=!A-|!Dx~Ua<(H> z`Y~}@>BOf4>1vQIj0&1$s$9Ka%x$cQII`cQFNoN65CO8WAh?@EOFn^5x>n-;tM$4^ zOI6gB;byG`JRz)Dwm}$+A!o_E&I1#m!#^BLAtQ7+&<_(FSGyNO6Od8ud}A*jl6D6f zm?N<3L)w)Utp;ek3*gI?@|*BMPk*sFKm==tFjrFS<>* zRQ6Gvl>%agS)yExJ`-{G3jhZ{K%1J-ATYa<7HzyYbKdD`?vmBX|2rLCk_3D6e3ZqvMn>2@<4)6SH3zgL3M?h>I8!UFD$Q zOwRLEUyDy)a;}h1EaC@fO`GPasqj?;U*H~L&#Kf5Y>+JxB`!@7Q}{84=-IBYS+_D# z#5e0FP(>U7nz;7(gRu_-iL@D-$58_CMhz~aLnf#DQ7Ots0>PO_dyU!CUT0{p0~fksvFt1+<>-WG z@kLYIK&XCDh2kwLZXp~ZIi}WMKvhhN59VXhv$P?3vh3^o3Gn;eFpsb#zC4;r%l;`p zGZH;bndwd{{6acsWqoS)0)Ad&KrY4^g#Bu%WF6pyQ(MP>j-g$wdp|RFUF~gFx z3>+hXjXPX6^hkst;!cHFNRUxIN1KPXbU4$SCKzOn-Z;6WoBwW3m_sSSe)CEDM}0MB*XP(?jqIG{^$WGbvi-8bD&xS(EII-targAw}0g-T@RC(+P?#t6bZ-tLgf&0h0_=D)K7{^F((zm>tyz>4LoSg9(T zg?t3SR0`2{6!3S1@?+b92s8sDO}N{+^6}2N-SF)PE-kBg~fRH{IKdm&K9C##!@}1gH)e$;c2`O%Va{i zFT|@~xXKWh094U}4ZgMy?g7P0b?HT7YF9eXNSlf(9N(cORWYeuQ@Y2J^&rvJo%-Oi zu*JHl8oKm~lYiy=GvAaE<}+Pq3r@tnybO@q+kbly59qJCq`6~yESmD&US0(s#H$Rc zgOuOx$8>cNoSxCJC$_^IjemxCL9l#fovWVrQ(J|_941Wuj*IOX{Lf1*P$)ezJBk48 zzhsvF6n8D^)B=FJxL->dG@pbf6T)Vrwdx@$v zEPwh@C5NAHhplF1$?*E%E2hAW%K5zh zR87N+v&DMA+-vcm%W6UYnCL4g2VDp#?c2`B#=@tMOCe0Z&~f=l+P01=Whve8p{N_k zcpi@wly;*I8BGABX6Ni~n%qq4ADaFB{UVa3H_<1@x45)+KhPJ0Gw zLtAqFBwID;y%aaS%yqP}q}^5*IGF*z=NJyxsuNrzF`;LzAQ70=c;A+#W}KH15lmOT z0+f`}%=w>Psh37yPKUc_LbI(gRJ2aKUbPxq3+1mEYNoFTC$Ue7AZ@J&vQGWx`D$!% z?Gid83Qd}%fG&j&6k@r?@k=Nz;tS;fnAGE&2G+C5%IDI!wxslx-oDF?l-WA~^-|K^ zb$v+Th@ZyQqSK!6GOU3gSg>9T=1vF}2t7cFAEz`txsX|r-LhfgPt{h9l1aV@?hpQo zoov51?2?Gm-Fz|PAt{jN@E$$Ou>Z#3-!_7lb^Hw>DX!&+NdWngUpgFc8?wJ0w-g#w zV`+G7b$LG(O+pzy)SCj|l+z?VPwHdkt~s-;*s;Lyo{v9k1jT0bTP;l|D47W&LWb>M zp==&f1?0!XYh13!TEEtTeUGM3FC~cq7|Qli?CqL(X~dgjBM{p~ZHuN0U(Zd`bF1kt zegC0FY$RyS+y2?+qpMmk9LQZ~e1IvCHhT5!m*)hviv!tb6y#q4r0eoCAH`O+JPLe0 zr4XFjQ@GDshMCU;c1btH=cW3Flz*jp=q=YTSjIQ1tD;xy_2I%iT4M)v*w(-8|-_Av2V(G-ENAy zLgcn{-<$b3ZD@(Lpx&6cb$tHH;8Wsl9|w2I7tT+bC*#Z&t4nTGI<>62#gD=nTWlPc zgOZn$Cq@j1&L#SRce|VEw9DV3A+U#_bn_Z76CfiY-jU>f);!Ok1DQZ?=@fVnn7K4a z$9ar&&~qww*%-n8_b2U;veXxA$wCre>UeoyY4Ug+pT}z@zk&Z*VicJ;lNoFBevGF? zwrmf%7d5ojW^ADd|D^7D3q=JHgfF8DMNpzx4t3FaX;rk-0xB%bBogX%Zq~Dbx{nQS zRS*fXh+iXgYLEK6t1U(%(MdPz96YbTSbFlcN7Sg7%~R*4#v*=)dja6D1^E(FYrxvG zxTYDQt*W;zObxc)HTM#bpTz|d#Q33kJgF)dp7bVNqp>k`Oq=G-Q~@uUYb#e-fRFx) zh@mt5(mE%R9Wco-x&00)gHLX*H5ngKsO@g`N>$^s+Np07%(#ohWaJef*lykLy;e|x zh1bKKLdqugZW=@`TQf=p=0o!8^J+l|Ai8yPJg6mHon0sR0F(jnr+qUsKe!}ZeUC6- zFHvOD4WlXv$ROT|3Rs>%Xl0gCtkabufA(GJJpSAK9^iEn5|G|ftQh}lFYFY!F^8BA zUtDAmi`%O~o6?8N{sKO?X~WK{FT#U6!`AO>T?Pc#_Xl$=O>L3iVgHoioT&mLyLC5< z9kQ!n7BjE-XaV4=0sGH#@f>6U^{+j#J=ThWu6MBEi{D+ueMozC zU`v=8HDd^>OX5DChv-lxM5wGpmamub$mB;$q^UXUJRUqfdou--@2LQl?N^4DKY-fQ zTJqWcM-7c-3zGbn#&XgUj=K<`MzM9l{`=YDQ8-EL9?Ru9;7|Ge50gzeO6ulJ?hO?b zyU@Az^BM1lY9GhK-+^sPvggagV1<)7!t8q2#`{wf{g2wu`6@^ad|2Iz6Mv|v5CgBR zOM##K!SFPOjsnvl!{(!~yH;kmd}wg`sc|H@-7`7u&Gfo6@0_XC$j z&!co+T2!F_b&mUU)+R8Nta z)Qn>9jue{R%zBob^wwPyS=~<;@R%+M_5+$xC8>?NVO>9nFeuI<}9H`(0GSOF>Gr4G^kQAl0l(+ZFFiOVvg=A&Q-f0#i;u3uY^Tc%(L1B* zj+MF0INsZC)E@(nW_^sNlcunS&1%siq)0P7tIt$%Pb|aq>OjaqhjT>DdL~544Gu&?E0lC6=p#(;h#Q_ zqXRV^hwzr|#aTj*FZ%0EBysIj7{u#xXhH@(ChpQSv)6R9QjB?4ZfBYs0wPbH=(Yts z4>=T1PYw~_%%XYLd`zT0_*}%JHbFUc_@J2aIpZk5xgq*y2w{ z`m1KTz$=~o(Nb=F*>7!VG=uTCafy%Lz#kJ9q8%tIIYK6=Zgb~44puyh)-X`0Sy(-} zG7wiW_XhsK4=m&zYL!sh60XrG3lMB&M4BQBr&TcZs_q; zCzLz|HV3IX_WiEOZ!VR^x%J#DnfmsAsFGG(3zR35tn{R%uExW&2m71a3w7Fqe@8_@ z>DF*J%Ij)Hl@V1%L}^{6H!(A{_y@f5Q`QlT+3!AcS-~v{kYFv&|JJ8l)a)-_-+&wf zPkZ33zk+Z(?pADHC#I%2B(NlM(Hr=!YEVgNu1!`fDF48?Vs`z{#(9h3W+tHA zxXvC+`a$w7*t~FMrDHN?Qm%B#ITnuUg00tql@gG{na9^Yh2mg)Qbj(1s!;-flqp#Q z8Hiuh2r3idx4fj3cu53tBaGC;duP#c&c+kdPZu_lhay)`=_Bz~pz-X!x*4$St4RjB zB(52b0i-_5r6ke6i+k_eyE4@UgHb`%5@QOn_>1*Mz@G?l*QKLU*M_(AE~97LWC!9n zfVS#-sp?J?rzBP7`uQcsK-!S^zeZFZi{VXMpomv#LcSel(c5unX*TZG7*>Xo7%Y#t zv7d62la~S==vw!e3J(plQiXV zE0ZSr`im0bIfXcy1>vbbpTIZG*|n^Yp-=!e2>niLq93 z7_lcQ7tg|^)-N0bh0{{{t|G+5qQV>siee^>FDoEIme3>D6pJKuY44XAQy1fMu6k$v z$8o8kYurys5ui&c2Jdmj!t#($`(a7UxGTW14w$g5k9J4? z_F#`@``%>;vVWJ~{e0){i)DtR@VtZZg@PeSw-J;KrWgXMn07DSI~8ZES?XK7jm6K< z*Q@QPaL>#)0vz#&qxF%2yqd?IDpCDSmCG{i^1^IvM*JPo+t&-FBy)Fu-h$?>)r>lP zQhFYrs+ZE_IMW)Ec^J~=1*?{QT{NNIrGZ6!WDgQDU)`peM;=sFSi}v4r5iI~=ik%Q zo)9^;lJ0y0LY}tabcoDQQIYfhX?-y0IVKcfrNxtIZn}}o#Oa6hnlXCEPbN!dW&ioC ztS|b&CB%4FL^_WW`H{cq!y6E$;5Qw?*W9;if^ZQr*jU_p%p<`kTZP1+c0UdGv*2&Z2RHuJkp*7u`}XC;|2p0=#- z&Xh9g5K@5)Y-9Y4SNtCQ5`GQN@%a!k4;bOa5usWW!;U_GI)l? zP)ELY!=N_0OC?A6Mw2a{YKs8gwjLVXIZz#b6Kn5rfEMg7MiXv*YB)0QBF!Y?VO&Lf zb2^ij1N^#<*wsQfTE>Y#u>XT1yr%`^eSw>8nE1e?Mh#i5zvIY_$6|2?5PcVvC!%X+ zDR{*Y#Ua5_R@$ zn2Zjx`cu!rSW^04{Mbn-m2CNZ7beA`BpGRuuxPCJquO$5Hk?@=F)7_a1J)*qnV*fP zC@tNGN`seFTjsbKIu{gdwB2N;qXnlp(WEix%wN(cj~Vyv+o9#!i0Is_m#{Bb9%L)c zdiI1jZS!RuymqJr6o+~iR(bqRHZfJvptgY5QzmyI*l5yjuPNBtlK&7>+2aGTpVU_x z{$0;q{OVr+WAA^N6@S8Pzou5T9VQPUK*fv8mygH5pH322yE0gzK=M1{Q6){C1s}=^ z9Gl1gu33q!tT{+1+laT9-lTvj~%Y;ZCRoC4b#L_T;*o5`CxJWRlYdcb*}g|O=R2d)P`&* z8CcBXd3BieeuPlk0YYg~O@JHlvq3-G>w>Q0C|c0y+tn)tjJtZf%>(p*syBY9{Ih8o^ws{OW*UfiBMgjM<6SyaP8Jm z%-|sJ0-^3NqFAt5`(<$LCCojGP1>b*ZDhY0vZo$4M9k|+t>Mw+9LeYHk zDwHRUlo4`J5I30?Cwne-ghynz^U#|VA!SM+P=6j&UDZL;Qtj%8^pH;VX_<*MswcHX znRKXR`uTMDwR1{$mu4g5Vl|*6&F@=Vov^dDxNW0j$mb5DBalmeLus8^JvV-*FY-xLMeoG3RPVj%La+R zj);DZ`W`5$b&;B}z{-6vWfzbM{CeHglvV|G0H!?{bf#q8&E(P_n1n2CE8uqT$+fif zsqV8i;K$Tpy$vd<?O04Q*Oe9l^f4QPB9lq^Fe)S%C!F-p`T9v!>GApZ!9UkQu6 zj26uG-4JSjTBV96(9!}IA?L$A-#s`)B`MBxy=!SuzawU8cJ4yE@NBDLT^zi0?kyZ@ z!}@1U`G1ag?!HygDYT6pX8C?pr=On&U{es#VLuz+Iu8(O)&dE>;PUCCI$!@jES8-; zi2ANOA({w(s)-2Dh<+*zsW2>CXJjQMM#&&MkgfU97;G1TCnn_Lgny<&vlOD9zPlY@sY7&*c#mBoT(59e3xnx?bK6qZP54C-RA{C(XN56Hv23@1e87RpTk}PR69HlG&%{M=BA2cjXn9TCH~x zONvojzAvg$u=1mzbAGr*QnL5DD4Im>7eP2JGKPYW{uQYfa`%>VQ#Rc@Pj>IJLt0{_ z!j-i|>?v=im4Bg>PCLWiX`bO@PG`m;{x0P+N>@rEDEry8vmTcu_3NJ)E9m?z@!s~w z25j#tw;tDt(dEAx+ZYxTeULJIEN-XB&3a)}d!w=@nn zYSW>7 z9e7$P)zL{E{}@3DBH2^z!+uV8MwaV56e$O{TjJ_2a?v)a3*$`AnKKz(ZA!WR3xThm_mJe7lz?6`K(_!M*$ zhRyivq<5aKe`0#TB*GEzv1u5@+7$?uKBoapYq64+8R6r;Kp+rRO{uFo+m;w zfBJ&lz=bsUz4~UooQIa@Vz7gdtAj=x^@OV>KTk*v3sWZ?D!C&sws%4IW9}#{CEpeA zsI70F_-QNSIS47WP+SB`fU;^qRdg>Ux8M{7_pPCo4GL}J#q$t1WAY;gH4 zbu!dnRBqR6t*8JF&llSvow`q=XBW#mAxyt_D4`gIla`8s-wU*nx-G=@?u1E6lfF-f z?2lc$Br6c~dbz)uES(oCJ=1FGg9Ze%GW9+D3RMsyFLydaD=|$oW2%QSLGU~UWWzW^ zae7c==Sg<>lis>3CWj;t{!~q9PweEp+faL=;L&I0c@)kb02yj3$JbeoSH7bBC&`+boj1 zD+9|Y<>4cjew;bO(9MgpFkXm#BH%T;F3BI_KJ0U@Xj=avdCuw8M5q)~OvGt{^@DH~ zgu3=Z(^uP^Hz5XAH)LXeAzl~WyRX^&&$rGMO=w;HW&QaJK#nDn)D>d;3VZ5dBE0h$ zojbe`nz7{&%>?x(D`i^*5+hNwNzh#LJITmKnRT5>rnluu`rhT^#4n=IIC=|sHfs?z z@rqC^BWOjV#`LL$xt!v=H$v4K728l6MJA=T5~<+^6E)Q z<-|B1C_w7UCUfmo|d`d^ofUpQ)-fp zKE_O9tv6r&brMZdI-d+r5*WNDf+l2JW*RA;l7Lc_K)bh53DT}1Z;EfhCMw3I4KDw% zpo{JDH8uFE!vsqf@I7pRt_UtaF{2>0mFEKa*}%zOIma@H1>>Glxd{B{iQG6ihKXaz z+0^clhsxNsl4NAhwkK6uw(TkL@+n|zx%RV4B#%ICJ7>+2^3l(F$4Jjet=6VJ;i-$PD)p%F9IlEBEz+3gV_S*UmHJPp71W ze{~`2*IlKVT-ZfGb{vy_2O|Q^ANY_+3FeBs%WoGy^*1?xmho;qw57+amG2DYM5BTZ zV~mbPSLfe9-l}JVa$|=ar31sC{|~{ruyP6m#?Y~IF?3eL%0Rl6wL`b!?z^doyXrx` zi+#UFX=swwgdh)n-PKAbLKkSOk*zWhiapseqLVY zcYk(*p%R6H|A&onnVg(tH}({~oCTeAr|;-PeS>#y{77C|j>pgTH!Y6>(ciuvx7fIz zms=|5>)6xlnQ?YO0=fpq1Sp*O9ofei{G4CHZzq>4L_A(UrKV$K-*IJ5*Wf1Q$H#lD zfL;hg3ra8#%o6w-XNwBU-_NcQ(aMTw7^MtS*tNajoZmlLoE`C_(GCZc3Beqk?+ri4r3*4$r> zJ@_@BQ0xf98v@1X3upt){XCVSa|$zg+>1pL&ku|)ID{4I1POS>9RZ?jY0h8k>7uT2 zblm8S=?oK|G=q{5Q_y5h&@zapUA8-}KC&7B!+&CWb_~;45;h|Tc)j)RPEh?kIY7L^ z53J_J9(=z)Gv;`U^}=qJ{y;C|o$TFX+C#b9J?*EKrUH7eIgG9W(XXr2j@SNDX*Yv< z*nSQr##{_lv+}(Ao*&r!Tt68_E3%U{<&t4K{raT~aO%`E18j~NPOtAMAe?FSEa~8? z$Ie7jH`$5b^ml{19el`btnzG zKQ+?ZxY4+#Ui)o9^9VL%IECr9*{M@EZDk6BPHVU>$3^NGvG88L7@S+gaV-lX9yb0> z;O{nONAbDQVf^@#rB5Yu{S7aB^taoUPb?kDDEyJl4Ro_j{#d2I5RyjC)Fpz8mMd3F z#~q9I?o5JdH}wp~Cs8n9!d`hx1aO#@#7%QowG^6bg>IDdJ?x0;zwK#lxMV-Y2BZ|O zD!l|8Y`ix1g**Df&%XA<;>!%`_pRSVT=RI~;0Vu6pEri?c4g20R*6EzxTc_Nh=YZb z;6$kOp!gX@78_UF-uG}R#K1szhNwm0&|v+UDiWfn=7PUi+AC*)p=W!nz?ZvPtBTw} z**u<4pa4y}>ACa3Vk++=m|oI7sw0&W&rC>RA|16kdyZZfSeE{T{Lb)6D0waK;D0K}xXAaBE@ z9wK*(E+FR9#1NMr<{8X^r0j$CXk&ozaw?q3MlqXlFmr$=e7zyi8PSSnQzDO{cgZ)##P*$bgK&g^&UuCcd$A`WC{b110rw0q<`RLYPnM zpsRfBqrZ+f0z@90NPmQHz*2cMHk~)L8zXw=qjnK@eY1;a#@sS=58XF% z?eQ64m*sl-&2=7NzAW?#aA%}C9{|o3Y6ZH(f#f3wK*Z-fZx}G?YMv3u3qj#&K$z*o zl>TVe4X|Yf%rkR#)`M;HO>IZ_*jo75Fm21Fh_AQ3w&Ff0SXpv#h zuDj9?0wEgk@M;mpcS5@8uvhc^d?ry$Wo?bv-jQ#b9(Or0~*0ajwdO$P>f4kXUc*n%2@|~u{2xh@o-S=UFwU@||?7;IGt)c<- z|GyVtYG1OV2i#!6p^RVbSZoQ56I%ww49Qh>RwVi$wIje*PDih$> z`dL3ExxA5gq4*Ia5-5cLJntQ>8FQp$k|V$Ij} z#xlwcXopl8cL}%Qq z>Rh_d)swSO#LsE)68fZte+9|;qp>Sq-W>>=LRo&yUhyv0j|a%jq$A0DxLqfqT7lBW zc$k8W|LEjP;EstMPJ{xEEygPY3cs1~wH@CmOn7@gfGETTAkTfeL$h6g38r;xLneHI z8eJ+dvmgtK(v1Xl-xIH~17E*njF$ql8>)Zmo{BMNBuFuFK8y*_N(qvcJ+)hxc@Ytl z|EbeY4o3QLdcCLvhHuHR9X;j7Zqxoi5%?fk>TwB9QUwh+W>~a4inQ6!!rB6uNWXuY z`ZJG@!DBjt!XOn0=zBodeJDypH<(tiYuZ3D;pK-#k-Dc15rw`Wt2h7|cR|L(_9J-r zUZrPS!uUX(aS9XAaRJY5Pk)ecy;7hOR=gnm4Ty+#l3>A4H5Ie%yEU;8G&JBX(u`tl zK;1EO0LGcFJ9->I-2TD)C&`fsFQcrR&JIL*KBhZc{B?{IJ5ieHpuy!uXe<5afq6rK z)Km7xafqS|d=dwgtxQ7u-Y^5x23AYtMHrqJh+Bq{sA4;*4QdD=?v2M15Fw%N$<*xj zCr_UPa8&|ylUab!f|Dv<9Dx4l#tED9RD5G~i0hnAV(#+O+7InW;GFgDgSX}|piCL4 z`2t8OUD$#L`1BOI@)cedM z#xr)(4`(5I|1w~6Mt2e37&lSA*i{N%!*ty$4>@AP6{DbHn-8-&|A+TF78p!a0?7O} z##ey*;%)S{+nD>37a)&nOvnNhj>$4r9|Md4{1>i>CKBDM)eJB_0eu9(rK7@t*z>)) zRGiEAX%T$teIU?>5DvWEaVw({qnI%2H%gM3NS4)-1)21T+rs#VL1$(Y=_$gFe(p-& zp!+13&U25$R{u?hS5Ff;Y;Zf>JovMK!jiUbRSw{F9N!9kfQnw`#g|O=>g{8?H*nZ1 z!0~pIEhXiZu?66z2@$$>c^s;djDNlOX`_J}WFj$&4|;F-tPn3n!=PgO-x#(CGTJfL z_z3Xs&W$(mhnEZEj_Sw5P1pgCc2X-#*^%#BuEC<@Z0_a;@k5IRZjiQl?^+_!#jy|wQ9 zFKf=3Ju|!SIeYJ5&Z3jfhWz1#56pdsr1>c$T2K>05J55I=^?Pqk_Fhv*O)<8*zL@M zTOxKTkfE>;(PMB`jZ5NBxCFswGrtZ8HxF?oWzlrFc^n=ItZCKC&*?>xxZWr_a;Y3H z1b3KaBjINs0iS1^qZ*el%NeDLBFOqyf5?F=4MrGheiRWo-HDHbO?)dD zp_fh@&;l~iE(MrK%_|njbVgoeL3uOiKSdC1U~6v7&(CGiE#-b z?tXy4I~zd{q#AAWARi+m=y7dzcY6}6ebw4?IQlu=P~u#Z#&_6*T%crXQ$lkkv{l*& zjXgOVIKptS$oED_#2}2b!%9bTggY3lx_z42h~j26GjMn2VeX4MHp}x+RUVvBc7n~%^d9HAXsuc z4HZevx4`U^z&RXYGgt>^6<&ga=2_bN8eXVpLi@8ErzvJ871w4yzD{9W;TrrJ3(y@o zkpxHU>7HOKAJLKqk=$2XAk4F%hF0$KT7Y*i0M9o!UY!1voF)t)R;FJP$bmg068PQ4Zmas8+p^YgBW z8`J%8qSFtr?^gifn=+)_GBpBUkuD8i;l|bfxn^0QkHA^{b^T(_pq*HSG=um+YpDBf z(+MEe#`{GSd@F>ji?T7(V zTnmo3ZJ<@jI7sd~SWq{A(Q%Z(tb`t%Cinv--+G!8p8Amq-2On_e|8QGFe@Vo5=_8< zd$4(u{Njs{_TI1cBD>V4yg}BkB|Y_$R;N)IZX}87cU>6pJmr~bft2R=u*;jr&scCk zZbgVRuF!NGVLL{E5w-LC1GgA}Qee9RvO8u+=mAJNq})*~&kM#}p*l$1 ze9{ph5_z6D)(Xc(-8>0vcUOVNJ7rUF1C@#k?Ey6al#jltO`4&DQpcREphqa&Lba0HW00UVS0AtbuWkr|rE)<;S1X4dlA-vqDW15KEvK(}| z1pq^zW>A?B5*RZKe1>LuB!CQoW{$^A6*@4m5^DxKDS`lopBNzSBDMFyaMSDg6#YG| zD^TQmY@uLKAMzHP6>;o1*JY3-E8(Wq zU?9M^)jJ0~MQzT?yNz#b^)qo7?1IlH&m@&uJKCEx6e*}7PuIQaIRqMGwgw8>actzg znVZ)Ge@V5qw-j?UY{0Vb`g?9oQSqkoQpauMT&^R)4qpkg5$u$;V5Ti351TUDTR2c&KPjc?druZj^r{ZW!`Jv6d_I5g{EBT=So^j3ymN^eEbr%? zSS1*hMJ#+tslPY2#_?J1QkSAb;Pt+-5(lXsUVLC zTcne`rvbX5XeO?5!e=Mh=EN0>hIk}DRDGV)oZsHcWHDh+M~p3+iI{GA?BYHqdDPOE z(rxj{<-&4cZGP~G=y*<3GTV0-mbT!uo}BP`EmDt&?7?BCn3H{dTP%k78(p#+Od;M! z?r^g5kA2ff3-&%1%I76vmx=iKtS|=3Na#t_jSu9N{ct<|9jQ4yoXyfAb>uMBMa3gt z_aL$Zdl)UXrOOXxxRJ|3Q#Hp6oqAqA-5>heYOsS%>dMq(<-<1V>cJRu7ixdR2pa~g zPt5eGXlZ)Lzd85R#Yr#C+s;lwEQRUwE+q!ernfa}>?TLql#whyIwR?9?PSl!lQ`Jm;9bNj2`I)C&#R=4M#ExA5; z+jnE~BzFjWV$L*G=Og7r$eS?Hhqq38b!fb4$^uW<@T_SctdkP6{c{wQMi7ByEf`}% z@GpeaP8);d2frqVYZe?l>M1r*@yXbA+!-h8zLF#%>@7!&N`JZ&t&`iu*M;mT(WV3} z@)qdE_hv*=?j?Qa6#=VK7C;HNw^xVl&@BvbQdZ{XzHaLqkg82Zb~sQ)!RjF(aW2PN zzhDM_P$Pv5^aQ+*dNs z_c};IM5@yPV7Y472Sm(Ntd$LQUi$A_|7p9x9Rr8Tgk142U`wl66#|^-7NSE0kWGEK z)o9ScJRD7X`qYdEd^KLzhvC$$sGBE%y;tZ4z!+5yF8rZPi1<))z&AW1cuyi%b|<@5 z&p>(;5D-=$KQVwivziIycF8S`12-il_v|UdX()?C2{}^P&g06*f?7hT90z@{2^;@I zAU>hJz1kcuqFjt3oChpdpRsz8uWyTjR+wN{<9#7e2q!kxr|4XqSYMBdS`NuNKJbD^ z)ZzE-w-?82P)t?sQ3In^PEe>ylEU)HrY9V!xF%JR^I;zFo6Bku51 zemXr}dV+B7Mrw6ZT@u%ps>;;yk*=4tW6E_IGBs2Jwt)gK+c$4dEB94%u7Dtsc9{NsJOB|@#*y${3?8aC4&mYAd18dI??p$O6zLAup1u90{RF`7r zU09?ttJTBijkhujcZ`LS5%;rqnDUhT$rTR{qwOO+Ie~&^|84<2?)wSo%Og5cd7{hZ zGD|-8#TrlS)})P_-1dw(-mf@R;P=CG;OYBK^Ar{kB;-cz9_QYAl7A^FKdeD-=4R z;r)kRdvn;i_V|10)I=y0_K}-5F#{9delQT}R>tSyATrwGplJS@m)eW4-Q?f=K4DqO zRMY7ozUcUZX0r4#_tRGTEP&amo19(;P7Qyp4Gf~b!Xw__I&!5lyl0MT_+T9BlEzuQlTS}6RH zOyFFARR?-eKOa-g>VU;r*O5N>j#q59fz|c37;3`FnLl+J)hE}v55ES4dq107h1{vR zN5KxodTr`l975G?!L)b#J4H@7CU~~CXR@gVpU30G@+|lYzBl`Uh~~=Ly>r_xd@yiT zOOj%s?A}`!t;zCZ_ts`mmSxep1gl{^{RbI$TUC-`w!8|M*yMt$8qm5HHIxGefZEmB z%xF+1x=ls9Qn@XU{1MW~c_U#I;mvheR#TwqB@4KDhL&Fv=~7{`Ao@dZ^g5qLR5*9}&2EhzPFy1^vk7Bq zuCDo?&BXrM&kt?Im?)cTTJi!&<}G{Qv8?p8E^@lgpchmvb>tbppqDWmw;I>^?7D8s z_XA1QgJ!41HqU){WRw@hg7dkvv#-2F(C5*m_2>A_V zqLQzbD;T)B7Y|a+Q+U>#{$vgq?#x;S_-2Jx8NLHnC6Y_z^v-N?)+J84-2L=}FWH(z z+fi;p-dwke0J6t7+nxCBa^A<7Byvn*GUAf;A`~mUA#?|Lq}+gR1G}yrffPz@U9G}m zj_m4e#&~q_H6#!@$K`)UScvKUeSm(n9OB|z5h?>JffUcyX5A^uhMIJjIy%>fD#QV3 z7`u9XE%%wp4a2nE-B%GhnxnN}c-Wo@0aF%5{pP+m%v4_WJ5oRGWa{=6s{l|_^U(l6 z(EPod<4eS6tQCuIXz6{_f%inPBMuy z>_^^&iBC|dw*D1!QbDUr%j9Xzv*8x+d1G5)nRZghYJEQNv~bO6>Q*0;M}4DX ztv0U60dUwk=EwQz6?68nSY=caGhmdam#Vq0N-;^}vfYjOXQa-C4opowsxx}$r`RKl zw2wXyUAGpzNVr>&aLv2wh&7eGg8eGM*KseZsAz9bow75^!!|6;+79a!zHBMD4}a~4 zXKZI5-2LVAr`yBh%8@HhYMt8)bs1N$_3{cEyHfky09dQ|GpsLwjI6~k?9?zx#33ki zNXrmnMfzdlQB#T3N%6I9vGm4A@$2blC3?wb^PiytKPmMw3b&16$KD>tjVr93hSptf}YdJ6Hp84%Ub79yGikf!FKJoME#xgd40Eyt@q z5SXM6X^1P<)!!>?AL`$pG@r?@d8qvmyV``2N1Cc5NI51oMbTLnh#GVE^6;vOo#H<3 zPB+uy3W}27%}O_q&w0}dyBl+$z+?Tv2YGXz{RCTEA7)ZjV)@BCJ!CT@8b-FnY#!e+ z>eYRlllGX$%Bw+0=djET78VM1tGz%h-1B<9BuPZXnv4F*eIIK9JJ|J3X{$aB!uIXC zg#$uKU!`h5vd86A>7Tf1y)$^v@~o*O#<|RQUuN7GvI{i5)H>)Fx$SOyW6d{7`zMVy zYp7(!05vtgl@V%&Z1D=^OI(#>!2U{l)b+5cpdLJ*6=rgCK#49gYH-b{BX!^B{+7U@n0Tn{rQ54J?e{np4#VrJd@1&q8HsMB?L@9cWd6V?U(e{fVC+vx zA&G4?UQnM*e9W0kviv2}P2F@x8ir(TS2TRczmKE=H9%5>yGrr$Rql5jnHJ?Jx)`$u6zVjKfqGMGK6O~U@}mXpT>R%X5T zrG{hbd7Mo_>R#WAY-+{p?>kry&c)}Vzx8OAN?AjD64Ew>Aq@UD%ZsuCq$}aZFcLF#d4N!Tjx?6W;@1x zF%jd(#KVt_dCkuMslT#{e2s8Dmz6ad5P2)<)sPLj=@-8v+>pGcSbeX&K82DF;oj;V z12STZE9(*G$!%bQspMQ6m)o(nZ?+Y$3~$0m1)hld7!LnUy);}w{VId;-`_OOocmb# z)3%0Ry~dsNg|h5}EvYCRSc26fPLkEF?sVxD`F(x#ZnAUEW%nYU>0ntVz*^~tgmgDGucUA~8q}s(YUxI) zY#JM@tyZjj&gk&rHA*(Q#Zadqv-^cg=Nj^(H1I&Jon)^Xd z)980qvJ>6)McYqUrUw+H|NC&wzA(FI9;VX0FZ^V%>sw9H;?!Nd40U(n@Nw=gQeBYR zZ+@6*KO&MIbaxG12$3OP&h^u{qrX}ADrqqGp8CS=g(|H*EpV~B`=;B-sTsdJPZnUo z*fh6fw~=HSe{_Bq)`5oxqIv2AUIx<@p2`_?aT8bGRMen}n}=m%>8!Y)g{rV{Ay;PG zzHH-cNVuPQ)T)qH1~?;zb*-G)tQXr0sDOCV zMyT)2JW3b(?*KO1e+2B2u=^)V9)n9i5f@mU@PawHOn_5KZ;ne9@m zAS^QVyC`ZxHe=na`ao7Sb zvT9JHdGNZSJM60t<_261wf-C1Xb7E!jlxG5T!Qf~lR%dS-1SsYP)=TCCyR^6HN)+L zOl17{eSVAkdsNqGX!=(j>ziZ)OxJpNtFxm&xd z2dGYvk60>kn!GI+`X2h&sJ} zcTZ!u;r(+U5K{cxb@MJOK9ilv<+u|Umh(3W-HIjko_M2XOKD)6;Auj6qZ6Fq2a*IS9` zNr$O#!^XufQpbu>Gxo2P*GKm{OpoL8;%T!}5)wkn@Pa0O#wG&+==MKq>O=W}gN>Ml}_y0-*NiJ^Nh80-v{qE77rAxNOAkto?kKSeFJ0H$O2;be?M6+`F~~On$3dM@iSz3~@T% zR7$6)@W)b);+Fl<6in8uIbUw%r45${e1lfZwtVV4>{Y+1cU7v6!wLLFMf(ep#UEvS zv=}AYZhJ|s@qD0&)zP%fW$p?FZ*IpvN@+od-Jf#vmsM>f>a05}jf(6tN=ZI4*YVSv z>Sd)!L2CaUYpKnN$y=?tRG&H8Y5GdbdY5Id+N626_!E~rCq}Rxz5UXOlnuR#-+OA_ zC^{=2XVxC)mx4vZy{jd&=g7YuJl6JZU<>t40;M6Oeq-0v^b?Nc_EJr|D#kkSwkjqU zL&bs2I^@!*OQg;yq(2nh+gf!Ns`nB|tc*mK5zdja^FI->Y^==gwo$bH%}#`fI2DLg(Mxh&c3U#DJdMFVTOCia zPg1CxxS?1_J(F}^zgEYTR}$kGemsEstMtANK6{Mbm{SLnK$5xOj4~*4Pswtm%5t{s zUyMIwRcuX9xPc!Fm8WMel#&?LZ@nu`mUw=oW`i2%q#7(`J-+zClnot-xt^I!=_voU z7mTKNJr@#E*@%r7tQ@VawJK*f)zZ6g(`}TZHW5MUsKg#aGpAtJDe;Ow5$bea$FS>0 zPbTrb-@}5o48T!csvtOq9;lovmaeVp?_*|0dMvdS3*R*-7hl~s(AK#+v9>zV%umO* z&wONAskV6ureD)X!gbG-FT=)&Q_SP;E9r+PBImc)FJ>T}beN1-2^jhv8FHQHP%s+q z>dKnm4pHbWCkZ)-2tVdDjDS26Vx`(d(g$A?Z*Pxl6&w5H%1VW0NV%WGoe{$gBGi%o z=)Hi&05r)2*QRnNjq(-<;uyQ6?!L6+`6REYX|M>}_+6K}2=S(M0I^dZpIs;(x(TV! z6U50Akn6;%F$?ME`XN5H-V>-h&@hgU%>nY4PHN+gm2;60PlLctL>jNT;}$N#xy2t% zs-1j&-(zhS4lxbxf=WTmsjN#ri`r6V53yz6P0y;5H8Q>8CffWQTRVFh)cxrIp0sx5 z%9~EaJ8}qw3U)}0fXXJYKKr^=ufQKb%#C|Azwl}imex0yK-29gz`co!3m3q2#TeBi z5=c1K)y(=`xK0s~UnAu{#E?!0^&Fl70gn!n28)QO&_z2=%G*=e9qXZQ| z+)KCc#zQhS5N>G^&u#e-}Nj!J#NsA@~fWs(|jByu9^K(#_ig z<$qBn{!%L|$L2BLPYvgKMX7X(8J6ZH>=--?9cFQn3qYrk;iLqCt~y>isl|Z`b(QTi z;Q_=$*70)=d@Q}}Pam*!&2~{|_Lq=?!1O-rDKXJR!J_=;r7}ZS?WR|T)R4e%MvxFb zJ|6tzQ-#aMtU{Ie>#DP^D^z)i7-)i8#;@!_M74gsg6|iH-Gb%62*5Q?eLsQEzRXR+ z?UJZVM`>g`tClfk^-j&7*hj3S_H$g=onQl|y@+PRWHnSHN6lXojFMAL78w!6=;Svq zgth-Q-)vv`e)_qV2#U&=)kM*hz&+AdLaM^m$}u5qPcBuLbtj(p*g^ z>{UpaPE_;73SovyMZ;;thM|4u7sb@9w{Wj>=RY;ki~%Z8PNCOC7oT8a>!nqT%zj{( zoRy$8vKawT(~zmY5c}6uZ`>};reZDUe`Q?+Y-4o8e=Tt5dza-#H!(d_&$O?75EFxfa)Fn$(u$2fWP#Mr-3{3Nz} zY`BpRbWE6N969BW{*&yB=~5_miT!&}IeFgq^6Jgug)5y<^fTK?BYxbhj$!KX5^S_> z5@IHE8Z$kILx#QmQ)E{6A~%YRfZUX}woq?f{N0(`=5H2hE*a=->K&`$!`yIp|M4$E z*tc;vTOz0A@}$|-P-^KkjJygUeo@0`@2oEw6a=8dRbJ2r-&OWiG>Tz{t_^oT_?=L3 z;#G)AB264J%aQD_Eg&S}H+nw*J&hG>n%aJ)0iNAtWrgss3=f2IlLOoZF^i4?LD^U| zV6nDBQ9YjsiZ%`p@H_2E?sW2)@BH&N>LRT5!d6j7JNfx{K0?Pl%w}bagQ=~4y!Fdf z!)MA5!v{(H_4}|x#3nVX2*KZZLl)!s?UhH5#jqA`Gpuk>wTZi&g`8GhHoLPY`C6Cy zdS44z$=)&BUR8ulQ#r>txqq&^ZuQU{B(DQ8DTt~H9eiK!mVB@s>j0n9HWlvy9SBl; z21T)gel<}wkkdA&yd49G4Qd%HIO%g?_~S7(}QRNoqspjHiJY+s1D2qW3lJ)*7@i4HE|4u3Y~QniZ+tW(0&(rg zO72RXHgzu8CKDRy!Y*7`a40wTS_)5@e)q*Mc=|w+0Ka zvQ1l3VzwN#2+-upIJNw^4{11oxKS2Het%o{xz;9Ij W$UP@MR~texz+5r7{Qi>Flm7xa=Hh_> literal 0 HcmV?d00001 diff --git a/Showcase/Showcase/Resources/Assets.xcassets/AppIconDev.appiconset/App-Store-512@2x.png b/Showcase/Showcase/Resources/Assets.xcassets/AppIconDev.appiconset/App-Store-512@2x.png deleted file mode 100644 index ad6ccfb4b7c450d01ccfa29382b0bb84c571420b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 62549 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 diff --git a/Showcase/Showcase/Resources/Assets.xcassets/AppIconDev.appiconset/iPad-Notification-20@1x.png b/Showcase/Showcase/Resources/Assets.xcassets/AppIconDev.appiconset/iPad-Notification-20@1x.png deleted file mode 100644 index 83c7b6b78eb62b9113e51633de83d43ad8d0fd2a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1988 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 diff --git a/Showcase/Showcase/Resources/Assets.xcassets/AppIconDev.appiconset/iPad-Pro-App-83.5@2x.png b/Showcase/Showcase/Resources/Assets.xcassets/AppIconDev.appiconset/iPad-Pro-App-83.5@2x.png deleted file mode 100644 index 3f52f86088ae32bfb5d59b8a97e3cfb7f2958263..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12127 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 H7Kr}=t)gC0 diff --git a/Showcase/Showcase/Resources/Assets.xcassets/AppIconDev.appiconset/iPad-Settings-29@1x.png b/Showcase/Showcase/Resources/Assets.xcassets/AppIconDev.appiconset/iPad-Settings-29@1x.png deleted file mode 100644 index 8a0afccd226c3466afd7ebc29a4f7d5870dbe730..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2603 zcmaJ@c|25m8&@u&EQPMfZJH+6Ix}Y$W+qF_8I4|JU*>H!%NZuj88c@X;#Me2ifBO! zEv}@6>QafUEp*>f30cBRi+0gQ-7}Tm{yl z*MklEp}V>2)zU=Qpqx;BbX$P1xQIV2LSlF_NX=CU^C65!Brg>5gLuN&sB4g;nwt78 zaR3+Lay%IVI1EM--QWUMG=IEl7@&w@!g5g7#l<=-Ml5u~22(jij+6<7 ziP>>7$Un|2KoA!$pbN1s&KO4}12qr{Av}ySGD0F}D4noh>@v`^N=(3FzNjGKPS~$b zaXCI1CM<(6bUa`uAQAzL10Bz!2`LU#GKFr7ArVPr0+CE0k?jC7gGgmisF-gL7A2Gk zMGQaC{Tm&6bHauph?GGf#KgqlW5{?|7D@o zoPS0{Mt;|pBYx2Toc~+<@_<+=MDT;;utFw43n^Oi1JyqhsT9A(z~Jy?;SgF#cV2`X z`tpIpVR)m?izU1W5EdvRAqnCEI$;$Gv5?_Pbtk*I+ml!zNCVvgfDXD7K_Uxe0Zex? zi$k<4-<0w9a*P9*^Vi$$Z8=^&LxrqJvGGR@w88tWmEBRq)!Qjw~# zVie0_QQRFU01d?g{};<(${-#B%K~6HV!EMx!e9iJhrv<|lZkc@K*LyacmlCRCA3l% z9A!WQ1|gX^8WOt8;7H7u+%v>~;{^?%3rQ3K$&L&;*xOMAbdnukAV3?HBA}7T0K})z zsn~CL;SZ_%+VrRdjYK-_5W_(zBGN=unjMv|TBsC?9bHJJ*ohztUm&890Fna@OF&&D zsG9JHrkoa`ovu25pEC6FeNG_>T2mQ1g{9l#!_?F?UV4D80m|;P!Qu!b$mBPXC^PzB zM;8u1vI@1HVPv^?+q!gql4ana{!W7-{i!Y41|Hz8P40%qHV-sPHP&K*#hAIEo6!;( z*Ni#)Y-i%~E$!PS_n-AG8ydUO7X5Rlm{?DUjSdyn#TLGZJ@sO>$0zI5WFSR((9%Mt zHEWmXxBh2ZbJa)Q1`gtUnRl8k*cQj!YB)6(2M7A}cPKMEmxGZbOxNmPKKEyNx+YF4 ziV;nMSO4s-;@w3zSFZ1rrLT0vjSV$}Zh67sC04mvpZYs|{Q1m#I(qGoEY2J|k zV55iSiD4G+>Eq`*W+i(2vK&0!V0Pmzd)?#Sph4;?!{?Ugijjh3qT(I)azb=SKV&?* zA*VLr*W0b{FZ|9~^W@%xqZ>c4x&0@2kEcjA#}`(67~j>mVHen(PSR;*=RV7RaAfC_ zdjW{X=Cb$&W)J)5g;#T^x_UE#2*<>E%D8WJZr)-4%|WMJ9TSdZtZ7NW6;8EO6PybFO4=e_Etv1hw~WI-b-N%yvxw)Frb>4_~L7Q%agRX_*eQX>d6k40%=m z(tHBSH8dO;*4ZCNnT%V@vQDdPf5f=Zp3sN+lah8kSNQAwW3PRN4b#Ov^&@qGikrIYko-3g{8#EQwblu^&Kf;X41&t#pthOfo*H>N7ir(VA}(^Ry{ z%(QYB*V_2yyTF1C{=3L+0iIij6wRcb9RZ&D8D2;E9nnj3Mjzd^6uqbnGD(_qi(-3v zENYgu3_3d@zOYQAVtcQsCN(N3gKLVzw+5X)*0!@aLI=meZ8_jg^YLnkC@ZjE*|24M znQM>0dVZ6w)m!>pK~C=W)ug;8<7jTzInN^p_C)W__Cd0qbQ2j1swR=5CUekYN0l-l z$3*j0SE`p|%bw+vr3tBET@jC1}kTW9g!VMtUwM(NA+*uddyBy zeNz?@kVl$Vh{dZUI?dU|v=v(}E=~-%7}eimQnyN2g}@k#)t(c?;ktJ=8IlVWf_c=w zRK}XYF1vSpUG`P-<+ivX9I~?mW)Kp_K5UPH&+q775w&-D@+_LLAv*huH=#b=p z&-3O4`m}0RPK31EcM`6_JFRH_N<0EQ%U<}^db7k{`39pGNKy?o}jd6@7Ihv+h9=23?iFoXaK0-gug81zK30==If?Q- z_IwYhfAD#Ot#1u~yV3Q>TQ2Ep4C0*bRQTS@UzmYh6yv^Ueaqwy%-<>WZ7 z3Eyxzr6z05;V@PuV<0@cve@O-m4^Dyr2KrQ+cNEx{SWV6G%wqoeaj|v{^=0t)%ua- hFr=xlLi@80QEgVgyVZ&7FWIW!HxHHLhC-Ot3^R7K2#4&EtuZsqSY|L|UlWS4RFq1xCA(x_Dza7D zghZAULY5AdC3X77Ij8fTKfddGuj_r5`?-Jj`g`6#-ehYl(>=nn!T_t+KZLZS0}1mF;GzKlJ;Sg764{r^26NKH5r3qxVGP@umbFxO!a z#S3eTC;sh@yVD2L*z5o-6dD>D3JFC*m_go9I0l1(!VpjdLX)eZ$qHw%Nnx4{meMZ^ zcq)q=L=RxonGDd5MUp2on5_@y2K!eQ{sFdhZyKBRk8uX;?|N}72Mr?yK;aM=H0V#A zofLneEG_>(!r%WNZ5G>>`rqLHr+t=vcmNe@OJy;GgUH-QdMW+O)&F<2qxg3YSW8ln zFO}O!BFT?M{qw-m5__B*Je@)E!!yaj{!|9r46hFk4yIGE#wa4vgos8E@OT|O5e~=T zi7-5jfG5ClL?l56`OCn+fm~k@3Kt7Q5=>xl0s=`yA>eQVK?j4x;88kAEgdu*se?xU z!kRHyY!ZV^-Eq2urT-TT|G!u)E{IBEGlT4zOut`*vZgWFOcsq90K(z8?1AfmR4qwl zI%7wuw$pH~2X4Z6Y7jkyN+AX@{Xu`$9!vipQRu)i6oeKTp^2nwqcye27=)%Lnam}s z7Fh>@gi}4WFevcfc*?&@_ZR885^g2|zXHN)Q@mh0UML++l;_TX($dnzP*7T$UQ{hl zvX>45j?mTtL%AVBcS!gzQvMQgnZC39=az9d|J+k5gWJ;}?k&96n>o+@GL)F%jqStU zjOT<0ILylQzGbb5H!dkIjlSgJQEL{BKc7~koIu3}-#TTw{G0DXtDmI}NWw|~hXX#o zV}Wn3o;)mk2_%q3FiJ47zJg7+wcd9@UuYjlk#cVv6FvDUYVN~$PR@8_rc;IYhurb& zU$=ATChoIdI1C*XBRGqbHo87^9O>-sLXbjQp1CGqf4wQ+CccL)T`9Xh{(2Wo9F`HCNlBh>MYrG%NB_v)O?mFbBa)#0?Fm!xW{bV~ z5hVrc@IBzV+Ee4Vl|8$2gmwLowtkZnG`mP|D5Hu0F}WFQVGw(FjF?EauT_jyXfA&_ zeMsP2%~T1du>!vJTbdvqOMudo2$!@)&pxSHnz<& ze%5c)71|Xp2TQH2#4>#97vhPin!vaipVqYRV!8{RQY!lZV-u z`Dydr`jOdts&84>vyyTg9xu>^gFzmQ(<-Zt4h`bNq|<4izLV`mLzKmup<_|*MWUi{ z2fEh$E*SteQ=6h@O4kOE4|&;xz6WP)aL&<}(9i1z1)S_>%=C_ zMms8e84MIzYP6j`(jAs2N(dhvOn~1q9W?m;oSo=Y(UDw*h!=+f^PH~=|5$Ku3(!rU zaN$Ag1XOpr}m-QS)$8LBxKusbfVtS0+@UOQQkyOQv}sm6ul zQc}F_nKJ4X;%2I`)*frA1SPiDSuFYivP@Dx?CDWXZJG7(xM2#0r(C6{@W%zBvLFod%rU~RPU%$0 z_C4=l^z69oogc5`>V%e76Qx?7DS*YvX28P(BqO*Iq zBIMgX#$}|V7PWX&H##}DN^I&^Rm$(&s*)-kva%-JO3s<&qmSs32G~3e)*iY|iGdOwYg{f%{DxwWy6byWsyIS&d-OgRy zRT{W7R6j56Q+ah!Rv?z&$1QY$?Qu)iwVm&L*Mk6QqorzI$!*t_RM9rUmFUP?@Hhi8 z{%SXL6g08Dzx#8S{2)AaZewF)-YJt^Skd3(=omf@2}Tl$TQY^<*F)YD8#7hy}?%ADF!TW6ujCq;v6p;7jC#-tM50L3jw zOyzJ6ByCEC)ZFAOhrSeeIws-UW9L_#Kd?gZ$JL?xlW&d=9%z)TX*w)dvj?a@5k^ja zS1lnuFT{5Hl%IRI|JFkRx;BW@w4HGBPO4i$d&{&BuwqUZZyV9{e4ZupQ0vWli-P3#prL3@3eygh!WG`HDIePf&4%5VrQy~vA553D$N{Ctp4 z>}v}~yA{(q&s}}BP<>WY#N)(%)y%K8l4d?Z*AfV|C$ox^`SYVr5DY>Qz) z{rR4fiT0v}urSmQ{ostKOx8+IWr?x9w^ z(>zl|i&e}9h@0QapMF;oJT89U+LQ7OoRnBA!YY>I^Qx6VYsbssMstq%xi`sq7ul3T zLSs<*s7nGASrBx5pu0}_H+A~3bc0+-=Giw+&Sg`^%4NC(nvCmm#?DE>E~jQAcwFAe ztJ0#XvVU7@&{uB)QmzY$EY^$l5=GR z%itpuNwwHlgRI_{54dLBAx|1;taVU!est3}-&3X49*_V~H`Q0MfuKoGhAr#y|0Rt)a3Z|n(*wssy*<)tjw%$=F>jcfN6|S^Y!)ob}IZ`4Qa|Jgw*%uZ_IWOZklmg-OU)%3a6Chw9k=OGvYad_>=;q7Zyb;*DSYvz zYW^10N|v*dG|@1~jN0ft6BU&Qt=4U=?hIH}yV`p_=(c^0wC0qzbx3^KQVWb)@V({o zjXp@c#pgK>;M$%j1FT5qN0~=AAIHrs^&S7_dWBOvrtcve=~>D+cYiK(d#@FuHMG)_(m_AhB@yr%bGsQ(AvlsZ zzMQ`c)%wKVLHXQFXEe-vAOohUK0bB1Cgf^9Kt%h)49l(KO_z8UkNO*9%xy6m5h~9L ze+TuAs6)d}tkQ9?W!{heau$~uuarOI-rfCT zqv!JSux5i%gy^GVkEf<^xYR59-Zz)uyXr=V;CeO0r&j9p2g8NN4R{hGKX9s@ywS@` zt@rOMLwf+o^U9km*@`hY)YEP(4?Bdk`R=>e6b`RRn(o}Jd(?Y7K`m0DFI{WgN!4Xv zxdv|U!!$L#bPv346+!d%(4FY+@w!Lp2r1OdQk2otZVw&Fzc^AXA#`)b!N^B^?V}L* z_*vNMsPL0wmA9L3OgcK##sV|_E;lys(!Q3*^CEooaHnee+CXyh*~wi+_bYpfUq(Y) zR3~`1&mv4Sew16M2oGd|C<_tUkHS*K&ZhxByNoO3g#($>WKMx~iG(CvSN>h?biLuO zpp{lgAYWk`=IJ%3mrw4DOE`wC8!BtK`Wv|Rl`mnnB(_YLD0WwDMT+e*8pM6y3m~2r$o5gtu zclPPccx%ZcAcQwNg;p6Q9yjLmzx!xwxKGg@{nF}ne`0artX_I$`%E50b@Y>pTD#p4 zYMHZ2I-zGOG;&B(0@YZSd0tCPOA>7}RCWFuKLU7lp=@?*X3giz`v(!%F682yTEEx- zq_FlmHgu#LYom27ilNr;4e0W}k3nZ$O~tzI!e1*niKvvehbFs+hBTUUn013{SqWPK z`Z0b5n8@>svpFR$WIW-B5i|kVU#23gJtV`+O%Vji@E%a(r`PutK&6 z*(liScXrF%zveaREoV-$0ql4b-K^9N9RGS!mGXX{uIBa2#)gx>W3aNh24$b}Q5K)) z&#CIeS14=ugW}|x#xHvq*HU4R~b6Jxg8lpF6?r8JG4^V>j*`Srv?-$ zYvlQ!caQj9^%XTdC?3+U7~V4Mr59%<>(l)4`k39qd=Gm16(DDg+F5r^sK^jH%D%WZUsJoEeuMW;g@+j)CK%PdmQ$gAp6_zQR;4I`^26r;Cvger`bk` z@2d;#maB6mY?_L>J&?-mGD_5bFx+wD=KWa0e&kGC_6X?*;z-_wJk0~29_botzIB~c zeH*&Wzc!OCrsg?JcCFaBGHd*MhQdk~`4fCL`6g}iqOwOYDt0O}Q6#-P(GCW1@vysV y?EWU-570LmU;7;#3=IC+F;}CJc@Oea;uIi$q-8oyW4nFluZtPM3SVt^|Efw_O@0u{4)1vki0E);4S=5ua|&+GMkFQ4c0{=7feKb|AbPGlv8bqW9gK#8)A;3C_N z7T*=}vNds`B1pDri->fQE6+z1$`G&tHY}bu8%POa__AHt43=bnE87A9kbA_T(M5Es zBc90%GGi?2n2Cem;r1N(3|bc;aY+|RM&!l9F`?$7n%yA^6l7uoNZwO zwriLZjTsie#IZnDTY(m0yv#rlTf_j0g95oiyx0=--7a2sUKB$?!0#%e087x{PSL5( zKs%m*4aAwjAxszy4m8J^F|aI@IU0$=nF0|o1QH5ELJ>#^9Epda@hCL##{-fP3RpgP z7Xs-Ao$O`_@)L>pcqlY9G}J5yMf1LkU`$C$8&xX3Ng}h(^Q&vcyjlWU-H_@Wvj~MV&h9H0~D_yT=Eax9A>_4%1I{}*^;t6OxUf|D$a`xkictSrOA82PM>mE23XhdZ&Iow6z=EZ`` z7-Rtx*aA)nn?(}vf`H$1kLUc07g#usg+MV85G30i13@uy2#7b6DQi>|6N^B?+1@A| z8uSCt`Ym;TH@!?Ei-iBvA-p-u2Zr@QVm2spwV3xdjA zgf2GWZ%z4ABD7c0f8CZBSSUR!E`XFF?qlF17rBN-F%_p$!jZnO38GD>%r z+IK%*cTMZ=#>DQNnp~x10AwZg?#9TNz~?Nz>4E8<<$-CvEW5G();S;ERF8CgIO5(eK(?zh9npn{BJ4n6J##PV6S8W`cw|#7@kH6fHWrnM+4q4Ztqn~ZyddDQ+ z=Kcu=LW`=~3^Rs(oE&aOi&(+|rN@cChQ=ScBic8~T2@qcszr*6YLi!*9A4F9>2@apq^;>D zNgk}7^as6_ywb=Z@AR;rZ&Cp8tD z$Ya(&Tyq#e-EHVL`p8*m-`s4|FH)|RHXQXjm??jP>pL z5Y(b-y8y3D*+cn49WhoWgB1>irc2+helz#V+xTTe)jD3=II5~sC|{|Y6k$)7BK86PleoPV_6rB>ov>&zpRX!)HB zDBKbG^*Z?dw=ZB_R#;ww{(!As9&FRDh`x4mpvSn4ds1S&JE;MEa?id&eI@15!`@pV zU6xU!3c|Si&T7+_Q+tk^#+IFVTI`*YI2mgE(L`P$uiLEYT!nzKb$-Yi6ReWrzi^Tw z%InDeO3h12d|C9Rzewo?m-^5{cX9$Rm*urO^DQMj#e%M}q1GD|JriJ0ZyxDR8CY)J*~TIRUC-N-B*)ME#5VKeCZ+@F`oe3r zw7Y;a4OPMYIY%Zt)JMT|6**}iIj*xdxfQ4j3XKs1=|^CH6gc(yG_!1n+_vynjWuq` ziPo@{TwAX>)v#dnMcb8Ksp{|KPfvwrL-sjSTEiNej){yps&V6Q0t<^rvT`49atq5G z)y1A!rWw-zZll(_g)2Fr6Dg-j6$M!;CK-3>C;Xj8=!DMh|0Px9oHib(7zzHo;444u zHQ=ErSnJ??N_5~#TIW`sBqk(cV^sDy#8KBDv*w}><~2IWJ&oKl7?U|-tJqfhzv@V! zMEQ!rn+&O23|EFHDGPB+O(m9yE0y6bT8TG&+i2~qw5c8WB`XpB`K-$Gxz118xX*eW zlixCVM(!=~^cQRD_~Yp=tE$Q*XO^#RR0w}PQ@7>RT8F=uvW_ctbq`uAgdQ{kMy}RO ziJdX%v{>8Lx3V0-w z3qjz$dm*V_C%d>-7Mr<8qE(%FRYP8f~27fW-NI#y@1vTyDQ z4D1L3FMC~~1%7tH{pd4KGvw*FO$n{W3Wz+7;n(5!b&2OkiFQLKjKJs2bcIjnb{652 zm$e0h9|)3m(^wxqK)@S9x2q*zl$%A{UUY~~I~k*}5Yx8PX@_=?Vdtyvd&?6K7V2H! zy8;|;pPid`qHaV9yexB>_GN>!`L5PY4Xpa}xAd8?bswgo+jr9M9_qbXHR*nTwD-;h zw-PKz0=nl?5pTR_*984ZT+KV<){H3rwOd%Fr*f!|i`_3xNrrA&9 zGcd9`-#@4L0t-%Wo^?}yaRa&2q3#vrz|70>)0Zx#@xG|6=;9wOp8%>xX}@hQu~I=8 z&|E%69WpJ`*W6wbD){4b`-?HJ04LWSLV}K|d~`z1xi8h~_B6wava@pP$I||^E5GNv zY6zCx7q*u?ii7k`ct%3KrYieX3Tv0YnKg{qukw+dGoG42zF1(?>f+p&!@wPD9CxAt zKFvPgty}Y1Pf2H*B%i3`YeV#KzM0lMI5>Q}S8t@f`?NkWV4+M-vuvP!&4AgN((8>L z&3nuAJ=eDsV_2A7udmWvZr>Es>?Y6X4-a98r@qZ!urQ)LsU};OObxMGG+0}QJNDAV zyxa3-eR0)KMsHW%i){zyMzI~MDjnBnNwt^E&D9wdgkCE3!#du6*Xpg3GP+7JWwI!v z3)8mAW^Q-(>9jSgvjOd^bqf8TicKq!irIOQMeX@t%Z%QW2e zH1=aTGOXa}$#n40+dZEqM(8=y$l@S;XyAJv=@sG~Wo>gGEZ}^7$om#l6~Dfh{<))G z9Mb8V@yYN^#8~3j1a-j_YTK=LPsvpzIk!_!}9!jkHm7N_dTA6!W}A}A6WZ&Lw6^wFd<%TY_1bVnjKRW^rb!;889^T3``sZ zHs08bXRsz7+asu0B!?(k?N1SaiO0pTUBpN=NaM52LTuj1VleewA?` zUH<~x*5yES-Tw4H6b4Wxwp!7fZxXi4n~!3|jxRr}TIxOwx}J4bfBgJfHLk@#O^n00 wvo+ikuYvj-V?+nzu>EtZ_8Tlb`KAB^Shg2iNFFAySo}kw5S<8xw)>*~5Aj;Ii2wiq diff --git a/Showcase/Showcase/Resources/Assets.xcassets/AppIconDev.appiconset/iPad-Spotlight-40@2x.png b/Showcase/Showcase/Resources/Assets.xcassets/AppIconDev.appiconset/iPad-Spotlight-40@2x.png deleted file mode 100644 index 1f7361ead81af3d11f1e2d4d7b50d10a42ebfeac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6364 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 CxP(Ul diff --git a/Showcase/Showcase/Resources/Assets.xcassets/AppIconDev.appiconset/iPhone-Notification-20@2x.png b/Showcase/Showcase/Resources/Assets.xcassets/AppIconDev.appiconset/iPhone-Notification-20@2x.png deleted file mode 100644 index 779b61b9a80b16f65d337fdcef674a89e442423c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3342 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 diff --git a/Showcase/Showcase/Resources/Assets.xcassets/AppIconDev.appiconset/iPhone-Notification-20@3x.png b/Showcase/Showcase/Resources/Assets.xcassets/AppIconDev.appiconset/iPhone-Notification-20@3x.png deleted file mode 100644 index 28b758c0bd6a8e66aa30ef27e82f2be076111dc3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4786 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 Ay#N3J diff --git a/Showcase/Showcase/Resources/Assets.xcassets/AppIconDev.appiconset/iPhone-Settings-29@2x.png b/Showcase/Showcase/Resources/Assets.xcassets/AppIconDev.appiconset/iPhone-Settings-29@2x.png deleted file mode 100644 index 6a79406ae6ee2469d24ee84b4d96945d3082aa31..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4578 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 diff --git a/Showcase/Showcase/Resources/Assets.xcassets/AppIconDev.appiconset/iPhone-Spotlight-40@2x.png b/Showcase/Showcase/Resources/Assets.xcassets/AppIconDev.appiconset/iPhone-Spotlight-40@2x.png deleted file mode 100644 index 8c80963fce2dd6442460a8827a5566642131e023..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6364 zcmaJ`XHZk!)(%aS5~_4GM5+oQAwUA5NJ5p~iwLC9A@rtTP=O##niS~>2vS6lBA}pA z1QDbtMS4dFMVg4nhwpvgd+(2L?wL7f@4e1?)_PXid*;lEH8#{{WfEWl006AIIvCTF z(fH4O`qarYk>h*S$-p0=X&qojbPfo1@*@DQ;E7lQNY~5Bg!iV~H5l{dCUB8>T zb%3>jz7me;CFAr*M<&F}=L8J^pwvQqoNyk501%eo;^wUa-e`FR2D#x?z*h1GvIahA zf~%WOm>AT-gB07A+@rE#*dP>>>0#tDIkE6U5kk(WU*S(qF|Rt^G_lZMJE$;vCi z_cxNS3jMm@oPF5;l*MI;YB?u%qI9MiFPKM~`0)ZltNQf*90)t7PXh{2q zdIva#NPGKV_{Rc<;E(fj^9gVxdV~I0bixt?1605#Wd9X~myfBNi)(=Yzm0qQ|DCUs z%t1n&d>~L6S%}|XI)6g^2W4RJzY$(u|JL>oFeUtl{Qqm;-#pZZ05K)_69fHlCxvvr z@L#U}x1&Fbf5)I?;N<5)I4Pu-lczu7uNMXeN=7H--MpPVF+^OT7r{F~7o!3W40OXQ zU6I$4)6i0YX<{%4j20A%#AwN4WHm9GP_&kuCPMBX1OE*?@g;*l!6IO21Y8!aDW@e5 zgF-bm5lA^CMjjytM<_t$5DE(aV0FFy1Dw2Zgg;LIVBP+M#r#jK655a86hQPdClWpX zX((e?VgS+KmFNRPqffdAiU3I(IN{v9{|Kf26#T@)Nx&F_pIZ%ilSYN(5HL9?0SiaUga5|k|0{L>YWfq&NhCi15K>aa zJIf-RI9wWumxoI`6W~~!GXe&MDI&m-6N->OP556;`H$$N)BjBWy~|D( z|K6tr?~|JPo$SI57Cj9BfV)r^bHzMlY%TXpz*&pz&Q}#-8)EdQ4>>hP_BDBEIBaM+ z*{>Cdv8xLTQs4O|&h_xes@yKZDc)gS9?=$l@s**(3)GQdIiOCutI2MXEJlC#K7dBU z8cmv)wjlm?mT!$=GM20gLX`&Q}SmRhPaC>w|!@5)FcuL#zO97+4&m% zGSfVKz*!P>UuqKEzp`o==366>FeqDxtmd-@tnTyyApY^OrxX~P1Th2!3HehLOi%B| zubwL<>AgC6_sYU^N1{@1M-7i??5ue)sSMeaF4n3Eg{;2IdW@rsg~h>PGu>kp-TIAZ zS{_EO=7`Vw(zp_xyu@L;l#!?y#+Ic*#*aHk7Dd)~2NgHqCQi+%&x}0MOdj_u^5!hE}F1E^rzsfJ#-%W}!7shtV@9A9hrKejv*K@Ae_G-YymHMNc(qrYr zc)k@8X+rkx#9>9Q@StwpeC*J0?tu5j)?Gfz(B3oE``a%$d?8%<`zVs(^9RK=wJrLF z?%Fpi0n~@gh7|6uC87)a<6zq5vx5Cwenm2@Vzvllkxox$LP_TGTN);@p;XDtZF=`r zQbq(hNo^_|q(I+)ez< z0QN|~#ItPmGlg*m-g!|U4H)H_aF z&jxj!`517FGuZ;P>QmxAgC7jTzB51X4R27d;*}k^sJb-09V8i(+V8CH>B#hJeD&I< zVQglnZ-)Kn-SD5@G`_&J5$@}bfj`zA{Dj%npx7dsSAgwFql1i&d(8Ht=~`LyzBOrpXxgsREZhd4_q` zu<^&3+}Lb~c-XcKS3=*j)%H{lF8e7jwbe(0P3zM8+2w`hi@4>@re1XU>xBWmoa56P zuPF^MFM0}6F2uy95E5hsPxB}g4Au6<<1BNglSl&{AR5oin?FXhf{YDu`o0Bhy9 z$3%~l;?9rgs|#&9v9i;EmQ)?YUZgGE3-y9p+@O-a{f@A0$UPN~FP`sP6R}6HuyUXe z>TG}!w~#qtSJw6bjsBa0?dBG}v&!_S-uvlVfpvw}>Ni6llQON(Vq;UQ{0%oNWlsK#hI`v^=VvTx4=wLf(xyV``LzHTdjk6$Q4>1v{8u$EDc_Bq1n zP(TZ{^7t|WxH~t=ETD3yr>hfj=lkvSMfW#cqHV3ZzgvWDY&BSy9*ILS4yvwKkeGUA zxxBKU7x4#i@}dh1hOkvR9+|SzD-#>S{mTa`iPLBK)~`jU>eAkGx17c{mF_A+cgB3U zcGcYmTgovPxPIkhFQg#~nnz+LnhnkdPj={0cIQLx z*?RB*U{-c0E0JJ9d1Zka?z``}uJt8HO{etSB~~%N<~f(+gfiI!qD=p+av?<@9UGhH z6%1&t#xz}T75nj9DrJz=sjDYHT~2agI~-fksqFfA^g1#{t7NG6-b=lzDb(93wPBHq z@Z+GS?Wy?8k5z101ys_Q;ecZ&n;mlg(PpO|XT9ln$m{Jo&j42RkF}tZ7d! zBMhUaH!mf4r<}Ejt#zfm3%!`GbWRsjHcPL zhma!@SLy!b);_kxTJ*s~2IxgV-Tkw6Sf1KK<6;iL7WCQHZDDNJ1Vb_oTUnb{U7>~D ziXN%wAtStxAHdpROzc+HT$vM`gn&+_;8fOEJ?zuRj*tl80+jW~oGtNdqz0U`` z(WfwT97guBEVcG$#lAe9?CjiN6nmNCS#*UZIX!cJp%($E8OI1>F)m=6a@tADfCy(J zO^4p|6NX>vHr}++_}*Q5cji*9B{}#Mp!Pip@q&k3Nr9`!Cl{q-UN=e261+po%){6j z*1p|jEWulvN~NG$u!~MHH2vFr8e!F}?84E?aj(kXUtVPrB1tlnH_XF8Kam@!C`O8u z{Yx~-^q9Fr;pL=i3fx3O>sy#T4+n3rUIKL7vLp>iJ6UI^+0zo7V4;pFJ>stQ338Zv zIJ|;1#-0Q1!4EFhl5k)&+^nXNm8`4By1sVXwe-q{4Fe_UUIr&Cc@Vdw9dXMTD(m4M zufyll_7h-isk^i6CGI}6ivpqNv#A;3`e_ygmie_I=pDn$C;1?=Os+~p$iF$6d#94P zKJd|jr>NUwUrH!B{3N~$nm*#+)rQg4h`Is#)+&jah6#fq#DitWa>TU^aZa(;>oavK zL_6E76EEqRvd_GKGV>+<-RoFdV$O(7VGftT(YY+t@s_oTXa3Id{Lv3XCaQ8-|DfI4 zjy%)0|IHii9$#lj-Iox>R<*-{m#T0B#h11~ zX(Jzob8Vg%fBmo{1Pkp`6V&sxx}#jjX%{M0TcO;NhTzhRZ$~eQH2ZvkUsx=xV+&wF zHBHqu{n%!gb0}aqYO|hsWD)AV$;@uYLRNWmciC@gAyA!VFjwqnxQ|SZ`~=r_Q;DO@ zjlJwt@v2&_dX%-F;&^kg@cJ)^&k}QBliXsj5%IRNntRjsnZAZM_eX{Ka?;YjJS=Wc zPnG^T6g%+%;>`p578LKSK^OZ4oP{ZpoKU^=pnGt&KgAwsAM5tKdHb2(Hx4oac(hy8Oly4`OhV;dKd?%_0Jg`tn0L%Xfer@`M^S3qJNEHQVPiO=t?G)>+_}cL_~@ z9kuqVK*^rD#(JYJ)2GN$i@0h;d9Z)hUixD=F>VRC-=pf>jly?oX1cCeGncq92Jb&S zKh%3fsI0E1`qa9$eXReb%;-CnH!7MaPq*~`eckGMkC@>XD5Jp|_|fPM8-@iH6Qko+ zDkd;^5->fd{BYS~$4jo16dVi>K+keaJD=7yC7&6^(5%1D4N|#QrHFfVJj+a3vN`Gr zIF&VA9{Q4*Z?f{+CeM7xshKQK-$ed!nyms}N->Ens&xUdbqv^YSY7#g5OsQ*>!}xW zdv{M=%i##8$jYZs>Bp*vmmljLhkxXGZ&q=07H9Off3?L6F6{n;uZ}fCsVR^sZg!sX zFzLH+N5>5cDR@8)mG1&9EZ`@%$dK15w6aLei_+uH!y@Ni792!b8>ox~_fnm|?P)RC zpZ2mJE!64S{xKmL_#1ye{~UF|yr?Bbzy6#|^4JIcSXQxa8Ft||GH^bh?N^!o&#F#` z&(*CJ(uYkt)+my;jC9m%X_wMaqxR{{nCR-q%($)Wsoh~{ixsL|*@t>2OA5 z4L6rXS~9-84A|g^Pyr zFi=VKg%qhaIZc+*S+@ z$CTyRHS?CeMrzndx>Y9`(Fde2CE0}P>Ij? z0}_}}-epbqRXNv91}v>iwQMU%nG&Ec+MCxIt+JC+Zi~E_314NLY;J9zwuqE${FcDM zDYho3bNZTKuYlthi;(qfEmoYUUVMh@sJF68W0#hRtG4JtvtPstrAtRBK_ti%Jm}n` z)>$y_Mk}AwviNA?ZD2>sjDHSA911UV@K*}&(mNixMe|v;zkP4Z+|;>bFr&>JpST^l z?4F|@R)4?zM@6b%qV__%MD-WLl%?&5&Z&%NWI?8(g-B=Z{vRl9(ldzj>3^p3cU}1^i$O?ys5ZDh_VQ+fxxid)f%k8o2)S zFw)nej0j1Ql5V<|a0qiZrNr8Tn>H34(vGWAx~mNPPy(CgYMXc+>Jc*B^+Vy+ov;R< zduopYi_6iN^xcJ8*ztNiPD=6otaxoEXbd(&1P9JjA8(HSs?qxqQ`U05EaclrQJ&zr zM#W9!#)4D8LiC;Q2m5UD6wK}-`r2Z+(cP)B29a-Nl?>+^4W-|vn3oSHT`{z;coa9h zR=+xOb|9zMmMbp8^K*pUv==<{VB9?W>g;FlM*6(qIwUHNla+%mHT&H_;s%8AL2fZy zGQSFSqgv<{8_}eG+Kr}N*|*U2m{^QRwK8>!hv^g@Nz^a|Ty)tHk%3tsv{fAxB^!f* zef*^FFO{xqxfqwSsCUh}v$0++c;iwtsM08}4V5t)6RskPQ4CI9s5k@quuU^k{gBnj zA(w&)>iv#RQ))V!u<*stCRY?Amgh$(v?yj-GO+)$>#I1!$rrEGtCoO zW%0Jg>#dVbdl~Le3~56ZqNl|AYHq(0-s7oU?xct4kZ*bs1&5U)zl9`4*vnkAn`0m+ zi(b#|F>9v}sAN!by`pV@EEuoF9W^x@C6MfdVhd=`{V>z3(6k-Od8`~ir)Bd@I<2Jb cnAZ{Tj_}LRSN%Zc&;JHpO+!qzhU4x30|2v?tpET3 diff --git a/Showcase/Showcase/Resources/Assets.xcassets/AppIconDev.appiconset/iPhone-Spotlight-40@3x.png b/Showcase/Showcase/Resources/Assets.xcassets/AppIconDev.appiconset/iPhone-Spotlight-40@3x.png deleted file mode 100644 index 386bf950754b4244f41de2aec1f274f7d8ba08bf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9469 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 TPS=>fKO||YJyoq#whI4$uAz|X diff --git a/Showcase/Showcase/Resources/Assets.xcassets/AppIconQualif.appiconset/App-Store-512@2x.png b/Showcase/Showcase/Resources/Assets.xcassets/AppIconQualif.appiconset/App-Store-512@2x.png deleted file mode 100644 index b9811829e697b03b735242fa123ba14a9b2c7649..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 55398 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�~r+ZP_H9)aAv@dH#7 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 diff --git a/Showcase/Showcase/Resources/Assets.xcassets/AppIconQualif.appiconset/Contents.json b/Showcase/Showcase/Resources/Assets.xcassets/AppIconQualif.appiconset/Contents.json deleted file mode 100644 index 723d49077..000000000 --- a/Showcase/Showcase/Resources/Assets.xcassets/AppIconQualif.appiconset/Contents.json +++ /dev/null @@ -1,116 +0,0 @@ -{ - "images" : [ - { - "filename" : "iPhone-Notification-20@2x.png", - "idiom" : "iphone", - "scale" : "2x", - "size" : "20x20" - }, - { - "filename" : "iPhone-Notification-20@3x.png", - "idiom" : "iphone", - "scale" : "3x", - "size" : "20x20" - }, - { - "filename" : "iPhone-Settings-29@2x.png", - "idiom" : "iphone", - "scale" : "2x", - "size" : "29x29" - }, - { - "filename" : "iPhone-Settings-29@3x.png", - "idiom" : "iphone", - "scale" : "3x", - "size" : "29x29" - }, - { - "filename" : "iPhone-Spotlight-40@2x.png", - "idiom" : "iphone", - "scale" : "2x", - "size" : "40x40" - }, - { - "filename" : "iPhone-Spotlight-40@3x.png", - "idiom" : "iphone", - "scale" : "3x", - "size" : "40x40" - }, - { - "filename" : "iPhone-App-60@2x.png", - "idiom" : "iphone", - "scale" : "2x", - "size" : "60x60" - }, - { - "filename" : "iPhone-App-60@3x.png", - "idiom" : "iphone", - "scale" : "3x", - "size" : "60x60" - }, - { - "filename" : "iPad-Notification-20@1x.png", - "idiom" : "ipad", - "scale" : "1x", - "size" : "20x20" - }, - { - "filename" : "iPad-Notification-20@2x.png", - "idiom" : "ipad", - "scale" : "2x", - "size" : "20x20" - }, - { - "filename" : "iPad-Settings-29@1x.png", - "idiom" : "ipad", - "scale" : "1x", - "size" : "29x29" - }, - { - "filename" : "iPad-Settings-29@2x.png", - "idiom" : "ipad", - "scale" : "2x", - "size" : "29x29" - }, - { - "filename" : "iPad-Spotlight-40@1x.png", - "idiom" : "ipad", - "scale" : "1x", - "size" : "40x40" - }, - { - "filename" : "iPad-Spotlight-40@2x.png", - "idiom" : "ipad", - "scale" : "2x", - "size" : "40x40" - }, - { - "filename" : "iPad-App-76@1x.png", - "idiom" : "ipad", - "scale" : "1x", - "size" : "76x76" - }, - { - "filename" : "iPad-App-76@2x.png", - "idiom" : "ipad", - "scale" : "2x", - "size" : "76x76" - }, - { - "filename" : "iPad-Pro-App-83.5@2x.png", - "idiom" : "ipad", - "scale" : "2x", - "size" : "83.5x83.5" - }, - { - "filename" : "App-Store-512@2x.png", - "idiom" : "ios-marketing", - "scale" : "1x", - "size" : "1024x1024" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} diff --git a/Showcase/Showcase/Resources/Assets.xcassets/AppIconQualif.appiconset/iPad-App-76@1x.png b/Showcase/Showcase/Resources/Assets.xcassets/AppIconQualif.appiconset/iPad-App-76@1x.png deleted file mode 100644 index 0498f53e8561f5ec026d635904ab10f4c20f187b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5781 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 NXYFM5$ige`{{a7KY*PRL diff --git a/Showcase/Showcase/Resources/Assets.xcassets/AppIconQualif.appiconset/iPad-App-76@2x.png b/Showcase/Showcase/Resources/Assets.xcassets/AppIconQualif.appiconset/iPad-App-76@2x.png deleted file mode 100644 index c66f33841ff34ad8ab9509d8060e8f6e46f30a96..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11022 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 diff --git a/Showcase/Showcase/Resources/Assets.xcassets/AppIconQualif.appiconset/iPad-Notification-20@1x.png b/Showcase/Showcase/Resources/Assets.xcassets/AppIconQualif.appiconset/iPad-Notification-20@1x.png deleted file mode 100644 index 9405c7140905b5dbdf353e16163f2b5fdfefc0bb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1910 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 D{Rvu_ diff --git a/Showcase/Showcase/Resources/Assets.xcassets/AppIconQualif.appiconset/iPad-Pro-App-83.5@2x.png b/Showcase/Showcase/Resources/Assets.xcassets/AppIconQualif.appiconset/iPad-Pro-App-83.5@2x.png deleted file mode 100644 index 4cedb41e2f1f71ffa67829b84cf733a245dfb94b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10957 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 Qe?KtQhU;t8s@X>WKV=64YybcN diff --git a/Showcase/Showcase/Resources/Assets.xcassets/AppIconQualif.appiconset/iPad-Settings-29@1x.png b/Showcase/Showcase/Resources/Assets.xcassets/AppIconQualif.appiconset/iPad-Settings-29@1x.png deleted file mode 100644 index bb1b8ddc5e9cebb923662caab3dc0caa5cf78ded..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2460 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 DzzkYV diff --git a/Showcase/Showcase/Resources/Assets.xcassets/AppIconQualif.appiconset/iPad-Spotlight-40@2x.png b/Showcase/Showcase/Resources/Assets.xcassets/AppIconQualif.appiconset/iPad-Spotlight-40@2x.png deleted file mode 100644 index a37b12237439d58f5e7023f5f5a404e98239d2fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5890 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 diff --git a/Showcase/Showcase/Resources/Assets.xcassets/AppIconQualif.appiconset/iPhone-App-60@3x.png b/Showcase/Showcase/Resources/Assets.xcassets/AppIconQualif.appiconset/iPhone-App-60@3x.png deleted file mode 100644 index 7771240e740435d124641cf17d7ca7a138f75f5e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11894 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 D{Rvu_ diff --git a/Showcase/Showcase/Resources/Assets.xcassets/AppIconQualif.appiconset/iPhone-Notification-20@3x.png b/Showcase/Showcase/Resources/Assets.xcassets/AppIconQualif.appiconset/iPhone-Notification-20@3x.png deleted file mode 100644 index f907bc46324edd6829c676befe78b33269081d6a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4471 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 diff --git a/Showcase/Showcase/Resources/Assets.xcassets/AppIconQualif.appiconset/iPhone-Settings-29@2x.png b/Showcase/Showcase/Resources/Assets.xcassets/AppIconQualif.appiconset/iPhone-Settings-29@2x.png deleted file mode 100644 index bc6648adf92e70633c89516b4ecfd3942b69b702..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4221 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 diff --git a/Showcase/Showcase/Resources/Assets.xcassets/AppIconQualif.appiconset/iPhone-Spotlight-40@2x.png b/Showcase/Showcase/Resources/Assets.xcassets/AppIconQualif.appiconset/iPhone-Spotlight-40@2x.png deleted file mode 100644 index a37b12237439d58f5e7023f5f5a404e98239d2fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5890 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 diff --git a/Showcase/Showcase/Resources/Assets.xcassets/AppIconRelease.appiconset/App-Store-512@2x.png b/Showcase/Showcase/Resources/Assets.xcassets/AppIconRelease.appiconset/App-Store-512@2x.png deleted file mode 100644 index 008e9f60dc38a83ee2f604618af5b6b9eea9c403..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27679 zcmd43cT`i^_cwe)G&*Wf$ATs(sH3Pz)6iQS1yrQiX;MW(?@~2UM^TV6HY^Ac6;!%( zX>k+~8@)-DB0`kjA-V59LFe~<*6;T`>wW)t)_P|x*XX_Hp0m#`pIy#AxoW7dLtaE# zgkczY|GvG4F>D_Ebsn}*2>v(7%&&p}t@Y9}@;c&r+RMkv!xr0p%GKIde801mo$X;; zt5bgNWwvSdAX^`$oTm9Nc-%P zcJ;86kyBPymXX~lvva2ujF9s5bMdnBm2&ai^lOH_ww^W~_HJJGt}fzeMk{MqZ!h(Y zKH^Bi;XQ>6n$$C-)hV4l-JhUyJwfIlKlVnTa`T?wpL!Q9!FhWoqnm4A;ZtJ9~IZEQ|${Q3Q<|6tvm%EJ@biQ6xNRBRL!XiBoX z#q-<=J<>XJDKD~3-sa+dofJ7Ojg#V$GzaD|6qrd)ZWAKlE zt<=^9Waq|KC3Te>v^HAOE)n|9$g6ul(N@{9ma3pFjTp8BHt<{`>zx6CI8Jzsx5V zTI2sBP2y<&|0cVqVo9Kr;y=O|B2?jPWYU}I``SINX)g7QHhGiG(D9QSkH7gRH?6D1 z=%x7Tq7?(5uKJainwFPD*~|H4ZCU_4d3)7`7dudx*4Urc>ryuA+Bhqf#xTzxb^A~# zahkU|xCny-|WUP4ZW0;HZz?z39n;yV-6HHb?e%Uw+uDZ4mHS^J(|Y? z8XfE(?M~x~z@S*}>RKLM?|nzFY3JXP9ap(G;+GK6l5XM|SEPbUqV4v!@vbw=t2(kf z&yRHU@46wf1c~YCFpaUcNp#f=f5%H#)At6C?2TuCytp$wFjTUHxkVhzukTx)!4kfn z(+it|K#eC$Cb==4b@+;b!v3WTKm>-$5By6i+O{w!EP_^l3^hHsdV(i+oHlh)2>5q1 zcfQG+WQ)*?%(XvM>c)DeX3x5}M0RFA2G_- z6R9fHjq=xZQg0U91_o?N{+vj)pqNHg=5IfJMy*V22Tj*82*W6+dEr;33JssiJhx3y z8otogU%d2Wm%*C4@tKkh7{=9XBfGuvORFy9M}X8YEeo82w6ns9Ye7U(qB!y#5l+!< zl9*(~^hCVGWNwTRPR@0qAw)~%%VWT9&U8Ii!D#+%4GelwFlP2)TKB`<)vh0|%y)hB zPxf^@?N}b8UhbvS`j%;}@EajokW@WomZ-$Q=C=0x3r&vIXo#2j!{~8)032Wtu^3}B3J((zf+f72~&@C4l>G8T3xu- z)2{e^cu8WO_18DPJ*$Eiv6Z;YsVd*m;GE7ALw%jkwEegZ{W%RY3o6g%UDNmy*X_<* z2-{)}do?JX!H)-it@)Nw7C##)dHl_LW=OnC@LI*<#JorLcP}o8=p55@HoJzq^gDpT(_q3@^pdes`^Q#}pbfU+W5eXO5c=j}Th8?F+TF2=eXc||k+*C=ZZ zS`Eu48ngCPVR`3{0e9KvW1r>2^3-0s9O|DLO2z1fb$GhZn`07hnq-c5KX4835_NaU z;65hMF+;mEDw~DzBN;9yzWC%Z%s)ikREzs=MPN;v;o;`1>I1jkmU-3@^et^ql!wh~ z8R0q*3xV?)>Di=W*%5_=($_+mcMg9*UA5$#>T%jJ9?|;;b<-BDNDU-!Z_6N=lFG=V zK0M}|=Rx!146ej)@ioHOr@44^x^;7JnMK8^N1g*p&cP&%Ku-d)3;pdf98B+r_X7XI#r6w|D?Lq8XYRT@p4{I0m}vb@PlaeLMuq>^G)8P)YH zV2`+niORghN>3kUQq1t;fQpB5v*kmbBAxdqBqsElPQ^1S|2a?S^WjCF!FL^5G^SRP zo8A$1wlm2tq3DiD@$#NxeF;^oZCE&#dU~Bga7?~+r9yeWi1qYjSFKR_!LTQb*DYm- z)#2OUN4~jLTD;=XBJVZo!m#JysZT4?Dvt~Aq3DXdsm@N$ZycQLvL#|;04yxf0ZzQq z_wNlqxWapkk0oFH}_D zxDm7v)aEjcMWSPz(!rgq?Z#vC9v(ZfYRjSDB#&TrsQzjo^3|>s)`rKoYd9K12%p=DETSopIE=4u5S%}sf@NK zFU6i}yRBjsvB91|ngi<7;M^O;k@bXapC7Z34kzAx-3dEh)N!rUy3?7$01(l>X#M`y=8AxFQMKLQ?v|D5 z&W{TZ_mffbeD#xg&z4N-4gYl`HW_!fd!ufbT+3`ObX=mOL|R873I}_u)X&t94YwU{ zv;JPZ!0aa*=vam5*@@7 z$0dyLn8z#k@sP0iE_IK__l=j0~1tFiXY*J_XNw3R|A7UAi9Z9TY?* zOI0B(uWH&tQp!|opx}DxJd$t-c|qMwrEkxz$MfRCL)NZP-@VWyonQJOdUmTM@2|DW z#&au{s&Gp+%lAhwKKj=f(|?$|i`p`slz;nMYS(XndY>D;Efs7R_oha!Y%%Gp`oPT~ z2sIKI7{ZC|6uE5^GLG+kdCbS`X|bDcIJYm_w786&W1IUcB--(6u-mRI;2yT7go zMgwNYRxK?RQ?ucnI9y+t;HuEvGg4L%#BGGZN%?6kiG{mQLR`Q`9!e`-lhTr%$(Kwy zSvnCTp3!=F?3~&S(`%u+*5bJrA|w`C@#=p`zt*F@s8mBUlb1&lxu`c>95-QSQW7Ctf)3O!G{T+4>*S_e*c@xlUa?+9+X? zoxnAa_q$NxTo!U!S5DR^%XMWU{#jr-K-Z-sakjIQ#oroQrpu2u30LBrt`eaq>%XPC z7cjHRR{VARBvOP_{w@f81kxP79J37wPnE>2w~B=dO!sHJnaz>>L|7k}FN z_G!t~v$NkryJG5?yldC_3la;{=sZnTZnw_$C0mO*izfmuEURO#0(T>j!Q(2|SLa{% zfutq-)$=wKJv7~0{@_HL5xX?33{Q{#$drl;*EN@lFq_**!Y^Pe{=Rdk-)7dBMS0!8 zt$gd8qe7fYWhUWpETT?{^D5{{wG8S z3XO7pErV>UvL}D_{g}U=f?Os8dm3?E6OXz`H+dq)%sjgm_+dPd|9g4M@`)HKlh<}< zm()~CwO=)(Hp^V2Ae2;G()8xWBkN)h=5Zt3)_Bl=m~!7a?An=i2{Y$SvVxO>N*xVK zqMj8i?^*pZL_$Ym;*HZ!9PRqjn45k*VH4ffKsp?YFvp3V?-fmPtvde)-$tg^crk|O zJ-ny+IX$?Pkjj@V?!>wWmB5lowa@itN1}}E&T@-3c(qBFu?{a8{hV21u*@IQ2KPkL zzYfQ3wibL&rV-wDWrp81SYP5#O)e}p!ifp|Spr$$d61(sw8+xj5LWPE+SM@Wvv%9r zjOs+p$UYSW8wWx4s$y?-Lh`PBAsvlNr+12ji<~8)L};Wlmkm@fyl_gYJlKi zSFIyz-j9GZ>C_vgrK@L-ae0xH_P-oKKuiq^duIHSdK(QiqvO6wZY1FkF78;zl*>FR zqn|66%XB+NRym4ReMH#l`^=pv&)HU3xg0y?Sn|dwE60P2mxnQy*E54o@g^EoL&BdB zp4LvgnyjxbS#^qMSAj{Hip(~@&merN1xj9Io;s&?HesxslF40ZQMfHv-sm(9YfQn9 zseXTRsB(by=epN@@|+8b!Az0^NLWiDDc_M`jL*;dG(FT!y^+VVJxGignr04MjHa0o z6K^TnDZKG}3PJA5x*EA&v9T=v;zGV_@W=6|A9ZBpIU*^wutl;)2FZw;&ac{P_Xw%$ zLD!-+GMZ5yym0>WF^h&VW}j4AubtzR@)FTF6f_%#lT*7|?zrm`AKXC7EB7RC^B}RO znAfA^t7V2iuzB%B;^Fu!uenI!-3YaS@L4=%E8aVcx#xgNH&j~7s( zNp|a8dR-z+VGAfO+Ylnr5pjCR>PrRGKpPX+i?_JUQvcaz8ZyJahlKtao92o5%Ni%- zL6Cp$pV-OT9i-x+WsFlxp52Ho6&{;eyM^rbfCSb?x23d~2bA77Q0&x$6u61G+@`Sm zFC?EuU5!oG?anCFub$DlKQ3(E@7=IfyP2Y%l`>K8*={J<$2(t}(@~k8pyEcAqrLc0 zo@dAN&d#r5DYeW*h(v{0&5#;Lzs#K~5^2(D%`eBcxoyJXDCQ5U@P=(FS zy}z&Dw53%0qQ|(s0aYY&-P-q&lf(@Eu1v4pW*)vDqKr72VPgvW_zLl*MJb7*2npd5NpDMZ{7Iqd#F1oYrXiDNnt>eA;j3 z$)r}w=)~`Fx4A_+*P=wJ!XLUNQjkNk3LuBo<#MZr=* z4CFIVmSz}jZ*ycmM^;DL0K9skM}U(od!a=Lk{3k(1kCpCE~(Z#mEW`ba??$PddezA zbn2yoN4jAGT+DW`V;PVJx-GgbdVbe!&Xh;XGdZ6#4+}Q}!{hNnvS1$`7J7&)R29JEPH@xgeRmNn627FVO>z9_m;K{ozPA>xy}PdV9H~HLenPUsVALM7+dX0+s*QpM&L^RU04ev z)6YVDNWVzq^v9R7F0OMWVBJGI*q0qyXBRbKPqqo{o4$z#cI4hQRauyTCRtK_WIik8 z{MQ^pw4^0*iPB!!nY<%Q%1q?E6P0Zft~4nkoQ1J=qT-T93#^r?J4{>%QD`FWZ;Cf6 za;`qIzVRSx<*Cn@YWS6p6CSDav72AYDnFjPv06%f@jjrOTLijMLas z!o3Um=}xTkdmd~%)q(}!6_SK`*kk##f6}B}$4&j#vOs1KPp04>DC{1)s2wnf>b#04 z>~(EE_W1Dh6Q!Bx(?!QTblZQdQ=8+J1>Q)b$D2n-=#eSy>1}Q-7<@g z4V9>}q5-c1+T@5?`C~(rcBG>x3J9&|5GZe_-MTH${lviY${v{Meb< z>!76GMf~!_iLs)0sxqZ9nqn&o#Rl?+_v4KnJ{{v0Zw9hMdIm;zT^l`4E54z4^m~D` zEN8jYwbhd6I>aM##XcQ~uB~p4vBn!W`H_~dO~EJB0^QAg9B5K0(>-P?imiE??p9E@ z%T@1rp;gDMt;5$U8{uL#FHa8l#qE9_+aq0>>6&35lW(40!;#Ur86{<4CKmE_il9B; z$@6HGo1Sg!vEHaz=7V*I2$=o4GiSb!kDV^6&5VDuM?~58qbdGmb4#vIaqB~5ZJJ&E zBCnQipGfU1I+HNSOM154fDpU7N_}ImH9PYp{&%h$RVh{otMVVuGTK?x=-Pdo10M`1a^?$6Jz}Zky^heks{&kqCRs|S^&Q4d zb2qzvtjGIEO8XIriFw%U?vBo=E-BEPhuz%Noyoea;sHssygf@XW}783!`_u=ibq`9 zJaDwXDNsG=2u5EU7pm*2+rB$U*&`F|Uy+kLvpSWaFM8}L>8%G(#)1-VX3u+V!hFBO zbICHSCdkL!UAO%}3a-&8&?<*azOG5;)gxQpoX(qx3(Bm@@?bi*Wz>9G2@cb%TaqF8+MQv#G@xJGF{nO^5#Zv#J3eRw|Sc=Y_Eid?*aq}2B( zxq?kLya6Avja9}H8}dv>vjpR0G(}yD8W6@idNsU#l@JMfBP`*-(sp7|Q2p5P*~!ua zB+i9;B(HAcw2g6L2xA#*iNfxKeGG^P-_hu;$%~JUz}%M3qq7Gy7>Dlq)Mo5xeb5OS zy|sxZL)`jiy1bCE$k(}oI8uXozW^5>`26EUazma!H@Ayowh-G|zw3rg?>}D`a5lL7 zW_Hn$UvrH3A;26^nSyDYEaFLyCz~_hAujy(WDFlo5+H|p0benpv|P%b6+)w1QQ5+f z(6i)?nbqG4?222P?i;9rXt$s0Bipw=|2t;>(Q+=+n;3YAxH6s4cLqG`q*2ql$b7ft z!)ij}7~49|V4tT>`R><=_{%uL_6m%P&SBo&@lCRsa6LA>u5k9s#qAjT&(?F>a@RA0 z*EO>MyWUTy=n+?P(|R8hv}+F$yR6Z)>>ptXT>~L;wnH5kg`Z=rckWW`OfZXR2+b*$ z7GTkim{HQ0iaQ5S=u!>*axR;&8Z$fu^+^RTv+HIQXoBH2(%Tk@4-8*SEWN%URFd)a z4}?Wp1*3+;d)Z(63UnSd|E^Rd5bm@!IpRI(Z7&KZazeAi&Ym;*GNC-Ox)gnoWb}9b z%A8zE*KLj;)V7?M7f5d{h+Y0DusGhUI+2rbJsvw&F?+(Mt_9)#f%_297oWr_?2Tl% z!&&w7x1;Qs){*GAs`TXFYC?v_2G@dD>4hbup~`X}rOxXnJUwO#;1*~`T-pDU&J%u{ zOfboQ@4{1*s>Tf0g4efVUfUgXoUg9waTgpDd(rKDYWYF^k${2$jY}u-+`O*_XXQDI zDdGjTA)VbtwnM90Jda0BTr%2eL8Q;G!zQp z@4Rj%&%izh%!`sl(C`DnJxv%ZntYHmhO1P;V3h3E&YB8EW_5BN)-emI?RRwL>944k z&QOhDsTkv%v+)xiM9X>DsV`;Js{CW;V&i`w2tcy9MWZb$(~kD%L^fgKPpSrH>|6~- zBm+kZKyfRgNDV0ra%!r#sDY-PTaau&Z#? z0paxB`>K-Wemg!sZ*^mjS==Nk9Vd3>5w>RnKTl=xb+sR?PSN;+V*kGpboQasEe5Md zk<)MwazX$L&UE={UK`(H=+e@==pLU<0RBSB^uUGHO|M7PxWCZDA0l&7YeaB@X${~;nzpHE@?!y4eR%SVUYTb>=8{iKC) zOzcs1&@fw_d(6pi--B~nP-E9u=e=@ZZB*nud7Y34!ZI5 zIbX+pkM(Oxlsxz{aH2|)lNRa7@^@uP=-7E(M#Y!|e*PY29(UgJ7h+GTyIihz>)z)b z9}CoN5BOAr^*RRtg6t-q(ni#r;#sKexGn8gGasu7)f(x@Rjr!M>MuCKJ9mg8u0tN2 zKBDEwx>1TMMq{qLP1sXcfkLYkZB8Y<)g?ydSyWQk1BKu^Ey3R{#QK^tykv-Ljt^Kw zf}2KF-LY_t6+ZN}TF%ZSy=}Wl_B=34FS4OF(d;1sLP5@SHXkCm$_#h=R)_Z+lqaj6 zpDiA}pvb9&kD+eGI2d^C0T_SGmO5m5E?0)U*NJf82eiYWZ)WBpUYa3v-Kn;LvbnyhLt zDvEU7oyeSr9o>B>W&UHr_GT;z=7)Tsu1PlRWyOS8ohF!*<@6*id)|7teZ1D+ef7w) z<4qLyHByclXig&4GDN29>na^1TpW9QLujck_*qnP1lkfF+gfCfOWoQhPbNE?S==IdaNmt(r!u- zKT8z#xdbwSB%ySDVNWV>-7pl}2i1{>tN1j?v0-8_NV9s?z zv=1Gvs?B#IS-F2u>D66YY=IiP>N;J4&T>4)HzN~RZ-f0&v9&9 zqij1CstJCe2IGyx*&VxroSIECl62MRG$n&%v06FrgZHwZzb&Tcjru_fb=X8pqJ>SM zae^rAQD^1pn-n%e>b)L zVMx_%@w~bsB%DlnXQzAF2Y5T!pYCsFPPEyM7)-mqaAM8CQ8Z}m(?=vDnqvQK=75xd z%ST>D5+3JKInxE#9r<3pBfa<&U~_0S=3HNm4N!639sIfL4#CjsD0{F3Pz>?{g_+x& zvgw%LPi7l6;pe=GqH~*OdzGwCBR zy#i4MWB{PQNIj8oO9aZJzl6;+~7KM`X9uvEphQstut9bkJmfi_CxYgBDI|= z(AYmgOKMNIt+4yCvizWN0`B|8RIV>0=L^?-CIm4c@#eYx@j08_1`4bne2U@6cz^#p z5hs%#v}-bFK#wq_PJ{_Guc%k@K`(tz(m&QvA?P zqUf)EUxv6)NV_p}@I=$|ET?|QLw(KAoS}6Q4#>1rB^B00RuEV+6&ZrvFZa+os$r{ZcoAw6BFHet{EOY*JEi0FGg*qtG>u}t_JFZo3XMG z#!`sYSz`td{T3}#9<2#Yi+$GUD&OADXzc66i@^G|4<>g_huh}Y`(aFgezLOyyW?@E*Lzi-%dCQ0IcVBCY1BwsC90)eOa zE&I-@{94XKv2?!9!QjyBXLUVy-HFYE-ef~_Vn!`gw~(6DJn6laL*=||>8LS{ojFs> zI|{{zB7O>KYYIUc9e~dbIpYBsK{A8%lM&1Y?Fn%d3 zt*-WHhWLH@meO~F{-qIzJ(#Q&)>GG?GudG+C(JLMF$64wXRp#u6^<OD#MWvG5BB7Iaa_M(pZ)z!ojHf)NT+}R9yy1CQY zzrfy%aAfa&Wuxx)kS6Gm-6G(jmMd02{~v*eG29K+Pm%s|u0#xtvlZm8QG?CTm##1e z2i}GxsP!ao(;X69gKEi7KrCK{4PK24EuZL#0kq&hCvAO1NUj0q&y7xkaQmLAkfIZ@ znHh%Of#dz@BH6+R#bRb;c7u_X*t5>8djL)W(e`eabKvsA;KRfysMj-COa@CLqz;oX z_(l7>kq=#6<1gn|_^$)<_zwx=)tDvkBF0)OnS`%Z6zOs-dr2saMG!RSG$Zy@mx}Z_ zmI+Q2Y~?vaC;oNQ>@5V@hlY|6^b{Wt`Y*~>Lx$qFnf`a81B>ES3~X|4iwNS7{V8dJm-4=Y@-63a$@O!+Jp$G zm?h;5M%+1@4NocJL31hzoA)Bi=0J%RaV%VclVHGrmbcv)=XsCNssVS_nY#*{u}$)H zVM=>Gj|NI0j#)k_c9kH@a%CvuPZpHdW5Af->fzvCu#cUtti^(jQ!ff5bK{DExjiPR z2?P4lHK^_HlNbMm_FF~csO~4K`J7lzZC^GA7WaQV1l8M((La-N7;ej{mPfP5621BnAnD z1#3A}VHbgC6)1M`uJZx2g>A1Sx4UDo@Ngp*e-LSiI3^Br-KTNVeO4wB^daD_LJYuvgGlc*%5Sb*KwR*b~jzgm;cCu0Vz0dE<5- z-GI`51{QLt#P$dz2alnM@oMOUvmj~_RbZiVqF{IRmX`+*|5z-KOj%4_%1j3nm zBvshQJA2kPAYg@#?PpBy{euHztys_5U%=8{Kw3jFFsQ?Nsg^bNC>n|KMO_hsjg63U zeDA1}ztiY^O8a|7`=1->rL;f{>B*-^n_mGFkoiIkxu57ODv0A0I3J-jn2mHHm}Hdmg5V+zwQ|wtb5TpTPH-)j z_lsbAYWww#3UK;X4OHzRyYUHgN|##oLJJhk`v$@eZ3b(U>{i8q{i1jm(y>-7QW#X1 z#?gY@mjFj2P#G`<9bj+y54~uO6$~d}j~T3Dkbem*BnxwZXDc{^*zzb0!wxHQ2H|-o z>?1IT05KTiILdT3BU~_iPhzwrPm>2<0;YiEXIq9h?eV5tQhaiPL&5<-tWk`e?J7&)Sxbmu8hwG5fb9ff2TS@xSDe6G=qF#(OfBZ>v@ za=yR4qmacQyZs|SN15=PE`YS!w<2#CXiU6WDR5GAOBjZb&|&vuXO=FFzLxBk3L>2o zJZLUtM+U8+ED*C>5U<^NJh#eoQclMmYX#16WNL<8q;I+DK<{o0>!xwO#Ui`}4$P?= z=IFq(>AZ@9-kM}WU0E#QQxnS8E@BwJ6+5v$p773r2%a7#yVd?S-BLg_kA2e7{zG|d6wee%?G6hcdcy^AHRE_?<&N2)vcilnq*eZc`> z%G++l&KHEwK4}6ip^s48`(yz9*aQ!NHGL=coH%Z|up~noFdfjJUy3%EMs~AS^U(T2 zX{tVzu zkIGJfU=S4RFpcwUs6q>P#9)akaNeNvYk<+GDWsfpd%^FZjiW~}`wB|?KadAf;fY2Z z!936qq{qUr}9L^1GyBe%V3~>?G1=K$jFNoH+gN_stY4l3KE!cP0 zqn{qnoXU<)UVI8s<6)y!{f?wmbcO786J&qMg|&{0=m+izQ`<8DLXb33<$DY25v@^ z8qj;}f=5Te1iG!^ia@x9h@LL=5#5$L;E;4v z^nt>*PnD8qo5oee*B2?=mQL(naL-*ggS+Pb59EKb;2J0~(EZ4=#}HpXYTQq3*gfb}Umv4p8QGDvXrRtg(G56L$4z2$lQ{Al3WZ^ce5 zQDDeQdGnq&g_xPA(| zeQvfsa6C0ww>*bNj>sZRpK8EPI6@&pAmJJxqSG?u1Ssqra;gy#&SQ}e6JJ11b;)ix z3UVYzye9c}ynJr(<1`YF5cW1`ts=P3uzk^SaDD(tnm8wY*oULj%lja1AnP&sH6RL# z%8WKG#2LsxXcDNV7kk8jY*;qOhFoXXeT0Vq;kUbO>KUwAdCrIZ?qya28tTav$_l(h zn9!ITOYmqAP{tM~r+%6)`(Xk`SKW~*F~=d%l?G<_PtNhD$8N_M!2$_lLhl z`|CdJzjR`Fc#}JyKh)3tw8`?vl%%BPlcBcIqFIBqbNQJEw5PI4PYtDkUR(|B)_tI3 zKiZ};)rUZ&fmS}UVr8JH+ju1_XV(I#8IVsK1CjOqE>Xma0O|Y*X z!x6^vePPg|77Ti|V0++4Z!%?I$7in!b__6+eDipv^rl_YMk|=BkMIQnv?P@B@=1(5 zb8WKh%z84m@?b&?^V4otY$7fbdR6_?zRQ&#t{Mlvv5VXLzOIZSd2O{6Tzl#aT?-dZ zj^Re0aV5|&SoiwIAUpTvXjp4NacBKe9%(VO_jlHBiQHhqtnLsk5T-(V#ElfkUZMEk zK}0=VW{AumcxyoUK`L7-;naFy6xcHcyraND>UGk$2rFWSz+HBw5VF+vqRTpq($Jy7 z`n3uiXYlWLAr}UwugoSWRH5&H+

7#+AYu1}lR+_!sHze&Y8efq=SEwLiK*YAT+z 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 Q6&`1N^z@OO!?w5o54E)*v;Y7A diff --git a/Showcase/Showcase/Resources/Assets.xcassets/AppIconRelease.appiconset/Contents.json b/Showcase/Showcase/Resources/Assets.xcassets/AppIconRelease.appiconset/Contents.json index 723d49077..564da1831 100644 --- a/Showcase/Showcase/Resources/Assets.xcassets/AppIconRelease.appiconset/Contents.json +++ b/Showcase/Showcase/Resources/Assets.xcassets/AppIconRelease.appiconset/Contents.json @@ -1,111 +1,9 @@ { "images" : [ { - "filename" : "iPhone-Notification-20@2x.png", - "idiom" : "iphone", - "scale" : "2x", - "size" : "20x20" - }, - { - "filename" : "iPhone-Notification-20@3x.png", - "idiom" : "iphone", - "scale" : "3x", - "size" : "20x20" - }, - { - "filename" : "iPhone-Settings-29@2x.png", - "idiom" : "iphone", - "scale" : "2x", - "size" : "29x29" - }, - { - "filename" : "iPhone-Settings-29@3x.png", - "idiom" : "iphone", - "scale" : "3x", - "size" : "29x29" - }, - { - "filename" : "iPhone-Spotlight-40@2x.png", - "idiom" : "iphone", - "scale" : "2x", - "size" : "40x40" - }, - { - "filename" : "iPhone-Spotlight-40@3x.png", - "idiom" : "iphone", - "scale" : "3x", - "size" : "40x40" - }, - { - "filename" : "iPhone-App-60@2x.png", - "idiom" : "iphone", - "scale" : "2x", - "size" : "60x60" - }, - { - "filename" : "iPhone-App-60@3x.png", - "idiom" : "iphone", - "scale" : "3x", - "size" : "60x60" - }, - { - "filename" : "iPad-Notification-20@1x.png", - "idiom" : "ipad", - "scale" : "1x", - "size" : "20x20" - }, - { - "filename" : "iPad-Notification-20@2x.png", - "idiom" : "ipad", - "scale" : "2x", - "size" : "20x20" - }, - { - "filename" : "iPad-Settings-29@1x.png", - "idiom" : "ipad", - "scale" : "1x", - "size" : "29x29" - }, - { - "filename" : "iPad-Settings-29@2x.png", - "idiom" : "ipad", - "scale" : "2x", - "size" : "29x29" - }, - { - "filename" : "iPad-Spotlight-40@1x.png", - "idiom" : "ipad", - "scale" : "1x", - "size" : "40x40" - }, - { - "filename" : "iPad-Spotlight-40@2x.png", - "idiom" : "ipad", - "scale" : "2x", - "size" : "40x40" - }, - { - "filename" : "iPad-App-76@1x.png", - "idiom" : "ipad", - "scale" : "1x", - "size" : "76x76" - }, - { - "filename" : "iPad-App-76@2x.png", - "idiom" : "ipad", - "scale" : "2x", - "size" : "76x76" - }, - { - "filename" : "iPad-Pro-App-83.5@2x.png", - "idiom" : "ipad", - "scale" : "2x", - "size" : "83.5x83.5" - }, - { - "filename" : "App-Store-512@2x.png", - "idiom" : "ios-marketing", - "scale" : "1x", + "filename" : "Unified_App_IOS_SQR.png", + "idiom" : "universal", + "platform" : "ios", "size" : "1024x1024" } ], diff --git a/Showcase/Showcase/Resources/Assets.xcassets/AppIconRelease.appiconset/Unified_App_IOS_SQR.png b/Showcase/Showcase/Resources/Assets.xcassets/AppIconRelease.appiconset/Unified_App_IOS_SQR.png new file mode 100644 index 0000000000000000000000000000000000000000..f5bff468d839c48adc57f22e1a94801e3cb6c610 GIT binary patch literal 35285 zcmeFZcUV-}(l^>fO2y~Naau$`GMZu~X5D<`{A_5{3 z9HJsQX9blEk~7@3+b}cdJ>UDC_qq3e_x>?Hk7Mt>*RHBntLj%_tv%s-I+}De>@+YK zj85yEngI+(4t|ous7b*;-vi%v!C>MFXq1W>^sfWK*&5tF2L81{i@Kp;jIcvNFjy{3 zI?0`kcms@L`#DPU$0+B&k0N-uAPEGl4N_WER0<_3Z6jn2mq7@LqoieoP$-O)kd(Ek zB*GSD14qk9170LWKgpf`K@NrcFHD6|I2^_Uk9Bpyffr!CKVRS{zF_U@@o!#0{~rAm z4Mse+L;biDoMHRpmm@SAVT=tHkFjyax!U5rP#zd%JB$n7S=q+b8pET3^}yIV`MBF) z?XY;1lc6iY1C25Aal?2U+T-zVND&dVr!dwHj}~_IuoH2?c;V2lHW-}9&+$0ocsv*{ zf_8OwbHxEhrdYhakp~Lvg0WF{vUBwSm(EzUHV^^@rj_?|S_1#;Y1yN2_QEzOJTx43 z4Vu^!2aGq`iGYK26P%90;ZYuVw&S)=7#BOd{ZaArHZCYE5{o)dNd)GHd;?w%e*Sjc6mpk)%l5>nS;3w+6`rM4&wRa z4=LqOQBM#>6-7J!*A+lJp|H+iILQDcW{$lL8i~i^oiMJN7#EBO3TT}N>x{C)V8H`h zR}W_t9!tCyadWYAz`B5mxS%mwYTg3g&Thh3U`|qMl5jOqNhwJUxCR2Dt|22TqpS{B zQ<2mVSCx=agS!$rT7eaW$h&%YOB2`8O3&UE?~1c`brTVl5Jrd!!+B89`dUHjF9L_| zi1I+cg*0{<_RtgtS&uEAAARl5E#j^9M>JTV@S^6h>S-^b#xb}lG9!2{!c z6o+xL`t)f`^m$sec{&=LiwvyFcys=YpNbzN^^J8BvCNSDu*r zxPd^vYqyCPH*rs+bEGVi>U#cz=;{9*(ckv;ldNy*Y{Ti568lR1=yhQ#Pn$UH*SFZk zaDolY1eqcl-?qP44h#lA^wSD{7_2Dz-#G5?83RiY`2<-)#|?AZKhjC0Pp};iF{eBP z522)mhmftLk&%*+k{$|N!gIIRkEj;M`Nm+}Qc~b_ln2g)o(o;4BOy6R0fQ3|2jK@O z$&AS_3*p&Zgo>(*nhv0?tK#$3e9R0bp9ON~Zhh1>uQ#1S|nQ8-$fAB2HW!oS8*(NY_tTzJmA;xNC)QPa|> zqMWe67hJHYzfY3~e(bjz4v?@gLM&X}a7rl1kc9!fz(YuQ|Eeky3K&@k2?Gq=ry&g? zA%QJ)!m|BCWo`Cv9}(^%~T3MSb1F@{FG> z$_ZI>dm=g8hfq5+m%@%N~H-?+3rbT9k{hWoay%@l7ygH^#* zmrjaf21fN7Bpw|Cq@#x9Bo?i`KD>1IIW%Uu11)CunY4Twd37kLvYjcIR_i{)&&j&U z44YBL_lh63RY&!T-#1@Q-m&%p<1su= zKZm32JTMpl?Ra7M6-XX#auc`_+#pRaO(*o?&j97-h!sM6I0@r?oKXb4J!B~&Xq1%{ zN&+p0f}^Fx5C|!8xFpKP1|cJc5Vb}ltkI%kwjvjS3^=^1!9`*4HeBl0j7Uhx1>vXR zr+!_-NkTdP!pRklbNeeRI5#90A2}PGC5XxNw6Cc4$GtBSI@R1Ka4k5)yite0S}bsG zvJg@d*l~3C&Y<-|21CFZqvYG9itF+D7dBVXNyom1*m$o}iEyyH7$u5-lBYarbz*$c zT`@emJc~{67~SbxvMda;WkuD#7oW0=Vnjmv6$}n$zAqW|Y*U%cn`5Va-CpyWUYRNF z``9Zv!yW++mF)BBFae|7>x`GOSwG!Wrk!)LJ9@)F{&ME*0b1@gPFdl@Dj7M|;)h}6 zL${01vhdy;Ij4e>H)9duP01ohocItq-NX_ z2?^U5*SC`Q-aQ?TgulSfOJ%@st-oSmykM{;iYt}3akw)?`A2ow%f&~!lF!U@dtyZV z+ntmzZgZa3xxHx9n0vf&WunXA%$WIs)BfY+^wEyni1!-yYcsQ-cof>GqTMCFdI_ef zD+eTgxZ?E3*zv*i;I^jnvG>E8h{~nTBmUdtl-DbiR;!S`Chx=Z&)Te;a zHfT_vibg)L)$(dw!n>)q4ZAB@*>>c&zRchi1ieW;FBujs6rA9{Mi=Oj+@J7(+xr;B zQKoge2*>OxbIKbx?*Anj@3K$Nt4?;7)(X%Ks-q!cjOY zFkKK54*fuG16Sa^s>(c?qEIA2NForTGQT5%I0y@((!V0X|3?8Tg!I4SKPiO&qyYbc zTa|JPS5zD*x_r)QkM{aACz5G>?~|E93gOv>FK^iltc809Z*Foe$M1M2L?^_wewpVq zR-nUO@@gqOoWtymxp;qx>gYl(*B`<4i)2^&4KE)9A(s1rZU=k7`{|Y5?=>FIE9vVG zZqungT;2G?;dv~%S;yB0Ba%*I`zHcKtHq_>@U7jsO653=A zCdVE@PdUD_QX%OLyv2RR#4VeJ5%Y0OfiEoQLX)eCm%D(G^JHC}<)e3jhZ@NSy2l%? z8##+9_io5<)cQ)%UkpvL*`phH)s7%zbAAJ>)Wu&v&vfJDwq)*Py1Me56&@w?M{$v1 zc(8)gK&v~4a9}wz){T^1&^nzqzGswEdx_ARsI9GKQI*7D<&e0cvl8yY-ZiHrmCMAo z7C@is$iZ#As>@I=B$fF+E$Hj*Pd7d@D)64(N%C9w&8ae}{r1wvfr|OMdTtE2yyT%o zat7x29A4?08jZZk5?A6xJSV=bs~5`1=01J8W}De+)lp{LR~xn^^8BqjF0q)9sG#-C zW30AYti^k;qiaMBO+8RQmWUVZAh8Z-gj3okv;-N9l>)j5=`n>-CEJMtxc=MlU|6?fAE( zG=GNT9|?$m;voLP;fEn$CdNN%I3);tz(C*6AcmK zFAv}kcA~`K@VDSeLJ4Pr$ebjngCG1I7D=e!rqEp;ay_^X{NnHXAY3ZK<$nbeQW6#f z#1RJyD=#mvzp!-1;?N=>l!-uDl@-nt4RUukoUlFK*$I9EBFsn*QoKyyv+?!ins$UOD_#|UlQk?Tj9sq|Y1TXMZB$}-#P3X! z&(4kaf5a!G3-YU6c)4*zD09n7#N`_QKRb?VQ_j>u*|)+V7V7 z@yWxtPszS#w;iE;GM#Cqqj9=U%)K`M`ROwD6G(*S;M}DbrMCv!yt-X$g*q(1%;_cIA@m41sAmBD(hK}FcRCU((zFoz zqu>@ZDG3>Z0Wzwqq31|2WaOkEU55t;Qy%$d+>#FX5fD`N9ff+*96LF&qB4BFhUkC^TRPke?8zKmSG?l))eP4 zFjR(ImB;X$GU!S07-5|;hIo{-8`i}Rgk56wB?gy)OaG3!V&Vu6m1#$1 z;#c}c&o@&xbZ$8TERFyltN>5}=E12cDeZ!3 zNkAzBAQ!TzAGY#WPd?Ar*Qgi%iWJ~Akw~;I- zO_LYIKf^CUoVm#j;rejhH0`ttp;~{&12JJ6u)Junyu^~?mo|T{sHXVO_587%e_c&g zWn$0>zWr+|prjzyPyon(7FeLDVEf65SWx_x6Wr|gDAM0W4jKgsg8RQE68>N8nh5dU zf>A0BHxAt}iwk+rynX+Vm4hAcgNs+6pEP^Vr(f$st7$!bu&51l_$qBz!0p7--}hYm zIH&f+1Y7Bu#_l5vBG>ueO|ckU8vEp?FUk}|cp6!^=w+bB80alGem$~qNo$IAMoE0) zw*5zwZ8prMx{8AZUyi8ze0iS3BiGGf)&6+f=8^1CLjw81;QL<)k&78_r>8zvJma^H z=G3vxiFt2Rh&XpukTs%}rq1HY;5CgGl1JjMJZh|K;jO=0WX>y;x#ZQJ5Udg)Z|Fvb zl9|0(4DZ`b_x{Oh+Y z%By*cjlpxrqpO4H6KX;Viav229OqCXGn5l8Ms(V{yH?=G+|TDUJ)aOYRJk&Ho#ufd z-`+Z+O>wBo?vDEoIZOW6KP*y`O^Y_%^t2v)Y{)(RHB|L(akA~8YsIlkmEJ**fe|GMVkj^1{SGh+nP5$I|@sHG~5F=(6LTJA>LCOby<#Uev=a=3gvb zJjy{G@(k1=_kThmm84YZ2_wHg&HP;f+cTCH|6($5>%XJW&s2ow2<z@8JssEEQ!b`Er@i=iee=>9<6|{u6|2l!%l2FT%a6hj z1}1Z-Fo<#M9XZI4yYIYVnnUWptNQB30OKOAuxMT|=tcxD+vv=Id@XBW-cdmXl_9&B zX?^+cJtkcf0zxyLg~fykZc0pa-09B#S?p;4?Jy14wLvxI@F713Q{V4WKB-sonwp*Zof_D0nRmasVNq4#X8%NGN z8@y6>wMX3>9qz(nGi{%}-dNnd{IfD+PtNsxe}Opi)b#ZIQ^KoZS+P2v%*Om~3H*U+ z?3z5P6L7TFeHI@G|v>oN2gQl{PZ2kdE7$;J)M(w`35{ zC}@UP63D};wv3*C%;_jycY66l?tPq!eQJqDQ8F^4o9t87_jI`rDno4N0-3~HJ1*ue zB+2j5zqUEEMG!clJf~7c@yJ%oKyO8VSyD?olBeUWsf3SU&a(Q|w|voN>qDrKdwVj~ zn=j!{F7{3(oHtYGB)hd&6x(Te!Sk^Gz4uYHvKA4%Iq&$XH<=C{CiA!AE4LX(f6Dr- zu=WT3rQ)#zp0jyZGzeo?Gt3T<2*BuX7|pj#U1_w0AFj|yDem+v>!5dhNZTRys=4r2 zt#Jj!H}ij6Yy6py|J%s)*U&ZFJ08;Ee#PeEsIZ;l#G8a?oD8~ukC`N)#H1e-9e)pz zUcX`mh%t_E?0*VO74iOq2m^VjrZ|Xhc)041$SDU$!llzB)5JqXf6?)9 z`tKv>Zz4|rL4f~zXPg+Z{LN#k@0GYFJXPZ*39#+yJFfEi1)K08?IW#l!^u1NvPG|R*wzi6li~=w=90trU2F9&T657-hvcwS zJT+-$#zm9xo@|N7Dr$Odd*GRR_w#fk&idxvY*w|JyIPW~d&f5AY|5vI{I9!FZ*BO) zobFa6`?a~z_$}nTCFs7nwEpza%PUj+0!HEAyCd8^F#{jJdt~r!Ri6q`d-m`YN8X8J z{O?Lf&djW(6#6_2&M*nhqfvi9S{t1^Pti)u(l)ZhWryhMC z=G)~G=xo@WTuiXq7VHaH(nuzpJ$C9W|DY@LwPQykC12m``nJUS(ENkjcd4ob*eDN+ z?y2pob}Wx=-wYd9BTt9ENJtZ$i&rj1b~7g+URfVtps5J%KeAVq*}iPr|CW3!WJGk7 zJp4PX`N|)gZG3^SgI_#J`TM_PJXNwzhaJ!q{1(Wbd6Qu$;r^Pjksx=_R`n9S;Mbn* zry^?1=O>QPa}7#Kvp*JGo9pr0L4=UJ22S@1lnrpN|0B6M>7jpDA^fGTNega=v;VGv z4v-<}{#NF|Isbe{fnXqRv;0|_zy<#@n3NX531^3cZZbJjKYN+j9&5o=$g!*=tC>i5 z9fbgYxX7QR$Pv8cJZ~D9XBciS#-t=3HJ59s{HAjI!|l=JfT&%)pkd5lfFtdb}SG6?*OZFshjE5|k~Bp)FSPBgH>9SpWI&KN|Q)1OI5?9}WDYfqyjcj|TqH zz&{%JM+5(8;2#bAqk(@k@Q()m(ZD|%_(uc(ztO;&ISH)hc-ZohtnUGb%>+_KO6xu` zPiDC@q>Ifw-EF1X%j?oIxpVTMOXht?>TzS?-MXg5S+%YQ$peRjkI8dQJ)hL=a1T!s zBP-2pHo;`;U4A|9%@MvuB@tL<=xN#Rfv7FlT2~aJ2u9)WE>nHLF)m+T8NB%_xQJi# z)TdLtQ@qhOQ@2-?UVILI>V<3#7B@BvJc3%Y7Qm+mlxS4+dvps3Vge@Wsb$8ta+iFgP8rHA9dR^F6!}79n>B@^hnv4|Yi>k`NiXz` zAolvLEb0&Lxf-M|JnUhBC+lMcbMkMxFlnS0THuVDwauly_hBy5AISuT` z@d_>II}Za4%Erh2Jw^@&BWuSRnc>Z}FCxK#_41INs(7ujn85>?j1s*wXBp~37!J~M*ot<28 zNN;&w;z>0m_zm3_;pHI?!8^+H{t(JcTaQQ86`ahL5k?51;c!tNDH&muBuY|DMp7De zmIpc|BLWu_flCS@5J(A8BwT{$=O13c(8IcfL`8+b2qB!03m)Yy0%YZ#X;u9*x5rVEz>T-_pk!L0>U}Q!&I( zn!s?rzp(o689@Vo&H<^7@^Hj}h15Vf;V{Gp+S*86AUxIu<)r3{CP1gzwbbN!iC>Q? zOK6CxXh@2xtEow=fe(IU)HL8~aCJ3xgsO&^y0q9Y0)KrG@B&-vzdsd{{$G76^y^)% z-=7)D^Fr_bC!ZM+-$kl=V4!b|j9guvei_v7Pl9+Y^3RW*{*(eG21iNSNTP*oWYD(Y+c~(5kc_yLgped0V+}r> zvq4Bo01f`(gCp4$y+zuMeM)GEz3u)+n@?kf^P#q>wa1Tv7;yMxlgktkEch zsFCn&LUIs3H`zgi+tf>d^Lh1oeP8dvIPfJbN$a`RR z*y~YzcbViTyP%^=N=k?7LPA!~gtMz-c?G&hw5_%8JhQF|31`2ij@F3?KV2`*CvYY` zy^kX#qA!}xQ7!lu^~VO4<>V8mcxh^8E7l0RpJT@nAADJ^wO(6TADI!#lRFKA1s&F} zp@zYfAmo5PYW$CXkbuF5z+c#Z`s05@9UA;Uq7DsK0)PK!llVWx=08=@?-~EUuB#0x zy2OUPsz|;S=Fg9vy*?xf&2ON(fqK7q+j*bx-f)4=g=#->-e`uX1*; z`Z5WSg+_N~4>7xBKj7lLC(HUV(n9A}Ltq9YIS&k`2WKz7rOc{6QIR)2y1x{aAkI7T z$hiZOq&wGEeML@kD=Id^*La)zQlHKrLH7Z=z~%Nq#CS%_nw{3b;kk8IvMj-{=d;sY`FVHwVoC#U1w{ z&qNLAb6}--tSmg#l12Lx>xTuq&lc`Y;fQ5Zc4bHuN8@oJ^!K`U_gIykiV6=aB;RE8 zL(ckXNof4q>F{nlj#sod~k*NB7gYCypmy4A1 zID1}B4hKqx+#fW9CKTA4NtoVw#eH}1jio=23)?YQIomKunfP%s^**`(2kzyhZ&93dxjI)CUXXt1HLYKZ)87ZT!~%ZF^6EmqZixSwTbOY@0z&H zu6(M2PqCM{7NXsm+O!pC2j*=L@6Qy68S>fJS&@M8OZt_TD_q?2v5|?)p^K>oe3N$W zgBy5V2)xoJ2_v$US2CBEDNHW!j(VQoatR`?kY0Xb30ONxvWwP)ioJ8b4tJPAV4?OMN%bT%5dgY^n@Y00fAI>GzarsnSQ;h7R>_*b`?LYNC;qeu{~`3 zHDkT=s4|1)6CxXQER682qbyg~hko{8h zSUJ)~2EkH+W&?Ir{ib8CnhlQE$9 zhPJ)P&iH)D?lAO(IcJz>OZ(QbjC2j58Ud#GcwngRO$Q3UJJ&#q(bKbyF~`daP^LUz zHcVq_jUCj9qzdG0dcaNzl=Z?^a+qbSgp&1?ck=*>N{rErozoNpJy&WXir}`w;bBK%M=es#5A8L8bVm4u7 znx!JCl4*Ogdy2j~H-NwE)^o1J%C*~$e3Q+mte0+iPq_q+fGmy)R}IpDA@;USwAWYSasH4aQ87EnI00-)dgE{3%yfF|R~xy>It}6NfT) zAX_JY?d}8MykNQBo4E(e&PLc5s;1;wG`F;}Qf1b7xR6(@+5rEmo3ezE{C4q2L1C-P zO{Yow)Il$$k z@3#}0iaRzpLsHo=`%$_a-(+e^Cu$*Bfdt)|c6sr#c8M!FwU|dDq$O&u@_`+n{Y`T~ z94!G6PdhjI#i3SGvo@%R5YY4TEr;?2mVh4WOKai1hrlv1#cG#oC8su*G!a)70`F%! zR_KBhZk{sk^h9=LzOg#lin|b@Pu-5}yR8wT;#PSYU-M3u|h#H_NdVV1~ zjlpU?mlT-VAAY8JjDyFRcUwQcS;pbtB8pxFm_B6`M_gKI#C-$6ay>pe?W83NlK-6K zpfDjoa+trh+xXhV#KC}+IQ4bcY_X7+&gAmRDeP;1%vst&17Xt=(Ikoy&h)*TPi_09 zLQ*zV9mxH^C-!oJSs3*WnnkbN9w4#HDpDviN&t#iV@r-<(>qMB zx~R95{l>TZB|}nn3?0au1M37219Q#27@a66t7!Kmvgs@{dcv-I$(1~rdHpg#C_uqD zt&V<*rz6Vvz4Moif?L>(mB*eAh$>jook*Gd8~)0LJFEv+JAvpat87*dBg zlo#Y#?`hQIN_{EF0B$*0xMN?Bk-FDm(pz+&y>um)C-@JE|KM8L7|{gq;ijN49UAhg+RG>i&6PEfk88AFO9oO(a7SC(5eV zQ)1s|jP)luOMvy*iDYICBx{Xyp_jq^Y2^WN?8+Bd2OX4Pu=B=EBU2%+87)4~bS5V9cI?kwkP4wp zd4S`atZ!fZ$V4O)Ztm_QH5oGLo7Tdxubv#*?y52i=N;8(qjT@<^WHy69CX0UU8@(3 zpWf+mxec-ExgTAgnH^d@8$U4(BFUo!_kb;mAQ;Rh&p4IMQ(b%p0-nlbq@q~hljWkd z0E2iXzR9dY#JUENoM+GI2};XD!}I_)n;z6(H?4Edp58GE@1jP^`^d&MS!n^ zSxa;pM<*-U$h8p@u;O|r9879s(AE=%gn%3s;9ItjQezHuPy=61Ybzc(3H;M3bz&MH zKr=I8X6_qTn|2U*XT`q38)onmL^j%7ejEOt^} z&WtE6sX-C1Cz5|Frg!u4fK%6Ld5L`ER5{a9y!*%3JXxs)kjp5M*o*NH0uoD_AwqR4 zXrXnDwwH1WcyWsNK$&uaKdh6yyT6U#0*=_v&Is}S58_({s9*iFA&8eq|doLUGB_; zJY=H>c!&g2QD)Nf>Xx-HAZt37g;?xbT{{ZYex}ntGCny~o~Y9MAU(+r#SBsV&i5pU zi;i4tfy8`a(w)mC-=Lm)FXOFC%E7M9_ZGlnbz7+~y=){tmwd&+q$=FK`FN5b50D#J zNo#j=;K?k`Bf5M23J?WK_R@>VsWIgfWys{z!$$i1MPeZi_ksURWYvGUvp8Q=!VY8+ zdHU96dS^vJe_F-BPXHLKcVDFEe?iFkfI9fV{&*cl$Wv%iX@Kd2*)N%Qe{m zq_{YA_udovoEH?{3cJiX7xoP>;@+#Vi%!#@YG*O`4FKgsg;*~n?)SjB-e}8HYR|_B z0Rl43$Sh3@r(#@69zgxb@fI;+q}gEQ3I&!nejj8G?~`4utJ}iSgMn#`?%Ovuyn~4fkW60Jil#{B&Y`)ocBP+sK(4d5 z_icj5<&Tv;GY0{YbD6pVB9T47%Yjo|X6)pj+|g@3|CmwS$L8&7CPczb-N4^6<&KV! zAFiYz>-Lgo573;5uFv*3gR=w>^|MxX+~wQ2Q^yGb0U7s{j(>RTE+yikpkTY(lg9u! zTm?vnR4hv|e73Bre{OxWzCowK=Gy+;lk!fl`BA?=Os<1Cye9l-&WWEhzS+Xif3Ed&rQ85*qg38CdMO|_bEQpF`b_ZDqg2Y~ z<;!W7BxTcYy=dPEOk^(&`&xf|TQA5;4!c?~kYfnqV!_rIXvtri>WgeewU#lilwRws zC19tYR4FyB%b8>RRB0lX}}Cp`+lv& z+bu*tEMW&yNpxZ3kcv>eTORjG|NfNU8D!-Hvx(RiD;9<;%!az{)Zm*;v%1KaXG`{M zXFX$D7~*aN3yT~Hx6p}dc(#^HMFQJUOmt1IuCXb2CEXN^;-clNJd!=y* z$fiilc@K?lR00~W_zOC-Va{G4=ZkMLO<}~J_gkriY~=i=u^G#76$oalQXg=^NX73M z!hjekCSCa^hrtvypX>O5A|&mLQ-^%0b`*>J5@gnXn6HFR!x~Xna=KWlV@2IOAYkWo z3Q#^eI_NLr(De}_^x_+oNUSI#2!4JmUXXiz*?lP(`JC%M;3fHEh$mr)FZA-^=n~*d zzbcG2NCTq9#N4~jZyT~7GUF2xAv!TBth#IS zC~HvwU^1fukY%tQ4DN(Pi0H|(iba{$ej5eCJzd86fIbcAs^p=DH}e_sKVj*bG(Vkg zAV}r}_-77~{Ipk`@)6e{=VL(X`VMH9oYSQx>W*eS-iWVcTW3X4Y;~_FbD69zz2*g8Ll1)K z`HXc#zRAa__T<5!Bjd2_n%UBtWd(9oq@o@k;>t@AEiX<0}fpgu6~MJ`%2(pPXr8fNG!gV zy#eW+(6Jp*asUC?ONLH|>O_4TCVI>FeGncNpEAWc^4X7!BLF`8#X^cz(7gT))Ksg- zk%~$O`qR2Wh-s5EH8npPyN{Fz0kt|LV4!}62}oJDlAkS;#pM8y0+lG4DRKP-L57M{ zV-NB zg6L~NMuowA+;SfB^LrygLkf$#&t9C~kkhsKv?3toAV@~g=$_&d_Kh6(^S$usN`1<*$7nX&eI3kn?9>6kvJ_gC1dkF5>tDTTlRP)V$t} z!dn761LHD`N7*D1i3E^aBNeNWdU-l4?5q{KA4(WkdJLzuPK)T2b_2n_^o)vAUbzjT z7x2fPC-oNfpDutJy?M|7O;Rr74H!)QDdU3EStkh~T#$y4b(?y-&w>-{##k}} zdjn{T*0s?Blq>+c2Ps-Ag@?m;KS@CRyEFf6y7~xzuaPoX$FD6oOXyu3n7i{9D5JS{Daa#a~0(4ts8zE%DNz-8+OTK1Y_*Gc;!R+$1Of0 z6@yA=(!bYoclr-7SQbNC$GqG>2QaHq7kG?pYt%L29%>bk3T!amT}9x4k=J*amc&F> zj%N_F^La4@)*#+bEK&|hHoNe_nD!&IHtXI z*=oyK*Fq}79yV@MhnmV!#2(X3)M~N-6UzexCcrC^iq!Zyb1JLp7V8+ zDM|M*RKM`|o3b67?m&>!O_hu*T~=dRg^(G4SBHRSJfru(re}bqRsUugNa#;EQ)Y^V z5UY~Z9lm)vLEFn|km00e?6!fNAdui2H(K z2_O)c3q^-oDJVJs*!81;I`U}HC1PG(zI@ezJUYV8l{hW|M0T|QApJ)oBS&5U&rvPg zHs#eaQUJ2HMFxQfo>u}v1m^*As@!C#z=ieP@7V?Mn`mvReoS7wpu|+XFANd~&lzi-k)G-@i4OfTlD=r}U>}x=OasFQH*gS50ez`+L36^#XG=`IB9=T6U zj9eIt;RYo0`9RZ%=q-Gc3nG~oBskYsKqjWgS#zMKYYqa8{+I)5(;ajOA{2c72FmCt z4rM{o>Ik+MytF|uCHI^huq3iv_naptuJ;;DOoS`;IRs6|0YG|dMAHGxF|CczFXgWb zfIWzi2Aorx-%~*XBx8OAh)4TpE%-KS9MKIOCeAQ2L>a5r5%Kz61Gj5I?(J z4(;-*#p;9DlX7t9Q#UAm6$c!GVI&mLy8uW4Ms+V!|J3~14 zA)l-k2BmKf_W@ocr+^eP9>nCTK45}9)f&m@zFPZ!S)fQopvvb7`uga|3qka!_~k9)G?UF)ta$BJM{Kv{cj%BAV*evuxma0 zXwqNB_aZIq3CLU)hp(X*tkf##=)nK8=sc+L`c@yYNeEtAux5j8=5-4AFRo99Wz^A! zf_&$sQ_Y(DhO_%8ZUfW9L1*LR>w4*<(J27p*(I96>$fIfx<>h&@rBykx065^J+)Sb zoR$)!Jp}t?1zb4RdS%vrcoYuv(971Rt&oce5V*7gho0iZoms~sok2+y_3((l4(RC!C^VPGEPTA>AMkV;6!v~cnOCi=`w?5=_C!59!;b9drH1GVlRPpu5t8ZDo^{0&OB{(wt))USJ>4KaiPDQWDJaYO=s{j@{Oa z3=A%^ZE#pmG7$HKhFmT*6{9fzg7LP~?v1PM_6KWVIhQ~SqM1$hly6keCTOkY8aK!r z94KBmt)CZzf`JCyW|`nx1wXsE6rh_11G;4ZAUHrLN*h%CRHuf`Z}CHmu5JzJeA8UK z*Rwd6GJM*$L08u>;A zh~6X#I&4&~O#23|p>V8Viw#;QQAzvwX{FJ`NAw3t1sE}y_PI3aZx8#X*pj({&Q26_ z-#y0qq6u_Dl=cz{AV1s+!nJTM+ zVrBoa#vwgU5C&qTKMjBbXJBoE(qGOV5ffl4cF-I(w4Uv3$AT57F`eFdRQhtcvlozn z^_XP{jeV-BeJllf+c$G&_S`=XP0D~u8)_>!lw0^-R@w&*uppH?DRYEtoZq+20u3Rn z$sv^xOkdalmW-UkuqhF?@|VTLN(TBNnz?2fEbiY^$6r{aYjM=Ta+M$Kc6i+bLG2GB z$9T!|`h-*HYIA-4R(KF0(>zSt`Vy!274e~u#OGy+%pm;)#aYWW4obb^Gt&(&6Ir-` zl4(2OvtVmoKT>*9*S)Wx{Z#=9W<1u}q6_uy0ACu7Bog52Y;K-gar9T6L9>Z7AgP4` zv{97LN2lHE(0`n~j-b7&4HgV+ed!mauL?tUs#gt)!C3c=F8hHNc+m5lrb>jT&WeIE zq=U3`ujaWk?6P$i#6yBao?y$N=%7~93|V7ZPFMc9)RE}qdkXK#HdKH=W~}rF6ZtVZ zzV_KVvG9GcV`>5RtVZ4u zLx1vNSJsP2EYWVISDe%(S|d1up}xY&+VC;@*)|7dT*T64KLcwmC_=EjnvesVe5IG6#k+9*zRQu)=P@^j_*ZdgR_eQ6H0L)JL zg^v(GM8TvhbYzfyqj$Bf_ebmQcsYa?padctXJ8iCWI%I> ziNMZIX_T}-x8sCj3j$5R)g;Y=K6j_BA@>z9T@H83;EZ1n| zY5Gk^@sSRAL~9;Hef(e@-Dqs=h!ib3jOY6L-AkZ}3jqI3pdlZ1Pi5Dp4A4IS^r*3- z$>G;~Ij?gy-|pq0^r#(N^j`yuYJEJ}}AFmC` zT_qHACn{`=ro{sZKma!%l2pKec3aTl;;%Z0ozLFi8{7x6?8@IMB>T=>*(&9>KCC{q zsyP;#F!>5-JRTF%7`7&P2Eyl zQA8>Nc6kK>MST;~ee<$Y%VNkK6Ri)x8hVH1ju!h3c`d)_hF1Uw@rIe?F zP`%vO=_&!ClvEc}%ff=ZK+#Y1Fg>S9P# zSp_{)$xHUd=!FJEYki5P1G)aBL-$_(^7wQWn@|e(Jx$;eWm~8A*U#|5B9tn!3MX{Y zNqn89iO!i-zj(g9LR89yj(7dg&}JWWBlxqxPWmK@?O|VTY6}CH(u?yT z{nVYs5xQJ$+0^qt+k(o=y;dBQawM=%k#RrEqi`+_2Xf|AkoL@MKnB;}3If30n}~g8 zG-P;4sJ;-1{LIk6BFnDP-j{0?jC%`$4+ZQ^Qub+y&^}v{krrt!h0csm+-V->lyL-}w zJ#U2p7zc^th)~QM*<<^lTW)R`8fx?;k*qY-qf?m@Hq6dw-`rl^OZ z5Y8%cZZ|dbBy!9vLB{Z=MOT08OUCQvj|uL?WD2H!5^BRc)5mJ@jeR}(t#JO;bW%!h z*0Nz{3bDNerTLdy{3CFXcjG_r>vpeI!(OGQjyXsu7x^LPSo;| z%P}jRJOu>a+NtaPiHMFz933)>3sp`K(YO>)J~4XL&N`w$xU(zgffPsh)-$Rsj?+w_ zc078db;yP|>;*IH%VGMh*(k7^+)2H483b)`2ycLnHe&;9ipYTNMdm8ty08xQxwL}- zQ>{DPqSN-%F$?&X*cRP8iLx^Mu`%mbq6dIhHoTgV^`KD00}%bn^!3u{G&W>xFw+<^_3B=Gg20 z1#h~qK3j0=@-Eo9QR<$26A0>2UoLJ5!HE5^iv^&ORo@a`z|g({!T1IzIGkCELw^}B zG_K;cth+CduFU|a7C`oQpA`6`-yK`7U#*!U-tA;5Vgjc*%*^3c91UO$W~BjjW;)xq zZ;aWKL&np!Ikl%vgc5N4F+E_`R|n+S1zx8oM{m78* z3W+}HwOwOQf|vM$Z3eXLJt^R*X+n1Tdic!_YEa27Gp*-Y>zNict=v%BfM@`C^J!e}P_|vn2uvF;#nea?P-{}*iSoMZKom|j%n%|uSW*c~LrZWYAmB)AdR|IG(`oU9CBsLAs|`r8a5b zP+HacQyGw{w(EFtnc&{^5rg4MgES~}b{&Jah+2?$;29wiFUs8xR_1w#u|*r|hwVFN z&ujxKG49~7TJ&ih(6YIN9>R!4(8Nm!cBYQRqH<~I2@UY36+;y)OA&Pp2*KZ~`*1AO ziwdEkkamYnsRooGRZ?ZqwsArh2!38}>NWGwMl7tD&FxPO@6^)JxC-#eQ0~B1-Q0Z` zb#7t`w|mt|iPsEQLGlO1X9@1vqZT^kd(hwd2ET%R21JwCn3(t~A%s)N`THPrITu9|j2!%cx4|T+T19JLJMM6!SLnMntuu=rrMW~ZO z6WW&iKVD1$RuFCUyYGGYSD@idLv&{Z1FF64=rM;;C2w!`SY$N^VmO5U5N$cWlQ1i{ z6AlGJ7P!F7dT7l;dKe4Lh{1EOz|b)}GzwKARDdNxQ}5xVv_^%IN@^4=+7s`#Oe$(c@isRyN zjt=?6q5^5?xqoY-+XmWrnRXdd)?F1%Li2^_81(2w+~J>9{5#ne0>dLf~_lDol4Rgb7WT8*8+mMcXkE*UOp;-t7MTd&| zKRtk?5CZ!4dmk|9$NwA_1~Jio5aO`|9X~W2TkHJK5dJswzn268N&@;Z27UOiX!&PD z1a!h*Li1Ok|AUnOH5wC!mWAUtIXcjPRrrfHxW3m6wNYuHAOEX8e)q#aW`6er%l{3U z>h%U(J}-X)nES0?N<7^!@->b$kSzccZIn0qH1aXGA+x9l;hYpfz%J=yF@nL6pP1 zBAra=;lfhC{RRmIa91jfKB9>bu-o+m6F0VY70K@exP+_;1_s{7u_cS5zyA6M4ZIx0 zWVa8F2We;=;%{zG2RK89D|;=G4SCf2 z>})VCOf#WqF1vVyO`{3_3@wLwVfSNu)o}Pr!K-0*NKAg7u*~fTGLh@jL}E|9LscGJ zR16l($BXh85(W8d@(zWuAhn-I1ifpOy@$syXb#HqAgc=xBqQJw*+@UMBXF@IoN!dm z*L&3(2i2EbK;rC8VnC1)quiFUNm!lptwso;`EbcCNdID=ob#so(PL2YA{06<`#v{R z9S)AfAQBjv{vY>L@u@_90)dk`A)x>lG7u9UxT}U0-i@8w=cQ#Q0F}%1twD~pKa~KY zTP{GnW~!b!JU=)I>yi7isZv_{E014l1}_^jMJ2Wm=XuJFbU`Df9gKQHXGelGlS4Pj7i7yxcxd-1MHo&A-irQQOwM zLlc#2wfozi?}KS0t+}K#&BrG!ud|D_{;^V-A$vLxf7ieA#+=3Db;gjN4 zybu2d|Hg1~35ZnN+j4#rE+!$im%Hy5PbEQgTT1-fHbi$e|KvwC5Z0WnrizmE%Qy1gswyhpZzPV`04(DqR~@Y?S|?MhU3eS`ZBh(87*3(LM*a&}!6@?N@Rf7tPy#m|sX2agN@G6y}sG zuGyB+pWCsg9^ocjjH5RjQ#vM&xseg={#nYf5-Zq-C<|_55j}e!xPfG1n?_vNxqr?UKrr<*#de0Ir#?H*z8wM%|zP=kz zOIF}SzT_5gluFlWC5{+BX1S`$esOBu2bV?Aa|KB)hAC{(iEb zzp>$|q!nU^g$epyRWn)IN%nQ~JcP%Md!o%vm2H_P^na>X4NMU%OS6BV~ua?dZT zNs`RBh=UQgjqYaPhbBe0L-O;fu1WN4O?b&WL_&4SJiTgZHt?4wK{2kqkdiuU6K)jg z@G)}20m{@mPEHYcO?BbKl<6|>8=58vdG3ks$6c-Iu4nKT0*K(s*C+ntU;Ia1m`gF& zCN`clj!OaAC}$tLYm-pduUFgm$2)BnWRpU*Ct?U$&$A-D`_mlK1O~cC+4mx=F)RE! z?SVU4F|$&MJlr^il#P;RZV6=W-h<}w`j*Ig%en=%cSwW5)al1#hgxSI`cEm@5w;;# zE|!$>zJoi8@;SCOh{J`)<$FGkCxqz?39yV-+g)kr$A3u-fuD52dZ}5Ee>SqzqmS%k- z`TFx6=i*tAt8d?Vdk=OF({1Z|R&KIzBGjmnYi+{gudcN#auC*jEfup_vo57j828>G z+Yz_H0-K2sZ~1f(-<+!s5djkF!oq1^4Y#;JZ}mWLCkHgVo-|W_s0uGMxP=0{ZAc{R zQS_s^S;@9%vJ_l+@>*p8&8W|OTjJUE)s8DTO!cCUkU8B(vp7nJGRgrBYC{GK`;jbUp`wg|` zON9~=Tgi5cRfj75FDu*j_oPoes$2>Ai7(2RY65?8pM`pBqQYUBygK^he0JvW*|G-K zE+a$fJAC`?S7cn~(y#O|7RwHI#H+fPAecSMSwtO`+TyR?*E25rq-YYZhDp@JTHTl%IiAh;{YPF1 zte-k(rtSuC%i6>)UrO@PO=5@>F@L5x`qT2gPXOYo7F28!T>Coe|0K18-Ws)zYb+p} z7O<0eRf&LMw)&58aUy#k-hZ7|Pxqd)@b=^d_J!m`%=a_3ZJTnMv5%)c zFWbTH0Y*f*`0)d+DC9qH=zi?ppEgflApBe~c3`6VO_nEaK%y`zoxzpXbL@5<*0&FZ1WT<%t?3=9OxB^_wZ_mxbU z2FW2smhUx*n1-iKUbsM8kv*vebe8Q%mo%SFj2zI;HJhZ2oif*e)gbJjdn@+LL2>h? zCdSqYM>`9`e>8-Ga64tmX3fK%d`}v)ta?f$#yGEnZc!);o9A6)HFTz>EG>SVdeEp; z)A~&Cq{0G0Gv;%%v986^=vbYE)i4tVP33Ehm3=Tb(Bcb-n?wYT%e+Eqd3FqF`Or2x z)}uO~=i!MnlRiaC)u*5eLQsDlz)L;c|I;&_69L*rs?+PPG+GI({A%0L#-YL}xm9P9 zD0~&T5u*8}Ltx9lV4TNLI)A19PJ)`*xpDvQX`pv0E(DF@}TklPlupTd=}vUZ7W>M_>7r$`WP*xC0oW zt5c6&c|4Vc{cxc^YqPb)wft(~x-Vjt`B-wt>*%Q4btL>A*rT*@o6`8DqH${1>lH$@ zN}6$C**N}6TmmO65R{s(`*8(KPs(!MY*7^};>!EMc_%t>OfrIHdSftdCO z%@I{8g3)-D)1y0C0pNaxAQKF0WU3{P8+$X6N;p0{r(XFtc7+VWA(;JDKvLRWE z-5X%#9oZ4E+x=qB6xG5YJ1WeH=;1x7JUe?ma!!6CrFy}Ua^9@&W_=n(^a>76s)h#z z9BZx-0kSO>8q1!N+(l+U@~qJrQfkSGWCgGeK_!<{OJ}R4@1E_g%kYb37yao2DfK=$ z68HK&m;g!(I3{`aq!e%rr8x%C6e@!jE9A|prjlT*k`Un2@z4i=#5z6iO#gM?F*ww< zb$Z}z`op(W?_&n`7&o|h6L{;0QpzYh2R4Atbpx$_S zw{@kyj*~gp>Jslc)x2_gw}68vIJ$)fOcp(EH519~ZO22G)y{}m#LhQUy8I`G9%9?j z1$m>KsG;~(>!{J?_!OZc+Sr$Syn+LaIO&`LhGvWw3u1yGMS7NOzTtO`>n-q6)p$4F zxIx(P1BO43`xQ2G#|&$k1{CrT81r6(1sshIw6JB!B_nuoWU@+B+JET^l|mQ{ybKe4biq+?CO9u2ojAK``#$Rs2DdibymXn#J(W6vz>#L9{Fx@u)CI)s-Dea3p;oRKzb z>_?ZhK7d+q0}FdfoTnT;z50+&GYKo-Kj!lJf6pkL<<=_4{jOvk_&0_sH;)yT@~5x1!^anWfP~29WLu-pcM1Xl=_wG#pv>wR?r2z zrFIk)qT3}Q3uyWJalHHJK=Q$zz_J7v*r;g|E>_p%twn{z+C|{F?^^AeT`7cUFslL;a8DOcWt*?adJ^3+bWjk?T}?t>j7l5nwh>G62~;lo-^ zG*+OT@e`38@mwOB*BT-#k4Rbgh#+oB$jl_iK`DdTt^7LYoMvY>Pil%*i#nHG^VO%ZP_9&MW~~^Lf53?$RqxWEuPra1U6J<%q2r7bo;$RdM=#K+xU;7TS?en=~dYa%AdM5@@vpde!Q34IlG>EqM0eYl1w zU9MgexUSd3Ko4tF`{dyKm0CW2dbg58;OzL)`UPc!-RM%bRF+t>eY*LhS9&ugF5w`G z_6sYKJY!~)sEo}SaAxxJg~S>~e9&)Sm3HV=;nSt?1ets~3&?e0rJ_h8aibJ8bh}+} z+(>>}r;}WE#zAx`7@faSF5}#VX+IFj_&>@O!v;i7Y_3y4{+6CZbt=j zX?jo+{`69n1LxFv;{drUxYGmIH&MP=D);c$zN$LC!g2Jb?#Da}SjVREsV-Da-#wt~ zn$QOw8l+rlXH7>7;2rW}W>C^{VE?)(sjzctbg(VI;`FGR9bh2f10AHp9kw)#yi&FH zG!W7iKqZ~A>^}fyxlZTJx6bb;zu5U@R_vLFVGo0=?87KKi2KsiG~NTQJ84OW9>(%l z^mZ}O<@cCc_o9R)uV&j(qNvRk7IC+Od*-r7xC z{MBXOFjFhntl{jHzk)N9^7$M3rSGz|&E9&3SmK~%29bQ|?Bms;hYG)-){QLLCCEI{ zHOaT_Tob#zF)7fcd{-T>9z zg}1=}>fYDkB{`e|=(`o_pJJE$8w==y-mjU4rR~|f^2{fi%o;V=g0IMvuUolOY2L$> z&zBED!KT6?c1hm75ccsIo}w%Vx7ke1x8>KO*%<`PZ`oRk>CIaM+_+PfB?5QEj zSd`uF!r6Ne)XW+hz+pA}9<>%ocRxD?d2v`{s4c_K_dbA#pmGd9-~I4cpfgGNOVH7e wznAv^$mst+n(r3TKS=rim6b>L7N;yS!j=~n$bFIz1c&JB8vXL}=S!jg0`41@ZvX%Q literal 0 HcmV?d00001 diff --git a/Showcase/Showcase/Resources/Assets.xcassets/AppIconRelease.appiconset/iPad-App-76@1x.png b/Showcase/Showcase/Resources/Assets.xcassets/AppIconRelease.appiconset/iPad-App-76@1x.png deleted file mode 100644 index ba020590e1eebb2b8e7bbee28f9df95b661a6fd1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3886 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 diff --git a/Showcase/Showcase/Resources/Assets.xcassets/AppIconRelease.appiconset/iPad-App-76@2x.png b/Showcase/Showcase/Resources/Assets.xcassets/AppIconRelease.appiconset/iPad-App-76@2x.png deleted file mode 100644 index e927264a4d1fdb56923d52af68a6874e57abc0a6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6264 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

G!d52JQ(*_JjiA7Gj z^j`9ym3Z{pER?+_z_K`LJPeX4Mo1VW;+3NYbm5y`#KZ5)td6s zthkL4eBVrdY)z&PpyVZtc0FLJgaZoTrxc_C#J18Sv!*XnUuzCQ@oY?s&72rBfqLo> zza$-CC$pc;;m!}&Q|D+EiO?AX2Ga9*3}!=R+pZ0kGArERzE6j|bV~zet=`X1r`yjb z4QMgMc0l8easd@X;pJWqw_*^XQ&Zcvj?qUz9^D+yYC8UQ9jUdyxoCUU6-p^>7ZM8; zvX8*;)5-*^>uKw1=CyTCNs ztt>WnT`A66{(WaS|A?N}ZOqTf%dNP=E8VVNnS!4CQb^ydNGBu$Ctlv`f3a{w8MCS9 zjc~Pq6{i0HDvzy(SzWa#?GRRQl}%9oU{F$&5?lF;cE3Csx~N~rx119ZOEeCPk)3>) zu$b;|-1!CsZI$I*>XSb`y_jh#;N&P>sh32gqJZn-yWHcWgy@>U(MjXo`VJ73Dg1=_ zkXKrP0djIAwZ*Oc@BmNJbA4Ptez7fTVzPnsB)&gotuaacAjw&&8Hh?NFB_lYk{ARy z+bs$KMjmsn3JNt;f>Wj74mYh1F=#4}e2t1`RXCt;8+i_)oMu%Lh}C)w>GGFBwAh#JE?LGdE-PR>bhzo}ESAKri{%$qwXQk6ODFr{pO>v8q2ej^S zibm-UdObvxgM6MwTlo7%Ix%* z7RZk^+vRP~j@xlo3J|RKCS173FOdsdvJ_0{%ia-_&(43`EosJ!M0s~coYu!iBq(3$ zEl3k;_irsh-Fqq-2rSp79!J+SasbjcQvVBmD_}GGV^q$k=JJgi8mF6~(sq(5IS!(E9 zet^W?#h9XI*QlhBX78nl6B7lf)rw(vAwbomy0+x{>xs(5!wL}rwS#slH*(H#|Wd&e}jC-07H2F!O}6+m-mBu4c77WV)-%ONC- UhHt$8^Dn@{^c1Gf*dy-$0C|2i>i_@% diff --git a/Showcase/Showcase/Resources/Assets.xcassets/AppIconRelease.appiconset/iPad-Notification-20@1x.png b/Showcase/Showcase/Resources/Assets.xcassets/AppIconRelease.appiconset/iPad-Notification-20@1x.png deleted file mode 100644 index 48dd6ac58ba5bb78fdecaaa50480ac414599d81b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1705 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 diff --git a/Showcase/Showcase/Resources/Assets.xcassets/AppIconRelease.appiconset/iPad-Pro-App-83.5@2x.png b/Showcase/Showcase/Resources/Assets.xcassets/AppIconRelease.appiconset/iPad-Pro-App-83.5@2x.png deleted file mode 100644 index 337613440aad026c47bcd6998123c23d1b615d42..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6658 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%0AM|NJ#h|XmO3;j|wtL~es#gsfShxfA zKQMOOeE9frDPrFJIQH(Bb$8XYwmYYU4n%nepL#pZlhb+)>^6L#@@K3ba&cH4kIc8- zkuJvDHLsN`b843Uv9hg=aIHkQeSSKge-=8AkZ$cfh&64VepI)=mc3jw5cwpge)WnV z@Jk@PWMAMmO{gxl@;ZN_5;iXHRgl`C?=yp-ya{*}+G4?TDejUi5@2|)lEZ%-FRYyU zgC%r>JX>oOT5sq7zEas;*3FMBU|Nix3*lW+_NjQ9b9i&K%4tmcc3j)~IQPmnbY=U@ rU?q${^Ldq^JIf8tg1IB6QvlKKb0zOH!StWH0Dy^sIpX<6w`>0gs-*Zv diff --git a/Showcase/Showcase/Resources/Assets.xcassets/AppIconRelease.appiconset/iPad-Settings-29@1x.png b/Showcase/Showcase/Resources/Assets.xcassets/AppIconRelease.appiconset/iPad-Settings-29@1x.png deleted file mode 100644 index d6585bf00500d9a715b3f2505a0273f5d4ee9e54..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1979 zcmaJ?dsGxv7+*p`5irU}_?*UkA-g-XFLyVW*UoNY?xKi@2C}m=v&*oL*=7fJ0W*Zq zN_>E1#}FS`Ad;Adin1!2U}h*;oQxy3X2@erFw2ZWn?)f1=s4%h+^E_naV)!pGO8qI8D(G`C{1vpaY|1Bu@=-w#1kl< z_2xxl0f*yzg-l3dk~E9u7-iw1ULBs(Vq?)9&Vop%4aH0Z1Lz4OX;pwdb!R|;#1-HQ zu?EuEltdc2Fq?;fm6;Jun-IiI4x$YUG7wX19s)?-Ye#Vz<>&4 zQh-mKO42L=loU+>^La2AgCGc)FXQ2;9>w(fa6kYFU_K<`!y+yO$%QhxNCXT%AWKK% z26;T99wcK=3NVdfY;r!|;c)OALLNmM`LIkT<3j?zK)_`+xb`e7gF3lZ`-~wA2w}%) z(#DXK74TX_^;8C<09jX`#9*<-lg2d0K5X1-AIuh;H@*|K@nIgsrw4Sr0S=)wnr9;{ zmSJr>6Hol-{QugwCuG?Oemr5PGH8q~qhZEVRL>^zDh|dV*PyhCV9TgR&30nohejih zW1T0hs2QQK3=3gpVi5(HkwN0}Xt7!tqm~F%2qHz)Ff2pV5CW+X6|7VXRZ`)Qfv15i z7Y}E#LbX~DJwF-}Lb4bbRw-lVtCT90RH>Fp#9~AW4`E}ib_TU#gqPHdC5N#x^)s<@ zB~73VMJG^{d8nP1q)`lIPor#rQpt7?ECuFhP>i&Cg>$_HXBpUl5rQT&30zH67GNOv za`Jz?K=l$>Bqc;#nM5MyiULFapB_K>9Kn(^NhT-5K9)BuzPgN!qq0Mx$jL8-v`@D+y{Wqs=w5sJxeXd|9lbYdc9!P2*ym>Qp1pqWt_%u~ z3=D7cFWi|HTmzrI&;X~mMcqr(^=Aotkt$T?a*Y{xukp&39i87i2)MnYAmpp8&Qn`C zwfk$7Tlebryk1D#tB zDugL#e_0(8`qSl`r%vpu@*g9*)_m&akaQQ$-&*2tJ{eqMI9b2+elBnG?9X>!%S(nF z?^U!1wXFXU5C8RG{ec-_)lF1FOuvut$ElI)YU15wQ9yoD*Ib&4o490|JEi8c?^Y|* zI-Rrr^j#IQXM*;``G<(-)_AC-Iwg2bPP@;71G(+5X*`WdYuES$)as7=EyCL0V8?!5{JDKsYm@S| zU(%xjeNIQ%zqrORAN`x5HdxDxt2GfO^QXp}p5&DMTMjbe9%IE!U*QIZ2qogZ|-kU6SZlNM&FflsH>-^^TyOQeWtLYV(s&tP>)D|Z={t9 zIvRD$o*Gp&R^LSiXHI^^on1iqx2z5;&3gRRj*E#pQQ))eB8H=Wa zaXH27jzFoe-hBMlLEECd3w4Wge<@F$oc}1Q3G<)QTKCP2?&awR@8|vWTp(w;E;ZKu R2a@T%PGePCq&h~I_b-t$8`b~- diff --git a/Showcase/Showcase/Resources/Assets.xcassets/AppIconRelease.appiconset/iPad-Settings-29@2x.png b/Showcase/Showcase/Resources/Assets.xcassets/AppIconRelease.appiconset/iPad-Settings-29@2x.png deleted file mode 100644 index bcc1e3d1166de93d0f48c4e5c0a617b708594a5e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3106 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

G1U6C`fxY4-`xF#I+`* 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 diff --git a/Showcase/Showcase/Resources/Assets.xcassets/AppIconRelease.appiconset/iPhone-App-60@2x.png b/Showcase/Showcase/Resources/Assets.xcassets/AppIconRelease.appiconset/iPhone-App-60@2x.png deleted file mode 100644 index caba3d95b3c4eef88ddf9634eb1c5beda69e0495..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5262 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 diff --git a/Showcase/Showcase/Resources/Assets.xcassets/AppIconRelease.appiconset/iPhone-Notification-20@3x.png b/Showcase/Showcase/Resources/Assets.xcassets/AppIconRelease.appiconset/iPhone-Notification-20@3x.png deleted file mode 100644 index 28003fd1663da69171fa6f97c61b89dc1292379b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3313 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 diff --git a/Showcase/Showcase/Resources/Assets.xcassets/AppIconRelease.appiconset/iPhone-Settings-29@3x.png b/Showcase/Showcase/Resources/Assets.xcassets/AppIconRelease.appiconset/iPhone-Settings-29@3x.png deleted file mode 100644 index 7334e9ddacc1c09d3e4f6157b9814f75d259a7dc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3920 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 CWYT;9 diff --git a/Showcase/Showcase/Resources/Assets.xcassets/AppIconRelease.appiconset/iPhone-Spotlight-40@2x.png b/Showcase/Showcase/Resources/Assets.xcassets/AppIconRelease.appiconset/iPhone-Spotlight-40@2x.png deleted file mode 100644 index 11484402939a7ce1c56e87ab251982f9c957c9bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4001 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 diff --git a/Showcase/Showcase/Resources/Assets.xcassets/AppIconRelease.appiconset/iPhone-Spotlight-40@3x.png b/Showcase/Showcase/Resources/Assets.xcassets/AppIconRelease.appiconset/iPhone-Spotlight-40@3x.png deleted file mode 100644 index 3f9578c3c72412cff79bfdbe0370cdf500ae9d3d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5262 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 Date: Tue, 29 Oct 2024 16:11:07 +0100 Subject: [PATCH 27/30] ci: move to Ruby 3.3.5 Closes https://github.com/Orange-OpenSource/ouds-ios/security/dependabot/5 Signed-off-by: Pierre-Yves Lapersonne --- .github/DEVELOP.md | 14 ++++++++++---- .github/workflows/build-and-test.yml | 4 ++-- CHANGELOG.md | 4 ++++ 3 files changed, 16 insertions(+), 6 deletions(-) diff --git a/.github/DEVELOP.md b/.github/DEVELOP.md index 0783b0830..bfa023387 100644 --- a/.github/DEVELOP.md +++ b/.github/DEVELOP.md @@ -52,15 +52,21 @@ brew install swiftformat ``` Ensure you have the suitable _Ruby_ version. We recommend the use of [rbenv](https://github.com/rbenv/rbenv) to load the suitable version of ruby. -We use here _Ruby 3_ (3.1.x). +We use here _Ruby 3_ (>= 3.3). If you are not used to this tool: ```shell -# List available local version of Ruby +# List available local versions of Ruby rbenv install --list -# Apply the 3.1.2 version of Ruby (if listed previously) -rbenv global 3.1.2 +# Apply the expected x.y.z version of Ruby (if listed previously with the command above) +rbenv global 3.3.5 + +# If you don't have the expected x.y.z version of Ruby, run: +# > brew update && brew upgrade ruby-build +# > rbenv install x.y.z +# then +# > rbenv global x.y.z # Check Ruby version ruby --version diff --git a/.github/workflows/build-and-test.yml b/.github/workflows/build-and-test.yml index 8674651de..4d8ca5f8c 100644 --- a/.github/workflows/build-and-test.yml +++ b/.github/workflows/build-and-test.yml @@ -44,7 +44,7 @@ jobs: - name: Set up Ruby uses: ruby/setup-ruby@v1 with: - ruby-version: '3.1' + ruby-version: '3.3' - name: Install Fastlane run: | @@ -69,7 +69,7 @@ jobs: - name: Set up Ruby uses: ruby/setup-ruby@v1 with: - ruby-version: '3.1' + ruby-version: '3.3' - name: Install Fastlane run: | diff --git a/CHANGELOG.md b/CHANGELOG.md index e664fea49..cdbe28655 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -53,6 +53,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - [DemoApp] Remove duplicated section in color page for content on background values ([#236](https://github.com/Orange-OpenSource/ouds-ios/issues/236)) - [DemoApp] Hide from Voice Over decorative image in theme selector (a11y) +### Security + +- [Tool] Move to Ruby 3.3.5 to fix Dependabot alert about *REXML ReDoS vulnerability* (CVE-2024-49761) ([#5](https://github.com/Orange-OpenSource/ouds-ios/security/dependabot/5)) + ## [0.4.1](https://github.com/Orange-OpenSource/ouds-ios/compare/0.4.0...0.4.1) - 2024-10-21 ### Fixed From 7d38bd78835061b246640e9cc619ee23f390d317 Mon Sep 17 00:00:00 2001 From: "Boosted Bot [bot]" <130566815+boosted-bot@users.noreply.github.com> Date: Thu, 31 Oct 2024 12:40:02 +0100 Subject: [PATCH 28/30] =?UTF-8?q?chore(=F0=9F=A4=96):=20update=20`OrangeBr?= =?UTF-8?q?andColorRawTokens`=20(tokenator=2020241030132734)=20(#262)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Pierre-Yves Lapersonne Co-authored-by: boosted-bot Co-authored-by: Pierre-Yves Lapersonne --- CHANGELOG.md | 1 + .../Values/OrangeBrandColorRawTokens+Values.swift | 15 +++------------ 2 files changed, 4 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cdbe28655..7e853071b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed +- [Library] Update `OrangeBrandColorRawTokens` (tokenator *20241030132734*) - [Library] Update `BorderSemanticTokens` (tokenator *20241025110844*) - [Library] Rename color semantic tokens `colorBackground*` to `colorBg*` - [Library] Rename `MultipleSpacingTokens` to `MultipleSpaceTokens` and `MultipleSizingTokens` to `MultipleSizeTokens` diff --git a/OUDS/Core/Themes/Orange/Sources/Values/OrangeBrandColorRawTokens+Values.swift b/OUDS/Core/Themes/Orange/Sources/Values/OrangeBrandColorRawTokens+Values.swift index 7b5ae9957..0a660447d 100644 --- a/OUDS/Core/Themes/Orange/Sources/Values/OrangeBrandColorRawTokens+Values.swift +++ b/OUDS/Core/Themes/Orange/Sources/Values/OrangeBrandColorRawTokens+Values.swift @@ -2,26 +2,20 @@ // Software Name: OUDS iOS // SPDX-FileCopyrightText: Copyright (c) Orange SA // SPDX-License-Identifier: MIT -// +// // This software is distributed under the MIT license, // the text of which is available at https://opensource.org/license/MIT/ // or see the "LICENSE" file for more details. -// +// // Authors: See CONTRIBUTORS.txt -// Software description: A SwiftUI components library with code examples for Orange Unified Design System +// Software description: A SwiftUI components library with code examples for Orange Unified Design System // import OUDSTokensRaw -// ଘ( ・ω・)_/゚・:*:・。☆ -// [File to generate with the tokenator] - // swiftlint:disable missing_docs extension OrangeBrandColorRawTokens { - - // MARK: Primitive token - Colors - Orange - Orange - public static let colorOrange50: ColorOrangeBrandRawToken = "#FFF2E6" public static let colorOrange100: ColorOrangeBrandRawToken = "#FFD5B0" public static let colorOrange200: ColorOrangeBrandRawToken = "#FFC18A" @@ -33,9 +27,6 @@ extension OrangeBrandColorRawTokens { public static let colorOrange700: ColorOrangeBrandRawToken = "#B55600" public static let colorOrange800: ColorOrangeBrandRawToken = "#8C4300" public static let colorOrange900: ColorOrangeBrandRawToken = "#6B3300" - - // MARK: Primitive token - Colors - Orange - Warm gray - public static let colorWarmGray100: ColorOrangeBrandRawToken = "#F9F5F0" public static let colorWarmGray200: ColorOrangeBrandRawToken = "#E9DDCE" public static let colorWarmGray300: ColorOrangeBrandRawToken = "#D6C4AE" From ecd567274238dc4b6efe53b3b3decac72e3509d4 Mon Sep 17 00:00:00 2001 From: "Boosted Bot [bot]" <130566815+boosted-bot@users.noreply.github.com> Date: Thu, 31 Oct 2024 13:38:39 +0100 Subject: [PATCH 29/30] =?UTF-8?q?chore(=F0=9F=A4=96):=20update=20`Elevatio?= =?UTF-8?q?nSemanticTokens`=20(tokenator=2020241031125053)=20(#263)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Pierre-Yves Lapersonne Co-authored-by: boosted-bot Co-authored-by: Pierre-Yves Lapersonne --- CHANGELOG.md | 1 + .../OUDSTheme+ElevationSemanticTokens.swift | 55 ++++++------------- 2 files changed, 18 insertions(+), 38 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7e853071b..86b06be22 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed +- [Library] Update `ElevationSemanticTokens` (tokenator *20241031125053*) - [Library] Update `OrangeBrandColorRawTokens` (tokenator *20241030132734*) - [Library] Update `BorderSemanticTokens` (tokenator *20241025110844*) - [Library] Rename color semantic tokens `colorBackground*` to `colorBg*` diff --git a/OUDS/Core/OUDS/Sources/OUDSTheme/OUDSTheme+SemanticTokens/OUDSTheme+ElevationSemanticTokens.swift b/OUDS/Core/OUDS/Sources/OUDSTheme/OUDSTheme+SemanticTokens/OUDSTheme+ElevationSemanticTokens.swift index 9896f6822..b05c67ffa 100644 --- a/OUDS/Core/OUDS/Sources/OUDSTheme/OUDSTheme+SemanticTokens/OUDSTheme+ElevationSemanticTokens.swift +++ b/OUDS/Core/OUDS/Sources/OUDSTheme/OUDSTheme+SemanticTokens/OUDSTheme+ElevationSemanticTokens.swift @@ -2,70 +2,49 @@ // Software Name: OUDS iOS // SPDX-FileCopyrightText: Copyright (c) Orange SA // SPDX-License-Identifier: MIT -// +// // This software is distributed under the MIT license, // the text of which is available at https://opensource.org/license/MIT/ // or see the "LICENSE" file for more details. -// +// // Authors: See CONTRIBUTORS.txt -// Software description: A SwiftUI components library with code examples for Orange Unified Design System +// Software description: A SwiftUI components library with code examples for Orange Unified Design System // import Foundation import OUDSTokensRaw import OUDSTokensSemantic -// ଘ( ・ω・)_/゚・:*:・。☆ -// [File to generate with the tokenator] -// WARNING: Not synchronized anymore with the Figjam / Figma by developers team -// Create an issue for update https://github.com/Orange-OpenSource/ouds-ios/issues/new?template=token_update.yml - -/// Defines basic values common to all themes for `ElevationSemanticTokens`. -/// These values can be overriden inside `OUDSTheme` subclasses (in extensions or not, in the same module or not) thanks to the `@objc open` combination. -/// The aim of this extensions is to make relationships between all semantic tokens for elevations and associated raw tokens. -/// `OUDSTheme` can be seen as a kind of "abstract class" in _object oriented paradigm_. extension OUDSTheme: ElevationSemanticTokens { - - // MARK: Semantic token - Elevation - X - - @objc open var elevationXNone: ElevationXSemanticToken { ElevationRawTokens.elevationX0 } - @objc open var elevationXRaised: ElevationXSemanticToken { ElevationRawTokens.elevationX0 } + @objc open var elevationBlurDrag: ElevationBlurSemanticToken { ElevationRawTokens.elevationBlur400 } + @objc open var elevationBlurNone: ElevationBlurSemanticToken { ElevationRawTokens.elevationBlur0 } + @objc open var elevationBlurOverlayDefault: ElevationBlurSemanticToken { ElevationRawTokens.elevationBlur300 } + @objc open var elevationBlurOverlayEmphasized: ElevationBlurSemanticToken { ElevationRawTokens.elevationBlur600 } + @objc open var elevationBlurRaised: ElevationBlurSemanticToken { ElevationRawTokens.elevationBlur200 } + @objc open var elevationBlurStickyDefault: ElevationBlurSemanticToken { ElevationRawTokens.elevationBlur400 } + @objc open var elevationBlurStickyEmphasized: ElevationBlurSemanticToken { ElevationRawTokens.elevationBlur400 } + @objc open var elevationBlurStickyNavigationScrolled: ElevationBlurSemanticToken { ElevationRawTokens.elevationBlur400 } @objc open var elevationXDrag: ElevationXSemanticToken { ElevationRawTokens.elevationX0 } + @objc open var elevationXNone: ElevationXSemanticToken { ElevationRawTokens.elevationX0 } @objc open var elevationXOverlayDefault: ElevationXSemanticToken { ElevationRawTokens.elevationX0 } @objc open var elevationXOverlayEmphasized: ElevationXSemanticToken { ElevationRawTokens.elevationX0 } + @objc open var elevationXRaised: ElevationXSemanticToken { ElevationRawTokens.elevationX0 } @objc open var elevationXStickyDefault: ElevationXSemanticToken { ElevationRawTokens.elevationX0 } @objc open var elevationXStickyEmphasized: ElevationXSemanticToken { ElevationRawTokens.elevationX0 } @objc open var elevationXStickyNavigationScrolled: ElevationXSemanticToken { ElevationRawTokens.elevationX0 } - - // MARK: Semantic token - Elevation - Y - - @objc open var elevationYNone: ElevationYSemanticToken { ElevationRawTokens.elevationY0 } - @objc open var elevationYRaised: ElevationYSemanticToken { ElevationRawTokens.elevationY100 } @objc open var elevationYDrag: ElevationYSemanticToken { ElevationRawTokens.elevationY300 } + @objc open var elevationYNone: ElevationYSemanticToken { ElevationRawTokens.elevationY0 } @objc open var elevationYOverlayDefault: ElevationYSemanticToken { ElevationRawTokens.elevationY200 } @objc open var elevationYOverlayEmphasized: ElevationYSemanticToken { ElevationRawTokens.elevationY500 } + @objc open var elevationYRaised: ElevationYSemanticToken { ElevationRawTokens.elevationY100 } @objc open var elevationYStickyDefault: ElevationYSemanticToken { ElevationRawTokens.elevationY300 } @objc open var elevationYStickyEmphasized: ElevationYSemanticToken { ElevationRawTokens.elevationY300 } @objc open var elevationYStickyNavigationScrolled: ElevationYSemanticToken { ElevationRawTokens.elevationY300 } - - // MARK: Semantic token - Elevation - Blur - - @objc open var elevationBlurNone: ElevationBlurSemanticToken { ElevationRawTokens.elevationBlur0 } - @objc open var elevationBlurRaised: ElevationBlurSemanticToken { ElevationRawTokens.elevationBlur200 } - @objc open var elevationBlurDrag: ElevationBlurSemanticToken { ElevationRawTokens.elevationBlur400 } - @objc open var elevationBlurOverlayDefault: ElevationBlurSemanticToken { ElevationRawTokens.elevationBlur300 } - @objc open var elevationBlurOverlayEmphasized: ElevationBlurSemanticToken { ElevationRawTokens.elevationBlur600 } - @objc open var elevationBlurStickyDefault: ElevationBlurSemanticToken { ElevationRawTokens.elevationBlur400 } - @objc open var elevationBlurStickyEmphasized: ElevationBlurSemanticToken { ElevationRawTokens.elevationBlur400 } - @objc open var elevationBlurStickyNavigationScrolled: ElevationBlurSemanticToken { ElevationRawTokens.elevationBlur400 } - - // MARK: Semantic token - Elevation - Color - - @objc open var elevationColorNone: ElevationColorSemanticToken { ElevationColorSemanticToken(ColorRawTokens.colorTransparentBlack0) } - @objc open var elevationColorRaised: ElevationColorSemanticToken { ElevationColorSemanticToken(ColorRawTokens.colorTransparentBlack500) } @objc open var elevationColorDrag: ElevationColorSemanticToken { ElevationColorSemanticToken(ColorRawTokens.colorTransparentBlack500) } + @objc open var elevationColorNone: ElevationColorSemanticToken { ElevationColorSemanticToken(ColorRawTokens.colorTransparentBlack0) } @objc open var elevationColorOverlayDefault: ElevationColorSemanticToken { ElevationColorSemanticToken(ColorRawTokens.colorTransparentBlack400) } @objc open var elevationColorOverlayEmphasized: ElevationColorSemanticToken { ElevationColorSemanticToken(ColorRawTokens.colorTransparentBlack300) } + @objc open var elevationColorRaised: ElevationColorSemanticToken { ElevationColorSemanticToken(ColorRawTokens.colorTransparentBlack500) } @objc open var elevationColorStickyDefault: ElevationColorSemanticToken { ElevationColorSemanticToken(ColorRawTokens.colorTransparentBlack300) } @objc open var elevationColorStickyEmphasized: ElevationColorSemanticToken { ElevationColorSemanticToken(ColorRawTokens.colorTransparentBlack300) } @objc open var elevationColorStickyNavigationScrolled: ElevationColorSemanticToken { ElevationColorSemanticToken(ColorRawTokens.colorTransparentBlack300) } From 8746170c16b6bb2d2db8fb3a901cf16e1adc2da9 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Lapersonne Date: Thu, 31 Oct 2024 17:21:53 +0100 Subject: [PATCH 30/30] Prepare release 0.5.0 (#268) Signed-off-by: Pierre-Yves Lapersonne --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 86b06be22..d69ff4fab 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,7 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [Unreleased](https://github.com/Orange-OpenSource/ouds-ios/compare/0.4.1...develop) +## [0.5.0](https://github.com/Orange-OpenSource/ouds-ios/compare/0.4.1...0.5.0) - 2024-10-31 ### Added