diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9624858b23..da2846b1c7 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -53,7 +53,7 @@ jobs: echo "TestResultsMac.xcresult not found." fi - name: Upload TestResultsMac.zip - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: xctest-resultsMac path: TestResultsMac.zip @@ -66,7 +66,7 @@ jobs: echo "TestResultsiOS.xcresult not found." fi - name: Upload TestResultsiOS.zip - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: xctest-resultsiOS path: TestResultsiOS.zip 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 99% rename from ios/FluentUI.Demo/FluentUI.Demo.xcodeproj/project.pbxproj rename to Demos/FluentUIDemo_iOS/FluentUI.Demo.xcodeproj/project.pbxproj index b5a4c35988..f05b83f535 100644 --- a/ios/FluentUI.Demo/FluentUI.Demo.xcodeproj/project.pbxproj +++ b/Demos/FluentUIDemo_iOS/FluentUI.Demo.xcodeproj/project.pbxproj @@ -87,9 +87,8 @@ 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 */; }; 92B45E4E279A1A0B00E72517 /* DemoAppearanceControlView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 92B45E4D279A1A0B00E72517 /* DemoAppearanceControlView.swift */; }; 92BF13322BE405710068422C /* AliasColorTokensDemoController_SwiftUI.swift in Sources */ = {isa = PBXBuildFile; fileRef = 92BF13312BE405710068422C /* AliasColorTokensDemoController_SwiftUI.swift */; }; @@ -229,6 +228,7 @@ 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 = ""; }; 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 = ""; }; @@ -345,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; }; @@ -473,6 +473,7 @@ A5CEC20320E436F10016922A = { isa = PBXGroup; children = ( + 9246B7052C628CAE004A4440 /* fluentui-apple */, A5CEC20E20E436F10016922A /* FluentUI.Demo */, 3A83F7C0295110FF00EF6629 /* FluentUIDemoTests */, A5CEC20D20E436F10016922A /* Products */, @@ -645,6 +646,7 @@ 8F0B81112670200300463726 /* AppCenterDistribute */, 8F0B8113267021A700463726 /* AppCenterAnalytics */, 8F0B8115267021A700463726 /* AppCenterCrashes */, + 9246B7062C628CF6004A4440 /* FluentUI */, ); productName = OfficeUIFabric.Demo; productReference = A5CEC20C20E436F10016922A /* FluentUI.Demo.app */; @@ -745,7 +747,6 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 923DF2DF27115B4700637646 /* FluentUIResources-ios.bundle in Resources */, A5CEC21C20E436F20016922A /* LaunchScreen.storyboard in Resources */, A5CEC21920E436F20016922A /* Assets.xcassets in Resources */, ); @@ -1106,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; @@ -1382,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 100% rename from ios/FluentUI.xcworkspace/xcshareddata/swiftpm/Package.resolved rename to Demos/FluentUIDemo_iOS/FluentUI.Demo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved 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/DemoAppearanceControlView.swift b/Demos/FluentUIDemo_iOS/FluentUI.Demo/DemoAppearanceControlView.swift similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/DemoAppearanceControlView.swift rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/DemoAppearanceControlView.swift diff --git a/ios/FluentUI.Demo/FluentUI.Demo/DemoAppearanceMenu.swift b/Demos/FluentUIDemo_iOS/FluentUI.Demo/DemoAppearanceMenu.swift similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/DemoAppearanceMenu.swift rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/DemoAppearanceMenu.swift 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 98% rename from ios/FluentUI.Demo/FluentUI.Demo/DemoController.swift rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/DemoController.swift index 7afe9bbafc..8def63a770 100644 --- a/ios/FluentUI.Demo/FluentUI.Demo/DemoController.swift +++ b/Demos/FluentUIDemo_iOS/FluentUI.Demo/DemoController.swift @@ -96,7 +96,8 @@ class DemoController: UIViewController { present(alert, animated: true) if autoDismiss { - DispatchQueue.main.asyncAfter(deadline: .now() + 1) { + let delay: TimeInterval = UIAccessibility.isVoiceOverRunning ? 3 : 1 + DispatchQueue.main.asyncAfter(deadline: .now() + delay) { self.dismiss(animated: true) } } else { diff --git a/ios/FluentUI.Demo/FluentUI.Demo/DemoHostingController.swift b/Demos/FluentUIDemo_iOS/FluentUI.Demo/DemoHostingController.swift similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/DemoHostingController.swift rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/DemoHostingController.swift diff --git a/ios/FluentUI.Demo/FluentUI.Demo/DemoListViewController.swift b/Demos/FluentUIDemo_iOS/FluentUI.Demo/DemoListViewController.swift similarity index 97% rename from ios/FluentUI.Demo/FluentUI.Demo/DemoListViewController.swift rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/DemoListViewController.swift index a27d9397dd..dd07ec89b5 100644 --- a/ios/FluentUI.Demo/FluentUI.Demo/DemoListViewController.swift +++ b/Demos/FluentUIDemo_iOS/FluentUI.Demo/DemoListViewController.swift @@ -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 100% rename from ios/FluentUI.Demo/FluentUI.Demo/DemoTableViewController.swift rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/DemoTableViewController.swift diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Demos.swift b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos.swift similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Demos.swift rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos.swift 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 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Demos/AliasColorTokensDemoController.swift rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/AliasColorTokensDemoController.swift diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Demos/AliasColorTokensDemoController_SwiftUI.swift b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/AliasColorTokensDemoController_SwiftUI.swift similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Demos/AliasColorTokensDemoController_SwiftUI.swift rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/AliasColorTokensDemoController_SwiftUI.swift diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Demos/AvatarDemoController.swift b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/AvatarDemoController.swift similarity index 97% rename from ios/FluentUI.Demo/FluentUI.Demo/Demos/AvatarDemoController.swift rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/AvatarDemoController.swift index f3993bb0cc..a749d8a58d 100644 --- a/ios/FluentUI.Demo/FluentUI.Demo/Demos/AvatarDemoController.swift +++ b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/AvatarDemoController.swift @@ -54,7 +54,7 @@ class AvatarDemoController: DemoTableViewController { .presence, .activity, .ringInnerGap, - .transparency, + .backgroundOutline, .defaultImage: guard let cell = tableView.dequeueReusableCell(withIdentifier: BooleanCell.identifier) as? BooleanCell else { return UITableViewCell() @@ -277,11 +277,11 @@ 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 } } } @@ -406,8 +406,8 @@ 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 } @@ -444,8 +444,8 @@ 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 } @@ -518,7 +518,7 @@ class AvatarDemoController: DemoTableViewController { return [.animating, .alternateBackground, .pointerInteraction, - .transparency, + .backgroundOutline, .presence, .activity, .outOfOffice, @@ -566,7 +566,7 @@ class AvatarDemoController: DemoTableViewController { case ring case ringInnerGap case swiftUIDemo - case transparency + case backgroundOutline case defaultImage var isDemoRow: Bool { @@ -591,7 +591,7 @@ class AvatarDemoController: DemoTableViewController { .ring, .ringInnerGap, .swiftUIDemo, - .transparency, + .backgroundOutline, .defaultImage: return false } @@ -620,7 +620,7 @@ class AvatarDemoController: DemoTableViewController { .ring, .ringInnerGap, .swiftUIDemo, - .transparency, + .backgroundOutline, .defaultImage: return nil } @@ -651,7 +651,7 @@ class AvatarDemoController: DemoTableViewController { .ring, .ringInnerGap, .swiftUIDemo, - .transparency, + .backgroundOutline, .defaultImage: return nil } @@ -684,7 +684,7 @@ class AvatarDemoController: DemoTableViewController { .ring, .ringInnerGap, .swiftUIDemo, - .transparency, + .backgroundOutline, .defaultImage: preconditionFailure("Row does not have an associated avatar style") } @@ -730,8 +730,8 @@ 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 97% rename from ios/FluentUI.Demo/FluentUI.Demo/Demos/AvatarDemoController_SwiftUI.swift rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/AvatarDemoController_SwiftUI.swift index 48732a2acd..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" @@ -66,11 +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) .defaultImage(defaultImage) - .isTransparent(isTransparent) + .hasBackgroundOutline(hasBackgroundOutline) .presence(presence) .activity(activityStyle, showActivityImage ? (activityStyle == .circle ? UIImage(named: "thumbs_up_3d_default") : UIImage(named: "excelIcon")) : nil) .isOutOfOffice(isOutOfOffice) @@ -101,7 +101,7 @@ 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) diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Demos/AvatarGroupDemoController.swift b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/AvatarGroupDemoController.swift similarity index 91% rename from ios/FluentUI.Demo/FluentUI.Demo/Demos/AvatarGroupDemoController.swift rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/AvatarGroupDemoController.swift index 4f5d845d51..d68d5f71ea 100644 --- a/ios/FluentUI.Demo/FluentUI.Demo/Demos/AvatarGroupDemoController.swift +++ b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/AvatarGroupDemoController.swift @@ -71,28 +71,15 @@ class AvatarGroupDemoController: DemoTableViewController { return cell - case .alternateBackground: + case .alternateBackground, .customRingColor, .hasBackgroundOutline: guard let cell = tableView.dequeueReusableCell(withIdentifier: BooleanCell.identifier) as? BooleanCell else { return UITableViewCell() } - cell.setup(title: row.title, isOn: self.isUsingAlternateBackgroundColor) + cell.setup(title: row.title, isOn: row.booleanValue(self)) cell.titleNumberOfLines = 0 cell.onValueChanged = { [weak self, weak cell] in - self?.isUsingAlternateBackgroundColor = cell?.isOn ?? true - } - - return cell - - case .customRingColor: - guard let cell = tableView.dequeueReusableCell(withIdentifier: BooleanCell.identifier) as? BooleanCell else { - return UITableViewCell() - } - - cell.setup(title: row.title, isOn: self.isUsingImageBasedCustomColor) - cell.titleNumberOfLines = 0 - cell.onValueChanged = { [weak self, weak cell] in - self?.isUsingImageBasedCustomColor = cell?.isOn ?? true + row.setBooleanValue(self, cell?.isOn ?? true) } return cell @@ -168,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 } @@ -272,6 +259,7 @@ class AvatarGroupDemoController: DemoTableViewController { return [.avatarCount, .alternateBackground, .customRingColor, + .hasBackgroundOutline, .maxDisplayedAvatars, .overflow] case .avatarStackNoActivityRing, @@ -303,6 +291,7 @@ class AvatarGroupDemoController: DemoTableViewController { case avatarCount case alternateBackground case customRingColor + case hasBackgroundOutline case maxDisplayedAvatars case overflow case titleSize72 @@ -340,6 +329,7 @@ class AvatarGroupDemoController: DemoTableViewController { .avatarCount, .alternateBackground, .customRingColor, + .hasBackgroundOutline, .maxDisplayedAvatars, .overflow, .swiftUIDemo: @@ -373,6 +363,7 @@ class AvatarGroupDemoController: DemoTableViewController { .avatarCount, .alternateBackground, .customRingColor, + .hasBackgroundOutline, .maxDisplayedAvatars, .overflow, .swiftUIDemo: @@ -390,7 +381,9 @@ class AvatarGroupDemoController: DemoTableViewController { 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" @@ -418,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 { @@ -581,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/ios/FluentUI.Demo/FluentUI.Demo/Demos/AvatarGroupDemoController_SwiftUI.swift b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/AvatarGroupDemoController_SwiftUI.swift similarity index 92% rename from ios/FluentUI.Demo/FluentUI.Demo/Demos/AvatarGroupDemoController_SwiftUI.swift rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/AvatarGroupDemoController_SwiftUI.swift index 066c7417f3..e8d5478efb 100644 --- a/ios/FluentUI.Demo/FluentUI.Demo/Demos/AvatarGroupDemoController_SwiftUI.swift +++ b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/AvatarGroupDemoController_SwiftUI.swift @@ -29,16 +29,18 @@ struct AvatarGroupDemoView: View { @Environment(\.fluentTheme) var fluentTheme: FluentTheme - @State var useAlternateBackground: Bool = false + @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 @@ -53,6 +55,7 @@ struct AvatarGroupDemoView: View { primaryText: samplePersona.name, secondaryText: samplePersona.email) .isRingVisible(isRingVisible) + .hasRingInnerGap(hasRingInnerGap) .imageBasedRingColor(showImageBasedRingColor ? AvatarDemoController.colorfulCustomImage : nil) } @@ -65,6 +68,7 @@ struct AvatarGroupDemoView: View { avatarCount: avatarCount, maxDisplayedAvatars: maxDisplayedAvatars, overflowCount: overflowCount, + hasBackgroundOutline: hasBackgroundOutline, isUnread: isUnread) { index in avatarFromSamplePersona(index) }.fixedSize() @@ -76,6 +80,7 @@ struct AvatarGroupDemoView: View { 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) @@ -84,6 +89,7 @@ struct AvatarGroupDemoView: View { FluentListSection("Ring") { Toggle("Ring Visible", isOn: $isRingVisible) Toggle("Image Based Ring Color", isOn: $showImageBasedRingColor) + Toggle("Has Ring Inner Gap", isOn: $hasRingInnerGap) } FluentListSection("Style") { 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 99% rename from ios/FluentUI.Demo/FluentUI.Demo/Demos/BottomCommandingDemoController.swift rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/BottomCommandingDemoController.swift index 3c7e0a59be..7bdb66bb0c 100644 --- a/ios/FluentUI.Demo/FluentUI.Demo/Demos/BottomCommandingDemoController.swift +++ b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/BottomCommandingDemoController.swift @@ -46,8 +46,7 @@ class BottomCommandingDemoController: DemoController { private lazy var heroItems: [CommandingItem] = { return Array(1...25).map { - let title = ($0 == 4) ? "Two line item" : "Item" - let item = CommandingItem(title: title + String($0), image: homeImage, action: commandAction) + let item = CommandingItem(title: "Item " + String($0), image: homeImage, action: commandAction) item.selectedImage = homeSelectedImage item.isOn = ($0 % 3 == 1) item.isEnabled = ($0 % 2 == 1) diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Demos/BottomSheetDemoController.swift b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/BottomSheetDemoController.swift similarity index 98% rename from ios/FluentUI.Demo/FluentUI.Demo/Demos/BottomSheetDemoController.swift rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/BottomSheetDemoController.swift index 37d536ac4a..a2af9bdb65 100644 --- a/ios/FluentUI.Demo/FluentUI.Demo/Demos/BottomSheetDemoController.swift +++ b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/BottomSheetDemoController.swift @@ -118,16 +118,16 @@ class BottomSheetDemoController: DemoController { secondarySheetController.isFlexibleHeight = true secondarySheetController.allowsSwipeToHide = true - let dismissButton = Button(primaryAction: UIAction(title: "Dismiss", handler: { _ in - secondarySheetController.setIsHidden(true, animated: true) + let dismissButton = Button(primaryAction: UIAction(title: "Dismiss", handler: { [weak secondarySheetController] _ in + secondarySheetController?.setIsHidden(true, animated: true) })) dismissButton.style = .accent dismissButton.translatesAutoresizingMaskIntoConstraints = false sheetContentView.addSubview(dismissButton) - let anotherOneButton = Button(primaryAction: UIAction(title: "Show another sheet", handler: { _ in - self.showTransientSheet() + let anotherOneButton = Button(primaryAction: UIAction(title: "Show another sheet", handler: { [weak self] _ in + self?.showTransientSheet() })) anotherOneButton.translatesAutoresizingMaskIntoConstraints = false sheetContentView.addSubview(anotherOneButton) 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 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Demos/ButtonDemoController_SwiftUI.swift rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/ButtonDemoController_SwiftUI.swift diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Demos/CardNudgeDemoController.swift b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/CardNudgeDemoController.swift similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Demos/CardNudgeDemoController.swift rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/CardNudgeDemoController.swift 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 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Demos/DrawerDemoController.swift rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/DrawerDemoController.swift 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 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Demos/ListActionItemDemoController_SwiftUI.swift rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/ListActionItemDemoController_SwiftUI.swift 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 65% rename from ios/FluentUI.Demo/FluentUI.Demo/Demos/ListItemDemoController_SwiftUI.swift rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/ListItemDemoController_SwiftUI.swift index e6e6a5a5af..8379d36dc4 100644 --- a/ios/FluentUI.Demo/FluentUI.Demo/Demos/ListItemDemoController_SwiftUI.swift +++ b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/ListItemDemoController_SwiftUI.swift @@ -35,16 +35,17 @@ struct ListItemDemoView: View { @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 @State var trailingContentFocusableElementCount: Int = 0 @State var trailingContentToggleEnabled: Bool = true - @State var renderStandalone: Bool = false - @State var listStyle: FluentListStyle = .plain public var body: some View { @@ -80,6 +81,7 @@ struct ListItemDemoView: View { FluentUIDemoToggle(titleKey: "Tappable", isOn: $isTappable) FluentUIDemoToggle(titleKey: "Disabled", isOn: $isDisabled) FluentUIDemoToggle(titleKey: "Render standalone", isOn: $renderStandalone) + FluentUIDemoToggle(titleKey: "Override tokens", isOn: $overrideTokens) } @ViewBuilder @@ -148,58 +150,59 @@ struct ListItemDemoView: View { @ViewBuilder var listItem: some View { - 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 { - showingSecondaryAlert = true - } label: { - Text("Button 1") - } - Button { - showingSecondaryAlert = true - } label: { - Text("Button 2") - } - } - } - } - }, - action: !isTappable ? nil : { - showingPrimaryAlert = true - } - ) - .backgroundStyleType(backgroundStyle) - .accessoryType(accessoryType) - .leadingContentSize(leadingContentSize) - .titleLineLimit(titleLineLimit) - .subtitleLineLimit(subtitleLineLimit) - .footerLineLimit(footerLineLimit) - .combineTrailingContentAccessibilityElement(trailingContentFocusableElementCount < 2) - .onAccessoryTapped { - showingSecondaryAlert = true - } - .disabled(isDisabled) - .alert("List Item tapped", isPresented: $showingPrimaryAlert) { - Button("OK", role: .cancel) { } - } - .alert("Detail button tapped", isPresented: $showingSecondaryAlert) { - Button("OK", role: .cancel) { } - } + var listItem = 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 { + showingSecondaryAlert = true + } label: { + Text("Button 1") + } + Button { + showingSecondaryAlert = true + } label: { + Text("Button 2") + } + } + } + } + }, + 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 @@ -223,6 +226,22 @@ struct ListItemDemoView: View { 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 8a79d2fae9..5bb3642299 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"), @@ -481,6 +498,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")) @@ -835,6 +853,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?) { @@ -842,6 +864,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 f61d63934d..5ec53e3b6a 100644 --- a/ios/FluentUI.Demo/FluentUI.Demo/Demos/NotificationViewDemoController_SwiftUI.swift +++ b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/NotificationViewDemoController_SwiftUI.swift @@ -49,6 +49,7 @@ struct NotificationDemoView: View { @State var showFromBottom: Bool = true @State var showBackgroundGradient: Bool = false @State var useCustomTheme: Bool = false + @State var verticalOffset: CGFloat = 0.0 @ObservedObject var fluentTheme: FluentTheme = .shared let customTheme: FluentTheme = { let foregroundColor = UIColor(light: GlobalTokens.sharedColor(.lavender, .shade30), @@ -175,7 +176,7 @@ struct NotificationDemoView: View { Alert(title: Text("Button tapped")) }) - Button("Show") { + Button("Show Notification") { if isPresented == false { isPresented = true DispatchQueue.main.asyncAfter(deadline: .now() + 3.0) { @@ -183,99 +184,30 @@ struct NotificationDemoView: View { } } } - .fixedSize() - .padding() - - ScrollView { - Group { - Group { - VStack(spacing: 0) { - Text("Content") - .frame(maxWidth: .infinity, alignment: .leading) - .font(.title) - Divider() - } - - TextField("Title", text: $title) - .autocapitalization(.none) - .disableAutocorrection(true) - .textFieldStyle(RoundedBorderTextFieldStyle()) - - TextField("Message", text: $message) - .autocapitalization(.none) - .disableAutocorrection(true) - .textFieldStyle(RoundedBorderTextFieldStyle()) - - TextField("Action Button Title", text: $actionButtonTitle) - .autocapitalization(.none) - .disableAutocorrection(true) - .textFieldStyle(RoundedBorderTextFieldStyle()) - - FluentUIDemoToggle(titleKey: "Has Attributed Text: Strikethrough", isOn: $hasBlueStrikethroughAttribute) - FluentUIDemoToggle(titleKey: "Has Attributed Text: Large Red Papyrus Font", isOn: $hasLargeRedPapyrusFontAttribute) - FluentUIDemoToggle(titleKey: "Set image", isOn: $showImage) - FluentUIDemoToggle(titleKey: "Set trailing image", isOn: $showTrailingImage) - } - - Group { - VStack(spacing: 0) { - Text("Action") - .frame(maxWidth: .infinity, alignment: .leading) - .font(.title) - Divider() - } - FluentUIDemoToggle(titleKey: "Has Action Button Action", isOn: $hasActionButtonAction) - FluentUIDemoToggle(titleKey: "Show Default Dismiss Button", isOn: $showDefaultDismissActionButton) - FluentUIDemoToggle(titleKey: "Has Message Action", isOn: $hasMessageAction) - } + .buttonStyle(FluentButtonStyle(style: .accent)) + .fixedSize() + .padding() - Group { - VStack(spacing: 0) { - Text("Style") - .frame(maxWidth: .infinity, alignment: .leading) - .font(.title) - Divider() - } - - Picker(selection: $style, label: EmptyView()) { - Text(".primaryToast").tag(MSFNotificationStyle.primaryToast) - Text(".neutralToast").tag(MSFNotificationStyle.neutralToast) - Text(".primaryBar").tag(MSFNotificationStyle.primaryBar) - Text(".primaryOutlineBar").tag(MSFNotificationStyle.primaryOutlineBar) - Text(".neutralBar").tag(MSFNotificationStyle.neutralBar) - Text(".dangerToast").tag(MSFNotificationStyle.dangerToast) - Text(".warningToast").tag(MSFNotificationStyle.warningToast) - } - .labelsHidden() - .frame(maxWidth: .infinity, alignment: .leading) - - FluentUIDemoToggle(titleKey: "Override Tokens (Image Color and Horizontal Spacing)", isOn: $overrideTokens) - FluentUIDemoToggle(titleKey: "Flexible Width Toast", isOn: $isFlexibleWidthToast) - FluentUIDemoToggle(titleKey: "Present From Bottom", isOn: $showFromBottom) - FluentUIDemoToggle(titleKey: "Background Gradient", isOn: $showBackgroundGradient) - FluentUIDemoToggle(titleKey: "Custom theme", isOn: $useCustomTheme) - } - } - .padding() - } + notificationSettings } .presentNotification(isPresented: $isPresented, isBlocking: false) { FluentNotification(style: style, - isFlexibleWidthToast: $isFlexibleWidthToast.wrappedValue, - message: hasMessage ? message : nil, - attributedMessage: hasAttribute && hasMessage ? attributedMessage : nil, - isPresented: $isPresented, - title: hasTitle ? title : nil, - attributedTitle: hasAttribute && hasTitle ? attributedTitle : nil, - image: image, - trailingImage: trailingImage, - trailingImageAccessibilityLabel: trailingImageLabel, - actionButtonTitle: actionButtonTitle, - actionButtonAction: actionButtonAction, - showDefaultDismissActionButton: showDefaultDismissActionButton, - messageButtonAction: messageButtonAction, - showFromBottom: showFromBottom) + isFlexibleWidthToast: $isFlexibleWidthToast.wrappedValue, + message: hasMessage ? message : nil, + attributedMessage: hasAttribute && hasMessage ? attributedMessage : nil, + isPresented: $isPresented, + title: hasTitle ? title : nil, + attributedTitle: hasAttribute && hasTitle ? attributedTitle : nil, + image: image, + trailingImage: trailingImage, + trailingImageAccessibilityLabel: trailingImageLabel, + actionButtonTitle: actionButtonTitle, + actionButtonAction: actionButtonAction, + showDefaultDismissActionButton: showDefaultDismissActionButton, + messageButtonAction: messageButtonAction, + showFromBottom: showFromBottom, + verticalOffset: verticalOffset) .backgroundGradient(showBackgroundGradient ? backgroundGradient : nil) .overrideTokens($overrideTokens.wrappedValue ? notificationOverrideTokens : nil) } @@ -283,6 +215,81 @@ struct NotificationDemoView: View { .tint(Color(theme.color(.brandForeground1))) } + @ViewBuilder + var notificationSettings: some View { + FluentList { + FluentListSection("Content") { + LabeledContent { + TextField("Title", text: $title) + .autocapitalization(.none) + .disableAutocorrection(true) + .multilineTextAlignment(.trailing) + } label: { + Text("Title") + } + + LabeledContent { + TextField("Message", text: $message) + .autocapitalization(.none) + .disableAutocorrection(true) + .multilineTextAlignment(.trailing) + } label: { + Text("Message") + } + + LabeledContent { + TextField("Action Button Title", text: $actionButtonTitle) + .autocapitalization(.none) + .disableAutocorrection(true) + .multilineTextAlignment(.trailing) + } label: { + Text("Action Button Title") + } + + LabeledContent { + TextField("Offset", value: $verticalOffset, format: FloatingPointFormatStyle()) + .keyboardType(.numberPad) + .multilineTextAlignment(.trailing) + } label: { + Text("Vertical Offset") + } + + Toggle("Has Attributed Text: Strikethrough", isOn: $hasBlueStrikethroughAttribute) + Toggle("Has Attributed Text: Large Red Papyrus Font", isOn: $hasLargeRedPapyrusFontAttribute) + Toggle("Set image", isOn: $showImage) + Toggle("Set trailing image", isOn: $showTrailingImage) + } + + FluentListSection("Action") { + Toggle("Has Action Button Action", isOn: $hasActionButtonAction) + Toggle("Show Default Dismiss Button", isOn: $showDefaultDismissActionButton) + Toggle("Has Message Action", isOn: $hasMessageAction) + } + + FluentListSection("Style") { + + Picker(selection: $style, label: EmptyView()) { + Text(".primaryToast").tag(MSFNotificationStyle.primaryToast) + Text(".neutralToast").tag(MSFNotificationStyle.neutralToast) + Text(".primaryBar").tag(MSFNotificationStyle.primaryBar) + Text(".primaryOutlineBar").tag(MSFNotificationStyle.primaryOutlineBar) + Text(".neutralBar").tag(MSFNotificationStyle.neutralBar) + Text(".dangerToast").tag(MSFNotificationStyle.dangerToast) + Text(".warningToast").tag(MSFNotificationStyle.warningToast) + } + .labelsHidden() + .frame(maxWidth: .infinity, alignment: .leading) + + Toggle("Override Tokens (Image Color and Horizontal Spacing)", isOn: $overrideTokens) + Toggle("Flexible Width Toast", isOn: $isFlexibleWidthToast) + Toggle("Present From Bottom", isOn: $showFromBottom) + Toggle("Background Gradient", isOn: $showBackgroundGradient) + Toggle("Custom theme", isOn: $useCustomTheme) + } + } + .fluentListStyle(.insetGrouped) + } + private var backgroundGradient: LinearGradientInfo { // It's a lovely blue-to-pink gradient let colors: [UIColor] = [UIColor(light: GlobalTokens.sharedColor(.pink, .tint50), @@ -300,11 +307,11 @@ struct NotificationDemoView: View { return 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/ObjectiveCDemoColorProviding.h b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/ObjectiveCDemoColorProviding.h similarity index 87% rename from ios/FluentUI.Demo/FluentUI.Demo/Demos/ObjectiveCDemoColorProviding.h rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/ObjectiveCDemoColorProviding.h index 51139f4a8c..e53d647303 100644 --- a/ios/FluentUI.Demo/FluentUI.Demo/Demos/ObjectiveCDemoColorProviding.h +++ b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/ObjectiveCDemoColorProviding.h @@ -4,7 +4,7 @@ // #import -#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 99% rename from ios/FluentUI.Demo/FluentUI.Demo/Demos/ObjectiveCDemoController.m rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/ObjectiveCDemoController.m index 38467f8069..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 () +#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 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Demos/SideTabBarDemoController.swift rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/SideTabBarDemoController.swift diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Demos/TabBarViewDemoController.swift b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/TabBarViewDemoController.swift similarity index 85% rename from ios/FluentUI.Demo/FluentUI.Demo/Demos/TabBarViewDemoController.swift rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/TabBarViewDemoController.swift index 025d5afad4..0143db9d8b 100644 --- a/ios/FluentUI.Demo/FluentUI.Demo/Demos/TabBarViewDemoController.swift +++ b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/TabBarViewDemoController.swift @@ -19,10 +19,16 @@ 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 var blurBlackground: Bool { return blurBlackgroundSwitch.isOn } + private var hideSeparatorSelection: Bool { return hideSeparatorSelectionSwitch.isOn } private let itemTitleVisibilitySwitch = BrandedSwitch() private let showBadgeNumbersSwitch = BrandedSwitch() private let useHigherBadgeNumbersSwitch = BrandedSwitch() + private let useGradientSelectionSwitch = BrandedSwitch() + private let blurBlackgroundSwitch = BrandedSwitch() + private let hideSeparatorSelectionSwitch = BrandedSwitch() private lazy var incrementBadgeButton: Button = { return createButton(title: "+", action: #selector(incrementBadgeNumbers)) @@ -37,6 +43,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,7 +74,17 @@ class TabBarViewDemoController: DemoController { addRow(text: "Use higher badge numbers", items: [useHigherBadgeNumbersSwitch], textWidth: Constants.switchSettingTextWidth) useHigherBadgeNumbersSwitch.addTarget(self, action: #selector(handleOnSwitchValueChanged), for: .valueChanged) - addRow(text: "Modify badge numbers", items: [incrementBadgeButton, decrementBadgeButton], textWidth: Constants.buttonSettingTextWidth) + addRow(text: "Use gradient selection", items: [useGradientSelectionSwitch], textWidth: Constants.switchSettingTextWidth) + useGradientSelectionSwitch.addTarget(self, action: #selector(handleOnSwitchValueChanged), for: .valueChanged) + + addRow(text: "Blur background", items: [blurBlackgroundSwitch], textWidth: Constants.switchSettingTextWidth) + blurBlackgroundSwitch.addTarget(self, action: #selector(handleOnSwitchValueChanged), for: .valueChanged) + blurBlackgroundSwitch.isOn = true + + addRow(text: "Hide Separator", items: [hideSeparatorSelectionSwitch], textWidth: Constants.switchSettingTextWidth) + hideSeparatorSelectionSwitch.addTarget(self, action: #selector(handleOnSwitchValueChanged), for: .valueChanged) + + addRow(text: "Modify badge numbers", items: [decrementBadgeButton, incrementBadgeButton], textWidth: Constants.buttonSettingTextWidth) setupTabBarView() updateBadgeButtons() @@ -94,6 +123,13 @@ 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.backgroundIsBlurred = blurBlackground + updatedTabBarView.separatorIsHidden = hideSeparatorSelection + 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 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Demos/TooltipDemoController.swift rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/TooltipDemoController.swift diff --git a/ios/FluentUI.Demo/FluentUI.Demo/Demos/TooltipDemoController_SwiftUI.swift b/Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/TooltipDemoController_SwiftUI.swift similarity index 100% rename from ios/FluentUI.Demo/FluentUI.Demo/Demos/TooltipDemoController_SwiftUI.swift rename to Demos/FluentUIDemo_iOS/FluentUI.Demo/Demos/TooltipDemoController_SwiftUI.swift 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 3c1e9eecfc..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.28.0 + 1.32.0 CFBundleURLTypes @@ -26,7 +26,7 @@ CFBundleVersion - 137.28.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 79055f489c..b1f58c526c 100644 --- a/macos/FluentUITestApp/FluentUITestApp-Info.plist +++ b/Demos/FluentUIDemo_macOS/FluentUITestApp/FluentUITestApp-Info.plist @@ -17,9 +17,9 @@ CFBundlePackageType APPL CFBundleShortVersionString - 0.28.0 + 0.32.0 CFBundleVersion - 62.28.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/Demos/FluentUIDemo_macOS/FluentUITestViewControllers/TestMultilinePillPickerViewController.swift b/Demos/FluentUIDemo_macOS/FluentUITestViewControllers/TestMultilinePillPickerViewController.swift new file mode 100644 index 0000000000..4e9597f947 --- /dev/null +++ b/Demos/FluentUIDemo_macOS/FluentUITestViewControllers/TestMultilinePillPickerViewController.swift @@ -0,0 +1,57 @@ +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// + +import AppKit +import FluentUI +import SwiftUI + +class TestMultilinePillPickerViewController: NSViewController { + override func loadView() { + let containerView = NSStackView(frame: .zero) + containerView.orientation = .vertical + + let pillPickerView = MultilinePillPickerView(labels: labels) { [weak self] index in + self?.pillButtonPressed(index) + } + containerView.addView(pillPickerView, in: .center) + self.pillPickerView = pillPickerView + + let checkbox = NSButton(checkboxWithTitle: "Enabled", target: self, action: #selector(toggleEnabled(_:))) + checkbox.state = .on + containerView.addView(checkbox, in: .center) + + view = containerView + } + + @objc func toggleEnabled(_ sender: NSButton?) { + pillPickerView?.isEnabled = sender?.state == .on + } + + func pillButtonPressed(_ index: Int) { + guard let window = NSApplication.shared.mainWindow else { + print("No window -- selected index \(index)") + return + } + let alert = NSAlert() + alert.messageText = "Suggestion clicked" + alert.informativeText = "\(labels[index])" + alert.addButton(withTitle: "OK") + alert.beginSheetModal(for: window) + } + + private let labels: [String] = [ + "One", + "Two", + "Three", + "Four", + "Five", + "Six", + "Seven", + "Eight", + "Nine", + ] + + private var pillPickerView: MultilinePillPickerView? +} 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 90% rename from macos/FluentUITestViewControllers/TestViewControllers.swift rename to Demos/FluentUIDemo_macOS/FluentUITestViewControllers/TestViewControllers.swift index 12187b622e..939ee252a4 100644 --- a/macos/FluentUITestViewControllers/TestViewControllers.swift +++ b/Demos/FluentUIDemo_macOS/FluentUITestViewControllers/TestViewControllers.swift @@ -25,6 +25,8 @@ public let testViewControllers = [TestViewController(title: "Avatar View", type: TestFilledTemplateImageViewController.self), TestViewController(title: "Link", type: TestLinkViewController.self), + TestViewController(title: "Multiline Pill Picker", + type: TestMultilinePillPickerViewController.self), TestViewController(title: "Notification Bar View", type: TestNotificationBarViewController.self), TestViewController(title: "Separator", 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..b0895af301 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,17 @@ 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 */; }; + 92AD71232D4062050089499E /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 8F5368062295F4C10098AC8F /* Assets.xcassets */; }; + 92AD71252D4062080089499E /* FluentUI in Frameworks */ = {isa = PBXBuildFile; productRef = 92AD71242D4062080089499E /* FluentUI */; }; + 92AD71272D4064B50089499E /* TestMultilinePillPickerViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 92AD71262D4064B00089499E /* TestMultilinePillPickerViewController.swift */; }; 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 +39,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 +50,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 +64,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 +73,6 @@ dstPath = ""; dstSubfolderSpec = 10; files = ( - AC7235D92492E0D000D0DCA8 /* FluentUI.framework in Embed Frameworks */, ); name = "Embed Frameworks"; runOnlyForDeploymentPostprocessing = 0; @@ -139,8 +80,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 +91,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 +124,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 +140,14 @@ 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 = ""; }; + 92AD711E2D4061340089499E /* FluentUIUnitTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = FluentUIUnitTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 92AD71262D4064B00089499E /* TestMultilinePillPickerViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TestMultilinePillPickerViewController.swift; 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 +165,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 +187,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; }; @@ -337,6 +202,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 92AD71252D4062080089499E /* FluentUI in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -360,93 +226,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 +239,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 +249,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,52 +266,16 @@ E61C96B32295E8D60006561F /* Products */ = { isa = PBXGroup; children = ( - E61C96B22295E8D60006561F /* FluentUI.framework */, - E61C96BB2295E8D60006561F /* FluentUIUnitTests.xctest */, 8F5368022295F4BF0098AC8F /* FluentUITestApp.app */, 8F41CC6D2447B60F0040B851 /* FluentUIResources-macos.bundle */, E6A92D2424BEA85900562BCA /* libFluentUITestViewControllers.a */, E6A92D3624BEA91F00562BCA /* FluentUISwiftUITestApp.app */, 3A42750F29677C3700F36FBE /* FluentUIDemoTests.xctest */, + 92AD711E2D4061340089499E /* FluentUIUnitTests.xctest */, ); 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 = ( @@ -588,6 +304,7 @@ 8061BF8222EF957200F2D245 /* TestDatePickerController.swift */, 9B4AEBAA2705206300B68020 /* TestFilledTemplateImageViewController.swift */, E61C96D622987B3C0006561F /* TestLinkViewController.swift */, + 92AD71262D4064B00089499E /* TestMultilinePillPickerViewController.swift */, 3A8CB0E12996CD6400B68FCF /* TestNotificationBarViewController.swift */, AC97EFE8247FAB1D00DADC99 /* TestSeparatorViewController.swift */, E6A92D4E24BEAEEA00562BCA /* TestViewControllers.swift */, @@ -618,25 +335,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,50 +395,32 @@ 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" */; buildPhases = ( E61C96B72295E8D60006561F /* Sources */, - E61C96B82295E8D60006561F /* Frameworks */, - E61C96B92295E8D60006561F /* Resources */, ); buildRules = ( ); dependencies = ( - E61C96BE2295E8D60006561F /* PBXTargetDependency */, ); name = FluentUITests; + packageProductDependencies = ( + ); productName = FluentUITests; - productReference = E61C96BB2295E8D60006561F /* FluentUIUnitTests.xctest */; + productReference = 92AD711E2D4061340089499E /* FluentUIUnitTests.xctest */; productType = "com.apple.product-type.bundle.unit-test"; }; E6A92D2324BEA85900562BCA /* FluentUITestViewControllers */ = { @@ -751,7 +434,7 @@ buildRules = ( ); dependencies = ( - E660317424BEBF8F00A132DB /* PBXTargetDependency */, + 9252C6242C62A8DC009C9272 /* PBXTargetDependency */, ); name = FluentUITestViewControllers; productName = FluentUITestViewControllers; @@ -769,7 +452,7 @@ buildRules = ( ); dependencies = ( - E6A92D4B24BEA9B400562BCA /* PBXTargetDependency */, + 92AD71222D4061F20089499E /* PBXTargetDependency */, E6A92D4924BEA9AF00562BCA /* PBXTargetDependency */, ); name = FluentUISwiftUITestApp; @@ -797,10 +480,6 @@ 8F5368012295F4BF0098AC8F = { CreatedOnToolsVersion = 10.2.1; }; - E61C96B12295E8D60006561F = { - CreatedOnToolsVersion = 10.2.1; - LastSwiftMigration = 1020; - }; E61C96BA2295E8D60006561F = { CreatedOnToolsVersion = 10.2.1; }; @@ -860,7 +539,6 @@ projectDirPath = ""; projectRoot = ""; targets = ( - E61C96B12295E8D60006561F /* FluentUI */, E61C96BA2295E8D60006561F /* FluentUITests */, 3A42750E29677C3700F36FBE /* FluentUIDemoTests */, 8F5368012295F4BF0098AC8F /* FluentUITestApp */, @@ -883,8 +561,6 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 921AF7D7269CD3C900255791 /* FluentUI.strings in Resources */, - A257F826251D987E002CAA6E /* FluentUI-macos.xcassets in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -897,52 +573,17 @@ ); 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; files = ( + 92AD71232D4062050089499E /* Assets.xcassets in Resources */, E6A92D4024BEA92000562BCA /* Preview Assets.xcassets in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* 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 +618,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; }; @@ -1025,6 +639,7 @@ E6A92D2E24BEA8AC00562BCA /* TestAvatarViewController.swift in Sources */, E6A92D4F24BEAEEA00562BCA /* TestViewControllers.swift in Sources */, 9B8661772A4F5DAE00FA4F78 /* TestColorProvider.swift in Sources */, + 92AD71272D4064B50089499E /* TestMultilinePillPickerViewController.swift in Sources */, E6A92D3124BEA8AC00562BCA /* TestDatePickerController.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -1047,25 +662,17 @@ target = 8F5368012295F4BF0098AC8F /* FluentUITestApp */; targetProxy = 3A42751529677C3700F36FBE /* PBXContainerItemProxy */; }; - 8F41CC7C2447B8F40040B851 /* PBXTargetDependency */ = { + 9252C6202C62A8AB009C9272 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - target = 8F41CC6C2447B60F0040B851 /* FluentUIResources-macos */; - targetProxy = 8F41CC7B2447B8F40040B851 /* PBXContainerItemProxy */; + productRef = 9252C61F2C62A8AB009C9272 /* FluentUI */; }; - 8F69C7B4229604A8009F69C0 /* PBXTargetDependency */ = { + 9252C6242C62A8DC009C9272 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - target = E61C96B12295E8D60006561F /* FluentUI */; - targetProxy = 8F69C7B3229604A8009F69C0 /* PBXContainerItemProxy */; + productRef = 9252C6232C62A8DC009C9272 /* FluentUI */; }; - E61C96BE2295E8D60006561F /* PBXTargetDependency */ = { + 92AD71222D4061F20089499E /* PBXTargetDependency */ = { isa = PBXTargetDependency; - target = E61C96B12295E8D60006561F /* FluentUI */; - targetProxy = E61C96BD2295E8D60006561F /* PBXContainerItemProxy */; - }; - E660317424BEBF8F00A132DB /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = E61C96B12295E8D60006561F /* FluentUI */; - targetProxy = E660317324BEBF8F00A132DB /* PBXContainerItemProxy */; + productRef = 92AD71212D4061F20089499E /* FluentUI */; }; E6A92D4724BEA9A600562BCA /* PBXTargetDependency */ = { isa = PBXTargetDependency; @@ -1077,11 +684,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 +731,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 +917,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 +1000,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 +1028,29 @@ 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; + }; + 92AD71212D4061F20089499E /* FluentUI */ = { + isa = XCSwiftPackageProductDependency; + productName = FluentUI; + }; + 92AD71242D4062080089499E /* 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 c2d3eae750..7482a647f4 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.28.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' } @@ -16,94 +24,94 @@ Pod::Spec.new do |s| 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,69 +126,68 @@ 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 'ListItem_ios' do |listitem_ios| @@ -193,161 +200,163 @@ fi', :execution_position => :before_compile } 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 @@ -357,58 +366,64 @@ 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 'MultilinePillPicker_mac' do |multilinepillpicker_mac| + multilinepillpicker_mac.platform = :osx + multilinepillpicker_mac.dependency "#{s.name}/Core_mac" + multilinepillpicker_mac.source_files = ["#{macos_root}/#{components_dir}/MultilinePillPicker/**/*.{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 3d38139c84..570869c402 100644 --- a/Package.swift +++ b/Package.swift @@ -2,6 +2,48 @@ 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", @@ -19,40 +61,5 @@ let package = Package( ] ) ], - targets: [ - .target( - name: "FluentUI", - dependencies: [ - .target(name: "FluentUI_ios", condition: .when(platforms: [.iOS, .visionOS, .macCatalyst])), - .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 205572ad65..a2fbd2dcc4 100644 --- a/README.md +++ b/README.md @@ -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 96% rename from ios/FluentUI/Avatar/Avatar.swift rename to Sources/FluentUI_iOS/Components/Avatar/Avatar.swift index 30dfc071e0..f6dd371680 100644 --- a/ios/FluentUI/Avatar/Avatar.swift +++ b/Sources/FluentUI_iOS/Components/Avatar/Avatar.swift @@ -49,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`. @@ -134,6 +139,7 @@ public struct Avatar: View, TokenizedControlView, Equatable { 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 @@ -145,7 +151,7 @@ public struct Avatar: View, TokenizedControlView, Equatable { 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) @@ -161,10 +167,14 @@ public struct Avatar: View, TokenizedControlView, Equatable { !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 { @@ -567,7 +577,8 @@ class MSFAvatarStateImpl: ControlState, MSFAvatarState { @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 93% rename from ios/FluentUI/Avatar/AvatarModifiers.swift rename to Sources/FluentUI_iOS/Components/Avatar/AvatarModifiers.swift index d4f5368aa9..65aa586a2d 100644 --- a/ios/FluentUI/Avatar/AvatarModifiers.swift +++ b/Sources/FluentUI_iOS/Components/Avatar/AvatarModifiers.swift @@ -50,6 +50,14 @@ 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. diff --git a/ios/FluentUI/Avatar/AvatarTokenSet.swift b/Sources/FluentUI_iOS/Components/Avatar/AvatarTokenSet.swift similarity index 100% rename from ios/FluentUI/Avatar/AvatarTokenSet.swift rename to Sources/FluentUI_iOS/Components/Avatar/AvatarTokenSet.swift 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 95% rename from ios/FluentUI/AvatarGroup/AvatarGroup.swift rename to Sources/FluentUI_iOS/Components/AvatarGroup/AvatarGroup.swift index 9077fd6ef4..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 } @@ -103,6 +106,7 @@ public struct AvatarGroup: View, TokenizedControlView { /// - 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, @@ -110,6 +114,7 @@ public struct AvatarGroup: View, TokenizedControlView { 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 @@ -117,7 +122,7 @@ public struct AvatarGroup: View, TokenizedControlView { let avatar = avatarBuilder(index) avatar.state.size = size avatar.state.style = .default - avatar.state.isTransparent = false + avatar.state.hasBackgroundOutline = hasBackgroundOutline return avatar } @@ -126,6 +131,7 @@ public struct AvatarGroup: View, TokenizedControlView { state.avatars = avatars state.maxDisplayedAvatars = maxDisplayedAvatars state.overflowCount = overflowCount + state.hasBackgroundOutline = hasBackgroundOutline state.isUnread = isUnread self.state = state @@ -323,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) } } @@ -359,6 +366,11 @@ class MSFAvatarGroupStateImpl: ControlState, MSFAvatarGroupState { @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 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 100% rename from ios/FluentUI/BarButtonItems/BarButtonItems.swift rename to Sources/FluentUI_iOS/Components/BarButtonItems/BarButtonItems.swift 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 98% rename from ios/FluentUI/Bottom Commanding/BottomCommandingController.swift rename to Sources/FluentUI_iOS/Components/Bottom Commanding/BottomCommandingController.swift index b66d3c4639..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? { @@ -402,6 +402,7 @@ open class BottomCommandingController: UIViewController, TokenizedControlInterna headerView.addSubview(heroCommandStack) let sheetController = BottomSheetController(headerContentView: headerView, expandedContentView: makeSheetExpandedContent(with: tableView)) + sheetController.headerContentHeight = Constants.BottomSheet.headerHeight sheetController.hostedScrollView = tableView sheetController.isHidden = isHidden sheetController.shouldAlwaysFillWidth = sheetShouldAlwaysFillWidth @@ -533,7 +534,6 @@ open class BottomCommandingController: UIViewController, TokenizedControlInterna } else { tableView.tableHeaderView = nil } - calculateHeaderHeight() } private func reloadHeroCommandOverflowStack() { @@ -563,13 +563,6 @@ open class BottomCommandingController: UIViewController, TokenizedControlInterna } } - @discardableResult - private func calculateHeaderHeight() -> CGFloat { - let headerHeight = heroCommandStack.systemLayoutSizeFitting(UIView.layoutFittingCompressedSize).height + BottomSheetController.resizingHandleHeight - bottomSheetController?.headerContentHeight = headerHeight - return headerHeight - } - private func updateAppearance() { guard isViewLoaded else { return @@ -927,10 +920,10 @@ 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, calculateHeaderHeight() - headerHeightWithoutBottomWhitespace) + let requiredBottomWhitespace = max(0, Constants.BottomSheet.headerHeight - headerHeightWithoutBottomWhitespace) // The safe area inset can fulfill some or all of our bottom whitespace requirement. // This is how much more we need, taking the inset into account. @@ -940,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 @@ -1125,6 +1118,10 @@ open class BottomCommandingController: UIViewController, TokenizedControlInterna static let moreButtonIcon: UIImage? = UIImage.staticImageNamed("more-24x24") static let moreButtonTitle: String = "CommandingBottomBar.More".localized } + + struct BottomSheet { + static let headerHeight: CGFloat = 66 + } } } 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 94% rename from ios/FluentUI/Bottom Sheet/BottomSheetController.swift rename to Sources/FluentUI_iOS/Components/Bottom Sheet/BottomSheetController.swift index 30adcd708b..4ef7ac2b2a 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,12 +525,13 @@ public class BottomSheetController: UIViewController, Shadowable, TokenizedContr collapsedHeightInSafeArea = view.safeAreaLayoutGuide.layoutFrame.maxY - offset(for: .collapsed) updateAppearance() + super.viewDidLayoutSubviews() } public override func viewSafeAreaInsetsDidChange() { super.viewSafeAreaInsetsDidChange() - completeAnimationsIfNeeded(skipToEnd: true) + completeAnimationsIfNeeded() } public override func willTransition(to newCollection: UITraitCollection, with coordinator: UIViewControllerTransitionCoordinator) { @@ -649,13 +670,15 @@ public class BottomSheetController: UIViewController, Shadowable, TokenizedContr move(to: isExpanded ? .collapsed : .expanded, interaction: .resizingHandleTap) } - private func updateResizingHandleViewAccessibility() { - if currentExpansionState == .expanded { - resizingHandleView.accessibilityLabel = handleCollapseCustomAccessibilityLabel ?? "Accessibility.Drawer.ResizingHandle.Label.Collapse".localized + private func updateResizingHandleViewAccessibility(for state: BottomSheetExpansionState) { + if state == .expanded { + resizingHandleView.accessibilityLabel = handleCollapseCustomAccessibilityLabel ?? "Accessibility.BottomSheet.ResizingHandle.Label.CollapseSheet".localized resizingHandleView.accessibilityHint = "Accessibility.Drawer.ResizingHandle.Hint.Collapse".localized - } else { - resizingHandleView.accessibilityLabel = handleExpandCustomAccessibilityLabel ?? "Accessibility.Drawer.ResizingHandle.Label.Expand".localized + resizingHandleView.accessibilityValue = "Accessibility.Drawer.ResizingHandle.Value.Expanded".localized + } else if state == .collapsed { + resizingHandleView.accessibilityLabel = handleExpandCustomAccessibilityLabel ?? "Accessibility.BottomSheet.ResizingHandle.Label.ExpandSheet".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: @@ -838,13 +871,15 @@ public class BottomSheetController: UIViewController, Shadowable, TokenizedContr let availableWidth: CGFloat = view.bounds.width let maxWidth = min(Constants.maxSheetWidth, availableWidth) let determinedWidth: CGFloat + if shouldAlwaysFillWidth { determinedWidth = availableWidth - } else if Constants.minSheetWidth...maxWidth ~= preferredWidth { - determinedWidth = preferredWidth + } else if maxWidth > Constants.minSheetWidth { + determinedWidth = Constants.minSheetWidth...maxWidth ~= preferredWidth ? preferredWidth : maxWidth } else { determinedWidth = maxWidth } + return determinedWidth } @@ -905,7 +940,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, @@ -999,16 +1038,16 @@ public class BottomSheetController: UIViewController, Shadowable, TokenizedContr switch expansionState { case .collapsed: if !isHeightRestricted || !isExpandable { - offset = view.frame.maxY - collapsedSheetHeight + offset = view.bounds.maxY - collapsedSheetHeight } else { // When we're height restricted a distinct collapsed offset doesn't make sense, // so we go straight to expanded. fallthrough } case .expanded: - offset = view.frame.maxY - expandedSheetHeight + offset = view.bounds.maxY - expandedSheetHeight case .hidden: - offset = view.frame.maxY + offset = view.bounds.maxY case .transitioning: offset = bottomSheetView.frame.minY } @@ -1030,6 +1069,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 +1182,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 100% rename from ios/FluentUI/Button/ButtonTokenSet.swift rename to Sources/FluentUI_iOS/Components/Button/ButtonTokenSet.swift diff --git a/ios/FluentUI/Button/FluentButtonStyle.swift b/Sources/FluentUI_iOS/Components/Button/FluentButtonStyle.swift similarity index 100% rename from ios/FluentUI/Button/FluentButtonStyle.swift rename to Sources/FluentUI_iOS/Components/Button/FluentButtonStyle.swift diff --git a/ios/FluentUI/Button/FluentButtonToggleStyle.swift b/Sources/FluentUI_iOS/Components/Button/FluentButtonToggleStyle.swift similarity index 100% rename from ios/FluentUI/Button/FluentButtonToggleStyle.swift rename to Sources/FluentUI_iOS/Components/Button/FluentButtonToggleStyle.swift 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 95% rename from ios/FluentUI/Command Bar/CommandBarButton.swift rename to Sources/FluentUI_iOS/Components/Command Bar/CommandBarButton.swift index c412e44333..dc2690cc9d 100644 --- a/ios/FluentUI/Command Bar/CommandBarButton.swift +++ b/Sources/FluentUI_iOS/Components/Command Bar/CommandBarButton.swift @@ -48,7 +48,9 @@ class CommandBarButton: UIButton { isAccessibilityElement = false } else { var buttonConfiguration = UIButton.Configuration.plain() + buttonConfiguration.title = item.title buttonConfiguration.image = item.iconImage + buttonConfiguration.imagePadding = CommandBarTokenSet.buttonImagePadding buttonConfiguration.contentInsets = CommandBarTokenSet.buttonContentInsets buttonConfiguration.background.cornerRadius = 0 configuration = buttonConfiguration @@ -87,14 +89,6 @@ class CommandBarButton: UIButton { return } - // always update icon and title as we only display one; we may alterenate between them, and the icon may also change - let iconImage = item.iconImage - let title = item.title - let accessibilityDescription = item.accessibilityLabel - - configuration?.image = iconImage - configuration?.title = iconImage != nil ? nil : title - if let font = item.titleFont { let attributeContainer = AttributeContainer([NSAttributedString.Key.font: font]) configuration?.attributedTitle?.setAttributes(attributeContainer) @@ -105,7 +99,8 @@ class CommandBarButton: UIButton { titleLabel?.isEnabled = isEnabled - accessibilityLabel = (accessibilityDescription != nil) ? accessibilityDescription : title + let accessibilityDescription = item.accessibilityLabel + accessibilityLabel = (accessibilityDescription != nil) ? accessibilityDescription : item.title accessibilityHint = item.accessibilityHint accessibilityValue = item.accessibilityValue accessibilityIdentifier = item.accessibilityIdentifier 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 98% rename from ios/FluentUI/Command Bar/CommandBarItem.swift rename to Sources/FluentUI_iOS/Components/Command Bar/CommandBarItem.swift index c0ca6a34cf..07786d9c03 100644 --- a/ios/FluentUI/Command Bar/CommandBarItem.swift +++ b/Sources/FluentUI_iOS/Components/Command Bar/CommandBarItem.swift @@ -88,7 +88,7 @@ open class CommandBarItem: NSObject { } } - /// Title for the item. Only valid when `iconImage` is `nil`. + /// Title for the item. @objc public var title: String? { didSet { if title != oldValue { diff --git a/ios/FluentUI/Command Bar/CommandBarTokenSet.swift b/Sources/FluentUI_iOS/Components/Command Bar/CommandBarTokenSet.swift similarity index 96% rename from ios/FluentUI/Command Bar/CommandBarTokenSet.swift rename to Sources/FluentUI_iOS/Components/Command Bar/CommandBarTokenSet.swift index 34d9da7dbe..70116e3c90 100644 --- a/ios/FluentUI/Command Bar/CommandBarTokenSet.swift +++ b/Sources/FluentUI_iOS/Components/Command Bar/CommandBarTokenSet.swift @@ -117,4 +117,7 @@ extension CommandBarTokenSet { leading: 10.0, bottom: 8.0, trailing: 10.0) + + /// The padding between the Command Bar Button image and title. + static let buttonImagePadding: CGFloat = GlobalTokens.spacing(.size60) } 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 100% 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 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 100% rename from ios/FluentUI/HUD/HeadsUpDisplay.swift rename to Sources/FluentUI_iOS/Components/HUD/HeadsUpDisplay.swift diff --git a/ios/FluentUI/HUD/HeadsUpDisplayTokenSet.swift b/Sources/FluentUI_iOS/Components/HUD/HeadsUpDisplayTokenSet.swift similarity index 100% rename from ios/FluentUI/HUD/HeadsUpDisplayTokenSet.swift rename to Sources/FluentUI_iOS/Components/HUD/HeadsUpDisplayTokenSet.swift 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 98% rename from ios/FluentUI/Label/Label.swift rename to Sources/FluentUI_iOS/Components/Label/Label.swift index 1d8f3f5153..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 { diff --git a/ios/FluentUI/Label/LabelTokenSet.swift b/Sources/FluentUI_iOS/Components/Label/LabelTokenSet.swift similarity index 100% rename from ios/FluentUI/Label/LabelTokenSet.swift rename to Sources/FluentUI_iOS/Components/Label/LabelTokenSet.swift diff --git a/ios/FluentUI/List/FluentList.swift b/Sources/FluentUI_iOS/Components/List/FluentList.swift similarity index 100% rename from ios/FluentUI/List/FluentList.swift rename to Sources/FluentUI_iOS/Components/List/FluentList.swift diff --git a/ios/FluentUI/List/FluentListModifiers.swift b/Sources/FluentUI_iOS/Components/List/FluentListModifiers.swift similarity index 100% rename from ios/FluentUI/List/FluentListModifiers.swift rename to Sources/FluentUI_iOS/Components/List/FluentListModifiers.swift diff --git a/ios/FluentUI/List/FluentListSection.swift b/Sources/FluentUI_iOS/Components/List/FluentListSection.swift similarity index 100% rename from ios/FluentUI/List/FluentListSection.swift rename to Sources/FluentUI_iOS/Components/List/FluentListSection.swift diff --git a/ios/FluentUI/List/FluentListSectionFooter.swift b/Sources/FluentUI_iOS/Components/List/FluentListSectionFooter.swift similarity index 100% rename from ios/FluentUI/List/FluentListSectionFooter.swift rename to Sources/FluentUI_iOS/Components/List/FluentListSectionFooter.swift diff --git a/ios/FluentUI/List/FluentListSectionHeader.swift b/Sources/FluentUI_iOS/Components/List/FluentListSectionHeader.swift similarity index 100% rename from ios/FluentUI/List/FluentListSectionHeader.swift rename to Sources/FluentUI_iOS/Components/List/FluentListSectionHeader.swift 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 82% rename from ios/FluentUI/List/ListItem.swift rename to Sources/FluentUI_iOS/Components/List/ListItem.swift index 1f71a45f44..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 Self { + tokenOverrides = overrides + return self + } +} diff --git a/ios/FluentUI/List/ListItemModifiers.swift b/Sources/FluentUI_iOS/Components/List/ListItemModifiers.swift similarity index 97% rename from ios/FluentUI/List/ListItemModifiers.swift rename to Sources/FluentUI_iOS/Components/List/ListItemModifiers.swift index 343ae5f42e..de1e858ad7 100644 --- a/ios/FluentUI/List/ListItemModifiers.swift +++ b/Sources/FluentUI_iOS/Components/List/ListItemModifiers.swift @@ -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 98% rename from ios/FluentUI/Navigation/NavigationBar.swift rename to Sources/FluentUI_iOS/Components/Navigation/NavigationBar.swift index 046a027c64..21b0d01c67 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 { @@ -329,7 +329,7 @@ open class NavigationBar: UINavigationBar, TokenizedControlInternal, TwoLineTitl return } updateAccessibilityElements() - updateViewsForLargeTitlePresentation(for: topItem) + updateViewsForNavigationItem(topItem) } } @@ -425,7 +425,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 @@ -540,7 +540,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() { @@ -574,7 +580,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 @@ -756,7 +762,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) { @@ -844,7 +850,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 @@ -856,7 +862,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 99% rename from ios/FluentUI/Navigation/Views/AvatarTitleView.swift rename to Sources/FluentUI_iOS/Components/Navigation/Views/AvatarTitleView.swift index 25de74b2ec..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 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 97% rename from ios/FluentUI/Notification/FluentNotification.swift rename to Sources/FluentUI_iOS/Components/Notification/FluentNotification.swift index 9b73060e77..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 @@ -355,7 +358,7 @@ public struct FluentNotification: View, TokenizedControlView { withAnimation(.spring(response: state.style.animationDurationForShow / 2.0, dampingFraction: state.style.animationDampingRatio, blendDuration: 0)) { - bottomOffset = 0 + bottomOffset = -state.verticalOffset opacity = 1 } } @@ -400,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. /// @@ -430,7 +434,8 @@ class MSFNotificationStateImpl: ControlState, MSFNotificationState { actionButtonAction: nil, showDefaultDismissActionButton: nil, messageButtonAction: nil, - showFromBottom: true) + showFromBottom: true, + verticalOffset: 0.0) } init(style: MSFNotificationStyle, @@ -445,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 @@ -459,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 100% rename from ios/FluentUI/Notification/NotificationTokenSet.swift rename to Sources/FluentUI_iOS/Components/Notification/NotificationTokenSet.swift 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 afbd8dc672..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 { 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 100% rename from ios/FluentUI/Presenters/PageCardPresenterController.swift rename to Sources/FluentUI_iOS/Components/Presenters/PageCardPresenterController.swift 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 88% rename from ios/FluentUI/Tab Bar/TabBarView.swift rename to Sources/FluentUI_iOS/Components/Tab Bar/TabBarView.swift index bbe7ed4679..6c6e6662c6 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? @@ -90,6 +97,7 @@ open class TabBarView: UIView, TokenizedControlInternal { /// - Parameter showsItemTitles: Determines whether or not to show the titles of the tab bar items. @objc public init(showsItemTitles: Bool = false) { self.showsItemTitles = showsItemTitles + super.init(frame: .zero) backgroundView.translatesAutoresizingMaskIntoConstraints = false @@ -148,16 +156,27 @@ open class TabBarView: UIView, TokenizedControlInternal { @objc public static let tabBarPadHeight: CGFloat = TabBarTokenSet.padHeight - private struct Constants { - static let maxTabCount: Int = 5 + @objc public var backgroundIsBlurred: Bool = true { + didSet { + if backgroundIsBlurred != oldValue { + backgroundView.effect = backgroundIsBlurred ? UIBlurEffect(style: UIBlurEffect.Style.systemChromeMaterial) : nil + } + } } - private let backgroundView: UIVisualEffectView = { - var style = UIBlurEffect.Style.regular - style = .systemChromeMaterial + @objc public var separatorIsHidden: Bool = false { + didSet { + if separatorIsHidden != oldValue { + topBorderLine.isHidden = separatorIsHidden + } + } + } - return UIVisualEffectView(effect: UIBlurEffect(style: style)) - }() + private struct Constants { + static let maxTabCount: Int = 6 + } + + private let backgroundView: UIVisualEffectView = UIVisualEffectView(effect: UIBlurEffect(style: UIBlurEffect.Style.systemChromeMaterial)) private lazy var heightConstraint: NSLayoutConstraint = stackView.heightAnchor.constraint(equalToConstant: traitCollection.userInterfaceIdiom == .phone ? TabBarTokenSet.phonePortraitHeight : TabBarTokenSet.padHeight) @@ -210,6 +229,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 9bd2ff97f9..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 @@ -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 } @@ -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 79% rename from ios/FluentUI/Table View/TableViewCellTokenSet.swift rename to Sources/FluentUI_iOS/Components/TableViewListShared/TableViewCellTokenSet.swift index 321dad9f9b..87e4bc5b41 100644 --- a/ios/FluentUI/Table View/TableViewCellTokenSet.swift +++ b/Sources/FluentUI_iOS/Components/TableViewListShared/TableViewCellTokenSet.swift @@ -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 99% rename from ios/FluentUI/Tooltip/Tooltip.swift rename to Sources/FluentUI_iOS/Components/Tooltip/Tooltip.swift index 61396e0ccb..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. diff --git a/ios/FluentUI/Tooltip/TooltipModifiers.swift b/Sources/FluentUI_iOS/Components/Tooltip/TooltipModifiers.swift similarity index 100% rename from ios/FluentUI/Tooltip/TooltipModifiers.swift rename to Sources/FluentUI_iOS/Components/Tooltip/TooltipModifiers.swift 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 86% rename from ios/FluentUI/Core/ControlHostingView.swift rename to Sources/FluentUI_iOS/Core/ControlHostingView.swift index 13e7ee6af8..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. - public 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.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/ios/FluentUI/Extensions/Color+DynamicColor.swift b/Sources/FluentUI_iOS/Core/Extensions/Color+Extensions.swift similarity index 53% rename from ios/FluentUI/Extensions/Color+DynamicColor.swift rename to Sources/FluentUI_iOS/Core/Extensions/Color+Extensions.swift index a30c8afd1d..23473a40af 100644 --- a/ios/FluentUI/Extensions/Color+DynamicColor.swift +++ b/Sources/FluentUI_iOS/Core/Extensions/Color+Extensions.swift @@ -33,13 +33,12 @@ extension Color { darkElevated: Color? = nil) { let dynamicColor = DynamicColor(light: light, dark: dark, darkElevated: darkElevated) - if #available(iOS 17, *) { - self.init(dynamicColor) - } else { - self.init(uiColor: UIColor(dynamicColor: dynamicColor)) - } + 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) @@ -47,48 +46,21 @@ extension Color { self.init(uiColor: UIColor(dynamicColor: dynamicColor)) } } -} - -/// 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 - } - - init(uiColor: UIColor) { - self.init(light: Color(uiColor.light), - dark: Color(uiColor.dark), - darkElevated: Color(uiColor.darkElevated)) - } + var dynamicColor: DynamicColor { + if #available(iOS 17, *) { + var lightEnvironment = EnvironmentValues.init() + lightEnvironment.colorScheme = .light - let light: Color - let dark: Color? - let darkElevated: Color? -} + var darkEnvironment = EnvironmentValues.init() + darkEnvironment.colorScheme = .dark -@available(iOS 17, *) -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) - } + 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)) } - - // default - return light.resolve(in: environment) } } 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 98% rename from ios/FluentUI/Core/SwiftUI+ViewModifiers.swift rename to Sources/FluentUI_iOS/Core/Extensions/SwiftUI+ViewModifiers.swift index 793d813138..5093a8ea42 100644 --- a/ios/FluentUI/Core/SwiftUI+ViewModifiers.swift +++ b/Sources/FluentUI_iOS/Core/Extensions/SwiftUI+ViewModifiers.swift @@ -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 100% rename from ios/FluentUI/Extensions/UIColor+Extensions.swift rename to Sources/FluentUI_iOS/Core/Extensions/UIColor+Extensions.swift 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/ios/FluentUI/Core/Theme/FluentTheme+Tokens.swift b/Sources/FluentUI_iOS/Core/FluentTheme+Tokens.swift similarity index 87% rename from ios/FluentUI/Core/Theme/FluentTheme+Tokens.swift rename to Sources/FluentUI_iOS/Core/FluentTheme+Tokens.swift index 1efa587f69..cea14a0ac3 100644 --- a/ios/FluentUI/Core/Theme/FluentTheme+Tokens.swift +++ b/Sources/FluentUI_iOS/Core/FluentTheme+Tokens.swift @@ -165,27 +165,10 @@ public extension FluentTheme { /// 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) + @objc(typographyForToken:) + func typographyInfo(_ token: TypographyToken) -> FontInfo { + return typographyTokenSet[token] } /// Returns an array of colors for the given token. @@ -482,77 +465,77 @@ extension FluentTheme { static func defaultShadow(_ token: ShadowToken) -> ShadowInfo { switch token { case .clear: - return ShadowInfo(keyColor: .clear, + return ShadowInfo(keyColor: Color.clear, keyBlur: 0.0, xKey: 0.0, yKey: 0.0, - ambientColor: .clear, + ambientColor: Color.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)), + return ShadowInfo(keyColor: .init(light: .black.opacity(0.14), + dark: .black.opacity(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)), + ambientColor: .init(light: .black.opacity(0.12), + dark: .black.opacity(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)), + return ShadowInfo(keyColor: .init(light: .black.opacity(0.14), + dark: .black.opacity(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)), + ambientColor: .init(light: .black.opacity(0.12), + dark: .black.opacity(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)), + return ShadowInfo(keyColor: .init(light: .black.opacity(0.14), + dark: .black.opacity(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)), + ambientColor: .init(light: .black.opacity(0.12), + dark: .black.opacity(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)), + return ShadowInfo(keyColor: .init(light: .black.opacity(0.14), + dark: .black.opacity(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)), + ambientColor: .init(light: .black.opacity(0.12), + dark: .black.opacity(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)), + return ShadowInfo(keyColor: .init(light: .black.opacity(0.24), + dark: .black.opacity(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)), + ambientColor: .init(light: .black.opacity(0.20), + dark: .black.opacity(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)), + return ShadowInfo(keyColor: .init(light: .black.opacity(0.24), + dark: .black.opacity(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)), + ambientColor: .init(light: .black.opacity(0.20), + dark: .black.opacity(0.40)), ambientBlur: 8, xAmbient: 0, yAmbient: 0) diff --git a/ios/FluentUI/Core/FluentThemedHostingController.swift b/Sources/FluentUI_iOS/Core/FluentThemedHostingController.swift similarity index 100% rename from ios/FluentUI/Core/FluentThemedHostingController.swift rename to Sources/FluentUI_iOS/Core/FluentThemedHostingController.swift diff --git a/ios/FluentUI/Core/FluentUIFramework.swift b/Sources/FluentUI_iOS/Core/FluentUIFramework.swift similarity index 90% rename from ios/FluentUI/Core/FluentUIFramework.swift rename to Sources/FluentUI_iOS/Core/FluentUIFramework.swift index 31fa4619c3..460e0c62f5 100644 --- a/ios/FluentUI/Core/FluentUIFramework.swift +++ b/Sources/FluentUI_iOS/Core/FluentUIFramework.swift @@ -23,6 +23,21 @@ 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 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 100% rename from ios/FluentUI/Core/Theme/FluentTheme+visionOS.swift rename to Sources/FluentUI_iOS/Core/Theme/FluentTheme+visionOS.swift diff --git a/ios/FluentUI/Core/Theme/FluentTheme.swift b/Sources/FluentUI_iOS/Core/Theme/FluentTheme.swift similarity index 68% rename from ios/FluentUI/Core/Theme/FluentTheme.swift rename to Sources/FluentUI_iOS/Core/Theme/FluentTheme.swift index 0d7ad39d48..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,20 +35,10 @@ 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) - }) - - let mappedColorOverrides = colorOverrides?.compactMapValues({ color in - return DynamicColor(uiColor: color) - }) - + typographyOverrides: [TypographyToken: FontInfo]? = nil, + gradientOverrides: [GradientToken: [Color]]? = nil) { #if os(visionOS) // We have custom overrides for `defaultColors` in visionOS. let defaultColorFunction: ((FluentTheme.ColorToken) -> DynamicColor) = FluentTheme.defaultColor_visionOS(_:) @@ -53,13 +46,16 @@ public class FluentTheme: NSObject, ObservableObject { let defaultColorFunction: ((FluentTheme.ColorToken) -> DynamicColor) = FluentTheme.defaultColor(_:) #endif - let colorTokenSet = TokenSet(defaultColorFunction, mappedColorOverrides) + let colorTokenSet = TokenSet( + defaultColorFunction, + colorOverrides?.mapValues { $0.dynamicColor } + ) let shadowTokenSet = TokenSet(FluentTheme.defaultShadow(_:), shadowOverrides) - let typographyTokenSet = TokenSet(FluentTheme.defaultTypography(_:), mappedTypographyOverrides) + 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 @@ -101,27 +97,16 @@ 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 @@ -142,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 { @@ -152,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 87% rename from ios/FluentUI/Core/Theme/Tokens/ControlTokenSet.swift rename to Sources/FluentUI_iOS/Core/Theme/Tokens/ControlTokenSet.swift index 00e8225970..605bba1daa 100644 --- a/ios/FluentUI/Core/Theme/Tokens/ControlTokenSet.swift +++ b/Sources/FluentUI_iOS/Core/Theme/Tokens/ControlTokenSet.swift @@ -4,11 +4,13 @@ // import Combine -import UIKit 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: @@ -61,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 @@ -71,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 } @@ -81,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, @@ -95,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 } @@ -111,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] { @@ -124,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 = [:] } @@ -142,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 { @@ -164,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 } @@ -173,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 @@ -204,9 +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 uiColor(() -> UIColor) 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 { @@ -218,6 +222,21 @@ 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() @@ -229,17 +248,6 @@ public enum ControlTokenValue { } } - public var color: Color { - if case .color(let color) = self { - return color() - } else if case .uiColor(let uiColor) = self { - return Color(uiColor()) - } else { - assertionFailure("Cannot convert token to Color: \(self)") - return fallbackColor - } - } - public var uiFont: UIFont { if case .uiFont(let uiFont) = self { return uiFont() @@ -248,17 +256,18 @@ public enum ControlTokenValue { return UIFont() } } +#endif // os(iOS) || os(visionOS) public var shadowInfo: ShadowInfo { if case .shadowInfo(let shadowInfo) = self { return shadowInfo() } else { assertionFailure("Cannot convert token to ShadowInfo: \(self)") - return ShadowInfo(keyColor: fallbackUIColor, + return ShadowInfo(keyColor: fallbackColor, keyBlur: 10.0, xKey: 10.0, yKey: 10.0, - ambientColor: fallbackUIColor, + ambientColor: fallbackColor, ambientBlur: 10.0, xAmbient: 10.0, yAmbient: 10.0) @@ -284,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: @@ -297,14 +310,16 @@ public enum ControlTokenValue { // MARK: - Helpers +#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 @@ -323,12 +338,14 @@ extension ControlTokenValue: CustomStringConvertible { switch self { case .float(let float): return "ControlTokenValue.float (\(float())" - case .uiColor(let uiColor): - return "ControlTokenValue.uiColor (\(uiColor())" 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/ios/FluentUI/Core/Theme/Tokens/GlobalTokens+UIKit.swift b/Sources/FluentUI_iOS/Core/Theme/Tokens/GlobalTokens+UIKit.swift similarity index 100% rename from ios/FluentUI/Core/Theme/Tokens/GlobalTokens+UIKit.swift rename to Sources/FluentUI_iOS/Core/Theme/Tokens/GlobalTokens+UIKit.swift diff --git a/ios/FluentUI/Core/Theme/Tokens/GlobalTokens.swift b/Sources/FluentUI_iOS/Core/Theme/Tokens/GlobalTokens.swift similarity index 100% rename from ios/FluentUI/Core/Theme/Tokens/GlobalTokens.swift rename to Sources/FluentUI_iOS/Core/Theme/Tokens/GlobalTokens.swift 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/ios/FluentUI/Core/Theme/Tokens/ShadowInfo.swift b/Sources/FluentUI_iOS/Core/Theme/Tokens/ShadowInfo+UIKit.swift similarity index 57% rename from ios/FluentUI/Core/Theme/Tokens/ShadowInfo.swift rename to Sources/FluentUI_iOS/Core/Theme/Tokens/ShadowInfo+UIKit.swift index c038adcff7..a4edaf211b 100644 --- a/ios/FluentUI/Core/Theme/Tokens/ShadowInfo.swift +++ b/Sources/FluentUI_iOS/Core/Theme/Tokens/ShadowInfo+UIKit.swift @@ -3,12 +3,11 @@ // Licensed under the MIT License. // -import CoreGraphics +import SwiftUI import UIKit -/// Represents a two-part shadow as used by FluentUI. -@objc(MSFShadowInfo) -public class ShadowInfo: NSObject { +public extension ShadowInfo { + /// Initializes a shadow struct to be used in Fluent. /// /// - Parameters: @@ -20,53 +19,24 @@ 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, - keyBlur: CGFloat, - xKey: CGFloat, - yKey: CGFloat, - ambientColor: UIColor, - ambientBlur: CGFloat, - xAmbient: CGFloat, - yAmbient: CGFloat) { - self.keyColor = keyColor - self.keyBlur = keyBlur * shadowBlurAdjustment - self.xKey = xKey - self.yKey = yKey - self.ambientColor = ambientColor - self.ambientBlur = ambientBlur * shadowBlurAdjustment - self.xAmbient = xAmbient - self.yAmbient = yAmbient + @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) } - /// The color of the key shadow. - @objc public let keyColor: UIColor - - /// The blur of the key shadow. - @objc public let keyBlur: CGFloat - - /// The horizontal offset of the key shadow. - @objc public let xKey: CGFloat - - /// The vertical offset of the key shadow. - @objc public let yKey: CGFloat - - /// The color of the ambient shadow. - @objc public let ambientColor: UIColor - - /// The blur of the ambient shadow. - @objc public let ambientBlur: CGFloat - - /// The horizontal offset of the ambient shadow. - @objc public let xAmbient: CGFloat - - /// The vertical offset of the ambient shadow. - @objc public let yAmbient: CGFloat - - /// The number that the figma blur needs to be adjusted by to properly display shadows. See https://github.com/microsoft/apple-ux-guide/blob/gh-pages/Shadows.md - private let shadowBlurAdjustment: CGFloat = 0.5 -} - -public extension ShadowInfo { /// Applies a key and an ambient shadow on a `UIView`. /// - Parameters: /// - view: The view on which the shadows will be applied. @@ -99,7 +69,7 @@ public extension ShadowInfo { let layer = CALayer() layer.frame = view.bounds - layer.shadowColor = (isAmbientShadow ? ambientColor : keyColor).cgColor + 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 @@ -113,12 +83,3 @@ public extension ShadowInfo { return layer } } - -/// Public protocol that, when implemented, allows any UIView 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 } - - /// The layer on which the key shadow is implemented - var keyShadow: CALayer? { get set } -} diff --git a/Sources/FluentUI_iOS/Core/Theme/Tokens/ShadowInfo.swift b/Sources/FluentUI_iOS/Core/Theme/Tokens/ShadowInfo.swift new file mode 100644 index 0000000000..5b2c723d95 --- /dev/null +++ b/Sources/FluentUI_iOS/Core/Theme/Tokens/ShadowInfo.swift @@ -0,0 +1,77 @@ +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// + +import CoreGraphics +import QuartzCore +import SwiftUI + +/// Represents a two-part shadow as used by FluentUI. +@objc(MSFShadowInfo) +public class ShadowInfo: NSObject { + /// 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. + public init(keyColor: Color, + keyBlur: CGFloat, + xKey: CGFloat, + yKey: CGFloat, + ambientColor: Color, + ambientBlur: CGFloat, + xAmbient: CGFloat, + yAmbient: CGFloat) { + self.keyColor = keyColor + self.keyBlur = keyBlur * shadowBlurAdjustment + self.xKey = xKey + self.yKey = yKey + self.ambientColor = ambientColor + self.ambientBlur = ambientBlur * shadowBlurAdjustment + self.xAmbient = xAmbient + self.yAmbient = yAmbient + } + + /// The color of the key shadow. + public let keyColor: Color + + /// The blur of the key shadow. + @objc public let keyBlur: CGFloat + + /// The horizontal offset of the key shadow. + @objc public let xKey: CGFloat + + /// The vertical offset of the key shadow. + @objc public let yKey: CGFloat + + /// The color of the ambient shadow. + public let ambientColor: Color + + /// The blur of the ambient shadow. + @objc public let ambientBlur: CGFloat + + /// The horizontal offset of the ambient shadow. + @objc public let xAmbient: CGFloat + + /// The vertical offset of the ambient shadow. + @objc public let yAmbient: CGFloat + + /// The number that the figma blur needs to be adjusted by to properly display shadows. See https://github.com/microsoft/apple-ux-guide/blob/gh-pages/Shadows.md + private let shadowBlurAdjustment: CGFloat = 0.5 +} + +/// 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 } + + /// The layer on which the key shadow is implemented + var keyShadow: 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/ios/FluentUI/Core/UIKit+SwiftUI_interoperability.swift b/Sources/FluentUI_iOS/Core/UIKit+SwiftUI_interoperability.swift similarity index 100% rename from ios/FluentUI/Core/UIKit+SwiftUI_interoperability.swift rename to Sources/FluentUI_iOS/Core/UIKit+SwiftUI_interoperability.swift 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 92% rename from ios/FluentUI/Resources/Localization/en.lproj/Localizable.strings rename to Sources/FluentUI_iOS/Resources/Localization/en.lproj/Localizable.strings index d74480ba92..0c3499bbf5 100644 --- a/ios/FluentUI/Resources/Localization/en.lproj/Localizable.strings +++ b/Sources/FluentUI_iOS/Resources/Localization/en.lproj/Localizable.strings @@ -15,6 +15,10 @@ "Accessibility.AvatarGroup.AvatarListLast" = "and %@"; /* Accessibility label format string for avatar view. Format: ", ". Example: "Kat, Available" */ "Accessibility.AvatarView.LabelFormat" = "%@, %@"; +/* Accessibility label for bottom sheet's resizing handle when it has collapse action */ +"Accessibility.BottomSheet.ResizingHandle.Label.CollapseSheet" = "Collapse Sheet"; +/* Accessibility label for bottom sheet's resizing handle when it has expand action */ +"Accessibility.BottomSheet.ResizingHandle.Label.ExpandSheet" = "Expand Sheet"; /* Accessibility hint for the upper calendar date picker view */ "Accessibility.Calendar.Hint" = "Select a date"; /* Accessibility label for the upper calendar date picker view. */ @@ -82,10 +86,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/Sources/FluentUI_macOS/Components/MultilinePillPicker/MultilinePillPicker.swift b/Sources/FluentUI_macOS/Components/MultilinePillPicker/MultilinePillPicker.swift new file mode 100644 index 0000000000..784f2be645 --- /dev/null +++ b/Sources/FluentUI_macOS/Components/MultilinePillPicker/MultilinePillPicker.swift @@ -0,0 +1,65 @@ +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// + +import SwiftUI + +/// This is a simple control for hosting multiple rows of pill buttons. At present, this control only +/// supports a hard-coded two rows of elements, but more flexibility may be added in the future. +public struct MultilinePillPicker: View { + /// Creates a multiline pill picker. + /// - Parameters: + /// - labels: An array of labels to show in the picker. + /// - action: An action to invoke when a pill is selected in the picker. Includes the index of the item being selected. + public init(labels: [String], action: ((Int) -> Void)? = nil) { + self.labels = labels + self.action = action + } + + public var body: some View { + VStack(alignment: .leading, spacing: spacing) { + // Bias towards the first row + let midIndex = Int(ceil(Double(labels.count) / 2.0)) + row(0.. some View { + SwiftUI.Button(action: { + action?(index) + }, label: { + Text(labels[index]) + .padding(.vertical, paddingVertical) + .padding(.horizontal, paddingHorizontal) + .overlay( + RoundedRectangle(cornerRadius: cornerRadius, style: .continuous) + .stroke(Color(nsColor: Colors.primaryTint10), lineWidth: lineWidth) + ) + }) + .buttonStyle(.plain) + } + + @ViewBuilder + private func row(_ range: Range) -> some View { + HStack(spacing: spacing) { + ForEach(range, id: \.self) { index in + button(index) + } + } + } + + private let labels: [String] + private let action: ((Int) -> Void)? + + // Constants + private let cornerRadius: CGFloat = 6.0 + private let lineWidth: CGFloat = 1.0 + private let paddingHorizontal: CGFloat = 8.0 + private let paddingVertical: CGFloat = 4.0 + private let spacing: CGFloat = 4.0 +} diff --git a/Sources/FluentUI_macOS/Components/MultilinePillPicker/MultilinePillPickerView.swift b/Sources/FluentUI_macOS/Components/MultilinePillPicker/MultilinePillPickerView.swift new file mode 100644 index 0000000000..db88a985f2 --- /dev/null +++ b/Sources/FluentUI_macOS/Components/MultilinePillPicker/MultilinePillPickerView.swift @@ -0,0 +1,66 @@ +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// + +import AppKit +import Combine +import SwiftUI + +/// This is a work-in-progress control for hosting multiple rows of pill buttons. At present, this control +/// only supports a hard-coded two rows of elements. +@objc(MSFMultilinePillPickerView) +public final class MultilinePillPickerView: ControlHostingView, ObservableObject { + /// Creates a multiline pill picker. + /// - Parameters: + /// - labels: An array of labels to show in the picker. + /// - action: An action to invoke when a pill is selected in the picker. Includes the index of the item being selected. + @objc(initWithLabels:action:) + @MainActor public init(labels: [String], action: (@MainActor (Int) -> Void)? = nil) { + self.labels = labels + self.action = action + super.init(AnyView(EmptyView())) + + let wrapper = MultilinePillPickerWrapper(viewModel: viewModel) + self.hostingView.rootView = AnyView(wrapper) + + // Set up observation to keep the view model in sync. + bindProperty(from: self.$isEnabled, to: \.isEnabled, on: viewModel) + bindProperty(from: self.$labels, to: \.labels, on: viewModel) + bindProperty(from: self.$action, to: \.action, on: viewModel) + } + + @MainActor required dynamic init?(coder aDecoder: NSCoder) { + preconditionFailure("init(coder:) has not been implemented") + } + + @MainActor required init(rootView: AnyView) { + preconditionFailure("init(rootView:) has not been implemented") + } + + @MainActor @Published public var isEnabled: Bool = true + @MainActor @Published public var labels: [String] + @MainActor @Published public var action: (@MainActor (Int) -> Void)? + + @MainActor private let viewModel: MultilinePillPickerViewModel = .init() +} + +/// Maps properties from `MultilinePillPickerView` to `MultilinePillPickerViewWrapper`. +fileprivate class MultilinePillPickerViewModel: ObservableObject { + @Published var isEnabled: Bool = true + @Published var labels: [String] = [] + @Published var action: (@MainActor (Int) -> Void)? +} + +/// Private wrapper `View` to map from view model to `MultilinePillPicker`. +fileprivate struct MultilinePillPickerWrapper: View { + @ObservedObject var viewModel: MultilinePillPickerViewModel + + var body: some View { + MultilinePillPicker( + labels: viewModel.labels, + action: viewModel.action + ) + .disabled(!viewModel.isEnabled) + } +} 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/Sources/FluentUI_macOS/Core/ControlHostingView.swift b/Sources/FluentUI_macOS/Core/ControlHostingView.swift new file mode 100644 index 0000000000..fd6d2ee353 --- /dev/null +++ b/Sources/FluentUI_macOS/Core/ControlHostingView.swift @@ -0,0 +1,74 @@ +// +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. +// + +import AppKit +import Combine +import SwiftUI + +/// Common wrapper for hosting and exposing SwiftUI components to UIKit-based clients. +open class ControlHostingView: NSView { + + /// The intrinsic content size of the wrapped SwiftUI view. + @objc public override var intrinsicContentSize: CGSize { + // Our desired size should always be the same as our hosted view. + return hostingView.intrinsicContentSize + } + + /// Initializes and returns an instance of `ControlHostingContainer` that wraps `controlView`. + /// + /// Unfortunately this class can't use Swift generics, which are incompatible with Objective-C interop. Instead we have to wrap + /// the control view in an `AnyView.` + /// + /// - Parameter controlView: An `AnyView`-wrapped component to host. + /// - Parameter safeAreaRegions: Passthrough to the respective property on NSHostingView. + /// Indicates which safe area regions the underlying hosting controller should add to its view. + public init(_ controlView: AnyView, safeAreaRegions: SafeAreaRegions = .all) { + hostingView = NSHostingView.init(rootView: controlView) + if #available(macOS 13.3, *) { + hostingView.sizingOptions = [.intrinsicContentSize] + hostingView.safeAreaRegions = safeAreaRegions + } + + super.init(frame: .zero) + + self.configureHostedView() + } + + required public init?(coder: NSCoder) { + preconditionFailure("init(coder:) has not been implemented") + } + + let hostingView: NSHostingView + var cancellables: Set = [] + + // Helper function to facilitate binding ourselves to a ViewModel. + func bindProperty( + from source: Published.Publisher, + to viewModelKeyPath: ReferenceWritableKeyPath, + on viewModel: Root + ) { + source + .sink { [weak viewModel] newValue in + viewModel?[keyPath: viewModelKeyPath] = newValue + } + .store(in: &cancellables) + } + + /// Adds `hostingController.view` to ourselves as a subview, and enables necessary constraints. + private func configureHostedView() { + hostingView.layer?.backgroundColor = NSColor.clear.cgColor + + addSubview(hostingView) + hostingView.translatesAutoresizingMaskIntoConstraints = false + + let requiredConstraints = [ + hostingView.leadingAnchor.constraint(equalTo: leadingAnchor), + hostingView.trailingAnchor.constraint(equalTo: trailingAnchor), + hostingView.bottomAnchor.constraint(equalTo: bottomAnchor), + hostingView.topAnchor.constraint(equalTo: topAnchor) + ] + self.addConstraints(requiredConstraints) + } +} 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 a65912983e..9c3726c6a7 100644 --- a/macos/FluentUI/FluentUI-Info.plist +++ b/Sources/FluentUI_macOS/FluentUI-Info.plist @@ -15,8 +15,8 @@ CFBundlePackageType FMWK CFBundleShortVersionString - 0.28.0 + 0.32.0 CFBundleVersion - 0.28.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 99% rename from ios/FluentUI.Tests/ColorTests.swift rename to Tests/FluentUI_iOS_Tests/ColorTests.swift index 306a2a5e7f..6425a4f830 100644 --- a/ios/FluentUI.Tests/ColorTests.swift +++ b/Tests/FluentUI_iOS_Tests/ColorTests.swift @@ -5,7 +5,7 @@ import XCTest import SwiftUI -@testable import FluentUI +@testable import FluentUI_ios class ColorTests: XCTestCase { 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/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.Resources/Info.plist b/ios/FluentUI.Resources/Info.plist deleted file mode 100644 index 8f1a360a83..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.28.0 - CFBundleVersion - 0.28.0 - - diff --git a/ios/FluentUI.xcodeproj/project.pbxproj b/ios/FluentUI.xcodeproj/project.pbxproj deleted file mode 100644 index 01d8e315ed..0000000000 --- a/ios/FluentUI.xcodeproj/project.pbxproj +++ /dev/null @@ -1,2037 +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 */; }; - 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 */; }; - 929F2ACF2BB77ED100683EA8 /* FluentButtonToggleStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 929F2ACE2BB77ED100683EA8 /* FluentButtonToggleStyle.swift */; }; - 92A1E4F526A791590007ED60 /* MSFCardNudge.swift in Sources */ = {isa = PBXBuildFile; fileRef = 92A1E4F326A791590007ED60 /* MSFCardNudge.swift */; }; - 92B2E2352BD71F27005D42C4 /* TooltipModifiers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 92B2E2342BD71F27005D42C4 /* TooltipModifiers.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 */; }; - 92ECB2DB2BE0697F00404D79 /* GlobalTokens+UIKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 92ECB2DA2BE0697F00404D79 /* GlobalTokens+UIKit.swift */; }; - 92ECB2DD2BE069D100404D79 /* Color+DynamicColor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 92ECB2DC2BE069D100404D79 /* Color+DynamicColor.swift */; }; - 92ECB2DF2BE06BCB00404D79 /* FluentTheme+UIKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 92ECB2DE2BE06BCB00404D79 /* FluentTheme+UIKit.swift */; }; - 92EE82AE27025A94009D52B5 /* TokenSet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 92EE82AC27025A94009D52B5 /* TokenSet.swift */; }; - 92F8054E272B2DF3000EAFDB /* CardNudgeModifiers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 92079C8E26B66E5100D688DA /* CardNudgeModifiers.swift */; }; - 94679F2C2BF55059004A1560 /* FluentListSection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94679F2A2BF55059004A1560 /* FluentListSection.swift */; }; - 94679F2D2BF55059004A1560 /* FluentList.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94679F2B2BF55059004A1560 /* FluentList.swift */; }; - 94679F2F2BF57F86004A1560 /* FluentListModifiers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94679F2E2BF57F86004A1560 /* FluentListModifiers.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 */; }; - F3A87D5E2BF5606E000D6A64 /* FluentListSectionHeader.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3A87D5D2BF5606E000D6A64 /* FluentListSectionHeader.swift */; }; - F3A87D602BF57421000D6A64 /* FluentListSectionFooter.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3A87D5F2BF57421000D6A64 /* FluentListSectionFooter.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 = ""; }; - 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 = ""; }; - 929F2ACE2BB77ED100683EA8 /* FluentButtonToggleStyle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FluentButtonToggleStyle.swift; sourceTree = ""; }; - 92A1E4F326A791590007ED60 /* MSFCardNudge.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MSFCardNudge.swift; sourceTree = ""; }; - 92B2E2342BD71F27005D42C4 /* TooltipModifiers.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TooltipModifiers.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 = ""; }; - 92ECB2DA2BE0697F00404D79 /* GlobalTokens+UIKit.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "GlobalTokens+UIKit.swift"; sourceTree = ""; }; - 92ECB2DC2BE069D100404D79 /* Color+DynamicColor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Color+DynamicColor.swift"; sourceTree = ""; }; - 92ECB2DE2BE06BCB00404D79 /* FluentTheme+UIKit.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "FluentTheme+UIKit.swift"; sourceTree = ""; }; - 92EE82AC27025A94009D52B5 /* TokenSet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TokenSet.swift; sourceTree = ""; }; - 94679F2A2BF55059004A1560 /* FluentListSection.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FluentListSection.swift; sourceTree = ""; }; - 94679F2B2BF55059004A1560 /* FluentList.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FluentList.swift; sourceTree = ""; }; - 94679F2E2BF57F86004A1560 /* FluentListModifiers.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FluentListModifiers.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 = ""; }; - F3A87D5D2BF5606E000D6A64 /* FluentListSectionHeader.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FluentListSectionHeader.swift; sourceTree = ""; }; - F3A87D5F2BF57421000D6A64 /* FluentListSectionFooter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FluentListSectionFooter.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 = ""; }; - 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 */, - 929F2ACE2BB77ED100683EA8 /* FluentButtonToggleStyle.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 */, - 92ECB2DE2BE06BCB00404D79 /* FluentTheme+UIKit.swift */, - 926B4C992B8E94F6001EBA16 /* FluentTheme+visionOS.swift */, - ); - path = Theme; - sourceTree = ""; - }; - 925D461A26FD126800179583 /* Tokens */ = { - isa = PBXGroup; - children = ( - 92DEE2232723D34400E31ED0 /* ControlTokenSet.swift */, - 92016FF7299DF34A00660DB7 /* EmptyTokenSet.swift */, - 925728F8276D6B5800EE1019 /* FontInfo.swift */, - 925D461B26FD133600179583 /* GlobalTokens.swift */, - 92ECB2DA2BE0697F00404D79 /* GlobalTokens+UIKit.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 = ( - 92ECB2DC2BE069D100404D79 /* Color+DynamicColor.swift */, - 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 = ""; - usesTabs = 0; - }; - 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 = ( - 94679F2B2BF55059004A1560 /* FluentList.swift */, - 94679F2E2BF57F86004A1560 /* FluentListModifiers.swift */, - 94679F2A2BF55059004A1560 /* FluentListSection.swift */, - F3A87D5F2BF57421000D6A64 /* FluentListSectionFooter.swift */, - F3A87D5D2BF5606E000D6A64 /* FluentListSectionHeader.swift */, - 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 */, - 92B2E2342BD71F27005D42C4 /* TooltipModifiers.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 */, - 94679F2F2BF57F86004A1560 /* FluentListModifiers.swift in Sources */, - 5314E13725F016370099271A /* PopupMenuProtocols.swift in Sources */, - 5314E19725F019650099271A /* TabBarItem.swift in Sources */, - EC98E2B4298D989100B9DF91 /* FluentTextInputError.swift in Sources */, - 94679F2C2BF55059004A1560 /* FluentListSection.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 */, - F3A87D5E2BF5606E000D6A64 /* FluentListSectionHeader.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 */, - 92ECB2DB2BE0697F00404D79 /* GlobalTokens+UIKit.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 */, - 92ECB2DD2BE069D100404D79 /* Color+DynamicColor.swift in Sources */, - 6F050B6D29D3D1A90070D3D5 /* TabBarTokenSet.swift in Sources */, - F3A87D602BF57421000D6A64 /* FluentListSectionFooter.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 */, - 5314E28E25F024590099271A /* Date+Extensions.swift in Sources */, - 5306076126A201C8002D49CF /* Persona.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 */, - 92B2E2352BD71F27005D42C4 /* TooltipModifiers.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 */, - 92ECB2DF2BE06BCB00404D79 /* FluentTheme+UIKit.swift in Sources */, - 929F2ACF2BB77ED100683EA8 /* FluentButtonToggleStyle.swift in Sources */, - 923DB9D7274CB66D00D8E58A /* ControlHostingView.swift in Sources */, - 5314E03B25F00E3D0099271A /* BadgeStringExtractor.swift in Sources */, - EC1C31732923022E00CF052C /* SegmentedControlTokenSet.swift in Sources */, - 5314E19825F019650099271A /* SideTabBar.swift in Sources */, - 94679F2D2BF55059004A1560 /* FluentList.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/Theme/FluentTheme+UIKit.swift b/ios/FluentUI/Core/Theme/FluentTheme+UIKit.swift deleted file mode 100644 index ff201281ac..0000000000 --- a/ios/FluentUI/Core/Theme/FluentTheme+UIKit.swift +++ /dev/null @@ -1,28 +0,0 @@ -// -// Copyright (c) Microsoft Corporation. All rights reserved. -// Licensed under the MIT License. -// - -import UIKit -import SwiftUI - -public extension FluentTheme { - - /// 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 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].map { UIColor(dynamicColor: $0) } - } -} 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 f2851e0c21..0000000000 --- a/ios/xcode/FluentUITests.xcconfig +++ /dev/null @@ -1,17 +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 -OTHER_LDFLAGS = -ObjC -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 ce5b744bc5..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 = 16.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/removeUnusedResourcesFromAssets.swift b/scripts/removeUnusedResourcesFromAssets.swift index ec03ddf928..d6075c7d22 100644 --- a/scripts/removeUnusedResourcesFromAssets.swift +++ b/scripts/removeUnusedResourcesFromAssets.swift @@ -39,7 +39,7 @@ func findUsedResources(in rootPath: String) -> Set { #endif do { - let resourceFileListContents = try String(contentsOf: fileURL) + let resourceFileListContents = try String(contentsOf: fileURL, encoding: .utf8) for entry in resourceFileListContents.split(separator: "\n") { let resourceFileEntry = entry.trimmingCharacters(in: .whitespacesAndNewlines) 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 $? }