diff --git a/.swiftlint.yml b/.swiftlint.yml index b558e26d2c..214df1e545 100644 --- a/.swiftlint.yml +++ b/.swiftlint.yml @@ -168,8 +168,9 @@ only_rules: included: # paths to include during linting. `--path` is ignored if present. - ${LINTPATH} - - ios - - macos + - Demos + - Sources + - Tests excluded: # paths to ignore during linting. Takes precedence over `included`. - Pods diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index d7f8c21763..6638746eb3 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -27,7 +27,7 @@ Fluent UI Apple requires all [pull requests](https://help.github.com/en/github/c Fluent UI Apple doesn't have any external code dependencies, so developing in the repository is as easy as launching the appropriate Xcode project or workspace and building and running a test/demo app. -For more detailed instructions on how to run the demo app in specific platform, please see [the iOS readme file](ios/CONTRIBUTING.md) and the [the macOS readme file](macos/CONTRIBUTING.md). +For more detailed instructions on how to run the demo app in specific platform, please see [the iOS readme file](Sources/FluentUI_iOS/CONTRIBUTING.md) and the [the macOS readme file](Sources/FluentUI_macOS/CONTRIBUTING.md). ## Checklist before creating a pull request Fill out all the information in your [PR description](https://github.com/microsoft/fluentui-apple/blob/main/.github/PULL_REQUEST_TEMPLATE.md#pull-request-checklist) diff --git a/macos/FluentUISwiftUITestApp/FluentUI-testapp.xcassets/AccentColor.colorset/Contents.json b/Demos/FluentUIDemo/Assets.xcassets/AccentColor.colorset/Contents.json similarity index 100% rename from macos/FluentUISwiftUITestApp/FluentUI-testapp.xcassets/AccentColor.colorset/Contents.json rename to Demos/FluentUIDemo/Assets.xcassets/AccentColor.colorset/Contents.json diff --git a/macos/FluentUITestApp/Assets.xcassets/AppIcon.appiconset/ Icon-128.png b/Demos/FluentUIDemo/Assets.xcassets/AppIcon.appiconset/ Icon-128.png similarity index 100% rename from macos/FluentUITestApp/Assets.xcassets/AppIcon.appiconset/ Icon-128.png rename to Demos/FluentUIDemo/Assets.xcassets/AppIcon.appiconset/ Icon-128.png diff --git a/macos/FluentUITestApp/Assets.xcassets/AppIcon.appiconset/ Icon-128_2x-1.png b/Demos/FluentUIDemo/Assets.xcassets/AppIcon.appiconset/ Icon-128_2x-1.png similarity index 100% rename from macos/FluentUITestApp/Assets.xcassets/AppIcon.appiconset/ Icon-128_2x-1.png rename to Demos/FluentUIDemo/Assets.xcassets/AppIcon.appiconset/ Icon-128_2x-1.png diff --git a/macos/FluentUITestApp/Assets.xcassets/AppIcon.appiconset/ Icon-128_2x.png b/Demos/FluentUIDemo/Assets.xcassets/AppIcon.appiconset/ Icon-128_2x.png similarity index 100% rename from macos/FluentUITestApp/Assets.xcassets/AppIcon.appiconset/ Icon-128_2x.png rename to Demos/FluentUIDemo/Assets.xcassets/AppIcon.appiconset/ Icon-128_2x.png diff --git a/macos/FluentUITestApp/Assets.xcassets/AppIcon.appiconset/ Icon-16.png b/Demos/FluentUIDemo/Assets.xcassets/AppIcon.appiconset/ Icon-16.png similarity index 100% rename from macos/FluentUITestApp/Assets.xcassets/AppIcon.appiconset/ Icon-16.png rename to Demos/FluentUIDemo/Assets.xcassets/AppIcon.appiconset/ Icon-16.png diff --git a/macos/FluentUITestApp/Assets.xcassets/AppIcon.appiconset/ Icon-16_2x.png b/Demos/FluentUIDemo/Assets.xcassets/AppIcon.appiconset/ Icon-16_2x.png similarity index 100% rename from macos/FluentUITestApp/Assets.xcassets/AppIcon.appiconset/ Icon-16_2x.png rename to Demos/FluentUIDemo/Assets.xcassets/AppIcon.appiconset/ Icon-16_2x.png diff --git a/macos/FluentUITestApp/Assets.xcassets/AppIcon.appiconset/ Icon-256_2x.png b/Demos/FluentUIDemo/Assets.xcassets/AppIcon.appiconset/ Icon-256_2x.png similarity index 100% rename from macos/FluentUITestApp/Assets.xcassets/AppIcon.appiconset/ Icon-256_2x.png rename to Demos/FluentUIDemo/Assets.xcassets/AppIcon.appiconset/ Icon-256_2x.png diff --git a/macos/FluentUITestApp/Assets.xcassets/AppIcon.appiconset/ Icon-32.png b/Demos/FluentUIDemo/Assets.xcassets/AppIcon.appiconset/ Icon-32.png similarity index 100% rename from macos/FluentUITestApp/Assets.xcassets/AppIcon.appiconset/ Icon-32.png rename to Demos/FluentUIDemo/Assets.xcassets/AppIcon.appiconset/ Icon-32.png diff --git a/macos/FluentUITestApp/Assets.xcassets/AppIcon.appiconset/ Icon-32_2x.png b/Demos/FluentUIDemo/Assets.xcassets/AppIcon.appiconset/ Icon-32_2x.png similarity index 100% rename from macos/FluentUITestApp/Assets.xcassets/AppIcon.appiconset/ Icon-32_2x.png rename to Demos/FluentUIDemo/Assets.xcassets/AppIcon.appiconset/ Icon-32_2x.png diff --git a/macos/FluentUITestApp/Assets.xcassets/AppIcon.appiconset/ Icon-512.png b/Demos/FluentUIDemo/Assets.xcassets/AppIcon.appiconset/ Icon-512.png similarity index 100% rename from macos/FluentUITestApp/Assets.xcassets/AppIcon.appiconset/ Icon-512.png rename to Demos/FluentUIDemo/Assets.xcassets/AppIcon.appiconset/ Icon-512.png diff --git a/macos/FluentUITestApp/Assets.xcassets/AppIcon.appiconset/ Icon-512_2x.png b/Demos/FluentUIDemo/Assets.xcassets/AppIcon.appiconset/ Icon-512_2x.png similarity index 100% rename from macos/FluentUITestApp/Assets.xcassets/AppIcon.appiconset/ Icon-512_2x.png rename to Demos/FluentUIDemo/Assets.xcassets/AppIcon.appiconset/ Icon-512_2x.png diff --git a/Demos/FluentUIDemo/Assets.xcassets/AppIcon.appiconset/Contents.json b/Demos/FluentUIDemo/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000000..23e5987da5 --- /dev/null +++ b/Demos/FluentUIDemo/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,74 @@ +{ + "images" : [ + { + "filename" : "FluentUIDemo_iOS.png", + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + }, + { + "filename" : " Icon-16.png", + "idiom" : "mac", + "scale" : "1x", + "size" : "16x16" + }, + { + "filename" : " Icon-16_2x.png", + "idiom" : "mac", + "scale" : "2x", + "size" : "16x16" + }, + { + "filename" : " Icon-32.png", + "idiom" : "mac", + "scale" : "1x", + "size" : "32x32" + }, + { + "filename" : " Icon-32_2x.png", + "idiom" : "mac", + "scale" : "2x", + "size" : "32x32" + }, + { + "filename" : " Icon-128.png", + "idiom" : "mac", + "scale" : "1x", + "size" : "128x128" + }, + { + "filename" : " Icon-128_2x-1.png", + "idiom" : "mac", + "scale" : "2x", + "size" : "128x128" + }, + { + "filename" : " Icon-128_2x.png", + "idiom" : "mac", + "scale" : "1x", + "size" : "256x256" + }, + { + "filename" : " Icon-256_2x.png", + "idiom" : "mac", + "scale" : "2x", + "size" : "256x256" + }, + { + "filename" : " Icon-512.png", + "idiom" : "mac", + "scale" : "1x", + "size" : "512x512" + }, + { + "filename" : " Icon-512_2x.png", + "idiom" : "mac", + "scale" : "2x", + "size" : "512x512" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/AppIcon.appiconset/ App Store.png b/Demos/FluentUIDemo/Assets.xcassets/AppIcon.appiconset/FluentUIDemo_iOS.png similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/AppIcon.appiconset/ App Store.png rename to Demos/FluentUIDemo/Assets.xcassets/AppIcon.appiconset/FluentUIDemo_iOS.png diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Button/Contents.json b/Demos/FluentUIDemo/Assets.xcassets/Contents.json similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Button/Contents.json rename to Demos/FluentUIDemo/Assets.xcassets/Contents.json diff --git a/Demos/FluentUIDemo/ContentView.swift b/Demos/FluentUIDemo/ContentView.swift new file mode 100644 index 0000000000..2e4aa4cbae --- /dev/null +++ b/Demos/FluentUIDemo/ContentView.swift @@ -0,0 +1,42 @@ +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// + +import SwiftUI +import FluentUI + +struct ContentView: View { +#if os(macOS) + // Until we have a SwiftUI button on macOS, this will have to do. + private struct ButtonRepresentable: NSViewRepresentable { + func makeNSView(context: Context) -> some NSView { + return FluentUI.Button(title: "Hello, world!", + image: .init(systemSymbolName: "globe", accessibilityDescription: nil)) + } + + func updateNSView(_ nsView: NSViewType, context: Context) { + } + } +#endif + + var body: some View { + VStack { +#if os(macOS) + ButtonRepresentable() + .fixedSize() +#else + Button(action: {}, label: { + HStack { + Image(systemName: "globe") + .imageScale(.large) + Text("Hello, world!") + } + }) + .buttonStyle(FluentButtonStyle(style: .accent)) + .controlSize(.extraLarge) +#endif + } + .padding() + } +} diff --git a/macos/FluentUISwiftUITestApp/FluentUISwiftUITestApp.entitlements b/Demos/FluentUIDemo/FluentUIDemo.entitlements similarity index 100% rename from macos/FluentUISwiftUITestApp/FluentUISwiftUITestApp.entitlements rename to Demos/FluentUIDemo/FluentUIDemo.entitlements diff --git a/Demos/FluentUIDemo/FluentUIDemo.xcodeproj/project.pbxproj b/Demos/FluentUIDemo/FluentUIDemo.xcodeproj/project.pbxproj new file mode 100644 index 0000000000..8e53bf112a --- /dev/null +++ b/Demos/FluentUIDemo/FluentUIDemo.xcodeproj/project.pbxproj @@ -0,0 +1,395 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 56; + objects = { + +/* Begin PBXBuildFile section */ + 92660C302C486AA500A209ED /* FluentUIDemoApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 92660C2F2C486AA500A209ED /* FluentUIDemoApp.swift */; }; + 92660C322C486AA500A209ED /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 92660C312C486AA500A209ED /* ContentView.swift */; }; + 92660C342C486AA800A209ED /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 92660C332C486AA800A209ED /* Assets.xcassets */; }; + 92660C382C486AA800A209ED /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 92660C372C486AA800A209ED /* Preview Assets.xcassets */; }; + 92660C4A2C48787F00A209ED /* FluentUI in Frameworks */ = {isa = PBXBuildFile; productRef = 92660C492C48787F00A209ED /* FluentUI */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 92660C2C2C486AA500A209ED /* FluentUIDemo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = FluentUIDemo.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 92660C2F2C486AA500A209ED /* FluentUIDemoApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FluentUIDemoApp.swift; sourceTree = ""; }; + 92660C312C486AA500A209ED /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; + 92660C332C486AA800A209ED /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 92660C352C486AA800A209ED /* FluentUIDemo.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = FluentUIDemo.entitlements; sourceTree = ""; }; + 92660C372C486AA800A209ED /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; }; + 92660C472C48786600A209ED /* fluentui-apple */ = {isa = PBXFileReference; lastKnownFileType = wrapper; name = "fluentui-apple"; path = ../..; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 92660C292C486AA500A209ED /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 92660C4A2C48787F00A209ED /* FluentUI in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 92660C232C486AA500A209ED = { + isa = PBXGroup; + children = ( + 92660C422C48780500A209ED /* Packages */, + 92660C2E2C486AA500A209ED /* FluentUIDemo */, + 92660C2D2C486AA500A209ED /* Products */, + 92660C482C48787F00A209ED /* Frameworks */, + ); + sourceTree = ""; + usesTabs = 0; + }; + 92660C2D2C486AA500A209ED /* Products */ = { + isa = PBXGroup; + children = ( + 92660C2C2C486AA500A209ED /* FluentUIDemo.app */, + ); + name = Products; + sourceTree = ""; + }; + 92660C2E2C486AA500A209ED /* FluentUIDemo */ = { + isa = PBXGroup; + children = ( + 92660C2F2C486AA500A209ED /* FluentUIDemoApp.swift */, + 92660C312C486AA500A209ED /* ContentView.swift */, + 92660C332C486AA800A209ED /* Assets.xcassets */, + 92660C352C486AA800A209ED /* FluentUIDemo.entitlements */, + 92660C362C486AA800A209ED /* Preview Content */, + ); + name = FluentUIDemo; + sourceTree = ""; + }; + 92660C362C486AA800A209ED /* Preview Content */ = { + isa = PBXGroup; + children = ( + 92660C372C486AA800A209ED /* Preview Assets.xcassets */, + ); + path = "Preview Content"; + sourceTree = ""; + }; + 92660C422C48780500A209ED /* Packages */ = { + isa = PBXGroup; + children = ( + 92660C472C48786600A209ED /* fluentui-apple */, + ); + name = Packages; + sourceTree = ""; + }; + 92660C482C48787F00A209ED /* Frameworks */ = { + isa = PBXGroup; + children = ( + ); + name = Frameworks; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 92660C2B2C486AA500A209ED /* FluentUIDemo */ = { + isa = PBXNativeTarget; + buildConfigurationList = 92660C3B2C486AA800A209ED /* Build configuration list for PBXNativeTarget "FluentUIDemo" */; + buildPhases = ( + 92660C282C486AA500A209ED /* Sources */, + 92660C292C486AA500A209ED /* Frameworks */, + 92660C2A2C486AA500A209ED /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = FluentUIDemo; + packageProductDependencies = ( + 92660C492C48787F00A209ED /* FluentUI */, + ); + productName = FluentUIDemo; + productReference = 92660C2C2C486AA500A209ED /* FluentUIDemo.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 92660C242C486AA500A209ED /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = 1; + LastSwiftUpdateCheck = 1530; + LastUpgradeCheck = 1530; + TargetAttributes = { + 92660C2B2C486AA500A209ED = { + CreatedOnToolsVersion = 15.3; + }; + }; + }; + buildConfigurationList = 92660C272C486AA500A209ED /* Build configuration list for PBXProject "FluentUIDemo" */; + compatibilityVersion = "Xcode 14.0"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 92660C232C486AA500A209ED; + packageReferences = ( + ); + productRefGroup = 92660C2D2C486AA500A209ED /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 92660C2B2C486AA500A209ED /* FluentUIDemo */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 92660C2A2C486AA500A209ED /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 92660C382C486AA800A209ED /* Preview Assets.xcassets in Resources */, + 92660C342C486AA800A209ED /* Assets.xcassets in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 92660C282C486AA500A209ED /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 92660C322C486AA500A209ED /* ContentView.swift in Sources */, + 92660C302C486AA500A209ED /* FluentUIDemoApp.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + 92660C392C486AA800A209ED /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 92660C3A2C486AA800A209ED /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SWIFT_COMPILATION_MODE = wholemodule; + }; + name = Release; + }; + 92660C3C2C486AA800A209ED /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_ENTITLEMENTS = FluentUIDemo.entitlements; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_ASSET_PATHS = "\"Preview Content\""; + ENABLE_PREVIEWS = YES; + GENERATE_INFOPLIST_FILE = YES; + "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphoneos*]" = UIStatusBarStyleDefault; + "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphonesimulator*]" = UIStatusBarStyleDefault; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + IPHONEOS_DEPLOYMENT_TARGET = 17.4; + LD_RUNPATH_SEARCH_PATHS = "@executable_path/Frameworks"; + "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "@executable_path/../Frameworks"; + MACOSX_DEPLOYMENT_TARGET = 14.4; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.microsoft.FluentUIDemo; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = auto; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx"; + SUPPORTS_MACCATALYST = NO; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 92660C3D2C486AA800A209ED /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_ENTITLEMENTS = FluentUIDemo.entitlements; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_ASSET_PATHS = "\"Preview Content\""; + ENABLE_PREVIEWS = YES; + GENERATE_INFOPLIST_FILE = YES; + "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphoneos*]" = YES; + "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphonesimulator*]" = YES; + "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphoneos*]" = UIStatusBarStyleDefault; + "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphonesimulator*]" = UIStatusBarStyleDefault; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + IPHONEOS_DEPLOYMENT_TARGET = 17.4; + LD_RUNPATH_SEARCH_PATHS = "@executable_path/Frameworks"; + "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "@executable_path/../Frameworks"; + MACOSX_DEPLOYMENT_TARGET = 14.4; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.microsoft.FluentUIDemo; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = auto; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx"; + SUPPORTS_MACCATALYST = NO; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 92660C272C486AA500A209ED /* Build configuration list for PBXProject "FluentUIDemo" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 92660C392C486AA800A209ED /* Debug */, + 92660C3A2C486AA800A209ED /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 92660C3B2C486AA800A209ED /* Build configuration list for PBXNativeTarget "FluentUIDemo" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 92660C3C2C486AA800A209ED /* Debug */, + 92660C3D2C486AA800A209ED /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + +/* Begin XCSwiftPackageProductDependency section */ + 92660C492C48787F00A209ED /* FluentUI */ = { + isa = XCSwiftPackageProductDependency; + productName = FluentUI; + }; +/* End XCSwiftPackageProductDependency section */ + }; + rootObject = 92660C242C486AA500A209ED /* Project object */; +} diff --git a/ios/FluentUI.Demo/FluentUI.Demo.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Demos/FluentUIDemo/FluentUIDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo.xcodeproj/project.xcworkspace/contents.xcworkspacedata rename to Demos/FluentUIDemo/FluentUIDemo.xcodeproj/project.xcworkspace/contents.xcworkspacedata diff --git a/apple/FluentUI-All.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Demos/FluentUIDemo/FluentUIDemo.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist similarity index 100% rename from apple/FluentUI-All.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist rename to Demos/FluentUIDemo/FluentUIDemo.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist diff --git a/Demos/FluentUIDemo/FluentUIDemoApp.swift b/Demos/FluentUIDemo/FluentUIDemoApp.swift new file mode 100644 index 0000000000..a0317954dd --- /dev/null +++ b/Demos/FluentUIDemo/FluentUIDemoApp.swift @@ -0,0 +1,15 @@ +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// + +import SwiftUI + +@main +struct FluentUIDemoApp: App { + var body: some Scene { + WindowGroup { + ContentView() + } + } +} diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/Contents.json b/Demos/FluentUIDemo/Preview Content/Preview Assets.xcassets/Contents.json similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/Contents.json rename to Demos/FluentUIDemo/Preview Content/Preview Assets.xcassets/Contents.json diff --git a/ios/FluentUI.Demo/FluentUI.Demo.xcodeproj/project.pbxproj b/Demos/FluentUIDemo_iOS/FluentUI.Demo.xcodeproj/project.pbxproj similarity index 96% rename from ios/FluentUI.Demo/FluentUI.Demo.xcodeproj/project.pbxproj rename to Demos/FluentUIDemo_iOS/FluentUI.Demo.xcodeproj/project.pbxproj index 12eade7805..f05b83f535 100644 --- a/ios/FluentUI.Demo/FluentUI.Demo.xcodeproj/project.pbxproj +++ b/Demos/FluentUIDemo_iOS/FluentUI.Demo.xcodeproj/project.pbxproj @@ -85,18 +85,20 @@ 8F0B81122670200300463726 /* AppCenterDistribute in Frameworks */ = {isa = PBXBuildFile; platformFilter = ios; productRef = 8F0B81112670200300463726 /* AppCenterDistribute */; }; 8F0B8114267021A700463726 /* AppCenterAnalytics in Frameworks */ = {isa = PBXBuildFile; platformFilter = ios; productRef = 8F0B8113267021A700463726 /* AppCenterAnalytics */; }; 8F0B8116267021A700463726 /* AppCenterCrashes in Frameworks */ = {isa = PBXBuildFile; platformFilter = ios; productRef = 8F0B8115267021A700463726 /* AppCenterCrashes */; }; + 9211BC612BD97B7900B95200 /* DemoHostingController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9211BC602BD97B7900B95200 /* DemoHostingController.swift */; }; 92279B352B97F5DA00994D88 /* ButtonDemoController_SwiftUI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 92279B342B97F5D900994D88 /* ButtonDemoController_SwiftUI.swift */; }; - 923DF2DB271158C900637646 /* libFluentUI.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 923DF2DA271158C900637646 /* libFluentUI.a */; }; - 923DF2DF27115B4700637646 /* FluentUIResources-ios.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 923DF2DC271158CD00637646 /* FluentUIResources-ios.bundle */; }; 9245E1F927BECDBB007616F3 /* GlobalColorTokensDemoController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9245E1F827BECDBB007616F3 /* GlobalColorTokensDemoController.swift */; }; + 9246B7072C628CF6004A4440 /* FluentUI in Frameworks */ = {isa = PBXBuildFile; productRef = 9246B7062C628CF6004A4440 /* FluentUI */; }; 92561E732718AD090072ED00 /* DemoTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 92561E722718AD090072ED00 /* DemoTableViewController.swift */; }; - 928C00B12B8920E60023ECE7 /* View+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 928C00B02B8920E60023ECE7 /* View+Extensions.swift */; }; - 92B45E4E279A1A0B00E72517 /* DemoAppearanceController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 92B45E4D279A1A0B00E72517 /* DemoAppearanceController.swift */; }; + 92B45E4E279A1A0B00E72517 /* DemoAppearanceControlView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 92B45E4D279A1A0B00E72517 /* DemoAppearanceControlView.swift */; }; + 92BF13322BE405710068422C /* AliasColorTokensDemoController_SwiftUI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 92BF13312BE405710068422C /* AliasColorTokensDemoController_SwiftUI.swift */; }; + 92C55CB72BEAA94500E0AB8D /* AvatarGroupDemoController_SwiftUI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 92C55CB62BEAA94500E0AB8D /* AvatarGroupDemoController_SwiftUI.swift */; }; 92D5598426A1523400328FD3 /* CardNudgeDemoController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 92D5598326A1523400328FD3 /* CardNudgeDemoController.swift */; }; 92D5FDFD28AC57650087894B /* TypographyTokensDemoController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 92D5FDFC28AC57650087894B /* TypographyTokensDemoController.swift */; }; - 92DD1E8D279F496300FDEE0F /* DemoAppearanceView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 92DD1E8C279F496300FDEE0F /* DemoAppearanceView.swift */; }; + 92DD1E8D279F496300FDEE0F /* DemoAppearanceMenu.swift in Sources */ = {isa = PBXBuildFile; fileRef = 92DD1E8C279F496300FDEE0F /* DemoAppearanceMenu.swift */; }; 92E977B726C7144F008E10A8 /* UIResponder+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 92E977B526C713F3008E10A8 /* UIResponder+Extensions.swift */; }; 92E977B826C7144F008E10A8 /* DemoControllerScrollView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 92E977B426C713F3008E10A8 /* DemoControllerScrollView.swift */; }; + 92EFD3E42BDA28F100DB35F2 /* TooltipDemoController_SwiftUI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 92EFD3E32BDA28F100DB35F2 /* TooltipDemoController_SwiftUI.swift */; }; A589F856211BA71000471C23 /* LabelDemoController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A589F855211BA71000471C23 /* LabelDemoController.swift */; }; A591A3F420F429EB001ED23B /* Demos.swift in Sources */ = {isa = PBXBuildFile; fileRef = A591A3F320F429EB001ED23B /* Demos.swift */; }; A5CEC21020E436F10016922A /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5CEC20F20E436F10016922A /* AppDelegate.swift */; }; @@ -221,19 +223,23 @@ 807E8B4428F9F8B8002B8F84 /* PillButtonDemoController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PillButtonDemoController.swift; sourceTree = ""; }; 80AECC0B2630F1BB005AF2F3 /* BottomCommandingDemoController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BottomCommandingDemoController.swift; sourceTree = ""; }; 80B1F7002628D8BB004DFEE5 /* BottomSheetDemoController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BottomSheetDemoController.swift; sourceTree = ""; }; + 9211BC602BD97B7900B95200 /* DemoHostingController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DemoHostingController.swift; sourceTree = ""; }; 92279B342B97F5D900994D88 /* ButtonDemoController_SwiftUI.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ButtonDemoController_SwiftUI.swift; sourceTree = ""; }; 923DF2DA271158C900637646 /* libFluentUI.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; path = libFluentUI.a; sourceTree = BUILT_PRODUCTS_DIR; }; 923DF2DC271158CD00637646 /* FluentUIResources-ios.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; path = "FluentUIResources-ios.bundle"; sourceTree = BUILT_PRODUCTS_DIR; }; 9245E1F827BECDBB007616F3 /* GlobalColorTokensDemoController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GlobalColorTokensDemoController.swift; sourceTree = ""; }; + 9246B7052C628CAE004A4440 /* fluentui-apple */ = {isa = PBXFileReference; lastKnownFileType = wrapper; name = "fluentui-apple"; path = ../..; sourceTree = ""; }; 92561E722718AD090072ED00 /* DemoTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DemoTableViewController.swift; sourceTree = ""; }; - 928C00B02B8920E60023ECE7 /* View+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "View+Extensions.swift"; sourceTree = ""; }; - 92B45E4D279A1A0B00E72517 /* DemoAppearanceController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DemoAppearanceController.swift; sourceTree = ""; }; + 92B45E4D279A1A0B00E72517 /* DemoAppearanceControlView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DemoAppearanceControlView.swift; sourceTree = ""; }; + 92BF13312BE405710068422C /* AliasColorTokensDemoController_SwiftUI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AliasColorTokensDemoController_SwiftUI.swift; sourceTree = ""; }; + 92C55CB62BEAA94500E0AB8D /* AvatarGroupDemoController_SwiftUI.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AvatarGroupDemoController_SwiftUI.swift; sourceTree = ""; }; 92D5598326A1523400328FD3 /* CardNudgeDemoController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CardNudgeDemoController.swift; sourceTree = ""; }; 92D5FDFC28AC57650087894B /* TypographyTokensDemoController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TypographyTokensDemoController.swift; sourceTree = ""; }; - 92DD1E8C279F496300FDEE0F /* DemoAppearanceView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DemoAppearanceView.swift; sourceTree = ""; }; + 92DD1E8C279F496300FDEE0F /* DemoAppearanceMenu.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DemoAppearanceMenu.swift; sourceTree = ""; }; 92E4784B2661AED800BAA058 /* PersonaButtonCarouselDemoController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PersonaButtonCarouselDemoController.swift; sourceTree = ""; }; 92E977B426C713F3008E10A8 /* DemoControllerScrollView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DemoControllerScrollView.swift; sourceTree = ""; }; 92E977B526C713F3008E10A8 /* UIResponder+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIResponder+Extensions.swift"; sourceTree = ""; }; + 92EFD3E32BDA28F100DB35F2 /* TooltipDemoController_SwiftUI.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TooltipDemoController_SwiftUI.swift; sourceTree = ""; }; A589F855211BA71000471C23 /* LabelDemoController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LabelDemoController.swift; sourceTree = ""; }; A591A3F320F429EB001ED23B /* Demos.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Demos.swift; sourceTree = ""; }; A5961FA8218A61BB00E2A506 /* PopupMenuDemoController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PopupMenuDemoController.swift; sourceTree = ""; }; @@ -339,10 +345,10 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 9246B7072C628CF6004A4440 /* FluentUI in Frameworks */, 8F0B81122670200300463726 /* AppCenterDistribute in Frameworks */, 8F0B8114267021A700463726 /* AppCenterAnalytics in Frameworks */, 8F0B8116267021A700463726 /* AppCenterCrashes in Frameworks */, - 923DF2DB271158C900637646 /* libFluentUI.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -409,7 +415,6 @@ isa = PBXGroup; children = ( 5303259726B31A6300611D05 /* FluentUIDemoToggle.swift */, - 928C00B02B8920E60023ECE7 /* View+Extensions.swift */, ); path = SwiftUI; sourceTree = ""; @@ -453,10 +458,11 @@ A591A3F520F42A9E001ED23B /* Shell */ = { isa = PBXGroup; children = ( - 92B45E4D279A1A0B00E72517 /* DemoAppearanceController.swift */, - 92DD1E8C279F496300FDEE0F /* DemoAppearanceView.swift */, + 92B45E4D279A1A0B00E72517 /* DemoAppearanceControlView.swift */, + 92DD1E8C279F496300FDEE0F /* DemoAppearanceMenu.swift */, E6842995247C350700A29C40 /* DemoColorThemes.swift */, A5DCA75F211E3B4C005F4CB7 /* DemoController.swift */, + 9211BC602BD97B7900B95200 /* DemoHostingController.swift */, A5CEC21120E436F10016922A /* DemoListViewController.swift */, 92561E722718AD090072ED00 /* DemoTableViewController.swift */, 6FC8AD3A28DBAF280010C0F8 /* ReadmeViewController.swift */, @@ -467,6 +473,7 @@ A5CEC20320E436F10016922A = { isa = PBXGroup; children = ( + 9246B7052C628CAE004A4440 /* fluentui-apple */, A5CEC20E20E436F10016922A /* FluentUI.Demo */, 3A83F7C0295110FF00EF6629 /* FluentUIDemoTests */, A5CEC20D20E436F10016922A /* Products */, @@ -474,6 +481,7 @@ 5340828A26CFF298007716E1 /* Recovered References */, ); sourceTree = ""; + usesTabs = 0; }; A5CEC20D20E436F10016922A /* Products */ = { isa = PBXGroup; @@ -517,6 +525,7 @@ 5373D55E2694C3070032A3B4 /* AvatarDemoController.swift */, 5303259226B3198A00611D05 /* AvatarDemoController_SwiftUI.swift */, 5306075826A1E73F002D49CF /* AvatarGroupDemoController.swift */, + 92C55CB62BEAA94500E0AB8D /* AvatarGroupDemoController_SwiftUI.swift */, B45EB79121A4D047008646A2 /* BadgeFieldDemoController.swift */, B444D6B72183BA4B0002B4D4 /* BadgeViewDemoController.swift */, 80AECC0B2630F1BB005AF2F3 /* BottomCommandingDemoController.swift */, @@ -567,9 +576,11 @@ EC98E2B72992FE6900B9DF91 /* TextFieldObjCDemoController.h */, EC98E2B52992FE5000B9DF91 /* TextFieldObjCDemoController.m */, FD7DF06121FB941400857267 /* TooltipDemoController.swift */, + 92EFD3E32BDA28F100DB35F2 /* TooltipDemoController_SwiftUI.swift */, 66963D0B29CB792E006F5FA9 /* TwoLineTitleViewDemoController.swift */, 92D5FDFC28AC57650087894B /* TypographyTokensDemoController.swift */, 6FEED93A28A6E5520099D178 /* AliasColorTokensDemoController.swift */, + 92BF13312BE405710068422C /* AliasColorTokensDemoController_SwiftUI.swift */, 6F453CA428AC536300ED91A4 /* ShadowTokensDemoController.swift */, ); path = Demos; @@ -635,6 +646,7 @@ 8F0B81112670200300463726 /* AppCenterDistribute */, 8F0B8113267021A700463726 /* AppCenterAnalytics */, 8F0B8115267021A700463726 /* AppCenterCrashes */, + 9246B7062C628CF6004A4440 /* FluentUI */, ); productName = OfficeUIFabric.Demo; productReference = A5CEC20C20E436F10016922A /* FluentUI.Demo.app */; @@ -735,7 +747,6 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 923DF2DF27115B4700637646 /* FluentUIResources-ios.bundle in Resources */, A5CEC21C20E436F20016922A /* LaunchScreen.storyboard in Resources */, A5CEC21920E436F20016922A /* Assets.xcassets in Resources */, ); @@ -817,6 +828,7 @@ 6FEED93B28A6E5520099D178 /* AliasColorTokensDemoController.swift in Sources */, A5DCA760211E3B4C005F4CB7 /* DemoController.swift in Sources */, F30B74382A7DB177000F63A0 /* ListActionItemDemoController_SwiftUI.swift in Sources */, + 9211BC612BD97B7900B95200 /* DemoHostingController.swift in Sources */, 5328D97B26FBA3EA00F3723B /* IndeterminateProgressBarDemoController.swift in Sources */, 5373D55F2694C3070032A3B4 /* AvatarDemoController.swift in Sources */, 7D0931C124AAA3D30072458A /* SideTabBarDemoController.swift in Sources */, @@ -826,6 +838,7 @@ B45EB79221A4D047008646A2 /* BadgeFieldDemoController.swift in Sources */, B4EF66562295F729007FEAB0 /* TableViewHeaderFooterSampleData.swift in Sources */, 53097D3A27028AC900A6E4DC /* DateTimePickerDemoController.swift in Sources */, + 92BF13322BE405710068422C /* AliasColorTokensDemoController_SwiftUI.swift in Sources */, B4D852DB225C010A004B1B29 /* ButtonDemoController.swift in Sources */, 53097D4127028AEA00A6E4DC /* PopupMenuDemoController.swift in Sources */, 5306075926A1E73F002D49CF /* AvatarGroupDemoController.swift in Sources */, @@ -836,8 +849,9 @@ 497DC2DE24185896008D86F8 /* PillButtonBarDemoController.swift in Sources */, B4EF53C5215C45C400573E8F /* PersonaListViewDemoController.swift in Sources */, A5DCA75E211E3A92005F4CB7 /* DrawerDemoController.swift in Sources */, + 92EFD3E42BDA28F100DB35F2 /* TooltipDemoController_SwiftUI.swift in Sources */, B4414792228F6F740040E88E /* TableViewCellSampleData.swift in Sources */, - 92B45E4E279A1A0B00E72517 /* DemoAppearanceController.swift in Sources */, + 92B45E4E279A1A0B00E72517 /* DemoAppearanceControlView.swift in Sources */, E6842974247B672000A29C40 /* SceneDelegate.swift in Sources */, EC24DBC628B97EB70026EF92 /* PopupMenuObjCDemoController.m in Sources */, 53097D3C27028AD000A6E4DC /* HUDDemoController.swift in Sources */, @@ -849,7 +863,6 @@ 2F0A96FC25CA047100EF9736 /* SearchBarDemoController.swift in Sources */, F362C8082A780EA500BB32BB /* ListItemDemoController_SwiftUI.swift in Sources */, CCC18C2F2501C75F00BE830E /* CardViewDemoController.swift in Sources */, - 928C00B12B8920E60023ECE7 /* View+Extensions.swift in Sources */, F30B74362A7DB168000F63A0 /* ListActionItemDemoController.swift in Sources */, B4575C5122FB8B6900EBD0EB /* PeoplePickerDemoController.swift in Sources */, 92D5FDFD28AC57650087894B /* TypographyTokensDemoController.swift in Sources */, @@ -860,8 +873,9 @@ B498141621E42C140077B48D /* TableViewCellDemoController.swift in Sources */, ECA9D48A2979F5370048ADEC /* TextFieldDemoController.swift in Sources */, FDCF7C8321BF35680058E9E6 /* SegmentedControlDemoController.swift in Sources */, - 92DD1E8D279F496300FDEE0F /* DemoAppearanceView.swift in Sources */, + 92DD1E8D279F496300FDEE0F /* DemoAppearanceMenu.swift in Sources */, 53097D4027028AE500A6E4DC /* PersonaButtonCarouselDemoController.swift in Sources */, + 92C55CB72BEAA94500E0AB8D /* AvatarGroupDemoController_SwiftUI.swift in Sources */, C0938E4A235F733100256251 /* ShimmerLinesViewDemoController.swift in Sources */, EC1C31752923032000CF052C /* ColoredPillBackgroundView.swift in Sources */, 80AECC0C2630F1BB005AF2F3 /* BottomCommandingDemoController.swift in Sources */, @@ -1074,7 +1088,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SWIFT_ACTIVE_COMPILATION_CONDITIONS = DOGFOOD; @@ -1093,7 +1107,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; BUNDLE_NAME = FluentUI; CLANG_ENABLE_MODULES = YES; - CODE_SIGN_IDENTITY = "iPhone Distribution"; + CODE_SIGN_IDENTITY = "iPhone Developer"; CODE_SIGN_STYLE = Manual; DEVELOPMENT_TEAM = 9KBH5RKYEW; INFOPLIST_FILE = FluentUI.Demo/Info.plist; @@ -1174,7 +1188,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -1234,7 +1248,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SWIFT_COMPILATION_MODE = wholemodule; @@ -1369,6 +1383,10 @@ package = 8F0B81102670200300463726 /* XCRemoteSwiftPackageReference "appcenter-sdk-apple" */; productName = AppCenterCrashes; }; + 9246B7062C628CF6004A4440 /* FluentUI */ = { + isa = XCSwiftPackageProductDependency; + productName = FluentUI; + }; /* End XCSwiftPackageProductDependency section */ }; rootObject = A5CEC20420E436F10016922A /* Project object */; diff --git a/ios/FluentUI.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Demos/FluentUIDemo_iOS/FluentUI.Demo.xcodeproj/project.xcworkspace/contents.xcworkspacedata similarity index 71% rename from ios/FluentUI.xcodeproj/project.xcworkspace/contents.xcworkspacedata rename to Demos/FluentUIDemo_iOS/FluentUI.Demo.xcodeproj/project.xcworkspace/contents.xcworkspacedata index e51b5eb371..919434a625 100644 --- a/ios/FluentUI.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ b/Demos/FluentUIDemo_iOS/FluentUI.Demo.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -2,6 +2,6 @@ + location = "self:"> diff --git a/ios/FluentUI.Demo/FluentUI.Demo.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Demos/FluentUIDemo_iOS/FluentUI.Demo.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist rename to Demos/FluentUIDemo_iOS/FluentUI.Demo.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist diff --git a/ios/FluentUI.xcworkspace/xcshareddata/swiftpm/Package.resolved b/Demos/FluentUIDemo_iOS/FluentUI.Demo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved similarity index 58% rename from ios/FluentUI.xcworkspace/xcshareddata/swiftpm/Package.resolved rename to Demos/FluentUIDemo_iOS/FluentUI.Demo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index 8626e44a20..6a8198ff69 100644 --- a/ios/FluentUI.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/Demos/FluentUIDemo_iOS/FluentUI.Demo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -1,12 +1,13 @@ { + "originHash" : "9368007d7da5b3af9332e1d38cf6cc8e8eaa8ccb8923fbd5137a6b91bf39293b", "pins" : [ { "identity" : "appcenter-sdk-apple", "kind" : "remoteSourceControl", "location" : "https://github.com/microsoft/appcenter-sdk-apple.git", "state" : { - "revision" : "5756ddb0f09041e91bdb3b73c17296ac005ad11a", - "version" : "5.0.3" + "revision" : "ab54f758243f282d290b33027e8aac910d3d859a", + "version" : "5.0.5" } }, { @@ -14,10 +15,10 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/microsoft/PLCrashReporter.git", "state" : { - "revision" : "1aed8f7dc79ce8e674c61e430ef51ca3db18cea9", - "version" : "1.11.1" + "revision" : "6752f71de206f6a53fa6a758c3660fd9a7fe7527", + "version" : "1.11.2" } } ], - "version" : 2 + "version" : 3 } diff --git a/ios/FluentUI.Demo/FluentUI.Demo.xcodeproj/xcshareddata/xcschemes/Demo.Development.xcscheme b/Demos/FluentUIDemo_iOS/FluentUI.Demo.xcodeproj/xcshareddata/xcschemes/Demo.Development.xcscheme similarity index 91% rename from ios/FluentUI.Demo/FluentUI.Demo.xcodeproj/xcshareddata/xcschemes/Demo.Development.xcscheme rename to Demos/FluentUIDemo_iOS/FluentUI.Demo.xcodeproj/xcshareddata/xcschemes/Demo.Development.xcscheme index f96b3e43db..b671ada739 100644 --- a/ios/FluentUI.Demo/FluentUI.Demo.xcodeproj/xcshareddata/xcschemes/Demo.Development.xcscheme +++ b/Demos/FluentUIDemo_iOS/FluentUI.Demo.xcodeproj/xcshareddata/xcschemes/Demo.Development.xcscheme @@ -28,10 +28,10 @@ buildForAnalyzing = "YES"> + BlueprintIdentifier = "FluentUI_iOS_Tests" + BuildableName = "FluentUI_iOS_Tests" + BlueprintName = "FluentUI_iOS_Tests" + ReferencedContainer = "container:../../.."> @@ -68,20 +68,20 @@ skipped = "NO"> + BlueprintIdentifier = "3A83F7BE295110FF00EF6629" + BuildableName = "FluentUIDemoTests.xctest" + BlueprintName = "FluentUIDemoTests" + ReferencedContainer = "container:FluentUI.Demo.xcodeproj"> + BlueprintIdentifier = "FluentUI_iOS_Tests" + BuildableName = "FluentUI_iOS_Tests" + BlueprintName = "FluentUI_iOS_Tests" + ReferencedContainer = "container:../../.."> diff --git a/ios/FluentUI.Demo/FluentUI.Demo.xcodeproj/xcshareddata/xcschemes/Demo.Dogfood.xcscheme b/Demos/FluentUIDemo_iOS/FluentUI.Demo.xcodeproj/xcshareddata/xcschemes/Demo.Dogfood.xcscheme similarity index 86% rename from ios/FluentUI.Demo/FluentUI.Demo.xcodeproj/xcshareddata/xcschemes/Demo.Dogfood.xcscheme rename to Demos/FluentUIDemo_iOS/FluentUI.Demo.xcodeproj/xcshareddata/xcschemes/Demo.Dogfood.xcscheme index dd169699ec..b9ca00cf75 100644 --- a/ios/FluentUI.Demo/FluentUI.Demo.xcodeproj/xcshareddata/xcschemes/Demo.Dogfood.xcscheme +++ b/Demos/FluentUIDemo_iOS/FluentUI.Demo.xcodeproj/xcshareddata/xcschemes/Demo.Dogfood.xcscheme @@ -20,20 +20,6 @@ ReferencedContainer = "container:FluentUI.Demo.xcodeproj"> - - - - - - - - - - - - diff --git a/ios/FluentUI.Demo/FluentUI.Demo/AppDelegate.swift b/Demos/FluentUIDemo_iOS/FluentUI.Demo/AppDelegate.swift similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/AppDelegate.swift rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/AppDelegate.swift diff --git a/ios/FluentUI.Demo/FluentUI.Demo/BrandedSwitch.swift b/Demos/FluentUIDemo_iOS/FluentUI.Demo/BrandedSwitch.swift similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/BrandedSwitch.swift rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/BrandedSwitch.swift diff --git a/ios/FluentUI.Demo/FluentUI.Demo/ColoredPillBackgroundView.swift b/Demos/FluentUIDemo_iOS/FluentUI.Demo/ColoredPillBackgroundView.swift similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/ColoredPillBackgroundView.swift rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/ColoredPillBackgroundView.swift diff --git a/ios/FluentUI.Demo/FluentUI.Demo/DemoAppearanceController.swift b/Demos/FluentUIDemo_iOS/FluentUI.Demo/DemoAppearanceControlView.swift similarity index 64% rename from ios/FluentUI.Demo/FluentUI.Demo/DemoAppearanceController.swift rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/DemoAppearanceControlView.swift index 7eb46b4aa6..b226a0e44f 100644 --- a/ios/FluentUI.Demo/FluentUI.Demo/DemoAppearanceController.swift +++ b/Demos/FluentUIDemo_iOS/FluentUI.Demo/DemoAppearanceControlView.swift @@ -7,7 +7,7 @@ import FluentUI import SwiftUI import UIKit -/// Callbacks for changes to a `DemoAppearanceView` via the `DemoAppearanceController`. This delegate should +/// Callbacks for changes to a `DemoAppearanceMenu` via the `DemoAppearanceControlView`. This delegate should /// ensure that the appropriate token overrides are set when these callbacks are received. @objc(MSFDemoAppearanceDelegate) protocol DemoAppearanceDelegate: NSObjectProtocol { @@ -34,38 +34,20 @@ protocol DemoAppearanceDelegate: NSObjectProtocol { @objc func isThemeWideOverrideApplied() -> Bool } -@objc(MSFDemoAppearanceControllerWrapper) -class DemoAppearanceControllerWrapper: NSObject { - /// Convenience wrapper to allow creation of a `DemoAppearanceController` from Objective-C. - /// - /// The class itself cannot be represented via `@objc` because it inherits from `UIHostingController`, which is a Swift-only class. - /// This workaround allows us to create one anyway, though it will be type-erased to `UIViewController` in the process. - /// - /// - Parameter delegate: An optional `DemoAppearanceDelegate` for the created `DemoAppearanceController`. - /// - /// - Returns: A new `DemoAppearanceController`, type-erased to `UIViewController`. - @available(swift, obsoleted: 1.0, message: "This method exists for Objective-C backwards compatibility and should not be invoked from Swift. Please create a `DemoAppearanceController` instance directly.") - @objc static func createDemoAppearanceController(delegate: DemoAppearanceDelegate?) -> UIViewController { - return DemoAppearanceController(delegate: delegate) - } -} - -/// Wrapper class to allow presenting of `DemoAppearanceView` from a UIKit host. -class DemoAppearanceController: UIHostingController, ObservableObject { +/// Wrapper class to allow presenting of `DemoAppearanceMenu` from a UIKit host. +@objc(MSFDemoAppearanceControlView) +class DemoAppearanceControlView: FluentUI.ControlHostingView, ObservableObject { + @objc(initWithDelegate:) init(delegate: DemoAppearanceDelegate?) { - let configuration = DemoAppearanceView.Configuration(delegate: delegate) + let configuration = DemoAppearanceMenu.Configuration(delegate: delegate) self.configuration = configuration - super.init(rootView: DemoAppearanceView(configuration: configuration)) + super.init(AnyView(DemoAppearanceMenu(configuration: configuration))) configuration.onWindowThemeChanged = self.onWindowThemeChanged(_:) configuration.onAppWideThemeChanged = self.onAppWideThemeChanged(_:) configuration.onUserInterfaceStyleChanged = self.onUserInterfaceStyleChanged(_:) - self.modalPresentationStyle = .popover - self.preferredContentSize.height = 400 - self.popoverPresentationController?.permittedArrowDirections = .up - // Different themes can have different overrides, so update our state when we detect a theme change. self.themeObserver = NotificationCenter.default.addObserver(forName: .didChangeTheme, object: nil, queue: nil) { [weak self] _ in DispatchQueue.main.async { @@ -78,23 +60,20 @@ class DemoAppearanceController: UIHostingController, Observa preconditionFailure("init(coder:) has not been implemented") } - override func viewDidAppear(_ animated: Bool) { - super.viewDidAppear(animated) - updateToggleConfiguration() - configuration.isConfigured = true + @MainActor required dynamic init(rootView: AnyView) { + preconditionFailure("init(rootView:) has not been implemented") } - override func willMove(toParent parent: UIViewController?) { - guard let parent, - let window = parent.view.window else { - return - } - - rootView.fluentTheme = window.fluentTheme + override func didMoveToWindow() { + super.didMoveToWindow() + updateToggleConfiguration() } private func updateToggleConfiguration() { - configuration.userInterfaceStyle = view.window?.overrideUserInterfaceStyle ?? .unspecified + guard let window else { + return + } + configuration.userInterfaceStyle = window.overrideUserInterfaceStyle configuration.windowTheme = currentDemoListViewController?.theme ?? .default configuration.appWideTheme = DemoColorTheme.currentAppWideTheme if let isThemeOverrideEnabled = configuration.themeOverridePreviouslyApplied { @@ -106,12 +85,10 @@ class DemoAppearanceController: UIHostingController, Observa /// Callback for handling per-window theme changes. private func onWindowThemeChanged(_ theme: DemoColorTheme) { guard let currentDemoListViewController = currentDemoListViewController, - let window = view.window else { - return - } + let window else { + return + } currentDemoListViewController.updateColorProviderFor(window: window, theme: theme) - - rootView.fluentTheme = window.fluentTheme } /// Callback for handling app-wide theme changes @@ -121,23 +98,23 @@ class DemoAppearanceController: UIHostingController, Observa /// Callback for handling color scheme changes. private func onUserInterfaceStyleChanged(_ userInterfaceStyle: UIUserInterfaceStyle) { - view.window?.overrideUserInterfaceStyle = userInterfaceStyle + window?.overrideUserInterfaceStyle = userInterfaceStyle } private var currentDemoListViewController: DemoListViewController? { - guard let navigationController = view.window?.rootViewController as? UINavigationController, + guard let navigationController = window?.rootViewController as? UINavigationController, let currentDemoListViewController = navigationController.viewControllers.first as? DemoListViewController else { return nil } return currentDemoListViewController } - private var configuration: DemoAppearanceView.Configuration + private var configuration: DemoAppearanceMenu.Configuration private var themeObserver: NSObjectProtocol? } -extension DemoAppearanceView.Configuration { - /// Allows `DemoAppearanceView.Configuration` to be initialized with an optional instance of `DemoAppearanceDelegate`. +extension DemoAppearanceMenu.Configuration { + /// Allows `DemoAppearanceMenu.Configuration` to be initialized with an optional instance of `DemoAppearanceDelegate`. convenience init(delegate: DemoAppearanceDelegate?) { self.init() @@ -150,7 +127,7 @@ extension DemoAppearanceView.Configuration { self.onThemeWideOverrideChanged = { [weak delegate] isOverrideEnabled in delegate?.themeWideOverrideDidChange(isOverrideEnabled: isOverrideEnabled) } - self.onPerControlOverrideChanged = { [weak delegate]isOverrideEnabled in + self.onPerControlOverrideChanged = { [weak delegate] isOverrideEnabled in delegate?.perControlOverrideDidChange(isOverrideEnabled: isOverrideEnabled) } self.themeOverridePreviouslyApplied = { [weak delegate] in diff --git a/Demos/FluentUIDemo_iOS/FluentUI.Demo/DemoAppearanceMenu.swift b/Demos/FluentUIDemo_iOS/FluentUI.Demo/DemoAppearanceMenu.swift new file mode 100644 index 0000000000..e1244b763b --- /dev/null +++ b/Demos/FluentUIDemo_iOS/FluentUI.Demo/DemoAppearanceMenu.swift @@ -0,0 +1,126 @@ +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// + +import FluentUI +import SwiftUI + +/// This class displays the contents of the DemoAppearance `Menu`. All actions are callback-based, allowing a +/// wrapping component, `DemoAppearanceControlView`, to manage interop with our UIKit environment. +struct DemoAppearanceMenu: View { + + @Environment(\.colorScheme) var systemColorScheme: ColorScheme + @ObservedObject var configuration: Configuration + @State var showingThemeWideAlert: Bool = false + + /// Picker for setting the app's color scheme. + @ViewBuilder + var appColorSchemePicker: some View { + Picker("Color Scheme", systemImage: "cloud.rainbow.half", selection: $configuration.userInterfaceStyle) { + Label("System", systemImage: "circle.lefthalf.filled").tag(UIUserInterfaceStyle.unspecified) + Label("Light", systemImage: "sun.max").tag(UIUserInterfaceStyle.light) + Label("Dark", systemImage: "moon.stars").tag(UIUserInterfaceStyle.dark) + } + .pickerStyle(.menu) + } + + /// Picker for setting the current Fluent theme. + @ViewBuilder + func themePicker(_ titleKey: String, systemImage: String, selection: Binding) -> some View { + Picker(titleKey, systemImage: systemImage, selection: selection) { + Text("\(DemoColorTheme.default.name)").tag(DemoColorTheme.default) + Text("\(DemoColorTheme.green.name)").tag(DemoColorTheme.green) + Text("\(DemoColorTheme.purple.name)").tag(DemoColorTheme.purple) + } + .pickerStyle(.menu) + } + + /// Collects the various pickers and toggles together. + @ViewBuilder + var contents: some View { + Section { + appColorSchemePicker + themePicker("Window Theme", systemImage: "macwindow", selection: $configuration.windowTheme) + themePicker("App-Wide Theme", systemImage: "app.gift", selection: $configuration.appWideTheme) + } + + if showThemeWideOverrideToggle || showPerControlOverrideToggle { + Section("Control Tokens") { + // Theme-wide override toggle + if showThemeWideOverrideToggle { + Toggle("Theme-wide override", systemImage: "swatchpalette", isOn: $configuration.themeWideOverride) + } + + // Per-control override toggle + if showPerControlOverrideToggle { + Toggle("Per-control override", systemImage: "switch.2", isOn: $configuration.perControlOverride) + } + } + } + } + + var body: some View { + Menu(content: { + contents + }, label: { + Image(systemName: "gearshape") + }) + + // Changes + .onChange_iOS17(of: configuration.userInterfaceStyle) { newValue in + configuration.onUserInterfaceStyleChanged?(newValue) + } + .onChange_iOS17(of: configuration.windowTheme) { newValue in + configuration.onWindowThemeChanged?(newValue) + } + .onChange_iOS17(of: configuration.appWideTheme) { newValue in + configuration.onAppWideThemeChanged?(newValue) + } + .onChange_iOS17(of: configuration.themeWideOverride) { newValue in + configuration.onThemeWideOverrideChanged?(newValue) + + // TODO: Still working through some issues with the theme-wide override tokens, so inform the user how to make it visible for now. + showingThemeWideAlert = true + } + .onChange_iOS17(of: configuration.perControlOverride) { newValue in + configuration.onPerControlOverrideChanged?(newValue) + } + + // TODO: Still working through some issues with the theme-wide override tokens, so inform the user how to make it visible for now. + .alert(isPresented: $showingThemeWideAlert) { + Alert(title: Text("Theme-wide override"), + message: Text("Changes to \"Theme-wide override\" tokens will only take effect when the control redraws for some othe reason.\n\nTry backing out of this view and re-entering it.")) + } + } + + /// Container class for data and control-specific callbacks. + class Configuration: ObservableObject { + // Data + @Published var userInterfaceStyle: UIUserInterfaceStyle = .unspecified + @Published var windowTheme: DemoColorTheme = .default + @Published var appWideTheme: DemoColorTheme = .default + @Published var themeWideOverride: Bool = false + @Published var perControlOverride: Bool = false + + // Global callbacks + var onAppWideThemeChanged: ((_ theme: DemoColorTheme) -> Void)? + + // Window-specific callbacks + var onUserInterfaceStyleChanged: ((_ userInterfaceStyle: UIUserInterfaceStyle) -> Void)? + var onWindowThemeChanged: ((_ theme: DemoColorTheme) -> Void)? + + // Control-specific callbacks + var onThemeWideOverrideChanged: ((_ themeWideOverrideEnabled: Bool) -> Void)? + var onPerControlOverrideChanged: ((_ perControlOverrideEnabled: Bool) -> Void)? + var themeOverridePreviouslyApplied: (() -> Bool)? + } + + private var showThemeWideOverrideToggle: Bool { + return configuration.onThemeWideOverrideChanged != nil && configuration.themeOverridePreviouslyApplied != nil + } + + private var showPerControlOverrideToggle: Bool { + return configuration.onPerControlOverrideChanged != nil + } +} diff --git a/ios/FluentUI.Demo/FluentUI.Demo/DemoColorThemes.swift b/Demos/FluentUIDemo_iOS/FluentUI.Demo/DemoColorThemes.swift similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/DemoColorThemes.swift rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/DemoColorThemes.swift diff --git a/ios/FluentUI.Demo/FluentUI.Demo/DemoController.swift b/Demos/FluentUIDemo_iOS/FluentUI.Demo/DemoController.swift similarity index 83% rename from ios/FluentUI.Demo/FluentUI.Demo/DemoController.swift rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/DemoController.swift index 40dd820abf..7afe9bbafc 100644 --- a/ios/FluentUI.Demo/FluentUI.Demo/DemoController.swift +++ b/Demos/FluentUIDemo_iOS/FluentUI.Demo/DemoController.swift @@ -153,20 +153,17 @@ class DemoController: UIViewController { // disable it for all DemoController subclasses. self.navigationItem.largeTitleDisplayMode = .never - configureAppearanceAndReadmePopovers() + configureBarButtonItems() } // MARK: - Demo Appearance Popover - func configureAppearanceAndReadmePopovers() { - let settingsButton = UIBarButtonItem(image: UIImage(named: "ic_fluent_settings_24_regular"), - style: .plain, - target: self, - action: #selector(showAppearancePopover(_:))) + func configureBarButtonItems() { + let settingsButton = UIBarButtonItem(customView: appearanceControlView) let readmeButton = UIBarButtonItem(image: UIImage(systemName: "info.circle.fill"), style: .plain, target: self, - action: #selector(showReadmePopover)) + action: #selector(showReadmePopover(_:))) navigationItem.rightBarButtonItems = [readmeButton, settingsButton] } @@ -176,25 +173,10 @@ class DemoController: UIViewController { self.present(readmeViewController, animated: true, completion: nil) } - @objc func showAppearancePopover(_ sender: AnyObject, presenter: UIViewController) { - if let barButtonItem = sender as? UIBarButtonItem { - appearanceController.popoverPresentationController?.barButtonItem = barButtonItem - } else if let sourceView = sender as? UIView { - appearanceController.popoverPresentationController?.sourceView = sourceView - appearanceController.popoverPresentationController?.sourceRect = sourceView.bounds - } - appearanceController.popoverPresentationController?.delegate = self - presenter.present(appearanceController, animated: true, completion: nil) - } - - @objc func showAppearancePopover(_ sender: AnyObject) { - showAppearancePopover(sender, presenter: self) - } - var readmeString: String? - private lazy var appearanceController: DemoAppearanceController = .init(delegate: self as? DemoAppearanceDelegate) - private lazy var readmeViewController: ReadmeViewController = .init(readmeString: readmeString) + lazy var appearanceControlView: DemoAppearanceControlView = .init(delegate: self as? DemoAppearanceDelegate) + lazy var readmeViewController: ReadmeViewController = .init(readmeString: readmeString) } extension DemoController: UIPopoverPresentationControllerDelegate { diff --git a/Demos/FluentUIDemo_iOS/FluentUI.Demo/DemoHostingController.swift b/Demos/FluentUIDemo_iOS/FluentUI.Demo/DemoHostingController.swift new file mode 100644 index 0000000000..bdb8d47274 --- /dev/null +++ b/Demos/FluentUIDemo_iOS/FluentUI.Demo/DemoHostingController.swift @@ -0,0 +1,57 @@ +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// + +import SwiftUI +import FluentUI + +/// A specialized subclass of `FluentThemedHostingController` that can be used for SwiftUI demo screens. +class DemoHostingController: FluentThemedHostingController { + init(rootView: AnyView, title: String, readmeText: String? = nil) { + super.init(rootView: rootView) + self.title = title + } + + @objc required dynamic init?(coder aDecoder: NSCoder) { + preconditionFailure("init(coder:) has not been implemented") + } + + @MainActor required dynamic init(rootView: AnyView) { + super.init(rootView: rootView) + } + + override func viewDidLoad() { + super.viewDidLoad() + configureBarButtonItems() + } + + // MARK: - Demo Appearance Popover + + func configureBarButtonItems() { + let settingsButton = UIBarButtonItem(customView: appearanceControlView) + let readmeButton = UIBarButtonItem(image: UIImage(systemName: "info.circle.fill"), + style: .plain, + target: self, + action: #selector(showReadmePopover(_:))) + navigationItem.rightBarButtonItems = [readmeButton, settingsButton] + } + + @objc func showReadmePopover(_ sender: UIBarButtonItem) { + readmeViewController.popoverPresentationController?.barButtonItem = sender + readmeViewController.popoverPresentationController?.delegate = self + self.present(readmeViewController, animated: true, completion: nil) + } + + private var readmeText: String? + + private lazy var appearanceControlView: DemoAppearanceControlView = .init(delegate: self as? DemoAppearanceDelegate) + private lazy var readmeViewController: ReadmeViewController = .init(readmeString: readmeText) +} + +extension DemoHostingController: UIPopoverPresentationControllerDelegate { + /// Overridden to allow for popover-style modal presentation on compact (e.g. iPhone) devices. + func adaptivePresentationStyle(for controller: UIPresentationController) -> UIModalPresentationStyle { + return .none + } +} diff --git a/ios/FluentUI.Demo/FluentUI.Demo/DemoListViewController.swift b/Demos/FluentUIDemo_iOS/FluentUI.Demo/DemoListViewController.swift similarity index 96% rename from ios/FluentUI.Demo/FluentUI.Demo/DemoListViewController.swift rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/DemoListViewController.swift index 9a248a2643..dd07ec89b5 100644 --- a/ios/FluentUI.Demo/FluentUI.Demo/DemoListViewController.swift +++ b/Demos/FluentUIDemo_iOS/FluentUI.Demo/DemoListViewController.swift @@ -32,7 +32,7 @@ class DemoListViewController: DemoTableViewController { if let provider = self.provider { window.setColorProvider(provider) let fluentTheme = self.view.fluentTheme - let primaryColor = fluentTheme.color(.brandBackground1) + let primaryColor: UIColor = fluentTheme.color(.brandBackground1) FluentUIFramework.initializeAppearance(with: primaryColor, whenContainedInInstancesOf: [type(of: window)]) } else { window.resetFluentTheme() @@ -48,9 +48,7 @@ class DemoListViewController: DemoTableViewController { guard let appName = bundle.object(forInfoDictionaryKey: "CFBundleName") as? String else { preconditionFailure("CFBundleName is nil") } - guard let libraryVersion = FluentUIFramework.resourceBundle.object(forInfoDictionaryKey: "CFBundleShortVersionString") as? String else { - preconditionFailure("CFBundleShortVersionString is nil") - } + let libraryVersion = FluentUIFramework.fluentVersion navigationItem.title = appName navigationItem.largeTitleDisplayMode = .always navigationItem.backButtonDisplayMode = .minimal diff --git a/ios/FluentUI.Demo/FluentUI.Demo/DemoTableViewController.swift b/Demos/FluentUIDemo_iOS/FluentUI.Demo/DemoTableViewController.swift similarity index 72% rename from ios/FluentUI.Demo/FluentUI.Demo/DemoTableViewController.swift rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/DemoTableViewController.swift index 02551fd6f7..bd74318094 100644 --- a/ios/FluentUI.Demo/FluentUI.Demo/DemoTableViewController.swift +++ b/Demos/FluentUIDemo_iOS/FluentUI.Demo/DemoTableViewController.swift @@ -25,7 +25,7 @@ class DemoTableViewController: UITableViewController { tableView.backgroundColor = TableViewCell.tableBackgroundGroupedColor tableView.separatorStyle = .none - configureAppearancePopover() + configureBarButtonItems() } func showMessage(_ message: String, autoDismiss: Bool = true, completion: (() -> Void)? = nil) { @@ -46,27 +46,18 @@ class DemoTableViewController: UITableViewController { } } - // MARK: - Demo Appearance Popover + // MARK: - Demo Appearance - func configureAppearancePopover() { - // Display the DemoAppearancePopover button - let settingsButton = UIBarButtonItem(image: UIImage(named: "ic_fluent_settings_24_regular"), - style: .plain, - target: self, - action: #selector(showAppearancePopover)) + func configureBarButtonItems() { + // Display the DemoAppearance and Readme buttons + let settingsButton = UIBarButtonItem(customView: appearanceControlView) let readmeButton = UIBarButtonItem(image: UIImage(systemName: "info.circle.fill"), style: .plain, target: self, - action: #selector(showReadmePopover)) + action: #selector(showReadmePopover(_:))) navigationItem.rightBarButtonItems = [readmeButton, settingsButton] } - @objc func showAppearancePopover(_ sender: UIBarButtonItem) { - appearanceController.popoverPresentationController?.barButtonItem = sender - appearanceController.popoverPresentationController?.delegate = self - self.present(appearanceController, animated: true, completion: nil) - } - @objc func showReadmePopover(_ sender: UIBarButtonItem) { readmeViewController.popoverPresentationController?.barButtonItem = sender readmeViewController.popoverPresentationController?.delegate = self @@ -75,7 +66,7 @@ class DemoTableViewController: UITableViewController { var readmeString: String? - private lazy var appearanceController: DemoAppearanceController = .init(delegate: self as? DemoAppearanceDelegate) + private lazy var appearanceControlView: DemoAppearanceControlView = .init(delegate: self as? DemoAppearanceDelegate) private lazy var readmeViewController: ReadmeViewController = .init(readmeString: readmeString) } diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Demos.swift b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos.swift similarity index 99% rename from ios/FluentUI.Demo/FluentUI.Demo/Demos.swift rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos.swift index 04244b2d6d..5dacf2443a 100644 --- a/ios/FluentUI.Demo/FluentUI.Demo/Demos.swift +++ b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos.swift @@ -36,7 +36,7 @@ struct Demos { DemoDescriptor("IndeterminateProgressBar", IndeterminateProgressBarDemoController.self, supportsVisionOS: false), DemoDescriptor("Label", LabelDemoController.self, supportsVisionOS: true), DemoDescriptor("ListActionItem", ListActionItemDemoController.self, supportsVisionOS: false), - DemoDescriptor("ListItem", ListItemDemoController.self, supportsVisionOS: false), + DemoDescriptor("ListItem", ListItemDemoController.self, supportsVisionOS: true), DemoDescriptor("MultilineCommandBar", MultilineCommandBarDemoController.self, supportsVisionOS: false), DemoDescriptor("NavigationController", NavigationControllerDemoController.self, supportsVisionOS: true), DemoDescriptor("NotificationView", NotificationViewDemoController.self, supportsVisionOS: true), @@ -54,7 +54,7 @@ struct Demos { DemoDescriptor("TableViewCell", TableViewCellDemoController.self, supportsVisionOS: true), DemoDescriptor("TableViewHeaderFooterView", TableViewHeaderFooterViewDemoController.self, supportsVisionOS: true), DemoDescriptor("Text Field", TextFieldDemoController.self, supportsVisionOS: false), - DemoDescriptor("Tooltip", TooltipDemoController.self, supportsVisionOS: false), + DemoDescriptor("Tooltip", TooltipDemoController.self, supportsVisionOS: true), DemoDescriptor("TwoLineTitleView", TwoLineTitleViewDemoController.self, supportsVisionOS: false) ] diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Demos/ActivityIndicatorDemoController.swift b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/ActivityIndicatorDemoController.swift similarity index 94% rename from ios/FluentUI.Demo/FluentUI.Demo/Demos/ActivityIndicatorDemoController.swift rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/ActivityIndicatorDemoController.swift index d7e625c36d..8f59c7b5e8 100644 --- a/ios/FluentUI.Demo/FluentUI.Demo/Demos/ActivityIndicatorDemoController.swift +++ b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/ActivityIndicatorDemoController.swift @@ -47,15 +47,16 @@ class ActivityIndicatorDemoController: DemoTableViewController { self?.shouldHideWhenStopped = cell?.isOn ?? true } return cell - case .startStopActivity: - guard let cell = tableView.dequeueReusableCell(withIdentifier: ActionsCell.identifier) as? ActionsCell else { + case .isAnimating: + guard let cell = tableView.dequeueReusableCell(withIdentifier: BooleanCell.identifier) as? BooleanCell else { return UITableViewCell() } - cell.setup(action1Title: row.title) - cell.action1Button.addTarget(self, - action: #selector(startStopActivity), - for: .touchUpInside) + cell.setup(title: row.title, isOn: self.isAnimating) + cell.titleNumberOfLines = 0 + cell.onValueChanged = { [weak self, weak cell] in + self?.isAnimating = cell?.isOn ?? true + } cell.bottomSeparatorType = .full return cell case .swiftUIDemo: @@ -181,7 +182,7 @@ class ActivityIndicatorDemoController: DemoTableViewController { private enum ActivityIndicatorDemoRow: CaseIterable { case swiftUIDemo case hidesWhenStopped - case startStopActivity + case isAnimating case demoOfSize var title: String { @@ -190,8 +191,8 @@ class ActivityIndicatorDemoController: DemoTableViewController { return "SwiftUI Demo" case .hidesWhenStopped: return "Hides when stopped" - case .startStopActivity: - return "Start / Stop activity" + case .isAnimating: + return "Animating" case .demoOfSize: return "" } @@ -222,7 +223,7 @@ class ActivityIndicatorDemoController: DemoTableViewController { case .swiftUI: return [.swiftUIDemo] case .settings: - return [.hidesWhenStopped, .startStopActivity] + return [.hidesWhenStopped, .isAnimating] case .defaultColor, .customColor: return [ActivityIndicatorDemoRow](repeating: .demoOfSize, count: MSFActivityIndicatorSize.allCases.count) @@ -232,10 +233,6 @@ class ActivityIndicatorDemoController: DemoTableViewController { } private let xLargeSize: CGFloat = 36 - - @objc private func startStopActivity() { - isAnimating.toggle() - } } extension MSFActivityIndicatorSize { diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Demos/ActivityIndicatorDemoController_SwiftUI.swift b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/ActivityIndicatorDemoController_SwiftUI.swift similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Demos/ActivityIndicatorDemoController_SwiftUI.swift rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/ActivityIndicatorDemoController_SwiftUI.swift diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Demos/AliasColorTokensDemoController.swift b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/AliasColorTokensDemoController.swift similarity index 92% rename from ios/FluentUI.Demo/FluentUI.Demo/Demos/AliasColorTokensDemoController.swift rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/AliasColorTokensDemoController.swift index b4225b684f..9ddead1b94 100644 --- a/ios/FluentUI.Demo/FluentUI.Demo/Demos/AliasColorTokensDemoController.swift +++ b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/AliasColorTokensDemoController.swift @@ -11,6 +11,7 @@ class AliasColorTokensDemoController: DemoTableViewController { override func viewDidLoad() { super.viewDidLoad() tableView.register(UITableViewCell.self, forCellReuseIdentifier: TableViewCell.identifier) + tableView.register(ActionsCell.self, forCellReuseIdentifier: ActionsCell.identifier) } override func numberOfSections(in tableView: UITableView) -> Int { @@ -22,14 +23,28 @@ class AliasColorTokensDemoController: DemoTableViewController { } override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + if AliasColorTokensDemoSection.allCases[section] == .swiftUI { + // Special case for the SwiftUI demo dispatch + return 1 + } return AliasColorTokensDemoSection.allCases[section].rows.count } override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { - let cell = tableView.dequeueReusableCell(withIdentifier: TableViewCell.identifier, for: indexPath) let section = AliasColorTokensDemoSection.allCases[indexPath.section] - let row = section.rows[indexPath.row] + if section == .swiftUI { + // Special case! + guard let cell = tableView.dequeueReusableCell(withIdentifier: ActionsCell.identifier, for: indexPath) as? ActionsCell else { + preconditionFailure() + } + cell.setup(action1Title: "Show SwiftUI Demo") + cell.action1Button.addTarget(self, action: #selector(showSwiftUIDemo), for: .touchUpInside) + return cell + } + + let row = section.rows[indexPath.row] + let cell = tableView.dequeueReusableCell(withIdentifier: TableViewCell.identifier, for: indexPath) cell.backgroundConfiguration?.backgroundColor = fluentTheme.color(row) cell.selectionStyle = .none @@ -37,7 +52,7 @@ class AliasColorTokensDemoController: DemoTableViewController { let text = "\(row.text)" contentConfiguration.attributedText = NSAttributedString(string: text, attributes: [ - .foregroundColor: textColor(for: row) + .foregroundColor: row.textColor(fluentTheme) ]) contentConfiguration.textProperties.alignment = .center cell.contentConfiguration = contentConfiguration @@ -45,98 +60,9 @@ class AliasColorTokensDemoController: DemoTableViewController { return cell } - private func textColor(for token: FluentTheme.ColorToken) -> UIColor { - switch token { - case .background1, - .background1Pressed, - .background1Selected, - .background2, - .background2Pressed, - .background2Selected, - .background3, - .background3Pressed, - .background3Selected, - .background4, - .background4Pressed, - .background4Selected, - .background5, - .background5Pressed, - .background5Selected, - .background6, - .backgroundDisabled, - .brandBackgroundDisabled, - .backgroundCanvas, - .stencil1, - .stencil2, - .foregroundDisabled2, - .foregroundOnColor, - .brandForegroundDisabled2, - .stroke1, - .stroke1Pressed, - .stroke2, - .strokeFocus1, - .strokeDisabled, - .brandBackgroundTint, - .foregroundDisabled1, - .dangerBackground1, - .successBackground1, - .warningBackground1, - .severeBackground1: - return fluentTheme.color(.foreground1) - case .foreground1, - .foreground2, - .foreground3, - .strokeFocus2, - .strokeAccessible, - .brandBackground1Pressed, - .brandForeground1Pressed, - .brandStroke1Pressed, - .brandStroke1, - .brandForegroundTint, - .brandStroke1Selected, - .brandGradient1, - .dangerBackground2, - .dangerForeground1, - .dangerForeground2, - .dangerStroke1, - .dangerStroke2, - .successBackground2, - .successForeground1, - .successForeground2, - .successStroke1, - .warningForeground1, - .warningForeground2, - .warningStroke1, - .severeBackground2, - .severeForeground1, - .severeForeground2, - .severeStroke1: - return fluentTheme.color(.foregroundOnColor) - case .foregroundLightStatic, - .backgroundLightStatic, - .backgroundLightStaticDisabled, - .warningBackground2, - .brandGradient2, - .brandGradient3: - return fluentTheme.color(.foregroundDarkStatic) - case .brandForeground1, - .brandForeground1Selected, - .brandForegroundDisabled1, - .backgroundInverted, - .brandBackground1, - .brandBackground1Selected, - .brandBackground2, - .brandBackground2Pressed, - .brandBackground2Selected, - .brandBackground3, - .backgroundDarkStatic, - .foregroundDarkStatic, - .presenceAway, - .presenceDnd, - .presenceAvailable, - .presenceOof: - return fluentTheme.color(.foregroundLightStatic) - } + @objc private func showSwiftUIDemo() { + navigationController?.pushViewController(AliasColorTokensDemoControllerSwiftUI(), + animated: true) } private var fluentTheme: FluentTheme { @@ -144,7 +70,8 @@ class AliasColorTokensDemoController: DemoTableViewController { } } -private enum AliasColorTokensDemoSection: CaseIterable { +enum AliasColorTokensDemoSection: CaseIterable { + case swiftUI case neutralBackgrounds case brandBackgrounds case neutralForegrounds @@ -157,6 +84,8 @@ private enum AliasColorTokensDemoSection: CaseIterable { var title: String { switch self { + case .swiftUI: + return "SwiftUI Demo" case .neutralBackgrounds: return "Neutral Backgrounds" case .brandBackgrounds: @@ -180,6 +109,8 @@ private enum AliasColorTokensDemoSection: CaseIterable { var rows: [FluentTheme.ColorToken] { switch self { + case .swiftUI: + preconditionFailure("Should not fetch colors for SwiftUI section!") case .neutralBackgrounds: return [.background1, .background1Pressed, @@ -278,7 +209,7 @@ private enum AliasColorTokensDemoSection: CaseIterable { } } -private extension FluentTheme.ColorToken { +extension FluentTheme.ColorToken { var text: String { switch self { case .foreground1: @@ -453,4 +384,99 @@ private extension FluentTheme.ColorToken { return "PresenceOof" } } + + func textColor(_ fluentTheme: FluentTheme) -> UIColor { + switch self { + case .background1, + .background1Pressed, + .background1Selected, + .background2, + .background2Pressed, + .background2Selected, + .background3, + .background3Pressed, + .background3Selected, + .background4, + .background4Pressed, + .background4Selected, + .background5, + .background5Pressed, + .background5Selected, + .background6, + .backgroundDisabled, + .brandBackgroundDisabled, + .backgroundCanvas, + .stencil1, + .stencil2, + .foregroundDisabled2, + .foregroundOnColor, + .brandForegroundDisabled2, + .stroke1, + .stroke1Pressed, + .stroke2, + .strokeFocus1, + .strokeDisabled, + .brandBackgroundTint, + .foregroundDisabled1, + .dangerBackground1, + .successBackground1, + .warningBackground1, + .severeBackground1: + return fluentTheme.color(.foreground1) + case .foreground1, + .foreground2, + .foreground3, + .strokeFocus2, + .strokeAccessible, + .brandBackground1Pressed, + .brandForeground1Pressed, + .brandStroke1Pressed, + .brandStroke1, + .brandForegroundTint, + .brandStroke1Selected, + .brandGradient1, + .dangerBackground2, + .dangerForeground1, + .dangerForeground2, + .dangerStroke1, + .dangerStroke2, + .successBackground2, + .successForeground1, + .successForeground2, + .successStroke1, + .warningForeground1, + .warningForeground2, + .warningStroke1, + .severeBackground2, + .severeForeground1, + .severeForeground2, + .severeStroke1: + return fluentTheme.color(.foregroundOnColor) + case .foregroundLightStatic, + .backgroundLightStatic, + .backgroundLightStaticDisabled, + .warningBackground2, + .brandGradient2, + .brandGradient3: + return fluentTheme.color(.foregroundDarkStatic) + case .brandForeground1, + .brandForeground1Selected, + .brandForegroundDisabled1, + .backgroundInverted, + .brandBackground1, + .brandBackground1Selected, + .brandBackground2, + .brandBackground2Pressed, + .brandBackground2Selected, + .brandBackground3, + .backgroundDarkStatic, + .foregroundDarkStatic, + .presenceAway, + .presenceDnd, + .presenceAvailable, + .presenceOof: + return fluentTheme.color(.foregroundLightStatic) + } + } + } diff --git a/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/AliasColorTokensDemoController_SwiftUI.swift b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/AliasColorTokensDemoController_SwiftUI.swift new file mode 100644 index 0000000000..5473c36df9 --- /dev/null +++ b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/AliasColorTokensDemoController_SwiftUI.swift @@ -0,0 +1,50 @@ +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// + +import FluentUI +import SwiftUI +import UIKit + +class AliasColorTokensDemoControllerSwiftUI: DemoHostingController { + init() { + super.init(rootView: AnyView(AliasColorTokensDemoView()), title: "Alias Color Tokens") + } + + @objc required dynamic init?(coder aDecoder: NSCoder) { + preconditionFailure("init(coder:) has not been implemented") + } + + @MainActor required dynamic init(rootView: AnyView) { + preconditionFailure("init(rootView:) has not been implemented") + } +} + +struct AliasColorTokensDemoView: View { + @Environment(\.fluentTheme) var fluentTheme: FluentTheme + + var body: some View { + FluentList { + ForEach(AliasColorTokensDemoSection.allCases, id: \.self) { demoSection in + // No need for SwiftUI section in SwiftUI demo! + if demoSection != .swiftUI { + colorSection(demoSection) + } + } + } + .fluentListStyle(.insetGrouped) + } + + @ViewBuilder + func colorSection(_ demoSection: AliasColorTokensDemoSection) -> some View { + Section(demoSection.title) { + ForEach(demoSection.rows, id: \.self) { colorRow in + Text(colorRow.text) + .frame(maxWidth: .infinity, alignment: .center) + .listRowBackground(fluentTheme.swiftUIColor(colorRow)) + .foregroundStyle(Color(colorRow.textColor(fluentTheme))) + } + } + } +} diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Demos/AvatarDemoController.swift b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/AvatarDemoController.swift similarity index 94% rename from ios/FluentUI.Demo/FluentUI.Demo/Demos/AvatarDemoController.swift rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/AvatarDemoController.swift index 1a762631b2..a749d8a58d 100644 --- a/ios/FluentUI.Demo/FluentUI.Demo/Demos/AvatarDemoController.swift +++ b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/AvatarDemoController.swift @@ -54,7 +54,8 @@ class AvatarDemoController: DemoTableViewController { .presence, .activity, .ringInnerGap, - .transparency: + .backgroundOutline, + .defaultImage: guard let cell = tableView.dequeueReusableCell(withIdentifier: BooleanCell.identifier) as? BooleanCell else { return UITableViewCell() } @@ -276,11 +277,21 @@ class AvatarDemoController: DemoTableViewController { } } - private var isTransparent: Bool = true { + private var hasBackgroundOutline: Bool = false { didSet { - if oldValue != isTransparent { + if oldValue != hasBackgroundOutline { allDemoAvatarsCombined.forEach { avatar in - avatar.state.isTransparent = isTransparent + avatar.state.hasBackgroundOutline = hasBackgroundOutline + } + } + } + } + + private var useCustomDefaultImage: Bool = false { + didSet { + if oldValue != useCustomDefaultImage { + allDemoAvatarsCombined.forEach { avatar in + avatar.state.defaultImage = useCustomDefaultImage ? UIImage(named: "flag-48x48") : nil } } } @@ -395,8 +406,10 @@ class AvatarDemoController: DemoTableViewController { return self.isShowingRings case .ringInnerGap: return self.isShowingRingInnerGap - case .transparency: - return self.isTransparent + case .backgroundOutline: + return self.hasBackgroundOutline + case .defaultImage: + return self.useCustomDefaultImage } } @@ -431,8 +444,10 @@ class AvatarDemoController: DemoTableViewController { self.isShowingRings = isOn case .ringInnerGap: self.isShowingRingInnerGap = isOn - case .transparency: - self.isTransparent = isOn + case .backgroundOutline: + self.hasBackgroundOutline = isOn + case .defaultImage: + self.useCustomDefaultImage = isOn } } @@ -503,13 +518,14 @@ class AvatarDemoController: DemoTableViewController { return [.animating, .alternateBackground, .pointerInteraction, - .transparency, + .backgroundOutline, .presence, .activity, .outOfOffice, .ring, .ringInnerGap, - .imageBasedRingColor] + .imageBasedRingColor, + .defaultImage] case .size72, .size56, .size40, @@ -550,7 +566,8 @@ class AvatarDemoController: DemoTableViewController { case ring case ringInnerGap case swiftUIDemo - case transparency + case backgroundOutline + case defaultImage var isDemoRow: Bool { switch self { @@ -574,7 +591,8 @@ class AvatarDemoController: DemoTableViewController { .ring, .ringInnerGap, .swiftUIDemo, - .transparency: + .backgroundOutline, + .defaultImage: return false } } @@ -602,7 +620,8 @@ class AvatarDemoController: DemoTableViewController { .ring, .ringInnerGap, .swiftUIDemo, - .transparency: + .backgroundOutline, + .defaultImage: return nil } } @@ -632,7 +651,8 @@ class AvatarDemoController: DemoTableViewController { .ring, .ringInnerGap, .swiftUIDemo, - .transparency: + .backgroundOutline, + .defaultImage: return nil } } @@ -664,7 +684,8 @@ class AvatarDemoController: DemoTableViewController { .ring, .ringInnerGap, .swiftUIDemo, - .transparency: + .backgroundOutline, + .defaultImage: preconditionFailure("Row does not have an associated avatar style") } } @@ -709,8 +730,10 @@ class AvatarDemoController: DemoTableViewController { return "Set ring inner gap" case .swiftUIDemo: return "SwiftUI Demo" - case .transparency: - return "Use transparency" + case .backgroundOutline: + return "Use background outline" + case .defaultImage: + return "Use custom default image" } } } diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Demos/AvatarDemoController_SwiftUI.swift b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/AvatarDemoController_SwiftUI.swift similarity index 93% rename from ios/FluentUI.Demo/FluentUI.Demo/Demos/AvatarDemoController_SwiftUI.swift rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/AvatarDemoController_SwiftUI.swift index 4b1946d3fd..18b97f2a7d 100644 --- a/ios/FluentUI.Demo/FluentUI.Demo/Demos/AvatarDemoController_SwiftUI.swift +++ b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/AvatarDemoController_SwiftUI.swift @@ -36,7 +36,7 @@ struct AvatarDemoView: View { @State var isAnimated: Bool = true @State var isOutOfOffice: Bool = false @State var isRingVisible: Bool = true - @State var isTransparent: Bool = true + @State var hasBackgroundOutline: Bool = false @State var hasPointerInteraction: Bool = false @State var hasRingInnerGap: Bool = true @State var primaryText: String = "Kat Larsson" @@ -46,10 +46,19 @@ struct AvatarDemoView: View { @State var showActivityImage: Bool = false @State var showImage: Bool = false @State var showImageBasedRingColor: Bool = false + @State var useCustomDefaultImage: Bool = false @State var size: MSFAvatarSize = .size72 @State var style: MSFAvatarStyle = .default @ObservedObject var fluentTheme: FluentTheme = .shared + var defaultImage: UIImage? { + if useCustomDefaultImage { + return UIImage(named: "flag-48x48") + } else { + return nil + } + } + public var body: some View { VStack { Avatar(style: style, @@ -57,10 +66,11 @@ struct AvatarDemoView: View { image: showImage ? UIImage(named: "avatar_kat_larsson") : nil, primaryText: primaryText, secondaryText: secondaryText) - .isRingVisible(showImageBasedRingColor || isRingVisible) + .isRingVisible(isRingVisible) .hasRingInnerGap(hasRingInnerGap) .imageBasedRingColor(showImageBasedRingColor ? AvatarDemoController.colorfulCustomImage : nil) - .isTransparent(isTransparent) + .defaultImage(defaultImage) + .hasBackgroundOutline(hasBackgroundOutline) .presence(presence) .activity(activityStyle, showActivityImage ? (activityStyle == .circle ? UIImage(named: "thumbs_up_3d_default") : UIImage(named: "excelIcon")) : nil) .isOutOfOffice(isOutOfOffice) @@ -91,9 +101,10 @@ struct AvatarDemoView: View { FluentUIDemoToggle(titleKey: "Set image", isOn: $showImage) FluentUIDemoToggle(titleKey: "Set alternate background", isOn: $useAlternateBackground) - FluentUIDemoToggle(titleKey: "Transparency", isOn: $isTransparent) + FluentUIDemoToggle(titleKey: "Has background border", isOn: $hasBackgroundOutline) FluentUIDemoToggle(titleKey: "iPad Pointer interaction", isOn: $hasPointerInteraction) FluentUIDemoToggle(titleKey: "Animate transitions", isOn: $isAnimated) + FluentUIDemoToggle(titleKey: "Use custom default image", isOn: $useCustomDefaultImage) } Group { diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Demos/AvatarGroupDemoController.swift b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/AvatarGroupDemoController.swift similarity index 85% rename from ios/FluentUI.Demo/FluentUI.Demo/Demos/AvatarGroupDemoController.swift rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/AvatarGroupDemoController.swift index 280e513828..d68d5f71ea 100644 --- a/ios/FluentUI.Demo/FluentUI.Demo/Demos/AvatarGroupDemoController.swift +++ b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/AvatarGroupDemoController.swift @@ -51,39 +51,35 @@ class AvatarGroupDemoController: DemoTableViewController { let row = section.rows[indexPath.row] switch row { - case .avatarCount: + case .swiftUIDemo: guard let cell = tableView.dequeueReusableCell(withIdentifier: ActionsCell.identifier) as? ActionsCell else { return UITableViewCell() } - - cell.setup(action1Title: "Increase Avatar Count", action2Title: "Decrease Avatar Count", action1Type: .regular, action2Type: .regular) - cell.action1Button.addTarget(self, action: #selector(addAvatarCount(_:)), for: UIControl.Event.touchUpInside) - cell.action2Button.addTarget(self, action: #selector(subtractAvatarCount(_:)), for: UIControl.Event.touchUpInside) + cell.setup(action1Title: "Show SwiftUI Demo") + cell.action1Button.addTarget(self, action: #selector(showSwiftUIDemo(_:)), for: .touchUpInside) return cell - case .alternateBackground: - guard let cell = tableView.dequeueReusableCell(withIdentifier: BooleanCell.identifier) as? BooleanCell else { + case .avatarCount: + guard let cell = tableView.dequeueReusableCell(withIdentifier: ActionsCell.identifier) as? ActionsCell else { return UITableViewCell() } - cell.setup(title: row.title, isOn: self.isUsingAlternateBackgroundColor) - cell.titleNumberOfLines = 0 - cell.onValueChanged = { [weak self, weak cell] in - self?.isUsingAlternateBackgroundColor = cell?.isOn ?? true - } + cell.setup(action1Title: "Increase Avatar Count", action2Title: "Decrease Avatar Count", action1Type: .regular, action2Type: .regular) + cell.action1Button.addTarget(self, action: #selector(addAvatarCount(_:)), for: UIControl.Event.touchUpInside) + cell.action2Button.addTarget(self, action: #selector(subtractAvatarCount(_:)), for: UIControl.Event.touchUpInside) return cell - case .customRingColor: + case .alternateBackground, .customRingColor, .hasBackgroundOutline: guard let cell = tableView.dequeueReusableCell(withIdentifier: BooleanCell.identifier) as? BooleanCell else { return UITableViewCell() } - cell.setup(title: row.title, isOn: self.isUsingImageBasedCustomColor) + cell.setup(title: row.title, isOn: row.booleanValue(self)) cell.titleNumberOfLines = 0 cell.onValueChanged = { [weak self, weak cell] in - self?.isUsingImageBasedCustomColor = cell?.isOn ?? true + row.setBooleanValue(self, cell?.isOn ?? true) } return cell @@ -159,7 +155,7 @@ class AvatarGroupDemoController: DemoTableViewController { cell.contentView.trailingAnchor.constraint(equalTo: avatarGroupView.trailingAnchor, constant: 20) ]) - cell.backgroundConfiguration?.backgroundColor = self.isUsingAlternateBackgroundColor ? TableViewCell.tableCellBackgroundSelectedColor : TableViewCell.tableCellBackgroundColor + cell.backgroundColor = self.isUsingAlternateBackgroundColor ? TableViewCell.tableCellBackgroundSelectedColor : TableViewCell.tableCellBackgroundColor return cell } @@ -168,6 +164,7 @@ class AvatarGroupDemoController: DemoTableViewController { // MARK: - Helpers private enum AvatarGroupDemoSection: CaseIterable { + case swiftUIDemo case settings case avatarStackNoActivityRing case avatarStackWithActivityRing @@ -186,8 +183,9 @@ class AvatarGroupDemoController: DemoTableViewController { .avatarPileWithActivityRing, .avatarPileWithMixedActivityRing: return .pile - case .settings: - preconditionFailure("Settings rows should not display an Avatar Group") + case .settings, + .swiftUIDemo: + preconditionFailure("Settings and SwiftUI rows should not display an Avatar Group") } } @@ -201,8 +199,9 @@ class AvatarGroupDemoController: DemoTableViewController { .avatarPileWithActivityRing, .avatarPileWithMixedActivityRing: return true - case .settings: - preconditionFailure("Settings rows should not display an Avatar Group") + case .settings, + .swiftUIDemo: + preconditionFailure("Settings and SwiftUI rows should not display an Avatar Group") } } @@ -216,17 +215,25 @@ class AvatarGroupDemoController: DemoTableViewController { .avatarPileWithActivityRing, .avatarPileNoActivityRing: return false - case .settings: - preconditionFailure("Settings rows should not display an Avatar Group") + case .settings, + .swiftUIDemo: + preconditionFailure("Settings and SwiftUI rows should not display an Avatar Group") } } var isDemoSection: Bool { - return self != .settings + switch self { + case .settings, .swiftUIDemo: + return false + default: + return true + } } var title: String { switch self { + case .swiftUIDemo: + return "SwiftUI Demo" case .settings: return "Settings" case .avatarStackNoActivityRing: @@ -246,10 +253,13 @@ class AvatarGroupDemoController: DemoTableViewController { var rows: [AvatarGroupDemoRow] { switch self { + case .swiftUIDemo: + return [.swiftUIDemo] case .settings: return [.avatarCount, .alternateBackground, .customRingColor, + .hasBackgroundOutline, .maxDisplayedAvatars, .overflow] case .avatarStackNoActivityRing, @@ -277,9 +287,11 @@ class AvatarGroupDemoController: DemoTableViewController { } private enum AvatarGroupDemoRow: CaseIterable { + case swiftUIDemo case avatarCount case alternateBackground case customRingColor + case hasBackgroundOutline case maxDisplayedAvatars case overflow case titleSize72 @@ -317,8 +329,10 @@ class AvatarGroupDemoController: DemoTableViewController { .avatarCount, .alternateBackground, .customRingColor, + .hasBackgroundOutline, .maxDisplayedAvatars, - .overflow: + .overflow, + .swiftUIDemo: return false } } @@ -349,21 +363,27 @@ class AvatarGroupDemoController: DemoTableViewController { .avatarCount, .alternateBackground, .customRingColor, + .hasBackgroundOutline, .maxDisplayedAvatars, - .overflow: + .overflow, + .swiftUIDemo: preconditionFailure("Row should not display an Avatar Group") } } var title: String { switch self { + case .swiftUIDemo: + return "SwiftUI Demo" case .avatarCount: return "Avatar count" case .alternateBackground: return "Use alternate background color" case .customRingColor: return "Use image based custom ring color" - case.maxDisplayedAvatars: + case .hasBackgroundOutline: + return "Has background outline" + case .maxDisplayedAvatars: return "Max displayed avatars" case .overflow: return "Overflow count" @@ -391,6 +411,38 @@ class AvatarGroupDemoController: DemoTableViewController { preconditionFailure("Row should not have title") } } + + func booleanValue(_ controller: AvatarGroupDemoController?) -> Bool { + guard let controller else { + return false + } + switch self { + case .alternateBackground: + return controller.isUsingAlternateBackgroundColor + case .customRingColor: + return controller.isUsingImageBasedCustomColor + case .hasBackgroundOutline: + return controller.isUsingBackgroundOutline + default: + assertionFailure("Cannot get boolean value for non-boolean row") + return false + } + } + + func setBooleanValue(_ controller: AvatarGroupDemoController?, _ value: Bool) { + switch self { + case .alternateBackground: + controller?.isUsingAlternateBackgroundColor = value + case .customRingColor: + controller?.isUsingImageBasedCustomColor = value + case .hasBackgroundOutline: + controller?.isUsingBackgroundOutline = value + default: + assertionFailure("Cannot set boolean value for non-boolean row") + return + } + } + } private var maxDisplayedAvatars: Int = 3 { @@ -517,6 +569,11 @@ class AvatarGroupDemoController: DemoTableViewController { } } + @objc private func showSwiftUIDemo(_ cell: ActionsCell) { + navigationController?.pushViewController(AvatarGroupDemoControllerSwiftUI(), + animated: true) + } + @objc private func addAvatarCount(_ cell: ActionsCell) { guard avatarCount < samplePersonas.count else { return @@ -549,6 +606,14 @@ class AvatarGroupDemoController: DemoTableViewController { } } + private var isUsingBackgroundOutline: Bool = false { + didSet { + for group in allDemoAvatarGroupsCombined { + group.state.hasBackgroundOutline = isUsingBackgroundOutline + } + } + } + private func updateAvatarsCustomRingColor(for range: Range) { for group in allDemoAvatarGroupsCombined { for index in range { diff --git a/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/AvatarGroupDemoController_SwiftUI.swift b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/AvatarGroupDemoController_SwiftUI.swift new file mode 100644 index 0000000000..e8d5478efb --- /dev/null +++ b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/AvatarGroupDemoController_SwiftUI.swift @@ -0,0 +1,140 @@ +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// + +import FluentUI +import UIKit +import SwiftUI + +class AvatarGroupDemoControllerSwiftUI: DemoHostingController { + required init(rootView: AnyView) { + preconditionFailure("init(coder:) has not been implemented") + } + + required dynamic init?(coder aDecoder: NSCoder) { + preconditionFailure("init(coder:) has not been implemented") + } + + init() { + super.init(rootView: AnyView(AvatarGroupDemoView())) + self.title = "AvatarGroup (SwiftUI)" + } +} + +struct AvatarGroupDemoView: View { + static let defaultSize: MSFAvatarSize = .size72 + static let startingAvatarCount: Int = 5 + static let startingMaxDisplayedAvatars: Int = 3 + + @Environment(\.fluentTheme) var fluentTheme: FluentTheme + + @State var useAlternateBackground: Bool = true + + // Avatar settings + @State var isRingVisible: Bool = false + @State var showImage: Bool = true + @State var showImageBasedRingColor: Bool = false + @State var hasRingInnerGap: Bool = true + + // AvatarGroup settings + @State var maxDisplayedAvatars: Int = startingMaxDisplayedAvatars + @State var overflowCount: Int = 0 + @State var hasBackgroundOutline: Bool = false + @State var isUnread: Bool = false + @State var size: MSFAvatarSize = AvatarGroupDemoView.defaultSize + @State var style: MSFAvatarGroupStyle = .stack + @State var avatarCount: Int = startingAvatarCount + + @ViewBuilder + func avatarFromSamplePersona(_ index: Int) -> Avatar { + let samplePersona = samplePersonas[index % samplePersonas.count] + Avatar(style: .default, + size: size, + image: showImage ? samplePersona.image : nil, + primaryText: samplePersona.name, + secondaryText: samplePersona.email) + .isRingVisible(isRingVisible) + .hasRingInnerGap(hasRingInnerGap) + .imageBasedRingColor(showImageBasedRingColor ? AvatarDemoController.colorfulCustomImage : nil) + } + + var body: some View { + VStack(spacing: 0) { + ZStack { + fluentTheme.swiftUIColor(useAlternateBackground ? .backgroundCanvas : .background1) + AvatarGroup(style: style, + size: size, + avatarCount: avatarCount, + maxDisplayedAvatars: maxDisplayedAvatars, + overflowCount: overflowCount, + hasBackgroundOutline: hasBackgroundOutline, + isUnread: isUnread) { index in + avatarFromSamplePersona(index) + }.fixedSize() + } + .frame(height: 120, alignment: .center) + + FluentList { + FluentListSection("Content") { + Stepper("Avatar Count: \(avatarCount)", value: $avatarCount, in: (0...Int.max)) + Stepper("Max Displayed Avatars: \(maxDisplayedAvatars)", value: $maxDisplayedAvatars) + Stepper("Overflow Count: \(overflowCount)", value: $overflowCount) + Toggle("Has Background Outline", isOn: $hasBackgroundOutline) + Toggle("Show Avatar Images", isOn: $showImage) + Toggle("Unread Dot", isOn: $isUnread) + Toggle("Alternate Background", isOn: $useAlternateBackground) + } + + FluentListSection("Ring") { + Toggle("Ring Visible", isOn: $isRingVisible) + Toggle("Image Based Ring Color", isOn: $showImageBasedRingColor) + Toggle("Has Ring Inner Gap", isOn: $hasRingInnerGap) + } + + FluentListSection("Style") { + Picker(selection: $style, label: EmptyView()) { + Text(".stack").tag(MSFAvatarGroupStyle.stack) + Text(".pile").tag(MSFAvatarGroupStyle.pile) + } + .labelsHidden() + .frame(maxWidth: .infinity, alignment: .leading) + } + + FluentListSection("Size") { + Picker("Avatar Size", selection: $size) { + ForEach(MSFAvatarSize.allCases.reversed(), id: \.self) { avatarSize in + Text("\(avatarSize.description)").tag(avatarSize) + } + } + .labelsHidden() + .frame(maxWidth: .infinity, alignment: .leading) + } + } + .fluentListStyle(.insetGrouped) + } + .fluentTheme(fluentTheme) + .tint(Color(fluentTheme.color(.brandForeground1))) + } +} + +extension MSFAvatarSize { + var description: String { + switch self { + case .size16: + return ".size16" + case .size20: + return ".size20" + case .size24: + return ".size24" + case .size32: + return ".size32" + case .size40: + return ".size40" + case .size56: + return ".size56" + case .size72: + return ".size72" + } + } +} diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Demos/BadgeFieldDemoController.swift b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/BadgeFieldDemoController.swift similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Demos/BadgeFieldDemoController.swift rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/BadgeFieldDemoController.swift diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Demos/BadgeViewDemoController.swift b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/BadgeViewDemoController.swift similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Demos/BadgeViewDemoController.swift rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/BadgeViewDemoController.swift diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Demos/BottomCommandingDemoController.swift b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/BottomCommandingDemoController.swift similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Demos/BottomCommandingDemoController.swift rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/BottomCommandingDemoController.swift diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Demos/BottomSheetDemoController.swift b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/BottomSheetDemoController.swift similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Demos/BottomSheetDemoController.swift rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/BottomSheetDemoController.swift diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Demos/ButtonDemoController.swift b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/ButtonDemoController.swift similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Demos/ButtonDemoController.swift rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/ButtonDemoController.swift diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Demos/ButtonDemoController_SwiftUI.swift b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/ButtonDemoController_SwiftUI.swift similarity index 59% rename from ios/FluentUI.Demo/FluentUI.Demo/Demos/ButtonDemoController_SwiftUI.swift rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/ButtonDemoController_SwiftUI.swift index 8b7781e218..c1f4a9204b 100644 --- a/ios/FluentUI.Demo/FluentUI.Demo/Demos/ButtonDemoController_SwiftUI.swift +++ b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/ButtonDemoController_SwiftUI.swift @@ -7,65 +7,28 @@ import FluentUI import SwiftUI import UIKit -class ButtonDemoControllerSwiftUI: FluentThemedHostingController { - @objc required dynamic init?(coder aDecoder: NSCoder) { - preconditionFailure("init(coder:) has not been implemented") - } - +class ButtonDemoControllerSwiftUI: DemoHostingController { init() { - super.init(rootView: AnyView(ButtonDemoView())) - self.title = "Button (SwiftUI)" - } - - @MainActor required dynamic init(rootView: AnyView) { - super.init(rootView: rootView) - } - - override func viewDidLoad() { - super.viewDidLoad() - configureAppearanceAndReadmePopovers() - } - - // MARK: - Demo Appearance Popover - - func configureAppearanceAndReadmePopovers() { - let settingsButton = UIBarButtonItem(image: UIImage(named: "ic_fluent_settings_24_regular"), - style: .plain, - target: self, - action: #selector(showAppearancePopover(_:))) - navigationItem.rightBarButtonItems = [settingsButton] + super.init(rootView: AnyView(ButtonDemoView()), title: "Button (SwiftUI)") } - @objc func showAppearancePopover(_ sender: AnyObject, presenter: UIViewController) { - if let barButtonItem = sender as? UIBarButtonItem { - appearanceController.popoverPresentationController?.barButtonItem = barButtonItem - } else if let sourceView = sender as? UIView { - appearanceController.popoverPresentationController?.sourceView = sourceView - appearanceController.popoverPresentationController?.sourceRect = sourceView.bounds - } - appearanceController.popoverPresentationController?.delegate = self - presenter.present(appearanceController, animated: true, completion: nil) - } - - @objc func showAppearancePopover(_ sender: AnyObject) { - showAppearancePopover(sender, presenter: self) + @objc required dynamic init?(coder aDecoder: NSCoder) { + preconditionFailure("init(coder:) has not been implemented") } - private lazy var appearanceController: DemoAppearanceController = .init(delegate: self as? DemoAppearanceDelegate) - -} - -extension ButtonDemoControllerSwiftUI: UIPopoverPresentationControllerDelegate { - /// Overridden to allow for popover-style modal presentation on compact (e.g. iPhone) devices. - func adaptivePresentationStyle(for controller: UIPresentationController) -> UIModalPresentationStyle { - return .none + @MainActor required dynamic init(rootView: AnyView) { + preconditionFailure("init(rootView:) has not been implemented") } } struct ButtonDemoView: View { public var body: some View { VStack { - demoButton(style, size, isDisabled: isDisabled) + if showToggle { + demoToggle(size, isDisabled: isDisabled) + } else { + demoButton(style, size, isDisabled: isDisabled) + } demoOptions } } @@ -77,33 +40,54 @@ struct ButtonDemoView: View { @State var showAlert: Bool = false @State var size: ControlSize = .large @State var style: FluentUI.ButtonStyle = .accent + @State var showToggle: Bool = false + @State var showThemeOverrides: Bool = false @Environment(\.fluentTheme) var fluentTheme: FluentTheme + @State var isToggleOn: Bool = false + + @ViewBuilder + private var buttonLabel: some View { + HStack { + if showImage { + Image("Placeholder_24") + } + if showLabel && text.count > 0 { + Text(text) + } + } + } + @ViewBuilder private func demoButton(_ buttonStyle: FluentUI.ButtonStyle, _ controlSize: ControlSize, isDisabled: Bool) -> some View { Button(action: { showAlert = true }, label: { - HStack { - if showImage { - Image("Placeholder_24") - } - if showLabel && text.count > 0 { - Text(text) - } - } + buttonLabel }) - .buttonStyle(FluentButtonStyle(style: buttonStyle)) + .buttonStyle(fluentButtonStyle(style: buttonStyle)) .controlSize(controlSize) .disabled(isDisabled) .fixedSize() - .padding(8.0) + .padding(GlobalTokens.spacing(.size80)) .alert(isPresented: $showAlert, content: { Alert(title: Text("Button tapped")) }) } + @ViewBuilder + private func demoToggle(_ controlSize: ControlSize, isDisabled: Bool) -> some View { + Toggle(isOn: $isToggleOn, label: { + buttonLabel + }) + .toggleStyle(fluentButtonToggleStyle()) + .controlSize(controlSize) + .disabled(isDisabled) + .fixedSize() + .padding(GlobalTokens.spacing(.size80)) + } + @ViewBuilder private var demoOptions: some View { Form { @@ -124,9 +108,12 @@ struct ButtonDemoView: View { } Section("Style and Size") { - Picker("Style", selection: $style) { - ForEach(Array(FluentUI.ButtonStyle.allCases.enumerated()), id: \.element) { _, buttonStyle in - Text("\(buttonStyle.description)").tag(buttonStyle.rawValue) + FluentUIDemoToggle(titleKey: "Present as toggle", isOn: $showToggle) + if !showToggle { + Picker("Style", selection: $style) { + ForEach(Array(FluentUI.ButtonStyle.allCases.enumerated()), id: \.element) { _, buttonStyle in + Text("\(buttonStyle.description)").tag(buttonStyle.rawValue) + } } } @@ -135,6 +122,8 @@ struct ButtonDemoView: View { Text("\(buttonSize.description)").tag(buttonSize) } } + + FluentUIDemoToggle(titleKey: "Show theme overrides", isOn: $showThemeOverrides) } Section("More") { @@ -161,6 +150,26 @@ struct ButtonDemoView: View { } } } + + private func fluentButtonStyle(style: FluentUI.ButtonStyle) -> FluentButtonStyle { + var buttonStyle = FluentButtonStyle(style: style) + if showThemeOverrides { + buttonStyle.overrideTokens(tokenOverrides) + } + return buttonStyle + } + + private func fluentButtonToggleStyle() -> FluentButtonToggleStyle { + var buttonToggleStyle = FluentButtonToggleStyle() + if showThemeOverrides { + buttonToggleStyle.overrideTokens(tokenOverrides) + } + return buttonToggleStyle + } + + private var tokenOverrides: [ButtonToken: ControlTokenValue] = [ + .backgroundPressedColor: .uiColor { .red } + ] } private extension ControlSize { diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Demos/CardNudgeDemoController.swift b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/CardNudgeDemoController.swift similarity index 99% rename from ios/FluentUI.Demo/FluentUI.Demo/Demos/CardNudgeDemoController.swift rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/CardNudgeDemoController.swift index b446ebba46..a96a3ae4ad 100644 --- a/ios/FluentUI.Demo/FluentUI.Demo/Demos/CardNudgeDemoController.swift +++ b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/CardNudgeDemoController.swift @@ -34,7 +34,7 @@ class CardNudgeDemoController: DemoTableViewController { name: UIContentSizeCategory.didChangeNotification, object: nil) - self.configureAppearancePopover() + self.configureBarButtonItems() } // MARK: - Table view data source diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Demos/CardViewDemoController.swift b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/CardViewDemoController.swift similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Demos/CardViewDemoController.swift rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/CardViewDemoController.swift diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Demos/CommandBarDemoController.swift b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/CommandBarDemoController.swift similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Demos/CommandBarDemoController.swift rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/CommandBarDemoController.swift diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Demos/DateTimePickerDemoController.swift b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/DateTimePickerDemoController.swift similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Demos/DateTimePickerDemoController.swift rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/DateTimePickerDemoController.swift diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Demos/DrawerDemoController.swift b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/DrawerDemoController.swift similarity index 99% rename from ios/FluentUI.Demo/FluentUI.Demo/Demos/DrawerDemoController.swift rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/DrawerDemoController.swift index 2c55b39f46..7f57d4f4bf 100644 --- a/ios/FluentUI.Demo/FluentUI.Demo/Demos/DrawerDemoController.swift +++ b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/DrawerDemoController.swift @@ -138,7 +138,7 @@ class DrawerDemoController: DemoController { UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil) ] - let backgroundColor = view.fluentTheme.color(.background3) + let backgroundColor: UIColor = view.fluentTheme.color(.background3) controller.view.addSubview(content) content.frame = controller.view.bounds diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Demos/GlobalColorTokensDemoController.swift b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/GlobalColorTokensDemoController.swift similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Demos/GlobalColorTokensDemoController.swift rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/GlobalColorTokensDemoController.swift diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Demos/HUDDemoController.swift b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/HUDDemoController.swift similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Demos/HUDDemoController.swift rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/HUDDemoController.swift diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Demos/HUDDemoController_SwiftUI.swift b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/HUDDemoController_SwiftUI.swift similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Demos/HUDDemoController_SwiftUI.swift rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/HUDDemoController_SwiftUI.swift diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Demos/IndeterminateProgressBarDemoController.swift b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/IndeterminateProgressBarDemoController.swift similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Demos/IndeterminateProgressBarDemoController.swift rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/IndeterminateProgressBarDemoController.swift diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Demos/IndeterminateProgressBarDemoController_SwiftUI.swift b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/IndeterminateProgressBarDemoController_SwiftUI.swift similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Demos/IndeterminateProgressBarDemoController_SwiftUI.swift rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/IndeterminateProgressBarDemoController_SwiftUI.swift diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Demos/LabelDemoController.swift b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/LabelDemoController.swift similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Demos/LabelDemoController.swift rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/LabelDemoController.swift diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Demos/ListActionItemDemoController.swift b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/ListActionItemDemoController.swift similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Demos/ListActionItemDemoController.swift rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/ListActionItemDemoController.swift diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Demos/ListActionItemDemoController_SwiftUI.swift b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/ListActionItemDemoController_SwiftUI.swift similarity index 59% rename from ios/FluentUI.Demo/FluentUI.Demo/Demos/ListActionItemDemoController_SwiftUI.swift rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/ListActionItemDemoController_SwiftUI.swift index 5ad5758bba..6bb5a0ce5f 100644 --- a/ios/FluentUI.Demo/FluentUI.Demo/Demos/ListActionItemDemoController_SwiftUI.swift +++ b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/ListActionItemDemoController_SwiftUI.swift @@ -31,9 +31,9 @@ struct ListActionItemDemoView: View { @State var topSeparatorType: ListActionItemSeparatorType = .none @State var bottomSeparatorType: ListActionItemSeparatorType = .inset @State var backgroundStyleType: ListItemBackgroundStyleType = .grouped + @State var listStyle: FluentListStyle = .plain public var body: some View { - @ViewBuilder var textFields: some View { TextField("Primary Action Title", text: $primaryActionTitle) @@ -80,58 +80,68 @@ struct ListActionItemDemoView: View { Picker("Bottom Separator Type", selection: $bottomSeparatorType) { separatorTypePickerOptions } + + let listStylePickerOptions = Group { + Text(".plain").tag(FluentListStyle.plain) + Text(".insetGrouped").tag(FluentListStyle.insetGrouped) + Text(".inset").tag(FluentListStyle.inset) + } + + Picker("List Style Type", selection: $listStyle) { + listStylePickerOptions + } } @ViewBuilder var content: some View { - List { - Section { - if showSecondaryAction { - ListActionItem(primaryActionTitle: primaryActionTitle, - onPrimaryActionTapped: { - showingAlert.toggle() - }, - primaryActionType: primaryActionType, - secondaryActionTitle: secondaryActionTitle, - onSecondaryActionTapped: { - showingAlert.toggle() - }, - secondaryActionType: secondaryActionType) - .topSeparatorType(topSeparatorType) - .bottomSeparatorType(bottomSeparatorType) - .backgroundStyleType(backgroundStyleType) - } else { - ListActionItem(title: primaryActionTitle, - onTapped: { - showingAlert.toggle() - }, - actionType: primaryActionType) - .topSeparatorType(topSeparatorType) - .bottomSeparatorType(bottomSeparatorType) - .backgroundStyleType(backgroundStyleType) - } - - } header: { - Text("ListActionItem") - } - .alert("Action tapped", isPresented: $showingAlert) { - Button("OK", role: .cancel) { } - .accessibilityIdentifier("DismissAlertButton") + FluentListSection("ListActionItem") { + if showSecondaryAction { + ListActionItem(primaryActionTitle: primaryActionTitle, + onPrimaryActionTapped: { + showingAlert.toggle() + }, + primaryActionType: primaryActionType, + secondaryActionTitle: secondaryActionTitle, + onSecondaryActionTapped: { + showingAlert.toggle() + }, + secondaryActionType: secondaryActionType) + .topSeparatorType(topSeparatorType) + .bottomSeparatorType(bottomSeparatorType) + .backgroundStyleType(backgroundStyleType) + } else { + ListActionItem(title: primaryActionTitle, + onTapped: { + showingAlert.toggle() + }, + actionType: primaryActionType) + .topSeparatorType(topSeparatorType) + .bottomSeparatorType(bottomSeparatorType) + .backgroundStyleType(backgroundStyleType) } + } + .alert("Action tapped", isPresented: $showingAlert) { + Button("OK", role: .cancel) { } + .accessibilityIdentifier("DismissAlertButton") + } - Section { - FluentUIDemoToggle(titleKey: "Show secondary action", isOn: $showSecondaryAction) - .accessibilityIdentifier("showSecondaryActionSwitch") - textFields - pickers - } header: { - Text("Settings") - } + FluentListSection("Settings") { + FluentUIDemoToggle(titleKey: "Show secondary action", isOn: $showSecondaryAction) + .accessibilityIdentifier("showSecondaryActionSwitch") + textFields + pickers + } + } + + @ViewBuilder + var list: some View { + FluentList { + content } + .fluentListStyle(listStyle) .fluentTheme(fluentTheme) - .listStyle(.insetGrouped) } - return content + return list } } diff --git a/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/ListItemDemoController.swift b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/ListItemDemoController.swift new file mode 100644 index 0000000000..193363bbb1 --- /dev/null +++ b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/ListItemDemoController.swift @@ -0,0 +1,38 @@ +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// + +import FluentUI +import UIKit + +class ListItemDemoController: DemoController { + + override func viewDidLoad() { + super.viewDidLoad() + let hostingController = ListItemDemoControllerSwiftUI() + self.hostingController = hostingController + addChild(hostingController) + view.addSubview(hostingController.view) + hostingController.didMove(toParent: self) + hostingController.view.translatesAutoresizingMaskIntoConstraints = false + NSLayoutConstraint.activate([hostingController.view.topAnchor.constraint(equalTo: view.topAnchor), + hostingController.view.bottomAnchor.constraint(equalTo: view.bottomAnchor), + hostingController.view.leadingAnchor.constraint(equalTo: view.leadingAnchor), + hostingController.view.trailingAnchor.constraint(equalTo: view.trailingAnchor)]) + + readmeString = "A list item displays a single row of data in a list.\n\nUse list items for displaying rows of data in a single column." + } + + override func didMove(toParent parent: UIViewController?) { + guard let parent, + let window = parent.view.window, + let hostingController else { + return + } + + hostingController.rootView.fluentTheme = window.fluentTheme + } + + var hostingController: ListItemDemoControllerSwiftUI? +} diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Demos/ListItemDemoController_SwiftUI.swift b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/ListItemDemoController_SwiftUI.swift similarity index 56% rename from ios/FluentUI.Demo/FluentUI.Demo/Demos/ListItemDemoController_SwiftUI.swift rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/ListItemDemoController_SwiftUI.swift index 46bd8cd29d..8379d36dc4 100644 --- a/ios/FluentUI.Demo/FluentUI.Demo/Demos/ListItemDemoController_SwiftUI.swift +++ b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/ListItemDemoController_SwiftUI.swift @@ -21,7 +21,8 @@ class ListItemDemoControllerSwiftUI: UIHostingController { } struct ListItemDemoView: View { - @State var showingAlert: Bool = false + @State var showingPrimaryAlert: Bool = false + @State var showingSecondaryAlert: Bool = false @ObservedObject var fluentTheme: FluentTheme = .shared let accessoryTypes: [ListItemAccessoryType] = [.none, .checkmark, .detailButton, .disclosureIndicator] @@ -32,10 +33,14 @@ struct ListItemDemoView: View { @State var showFooter: Bool = false @State var showLeadingContent: Bool = true @State var showTrailingContent: Bool = true + @State var isTappable: Bool = true @State var isDisabled: Bool = false + @State var renderStandalone: Bool = false + @State var overrideTokens: Bool = false @State var accessoryType: ListItemAccessoryType = .none @State var leadingContentSize: ListItemLeadingContentSize = .default @State var backgroundStyle: ListItemBackgroundStyleType = .grouped + @State var listStyle: FluentListStyle = .plain @State var titleLineLimit: Int = 1 @State var subtitleLineLimit: Int = 1 @State var footerLineLimit: Int = 1 @@ -73,7 +78,10 @@ struct ListItemDemoView: View { .accessibilityIdentifier("leadingContentSwitch") FluentUIDemoToggle(titleKey: "Show trailing content", isOn: $showTrailingContent) .accessibilityIdentifier("trailingContentSwitch") + FluentUIDemoToggle(titleKey: "Tappable", isOn: $isTappable) FluentUIDemoToggle(titleKey: "Disabled", isOn: $isDisabled) + FluentUIDemoToggle(titleKey: "Render standalone", isOn: $renderStandalone) + FluentUIDemoToggle(titleKey: "Override tokens", isOn: $overrideTokens) } @ViewBuilder @@ -98,6 +106,11 @@ struct ListItemDemoView: View { Text(".clear").tag(ListItemBackgroundStyleType.clear) Text(".custom").tag(ListItemBackgroundStyleType.custom) } + Picker("List Style Type", selection: $listStyle) { + Text(".plain").tag(FluentListStyle.plain) + Text(".insetGrouped").tag(FluentListStyle.insetGrouped) + Text(".inset").tag(FluentListStyle.inset) + } } @ViewBuilder @@ -136,68 +149,99 @@ struct ListItemDemoView: View { } @ViewBuilder - var content: some View { - VStack { - List { - Section { - ListItem(title: title, - subtitle: showSubtitle ? subtitle : "", - footer: showFooter ? footer : "", - leadingContent: { - if showLeadingContent { - leadingContent - } - }, - trailingContent: { - if showTrailingContent { - switch trailingContentFocusableElementCount { - case 0: - Text("Spreadsheet") - case 1: - Toggle("", isOn: $trailingContentToggleEnabled) - default: - HStack { - Button { - showingAlert = true - } label: { - Text("Button 1") + var listItem: some View { + var listItem = ListItem(title: title, + subtitle: showSubtitle ? subtitle : "", + footer: showFooter ? footer : "", + leadingContent: { + if showLeadingContent { + leadingContent } - Button { - showingAlert = true - } label: { - Text("Button 2") + }, + trailingContent: { + if showTrailingContent { + switch trailingContentFocusableElementCount { + case 0: + Text("Spreadsheet") + case 1: + Toggle("", isOn: $trailingContentToggleEnabled) + default: + HStack { + Button { + showingSecondaryAlert = true + } label: { + Text("Button 1") + } + Button { + showingSecondaryAlert = true + } label: { + Text("Button 2") + } + } + } } - } - } - } - }) - .backgroundStyleType(backgroundStyle) - .accessoryType(accessoryType) - .leadingContentSize(leadingContentSize) - .titleLineLimit(titleLineLimit) - .subtitleLineLimit(subtitleLineLimit) - .footerLineLimit(footerLineLimit) - .combineTrailingContentAccessibilityElement(trailingContentFocusableElementCount < 2) - .onAccessoryTapped { - showingAlert = true - } - .disabled(isDisabled) - .alert("Detail button tapped", isPresented: $showingAlert) { - Button("OK", role: .cancel) { } + }, + action: !isTappable ? nil : { + showingPrimaryAlert = true + }) + .backgroundStyleType(backgroundStyle) + .accessoryType(accessoryType) + .leadingContentSize(leadingContentSize) + .titleLineLimit(titleLineLimit) + .subtitleLineLimit(subtitleLineLimit) + .footerLineLimit(footerLineLimit) + .combineTrailingContentAccessibilityElement(trailingContentFocusableElementCount < 2) + .onAccessoryTapped { + showingSecondaryAlert = true + } + listItem + .overrideTokens($overrideTokens.wrappedValue ? listItemTokenOverrides : [:]) + .disabled(isDisabled) + .alert("List Item tapped", isPresented: $showingPrimaryAlert) { + Button("OK", role: .cancel) { } + } + .alert("Detail button tapped", isPresented: $showingSecondaryAlert) { + Button("OK", role: .cancel) { } + } + } + + @ViewBuilder + var content: some View { + VStack { + if renderStandalone { + listItem + } + FluentList { + if !renderStandalone { + FluentListSection("ListItem") { + listItem } - } header: { - Text("ListItem") } controls } - .background(ListItem.listBackgroundColor(for: .grouped)) + .fluentListStyle(listStyle) .fluentTheme(fluentTheme) - .listStyle(.insetGrouped) } } return content } + + private var listItemTokenOverrides: [ListItemToken: ControlTokenValue] { + return [ + .titleColor: .uiColor { + GlobalTokens.sharedColor(.red, .primary) + }, + .cellBackgroundGroupedColor: .uiColor { + UIColor(light: GlobalTokens.sharedColor(.brass, .tint50), + dark: GlobalTokens.sharedColor(.brass, .shade40)) + }, + .accessoryDisclosureIndicatorColor: .uiColor { + UIColor(light: GlobalTokens.sharedColor(.forest, .tint10), + dark: GlobalTokens.sharedColor(.forest, .shade40)) + } + ] + } } struct UIViewWrapper: UIViewRepresentable { diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Demos/MultilineCommandBarDemoController.swift b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/MultilineCommandBarDemoController.swift similarity index 98% rename from ios/FluentUI.Demo/FluentUI.Demo/Demos/MultilineCommandBarDemoController.swift rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/MultilineCommandBarDemoController.swift index 854045684e..616503239c 100644 --- a/ios/FluentUI.Demo/FluentUI.Demo/Demos/MultilineCommandBarDemoController.swift +++ b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/MultilineCommandBarDemoController.swift @@ -37,7 +37,8 @@ class MultilineCommandBarDemoController: DemoController { return CommandBarItem(iconImage: nil, title: command.title, titleFont: command.titleFont) default: return CommandBarItem( - iconImage: command.iconImage + iconImage: command.iconImage, + accessibilityLabel: command.rawValue ) } } @@ -66,7 +67,7 @@ class MultilineCommandBarDemoController: DemoController { return MultilineCommandBar(compactRows: compactRows, regularRows: regularRows) }() - enum Command: CaseIterable { + enum Command: String, CaseIterable { case heading1 case heading2 case heading3 diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Demos/NavigationControllerDemoController.swift b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/NavigationControllerDemoController.swift similarity index 96% rename from ios/FluentUI.Demo/FluentUI.Demo/Demos/NavigationControllerDemoController.swift rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/NavigationControllerDemoController.swift index 277efec819..f0c2744863 100644 --- a/ios/FluentUI.Demo/FluentUI.Demo/Demos/NavigationControllerDemoController.swift +++ b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/NavigationControllerDemoController.swift @@ -15,6 +15,7 @@ class NavigationControllerDemoController: DemoController { addTitle(text: "Large Title with Primary style") container.addArrangedSubview(createButton(title: "Show without accessory", action: #selector(showLargeTitle))) container.addArrangedSubview(createButton(title: "Show with collapsible search bar", action: #selector(showLargeTitleWithShyAccessory))) + container.addArrangedSubview(createButton(title: "Show with collapsible search bar and pill segmented control", action: #selector(showLargeTitleWithShyAccessoryAndSecondaryAccessory))) container.addArrangedSubview(createButton(title: "Show with fixed search bar", action: #selector(showLargeTitleWithFixedAccessory))) container.addArrangedSubview(createButton(title: "Show without an avatar", action: #selector(showLargeTitleWithoutAvatar))) container.addArrangedSubview(createButton(title: "Show with a custom leading button", action: #selector(showLargeTitleWithCustomLeadingButton))) @@ -87,6 +88,10 @@ class NavigationControllerDemoController: DemoController { presentController(withTitleStyle: .largeLeading, accessoryView: createAccessoryView(), contractNavigationBarOnScroll: true) } + @objc func showLargeTitleWithShyAccessoryAndSecondaryAccessory() { + presentController(withTitleStyle: .largeLeading, accessoryView: createAccessoryView(), secondaryAccessoryView: createSecondaryAccessoryView(), contractNavigationBarOnScroll: true) + } + @objc func showLargeTitleWithFixedAccessory() { presentController(withTitleStyle: .largeLeading, accessoryView: createAccessoryView(), contractNavigationBarOnScroll: false) } @@ -123,32 +128,32 @@ class NavigationControllerDemoController: DemoController { presentController(withTitleStyle: .leading, subtitle: "Subtitle goes here", style: .system, accessoryView: createAccessoryView(with: .onSystemNavigationBar), contractNavigationBarOnScroll: true, leadingItem: .customButton) } - @objc func showSystemTitleWithShyAccessory() { - presentController(withTitleStyle: .system, style: .system, accessoryView: createAccessoryView(with: .onSystemNavigationBar), contractNavigationBarOnScroll: true) - } - @objc func showRegularTitleWithShyAccessoryAndSubtitle() { presentController(withTitleStyle: .system, subtitle: "Subtitle goes here", accessoryView: createAccessoryView(), contractNavigationBarOnScroll: true) } @objc func showRegularTitleWithFixedAccessory() { - presentController(withTitleStyle: .system, accessoryView: createAccessoryView()) - } - - @objc func showSystemTitleWithFixedAccessoryAndSubtitle() { - presentController(withTitleStyle: .system, subtitle: "Subtitle goes here", style: .system, accessoryView: createAccessoryView(with: .onSystemNavigationBar), contractNavigationBarOnScroll: false) + presentController(withTitleStyle: .system, accessoryView: createAccessoryView(), contractNavigationBarOnScroll: false) } @objc func showSystemTitle() { presentController(withTitleStyle: .system, style: .system) } + @objc func showSystemTitleWithShyAccessory() { + presentController(withTitleStyle: .system, style: .system, accessoryView: createAccessoryView(with: .onSystemNavigationBar), contractNavigationBarOnScroll: true) + } + + @objc func showSystemTitleWithFixedAccessoryAndSubtitle() { + presentController(withTitleStyle: .system, subtitle: "Subtitle goes here", style: .system, accessoryView: createAccessoryView(with: .onSystemNavigationBar), contractNavigationBarOnScroll: false) + } + @objc func showRegularTitleWithSubtitle() { presentController(withTitleStyle: .system, subtitle: "Subtitle goes here") } @objc func showRegularTitleWithSubtitleAndCustomLeadingButton() { - presentController(withTitleStyle: .system, subtitle: "Subtitle goes here", style: .system, accessoryView: createAccessoryView(with: .onSystemNavigationBar), contractNavigationBarOnScroll: true, leadingItem: .customButton) + presentController(withTitleStyle: .system, subtitle: "Subtitle goes here", accessoryView: createAccessoryView(with: .onSystemNavigationBar), contractNavigationBarOnScroll: true, leadingItem: .customButton) } @objc func showLargeTitleWithGradientStyle() { @@ -207,6 +212,7 @@ class NavigationControllerDemoController: DemoController { subtitle: String? = nil, style: NavigationBar.Style = .primary, accessoryView: UIView? = nil, + secondaryAccessoryView: UIView? = nil, showsTopAccessory: Bool = false, contractNavigationBarOnScroll: Bool = true, showShadow: Bool = true, @@ -219,6 +225,7 @@ class NavigationControllerDemoController: DemoController { content.navigationItem.navigationBarStyle = style content.navigationItem.navigationBarShadow = showShadow ? .automatic : .alwaysHidden content.navigationItem.accessoryView = accessoryView + content.navigationItem.secondaryAccessoryView = secondaryAccessoryView content.navigationItem.topAccessoryViewAttributes = NavigationBarTopSearchBarAttributes() content.navigationItem.contentScrollView = contractNavigationBarOnScroll ? content.tableView : nil content.showsTopAccessoryView = showsTopAccessory @@ -295,6 +302,16 @@ class NavigationControllerDemoController: DemoController { return searchBar } + private func createSecondaryAccessoryView() -> UIView { + let segmentControl = createSegmentedControl(compatibleWith: .system) + let stackView = UIStackView() + stackView.addArrangedSubview(segmentControl) + stackView.layoutMargins = UIEdgeInsets(top: 10, left: 16, bottom: 10, right: 16) + stackView.isLayoutMarginsRelativeArrangement = true + stackView.backgroundColor = view.fluentTheme.color(.background1) + return stackView + } + private func createSegmentedControl(compatibleWith style: NavigationBar.Style) -> UIView { let segmentItems: [SegmentItem] = [ SegmentItem(title: "First"), @@ -482,6 +499,7 @@ class RootViewController: UIViewController, UITableViewDataSource, UITableViewDe } var showsTopAccessoryView: Bool = false + var secondaryAccessoryView: UIView? var personaData: PersonaData = { let personaData = PersonaData(name: "Kat Larsson", image: UIImage(named: "avatar_kat_larsson")) @@ -856,6 +874,10 @@ class RootViewController: UIViewController, UITableViewDataSource, UITableViewDe extension RootViewController: SearchBarDelegate { func searchBarDidBeginEditing(_ searchBar: SearchBar) { searchBar.progressSpinner.state.isAnimating = false + if navigationItem.secondaryAccessoryView != nil && !showsTopAccessoryView { + secondaryAccessoryView = navigationItem.secondaryAccessoryView + navigationItem.secondaryAccessoryView = nil + } } func searchBar(_ searchBar: SearchBar, didUpdateSearchText newSearchText: String?) { @@ -863,6 +885,9 @@ extension RootViewController: SearchBarDelegate { func searchBarDidCancel(_ searchBar: SearchBar) { searchBar.progressSpinner.state.isAnimating = false + if secondaryAccessoryView != nil && !showsTopAccessoryView { + navigationItem.secondaryAccessoryView = secondaryAccessoryView + } } func searchBarDidRequestSearch(_ searchBar: SearchBar) { diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Demos/NotificationViewDemoController.swift b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/NotificationViewDemoController.swift similarity index 99% rename from ios/FluentUI.Demo/FluentUI.Demo/Demos/NotificationViewDemoController.swift rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/NotificationViewDemoController.swift index 27f43375b6..f3916cd952 100644 --- a/ios/FluentUI.Demo/FluentUI.Demo/Demos/NotificationViewDemoController.swift +++ b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/NotificationViewDemoController.swift @@ -245,11 +245,11 @@ class NotificationViewDemoController: DemoController { return UIColor(light: GlobalTokens.sharedColor(.orange, .primary)) }, .shadow: .shadowInfo { - return ShadowInfo(keyColor: GlobalTokens.sharedColor(.hotPink, .primary), + return ShadowInfo(keyColor: GlobalTokens.sharedSwiftUIColor(.hotPink, .primary), keyBlur: 10.0, xKey: 10.0, yKey: 10.0, - ambientColor: GlobalTokens.sharedColor(.teal, .primary), + ambientColor: GlobalTokens.sharedSwiftUIColor(.teal, .primary), ambientBlur: 100.0, xAmbient: -10.0, yAmbient: -10.0) diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Demos/NotificationViewDemoController_SwiftUI.swift b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/NotificationViewDemoController_SwiftUI.swift similarity index 65% rename from ios/FluentUI.Demo/FluentUI.Demo/Demos/NotificationViewDemoController_SwiftUI.swift rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/NotificationViewDemoController_SwiftUI.swift index af23267c2b..5ec53e3b6a 100644 --- a/ios/FluentUI.Demo/FluentUI.Demo/Demos/NotificationViewDemoController_SwiftUI.swift +++ b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/NotificationViewDemoController_SwiftUI.swift @@ -17,7 +17,7 @@ class NotificationViewDemoControllerSwiftUI: UIHostingController -#import +#import NS_ASSUME_NONNULL_BEGIN diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Demos/ObjectiveCDemoColorProviding.m b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/ObjectiveCDemoColorProviding.m similarity index 98% rename from ios/FluentUI.Demo/FluentUI.Demo/Demos/ObjectiveCDemoColorProviding.m rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/ObjectiveCDemoColorProviding.m index f9f8af0e0c..fabd56832e 100644 --- a/ios/FluentUI.Demo/FluentUI.Demo/Demos/ObjectiveCDemoColorProviding.m +++ b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/ObjectiveCDemoColorProviding.m @@ -4,7 +4,6 @@ // #import "ObjectiveCDemoColorProviding.h" -#import #import @interface ObjectiveCDemoColorProviding () diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Demos/ObjectiveCDemoController.h b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/ObjectiveCDemoController.h similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Demos/ObjectiveCDemoController.h rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/ObjectiveCDemoController.h diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Demos/ObjectiveCDemoController.m b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/ObjectiveCDemoController.m similarity index 85% rename from ios/FluentUI.Demo/FluentUI.Demo/Demos/ObjectiveCDemoController.m rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/ObjectiveCDemoController.m index 0d520de3bc..b11390cd82 100644 --- a/ios/FluentUI.Demo/FluentUI.Demo/Demos/ObjectiveCDemoController.m +++ b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/ObjectiveCDemoController.m @@ -5,7 +5,6 @@ #import "ObjectiveCDemoController.h" #import "ObjectiveCDemoColorProviding.h" -#import #import @interface ObjectiveCDemoController () *addedLabels; @@ -57,8 +56,8 @@ - (void)viewDidLoad { [self setAddedLabels:[NSMutableSet set]]; - [self setAppearanceController:[MSFDemoAppearanceControllerWrapper createDemoAppearanceControllerWithDelegate:nil]]; - [self configureAppearancePopover]; + [self setAppearanceControlView:[[MSFDemoAppearanceControlView alloc] initWithDelegate:nil]]; + [self configureAppearanceBarButtonItem]; [[NSNotificationCenter defaultCenter] addObserver:self selector: @selector(themeDidChange:) @@ -157,25 +156,14 @@ - (void)addTitleWithText:(NSString*)text { [self.container addArrangedSubview:titleLabel]; } -#pragma mark Demo Appearance Controller +#pragma mark Demo Appearance Control -- (void)configureAppearancePopover { - // Display the DemoAppearancePopover button - UIBarButtonItem *item = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"ic_fluent_settings_24_regular"] - style:UIBarButtonItemStylePlain - target:self - action:@selector(showAppearancePopover:)]; +- (void)configureAppearanceBarButtonItem { + // Display the DemoAppearance button + UIBarButtonItem *item = [[UIBarButtonItem alloc] initWithCustomView:[self appearanceControlView]]; [[self navigationItem] setRightBarButtonItem:item]; } -- (void)showAppearancePopover:(UIBarButtonItem *)sender { - [[[self appearanceController] popoverPresentationController] setBarButtonItem:sender]; - [[[self appearanceController] popoverPresentationController] setDelegate:self]; - [self presentViewController:[self appearanceController] - animated:YES - completion:nil]; -} - - (void)themeDidChange:(NSNotification *)n { [self resetAddedLabels]; } diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Demos/OtherCellsDemoController.swift b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/OtherCellsDemoController.swift similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Demos/OtherCellsDemoController.swift rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/OtherCellsDemoController.swift diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Demos/PeoplePickerDemoController.swift b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/PeoplePickerDemoController.swift similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Demos/PeoplePickerDemoController.swift rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/PeoplePickerDemoController.swift diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Demos/PersonaButtonCarouselDemoController.swift b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/PersonaButtonCarouselDemoController.swift similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Demos/PersonaButtonCarouselDemoController.swift rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/PersonaButtonCarouselDemoController.swift diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Demos/PersonaListViewDemoController.swift b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/PersonaListViewDemoController.swift similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Demos/PersonaListViewDemoController.swift rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/PersonaListViewDemoController.swift diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Demos/PillButtonBarDemoController.swift b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/PillButtonBarDemoController.swift similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Demos/PillButtonBarDemoController.swift rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/PillButtonBarDemoController.swift diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Demos/PillButtonDemoController.swift b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/PillButtonDemoController.swift similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Demos/PillButtonDemoController.swift rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/PillButtonDemoController.swift diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Demos/PopupMenuDemoController.swift b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/PopupMenuDemoController.swift similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Demos/PopupMenuDemoController.swift rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/PopupMenuDemoController.swift diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Demos/PopupMenuObjCDemoController.h b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/PopupMenuObjCDemoController.h similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Demos/PopupMenuObjCDemoController.h rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/PopupMenuObjCDemoController.h diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Demos/PopupMenuObjCDemoController.m b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/PopupMenuObjCDemoController.m similarity index 96% rename from ios/FluentUI.Demo/FluentUI.Demo/Demos/PopupMenuObjCDemoController.m rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/PopupMenuObjCDemoController.m index 14f3cb6b12..e0bd1a9b5c 100644 --- a/ios/FluentUI.Demo/FluentUI.Demo/Demos/PopupMenuObjCDemoController.m +++ b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/PopupMenuObjCDemoController.m @@ -4,7 +4,7 @@ // #import "PopupMenuObjCDemoController.h" -#import +#import @implementation PopupMenuObjCDemoController @@ -12,7 +12,7 @@ - (instancetype)init { self = [super init]; if (self != nil) { - _selectedCityIndex = [[NSIndexPath alloc] initWithIndex:0]; + _selectedCityIndex = [NSIndexPath indexPathForItem:2 inSection:1]; } return self; } @@ -21,7 +21,7 @@ - (void)loadView { [super loadView]; MSFButton *demoButton = [[MSFButton alloc] initWithStyle:MSFButtonStyleOutlineAccent]; [demoButton setTitle:@"Show PopupMenu" forState:UIControlStateNormal]; - [demoButton addTarget:self action:@selector(showPopupMenu) forControlEvents:UIControlEventTouchUpInside]; + [demoButton addTarget:self action:@selector(showPopupMenu:) forControlEvents:UIControlEventTouchUpInside]; UIStackView *stack = [[UIStackView alloc] initWithArrangedSubviews:@[demoButton]]; [stack setAlignment:UIStackViewAlignmentTop]; @@ -41,7 +41,7 @@ - (void)loadView { ]]; } -- (void)showPopupMenu { +- (void)showPopupMenu:(id)sender { MSFPopupMenuItem *montreal = [[MSFPopupMenuItem alloc] initWithImageName:@"Montreal" generateSelectedImage:NO title:@"Montréal" @@ -112,9 +112,8 @@ - (void)showPopupMenu { items:@[montreal, toronto, vancouver]]; MSFPopupMenuSection *unitedStates = [[MSFPopupMenuSection alloc] initWithTitle:@"United States" items:@[lasVegas, phoenix, sanFrancisco, seattle]]; - UIView *source = [self view]; - MSFPopupMenuController *popupMenu = [[MSFPopupMenuController alloc] initWithSourceView:source - sourceRect:[source bounds] + MSFPopupMenuController *popupMenu = [[MSFPopupMenuController alloc] initWithSourceView:sender + sourceRect:[sender bounds] presentationOrigin:-1 presentationDirection:MSFDrawerPresentationDirectionDown preferredMaximumHeight:-1]; diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Demos/SearchBarDemoController.swift b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/SearchBarDemoController.swift similarity index 98% rename from ios/FluentUI.Demo/FluentUI.Demo/Demos/SearchBarDemoController.swift rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/SearchBarDemoController.swift index eb98bdffd1..bfc49d7837 100644 --- a/ios/FluentUI.Demo/FluentUI.Demo/Demos/SearchBarDemoController.swift +++ b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/SearchBarDemoController.swift @@ -10,7 +10,6 @@ class SearchBarDemoController: DemoController, SearchBarDelegate { private struct Constants { static let badgeViewCornerRadius: CGFloat = 10 static let badgeViewSideLength: CGFloat = 20 - static let badgeViewMaxFontSize: CGFloat = 40 static let searchBarStackviewMargin: CGFloat = 16 } @@ -110,7 +109,7 @@ class SearchBarDemoController: DemoController, SearchBarDelegate { badge.tokenSet[.backgroundDisabledColor] = .uiColor { .init(light: GlobalTokens.sharedColor(.purple, .primary)) } badge.tokenSet[.foregroundDisabledColor] = .uiColor { .init(light: GlobalTokens.neutralColor(.white)) } badge.isActive = false - badge.maxFontSize = Constants.badgeViewMaxFontSize + badge.showsLargeContentViewer = true return badge } diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Demos/SegmentedControlDemoController.swift b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/SegmentedControlDemoController.swift similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Demos/SegmentedControlDemoController.swift rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/SegmentedControlDemoController.swift diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Demos/ShadowTokensDemoController.swift b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/ShadowTokensDemoController.swift similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Demos/ShadowTokensDemoController.swift rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/ShadowTokensDemoController.swift diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Demos/ShimmerLinesViewDemoController.swift b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/ShimmerLinesViewDemoController.swift similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Demos/ShimmerLinesViewDemoController.swift rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/ShimmerLinesViewDemoController.swift diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Demos/ShimmerViewDemoController.swift b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/ShimmerViewDemoController.swift similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Demos/ShimmerViewDemoController.swift rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/ShimmerViewDemoController.swift diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Demos/SideTabBarDemoController.swift b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/SideTabBarDemoController.swift similarity index 95% rename from ios/FluentUI.Demo/FluentUI.Demo/Demos/SideTabBarDemoController.swift rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/SideTabBarDemoController.swift index ee1ac82476..53429fa3f0 100644 --- a/ios/FluentUI.Demo/FluentUI.Demo/Demos/SideTabBarDemoController.swift +++ b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/SideTabBarDemoController.swift @@ -81,7 +81,7 @@ class SideTabBarDemoController: DemoController { sideTabBar.topItems[2].isUnreadDotVisible = true var premiumImage = UIImage(named: "ic_fluent_premium_24_regular")! - let primaryColor = view.fluentTheme.color(.brandForegroundTint) + let primaryColor: UIColor = view.fluentTheme.color(.brandForegroundTint) premiumImage = premiumImage.withTintColor(primaryColor, renderingMode: .alwaysOriginal) sideTabBar.bottomItems = [ @@ -226,14 +226,6 @@ class SideTabBarDemoController: DemoController { modifyBadgeNumbers(increment: -1) } - /// Custom presentation logic to let `contentViewController` present the appearance popover. - @objc private func showAppearancePopoverLocal(_ sender: AnyObject) { - guard let contentViewController = contentViewController else { - return - } - super.showAppearancePopover(sender, presenter: contentViewController) - } - private let optionsCellItems: [CellItem] = { return [CellItem(title: "Show Avatar View", type: .boolean, action: #selector(toggleAvatarView(_:)), isOn: true), CellItem(title: "Show top item titles", type: .boolean, action: #selector(toggleShowTopItemTitles(_:))), @@ -241,9 +233,9 @@ class SideTabBarDemoController: DemoController { CellItem(title: "Show badge numbers", type: .boolean, action: #selector(toggleShowBadgeNumbers(_:))), CellItem(title: "Use higher badge numbers", type: .boolean, action: #selector(toggleUseHigherBadgeNumbers(_:))), CellItem(title: "Modify badge numbers", type: .stepper, action: nil), + CellItem(title: "Show Appearance Menu", type: .appearanceMenu, action: nil), CellItem(title: "Show tooltip for Home button", type: .action, action: #selector(showTooltipForHomeButton)), - CellItem(title: "Dismiss", type: .action, action: #selector(dismissSideTabBar)), - CellItem(title: "Show Appearance Popover", type: .action, action: #selector(showAppearancePopoverLocal(_:))) + CellItem(title: "Dismiss", type: .action, action: #selector(dismissSideTabBar)) ] }() } @@ -278,7 +270,8 @@ extension SideTabBarDemoController: UITableViewDataSource { func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let item = optionsCellItems[indexPath.row] - if item.type == .boolean { + switch item.type { + case .boolean: guard let cell = tableView.dequeueReusableCell(withIdentifier: BooleanCell.identifier) as? BooleanCell else { return UITableViewCell() } @@ -288,7 +281,7 @@ extension SideTabBarDemoController: UITableViewDataSource { self?.perform(item.action, with: cell) } return cell - } else if item.type == .action { + case .action: guard let cell = tableView.dequeueReusableCell(withIdentifier: ActionsCell.identifier) as? ActionsCell else { return UITableViewCell() } @@ -298,7 +291,7 @@ extension SideTabBarDemoController: UITableViewDataSource { } cell.bottomSeparatorType = .full return cell - } else if item.type == .stepper { + case .stepper: guard let cell = tableView.dequeueReusableCell(withIdentifier: TableViewCell.identifier) as? TableViewCell else { return UITableViewCell() } @@ -313,9 +306,17 @@ extension SideTabBarDemoController: UITableViewDataSource { cell.setup(title: item.title, customAccessoryView: stackView) cell.titleNumberOfLines = 0 return cell - } + case .appearanceMenu: + guard let cell = tableView.dequeueReusableCell(withIdentifier: TableViewCell.identifier) as? TableViewCell else { + return UITableViewCell() + } + + appearanceControlView.tintColor = view.fluentTheme.color(.foreground1) - return UITableViewCell() + cell.setup(title: item.title, customAccessoryView: appearanceControlView) + cell.titleNumberOfLines = 0 + return cell + } } } @@ -399,6 +400,7 @@ enum CellType { case action case boolean case stepper + case appearanceMenu } struct CellItem { diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Demos/TabBarViewDemoController.swift b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/TabBarViewDemoController.swift similarity index 92% rename from ios/FluentUI.Demo/FluentUI.Demo/Demos/TabBarViewDemoController.swift rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/TabBarViewDemoController.swift index 025d5afad4..8c0db196c9 100644 --- a/ios/FluentUI.Demo/FluentUI.Demo/Demos/TabBarViewDemoController.swift +++ b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/TabBarViewDemoController.swift @@ -19,10 +19,12 @@ class TabBarViewDemoController: DemoController { private var showsItemTitles: Bool { return itemTitleVisibilitySwitch.isOn } private var showBadgeNumbers: Bool { return showBadgeNumbersSwitch.isOn } private var useHigherBadgeNumbers: Bool { return useHigherBadgeNumbersSwitch.isOn } + private var useGradientSelection: Bool { return useGradientSelectionSwitch.isOn } private let itemTitleVisibilitySwitch = BrandedSwitch() private let showBadgeNumbersSwitch = BrandedSwitch() private let useHigherBadgeNumbersSwitch = BrandedSwitch() + private let useGradientSelectionSwitch = BrandedSwitch() private lazy var incrementBadgeButton: Button = { return createButton(title: "+", action: #selector(incrementBadgeNumbers)) @@ -37,6 +39,19 @@ class TabBarViewDemoController: DemoController { private var badgeNumbers: [UInt] = Constants.initialBadgeNumbers private var higherBadgeNumbers: [UInt] = Constants.initialHigherBadgeNumbers + private lazy var gradient: CAGradientLayer = { + let gradientColors = [ + UIColor.red.cgColor, + UIColor.green.cgColor + ] + let colorfulGradient = CAGradientLayer() + colorfulGradient.colors = gradientColors + colorfulGradient.startPoint = CGPoint(x: 0.0, y: 0.0) + colorfulGradient.endPoint = CGPoint(x: 1.0, y: 1.0) + colorfulGradient.type = .axial + return colorfulGradient + }() + override func viewDidLoad() { super.viewDidLoad() @@ -55,6 +70,9 @@ class TabBarViewDemoController: DemoController { addRow(text: "Use higher badge numbers", items: [useHigherBadgeNumbersSwitch], textWidth: Constants.switchSettingTextWidth) useHigherBadgeNumbersSwitch.addTarget(self, action: #selector(handleOnSwitchValueChanged), for: .valueChanged) + addRow(text: "Use gradient selection", items: [useGradientSelectionSwitch], textWidth: Constants.switchSettingTextWidth) + useGradientSelectionSwitch.addTarget(self, action: #selector(handleOnSwitchValueChanged), for: .valueChanged) + addRow(text: "Modify badge numbers", items: [incrementBadgeButton, decrementBadgeButton], textWidth: Constants.buttonSettingTextWidth) setupTabBarView() @@ -94,6 +112,10 @@ class TabBarViewDemoController: DemoController { // If the open file item has been clicked, maintain that state through to the new item updatedTabBarView.items[2].isUnreadDotVisible = isOpenFileUnread + if useGradientSelection { + updatedTabBarView.selectedItemGradient = gradient + } + updatedTabBarView.translatesAutoresizingMaskIntoConstraints = false view.addSubview(updatedTabBarView) diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Demos/TableViewCellDemoController.swift b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/TableViewCellDemoController.swift similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Demos/TableViewCellDemoController.swift rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/TableViewCellDemoController.swift diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Demos/TableViewCellShimmerDemoController.swift b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/TableViewCellShimmerDemoController.swift similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Demos/TableViewCellShimmerDemoController.swift rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/TableViewCellShimmerDemoController.swift diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Demos/TableViewHeaderFooterViewDemoController.swift b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/TableViewHeaderFooterViewDemoController.swift similarity index 93% rename from ios/FluentUI.Demo/FluentUI.Demo/Demos/TableViewHeaderFooterViewDemoController.swift rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/TableViewHeaderFooterViewDemoController.swift index 79bd0dfce8..e54e8d67a0 100644 --- a/ios/FluentUI.Demo/FluentUI.Demo/Demos/TableViewHeaderFooterViewDemoController.swift +++ b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/TableViewHeaderFooterViewDemoController.swift @@ -126,18 +126,16 @@ extension TableViewHeaderFooterViewDemoController { if section.footerLinkText.isEmpty { footer?.setup(style: .footer, title: section.footerText) } else { - let title = NSMutableAttributedString(string: section.footerText) + let title = NSMutableAttributedString(string: section.footerText, attributes: [NSAttributedString.Key.foregroundColor: footer?.tokenSet[.textColor].uiColor ?? .white]) let range = (title.string as NSString).range(of: section.footerLinkText) if range.location != -1 { title.addAttribute(.link, value: "https://github.com/microsoft/fluentui-apple", range: range) } footer?.setup(style: .footer, attributedTitle: title) -#if os(iOS) if section.hasCustomLinkHandler { footer?.delegate = self } -#endif } footer?.titleNumberOfLines = section.numberOfLines footer?.tokenSet.replaceAllOverrides(with: overrideTokens) @@ -165,16 +163,24 @@ extension TableViewHeaderFooterViewDemoController { // MARK: - TableViewHeaderFooterViewDemoController: TableViewHeaderFooterViewDelegate -#if os(iOS) extension TableViewHeaderFooterViewDemoController: TableViewHeaderFooterViewDelegate { + @available(visionOS, deprecated: 1.0) func headerFooterView(_ headerFooterView: TableViewHeaderFooterView, shouldInteractWith URL: URL, in characterRange: NSRange, interaction: UITextItemInteraction) -> Bool { let alertController = UIAlertController(title: "Link tapped", message: nil, preferredStyle: .alert) alertController.addAction(UIAlertAction(title: "OK", style: .default, handler: nil)) present(alertController, animated: true, completion: nil) return false } + + @available(iOS, introduced: 17) + func headerFooterView(_ headerFooterView: TableViewHeaderFooterView, primaryActionFor textItem: UITextItem, defaultAction: UIAction) -> UIAction? { + return UIAction { [weak self] _ in + let alertController = UIAlertController(title: "Link tapped", message: nil, preferredStyle: .alert) + alertController.addAction(UIAlertAction(title: "OK", style: .default, handler: nil)) + self?.present(alertController, animated: true, completion: nil) + } + } } -#endif extension TableViewHeaderFooterViewDemoController: DemoAppearanceDelegate { func themeWideOverrideDidChange(isOverrideEnabled: Bool) { diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Demos/TextFieldDemoController.swift b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/TextFieldDemoController.swift similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Demos/TextFieldDemoController.swift rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/TextFieldDemoController.swift diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Demos/TextFieldObjCDemoController.h b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/TextFieldObjCDemoController.h similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Demos/TextFieldObjCDemoController.h rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/TextFieldObjCDemoController.h diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Demos/TextFieldObjCDemoController.m b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/TextFieldObjCDemoController.m similarity index 98% rename from ios/FluentUI.Demo/FluentUI.Demo/Demos/TextFieldObjCDemoController.m rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/TextFieldObjCDemoController.m index ecb475c429..a47783188b 100644 --- a/ios/FluentUI.Demo/FluentUI.Demo/Demos/TextFieldObjCDemoController.m +++ b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/TextFieldObjCDemoController.m @@ -4,7 +4,7 @@ // #import "TextFieldObjCDemoController.h" -#import +#import @implementation TextFieldObjCDemoController diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Demos/TooltipDemoController.swift b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/TooltipDemoController.swift similarity index 96% rename from ios/FluentUI.Demo/FluentUI.Demo/Demos/TooltipDemoController.swift rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/TooltipDemoController.swift index e095e1fd34..c3f138f66a 100644 --- a/ios/FluentUI.Demo/FluentUI.Demo/Demos/TooltipDemoController.swift +++ b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/TooltipDemoController.swift @@ -19,6 +19,7 @@ class TooltipDemoController: DemoController { navigationItem.titleView = titleView navigationItem.rightBarButtonItems?.append(UIBarButtonItem(title: "Show on title", style: .plain, target: self, action: #selector(showTitleTooltip))) + container.addArrangedSubview(createButton(title: "Show SwiftUI Demo", action: #selector(showSwiftUIDemo))) container.addArrangedSubview(createButton(title: "Show single-line tooltip below", action: #selector(showSingleTooltipBelow))) container.addArrangedSubview(createButton(title: "Show double-line tooltip above", action: #selector(showDoubleTooltipAbove))) container.addArrangedSubview(createButton(title: "Show tooltip with title above", action: #selector(showTooltipWithTitle))) @@ -92,6 +93,11 @@ class TooltipDemoController: DemoController { return container } + @objc func showSwiftUIDemo() { + navigationController?.pushViewController(TooltipDemoControllerSwiftUI(), + animated: true) + } + @objc func showTitleTooltip(sender: UIBarButtonItem) { Tooltip.shared.show(with: "This is a title-based tooltip.", for: titleView, preferredArrowDirection: .up) } diff --git a/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/TooltipDemoController_SwiftUI.swift b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/TooltipDemoController_SwiftUI.swift new file mode 100644 index 0000000000..4a093bfca7 --- /dev/null +++ b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/TooltipDemoController_SwiftUI.swift @@ -0,0 +1,133 @@ +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// + +import FluentUI +import SwiftUI +import UIKit + +class TooltipDemoControllerSwiftUI: DemoHostingController { + init() { + super.init(rootView: AnyView(TooltipDemoView()), title: "Tooltip (SwiftUI)") + } + + @objc required dynamic init?(coder aDecoder: NSCoder) { + preconditionFailure("init(coder:) has not been implemented") + } + + @MainActor required dynamic init(rootView: AnyView) { + preconditionFailure("init(rootView:) has not been implemented") + } +} + +struct TooltipDemoView: View { + var body: some View { + VStack { + tooltipAnchor + demoOptions + } + } + + @ViewBuilder + private var tooltipAnchor: some View { + Button(action: { + showTooltip = true + }, label: { + Text("Tap for Tooltip") + }) + .buttonStyle(FluentButtonStyle(style: .accent)) + .controlSize(.large) + .fixedSize() + .fluentTooltip(message: tooltipMessage, + title: (tooltipTitle != "") ? tooltipTitle : nil, + preferredArrowDirection: arrowDirection, + offset: offset, + dismissMode: dismissMode, + isPresented: $showTooltip) + .padding(GlobalTokens.spacing(.size560)) + } + + @ViewBuilder + private var demoOptions: some View { + Form { + Section("Content") { + HStack(alignment: .firstTextBaseline) { + Text("Title") + Spacer() + TextField("Title", text: $tooltipTitle) + .autocapitalization(.none) + .disableAutocorrection(true) + .multilineTextAlignment(.trailing) + } + .frame(maxWidth: .infinity) + + HStack(alignment: .firstTextBaseline) { + Text("Message") + Spacer() + TextField("Message", text: $tooltipMessage) + .autocapitalization(.none) + .disableAutocorrection(true) + .multilineTextAlignment(.trailing) + } + .frame(maxWidth: .infinity) + } + + Section("Layout") { + Picker("Dismiss Mode", selection: $dismissMode) { + ForEach(Array(Tooltip.DismissMode.allCases.enumerated()), id: \.element) { _, dismissMode in + Text("\(dismissMode.description)").tag(dismissMode) + } + } + + Picker("Arrow Direction", selection: $arrowDirection) { + ForEach(Array(Tooltip.ArrowDirection.allCases.enumerated()), id: \.element) { _, direction in + Text("\(direction.description)").tag(direction) + } + } + + FluentUIDemoToggle(titleKey: "Use offset for origin", isOn: $useOffset) + } + } + } + + private var offset: CGPoint { + useOffset ? .init(x: 20, y: 20) : .zero + } + + @State private var showTooltip: Bool = true + + @State private var tooltipTitle: String = "" + @State private var tooltipMessage: String = "Tooltip message" + @State private var arrowDirection: Tooltip.ArrowDirection = .down + @State private var dismissMode: Tooltip.DismissMode = .tapAnywhere + @State private var useOffset: Bool = false +} + +private extension Tooltip.ArrowDirection { + var description: String { + switch self { + case .up: + return "Up" + case .down: + return "Down" + case .left: + return "Left" + case .right: + return "Right" + } + } +} + +private extension Tooltip.DismissMode { + var description: String { + switch self { + case .tapAnywhere: + return "Tap anywhere" + case .tapOnTooltip: + return "Tap on Tooltip" + case .tapOnTooltipOrAnchor: + return "Tap on Tooltip or Anchor" + } + } +} diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Demos/TwoLineTitleViewDemoController.swift b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/TwoLineTitleViewDemoController.swift similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Demos/TwoLineTitleViewDemoController.swift rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/TwoLineTitleViewDemoController.swift diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Demos/TypographyTokensDemoController.swift b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/TypographyTokensDemoController.swift similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Demos/TypographyTokensDemoController.swift rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/TypographyTokensDemoController.swift diff --git a/ios/FluentUI.Demo/FluentUI.Demo/FluentUI.Demo-Bridging-Header.h b/Demos/FluentUIDemo_iOS/FluentUI.Demo/FluentUI.Demo-Bridging-Header.h similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/FluentUI.Demo-Bridging-Header.h rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/FluentUI.Demo-Bridging-Header.h diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Info.plist b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Info.plist similarity index 97% rename from ios/FluentUI.Demo/FluentUI.Demo/Info.plist rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Info.plist index 9af53e24ba..c11eea77fe 100644 --- a/ios/FluentUI.Demo/FluentUI.Demo/Info.plist +++ b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Info.plist @@ -15,7 +15,7 @@ CFBundlePackageType APPL CFBundleShortVersionString - 1.26.0 + 1.32.0 CFBundleURLTypes @@ -26,7 +26,7 @@ CFBundleVersion - 137.26.0 + 137.32.0 LSRequiresIPhoneOS UIApplicationSceneManifest diff --git a/ios/FluentUI.Demo/FluentUI.Demo/OtherCellsSampleData.swift b/Demos/FluentUIDemo_iOS/FluentUI.Demo/OtherCellsSampleData.swift similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/OtherCellsSampleData.swift rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/OtherCellsSampleData.swift diff --git a/ios/FluentUI.Demo/FluentUI.Demo/ReadmeViewController.swift b/Demos/FluentUIDemo_iOS/FluentUI.Demo/ReadmeViewController.swift similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/ReadmeViewController.swift rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/ReadmeViewController.swift diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/AppIcon.appiconset/ 20.png b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/AppIcon.appiconset/ 20.png similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/AppIcon.appiconset/ 20.png rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/AppIcon.appiconset/ 20.png diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/AppIcon.appiconset/ 20_2x-1.png b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/AppIcon.appiconset/ 20_2x-1.png similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/AppIcon.appiconset/ 20_2x-1.png rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/AppIcon.appiconset/ 20_2x-1.png diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/AppIcon.appiconset/ 20_2x.png b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/AppIcon.appiconset/ 20_2x.png similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/AppIcon.appiconset/ 20_2x.png rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/AppIcon.appiconset/ 20_2x.png diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/AppIcon.appiconset/ 20_3x.png b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/AppIcon.appiconset/ 20_3x.png similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/AppIcon.appiconset/ 20_3x.png rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/AppIcon.appiconset/ 20_3x.png diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/AppIcon.appiconset/ 29.png b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/AppIcon.appiconset/ 29.png similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/AppIcon.appiconset/ 29.png rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/AppIcon.appiconset/ 29.png diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/AppIcon.appiconset/ 29_2x-1.png b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/AppIcon.appiconset/ 29_2x-1.png similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/AppIcon.appiconset/ 29_2x-1.png rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/AppIcon.appiconset/ 29_2x-1.png diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/AppIcon.appiconset/ 29_2x.png b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/AppIcon.appiconset/ 29_2x.png similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/AppIcon.appiconset/ 29_2x.png rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/AppIcon.appiconset/ 29_2x.png diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/AppIcon.appiconset/ 29_3x.png b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/AppIcon.appiconset/ 29_3x.png similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/AppIcon.appiconset/ 29_3x.png rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/AppIcon.appiconset/ 29_3x.png diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/AppIcon.appiconset/ 40.png b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/AppIcon.appiconset/ 40.png similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/AppIcon.appiconset/ 40.png rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/AppIcon.appiconset/ 40.png diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/AppIcon.appiconset/ 40_2x-1.png b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/AppIcon.appiconset/ 40_2x-1.png similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/AppIcon.appiconset/ 40_2x-1.png rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/AppIcon.appiconset/ 40_2x-1.png diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/AppIcon.appiconset/ 40_2x.png b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/AppIcon.appiconset/ 40_2x.png similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/AppIcon.appiconset/ 40_2x.png rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/AppIcon.appiconset/ 40_2x.png diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/AppIcon.appiconset/ 40_3x.png b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/AppIcon.appiconset/ 40_3x.png similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/AppIcon.appiconset/ 40_3x.png rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/AppIcon.appiconset/ 40_3x.png diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/AppIcon.appiconset/ 60_2x.png b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/AppIcon.appiconset/ 60_2x.png similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/AppIcon.appiconset/ 60_2x.png rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/AppIcon.appiconset/ 60_2x.png diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/AppIcon.appiconset/ 60_3x.png b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/AppIcon.appiconset/ 60_3x.png similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/AppIcon.appiconset/ 60_3x.png rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/AppIcon.appiconset/ 60_3x.png diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/AppIcon.appiconset/ 76.png b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/AppIcon.appiconset/ 76.png similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/AppIcon.appiconset/ 76.png rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/AppIcon.appiconset/ 76.png diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/AppIcon.appiconset/ 76_2x.png b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/AppIcon.appiconset/ 76_2x.png similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/AppIcon.appiconset/ 76_2x.png rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/AppIcon.appiconset/ 76_2x.png diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/AppIcon.appiconset/ 83.5_2x.png b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/AppIcon.appiconset/ 83.5_2x.png similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/AppIcon.appiconset/ 83.5_2x.png rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/AppIcon.appiconset/ 83.5_2x.png diff --git a/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/AppIcon.appiconset/ App Store.png b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/AppIcon.appiconset/ App Store.png new file mode 100644 index 0000000000..20093cba80 Binary files /dev/null and b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/AppIcon.appiconset/ App Store.png differ diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/AppLogo.imageset/ App Store.png b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/AppLogo.imageset/ App Store.png similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/AppLogo.imageset/ App Store.png rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/AppLogo.imageset/ App Store.png diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/AppLogo.imageset/Contents.json b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/AppLogo.imageset/Contents.json similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/AppLogo.imageset/Contents.json rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/AppLogo.imageset/Contents.json diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Avatar/Contents.json b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Avatar/Contents.json similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Avatar/Contents.json rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Avatar/Contents.json diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_allan_munger.imageset/Contents.json b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_allan_munger.imageset/Contents.json similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_allan_munger.imageset/Contents.json rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_allan_munger.imageset/Contents.json diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_allan_munger.imageset/avatar_allan_munger.png b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_allan_munger.imageset/avatar_allan_munger.png similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_allan_munger.imageset/avatar_allan_munger.png rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_allan_munger.imageset/avatar_allan_munger.png diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_amanda_brady.imageset/Contents.json b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_amanda_brady.imageset/Contents.json similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_amanda_brady.imageset/Contents.json rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_amanda_brady.imageset/Contents.json diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_amanda_brady.imageset/avatar_amanda_brady.png b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_amanda_brady.imageset/avatar_amanda_brady.png similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_amanda_brady.imageset/avatar_amanda_brady.png rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_amanda_brady.imageset/avatar_amanda_brady.png diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_ashley_mccarthy.imageset/Contents.json b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_ashley_mccarthy.imageset/Contents.json similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_ashley_mccarthy.imageset/Contents.json rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_ashley_mccarthy.imageset/Contents.json diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_ashley_mccarthy.imageset/avatar_ashley_mccarthy.png b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_ashley_mccarthy.imageset/avatar_ashley_mccarthy.png similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_ashley_mccarthy.imageset/avatar_ashley_mccarthy.png rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_ashley_mccarthy.imageset/avatar_ashley_mccarthy.png diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_cecil_folk.imageset/Contents.json b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_cecil_folk.imageset/Contents.json similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_cecil_folk.imageset/Contents.json rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_cecil_folk.imageset/Contents.json diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_cecil_folk.imageset/avatar_cecil_folk.png b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_cecil_folk.imageset/avatar_cecil_folk.png similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_cecil_folk.imageset/avatar_cecil_folk.png rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_cecil_folk.imageset/avatar_cecil_folk.png diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_celeste_burton.imageset/Contents.json b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_celeste_burton.imageset/Contents.json similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_celeste_burton.imageset/Contents.json rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_celeste_burton.imageset/Contents.json diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_celeste_burton.imageset/avatar_celeste_burton.png b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_celeste_burton.imageset/avatar_celeste_burton.png similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_celeste_burton.imageset/avatar_celeste_burton.png rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_celeste_burton.imageset/avatar_celeste_burton.png diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_colin_ballinger.imageset/Contents.json b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_colin_ballinger.imageset/Contents.json similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_colin_ballinger.imageset/Contents.json rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_colin_ballinger.imageset/Contents.json diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_colin_ballinger.imageset/avatar_colin_ballinger.png b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_colin_ballinger.imageset/avatar_colin_ballinger.png similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_colin_ballinger.imageset/avatar_colin_ballinger.png rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_colin_ballinger.imageset/avatar_colin_ballinger.png diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_daisy_phillips.imageset/Contents.json b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_daisy_phillips.imageset/Contents.json similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_daisy_phillips.imageset/Contents.json rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_daisy_phillips.imageset/Contents.json diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_daisy_phillips.imageset/avatar_daisy_phillips.png b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_daisy_phillips.imageset/avatar_daisy_phillips.png similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_daisy_phillips.imageset/avatar_daisy_phillips.png rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_daisy_phillips.imageset/avatar_daisy_phillips.png diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_elvia_atkins.imageset/Contents.json b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_elvia_atkins.imageset/Contents.json similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_elvia_atkins.imageset/Contents.json rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_elvia_atkins.imageset/Contents.json diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_elvia_atkins.imageset/avatar_elvia_atkins.png b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_elvia_atkins.imageset/avatar_elvia_atkins.png similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_elvia_atkins.imageset/avatar_elvia_atkins.png rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_elvia_atkins.imageset/avatar_elvia_atkins.png diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_henry_brill.imageset/Contents.json b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_henry_brill.imageset/Contents.json similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_henry_brill.imageset/Contents.json rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_henry_brill.imageset/Contents.json diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_henry_brill.imageset/avatar_henry_brill.png b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_henry_brill.imageset/avatar_henry_brill.png similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_henry_brill.imageset/avatar_henry_brill.png rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_henry_brill.imageset/avatar_henry_brill.png diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_isaac_fielder.imageset/Contents.json b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_isaac_fielder.imageset/Contents.json similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_isaac_fielder.imageset/Contents.json rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_isaac_fielder.imageset/Contents.json diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_isaac_fielder.imageset/avatar_isaac_fielder.png b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_isaac_fielder.imageset/avatar_isaac_fielder.png similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_isaac_fielder.imageset/avatar_isaac_fielder.png rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_isaac_fielder.imageset/avatar_isaac_fielder.png diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_johnie_mcconnell.imageset/Contents.json b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_johnie_mcconnell.imageset/Contents.json similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_johnie_mcconnell.imageset/Contents.json rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_johnie_mcconnell.imageset/Contents.json diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_johnie_mcconnell.imageset/avatar_johnie_mcconnell.png b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_johnie_mcconnell.imageset/avatar_johnie_mcconnell.png similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_johnie_mcconnell.imageset/avatar_johnie_mcconnell.png rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_johnie_mcconnell.imageset/avatar_johnie_mcconnell.png diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_kat_larsson.imageset/Contents.json b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_kat_larsson.imageset/Contents.json similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_kat_larsson.imageset/Contents.json rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_kat_larsson.imageset/Contents.json diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_kat_larsson.imageset/avatar_kat_larsson.png b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_kat_larsson.imageset/avatar_kat_larsson.png similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_kat_larsson.imageset/avatar_kat_larsson.png rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_kat_larsson.imageset/avatar_kat_larsson.png diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_katri_ahokas.imageset/Contents.json b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_katri_ahokas.imageset/Contents.json similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_katri_ahokas.imageset/Contents.json rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_katri_ahokas.imageset/Contents.json diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_katri_ahokas.imageset/avatar_katri_ahokas.png b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_katri_ahokas.imageset/avatar_katri_ahokas.png similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_katri_ahokas.imageset/avatar_katri_ahokas.png rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_katri_ahokas.imageset/avatar_katri_ahokas.png diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_lydia_bauer.imageset/Contents.json b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_lydia_bauer.imageset/Contents.json similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_lydia_bauer.imageset/Contents.json rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_lydia_bauer.imageset/Contents.json diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_lydia_bauer.imageset/avatar_lydia_bauer.png b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_lydia_bauer.imageset/avatar_lydia_bauer.png similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_lydia_bauer.imageset/avatar_lydia_bauer.png rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_lydia_bauer.imageset/avatar_lydia_bauer.png diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_mauricio_august.imageset/Contents.json b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_mauricio_august.imageset/Contents.json similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_mauricio_august.imageset/Contents.json rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_mauricio_august.imageset/Contents.json diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_mauricio_august.imageset/avatar_mauricio_august.png b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_mauricio_august.imageset/avatar_mauricio_august.png similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_mauricio_august.imageset/avatar_mauricio_august.png rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_mauricio_august.imageset/avatar_mauricio_august.png diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_miguel_garcia.imageset/Contents.json b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_miguel_garcia.imageset/Contents.json similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_miguel_garcia.imageset/Contents.json rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_miguel_garcia.imageset/Contents.json diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_miguel_garcia.imageset/avatar_miguel_garcia.png b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_miguel_garcia.imageset/avatar_miguel_garcia.png similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_miguel_garcia.imageset/avatar_miguel_garcia.png rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_miguel_garcia.imageset/avatar_miguel_garcia.png diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_robert_tolbert.imageset/Contents.json b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_robert_tolbert.imageset/Contents.json similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_robert_tolbert.imageset/Contents.json rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_robert_tolbert.imageset/Contents.json diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_robert_tolbert.imageset/avatar_robert_tolbert.png b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_robert_tolbert.imageset/avatar_robert_tolbert.png similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_robert_tolbert.imageset/avatar_robert_tolbert.png rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_robert_tolbert.imageset/avatar_robert_tolbert.png diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_robin_counts.imageset/Contents.json b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_robin_counts.imageset/Contents.json similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_robin_counts.imageset/Contents.json rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_robin_counts.imageset/Contents.json diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_robin_counts.imageset/avatar_robin_counts.png b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_robin_counts.imageset/avatar_robin_counts.png similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_robin_counts.imageset/avatar_robin_counts.png rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_robin_counts.imageset/avatar_robin_counts.png diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_tim_deboer.imageset/Contents.json b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_tim_deboer.imageset/Contents.json similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_tim_deboer.imageset/Contents.json rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_tim_deboer.imageset/Contents.json diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_tim_deboer.imageset/avatar_tim_deboer.png b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_tim_deboer.imageset/avatar_tim_deboer.png similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_tim_deboer.imageset/avatar_tim_deboer.png rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Avatar/avatar_tim_deboer.imageset/avatar_tim_deboer.png diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Avatar/site.imageset/Contents.json b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Avatar/site.imageset/Contents.json similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Avatar/site.imageset/Contents.json rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Avatar/site.imageset/Contents.json diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Avatar/site.imageset/site.png b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Avatar/site.imageset/site.png similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Avatar/site.imageset/site.png rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Avatar/site.imageset/site.png diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Avatar/thumbs_up_3d_default.imageset/Contents.json b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Avatar/thumbs_up_3d_default.imageset/Contents.json similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Avatar/thumbs_up_3d_default.imageset/Contents.json rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Avatar/thumbs_up_3d_default.imageset/Contents.json diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Avatar/thumbs_up_3d_default.imageset/thumbs_up_3d_default.png b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Avatar/thumbs_up_3d_default.imageset/thumbs_up_3d_default.png similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Avatar/thumbs_up_3d_default.imageset/thumbs_up_3d_default.png rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Avatar/thumbs_up_3d_default.imageset/thumbs_up_3d_default.png diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Contents.json b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Button/Contents.json similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Contents.json rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Button/Contents.json diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Button/Placeholder_20.imageset/Contents.json b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Button/Placeholder_20.imageset/Contents.json similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Button/Placeholder_20.imageset/Contents.json rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Button/Placeholder_20.imageset/Contents.json diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Button/Placeholder_20.imageset/ic_fluent_circle_20_regular.pdf b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Button/Placeholder_20.imageset/ic_fluent_circle_20_regular.pdf similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Button/Placeholder_20.imageset/ic_fluent_circle_20_regular.pdf rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Button/Placeholder_20.imageset/ic_fluent_circle_20_regular.pdf diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Button/Placeholder_24.imageset/Contents.json b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Button/Placeholder_24.imageset/Contents.json similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Button/Placeholder_24.imageset/Contents.json rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Button/Placeholder_24.imageset/Contents.json diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Button/Placeholder_24.imageset/ic_fluent_circle_24_regular.pdf b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Button/Placeholder_24.imageset/ic_fluent_circle_24_regular.pdf similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Button/Placeholder_24.imageset/ic_fluent_circle_24_regular.pdf rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Button/Placeholder_24.imageset/ic_fluent_circle_24_regular.pdf diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Cities/Contents.json b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Cities/Contents.json similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Cities/Contents.json rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Cities/Contents.json diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Cities/Las Vegas.imageset/Contents.json b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Cities/Las Vegas.imageset/Contents.json similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Cities/Las Vegas.imageset/Contents.json rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Cities/Las Vegas.imageset/Contents.json diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Cities/Las Vegas.imageset/Las Vegas_3x.png b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Cities/Las Vegas.imageset/Las Vegas_3x.png similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Cities/Las Vegas.imageset/Las Vegas_3x.png rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Cities/Las Vegas.imageset/Las Vegas_3x.png diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Cities/Montreal.imageset/Contents.json b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Cities/Montreal.imageset/Contents.json similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Cities/Montreal.imageset/Contents.json rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Cities/Montreal.imageset/Contents.json diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Cities/Montreal.imageset/Montreal_3x.png b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Cities/Montreal.imageset/Montreal_3x.png similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Cities/Montreal.imageset/Montreal_3x.png rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Cities/Montreal.imageset/Montreal_3x.png diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Cities/Phoenix.imageset/Contents.json b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Cities/Phoenix.imageset/Contents.json similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Cities/Phoenix.imageset/Contents.json rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Cities/Phoenix.imageset/Contents.json diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Cities/Phoenix.imageset/Phoenix_3x.png b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Cities/Phoenix.imageset/Phoenix_3x.png similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Cities/Phoenix.imageset/Phoenix_3x.png rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Cities/Phoenix.imageset/Phoenix_3x.png diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Cities/San Francisco.imageset/Contents.json b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Cities/San Francisco.imageset/Contents.json similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Cities/San Francisco.imageset/Contents.json rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Cities/San Francisco.imageset/Contents.json diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Cities/San Francisco.imageset/San Francisco_3x.png b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Cities/San Francisco.imageset/San Francisco_3x.png similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Cities/San Francisco.imageset/San Francisco_3x.png rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Cities/San Francisco.imageset/San Francisco_3x.png diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Cities/Seattle.imageset/Contents.json b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Cities/Seattle.imageset/Contents.json similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Cities/Seattle.imageset/Contents.json rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Cities/Seattle.imageset/Contents.json diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Cities/Seattle.imageset/Seattle_3x.png b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Cities/Seattle.imageset/Seattle_3x.png similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Cities/Seattle.imageset/Seattle_3x.png rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Cities/Seattle.imageset/Seattle_3x.png diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Cities/Toronto.imageset/Contents.json b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Cities/Toronto.imageset/Contents.json similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Cities/Toronto.imageset/Contents.json rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Cities/Toronto.imageset/Contents.json diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Cities/Toronto.imageset/Toronto_3x.jpg b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Cities/Toronto.imageset/Toronto_3x.jpg similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Cities/Toronto.imageset/Toronto_3x.jpg rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Cities/Toronto.imageset/Toronto_3x.jpg diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Cities/Vancouver.imageset/Contents.json b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Cities/Vancouver.imageset/Contents.json similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Cities/Vancouver.imageset/Contents.json rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Cities/Vancouver.imageset/Contents.json diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Cities/Vancouver.imageset/Vancouver_3x.png b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Cities/Vancouver.imageset/Vancouver_3x.png similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Cities/Vancouver.imageset/Vancouver_3x.png rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Cities/Vancouver.imageset/Vancouver_3x.png diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Colors/Contents.json b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Colors/Contents.json similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Colors/Contents.json rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Colors/Contents.json diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Colors/DemoPrimaryColor.colorset/Contents.json b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Colors/DemoPrimaryColor.colorset/Contents.json similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Colors/DemoPrimaryColor.colorset/Contents.json rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Colors/DemoPrimaryColor.colorset/Contents.json diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Colors/DemoPrimaryShade10Color.colorset/Contents.json b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Colors/DemoPrimaryShade10Color.colorset/Contents.json similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Colors/DemoPrimaryShade10Color.colorset/Contents.json rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Colors/DemoPrimaryShade10Color.colorset/Contents.json diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Colors/DemoPrimaryShade20Color.colorset/Contents.json b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Colors/DemoPrimaryShade20Color.colorset/Contents.json similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Colors/DemoPrimaryShade20Color.colorset/Contents.json rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Colors/DemoPrimaryShade20Color.colorset/Contents.json diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Colors/DemoPrimaryShade30Color.colorset/Contents.json b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Colors/DemoPrimaryShade30Color.colorset/Contents.json similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Colors/DemoPrimaryShade30Color.colorset/Contents.json rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Colors/DemoPrimaryShade30Color.colorset/Contents.json diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Colors/DemoPrimaryTint10Color.colorset/Contents.json b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Colors/DemoPrimaryTint10Color.colorset/Contents.json similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Colors/DemoPrimaryTint10Color.colorset/Contents.json rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Colors/DemoPrimaryTint10Color.colorset/Contents.json diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Colors/DemoPrimaryTint20Color.colorset/Contents.json b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Colors/DemoPrimaryTint20Color.colorset/Contents.json similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Colors/DemoPrimaryTint20Color.colorset/Contents.json rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Colors/DemoPrimaryTint20Color.colorset/Contents.json diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Colors/DemoPrimaryTint30Color.colorset/Contents.json b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Colors/DemoPrimaryTint30Color.colorset/Contents.json similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Colors/DemoPrimaryTint30Color.colorset/Contents.json rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Colors/DemoPrimaryTint30Color.colorset/Contents.json diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Colors/DemoPrimaryTint40Color.colorset/Contents.json b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Colors/DemoPrimaryTint40Color.colorset/Contents.json similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Colors/DemoPrimaryTint40Color.colorset/Contents.json rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Colors/DemoPrimaryTint40Color.colorset/Contents.json diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/HUD/Contents.json b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/Contents.json similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/HUD/Contents.json rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/Contents.json diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/add24Regular.imageset/Contents.json b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/add24Regular.imageset/Contents.json similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/add24Regular.imageset/Contents.json rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/add24Regular.imageset/Contents.json diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/add24Regular.imageset/add24Regular.pdf b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/add24Regular.imageset/add24Regular.pdf similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/add24Regular.imageset/add24Regular.pdf rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/add24Regular.imageset/add24Regular.pdf diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/arrowRedo24Filled.imageset/Contents.json b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/arrowRedo24Filled.imageset/Contents.json similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/arrowRedo24Filled.imageset/Contents.json rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/arrowRedo24Filled.imageset/Contents.json diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/arrowRedo24Filled.imageset/arrowRedo24Filled.pdf b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/arrowRedo24Filled.imageset/arrowRedo24Filled.pdf similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/arrowRedo24Filled.imageset/arrowRedo24Filled.pdf rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/arrowRedo24Filled.imageset/arrowRedo24Filled.pdf diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/arrowUndo24Regular.imageset/Contents.json b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/arrowUndo24Regular.imageset/Contents.json similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/arrowUndo24Regular.imageset/Contents.json rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/arrowUndo24Regular.imageset/Contents.json diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/arrowUndo24Regular.imageset/arrowUndo24Regular.pdf b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/arrowUndo24Regular.imageset/arrowUndo24Regular.pdf similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/arrowUndo24Regular.imageset/arrowUndo24Regular.pdf rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/arrowUndo24Regular.imageset/arrowUndo24Regular.pdf diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/calendar24Regular.imageset/Contents.json b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/calendar24Regular.imageset/Contents.json similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/calendar24Regular.imageset/Contents.json rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/calendar24Regular.imageset/Contents.json diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/calendar24Regular.imageset/calendar24Regular.pdf b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/calendar24Regular.imageset/calendar24Regular.pdf similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/calendar24Regular.imageset/calendar24Regular.pdf rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/calendar24Regular.imageset/calendar24Regular.pdf diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/copy24Regular.imageset/Contents.json b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/copy24Regular.imageset/Contents.json similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/copy24Regular.imageset/Contents.json rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/copy24Regular.imageset/Contents.json diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/copy24Regular.imageset/copy24Regular.pdf b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/copy24Regular.imageset/copy24Regular.pdf similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/copy24Regular.imageset/copy24Regular.pdf rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/copy24Regular.imageset/copy24Regular.pdf diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/delete24Filled.imageset/Contents.json b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/delete24Filled.imageset/Contents.json similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/delete24Filled.imageset/Contents.json rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/delete24Filled.imageset/Contents.json diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/delete24Filled.imageset/ic_fluent_delete_24_filled.pdf b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/delete24Filled.imageset/ic_fluent_delete_24_filled.pdf similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/delete24Filled.imageset/ic_fluent_delete_24_filled.pdf rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/delete24Filled.imageset/ic_fluent_delete_24_filled.pdf diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/delete24Regular.imageset/Contents.json b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/delete24Regular.imageset/Contents.json similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/delete24Regular.imageset/Contents.json rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/delete24Regular.imageset/Contents.json diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/delete24Regular.imageset/delete24Regular.pdf b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/delete24Regular.imageset/delete24Regular.pdf similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/delete24Regular.imageset/delete24Regular.pdf rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/delete24Regular.imageset/delete24Regular.pdf diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/keyboardDock24Regular.imageset/Contents.json b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/keyboardDock24Regular.imageset/Contents.json similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/keyboardDock24Regular.imageset/Contents.json rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/keyboardDock24Regular.imageset/Contents.json diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/keyboardDock24Regular.imageset/keyboardDock24Regular.pdf b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/keyboardDock24Regular.imageset/keyboardDock24Regular.pdf similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/keyboardDock24Regular.imageset/keyboardDock24Regular.pdf rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/keyboardDock24Regular.imageset/keyboardDock24Regular.pdf diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/link24Regular.imageset/Contents.json b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/link24Regular.imageset/Contents.json similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/link24Regular.imageset/Contents.json rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/link24Regular.imageset/Contents.json diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/link24Regular.imageset/link24Regular.pdf b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/link24Regular.imageset/link24Regular.pdf similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/link24Regular.imageset/link24Regular.pdf rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/link24Regular.imageset/link24Regular.pdf diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/mention24Regular.imageset/Contents.json b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/mention24Regular.imageset/Contents.json similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/mention24Regular.imageset/Contents.json rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/mention24Regular.imageset/Contents.json diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/mention24Regular.imageset/mention24Regular.pdf b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/mention24Regular.imageset/mention24Regular.pdf similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/mention24Regular.imageset/mention24Regular.pdf rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/mention24Regular.imageset/mention24Regular.pdf diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/text24Regular.imageset/Contents.json b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/text24Regular.imageset/Contents.json similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/text24Regular.imageset/Contents.json rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/text24Regular.imageset/Contents.json diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/text24Regular.imageset/text24Regular.pdf b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/text24Regular.imageset/text24Regular.pdf similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/text24Regular.imageset/text24Regular.pdf rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/text24Regular.imageset/text24Regular.pdf diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/textBold24Regular.imageset/Contents.json b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/textBold24Regular.imageset/Contents.json similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/textBold24Regular.imageset/Contents.json rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/textBold24Regular.imageset/Contents.json diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/textBold24Regular.imageset/textBold24Regular.pdf b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/textBold24Regular.imageset/textBold24Regular.pdf similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/textBold24Regular.imageset/textBold24Regular.pdf rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/textBold24Regular.imageset/textBold24Regular.pdf diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/textBulletList24Regular.imageset/Contents.json b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/textBulletList24Regular.imageset/Contents.json similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/textBulletList24Regular.imageset/Contents.json rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/textBulletList24Regular.imageset/Contents.json diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/textBulletList24Regular.imageset/textBulletList24Regular.pdf b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/textBulletList24Regular.imageset/textBulletList24Regular.pdf similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/textBulletList24Regular.imageset/textBulletList24Regular.pdf rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/textBulletList24Regular.imageset/textBulletList24Regular.pdf diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/textChecklistListLtr24Regular.imageset/Contents.json b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/textChecklistListLtr24Regular.imageset/Contents.json similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/textChecklistListLtr24Regular.imageset/Contents.json rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/textChecklistListLtr24Regular.imageset/Contents.json diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/textChecklistListLtr24Regular.imageset/textChecklistListLtr24Regular.pdf b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/textChecklistListLtr24Regular.imageset/textChecklistListLtr24Regular.pdf similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/textChecklistListLtr24Regular.imageset/textChecklistListLtr24Regular.pdf rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/textChecklistListLtr24Regular.imageset/textChecklistListLtr24Regular.pdf diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/textItalic24Regular.imageset/Contents.json b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/textItalic24Regular.imageset/Contents.json similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/textItalic24Regular.imageset/Contents.json rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/textItalic24Regular.imageset/Contents.json diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/textItalic24Regular.imageset/textItalic24Regular.pdf b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/textItalic24Regular.imageset/textItalic24Regular.pdf similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/textItalic24Regular.imageset/textItalic24Regular.pdf rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/textItalic24Regular.imageset/textItalic24Regular.pdf diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/textNumberListLtr24Regular.imageset/Contents.json b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/textNumberListLtr24Regular.imageset/Contents.json similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/textNumberListLtr24Regular.imageset/Contents.json rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/textNumberListLtr24Regular.imageset/Contents.json diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/textNumberListLtr24Regular.imageset/textNumberListLtr24Regular.pdf b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/textNumberListLtr24Regular.imageset/textNumberListLtr24Regular.pdf similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/textNumberListLtr24Regular.imageset/textNumberListLtr24Regular.pdf rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/textNumberListLtr24Regular.imageset/textNumberListLtr24Regular.pdf diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/textStrikethrough24Regular.imageset/Contents.json b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/textStrikethrough24Regular.imageset/Contents.json similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/textStrikethrough24Regular.imageset/Contents.json rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/textStrikethrough24Regular.imageset/Contents.json diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/textStrikethrough24Regular.imageset/textStrikethrough24Regular.pdf b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/textStrikethrough24Regular.imageset/textStrikethrough24Regular.pdf similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/textStrikethrough24Regular.imageset/textStrikethrough24Regular.pdf rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/textStrikethrough24Regular.imageset/textStrikethrough24Regular.pdf diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/textUnderline24Regular.imageset/Contents.json b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/textUnderline24Regular.imageset/Contents.json similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/textUnderline24Regular.imageset/Contents.json rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/textUnderline24Regular.imageset/Contents.json diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/textUnderline24Regular.imageset/textUnderline24Regular.pdf b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/textUnderline24Regular.imageset/textUnderline24Regular.pdf similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/textUnderline24Regular.imageset/textUnderline24Regular.pdf rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/CommandBar/textUnderline24Regular.imageset/textUnderline24Regular.pdf diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Navigation/Contents.json b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Contents.json similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Navigation/Contents.json rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Contents.json diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/TabBarView/Contents.json b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/HUD/Contents.json similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/TabBarView/Contents.json rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/HUD/Contents.json diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/HUD/flag-48x48.imageset/Contents.json b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/HUD/flag-48x48.imageset/Contents.json similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/HUD/flag-48x48.imageset/Contents.json rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/HUD/flag-48x48.imageset/Contents.json diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/HUD/flag-48x48.imageset/ic_fluent_flag_48_regular.pdf b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/HUD/flag-48x48.imageset/ic_fluent_flag_48_regular.pdf similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/HUD/flag-48x48.imageset/ic_fluent_flag_48_regular.pdf rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/HUD/flag-48x48.imageset/ic_fluent_flag_48_regular.pdf diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/MicrosoftLogo.imageset/Contents.json b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/MicrosoftLogo.imageset/Contents.json similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/MicrosoftLogo.imageset/Contents.json rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/MicrosoftLogo.imageset/Contents.json diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/MicrosoftLogo.imageset/msLogo.pdf b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/MicrosoftLogo.imageset/msLogo.pdf similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/MicrosoftLogo.imageset/msLogo.pdf rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/MicrosoftLogo.imageset/msLogo.pdf diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/MicrosoftLogo.imageset/msLogoDarkMode.pdf b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/MicrosoftLogo.imageset/msLogoDarkMode.pdf similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/MicrosoftLogo.imageset/msLogoDarkMode.pdf rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/MicrosoftLogo.imageset/msLogoDarkMode.pdf diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/TableViewHeaderFooterView/Contents.json b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Navigation/Contents.json similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/TableViewHeaderFooterView/Contents.json rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Navigation/Contents.json diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Navigation/ic_fluent_filter_28.imageset/Contents.json b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Navigation/ic_fluent_filter_28.imageset/Contents.json similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Navigation/ic_fluent_filter_28.imageset/Contents.json rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Navigation/ic_fluent_filter_28.imageset/Contents.json diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Navigation/ic_fluent_filter_28.imageset/ic_fluent_filter_28_regular.pdf b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Navigation/ic_fluent_filter_28.imageset/ic_fluent_filter_28_regular.pdf similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Navigation/ic_fluent_filter_28.imageset/ic_fluent_filter_28_regular.pdf rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Navigation/ic_fluent_filter_28.imageset/ic_fluent_filter_28_regular.pdf diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Navigation/ic_fluent_settings_24_regular.imageset/Contents.json b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Navigation/ic_fluent_settings_24_regular.imageset/Contents.json similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Navigation/ic_fluent_settings_24_regular.imageset/Contents.json rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Navigation/ic_fluent_settings_24_regular.imageset/Contents.json diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Navigation/ic_fluent_settings_24_regular.imageset/ic_fluent_settings_24_regular.pdf b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Navigation/ic_fluent_settings_24_regular.imageset/ic_fluent_settings_24_regular.pdf similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Navigation/ic_fluent_settings_24_regular.imageset/ic_fluent_settings_24_regular.pdf rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Navigation/ic_fluent_settings_24_regular.imageset/ic_fluent_settings_24_regular.pdf diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Navigation/ic_fluent_star_16_regular.imageset/Contents.json b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Navigation/ic_fluent_star_16_regular.imageset/Contents.json similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Navigation/ic_fluent_star_16_regular.imageset/Contents.json rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Navigation/ic_fluent_star_16_regular.imageset/Contents.json diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Navigation/ic_fluent_star_16_regular.imageset/ic_fluent_star_16_regular.pdf b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Navigation/ic_fluent_star_16_regular.imageset/ic_fluent_star_16_regular.pdf similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Navigation/ic_fluent_star_16_regular.imageset/ic_fluent_star_16_regular.pdf rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Navigation/ic_fluent_star_16_regular.imageset/ic_fluent_star_16_regular.pdf diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Navigation/ic_fluent_star_24_regular.imageset/Contents.json b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Navigation/ic_fluent_star_24_regular.imageset/Contents.json similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Navigation/ic_fluent_star_24_regular.imageset/Contents.json rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Navigation/ic_fluent_star_24_regular.imageset/Contents.json diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Navigation/ic_fluent_star_24_regular.imageset/ic_fluent_star_24_regular.pdf b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Navigation/ic_fluent_star_24_regular.imageset/ic_fluent_star_24_regular.pdf similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/Navigation/ic_fluent_star_24_regular.imageset/ic_fluent_star_24_regular.pdf rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/Navigation/ic_fluent_star_24_regular.imageset/ic_fluent_star_24_regular.pdf diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/NotificationView/Contents.json b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/NotificationView/Contents.json similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/NotificationView/Contents.json rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/NotificationView/Contents.json diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/NotificationView/play-in-circle-24x24.imageset/Contents.json b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/NotificationView/play-in-circle-24x24.imageset/Contents.json similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/NotificationView/play-in-circle-24x24.imageset/Contents.json rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/NotificationView/play-in-circle-24x24.imageset/Contents.json diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/NotificationView/play-in-circle-24x24.imageset/ic_fluent_play_circle_24_regular.pdf b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/NotificationView/play-in-circle-24x24.imageset/ic_fluent_play_circle_24_regular.pdf similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/NotificationView/play-in-circle-24x24.imageset/ic_fluent_play_circle_24_regular.pdf rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/NotificationView/play-in-circle-24x24.imageset/ic_fluent_play_circle_24_regular.pdf diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/PlaceholderImage.imageset/Contents.json b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/PlaceholderImage.imageset/Contents.json similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/PlaceholderImage.imageset/Contents.json rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/PlaceholderImage.imageset/Contents.json diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/PlaceholderImage.imageset/PlaceholderImage.pdf b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/PlaceholderImage.imageset/PlaceholderImage.pdf similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/PlaceholderImage.imageset/PlaceholderImage.pdf rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/PlaceholderImage.imageset/PlaceholderImage.pdf diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/PopupMenu/3-day-view-24x24.imageset/Contents.json b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/PopupMenu/3-day-view-24x24.imageset/Contents.json similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/PopupMenu/3-day-view-24x24.imageset/Contents.json rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/PopupMenu/3-day-view-24x24.imageset/Contents.json diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/PopupMenu/3-day-view-24x24.imageset/ic_fluent_calendar_3_day_24_regular.pdf b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/PopupMenu/3-day-view-24x24.imageset/ic_fluent_calendar_3_day_24_regular.pdf similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/PopupMenu/3-day-view-24x24.imageset/ic_fluent_calendar_3_day_24_regular.pdf rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/PopupMenu/3-day-view-24x24.imageset/ic_fluent_calendar_3_day_24_regular.pdf diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/PopupMenu/3-day-view-28x28.imageset/Contents.json b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/PopupMenu/3-day-view-28x28.imageset/Contents.json similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/PopupMenu/3-day-view-28x28.imageset/Contents.json rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/PopupMenu/3-day-view-28x28.imageset/Contents.json diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/PopupMenu/3-day-view-28x28.imageset/ic_fluent_calendar_3_day_28_regular.pdf b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/PopupMenu/3-day-view-28x28.imageset/ic_fluent_calendar_3_day_28_regular.pdf similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/PopupMenu/3-day-view-28x28.imageset/ic_fluent_calendar_3_day_28_regular.pdf rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/PopupMenu/3-day-view-28x28.imageset/ic_fluent_calendar_3_day_28_regular.pdf diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/PopupMenu/Contents.json b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/PopupMenu/Contents.json similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/PopupMenu/Contents.json rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/PopupMenu/Contents.json diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/PopupMenu/agenda-24x24.imageset/Contents.json b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/PopupMenu/agenda-24x24.imageset/Contents.json similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/PopupMenu/agenda-24x24.imageset/Contents.json rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/PopupMenu/agenda-24x24.imageset/Contents.json diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/PopupMenu/agenda-24x24.imageset/ic_fluent_calendar_agenda_24_regular.pdf b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/PopupMenu/agenda-24x24.imageset/ic_fluent_calendar_agenda_24_regular.pdf similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/PopupMenu/agenda-24x24.imageset/ic_fluent_calendar_agenda_24_regular.pdf rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/PopupMenu/agenda-24x24.imageset/ic_fluent_calendar_agenda_24_regular.pdf diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/PopupMenu/attach-24x24.imageset/Contents.json b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/PopupMenu/attach-24x24.imageset/Contents.json similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/PopupMenu/attach-24x24.imageset/Contents.json rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/PopupMenu/attach-24x24.imageset/Contents.json diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/PopupMenu/attach-24x24.imageset/ic_fluent_attach_24_regular.pdf b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/PopupMenu/attach-24x24.imageset/ic_fluent_attach_24_regular.pdf similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/PopupMenu/attach-24x24.imageset/ic_fluent_attach_24_regular.pdf rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/PopupMenu/attach-24x24.imageset/ic_fluent_attach_24_regular.pdf diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/PopupMenu/day-view-24x24.imageset/Contents.json b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/PopupMenu/day-view-24x24.imageset/Contents.json similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/PopupMenu/day-view-24x24.imageset/Contents.json rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/PopupMenu/day-view-24x24.imageset/Contents.json diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/PopupMenu/day-view-24x24.imageset/ic_fluent_calendar_day_24_regular.pdf b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/PopupMenu/day-view-24x24.imageset/ic_fluent_calendar_day_24_regular.pdf similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/PopupMenu/day-view-24x24.imageset/ic_fluent_calendar_day_24_regular.pdf rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/PopupMenu/day-view-24x24.imageset/ic_fluent_calendar_day_24_regular.pdf diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/PopupMenu/flag-24x24.imageset/Contents.json b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/PopupMenu/flag-24x24.imageset/Contents.json similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/PopupMenu/flag-24x24.imageset/Contents.json rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/PopupMenu/flag-24x24.imageset/Contents.json diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/PopupMenu/flag-24x24.imageset/ic_fluent_flag_24_regular.pdf b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/PopupMenu/flag-24x24.imageset/ic_fluent_flag_24_regular.pdf similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/PopupMenu/flag-24x24.imageset/ic_fluent_flag_24_regular.pdf rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/PopupMenu/flag-24x24.imageset/ic_fluent_flag_24_regular.pdf diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/PopupMenu/gleam.imageset/Contents.json b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/PopupMenu/gleam.imageset/Contents.json similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/PopupMenu/gleam.imageset/Contents.json rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/PopupMenu/gleam.imageset/Contents.json diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/PopupMenu/gleam.imageset/gleam_single.pdf b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/PopupMenu/gleam.imageset/gleam_single.pdf similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/PopupMenu/gleam.imageset/gleam_single.pdf rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/PopupMenu/gleam.imageset/gleam_single.pdf diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/PopupMenu/mail-unread-24x24.imageset/Contents.json b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/PopupMenu/mail-unread-24x24.imageset/Contents.json similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/PopupMenu/mail-unread-24x24.imageset/Contents.json rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/PopupMenu/mail-unread-24x24.imageset/Contents.json diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/PopupMenu/mail-unread-24x24.imageset/ic_fluent_mail_unread_24_regular.pdf b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/PopupMenu/mail-unread-24x24.imageset/ic_fluent_mail_unread_24_regular.pdf similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/PopupMenu/mail-unread-24x24.imageset/ic_fluent_mail_unread_24_regular.pdf rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/PopupMenu/mail-unread-24x24.imageset/ic_fluent_mail_unread_24_regular.pdf diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/PopupMenu/month-view-24x24.imageset/Contents.json b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/PopupMenu/month-view-24x24.imageset/Contents.json similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/PopupMenu/month-view-24x24.imageset/Contents.json rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/PopupMenu/month-view-24x24.imageset/Contents.json diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/PopupMenu/month-view-24x24.imageset/ic_fluent_calendar_month_24_regular.pdf b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/PopupMenu/month-view-24x24.imageset/ic_fluent_calendar_month_24_regular.pdf similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/PopupMenu/month-view-24x24.imageset/ic_fluent_calendar_month_24_regular.pdf rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/PopupMenu/month-view-24x24.imageset/ic_fluent_calendar_month_24_regular.pdf diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/Contents.json b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/TabBarView/Contents.json similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/Contents.json rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/TabBarView/Contents.json diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/TabBarView/Help_24.imageset/Contents.json b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/TabBarView/Help_24.imageset/Contents.json similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/TabBarView/Help_24.imageset/Contents.json rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/TabBarView/Help_24.imageset/Contents.json diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/TabBarView/Help_24.imageset/ic_fluent_question_circle_24_regular.pdf b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/TabBarView/Help_24.imageset/ic_fluent_question_circle_24_regular.pdf similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/TabBarView/Help_24.imageset/ic_fluent_question_circle_24_regular.pdf rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/TabBarView/Help_24.imageset/ic_fluent_question_circle_24_regular.pdf diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/TabBarView/Home_24.imageset/Contents.json b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/TabBarView/Home_24.imageset/Contents.json similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/TabBarView/Home_24.imageset/Contents.json rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/TabBarView/Home_24.imageset/Contents.json diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/TabBarView/Home_24.imageset/ic_fluent_home_24_regular.pdf b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/TabBarView/Home_24.imageset/ic_fluent_home_24_regular.pdf similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/TabBarView/Home_24.imageset/ic_fluent_home_24_regular.pdf rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/TabBarView/Home_24.imageset/ic_fluent_home_24_regular.pdf diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/TabBarView/Home_28.imageset/Contents.json b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/TabBarView/Home_28.imageset/Contents.json similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/TabBarView/Home_28.imageset/Contents.json rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/TabBarView/Home_28.imageset/Contents.json diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/TabBarView/Home_28.imageset/ic_fluent_home_28_regular.pdf b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/TabBarView/Home_28.imageset/ic_fluent_home_28_regular.pdf similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/TabBarView/Home_28.imageset/ic_fluent_home_28_regular.pdf rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/TabBarView/Home_28.imageset/ic_fluent_home_28_regular.pdf diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/TabBarView/Home_Selected_24.imageset/Contents.json b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/TabBarView/Home_Selected_24.imageset/Contents.json similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/TabBarView/Home_Selected_24.imageset/Contents.json rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/TabBarView/Home_Selected_24.imageset/Contents.json diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/TabBarView/Home_Selected_24.imageset/ic_fluent_home_24_filled.pdf b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/TabBarView/Home_Selected_24.imageset/ic_fluent_home_24_filled.pdf similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/TabBarView/Home_Selected_24.imageset/ic_fluent_home_24_filled.pdf rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/TabBarView/Home_Selected_24.imageset/ic_fluent_home_24_filled.pdf diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/TabBarView/Home_Selected_28.imageset/Contents.json b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/TabBarView/Home_Selected_28.imageset/Contents.json similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/TabBarView/Home_Selected_28.imageset/Contents.json rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/TabBarView/Home_Selected_28.imageset/Contents.json diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/TabBarView/Home_Selected_28.imageset/ic_fluent_home_28_filled.pdf b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/TabBarView/Home_Selected_28.imageset/ic_fluent_home_28_filled.pdf similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/TabBarView/Home_Selected_28.imageset/ic_fluent_home_28_filled.pdf rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/TabBarView/Home_Selected_28.imageset/ic_fluent_home_28_filled.pdf diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/TabBarView/New_24.imageset/Contents.json b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/TabBarView/New_24.imageset/Contents.json similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/TabBarView/New_24.imageset/Contents.json rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/TabBarView/New_24.imageset/Contents.json diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/TabBarView/New_24.imageset/ic_fluent_add_circle_24_regular.pdf b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/TabBarView/New_24.imageset/ic_fluent_add_circle_24_regular.pdf similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/TabBarView/New_24.imageset/ic_fluent_add_circle_24_regular.pdf rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/TabBarView/New_24.imageset/ic_fluent_add_circle_24_regular.pdf diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/TabBarView/New_28.imageset/Contents.json b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/TabBarView/New_28.imageset/Contents.json similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/TabBarView/New_28.imageset/Contents.json rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/TabBarView/New_28.imageset/Contents.json diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/TabBarView/New_28.imageset/ic_fluent_add_circle_28_regular.pdf b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/TabBarView/New_28.imageset/ic_fluent_add_circle_28_regular.pdf similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/TabBarView/New_28.imageset/ic_fluent_add_circle_28_regular.pdf rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/TabBarView/New_28.imageset/ic_fluent_add_circle_28_regular.pdf diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/TabBarView/New_Selected_24.imageset/Contents.json b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/TabBarView/New_Selected_24.imageset/Contents.json similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/TabBarView/New_Selected_24.imageset/Contents.json rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/TabBarView/New_Selected_24.imageset/Contents.json diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/TabBarView/New_Selected_24.imageset/ic_fluent_add_circle_24_filled.pdf b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/TabBarView/New_Selected_24.imageset/ic_fluent_add_circle_24_filled.pdf similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/TabBarView/New_Selected_24.imageset/ic_fluent_add_circle_24_filled.pdf rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/TabBarView/New_Selected_24.imageset/ic_fluent_add_circle_24_filled.pdf diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/TabBarView/New_Selected_28.imageset/Contents.json b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/TabBarView/New_Selected_28.imageset/Contents.json similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/TabBarView/New_Selected_28.imageset/Contents.json rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/TabBarView/New_Selected_28.imageset/Contents.json diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/TabBarView/New_Selected_28.imageset/ic_fluent_add_circle_28_filled.pdf b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/TabBarView/New_Selected_28.imageset/ic_fluent_add_circle_28_filled.pdf similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/TabBarView/New_Selected_28.imageset/ic_fluent_add_circle_28_filled.pdf rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/TabBarView/New_Selected_28.imageset/ic_fluent_add_circle_28_filled.pdf diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/TabBarView/Open_24.imageset/Contents.json b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/TabBarView/Open_24.imageset/Contents.json similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/TabBarView/Open_24.imageset/Contents.json rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/TabBarView/Open_24.imageset/Contents.json diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/TabBarView/Open_24.imageset/ic_fluent_folder_24_regular.pdf b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/TabBarView/Open_24.imageset/ic_fluent_folder_24_regular.pdf similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/TabBarView/Open_24.imageset/ic_fluent_folder_24_regular.pdf rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/TabBarView/Open_24.imageset/ic_fluent_folder_24_regular.pdf diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/TabBarView/Open_28.imageset/Contents.json b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/TabBarView/Open_28.imageset/Contents.json similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/TabBarView/Open_28.imageset/Contents.json rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/TabBarView/Open_28.imageset/Contents.json diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/TabBarView/Open_28.imageset/ic_fluent_folder_28_regular.pdf b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/TabBarView/Open_28.imageset/ic_fluent_folder_28_regular.pdf similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/TabBarView/Open_28.imageset/ic_fluent_folder_28_regular.pdf rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/TabBarView/Open_28.imageset/ic_fluent_folder_28_regular.pdf diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/TabBarView/Open_Selected_24.imageset/Contents.json b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/TabBarView/Open_Selected_24.imageset/Contents.json similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/TabBarView/Open_Selected_24.imageset/Contents.json rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/TabBarView/Open_Selected_24.imageset/Contents.json diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/TabBarView/Open_Selected_24.imageset/ic_fluent_folder_24_filled.pdf b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/TabBarView/Open_Selected_24.imageset/ic_fluent_folder_24_filled.pdf similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/TabBarView/Open_Selected_24.imageset/ic_fluent_folder_24_filled.pdf rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/TabBarView/Open_Selected_24.imageset/ic_fluent_folder_24_filled.pdf diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/TabBarView/Open_Selected_28.imageset/Contents.json b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/TabBarView/Open_Selected_28.imageset/Contents.json similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/TabBarView/Open_Selected_28.imageset/Contents.json rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/TabBarView/Open_Selected_28.imageset/Contents.json diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/TabBarView/Open_Selected_28.imageset/ic_fluent_folder_28_filled.pdf b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/TabBarView/Open_Selected_28.imageset/ic_fluent_folder_28_filled.pdf similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/TabBarView/Open_Selected_28.imageset/ic_fluent_folder_28_filled.pdf rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/TabBarView/Open_Selected_28.imageset/ic_fluent_folder_28_filled.pdf diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/TabBarView/ic_fluent_premium_24_regular.imageset/Contents.json b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/TabBarView/ic_fluent_premium_24_regular.imageset/Contents.json similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/TabBarView/ic_fluent_premium_24_regular.imageset/Contents.json rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/TabBarView/ic_fluent_premium_24_regular.imageset/Contents.json diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/TabBarView/ic_fluent_premium_24_regular.imageset/ic_fluent_premium_24_regular.pdf b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/TabBarView/ic_fluent_premium_24_regular.imageset/ic_fluent_premium_24_regular.pdf similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/TabBarView/ic_fluent_premium_24_regular.imageset/ic_fluent_premium_24_regular.pdf rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/TabBarView/ic_fluent_premium_24_regular.imageset/ic_fluent_premium_24_regular.pdf diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/TableViewCell/Contents.json b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/TableViewCell/Contents.json similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/TableViewCell/Contents.json rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/TableViewCell/Contents.json diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/TableViewCell/Dismiss_24.imageset/Contents.json b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/TableViewCell/Dismiss_24.imageset/Contents.json similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/TableViewCell/Dismiss_24.imageset/Contents.json rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/TableViewCell/Dismiss_24.imageset/Contents.json diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/TableViewCell/Dismiss_24.imageset/ic_fluent_dismiss_24_regular.pdf b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/TableViewCell/Dismiss_24.imageset/ic_fluent_dismiss_24_regular.pdf similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/TableViewCell/Dismiss_24.imageset/ic_fluent_dismiss_24_regular.pdf rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/TableViewCell/Dismiss_24.imageset/ic_fluent_dismiss_24_regular.pdf diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/TableViewCell/Dismiss_28.imageset/Contents.json b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/TableViewCell/Dismiss_28.imageset/Contents.json similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/TableViewCell/Dismiss_28.imageset/Contents.json rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/TableViewCell/Dismiss_28.imageset/Contents.json diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/TableViewCell/Dismiss_28.imageset/ic_fluent_dismiss_28_regular.pdf b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/TableViewCell/Dismiss_28.imageset/ic_fluent_dismiss_28_regular.pdf similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/TableViewCell/Dismiss_28.imageset/ic_fluent_dismiss_28_regular.pdf rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/TableViewCell/Dismiss_28.imageset/ic_fluent_dismiss_28_regular.pdf diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/TableViewCell/at-12x12.imageset/Contents.json b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/TableViewCell/at-12x12.imageset/Contents.json similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/TableViewCell/at-12x12.imageset/Contents.json rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/TableViewCell/at-12x12.imageset/Contents.json diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/TableViewCell/at-12x12.imageset/at.pdf b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/TableViewCell/at-12x12.imageset/at.pdf similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/TableViewCell/at-12x12.imageset/at.pdf rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/TableViewCell/at-12x12.imageset/at.pdf diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/TableViewCell/excelIcon.imageset/Contents.json b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/TableViewCell/excelIcon.imageset/Contents.json similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/TableViewCell/excelIcon.imageset/Contents.json rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/TableViewCell/excelIcon.imageset/Contents.json diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/TableViewCell/excelIcon.imageset/excelIcon.png b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/TableViewCell/excelIcon.imageset/excelIcon.png similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/TableViewCell/excelIcon.imageset/excelIcon.png rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/TableViewCell/excelIcon.imageset/excelIcon.png diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/TableViewCell/ic_fluent_lock_closed_20_regular.imageset/Contents.json b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/TableViewCell/ic_fluent_lock_closed_20_regular.imageset/Contents.json similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/TableViewCell/ic_fluent_lock_closed_20_regular.imageset/Contents.json rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/TableViewCell/ic_fluent_lock_closed_20_regular.imageset/Contents.json diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/TableViewCell/ic_fluent_lock_closed_20_regular.imageset/ic_fluent_lock_closed_20_regular.pdf b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/TableViewCell/ic_fluent_lock_closed_20_regular.imageset/ic_fluent_lock_closed_20_regular.pdf similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/TableViewCell/ic_fluent_lock_closed_20_regular.imageset/ic_fluent_lock_closed_20_regular.pdf rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/TableViewCell/ic_fluent_lock_closed_20_regular.imageset/ic_fluent_lock_closed_20_regular.pdf diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/TableViewCell/ic_fluent_share_20_regular.imageset/Contents.json b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/TableViewCell/ic_fluent_share_20_regular.imageset/Contents.json similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/TableViewCell/ic_fluent_share_20_regular.imageset/Contents.json rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/TableViewCell/ic_fluent_share_20_regular.imageset/Contents.json diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/TableViewCell/ic_fluent_share_20_regular.imageset/ic_fluent_share_20_regular.pdf b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/TableViewCell/ic_fluent_share_20_regular.imageset/ic_fluent_share_20_regular.pdf similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/TableViewCell/ic_fluent_share_20_regular.imageset/ic_fluent_share_20_regular.pdf rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/TableViewCell/ic_fluent_share_20_regular.imageset/ic_fluent_share_20_regular.pdf diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/Contents.json b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/TableViewHeaderFooterView/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/Contents.json rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/TableViewHeaderFooterView/Contents.json diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/TableViewHeaderFooterView/chevron-down-20x20.imageset/Contents.json b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/TableViewHeaderFooterView/chevron-down-20x20.imageset/Contents.json similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/TableViewHeaderFooterView/chevron-down-20x20.imageset/Contents.json rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/TableViewHeaderFooterView/chevron-down-20x20.imageset/Contents.json diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/TableViewHeaderFooterView/chevron-down-20x20.imageset/ic_fluent_chevron_down_20_regular.pdf b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/TableViewHeaderFooterView/chevron-down-20x20.imageset/ic_fluent_chevron_down_20_regular.pdf similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/TableViewHeaderFooterView/chevron-down-20x20.imageset/ic_fluent_chevron_down_20_regular.pdf rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/TableViewHeaderFooterView/chevron-down-20x20.imageset/ic_fluent_chevron_down_20_regular.pdf diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/TableViewHeaderFooterView/chevron-right-20x20.imageset/Contents.json b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/TableViewHeaderFooterView/chevron-right-20x20.imageset/Contents.json similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/TableViewHeaderFooterView/chevron-right-20x20.imageset/Contents.json rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/TableViewHeaderFooterView/chevron-right-20x20.imageset/Contents.json diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/TableViewHeaderFooterView/chevron-right-20x20.imageset/ic_fluent_chevron_right_20_regular.pdf b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/TableViewHeaderFooterView/chevron-right-20x20.imageset/ic_fluent_chevron_right_20_regular.pdf similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/TableViewHeaderFooterView/chevron-right-20x20.imageset/ic_fluent_chevron_right_20_regular.pdf rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/TableViewHeaderFooterView/chevron-right-20x20.imageset/ic_fluent_chevron_right_20_regular.pdf diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/TableViewHeaderFooterView/image-24x24.imageset/Contents.json b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/TableViewHeaderFooterView/image-24x24.imageset/Contents.json similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/TableViewHeaderFooterView/image-24x24.imageset/Contents.json rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/TableViewHeaderFooterView/image-24x24.imageset/Contents.json diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/TableViewHeaderFooterView/image-24x24.imageset/ic_fluent_image_24_regular.pdf b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/TableViewHeaderFooterView/image-24x24.imageset/ic_fluent_image_24_regular.pdf similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/TableViewHeaderFooterView/image-24x24.imageset/ic_fluent_image_24_regular.pdf rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/TableViewHeaderFooterView/image-24x24.imageset/ic_fluent_image_24_regular.pdf diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/ic_fluent_add_20_regular.imageset/Contents.json b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/ic_fluent_add_20_regular.imageset/Contents.json similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/ic_fluent_add_20_regular.imageset/Contents.json rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/ic_fluent_add_20_regular.imageset/Contents.json diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/ic_fluent_add_20_regular.imageset/ic_fluent_add_20_regular.svg b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/ic_fluent_add_20_regular.imageset/ic_fluent_add_20_regular.svg similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/ic_fluent_add_20_regular.imageset/ic_fluent_add_20_regular.svg rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/ic_fluent_add_20_regular.imageset/ic_fluent_add_20_regular.svg diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/ic_fluent_subtract_20_regular.imageset/Contents.json b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/ic_fluent_subtract_20_regular.imageset/Contents.json similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/ic_fluent_subtract_20_regular.imageset/Contents.json rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/ic_fluent_subtract_20_regular.imageset/Contents.json diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/ic_fluent_subtract_20_regular.imageset/ic_fluent_subtract_20_regular.svg b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/ic_fluent_subtract_20_regular.imageset/ic_fluent_subtract_20_regular.svg similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Assets.xcassets/ic_fluent_subtract_20_regular.imageset/ic_fluent_subtract_20_regular.svg rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Assets.xcassets/ic_fluent_subtract_20_regular.imageset/ic_fluent_subtract_20_regular.svg diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/Base.lproj/LaunchScreen.storyboard b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Base.lproj/LaunchScreen.storyboard similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/Base.lproj/LaunchScreen.storyboard rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/Base.lproj/LaunchScreen.storyboard diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/ar.lproj/LaunchScreen.strings b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/ar.lproj/LaunchScreen.strings similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/ar.lproj/LaunchScreen.strings rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/ar.lproj/LaunchScreen.strings diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/ca.lproj/LaunchScreen.strings b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/ca.lproj/LaunchScreen.strings similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/ca.lproj/LaunchScreen.strings rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/ca.lproj/LaunchScreen.strings diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/cs.lproj/LaunchScreen.strings b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/cs.lproj/LaunchScreen.strings similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/cs.lproj/LaunchScreen.strings rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/cs.lproj/LaunchScreen.strings diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/da.lproj/LaunchScreen.strings b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/da.lproj/LaunchScreen.strings similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/da.lproj/LaunchScreen.strings rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/da.lproj/LaunchScreen.strings diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/de.lproj/LaunchScreen.strings b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/de.lproj/LaunchScreen.strings similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/de.lproj/LaunchScreen.strings rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/de.lproj/LaunchScreen.strings diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/el.lproj/LaunchScreen.strings b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/el.lproj/LaunchScreen.strings similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/el.lproj/LaunchScreen.strings rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/el.lproj/LaunchScreen.strings diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/en-GB.lproj/LaunchScreen.strings b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/en-GB.lproj/LaunchScreen.strings similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/en-GB.lproj/LaunchScreen.strings rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/en-GB.lproj/LaunchScreen.strings diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/en.lproj/LaunchScreen.strings b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/en.lproj/LaunchScreen.strings similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/en.lproj/LaunchScreen.strings rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/en.lproj/LaunchScreen.strings diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/es-MX.lproj/LaunchScreen.strings b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/es-MX.lproj/LaunchScreen.strings similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/es-MX.lproj/LaunchScreen.strings rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/es-MX.lproj/LaunchScreen.strings diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/es.lproj/LaunchScreen.strings b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/es.lproj/LaunchScreen.strings similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/es.lproj/LaunchScreen.strings rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/es.lproj/LaunchScreen.strings diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/fi.lproj/LaunchScreen.strings b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/fi.lproj/LaunchScreen.strings similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/fi.lproj/LaunchScreen.strings rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/fi.lproj/LaunchScreen.strings diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/fr.lproj/LaunchScreen.strings b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/fr.lproj/LaunchScreen.strings similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/fr.lproj/LaunchScreen.strings rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/fr.lproj/LaunchScreen.strings diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/he.lproj/LaunchScreen.strings b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/he.lproj/LaunchScreen.strings similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/he.lproj/LaunchScreen.strings rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/he.lproj/LaunchScreen.strings diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/hi.lproj/LaunchScreen.strings b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/hi.lproj/LaunchScreen.strings similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/hi.lproj/LaunchScreen.strings rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/hi.lproj/LaunchScreen.strings diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/hr.lproj/LaunchScreen.strings b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/hr.lproj/LaunchScreen.strings similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/hr.lproj/LaunchScreen.strings rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/hr.lproj/LaunchScreen.strings diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/hu.lproj/LaunchScreen.strings b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/hu.lproj/LaunchScreen.strings similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/hu.lproj/LaunchScreen.strings rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/hu.lproj/LaunchScreen.strings diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/id.lproj/LaunchScreen.strings b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/id.lproj/LaunchScreen.strings similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/id.lproj/LaunchScreen.strings rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/id.lproj/LaunchScreen.strings diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/it.lproj/LaunchScreen.strings b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/it.lproj/LaunchScreen.strings similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/it.lproj/LaunchScreen.strings rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/it.lproj/LaunchScreen.strings diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/ja.lproj/LaunchScreen.strings b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/ja.lproj/LaunchScreen.strings similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/ja.lproj/LaunchScreen.strings rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/ja.lproj/LaunchScreen.strings diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/ko.lproj/LaunchScreen.strings b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/ko.lproj/LaunchScreen.strings similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/ko.lproj/LaunchScreen.strings rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/ko.lproj/LaunchScreen.strings diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/ms.lproj/LaunchScreen.strings b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/ms.lproj/LaunchScreen.strings similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/ms.lproj/LaunchScreen.strings rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/ms.lproj/LaunchScreen.strings diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/nb-NO.lproj/LaunchScreen.strings b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/nb-NO.lproj/LaunchScreen.strings similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/nb-NO.lproj/LaunchScreen.strings rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/nb-NO.lproj/LaunchScreen.strings diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/nl.lproj/LaunchScreen.strings b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/nl.lproj/LaunchScreen.strings similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/nl.lproj/LaunchScreen.strings rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/nl.lproj/LaunchScreen.strings diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/pl.lproj/LaunchScreen.strings b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/pl.lproj/LaunchScreen.strings similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/pl.lproj/LaunchScreen.strings rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/pl.lproj/LaunchScreen.strings diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/pt-BR.lproj/LaunchScreen.strings b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/pt-BR.lproj/LaunchScreen.strings similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/pt-BR.lproj/LaunchScreen.strings rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/pt-BR.lproj/LaunchScreen.strings diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/pt-PT.lproj/LaunchScreen.strings b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/pt-PT.lproj/LaunchScreen.strings similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/pt-PT.lproj/LaunchScreen.strings rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/pt-PT.lproj/LaunchScreen.strings diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/ro.lproj/LaunchScreen.strings b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/ro.lproj/LaunchScreen.strings similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/ro.lproj/LaunchScreen.strings rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/ro.lproj/LaunchScreen.strings diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/ru.lproj/LaunchScreen.strings b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/ru.lproj/LaunchScreen.strings similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/ru.lproj/LaunchScreen.strings rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/ru.lproj/LaunchScreen.strings diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/sk.lproj/LaunchScreen.strings b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/sk.lproj/LaunchScreen.strings similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/sk.lproj/LaunchScreen.strings rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/sk.lproj/LaunchScreen.strings diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/sv.lproj/LaunchScreen.strings b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/sv.lproj/LaunchScreen.strings similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/sv.lproj/LaunchScreen.strings rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/sv.lproj/LaunchScreen.strings diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/th.lproj/LaunchScreen.strings b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/th.lproj/LaunchScreen.strings similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/th.lproj/LaunchScreen.strings rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/th.lproj/LaunchScreen.strings diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/tr.lproj/LaunchScreen.strings b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/tr.lproj/LaunchScreen.strings similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/tr.lproj/LaunchScreen.strings rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/tr.lproj/LaunchScreen.strings diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/uk.lproj/LaunchScreen.strings b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/uk.lproj/LaunchScreen.strings similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/uk.lproj/LaunchScreen.strings rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/uk.lproj/LaunchScreen.strings diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/vi.lproj/LaunchScreen.strings b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/vi.lproj/LaunchScreen.strings similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/vi.lproj/LaunchScreen.strings rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/vi.lproj/LaunchScreen.strings diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/zh-Hans.lproj/LaunchScreen.strings b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/zh-Hans.lproj/LaunchScreen.strings similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/zh-Hans.lproj/LaunchScreen.strings rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/zh-Hans.lproj/LaunchScreen.strings diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Resources/zh-Hant.lproj/LaunchScreen.strings b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/zh-Hant.lproj/LaunchScreen.strings similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Resources/zh-Hant.lproj/LaunchScreen.strings rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Resources/zh-Hant.lproj/LaunchScreen.strings diff --git a/ios/FluentUI.Demo/FluentUI.Demo/SceneDelegate.swift b/Demos/FluentUIDemo_iOS/FluentUI.Demo/SceneDelegate.swift similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/SceneDelegate.swift rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/SceneDelegate.swift diff --git a/ios/FluentUI.Demo/FluentUI.Demo/ScrollView/DemoControllerScrollView.swift b/Demos/FluentUIDemo_iOS/FluentUI.Demo/ScrollView/DemoControllerScrollView.swift similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/ScrollView/DemoControllerScrollView.swift rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/ScrollView/DemoControllerScrollView.swift diff --git a/ios/FluentUI.Demo/FluentUI.Demo/ScrollView/UIResponder+Extensions.swift b/Demos/FluentUIDemo_iOS/FluentUI.Demo/ScrollView/UIResponder+Extensions.swift similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/ScrollView/UIResponder+Extensions.swift rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/ScrollView/UIResponder+Extensions.swift diff --git a/ios/FluentUI.Demo/FluentUI.Demo/SwiftUI/FluentUIDemoToggle.swift b/Demos/FluentUIDemo_iOS/FluentUI.Demo/SwiftUI/FluentUIDemoToggle.swift similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/SwiftUI/FluentUIDemoToggle.swift rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/SwiftUI/FluentUIDemoToggle.swift diff --git a/ios/FluentUI.Demo/FluentUI.Demo/TableViewCellSampleData.swift b/Demos/FluentUIDemo_iOS/FluentUI.Demo/TableViewCellSampleData.swift similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/TableViewCellSampleData.swift rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/TableViewCellSampleData.swift diff --git a/ios/FluentUI.Demo/FluentUI.Demo/TableViewHeaderFooterSampleData.swift b/Demos/FluentUIDemo_iOS/FluentUI.Demo/TableViewHeaderFooterSampleData.swift similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/TableViewHeaderFooterSampleData.swift rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/TableViewHeaderFooterSampleData.swift diff --git a/ios/FluentUI.Demo/FluentUI.Demo/TableViewSampleData.swift b/Demos/FluentUIDemo_iOS/FluentUI.Demo/TableViewSampleData.swift similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/TableViewSampleData.swift rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/TableViewSampleData.swift diff --git a/ios/FluentUI.Demo/FluentUIDemoTests/ActivityIndicatorTest.swift b/Demos/FluentUIDemo_iOS/FluentUIDemoTests/ActivityIndicatorTest.swift similarity index 90% rename from ios/FluentUI.Demo/FluentUIDemoTests/ActivityIndicatorTest.swift rename to Demos/FluentUIDemo_iOS/FluentUIDemoTests/ActivityIndicatorTest.swift index 088bd72b25..0604c455b3 100644 --- a/ios/FluentUI.Demo/FluentUIDemoTests/ActivityIndicatorTest.swift +++ b/Demos/FluentUIDemo_iOS/FluentUIDemoTests/ActivityIndicatorTest.swift @@ -22,17 +22,17 @@ class ActivityIndicatorTest: BaseTest { // tests start/stop functionality as well as hiding (activity indicator should disappear when stopped) func testStartStopHide() throws { - let startStopButton: XCUIElement = app.buttons["Start / Stop activity"] + let activityButton: XCUIElement = app.cells.containing(.staticText, identifier: "Animating").firstMatch let hidesWhenStoppedButton: XCUIElement = app.cells.containing(.staticText, identifier: "Hides when stopped").firstMatch XCTAssert(activityIndicatorExists(status: inProgress)) - startStopButton.tap() + activityButton.tap() XCTAssert(!activityIndicatorExists(status: inProgress)) hidesWhenStoppedButton.tap() XCTAssert(activityIndicatorExists(status: progressHalted)) - startStopButton.tap() + activityButton.tap() XCTAssert(activityIndicatorExists(status: inProgress)) } diff --git a/ios/FluentUI.Demo/FluentUIDemoTests/ActivityIndicatorTest_SwiftUI.swift b/Demos/FluentUIDemo_iOS/FluentUIDemoTests/ActivityIndicatorTest_SwiftUI.swift similarity index 100% rename from ios/FluentUI.Demo/FluentUIDemoTests/ActivityIndicatorTest_SwiftUI.swift rename to Demos/FluentUIDemo_iOS/FluentUIDemoTests/ActivityIndicatorTest_SwiftUI.swift diff --git a/ios/FluentUI.Demo/FluentUIDemoTests/AliasColorTokensTest.swift b/Demos/FluentUIDemo_iOS/FluentUIDemoTests/AliasColorTokensTest.swift similarity index 100% rename from ios/FluentUI.Demo/FluentUIDemoTests/AliasColorTokensTest.swift rename to Demos/FluentUIDemo_iOS/FluentUIDemoTests/AliasColorTokensTest.swift diff --git a/ios/FluentUI.Demo/FluentUIDemoTests/AvatarGroupTest.swift b/Demos/FluentUIDemo_iOS/FluentUIDemoTests/AvatarGroupTest.swift similarity index 100% rename from ios/FluentUI.Demo/FluentUIDemoTests/AvatarGroupTest.swift rename to Demos/FluentUIDemo_iOS/FluentUIDemoTests/AvatarGroupTest.swift diff --git a/ios/FluentUI.Demo/FluentUIDemoTests/AvatarTest.swift b/Demos/FluentUIDemo_iOS/FluentUIDemoTests/AvatarTest.swift similarity index 100% rename from ios/FluentUI.Demo/FluentUIDemoTests/AvatarTest.swift rename to Demos/FluentUIDemo_iOS/FluentUIDemoTests/AvatarTest.swift diff --git a/ios/FluentUI.Demo/FluentUIDemoTests/AvatarTest_SwiftUI.swift b/Demos/FluentUIDemo_iOS/FluentUIDemoTests/AvatarTest_SwiftUI.swift similarity index 100% rename from ios/FluentUI.Demo/FluentUIDemoTests/AvatarTest_SwiftUI.swift rename to Demos/FluentUIDemo_iOS/FluentUIDemoTests/AvatarTest_SwiftUI.swift diff --git a/ios/FluentUI.Demo/FluentUIDemoTests/BadgeFieldTest.swift b/Demos/FluentUIDemo_iOS/FluentUIDemoTests/BadgeFieldTest.swift similarity index 100% rename from ios/FluentUI.Demo/FluentUIDemoTests/BadgeFieldTest.swift rename to Demos/FluentUIDemo_iOS/FluentUIDemoTests/BadgeFieldTest.swift diff --git a/ios/FluentUI.Demo/FluentUIDemoTests/BadgeViewTest.swift b/Demos/FluentUIDemo_iOS/FluentUIDemoTests/BadgeViewTest.swift similarity index 100% rename from ios/FluentUI.Demo/FluentUIDemoTests/BadgeViewTest.swift rename to Demos/FluentUIDemo_iOS/FluentUIDemoTests/BadgeViewTest.swift diff --git a/ios/FluentUI.Demo/FluentUIDemoTests/BaseTest.swift b/Demos/FluentUIDemo_iOS/FluentUIDemoTests/BaseTest.swift similarity index 100% rename from ios/FluentUI.Demo/FluentUIDemoTests/BaseTest.swift rename to Demos/FluentUIDemo_iOS/FluentUIDemoTests/BaseTest.swift diff --git a/ios/FluentUI.Demo/FluentUIDemoTests/BottomCommandingControllerTest.swift b/Demos/FluentUIDemo_iOS/FluentUIDemoTests/BottomCommandingControllerTest.swift similarity index 100% rename from ios/FluentUI.Demo/FluentUIDemoTests/BottomCommandingControllerTest.swift rename to Demos/FluentUIDemo_iOS/FluentUIDemoTests/BottomCommandingControllerTest.swift diff --git a/ios/FluentUI.Demo/FluentUIDemoTests/BottomSheetControllerTest.swift b/Demos/FluentUIDemo_iOS/FluentUIDemoTests/BottomSheetControllerTest.swift similarity index 100% rename from ios/FluentUI.Demo/FluentUIDemoTests/BottomSheetControllerTest.swift rename to Demos/FluentUIDemo_iOS/FluentUIDemoTests/BottomSheetControllerTest.swift diff --git a/ios/FluentUI.Demo/FluentUIDemoTests/ButtonTest.swift b/Demos/FluentUIDemo_iOS/FluentUIDemoTests/ButtonTest.swift similarity index 100% rename from ios/FluentUI.Demo/FluentUIDemoTests/ButtonTest.swift rename to Demos/FluentUIDemo_iOS/FluentUIDemoTests/ButtonTest.swift diff --git a/ios/FluentUI.Demo/FluentUIDemoTests/CardNudgeTest.swift b/Demos/FluentUIDemo_iOS/FluentUIDemoTests/CardNudgeTest.swift similarity index 100% rename from ios/FluentUI.Demo/FluentUIDemoTests/CardNudgeTest.swift rename to Demos/FluentUIDemo_iOS/FluentUIDemoTests/CardNudgeTest.swift diff --git a/ios/FluentUI.Demo/FluentUIDemoTests/CardTest.swift b/Demos/FluentUIDemo_iOS/FluentUIDemoTests/CardTest.swift similarity index 100% rename from ios/FluentUI.Demo/FluentUIDemoTests/CardTest.swift rename to Demos/FluentUIDemo_iOS/FluentUIDemoTests/CardTest.swift diff --git a/ios/FluentUI.Demo/FluentUIDemoTests/CommandBarTest.swift b/Demos/FluentUIDemo_iOS/FluentUIDemoTests/CommandBarTest.swift similarity index 100% rename from ios/FluentUI.Demo/FluentUIDemoTests/CommandBarTest.swift rename to Demos/FluentUIDemo_iOS/FluentUIDemoTests/CommandBarTest.swift diff --git a/ios/FluentUI.Demo/FluentUIDemoTests/DateTimePickerTest.swift b/Demos/FluentUIDemo_iOS/FluentUIDemoTests/DateTimePickerTest.swift similarity index 100% rename from ios/FluentUI.Demo/FluentUIDemoTests/DateTimePickerTest.swift rename to Demos/FluentUIDemo_iOS/FluentUIDemoTests/DateTimePickerTest.swift diff --git a/ios/FluentUI.Demo/FluentUIDemoTests/DrawerControllerTest.swift b/Demos/FluentUIDemo_iOS/FluentUIDemoTests/DrawerControllerTest.swift similarity index 100% rename from ios/FluentUI.Demo/FluentUIDemoTests/DrawerControllerTest.swift rename to Demos/FluentUIDemo_iOS/FluentUIDemoTests/DrawerControllerTest.swift diff --git a/ios/FluentUI.Demo/FluentUIDemoTests/GlobalColorTokensTest.swift b/Demos/FluentUIDemo_iOS/FluentUIDemoTests/GlobalColorTokensTest.swift similarity index 100% rename from ios/FluentUI.Demo/FluentUIDemoTests/GlobalColorTokensTest.swift rename to Demos/FluentUIDemo_iOS/FluentUIDemoTests/GlobalColorTokensTest.swift diff --git a/ios/FluentUI.Demo/FluentUIDemoTests/HUDTest.swift b/Demos/FluentUIDemo_iOS/FluentUIDemoTests/HUDTest.swift similarity index 100% rename from ios/FluentUI.Demo/FluentUIDemoTests/HUDTest.swift rename to Demos/FluentUIDemo_iOS/FluentUIDemoTests/HUDTest.swift diff --git a/ios/FluentUI.Demo/FluentUIDemoTests/HUDTest_SwiftUI.swift b/Demos/FluentUIDemo_iOS/FluentUIDemoTests/HUDTest_SwiftUI.swift similarity index 100% rename from ios/FluentUI.Demo/FluentUIDemoTests/HUDTest_SwiftUI.swift rename to Demos/FluentUIDemo_iOS/FluentUIDemoTests/HUDTest_SwiftUI.swift diff --git a/ios/FluentUI.Demo/FluentUIDemoTests/IndeterminateProgressBarTest.swift b/Demos/FluentUIDemo_iOS/FluentUIDemoTests/IndeterminateProgressBarTest.swift similarity index 100% rename from ios/FluentUI.Demo/FluentUIDemoTests/IndeterminateProgressBarTest.swift rename to Demos/FluentUIDemo_iOS/FluentUIDemoTests/IndeterminateProgressBarTest.swift diff --git a/ios/FluentUI.Demo/FluentUIDemoTests/IndeterminateProgressBarTest_SwiftUI.swift b/Demos/FluentUIDemo_iOS/FluentUIDemoTests/IndeterminateProgressBarTest_SwiftUI.swift similarity index 100% rename from ios/FluentUI.Demo/FluentUIDemoTests/IndeterminateProgressBarTest_SwiftUI.swift rename to Demos/FluentUIDemo_iOS/FluentUIDemoTests/IndeterminateProgressBarTest_SwiftUI.swift diff --git a/ios/FluentUI.Demo/FluentUIDemoTests/LabelTest.swift b/Demos/FluentUIDemo_iOS/FluentUIDemoTests/LabelTest.swift similarity index 100% rename from ios/FluentUI.Demo/FluentUIDemoTests/LabelTest.swift rename to Demos/FluentUIDemo_iOS/FluentUIDemoTests/LabelTest.swift diff --git a/ios/FluentUI.Demo/FluentUIDemoTests/ListActionItemTest.swift b/Demos/FluentUIDemo_iOS/FluentUIDemoTests/ListActionItemTest.swift similarity index 100% rename from ios/FluentUI.Demo/FluentUIDemoTests/ListActionItemTest.swift rename to Demos/FluentUIDemo_iOS/FluentUIDemoTests/ListActionItemTest.swift diff --git a/ios/FluentUI.Demo/FluentUIDemoTests/ListItemTest.swift b/Demos/FluentUIDemo_iOS/FluentUIDemoTests/ListItemTest.swift similarity index 100% rename from ios/FluentUI.Demo/FluentUIDemoTests/ListItemTest.swift rename to Demos/FluentUIDemo_iOS/FluentUIDemoTests/ListItemTest.swift diff --git a/ios/FluentUI.Demo/FluentUIDemoTests/MultilineCommandBarTest.swift b/Demos/FluentUIDemo_iOS/FluentUIDemoTests/MultilineCommandBarTest.swift similarity index 100% rename from ios/FluentUI.Demo/FluentUIDemoTests/MultilineCommandBarTest.swift rename to Demos/FluentUIDemo_iOS/FluentUIDemoTests/MultilineCommandBarTest.swift diff --git a/ios/FluentUI.Demo/FluentUIDemoTests/NavigationControllerTest.swift b/Demos/FluentUIDemo_iOS/FluentUIDemoTests/NavigationControllerTest.swift similarity index 100% rename from ios/FluentUI.Demo/FluentUIDemoTests/NavigationControllerTest.swift rename to Demos/FluentUIDemo_iOS/FluentUIDemoTests/NavigationControllerTest.swift diff --git a/ios/FluentUI.Demo/FluentUIDemoTests/NotificationViewTest.swift b/Demos/FluentUIDemo_iOS/FluentUIDemoTests/NotificationViewTest.swift similarity index 100% rename from ios/FluentUI.Demo/FluentUIDemoTests/NotificationViewTest.swift rename to Demos/FluentUIDemo_iOS/FluentUIDemoTests/NotificationViewTest.swift diff --git a/ios/FluentUI.Demo/FluentUIDemoTests/NotificationViewTest_SwiftUI.swift b/Demos/FluentUIDemo_iOS/FluentUIDemoTests/NotificationViewTest_SwiftUI.swift similarity index 100% rename from ios/FluentUI.Demo/FluentUIDemoTests/NotificationViewTest_SwiftUI.swift rename to Demos/FluentUIDemo_iOS/FluentUIDemoTests/NotificationViewTest_SwiftUI.swift diff --git a/ios/FluentUI.Demo/FluentUIDemoTests/OtherCellsTest.swift b/Demos/FluentUIDemo_iOS/FluentUIDemoTests/OtherCellsTest.swift similarity index 100% rename from ios/FluentUI.Demo/FluentUIDemoTests/OtherCellsTest.swift rename to Demos/FluentUIDemo_iOS/FluentUIDemoTests/OtherCellsTest.swift diff --git a/ios/FluentUI.Demo/FluentUIDemoTests/PeoplePickerTest.swift b/Demos/FluentUIDemo_iOS/FluentUIDemoTests/PeoplePickerTest.swift similarity index 100% rename from ios/FluentUI.Demo/FluentUIDemoTests/PeoplePickerTest.swift rename to Demos/FluentUIDemo_iOS/FluentUIDemoTests/PeoplePickerTest.swift diff --git a/ios/FluentUI.Demo/FluentUIDemoTests/PersonaButtonCarouselTest.swift b/Demos/FluentUIDemo_iOS/FluentUIDemoTests/PersonaButtonCarouselTest.swift similarity index 100% rename from ios/FluentUI.Demo/FluentUIDemoTests/PersonaButtonCarouselTest.swift rename to Demos/FluentUIDemo_iOS/FluentUIDemoTests/PersonaButtonCarouselTest.swift diff --git a/ios/FluentUI.Demo/FluentUIDemoTests/PersonaListViewTest.swift b/Demos/FluentUIDemo_iOS/FluentUIDemoTests/PersonaListViewTest.swift similarity index 100% rename from ios/FluentUI.Demo/FluentUIDemoTests/PersonaListViewTest.swift rename to Demos/FluentUIDemo_iOS/FluentUIDemoTests/PersonaListViewTest.swift diff --git a/ios/FluentUI.Demo/FluentUIDemoTests/PillButtonBarTest.swift b/Demos/FluentUIDemo_iOS/FluentUIDemoTests/PillButtonBarTest.swift similarity index 100% rename from ios/FluentUI.Demo/FluentUIDemoTests/PillButtonBarTest.swift rename to Demos/FluentUIDemo_iOS/FluentUIDemoTests/PillButtonBarTest.swift diff --git a/ios/FluentUI.Demo/FluentUIDemoTests/PillButtonTest.swift b/Demos/FluentUIDemo_iOS/FluentUIDemoTests/PillButtonTest.swift similarity index 100% rename from ios/FluentUI.Demo/FluentUIDemoTests/PillButtonTest.swift rename to Demos/FluentUIDemo_iOS/FluentUIDemoTests/PillButtonTest.swift diff --git a/ios/FluentUI.Demo/FluentUIDemoTests/PopupMenuControllerTest.swift b/Demos/FluentUIDemo_iOS/FluentUIDemoTests/PopupMenuControllerTest.swift similarity index 100% rename from ios/FluentUI.Demo/FluentUIDemoTests/PopupMenuControllerTest.swift rename to Demos/FluentUIDemo_iOS/FluentUIDemoTests/PopupMenuControllerTest.swift diff --git a/ios/FluentUI.Demo/FluentUIDemoTests/SearchBarTest.swift b/Demos/FluentUIDemo_iOS/FluentUIDemoTests/SearchBarTest.swift similarity index 100% rename from ios/FluentUI.Demo/FluentUIDemoTests/SearchBarTest.swift rename to Demos/FluentUIDemo_iOS/FluentUIDemoTests/SearchBarTest.swift diff --git a/ios/FluentUI.Demo/FluentUIDemoTests/SegmentedControlTest.swift b/Demos/FluentUIDemo_iOS/FluentUIDemoTests/SegmentedControlTest.swift similarity index 100% rename from ios/FluentUI.Demo/FluentUIDemoTests/SegmentedControlTest.swift rename to Demos/FluentUIDemo_iOS/FluentUIDemoTests/SegmentedControlTest.swift diff --git a/ios/FluentUI.Demo/FluentUIDemoTests/ShadowTokensTest.swift b/Demos/FluentUIDemo_iOS/FluentUIDemoTests/ShadowTokensTest.swift similarity index 100% rename from ios/FluentUI.Demo/FluentUIDemoTests/ShadowTokensTest.swift rename to Demos/FluentUIDemo_iOS/FluentUIDemoTests/ShadowTokensTest.swift diff --git a/ios/FluentUI.Demo/FluentUIDemoTests/ShimmerViewTest.swift b/Demos/FluentUIDemo_iOS/FluentUIDemoTests/ShimmerViewTest.swift similarity index 100% rename from ios/FluentUI.Demo/FluentUIDemoTests/ShimmerViewTest.swift rename to Demos/FluentUIDemo_iOS/FluentUIDemoTests/ShimmerViewTest.swift diff --git a/ios/FluentUI.Demo/FluentUIDemoTests/SideTabBarTest.swift b/Demos/FluentUIDemo_iOS/FluentUIDemoTests/SideTabBarTest.swift similarity index 100% rename from ios/FluentUI.Demo/FluentUIDemoTests/SideTabBarTest.swift rename to Demos/FluentUIDemo_iOS/FluentUIDemoTests/SideTabBarTest.swift diff --git a/ios/FluentUI.Demo/FluentUIDemoTests/TabBarViewTest.swift b/Demos/FluentUIDemo_iOS/FluentUIDemoTests/TabBarViewTest.swift similarity index 100% rename from ios/FluentUI.Demo/FluentUIDemoTests/TabBarViewTest.swift rename to Demos/FluentUIDemo_iOS/FluentUIDemoTests/TabBarViewTest.swift diff --git a/ios/FluentUI.Demo/FluentUIDemoTests/TableViewCellShimmerTest.swift b/Demos/FluentUIDemo_iOS/FluentUIDemoTests/TableViewCellShimmerTest.swift similarity index 100% rename from ios/FluentUI.Demo/FluentUIDemoTests/TableViewCellShimmerTest.swift rename to Demos/FluentUIDemo_iOS/FluentUIDemoTests/TableViewCellShimmerTest.swift diff --git a/ios/FluentUI.Demo/FluentUIDemoTests/TableViewCellTest.swift b/Demos/FluentUIDemo_iOS/FluentUIDemoTests/TableViewCellTest.swift similarity index 100% rename from ios/FluentUI.Demo/FluentUIDemoTests/TableViewCellTest.swift rename to Demos/FluentUIDemo_iOS/FluentUIDemoTests/TableViewCellTest.swift diff --git a/ios/FluentUI.Demo/FluentUIDemoTests/TableViewHeaderFooterViewTest.swift b/Demos/FluentUIDemo_iOS/FluentUIDemoTests/TableViewHeaderFooterViewTest.swift similarity index 100% rename from ios/FluentUI.Demo/FluentUIDemoTests/TableViewHeaderFooterViewTest.swift rename to Demos/FluentUIDemo_iOS/FluentUIDemoTests/TableViewHeaderFooterViewTest.swift diff --git a/ios/FluentUI.Demo/FluentUIDemoTests/TextFieldTest.swift b/Demos/FluentUIDemo_iOS/FluentUIDemoTests/TextFieldTest.swift similarity index 100% rename from ios/FluentUI.Demo/FluentUIDemoTests/TextFieldTest.swift rename to Demos/FluentUIDemo_iOS/FluentUIDemoTests/TextFieldTest.swift diff --git a/ios/FluentUI.Demo/FluentUIDemoTests/TooltipTest.swift b/Demos/FluentUIDemo_iOS/FluentUIDemoTests/TooltipTest.swift similarity index 100% rename from ios/FluentUI.Demo/FluentUIDemoTests/TooltipTest.swift rename to Demos/FluentUIDemo_iOS/FluentUIDemoTests/TooltipTest.swift diff --git a/ios/FluentUI.Demo/FluentUIDemoTests/TypographyTokensTest.swift b/Demos/FluentUIDemo_iOS/FluentUIDemoTests/TypographyTokensTest.swift similarity index 100% rename from ios/FluentUI.Demo/FluentUIDemoTests/TypographyTokensTest.swift rename to Demos/FluentUIDemo_iOS/FluentUIDemoTests/TypographyTokensTest.swift diff --git a/ios/FluentUI.Demo/FluentUIDemoTests/Utilities/XCUIElement+Extensions.swift b/Demos/FluentUIDemo_iOS/FluentUIDemoTests/Utilities/XCUIElement+Extensions.swift similarity index 100% rename from ios/FluentUI.Demo/FluentUIDemoTests/Utilities/XCUIElement+Extensions.swift rename to Demos/FluentUIDemo_iOS/FluentUIDemoTests/Utilities/XCUIElement+Extensions.swift diff --git a/ios/appcenter-pre-build.sh b/Demos/FluentUIDemo_iOS/appcenter-pre-build.sh similarity index 71% rename from ios/appcenter-pre-build.sh rename to Demos/FluentUIDemo_iOS/appcenter-pre-build.sh index d8bf924915..f75daed556 100644 --- a/ios/appcenter-pre-build.sh +++ b/Demos/FluentUIDemo_iOS/appcenter-pre-build.sh @@ -1,4 +1,4 @@ #!/usr/bin/env bash echo 'Replacing AppCenterSecret placeholder...' -sed -i '' -e "s/$AppCenterSecretPlaceHolder/\"$AppCenterSecret\"/g" ./FluentUI.Demo/FluentUI.Demo/AppDelegate.swift +sed -i '' -e "s/$AppCenterSecretPlaceHolder/\"$AppCenterSecret\"/g" ./FluentUI.Demo/AppDelegate.swift diff --git a/macos/FluentUISwiftUITestApp/ContentView.swift b/Demos/FluentUIDemo_macOS/FluentUISwiftUITestApp/ContentView.swift similarity index 100% rename from macos/FluentUISwiftUITestApp/ContentView.swift rename to Demos/FluentUIDemo_macOS/FluentUISwiftUITestApp/ContentView.swift diff --git a/Demos/FluentUIDemo_macOS/FluentUISwiftUITestApp/FluentUI-testapp.xcassets/AccentColor.colorset/Contents.json b/Demos/FluentUIDemo_macOS/FluentUISwiftUITestApp/FluentUI-testapp.xcassets/AccentColor.colorset/Contents.json new file mode 100644 index 0000000000..eb87897008 --- /dev/null +++ b/Demos/FluentUIDemo_macOS/FluentUISwiftUITestApp/FluentUI-testapp.xcassets/AccentColor.colorset/Contents.json @@ -0,0 +1,11 @@ +{ + "colors" : [ + { + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/macos/FluentUISwiftUITestApp/FluentUI-testapp.xcassets/AppIcon.appiconset/Contents.json b/Demos/FluentUIDemo_macOS/FluentUISwiftUITestApp/FluentUI-testapp.xcassets/AppIcon.appiconset/Contents.json similarity index 100% rename from macos/FluentUISwiftUITestApp/FluentUI-testapp.xcassets/AppIcon.appiconset/Contents.json rename to Demos/FluentUIDemo_macOS/FluentUISwiftUITestApp/FluentUI-testapp.xcassets/AppIcon.appiconset/Contents.json diff --git a/macos/FluentUISwiftUITestApp/FluentUI-testapp.xcassets/Contents.json b/Demos/FluentUIDemo_macOS/FluentUISwiftUITestApp/FluentUI-testapp.xcassets/Contents.json similarity index 100% rename from macos/FluentUISwiftUITestApp/FluentUI-testapp.xcassets/Contents.json rename to Demos/FluentUIDemo_macOS/FluentUISwiftUITestApp/FluentUI-testapp.xcassets/Contents.json diff --git a/macos/FluentUISwiftUITestApp/FluentUISwiftUITestApp-Info.plist b/Demos/FluentUIDemo_macOS/FluentUISwiftUITestApp/FluentUISwiftUITestApp-Info.plist similarity index 100% rename from macos/FluentUISwiftUITestApp/FluentUISwiftUITestApp-Info.plist rename to Demos/FluentUIDemo_macOS/FluentUISwiftUITestApp/FluentUISwiftUITestApp-Info.plist diff --git a/ios/FluentUI.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Demos/FluentUIDemo_macOS/FluentUISwiftUITestApp/FluentUISwiftUITestApp.entitlements similarity index 58% rename from ios/FluentUI.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist rename to Demos/FluentUIDemo_macOS/FluentUISwiftUITestApp/FluentUISwiftUITestApp.entitlements index 18d981003d..f2ef3ae026 100644 --- a/ios/FluentUI.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +++ b/Demos/FluentUIDemo_macOS/FluentUISwiftUITestApp/FluentUISwiftUITestApp.entitlements @@ -2,7 +2,9 @@ - IDEDidComputeMac32BitWarning - + com.apple.security.app-sandbox + + com.apple.security.files.user-selected.read-only + diff --git a/macos/FluentUISwiftUITestApp/FluentUISwiftUITestAppApp.swift b/Demos/FluentUIDemo_macOS/FluentUISwiftUITestApp/FluentUISwiftUITestAppApp.swift similarity index 100% rename from macos/FluentUISwiftUITestApp/FluentUISwiftUITestAppApp.swift rename to Demos/FluentUIDemo_macOS/FluentUISwiftUITestApp/FluentUISwiftUITestAppApp.swift diff --git a/macos/FluentUISwiftUITestApp/Preview Content/Preview Assets.xcassets/Contents.json b/Demos/FluentUIDemo_macOS/FluentUISwiftUITestApp/Preview Content/Preview Assets.xcassets/Contents.json similarity index 100% rename from macos/FluentUISwiftUITestApp/Preview Content/Preview Assets.xcassets/Contents.json rename to Demos/FluentUIDemo_macOS/FluentUISwiftUITestApp/Preview Content/Preview Assets.xcassets/Contents.json diff --git a/macos/FluentUISwiftUITestApp/TestViewControllerWrappingView.swift b/Demos/FluentUIDemo_macOS/FluentUISwiftUITestApp/TestViewControllerWrappingView.swift similarity index 100% rename from macos/FluentUISwiftUITestApp/TestViewControllerWrappingView.swift rename to Demos/FluentUIDemo_macOS/FluentUISwiftUITestApp/TestViewControllerWrappingView.swift diff --git a/macos/FluentUITestApp/AppDelegate.swift b/Demos/FluentUIDemo_macOS/FluentUITestApp/AppDelegate.swift similarity index 100% rename from macos/FluentUITestApp/AppDelegate.swift rename to Demos/FluentUIDemo_macOS/FluentUITestApp/AppDelegate.swift diff --git a/Demos/FluentUIDemo_macOS/FluentUITestApp/Assets.xcassets/AppIcon.appiconset/ Icon-128.png b/Demos/FluentUIDemo_macOS/FluentUITestApp/Assets.xcassets/AppIcon.appiconset/ Icon-128.png new file mode 100644 index 0000000000..220736d3fb Binary files /dev/null and b/Demos/FluentUIDemo_macOS/FluentUITestApp/Assets.xcassets/AppIcon.appiconset/ Icon-128.png differ diff --git a/Demos/FluentUIDemo_macOS/FluentUITestApp/Assets.xcassets/AppIcon.appiconset/ Icon-128_2x-1.png b/Demos/FluentUIDemo_macOS/FluentUITestApp/Assets.xcassets/AppIcon.appiconset/ Icon-128_2x-1.png new file mode 100644 index 0000000000..7abd13c045 Binary files /dev/null and b/Demos/FluentUIDemo_macOS/FluentUITestApp/Assets.xcassets/AppIcon.appiconset/ Icon-128_2x-1.png differ diff --git a/Demos/FluentUIDemo_macOS/FluentUITestApp/Assets.xcassets/AppIcon.appiconset/ Icon-128_2x.png b/Demos/FluentUIDemo_macOS/FluentUITestApp/Assets.xcassets/AppIcon.appiconset/ Icon-128_2x.png new file mode 100644 index 0000000000..7abd13c045 Binary files /dev/null and b/Demos/FluentUIDemo_macOS/FluentUITestApp/Assets.xcassets/AppIcon.appiconset/ Icon-128_2x.png differ diff --git a/Demos/FluentUIDemo_macOS/FluentUITestApp/Assets.xcassets/AppIcon.appiconset/ Icon-16.png b/Demos/FluentUIDemo_macOS/FluentUITestApp/Assets.xcassets/AppIcon.appiconset/ Icon-16.png new file mode 100644 index 0000000000..6a42ee556d Binary files /dev/null and b/Demos/FluentUIDemo_macOS/FluentUITestApp/Assets.xcassets/AppIcon.appiconset/ Icon-16.png differ diff --git a/Demos/FluentUIDemo_macOS/FluentUITestApp/Assets.xcassets/AppIcon.appiconset/ Icon-16_2x.png b/Demos/FluentUIDemo_macOS/FluentUITestApp/Assets.xcassets/AppIcon.appiconset/ Icon-16_2x.png new file mode 100644 index 0000000000..f9f17171b4 Binary files /dev/null and b/Demos/FluentUIDemo_macOS/FluentUITestApp/Assets.xcassets/AppIcon.appiconset/ Icon-16_2x.png differ diff --git a/Demos/FluentUIDemo_macOS/FluentUITestApp/Assets.xcassets/AppIcon.appiconset/ Icon-256_2x.png b/Demos/FluentUIDemo_macOS/FluentUITestApp/Assets.xcassets/AppIcon.appiconset/ Icon-256_2x.png new file mode 100644 index 0000000000..22b323cbec Binary files /dev/null and b/Demos/FluentUIDemo_macOS/FluentUITestApp/Assets.xcassets/AppIcon.appiconset/ Icon-256_2x.png differ diff --git a/Demos/FluentUIDemo_macOS/FluentUITestApp/Assets.xcassets/AppIcon.appiconset/ Icon-32.png b/Demos/FluentUIDemo_macOS/FluentUITestApp/Assets.xcassets/AppIcon.appiconset/ Icon-32.png new file mode 100644 index 0000000000..dbd9c19671 Binary files /dev/null and b/Demos/FluentUIDemo_macOS/FluentUITestApp/Assets.xcassets/AppIcon.appiconset/ Icon-32.png differ diff --git a/Demos/FluentUIDemo_macOS/FluentUITestApp/Assets.xcassets/AppIcon.appiconset/ Icon-32_2x.png b/Demos/FluentUIDemo_macOS/FluentUITestApp/Assets.xcassets/AppIcon.appiconset/ Icon-32_2x.png new file mode 100644 index 0000000000..ad5af289e4 Binary files /dev/null and b/Demos/FluentUIDemo_macOS/FluentUITestApp/Assets.xcassets/AppIcon.appiconset/ Icon-32_2x.png differ diff --git a/Demos/FluentUIDemo_macOS/FluentUITestApp/Assets.xcassets/AppIcon.appiconset/ Icon-512.png b/Demos/FluentUIDemo_macOS/FluentUITestApp/Assets.xcassets/AppIcon.appiconset/ Icon-512.png new file mode 100644 index 0000000000..42a804d072 Binary files /dev/null and b/Demos/FluentUIDemo_macOS/FluentUITestApp/Assets.xcassets/AppIcon.appiconset/ Icon-512.png differ diff --git a/Demos/FluentUIDemo_macOS/FluentUITestApp/Assets.xcassets/AppIcon.appiconset/ Icon-512_2x.png b/Demos/FluentUIDemo_macOS/FluentUITestApp/Assets.xcassets/AppIcon.appiconset/ Icon-512_2x.png new file mode 100644 index 0000000000..a2032e43b8 Binary files /dev/null and b/Demos/FluentUIDemo_macOS/FluentUITestApp/Assets.xcassets/AppIcon.appiconset/ Icon-512_2x.png differ diff --git a/macos/FluentUITestApp/Assets.xcassets/AppIcon.appiconset/Contents.json b/Demos/FluentUIDemo_macOS/FluentUITestApp/Assets.xcassets/AppIcon.appiconset/Contents.json similarity index 100% rename from macos/FluentUITestApp/Assets.xcassets/AppIcon.appiconset/Contents.json rename to Demos/FluentUIDemo_macOS/FluentUITestApp/Assets.xcassets/AppIcon.appiconset/Contents.json diff --git a/macos/FluentUITestApp/Assets.xcassets/AvatarView/Contents.json b/Demos/FluentUIDemo_macOS/FluentUITestApp/Assets.xcassets/AvatarView/Contents.json similarity index 100% rename from macos/FluentUITestApp/Assets.xcassets/AvatarView/Contents.json rename to Demos/FluentUIDemo_macOS/FluentUITestApp/Assets.xcassets/AvatarView/Contents.json diff --git a/macos/FluentUITestApp/Assets.xcassets/AvatarView/persona-female.imageset/Contents.json b/Demos/FluentUIDemo_macOS/FluentUITestApp/Assets.xcassets/AvatarView/persona-female.imageset/Contents.json similarity index 100% rename from macos/FluentUITestApp/Assets.xcassets/AvatarView/persona-female.imageset/Contents.json rename to Demos/FluentUIDemo_macOS/FluentUITestApp/Assets.xcassets/AvatarView/persona-female.imageset/Contents.json diff --git a/macos/FluentUITestApp/Assets.xcassets/AvatarView/persona-female.imageset/persona-female.png b/Demos/FluentUIDemo_macOS/FluentUITestApp/Assets.xcassets/AvatarView/persona-female.imageset/persona-female.png similarity index 100% rename from macos/FluentUITestApp/Assets.xcassets/AvatarView/persona-female.imageset/persona-female.png rename to Demos/FluentUIDemo_macOS/FluentUITestApp/Assets.xcassets/AvatarView/persona-female.imageset/persona-female.png diff --git a/macos/FluentUITestApp/Assets.xcassets/AvatarView/persona-male.imageset/Contents.json b/Demos/FluentUIDemo_macOS/FluentUITestApp/Assets.xcassets/AvatarView/persona-male.imageset/Contents.json similarity index 100% rename from macos/FluentUITestApp/Assets.xcassets/AvatarView/persona-male.imageset/Contents.json rename to Demos/FluentUIDemo_macOS/FluentUITestApp/Assets.xcassets/AvatarView/persona-male.imageset/Contents.json diff --git a/macos/FluentUITestApp/Assets.xcassets/AvatarView/persona-male.imageset/persona-male.png b/Demos/FluentUIDemo_macOS/FluentUITestApp/Assets.xcassets/AvatarView/persona-male.imageset/persona-male.png similarity index 100% rename from macos/FluentUITestApp/Assets.xcassets/AvatarView/persona-male.imageset/persona-male.png rename to Demos/FluentUIDemo_macOS/FluentUITestApp/Assets.xcassets/AvatarView/persona-male.imageset/persona-male.png diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/AvatarView/Contents.json b/Demos/FluentUIDemo_macOS/FluentUITestApp/Assets.xcassets/Colors/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/AvatarView/Contents.json rename to Demos/FluentUIDemo_macOS/FluentUITestApp/Assets.xcassets/Colors/Contents.json diff --git a/macos/FluentUITestApp/Assets.xcassets/Colors/DemoPrimaryColor.colorset/Contents.json b/Demos/FluentUIDemo_macOS/FluentUITestApp/Assets.xcassets/Colors/DemoPrimaryColor.colorset/Contents.json similarity index 100% rename from macos/FluentUITestApp/Assets.xcassets/Colors/DemoPrimaryColor.colorset/Contents.json rename to Demos/FluentUIDemo_macOS/FluentUITestApp/Assets.xcassets/Colors/DemoPrimaryColor.colorset/Contents.json diff --git a/macos/FluentUITestApp/Assets.xcassets/Colors/DemoPrimaryShade10Color.colorset/Contents.json b/Demos/FluentUIDemo_macOS/FluentUITestApp/Assets.xcassets/Colors/DemoPrimaryShade10Color.colorset/Contents.json similarity index 100% rename from macos/FluentUITestApp/Assets.xcassets/Colors/DemoPrimaryShade10Color.colorset/Contents.json rename to Demos/FluentUIDemo_macOS/FluentUITestApp/Assets.xcassets/Colors/DemoPrimaryShade10Color.colorset/Contents.json diff --git a/macos/FluentUITestApp/Assets.xcassets/Colors/DemoPrimaryShade20Color.colorset/Contents.json b/Demos/FluentUIDemo_macOS/FluentUITestApp/Assets.xcassets/Colors/DemoPrimaryShade20Color.colorset/Contents.json similarity index 100% rename from macos/FluentUITestApp/Assets.xcassets/Colors/DemoPrimaryShade20Color.colorset/Contents.json rename to Demos/FluentUIDemo_macOS/FluentUITestApp/Assets.xcassets/Colors/DemoPrimaryShade20Color.colorset/Contents.json diff --git a/macos/FluentUITestApp/Assets.xcassets/Colors/DemoPrimaryShade30Color.colorset/Contents.json b/Demos/FluentUIDemo_macOS/FluentUITestApp/Assets.xcassets/Colors/DemoPrimaryShade30Color.colorset/Contents.json similarity index 100% rename from macos/FluentUITestApp/Assets.xcassets/Colors/DemoPrimaryShade30Color.colorset/Contents.json rename to Demos/FluentUIDemo_macOS/FluentUITestApp/Assets.xcassets/Colors/DemoPrimaryShade30Color.colorset/Contents.json diff --git a/macos/FluentUITestApp/Assets.xcassets/Colors/DemoPrimaryTint10Color.colorset/Contents.json b/Demos/FluentUIDemo_macOS/FluentUITestApp/Assets.xcassets/Colors/DemoPrimaryTint10Color.colorset/Contents.json similarity index 100% rename from macos/FluentUITestApp/Assets.xcassets/Colors/DemoPrimaryTint10Color.colorset/Contents.json rename to Demos/FluentUIDemo_macOS/FluentUITestApp/Assets.xcassets/Colors/DemoPrimaryTint10Color.colorset/Contents.json diff --git a/macos/FluentUITestApp/Assets.xcassets/Colors/DemoPrimaryTint20Color.colorset/Contents.json b/Demos/FluentUIDemo_macOS/FluentUITestApp/Assets.xcassets/Colors/DemoPrimaryTint20Color.colorset/Contents.json similarity index 100% rename from macos/FluentUITestApp/Assets.xcassets/Colors/DemoPrimaryTint20Color.colorset/Contents.json rename to Demos/FluentUIDemo_macOS/FluentUITestApp/Assets.xcassets/Colors/DemoPrimaryTint20Color.colorset/Contents.json diff --git a/macos/FluentUITestApp/Assets.xcassets/Colors/DemoPrimaryTint30Color.colorset/Contents.json b/Demos/FluentUIDemo_macOS/FluentUITestApp/Assets.xcassets/Colors/DemoPrimaryTint30Color.colorset/Contents.json similarity index 100% rename from macos/FluentUITestApp/Assets.xcassets/Colors/DemoPrimaryTint30Color.colorset/Contents.json rename to Demos/FluentUIDemo_macOS/FluentUITestApp/Assets.xcassets/Colors/DemoPrimaryTint30Color.colorset/Contents.json diff --git a/macos/FluentUITestApp/Assets.xcassets/Colors/DemoPrimaryTint40Color.colorset/Contents.json b/Demos/FluentUIDemo_macOS/FluentUITestApp/Assets.xcassets/Colors/DemoPrimaryTint40Color.colorset/Contents.json similarity index 100% rename from macos/FluentUITestApp/Assets.xcassets/Colors/DemoPrimaryTint40Color.colorset/Contents.json rename to Demos/FluentUIDemo_macOS/FluentUITestApp/Assets.xcassets/Colors/DemoPrimaryTint40Color.colorset/Contents.json diff --git a/macos/FluentUITestApp/Assets.xcassets/Contents.json b/Demos/FluentUIDemo_macOS/FluentUITestApp/Assets.xcassets/Contents.json similarity index 100% rename from macos/FluentUITestApp/Assets.xcassets/Contents.json rename to Demos/FluentUIDemo_macOS/FluentUITestApp/Assets.xcassets/Contents.json diff --git a/macos/FluentUITestApp/Assets.xcassets/FilledTemplateImageView/Contents.json b/Demos/FluentUIDemo_macOS/FluentUITestApp/Assets.xcassets/FilledTemplateImageView/Contents.json similarity index 100% rename from macos/FluentUITestApp/Assets.xcassets/FilledTemplateImageView/Contents.json rename to Demos/FluentUIDemo_macOS/FluentUITestApp/Assets.xcassets/FilledTemplateImageView/Contents.json diff --git a/macos/FluentUITestApp/Assets.xcassets/FilledTemplateImageView/FluentBadge.imageset/Contents.json b/Demos/FluentUIDemo_macOS/FluentUITestApp/Assets.xcassets/FilledTemplateImageView/FluentBadge.imageset/Contents.json similarity index 100% rename from macos/FluentUITestApp/Assets.xcassets/FilledTemplateImageView/FluentBadge.imageset/Contents.json rename to Demos/FluentUIDemo_macOS/FluentUITestApp/Assets.xcassets/FilledTemplateImageView/FluentBadge.imageset/Contents.json diff --git a/macos/FluentUITestApp/Assets.xcassets/FilledTemplateImageView/FluentBadge.imageset/ic_fluent_tag_regular.pdf b/Demos/FluentUIDemo_macOS/FluentUITestApp/Assets.xcassets/FilledTemplateImageView/FluentBadge.imageset/ic_fluent_tag_regular.pdf similarity index 100% rename from macos/FluentUITestApp/Assets.xcassets/FilledTemplateImageView/FluentBadge.imageset/ic_fluent_tag_regular.pdf rename to Demos/FluentUIDemo_macOS/FluentUITestApp/Assets.xcassets/FilledTemplateImageView/FluentBadge.imageset/ic_fluent_tag_regular.pdf diff --git a/macos/FluentUITestApp/Assets.xcassets/FilledTemplateImageView/FluentBadgeLocked.imageset/Contents.json b/Demos/FluentUIDemo_macOS/FluentUITestApp/Assets.xcassets/FilledTemplateImageView/FluentBadgeLocked.imageset/Contents.json similarity index 100% rename from macos/FluentUITestApp/Assets.xcassets/FilledTemplateImageView/FluentBadgeLocked.imageset/Contents.json rename to Demos/FluentUIDemo_macOS/FluentUITestApp/Assets.xcassets/FilledTemplateImageView/FluentBadgeLocked.imageset/Contents.json diff --git a/macos/FluentUITestApp/Assets.xcassets/FilledTemplateImageView/FluentBadgeLocked.imageset/ic_fluent_tag_lock_regular.pdf b/Demos/FluentUIDemo_macOS/FluentUITestApp/Assets.xcassets/FilledTemplateImageView/FluentBadgeLocked.imageset/ic_fluent_tag_lock_regular.pdf similarity index 100% rename from macos/FluentUITestApp/Assets.xcassets/FilledTemplateImageView/FluentBadgeLocked.imageset/ic_fluent_tag_lock_regular.pdf rename to Demos/FluentUIDemo_macOS/FluentUITestApp/Assets.xcassets/FilledTemplateImageView/FluentBadgeLocked.imageset/ic_fluent_tag_lock_regular.pdf diff --git a/macos/FluentUITestApp/Assets.xcassets/FilledTemplateImageView/FluentBadgeLocked_Mask.imageset/Contents.json b/Demos/FluentUIDemo_macOS/FluentUITestApp/Assets.xcassets/FilledTemplateImageView/FluentBadgeLocked_Mask.imageset/Contents.json similarity index 100% rename from macos/FluentUITestApp/Assets.xcassets/FilledTemplateImageView/FluentBadgeLocked_Mask.imageset/Contents.json rename to Demos/FluentUIDemo_macOS/FluentUITestApp/Assets.xcassets/FilledTemplateImageView/FluentBadgeLocked_Mask.imageset/Contents.json diff --git a/macos/FluentUITestApp/Assets.xcassets/FilledTemplateImageView/FluentBadgeLocked_Mask.imageset/ic_fluent_tag_lock_filled.pdf b/Demos/FluentUIDemo_macOS/FluentUITestApp/Assets.xcassets/FilledTemplateImageView/FluentBadgeLocked_Mask.imageset/ic_fluent_tag_lock_filled.pdf similarity index 100% rename from macos/FluentUITestApp/Assets.xcassets/FilledTemplateImageView/FluentBadgeLocked_Mask.imageset/ic_fluent_tag_lock_filled.pdf rename to Demos/FluentUIDemo_macOS/FluentUITestApp/Assets.xcassets/FilledTemplateImageView/FluentBadgeLocked_Mask.imageset/ic_fluent_tag_lock_filled.pdf diff --git a/macos/FluentUITestApp/Assets.xcassets/FilledTemplateImageView/FluentBadge_Mask.imageset/Contents.json b/Demos/FluentUIDemo_macOS/FluentUITestApp/Assets.xcassets/FilledTemplateImageView/FluentBadge_Mask.imageset/Contents.json similarity index 100% rename from macos/FluentUITestApp/Assets.xcassets/FilledTemplateImageView/FluentBadge_Mask.imageset/Contents.json rename to Demos/FluentUIDemo_macOS/FluentUITestApp/Assets.xcassets/FilledTemplateImageView/FluentBadge_Mask.imageset/Contents.json diff --git a/macos/FluentUITestApp/Assets.xcassets/FilledTemplateImageView/FluentBadge_Mask.imageset/ic_fluent_tag_filled.pdf b/Demos/FluentUIDemo_macOS/FluentUITestApp/Assets.xcassets/FilledTemplateImageView/FluentBadge_Mask.imageset/ic_fluent_tag_filled.pdf similarity index 100% rename from macos/FluentUITestApp/Assets.xcassets/FilledTemplateImageView/FluentBadge_Mask.imageset/ic_fluent_tag_filled.pdf rename to Demos/FluentUIDemo_macOS/FluentUITestApp/Assets.xcassets/FilledTemplateImageView/FluentBadge_Mask.imageset/ic_fluent_tag_filled.pdf diff --git a/macos/FluentUITestApp/Assets.xcassets/ic_fluent_chevron_down_12_regular.imageset/Contents.json b/Demos/FluentUIDemo_macOS/FluentUITestApp/Assets.xcassets/ic_fluent_chevron_down_12_regular.imageset/Contents.json similarity index 100% rename from macos/FluentUITestApp/Assets.xcassets/ic_fluent_chevron_down_12_regular.imageset/Contents.json rename to Demos/FluentUIDemo_macOS/FluentUITestApp/Assets.xcassets/ic_fluent_chevron_down_12_regular.imageset/Contents.json diff --git a/macos/FluentUITestApp/Assets.xcassets/ic_fluent_chevron_down_12_regular.imageset/ic_fluent_chevron_down_12_regular.svg b/Demos/FluentUIDemo_macOS/FluentUITestApp/Assets.xcassets/ic_fluent_chevron_down_12_regular.imageset/ic_fluent_chevron_down_12_regular.svg similarity index 100% rename from macos/FluentUITestApp/Assets.xcassets/ic_fluent_chevron_down_12_regular.imageset/ic_fluent_chevron_down_12_regular.svg rename to Demos/FluentUIDemo_macOS/FluentUITestApp/Assets.xcassets/ic_fluent_chevron_down_12_regular.imageset/ic_fluent_chevron_down_12_regular.svg diff --git a/macos/FluentUITestApp/Assets.xcassets/ic_fluent_non_template_24_filled.imageset/Contents.json b/Demos/FluentUIDemo_macOS/FluentUITestApp/Assets.xcassets/ic_fluent_non_template_24_filled.imageset/Contents.json similarity index 100% rename from macos/FluentUITestApp/Assets.xcassets/ic_fluent_non_template_24_filled.imageset/Contents.json rename to Demos/FluentUIDemo_macOS/FluentUITestApp/Assets.xcassets/ic_fluent_non_template_24_filled.imageset/Contents.json diff --git a/macos/FluentUITestApp/Assets.xcassets/ic_fluent_non_template_24_filled.imageset/icon_24x24.png b/Demos/FluentUIDemo_macOS/FluentUITestApp/Assets.xcassets/ic_fluent_non_template_24_filled.imageset/icon_24x24.png similarity index 100% rename from macos/FluentUITestApp/Assets.xcassets/ic_fluent_non_template_24_filled.imageset/icon_24x24.png rename to Demos/FluentUIDemo_macOS/FluentUITestApp/Assets.xcassets/ic_fluent_non_template_24_filled.imageset/icon_24x24.png diff --git a/macos/FluentUITestApp/Base.lproj/MainMenu.xib b/Demos/FluentUIDemo_macOS/FluentUITestApp/Base.lproj/MainMenu.xib similarity index 100% rename from macos/FluentUITestApp/Base.lproj/MainMenu.xib rename to Demos/FluentUIDemo_macOS/FluentUITestApp/Base.lproj/MainMenu.xib diff --git a/macos/FluentUITestApp/FluentUITestApp-Info.plist b/Demos/FluentUIDemo_macOS/FluentUITestApp/FluentUITestApp-Info.plist similarity index 95% rename from macos/FluentUITestApp/FluentUITestApp-Info.plist rename to Demos/FluentUIDemo_macOS/FluentUITestApp/FluentUITestApp-Info.plist index 878eb6b256..b1f58c526c 100644 --- a/macos/FluentUITestApp/FluentUITestApp-Info.plist +++ b/Demos/FluentUIDemo_macOS/FluentUITestApp/FluentUITestApp-Info.plist @@ -17,9 +17,9 @@ CFBundlePackageType APPL CFBundleShortVersionString - 0.26.0 + 0.32.0 CFBundleVersion - 62.26.0 + 62.32.0 LSApplicationCategoryType public.app-category.developer-tools LSMinimumSystemVersion diff --git a/macos/FluentUITestApp/TestControlsViewController.swift b/Demos/FluentUIDemo_macOS/FluentUITestApp/TestControlsViewController.swift similarity index 100% rename from macos/FluentUITestApp/TestControlsViewController.swift rename to Demos/FluentUIDemo_macOS/FluentUITestApp/TestControlsViewController.swift diff --git a/macos/FluentUITestApp/ar.lproj/MainMenu.strings b/Demos/FluentUIDemo_macOS/FluentUITestApp/ar.lproj/MainMenu.strings similarity index 100% rename from macos/FluentUITestApp/ar.lproj/MainMenu.strings rename to Demos/FluentUIDemo_macOS/FluentUITestApp/ar.lproj/MainMenu.strings diff --git a/macos/FluentUITestApp/ca.lproj/MainMenu.strings b/Demos/FluentUIDemo_macOS/FluentUITestApp/ca.lproj/MainMenu.strings similarity index 100% rename from macos/FluentUITestApp/ca.lproj/MainMenu.strings rename to Demos/FluentUIDemo_macOS/FluentUITestApp/ca.lproj/MainMenu.strings diff --git a/macos/FluentUITestApp/cs.lproj/MainMenu.strings b/Demos/FluentUIDemo_macOS/FluentUITestApp/cs.lproj/MainMenu.strings similarity index 100% rename from macos/FluentUITestApp/cs.lproj/MainMenu.strings rename to Demos/FluentUIDemo_macOS/FluentUITestApp/cs.lproj/MainMenu.strings diff --git a/macos/FluentUITestApp/da.lproj/MainMenu.strings b/Demos/FluentUIDemo_macOS/FluentUITestApp/da.lproj/MainMenu.strings similarity index 100% rename from macos/FluentUITestApp/da.lproj/MainMenu.strings rename to Demos/FluentUIDemo_macOS/FluentUITestApp/da.lproj/MainMenu.strings diff --git a/macos/FluentUITestApp/de.lproj/MainMenu.strings b/Demos/FluentUIDemo_macOS/FluentUITestApp/de.lproj/MainMenu.strings similarity index 100% rename from macos/FluentUITestApp/de.lproj/MainMenu.strings rename to Demos/FluentUIDemo_macOS/FluentUITestApp/de.lproj/MainMenu.strings diff --git a/macos/FluentUITestApp/el.lproj/MainMenu.strings b/Demos/FluentUIDemo_macOS/FluentUITestApp/el.lproj/MainMenu.strings similarity index 100% rename from macos/FluentUITestApp/el.lproj/MainMenu.strings rename to Demos/FluentUIDemo_macOS/FluentUITestApp/el.lproj/MainMenu.strings diff --git a/macos/FluentUITestApp/en-GB.lproj/MainMenu.strings b/Demos/FluentUIDemo_macOS/FluentUITestApp/en-GB.lproj/MainMenu.strings similarity index 100% rename from macos/FluentUITestApp/en-GB.lproj/MainMenu.strings rename to Demos/FluentUIDemo_macOS/FluentUITestApp/en-GB.lproj/MainMenu.strings diff --git a/macos/FluentUITestApp/en.lproj/MainMenu.strings b/Demos/FluentUIDemo_macOS/FluentUITestApp/en.lproj/MainMenu.strings similarity index 100% rename from macos/FluentUITestApp/en.lproj/MainMenu.strings rename to Demos/FluentUIDemo_macOS/FluentUITestApp/en.lproj/MainMenu.strings diff --git a/macos/FluentUITestApp/es-MX.lproj/MainMenu.strings b/Demos/FluentUIDemo_macOS/FluentUITestApp/es-MX.lproj/MainMenu.strings similarity index 100% rename from macos/FluentUITestApp/es-MX.lproj/MainMenu.strings rename to Demos/FluentUIDemo_macOS/FluentUITestApp/es-MX.lproj/MainMenu.strings diff --git a/macos/FluentUITestApp/es.lproj/MainMenu.strings b/Demos/FluentUIDemo_macOS/FluentUITestApp/es.lproj/MainMenu.strings similarity index 100% rename from macos/FluentUITestApp/es.lproj/MainMenu.strings rename to Demos/FluentUIDemo_macOS/FluentUITestApp/es.lproj/MainMenu.strings diff --git a/macos/FluentUITestApp/fi.lproj/MainMenu.strings b/Demos/FluentUIDemo_macOS/FluentUITestApp/fi.lproj/MainMenu.strings similarity index 100% rename from macos/FluentUITestApp/fi.lproj/MainMenu.strings rename to Demos/FluentUIDemo_macOS/FluentUITestApp/fi.lproj/MainMenu.strings diff --git a/macos/FluentUITestApp/fr.lproj/MainMenu.strings b/Demos/FluentUIDemo_macOS/FluentUITestApp/fr.lproj/MainMenu.strings similarity index 100% rename from macos/FluentUITestApp/fr.lproj/MainMenu.strings rename to Demos/FluentUIDemo_macOS/FluentUITestApp/fr.lproj/MainMenu.strings diff --git a/macos/FluentUITestApp/he.lproj/MainMenu.strings b/Demos/FluentUIDemo_macOS/FluentUITestApp/he.lproj/MainMenu.strings similarity index 100% rename from macos/FluentUITestApp/he.lproj/MainMenu.strings rename to Demos/FluentUIDemo_macOS/FluentUITestApp/he.lproj/MainMenu.strings diff --git a/macos/FluentUITestApp/hi.lproj/MainMenu.strings b/Demos/FluentUIDemo_macOS/FluentUITestApp/hi.lproj/MainMenu.strings similarity index 100% rename from macos/FluentUITestApp/hi.lproj/MainMenu.strings rename to Demos/FluentUIDemo_macOS/FluentUITestApp/hi.lproj/MainMenu.strings diff --git a/macos/FluentUITestApp/hr.lproj/MainMenu.strings b/Demos/FluentUIDemo_macOS/FluentUITestApp/hr.lproj/MainMenu.strings similarity index 100% rename from macos/FluentUITestApp/hr.lproj/MainMenu.strings rename to Demos/FluentUIDemo_macOS/FluentUITestApp/hr.lproj/MainMenu.strings diff --git a/macos/FluentUITestApp/hu.lproj/MainMenu.strings b/Demos/FluentUIDemo_macOS/FluentUITestApp/hu.lproj/MainMenu.strings similarity index 100% rename from macos/FluentUITestApp/hu.lproj/MainMenu.strings rename to Demos/FluentUIDemo_macOS/FluentUITestApp/hu.lproj/MainMenu.strings diff --git a/macos/FluentUITestApp/id.lproj/MainMenu.strings b/Demos/FluentUIDemo_macOS/FluentUITestApp/id.lproj/MainMenu.strings similarity index 100% rename from macos/FluentUITestApp/id.lproj/MainMenu.strings rename to Demos/FluentUIDemo_macOS/FluentUITestApp/id.lproj/MainMenu.strings diff --git a/macos/FluentUITestApp/it.lproj/MainMenu.strings b/Demos/FluentUIDemo_macOS/FluentUITestApp/it.lproj/MainMenu.strings similarity index 100% rename from macos/FluentUITestApp/it.lproj/MainMenu.strings rename to Demos/FluentUIDemo_macOS/FluentUITestApp/it.lproj/MainMenu.strings diff --git a/macos/FluentUITestApp/ja.lproj/MainMenu.strings b/Demos/FluentUIDemo_macOS/FluentUITestApp/ja.lproj/MainMenu.strings similarity index 100% rename from macos/FluentUITestApp/ja.lproj/MainMenu.strings rename to Demos/FluentUIDemo_macOS/FluentUITestApp/ja.lproj/MainMenu.strings diff --git a/macos/FluentUITestApp/ko.lproj/MainMenu.strings b/Demos/FluentUIDemo_macOS/FluentUITestApp/ko.lproj/MainMenu.strings similarity index 100% rename from macos/FluentUITestApp/ko.lproj/MainMenu.strings rename to Demos/FluentUIDemo_macOS/FluentUITestApp/ko.lproj/MainMenu.strings diff --git a/macos/FluentUITestApp/ms.lproj/MainMenu.strings b/Demos/FluentUIDemo_macOS/FluentUITestApp/ms.lproj/MainMenu.strings similarity index 100% rename from macos/FluentUITestApp/ms.lproj/MainMenu.strings rename to Demos/FluentUIDemo_macOS/FluentUITestApp/ms.lproj/MainMenu.strings diff --git a/macos/FluentUITestApp/nb-NO.lproj/MainMenu.strings b/Demos/FluentUIDemo_macOS/FluentUITestApp/nb-NO.lproj/MainMenu.strings similarity index 100% rename from macos/FluentUITestApp/nb-NO.lproj/MainMenu.strings rename to Demos/FluentUIDemo_macOS/FluentUITestApp/nb-NO.lproj/MainMenu.strings diff --git a/macos/FluentUITestApp/nl.lproj/MainMenu.strings b/Demos/FluentUIDemo_macOS/FluentUITestApp/nl.lproj/MainMenu.strings similarity index 100% rename from macos/FluentUITestApp/nl.lproj/MainMenu.strings rename to Demos/FluentUIDemo_macOS/FluentUITestApp/nl.lproj/MainMenu.strings diff --git a/macos/FluentUITestApp/pl.lproj/MainMenu.strings b/Demos/FluentUIDemo_macOS/FluentUITestApp/pl.lproj/MainMenu.strings similarity index 100% rename from macos/FluentUITestApp/pl.lproj/MainMenu.strings rename to Demos/FluentUIDemo_macOS/FluentUITestApp/pl.lproj/MainMenu.strings diff --git a/macos/FluentUITestApp/pt-BR.lproj/MainMenu.strings b/Demos/FluentUIDemo_macOS/FluentUITestApp/pt-BR.lproj/MainMenu.strings similarity index 100% rename from macos/FluentUITestApp/pt-BR.lproj/MainMenu.strings rename to Demos/FluentUIDemo_macOS/FluentUITestApp/pt-BR.lproj/MainMenu.strings diff --git a/macos/FluentUITestApp/pt-PT.lproj/MainMenu.strings b/Demos/FluentUIDemo_macOS/FluentUITestApp/pt-PT.lproj/MainMenu.strings similarity index 100% rename from macos/FluentUITestApp/pt-PT.lproj/MainMenu.strings rename to Demos/FluentUIDemo_macOS/FluentUITestApp/pt-PT.lproj/MainMenu.strings diff --git a/macos/FluentUITestApp/ro.lproj/MainMenu.strings b/Demos/FluentUIDemo_macOS/FluentUITestApp/ro.lproj/MainMenu.strings similarity index 100% rename from macos/FluentUITestApp/ro.lproj/MainMenu.strings rename to Demos/FluentUIDemo_macOS/FluentUITestApp/ro.lproj/MainMenu.strings diff --git a/macos/FluentUITestApp/ru.lproj/MainMenu.strings b/Demos/FluentUIDemo_macOS/FluentUITestApp/ru.lproj/MainMenu.strings similarity index 100% rename from macos/FluentUITestApp/ru.lproj/MainMenu.strings rename to Demos/FluentUIDemo_macOS/FluentUITestApp/ru.lproj/MainMenu.strings diff --git a/macos/FluentUITestApp/sk.lproj/MainMenu.strings b/Demos/FluentUIDemo_macOS/FluentUITestApp/sk.lproj/MainMenu.strings similarity index 100% rename from macos/FluentUITestApp/sk.lproj/MainMenu.strings rename to Demos/FluentUIDemo_macOS/FluentUITestApp/sk.lproj/MainMenu.strings diff --git a/macos/FluentUITestApp/sv.lproj/MainMenu.strings b/Demos/FluentUIDemo_macOS/FluentUITestApp/sv.lproj/MainMenu.strings similarity index 100% rename from macos/FluentUITestApp/sv.lproj/MainMenu.strings rename to Demos/FluentUIDemo_macOS/FluentUITestApp/sv.lproj/MainMenu.strings diff --git a/macos/FluentUITestApp/th.lproj/MainMenu.strings b/Demos/FluentUIDemo_macOS/FluentUITestApp/th.lproj/MainMenu.strings similarity index 100% rename from macos/FluentUITestApp/th.lproj/MainMenu.strings rename to Demos/FluentUIDemo_macOS/FluentUITestApp/th.lproj/MainMenu.strings diff --git a/macos/FluentUITestApp/tr.lproj/MainMenu.strings b/Demos/FluentUIDemo_macOS/FluentUITestApp/tr.lproj/MainMenu.strings similarity index 100% rename from macos/FluentUITestApp/tr.lproj/MainMenu.strings rename to Demos/FluentUIDemo_macOS/FluentUITestApp/tr.lproj/MainMenu.strings diff --git a/macos/FluentUITestApp/uk.lproj/MainMenu.strings b/Demos/FluentUIDemo_macOS/FluentUITestApp/uk.lproj/MainMenu.strings similarity index 100% rename from macos/FluentUITestApp/uk.lproj/MainMenu.strings rename to Demos/FluentUIDemo_macOS/FluentUITestApp/uk.lproj/MainMenu.strings diff --git a/macos/FluentUITestApp/vi.lproj/MainMenu.strings b/Demos/FluentUIDemo_macOS/FluentUITestApp/vi.lproj/MainMenu.strings similarity index 100% rename from macos/FluentUITestApp/vi.lproj/MainMenu.strings rename to Demos/FluentUIDemo_macOS/FluentUITestApp/vi.lproj/MainMenu.strings diff --git a/macos/FluentUITestApp/zh-Hans.lproj/MainMenu.strings b/Demos/FluentUIDemo_macOS/FluentUITestApp/zh-Hans.lproj/MainMenu.strings similarity index 100% rename from macos/FluentUITestApp/zh-Hans.lproj/MainMenu.strings rename to Demos/FluentUIDemo_macOS/FluentUITestApp/zh-Hans.lproj/MainMenu.strings diff --git a/macos/FluentUITestApp/zh-Hant.lproj/MainMenu.strings b/Demos/FluentUIDemo_macOS/FluentUITestApp/zh-Hant.lproj/MainMenu.strings similarity index 100% rename from macos/FluentUITestApp/zh-Hant.lproj/MainMenu.strings rename to Demos/FluentUIDemo_macOS/FluentUITestApp/zh-Hant.lproj/MainMenu.strings diff --git a/macos/FluentUITestViewControllers/TestAvatarViewController.swift b/Demos/FluentUIDemo_macOS/FluentUITestViewControllers/TestAvatarViewController.swift similarity index 100% rename from macos/FluentUITestViewControllers/TestAvatarViewController.swift rename to Demos/FluentUIDemo_macOS/FluentUITestViewControllers/TestAvatarViewController.swift diff --git a/macos/FluentUITestViewControllers/TestBadgeViewController.swift b/Demos/FluentUIDemo_macOS/FluentUITestViewControllers/TestBadgeViewController.swift similarity index 100% rename from macos/FluentUITestViewControllers/TestBadgeViewController.swift rename to Demos/FluentUIDemo_macOS/FluentUITestViewControllers/TestBadgeViewController.swift diff --git a/macos/FluentUITestViewControllers/TestButtonViewController.swift b/Demos/FluentUIDemo_macOS/FluentUITestViewControllers/TestButtonViewController.swift similarity index 100% rename from macos/FluentUITestViewControllers/TestButtonViewController.swift rename to Demos/FluentUIDemo_macOS/FluentUITestViewControllers/TestButtonViewController.swift diff --git a/macos/FluentUITestViewControllers/TestColorProvider.swift b/Demos/FluentUIDemo_macOS/FluentUITestViewControllers/TestColorProvider.swift similarity index 100% rename from macos/FluentUITestViewControllers/TestColorProvider.swift rename to Demos/FluentUIDemo_macOS/FluentUITestViewControllers/TestColorProvider.swift diff --git a/macos/FluentUITestViewControllers/TestColorViewController.swift b/Demos/FluentUIDemo_macOS/FluentUITestViewControllers/TestColorViewController.swift similarity index 100% rename from macos/FluentUITestViewControllers/TestColorViewController.swift rename to Demos/FluentUIDemo_macOS/FluentUITestViewControllers/TestColorViewController.swift diff --git a/macos/FluentUITestViewControllers/TestDatePickerController.swift b/Demos/FluentUIDemo_macOS/FluentUITestViewControllers/TestDatePickerController.swift similarity index 100% rename from macos/FluentUITestViewControllers/TestDatePickerController.swift rename to Demos/FluentUIDemo_macOS/FluentUITestViewControllers/TestDatePickerController.swift diff --git a/macos/FluentUITestViewControllers/TestFilledTemplateImageViewController.swift b/Demos/FluentUIDemo_macOS/FluentUITestViewControllers/TestFilledTemplateImageViewController.swift similarity index 100% rename from macos/FluentUITestViewControllers/TestFilledTemplateImageViewController.swift rename to Demos/FluentUIDemo_macOS/FluentUITestViewControllers/TestFilledTemplateImageViewController.swift diff --git a/macos/FluentUITestViewControllers/TestLinkViewController.swift b/Demos/FluentUIDemo_macOS/FluentUITestViewControllers/TestLinkViewController.swift similarity index 100% rename from macos/FluentUITestViewControllers/TestLinkViewController.swift rename to Demos/FluentUIDemo_macOS/FluentUITestViewControllers/TestLinkViewController.swift diff --git a/macos/FluentUITestViewControllers/TestNotificationBarViewController.swift b/Demos/FluentUIDemo_macOS/FluentUITestViewControllers/TestNotificationBarViewController.swift similarity index 100% rename from macos/FluentUITestViewControllers/TestNotificationBarViewController.swift rename to Demos/FluentUIDemo_macOS/FluentUITestViewControllers/TestNotificationBarViewController.swift diff --git a/macos/FluentUITestViewControllers/TestSeparatorViewController.swift b/Demos/FluentUIDemo_macOS/FluentUITestViewControllers/TestSeparatorViewController.swift similarity index 100% rename from macos/FluentUITestViewControllers/TestSeparatorViewController.swift rename to Demos/FluentUIDemo_macOS/FluentUITestViewControllers/TestSeparatorViewController.swift diff --git a/macos/FluentUITestViewControllers/TestViewControllers.swift b/Demos/FluentUIDemo_macOS/FluentUITestViewControllers/TestViewControllers.swift similarity index 100% rename from macos/FluentUITestViewControllers/TestViewControllers.swift rename to Demos/FluentUIDemo_macOS/FluentUITestViewControllers/TestViewControllers.swift diff --git a/macos/FluentUIUnitTest/FluentUIUnitTest-Info.plist b/Demos/FluentUIDemo_macOS/FluentUIUnitTest/FluentUIUnitTest-Info.plist similarity index 100% rename from macos/FluentUIUnitTest/FluentUIUnitTest-Info.plist rename to Demos/FluentUIDemo_macOS/FluentUIUnitTest/FluentUIUnitTest-Info.plist diff --git a/macos/xcode/FluentUI.xcodeproj/project.pbxproj b/Demos/FluentUIDemo_macOS/xcode/FluentUI.xcodeproj/project.pbxproj similarity index 62% rename from macos/xcode/FluentUI.xcodeproj/project.pbxproj rename to Demos/FluentUIDemo_macOS/xcode/FluentUI.xcodeproj/project.pbxproj index cbfedb76d7..ef23d5bbc6 100644 --- a/macos/xcode/FluentUI.xcodeproj/project.pbxproj +++ b/Demos/FluentUIDemo_macOS/xcode/FluentUI.xcodeproj/project.pbxproj @@ -3,11 +3,10 @@ archiveVersion = 1; classes = { }; - objectVersion = 50; + objectVersion = 54; objects = { /* Begin PBXBuildFile section */ - 2F6759B8251E4C2600210B3C /* SimpleObjCTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 2F6759B7251E4C2600210B3C /* SimpleObjCTest.m */; }; 3A42751229677C3700F36FBE /* BaseTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A42751129677C3700F36FBE /* BaseTest.swift */; }; 3A42751429677C3700F36FBE /* AvatarViewTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A42751329677C3700F36FBE /* AvatarViewTest.swift */; }; 3A42751B29677CA100F36FBE /* BadgeViewTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A42751A29677CA100F36FBE /* BadgeViewTest.swift */; }; @@ -18,38 +17,14 @@ 3A42752529677D0800F36FBE /* SeparatorTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A42752429677D0800F36FBE /* SeparatorTest.swift */; }; 3A42752729677D3700F36FBE /* ColorTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A42752629677D3700F36FBE /* ColorTest.swift */; }; 3A80A049299EE88900A4A3D2 /* NotificationBarViewTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A80A048299EE88900A4A3D2 /* NotificationBarViewTest.swift */; }; - 3A8CB0E02996CB8800B68FCF /* NotificationBarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A8CB0DF2996CB8800B68FCF /* NotificationBarView.swift */; }; 3A8CB0E32996CDA200B68FCF /* TestNotificationBarViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A8CB0E12996CD6400B68FCF /* TestNotificationBarViewController.swift */; }; - 3F2506DB25F2C7A90049ED54 /* DynamicColor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F2506D825F2C7A90049ED54 /* DynamicColor.swift */; }; - 3F2506DC25F2C7A90049ED54 /* Apperance+Theme.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F2506DA25F2C7A90049ED54 /* Apperance+Theme.swift */; }; - 53BCB0DB253A72AD00620960 /* Colors.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53BCB0DA253A72AD00620960 /* Colors.swift */; }; - 53BCB0E2253A72E000620960 /* FluentUIResources.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53BCB0E1253A72E000620960 /* FluentUIResources.swift */; }; - 53BCB0ED253A75BB00620960 /* AvatarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53BCB0EC253A75BB00620960 /* AvatarView.swift */; }; - 53BCB0F4253A75CF00620960 /* Button.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53BCB0F3253A75CF00620960 /* Button.swift */; }; - 53BCB0FB253A75E400620960 /* Link.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53BCB0FA253A75E400620960 /* Link.swift */; }; - 53BCB102253A75EF00620960 /* Separator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53BCB101253A75EF00620960 /* Separator.swift */; }; - 8005007722FB361200CA6343 /* DatePickerControllerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8005007622FB361200CA6343 /* DatePickerControllerTests.swift */; }; - 80117A7F22DCDF6F00813D59 /* CalendarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 80117A7E22DCDF6F00813D59 /* CalendarView.swift */; }; - 80117A8322E0E63E00813D59 /* CalendarHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 80117A8222E0E63E00813D59 /* CalendarHeaderView.swift */; }; - 804626C622D7908100AFA48C /* CalendarDayButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 804626C522D7908100AFA48C /* CalendarDayButton.swift */; }; - 8061BF7E22EF936800F2D245 /* DatePickerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8061BF7C22EF936700F2D245 /* DatePickerView.swift */; }; - 8061BF7F22EF936800F2D245 /* DatePickerController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8061BF7D22EF936700F2D245 /* DatePickerController.swift */; }; - 8F41CC7A2447B8DB0040B851 /* FluentUIResources-macos.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 8F41CC6D2447B60F0040B851 /* FluentUIResources-macos.bundle */; }; 8F5368052295F4BF0098AC8F /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8F5368042295F4BF0098AC8F /* AppDelegate.swift */; }; 8F5368072295F4C10098AC8F /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 8F5368062295F4C10098AC8F /* Assets.xcassets */; }; 8F53680A2295F4C10098AC8F /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 8F5368082295F4C10098AC8F /* MainMenu.xib */; }; - 921AF7D7269CD3C900255791 /* FluentUI.strings in Resources */ = {isa = PBXBuildFile; fileRef = 921AF7B1269CD39C00255791 /* FluentUI.strings */; }; - 9B4AEBA42703CADB00B68020 /* FilledTemplateImageView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9B4AEBA22703CADB00B68020 /* FilledTemplateImageView.swift */; }; + 9252C6222C62A8B3009C9272 /* FluentUI in Frameworks */ = {isa = PBXBuildFile; productRef = 9252C6212C62A8B3009C9272 /* FluentUI */; }; 9B4AEBAB2705206300B68020 /* TestFilledTemplateImageViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9B4AEBAA2705206300B68020 /* TestFilledTemplateImageViewController.swift */; }; 9B8661772A4F5DAE00FA4F78 /* TestColorProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9B8661752A4F5C4800FA4F78 /* TestColorProvider.swift */; }; - 9BE619162A1576BD0046463A /* ColorProviding.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9BE619152A1576BD0046463A /* ColorProviding.swift */; }; A257F81E2512DE45002CAA6E /* TestColorViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A257F81C2512DDF7002CAA6E /* TestColorViewController.swift */; }; - A257F826251D987E002CAA6E /* FluentUI-macos.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = A257F825251D987E002CAA6E /* FluentUI-macos.xcassets */; }; - AC7235D82492E0D000D0DCA8 /* FluentUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E61C96B22295E8D60006561F /* FluentUI.framework */; }; - AC7235D92492E0D000D0DCA8 /* FluentUI.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = E61C96B22295E8D60006561F /* FluentUI.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - E61C96BC2295E8D60006561F /* FluentUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E61C96B22295E8D60006561F /* FluentUI.framework */; }; - E61C96C12295E8D60006561F /* AvatarViewTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = E61C96C02295E8D60006561F /* AvatarViewTests.swift */; }; - E61C96CC2295EAC50006561F /* FluentUI.h in Headers */ = {isa = PBXBuildFile; fileRef = E61C96B52295E8D60006561F /* FluentUI.h */; settings = {ATTRIBUTES = (Public, ); }; }; E61C96D322962BC20006561F /* TestControlsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = E61C96D222962BC20006561F /* TestControlsViewController.swift */; }; E660317224BEB46F00A132DB /* TestViewControllerWrappingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E660317124BEB46F00A132DB /* TestViewControllerWrappingView.swift */; }; E6A92D2D24BEA8AC00562BCA /* TestSeparatorViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = AC97EFE8247FAB1D00DADC99 /* TestSeparatorViewController.swift */; }; @@ -61,7 +36,6 @@ E6A92D3B24BEA91F00562BCA /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = E6A92D3A24BEA91F00562BCA /* ContentView.swift */; }; E6A92D4024BEA92000562BCA /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = E6A92D3F24BEA92000562BCA /* Preview Assets.xcassets */; }; E6A92D4F24BEAEEA00562BCA /* TestViewControllers.swift in Sources */ = {isa = PBXBuildFile; fileRef = E6A92D4E24BEAEEA00562BCA /* TestViewControllers.swift */; }; - EC3AF6A426BDC892009118F4 /* BadgeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC3AF6A326BDC892009118F4 /* BadgeView.swift */; }; EC3AF6A726BDDD30009118F4 /* TestBadgeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC3AF6A526BDDD2A009118F4 /* TestBadgeViewController.swift */; }; /* End PBXBuildFile section */ @@ -73,34 +47,6 @@ remoteGlobalIDString = 8F5368012295F4BF0098AC8F; remoteInfo = FluentUITestApp; }; - 8F41CC7B2447B8F40040B851 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = E61C96A92295E8D60006561F /* Project object */; - proxyType = 1; - remoteGlobalIDString = 8F41CC6C2447B60F0040B851; - remoteInfo = "FluentUIResources-macos"; - }; - 8F69C7B3229604A8009F69C0 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = E61C96A92295E8D60006561F /* Project object */; - proxyType = 1; - remoteGlobalIDString = E61C96B12295E8D60006561F; - remoteInfo = FluentUI; - }; - E61C96BD2295E8D60006561F /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = E61C96A92295E8D60006561F /* Project object */; - proxyType = 1; - remoteGlobalIDString = E61C96B12295E8D60006561F; - remoteInfo = FluentUI; - }; - E660317324BEBF8F00A132DB /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = E61C96A92295E8D60006561F /* Project object */; - proxyType = 1; - remoteGlobalIDString = E61C96B12295E8D60006561F; - remoteInfo = FluentUI; - }; E6A92D4624BEA9A600562BCA /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = E61C96A92295E8D60006561F /* Project object */; @@ -115,13 +61,6 @@ remoteGlobalIDString = E6A92D2324BEA85900562BCA; remoteInfo = FluentUITestViewControllers; }; - E6A92D4A24BEA9B400562BCA /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = E61C96A92295E8D60006561F /* Project object */; - proxyType = 1; - remoteGlobalIDString = E61C96B12295E8D60006561F; - remoteInfo = FluentUI; - }; /* End PBXContainerItemProxy section */ /* Begin PBXCopyFilesBuildPhase section */ @@ -131,7 +70,6 @@ dstPath = ""; dstSubfolderSpec = 10; files = ( - AC7235D92492E0D000D0DCA8 /* FluentUI.framework in Embed Frameworks */, ); name = "Embed Frameworks"; runOnlyForDeploymentPostprocessing = 0; @@ -139,8 +77,6 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 2F6759B6251E4C2600210B3C /* SimpleObjCTest.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SimpleObjCTest.h; sourceTree = ""; }; - 2F6759B7251E4C2600210B3C /* SimpleObjCTest.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SimpleObjCTest.m; sourceTree = ""; }; 3A42750F29677C3700F36FBE /* FluentUIDemoTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = FluentUIDemoTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 3A42751129677C3700F36FBE /* BaseTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BaseTest.swift; sourceTree = ""; }; 3A42751329677C3700F36FBE /* AvatarViewTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AvatarViewTest.swift; sourceTree = ""; }; @@ -152,22 +88,7 @@ 3A42752429677D0800F36FBE /* SeparatorTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SeparatorTest.swift; sourceTree = ""; }; 3A42752629677D3700F36FBE /* ColorTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ColorTest.swift; sourceTree = ""; }; 3A80A048299EE88900A4A3D2 /* NotificationBarViewTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationBarViewTest.swift; sourceTree = ""; }; - 3A8CB0DF2996CB8800B68FCF /* NotificationBarView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationBarView.swift; sourceTree = ""; }; 3A8CB0E12996CD6400B68FCF /* TestNotificationBarViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TestNotificationBarViewController.swift; sourceTree = ""; }; - 3F2506D825F2C7A90049ED54 /* DynamicColor.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DynamicColor.swift; sourceTree = ""; }; - 3F2506DA25F2C7A90049ED54 /* Apperance+Theme.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Apperance+Theme.swift"; sourceTree = ""; }; - 53BCB0DA253A72AD00620960 /* Colors.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Colors.swift; sourceTree = ""; }; - 53BCB0E1253A72E000620960 /* FluentUIResources.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FluentUIResources.swift; sourceTree = ""; }; - 53BCB0EC253A75BB00620960 /* AvatarView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AvatarView.swift; sourceTree = ""; }; - 53BCB0F3253A75CF00620960 /* Button.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Button.swift; sourceTree = ""; }; - 53BCB0FA253A75E400620960 /* Link.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Link.swift; sourceTree = ""; }; - 53BCB101253A75EF00620960 /* Separator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Separator.swift; sourceTree = ""; }; - 8005007622FB361200CA6343 /* DatePickerControllerTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DatePickerControllerTests.swift; sourceTree = ""; }; - 80117A7E22DCDF6F00813D59 /* CalendarView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CalendarView.swift; sourceTree = ""; }; - 80117A8222E0E63E00813D59 /* CalendarHeaderView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CalendarHeaderView.swift; sourceTree = ""; }; - 804626C522D7908100AFA48C /* CalendarDayButton.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CalendarDayButton.swift; sourceTree = ""; }; - 8061BF7C22EF936700F2D245 /* DatePickerView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DatePickerView.swift; sourceTree = ""; }; - 8061BF7D22EF936700F2D245 /* DatePickerController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DatePickerController.swift; sourceTree = ""; }; 8061BF8222EF957200F2D245 /* TestDatePickerController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TestDatePickerController.swift; sourceTree = ""; }; 8F250B8C22B3062A00142B0E /* TestAvatarViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TestAvatarViewController.swift; sourceTree = ""; }; 8F3572322361143B0076FBBE /* FluentUI.xctestplan */ = {isa = PBXFileReference; lastKnownFileType = text; path = FluentUI.xctestplan; sourceTree = ""; }; @@ -200,7 +121,6 @@ 8F38AE5C230354D700F5D7B0 /* th */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = th; path = th.lproj/MainMenu.strings; sourceTree = ""; }; 8F38AE5D230354DA00F5D7B0 /* tr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = tr; path = tr.lproj/MainMenu.strings; sourceTree = ""; }; 8F41CC6D2447B60F0040B851 /* FluentUIResources-macos.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "FluentUIResources-macos.bundle"; sourceTree = BUILT_PRODUCTS_DIR; }; - 8F41CC6F2447B60F0040B851 /* FluentUIResources-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "FluentUIResources-Info.plist"; sourceTree = ""; }; 8F41CC732447B66A0040B851 /* FluentUI_resources.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = FluentUI_resources.xcconfig; sourceTree = ""; }; 8F5368022295F4BF0098AC8F /* FluentUITestApp.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = FluentUITestApp.app; sourceTree = BUILT_PRODUCTS_DIR; }; 8F5368042295F4BF0098AC8F /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; @@ -217,56 +137,13 @@ 8F79192724589B6D00C84086 /* uk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = uk; path = uk.lproj/MainMenu.strings; sourceTree = ""; }; 8F79192924589B6E00C84086 /* vi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = vi; path = vi.lproj/MainMenu.strings; sourceTree = ""; }; 8F931A6C22BD593300311764 /* FluentUI_unittest.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = FluentUI_unittest.xcconfig; sourceTree = ""; }; - 921AF7B2269CD39C00255791 /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/FluentUI.strings; sourceTree = ""; }; - 921AF7B3269CD39C00255791 /* he */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = he; path = he.lproj/FluentUI.strings; sourceTree = ""; }; - 921AF7B4269CD39C00255791 /* ar */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ar; path = ar.lproj/FluentUI.strings; sourceTree = ""; }; - 921AF7B5269CD39C00255791 /* el */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = el; path = el.lproj/FluentUI.strings; sourceTree = ""; }; - 921AF7B6269CD39C00255791 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/FluentUI.strings"; sourceTree = ""; }; - 921AF7B7269CD39C00255791 /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/FluentUI.strings; sourceTree = ""; }; - 921AF7B8269CD39C00255791 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/FluentUI.strings; sourceTree = ""; }; - 921AF7B9269CD39C00255791 /* uk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = uk; path = uk.lproj/FluentUI.strings; sourceTree = ""; }; - 921AF7BA269CD39C00255791 /* nb-NO */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "nb-NO"; path = "nb-NO.lproj/FluentUI.strings"; sourceTree = ""; }; - 921AF7BB269CD39C00255791 /* en-GB */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "en-GB"; path = "en-GB.lproj/FluentUI.strings"; sourceTree = ""; }; - 921AF7BC269CD39C00255791 /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/FluentUI.strings; sourceTree = ""; }; - 921AF7BD269CD39C00255791 /* da */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = da; path = da.lproj/FluentUI.strings; sourceTree = ""; }; - 921AF7BE269CD39C00255791 /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/FluentUI.strings; sourceTree = ""; }; - 921AF7BF269CD39C00255791 /* sk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sk; path = sk.lproj/FluentUI.strings; sourceTree = ""; }; - 921AF7C0269CD39C00255791 /* ms */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ms; path = ms.lproj/FluentUI.strings; sourceTree = ""; }; - 921AF7C1269CD39C00255791 /* sv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sv; path = sv.lproj/FluentUI.strings; sourceTree = ""; }; - 921AF7C2269CD39C00255791 /* cs */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = cs; path = cs.lproj/FluentUI.strings; sourceTree = ""; }; - 921AF7C3269CD39C00255791 /* ko */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ko; path = ko.lproj/FluentUI.strings; sourceTree = ""; }; - 921AF7C4269CD39C00255791 /* zh-Hant */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hant"; path = "zh-Hant.lproj/FluentUI.strings"; sourceTree = ""; }; - 921AF7C5269CD39C00255791 /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/FluentUI.strings; sourceTree = ""; }; - 921AF7C6269CD39C00255791 /* tr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = tr; path = tr.lproj/FluentUI.strings; sourceTree = ""; }; - 921AF7C7269CD39C00255791 /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = pl.lproj/FluentUI.strings; sourceTree = ""; }; - 921AF7C8269CD39C00255791 /* pt-BR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-BR"; path = "pt-BR.lproj/FluentUI.strings"; sourceTree = ""; }; - 921AF7C9269CD39C00255791 /* vi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = vi; path = vi.lproj/FluentUI.strings; sourceTree = ""; }; - 921AF7CA269CD39C00255791 /* es-MX */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-MX"; path = "es-MX.lproj/FluentUI.strings"; sourceTree = ""; }; - 921AF7CB269CD39C00255791 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/FluentUI.strings; sourceTree = ""; }; - 921AF7CC269CD39C00255791 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/FluentUI.strings; sourceTree = ""; }; - 921AF7CD269CD39C00255791 /* fi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fi; path = fi.lproj/FluentUI.strings; sourceTree = ""; }; - 921AF7CE269CD39C00255791 /* id */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = id; path = id.lproj/FluentUI.strings; sourceTree = ""; }; - 921AF7CF269CD39C00255791 /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/FluentUI.strings; sourceTree = ""; }; - 921AF7D0269CD39C00255791 /* th */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = th; path = th.lproj/FluentUI.strings; sourceTree = ""; }; - 921AF7D1269CD39C00255791 /* pt-PT */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-PT"; path = "pt-PT.lproj/FluentUI.strings"; sourceTree = ""; }; - 921AF7D2269CD39C00255791 /* ro */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ro; path = ro.lproj/FluentUI.strings; sourceTree = ""; }; - 921AF7D3269CD39C00255791 /* hr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hr; path = hr.lproj/FluentUI.strings; sourceTree = ""; }; - 921AF7D4269CD39C00255791 /* hi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hi; path = hi.lproj/FluentUI.strings; sourceTree = ""; }; - 921AF7D5269CD39C00255791 /* ca */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ca; path = ca.lproj/FluentUI.strings; sourceTree = ""; }; - 9B4AEBA22703CADB00B68020 /* FilledTemplateImageView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FilledTemplateImageView.swift; sourceTree = ""; }; + 9252C61E2C62A881009C9272 /* fluentui-apple */ = {isa = PBXFileReference; lastKnownFileType = wrapper; name = "fluentui-apple"; path = ../../..; sourceTree = ""; }; 9B4AEBAA2705206300B68020 /* TestFilledTemplateImageViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TestFilledTemplateImageViewController.swift; sourceTree = ""; }; 9B8661752A4F5C4800FA4F78 /* TestColorProvider.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TestColorProvider.swift; sourceTree = ""; }; - 9BE619152A1576BD0046463A /* ColorProviding.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ColorProviding.swift; sourceTree = ""; }; A257F81C2512DDF7002CAA6E /* TestColorViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TestColorViewController.swift; sourceTree = ""; }; - A257F825251D987E002CAA6E /* FluentUI-macos.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = "FluentUI-macos.xcassets"; path = "../FluentUI/Resources/FluentUI-macos.xcassets"; sourceTree = ""; }; AC97EFE3247541E100DADC99 /* TestButtonViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TestButtonViewController.swift; sourceTree = ""; }; AC97EFE8247FAB1D00DADC99 /* TestSeparatorViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TestSeparatorViewController.swift; sourceTree = ""; }; - E61C96B22295E8D60006561F /* FluentUI.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = FluentUI.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - E61C96B52295E8D60006561F /* FluentUI.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FluentUI.h; sourceTree = ""; }; - E61C96B62295E8D60006561F /* FluentUI-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "FluentUI-Info.plist"; sourceTree = ""; }; E61C96BB2295E8D60006561F /* FluentUIUnitTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = FluentUIUnitTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - E61C96C02295E8D60006561F /* AvatarViewTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AvatarViewTests.swift; sourceTree = ""; }; - E61C96C22295E8D60006561F /* FluentUIUnitTest-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "FluentUIUnitTest-Info.plist"; sourceTree = ""; }; E61C96CE2295ED8A0006561F /* FluentUI_framework.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = FluentUI_framework.xcconfig; sourceTree = ""; }; E61C96CF2295F6FE0006561F /* FluentUI_common.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = FluentUI_common.xcconfig; sourceTree = ""; }; E61C96D02295FA360006561F /* FluentUI_debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = FluentUI_debug.xcconfig; sourceTree = ""; }; @@ -284,7 +161,6 @@ E6A92D4C24BEAA0200562BCA /* FluentUI_swiftui_testapp.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = FluentUI_swiftui_testapp.xcconfig; sourceTree = ""; }; E6A92D4D24BEAA0200562BCA /* FluentUI_testviewcontrollers.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = FluentUI_testviewcontrollers.xcconfig; sourceTree = ""; }; E6A92D4E24BEAEEA00562BCA /* TestViewControllers.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TestViewControllers.swift; sourceTree = ""; }; - EC3AF6A326BDC892009118F4 /* BadgeView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BadgeView.swift; sourceTree = ""; }; EC3AF6A526BDDD2A009118F4 /* TestBadgeViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TestBadgeViewController.swift; sourceTree = ""; }; /* End PBXFileReference section */ @@ -307,22 +183,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - AC7235D82492E0D000D0DCA8 /* FluentUI.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - E61C96AF2295E8D60006561F /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - E61C96B82295E8D60006561F /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - E61C96BC2295E8D60006561F /* FluentUI.framework in Frameworks */, + 9252C6222C62A8B3009C9272 /* FluentUI in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -360,93 +221,6 @@ path = FluentUIDemoTests; sourceTree = ""; }; - 3A8CB0DE2996CA1B00B68FCF /* Notification */ = { - isa = PBXGroup; - children = ( - 3A8CB0DF2996CB8800B68FCF /* NotificationBarView.swift */, - ); - path = Notification; - sourceTree = ""; - }; - 3F2506D725F2C7A90049ED54 /* DynamicColor */ = { - isa = PBXGroup; - children = ( - 3F2506D825F2C7A90049ED54 /* DynamicColor.swift */, - ); - path = DynamicColor; - sourceTree = ""; - }; - 3F2506D925F2C7A90049ED54 /* Appearance */ = { - isa = PBXGroup; - children = ( - 3F2506DA25F2C7A90049ED54 /* Apperance+Theme.swift */, - ); - path = Appearance; - sourceTree = ""; - }; - 53BCB0D9253A724700620960 /* Core */ = { - isa = PBXGroup; - children = ( - 53BCB0E1253A72E000620960 /* FluentUIResources.swift */, - 9BE619152A1576BD0046463A /* ColorProviding.swift */, - 53BCB0DA253A72AD00620960 /* Colors.swift */, - ); - path = Core; - sourceTree = ""; - }; - 53BCB0E8253A74DF00620960 /* AvatarView */ = { - isa = PBXGroup; - children = ( - 53BCB0EC253A75BB00620960 /* AvatarView.swift */, - ); - path = AvatarView; - sourceTree = ""; - }; - 53BCB0E9253A74FE00620960 /* Button */ = { - isa = PBXGroup; - children = ( - 53BCB0F3253A75CF00620960 /* Button.swift */, - ); - path = Button; - sourceTree = ""; - }; - 53BCB0EA253A752400620960 /* Link */ = { - isa = PBXGroup; - children = ( - 53BCB0FA253A75E400620960 /* Link.swift */, - ); - path = Link; - sourceTree = ""; - }; - 53BCB0EB253A753400620960 /* Separator */ = { - isa = PBXGroup; - children = ( - 53BCB101253A75EF00620960 /* Separator.swift */, - ); - path = Separator; - sourceTree = ""; - }; - 804626C722D7909200AFA48C /* DatePicker */ = { - isa = PBXGroup; - children = ( - 804626C522D7908100AFA48C /* CalendarDayButton.swift */, - 80117A8222E0E63E00813D59 /* CalendarHeaderView.swift */, - 80117A7E22DCDF6F00813D59 /* CalendarView.swift */, - 8061BF7C22EF936700F2D245 /* DatePickerView.swift */, - 8061BF7D22EF936700F2D245 /* DatePickerController.swift */, - ); - path = DatePicker; - sourceTree = ""; - }; - 8F41CC6E2447B60F0040B851 /* FluentUIResources-macos */ = { - isa = PBXGroup; - children = ( - 8F41CC6F2447B60F0040B851 /* FluentUIResources-Info.plist */, - ); - name = "FluentUIResources-macos"; - path = "../FluentUIResources-macos"; - sourceTree = ""; - }; 8F5368032295F4BF0098AC8F /* FluentUITestApp */ = { isa = PBXGroup; children = ( @@ -460,30 +234,6 @@ path = ../FluentUITestApp; sourceTree = ""; }; - 921AF7AF269CD39C00255791 /* Resources */ = { - isa = PBXGroup; - children = ( - 921AF7B0269CD39C00255791 /* Strings */, - ); - path = Resources; - sourceTree = ""; - }; - 921AF7B0269CD39C00255791 /* Strings */ = { - isa = PBXGroup; - children = ( - 921AF7B1269CD39C00255791 /* FluentUI.strings */, - ); - path = Strings; - sourceTree = ""; - }; - 9B4AEBA12703CADB00B68020 /* FilledTemplateImageView */ = { - isa = PBXGroup; - children = ( - 9B4AEBA22703CADB00B68020 /* FilledTemplateImageView.swift */, - ); - path = FilledTemplateImageView; - sourceTree = ""; - }; AC7235D72492E0D000D0DCA8 /* Frameworks */ = { isa = PBXGroup; children = ( @@ -494,14 +244,11 @@ E61C96A82295E8D60006561F = { isa = PBXGroup; children = ( - A257F825251D987E002CAA6E /* FluentUI-macos.xcassets */, - E61C96B42295E8D60006561F /* FluentUI */, + 9252C61E2C62A881009C9272 /* fluentui-apple */, 3A42751029677C3700F36FBE /* FluentUIDemoTests */, - 8F41CC6E2447B60F0040B851 /* FluentUIResources-macos */, E6A92D2524BEA85900562BCA /* FluentUITestViewControllers */, 8F5368032295F4BF0098AC8F /* FluentUITestApp */, E6A92D3724BEA91F00562BCA /* FluentUISwiftUITestApp */, - E61C96BF2295E8D60006561F /* FluentUIUnitTest */, E61C96CD2295ED530006561F /* xcode */, E61C96B32295E8D60006561F /* Products */, AC7235D72492E0D000D0DCA8 /* Frameworks */, @@ -514,8 +261,6 @@ E61C96B32295E8D60006561F /* Products */ = { isa = PBXGroup; children = ( - E61C96B22295E8D60006561F /* FluentUI.framework */, - E61C96BB2295E8D60006561F /* FluentUIUnitTests.xctest */, 8F5368022295F4BF0098AC8F /* FluentUITestApp.app */, 8F41CC6D2447B60F0040B851 /* FluentUIResources-macos.bundle */, E6A92D2424BEA85900562BCA /* libFluentUITestViewControllers.a */, @@ -525,41 +270,6 @@ name = Products; sourceTree = ""; }; - E61C96B42295E8D60006561F /* FluentUI */ = { - isa = PBXGroup; - children = ( - 3F2506D925F2C7A90049ED54 /* Appearance */, - 53BCB0E8253A74DF00620960 /* AvatarView */, - EC3AF6A226BDC67D009118F4 /* Badge */, - 53BCB0E9253A74FE00620960 /* Button */, - 53BCB0D9253A724700620960 /* Core */, - 804626C722D7909200AFA48C /* DatePicker */, - 3F2506D725F2C7A90049ED54 /* DynamicColor */, - 9B4AEBA12703CADB00B68020 /* FilledTemplateImageView */, - 53BCB0EA253A752400620960 /* Link */, - 3A8CB0DE2996CA1B00B68FCF /* Notification */, - 921AF7AF269CD39C00255791 /* Resources */, - 53BCB0EB253A753400620960 /* Separator */, - E61C96B62295E8D60006561F /* FluentUI-Info.plist */, - E61C96B52295E8D60006561F /* FluentUI.h */, - ); - name = FluentUI; - path = ../FluentUI; - sourceTree = ""; - }; - E61C96BF2295E8D60006561F /* FluentUIUnitTest */ = { - isa = PBXGroup; - children = ( - E61C96C02295E8D60006561F /* AvatarViewTests.swift */, - 8005007622FB361200CA6343 /* DatePickerControllerTests.swift */, - E61C96C22295E8D60006561F /* FluentUIUnitTest-Info.plist */, - 2F6759B6251E4C2600210B3C /* SimpleObjCTest.h */, - 2F6759B7251E4C2600210B3C /* SimpleObjCTest.m */, - ); - name = FluentUIUnitTest; - path = ../FluentUIUnitTest; - sourceTree = ""; - }; E61C96CD2295ED530006561F /* xcode */ = { isa = PBXGroup; children = ( @@ -618,25 +328,9 @@ path = "Preview Content"; sourceTree = ""; }; - EC3AF6A226BDC67D009118F4 /* Badge */ = { - isa = PBXGroup; - children = ( - EC3AF6A326BDC892009118F4 /* BadgeView.swift */, - ); - path = Badge; - sourceTree = ""; - }; /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ - E61C96AD2295E8D60006561F /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - E61C96CC2295EAC50006561F /* FluentUI.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; E6A92D2024BEA85900562BCA /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; @@ -694,34 +388,17 @@ buildRules = ( ); dependencies = ( + 9252C6202C62A8AB009C9272 /* PBXTargetDependency */, E6A92D4724BEA9A600562BCA /* PBXTargetDependency */, - 8F69C7B4229604A8009F69C0 /* PBXTargetDependency */, ); name = FluentUITestApp; + packageProductDependencies = ( + 9252C6212C62A8B3009C9272 /* FluentUI */, + ); productName = FluentUITestApp; productReference = 8F5368022295F4BF0098AC8F /* FluentUITestApp.app */; productType = "com.apple.product-type.application"; }; - E61C96B12295E8D60006561F /* FluentUI */ = { - isa = PBXNativeTarget; - buildConfigurationList = E61C96C62295E8D60006561F /* Build configuration list for PBXNativeTarget "FluentUI" */; - buildPhases = ( - E61C96AD2295E8D60006561F /* Headers */, - E61C96AE2295E8D60006561F /* Sources */, - E61C96AF2295E8D60006561F /* Frameworks */, - E61C96B02295E8D60006561F /* Resources */, - 5328556A25ACC3B40042C3B9 /* Run swiftlint */, - ); - buildRules = ( - ); - dependencies = ( - 8F41CC7C2447B8F40040B851 /* PBXTargetDependency */, - ); - name = FluentUI; - productName = FluentUI; - productReference = E61C96B22295E8D60006561F /* FluentUI.framework */; - productType = "com.apple.product-type.framework"; - }; E61C96BA2295E8D60006561F /* FluentUITests */ = { isa = PBXNativeTarget; buildConfigurationList = E61C96C92295E8D60006561F /* Build configuration list for PBXNativeTarget "FluentUITests" */; @@ -733,9 +410,12 @@ buildRules = ( ); dependencies = ( - E61C96BE2295E8D60006561F /* PBXTargetDependency */, + 9252C6262C62A8F6009C9272 /* PBXTargetDependency */, ); name = FluentUITests; + packageProductDependencies = ( + 9252C6272C62A9F1009C9272 /* FluentUI */, + ); productName = FluentUITests; productReference = E61C96BB2295E8D60006561F /* FluentUIUnitTests.xctest */; productType = "com.apple.product-type.bundle.unit-test"; @@ -751,7 +431,7 @@ buildRules = ( ); dependencies = ( - E660317424BEBF8F00A132DB /* PBXTargetDependency */, + 9252C6242C62A8DC009C9272 /* PBXTargetDependency */, ); name = FluentUITestViewControllers; productName = FluentUITestViewControllers; @@ -769,7 +449,6 @@ buildRules = ( ); dependencies = ( - E6A92D4B24BEA9B400562BCA /* PBXTargetDependency */, E6A92D4924BEA9AF00562BCA /* PBXTargetDependency */, ); name = FluentUISwiftUITestApp; @@ -797,10 +476,6 @@ 8F5368012295F4BF0098AC8F = { CreatedOnToolsVersion = 10.2.1; }; - E61C96B12295E8D60006561F = { - CreatedOnToolsVersion = 10.2.1; - LastSwiftMigration = 1020; - }; E61C96BA2295E8D60006561F = { CreatedOnToolsVersion = 10.2.1; }; @@ -860,7 +535,6 @@ projectDirPath = ""; projectRoot = ""; targets = ( - E61C96B12295E8D60006561F /* FluentUI */, E61C96BA2295E8D60006561F /* FluentUITests */, 3A42750E29677C3700F36FBE /* FluentUIDemoTests */, 8F5368012295F4BF0098AC8F /* FluentUITestApp */, @@ -883,8 +557,6 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 921AF7D7269CD3C900255791 /* FluentUI.strings in Resources */, - A257F826251D987E002CAA6E /* FluentUI-macos.xcassets in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -897,21 +569,6 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - E61C96B02295E8D60006561F /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 8F41CC7A2447B8DB0040B851 /* FluentUIResources-macos.bundle in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - E61C96B92295E8D60006561F /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; E6A92D3424BEA91F00562BCA /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; @@ -922,27 +579,6 @@ }; /* End PBXResourcesBuildPhase section */ -/* Begin PBXShellScriptBuildPhase section */ - 5328556A25ACC3B40042C3B9 /* Run swiftlint */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - ); - name = "Run swiftlint"; - outputFileListPaths = ( - ); - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "# Adds support for Apple Silicon brew directory\nexport PATH=\"$PATH:/opt/homebrew/bin\"\n\nif which swiftlint >/dev/null; then\n export LINTPATH=\"${LOCROOT}/../\"\n swiftlint --config ../../.swiftlint.yml\nelse\n echo \"warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint\"\nfi\n"; - }; -/* End PBXShellScriptBuildPhase section */ - /* Begin PBXSourcesBuildPhase section */ 3A42750B29677C3700F36FBE /* Sources */ = { isa = PBXSourcesBuildPhase; @@ -977,37 +613,10 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - E61C96AE2295E8D60006561F /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 804626C622D7908100AFA48C /* CalendarDayButton.swift in Sources */, - 53BCB0DB253A72AD00620960 /* Colors.swift in Sources */, - 53BCB102253A75EF00620960 /* Separator.swift in Sources */, - 80117A8322E0E63E00813D59 /* CalendarHeaderView.swift in Sources */, - 3A8CB0E02996CB8800B68FCF /* NotificationBarView.swift in Sources */, - 53BCB0ED253A75BB00620960 /* AvatarView.swift in Sources */, - 3F2506DC25F2C7A90049ED54 /* Apperance+Theme.swift in Sources */, - 53BCB0FB253A75E400620960 /* Link.swift in Sources */, - EC3AF6A426BDC892009118F4 /* BadgeView.swift in Sources */, - 80117A7F22DCDF6F00813D59 /* CalendarView.swift in Sources */, - 53BCB0E2253A72E000620960 /* FluentUIResources.swift in Sources */, - 8061BF7E22EF936800F2D245 /* DatePickerView.swift in Sources */, - 3F2506DB25F2C7A90049ED54 /* DynamicColor.swift in Sources */, - 9B4AEBA42703CADB00B68020 /* FilledTemplateImageView.swift in Sources */, - 8061BF7F22EF936800F2D245 /* DatePickerController.swift in Sources */, - 9BE619162A1576BD0046463A /* ColorProviding.swift in Sources */, - 53BCB0F4253A75CF00620960 /* Button.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; E61C96B72295E8D60006561F /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - E61C96C12295E8D60006561F /* AvatarViewTests.swift in Sources */, - 2F6759B8251E4C2600210B3C /* SimpleObjCTest.m in Sources */, - 8005007722FB361200CA6343 /* DatePickerControllerTests.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1047,25 +656,13 @@ target = 8F5368012295F4BF0098AC8F /* FluentUITestApp */; targetProxy = 3A42751529677C3700F36FBE /* PBXContainerItemProxy */; }; - 8F41CC7C2447B8F40040B851 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 8F41CC6C2447B60F0040B851 /* FluentUIResources-macos */; - targetProxy = 8F41CC7B2447B8F40040B851 /* PBXContainerItemProxy */; - }; - 8F69C7B4229604A8009F69C0 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = E61C96B12295E8D60006561F /* FluentUI */; - targetProxy = 8F69C7B3229604A8009F69C0 /* PBXContainerItemProxy */; - }; - E61C96BE2295E8D60006561F /* PBXTargetDependency */ = { + 9252C6202C62A8AB009C9272 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - target = E61C96B12295E8D60006561F /* FluentUI */; - targetProxy = E61C96BD2295E8D60006561F /* PBXContainerItemProxy */; + productRef = 9252C61F2C62A8AB009C9272 /* FluentUI */; }; - E660317424BEBF8F00A132DB /* PBXTargetDependency */ = { + 9252C6242C62A8DC009C9272 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - target = E61C96B12295E8D60006561F /* FluentUI */; - targetProxy = E660317324BEBF8F00A132DB /* PBXContainerItemProxy */; + productRef = 9252C6232C62A8DC009C9272 /* FluentUI */; }; E6A92D4724BEA9A600562BCA /* PBXTargetDependency */ = { isa = PBXTargetDependency; @@ -1077,11 +674,6 @@ target = E6A92D2324BEA85900562BCA /* FluentUITestViewControllers */; targetProxy = E6A92D4824BEA9AF00562BCA /* PBXContainerItemProxy */; }; - E6A92D4B24BEA9B400562BCA /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = E61C96B12295E8D60006561F /* FluentUI */; - targetProxy = E6A92D4A24BEA9B400562BCA /* PBXContainerItemProxy */; - }; /* End PBXTargetDependency section */ /* Begin PBXVariantGroup section */ @@ -1129,49 +721,6 @@ name = MainMenu.xib; sourceTree = ""; }; - 921AF7B1269CD39C00255791 /* FluentUI.strings */ = { - isa = PBXVariantGroup; - children = ( - 921AF7B2269CD39C00255791 /* de */, - 921AF7B3269CD39C00255791 /* he */, - 921AF7B4269CD39C00255791 /* ar */, - 921AF7B5269CD39C00255791 /* el */, - 921AF7B6269CD39C00255791 /* zh-Hans */, - 921AF7B7269CD39C00255791 /* ja */, - 921AF7B8269CD39C00255791 /* en */, - 921AF7B9269CD39C00255791 /* uk */, - 921AF7BA269CD39C00255791 /* nb-NO */, - 921AF7BB269CD39C00255791 /* en-GB */, - 921AF7BC269CD39C00255791 /* es */, - 921AF7BD269CD39C00255791 /* da */, - 921AF7BE269CD39C00255791 /* it */, - 921AF7BF269CD39C00255791 /* sk */, - 921AF7C0269CD39C00255791 /* ms */, - 921AF7C1269CD39C00255791 /* sv */, - 921AF7C2269CD39C00255791 /* cs */, - 921AF7C3269CD39C00255791 /* ko */, - 921AF7C4269CD39C00255791 /* zh-Hant */, - 921AF7C5269CD39C00255791 /* hu */, - 921AF7C6269CD39C00255791 /* tr */, - 921AF7C7269CD39C00255791 /* pl */, - 921AF7C8269CD39C00255791 /* pt-BR */, - 921AF7C9269CD39C00255791 /* vi */, - 921AF7CA269CD39C00255791 /* es-MX */, - 921AF7CB269CD39C00255791 /* ru */, - 921AF7CC269CD39C00255791 /* fr */, - 921AF7CD269CD39C00255791 /* fi */, - 921AF7CE269CD39C00255791 /* id */, - 921AF7CF269CD39C00255791 /* nl */, - 921AF7D0269CD39C00255791 /* th */, - 921AF7D1269CD39C00255791 /* pt-PT */, - 921AF7D2269CD39C00255791 /* ro */, - 921AF7D3269CD39C00255791 /* hr */, - 921AF7D4269CD39C00255791 /* hi */, - 921AF7D5269CD39C00255791 /* ca */, - ); - name = FluentUI.strings; - sourceTree = ""; - }; /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ @@ -1358,20 +907,6 @@ }; name = Release; }; - E61C96C72295E8D60006561F /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = E61C96CE2295ED8A0006561F /* FluentUI_framework.xcconfig */; - buildSettings = { - }; - name = Debug; - }; - E61C96C82295E8D60006561F /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = E61C96CE2295ED8A0006561F /* FluentUI_framework.xcconfig */; - buildSettings = { - }; - name = Release; - }; E61C96CA2295E8D60006561F /* Debug */ = { isa = XCBuildConfiguration; baseConfigurationReference = 8F931A6C22BD593300311764 /* FluentUI_unittest.xcconfig */; @@ -1455,15 +990,6 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - E61C96C62295E8D60006561F /* Build configuration list for PBXNativeTarget "FluentUI" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - E61C96C72295E8D60006561F /* Debug */, - E61C96C82295E8D60006561F /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; E61C96C92295E8D60006561F /* Build configuration list for PBXNativeTarget "FluentUITests" */ = { isa = XCConfigurationList; buildConfigurations = ( @@ -1492,6 +1018,21 @@ defaultConfigurationName = Release; }; /* End XCConfigurationList section */ + +/* Begin XCSwiftPackageProductDependency section */ + 9252C61F2C62A8AB009C9272 /* FluentUI */ = { + isa = XCSwiftPackageProductDependency; + productName = FluentUI; + }; + 9252C6212C62A8B3009C9272 /* FluentUI */ = { + isa = XCSwiftPackageProductDependency; + productName = FluentUI; + }; + 9252C6232C62A8DC009C9272 /* FluentUI */ = { + isa = XCSwiftPackageProductDependency; + productName = FluentUI; + }; +/* End XCSwiftPackageProductDependency section */ }; rootObject = E61C96A92295E8D60006561F /* Project object */; } diff --git a/macos/xcode/FluentUI.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Demos/FluentUIDemo_macOS/xcode/FluentUI.xcodeproj/project.xcworkspace/contents.xcworkspacedata similarity index 100% rename from macos/xcode/FluentUI.xcodeproj/project.xcworkspace/contents.xcworkspacedata rename to Demos/FluentUIDemo_macOS/xcode/FluentUI.xcodeproj/project.xcworkspace/contents.xcworkspacedata diff --git a/ios/FluentUI.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Demos/FluentUIDemo_macOS/xcode/FluentUI.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist similarity index 100% rename from ios/FluentUI.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist rename to Demos/FluentUIDemo_macOS/xcode/FluentUI.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist diff --git a/macos/xcode/FluentUI.xcodeproj/xcshareddata/xcschemes/FluentUISwiftUITestApp.xcscheme b/Demos/FluentUIDemo_macOS/xcode/FluentUI.xcodeproj/xcshareddata/xcschemes/FluentUISwiftUITestApp.xcscheme similarity index 100% rename from macos/xcode/FluentUI.xcodeproj/xcshareddata/xcschemes/FluentUISwiftUITestApp.xcscheme rename to Demos/FluentUIDemo_macOS/xcode/FluentUI.xcodeproj/xcshareddata/xcschemes/FluentUISwiftUITestApp.xcscheme diff --git a/macos/xcode/FluentUI.xcodeproj/xcshareddata/xcschemes/FluentUITestApp-macOS.xcscheme b/Demos/FluentUIDemo_macOS/xcode/FluentUI.xcodeproj/xcshareddata/xcschemes/FluentUITestApp-macOS.xcscheme similarity index 81% rename from macos/xcode/FluentUI.xcodeproj/xcshareddata/xcschemes/FluentUITestApp-macOS.xcscheme rename to Demos/FluentUIDemo_macOS/xcode/FluentUI.xcodeproj/xcshareddata/xcschemes/FluentUITestApp-macOS.xcscheme index cee2066982..e193651832 100644 --- a/macos/xcode/FluentUI.xcodeproj/xcshareddata/xcschemes/FluentUITestApp-macOS.xcscheme +++ b/Demos/FluentUIDemo_macOS/xcode/FluentUI.xcodeproj/xcshareddata/xcschemes/FluentUITestApp-macOS.xcscheme @@ -26,6 +26,20 @@ buildForProfiling = "YES" buildForArchiving = "YES" buildForAnalyzing = "YES"> + + + + + + + + Bool)? ``` -The UITextField that the Text Field uses is actually a custom subclass of the UITextField, the [FluentTextFieldInternal](https://github.com/microsoft/fluentui-apple/blob/main/ios/FluentUI/TextField/FluentTextFieldInternal.swift), so that the position of the trailing clear text button could be customized. +The UITextField that the Text Field uses is actually a custom subclass of the UITextField, the [FluentTextFieldInternal](https://github.com/microsoft/fluentui-apple/blob/main/Sources/FluentUI_iOS/Components/TextField/FluentTextFieldInternal.swift), so that the position of the trailing clear text button could be customized. ## Implementation ### Control Name @@ -48,12 +48,12 @@ The UITextField that the Text Field uses is actually a custom subclass of the UI ### Source Code #### UIKit - - [FluentTextField.swift](https://github.com/microsoft/fluentui-apple/blob/main/ios/FluentUI/TextField/FluentTextField.swift) - - [TextFieldTokenSet.swift](https://github.com/microsoft/fluentui-apple/blob/main/ios/FluentUI/TextField/TextFieldTokenSet.swift) + - [FluentTextField.swift](https://github.com/microsoft/fluentui-apple/blob/main/Sources/FluentUI_iOS/Components/TextField/FluentTextField.swift) + - [TextFieldTokenSet.swift](https://github.com/microsoft/fluentui-apple/blob/main/Sources/FluentUI_iOS/Components/TextField/TextFieldTokenSet.swift) ### Sample Code #### Objective-C - - [TextFieldObjCDemoController.m](https://github.com/microsoft/fluentui-apple/blob/main/ios/FluentUI.Demo/FluentUI.Demo/Demos/TextFieldObjCDemoController.m) + - [TextFieldObjCDemoController.m](https://github.com/microsoft/fluentui-apple/blob/main/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/TextFieldObjCDemoController.m) #### Swift - - [TextFieldDemoController.swift](https://github.com/microsoft/fluentui-apple/blob/main/ios/FluentUI.Demo/FluentUI.Demo/Demos/TextFieldDemoController.swift) + - [TextFieldDemoController.swift](https://github.com/microsoft/fluentui-apple/blob/main/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/TextFieldDemoController.swift) diff --git a/ios/docs/Controls/Tooltip.md b/Docs/iOS/Controls/Tooltip.md similarity index 88% rename from ios/docs/Controls/Tooltip.md rename to Docs/iOS/Controls/Tooltip.md index dbca4b41e7..e43c34a2da 100644 --- a/ios/docs/Controls/Tooltip.md +++ b/Docs/iOS/Controls/Tooltip.md @@ -38,8 +38,8 @@ Tooltip.shared.show(with: "This is the message of the tooltip.", ### Control Name `Tooltip` in Swift, `MSFTooltip` in Objective-C/UIKit ### Source Code -[Tooltip.swift](https://github.com/microsoft/fluentui-apple/blob/fluent2-tokens/ios/FluentUI/Tooltip/Tooltip.swift) -[TooltipView.swift](https://github.com/microsoft/fluentui-apple/blob/fluent2-tokens/ios/FluentUI/Tooltip/TooltipView.swift) -[TooltipViewController.swift](https://github.com/microsoft/fluentui-apple/blob/fluent2-tokens/ios/FluentUI/Tooltip/TooltipViewController.swift) +[Tooltip.swift](https://github.com/microsoft/fluentui-apple/blob/main/Sources/FluentUI_iOS/Components/Tooltip/Tooltip.swift) +[TooltipView.swift](https://github.com/microsoft/fluentui-apple/blob/main/Sources/FluentUI_iOS/Components/Tooltip/TooltipView.swift) +[TooltipViewController.swift](https://github.com/microsoft/fluentui-apple/blob/main/Sources/FluentUI_iOS/Components/Tooltip/TooltipViewController.swift) ### Sample Code -[TooltipDemoController.swift](https://github.com/microsoft/fluentui-apple/blob/fluent2-tokens/ios/FluentUI.Demo/FluentUI.Demo/Demos/TooltipDemoController.swift) +[TooltipDemoController.swift](https://github.com/microsoft/fluentui-apple/blob/main/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/TooltipDemoController.swift) diff --git a/macos/docs/Controls/.attachments/AvatarViewImage.png b/Docs/macOS/Controls/.attachments/AvatarViewImage.png similarity index 100% rename from macos/docs/Controls/.attachments/AvatarViewImage.png rename to Docs/macOS/Controls/.attachments/AvatarViewImage.png diff --git a/macos/docs/Controls/.attachments/AvatarViewInitials.png b/Docs/macOS/Controls/.attachments/AvatarViewInitials.png similarity index 100% rename from macos/docs/Controls/.attachments/AvatarViewInitials.png rename to Docs/macOS/Controls/.attachments/AvatarViewInitials.png diff --git a/macos/docs/Controls/.attachments/AvatarViews.png b/Docs/macOS/Controls/.attachments/AvatarViews.png similarity index 100% rename from macos/docs/Controls/.attachments/AvatarViews.png rename to Docs/macOS/Controls/.attachments/AvatarViews.png diff --git a/macos/docs/Controls/.attachments/Badge.png b/Docs/macOS/Controls/.attachments/Badge.png similarity index 100% rename from macos/docs/Controls/.attachments/Badge.png rename to Docs/macOS/Controls/.attachments/Badge.png diff --git a/macos/docs/Controls/.attachments/ButtonAccentColors.png b/Docs/macOS/Controls/.attachments/ButtonAccentColors.png similarity index 100% rename from macos/docs/Controls/.attachments/ButtonAccentColors.png rename to Docs/macOS/Controls/.attachments/ButtonAccentColors.png diff --git a/macos/docs/Controls/.attachments/ButtonImagePositions.png b/Docs/macOS/Controls/.attachments/ButtonImagePositions.png similarity index 100% rename from macos/docs/Controls/.attachments/ButtonImagePositions.png rename to Docs/macOS/Controls/.attachments/ButtonImagePositions.png diff --git a/macos/docs/Controls/.attachments/ButtonLinkedPrimary.gif b/Docs/macOS/Controls/.attachments/ButtonLinkedPrimary.gif similarity index 100% rename from macos/docs/Controls/.attachments/ButtonLinkedPrimary.gif rename to Docs/macOS/Controls/.attachments/ButtonLinkedPrimary.gif diff --git a/macos/docs/Controls/.attachments/ButtonSizes.png b/Docs/macOS/Controls/.attachments/ButtonSizes.png similarity index 100% rename from macos/docs/Controls/.attachments/ButtonSizes.png rename to Docs/macOS/Controls/.attachments/ButtonSizes.png diff --git a/macos/docs/Controls/.attachments/ButtonStyles.png b/Docs/macOS/Controls/.attachments/ButtonStyles.png similarity index 100% rename from macos/docs/Controls/.attachments/ButtonStyles.png rename to Docs/macOS/Controls/.attachments/ButtonStyles.png diff --git a/macos/docs/Controls/.attachments/ButtonViews.png b/Docs/macOS/Controls/.attachments/ButtonViews.png similarity index 100% rename from macos/docs/Controls/.attachments/ButtonViews.png rename to Docs/macOS/Controls/.attachments/ButtonViews.png diff --git a/macos/docs/Controls/.attachments/DatePickerCustomDate.png b/Docs/macOS/Controls/.attachments/DatePickerCustomDate.png similarity index 100% rename from macos/docs/Controls/.attachments/DatePickerCustomDate.png rename to Docs/macOS/Controls/.attachments/DatePickerCustomDate.png diff --git a/macos/docs/Controls/.attachments/DatePickerDefaultDateOnly.png b/Docs/macOS/Controls/.attachments/DatePickerDefaultDateOnly.png similarity index 100% rename from macos/docs/Controls/.attachments/DatePickerDefaultDateOnly.png rename to Docs/macOS/Controls/.attachments/DatePickerDefaultDateOnly.png diff --git a/macos/docs/Controls/.attachments/DatePickerDefaultDateTime.png b/Docs/macOS/Controls/.attachments/DatePickerDefaultDateTime.png similarity index 100% rename from macos/docs/Controls/.attachments/DatePickerDefaultDateTime.png rename to Docs/macOS/Controls/.attachments/DatePickerDefaultDateTime.png diff --git a/macos/docs/Controls/.attachments/DatePickerIslamicCalendar.png b/Docs/macOS/Controls/.attachments/DatePickerIslamicCalendar.png similarity index 100% rename from macos/docs/Controls/.attachments/DatePickerIslamicCalendar.png rename to Docs/macOS/Controls/.attachments/DatePickerIslamicCalendar.png diff --git a/macos/docs/Controls/.attachments/DatePickerNoTextField.png b/Docs/macOS/Controls/.attachments/DatePickerNoTextField.png similarity index 100% rename from macos/docs/Controls/.attachments/DatePickerNoTextField.png rename to Docs/macOS/Controls/.attachments/DatePickerNoTextField.png diff --git a/macos/docs/Controls/.attachments/DatePickerSecondaryCalendar.png b/Docs/macOS/Controls/.attachments/DatePickerSecondaryCalendar.png similarity index 100% rename from macos/docs/Controls/.attachments/DatePickerSecondaryCalendar.png rename to Docs/macOS/Controls/.attachments/DatePickerSecondaryCalendar.png diff --git a/macos/docs/Controls/.attachments/FilledTemplate-blueFill-blackBorder.png b/Docs/macOS/Controls/.attachments/FilledTemplate-blueFill-blackBorder.png similarity index 100% rename from macos/docs/Controls/.attachments/FilledTemplate-blueFill-blackBorder.png rename to Docs/macOS/Controls/.attachments/FilledTemplate-blueFill-blackBorder.png diff --git a/macos/docs/Controls/.attachments/FilledTemplate-clearFill-whiteBorder.png b/Docs/macOS/Controls/.attachments/FilledTemplate-clearFill-whiteBorder.png similarity index 100% rename from macos/docs/Controls/.attachments/FilledTemplate-clearFill-whiteBorder.png rename to Docs/macOS/Controls/.attachments/FilledTemplate-clearFill-whiteBorder.png diff --git a/macos/docs/Controls/.attachments/FilledTemplate-redFill-whiteBorder.png b/Docs/macOS/Controls/.attachments/FilledTemplate-redFill-whiteBorder.png similarity index 100% rename from macos/docs/Controls/.attachments/FilledTemplate-redFill-whiteBorder.png rename to Docs/macOS/Controls/.attachments/FilledTemplate-redFill-whiteBorder.png diff --git a/macos/docs/Controls/.attachments/Link.png b/Docs/macOS/Controls/.attachments/Link.png similarity index 100% rename from macos/docs/Controls/.attachments/Link.png rename to Docs/macOS/Controls/.attachments/Link.png diff --git a/macos/docs/Controls/.attachments/LinkWithHover.png b/Docs/macOS/Controls/.attachments/LinkWithHover.png similarity index 100% rename from macos/docs/Controls/.attachments/LinkWithHover.png rename to Docs/macOS/Controls/.attachments/LinkWithHover.png diff --git a/macos/docs/Controls/.attachments/Separator.png b/Docs/macOS/Controls/.attachments/Separator.png similarity index 100% rename from macos/docs/Controls/.attachments/Separator.png rename to Docs/macOS/Controls/.attachments/Separator.png diff --git a/macos/docs/Controls/AvatarView.md b/Docs/macOS/Controls/AvatarView.md similarity index 90% rename from macos/docs/Controls/AvatarView.md rename to Docs/macOS/Controls/AvatarView.md index 3bd2206ae2..156e604303 100644 --- a/macos/docs/Controls/AvatarView.md +++ b/Docs/macOS/Controls/AvatarView.md @@ -38,6 +38,6 @@ AvatarView(avatarSize: size, ### Control Name `AvatarView` in Swift, `MSFAvatarView` in Objective-C ### Source Code -[AvatarView.swift](https://github.com/microsoft/fluentui-apple/blob/main/macos/FluentUI/AvatarView/AvatarView.swift) +[AvatarView.swift](https://github.com/microsoft/fluentui-apple/blob/main/Sources/FluentUI_macOS/Components/AvatarView/AvatarView.swift) ### Sample Code -[TestAvatarViewController.swift](https://github.com/microsoft/fluentui-apple/blob/main/macos/FluentUITestViewControllers/TestAvatarViewController.swift) +[TestAvatarViewController.swift](https://github.com/microsoft/fluentui-apple/blob/main/Demos/FluentUIDemo_macOS/FluentUITestViewControllers/TestAvatarViewController.swift) diff --git a/macos/docs/Controls/BadgeView.md b/Docs/macOS/Controls/BadgeView.md similarity index 77% rename from macos/docs/Controls/BadgeView.md rename to Docs/macOS/Controls/BadgeView.md index f8c316d9bf..14b02468cb 100644 --- a/macos/docs/Controls/BadgeView.md +++ b/Docs/macOS/Controls/BadgeView.md @@ -21,6 +21,6 @@ BadgeView(title: "Badge") ### Control Name `BadgeView` in Swift, `MSFBadgeView` in Objective-C ### Source Code -[BadgeView.swift](https://github.com/microsoft/fluentui-apple/blob/main/macos/FluentUI/BadgeView/BadgeView.swift) +[BadgeView.swift](https://github.com/microsoft/fluentui-apple/blob/main/Sources/FluentUI_macOS/Components/BadgeView/BadgeView.swift) ### Sample Code -[TestBadgeViewController.swift](https://github.com/microsoft/fluentui-apple/blob/main/macos/FluentUITestViewControllers/TestBadgeViewController.swift) +[TestBadgeViewController.swift](https://github.com/microsoft/fluentui-apple/blob/main/Demos/FluentUIDemo_macOS/FluentUITestViewControllers/TestBadgeViewController.swift) diff --git a/macos/docs/Controls/Button.md b/Docs/macOS/Controls/Button.md similarity index 96% rename from macos/docs/Controls/Button.md rename to Docs/macOS/Controls/Button.md index b3ea9077b7..36f62f1c1a 100644 --- a/macos/docs/Controls/Button.md +++ b/Docs/macOS/Controls/Button.md @@ -75,6 +75,6 @@ let buttonWithImage = Button(image: NSImage(named: NSImage.addTemplateName)!) ### Control Name `Button` in Swift, `MSFButton` in Objective-C ### Source Code -[Button.swift](https://github.com/microsoft/fluentui-apple/blob/main/macos/FluentUI/Button/Button.swift) +[Button.swift](https://github.com/microsoft/fluentui-apple/blob/main/Sources/FluentUI_macOS/Components/Button/Button.swift) ### Sample Code -[TestButtonViewController.swift](https://github.com/microsoft/fluentui-apple/blob/main/macos/FluentUITestViewControllers/TestButtonViewController.swift) +[TestButtonViewController.swift](https://github.com/microsoft/fluentui-apple/blob/main/Demos/FluentUIDemo_macOS/FluentUITestViewControllers/TestButtonViewController.swift) diff --git a/macos/docs/Controls/DatePicker.md b/Docs/macOS/Controls/DatePicker.md similarity index 93% rename from macos/docs/Controls/DatePicker.md rename to Docs/macOS/Controls/DatePicker.md index 341ca383f5..02079ad6e1 100644 --- a/macos/docs/Controls/DatePicker.md +++ b/Docs/macOS/Controls/DatePicker.md @@ -74,6 +74,6 @@ controller.hasTextField = false ### Control Name `DatePickerController` in Swift, `MSFDatePickerController` in Objective-C ### Source Code -[DatePickerController.swift](https://github.com/microsoft/fluentui-apple/blob/main/macos/FluentUI/DatePicker/DatePickerController.swift) +[DatePickerController.swift](https://github.com/microsoft/fluentui-apple/blob/main/Sources/FluentUI_macOS/Components/DatePicker/DatePickerController.swift) ### Sample Code -[TestDatePickerController.swift](https://github.com/microsoft/fluentui-apple/blob/main/macos/FluentUITestViewControllers/TestDatePickerController.swift) +[TestDatePickerController.swift](https://github.com/microsoft/fluentui-apple/blob/main/Demos/FluentUIDemo_macOS/FluentUITestViewControllers/TestDatePickerController.swift) diff --git a/macos/docs/Controls/FilledTemplateImageView.md b/Docs/macOS/Controls/FilledTemplateImageView.md similarity index 90% rename from macos/docs/Controls/FilledTemplateImageView.md rename to Docs/macOS/Controls/FilledTemplateImageView.md index eed147ee40..d519354bf7 100644 --- a/macos/docs/Controls/FilledTemplateImageView.md +++ b/Docs/macOS/Controls/FilledTemplateImageView.md @@ -37,6 +37,6 @@ tagImage.fillColor = .clear ### Control Name `FilledTemplateImageView` in Swift, `MSFFilledTemplateImageView` in Objective-C ### Source Code -[FilledTemplateImageView.swift](https://github.com/microsoft/fluentui-apple/blob/main/macos/FluentUI/FilledTemplateImageView/FilledTemplateImageView.swift) +[FilledTemplateImageView.swift](https://github.com/microsoft/fluentui-apple/blob/main/Sources/FluentUI_macOS/Components/FilledTemplateImageView/FilledTemplateImageView.swift) ### Sample Code -[FilledTemplateImageViewController.swift](https://github.com/microsoft/fluentui-apple/blob/main/macos/FluentUITestViewControllers/FilledTemplateImageViewController.swift) +[FilledTemplateImageViewController.swift](https://github.com/microsoft/fluentui-apple/blob/main/Demos/FluentUIDemo_macOS/FluentUITestViewControllers/FilledTemplateImageViewController.swift) diff --git a/macos/docs/Controls/Link.md b/Docs/macOS/Controls/Link.md similarity index 94% rename from macos/docs/Controls/Link.md rename to Docs/macOS/Controls/Link.md index e8d6e9713e..6a23649b65 100644 --- a/macos/docs/Controls/Link.md +++ b/Docs/macOS/Controls/Link.md @@ -52,6 +52,6 @@ link.action = #selector(displayAlert) ### Control Name `Link` in Swift, `MSFLink` in Objective-C ### Source Code -[Link.swift](https://github.com/microsoft/fluentui-apple/blob/main/macos/FluentUI/Link/Link.swift) +[Link.swift](https://github.com/microsoft/fluentui-apple/blob/main/Sources/FluentUI_macOS/Components/Link/Link.swift) ### Sample Code -[TestLinkViewController.swift](https://github.com/microsoft/fluentui-apple/blob/main/macos/FluentUITestViewControllers/TestLinkViewController.swift) +[TestLinkViewController.swift](https://github.com/microsoft/fluentui-apple/blob/main/Demos/FluentUIDemo_macOS/FluentUITestViewControllers/TestLinkViewController.swift) diff --git a/macos/docs/Controls/Separator.md b/Docs/macOS/Controls/Separator.md similarity index 80% rename from macos/docs/Controls/Separator.md rename to Docs/macOS/Controls/Separator.md index 5b722011e2..6f62e8c962 100644 --- a/macos/docs/Controls/Separator.md +++ b/Docs/macOS/Controls/Separator.md @@ -24,6 +24,6 @@ let horizontalSeparator = Separator(orientation: .horizontal) ### Control Name `Separator` in Swift, `MSFSeparator` in Objective-C ### Source Code -[Separator.swift](https://github.com/microsoft/fluentui-apple/blob/main/macos/FluentUI/Separator/Separator.swift) +[Separator.swift](https://github.com/microsoft/fluentui-apple/blob/main/Sources/FluentUI_macOS/Components/Separator/Separator.swift) ### Sample Code -[TestSeparatorViewController.swift](https://github.com/microsoft/fluentui-apple/blob/main/macos/FluentUITestViewControllers/TestSeparatorViewController.swift) \ No newline at end of file +[TestSeparatorViewController.swift](https://github.com/microsoft/fluentui-apple/blob/main/Demos/FluentUIDemo_macOS/FluentUITestViewControllers/TestSeparatorViewController.swift) \ No newline at end of file diff --git a/macos/docs/Controls/Template.md b/Docs/macOS/Controls/Template.md similarity index 100% rename from macos/docs/Controls/Template.md rename to Docs/macOS/Controls/Template.md diff --git a/FluentUI.nuspec b/FluentUI.nuspec deleted file mode 100644 index cbb2d7a1c5..0000000000 --- a/FluentUI.nuspec +++ /dev/null @@ -1,16 +0,0 @@ - - - - Microsoft.FluentUI.Apple - $buildNumber$ - FluentUI native controls for iOS and macOS - Microsoft - https://github.com/microsoft/fluentui-apple - - false - - - - - - diff --git a/MicrosoftFluentUI.podspec b/MicrosoftFluentUI.podspec index 55a87e01af..c5c99c1675 100644 --- a/MicrosoftFluentUI.podspec +++ b/MicrosoftFluentUI.podspec @@ -1,6 +1,14 @@ +# Constants +ios_root = 'Sources/FluentUI_iOS' +macos_root = 'Sources/FluentUI_macOS' + +components_dir = 'Components' +core_dir = 'Core' +resources_dir = 'Resources' + Pod::Spec.new do |s| s.name = 'MicrosoftFluentUI' - s.version = '0.26.0' + s.version = '0.32.0' s.summary = 'Fluent UI is a set of reusable UI controls and tools' s.homepage = "https://www.microsoft.com/design/fluent/#/" s.license = { :type => 'MIT', :file => 'LICENSE' } @@ -12,98 +20,98 @@ Pod::Spec.new do |s| # iOS - s.ios.deployment_target = "15.0" + s.ios.deployment_target = "16.0" s.subspec 'Avatar_ios' do |avatar_ios| avatar_ios.platform = :ios - avatar_ios.dependency 'MicrosoftFluentUI/Core_ios' - avatar_ios.preserve_paths = ["ios/FluentUI/Avatar/Avatar.resources.xcfilelist"] - avatar_ios.source_files = ["ios/FluentUI/Avatar/**/*.{swift,h}"] + avatar_ios.dependency "#{s.name}/Core_ios" + avatar_ios.preserve_paths = ["#{ios_root}/#{components_dir}/Avatar/Avatar.resources.xcfilelist"] + avatar_ios.source_files = ["#{ios_root}/#{components_dir}/Avatar/**/*.{swift,h}"] end s.subspec 'AvatarGroup_ios' do |avatargroup_ios| avatargroup_ios.platform = :ios - avatargroup_ios.dependency 'MicrosoftFluentUI/Avatar_ios' - avatargroup_ios.source_files = ["ios/FluentUI/AvatarGroup/**/*.{swift,h}"] + avatargroup_ios.dependency "#{s.name}/Avatar_ios" + avatargroup_ios.source_files = ["#{ios_root}/#{components_dir}/AvatarGroup/**/*.{swift,h}"] end s.subspec 'ActivityIndicator_ios' do |activityindicator_ios| activityindicator_ios.platform = :ios - activityindicator_ios.dependency 'MicrosoftFluentUI/Core_ios' - activityindicator_ios.source_files = ["ios/FluentUI/ActivityIndicator/**/*.{swift,h}"] + activityindicator_ios.dependency "#{s.name}/Core_ios" + activityindicator_ios.source_files = ["#{ios_root}/#{components_dir}/ActivityIndicator/**/*.{swift,h}"] end s.subspec 'BadgeField_ios' do |badgefield_ios| badgefield_ios.platform = :ios - badgefield_ios.dependency 'MicrosoftFluentUI/Label_ios' - badgefield_ios.source_files = ["ios/FluentUI/Badge Field/**/*.{swift,h}"] + badgefield_ios.dependency "#{s.name}/Label_ios" + badgefield_ios.source_files = ["#{ios_root}/#{components_dir}/Badge Field/**/*.{swift,h}"] end s.subspec 'BarButtonItems_ios' do |barbuttonitems_ios| barbuttonitems_ios.platform = :ios - barbuttonitems_ios.dependency 'MicrosoftFluentUI/Core_ios' - barbuttonitems_ios.preserve_paths = ["ios/FluentUI/BarButtonItems/BarButtonItems.resources.xcfilelist"] - barbuttonitems_ios.source_files = ["ios/FluentUI/BarButtonItems/**/*.{swift,h}"] + barbuttonitems_ios.dependency "#{s.name}/Core_ios" + barbuttonitems_ios.preserve_paths = ["#{ios_root}/#{components_dir}/BarButtonItems/BarButtonItems.resources.xcfilelist"] + barbuttonitems_ios.source_files = ["#{ios_root}/#{components_dir}/BarButtonItems/**/*.{swift,h}"] end s.subspec 'BottomCommanding_ios' do |bottomcommanding_ios| bottomcommanding_ios.platform = :ios - bottomcommanding_ios.dependency 'MicrosoftFluentUI/BottomSheet_ios' - bottomcommanding_ios.dependency 'MicrosoftFluentUI/OtherCells_ios' - bottomcommanding_ios.dependency 'MicrosoftFluentUI/Separator_ios' - bottomcommanding_ios.dependency 'MicrosoftFluentUI/TabBar_ios' - bottomcommanding_ios.dependency 'MicrosoftFluentUI/TableView_ios' - bottomcommanding_ios.preserve_paths = ["ios/FluentUI/Bottom Commanding/BottomCommanding.resources.xcfilelist"] - bottomcommanding_ios.source_files = ["ios/FluentUI/Bottom Commanding/**/*.{swift,h}"] + bottomcommanding_ios.dependency "#{s.name}/BottomSheet_ios" + bottomcommanding_ios.dependency "#{s.name}/OtherCells_ios" + bottomcommanding_ios.dependency "#{s.name}/Separator_ios" + bottomcommanding_ios.dependency "#{s.name}/TabBar_ios" + bottomcommanding_ios.dependency "#{s.name}/TableView_ios" + bottomcommanding_ios.preserve_paths = ["#{ios_root}/#{components_dir}/Bottom Commanding/BottomCommanding.resources.xcfilelist"] + bottomcommanding_ios.source_files = ["#{ios_root}/#{components_dir}/Bottom Commanding/**/*.{swift,h}"] end s.subspec 'BottomSheet_ios' do |bottomsheet_ios| bottomsheet_ios.platform = :ios - bottomsheet_ios.dependency 'MicrosoftFluentUI/Obscurable_ios' - bottomsheet_ios.dependency 'MicrosoftFluentUI/ResizingHandleView_ios' - bottomsheet_ios.source_files = ["ios/FluentUI/Bottom Sheet/**/*.{swift,h}"] + bottomsheet_ios.dependency "#{s.name}/Obscurable_ios" + bottomsheet_ios.dependency "#{s.name}/ResizingHandleView_ios" + bottomsheet_ios.source_files = ["#{ios_root}/#{components_dir}/Bottom Sheet/**/*.{swift,h}"] end s.subspec 'Button_ios' do |button_ios| button_ios.platform = :ios - button_ios.dependency 'MicrosoftFluentUI/Core_ios' - button_ios.source_files = ["ios/FluentUI/Button/**/*.{swift,h}"] + button_ios.dependency "#{s.name}/Core_ios" + button_ios.source_files = ["#{ios_root}/#{components_dir}/Button/**/*.{swift,h}"] end s.subspec 'Calendar_ios' do |calendar_ios| calendar_ios.platform = :ios - calendar_ios.dependency 'MicrosoftFluentUI/BarButtonItems_ios' - calendar_ios.dependency 'MicrosoftFluentUI/DotView_ios' - calendar_ios.dependency 'MicrosoftFluentUI/Label_ios' - calendar_ios.dependency 'MicrosoftFluentUI/Presenters_ios' - calendar_ios.dependency 'MicrosoftFluentUI/SegmentedControl_ios' - calendar_ios.dependency 'MicrosoftFluentUI/Separator_ios' - calendar_ios.dependency 'MicrosoftFluentUI/TwoLineTitleView_ios' - calendar_ios.source_files = ["ios/FluentUI/Calendar/**/*.{swift,h}", - "ios/FluentUI/Date Time Pickers/**/*.{swift,h}"] + calendar_ios.dependency "#{s.name}/BarButtonItems_ios" + calendar_ios.dependency "#{s.name}/DotView_ios" + calendar_ios.dependency "#{s.name}/Label_ios" + calendar_ios.dependency "#{s.name}/Presenters_ios" + calendar_ios.dependency "#{s.name}/SegmentedControl_ios" + calendar_ios.dependency "#{s.name}/Separator_ios" + calendar_ios.dependency "#{s.name}/TwoLineTitleView_ios" + calendar_ios.source_files = ["#{ios_root}/#{components_dir}/Calendar/**/*.{swift,h}", + "#{ios_root}/#{components_dir}/Date Time Pickers/**/*.{swift,h}"] end s.subspec 'Card_ios' do |card_ios| card_ios.platform = :ios - card_ios.dependency 'MicrosoftFluentUI/Label_ios' - card_ios.source_files = ["ios/FluentUI/Card/**/*.{swift,h}"] + card_ios.dependency "#{s.name}/Label_ios" + card_ios.source_files = ["#{ios_root}/#{components_dir}/Card/**/*.{swift,h}"] end s.subspec 'CardNudge_ios' do |cardnudge_ios| cardnudge_ios.platform = :ios - cardnudge_ios.dependency 'MicrosoftFluentUI/Core_ios' - cardnudge_ios.source_files = ["ios/FluentUI/Card Nudge/**/*.{swift,h}"] + cardnudge_ios.dependency "#{s.name}/Core_ios" + cardnudge_ios.source_files = ["#{ios_root}/#{components_dir}/Card Nudge/**/*.{swift,h}"] end s.subspec 'CommandBar_ios' do |commandbar_ios| commandbar_ios.platform = :ios - commandbar_ios.dependency 'MicrosoftFluentUI/Core_ios' - commandbar_ios.source_files = ["ios/FluentUI/Command Bar/**/*.{swift,h}"] + commandbar_ios.dependency "#{s.name}/Core_ios" + commandbar_ios.source_files = ["#{ios_root}/#{components_dir}/Command Bar/**/*.{swift,h}"] end s.subspec 'Core_ios' do |core_ios| core_ios.platform = :ios - core_ios.resource_bundle = { 'FluentUIResources-ios' => ["ios/FluentUI/**/*.{storyboard,xib,xcassets,strings,stringsdict}"] } + core_ios.resource_bundle = { 'FluentUIResources-ios' => ["#{ios_root}/#{resources_dir}/**/*.{storyboard,xib,xcassets,strings,stringsdict}"] } core_ios.script_phase = { :name => 'Optimize resource bundle', :script => 'REMOVE_UNUSED_RESOURCES_SCRIPT_PATH=${PODS_TARGET_SRCROOT}/scripts/removeUnusedResourcesFromAssets.swift @@ -118,228 +126,229 @@ if [ -f ${REMOVE_UNUSED_RESOURCES_SCRIPT_PATH} ]; then XCODEBUILDPARAMS="" fi - xcrun --sdk macosx swift ${CONDITIONALCOMPILATIONFLAGS} ${REMOVE_UNUSED_RESOURCES_SCRIPT_PATH} ${LOCROOT}/MicrosoftFluentUI/ios/FluentUI/Resources/FluentUI-ios.xcassets ${LOCROOT}/MicrosoftFluentUI/ios + xcrun --sdk macosx swift ${CONDITIONALCOMPILATIONFLAGS} ${REMOVE_UNUSED_RESOURCES_SCRIPT_PATH} ${LOCROOT}/MicrosoftFluentUI/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets ${LOCROOT}/MicrosoftFluentUI/Sources/FluentUI_iOS echo "=== Rebuilding resource bundle target ===" - xcodebuild ${XCODEBUILDPARAMS} DISABLE_MANUAL_TARGET_ORDER_BUILD_WARNING=1 -project ${PROJECT_FILE_PATH} -target "MicrosoftFluentUI-FluentUIResources-ios" -sdk ${PLATFORM_NAME} -configuration ${CONFIGURATION} ARCHS="${ARCHS}" CONFIGURATION_BUILD_DIR="${CONFIGURATION_BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" BUILT_PRODUCTS_DIR="${BUILT_PRODUCTS_DIR}" ${ACTION} + xcodebuild ${XCODEBUILDPARAMS} DISABLE_MANUAL_TARGET_ORDER_BUILD_WARNING=1 -project ${PROJECT_FILE_PATH} -target "MicrosoftFluentUI-FluentUIResources-ios" -sdk ${PLATFORM_NAME} -configuration ${CONFIGURATION} ARCHS="${ARCHS}" CONFIGURATION_BUILD_DIR="${CONFIGURATION_BUILD_dir}/" BUILD_ROOT="${BUILD_ROOT}" BUILT_PRODUCTS_DIR="${BUILT_PRODUCTS_dir}/" ${ACTION} # Deletes the script to ensure it will not be needlessly executed more than once after each "pod install" rm ${REMOVE_UNUSED_RESOURCES_SCRIPT_PATH} fi', :execution_position => :before_compile } - core_ios.preserve_paths = ["ios/FluentUI/Core/Core.resources.xcfilelist", + core_ios.preserve_paths = ["#{ios_root}/#{core_dir}/Core.resources.xcfilelist", "scripts/removeUnusedResourcesFromAssets.swift"] - core_ios.source_files = ["ios/FluentUI/Configuration/**/*.{swift,h}", - "ios/FluentUI/Core/**/*.{swift,h}", - "ios/FluentUI/Extensions/**/*.{swift,h}"] + core_ios.source_files = ["#{ios_root}/#{core_dir}/**/*.{swift,h}"] end - # Temporarily removed while this is not part of our main project - # s.subspec 'Divider_ios' do |divider_ios| - # divider_ios.platform = :ios - # divider_ios.dependency 'MicrosoftFluentUI/Core_ios' - # divider_ios.source_files = ["ios/FluentUI/Divider/**/*.{swift,h}"] - # end - s.subspec 'DotView_ios' do |dotview_ios| dotview_ios.platform = :ios - dotview_ios.dependency 'MicrosoftFluentUI/Core_ios' - dotview_ios.source_files = ["ios/FluentUI/DotView/**/*.{swift,h}"] + dotview_ios.dependency "#{s.name}/Core_ios" + dotview_ios.source_files = ["#{ios_root}/#{components_dir}/DotView/**/*.{swift,h}"] end s.subspec 'Drawer_ios' do |drawer_ios| drawer_ios.platform = :ios - drawer_ios.dependency 'MicrosoftFluentUI/Obscurable_ios' - drawer_ios.dependency 'MicrosoftFluentUI/ResizingHandleView_ios' - drawer_ios.dependency 'MicrosoftFluentUI/Separator_ios' - drawer_ios.dependency 'MicrosoftFluentUI/TouchForwardingView_ios' - drawer_ios.source_files = ["ios/FluentUI/Drawer/**/*.{swift,h}"] + drawer_ios.dependency "#{s.name}/Obscurable_ios" + drawer_ios.dependency "#{s.name}/ResizingHandleView_ios" + drawer_ios.dependency "#{s.name}/Separator_ios" + drawer_ios.dependency "#{s.name}/TouchForwardingView_ios" + drawer_ios.source_files = ["#{ios_root}/#{components_dir}/Drawer/**/*.{swift,h}"] end s.subspec 'EasyTapButton_ios' do |easytapbutton_ios| easytapbutton_ios.platform = :ios - easytapbutton_ios.dependency 'MicrosoftFluentUI/Core_ios' - easytapbutton_ios.source_files = ["ios/FluentUI/EasyTapButton/**/*.{swift,h}"] + easytapbutton_ios.dependency "#{s.name}/Core_ios" + easytapbutton_ios.source_files = ["#{ios_root}/#{components_dir}/EasyTapButton/**/*.{swift,h}"] end s.subspec 'HUD_ios' do |hud_ios| hud_ios.platform = :ios - hud_ios.dependency 'MicrosoftFluentUI/ActivityIndicator_ios' - hud_ios.dependency 'MicrosoftFluentUI/Label_ios' - hud_ios.dependency 'MicrosoftFluentUI/TouchForwardingView_ios' - hud_ios.preserve_paths = ["ios/FluentUI/HUD/HUD.resources.xcfilelist"] - hud_ios.source_files = ["ios/FluentUI/HUD/**/*.{swift,h}"] + hud_ios.dependency "#{s.name}/ActivityIndicator_ios" + hud_ios.dependency "#{s.name}/Label_ios" + hud_ios.dependency "#{s.name}/TouchForwardingView_ios" + hud_ios.preserve_paths = ["#{ios_root}/#{components_dir}/HUD/HUD.resources.xcfilelist"] + hud_ios.source_files = ["#{ios_root}/#{components_dir}/HUD/**/*.{swift,h}"] end s.subspec 'IndeterminateProgressBar_ios' do |indeterminateprogressbar_ios| indeterminateprogressbar_ios.platform = :ios - indeterminateprogressbar_ios.dependency 'MicrosoftFluentUI/Core_ios' - indeterminateprogressbar_ios.source_files = ["ios/FluentUI/IndeterminateProgressBar/**/*.{swift,h}"] + indeterminateprogressbar_ios.dependency "#{s.name}/Core_ios" + indeterminateprogressbar_ios.source_files = ["#{ios_root}/#{components_dir}/IndeterminateProgressBar/**/*.{swift,h}"] end s.subspec 'Label_ios' do |label_ios| label_ios.platform = :ios - label_ios.dependency 'MicrosoftFluentUI/Core_ios' - label_ios.source_files = ["ios/FluentUI/Label/**/*.{swift,h}"] + label_ios.dependency "#{s.name}/Core_ios" + label_ios.source_files = ["#{ios_root}/#{components_dir}/Label/**/*.{swift,h}"] + end + + s.subspec 'ListItem_ios' do |listitem_ios| + listitem_ios.platform = :ios + listitem_ios.dependency "#{s.name}/OtherCells_ios" + listitem_ios.dependency "#{s.name}/Separator_ios" + listitem_ios.dependency "#{s.name}/TableViewListShared_ios" + listitem_ios.source_files = ["#{ios_root}/#{components_dir}/List/**/*.swift"] end s.subspec 'MultilineCommandBar_ios' do |multilinecommandbar_ios| multilinecommandbar_ios.platform = :ios - multilinecommandbar_ios.dependency 'MicrosoftFluentUI/BottomSheet_ios' - multilinecommandbar_ios.dependency 'MicrosoftFluentUI/CommandBar_ios' - multilinecommandbar_ios.dependency 'MicrosoftFluentUI/Core_ios' - multilinecommandbar_ios.source_files = ["ios/FluentUI/MultilineCommandBar/**/*.{swift,h}"] + multilinecommandbar_ios.dependency "#{s.name}/BottomSheet_ios" + multilinecommandbar_ios.dependency "#{s.name}/CommandBar_ios" + multilinecommandbar_ios.dependency "#{s.name}/Core_ios" + multilinecommandbar_ios.source_files = ["#{ios_root}/#{components_dir}/MultilineCommandBar/**/*.{swift,h}"] end s.subspec 'Navigation_ios' do |navigation_ios| navigation_ios.platform = :ios - navigation_ios.dependency 'MicrosoftFluentUI/ActivityIndicator_ios' - navigation_ios.dependency 'MicrosoftFluentUI/Avatar_ios' - navigation_ios.dependency 'MicrosoftFluentUI/Separator_ios' - navigation_ios.dependency 'MicrosoftFluentUI/TwoLineTitleView_ios' - navigation_ios.preserve_paths = ["ios/FluentUI/Navigation/Navigation.resources.xcfilelist"] - navigation_ios.source_files = ["ios/FluentUI/Navigation/**/*.{swift,h}"] + navigation_ios.dependency "#{s.name}/ActivityIndicator_ios" + navigation_ios.dependency "#{s.name}/Avatar_ios" + navigation_ios.dependency "#{s.name}/Separator_ios" + navigation_ios.dependency "#{s.name}/TwoLineTitleView_ios" + navigation_ios.preserve_paths = ["#{ios_root}/#{components_dir}/Navigation/Navigation.resources.xcfilelist"] + navigation_ios.source_files = ["#{ios_root}/#{components_dir}/Navigation/**/*.{swift,h}"] end s.subspec 'Notification_ios' do |notification_ios| notification_ios.platform = :ios - notification_ios.dependency 'MicrosoftFluentUI/Obscurable_ios' - notification_ios.dependency 'MicrosoftFluentUI/Label_ios' - notification_ios.preserve_paths = ["ios/FluentUI/Notification/Notification.resources.xcfilelist"] - notification_ios.source_files = ["ios/FluentUI/Notification/**/*.{swift,h}"] + notification_ios.dependency "#{s.name}/Obscurable_ios" + notification_ios.dependency "#{s.name}/Label_ios" + notification_ios.preserve_paths = ["#{ios_root}/#{components_dir}/Notification/Notification.resources.xcfilelist"] + notification_ios.source_files = ["#{ios_root}/#{components_dir}/Notification/**/*.{swift,h}"] end s.subspec 'Obscurable_ios' do |obscurable_ios| obscurable_ios.platform = :ios - obscurable_ios.dependency 'MicrosoftFluentUI/Core_ios' - obscurable_ios.source_files = ["ios/FluentUI/Obscurable/**/*.{swift,h}"] + obscurable_ios.dependency "#{s.name}/Core_ios" + obscurable_ios.source_files = ["#{ios_root}/#{components_dir}/Obscurable/**/*.{swift,h}"] end s.subspec 'OtherCells_ios' do |othercells_ios| othercells_ios.platform = :ios - othercells_ios.dependency 'MicrosoftFluentUI/ActivityIndicator_ios' - othercells_ios.dependency 'MicrosoftFluentUI/TableView_ios' - othercells_ios.preserve_paths = ["ios/FluentUI/Other Cells/OtherCells.resources.xcfilelist"] - othercells_ios.source_files = ["ios/FluentUI/Other Cells/**/*.{swift,h}"] + othercells_ios.dependency "#{s.name}/ActivityIndicator_ios" + othercells_ios.dependency "#{s.name}/TableView_ios" + othercells_ios.preserve_paths = ["#{ios_root}/#{components_dir}/Other Cells/OtherCells.resources.xcfilelist"] + othercells_ios.source_files = ["#{ios_root}/#{components_dir}/Other Cells/**/*.{swift,h}"] end s.subspec 'PeoplePicker_ios' do |peoplepicker_ios| peoplepicker_ios.platform = :ios - peoplepicker_ios.dependency 'MicrosoftFluentUI/Avatar_ios' - peoplepicker_ios.dependency 'MicrosoftFluentUI/BadgeField_ios' - peoplepicker_ios.dependency 'MicrosoftFluentUI/Separator_ios' - peoplepicker_ios.dependency 'MicrosoftFluentUI/OtherCells_ios' - peoplepicker_ios.source_files = ["ios/FluentUI/People Picker/**/*.{swift,h}"] + peoplepicker_ios.dependency "#{s.name}/Avatar_ios" + peoplepicker_ios.dependency "#{s.name}/BadgeField_ios" + peoplepicker_ios.dependency "#{s.name}/Separator_ios" + peoplepicker_ios.dependency "#{s.name}/OtherCells_ios" + peoplepicker_ios.source_files = ["#{ios_root}/#{components_dir}/People Picker/**/*.{swift,h}"] end s.subspec 'PersonaButton_ios' do |personaButton_ios| personaButton_ios.platform = :ios - personaButton_ios.dependency 'MicrosoftFluentUI/Avatar_ios' - personaButton_ios.source_files = ["ios/FluentUI/PersonaButton/**/*.{swift,h}"] + personaButton_ios.dependency "#{s.name}/Avatar_ios" + personaButton_ios.source_files = ["#{ios_root}/#{components_dir}/PersonaButton/**/*.{swift,h}"] end s.subspec 'PersonaButtonCarousel_ios' do |personaButtonCarousel_ios| personaButtonCarousel_ios.platform = :ios - personaButtonCarousel_ios.dependency 'MicrosoftFluentUI/PersonaButton_ios' - personaButtonCarousel_ios.source_files = ["ios/FluentUI/PersonaButtonCarousel/**/*.{swift,h}"] + personaButtonCarousel_ios.dependency "#{s.name}/PersonaButton_ios" + personaButtonCarousel_ios.source_files = ["#{ios_root}/#{components_dir}/PersonaButtonCarousel/**/*.{swift,h}"] end s.subspec 'PillButtonBar_ios' do |pillbuttonbar_ios| pillbuttonbar_ios.platform = :ios - pillbuttonbar_ios.dependency 'MicrosoftFluentUI/Core_ios' - pillbuttonbar_ios.source_files = ["ios/FluentUI/Pill Button Bar/**/*.{swift,h}"] + pillbuttonbar_ios.dependency "#{s.name}/Core_ios" + pillbuttonbar_ios.source_files = ["#{ios_root}/#{components_dir}/Pill Button Bar/**/*.{swift,h}"] end s.subspec 'PopupMenu_ios' do |popupmenu_ios| popupmenu_ios.platform = :ios - popupmenu_ios.dependency 'MicrosoftFluentUI/Drawer_ios' - popupmenu_ios.dependency 'MicrosoftFluentUI/Label_ios' - popupmenu_ios.dependency 'MicrosoftFluentUI/Separator_ios' - popupmenu_ios.dependency 'MicrosoftFluentUI/TableView_ios' - popupmenu_ios.source_files = ["ios/FluentUI/Popup Menu/**/*.{swift,h}"] + popupmenu_ios.dependency "#{s.name}/Drawer_ios" + popupmenu_ios.dependency "#{s.name}/Label_ios" + popupmenu_ios.dependency "#{s.name}/Separator_ios" + popupmenu_ios.dependency "#{s.name}/TableView_ios" + popupmenu_ios.source_files = ["#{ios_root}/#{components_dir}/Popup Menu/**/*.{swift,h}"] end s.subspec 'Presenters_ios' do |presenters_ios| presenters_ios.platform = :ios - presenters_ios.dependency 'MicrosoftFluentUI/Obscurable_ios' - presenters_ios.source_files = ["ios/FluentUI/Presenters/**/*.{swift,h}"] + presenters_ios.dependency "#{s.name}/Obscurable_ios" + presenters_ios.source_files = ["#{ios_root}/#{components_dir}/Presenters/**/*.{swift,h}"] end s.subspec 'ResizingHandleView_ios' do |resizinghandleview_ios| resizinghandleview_ios.platform = :ios - resizinghandleview_ios.dependency 'MicrosoftFluentUI/Core_ios' - resizinghandleview_ios.source_files = ["ios/FluentUI/ResizingHandleView/**/*.{swift,h}"] + resizinghandleview_ios.dependency "#{s.name}/Core_ios" + resizinghandleview_ios.source_files = ["#{ios_root}/#{components_dir}/ResizingHandleView/**/*.{swift,h}"] end s.subspec 'SegmentedControl_ios' do |segmentedcontrol_ios| segmentedcontrol_ios.platform = :ios - segmentedcontrol_ios.dependency 'MicrosoftFluentUI/Separator_ios' - segmentedcontrol_ios.source_files = ["ios/FluentUI/SegmentedControl/**/*.{swift,h}"] + segmentedcontrol_ios.dependency "#{s.name}/Separator_ios" + segmentedcontrol_ios.source_files = ["#{ios_root}/#{components_dir}/SegmentedControl/**/*.{swift,h}"] end s.subspec 'Separator_ios' do |separator_ios| separator_ios.platform = :ios - separator_ios.dependency 'MicrosoftFluentUI/Core_ios' - separator_ios.source_files = ["ios/FluentUI/Separator/**/*.{swift,h}"] + separator_ios.dependency "#{s.name}/Core_ios" + separator_ios.source_files = ["#{ios_root}/#{components_dir}/Separator/**/*.{swift,h}"] end s.subspec 'Shimmer_ios' do |shimmer_ios| shimmer_ios.platform = :ios - shimmer_ios.dependency 'MicrosoftFluentUI/Core_ios' - shimmer_ios.dependency 'MicrosoftFluentUI/Utilities_ios' - shimmer_ios.source_files = ["ios/FluentUI/Shimmer/**/*.{swift,h}"] + shimmer_ios.dependency "#{s.name}/Core_ios" + shimmer_ios.source_files = ["#{ios_root}/#{components_dir}/Shimmer/**/*.{swift,h}"] end s.subspec 'TabBar_ios' do |tabbar_ios| tabbar_ios.platform = :ios - tabbar_ios.dependency 'MicrosoftFluentUI/Avatar_ios' - tabbar_ios.dependency 'MicrosoftFluentUI/Label_ios' - tabbar_ios.dependency 'MicrosoftFluentUI/Separator_ios' - tabbar_ios.source_files = ["ios/FluentUI/Tab Bar/**/*.{swift,h}"] + tabbar_ios.dependency "#{s.name}/Avatar_ios" + tabbar_ios.dependency "#{s.name}/Label_ios" + tabbar_ios.dependency "#{s.name}/Separator_ios" + tabbar_ios.source_files = ["#{ios_root}/#{components_dir}/Tab Bar/**/*.{swift,h}"] end s.subspec 'TableView_ios' do |tableview_ios| tableview_ios.platform = :ios - tableview_ios.dependency 'MicrosoftFluentUI/Label_ios' - tableview_ios.dependency 'MicrosoftFluentUI/Separator_ios' - tableview_ios.preserve_paths = ["ios/FluentUI/Table View/TableView.resources.xcfilelist"] - tableview_ios.source_files = ["ios/FluentUI/Table View/**/*.{swift,h}"] + tableview_ios.dependency "#{s.name}/Label_ios" + tableview_ios.dependency "#{s.name}/Separator_ios" + tableview_ios.dependency "#{s.name}/TableViewListShared_ios" + tableview_ios.preserve_paths = ["#{ios_root}/#{components_dir}/Table View/TableView.resources.xcfilelist"] + tableview_ios.source_files = ["#{ios_root}/#{components_dir}/Table View/**/*.{swift,h}"] + end + + s.subspec 'TableViewListShared_ios' do |tableviewlistshared_ios| + tableviewlistshared_ios.platform = :ios + tableviewlistshared_ios.dependency "#{s.name}/Core_ios" + tableviewlistshared_ios.preserve_paths = ["#{ios_root}/#{components_dir}/TableViewListShared/TableViewListShared.resources.xcfilelist"] + tableviewlistshared_ios.source_files = ["#{ios_root}/#{components_dir}/TableViewListShared/**/*.{swift,h}"] end s.subspec 'TextField_ios' do |textfield_ios| textfield_ios.platform = :ios - textfield_ios.dependency 'MicrosoftFluentUI/Button_ios' - textfield_ios.dependency 'MicrosoftFluentUI/Label_ios' - textfield_ios.dependency 'MicrosoftFluentUI/Separator_ios' - textfield_ios.preserve_paths = ["ios/FluentUI/TextField/TextField.resources.xcfilelist"] - textfield_ios.source_files = ["ios/FluentUI/TextField/**/*.{swift,h}"] + textfield_ios.dependency "#{s.name}/Button_ios" + textfield_ios.dependency "#{s.name}/Label_ios" + textfield_ios.dependency "#{s.name}/Separator_ios" + textfield_ios.preserve_paths = ["#{ios_root}/#{components_dir}/TextField/TextField.resources.xcfilelist"] + textfield_ios.source_files = ["#{ios_root}/#{components_dir}/TextField/**/*.{swift,h}"] end s.subspec 'Tooltip_ios' do |tooltip_ios| tooltip_ios.platform = :ios - tooltip_ios.dependency 'MicrosoftFluentUI/Label_ios' - tooltip_ios.dependency 'MicrosoftFluentUI/TouchForwardingView_ios' - tooltip_ios.preserve_paths = ["ios/FluentUI/Tooltip/Tooltip.resources.xcfilelist"] - tooltip_ios.source_files = ["ios/FluentUI/Tooltip/**/*.{swift,h}"] + tooltip_ios.dependency "#{s.name}/Label_ios" + tooltip_ios.dependency "#{s.name}/TouchForwardingView_ios" + tooltip_ios.preserve_paths = ["#{ios_root}/#{components_dir}/Tooltip/Tooltip.resources.xcfilelist"] + tooltip_ios.source_files = ["#{ios_root}/#{components_dir}/Tooltip/**/*.{swift,h}"] end s.subspec 'TouchForwardingView_ios' do |touchforwardingview_ios| touchforwardingview_ios.platform = :ios - touchforwardingview_ios.dependency 'MicrosoftFluentUI/Core_ios' - touchforwardingview_ios.source_files = ["ios/FluentUI/TouchForwardingView/**/*.{swift,h}"] + touchforwardingview_ios.dependency "#{s.name}/Core_ios" + touchforwardingview_ios.source_files = ["#{ios_root}/#{components_dir}/TouchForwardingView/**/*.{swift,h}"] end s.subspec 'TwoLineTitleView_ios' do |twoLinetitleview_ios| twoLinetitleview_ios.platform = :ios - twoLinetitleview_ios.dependency 'MicrosoftFluentUI/EasyTapButton_ios' - twoLinetitleview_ios.dependency 'MicrosoftFluentUI/Label_ios' - twoLinetitleview_ios.preserve_paths = ["ios/FluentUI/TwoLineTitleView/TwoLineTitleView.resources.xcfilelist"] - twoLinetitleview_ios.source_files = ["ios/FluentUI/TwoLineTitleView/**/*.{swift,h}"] - end - - s.subspec 'Utilities_ios' do |utilities_ios| - utilities_ios.platform = :ios - utilities_ios.source_files = ["ios/FluentUI/Utilities/**/*.{swift,h}"] + twoLinetitleview_ios.dependency "#{s.name}/EasyTapButton_ios" + twoLinetitleview_ios.dependency "#{s.name}/Label_ios" + twoLinetitleview_ios.preserve_paths = ["#{ios_root}/#{components_dir}/TwoLineTitleView/TwoLineTitleView.resources.xcfilelist"] + twoLinetitleview_ios.source_files = ["#{ios_root}/#{components_dir}/TwoLineTitleView/**/*.{swift,h}"] end @@ -349,58 +358,58 @@ fi', :execution_position => :before_compile } s.subspec 'Appearance_mac' do |appearance_mac| appearance_mac.platform = :osx - appearance_mac.source_files = ["macos/FluentUI/Appearance/**/*.{swift,h}"] + appearance_mac.source_files = ["#{macos_root}/#{components_dir}/Appearance/**/*.{swift,h}"] end s.subspec 'AvatarView_mac' do |avatarview_mac| avatarview_mac.platform = :osx - avatarview_mac.dependency 'MicrosoftFluentUI/Core_mac' - avatarview_mac.dependency 'MicrosoftFluentUI/DynamicColor_mac' - avatarview_mac.source_files = ["macos/FluentUI/AvatarView/**/*.{swift,h}"] + avatarview_mac.dependency "#{s.name}/Core_mac" + avatarview_mac.dependency "#{s.name}/DynamicColor_mac" + avatarview_mac.source_files = ["#{macos_root}/#{components_dir}/AvatarView/**/*.{swift,h}"] end s.subspec 'BadgeView_mac' do |badgeview_mac| badgeview_mac.platform = :osx - badgeview_mac.dependency 'MicrosoftFluentUI/Core_mac' - badgeview_mac.dependency 'MicrosoftFluentUI/DynamicColor_mac' - badgeview_mac.source_files = ["macos/FluentUI/Badge/**/*.{swift,h}"] + badgeview_mac.dependency "#{s.name}/Core_mac" + badgeview_mac.dependency "#{s.name}/DynamicColor_mac" + badgeview_mac.source_files = ["#{macos_root}/#{components_dir}/Badge/**/*.{swift,h}"] end s.subspec 'Button_mac' do |button_mac| button_mac.platform = :osx - button_mac.dependency 'MicrosoftFluentUI/Core_mac' - button_mac.source_files = ["macos/FluentUI/Button/**/*.{swift,h}"] + button_mac.dependency "#{s.name}/Core_mac" + button_mac.source_files = ["#{macos_root}/#{components_dir}/Button/**/*.{swift,h}"] end s.subspec 'Core_mac' do |core_mac| core_mac.platform = :osx - core_mac.resource_bundle = { 'FluentUIResources-macos' => ["macos/FluentUI/**/*.{storyboard,xib,xcassets,strings,stringsdict}"] } - core_mac.source_files = ["macos/FluentUI/Core/**/*.{swift,h}"] + core_mac.resource_bundle = { 'FluentUIResources-macos' => ["#{macos_root}/#{resources_dir}/**/*.{storyboard,xib,xcassets,strings,stringsdict}"] } + core_mac.source_files = ["#{macos_root}/#{core_dir}/**/*.{swift,h}"] end s.subspec 'DatePicker_mac' do |datepicker_mac| datepicker_mac.platform = :osx - datepicker_mac.dependency 'MicrosoftFluentUI/Core_mac' - datepicker_mac.dependency 'MicrosoftFluentUI/Appearance_mac' - datepicker_mac.source_files = ["macos/FluentUI/DatePicker/**/*.{swift,h}"] + datepicker_mac.dependency "#{s.name}/Core_mac" + datepicker_mac.dependency "#{s.name}/Appearance_mac" + datepicker_mac.source_files = ["#{macos_root}/#{components_dir}/DatePicker/**/*.{swift,h}"] end s.subspec 'DynamicColor_mac' do |dynamiccolor_mac| dynamiccolor_mac.platform = :osx - dynamiccolor_mac.dependency 'MicrosoftFluentUI/Appearance_mac' - dynamiccolor_mac.source_files = ["macos/FluentUI/DynamicColor/**/*.{swift,h}"] + dynamiccolor_mac.dependency "#{s.name}/Appearance_mac" + dynamiccolor_mac.source_files = ["#{macos_root}/#{components_dir}/DynamicColor/**/*.{swift,h}"] end s.subspec 'Link_mac' do |link_mac| link_mac.platform = :osx - link_mac.dependency 'MicrosoftFluentUI/Core_mac' - link_mac.source_files = ["macos/FluentUI/Link/**/*.{swift,h}"] + link_mac.dependency "#{s.name}/Core_mac" + link_mac.source_files = ["#{macos_root}/#{components_dir}/Link/**/*.{swift,h}"] end s.subspec 'Separator_mac' do |separator_mac| separator_mac.platform = :osx - separator_mac.dependency 'MicrosoftFluentUI/Core_mac' - separator_mac.source_files = ["macos/FluentUI/Separator/**/*.{swift,h}"] + separator_mac.dependency "#{s.name}/Core_mac" + separator_mac.source_files = ["#{macos_root}/#{components_dir}/Separator/**/*.{swift,h}"] end end diff --git a/Package.swift b/Package.swift index db4600650b..570869c402 100644 --- a/Package.swift +++ b/Package.swift @@ -2,11 +2,53 @@ import PackageDescription +let iOSPlatforms: [Platform] = [.iOS, .visionOS, .macCatalyst] +let macOSPlatforms: [Platform] = [.macOS] + +let targets: [Target] = [ + .target( + name: "FluentUI", + dependencies: [ + .targetItem(name: "FluentUI_ios", condition: .when(platforms: iOSPlatforms)), + .targetItem(name: "FluentUI_macos", condition: .when(platforms: macOSPlatforms)) + ], + path: "Sources/FluentUI" + ), + .target( + name: "FluentUI_ios", + path: "Sources/FluentUI_iOS", + resources: [ + .copy("Resources/Version.plist") + ] + ), + .target( + name: "FluentUI_macos", + path: "Sources/FluentUI_macOS" + ) +] + +let testTargets: [Target] = [ + .testTarget( + name: "FluentUI_iOS_Tests", + dependencies: [ + .target(name: "FluentUI_ios", condition: .when(platforms: iOSPlatforms)), + ], + path: "Tests/FluentUI_iOS_Tests" + ), + .testTarget( + name: "FluentUI_macOS_Tests", + dependencies: [ + .target(name: "FluentUI_macos", condition: .when(platforms: macOSPlatforms)) + ], + path: "Tests/FluentUI_macOS_Tests" + ) +] + let package = Package( name: "FluentUI", defaultLocalization: "en", platforms: [ - .iOS(.v15), + .iOS(.v16), .macOS(.v12), .visionOS(.v1), ], @@ -19,40 +61,5 @@ let package = Package( ] ) ], - targets: [ - .target( - name: "FluentUI", - dependencies: [ - .target(name: "FluentUI_ios", condition: .when(platforms: [.iOS, .visionOS])), - .target(name: "FluentUI_macos", condition: .when(platforms: [.macOS])) - ], - path: "public" - ), - .target( - name: "FluentUI_ios", - path: "ios/FluentUI", - exclude: [ - "Avatar/Avatar.resources.xcfilelist", - "BarButtonItems/BarButtonItems.resources.xcfilelist", - "Bottom Commanding/BottomCommanding.resources.xcfilelist", - "Core/Core.resources.xcfilelist", - "HUD/HUD.resources.xcfilelist", - "Navigation/Navigation.resources.xcfilelist", - "Notification/Notification.resources.xcfilelist", - "Other Cells/OtherCells.resources.xcfilelist", - "Resources/Localization/CultureMapping.json", - "Table View/TableView.resources.xcfilelist", - "TextField/TextField.resources.xcfilelist", - "Tooltip/Tooltip.resources.xcfilelist", - "TwoLineTitleView/TwoLineTitleView.resources.xcfilelist", - ] - ), - .target( - name: "FluentUI_macos", - path: "macos/FluentUI", - exclude: [ - "FluentUI-Info.plist" - ] - ) - ] + targets: targets + testTargets ) diff --git a/README.md b/README.md index 4177efc16c..a2fbd2dcc4 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ Fluent UI Apple contains native UIKit and AppKit controls aligned with [Microsof #### Requirements - iOS 15+ or macOS 12+ -- Xcode 15.2+ +- Xcode 15.3+ - Swift 5.9+ #### Using Swift Package Manager @@ -37,18 +37,6 @@ To integrate FluentUI into your Xcode project using CocoaPods, specify it in you pod 'MicrosoftFluentUI', '~> X.X.X' ``` -#### Manual installation - -- Download the latest changes from the [FluentUI for Apple](https://github.com/microsoft/fluentui-apple) repository. -- Move the `fluentui-apple` folder into your project folder. -- For iOS platform - - Move `ios/FluentUI.xcodeproj` into your Xcode project. - - In Xcode select your project -> your target -> "General" -> "Frameworks, Libraries, and Embedded Content" -> add `libFluentUI.a`. - - In Xcode select your project -> your target -> "Build Phases" -> "Copy Bundle Resources" -> add `FluentUIResources-ios.bundle`. -- For macOS platform - - Move `macos/xcode/FluentUI.xcodeproj` into your Xcode project. - - In Xcode select your project -> your target -> "General" -> "Frameworks, Libraries, and Embedded Content" -> add `FluentUI.framework`. - ### Import and use FluentUI After the framework has been added you can import the module to use it: @@ -63,7 +51,7 @@ For Objective-C ``` ## List of Available Controls -For more platform-specific information, please see [the iOS readme file](ios/README.md) and the [the macOS readme file](macos/README.md). +For more platform-specific information, please see [the iOS readme file](Sources/FluentUI_iOS/README.md) and the [the macOS readme file](Sources/FluentUI_macOS/README.md). ## Changelog diff --git a/public/FluentUI.swift b/Sources/FluentUI/FluentUI.swift similarity index 87% rename from public/FluentUI.swift rename to Sources/FluentUI/FluentUI.swift index db7c610e28..5a51e5e214 100644 --- a/public/FluentUI.swift +++ b/Sources/FluentUI/FluentUI.swift @@ -3,7 +3,7 @@ // Licensed under the MIT License. // -#if os(iOS) +#if os(iOS) || os(visionOS) @_exported import FluentUI_ios #elseif os(macOS) @_exported import FluentUI_macos diff --git a/ios/CONTRIBUTING.md b/Sources/FluentUI_iOS/CONTRIBUTING.md similarity index 85% rename from ios/CONTRIBUTING.md rename to Sources/FluentUI_iOS/CONTRIBUTING.md index 7d71795e97..1589227f61 100644 --- a/ios/CONTRIBUTING.md +++ b/Sources/FluentUI_iOS/CONTRIBUTING.md @@ -6,20 +6,20 @@ Included in this repository is a demo that showcases all the currently available To build and run the demo app follow these steps: - Clone the [FluentUI](https://github.com/microsoft/fluentui-apple) repository. -- Open `ios/FluentUI.xcworkspace` in Xcode. +- Open `Demos/FluentUIDemo_iOS/FluentUI.Demo.xcodeproj` in Xcode. - In the Xcode scheme menu choose `Demo.development` and choose an iOS Simulator(or Device if you have your own device provisioning profile) to deploy to. - Make sure Swift Package Manager has download 2 dependencies(appcenter-sdk-apple and PLCrashReporter) for demo app. - Build and Run the demo app ## Adding a new component -- Create a new folder of the Control name (ex. Foo) under under [FluentUI](FluentUI) +- Create a new folder of the Control name (ex. Foo) under [Components](Components) - Create a new swift file. (ex. Foo.swift) - Add Foo.swift in Fluent xcode project (All the files are in alphabetical order) - Make sure your file is under FluentUILib target -- Create and add a demo controller in the Fluent demo app under [Demos](FluentUI.Demo/FluentUI.Demo/Demos) (ex. FooDemoController.swift) +- Create and add a demo controller in the Fluent demo app under [Demos](/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos) (ex. FooDemoController.swift) - Add FooDemoController.swift to Fluent Demo xcode project (All the files are in alphabetical order) - Make sure it is part of FluentUI.Demo Target membership -- Add your FooDemoController to the list of [DemoDescriptor](https://github.com/microsoft/fluentui-apple/blob/02b1c3fe601b793cb6cfd24813e11d92420e0d77/ios/FluentUI.Demo/FluentUI.Demo/Demos.swift#L30) +- Add your FooDemoController to the list of [DemoDescriptor](https://github.com/microsoft/fluentui-apple/blob/main/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos.swift) - Add a new cocopod subspec in [MicrosoftFluentUI.podspec](https://github.com/microsoft/fluentui-apple/blob/main/MicrosoftFluentUI.podspec) with required dependencies. "s.subspec 'Foo_ios' do |foo_ios|" - Verify by "pod spec lint" For more info on [cocoapod](https://cocoapods.org) - Build and Run diff --git a/ios/FluentUI/ActivityIndicator/ActivityIndicator.swift b/Sources/FluentUI_iOS/Components/ActivityIndicator/ActivityIndicator.swift similarity index 100% rename from ios/FluentUI/ActivityIndicator/ActivityIndicator.swift rename to Sources/FluentUI_iOS/Components/ActivityIndicator/ActivityIndicator.swift diff --git a/ios/FluentUI/ActivityIndicator/ActivityIndicatorModifiers.swift b/Sources/FluentUI_iOS/Components/ActivityIndicator/ActivityIndicatorModifiers.swift similarity index 100% rename from ios/FluentUI/ActivityIndicator/ActivityIndicatorModifiers.swift rename to Sources/FluentUI_iOS/Components/ActivityIndicator/ActivityIndicatorModifiers.swift diff --git a/ios/FluentUI/ActivityIndicator/ActivityIndicatorTokenSet.swift b/Sources/FluentUI_iOS/Components/ActivityIndicator/ActivityIndicatorTokenSet.swift similarity index 100% rename from ios/FluentUI/ActivityIndicator/ActivityIndicatorTokenSet.swift rename to Sources/FluentUI_iOS/Components/ActivityIndicator/ActivityIndicatorTokenSet.swift diff --git a/ios/FluentUI/ActivityIndicator/MSFActivityIndicator.swift b/Sources/FluentUI_iOS/Components/ActivityIndicator/MSFActivityIndicator.swift similarity index 100% rename from ios/FluentUI/ActivityIndicator/MSFActivityIndicator.swift rename to Sources/FluentUI_iOS/Components/ActivityIndicator/MSFActivityIndicator.swift diff --git a/ios/FluentUI/Avatar/Avatar.resources.xcfilelist b/Sources/FluentUI_iOS/Components/Avatar/Avatar.resources.xcfilelist similarity index 100% rename from ios/FluentUI/Avatar/Avatar.resources.xcfilelist rename to Sources/FluentUI_iOS/Components/Avatar/Avatar.resources.xcfilelist diff --git a/ios/FluentUI/Avatar/Avatar.swift b/Sources/FluentUI_iOS/Components/Avatar/Avatar.swift similarity index 94% rename from ios/FluentUI/Avatar/Avatar.swift rename to Sources/FluentUI_iOS/Components/Avatar/Avatar.swift index e130e43b02..f6dd371680 100644 --- a/ios/FluentUI/Avatar/Avatar.swift +++ b/Sources/FluentUI_iOS/Components/Avatar/Avatar.swift @@ -34,6 +34,9 @@ import SwiftUI /// The image used to fill the ring as a custom color. var imageBasedRingColor: UIImage? { get set } + /// An override for the template icon to use when there is no set image or name. + var defaultImage: UIImage? { get set } + /// Defines whether the avatar state transitions are animated or not. Animations are enabled by default. var isAnimated: Bool { get set } @@ -46,8 +49,13 @@ import SwiftUI /// Sets the transparency of the avatar elements (inner and outer ring gaps, presence, and activity icon outline). /// Uses the solid default background color if set to false. + @available(iOS, deprecated, message: "Transparency is deprecated, and will default to `false`. This property will be removed in a future version of Fluent.") var isTransparent: Bool { get set } + /// Whether a background-colored outline should be drawn behind the avatar. + /// Uses the solid default background color if set to true. + var hasBackgroundOutline: Bool { get set } + /// Defines the presence displayed by the Avatar. /// Image displayed depends on the value of the isOutOfOffice property. /// Presence is not displayed in `.size16`. @@ -82,7 +90,11 @@ import SwiftUI } /// View that represents the avatar. -public struct Avatar: View, TokenizedControlView { +public struct Avatar: View, TokenizedControlView, Equatable { + public static func == (lhs: Avatar, rhs: Avatar) -> Bool { + lhs.state == rhs.state + } + public typealias TokenSetKeyType = AvatarTokenSet.Tokens @ObservedObject public var tokenSet: AvatarTokenSet @@ -127,6 +139,7 @@ public struct Avatar: View, TokenizedControlView { let cornerRadius = shouldDisplayActivity ? (activityStyle == .square ? AvatarTokenSet.activityIconRadius(size) : .infinity) : .infinity let isRingVisible = state.isRingVisible let hasRingInnerGap = state.hasRingInnerGap + let hasBackgroundOutline = state.hasBackgroundOutline let ringThicknessToken: CGFloat = tokenSet[.ringThickness].float let accessoryBorderThicknessToken: CGFloat = tokenSet[.borderThickness].float let accessoryBorderColorToken: UIColor = tokenSet[.borderColor].uiColor @@ -138,7 +151,7 @@ public struct Avatar: View, TokenizedControlView { let ringInnerGapOffset = 0.5 let ringInnerGap: CGFloat = isRingVisible ? (hasRingInnerGap ? tokenSet[.ringInnerGap].float : -ringInnerGapOffset) : 0 let ringThickness: CGFloat = isRingVisible ? (hasRingInnerGap ? ringThicknessToken : ringThicknessToken + ringInnerGapOffset) : 0 - let ringOuterGap: CGFloat = isRingVisible ? tokenSet[.ringOuterGap].float : 0 + let ringOuterGap: CGFloat = (isRingVisible || hasBackgroundOutline) ? tokenSet[.ringOuterGap].float : 0 let totalRingGap: CGFloat = ringInnerGap + ringThickness + ringOuterGap let avatarImageSize: CGFloat = contentSize let ringInnerGapSize: CGFloat = avatarImageSize + (ringInnerGap * 2) @@ -154,18 +167,25 @@ public struct Avatar: View, TokenizedControlView { !shouldUseCalculatedColors ? tokenSet[.backgroundDefaultColor].uiColor : CalculatedColors.backgroundColor(hashCode: colorHashCode)) let ringGapColor = Color(tokenSet[.ringGapColor].uiColor).opacity(isTransparent ? 0 : 1) - let ringColor = !isRingVisible ? Color.clear : - Color(state.ringColor ?? ( !shouldUseCalculatedColors ? - tokenSet[.ringDefaultColor].uiColor : - CalculatedColors.ringColor(hashCode: colorHashCode))) + let ringColor = ( !isRingVisible ? + Color.clear : + Color(state.ringColor ?? ( !shouldUseCalculatedColors ? + tokenSet[.ringDefaultColor].uiColor : + CalculatedColors.ringColor(hashCode: colorHashCode) + ) + ) + ) let avatarImageInfo: (image: UIImage?, renderingMode: Image.TemplateRenderingMode) = { if shouldUseDefaultImage { - let isOutlinedStyle = style == .outlined || style == .outlinedPrimary - return (UIImage.staticImageNamed(isOutlinedStyle ? "person_48_regular" : "person_48_filled"), .template) + var defaultImage = state.defaultImage + if defaultImage == nil { + defaultImage = UIImage.staticImageNamed(AvatarTokenSet.defaultImageName(style)) + } + return (defaultImage, .template) + } else { + return (state.image, .original) } - - return (state.image, .original) }() let avatarImageSizeRatio: CGFloat = (shouldUseDefaultImage) ? 0.7 : 1 @@ -553,10 +573,12 @@ class MSFAvatarStateImpl: ControlState, MSFAvatarState { @Published var hasRingInnerGap: Bool = true @Published var image: UIImage? @Published var imageBasedRingColor: UIImage? + @Published var defaultImage: UIImage? @Published var isAnimated: Bool = true @Published var isOutOfOffice: Bool = false @Published var isRingVisible: Bool = false - @Published var isTransparent: Bool = true + @Published var isTransparent: Bool = false + @Published var hasBackgroundOutline: Bool = false @Published var presence: MSFAvatarPresence = .none @Published var activityStyle: MSFAvatarActivityStyle = .none @Published var activityImage: UIImage? diff --git a/ios/FluentUI/Avatar/AvatarModifiers.swift b/Sources/FluentUI_iOS/Components/Avatar/AvatarModifiers.swift similarity index 86% rename from ios/FluentUI/Avatar/AvatarModifiers.swift rename to Sources/FluentUI_iOS/Components/Avatar/AvatarModifiers.swift index 1a40fba6ed..65aa586a2d 100644 --- a/ios/FluentUI/Avatar/AvatarModifiers.swift +++ b/Sources/FluentUI_iOS/Components/Avatar/AvatarModifiers.swift @@ -50,8 +50,24 @@ public extension Avatar { return self } + /// Whether the avatar should draw an outline using a background color. + /// - Parameter hasBackgroundOutline: Boolean value to set the property. + /// - Returns: The modified Avatar with the property set. + func hasBackgroundOutline(_ hasBackgroundOutline: Bool) -> Avatar { + state.hasBackgroundOutline = hasBackgroundOutline + return self + } + + /// An override for the template icon to use when there is no set image or name. + /// - Parameter defaultImage: Image to be used as the Avatar's default image. + /// - Returns: The modified Avatar with the property set. + func defaultImage(_ defaultImage: UIImage?) -> Avatar { + state.defaultImage = defaultImage + return self + } + /// The image used to fill the ring as a custom color. - /// - Parameter imageBasedRingColor: Image to be used as a the ring fill pattern. + /// - Parameter imageBasedRingColor: Image to be used as the ring fill pattern. /// - Returns: The modified Avatar with the property set. func imageBasedRingColor(_ imageBasedRingColor: UIImage?) -> Avatar { state.imageBasedRingColor = imageBasedRingColor diff --git a/ios/FluentUI/Avatar/AvatarTokenSet.swift b/Sources/FluentUI_iOS/Components/Avatar/AvatarTokenSet.swift similarity index 97% rename from ios/FluentUI/Avatar/AvatarTokenSet.swift rename to Sources/FluentUI_iOS/Components/Avatar/AvatarTokenSet.swift index e58564aee4..d6598536fa 100644 --- a/ios/FluentUI/Avatar/AvatarTokenSet.swift +++ b/Sources/FluentUI_iOS/Components/Avatar/AvatarTokenSet.swift @@ -273,6 +273,12 @@ extension AvatarTokenSet { return GlobalTokens.icon(.size280) } } + + /// The name of the icon to use for the default image. + static func defaultImageName(_ style: MSFAvatarStyle) -> String { + let isOutlinedStyle = style == .outlined || style == .outlinedPrimary + return isOutlinedStyle ? "person_48_regular" : "person_48_filled" + } } /// Pre-defined styles of the avatar. diff --git a/ios/FluentUI/Avatar/MSFAvatar.swift b/Sources/FluentUI_iOS/Components/Avatar/MSFAvatar.swift similarity index 100% rename from ios/FluentUI/Avatar/MSFAvatar.swift rename to Sources/FluentUI_iOS/Components/Avatar/MSFAvatar.swift diff --git a/ios/FluentUI/Avatar/MSFAvatarPresence.swift b/Sources/FluentUI_iOS/Components/Avatar/MSFAvatarPresence.swift similarity index 100% rename from ios/FluentUI/Avatar/MSFAvatarPresence.swift rename to Sources/FluentUI_iOS/Components/Avatar/MSFAvatarPresence.swift diff --git a/ios/FluentUI/Avatar/Persona.swift b/Sources/FluentUI_iOS/Components/Avatar/Persona.swift similarity index 100% rename from ios/FluentUI/Avatar/Persona.swift rename to Sources/FluentUI_iOS/Components/Avatar/Persona.swift diff --git a/ios/FluentUI/Avatar/ShapeCutout.swift b/Sources/FluentUI_iOS/Components/Avatar/ShapeCutout.swift similarity index 100% rename from ios/FluentUI/Avatar/ShapeCutout.swift rename to Sources/FluentUI_iOS/Components/Avatar/ShapeCutout.swift diff --git a/ios/FluentUI/AvatarGroup/AvatarGroup.swift b/Sources/FluentUI_iOS/Components/AvatarGroup/AvatarGroup.swift similarity index 75% rename from ios/FluentUI/AvatarGroup/AvatarGroup.swift rename to Sources/FluentUI_iOS/Components/AvatarGroup/AvatarGroup.swift index 4e874abf0f..3a54343625 100644 --- a/ios/FluentUI/AvatarGroup/AvatarGroup.swift +++ b/Sources/FluentUI_iOS/Components/AvatarGroup/AvatarGroup.swift @@ -16,6 +16,9 @@ import SwiftUI /// items than just the remainder of the avatars that could not be displayed due to the maxDisplayedAvatars property. var overflowCount: Int { get set } + /// Whether a background-colored outline should be drawn behind all Avatars, including the overflow. + var hasBackgroundOutline: Bool { get set } + /// Show a top-trailing aligned unread dot when set to true. var isUnread: Bool { get set } @@ -95,14 +98,42 @@ public struct AvatarGroup: View, TokenizedControlView { public typealias TokenSetKeyType = AvatarGroupTokenSet.Tokens @ObservedObject public var tokenSet: AvatarGroupTokenSet - /// Creates and initializes a SwiftUI AvatarGroup. + /// Creates and initializes a SwiftUI `AvatarGroup`. /// - Parameters: /// - style: The style of the avatar group. /// - size: The size of the avatars displayed in the avatar group. + /// - avatarCount: The number of Avatars in this group. + /// - maxDisplayedAvatars: Caps the number of displayed avatars and shows the remaining not displayed in the overflow avatar. + /// - overflowCount: Adds to the overflow count in case the calling code did not provide all the avatars, but still wants to convey more + /// items than just the remainder of the avatars that could not be displayed due to the maxDisplayedAvatars property. + /// - hasBackgroundOutline: Whether a background-colored outline should be drawn behind all Avatars, including the overflow. + /// - isUnread: Show a top-trailing aligned unread dot when set to true. + /// - avatarBuilder: A ViewBuilder that creates an `Avatar` for a given index. public init(style: MSFAvatarGroupStyle, - size: MSFAvatarSize) { + size: MSFAvatarSize, + avatarCount: Int = 0, + maxDisplayedAvatars: Int = Int.max, + overflowCount: Int = 0, + hasBackgroundOutline: Bool = false, + isUnread: Bool = false, + @ViewBuilder avatarBuilder: @escaping (_ index: Int) -> Avatar) { + // Configure the avatars + let avatars = (0.. some View { + func avatarView(at index: Int, for avatar: Avatar) -> some View { let nextIndex = index + 1 let isLastDisplayed = nextIndex == avatarsToDisplay - // If the avatar is part of Stack style and is not the last avatar in the sequence, create a cutout. - let avatarView = avatarViews[index] - let needsCutout = isStackStyle && (hasOverflow || !isLastDisplayed) - let avatarSize: CGFloat = avatarView.totalSize - let nextAvatarSize: CGFloat = isLastDisplayed ? overflowAvatar.totalSize : avatarViews[nextIndex].totalSize // Calculating the size delta of the current and next avatar based off of ring visibility, which helps determine // starting coordinates for the cutout. - let currentAvatarHasRing = avatar.isRingVisible - let nextAvatarHasRing = !isLastDisplayed ? avatars[nextIndex].isRingVisible : false + let currentAvatarHasRing = avatar.state.isRingVisible + let nextAvatarHasRing = !isLastDisplayed ? avatars[nextIndex].state.isRingVisible : false // Calculating the different interspace scenarios considering rings. - let ringOuterGap = avatarView.tokenSet[.ringOuterGap].float - let ringOffset = avatarView.tokenSet[.ringInnerGap].float + avatarView.tokenSet[.ringThickness].float + ringOuterGap + let ringOuterGap = avatar.tokenSet[.ringOuterGap].float + let ringOffset = avatar.tokenSet[.ringInnerGap].float + avatar.tokenSet[.ringThickness].float + ringOuterGap let stackPadding = interspace - (currentAvatarHasRing ? ringOffset : 0) - (nextAvatarHasRing ? ringOuterGap : 0) - // Finalized calculations for x and y coordinates of the Avatar if it needs a cutout, including RTL. - let ringGapOffset = 2 * ringOuterGap - let xOrigin: CGFloat = { - if layoutDirection == .rightToLeft { - return -nextAvatarSize - interspace + ringOuterGap + (currentAvatarHasRing ? ringOffset : 0) + avatar + .transition(.identity) + .onChange_iOS17(of: state.size) { size in + avatar.state.size = size } - return avatarSize + interspace - ringGapOffset - ringOuterGap - (currentAvatarHasRing ? ringOuterGap : 0) - }() - - let sizeDiff = avatarSize - nextAvatarSize - (currentAvatarHasRing ? 0 : ringGapOffset) - let yOrigin = sizeDiff / 2 - - // Hand the rendering of the avatar to a helper function to appease Swift's - // strict type-checking timeout. - VStack { - avatarView - .transition(.identity) - .modifyIf(needsCutout, { view in - view.clipShape(ShapeCutout(xOrigin: xOrigin, - yOrigin: yOrigin, - cornerRadius: .infinity, - cutoutSize: nextAvatarSize), - style: FillStyle(eoFill: true)) - }) - } .padding(.trailing, (isLastDisplayed && !hasOverflow) ? 0 : isStackStyle ? stackPadding : interspace) } @ViewBuilder var avatarGroup: some View { HStack(spacing: 0) { - ForEach(enumeratedAvatars.prefix(avatarsToDisplay), id: \.1) { index, avatar in + ForEach(0.. 0 { @@ -295,6 +302,22 @@ public struct AvatarGroup: View, TokenizedControlView { return str } + /// Creates and initializes a SwiftUI `AvatarGroup`. + /// + /// This internal initializer is used exclusively for our UIKit wrapper, and should not be made public. + /// + /// - Parameters: + /// - style: The style of the avatar group. + /// - size: The size of the avatars displayed in the avatar group. + init(style: MSFAvatarGroupStyle, + size: MSFAvatarSize) { + self.init(style: style, + size: size, + avatarCount: 0) { _ in + Avatar(style: .default, size: .size32) + } + } + @Environment(\.fluentTheme) var fluentTheme: FluentTheme @Environment(\.layoutDirection) var layoutDirection: LayoutDirection @ObservedObject var state: MSFAvatarGroupStateImpl @@ -306,6 +329,7 @@ public struct AvatarGroup: View, TokenizedControlView { let state = MSFAvatarStateImpl(style: .overflow, size: state.size) state.primaryText = "\(count)" state.image = nil + state.hasBackgroundOutline = self.state.hasBackgroundOutline return Avatar(state) } } @@ -319,16 +343,17 @@ class MSFAvatarGroupStateImpl: ControlState, MSFAvatarGroupState { guard index <= avatars.count && index >= 0 else { preconditionFailure("Index is out of bounds") } - let avatar = MSFAvatarGroupAvatarStateImpl(size: size) + let avatar = Avatar(style: .default, size: size) + avatar.state.isTransparent = false avatars.insert(avatar, at: index) - return avatar + return avatar.state } func getAvatarState(at index: Int) -> MSFAvatarGroupAvatarState { guard avatars.indices.contains(index) else { preconditionFailure("Index is out of bounds") } - return avatars[index] + return avatars[index].state } func removeAvatar(at index: Int) { @@ -338,9 +363,14 @@ class MSFAvatarGroupStateImpl: ControlState, MSFAvatarGroupState { avatars.remove(at: index) } - @Published var avatars: [MSFAvatarGroupAvatarStateImpl] = [] + @Published var avatars: [Avatar] = [] @Published var maxDisplayedAvatars: Int = Int.max @Published var overflowCount: Int = 0 + @Published var hasBackgroundOutline: Bool = false { + didSet { + avatars.forEach { $0.state.hasBackgroundOutline = hasBackgroundOutline } + } + } @Published var isUnread: Bool = false @Published var style: MSFAvatarGroupStyle @@ -355,8 +385,6 @@ class MSFAvatarGroupStateImpl: ControlState, MSFAvatarGroupState { } } -class MSFAvatarGroupAvatarStateImpl: MSFAvatarStateImpl, MSFAvatarGroupAvatarState { - init(size: MSFAvatarSize) { - super.init(style: .default, size: size) - } +/// Simple extension to `MSFAvatarStateImpl` to prove conformance to `MSFAvatarGroupAvatarState`. +extension MSFAvatarStateImpl: MSFAvatarGroupAvatarState { } diff --git a/ios/FluentUI/AvatarGroup/AvatarGroupModifiers.swift b/Sources/FluentUI_iOS/Components/AvatarGroup/AvatarGroupModifiers.swift similarity index 100% rename from ios/FluentUI/AvatarGroup/AvatarGroupModifiers.swift rename to Sources/FluentUI_iOS/Components/AvatarGroup/AvatarGroupModifiers.swift diff --git a/ios/FluentUI/AvatarGroup/AvatarGroupTokenSet.swift b/Sources/FluentUI_iOS/Components/AvatarGroup/AvatarGroupTokenSet.swift similarity index 100% rename from ios/FluentUI/AvatarGroup/AvatarGroupTokenSet.swift rename to Sources/FluentUI_iOS/Components/AvatarGroup/AvatarGroupTokenSet.swift diff --git a/ios/FluentUI/AvatarGroup/MSFAvatarGroup.swift b/Sources/FluentUI_iOS/Components/AvatarGroup/MSFAvatarGroup.swift similarity index 100% rename from ios/FluentUI/AvatarGroup/MSFAvatarGroup.swift rename to Sources/FluentUI_iOS/Components/AvatarGroup/MSFAvatarGroup.swift diff --git a/ios/FluentUI/Badge Field/BadgeField.swift b/Sources/FluentUI_iOS/Components/Badge Field/BadgeField.swift similarity index 99% rename from ios/FluentUI/Badge Field/BadgeField.swift rename to Sources/FluentUI_iOS/Components/Badge Field/BadgeField.swift index 4a822f22ae..05e422a86f 100644 --- a/ios/FluentUI/Badge Field/BadgeField.swift +++ b/Sources/FluentUI_iOS/Components/Badge Field/BadgeField.swift @@ -57,7 +57,7 @@ public protocol BadgeFieldDelegate: AnyObject { * voiceover and dynamic text sizing */ @objc(MSFBadgeField) -open class BadgeField: UIView, TokenizedControlInternal { +open class BadgeField: UIView, TokenizedControl { private struct Constants { static let emptyTextFieldString: String = "" static let dragAndDropMinimumPressDuration: TimeInterval = 0.2 diff --git a/ios/FluentUI/Badge Field/BadgeFieldTokenSet.swift b/Sources/FluentUI_iOS/Components/Badge Field/BadgeFieldTokenSet.swift similarity index 100% rename from ios/FluentUI/Badge Field/BadgeFieldTokenSet.swift rename to Sources/FluentUI_iOS/Components/Badge Field/BadgeFieldTokenSet.swift diff --git a/ios/FluentUI/Badge Field/BadgeStringExtractor.swift b/Sources/FluentUI_iOS/Components/Badge Field/BadgeStringExtractor.swift similarity index 100% rename from ios/FluentUI/Badge Field/BadgeStringExtractor.swift rename to Sources/FluentUI_iOS/Components/Badge Field/BadgeStringExtractor.swift diff --git a/ios/FluentUI/Badge Field/BadgeView.swift b/Sources/FluentUI_iOS/Components/Badge Field/BadgeView.swift similarity index 98% rename from ios/FluentUI/Badge Field/BadgeView.swift rename to Sources/FluentUI_iOS/Components/Badge Field/BadgeView.swift index a7fb7d71ac..be0e0773f2 100644 --- a/ios/FluentUI/Badge Field/BadgeView.swift +++ b/Sources/FluentUI_iOS/Components/Badge Field/BadgeView.swift @@ -56,7 +56,7 @@ public protocol BadgeViewDelegate { `BadgeView` can be selected with a tap gesture and tapped again after entering a selected state for the purpose of displaying more details about the entity represented by the selected badge. */ @objc(MSFBadgeView) -open class BadgeView: UIView, TokenizedControlInternal { +open class BadgeView: UIView, TokenizedControl { @objc open var dataSource: BadgeViewDataSource? { didSet { reload() @@ -254,7 +254,9 @@ open class BadgeView: UIView, TokenizedControlInternal { } func reload() { - label.text = dataSource?.text + let text = dataSource?.text + label.text = text + largeContentTitle = text style = dataSource?.style ?? .default sizeCategory = dataSource?.sizeCategory ?? .medium diff --git a/ios/FluentUI/Badge Field/BadgeViewTokenSet.swift b/Sources/FluentUI_iOS/Components/Badge Field/BadgeViewTokenSet.swift similarity index 100% rename from ios/FluentUI/Badge Field/BadgeViewTokenSet.swift rename to Sources/FluentUI_iOS/Components/Badge Field/BadgeViewTokenSet.swift diff --git a/ios/FluentUI/BarButtonItems/BarButtonItems.resources.xcfilelist b/Sources/FluentUI_iOS/Components/BarButtonItems/BarButtonItems.resources.xcfilelist similarity index 100% rename from ios/FluentUI/BarButtonItems/BarButtonItems.resources.xcfilelist rename to Sources/FluentUI_iOS/Components/BarButtonItems/BarButtonItems.resources.xcfilelist diff --git a/ios/FluentUI/BarButtonItems/BarButtonItems.swift b/Sources/FluentUI_iOS/Components/BarButtonItems/BarButtonItems.swift similarity index 65% rename from ios/FluentUI/BarButtonItems/BarButtonItems.swift rename to Sources/FluentUI_iOS/Components/BarButtonItems/BarButtonItems.swift index 2d457eafba..5d46dba10f 100644 --- a/ios/FluentUI/BarButtonItems/BarButtonItems.swift +++ b/Sources/FluentUI_iOS/Components/BarButtonItems/BarButtonItems.swift @@ -6,13 +6,18 @@ import UIKit public final class BarButtonItems: NSObject { + + /// The accessibility label that should be applied for the done bar button. + /// A temporary change so that consumers who use SwiftUI for a toolbar can avoid duplicated resources until support of a swiftUI control is available. + @objc public static let doneButtonAccessibilityLabel: String = "Accessibility.Done.Label".localized + /// When adding this barButtonItem to the view, tint it with appropriate app color UIColor(light: Colors.primary(for: window), dark: Colors.textDominant) @objc static func confirm(target: Any?, action: Selector?) -> UIBarButtonItem { let image = UIImage.staticImageNamed("checkmark-24x24") let landscapeImage = UIImage.staticImageNamed("checkmark-thin-20x20") let button = UIBarButtonItem(image: image, landscapeImagePhone: landscapeImage, style: .plain, target: target, action: action) - button.accessibilityLabel = "Accessibility.Done.Label".localized + button.accessibilityLabel = doneButtonAccessibilityLabel return button } diff --git a/ios/FluentUI/Bottom Commanding/BottomCommanding.resources.xcfilelist b/Sources/FluentUI_iOS/Components/Bottom Commanding/BottomCommanding.resources.xcfilelist similarity index 100% rename from ios/FluentUI/Bottom Commanding/BottomCommanding.resources.xcfilelist rename to Sources/FluentUI_iOS/Components/Bottom Commanding/BottomCommanding.resources.xcfilelist diff --git a/ios/FluentUI/Bottom Commanding/BottomCommandingController.swift b/Sources/FluentUI_iOS/Components/Bottom Commanding/BottomCommandingController.swift similarity index 99% rename from ios/FluentUI/Bottom Commanding/BottomCommandingController.swift rename to Sources/FluentUI_iOS/Components/Bottom Commanding/BottomCommandingController.swift index 8c56d62cae..86b2b60ff4 100644 --- a/ios/FluentUI/Bottom Commanding/BottomCommandingController.swift +++ b/Sources/FluentUI_iOS/Components/Bottom Commanding/BottomCommandingController.swift @@ -60,7 +60,7 @@ public protocol BottomCommandingControllerDelegate: AnyObject { /// Items from the `expandedListSections` are either presented in an expanded sheet or a popover, depending on the current style. /// @objc(MSFBottomCommandingController) -open class BottomCommandingController: UIViewController, TokenizedControlInternal { +open class BottomCommandingController: UIViewController, TokenizedControl { /// View controller that will be displayed below the bottom commanding UI. @objc public var contentViewController: UIViewController? { @@ -920,7 +920,7 @@ open class BottomCommandingController: UIViewController, TokenizedControlInterna bottomSheetController.isExpandable = isExpandable let maxHeroItemHeight = heroCommandStack.arrangedSubviews.map { $0.intrinsicContentSize.height }.max() ?? Constants.defaultHeroButtonHeight - let headerHeightWithoutBottomWhitespace = BottomCommandingTokenSet.handleHeaderHeight + maxHeroItemHeight + let headerHeightWithoutBottomWhitespace = BottomCommandingTokenSet.headerTopMargin + maxHeroItemHeight // How much more whitespace is required at the bottom of the sheet header let requiredBottomWhitespace = max(0, Constants.BottomSheet.headerHeight - headerHeightWithoutBottomWhitespace) @@ -933,7 +933,7 @@ open class BottomCommandingController: UIViewController, TokenizedControlInterna let addedHeaderTopMargin = !isExpandable ? BottomSheetController.resizingHandleHeight : 0 - bottomSheetHeroStackTopConstraint?.constant = BottomCommandingTokenSet.handleHeaderHeight + addedHeaderTopMargin + bottomSheetHeroStackTopConstraint?.constant = BottomCommandingTokenSet.headerTopMargin + addedHeaderTopMargin let oldCollapsedContentHeight = bottomSheetController.collapsedContentHeight let newCollapsedContentHeight = headerHeightWithoutBottomWhitespace + reducedBottomWhitespace + addedHeaderTopMargin diff --git a/ios/FluentUI/Bottom Commanding/BottomCommandingTokenSet.swift b/Sources/FluentUI_iOS/Components/Bottom Commanding/BottomCommandingTokenSet.swift similarity index 98% rename from ios/FluentUI/Bottom Commanding/BottomCommandingTokenSet.swift rename to Sources/FluentUI_iOS/Components/Bottom Commanding/BottomCommandingTokenSet.swift index 8c0ee59c85..239bd52ecc 100644 --- a/ios/FluentUI/Bottom Commanding/BottomCommandingTokenSet.swift +++ b/Sources/FluentUI_iOS/Components/Bottom Commanding/BottomCommandingTokenSet.swift @@ -97,5 +97,5 @@ extension BottomCommandingTokenSet { static let tabVerticalPadding: CGFloat = GlobalTokens.spacing(.size80) static let tabHorizontalPadding: CGFloat = GlobalTokens.spacing(.size160) static let strokeWidth: CGFloat = GlobalTokens.stroke(.width05) - static let handleHeaderHeight: CGFloat = GlobalTokens.spacing(.size120) + static let headerTopMargin: CGFloat = GlobalTokens.spacing(.size60) } diff --git a/ios/FluentUI/Bottom Commanding/CommandingItem.swift b/Sources/FluentUI_iOS/Components/Bottom Commanding/CommandingItem.swift similarity index 100% rename from ios/FluentUI/Bottom Commanding/CommandingItem.swift rename to Sources/FluentUI_iOS/Components/Bottom Commanding/CommandingItem.swift diff --git a/ios/FluentUI/Bottom Commanding/CommandingSection.swift b/Sources/FluentUI_iOS/Components/Bottom Commanding/CommandingSection.swift similarity index 100% rename from ios/FluentUI/Bottom Commanding/CommandingSection.swift rename to Sources/FluentUI_iOS/Components/Bottom Commanding/CommandingSection.swift diff --git a/ios/FluentUI/Bottom Sheet/BottomSheetController.swift b/Sources/FluentUI_iOS/Components/Bottom Sheet/BottomSheetController.swift similarity index 95% rename from ios/FluentUI/Bottom Sheet/BottomSheetController.swift rename to Sources/FluentUI_iOS/Components/Bottom Sheet/BottomSheetController.swift index 30adcd708b..a0161c5e02 100644 --- a/ios/FluentUI/Bottom Sheet/BottomSheetController.swift +++ b/Sources/FluentUI_iOS/Components/Bottom Sheet/BottomSheetController.swift @@ -19,8 +19,26 @@ public protocol BottomSheetControllerDelegate: AnyObject { didMoveTo expansionState: BottomSheetExpansionState, interaction: BottomSheetInteraction) + /// Called before a transition to a new expansion state starts. + /// + /// External changes to `isExpanded` or `isHidden` will not trigger this callback. + /// - Parameters: + /// - bottomSheetController: The caller object. + /// - expansionState: The expansion state that the sheet will move to. + /// - interaction: The user interaction that caused the state change. + @objc optional func bottomSheetController(_ bottomSheetController: BottomSheetController, + willMoveTo expansionState: BottomSheetExpansionState, + interaction: BottomSheetInteraction) + /// Called when `collapsedHeightInSafeArea` changes. @objc optional func bottomSheetControllerCollapsedHeightInSafeAreaDidChange(_ bottomSheetController: BottomSheetController) + + /// Called when the user initiates the pan gesture + /// + /// - Parameters: + /// - bottomSheetController: The caller object. + /// - expansionState: The expansion state that the sheet moved from + @objc optional func bottomSheetStartedPan(_ bottomSheetController: BottomSheetController, from expansionState: BottomSheetExpansionState) } /// Interactions that can trigger a state change. @@ -47,7 +65,7 @@ public protocol BottomSheetControllerDelegate: AnyObject { } @objc(MSFBottomSheetController) -public class BottomSheetController: UIViewController, Shadowable, TokenizedControlInternal { +public class BottomSheetController: UIViewController, Shadowable, TokenizedControl { /// Initializes the bottom sheet controller /// - Parameters: @@ -156,7 +174,7 @@ public class BottomSheetController: UIViewController, Shadowable, TokenizedContr /// The message should convey the "Expand" action and will be used when the bottom sheet is collapsed. @objc public var handleExpandCustomAccessibilityLabel: String? { didSet { - updateResizingHandleViewAccessibility() + updateResizingHandleViewAccessibility(for: currentExpansionState) } } @@ -164,7 +182,7 @@ public class BottomSheetController: UIViewController, Shadowable, TokenizedContr /// The message should convey the "Collapse" action and will be used when the bottom sheet is expanded. @objc public var handleCollapseCustomAccessibilityLabel: String? { didSet { - updateResizingHandleViewAccessibility() + updateResizingHandleViewAccessibility(for: currentExpansionState) } } @@ -478,6 +496,8 @@ public class BottomSheetController: UIViewController, Shadowable, TokenizedContr super.viewDidAppear(animated) tokenSet.update(fluentTheme) + + updateResizingHandleViewAccessibility(for: currentExpansionState) } public override func viewDidLayoutSubviews() { @@ -505,6 +525,7 @@ public class BottomSheetController: UIViewController, Shadowable, TokenizedContr collapsedHeightInSafeArea = view.safeAreaLayoutGuide.layoutFrame.maxY - offset(for: .collapsed) updateAppearance() + super.viewDidLayoutSubviews() } @@ -649,13 +670,15 @@ public class BottomSheetController: UIViewController, Shadowable, TokenizedContr move(to: isExpanded ? .collapsed : .expanded, interaction: .resizingHandleTap) } - private func updateResizingHandleViewAccessibility() { - if currentExpansionState == .expanded { + private func updateResizingHandleViewAccessibility(for state: BottomSheetExpansionState) { + if state == .expanded { resizingHandleView.accessibilityLabel = handleCollapseCustomAccessibilityLabel ?? "Accessibility.Drawer.ResizingHandle.Label.Collapse".localized resizingHandleView.accessibilityHint = "Accessibility.Drawer.ResizingHandle.Hint.Collapse".localized - } else { + resizingHandleView.accessibilityValue = "Accessibility.Drawer.ResizingHandle.Value.Expanded".localized + } else if state == .collapsed { resizingHandleView.accessibilityLabel = handleExpandCustomAccessibilityLabel ?? "Accessibility.Drawer.ResizingHandle.Label.Expand".localized resizingHandleView.accessibilityHint = "Accessibility.Drawer.ResizingHandle.Hint.Expand".localized + resizingHandleView.accessibilityValue = "Accessibility.Drawer.ResizingHandle.Value.Collapsed".localized } } @@ -722,6 +745,15 @@ public class BottomSheetController: UIViewController, Shadowable, TokenizedContr targetAlpha = abs(currentOffset - lowestUndimmedOffset) / (lowestUndimmedOffset - highestDimmedOffset) } } + + if currentExpansionState != .transitioning { + // In the case that there has been a floating point precision error and + // targetAlpha is a value very close to 0 or 1, set it explicitly + if targetAlpha != 0 || targetAlpha != 1 { + targetAlpha = currentExpansionState == .expanded ? 1 : 0 + } + } + dimmingView.alpha = targetAlpha } @@ -754,6 +786,7 @@ public class BottomSheetController: UIViewController, Shadowable, TokenizedContr switch sender.state { case .began: completeAnimationsIfNeeded() + delegate?.bottomSheetStartedPan?(self, from: currentExpansionState) currentExpansionState = .transitioning fallthrough case .changed: @@ -905,7 +938,11 @@ public class BottomSheetController: UIViewController, Shadowable, TokenizedContr completeAnimationsIfNeeded() + updateResizingHandleViewAccessibility(for: targetExpansionState) + if currentSheetVerticalOffset != offset(for: targetExpansionState) { + delegate?.bottomSheetController?(self, willMoveTo: targetExpansionState, interaction: interaction) + let animator = stateChangeAnimator(to: targetExpansionState, velocity: velocity, interaction: interaction, @@ -1030,6 +1067,9 @@ public class BottomSheetController: UIViewController, Shadowable, TokenizedContr bottomSheetView.isHidden = targetExpansionState == .hidden + updateDimmingViewAlpha() + updateDimmingViewAccessibility() + // UIKit doesn't properly handle interrupted constraint animations, so we need to // detect and fix a possible desync here updateSheetLayoutGuideTopConstraint() @@ -1140,11 +1180,7 @@ public class BottomSheetController: UIViewController, Shadowable, TokenizedContr private var currentStateChangeAnimator: UIViewPropertyAnimator? - private var currentExpansionState: BottomSheetExpansionState = .collapsed { - didSet { - updateResizingHandleViewAccessibility() - } - } + private var currentExpansionState: BottomSheetExpansionState = .collapsed private var targetExpansionState: BottomSheetExpansionState? diff --git a/ios/FluentUI/Bottom Sheet/BottomSheetPassthroughView.swift b/Sources/FluentUI_iOS/Components/Bottom Sheet/BottomSheetPassthroughView.swift similarity index 100% rename from ios/FluentUI/Bottom Sheet/BottomSheetPassthroughView.swift rename to Sources/FluentUI_iOS/Components/Bottom Sheet/BottomSheetPassthroughView.swift diff --git a/ios/FluentUI/Bottom Sheet/BottomSheetTokenSet.swift b/Sources/FluentUI_iOS/Components/Bottom Sheet/BottomSheetTokenSet.swift similarity index 100% rename from ios/FluentUI/Bottom Sheet/BottomSheetTokenSet.swift rename to Sources/FluentUI_iOS/Components/Bottom Sheet/BottomSheetTokenSet.swift diff --git a/ios/FluentUI/Bottom Sheet/ContentHeightResolutionContext.swift b/Sources/FluentUI_iOS/Components/Bottom Sheet/ContentHeightResolutionContext.swift similarity index 100% rename from ios/FluentUI/Bottom Sheet/ContentHeightResolutionContext.swift rename to Sources/FluentUI_iOS/Components/Bottom Sheet/ContentHeightResolutionContext.swift diff --git a/ios/FluentUI/Button/Button.swift b/Sources/FluentUI_iOS/Components/Button/Button.swift similarity index 99% rename from ios/FluentUI/Button/Button.swift rename to Sources/FluentUI_iOS/Components/Button/Button.swift index fb84110133..5f8094d7ae 100644 --- a/ios/FluentUI/Button/Button.swift +++ b/Sources/FluentUI_iOS/Components/Button/Button.swift @@ -10,7 +10,7 @@ import UIKit /// By default, `titleLabel`'s `adjustsFontForContentSizeCategory` is set to true for non-floating buttons to automatically update its font when device's content size category changes @IBDesignable @objc(MSFButton) -open class Button: UIButton, Shadowable, TokenizedControlInternal { +open class Button: UIButton, Shadowable, TokenizedControl { @objc open var style: ButtonStyle = .outlineAccent { didSet { if style != oldValue { diff --git a/ios/FluentUI/Button/ButtonTokenSet.swift b/Sources/FluentUI_iOS/Components/Button/ButtonTokenSet.swift similarity index 99% rename from ios/FluentUI/Button/ButtonTokenSet.swift rename to Sources/FluentUI_iOS/Components/Button/ButtonTokenSet.swift index 10bb01b61f..b49cf8474d 100644 --- a/ios/FluentUI/Button/ButtonTokenSet.swift +++ b/Sources/FluentUI_iOS/Components/Button/ButtonTokenSet.swift @@ -233,7 +233,7 @@ public class ButtonTokenSet: ControlTokenSet { } case .cornerRadius: return .float { - if Compatibility.isDeviceIdiomVision() { + if style().isFloating || Compatibility.isDeviceIdiomVision() { return ButtonTokenSet.minContainerHeight(style: style(), size: size()) / 2 } switch size() { diff --git a/ios/FluentUI/Button/FluentButtonStyle.swift b/Sources/FluentUI_iOS/Components/Button/FluentButtonStyle.swift similarity index 79% rename from ios/FluentUI/Button/FluentButtonStyle.swift rename to Sources/FluentUI_iOS/Components/Button/FluentButtonStyle.swift index b55a4d4446..34b72a398d 100644 --- a/ios/FluentUI/Button/FluentButtonStyle.swift +++ b/Sources/FluentUI_iOS/Components/Button/FluentButtonStyle.swift @@ -6,7 +6,7 @@ import SwiftUI import UIKit -/// ButtonStyle which configures the Button View according to its state and design tokens. +/// `ButtonStyle` which configures the `Button` according to its state and design tokens. public struct FluentButtonStyle: SwiftUI.ButtonStyle { public init(style: ButtonStyle) { self.style = style @@ -16,10 +16,10 @@ public struct FluentButtonStyle: SwiftUI.ButtonStyle { let isPressed = configuration.isPressed let isDisabled = !isEnabled let isFocused = isFocused - let isFloatingStyle = style.isFloating let size = size let tokenSet = ButtonTokenSet(style: { style }, size: { size }) + tokenSet.replaceAllOverrides(with: tokenOverrides) tokenSet.update(fluentTheme) let cornerRadius = tokenSet[.cornerRadius].float @@ -44,27 +44,23 @@ public struct FluentButtonStyle: SwiftUI.ButtonStyle { } @ViewBuilder var backgroundView: some View { - if isFloatingStyle { - backgroundColor.clipShape(Capsule()) - } else { + if backgroundColor != Color(.clear) { backgroundColor.clipShape(RoundedRectangle(cornerRadius: cornerRadius)) } } @ViewBuilder var overlayView: some View { if borderColor != Color(.clear) { - if isFloatingStyle { - Capsule() - .stroke(style: .init(lineWidth: tokenSet[.borderWidth].float)) - .foregroundStyle(borderColor) - } else { - RoundedRectangle(cornerRadius: cornerRadius, style: .continuous) - .stroke(style: .init(lineWidth: tokenSet[.borderWidth].float)) - .foregroundStyle(borderColor) - } + contentShape + .stroke(style: .init(lineWidth: tokenSet[.borderWidth].float)) + .foregroundStyle(borderColor) } } + @ViewBuilder var contentShape: some Shape { + RoundedRectangle(cornerRadius: cornerRadius, style: .continuous) + } + return configuration.label .font(Font(tokenSet[.titleFont].uiFont)) .foregroundStyle(foregroundColor) @@ -72,7 +68,8 @@ public struct FluentButtonStyle: SwiftUI.ButtonStyle { .frame(minHeight: ButtonTokenSet.minContainerHeight(style: style, size: size)) .background(backgroundView) .overlay { overlayView } - .applyShadow(shadowInfo: shadowInfo) + .applyFluentShadow(shadowInfo: shadowInfo) + .contentShape(contentShape) .pointerInteraction(isEnabled) } @@ -108,4 +105,13 @@ public struct FluentButtonStyle: SwiftUI.ButtonStyle { trailing: style.isFloating ? fabAlternativePadding : horizontalPadding ) } + + private var tokenOverrides: [ButtonToken: ControlTokenValue]? +} + +public extension FluentButtonStyle { + /// Provide override values for various `ButtonToken` values. + mutating func overrideTokens(_ overrides: [ButtonToken: ControlTokenValue]) { + tokenOverrides = overrides + } } diff --git a/Sources/FluentUI_iOS/Components/Button/FluentButtonToggleStyle.swift b/Sources/FluentUI_iOS/Components/Button/FluentButtonToggleStyle.swift new file mode 100644 index 0000000000..e95b5b508d --- /dev/null +++ b/Sources/FluentUI_iOS/Components/Button/FluentButtonToggleStyle.swift @@ -0,0 +1,70 @@ +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// + +import SwiftUI + +/// `ToggleStyle` which configures the `Toggle` according to its state and design tokens. +public struct FluentButtonToggleStyle: ToggleStyle { + public init() {} + + @Environment(\.fluentTheme) private var fluentTheme: FluentTheme + + public func makeBody(configuration: Configuration) -> some View { + SwiftUI.Button(action: { + configuration.isOn.toggle() + }, label: { + configuration.label + }) + .buttonStyle(configuration.isOn ? buttonStyleOn : buttonStyle) + } + + private var buttonStyle: FluentButtonStyle { + var style = FluentButtonStyle(style: .transparentNeutral) + style.overrideTokens(buttonTokens) + return style + } + + private var buttonStyleOn: FluentButtonStyle { + var style = FluentButtonStyle(style: .subtle) + style.overrideTokens(buttonOnTokens) + return style + } + + private var buttonTokens: [ButtonToken: ControlTokenValue] { + var tokens: [ButtonToken: ControlTokenValue] = [ + .cornerRadius: .float { GlobalTokens.corner(.radius40) } + ] + + if let tokenOverrides = tokenOverrides { + tokens = tokens.merging(tokenOverrides) { (_, new) in new } + } + + return tokens + } + + private var buttonOnTokens: [ButtonToken: ControlTokenValue] { + let backgroundColor = fluentTheme.swiftUIColor(.brandBackgroundTint) + var tokens: [ButtonToken: ControlTokenValue] = buttonTokens.merging([ + .backgroundColor: .color { backgroundColor }, + .backgroundPressedColor: .color { backgroundColor }, + .backgroundFocusedColor: .color { backgroundColor } + ]) { (_, new) in new } + + if let tokenOverrides = tokenOverrides { + tokens = tokens.merging(tokenOverrides) { (_, new) in new } + } + + return tokens + } + + private var tokenOverrides: [ButtonToken: ControlTokenValue]? +} + +public extension FluentButtonToggleStyle { + /// Provide override values for various `ButtonToken` values. + mutating func overrideTokens(_ overrides: [ButtonToken: ControlTokenValue]) { + tokenOverrides = overrides + } +} diff --git a/ios/FluentUI/Calendar/AccessibilityContainerView.swift b/Sources/FluentUI_iOS/Components/Calendar/AccessibilityContainerView.swift similarity index 100% rename from ios/FluentUI/Calendar/AccessibilityContainerView.swift rename to Sources/FluentUI_iOS/Components/Calendar/AccessibilityContainerView.swift diff --git a/ios/FluentUI/Calendar/AccessibleViewDelegate.swift b/Sources/FluentUI_iOS/Components/Calendar/AccessibleViewDelegate.swift similarity index 100% rename from ios/FluentUI/Calendar/AccessibleViewDelegate.swift rename to Sources/FluentUI_iOS/Components/Calendar/AccessibleViewDelegate.swift diff --git a/ios/FluentUI/Calendar/Calendar+Extensions.swift b/Sources/FluentUI_iOS/Components/Calendar/Calendar+Extensions.swift similarity index 100% rename from ios/FluentUI/Calendar/Calendar+Extensions.swift rename to Sources/FluentUI_iOS/Components/Calendar/Calendar+Extensions.swift diff --git a/ios/FluentUI/Calendar/CalendarConfiguration.swift b/Sources/FluentUI_iOS/Components/Calendar/CalendarConfiguration.swift similarity index 100% rename from ios/FluentUI/Calendar/CalendarConfiguration.swift rename to Sources/FluentUI_iOS/Components/Calendar/CalendarConfiguration.swift diff --git a/ios/FluentUI/Calendar/CalendarView.swift b/Sources/FluentUI_iOS/Components/Calendar/CalendarView.swift similarity index 100% rename from ios/FluentUI/Calendar/CalendarView.swift rename to Sources/FluentUI_iOS/Components/Calendar/CalendarView.swift diff --git a/ios/FluentUI/Calendar/CalendarViewDataSource.swift b/Sources/FluentUI_iOS/Components/Calendar/CalendarViewDataSource.swift similarity index 100% rename from ios/FluentUI/Calendar/CalendarViewDataSource.swift rename to Sources/FluentUI_iOS/Components/Calendar/CalendarViewDataSource.swift diff --git a/ios/FluentUI/Calendar/CalendarViewLayout.swift b/Sources/FluentUI_iOS/Components/Calendar/CalendarViewLayout.swift similarity index 100% rename from ios/FluentUI/Calendar/CalendarViewLayout.swift rename to Sources/FluentUI_iOS/Components/Calendar/CalendarViewLayout.swift diff --git a/ios/FluentUI/Calendar/Views/CalendarViewDayCell.swift b/Sources/FluentUI_iOS/Components/Calendar/Views/CalendarViewDayCell.swift similarity index 99% rename from ios/FluentUI/Calendar/Views/CalendarViewDayCell.swift rename to Sources/FluentUI_iOS/Components/Calendar/Views/CalendarViewDayCell.swift index 6621814609..788098241f 100644 --- a/ios/FluentUI/Calendar/Views/CalendarViewDayCell.swift +++ b/Sources/FluentUI_iOS/Components/Calendar/Views/CalendarViewDayCell.swift @@ -50,7 +50,7 @@ let calendarViewDayCellVisualStateTransitionDuration: TimeInterval = 0.3 // MARK: - CalendarViewDayCell -class CalendarViewDayCell: UICollectionViewCell, TokenizedControlInternal { +class CalendarViewDayCell: UICollectionViewCell, TokenizedControl { struct Constants { static let borderWidth: CGFloat = 0.5 static let dotDiameter: CGFloat = 6.0 diff --git a/ios/FluentUI/Calendar/Views/CalendarViewDayMonthCell.swift b/Sources/FluentUI_iOS/Components/Calendar/Views/CalendarViewDayMonthCell.swift similarity index 100% rename from ios/FluentUI/Calendar/Views/CalendarViewDayMonthCell.swift rename to Sources/FluentUI_iOS/Components/Calendar/Views/CalendarViewDayMonthCell.swift diff --git a/ios/FluentUI/Calendar/Views/CalendarViewDayMonthYearCell.swift b/Sources/FluentUI_iOS/Components/Calendar/Views/CalendarViewDayMonthYearCell.swift similarity index 100% rename from ios/FluentUI/Calendar/Views/CalendarViewDayMonthYearCell.swift rename to Sources/FluentUI_iOS/Components/Calendar/Views/CalendarViewDayMonthYearCell.swift diff --git a/ios/FluentUI/Calendar/Views/CalendarViewDayTodayCell.swift b/Sources/FluentUI_iOS/Components/Calendar/Views/CalendarViewDayTodayCell.swift similarity index 100% rename from ios/FluentUI/Calendar/Views/CalendarViewDayTodayCell.swift rename to Sources/FluentUI_iOS/Components/Calendar/Views/CalendarViewDayTodayCell.swift diff --git a/ios/FluentUI/Calendar/Views/CalendarViewMonthBannerView.swift b/Sources/FluentUI_iOS/Components/Calendar/Views/CalendarViewMonthBannerView.swift similarity index 100% rename from ios/FluentUI/Calendar/Views/CalendarViewMonthBannerView.swift rename to Sources/FluentUI_iOS/Components/Calendar/Views/CalendarViewMonthBannerView.swift diff --git a/ios/FluentUI/Calendar/Views/CalendarViewWeekdayHeadingView.swift b/Sources/FluentUI_iOS/Components/Calendar/Views/CalendarViewWeekdayHeadingView.swift similarity index 100% rename from ios/FluentUI/Calendar/Views/CalendarViewWeekdayHeadingView.swift rename to Sources/FluentUI_iOS/Components/Calendar/Views/CalendarViewWeekdayHeadingView.swift diff --git a/ios/FluentUI/Card Nudge/CardNudge.swift b/Sources/FluentUI_iOS/Components/Card Nudge/CardNudge.swift similarity index 100% rename from ios/FluentUI/Card Nudge/CardNudge.swift rename to Sources/FluentUI_iOS/Components/Card Nudge/CardNudge.swift diff --git a/ios/FluentUI/Card Nudge/CardNudgeModifiers.swift b/Sources/FluentUI_iOS/Components/Card Nudge/CardNudgeModifiers.swift similarity index 100% rename from ios/FluentUI/Card Nudge/CardNudgeModifiers.swift rename to Sources/FluentUI_iOS/Components/Card Nudge/CardNudgeModifiers.swift diff --git a/ios/FluentUI/Card Nudge/CardNudgeTokenSet.swift b/Sources/FluentUI_iOS/Components/Card Nudge/CardNudgeTokenSet.swift similarity index 100% rename from ios/FluentUI/Card Nudge/CardNudgeTokenSet.swift rename to Sources/FluentUI_iOS/Components/Card Nudge/CardNudgeTokenSet.swift diff --git a/ios/FluentUI/Card Nudge/MSFCardNudge.swift b/Sources/FluentUI_iOS/Components/Card Nudge/MSFCardNudge.swift similarity index 100% rename from ios/FluentUI/Card Nudge/MSFCardNudge.swift rename to Sources/FluentUI_iOS/Components/Card Nudge/MSFCardNudge.swift diff --git a/ios/FluentUI/Card/CardView.swift b/Sources/FluentUI_iOS/Components/Card/CardView.swift similarity index 99% rename from ios/FluentUI/Card/CardView.swift rename to Sources/FluentUI_iOS/Components/Card/CardView.swift index d39c8ad54b..95f2fe2f88 100644 --- a/ios/FluentUI/Card/CardView.swift +++ b/Sources/FluentUI_iOS/Components/Card/CardView.swift @@ -151,7 +151,7 @@ public enum CardSize: Int, CaseIterable { Conform to the `CardDelegate` in order to provide a handler for the card tap event */ @objc(MSFCardView) -open class CardView: UIView, Shadowable, TokenizedControlInternal { +open class CardView: UIView, Shadowable, TokenizedControl { /// Delegate to handle user interaction with the CardView @objc public weak var delegate: CardDelegate? diff --git a/ios/FluentUI/Command Bar/CommandBar.swift b/Sources/FluentUI_iOS/Components/Command Bar/CommandBar.swift similarity index 99% rename from ios/FluentUI/Command Bar/CommandBar.swift rename to Sources/FluentUI_iOS/Components/Command Bar/CommandBar.swift index 6b598f7237..7e3cc3f449 100644 --- a/ios/FluentUI/Command Bar/CommandBar.swift +++ b/Sources/FluentUI_iOS/Components/Command Bar/CommandBar.swift @@ -18,7 +18,7 @@ public protocol CommandBarDelegate: AnyObject { Provide `itemGroups` in `init` to set the buttons in the CommandBar. Optional `leadingItemGroups` and `trailingItemGroups` add buttons in leading and trailing positions. Each `CommandBarItem` will be represented as a button. */ @objc(MSFCommandBar) -public class CommandBar: UIView, TokenizedControlInternal { +public class CommandBar: UIView, TokenizedControl { // Hierarchy: // // isScrollable = true diff --git a/ios/FluentUI/Command Bar/CommandBarButton.swift b/Sources/FluentUI_iOS/Components/Command Bar/CommandBarButton.swift similarity index 100% rename from ios/FluentUI/Command Bar/CommandBarButton.swift rename to Sources/FluentUI_iOS/Components/Command Bar/CommandBarButton.swift diff --git a/ios/FluentUI/Command Bar/CommandBarButtonGroupView.swift b/Sources/FluentUI_iOS/Components/Command Bar/CommandBarButtonGroupView.swift similarity index 100% rename from ios/FluentUI/Command Bar/CommandBarButtonGroupView.swift rename to Sources/FluentUI_iOS/Components/Command Bar/CommandBarButtonGroupView.swift diff --git a/ios/FluentUI/Command Bar/CommandBarCommandGroupsView.swift b/Sources/FluentUI_iOS/Components/Command Bar/CommandBarCommandGroupsView.swift similarity index 100% rename from ios/FluentUI/Command Bar/CommandBarCommandGroupsView.swift rename to Sources/FluentUI_iOS/Components/Command Bar/CommandBarCommandGroupsView.swift diff --git a/ios/FluentUI/Command Bar/CommandBarItem.swift b/Sources/FluentUI_iOS/Components/Command Bar/CommandBarItem.swift similarity index 100% rename from ios/FluentUI/Command Bar/CommandBarItem.swift rename to Sources/FluentUI_iOS/Components/Command Bar/CommandBarItem.swift diff --git a/ios/FluentUI/Command Bar/CommandBarTokenSet.swift b/Sources/FluentUI_iOS/Components/Command Bar/CommandBarTokenSet.swift similarity index 100% rename from ios/FluentUI/Command Bar/CommandBarTokenSet.swift rename to Sources/FluentUI_iOS/Components/Command Bar/CommandBarTokenSet.swift diff --git a/ios/FluentUI/Date Time Pickers/Date Picker/DatePickerController.swift b/Sources/FluentUI_iOS/Components/Date Time Pickers/Date Picker/DatePickerController.swift similarity index 100% rename from ios/FluentUI/Date Time Pickers/Date Picker/DatePickerController.swift rename to Sources/FluentUI_iOS/Components/Date Time Pickers/Date Picker/DatePickerController.swift diff --git a/ios/FluentUI/Date Time Pickers/Date Picker/DatePickerSelectionManager.swift b/Sources/FluentUI_iOS/Components/Date Time Pickers/Date Picker/DatePickerSelectionManager.swift similarity index 100% rename from ios/FluentUI/Date Time Pickers/Date Picker/DatePickerSelectionManager.swift rename to Sources/FluentUI_iOS/Components/Date Time Pickers/Date Picker/DatePickerSelectionManager.swift diff --git a/ios/FluentUI/Date Time Pickers/Date Time Picker/DateTimePickerController.swift b/Sources/FluentUI_iOS/Components/Date Time Pickers/Date Time Picker/DateTimePickerController.swift similarity index 100% rename from ios/FluentUI/Date Time Pickers/Date Time Picker/DateTimePickerController.swift rename to Sources/FluentUI_iOS/Components/Date Time Pickers/Date Time Picker/DateTimePickerController.swift diff --git a/ios/FluentUI/Date Time Pickers/Date Time Picker/Views/DateTimePickerView.swift b/Sources/FluentUI_iOS/Components/Date Time Pickers/Date Time Picker/Views/DateTimePickerView.swift similarity index 99% rename from ios/FluentUI/Date Time Pickers/Date Time Picker/Views/DateTimePickerView.swift rename to Sources/FluentUI_iOS/Components/Date Time Pickers/Date Time Picker/Views/DateTimePickerView.swift index 84b813d365..168fecf0a0 100644 --- a/ios/FluentUI/Date Time Pickers/Date Time Picker/Views/DateTimePickerView.swift +++ b/Sources/FluentUI_iOS/Components/Date Time Pickers/Date Time Picker/Views/DateTimePickerView.swift @@ -59,7 +59,7 @@ class DateTimePickerView: UIControl { } private func updateGradientLayerColors(gradientLayer: CAGradientLayer) { - let backgroundColor = fluentTheme.color(.background2) + let backgroundColor: UIColor = fluentTheme.color(.background2) let transparentColor = backgroundColor.withAlphaComponent(0) gradientLayer.colors = [backgroundColor.cgColor, transparentColor.cgColor, transparentColor.cgColor, backgroundColor.cgColor] } diff --git a/ios/FluentUI/Date Time Pickers/Date Time Picker/Views/DateTimePickerViewComponent.swift b/Sources/FluentUI_iOS/Components/Date Time Pickers/Date Time Picker/Views/DateTimePickerViewComponent.swift similarity index 100% rename from ios/FluentUI/Date Time Pickers/Date Time Picker/Views/DateTimePickerViewComponent.swift rename to Sources/FluentUI_iOS/Components/Date Time Pickers/Date Time Picker/Views/DateTimePickerViewComponent.swift diff --git a/ios/FluentUI/Date Time Pickers/Date Time Picker/Views/DateTimePickerViewComponentCell.swift b/Sources/FluentUI_iOS/Components/Date Time Pickers/Date Time Picker/Views/DateTimePickerViewComponentCell.swift similarity index 99% rename from ios/FluentUI/Date Time Pickers/Date Time Picker/Views/DateTimePickerViewComponentCell.swift rename to Sources/FluentUI_iOS/Components/Date Time Pickers/Date Time Picker/Views/DateTimePickerViewComponentCell.swift index f4f030b750..db6625623c 100644 --- a/ios/FluentUI/Date Time Pickers/Date Time Picker/Views/DateTimePickerViewComponentCell.swift +++ b/Sources/FluentUI_iOS/Components/Date Time Pickers/Date Time Picker/Views/DateTimePickerViewComponentCell.swift @@ -8,7 +8,7 @@ import UIKit // MARK: - DateTimePickerViewComponentCell /// TableViewCell representing the cell of component view (should be used only by DateTimePickerViewComponent and not instantiated on its own) -class DateTimePickerViewComponentCell: UITableViewCell, TokenizedControlInternal { +class DateTimePickerViewComponentCell: UITableViewCell, TokenizedControl { private struct Constants { static let baseHeight: CGFloat = 45 static let verticalPadding: CGFloat = 12 diff --git a/ios/FluentUI/Date Time Pickers/Date Time Picker/Views/DateTimePickerViewComponentTableView.swift b/Sources/FluentUI_iOS/Components/Date Time Pickers/Date Time Picker/Views/DateTimePickerViewComponentTableView.swift similarity index 100% rename from ios/FluentUI/Date Time Pickers/Date Time Picker/Views/DateTimePickerViewComponentTableView.swift rename to Sources/FluentUI_iOS/Components/Date Time Pickers/Date Time Picker/Views/DateTimePickerViewComponentTableView.swift diff --git a/ios/FluentUI/Date Time Pickers/Date Time Picker/Views/DateTimePickerViewDataSource.swift b/Sources/FluentUI_iOS/Components/Date Time Pickers/Date Time Picker/Views/DateTimePickerViewDataSource.swift similarity index 100% rename from ios/FluentUI/Date Time Pickers/Date Time Picker/Views/DateTimePickerViewDataSource.swift rename to Sources/FluentUI_iOS/Components/Date Time Pickers/Date Time Picker/Views/DateTimePickerViewDataSource.swift diff --git a/ios/FluentUI/Date Time Pickers/Date Time Picker/Views/DateTimePickerViewLayout.swift b/Sources/FluentUI_iOS/Components/Date Time Pickers/Date Time Picker/Views/DateTimePickerViewLayout.swift similarity index 100% rename from ios/FluentUI/Date Time Pickers/Date Time Picker/Views/DateTimePickerViewLayout.swift rename to Sources/FluentUI_iOS/Components/Date Time Pickers/Date Time Picker/Views/DateTimePickerViewLayout.swift diff --git a/ios/FluentUI/Date Time Pickers/Date+Extensions.swift b/Sources/FluentUI_iOS/Components/Date Time Pickers/Date+Extensions.swift similarity index 100% rename from ios/FluentUI/Date Time Pickers/Date+Extensions.swift rename to Sources/FluentUI_iOS/Components/Date Time Pickers/Date+Extensions.swift diff --git a/ios/FluentUI/Date Time Pickers/DateComponents+Extensions.swift b/Sources/FluentUI_iOS/Components/Date Time Pickers/DateComponents+Extensions.swift similarity index 100% rename from ios/FluentUI/Date Time Pickers/DateComponents+Extensions.swift rename to Sources/FluentUI_iOS/Components/Date Time Pickers/DateComponents+Extensions.swift diff --git a/ios/FluentUI/Date Time Pickers/DateTimePicker.swift b/Sources/FluentUI_iOS/Components/Date Time Pickers/DateTimePicker.swift similarity index 100% rename from ios/FluentUI/Date Time Pickers/DateTimePicker.swift rename to Sources/FluentUI_iOS/Components/Date Time Pickers/DateTimePicker.swift diff --git a/ios/FluentUI/Date Time Pickers/DayOfMonth.swift b/Sources/FluentUI_iOS/Components/Date Time Pickers/DayOfMonth.swift similarity index 100% rename from ios/FluentUI/Date Time Pickers/DayOfMonth.swift rename to Sources/FluentUI_iOS/Components/Date Time Pickers/DayOfMonth.swift diff --git a/ios/FluentUI/Date Time Pickers/GenericDateTimePicker.swift b/Sources/FluentUI_iOS/Components/Date Time Pickers/GenericDateTimePicker.swift similarity index 100% rename from ios/FluentUI/Date Time Pickers/GenericDateTimePicker.swift rename to Sources/FluentUI_iOS/Components/Date Time Pickers/GenericDateTimePicker.swift diff --git a/ios/FluentUI/Date Time Pickers/String+Date.swift b/Sources/FluentUI_iOS/Components/Date Time Pickers/String+Date.swift similarity index 100% rename from ios/FluentUI/Date Time Pickers/String+Date.swift rename to Sources/FluentUI_iOS/Components/Date Time Pickers/String+Date.swift diff --git a/ios/FluentUI/DotView/DotView.swift b/Sources/FluentUI_iOS/Components/DotView/DotView.swift similarity index 100% rename from ios/FluentUI/DotView/DotView.swift rename to Sources/FluentUI_iOS/Components/DotView/DotView.swift diff --git a/ios/FluentUI/Drawer/CALayer+Extensions.swift b/Sources/FluentUI_iOS/Components/Drawer/CALayer+Extensions.swift similarity index 100% rename from ios/FluentUI/Drawer/CALayer+Extensions.swift rename to Sources/FluentUI_iOS/Components/Drawer/CALayer+Extensions.swift diff --git a/ios/FluentUI/Drawer/DrawerController.swift b/Sources/FluentUI_iOS/Components/Drawer/DrawerController.swift similarity index 96% rename from ios/FluentUI/Drawer/DrawerController.swift rename to Sources/FluentUI_iOS/Components/Drawer/DrawerController.swift index fbc93401aa..fa2c008358 100644 --- a/ios/FluentUI/Drawer/DrawerController.swift +++ b/Sources/FluentUI_iOS/Components/Drawer/DrawerController.swift @@ -97,7 +97,7 @@ public protocol DrawerControllerDelegate: AnyObject { */ @objc(MSFDrawerController) -open class DrawerController: UIViewController, TokenizedControlInternal { +open class DrawerController: UIViewController, TokenizedControl { /// DrawerController colors with obj-c support @objc public static func drawerBackgroundColor(fluentTheme: FluentTheme?) -> UIColor { let theme = fluentTheme ?? .shared @@ -391,6 +391,7 @@ open class DrawerController: UIViewController, TokenizedControlInternal { private let sourceView: UIView? private let sourceRect: CGRect? private let barButtonItem: UIBarButtonItem? + private let sourceItem: (any UIPopoverPresentationControllerSourceItem)? private var isPreferredContentSizeBeingChangedInternally: Bool = false private var normalDrawerHeight: CGFloat = 0 @@ -426,6 +427,7 @@ open class DrawerController: UIViewController, TokenizedControlInternal { self.sourceView = sourceView self.sourceRect = sourceRect self.barButtonItem = nil + self.sourceItem = nil self.presentationOrigin = presentationOrigin == -1 ? nil : presentationOrigin self.presentationDirection = presentationDirection self.preferredMaximumExpansionHeight = preferredMaximumHeight @@ -446,6 +448,28 @@ open class DrawerController: UIViewController, TokenizedControlInternal { self.sourceView = nil self.sourceRect = nil self.barButtonItem = barButtonItem + self.sourceItem = nil + self.presentationOrigin = presentationOrigin == -1 ? nil : presentationOrigin + self.presentationDirection = presentationDirection + self.preferredMaximumExpansionHeight = preferredMaximumHeight + + super.init(nibName: nil, bundle: nil) + + initialize() + } + + /** + Initializes `DrawerController` to be presented as a popover from `sourceItem` on iPad and as a slideover on iPhone/iPad. + + - Parameter sourceItem: The item(conforming to `UIPopoverPresentationControllerSourceItem`) on which to anchor the popover. + - Parameter presentationOrigin: The offset (in screen coordinates) from which to show a slideover. If not provided it will be calculated automatically: bottom of navigation bar for `.down` presentation and edge of the screen for other presentations. + - Parameter presentationDirection: The direction of slideover presentation. + */ + @objc public init(sourceItem: any UIPopoverPresentationControllerSourceItem, presentationOrigin: CGFloat = -1, presentationDirection: DrawerPresentationDirection, preferredMaximumHeight: CGFloat = -1) { + self.sourceView = nil + self.sourceRect = nil + self.barButtonItem = nil + self.sourceItem = sourceItem self.presentationOrigin = presentationOrigin == -1 ? nil : presentationOrigin self.presentationDirection = presentationDirection self.preferredMaximumExpansionHeight = preferredMaximumHeight @@ -1016,6 +1040,8 @@ extension DrawerController: UIViewControllerTransitioningDelegate { if let sourceRect = sourceRect { presentationController.sourceRect = sourceRect } + } else if let sourceItem = sourceItem { + presentationController.sourceItem = sourceItem } else if let barButtonItem = barButtonItem { presentationController.barButtonItem = barButtonItem } else { diff --git a/ios/FluentUI/Drawer/DrawerPresentationController.swift b/Sources/FluentUI_iOS/Components/Drawer/DrawerPresentationController.swift similarity index 100% rename from ios/FluentUI/Drawer/DrawerPresentationController.swift rename to Sources/FluentUI_iOS/Components/Drawer/DrawerPresentationController.swift diff --git a/ios/FluentUI/Drawer/DrawerShadowView.swift b/Sources/FluentUI_iOS/Components/Drawer/DrawerShadowView.swift similarity index 100% rename from ios/FluentUI/Drawer/DrawerShadowView.swift rename to Sources/FluentUI_iOS/Components/Drawer/DrawerShadowView.swift diff --git a/ios/FluentUI/Drawer/DrawerTokenSet.swift b/Sources/FluentUI_iOS/Components/Drawer/DrawerTokenSet.swift similarity index 100% rename from ios/FluentUI/Drawer/DrawerTokenSet.swift rename to Sources/FluentUI_iOS/Components/Drawer/DrawerTokenSet.swift diff --git a/ios/FluentUI/Drawer/DrawerTransitionAnimator.swift b/Sources/FluentUI_iOS/Components/Drawer/DrawerTransitionAnimator.swift similarity index 100% rename from ios/FluentUI/Drawer/DrawerTransitionAnimator.swift rename to Sources/FluentUI_iOS/Components/Drawer/DrawerTransitionAnimator.swift diff --git a/ios/FluentUI/EasyTapButton/EasyTapButton.swift b/Sources/FluentUI_iOS/Components/EasyTapButton/EasyTapButton.swift similarity index 100% rename from ios/FluentUI/EasyTapButton/EasyTapButton.swift rename to Sources/FluentUI_iOS/Components/EasyTapButton/EasyTapButton.swift diff --git a/ios/FluentUI/HUD/HUD.resources.xcfilelist b/Sources/FluentUI_iOS/Components/HUD/HUD.resources.xcfilelist similarity index 100% rename from ios/FluentUI/HUD/HUD.resources.xcfilelist rename to Sources/FluentUI_iOS/Components/HUD/HUD.resources.xcfilelist diff --git a/ios/FluentUI/HUD/HUD.swift b/Sources/FluentUI_iOS/Components/HUD/HUD.swift similarity index 100% rename from ios/FluentUI/HUD/HUD.swift rename to Sources/FluentUI_iOS/Components/HUD/HUD.swift diff --git a/ios/FluentUI/HUD/HUDModifiers.swift b/Sources/FluentUI_iOS/Components/HUD/HUDModifiers.swift similarity index 100% rename from ios/FluentUI/HUD/HUDModifiers.swift rename to Sources/FluentUI_iOS/Components/HUD/HUDModifiers.swift diff --git a/ios/FluentUI/HUD/HeadsUpDisplay.swift b/Sources/FluentUI_iOS/Components/HUD/HeadsUpDisplay.swift similarity index 98% rename from ios/FluentUI/HUD/HeadsUpDisplay.swift rename to Sources/FluentUI_iOS/Components/HUD/HeadsUpDisplay.swift index 599492edbf..fb2d045060 100644 --- a/ios/FluentUI/HUD/HeadsUpDisplay.swift +++ b/Sources/FluentUI_iOS/Components/HUD/HeadsUpDisplay.swift @@ -79,6 +79,7 @@ public struct HeadsUpDisplay: View, TokenizedControlView { Spacer() .frame(height: verticalPadding) Text(label) + .minimumScaleFactor(HeadsUpDisplayTokenSet.labelMinimumScaleFactor) .foregroundColor(Color(tokenSet[.labelColor].uiColor)) .lineLimit(2) .multilineTextAlignment(.center) diff --git a/ios/FluentUI/HUD/HeadsUpDisplayTokenSet.swift b/Sources/FluentUI_iOS/Components/HUD/HeadsUpDisplayTokenSet.swift similarity index 95% rename from ios/FluentUI/HUD/HeadsUpDisplayTokenSet.swift rename to Sources/FluentUI_iOS/Components/HUD/HeadsUpDisplayTokenSet.swift index 15fa1249d9..ddb272c425 100644 --- a/ios/FluentUI/HUD/HeadsUpDisplayTokenSet.swift +++ b/Sources/FluentUI_iOS/Components/HUD/HeadsUpDisplayTokenSet.swift @@ -76,4 +76,6 @@ extension HeadsUpDisplayTokenSet { /// The maximum value for the side of the squared background of the Heads-up display. static let maxSize: CGFloat = 192 + /// The minimum scale factor to use for the label when its text does not fit. + static let labelMinimumScaleFactor: CGFloat = 0.6 } diff --git a/ios/FluentUI/HUD/MSFHeadsUpDisplay.swift b/Sources/FluentUI_iOS/Components/HUD/MSFHeadsUpDisplay.swift similarity index 100% rename from ios/FluentUI/HUD/MSFHeadsUpDisplay.swift rename to Sources/FluentUI_iOS/Components/HUD/MSFHeadsUpDisplay.swift diff --git a/ios/FluentUI/IndeterminateProgressBar/IndeterminateProgressBar.swift b/Sources/FluentUI_iOS/Components/IndeterminateProgressBar/IndeterminateProgressBar.swift similarity index 100% rename from ios/FluentUI/IndeterminateProgressBar/IndeterminateProgressBar.swift rename to Sources/FluentUI_iOS/Components/IndeterminateProgressBar/IndeterminateProgressBar.swift diff --git a/ios/FluentUI/IndeterminateProgressBar/IndeterminateProgressBarModifiers.swift b/Sources/FluentUI_iOS/Components/IndeterminateProgressBar/IndeterminateProgressBarModifiers.swift similarity index 100% rename from ios/FluentUI/IndeterminateProgressBar/IndeterminateProgressBarModifiers.swift rename to Sources/FluentUI_iOS/Components/IndeterminateProgressBar/IndeterminateProgressBarModifiers.swift diff --git a/ios/FluentUI/IndeterminateProgressBar/IndeterminateProgressBarTokenSet.swift b/Sources/FluentUI_iOS/Components/IndeterminateProgressBar/IndeterminateProgressBarTokenSet.swift similarity index 100% rename from ios/FluentUI/IndeterminateProgressBar/IndeterminateProgressBarTokenSet.swift rename to Sources/FluentUI_iOS/Components/IndeterminateProgressBar/IndeterminateProgressBarTokenSet.swift diff --git a/ios/FluentUI/IndeterminateProgressBar/MSFIndeterminateProgressBar.swift b/Sources/FluentUI_iOS/Components/IndeterminateProgressBar/MSFIndeterminateProgressBar.swift similarity index 100% rename from ios/FluentUI/IndeterminateProgressBar/MSFIndeterminateProgressBar.swift rename to Sources/FluentUI_iOS/Components/IndeterminateProgressBar/MSFIndeterminateProgressBar.swift diff --git a/ios/FluentUI/Label/BadgeLabel.swift b/Sources/FluentUI_iOS/Components/Label/BadgeLabel.swift similarity index 96% rename from ios/FluentUI/Label/BadgeLabel.swift rename to Sources/FluentUI_iOS/Components/Label/BadgeLabel.swift index da14eea4fd..f556f6110a 100644 --- a/ios/FluentUI/Label/BadgeLabel.swift +++ b/Sources/FluentUI_iOS/Components/Label/BadgeLabel.swift @@ -7,7 +7,7 @@ import UIKit // MARK: BadgeLabel -class BadgeLabel: UILabel, TokenizedControlInternal { +class BadgeLabel: UILabel, TokenizedControl { var style: BadgeLabelStyle = .system { didSet { updateColors() diff --git a/ios/FluentUI/Label/BadgeLabelTokenSet.swift b/Sources/FluentUI_iOS/Components/Label/BadgeLabelTokenSet.swift similarity index 100% rename from ios/FluentUI/Label/BadgeLabelTokenSet.swift rename to Sources/FluentUI_iOS/Components/Label/BadgeLabelTokenSet.swift diff --git a/ios/FluentUI/Label/Label.swift b/Sources/FluentUI_iOS/Components/Label/Label.swift similarity index 87% rename from ios/FluentUI/Label/Label.swift rename to Sources/FluentUI_iOS/Components/Label/Label.swift index 7c6bacc313..911091c12a 100644 --- a/ios/FluentUI/Label/Label.swift +++ b/Sources/FluentUI_iOS/Components/Label/Label.swift @@ -9,7 +9,7 @@ import UIKit /// By default, `adjustsFontForContentSizeCategory` is set to true to automatically update its font when device's content size category changes @objc(MSFLabel) -open class Label: UILabel, TokenizedControlInternal { +open class Label: UILabel, TokenizedControl { private static let defaultColorForTheme: (FluentTheme) -> UIColor = TextColorStyle.regular.uiColor @objc open var colorStyle: TextColorStyle { @@ -23,16 +23,6 @@ open class Label: UILabel, TokenizedControlInternal { } } - @available(*, deprecated, renamed: "textStyle") - @objc open var style: AliasTokens.TypographyTokens { - get { - return AliasTokens.TypographyTokens(rawValue: textStyle.rawValue)! - } - set { - self.textStyle = FluentTheme.TypographyToken(rawValue: newValue.rawValue)! - } - } - @objc open var textStyle: FluentTheme.TypographyToken = .body1 { didSet { updateFont() @@ -96,14 +86,6 @@ open class Label: UILabel, TokenizedControlInternal { self.init(textStyle: .body1, colorStyle: .regular) } - @available(*, deprecated, renamed: "init(textStyle:colorStyle:)") - @objc public init(style: AliasTokens.TypographyTokens = .body1, colorStyle: TextColorStyle = .regular) { - super.init(frame: .zero) - self.style = style - self.colorStyle = colorStyle - initialize() - } - @objc public init(textStyle: FluentTheme.TypographyToken = .body1, colorStyle: TextColorStyle = .regular) { super.init(frame: .zero) self.textStyle = textStyle diff --git a/ios/FluentUI/Label/LabelTokenSet.swift b/Sources/FluentUI_iOS/Components/Label/LabelTokenSet.swift similarity index 98% rename from ios/FluentUI/Label/LabelTokenSet.swift rename to Sources/FluentUI_iOS/Components/Label/LabelTokenSet.swift index f07b434786..99466c609e 100644 --- a/ios/FluentUI/Label/LabelTokenSet.swift +++ b/Sources/FluentUI_iOS/Components/Label/LabelTokenSet.swift @@ -7,7 +7,7 @@ import UIKit // MARK: TextColorStyle -@objc (MSFTextColorStyle) +@objc(MSFTextColorStyle) public enum TextColorStyle: Int, CaseIterable { case regular case secondary diff --git a/Sources/FluentUI_iOS/Components/List/FluentList.swift b/Sources/FluentUI_iOS/Components/List/FluentList.swift new file mode 100644 index 0000000000..05fa9c2ebd --- /dev/null +++ b/Sources/FluentUI_iOS/Components/List/FluentList.swift @@ -0,0 +1,118 @@ +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// + +import SwiftUI + +/// Fluent specific list style enum +public enum FluentListStyle { + case plain + case insetGrouped + case inset +} + +/// This a wrapper around `SwiftUI.List` that has fluent style applied. It is intended to be used in conjunction with `FluentUI.FluentListSection` and `FluentUI.ListItem` +/// to provide a completely fluentized list, however, it can be used on it's own if desired. +/// +/// This component is a work in progress. Expect changes to be made to it on a somewhat regular basis. +public struct FluentList: View { + + // MARK: Initializer + + /// Creates a `FluentList` + /// - Parameters: + /// - content: content to show inside of the list. + public init(@ViewBuilder content: @escaping () -> ListContent) { + self.content = content + } + + public var body: some View { + @ViewBuilder + var list: some View { + List { + content() + .environment(\.listStyle, listStyle) + } + } + + @ViewBuilder + var styledList: some View { + switch listStyle { + case .inset: + list.listStyle(.inset) + case .insetGrouped: + list + .listStyle(.insetGrouped) + .scrollContentBackground(.hidden) + // TODO: Directly use `FluentList` token set instead of `ListItem` + .background(ListItem.listBackgroundColor(for: .grouped)) + .listStyling_iOS17() + case .plain: + list + .listStyle(.plain) + .scrollContentBackground(.hidden) + // TODO: Directly use `FluentList` token set instead of `ListItem` + .background(ListItem.listBackgroundColor(for: .plain)) + } + } + + return styledList + } + + /// Style to be used by the list + var listStyle: FluentListStyle = .plain + + // MARK: Private variables + + /// Content to render inside the list + private var content: () -> ListContent + + @Environment(\.fluentTheme) private var fluentTheme: FluentTheme +} + +// MARK: - Environment + +extension EnvironmentValues { + var listStyle: FluentListStyle { + get { + self[FluentListStyleKey.self] + } + set { + self[FluentListStyleKey.self] = newValue + } + } +} + +struct FluentListStyleKey: EnvironmentKey { + static var defaultValue: FluentListStyle { .plain } +} + +// MARK: - View + +extension View { + /// Abstracts away differences in pre-iOS 17 for list styling + /// + /// This function should be removed once we move to iOS 17 as a minimum target. + /// - Parameters: + /// - spacing: The amount of spacing between sections. + /// - minHeaderHeight: The minimum header height for sections in the list + /// - Returns: A view that has list section spacing applied if iOS 17 is available. + func listStyling_iOS17() -> some View { +#if os(visionOS) + // On visionOS, using #available and .environment crashes. + // As a workaround, move this to a separate ifdef + return self + .listSectionSpacing(GlobalTokens.spacing(.size160)) + .environment(\.defaultMinListHeaderHeight, GlobalTokens.spacing(.size320)) +#else + if #available(iOS 17, *) { + return self + .listSectionSpacing(GlobalTokens.spacing(.size160)) + .environment(\.defaultMinListHeaderHeight, GlobalTokens.spacing(.size320)) + } else { + return self + } +#endif // os(visionOS) + } +} diff --git a/Sources/FluentUI_iOS/Components/List/FluentListModifiers.swift b/Sources/FluentUI_iOS/Components/List/FluentListModifiers.swift new file mode 100644 index 0000000000..bad696318b --- /dev/null +++ b/Sources/FluentUI_iOS/Components/List/FluentListModifiers.swift @@ -0,0 +1,17 @@ +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// + +import SwiftUI + +public extension FluentList { + /// The list style type for the `FluentList`. + /// - Parameter listStyle: Type of style to display the list with. + /// - Returns: The modified `FluentList` with the style property set. + func fluentListStyle(_ listStyle: FluentListStyle) -> FluentList { + var list = self + list.listStyle = listStyle + return list + } +} diff --git a/Sources/FluentUI_iOS/Components/List/FluentListSection.swift b/Sources/FluentUI_iOS/Components/List/FluentListSection.swift new file mode 100644 index 0000000000..047f85252a --- /dev/null +++ b/Sources/FluentUI_iOS/Components/List/FluentListSection.swift @@ -0,0 +1,85 @@ +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// + +import SwiftUI + +/// This a wrapper around `SwiftUI.Section` that has fluent style applied. It is intended to be used in conjunction with `FluentUI.FluentList` and `FluentUI.ListItem` +/// to provide a completely fluentized list, however, it can be used on it's own if desired. +/// +/// This component is a work in progress. Expect changes to be made to it on a somewhat regular basis. +public struct FluentListSection: View { + + // MARK: Initializer + + /// Creates a `FluentListSection` + /// - Parameters: + /// - content: content to show inside of the section. + /// - header: content to show inside of the header. + /// - footer: content to show inside of the footer. + public init(@ViewBuilder content: @escaping () -> SectionContent, + @ViewBuilder header: @escaping () -> SectionHeaderContent, + @ViewBuilder footer: @escaping () -> SectionFooterContent) { + self.content = content + self.header = header + self.footer = footer + } + + public var body: some View { + @ViewBuilder + var sectionView: some View { + Section { + content() + } header: { + if let header = header { + header() + } + } footer: { + if let footer = footer { + footer() + } + } + } + return sectionView + } + + // MARK: Private variables + + /// Content to display in the body of the section + private var content: () -> SectionContent + + /// Content to display in the footer of the section + private var footer: (() -> SectionFooterContent)? + + /// Content to display in the header of the section + private var header: (() -> SectionHeaderContent)? + +} + +public extension FluentListSection where SectionHeaderContent == EmptyView, SectionFooterContent == EmptyView { + init(@ViewBuilder content: @escaping () -> SectionContent) { + self.content = content + } +} + +public extension FluentListSection where SectionFooterContent == EmptyView { + init(@ViewBuilder content: @escaping () -> SectionContent, @ViewBuilder header: @escaping () -> SectionHeaderContent) { + self.content = content + self.header = header + } +} + +public extension FluentListSection where SectionHeaderContent == EmptyView { + init(@ViewBuilder content: @escaping () -> SectionContent, @ViewBuilder footer: @escaping () -> SectionFooterContent) { + self.content = content + self.footer = footer + } +} + +public extension FluentListSection where SectionHeaderContent == FluentListSectionHeader, SectionFooterContent == EmptyView { + init(_ title: String, @ViewBuilder content: @escaping () -> SectionContent) { + self.content = content + self.header = { FluentListSectionHeader(title: title) } + } +} diff --git a/Sources/FluentUI_iOS/Components/List/FluentListSectionFooter.swift b/Sources/FluentUI_iOS/Components/List/FluentListSectionFooter.swift new file mode 100644 index 0000000000..00a446390b --- /dev/null +++ b/Sources/FluentUI_iOS/Components/List/FluentListSectionFooter.swift @@ -0,0 +1,30 @@ +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// + +import SwiftUI + +/// This component is a work in progress. Expect changes to be made to it on a somewhat regular basis. +/// +/// It is intended to be used in conjunction with `FluentUI.FluentListSection` and `FluentUI.ListItem` +public struct FluentListSectionFooter: View { + + // MARK: Initializer + + /// Creates a `FluentListSectionFooter` + /// - Parameters: + /// - description: description of the section to be shown in the footer. + public init(description: Description) { + self.description = description + } + + public var body: some View { + Text(description) + .textCase(nil) + } + + // MARK: Private variables + + private let description: Description +} diff --git a/Sources/FluentUI_iOS/Components/List/FluentListSectionHeader.swift b/Sources/FluentUI_iOS/Components/List/FluentListSectionHeader.swift new file mode 100644 index 0000000000..6d82a718e1 --- /dev/null +++ b/Sources/FluentUI_iOS/Components/List/FluentListSectionHeader.swift @@ -0,0 +1,59 @@ +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// + +import SwiftUI + +/// This component is a work in progress. Expect changes to be made to it on a somewhat regular basis. +/// +/// It is intended to be used in conjunction with `FluentUI.FluentListSection` and `FluentUI.ListItem` +public struct FluentListSectionHeader: View { + + // MARK: Initializer + + /// Creates a `FluentListSectionHeader` + /// - Parameters: + /// - title: title of the section to be shown in the header. + /// - trailingContent: content that appears on the trailing edge of the view. + public init(title: Title, + @ViewBuilder trailingContent: @escaping () -> TrailingContent) { + self.title = title + self.trailingContent = trailingContent + } + + public var body: some View { + @ViewBuilder var titleView: some View { + Text(title) + // By default uppercasing is applied, setting nil to not enforce casing + .textCase(nil) + } + + @ViewBuilder var contentView: some View { + if let trailingContent { + HStack { + titleView + Spacer(minLength: 0) + trailingContent() + } + } else { + titleView + } + } + + return contentView + } + + // MARK: Private variables + + private var trailingContent: (() -> TrailingContent)? + private let title: Title +} + +// MARK: Additional Initializers + +public extension FluentListSectionHeader where TrailingContent == EmptyView { + init(title: Title) { + self.title = title + } +} diff --git a/ios/FluentUI/List/ListActionItem.swift b/Sources/FluentUI_iOS/Components/List/ListActionItem.swift similarity index 100% rename from ios/FluentUI/List/ListActionItem.swift rename to Sources/FluentUI_iOS/Components/List/ListActionItem.swift diff --git a/ios/FluentUI/List/ListActionItemModifiers.swift b/Sources/FluentUI_iOS/Components/List/ListActionItemModifiers.swift similarity index 100% rename from ios/FluentUI/List/ListActionItemModifiers.swift rename to Sources/FluentUI_iOS/Components/List/ListActionItemModifiers.swift diff --git a/ios/FluentUI/List/ListItem.swift b/Sources/FluentUI_iOS/Components/List/ListItem.swift similarity index 53% rename from ios/FluentUI/List/ListItem.swift rename to Sources/FluentUI_iOS/Components/List/ListItem.swift index a8444899b7..bc9e37752b 100644 --- a/ios/FluentUI/List/ListItem.swift +++ b/Sources/FluentUI_iOS/Components/List/ListItem.swift @@ -9,6 +9,7 @@ public typealias ListItemAccessoryType = TableViewCellAccessoryType public typealias ListItemBackgroundStyleType = TableViewCellBackgroundStyleType public typealias ListItemLeadingContentSize = MSFTableViewCellCustomViewSize public typealias ListItemTokenSet = TableViewCellTokenSet +public typealias ListItemToken = TableViewCellToken /// View that represents an item in a List. public struct ListItem: View { - // MARK: Initializer + // MARK: Initializer - /// Creates a ListItem view - /// - Parameters: - /// - title: Text that appears as the first line of text - /// - subtitle: Text that appears as the second line of text - /// - footer: Text that appears as the third line of text - /// - leadingContent: The content that appears on the leading edge of the view - /// - trailingContent: The content that appears on the trailing edge of the view, next to the accessory type if provided + /// Creates a `ListItem` + /// - Parameters: + /// - title: Text that appears as the first line of text + /// - subtitle: Text that appears as the second line of text + /// - footer: Text that appears as the third line of text + /// - leadingContent: The content that appears on the leading edge of the view + /// - trailingContent: The content that appears on the trailing edge of the view, next to the accessory type if provided + /// - action: The action to be dispatched by tapping on the `ListItem` public init(title: Title, subtitle: Subtitle = String(), footer: Footer = String(), @ViewBuilder leadingContent: @escaping () -> LeadingContent, - @ViewBuilder trailingContent: @escaping () -> TrailingContent) { + @ViewBuilder trailingContent: @escaping () -> TrailingContent, + action: (() -> Void)? = nil) { self.title = title self.subtitle = subtitle self.footer = footer self.leadingContent = leadingContent self.trailingContent = trailingContent - let layoutType = ListItem.layoutType(subtitle: subtitle, footer: footer) - self.tokenSet = ListItemTokenSet(customViewSize: { layoutType.leadingContentSize }) + self.action = action } public var body: some View { + let tokenSet = ListItemTokenSet(customViewSize: { leadingContentSize }) + tokenSet.replaceAllOverrides(with: tokenOverrides) tokenSet.update(fluentTheme) @ViewBuilder - var labelStack: some View { - let titleView = Text(title) - .foregroundColor(Color(uiColor: tokenSet[.titleColor].uiColor)) - .font(Font(tokenSet[.titleFont].uiFont)) - .frame(minHeight: ListItemTokenSet.titleHeight) - .lineLimit(titleLineLimit) - .truncationMode(titleTruncationMode) - .accessibilityIdentifier(AccessibilityIdentifiers.title) + var titleView: some View { + Text(title) + .foregroundColor(Color(uiColor: tokenSet[.titleColor].uiColor)) + .font(Font(tokenSet[.titleFont].uiFont)) + .frame(minHeight: ListItemTokenSet.titleHeight) + .lineLimit(titleLineLimit) + .truncationMode(titleTruncationMode) + .accessibilityIdentifier(AccessibilityIdentifiers.title) + } + + @ViewBuilder + var subtitleView: some View { + let subtitleView = Text(subtitle) + .foregroundColor(Color(uiColor: tokenSet[.subtitleColor].uiColor)) + .lineLimit(subtitleLineLimit) + .truncationMode(subtitleTruncationMode) + .accessibilityIdentifier(AccessibilityIdentifiers.subtitle) switch layoutType { case .oneLine: - titleView - case .twoLines, .threeLines: - let subtitleView = Text(subtitle) - .foregroundColor(Color(uiColor: tokenSet[.subtitleColor].uiColor)) - .lineLimit(subtitleLineLimit) - .truncationMode(subtitleTruncationMode) - .accessibilityIdentifier(AccessibilityIdentifiers.subtitle) - VStack(alignment: .leading, spacing: ListItemTokenSet.labelVerticalSpacing) { + // Subtitle is not shown for oneLine + EmptyView() + case .twoLines: + subtitleView + .font(Font(tokenSet[.subtitleTwoLinesFont].uiFont)) + .frame(minHeight: ListItemTokenSet.subtitleTwoLineHeight) + case .threeLines: + subtitleView + .font(Font(tokenSet[.subtitleThreeLinesFont].uiFont)) + .frame(minHeight: ListItemTokenSet.subtitleThreeLineHeight) + } + } + + @ViewBuilder + var footerView: some View { + Text(footer) + .foregroundColor(Color(uiColor: tokenSet[.footerColor].uiColor)) + .font(Font(tokenSet[.footerFont].uiFont)) + .frame(minHeight: ListItemTokenSet.footerHeight) + .lineLimit(footerLineLimit) + .truncationMode(footerTruncationMode) + .accessibilityIdentifier(AccessibilityIdentifiers.footer) + } + + @ViewBuilder + var labelStack: some View { + VStack(alignment: .leading, spacing: ListItemTokenSet.labelVerticalSpacing) { + switch layoutType { + case .oneLine: titleView - if layoutType == .twoLines { - subtitleView - .font(Font(tokenSet[.subtitleTwoLinesFont].uiFont)) - .frame(minHeight: ListItemTokenSet.subtitleTwoLineHeight) - } else { - subtitleView - .font(Font(tokenSet[.subtitleThreeLinesFont].uiFont)) - .frame(minHeight: ListItemTokenSet.subtitleThreeLineHeight) - Text(footer) - .foregroundColor(Color(uiColor: tokenSet[.footerColor].uiColor)) - .font(Font(tokenSet[.footerFont].uiFont)) - .frame(minHeight: ListItemTokenSet.footerHeight) - .lineLimit(footerLineLimit) - .truncationMode(footerTruncationMode) - .accessibilityIdentifier(AccessibilityIdentifiers.footer) - } + case .twoLines: + titleView + subtitleView + case .threeLines: + titleView + subtitleView + footerView } } } @@ -92,27 +117,30 @@ public struct ListItem Void)? @@ -251,23 +296,69 @@ public struct ListItem LeadingContent)? private var trailingContent: (() -> TrailingContent)? + private var action: (() -> Void)? private let footer: Footer private let subtitle: Subtitle private let title: Title + + private var tokenOverrides: [ListItemToken: ControlTokenValue]? +} + +// MARK: Internal structs + +private struct ListItemButtonStyle: SwiftUI.ButtonStyle { + init(backgroundStyleType: ListItemBackgroundStyleType, tokenSet: ListItemTokenSet) { + self.backgroundStyleType = backgroundStyleType + self.tokenSet = tokenSet + } + + func makeBody(configuration: Configuration) -> some View { + let backgroundColor = configuration.isPressed ? tokenSet[.cellBackgroundSelectedColor].uiColor : .clear + let cornerRadius = backgroundStyleType == .plain && Compatibility.isDeviceIdiomVision() ? 16.0 : 0 + + return configuration.label + .background(Color(backgroundColor)) + .clipShape(RoundedRectangle(cornerRadius: cornerRadius)) + .contentShape(RoundedRectangle(cornerRadius: cornerRadius)) + .pointerInteraction(isEnabled) + } + + let backgroundStyleType: ListItemBackgroundStyleType + let tokenSet: ListItemTokenSet + + @Environment(\.isEnabled) private var isEnabled: Bool } // MARK: Constants @@ -287,12 +378,12 @@ private struct AccessibilityIdentifiers { public extension ListItem where LeadingContent == EmptyView, TrailingContent == EmptyView { init(title: Title, subtitle: Subtitle = String(), - footer: Footer = String()) { + footer: Footer = String(), + action: (() -> Void)? = nil) { self.title = title self.subtitle = subtitle self.footer = footer - let layoutType = ListItem.layoutType(subtitle: subtitle, footer: footer) - self.tokenSet = ListItemTokenSet(customViewSize: { layoutType.leadingContentSize }) + self.action = action } } @@ -300,13 +391,13 @@ public extension ListItem where TrailingContent == EmptyView { init(title: Title, subtitle: Subtitle = String(), footer: Footer = String(), - @ViewBuilder leadingContent: @escaping () -> LeadingContent) { + @ViewBuilder leadingContent: @escaping () -> LeadingContent, + action: (() -> Void)? = nil) { self.title = title self.subtitle = subtitle self.footer = footer self.leadingContent = leadingContent - let layoutType = ListItem.layoutType(subtitle: subtitle, footer: footer) - self.tokenSet = ListItemTokenSet(customViewSize: { layoutType.leadingContentSize }) + self.action = action } } @@ -314,13 +405,13 @@ public extension ListItem where LeadingContent == EmptyView { init(title: Title, subtitle: Subtitle = String(), footer: Footer = String(), - @ViewBuilder trailingContent: @escaping () -> TrailingContent) { + @ViewBuilder trailingContent: @escaping () -> TrailingContent, + action: (() -> Void)? = nil) { self.title = title self.subtitle = subtitle self.footer = footer self.trailingContent = trailingContent - let layoutType = ListItem.layoutType(subtitle: subtitle, footer: footer) - self.tokenSet = ListItemTokenSet(customViewSize: { layoutType.leadingContentSize }) + self.action = action } } @@ -342,3 +433,11 @@ public extension ListItem where LeadingContent == EmptyView, TrailingContent == } } } + +public extension ListItem { + /// Provide override values for various `ListItem` values. + mutating func overrideTokens(_ overrides: [ListItemToken: ControlTokenValue]) -> Self { + tokenOverrides = overrides + return self + } +} diff --git a/ios/FluentUI/List/ListItemModifiers.swift b/Sources/FluentUI_iOS/Components/List/ListItemModifiers.swift similarity index 87% rename from ios/FluentUI/List/ListItemModifiers.swift rename to Sources/FluentUI_iOS/Components/List/ListItemModifiers.swift index 73fcb4e5a9..de1e858ad7 100644 --- a/ios/FluentUI/List/ListItemModifiers.swift +++ b/Sources/FluentUI_iOS/Components/List/ListItemModifiers.swift @@ -26,7 +26,7 @@ public extension ListItem { /// The line limit for `title`. /// - Parameter titleLineLimit: The number of lines to display for the `title`. /// - Returns: The modified `ListItem` with the property set. - func titleLineLimit(_ titleLineLimit: Int) -> ListItem { + func titleLineLimit(_ titleLineLimit: Int?) -> ListItem { var listItem = self listItem.titleLineLimit = titleLineLimit return listItem @@ -35,7 +35,7 @@ public extension ListItem { /// The line limit for `subtitle`. /// - Parameter subtitleLineLimit: The number of lines to display for the `subtitle`. /// - Returns: The modified `ListItem` with the property set. - func subtitleLineLimit(_ subtitleLineLimit: Int) -> ListItem { + func subtitleLineLimit(_ subtitleLineLimit: Int?) -> ListItem { var listItem = self listItem.subtitleLineLimit = subtitleLineLimit return listItem @@ -44,18 +44,18 @@ public extension ListItem { /// The line limit for `footer`. /// - Parameter footerLineLimit: The number of lines to display for the `footer`. /// - Returns: The modified `ListItem` with the property set. - func footerLineLimit(_ footerLineLimit: Int) -> ListItem { + func footerLineLimit(_ footerLineLimit: Int?) -> ListItem { var listItem = self listItem.footerLineLimit = footerLineLimit return listItem } - /// The background styling of the `ListItem` to match the type of `List` it is displayed in. + /// The background styling of the `ListItem` which overrides the inherited value from `FluentList`. /// - Parameter backgroundStyleType: The style of the background. /// - Returns: The modified `ListItem` with the property set. func backgroundStyleType(_ backgroundStyleType: ListItemBackgroundStyleType) -> ListItem { var listItem = self - listItem.backgroundStyleType = backgroundStyleType + listItem.customBackgroundStyleType = backgroundStyleType return listItem } @@ -64,7 +64,7 @@ public extension ListItem { /// - Returns: The modified `ListItem` with the property set. func leadingContentSize(_ size: ListItemLeadingContentSize) -> ListItem { var listItem = self - listItem.tokenSet = ListItemTokenSet(customViewSize: { size }) + listItem.leadingContentSize = size return listItem } diff --git a/ios/FluentUI/MultilineCommandBar/MultilineCommandBar.swift b/Sources/FluentUI_iOS/Components/MultilineCommandBar/MultilineCommandBar.swift similarity index 100% rename from ios/FluentUI/MultilineCommandBar/MultilineCommandBar.swift rename to Sources/FluentUI_iOS/Components/MultilineCommandBar/MultilineCommandBar.swift diff --git a/ios/FluentUI/Navigation/BadgeLabelButton.swift b/Sources/FluentUI_iOS/Components/Navigation/BadgeLabelButton.swift similarity index 100% rename from ios/FluentUI/Navigation/BadgeLabelButton.swift rename to Sources/FluentUI_iOS/Components/Navigation/BadgeLabelButton.swift diff --git a/ios/FluentUI/Navigation/Helpers/ContentScrollViewTraits.swift b/Sources/FluentUI_iOS/Components/Navigation/Helpers/ContentScrollViewTraits.swift similarity index 100% rename from ios/FluentUI/Navigation/Helpers/ContentScrollViewTraits.swift rename to Sources/FluentUI_iOS/Components/Navigation/Helpers/ContentScrollViewTraits.swift diff --git a/ios/FluentUI/Navigation/Helpers/NavigationAnimator.swift b/Sources/FluentUI_iOS/Components/Navigation/Helpers/NavigationAnimator.swift similarity index 100% rename from ios/FluentUI/Navigation/Helpers/NavigationAnimator.swift rename to Sources/FluentUI_iOS/Components/Navigation/Helpers/NavigationAnimator.swift diff --git a/ios/FluentUI/Navigation/Navigation.resources.xcfilelist b/Sources/FluentUI_iOS/Components/Navigation/Navigation.resources.xcfilelist similarity index 100% rename from ios/FluentUI/Navigation/Navigation.resources.xcfilelist rename to Sources/FluentUI_iOS/Components/Navigation/Navigation.resources.xcfilelist diff --git a/ios/FluentUI/Navigation/NavigationBar.swift b/Sources/FluentUI_iOS/Components/Navigation/NavigationBar.swift similarity index 95% rename from ios/FluentUI/Navigation/NavigationBar.swift rename to Sources/FluentUI_iOS/Components/Navigation/NavigationBar.swift index 42db92699c..1929ad3e25 100644 --- a/ios/FluentUI/Navigation/NavigationBar.swift +++ b/Sources/FluentUI_iOS/Components/Navigation/NavigationBar.swift @@ -100,7 +100,7 @@ protocol NavigationBarBackButtonDelegate { /// Contains the MSNavigationTitleView class and handles passing animatable progress through /// Custom UI can be hidden if desired @objc(MSFNavigationBar) -open class NavigationBar: UINavigationBar, TokenizedControlInternal, TwoLineTitleViewDelegate { +open class NavigationBar: UINavigationBar, TokenizedControl, TwoLineTitleViewDelegate { /// If the style is `.custom`, UINavigationItem's `navigationBarColor` is used for all the subviews' backgroundColor @objc(MSFNavigationBarStyle) public enum Style: Int { @@ -172,6 +172,10 @@ open class NavigationBar: UINavigationBar, TokenizedControlInternal, TwoLineTitl } } + /// The accessibility label that should be applied for the back button. + /// A temporary change so that consumers who use SwiftUI for navigation can avoid duplicated resources until support of a swiftUI control is available. + @objc public static let backButtonAccessibilityLabel: String = "Accessibility.NavigationBar.BackLabel".localized + /// An element size to describe the behavior of large title's avatar. If `.automatic`, avatar will resize when `expand(animated:)` and `contract(animated:)` are called. @objc open var avatarSize: ElementSize = .automatic { didSet { @@ -341,7 +345,7 @@ open class NavigationBar: UINavigationBar, TokenizedControlInternal, TwoLineTitl return } updateAccessibilityElements() - updateViewsForLargeTitlePresentation(for: topItem) + updateViewsForNavigationItem(topItem) } } @@ -365,7 +369,7 @@ open class NavigationBar: UINavigationBar, TokenizedControlInternal, TwoLineTitl target: nil, action: #selector(NavigationBarBackButtonDelegate.backButtonWasPressed)) backButtonItem.accessibilityIdentifier = "Back" - backButtonItem.accessibilityLabel = "Accessibility.NavigationBar.BackLabel".localized + backButtonItem.accessibilityLabel = backButtonAccessibilityLabel return backButtonItem }() @@ -437,7 +441,7 @@ open class NavigationBar: UINavigationBar, TokenizedControlInternal, TwoLineTitl systemShadowColor = standardAppearance.shadowColor updateColors(for: topItem) - updateViewsForLargeTitlePresentation(for: topItem) + updateViewsForNavigationItem(topItem) updateAccessibilityElements() tokenSet.registerOnUpdate(for: self) { [weak self] in @@ -552,7 +556,13 @@ open class NavigationBar: UINavigationBar, TokenizedControlInternal, TwoLineTitl tokenSet.update(newWindow.fluentTheme) updateTitleViewTokenSets() - updateColors(for: topItem) + + if let navigationItem = topItem { + let (_, actualItem) = actualStyleAndItem(for: navigationItem) + updateColors(for: actualItem) + } else { + updateColors(for: topItem) + } } private func updateTitleViewTokenSets() { @@ -586,7 +596,7 @@ open class NavigationBar: UINavigationBar, TokenizedControlInternal, TwoLineTitl if traitCollection.verticalSizeClass != previousTraitCollection?.verticalSizeClass { updateElementSizes() updateContentStackViewMargins(forExpandedContent: contentIsExpanded) - updateViewsForLargeTitlePresentation(for: topItem) + updateViewsForNavigationItem(topItem) updateTitleViewConstraints() // change bar button image size and title inset depending on device rotation @@ -641,8 +651,9 @@ open class NavigationBar: UINavigationBar, TokenizedControlInternal, TwoLineTitl // MARK: UINavigationItem & UIBarButtonItem handling func updateColors(for navigationItem: UINavigationItem?) { - let color = navigationItem?.navigationBarColor(fluentTheme: tokenSet.fluentTheme) - let shouldHideRegularTitle: Bool = (style == .gradient || color?.resolvedColor(with: traitCollection) == .clear) && usesLeadingTitle + let backgroundColor = navigationItem?.navigationBarColor(fluentTheme: tokenSet.fluentTheme) + let shouldHideSystemTitle: Bool = (style == .gradient || (backgroundColor?.resolvedColor(with: traitCollection).cgColor.alpha ?? 1.0) < 1.0) && usesLeadingTitle + let systemTitleColor = shouldHideSystemTitle ? UIColor.clear : tokenSet[.titleColor].uiColor switch style { case .primary, .default, .custom: @@ -651,11 +662,11 @@ open class NavigationBar: UINavigationBar, TokenizedControlInternal, TwoLineTitl titleView.style = .system } - backgroundView.backgroundColor = style == .gradient ? .clear : color - standardAppearance.backgroundColor = color + backgroundView.backgroundColor = style == .gradient ? .clear : backgroundColor + standardAppearance.backgroundColor = backgroundColor tintColor = tokenSet[.buttonTintColor].uiColor - standardAppearance.titleTextAttributes[NSAttributedString.Key.foregroundColor] = shouldHideRegularTitle ? UIColor.clear : tokenSet[.titleColor].uiColor - standardAppearance.largeTitleTextAttributes[NSAttributedString.Key.foregroundColor] = tokenSet[.titleColor].uiColor + standardAppearance.titleTextAttributes[NSAttributedString.Key.foregroundColor] = systemTitleColor + standardAppearance.largeTitleTextAttributes[NSAttributedString.Key.foregroundColor] = systemTitleColor // Update the scroll edge appearance to match the new standard appearance scrollEdgeAppearance = standardAppearance @@ -769,7 +780,7 @@ open class NavigationBar: UINavigationBar, TokenizedControlInternal, TwoLineTitl } /// Updates the bar button items. - /// + /// /// In general, this should be called as late as possible when receiving a new navigation item /// because it will replace a client-provided left bar button item with a back button if needed. private func updateBarButtonItems(with navigationItem: UINavigationItem) { @@ -857,7 +868,7 @@ open class NavigationBar: UINavigationBar, TokenizedControlInternal, TwoLineTitl /// Cache for the system shadow color, since the default value is private. private var systemShadowColor: UIColor? - private func updateViewsForLargeTitlePresentation(for navigationItem: UINavigationItem?) { + private func updateViewsForNavigationItem(_ navigationItem: UINavigationItem?) { // UIView.isHidden has a bug where a series of repeated calls with the same parameter can "glitch" the view into a permanent shown/hidden state // i.e. repeatedly trying to hide a UIView that is already in the hidden state // by adding a check to the isHidden property prior to setting, we avoid such problematic scenarios @@ -869,7 +880,8 @@ open class NavigationBar: UINavigationBar, TokenizedControlInternal, TwoLineTitl // We also want to hide the backgroundView and the contentStackView for gradient style regular title to // avoid displaying duplicated navigation bar items. - if usesLeadingTitle || (style != .gradient && systemWantsCompactNavigationBar && navigationItem?.titleView == nil) { + let shouldHideSystemNavigationItems = usesLeadingTitle || (style != .gradient && systemWantsCompactNavigationBar && navigationItem?.titleView == nil) + if shouldHideSystemNavigationItems { if backgroundView.isHidden { backgroundView.isHidden = false } diff --git a/ios/FluentUI/Navigation/NavigationBarTokenSet.swift b/Sources/FluentUI_iOS/Components/Navigation/NavigationBarTokenSet.swift similarity index 100% rename from ios/FluentUI/Navigation/NavigationBarTokenSet.swift rename to Sources/FluentUI_iOS/Components/Navigation/NavigationBarTokenSet.swift diff --git a/ios/FluentUI/Navigation/NavigationController.swift b/Sources/FluentUI_iOS/Components/Navigation/NavigationController.swift similarity index 100% rename from ios/FluentUI/Navigation/NavigationController.swift rename to Sources/FluentUI_iOS/Components/Navigation/NavigationController.swift diff --git a/ios/FluentUI/Navigation/SearchBar/SearchBar.swift b/Sources/FluentUI_iOS/Components/Navigation/SearchBar/SearchBar.swift similarity index 91% rename from ios/FluentUI/Navigation/SearchBar/SearchBar.swift rename to Sources/FluentUI_iOS/Components/Navigation/SearchBar/SearchBar.swift index 1be86564f1..47efdc4236 100644 --- a/ios/FluentUI/Navigation/SearchBar/SearchBar.swift +++ b/Sources/FluentUI_iOS/Components/Navigation/SearchBar/SearchBar.swift @@ -22,7 +22,7 @@ public protocol SearchBarDelegate: AnyObject { /// Drop-in replacement for UISearchBar that allows for more customization @objc(MSFSearchBar) -open class SearchBar: UIView, TokenizedControlInternal { +open class SearchBar: UIView, TokenizedControl { @objc open var hidesNavigationBarDuringSearch: Bool = true { didSet { if oldValue != hidesNavigationBarDuringSearch && isActive { @@ -94,6 +94,8 @@ open class SearchBar: UIView, TokenizedControlInternal { textField.accessibilityTraits = .searchField textField.addTarget(self, action: #selector(searchTextFieldValueDidChange(_:)), for: .editingChanged) textField.showsLargeContentViewer = true + textField.adjustsFontForContentSizeCategory = true + if #available(iOS 17, *) { textField.hoverStyle = nil } @@ -124,6 +126,11 @@ open class SearchBar: UIView, TokenizedControlInternal { clearButton.addTarget(self, action: #selector(SearchBar.clearButtonTapped(sender:)), for: .touchUpInside) clearButton.setImage(UIImage.staticImageNamed("search-clear"), for: .normal) clearButton.isHidden = true + clearButton.showsLargeContentViewer = true + + let clearLabel = "Accessibility.TextField.ClearText".localized + clearButton.accessibilityLabel = clearLabel + clearButton.largeContentTitle = clearLabel clearButton.isPointerInteractionEnabled = true clearButton.pointerStyleProvider = { button, _, _ in @@ -144,6 +151,7 @@ open class SearchBar: UIView, TokenizedControlInternal { button.addTarget(self, action: #selector(SearchBar.cancelButtonTapped(sender:)), for: .touchUpInside) button.alpha = 0.0 button.showsLargeContentViewer = true + button.titleLabel?.adjustsFontForContentSizeCategory = true button.isPointerInteractionEnabled = true if #available(iOS 17, *) { button.hoverStyle = UIHoverStyle(shape: .capsule) @@ -280,6 +288,10 @@ open class SearchBar: UIView, TokenizedControlInternal { private func setupLayout() { addInteraction(UILargeContentViewerInteraction()) + // Search bar has fixed height, so this is the largest size category we can handle while still being usable. + // The larger edge cases are covered by large content viewer. + maximumContentSizeCategory = .accessibilityMedium + // Autolayout is more efficent if all constraints are activated simultaneously var constraints = [NSLayoutConstraint]() @@ -317,10 +329,24 @@ open class SearchBar: UIView, TokenizedControlInternal { searchTextFieldBackgroundView.addSubview(searchTextField) searchTextField.translatesAutoresizingMaskIntoConstraints = false - constraints.append(searchTextField.centerYAnchor.constraint(equalTo: searchTextFieldBackgroundView.centerYAnchor)) - constraints.append(searchTextField.heightAnchor.constraint(equalTo: searchTextFieldBackgroundView.heightAnchor, constant: -2 * SearchBarTokenSet.searchTextFieldVerticalInset)) - constraints.append(searchTextField.leadingAnchor.constraint(equalTo: searchIconImageViewContainerView.trailingAnchor, constant: SearchBarTokenSet.searchTextFieldLeadingInset)) - textFieldLeadingConstraint = constraints.last + // This lets leadingView squeeze the searchTextField when needed. + searchTextField.setContentCompressionResistancePriority(.defaultLow, for: .horizontal) + + // This imposes a limit on how much the leadingView can squeeze the input field + let searchTextFieldMinWidthConstraint = searchTextField.widthAnchor.constraint(greaterThanOrEqualToConstant: SearchBarTokenSet.searchTextFieldInteractionMinWidth) + + // The min width is important, but we don't want to override other constraints the parent may impose on us. + searchTextFieldMinWidthConstraint.priority = .defaultHigh + + let searchTextFieldLeadingConstraint = searchTextField.leadingAnchor.constraint(equalTo: searchIconImageViewContainerView.trailingAnchor, constant: SearchBarTokenSet.searchTextFieldLeadingInset) + textFieldLeadingConstraint = searchTextFieldLeadingConstraint + + constraints.append(contentsOf: [ + searchTextField.centerYAnchor.constraint(equalTo: searchTextFieldBackgroundView.centerYAnchor), + searchTextField.heightAnchor.constraint(equalTo: searchTextFieldBackgroundView.heightAnchor, constant: -2 * SearchBarTokenSet.searchTextFieldVerticalInset), + searchTextFieldLeadingConstraint, + searchTextFieldMinWidthConstraint + ]) // progressSpinner let progressSpinnerView = progressSpinner @@ -363,18 +389,14 @@ open class SearchBar: UIView, TokenizedControlInternal { } searchTextFieldBackgroundView.addSubview(leadingView) - - let leadingViewRenderWidth = searchTextFieldBackgroundView.frame.size.width - SearchBarTokenSet.searchIconInsettedWidth - SearchBarTokenSet.searchTextFieldLeadingInset - SearchBarTokenSet.searchTextFieldInteractionMinWidth - SearchBarTokenSet.clearButtonInsettedWidth - let leadingViewRenderSize = CGSize(width: leadingViewRenderWidth, height: searchTextFieldBackgroundView.frame.size.height) - let leadingViewSize = leadingView.sizeThatFits(leadingViewRenderSize) + leadingView.setContentHuggingPriority(.required, for: .horizontal) leadingView.translatesAutoresizingMaskIntoConstraints = false NSLayoutConstraint.activate([ + leadingView.heightAnchor.constraint(lessThanOrEqualToConstant: SearchBarTokenSet.searchTextFieldBackgroundHeight), leadingView.leadingAnchor.constraint(equalTo: searchIconImageViewContainerView.trailingAnchor, constant: SearchBarTokenSet.searchIconInset), leadingView.trailingAnchor.constraint(equalTo: searchTextField.leadingAnchor, constant: -SearchBarTokenSet.searchTextFieldLeadingInset), - leadingView.centerYAnchor.constraint(equalTo: searchTextFieldBackgroundView.centerYAnchor), - leadingView.widthAnchor.constraint(equalToConstant: leadingViewSize.width), - leadingView.heightAnchor.constraint(equalToConstant: leadingViewSize.height) + leadingView.centerYAnchor.constraint(equalTo: searchTextFieldBackgroundView.centerYAnchor) ]) } diff --git a/ios/FluentUI/Navigation/SearchBar/SearchBarTokenSet.swift b/Sources/FluentUI_iOS/Components/Navigation/SearchBar/SearchBarTokenSet.swift similarity index 100% rename from ios/FluentUI/Navigation/SearchBar/SearchBarTokenSet.swift rename to Sources/FluentUI_iOS/Components/Navigation/SearchBar/SearchBarTokenSet.swift diff --git a/ios/FluentUI/Navigation/Shy Header/ShyHeaderController.swift b/Sources/FluentUI_iOS/Components/Navigation/Shy Header/ShyHeaderController.swift similarity index 97% rename from ios/FluentUI/Navigation/Shy Header/ShyHeaderController.swift rename to Sources/FluentUI_iOS/Components/Navigation/Shy Header/ShyHeaderController.swift index b64b8b892a..36f75ddc27 100644 --- a/ios/FluentUI/Navigation/Shy Header/ShyHeaderController.swift +++ b/Sources/FluentUI_iOS/Components/Navigation/Shy Header/ShyHeaderController.swift @@ -45,6 +45,7 @@ class ShyHeaderController: UIViewController { } private var accessoryViewObservation: NSKeyValueObservation? + private var secondaryAccessoryViewObservation: NSKeyValueObservation? private var navigationBarCenterObservation: NSKeyValueObservation? private var navigationBarStyleObservation: NSKeyValueObservation? @@ -101,6 +102,10 @@ class ShyHeaderController: UIViewController { accessoryViewObservation = contentViewController.navigationItem.observe(\UINavigationItem.accessoryView) { [weak self] item, _ in self?.shyHeaderView.accessoryView = item.accessoryView } + + secondaryAccessoryViewObservation = contentViewController.navigationItem.observe(\UINavigationItem.secondaryAccessoryView) { [weak self] item, _ in + self?.shyHeaderView.secondaryAccessoryView = item.secondaryAccessoryView + } } required init?(coder aDecoder: NSCoder) { @@ -211,8 +216,10 @@ class ShyHeaderController: UIViewController { } private func setupShyHeaderView() { - shyHeaderView.accessoryView = contentViewController.navigationItem.accessoryView - shyHeaderView.navigationBarShadow = contentViewController.navigationItem.navigationBarShadow + let navigationItem = contentViewController.navigationItem + shyHeaderView.accessoryView = navigationItem.accessoryView + shyHeaderView.secondaryAccessoryView = navigationItem.secondaryAccessoryView + shyHeaderView.navigationBarShadow = navigationItem.navigationBarShadow shyHeaderView.paddingView = paddingView shyHeaderView.parentController = self shyHeaderView.maxHeightChanged = { [weak self] in diff --git a/ios/FluentUI/Navigation/Shy Header/ShyHeaderView.swift b/Sources/FluentUI_iOS/Components/Navigation/Shy Header/ShyHeaderView.swift similarity index 74% rename from ios/FluentUI/Navigation/Shy Header/ShyHeaderView.swift rename to Sources/FluentUI_iOS/Components/Navigation/Shy Header/ShyHeaderView.swift index 5b953b5160..d9f2e505d1 100644 --- a/ios/FluentUI/Navigation/Shy Header/ShyHeaderView.swift +++ b/Sources/FluentUI_iOS/Components/Navigation/Shy Header/ShyHeaderView.swift @@ -11,7 +11,7 @@ import UIKit /// Used to contain an accessory provided by the VC contained by the NavigatableShyContainerVC /// This class in itself is fairly straightforward, defining a height and a containment layout /// The animation around showing/hiding this view progressively is handled by its superview/superVC, an instance of ShyHeaderController -class ShyHeaderView: UIView, TokenizedControlInternal { +class ShyHeaderView: UIView, TokenizedControl { typealias TokenSetKeyType = EmptyTokenSet.Tokens public var tokenSet: EmptyTokenSet = .init() @@ -72,6 +72,7 @@ class ShyHeaderView: UIView, TokenizedControlInternal { tokenSet.registerOnUpdate(for: self) { [weak self] in self?.updateColors() } + self.initSecondaryContentStackView() } override func willMove(toWindow newWindow: UIWindow?) { @@ -125,6 +126,13 @@ class ShyHeaderView: UIView, TokenizedControlInternal { willSet { accessoryView?.removeFromSuperview() contentStackView.removeFromSuperview() + // When there is no accessoryView, the top anchor of the secondaryContentStackView should be equal to + // the top anchor of the parent view. + if let secondaryContentStackViewTopAnchorConstraint { + NSLayoutConstraint.activate([ + secondaryContentStackViewTopAnchorConstraint + ]) + } } didSet { if let newContentView = accessoryView { @@ -135,13 +143,39 @@ class ShyHeaderView: UIView, TokenizedControlInternal { } } - var maxHeight: CGFloat { + var secondaryAccessoryView: UIView? { + willSet { + secondaryAccessoryView?.removeFromSuperview() + } + didSet { + if let newContentView = secondaryAccessoryView { + secondaryContentStackView.addArrangedSubview(newContentView) + } + maxHeightChanged?() + } + } + + var accessoryViewHeight: CGFloat { if accessoryView == nil { return maxHeightNoAccessory } else { return contentTopInset + Constants.accessoryHeight + contentBottomInset } } + + var secondaryAccessoryViewHeight: CGFloat { + guard let secondaryAccessoryView else { + return 0.0 + } + + let secondaryAccessoryViewSize = secondaryAccessoryView.systemLayoutSizeFitting(UIView.layoutFittingCompressedSize) + return secondaryAccessoryViewSize.height + } + + var maxHeight: CGFloat { + return accessoryViewHeight + secondaryAccessoryViewHeight + } + private var maxHeightNoAccessory: CGFloat { if traitCollection.verticalSizeClass == .compact { return traitCollection.horizontalSizeClass == .compact ? Constants.maxHeightNoAccessoryCompact : Constants.maxHeightNoAccessoryCompactForLargePhone @@ -186,6 +220,9 @@ class ShyHeaderView: UIView, TokenizedControlInternal { } private let contentStackView = UIStackView() + private var contentStackViewHeightConstraint: NSLayoutConstraint? + private let secondaryContentStackView = UIStackView() + private var secondaryContentStackViewTopAnchorConstraint: NSLayoutConstraint? private let shadow = Separator() private var needsShadow: Bool { @@ -222,12 +259,45 @@ class ShyHeaderView: UIView, TokenizedControlInternal { private func initContentStackView() { contentStackView.isLayoutMarginsRelativeArrangement = true + contentStackView.translatesAutoresizingMaskIntoConstraints = false addSubview(contentStackView) - contentStackView.fitIntoSuperview(usingConstraints: true) + + // When there is a accessoryView, the top anchor of the secondaryContentStackView should be equal to + // the bottom anchor of contentStackView. + if let secondaryContentStackViewTopAnchorConstraint { + NSLayoutConstraint.deactivate([ + secondaryContentStackViewTopAnchorConstraint + ]) + } + + let heightConstraint = contentStackView.heightAnchor.constraint(equalToConstant: accessoryViewHeight) + contentStackViewHeightConstraint = heightConstraint + NSLayoutConstraint.activate([ + contentStackView.leadingAnchor.constraint(equalTo: leadingAnchor), + contentStackView.trailingAnchor.constraint(equalTo: trailingAnchor), + contentStackView.topAnchor.constraint(equalTo: topAnchor), + contentStackView.bottomAnchor.constraint(equalTo: secondaryContentStackView.topAnchor), + heightConstraint + ]) updateContentInsets() contentStackView.addInteraction(UILargeContentViewerInteraction()) } + private func initSecondaryContentStackView() { + secondaryContentStackView.translatesAutoresizingMaskIntoConstraints = false + addSubview(secondaryContentStackView) + let topAnchorConstraint = secondaryContentStackView.topAnchor.constraint(equalTo: topAnchor) + secondaryContentStackViewTopAnchorConstraint = topAnchorConstraint + NSLayoutConstraint.activate([ + secondaryContentStackView.leadingAnchor.constraint(equalTo: leadingAnchor), + secondaryContentStackView.trailingAnchor.constraint(equalTo: trailingAnchor), + topAnchorConstraint, + secondaryContentStackView.bottomAnchor.constraint(equalTo: bottomAnchor) + ]) + + secondaryContentStackView.addInteraction(UILargeContentViewerInteraction()) + } + private func initShadow() { let shadowView = shadow shadowView.translatesAutoresizingMaskIntoConstraints = false diff --git a/ios/FluentUI/Navigation/TwoLineTitleView+Navigation.swift b/Sources/FluentUI_iOS/Components/Navigation/TwoLineTitleView+Navigation.swift similarity index 100% rename from ios/FluentUI/Navigation/TwoLineTitleView+Navigation.swift rename to Sources/FluentUI_iOS/Components/Navigation/TwoLineTitleView+Navigation.swift diff --git a/ios/FluentUI/Navigation/UIBarButtonItem+BadgeValue.swift b/Sources/FluentUI_iOS/Components/Navigation/UIBarButtonItem+BadgeValue.swift similarity index 100% rename from ios/FluentUI/Navigation/UIBarButtonItem+BadgeValue.swift rename to Sources/FluentUI_iOS/Components/Navigation/UIBarButtonItem+BadgeValue.swift diff --git a/ios/FluentUI/Navigation/UINavigationItem+Navigation.swift b/Sources/FluentUI_iOS/Components/Navigation/UINavigationItem+Navigation.swift similarity index 91% rename from ios/FluentUI/Navigation/UINavigationItem+Navigation.swift rename to Sources/FluentUI_iOS/Components/Navigation/UINavigationItem+Navigation.swift index f84fb3cde7..ba346097a1 100644 --- a/ios/FluentUI/Navigation/UINavigationItem+Navigation.swift +++ b/Sources/FluentUI_iOS/Components/Navigation/UINavigationItem+Navigation.swift @@ -8,6 +8,7 @@ import UIKit @objc public extension UINavigationItem { private struct AssociatedKeys { static var accessoryView: UInt8 = 0 + static var secondaryAccessoryView: UInt8 = 0 static var titleAccessory: UInt8 = 0 static var titleImage: UInt8 = 0 static var topAccessoryView: UInt8 = 0 @@ -31,6 +32,18 @@ import UIKit } } + /// An wide accessory view that can be shown as a subview of ShyHeaderView but doesn't have leading, trailing + /// and bottom insets. So it can appear as being part of the content view but still contract and expand as part of + /// the shy header. + var secondaryAccessoryView: UIView? { + get { + return objc_getAssociatedObject(self, &AssociatedKeys.secondaryAccessoryView) as? UIView + } + set { + objc_setAssociatedObject(self, &AssociatedKeys.secondaryAccessoryView, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) + } + } + /// Defines an accessory shown after the title or subtitle in a navigation bar. When defined, this gives the indication that the title can be tapped to show additional information. var titleAccessory: NavigationBarTitleAccessory? { get { diff --git a/ios/FluentUI/Navigation/UIViewController+Navigation.swift b/Sources/FluentUI_iOS/Components/Navigation/UIViewController+Navigation.swift similarity index 100% rename from ios/FluentUI/Navigation/UIViewController+Navigation.swift rename to Sources/FluentUI_iOS/Components/Navigation/UIViewController+Navigation.swift diff --git a/ios/FluentUI/Navigation/Views/AvatarTitleView.swift b/Sources/FluentUI_iOS/Components/Navigation/Views/AvatarTitleView.swift similarity index 98% rename from ios/FluentUI/Navigation/Views/AvatarTitleView.swift rename to Sources/FluentUI_iOS/Components/Navigation/Views/AvatarTitleView.swift index 835bb5744c..5654d3019c 100644 --- a/ios/FluentUI/Navigation/Views/AvatarTitleView.swift +++ b/Sources/FluentUI_iOS/Components/Navigation/Views/AvatarTitleView.swift @@ -8,7 +8,7 @@ import UIKit // MARK: AvatarTitleView /// A helper view used by `NavigationBar` capable of displaying a large title and an avatar. -class AvatarTitleView: UIView, TokenizedControlInternal, TwoLineTitleViewDelegate { +class AvatarTitleView: UIView, TokenizedControl, TwoLineTitleViewDelegate { enum Style: Int { case primary case system @@ -315,7 +315,7 @@ class AvatarTitleView: UIView, TokenizedControlInternal, TwoLineTitleViewDelegat // MARK: - Content Update Methods private func updateProfileButtonVisibility() { - showsProfileButton = titleStyle.usesLeadingAlignment && !hasLeftBarButtonItems && (personaData != nil || avatarOverrideStyle != nil) + showsProfileButton = titleStyle.usesLeadingAlignment && !hasLeftBarButtonItems && personaData != nil } private func updateTitleContainerView() { diff --git a/ios/FluentUI/Navigation/Views/AvatarTitleViewTokenSet.swift b/Sources/FluentUI_iOS/Components/Navigation/Views/AvatarTitleViewTokenSet.swift similarity index 100% rename from ios/FluentUI/Navigation/Views/AvatarTitleViewTokenSet.swift rename to Sources/FluentUI_iOS/Components/Navigation/Views/AvatarTitleViewTokenSet.swift diff --git a/ios/FluentUI/Notification/FluentNotification.swift b/Sources/FluentUI_iOS/Components/Notification/FluentNotification.swift similarity index 92% rename from ios/FluentUI/Notification/FluentNotification.swift rename to Sources/FluentUI_iOS/Components/Notification/FluentNotification.swift index bb4d6ba061..5b3420e0be 100644 --- a/ios/FluentUI/Notification/FluentNotification.swift +++ b/Sources/FluentUI_iOS/Components/Notification/FluentNotification.swift @@ -80,6 +80,7 @@ public struct FluentNotification: View, TokenizedControlView { /// - showDefaultDismissActionButton: Bool to control if the Notification has a dismiss action by default. /// - messageButtonAction: Action to be dispatched by tapping on the toast/bar notification. /// - showFromBottom: Defines whether the notification shows from the bottom of the presenting view or the top. + /// - verticalOffset: How much to vertically offset the notification from its default position. public init(style: MSFNotificationStyle, shouldSelfPresent: Bool = true, isFlexibleWidthToast: Bool = false, @@ -95,7 +96,8 @@ public struct FluentNotification: View, TokenizedControlView { actionButtonAction: (() -> Void)? = nil, showDefaultDismissActionButton: Bool? = nil, messageButtonAction: (() -> Void)? = nil, - showFromBottom: Bool = true) { + showFromBottom: Bool = true, + verticalOffset: CGFloat = 0.0) { let state = MSFNotificationStateImpl(style: style, message: message, attributedMessage: attributedMessage, @@ -108,7 +110,8 @@ public struct FluentNotification: View, TokenizedControlView { actionButtonAction: actionButtonAction, showDefaultDismissActionButton: showDefaultDismissActionButton, messageButtonAction: messageButtonAction, - showFromBottom: showFromBottom) + showFromBottom: showFromBottom, + verticalOffset: verticalOffset) self.state = state self.shouldSelfPresent = shouldSelfPresent self.isFlexibleWidthToast = isFlexibleWidthToast && style.isToast @@ -137,7 +140,7 @@ public struct FluentNotification: View, TokenizedControlView { .frame(width: imageSize.width, height: imageSize.height, alignment: .center) - .foregroundColor(Color(tokenSet[.imageColor].uiColor)) + .foregroundColor(tokenSet[.imageColor].color) } } } @@ -146,16 +149,11 @@ public struct FluentNotification: View, TokenizedControlView { var titleLabel: some View { if state.style.isToast && hasSecondTextRow { if let attributedTitle = state.attributedTitle { - AttributedText(attributedTitle, attributedTitleSize.width) - .fixedSize(horizontal: isFlexibleWidthToast, vertical: true) - .onSizeChange { newSize in - attributedTitleSize = newSize - } - .accessibilityLabel(attributedTitle.string) + Text(AttributedString(attributedTitle)) + .fixedSize(horizontal: false, vertical: true) } else if let title = state.title { Text(title) .font(.init(tokenSet[.boldTextFont].uiFont)) - .foregroundColor(Color(tokenSet[.foregroundColor].uiColor)) } } } @@ -163,16 +161,11 @@ public struct FluentNotification: View, TokenizedControlView { @ViewBuilder var messageLabel: some View { if let attributedMessage = state.attributedMessage { - AttributedText(attributedMessage, attributedMessageSize.width) - .fixedSize(horizontal: isFlexibleWidthToast, vertical: true) - .onSizeChange { newSize in - attributedMessageSize = newSize - } - .accessibilityLabel(attributedMessage.string) + Text(AttributedString(attributedMessage)) + .fixedSize(horizontal: false, vertical: true) } else if let message = state.message { Text(message) .font(.init(tokenSet[.regularTextFont].uiFont)) - .foregroundColor(Color(tokenSet[.foregroundColor].uiColor)) } } @@ -191,14 +184,12 @@ public struct FluentNotification: View, TokenizedControlView { var button: some View { let shouldHaveDefaultAction = state.showDefaultDismissActionButton && shouldSelfPresent if let buttonAction = state.actionButtonAction ?? (shouldHaveDefaultAction ? dismissAnimated : nil) { - let foregroundColor = tokenSet[.foregroundColor].uiColor if let actionTitle = state.actionButtonTitle, !actionTitle.isEmpty { SwiftUI.Button(actionTitle) { isPresented = false buttonAction() } .lineLimit(1) - .foregroundColor(Color(foregroundColor)) .font(.init(tokenSet[.boldTextFont].uiFont)) .hoverEffect() } else { @@ -214,7 +205,6 @@ public struct FluentNotification: View, TokenizedControlView { .accessibilityLabel("Accessibility.Dismiss.Label".localized) } }) - .foregroundColor(Color(foregroundColor)) .hoverEffect() } } @@ -271,7 +261,7 @@ public struct FluentNotification: View, TokenizedControlView { .scaleEffect(x: 1.0, y: g.size.height / g.size.width, anchor: .top) } } else { - Color(tokenSet[.backgroundColor].uiColor) + tokenSet[.backgroundColor].color } } @@ -279,17 +269,21 @@ public struct FluentNotification: View, TokenizedControlView { var notification: some View { let shadowInfo = tokenSet[.shadow].shadowInfo innerContents + .foregroundStyle(tokenSet[.foregroundColor].color) .background( RoundedRectangle(cornerRadius: tokenSet[.cornerRadius].float) .border(width: tokenSet[.outlineWidth].float, edges: state.showFromBottom ? [.top] : [.bottom], - color: Color(tokenSet[.outlineColor].uiColor)).foregroundColor(.clear) + color: tokenSet[.outlineColor].color).foregroundColor(.clear) .background( backgroundFill .clipShape(RoundedRectangle(cornerRadius: tokenSet[.cornerRadius].float)) ) - .applyShadow(shadowInfo: shadowInfo) + .applyFluentShadow(shadowInfo: shadowInfo) ) +#if os(visionOS) + .glassBackgroundEffect(in: RoundedRectangle(cornerRadius: tokenSet[.cornerRadius].float)) +#endif // os(visionOS) .onTapGesture { if let messageAction = messageButtonAction { isPresented = false @@ -361,16 +355,16 @@ public struct FluentNotification: View, TokenizedControlView { } private func presentAnimated() { - withAnimation(.spring(response: state.style.animationDurationForShow, + withAnimation(.spring(response: state.style.animationDurationForShow / 2.0, dampingFraction: state.style.animationDampingRatio, blendDuration: 0)) { - bottomOffset = 0 + bottomOffset = -state.verticalOffset opacity = 1 } } private func dismissAnimated() { - withAnimation(.linear(duration: state.style.animationDurationForHide)) { + withAnimation(.linear(duration: state.style.animationDurationForHide / 2.0)) { bottomOffset = bottomOffsetForDismissedState opacity = 0 } @@ -409,6 +403,7 @@ class MSFNotificationStateImpl: ControlState, MSFNotificationState { @Published var showDefaultDismissActionButton: Bool @Published var showFromBottom: Bool @Published var backgroundGradient: LinearGradientInfo? + @Published var verticalOffset: CGFloat /// Title to display in the action button on the trailing edge of the control. /// @@ -439,7 +434,8 @@ class MSFNotificationStateImpl: ControlState, MSFNotificationState { actionButtonAction: nil, showDefaultDismissActionButton: nil, messageButtonAction: nil, - showFromBottom: true) + showFromBottom: true, + verticalOffset: 0.0) } init(style: MSFNotificationStyle, @@ -454,7 +450,8 @@ class MSFNotificationStateImpl: ControlState, MSFNotificationState { actionButtonAction: (() -> Void)? = nil, showDefaultDismissActionButton: Bool? = nil, messageButtonAction: (() -> Void)? = nil, - showFromBottom: Bool = true) { + showFromBottom: Bool = true, + verticalOffset: CGFloat) { self.style = style self.message = message self.attributedMessage = attributedMessage @@ -468,6 +465,7 @@ class MSFNotificationStateImpl: ControlState, MSFNotificationState { self.messageButtonAction = messageButtonAction self.showFromBottom = showFromBottom self.showDefaultDismissActionButton = showDefaultDismissActionButton ?? style.isToast + self.verticalOffset = verticalOffset super.init() } diff --git a/ios/FluentUI/Notification/MSFNotification.swift b/Sources/FluentUI_iOS/Components/Notification/MSFNotification.swift similarity index 99% rename from ios/FluentUI/Notification/MSFNotification.swift rename to Sources/FluentUI_iOS/Components/Notification/MSFNotification.swift index 784214b8b0..8cf5a40d2e 100644 --- a/ios/FluentUI/Notification/MSFNotification.swift +++ b/Sources/FluentUI_iOS/Components/Notification/MSFNotification.swift @@ -25,7 +25,7 @@ import UIKit self.isFlexibleWidthToast = isFlexibleWidthToast && style.isToast notification = FluentNotification(style: style, shouldSelfPresent: false) - super.init(AnyView(notification)) + super.init(AnyView(notification), safeAreaRegions: []) let defaultDismissAction = { [weak self] in guard let strongSelf = self else { return diff --git a/ios/FluentUI/Notification/Notification.resources.xcfilelist b/Sources/FluentUI_iOS/Components/Notification/Notification.resources.xcfilelist similarity index 100% rename from ios/FluentUI/Notification/Notification.resources.xcfilelist rename to Sources/FluentUI_iOS/Components/Notification/Notification.resources.xcfilelist diff --git a/ios/FluentUI/Notification/NotificationModifiers.swift b/Sources/FluentUI_iOS/Components/Notification/NotificationModifiers.swift similarity index 100% rename from ios/FluentUI/Notification/NotificationModifiers.swift rename to Sources/FluentUI_iOS/Components/Notification/NotificationModifiers.swift diff --git a/ios/FluentUI/Notification/NotificationTokenSet.swift b/Sources/FluentUI_iOS/Components/Notification/NotificationTokenSet.swift similarity index 84% rename from ios/FluentUI/Notification/NotificationTokenSet.swift rename to Sources/FluentUI_iOS/Components/Notification/NotificationTokenSet.swift index bdeace0f6b..2d7fc035a6 100644 --- a/ios/FluentUI/Notification/NotificationTokenSet.swift +++ b/Sources/FluentUI_iOS/Components/Notification/NotificationTokenSet.swift @@ -108,57 +108,57 @@ public class NotificationTokenSet: ControlTokenSet super.init { [style] token, theme in switch token { case .backgroundColor: - return .uiColor { + return .color { switch style() { case .primaryToast, .primaryBar: - return theme.color(.brandBackgroundTint) + return theme.swiftUIColor(.brandBackgroundTint) case .neutralToast: - return theme.color(.background4) + return theme.swiftUIColor(.background4) case .primaryOutlineBar: - return theme.color(.background1) + return theme.swiftUIColor(.background1) case .neutralBar: - return theme.color(.background5) + return theme.swiftUIColor(.background5) case .dangerToast: - return theme.color(.dangerBackground1) + return theme.swiftUIColor(.dangerBackground1) case .warningToast: - return theme.color(.warningBackground1) + return theme.swiftUIColor(.warningBackground1) } } case .foregroundColor: - return .uiColor { + return .color { switch style() { case .primaryToast, .primaryBar: - return theme.color(.brandForegroundTint) + return theme.swiftUIColor(.brandForegroundTint) case .neutralToast, .neutralBar: - return theme.color(.foreground2) + return theme.swiftUIColor(.foreground2) case .primaryOutlineBar: - return theme.color(.brandForeground1) + return theme.swiftUIColor(.brandForeground1) case .dangerToast: - return theme.color(.dangerForeground1) + return theme.swiftUIColor(.dangerForeground1) case .warningToast: - return theme.color(.warningForeground1) + return theme.swiftUIColor(.warningForeground1) } } case .imageColor: - return .uiColor { + return .color { switch style() { case .primaryToast, .primaryBar: - return theme.color(.brandForegroundTint) + return theme.swiftUIColor(.brandForegroundTint) case .neutralToast, .neutralBar: - return theme.color(.foreground2) + return theme.swiftUIColor(.foreground2) case .primaryOutlineBar: - return theme.color(.brandForeground1) + return theme.swiftUIColor(.brandForeground1) case .dangerToast: - return theme.color(.dangerForeground1) + return theme.swiftUIColor(.dangerForeground1) case .warningToast: - return theme.color(.warningForeground1) + return theme.swiftUIColor(.warningForeground1) } } @@ -192,12 +192,12 @@ public class NotificationTokenSet: ControlTokenSet return .float { 52.0 } case .outlineColor: - return .uiColor { + return .color { switch style() { case .primaryToast, .neutralToast, .primaryBar, .neutralBar, .dangerToast, .warningToast: return .clear case .primaryOutlineBar: - return theme.color(.stroke2) + return theme.swiftUIColor(.stroke2) } } @@ -206,7 +206,7 @@ public class NotificationTokenSet: ControlTokenSet case .shadow: return .shadowInfo { - if style().isToast { + if style().isToast && !Compatibility.isDeviceIdiomVision() { return theme.shadow(.shadow16) } else { return theme.shadow(.clear) diff --git a/ios/FluentUI/Obscurable/BlurringView.swift b/Sources/FluentUI_iOS/Components/Obscurable/BlurringView.swift similarity index 100% rename from ios/FluentUI/Obscurable/BlurringView.swift rename to Sources/FluentUI_iOS/Components/Obscurable/BlurringView.swift diff --git a/ios/FluentUI/Obscurable/DimmingView.swift b/Sources/FluentUI_iOS/Components/Obscurable/DimmingView.swift similarity index 100% rename from ios/FluentUI/Obscurable/DimmingView.swift rename to Sources/FluentUI_iOS/Components/Obscurable/DimmingView.swift diff --git a/ios/FluentUI/Obscurable/Obscurable.swift b/Sources/FluentUI_iOS/Components/Obscurable/Obscurable.swift similarity index 100% rename from ios/FluentUI/Obscurable/Obscurable.swift rename to Sources/FluentUI_iOS/Components/Obscurable/Obscurable.swift diff --git a/ios/FluentUI/Other Cells/ActionsCell.swift b/Sources/FluentUI_iOS/Components/Other Cells/ActionsCell.swift similarity index 95% rename from ios/FluentUI/Other Cells/ActionsCell.swift rename to Sources/FluentUI_iOS/Components/Other Cells/ActionsCell.swift index 8b1f96982a..0f9c975dd8 100644 --- a/ios/FluentUI/Other Cells/ActionsCell.swift +++ b/Sources/FluentUI_iOS/Components/Other Cells/ActionsCell.swift @@ -15,7 +15,7 @@ import UIKit `topSeparatorType` and `bottomSeparatorType` can be used to show custom horizontal separators. Make sure to remove the `UITableViewCell` built-in separator by setting `separatorStyle = .none` on your table view. */ @objc(MSFActionsCell) -open class ActionsCell: UITableViewCell, TokenizedControlInternal { +open class ActionsCell: UITableViewCell, TokenizedControl { @objc(MSFActionsCellActionType) public enum ActionType: Int { case regular @@ -125,8 +125,6 @@ open class ActionsCell: UITableViewCell, TokenizedControlInternal { addSubview(topSeparator) addSubview(bottomSeparator) - // hide system separator so we can draw our own. We prefer the container UITableView to set separatorStyle = .none - separatorInset = UIEdgeInsets(top: 0, left: CGFloat.greatestFiniteMagnitude, bottom: 0, right: 0) updateHorizontalSeparator(topSeparator, with: topSeparatorType) updateHorizontalSeparator(bottomSeparator, with: bottomSeparatorType) setupBackgroundColors() @@ -186,6 +184,14 @@ open class ActionsCell: UITableViewCell, TokenizedControlInternal { verticalSeparator.frame = CGRect(x: left, y: 0, width: verticalSeparator.frame.width, height: frame.height) } + // A hacky way to hide the system separator by squeezing it just enough to have zero width. + // This is the only known way to hide the separator without making the UITableView do it for us. + let boundsWidth = bounds.width + let targetSystemSeparatorInset = UIEdgeInsets(top: 0, left: boundsWidth, bottom: 0, right: 0) + if separatorInset.left < boundsWidth { + separatorInset = targetSystemSeparatorInset + } + layoutHorizontalSeparator(topSeparator, with: topSeparatorType, at: 0) layoutHorizontalSeparator(bottomSeparator, with: bottomSeparatorType, at: frame.height - bottomSeparator.frame.height) } diff --git a/ios/FluentUI/Other Cells/ActivityIndicatorCell.swift b/Sources/FluentUI_iOS/Components/Other Cells/ActivityIndicatorCell.swift similarity index 99% rename from ios/FluentUI/Other Cells/ActivityIndicatorCell.swift rename to Sources/FluentUI_iOS/Components/Other Cells/ActivityIndicatorCell.swift index 046131e59d..c396b65d7e 100644 --- a/ios/FluentUI/Other Cells/ActivityIndicatorCell.swift +++ b/Sources/FluentUI_iOS/Components/Other Cells/ActivityIndicatorCell.swift @@ -8,7 +8,7 @@ import UIKit // MARK: ActivityIndicatorCell @objc(MSFActivityIndicatorCell) -open class ActivityIndicatorCell: UITableViewCell, TokenizedControlInternal { +open class ActivityIndicatorCell: UITableViewCell, TokenizedControl { public static let identifier: String = "ActivityIndicatorCell" @objc public var backgroundStyleType: TableViewCellBackgroundStyleType = .plain { diff --git a/ios/FluentUI/Other Cells/BooleanCell.swift b/Sources/FluentUI_iOS/Components/Other Cells/BooleanCell.swift similarity index 97% rename from ios/FluentUI/Other Cells/BooleanCell.swift rename to Sources/FluentUI_iOS/Components/Other Cells/BooleanCell.swift index b084799f53..1d2b2df64e 100644 --- a/ios/FluentUI/Other Cells/BooleanCell.swift +++ b/Sources/FluentUI_iOS/Components/Other Cells/BooleanCell.swift @@ -81,6 +81,9 @@ open class BooleanCell: TableViewCell { setup(title: title, customView: customView, customAccessoryView: `switch`) self.isOn = isOn self.isSwitchEnabled = isSwitchEnabled + if #available(iOS 17, *) { + self.accessibilityTraits.insert(.toggleButton) + } } @objc private func handleOnSwitchValueChanged() { diff --git a/ios/FluentUI/Other Cells/CenteredLabelCell.swift b/Sources/FluentUI_iOS/Components/Other Cells/CenteredLabelCell.swift similarity index 98% rename from ios/FluentUI/Other Cells/CenteredLabelCell.swift rename to Sources/FluentUI_iOS/Components/Other Cells/CenteredLabelCell.swift index 1ae7cf6ce4..1034f450fc 100644 --- a/ios/FluentUI/Other Cells/CenteredLabelCell.swift +++ b/Sources/FluentUI_iOS/Components/Other Cells/CenteredLabelCell.swift @@ -8,7 +8,7 @@ import UIKit // MARK: CenteredLabelCell @objc(MSFCenteredLabelCell) -open class CenteredLabelCell: UITableViewCell, TokenizedControlInternal { +open class CenteredLabelCell: UITableViewCell, TokenizedControl { public static let identifier: String = "CenteredLabelCell" public typealias TokenSetKeyType = TableViewCellTokenSet.Tokens diff --git a/ios/FluentUI/Other Cells/OtherCells.resources.xcfilelist b/Sources/FluentUI_iOS/Components/Other Cells/OtherCells.resources.xcfilelist similarity index 100% rename from ios/FluentUI/Other Cells/OtherCells.resources.xcfilelist rename to Sources/FluentUI_iOS/Components/Other Cells/OtherCells.resources.xcfilelist diff --git a/ios/FluentUI/People Picker/PeoplePicker.swift b/Sources/FluentUI_iOS/Components/People Picker/PeoplePicker.swift similarity index 100% rename from ios/FluentUI/People Picker/PeoplePicker.swift rename to Sources/FluentUI_iOS/Components/People Picker/PeoplePicker.swift diff --git a/ios/FluentUI/People Picker/PeoplePickerTokenSet.swift b/Sources/FluentUI_iOS/Components/People Picker/PeoplePickerTokenSet.swift similarity index 100% rename from ios/FluentUI/People Picker/PeoplePickerTokenSet.swift rename to Sources/FluentUI_iOS/Components/People Picker/PeoplePickerTokenSet.swift diff --git a/ios/FluentUI/People Picker/PersonaBadgeViewDataSource.swift b/Sources/FluentUI_iOS/Components/People Picker/PersonaBadgeViewDataSource.swift similarity index 100% rename from ios/FluentUI/People Picker/PersonaBadgeViewDataSource.swift rename to Sources/FluentUI_iOS/Components/People Picker/PersonaBadgeViewDataSource.swift diff --git a/ios/FluentUI/People Picker/PersonaCell.swift b/Sources/FluentUI_iOS/Components/People Picker/PersonaCell.swift similarity index 100% rename from ios/FluentUI/People Picker/PersonaCell.swift rename to Sources/FluentUI_iOS/Components/People Picker/PersonaCell.swift diff --git a/ios/FluentUI/People Picker/PersonaListView.swift b/Sources/FluentUI_iOS/Components/People Picker/PersonaListView.swift similarity index 100% rename from ios/FluentUI/People Picker/PersonaListView.swift rename to Sources/FluentUI_iOS/Components/People Picker/PersonaListView.swift diff --git a/ios/FluentUI/PersonaButton/MSFPersonaButton.swift b/Sources/FluentUI_iOS/Components/PersonaButton/MSFPersonaButton.swift similarity index 100% rename from ios/FluentUI/PersonaButton/MSFPersonaButton.swift rename to Sources/FluentUI_iOS/Components/PersonaButton/MSFPersonaButton.swift diff --git a/ios/FluentUI/PersonaButton/PersonaButton.swift b/Sources/FluentUI_iOS/Components/PersonaButton/PersonaButton.swift similarity index 100% rename from ios/FluentUI/PersonaButton/PersonaButton.swift rename to Sources/FluentUI_iOS/Components/PersonaButton/PersonaButton.swift diff --git a/ios/FluentUI/PersonaButton/PersonaButtonModifiers.swift b/Sources/FluentUI_iOS/Components/PersonaButton/PersonaButtonModifiers.swift similarity index 100% rename from ios/FluentUI/PersonaButton/PersonaButtonModifiers.swift rename to Sources/FluentUI_iOS/Components/PersonaButton/PersonaButtonModifiers.swift diff --git a/ios/FluentUI/PersonaButton/PersonaButtonTokenSet.swift b/Sources/FluentUI_iOS/Components/PersonaButton/PersonaButtonTokenSet.swift similarity index 100% rename from ios/FluentUI/PersonaButton/PersonaButtonTokenSet.swift rename to Sources/FluentUI_iOS/Components/PersonaButton/PersonaButtonTokenSet.swift diff --git a/ios/FluentUI/PersonaButtonCarousel/MSFPersonaButtonCarousel.swift b/Sources/FluentUI_iOS/Components/PersonaButtonCarousel/MSFPersonaButtonCarousel.swift similarity index 100% rename from ios/FluentUI/PersonaButtonCarousel/MSFPersonaButtonCarousel.swift rename to Sources/FluentUI_iOS/Components/PersonaButtonCarousel/MSFPersonaButtonCarousel.swift diff --git a/ios/FluentUI/PersonaButtonCarousel/PersonaButtonCarousel.swift b/Sources/FluentUI_iOS/Components/PersonaButtonCarousel/PersonaButtonCarousel.swift similarity index 100% rename from ios/FluentUI/PersonaButtonCarousel/PersonaButtonCarousel.swift rename to Sources/FluentUI_iOS/Components/PersonaButtonCarousel/PersonaButtonCarousel.swift diff --git a/ios/FluentUI/PersonaButtonCarousel/PersonaButtonCarouselModifiers.swift b/Sources/FluentUI_iOS/Components/PersonaButtonCarousel/PersonaButtonCarouselModifiers.swift similarity index 100% rename from ios/FluentUI/PersonaButtonCarousel/PersonaButtonCarouselModifiers.swift rename to Sources/FluentUI_iOS/Components/PersonaButtonCarousel/PersonaButtonCarouselModifiers.swift diff --git a/ios/FluentUI/PersonaButtonCarousel/PersonaButtonCarouselTokenSet.swift b/Sources/FluentUI_iOS/Components/PersonaButtonCarousel/PersonaButtonCarouselTokenSet.swift similarity index 100% rename from ios/FluentUI/PersonaButtonCarousel/PersonaButtonCarouselTokenSet.swift rename to Sources/FluentUI_iOS/Components/PersonaButtonCarousel/PersonaButtonCarouselTokenSet.swift diff --git a/ios/FluentUI/Pill Button Bar/PillButton.swift b/Sources/FluentUI_iOS/Components/Pill Button Bar/PillButton.swift similarity index 99% rename from ios/FluentUI/Pill Button Bar/PillButton.swift rename to Sources/FluentUI_iOS/Components/Pill Button Bar/PillButton.swift index 58bb113506..8cd300fb83 100644 --- a/ios/FluentUI/Pill Button Bar/PillButton.swift +++ b/Sources/FluentUI_iOS/Components/Pill Button Bar/PillButton.swift @@ -9,7 +9,7 @@ import UIKit /// A `PillButton` is a button in the shape of a pill that can have two states: on (Selected) and off (not selected) @objc(MSFPillButton) -open class PillButton: UIButton, TokenizedControlInternal { +open class PillButton: UIButton, TokenizedControl { open override func didUpdateFocus(in context: UIFocusUpdateContext, with coordinator: UIFocusAnimationCoordinator) { guard self == context.nextFocusedView || self == context.previouslyFocusedView else { @@ -176,7 +176,6 @@ open class PillButton: UIButton, TokenizedControlInternal { updateAttributedTitle() } - @available(iOS 15, *) private func updateAttributedTitle() { let itemTitle = pillBarItem.title var attributedTitle = AttributedString(itemTitle) diff --git a/ios/FluentUI/Pill Button Bar/PillButtonBar.swift b/Sources/FluentUI_iOS/Components/Pill Button Bar/PillButtonBar.swift similarity index 95% rename from ios/FluentUI/Pill Button Bar/PillButtonBar.swift rename to Sources/FluentUI_iOS/Components/Pill Button Bar/PillButtonBar.swift index 2c8e01795a..224ccccc16 100644 --- a/ios/FluentUI/Pill Button Bar/PillButtonBar.swift +++ b/Sources/FluentUI_iOS/Components/Pill Button Bar/PillButtonBar.swift @@ -81,20 +81,6 @@ open class PillButtonBar: UIScrollView { } } - public override var bounds: CGRect { - didSet { - if bounds.width > 0, lastKnownScrollFrameWidth > 0, bounds.width != lastKnownScrollFrameWidth { - // Frame changes can happen because of rotation, split view or adding the view for the first - // time into a superview. First time layout already has buttons in default sizes, recreate - // them so that the next time we layout subviews we'll recalculate their optimal sizes. - recreateButtons() - stackView.spacing = Constants.minButtonsSpacing - } - - lastKnownScrollFrameWidth = bounds.width - } - } - /// Initializes the PillButtonBar using the provided style. /// /// - Parameters: @@ -207,8 +193,6 @@ open class PillButtonBar: UIScrollView { private var buttons = [PillButton]() - private var lastKnownScrollFrameWidth: CGFloat = 0.0 - private var needsButtonSizeReconfiguration: Bool = false private var selectedButton: PillButton? { @@ -394,19 +378,6 @@ open class PillButtonBar: UIScrollView { return nil } - private func recreateButtons() { - let selectedItem = selectedButton?.pillBarItem - selectedButton = nil - - let currentItems = items - items = nil - items = currentItems - - if let selectedItem = selectedItem { - selectItem(selectedItem) - } - } - private func setupScrollView() { if effectiveUserInterfaceLayoutDirection == .rightToLeft { transform = CGAffineTransform(rotationAngle: CGFloat(Double.pi)) diff --git a/ios/FluentUI/Pill Button Bar/PillButtonTokenSet.swift b/Sources/FluentUI_iOS/Components/Pill Button Bar/PillButtonTokenSet.swift similarity index 100% rename from ios/FluentUI/Pill Button Bar/PillButtonTokenSet.swift rename to Sources/FluentUI_iOS/Components/Pill Button Bar/PillButtonTokenSet.swift diff --git a/ios/FluentUI/Popup Menu/PopupMenuController.swift b/Sources/FluentUI_iOS/Components/Popup Menu/PopupMenuController.swift similarity index 100% rename from ios/FluentUI/Popup Menu/PopupMenuController.swift rename to Sources/FluentUI_iOS/Components/Popup Menu/PopupMenuController.swift diff --git a/ios/FluentUI/Popup Menu/PopupMenuItem.swift b/Sources/FluentUI_iOS/Components/Popup Menu/PopupMenuItem.swift similarity index 97% rename from ios/FluentUI/Popup Menu/PopupMenuItem.swift rename to Sources/FluentUI_iOS/Components/Popup Menu/PopupMenuItem.swift index d4b36f48f6..2d169b3c0d 100644 --- a/ios/FluentUI/Popup Menu/PopupMenuItem.swift +++ b/Sources/FluentUI_iOS/Components/Popup Menu/PopupMenuItem.swift @@ -101,6 +101,10 @@ open class PopupMenuItem: NSObject, PopupMenuTemplateItem, FluentThemeable { self.init(image: image, selectedImage: selectedImage, title: title, subtitle: subtitle, isEnabled: isEnabled, isSelected: isSelected, executes: executionMode, onSelected: onSelected, isAccessoryCheckmarkVisible: isAccessoryCheckmarkVisible) } + public func isApplicableThemeChange(_ notification: Notification) -> Bool { + return true + } + lazy var tokenSet: PopupMenuItemTokenSet = { PopupMenuItemTokenSet(customViewSize: { self.image != nil ? .small : .zero }) }() diff --git a/ios/FluentUI/Popup Menu/PopupMenuItemCell.swift b/Sources/FluentUI_iOS/Components/Popup Menu/PopupMenuItemCell.swift similarity index 100% rename from ios/FluentUI/Popup Menu/PopupMenuItemCell.swift rename to Sources/FluentUI_iOS/Components/Popup Menu/PopupMenuItemCell.swift diff --git a/ios/FluentUI/Popup Menu/PopupMenuItemTokenSet.swift b/Sources/FluentUI_iOS/Components/Popup Menu/PopupMenuItemTokenSet.swift similarity index 100% rename from ios/FluentUI/Popup Menu/PopupMenuItemTokenSet.swift rename to Sources/FluentUI_iOS/Components/Popup Menu/PopupMenuItemTokenSet.swift diff --git a/ios/FluentUI/Popup Menu/PopupMenuProtocols.swift b/Sources/FluentUI_iOS/Components/Popup Menu/PopupMenuProtocols.swift similarity index 100% rename from ios/FluentUI/Popup Menu/PopupMenuProtocols.swift rename to Sources/FluentUI_iOS/Components/Popup Menu/PopupMenuProtocols.swift diff --git a/ios/FluentUI/Popup Menu/PopupMenuSection.swift b/Sources/FluentUI_iOS/Components/Popup Menu/PopupMenuSection.swift similarity index 100% rename from ios/FluentUI/Popup Menu/PopupMenuSection.swift rename to Sources/FluentUI_iOS/Components/Popup Menu/PopupMenuSection.swift diff --git a/ios/FluentUI/Popup Menu/PopupMenuSectionHeaderView.swift b/Sources/FluentUI_iOS/Components/Popup Menu/PopupMenuSectionHeaderView.swift similarity index 100% rename from ios/FluentUI/Popup Menu/PopupMenuSectionHeaderView.swift rename to Sources/FluentUI_iOS/Components/Popup Menu/PopupMenuSectionHeaderView.swift diff --git a/ios/FluentUI/Popup Menu/PopupMenuTokenSet.swift b/Sources/FluentUI_iOS/Components/Popup Menu/PopupMenuTokenSet.swift similarity index 100% rename from ios/FluentUI/Popup Menu/PopupMenuTokenSet.swift rename to Sources/FluentUI_iOS/Components/Popup Menu/PopupMenuTokenSet.swift diff --git a/ios/FluentUI/Presenters/CardPresentationController.swift b/Sources/FluentUI_iOS/Components/Presenters/CardPresentationController.swift similarity index 100% rename from ios/FluentUI/Presenters/CardPresentationController.swift rename to Sources/FluentUI_iOS/Components/Presenters/CardPresentationController.swift diff --git a/ios/FluentUI/Presenters/CardPresenterNavigationController.swift b/Sources/FluentUI_iOS/Components/Presenters/CardPresenterNavigationController.swift similarity index 100% rename from ios/FluentUI/Presenters/CardPresenterNavigationController.swift rename to Sources/FluentUI_iOS/Components/Presenters/CardPresenterNavigationController.swift diff --git a/ios/FluentUI/Presenters/CardTransitionAnimator.swift b/Sources/FluentUI_iOS/Components/Presenters/CardTransitionAnimator.swift similarity index 100% rename from ios/FluentUI/Presenters/CardTransitionAnimator.swift rename to Sources/FluentUI_iOS/Components/Presenters/CardTransitionAnimator.swift diff --git a/ios/FluentUI/Presenters/PageCardPresenterController.swift b/Sources/FluentUI_iOS/Components/Presenters/PageCardPresenterController.swift similarity index 99% rename from ios/FluentUI/Presenters/PageCardPresenterController.swift rename to Sources/FluentUI_iOS/Components/Presenters/PageCardPresenterController.swift index 55578fe24d..8d5a804c63 100644 --- a/ios/FluentUI/Presenters/PageCardPresenterController.swift +++ b/Sources/FluentUI_iOS/Components/Presenters/PageCardPresenterController.swift @@ -83,7 +83,7 @@ open class PageCardPresenterController: UIViewController { } private func updatePageControlColors() { - let color = GlobalTokens.neutralColor(.white) + let color: UIColor = GlobalTokens.neutralColor(.white) pageControl.pageIndicatorTintColor = color.withAlphaComponent(0.5) pageControl.currentPageIndicatorTintColor = color diff --git a/ios/FluentUI/ResizingHandleView/ResizingHandleTokenSet.swift b/Sources/FluentUI_iOS/Components/ResizingHandleView/ResizingHandleTokenSet.swift similarity index 100% rename from ios/FluentUI/ResizingHandleView/ResizingHandleTokenSet.swift rename to Sources/FluentUI_iOS/Components/ResizingHandleView/ResizingHandleTokenSet.swift diff --git a/ios/FluentUI/ResizingHandleView/ResizingHandleView.swift b/Sources/FluentUI_iOS/Components/ResizingHandleView/ResizingHandleView.swift similarity index 97% rename from ios/FluentUI/ResizingHandleView/ResizingHandleView.swift rename to Sources/FluentUI_iOS/Components/ResizingHandleView/ResizingHandleView.swift index 323a53c02f..d48b7f4d94 100644 --- a/ios/FluentUI/ResizingHandleView/ResizingHandleView.swift +++ b/Sources/FluentUI_iOS/Components/ResizingHandleView/ResizingHandleView.swift @@ -8,7 +8,7 @@ import UIKit // MARK: - ResizingHandleView @objc(MSFResizingHandleView) -open class ResizingHandleView: UIView, TokenizedControlInternal { +open class ResizingHandleView: UIView, TokenizedControl { @objc public static let height: CGFloat = 20 private lazy var markLayer: CALayer = { diff --git a/ios/FluentUI/SegmentedControl/SegmentItem.swift b/Sources/FluentUI_iOS/Components/SegmentedControl/SegmentItem.swift similarity index 100% rename from ios/FluentUI/SegmentedControl/SegmentItem.swift rename to Sources/FluentUI_iOS/Components/SegmentedControl/SegmentItem.swift diff --git a/ios/FluentUI/SegmentedControl/SegmentPillButton.swift b/Sources/FluentUI_iOS/Components/SegmentedControl/SegmentPillButton.swift similarity index 100% rename from ios/FluentUI/SegmentedControl/SegmentPillButton.swift rename to Sources/FluentUI_iOS/Components/SegmentedControl/SegmentPillButton.swift diff --git a/ios/FluentUI/SegmentedControl/SegmentedControl.swift b/Sources/FluentUI_iOS/Components/SegmentedControl/SegmentedControl.swift similarity index 99% rename from ios/FluentUI/SegmentedControl/SegmentedControl.swift rename to Sources/FluentUI_iOS/Components/SegmentedControl/SegmentedControl.swift index 5a49e687fb..0a0b939c62 100644 --- a/ios/FluentUI/SegmentedControl/SegmentedControl.swift +++ b/Sources/FluentUI_iOS/Components/SegmentedControl/SegmentedControl.swift @@ -7,7 +7,7 @@ import UIKit // MARK: SegmentedControl /// A styled segmented control that should be used instead of UISegmentedControl. It is designed to flex the button width proportionally to the control's width. @objc(MSFSegmentedControl) -open class SegmentedControl: UIView, TokenizedControlInternal { +open class SegmentedControl: UIView, TokenizedControl { private struct Constants { static let iPadMinimumWidth: CGFloat = 375 } diff --git a/ios/FluentUI/SegmentedControl/SegmentedControlTokenSet.swift b/Sources/FluentUI_iOS/Components/SegmentedControl/SegmentedControlTokenSet.swift similarity index 100% rename from ios/FluentUI/SegmentedControl/SegmentedControlTokenSet.swift rename to Sources/FluentUI_iOS/Components/SegmentedControl/SegmentedControlTokenSet.swift diff --git a/ios/FluentUI/Separator/Separator.swift b/Sources/FluentUI_iOS/Components/Separator/Separator.swift similarity index 97% rename from ios/FluentUI/Separator/Separator.swift rename to Sources/FluentUI_iOS/Components/Separator/Separator.swift index 72120db724..4ffa37c8c8 100644 --- a/ios/FluentUI/Separator/Separator.swift +++ b/Sources/FluentUI_iOS/Components/Separator/Separator.swift @@ -16,7 +16,7 @@ public enum SeparatorOrientation: Int { // MARK: - Separator @objc(MSFSeparator) -open class Separator: UIView, TokenizedControlInternal { +open class Separator: UIView, TokenizedControl { public typealias TokenSetKeyType = SeparatorTokenSet.Tokens lazy public var tokenSet: SeparatorTokenSet = .init() diff --git a/ios/FluentUI/Separator/SeparatorTokenSet.swift b/Sources/FluentUI_iOS/Components/Separator/SeparatorTokenSet.swift similarity index 100% rename from ios/FluentUI/Separator/SeparatorTokenSet.swift rename to Sources/FluentUI_iOS/Components/Separator/SeparatorTokenSet.swift diff --git a/ios/FluentUI/Shimmer/ShimmerLinesView.swift b/Sources/FluentUI_iOS/Components/Shimmer/ShimmerLinesView.swift similarity index 100% rename from ios/FluentUI/Shimmer/ShimmerLinesView.swift rename to Sources/FluentUI_iOS/Components/Shimmer/ShimmerLinesView.swift diff --git a/ios/FluentUI/Shimmer/ShimmerTokenSet.swift b/Sources/FluentUI_iOS/Components/Shimmer/ShimmerTokenSet.swift similarity index 100% rename from ios/FluentUI/Shimmer/ShimmerTokenSet.swift rename to Sources/FluentUI_iOS/Components/Shimmer/ShimmerTokenSet.swift diff --git a/ios/FluentUI/Shimmer/ShimmerView.swift b/Sources/FluentUI_iOS/Components/Shimmer/ShimmerView.swift similarity index 99% rename from ios/FluentUI/Shimmer/ShimmerView.swift rename to Sources/FluentUI_iOS/Components/Shimmer/ShimmerView.swift index 307f0da51e..3163bcbf28 100644 --- a/ios/FluentUI/Shimmer/ShimmerView.swift +++ b/Sources/FluentUI_iOS/Components/Shimmer/ShimmerView.swift @@ -7,7 +7,7 @@ import UIKit /// View that converts the subviews of a container view into a loading state with the "shimmering" effect. @objc(MSFShimmerView) -open class ShimmerView: UIView, TokenizedControlInternal { +open class ShimmerView: UIView, TokenizedControl { /// Optional synchronizer to sync multiple shimmer views. @objc open weak var animationSynchronizer: AnimationSynchronizerProtocol? diff --git a/ios/FluentUI/Tab Bar/SideTabBar.swift b/Sources/FluentUI_iOS/Components/Tab Bar/SideTabBar.swift similarity index 99% rename from ios/FluentUI/Tab Bar/SideTabBar.swift rename to Sources/FluentUI_iOS/Components/Tab Bar/SideTabBar.swift index 9c63e8ca80..4d3408fcde 100644 --- a/ios/FluentUI/Tab Bar/SideTabBar.swift +++ b/Sources/FluentUI_iOS/Components/Tab Bar/SideTabBar.swift @@ -23,7 +23,7 @@ public protocol SideTabBarDelegate { /// View for a vertical side tab bar that can be used for app navigation. /// Optimized for horizontal regular + vertical regular size class configuration. Prefer using TabBarView for other size class configurations. @objc(MSFSideTabBar) -open class SideTabBar: UIView, TokenizedControlInternal { +open class SideTabBar: UIView, TokenizedControl { /// Delegate to handle user interactions in the side tab bar. @objc public weak var delegate: SideTabBarDelegate? { didSet { diff --git a/ios/FluentUI/Tab Bar/SideTabBarTokenSet.swift b/Sources/FluentUI_iOS/Components/Tab Bar/SideTabBarTokenSet.swift similarity index 100% rename from ios/FluentUI/Tab Bar/SideTabBarTokenSet.swift rename to Sources/FluentUI_iOS/Components/Tab Bar/SideTabBarTokenSet.swift diff --git a/ios/FluentUI/Tab Bar/TabBarItem.swift b/Sources/FluentUI_iOS/Components/Tab Bar/TabBarItem.swift similarity index 100% rename from ios/FluentUI/Tab Bar/TabBarItem.swift rename to Sources/FluentUI_iOS/Components/Tab Bar/TabBarItem.swift diff --git a/ios/FluentUI/Tab Bar/TabBarItemTokenSet.swift b/Sources/FluentUI_iOS/Components/Tab Bar/TabBarItemTokenSet.swift similarity index 100% rename from ios/FluentUI/Tab Bar/TabBarItemTokenSet.swift rename to Sources/FluentUI_iOS/Components/Tab Bar/TabBarItemTokenSet.swift diff --git a/ios/FluentUI/Tab Bar/TabBarItemView.swift b/Sources/FluentUI_iOS/Components/Tab Bar/TabBarItemView.swift similarity index 88% rename from ios/FluentUI/Tab Bar/TabBarItemView.swift rename to Sources/FluentUI_iOS/Components/Tab Bar/TabBarItemView.swift index f095c1dcbe..ae9ce6b954 100644 --- a/ios/FluentUI/Tab Bar/TabBarItemView.swift +++ b/Sources/FluentUI_iOS/Components/Tab Bar/TabBarItemView.swift @@ -5,7 +5,7 @@ import UIKit -class TabBarItemView: UIControl, TokenizedControlInternal { +class TabBarItemView: UIControl, TokenizedControl { let item: TabBarItem typealias TokenSetKeyType = TabBarItemTokenSet.Tokens @@ -19,8 +19,15 @@ class TabBarItemView: UIControl, TokenizedControlInternal { override var isEnabled: Bool { didSet { - isUserInteractionEnabled = isEnabled - updateColors() + if isEnabled != oldValue { + isUserInteractionEnabled = isEnabled + if isEnabled { + accessibilityTraits.remove(.notEnabled) + } else { + accessibilityTraits.insert(.notEnabled) + } + updateColors() + } } } @@ -78,6 +85,15 @@ class TabBarItemView: UIControl, TokenizedControlInternal { } } + /// The main gradient layer to be applied to the TabBarItemView with the gradient style. + var gradient: CAGradientLayer? { + didSet { + if oldValue != gradient { + updateColors() + } + } + } + init(item: TabBarItem, showsTitle: Bool, canResizeImage: Bool = true) { self.canResizeImage = canResizeImage self.item = item @@ -173,8 +189,10 @@ class TabBarItemView: UIControl, TokenizedControlInternal { override func didMoveToWindow() { super.didMoveToWindow() - tokenSet.update(fluentTheme) - updateAppearance() + if window != nil { + tokenSet.update(fluentTheme) + updateAppearance() + } } private var badgeValue: String? { @@ -259,12 +277,38 @@ class TabBarItemView: UIControl, TokenizedControlInternal { return alwaysShowTitleBelowImage || (traitCollection.horizontalSizeClass == .compact && traitCollection.verticalSizeClass == .regular) } - private func updateColors() { - let selectedColor = tokenSet[.selectedColor].uiColor - let disabledColor = tokenSet[.disabledColor].uiColor + private var selectedImage: UIImage? { + let selectedImage = item.selectedImage(isInPortraitMode: isInPortraitMode, labelIsHidden: titleLabel.isHidden) + guard let gradient else { + return selectedImage + } + + // This is necessary because imageView.tintColor does not work with UIColor(patternImage:). + let mask = CALayer() + mask.contents = selectedImage?.cgImage + mask.frame = imageView.bounds + gradient.frame = imageView.bounds + gradient.mask = mask + let renderer = UIGraphicsImageRenderer(bounds: imageView.bounds) + let gradientImage = renderer.image { rendererContext in + gradient.render(in: rendererContext.cgContext) + } + return gradientImage + } - titleLabel.textColor = isEnabled ? (isSelected ? selectedColor : tokenSet[.unselectedTextColor].uiColor) : disabledColor - imageView.tintColor = isEnabled ? (isSelected ? selectedColor : tokenSet[.unselectedImageColor].uiColor) : disabledColor + private func updateColors() { + if isEnabled { + // We cannot use UIColor(patternImage:) for the tintColor of a UIView. Instead, we have to + // fully replace the image, so we should not re-tint it here when we have a gradient. + let shouldTint = isSelected && gradient == nil + let tintColor = tokenSet[.selectedColor].uiColor + titleLabel.textColor = shouldTint ? tintColor : tokenSet[.unselectedTextColor].uiColor + imageView.tintColor = shouldTint ? tintColor : tokenSet[.unselectedImageColor].uiColor + } else { + let disabledColor = tokenSet[.disabledColor].uiColor + titleLabel.textColor = disabledColor + imageView.tintColor = disabledColor + } } private func updateImage() { @@ -272,7 +316,7 @@ class TabBarItemView: UIControl, TokenizedControlInternal { // UIImageView in iOS 16 where highlighted images lose their tint color in certain scenarios. While we wait for a fix, // this is a straightforward workaround that gets us the same effect without triggering the bug. imageView.image = isSelected ? - item.selectedImage(isInPortraitMode: isInPortraitMode, labelIsHidden: titleLabel.isHidden) : + selectedImage : item.unselectedImage(isInPortraitMode: isInPortraitMode, labelIsHidden: titleLabel.isHidden) } diff --git a/ios/FluentUI/Tab Bar/TabBarTokenSet.swift b/Sources/FluentUI_iOS/Components/Tab Bar/TabBarTokenSet.swift similarity index 100% rename from ios/FluentUI/Tab Bar/TabBarTokenSet.swift rename to Sources/FluentUI_iOS/Components/Tab Bar/TabBarTokenSet.swift diff --git a/ios/FluentUI/Tab Bar/TabBarView.swift b/Sources/FluentUI_iOS/Components/Tab Bar/TabBarView.swift similarity index 94% rename from ios/FluentUI/Tab Bar/TabBarView.swift rename to Sources/FluentUI_iOS/Components/Tab Bar/TabBarView.swift index 8025444b7f..7dd1093d82 100644 --- a/ios/FluentUI/Tab Bar/TabBarView.swift +++ b/Sources/FluentUI_iOS/Components/Tab Bar/TabBarView.swift @@ -20,7 +20,7 @@ public protocol TabBarViewDelegate { /// Set up `items` array to determine the order of `TabBarItems` to show. /// Use `selectedItem` property to change the selected tab bar item. @objc(MSFTabBarView) -open class TabBarView: UIView, TokenizedControlInternal { +open class TabBarView: UIView, TokenizedControl { /// List of TabBarItems in the TabBarView. Order of the array is the order of the subviews. @objc open var items: [TabBarItem] = [] { willSet { @@ -64,6 +64,13 @@ open class TabBarView: UIView, TokenizedControlInternal { } } } + + /// An optional gradient to display for the selected item. + @objc public var selectedItemGradient: CAGradientLayer? { + didSet { + updateAppearance() + } + } @objc public weak var delegate: TabBarViewDelegate? @@ -146,8 +153,10 @@ open class TabBarView: UIView, TokenizedControlInternal { return nil } + @objc public static let tabBarPadHeight: CGFloat = TabBarTokenSet.padHeight + private struct Constants { - static let maxTabCount: Int = 5 + static let maxTabCount: Int = 6 } private let backgroundView: UIVisualEffectView = { @@ -208,6 +217,10 @@ open class TabBarView: UIView, TokenizedControlInternal { forToken: .titleLabelFontPortrait) tabBarItemTokenSet.setOverrideValue(tokenSet.overrideValue(forToken: .tabBarItemTitleLabelFontLandscape), forToken: .titleLabelFontLandscape) + + if let selectedItemGradient { + tabBarItemView.gradient = selectedItemGradient + } } } topBorderLine.tokenSet[.color] = tokenSet[.separatorColor] diff --git a/Sources/FluentUI_iOS/Components/Table View/TableView.resources.xcfilelist b/Sources/FluentUI_iOS/Components/Table View/TableView.resources.xcfilelist new file mode 100644 index 0000000000..0725233e4c --- /dev/null +++ b/Sources/FluentUI_iOS/Components/Table View/TableView.resources.xcfilelist @@ -0,0 +1 @@ +chevron-right-20x20.imageset diff --git a/ios/FluentUI/Table View/TableViewCell.swift b/Sources/FluentUI_iOS/Components/Table View/TableViewCell.swift similarity index 97% rename from ios/FluentUI/Table View/TableViewCell.swift rename to Sources/FluentUI_iOS/Components/Table View/TableViewCell.swift index a17f6f4a27..ff03d47cee 100644 --- a/ios/FluentUI/Table View/TableViewCell.swift +++ b/Sources/FluentUI_iOS/Components/Table View/TableViewCell.swift @@ -5,85 +5,6 @@ import UIKit -// MARK: TableViewCellAccessoryType - -@objc(MSFTableViewCellAccessoryType) -public enum TableViewCellAccessoryType: Int { - case none - case disclosureIndicator - case detailButton - case checkmark - - private struct Constants { - static let horizontalSpacing: CGFloat = 16 - static let height: CGFloat = 44 - } - - var icon: UIImage? { - let icon: UIImage? - switch self { - case .none: - icon = nil - case .disclosureIndicator: - icon = UIImage.staticImageNamed("iOS-chevron-right-20x20") - case .detailButton: - icon = UIImage.staticImageNamed("more-24x24") - case .checkmark: - icon = UIImage.staticImageNamed("checkmark-24x24") - } - return icon - } - - func iconColor(tokenSet: TableViewCellTokenSet, fluentTheme: FluentTheme) -> UIColor? { - switch self { - case .none: - return nil - case .disclosureIndicator: - return tokenSet[.accessoryDisclosureIndicatorColor].uiColor - case .detailButton: - return tokenSet[.accessoryDetailButtonColor].uiColor - case .checkmark: - return tokenSet[.accessoryCheckmarkColor].uiColor - } - } - - var size: CGSize { - if self == .none { - return .zero - } - // Horizontal spacing includes 16pt spacing from content to icon and 16pt spacing from icon to trailing edge of cell - let horizontalSpacing: CGFloat = Constants.horizontalSpacing * 2 - let iconWidth: CGFloat = icon?.size.width ?? 0 - return CGSize(width: horizontalSpacing + iconWidth, height: Constants.height) - } -} - -// Different background color is used for `TableViewCell` by getting the appropriate tokens and integrate with the cell's `UIBackgroundConfiguration` -@objc(MSFTableViewCellBackgroundStyleType) -public enum TableViewCellBackgroundStyleType: Int { - // use for flat list of cells - case plain - // use for grouped list of cells - case grouped - // clear background so that TableView's background can be shown - case clear - // in case clients want to override the background on their own without using token system - case custom - - func defaultColor(tokenSet: TableViewCellTokenSet) -> UIColor? { - switch self { - case .plain: - return tokenSet[.cellBackgroundColor].uiColor - case .grouped: - return tokenSet[.cellBackgroundGroupedColor].uiColor - case .clear: - return .clear - case .custom: - return nil - } - } -} - // Supported vertical alignment for accessory views in `TableViewCell` @objc(MSFTableViewCellAccessoryViewVerticalAlignment) public enum TableViewCellAccessoryViewVerticalAlignment: Int { @@ -113,7 +34,7 @@ Specify `accessoryType` on setup to show either a disclosure indicator or a `det NOTE: This cell implements its own custom separator. Make sure to remove the UITableViewCell built-in separator by setting `separatorStyle = .none` on your table view. To remove the cell's custom separator set `bottomSeparatorType` to `.none`. */ @objc(MSFTableViewCell) -open class TableViewCell: UITableViewCell, TokenizedControlInternal { +open class TableViewCell: UITableViewCell, TokenizedControl { @objc(MSFTableViewCellSeparatorType) public enum SeparatorType: Int { case none @@ -351,7 +272,7 @@ open class TableViewCell: UITableViewCell, TokenizedControlInternal { subtitleHeight: labelSize(text: subtitle, attributedText: attributedSubtitle, isAttributedTextSet: isAttributedSubtitleSet, - font: subtitleFont ?? (layoutType == .twoLines ? tokenSet[.subtitleTwoLinesFont].uiFont : tokenSet[.subtitleThreeLinesFont].uiFont), + font: subtitleFont ?? (layoutType == .threeLines ? tokenSet[.subtitleThreeLinesFont].uiFont : tokenSet[.subtitleTwoLinesFont].uiFont), numberOfLines: subtitleNumberOfLines, textAreaWidth: textAreaWidth, leadingAccessoryView: subtitleLeadingAccessoryView, @@ -1116,7 +1037,13 @@ open class TableViewCell: UITableViewCell, TokenizedControlInternal { } if let customSwitch = customAccessoryView as? UISwitch { if isEnabled && customSwitch.isEnabled { - return "Accessibility.TableViewCell.Switch.Hint".localized + var allowOSHint = false + if #available(iOS 17, *) { + if accessibilityTraits.contains(.toggleButton) { + allowOSHint = true + } + } + return allowOSHint ? super.accessibilityHint : "Accessibility.TableViewCell.Switch.Hint".localized } else { return nil } @@ -1232,7 +1159,7 @@ open class TableViewCell: UITableViewCell, TokenizedControlInternal { titleLabel.font = tokenSet[.titleFont].uiFont } if !isAttributedSubtitleSet { - subtitleLabel.font = (layoutType == .twoLines ? tokenSet[.subtitleTwoLinesFont].uiFont : tokenSet[.subtitleThreeLinesFont].uiFont) + subtitleLabel.font = (layoutType == .threeLines ? tokenSet[.subtitleThreeLinesFont].uiFont : tokenSet[.subtitleTwoLinesFont].uiFont) } if !isAttributedFooterSet { footerLabel.font = tokenSet[.footerFont].uiFont @@ -1307,8 +1234,6 @@ open class TableViewCell: UITableViewCell, TokenizedControlInternal { setupBackgroundColors() - // hide system separator so we can draw our own. We prefer the container UITableView to set separatorStyle = .none - separatorInset = UIEdgeInsets(top: 0, left: CGFloat.greatestFiniteMagnitude, bottom: 0, right: 0) updateSeparator(topSeparator, with: topSeparatorType) updateSeparator(bottomSeparator, with: bottomSeparatorType) @@ -1516,6 +1441,14 @@ open class TableViewCell: UITableViewCell, TokenizedControlInternal { layoutContentSubviews() contentView.flipSubviewsForRTL() + // A hacky way to hide the system separator by squeezing it just enough to have zero width. + // This is the only known way to hide the separator without making the UITableView do it for us. + let boundsWidth = bounds.width + let targetSystemSeparatorInset = UIEdgeInsets(top: 0, left: boundsWidth, bottom: 0, right: 0) + if separatorInset.left < boundsWidth { + separatorInset = targetSystemSeparatorInset + } + layoutSeparator(topSeparator, with: topSeparatorType, at: 0) layoutSeparator(bottomSeparator, with: bottomSeparatorType, at: frame.height - bottomSeparator.frame.height) } diff --git a/ios/FluentUI/Table View/TableViewHeaderFooterView.swift b/Sources/FluentUI_iOS/Components/Table View/TableViewHeaderFooterView.swift similarity index 76% rename from ios/FluentUI/Table View/TableViewHeaderFooterView.swift rename to Sources/FluentUI_iOS/Components/Table View/TableViewHeaderFooterView.swift index 9a6fe02c77..209242a283 100644 --- a/ios/FluentUI/Table View/TableViewHeaderFooterView.swift +++ b/Sources/FluentUI_iOS/Components/Table View/TableViewHeaderFooterView.swift @@ -7,13 +7,34 @@ import UIKit // MARK: TableViewHeaderFooterViewDelegate -#if os(iOS) @objc(MSFTableViewHeaderFooterViewDelegate) public protocol TableViewHeaderFooterViewDelegate: AnyObject { /// Returns: true if the interaction with the header view should be allowed; false if the interaction should not be allowed. + @available(iOS, deprecated: 17, message: "Replaced by primaryActionForTextItem: and menuConfigurationForTextItem: for additional customization options.") + @available(visionOS, deprecated: 1, message: "Replaced by primaryActionForTextItem: and menuConfigurationForTextItem: for additional customization options.") @objc optional func headerFooterView(_ headerFooterView: TableViewHeaderFooterView, shouldInteractWith URL: URL, in characterRange: NSRange, interaction: UITextItemInteraction) -> Bool + + /// Asks the delegate for the action to be performed when interacting with a text item. If a nil action is provided, the text view + /// will request a menu to be presented on primary action if possible. + /// + /// @param headerFooterView The `TableViewHeaderFooterView` requesting the primary action. + /// @param textItem The text item for performing said action. + /// @param defaultAction The default action for the text item. Return this to perform the default action. + /// + /// @return Return a UIAction to be performed when the text item is interacted with. Return @c nil to prevent the action from being performed. + @available(iOS, introduced: 17) + @objc optional func headerFooterView(_ headerFooterView: TableViewHeaderFooterView, primaryActionFor textItem: UITextItem, defaultAction: UIAction) -> UIAction? + + /// Asks the delegate for the menu configuration to be performed when interacting with a text item. + /// + /// @param headerFooterView The `TableViewHeaderFooterView` requesting the menu. + /// @param textItem The text item for performing said action. + /// @param defaultMenu The default menu for the specified text item. + /// + /// @return Return a menu configuration to be presented when the text item is interacted with. Return @c nil to prevent the menu from being presented. + @available(iOS, introduced: 17) + @objc optional func headerFooterView(_ headerFooterView: TableViewHeaderFooterView, menuConfigurationFor textItem: UITextItem, defaultMenu: UIMenu) -> UITextItem.MenuConfiguration? } -#endif // os(iOS) // MARK: - TableViewHeaderFooterView @@ -23,7 +44,7 @@ public protocol TableViewHeaderFooterViewDelegate: AnyObject { /// The optional accessory button should only be used with `default` style headers with the `title` as a single line of text. /// Use `titleNumberOfLines` to configure the number of lines for the `title`. Headers generally use the default number of lines of 1 while footers may use a multiple number of lines. @objc(MSFTableViewHeaderFooterView) -open class TableViewHeaderFooterView: UITableViewHeaderFooterView, TokenizedControlInternal { +open class TableViewHeaderFooterView: UITableViewHeaderFooterView, TokenizedControl { @objc public static var identifier: String { return String(describing: self) } /// The height of the view based on the height of its content. @@ -125,9 +146,7 @@ open class TableViewHeaderFooterView: UITableViewHeaderFooterView, TokenizedCont } } -#if os(iOS) @objc public weak var delegate: TableViewHeaderFooterViewDelegate? -#endif // os(iOS) open override var intrinsicContentSize: CGSize { return CGSize( @@ -244,7 +263,7 @@ open class TableViewHeaderFooterView: UITableViewHeaderFooterView, TokenizedCont /// - title: The title string. /// - accessoryButtonTitle: Optional accessory button title string. @objc open func setup(style: Style, title: String, accessoryButtonTitle: String = "") { - setup(style: style, title: title, accessoryButtonTitle: accessoryButtonTitle, leadingView: nil) + setupBase(style: style, title: title, accessoryButtonTitle: accessoryButtonTitle) } /// - Parameters: @@ -253,11 +272,7 @@ open class TableViewHeaderFooterView: UITableViewHeaderFooterView, TokenizedCont /// - accessoryButtonTitle: Optional accessory button title string. /// - leadingView: An optional custom view that appears near the leading edge of the view. @objc open func setup(style: Style, title: String, accessoryButtonTitle: String = "", leadingView: UIView? = nil) { - titleView.attributedText = NSAttributedString(string: " ") // to clear attributes - titleView.text = title - titleView.isSelectable = false - - setup(style: style, accessoryButtonTitle: accessoryButtonTitle, leadingView: leadingView) + setupBase(style: style, title: title, accessoryButtonTitle: accessoryButtonTitle, leadingView: leadingView) } /// - Parameters: @@ -265,7 +280,7 @@ open class TableViewHeaderFooterView: UITableViewHeaderFooterView, TokenizedCont /// - attributedTitle: Title as an NSAttributedString for additional attributes. /// - accessoryButtonTitle: Optional accessory button title string. @objc open func setup(style: Style, attributedTitle: NSAttributedString, accessoryButtonTitle: String = "") { - setup(style: style, attributedTitle: attributedTitle, accessoryButtonTitle: accessoryButtonTitle, leadingView: nil) + setupBase(style: style, attributedTitle: attributedTitle, accessoryButtonTitle: accessoryButtonTitle) } /// - Parameters: @@ -274,10 +289,7 @@ open class TableViewHeaderFooterView: UITableViewHeaderFooterView, TokenizedCont /// - accessoryButtonTitle: Optional accessory button title string. /// - leadingView: An optional custom view that appears near the leading edge of the view. @objc open func setup(style: Style, attributedTitle: NSAttributedString, accessoryButtonTitle: String = "", leadingView: UIView? = nil) { - titleView.attributedText = attributedTitle - titleView.isSelectable = true - - setup(style: style, accessoryButtonTitle: accessoryButtonTitle, leadingView: leadingView) + setupBase(style: style, attributedTitle: attributedTitle, accessoryButtonTitle: accessoryButtonTitle, leadingView: leadingView) } /// - Parameters: @@ -285,7 +297,7 @@ open class TableViewHeaderFooterView: UITableViewHeaderFooterView, TokenizedCont /// - title: The title string. /// - accessoryView: The optional custom accessory view in the trailing edge of this view. @objc open func setup(style: Style, title: String, accessoryView: UIView) { - setup(style: style, title: title, accessoryView: accessoryView, leadingView: nil) + setupBase(style: style, title: title, accessoryView: accessoryView) } /// - Parameters: @@ -296,30 +308,48 @@ open class TableViewHeaderFooterView: UITableViewHeaderFooterView, TokenizedCont /// If `accessoryView` is set, the accessory button (if any) will be replaced by this custom view. Clients are responsible /// for the appearance and behavior of both the `accessoryView` and `leadingView`, including event handling and accessibility. @objc open func setup(style: Style, title: String, accessoryView: UIView, leadingView: UIView? = nil) { - setup(style: style, title: title, accessoryButtonTitle: "") - self.accessoryView = accessoryView - self.leadingView = leadingView + setupBase(style: style, title: title, accessoryView: accessoryView, leadingView: leadingView) } /// - Parameters: /// - style: The `TableViewHeaderFooterView.Style` used to set up the view. /// - accessoryButtonTitle: Optional accessory button title string. @objc open func setup(style: Style, accessoryButtonTitle: String) { - setup(style: style, accessoryButtonTitle: accessoryButtonTitle, leadingView: nil) + setupBase(style: style, accessoryButtonTitle: accessoryButtonTitle) } /// - Parameters: /// - style: The `TableViewHeaderFooterView.Style` used to set up the view. /// - title: The title string. @objc open func setup(style: Style, title: String) { - setup(style: style, title: title, accessoryButtonTitle: "") + setupBase(style: style, title: title) } + /// This is the base setup method. All other setup methods call this method with their parameters. /// - Parameters: /// - style: The `TableViewHeaderFooterView.Style` used to set up the view. + /// - title: The title string + /// - attributedTitle: Title as an NSAttributedString for additional attributes. /// - accessoryButtonTitle: Optional accessory button title string. + /// - accessoryView: The optional custom accessory view in the trailing edge of this view. /// - leadingView: An optional custom view that appears near the leading edge of the view. - private func setup(style: Style, accessoryButtonTitle: String, leadingView: UIView? = nil) { + private func setupBase(style: Style, + title: String? = nil, + attributedTitle: NSAttributedString? = nil, + accessoryButtonTitle: String = "", + accessoryView: UIView? = nil, + leadingView: UIView? = nil) { + if let attributedTitle { + self.attributedTitle = attributedTitle + titleView.attributedText = attributedTitle + titleView.isSelectable = true + } else { + self.attributedTitle = nil + titleView.attributedText = NSAttributedString(string: " ") // to clear attributes + titleView.text = title + titleView.isSelectable = false + } + updateTitleViewFont() switch style { case .header, .headerPrimary: @@ -329,6 +359,12 @@ open class TableViewHeaderFooterView: UITableViewHeaderFooterView, TokenizedCont } accessoryButton = !accessoryButtonTitle.isEmpty ? createAccessoryButton(withTitle: accessoryButtonTitle) : nil + + /// `accessoryButton` and `accessoryView` occupy the same space at the trailing end of the view. If both are provided, the `accessoryView` will be given priority + if accessoryView != nil { + self.accessoryView = accessoryView + } + self.leadingView = leadingView self.style = style @@ -390,9 +426,7 @@ open class TableViewHeaderFooterView: UITableViewHeaderFooterView, TokenizedCont open override func prepareForReuse() { super.prepareForReuse() -#if os(iOS) delegate = nil -#endif // os(iOS) accessoryButtonStyle = .regular titleNumberOfLines = 1 @@ -437,7 +471,12 @@ open class TableViewHeaderFooterView: UITableViewHeaderFooterView, TokenizedCont private func updateTitleViewFont() { if let window = window { let titleFont = tokenSet[.textFont].uiFont - titleView.font = titleFont + if !isUsingAttributedTitle { + titleView.font = titleFont + } else { + updateAttributedTitleWithDefaultFluentThemeAttributes() + } + // offset text container to center its content #if os(iOS) let scale = window.rootViewController?.view.contentScaleFactor ?? window.screen.scale @@ -451,8 +490,6 @@ open class TableViewHeaderFooterView: UITableViewHeaderFooterView, TokenizedCont } private func updateTitleAndBackgroundColors() { - titleView.textColor = tokenSet[.textColor].uiColor - if tableViewCellStyle == .grouped { backgroundView?.backgroundColor = tokenSet[.backgroundColorGrouped].uiColor } else if tableViewCellStyle == .plain { @@ -461,10 +498,30 @@ open class TableViewHeaderFooterView: UITableViewHeaderFooterView, TokenizedCont backgroundView?.backgroundColor = .clear } - titleView.font = tokenSet[.textFont].uiFont + if !isUsingAttributedTitle { + titleView.textColor = tokenSet[.textColor].uiColor + titleView.font = tokenSet[.textFont].uiFont + } else { + updateAttributedTitleWithDefaultFluentThemeAttributes() + } titleView.linkColor = tokenSet[.linkTextColor].uiColor } + private func updateAttributedTitleWithDefaultFluentThemeAttributes() { + if let attributedTitle = self.attributedTitle { + /// Create an attributed string with the default fluent text color and font for the given style + let attributedTitleWithFluentTheme = NSMutableAttributedString(string: attributedTitle.string, attributes: [NSAttributedString.Key.foregroundColor: tokenSet[.textColor].uiColor, NSAttributedString.Key.font: tokenSet[.textFont].uiFont]) + + /// Iterate over the attributes set by the consumer and apply them to our attributed string + attributedTitle.enumerateAttributes(in: NSRange(location: 0, length: attributedTitle.length)) { attributes, range, _ in + attributedTitleWithFluentTheme.addAttributes(attributes, range: range) + } + + /// Update the `titleView` attributed string + titleView.attributedText = attributedTitleWithFluentTheme + } + } + private func updateLeadingViewColor() { leadingView?.tintColor = tokenSet[.leadingViewColor].uiColor } @@ -500,17 +557,35 @@ open class TableViewHeaderFooterView: UITableViewHeaderFooterView, TokenizedCont @objc private func handleHeaderViewTapped() { onHeaderViewTapped?() } + + private var attributedTitle: NSAttributedString? { + didSet { + isUsingAttributedTitle = attributedTitle != nil + } + } + + private var isUsingAttributedTitle: Bool = false } // MARK: - TableViewHeaderFooterView: UITextViewDelegate extension TableViewHeaderFooterView: UITextViewDelegate { -#if os(iOS) + @available(iOS, deprecated: 17, message: "Replaced by primaryActionForTextItem: and menuConfigurationForTextItem: for additional customization options.") + @available(visionOS, deprecated: 1, message: "Replaced by primaryActionForTextItem: and menuConfigurationForTextItem: for additional customization options.") public func textView(_ textView: UITextView, shouldInteractWith URL: URL, in characterRange: NSRange, interaction: UITextItemInteraction) -> Bool { // If the delegate function is not set, return `true` to let the default interaction handle this return delegate?.headerFooterView?(self, shouldInteractWith: URL, in: characterRange, interaction: interaction) ?? true } -#endif // os(iOS) + + @available(iOS, introduced: 17) + public func textView(_ textView: UITextView, primaryActionFor textItem: UITextItem, defaultAction: UIAction) -> UIAction? { + return delegate?.headerFooterView?(self, primaryActionFor: textItem, defaultAction: defaultAction) ?? defaultAction + } + + @available(iOS, introduced: 17) + public func textView(_ textView: UITextView, menuConfigurationFor textItem: UITextItem, defaultMenu: UIMenu) -> UITextItem.MenuConfiguration? { + return delegate?.headerFooterView?(self, menuConfigurationFor: textItem, defaultMenu: defaultMenu) ?? .init(menu: defaultMenu) + } } // MARK: - TableViewHeaderFooterTitleView diff --git a/ios/FluentUI/Table View/TableViewHeaderFooterViewTokenSet.swift b/Sources/FluentUI_iOS/Components/Table View/TableViewHeaderFooterViewTokenSet.swift similarity index 100% rename from ios/FluentUI/Table View/TableViewHeaderFooterViewTokenSet.swift rename to Sources/FluentUI_iOS/Components/Table View/TableViewHeaderFooterViewTokenSet.swift diff --git a/ios/FluentUI/Table View/TableViewCellTokenSet.swift b/Sources/FluentUI_iOS/Components/TableViewListShared/TableViewCellTokenSet.swift similarity index 78% rename from ios/FluentUI/Table View/TableViewCellTokenSet.swift rename to Sources/FluentUI_iOS/Components/TableViewListShared/TableViewCellTokenSet.swift index 0405d46f0f..87e4bc5b41 100644 --- a/ios/FluentUI/Table View/TableViewCellTokenSet.swift +++ b/Sources/FluentUI_iOS/Components/TableViewListShared/TableViewCellTokenSet.swift @@ -162,7 +162,7 @@ public class TableViewCellTokenSet: ControlTokenSet { return .uiColor { theme.color(.foreground3) } case .accessoryCheckmarkColor: - return .uiColor { theme.color(.brandForeground1) } + return .uiColor { Compatibility.isDeviceIdiomVision() ? .white : theme.color(.brandForeground1) } case .separatorColor: return .uiColor { theme.color(.stroke2) } @@ -284,3 +284,82 @@ extension TableViewCellTokenSet { case small case medium } + +// MARK: TableViewCellAccessoryType + +@objc(MSFTableViewCellAccessoryType) +public enum TableViewCellAccessoryType: Int { + case none + case disclosureIndicator + case detailButton + case checkmark + + private struct Constants { + static let horizontalSpacing: CGFloat = 16 + static let height: CGFloat = 44 + } + + var icon: UIImage? { + let icon: UIImage? + switch self { + case .none: + icon = nil + case .disclosureIndicator: + icon = UIImage.staticImageNamed("iOS-chevron-right-20x20") + case .detailButton: + icon = UIImage.staticImageNamed("more-24x24") + case .checkmark: + icon = UIImage.staticImageNamed("checkmark-24x24") + } + return icon + } + + func iconColor(tokenSet: TableViewCellTokenSet, fluentTheme: FluentTheme) -> UIColor? { + switch self { + case .none: + return nil + case .disclosureIndicator: + return tokenSet[.accessoryDisclosureIndicatorColor].uiColor + case .detailButton: + return tokenSet[.accessoryDetailButtonColor].uiColor + case .checkmark: + return tokenSet[.accessoryCheckmarkColor].uiColor + } + } + + var size: CGSize { + if self == .none { + return .zero + } + // Horizontal spacing includes 16pt spacing from content to icon and 16pt spacing from icon to trailing edge of cell + let horizontalSpacing: CGFloat = Constants.horizontalSpacing * 2 + let iconWidth: CGFloat = icon?.size.width ?? 0 + return CGSize(width: horizontalSpacing + iconWidth, height: Constants.height) + } +} + +// Different background color is used for `TableViewCell` by getting the appropriate tokens and integrate with the cell's `UIBackgroundConfiguration` +@objc(MSFTableViewCellBackgroundStyleType) +public enum TableViewCellBackgroundStyleType: Int { + // use for flat list of cells + case plain + // use for grouped list of cells + case grouped + // clear background so that TableView's background can be shown + case clear + // in case clients want to override the background on their own without using token system + case custom + + func defaultColor(tokenSet: TableViewCellTokenSet) -> UIColor? { + switch self { + case .plain: + return tokenSet[.cellBackgroundColor].uiColor + case .grouped: + return tokenSet[.cellBackgroundGroupedColor].uiColor + case .clear: + return .clear + case .custom: + return nil + } + } +} diff --git a/ios/FluentUI/Table View/TableView.resources.xcfilelist b/Sources/FluentUI_iOS/Components/TableViewListShared/TableViewListShared.resources.xcfilelist similarity index 80% rename from ios/FluentUI/Table View/TableView.resources.xcfilelist rename to Sources/FluentUI_iOS/Components/TableViewListShared/TableViewListShared.resources.xcfilelist index b15012e23c..ff870ded85 100644 --- a/ios/FluentUI/Table View/TableView.resources.xcfilelist +++ b/Sources/FluentUI_iOS/Components/TableViewListShared/TableViewListShared.resources.xcfilelist @@ -1,5 +1,4 @@ checkmark-24x24.imageset -chevron-right-20x20.imageset iOS-chevron-right-20x20.imageset more-24x24.imageset selection-off.imageset diff --git a/ios/FluentUI/TextField/FluentTextField.swift b/Sources/FluentUI_iOS/Components/TextField/FluentTextField.swift similarity index 99% rename from ios/FluentUI/TextField/FluentTextField.swift rename to Sources/FluentUI_iOS/Components/TextField/FluentTextField.swift index e19314ec29..580ece3ee2 100644 --- a/ios/FluentUI/TextField/FluentTextField.swift +++ b/Sources/FluentUI_iOS/Components/TextField/FluentTextField.swift @@ -6,7 +6,7 @@ import UIKit @objc(MSFTextField) -public final class FluentTextField: UIView, UITextFieldDelegate, TokenizedControlInternal { +public final class FluentTextField: UIView, UITextFieldDelegate, TokenizedControl { public override func willMove(toWindow newWindow: UIWindow?) { super.willMove(toWindow: newWindow) guard let newWindow else { diff --git a/ios/FluentUI/TextField/FluentTextFieldInternal.swift b/Sources/FluentUI_iOS/Components/TextField/FluentTextFieldInternal.swift similarity index 100% rename from ios/FluentUI/TextField/FluentTextFieldInternal.swift rename to Sources/FluentUI_iOS/Components/TextField/FluentTextFieldInternal.swift diff --git a/ios/FluentUI/TextField/FluentTextInputError.swift b/Sources/FluentUI_iOS/Components/TextField/FluentTextInputError.swift similarity index 100% rename from ios/FluentUI/TextField/FluentTextInputError.swift rename to Sources/FluentUI_iOS/Components/TextField/FluentTextInputError.swift diff --git a/ios/FluentUI/TextField/TextField.resources.xcfilelist b/Sources/FluentUI_iOS/Components/TextField/TextField.resources.xcfilelist similarity index 100% rename from ios/FluentUI/TextField/TextField.resources.xcfilelist rename to Sources/FluentUI_iOS/Components/TextField/TextField.resources.xcfilelist diff --git a/ios/FluentUI/TextField/TextFieldTokenSet.swift b/Sources/FluentUI_iOS/Components/TextField/TextFieldTokenSet.swift similarity index 100% rename from ios/FluentUI/TextField/TextFieldTokenSet.swift rename to Sources/FluentUI_iOS/Components/TextField/TextFieldTokenSet.swift diff --git a/ios/FluentUI/Tooltip/Tooltip.resources.xcfilelist b/Sources/FluentUI_iOS/Components/Tooltip/Tooltip.resources.xcfilelist similarity index 100% rename from ios/FluentUI/Tooltip/Tooltip.resources.xcfilelist rename to Sources/FluentUI_iOS/Components/Tooltip/Tooltip.resources.xcfilelist diff --git a/ios/FluentUI/Tooltip/Tooltip.swift b/Sources/FluentUI_iOS/Components/Tooltip/Tooltip.swift similarity index 98% rename from ios/FluentUI/Tooltip/Tooltip.swift rename to Sources/FluentUI_iOS/Components/Tooltip/Tooltip.swift index f40cb10eaf..b8c2d3cadf 100644 --- a/ios/FluentUI/Tooltip/Tooltip.swift +++ b/Sources/FluentUI_iOS/Components/Tooltip/Tooltip.swift @@ -17,7 +17,7 @@ import UIKit // |--|--layer (ambient and key shadows added as sublayers) /// A styled tooltip that is presented anchored to a view. @objc(MSFTooltip) -open class Tooltip: NSObject, TokenizedControlInternal { +open class Tooltip: NSObject, TokenizedControl { /// Displays a tooltip based on the current settings, pointing to the supplied anchorView. /// If another tooltip view is already showing, it will be dismissed and the new tooltip will be shown. @@ -229,7 +229,7 @@ open class Tooltip: NSObject, TokenizedControlInternal { } @objc(MSFTooltipArrowDirection) - public enum ArrowDirection: Int { + public enum ArrowDirection: Int, CaseIterable { case up, down, left, right var isVertical: Bool { @@ -256,7 +256,7 @@ open class Tooltip: NSObject, TokenizedControlInternal { } @objc(MSFTooltipDismissMode) - public enum DismissMode: Int { + public enum DismissMode: Int, CaseIterable { case tapAnywhere case tapOnTooltip case tapOnTooltipOrAnchor diff --git a/Sources/FluentUI_iOS/Components/Tooltip/TooltipModifiers.swift b/Sources/FluentUI_iOS/Components/Tooltip/TooltipModifiers.swift new file mode 100644 index 0000000000..f4cbbc2670 --- /dev/null +++ b/Sources/FluentUI_iOS/Components/Tooltip/TooltipModifiers.swift @@ -0,0 +1,133 @@ +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// + +import SwiftUI + +public extension View { + + /// Displays a tooltip based on the current settings, pointing to the `View` being modified. + /// If another tooltip view is already showing, it will be dismissed and the new tooltip will be shown. + /// + /// - Parameters: + /// - message: The text to be displayed on the new tooltip view. + /// - title: The optional bolded text to be displayed above the message on the new tooltip view. + /// - preferredArrowDirection: The preferrred direction for the tooltip's arrow. Only the arrow's axis is guaranteed; the direction may be changed based on available space between the anchorView and the screen's margins. Defaults to down. + /// - offset: An offset from the tooltip's default position. + /// - dismissMode: The mode of tooltip dismissal. Defaults to tapping anywhere. + /// - isPresented: A binding to a Boolean value that determines whether to present the tooltip. When the user dismisses the tooltip, this value is set to `false`. + /// - onTap: An optional closure used to do work after the user taps + @ViewBuilder + func fluentTooltip(message: String, + title: String? = nil, + preferredArrowDirection: Tooltip.ArrowDirection = .down, + offset: CGPoint = CGPoint(x: 0, y: 0), + dismissMode: Tooltip.DismissMode = .tapAnywhere, + isPresented: Binding, + onTap: (() -> Void)? = nil) -> some View { + // Package up all the values to pass through. + let values = TooltipAnchorViewValues( + message: message, + title: title, + preferredArrowDirection: preferredArrowDirection, + offset: offset, + dismissMode: dismissMode, + onTap: onTap) + + self.modifier( + TooltipModifier( + values: values, + isPresented: isPresented + ) + ) + } +} + +// MARK: - Private support for public modifiers + +/// Convenience wrapper for the values used to show a `Tooltip`. +private struct TooltipAnchorViewValues { + let message: String + let title: String? + let preferredArrowDirection: Tooltip.ArrowDirection + let offset: CGPoint + let dismissMode: Tooltip.DismissMode + let onTap: (() -> Void)? +} + +private struct TooltipModifier: ViewModifier { + let values: TooltipAnchorViewValues + @Binding var isPresented: Bool + + func body(content: Content) -> some View { + content + .background { + TooltipAnchorViewRepresentable(values: values, isPresented: $isPresented) + } + } +} + +/// `UIView` subclass that serves as an anchor to the `Tooltip`. +/// +/// Our existing `Tooltip` logic is built entirely around `UIView` anchoring. To reuse this in SwiftUI, we create +/// a simple `UIView` that acts as this anchor. +private class TooltipAnchorView: UIView { + var values: TooltipAnchorViewValues + var isPresented: Binding + + init(values: TooltipAnchorViewValues, isPresented: Binding) { + self.values = values + self.isPresented = isPresented + super.init(frame: .zero) + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + override func didMoveToWindow() { + super.didMoveToWindow() + + // It's possible that we were asked to show the tooltip before we had loaded into a window. + // Check again now, just to be safe. + showTooltipIfPossible() + } + + func showTooltipIfPossible() { + if isPresented.wrappedValue && window != nil { + Tooltip.shared.show(with: values.message, + title: values.title, + for: self, + preferredArrowDirection: values.preferredArrowDirection, + offset: values.offset, + dismissOn: values.dismissMode, + onTap: { [weak self, values] in + values.onTap?() + + // Set the `isPresented` binding back to `false` once the tooltip dismisses. + self?.isPresented.wrappedValue = false + }) + } + } +} + +/// Subclass of `UIViewRepresentable` that creates the `TooltipAnchorView`. +private struct TooltipAnchorViewRepresentable: UIViewRepresentable { + var values: TooltipAnchorViewValues + @Binding var isPresented: Bool + + func makeUIView(context: Self.Context) -> TooltipAnchorView { + let view = TooltipAnchorView(values: values, isPresented: $isPresented) + return view + } + + func updateUIView(_ uiView: TooltipAnchorView, context: Context) { + uiView.values = values + if isPresented { + uiView.showTooltipIfPossible() + } else { + Tooltip.shared.hide() + } + } +} diff --git a/ios/FluentUI/Tooltip/TooltipTokenSet.swift b/Sources/FluentUI_iOS/Components/Tooltip/TooltipTokenSet.swift similarity index 100% rename from ios/FluentUI/Tooltip/TooltipTokenSet.swift rename to Sources/FluentUI_iOS/Components/Tooltip/TooltipTokenSet.swift diff --git a/ios/FluentUI/Tooltip/TooltipView.swift b/Sources/FluentUI_iOS/Components/Tooltip/TooltipView.swift similarity index 100% rename from ios/FluentUI/Tooltip/TooltipView.swift rename to Sources/FluentUI_iOS/Components/Tooltip/TooltipView.swift diff --git a/ios/FluentUI/Tooltip/TooltipViewController.swift b/Sources/FluentUI_iOS/Components/Tooltip/TooltipViewController.swift similarity index 100% rename from ios/FluentUI/Tooltip/TooltipViewController.swift rename to Sources/FluentUI_iOS/Components/Tooltip/TooltipViewController.swift diff --git a/ios/FluentUI/TouchForwardingView/TouchForwardingView.swift b/Sources/FluentUI_iOS/Components/TouchForwardingView/TouchForwardingView.swift similarity index 100% rename from ios/FluentUI/TouchForwardingView/TouchForwardingView.swift rename to Sources/FluentUI_iOS/Components/TouchForwardingView/TouchForwardingView.swift diff --git a/ios/FluentUI/TwoLineTitleView/TwoLineTitleView.resources.xcfilelist b/Sources/FluentUI_iOS/Components/TwoLineTitleView/TwoLineTitleView.resources.xcfilelist similarity index 100% rename from ios/FluentUI/TwoLineTitleView/TwoLineTitleView.resources.xcfilelist rename to Sources/FluentUI_iOS/Components/TwoLineTitleView/TwoLineTitleView.resources.xcfilelist diff --git a/ios/FluentUI/TwoLineTitleView/TwoLineTitleView.swift b/Sources/FluentUI_iOS/Components/TwoLineTitleView/TwoLineTitleView.swift similarity index 99% rename from ios/FluentUI/TwoLineTitleView/TwoLineTitleView.swift rename to Sources/FluentUI_iOS/Components/TwoLineTitleView/TwoLineTitleView.swift index ac096e8b7f..0dc4ff424d 100644 --- a/ios/FluentUI/TwoLineTitleView/TwoLineTitleView.swift +++ b/Sources/FluentUI_iOS/Components/TwoLineTitleView/TwoLineTitleView.swift @@ -17,7 +17,7 @@ public protocol TwoLineTitleViewDelegate: AnyObject { // MARK: - TwoLineTitleView @objc(MSFTwoLineTitleView) -open class TwoLineTitleView: UIView, TokenizedControlInternal { +open class TwoLineTitleView: UIView, TokenizedControl { @objc(MSFTwoLineTitleViewStyle) public enum Style: Int { case primary diff --git a/ios/FluentUI/TwoLineTitleView/TwoLineTitleViewTokenSet.swift b/Sources/FluentUI_iOS/Components/TwoLineTitleView/TwoLineTitleViewTokenSet.swift similarity index 100% rename from ios/FluentUI/TwoLineTitleView/TwoLineTitleViewTokenSet.swift rename to Sources/FluentUI_iOS/Components/TwoLineTitleView/TwoLineTitleViewTokenSet.swift diff --git a/ios/FluentUI/Core/ColorProviding.swift b/Sources/FluentUI_iOS/Core/ColorProviding.swift similarity index 100% rename from ios/FluentUI/Core/ColorProviding.swift rename to Sources/FluentUI_iOS/Core/ColorProviding.swift diff --git a/ios/FluentUI/Core/Compatibility.swift b/Sources/FluentUI_iOS/Core/Compatibility.swift similarity index 100% rename from ios/FluentUI/Core/Compatibility.swift rename to Sources/FluentUI_iOS/Core/Compatibility.swift diff --git a/ios/FluentUI/Core/ControlHostingView.swift b/Sources/FluentUI_iOS/Core/ControlHostingView.swift similarity index 84% rename from ios/FluentUI/Core/ControlHostingView.swift rename to Sources/FluentUI_iOS/Core/ControlHostingView.swift index 0f5b355237..22e93c1df2 100644 --- a/ios/FluentUI/Core/ControlHostingView.swift +++ b/Sources/FluentUI_iOS/Core/ControlHostingView.swift @@ -35,9 +35,16 @@ open class ControlHostingView: UIView { /// the control view in an `AnyView.` /// /// - Parameter controlView: An `AnyView`-wrapped component to host. - init(_ controlView: AnyView) { + /// - Parameter safeAreaRegions: Passthrough to the respective property on UIHostingController. + /// Indicates which safe area regions the underlying hosting controller should add to its view. + public init(_ controlView: AnyView, safeAreaRegions: SafeAreaRegions = .all) { hostingController = FluentThemedHostingController.init(rootView: controlView) - hostingController.disableSafeAreaInsets() + hostingController.sizingOptions = [.intrinsicContentSize] + + if #available(iOS 16.4, *) { + hostingController.safeAreaRegions = safeAreaRegions + } + super.init(frame: .zero) self.configureHostedView() diff --git a/ios/FluentUI/Core/Core.resources.xcfilelist b/Sources/FluentUI_iOS/Core/Core.resources.xcfilelist similarity index 100% rename from ios/FluentUI/Core/Core.resources.xcfilelist rename to Sources/FluentUI_iOS/Core/Core.resources.xcfilelist diff --git a/Sources/FluentUI_iOS/Core/Extensions/Color+Extensions.swift b/Sources/FluentUI_iOS/Core/Extensions/Color+Extensions.swift new file mode 100644 index 0000000000..23473a40af --- /dev/null +++ b/Sources/FluentUI_iOS/Core/Extensions/Color+Extensions.swift @@ -0,0 +1,66 @@ +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// + +import SwiftUI + +extension Color { + /// Creates a `Color` instance with the specified three-channel, 8-bit-per-channel color value, usually in hex. + /// + /// For example: `0xFF0000` represents red, `0x00FF00` green, and `0x0000FF` blue. There is no way to specify an + /// alpha channel via this initializer. For that, use the `.opacity(:)` modifier on the resulting `Color` instance. + /// + /// - Parameter hexValue: The color value to store, in 24-bit (three-channel, 8-bit) RGB. + /// + /// - Returns: A color object that stores the provided color information. + init(hexValue: UInt32) { + let red: CGFloat = CGFloat((hexValue & 0x00FF0000) >> 16) / 255.0 + let green: CGFloat = CGFloat((hexValue & 0x0000FF00) >> 8) / 255.0 + let blue: CGFloat = CGFloat(hexValue & 0x000000FF) / 255.0 + self.init(red: red, + green: green, + blue: blue) + } + + /// Creates a custom `Color` that stores a dynamic set of `Color` values. + /// + /// - Parameter light: The default `Color` for a light context. Required. + /// - Parameter dark: The override `Color` for a dark context. Optional. + /// - Parameter darkElevated: The override `Color` for a dark elevated context. Optional. + init(light: Color, + dark: Color? = nil, + darkElevated: Color? = nil) { + + let dynamicColor = DynamicColor(light: light, dark: dark, darkElevated: darkElevated) + self.init(dynamicColor: dynamicColor) + } + + /// Creates a custom `Color` from a prebuilt `DynamicColor` structure. + /// + /// - Parameter dynamicColor: A dynmic color structure that describes the `Color` to be created. + init(dynamicColor: DynamicColor) { + if #available(iOS 17, *) { + self.init(dynamicColor) + } else { + self.init(uiColor: UIColor(dynamicColor: dynamicColor)) + } + } + + var dynamicColor: DynamicColor { + if #available(iOS 17, *) { + var lightEnvironment = EnvironmentValues.init() + lightEnvironment.colorScheme = .light + + var darkEnvironment = EnvironmentValues.init() + darkEnvironment.colorScheme = .dark + + return DynamicColor(light: Color(self.resolve(in: lightEnvironment)), + dark: Color(self.resolve(in: darkEnvironment))) + } else { + let uiColor = UIColor(self) + return DynamicColor(light: Color(uiColor.light), + dark: Color(uiColor.dark)) + } + } +} diff --git a/ios/FluentUI/Extensions/NSLayoutConstraint+Extensions.swift b/Sources/FluentUI_iOS/Core/Extensions/NSLayoutConstraint+Extensions.swift similarity index 100% rename from ios/FluentUI/Extensions/NSLayoutConstraint+Extensions.swift rename to Sources/FluentUI_iOS/Core/Extensions/NSLayoutConstraint+Extensions.swift diff --git a/ios/FluentUI/Extensions/String+Extension.swift b/Sources/FluentUI_iOS/Core/Extensions/String+Extension.swift similarity index 100% rename from ios/FluentUI/Extensions/String+Extension.swift rename to Sources/FluentUI_iOS/Core/Extensions/String+Extension.swift diff --git a/ios/FluentUI/Core/SwiftUI+ViewAnimation.swift b/Sources/FluentUI_iOS/Core/Extensions/SwiftUI+ViewAnimation.swift similarity index 100% rename from ios/FluentUI/Core/SwiftUI+ViewAnimation.swift rename to Sources/FluentUI_iOS/Core/Extensions/SwiftUI+ViewAnimation.swift diff --git a/ios/FluentUI/Core/SwiftUI+ViewModifiers.swift b/Sources/FluentUI_iOS/Core/Extensions/SwiftUI+ViewModifiers.swift similarity index 92% rename from ios/FluentUI/Core/SwiftUI+ViewModifiers.swift rename to Sources/FluentUI_iOS/Core/Extensions/SwiftUI+ViewModifiers.swift index adc4ea225c..5093a8ea42 100644 --- a/ios/FluentUI/Core/SwiftUI+ViewModifiers.swift +++ b/Sources/FluentUI_iOS/Core/Extensions/SwiftUI+ViewModifiers.swift @@ -51,11 +51,11 @@ extension View { modifier(LargeContentViewerModifier(text: text, image: image)) } - /// Applies multiple shadows on a View + /// Applies a key and an ambient shadow on a `View`. /// - Parameters: - /// - shadowInfo: The values of the two shadows to be applied + /// - shadowInfo: The values of the two shadows to be applied. /// - Returns: The modified view. - func applyShadow(shadowInfo: ShadowInfo) -> some View { + public func applyFluentShadow(shadowInfo: ShadowInfo) -> some View { modifier(ShadowModifier(shadowInfo: shadowInfo)) } @@ -66,7 +66,7 @@ extension View { /// - value: The value to check against when determining whether to run the closure. /// - action: A closure to run when the value changes. /// - Returns: A view that fires an action when the specified value changes. - func onChange_iOS17(of value: V, _ action: @escaping (V) -> Void) -> some View where V: Equatable { + public func onChange_iOS17(of value: V, _ action: @escaping (V) -> Void) -> some View where V: Equatable { #if os(visionOS) // Known bug when using #available and self.onChange together in visionOS: it'll crash! // So for this OS, just use the new .onChange unconditionally. @@ -138,11 +138,11 @@ struct ShadowModifier: ViewModifier { func body(content: Content) -> some View { content - .shadow(color: Color(shadowInfo.ambientColor), + .shadow(color: shadowInfo.ambientColor, radius: shadowInfo.ambientBlur, x: shadowInfo.xAmbient, y: shadowInfo.yAmbient) - .shadow(color: Color(shadowInfo.keyColor), + .shadow(color: shadowInfo.keyColor, radius: shadowInfo.keyBlur, x: shadowInfo.xKey, y: shadowInfo.yKey) diff --git a/ios/FluentUI/Core/SwiftUI+ViewPresentation.swift b/Sources/FluentUI_iOS/Core/Extensions/SwiftUI+ViewPresentation.swift similarity index 100% rename from ios/FluentUI/Core/SwiftUI+ViewPresentation.swift rename to Sources/FluentUI_iOS/Core/Extensions/SwiftUI+ViewPresentation.swift diff --git a/ios/FluentUI/Extensions/UIApplication+Extensions.swift b/Sources/FluentUI_iOS/Core/Extensions/UIApplication+Extensions.swift similarity index 100% rename from ios/FluentUI/Extensions/UIApplication+Extensions.swift rename to Sources/FluentUI_iOS/Core/Extensions/UIApplication+Extensions.swift diff --git a/ios/FluentUI/Extensions/UIColor+Extensions.swift b/Sources/FluentUI_iOS/Core/Extensions/UIColor+Extensions.swift similarity index 68% rename from ios/FluentUI/Extensions/UIColor+Extensions.swift rename to Sources/FluentUI_iOS/Core/Extensions/UIColor+Extensions.swift index 98b1ae0af4..bb72d77cae 100644 --- a/ios/FluentUI/Extensions/UIColor+Extensions.swift +++ b/Sources/FluentUI_iOS/Core/Extensions/UIColor+Extensions.swift @@ -80,47 +80,6 @@ extension UIColor { darkElevatedHighContrast: nil) } - /// `DynamicColor` representation of the `UIColor` object. - /// Requires the `UIColor` to be able to resolve its color values for at least the `.light` user interface style. - @available(*, deprecated, message: "Please use UIColor directly.") - public var dynamicColor: DynamicColor? { - // Only the light color value is mandatory when making a DynamicColor. - if let lightColorValue = resolvedColorValue(userInterfaceStyle: .light).colorValue { - let colors = DynamicColor( - light: lightColorValue, - lightHighContrast: resolvedColorValue(userInterfaceStyle: .light, - accessibilityContrast: .high).colorValue, - lightElevated: resolvedColorValue(userInterfaceStyle: .light, - userInterfaceLevel: .elevated).colorValue, - lightElevatedHighContrast: resolvedColorValue(userInterfaceStyle: .light, - accessibilityContrast: .high, - userInterfaceLevel: .elevated).colorValue, - dark: resolvedColorValue(userInterfaceStyle: .dark).colorValue, - darkHighContrast: resolvedColorValue(userInterfaceStyle: .dark, - accessibilityContrast: .high).colorValue, - darkElevated: resolvedColorValue(userInterfaceStyle: .dark, - userInterfaceLevel: .elevated).colorValue, - darkElevatedHighContrast: resolvedColorValue(userInterfaceStyle: .dark, - accessibilityContrast: .high, - userInterfaceLevel: .elevated).colorValue) - return colors - } else { - return nil - } - } - - /// Creates a UIColor from a `ColorValue` instance. - /// - /// - Parameter colorValue: Color value to use to initialize this color. - @available(*, deprecated, renamed: "init(hexValue:)") - @objc public convenience init(colorValue: ColorValue) { - self.init( - red: colorValue.r, - green: colorValue.g, - blue: colorValue.b, - alpha: colorValue.a) - } - /// Creates a `UIColor` instance with the specified three-channel, 8-bit-per-channel color value, usually in hex. /// /// For example: `0xFF0000` represents red, `0x00FF00` green, and `0x0000FF` blue. There is no way to specify an @@ -139,20 +98,6 @@ extension UIColor { alpha: 1.0) } - /// Creates a dynamic color object that returns the appropriate color value based on the current - /// rendering context. - /// - /// - Parameter dynamicColor: The set of color values that may be applied based on the current context. - @available(*, deprecated, message: "Please use UIColor directly.") - @objc public convenience init(dynamicColor: DynamicColor) { - self.init { traits -> UIColor in - let colorValue = dynamicColor.value(colorScheme: (traits.userInterfaceStyle == .dark ? .dark : .light), - contrast: traits.accessibilityContrast == .high ? .increased : .standard, - isElevated: traits.userInterfaceLevel == .elevated) - return UIColor(colorValue: colorValue) - } - } - @objc public var light: UIColor { return resolvedColorValue(userInterfaceStyle: .light) } @@ -193,18 +138,11 @@ extension UIColor { userInterfaceLevel: .elevated) } - @available(*, deprecated, message: "Please use UIColor directly.") - private var colorValue: ColorValue? { - var redValue: CGFloat = 1.0 - var greenValue: CGFloat = 1.0 - var blueValue: CGFloat = 1.0 - var alphaValue: CGFloat = 1.0 - if self.getRed(&redValue, green: &greenValue, blue: &blueValue, alpha: &alphaValue) { - let colorValue = ColorValue(r: redValue, g: greenValue, b: blueValue, a: alphaValue) - return colorValue - } else { - return nil - } + convenience init(dynamicColor: DynamicColor) { + let colorResolver = { $0 != nil ? UIColor($0!) : nil } + self.init(light: UIColor(dynamicColor.light), + dark: colorResolver(dynamicColor.dark), + darkElevated: colorResolver(dynamicColor.darkElevated)) } /// Returns the version of the current color that results from the specified traits as a `ColorValue`. diff --git a/ios/FluentUI/Core/Theme/Tokens/FontInfo.swift b/Sources/FluentUI_iOS/Core/Extensions/UIFont+Extensions.swift similarity index 67% rename from ios/FluentUI/Core/Theme/Tokens/FontInfo.swift rename to Sources/FluentUI_iOS/Core/Extensions/UIFont+Extensions.swift index cd8f6ae968..36c5d45f7f 100644 --- a/ios/FluentUI/Core/Theme/Tokens/FontInfo.swift +++ b/Sources/FluentUI_iOS/Core/Extensions/UIFont+Extensions.swift @@ -4,66 +4,7 @@ // import SwiftUI - -/// Represents the description of a font used by FluentUI components. -@objc(MSFFontInfo) -public class FontInfo: NSObject { - - /// Creates a `FontInfo` instance using the specified information. - /// - /// This struct simply stores information about a future font. Fluent will use this information to create the appropriate font object internally as needed. - /// - /// - Parameter name: An optional name for the font. If none is provided, defaults to the standard system font. - /// - Parameter size: The point size to use for the font. - /// - Parameter weight: The weight to use for the font. Defaults to `.regular`. - /// - /// - Returns: A struct containing the information needed to create a font object. - public init(name: String? = nil, - size: CGFloat, - weight: Font.Weight = .regular) { - self.name = name - self.size = size - self.weight = weight - } - - /// An optional name for the font. If none is provided, defaults to the standard system font. - public let name: String? - - /// The point size to use for the font. - public let size: CGFloat - - /// The weight to use for the font. - public let weight: Font.Weight - - var textStyle: Font.TextStyle { - // Defaults to smallest supported text style for mapping, before checking if we're bigger. - var textStyle = Font.TextStyle.caption2 - for tuple in Self.sizeTuples { - if self.size >= tuple.size { - textStyle = tuple.textStyle - break - } - } - return textStyle - } - - fileprivate static var sizeTuples: [(size: CGFloat, textStyle: Font.TextStyle)] = [ - (34.0, .largeTitle), - (28.0, .title), - (22.0, .title2), - (20.0, .title3), - // Note: `17.0: .headline` is removed to avoid needing duplicate size key values. - // But it's okay because Apple's scaling curve is identical between it and `.body`. - (17.0, .body), - (16.0, .callout), - (15.0, .subheadline), - (13.0, .footnote), - (12.0, .caption), - (11.0, .caption2) - ] -} - -// MARK: - ViewModifier +import UIKit public extension Font { static func fluent(_ fontInfo: FontInfo, shouldScale: Bool = true) -> Font { @@ -106,7 +47,7 @@ extension UIFont { } let textStyle = uiTextStyle(fontInfo.textStyle) - if FontInfo.sizeTuples.contains(where: { $0.size == fontInfo.size }) { + if fontInfo.matchesSystemSize { // System-recognized font size, let the OS scale it for us return UIFont.preferredFont(forTextStyle: textStyle, compatibleWith: traitCollection).withWeight(weight) } diff --git a/ios/FluentUI/Extensions/UIImage+Extensions.swift b/Sources/FluentUI_iOS/Core/Extensions/UIImage+Extensions.swift similarity index 100% rename from ios/FluentUI/Extensions/UIImage+Extensions.swift rename to Sources/FluentUI_iOS/Core/Extensions/UIImage+Extensions.swift diff --git a/ios/FluentUI/Extensions/UIScrollView+Extensions.swift b/Sources/FluentUI_iOS/Core/Extensions/UIScrollView+Extensions.swift similarity index 100% rename from ios/FluentUI/Extensions/UIScrollView+Extensions.swift rename to Sources/FluentUI_iOS/Core/Extensions/UIScrollView+Extensions.swift diff --git a/ios/FluentUI/Extensions/UIView+Extensions.swift b/Sources/FluentUI_iOS/Core/Extensions/UIView+Extensions.swift similarity index 100% rename from ios/FluentUI/Extensions/UIView+Extensions.swift rename to Sources/FluentUI_iOS/Core/Extensions/UIView+Extensions.swift diff --git a/Sources/FluentUI_iOS/Core/FluentTheme+Tokens.swift b/Sources/FluentUI_iOS/Core/FluentTheme+Tokens.swift new file mode 100644 index 0000000000..cea14a0ac3 --- /dev/null +++ b/Sources/FluentUI_iOS/Core/FluentTheme+Tokens.swift @@ -0,0 +1,599 @@ +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// + +import SwiftUI + +public extension FluentTheme { + @objc(MSFGradientToken) + enum GradientToken: Int, TokenSetKey { + case flair + case tint + } + + @objc(MSFColorToken) + enum ColorToken: Int, TokenSetKey { + // Neutral colors - Background + case background1 + case background1Pressed + case background1Selected + case background2 + case background2Pressed + case background2Selected + case background3 + case background3Pressed + case background3Selected + case background4 + case background4Pressed + case background4Selected + case background5 + case background5Pressed + case background5Selected + case background6 + case backgroundCanvas + case backgroundDarkStatic + case backgroundLightStatic + case backgroundLightStaticDisabled + case backgroundInverted + case backgroundDisabled + case stencil1 + case stencil2 + + // Neutral colors - Foreground + case foreground1 + case foreground2 + case foreground3 + case foregroundDisabled1 + case foregroundDisabled2 + case foregroundOnColor + case foregroundDarkStatic + case foregroundLightStatic + + // Neutral colors - Stroke + case stroke1 + case stroke1Pressed + case stroke2 + case strokeAccessible + case strokeFocus1 + case strokeFocus2 + case strokeDisabled + + // Brand colors - Brand background + case brandBackground1 + case brandBackground1Pressed + case brandBackground1Selected + case brandBackground2 + case brandBackground2Pressed + case brandBackground2Selected + case brandBackground3 + case brandBackgroundTint + case brandBackgroundDisabled + + // Brand colors - Brand foreground + case brandForeground1 + case brandForeground1Pressed + case brandForeground1Selected + case brandForegroundTint + case brandForegroundDisabled1 + case brandForegroundDisabled2 + + // Brand colors - Brand gradient + case brandGradient1 + case brandGradient2 + case brandGradient3 + + // Brand colors - Brand stroke + case brandStroke1 + case brandStroke1Pressed + case brandStroke1Selected + + // Shared colors - Error & Status + case dangerBackground1 + case dangerBackground2 + case dangerForeground1 + case dangerForeground2 + case dangerStroke1 + case dangerStroke2 + case successBackground1 + case successBackground2 + case successForeground1 + case successForeground2 + case successStroke1 + case warningBackground1 + case warningBackground2 + case warningForeground1 + case warningForeground2 + case warningStroke1 + case severeBackground1 + case severeBackground2 + case severeForeground1 + case severeForeground2 + case severeStroke1 + + // Shared colors - Presence + case presenceAway + case presenceDnd + case presenceAvailable + case presenceOof + } + + @objc(MSFShadowToken) + enum ShadowToken: Int, TokenSetKey { + case clear + case shadow02 + case shadow04 + case shadow08 + case shadow16 + case shadow28 + case shadow64 + } + + @objc(MSFTypographyToken) + enum TypographyToken: Int, TokenSetKey { + case display + case largeTitle + case title1 + case title2 + case title3 + case body1Strong + case body1 + case body2Strong + case body2 + case caption1Strong + case caption1 + case caption2 + } + + /// Returns the color value for the given token. + /// + /// - Parameter token: The `ColorsTokens` value to be retrieved. + /// - Returns: A `Color` for the given token. + func swiftUIColor(_ token: ColorToken) -> Color { + return Color(dynamicColor: colorTokenSet[token]) + } + + /// Returns the shadow value for the given token. + /// + /// - Parameter token: The `ShadowTokens` value to be retrieved. + /// - Returns: A `ShadowInfo` for the given token. + @objc(shadowForToken:) + func shadow(_ token: ShadowToken) -> ShadowInfo { + return shadowTokenSet[token] + } + + /// Returns the font value for the given token. + /// + /// - Parameter token: The `TypographyTokens` value to be retrieved. + /// - Returns: A `UIFont` for the given token. + @objc(typographyForToken:) + func typographyInfo(_ token: TypographyToken) -> FontInfo { + return typographyTokenSet[token] + } + + /// Returns an array of colors for the given token. + /// + /// - Parameter token: The `GradientTokens` value to be retrieved. + /// - Returns: An array of `Color` values for the given token. + func gradient(_ token: GradientToken) -> [Color] { + return gradientTokenSet[token].map { Color(dynamicColor: $0) } + } +} + +extension FluentTheme { + static func defaultColor(_ token: FluentTheme.ColorToken) -> DynamicColor { + switch token { + case .foreground1: + return DynamicColor(light: GlobalTokens.neutralSwiftUIColor(.grey14), + dark: GlobalTokens.neutralSwiftUIColor(.white)) + case .foreground2: + return DynamicColor(light: GlobalTokens.neutralSwiftUIColor(.grey38), + dark: GlobalTokens.neutralSwiftUIColor(.grey84)) + case .foreground3: + return DynamicColor(light: GlobalTokens.neutralSwiftUIColor(.grey50), + dark: GlobalTokens.neutralSwiftUIColor(.grey68)) + case .foregroundDisabled1: + return DynamicColor(light: GlobalTokens.neutralSwiftUIColor(.grey74), + dark: GlobalTokens.neutralSwiftUIColor(.grey36)) + case .foregroundDisabled2: + return DynamicColor(light: GlobalTokens.neutralSwiftUIColor(.white), + dark: GlobalTokens.neutralSwiftUIColor(.grey18)) + case .foregroundOnColor: + return DynamicColor(light: GlobalTokens.neutralSwiftUIColor(.white), + dark: GlobalTokens.neutralSwiftUIColor(.black)) + case .brandForegroundTint: + return DynamicColor(light: GlobalTokens.brandSwiftUIColor(.comm60), + dark: GlobalTokens.brandSwiftUIColor(.comm130)) + case .brandForeground1: + return DynamicColor(light: GlobalTokens.brandSwiftUIColor(.comm80), + dark: GlobalTokens.brandSwiftUIColor(.comm100)) + case .brandForeground1Pressed: + return DynamicColor(light: GlobalTokens.brandSwiftUIColor(.comm50), + dark: GlobalTokens.brandSwiftUIColor(.comm140)) + case .brandForeground1Selected: + return DynamicColor(light: GlobalTokens.brandSwiftUIColor(.comm60), + dark: GlobalTokens.brandSwiftUIColor(.comm120)) + case .brandForegroundDisabled1: + return DynamicColor(light: GlobalTokens.brandSwiftUIColor(.comm90)) + case .brandForegroundDisabled2: + return DynamicColor(light: GlobalTokens.brandSwiftUIColor(.comm140), + dark: GlobalTokens.brandSwiftUIColor(.comm40)) + case .brandGradient1: + return DynamicColor(light: GlobalTokens.brandSwiftUIColor(.gradientPrimaryLight), + dark: GlobalTokens.brandSwiftUIColor(.gradientPrimaryDark)) + case .brandGradient2: + return DynamicColor(light: GlobalTokens.brandSwiftUIColor(.gradientSecondaryLight), + dark: GlobalTokens.brandSwiftUIColor(.gradientSecondaryDark)) + case .brandGradient3: + return DynamicColor(light: GlobalTokens.brandSwiftUIColor(.gradientTertiaryLight), + dark: GlobalTokens.brandSwiftUIColor(.gradientTertiaryDark)) + case .foregroundDarkStatic: + return DynamicColor(light: GlobalTokens.neutralSwiftUIColor(.black), + dark: GlobalTokens.neutralSwiftUIColor(.black)) + case .foregroundLightStatic: + return DynamicColor(light: GlobalTokens.neutralSwiftUIColor(.white), + dark: GlobalTokens.neutralSwiftUIColor(.white)) + case .background1: + return DynamicColor(light: GlobalTokens.neutralSwiftUIColor(.white), + dark: GlobalTokens.neutralSwiftUIColor(.black), + darkElevated: GlobalTokens.neutralSwiftUIColor(.grey4)) + case .background1Pressed: + return DynamicColor(light: GlobalTokens.neutralSwiftUIColor(.grey88), + dark: GlobalTokens.neutralSwiftUIColor(.grey18), + darkElevated: GlobalTokens.neutralSwiftUIColor(.grey18)) + case .background1Selected: + return DynamicColor(light: GlobalTokens.neutralSwiftUIColor(.grey92), + dark: GlobalTokens.neutralSwiftUIColor(.grey14), + darkElevated: GlobalTokens.neutralSwiftUIColor(.grey14)) + case .background2: + return DynamicColor(light: GlobalTokens.neutralSwiftUIColor(.white), + dark: GlobalTokens.neutralSwiftUIColor(.grey12), + darkElevated: GlobalTokens.neutralSwiftUIColor(.grey16)) + case .background2Pressed: + return DynamicColor(light: GlobalTokens.neutralSwiftUIColor(.grey88), + dark: GlobalTokens.neutralSwiftUIColor(.grey30), + darkElevated: GlobalTokens.neutralSwiftUIColor(.grey30)) + case .background2Selected: + return DynamicColor(light: GlobalTokens.neutralSwiftUIColor(.grey92), + dark: GlobalTokens.neutralSwiftUIColor(.grey26), + darkElevated: GlobalTokens.neutralSwiftUIColor(.grey26)) + case .background3: + return DynamicColor(light: GlobalTokens.neutralSwiftUIColor(.white), + dark: GlobalTokens.neutralSwiftUIColor(.grey16), + darkElevated: GlobalTokens.neutralSwiftUIColor(.grey20)) + case .background3Pressed: + return DynamicColor(light: GlobalTokens.neutralSwiftUIColor(.grey88), + dark: GlobalTokens.neutralSwiftUIColor(.grey34), + darkElevated: GlobalTokens.neutralSwiftUIColor(.grey34)) + case .background3Selected: + return DynamicColor(light: GlobalTokens.neutralSwiftUIColor(.grey92), + dark: GlobalTokens.neutralSwiftUIColor(.grey30), + darkElevated: GlobalTokens.neutralSwiftUIColor(.grey30)) + case .background4: + return DynamicColor(light: GlobalTokens.neutralSwiftUIColor(.grey98), + dark: GlobalTokens.neutralSwiftUIColor(.grey20), + darkElevated: GlobalTokens.neutralSwiftUIColor(.grey24)) + case .background4Pressed: + return DynamicColor(light: GlobalTokens.neutralSwiftUIColor(.grey86), + dark: GlobalTokens.neutralSwiftUIColor(.grey38), + darkElevated: GlobalTokens.neutralSwiftUIColor(.grey38)) + case .background4Selected: + return DynamicColor(light: GlobalTokens.neutralSwiftUIColor(.grey90), + dark: GlobalTokens.neutralSwiftUIColor(.grey34), + darkElevated: GlobalTokens.neutralSwiftUIColor(.grey34)) + case .background5: + return DynamicColor(light: GlobalTokens.neutralSwiftUIColor(.grey94), + dark: GlobalTokens.neutralSwiftUIColor(.grey24), + darkElevated: GlobalTokens.neutralSwiftUIColor(.grey28)) + case .background5Pressed: + return DynamicColor(light: GlobalTokens.neutralSwiftUIColor(.grey82), + dark: GlobalTokens.neutralSwiftUIColor(.grey42), + darkElevated: GlobalTokens.neutralSwiftUIColor(.grey42)) + case .background5Selected: + return DynamicColor(light: GlobalTokens.neutralSwiftUIColor(.grey86), + dark: GlobalTokens.neutralSwiftUIColor(.grey38), + darkElevated: GlobalTokens.neutralSwiftUIColor(.grey38)) + case .background6: + return DynamicColor(light: GlobalTokens.neutralSwiftUIColor(.grey82), + dark: GlobalTokens.neutralSwiftUIColor(.grey36), + darkElevated: GlobalTokens.neutralSwiftUIColor(.grey40)) + case .backgroundDisabled: + return DynamicColor(light: GlobalTokens.neutralSwiftUIColor(.grey88), + dark: GlobalTokens.neutralSwiftUIColor(.grey32), + darkElevated: GlobalTokens.neutralSwiftUIColor(.grey32)) + case .brandBackgroundTint: + return DynamicColor(light: GlobalTokens.brandSwiftUIColor(.comm150), + dark: GlobalTokens.brandSwiftUIColor(.comm40)) + case .brandBackground1: + return DynamicColor(light: GlobalTokens.brandSwiftUIColor(.comm80), + dark: GlobalTokens.brandSwiftUIColor(.comm100)) + case .brandBackground1Pressed: + return DynamicColor(light: GlobalTokens.brandSwiftUIColor(.comm50), + dark: GlobalTokens.brandSwiftUIColor(.comm140)) + case .brandBackground1Selected: + return DynamicColor(light: GlobalTokens.brandSwiftUIColor(.comm60), + dark: GlobalTokens.brandSwiftUIColor(.comm120)) + case .brandBackground2: + return DynamicColor(light: GlobalTokens.brandSwiftUIColor(.comm70)) + case .brandBackground2Pressed: + return DynamicColor(light: GlobalTokens.brandSwiftUIColor(.comm40)) + case .brandBackground2Selected: + return DynamicColor(light: GlobalTokens.brandSwiftUIColor(.comm80)) + case .brandBackground3: + return DynamicColor(light: GlobalTokens.brandSwiftUIColor(.comm60), + dark: GlobalTokens.brandSwiftUIColor(.comm120)) + case .brandBackgroundDisabled: + return DynamicColor(light: GlobalTokens.brandSwiftUIColor(.comm140), + dark: GlobalTokens.brandSwiftUIColor(.comm40)) + case .stencil1: + return DynamicColor(light: GlobalTokens.neutralSwiftUIColor(.grey90), + dark: GlobalTokens.neutralSwiftUIColor(.grey34)) + case .stencil2: + return DynamicColor(light: GlobalTokens.neutralSwiftUIColor(.grey98), + dark: GlobalTokens.neutralSwiftUIColor(.grey20)) + case .backgroundCanvas: + return DynamicColor(light: GlobalTokens.neutralSwiftUIColor(.grey96), + dark: GlobalTokens.neutralSwiftUIColor(.grey8), + darkElevated: GlobalTokens.neutralSwiftUIColor(.grey14)) + case .backgroundDarkStatic: + return DynamicColor(light: GlobalTokens.neutralSwiftUIColor(.grey14), + dark: GlobalTokens.neutralSwiftUIColor(.grey24), + darkElevated: GlobalTokens.neutralSwiftUIColor(.grey30)) + case .backgroundInverted: + return DynamicColor(light: GlobalTokens.neutralSwiftUIColor(.grey46), + dark: GlobalTokens.neutralSwiftUIColor(.grey72), + darkElevated: GlobalTokens.neutralSwiftUIColor(.grey78)) + case .backgroundLightStatic: + return DynamicColor(light: GlobalTokens.neutralSwiftUIColor(.white), + dark: GlobalTokens.neutralSwiftUIColor(.white), + darkElevated: GlobalTokens.neutralSwiftUIColor(.white)) + case .backgroundLightStaticDisabled: + return DynamicColor(light: GlobalTokens.neutralSwiftUIColor(.white), + dark: GlobalTokens.neutralSwiftUIColor(.grey68), + darkElevated: GlobalTokens.neutralSwiftUIColor(.grey42)) + case .stroke1: + return DynamicColor(light: GlobalTokens.neutralSwiftUIColor(.grey82), + dark: GlobalTokens.neutralSwiftUIColor(.grey30), + darkElevated: GlobalTokens.neutralSwiftUIColor(.grey36)) + case .stroke1Pressed: + return DynamicColor(light: GlobalTokens.neutralSwiftUIColor(.grey70), + dark: GlobalTokens.neutralSwiftUIColor(.grey48)) + case .stroke2: + return DynamicColor(light: GlobalTokens.neutralSwiftUIColor(.grey88), + dark: GlobalTokens.neutralSwiftUIColor(.grey24), + darkElevated: GlobalTokens.neutralSwiftUIColor(.grey30)) + case .strokeAccessible: + return DynamicColor(light: GlobalTokens.neutralSwiftUIColor(.grey38), + dark: GlobalTokens.neutralSwiftUIColor(.grey62), + darkElevated: GlobalTokens.neutralSwiftUIColor(.grey68)) + case .strokeFocus1: + return DynamicColor(light: GlobalTokens.neutralSwiftUIColor(.white), + dark: GlobalTokens.neutralSwiftUIColor(.black)) + case .strokeFocus2: + return DynamicColor(light: GlobalTokens.neutralSwiftUIColor(.black), + dark: GlobalTokens.neutralSwiftUIColor(.white)) + case .strokeDisabled: + return DynamicColor(light: GlobalTokens.neutralSwiftUIColor(.grey88), + dark: GlobalTokens.neutralSwiftUIColor(.grey26), + darkElevated: GlobalTokens.neutralSwiftUIColor(.grey32)) + case .brandStroke1: + return DynamicColor(light: GlobalTokens.brandSwiftUIColor(.comm80), + dark: GlobalTokens.brandSwiftUIColor(.comm100)) + case .brandStroke1Pressed: + return DynamicColor(light: GlobalTokens.brandSwiftUIColor(.comm50), + dark: GlobalTokens.brandSwiftUIColor(.comm140)) + case .brandStroke1Selected: + return DynamicColor(light: GlobalTokens.brandSwiftUIColor(.comm60), + dark: GlobalTokens.brandSwiftUIColor(.comm120)) + case .dangerBackground1: + return DynamicColor(light: GlobalTokens.sharedSwiftUIColor(.red, .tint60), + dark: GlobalTokens.sharedSwiftUIColor(.red, .shade40)) + case .dangerBackground2: + return DynamicColor(light: GlobalTokens.sharedSwiftUIColor(.red, .primary), + dark: GlobalTokens.sharedSwiftUIColor(.red, .shade10)) + case .dangerForeground1: + return DynamicColor(light: GlobalTokens.sharedSwiftUIColor(.red, .shade10), + dark: GlobalTokens.sharedSwiftUIColor(.red, .tint30)) + case .dangerForeground2: + return DynamicColor(light: GlobalTokens.sharedSwiftUIColor(.red, .primary), + dark: GlobalTokens.sharedSwiftUIColor(.red, .tint30)) + case .dangerStroke1: + return DynamicColor(light: GlobalTokens.sharedSwiftUIColor(.red, .tint20), + dark: GlobalTokens.sharedSwiftUIColor(.red, .tint20)) + case .dangerStroke2: + return DynamicColor(light: GlobalTokens.sharedSwiftUIColor(.red, .primary), + dark: GlobalTokens.sharedSwiftUIColor(.red, .tint30)) + case .successBackground1: + return DynamicColor(light: GlobalTokens.sharedSwiftUIColor(.green, .tint60), + dark: GlobalTokens.sharedSwiftUIColor(.green, .shade40)) + case .successBackground2: + return DynamicColor(light: GlobalTokens.sharedSwiftUIColor(.green, .primary), + dark: GlobalTokens.sharedSwiftUIColor(.green, .shade10)) + case .successForeground1: + return DynamicColor(light: GlobalTokens.sharedSwiftUIColor(.green, .shade10), + dark: GlobalTokens.sharedSwiftUIColor(.green, .tint30)) + case .successForeground2: + return DynamicColor(light: GlobalTokens.sharedSwiftUIColor(.green, .primary), + dark: GlobalTokens.sharedSwiftUIColor(.green, .tint30)) + case .successStroke1: + return DynamicColor(light: GlobalTokens.sharedSwiftUIColor(.green, .tint20), + dark: GlobalTokens.sharedSwiftUIColor(.green, .tint20)) + case .severeBackground1: + return DynamicColor(light: GlobalTokens.sharedSwiftUIColor(.darkOrange, .tint60), + dark: GlobalTokens.sharedSwiftUIColor(.darkOrange, .shade40)) + case .severeBackground2: + return DynamicColor(light: GlobalTokens.sharedSwiftUIColor(.darkOrange, .primary), + dark: GlobalTokens.sharedSwiftUIColor(.darkOrange, .shade10)) + case .severeForeground1: + return DynamicColor(light: GlobalTokens.sharedSwiftUIColor(.darkOrange, .shade10), + dark: GlobalTokens.sharedSwiftUIColor(.darkOrange, .tint30)) + case .severeForeground2: + return DynamicColor(light: GlobalTokens.sharedSwiftUIColor(.darkOrange, .shade20), + dark: GlobalTokens.sharedSwiftUIColor(.darkOrange, .tint30)) + case .severeStroke1: + return DynamicColor(light: GlobalTokens.sharedSwiftUIColor(.darkOrange, .tint10), + dark: GlobalTokens.sharedSwiftUIColor(.darkOrange, .tint20)) + case .warningBackground1: + return DynamicColor(light: GlobalTokens.sharedSwiftUIColor(.yellow, .tint60), + dark: GlobalTokens.sharedSwiftUIColor(.yellow, .shade40)) + case .warningBackground2: + return DynamicColor(light: GlobalTokens.sharedSwiftUIColor(.yellow, .primary), + dark: GlobalTokens.sharedSwiftUIColor(.yellow, .shade10)) + case .warningForeground1: + return DynamicColor(light: GlobalTokens.sharedSwiftUIColor(.yellow, .shade30), + dark: GlobalTokens.sharedSwiftUIColor(.yellow, .tint30)) + case .warningForeground2: + return DynamicColor(light: GlobalTokens.sharedSwiftUIColor(.yellow, .shade30), + dark: GlobalTokens.sharedSwiftUIColor(.yellow, .tint30)) + case .warningStroke1: + return DynamicColor(light: GlobalTokens.sharedSwiftUIColor(.yellow, .shade30), + dark: GlobalTokens.sharedSwiftUIColor(.yellow, .shade20)) + case .presenceAway: + return DynamicColor(light: GlobalTokens.sharedSwiftUIColor(.marigold, .primary)) + case .presenceDnd: + return DynamicColor(light: GlobalTokens.sharedSwiftUIColor(.red, .primary), + dark: GlobalTokens.sharedSwiftUIColor(.red, .tint10)) + case .presenceAvailable: + return DynamicColor(light: GlobalTokens.sharedSwiftUIColor(.lightGreen, .primary), + dark: GlobalTokens.sharedSwiftUIColor(.lightGreen, .tint20)) + case .presenceOof: + return DynamicColor(light: GlobalTokens.sharedSwiftUIColor(.berry, .primary), + dark: GlobalTokens.sharedSwiftUIColor(.berry, .tint20)) + } + } + + static func defaultShadow(_ token: ShadowToken) -> ShadowInfo { + switch token { + case .clear: + return ShadowInfo(keyColor: Color.clear, + keyBlur: 0.0, + xKey: 0.0, + yKey: 0.0, + ambientColor: Color.clear, + ambientBlur: 0.0, + xAmbient: 0.0, + yAmbient: 0.0) + case .shadow02: + return ShadowInfo(keyColor: .init(light: .black.opacity(0.14), + dark: .black.opacity(0.28)), + keyBlur: 2, + xKey: 0, + yKey: 1, + ambientColor: .init(light: .black.opacity(0.12), + dark: .black.opacity(0.20)), + ambientBlur: 2, + xAmbient: 0, + yAmbient: 0) + case .shadow04: + return ShadowInfo(keyColor: .init(light: .black.opacity(0.14), + dark: .black.opacity(0.28)), + keyBlur: 4, + xKey: 0, + yKey: 2, + ambientColor: .init(light: .black.opacity(0.12), + dark: .black.opacity(0.20)), + ambientBlur: 2, + xAmbient: 0, + yAmbient: 0) + case .shadow08: + return ShadowInfo(keyColor: .init(light: .black.opacity(0.14), + dark: .black.opacity(0.28)), + keyBlur: 8, + xKey: 0, + yKey: 4, + ambientColor: .init(light: .black.opacity(0.12), + dark: .black.opacity(0.20)), + ambientBlur: 2, + xAmbient: 0, + yAmbient: 0) + case .shadow16: + return ShadowInfo(keyColor: .init(light: .black.opacity(0.14), + dark: .black.opacity(0.28)), + keyBlur: 16, + xKey: 0, + yKey: 8, + ambientColor: .init(light: .black.opacity(0.12), + dark: .black.opacity(0.20)), + ambientBlur: 2, + xAmbient: 0, + yAmbient: 0) + case .shadow28: + return ShadowInfo(keyColor: .init(light: .black.opacity(0.24), + dark: .black.opacity(0.48)), + keyBlur: 28, + xKey: 0, + yKey: 14, + ambientColor: .init(light: .black.opacity(0.20), + dark: .black.opacity(0.40)), + ambientBlur: 8, + xAmbient: 0, + yAmbient: 0) + case .shadow64: + return ShadowInfo(keyColor: .init(light: .black.opacity(0.24), + dark: .black.opacity(0.48)), + keyBlur: 64, + xKey: 0, + yKey: 32, + ambientColor: .init(light: .black.opacity(0.20), + dark: .black.opacity(0.40)), + ambientBlur: 8, + xAmbient: 0, + yAmbient: 0) + } + } + + static func defaultTypography(_ token: TypographyToken) -> FontInfo { + switch token { + case .display: + return .init(size: GlobalTokens.fontSize(.size900), + weight: GlobalTokens.fontWeight(.bold)) + case .largeTitle: + return .init(size: GlobalTokens.fontSize(.size800), + weight: GlobalTokens.fontWeight(.bold)) + case .title1: + return .init(size: GlobalTokens.fontSize(.size700), + weight: GlobalTokens.fontWeight(.bold)) + case .title2: + return .init(size: GlobalTokens.fontSize(.size600), + weight: GlobalTokens.fontWeight(.semibold)) + case .title3: + return .init(size: GlobalTokens.fontSize(.size500), + weight: GlobalTokens.fontWeight(.semibold)) + case .body1Strong: + return .init(size: GlobalTokens.fontSize(.size400), + weight: GlobalTokens.fontWeight(.semibold)) + case .body1: + return .init(size: GlobalTokens.fontSize(.size400), + weight: GlobalTokens.fontWeight(.regular)) + case .body2Strong: + return .init(size: GlobalTokens.fontSize(.size300), + weight: GlobalTokens.fontWeight(.semibold)) + case .body2: + return .init(size: GlobalTokens.fontSize(.size300), + weight: GlobalTokens.fontWeight(.regular)) + case .caption1Strong: + return .init(size: GlobalTokens.fontSize(.size200), + weight: GlobalTokens.fontWeight(.semibold)) + case .caption1: + return .init(size: GlobalTokens.fontSize(.size200), + weight: GlobalTokens.fontWeight(.regular)) + case .caption2: + return .init(size: GlobalTokens.fontSize(.size100), + weight: GlobalTokens.fontWeight(.regular)) + } + } + + /// Derives its default values from the theme's `colorTokenSet` values + static func defaultGradientColor(_ token: GradientToken, colorTokenSet: TokenSet) -> [DynamicColor] { + switch token { + case .flair: + return [colorTokenSet[.brandGradient1], + colorTokenSet[.brandGradient2], + colorTokenSet[.brandGradient3]] + case .tint: + return [colorTokenSet[.brandGradient2], + colorTokenSet[.brandGradient3]] + } + } + +} diff --git a/Sources/FluentUI_iOS/Core/FluentThemedHostingController.swift b/Sources/FluentUI_iOS/Core/FluentThemedHostingController.swift new file mode 100644 index 0000000000..230be7cffe --- /dev/null +++ b/Sources/FluentUI_iOS/Core/FluentThemedHostingController.swift @@ -0,0 +1,63 @@ +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// + +import UIKit +import SwiftUI + +/// FluentUI specific implementation of the UIHostingController. This is primarily useful for adding `FluentTheme` observation +/// to any wrapped Fluent controls. +open class FluentThemedHostingController: UIHostingController { + + @MainActor required dynamic public override init(rootView: AnyView) { + controlView = rootView + super.init(rootView: rootView) + + // We need to observe theme changes, and use them to update our wrapped control. + NotificationCenter.default.addObserver(self, + selector: #selector(themeDidChange), + name: .didChangeTheme, + object: nil) + + // Set the initial appearance of our control. + updateRootView() + } + + @MainActor required dynamic public init?(coder aDecoder: NSCoder) { + preconditionFailure("init(coder:) has not been implemented") + } + + open override func willMove(toParent parent: UIViewController?) { + super.willMove(toParent: parent) + if parent != nil { + updateRootView() + } + } + + // MARK: - Theme management + + @objc private func themeDidChange(_ notification: Notification) { + guard FluentTheme.isApplicableThemeChange(notification, for: self.view) else { + return + } + updateRootView() + } + + private func updateRootView() { + self.rootView = AnyView( + controlView + .fluentTheme(view.fluentTheme) + .onAppear { [weak self] in + // We don't usually have a window at construction time, so fetch our + // custom theme during `onAppear` + guard let strongSelf = self else { + return + } + strongSelf.updateRootView() + } + ) + } + + private var controlView: AnyView +} diff --git a/ios/FluentUI/Core/FluentUIFramework.swift b/Sources/FluentUI_iOS/Core/FluentUIFramework.swift similarity index 87% rename from ios/FluentUI/Core/FluentUIFramework.swift rename to Sources/FluentUI_iOS/Core/FluentUIFramework.swift index ddaea524a4..460e0c62f5 100644 --- a/ios/FluentUI/Core/FluentUIFramework.swift +++ b/Sources/FluentUI_iOS/Core/FluentUIFramework.swift @@ -23,12 +23,27 @@ public class FluentUIFramework: NSObject { return resourceBundle }() + @objc public static var fluentVersion: String? = { + struct VersionConfig: Decodable { + // swiftlint:disable identifier_name + let CFBundleVersion: String + // swiftlint:enable identifier_name + } + + guard let url = resourceBundle.url(forResource: "Version", withExtension: "plist"), + let data = try? Data(contentsOf: url), + let versionConfig = try? PropertyListDecoder().decode(VersionConfig.self, from: data) else { + return nil + } + return versionConfig.CFBundleVersion + }() + @available(*, deprecated, message: "Non-fluent icons no longer supported. Setting this var no longer has any effect and it will be removed in a future update.") @objc public static var usesFluentIcons: Bool = true @available(*, deprecated, renamed: "initializeAppearance(with:whenContainedInInstancesOf:)") @objc public static func initializeAppearance() { - let primaryColor = FluentTheme.shared.color(.brandBackground1) + let primaryColor: UIColor = FluentTheme.shared.color(.brandBackground1) initializeAppearance(with: primaryColor) } @@ -85,8 +100,6 @@ public class FluentUIFramework: NSObject { } static func initializeUINavigationBarAppearance(_ navigationBar: UINavigationBar, traits: UITraitCollection? = nil, navigationBarStyle: NavigationBarStyle = .normal, fluentTheme: FluentTheme? = nil) { - navigationBar.isTranslucent = false - let standardAppearance = navigationBar.standardAppearance let fluentTheme = fluentTheme ?? FluentTheme.shared @@ -99,8 +112,9 @@ public class FluentUIFramework: NSObject { navigationBar.shadowImage = traits.userInterfaceStyle == .dark ? UIImage() : nil var titleAttributes = standardAppearance.titleTextAttributes + let foregroundColor: UIColor = fluentTheme.color(.foreground1) titleAttributes[.font] = fluentTheme.typography(.body1Strong) - titleAttributes[.foregroundColor] = fluentTheme.color(.foreground1) + titleAttributes[.foregroundColor] = foregroundColor standardAppearance.titleTextAttributes = titleAttributes diff --git a/ios/FluentUI/Core/FocusRingView.swift b/Sources/FluentUI_iOS/Core/FocusRingView.swift similarity index 100% rename from ios/FluentUI/Core/FocusRingView.swift rename to Sources/FluentUI_iOS/Core/FocusRingView.swift diff --git a/Sources/FluentUI_iOS/Core/Theme/FluentTheme+UIKit.swift b/Sources/FluentUI_iOS/Core/Theme/FluentTheme+UIKit.swift new file mode 100644 index 0000000000..dd7080352d --- /dev/null +++ b/Sources/FluentUI_iOS/Core/Theme/FluentTheme+UIKit.swift @@ -0,0 +1,145 @@ +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// + +import UIKit +import SwiftUI + +public extension FluentTheme { + + /// Initializes and returns a new `FluentTheme`. + /// + /// A `FluentTheme` receives any custom alias tokens on initialization via arguments here. + /// Control tokens can be customized via `register(controlType:tokens:) `; + /// see that method's description for additional information. + /// + /// - Parameters: + /// - colorOverrides: A `Dictionary` of override values mapped to `ColorTokens`. + /// - shadowOverrides: A `Dictionary` of override values mapped to `ShadowTokens`. + /// - typographyOverrides: A `Dictionary` of override values mapped to `TypographyTokens`. + /// - gradientOverrides: A `Dictionary` of override values mapped to `GradientTokens`. + /// + /// - Returns: An initialized `FluentTheme` instance, with optional overrides. + convenience init(colorOverrides: [ColorToken: UIColor]? = nil, + shadowOverrides: [ShadowToken: ShadowInfo]? = nil, + typographyOverrides: [TypographyToken: UIFont]? = nil, + gradientOverrides: [GradientToken: [UIColor]]? = nil) { + + let mappedColorOverrides = colorOverrides?.compactMapValues({ uiColor in + return Color(uiColor) + }) + + let mappedTypographyOverrides = typographyOverrides?.compactMapValues({ uiFont in + return FontInfo(name: uiFont.fontName, size: uiFont.pointSize) + }) + + let mappedGradientOverrides = gradientOverrides?.compactMapValues({ uiColors in + return uiColors.compactMap { uiColor in + Color(uiColor) + } + }) + + self.init(colorOverrides: mappedColorOverrides, + shadowOverrides: shadowOverrides, + typographyOverrides: mappedTypographyOverrides, + gradientOverrides: mappedGradientOverrides) + } + + /// Returns the color value for the given token. + /// + /// - Parameter token: The `ColorsTokens` value to be retrieved. + /// - Returns: A `UIColor` for the given token. + @objc(colorForToken:) + func color(_ token: ColorToken) -> UIColor { + return UIColor(dynamicColor: colorTokenSet[token]) + } + + /// Returns the font value for the given token. + /// + /// - Parameter token: The `TypographyTokens` value to be retrieved. + /// - Parameter adjustsForContentSizeCategory: If true, the resulting font will change size according to Dynamic Type specifications. + /// - Returns: A `UIFont` for the given token. + @objc(typographyForToken:adjustsForContentSizeCategory:) + func typography(_ token: TypographyToken, adjustsForContentSizeCategory: Bool = true) -> UIFont { + return UIFont.fluent(typographyInfo(token), + shouldScale: adjustsForContentSizeCategory) + } + + /// Returns the font value for the given token. + /// + /// - Parameter token: The `TypographyTokens` value to be retrieved. + /// - Parameter adjustsForContentSizeCategory: If true, the resulting font will change size according to Dynamic Type specifications. + /// - Parameter contentSizeCategory: An overridden `UIContentSizeCategory` to conform to. + /// - Returns: A `UIFont` for the given token. + @objc(typographyForToken:adjustsForContentSizeCategory:contentSizeCategory:) + func typography(_ token: TypographyToken, + adjustsForContentSizeCategory: Bool = true, + contentSizeCategory: UIContentSizeCategory) -> UIFont { + return UIFont.fluent(typographyInfo(token), + shouldScale: adjustsForContentSizeCategory, + contentSizeCategory: contentSizeCategory) + } + + /// Returns an array of colors for the given token. + /// + /// - Parameter token: The `GradientTokens` value to be retrieved. + /// - Returns: An array of `UIColor` values for the given token. + @objc(gradientColorsForToken:) + func gradient(_ token: GradientToken) -> [UIColor] { + let colors: [Color] = gradient(token) + return colors.map { UIColor($0) } + } +} + +@objc extension UIView: FluentThemeable { + private struct Keys { + static var fluentTheme: UInt8 = 0 + static var cachedFluentTheme: UInt8 = 0 + } + + /// The custom `FluentTheme` to apply to this view. + @objc public var fluentTheme: FluentTheme { + get { + var optionalView: UIView? = self + while let view = optionalView { + // If we successfully find a theme, return it. + if let theme = objc_getAssociatedObject(view, &Keys.fluentTheme) as? FluentTheme { + return theme + } else { + optionalView = view.superview + } + } + + // No custom themes anywhere, so return the default theme + return FluentTheme.shared + } + set { + objc_setAssociatedObject(self, &Keys.fluentTheme, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) + NotificationCenter.default.post(name: .didChangeTheme, object: self) + } + } + + /// Removes any associated `ColorProvider` from the given `UIView`. + @objc(resetFluentTheme) + public func resetFluentTheme() { + objc_setAssociatedObject(self, &Keys.fluentTheme, nil, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) + NotificationCenter.default.post(name: .didChangeTheme, object: self) + } + + @objc(isApplicableThemeChange:) + public func isApplicableThemeChange(_ notification: Notification) -> Bool { + // Do not update unless the notification's name is `.didChangeTheme`. + guard notification.name == .didChangeTheme else { + return false + } + + // If there is no object, or it is not a UIView, we must assume that we need to update. + guard let themeView = notification.object as? UIView else { + return true + } + + // If the object is a UIView, we only update if `view` is a descendant thereof. + return self.isDescendant(of: themeView) + } +} diff --git a/ios/FluentUI/Core/Theme/FluentTheme+visionOS.swift b/Sources/FluentUI_iOS/Core/Theme/FluentTheme+visionOS.swift similarity index 50% rename from ios/FluentUI/Core/Theme/FluentTheme+visionOS.swift rename to Sources/FluentUI_iOS/Core/Theme/FluentTheme+visionOS.swift index e05cf2c564..a853049e2a 100644 --- a/ios/FluentUI/Core/Theme/FluentTheme+visionOS.swift +++ b/Sources/FluentUI_iOS/Core/Theme/FluentTheme+visionOS.swift @@ -3,53 +3,58 @@ // Licensed under the MIT License. // -import UIKit +import SwiftUI #if os(visionOS) extension FluentTheme { - static func defaultColor_visionOS(_ token: FluentTheme.ColorToken) -> UIColor { + static func defaultColor_visionOS(_ token: FluentTheme.ColorToken) -> DynamicColor { + let visionColorDark: Color + // Apply overrides as needed. Note that visionOS only supports one mode, so there's no // need to provide multiple values (e.g. light + dark, elevated, etc). switch token { case .foreground1: - return .white + visionColorDark = .white case .foreground2: - return .white + visionColorDark = .white case .foreground3: - return .white + visionColorDark = .white case .foregroundDisabled1: - return .white.withAlphaComponent(0.8) + visionColorDark = .white.opacity(0.8) case .foregroundOnColor: - return .white + visionColorDark = .white case .background1: - return .clear + visionColorDark = .clear case .background1Pressed: - return .white.withAlphaComponent(0.1) + visionColorDark = .white.opacity(0.1) case .background2: - return .black.withAlphaComponent(0.1) + visionColorDark = .black.opacity(0.1) case .background2Pressed: - return .clear + visionColorDark = .clear case .background3: - return .black.withAlphaComponent(0.1) + visionColorDark = .black.opacity(0.1) case .background4: - return .clear + visionColorDark = .clear case .background5: - return .black.withAlphaComponent(0.2) + visionColorDark = .black.opacity(0.2) case .background5Pressed: - return .black.withAlphaComponent(0.1) + visionColorDark = .black.opacity(0.1) case .backgroundCanvas: - return .clear + visionColorDark = .clear case .stroke1: - return .white.withAlphaComponent(0.4) + visionColorDark = .white.opacity(0.4) case .stroke2: - return .white.withAlphaComponent(0.5) + visionColorDark = .white.opacity(0.5) case .dangerForeground2: - return GlobalTokens.sharedColor(.red, .primary) + visionColorDark = GlobalTokens.sharedSwiftUIColor(.red, .primary) default: // Return the standard iOS color by default. return defaultColor(token) } + + // Otherwise, use the override for `dark` and fall back to the default for `light`. + return DynamicColor(light: defaultColor(token).light, dark: visionColorDark) } } #endif diff --git a/ios/FluentUI/Core/Theme/FluentTheme.swift b/Sources/FluentUI_iOS/Core/Theme/FluentTheme.swift similarity index 62% rename from ios/FluentUI/Core/Theme/FluentTheme.swift rename to Sources/FluentUI_iOS/Core/Theme/FluentTheme.swift index 59ccd19fb5..34459fa01f 100644 --- a/ios/FluentUI/Core/Theme/FluentTheme.swift +++ b/Sources/FluentUI_iOS/Core/Theme/FluentTheme.swift @@ -16,7 +16,10 @@ public class FluentTheme: NSObject, ObservableObject { /// /// - Returns: An initialized `FluentTheme` instance, with optional overrides. @objc public convenience override init() { - self.init(colorOverrides: nil, shadowOverrides: nil, typographyOverrides: nil, gradientOverrides: nil) + self.init(colorOverrides: nil as [ColorToken: Color]?, + shadowOverrides: nil as [ShadowToken: ShadowInfo]?, + typographyOverrides: nil as [TypographyToken: FontInfo]?, + gradientOverrides: nil as [GradientToken: [Color]]?) } /// Initializes and returns a new `FluentTheme`. @@ -32,30 +35,27 @@ public class FluentTheme: NSObject, ObservableObject { /// - gradientOverrides: A `Dictionary` of override values mapped to `GradientTokens`. /// /// - Returns: An initialized `FluentTheme` instance, with optional overrides. - public init(colorOverrides: [ColorToken: UIColor]? = nil, + public init(colorOverrides: [ColorToken: Color]? = nil, shadowOverrides: [ShadowToken: ShadowInfo]? = nil, - typographyOverrides: [TypographyToken: UIFont]? = nil, - gradientOverrides: [GradientToken: [UIColor]]? = nil) { - - // Need to massage UIFonts into FontInfo objects - let mappedTypographyOverrides = typographyOverrides?.compactMapValues({ font in - return FontInfo(name: font.fontName, size: font.pointSize) - }) - + typographyOverrides: [TypographyToken: FontInfo]? = nil, + gradientOverrides: [GradientToken: [Color]]? = nil) { #if os(visionOS) // We have custom overrides for `defaultColors` in visionOS. - let defaultColorFunction = FluentTheme.defaultColor_visionOS(_:) + let defaultColorFunction: ((FluentTheme.ColorToken) -> DynamicColor) = FluentTheme.defaultColor_visionOS(_:) #else - let defaultColorFunction = FluentTheme.defaultColor(_:) + let defaultColorFunction: ((FluentTheme.ColorToken) -> DynamicColor) = FluentTheme.defaultColor(_:) #endif - let colorTokenSet = TokenSet(defaultColorFunction, colorOverrides) + let colorTokenSet = TokenSet( + defaultColorFunction, + colorOverrides?.mapValues { $0.dynamicColor } + ) let shadowTokenSet = TokenSet(FluentTheme.defaultShadow(_:), shadowOverrides) - let typographyTokenSet = TokenSet(FluentTheme.defaultTypography(_:), mappedTypographyOverrides) - let gradientTokenSet = TokenSet({ [colorTokenSet] token in + let typographyTokenSet = TokenSet(FluentTheme.defaultTypography(_:), typographyOverrides) + let gradientTokenSet = TokenSet({ [colorTokenSet] token in // Reference the colorTokenSet as part of the gradient lookup return FluentTheme.defaultGradientColor(token, colorTokenSet: colorTokenSet) - }) + }, gradientOverrides?.mapValues { $0.map { $0.dynamicColor} }) self.colorTokenSet = colorTokenSet self.shadowTokenSet = shadowTokenSet @@ -81,15 +81,6 @@ public class FluentTheme: NSObject, ObservableObject { return controlTokenSets[tokenKey(tokenSetType)] as? [T: ControlTokenValue] } - /// The associated `AliasTokens` for this theme. - @available(*, deprecated, message: "AliasTokens are deprecated. Please use the token lookup methods on FluentTheme directly.") - @objc public lazy var aliasTokens: AliasTokens = { - AliasTokens(colorTokenSet: colorTokenSet, - shadowTokenSet: shadowTokenSet, - typographyTokenSet: typographyTokenSet, - gradientTokenSet: gradientTokenSet) - }() - /// The shared `FluentTheme` instance used by default for controls in the app. /// /// This static `FluentTheme` instance will normally return the default token values associated @@ -106,34 +97,23 @@ public class FluentTheme: NSObject, ObservableObject { } } - /// Determines if a given `Notification` should cause an update for the given `UIView`. + /// Determines if a given `Notification` should cause an update for the given `FluentThemeable`. /// /// - Parameter notification: A `Notification` object that may be requesting a view update based on a theme change. - /// - Parameter view: The `UIView` instance that wants to determine whether to update. + /// - Parameter view: The `FluentThemeable` instance that wants to determine whether to update. /// - /// - Returns: `True` if the view should update, `false` otherwise. + /// - Returns: `true` if the view should update, `false` otherwise. @objc(isApplicableThemeChangeNotification:forView:) public static func isApplicableThemeChange(_ notification: Notification, - for view: UIView) -> Bool { - // Do not update unless the notification's name is `.didChangeTheme`. - guard notification.name == .didChangeTheme else { - return false - } - - // If there is no object, or it is not a UIView, we must assume that we need to update. - guard let themeView = notification.object as? UIView else { - return true - } - - // If the object is a UIView, we only update if `view` is a descendant thereof. - return view.isDescendant(of: themeView) + for view: FluentThemeable) -> Bool { + return view.isApplicableThemeChange(notification) } // Token storage - let colorTokenSet: TokenSet + let colorTokenSet: TokenSet let shadowTokenSet: TokenSet let typographyTokenSet: TokenSet - let gradientTokenSet: TokenSet + let gradientTokenSet: TokenSet private func tokenKey(_ tokenSetType: ControlTokenSet.Type) -> String { return "\(tokenSetType)" @@ -147,6 +127,7 @@ public class FluentTheme: NSObject, ObservableObject { /// Public protocol that, when implemented, allows any container to store and yield a `FluentTheme`. @objc public protocol FluentThemeable { var fluentTheme: FluentTheme { get set } + func isApplicableThemeChange(_ notification: Notification) -> Bool } public extension Notification.Name { @@ -157,42 +138,6 @@ public extension Notification.Name { static let didChangeTheme = Notification.Name("FluentUI.stylesheet.theme") } -@objc extension UIView: FluentThemeable { - private struct Keys { - static var fluentTheme: UInt8 = 0 - static var cachedFluentTheme: UInt8 = 0 - } - - /// The custom `FluentTheme` to apply to this view. - @objc public var fluentTheme: FluentTheme { - get { - var optionalView: UIView? = self - while let view = optionalView { - // If we successfully find a theme, return it. - if let theme = objc_getAssociatedObject(view, &Keys.fluentTheme) as? FluentTheme { - return theme - } else { - optionalView = view.superview - } - } - - // No custom themes anywhere, so return the default theme - return FluentTheme.shared - } - set { - objc_setAssociatedObject(self, &Keys.fluentTheme, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) - NotificationCenter.default.post(name: .didChangeTheme, object: self) - } - } - - /// Removes any associated `ColorProvider` from the given `UIView`. - @objc(resetFluentTheme) - public func resetFluentTheme() { - objc_setAssociatedObject(self, &Keys.fluentTheme, nil, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) - NotificationCenter.default.post(name: .didChangeTheme, object: self) - } -} - // MARK: - Environment public extension View { diff --git a/ios/FluentUI/Core/Theme/Tokens/ControlTokenSet.swift b/Sources/FluentUI_iOS/Core/Theme/Tokens/ControlTokenSet.swift similarity index 82% rename from ios/FluentUI/Core/Theme/Tokens/ControlTokenSet.swift rename to Sources/FluentUI_iOS/Core/Theme/Tokens/ControlTokenSet.swift index b1413f7dd7..605bba1daa 100644 --- a/ios/FluentUI/Core/Theme/Tokens/ControlTokenSet.swift +++ b/Sources/FluentUI_iOS/Core/Theme/Tokens/ControlTokenSet.swift @@ -4,10 +4,13 @@ // import Combine +import SwiftUI +#if os(iOS) || os(visionOS) import UIKit +#endif // os(iOS) || os(visionOS) /// Base class for all Fluent control tokenization. -public class ControlTokenSet: ObservableObject { +open class ControlTokenSet: ObservableObject { /// Allows us to index into this token set using square brackets. /// /// We can use square brackets to both read and write into this `TokenSet`. For example: @@ -60,7 +63,7 @@ public class ControlTokenSet: ObservableObject { /// - Parameter otherTokenSet: The token set we will be pulling values from. /// - Parameter mapping: A `Dictionary` that maps our own tokens that we wish to override with /// their corresponding tokens in `otherTokenSet`. - func setOverrides(from otherTokenSet: ControlTokenSet, mapping: [T: U]) { + public func setOverrides(from otherTokenSet: ControlTokenSet, mapping: [T: U]) { // Make a copy so we write all the values at once var valueOverrideCopy = valueOverrides ?? [:] mapping.forEach { (thisToken, otherToken) in @@ -70,7 +73,7 @@ public class ControlTokenSet: ObservableObject { } /// Initialize the `ControlTokenSet` with an escaping callback for fetching default values. - init(_ defaults: @escaping (_ token: T, _ theme: FluentTheme) -> ControlTokenValue) { + public init(_ defaults: @escaping (_ token: T, _ theme: FluentTheme) -> ControlTokenValue) { self.defaults = defaults } @@ -80,7 +83,7 @@ public class ControlTokenSet: ObservableObject { /// Removes all `onUpdate`-based observing. Useful if you are re-registering the same tokenSet /// for a new instance of a control (see `Tooltip` for an example). - func deregisterOnUpdate() { + public func deregisterOnUpdate() { if let notificationObserver { NotificationCenter.default.removeObserver(notificationObserver, name: .didChangeTheme, @@ -94,7 +97,7 @@ public class ControlTokenSet: ObservableObject { /// Prepares this token set by installing the current `FluentTheme` if it has changed. /// /// - Parameter fluentTheme: The current `FluentTheme` for the control's environment. - func update(_ fluentTheme: FluentTheme) { + public func update(_ fluentTheme: FluentTheme) { if fluentTheme != self.fluentTheme { self.fluentTheme = fluentTheme } @@ -110,7 +113,7 @@ public class ControlTokenSet: ObservableObject { /// - Parameter token: The token key to fetch any existing override for. /// /// - Returns: the active override value for a given token, or nil if none exists. - func overrideValue(forToken token: T) -> ControlTokenValue? { + public func overrideValue(forToken token: T) -> ControlTokenValue? { if let value = valueOverrides?[token] { return value } else if let value = fluentTheme.tokens(for: type(of: self))?[token] { @@ -123,7 +126,7 @@ public class ControlTokenSet: ObservableObject { /// /// - Parameter value: The value to set as an override. /// - Parameter token: The token key whose value should be set. - func setOverrideValue(_ value: ControlTokenValue?, forToken token: T) { + public func setOverrideValue(_ value: ControlTokenValue?, forToken token: T) { if valueOverrides == nil { valueOverrides = [:] } @@ -141,7 +144,7 @@ public class ControlTokenSet: ObservableObject { /// /// - Parameter control: The `UIView` instance that wishes to observe. /// - Parameter onUpdate: A callback to run whenever `control` should update itself. - func registerOnUpdate(for control: UIView, onUpdate: @escaping (() -> Void)) { + public func registerOnUpdate(for control: FluentThemeable, onUpdate: @escaping (() -> Void)) { guard self.onUpdate == nil, changeSink == nil, notificationObserver == nil else { @@ -163,7 +166,7 @@ public class ControlTokenSet: ObservableObject { queue: nil) { [weak self, weak control] notification in guard let strongSelf = self, let control, - FluentTheme.isApplicableThemeChange(notification, for: control) + control.isApplicableThemeChange(notification) else { return } @@ -172,7 +175,7 @@ public class ControlTokenSet: ObservableObject { } /// The current `FluentTheme` associated with this `ControlTokenSet`. - var fluentTheme: FluentTheme = FluentTheme.shared { + public var fluentTheme: FluentTheme = FluentTheme.shared { didSet { guard let onUpdate else { return @@ -203,8 +206,11 @@ public class ControlTokenSet: ObservableObject { /// Union-type enumeration of all possible token values to be stored by a `ControlTokenSet`. public enum ControlTokenValue { case float(() -> CGFloat) + case color(() -> Color) +#if os(iOS) || os(visionOS) case uiColor(() -> UIColor) case uiFont(() -> UIFont) +#endif // os(iOS) || os(visionOS) case shadowInfo(() -> ShadowInfo) public var float: CGFloat { @@ -216,12 +222,29 @@ public enum ControlTokenValue { } } + public var color: Color { + if case .color(let color) = self { + return color() + } else { +#if os(iOS) || os(visionOS) + if case .uiColor(let uiColor) = self { + return Color(uiColor()) + } +#endif // os(iOS) || os(visionOS) + assertionFailure("Cannot convert token to Color: \(self)") + return fallbackColor + } + } + +#if os(iOS) || os(visionOS) public var uiColor: UIColor { if case .uiColor(let uiColor) = self { return uiColor() + } else if case .color(let color) = self { + return UIColor(color()) } else { assertionFailure("Cannot convert token to UIColor: \(self)") - return fallbackColor + return fallbackUIColor } } @@ -233,6 +256,7 @@ public enum ControlTokenValue { return UIFont() } } +#endif // os(iOS) || os(visionOS) public var shadowInfo: ShadowInfo { if case .shadowInfo(let shadowInfo) = self { @@ -269,10 +293,14 @@ public enum ControlTokenValue { switch value { case let number as NSNumber: self = .float { CGFloat(number.doubleValue) } - case let color as UIColor: - self = .uiColor { color } + case let color as Color: + self = .color { color } +#if os(iOS) || os(visionOS) + case let uiColor as UIColor: + self = .uiColor { uiColor } case let font as UIFont: self = .uiFont { font } +#endif // os(iOS) || os(visionOS) case let shadowInfo as ShadowInfo: self = .shadowInfo { shadowInfo } default: @@ -282,14 +310,25 @@ public enum ControlTokenValue { // MARK: - Helpers - private var fallbackColor: UIColor { +#if os(iOS) || os(visionOS) + private var fallbackUIColor: UIColor { #if DEBUG // Use our global "Hot Pink" in debug builds, to help identify unintentional conversions. - return GlobalTokens.sharedColor(.hotPink, .primary) + return UIColor(GlobalTokens.sharedSwiftUIColor(.hotPink, .primary)) #else return GlobalTokens.neutralColor(.black) #endif } +#endif // os(iOS) || os(visionOS) + + private var fallbackColor: Color { +#if DEBUG + // Use our global "Hot Pink" in debug builds, to help identify unintentional conversions. + return GlobalTokens.sharedSwiftUIColor(.hotPink, .primary) +#else + return GlobalTokens.neutralSwiftUIColor(.black) +#endif + } } #if DEBUG @@ -299,10 +338,14 @@ extension ControlTokenValue: CustomStringConvertible { switch self { case .float(let float): return "ControlTokenValue.float (\(float())" + case .color(let color): + return "ControlTokenValue.color (\(color())" +#if os(iOS) || os(visionOS) case .uiColor(let uiColor): return "ControlTokenValue.uiColor (\(uiColor())" case .uiFont(let uiFont): return "ControlTokenValue.uiFont (\(uiFont())" +#endif // os(iOS) || os(visionOS) case .shadowInfo(let shadowInfo): return "ControlTokenValue.shadowInfo (\(shadowInfo())" } diff --git a/Sources/FluentUI_iOS/Core/Theme/Tokens/DynamicColor.swift b/Sources/FluentUI_iOS/Core/Theme/Tokens/DynamicColor.swift new file mode 100644 index 0000000000..5f52b3c091 --- /dev/null +++ b/Sources/FluentUI_iOS/Core/Theme/Tokens/DynamicColor.swift @@ -0,0 +1,44 @@ +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// + +import SwiftUI + +/// A container that stores a dynamic set of `Color` values. +struct DynamicColor: Hashable { + + /// Creates a custom `ShapeStyle` that stores a dynamic set of `Color` values. + /// + /// - Parameter light: The default `Color` for a light context. Required. + /// - Parameter dark: The override `Color` for a dark context. Optional. + /// - Parameter darkElevated: The override `Color` for a dark elevated context. Optional. + init(light: Color, + dark: Color? = nil, + darkElevated: Color? = nil) { + self.light = light + self.dark = dark + self.darkElevated = darkElevated + } + + let light: Color + let dark: Color? + let darkElevated: Color? +} + +@available(iOS 17, macOS 14, *) +extension DynamicColor: ShapeStyle { + /// Evaluate to a resolved `Color` (in the form of a `ShapeStyle`) given the current `environment`. + func resolve(in environment: EnvironmentValues) -> Color.Resolved { + if environment.colorScheme == .dark { + if environment.isPresented, let darkElevated = darkElevated { + return darkElevated.resolve(in: environment) + } else if let dark = dark { + return dark.resolve(in: environment) + } + } + + // default + return light.resolve(in: environment) + } +} diff --git a/ios/FluentUI/Core/Theme/Tokens/EmptyTokenSet.swift b/Sources/FluentUI_iOS/Core/Theme/Tokens/EmptyTokenSet.swift similarity index 96% rename from ios/FluentUI/Core/Theme/Tokens/EmptyTokenSet.swift rename to Sources/FluentUI_iOS/Core/Theme/Tokens/EmptyTokenSet.swift index e4f97e6f46..fbcb53aa9c 100644 --- a/ios/FluentUI/Core/Theme/Tokens/EmptyTokenSet.swift +++ b/Sources/FluentUI_iOS/Core/Theme/Tokens/EmptyTokenSet.swift @@ -13,7 +13,7 @@ public enum EmptyToken: Int, TokenSetKey { /// of being tokenized, but are not fully at that stage yet. public class EmptyTokenSet: ControlTokenSet { - init() { + public init() { super.init { _, _ in preconditionFailure("Should not fetch values") } diff --git a/Sources/FluentUI_iOS/Core/Theme/Tokens/FontInfo.swift b/Sources/FluentUI_iOS/Core/Theme/Tokens/FontInfo.swift new file mode 100644 index 0000000000..f8333de3fd --- /dev/null +++ b/Sources/FluentUI_iOS/Core/Theme/Tokens/FontInfo.swift @@ -0,0 +1,68 @@ +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// + +import SwiftUI + +/// Represents the description of a font used by FluentUI components. +@objc(MSFFontInfo) +public class FontInfo: NSObject { + + /// Creates a `FontInfo` instance using the specified information. + /// + /// This struct simply stores information about a future font. Fluent will use this information to create the appropriate font object internally as needed. + /// + /// - Parameter name: An optional name for the font. If none is provided, defaults to the standard system font. + /// - Parameter size: The point size to use for the font. + /// - Parameter weight: The weight to use for the font. Defaults to `.regular`. + /// + /// - Returns: A struct containing the information needed to create a font object. + public init(name: String? = nil, + size: CGFloat, + weight: Font.Weight = .regular) { + self.name = name + self.size = size + self.weight = weight + } + + /// An optional name for the font. If none is provided, defaults to the standard system font. + public let name: String? + + /// The point size to use for the font. + public let size: CGFloat + + /// The weight to use for the font. + public let weight: Font.Weight + + public var textStyle: Font.TextStyle { + // Defaults to smallest supported text style for mapping, before checking if we're bigger. + var textStyle = Font.TextStyle.caption2 + for tuple in Self.sizeTuples { + if self.size >= tuple.size { + textStyle = tuple.textStyle + break + } + } + return textStyle + } + + public var matchesSystemSize: Bool { + return FontInfo.sizeTuples.contains(where: { $0.size == size }) + } + + private static var sizeTuples: [(size: CGFloat, textStyle: Font.TextStyle)] = [ + (34.0, .largeTitle), + (28.0, .title), + (22.0, .title2), + (20.0, .title3), + // Note: `17.0: .headline` is removed to avoid needing duplicate size key values. + // But it's okay because Apple's scaling curve is identical between it and `.body`. + (17.0, .body), + (16.0, .callout), + (15.0, .subheadline), + (13.0, .footnote), + (12.0, .caption), + (11.0, .caption2) + ] +} diff --git a/Sources/FluentUI_iOS/Core/Theme/Tokens/GlobalTokens+UIKit.swift b/Sources/FluentUI_iOS/Core/Theme/Tokens/GlobalTokens+UIKit.swift new file mode 100644 index 0000000000..7e33f72521 --- /dev/null +++ b/Sources/FluentUI_iOS/Core/Theme/Tokens/GlobalTokens+UIKit.swift @@ -0,0 +1,30 @@ +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// + +import UIKit + +public extension GlobalTokens { + + // MARK: - BrandColor + + @objc(colorForBrandColorToken:) + static func brandColor(_ token: BrandColorToken) -> UIColor { + return UIColor(GlobalTokens.brandSwiftUIColor(token)) + } + + // MARK: - NeutralColor + + @objc(colorForNeutralColorToken:) + static func neutralColor(_ token: NeutralColorToken) -> UIColor { + return UIColor(GlobalTokens.neutralSwiftUIColor(token)) + } + + // MARK: - SharedColor + + @objc(colorForSharedColorSet:token:) + static func sharedColor(_ sharedColor: SharedColorSet, _ token: SharedColorToken) -> UIColor { + return UIColor(GlobalTokens.sharedSwiftUIColor(sharedColor, token)) + } +} diff --git a/Sources/FluentUI_iOS/Core/Theme/Tokens/GlobalTokens.swift b/Sources/FluentUI_iOS/Core/Theme/Tokens/GlobalTokens.swift new file mode 100644 index 0000000000..d4207a7132 --- /dev/null +++ b/Sources/FluentUI_iOS/Core/Theme/Tokens/GlobalTokens.swift @@ -0,0 +1,1878 @@ +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// + +import SwiftUI + +/// Global Tokens represent a unified set of constants to be used by Fluent UI. +/// +/// Values are derived from the Fluent UI design token system at https://github.com/microsoft/fluentui-design-tokens. +@objc(MSFGlobalTokens) +public class GlobalTokens: NSObject { + + // MARK: - BrandColor + + @objc(MSFGlobalTokensBrandColor) + public enum BrandColorToken: Int, TokenSetKey { + // Communication blue colors + case comm10 + case comm20 + case comm30 + case comm40 + case comm50 + case comm60 + case comm70 + case comm80 + case comm90 + case comm100 + case comm110 + case comm120 + case comm130 + case comm140 + case comm150 + case comm160 + + // Gradient colors + case gradientPrimaryLight + case gradientPrimaryDark + case gradientSecondaryLight + case gradientSecondaryDark + case gradientTertiaryLight + case gradientTertiaryDark + } + + public static func brandSwiftUIColor(_ token: BrandColorToken) -> Color { + switch token { + case .comm10: + return Color(hexValue: 0x061724) + case .comm20: + return Color(hexValue: 0x082338) + case .comm30: + return Color(hexValue: 0x0A2E4A) + case .comm40: + return Color(hexValue: 0x0C3B5E) + case .comm50: + return Color(hexValue: 0x0E4775) + case .comm60: + return Color(hexValue: 0x0F548C) + case .comm70: + return Color(hexValue: 0x115EA3) + case .comm80: + return Color(hexValue: 0x0F6CBD) + case .comm90: + return Color(hexValue: 0x2886DE) + case .comm100: + return Color(hexValue: 0x479EF5) + case .comm110: + return Color(hexValue: 0x62ABF5) + case .comm120: + return Color(hexValue: 0x77B7F7) + case .comm130: + return Color(hexValue: 0x96C6FA) + case .comm140: + return Color(hexValue: 0xB4D6FA) + case .comm150: + return Color(hexValue: 0xCFE4FA) + case .comm160: + return Color(hexValue: 0xEBF3FC) + case .gradientPrimaryLight: + return Color(hexValue: 0x464FEB) + case .gradientPrimaryDark: + return Color(hexValue: 0x7385FF) + case .gradientSecondaryLight: + return Color(hexValue: 0x47CFFA) + case .gradientSecondaryDark: + return Color(hexValue: 0x7ADFFF) + case .gradientTertiaryLight: + return Color(hexValue: 0xB47CF8) + case .gradientTertiaryDark: + return Color(hexValue: 0xBF80FF) + } + } + + // MARK: - NeutralColor + + @objc(MSFGlobalTokensNeutralColor) + public enum NeutralColorToken: Int, TokenSetKey { + case black + case grey2 + case grey4 + case grey6 + case grey8 + case grey10 + case grey12 + case grey14 + case grey16 + case grey18 + case grey20 + case grey22 + case grey24 + case grey26 + case grey28 + case grey30 + case grey32 + case grey34 + case grey36 + case grey38 + case grey40 + case grey42 + case grey44 + case grey46 + case grey48 + case grey50 + case grey52 + case grey54 + case grey56 + case grey58 + case grey60 + case grey62 + case grey64 + case grey66 + case grey68 + case grey70 + case grey72 + case grey74 + case grey76 + case grey78 + case grey80 + case grey82 + case grey84 + case grey86 + case grey88 + case grey90 + case grey92 + case grey94 + case grey96 + case grey98 + case white + } + public static func neutralSwiftUIColor(_ token: NeutralColorToken) -> Color { + switch token { + case .black: + return Color(hexValue: 0x000000) + case .grey2: + return Color(hexValue: 0x050505) + case .grey4: + return Color(hexValue: 0x0A0A0A) + case .grey6: + return Color(hexValue: 0x0F0F0F) + case .grey8: + return Color(hexValue: 0x141414) + case .grey10: + return Color(hexValue: 0x1A1A1A) + case .grey12: + return Color(hexValue: 0x1F1F1F) + case .grey14: + return Color(hexValue: 0x242424) + case .grey16: + return Color(hexValue: 0x292929) + case .grey18: + return Color(hexValue: 0x2E2E2E) + case .grey20: + return Color(hexValue: 0x333333) + case .grey22: + return Color(hexValue: 0x383838) + case .grey24: + return Color(hexValue: 0x3D3D3D) + case .grey26: + return Color(hexValue: 0x424242) + case .grey28: + return Color(hexValue: 0x474747) + case .grey30: + return Color(hexValue: 0x4D4D4D) + case .grey32: + return Color(hexValue: 0x525252) + case .grey34: + return Color(hexValue: 0x575757) + case .grey36: + return Color(hexValue: 0x5C5C5C) + case .grey38: + return Color(hexValue: 0x616161) + case .grey40: + return Color(hexValue: 0x666666) + case .grey42: + return Color(hexValue: 0x6B6B6B) + case .grey44: + return Color(hexValue: 0x707070) + case .grey46: + return Color(hexValue: 0x757575) + case .grey48: + return Color(hexValue: 0x7A7A7A) + case .grey50: + return Color(hexValue: 0x808080) + case .grey52: + return Color(hexValue: 0x858585) + case .grey54: + return Color(hexValue: 0x8A8A8A) + case .grey56: + return Color(hexValue: 0x8F8F8F) + case .grey58: + return Color(hexValue: 0x949494) + case .grey60: + return Color(hexValue: 0x999999) + case .grey62: + return Color(hexValue: 0x9E9E9E) + case .grey64: + return Color(hexValue: 0xA3A3A3) + case .grey66: + return Color(hexValue: 0xA8A8A8) + case .grey68: + return Color(hexValue: 0xADADAD) + case .grey70: + return Color(hexValue: 0xB2B2B2) + case .grey72: + return Color(hexValue: 0xB8B8B8) + case .grey74: + return Color(hexValue: 0xBDBDBD) + case .grey76: + return Color(hexValue: 0xC2C2C2) + case .grey78: + return Color(hexValue: 0xC7C7C7) + case .grey80: + return Color(hexValue: 0xCCCCCC) + case .grey82: + return Color(hexValue: 0xD1D1D1) + case .grey84: + return Color(hexValue: 0xD6D6D6) + case .grey86: + return Color(hexValue: 0xDBDBDB) + case .grey88: + return Color(hexValue: 0xE0E0E0) + case .grey90: + return Color(hexValue: 0xE5E5E5) + case .grey92: + return Color(hexValue: 0xEBEBEB) + case .grey94: + return Color(hexValue: 0xF0F0F0) + case .grey96: + return Color(hexValue: 0xF5F5F5) + case .grey98: + return Color(hexValue: 0xFAFAFA) + case .white: + return Color(hexValue: 0xFFFFFF) + } + } + + // MARK: - SharedColor + + @objc(MSFGlobalTokensSharedColorSet) + public enum SharedColorSet: Int, TokenSetKey { + case darkRed + case burgundy + case cranberry + case red + case darkOrange + case bronze + case pumpkin + case orange + case peach + case marigold + case yellow + case gold + case brass + case brown + case darkBrown + case lime + case forest + case seafoam + case lightGreen + case green + case darkGreen + case lightTeal + case teal + case darkTeal + case cyan + case steel + case lightBlue + case blue + case royalBlue + case darkBlue + case cornflower + case navy + case lavender + case purple + case darkPurple + case orchid + case grape + case berry + case lilac + case pink + case hotPink + case magenta + case plum + case beige + case mink + case silver + case platinum + case anchor + case charcoal + } + + @objc(MSFGlobalTokensSharedColor) + public enum SharedColorToken: Int, TokenSetKey { + case shade50 + case shade40 + case shade30 + case shade20 + case shade10 + case primary + case tint10 + case tint20 + case tint30 + case tint40 + case tint50 + case tint60 + } + + public static func sharedSwiftUIColor(_ sharedColor: SharedColorSet, _ token: SharedColorToken) -> Color { + switch sharedColor { + case .anchor: + switch token { + case .primary: + return Color(hexValue: 0x394146) + case .shade10: + return Color(hexValue: 0x333A3F) + case .shade20: + return Color(hexValue: 0x2B3135) + case .shade30: + return Color(hexValue: 0x202427) + case .shade40: + return Color(hexValue: 0x111315) + case .shade50: + return Color(hexValue: 0x090A0B) + case .tint10: + return Color(hexValue: 0x4D565C) + case .tint20: + return Color(hexValue: 0x626C72) + case .tint30: + return Color(hexValue: 0x808A90) + case .tint40: + return Color(hexValue: 0xBCC3C7) + case .tint50: + return Color(hexValue: 0xDBDFE1) + case .tint60: + return Color(hexValue: 0xF6F7F8) + } + case .beige: + switch token { + case .primary: + return Color(hexValue: 0x7A7574) + case .shade10: + return Color(hexValue: 0x6E6968) + case .shade20: + return Color(hexValue: 0x5D5958) + case .shade30: + return Color(hexValue: 0x444241) + case .shade40: + return Color(hexValue: 0x252323) + case .shade50: + return Color(hexValue: 0x141313) + case .tint10: + return Color(hexValue: 0x8A8584) + case .tint20: + return Color(hexValue: 0x9A9594) + case .tint30: + return Color(hexValue: 0xAFABAA) + case .tint40: + return Color(hexValue: 0xD7D4D4) + case .tint50: + return Color(hexValue: 0xEAE8E8) + case .tint60: + return Color(hexValue: 0xFAF9F9) + } + case .berry: + switch token { + case .primary: + return Color(hexValue: 0xC239B3) + case .shade10: + return Color(hexValue: 0xAF33A1) + case .shade20: + return Color(hexValue: 0x932B88) + case .shade30: + return Color(hexValue: 0x6D2064) + case .shade40: + return Color(hexValue: 0x3A1136) + case .shade50: + return Color(hexValue: 0x1F091D) + case .tint10: + return Color(hexValue: 0xC94CBC) + case .tint20: + return Color(hexValue: 0xD161C4) + case .tint30: + return Color(hexValue: 0xDA7ED0) + case .tint40: + return Color(hexValue: 0xEDBBE7) + case .tint50: + return Color(hexValue: 0xF5DAF2) + case .tint60: + return Color(hexValue: 0xFDF5FC) + } + case .blue: + switch token { + case .primary: + return Color(hexValue: 0x0078D4) + case .shade10: + return Color(hexValue: 0x006CBF) + case .shade20: + return Color(hexValue: 0x005BA1) + case .shade30: + return Color(hexValue: 0x004377) + case .shade40: + return Color(hexValue: 0x002440) + case .shade50: + return Color(hexValue: 0x001322) + case .tint10: + return Color(hexValue: 0x1A86D9) + case .tint20: + return Color(hexValue: 0x3595DE) + case .tint30: + return Color(hexValue: 0x5CAAE5) + case .tint40: + return Color(hexValue: 0xA9D3F2) + case .tint50: + return Color(hexValue: 0xD0E7F8) + case .tint60: + return Color(hexValue: 0xF3F9FD) + } + case .brass: + switch token { + case .primary: + return Color(hexValue: 0x986F0B) + case .shade10: + return Color(hexValue: 0x89640A) + case .shade20: + return Color(hexValue: 0x745408) + case .shade30: + return Color(hexValue: 0x553E06) + case .shade40: + return Color(hexValue: 0x2E2103) + case .shade50: + return Color(hexValue: 0x181202) + case .tint10: + return Color(hexValue: 0xA47D1E) + case .tint20: + return Color(hexValue: 0xB18C34) + case .tint30: + return Color(hexValue: 0xC1A256) + case .tint40: + return Color(hexValue: 0xE0CEA2) + case .tint50: + return Color(hexValue: 0xEFE4CB) + case .tint60: + return Color(hexValue: 0xFBF8F2) + } + case .bronze: + switch token { + case .primary: + return Color(hexValue: 0xA74109) + case .shade10: + return Color(hexValue: 0x963A08) + case .shade20: + return Color(hexValue: 0x7F3107) + case .shade30: + return Color(hexValue: 0x5E2405) + case .shade40: + return Color(hexValue: 0x321303) + case .shade50: + return Color(hexValue: 0x1B0A01) + case .tint10: + return Color(hexValue: 0xB2521E) + case .tint20: + return Color(hexValue: 0xBC6535) + case .tint30: + return Color(hexValue: 0xCA8057) + case .tint40: + return Color(hexValue: 0xE5BBA4) + case .tint50: + return Color(hexValue: 0xF1D9CC) + case .tint60: + return Color(hexValue: 0xFBF5F2) + } + case .brown: + switch token { + case .primary: + return Color(hexValue: 0x8E562E) + case .shade10: + return Color(hexValue: 0x804D29) + case .shade20: + return Color(hexValue: 0x6C4123) + case .shade30: + return Color(hexValue: 0x50301A) + case .shade40: + return Color(hexValue: 0x2B1A0E) + case .shade50: + return Color(hexValue: 0x170E07) + case .tint10: + return Color(hexValue: 0x9C663F) + case .tint20: + return Color(hexValue: 0xA97652) + case .tint30: + return Color(hexValue: 0xBB8F6F) + case .tint40: + return Color(hexValue: 0xDDC3B0) + case .tint50: + return Color(hexValue: 0xEDDED3) + case .tint60: + return Color(hexValue: 0xFAF7F4) + } + case .burgundy: + switch token { + case .primary: + return Color(hexValue: 0xA4262C) + case .shade10: + return Color(hexValue: 0x942228) + case .shade20: + return Color(hexValue: 0x7D1D21) + case .shade30: + return Color(hexValue: 0x5C1519) + case .shade40: + return Color(hexValue: 0x310B0D) + case .shade50: + return Color(hexValue: 0x1A0607) + case .tint10: + return Color(hexValue: 0xAF393E) + case .tint20: + return Color(hexValue: 0xBA4D52) + case .tint30: + return Color(hexValue: 0xC86C70) + case .tint40: + return Color(hexValue: 0xE4AFB2) + case .tint50: + return Color(hexValue: 0xF0D3D4) + case .tint60: + return Color(hexValue: 0xFBF4F4) + } + case .charcoal: + switch token { + case .primary: + return Color(hexValue: 0x393939) + case .shade10: + return Color(hexValue: 0x333333) + case .shade20: + return Color(hexValue: 0x2B2B2B) + case .shade30: + return Color(hexValue: 0x202020) + case .shade40: + return Color(hexValue: 0x111111) + case .shade50: + return Color(hexValue: 0x090909) + case .tint10: + return Color(hexValue: 0x515151) + case .tint20: + return Color(hexValue: 0x686868) + case .tint30: + return Color(hexValue: 0x888888) + case .tint40: + return Color(hexValue: 0xC4C4C4) + case .tint50: + return Color(hexValue: 0xDFDFDF) + case .tint60: + return Color(hexValue: 0xF7F7F7) + } + case .cornflower: + switch token { + case .primary: + return Color(hexValue: 0x4F6BED) + case .shade10: + return Color(hexValue: 0x4760D5) + case .shade20: + return Color(hexValue: 0x3C51B4) + case .shade30: + return Color(hexValue: 0x2C3C85) + case .shade40: + return Color(hexValue: 0x182047) + case .shade50: + return Color(hexValue: 0x0D1126) + case .tint10: + return Color(hexValue: 0x637CEF) + case .tint20: + return Color(hexValue: 0x778DF1) + case .tint30: + return Color(hexValue: 0x93A4F4) + case .tint40: + return Color(hexValue: 0xC8D1FA) + case .tint50: + return Color(hexValue: 0xE1E6FC) + case .tint60: + return Color(hexValue: 0xF7F9FE) + } + case .cranberry: + switch token { + case .primary: + return Color(hexValue: 0xC50F1F) + case .shade10: + return Color(hexValue: 0xB10E1C) + case .shade20: + return Color(hexValue: 0x960B18) + case .shade30: + return Color(hexValue: 0x6E0811) + case .shade40: + return Color(hexValue: 0x3B0509) + case .shade50: + return Color(hexValue: 0x200205) + case .tint10: + return Color(hexValue: 0xCC2635) + case .tint20: + return Color(hexValue: 0xD33F4C) + case .tint30: + return Color(hexValue: 0xDC626D) + case .tint40: + return Color(hexValue: 0xEEACB2) + case .tint50: + return Color(hexValue: 0xF6D1D5) + case .tint60: + return Color(hexValue: 0xFDF3F4) + } + case .cyan: + switch token { + case .primary: + return Color(hexValue: 0x0099BC) + case .shade10: + return Color(hexValue: 0x008AA9) + case .shade20: + return Color(hexValue: 0x00748F) + case .shade30: + return Color(hexValue: 0x005669) + case .shade40: + return Color(hexValue: 0x002E38) + case .shade50: + return Color(hexValue: 0x00181E) + case .tint10: + return Color(hexValue: 0x18A4C4) + case .tint20: + return Color(hexValue: 0x31AFCC) + case .tint30: + return Color(hexValue: 0x56BFD7) + case .tint40: + return Color(hexValue: 0xA4DEEB) + case .tint50: + return Color(hexValue: 0xCDEDF4) + case .tint60: + return Color(hexValue: 0xF2FAFC) + } + case .darkBlue: + switch token { + case .primary: + return Color(hexValue: 0x003966) + case .shade10: + return Color(hexValue: 0x00335C) + case .shade20: + return Color(hexValue: 0x002B4E) + case .shade30: + return Color(hexValue: 0x002039) + case .shade40: + return Color(hexValue: 0x00111F) + case .shade50: + return Color(hexValue: 0x000910) + case .tint10: + return Color(hexValue: 0x0E4A78) + case .tint20: + return Color(hexValue: 0x215C8B) + case .tint30: + return Color(hexValue: 0x4178A3) + case .tint40: + return Color(hexValue: 0x92B5D1) + case .tint50: + return Color(hexValue: 0xC2D6E7) + case .tint60: + return Color(hexValue: 0xEFF4F9) + } + case .darkBrown: + switch token { + case .primary: + return Color(hexValue: 0x4D291C) + case .shade10: + return Color(hexValue: 0x452519) + case .shade20: + return Color(hexValue: 0x3A1F15) + case .shade30: + return Color(hexValue: 0x2B1710) + case .shade40: + return Color(hexValue: 0x170C08) + case .shade50: + return Color(hexValue: 0x0C0704) + case .tint10: + return Color(hexValue: 0x623A2B) + case .tint20: + return Color(hexValue: 0x784D3E) + case .tint30: + return Color(hexValue: 0x946B5C) + case .tint40: + return Color(hexValue: 0xCAADA3) + case .tint50: + return Color(hexValue: 0xE3D2CB) + case .tint60: + return Color(hexValue: 0xF8F3F2) + } + case .darkGreen: + switch token { + case .primary: + return Color(hexValue: 0x0B6A0B) + case .shade10: + return Color(hexValue: 0x0A5F0A) + case .shade20: + return Color(hexValue: 0x085108) + case .shade30: + return Color(hexValue: 0x063B06) + case .shade40: + return Color(hexValue: 0x032003) + case .shade50: + return Color(hexValue: 0x021102) + case .tint10: + return Color(hexValue: 0x1A7C1A) + case .tint20: + return Color(hexValue: 0x2D8E2D) + case .tint30: + return Color(hexValue: 0x4DA64D) + case .tint40: + return Color(hexValue: 0x9AD29A) + case .tint50: + return Color(hexValue: 0xC6E7C6) + case .tint60: + return Color(hexValue: 0xF0F9F0) + } + case .darkOrange: + switch token { + case .primary: + return Color(hexValue: 0xDA3B01) + case .shade10: + return Color(hexValue: 0xC43501) + case .shade20: + return Color(hexValue: 0xA62D01) + case .shade30: + return Color(hexValue: 0x7A2101) + case .shade40: + return Color(hexValue: 0x411200) + case .shade50: + return Color(hexValue: 0x230900) + case .tint10: + return Color(hexValue: 0xDE501C) + case .tint20: + return Color(hexValue: 0xE36537) + case .tint30: + return Color(hexValue: 0xE9835E) + case .tint40: + return Color(hexValue: 0xF4BFAB) + case .tint50: + return Color(hexValue: 0xF9DCD1) + case .tint60: + return Color(hexValue: 0xFDF6F3) + } + case .darkPurple: + switch token { + case .primary: + return Color(hexValue: 0x401B6C) + case .shade10: + return Color(hexValue: 0x3A1861) + case .shade20: + return Color(hexValue: 0x311552) + case .shade30: + return Color(hexValue: 0x240F3C) + case .shade40: + return Color(hexValue: 0x130820) + case .shade50: + return Color(hexValue: 0x0A0411) + case .tint10: + return Color(hexValue: 0x512B7E) + case .tint20: + return Color(hexValue: 0x633E8F) + case .tint30: + return Color(hexValue: 0x7E5CA7) + case .tint40: + return Color(hexValue: 0xB9A3D3) + case .tint50: + return Color(hexValue: 0xD8CCE7) + case .tint60: + return Color(hexValue: 0xF5F2F9) + } + case .darkRed: + switch token { + case .primary: + return Color(hexValue: 0x750B1C) + case .shade10: + return Color(hexValue: 0x690A19) + case .shade20: + return Color(hexValue: 0x590815) + case .shade30: + return Color(hexValue: 0x420610) + case .shade40: + return Color(hexValue: 0x230308) + case .shade50: + return Color(hexValue: 0x130204) + case .tint10: + return Color(hexValue: 0x861B2C) + case .tint20: + return Color(hexValue: 0x962F3F) + case .tint30: + return Color(hexValue: 0xAC4F5E) + case .tint40: + return Color(hexValue: 0xD69CA5) + case .tint50: + return Color(hexValue: 0xE9C7CD) + case .tint60: + return Color(hexValue: 0xF9F0F2) + } + case .darkTeal: + switch token { + case .primary: + return Color(hexValue: 0x006666) + case .shade10: + return Color(hexValue: 0x005C5C) + case .shade20: + return Color(hexValue: 0x004E4E) + case .shade30: + return Color(hexValue: 0x003939) + case .shade40: + return Color(hexValue: 0x001F1F) + case .shade50: + return Color(hexValue: 0x001010) + case .tint10: + return Color(hexValue: 0x0E7878) + case .tint20: + return Color(hexValue: 0x218B8B) + case .tint30: + return Color(hexValue: 0x41A3A3) + case .tint40: + return Color(hexValue: 0x92D1D1) + case .tint50: + return Color(hexValue: 0xC2E7E7) + case .tint60: + return Color(hexValue: 0xEFF9F9) + } + case .forest: + switch token { + case .primary: + return Color(hexValue: 0x498205) + case .shade10: + return Color(hexValue: 0x427505) + case .shade20: + return Color(hexValue: 0x376304) + case .shade30: + return Color(hexValue: 0x294903) + case .shade40: + return Color(hexValue: 0x162702) + case .shade50: + return Color(hexValue: 0x0C1501) + case .tint10: + return Color(hexValue: 0x599116) + case .tint20: + return Color(hexValue: 0x6BA02B) + case .tint30: + return Color(hexValue: 0x85B44C) + case .tint40: + return Color(hexValue: 0xBDD99B) + case .tint50: + return Color(hexValue: 0xDBEBC7) + case .tint60: + return Color(hexValue: 0xF6FAF0) + } + case .gold: + switch token { + case .primary: + return Color(hexValue: 0xC19C00) + case .shade10: + return Color(hexValue: 0xAE8C00) + case .shade20: + return Color(hexValue: 0x937700) + case .shade30: + return Color(hexValue: 0x6C5700) + case .shade40: + return Color(hexValue: 0x3A2F00) + case .shade50: + return Color(hexValue: 0x1F1900) + case .tint10: + return Color(hexValue: 0xC8A718) + case .tint20: + return Color(hexValue: 0xD0B232) + case .tint30: + return Color(hexValue: 0xDAC157) + case .tint40: + return Color(hexValue: 0xECDFA5) + case .tint50: + return Color(hexValue: 0xF5EECE) + case .tint60: + return Color(hexValue: 0xFDFBF2) + } + case .grape: + switch token { + case .primary: + return Color(hexValue: 0x881798) + case .shade10: + return Color(hexValue: 0x7A1589) + case .shade20: + return Color(hexValue: 0x671174) + case .shade30: + return Color(hexValue: 0x4C0D55) + case .shade40: + return Color(hexValue: 0x29072E) + case .shade50: + return Color(hexValue: 0x160418) + case .tint10: + return Color(hexValue: 0x952AA4) + case .tint20: + return Color(hexValue: 0xA33FB1) + case .tint30: + return Color(hexValue: 0xB55FC1) + case .tint40: + return Color(hexValue: 0xD9A7E0) + case .tint50: + return Color(hexValue: 0xEACEEF) + case .tint60: + return Color(hexValue: 0xFAF2FB) + } + case .green: + switch token { + case .primary: + return Color(hexValue: 0x107C10) + case .shade10: + return Color(hexValue: 0x0E700E) + case .shade20: + return Color(hexValue: 0x0C5E0C) + case .shade30: + return Color(hexValue: 0x094509) + case .shade40: + return Color(hexValue: 0x052505) + case .shade50: + return Color(hexValue: 0x031403) + case .tint10: + return Color(hexValue: 0x218C21) + case .tint20: + return Color(hexValue: 0x359B35) + case .tint30: + return Color(hexValue: 0x54B054) + case .tint40: + return Color(hexValue: 0x9FD89F) + case .tint50: + return Color(hexValue: 0xC9EAC9) + case .tint60: + return Color(hexValue: 0xF1FAF1) + } + case .hotPink: + switch token { + case .primary: + return Color(hexValue: 0xE3008C) + case .shade10: + return Color(hexValue: 0xCC007E) + case .shade20: + return Color(hexValue: 0xAD006A) + case .shade30: + return Color(hexValue: 0x7F004E) + case .shade40: + return Color(hexValue: 0x44002A) + case .shade50: + return Color(hexValue: 0x240016) + case .tint10: + return Color(hexValue: 0xE61C99) + case .tint20: + return Color(hexValue: 0xEA38A6) + case .tint30: + return Color(hexValue: 0xEE5FB7) + case .tint40: + return Color(hexValue: 0xF7ADDA) + case .tint50: + return Color(hexValue: 0xFBD2EB) + case .tint60: + return Color(hexValue: 0xFEF4FA) + } + case .lavender: + switch token { + case .primary: + return Color(hexValue: 0x7160E8) + case .shade10: + return Color(hexValue: 0x6656D1) + case .shade20: + return Color(hexValue: 0x5649B0) + case .shade30: + return Color(hexValue: 0x3F3682) + case .shade40: + return Color(hexValue: 0x221D46) + case .shade50: + return Color(hexValue: 0x120F25) + case .tint10: + return Color(hexValue: 0x8172EB) + case .tint20: + return Color(hexValue: 0x9184EE) + case .tint30: + return Color(hexValue: 0xA79CF1) + case .tint40: + return Color(hexValue: 0xD2CCF8) + case .tint50: + return Color(hexValue: 0xE7E4FB) + case .tint60: + return Color(hexValue: 0xF9F8FE) + } + case .lightBlue: + switch token { + case .primary: + return Color(hexValue: 0x3A96DD) + case .shade10: + return Color(hexValue: 0x3487C7) + case .shade20: + return Color(hexValue: 0x2C72A8) + case .shade30: + return Color(hexValue: 0x20547C) + case .shade40: + return Color(hexValue: 0x112D42) + case .shade50: + return Color(hexValue: 0x091823) + case .tint10: + return Color(hexValue: 0x4FA1E1) + case .tint20: + return Color(hexValue: 0x65ADE5) + case .tint30: + return Color(hexValue: 0x83BDEB) + case .tint40: + return Color(hexValue: 0xBFDDF5) + case .tint50: + return Color(hexValue: 0xDCEDFA) + case .tint60: + return Color(hexValue: 0xF6FAFE) + } + case .lightGreen: + switch token { + case .primary: + return Color(hexValue: 0x13A10E) + case .shade10: + return Color(hexValue: 0x11910D) + case .shade20: + return Color(hexValue: 0x0E7A0B) + case .shade30: + return Color(hexValue: 0x0B5A08) + case .shade40: + return Color(hexValue: 0x063004) + case .shade50: + return Color(hexValue: 0x031A02) + case .tint10: + return Color(hexValue: 0x27AC22) + case .tint20: + return Color(hexValue: 0x3DB838) + case .tint30: + return Color(hexValue: 0x5EC75A) + case .tint40: + return Color(hexValue: 0xA7E3A5) + case .tint50: + return Color(hexValue: 0xCEF0CD) + case .tint60: + return Color(hexValue: 0xF2FBF2) + } + case .lightTeal: + switch token { + case .primary: + return Color(hexValue: 0x00B7C3) + case .shade10: + return Color(hexValue: 0x00A5AF) + case .shade20: + return Color(hexValue: 0x008B94) + case .shade30: + return Color(hexValue: 0x00666D) + case .shade40: + return Color(hexValue: 0x00373A) + case .shade50: + return Color(hexValue: 0x001D1F) + case .tint10: + return Color(hexValue: 0x18BFCA) + case .tint20: + return Color(hexValue: 0x32C8D1) + case .tint30: + return Color(hexValue: 0x58D3DB) + case .tint40: + return Color(hexValue: 0xA6E9ED) + case .tint50: + return Color(hexValue: 0xCEF3F5) + case .tint60: + return Color(hexValue: 0xF2FCFD) + } + case .lilac: + switch token { + case .primary: + return Color(hexValue: 0xB146C2) + case .shade10: + return Color(hexValue: 0x9F3FAF) + case .shade20: + return Color(hexValue: 0x863593) + case .shade30: + return Color(hexValue: 0x63276D) + case .shade40: + return Color(hexValue: 0x35153A) + case .shade50: + return Color(hexValue: 0x1C0B1F) + case .tint10: + return Color(hexValue: 0xBA58C9) + case .tint20: + return Color(hexValue: 0xC36BD1) + case .tint30: + return Color(hexValue: 0xCF87DA) + case .tint40: + return Color(hexValue: 0xE6BFED) + case .tint50: + return Color(hexValue: 0xF2DCF5) + case .tint60: + return Color(hexValue: 0xFCF6FD) + } + case .lime: + switch token { + case .primary: + return Color(hexValue: 0x73AA24) + case .shade10: + return Color(hexValue: 0x689920) + case .shade20: + return Color(hexValue: 0x57811B) + case .shade30: + return Color(hexValue: 0x405F14) + case .shade40: + return Color(hexValue: 0x23330B) + case .shade50: + return Color(hexValue: 0x121B06) + case .tint10: + return Color(hexValue: 0x81B437) + case .tint20: + return Color(hexValue: 0x90BE4C) + case .tint30: + return Color(hexValue: 0xA4CC6C) + case .tint40: + return Color(hexValue: 0xCFE5AF) + case .tint50: + return Color(hexValue: 0xE5F1D3) + case .tint60: + return Color(hexValue: 0xF8FCF4) + } + case .magenta: + switch token { + case .primary: + return Color(hexValue: 0xBF0077) + case .shade10: + return Color(hexValue: 0xAC006B) + case .shade20: + return Color(hexValue: 0x91005A) + case .shade30: + return Color(hexValue: 0x6B0043) + case .shade40: + return Color(hexValue: 0x390024) + case .shade50: + return Color(hexValue: 0x1F0013) + case .tint10: + return Color(hexValue: 0xC71885) + case .tint20: + return Color(hexValue: 0xCE3293) + case .tint30: + return Color(hexValue: 0xD957A8) + case .tint40: + return Color(hexValue: 0xECA5D1) + case .tint50: + return Color(hexValue: 0xF5CEE6) + case .tint60: + return Color(hexValue: 0xFCF2F9) + } + case .marigold: + switch token { + case .primary: + return Color(hexValue: 0xEAA300) + case .shade10: + return Color(hexValue: 0xD39300) + case .shade20: + return Color(hexValue: 0xB27C00) + case .shade30: + return Color(hexValue: 0x835B00) + case .shade40: + return Color(hexValue: 0x463100) + case .shade50: + return Color(hexValue: 0x251A00) + case .tint10: + return Color(hexValue: 0xEDAD1C) + case .tint20: + return Color(hexValue: 0xEFB839) + case .tint30: + return Color(hexValue: 0xF2C661) + case .tint40: + return Color(hexValue: 0xF9E2AE) + case .tint50: + return Color(hexValue: 0xFCEFD3) + case .tint60: + return Color(hexValue: 0xFEFBF4) + } + case .mink: + switch token { + case .primary: + return Color(hexValue: 0x5D5A58) + case .shade10: + return Color(hexValue: 0x54514F) + case .shade20: + return Color(hexValue: 0x474443) + case .shade30: + return Color(hexValue: 0x343231) + case .shade40: + return Color(hexValue: 0x1C1B1A) + case .shade50: + return Color(hexValue: 0x0F0E0E) + case .tint10: + return Color(hexValue: 0x706D6B) + case .tint20: + return Color(hexValue: 0x84817E) + case .tint30: + return Color(hexValue: 0x9E9B99) + case .tint40: + return Color(hexValue: 0xCECCCB) + case .tint50: + return Color(hexValue: 0xE5E4E3) + case .tint60: + return Color(hexValue: 0xF8F8F8) + } + case .navy: + switch token { + case .primary: + return Color(hexValue: 0x0027B4) + case .shade10: + return Color(hexValue: 0x0023A2) + case .shade20: + return Color(hexValue: 0x001E89) + case .shade30: + return Color(hexValue: 0x001665) + case .shade40: + return Color(hexValue: 0x000C36) + case .shade50: + return Color(hexValue: 0x00061D) + case .tint10: + return Color(hexValue: 0x173BBD) + case .tint20: + return Color(hexValue: 0x3050C6) + case .tint30: + return Color(hexValue: 0x546FD2) + case .tint40: + return Color(hexValue: 0xA3B2E8) + case .tint50: + return Color(hexValue: 0xCCD5F3) + case .tint60: + return Color(hexValue: 0xF2F4FC) + } + case .orange: + switch token { + case .primary: + return Color(hexValue: 0xF7630C) + case .shade10: + return Color(hexValue: 0xDE590B) + case .shade20: + return Color(hexValue: 0xBC4B09) + case .shade30: + return Color(hexValue: 0x8A3707) + case .shade40: + return Color(hexValue: 0x4A1E04) + case .shade50: + return Color(hexValue: 0x271002) + case .tint10: + return Color(hexValue: 0xF87528) + case .tint20: + return Color(hexValue: 0xF98845) + case .tint30: + return Color(hexValue: 0xFAA06B) + case .tint40: + return Color(hexValue: 0xFDCFB4) + case .tint50: + return Color(hexValue: 0xFEE5D7) + case .tint60: + return Color(hexValue: 0xFFF9F5) + } + case .orchid: + switch token { + case .primary: + return Color(hexValue: 0x8764B8) + case .shade10: + return Color(hexValue: 0x795AA6) + case .shade20: + return Color(hexValue: 0x674C8C) + case .shade30: + return Color(hexValue: 0x4C3867) + case .shade40: + return Color(hexValue: 0x281E37) + case .shade50: + return Color(hexValue: 0x16101D) + case .tint10: + return Color(hexValue: 0x9373C0) + case .tint20: + return Color(hexValue: 0xA083C9) + case .tint30: + return Color(hexValue: 0xB29AD4) + case .tint40: + return Color(hexValue: 0xD7CAEA) + case .tint50: + return Color(hexValue: 0xE9E2F4) + case .tint60: + return Color(hexValue: 0xF9F8FC) + } + case .peach: + switch token { + case .primary: + return Color(hexValue: 0xFF8C00) + case .shade10: + return Color(hexValue: 0xE67E00) + case .shade20: + return Color(hexValue: 0xC26A00) + case .shade30: + return Color(hexValue: 0x8F4E00) + case .shade40: + return Color(hexValue: 0x4D2A00) + case .shade50: + return Color(hexValue: 0x291600) + case .tint10: + return Color(hexValue: 0xFF9A1F) + case .tint20: + return Color(hexValue: 0xFFA83D) + case .tint30: + return Color(hexValue: 0xFFBA66) + case .tint40: + return Color(hexValue: 0xFFDDB3) + case .tint50: + return Color(hexValue: 0xFFEDD6) + case .tint60: + return Color(hexValue: 0xFFFAF5) + } + case .pink: + switch token { + case .primary: + return Color(hexValue: 0xE43BA6) + case .shade10: + return Color(hexValue: 0xCD3595) + case .shade20: + return Color(hexValue: 0xAD2D7E) + case .shade30: + return Color(hexValue: 0x80215D) + case .shade40: + return Color(hexValue: 0x441232) + case .shade50: + return Color(hexValue: 0x24091B) + case .tint10: + return Color(hexValue: 0xE750B0) + case .tint20: + return Color(hexValue: 0xEA66BA) + case .tint30: + return Color(hexValue: 0xEF85C8) + case .tint40: + return Color(hexValue: 0xF7C0E3) + case .tint50: + return Color(hexValue: 0xFBDDF0) + case .tint60: + return Color(hexValue: 0xFEF6FB) + } + case .platinum: + switch token { + case .primary: + return Color(hexValue: 0x69797E) + case .shade10: + return Color(hexValue: 0x5F6D71) + case .shade20: + return Color(hexValue: 0x505C60) + case .shade30: + return Color(hexValue: 0x3B4447) + case .shade40: + return Color(hexValue: 0x1F2426) + case .shade50: + return Color(hexValue: 0x111314) + case .tint10: + return Color(hexValue: 0x79898D) + case .tint20: + return Color(hexValue: 0x89989D) + case .tint30: + return Color(hexValue: 0xA0ADB2) + case .tint40: + return Color(hexValue: 0xCDD6D8) + case .tint50: + return Color(hexValue: 0xE4E9EA) + case .tint60: + return Color(hexValue: 0xF8F9FA) + } + case .plum: + switch token { + case .primary: + return Color(hexValue: 0x77004D) + case .shade10: + return Color(hexValue: 0x6B0045) + case .shade20: + return Color(hexValue: 0x5A003B) + case .shade30: + return Color(hexValue: 0x43002B) + case .shade40: + return Color(hexValue: 0x240017) + case .shade50: + return Color(hexValue: 0x13000C) + case .tint10: + return Color(hexValue: 0x87105D) + case .tint20: + return Color(hexValue: 0x98246F) + case .tint30: + return Color(hexValue: 0xAD4589) + case .tint40: + return Color(hexValue: 0xD696C0) + case .tint50: + return Color(hexValue: 0xE9C4DC) + case .tint60: + return Color(hexValue: 0xFAF0F6) + } + case .pumpkin: + switch token { + case .primary: + return Color(hexValue: 0xCA5010) + case .shade10: + return Color(hexValue: 0xB6480E) + case .shade20: + return Color(hexValue: 0x9A3D0C) + case .shade30: + return Color(hexValue: 0x712D09) + case .shade40: + return Color(hexValue: 0x3D1805) + case .shade50: + return Color(hexValue: 0x200D03) + case .tint10: + return Color(hexValue: 0xD06228) + case .tint20: + return Color(hexValue: 0xD77440) + case .tint30: + return Color(hexValue: 0xDF8E64) + case .tint40: + return Color(hexValue: 0xEFC4AD) + case .tint50: + return Color(hexValue: 0xF7DFD2) + case .tint60: + return Color(hexValue: 0xFDF7F4) + } + case .purple: + switch token { + case .primary: + return Color(hexValue: 0x5C2E91) + case .shade10: + return Color(hexValue: 0x532982) + case .shade20: + return Color(hexValue: 0x46236E) + case .shade30: + return Color(hexValue: 0x341A51) + case .shade40: + return Color(hexValue: 0x1C0E2B) + case .shade50: + return Color(hexValue: 0x0F0717) + case .tint10: + return Color(hexValue: 0x6B3F9E) + case .tint20: + return Color(hexValue: 0x7C52AB) + case .tint30: + return Color(hexValue: 0x9470BD) + case .tint40: + return Color(hexValue: 0xC6B1DE) + case .tint50: + return Color(hexValue: 0xE0D3ED) + case .tint60: + return Color(hexValue: 0xF7F4FB) + } + case .red: + switch token { + case .primary: + return Color(hexValue: 0xD13438) + case .shade10: + return Color(hexValue: 0xBC2F32) + case .shade20: + return Color(hexValue: 0x9F282B) + case .shade30: + return Color(hexValue: 0x751D1F) + case .shade40: + return Color(hexValue: 0x3F1011) + case .shade50: + return Color(hexValue: 0x210809) + case .tint10: + return Color(hexValue: 0xD7494C) + case .tint20: + return Color(hexValue: 0xDC5E62) + case .tint30: + return Color(hexValue: 0xE37D80) + case .tint40: + return Color(hexValue: 0xF1BBBC) + case .tint50: + return Color(hexValue: 0xF8DADB) + case .tint60: + return Color(hexValue: 0xFDF6F6) + } + case .royalBlue: + switch token { + case .primary: + return Color(hexValue: 0x004E8C) + case .shade10: + return Color(hexValue: 0x00467E) + case .shade20: + return Color(hexValue: 0x003B6A) + case .shade30: + return Color(hexValue: 0x002C4E) + case .shade40: + return Color(hexValue: 0x00172A) + case .shade50: + return Color(hexValue: 0x000C16) + case .tint10: + return Color(hexValue: 0x125E9A) + case .tint20: + return Color(hexValue: 0x286FA8) + case .tint30: + return Color(hexValue: 0x4A89BA) + case .tint40: + return Color(hexValue: 0x9ABFDC) + case .tint50: + return Color(hexValue: 0xC7DCED) + case .tint60: + return Color(hexValue: 0xF0F6FA) + } + case .seafoam: + switch token { + case .primary: + return Color(hexValue: 0x00CC6A) + case .shade10: + return Color(hexValue: 0x00B85F) + case .shade20: + return Color(hexValue: 0x009B51) + case .shade30: + return Color(hexValue: 0x00723B) + case .shade40: + return Color(hexValue: 0x003D20) + case .shade50: + return Color(hexValue: 0x002111) + case .tint10: + return Color(hexValue: 0x19D279) + case .tint20: + return Color(hexValue: 0x34D889) + case .tint30: + return Color(hexValue: 0x5AE0A0) + case .tint40: + return Color(hexValue: 0xA8F0CD) + case .tint50: + return Color(hexValue: 0xCFF7E4) + case .tint60: + return Color(hexValue: 0xF3FDF8) + } + case .silver: + switch token { + case .primary: + return Color(hexValue: 0x859599) + case .shade10: + return Color(hexValue: 0x78868A) + case .shade20: + return Color(hexValue: 0x657174) + case .shade30: + return Color(hexValue: 0x4A5356) + case .shade40: + return Color(hexValue: 0x282D2E) + case .shade50: + return Color(hexValue: 0x151818) + case .tint10: + return Color(hexValue: 0x92A1A5) + case .tint20: + return Color(hexValue: 0xA0AEB1) + case .tint30: + return Color(hexValue: 0xB3BFC2) + case .tint40: + return Color(hexValue: 0xD8DFE0) + case .tint50: + return Color(hexValue: 0xEAEEEF) + case .tint60: + return Color(hexValue: 0xFAFBFB) + } + case .steel: + switch token { + case .primary: + return Color(hexValue: 0x005B70) + case .shade10: + return Color(hexValue: 0x005265) + case .shade20: + return Color(hexValue: 0x004555) + case .shade30: + return Color(hexValue: 0x00333F) + case .shade40: + return Color(hexValue: 0x001B22) + case .shade50: + return Color(hexValue: 0x000F12) + case .tint10: + return Color(hexValue: 0x0F6C81) + case .tint20: + return Color(hexValue: 0x237D92) + case .tint30: + return Color(hexValue: 0x4496A9) + case .tint40: + return Color(hexValue: 0x94C8D4) + case .tint50: + return Color(hexValue: 0xC3E1E8) + case .tint60: + return Color(hexValue: 0xEFF7F9) + } + case .teal: + switch token { + case .primary: + return Color(hexValue: 0x038387) + case .shade10: + return Color(hexValue: 0x037679) + case .shade20: + return Color(hexValue: 0x026467) + case .shade30: + return Color(hexValue: 0x02494C) + case .shade40: + return Color(hexValue: 0x012728) + case .shade50: + return Color(hexValue: 0x001516) + case .tint10: + return Color(hexValue: 0x159195) + case .tint20: + return Color(hexValue: 0x2AA0A4) + case .tint30: + return Color(hexValue: 0x4CB4B7) + case .tint40: + return Color(hexValue: 0x9BD9DB) + case .tint50: + return Color(hexValue: 0xC7EBEC) + case .tint60: + return Color(hexValue: 0xF0FAFA) + } + case .yellow: + switch token { + case .primary: + return Color(hexValue: 0xFDE300) + case .shade10: + return Color(hexValue: 0xE4CC00) + case .shade20: + return Color(hexValue: 0xC0AD00) + case .shade30: + return Color(hexValue: 0x817400) + case .shade40: + return Color(hexValue: 0x4C4400) + case .shade50: + return Color(hexValue: 0x282400) + case .tint10: + return Color(hexValue: 0xFDE61E) + case .tint20: + return Color(hexValue: 0xFDEA3D) + case .tint30: + return Color(hexValue: 0xFEEE66) + case .tint40: + return Color(hexValue: 0xFEF7B2) + case .tint50: + return Color(hexValue: 0xFFFAD6) + case .tint60: + return Color(hexValue: 0xFFFEF5) + } + } + } + + // MARK: - FontSize + + public enum FontSizeToken: TokenSetKey { + case size100 + case size200 + case size300 + case size400 + case size500 + case size600 + case size700 + case size800 + case size900 + } + public static func fontSize(_ token: FontSizeToken) -> CGFloat { + switch token { + case .size100: + return 12.0 + case .size200: + return 13.0 + case .size300: + return 15.0 + case .size400: + return 17.0 + case .size500: + return 20.0 + case .size600: + return 22.0 + case .size700: + return 28.0 + case .size800: + return 34.0 + case .size900: + return 60.0 + } + } + + // MARK: - FontWeight + + public enum FontWeightToken: TokenSetKey { + case regular + case medium + case semibold + case bold + } + public static func fontWeight(_ token: FontWeightToken) -> Font.Weight { + switch token { + case .regular: + return .regular + case .medium: + return .medium + case .semibold: + return .semibold + case .bold: + return .bold + } + } + + // MARK: - IconSize + + public enum IconSizeToken: TokenSetKey { + case size100 + case size120 + case size160 + case size200 + case size240 + case size280 + case size360 + case size400 + case size480 + } + public static func icon(_ token: IconSizeToken) -> CGFloat { + switch token { + case .size100: + return 10 + case .size120: + return 12 + case .size160: + return 16 + case .size200: + return 20 + case .size240: + return 24 + case .size280: + return 28 + case .size360: + return 36 + case .size400: + return 40 + case .size480: + return 48 + } + } + + // MARK: - Spacing + + public enum SpacingToken: TokenSetKey { + case sizeNone + case size20 + case size40 + case size60 + case size80 + case size100 + case size120 + case size160 + case size200 + case size240 + case size280 + case size320 + case size360 + case size400 + case size480 + case size520 + case size560 + } + public static func spacing(_ token: SpacingToken) -> CGFloat { + switch token { + case .sizeNone: + return 0 + case .size20: + return 2 + case .size40: + return 4 + case .size60: + return 6 + case .size80: + return 8 + case .size100: + return 10 + case .size120: + return 12 + case .size160: + return 16 + case .size200: + return 20 + case .size240: + return 24 + case .size280: + return 28 + case .size320: + return 32 + case .size360: + return 36 + case .size400: + return 40 + case .size480: + return 48 + case .size520: + return 52 + case .size560: + return 56 + } + } + + // MARK: - BorderRadius + + public enum CornerRadiusToken: TokenSetKey { + case radiusNone + case radius20 + case radius40 + case radius60 + case radius80 + case radius120 + case radiusCircular + } + public static func corner(_ token: CornerRadiusToken) -> CGFloat { + switch token { + case .radiusNone: + return 0 + case .radius20: + return 2 + case .radius40: + return 4 + case .radius60: + return 6 + case .radius80: + return 8 + case .radius120: + return 12 + case .radiusCircular: + return 9999 + } + } + + // MARK: - BorderSize + + public enum StrokeWidthToken: TokenSetKey { + case widthNone + case width05 + case width10 + case width15 + case width20 + case width30 + case width40 + case width60 + } + public static func stroke(_ token: StrokeWidthToken) -> CGFloat { + switch token { + case .widthNone: + return 0 + case .width05: + return 0.5 + case .width10: + return 1 + case .width15: + return 1.5 + case .width20: + return 2 + case .width30: + return 3 + case .width40: + return 4 + case .width60: + return 6 + } + } + + // MARK: Initialization + + @available(*, unavailable) + private override init() { + preconditionFailure("GlobalTokens should never be initialized!") + } +} diff --git a/ios/FluentUI/Core/Theme/Tokens/LinearGradientInfo.swift b/Sources/FluentUI_iOS/Core/Theme/Tokens/LinearGradientInfo.swift similarity index 100% rename from ios/FluentUI/Core/Theme/Tokens/LinearGradientInfo.swift rename to Sources/FluentUI_iOS/Core/Theme/Tokens/LinearGradientInfo.swift diff --git a/Sources/FluentUI_iOS/Core/Theme/Tokens/ShadowInfo+UIKit.swift b/Sources/FluentUI_iOS/Core/Theme/Tokens/ShadowInfo+UIKit.swift new file mode 100644 index 0000000000..a4edaf211b --- /dev/null +++ b/Sources/FluentUI_iOS/Core/Theme/Tokens/ShadowInfo+UIKit.swift @@ -0,0 +1,85 @@ +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// + +import SwiftUI +import UIKit + +public extension ShadowInfo { + + /// Initializes a shadow struct to be used in Fluent. + /// + /// - Parameters: + /// - keyColor: The color of the key shadow. + /// - keyBlur: The blur of the key shadow. + /// - xKey: The horizontal offset of the key shadow. + /// - yKey: The vertical offset of the key shadow. + /// - ambientColor: The color of the ambient shadow. + /// - ambientBlur: The blur of the ambient shadow. + /// - xAmbient: The horizontal offset of the ambient shadow. + /// - yAmbient: The vertical offset of the ambient shadow. + @objc convenience init(keyColor: UIColor, + keyBlur: CGFloat, + xKey: CGFloat, + yKey: CGFloat, + ambientColor: UIColor, + ambientBlur: CGFloat, + xAmbient: CGFloat, + yAmbient: CGFloat) { + self.init(keyColor: Color(keyColor), + keyBlur: keyBlur, + xKey: xKey, + yKey: yKey, + ambientColor: Color(ambientColor), + ambientBlur: ambientBlur, + xAmbient: xAmbient, + yAmbient: yAmbient) + } + + /// Applies a key and an ambient shadow on a `UIView`. + /// - Parameters: + /// - view: The view on which the shadows will be applied. + /// - parentController: The view controller responsible for the view on which the shadows will be applied. + func applyShadow(to view: UIView, parentController: UIViewController? = nil) { + guard var shadowable = (view as? Shadowable) ?? (view.superview as? Shadowable) ?? (parentController as? Shadowable) else { + assertionFailure("Cannot apply Fluent shadows to a non-Shadowable view") + return + } + + shadowable.ambientShadow?.removeFromSuperlayer() + shadowable.keyShadow?.removeFromSuperlayer() + + let ambientShadow = initializeShadowLayer(view: view, isAmbientShadow: true) + let keyShadow = initializeShadowLayer(view: view) + + shadowable.ambientShadow = ambientShadow + shadowable.keyShadow = keyShadow + + view.layer.insertSublayer(ambientShadow, at: 0) + view.layer.insertSublayer(keyShadow, below: ambientShadow) + } + + /// Initializes a `CALayer` with the relevant `ShadowInfo` values. + /// - Parameters: + /// - view: The view on which the shadow layer will be applied. + /// - isAmbientShadow: Determines whether to apply ambient or key shadow values on the layer. + /// - Returns: The modified `CALayer`. + func initializeShadowLayer(view: UIView, isAmbientShadow: Bool = false) -> CALayer { + let layer = CALayer() + + layer.frame = view.bounds + layer.shadowColor = UIColor(isAmbientShadow ? ambientColor : keyColor).cgColor + layer.shadowRadius = isAmbientShadow ? ambientBlur : keyBlur + + // The shadowOpacity needs to be set to 1 since the alpha is already set through shadowColor + layer.shadowOpacity = 1 + layer.shadowOffset = CGSize(width: isAmbientShadow ? xAmbient : xKey, + height: isAmbientShadow ? yAmbient : yKey) + layer.needsDisplayOnBoundsChange = true + layer.cornerRadius = view.layer.cornerRadius + layer.backgroundColor = view.backgroundColor?.cgColor + + return layer + } +} diff --git a/ios/FluentUI/Core/Theme/Tokens/ShadowInfo.swift b/Sources/FluentUI_iOS/Core/Theme/Tokens/ShadowInfo.swift similarity index 54% rename from ios/FluentUI/Core/Theme/Tokens/ShadowInfo.swift rename to Sources/FluentUI_iOS/Core/Theme/Tokens/ShadowInfo.swift index 5cca73c048..5b2c723d95 100644 --- a/ios/FluentUI/Core/Theme/Tokens/ShadowInfo.swift +++ b/Sources/FluentUI_iOS/Core/Theme/Tokens/ShadowInfo.swift @@ -4,8 +4,8 @@ // import CoreGraphics -import UIKit -import Foundation +import QuartzCore +import SwiftUI /// Represents a two-part shadow as used by FluentUI. @objc(MSFShadowInfo) @@ -21,11 +21,11 @@ public class ShadowInfo: NSObject { /// - ambientBlur: The blur of the ambient shadow. /// - xAmbient: The horizontal offset of the ambient shadow. /// - yAmbient: The vertical offset of the ambient shadow. - public init(keyColor: UIColor, + public init(keyColor: Color, keyBlur: CGFloat, xKey: CGFloat, yKey: CGFloat, - ambientColor: UIColor, + ambientColor: Color, ambientBlur: CGFloat, xAmbient: CGFloat, yAmbient: CGFloat) { @@ -40,7 +40,7 @@ public class ShadowInfo: NSObject { } /// The color of the key shadow. - @objc public let keyColor: UIColor + public let keyColor: Color /// The blur of the key shadow. @objc public let keyBlur: CGFloat @@ -52,7 +52,7 @@ public class ShadowInfo: NSObject { @objc public let yKey: CGFloat /// The color of the ambient shadow. - @objc public let ambientColor: UIColor + public let ambientColor: Color /// The blur of the ambient shadow. @objc public let ambientBlur: CGFloat @@ -67,49 +67,8 @@ public class ShadowInfo: NSObject { private let shadowBlurAdjustment: CGFloat = 0.5 } -public extension ShadowInfo { - - func applyShadow(to view: UIView, parentController: UIViewController? = nil) { - guard var shadowable = (view as? Shadowable) ?? (view.superview as? Shadowable) ?? (parentController as? Shadowable) else { - assertionFailure("Cannot apply Fluent shadows to a non-Shadowable view") - return - } - - shadowable.ambientShadow?.removeFromSuperlayer() - shadowable.keyShadow?.removeFromSuperlayer() - - let ambientShadow = initializeShadowLayer(view: view, isAmbientShadow: true) - let keyShadow = initializeShadowLayer(view: view) - - shadowable.ambientShadow = ambientShadow - shadowable.keyShadow = keyShadow - - view.layer.insertSublayer(ambientShadow, at: 0) - view.layer.insertSublayer(keyShadow, below: ambientShadow) - } - - func initializeShadowLayer(view: UIView, isAmbientShadow: Bool = false) -> CALayer { - let layer = CALayer() - - layer.frame = view.bounds - layer.shadowColor = (isAmbientShadow ? ambientColor : keyColor).cgColor - layer.shadowRadius = isAmbientShadow ? ambientBlur : keyBlur - - // The shadowOpacity needs to be set to 1 since the alpha is already set through shadowColor - layer.shadowOpacity = 1 - layer.shadowOffset = CGSize(width: isAmbientShadow ? xAmbient : xKey, - height: isAmbientShadow ? yAmbient : yKey) - layer.needsDisplayOnBoundsChange = true - layer.cornerRadius = view.layer.cornerRadius - layer.backgroundColor = view.backgroundColor?.cgColor - - return layer - } -} - -/// Public protocol that, when implemented, allows any UIView or one of its subviews to implement fluent shadows +/// Public protocol that, when implemented, allows any view or one of its subviews to implement fluent shadows public protocol Shadowable { - /// The layer on which the ambient shadow is implemented var ambientShadow: CALayer? { get set } diff --git a/ios/FluentUI/Core/Theme/Tokens/TokenSet.swift b/Sources/FluentUI_iOS/Core/Theme/Tokens/TokenSet.swift similarity index 100% rename from ios/FluentUI/Core/Theme/Tokens/TokenSet.swift rename to Sources/FluentUI_iOS/Core/Theme/Tokens/TokenSet.swift diff --git a/ios/FluentUI/Core/Theme/Tokens/TokenizedControl.swift b/Sources/FluentUI_iOS/Core/Theme/Tokens/TokenizedControl.swift similarity index 63% rename from ios/FluentUI/Core/Theme/Tokens/TokenizedControl.swift rename to Sources/FluentUI_iOS/Core/Theme/Tokens/TokenizedControl.swift index d132780a7d..868c9c34d3 100644 --- a/ios/FluentUI/Core/Theme/Tokens/TokenizedControl.swift +++ b/Sources/FluentUI_iOS/Core/Theme/Tokens/TokenizedControl.swift @@ -14,9 +14,3 @@ public protocol TokenizedControl { /// The set of tokens associated with this `TokenizedControl`. var tokenSet: TokenSetType { get } } - -/// Internal extension to `TokenizedControl` that adds the ability to modify the active tokens. -protocol TokenizedControlInternal: TokenizedControl { - /// The current `FluentTheme` applied to this control. Usually acquired via the environment. - var fluentTheme: FluentTheme { get } -} diff --git a/ios/FluentUI/Core/Theme/Tokens/TokenizedControlView.swift b/Sources/FluentUI_iOS/Core/Theme/Tokens/TokenizedControlView.swift similarity index 78% rename from ios/FluentUI/Core/Theme/Tokens/TokenizedControlView.swift rename to Sources/FluentUI_iOS/Core/Theme/Tokens/TokenizedControlView.swift index b31817519d..50e1f417e1 100644 --- a/ios/FluentUI/Core/Theme/Tokens/TokenizedControlView.swift +++ b/Sources/FluentUI_iOS/Core/Theme/Tokens/TokenizedControlView.swift @@ -3,10 +3,11 @@ // Licensed under the MIT License. // +import Combine import SwiftUI /// SwiftUI-specific extension to `TokenizedControl`. -public protocol TokenizedControlOverridable: TokenizedControl { +public protocol TokenizedControlView: TokenizedControl { /// Modifier function that updates the design tokens for a given control. /// /// - Parameter tokens: The tokens to apply to this control. @@ -15,11 +16,8 @@ public protocol TokenizedControlOverridable: TokenizedControl { func overrideTokens(_ overrideTokens: [TokenSetKeyType: ControlTokenValue]?) -> Self } -/// Internal union of `TokenizedControlOverridable` and `TokenizedControlInternal` protocols. -internal protocol TokenizedControlView: TokenizedControlOverridable, TokenizedControlInternal {} - /// Common base type alias for all `state` objects. -typealias ControlState = NSObject & ObservableObject & Identifiable +public typealias ControlState = NSObject & ObservableObject & Identifiable // MARK: - Extensions diff --git a/Sources/FluentUI_iOS/Core/UIKit+SwiftUI_interoperability.swift b/Sources/FluentUI_iOS/Core/UIKit+SwiftUI_interoperability.swift new file mode 100644 index 0000000000..9580e22ad6 --- /dev/null +++ b/Sources/FluentUI_iOS/Core/UIKit+SwiftUI_interoperability.swift @@ -0,0 +1,33 @@ +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// + +import UIKit +import SwiftUI + +/// This is a generic UIView wrapper that allows SwiftUI to use UIKit views in its hierarchy. +struct UIViewAdapter: UIViewRepresentable { + + var makeView: () -> UIView + + init(_ makeView: @escaping @autoclosure () -> UIView) { + self.makeView = makeView + } + + func makeUIView(context: Context) -> UIStackView { + // Using a UIStackView as the container ensures that the content + // UIView respects the frame defined in the SwiftUI layer. + return UIStackView(arrangedSubviews: [makeView()]) + } + + func updateUIView(_ stackview: UIStackView, context: Context) { + // The UIStackView container needs to update its arranged subviews to cover + // the case where the makeview property now provides a different view. + stackview.arrangedSubviews.forEach({ subview in + subview.removeFromSuperview() + }) + + stackview.addArrangedSubview(makeView()) + } +} diff --git a/ios/FluentUI/Utilities/AnimationSynchronizer.swift b/Sources/FluentUI_iOS/Core/Utilities/AnimationSynchronizer.swift similarity index 100% rename from ios/FluentUI/Utilities/AnimationSynchronizer.swift rename to Sources/FluentUI_iOS/Core/Utilities/AnimationSynchronizer.swift diff --git a/ios/FluentUI/Core/module.modulemap b/Sources/FluentUI_iOS/Core/module.modulemap similarity index 100% rename from ios/FluentUI/Core/module.modulemap rename to Sources/FluentUI_iOS/Core/module.modulemap diff --git a/ios/FluentUI/FluentUI.h b/Sources/FluentUI_iOS/FluentUI.h similarity index 100% rename from ios/FluentUI/FluentUI.h rename to Sources/FluentUI_iOS/FluentUI.h diff --git a/ios/README.md b/Sources/FluentUI_iOS/README.md similarity index 86% rename from ios/README.md rename to Sources/FluentUI_iOS/README.md index 59b64180cd..8557d2b672 100644 --- a/ios/README.md +++ b/Sources/FluentUI_iOS/README.md @@ -14,7 +14,7 @@ FluentUI for iOS is a native framework that provides the Microsoft UI experience ## Colors and Typography -FluentUI for iOS provides [colors](FluentUI/Core/Colors.swift) and [typography](FluentUI/Core/Fonts.swift) core to experiences within the Fluent Design language. +FluentUI for iOS provides [colors](Core/FluentTheme+Tokens.swift) and [typography](Core/FluentTheme+Tokens.swift) core to experiences within the Fluent Design language. ## Controls @@ -54,15 +54,15 @@ Some of the controls available include: - TableViewCellShimmer - Tooltip -A full list of currently supported controls can be found here: [FluentUI](FluentUI). +A full list of currently supported controls can be found here: [Components](Components). ## Demo app -Included in this repository is a demo of currently implemented controls. A full list of implemented controls available in the demo can be found here: [Demos](FluentUI.Demo/FluentUI.Demo/Demos). +Included in this repository is a demo of currently implemented controls. A full list of implemented controls available in the demo can be found here: [Demos](/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos). To build and deploy the demo follow these steps: - Download or clone the [FluentUI for iOS](https://github.com/microsoft/fluentui-apple) repository. -- Open `ios/FluentUI.xcworkspace` in Xcode. +- Open `Demos/FluentUIDemo_iOS/FluentUI.Demo.xcodeproj` in Xcode. - In the Xcode scheme menu choose `Demo.development` and choose a device to deploy to. - Once deployed you can choose a control to demo from the list of controls on the selected device. diff --git a/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/Contents.json b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/Contents.json new file mode 100644 index 0000000000..73c00596a7 --- /dev/null +++ b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_available_10_filled.imageset/Contents.json b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_available_10_filled.imageset/Contents.json similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_available_10_filled.imageset/Contents.json rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_available_10_filled.imageset/Contents.json diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_available_10_filled.imageset/ic_fluent_presence_available_10_filled.pdf b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_available_10_filled.imageset/ic_fluent_presence_available_10_filled.pdf similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_available_10_filled.imageset/ic_fluent_presence_available_10_filled.pdf rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_available_10_filled.imageset/ic_fluent_presence_available_10_filled.pdf diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_available_12_filled.imageset/Contents.json b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_available_12_filled.imageset/Contents.json similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_available_12_filled.imageset/Contents.json rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_available_12_filled.imageset/Contents.json diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_available_12_filled.imageset/ic_fluent_presence_available_12_filled.pdf b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_available_12_filled.imageset/ic_fluent_presence_available_12_filled.pdf similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_available_12_filled.imageset/ic_fluent_presence_available_12_filled.pdf rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_available_12_filled.imageset/ic_fluent_presence_available_12_filled.pdf diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_available_16_filled.imageset/Contents.json b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_available_16_filled.imageset/Contents.json similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_available_16_filled.imageset/Contents.json rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_available_16_filled.imageset/Contents.json diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_available_16_filled.imageset/ic_fluent_presence_available_16_filled.pdf b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_available_16_filled.imageset/ic_fluent_presence_available_16_filled.pdf similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_available_16_filled.imageset/ic_fluent_presence_available_16_filled.pdf rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_available_16_filled.imageset/ic_fluent_presence_available_16_filled.pdf diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_available_16_regular.imageset/Contents.json b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_available_16_regular.imageset/Contents.json similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_available_16_regular.imageset/Contents.json rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_available_16_regular.imageset/Contents.json diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_available_16_regular.imageset/ic_fluent_presence_available_16_regular.pdf b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_available_16_regular.imageset/ic_fluent_presence_available_16_regular.pdf similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_available_16_regular.imageset/ic_fluent_presence_available_16_regular.pdf rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_available_16_regular.imageset/ic_fluent_presence_available_16_regular.pdf diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_away_10_filled.imageset/Contents.json b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_away_10_filled.imageset/Contents.json similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_away_10_filled.imageset/Contents.json rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_away_10_filled.imageset/Contents.json diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_away_10_filled.imageset/ic_fluent_presence_away_10_filled.pdf b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_away_10_filled.imageset/ic_fluent_presence_away_10_filled.pdf similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_away_10_filled.imageset/ic_fluent_presence_away_10_filled.pdf rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_away_10_filled.imageset/ic_fluent_presence_away_10_filled.pdf diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_away_12_filled.imageset/Contents.json b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_away_12_filled.imageset/Contents.json similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_away_12_filled.imageset/Contents.json rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_away_12_filled.imageset/Contents.json diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_away_12_filled.imageset/ic_fluent_presence_away_12_filled.pdf b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_away_12_filled.imageset/ic_fluent_presence_away_12_filled.pdf similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_away_12_filled.imageset/ic_fluent_presence_away_12_filled.pdf rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_away_12_filled.imageset/ic_fluent_presence_away_12_filled.pdf diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_away_16_filled.imageset/Contents.json b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_away_16_filled.imageset/Contents.json similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_away_16_filled.imageset/Contents.json rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_away_16_filled.imageset/Contents.json diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_away_16_filled.imageset/ic_fluent_presence_away_16_filled.pdf b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_away_16_filled.imageset/ic_fluent_presence_away_16_filled.pdf similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_away_16_filled.imageset/ic_fluent_presence_away_16_filled.pdf rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_away_16_filled.imageset/ic_fluent_presence_away_16_filled.pdf diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_blocked_10_regular.imageset/Contents.json b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_blocked_10_regular.imageset/Contents.json similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_blocked_10_regular.imageset/Contents.json rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_blocked_10_regular.imageset/Contents.json diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_blocked_10_regular.imageset/ic_fluent_presence_blocked_10_regular.pdf b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_blocked_10_regular.imageset/ic_fluent_presence_blocked_10_regular.pdf similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_blocked_10_regular.imageset/ic_fluent_presence_blocked_10_regular.pdf rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_blocked_10_regular.imageset/ic_fluent_presence_blocked_10_regular.pdf diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_blocked_12_regular.imageset/Contents.json b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_blocked_12_regular.imageset/Contents.json similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_blocked_12_regular.imageset/Contents.json rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_blocked_12_regular.imageset/Contents.json diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_blocked_12_regular.imageset/ic_fluent_presence_blocked_12_regular.pdf b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_blocked_12_regular.imageset/ic_fluent_presence_blocked_12_regular.pdf similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_blocked_12_regular.imageset/ic_fluent_presence_blocked_12_regular.pdf rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_blocked_12_regular.imageset/ic_fluent_presence_blocked_12_regular.pdf diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_blocked_16_regular.imageset/Contents.json b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_blocked_16_regular.imageset/Contents.json similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_blocked_16_regular.imageset/Contents.json rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_blocked_16_regular.imageset/Contents.json diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_blocked_16_regular.imageset/ic_fluent_presence_blocked_16_regular.pdf b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_blocked_16_regular.imageset/ic_fluent_presence_blocked_16_regular.pdf similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_blocked_16_regular.imageset/ic_fluent_presence_blocked_16_regular.pdf rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_blocked_16_regular.imageset/ic_fluent_presence_blocked_16_regular.pdf diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_busy_10_filled.imageset/Contents.json b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_busy_10_filled.imageset/Contents.json similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_busy_10_filled.imageset/Contents.json rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_busy_10_filled.imageset/Contents.json diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_busy_10_filled.imageset/ic_fluent_presence_busy_10_filled.pdf b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_busy_10_filled.imageset/ic_fluent_presence_busy_10_filled.pdf similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_busy_10_filled.imageset/ic_fluent_presence_busy_10_filled.pdf rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_busy_10_filled.imageset/ic_fluent_presence_busy_10_filled.pdf diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_busy_12_filled.imageset/Contents.json b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_busy_12_filled.imageset/Contents.json similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_busy_12_filled.imageset/Contents.json rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_busy_12_filled.imageset/Contents.json diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_busy_12_filled.imageset/ic_fluent_presence_busy_12_filled.pdf b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_busy_12_filled.imageset/ic_fluent_presence_busy_12_filled.pdf similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_busy_12_filled.imageset/ic_fluent_presence_busy_12_filled.pdf rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_busy_12_filled.imageset/ic_fluent_presence_busy_12_filled.pdf diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_busy_16_filled.imageset/Contents.json b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_busy_16_filled.imageset/Contents.json similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_busy_16_filled.imageset/Contents.json rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_busy_16_filled.imageset/Contents.json diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_busy_16_filled.imageset/ic_fluent_presence_busy_16_filled.pdf b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_busy_16_filled.imageset/ic_fluent_presence_busy_16_filled.pdf similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_busy_16_filled.imageset/ic_fluent_presence_busy_16_filled.pdf rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_busy_16_filled.imageset/ic_fluent_presence_busy_16_filled.pdf diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_dnd_10_filled.imageset/Contents.json b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_dnd_10_filled.imageset/Contents.json similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_dnd_10_filled.imageset/Contents.json rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_dnd_10_filled.imageset/Contents.json diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_dnd_10_filled.imageset/ic_fluent_presence_dnd_10_filled.pdf b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_dnd_10_filled.imageset/ic_fluent_presence_dnd_10_filled.pdf similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_dnd_10_filled.imageset/ic_fluent_presence_dnd_10_filled.pdf rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_dnd_10_filled.imageset/ic_fluent_presence_dnd_10_filled.pdf diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_dnd_12_filled.imageset/Contents.json b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_dnd_12_filled.imageset/Contents.json similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_dnd_12_filled.imageset/Contents.json rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_dnd_12_filled.imageset/Contents.json diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_dnd_12_filled.imageset/ic_fluent_presence_dnd_12_filled.pdf b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_dnd_12_filled.imageset/ic_fluent_presence_dnd_12_filled.pdf similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_dnd_12_filled.imageset/ic_fluent_presence_dnd_12_filled.pdf rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_dnd_12_filled.imageset/ic_fluent_presence_dnd_12_filled.pdf diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_dnd_16_filled.imageset/Contents.json b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_dnd_16_filled.imageset/Contents.json similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_dnd_16_filled.imageset/Contents.json rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_dnd_16_filled.imageset/Contents.json diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_dnd_16_filled.imageset/ic_fluent_presence_dnd_16_filled.pdf b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_dnd_16_filled.imageset/ic_fluent_presence_dnd_16_filled.pdf similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_dnd_16_filled.imageset/ic_fluent_presence_dnd_16_filled.pdf rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_dnd_16_filled.imageset/ic_fluent_presence_dnd_16_filled.pdf diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_dnd_16_regular.imageset/Contents.json b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_dnd_16_regular.imageset/Contents.json similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_dnd_16_regular.imageset/Contents.json rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_dnd_16_regular.imageset/Contents.json diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_dnd_16_regular.imageset/ic_fluent_presence_dnd_16_regular.pdf b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_dnd_16_regular.imageset/ic_fluent_presence_dnd_16_regular.pdf similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_dnd_16_regular.imageset/ic_fluent_presence_dnd_16_regular.pdf rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_dnd_16_regular.imageset/ic_fluent_presence_dnd_16_regular.pdf diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_offline_10_regular.imageset/Contents.json b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_offline_10_regular.imageset/Contents.json similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_offline_10_regular.imageset/Contents.json rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_offline_10_regular.imageset/Contents.json diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_offline_10_regular.imageset/ic_fluent_presence_offline_10_regular.pdf b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_offline_10_regular.imageset/ic_fluent_presence_offline_10_regular.pdf similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_offline_10_regular.imageset/ic_fluent_presence_offline_10_regular.pdf rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_offline_10_regular.imageset/ic_fluent_presence_offline_10_regular.pdf diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_offline_12_regular.imageset/Contents.json b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_offline_12_regular.imageset/Contents.json similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_offline_12_regular.imageset/Contents.json rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_offline_12_regular.imageset/Contents.json diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_offline_12_regular.imageset/ic_fluent_presence_offline_12_regular.pdf b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_offline_12_regular.imageset/ic_fluent_presence_offline_12_regular.pdf similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_offline_12_regular.imageset/ic_fluent_presence_offline_12_regular.pdf rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_offline_12_regular.imageset/ic_fluent_presence_offline_12_regular.pdf diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_offline_16_regular.imageset/Contents.json b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_offline_16_regular.imageset/Contents.json similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_offline_16_regular.imageset/Contents.json rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_offline_16_regular.imageset/Contents.json diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_offline_16_regular.imageset/ic_fluent_presence_offline_16_regular.pdf b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_offline_16_regular.imageset/ic_fluent_presence_offline_16_regular.pdf similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_offline_16_regular.imageset/ic_fluent_presence_offline_16_regular.pdf rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_offline_16_regular.imageset/ic_fluent_presence_offline_16_regular.pdf diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_oof_10_regular.imageset/Contents.json b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_oof_10_regular.imageset/Contents.json similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_oof_10_regular.imageset/Contents.json rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_oof_10_regular.imageset/Contents.json diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_oof_10_regular.imageset/ic_fluent_presence_oof_10_regular.pdf b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_oof_10_regular.imageset/ic_fluent_presence_oof_10_regular.pdf similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_oof_10_regular.imageset/ic_fluent_presence_oof_10_regular.pdf rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_oof_10_regular.imageset/ic_fluent_presence_oof_10_regular.pdf diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_oof_12_regular.imageset/Contents.json b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_oof_12_regular.imageset/Contents.json similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_oof_12_regular.imageset/Contents.json rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_oof_12_regular.imageset/Contents.json diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_oof_12_regular.imageset/ic_fluent_presence_oof_12_regular.pdf b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_oof_12_regular.imageset/ic_fluent_presence_oof_12_regular.pdf similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_oof_12_regular.imageset/ic_fluent_presence_oof_12_regular.pdf rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_oof_12_regular.imageset/ic_fluent_presence_oof_12_regular.pdf diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_oof_16_regular.imageset/Contents.json b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_oof_16_regular.imageset/Contents.json similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_oof_16_regular.imageset/Contents.json rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_oof_16_regular.imageset/Contents.json diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_oof_16_regular.imageset/ic_fluent_presence_oof_16_regular.pdf b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_oof_16_regular.imageset/ic_fluent_presence_oof_16_regular.pdf similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_oof_16_regular.imageset/ic_fluent_presence_oof_16_regular.pdf rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_oof_16_regular.imageset/ic_fluent_presence_oof_16_regular.pdf diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_unknown_10_regular.imageset/Contents.json b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_unknown_10_regular.imageset/Contents.json similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_unknown_10_regular.imageset/Contents.json rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_unknown_10_regular.imageset/Contents.json diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_unknown_10_regular.imageset/ic_fluent_presence_unknown_10_regular.pdf b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_unknown_10_regular.imageset/ic_fluent_presence_unknown_10_regular.pdf similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_unknown_10_regular.imageset/ic_fluent_presence_unknown_10_regular.pdf rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_unknown_10_regular.imageset/ic_fluent_presence_unknown_10_regular.pdf diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_unknown_12_regular.imageset/Contents.json b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_unknown_12_regular.imageset/Contents.json similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_unknown_12_regular.imageset/Contents.json rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_unknown_12_regular.imageset/Contents.json diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_unknown_12_regular.imageset/ic_fluent_presence_unknown_12_regular.pdf b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_unknown_12_regular.imageset/ic_fluent_presence_unknown_12_regular.pdf similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_unknown_12_regular.imageset/ic_fluent_presence_unknown_12_regular.pdf rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_unknown_12_regular.imageset/ic_fluent_presence_unknown_12_regular.pdf diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_unknown_16_regular.imageset/Contents.json b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_unknown_16_regular.imageset/Contents.json similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_unknown_16_regular.imageset/Contents.json rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_unknown_16_regular.imageset/Contents.json diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_unknown_16_regular.imageset/ic_fluent_presence_unknown_16_regular.pdf b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_unknown_16_regular.imageset/ic_fluent_presence_unknown_16_regular.pdf similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_unknown_16_regular.imageset/ic_fluent_presence_unknown_16_regular.pdf rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/Presence/ic_fluent_presence_unknown_16_regular.imageset/ic_fluent_presence_unknown_16_regular.pdf diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/Presence/presenceBorder.colorset/Contents.json b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/Presence/presenceBorder.colorset/Contents.json similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/Presence/presenceBorder.colorset/Contents.json rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/Presence/presenceBorder.colorset/Contents.json diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/back-24x24.imageset/Contents.json b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/back-24x24.imageset/Contents.json similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/back-24x24.imageset/Contents.json rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/back-24x24.imageset/Contents.json diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/back-24x24.imageset/ic_ios_arrow_left_24_outlined.pdf b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/back-24x24.imageset/ic_ios_arrow_left_24_outlined.pdf similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/back-24x24.imageset/ic_ios_arrow_left_24_outlined.pdf rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/back-24x24.imageset/ic_ios_arrow_left_24_outlined.pdf diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/checkmark-24x24.imageset/Contents.json b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/checkmark-24x24.imageset/Contents.json similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/checkmark-24x24.imageset/Contents.json rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/checkmark-24x24.imageset/Contents.json diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/checkmark-24x24.imageset/ic_checkmark_24_outlined.pdf b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/checkmark-24x24.imageset/ic_checkmark_24_outlined.pdf similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/checkmark-24x24.imageset/ic_checkmark_24_outlined.pdf rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/checkmark-24x24.imageset/ic_checkmark_24_outlined.pdf diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/checkmark-36x36.imageset/Contents.json b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/checkmark-36x36.imageset/Contents.json similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/checkmark-36x36.imageset/Contents.json rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/checkmark-36x36.imageset/Contents.json diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/checkmark-36x36.imageset/checkmark_36_regular.pdf b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/checkmark-36x36.imageset/checkmark_36_regular.pdf similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/checkmark-36x36.imageset/checkmark_36_regular.pdf rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/checkmark-36x36.imageset/checkmark_36_regular.pdf diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/checkmark-thin-20x20.imageset/Contents.json b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/checkmark-thin-20x20.imageset/Contents.json similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/checkmark-thin-20x20.imageset/Contents.json rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/checkmark-thin-20x20.imageset/Contents.json diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/checkmark-thin-20x20.imageset/ic_checkmark_20_outlined.pdf b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/checkmark-thin-20x20.imageset/ic_checkmark_20_outlined.pdf similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/checkmark-thin-20x20.imageset/ic_checkmark_20_outlined.pdf rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/checkmark-thin-20x20.imageset/ic_checkmark_20_outlined.pdf diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/chevron-down-12x12.imageset/Contents.json b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/chevron-down-12x12.imageset/Contents.json similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/chevron-down-12x12.imageset/Contents.json rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/chevron-down-12x12.imageset/Contents.json diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/chevron-down-12x12.imageset/ic_fluent_chevron_down_12_filled.pdf b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/chevron-down-12x12.imageset/ic_fluent_chevron_down_12_filled.pdf similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/chevron-down-12x12.imageset/ic_fluent_chevron_down_12_filled.pdf rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/chevron-down-12x12.imageset/ic_fluent_chevron_down_12_filled.pdf diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/chevron-down-16x16.imageset/Contents.json b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/chevron-down-16x16.imageset/Contents.json similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/chevron-down-16x16.imageset/Contents.json rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/chevron-down-16x16.imageset/Contents.json diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/chevron-down-16x16.imageset/ic_fluent_chevron_down_16_filled.pdf b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/chevron-down-16x16.imageset/ic_fluent_chevron_down_16_filled.pdf similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/chevron-down-16x16.imageset/ic_fluent_chevron_down_16_filled.pdf rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/chevron-down-16x16.imageset/ic_fluent_chevron_down_16_filled.pdf diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/chevron-right-12x12.imageset/Contents.json b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/chevron-right-12x12.imageset/Contents.json similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/chevron-right-12x12.imageset/Contents.json rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/chevron-right-12x12.imageset/Contents.json diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/chevron-right-12x12.imageset/ic_fluent_chevron_right_12_filled.pdf b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/chevron-right-12x12.imageset/ic_fluent_chevron_right_12_filled.pdf similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/chevron-right-12x12.imageset/ic_fluent_chevron_right_12_filled.pdf rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/chevron-right-12x12.imageset/ic_fluent_chevron_right_12_filled.pdf diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/chevron-right-16x16.imageset/Contents.json b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/chevron-right-16x16.imageset/Contents.json similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/chevron-right-16x16.imageset/Contents.json rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/chevron-right-16x16.imageset/Contents.json diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/chevron-right-16x16.imageset/ic_fluent_chevron_right_16_filled.pdf b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/chevron-right-16x16.imageset/ic_fluent_chevron_right_16_filled.pdf similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/chevron-right-16x16.imageset/ic_fluent_chevron_right_16_filled.pdf rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/chevron-right-16x16.imageset/ic_fluent_chevron_right_16_filled.pdf diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/dismiss-20x20.imageset/Contents.json b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/dismiss-20x20.imageset/Contents.json similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/dismiss-20x20.imageset/Contents.json rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/dismiss-20x20.imageset/Contents.json diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/dismiss-20x20.imageset/ic_fluent_dismiss_20_filled.pdf b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/dismiss-20x20.imageset/ic_fluent_dismiss_20_filled.pdf similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/dismiss-20x20.imageset/ic_fluent_dismiss_20_filled.pdf rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/dismiss-20x20.imageset/ic_fluent_dismiss_20_filled.pdf diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/dismiss-36x36.imageset/Contents.json b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/dismiss-36x36.imageset/Contents.json similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/dismiss-36x36.imageset/Contents.json rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/dismiss-36x36.imageset/Contents.json diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/dismiss-36x36.imageset/dismiss_36_regular.pdf b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/dismiss-36x36.imageset/dismiss_36_regular.pdf similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/dismiss-36x36.imageset/dismiss_36_regular.pdf rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/dismiss-36x36.imageset/dismiss_36_regular.pdf diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/iOS-chevron-right-20x20.imageset/Contents.json b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/iOS-chevron-right-20x20.imageset/Contents.json similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/iOS-chevron-right-20x20.imageset/Contents.json rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/iOS-chevron-right-20x20.imageset/Contents.json diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/iOS-chevron-right-20x20.imageset/ic_fluent_ios_chevron_right_20_filled.pdf b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/iOS-chevron-right-20x20.imageset/ic_fluent_ios_chevron_right_20_filled.pdf similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/iOS-chevron-right-20x20.imageset/ic_fluent_ios_chevron_right_20_filled.pdf rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/iOS-chevron-right-20x20.imageset/ic_fluent_ios_chevron_right_20_filled.pdf diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/ic_fluent_dismiss_circle_24_regular.imageset/Contents.json b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/ic_fluent_dismiss_circle_24_regular.imageset/Contents.json similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/ic_fluent_dismiss_circle_24_regular.imageset/Contents.json rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/ic_fluent_dismiss_circle_24_regular.imageset/Contents.json diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/ic_fluent_dismiss_circle_24_regular.imageset/ic_fluent_dismiss_circle_24_regular.svg b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/ic_fluent_dismiss_circle_24_regular.imageset/ic_fluent_dismiss_circle_24_regular.svg similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/ic_fluent_dismiss_circle_24_regular.imageset/ic_fluent_dismiss_circle_24_regular.svg rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/ic_fluent_dismiss_circle_24_regular.imageset/ic_fluent_dismiss_circle_24_regular.svg diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/ic_fluent_people_24_regular.imageset/Contents.json b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/ic_fluent_people_24_regular.imageset/Contents.json similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/ic_fluent_people_24_regular.imageset/Contents.json rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/ic_fluent_people_24_regular.imageset/Contents.json diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/ic_fluent_people_24_regular.imageset/ic_fluent_people_24_regular.pdf b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/ic_fluent_people_24_regular.imageset/ic_fluent_people_24_regular.pdf similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/ic_fluent_people_24_regular.imageset/ic_fluent_people_24_regular.pdf rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/ic_fluent_people_24_regular.imageset/ic_fluent_people_24_regular.pdf diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/ic_fluent_person_24_regular.imageset/Contents.json b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/ic_fluent_person_24_regular.imageset/Contents.json similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/ic_fluent_person_24_regular.imageset/Contents.json rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/ic_fluent_person_24_regular.imageset/Contents.json diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/ic_fluent_person_24_regular.imageset/ic_fluent_person_24_regular.pdf b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/ic_fluent_person_24_regular.imageset/ic_fluent_person_24_regular.pdf similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/ic_fluent_person_24_regular.imageset/ic_fluent_person_24_regular.pdf rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/ic_fluent_person_24_regular.imageset/ic_fluent_person_24_regular.pdf diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/more-24x24.imageset/Contents.json b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/more-24x24.imageset/Contents.json similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/more-24x24.imageset/Contents.json rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/more-24x24.imageset/Contents.json diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/more-24x24.imageset/ic_more_24_outlined.pdf b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/more-24x24.imageset/ic_more_24_outlined.pdf similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/more-24x24.imageset/ic_more_24_outlined.pdf rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/more-24x24.imageset/ic_more_24_outlined.pdf diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/person_12_filled.imageset/Contents.json b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/person_12_filled.imageset/Contents.json similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/person_12_filled.imageset/Contents.json rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/person_12_filled.imageset/Contents.json diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/person_12_filled.imageset/ic_fluent_person_12_filled.pdf b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/person_12_filled.imageset/ic_fluent_person_12_filled.pdf similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/person_12_filled.imageset/ic_fluent_person_12_filled.pdf rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/person_12_filled.imageset/ic_fluent_person_12_filled.pdf diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/person_12_regular.imageset/Contents.json b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/person_12_regular.imageset/Contents.json similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/person_12_regular.imageset/Contents.json rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/person_12_regular.imageset/Contents.json diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/person_12_regular.imageset/ic_fluent_person_12_regular.pdf b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/person_12_regular.imageset/ic_fluent_person_12_regular.pdf similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/person_12_regular.imageset/ic_fluent_person_12_regular.pdf rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/person_12_regular.imageset/ic_fluent_person_12_regular.pdf diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/person_16_filled.imageset/Contents.json b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/person_16_filled.imageset/Contents.json similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/person_16_filled.imageset/Contents.json rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/person_16_filled.imageset/Contents.json diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/person_16_filled.imageset/ic_fluent_person_16_filled.pdf b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/person_16_filled.imageset/ic_fluent_person_16_filled.pdf similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/person_16_filled.imageset/ic_fluent_person_16_filled.pdf rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/person_16_filled.imageset/ic_fluent_person_16_filled.pdf diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/person_16_regular.imageset/Contents.json b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/person_16_regular.imageset/Contents.json similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/person_16_regular.imageset/Contents.json rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/person_16_regular.imageset/Contents.json diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/person_16_regular.imageset/ic_fluent_person_16_regular.pdf b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/person_16_regular.imageset/ic_fluent_person_16_regular.pdf similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/person_16_regular.imageset/ic_fluent_person_16_regular.pdf rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/person_16_regular.imageset/ic_fluent_person_16_regular.pdf diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/person_20_filled.imageset/Contents.json b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/person_20_filled.imageset/Contents.json similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/person_20_filled.imageset/Contents.json rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/person_20_filled.imageset/Contents.json diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/person_20_filled.imageset/ic_fluent_person_20_filled.pdf b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/person_20_filled.imageset/ic_fluent_person_20_filled.pdf similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/person_20_filled.imageset/ic_fluent_person_20_filled.pdf rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/person_20_filled.imageset/ic_fluent_person_20_filled.pdf diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/person_20_regular.imageset/Contents.json b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/person_20_regular.imageset/Contents.json similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/person_20_regular.imageset/Contents.json rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/person_20_regular.imageset/Contents.json diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/person_20_regular.imageset/ic_fluent_person_20_regular.pdf b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/person_20_regular.imageset/ic_fluent_person_20_regular.pdf similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/person_20_regular.imageset/ic_fluent_person_20_regular.pdf rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/person_20_regular.imageset/ic_fluent_person_20_regular.pdf diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/person_24_filled.imageset/Contents.json b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/person_24_filled.imageset/Contents.json similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/person_24_filled.imageset/Contents.json rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/person_24_filled.imageset/Contents.json diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/person_24_filled.imageset/ic_fluent_person_24_filled.pdf b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/person_24_filled.imageset/ic_fluent_person_24_filled.pdf similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/person_24_filled.imageset/ic_fluent_person_24_filled.pdf rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/person_24_filled.imageset/ic_fluent_person_24_filled.pdf diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/person_24_regular.imageset/Contents.json b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/person_24_regular.imageset/Contents.json similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/person_24_regular.imageset/Contents.json rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/person_24_regular.imageset/Contents.json diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/person_24_regular.imageset/ic_fluent_person_24_regular.pdf b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/person_24_regular.imageset/ic_fluent_person_24_regular.pdf similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/person_24_regular.imageset/ic_fluent_person_24_regular.pdf rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/person_24_regular.imageset/ic_fluent_person_24_regular.pdf diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/person_28_filled.imageset/Contents.json b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/person_28_filled.imageset/Contents.json similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/person_28_filled.imageset/Contents.json rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/person_28_filled.imageset/Contents.json diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/person_28_filled.imageset/ic_fluent_person_28_filled.pdf b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/person_28_filled.imageset/ic_fluent_person_28_filled.pdf similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/person_28_filled.imageset/ic_fluent_person_28_filled.pdf rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/person_28_filled.imageset/ic_fluent_person_28_filled.pdf diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/person_28_regular.imageset/Contents.json b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/person_28_regular.imageset/Contents.json similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/person_28_regular.imageset/Contents.json rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/person_28_regular.imageset/Contents.json diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/person_28_regular.imageset/ic_fluent_person_28_regular.pdf b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/person_28_regular.imageset/ic_fluent_person_28_regular.pdf similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/person_28_regular.imageset/ic_fluent_person_28_regular.pdf rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/person_28_regular.imageset/ic_fluent_person_28_regular.pdf diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/person_48_filled.imageset/Contents.json b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/person_48_filled.imageset/Contents.json similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/person_48_filled.imageset/Contents.json rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/person_48_filled.imageset/Contents.json diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/person_48_filled.imageset/ic_fluent_person_48_filled.pdf b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/person_48_filled.imageset/ic_fluent_person_48_filled.pdf similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/person_48_filled.imageset/ic_fluent_person_48_filled.pdf rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/person_48_filled.imageset/ic_fluent_person_48_filled.pdf diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/person_48_regular.imageset/Contents.json b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/person_48_regular.imageset/Contents.json similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/person_48_regular.imageset/Contents.json rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/person_48_regular.imageset/Contents.json diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/person_48_regular.imageset/ic_fluent_person_48_regular.pdf b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/person_48_regular.imageset/ic_fluent_person_48_regular.pdf similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/person_48_regular.imageset/ic_fluent_person_48_regular.pdf rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/person_48_regular.imageset/ic_fluent_person_48_regular.pdf diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/search-20x20.imageset/Contents.json b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/search-20x20.imageset/Contents.json similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/search-20x20.imageset/Contents.json rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/search-20x20.imageset/Contents.json diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/search-20x20.imageset/ic_search_20_outlined.pdf b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/search-20x20.imageset/ic_search_20_outlined.pdf similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/search-20x20.imageset/ic_search_20_outlined.pdf rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/search-20x20.imageset/ic_search_20_outlined.pdf diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/search-clear.imageset/Contents.json b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/search-clear.imageset/Contents.json similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/search-clear.imageset/Contents.json rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/search-clear.imageset/Contents.json diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/search-clear.imageset/search-bar-clear.pdf b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/search-clear.imageset/search-bar-clear.pdf similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/search-clear.imageset/search-bar-clear.pdf rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/search-clear.imageset/search-bar-clear.pdf diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/selection-off.imageset/Contents.json b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/selection-off.imageset/Contents.json similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/selection-off.imageset/Contents.json rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/selection-off.imageset/Contents.json diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/selection-off.imageset/unselected.pdf b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/selection-off.imageset/unselected.pdf similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/selection-off.imageset/unselected.pdf rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/selection-off.imageset/unselected.pdf diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/selection-on.imageset/Contents.json b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/selection-on.imageset/Contents.json similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/selection-on.imageset/Contents.json rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/selection-on.imageset/Contents.json diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/selection-on.imageset/selected.pdf b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/selection-on.imageset/selected.pdf similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/selection-on.imageset/selected.pdf rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/selection-on.imageset/selected.pdf diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/tooltip-arrow.imageset/Contents.json b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/tooltip-arrow.imageset/Contents.json similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/tooltip-arrow.imageset/Contents.json rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/tooltip-arrow.imageset/Contents.json diff --git a/ios/FluentUI/Resources/FluentUI-ios.xcassets/tooltip-arrow.imageset/tooltip-arrow.pdf b/Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/tooltip-arrow.imageset/tooltip-arrow.pdf similarity index 100% rename from ios/FluentUI/Resources/FluentUI-ios.xcassets/tooltip-arrow.imageset/tooltip-arrow.pdf rename to Sources/FluentUI_iOS/Resources/FluentUI-ios.xcassets/tooltip-arrow.imageset/tooltip-arrow.pdf diff --git a/ios/FluentUI/Resources/Localization/CultureMapping.json b/Sources/FluentUI_iOS/Resources/Localization/CultureMapping.json similarity index 100% rename from ios/FluentUI/Resources/Localization/CultureMapping.json rename to Sources/FluentUI_iOS/Resources/Localization/CultureMapping.json diff --git a/ios/FluentUI/Resources/Localization/ar.lproj/Localizable.strings b/Sources/FluentUI_iOS/Resources/Localization/ar.lproj/Localizable.strings similarity index 100% rename from ios/FluentUI/Resources/Localization/ar.lproj/Localizable.strings rename to Sources/FluentUI_iOS/Resources/Localization/ar.lproj/Localizable.strings diff --git a/ios/FluentUI/Resources/Localization/ar.lproj/Localizable.stringsdict b/Sources/FluentUI_iOS/Resources/Localization/ar.lproj/Localizable.stringsdict similarity index 100% rename from ios/FluentUI/Resources/Localization/ar.lproj/Localizable.stringsdict rename to Sources/FluentUI_iOS/Resources/Localization/ar.lproj/Localizable.stringsdict diff --git a/ios/FluentUI/Resources/Localization/ca.lproj/Localizable.strings b/Sources/FluentUI_iOS/Resources/Localization/ca.lproj/Localizable.strings similarity index 100% rename from ios/FluentUI/Resources/Localization/ca.lproj/Localizable.strings rename to Sources/FluentUI_iOS/Resources/Localization/ca.lproj/Localizable.strings diff --git a/ios/FluentUI/Resources/Localization/ca.lproj/Localizable.stringsdict b/Sources/FluentUI_iOS/Resources/Localization/ca.lproj/Localizable.stringsdict similarity index 100% rename from ios/FluentUI/Resources/Localization/ca.lproj/Localizable.stringsdict rename to Sources/FluentUI_iOS/Resources/Localization/ca.lproj/Localizable.stringsdict diff --git a/ios/FluentUI/Resources/Localization/cs.lproj/Localizable.strings b/Sources/FluentUI_iOS/Resources/Localization/cs.lproj/Localizable.strings similarity index 100% rename from ios/FluentUI/Resources/Localization/cs.lproj/Localizable.strings rename to Sources/FluentUI_iOS/Resources/Localization/cs.lproj/Localizable.strings diff --git a/ios/FluentUI/Resources/Localization/cs.lproj/Localizable.stringsdict b/Sources/FluentUI_iOS/Resources/Localization/cs.lproj/Localizable.stringsdict similarity index 100% rename from ios/FluentUI/Resources/Localization/cs.lproj/Localizable.stringsdict rename to Sources/FluentUI_iOS/Resources/Localization/cs.lproj/Localizable.stringsdict diff --git a/ios/FluentUI/Resources/Localization/da.lproj/Localizable.strings b/Sources/FluentUI_iOS/Resources/Localization/da.lproj/Localizable.strings similarity index 100% rename from ios/FluentUI/Resources/Localization/da.lproj/Localizable.strings rename to Sources/FluentUI_iOS/Resources/Localization/da.lproj/Localizable.strings diff --git a/ios/FluentUI/Resources/Localization/da.lproj/Localizable.stringsdict b/Sources/FluentUI_iOS/Resources/Localization/da.lproj/Localizable.stringsdict similarity index 100% rename from ios/FluentUI/Resources/Localization/da.lproj/Localizable.stringsdict rename to Sources/FluentUI_iOS/Resources/Localization/da.lproj/Localizable.stringsdict diff --git a/ios/FluentUI/Resources/Localization/de.lproj/Localizable.strings b/Sources/FluentUI_iOS/Resources/Localization/de.lproj/Localizable.strings similarity index 100% rename from ios/FluentUI/Resources/Localization/de.lproj/Localizable.strings rename to Sources/FluentUI_iOS/Resources/Localization/de.lproj/Localizable.strings diff --git a/ios/FluentUI/Resources/Localization/de.lproj/Localizable.stringsdict b/Sources/FluentUI_iOS/Resources/Localization/de.lproj/Localizable.stringsdict similarity index 100% rename from ios/FluentUI/Resources/Localization/de.lproj/Localizable.stringsdict rename to Sources/FluentUI_iOS/Resources/Localization/de.lproj/Localizable.stringsdict diff --git a/ios/FluentUI/Resources/Localization/el.lproj/Localizable.strings b/Sources/FluentUI_iOS/Resources/Localization/el.lproj/Localizable.strings similarity index 100% rename from ios/FluentUI/Resources/Localization/el.lproj/Localizable.strings rename to Sources/FluentUI_iOS/Resources/Localization/el.lproj/Localizable.strings diff --git a/ios/FluentUI/Resources/Localization/el.lproj/Localizable.stringsdict b/Sources/FluentUI_iOS/Resources/Localization/el.lproj/Localizable.stringsdict similarity index 100% rename from ios/FluentUI/Resources/Localization/el.lproj/Localizable.stringsdict rename to Sources/FluentUI_iOS/Resources/Localization/el.lproj/Localizable.stringsdict diff --git a/ios/FluentUI/Resources/Localization/en-GB.lproj/Localizable.strings b/Sources/FluentUI_iOS/Resources/Localization/en-GB.lproj/Localizable.strings similarity index 100% rename from ios/FluentUI/Resources/Localization/en-GB.lproj/Localizable.strings rename to Sources/FluentUI_iOS/Resources/Localization/en-GB.lproj/Localizable.strings diff --git a/ios/FluentUI/Resources/Localization/en-GB.lproj/Localizable.stringsdict b/Sources/FluentUI_iOS/Resources/Localization/en-GB.lproj/Localizable.stringsdict similarity index 100% rename from ios/FluentUI/Resources/Localization/en-GB.lproj/Localizable.stringsdict rename to Sources/FluentUI_iOS/Resources/Localization/en-GB.lproj/Localizable.stringsdict diff --git a/ios/FluentUI/Resources/Localization/en.lproj/Localizable.strings b/Sources/FluentUI_iOS/Resources/Localization/en.lproj/Localizable.strings similarity index 96% rename from ios/FluentUI/Resources/Localization/en.lproj/Localizable.strings rename to Sources/FluentUI_iOS/Resources/Localization/en.lproj/Localizable.strings index d74480ba92..e3d54c67d0 100644 --- a/ios/FluentUI/Resources/Localization/en.lproj/Localizable.strings +++ b/Sources/FluentUI_iOS/Resources/Localization/en.lproj/Localizable.strings @@ -82,10 +82,14 @@ "Accessibility.Drawer.ResizingHandle.Label.Expand" = "Expand"; /* Accessibility hint for drawer's resizing handle when it has expand action */ "Accessibility.Drawer.ResizingHandle.Hint.Expand" = "Double tap to expand"; +/* Accessibility value for drawer's resizing handle when the sheet is in a collapsed state */ +"Accessibility.Drawer.ResizingHandle.Value.Collapsed" = "Collapsed"; /* Accessibility label for drawer's resizing handle when it has collapse action */ "Accessibility.Drawer.ResizingHandle.Label.Collapse" = "Collapse"; /* Accessibility hint for drawer's resizing handle when it has collapse action */ "Accessibility.Drawer.ResizingHandle.Hint.Collapse" = "Double tap to collapse"; +/* Accessibility value for drawer's resizing handle when the sheet is in a expanded state */ +"Accessibility.Drawer.ResizingHandle.Value.Expanded" = "Expanded"; /* Accessibility label for when a task under progress has finished */ "Accessibility.HUD.Done" = "Done"; diff --git a/ios/FluentUI/Resources/Localization/en.lproj/Localizable.stringsdict b/Sources/FluentUI_iOS/Resources/Localization/en.lproj/Localizable.stringsdict similarity index 100% rename from ios/FluentUI/Resources/Localization/en.lproj/Localizable.stringsdict rename to Sources/FluentUI_iOS/Resources/Localization/en.lproj/Localizable.stringsdict diff --git a/ios/FluentUI/Resources/Localization/es-MX.lproj/Localizable.strings b/Sources/FluentUI_iOS/Resources/Localization/es-MX.lproj/Localizable.strings similarity index 100% rename from ios/FluentUI/Resources/Localization/es-MX.lproj/Localizable.strings rename to Sources/FluentUI_iOS/Resources/Localization/es-MX.lproj/Localizable.strings diff --git a/ios/FluentUI/Resources/Localization/es-MX.lproj/Localizable.stringsdict b/Sources/FluentUI_iOS/Resources/Localization/es-MX.lproj/Localizable.stringsdict similarity index 100% rename from ios/FluentUI/Resources/Localization/es-MX.lproj/Localizable.stringsdict rename to Sources/FluentUI_iOS/Resources/Localization/es-MX.lproj/Localizable.stringsdict diff --git a/ios/FluentUI/Resources/Localization/es.lproj/Localizable.strings b/Sources/FluentUI_iOS/Resources/Localization/es.lproj/Localizable.strings similarity index 100% rename from ios/FluentUI/Resources/Localization/es.lproj/Localizable.strings rename to Sources/FluentUI_iOS/Resources/Localization/es.lproj/Localizable.strings diff --git a/ios/FluentUI/Resources/Localization/es.lproj/Localizable.stringsdict b/Sources/FluentUI_iOS/Resources/Localization/es.lproj/Localizable.stringsdict similarity index 100% rename from ios/FluentUI/Resources/Localization/es.lproj/Localizable.stringsdict rename to Sources/FluentUI_iOS/Resources/Localization/es.lproj/Localizable.stringsdict diff --git a/ios/FluentUI/Resources/Localization/fi.lproj/Localizable.strings b/Sources/FluentUI_iOS/Resources/Localization/fi.lproj/Localizable.strings similarity index 100% rename from ios/FluentUI/Resources/Localization/fi.lproj/Localizable.strings rename to Sources/FluentUI_iOS/Resources/Localization/fi.lproj/Localizable.strings diff --git a/ios/FluentUI/Resources/Localization/fi.lproj/Localizable.stringsdict b/Sources/FluentUI_iOS/Resources/Localization/fi.lproj/Localizable.stringsdict similarity index 100% rename from ios/FluentUI/Resources/Localization/fi.lproj/Localizable.stringsdict rename to Sources/FluentUI_iOS/Resources/Localization/fi.lproj/Localizable.stringsdict diff --git a/ios/FluentUI/Resources/Localization/fr.lproj/Localizable.strings b/Sources/FluentUI_iOS/Resources/Localization/fr.lproj/Localizable.strings similarity index 100% rename from ios/FluentUI/Resources/Localization/fr.lproj/Localizable.strings rename to Sources/FluentUI_iOS/Resources/Localization/fr.lproj/Localizable.strings diff --git a/ios/FluentUI/Resources/Localization/fr.lproj/Localizable.stringsdict b/Sources/FluentUI_iOS/Resources/Localization/fr.lproj/Localizable.stringsdict similarity index 100% rename from ios/FluentUI/Resources/Localization/fr.lproj/Localizable.stringsdict rename to Sources/FluentUI_iOS/Resources/Localization/fr.lproj/Localizable.stringsdict diff --git a/ios/FluentUI/Resources/Localization/he.lproj/Localizable.strings b/Sources/FluentUI_iOS/Resources/Localization/he.lproj/Localizable.strings similarity index 100% rename from ios/FluentUI/Resources/Localization/he.lproj/Localizable.strings rename to Sources/FluentUI_iOS/Resources/Localization/he.lproj/Localizable.strings diff --git a/ios/FluentUI/Resources/Localization/he.lproj/Localizable.stringsdict b/Sources/FluentUI_iOS/Resources/Localization/he.lproj/Localizable.stringsdict similarity index 100% rename from ios/FluentUI/Resources/Localization/he.lproj/Localizable.stringsdict rename to Sources/FluentUI_iOS/Resources/Localization/he.lproj/Localizable.stringsdict diff --git a/ios/FluentUI/Resources/Localization/hi.lproj/Localizable.strings b/Sources/FluentUI_iOS/Resources/Localization/hi.lproj/Localizable.strings similarity index 100% rename from ios/FluentUI/Resources/Localization/hi.lproj/Localizable.strings rename to Sources/FluentUI_iOS/Resources/Localization/hi.lproj/Localizable.strings diff --git a/ios/FluentUI/Resources/Localization/hi.lproj/Localizable.stringsdict b/Sources/FluentUI_iOS/Resources/Localization/hi.lproj/Localizable.stringsdict similarity index 100% rename from ios/FluentUI/Resources/Localization/hi.lproj/Localizable.stringsdict rename to Sources/FluentUI_iOS/Resources/Localization/hi.lproj/Localizable.stringsdict diff --git a/ios/FluentUI/Resources/Localization/hr.lproj/Localizable.strings b/Sources/FluentUI_iOS/Resources/Localization/hr.lproj/Localizable.strings similarity index 100% rename from ios/FluentUI/Resources/Localization/hr.lproj/Localizable.strings rename to Sources/FluentUI_iOS/Resources/Localization/hr.lproj/Localizable.strings diff --git a/ios/FluentUI/Resources/Localization/hr.lproj/Localizable.stringsdict b/Sources/FluentUI_iOS/Resources/Localization/hr.lproj/Localizable.stringsdict similarity index 100% rename from ios/FluentUI/Resources/Localization/hr.lproj/Localizable.stringsdict rename to Sources/FluentUI_iOS/Resources/Localization/hr.lproj/Localizable.stringsdict diff --git a/ios/FluentUI/Resources/Localization/hu.lproj/Localizable.strings b/Sources/FluentUI_iOS/Resources/Localization/hu.lproj/Localizable.strings similarity index 100% rename from ios/FluentUI/Resources/Localization/hu.lproj/Localizable.strings rename to Sources/FluentUI_iOS/Resources/Localization/hu.lproj/Localizable.strings diff --git a/ios/FluentUI/Resources/Localization/hu.lproj/Localizable.stringsdict b/Sources/FluentUI_iOS/Resources/Localization/hu.lproj/Localizable.stringsdict similarity index 100% rename from ios/FluentUI/Resources/Localization/hu.lproj/Localizable.stringsdict rename to Sources/FluentUI_iOS/Resources/Localization/hu.lproj/Localizable.stringsdict diff --git a/ios/FluentUI/Resources/Localization/id.lproj/Localizable.strings b/Sources/FluentUI_iOS/Resources/Localization/id.lproj/Localizable.strings similarity index 100% rename from ios/FluentUI/Resources/Localization/id.lproj/Localizable.strings rename to Sources/FluentUI_iOS/Resources/Localization/id.lproj/Localizable.strings diff --git a/ios/FluentUI/Resources/Localization/id.lproj/Localizable.stringsdict b/Sources/FluentUI_iOS/Resources/Localization/id.lproj/Localizable.stringsdict similarity index 100% rename from ios/FluentUI/Resources/Localization/id.lproj/Localizable.stringsdict rename to Sources/FluentUI_iOS/Resources/Localization/id.lproj/Localizable.stringsdict diff --git a/ios/FluentUI/Resources/Localization/it.lproj/Localizable.strings b/Sources/FluentUI_iOS/Resources/Localization/it.lproj/Localizable.strings similarity index 100% rename from ios/FluentUI/Resources/Localization/it.lproj/Localizable.strings rename to Sources/FluentUI_iOS/Resources/Localization/it.lproj/Localizable.strings diff --git a/ios/FluentUI/Resources/Localization/it.lproj/Localizable.stringsdict b/Sources/FluentUI_iOS/Resources/Localization/it.lproj/Localizable.stringsdict similarity index 100% rename from ios/FluentUI/Resources/Localization/it.lproj/Localizable.stringsdict rename to Sources/FluentUI_iOS/Resources/Localization/it.lproj/Localizable.stringsdict diff --git a/ios/FluentUI/Resources/Localization/ja.lproj/Localizable.strings b/Sources/FluentUI_iOS/Resources/Localization/ja.lproj/Localizable.strings similarity index 100% rename from ios/FluentUI/Resources/Localization/ja.lproj/Localizable.strings rename to Sources/FluentUI_iOS/Resources/Localization/ja.lproj/Localizable.strings diff --git a/ios/FluentUI/Resources/Localization/ja.lproj/Localizable.stringsdict b/Sources/FluentUI_iOS/Resources/Localization/ja.lproj/Localizable.stringsdict similarity index 100% rename from ios/FluentUI/Resources/Localization/ja.lproj/Localizable.stringsdict rename to Sources/FluentUI_iOS/Resources/Localization/ja.lproj/Localizable.stringsdict diff --git a/ios/FluentUI/Resources/Localization/ko.lproj/Localizable.strings b/Sources/FluentUI_iOS/Resources/Localization/ko.lproj/Localizable.strings similarity index 100% rename from ios/FluentUI/Resources/Localization/ko.lproj/Localizable.strings rename to Sources/FluentUI_iOS/Resources/Localization/ko.lproj/Localizable.strings diff --git a/ios/FluentUI/Resources/Localization/ko.lproj/Localizable.stringsdict b/Sources/FluentUI_iOS/Resources/Localization/ko.lproj/Localizable.stringsdict similarity index 100% rename from ios/FluentUI/Resources/Localization/ko.lproj/Localizable.stringsdict rename to Sources/FluentUI_iOS/Resources/Localization/ko.lproj/Localizable.stringsdict diff --git a/ios/FluentUI/Resources/Localization/ms.lproj/Localizable.strings b/Sources/FluentUI_iOS/Resources/Localization/ms.lproj/Localizable.strings similarity index 100% rename from ios/FluentUI/Resources/Localization/ms.lproj/Localizable.strings rename to Sources/FluentUI_iOS/Resources/Localization/ms.lproj/Localizable.strings diff --git a/ios/FluentUI/Resources/Localization/ms.lproj/Localizable.stringsdict b/Sources/FluentUI_iOS/Resources/Localization/ms.lproj/Localizable.stringsdict similarity index 100% rename from ios/FluentUI/Resources/Localization/ms.lproj/Localizable.stringsdict rename to Sources/FluentUI_iOS/Resources/Localization/ms.lproj/Localizable.stringsdict diff --git a/ios/FluentUI/Resources/Localization/nb-NO.lproj/Localizable.strings b/Sources/FluentUI_iOS/Resources/Localization/nb-NO.lproj/Localizable.strings similarity index 100% rename from ios/FluentUI/Resources/Localization/nb-NO.lproj/Localizable.strings rename to Sources/FluentUI_iOS/Resources/Localization/nb-NO.lproj/Localizable.strings diff --git a/ios/FluentUI/Resources/Localization/nb-NO.lproj/Localizable.stringsdict b/Sources/FluentUI_iOS/Resources/Localization/nb-NO.lproj/Localizable.stringsdict similarity index 100% rename from ios/FluentUI/Resources/Localization/nb-NO.lproj/Localizable.stringsdict rename to Sources/FluentUI_iOS/Resources/Localization/nb-NO.lproj/Localizable.stringsdict diff --git a/ios/FluentUI/Resources/Localization/nl.lproj/Localizable.strings b/Sources/FluentUI_iOS/Resources/Localization/nl.lproj/Localizable.strings similarity index 100% rename from ios/FluentUI/Resources/Localization/nl.lproj/Localizable.strings rename to Sources/FluentUI_iOS/Resources/Localization/nl.lproj/Localizable.strings diff --git a/ios/FluentUI/Resources/Localization/nl.lproj/Localizable.stringsdict b/Sources/FluentUI_iOS/Resources/Localization/nl.lproj/Localizable.stringsdict similarity index 100% rename from ios/FluentUI/Resources/Localization/nl.lproj/Localizable.stringsdict rename to Sources/FluentUI_iOS/Resources/Localization/nl.lproj/Localizable.stringsdict diff --git a/ios/FluentUI/Resources/Localization/pl.lproj/Localizable.strings b/Sources/FluentUI_iOS/Resources/Localization/pl.lproj/Localizable.strings similarity index 100% rename from ios/FluentUI/Resources/Localization/pl.lproj/Localizable.strings rename to Sources/FluentUI_iOS/Resources/Localization/pl.lproj/Localizable.strings diff --git a/ios/FluentUI/Resources/Localization/pl.lproj/Localizable.stringsdict b/Sources/FluentUI_iOS/Resources/Localization/pl.lproj/Localizable.stringsdict similarity index 100% rename from ios/FluentUI/Resources/Localization/pl.lproj/Localizable.stringsdict rename to Sources/FluentUI_iOS/Resources/Localization/pl.lproj/Localizable.stringsdict diff --git a/ios/FluentUI/Resources/Localization/pt-BR.lproj/Localizable.strings b/Sources/FluentUI_iOS/Resources/Localization/pt-BR.lproj/Localizable.strings similarity index 100% rename from ios/FluentUI/Resources/Localization/pt-BR.lproj/Localizable.strings rename to Sources/FluentUI_iOS/Resources/Localization/pt-BR.lproj/Localizable.strings diff --git a/ios/FluentUI/Resources/Localization/pt-BR.lproj/Localizable.stringsdict b/Sources/FluentUI_iOS/Resources/Localization/pt-BR.lproj/Localizable.stringsdict similarity index 100% rename from ios/FluentUI/Resources/Localization/pt-BR.lproj/Localizable.stringsdict rename to Sources/FluentUI_iOS/Resources/Localization/pt-BR.lproj/Localizable.stringsdict diff --git a/ios/FluentUI/Resources/Localization/pt-PT.lproj/Localizable.strings b/Sources/FluentUI_iOS/Resources/Localization/pt-PT.lproj/Localizable.strings similarity index 100% rename from ios/FluentUI/Resources/Localization/pt-PT.lproj/Localizable.strings rename to Sources/FluentUI_iOS/Resources/Localization/pt-PT.lproj/Localizable.strings diff --git a/ios/FluentUI/Resources/Localization/pt-PT.lproj/Localizable.stringsdict b/Sources/FluentUI_iOS/Resources/Localization/pt-PT.lproj/Localizable.stringsdict similarity index 100% rename from ios/FluentUI/Resources/Localization/pt-PT.lproj/Localizable.stringsdict rename to Sources/FluentUI_iOS/Resources/Localization/pt-PT.lproj/Localizable.stringsdict diff --git a/ios/FluentUI/Resources/Localization/ro.lproj/Localizable.strings b/Sources/FluentUI_iOS/Resources/Localization/ro.lproj/Localizable.strings similarity index 100% rename from ios/FluentUI/Resources/Localization/ro.lproj/Localizable.strings rename to Sources/FluentUI_iOS/Resources/Localization/ro.lproj/Localizable.strings diff --git a/ios/FluentUI/Resources/Localization/ro.lproj/Localizable.stringsdict b/Sources/FluentUI_iOS/Resources/Localization/ro.lproj/Localizable.stringsdict similarity index 100% rename from ios/FluentUI/Resources/Localization/ro.lproj/Localizable.stringsdict rename to Sources/FluentUI_iOS/Resources/Localization/ro.lproj/Localizable.stringsdict diff --git a/ios/FluentUI/Resources/Localization/ru.lproj/Localizable.strings b/Sources/FluentUI_iOS/Resources/Localization/ru.lproj/Localizable.strings similarity index 100% rename from ios/FluentUI/Resources/Localization/ru.lproj/Localizable.strings rename to Sources/FluentUI_iOS/Resources/Localization/ru.lproj/Localizable.strings diff --git a/ios/FluentUI/Resources/Localization/ru.lproj/Localizable.stringsdict b/Sources/FluentUI_iOS/Resources/Localization/ru.lproj/Localizable.stringsdict similarity index 100% rename from ios/FluentUI/Resources/Localization/ru.lproj/Localizable.stringsdict rename to Sources/FluentUI_iOS/Resources/Localization/ru.lproj/Localizable.stringsdict diff --git a/ios/FluentUI/Resources/Localization/sk.lproj/Localizable.strings b/Sources/FluentUI_iOS/Resources/Localization/sk.lproj/Localizable.strings similarity index 100% rename from ios/FluentUI/Resources/Localization/sk.lproj/Localizable.strings rename to Sources/FluentUI_iOS/Resources/Localization/sk.lproj/Localizable.strings diff --git a/ios/FluentUI/Resources/Localization/sk.lproj/Localizable.stringsdict b/Sources/FluentUI_iOS/Resources/Localization/sk.lproj/Localizable.stringsdict similarity index 100% rename from ios/FluentUI/Resources/Localization/sk.lproj/Localizable.stringsdict rename to Sources/FluentUI_iOS/Resources/Localization/sk.lproj/Localizable.stringsdict diff --git a/ios/FluentUI/Resources/Localization/sv.lproj/Localizable.strings b/Sources/FluentUI_iOS/Resources/Localization/sv.lproj/Localizable.strings similarity index 100% rename from ios/FluentUI/Resources/Localization/sv.lproj/Localizable.strings rename to Sources/FluentUI_iOS/Resources/Localization/sv.lproj/Localizable.strings diff --git a/ios/FluentUI/Resources/Localization/sv.lproj/Localizable.stringsdict b/Sources/FluentUI_iOS/Resources/Localization/sv.lproj/Localizable.stringsdict similarity index 100% rename from ios/FluentUI/Resources/Localization/sv.lproj/Localizable.stringsdict rename to Sources/FluentUI_iOS/Resources/Localization/sv.lproj/Localizable.stringsdict diff --git a/ios/FluentUI/Resources/Localization/th.lproj/Localizable.strings b/Sources/FluentUI_iOS/Resources/Localization/th.lproj/Localizable.strings similarity index 100% rename from ios/FluentUI/Resources/Localization/th.lproj/Localizable.strings rename to Sources/FluentUI_iOS/Resources/Localization/th.lproj/Localizable.strings diff --git a/ios/FluentUI/Resources/Localization/th.lproj/Localizable.stringsdict b/Sources/FluentUI_iOS/Resources/Localization/th.lproj/Localizable.stringsdict similarity index 100% rename from ios/FluentUI/Resources/Localization/th.lproj/Localizable.stringsdict rename to Sources/FluentUI_iOS/Resources/Localization/th.lproj/Localizable.stringsdict diff --git a/ios/FluentUI/Resources/Localization/tr.lproj/Localizable.strings b/Sources/FluentUI_iOS/Resources/Localization/tr.lproj/Localizable.strings similarity index 100% rename from ios/FluentUI/Resources/Localization/tr.lproj/Localizable.strings rename to Sources/FluentUI_iOS/Resources/Localization/tr.lproj/Localizable.strings diff --git a/ios/FluentUI/Resources/Localization/tr.lproj/Localizable.stringsdict b/Sources/FluentUI_iOS/Resources/Localization/tr.lproj/Localizable.stringsdict similarity index 100% rename from ios/FluentUI/Resources/Localization/tr.lproj/Localizable.stringsdict rename to Sources/FluentUI_iOS/Resources/Localization/tr.lproj/Localizable.stringsdict diff --git a/ios/FluentUI/Resources/Localization/uk.lproj/Localizable.strings b/Sources/FluentUI_iOS/Resources/Localization/uk.lproj/Localizable.strings similarity index 100% rename from ios/FluentUI/Resources/Localization/uk.lproj/Localizable.strings rename to Sources/FluentUI_iOS/Resources/Localization/uk.lproj/Localizable.strings diff --git a/ios/FluentUI/Resources/Localization/uk.lproj/Localizable.stringsdict b/Sources/FluentUI_iOS/Resources/Localization/uk.lproj/Localizable.stringsdict similarity index 100% rename from ios/FluentUI/Resources/Localization/uk.lproj/Localizable.stringsdict rename to Sources/FluentUI_iOS/Resources/Localization/uk.lproj/Localizable.stringsdict diff --git a/ios/FluentUI/Resources/Localization/vi.lproj/Localizable.strings b/Sources/FluentUI_iOS/Resources/Localization/vi.lproj/Localizable.strings similarity index 100% rename from ios/FluentUI/Resources/Localization/vi.lproj/Localizable.strings rename to Sources/FluentUI_iOS/Resources/Localization/vi.lproj/Localizable.strings diff --git a/ios/FluentUI/Resources/Localization/vi.lproj/Localizable.stringsdict b/Sources/FluentUI_iOS/Resources/Localization/vi.lproj/Localizable.stringsdict similarity index 100% rename from ios/FluentUI/Resources/Localization/vi.lproj/Localizable.stringsdict rename to Sources/FluentUI_iOS/Resources/Localization/vi.lproj/Localizable.stringsdict diff --git a/ios/FluentUI/Resources/Localization/zh-Hans.lproj/Localizable.strings b/Sources/FluentUI_iOS/Resources/Localization/zh-Hans.lproj/Localizable.strings similarity index 100% rename from ios/FluentUI/Resources/Localization/zh-Hans.lproj/Localizable.strings rename to Sources/FluentUI_iOS/Resources/Localization/zh-Hans.lproj/Localizable.strings diff --git a/ios/FluentUI/Resources/Localization/zh-Hans.lproj/Localizable.stringsdict b/Sources/FluentUI_iOS/Resources/Localization/zh-Hans.lproj/Localizable.stringsdict similarity index 100% rename from ios/FluentUI/Resources/Localization/zh-Hans.lproj/Localizable.stringsdict rename to Sources/FluentUI_iOS/Resources/Localization/zh-Hans.lproj/Localizable.stringsdict diff --git a/ios/FluentUI/Resources/Localization/zh-Hant.lproj/Localizable.strings b/Sources/FluentUI_iOS/Resources/Localization/zh-Hant.lproj/Localizable.strings similarity index 100% rename from ios/FluentUI/Resources/Localization/zh-Hant.lproj/Localizable.strings rename to Sources/FluentUI_iOS/Resources/Localization/zh-Hant.lproj/Localizable.strings diff --git a/ios/FluentUI/Resources/Localization/zh-Hant.lproj/Localizable.stringsdict b/Sources/FluentUI_iOS/Resources/Localization/zh-Hant.lproj/Localizable.stringsdict similarity index 100% rename from ios/FluentUI/Resources/Localization/zh-Hant.lproj/Localizable.stringsdict rename to Sources/FluentUI_iOS/Resources/Localization/zh-Hant.lproj/Localizable.stringsdict diff --git a/macos/xcode/FluentUI.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Sources/FluentUI_iOS/Resources/Version.plist similarity index 61% rename from macos/xcode/FluentUI.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist rename to Sources/FluentUI_iOS/Resources/Version.plist index 18d981003d..0329d64130 100644 --- a/macos/xcode/FluentUI.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +++ b/Sources/FluentUI_iOS/Resources/Version.plist @@ -2,7 +2,9 @@ - IDEDidComputeMac32BitWarning - + CFBundleShortVersionString + 0.32.0 + CFBundleVersion + 0.32.0 diff --git a/macos/CONTRIBUTING.md b/Sources/FluentUI_macOS/CONTRIBUTING.md similarity index 81% rename from macos/CONTRIBUTING.md rename to Sources/FluentUI_macOS/CONTRIBUTING.md index fd759c2764..36df84f0de 100644 --- a/macos/CONTRIBUTING.md +++ b/Sources/FluentUI_macOS/CONTRIBUTING.md @@ -6,19 +6,19 @@ Included in this repository is a demo that showcases all the currently available To build and deploy the demo follow these steps: - clone the [FluentUI](https://github.com/microsoft/fluentui-apple) repository. -- Open `macos/xcode/FluentUI.xcodeproj` in Xcode. +- Open `Demos/FluentUIDemo_macOS/xcode/FluentUI.xcodeproj` in Xcode. - In the Xcode scheme menu choose `FluentUITestApp-macOS` and choose "My Mac" as the deployment target. - Once deployed you can choose a control to test from the list of controls in the left pane. ### Adding a new component -- Create a new folder of the Control name (ex. Foo) under [FluentUI](FluentUI) +- Create a new folder of the Control name (ex. Foo) under [Components](Components) - Create a new swift file. (ex. Foo.swift) - Add Foo.swift and its folder in FluentUI xcode project (All the files are in alphabetical order) - Make sure your file is under FluentUI framework target -- Create and add a test ViewController under [FluentUITestViewControllers](FluentUITestViewControllers) (ex. TestFooViewController.swift) +- Create and add a test ViewController under [FluentUITestViewControllers](/Demos/FluentUIDemo_macOS/FluentUITestViewControllers) (ex. TestFooViewController.swift) - Add TestFooViewController.swift to FluentUI xcode project (All the files are in alphabetical order) - Make sure it is part of FluentUITestViewControllers Target membership -- Add TestFooViewController to the array in [TestViewContronllers.swift](https://github.com/microsoft/fluentui-apple/blob/02b1c3fe601b793cb6cfd24813e11d92420e0d77/macos/FluentUITestViewControllers/TestViewControllers.swift#L14) +- Add TestFooViewController to the array in [TestViewContronllers.swift](https://github.com/microsoft/fluentui-apple/blob/main/Demos/FluentUIDemo_macOS/FluentUITestViewControllers/TestViewControllers.swift) - Add a new cocopod subspec in [MicrosoftFluentUI.podspec](https://github.com/microsoft/fluentui-apple/blob/main/MicrosoftFluentUI.podspec) with required dependencies. "s.subspec 'Foo_mac' do |foo_mac|" - Verify by "pod spec lint" For more info on [cocoapod](https://cocoapods.org) - Build and Run diff --git a/macos/FluentUI/Appearance/Apperance+Theme.swift b/Sources/FluentUI_macOS/Components/Appearance/Apperance+Theme.swift similarity index 100% rename from macos/FluentUI/Appearance/Apperance+Theme.swift rename to Sources/FluentUI_macOS/Components/Appearance/Apperance+Theme.swift diff --git a/macos/FluentUI/AvatarView/AvatarView.swift b/Sources/FluentUI_macOS/Components/AvatarView/AvatarView.swift similarity index 100% rename from macos/FluentUI/AvatarView/AvatarView.swift rename to Sources/FluentUI_macOS/Components/AvatarView/AvatarView.swift diff --git a/macos/FluentUI/Badge/BadgeView.swift b/Sources/FluentUI_macOS/Components/Badge/BadgeView.swift similarity index 100% rename from macos/FluentUI/Badge/BadgeView.swift rename to Sources/FluentUI_macOS/Components/Badge/BadgeView.swift diff --git a/macos/FluentUI/Button/Button.swift b/Sources/FluentUI_macOS/Components/Button/Button.swift similarity index 100% rename from macos/FluentUI/Button/Button.swift rename to Sources/FluentUI_macOS/Components/Button/Button.swift diff --git a/macos/FluentUI/DatePicker/CalendarDayButton.swift b/Sources/FluentUI_macOS/Components/DatePicker/CalendarDayButton.swift similarity index 100% rename from macos/FluentUI/DatePicker/CalendarDayButton.swift rename to Sources/FluentUI_macOS/Components/DatePicker/CalendarDayButton.swift diff --git a/macos/FluentUI/DatePicker/CalendarHeaderView.swift b/Sources/FluentUI_macOS/Components/DatePicker/CalendarHeaderView.swift similarity index 100% rename from macos/FluentUI/DatePicker/CalendarHeaderView.swift rename to Sources/FluentUI_macOS/Components/DatePicker/CalendarHeaderView.swift diff --git a/macos/FluentUI/DatePicker/CalendarView.swift b/Sources/FluentUI_macOS/Components/DatePicker/CalendarView.swift similarity index 100% rename from macos/FluentUI/DatePicker/CalendarView.swift rename to Sources/FluentUI_macOS/Components/DatePicker/CalendarView.swift diff --git a/macos/FluentUI/DatePicker/DatePickerController.swift b/Sources/FluentUI_macOS/Components/DatePicker/DatePickerController.swift similarity index 98% rename from macos/FluentUI/DatePicker/DatePickerController.swift rename to Sources/FluentUI_macOS/Components/DatePicker/DatePickerController.swift index d2a6ff98fd..1164f2dff4 100644 --- a/macos/FluentUI/DatePicker/DatePickerController.swift +++ b/Sources/FluentUI_macOS/Components/DatePicker/DatePickerController.swift @@ -262,10 +262,17 @@ open class DatePickerController: NSViewController { // In this case, we want to use Chinese numerals instead of western // Setting dateStyle to .long before setting the dateFormat will achieve this - if calendar.identifier == .chinese && calendar.locale?.languageCode == "zh" { - formatter.dateStyle = .long + if calendar.identifier == .chinese { + let languageCode: String? + if #available(macOS 13.0, *) { + languageCode = calendar.locale?.language.languageCode?.identifier + } else { + languageCode = calendar.locale?.languageCode + } + if languageCode == "zh" { + formatter.dateStyle = .long + } } - formatter.dateFormat = "d" return formatter diff --git a/macos/FluentUI/DatePicker/DatePickerView.swift b/Sources/FluentUI_macOS/Components/DatePicker/DatePickerView.swift similarity index 100% rename from macos/FluentUI/DatePicker/DatePickerView.swift rename to Sources/FluentUI_macOS/Components/DatePicker/DatePickerView.swift diff --git a/macos/FluentUI/DynamicColor/DynamicColor.swift b/Sources/FluentUI_macOS/Components/DynamicColor/DynamicColor.swift similarity index 95% rename from macos/FluentUI/DynamicColor/DynamicColor.swift rename to Sources/FluentUI_macOS/Components/DynamicColor/DynamicColor.swift index 8ab4e0bc87..5ddc3fe27b 100644 --- a/macos/FluentUI/DynamicColor/DynamicColor.swift +++ b/Sources/FluentUI_macOS/Components/DynamicColor/DynamicColor.swift @@ -22,7 +22,7 @@ public class DynamicColor: NSObject { @objc public let light: NSColor @objc public let dark: NSColor - public init(light: NSColor, dark: NSColor) { + @objc public init(light: NSColor, dark: NSColor) { self.light = light self.dark = dark } diff --git a/macos/FluentUI/FilledTemplateImageView/FilledTemplateImageView.swift b/Sources/FluentUI_macOS/Components/FilledTemplateImageView/FilledTemplateImageView.swift similarity index 100% rename from macos/FluentUI/FilledTemplateImageView/FilledTemplateImageView.swift rename to Sources/FluentUI_macOS/Components/FilledTemplateImageView/FilledTemplateImageView.swift diff --git a/macos/FluentUI/Link/Link.swift b/Sources/FluentUI_macOS/Components/Link/Link.swift similarity index 100% rename from macos/FluentUI/Link/Link.swift rename to Sources/FluentUI_macOS/Components/Link/Link.swift diff --git a/macos/FluentUI/Notification/NotificationBarView.swift b/Sources/FluentUI_macOS/Components/Notification/NotificationBarView.swift similarity index 100% rename from macos/FluentUI/Notification/NotificationBarView.swift rename to Sources/FluentUI_macOS/Components/Notification/NotificationBarView.swift diff --git a/macos/FluentUI/Separator/Separator.swift b/Sources/FluentUI_macOS/Components/Separator/Separator.swift similarity index 100% rename from macos/FluentUI/Separator/Separator.swift rename to Sources/FluentUI_macOS/Components/Separator/Separator.swift diff --git a/macos/FluentUI/Core/ColorProviding.swift b/Sources/FluentUI_macOS/Core/ColorProviding.swift similarity index 100% rename from macos/FluentUI/Core/ColorProviding.swift rename to Sources/FluentUI_macOS/Core/ColorProviding.swift diff --git a/macos/FluentUI/Core/Colors.swift b/Sources/FluentUI_macOS/Core/Colors.swift similarity index 100% rename from macos/FluentUI/Core/Colors.swift rename to Sources/FluentUI_macOS/Core/Colors.swift diff --git a/macos/FluentUI/Core/FluentUIResources.swift b/Sources/FluentUI_macOS/Core/FluentUIResources.swift similarity index 100% rename from macos/FluentUI/Core/FluentUIResources.swift rename to Sources/FluentUI_macOS/Core/FluentUIResources.swift diff --git a/macos/FluentUI/FluentUI-Info.plist b/Sources/FluentUI_macOS/FluentUI-Info.plist similarity index 92% rename from macos/FluentUI/FluentUI-Info.plist rename to Sources/FluentUI_macOS/FluentUI-Info.plist index 2022845a06..9c3726c6a7 100644 --- a/macos/FluentUI/FluentUI-Info.plist +++ b/Sources/FluentUI_macOS/FluentUI-Info.plist @@ -15,8 +15,8 @@ CFBundlePackageType FMWK CFBundleShortVersionString - 0.26.0 + 0.32.0 CFBundleVersion - 0.26.0 + 0.32.0 diff --git a/macos/FluentUI/FluentUI.h b/Sources/FluentUI_macOS/FluentUI.h similarity index 100% rename from macos/FluentUI/FluentUI.h rename to Sources/FluentUI_macOS/FluentUI.h diff --git a/macos/README.md b/Sources/FluentUI_macOS/README.md similarity index 94% rename from macos/README.md rename to Sources/FluentUI_macOS/README.md index 68321276cd..4500b35297 100644 --- a/macos/README.md +++ b/Sources/FluentUI_macOS/README.md @@ -19,4 +19,4 @@ Some of the controls available include: - Separator -A full list of currently supported controls can be found here: [FluentUI](FluentUI). +A full list of currently supported controls can be found here: [Components](Components). diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/ButtonColors/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/AvatarView/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/ButtonColors/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/AvatarView/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/AvatarView/borderColor.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/AvatarView/borderColor.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/AvatarView/borderColor.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/AvatarView/borderColor.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/ButtonColors/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/ButtonColors/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/ButtonColors/brandBackgroundDisabled.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/ButtonColors/brandBackgroundDisabled.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/ButtonColors/brandBackgroundDisabled.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/ButtonColors/brandBackgroundDisabled.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/ButtonColors/brandForegroundDisabled.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/ButtonColors/brandForegroundDisabled.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/ButtonColors/brandForegroundDisabled.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/ButtonColors/brandForegroundDisabled.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/ButtonColors/firstOuterDropShadow.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/ButtonColors/firstOuterDropShadow.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/ButtonColors/firstOuterDropShadow.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/ButtonColors/firstOuterDropShadow.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/ButtonColors/innerShadow.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/ButtonColors/innerShadow.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/ButtonColors/innerShadow.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/ButtonColors/innerShadow.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/ButtonColors/neutralBackground2.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/ButtonColors/neutralBackground2.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/ButtonColors/neutralBackground2.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/ButtonColors/neutralBackground2.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/ButtonColors/neutralBackground3.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/ButtonColors/neutralBackground3.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/ButtonColors/neutralBackground3.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/ButtonColors/neutralBackground3.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/ButtonColors/neutralForeground2.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/ButtonColors/neutralForeground2.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/ButtonColors/neutralForeground2.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/ButtonColors/neutralForeground2.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/ButtonColors/neutralForeground3.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/ButtonColors/neutralForeground3.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/ButtonColors/neutralForeground3.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/ButtonColors/neutralForeground3.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/ButtonColors/neutralInverted.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/ButtonColors/neutralInverted.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/ButtonColors/neutralInverted.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/ButtonColors/neutralInverted.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/ButtonColors/neutralStroke2.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/ButtonColors/neutralStroke2.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/ButtonColors/neutralStroke2.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/ButtonColors/neutralStroke2.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/ButtonColors/secondOuterDropShadow.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/ButtonColors/secondOuterDropShadow.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/ButtonColors/secondOuterDropShadow.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/ButtonColors/secondOuterDropShadow.colorset/Contents.json diff --git a/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/Contents.json new file mode 100644 index 0000000000..73c00596a7 --- /dev/null +++ b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/macos/FluentUITestApp/Assets.xcassets/Colors/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/Contents.json similarity index 100% rename from macos/FluentUITestApp/Assets.xcassets/Colors/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/anchorShade30.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/anchorShade30.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/anchorShade30.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/anchorShade30.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/anchorTint40.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/anchorTint40.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/anchorTint40.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/anchorTint40.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/beigeShade30.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/beigeShade30.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/beigeShade30.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/beigeShade30.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/beigeTint40.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/beigeTint40.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/beigeTint40.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/beigeTint40.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/black.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/black.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/black.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/black.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/blue10.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/blue10.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/blue10.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/blue10.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/blueMagenta20.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/blueMagenta20.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/blueMagenta20.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/blueMagenta20.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/blueMagenta30.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/blueMagenta30.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/blueMagenta30.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/blueMagenta30.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/blueShade30.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/blueShade30.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/blueShade30.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/blueShade30.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/blueTint40.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/blueTint40.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/blueTint40.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/blueTint40.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/brassShade30.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/brassShade30.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/brassShade30.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/brassShade30.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/brassTint40.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/brassTint40.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/brassTint40.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/brassTint40.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/brownShade30.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/brownShade30.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/brownShade30.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/brownShade30.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/brownTint40.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/brownTint40.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/brownTint40.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/brownTint40.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/clear.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/clear.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/clear.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/clear.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/communicationBlue.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/communicationBlue.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/communicationBlue.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/communicationBlue.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/communicationBlueShade10.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/communicationBlueShade10.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/communicationBlueShade10.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/communicationBlueShade10.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/communicationBlueShade20.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/communicationBlueShade20.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/communicationBlueShade20.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/communicationBlueShade20.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/communicationBlueShade30.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/communicationBlueShade30.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/communicationBlueShade30.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/communicationBlueShade30.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/communicationBlueTint10.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/communicationBlueTint10.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/communicationBlueTint10.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/communicationBlueTint10.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/communicationBlueTint20.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/communicationBlueTint20.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/communicationBlueTint20.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/communicationBlueTint20.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/communicationBlueTint30.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/communicationBlueTint30.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/communicationBlueTint30.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/communicationBlueTint30.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/communicationBlueTint40.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/communicationBlueTint40.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/communicationBlueTint40.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/communicationBlueTint40.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/cornFlowerShade30.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/cornFlowerShade30.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/cornFlowerShade30.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/cornFlowerShade30.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/cornFlowerTint40.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/cornFlowerTint40.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/cornFlowerTint40.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/cornFlowerTint40.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/cranberryShade30.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/cranberryShade30.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/cranberryShade30.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/cranberryShade30.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/cranberryTint40.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/cranberryTint40.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/cranberryTint40.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/cranberryTint40.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/cyan20.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/cyan20.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/cyan20.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/cyan20.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/cyan30.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/cyan30.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/cyan30.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/cyan30.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/cyanBlue10.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/cyanBlue10.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/cyanBlue10.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/cyanBlue10.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/cyanBlue20.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/cyanBlue20.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/cyanBlue20.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/cyanBlue20.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/dangerPrimary.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/dangerPrimary.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/dangerPrimary.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/dangerPrimary.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/dangerShade10.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/dangerShade10.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/dangerShade10.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/dangerShade10.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/dangerShade20.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/dangerShade20.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/dangerShade20.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/dangerShade20.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/dangerShade30.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/dangerShade30.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/dangerShade30.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/dangerShade30.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/dangerTint10.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/dangerTint10.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/dangerTint10.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/dangerTint10.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/dangerTint20.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/dangerTint20.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/dangerTint20.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/dangerTint20.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/dangerTint30.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/dangerTint30.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/dangerTint30.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/dangerTint30.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/dangerTint40.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/dangerTint40.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/dangerTint40.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/dangerTint40.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/darkGreenShade30.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/darkGreenShade30.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/darkGreenShade30.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/darkGreenShade30.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/darkGreenTint40.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/darkGreenTint40.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/darkGreenTint40.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/darkGreenTint40.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/darkRedShade30.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/darkRedShade30.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/darkRedShade30.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/darkRedShade30.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/darkRedTint40.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/darkRedTint40.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/darkRedTint40.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/darkRedTint40.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/forestShade30.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/forestShade30.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/forestShade30.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/forestShade30.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/forestTint40.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/forestTint40.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/forestTint40.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/forestTint40.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/goldShade30.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/goldShade30.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/goldShade30.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/goldShade30.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/goldTint40.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/goldTint40.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/goldTint40.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/goldTint40.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/grapeShade30.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/grapeShade30.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/grapeShade30.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/grapeShade30.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/grapeTint40.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/grapeTint40.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/grapeTint40.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/grapeTint40.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/gray100.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/gray100.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/gray100.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/gray100.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/gray20.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/gray20.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/gray20.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/gray20.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/gray200.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/gray200.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/gray200.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/gray200.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/gray25.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/gray25.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/gray25.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/gray25.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/gray30.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/gray30.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/gray30.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/gray30.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/gray300.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/gray300.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/gray300.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/gray300.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/gray40.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/gray40.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/gray40.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/gray40.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/gray400.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/gray400.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/gray400.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/gray400.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/gray50.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/gray50.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/gray50.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/gray50.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/gray500.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/gray500.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/gray500.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/gray500.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/gray600.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/gray600.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/gray600.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/gray600.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/gray700.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/gray700.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/gray700.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/gray700.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/gray800.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/gray800.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/gray800.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/gray800.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/gray900.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/gray900.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/gray900.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/gray900.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/gray950.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/gray950.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/gray950.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/gray950.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/green10.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/green10.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/green10.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/green10.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/green20.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/green20.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/green20.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/green20.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/lavenderShade30.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/lavenderShade30.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/lavenderShade30.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/lavenderShade30.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/lavenderTint40.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/lavenderTint40.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/lavenderTint40.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/lavenderTint40.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/lightTealShade30.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/lightTealShade30.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/lightTealShade30.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/lightTealShade30.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/lightTealTint40.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/lightTealTint40.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/lightTealTint40.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/lightTealTint40.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/lilacShade30.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/lilacShade30.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/lilacShade30.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/lilacShade30.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/lilacTint40.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/lilacTint40.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/lilacTint40.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/lilacTint40.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/magenta10.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/magenta10.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/magenta10.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/magenta10.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/magenta20.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/magenta20.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/magenta20.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/magenta20.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/magentaPink10.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/magentaPink10.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/magentaPink10.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/magentaPink10.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/magentaShade30.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/magentaShade30.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/magentaShade30.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/magentaShade30.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/magentaTint40.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/magentaTint40.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/magentaTint40.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/magentaTint40.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/marigoldShade30.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/marigoldShade30.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/marigoldShade30.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/marigoldShade30.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/marigoldTint40.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/marigoldTint40.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/marigoldTint40.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/marigoldTint40.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/minkShade30.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/minkShade30.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/minkShade30.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/minkShade30.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/minkTint40.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/minkTint40.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/minkTint40.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/minkTint40.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/navyShade30.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/navyShade30.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/navyShade30.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/navyShade30.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/navyTint40.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/navyTint40.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/navyTint40.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/navyTint40.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/orange20.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/orange20.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/orange20.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/orange20.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/orange30.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/orange30.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/orange30.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/orange30.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/orangeYellow20.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/orangeYellow20.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/orangeYellow20.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/orangeYellow20.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/peachShade30.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/peachShade30.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/peachShade30.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/peachShade30.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/peachTint40.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/peachTint40.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/peachTint40.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/peachTint40.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/pinkRed10.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/pinkRed10.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/pinkRed10.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/pinkRed10.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/pinkShade30.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/pinkShade30.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/pinkShade30.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/pinkShade30.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/pinkTint40.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/pinkTint40.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/pinkTint40.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/pinkTint40.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/platinumShade30.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/platinumShade30.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/platinumShade30.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/platinumShade30.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/platinumTint40.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/platinumTint40.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/platinumTint40.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/platinumTint40.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/plumShade30.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/plumShade30.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/plumShade30.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/plumShade30.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/plumTint40.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/plumTint40.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/plumTint40.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/plumTint40.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/presenceAvailable.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/presenceAvailable.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/presenceAvailable.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/presenceAvailable.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/presenceAway.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/presenceAway.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/presenceAway.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/presenceAway.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/presenceBlocked.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/presenceBlocked.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/presenceBlocked.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/presenceBlocked.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/presenceBusy.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/presenceBusy.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/presenceBusy.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/presenceBusy.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/presenceDnd.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/presenceDnd.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/presenceDnd.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/presenceDnd.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/presenceOffline.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/presenceOffline.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/presenceOffline.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/presenceOffline.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/presenceOof.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/presenceOof.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/presenceOof.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/presenceOof.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/presenceUnknown.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/presenceUnknown.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/presenceUnknown.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/presenceUnknown.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/pumpkinShade30.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/pumpkinShade30.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/pumpkinShade30.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/pumpkinShade30.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/pumpkinTint40.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/pumpkinTint40.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/pumpkinTint40.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/pumpkinTint40.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/purpleShade30.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/purpleShade30.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/purpleShade30.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/purpleShade30.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/purpleTint40.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/purpleTint40.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/purpleTint40.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/purpleTint40.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/red10.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/red10.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/red10.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/red10.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/red20.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/red20.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/red20.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/red20.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/redShade30.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/redShade30.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/redShade30.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/redShade30.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/redTint40.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/redTint40.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/redTint40.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/redTint40.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/royalBlueShade30.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/royalBlueShade30.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/royalBlueShade30.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/royalBlueShade30.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/royalBlueTint40.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/royalBlueTint40.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/royalBlueTint40.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/royalBlueTint40.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/seafoamShade30.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/seafoamShade30.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/seafoamShade30.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/seafoamShade30.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/seafoamTint40.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/seafoamTint40.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/seafoamTint40.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/seafoamTint40.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/steelShade30.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/steelShade30.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/steelShade30.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/steelShade30.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/steelTint40.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/steelTint40.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/steelTint40.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/steelTint40.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/successPrimary.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/successPrimary.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/successPrimary.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/successPrimary.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/successShade10.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/successShade10.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/successShade10.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/successShade10.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/successShade20.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/successShade20.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/successShade20.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/successShade20.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/successShade30.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/successShade30.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/successShade30.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/successShade30.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/successTint10.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/successTint10.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/successTint10.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/successTint10.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/successTint20.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/successTint20.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/successTint20.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/successTint20.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/successTint30.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/successTint30.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/successTint30.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/successTint30.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/successTint40.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/successTint40.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/successTint40.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/successTint40.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/tealShade30.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/tealShade30.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/tealShade30.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/tealShade30.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/tealTint40.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/tealTint40.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/tealTint40.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/tealTint40.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/warningPrimary.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/warningPrimary.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/warningPrimary.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/warningPrimary.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/warningShade10.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/warningShade10.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/warningShade10.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/warningShade10.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/warningShade20.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/warningShade20.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/warningShade20.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/warningShade20.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/warningShade30.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/warningShade30.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/warningShade30.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/warningShade30.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/warningTint10.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/warningTint10.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/warningTint10.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/warningTint10.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/warningTint20.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/warningTint20.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/warningTint20.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/warningTint20.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/warningTint30.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/warningTint30.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/warningTint30.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/warningTint30.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/warningTint40.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/warningTint40.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/warningTint40.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/warningTint40.colorset/Contents.json diff --git a/macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/white.colorset/Contents.json b/Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/white.colorset/Contents.json similarity index 100% rename from macos/FluentUI/Resources/FluentUI-macos.xcassets/FluentColors/white.colorset/Contents.json rename to Sources/FluentUI_macOS/Resources/FluentUI-macos.xcassets/FluentColors/white.colorset/Contents.json diff --git a/macos/FluentUI/Resources/Strings/ar.lproj/FluentUI.strings b/Sources/FluentUI_macOS/Resources/Strings/ar.lproj/FluentUI.strings similarity index 100% rename from macos/FluentUI/Resources/Strings/ar.lproj/FluentUI.strings rename to Sources/FluentUI_macOS/Resources/Strings/ar.lproj/FluentUI.strings diff --git a/macos/FluentUI/Resources/Strings/ca.lproj/FluentUI.strings b/Sources/FluentUI_macOS/Resources/Strings/ca.lproj/FluentUI.strings similarity index 100% rename from macos/FluentUI/Resources/Strings/ca.lproj/FluentUI.strings rename to Sources/FluentUI_macOS/Resources/Strings/ca.lproj/FluentUI.strings diff --git a/macos/FluentUI/Resources/Strings/cs.lproj/FluentUI.strings b/Sources/FluentUI_macOS/Resources/Strings/cs.lproj/FluentUI.strings similarity index 100% rename from macos/FluentUI/Resources/Strings/cs.lproj/FluentUI.strings rename to Sources/FluentUI_macOS/Resources/Strings/cs.lproj/FluentUI.strings diff --git a/macos/FluentUI/Resources/Strings/da.lproj/FluentUI.strings b/Sources/FluentUI_macOS/Resources/Strings/da.lproj/FluentUI.strings similarity index 100% rename from macos/FluentUI/Resources/Strings/da.lproj/FluentUI.strings rename to Sources/FluentUI_macOS/Resources/Strings/da.lproj/FluentUI.strings diff --git a/macos/FluentUI/Resources/Strings/de.lproj/FluentUI.strings b/Sources/FluentUI_macOS/Resources/Strings/de.lproj/FluentUI.strings similarity index 100% rename from macos/FluentUI/Resources/Strings/de.lproj/FluentUI.strings rename to Sources/FluentUI_macOS/Resources/Strings/de.lproj/FluentUI.strings diff --git a/macos/FluentUI/Resources/Strings/el.lproj/FluentUI.strings b/Sources/FluentUI_macOS/Resources/Strings/el.lproj/FluentUI.strings similarity index 100% rename from macos/FluentUI/Resources/Strings/el.lproj/FluentUI.strings rename to Sources/FluentUI_macOS/Resources/Strings/el.lproj/FluentUI.strings diff --git a/macos/FluentUI/Resources/Strings/en-GB.lproj/FluentUI.strings b/Sources/FluentUI_macOS/Resources/Strings/en-GB.lproj/FluentUI.strings similarity index 100% rename from macos/FluentUI/Resources/Strings/en-GB.lproj/FluentUI.strings rename to Sources/FluentUI_macOS/Resources/Strings/en-GB.lproj/FluentUI.strings diff --git a/macos/FluentUI/Resources/Strings/en.lproj/FluentUI.strings b/Sources/FluentUI_macOS/Resources/Strings/en.lproj/FluentUI.strings similarity index 100% rename from macos/FluentUI/Resources/Strings/en.lproj/FluentUI.strings rename to Sources/FluentUI_macOS/Resources/Strings/en.lproj/FluentUI.strings diff --git a/macos/FluentUI/Resources/Strings/es-MX.lproj/FluentUI.strings b/Sources/FluentUI_macOS/Resources/Strings/es-MX.lproj/FluentUI.strings similarity index 100% rename from macos/FluentUI/Resources/Strings/es-MX.lproj/FluentUI.strings rename to Sources/FluentUI_macOS/Resources/Strings/es-MX.lproj/FluentUI.strings diff --git a/macos/FluentUI/Resources/Strings/es.lproj/FluentUI.strings b/Sources/FluentUI_macOS/Resources/Strings/es.lproj/FluentUI.strings similarity index 100% rename from macos/FluentUI/Resources/Strings/es.lproj/FluentUI.strings rename to Sources/FluentUI_macOS/Resources/Strings/es.lproj/FluentUI.strings diff --git a/macos/FluentUI/Resources/Strings/fi.lproj/FluentUI.strings b/Sources/FluentUI_macOS/Resources/Strings/fi.lproj/FluentUI.strings similarity index 100% rename from macos/FluentUI/Resources/Strings/fi.lproj/FluentUI.strings rename to Sources/FluentUI_macOS/Resources/Strings/fi.lproj/FluentUI.strings diff --git a/macos/FluentUI/Resources/Strings/fr.lproj/FluentUI.strings b/Sources/FluentUI_macOS/Resources/Strings/fr.lproj/FluentUI.strings similarity index 100% rename from macos/FluentUI/Resources/Strings/fr.lproj/FluentUI.strings rename to Sources/FluentUI_macOS/Resources/Strings/fr.lproj/FluentUI.strings diff --git a/macos/FluentUI/Resources/Strings/he.lproj/FluentUI.strings b/Sources/FluentUI_macOS/Resources/Strings/he.lproj/FluentUI.strings similarity index 100% rename from macos/FluentUI/Resources/Strings/he.lproj/FluentUI.strings rename to Sources/FluentUI_macOS/Resources/Strings/he.lproj/FluentUI.strings diff --git a/macos/FluentUI/Resources/Strings/hi.lproj/FluentUI.strings b/Sources/FluentUI_macOS/Resources/Strings/hi.lproj/FluentUI.strings similarity index 100% rename from macos/FluentUI/Resources/Strings/hi.lproj/FluentUI.strings rename to Sources/FluentUI_macOS/Resources/Strings/hi.lproj/FluentUI.strings diff --git a/macos/FluentUI/Resources/Strings/hr.lproj/FluentUI.strings b/Sources/FluentUI_macOS/Resources/Strings/hr.lproj/FluentUI.strings similarity index 100% rename from macos/FluentUI/Resources/Strings/hr.lproj/FluentUI.strings rename to Sources/FluentUI_macOS/Resources/Strings/hr.lproj/FluentUI.strings diff --git a/macos/FluentUI/Resources/Strings/hu.lproj/FluentUI.strings b/Sources/FluentUI_macOS/Resources/Strings/hu.lproj/FluentUI.strings similarity index 100% rename from macos/FluentUI/Resources/Strings/hu.lproj/FluentUI.strings rename to Sources/FluentUI_macOS/Resources/Strings/hu.lproj/FluentUI.strings diff --git a/macos/FluentUI/Resources/Strings/id.lproj/FluentUI.strings b/Sources/FluentUI_macOS/Resources/Strings/id.lproj/FluentUI.strings similarity index 100% rename from macos/FluentUI/Resources/Strings/id.lproj/FluentUI.strings rename to Sources/FluentUI_macOS/Resources/Strings/id.lproj/FluentUI.strings diff --git a/macos/FluentUI/Resources/Strings/it.lproj/FluentUI.strings b/Sources/FluentUI_macOS/Resources/Strings/it.lproj/FluentUI.strings similarity index 100% rename from macos/FluentUI/Resources/Strings/it.lproj/FluentUI.strings rename to Sources/FluentUI_macOS/Resources/Strings/it.lproj/FluentUI.strings diff --git a/macos/FluentUI/Resources/Strings/ja.lproj/FluentUI.strings b/Sources/FluentUI_macOS/Resources/Strings/ja.lproj/FluentUI.strings similarity index 100% rename from macos/FluentUI/Resources/Strings/ja.lproj/FluentUI.strings rename to Sources/FluentUI_macOS/Resources/Strings/ja.lproj/FluentUI.strings diff --git a/macos/FluentUI/Resources/Strings/ko.lproj/FluentUI.strings b/Sources/FluentUI_macOS/Resources/Strings/ko.lproj/FluentUI.strings similarity index 100% rename from macos/FluentUI/Resources/Strings/ko.lproj/FluentUI.strings rename to Sources/FluentUI_macOS/Resources/Strings/ko.lproj/FluentUI.strings diff --git a/macos/FluentUI/Resources/Strings/ms.lproj/FluentUI.strings b/Sources/FluentUI_macOS/Resources/Strings/ms.lproj/FluentUI.strings similarity index 100% rename from macos/FluentUI/Resources/Strings/ms.lproj/FluentUI.strings rename to Sources/FluentUI_macOS/Resources/Strings/ms.lproj/FluentUI.strings diff --git a/macos/FluentUI/Resources/Strings/nb-NO.lproj/FluentUI.strings b/Sources/FluentUI_macOS/Resources/Strings/nb-NO.lproj/FluentUI.strings similarity index 100% rename from macos/FluentUI/Resources/Strings/nb-NO.lproj/FluentUI.strings rename to Sources/FluentUI_macOS/Resources/Strings/nb-NO.lproj/FluentUI.strings diff --git a/macos/FluentUI/Resources/Strings/nl.lproj/FluentUI.strings b/Sources/FluentUI_macOS/Resources/Strings/nl.lproj/FluentUI.strings similarity index 100% rename from macos/FluentUI/Resources/Strings/nl.lproj/FluentUI.strings rename to Sources/FluentUI_macOS/Resources/Strings/nl.lproj/FluentUI.strings diff --git a/macos/FluentUI/Resources/Strings/pl.lproj/FluentUI.strings b/Sources/FluentUI_macOS/Resources/Strings/pl.lproj/FluentUI.strings similarity index 100% rename from macos/FluentUI/Resources/Strings/pl.lproj/FluentUI.strings rename to Sources/FluentUI_macOS/Resources/Strings/pl.lproj/FluentUI.strings diff --git a/macos/FluentUI/Resources/Strings/pt-BR.lproj/FluentUI.strings b/Sources/FluentUI_macOS/Resources/Strings/pt-BR.lproj/FluentUI.strings similarity index 100% rename from macos/FluentUI/Resources/Strings/pt-BR.lproj/FluentUI.strings rename to Sources/FluentUI_macOS/Resources/Strings/pt-BR.lproj/FluentUI.strings diff --git a/macos/FluentUI/Resources/Strings/pt-PT.lproj/FluentUI.strings b/Sources/FluentUI_macOS/Resources/Strings/pt-PT.lproj/FluentUI.strings similarity index 100% rename from macos/FluentUI/Resources/Strings/pt-PT.lproj/FluentUI.strings rename to Sources/FluentUI_macOS/Resources/Strings/pt-PT.lproj/FluentUI.strings diff --git a/macos/FluentUI/Resources/Strings/ro.lproj/FluentUI.strings b/Sources/FluentUI_macOS/Resources/Strings/ro.lproj/FluentUI.strings similarity index 100% rename from macos/FluentUI/Resources/Strings/ro.lproj/FluentUI.strings rename to Sources/FluentUI_macOS/Resources/Strings/ro.lproj/FluentUI.strings diff --git a/macos/FluentUI/Resources/Strings/ru.lproj/FluentUI.strings b/Sources/FluentUI_macOS/Resources/Strings/ru.lproj/FluentUI.strings similarity index 100% rename from macos/FluentUI/Resources/Strings/ru.lproj/FluentUI.strings rename to Sources/FluentUI_macOS/Resources/Strings/ru.lproj/FluentUI.strings diff --git a/macos/FluentUI/Resources/Strings/sk.lproj/FluentUI.strings b/Sources/FluentUI_macOS/Resources/Strings/sk.lproj/FluentUI.strings similarity index 100% rename from macos/FluentUI/Resources/Strings/sk.lproj/FluentUI.strings rename to Sources/FluentUI_macOS/Resources/Strings/sk.lproj/FluentUI.strings diff --git a/macos/FluentUI/Resources/Strings/sv.lproj/FluentUI.strings b/Sources/FluentUI_macOS/Resources/Strings/sv.lproj/FluentUI.strings similarity index 100% rename from macos/FluentUI/Resources/Strings/sv.lproj/FluentUI.strings rename to Sources/FluentUI_macOS/Resources/Strings/sv.lproj/FluentUI.strings diff --git a/macos/FluentUI/Resources/Strings/th.lproj/FluentUI.strings b/Sources/FluentUI_macOS/Resources/Strings/th.lproj/FluentUI.strings similarity index 100% rename from macos/FluentUI/Resources/Strings/th.lproj/FluentUI.strings rename to Sources/FluentUI_macOS/Resources/Strings/th.lproj/FluentUI.strings diff --git a/macos/FluentUI/Resources/Strings/tr.lproj/FluentUI.strings b/Sources/FluentUI_macOS/Resources/Strings/tr.lproj/FluentUI.strings similarity index 100% rename from macos/FluentUI/Resources/Strings/tr.lproj/FluentUI.strings rename to Sources/FluentUI_macOS/Resources/Strings/tr.lproj/FluentUI.strings diff --git a/macos/FluentUI/Resources/Strings/uk.lproj/FluentUI.strings b/Sources/FluentUI_macOS/Resources/Strings/uk.lproj/FluentUI.strings similarity index 100% rename from macos/FluentUI/Resources/Strings/uk.lproj/FluentUI.strings rename to Sources/FluentUI_macOS/Resources/Strings/uk.lproj/FluentUI.strings diff --git a/macos/FluentUI/Resources/Strings/vi.lproj/FluentUI.strings b/Sources/FluentUI_macOS/Resources/Strings/vi.lproj/FluentUI.strings similarity index 100% rename from macos/FluentUI/Resources/Strings/vi.lproj/FluentUI.strings rename to Sources/FluentUI_macOS/Resources/Strings/vi.lproj/FluentUI.strings diff --git a/macos/FluentUI/Resources/Strings/zh-Hans.lproj/FluentUI.strings b/Sources/FluentUI_macOS/Resources/Strings/zh-Hans.lproj/FluentUI.strings similarity index 100% rename from macos/FluentUI/Resources/Strings/zh-Hans.lproj/FluentUI.strings rename to Sources/FluentUI_macOS/Resources/Strings/zh-Hans.lproj/FluentUI.strings diff --git a/macos/FluentUI/Resources/Strings/zh-Hant.lproj/FluentUI.strings b/Sources/FluentUI_macOS/Resources/Strings/zh-Hant.lproj/FluentUI.strings similarity index 100% rename from macos/FluentUI/Resources/Strings/zh-Hant.lproj/FluentUI.strings rename to Sources/FluentUI_macOS/Resources/Strings/zh-Hant.lproj/FluentUI.strings diff --git a/ios/FluentUI.Tests/AvatarTests.swift b/Tests/FluentUI_iOS_Tests/AvatarTests.swift similarity index 98% rename from ios/FluentUI.Tests/AvatarTests.swift rename to Tests/FluentUI_iOS_Tests/AvatarTests.swift index 7a3058a585..20bcda0b00 100644 --- a/ios/FluentUI.Tests/AvatarTests.swift +++ b/Tests/FluentUI_iOS_Tests/AvatarTests.swift @@ -4,7 +4,7 @@ // import XCTest -@testable import FluentUI +@testable import FluentUI_ios class AvatarTests: XCTestCase { diff --git a/ios/FluentUI.Tests/ColorTests.swift b/Tests/FluentUI_iOS_Tests/ColorTests.swift similarity index 57% rename from ios/FluentUI.Tests/ColorTests.swift rename to Tests/FluentUI_iOS_Tests/ColorTests.swift index f7148ebe08..6425a4f830 100644 --- a/ios/FluentUI.Tests/ColorTests.swift +++ b/Tests/FluentUI_iOS_Tests/ColorTests.swift @@ -4,56 +4,73 @@ // import XCTest -@testable import FluentUI +import SwiftUI +@testable import FluentUI_ios class ColorTests: XCTestCase { - @available(*, deprecated) - func testColorValue() { - let hexColorValue = ColorValue(0xC7E0F4) - XCTAssertEqual(hexColorValue.a, 1.0) - XCTAssertEqual(hexColorValue.r, CGFloat(0xC7) / 255.0) - XCTAssertEqual(hexColorValue.g, CGFloat(0xE0) / 255.0) - XCTAssertEqual(hexColorValue.b, CGFloat(0xF4) / 255.0) - - let rgbaColorValue = ColorValue(r: 0.35, g: 1.0, b: 0.82, a: 0.75) - XCTAssertEqual(rgbaColorValue.a, 0.75, accuracy: 0.01) - XCTAssertEqual(rgbaColorValue.r, 0.35, accuracy: 0.01) - XCTAssertEqual(rgbaColorValue.g, 1.0, accuracy: 0.01) - XCTAssertEqual(rgbaColorValue.b, 0.82, accuracy: 0.01) - } - - @available(*, deprecated) - func testColorValueConversions() { - let colorValue = ColorValue(r: 0.35, g: 1.0, b: 0.82, a: 0.75) - let color = UIColor(colorValue: colorValue) + func testUIColorHexValue() { + let hexValue = UInt32(0xC7E0F4) + let color = UIColor(hexValue: hexValue) var red: CGFloat = 0.0 var green: CGFloat = 0.0 var blue: CGFloat = 0.0 var alpha: CGFloat = 0.0 - // Verify that UIColor's getters return the same values as ColorValue's + // Verify that UIColor's getters return the same values as the hex value XCTAssertTrue(color.getRed(&red, green: &green, blue: &blue, alpha: &alpha)) - XCTAssertEqual(colorValue.a, alpha) - XCTAssertEqual(colorValue.r, red) - XCTAssertEqual(colorValue.g, green) - XCTAssertEqual(colorValue.b, blue) + XCTAssertEqual(1.0, alpha) + XCTAssertEqual(CGFloat(0xC7) / 255.0, red, accuracy: 0.01) + XCTAssertEqual(CGFloat(0xE0) / 255.0, green, accuracy: 0.01) + XCTAssertEqual(CGFloat(0xF4) / 255.0, blue, accuracy: 0.01) } func testColorHexValue() { let hexValue = UInt32(0xC7E0F4) - let color = UIColor(hexValue: hexValue) + let color = Color(hexValue: hexValue) var red: CGFloat = 0.0 var green: CGFloat = 0.0 var blue: CGFloat = 0.0 var alpha: CGFloat = 0.0 - // Verify that UIColor's getters return the same values as ColorValue's - XCTAssertTrue(color.getRed(&red, green: &green, blue: &blue, alpha: &alpha)) + // Verify that UIColor's getters return the same values as the hex value + let uiColor = UIColor(color) + XCTAssertTrue(uiColor.getRed(&red, green: &green, blue: &blue, alpha: &alpha)) XCTAssertEqual(1.0, alpha) XCTAssertEqual(CGFloat(0xC7) / 255.0, red, accuracy: 0.01) XCTAssertEqual(CGFloat(0xE0) / 255.0, green, accuracy: 0.01) XCTAssertEqual(CGFloat(0xF4) / 255.0, blue, accuracy: 0.01) + + if #available(iOS 17, *) { + let components = color.resolve(in: EnvironmentValues()) + XCTAssertEqual(red, CGFloat(components.red), accuracy: 0.01) + XCTAssertEqual(green, CGFloat(components.green), accuracy: 0.01) + XCTAssertEqual(blue, CGFloat(components.blue), accuracy: 0.01) + XCTAssertEqual(alpha, CGFloat(components.opacity), accuracy: 0.01) + } + } + + func testDynamicColorValue() { + let dynamicColor = DynamicColor(light: .white, + dark: .black) + let dynamicUIColor = UIColor(dynamicColor: dynamicColor) + XCTAssertEqual(dynamicUIColor.light, UIColor(Color.white)) + XCTAssertEqual(dynamicUIColor.dark, UIColor(Color.black)) + XCTAssertEqual(dynamicUIColor.darkElevated, UIColor(Color.black)) + + if #available(iOS 17, *) { + var lightColorEnvironment = EnvironmentValues() + lightColorEnvironment.colorScheme = .light + XCTAssertEqual(lightColorEnvironment.colorScheme, .light) + let lightColor = dynamicColor.resolve(in: lightColorEnvironment) + XCTAssertEqual(lightColor, Color.white.resolve(in: .init())) + + var darkColorEnvironment = EnvironmentValues() + darkColorEnvironment.colorScheme = .dark + XCTAssertEqual(darkColorEnvironment.colorScheme, .dark) + let darkColor = dynamicColor.resolve(in: darkColorEnvironment) + XCTAssertEqual(darkColor, Color.black.resolve(in: darkColorEnvironment)) + } } func testColorExtensions() { diff --git a/ios/FluentUI.Tests/DatePickerControllerTests.swift b/Tests/FluentUI_iOS_Tests/DatePickerControllerTests.swift similarity index 99% rename from ios/FluentUI.Tests/DatePickerControllerTests.swift rename to Tests/FluentUI_iOS_Tests/DatePickerControllerTests.swift index 26fe92c5c2..8a02304d15 100644 --- a/ios/FluentUI.Tests/DatePickerControllerTests.swift +++ b/Tests/FluentUI_iOS_Tests/DatePickerControllerTests.swift @@ -4,7 +4,7 @@ // import XCTest -@testable import FluentUI +@testable import FluentUI_ios class DatePickerControllerTests: XCTestCase { let startDate: Date = NSDate.now diff --git a/ios/FluentUI.Tests/FluentUITests.swift b/Tests/FluentUI_iOS_Tests/FluentUITests.swift similarity index 96% rename from ios/FluentUI.Tests/FluentUITests.swift rename to Tests/FluentUI_iOS_Tests/FluentUITests.swift index 1668d33bbb..ac50a549bf 100644 --- a/ios/FluentUI.Tests/FluentUITests.swift +++ b/Tests/FluentUI_iOS_Tests/FluentUITests.swift @@ -4,7 +4,7 @@ // import XCTest -@testable import FluentUI +@testable import FluentUI_ios class FluentUITests: XCTestCase { override func setUp() { diff --git a/ios/FluentUI.Tests/FontTests.swift b/Tests/FluentUI_iOS_Tests/FontTests.swift similarity index 98% rename from ios/FluentUI.Tests/FontTests.swift rename to Tests/FluentUI_iOS_Tests/FontTests.swift index 547044d4ca..68837fc759 100644 --- a/ios/FluentUI.Tests/FontTests.swift +++ b/Tests/FluentUI_iOS_Tests/FontTests.swift @@ -5,7 +5,7 @@ import XCTest import SwiftUI -@testable import FluentUI +@testable import FluentUI_ios class FontTests: XCTestCase { diff --git a/ios/FluentUI.Tests/Info.plist b/Tests/FluentUI_iOS_Tests/Info.plist similarity index 100% rename from ios/FluentUI.Tests/Info.plist rename to Tests/FluentUI_iOS_Tests/Info.plist diff --git a/macos/FluentUIUnitTest/AvatarViewTests.swift b/Tests/FluentUI_macOS_Tests/AvatarViewTests.swift similarity index 99% rename from macos/FluentUIUnitTest/AvatarViewTests.swift rename to Tests/FluentUI_macOS_Tests/AvatarViewTests.swift index f2f2cb0946..5a9d567e43 100644 --- a/macos/FluentUIUnitTest/AvatarViewTests.swift +++ b/Tests/FluentUI_macOS_Tests/AvatarViewTests.swift @@ -4,7 +4,7 @@ // import XCTest -@testable import FluentUI +@testable import FluentUI_macos class AvatarViewTests: XCTestCase { func testValidInitialsCharacter () { diff --git a/macos/FluentUIUnitTest/DatePickerControllerTests.swift b/Tests/FluentUI_macOS_Tests/DatePickerControllerTests.swift similarity index 99% rename from macos/FluentUIUnitTest/DatePickerControllerTests.swift rename to Tests/FluentUI_macOS_Tests/DatePickerControllerTests.swift index 64aa36af17..aad56d596a 100644 --- a/macos/FluentUIUnitTest/DatePickerControllerTests.swift +++ b/Tests/FluentUI_macOS_Tests/DatePickerControllerTests.swift @@ -4,7 +4,7 @@ // import XCTest -@testable import FluentUI +@testable import FluentUI_macos class DatePickerControllerTests: XCTestCase { diff --git a/apple/FluentUI-All.xcworkspace/contents.xcworkspacedata b/apple/FluentUI-All.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index bbcfa63f5b..0000000000 --- a/apple/FluentUI-All.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - diff --git a/apple/FluentUI-All.xcworkspace/xcshareddata/xcschemes/Build All Debug.xcscheme b/apple/FluentUI-All.xcworkspace/xcshareddata/xcschemes/Build All Debug.xcscheme deleted file mode 100644 index 78112a7509..0000000000 --- a/apple/FluentUI-All.xcworkspace/xcshareddata/xcschemes/Build All Debug.xcscheme +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apple/FluentUI-All.xcworkspace/xcshareddata/xcschemes/Build All Mac Debug.xcscheme b/apple/FluentUI-All.xcworkspace/xcshareddata/xcschemes/Build All Mac Debug.xcscheme deleted file mode 100644 index 676fe5825a..0000000000 --- a/apple/FluentUI-All.xcworkspace/xcshareddata/xcschemes/Build All Mac Debug.xcscheme +++ /dev/null @@ -1,81 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apple/FluentUI-All.xcworkspace/xcshareddata/xcschemes/Build All Mac Ship.xcscheme b/apple/FluentUI-All.xcworkspace/xcshareddata/xcschemes/Build All Mac Ship.xcscheme deleted file mode 100644 index 460223a39b..0000000000 --- a/apple/FluentUI-All.xcworkspace/xcshareddata/xcschemes/Build All Mac Ship.xcscheme +++ /dev/null @@ -1,81 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apple/FluentUI-All.xcworkspace/xcshareddata/xcschemes/Build All Ship.xcscheme b/apple/FluentUI-All.xcworkspace/xcshareddata/xcschemes/Build All Ship.xcscheme deleted file mode 100644 index ccdf8a91ad..0000000000 --- a/apple/FluentUI-All.xcworkspace/xcshareddata/xcschemes/Build All Ship.xcscheme +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apple/FluentUI-All.xcworkspace/xcshareddata/xcschemes/Build All iOS Debug.xcscheme b/apple/FluentUI-All.xcworkspace/xcshareddata/xcschemes/Build All iOS Debug.xcscheme deleted file mode 100644 index 59cabe0b2a..0000000000 --- a/apple/FluentUI-All.xcworkspace/xcshareddata/xcschemes/Build All iOS Debug.xcscheme +++ /dev/null @@ -1,81 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apple/FluentUI-All.xcworkspace/xcshareddata/xcschemes/Build All iOS Ship.xcscheme b/apple/FluentUI-All.xcworkspace/xcshareddata/xcschemes/Build All iOS Ship.xcscheme deleted file mode 100644 index 56e44e4965..0000000000 --- a/apple/FluentUI-All.xcworkspace/xcshareddata/xcschemes/Build All iOS Ship.xcscheme +++ /dev/null @@ -1,81 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ios/FluentUI.Demo/FluentUI.Demo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/ios/FluentUI.Demo/FluentUI.Demo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved deleted file mode 100644 index 3566a597ee..0000000000 --- a/ios/FluentUI.Demo/FluentUI.Demo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ /dev/null @@ -1,25 +0,0 @@ -{ - "object": { - "pins": [ - { - "package": "AppCenter", - "repositoryURL": "https://github.com/microsoft/appcenter-sdk-apple.git", - "state": { - "branch": null, - "revision": "25f64229373de97ff3920941cd52203193e5d8be", - "version": "4.3.0" - } - }, - { - "package": "PLCrashReporter", - "repositoryURL": "https://github.com/microsoft/PLCrashReporter.git", - "state": { - "branch": null, - "revision": "59513acde6194d93617afcf7b2c81c88638a6af2", - "version": "1.10.0" - } - } - ] - }, - "version": 1 -} diff --git a/ios/FluentUI.Demo/FluentUI.Demo/DemoAppearanceView.swift b/ios/FluentUI.Demo/FluentUI.Demo/DemoAppearanceView.swift deleted file mode 100644 index 5b6fb0efad..0000000000 --- a/ios/FluentUI.Demo/FluentUI.Demo/DemoAppearanceView.swift +++ /dev/null @@ -1,143 +0,0 @@ -// -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. -// - -import FluentUI -import SwiftUI - -/// This class displays the contents of the DemoAppearance popover. All actions are callback-based, allowing a -/// wrapping component, DemoAppearanceController, to manage interop with our UIKit environment. -struct DemoAppearanceView: View { - - @Environment(\.colorScheme) var systemColorScheme: ColorScheme - @ObservedObject var configuration: Configuration - @State var showingThemeWideAlert: Bool = false - @ObservedObject var fluentTheme: FluentTheme = .shared - - /// Picker for setting the app's color scheme. - @ViewBuilder - var appColorSchemePicker: some View { - Text("App Color Scheme") - .font(.headline) - Picker("Color Scheme", selection: $configuration.userInterfaceStyle) { - Text("System").tag(UIUserInterfaceStyle.unspecified) - Text("Light").tag(UIUserInterfaceStyle.light) - Text("Dark").tag(UIUserInterfaceStyle.dark) - } - .pickerStyle(.segmented) - } - - /// Picker for setting the current Fluent theme. - @ViewBuilder - func themePicker(_ titleKey: String, selection: Binding) -> some View { - Text(titleKey) - .font(.headline) - Picker(titleKey, selection: selection) { - Text("\(DemoColorTheme.default.name)").tag(DemoColorTheme.default) - Text("\(DemoColorTheme.green.name)").tag(DemoColorTheme.green) - Text("\(DemoColorTheme.purple.name)").tag(DemoColorTheme.purple) - } - .pickerStyle(.segmented) - } - - /// Collects the various pickers and toggles together. - @ViewBuilder - var contents: some View { - VStack { - appColorSchemePicker - themePicker("Window Theme", selection: $configuration.windowTheme) - themePicker("App-Wide Theme", selection: $configuration.appWideTheme) - Divider() - .padding() - - if showThemeWideOverrideToggle || showPerControlOverrideToggle { - Text("Control") - .font(.headline) - } - - // Theme-wide override toggle - if showThemeWideOverrideToggle { - FluentUIDemoToggle(titleKey: "Theme-wide override", isOn: $configuration.themeWideOverride) - } - - // Per-control override toggle - if showPerControlOverrideToggle { - FluentUIDemoToggle(titleKey: "Per-control override", isOn: $configuration.perControlOverride) - } - - Spacer() - } - .fluentTheme(fluentTheme) - } - - var body: some View { - // Can't use `guard` in SwiftUI body, sadly - if configuration.isConfigured == false { - FluentUI.ActivityIndicator(size: .xLarge) - .isAnimating(true) - } else { - contents - .padding() - - // Changes - .onChange_iOS17(of: configuration.userInterfaceStyle) { newValue in - configuration.onUserInterfaceStyleChanged?(newValue) - } - .onChange_iOS17(of: configuration.windowTheme) { newValue in - configuration.onWindowThemeChanged?(newValue) - } - .onChange_iOS17(of: configuration.appWideTheme) { newValue in - configuration.onAppWideThemeChanged?(newValue) - } - .onChange_iOS17(of: configuration.themeWideOverride) { newValue in - configuration.onThemeWideOverrideChanged?(newValue) - - // TODO: Still working through some issues with the theme-wide override tokens, so inform the user how to make it visible for now. - showingThemeWideAlert = true - } - .onChange_iOS17(of: configuration.perControlOverride) { newValue in - configuration.onPerControlOverrideChanged?(newValue) - } - - // TODO: Still working through some issues with the theme-wide override tokens, so inform the user how to make it visible for now. - .alert(isPresented: $showingThemeWideAlert) { - Alert(title: Text("Theme-wide override"), - message: Text("Changes to \"Theme-wide override\" tokens will only take effect when the control redraws for some othe reason.\n\nTry backing out of this view and re-entering it.")) - } - } - } - - /// Container class for data and control-specific callbacks. - class Configuration: ObservableObject { - // Data - @Published var userInterfaceStyle: UIUserInterfaceStyle = .unspecified - @Published var windowTheme: DemoColorTheme = .default - @Published var appWideTheme: DemoColorTheme = .default - @Published var themeWideOverride: Bool = false - @Published var perControlOverride: Bool = false - - // Environment - @Published var isConfigured: Bool = false - - // Global callbacks - var onAppWideThemeChanged: ((_ theme: DemoColorTheme) -> Void)? - - // Window-specific callbacks - var onUserInterfaceStyleChanged: ((_ userInterfaceStyle: UIUserInterfaceStyle) -> Void)? - var onWindowThemeChanged: ((_ theme: DemoColorTheme) -> Void)? - - // Control-specific callbacks - var onThemeWideOverrideChanged: ((_ themeWideOverrideEnabled: Bool) -> Void)? - var onPerControlOverrideChanged: ((_ perControlOverrideEnabled: Bool) -> Void)? - var themeOverridePreviouslyApplied: (() -> Bool)? - } - - private var showThemeWideOverrideToggle: Bool { - return configuration.onThemeWideOverrideChanged != nil && configuration.themeOverridePreviouslyApplied != nil - } - - private var showPerControlOverrideToggle: Bool { - return configuration.onPerControlOverrideChanged != nil - } -} diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Demos/ListItemDemoController.swift b/ios/FluentUI.Demo/FluentUI.Demo/Demos/ListItemDemoController.swift deleted file mode 100644 index 0b9a3a9a49..0000000000 --- a/ios/FluentUI.Demo/FluentUI.Demo/Demos/ListItemDemoController.swift +++ /dev/null @@ -1,88 +0,0 @@ -// -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. -// - -import FluentUI -import UIKit - -class ListItemDemoController: DemoController { - - override func viewDidLoad() { - super.viewDidLoad() - let hostingController = ListItemDemoControllerSwiftUI() - self.hostingController = hostingController - addChild(hostingController) - view.addSubview(hostingController.view) - hostingController.didMove(toParent: self) - hostingController.view.translatesAutoresizingMaskIntoConstraints = false - NSLayoutConstraint.activate([hostingController.view.topAnchor.constraint(equalTo: view.topAnchor), - hostingController.view.bottomAnchor.constraint(equalTo: view.bottomAnchor), - hostingController.view.leadingAnchor.constraint(equalTo: view.leadingAnchor), - hostingController.view.trailingAnchor.constraint(equalTo: view.trailingAnchor)]) - - readmeString = "A list item displays a single row of data in a list.\n\nUse list items for displaying rows of data in a single column." - } - - override func didMove(toParent parent: UIViewController?) { - guard let parent, - let window = parent.view.window, - let hostingController else { - return - } - - hostingController.rootView.fluentTheme = window.fluentTheme - } - - var hostingController: ListItemDemoControllerSwiftUI? -} - -extension ListItemDemoController: DemoAppearanceDelegate { - func themeWideOverrideDidChange(isOverrideEnabled: Bool) { - guard let fluentTheme = self.view.window?.fluentTheme else { - return - } - - fluentTheme.register(tokenSetType: ListItemTokenSet.self, - tokenSet: isOverrideEnabled ? themeWideOverrideListItemTokens : nil) - } - - func perControlOverrideDidChange(isOverrideEnabled: Bool) { - guard let fluentTheme = self.view.window?.fluentTheme else { - return - } - - fluentTheme.register(tokenSetType: ListItemTokenSet.self, - tokenSet: isOverrideEnabled ? perControlOverrideListItemTokens : nil) - } - - func isThemeWideOverrideApplied() -> Bool { - return self.view.window?.fluentTheme.tokens(for: ListItemTokenSet.self) != nil - } - - // MARK: - Custom tokens - private var themeWideOverrideListItemTokens: [ListItemTokenSet.Tokens: ControlTokenValue] { - return [ - .cellBackgroundGroupedColor: .uiColor { - // "Berry" - return UIColor(light: GlobalTokens.sharedColor(.berry, .tint50), - dark: GlobalTokens.sharedColor(.berry, .shade40)) - } - ] - } - - private var perControlOverrideListItemTokens: [ListItemTokenSet.Tokens: ControlTokenValue] { - return [ - .cellBackgroundGroupedColor: .uiColor { - // "Brass" - return UIColor(light: GlobalTokens.sharedColor(.brass, .tint50), - dark: GlobalTokens.sharedColor(.brass, .shade40)) - }, - .accessoryDisclosureIndicatorColor: .uiColor { - // "Forest" - return UIColor(light: GlobalTokens.sharedColor(.forest, .tint10), - dark: GlobalTokens.sharedColor(.forest, .shade40)) - } - ] - } -} diff --git a/ios/FluentUI.Demo/FluentUI.Demo/SwiftUI/View+Extensions.swift b/ios/FluentUI.Demo/FluentUI.Demo/SwiftUI/View+Extensions.swift deleted file mode 100644 index c4dc519adb..0000000000 --- a/ios/FluentUI.Demo/FluentUI.Demo/SwiftUI/View+Extensions.swift +++ /dev/null @@ -1,33 +0,0 @@ -// -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. -// - -import SwiftUI - -extension View { - /// Abstracts away differences in pre-iOS 17 `onChange(of:perform:)` versus post-iOS 17 `onChange(of:_:)`. - /// - /// This function will be removed once FluentUI moves to iOS 17 as a minimum target. - /// - Parameters: - /// - value: The value to check against when determining whether to run the closure. - /// - action: A closure to run when the value changes. - /// - Returns: A view that fires an action when the specified value changes. - func onChange_iOS17(of value: V, _ action: @escaping (V) -> Void) -> some View where V: Equatable { -#if os(visionOS) - // Known bug when using #available and self.onChange together in visionOS: it'll crash! - // So for this OS, just use the new .onChange unconditionally. - return self.onChange(of: value) { _, newValue in - return action(newValue) - } -#else - if #available(iOS 17, *) { - return self.onChange(of: value) { _, newValue in - return action(newValue) - } - } else { - return self.onChange(of: value, perform: action) - } -#endif - } -} diff --git a/ios/FluentUI.Resources/Info.plist b/ios/FluentUI.Resources/Info.plist deleted file mode 100644 index cd5f8a1c6e..0000000000 --- a/ios/FluentUI.Resources/Info.plist +++ /dev/null @@ -1,20 +0,0 @@ - - - - - CFBundleDevelopmentRegion - $(DEVELOPMENT_LANGUAGE) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - BNDL - CFBundleShortVersionString - 0.26.0 - CFBundleVersion - 0.26.0 - - diff --git a/ios/FluentUI.xcodeproj/project.pbxproj b/ios/FluentUI.xcodeproj/project.pbxproj deleted file mode 100644 index 0ae225a3fa..0000000000 --- a/ios/FluentUI.xcodeproj/project.pbxproj +++ /dev/null @@ -1,2004 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 54; - objects = { - -/* Begin PBXBuildFile section */ - 0A84A6F029EDC489005DBC3D /* SeparatorTokenSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A84A6EF29EDC489005DBC3D /* SeparatorTokenSet.swift */; }; - 0A8E61FB291DC11F009E412D /* CommandBarTokenSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A8E61FA291DC11F009E412D /* CommandBarTokenSet.swift */; }; - 0AE3041D29F721B2003CDDD9 /* TableViewHeaderFooterViewTokenSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0AE3041C29F721B2003CDDD9 /* TableViewHeaderFooterViewTokenSet.swift */; }; - 2A9745DE281733D700E1A1FD /* TableViewCellTokenSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2A9745DD281733D700E1A1FD /* TableViewCellTokenSet.swift */; }; - 3A9FC0F52A6AFAD40060A6BE /* BadgeFieldTokenSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A9FC0F42A6AFAD40060A6BE /* BadgeFieldTokenSet.swift */; }; - 3A9FC0F72A705C090060A6BE /* PeoplePickerTokenSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3A9FC0F62A705C090060A6BE /* PeoplePickerTokenSet.swift */; }; - 3AFB0FD629C1365600FEC1A9 /* MultilineCommandBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3AFB0FD529C1365600FEC1A9 /* MultilineCommandBar.swift */; }; - 43488C46270FAD1300124C71 /* FluentNotification.swift in Sources */ = {isa = PBXBuildFile; fileRef = 43488C44270FAD0200124C71 /* FluentNotification.swift */; }; - 4B2E373D2991CB53008929B4 /* BottomSheetTokenSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B2E373C2991CB53008929B4 /* BottomSheetTokenSet.swift */; }; - 4B4A2F2129A7E83100570CD4 /* LabelTokenSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B4A2F2029A7E83100570CD4 /* LabelTokenSet.swift */; }; - 4B53505F27F63E3F0033B47F /* NotificationModifiers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B53505E27F63E3F0033B47F /* NotificationModifiers.swift */; }; - 4B8245D8293FC7A200CF0C77 /* TooltipTokenSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B8245D7293FC7A200CF0C77 /* TooltipTokenSet.swift */; }; - 4BBD651F2755FD9500A8B09E /* MSFNotification.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4BBD651E2755FD9500A8B09E /* MSFNotification.swift */; }; - 4BDBE18928EC9E6F00314696 /* ShimmerTokenSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4BDBE18828EC9E6F00314696 /* ShimmerTokenSet.swift */; }; - 4BF01D9A27B37CF8005B32F2 /* NotificationTokenSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4BF01D9927B37CF8005B32F2 /* NotificationTokenSet.swift */; }; - 4BF01DA027B3A862005B32F2 /* UIApplication+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4BF01D9F27B3A861005B32F2 /* UIApplication+Extensions.swift */; }; - 5303259B26B31B6B00611D05 /* AvatarModifiers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5303259926B31B6B00611D05 /* AvatarModifiers.swift */; }; - 5306075326A1E6A4002D49CF /* AvatarGroupTokenSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5306074F26A1E6A4002D49CF /* AvatarGroupTokenSet.swift */; }; - 5306075726A1E6A4002D49CF /* AvatarGroup.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5306075126A1E6A4002D49CF /* AvatarGroup.swift */; }; - 5306076126A201C8002D49CF /* Persona.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4EF53C2215AF1AB00573E8F /* Persona.swift */; }; - 530D9C5127EE388200BDCBBF /* SwiftUI+ViewPresentation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 530D9C5027EE388200BDCBBF /* SwiftUI+ViewPresentation.swift */; }; - 530D9C5327EE7B2C00BDCBBF /* SwiftUI+ViewAnimation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 530D9C5227EE7B2C00BDCBBF /* SwiftUI+ViewAnimation.swift */; }; - 5314E01625F00CF70099271A /* BarButtonItems.swift in Sources */ = {isa = PBXBuildFile; fileRef = A52648DB2316F4F9003342A0 /* BarButtonItems.swift */; }; - 5314E02825F00DA80099271A /* BlurringView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FDA1AF8B21484625001AE720 /* BlurringView.swift */; }; - 5314E03125F00DDD0099271A /* CardView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CCC18C2B2501B22F00BE830E /* CardView.swift */; }; - 5314E03A25F00E3D0099271A /* BadgeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B444D6B52183A9740002B4D4 /* BadgeView.swift */; }; - 5314E03B25F00E3D0099271A /* BadgeStringExtractor.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4A8BBCC21BF6D6900D5E3ED /* BadgeStringExtractor.swift */; }; - 5314E03C25F00E3D0099271A /* BadgeField.swift in Sources */ = {isa = PBXBuildFile; fileRef = B45EB78F219E310F008646A2 /* BadgeField.swift */; }; - 5314E05925F00EF50099271A /* CalendarViewDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD599D0B2134AB1E008845EE /* CalendarViewDataSource.swift */; }; - 5314E05A25F00EF50099271A /* CalendarViewLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD599D092134AB15008845EE /* CalendarViewLayout.swift */; }; - 5314E05B25F00EF50099271A /* CalendarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD599D0121348439008845EE /* CalendarView.swift */; }; - 5314E06025F00EFD0099271A /* CalendarViewWeekdayHeadingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD599D072134AB0E008845EE /* CalendarViewWeekdayHeadingView.swift */; }; - 5314E06125F00EFD0099271A /* CalendarViewDayCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = FDFB8AEE21361C9D0046850A /* CalendarViewDayCell.swift */; }; - 5314E06225F00EFD0099271A /* CalendarViewDayTodayCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = FDFB8AEC21361C9D0046850A /* CalendarViewDayTodayCell.swift */; }; - 5314E06325F00EFD0099271A /* CalendarViewDayMonthYearCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = FDFB8AEF21361C9D0046850A /* CalendarViewDayMonthYearCell.swift */; }; - 5314E06425F00EFD0099271A /* CalendarViewMonthBannerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FDFB8AEA21361C950046850A /* CalendarViewMonthBannerView.swift */; }; - 5314E06525F00EFD0099271A /* CalendarViewDayMonthCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = FDFB8AED21361C9D0046850A /* CalendarViewDayMonthCell.swift */; }; - 5314E06A25F00F100099271A /* GenericDateTimePicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD1FAE1A2272464B00A5DBA4 /* GenericDateTimePicker.swift */; }; - 5314E06B25F00F100099271A /* DateTimePicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD77752F21A490BA00033D58 /* DateTimePicker.swift */; }; - 5314E07025F00F140099271A /* DatePickerController.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD4F2A1F214AE20400C437D6 /* DatePickerController.swift */; }; - 5314E07125F00F140099271A /* DatePickerSelectionManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD256C5A2183B90B00EC9588 /* DatePickerSelectionManager.swift */; }; - 5314E07625F00F160099271A /* DateTimePickerController.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD5ADBF32190CDC80005A9AF /* DateTimePickerController.swift */; }; - 5314E07B25F00F1A0099271A /* DateTimePickerViewDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD9758072191118E00B67319 /* DateTimePickerViewDataSource.swift */; }; - 5314E07C25F00F1A0099271A /* DateTimePickerViewLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD77752C219E62E100033D58 /* DateTimePickerViewLayout.swift */; }; - 5314E07D25F00F1A0099271A /* DateTimePickerViewComponentTableView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD9758082191118E00B67319 /* DateTimePickerViewComponentTableView.swift */; }; - 5314E07E25F00F1A0099271A /* DateTimePickerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD9758062191118D00B67319 /* DateTimePickerView.swift */; }; - 5314E07F25F00F1A0099271A /* DateTimePickerViewComponentCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD97580A2191118E00B67319 /* DateTimePickerViewComponentCell.swift */; }; - 5314E08025F00F1A0099271A /* DateTimePickerViewComponent.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD9758092191118E00B67319 /* DateTimePickerViewComponent.swift */; }; - 5314E08925F00F2D0099271A /* CommandBarButtonGroupView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC414E242588798000069E73 /* CommandBarButtonGroupView.swift */; }; - 5314E08A25F00F2D0099271A /* CommandBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC414E1E258876FB00069E73 /* CommandBar.swift */; }; - 5314E08B25F00F2D0099271A /* CommandBarItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC414E4E2588B65C00069E73 /* CommandBarItem.swift */; }; - 5314E08C25F00F2D0099271A /* CommandBarButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = FC414E2A25887A4B00069E73 /* CommandBarButton.swift */; }; - 5314E09525F00FA30099271A /* DimmingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5B87B03211E22B70038C37C /* DimmingView.swift */; }; - 5314E09E25F00FE20099271A /* DotView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FDD454ED21405B390006E84E /* DotView.swift */; }; - 5314E0A725F010070099271A /* DrawerController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5B87AF3211E16360038C37C /* DrawerController.swift */; }; - 5314E0A825F010070099271A /* DrawerPresentationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5B87AF5211E16360038C37C /* DrawerPresentationController.swift */; }; - 5314E0A925F010070099271A /* DrawerTransitionAnimator.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5B87AF4211E16360038C37C /* DrawerTransitionAnimator.swift */; }; - 5314E0AA25F010070099271A /* DrawerShadowView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5237ACC21ED6CA70040BF27 /* DrawerShadowView.swift */; }; - 5314E0B325F010400099271A /* EasyTapButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD5BBE42214C73CE008964B4 /* EasyTapButton.swift */; }; - 5314E0CF25F011F10099271A /* Label.swift in Sources */ = {isa = PBXBuildFile; fileRef = A589F853211BA03200471C23 /* Label.swift */; }; - 5314E0E425F012C00099271A /* NavigationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD41C87F22DD13230086F899 /* NavigationController.swift */; }; - 5314E0E525F012C00099271A /* NavigationBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD41C87B22DD13230086F899 /* NavigationBar.swift */; }; - 5314E0E625F012C00099271A /* UIViewController+Navigation.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD9DA7B4232C33A80013E41B /* UIViewController+Navigation.swift */; }; - 5314E0E725F012C00099271A /* UINavigationItem+Navigation.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD41C8BD22DD47120086F899 /* UINavigationItem+Navigation.swift */; }; - 5314E0EC25F012C40099271A /* NavigationAnimator.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD41C88022DD13230086F899 /* NavigationAnimator.swift */; }; - 5314E0ED25F012C40099271A /* ContentScrollViewTraits.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD41C86E22DD13230086F899 /* ContentScrollViewTraits.swift */; }; - 5314E0F225F012C80099271A /* ShyHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD41C87122DD13230086F899 /* ShyHeaderView.swift */; }; - 5314E0F325F012C80099271A /* ShyHeaderController.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD41C87022DD13230086F899 /* ShyHeaderController.swift */; }; - 5314E0F825F012CB0099271A /* AvatarTitleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD41C87A22DD13230086F899 /* AvatarTitleView.swift */; }; - 5314E10A25F014600099271A /* Obscurable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53BCB0CD253A4E8C00620960 /* Obscurable.swift */; }; - 5314E11625F015EA0099271A /* PersonaBadgeViewDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4BA27872319DC0D0001563C /* PersonaBadgeViewDataSource.swift */; }; - 5314E11725F015EA0099271A /* PersonaCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = B46D3F922151D95F0029772C /* PersonaCell.swift */; }; - 5314E11825F015EA0099271A /* PeoplePicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = B47B58B722F8E5840078DE38 /* PeoplePicker.swift */; }; - 5314E11B25F015EA0099271A /* PersonaListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B46D3F9C215985AC0029772C /* PersonaListView.swift */; }; - 5314E12A25F016230099271A /* PillButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 497DC2D824185885008D86F8 /* PillButton.swift */; }; - 5314E12B25F016230099271A /* PillButtonBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 497DC2D724185885008D86F8 /* PillButtonBar.swift */; }; - 5314E13425F016370099271A /* PopupMenuItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5961F9E218A256B00E2A506 /* PopupMenuItem.swift */; }; - 5314E13525F016370099271A /* PopupMenuItemCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5961FA2218A25D100E2A506 /* PopupMenuItemCell.swift */; }; - 5314E13625F016370099271A /* PopupMenuSectionHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5961FA4218A260500E2A506 /* PopupMenuSectionHeaderView.swift */; }; - 5314E13725F016370099271A /* PopupMenuProtocols.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0BCEFADD2485FEC00088CEE5 /* PopupMenuProtocols.swift */; }; - 5314E13825F016370099271A /* PopupMenuSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5961FA0218A25C400E2A506 /* PopupMenuSection.swift */; }; - 5314E13925F016370099271A /* PopupMenuController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5961F9C218A254D00E2A506 /* PopupMenuController.swift */; }; - 5314E14225F016860099271A /* CardPresenterNavigationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD0D29D52151A3D700E8655E /* CardPresenterNavigationController.swift */; }; - 5314E14325F016860099271A /* CardTransitionAnimator.swift in Sources */ = {isa = PBXBuildFile; fileRef = FDA1AF90214871B5001AE720 /* CardTransitionAnimator.swift */; }; - 5314E14425F016860099271A /* PageCardPresenterController.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD4F2A1A2148937100C437D6 /* PageCardPresenterController.swift */; }; - 5314E14525F016860099271A /* CardPresentationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = FDA1AF9221487225001AE720 /* CardPresentationController.swift */; }; - 5314E14E25F016CD0099271A /* ResizingHandleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5237ACA21DED7030040BF27 /* ResizingHandleView.swift */; }; - 5314E16925F017940099271A /* SegmentedControl.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECEBA8FB25EDF3380048EE24 /* SegmentedControl.swift */; }; - 5314E17225F0191C0099271A /* Separator.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5DCA76321224026005F4CB7 /* Separator.swift */; }; - 5314E18D25F0195C0099271A /* ShimmerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0EAAEAC2347E1DF00C7244E /* ShimmerView.swift */; }; - 5314E18E25F0195C0099271A /* ShimmerLinesView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0A0D76B233AEF6C00F432FD /* ShimmerLinesView.swift */; }; - 5314E19525F019650099271A /* TabBarItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1168630222E131CF0088B302 /* TabBarItemView.swift */; }; - 5314E19625F019650099271A /* TabBarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1168630322E131CF0088B302 /* TabBarView.swift */; }; - 5314E19725F019650099271A /* TabBarItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 118D9847230BBA2300BC0B72 /* TabBarItem.swift */; }; - 5314E19825F019650099271A /* SideTabBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7D0931C224AAAC8C0072458A /* SideTabBar.swift */; }; - 5314E1A225F01A7C0099271A /* ActivityIndicatorCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4E782C221793AB200A7DFCE /* ActivityIndicatorCell.swift */; }; - 5314E1A325F01A7C0099271A /* TableViewHeaderFooterView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4EF66502294A664007FEAB0 /* TableViewHeaderFooterView.swift */; }; - 5314E1A425F01A7C0099271A /* CenteredLabelCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4E782C62179509A00A7DFCE /* CenteredLabelCell.swift */; }; - 5314E1A525F01A7C0099271A /* TableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = B498141321E424920077B48D /* TableViewCell.swift */; }; - 5314E1A625F01A7C0099271A /* BooleanCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = B441478C228CDA130040E88E /* BooleanCell.swift */; }; - 5314E1A725F01A7C0099271A /* ActionsCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = B4E782C02176AD5E00A7DFCE /* ActionsCell.swift */; }; - 5314E1B025F01A980099271A /* Tooltip.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD7DF05B21FA7F5000857267 /* Tooltip.swift */; }; - 5314E1B125F01A980099271A /* TooltipView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD7DF05D21FA7FC100857267 /* TooltipView.swift */; }; - 5314E1B225F01A980099271A /* TooltipViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD7DF05F21FA83C900857267 /* TooltipViewController.swift */; }; - 5314E1BB25F01B070099271A /* TouchForwardingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = B483323621DEB5A00022B4CC /* TouchForwardingView.swift */; }; - 5314E1C425F01B4E0099271A /* TwoLineTitleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD5BBE40214C6AF3008964B4 /* TwoLineTitleView.swift */; }; - 5314E1CD25F01B730099271A /* AnimationSynchronizer.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0938E43235E8ED500256251 /* AnimationSynchronizer.swift */; }; - 5314E1D625F01E4A0099271A /* SearchBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD41C87E22DD13230086F899 /* SearchBar.swift */; }; - 5314E21E25F022120099271A /* UIView+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5B87B05211E23650038C37C /* UIView+Extensions.swift */; }; - 5314E23025F022C80099271A /* UIScrollView+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD41C8B122DD3BB70086F899 /* UIScrollView+Extensions.swift */; }; - 5314E25425F023650099271A /* UIImage+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5961FA6218A2E4500E2A506 /* UIImage+Extensions.swift */; }; - 5314E26625F023B20099271A /* UIColor+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = A56CE7B522E68A7800AA77EE /* UIColor+Extensions.swift */; }; - 5314E28125F0240D0099271A /* DateComponents+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD9A5C862179464F00D224D9 /* DateComponents+Extensions.swift */; }; - 5314E28E25F024590099271A /* Date+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD5BBE3A214B2F44008964B4 /* Date+Extensions.swift */; }; - 5314E29725F024760099271A /* String+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = A559BB7D212B6D100055E107 /* String+Extension.swift */; }; - 5314E2A025F024860099271A /* NSLayoutConstraint+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD41C8B422DD3EA20086F899 /* NSLayoutConstraint+Extensions.swift */; }; - 5314E2B225F024B60099271A /* Calendar+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD7254E82147059D002F4069 /* Calendar+Extensions.swift */; }; - 5314E2BB25F024C60099271A /* CALayer+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = A54D97D9217A5FC10072681A /* CALayer+Extensions.swift */; }; - 5314E2E325F025500099271A /* FluentUIFramework.swift in Sources */ = {isa = PBXBuildFile; fileRef = A559BB82212B7D870055E107 /* FluentUIFramework.swift */; }; - 5314E2EC25F025710099271A /* DayOfMonth.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD777528219E3F6C00033D58 /* DayOfMonth.swift */; }; - 5314E2F525F025C60099271A /* CalendarConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = FDF41ED82141A02200EC527C /* CalendarConfiguration.swift */; }; - 5314E30225F0260E0099271A /* AccessibilityContainerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD77752A219E455A00033D58 /* AccessibilityContainerView.swift */; }; - 5314E30325F0260E0099271A /* AccessibleViewDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD599D052134A682008845EE /* AccessibleViewDelegate.swift */; }; - 5328D97126FBA3D700F3723B /* IndeterminateProgressBarTokenSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5328D96C26FBA3D600F3723B /* IndeterminateProgressBarTokenSet.swift */; }; - 5328D97326FBA3D700F3723B /* IndeterminateProgressBarModifiers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5328D96D26FBA3D600F3723B /* IndeterminateProgressBarModifiers.swift */; }; - 5328D97726FBA3D700F3723B /* IndeterminateProgressBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5328D96F26FBA3D700F3723B /* IndeterminateProgressBar.swift */; }; - 532FE3D426EA6D74007539C0 /* ActivityIndicatorTokenSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 532FE3CE26EA6D73007539C0 /* ActivityIndicatorTokenSet.swift */; }; - 532FE3D626EA6D74007539C0 /* ActivityIndicatorModifiers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 532FE3CF26EA6D73007539C0 /* ActivityIndicatorModifiers.swift */; }; - 532FE3D826EA6D74007539C0 /* ActivityIndicator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 532FE3D026EA6D74007539C0 /* ActivityIndicator.swift */; }; - 535559E42711411E0094A871 /* FluentThemedHostingController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 535559E22711411E0094A871 /* FluentThemedHostingController.swift */; }; - 5373D5652694D65C0032A3B4 /* AvatarTokenSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5373D5602694D65C0032A3B4 /* AvatarTokenSet.swift */; }; - 5373D5672694D65C0032A3B4 /* Avatar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5373D5612694D65C0032A3B4 /* Avatar.swift */; }; - 5373D56B2694D65C0032A3B4 /* MSFAvatarPresence.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5373D5632694D65C0032A3B4 /* MSFAvatarPresence.swift */; }; - 5373D5732694D66F0032A3B4 /* UIKit+SwiftUI_interoperability.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5373D56D2694D66F0032A3B4 /* UIKit+SwiftUI_interoperability.swift */; }; - 5373D5772694D66F0032A3B4 /* SwiftUI+ViewModifiers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5373D56F2694D66F0032A3B4 /* SwiftUI+ViewModifiers.swift */; }; - 53E2EE0527860D010086D30D /* MSFActivityIndicator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53E2EE0427860D010086D30D /* MSFActivityIndicator.swift */; }; - 53E2EE07278799B30086D30D /* MSFIndeterminateProgressBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53E2EE06278799B30086D30D /* MSFIndeterminateProgressBar.swift */; }; - 566C664A28CB99830032314C /* module.modulemap in Copy module.modulemap */ = {isa = PBXBuildFile; fileRef = 566C664828CB97210032314C /* module.modulemap */; }; - 66512A3829D3B30D003CF303 /* AvatarTitleViewTokenSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 66512A3729D3B30D003CF303 /* AvatarTitleViewTokenSet.swift */; }; - 667E54022A12B6F800728F93 /* TwoLineTitleView+Navigation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 667E54012A12B6F800728F93 /* TwoLineTitleView+Navigation.swift */; }; - 66963D0A29CA7F89006F5FA9 /* TwoLineTitleViewTokenSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 66963D0929CA7F89006F5FA9 /* TwoLineTitleViewTokenSet.swift */; }; - 66963D1029CE244D006F5FA9 /* NavigationBarTokenSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 66963D0F29CE244D006F5FA9 /* NavigationBarTokenSet.swift */; }; - 6EB4B25F270ED6B30005B808 /* BadgeLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6EB4B25D270ED6450005B808 /* BadgeLabel.swift */; }; - 6ED5E55126D3D39400D8BE81 /* BadgeLabelButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6ED4C11C2696AE4000C30BD6 /* BadgeLabelButton.swift */; }; - 6ED5E55226D3D39400D8BE81 /* UIBarButtonItem+BadgeValue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6ED4C11A2695A6E800C30BD6 /* UIBarButtonItem+BadgeValue.swift */; }; - 6F050B6929D3D16D0070D3D5 /* SideTabBarTokenSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F050B6829D3D16D0070D3D5 /* SideTabBarTokenSet.swift */; }; - 6F050B6B29D3D1900070D3D5 /* TabBarItemTokenSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F050B6A29D3D1900070D3D5 /* TabBarItemTokenSet.swift */; }; - 6F050B6D29D3D1A90070D3D5 /* TabBarTokenSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F050B6C29D3D1A90070D3D5 /* TabBarTokenSet.swift */; }; - 6F050B6F29D3EA820070D3D5 /* PillButtonTokenSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F050B6E29D3EA820070D3D5 /* PillButtonTokenSet.swift */; }; - 6F050B7129D6213E0070D3D5 /* PopupMenuItemTokenSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F050B7029D6213E0070D3D5 /* PopupMenuItemTokenSet.swift */; }; - 6F050B7529D6219D0070D3D5 /* PopupMenuTokenSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F050B7429D6219D0070D3D5 /* PopupMenuTokenSet.swift */; }; - 6F2F218F2A12BFD900C50EAB /* BadgeLabelTokenSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F2F218E2A12BFD900C50EAB /* BadgeLabelTokenSet.swift */; }; - 6F3CB7F029D3A2B700284353 /* DrawerTokenSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F3CB7EF29D3A2B700284353 /* DrawerTokenSet.swift */; }; - 6F3CB7F229D3A5DE00284353 /* ResizingHandleTokenSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F3CB7F129D3A5DE00284353 /* ResizingHandleTokenSet.swift */; }; - 6FBFD62629CBB5F1002F3C81 /* SearchBarTokenSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6FBFD62529CBB5F1002F3C81 /* SearchBarTokenSet.swift */; }; - 6FC3705E29E7707F0096B239 /* BadgeViewTokenSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6FC3705D29E7707F0096B239 /* BadgeViewTokenSet.swift */; }; - 8035CAB62633A4DB007B3FD1 /* BottomCommandingController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8035CAAA2633A442007B3FD1 /* BottomCommandingController.swift */; }; - 8035CAD026377C17007B3FD1 /* CommandingItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8035CACA26377C14007B3FD1 /* CommandingItem.swift */; }; - 8035CADE2638E435007B3FD1 /* CommandingSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8035CADC2638E435007B3FD1 /* CommandingSection.swift */; }; - 804EDE1528C00CA400371C6B /* ContentHeightResolutionContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 804EDE1428C00CA400371C6B /* ContentHeightResolutionContext.swift */; }; - 80AECC21263339E3005AF2F3 /* BottomSheetController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 80AECBD82629F18E005AF2F3 /* BottomSheetController.swift */; }; - 80AECC22263339E5005AF2F3 /* BottomSheetPassthroughView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 80AECBF1262FC34E005AF2F3 /* BottomSheetPassthroughView.swift */; }; - 8FA3CB5B246B19EA0049E431 /* ColorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8FA3CB5A246B19EA0049E431 /* ColorTests.swift */; }; - 92016FF8299DF34A00660DB7 /* EmptyTokenSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 92016FF7299DF34A00660DB7 /* EmptyTokenSet.swift */; }; - 92088EF92666DB2C003F571A /* PersonaButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 92088EF72666DB2C003F571A /* PersonaButton.swift */; }; - 920945492703DDA000B38E1A /* CardNudgeTokenSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 920945472703DDA000B38E1A /* CardNudgeTokenSet.swift */; }; - 92279B332B97C7DC00994D88 /* FluentButtonStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 92279B322B97C7DC00994D88 /* FluentButtonStyle.swift */; }; - 922A34DF27BB87990062721F /* TokenizedControlView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 922A34DE27BB87990062721F /* TokenizedControlView.swift */; }; - 9231491128BF026A001B033E /* HeadsUpDisplayTokenSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5336B17F27FB6D9B00B01E0D /* HeadsUpDisplayTokenSet.swift */; }; - 9231491228BF026A001B033E /* HUDModifiers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5336B17027F77EB700B01E0D /* HUDModifiers.swift */; }; - 9231491328BF026A001B033E /* HeadsUpDisplay.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5336B17327F77EB700B01E0D /* HeadsUpDisplay.swift */; }; - 9231491428BF026A001B033E /* MSFHeadsUpDisplay.swift in Sources */ = {isa = PBXBuildFile; fileRef = 532299FF27FE108400C016A2 /* MSFHeadsUpDisplay.swift */; }; - 9231491528BF026A001B033E /* HUD.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5336B17227F77EB700B01E0D /* HUD.swift */; }; - 9231491628BF02B9001B033E /* Button.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5CEC23020E451D00016922A /* Button.swift */; }; - 9231F10329BB99090079CD94 /* FluentTheme+Tokens.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9231F10229BB99090079CD94 /* FluentTheme+Tokens.swift */; }; - 923DB9D4274CB65700D8E58A /* TokenizedControl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 923DB9D2274CB65700D8E58A /* TokenizedControl.swift */; }; - 923DB9D5274CB65700D8E58A /* FluentTheme.swift in Sources */ = {isa = PBXBuildFile; fileRef = 923DB9D3274CB65700D8E58A /* FluentTheme.swift */; }; - 923DB9D7274CB66D00D8E58A /* ControlHostingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 923DB9D6274CB66D00D8E58A /* ControlHostingView.swift */; }; - 923DF2E72712B6AB00637646 /* libFluentUI.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 8FD01166228A820600D25925 /* libFluentUI.a */; }; - 923DF2E82712B6C400637646 /* FluentUIResources-ios.bundle in Resources */ = {isa = PBXBuildFile; fileRef = A5DA88FC226FAA01000A8EA8 /* FluentUIResources-ios.bundle */; }; - 924268A2277AD9F700C5A452 /* FontTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 924268A1277AD9F700C5A452 /* FontTests.swift */; }; - 925728F7276D6AF800EE1019 /* ShadowInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 925728F6276D6AF800EE1019 /* ShadowInfo.swift */; }; - 925728F9276D6B5800EE1019 /* FontInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 925728F8276D6B5800EE1019 /* FontInfo.swift */; }; - 925D461D26FD133600179583 /* GlobalTokens.swift in Sources */ = {isa = PBXBuildFile; fileRef = 925D461B26FD133600179583 /* GlobalTokens.swift */; }; - 925D462026FD18B200179583 /* AliasTokens.swift in Sources */ = {isa = PBXBuildFile; fileRef = 925D461E26FD18B200179583 /* AliasTokens.swift */; }; - 926B4C9A2B8E94F6001EBA16 /* FluentTheme+visionOS.swift in Sources */ = {isa = PBXBuildFile; fileRef = 926B4C992B8E94F6001EBA16 /* FluentTheme+visionOS.swift */; }; - 926FEEAA2B45A8B4002C61D0 /* Compatibility.swift in Sources */ = {isa = PBXBuildFile; fileRef = 926FEEA92B45A8B4002C61D0 /* Compatibility.swift */; }; - 9275105626815A7100F12730 /* MSFPersonaButtonCarousel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9275105426815A7100F12730 /* MSFPersonaButtonCarousel.swift */; }; - 927EB2BD278627440069753D /* PersonaButtonModifiers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 927EB2BC278627440069753D /* PersonaButtonModifiers.swift */; }; - 929215B92B6C75E500D4EA9F /* AvatarTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 929215B82B6C75E500D4EA9F /* AvatarTests.swift */; }; - 9298798B2669A875002B1EB4 /* PersonaButtonTokenSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 927E34C62668350800998031 /* PersonaButtonTokenSet.swift */; }; - 929DD257266ED3AC00E8175E /* PersonaButtonCarouselTokenSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 929DD255266ED3AC00E8175E /* PersonaButtonCarouselTokenSet.swift */; }; - 929DD25A266ED3B600E8175E /* PersonaButtonCarousel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 929DD258266ED3B600E8175E /* PersonaButtonCarousel.swift */; }; - 92A1E4F526A791590007ED60 /* MSFCardNudge.swift in Sources */ = {isa = PBXBuildFile; fileRef = 92A1E4F326A791590007ED60 /* MSFCardNudge.swift */; }; - 92B7E6A326864AE900EFC15E /* MSFPersonaButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 92B7E6A12684262900EFC15E /* MSFPersonaButton.swift */; }; - 92D49054278FF4E50085C018 /* PersonaButtonCarouselModifiers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 92D49053278FF4E50085C018 /* PersonaButtonCarouselModifiers.swift */; }; - 92D5598226A0FD2800328FD3 /* CardNudge.swift in Sources */ = {isa = PBXBuildFile; fileRef = 92D5598026A0FD2800328FD3 /* CardNudge.swift */; }; - 92D5FDFB28A713990087894B /* LinearGradientInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 92D5FDFA28A713990087894B /* LinearGradientInfo.swift */; }; - 92DEE2252723D34400E31ED0 /* ControlTokenSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 92DEE2232723D34400E31ED0 /* ControlTokenSet.swift */; }; - 92E7AD5026FE51FF00AE7FF8 /* DynamicColor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 92E7AD4E26FE51FF00AE7FF8 /* DynamicColor.swift */; }; - 92EE82AE27025A94009D52B5 /* TokenSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 92EE82AC27025A94009D52B5 /* TokenSet.swift */; }; - 92F8054E272B2DF3000EAFDB /* CardNudgeModifiers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 92079C8E26B66E5100D688DA /* CardNudgeModifiers.swift */; }; - 94A7EC1A2836DCB200BFFBAE /* CommandBarCommandGroupsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94A7EC192836DCB100BFFBAE /* CommandBarCommandGroupsView.swift */; }; - A257F82C251D98F3002CAA6E /* FluentUI-ios.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = A257F82B251D98F3002CAA6E /* FluentUI-ios.xcassets */; }; - A542A9D7226FC01100204A52 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = A559BB81212B6FA40055E107 /* Localizable.strings */; }; - A542A9D8226FC01700204A52 /* Localizable.stringsdict in Resources */ = {isa = PBXBuildFile; fileRef = A5DF1EAD2213B26900CC741A /* Localizable.stringsdict */; }; - A5CEC16020D980B30016922A /* FluentUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A5CEC15F20D980B30016922A /* FluentUITests.swift */; }; - C708B05F260A8778007190FA /* SegmentPillButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = C708B055260A86FA007190FA /* SegmentPillButton.swift */; }; - C708B064260A87F7007190FA /* SegmentItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = C708B04B260A8696007190FA /* SegmentItem.swift */; }; - C77A04B825F03DD1001B3EB6 /* String+Date.swift in Sources */ = {isa = PBXBuildFile; fileRef = C77A04B625F03DD1001B3EB6 /* String+Date.swift */; }; - D6296DAE295B7CA0002E8EB6 /* ColorProviding.swift in Sources */ = {isa = PBXBuildFile; fileRef = D6296DAD295B7C9F002E8EB6 /* ColorProviding.swift */; }; - EC04E65829C27359005F8BA0 /* FocusRingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC04E65729C27359005F8BA0 /* FocusRingView.swift */; }; - EC1C31732923022E00CF052C /* SegmentedControlTokenSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC1C31722923022E00CF052C /* SegmentedControlTokenSet.swift */; }; - EC5982D827BF348700FD048D /* MSFAvatar.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC5982D727BF348700FD048D /* MSFAvatar.swift */; }; - EC5982DA27C703EE00FD048D /* ShapeCutout.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC5982D927C703ED00FD048D /* ShapeCutout.swift */; }; - EC65F790292EDCEF002A1A23 /* ButtonTokenSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC65F78F292EDCEF002A1A23 /* ButtonTokenSet.swift */; }; - EC98E2AD2980C15C00B9DF91 /* FluentTextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC98E2AC2980C15C00B9DF91 /* FluentTextField.swift */; }; - EC98E2B0298D978C00B9DF91 /* FluentTextFieldInternal.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC98E2AF298D978C00B9DF91 /* FluentTextFieldInternal.swift */; }; - EC98E2B2298D97EC00B9DF91 /* TextFieldTokenSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC98E2B1298D97EC00B9DF91 /* TextFieldTokenSet.swift */; }; - EC98E2B4298D989100B9DF91 /* FluentTextInputError.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC98E2B3298D989100B9DF91 /* FluentTextInputError.swift */; }; - ECA9218627A3301C00B66117 /* MSFAvatarGroup.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECA9218527A3301C00B66117 /* MSFAvatarGroup.swift */; }; - ECA9218A27A33A2D00B66117 /* AvatarGroupModifiers.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECA9218927A33A2D00B66117 /* AvatarGroupModifiers.swift */; }; - ECF3C9882A67495A00CA35FC /* BottomCommandingTokenSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = ECF3C9872A67495A00CA35FC /* BottomCommandingTokenSet.swift */; }; - F32E6E8B2A7997F3003F9AE7 /* ListActionItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = F32E6E8A2A7997F3003F9AE7 /* ListActionItem.swift */; }; - F3DFD3612A7B210100014C6E /* ListActionItemModifiers.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3DFD3602A7B210100014C6E /* ListActionItemModifiers.swift */; }; - F3F113892A705AD500DA852A /* ListItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3F113882A705AD500DA852A /* ListItem.swift */; }; - F3F1138D2A705B6900DA852A /* ListItemModifiers.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3F1138C2A705B6900DA852A /* ListItemModifiers.swift */; }; - FD053A352224CA33009B6378 /* DatePickerControllerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = FD053A342224CA33009B6378 /* DatePickerControllerTests.swift */; }; -/* End PBXBuildFile section */ - -/* Begin PBXContainerItemProxy section */ - 8FD011C7228A831700D25925 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = A5CEC14820D980B20016922A /* Project object */; - proxyType = 1; - remoteGlobalIDString = A5DA88FB226FAA01000A8EA8; - remoteInfo = OfficeUIFabricResources; - }; -/* End PBXContainerItemProxy section */ - -/* Begin PBXCopyFilesBuildPhase section */ - 566C664928CB994F0032314C /* Copy module.modulemap */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = include/FluentUI; - dstSubfolderSpec = 16; - files = ( - 566C664A28CB99830032314C /* module.modulemap in Copy module.modulemap */, - ); - name = "Copy module.modulemap"; - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXCopyFilesBuildPhase section */ - -/* Begin PBXFileReference section */ - 0A84A6EF29EDC489005DBC3D /* SeparatorTokenSet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SeparatorTokenSet.swift; sourceTree = ""; }; - 0A8E61FA291DC11F009E412D /* CommandBarTokenSet.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CommandBarTokenSet.swift; sourceTree = ""; }; - 0AE3041C29F721B2003CDDD9 /* TableViewHeaderFooterViewTokenSet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TableViewHeaderFooterViewTokenSet.swift; sourceTree = ""; }; - 0BCEFADD2485FEC00088CEE5 /* PopupMenuProtocols.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PopupMenuProtocols.swift; sourceTree = ""; }; - 1168630222E131CF0088B302 /* TabBarItemView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TabBarItemView.swift; sourceTree = ""; }; - 1168630322E131CF0088B302 /* TabBarView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TabBarView.swift; sourceTree = ""; }; - 118D9847230BBA2300BC0B72 /* TabBarItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TabBarItem.swift; sourceTree = ""; }; - 2A9745DD281733D700E1A1FD /* TableViewCellTokenSet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TableViewCellTokenSet.swift; sourceTree = ""; }; - 3A9FC0F42A6AFAD40060A6BE /* BadgeFieldTokenSet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BadgeFieldTokenSet.swift; sourceTree = ""; }; - 3A9FC0F62A705C090060A6BE /* PeoplePickerTokenSet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PeoplePickerTokenSet.swift; sourceTree = ""; }; - 3AFB0FD529C1365600FEC1A9 /* MultilineCommandBar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MultilineCommandBar.swift; sourceTree = ""; }; - 43488C44270FAD0200124C71 /* FluentNotification.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FluentNotification.swift; sourceTree = ""; }; - 497DC2D724185885008D86F8 /* PillButtonBar.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PillButtonBar.swift; sourceTree = ""; }; - 497DC2D824185885008D86F8 /* PillButton.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PillButton.swift; sourceTree = ""; }; - 4B2E373C2991CB53008929B4 /* BottomSheetTokenSet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BottomSheetTokenSet.swift; sourceTree = ""; }; - 4B4A2F2029A7E83100570CD4 /* LabelTokenSet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LabelTokenSet.swift; sourceTree = ""; }; - 4B53505E27F63E3F0033B47F /* NotificationModifiers.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationModifiers.swift; sourceTree = ""; }; - 4B8245D7293FC7A200CF0C77 /* TooltipTokenSet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TooltipTokenSet.swift; sourceTree = ""; }; - 4BBD651E2755FD9500A8B09E /* MSFNotification.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MSFNotification.swift; sourceTree = ""; }; - 4BDBE18828EC9E6F00314696 /* ShimmerTokenSet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShimmerTokenSet.swift; sourceTree = ""; }; - 4BF01D9927B37CF8005B32F2 /* NotificationTokenSet.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NotificationTokenSet.swift; sourceTree = ""; }; - 4BF01D9F27B3A861005B32F2 /* UIApplication+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIApplication+Extensions.swift"; sourceTree = ""; }; - 5303259926B31B6B00611D05 /* AvatarModifiers.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AvatarModifiers.swift; sourceTree = ""; }; - 5306074F26A1E6A4002D49CF /* AvatarGroupTokenSet.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AvatarGroupTokenSet.swift; sourceTree = ""; }; - 5306075126A1E6A4002D49CF /* AvatarGroup.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AvatarGroup.swift; sourceTree = ""; }; - 530D9C5027EE388200BDCBBF /* SwiftUI+ViewPresentation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "SwiftUI+ViewPresentation.swift"; sourceTree = ""; }; - 530D9C5227EE7B2C00BDCBBF /* SwiftUI+ViewAnimation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "SwiftUI+ViewAnimation.swift"; sourceTree = ""; }; - 532299FF27FE108400C016A2 /* MSFHeadsUpDisplay.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MSFHeadsUpDisplay.swift; sourceTree = ""; }; - 5328D96C26FBA3D600F3723B /* IndeterminateProgressBarTokenSet.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = IndeterminateProgressBarTokenSet.swift; sourceTree = ""; }; - 5328D96D26FBA3D600F3723B /* IndeterminateProgressBarModifiers.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = IndeterminateProgressBarModifiers.swift; sourceTree = ""; }; - 5328D96F26FBA3D700F3723B /* IndeterminateProgressBar.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = IndeterminateProgressBar.swift; sourceTree = ""; }; - 532FE3CE26EA6D73007539C0 /* ActivityIndicatorTokenSet.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ActivityIndicatorTokenSet.swift; sourceTree = ""; }; - 532FE3CF26EA6D73007539C0 /* ActivityIndicatorModifiers.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ActivityIndicatorModifiers.swift; sourceTree = ""; }; - 532FE3D026EA6D74007539C0 /* ActivityIndicator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ActivityIndicator.swift; sourceTree = ""; }; - 5336B17027F77EB700B01E0D /* HUDModifiers.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HUDModifiers.swift; sourceTree = ""; }; - 5336B17227F77EB700B01E0D /* HUD.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HUD.swift; sourceTree = ""; }; - 5336B17327F77EB700B01E0D /* HeadsUpDisplay.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HeadsUpDisplay.swift; sourceTree = ""; }; - 5336B17427F77EB700B01E0D /* HUD.resources.xcfilelist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcfilelist; path = HUD.resources.xcfilelist; sourceTree = ""; }; - 5336B17F27FB6D9B00B01E0D /* HeadsUpDisplayTokenSet.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HeadsUpDisplayTokenSet.swift; sourceTree = ""; }; - 535559E22711411E0094A871 /* FluentThemedHostingController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FluentThemedHostingController.swift; sourceTree = ""; }; - 5373D5602694D65C0032A3B4 /* AvatarTokenSet.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AvatarTokenSet.swift; sourceTree = ""; }; - 5373D5612694D65C0032A3B4 /* Avatar.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Avatar.swift; sourceTree = ""; }; - 5373D5632694D65C0032A3B4 /* MSFAvatarPresence.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MSFAvatarPresence.swift; sourceTree = ""; }; - 5373D56D2694D66F0032A3B4 /* UIKit+SwiftUI_interoperability.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIKit+SwiftUI_interoperability.swift"; sourceTree = ""; }; - 5373D56F2694D66F0032A3B4 /* SwiftUI+ViewModifiers.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "SwiftUI+ViewModifiers.swift"; sourceTree = ""; }; - 53BCB0CD253A4E8C00620960 /* Obscurable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Obscurable.swift; sourceTree = ""; }; - 53E2EE0427860D010086D30D /* MSFActivityIndicator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MSFActivityIndicator.swift; sourceTree = ""; }; - 53E2EE06278799B30086D30D /* MSFIndeterminateProgressBar.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MSFIndeterminateProgressBar.swift; sourceTree = ""; }; - 53FC90C02567300A008A06FD /* FluentUI_common.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = FluentUI_common.xcconfig; sourceTree = ""; }; - 53FC90F525673626008A06FD /* FluentUI_release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = FluentUI_release.xcconfig; sourceTree = ""; }; - 53FC90F625673626008A06FD /* FluentUI_debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = FluentUI_debug.xcconfig; sourceTree = ""; }; - 53FC90F725673626008A06FD /* FluentUITests.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = FluentUITests.xcconfig; sourceTree = ""; }; - 53FC90F925673627008A06FD /* FluentUILib_common.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = FluentUILib_common.xcconfig; sourceTree = ""; }; - 53FC90FA25673627008A06FD /* FluentUIResources.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = FluentUIResources.xcconfig; sourceTree = ""; }; - 566C664828CB97210032314C /* module.modulemap */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.module-map"; path = module.modulemap; sourceTree = ""; }; - 66512A3729D3B30D003CF303 /* AvatarTitleViewTokenSet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AvatarTitleViewTokenSet.swift; sourceTree = ""; }; - 667E54012A12B6F800728F93 /* TwoLineTitleView+Navigation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "TwoLineTitleView+Navigation.swift"; sourceTree = ""; }; - 66963D0929CA7F89006F5FA9 /* TwoLineTitleViewTokenSet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TwoLineTitleViewTokenSet.swift; sourceTree = ""; }; - 66963D0F29CE244D006F5FA9 /* NavigationBarTokenSet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigationBarTokenSet.swift; sourceTree = ""; }; - 6EB4B25D270ED6450005B808 /* BadgeLabel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BadgeLabel.swift; sourceTree = ""; }; - 6ED4C11A2695A6E800C30BD6 /* UIBarButtonItem+BadgeValue.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIBarButtonItem+BadgeValue.swift"; sourceTree = ""; }; - 6ED4C11C2696AE4000C30BD6 /* BadgeLabelButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BadgeLabelButton.swift; sourceTree = ""; }; - 6F050B6829D3D16D0070D3D5 /* SideTabBarTokenSet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SideTabBarTokenSet.swift; sourceTree = ""; }; - 6F050B6A29D3D1900070D3D5 /* TabBarItemTokenSet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TabBarItemTokenSet.swift; sourceTree = ""; }; - 6F050B6C29D3D1A90070D3D5 /* TabBarTokenSet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TabBarTokenSet.swift; sourceTree = ""; }; - 6F050B6E29D3EA820070D3D5 /* PillButtonTokenSet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PillButtonTokenSet.swift; sourceTree = ""; }; - 6F050B7029D6213E0070D3D5 /* PopupMenuItemTokenSet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PopupMenuItemTokenSet.swift; sourceTree = ""; }; - 6F050B7429D6219D0070D3D5 /* PopupMenuTokenSet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PopupMenuTokenSet.swift; sourceTree = ""; }; - 6F2F218E2A12BFD900C50EAB /* BadgeLabelTokenSet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BadgeLabelTokenSet.swift; sourceTree = ""; }; - 6F3CB7EF29D3A2B700284353 /* DrawerTokenSet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DrawerTokenSet.swift; sourceTree = ""; }; - 6F3CB7F129D3A5DE00284353 /* ResizingHandleTokenSet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ResizingHandleTokenSet.swift; sourceTree = ""; }; - 6FBFD62529CBB5F1002F3C81 /* SearchBarTokenSet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchBarTokenSet.swift; sourceTree = ""; }; - 6FC3705D29E7707F0096B239 /* BadgeViewTokenSet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BadgeViewTokenSet.swift; sourceTree = ""; }; - 7D0931C224AAAC8C0072458A /* SideTabBar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SideTabBar.swift; sourceTree = ""; }; - 8035CAAA2633A442007B3FD1 /* BottomCommandingController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BottomCommandingController.swift; sourceTree = ""; }; - 8035CACA26377C14007B3FD1 /* CommandingItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CommandingItem.swift; sourceTree = ""; }; - 8035CADC2638E435007B3FD1 /* CommandingSection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CommandingSection.swift; sourceTree = ""; }; - 804EDE1428C00CA400371C6B /* ContentHeightResolutionContext.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentHeightResolutionContext.swift; sourceTree = ""; }; - 80AECBD82629F18E005AF2F3 /* BottomSheetController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BottomSheetController.swift; sourceTree = ""; }; - 80AECBF1262FC34E005AF2F3 /* BottomSheetPassthroughView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BottomSheetPassthroughView.swift; sourceTree = ""; }; - 8FA3CB5A246B19EA0049E431 /* ColorTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ColorTests.swift; sourceTree = ""; }; - 8FD01166228A820600D25925 /* libFluentUI.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libFluentUI.a; sourceTree = BUILT_PRODUCTS_DIR; }; - 92016FF7299DF34A00660DB7 /* EmptyTokenSet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EmptyTokenSet.swift; sourceTree = ""; }; - 92079C8E26B66E5100D688DA /* CardNudgeModifiers.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CardNudgeModifiers.swift; sourceTree = ""; }; - 92088EF72666DB2C003F571A /* PersonaButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PersonaButton.swift; sourceTree = ""; }; - 920945472703DDA000B38E1A /* CardNudgeTokenSet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CardNudgeTokenSet.swift; sourceTree = ""; }; - 92279B322B97C7DC00994D88 /* FluentButtonStyle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FluentButtonStyle.swift; sourceTree = ""; }; - 922A34DE27BB87990062721F /* TokenizedControlView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TokenizedControlView.swift; sourceTree = ""; }; - 9231F10229BB99090079CD94 /* FluentTheme+Tokens.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "FluentTheme+Tokens.swift"; sourceTree = ""; }; - 923DB9D2274CB65700D8E58A /* TokenizedControl.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TokenizedControl.swift; sourceTree = ""; }; - 923DB9D3274CB65700D8E58A /* FluentTheme.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FluentTheme.swift; sourceTree = ""; }; - 923DB9D6274CB66D00D8E58A /* ControlHostingView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ControlHostingView.swift; sourceTree = ""; }; - 924268A1277AD9F700C5A452 /* FontTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FontTests.swift; sourceTree = ""; }; - 925728F6276D6AF800EE1019 /* ShadowInfo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShadowInfo.swift; sourceTree = ""; }; - 925728F8276D6B5800EE1019 /* FontInfo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FontInfo.swift; sourceTree = ""; }; - 925D461B26FD133600179583 /* GlobalTokens.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GlobalTokens.swift; sourceTree = ""; }; - 925D461E26FD18B200179583 /* AliasTokens.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AliasTokens.swift; sourceTree = ""; }; - 926B4C992B8E94F6001EBA16 /* FluentTheme+visionOS.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "FluentTheme+visionOS.swift"; sourceTree = ""; }; - 926FEEA92B45A8B4002C61D0 /* Compatibility.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Compatibility.swift; sourceTree = ""; }; - 9275105426815A7100F12730 /* MSFPersonaButtonCarousel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MSFPersonaButtonCarousel.swift; sourceTree = ""; }; - 927E34C62668350800998031 /* PersonaButtonTokenSet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PersonaButtonTokenSet.swift; sourceTree = ""; }; - 927EB2BC278627440069753D /* PersonaButtonModifiers.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PersonaButtonModifiers.swift; sourceTree = ""; }; - 929215B82B6C75E500D4EA9F /* AvatarTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AvatarTests.swift; sourceTree = ""; }; - 929DD255266ED3AC00E8175E /* PersonaButtonCarouselTokenSet.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PersonaButtonCarouselTokenSet.swift; sourceTree = ""; }; - 929DD258266ED3B600E8175E /* PersonaButtonCarousel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PersonaButtonCarousel.swift; sourceTree = ""; }; - 92A1E4F326A791590007ED60 /* MSFCardNudge.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MSFCardNudge.swift; sourceTree = ""; }; - 92B7E6A12684262900EFC15E /* MSFPersonaButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MSFPersonaButton.swift; sourceTree = ""; }; - 92D49053278FF4E50085C018 /* PersonaButtonCarouselModifiers.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PersonaButtonCarouselModifiers.swift; sourceTree = ""; }; - 92D5598026A0FD2800328FD3 /* CardNudge.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CardNudge.swift; sourceTree = ""; }; - 92D5FDFA28A713990087894B /* LinearGradientInfo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LinearGradientInfo.swift; sourceTree = ""; }; - 92DEE2232723D34400E31ED0 /* ControlTokenSet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ControlTokenSet.swift; sourceTree = ""; }; - 92E7AD4E26FE51FF00AE7FF8 /* DynamicColor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DynamicColor.swift; sourceTree = ""; }; - 92EE82AC27025A94009D52B5 /* TokenSet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TokenSet.swift; sourceTree = ""; }; - 94A7EC192836DCB100BFFBAE /* CommandBarCommandGroupsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CommandBarCommandGroupsView.swift; sourceTree = ""; }; - A257F82B251D98F3002CAA6E /* FluentUI-ios.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = "FluentUI-ios.xcassets"; path = "FluentUI/Resources/FluentUI-ios.xcassets"; sourceTree = ""; }; - A5237ACA21DED7030040BF27 /* ResizingHandleView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ResizingHandleView.swift; sourceTree = ""; }; - A5237ACC21ED6CA70040BF27 /* DrawerShadowView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DrawerShadowView.swift; sourceTree = ""; }; - A52648DB2316F4F9003342A0 /* BarButtonItems.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BarButtonItems.swift; sourceTree = ""; }; - A54D97D9217A5FC10072681A /* CALayer+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "CALayer+Extensions.swift"; sourceTree = ""; }; - A559BB7D212B6D100055E107 /* String+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "String+Extension.swift"; sourceTree = ""; }; - A559BB80212B6FA40055E107 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = ""; }; - A559BB82212B7D870055E107 /* FluentUIFramework.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FluentUIFramework.swift; sourceTree = ""; }; - A56CE7B522E68A7800AA77EE /* UIColor+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIColor+Extensions.swift"; sourceTree = ""; }; - A589F853211BA03200471C23 /* Label.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Label.swift; sourceTree = ""; }; - A5961F9C218A254D00E2A506 /* PopupMenuController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PopupMenuController.swift; sourceTree = ""; }; - A5961F9E218A256B00E2A506 /* PopupMenuItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PopupMenuItem.swift; sourceTree = ""; }; - A5961FA0218A25C400E2A506 /* PopupMenuSection.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PopupMenuSection.swift; sourceTree = ""; }; - A5961FA2218A25D100E2A506 /* PopupMenuItemCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PopupMenuItemCell.swift; sourceTree = ""; }; - A5961FA4218A260500E2A506 /* PopupMenuSectionHeaderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PopupMenuSectionHeaderView.swift; sourceTree = ""; }; - A5961FA6218A2E4500E2A506 /* UIImage+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIImage+Extensions.swift"; sourceTree = ""; }; - A5B87AF3211E16360038C37C /* DrawerController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DrawerController.swift; sourceTree = ""; }; - A5B87AF4211E16360038C37C /* DrawerTransitionAnimator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DrawerTransitionAnimator.swift; sourceTree = ""; }; - A5B87AF5211E16360038C37C /* DrawerPresentationController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DrawerPresentationController.swift; sourceTree = ""; }; - A5B87B03211E22B70038C37C /* DimmingView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DimmingView.swift; sourceTree = ""; }; - A5B87B05211E23650038C37C /* UIView+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIView+Extensions.swift"; sourceTree = ""; }; - A5CEC15420D980B20016922A /* FluentUI.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FluentUI.h; sourceTree = ""; }; - A5CEC15A20D980B30016922A /* FluentUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = FluentUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - A5CEC15F20D980B30016922A /* FluentUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FluentUITests.swift; sourceTree = ""; }; - A5CEC16120D980B30016922A /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - A5CEC23020E451D00016922A /* Button.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Button.swift; sourceTree = ""; }; - A5DA88FC226FAA01000A8EA8 /* FluentUIResources-ios.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "FluentUIResources-ios.bundle"; sourceTree = BUILT_PRODUCTS_DIR; }; - A5DA88FE226FAA01000A8EA8 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - A5DCA76321224026005F4CB7 /* Separator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Separator.swift; sourceTree = ""; }; - A5DF1EAC2213B26900CC741A /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = en; path = en.lproj/Localizable.stringsdict; sourceTree = ""; }; - B441478C228CDA130040E88E /* BooleanCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BooleanCell.swift; sourceTree = ""; }; - B444D6B52183A9740002B4D4 /* BadgeView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BadgeView.swift; sourceTree = ""; }; - B45EB78F219E310F008646A2 /* BadgeField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BadgeField.swift; sourceTree = ""; }; - B46D3F922151D95F0029772C /* PersonaCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PersonaCell.swift; sourceTree = ""; }; - B46D3F9C215985AC0029772C /* PersonaListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PersonaListView.swift; sourceTree = ""; }; - B47B58B722F8E5840078DE38 /* PeoplePicker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PeoplePicker.swift; sourceTree = ""; }; - B483323621DEB5A00022B4CC /* TouchForwardingView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TouchForwardingView.swift; sourceTree = ""; }; - B498141321E424920077B48D /* TableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TableViewCell.swift; sourceTree = ""; }; - B4A8BBCC21BF6D6900D5E3ED /* BadgeStringExtractor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BadgeStringExtractor.swift; sourceTree = ""; }; - B4BA27872319DC0D0001563C /* PersonaBadgeViewDataSource.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PersonaBadgeViewDataSource.swift; sourceTree = ""; }; - B4E782C02176AD5E00A7DFCE /* ActionsCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ActionsCell.swift; sourceTree = ""; }; - B4E782C221793AB200A7DFCE /* ActivityIndicatorCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ActivityIndicatorCell.swift; sourceTree = ""; }; - B4E782C62179509A00A7DFCE /* CenteredLabelCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CenteredLabelCell.swift; sourceTree = ""; }; - B4EF53C2215AF1AB00573E8F /* Persona.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Persona.swift; sourceTree = ""; }; - B4EF66502294A664007FEAB0 /* TableViewHeaderFooterView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TableViewHeaderFooterView.swift; sourceTree = ""; }; - C0938E43235E8ED500256251 /* AnimationSynchronizer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AnimationSynchronizer.swift; sourceTree = ""; }; - C0A0D76B233AEF6C00F432FD /* ShimmerLinesView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ShimmerLinesView.swift; sourceTree = ""; }; - C0EAAEAC2347E1DF00C7244E /* ShimmerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShimmerView.swift; sourceTree = ""; }; - C708B04B260A8696007190FA /* SegmentItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SegmentItem.swift; sourceTree = ""; }; - C708B055260A86FA007190FA /* SegmentPillButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SegmentPillButton.swift; sourceTree = ""; }; - C7752C7B2790C1F40012F860 /* FluentUILib_release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = FluentUILib_release.xcconfig; sourceTree = ""; }; - C7752C7C2790C1F40012F860 /* FluentUILib_debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = FluentUILib_debug.xcconfig; sourceTree = ""; }; - C77A04B625F03DD1001B3EB6 /* String+Date.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "String+Date.swift"; sourceTree = ""; }; - CCC18C2B2501B22F00BE830E /* CardView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CardView.swift; sourceTree = ""; }; - D6296DAD295B7C9F002E8EB6 /* ColorProviding.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ColorProviding.swift; sourceTree = ""; }; - EC04E65729C27359005F8BA0 /* FocusRingView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FocusRingView.swift; sourceTree = ""; }; - EC1C31722923022E00CF052C /* SegmentedControlTokenSet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SegmentedControlTokenSet.swift; sourceTree = ""; }; - EC5982D727BF348700FD048D /* MSFAvatar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MSFAvatar.swift; sourceTree = ""; }; - EC5982D927C703ED00FD048D /* ShapeCutout.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShapeCutout.swift; sourceTree = ""; }; - EC65F78F292EDCEF002A1A23 /* ButtonTokenSet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ButtonTokenSet.swift; sourceTree = ""; }; - EC98E2AC2980C15C00B9DF91 /* FluentTextField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FluentTextField.swift; sourceTree = ""; }; - EC98E2AF298D978C00B9DF91 /* FluentTextFieldInternal.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FluentTextFieldInternal.swift; sourceTree = ""; }; - EC98E2B1298D97EC00B9DF91 /* TextFieldTokenSet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TextFieldTokenSet.swift; sourceTree = ""; }; - EC98E2B3298D989100B9DF91 /* FluentTextInputError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FluentTextInputError.swift; sourceTree = ""; }; - ECA9218527A3301C00B66117 /* MSFAvatarGroup.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MSFAvatarGroup.swift; sourceTree = ""; }; - ECA9218927A33A2D00B66117 /* AvatarGroupModifiers.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AvatarGroupModifiers.swift; sourceTree = ""; }; - ECEBA8FB25EDF3380048EE24 /* SegmentedControl.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SegmentedControl.swift; sourceTree = ""; }; - ECF3C9872A67495A00CA35FC /* BottomCommandingTokenSet.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BottomCommandingTokenSet.swift; sourceTree = ""; }; - F32E6E8A2A7997F3003F9AE7 /* ListActionItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ListActionItem.swift; sourceTree = ""; }; - F3DFD3602A7B210100014C6E /* ListActionItemModifiers.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ListActionItemModifiers.swift; sourceTree = ""; }; - F3F113882A705AD500DA852A /* ListItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ListItem.swift; sourceTree = ""; }; - F3F1138C2A705B6900DA852A /* ListItemModifiers.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ListItemModifiers.swift; sourceTree = ""; }; - F5784DB9285D031800DBEAD6 /* docs */ = {isa = PBXFileReference; lastKnownFileType = folder; path = docs; sourceTree = ""; }; - FC414E1E258876FB00069E73 /* CommandBar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CommandBar.swift; sourceTree = ""; }; - FC414E242588798000069E73 /* CommandBarButtonGroupView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CommandBarButtonGroupView.swift; sourceTree = ""; }; - FC414E2A25887A4B00069E73 /* CommandBarButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CommandBarButton.swift; sourceTree = ""; }; - FC414E4E2588B65C00069E73 /* CommandBarItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CommandBarItem.swift; sourceTree = ""; }; - FD053A342224CA33009B6378 /* DatePickerControllerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DatePickerControllerTests.swift; sourceTree = ""; }; - FD0D29D52151A3D700E8655E /* CardPresenterNavigationController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CardPresenterNavigationController.swift; sourceTree = ""; }; - FD1FAE1A2272464B00A5DBA4 /* GenericDateTimePicker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GenericDateTimePicker.swift; sourceTree = ""; }; - FD256C5A2183B90B00EC9588 /* DatePickerSelectionManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DatePickerSelectionManager.swift; sourceTree = ""; }; - FD41C86E22DD13230086F899 /* ContentScrollViewTraits.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ContentScrollViewTraits.swift; sourceTree = ""; }; - FD41C87022DD13230086F899 /* ShyHeaderController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ShyHeaderController.swift; sourceTree = ""; }; - FD41C87122DD13230086F899 /* ShyHeaderView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ShyHeaderView.swift; sourceTree = ""; }; - FD41C87A22DD13230086F899 /* AvatarTitleView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AvatarTitleView.swift; sourceTree = ""; }; - FD41C87B22DD13230086F899 /* NavigationBar.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NavigationBar.swift; sourceTree = ""; usesTabs = 0; }; - FD41C87E22DD13230086F899 /* SearchBar.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SearchBar.swift; sourceTree = ""; }; - FD41C87F22DD13230086F899 /* NavigationController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NavigationController.swift; sourceTree = ""; }; - FD41C88022DD13230086F899 /* NavigationAnimator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NavigationAnimator.swift; sourceTree = ""; }; - FD41C8B122DD3BB70086F899 /* UIScrollView+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIScrollView+Extensions.swift"; sourceTree = ""; }; - FD41C8B422DD3EA20086F899 /* NSLayoutConstraint+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSLayoutConstraint+Extensions.swift"; sourceTree = ""; }; - FD41C8BD22DD47120086F899 /* UINavigationItem+Navigation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UINavigationItem+Navigation.swift"; sourceTree = ""; }; - FD4F2A1A2148937100C437D6 /* PageCardPresenterController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PageCardPresenterController.swift; sourceTree = ""; }; - FD4F2A1F214AE20400C437D6 /* DatePickerController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DatePickerController.swift; sourceTree = ""; }; - FD599D0121348439008845EE /* CalendarView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CalendarView.swift; sourceTree = ""; }; - FD599D052134A682008845EE /* AccessibleViewDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AccessibleViewDelegate.swift; sourceTree = ""; }; - FD599D072134AB0E008845EE /* CalendarViewWeekdayHeadingView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CalendarViewWeekdayHeadingView.swift; sourceTree = ""; }; - FD599D092134AB15008845EE /* CalendarViewLayout.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CalendarViewLayout.swift; sourceTree = ""; }; - FD599D0B2134AB1E008845EE /* CalendarViewDataSource.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CalendarViewDataSource.swift; sourceTree = ""; }; - FD5ADBF32190CDC80005A9AF /* DateTimePickerController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DateTimePickerController.swift; sourceTree = ""; }; - FD5BBE3A214B2F44008964B4 /* Date+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Date+Extensions.swift"; sourceTree = ""; }; - FD5BBE40214C6AF3008964B4 /* TwoLineTitleView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TwoLineTitleView.swift; sourceTree = ""; }; - FD5BBE42214C73CE008964B4 /* EasyTapButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EasyTapButton.swift; sourceTree = ""; }; - FD7254E82147059D002F4069 /* Calendar+Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Calendar+Extensions.swift"; sourceTree = ""; }; - FD777528219E3F6C00033D58 /* DayOfMonth.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DayOfMonth.swift; sourceTree = ""; }; - FD77752A219E455A00033D58 /* AccessibilityContainerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccessibilityContainerView.swift; sourceTree = ""; }; - FD77752C219E62E100033D58 /* DateTimePickerViewLayout.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DateTimePickerViewLayout.swift; sourceTree = ""; }; - FD77752F21A490BA00033D58 /* DateTimePicker.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DateTimePicker.swift; sourceTree = ""; }; - FD7DF05B21FA7F5000857267 /* Tooltip.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Tooltip.swift; sourceTree = ""; }; - FD7DF05D21FA7FC100857267 /* TooltipView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TooltipView.swift; sourceTree = ""; }; - FD7DF05F21FA83C900857267 /* TooltipViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TooltipViewController.swift; sourceTree = ""; }; - FD8D26422253FF330078E1D3 /* ar */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ar; path = ar.lproj/Localizable.strings; sourceTree = ""; }; - FD8D26432253FF330078E1D3 /* ar */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = ar; path = ar.lproj/Localizable.stringsdict; sourceTree = ""; }; - FD8D26442253FF3E0078E1D3 /* ca */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ca; path = ca.lproj/Localizable.strings; sourceTree = ""; }; - FD8D26452253FF3F0078E1D3 /* ca */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = ca; path = ca.lproj/Localizable.stringsdict; sourceTree = ""; }; - FD8D26462253FF470078E1D3 /* cs */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = cs; path = cs.lproj/Localizable.strings; sourceTree = ""; }; - FD8D26472253FF470078E1D3 /* cs */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = cs; path = cs.lproj/Localizable.stringsdict; sourceTree = ""; }; - FD8D26482253FF4F0078E1D3 /* da */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = da; path = da.lproj/Localizable.strings; sourceTree = ""; }; - FD8D26492253FF500078E1D3 /* da */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = da; path = da.lproj/Localizable.stringsdict; sourceTree = ""; }; - FD8D264A2254013E0078E1D3 /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/Localizable.strings; sourceTree = ""; }; - FD8D264B2254013E0078E1D3 /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = de; path = de.lproj/Localizable.stringsdict; sourceTree = ""; }; - FD8D264C225401660078E1D3 /* el */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = el; path = el.lproj/Localizable.strings; sourceTree = ""; }; - FD8D264D225401660078E1D3 /* el */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = el; path = el.lproj/Localizable.stringsdict; sourceTree = ""; }; - FD8D264E225401880078E1D3 /* en-GB */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "en-GB"; path = "en-GB.lproj/Localizable.strings"; sourceTree = ""; }; - FD8D264F225401880078E1D3 /* en-GB */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = "en-GB"; path = "en-GB.lproj/Localizable.stringsdict"; sourceTree = ""; }; - FD8D2650225401A10078E1D3 /* es-MX */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "es-MX"; path = "es-MX.lproj/Localizable.strings"; sourceTree = ""; }; - FD8D2651225401A10078E1D3 /* es-MX */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = "es-MX"; path = "es-MX.lproj/Localizable.stringsdict"; sourceTree = ""; }; - FD8D2652225401AA0078E1D3 /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/Localizable.strings; sourceTree = ""; }; - FD8D2653225401AA0078E1D3 /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = es; path = es.lproj/Localizable.stringsdict; sourceTree = ""; }; - FD8D2654225401B90078E1D3 /* fi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fi; path = fi.lproj/Localizable.strings; sourceTree = ""; }; - FD8D2655225401B90078E1D3 /* fi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = fi; path = fi.lproj/Localizable.stringsdict; sourceTree = ""; }; - FD8D2656225401C10078E1D3 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fr; path = fr.lproj/Localizable.strings; sourceTree = ""; }; - FD8D2657225401C20078E1D3 /* fr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = fr; path = fr.lproj/Localizable.stringsdict; sourceTree = ""; }; - FD8D2658225401CD0078E1D3 /* he */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = he; path = he.lproj/Localizable.strings; sourceTree = ""; }; - FD8D2659225401CD0078E1D3 /* he */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = he; path = he.lproj/Localizable.stringsdict; sourceTree = ""; }; - FD8D265A225401D90078E1D3 /* hi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hi; path = hi.lproj/Localizable.strings; sourceTree = ""; }; - FD8D265B225401D90078E1D3 /* hi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = hi; path = hi.lproj/Localizable.stringsdict; sourceTree = ""; }; - FD8D265C225401E50078E1D3 /* hr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hr; path = hr.lproj/Localizable.strings; sourceTree = ""; }; - FD8D265D225401E50078E1D3 /* hr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = hr; path = hr.lproj/Localizable.stringsdict; sourceTree = ""; }; - FD8D265E225401F20078E1D3 /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = hu; path = hu.lproj/Localizable.strings; sourceTree = ""; }; - FD8D265F225401F30078E1D3 /* hu */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = hu; path = hu.lproj/Localizable.stringsdict; sourceTree = ""; }; - FD8D2660225401FA0078E1D3 /* id */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = id; path = id.lproj/Localizable.strings; sourceTree = ""; }; - FD8D2661225401FB0078E1D3 /* id */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = id; path = id.lproj/Localizable.stringsdict; sourceTree = ""; }; - FD8D2662225402020078E1D3 /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = it; path = it.lproj/Localizable.strings; sourceTree = ""; }; - FD8D2663225402030078E1D3 /* it */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = it; path = it.lproj/Localizable.stringsdict; sourceTree = ""; }; - FD8D26642254020E0078E1D3 /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ja; path = ja.lproj/Localizable.strings; sourceTree = ""; }; - FD8D26652254020E0078E1D3 /* ja */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = ja; path = ja.lproj/Localizable.stringsdict; sourceTree = ""; }; - FD8D2666225402160078E1D3 /* ko */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ko; path = ko.lproj/Localizable.strings; sourceTree = ""; }; - FD8D2667225402160078E1D3 /* ko */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = ko; path = ko.lproj/Localizable.stringsdict; sourceTree = ""; }; - FD8D26682254021D0078E1D3 /* ms */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ms; path = ms.lproj/Localizable.strings; sourceTree = ""; }; - FD8D26692254021E0078E1D3 /* ms */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = ms; path = ms.lproj/Localizable.stringsdict; sourceTree = ""; }; - FD8D266A2254022E0078E1D3 /* nb-NO */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "nb-NO"; path = "nb-NO.lproj/Localizable.strings"; sourceTree = ""; }; - FD8D266B2254022E0078E1D3 /* nb-NO */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = "nb-NO"; path = "nb-NO.lproj/Localizable.stringsdict"; sourceTree = ""; }; - FD8D266C225402DC0078E1D3 /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/Localizable.strings; sourceTree = ""; }; - FD8D266D225402DC0078E1D3 /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = nl; path = nl.lproj/Localizable.stringsdict; sourceTree = ""; }; - FD8D266E225402E60078E1D3 /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = pl; path = pl.lproj/Localizable.strings; sourceTree = ""; }; - FD8D266F225402E60078E1D3 /* pl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = pl; path = pl.lproj/Localizable.stringsdict; sourceTree = ""; }; - FD8D2670225402F00078E1D3 /* pt-BR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-BR"; path = "pt-BR.lproj/Localizable.strings"; sourceTree = ""; }; - FD8D2671225402F10078E1D3 /* pt-BR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = "pt-BR"; path = "pt-BR.lproj/Localizable.stringsdict"; sourceTree = ""; }; - FD8D2672225402F60078E1D3 /* pt-PT */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-PT"; path = "pt-PT.lproj/Localizable.strings"; sourceTree = ""; }; - FD8D2673225402F60078E1D3 /* pt-PT */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = "pt-PT"; path = "pt-PT.lproj/Localizable.stringsdict"; sourceTree = ""; }; - FD8D2674225403000078E1D3 /* ro */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ro; path = ro.lproj/Localizable.strings; sourceTree = ""; }; - FD8D2675225403000078E1D3 /* ro */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = ro; path = ro.lproj/Localizable.stringsdict; sourceTree = ""; }; - FD8D2676225403070078E1D3 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ru; path = ru.lproj/Localizable.strings; sourceTree = ""; }; - FD8D2677225403070078E1D3 /* ru */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = ru; path = ru.lproj/Localizable.stringsdict; sourceTree = ""; }; - FD8D26782254030E0078E1D3 /* sk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sk; path = sk.lproj/Localizable.strings; sourceTree = ""; }; - FD8D26792254030E0078E1D3 /* sk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = sk; path = sk.lproj/Localizable.stringsdict; sourceTree = ""; }; - FD8D267A225403160078E1D3 /* sv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sv; path = sv.lproj/Localizable.strings; sourceTree = ""; }; - FD8D267B225403160078E1D3 /* sv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = sv; path = sv.lproj/Localizable.stringsdict; sourceTree = ""; }; - FD8D267C2254031B0078E1D3 /* th */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = th; path = th.lproj/Localizable.strings; sourceTree = ""; }; - FD8D267D2254031B0078E1D3 /* th */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = th; path = th.lproj/Localizable.stringsdict; sourceTree = ""; }; - FD8D267E225403210078E1D3 /* tr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = tr; path = tr.lproj/Localizable.strings; sourceTree = ""; }; - FD8D267F225403220078E1D3 /* tr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = tr; path = tr.lproj/Localizable.stringsdict; sourceTree = ""; }; - FD8D2680225403290078E1D3 /* uk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = uk; path = uk.lproj/Localizable.strings; sourceTree = ""; }; - FD8D26812254032A0078E1D3 /* uk */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = uk; path = uk.lproj/Localizable.stringsdict; sourceTree = ""; }; - FD8D2682225403300078E1D3 /* vi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = vi; path = vi.lproj/Localizable.strings; sourceTree = ""; }; - FD8D2683225403300078E1D3 /* vi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = vi; path = vi.lproj/Localizable.stringsdict; sourceTree = ""; }; - FD8D2684225403360078E1D3 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/Localizable.strings"; sourceTree = ""; }; - FD8D2685225403360078E1D3 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = "zh-Hans"; path = "zh-Hans.lproj/Localizable.stringsdict"; sourceTree = ""; }; - FD8D26862254033B0078E1D3 /* zh-Hant */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hant"; path = "zh-Hant.lproj/Localizable.strings"; sourceTree = ""; }; - FD8D26872254033B0078E1D3 /* zh-Hant */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = "zh-Hant"; path = "zh-Hant.lproj/Localizable.stringsdict"; sourceTree = ""; }; - FD9758062191118D00B67319 /* DateTimePickerView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DateTimePickerView.swift; sourceTree = ""; }; - FD9758072191118E00B67319 /* DateTimePickerViewDataSource.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DateTimePickerViewDataSource.swift; sourceTree = ""; }; - FD9758082191118E00B67319 /* DateTimePickerViewComponentTableView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DateTimePickerViewComponentTableView.swift; sourceTree = ""; }; - FD9758092191118E00B67319 /* DateTimePickerViewComponent.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DateTimePickerViewComponent.swift; sourceTree = ""; }; - FD97580A2191118E00B67319 /* DateTimePickerViewComponentCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DateTimePickerViewComponentCell.swift; sourceTree = ""; }; - FD9A5C862179464F00D224D9 /* DateComponents+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "DateComponents+Extensions.swift"; sourceTree = ""; }; - FD9DA7B4232C33A80013E41B /* UIViewController+Navigation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIViewController+Navigation.swift"; sourceTree = ""; }; - FDA1AF8B21484625001AE720 /* BlurringView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BlurringView.swift; sourceTree = ""; }; - FDA1AF90214871B5001AE720 /* CardTransitionAnimator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CardTransitionAnimator.swift; sourceTree = ""; }; - FDA1AF9221487225001AE720 /* CardPresentationController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CardPresentationController.swift; sourceTree = ""; }; - FDD454ED21405B390006E84E /* DotView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DotView.swift; sourceTree = ""; }; - FDF41ED82141A02200EC527C /* CalendarConfiguration.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CalendarConfiguration.swift; sourceTree = ""; }; - FDFB8AEA21361C950046850A /* CalendarViewMonthBannerView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CalendarViewMonthBannerView.swift; sourceTree = ""; }; - FDFB8AEC21361C9D0046850A /* CalendarViewDayTodayCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CalendarViewDayTodayCell.swift; sourceTree = ""; }; - FDFB8AED21361C9D0046850A /* CalendarViewDayMonthCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CalendarViewDayMonthCell.swift; sourceTree = ""; }; - FDFB8AEE21361C9D0046850A /* CalendarViewDayCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CalendarViewDayCell.swift; sourceTree = ""; }; - FDFB8AEF21361C9D0046850A /* CalendarViewDayMonthYearCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CalendarViewDayMonthYearCell.swift; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - A5CEC15720D980B30016922A /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 923DF2E72712B6AB00637646 /* libFluentUI.a in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 1168630122E131A20088B302 /* Tab Bar */ = { - isa = PBXGroup; - children = ( - 7D0931C224AAAC8C0072458A /* SideTabBar.swift */, - 6F050B6829D3D16D0070D3D5 /* SideTabBarTokenSet.swift */, - 118D9847230BBA2300BC0B72 /* TabBarItem.swift */, - 6F050B6A29D3D1900070D3D5 /* TabBarItemTokenSet.swift */, - 1168630222E131CF0088B302 /* TabBarItemView.swift */, - 6F050B6C29D3D1A90070D3D5 /* TabBarTokenSet.swift */, - 1168630322E131CF0088B302 /* TabBarView.swift */, - ); - path = "Tab Bar"; - sourceTree = ""; - }; - 3AABE97B29DF4CAC00406C6E /* MultilineCommandBar */ = { - isa = PBXGroup; - children = ( - 3AFB0FD529C1365600FEC1A9 /* MultilineCommandBar.swift */, - ); - path = MultilineCommandBar; - sourceTree = ""; - }; - 497DC2D62418585D008D86F8 /* Pill Button Bar */ = { - isa = PBXGroup; - children = ( - 497DC2D824185885008D86F8 /* PillButton.swift */, - 497DC2D724185885008D86F8 /* PillButtonBar.swift */, - 6F050B6E29D3EA820070D3D5 /* PillButtonTokenSet.swift */, - ); - path = "Pill Button Bar"; - sourceTree = ""; - }; - 4BA9B8B5279F2940007536F5 /* Notification */ = { - isa = PBXGroup; - children = ( - 43488C44270FAD0200124C71 /* FluentNotification.swift */, - 4BBD651E2755FD9500A8B09E /* MSFNotification.swift */, - 4B53505E27F63E3F0033B47F /* NotificationModifiers.swift */, - 4BF01D9927B37CF8005B32F2 /* NotificationTokenSet.swift */, - ); - path = Notification; - sourceTree = ""; - }; - 5306074E26A1E6A4002D49CF /* AvatarGroup */ = { - isa = PBXGroup; - children = ( - 5306075126A1E6A4002D49CF /* AvatarGroup.swift */, - ECA9218927A33A2D00B66117 /* AvatarGroupModifiers.swift */, - ECA9218527A3301C00B66117 /* MSFAvatarGroup.swift */, - 5306074F26A1E6A4002D49CF /* AvatarGroupTokenSet.swift */, - ); - path = AvatarGroup; - sourceTree = ""; - }; - 5314DFE625F000740099271A /* Separator */ = { - isa = PBXGroup; - children = ( - A5DCA76321224026005F4CB7 /* Separator.swift */, - 0A84A6EF29EDC489005DBC3D /* SeparatorTokenSet.swift */, - ); - path = Separator; - sourceTree = ""; - }; - 5314DFEB25F002240099271A /* ActivityIndicator */ = { - isa = PBXGroup; - children = ( - 532FE3D026EA6D74007539C0 /* ActivityIndicator.swift */, - 532FE3CF26EA6D73007539C0 /* ActivityIndicatorModifiers.swift */, - 532FE3CE26EA6D73007539C0 /* ActivityIndicatorTokenSet.swift */, - 53E2EE0427860D010086D30D /* MSFActivityIndicator.swift */, - ); - path = ActivityIndicator; - sourceTree = ""; - }; - 5314DFEC25F0029C0099271A /* Button */ = { - isa = PBXGroup; - children = ( - A5CEC23020E451D00016922A /* Button.swift */, - EC65F78F292EDCEF002A1A23 /* ButtonTokenSet.swift */, - 92279B322B97C7DC00994D88 /* FluentButtonStyle.swift */, - ); - path = Button; - sourceTree = ""; - }; - 5314DFEF25F003C60099271A /* DotView */ = { - isa = PBXGroup; - children = ( - FDD454ED21405B390006E84E /* DotView.swift */, - ); - path = DotView; - sourceTree = ""; - }; - 5314DFF025F0042E0099271A /* Label */ = { - isa = PBXGroup; - children = ( - A589F853211BA03200471C23 /* Label.swift */, - 6EB4B25D270ED6450005B808 /* BadgeLabel.swift */, - 4B4A2F2029A7E83100570CD4 /* LabelTokenSet.swift */, - 6F2F218E2A12BFD900C50EAB /* BadgeLabelTokenSet.swift */, - ); - path = Label; - sourceTree = ""; - }; - 5314DFF325F006060099271A /* TouchForwardingView */ = { - isa = PBXGroup; - children = ( - B483323621DEB5A00022B4CC /* TouchForwardingView.swift */, - ); - path = TouchForwardingView; - sourceTree = ""; - }; - 5314DFF425F0069C0099271A /* IndeterminateProgressBar */ = { - isa = PBXGroup; - children = ( - 5328D96F26FBA3D700F3723B /* IndeterminateProgressBar.swift */, - 5328D96D26FBA3D600F3723B /* IndeterminateProgressBarModifiers.swift */, - 5328D96C26FBA3D600F3723B /* IndeterminateProgressBarTokenSet.swift */, - 53E2EE06278799B30086D30D /* MSFIndeterminateProgressBar.swift */, - ); - path = IndeterminateProgressBar; - sourceTree = ""; - }; - 5314DFF525F007020099271A /* EasyTapButton */ = { - isa = PBXGroup; - children = ( - FD5BBE42214C73CE008964B4 /* EasyTapButton.swift */, - ); - path = EasyTapButton; - sourceTree = ""; - }; - 5314DFF625F0079B0099271A /* BarButtonItems */ = { - isa = PBXGroup; - children = ( - A52648DB2316F4F9003342A0 /* BarButtonItems.swift */, - ); - path = BarButtonItems; - sourceTree = ""; - }; - 5314DFF725F007FF0099271A /* ResizingHandleView */ = { - isa = PBXGroup; - children = ( - A5237ACA21DED7030040BF27 /* ResizingHandleView.swift */, - 6F3CB7F129D3A5DE00284353 /* ResizingHandleTokenSet.swift */, - ); - path = ResizingHandleView; - sourceTree = ""; - }; - 5314DFF825F008870099271A /* TwoLineTitleView */ = { - isa = PBXGroup; - children = ( - FD5BBE40214C6AF3008964B4 /* TwoLineTitleView.swift */, - 66963D0929CA7F89006F5FA9 /* TwoLineTitleViewTokenSet.swift */, - ); - path = TwoLineTitleView; - sourceTree = ""; - }; - 5314DFF925F008F10099271A /* Obscurable */ = { - isa = PBXGroup; - children = ( - FDA1AF8B21484625001AE720 /* BlurringView.swift */, - A5B87B03211E22B70038C37C /* DimmingView.swift */, - 53BCB0CD253A4E8C00620960 /* Obscurable.swift */, - ); - path = Obscurable; - sourceTree = ""; - }; - 53FC90BE25672F97008A06FD /* xcode */ = { - isa = PBXGroup; - children = ( - 53FC90C02567300A008A06FD /* FluentUI_common.xcconfig */, - 53FC90F625673626008A06FD /* FluentUI_debug.xcconfig */, - 53FC90F525673626008A06FD /* FluentUI_release.xcconfig */, - 53FC90F925673627008A06FD /* FluentUILib_common.xcconfig */, - C7752C7C2790C1F40012F860 /* FluentUILib_debug.xcconfig */, - C7752C7B2790C1F40012F860 /* FluentUILib_release.xcconfig */, - 53FC90FA25673627008A06FD /* FluentUIResources.xcconfig */, - 53FC90F725673626008A06FD /* FluentUITests.xcconfig */, - ); - path = xcode; - sourceTree = ""; - }; - 6FBFD62429CBB5B9002F3C81 /* SearchBar */ = { - isa = PBXGroup; - children = ( - FD41C87E22DD13230086F899 /* SearchBar.swift */, - 6FBFD62529CBB5F1002F3C81 /* SearchBarTokenSet.swift */, - ); - path = SearchBar; - sourceTree = ""; - }; - 80B1F6F52628CDEB004DFEE5 /* Bottom Sheet */ = { - isa = PBXGroup; - children = ( - 80AECBD82629F18E005AF2F3 /* BottomSheetController.swift */, - 80AECBF1262FC34E005AF2F3 /* BottomSheetPassthroughView.swift */, - 4B2E373C2991CB53008929B4 /* BottomSheetTokenSet.swift */, - 804EDE1428C00CA400371C6B /* ContentHeightResolutionContext.swift */, - ); - path = "Bottom Sheet"; - sourceTree = ""; - }; - 80B52538264CA5BC00E3FD32 /* Bottom Commanding */ = { - isa = PBXGroup; - children = ( - 8035CAAA2633A442007B3FD1 /* BottomCommandingController.swift */, - ECF3C9872A67495A00CA35FC /* BottomCommandingTokenSet.swift */, - 8035CACA26377C14007B3FD1 /* CommandingItem.swift */, - 8035CADC2638E435007B3FD1 /* CommandingSection.swift */, - ); - path = "Bottom Commanding"; - sourceTree = ""; - }; - 922AF01926615B03005DB168 /* PersonaButton */ = { - isa = PBXGroup; - children = ( - 92B7E6A12684262900EFC15E /* MSFPersonaButton.swift */, - 92088EF72666DB2C003F571A /* PersonaButton.swift */, - 927EB2BC278627440069753D /* PersonaButtonModifiers.swift */, - 927E34C62668350800998031 /* PersonaButtonTokenSet.swift */, - ); - path = PersonaButton; - sourceTree = ""; - }; - 923DF2E62712B6AB00637646 /* Frameworks */ = { - isa = PBXGroup; - children = ( - ); - name = Frameworks; - sourceTree = ""; - }; - 925D461926FD124B00179583 /* Theme */ = { - isa = PBXGroup; - children = ( - 925D461A26FD126800179583 /* Tokens */, - 923DB9D3274CB65700D8E58A /* FluentTheme.swift */, - 9231F10229BB99090079CD94 /* FluentTheme+Tokens.swift */, - 926B4C992B8E94F6001EBA16 /* FluentTheme+visionOS.swift */, - ); - path = Theme; - sourceTree = ""; - }; - 925D461A26FD126800179583 /* Tokens */ = { - isa = PBXGroup; - children = ( - 925D461E26FD18B200179583 /* AliasTokens.swift */, - 92DEE2232723D34400E31ED0 /* ControlTokenSet.swift */, - 92E7AD4E26FE51FF00AE7FF8 /* DynamicColor.swift */, - 92016FF7299DF34A00660DB7 /* EmptyTokenSet.swift */, - 925728F8276D6B5800EE1019 /* FontInfo.swift */, - 925D461B26FD133600179583 /* GlobalTokens.swift */, - 92D5FDFA28A713990087894B /* LinearGradientInfo.swift */, - 925728F6276D6AF800EE1019 /* ShadowInfo.swift */, - 923DB9D2274CB65700D8E58A /* TokenizedControl.swift */, - 922A34DE27BB87990062721F /* TokenizedControlView.swift */, - 92EE82AC27025A94009D52B5 /* TokenSet.swift */, - ); - path = Tokens; - sourceTree = ""; - }; - 92D5597C26A0FC9700328FD3 /* Card Nudge */ = { - isa = PBXGroup; - children = ( - 92D5598026A0FD2800328FD3 /* CardNudge.swift */, - 92079C8E26B66E5100D688DA /* CardNudgeModifiers.swift */, - 920945472703DDA000B38E1A /* CardNudgeTokenSet.swift */, - 92A1E4F326A791590007ED60 /* MSFCardNudge.swift */, - ); - path = "Card Nudge"; - sourceTree = ""; - }; - 92F2C5FD267287CF0087C65B /* PersonaButtonCarousel */ = { - isa = PBXGroup; - children = ( - 9275105426815A7100F12730 /* MSFPersonaButtonCarousel.swift */, - 929DD258266ED3B600E8175E /* PersonaButtonCarousel.swift */, - 92D49053278FF4E50085C018 /* PersonaButtonCarouselModifiers.swift */, - 929DD255266ED3AC00E8175E /* PersonaButtonCarouselTokenSet.swift */, - ); - path = PersonaButtonCarousel; - sourceTree = ""; - }; - A5961F9B218A251E00E2A506 /* Popup Menu */ = { - isa = PBXGroup; - children = ( - A5961F9C218A254D00E2A506 /* PopupMenuController.swift */, - A5961F9E218A256B00E2A506 /* PopupMenuItem.swift */, - A5961FA0218A25C400E2A506 /* PopupMenuSection.swift */, - A5961FA2218A25D100E2A506 /* PopupMenuItemCell.swift */, - A5961FA4218A260500E2A506 /* PopupMenuSectionHeaderView.swift */, - 0BCEFADD2485FEC00088CEE5 /* PopupMenuProtocols.swift */, - 6F050B7029D6213E0070D3D5 /* PopupMenuItemTokenSet.swift */, - 6F050B7429D6219D0070D3D5 /* PopupMenuTokenSet.swift */, - ); - path = "Popup Menu"; - sourceTree = ""; - }; - A5B87AED211BCA4A0038C37C /* Extensions */ = { - isa = PBXGroup; - children = ( - FD41C8B422DD3EA20086F899 /* NSLayoutConstraint+Extensions.swift */, - A559BB7D212B6D100055E107 /* String+Extension.swift */, - A56CE7B522E68A7800AA77EE /* UIColor+Extensions.swift */, - A5961FA6218A2E4500E2A506 /* UIImage+Extensions.swift */, - FD41C8B122DD3BB70086F899 /* UIScrollView+Extensions.swift */, - A5B87B05211E23650038C37C /* UIView+Extensions.swift */, - 4BF01D9F27B3A861005B32F2 /* UIApplication+Extensions.swift */, - ); - path = Extensions; - sourceTree = ""; - }; - A5B87AF2211E13D00038C37C /* Drawer */ = { - isa = PBXGroup; - children = ( - A54D97D9217A5FC10072681A /* CALayer+Extensions.swift */, - A5B87AF3211E16360038C37C /* DrawerController.swift */, - A5B87AF5211E16360038C37C /* DrawerPresentationController.swift */, - A5237ACC21ED6CA70040BF27 /* DrawerShadowView.swift */, - A5B87AF4211E16360038C37C /* DrawerTransitionAnimator.swift */, - 6F3CB7EF29D3A2B700284353 /* DrawerTokenSet.swift */, - ); - path = Drawer; - sourceTree = ""; - }; - A5CEC14720D980B20016922A = { - isa = PBXGroup; - children = ( - F5784DB9285D031800DBEAD6 /* docs */, - A257F82B251D98F3002CAA6E /* FluentUI-ios.xcassets */, - A5CEC15320D980B20016922A /* FluentUI */, - A5DA88FD226FAA01000A8EA8 /* FluentUI.Resources */, - A5CEC15E20D980B30016922A /* FluentUI.Tests */, - 53FC90BE25672F97008A06FD /* xcode */, - A5CEC15220D980B20016922A /* Products */, - 923DF2E62712B6AB00637646 /* Frameworks */, - ); - sourceTree = ""; - }; - A5CEC15220D980B20016922A /* Products */ = { - isa = PBXGroup; - children = ( - A5CEC15A20D980B30016922A /* FluentUITests.xctest */, - A5DA88FC226FAA01000A8EA8 /* FluentUIResources-ios.bundle */, - 8FD01166228A820600D25925 /* libFluentUI.a */, - ); - name = Products; - sourceTree = ""; - }; - A5CEC15320D980B20016922A /* FluentUI */ = { - isa = PBXGroup; - children = ( - 5314DFEB25F002240099271A /* ActivityIndicator */, - C77A04F325F04CFB001B3EB6 /* Avatar */, - 5306074E26A1E6A4002D49CF /* AvatarGroup */, - B4F118EA21C8270F00855942 /* Badge Field */, - 5314DFF625F0079B0099271A /* BarButtonItems */, - 80B52538264CA5BC00E3FD32 /* Bottom Commanding */, - 80B1F6F52628CDEB004DFEE5 /* Bottom Sheet */, - 5314DFEC25F0029C0099271A /* Button */, - FDFB8AE921361C860046850A /* Calendar */, - CCC18C2A2501B1A900BE830E /* Card */, - 92D5597C26A0FC9700328FD3 /* Card Nudge */, - FC414E1D258876D400069E73 /* Command Bar */, - A5CEC16B20D98EBF0016922A /* Core */, - FD599D0021347FA0008845EE /* Date Time Pickers */, - 5314DFEF25F003C60099271A /* DotView */, - A5B87AF2211E13D00038C37C /* Drawer */, - 5314DFF525F007020099271A /* EasyTapButton */, - A5B87AED211BCA4A0038C37C /* Extensions */, - B483323121CC71700022B4CC /* HUD */, - 5314DFF425F0069C0099271A /* IndeterminateProgressBar */, - 5314DFF025F0042E0099271A /* Label */, - F3F113872A705AC300DA852A /* List */, - 3AABE97B29DF4CAC00406C6E /* MultilineCommandBar */, - FD41C86D22DD12A20086F899 /* Navigation */, - 4BA9B8B5279F2940007536F5 /* Notification */, - 5314DFF925F008F10099271A /* Obscurable */, - C77A04EB25F0469C001B3EB6 /* Other Cells */, - B426613C214731AC00E25423 /* People Picker */, - 922AF01926615B03005DB168 /* PersonaButton */, - 92F2C5FD267287CF0087C65B /* PersonaButtonCarousel */, - 497DC2D62418585D008D86F8 /* Pill Button Bar */, - A5961F9B218A251E00E2A506 /* Popup Menu */, - FD7254EE2147382D002F4069 /* Presenters */, - 5314DFF725F007FF0099271A /* ResizingHandleView */, - ECEBA8F625EDEFF70048EE24 /* SegmentedControl */, - 5314DFE625F000740099271A /* Separator */, - C0A0D75D233AEA9900F432FD /* Shimmer */, - 1168630122E131A20088B302 /* Tab Bar */, - B444D6B421825B510002B4D4 /* Table View */, - EC98E2AB2980C0C000B9DF91 /* TextField */, - FD7DF05A21FA7F3200857267 /* Tooltip */, - 5314DFF325F006060099271A /* TouchForwardingView */, - 5314DFF825F008870099271A /* TwoLineTitleView */, - C0938E42235E8EAF00256251 /* Utilities */, - A5CEC17020D996120016922A /* Resources */, - A5CEC25720E6A64E0016922A /* Configuration */, - ); - path = FluentUI; - sourceTree = ""; - }; - A5CEC15E20D980B30016922A /* FluentUI.Tests */ = { - isa = PBXGroup; - children = ( - 929215B82B6C75E500D4EA9F /* AvatarTests.swift */, - 8FA3CB5A246B19EA0049E431 /* ColorTests.swift */, - FD053A342224CA33009B6378 /* DatePickerControllerTests.swift */, - A5CEC15F20D980B30016922A /* FluentUITests.swift */, - 924268A1277AD9F700C5A452 /* FontTests.swift */, - A5CEC16120D980B30016922A /* Info.plist */, - ); - path = FluentUI.Tests; - sourceTree = ""; - }; - A5CEC16B20D98EBF0016922A /* Core */ = { - isa = PBXGroup; - children = ( - 925D461926FD124B00179583 /* Theme */, - D6296DAD295B7C9F002E8EB6 /* ColorProviding.swift */, - 926FEEA92B45A8B4002C61D0 /* Compatibility.swift */, - 923DB9D6274CB66D00D8E58A /* ControlHostingView.swift */, - 535559E22711411E0094A871 /* FluentThemedHostingController.swift */, - A559BB82212B7D870055E107 /* FluentUIFramework.swift */, - EC04E65729C27359005F8BA0 /* FocusRingView.swift */, - 530D9C5227EE7B2C00BDCBBF /* SwiftUI+ViewAnimation.swift */, - 5373D56F2694D66F0032A3B4 /* SwiftUI+ViewModifiers.swift */, - 530D9C5027EE388200BDCBBF /* SwiftUI+ViewPresentation.swift */, - 5373D56D2694D66F0032A3B4 /* UIKit+SwiftUI_interoperability.swift */, - 566C664828CB97210032314C /* module.modulemap */, - ); - path = Core; - sourceTree = ""; - }; - A5CEC17020D996120016922A /* Resources */ = { - isa = PBXGroup; - children = ( - A5CEC17320D997CF0016922A /* Localization */, - ); - path = Resources; - sourceTree = ""; - }; - A5CEC17320D997CF0016922A /* Localization */ = { - isa = PBXGroup; - children = ( - A559BB81212B6FA40055E107 /* Localizable.strings */, - A5DF1EAD2213B26900CC741A /* Localizable.stringsdict */, - ); - path = Localization; - sourceTree = ""; - }; - A5CEC25720E6A64E0016922A /* Configuration */ = { - isa = PBXGroup; - children = ( - A5CEC15420D980B20016922A /* FluentUI.h */, - ); - name = Configuration; - sourceTree = ""; - }; - A5DA88FD226FAA01000A8EA8 /* FluentUI.Resources */ = { - isa = PBXGroup; - children = ( - A5DA88FE226FAA01000A8EA8 /* Info.plist */, - ); - path = FluentUI.Resources; - sourceTree = ""; - }; - B426613C214731AC00E25423 /* People Picker */ = { - isa = PBXGroup; - children = ( - B47B58B722F8E5840078DE38 /* PeoplePicker.swift */, - 3A9FC0F62A705C090060A6BE /* PeoplePickerTokenSet.swift */, - B4BA27872319DC0D0001563C /* PersonaBadgeViewDataSource.swift */, - B46D3F922151D95F0029772C /* PersonaCell.swift */, - B46D3F9C215985AC0029772C /* PersonaListView.swift */, - ); - path = "People Picker"; - sourceTree = ""; - }; - B444D6B421825B510002B4D4 /* Table View */ = { - isa = PBXGroup; - children = ( - B498141321E424920077B48D /* TableViewCell.swift */, - 2A9745DD281733D700E1A1FD /* TableViewCellTokenSet.swift */, - B4EF66502294A664007FEAB0 /* TableViewHeaderFooterView.swift */, - 0AE3041C29F721B2003CDDD9 /* TableViewHeaderFooterViewTokenSet.swift */, - ); - path = "Table View"; - sourceTree = ""; - }; - B483323121CC71700022B4CC /* HUD */ = { - isa = PBXGroup; - children = ( - 5336B17327F77EB700B01E0D /* HeadsUpDisplay.swift */, - 5336B17F27FB6D9B00B01E0D /* HeadsUpDisplayTokenSet.swift */, - 5336B17227F77EB700B01E0D /* HUD.swift */, - 5336B17027F77EB700B01E0D /* HUDModifiers.swift */, - 532299FF27FE108400C016A2 /* MSFHeadsUpDisplay.swift */, - 5336B17427F77EB700B01E0D /* HUD.resources.xcfilelist */, - ); - path = HUD; - sourceTree = ""; - }; - B4F118EA21C8270F00855942 /* Badge Field */ = { - isa = PBXGroup; - children = ( - B45EB78F219E310F008646A2 /* BadgeField.swift */, - 3A9FC0F42A6AFAD40060A6BE /* BadgeFieldTokenSet.swift */, - B4A8BBCC21BF6D6900D5E3ED /* BadgeStringExtractor.swift */, - B444D6B52183A9740002B4D4 /* BadgeView.swift */, - 6FC3705D29E7707F0096B239 /* BadgeViewTokenSet.swift */, - ); - path = "Badge Field"; - sourceTree = ""; - }; - C0938E42235E8EAF00256251 /* Utilities */ = { - isa = PBXGroup; - children = ( - C0938E43235E8ED500256251 /* AnimationSynchronizer.swift */, - ); - path = Utilities; - sourceTree = ""; - }; - C0A0D75D233AEA9900F432FD /* Shimmer */ = { - isa = PBXGroup; - children = ( - C0EAAEAC2347E1DF00C7244E /* ShimmerView.swift */, - C0A0D76B233AEF6C00F432FD /* ShimmerLinesView.swift */, - 4BDBE18828EC9E6F00314696 /* ShimmerTokenSet.swift */, - ); - path = Shimmer; - sourceTree = ""; - }; - C77A04EB25F0469C001B3EB6 /* Other Cells */ = { - isa = PBXGroup; - children = ( - B4E782C02176AD5E00A7DFCE /* ActionsCell.swift */, - B4E782C221793AB200A7DFCE /* ActivityIndicatorCell.swift */, - B441478C228CDA130040E88E /* BooleanCell.swift */, - B4E782C62179509A00A7DFCE /* CenteredLabelCell.swift */, - ); - path = "Other Cells"; - sourceTree = ""; - }; - C77A04F325F04CFB001B3EB6 /* Avatar */ = { - isa = PBXGroup; - children = ( - 5373D5612694D65C0032A3B4 /* Avatar.swift */, - 5303259926B31B6B00611D05 /* AvatarModifiers.swift */, - 5373D5602694D65C0032A3B4 /* AvatarTokenSet.swift */, - EC5982D727BF348700FD048D /* MSFAvatar.swift */, - EC5982D927C703ED00FD048D /* ShapeCutout.swift */, - 5373D5632694D65C0032A3B4 /* MSFAvatarPresence.swift */, - B4EF53C2215AF1AB00573E8F /* Persona.swift */, - ); - path = Avatar; - sourceTree = ""; - }; - CCC18C2A2501B1A900BE830E /* Card */ = { - isa = PBXGroup; - children = ( - CCC18C2B2501B22F00BE830E /* CardView.swift */, - ); - path = Card; - sourceTree = ""; - }; - EC98E2AB2980C0C000B9DF91 /* TextField */ = { - isa = PBXGroup; - children = ( - EC98E2AC2980C15C00B9DF91 /* FluentTextField.swift */, - EC98E2AF298D978C00B9DF91 /* FluentTextFieldInternal.swift */, - EC98E2B3298D989100B9DF91 /* FluentTextInputError.swift */, - EC98E2B1298D97EC00B9DF91 /* TextFieldTokenSet.swift */, - ); - path = TextField; - sourceTree = ""; - }; - ECEBA8F625EDEFF70048EE24 /* SegmentedControl */ = { - isa = PBXGroup; - children = ( - ECEBA8FB25EDF3380048EE24 /* SegmentedControl.swift */, - C708B04B260A8696007190FA /* SegmentItem.swift */, - C708B055260A86FA007190FA /* SegmentPillButton.swift */, - EC1C31722923022E00CF052C /* SegmentedControlTokenSet.swift */, - ); - path = SegmentedControl; - sourceTree = ""; - }; - F3F113872A705AC300DA852A /* List */ = { - isa = PBXGroup; - children = ( - F32E6E8A2A7997F3003F9AE7 /* ListActionItem.swift */, - F3DFD3602A7B210100014C6E /* ListActionItemModifiers.swift */, - F3F113882A705AD500DA852A /* ListItem.swift */, - F3F1138C2A705B6900DA852A /* ListItemModifiers.swift */, - ); - path = List; - sourceTree = ""; - }; - FC414E1D258876D400069E73 /* Command Bar */ = { - isa = PBXGroup; - children = ( - FC414E1E258876FB00069E73 /* CommandBar.swift */, - FC414E4E2588B65C00069E73 /* CommandBarItem.swift */, - FC414E2A25887A4B00069E73 /* CommandBarButton.swift */, - FC414E242588798000069E73 /* CommandBarButtonGroupView.swift */, - 94A7EC192836DCB100BFFBAE /* CommandBarCommandGroupsView.swift */, - 0A8E61FA291DC11F009E412D /* CommandBarTokenSet.swift */, - ); - path = "Command Bar"; - sourceTree = ""; - }; - FD256C5C2183D77900EC9588 /* Views */ = { - isa = PBXGroup; - children = ( - FDFB8AEE21361C9D0046850A /* CalendarViewDayCell.swift */, - FDFB8AED21361C9D0046850A /* CalendarViewDayMonthCell.swift */, - FDFB8AEF21361C9D0046850A /* CalendarViewDayMonthYearCell.swift */, - FDFB8AEC21361C9D0046850A /* CalendarViewDayTodayCell.swift */, - FDFB8AEA21361C950046850A /* CalendarViewMonthBannerView.swift */, - FD599D072134AB0E008845EE /* CalendarViewWeekdayHeadingView.swift */, - ); - path = Views; - sourceTree = ""; - }; - FD41C86D22DD12A20086F899 /* Navigation */ = { - isa = PBXGroup; - children = ( - FD41C87F22DD13230086F899 /* NavigationController.swift */, - FD41C87B22DD13230086F899 /* NavigationBar.swift */, - 66963D0F29CE244D006F5FA9 /* NavigationBarTokenSet.swift */, - 6ED4C11C2696AE4000C30BD6 /* BadgeLabelButton.swift */, - 667E54012A12B6F800728F93 /* TwoLineTitleView+Navigation.swift */, - FD41C8BD22DD47120086F899 /* UINavigationItem+Navigation.swift */, - FD9DA7B4232C33A80013E41B /* UIViewController+Navigation.swift */, - 6ED4C11A2695A6E800C30BD6 /* UIBarButtonItem+BadgeValue.swift */, - 6FBFD62429CBB5B9002F3C81 /* SearchBar */, - FD41C87222DD13230086F899 /* Helpers */, - FD41C86F22DD13230086F899 /* Shy Header */, - FD41C87922DD13230086F899 /* Views */, - ); - path = Navigation; - sourceTree = ""; - }; - FD41C86F22DD13230086F899 /* Shy Header */ = { - isa = PBXGroup; - children = ( - FD41C87022DD13230086F899 /* ShyHeaderController.swift */, - FD41C87122DD13230086F899 /* ShyHeaderView.swift */, - ); - path = "Shy Header"; - sourceTree = ""; - }; - FD41C87222DD13230086F899 /* Helpers */ = { - isa = PBXGroup; - children = ( - FD41C86E22DD13230086F899 /* ContentScrollViewTraits.swift */, - FD41C88022DD13230086F899 /* NavigationAnimator.swift */, - ); - path = Helpers; - sourceTree = ""; - }; - FD41C87922DD13230086F899 /* Views */ = { - isa = PBXGroup; - children = ( - FD41C87A22DD13230086F899 /* AvatarTitleView.swift */, - 66512A3729D3B30D003CF303 /* AvatarTitleViewTokenSet.swift */, - ); - path = Views; - sourceTree = ""; - }; - FD4F2A1C214ADBBF00C437D6 /* Date Picker */ = { - isa = PBXGroup; - children = ( - FD4F2A1F214AE20400C437D6 /* DatePickerController.swift */, - FD256C5A2183B90B00EC9588 /* DatePickerSelectionManager.swift */, - ); - path = "Date Picker"; - sourceTree = ""; - }; - FD599D0021347FA0008845EE /* Date Time Pickers */ = { - isa = PBXGroup; - children = ( - FD5BBE3A214B2F44008964B4 /* Date+Extensions.swift */, - FD9A5C862179464F00D224D9 /* DateComponents+Extensions.swift */, - FD77752F21A490BA00033D58 /* DateTimePicker.swift */, - FD777528219E3F6C00033D58 /* DayOfMonth.swift */, - FD1FAE1A2272464B00A5DBA4 /* GenericDateTimePicker.swift */, - C77A04B625F03DD1001B3EB6 /* String+Date.swift */, - FD4F2A1C214ADBBF00C437D6 /* Date Picker */, - FD5C8C2A2190C3470063562C /* Date Time Picker */, - ); - path = "Date Time Pickers"; - sourceTree = ""; - }; - FD5C8C2A2190C3470063562C /* Date Time Picker */ = { - isa = PBXGroup; - children = ( - FD5ADBF32190CDC80005A9AF /* DateTimePickerController.swift */, - FD97580521910FE800B67319 /* Views */, - ); - path = "Date Time Picker"; - sourceTree = ""; - }; - FD7254EE2147382D002F4069 /* Presenters */ = { - isa = PBXGroup; - children = ( - FDA1AF9221487225001AE720 /* CardPresentationController.swift */, - FD0D29D52151A3D700E8655E /* CardPresenterNavigationController.swift */, - FDA1AF90214871B5001AE720 /* CardTransitionAnimator.swift */, - FD4F2A1A2148937100C437D6 /* PageCardPresenterController.swift */, - ); - path = Presenters; - sourceTree = ""; - }; - FD7DF05A21FA7F3200857267 /* Tooltip */ = { - isa = PBXGroup; - children = ( - FD7DF05B21FA7F5000857267 /* Tooltip.swift */, - 4B8245D7293FC7A200CF0C77 /* TooltipTokenSet.swift */, - FD7DF05D21FA7FC100857267 /* TooltipView.swift */, - FD7DF05F21FA83C900857267 /* TooltipViewController.swift */, - ); - path = Tooltip; - sourceTree = ""; - }; - FD97580521910FE800B67319 /* Views */ = { - isa = PBXGroup; - children = ( - FD9758062191118D00B67319 /* DateTimePickerView.swift */, - FD9758092191118E00B67319 /* DateTimePickerViewComponent.swift */, - FD97580A2191118E00B67319 /* DateTimePickerViewComponentCell.swift */, - FD9758082191118E00B67319 /* DateTimePickerViewComponentTableView.swift */, - FD9758072191118E00B67319 /* DateTimePickerViewDataSource.swift */, - FD77752C219E62E100033D58 /* DateTimePickerViewLayout.swift */, - ); - path = Views; - sourceTree = ""; - }; - FDFB8AE921361C860046850A /* Calendar */ = { - isa = PBXGroup; - children = ( - FD77752A219E455A00033D58 /* AccessibilityContainerView.swift */, - FD599D052134A682008845EE /* AccessibleViewDelegate.swift */, - FD7254E82147059D002F4069 /* Calendar+Extensions.swift */, - FDF41ED82141A02200EC527C /* CalendarConfiguration.swift */, - FD599D0121348439008845EE /* CalendarView.swift */, - FD599D0B2134AB1E008845EE /* CalendarViewDataSource.swift */, - FD599D092134AB15008845EE /* CalendarViewLayout.swift */, - FD256C5C2183D77900EC9588 /* Views */, - ); - path = Calendar; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 8FD01165228A820600D25925 /* FluentUILib */ = { - isa = PBXNativeTarget; - buildConfigurationList = 8FD0116A228A820600D25925 /* Build configuration list for PBXNativeTarget "FluentUILib" */; - buildPhases = ( - 566C664928CB994F0032314C /* Copy module.modulemap */, - 8FD01162228A820600D25925 /* Sources */, - FD256C59218392B800EC9588 /* Run swiftlint */, - 923DF2E4271166DB00637646 /* Copy FluentUI-Swift.h */, - ); - buildRules = ( - ); - dependencies = ( - 8FD011C8228A831700D25925 /* PBXTargetDependency */, - ); - name = FluentUILib; - productName = OfficeUIFabricStaticLib; - productReference = 8FD01166228A820600D25925 /* libFluentUI.a */; - productType = "com.apple.product-type.library.static"; - }; - A5CEC15920D980B30016922A /* FluentUITests */ = { - isa = PBXNativeTarget; - buildConfigurationList = A5CEC16820D980B30016922A /* Build configuration list for PBXNativeTarget "FluentUITests" */; - buildPhases = ( - A5CEC15620D980B30016922A /* Sources */, - A5CEC15720D980B30016922A /* Frameworks */, - A5CEC15820D980B30016922A /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = FluentUITests; - productName = OfficeUIFabricTests; - productReference = A5CEC15A20D980B30016922A /* FluentUITests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; - A5DA88FB226FAA01000A8EA8 /* FluentUIResources */ = { - isa = PBXNativeTarget; - buildConfigurationList = A5DA88FF226FAA01000A8EA8 /* Build configuration list for PBXNativeTarget "FluentUIResources" */; - buildPhases = ( - A5DA88FA226FAA01000A8EA8 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = FluentUIResources; - productName = OfficeUIFabricResources; - productReference = A5DA88FC226FAA01000A8EA8 /* FluentUIResources-ios.bundle */; - productType = "com.apple.product-type.bundle"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - A5CEC14820D980B20016922A /* Project object */ = { - isa = PBXProject; - attributes = { - LastSwiftUpdateCheck = 1020; - LastUpgradeCheck = 1240; - ORGANIZATIONNAME = "Microsoft Corporation"; - TargetAttributes = { - 8FD01165228A820600D25925 = { - CreatedOnToolsVersion = 10.2.1; - LastSwiftMigration = 1020; - }; - A5CEC15920D980B30016922A = { - CreatedOnToolsVersion = 9.4.1; - LastSwiftMigration = 1020; - }; - A5DA88FB226FAA01000A8EA8 = { - CreatedOnToolsVersion = 10.2.1; - }; - }; - }; - buildConfigurationList = A5CEC14B20D980B20016922A /* Build configuration list for PBXProject "FluentUI" */; - compatibilityVersion = "Xcode 9.3"; - developmentRegion = en; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ar, - ca, - cs, - da, - de, - el, - "en-GB", - "es-MX", - es, - fi, - fr, - he, - hi, - hr, - hu, - id, - it, - ja, - ko, - ms, - "nb-NO", - nl, - pl, - "pt-BR", - "pt-PT", - ro, - ru, - sk, - sv, - th, - tr, - uk, - vi, - "zh-Hans", - "zh-Hant", - ); - mainGroup = A5CEC14720D980B20016922A; - productRefGroup = A5CEC15220D980B20016922A /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - A5DA88FB226FAA01000A8EA8 /* FluentUIResources */, - 8FD01165228A820600D25925 /* FluentUILib */, - A5CEC15920D980B30016922A /* FluentUITests */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - A5CEC15820D980B30016922A /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 923DF2E82712B6C400637646 /* FluentUIResources-ios.bundle in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - A5DA88FA226FAA01000A8EA8 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - A542A9D7226FC01100204A52 /* Localizable.strings in Resources */, - A542A9D8226FC01700204A52 /* Localizable.stringsdict in Resources */, - A257F82C251D98F3002CAA6E /* FluentUI-ios.xcassets in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXShellScriptBuildPhase section */ - 923DF2E4271166DB00637646 /* Copy FluentUI-Swift.h */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - ); - inputPaths = ( - "$(FLUENT_HSP_INPUT)/FluentUI-Swift.h", - ); - name = "Copy FluentUI-Swift.h"; - outputFileListPaths = ( - ); - outputPaths = ( - "$(FLUENT_HSP_OUTPUT)/FluentUI-Swift.h", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "echo \"Copying FluentUI-Swift.h from $FLUENT_HSP_INPUT to $FLUENT_HSP_OUTPUT\"\n\n# Ensure the target include path exists\nmkdir -p $FLUENT_HSP_OUTPUT\n\n# Copy any file that looks like a Swift generated header to the include path\ncp $FLUENT_HSP_INPUT/FluentUI-Swift.h $FLUENT_HSP_OUTPUT\n"; - }; - FD256C59218392B800EC9588 /* Run swiftlint */ = { - isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "Run swiftlint"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "# Adds support for Apple Silicon brew directory\nexport PATH=\"$PATH:/opt/homebrew/bin\"\n\nif which swiftlint >/dev/null; then\n export LINTPATH=\"${LOCROOT}/./\"\n swiftlint --config ../.swiftlint.yml\nelse\n echo \"warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint\"\nfi\n"; - }; -/* End PBXShellScriptBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 8FD01162228A820600D25925 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - EC04E65829C27359005F8BA0 /* FocusRingView.swift in Sources */, - 6ED5E55126D3D39400D8BE81 /* BadgeLabelButton.swift in Sources */, - 6ED5E55226D3D39400D8BE81 /* UIBarButtonItem+BadgeValue.swift in Sources */, - 5314E0ED25F012C40099271A /* ContentScrollViewTraits.swift in Sources */, - EC5982DA27C703EE00FD048D /* ShapeCutout.swift in Sources */, - 5314E03A25F00E3D0099271A /* BadgeView.swift in Sources */, - 5314E1A325F01A7C0099271A /* TableViewHeaderFooterView.swift in Sources */, - 3A9FC0F52A6AFAD40060A6BE /* BadgeFieldTokenSet.swift in Sources */, - 5314E30325F0260E0099271A /* AccessibleViewDelegate.swift in Sources */, - 6EB4B25F270ED6B30005B808 /* BadgeLabel.swift in Sources */, - EC98E2B2298D97EC00B9DF91 /* TextFieldTokenSet.swift in Sources */, - 9231491528BF026A001B033E /* HUD.swift in Sources */, - 5314E1A725F01A7C0099271A /* ActionsCell.swift in Sources */, - 5314E07B25F00F1A0099271A /* DateTimePickerViewDataSource.swift in Sources */, - 532FE3D426EA6D74007539C0 /* ActivityIndicatorTokenSet.swift in Sources */, - 92D5FDFB28A713990087894B /* LinearGradientInfo.swift in Sources */, - 53E2EE07278799B30086D30D /* MSFIndeterminateProgressBar.swift in Sources */, - 532FE3D626EA6D74007539C0 /* ActivityIndicatorModifiers.swift in Sources */, - 5314E2F525F025C60099271A /* CalendarConfiguration.swift in Sources */, - 3AFB0FD629C1365600FEC1A9 /* MultilineCommandBar.swift in Sources */, - 923DB9D4274CB65700D8E58A /* TokenizedControl.swift in Sources */, - 5314E06B25F00F100099271A /* DateTimePicker.swift in Sources */, - 5314E2BB25F024C60099271A /* CALayer+Extensions.swift in Sources */, - 66512A3829D3B30D003CF303 /* AvatarTitleViewTokenSet.swift in Sources */, - 5314E12B25F016230099271A /* PillButtonBar.swift in Sources */, - 5314E07E25F00F1A0099271A /* DateTimePickerView.swift in Sources */, - 5328D97726FBA3D700F3723B /* IndeterminateProgressBar.swift in Sources */, - 92279B332B97C7DC00994D88 /* FluentButtonStyle.swift in Sources */, - 5314E07625F00F160099271A /* DateTimePickerController.swift in Sources */, - 922A34DF27BB87990062721F /* TokenizedControlView.swift in Sources */, - 92016FF8299DF34A00660DB7 /* EmptyTokenSet.swift in Sources */, - 5314E14525F016860099271A /* CardPresentationController.swift in Sources */, - EC98E2AD2980C15C00B9DF91 /* FluentTextField.swift in Sources */, - 5314E0A925F010070099271A /* DrawerTransitionAnimator.swift in Sources */, - 5314E06525F00EFD0099271A /* CalendarViewDayMonthCell.swift in Sources */, - 6FBFD62629CBB5F1002F3C81 /* SearchBarTokenSet.swift in Sources */, - 5314E08B25F00F2D0099271A /* CommandBarItem.swift in Sources */, - 5314E06225F00EFD0099271A /* CalendarViewDayTodayCell.swift in Sources */, - EC98E2B0298D978C00B9DF91 /* FluentTextFieldInternal.swift in Sources */, - 5314E08025F00F1A0099271A /* DateTimePickerViewComponent.swift in Sources */, - 5314E06325F00EFD0099271A /* CalendarViewDayMonthYearCell.swift in Sources */, - 5314E1A225F01A7C0099271A /* ActivityIndicatorCell.swift in Sources */, - 5373D5652694D65C0032A3B4 /* AvatarTokenSet.swift in Sources */, - 5314E06125F00EFD0099271A /* CalendarViewDayCell.swift in Sources */, - 929DD25A266ED3B600E8175E /* PersonaButtonCarousel.swift in Sources */, - 6F050B6929D3D16D0070D3D5 /* SideTabBarTokenSet.swift in Sources */, - 9231491328BF026A001B033E /* HeadsUpDisplay.swift in Sources */, - 5314E12A25F016230099271A /* PillButton.swift in Sources */, - 4BF01D9A27B37CF8005B32F2 /* NotificationTokenSet.swift in Sources */, - 5314E0E525F012C00099271A /* NavigationBar.swift in Sources */, - C708B064260A87F7007190FA /* SegmentItem.swift in Sources */, - 5328D97126FBA3D700F3723B /* IndeterminateProgressBarTokenSet.swift in Sources */, - 5314E14325F016860099271A /* CardTransitionAnimator.swift in Sources */, - 5314E0F825F012CB0099271A /* AvatarTitleView.swift in Sources */, - 8035CAB62633A4DB007B3FD1 /* BottomCommandingController.swift in Sources */, - 5314E13725F016370099271A /* PopupMenuProtocols.swift in Sources */, - 5314E19725F019650099271A /* TabBarItem.swift in Sources */, - EC98E2B4298D989100B9DF91 /* FluentTextInputError.swift in Sources */, - 6F2F218F2A12BFD900C50EAB /* BadgeLabelTokenSet.swift in Sources */, - 6FC3705E29E7707F0096B239 /* BadgeViewTokenSet.swift in Sources */, - 92B7E6A326864AE900EFC15E /* MSFPersonaButton.swift in Sources */, - 5314E1BB25F01B070099271A /* TouchForwardingView.swift in Sources */, - 5314E2EC25F025710099271A /* DayOfMonth.swift in Sources */, - 5314E0B325F010400099271A /* EasyTapButton.swift in Sources */, - F32E6E8B2A7997F3003F9AE7 /* ListActionItem.swift in Sources */, - 5314E19625F019650099271A /* TabBarView.swift in Sources */, - C708B05F260A8778007190FA /* SegmentPillButton.swift in Sources */, - 5314E13525F016370099271A /* PopupMenuItemCell.swift in Sources */, - 5314E2A025F024860099271A /* NSLayoutConstraint+Extensions.swift in Sources */, - 923DB9D5274CB65700D8E58A /* FluentTheme.swift in Sources */, - 929DD257266ED3AC00E8175E /* PersonaButtonCarouselTokenSet.swift in Sources */, - EC65F790292EDCEF002A1A23 /* ButtonTokenSet.swift in Sources */, - 5314E26625F023B20099271A /* UIColor+Extensions.swift in Sources */, - 5314E30225F0260E0099271A /* AccessibilityContainerView.swift in Sources */, - 8035CAD026377C17007B3FD1 /* CommandingItem.swift in Sources */, - 5314E0F325F012C80099271A /* ShyHeaderController.swift in Sources */, - 535559E42711411E0094A871 /* FluentThemedHostingController.swift in Sources */, - 3A9FC0F72A705C090060A6BE /* PeoplePickerTokenSet.swift in Sources */, - 9231491628BF02B9001B033E /* Button.swift in Sources */, - 5314E1B125F01A980099271A /* TooltipView.swift in Sources */, - 5314E19525F019650099271A /* TabBarItemView.swift in Sources */, - 5314E03C25F00E3D0099271A /* BadgeField.swift in Sources */, - D6296DAE295B7CA0002E8EB6 /* ColorProviding.swift in Sources */, - 5314E05B25F00EF50099271A /* CalendarView.swift in Sources */, - 92EE82AE27025A94009D52B5 /* TokenSet.swift in Sources */, - 6F3CB7F229D3A5DE00284353 /* ResizingHandleTokenSet.swift in Sources */, - 5314E28125F0240D0099271A /* DateComponents+Extensions.swift in Sources */, - 667E54022A12B6F800728F93 /* TwoLineTitleView+Navigation.swift in Sources */, - 6F3CB7F029D3A2B700284353 /* DrawerTokenSet.swift in Sources */, - 0A8E61FB291DC11F009E412D /* CommandBarTokenSet.swift in Sources */, - 5314E07025F00F140099271A /* DatePickerController.swift in Sources */, - 5373D56B2694D65C0032A3B4 /* MSFAvatarPresence.swift in Sources */, - EC5982D827BF348700FD048D /* MSFAvatar.swift in Sources */, - 5314E0AA25F010070099271A /* DrawerShadowView.swift in Sources */, - 4BDBE18928EC9E6F00314696 /* ShimmerTokenSet.swift in Sources */, - 2A9745DE281733D700E1A1FD /* TableViewCellTokenSet.swift in Sources */, - 530D9C5127EE388200BDCBBF /* SwiftUI+ViewPresentation.swift in Sources */, - 6F050B6D29D3D1A90070D3D5 /* TabBarTokenSet.swift in Sources */, - 5314E0E725F012C00099271A /* UINavigationItem+Navigation.swift in Sources */, - 920945492703DDA000B38E1A /* CardNudgeTokenSet.swift in Sources */, - 92D49054278FF4E50085C018 /* PersonaButtonCarouselModifiers.swift in Sources */, - C77A04B825F03DD1001B3EB6 /* String+Date.swift in Sources */, - 4B53505F27F63E3F0033B47F /* NotificationModifiers.swift in Sources */, - 5314E14425F016860099271A /* PageCardPresenterController.swift in Sources */, - 5314E11B25F015EA0099271A /* PersonaListView.swift in Sources */, - 925D462026FD18B200179583 /* AliasTokens.swift in Sources */, - 5314E28E25F024590099271A /* Date+Extensions.swift in Sources */, - 5306076126A201C8002D49CF /* Persona.swift in Sources */, - 92E7AD5026FE51FF00AE7FF8 /* DynamicColor.swift in Sources */, - 5314E14E25F016CD0099271A /* ResizingHandleView.swift in Sources */, - 804EDE1528C00CA400371C6B /* ContentHeightResolutionContext.swift in Sources */, - 4B8245D8293FC7A200CF0C77 /* TooltipTokenSet.swift in Sources */, - 5314E1A625F01A7C0099271A /* BooleanCell.swift in Sources */, - 92F8054E272B2DF3000EAFDB /* CardNudgeModifiers.swift in Sources */, - 925D461D26FD133600179583 /* GlobalTokens.swift in Sources */, - 9275105626815A7100F12730 /* MSFPersonaButtonCarousel.swift in Sources */, - 927EB2BD278627440069753D /* PersonaButtonModifiers.swift in Sources */, - 5314E0F225F012C80099271A /* ShyHeaderView.swift in Sources */, - 5314E02825F00DA80099271A /* BlurringView.swift in Sources */, - 5314E13625F016370099271A /* PopupMenuSectionHeaderView.swift in Sources */, - 5314E05925F00EF50099271A /* CalendarViewDataSource.swift in Sources */, - 5314E01625F00CF70099271A /* BarButtonItems.swift in Sources */, - 5314E25425F023650099271A /* UIImage+Extensions.swift in Sources */, - F3F113892A705AD500DA852A /* ListItem.swift in Sources */, - 92D5598226A0FD2800328FD3 /* CardNudge.swift in Sources */, - ECF3C9882A67495A00CA35FC /* BottomCommandingTokenSet.swift in Sources */, - 532FE3D826EA6D74007539C0 /* ActivityIndicator.swift in Sources */, - 5314E0E625F012C00099271A /* UIViewController+Navigation.swift in Sources */, - 5314E29725F024760099271A /* String+Extension.swift in Sources */, - 9231491228BF026A001B033E /* HUDModifiers.swift in Sources */, - 530D9C5327EE7B2C00BDCBBF /* SwiftUI+ViewAnimation.swift in Sources */, - 6F050B7529D6219D0070D3D5 /* PopupMenuTokenSet.swift in Sources */, - 4B4A2F2129A7E83100570CD4 /* LabelTokenSet.swift in Sources */, - 5306075726A1E6A4002D49CF /* AvatarGroup.swift in Sources */, - 92A1E4F526A791590007ED60 /* MSFCardNudge.swift in Sources */, - 5314E1C425F01B4E0099271A /* TwoLineTitleView.swift in Sources */, - 5314E0CF25F011F10099271A /* Label.swift in Sources */, - 5314E13925F016370099271A /* PopupMenuController.swift in Sources */, - 9298798B2669A875002B1EB4 /* PersonaButtonTokenSet.swift in Sources */, - 53E2EE0527860D010086D30D /* MSFActivityIndicator.swift in Sources */, - 5314E0A725F010070099271A /* DrawerController.swift in Sources */, - 5314E07125F00F140099271A /* DatePickerSelectionManager.swift in Sources */, - 5373D5672694D65C0032A3B4 /* Avatar.swift in Sources */, - 9231F10329BB99090079CD94 /* FluentTheme+Tokens.swift in Sources */, - 5314E1A425F01A7C0099271A /* CenteredLabelCell.swift in Sources */, - 5314E1D625F01E4A0099271A /* SearchBar.swift in Sources */, - 5314E0A825F010070099271A /* DrawerPresentationController.swift in Sources */, - 43488C46270FAD1300124C71 /* FluentNotification.swift in Sources */, - 5314E06425F00EFD0099271A /* CalendarViewMonthBannerView.swift in Sources */, - 5314E18E25F0195C0099271A /* ShimmerLinesView.swift in Sources */, - 80AECC21263339E3005AF2F3 /* BottomSheetController.swift in Sources */, - 5314E2E325F025500099271A /* FluentUIFramework.swift in Sources */, - ECA9218627A3301C00B66117 /* MSFAvatarGroup.swift in Sources */, - 5314E0EC25F012C40099271A /* NavigationAnimator.swift in Sources */, - 5314E17225F0191C0099271A /* Separator.swift in Sources */, - 5314E14225F016860099271A /* CardPresenterNavigationController.swift in Sources */, - 5314E11725F015EA0099271A /* PersonaCell.swift in Sources */, - 5314E23025F022C80099271A /* UIScrollView+Extensions.swift in Sources */, - 5314E16925F017940099271A /* SegmentedControl.swift in Sources */, - 4BF01DA027B3A862005B32F2 /* UIApplication+Extensions.swift in Sources */, - 5373D5732694D66F0032A3B4 /* UIKit+SwiftUI_interoperability.swift in Sources */, - 5314E09E25F00FE20099271A /* DotView.swift in Sources */, - 5314E1A525F01A7C0099271A /* TableViewCell.swift in Sources */, - F3DFD3612A7B210100014C6E /* ListActionItemModifiers.swift in Sources */, - 4BBD651F2755FD9500A8B09E /* MSFNotification.swift in Sources */, - 5314E09525F00FA30099271A /* DimmingView.swift in Sources */, - 5306075326A1E6A4002D49CF /* AvatarGroupTokenSet.swift in Sources */, - 5314E11825F015EA0099271A /* PeoplePicker.swift in Sources */, - 5303259B26B31B6B00611D05 /* AvatarModifiers.swift in Sources */, - 4B2E373D2991CB53008929B4 /* BottomSheetTokenSet.swift in Sources */, - 6F050B6F29D3EA820070D3D5 /* PillButtonTokenSet.swift in Sources */, - 5314E2B225F024B60099271A /* Calendar+Extensions.swift in Sources */, - 5314E1B225F01A980099271A /* TooltipViewController.swift in Sources */, - 5314E08A25F00F2D0099271A /* CommandBar.swift in Sources */, - 9231491128BF026A001B033E /* HeadsUpDisplayTokenSet.swift in Sources */, - 5314E18D25F0195C0099271A /* ShimmerView.swift in Sources */, - 66963D1029CE244D006F5FA9 /* NavigationBarTokenSet.swift in Sources */, - 80AECC22263339E5005AF2F3 /* BottomSheetPassthroughView.swift in Sources */, - 925728F9276D6B5800EE1019 /* FontInfo.swift in Sources */, - 5314E1CD25F01B730099271A /* AnimationSynchronizer.swift in Sources */, - 92088EF92666DB2C003F571A /* PersonaButton.swift in Sources */, - 9231491428BF026A001B033E /* MSFHeadsUpDisplay.swift in Sources */, - 5314E13425F016370099271A /* PopupMenuItem.swift in Sources */, - ECA9218A27A33A2D00B66117 /* AvatarGroupModifiers.swift in Sources */, - 6F050B6B29D3D1900070D3D5 /* TabBarItemTokenSet.swift in Sources */, - 5314E13825F016370099271A /* PopupMenuSection.swift in Sources */, - 5314E07C25F00F1A0099271A /* DateTimePickerViewLayout.swift in Sources */, - 6F050B7129D6213E0070D3D5 /* PopupMenuItemTokenSet.swift in Sources */, - 5314E11625F015EA0099271A /* PersonaBadgeViewDataSource.swift in Sources */, - 5373D5772694D66F0032A3B4 /* SwiftUI+ViewModifiers.swift in Sources */, - 5314E07F25F00F1A0099271A /* DateTimePickerViewComponentCell.swift in Sources */, - 8035CADE2638E435007B3FD1 /* CommandingSection.swift in Sources */, - 92DEE2252723D34400E31ED0 /* ControlTokenSet.swift in Sources */, - 5314E0E425F012C00099271A /* NavigationController.swift in Sources */, - 925728F7276D6AF800EE1019 /* ShadowInfo.swift in Sources */, - 66963D0A29CA7F89006F5FA9 /* TwoLineTitleViewTokenSet.swift in Sources */, - 5328D97326FBA3D700F3723B /* IndeterminateProgressBarModifiers.swift in Sources */, - 923DB9D7274CB66D00D8E58A /* ControlHostingView.swift in Sources */, - 5314E03B25F00E3D0099271A /* BadgeStringExtractor.swift in Sources */, - EC1C31732923022E00CF052C /* SegmentedControlTokenSet.swift in Sources */, - 5314E19825F019650099271A /* SideTabBar.swift in Sources */, - 5314E10A25F014600099271A /* Obscurable.swift in Sources */, - F3F1138D2A705B6900DA852A /* ListItemModifiers.swift in Sources */, - 5314E07D25F00F1A0099271A /* DateTimePickerViewComponentTableView.swift in Sources */, - 0AE3041D29F721B2003CDDD9 /* TableViewHeaderFooterViewTokenSet.swift in Sources */, - 926FEEAA2B45A8B4002C61D0 /* Compatibility.swift in Sources */, - 926B4C9A2B8E94F6001EBA16 /* FluentTheme+visionOS.swift in Sources */, - 5314E03125F00DDD0099271A /* CardView.swift in Sources */, - 5314E08925F00F2D0099271A /* CommandBarButtonGroupView.swift in Sources */, - 5314E08C25F00F2D0099271A /* CommandBarButton.swift in Sources */, - 94A7EC1A2836DCB200BFFBAE /* CommandBarCommandGroupsView.swift in Sources */, - 5314E21E25F022120099271A /* UIView+Extensions.swift in Sources */, - 5314E06A25F00F100099271A /* GenericDateTimePicker.swift in Sources */, - 0A84A6F029EDC489005DBC3D /* SeparatorTokenSet.swift in Sources */, - 5314E06025F00EFD0099271A /* CalendarViewWeekdayHeadingView.swift in Sources */, - 5314E05A25F00EF50099271A /* CalendarViewLayout.swift in Sources */, - 5314E1B025F01A980099271A /* Tooltip.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - A5CEC15620D980B30016922A /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 924268A2277AD9F700C5A452 /* FontTests.swift in Sources */, - A5CEC16020D980B30016922A /* FluentUITests.swift in Sources */, - 929215B92B6C75E500D4EA9F /* AvatarTests.swift in Sources */, - 8FA3CB5B246B19EA0049E431 /* ColorTests.swift in Sources */, - FD053A352224CA33009B6378 /* DatePickerControllerTests.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXTargetDependency section */ - 8FD011C8228A831700D25925 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = A5DA88FB226FAA01000A8EA8 /* FluentUIResources */; - targetProxy = 8FD011C7228A831700D25925 /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - -/* Begin PBXVariantGroup section */ - A559BB81212B6FA40055E107 /* Localizable.strings */ = { - isa = PBXVariantGroup; - children = ( - A559BB80212B6FA40055E107 /* en */, - FD8D26422253FF330078E1D3 /* ar */, - FD8D26442253FF3E0078E1D3 /* ca */, - FD8D26462253FF470078E1D3 /* cs */, - FD8D26482253FF4F0078E1D3 /* da */, - FD8D264A2254013E0078E1D3 /* de */, - FD8D264C225401660078E1D3 /* el */, - FD8D264E225401880078E1D3 /* en-GB */, - FD8D2650225401A10078E1D3 /* es-MX */, - FD8D2652225401AA0078E1D3 /* es */, - FD8D2654225401B90078E1D3 /* fi */, - FD8D2656225401C10078E1D3 /* fr */, - FD8D2658225401CD0078E1D3 /* he */, - FD8D265A225401D90078E1D3 /* hi */, - FD8D265C225401E50078E1D3 /* hr */, - FD8D265E225401F20078E1D3 /* hu */, - FD8D2660225401FA0078E1D3 /* id */, - FD8D2662225402020078E1D3 /* it */, - FD8D26642254020E0078E1D3 /* ja */, - FD8D2666225402160078E1D3 /* ko */, - FD8D26682254021D0078E1D3 /* ms */, - FD8D266A2254022E0078E1D3 /* nb-NO */, - FD8D266C225402DC0078E1D3 /* nl */, - FD8D266E225402E60078E1D3 /* pl */, - FD8D2670225402F00078E1D3 /* pt-BR */, - FD8D2672225402F60078E1D3 /* pt-PT */, - FD8D2674225403000078E1D3 /* ro */, - FD8D2676225403070078E1D3 /* ru */, - FD8D26782254030E0078E1D3 /* sk */, - FD8D267A225403160078E1D3 /* sv */, - FD8D267C2254031B0078E1D3 /* th */, - FD8D267E225403210078E1D3 /* tr */, - FD8D2680225403290078E1D3 /* uk */, - FD8D2682225403300078E1D3 /* vi */, - FD8D2684225403360078E1D3 /* zh-Hans */, - FD8D26862254033B0078E1D3 /* zh-Hant */, - ); - name = Localizable.strings; - sourceTree = ""; - }; - A5DF1EAD2213B26900CC741A /* Localizable.stringsdict */ = { - isa = PBXVariantGroup; - children = ( - A5DF1EAC2213B26900CC741A /* en */, - FD8D26432253FF330078E1D3 /* ar */, - FD8D26452253FF3F0078E1D3 /* ca */, - FD8D26472253FF470078E1D3 /* cs */, - FD8D26492253FF500078E1D3 /* da */, - FD8D264B2254013E0078E1D3 /* de */, - FD8D264D225401660078E1D3 /* el */, - FD8D264F225401880078E1D3 /* en-GB */, - FD8D2651225401A10078E1D3 /* es-MX */, - FD8D2653225401AA0078E1D3 /* es */, - FD8D2655225401B90078E1D3 /* fi */, - FD8D2657225401C20078E1D3 /* fr */, - FD8D2659225401CD0078E1D3 /* he */, - FD8D265B225401D90078E1D3 /* hi */, - FD8D265D225401E50078E1D3 /* hr */, - FD8D265F225401F30078E1D3 /* hu */, - FD8D2661225401FB0078E1D3 /* id */, - FD8D2663225402030078E1D3 /* it */, - FD8D26652254020E0078E1D3 /* ja */, - FD8D2667225402160078E1D3 /* ko */, - FD8D26692254021E0078E1D3 /* ms */, - FD8D266B2254022E0078E1D3 /* nb-NO */, - FD8D266D225402DC0078E1D3 /* nl */, - FD8D266F225402E60078E1D3 /* pl */, - FD8D2671225402F10078E1D3 /* pt-BR */, - FD8D2673225402F60078E1D3 /* pt-PT */, - FD8D2675225403000078E1D3 /* ro */, - FD8D2677225403070078E1D3 /* ru */, - FD8D26792254030E0078E1D3 /* sk */, - FD8D267B225403160078E1D3 /* sv */, - FD8D267D2254031B0078E1D3 /* th */, - FD8D267F225403220078E1D3 /* tr */, - FD8D26812254032A0078E1D3 /* uk */, - FD8D2683225403300078E1D3 /* vi */, - FD8D2685225403360078E1D3 /* zh-Hans */, - FD8D26872254033B0078E1D3 /* zh-Hant */, - ); - name = Localizable.stringsdict; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - 8FD0116B228A820600D25925 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = C7752C7C2790C1F40012F860 /* FluentUILib_debug.xcconfig */; - buildSettings = { - }; - name = Debug; - }; - 8FD0116C228A820600D25925 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = C7752C7B2790C1F40012F860 /* FluentUILib_release.xcconfig */; - buildSettings = { - }; - name = Release; - }; - 8FD0116D228A820600D25925 /* Dogfood */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = C7752C7B2790C1F40012F860 /* FluentUILib_release.xcconfig */; - buildSettings = { - }; - name = Dogfood; - }; - A52B637B2138745C009F7ADF /* Dogfood */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 53FC90F525673626008A06FD /* FluentUI_release.xcconfig */; - buildSettings = { - CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; - }; - name = Dogfood; - }; - A52B637D2138745C009F7ADF /* Dogfood */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 53FC90F725673626008A06FD /* FluentUITests.xcconfig */; - buildSettings = { - }; - name = Dogfood; - }; - A5CEC16320D980B30016922A /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 53FC90F625673626008A06FD /* FluentUI_debug.xcconfig */; - buildSettings = { - CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; - }; - name = Debug; - }; - A5CEC16420D980B30016922A /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 53FC90F525673626008A06FD /* FluentUI_release.xcconfig */; - buildSettings = { - CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; - }; - name = Release; - }; - A5CEC16920D980B30016922A /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 53FC90F725673626008A06FD /* FluentUITests.xcconfig */; - buildSettings = { - }; - name = Debug; - }; - A5CEC16A20D980B30016922A /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 53FC90F725673626008A06FD /* FluentUITests.xcconfig */; - buildSettings = { - }; - name = Release; - }; - A5DA8900226FAA01000A8EA8 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 53FC90FA25673627008A06FD /* FluentUIResources.xcconfig */; - buildSettings = { - }; - name = Debug; - }; - A5DA8901226FAA01000A8EA8 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 53FC90FA25673627008A06FD /* FluentUIResources.xcconfig */; - buildSettings = { - }; - name = Release; - }; - A5DA8902226FAA01000A8EA8 /* Dogfood */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 53FC90FA25673627008A06FD /* FluentUIResources.xcconfig */; - buildSettings = { - }; - name = Dogfood; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 8FD0116A228A820600D25925 /* Build configuration list for PBXNativeTarget "FluentUILib" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 8FD0116B228A820600D25925 /* Debug */, - 8FD0116C228A820600D25925 /* Release */, - 8FD0116D228A820600D25925 /* Dogfood */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - A5CEC14B20D980B20016922A /* Build configuration list for PBXProject "FluentUI" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - A5CEC16320D980B30016922A /* Debug */, - A5CEC16420D980B30016922A /* Release */, - A52B637B2138745C009F7ADF /* Dogfood */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - A5CEC16820D980B30016922A /* Build configuration list for PBXNativeTarget "FluentUITests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - A5CEC16920D980B30016922A /* Debug */, - A5CEC16A20D980B30016922A /* Release */, - A52B637D2138745C009F7ADF /* Dogfood */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - A5DA88FF226FAA01000A8EA8 /* Build configuration list for PBXNativeTarget "FluentUIResources" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - A5DA8900226FAA01000A8EA8 /* Debug */, - A5DA8901226FAA01000A8EA8 /* Release */, - A5DA8902226FAA01000A8EA8 /* Dogfood */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = A5CEC14820D980B20016922A /* Project object */; -} diff --git a/ios/FluentUI.xcodeproj/xcshareddata/xcschemes/FluentUI-iOS.xcscheme b/ios/FluentUI.xcodeproj/xcshareddata/xcschemes/FluentUI-iOS.xcscheme deleted file mode 100644 index f8b8b59b0f..0000000000 --- a/ios/FluentUI.xcodeproj/xcshareddata/xcschemes/FluentUI-iOS.xcscheme +++ /dev/null @@ -1,88 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ios/FluentUI.xcodeproj/xcshareddata/xcschemes/FluentUIResources-ios.xcscheme b/ios/FluentUI.xcodeproj/xcshareddata/xcschemes/FluentUIResources-ios.xcscheme deleted file mode 100644 index 18699ff079..0000000000 --- a/ios/FluentUI.xcodeproj/xcshareddata/xcschemes/FluentUIResources-ios.xcscheme +++ /dev/null @@ -1,67 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ios/FluentUI.xcworkspace/contents.xcworkspacedata b/ios/FluentUI.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 1bbf147a7d..0000000000 --- a/ios/FluentUI.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - diff --git a/ios/FluentUI/Core/FluentThemedHostingController.swift b/ios/FluentUI/Core/FluentThemedHostingController.swift deleted file mode 100644 index a1571461ac..0000000000 --- a/ios/FluentUI/Core/FluentThemedHostingController.swift +++ /dev/null @@ -1,133 +0,0 @@ -// -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. -// - -import UIKit -import SwiftUI - -extension UIView { - - /// Associated keys created for the added UIView stored properties. - struct AssociatedKeys { - static var shouldUseZeroEdgeInsets: UInt8 = 0 - } - - /// Adds a stored property to the UIView that defines whether the UIView should return UIEdgeInsets.zero from its safeAreaInsets property. - /// This property is intended to be used by the UIHostingView class, which is a private subclass of UIView in the SwiftUI Framework. - var shouldUseZeroEdgeInsets: Bool { - get { - return objc_getAssociatedObject(self, &AssociatedKeys.shouldUseZeroEdgeInsets) as? Bool ?? false - } - set { - objc_setAssociatedObject(self, &AssociatedKeys.shouldUseZeroEdgeInsets, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) - } - } - - /// Computed property that will be swizzled with UIView.safeAreaInsets by exchange of implementations. - /// This swizzling is meant to be used in UIHostingView instances which are private in the SwiftUI framework. - /// Do not call this property getter directly. - @objc var customSafeAreaInsets: UIEdgeInsets { - if shouldUseZeroEdgeInsets { - return .zero - } - - // Because this property will be swizzled with UIView.safeAreaInsets by exchanging - // implementations, this call makes sure to call it by this property's name which - // will contain the original implementation of UIView.safeAreaInsets. - return self.customSafeAreaInsets - } -} - -/// FluentUI specific implementation of the UIHostingController. This is primarily useful for adding `FluentTheme` observation -/// to any wrapped Fluent controls. Additionally, this class adds a workaround for disabling safeAreaInsets for its view on iOS 15. -open class FluentThemedHostingController: UIHostingController { - - @MainActor required dynamic public override init(rootView: AnyView) { - controlView = rootView - super.init(rootView: rootView) - - // We need to observe theme changes, and use them to update our wrapped control. - NotificationCenter.default.addObserver(self, - selector: #selector(themeDidChange), - name: .didChangeTheme, - object: nil) - - // Set the initial appearance of our control. - updateRootView() - } - - @MainActor required dynamic public init?(coder aDecoder: NSCoder) { - preconditionFailure("init(coder:) has not been implemented") - } - - open override func willMove(toParent parent: UIViewController?) { - super.willMove(toParent: parent) - if parent != nil { - updateRootView() - } - } - - /// iOS 15.0 fix for UIHostingController that does not automatically resize to hug subviews - open override func viewDidLayoutSubviews() { - super.viewDidLayoutSubviews() - - view.setNeedsUpdateConstraints() - } - - // MARK: - Theme management - - @objc private func themeDidChange(_ notification: Notification) { - guard FluentTheme.isApplicableThemeChange(notification, for: self.view) else { - return - } - updateRootView() - } - - private func updateRootView() { - self.rootView = AnyView( - controlView - .fluentTheme(view.fluentTheme) - .onAppear { [weak self] in - // We don't usually have a window at construction time, so fetch our - // custom theme during `onAppear` - guard let strongSelf = self else { - return - } - strongSelf.updateRootView() - } - ) - } - - private var controlView: AnyView -} - -// MARK: - Safe Area Inset swizzling - -extension FluentThemedHostingController { - /// Static constant that will be guaranteed to have its initialization executed only once during the lifetime of the application. - private static let swizzleSafeAreaInsetsOnce: Void = { - // A FluentUIHostingController instance needs to be created so that the class type for the private UIHostingViewwe can be retrived. - let hostingControllerViewClass: AnyClass = FluentThemedHostingController(rootView: AnyView(EmptyView())).view.classForCoder - - guard let originalMethod = class_getInstanceMethod(hostingControllerViewClass, #selector(getter: UIView.safeAreaInsets)), - let swizzledMethod = class_getInstanceMethod(hostingControllerViewClass, #selector(getter: UIView.customSafeAreaInsets)) else { - preconditionFailure("UIHostingController zeroSafeAreaInsets swizzling failed.") - } - - method_exchangeImplementations(originalMethod, swizzledMethod) - }() - - /// Disables the UIHostingController's view safe area insets by swizzling the UIView.safeAreaInsets property and returning UIEdgeInsets.zero if the UIView.shouldUseZeroEdgeInsets is true. - /// This is a known issue and it's currently tracked by Radar bug FB8176223 - https://openradar.appspot.com/FB8176223 - func disableSafeAreaInsets() { - // We no longer need the workarounds from `FluentUIHostingController` in - // iOS 16, but we still need it for 14 and 15. - if #unavailable(iOS 16) { - view.shouldUseZeroEdgeInsets = true - _ = FluentThemedHostingController.swizzleSafeAreaInsetsOnce - } else { - sizingOptions = [.intrinsicContentSize] - } - } -} diff --git a/ios/FluentUI/Core/Theme/FluentTheme+Tokens.swift b/ios/FluentUI/Core/Theme/FluentTheme+Tokens.swift deleted file mode 100644 index f092273215..0000000000 --- a/ios/FluentUI/Core/Theme/FluentTheme+Tokens.swift +++ /dev/null @@ -1,618 +0,0 @@ -// -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. -// - -import UIKit - -public extension FluentTheme { - @objc(MSFGradientToken) - enum GradientToken: Int, TokenSetKey { - case flair - case tint - } - - @objc(MSFColorToken) - enum ColorToken: Int, TokenSetKey { - // Neutral colors - Background - case background1 - case background1Pressed - case background1Selected - case background2 - case background2Pressed - case background2Selected - case background3 - case background3Pressed - case background3Selected - case background4 - case background4Pressed - case background4Selected - case background5 - case background5Pressed - case background5Selected - case background6 - case backgroundCanvas - case backgroundDarkStatic - case backgroundLightStatic - case backgroundLightStaticDisabled - case backgroundInverted - case backgroundDisabled - case stencil1 - case stencil2 - - // Neutral colors - Foreground - case foreground1 - case foreground2 - case foreground3 - case foregroundDisabled1 - case foregroundDisabled2 - case foregroundOnColor - case foregroundDarkStatic - case foregroundLightStatic - - // Neutral colors - Stroke - case stroke1 - case stroke1Pressed - case stroke2 - case strokeAccessible - case strokeFocus1 - case strokeFocus2 - case strokeDisabled - - // Brand colors - Brand background - case brandBackground1 - case brandBackground1Pressed - case brandBackground1Selected - case brandBackground2 - case brandBackground2Pressed - case brandBackground2Selected - case brandBackground3 - case brandBackgroundTint - case brandBackgroundDisabled - - // Brand colors - Brand foreground - case brandForeground1 - case brandForeground1Pressed - case brandForeground1Selected - case brandForegroundTint - case brandForegroundDisabled1 - case brandForegroundDisabled2 - - // Brand colors - Brand gradient - case brandGradient1 - case brandGradient2 - case brandGradient3 - - // Brand colors - Brand stroke - case brandStroke1 - case brandStroke1Pressed - case brandStroke1Selected - - // Shared colors - Error & Status - case dangerBackground1 - case dangerBackground2 - case dangerForeground1 - case dangerForeground2 - case dangerStroke1 - case dangerStroke2 - case successBackground1 - case successBackground2 - case successForeground1 - case successForeground2 - case successStroke1 - case warningBackground1 - case warningBackground2 - case warningForeground1 - case warningForeground2 - case warningStroke1 - case severeBackground1 - case severeBackground2 - case severeForeground1 - case severeForeground2 - case severeStroke1 - - // Shared colors - Presence - case presenceAway - case presenceDnd - case presenceAvailable - case presenceOof - } - - @objc(MSFShadowToken) - enum ShadowToken: Int, TokenSetKey { - case clear - case shadow02 - case shadow04 - case shadow08 - case shadow16 - case shadow28 - case shadow64 - } - - @objc(MSFTypographyToken) - enum TypographyToken: Int, TokenSetKey { - case display - case largeTitle - case title1 - case title2 - case title3 - case body1Strong - case body1 - case body2Strong - case body2 - case caption1Strong - case caption1 - case caption2 - } - - /// Returns the color value for the given token. - /// - /// - Parameter token: The `ColorsTokens` value to be retrieved. - /// - Returns: A `UIColor` for the given token. - @objc(colorForToken:) - func color(_ token: ColorToken) -> UIColor { - return colorTokenSet[token] - } - - /// Returns the shadow value for the given token. - /// - /// - Parameter token: The `ShadowTokens` value to be retrieved. - /// - Returns: A `ShadowInfo` for the given token. - @objc(shadowForToken:) - func shadow(_ token: ShadowToken) -> ShadowInfo { - return shadowTokenSet[token] - } - - /// Returns the font value for the given token. - /// - /// - Parameter token: The `TypographyTokens` value to be retrieved. - /// - Parameter adjustsForContentSizeCategory: If true, the resulting font will change size according to Dynamic Type specifications. - /// - Returns: A `UIFont` for the given token. - @objc(typographyForToken:adjustsForContentSizeCategory:) - func typography(_ token: TypographyToken, adjustsForContentSizeCategory: Bool = true) -> UIFont { - return UIFont.fluent(typographyTokenSet[token], - shouldScale: adjustsForContentSizeCategory) - } - - /// Returns the font value for the given token. - /// - /// - Parameter token: The `TypographyTokens` value to be retrieved. - /// - Parameter adjustsForContentSizeCategory: If true, the resulting font will change size according to Dynamic Type specifications. - /// - Parameter contentSizeCategory: An overridden `UIContentSizeCategory` to conform to. - /// - Returns: A `UIFont` for the given token. - @objc(typographyForToken:adjustsForContentSizeCategory:contentSizeCategory:) - func typography(_ token: TypographyToken, - adjustsForContentSizeCategory: Bool = true, - contentSizeCategory: UIContentSizeCategory) -> UIFont { - return UIFont.fluent(typographyTokenSet[token], - shouldScale: adjustsForContentSizeCategory, - contentSizeCategory: contentSizeCategory) - } - - /// Returns an array of colors for the given token. - /// - /// - Parameter token: The `GradientTokens` value to be retrieved. - /// - Returns: An array of `UIColor` values for the given token. - @objc(gradientColorsForToken:) - func gradient(_ token: GradientToken) -> [UIColor] { - return gradientTokenSet[token] - } -} - -extension FluentTheme { - static func defaultColor(_ token: FluentTheme.ColorToken) -> UIColor { - switch token { - case .foreground1: - return UIColor(light: GlobalTokens.neutralColor(.grey14), - dark: GlobalTokens.neutralColor(.white)) - case .foreground2: - return UIColor(light: GlobalTokens.neutralColor(.grey38), - dark: GlobalTokens.neutralColor(.grey84)) - case .foreground3: - return UIColor(light: GlobalTokens.neutralColor(.grey50), - dark: GlobalTokens.neutralColor(.grey68)) - case .foregroundDisabled1: - return UIColor(light: GlobalTokens.neutralColor(.grey74), - dark: GlobalTokens.neutralColor(.grey36)) - case .foregroundDisabled2: - return UIColor(light: GlobalTokens.neutralColor(.white), - dark: GlobalTokens.neutralColor(.grey18)) - case .foregroundOnColor: - return UIColor(light: GlobalTokens.neutralColor(.white), - dark: GlobalTokens.neutralColor(.black)) - case .brandForegroundTint: - return UIColor(light: GlobalTokens.brandColor(.comm60), - dark: GlobalTokens.brandColor(.comm130)) - case .brandForeground1: - return UIColor(light: GlobalTokens.brandColor(.comm80), - dark: GlobalTokens.brandColor(.comm100)) - case .brandForeground1Pressed: - return UIColor(light: GlobalTokens.brandColor(.comm50), - dark: GlobalTokens.brandColor(.comm140)) - case .brandForeground1Selected: - return UIColor(light: GlobalTokens.brandColor(.comm60), - dark: GlobalTokens.brandColor(.comm120)) - case .brandForegroundDisabled1: - return UIColor(light: GlobalTokens.brandColor(.comm90)) - case .brandForegroundDisabled2: - return UIColor(light: GlobalTokens.brandColor(.comm140), - dark: GlobalTokens.brandColor(.comm40)) - case .brandGradient1: - return UIColor(light: GlobalTokens.brandColor(.gradientPrimaryLight), - dark: GlobalTokens.brandColor(.gradientPrimaryDark)) - case .brandGradient2: - return UIColor(light: GlobalTokens.brandColor(.gradientSecondaryLight), - dark: GlobalTokens.brandColor(.gradientSecondaryDark)) - case .brandGradient3: - return UIColor(light: GlobalTokens.brandColor(.gradientTertiaryLight), - dark: GlobalTokens.brandColor(.gradientTertiaryDark)) - case .foregroundDarkStatic: - return UIColor(light: GlobalTokens.neutralColor(.black), - dark: GlobalTokens.neutralColor(.black)) - case .foregroundLightStatic: - return UIColor(light: GlobalTokens.neutralColor(.white), - dark: GlobalTokens.neutralColor(.white)) - case .background1: - return UIColor(light: GlobalTokens.neutralColor(.white), - dark: GlobalTokens.neutralColor(.black), - darkElevated: GlobalTokens.neutralColor(.grey4)) - case .background1Pressed: - return UIColor(light: GlobalTokens.neutralColor(.grey88), - dark: GlobalTokens.neutralColor(.grey18), - darkElevated: GlobalTokens.neutralColor(.grey18)) - case .background1Selected: - return UIColor(light: GlobalTokens.neutralColor(.grey92), - dark: GlobalTokens.neutralColor(.grey14), - darkElevated: GlobalTokens.neutralColor(.grey14)) - case .background2: - return UIColor(light: GlobalTokens.neutralColor(.white), - dark: GlobalTokens.neutralColor(.grey12), - darkElevated: GlobalTokens.neutralColor(.grey16)) - case .background2Pressed: - return UIColor(light: GlobalTokens.neutralColor(.grey88), - dark: GlobalTokens.neutralColor(.grey30), - darkElevated: GlobalTokens.neutralColor(.grey30)) - case .background2Selected: - return UIColor(light: GlobalTokens.neutralColor(.grey92), - dark: GlobalTokens.neutralColor(.grey26), - darkElevated: GlobalTokens.neutralColor(.grey26)) - case .background3: - return UIColor(light: GlobalTokens.neutralColor(.white), - dark: GlobalTokens.neutralColor(.grey16), - darkElevated: GlobalTokens.neutralColor(.grey20)) - case .background3Pressed: - return UIColor(light: GlobalTokens.neutralColor(.grey88), - dark: GlobalTokens.neutralColor(.grey34), - darkElevated: GlobalTokens.neutralColor(.grey34)) - case .background3Selected: - return UIColor(light: GlobalTokens.neutralColor(.grey92), - dark: GlobalTokens.neutralColor(.grey30), - darkElevated: GlobalTokens.neutralColor(.grey30)) - case .background4: - return UIColor(light: GlobalTokens.neutralColor(.grey98), - dark: GlobalTokens.neutralColor(.grey20), - darkElevated: GlobalTokens.neutralColor(.grey24)) - case .background4Pressed: - return UIColor(light: GlobalTokens.neutralColor(.grey86), - dark: GlobalTokens.neutralColor(.grey38), - darkElevated: GlobalTokens.neutralColor(.grey38)) - case .background4Selected: - return UIColor(light: GlobalTokens.neutralColor(.grey90), - dark: GlobalTokens.neutralColor(.grey34), - darkElevated: GlobalTokens.neutralColor(.grey34)) - case .background5: - return UIColor(light: GlobalTokens.neutralColor(.grey94), - dark: GlobalTokens.neutralColor(.grey24), - darkElevated: GlobalTokens.neutralColor(.grey28)) - case .background5Pressed: - return UIColor(light: GlobalTokens.neutralColor(.grey82), - dark: GlobalTokens.neutralColor(.grey42), - darkElevated: GlobalTokens.neutralColor(.grey42)) - case .background5Selected: - return UIColor(light: GlobalTokens.neutralColor(.grey86), - dark: GlobalTokens.neutralColor(.grey38), - darkElevated: GlobalTokens.neutralColor(.grey38)) - case .background6: - return UIColor(light: GlobalTokens.neutralColor(.grey82), - dark: GlobalTokens.neutralColor(.grey36), - darkElevated: GlobalTokens.neutralColor(.grey40)) - case .backgroundDisabled: - return UIColor(light: GlobalTokens.neutralColor(.grey88), - dark: GlobalTokens.neutralColor(.grey32), - darkElevated: GlobalTokens.neutralColor(.grey32)) - case .brandBackgroundTint: - return UIColor(light: GlobalTokens.brandColor(.comm150), - dark: GlobalTokens.brandColor(.comm40)) - case .brandBackground1: - return UIColor(light: GlobalTokens.brandColor(.comm80), - dark: GlobalTokens.brandColor(.comm100)) - case .brandBackground1Pressed: - return UIColor(light: GlobalTokens.brandColor(.comm50), - dark: GlobalTokens.brandColor(.comm140)) - case .brandBackground1Selected: - return UIColor(light: GlobalTokens.brandColor(.comm60), - dark: GlobalTokens.brandColor(.comm120)) - case .brandBackground2: - return UIColor(light: GlobalTokens.brandColor(.comm70)) - case .brandBackground2Pressed: - return UIColor(light: GlobalTokens.brandColor(.comm40)) - case .brandBackground2Selected: - return UIColor(light: GlobalTokens.brandColor(.comm80)) - case .brandBackground3: - return UIColor(light: GlobalTokens.brandColor(.comm60), - dark: GlobalTokens.brandColor(.comm120)) - case .brandBackgroundDisabled: - return UIColor(light: GlobalTokens.brandColor(.comm140), - dark: GlobalTokens.brandColor(.comm40)) - case .stencil1: - return UIColor(light: GlobalTokens.neutralColor(.grey90), - dark: GlobalTokens.neutralColor(.grey34)) - case .stencil2: - return UIColor(light: GlobalTokens.neutralColor(.grey98), - dark: GlobalTokens.neutralColor(.grey20)) - case .backgroundCanvas: - return UIColor(light: GlobalTokens.neutralColor(.grey96), - dark: GlobalTokens.neutralColor(.grey8), - darkElevated: GlobalTokens.neutralColor(.grey14)) - case .backgroundDarkStatic: - return UIColor(light: GlobalTokens.neutralColor(.grey14), - dark: GlobalTokens.neutralColor(.grey24), - darkElevated: GlobalTokens.neutralColor(.grey30)) - case .backgroundInverted: - return UIColor(light: GlobalTokens.neutralColor(.grey46), - dark: GlobalTokens.neutralColor(.grey72), - darkElevated: GlobalTokens.neutralColor(.grey78)) - case .backgroundLightStatic: - return UIColor(light: GlobalTokens.neutralColor(.white), - dark: GlobalTokens.neutralColor(.white), - darkElevated: GlobalTokens.neutralColor(.white)) - case .backgroundLightStaticDisabled: - return UIColor(light: GlobalTokens.neutralColor(.white), - dark: GlobalTokens.neutralColor(.grey68), - darkElevated: GlobalTokens.neutralColor(.grey42)) - case .stroke1: - return UIColor(light: GlobalTokens.neutralColor(.grey82), - dark: GlobalTokens.neutralColor(.grey30), - darkElevated: GlobalTokens.neutralColor(.grey36)) - case .stroke1Pressed: - return UIColor(light: GlobalTokens.neutralColor(.grey70), - dark: GlobalTokens.neutralColor(.grey48)) - case .stroke2: - return UIColor(light: GlobalTokens.neutralColor(.grey88), - dark: GlobalTokens.neutralColor(.grey24), - darkElevated: GlobalTokens.neutralColor(.grey30)) - case .strokeAccessible: - return UIColor(light: GlobalTokens.neutralColor(.grey38), - dark: GlobalTokens.neutralColor(.grey62), - darkElevated: GlobalTokens.neutralColor(.grey68)) - case .strokeFocus1: - return UIColor(light: GlobalTokens.neutralColor(.white), - dark: GlobalTokens.neutralColor(.black)) - case .strokeFocus2: - return UIColor(light: GlobalTokens.neutralColor(.black), - dark: GlobalTokens.neutralColor(.white)) - case .strokeDisabled: - return UIColor(light: GlobalTokens.neutralColor(.grey88), - dark: GlobalTokens.neutralColor(.grey26), - darkElevated: GlobalTokens.neutralColor(.grey32)) - case .brandStroke1: - return UIColor(light: GlobalTokens.brandColor(.comm80), - dark: GlobalTokens.brandColor(.comm100)) - case .brandStroke1Pressed: - return UIColor(light: GlobalTokens.brandColor(.comm50), - dark: GlobalTokens.brandColor(.comm140)) - case .brandStroke1Selected: - return UIColor(light: GlobalTokens.brandColor(.comm60), - dark: GlobalTokens.brandColor(.comm120)) - case .dangerBackground1: - return UIColor(light: GlobalTokens.sharedColor(.red, .tint60), - dark: GlobalTokens.sharedColor(.red, .shade40)) - case .dangerBackground2: - return UIColor(light: GlobalTokens.sharedColor(.red, .primary), - dark: GlobalTokens.sharedColor(.red, .shade10)) - case .dangerForeground1: - return UIColor(light: GlobalTokens.sharedColor(.red, .shade10), - dark: GlobalTokens.sharedColor(.red, .tint30)) - case .dangerForeground2: - return UIColor(light: GlobalTokens.sharedColor(.red, .primary), - dark: GlobalTokens.sharedColor(.red, .tint30)) - case .dangerStroke1: - return UIColor(light: GlobalTokens.sharedColor(.red, .tint20), - dark: GlobalTokens.sharedColor(.red, .tint20)) - case .dangerStroke2: - return UIColor(light: GlobalTokens.sharedColor(.red, .primary), - dark: GlobalTokens.sharedColor(.red, .tint30)) - case .successBackground1: - return UIColor(light: GlobalTokens.sharedColor(.green, .tint60), - dark: GlobalTokens.sharedColor(.green, .shade40)) - case .successBackground2: - return UIColor(light: GlobalTokens.sharedColor(.green, .primary), - dark: GlobalTokens.sharedColor(.green, .shade10)) - case .successForeground1: - return UIColor(light: GlobalTokens.sharedColor(.green, .shade10), - dark: GlobalTokens.sharedColor(.green, .tint30)) - case .successForeground2: - return UIColor(light: GlobalTokens.sharedColor(.green, .primary), - dark: GlobalTokens.sharedColor(.green, .tint30)) - case .successStroke1: - return UIColor(light: GlobalTokens.sharedColor(.green, .tint20), - dark: GlobalTokens.sharedColor(.green, .tint20)) - case .severeBackground1: - return UIColor(light: GlobalTokens.sharedColor(.darkOrange, .tint60), - dark: GlobalTokens.sharedColor(.darkOrange, .shade40)) - case .severeBackground2: - return UIColor(light: GlobalTokens.sharedColor(.darkOrange, .primary), - dark: GlobalTokens.sharedColor(.darkOrange, .shade10)) - case .severeForeground1: - return UIColor(light: GlobalTokens.sharedColor(.darkOrange, .shade10), - dark: GlobalTokens.sharedColor(.darkOrange, .tint30)) - case .severeForeground2: - return UIColor(light: GlobalTokens.sharedColor(.darkOrange, .shade20), - dark: GlobalTokens.sharedColor(.darkOrange, .tint30)) - case .severeStroke1: - return UIColor(light: GlobalTokens.sharedColor(.darkOrange, .tint10), - dark: GlobalTokens.sharedColor(.darkOrange, .tint20)) - case .warningBackground1: - return UIColor(light: GlobalTokens.sharedColor(.yellow, .tint60), - dark: GlobalTokens.sharedColor(.yellow, .shade40)) - case .warningBackground2: - return UIColor(light: GlobalTokens.sharedColor(.yellow, .primary), - dark: GlobalTokens.sharedColor(.yellow, .shade10)) - case .warningForeground1: - return UIColor(light: GlobalTokens.sharedColor(.yellow, .shade30), - dark: GlobalTokens.sharedColor(.yellow, .tint30)) - case .warningForeground2: - return UIColor(light: GlobalTokens.sharedColor(.yellow, .shade30), - dark: GlobalTokens.sharedColor(.yellow, .tint30)) - case .warningStroke1: - return UIColor(light: GlobalTokens.sharedColor(.yellow, .shade30), - dark: GlobalTokens.sharedColor(.yellow, .shade20)) - case .presenceAway: - return UIColor(light: GlobalTokens.sharedColor(.marigold, .primary)) - case .presenceDnd: - return UIColor(light: GlobalTokens.sharedColor(.red, .primary), - dark: GlobalTokens.sharedColor(.red, .tint10)) - case .presenceAvailable: - return UIColor(light: GlobalTokens.sharedColor(.lightGreen, .primary), - dark: GlobalTokens.sharedColor(.lightGreen, .tint20)) - case .presenceOof: - return UIColor(light: GlobalTokens.sharedColor(.berry, .primary), - dark: GlobalTokens.sharedColor(.berry, .tint20)) - } - } - - static func defaultShadow(_ token: ShadowToken) -> ShadowInfo { - switch token { - case .clear: - return ShadowInfo(keyColor: .clear, - keyBlur: 0.0, - xKey: 0.0, - yKey: 0.0, - ambientColor: .clear, - ambientBlur: 0.0, - xAmbient: 0.0, - yAmbient: 0.0) - case .shadow02: - return ShadowInfo(keyColor: UIColor(light: UIColor(red: 0.0, green: 0.0, blue: 0.0, alpha: 0.14), - dark: UIColor(red: 0.0, green: 0.0, blue: 0.0, alpha: 0.28)), - keyBlur: 2, - xKey: 0, - yKey: 1, - ambientColor: UIColor(light: UIColor(red: 0.0, green: 0.0, blue: 0.0, alpha: 0.12), - dark: UIColor(red: 0.0, green: 0.0, blue: 0.0, alpha: 0.20)), - ambientBlur: 2, - xAmbient: 0, - yAmbient: 0) - case .shadow04: - return ShadowInfo(keyColor: UIColor(light: UIColor(red: 0.0, green: 0.0, blue: 0.0, alpha: 0.14), - dark: UIColor(red: 0.0, green: 0.0, blue: 0.0, alpha: 0.28)), - keyBlur: 4, - xKey: 0, - yKey: 2, - ambientColor: UIColor(light: UIColor(red: 0.0, green: 0.0, blue: 0.0, alpha: 0.12), - dark: UIColor(red: 0.0, green: 0.0, blue: 0.0, alpha: 0.20)), - ambientBlur: 2, - xAmbient: 0, - yAmbient: 0) - case .shadow08: - return ShadowInfo(keyColor: UIColor(light: UIColor(red: 0.0, green: 0.0, blue: 0.0, alpha: 0.14), - dark: UIColor(red: 0.0, green: 0.0, blue: 0.0, alpha: 0.28)), - keyBlur: 8, - xKey: 0, - yKey: 4, - ambientColor: UIColor(light: UIColor(red: 0.0, green: 0.0, blue: 0.0, alpha: 0.12), - dark: UIColor(red: 0.0, green: 0.0, blue: 0.0, alpha: 0.20)), - ambientBlur: 2, - xAmbient: 0, - yAmbient: 0) - case .shadow16: - return ShadowInfo(keyColor: UIColor(light: UIColor(red: 0.0, green: 0.0, blue: 0.0, alpha: 0.14), - dark: UIColor(red: 0.0, green: 0.0, blue: 0.0, alpha: 0.28)), - keyBlur: 16, - xKey: 0, - yKey: 8, - ambientColor: UIColor(light: UIColor(red: 0.0, green: 0.0, blue: 0.0, alpha: 0.12), - dark: UIColor(red: 0.0, green: 0.0, blue: 0.0, alpha: 0.20)), - ambientBlur: 2, - xAmbient: 0, - yAmbient: 0) - case .shadow28: - return ShadowInfo(keyColor: UIColor(light: UIColor(red: 0.0, green: 0.0, blue: 0.0, alpha: 0.24), - dark: UIColor(red: 0.0, green: 0.0, blue: 0.0, alpha: 0.48)), - keyBlur: 28, - xKey: 0, - yKey: 14, - ambientColor: UIColor(light: UIColor(red: 0.0, green: 0.0, blue: 0.0, alpha: 0.20), - dark: UIColor(red: 0.0, green: 0.0, blue: 0.0, alpha: 0.40)), - ambientBlur: 8, - xAmbient: 0, - yAmbient: 0) - case .shadow64: - return ShadowInfo(keyColor: UIColor(light: UIColor(red: 0.0, green: 0.0, blue: 0.0, alpha: 0.24), - dark: UIColor(red: 0.0, green: 0.0, blue: 0.0, alpha: 0.48)), - keyBlur: 64, - xKey: 0, - yKey: 32, - ambientColor: UIColor(light: UIColor(red: 0.0, green: 0.0, blue: 0.0, alpha: 0.20), - dark: UIColor(red: 0.0, green: 0.0, blue: 0.0, alpha: 0.40)), - ambientBlur: 8, - xAmbient: 0, - yAmbient: 0) - } - } - - static func defaultTypography(_ token: TypographyToken) -> FontInfo { - switch token { - case .display: - return .init(size: GlobalTokens.fontSize(.size900), - weight: GlobalTokens.fontWeight(.bold)) - case .largeTitle: - return .init(size: GlobalTokens.fontSize(.size800), - weight: GlobalTokens.fontWeight(.bold)) - case .title1: - return .init(size: GlobalTokens.fontSize(.size700), - weight: GlobalTokens.fontWeight(.bold)) - case .title2: - return .init(size: GlobalTokens.fontSize(.size600), - weight: GlobalTokens.fontWeight(.semibold)) - case .title3: - return .init(size: GlobalTokens.fontSize(.size500), - weight: GlobalTokens.fontWeight(.semibold)) - case .body1Strong: - return .init(size: GlobalTokens.fontSize(.size400), - weight: GlobalTokens.fontWeight(.semibold)) - case .body1: - return .init(size: GlobalTokens.fontSize(.size400), - weight: GlobalTokens.fontWeight(.regular)) - case .body2Strong: - return .init(size: GlobalTokens.fontSize(.size300), - weight: GlobalTokens.fontWeight(.semibold)) - case .body2: - return .init(size: GlobalTokens.fontSize(.size300), - weight: GlobalTokens.fontWeight(.regular)) - case .caption1Strong: - return .init(size: GlobalTokens.fontSize(.size200), - weight: GlobalTokens.fontWeight(.semibold)) - case .caption1: - return .init(size: GlobalTokens.fontSize(.size200), - weight: GlobalTokens.fontWeight(.regular)) - case .caption2: - return .init(size: GlobalTokens.fontSize(.size100), - weight: GlobalTokens.fontWeight(.regular)) - } - } - - /// Derives its default values from the theme's `colorTokenSet` values - static func defaultGradientColor(_ token: GradientToken, colorTokenSet: TokenSet) -> [UIColor] { - switch token { - case .flair: - return [colorTokenSet[.brandGradient1], - colorTokenSet[.brandGradient2], - colorTokenSet[.brandGradient3]] - case .tint: - return [colorTokenSet[.brandGradient2], - colorTokenSet[.brandGradient3]] - } - } - -} diff --git a/ios/FluentUI/Core/Theme/Tokens/AliasTokens.swift b/ios/FluentUI/Core/Theme/Tokens/AliasTokens.swift deleted file mode 100644 index fbcba887c0..0000000000 --- a/ios/FluentUI/Core/Theme/Tokens/AliasTokens.swift +++ /dev/null @@ -1,210 +0,0 @@ -// -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. -// - -import SwiftUI - -/// Alias Tokens represent a unified set of semantic values to be used by Fluent UI. -/// -/// Values are derived from the Fluent UI design token system at https://github.com/microsoft/fluentui-design-tokens. -@available(*, deprecated, message: "`AliasTokens` is now deprecated. Please fetch all token values from `FluentTheme` directly.") -@objc(MSFAliasTokens) -public final class AliasTokens: NSObject { - - // MARK: - Typography - - @objc(MSFTypographyAliasTokens) - public enum TypographyTokens: Int, TokenSetKey { - case display - case largeTitle - case title1 - case title2 - case title3 - case body1Strong - case body1 - case body2Strong - case body2 - case caption1Strong - case caption1 - case caption2 - } - - @available(*, deprecated, message: "`AliasTokens` is now deprecated. Please use `typography` on `FluentTheme`.") - @available(swift, obsoleted: 1.0, message: "This method exists for Objective-C backwards compatibility and should not be invoked from Swift. Please use the `typography` property directly.") - @objc(typographyForToken:) - public func typography(_ token: TypographyTokens) -> FontInfo { - return typography[token] - } - - public let typography: TokenSet - - // MARK: - Shadow - - @objc(MSFShadowAliasTokens) - public enum ShadowTokens: Int, TokenSetKey { - case clear - case shadow02 - case shadow04 - case shadow08 - case shadow16 - case shadow28 - case shadow64 - } - - @available(*, deprecated, message: "`AliasTokens` is now deprecated. Please use `shadow` on `FluentTheme`.") - @available(swift, obsoleted: 1.0, message: "This method exists for Objective-C backwards compatibility and should not be invoked from Swift. Please use the `shadow` property directly.") - @objc(shadowForToken:) - public func shadow(_ token: ShadowTokens) -> ShadowInfo { - return shadow[token] - } - - public let shadow: TokenSet - - // MARK: - Colors - - @objc(MSFColorAliasTokens) - public enum ColorsTokens: Int, TokenSetKey { - // Neutral colors - Background - case background1 - case background1Pressed - case background1Selected - case background2 - case background2Pressed - case background2Selected - case background3 - case background3Pressed - case background3Selected - case background4 - case background4Pressed - case background4Selected - case background5 - case background5Pressed - case background5Selected - case background6 - case backgroundCanvas - case backgroundDarkStatic - case backgroundLightStatic - case backgroundLightStaticDisabled - case backgroundInverted - case backgroundDisabled - case stencil1 - case stencil2 - - // Neutral colors - Foreground - case foreground1 - case foreground2 - case foreground3 - case foregroundDisabled1 - case foregroundDisabled2 - case foregroundOnColor - case foregroundDarkStatic - case foregroundLightStatic - - // Neutral colors - Stroke - case stroke1 - case stroke1Pressed - case stroke2 - case strokeAccessible - case strokeFocus1 - case strokeFocus2 - case strokeDisabled - - // Brand colors - Brand background - case brandBackground1 - case brandBackground1Pressed - case brandBackground1Selected - case brandBackground2 - case brandBackground2Pressed - case brandBackground2Selected - case brandBackground3 - case brandBackgroundTint - case brandBackgroundDisabled - - // Brand colors - Brand foreground - case brandForeground1 - case brandForeground1Pressed - case brandForeground1Selected - case brandForegroundTint - case brandForegroundDisabled1 - case brandForegroundDisabled2 - - // Brand colors - Brand gradient - case brandGradient1 - case brandGradient2 - case brandGradient3 - - // Brand colors - Brand stroke - case brandStroke1 - case brandStroke1Pressed - case brandStroke1Selected - - // Shared colors - Error & Status - case dangerBackground1 - case dangerBackground2 - case dangerForeground1 - case dangerForeground2 - case dangerStroke1 - case dangerStroke2 - case successBackground1 - case successBackground2 - case successForeground1 - case successForeground2 - case successStroke1 - case warningBackground1 - case warningBackground2 - case warningForeground1 - case warningForeground2 - case warningStroke1 - case severeBackground1 - case severeBackground2 - case severeForeground1 - case severeForeground2 - case severeStroke1 - - // Shared colors - Presence - case presenceAway - case presenceDnd - case presenceAvailable - case presenceOof - } - - @available(*, deprecated, message: "`AliasTokens` is now deprecated. Please use `color` on `FluentTheme`.") - @available(swift, obsoleted: 1.0, message: "This method exists for Objective-C backwards compatibility and should not be invoked from Swift. Please use the `colors` property directly.") - @objc(aliasColorForToken:) - public func color(_ token: ColorsTokens) -> DynamicColor { - return colors[token] - } - public private(set) var colors: TokenSet - - // MARK: - Gradient Colors - - @objc(MSFGradientColorAliasTokens) - public enum GradientTokens: Int, TokenSetKey { - case flair - case tint - } - - @available(*, deprecated, message: "`AliasTokens` is now deprecated. Please use `gradient` on `FluentTheme`.") - @available(swift, obsoleted: 1.0, message: "This method exists for Objective-C backwards compatibility and should not be invoked from Swift. Please use the `gradientColors` property directly.") - @objc(aliasGradientColorsForToken:) - public func gradientColors(_ token: GradientTokens) -> [UIColor] { - return gradients[token] - } - public let gradients: TokenSet - - // MARK: Initialization - - init(colorTokenSet: TokenSet, - shadowTokenSet: TokenSet, - typographyTokenSet: TokenSet, - gradientTokenSet: TokenSet) { - - self.colors = .init { colorTokenSet[FluentTheme.ColorToken(rawValue: $0.rawValue)!].dynamicColor! } - self.shadow = .init { shadowTokenSet[FluentTheme.ShadowToken(rawValue: $0.rawValue)!] } - self.typography = .init { typographyTokenSet[FluentTheme.TypographyToken(rawValue: $0.rawValue)!] } - self.gradients = .init { gradientTokenSet[FluentTheme.GradientToken(rawValue: $0.rawValue)!] } - - super.init() - } -} diff --git a/ios/FluentUI/Core/Theme/Tokens/DynamicColor.swift b/ios/FluentUI/Core/Theme/Tokens/DynamicColor.swift deleted file mode 100644 index 0881204852..0000000000 --- a/ios/FluentUI/Core/Theme/Tokens/DynamicColor.swift +++ /dev/null @@ -1,194 +0,0 @@ -// -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. -// - -import SwiftUI - -/// A platform-agnostic representation of a 32-bit RGBA color value. -@available(*, deprecated, message: "Please use UIColor or Color directly.") -@objc(MSFColorValue) -public class ColorValue: NSObject { - - public static let clear: ColorValue = .init(r: 0.0, g: 0.0, b: 0.0, a: 0.0) - - /// Creates a color value instance with the specified three-channel, 8-bit-per-channel color value, usually in hex. - /// - /// For example: `0xFF0000` represents red, `0x00FF00` green, and `0x0000FF` blue. - /// There is no way to specify an alpha channel via this initializer. For that, use `init(r:g:b:a)` instead. - /// - /// - Parameter hexValue: The color value to store, in 24-bit (three-channel, 8-bit) RGB. - /// - /// - Returns: A color object that stores the provided color information. - @objc public init(_ hexValue: UInt32) { - self.hexValue = hexValue << 8 | 0xFF - } - - /// Creates a color value instance with the specified channel values. - /// - /// Parameters work just like `UIColor`, `NSColor`, or `SwiftUI.Color`, and should all be in the range of `0.0 ≤ value ≤ 1.0`. - /// Any channel that is above 1.0 will be clipped down to 1.0; results are undefined for negative inputs. - /// - /// - Parameter r: The red channel. - /// - Parameter g: The green channel. - /// - Parameter b: The blue channel. - /// - Parameter a: The alpha channel. - /// - /// - Returns: A color object that stores the provided color information. - @objc public init(r: CGFloat, - g: CGFloat, - b: CGFloat, - a: CGFloat) { - hexValue = (min(UInt32(r * 255.0), 0xFF) << 24) | - (min(UInt32(g * 255.0), 0xFF) << 16) | - (min(UInt32(b * 255.0), 0xFF) << 8) | - (min(UInt32(a * 255.0), 0xFF)) - } - - var r: CGFloat { CGFloat((hexValue & 0xFF000000) >> 24) / 255.0 } - var g: CGFloat { CGFloat((hexValue & 0x00FF0000) >> 16) / 255.0 } - var b: CGFloat { CGFloat((hexValue & 0x0000FF00) >> 8) / 255.0 } - var a: CGFloat { CGFloat(hexValue & 0x000000FF) / 255.0 } - - // Value is stored in RGBA format. - private let hexValue: UInt32 -} - -/// Represents a set of color values to be used in different contexts. -@available(*, deprecated, message: "Please use UIColor or Color directly.") -@objc(MSFDynamicColor) -public class DynamicColor: NSObject { - - /// Creates a dynamic color object that wraps a set of color values for various rendering contexts. - /// - /// - Parameter light: The default color for a light context. Required. - /// - Parameter lightHighContrast: The override color for a light, high contrast context. Optional. - /// - Parameter lightElevated: The override color for a light, elevated context. Optional. - /// - Parameter lightElevatedHighContrast: The override color for a light, elevated, high contrast context. Optional. - /// - Parameter dark: The override color for a dark context. Optional. - /// - Parameter darkHighContrast: The override color for a dark, high contrast context. Optional. - /// - Parameter darkElevated: The override color for a dark, elevated context. Optional. - /// - Parameter darkElevatedHighContrast: The override color for a dark, elevated, high contrast context. Optional. - @objc public init(light: ColorValue, - lightHighContrast: ColorValue? = nil, - lightElevated: ColorValue? = nil, - lightElevatedHighContrast: ColorValue? = nil, - dark: ColorValue? = nil, - darkHighContrast: ColorValue? = nil, - darkElevated: ColorValue? = nil, - darkElevatedHighContrast: ColorValue? = nil) { - self.light = light - self.lightHighContrast = lightHighContrast - self.lightElevated = lightElevated - self.lightElevatedHighContrast = lightElevatedHighContrast - self.dark = dark - self.darkHighContrast = darkHighContrast - self.darkElevated = darkElevated - self.darkElevatedHighContrast = darkElevatedHighContrast - } - - /// The default color for a light context. Required. - let light: ColorValue - - /// The override color for a light, high contrast context. Optional. - let lightHighContrast: ColorValue? - - /// The override color for a light, elevated context. Optional. - let lightElevated: ColorValue? - - /// The override color for a light, elevated, high contrast context. Optional. - let lightElevatedHighContrast: ColorValue? - - /// The override color for a dark context. Optional. - let dark: ColorValue? - - /// The override color for a dark, high contrast context. Optional. - let darkHighContrast: ColorValue? - - /// The override color for a dark, elevated context. Optional. - let darkElevated: ColorValue? - - /// The override color for a dark, elevated, high contrast context. Optional. - let darkElevatedHighContrast: ColorValue? - - // MARK: - Internal functions - - /// Returns an appropriate color value based on the contextual info passed in. - /// - /// The decision order for choosing between the colors is based on the following questions, in order: - /// - Is the current `userInterfaceStyle` `.dark` or `.light`? - /// - Is the current `userInterfaceLevel` `.base` or `.elevated`? - /// - Is the current `accessibilityContrast` `.normal` or `.high`? - /// - /// - Parameters: - /// - colorScheme: The current color scheme, `.dark` or `.light`. - /// - contrast: The current contrast value, `.base` or `.elevated`. - /// - isElevated: Whether we are in an elevated context. - func value(colorScheme: ColorScheme, - contrast: ColorSchemeContrast, - isElevated: Bool) -> ColorValue { - if colorScheme == .dark, - let color = getColor(dark, - darkHighContrast, - darkElevated, - darkElevatedHighContrast, - contrast, - isElevated) { - return color - } else if let color = getColor(light, - lightHighContrast, - lightElevated, - lightElevatedHighContrast, - contrast, - isElevated) { - return color - } else { - preconditionFailure("Unable to choose color. Should not be reachable, as `light` color is non-optional.") - } - } - - // MARK: - Private functions - - private func getColorForContrast(_ default: ColorValue?, - _ highContrast: ColorValue?, - _ contrast: ColorSchemeContrast) -> ColorValue? { - if contrast == .increased, let color = highContrast { - return color - } - return `default` - } - - private func getColor(_ default: ColorValue?, - _ highContrast: ColorValue?, - _ elevated: ColorValue?, - _ elevatedHighContrast: ColorValue?, - _ contrast: ColorSchemeContrast, - _ isElevated: Bool) -> ColorValue? { - if isElevated == true, - let color = getColorForContrast(elevated, elevatedHighContrast, contrast) { - return color - } - return getColorForContrast(`default`, highContrast, contrast) - } -} - -// MARK: - Extensions - -public extension Color { - /// Creates a dynamic color object that returns the appropriate color value based on the current - /// rendering context. - /// - /// - Parameter dynamicColor: The set of color values that may be applied based on the current context. - @available(*, deprecated, message: "Please use Color directly, or init via UIColor.") - init(dynamicColor: DynamicColor) { - self.init(UIColor(dynamicColor: dynamicColor)) - } - - /// Creates a Color from a `ColorValue` instance. - /// - /// - Parameter colorValue: Color value to use to initialize this color. - @available(*, deprecated, message: "Please use Color directly, or init via UIColor.") - init(colorValue: ColorValue) { - self.init(UIColor(colorValue: colorValue)) - } -} diff --git a/ios/FluentUI/Core/Theme/Tokens/GlobalTokens.swift b/ios/FluentUI/Core/Theme/Tokens/GlobalTokens.swift deleted file mode 100644 index bb488b771a..0000000000 --- a/ios/FluentUI/Core/Theme/Tokens/GlobalTokens.swift +++ /dev/null @@ -1,3534 +0,0 @@ -// -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. -// - -import SwiftUI - -/// Global Tokens represent a unified set of constants to be used by Fluent UI. -/// -/// Values are derived from the Fluent UI design token system at https://github.com/microsoft/fluentui-design-tokens. -@objc(MSFGlobalTokens) -public class GlobalTokens: NSObject { - - // MARK: - BrandColor - - @objc(MSFGlobalTokensBrandColor) - public enum BrandColorToken: Int, TokenSetKey { - // Communication blue colors - case comm10 - case comm20 - case comm30 - case comm40 - case comm50 - case comm60 - case comm70 - case comm80 - case comm90 - case comm100 - case comm110 - case comm120 - case comm130 - case comm140 - case comm150 - case comm160 - - // Gradient colors - case gradientPrimaryLight - case gradientPrimaryDark - case gradientSecondaryLight - case gradientSecondaryDark - case gradientTertiaryLight - case gradientTertiaryDark - } - - @objc(colorForBrandColorToken:) - public static func brandColor(_ token: BrandColorToken) -> UIColor { - switch token { - case .comm10: - return UIColor(hexValue: 0x061724) - case .comm20: - return UIColor(hexValue: 0x082338) - case .comm30: - return UIColor(hexValue: 0x0A2E4A) - case .comm40: - return UIColor(hexValue: 0x0C3B5E) - case .comm50: - return UIColor(hexValue: 0x0E4775) - case .comm60: - return UIColor(hexValue: 0x0F548C) - case .comm70: - return UIColor(hexValue: 0x115EA3) - case .comm80: - return UIColor(hexValue: 0x0F6CBD) - case .comm90: - return UIColor(hexValue: 0x2886DE) - case .comm100: - return UIColor(hexValue: 0x479EF5) - case .comm110: - return UIColor(hexValue: 0x62ABF5) - case .comm120: - return UIColor(hexValue: 0x77B7F7) - case .comm130: - return UIColor(hexValue: 0x96C6FA) - case .comm140: - return UIColor(hexValue: 0xB4D6FA) - case .comm150: - return UIColor(hexValue: 0xCFE4FA) - case .comm160: - return UIColor(hexValue: 0xEBF3FC) - case .gradientPrimaryLight: - return UIColor(hexValue: 0x464FEB) - case .gradientPrimaryDark: - return UIColor(hexValue: 0x7385FF) - case .gradientSecondaryLight: - return UIColor(hexValue: 0x47CFFA) - case .gradientSecondaryDark: - return UIColor(hexValue: 0x7ADFFF) - case .gradientTertiaryLight: - return UIColor(hexValue: 0xB47CF8) - case .gradientTertiaryDark: - return UIColor(hexValue: 0xBF80FF) - } - } - - // MARK: - NeutralColor - - @objc(MSFGlobalTokensNeutralColor) - public enum NeutralColorToken: Int, TokenSetKey { - case black - case grey2 - case grey4 - case grey6 - case grey8 - case grey10 - case grey12 - case grey14 - case grey16 - case grey18 - case grey20 - case grey22 - case grey24 - case grey26 - case grey28 - case grey30 - case grey32 - case grey34 - case grey36 - case grey38 - case grey40 - case grey42 - case grey44 - case grey46 - case grey48 - case grey50 - case grey52 - case grey54 - case grey56 - case grey58 - case grey60 - case grey62 - case grey64 - case grey66 - case grey68 - case grey70 - case grey72 - case grey74 - case grey76 - case grey78 - case grey80 - case grey82 - case grey84 - case grey86 - case grey88 - case grey90 - case grey92 - case grey94 - case grey96 - case grey98 - case white - } - @objc(colorForNeutralColorToken:) - public static func neutralColor(_ token: NeutralColorToken) -> UIColor { - switch token { - case .black: - return UIColor(hexValue: 0x000000) - case .grey2: - return UIColor(hexValue: 0x050505) - case .grey4: - return UIColor(hexValue: 0x0A0A0A) - case .grey6: - return UIColor(hexValue: 0x0F0F0F) - case .grey8: - return UIColor(hexValue: 0x141414) - case .grey10: - return UIColor(hexValue: 0x1A1A1A) - case .grey12: - return UIColor(hexValue: 0x1F1F1F) - case .grey14: - return UIColor(hexValue: 0x242424) - case .grey16: - return UIColor(hexValue: 0x292929) - case .grey18: - return UIColor(hexValue: 0x2E2E2E) - case .grey20: - return UIColor(hexValue: 0x333333) - case .grey22: - return UIColor(hexValue: 0x383838) - case .grey24: - return UIColor(hexValue: 0x3D3D3D) - case .grey26: - return UIColor(hexValue: 0x424242) - case .grey28: - return UIColor(hexValue: 0x474747) - case .grey30: - return UIColor(hexValue: 0x4D4D4D) - case .grey32: - return UIColor(hexValue: 0x525252) - case .grey34: - return UIColor(hexValue: 0x575757) - case .grey36: - return UIColor(hexValue: 0x5C5C5C) - case .grey38: - return UIColor(hexValue: 0x616161) - case .grey40: - return UIColor(hexValue: 0x666666) - case .grey42: - return UIColor(hexValue: 0x6B6B6B) - case .grey44: - return UIColor(hexValue: 0x707070) - case .grey46: - return UIColor(hexValue: 0x757575) - case .grey48: - return UIColor(hexValue: 0x7A7A7A) - case .grey50: - return UIColor(hexValue: 0x808080) - case .grey52: - return UIColor(hexValue: 0x858585) - case .grey54: - return UIColor(hexValue: 0x8A8A8A) - case .grey56: - return UIColor(hexValue: 0x8F8F8F) - case .grey58: - return UIColor(hexValue: 0x949494) - case .grey60: - return UIColor(hexValue: 0x999999) - case .grey62: - return UIColor(hexValue: 0x9E9E9E) - case .grey64: - return UIColor(hexValue: 0xA3A3A3) - case .grey66: - return UIColor(hexValue: 0xA8A8A8) - case .grey68: - return UIColor(hexValue: 0xADADAD) - case .grey70: - return UIColor(hexValue: 0xB2B2B2) - case .grey72: - return UIColor(hexValue: 0xB8B8B8) - case .grey74: - return UIColor(hexValue: 0xBDBDBD) - case .grey76: - return UIColor(hexValue: 0xC2C2C2) - case .grey78: - return UIColor(hexValue: 0xC7C7C7) - case .grey80: - return UIColor(hexValue: 0xCCCCCC) - case .grey82: - return UIColor(hexValue: 0xD1D1D1) - case .grey84: - return UIColor(hexValue: 0xD6D6D6) - case .grey86: - return UIColor(hexValue: 0xDBDBDB) - case .grey88: - return UIColor(hexValue: 0xE0E0E0) - case .grey90: - return UIColor(hexValue: 0xE5E5E5) - case .grey92: - return UIColor(hexValue: 0xEBEBEB) - case .grey94: - return UIColor(hexValue: 0xF0F0F0) - case .grey96: - return UIColor(hexValue: 0xF5F5F5) - case .grey98: - return UIColor(hexValue: 0xFAFAFA) - case .white: - return UIColor(hexValue: 0xFFFFFF) - } - } - - // MARK: - SharedColor - - @objc(MSFGlobalTokensSharedColorSet) - public enum SharedColorSet: Int, TokenSetKey { - case darkRed - case burgundy - case cranberry - case red - case darkOrange - case bronze - case pumpkin - case orange - case peach - case marigold - case yellow - case gold - case brass - case brown - case darkBrown - case lime - case forest - case seafoam - case lightGreen - case green - case darkGreen - case lightTeal - case teal - case darkTeal - case cyan - case steel - case lightBlue - case blue - case royalBlue - case darkBlue - case cornflower - case navy - case lavender - case purple - case darkPurple - case orchid - case grape - case berry - case lilac - case pink - case hotPink - case magenta - case plum - case beige - case mink - case silver - case platinum - case anchor - case charcoal - } - - @objc(MSFGlobalTokensSharedColor) - public enum SharedColorToken: Int, TokenSetKey { - case shade50 - case shade40 - case shade30 - case shade20 - case shade10 - case primary - case tint10 - case tint20 - case tint30 - case tint40 - case tint50 - case tint60 - } - - @objc(colorForSharedColorSet:token:) - public static func sharedColor(_ sharedColor: SharedColorSet, _ token: SharedColorToken) -> UIColor { - switch sharedColor { - case .anchor: - switch token { - case .primary: - return UIColor(hexValue: 0x394146) - case .shade10: - return UIColor(hexValue: 0x333A3F) - case .shade20: - return UIColor(hexValue: 0x2B3135) - case .shade30: - return UIColor(hexValue: 0x202427) - case .shade40: - return UIColor(hexValue: 0x111315) - case .shade50: - return UIColor(hexValue: 0x090A0B) - case .tint10: - return UIColor(hexValue: 0x4D565C) - case .tint20: - return UIColor(hexValue: 0x626C72) - case .tint30: - return UIColor(hexValue: 0x808A90) - case .tint40: - return UIColor(hexValue: 0xBCC3C7) - case .tint50: - return UIColor(hexValue: 0xDBDFE1) - case .tint60: - return UIColor(hexValue: 0xF6F7F8) - } - case .beige: - switch token { - case .primary: - return UIColor(hexValue: 0x7A7574) - case .shade10: - return UIColor(hexValue: 0x6E6968) - case .shade20: - return UIColor(hexValue: 0x5D5958) - case .shade30: - return UIColor(hexValue: 0x444241) - case .shade40: - return UIColor(hexValue: 0x252323) - case .shade50: - return UIColor(hexValue: 0x141313) - case .tint10: - return UIColor(hexValue: 0x8A8584) - case .tint20: - return UIColor(hexValue: 0x9A9594) - case .tint30: - return UIColor(hexValue: 0xAFABAA) - case .tint40: - return UIColor(hexValue: 0xD7D4D4) - case .tint50: - return UIColor(hexValue: 0xEAE8E8) - case .tint60: - return UIColor(hexValue: 0xFAF9F9) - } - case .berry: - switch token { - case .primary: - return UIColor(hexValue: 0xC239B3) - case .shade10: - return UIColor(hexValue: 0xAF33A1) - case .shade20: - return UIColor(hexValue: 0x932B88) - case .shade30: - return UIColor(hexValue: 0x6D2064) - case .shade40: - return UIColor(hexValue: 0x3A1136) - case .shade50: - return UIColor(hexValue: 0x1F091D) - case .tint10: - return UIColor(hexValue: 0xC94CBC) - case .tint20: - return UIColor(hexValue: 0xD161C4) - case .tint30: - return UIColor(hexValue: 0xDA7ED0) - case .tint40: - return UIColor(hexValue: 0xEDBBE7) - case .tint50: - return UIColor(hexValue: 0xF5DAF2) - case .tint60: - return UIColor(hexValue: 0xFDF5FC) - } - case .blue: - switch token { - case .primary: - return UIColor(hexValue: 0x0078D4) - case .shade10: - return UIColor(hexValue: 0x006CBF) - case .shade20: - return UIColor(hexValue: 0x005BA1) - case .shade30: - return UIColor(hexValue: 0x004377) - case .shade40: - return UIColor(hexValue: 0x002440) - case .shade50: - return UIColor(hexValue: 0x001322) - case .tint10: - return UIColor(hexValue: 0x1A86D9) - case .tint20: - return UIColor(hexValue: 0x3595DE) - case .tint30: - return UIColor(hexValue: 0x5CAAE5) - case .tint40: - return UIColor(hexValue: 0xA9D3F2) - case .tint50: - return UIColor(hexValue: 0xD0E7F8) - case .tint60: - return UIColor(hexValue: 0xF3F9FD) - } - case .brass: - switch token { - case .primary: - return UIColor(hexValue: 0x986F0B) - case .shade10: - return UIColor(hexValue: 0x89640A) - case .shade20: - return UIColor(hexValue: 0x745408) - case .shade30: - return UIColor(hexValue: 0x553E06) - case .shade40: - return UIColor(hexValue: 0x2E2103) - case .shade50: - return UIColor(hexValue: 0x181202) - case .tint10: - return UIColor(hexValue: 0xA47D1E) - case .tint20: - return UIColor(hexValue: 0xB18C34) - case .tint30: - return UIColor(hexValue: 0xC1A256) - case .tint40: - return UIColor(hexValue: 0xE0CEA2) - case .tint50: - return UIColor(hexValue: 0xEFE4CB) - case .tint60: - return UIColor(hexValue: 0xFBF8F2) - } - case .bronze: - switch token { - case .primary: - return UIColor(hexValue: 0xA74109) - case .shade10: - return UIColor(hexValue: 0x963A08) - case .shade20: - return UIColor(hexValue: 0x7F3107) - case .shade30: - return UIColor(hexValue: 0x5E2405) - case .shade40: - return UIColor(hexValue: 0x321303) - case .shade50: - return UIColor(hexValue: 0x1B0A01) - case .tint10: - return UIColor(hexValue: 0xB2521E) - case .tint20: - return UIColor(hexValue: 0xBC6535) - case .tint30: - return UIColor(hexValue: 0xCA8057) - case .tint40: - return UIColor(hexValue: 0xE5BBA4) - case .tint50: - return UIColor(hexValue: 0xF1D9CC) - case .tint60: - return UIColor(hexValue: 0xFBF5F2) - } - case .brown: - switch token { - case .primary: - return UIColor(hexValue: 0x8E562E) - case .shade10: - return UIColor(hexValue: 0x804D29) - case .shade20: - return UIColor(hexValue: 0x6C4123) - case .shade30: - return UIColor(hexValue: 0x50301A) - case .shade40: - return UIColor(hexValue: 0x2B1A0E) - case .shade50: - return UIColor(hexValue: 0x170E07) - case .tint10: - return UIColor(hexValue: 0x9C663F) - case .tint20: - return UIColor(hexValue: 0xA97652) - case .tint30: - return UIColor(hexValue: 0xBB8F6F) - case .tint40: - return UIColor(hexValue: 0xDDC3B0) - case .tint50: - return UIColor(hexValue: 0xEDDED3) - case .tint60: - return UIColor(hexValue: 0xFAF7F4) - } - case .burgundy: - switch token { - case .primary: - return UIColor(hexValue: 0xA4262C) - case .shade10: - return UIColor(hexValue: 0x942228) - case .shade20: - return UIColor(hexValue: 0x7D1D21) - case .shade30: - return UIColor(hexValue: 0x5C1519) - case .shade40: - return UIColor(hexValue: 0x310B0D) - case .shade50: - return UIColor(hexValue: 0x1A0607) - case .tint10: - return UIColor(hexValue: 0xAF393E) - case .tint20: - return UIColor(hexValue: 0xBA4D52) - case .tint30: - return UIColor(hexValue: 0xC86C70) - case .tint40: - return UIColor(hexValue: 0xE4AFB2) - case .tint50: - return UIColor(hexValue: 0xF0D3D4) - case .tint60: - return UIColor(hexValue: 0xFBF4F4) - } - case .charcoal: - switch token { - case .primary: - return UIColor(hexValue: 0x393939) - case .shade10: - return UIColor(hexValue: 0x333333) - case .shade20: - return UIColor(hexValue: 0x2B2B2B) - case .shade30: - return UIColor(hexValue: 0x202020) - case .shade40: - return UIColor(hexValue: 0x111111) - case .shade50: - return UIColor(hexValue: 0x090909) - case .tint10: - return UIColor(hexValue: 0x515151) - case .tint20: - return UIColor(hexValue: 0x686868) - case .tint30: - return UIColor(hexValue: 0x888888) - case .tint40: - return UIColor(hexValue: 0xC4C4C4) - case .tint50: - return UIColor(hexValue: 0xDFDFDF) - case .tint60: - return UIColor(hexValue: 0xF7F7F7) - } - case .cornflower: - switch token { - case .primary: - return UIColor(hexValue: 0x4F6BED) - case .shade10: - return UIColor(hexValue: 0x4760D5) - case .shade20: - return UIColor(hexValue: 0x3C51B4) - case .shade30: - return UIColor(hexValue: 0x2C3C85) - case .shade40: - return UIColor(hexValue: 0x182047) - case .shade50: - return UIColor(hexValue: 0x0D1126) - case .tint10: - return UIColor(hexValue: 0x637CEF) - case .tint20: - return UIColor(hexValue: 0x778DF1) - case .tint30: - return UIColor(hexValue: 0x93A4F4) - case .tint40: - return UIColor(hexValue: 0xC8D1FA) - case .tint50: - return UIColor(hexValue: 0xE1E6FC) - case .tint60: - return UIColor(hexValue: 0xF7F9FE) - } - case .cranberry: - switch token { - case .primary: - return UIColor(hexValue: 0xC50F1F) - case .shade10: - return UIColor(hexValue: 0xB10E1C) - case .shade20: - return UIColor(hexValue: 0x960B18) - case .shade30: - return UIColor(hexValue: 0x6E0811) - case .shade40: - return UIColor(hexValue: 0x3B0509) - case .shade50: - return UIColor(hexValue: 0x200205) - case .tint10: - return UIColor(hexValue: 0xCC2635) - case .tint20: - return UIColor(hexValue: 0xD33F4C) - case .tint30: - return UIColor(hexValue: 0xDC626D) - case .tint40: - return UIColor(hexValue: 0xEEACB2) - case .tint50: - return UIColor(hexValue: 0xF6D1D5) - case .tint60: - return UIColor(hexValue: 0xFDF3F4) - } - case .cyan: - switch token { - case .primary: - return UIColor(hexValue: 0x0099BC) - case .shade10: - return UIColor(hexValue: 0x008AA9) - case .shade20: - return UIColor(hexValue: 0x00748F) - case .shade30: - return UIColor(hexValue: 0x005669) - case .shade40: - return UIColor(hexValue: 0x002E38) - case .shade50: - return UIColor(hexValue: 0x00181E) - case .tint10: - return UIColor(hexValue: 0x18A4C4) - case .tint20: - return UIColor(hexValue: 0x31AFCC) - case .tint30: - return UIColor(hexValue: 0x56BFD7) - case .tint40: - return UIColor(hexValue: 0xA4DEEB) - case .tint50: - return UIColor(hexValue: 0xCDEDF4) - case .tint60: - return UIColor(hexValue: 0xF2FAFC) - } - case .darkBlue: - switch token { - case .primary: - return UIColor(hexValue: 0x003966) - case .shade10: - return UIColor(hexValue: 0x00335C) - case .shade20: - return UIColor(hexValue: 0x002B4E) - case .shade30: - return UIColor(hexValue: 0x002039) - case .shade40: - return UIColor(hexValue: 0x00111F) - case .shade50: - return UIColor(hexValue: 0x000910) - case .tint10: - return UIColor(hexValue: 0x0E4A78) - case .tint20: - return UIColor(hexValue: 0x215C8B) - case .tint30: - return UIColor(hexValue: 0x4178A3) - case .tint40: - return UIColor(hexValue: 0x92B5D1) - case .tint50: - return UIColor(hexValue: 0xC2D6E7) - case .tint60: - return UIColor(hexValue: 0xEFF4F9) - } - case .darkBrown: - switch token { - case .primary: - return UIColor(hexValue: 0x4D291C) - case .shade10: - return UIColor(hexValue: 0x452519) - case .shade20: - return UIColor(hexValue: 0x3A1F15) - case .shade30: - return UIColor(hexValue: 0x2B1710) - case .shade40: - return UIColor(hexValue: 0x170C08) - case .shade50: - return UIColor(hexValue: 0x0C0704) - case .tint10: - return UIColor(hexValue: 0x623A2B) - case .tint20: - return UIColor(hexValue: 0x784D3E) - case .tint30: - return UIColor(hexValue: 0x946B5C) - case .tint40: - return UIColor(hexValue: 0xCAADA3) - case .tint50: - return UIColor(hexValue: 0xE3D2CB) - case .tint60: - return UIColor(hexValue: 0xF8F3F2) - } - case .darkGreen: - switch token { - case .primary: - return UIColor(hexValue: 0x0B6A0B) - case .shade10: - return UIColor(hexValue: 0x0A5F0A) - case .shade20: - return UIColor(hexValue: 0x085108) - case .shade30: - return UIColor(hexValue: 0x063B06) - case .shade40: - return UIColor(hexValue: 0x032003) - case .shade50: - return UIColor(hexValue: 0x021102) - case .tint10: - return UIColor(hexValue: 0x1A7C1A) - case .tint20: - return UIColor(hexValue: 0x2D8E2D) - case .tint30: - return UIColor(hexValue: 0x4DA64D) - case .tint40: - return UIColor(hexValue: 0x9AD29A) - case .tint50: - return UIColor(hexValue: 0xC6E7C6) - case .tint60: - return UIColor(hexValue: 0xF0F9F0) - } - case .darkOrange: - switch token { - case .primary: - return UIColor(hexValue: 0xDA3B01) - case .shade10: - return UIColor(hexValue: 0xC43501) - case .shade20: - return UIColor(hexValue: 0xA62D01) - case .shade30: - return UIColor(hexValue: 0x7A2101) - case .shade40: - return UIColor(hexValue: 0x411200) - case .shade50: - return UIColor(hexValue: 0x230900) - case .tint10: - return UIColor(hexValue: 0xDE501C) - case .tint20: - return UIColor(hexValue: 0xE36537) - case .tint30: - return UIColor(hexValue: 0xE9835E) - case .tint40: - return UIColor(hexValue: 0xF4BFAB) - case .tint50: - return UIColor(hexValue: 0xF9DCD1) - case .tint60: - return UIColor(hexValue: 0xFDF6F3) - } - case .darkPurple: - switch token { - case .primary: - return UIColor(hexValue: 0x401B6C) - case .shade10: - return UIColor(hexValue: 0x3A1861) - case .shade20: - return UIColor(hexValue: 0x311552) - case .shade30: - return UIColor(hexValue: 0x240F3C) - case .shade40: - return UIColor(hexValue: 0x130820) - case .shade50: - return UIColor(hexValue: 0x0A0411) - case .tint10: - return UIColor(hexValue: 0x512B7E) - case .tint20: - return UIColor(hexValue: 0x633E8F) - case .tint30: - return UIColor(hexValue: 0x7E5CA7) - case .tint40: - return UIColor(hexValue: 0xB9A3D3) - case .tint50: - return UIColor(hexValue: 0xD8CCE7) - case .tint60: - return UIColor(hexValue: 0xF5F2F9) - } - case .darkRed: - switch token { - case .primary: - return UIColor(hexValue: 0x750B1C) - case .shade10: - return UIColor(hexValue: 0x690A19) - case .shade20: - return UIColor(hexValue: 0x590815) - case .shade30: - return UIColor(hexValue: 0x420610) - case .shade40: - return UIColor(hexValue: 0x230308) - case .shade50: - return UIColor(hexValue: 0x130204) - case .tint10: - return UIColor(hexValue: 0x861B2C) - case .tint20: - return UIColor(hexValue: 0x962F3F) - case .tint30: - return UIColor(hexValue: 0xAC4F5E) - case .tint40: - return UIColor(hexValue: 0xD69CA5) - case .tint50: - return UIColor(hexValue: 0xE9C7CD) - case .tint60: - return UIColor(hexValue: 0xF9F0F2) - } - case .darkTeal: - switch token { - case .primary: - return UIColor(hexValue: 0x006666) - case .shade10: - return UIColor(hexValue: 0x005C5C) - case .shade20: - return UIColor(hexValue: 0x004E4E) - case .shade30: - return UIColor(hexValue: 0x003939) - case .shade40: - return UIColor(hexValue: 0x001F1F) - case .shade50: - return UIColor(hexValue: 0x001010) - case .tint10: - return UIColor(hexValue: 0x0E7878) - case .tint20: - return UIColor(hexValue: 0x218B8B) - case .tint30: - return UIColor(hexValue: 0x41A3A3) - case .tint40: - return UIColor(hexValue: 0x92D1D1) - case .tint50: - return UIColor(hexValue: 0xC2E7E7) - case .tint60: - return UIColor(hexValue: 0xEFF9F9) - } - case .forest: - switch token { - case .primary: - return UIColor(hexValue: 0x498205) - case .shade10: - return UIColor(hexValue: 0x427505) - case .shade20: - return UIColor(hexValue: 0x376304) - case .shade30: - return UIColor(hexValue: 0x294903) - case .shade40: - return UIColor(hexValue: 0x162702) - case .shade50: - return UIColor(hexValue: 0x0C1501) - case .tint10: - return UIColor(hexValue: 0x599116) - case .tint20: - return UIColor(hexValue: 0x6BA02B) - case .tint30: - return UIColor(hexValue: 0x85B44C) - case .tint40: - return UIColor(hexValue: 0xBDD99B) - case .tint50: - return UIColor(hexValue: 0xDBEBC7) - case .tint60: - return UIColor(hexValue: 0xF6FAF0) - } - case .gold: - switch token { - case .primary: - return UIColor(hexValue: 0xC19C00) - case .shade10: - return UIColor(hexValue: 0xAE8C00) - case .shade20: - return UIColor(hexValue: 0x937700) - case .shade30: - return UIColor(hexValue: 0x6C5700) - case .shade40: - return UIColor(hexValue: 0x3A2F00) - case .shade50: - return UIColor(hexValue: 0x1F1900) - case .tint10: - return UIColor(hexValue: 0xC8A718) - case .tint20: - return UIColor(hexValue: 0xD0B232) - case .tint30: - return UIColor(hexValue: 0xDAC157) - case .tint40: - return UIColor(hexValue: 0xECDFA5) - case .tint50: - return UIColor(hexValue: 0xF5EECE) - case .tint60: - return UIColor(hexValue: 0xFDFBF2) - } - case .grape: - switch token { - case .primary: - return UIColor(hexValue: 0x881798) - case .shade10: - return UIColor(hexValue: 0x7A1589) - case .shade20: - return UIColor(hexValue: 0x671174) - case .shade30: - return UIColor(hexValue: 0x4C0D55) - case .shade40: - return UIColor(hexValue: 0x29072E) - case .shade50: - return UIColor(hexValue: 0x160418) - case .tint10: - return UIColor(hexValue: 0x952AA4) - case .tint20: - return UIColor(hexValue: 0xA33FB1) - case .tint30: - return UIColor(hexValue: 0xB55FC1) - case .tint40: - return UIColor(hexValue: 0xD9A7E0) - case .tint50: - return UIColor(hexValue: 0xEACEEF) - case .tint60: - return UIColor(hexValue: 0xFAF2FB) - } - case .green: - switch token { - case .primary: - return UIColor(hexValue: 0x107C10) - case .shade10: - return UIColor(hexValue: 0x0E700E) - case .shade20: - return UIColor(hexValue: 0x0C5E0C) - case .shade30: - return UIColor(hexValue: 0x094509) - case .shade40: - return UIColor(hexValue: 0x052505) - case .shade50: - return UIColor(hexValue: 0x031403) - case .tint10: - return UIColor(hexValue: 0x218C21) - case .tint20: - return UIColor(hexValue: 0x359B35) - case .tint30: - return UIColor(hexValue: 0x54B054) - case .tint40: - return UIColor(hexValue: 0x9FD89F) - case .tint50: - return UIColor(hexValue: 0xC9EAC9) - case .tint60: - return UIColor(hexValue: 0xF1FAF1) - } - case .hotPink: - switch token { - case .primary: - return UIColor(hexValue: 0xE3008C) - case .shade10: - return UIColor(hexValue: 0xCC007E) - case .shade20: - return UIColor(hexValue: 0xAD006A) - case .shade30: - return UIColor(hexValue: 0x7F004E) - case .shade40: - return UIColor(hexValue: 0x44002A) - case .shade50: - return UIColor(hexValue: 0x240016) - case .tint10: - return UIColor(hexValue: 0xE61C99) - case .tint20: - return UIColor(hexValue: 0xEA38A6) - case .tint30: - return UIColor(hexValue: 0xEE5FB7) - case .tint40: - return UIColor(hexValue: 0xF7ADDA) - case .tint50: - return UIColor(hexValue: 0xFBD2EB) - case .tint60: - return UIColor(hexValue: 0xFEF4FA) - } - case .lavender: - switch token { - case .primary: - return UIColor(hexValue: 0x7160E8) - case .shade10: - return UIColor(hexValue: 0x6656D1) - case .shade20: - return UIColor(hexValue: 0x5649B0) - case .shade30: - return UIColor(hexValue: 0x3F3682) - case .shade40: - return UIColor(hexValue: 0x221D46) - case .shade50: - return UIColor(hexValue: 0x120F25) - case .tint10: - return UIColor(hexValue: 0x8172EB) - case .tint20: - return UIColor(hexValue: 0x9184EE) - case .tint30: - return UIColor(hexValue: 0xA79CF1) - case .tint40: - return UIColor(hexValue: 0xD2CCF8) - case .tint50: - return UIColor(hexValue: 0xE7E4FB) - case .tint60: - return UIColor(hexValue: 0xF9F8FE) - } - case .lightBlue: - switch token { - case .primary: - return UIColor(hexValue: 0x3A96DD) - case .shade10: - return UIColor(hexValue: 0x3487C7) - case .shade20: - return UIColor(hexValue: 0x2C72A8) - case .shade30: - return UIColor(hexValue: 0x20547C) - case .shade40: - return UIColor(hexValue: 0x112D42) - case .shade50: - return UIColor(hexValue: 0x091823) - case .tint10: - return UIColor(hexValue: 0x4FA1E1) - case .tint20: - return UIColor(hexValue: 0x65ADE5) - case .tint30: - return UIColor(hexValue: 0x83BDEB) - case .tint40: - return UIColor(hexValue: 0xBFDDF5) - case .tint50: - return UIColor(hexValue: 0xDCEDFA) - case .tint60: - return UIColor(hexValue: 0xF6FAFE) - } - case .lightGreen: - switch token { - case .primary: - return UIColor(hexValue: 0x13A10E) - case .shade10: - return UIColor(hexValue: 0x11910D) - case .shade20: - return UIColor(hexValue: 0x0E7A0B) - case .shade30: - return UIColor(hexValue: 0x0B5A08) - case .shade40: - return UIColor(hexValue: 0x063004) - case .shade50: - return UIColor(hexValue: 0x031A02) - case .tint10: - return UIColor(hexValue: 0x27AC22) - case .tint20: - return UIColor(hexValue: 0x3DB838) - case .tint30: - return UIColor(hexValue: 0x5EC75A) - case .tint40: - return UIColor(hexValue: 0xA7E3A5) - case .tint50: - return UIColor(hexValue: 0xCEF0CD) - case .tint60: - return UIColor(hexValue: 0xF2FBF2) - } - case .lightTeal: - switch token { - case .primary: - return UIColor(hexValue: 0x00B7C3) - case .shade10: - return UIColor(hexValue: 0x00A5AF) - case .shade20: - return UIColor(hexValue: 0x008B94) - case .shade30: - return UIColor(hexValue: 0x00666D) - case .shade40: - return UIColor(hexValue: 0x00373A) - case .shade50: - return UIColor(hexValue: 0x001D1F) - case .tint10: - return UIColor(hexValue: 0x18BFCA) - case .tint20: - return UIColor(hexValue: 0x32C8D1) - case .tint30: - return UIColor(hexValue: 0x58D3DB) - case .tint40: - return UIColor(hexValue: 0xA6E9ED) - case .tint50: - return UIColor(hexValue: 0xCEF3F5) - case .tint60: - return UIColor(hexValue: 0xF2FCFD) - } - case .lilac: - switch token { - case .primary: - return UIColor(hexValue: 0xB146C2) - case .shade10: - return UIColor(hexValue: 0x9F3FAF) - case .shade20: - return UIColor(hexValue: 0x863593) - case .shade30: - return UIColor(hexValue: 0x63276D) - case .shade40: - return UIColor(hexValue: 0x35153A) - case .shade50: - return UIColor(hexValue: 0x1C0B1F) - case .tint10: - return UIColor(hexValue: 0xBA58C9) - case .tint20: - return UIColor(hexValue: 0xC36BD1) - case .tint30: - return UIColor(hexValue: 0xCF87DA) - case .tint40: - return UIColor(hexValue: 0xE6BFED) - case .tint50: - return UIColor(hexValue: 0xF2DCF5) - case .tint60: - return UIColor(hexValue: 0xFCF6FD) - } - case .lime: - switch token { - case .primary: - return UIColor(hexValue: 0x73AA24) - case .shade10: - return UIColor(hexValue: 0x689920) - case .shade20: - return UIColor(hexValue: 0x57811B) - case .shade30: - return UIColor(hexValue: 0x405F14) - case .shade40: - return UIColor(hexValue: 0x23330B) - case .shade50: - return UIColor(hexValue: 0x121B06) - case .tint10: - return UIColor(hexValue: 0x81B437) - case .tint20: - return UIColor(hexValue: 0x90BE4C) - case .tint30: - return UIColor(hexValue: 0xA4CC6C) - case .tint40: - return UIColor(hexValue: 0xCFE5AF) - case .tint50: - return UIColor(hexValue: 0xE5F1D3) - case .tint60: - return UIColor(hexValue: 0xF8FCF4) - } - case .magenta: - switch token { - case .primary: - return UIColor(hexValue: 0xBF0077) - case .shade10: - return UIColor(hexValue: 0xAC006B) - case .shade20: - return UIColor(hexValue: 0x91005A) - case .shade30: - return UIColor(hexValue: 0x6B0043) - case .shade40: - return UIColor(hexValue: 0x390024) - case .shade50: - return UIColor(hexValue: 0x1F0013) - case .tint10: - return UIColor(hexValue: 0xC71885) - case .tint20: - return UIColor(hexValue: 0xCE3293) - case .tint30: - return UIColor(hexValue: 0xD957A8) - case .tint40: - return UIColor(hexValue: 0xECA5D1) - case .tint50: - return UIColor(hexValue: 0xF5CEE6) - case .tint60: - return UIColor(hexValue: 0xFCF2F9) - } - case .marigold: - switch token { - case .primary: - return UIColor(hexValue: 0xEAA300) - case .shade10: - return UIColor(hexValue: 0xD39300) - case .shade20: - return UIColor(hexValue: 0xB27C00) - case .shade30: - return UIColor(hexValue: 0x835B00) - case .shade40: - return UIColor(hexValue: 0x463100) - case .shade50: - return UIColor(hexValue: 0x251A00) - case .tint10: - return UIColor(hexValue: 0xEDAD1C) - case .tint20: - return UIColor(hexValue: 0xEFB839) - case .tint30: - return UIColor(hexValue: 0xF2C661) - case .tint40: - return UIColor(hexValue: 0xF9E2AE) - case .tint50: - return UIColor(hexValue: 0xFCEFD3) - case .tint60: - return UIColor(hexValue: 0xFEFBF4) - } - case .mink: - switch token { - case .primary: - return UIColor(hexValue: 0x5D5A58) - case .shade10: - return UIColor(hexValue: 0x54514F) - case .shade20: - return UIColor(hexValue: 0x474443) - case .shade30: - return UIColor(hexValue: 0x343231) - case .shade40: - return UIColor(hexValue: 0x1C1B1A) - case .shade50: - return UIColor(hexValue: 0x0F0E0E) - case .tint10: - return UIColor(hexValue: 0x706D6B) - case .tint20: - return UIColor(hexValue: 0x84817E) - case .tint30: - return UIColor(hexValue: 0x9E9B99) - case .tint40: - return UIColor(hexValue: 0xCECCCB) - case .tint50: - return UIColor(hexValue: 0xE5E4E3) - case .tint60: - return UIColor(hexValue: 0xF8F8F8) - } - case .navy: - switch token { - case .primary: - return UIColor(hexValue: 0x0027B4) - case .shade10: - return UIColor(hexValue: 0x0023A2) - case .shade20: - return UIColor(hexValue: 0x001E89) - case .shade30: - return UIColor(hexValue: 0x001665) - case .shade40: - return UIColor(hexValue: 0x000C36) - case .shade50: - return UIColor(hexValue: 0x00061D) - case .tint10: - return UIColor(hexValue: 0x173BBD) - case .tint20: - return UIColor(hexValue: 0x3050C6) - case .tint30: - return UIColor(hexValue: 0x546FD2) - case .tint40: - return UIColor(hexValue: 0xA3B2E8) - case .tint50: - return UIColor(hexValue: 0xCCD5F3) - case .tint60: - return UIColor(hexValue: 0xF2F4FC) - } - case .orange: - switch token { - case .primary: - return UIColor(hexValue: 0xF7630C) - case .shade10: - return UIColor(hexValue: 0xDE590B) - case .shade20: - return UIColor(hexValue: 0xBC4B09) - case .shade30: - return UIColor(hexValue: 0x8A3707) - case .shade40: - return UIColor(hexValue: 0x4A1E04) - case .shade50: - return UIColor(hexValue: 0x271002) - case .tint10: - return UIColor(hexValue: 0xF87528) - case .tint20: - return UIColor(hexValue: 0xF98845) - case .tint30: - return UIColor(hexValue: 0xFAA06B) - case .tint40: - return UIColor(hexValue: 0xFDCFB4) - case .tint50: - return UIColor(hexValue: 0xFEE5D7) - case .tint60: - return UIColor(hexValue: 0xFFF9F5) - } - case .orchid: - switch token { - case .primary: - return UIColor(hexValue: 0x8764B8) - case .shade10: - return UIColor(hexValue: 0x795AA6) - case .shade20: - return UIColor(hexValue: 0x674C8C) - case .shade30: - return UIColor(hexValue: 0x4C3867) - case .shade40: - return UIColor(hexValue: 0x281E37) - case .shade50: - return UIColor(hexValue: 0x16101D) - case .tint10: - return UIColor(hexValue: 0x9373C0) - case .tint20: - return UIColor(hexValue: 0xA083C9) - case .tint30: - return UIColor(hexValue: 0xB29AD4) - case .tint40: - return UIColor(hexValue: 0xD7CAEA) - case .tint50: - return UIColor(hexValue: 0xE9E2F4) - case .tint60: - return UIColor(hexValue: 0xF9F8FC) - } - case .peach: - switch token { - case .primary: - return UIColor(hexValue: 0xFF8C00) - case .shade10: - return UIColor(hexValue: 0xE67E00) - case .shade20: - return UIColor(hexValue: 0xC26A00) - case .shade30: - return UIColor(hexValue: 0x8F4E00) - case .shade40: - return UIColor(hexValue: 0x4D2A00) - case .shade50: - return UIColor(hexValue: 0x291600) - case .tint10: - return UIColor(hexValue: 0xFF9A1F) - case .tint20: - return UIColor(hexValue: 0xFFA83D) - case .tint30: - return UIColor(hexValue: 0xFFBA66) - case .tint40: - return UIColor(hexValue: 0xFFDDB3) - case .tint50: - return UIColor(hexValue: 0xFFEDD6) - case .tint60: - return UIColor(hexValue: 0xFFFAF5) - } - case .pink: - switch token { - case .primary: - return UIColor(hexValue: 0xE43BA6) - case .shade10: - return UIColor(hexValue: 0xCD3595) - case .shade20: - return UIColor(hexValue: 0xAD2D7E) - case .shade30: - return UIColor(hexValue: 0x80215D) - case .shade40: - return UIColor(hexValue: 0x441232) - case .shade50: - return UIColor(hexValue: 0x24091B) - case .tint10: - return UIColor(hexValue: 0xE750B0) - case .tint20: - return UIColor(hexValue: 0xEA66BA) - case .tint30: - return UIColor(hexValue: 0xEF85C8) - case .tint40: - return UIColor(hexValue: 0xF7C0E3) - case .tint50: - return UIColor(hexValue: 0xFBDDF0) - case .tint60: - return UIColor(hexValue: 0xFEF6FB) - } - case .platinum: - switch token { - case .primary: - return UIColor(hexValue: 0x69797E) - case .shade10: - return UIColor(hexValue: 0x5F6D71) - case .shade20: - return UIColor(hexValue: 0x505C60) - case .shade30: - return UIColor(hexValue: 0x3B4447) - case .shade40: - return UIColor(hexValue: 0x1F2426) - case .shade50: - return UIColor(hexValue: 0x111314) - case .tint10: - return UIColor(hexValue: 0x79898D) - case .tint20: - return UIColor(hexValue: 0x89989D) - case .tint30: - return UIColor(hexValue: 0xA0ADB2) - case .tint40: - return UIColor(hexValue: 0xCDD6D8) - case .tint50: - return UIColor(hexValue: 0xE4E9EA) - case .tint60: - return UIColor(hexValue: 0xF8F9FA) - } - case .plum: - switch token { - case .primary: - return UIColor(hexValue: 0x77004D) - case .shade10: - return UIColor(hexValue: 0x6B0045) - case .shade20: - return UIColor(hexValue: 0x5A003B) - case .shade30: - return UIColor(hexValue: 0x43002B) - case .shade40: - return UIColor(hexValue: 0x240017) - case .shade50: - return UIColor(hexValue: 0x13000C) - case .tint10: - return UIColor(hexValue: 0x87105D) - case .tint20: - return UIColor(hexValue: 0x98246F) - case .tint30: - return UIColor(hexValue: 0xAD4589) - case .tint40: - return UIColor(hexValue: 0xD696C0) - case .tint50: - return UIColor(hexValue: 0xE9C4DC) - case .tint60: - return UIColor(hexValue: 0xFAF0F6) - } - case .pumpkin: - switch token { - case .primary: - return UIColor(hexValue: 0xCA5010) - case .shade10: - return UIColor(hexValue: 0xB6480E) - case .shade20: - return UIColor(hexValue: 0x9A3D0C) - case .shade30: - return UIColor(hexValue: 0x712D09) - case .shade40: - return UIColor(hexValue: 0x3D1805) - case .shade50: - return UIColor(hexValue: 0x200D03) - case .tint10: - return UIColor(hexValue: 0xD06228) - case .tint20: - return UIColor(hexValue: 0xD77440) - case .tint30: - return UIColor(hexValue: 0xDF8E64) - case .tint40: - return UIColor(hexValue: 0xEFC4AD) - case .tint50: - return UIColor(hexValue: 0xF7DFD2) - case .tint60: - return UIColor(hexValue: 0xFDF7F4) - } - case .purple: - switch token { - case .primary: - return UIColor(hexValue: 0x5C2E91) - case .shade10: - return UIColor(hexValue: 0x532982) - case .shade20: - return UIColor(hexValue: 0x46236E) - case .shade30: - return UIColor(hexValue: 0x341A51) - case .shade40: - return UIColor(hexValue: 0x1C0E2B) - case .shade50: - return UIColor(hexValue: 0x0F0717) - case .tint10: - return UIColor(hexValue: 0x6B3F9E) - case .tint20: - return UIColor(hexValue: 0x7C52AB) - case .tint30: - return UIColor(hexValue: 0x9470BD) - case .tint40: - return UIColor(hexValue: 0xC6B1DE) - case .tint50: - return UIColor(hexValue: 0xE0D3ED) - case .tint60: - return UIColor(hexValue: 0xF7F4FB) - } - case .red: - switch token { - case .primary: - return UIColor(hexValue: 0xD13438) - case .shade10: - return UIColor(hexValue: 0xBC2F32) - case .shade20: - return UIColor(hexValue: 0x9F282B) - case .shade30: - return UIColor(hexValue: 0x751D1F) - case .shade40: - return UIColor(hexValue: 0x3F1011) - case .shade50: - return UIColor(hexValue: 0x210809) - case .tint10: - return UIColor(hexValue: 0xD7494C) - case .tint20: - return UIColor(hexValue: 0xDC5E62) - case .tint30: - return UIColor(hexValue: 0xE37D80) - case .tint40: - return UIColor(hexValue: 0xF1BBBC) - case .tint50: - return UIColor(hexValue: 0xF8DADB) - case .tint60: - return UIColor(hexValue: 0xFDF6F6) - } - case .royalBlue: - switch token { - case .primary: - return UIColor(hexValue: 0x004E8C) - case .shade10: - return UIColor(hexValue: 0x00467E) - case .shade20: - return UIColor(hexValue: 0x003B6A) - case .shade30: - return UIColor(hexValue: 0x002C4E) - case .shade40: - return UIColor(hexValue: 0x00172A) - case .shade50: - return UIColor(hexValue: 0x000C16) - case .tint10: - return UIColor(hexValue: 0x125E9A) - case .tint20: - return UIColor(hexValue: 0x286FA8) - case .tint30: - return UIColor(hexValue: 0x4A89BA) - case .tint40: - return UIColor(hexValue: 0x9ABFDC) - case .tint50: - return UIColor(hexValue: 0xC7DCED) - case .tint60: - return UIColor(hexValue: 0xF0F6FA) - } - case .seafoam: - switch token { - case .primary: - return UIColor(hexValue: 0x00CC6A) - case .shade10: - return UIColor(hexValue: 0x00B85F) - case .shade20: - return UIColor(hexValue: 0x009B51) - case .shade30: - return UIColor(hexValue: 0x00723B) - case .shade40: - return UIColor(hexValue: 0x003D20) - case .shade50: - return UIColor(hexValue: 0x002111) - case .tint10: - return UIColor(hexValue: 0x19D279) - case .tint20: - return UIColor(hexValue: 0x34D889) - case .tint30: - return UIColor(hexValue: 0x5AE0A0) - case .tint40: - return UIColor(hexValue: 0xA8F0CD) - case .tint50: - return UIColor(hexValue: 0xCFF7E4) - case .tint60: - return UIColor(hexValue: 0xF3FDF8) - } - case .silver: - switch token { - case .primary: - return UIColor(hexValue: 0x859599) - case .shade10: - return UIColor(hexValue: 0x78868A) - case .shade20: - return UIColor(hexValue: 0x657174) - case .shade30: - return UIColor(hexValue: 0x4A5356) - case .shade40: - return UIColor(hexValue: 0x282D2E) - case .shade50: - return UIColor(hexValue: 0x151818) - case .tint10: - return UIColor(hexValue: 0x92A1A5) - case .tint20: - return UIColor(hexValue: 0xA0AEB1) - case .tint30: - return UIColor(hexValue: 0xB3BFC2) - case .tint40: - return UIColor(hexValue: 0xD8DFE0) - case .tint50: - return UIColor(hexValue: 0xEAEEEF) - case .tint60: - return UIColor(hexValue: 0xFAFBFB) - } - case .steel: - switch token { - case .primary: - return UIColor(hexValue: 0x005B70) - case .shade10: - return UIColor(hexValue: 0x005265) - case .shade20: - return UIColor(hexValue: 0x004555) - case .shade30: - return UIColor(hexValue: 0x00333F) - case .shade40: - return UIColor(hexValue: 0x001B22) - case .shade50: - return UIColor(hexValue: 0x000F12) - case .tint10: - return UIColor(hexValue: 0x0F6C81) - case .tint20: - return UIColor(hexValue: 0x237D92) - case .tint30: - return UIColor(hexValue: 0x4496A9) - case .tint40: - return UIColor(hexValue: 0x94C8D4) - case .tint50: - return UIColor(hexValue: 0xC3E1E8) - case .tint60: - return UIColor(hexValue: 0xEFF7F9) - } - case .teal: - switch token { - case .primary: - return UIColor(hexValue: 0x038387) - case .shade10: - return UIColor(hexValue: 0x037679) - case .shade20: - return UIColor(hexValue: 0x026467) - case .shade30: - return UIColor(hexValue: 0x02494C) - case .shade40: - return UIColor(hexValue: 0x012728) - case .shade50: - return UIColor(hexValue: 0x001516) - case .tint10: - return UIColor(hexValue: 0x159195) - case .tint20: - return UIColor(hexValue: 0x2AA0A4) - case .tint30: - return UIColor(hexValue: 0x4CB4B7) - case .tint40: - return UIColor(hexValue: 0x9BD9DB) - case .tint50: - return UIColor(hexValue: 0xC7EBEC) - case .tint60: - return UIColor(hexValue: 0xF0FAFA) - } - case .yellow: - switch token { - case .primary: - return UIColor(hexValue: 0xFDE300) - case .shade10: - return UIColor(hexValue: 0xE4CC00) - case .shade20: - return UIColor(hexValue: 0xC0AD00) - case .shade30: - return UIColor(hexValue: 0x817400) - case .shade40: - return UIColor(hexValue: 0x4C4400) - case .shade50: - return UIColor(hexValue: 0x282400) - case .tint10: - return UIColor(hexValue: 0xFDE61E) - case .tint20: - return UIColor(hexValue: 0xFDEA3D) - case .tint30: - return UIColor(hexValue: 0xFEEE66) - case .tint40: - return UIColor(hexValue: 0xFEF7B2) - case .tint50: - return UIColor(hexValue: 0xFFFAD6) - case .tint60: - return UIColor(hexValue: 0xFFFEF5) - } - } - } - - // MARK: - FontSize - - public enum FontSizeToken: TokenSetKey { - case size100 - case size200 - case size300 - case size400 - case size500 - case size600 - case size700 - case size800 - case size900 - } - public static func fontSize(_ token: FontSizeToken) -> CGFloat { - switch token { - case .size100: - return 12.0 - case .size200: - return 13.0 - case .size300: - return 15.0 - case .size400: - return 17.0 - case .size500: - return 20.0 - case .size600: - return 22.0 - case .size700: - return 28.0 - case .size800: - return 34.0 - case .size900: - return 60.0 - } - } - - // MARK: - FontWeight - - public enum FontWeightToken: TokenSetKey { - case regular - case medium - case semibold - case bold - } - public static func fontWeight(_ token: FontWeightToken) -> Font.Weight { - switch token { - case .regular: - return .regular - case .medium: - return .medium - case .semibold: - return .semibold - case .bold: - return .bold - } - } - - // MARK: - IconSize - - public enum IconSizeToken: TokenSetKey { - case size100 - case size120 - case size160 - case size200 - case size240 - case size280 - case size360 - case size400 - case size480 - } - public static func icon(_ token: IconSizeToken) -> CGFloat { - switch token { - case .size100: - return 10 - case .size120: - return 12 - case .size160: - return 16 - case .size200: - return 20 - case .size240: - return 24 - case .size280: - return 28 - case .size360: - return 36 - case .size400: - return 40 - case .size480: - return 48 - } - } - - // MARK: - Spacing - - public enum SpacingToken: TokenSetKey { - case sizeNone - case size20 - case size40 - case size60 - case size80 - case size100 - case size120 - case size160 - case size200 - case size240 - case size280 - case size320 - case size360 - case size400 - case size480 - case size520 - case size560 - } - public static func spacing(_ token: SpacingToken) -> CGFloat { - switch token { - case .sizeNone: - return 0 - case .size20: - return 2 - case .size40: - return 4 - case .size60: - return 6 - case .size80: - return 8 - case .size100: - return 10 - case .size120: - return 12 - case .size160: - return 16 - case .size200: - return 20 - case .size240: - return 24 - case .size280: - return 28 - case .size320: - return 32 - case .size360: - return 36 - case .size400: - return 40 - case .size480: - return 48 - case .size520: - return 52 - case .size560: - return 56 - } - } - - // MARK: - BorderRadius - - public enum CornerRadiusToken: TokenSetKey { - case radiusNone - case radius20 - case radius40 - case radius60 - case radius80 - case radius120 - case radiusCircular - } - public static func corner(_ token: CornerRadiusToken) -> CGFloat { - switch token { - case .radiusNone: - return 0 - case .radius20: - return 2 - case .radius40: - return 4 - case .radius60: - return 6 - case .radius80: - return 8 - case .radius120: - return 12 - case .radiusCircular: - return 9999 - } - } - - // MARK: - BorderSize - - public enum StrokeWidthToken: TokenSetKey { - case widthNone - case width05 - case width10 - case width15 - case width20 - case width30 - case width40 - case width60 - } - public static func stroke(_ token: StrokeWidthToken) -> CGFloat { - switch token { - case .widthNone: - return 0 - case .width05: - return 0.5 - case .width10: - return 1 - case .width15: - return 1.5 - case .width20: - return 2 - case .width30: - return 3 - case .width40: - return 4 - case .width60: - return 6 - } - } - // MARK: - Deprecated - - // MARK: - BrandColors - - @available(*, deprecated, renamed: "BrandColorToken") - @objc(MSFBrandColorsGlobalTokens) - public enum BrandColorsTokens: Int, TokenSetKey { - // Communication blue colors - case comm10 - case comm20 - case comm30 - case comm40 - case comm50 - case comm60 - case comm70 - case comm80 - case comm90 - case comm100 - case comm110 - case comm120 - case comm130 - case comm140 - case comm150 - case comm160 - - // Gradient colors - case gradientPrimaryLight - case gradientPrimaryDark - case gradientSecondaryLight - case gradientSecondaryDark - case gradientTertiaryLight - case gradientTertiaryDark - } - - @available(*, deprecated, renamed: "brandColor(_token:)") - @objc(brandColorForGlobalToken:) - public static func brandColors(_ token: BrandColorsTokens) -> ColorValue { - switch token { - case .comm10: - return ColorValue(0x061724) - case .comm20: - return ColorValue(0x082338) - case .comm30: - return ColorValue(0x0A2E4A) - case .comm40: - return ColorValue(0x0C3B5E) - case .comm50: - return ColorValue(0x0E4775) - case .comm60: - return ColorValue(0x0F548C) - case .comm70: - return ColorValue(0x115EA3) - case .comm80: - return ColorValue(0x0F6CBD) - case .comm90: - return ColorValue(0x2886DE) - case .comm100: - return ColorValue(0x479EF5) - case .comm110: - return ColorValue(0x62ABF5) - case .comm120: - return ColorValue(0x77B7F7) - case .comm130: - return ColorValue(0x96C6FA) - case .comm140: - return ColorValue(0xB4D6FA) - case .comm150: - return ColorValue(0xCFE4FA) - case .comm160: - return ColorValue(0xEBF3FC) - case .gradientPrimaryLight: - return ColorValue(0x464FEB) - case .gradientPrimaryDark: - return ColorValue(0x7385FF) - case .gradientSecondaryLight: - return ColorValue(0x47CFFA) - case .gradientSecondaryDark: - return ColorValue(0x7ADFFF) - case .gradientTertiaryLight: - return ColorValue(0xB47CF8) - case .gradientTertiaryDark: - return ColorValue(0xBF80FF) - } - } - - // MARK: - NeutralColors - - @available(*, deprecated, renamed: "NeutralColorToken") - @objc(MSFNeutralColorsToken) - public enum NeutralColorsToken: Int, TokenSetKey { - case black - case grey2 - case grey4 - case grey6 - case grey8 - case grey10 - case grey12 - case grey14 - case grey16 - case grey18 - case grey20 - case grey22 - case grey24 - case grey26 - case grey28 - case grey30 - case grey32 - case grey34 - case grey36 - case grey38 - case grey40 - case grey42 - case grey44 - case grey46 - case grey48 - case grey50 - case grey52 - case grey54 - case grey56 - case grey58 - case grey60 - case grey62 - case grey64 - case grey66 - case grey68 - case grey70 - case grey72 - case grey74 - case grey76 - case grey78 - case grey80 - case grey82 - case grey84 - case grey86 - case grey88 - case grey90 - case grey92 - case grey94 - case grey96 - case grey98 - case white - } - @available(*, deprecated, renamed: "neutralColor(_:)") - @objc(neutralColorForToken:) - public static func neutralColors(_ token: NeutralColorsToken) -> ColorValue { - switch token { - case .black: - return ColorValue(0x000000) - case .grey2: - return ColorValue(0x050505) - case .grey4: - return ColorValue(0x0A0A0A) - case .grey6: - return ColorValue(0x0F0F0F) - case .grey8: - return ColorValue(0x141414) - case .grey10: - return ColorValue(0x1A1A1A) - case .grey12: - return ColorValue(0x1F1F1F) - case .grey14: - return ColorValue(0x242424) - case .grey16: - return ColorValue(0x292929) - case .grey18: - return ColorValue(0x2E2E2E) - case .grey20: - return ColorValue(0x333333) - case .grey22: - return ColorValue(0x383838) - case .grey24: - return ColorValue(0x3D3D3D) - case .grey26: - return ColorValue(0x424242) - case .grey28: - return ColorValue(0x474747) - case .grey30: - return ColorValue(0x4D4D4D) - case .grey32: - return ColorValue(0x525252) - case .grey34: - return ColorValue(0x575757) - case .grey36: - return ColorValue(0x5C5C5C) - case .grey38: - return ColorValue(0x616161) - case .grey40: - return ColorValue(0x666666) - case .grey42: - return ColorValue(0x6B6B6B) - case .grey44: - return ColorValue(0x707070) - case .grey46: - return ColorValue(0x757575) - case .grey48: - return ColorValue(0x7A7A7A) - case .grey50: - return ColorValue(0x808080) - case .grey52: - return ColorValue(0x858585) - case .grey54: - return ColorValue(0x8A8A8A) - case .grey56: - return ColorValue(0x8F8F8F) - case .grey58: - return ColorValue(0x949494) - case .grey60: - return ColorValue(0x999999) - case .grey62: - return ColorValue(0x9E9E9E) - case .grey64: - return ColorValue(0xA3A3A3) - case .grey66: - return ColorValue(0xA8A8A8) - case .grey68: - return ColorValue(0xADADAD) - case .grey70: - return ColorValue(0xB3B3B3) - case .grey72: - return ColorValue(0xB8B8B8) - case .grey74: - return ColorValue(0xBDBDBD) - case .grey76: - return ColorValue(0xC2C2C2) - case .grey78: - return ColorValue(0xC7C7C7) - case .grey80: - return ColorValue(0xCCCCCC) - case .grey82: - return ColorValue(0xD1D1D1) - case .grey84: - return ColorValue(0xD6D6D6) - case .grey86: - return ColorValue(0xDBDBDB) - case .grey88: - return ColorValue(0xE0E0E0) - case .grey90: - return ColorValue(0xE6E6E6) - case .grey92: - return ColorValue(0xEBEBEB) - case .grey94: - return ColorValue(0xF0F0F0) - case .grey96: - return ColorValue(0xF5F5F5) - case .grey98: - return ColorValue(0xFAFAFA) - case .white: - return ColorValue(0xFFFFFF) - } - } - - // MARK: - SharedColors - - @available(*, deprecated, renamed: "SharedColorSet") - @objc(MSFSharedColorSets) - public enum SharedColorSets: Int, TokenSetKey { - case darkRed - case burgundy - case cranberry - case red - case darkOrange - case bronze - case pumpkin - case orange - case peach - case marigold - case yellow - case gold - case brass - case brown - case darkBrown - case lime - case forest - case seafoam - case lightGreen - case green - case darkGreen - case lightTeal - case teal - case darkTeal - case cyan - case steel - case lightBlue - case blue - case royalBlue - case darkBlue - case cornflower - case navy - case lavender - case purple - case darkPurple - case orchid - case grape - case berry - case lilac - case pink - case hotPink - case magenta - case plum - case beige - case mink - case silver - case platinum - case anchor - case charcoal - } - - @available(*, deprecated, renamed: "SharedColorToken") - @objc(MSFSharedColorsTokens) - public enum SharedColorsTokens: Int, TokenSetKey { - case shade50 - case shade40 - case shade30 - case shade20 - case shade10 - case primary - case tint10 - case tint20 - case tint30 - case tint40 - case tint50 - case tint60 - } - - @available(*, deprecated, renamed: "sharedColor(_:_:)") - @objc(sharedColorForColorSet:token:) - public static func sharedColors(_ sharedColor: SharedColorSets, _ token: SharedColorsTokens) -> ColorValue { - switch sharedColor { - case .anchor: - switch token { - case .primary: - return ColorValue(0x394146) - case .shade10: - return ColorValue(0x333A3F) - case .shade20: - return ColorValue(0x2B3135) - case .shade30: - return ColorValue(0x202427) - case .shade40: - return ColorValue(0x111315) - case .shade50: - return ColorValue(0x090A0B) - case .tint10: - return ColorValue(0x4D565C) - case .tint20: - return ColorValue(0x626C72) - case .tint30: - return ColorValue(0x808A90) - case .tint40: - return ColorValue(0xBCC3C7) - case .tint50: - return ColorValue(0xDBDFE1) - case .tint60: - return ColorValue(0xF6F7F8) - } - case .beige: - switch token { - case .primary: - return ColorValue(0x7A7574) - case .shade10: - return ColorValue(0x6E6968) - case .shade20: - return ColorValue(0x5D5958) - case .shade30: - return ColorValue(0x444241) - case .shade40: - return ColorValue(0x252323) - case .shade50: - return ColorValue(0x141313) - case .tint10: - return ColorValue(0x8A8584) - case .tint20: - return ColorValue(0x9A9594) - case .tint30: - return ColorValue(0xAFABAA) - case .tint40: - return ColorValue(0xD7D4D4) - case .tint50: - return ColorValue(0xEAE8E8) - case .tint60: - return ColorValue(0xFAF9F9) - } - case .berry: - switch token { - case .primary: - return ColorValue(0xC239B3) - case .shade10: - return ColorValue(0xAF33A1) - case .shade20: - return ColorValue(0x932B88) - case .shade30: - return ColorValue(0x6D2064) - case .shade40: - return ColorValue(0x3A1136) - case .shade50: - return ColorValue(0x1F091D) - case .tint10: - return ColorValue(0xC94CBC) - case .tint20: - return ColorValue(0xD161C4) - case .tint30: - return ColorValue(0xDA7ED0) - case .tint40: - return ColorValue(0xEDBBE7) - case .tint50: - return ColorValue(0xF5DAF2) - case .tint60: - return ColorValue(0xFDF5FC) - } - case .blue: - switch token { - case .primary: - return ColorValue(0x0078D4) - case .shade10: - return ColorValue(0x006CBF) - case .shade20: - return ColorValue(0x005BA1) - case .shade30: - return ColorValue(0x004377) - case .shade40: - return ColorValue(0x002440) - case .shade50: - return ColorValue(0x001322) - case .tint10: - return ColorValue(0x1A86D9) - case .tint20: - return ColorValue(0x3595DE) - case .tint30: - return ColorValue(0x5CAAE5) - case .tint40: - return ColorValue(0xA9D3F2) - case .tint50: - return ColorValue(0xD0E7F8) - case .tint60: - return ColorValue(0xF3F9FD) - } - case .brass: - switch token { - case .primary: - return ColorValue(0x986F0B) - case .shade10: - return ColorValue(0x89640A) - case .shade20: - return ColorValue(0x745408) - case .shade30: - return ColorValue(0x553E06) - case .shade40: - return ColorValue(0x2E2103) - case .shade50: - return ColorValue(0x181202) - case .tint10: - return ColorValue(0xA47D1E) - case .tint20: - return ColorValue(0xB18C34) - case .tint30: - return ColorValue(0xC1A256) - case .tint40: - return ColorValue(0xE0CEA2) - case .tint50: - return ColorValue(0xEFE4CB) - case .tint60: - return ColorValue(0xFBF8F2) - } - case .bronze: - switch token { - case .primary: - return ColorValue(0xA74109) - case .shade10: - return ColorValue(0x963A08) - case .shade20: - return ColorValue(0x7F3107) - case .shade30: - return ColorValue(0x5E2405) - case .shade40: - return ColorValue(0x321303) - case .shade50: - return ColorValue(0x1B0A01) - case .tint10: - return ColorValue(0xB2521E) - case .tint20: - return ColorValue(0xBC6535) - case .tint30: - return ColorValue(0xCA8057) - case .tint40: - return ColorValue(0xE5BBA4) - case .tint50: - return ColorValue(0xF1D9CC) - case .tint60: - return ColorValue(0xFBF5F2) - } - case .brown: - switch token { - case .primary: - return ColorValue(0x8E562E) - case .shade10: - return ColorValue(0x804D29) - case .shade20: - return ColorValue(0x6C4123) - case .shade30: - return ColorValue(0x50301A) - case .shade40: - return ColorValue(0x2B1A0E) - case .shade50: - return ColorValue(0x170E07) - case .tint10: - return ColorValue(0x9C663F) - case .tint20: - return ColorValue(0xA97652) - case .tint30: - return ColorValue(0xBB8F6F) - case .tint40: - return ColorValue(0xDDC3B0) - case .tint50: - return ColorValue(0xEDDED3) - case .tint60: - return ColorValue(0xFAF7F4) - } - case .burgundy: - switch token { - case .primary: - return ColorValue(0xA4262C) - case .shade10: - return ColorValue(0x942228) - case .shade20: - return ColorValue(0x7D1D21) - case .shade30: - return ColorValue(0x5C1519) - case .shade40: - return ColorValue(0x310B0D) - case .shade50: - return ColorValue(0x1A0607) - case .tint10: - return ColorValue(0xAF393E) - case .tint20: - return ColorValue(0xBA4D52) - case .tint30: - return ColorValue(0xC86C70) - case .tint40: - return ColorValue(0xE4AFB2) - case .tint50: - return ColorValue(0xF0D3D4) - case .tint60: - return ColorValue(0xFBF4F4) - } - case .charcoal: - switch token { - case .primary: - return ColorValue(0x393939) - case .shade10: - return ColorValue(0x333333) - case .shade20: - return ColorValue(0x2B2B2B) - case .shade30: - return ColorValue(0x202020) - case .shade40: - return ColorValue(0x111111) - case .shade50: - return ColorValue(0x090909) - case .tint10: - return ColorValue(0x515151) - case .tint20: - return ColorValue(0x686868) - case .tint30: - return ColorValue(0x888888) - case .tint40: - return ColorValue(0xC4C4C4) - case .tint50: - return ColorValue(0xDFDFDF) - case .tint60: - return ColorValue(0xF7F7F7) - } - case .cornflower: - switch token { - case .primary: - return ColorValue(0x4F6BED) - case .shade10: - return ColorValue(0x4760D5) - case .shade20: - return ColorValue(0x3C51B4) - case .shade30: - return ColorValue(0x2C3C85) - case .shade40: - return ColorValue(0x182047) - case .shade50: - return ColorValue(0x0D1126) - case .tint10: - return ColorValue(0x637CEF) - case .tint20: - return ColorValue(0x778DF1) - case .tint30: - return ColorValue(0x93A4F4) - case .tint40: - return ColorValue(0xC8D1FA) - case .tint50: - return ColorValue(0xE1E6FC) - case .tint60: - return ColorValue(0xF7F9FE) - } - case .cranberry: - switch token { - case .primary: - return ColorValue(0xC50F1F) - case .shade10: - return ColorValue(0xB10E1C) - case .shade20: - return ColorValue(0x960B18) - case .shade30: - return ColorValue(0x6E0811) - case .shade40: - return ColorValue(0x3B0509) - case .shade50: - return ColorValue(0x200205) - case .tint10: - return ColorValue(0xCC2635) - case .tint20: - return ColorValue(0xD33F4C) - case .tint30: - return ColorValue(0xDC626D) - case .tint40: - return ColorValue(0xEEACB2) - case .tint50: - return ColorValue(0xF6D1D5) - case .tint60: - return ColorValue(0xFDF3F4) - } - case .cyan: - switch token { - case .primary: - return ColorValue(0x0099BC) - case .shade10: - return ColorValue(0x008AA9) - case .shade20: - return ColorValue(0x00748F) - case .shade30: - return ColorValue(0x005669) - case .shade40: - return ColorValue(0x002E38) - case .shade50: - return ColorValue(0x00181E) - case .tint10: - return ColorValue(0x18A4C4) - case .tint20: - return ColorValue(0x31AFCC) - case .tint30: - return ColorValue(0x56BFD7) - case .tint40: - return ColorValue(0xA4DEEB) - case .tint50: - return ColorValue(0xCDEDF4) - case .tint60: - return ColorValue(0xF2FAFC) - } - case .darkBlue: - switch token { - case .primary: - return ColorValue(0x003966) - case .shade10: - return ColorValue(0x00335C) - case .shade20: - return ColorValue(0x002B4E) - case .shade30: - return ColorValue(0x002039) - case .shade40: - return ColorValue(0x00111F) - case .shade50: - return ColorValue(0x000910) - case .tint10: - return ColorValue(0x0E4A78) - case .tint20: - return ColorValue(0x215C8B) - case .tint30: - return ColorValue(0x4178A3) - case .tint40: - return ColorValue(0x92B5D1) - case .tint50: - return ColorValue(0xC2D6E7) - case .tint60: - return ColorValue(0xEFF4F9) - } - case .darkBrown: - switch token { - case .primary: - return ColorValue(0x4D291C) - case .shade10: - return ColorValue(0x452519) - case .shade20: - return ColorValue(0x3A1F15) - case .shade30: - return ColorValue(0x2B1710) - case .shade40: - return ColorValue(0x170C08) - case .shade50: - return ColorValue(0x0C0704) - case .tint10: - return ColorValue(0x623A2B) - case .tint20: - return ColorValue(0x784D3E) - case .tint30: - return ColorValue(0x946B5C) - case .tint40: - return ColorValue(0xCAADA3) - case .tint50: - return ColorValue(0xE3D2CB) - case .tint60: - return ColorValue(0xF8F3F2) - } - case .darkGreen: - switch token { - case .primary: - return ColorValue(0x0B6A0B) - case .shade10: - return ColorValue(0x0A5F0A) - case .shade20: - return ColorValue(0x085108) - case .shade30: - return ColorValue(0x063B06) - case .shade40: - return ColorValue(0x032003) - case .shade50: - return ColorValue(0x021102) - case .tint10: - return ColorValue(0x1A7C1A) - case .tint20: - return ColorValue(0x2D8E2D) - case .tint30: - return ColorValue(0x4DA64D) - case .tint40: - return ColorValue(0x9AD29A) - case .tint50: - return ColorValue(0xC6E7C6) - case .tint60: - return ColorValue(0xF0F9F0) - } - case .darkOrange: - switch token { - case .primary: - return ColorValue(0xDA3B01) - case .shade10: - return ColorValue(0xC43501) - case .shade20: - return ColorValue(0xA62D01) - case .shade30: - return ColorValue(0x7A2101) - case .shade40: - return ColorValue(0x411200) - case .shade50: - return ColorValue(0x230900) - case .tint10: - return ColorValue(0xDE501C) - case .tint20: - return ColorValue(0xE36537) - case .tint30: - return ColorValue(0xE9835E) - case .tint40: - return ColorValue(0xF4BFAB) - case .tint50: - return ColorValue(0xF9DCD1) - case .tint60: - return ColorValue(0xFDF6F3) - } - case .darkPurple: - switch token { - case .primary: - return ColorValue(0x401B6C) - case .shade10: - return ColorValue(0x3A1861) - case .shade20: - return ColorValue(0x311552) - case .shade30: - return ColorValue(0x240F3C) - case .shade40: - return ColorValue(0x130820) - case .shade50: - return ColorValue(0x0A0411) - case .tint10: - return ColorValue(0x512B7E) - case .tint20: - return ColorValue(0x633E8F) - case .tint30: - return ColorValue(0x7E5CA7) - case .tint40: - return ColorValue(0xB9A3D3) - case .tint50: - return ColorValue(0xD8CCE7) - case .tint60: - return ColorValue(0xF5F2F9) - } - case .darkRed: - switch token { - case .primary: - return ColorValue(0x750B1C) - case .shade10: - return ColorValue(0x690A19) - case .shade20: - return ColorValue(0x590815) - case .shade30: - return ColorValue(0x420610) - case .shade40: - return ColorValue(0x230308) - case .shade50: - return ColorValue(0x130204) - case .tint10: - return ColorValue(0x861B2C) - case .tint20: - return ColorValue(0x962F3F) - case .tint30: - return ColorValue(0xAC4F5E) - case .tint40: - return ColorValue(0xD69CA5) - case .tint50: - return ColorValue(0xE9C7CD) - case .tint60: - return ColorValue(0xF9F0F2) - } - case .darkTeal: - switch token { - case .primary: - return ColorValue(0x006666) - case .shade10: - return ColorValue(0x005C5C) - case .shade20: - return ColorValue(0x004E4E) - case .shade30: - return ColorValue(0x003939) - case .shade40: - return ColorValue(0x001F1F) - case .shade50: - return ColorValue(0x001010) - case .tint10: - return ColorValue(0x0E7878) - case .tint20: - return ColorValue(0x218B8B) - case .tint30: - return ColorValue(0x41A3A3) - case .tint40: - return ColorValue(0x92D1D1) - case .tint50: - return ColorValue(0xC2E7E7) - case .tint60: - return ColorValue(0xEFF9F9) - } - case .forest: - switch token { - case .primary: - return ColorValue(0x498205) - case .shade10: - return ColorValue(0x427505) - case .shade20: - return ColorValue(0x376304) - case .shade30: - return ColorValue(0x294903) - case .shade40: - return ColorValue(0x162702) - case .shade50: - return ColorValue(0x0C1501) - case .tint10: - return ColorValue(0x599116) - case .tint20: - return ColorValue(0x6BA02B) - case .tint30: - return ColorValue(0x85B44C) - case .tint40: - return ColorValue(0xBDD99B) - case .tint50: - return ColorValue(0xDBEBC7) - case .tint60: - return ColorValue(0xF6FAF0) - } - case .gold: - switch token { - case .primary: - return ColorValue(0xC19C00) - case .shade10: - return ColorValue(0xAE8C00) - case .shade20: - return ColorValue(0x937700) - case .shade30: - return ColorValue(0x6C5700) - case .shade40: - return ColorValue(0x3A2F00) - case .shade50: - return ColorValue(0x1F1900) - case .tint10: - return ColorValue(0xC8A718) - case .tint20: - return ColorValue(0xD0B232) - case .tint30: - return ColorValue(0xDAC157) - case .tint40: - return ColorValue(0xECDFA5) - case .tint50: - return ColorValue(0xF5EECE) - case .tint60: - return ColorValue(0xFDFBF2) - } - case .grape: - switch token { - case .primary: - return ColorValue(0x881798) - case .shade10: - return ColorValue(0x7A1589) - case .shade20: - return ColorValue(0x671174) - case .shade30: - return ColorValue(0x4C0D55) - case .shade40: - return ColorValue(0x29072E) - case .shade50: - return ColorValue(0x160418) - case .tint10: - return ColorValue(0x952AA4) - case .tint20: - return ColorValue(0xA33FB1) - case .tint30: - return ColorValue(0xB55FC1) - case .tint40: - return ColorValue(0xD9A7E0) - case .tint50: - return ColorValue(0xEACEEF) - case .tint60: - return ColorValue(0xFAF2FB) - } - case .green: - switch token { - case .primary: - return ColorValue(0x107C10) - case .shade10: - return ColorValue(0x0E700E) - case .shade20: - return ColorValue(0x0C5E0C) - case .shade30: - return ColorValue(0x094509) - case .shade40: - return ColorValue(0x052505) - case .shade50: - return ColorValue(0x031403) - case .tint10: - return ColorValue(0x218C21) - case .tint20: - return ColorValue(0x359B35) - case .tint30: - return ColorValue(0x54B054) - case .tint40: - return ColorValue(0x9FD89F) - case .tint50: - return ColorValue(0xC9EAC9) - case .tint60: - return ColorValue(0xF1FAF1) - } - case .hotPink: - switch token { - case .primary: - return ColorValue(0xE3008C) - case .shade10: - return ColorValue(0xCC007E) - case .shade20: - return ColorValue(0xAD006A) - case .shade30: - return ColorValue(0x7F004E) - case .shade40: - return ColorValue(0x44002A) - case .shade50: - return ColorValue(0x240016) - case .tint10: - return ColorValue(0xE61C99) - case .tint20: - return ColorValue(0xEA38A6) - case .tint30: - return ColorValue(0xEE5FB7) - case .tint40: - return ColorValue(0xF7ADDA) - case .tint50: - return ColorValue(0xFBD2EB) - case .tint60: - return ColorValue(0xFEF4FA) - } - case .lavender: - switch token { - case .primary: - return ColorValue(0x7160E8) - case .shade10: - return ColorValue(0x6656D1) - case .shade20: - return ColorValue(0x5649B0) - case .shade30: - return ColorValue(0x3F3682) - case .shade40: - return ColorValue(0x221D46) - case .shade50: - return ColorValue(0x120F25) - case .tint10: - return ColorValue(0x8172EB) - case .tint20: - return ColorValue(0x9184EE) - case .tint30: - return ColorValue(0xA79CF1) - case .tint40: - return ColorValue(0xD2CCF8) - case .tint50: - return ColorValue(0xE7E4FB) - case .tint60: - return ColorValue(0xF9F8FE) - } - case .lightBlue: - switch token { - case .primary: - return ColorValue(0x3A96DD) - case .shade10: - return ColorValue(0x3487C7) - case .shade20: - return ColorValue(0x2C72A8) - case .shade30: - return ColorValue(0x20547C) - case .shade40: - return ColorValue(0x112D42) - case .shade50: - return ColorValue(0x091823) - case .tint10: - return ColorValue(0x4FA1E1) - case .tint20: - return ColorValue(0x65ADE5) - case .tint30: - return ColorValue(0x83BDEB) - case .tint40: - return ColorValue(0xBFDDF5) - case .tint50: - return ColorValue(0xDCEDFA) - case .tint60: - return ColorValue(0xF6FAFE) - } - case .lightGreen: - switch token { - case .primary: - return ColorValue(0x13A10E) - case .shade10: - return ColorValue(0x11910D) - case .shade20: - return ColorValue(0x0E7A0B) - case .shade30: - return ColorValue(0x0B5A08) - case .shade40: - return ColorValue(0x063004) - case .shade50: - return ColorValue(0x031A02) - case .tint10: - return ColorValue(0x27AC22) - case .tint20: - return ColorValue(0x3DB838) - case .tint30: - return ColorValue(0x5EC75A) - case .tint40: - return ColorValue(0xA7E3A5) - case .tint50: - return ColorValue(0xCEF0CD) - case .tint60: - return ColorValue(0xF2FBF2) - } - case .lightTeal: - switch token { - case .primary: - return ColorValue(0x00B7C3) - case .shade10: - return ColorValue(0x00A5AF) - case .shade20: - return ColorValue(0x008B94) - case .shade30: - return ColorValue(0x00666D) - case .shade40: - return ColorValue(0x00373A) - case .shade50: - return ColorValue(0x001D1F) - case .tint10: - return ColorValue(0x18BFCA) - case .tint20: - return ColorValue(0x32C8D1) - case .tint30: - return ColorValue(0x58D3DB) - case .tint40: - return ColorValue(0xA6E9ED) - case .tint50: - return ColorValue(0xCEF3F5) - case .tint60: - return ColorValue(0xF2FCFD) - } - case .lilac: - switch token { - case .primary: - return ColorValue(0xB146C2) - case .shade10: - return ColorValue(0x9F3FAF) - case .shade20: - return ColorValue(0x863593) - case .shade30: - return ColorValue(0x63276D) - case .shade40: - return ColorValue(0x35153A) - case .shade50: - return ColorValue(0x1C0B1F) - case .tint10: - return ColorValue(0xBA58C9) - case .tint20: - return ColorValue(0xC36BD1) - case .tint30: - return ColorValue(0xCF87DA) - case .tint40: - return ColorValue(0xE6BFED) - case .tint50: - return ColorValue(0xF2DCF5) - case .tint60: - return ColorValue(0xFCF6FD) - } - case .lime: - switch token { - case .primary: - return ColorValue(0x73AA24) - case .shade10: - return ColorValue(0x689920) - case .shade20: - return ColorValue(0x57811B) - case .shade30: - return ColorValue(0x405F14) - case .shade40: - return ColorValue(0x23330B) - case .shade50: - return ColorValue(0x121B06) - case .tint10: - return ColorValue(0x81B437) - case .tint20: - return ColorValue(0x90BE4C) - case .tint30: - return ColorValue(0xA4CC6C) - case .tint40: - return ColorValue(0xCFE5AF) - case .tint50: - return ColorValue(0xE5F1D3) - case .tint60: - return ColorValue(0xF8FCF4) - } - case .magenta: - switch token { - case .primary: - return ColorValue(0xBF0077) - case .shade10: - return ColorValue(0xAC006B) - case .shade20: - return ColorValue(0x91005A) - case .shade30: - return ColorValue(0x6B0043) - case .shade40: - return ColorValue(0x390024) - case .shade50: - return ColorValue(0x1F0013) - case .tint10: - return ColorValue(0xC71885) - case .tint20: - return ColorValue(0xCE3293) - case .tint30: - return ColorValue(0xD957A8) - case .tint40: - return ColorValue(0xECA5D1) - case .tint50: - return ColorValue(0xF5CEE6) - case .tint60: - return ColorValue(0xFCF2F9) - } - case .marigold: - switch token { - case .primary: - return ColorValue(0xEAA300) - case .shade10: - return ColorValue(0xD39300) - case .shade20: - return ColorValue(0xB27C00) - case .shade30: - return ColorValue(0x835B00) - case .shade40: - return ColorValue(0x463100) - case .shade50: - return ColorValue(0x251A00) - case .tint10: - return ColorValue(0xEDAD1C) - case .tint20: - return ColorValue(0xEFB839) - case .tint30: - return ColorValue(0xF2C661) - case .tint40: - return ColorValue(0xF9E2AE) - case .tint50: - return ColorValue(0xFCEFD3) - case .tint60: - return ColorValue(0xFEFBF4) - } - case .mink: - switch token { - case .primary: - return ColorValue(0x5D5A58) - case .shade10: - return ColorValue(0x54514F) - case .shade20: - return ColorValue(0x474443) - case .shade30: - return ColorValue(0x343231) - case .shade40: - return ColorValue(0x1C1B1A) - case .shade50: - return ColorValue(0x0F0E0E) - case .tint10: - return ColorValue(0x706D6B) - case .tint20: - return ColorValue(0x84817E) - case .tint30: - return ColorValue(0x9E9B99) - case .tint40: - return ColorValue(0xCECCCB) - case .tint50: - return ColorValue(0xE5E4E3) - case .tint60: - return ColorValue(0xF8F8F8) - } - case .navy: - switch token { - case .primary: - return ColorValue(0x0027B4) - case .shade10: - return ColorValue(0x0023A2) - case .shade20: - return ColorValue(0x001E89) - case .shade30: - return ColorValue(0x001665) - case .shade40: - return ColorValue(0x000C36) - case .shade50: - return ColorValue(0x00061D) - case .tint10: - return ColorValue(0x173BBD) - case .tint20: - return ColorValue(0x3050C6) - case .tint30: - return ColorValue(0x546FD2) - case .tint40: - return ColorValue(0xA3B2E8) - case .tint50: - return ColorValue(0xCCD5F3) - case .tint60: - return ColorValue(0xF2F4FC) - } - case .orange: - switch token { - case .primary: - return ColorValue(0xF7630C) - case .shade10: - return ColorValue(0xDE590B) - case .shade20: - return ColorValue(0xBC4B09) - case .shade30: - return ColorValue(0x8A3707) - case .shade40: - return ColorValue(0x4A1E04) - case .shade50: - return ColorValue(0x271002) - case .tint10: - return ColorValue(0xF87528) - case .tint20: - return ColorValue(0xF98845) - case .tint30: - return ColorValue(0xFAA06B) - case .tint40: - return ColorValue(0xFDCFB4) - case .tint50: - return ColorValue(0xFEE5D7) - case .tint60: - return ColorValue(0xFFF9F5) - } - case .orchid: - switch token { - case .primary: - return ColorValue(0x8764B8) - case .shade10: - return ColorValue(0x795AA6) - case .shade20: - return ColorValue(0x674C8C) - case .shade30: - return ColorValue(0x4C3867) - case .shade40: - return ColorValue(0x281E37) - case .shade50: - return ColorValue(0x16101D) - case .tint10: - return ColorValue(0x9373C0) - case .tint20: - return ColorValue(0xA083C9) - case .tint30: - return ColorValue(0xB29AD4) - case .tint40: - return ColorValue(0xD7CAEA) - case .tint50: - return ColorValue(0xE9E2F4) - case .tint60: - return ColorValue(0xF9F8FC) - } - case .peach: - switch token { - case .primary: - return ColorValue(0xFF8C00) - case .shade10: - return ColorValue(0xE67E00) - case .shade20: - return ColorValue(0xC26A00) - case .shade30: - return ColorValue(0x8F4E00) - case .shade40: - return ColorValue(0x4D2A00) - case .shade50: - return ColorValue(0x291600) - case .tint10: - return ColorValue(0xFF9A1F) - case .tint20: - return ColorValue(0xFFA83D) - case .tint30: - return ColorValue(0xFFBA66) - case .tint40: - return ColorValue(0xFFDDB3) - case .tint50: - return ColorValue(0xFFEDD6) - case .tint60: - return ColorValue(0xFFFAF5) - } - case .pink: - switch token { - case .primary: - return ColorValue(0xE43BA6) - case .shade10: - return ColorValue(0xCD3595) - case .shade20: - return ColorValue(0xAD2D7E) - case .shade30: - return ColorValue(0x80215D) - case .shade40: - return ColorValue(0x441232) - case .shade50: - return ColorValue(0x24091B) - case .tint10: - return ColorValue(0xE750B0) - case .tint20: - return ColorValue(0xEA66BA) - case .tint30: - return ColorValue(0xEF85C8) - case .tint40: - return ColorValue(0xF7C0E3) - case .tint50: - return ColorValue(0xFBDDF0) - case .tint60: - return ColorValue(0xFEF6FB) - } - case .platinum: - switch token { - case .primary: - return ColorValue(0x69797E) - case .shade10: - return ColorValue(0x5F6D71) - case .shade20: - return ColorValue(0x505C60) - case .shade30: - return ColorValue(0x3B4447) - case .shade40: - return ColorValue(0x1F2426) - case .shade50: - return ColorValue(0x111314) - case .tint10: - return ColorValue(0x79898D) - case .tint20: - return ColorValue(0x89989D) - case .tint30: - return ColorValue(0xA0ADB2) - case .tint40: - return ColorValue(0xCDD6D8) - case .tint50: - return ColorValue(0xE4E9EA) - case .tint60: - return ColorValue(0xF8F9FA) - } - case .plum: - switch token { - case .primary: - return ColorValue(0x77004D) - case .shade10: - return ColorValue(0x6B0045) - case .shade20: - return ColorValue(0x5A003B) - case .shade30: - return ColorValue(0x43002B) - case .shade40: - return ColorValue(0x240017) - case .shade50: - return ColorValue(0x13000C) - case .tint10: - return ColorValue(0x87105D) - case .tint20: - return ColorValue(0x98246F) - case .tint30: - return ColorValue(0xAD4589) - case .tint40: - return ColorValue(0xD696C0) - case .tint50: - return ColorValue(0xE9C4DC) - case .tint60: - return ColorValue(0xFAF0F6) - } - case .pumpkin: - switch token { - case .primary: - return ColorValue(0xCA5010) - case .shade10: - return ColorValue(0xB6480E) - case .shade20: - return ColorValue(0x9A3D0C) - case .shade30: - return ColorValue(0x712D09) - case .shade40: - return ColorValue(0x3D1805) - case .shade50: - return ColorValue(0x200D03) - case .tint10: - return ColorValue(0xD06228) - case .tint20: - return ColorValue(0xD77440) - case .tint30: - return ColorValue(0xDF8E64) - case .tint40: - return ColorValue(0xEFC4AD) - case .tint50: - return ColorValue(0xF7DFD2) - case .tint60: - return ColorValue(0xFDF7F4) - } - case .purple: - switch token { - case .primary: - return ColorValue(0x5C2E91) - case .shade10: - return ColorValue(0x532982) - case .shade20: - return ColorValue(0x46236E) - case .shade30: - return ColorValue(0x341A51) - case .shade40: - return ColorValue(0x1C0E2B) - case .shade50: - return ColorValue(0x0F0717) - case .tint10: - return ColorValue(0x6B3F9E) - case .tint20: - return ColorValue(0x7C52AB) - case .tint30: - return ColorValue(0x9470BD) - case .tint40: - return ColorValue(0xC6B1DE) - case .tint50: - return ColorValue(0xE0D3ED) - case .tint60: - return ColorValue(0xF7F4FB) - } - case .red: - switch token { - case .primary: - return ColorValue(0xD13438) - case .shade10: - return ColorValue(0xBC2F32) - case .shade20: - return ColorValue(0x9F282B) - case .shade30: - return ColorValue(0x751D1F) - case .shade40: - return ColorValue(0x3F1011) - case .shade50: - return ColorValue(0x210809) - case .tint10: - return ColorValue(0xD7494C) - case .tint20: - return ColorValue(0xDC5E62) - case .tint30: - return ColorValue(0xE37D80) - case .tint40: - return ColorValue(0xF1BBBC) - case .tint50: - return ColorValue(0xF8DADB) - case .tint60: - return ColorValue(0xFDF6F6) - } - case .royalBlue: - switch token { - case .primary: - return ColorValue(0x004E8C) - case .shade10: - return ColorValue(0x00467E) - case .shade20: - return ColorValue(0x003B6A) - case .shade30: - return ColorValue(0x002C4E) - case .shade40: - return ColorValue(0x00172A) - case .shade50: - return ColorValue(0x000C16) - case .tint10: - return ColorValue(0x125E9A) - case .tint20: - return ColorValue(0x286FA8) - case .tint30: - return ColorValue(0x4A89BA) - case .tint40: - return ColorValue(0x9ABFDC) - case .tint50: - return ColorValue(0xC7DCED) - case .tint60: - return ColorValue(0xF0F6FA) - } - case .seafoam: - switch token { - case .primary: - return ColorValue(0x00CC6A) - case .shade10: - return ColorValue(0x00B85F) - case .shade20: - return ColorValue(0x009B51) - case .shade30: - return ColorValue(0x00723B) - case .shade40: - return ColorValue(0x003D20) - case .shade50: - return ColorValue(0x002111) - case .tint10: - return ColorValue(0x19D279) - case .tint20: - return ColorValue(0x34D889) - case .tint30: - return ColorValue(0x5AE0A0) - case .tint40: - return ColorValue(0xA8F0CD) - case .tint50: - return ColorValue(0xCFF7E4) - case .tint60: - return ColorValue(0xF3FDF8) - } - case .silver: - switch token { - case .primary: - return ColorValue(0x859599) - case .shade10: - return ColorValue(0x78868A) - case .shade20: - return ColorValue(0x657174) - case .shade30: - return ColorValue(0x4A5356) - case .shade40: - return ColorValue(0x282D2E) - case .shade50: - return ColorValue(0x151818) - case .tint10: - return ColorValue(0x92A1A5) - case .tint20: - return ColorValue(0xA0AEB1) - case .tint30: - return ColorValue(0xB3BFC2) - case .tint40: - return ColorValue(0xD8DFE0) - case .tint50: - return ColorValue(0xEAEEEF) - case .tint60: - return ColorValue(0xFAFBFB) - } - case .steel: - switch token { - case .primary: - return ColorValue(0x005B70) - case .shade10: - return ColorValue(0x005265) - case .shade20: - return ColorValue(0x004555) - case .shade30: - return ColorValue(0x00333F) - case .shade40: - return ColorValue(0x001B22) - case .shade50: - return ColorValue(0x000F12) - case .tint10: - return ColorValue(0x0F6C81) - case .tint20: - return ColorValue(0x237D92) - case .tint30: - return ColorValue(0x4496A9) - case .tint40: - return ColorValue(0x94C8D4) - case .tint50: - return ColorValue(0xC3E1E8) - case .tint60: - return ColorValue(0xEFF7F9) - } - case .teal: - switch token { - case .primary: - return ColorValue(0x038387) - case .shade10: - return ColorValue(0x037679) - case .shade20: - return ColorValue(0x026467) - case .shade30: - return ColorValue(0x02494C) - case .shade40: - return ColorValue(0x012728) - case .shade50: - return ColorValue(0x001516) - case .tint10: - return ColorValue(0x159195) - case .tint20: - return ColorValue(0x2AA0A4) - case .tint30: - return ColorValue(0x4CB4B7) - case .tint40: - return ColorValue(0x9BD9DB) - case .tint50: - return ColorValue(0xC7EBEC) - case .tint60: - return ColorValue(0xF0FAFA) - } - case .yellow: - switch token { - case .primary: - return ColorValue(0xFDE300) - case .shade10: - return ColorValue(0xE4CC00) - case .shade20: - return ColorValue(0xC0AD00) - case .shade30: - return ColorValue(0x817400) - case .shade40: - return ColorValue(0x4C4400) - case .shade50: - return ColorValue(0x282400) - case .tint10: - return ColorValue(0xFDE61E) - case .tint20: - return ColorValue(0xFDEA3D) - case .tint30: - return ColorValue(0xFEEE66) - case .tint40: - return ColorValue(0xFEF7B2) - case .tint50: - return ColorValue(0xFFFAD6) - case .tint60: - return ColorValue(0xFFFEF5) - } - } - } - - // MARK: Initialization - - @available(*, unavailable) - private override init() { - preconditionFailure("GlobalTokens should never be initialized!") - } -} diff --git a/ios/FluentUI/Core/UIKit+SwiftUI_interoperability.swift b/ios/FluentUI/Core/UIKit+SwiftUI_interoperability.swift deleted file mode 100644 index 62ae5d41d2..0000000000 --- a/ios/FluentUI/Core/UIKit+SwiftUI_interoperability.swift +++ /dev/null @@ -1,64 +0,0 @@ -// -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. -// - -import UIKit -import SwiftUI - -/// This is a generic UIView wrapper that allows SwiftUI to use UIKit views in its hierarchy. -struct UIViewAdapter: UIViewRepresentable { - - var makeView: () -> UIView - - init(_ makeView: @escaping @autoclosure () -> UIView) { - self.makeView = makeView - } - - func makeUIView(context: Context) -> UIStackView { - // Using a UIStackView as the container ensures that the content - // UIView respects the frame defined in the SwiftUI layer. - return UIStackView(arrangedSubviews: [makeView()]) - } - - func updateUIView(_ stackview: UIStackView, context: Context) { - // The UIStackView container needs to update its arranged subviews to cover - // the case where the makeview property now provides a different view. - stackview.arrangedSubviews.forEach({ subview in - subview.removeFromSuperview() - }) - - stackview.addArrangedSubview(makeView()) - } -} - -/// UILabel wrapper that allows SwiftUI to support NSAttributedString -struct AttributedText: UIViewRepresentable { - - let attributedString: NSAttributedString - let preferredMaxWidth: CGFloat - - init(_ attributedString: NSAttributedString, _ preferredMaxWidth: CGFloat) { - self.attributedString = attributedString - self.preferredMaxWidth = preferredMaxWidth - } - - func makeUIView(context: Context) -> UILabel { - let label = UILabel() - - // Setting this ensures the UIViewRepresentable respects the parent view's width - label.setContentCompressionResistancePriority(.defaultLow, for: .horizontal) - label.lineBreakMode = .byWordWrapping - label.numberOfLines = 0 - label.adjustsFontForContentSizeCategory = true - return label - } - - func updateUIView(_ label: UILabel, context: Context) { - // Update the UILabel's attributes if it changes. - DispatchQueue.main.async { - label.attributedText = attributedString - label.preferredMaxLayoutWidth = preferredMaxWidth - } - } -} diff --git a/ios/xcode/FluentUILib_common.xcconfig b/ios/xcode/FluentUILib_common.xcconfig deleted file mode 100644 index 4d9d1cd323..0000000000 --- a/ios/xcode/FluentUILib_common.xcconfig +++ /dev/null @@ -1,15 +0,0 @@ -// -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. -// - -CODE_SIGN_STYLE = Automatic -MTL_FAST_MATH = YES -OTHER_LDFLAGS = -ObjC -PRODUCT_NAME = FluentUI -SKIP_INSTALL = YES -SWIFT_VERSION = 5.0 - -// Objective C header file paths -FLUENT_HSP_INPUT = $(DERIVED_SOURCES_DIR) -FLUENT_HSP_OUTPUT = $(BUILT_PRODUCTS_DIR)/include/$(PRODUCT_MODULE_NAME) diff --git a/ios/xcode/FluentUILib_debug.xcconfig b/ios/xcode/FluentUILib_debug.xcconfig deleted file mode 100644 index 4caa90885b..0000000000 --- a/ios/xcode/FluentUILib_debug.xcconfig +++ /dev/null @@ -1,7 +0,0 @@ -// -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. -// - -#include "FluentUILib_common.xcconfig" -ENABLE_ADDRESS_SANITIZER = YES diff --git a/ios/xcode/FluentUILib_release.xcconfig b/ios/xcode/FluentUILib_release.xcconfig deleted file mode 100644 index aa0bb9fcc8..0000000000 --- a/ios/xcode/FluentUILib_release.xcconfig +++ /dev/null @@ -1,6 +0,0 @@ -// -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. -// - -#include "FluentUILib_common.xcconfig" diff --git a/ios/xcode/FluentUIResources.xcconfig b/ios/xcode/FluentUIResources.xcconfig deleted file mode 100644 index b6e34366b3..0000000000 --- a/ios/xcode/FluentUIResources.xcconfig +++ /dev/null @@ -1,12 +0,0 @@ -// -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. -// - -CODE_SIGNING_ALLOWED = NO -INFOPLIST_FILE = FluentUI.Resources/Info.plist -INSTALL_PATH = $(LOCAL_LIBRARY_DIR)/Bundles -PRODUCT_BUNDLE_IDENTIFIER = com.microsoft.FluentUIResources-ios -PRODUCT_NAME = FluentUIResources-ios -SKIP_INSTALL = YES -WRAPPER_EXTENSION = bundle diff --git a/ios/xcode/FluentUITests.xcconfig b/ios/xcode/FluentUITests.xcconfig deleted file mode 100644 index 32c8108368..0000000000 --- a/ios/xcode/FluentUITests.xcconfig +++ /dev/null @@ -1,16 +0,0 @@ -// -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. -// - -ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES -CODE_SIGN_STYLE = Automatic -DEVELOPMENT_TEAM = UBF8T346G9 -INFOPLIST_FILE = FluentUI.Tests/Info.plist -LD_RUNPATH_SEARCH_PATHS = $(inherited) @executable_path/Frameworks @loader_path/Frameworks -PRODUCT_BUNDLE_IDENTIFIER = com.microsoft.FluentUITests -PRODUCT_NAME = $(TARGET_NAME) -SUPPORTED_PLATFORMS = iphoneos iphonesimulator xros xrsimulator -SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO -SWIFT_VERSION = 5.0 -TARGETED_DEVICE_FAMILY = 1,2,7 diff --git a/ios/xcode/FluentUI_common.xcconfig b/ios/xcode/FluentUI_common.xcconfig deleted file mode 100644 index 9ab0929fd3..0000000000 --- a/ios/xcode/FluentUI_common.xcconfig +++ /dev/null @@ -1,56 +0,0 @@ -// -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. -// - -ALWAYS_SEARCH_USER_PATHS = NO -CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES -CLANG_ANALYZER_NONNULL = YES -CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE -CLANG_CXX_LANGUAGE_STANDARD = gnu++14 -CLANG_CXX_LIBRARY = libc++ -CLANG_ENABLE_MODULES = YES -CLANG_ENABLE_OBJC_ARC = YES -CLANG_ENABLE_OBJC_WEAK = YES -CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES -CLANG_WARN_BOOL_CONVERSION = YES -CLANG_WARN_COMMA = YES -CLANG_WARN_CONSTANT_CONVERSION = YES -CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES -CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR -CLANG_WARN_DOCUMENTATION_COMMENTS = YES -CLANG_WARN_EMPTY_BODY = YES -CLANG_WARN_ENUM_CONVERSION = YES -CLANG_WARN_INFINITE_RECURSION = YES -CLANG_WARN_INT_CONVERSION = YES -CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES -CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES -CLANG_WARN_OBJC_LITERAL_CONVERSION = YES -CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR -CLANG_WARN_RANGE_LOOP_ANALYSIS = YES -CLANG_WARN_STRICT_PROTOTYPES = YES -CLANG_WARN_SUSPICIOUS_MOVE = YES -CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE -CLANG_WARN_UNREACHABLE_CODE = YES -CLANG_WARN__DUPLICATE_METHOD_MATCH = YES -CODE_SIGN_IDENTITY = iPhone Developer -COPY_PHASE_STRIP = NO -CURRENT_PROJECT_VERSION = 1 -ENABLE_STRICT_OBJC_MSGSEND = YES -GCC_C_LANGUAGE_STANDARD = gnu11 -GCC_NO_COMMON_BLOCKS = YES -GCC_TREAT_WARNINGS_AS_ERRORS = YES -GCC_WARN_64_TO_32_BIT_CONVERSION = YES -GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR -GCC_WARN_UNDECLARED_SELECTOR = YES -GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE -GCC_WARN_UNUSED_FUNCTION = YES -GCC_WARN_UNUSED_VARIABLE = YES -IPHONEOS_DEPLOYMENT_TARGET = 15.0 -SDKROOT = iphoneos -SUPPORTED_PLATFORMS = iphoneos iphonesimulator xros xrsimulator -SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO -SWIFT_TREAT_WARNINGS_AS_ERRORS = YES -TARGETED_DEVICE_FAMILY = 1,2,7 -VERSIONING_SYSTEM = apple-generic -VERSION_INFO_PREFIX = diff --git a/ios/xcode/FluentUI_debug.xcconfig b/ios/xcode/FluentUI_debug.xcconfig deleted file mode 100644 index a8e7a4cf92..0000000000 --- a/ios/xcode/FluentUI_debug.xcconfig +++ /dev/null @@ -1,17 +0,0 @@ -// -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. -// - -#include "FluentUI_common.xcconfig" - -DEBUG_INFORMATION_FORMAT = dwarf -ENABLE_TESTABILITY = YES -GCC_PREPROCESSOR_DEFINITIONS = $(inherited) DEBUG=1 -MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE -ONLY_ACTIVE_ARCH = YES -GCC_DYNAMIC_NO_PIC = NO -GCC_OPTIMIZATION_LEVEL = 0 -SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG -SWIFT_OPTIMIZATION_LEVEL = -Onone -ENABLE_ADDRESS_SANITIZER = YES diff --git a/ios/xcode/FluentUI_release.xcconfig b/ios/xcode/FluentUI_release.xcconfig deleted file mode 100644 index cd05717b5a..0000000000 --- a/ios/xcode/FluentUI_release.xcconfig +++ /dev/null @@ -1,13 +0,0 @@ -// -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. -// - -#include "FluentUI_common.xcconfig" - -DEBUG_INFORMATION_FORMAT = dwarf-with-dsym -ENABLE_NS_ASSERTIONS = NO -MTL_ENABLE_DEBUG_INFO = NO -SWIFT_COMPILATION_MODE = wholemodule -SWIFT_OPTIMIZATION_LEVEL = -O -VALIDATE_PRODUCT = YES diff --git a/macos/FluentUIResources-macos/FluentUIResources-Info.plist b/macos/FluentUIResources-macos/FluentUIResources-Info.plist deleted file mode 100644 index f3ada4c873..0000000000 --- a/macos/FluentUIResources-macos/FluentUIResources-Info.plist +++ /dev/null @@ -1,22 +0,0 @@ - - - - - CFBundleDevelopmentRegion - $(DEVELOPMENT_LANGUAGE) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - $(PRODUCT_BUNDLE_PACKAGE_TYPE) - CFBundleShortVersionString - 1.0 - CFBundleVersion - 1 - NSPrincipalClass - - - diff --git a/macos/FluentUIUnitTest/SimpleObjCTest.h b/macos/FluentUIUnitTest/SimpleObjCTest.h deleted file mode 100644 index a4be6dd578..0000000000 --- a/macos/FluentUIUnitTest/SimpleObjCTest.h +++ /dev/null @@ -1,14 +0,0 @@ -// -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. -// - -@import XCTest; - -NS_ASSUME_NONNULL_BEGIN - -/// Ensures that importing FluentUI into ObjC has no issues. -@interface SimpleObjCTest : XCTestCase -@end - -NS_ASSUME_NONNULL_END diff --git a/macos/FluentUIUnitTest/SimpleObjCTest.m b/macos/FluentUIUnitTest/SimpleObjCTest.m deleted file mode 100644 index 3ecf9c1279..0000000000 --- a/macos/FluentUIUnitTest/SimpleObjCTest.m +++ /dev/null @@ -1,10 +0,0 @@ -// -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. -// - -@import FluentUI; -#import "SimpleObjCTest.h" - -@implementation SimpleObjCTest -@end diff --git a/macos/xcode/FluentUI.xcodeproj/xcshareddata/xcschemes/FluentUI-macOS.xcscheme b/macos/xcode/FluentUI.xcodeproj/xcshareddata/xcschemes/FluentUI-macOS.xcscheme deleted file mode 100644 index bf7c5472c0..0000000000 --- a/macos/xcode/FluentUI.xcodeproj/xcshareddata/xcschemes/FluentUI-macOS.xcscheme +++ /dev/null @@ -1,88 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/scripts/BumpVersion.swift b/scripts/BumpVersion.swift index cd02d17bf8..c42e263bd4 100755 --- a/scripts/BumpVersion.swift +++ b/scripts/BumpVersion.swift @@ -128,7 +128,7 @@ do { func updatePlist(path: String, values: [String]) { guard let plistData = FileManager.default.contents(atPath: path), var plistDictionary = try? PropertyListSerialization.propertyList(from: plistData, options: [], format: nil) as? [String: Any] else { - print("\(redColor)Error: Failed to read plist file.\(resetColor)") + print("\(redColor)Error: Failed to read plist file at \(path).\(resetColor)") exit(1) } @@ -139,14 +139,14 @@ func updatePlist(path: String, values: [String]) { } guard let modifiedPlistData = try? PropertyListSerialization.data(fromPropertyList: plistDictionary, format: .xml, options: 0) else { - print("\(redColor)Failed to serialize plist data.\(resetColor)") + print("\(redColor)Failed to serialize plist data at \(path).\(resetColor)") exit(1) } do { try modifiedPlistData.write(to: URL(fileURLWithPath: path)) } catch { - print("\(redColor)Failed to write modified plist data. \(error.localizedDescription)\(resetColor)") + print("\(redColor)Failed to write modified plist data at \(path). \(error.localizedDescription)\(resetColor)") exit(1) } } @@ -154,16 +154,16 @@ func updatePlist(path: String, values: [String]) { let values = newVersion.components(separatedBy: ".") let majorBump = Int(values[0])! -updatePlist(path: "\(currentDirectory)/ios/FluentUI.Demo/FluentUI.Demo/Info.plist", +updatePlist(path: "\(currentDirectory)/Demos/FluentUIDemo_iOS/FluentUI.Demo/Info.plist", values: ["\(1 + majorBump)\(croppedNewValue)", "\(137 + majorBump)\(croppedNewValue)"]) -updatePlist(path: "\(currentDirectory)/ios/FluentUI.Resources/Info.plist", +updatePlist(path: "\(currentDirectory)/Sources/FluentUI_iOS/Resources/Version.plist", values: [newVersion, newVersion]) -updatePlist(path: "\(currentDirectory)/macos/FluentUI/FluentUI-Info.plist", +updatePlist(path: "\(currentDirectory)/Sources/FluentUI_macOS/FluentUI-Info.plist", values: [newVersion, newVersion]) -updatePlist(path: "\(currentDirectory)/macos/FluentUITestApp/FluentUITestApp-Info.plist", +updatePlist(path: "\(currentDirectory)/Demos/FluentUIDemo_macOS/FluentUITestApp/FluentUITestApp-Info.plist", values: [newVersion, "\(62 + majorBump)\(croppedNewValue)"]) print("\(greenColor)Successfully updated fluent version to \(newVersion)!\nFeel free to verify all strings have been bumped properly. For reference, see https://github.com/microsoft/fluentui-apple/pull/1812/files.\(resetColor)") diff --git a/scripts/generate_build_number.sh b/scripts/generate_build_number.sh deleted file mode 100755 index 5ad7405313..0000000000 --- a/scripts/generate_build_number.sh +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/bash - -# Tweak our build number and export it as a variable for the nuget packing script -BUILD_VERSION_SUFFIX="" -BUILD_VERSION_STRING="0.0.0.1" - -if [ -n "$BUILD_NUMBER_SUFFIX_OVERRIDE" ]; then - # Allow someone calling us to provide an override to always add a suffix to a given build number by providing an env variable - ADJUSTED_BUILD_NUMBER_SUFFIX_OVERRIDE="${BUILD_NUMBER_SUFFIX_OVERRIDE//[^a-z0-9A-Z]/}" - BUILD_VERSION_SUFFIX="-$ADJUSTED_BUILD_NUMBER_SUFFIX_OVERRIDE" -elif [ -n "$BUILD_SOURCEBRANCHNAME" ] && [ "$BUILD_SOURCEBRANCHNAME" != "main" ]; then - # Otherwise append the branch name unless we're the main branch for this repo - ADJUSTED_SOURCEBRANCHNAME="${BUILD_SOURCEBRANCHNAME//[^a-z0-9A-Z]/}" - BUILD_VERSION_SUFFIX="-$ADJUSTED_SOURCEBRANCHNAME" -fi - -if [ -n "$BUILD_BUILDNUMBER" ]; then - BUILD_VERSION_STRING="$BUILD_BUILDNUMBER" -fi - -echo "Original Build Number: $BUILD_BUILDNUMBER" -echo "Adjusted Build Number: $BUILD_VERSION_STRING$BUILD_VERSION_SUFFIX" - -echo "##vso[task.setvariable variable=sanitizedBuildNumber]$BUILD_VERSION_STRING$BUILD_VERSION_SUFFIX" diff --git a/scripts/localize.sh b/scripts/localize.sh index d419cc5e9a..534c40c3f3 100755 --- a/scripts/localize.sh +++ b/scripts/localize.sh @@ -20,7 +20,7 @@ if [ -z $TDBUILD_AAD_APPLICATION_CLIENT_SECRET ]; then fi # Localize iOS resources -scripts/GetLocalizedFiles.sh -t $TDBUILD_TEAM_ID -u -a $TDBUILD_AAD_APPLICATION_CLIENT_ID -p $TDBUILD_AAD_APPLICATION_CLIENT_SECRET -f ios/FluentUI/Resources/Localization/en.lproj -r ios -o ios/FluentUI/Resources/Localization +scripts/GetLocalizedFiles.sh -t $TDBUILD_TEAM_ID -u -a $TDBUILD_AAD_APPLICATION_CLIENT_ID -p $TDBUILD_AAD_APPLICATION_CLIENT_SECRET -f Sources/FluentUI_iOS/Resources/Localization/en.lproj -r ios -o Sources/FluentUI_iOS/Resources/Localization # Localize macOS resources -scripts/GetLocalizedFiles.sh -t $TDBUILD_TEAM_ID -u -a $TDBUILD_AAD_APPLICATION_CLIENT_ID -p $TDBUILD_AAD_APPLICATION_CLIENT_SECRET -f macos/FluentUI/Resources/Strings/en.lproj -r macos -o macos/FluentUI/Resources/Strings +scripts/GetLocalizedFiles.sh -t $TDBUILD_TEAM_ID -u -a $TDBUILD_AAD_APPLICATION_CLIENT_ID -p $TDBUILD_AAD_APPLICATION_CLIENT_SECRET -f Sources/FluentUI_macOS/Resources/Strings/en.lproj -r macos -o Sources/FluentUI_macOS/Resources/Strings diff --git a/scripts/nuget_publish.sh b/scripts/nuget_publish.sh deleted file mode 100755 index 0fa6b44624..0000000000 --- a/scripts/nuget_publish.sh +++ /dev/null @@ -1,66 +0,0 @@ -#!/bin/bash - -# nuget_publish.sh -# A local version of the fluentui-apple-publish-nuget.yml Azure Pipeline that fires all the jobs sequentially. -# Useful for local validation, keep in sync with .ado/fluentui-apple-publish-nuget.yml -# Note: Execute this script from the root of the repository, such as `./scripts/nuget_publish.sh` - -# Keep an exit code so that we can return a non-zero exit code if any build fails -# while still running all builds each time. -EXIT_CODE=0 - -# Path to the xcode build wrapper script -XCODEBUILD_WRAPPER_LOCATION='scripts/xcodebuild_wrapper.sh' - -# Extra arguments for xcode build to mimic nuget publishing environment -DERIVED_DATA_EXTRA_ARG='-derivedDataPath DerivedData' -STANDARD_XCCONFIG_EXTRA_ARG='-xcconfig .ado/xcconfig/publish_overrides.xcconfig' -IOS_DEVICE_XCCONFIG_EXTRA_ARG='-xcconfig .ado/xcconfig/publish_overrides_ios_device.xcconfig' - -function handle_exit_code() -{ - if [ $? -ne 0 ] - then - echo "Previous command exited with non-zero exit code" - # Intentionally changing the global EXIT_CODE variable - EXIT_CODE=1 - fi -} - -echo "Building and Testing macOS Debug" -$XCODEBUILD_WRAPPER_LOCATION macos_build FluentUI-macOS Debug build $DERIVED_DATA_EXTRA_ARG $STANDARD_XCCONFIG_EXTRA_ARG -handle_exit_code - -echo "Building and Testing macOS Release" -$XCODEBUILD_WRAPPER_LOCATION macos_build FluentUI-macOS Release build $DERIVED_DATA_EXTRA_ARG $STANDARD_XCCONFIG_EXTRA_ARG -handle_exit_code - -echo "Building iOS Static Lib Debug Simulator" -$XCODEBUILD_WRAPPER_LOCATION ios_simulator_build FluentUI-iOS Debug build $DERIVED_DATA_EXTRA_ARG $STANDARD_XCCONFIG_EXTRA_ARG -handle_exit_code - -echo "Building iOS Static Lib Release Simulator" -$XCODEBUILD_WRAPPER_LOCATION ios_simulator_build FluentUI-iOS Release build $DERIVED_DATA_EXTRA_ARG $STANDARD_XCCONFIG_EXTRA_ARG -handle_exit_code - -echo "Building Static Lib iOS Debug Device" -$XCODEBUILD_WRAPPER_LOCATION ios_device_build FluentUI-iOS Debug build $DERIVED_DATA_EXTRA_ARG $IOS_DEVICE_XCCONFIG_EXTRA_ARG -handle_exit_code - -echo "Building iOS Release Static Lib Device" -$XCODEBUILD_WRAPPER_LOCATION ios_device_build FluentUI-iOS Release build $DERIVED_DATA_EXTRA_ARG $IOS_DEVICE_XCCONFIG_EXTRA_ARG -handle_exit_code - -echo "Running scripts/prepare_for_nuget_pack.sh" -scripts/prepare_for_nuget_pack.sh -handle_exit_code - -# Check if any of our individual build steps failed -if [ $EXIT_CODE -ne 0 ] -then - echo "NuGet Pack Build Failed, please check logs for failures" -else - echo "NuGet Pack Build Succeeded" -fi - -exit $EXIT_CODE \ No newline at end of file diff --git a/scripts/prepare_for_nuget_pack.sh b/scripts/prepare_for_nuget_pack.sh deleted file mode 100755 index 307e1d3360..0000000000 --- a/scripts/prepare_for_nuget_pack.sh +++ /dev/null @@ -1,92 +0,0 @@ -#!/bin/bash - -# NuGet packing doesn't support symlinks, so zip up our frameworks first to preserve the symlinks - -# Fail if any of the commands fails to run -set -e - -# Make a directory if necessary, no-op if it already exists -# -# \param $1 the name of the folder to create -function make_dir_if_necessary() -{ - if ! [ -d "$1" ]; then - echo "Making $1 folder" - mkdir "$1" - else - echo "$1 folder already exists" - fi -} - -# A thin wrapper around rsync to exclude specific swift source info files -# -# \param $1+ the standard input to rsync without any extra flags provided -function rsync_excluding_swift_source_info_files() -{ - rsync -a --exclude '*.swiftsourceinfo' --prune-empty-dirs "$@" -} - -# Build up our output directory in Products/nuget -PRODUCTS_DIR="DerivedData/Build/Products" -NUGET_OUTPUT_DIR="$PRODUCTS_DIR/nuget" -make_dir_if_necessary "$NUGET_OUTPUT_DIR" - -NUGET_OUTPUT_INCLUDE_DIR="$NUGET_OUTPUT_DIR/include" -make_dir_if_necessary "$NUGET_OUTPUT_INCLUDE_DIR" - -NUGET_OUTPUT_INCLUDE_DIR_IOS="$NUGET_OUTPUT_INCLUDE_DIR/ios" -make_dir_if_necessary "$NUGET_OUTPUT_INCLUDE_DIR_IOS" - -NUGET_OUTPUT_INCLUDE_DIR_IOS_FLUENTUI="$NUGET_OUTPUT_INCLUDE_DIR_IOS/FluentUI" -make_dir_if_necessary "$NUGET_OUTPUT_INCLUDE_DIR_IOS_FLUENTUI" - -# Copy a single generated header into our output directory in an includes folder. Ensure we nest a FluentUI folder for proper `#import ` imports -# Pick the release simulator header since the device target has some arm64 specific ifdefs while the simulator version works on all platforms. -# Rename the FluentUILib-Swift.h to FluentUI-Swift.h for consistency with Framework consumption -echo "Copy iOS generated Swift header to include dir" -rsync -a "DerivedData/Build/Intermediates.noindex/FluentUI.build/Release-iphonesimulator/FluentUILib.build/DerivedSources/FluentUI-Swift.h" "$NUGET_OUTPUT_INCLUDE_DIR_IOS_FLUENTUI/FluentUI-Swift.h" - -# cd into the products directory to make copying all the output easier -cd $PRODUCTS_DIR - -# Copy each platform -make_dir_if_necessary "nuget/Debug-macosx" -echo "Copy Debug-macosx Framework into nuget folder" -rsync_excluding_swift_source_info_files Debug/FluentUI.framework/ nuget/Debug-macosx/FluentUI.framework/ - -make_dir_if_necessary "nuget/Ship-macosx" -echo "Copy Ship-macosx Framework into nuget folder" -rsync_excluding_swift_source_info_files Release/FluentUI.framework/ nuget/Ship-macosx/FluentUI.framework/ - -make_dir_if_necessary "nuget/Debug-iphoneos" -echo "Copy Debug-iphoneos build output into nuget folder" -rsync -a Debug-iphoneos/libFluentUI.a nuget/Debug-iphoneos/ -rsync_excluding_swift_source_info_files Debug-iphoneos/FluentUI.swiftmodule/ nuget/Debug-iphoneos/FluentUI.swiftmodule/ -rsync -a Debug-iphoneos/FluentUIResources-ios.bundle/ nuget/Debug-iphoneos/FluentUIResources-ios.bundle/ - -make_dir_if_necessary "nuget/Ship-iphoneos" -echo "Copy Ship-iphoneos build output into nuget folder" -rsync -a Release-iphoneos/libFluentUI.a nuget/Ship-iphoneos/ -rsync_excluding_swift_source_info_files Release-iphoneos/FluentUI.swiftmodule/ nuget/Ship-iphoneos/FluentUI.swiftmodule/ -rsync -a Release-iphoneos/FluentUIResources-ios.bundle/ nuget/Ship-iphoneos/FluentUIResources-ios.bundle/ - -make_dir_if_necessary "nuget/Debug-iphonesimulator" -echo "Copy Debug-iphonesimulator build output into nuget folder" -rsync -a Debug-iphonesimulator/libFluentUI.a nuget/Debug-iphonesimulator/ -rsync_excluding_swift_source_info_files Debug-iphonesimulator/FluentUI.swiftmodule/ nuget/Debug-iphonesimulator/FluentUI.swiftmodule/ -rsync -a Debug-iphonesimulator/FluentUIResources-ios.bundle/ nuget/Debug-iphonesimulator/FluentUIResources-ios.bundle/ - -make_dir_if_necessary "nuget/Ship-iphonesimulator" -echo "Copy Ship-iphonesimulator build output into nuget folder" -rsync -a Release-iphonesimulator/libFluentUI.a nuget/Ship-iphonesimulator/ -rsync_excluding_swift_source_info_files Release-iphonesimulator/FluentUI.swiftmodule/ nuget/Ship-iphonesimulator/FluentUI.swiftmodule/ -rsync -a Release-iphonesimulator/FluentUIResources-ios.bundle/ nuget/Ship-iphonesimulator/FluentUIResources-ios.bundle/ - -# cd into our nuget folder to finally zip up our build output -cd "nuget" - -# Zip the build output -echo "Creating zip archive named BuildOutput.zip containing all the platform folders" -zip --symlinks -r BuildOutput.zip Debug-macosx/ Ship-macosx/ Debug-iphoneos/ Ship-iphoneos/ Debug-iphonesimulator/ Ship-iphonesimulator/ include/ - -exit $? diff --git a/scripts/xcode_select_current_version.sh b/scripts/xcode_select_current_version.sh index 99ecee7307..141bff271d 100755 --- a/scripts/xcode_select_current_version.sh +++ b/scripts/xcode_select_current_version.sh @@ -3,7 +3,7 @@ if [ -n "$XCODE_PATH_OVERRIDE" ]; then # If someone calls this with the XCODE_PATH_OVERRIDE variable set to a path to a developer dir, use it instead XCODE_PATH="$XCODE_PATH_OVERRIDE" else - XCODE_PATH='/Applications/Xcode_15.2.app/Contents/Developer' + XCODE_PATH='/Applications/Xcode_15.3.app/Contents/Developer' fi echo "Running command: sudo xcode-select --switch $XCODE_PATH" diff --git a/scripts/xcodebuild_wrapper.sh b/scripts/xcodebuild_wrapper.sh index 8b760a0a94..8d4e85ff0a 100755 --- a/scripts/xcodebuild_wrapper.sh +++ b/scripts/xcodebuild_wrapper.sh @@ -30,7 +30,7 @@ function invoke_xcodebuild() # \param $3+ build commands function ios_simulator_build() { - invoke_xcodebuild workspace "ios/FluentUI.xcworkspace" "$1" "$2" iphonesimulator "${@:3}" + invoke_xcodebuild project "Demos/FluentUIDemo_iOS/FluentUI.Demo.xcodeproj" "$1" "$2" iphonesimulator "${@:3}" return $? } @@ -41,7 +41,7 @@ function ios_simulator_build() # \param $3+ build commands function ios_device_build() { - invoke_xcodebuild workspace "ios/FluentUI.xcworkspace" "$1" "$2" iphoneos "${@:3}" + invoke_xcodebuild project "Demos/FluentUIDemo_iOS/FluentUI.Demo.xcodeproj" "$1" "$2" iphoneos "${@:3}" return $? } @@ -52,7 +52,7 @@ function ios_device_build() # \param $3+ build commands function macos_build() { - invoke_xcodebuild project "macos/xcode/FluentUI.xcodeproj" "$1" "$2" macosx "${@:3}" + invoke_xcodebuild project "Demos/FluentUIDemo_macOS/xcode/FluentUI.xcodeproj" "$1" "$2" macosx "${@:3}" return $? } @@ -63,7 +63,7 @@ function macos_build() # \param $3+ build commands function visionos_simulator_build() { - invoke_xcodebuild workspace "ios/FluentUI.xcworkspace" "$1" "$2" xrsimulator "${@:3}" + invoke_xcodebuild project "Demos/FluentUIDemo_iOS/FluentUI.Demo.xcodeproj" "$1" "$2" xrsimulator "${@:3}" return $? }