diff --git a/compound-ios/.gitignore b/compound-ios/.gitignore new file mode 100644 index 000000000..878639360 --- /dev/null +++ b/compound-ios/.gitignore @@ -0,0 +1,23 @@ +.DS_Store +/.build +/Packages +/*.xcodeproj +xcuserdata/ +DerivedData/ +.swiftpm/config/registries.json +.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata +.netrc +.nova +node_modules + +# Cocoapods in Inspector app +Inspector/Pods + +# Ridiculous workaround to unignore the Package.resolved file to keep Xcode Cloud happy. +# https://stackoverflow.com/a/16318111/730924 +Inspector/Inspector.xcworkspace/* +!Inspector/Inspector.xcworkspace/xcshareddata +Inspector/Inspector.xcworkspace/xcshareddata/* +!Inspector/Inspector.xcworkspace/xcshareddata/swiftpm +Inspector/Inspector.xcworkspace/xcshareddata/swiftpm/* +!Inspector/Inspector.xcworkspace/xcshareddata/swiftpm/Package.resolved \ No newline at end of file diff --git a/compound-ios/Inspector/Inspector.xcodeproj/project.pbxproj b/compound-ios/Inspector/Inspector.xcodeproj/project.pbxproj new file mode 100644 index 000000000..197c56663 --- /dev/null +++ b/compound-ios/Inspector/Inspector.xcodeproj/project.pbxproj @@ -0,0 +1,534 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 55; + objects = { + +/* Begin PBXBuildFile section */ + 70AC7B23011C802F750E470E /* Pods_Compound_Inspector.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D2E28F45EEA9A8DE6AFB10E9 /* Pods_Compound_Inspector.framework */; }; + 912974102A864F5E004BEA88 /* ListScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9129740F2A864F5E004BEA88 /* ListScreen.swift */; }; + 9132C62D2A72708400EAEF3D /* ActionSheetScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9132C62C2A72708400EAEF3D /* ActionSheetScreen.swift */; }; + 9132C62F2A72785500EAEF3D /* AlertScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9132C62E2A72785400EAEF3D /* AlertScreen.swift */; }; + 9132C6312A7280A500EAEF3D /* ContextMenuScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9132C6302A7280A500EAEF3D /* ContextMenuScreen.swift */; }; + 9132C6332A72850200EAEF3D /* ShareSheetScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9132C6322A72850200EAEF3D /* ShareSheetScreen.swift */; }; + 9132C6352A72868B00EAEF3D /* NavigationBarScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9132C6342A72868B00EAEF3D /* NavigationBarScreen.swift */; }; + 917C22F629C37A9D00B35660 /* AllCases.swift in Sources */ = {isa = PBXBuildFile; fileRef = 917C22F529C37A9D00B35660 /* AllCases.swift */; }; + 917C22F829C380A200B35660 /* FontsScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 917C22F729C380A200B35660 /* FontsScreen.swift */; }; + 917F561C28256DB800D19543 /* CompoundInspectorApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 917F561B28256DB800D19543 /* CompoundInspectorApp.swift */; }; + 917F562028256DB900D19543 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 917F561F28256DB900D19543 /* Assets.xcassets */; }; + 917F562F28256DD800D19543 /* SidebarList.swift in Sources */ = {isa = PBXBuildFile; fileRef = 917F562E28256DD800D19543 /* SidebarList.swift */; }; + 9184AC022825741600227C3A /* ScreenContent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9184AC012825741600227C3A /* ScreenContent.swift */; }; + 9188246A2A2DE882001606AE /* Screen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 918824692A2DE882001606AE /* Screen.swift */; }; + 91B2EA9928CA05B900A90A83 /* Compound in Frameworks */ = {isa = PBXBuildFile; productRef = 91B2EA9828CA05B900A90A83 /* Compound */; }; + 91B2EA9C28CA064800A90A83 /* ColorsScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 91B2EA9B28CA064800A90A83 /* ColorsScreen.swift */; }; + 91B946812A29062300F187EF /* IconsScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 91B946802A29062300F187EF /* IconsScreen.swift */; }; + 91CA00362AD7D83200121E0F /* ButtonsScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 917F562A28256DCD00D19543 /* ButtonsScreen.swift */; }; + 91DE5A702E1801970000C59A /* GradientsScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 91DE5A6F2E1801970000C59A /* GradientsScreen.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 918854B628258CE100DC2377 /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 9129740F2A864F5E004BEA88 /* ListScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ListScreen.swift; sourceTree = ""; }; + 9132C62C2A72708400EAEF3D /* ActionSheetScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ActionSheetScreen.swift; sourceTree = ""; }; + 9132C62E2A72785400EAEF3D /* AlertScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AlertScreen.swift; sourceTree = ""; }; + 9132C6302A7280A500EAEF3D /* ContextMenuScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContextMenuScreen.swift; sourceTree = ""; }; + 9132C6322A72850200EAEF3D /* ShareSheetScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShareSheetScreen.swift; sourceTree = ""; }; + 9132C6342A72868B00EAEF3D /* NavigationBarScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigationBarScreen.swift; sourceTree = ""; }; + 9139E78228257ECF00091740 /* Entitlements.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Entitlements.entitlements; sourceTree = ""; }; + 917C22F529C37A9D00B35660 /* AllCases.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AllCases.swift; sourceTree = ""; }; + 917C22F729C380A200B35660 /* FontsScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FontsScreen.swift; sourceTree = ""; }; + 917F561828256DB800D19543 /* Compound Inspector.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Compound Inspector.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + 917F561B28256DB800D19543 /* CompoundInspectorApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CompoundInspectorApp.swift; sourceTree = ""; }; + 917F561F28256DB900D19543 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 917F562A28256DCD00D19543 /* ButtonsScreen.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ButtonsScreen.swift; sourceTree = ""; }; + 917F562E28256DD800D19543 /* SidebarList.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SidebarList.swift; sourceTree = ""; }; + 917F563028256DDC00D19543 /* TextFieldsScreen.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TextFieldsScreen.swift; sourceTree = ""; }; + 9184AC012825741600227C3A /* ScreenContent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScreenContent.swift; sourceTree = ""; }; + 918824692A2DE882001606AE /* Screen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Screen.swift; sourceTree = ""; }; + 91AB476A2A0E774E00D961AE /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 91B2EA9728CA048200A90A83 /* compound-ios */ = {isa = PBXFileReference; lastKnownFileType = wrapper; name = "compound-ios"; path = ..; sourceTree = ""; }; + 91B2EA9B28CA064800A90A83 /* ColorsScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ColorsScreen.swift; sourceTree = ""; }; + 91B946802A29062300F187EF /* IconsScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IconsScreen.swift; sourceTree = ""; }; + 91DE5A6F2E1801970000C59A /* GradientsScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GradientsScreen.swift; sourceTree = ""; }; + 9F9AF07976782861ECA2764C /* Pods-Compound Inspector.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Compound Inspector.release.xcconfig"; path = "Target Support Files/Pods-Compound Inspector/Pods-Compound Inspector.release.xcconfig"; sourceTree = ""; }; + B62609A3377EA1D9C59FCD20 /* Pods-Compound Inspector.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Compound Inspector.debug.xcconfig"; path = "Target Support Files/Pods-Compound Inspector/Pods-Compound Inspector.debug.xcconfig"; sourceTree = ""; }; + D2E28F45EEA9A8DE6AFB10E9 /* Pods_Compound_Inspector.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Compound_Inspector.framework; sourceTree = BUILT_PRODUCTS_DIR; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 917F561528256DB800D19543 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 91B2EA9928CA05B900A90A83 /* Compound in Frameworks */, + 70AC7B23011C802F750E470E /* Pods_Compound_Inspector.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 479BE2D4B06E029EC43A69EA /* Pods */ = { + isa = PBXGroup; + children = ( + B62609A3377EA1D9C59FCD20 /* Pods-Compound Inspector.debug.xcconfig */, + 9F9AF07976782861ECA2764C /* Pods-Compound Inspector.release.xcconfig */, + ); + path = Pods; + sourceTree = ""; + }; + 9132C62B2A72707500EAEF3D /* System Components */ = { + isa = PBXGroup; + children = ( + 9132C62C2A72708400EAEF3D /* ActionSheetScreen.swift */, + 9132C62E2A72785400EAEF3D /* AlertScreen.swift */, + 9132C6302A7280A500EAEF3D /* ContextMenuScreen.swift */, + 9132C6342A72868B00EAEF3D /* NavigationBarScreen.swift */, + 9132C6322A72850200EAEF3D /* ShareSheetScreen.swift */, + ); + path = "System Components"; + sourceTree = ""; + }; + 9145A25028CCACF7001B3451 /* Resources */ = { + isa = PBXGroup; + children = ( + 91AB476A2A0E774E00D961AE /* Info.plist */, + 917F561F28256DB900D19543 /* Assets.xcassets */, + 9139E78228257ECF00091740 /* Entitlements.entitlements */, + ); + path = Resources; + sourceTree = ""; + }; + 9145A25128CCAD08001B3451 /* Tokens */ = { + isa = PBXGroup; + children = ( + 917C22F529C37A9D00B35660 /* AllCases.swift */, + 91B2EA9B28CA064800A90A83 /* ColorsScreen.swift */, + 917C22F729C380A200B35660 /* FontsScreen.swift */, + 91B946802A29062300F187EF /* IconsScreen.swift */, + 91DE5A6F2E1801970000C59A /* GradientsScreen.swift */, + ); + path = Tokens; + sourceTree = ""; + }; + 917F560F28256DB800D19543 = { + isa = PBXGroup; + children = ( + 917F561A28256DB800D19543 /* Sources */, + 9145A25028CCACF7001B3451 /* Resources */, + 91B2EA9728CA048200A90A83 /* compound-ios */, + 918854C42825941400DC2377 /* Frameworks */, + 917F561928256DB800D19543 /* Products */, + 479BE2D4B06E029EC43A69EA /* Pods */, + ); + sourceTree = ""; + }; + 917F561928256DB800D19543 /* Products */ = { + isa = PBXGroup; + children = ( + 917F561828256DB800D19543 /* Compound Inspector.app */, + ); + name = Products; + sourceTree = ""; + }; + 917F561A28256DB800D19543 /* Sources */ = { + isa = PBXGroup; + children = ( + 917F561B28256DB800D19543 /* CompoundInspectorApp.swift */, + 917F562E28256DD800D19543 /* SidebarList.swift */, + 918824692A2DE882001606AE /* Screen.swift */, + 9184AC012825741600227C3A /* ScreenContent.swift */, + 9145A25128CCAD08001B3451 /* Tokens */, + 91B2EA9A28CA05F300A90A83 /* Components */, + 9132C62B2A72707500EAEF3D /* System Components */, + ); + path = Sources; + sourceTree = ""; + }; + 918854C42825941400DC2377 /* Frameworks */ = { + isa = PBXGroup; + children = ( + D2E28F45EEA9A8DE6AFB10E9 /* Pods_Compound_Inspector.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + 91B2EA9A28CA05F300A90A83 /* Components */ = { + isa = PBXGroup; + children = ( + 917F562A28256DCD00D19543 /* ButtonsScreen.swift */, + 9129740F2A864F5E004BEA88 /* ListScreen.swift */, + 917F563028256DDC00D19543 /* TextFieldsScreen.swift */, + ); + path = Components; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 917F561728256DB800D19543 /* Compound Inspector */ = { + isa = PBXNativeTarget; + buildConfigurationList = 917F562628256DB900D19543 /* Build configuration list for PBXNativeTarget "Compound Inspector" */; + buildPhases = ( + D4FE755DC8D0EE69F5B625AE /* [CP] Check Pods Manifest.lock */, + 917F561428256DB800D19543 /* Sources */, + 917F561528256DB800D19543 /* Frameworks */, + 917F561628256DB800D19543 /* Resources */, + 918854B628258CE100DC2377 /* Embed Frameworks */, + C53AB9B0B1E0708816C8E056 /* [CP] Embed Pods Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "Compound Inspector"; + packageProductDependencies = ( + 91B2EA9828CA05B900A90A83 /* Compound */, + ); + productName = "Component Library"; + productReference = 917F561828256DB800D19543 /* Compound Inspector.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 917F561028256DB800D19543 /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = 1; + LastSwiftUpdateCheck = 1330; + LastUpgradeCheck = 1330; + TargetAttributes = { + 917F561728256DB800D19543 = { + CreatedOnToolsVersion = 13.3; + }; + }; + }; + buildConfigurationList = 917F561328256DB800D19543 /* Build configuration list for PBXProject "Inspector" */; + compatibilityVersion = "Xcode 13.0"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 917F560F28256DB800D19543; + productRefGroup = 917F561928256DB800D19543 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 917F561728256DB800D19543 /* Compound Inspector */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 917F561628256DB800D19543 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 917F562028256DB900D19543 /* Assets.xcassets in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + C53AB9B0B1E0708816C8E056 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Compound Inspector/Pods-Compound Inspector-frameworks-${CONFIGURATION}-input-files.xcfilelist", + ); + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Compound Inspector/Pods-Compound Inspector-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Compound Inspector/Pods-Compound Inspector-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + D4FE755DC8D0EE69F5B625AE /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-Compound Inspector-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 917F561428256DB800D19543 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 91B946812A29062300F187EF /* IconsScreen.swift in Sources */, + 9132C6352A72868B00EAEF3D /* NavigationBarScreen.swift in Sources */, + 917F562F28256DD800D19543 /* SidebarList.swift in Sources */, + 91DE5A702E1801970000C59A /* GradientsScreen.swift in Sources */, + 917C22F629C37A9D00B35660 /* AllCases.swift in Sources */, + 9132C62D2A72708400EAEF3D /* ActionSheetScreen.swift in Sources */, + 917F561C28256DB800D19543 /* CompoundInspectorApp.swift in Sources */, + 9132C6332A72850200EAEF3D /* ShareSheetScreen.swift in Sources */, + 917C22F829C380A200B35660 /* FontsScreen.swift in Sources */, + 9188246A2A2DE882001606AE /* Screen.swift in Sources */, + 9184AC022825741600227C3A /* ScreenContent.swift in Sources */, + 912974102A864F5E004BEA88 /* ListScreen.swift in Sources */, + 9132C6312A7280A500EAEF3D /* ContextMenuScreen.swift in Sources */, + 9132C62F2A72785500EAEF3D /* AlertScreen.swift in Sources */, + 91CA00362AD7D83200121E0F /* ButtonsScreen.swift in Sources */, + 91B2EA9C28CA064800A90A83 /* ColorsScreen.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + 917F562428256DB900D19543 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; + 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; + GCC_C_LANGUAGE_STANDARD = gnu11; + 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; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 917F562528256DB900D19543 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++17"; + 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; + GCC_C_LANGUAGE_STANDARD = gnu11; + 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; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 917F562728256DB900D19543 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = B62609A3377EA1D9C59FCD20 /* Pods-Compound Inspector.debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = "accent-color"; + CODE_SIGN_ENTITLEMENTS = Resources/Entitlements.entitlements; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 2; + DEVELOPMENT_TEAM = 7J4U792NQT; + ENABLE_PREVIEWS = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = Resources/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = Compound; + INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.graphics-design"; + INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; + INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; + INFOPLIST_KEY_UILaunchScreen_Generation = YES; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = io.element.compound.inspector; + PRODUCT_NAME = "$(TARGET_NAME)"; + SUPPORTS_MACCATALYST = YES; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 917F562828256DB900D19543 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9F9AF07976782861ECA2764C /* Pods-Compound Inspector.release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = "accent-color"; + CODE_SIGN_ENTITLEMENTS = Resources/Entitlements.entitlements; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 2; + DEVELOPMENT_TEAM = 7J4U792NQT; + ENABLE_PREVIEWS = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_FILE = Resources/Info.plist; + INFOPLIST_KEY_CFBundleDisplayName = Compound; + INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.graphics-design"; + INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; + INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; + INFOPLIST_KEY_UILaunchScreen_Generation = YES; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = io.element.compound.inspector; + PRODUCT_NAME = "$(TARGET_NAME)"; + SUPPORTS_MACCATALYST = YES; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 917F561328256DB800D19543 /* Build configuration list for PBXProject "Inspector" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 917F562428256DB900D19543 /* Debug */, + 917F562528256DB900D19543 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 917F562628256DB900D19543 /* Build configuration list for PBXNativeTarget "Compound Inspector" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 917F562728256DB900D19543 /* Debug */, + 917F562828256DB900D19543 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + +/* Begin XCSwiftPackageProductDependency section */ + 91B2EA9828CA05B900A90A83 /* Compound */ = { + isa = XCSwiftPackageProductDependency; + productName = Compound; + }; +/* End XCSwiftPackageProductDependency section */ + }; + rootObject = 917F561028256DB800D19543 /* Project object */; +} diff --git a/compound-ios/Inspector/Inspector.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/compound-ios/Inspector/Inspector.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 000000000..919434a62 --- /dev/null +++ b/compound-ios/Inspector/Inspector.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/compound-ios/Inspector/Inspector.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/compound-ios/Inspector/Inspector.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 000000000..18d981003 --- /dev/null +++ b/compound-ios/Inspector/Inspector.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/compound-ios/Inspector/Inspector.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/compound-ios/Inspector/Inspector.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved new file mode 100644 index 000000000..b1dbe7869 --- /dev/null +++ b/compound-ios/Inspector/Inspector.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -0,0 +1,14 @@ +{ + "pins" : [ + { + "identity" : "flex", + "kind" : "remoteSourceControl", + "location" : "https://github.com/FLEXTool/FLEX", + "state" : { + "revision" : "ac50a6d36b738a15a6d3b6b51683d8a152319f59", + "version" : "4.7.0" + } + } + ], + "version" : 2 +} diff --git a/compound-ios/Inspector/Inspector.xcodeproj/xcshareddata/IDETemplateMacros.plist b/compound-ios/Inspector/Inspector.xcodeproj/xcshareddata/IDETemplateMacros.plist new file mode 100644 index 000000000..bffbfdc99 --- /dev/null +++ b/compound-ios/Inspector/Inspector.xcodeproj/xcshareddata/IDETemplateMacros.plist @@ -0,0 +1,13 @@ + + + + + FILEHEADER + +// Copyright ___YEAR___ New Vector Ltd +// +// SPDX-License-Identifier: AGPL-3.0-only +// Please see LICENSE in the repository root for full details. +// + + \ No newline at end of file diff --git a/compound-ios/Inspector/Inspector.xcworkspace/xcshareddata/swiftpm/Package.resolved b/compound-ios/Inspector/Inspector.xcworkspace/xcshareddata/swiftpm/Package.resolved new file mode 100644 index 000000000..4669c9a30 --- /dev/null +++ b/compound-ios/Inspector/Inspector.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -0,0 +1,68 @@ +{ + "pins" : [ + { + "identity" : "compound-design-tokens", + "kind" : "remoteSourceControl", + "location" : "https://github.com/element-hq/compound-design-tokens.git", + "state" : { + "revision" : "be5d26dfd4ad659b0d3b3aec1ad1cccd0dc8d063", + "version" : "6.0.0" + } + }, + { + "identity" : "sfsafesymbols", + "kind" : "remoteSourceControl", + "location" : "https://github.com/SFSafeSymbols/SFSafeSymbols.git", + "state" : { + "revision" : "3dd282d3269b061853a3b3bcd23a509d2aa166ce", + "version" : "6.2.0" + } + }, + { + "identity" : "swift-custom-dump", + "kind" : "remoteSourceControl", + "location" : "https://github.com/pointfreeco/swift-custom-dump", + "state" : { + "revision" : "82645ec760917961cfa08c9c0c7104a57a0fa4b1", + "version" : "1.3.3" + } + }, + { + "identity" : "swift-snapshot-testing", + "kind" : "remoteSourceControl", + "location" : "https://github.com/pointfreeco/swift-snapshot-testing", + "state" : { + "revision" : "1be8144023c367c5de701a6313ed29a3a10bf59b", + "version" : "1.18.3" + } + }, + { + "identity" : "swift-syntax", + "kind" : "remoteSourceControl", + "location" : "https://github.com/swiftlang/swift-syntax", + "state" : { + "revision" : "74203046135342e4a4a627476dd6caf8b28fe11b", + "version" : "509.0.0" + } + }, + { + "identity" : "swiftui-introspect", + "kind" : "remoteSourceControl", + "location" : "https://github.com/siteline/SwiftUI-Introspect.git", + "state" : { + "revision" : "a08b87f96b41055577721a6e397562b21ad52454", + "version" : "26.0.0" + } + }, + { + "identity" : "xctest-dynamic-overlay", + "kind" : "remoteSourceControl", + "location" : "https://github.com/pointfreeco/xctest-dynamic-overlay", + "state" : { + "revision" : "39de59b2d47f7ef3ca88a039dff3084688fe27f4", + "version" : "1.5.2" + } + } + ], + "version" : 2 +} diff --git a/compound-ios/Inspector/Podfile b/compound-ios/Inspector/Podfile new file mode 100644 index 000000000..44e3323be --- /dev/null +++ b/compound-ios/Inspector/Podfile @@ -0,0 +1,8 @@ +platform :ios, '16.0' + +target 'Compound Inspector' do + # Comment the next line if you don't want to use dynamic frameworks + use_frameworks! + + pod "HyperioniOS" +end diff --git a/compound-ios/Inspector/Podfile.lock b/compound-ios/Inspector/Podfile.lock new file mode 100644 index 000000000..7e52a7175 --- /dev/null +++ b/compound-ios/Inspector/Podfile.lock @@ -0,0 +1,27 @@ +PODS: + - HyperioniOS (1.2.0): + - HyperioniOS/AttributesInspector (= 1.2.0) + - HyperioniOS/Core (= 1.2.0) + - HyperioniOS/Measurements (= 1.2.0) + - HyperioniOS/SlowAnimations (= 1.2.0) + - HyperioniOS/AttributesInspector (1.2.0): + - HyperioniOS/Core + - HyperioniOS/Core (1.2.0) + - HyperioniOS/Measurements (1.2.0): + - HyperioniOS/Core + - HyperioniOS/SlowAnimations (1.2.0): + - HyperioniOS/Core + +DEPENDENCIES: + - HyperioniOS + +SPEC REPOS: + trunk: + - HyperioniOS + +SPEC CHECKSUMS: + HyperioniOS: 4412ec61a390caadffcaaf3364733b06e103cf63 + +PODFILE CHECKSUM: 30e97949fb1de5c74fc24378bbfdbbace5bd8b80 + +COCOAPODS: 1.16.2 diff --git a/compound-ios/Inspector/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json b/compound-ios/Inspector/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 000000000..b3f44eb29 --- /dev/null +++ b/compound-ios/Inspector/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,14 @@ +{ + "images" : [ + { + "filename" : "Icon.png", + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/compound-ios/Inspector/Resources/Assets.xcassets/AppIcon.appiconset/Icon.png b/compound-ios/Inspector/Resources/Assets.xcassets/AppIcon.appiconset/Icon.png new file mode 100644 index 000000000..571671c95 Binary files /dev/null and b/compound-ios/Inspector/Resources/Assets.xcassets/AppIcon.appiconset/Icon.png differ diff --git a/compound-ios/Inspector/Resources/Assets.xcassets/Contents.json b/compound-ios/Inspector/Resources/Assets.xcassets/Contents.json new file mode 100644 index 000000000..73c00596a --- /dev/null +++ b/compound-ios/Inspector/Resources/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/compound-ios/Inspector/Resources/Assets.xcassets/accent-color.colorset/Contents.json b/compound-ios/Inspector/Resources/Assets.xcassets/accent-color.colorset/Contents.json new file mode 100644 index 000000000..bc8421e00 --- /dev/null +++ b/compound-ios/Inspector/Resources/Assets.xcassets/accent-color.colorset/Contents.json @@ -0,0 +1,78 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.133", + "green" : "0.114", + "red" : "0.106" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.949", + "green" : "0.933", + "red" : "0.922" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "contrast", + "value" : "high" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.129", + "green" : "0.110", + "red" : "0.102" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + }, + { + "appearance" : "contrast", + "value" : "high" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.969", + "green" : "0.961", + "red" : "0.949" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/compound-ios/Inspector/Resources/Entitlements.entitlements b/compound-ios/Inspector/Resources/Entitlements.entitlements new file mode 100644 index 000000000..852fa1a47 --- /dev/null +++ b/compound-ios/Inspector/Resources/Entitlements.entitlements @@ -0,0 +1,8 @@ + + + + + com.apple.security.app-sandbox + + + diff --git a/compound-ios/Inspector/Resources/Info.plist b/compound-ios/Inspector/Resources/Info.plist new file mode 100644 index 000000000..bc11256bd --- /dev/null +++ b/compound-ios/Inspector/Resources/Info.plist @@ -0,0 +1,8 @@ + + + + + ITSAppUsesNonExemptEncryption + + + diff --git a/compound-ios/Inspector/Sources/Components/ButtonsScreen.swift b/compound-ios/Inspector/Sources/Components/ButtonsScreen.swift new file mode 100644 index 000000000..34f426625 --- /dev/null +++ b/compound-ios/Inspector/Sources/Components/ButtonsScreen.swift @@ -0,0 +1,27 @@ +// +// Copyright 2023, 2024 New Vector Ltd. +// +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. +// + +import Compound +import SwiftUI + +struct ButtonsScreen: View { + var body: some View { + ScreenContent(navigationTitle: "Buttons") { + CompoundButtonStyle_Previews.states + SendButton_Previews.states + } + } +} + +struct ButtonsScreen_Previews: PreviewProvider { + static var previews: some View { + NavigationStack { + ButtonsScreen() + } + .previewLayout(.fixed(width: 375, height: 700)) + } +} diff --git a/compound-ios/Inspector/Sources/Components/ListScreen.swift b/compound-ios/Inspector/Sources/Components/ListScreen.swift new file mode 100644 index 000000000..c9eb35369 --- /dev/null +++ b/compound-ios/Inspector/Sources/Components/ListScreen.swift @@ -0,0 +1,26 @@ +// +// Copyright 2023, 2024 New Vector Ltd. +// +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. +// + +import SwiftUI +import Compound +import HyperionCore + +struct ListScreen: View { + var body: some View { + ListRow_Previews.previews + .navigationTitle("Lists") + } +} + +struct ListScreen_Previews: PreviewProvider { + static var previews: some View { + NavigationStack { + ListScreen() + } + .previewLayout(.fixed(width: 375, height: 700)) + } +} diff --git a/compound-ios/Inspector/Sources/Components/TextFieldsScreen.swift b/compound-ios/Inspector/Sources/Components/TextFieldsScreen.swift new file mode 100644 index 000000000..9d9058bd1 --- /dev/null +++ b/compound-ios/Inspector/Sources/Components/TextFieldsScreen.swift @@ -0,0 +1,26 @@ +// +// Copyright 2023, 2024 New Vector Ltd. +// +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. +// + +import SwiftUI +import DesignKit + +struct TextFieldsScreen: View { + var body: some View { + ScreenContent(navigationTitle: "Text Fields") { + BorderedInputFieldStyle_Previews.states + } + } +} + +struct TextFieldsScreen_Previews: PreviewProvider { + static var previews: some View { + NavigationStack { + TextFieldsScreen() + } + .previewLayout(.fixed(width: 375, height: 700)) + } +} diff --git a/compound-ios/Inspector/Sources/CompoundInspectorApp.swift b/compound-ios/Inspector/Sources/CompoundInspectorApp.swift new file mode 100644 index 000000000..522f5570b --- /dev/null +++ b/compound-ios/Inspector/Sources/CompoundInspectorApp.swift @@ -0,0 +1,87 @@ +// +// Copyright 2023, 2024 New Vector Ltd. +// +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. +// + +import SwiftUI +import Compound +import HyperionCore + +@main +struct CompoundInspectorApp: App { + @State private var colorScheme: ColorScheme = .light + @State private var dynamicTypeSize: DynamicTypeSize = .large + + private var isDark: Bool { colorScheme == .dark } + private var preferredColorScheme: ColorScheme? { ProcessInfo.processInfo.isMacCatalystApp ? colorScheme : nil } + + var body: some Scene { + WindowGroup { + NavigationSplitView { + SidebarList() + .navigationTitle("Components") + .navigationDestination(for: Screen.self) { screen in + screen + #if targetEnvironment(macCatalyst) + .dynamicTypeSize(dynamicTypeSize) + #endif + .navigationBarTitleDisplayMode(.inline) + .toolbar { screenToolbar } + } + } detail: { + EmptyView() + } + .accentColor(.compound.textActionPrimary) + .preferredColorScheme(preferredColorScheme) + .introspect(.window, on: .supportedVersions) { window in + // Apply the tint colour to alerts and confirmation dialogs + window.tintColor = .compound.textActionPrimary + } + } + .commands { + CommandMenu("Options") { + Button("Hyperion", action: HyperionManager.sharedInstance().togglePluginDrawer) + .keyboardShortcut("i", modifiers: [.command, .option]) + + Divider() + + Button("Toggle Appearance", action: toggleDarkMode) + .keyboardShortcut("a", modifiers: [.command, .shift]) + + #if targetEnvironment(macCatalyst) + textSizePicker + #endif + } + } + } + + var textSizePicker: some View { + Picker("Text Size", selection: $dynamicTypeSize) { + ForEach(DynamicTypeSize.allCases, id: \.self) { size in + Text(String(describing: size)).tag(size) + } + } + } + + @ViewBuilder + var screenToolbar: some View { + #if targetEnvironment(macCatalyst) + Menu { + textSizePicker + .pickerStyle(.inline) + } label: { + Image(systemName: "textformat.size") + } + #endif + + Button(action: HyperionManager.sharedInstance().togglePluginDrawer) { + Image(systemName: "ruler") + } + } + + func toggleDarkMode() { + colorScheme = isDark ? .light : .dark + } +} diff --git a/compound-ios/Inspector/Sources/Screen.swift b/compound-ios/Inspector/Sources/Screen.swift new file mode 100644 index 000000000..760559c11 --- /dev/null +++ b/compound-ios/Inspector/Sources/Screen.swift @@ -0,0 +1,63 @@ +// +// Copyright 2023, 2024 New Vector Ltd. +// +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. +// + +import SwiftUI + +/// A screen of components/tokens that can be navigated to. +enum Screen: Hashable, View { + /// Colour tokens + case colors + /// Gradients assembled from colour tokens + case gradients + /// Font tokens + case fonts + /// Icon tokens + case icons + /// Size tokens + case sizes + + /// List styles and components + case list + /// Label styles + case labels + /// Button styles + case buttons + /// Text field styles. + case textFields + + /// The system's confirmation dialog component + case actionSheet + /// The system's alert component + case alert + /// The system's context menu component + case contextMenu + /// The system's navigation bar component + case navigationBar + /// The system's share sheet component + case shareSheet + + var body: some View { + switch self { + case .colors: ColorsScreen() + case .gradients: GradientsScreen() + case .fonts: FontsScreen() + case .icons: IconsScreen() + + case .list: ListScreen() + case .sizes: EmptyView() + case .labels: EmptyView() + case .buttons: ButtonsScreen() + case .textFields: EmptyView() + + case .actionSheet: ActionSheetScreen() + case .alert: AlertScreen() + case .contextMenu: ContextMenuScreen() + case .navigationBar: NavigationBarScreen() + case .shareSheet: ShareSheetScreen() + } + } +} diff --git a/compound-ios/Inspector/Sources/ScreenContent.swift b/compound-ios/Inspector/Sources/ScreenContent.swift new file mode 100644 index 000000000..ae86c5f53 --- /dev/null +++ b/compound-ios/Inspector/Sources/ScreenContent.swift @@ -0,0 +1,34 @@ +// +// Copyright 2023, 2024 New Vector Ltd. +// +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. +// + +import SwiftUI + +/// A helper to provider a default layout for the content of a screen. +struct ScreenContent: View { + let navigationTitle: String + @ViewBuilder var content: () -> Content + + var body: some View { + ScrollView { + LazyVStack(spacing: 16) { + content() + } + .padding() + } + .navigationTitle(navigationTitle) + } +} + +struct ComponentsContainer_Previews: PreviewProvider { + static var previews: some View { + NavigationStack { + ScreenContent(navigationTitle: "Buttons") { + Button("Confirm") { } + } + } + } +} diff --git a/compound-ios/Inspector/Sources/SidebarList.swift b/compound-ios/Inspector/Sources/SidebarList.swift new file mode 100644 index 000000000..60a508d71 --- /dev/null +++ b/compound-ios/Inspector/Sources/SidebarList.swift @@ -0,0 +1,81 @@ +// +// Copyright 2023, 2024 New Vector Ltd. +// +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. +// + +import SwiftUI + +struct SidebarList: View { + var body: some View { + List { + tokensSection + componentsSection + systemComponentsSection + } + .navigationTitle("Components") + .listStyle(.sidebar) + .tint(.compound.iconAccentTertiary) + } + + var tokensSection: some View { + Section("Tokens") { + NavigationLink(value: Screen.colors) { + Label("Colours", systemImage: "paintpalette") + } + NavigationLink(value: Screen.gradients) { + Label("Gradients", systemImage: "lightspectrum.horizontal") + } + NavigationLink(value: Screen.fonts) { + Label("Typography", systemImage: "character") + } + NavigationLink(value: Screen.icons) { + Label("Icons", systemImage: "pencil.and.outline") + } + } + } + + var componentsSection: some View { + Section("Components") { + NavigationLink(value: Screen.buttons) { + Label("Buttons", systemImage: "rectangle.and.hand.point.up.left") + } + NavigationLink(value: Screen.list) { + Label("List", systemImage: "list.bullet.clipboard") + } + } + } + + var systemComponentsSection: some View { + Section("System Components") { + NavigationLink(value: Screen.actionSheet) { + Label("Action Sheets", systemImage: "window.shade.closed") + } + + NavigationLink(value: Screen.alert) { + Label("Alerts", systemImage: "exclamationmark.triangle") + } + + NavigationLink(value: Screen.contextMenu) { + Label("Context Menus", systemImage: "contextualmenu.and.cursorarrow") + } + + NavigationLink(value: Screen.navigationBar) { + Label("Navigation Bar", systemImage: "window.shade.open") + } + + NavigationLink(value: Screen.shareSheet) { + Label("Share Sheet", systemImage: "square.and.arrow.up") + } + } + } +} + +struct ContentView_Previews: PreviewProvider { + static var previews: some View { + NavigationStack { + SidebarList() + } + } +} diff --git a/compound-ios/Inspector/Sources/System Components/ActionSheetScreen.swift b/compound-ios/Inspector/Sources/System Components/ActionSheetScreen.swift new file mode 100644 index 000000000..0b96b5e54 --- /dev/null +++ b/compound-ios/Inspector/Sources/System Components/ActionSheetScreen.swift @@ -0,0 +1,53 @@ +// +// Copyright 2023, 2024 New Vector Ltd. +// +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. +// + +import SwiftUI +import Compound + +struct ActionSheetScreen: View { + @State private var isPresentingConfirmationDialog = true + + var body: some View { + ScreenContent(navigationTitle: "Action Sheets") { + Text("This component will be rendered differently when running on macOS.") + .font(.footnote) + .foregroundColor(.secondary) + .multilineTextAlignment(.center) + } + .toolbar { + ToolbarItem(placement: .bottomBar) { + Button("Show Sheet") { + isPresentingConfirmationDialog = true + } + .confirmationDialog("A Short Title is Best", + isPresented: $isPresentingConfirmationDialog) { + Button("Default") { } + Button("Default") { } + Button("Default") { } + Button("Disabled") { } + .disabled(true) // This hides the button on iOS 16 😐 + Button("Destructive", role: .destructive) { } + } message: { + Text("A message should be a short, complete sentence.") + } + } + } + } +} + +struct ActionSheetScreen_Previews: PreviewProvider { + static var previews: some View { + NavigationStack { + ActionSheetScreen() + } + .introspect(.window, on: .supportedVersions) { window in + // Fix the tint colour like the App strut does. + window.tintColor = .compound.textActionPrimary + } + .previewLayout(.fixed(width: 375, height: 750)) + } +} diff --git a/compound-ios/Inspector/Sources/System Components/AlertScreen.swift b/compound-ios/Inspector/Sources/System Components/AlertScreen.swift new file mode 100644 index 000000000..433bb7126 --- /dev/null +++ b/compound-ios/Inspector/Sources/System Components/AlertScreen.swift @@ -0,0 +1,79 @@ +// +// Copyright 2023, 2024 New Vector Ltd. +// +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. +// + +import SwiftUI +import Compound + +struct AlertScreen: View { + @State private var isPresentingActionAlert = false + @State private var isPresentingActionAndCancelAlert = false + @State private var isPresentingDestructiveAlert = false + @State private var isPresentingTextFieldAlert = false + @State private var textFieldValue = "" + + private let title = "A Short Title is Best" + private let message = "A message should be a short, complete sentence." + + var body: some View { + ScreenContent(navigationTitle: "Alerts") { + Text("This component will be rendered differently when running on macOS.") + .font(.footnote) + .foregroundColor(.secondary) + .multilineTextAlignment(.center) + + Button("Action") { isPresentingActionAlert = true } + .padding(.top) + .alert(title, isPresented: $isPresentingActionAlert) { + Button("Action") { } + } message: { + Text(message) + } + + Button("Action and Cancel") { isPresentingActionAndCancelAlert = true } + .padding(.top) + .alert(title, isPresented: $isPresentingActionAndCancelAlert) { + Button("Action") { } + Button("Cancel", role: .cancel) { } + } message: { + Text(message) + } + + Button("Destructive") { isPresentingDestructiveAlert = true } + .padding(.top) + .alert(title, isPresented: $isPresentingDestructiveAlert) { + Button("Action") { } + Button("Destructive", role: .destructive) { } + Button("Cancel", role: .cancel) { } + } message: { + Text(message) + } + + Button("TextField") { isPresentingTextFieldAlert = true } + .padding(.top) + .alert(title, isPresented: $isPresentingTextFieldAlert) { + TextField("Input", text: $textFieldValue, prompt: Text("Placeholder")) + Button("Action") { } + Button("Cancel", role: .cancel) { } + } message: { + Text(message) + } + } + } +} + +struct AlertScreen_Previews: PreviewProvider { + static var previews: some View { + NavigationStack { + AlertScreen() + } + .introspect(.window, on: .supportedVersions) { window in + // Fix the tint colour like the App strut does. + window.tintColor = .compound.textActionPrimary + } + .previewLayout(.fixed(width: 375, height: 750)) + } +} diff --git a/compound-ios/Inspector/Sources/System Components/ContextMenuScreen.swift b/compound-ios/Inspector/Sources/System Components/ContextMenuScreen.swift new file mode 100644 index 000000000..7356f9ce1 --- /dev/null +++ b/compound-ios/Inspector/Sources/System Components/ContextMenuScreen.swift @@ -0,0 +1,84 @@ +// +// Copyright 2023, 2024 New Vector Ltd. +// +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. +// + +import SwiftUI +import Compound + +struct ContextMenuScreen: View { + var body: some View { + ScreenContent(navigationTitle: "Context Menus") { + Text("This component will be rendered differently when running on macOS.") + .font(.footnote) + .foregroundColor(.secondary) + .multilineTextAlignment(.center) + + Text("Actions") + .padding() + .contentShape(.contextMenuPreview, RoundedRectangle(cornerRadius: 12)) + .contextMenu { + Section { + Button { } label: { + Label("Action", systemImage: "square.dashed") + } + Button { } label: { + Label("Action", systemImage: "square.dashed") + } + Button { } label: { + Label("Disabled", systemImage: "square.dashed") + } + .disabled(true) + Button(role: .destructive) { } label: { + Label("Destructive", systemImage: "square.dashed") + } + } + Section { + Button { } label: { + Label("Action", systemImage: "square.dashed") + } + Button { } label: { + Label("Action", systemImage: "square.dashed") + } + } + } + + Text("Toggles") + .padding() + .contentShape(.contextMenuPreview, RoundedRectangle(cornerRadius: 12)) + .contextMenu { + Section { + Toggle(isOn: .constant(true)) { + Label("Toggle", systemImage: "square.dashed") + } + Toggle(isOn: .constant(false)) { + Label("Toggle", systemImage: "square.dashed") + } + Toggle(isOn: .constant(false)) { + Label("Disabled", systemImage: "square.dashed") + } + .disabled(true) + } + Section { + Toggle(isOn: .constant(true)) { + Label("Toggle", systemImage: "square.dashed") + } + Toggle(isOn: .constant(true)) { + Label("Toggle", systemImage: "square.dashed") + } + } + } + } + } +} + +struct ContextMenuScreen_Previews: PreviewProvider { + static var previews: some View { + NavigationStack { + ContextMenuScreen() + } + .previewLayout(.fixed(width: 375, height: 750)) + } +} diff --git a/compound-ios/Inspector/Sources/System Components/NavigationBarScreen.swift b/compound-ios/Inspector/Sources/System Components/NavigationBarScreen.swift new file mode 100644 index 000000000..d6d18a031 --- /dev/null +++ b/compound-ios/Inspector/Sources/System Components/NavigationBarScreen.swift @@ -0,0 +1,110 @@ +// +// Copyright 2023, 2024 New Vector Ltd. +// +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. +// + +import SwiftUI +import Compound + +struct NavigationBarScreen: View { + enum TitleMode { + case large + case inline + case hidden + } + + enum BackButtonMode { + case navigation + case cancellationAction + case hidden + } + + @State private var titleMode = TitleMode.inline + @State private var backButtonMode = BackButtonMode.navigation + @State private var hasConfirmationAction = true + @State private var hasPrimaryAction = false + + var body: some View { + Form { + Section { + ListRow(kind: .custom { + Text("This component may be rendered differently when running on macOS.") + .font(.compound.bodySM) + .foregroundColor(.compound.textSecondary) + .multilineTextAlignment(.center) + .frame(maxWidth: .infinity) + .listRowBackground(Color.clear) + }) + } + + Section { + ListRow(label: .plain(title: "Title"), + kind: .picker(selection: $titleMode, items: [ + (title: "Large", tag: .large), + (title: "Inline", tag: .inline), + (title: "Hidden", tag: .hidden) + ])) + ListRow(label: .plain(title: "Back Button"), + kind: .picker(selection: $backButtonMode, items: [ + (title: "Navigation", tag: .navigation), + (title: "Cancelation Action", tag: .cancellationAction), + (title: "Hidden", tag: .hidden) + ])) + + ListRow(label: .plain(title: "Confirmation Action"), + kind: .toggle($hasConfirmationAction)) + ListRow(label: .plain(title: "Primary Action"), + kind: .toggle($hasPrimaryAction)) + } header: { + Text("Configuration") + .compoundListSectionHeader() + } + + Section { + ListRow(kind: .custom { + VStack { + Text("Empty section to make the form scrollable") + .font(.compound.bodySM) + .foregroundColor(.compound.textSecondary) + Spacer(minLength: 500) + } + .padding(ListRowPadding.insets) + }) + } + } + .compoundList() + .navigationTitle(titleMode == .hidden ? "" : "Navigation Bar") + .navigationBarTitleDisplayMode(titleMode == .large ? .large : .inline) + .navigationBarBackButtonHidden(backButtonMode != .navigation) + .toolbar { + if hasConfirmationAction { + ToolbarItem(placement: .confirmationAction) { + Button("Confirm") { } + } + } + + if hasPrimaryAction { + ToolbarItem(placement: .primaryAction) { + Button("Primary") { } + } + } + + if backButtonMode == .cancellationAction { + ToolbarItem(placement: .cancellationAction) { + Button("Cancel") { } + } + } + } + } +} + +struct NavigationBarScreen_Previews: PreviewProvider { + static var previews: some View { + NavigationStack { + NavigationBarScreen() + } + .previewLayout(.fixed(width: 375, height: 750)) + } +} diff --git a/compound-ios/Inspector/Sources/System Components/ShareSheetScreen.swift b/compound-ios/Inspector/Sources/System Components/ShareSheetScreen.swift new file mode 100644 index 000000000..685ad91a2 --- /dev/null +++ b/compound-ios/Inspector/Sources/System Components/ShareSheetScreen.swift @@ -0,0 +1,32 @@ +// +// Copyright 2023, 2024 New Vector Ltd. +// +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. +// + +import SwiftUI +import Compound + +struct ShareSheetScreen: View { + var body: some View { + ScreenContent(navigationTitle: "Share Sheets") { + Text("This component will be rendered differently when running on macOS.") + .font(.footnote) + .foregroundColor(.secondary) + .multilineTextAlignment(.center) + + ShareLink(item: URL(string: "https://element.io")!, subject: Text("The subject"), message: Text("The message")) + .padding(.top) + } + } +} + +struct ShareSheetScreen_Previews: PreviewProvider { + static var previews: some View { + NavigationStack { + ShareSheetScreen() + } + .previewLayout(.fixed(width: 375, height: 750)) + } +} diff --git a/compound-ios/Inspector/Sources/Tokens/AllCases.swift b/compound-ios/Inspector/Sources/Tokens/AllCases.swift new file mode 100644 index 000000000..6fef44c62 --- /dev/null +++ b/compound-ios/Inspector/Sources/Tokens/AllCases.swift @@ -0,0 +1,66 @@ +// +// Copyright 2023, 2024 New Vector Ltd. +// +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. +// + +import Compound +import SwiftUI + +protocol AllValues { + associatedtype ValueType + var allValues: [(name: String, value: ValueType)] { get } +} + +extension AllValues { + var allValues: [(name: String, value: ValueType)] { + var values: [(name: String, value: ValueType)] = [] + let mirror = Mirror(reflecting: self) + + for property in mirror.children { + if let label = property.label, let value = property.value as? ValueType { + values.append((label, value)) + } + } + + return values + } +} + +extension CompoundColors: AllValues { typealias ValueType = Color } +extension CompoundColorTokens: AllValues { typealias ValueType = Color } +extension CompoundGradients: AllValues { typealias ValueType = Gradient } +extension CompoundFonts: AllValues { typealias ValueType = Font } +extension CompoundIcons: AllValues { typealias ValueType = Image } + +extension CompoundColors { + var allColors: [(name: String, value: Color)] { + CompoundColorTokens().allValues + allValues + } +} + +extension CompoundIcons { + var allKeyPaths: [(name: String, value: KeyPath)] { + var icons: [(name: String, value: KeyPath)] = [] + let mirror = Mirror(reflecting: self) + + for property in mirror.children { + if let label = property.label { + let keyPath = \CompoundIcons.[checkedMirrorDescendant: label] as PartialKeyPath + + if let imageKeyPath = keyPath as? KeyPath { + icons.append((label, imageKeyPath)) + } else { + print("Nope") + } + } + } + + return icons + } + + private subscript(checkedMirrorDescendant key: String) -> Any { + return Mirror(reflecting: self).descendant(key)! + } +} diff --git a/compound-ios/Inspector/Sources/Tokens/ColorsScreen.swift b/compound-ios/Inspector/Sources/Tokens/ColorsScreen.swift new file mode 100644 index 000000000..81f5bb0e1 --- /dev/null +++ b/compound-ios/Inspector/Sources/Tokens/ColorsScreen.swift @@ -0,0 +1,85 @@ +// +// Copyright 2023, 2024 New Vector Ltd. +// +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. +// + +import SwiftUI +import Compound + +struct ColorsScreen: View { + var body: some View { + ScreenContent(navigationTitle: "Colors") { + ForEach(Color.compound.allColors, id: \.name) { color in + ColorItem(color: color.value, name: color.name) + } + } + } +} + +struct ColorItem: View { + let color: Color + let name: String + + var body: some View { + HStack { + swatch + + VStack(alignment: .leading) { + Text(name) + .font(.compound.bodyLG) + .foregroundColor(.compound.textPrimary) + Text(color.hexValue()) + .font(.compound.bodySM.monospaced()) + .foregroundColor(.compound.textSecondary) + } + } + } + + var swatch: some View { + swatchShape + .foregroundColor(color) + .frame(height: 40) + .aspectRatio(1, contentMode: .fit) + .overlay { + swatchShape + .strokeBorder(Color.compound.iconPrimary, lineWidth: 1.5) + .opacity(0.2) + } + } + + var swatchShape: some InsettableShape { + RoundedRectangle(cornerRadius: 12, style: .continuous) + } +} + +private extension Color { + func hexValue() -> String { + let uiColor = UIColor(self) + + var red: CGFloat = 0 + var green: CGFloat = 0 + var blue: CGFloat = 0 + var alpha: CGFloat = 0 + + uiColor.getRed(&red, green: &green, blue: &blue, alpha: &alpha) + + return "#\(red.asHex)\(green.asHex)\(blue.asHex)" + } +} + +private extension CGFloat { + var asHex: String { + String(format:"%02X", Int((self * 255).rounded())) + } +} + +struct ColorsScreen_Previews: PreviewProvider { + static var previews: some View { + NavigationStack { + ColorsScreen() + } + .previewLayout(.fixed(width: 375, height: 700)) + } +} diff --git a/compound-ios/Inspector/Sources/Tokens/FontsScreen.swift b/compound-ios/Inspector/Sources/Tokens/FontsScreen.swift new file mode 100644 index 000000000..92f26f098 --- /dev/null +++ b/compound-ios/Inspector/Sources/Tokens/FontsScreen.swift @@ -0,0 +1,40 @@ +// +// Copyright 2023, 2024 New Vector Ltd. +// +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. +// + +import SwiftUI +import Compound + +struct FontsScreen: View { + var body: some View { + ScreenContent(navigationTitle: "Fonts") { + ForEach(Font.compound.allValues, id: \.name) { font in + FontItem(font: font.value, name: font.name) + } + } + } +} + +struct FontItem: View { + let font: Font + let name: String + + var body: some View { + Text(name) + .font(font) + .foregroundColor(.compound.textPrimary) + .frame(maxWidth: .infinity, alignment: .leading) + } +} + +struct FontsScreen_Previews: PreviewProvider { + static var previews: some View { + NavigationStack { + FontsScreen() + } + .previewLayout(.fixed(width: 375, height: 750)) + } +} diff --git a/compound-ios/Inspector/Sources/Tokens/GradientsScreen.swift b/compound-ios/Inspector/Sources/Tokens/GradientsScreen.swift new file mode 100644 index 000000000..a216064ca --- /dev/null +++ b/compound-ios/Inspector/Sources/Tokens/GradientsScreen.swift @@ -0,0 +1,61 @@ +// +// Copyright 2025 New Vector Ltd. +// +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. +// + +import SwiftUI +import Compound + +struct GradientsScreen: View { + var body: some View { + ScreenContent(navigationTitle: "Colors") { + ForEach(Gradient.compound.allValues, id: \.name) { gradient in + GradientItem(gradient: gradient.value, name: gradient.name) + } + } + } +} + +struct GradientItem: View { + let gradient: Gradient + let name: String + + var body: some View { + HStack { + swatch + + VStack(alignment: .leading) { + Text(name) + .font(.compound.bodyLG) + .foregroundColor(.compound.textPrimary) + } + } + } + + var swatch: some View { + swatchShape + .foregroundStyle(gradient) + .frame(height: 40) + .aspectRatio(1, contentMode: .fit) + .overlay { + swatchShape + .strokeBorder(Color.compound.iconPrimary, lineWidth: 1.5) + .opacity(0.2) + } + } + + var swatchShape: some InsettableShape { + RoundedRectangle(cornerRadius: 12, style: .continuous) + } +} + +struct GradientsScreen_Previews: PreviewProvider { + static var previews: some View { + NavigationStack { + ColorsScreen() + } + .previewLayout(.fixed(width: 375, height: 700)) + } +} diff --git a/compound-ios/Inspector/Sources/Tokens/IconsScreen.swift b/compound-ios/Inspector/Sources/Tokens/IconsScreen.swift new file mode 100644 index 000000000..65656e231 --- /dev/null +++ b/compound-ios/Inspector/Sources/Tokens/IconsScreen.swift @@ -0,0 +1,47 @@ +// +// Copyright 2023, 2024 New Vector Ltd. +// +// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial +// Please see LICENSE files in the repository root for full details. +// + +import SwiftUI +import Compound + +struct IconsScreen: View { + let icons = Image.compound.allValues.sorted(by: { $0.name < $1.name }) + + var body: some View { + ScreenContent(navigationTitle: "Icons") { + ForEach(icons, id: \.name) { icon in + IconItem(icon: icon.value, name: icon.name) + } + } + } +} + +struct IconItem: View { + let icon: Image + let name: String + + var body: some View { + Label { + Text(name) + .foregroundColor(.compound.textPrimary) + } icon: { + CompoundIcon(customImage: icon) + .foregroundColor(.compound.iconSecondary) + } + .font(.compound.bodyLG) + .frame(maxWidth: .infinity, alignment: .leading) + } +} + +struct IconsScreen_Previews: PreviewProvider { + static var previews: some View { + NavigationStack { + IconsScreen() + } + .previewLayout(.fixed(width: 375, height: 750)) + } +} diff --git a/compound-ios/Inspector/ci_scripts/ci_post_clone.sh b/compound-ios/Inspector/ci_scripts/ci_post_clone.sh new file mode 100755 index 000000000..0c9c2da92 --- /dev/null +++ b/compound-ios/Inspector/ci_scripts/ci_post_clone.sh @@ -0,0 +1,11 @@ +#!/bin/sh + +set -e + +# Build dependencies +echo "Installing CocoaPods" +brew install cocoapods + +# Project dependencies +echo "Installing Pods" +pod install