Move Compound Inspector into the project.

This commit is contained in:
Doug
2025-09-28 15:37:59 +01:00
committed by Doug
parent 6bec5f794a
commit 8ba73f679a
33 changed files with 1828 additions and 0 deletions

23
compound-ios/.gitignore vendored Normal file
View File

@@ -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

View File

@@ -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 = "<group>"; };
9132C62C2A72708400EAEF3D /* ActionSheetScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ActionSheetScreen.swift; sourceTree = "<group>"; };
9132C62E2A72785400EAEF3D /* AlertScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AlertScreen.swift; sourceTree = "<group>"; };
9132C6302A7280A500EAEF3D /* ContextMenuScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContextMenuScreen.swift; sourceTree = "<group>"; };
9132C6322A72850200EAEF3D /* ShareSheetScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShareSheetScreen.swift; sourceTree = "<group>"; };
9132C6342A72868B00EAEF3D /* NavigationBarScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigationBarScreen.swift; sourceTree = "<group>"; };
9139E78228257ECF00091740 /* Entitlements.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Entitlements.entitlements; sourceTree = "<group>"; };
917C22F529C37A9D00B35660 /* AllCases.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AllCases.swift; sourceTree = "<group>"; };
917C22F729C380A200B35660 /* FontsScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FontsScreen.swift; sourceTree = "<group>"; };
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 = "<group>"; };
917F561F28256DB900D19543 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
917F562A28256DCD00D19543 /* ButtonsScreen.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ButtonsScreen.swift; sourceTree = "<group>"; };
917F562E28256DD800D19543 /* SidebarList.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SidebarList.swift; sourceTree = "<group>"; };
917F563028256DDC00D19543 /* TextFieldsScreen.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TextFieldsScreen.swift; sourceTree = "<group>"; };
9184AC012825741600227C3A /* ScreenContent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScreenContent.swift; sourceTree = "<group>"; };
918824692A2DE882001606AE /* Screen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Screen.swift; sourceTree = "<group>"; };
91AB476A2A0E774E00D961AE /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
91B2EA9728CA048200A90A83 /* compound-ios */ = {isa = PBXFileReference; lastKnownFileType = wrapper; name = "compound-ios"; path = ..; sourceTree = "<group>"; };
91B2EA9B28CA064800A90A83 /* ColorsScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ColorsScreen.swift; sourceTree = "<group>"; };
91B946802A29062300F187EF /* IconsScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IconsScreen.swift; sourceTree = "<group>"; };
91DE5A6F2E1801970000C59A /* GradientsScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GradientsScreen.swift; sourceTree = "<group>"; };
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 = "<group>"; };
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 = "<group>"; };
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 = "<group>";
};
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 = "<group>";
};
9145A25028CCACF7001B3451 /* Resources */ = {
isa = PBXGroup;
children = (
91AB476A2A0E774E00D961AE /* Info.plist */,
917F561F28256DB900D19543 /* Assets.xcassets */,
9139E78228257ECF00091740 /* Entitlements.entitlements */,
);
path = Resources;
sourceTree = "<group>";
};
9145A25128CCAD08001B3451 /* Tokens */ = {
isa = PBXGroup;
children = (
917C22F529C37A9D00B35660 /* AllCases.swift */,
91B2EA9B28CA064800A90A83 /* ColorsScreen.swift */,
917C22F729C380A200B35660 /* FontsScreen.swift */,
91B946802A29062300F187EF /* IconsScreen.swift */,
91DE5A6F2E1801970000C59A /* GradientsScreen.swift */,
);
path = Tokens;
sourceTree = "<group>";
};
917F560F28256DB800D19543 = {
isa = PBXGroup;
children = (
917F561A28256DB800D19543 /* Sources */,
9145A25028CCACF7001B3451 /* Resources */,
91B2EA9728CA048200A90A83 /* compound-ios */,
918854C42825941400DC2377 /* Frameworks */,
917F561928256DB800D19543 /* Products */,
479BE2D4B06E029EC43A69EA /* Pods */,
);
sourceTree = "<group>";
};
917F561928256DB800D19543 /* Products */ = {
isa = PBXGroup;
children = (
917F561828256DB800D19543 /* Compound Inspector.app */,
);
name = Products;
sourceTree = "<group>";
};
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 = "<group>";
};
918854C42825941400DC2377 /* Frameworks */ = {
isa = PBXGroup;
children = (
D2E28F45EEA9A8DE6AFB10E9 /* Pods_Compound_Inspector.framework */,
);
name = Frameworks;
sourceTree = "<group>";
};
91B2EA9A28CA05F300A90A83 /* Components */ = {
isa = PBXGroup;
children = (
917F562A28256DCD00D19543 /* ButtonsScreen.swift */,
9129740F2A864F5E004BEA88 /* ListScreen.swift */,
917F563028256DDC00D19543 /* TextFieldsScreen.swift */,
);
path = Components;
sourceTree = "<group>";
};
/* 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 */;
}

View File

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "self:">
</FileRef>
</Workspace>

View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>IDEDidComputeMac32BitWarning</key>
<true/>
</dict>
</plist>

View File

@@ -0,0 +1,14 @@
{
"pins" : [
{
"identity" : "flex",
"kind" : "remoteSourceControl",
"location" : "https://github.com/FLEXTool/FLEX",
"state" : {
"revision" : "ac50a6d36b738a15a6d3b6b51683d8a152319f59",
"version" : "4.7.0"
}
}
],
"version" : 2
}

View File

@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>FILEHEADER</key>
<string>
// Copyright ___YEAR___ New Vector Ltd
//
// SPDX-License-Identifier: AGPL-3.0-only
// Please see LICENSE in the repository root for full details.
//</string>
</dict>
</plist>

View File

@@ -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
}

View File

@@ -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

View File

@@ -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

View File

@@ -0,0 +1,14 @@
{
"images" : [
{
"filename" : "Icon.png",
"idiom" : "universal",
"platform" : "ios",
"size" : "1024x1024"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 659 KiB

View File

@@ -0,0 +1,6 @@
{
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@@ -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
}
}

View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.security.app-sandbox</key>
<true/>
</dict>
</plist>

View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>ITSAppUsesNonExemptEncryption</key>
<false/>
</dict>
</plist>

View File

@@ -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))
}
}

View File

@@ -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))
}
}

View File

@@ -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))
}
}

View File

@@ -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
}
}

View File

@@ -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()
}
}
}

View File

@@ -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<Content: View>: 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") { }
}
}
}
}

View File

@@ -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()
}
}
}

View File

@@ -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))
}
}

View File

@@ -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))
}
}

View File

@@ -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))
}
}

View File

@@ -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))
}
}

View File

@@ -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))
}
}

View File

@@ -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<CompoundIcons, Image>)] {
var icons: [(name: String, value: KeyPath<CompoundIcons, Image>)] = []
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<CompoundIcons, Image> {
icons.append((label, imageKeyPath))
} else {
print("Nope")
}
}
}
return icons
}
private subscript(checkedMirrorDescendant key: String) -> Any {
return Mirror(reflecting: self).descendant(key)!
}
}

View File

@@ -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))
}
}

View File

@@ -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))
}
}

View File

@@ -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))
}
}

View File

@@ -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))
}
}

View File

@@ -0,0 +1,11 @@
#!/bin/sh
set -e
# Build dependencies
echo "Installing CocoaPods"
brew install cocoapods
# Project dependencies
echo "Installing Pods"
pod install