diff --git a/nym-vpn/ios/.gitignore b/nym-vpn/ios/.gitignore new file mode 100644 index 0000000000..7b4768e4b6 --- /dev/null +++ b/nym-vpn/ios/.gitignore @@ -0,0 +1,7 @@ +.DS_Store +/.build +/Packages +/*.xcodeproj +xcuserdata/ +DerivedData/ +.swiftpm \ No newline at end of file diff --git a/nym-vpn/ios/.swiftlint.yml b/nym-vpn/ios/.swiftlint.yml index 79b36f79f6..3e9ab2a365 100644 --- a/nym-vpn/ios/.swiftlint.yml +++ b/nym-vpn/ios/.swiftlint.yml @@ -20,7 +20,6 @@ opt_in_rules: - contains_over_filter_is_empty - contains_over_first_not_nil - contains_over_range_nil_comparison - - convenience_type - discouraged_none_name - discouraged_object_literal - empty_collection_literal @@ -56,7 +55,6 @@ opt_in_rules: - multiline_literal_brackets - multiline_parameters - multiline_parameters_brackets - - no_extension_access_modifier - operator_usage_whitespace - overridden_super_call - pattern_matching_keywords @@ -126,6 +124,9 @@ line_length: multiline_parameters: allowsSingleLine: false +nesting: + type_level: 3 + private_outlet: allow_private_set: true diff --git a/nym-vpn/ios/Home/Package.swift b/nym-vpn/ios/Home/Package.swift index 062eb069ac..4490861917 100644 --- a/nym-vpn/ios/Home/Package.swift +++ b/nym-vpn/ios/Home/Package.swift @@ -6,20 +6,21 @@ import PackageDescription let package = Package( name: "Home", platforms: [ - .iOS(.v15) + .iOS(.v16) ], products: [ - // Products define the executables and libraries a package produces, making them visible to other packages. .library( name: "Home", targets: ["Home"] ) ], + dependencies: [ + .package(path: "../UIComponents") + ], targets: [ - // Targets are the basic building blocks of a package, defining a module or a test suite. - // Targets can depend on other targets in this package and products from dependencies. .target( - name: "Home" + name: "Home", + dependencies: ["UIComponents"] ), .testTarget( name: "HomeTests", diff --git a/nym-vpn/ios/Home/Sources/Home/HomeView.swift b/nym-vpn/ios/Home/Sources/Home/HomeView.swift index 2b7c313a19..a34529ef01 100644 --- a/nym-vpn/ios/Home/Sources/Home/HomeView.swift +++ b/nym-vpn/ios/Home/Sources/Home/HomeView.swift @@ -1,9 +1,28 @@ import SwiftUI +import UIComponents +import Theme public struct HomeView: View { public init() {} public var body: some View { - Text("NymVPN") + VStack { + CustomNavBar( + title: "NymVPN", + rightButtonConfig: settingsButtonConfig() + ) + Spacer() + } + .frame(maxWidth: .infinity, maxHeight: .infinity) + .background { + NymColor.background + .ignoresSafeArea() + } + } +} + +private extension HomeView { + func settingsButtonConfig() -> CustomNavBarButtonConfig { + CustomNavBarButtonConfig(type: .settingsGear) {} } } diff --git a/nym-vpn/ios/NymVPN.xcodeproj/project.pbxproj b/nym-vpn/ios/NymVPN.xcodeproj/project.pbxproj index d983c5dfd5..db8df6c21e 100644 --- a/nym-vpn/ios/NymVPN.xcodeproj/project.pbxproj +++ b/nym-vpn/ios/NymVPN.xcodeproj/project.pbxproj @@ -317,6 +317,7 @@ INFOPLIST_KEY_UILaunchScreen_Generation = YES; INFOPLIST_KEY_UISupportedInterfaceOrientations = "UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIInterfaceOrientationPortrait"; INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown"; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -349,6 +350,7 @@ INFOPLIST_KEY_UILaunchScreen_Generation = YES; INFOPLIST_KEY_UISupportedInterfaceOrientations = "UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIInterfaceOrientationPortrait"; INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown"; + IPHONEOS_DEPLOYMENT_TARGET = 16.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", diff --git a/nym-vpn/ios/NymVPN.xcodeproj/xcuserdata/Rokas.xcuserdatad/xcschemes/xcschememanagement.plist b/nym-vpn/ios/NymVPN.xcodeproj/xcuserdata/Rokas.xcuserdatad/xcschemes/xcschememanagement.plist deleted file mode 100644 index af66423eb1..0000000000 --- a/nym-vpn/ios/NymVPN.xcodeproj/xcuserdata/Rokas.xcuserdatad/xcschemes/xcschememanagement.plist +++ /dev/null @@ -1,14 +0,0 @@ - - - - - SchemeUserState - - NymVPN.xcscheme_^#shared#^_ - - orderHint - 1 - - - - diff --git a/nym-vpn/ios/NymVPN.xcworkspace/contents.xcworkspacedata b/nym-vpn/ios/NymVPN.xcworkspace/contents.xcworkspacedata index 9d63eefb4e..5932a7fff4 100644 --- a/nym-vpn/ios/NymVPN.xcworkspace/contents.xcworkspacedata +++ b/nym-vpn/ios/NymVPN.xcworkspace/contents.xcworkspacedata @@ -7,6 +7,9 @@ + + diff --git a/nym-vpn/ios/NymVPN/NymVPNApp.swift b/nym-vpn/ios/NymVPN/NymVPNApp.swift index 412b25e7f3..408d7f907a 100644 --- a/nym-vpn/ios/NymVPN/NymVPNApp.swift +++ b/nym-vpn/ios/NymVPN/NymVPNApp.swift @@ -1,11 +1,18 @@ import SwiftUI import Home +import Theme @main struct NymVPNApp: App { + init() { + ThemeConfiguration.setup() + } + var body: some Scene { WindowGroup { - HomeView() + NavigationStack { + HomeView() + } } } } diff --git a/nym-vpn/ios/Theme/Package.swift b/nym-vpn/ios/Theme/Package.swift index b61a3b2bad..0922947b42 100644 --- a/nym-vpn/ios/Theme/Package.swift +++ b/nym-vpn/ios/Theme/Package.swift @@ -6,20 +6,22 @@ import PackageDescription let package = Package( name: "Theme", platforms: [ - .iOS(.v15) + .iOS(.v16) ], products: [ - // Products define the executables and libraries a package produces, making them visible to other packages. .library( name: "Theme", targets: ["Theme"] ) ], targets: [ - // Targets are the basic building blocks of a package, defining a module or a test suite. - // Targets can depend on other targets in this package and products from dependencies. .target( - name: "Theme" + name: "Theme", + resources: [ + .copy("Resources/Fonts/Lato-Bold.ttf"), + .copy("Resources/Fonts/Lato-Regular.ttf"), + .process("Resources/Assets.xcassets") + ] ), .testTarget( name: "ThemeTests", diff --git a/nym-vpn/ios/Theme/Sources/Theme/Colors/Color+Extensions.swift b/nym-vpn/ios/Theme/Sources/Theme/Colors/Color+Extensions.swift new file mode 100644 index 0000000000..0efbd1aff9 --- /dev/null +++ b/nym-vpn/ios/Theme/Sources/Theme/Colors/Color+Extensions.swift @@ -0,0 +1,11 @@ +import SwiftUI + +extension Color { + init(_ name: String) { + guard let namedColor = UIColor(named: name, in: Bundle.module, compatibleWith: nil) + else { + fatalError("Could not load color from Theme module") + } + self.init(namedColor) + } +} diff --git a/nym-vpn/ios/Theme/Sources/Theme/Colors/NymColor.swift b/nym-vpn/ios/Theme/Sources/Theme/Colors/NymColor.swift new file mode 100644 index 0000000000..200bb9964d --- /dev/null +++ b/nym-vpn/ios/Theme/Sources/Theme/Colors/NymColor.swift @@ -0,0 +1,10 @@ +import SwiftUI + +public struct NymColor { + // MARK: - Navigation bar - + public static let navigationBarBackground = Color(.navigationBarBackground) + public static let navigationBarSettingsGear = Color(.navigationBarSettingsGear) + + // MARK: - Background + public static let background = Color(.background) +} diff --git a/nym-vpn/ios/Theme/Sources/Theme/Fonts/NymFont.swift b/nym-vpn/ios/Theme/Sources/Theme/Fonts/NymFont.swift new file mode 100644 index 0000000000..c3a937b2ad --- /dev/null +++ b/nym-vpn/ios/Theme/Sources/Theme/Fonts/NymFont.swift @@ -0,0 +1,33 @@ +import SwiftUI + +public enum NymFont { + case lato(size: CGFloat, weight: LatoWeight) + + public var font: Font { + switch self { + case let .lato(size, weight): + Font.custom("Lato-\(weight.rawValue)", size: size) + } + } +} + +// MARK: - Weights - + +extension NymFont { + public enum LatoWeight: String, CaseIterable { + case regular = "Regular" + case bold = "Bold" + } +} + +// MARK: - Register fonts - + +extension NymFont { + public static func register() { + for latoWeight in NymFont.LatoWeight.allCases { + let fontName = "Lato-\(latoWeight.rawValue)" + guard let fontURL = Bundle.module.url(forResource: fontName, withExtension: "ttf") else { continue } + CTFontManagerRegisterFontsForURL(fontURL as CFURL, .process, nil) + } + } +} diff --git a/nym-vpn/ios/Theme/Sources/Theme/Fonts/NymFontStyle.swift b/nym-vpn/ios/Theme/Sources/Theme/Fonts/NymFontStyle.swift new file mode 100644 index 0000000000..ad828607c1 --- /dev/null +++ b/nym-vpn/ios/Theme/Sources/Theme/Fonts/NymFontStyle.swift @@ -0,0 +1,6 @@ +import Foundation + +public enum NymFontStyle { + case titleLarge + case titleMedium +} diff --git a/nym-vpn/ios/Theme/Sources/Theme/Fonts/NymTextStyle.swift b/nym-vpn/ios/Theme/Sources/Theme/Fonts/NymTextStyle.swift new file mode 100644 index 0000000000..d014e3aef1 --- /dev/null +++ b/nym-vpn/ios/Theme/Sources/Theme/Fonts/NymTextStyle.swift @@ -0,0 +1,21 @@ +import SwiftUI + +public struct NymTextStyle { + let nymFont: NymFont + let lineSpacing: CGFloat + + init(nymFont: NymFont, lineSpacing: CGFloat = 0) { + self.nymFont = nymFont + self.lineSpacing = lineSpacing + } +} + +extension NymTextStyle { + public struct Title { + public struct Large { + public static var primary: NymTextStyle { + NymTextStyle(nymFont: .lato(size: 22, weight: .regular)) + } + } + } +} diff --git a/nym-vpn/ios/Theme/Sources/Theme/Fonts/NymTextStyleModifier.swift b/nym-vpn/ios/Theme/Sources/Theme/Fonts/NymTextStyleModifier.swift new file mode 100644 index 0000000000..f59009631e --- /dev/null +++ b/nym-vpn/ios/Theme/Sources/Theme/Fonts/NymTextStyleModifier.swift @@ -0,0 +1,20 @@ +import SwiftUI + +public struct NymTextStyleModifier: ViewModifier { + public let textStyle: NymTextStyle + + public init(textStyle: NymTextStyle) { + self.textStyle = textStyle + } + + public func body(content: Content) -> some View { + content + .font(textStyle.nymFont.font) + } +} + +public extension View { + func textStyle(_ textStyle: NymTextStyle) -> some View { + modifier(NymTextStyleModifier(textStyle: textStyle)) + } +} diff --git a/nym-vpn/ios/Theme/Sources/Theme/Resources/Assets.xcassets/Colors/Contents.json b/nym-vpn/ios/Theme/Sources/Theme/Resources/Assets.xcassets/Colors/Contents.json new file mode 100644 index 0000000000..73c00596a7 --- /dev/null +++ b/nym-vpn/ios/Theme/Sources/Theme/Resources/Assets.xcassets/Colors/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/nym-vpn/ios/Theme/Sources/Theme/Resources/Assets.xcassets/Colors/background.colorset/Contents.json b/nym-vpn/ios/Theme/Sources/Theme/Resources/Assets.xcassets/Colors/background.colorset/Contents.json new file mode 100644 index 0000000000..762c035d4a --- /dev/null +++ b/nym-vpn/ios/Theme/Sources/Theme/Resources/Assets.xcassets/Colors/background.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "display-p3", + "components" : { + "alpha" : "1.000", + "blue" : "0.965", + "green" : "0.957", + "red" : "0.949" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "display-p3", + "components" : { + "alpha" : "1.000", + "blue" : "0.122", + "green" : "0.106", + "red" : "0.110" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/nym-vpn/ios/Theme/Sources/Theme/Resources/Assets.xcassets/Colors/navigationBarBackground.colorset/Contents.json b/nym-vpn/ios/Theme/Sources/Theme/Resources/Assets.xcassets/Colors/navigationBarBackground.colorset/Contents.json new file mode 100644 index 0000000000..99da44bb22 --- /dev/null +++ b/nym-vpn/ios/Theme/Sources/Theme/Resources/Assets.xcassets/Colors/navigationBarBackground.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "display-p3", + "components" : { + "alpha" : "1.000", + "blue" : "1.000", + "green" : "1.000", + "red" : "1.000" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "display-p3", + "components" : { + "alpha" : "1.000", + "blue" : "0.192", + "green" : "0.157", + "red" : "0.165" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/nym-vpn/ios/Theme/Sources/Theme/Resources/Assets.xcassets/Colors/navigationBarSettingsGear.colorset/Contents.json b/nym-vpn/ios/Theme/Sources/Theme/Resources/Assets.xcassets/Colors/navigationBarSettingsGear.colorset/Contents.json new file mode 100644 index 0000000000..8ff96a549a --- /dev/null +++ b/nym-vpn/ios/Theme/Sources/Theme/Resources/Assets.xcassets/Colors/navigationBarSettingsGear.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "display-p3", + "components" : { + "alpha" : "1.000", + "blue" : "0.122", + "green" : "0.106", + "red" : "0.110" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "display-p3", + "components" : { + "alpha" : "1.000", + "blue" : "0.812", + "green" : "0.769", + "red" : "0.788" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/nym-vpn/ios/Theme/Sources/Theme/Resources/Assets.xcassets/Contents.json b/nym-vpn/ios/Theme/Sources/Theme/Resources/Assets.xcassets/Contents.json new file mode 100644 index 0000000000..73c00596a7 --- /dev/null +++ b/nym-vpn/ios/Theme/Sources/Theme/Resources/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/nym-vpn/ios/Theme/Sources/Theme/Resources/Fonts/Lato-Bold.ttf b/nym-vpn/ios/Theme/Sources/Theme/Resources/Fonts/Lato-Bold.ttf new file mode 100644 index 0000000000..016068b486 Binary files /dev/null and b/nym-vpn/ios/Theme/Sources/Theme/Resources/Fonts/Lato-Bold.ttf differ diff --git a/nym-vpn/ios/Theme/Sources/Theme/Resources/Fonts/Lato-Regular.ttf b/nym-vpn/ios/Theme/Sources/Theme/Resources/Fonts/Lato-Regular.ttf new file mode 100644 index 0000000000..bb2e8875a9 Binary files /dev/null and b/nym-vpn/ios/Theme/Sources/Theme/Resources/Fonts/Lato-Regular.ttf differ diff --git a/nym-vpn/ios/Theme/Sources/Theme/Theme.swift b/nym-vpn/ios/Theme/Sources/Theme/Theme.swift deleted file mode 100644 index 08b22b80fc..0000000000 --- a/nym-vpn/ios/Theme/Sources/Theme/Theme.swift +++ /dev/null @@ -1,2 +0,0 @@ -// The Swift Programming Language -// https://docs.swift.org/swift-book diff --git a/nym-vpn/ios/Theme/Sources/Theme/ThemeConfiguration.swift b/nym-vpn/ios/Theme/Sources/Theme/ThemeConfiguration.swift new file mode 100644 index 0000000000..68478f395e --- /dev/null +++ b/nym-vpn/ios/Theme/Sources/Theme/ThemeConfiguration.swift @@ -0,0 +1,7 @@ +import Foundation + +public struct ThemeConfiguration { + public static func setup() { + NymFont.register() + } +} diff --git a/nym-vpn/ios/UIComponents/.gitignore b/nym-vpn/ios/UIComponents/.gitignore new file mode 100644 index 0000000000..0023a53406 --- /dev/null +++ b/nym-vpn/ios/UIComponents/.gitignore @@ -0,0 +1,8 @@ +.DS_Store +/.build +/Packages +xcuserdata/ +DerivedData/ +.swiftpm/configuration/registries.json +.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata +.netrc diff --git a/nym-vpn/ios/UIComponents/Package.swift b/nym-vpn/ios/UIComponents/Package.swift new file mode 100644 index 0000000000..4ed6fdf518 --- /dev/null +++ b/nym-vpn/ios/UIComponents/Package.swift @@ -0,0 +1,35 @@ +// swift-tools-version: 5.9 +// The swift-tools-version declares the minimum version of Swift required to build this package. + +import PackageDescription + +let package = Package( + name: "UIComponents", + platforms: [ + .iOS(.v16) + ], + products: [ + .library( + name: "UIComponents", + targets: ["UIComponents"] + ) + ], + dependencies: [ + .package(path: "../Theme") + ], + targets: [ + .target( + name: "UIComponents", + dependencies: [ + "Theme" + ], + resources: [ + .process("Resources/Assets.xcassets") + ] + ), + .testTarget( + name: "UIComponentsTests", + dependencies: ["UIComponents"] + ) + ] +) diff --git a/nym-vpn/ios/UIComponents/Sources/UIComponents/Navigation/CustomNavBar.swift b/nym-vpn/ios/UIComponents/Sources/UIComponents/Navigation/CustomNavBar.swift new file mode 100644 index 0000000000..93db1fff50 --- /dev/null +++ b/nym-vpn/ios/UIComponents/Sources/UIComponents/Navigation/CustomNavBar.swift @@ -0,0 +1,49 @@ +import SwiftUI +import Theme + +public struct CustomNavBar: View { + public let title: String + public let leftButtonConfig: CustomNavBarButtonConfig? + public let rightButtonConfig: CustomNavBarButtonConfig? + + public init( + title: String, + leftButtonConfig: CustomNavBarButtonConfig? = nil, + rightButtonConfig: CustomNavBarButtonConfig? = nil + ) { + self.title = title + self.leftButtonConfig = leftButtonConfig + self.rightButtonConfig = rightButtonConfig + } + + public var body: some View { + HStack { + button(with: leftButtonConfig) + Spacer() + Text(title) + .textStyle(.Title.Large.primary) + Spacer() + button(with: rightButtonConfig) + } + .frame(height: 64) + .background { + NymColor.navigationBarBackground + .ignoresSafeArea() + } + } +} + +private extension CustomNavBar { + @ViewBuilder + func button(with config: CustomNavBarButtonConfig?) -> some View { + Button { + config?.action?() + } label: { + if let type = config?.type { + Image(type.imageName) + .tint(NymColor.navigationBarSettingsGear) + } + } + .frame(width: 48, height: 48) + } +} diff --git a/nym-vpn/ios/UIComponents/Sources/UIComponents/Navigation/CustomNavBarButtonConfig.swift b/nym-vpn/ios/UIComponents/Sources/UIComponents/Navigation/CustomNavBarButtonConfig.swift new file mode 100644 index 0000000000..4a9dc1278c --- /dev/null +++ b/nym-vpn/ios/UIComponents/Sources/UIComponents/Navigation/CustomNavBarButtonConfig.swift @@ -0,0 +1,17 @@ +public struct CustomNavBarButtonConfig { + public enum ButtonType: String { + case settingsGear + + var imageName: String { + self.rawValue + } + } + + public init(type: ButtonType? = nil, action: (() -> Void)?) { + self.type = type + self.action = action + } + + public let type: ButtonType? + public let action: (() -> Void)? +} diff --git a/nym-vpn/ios/UIComponents/Sources/UIComponents/Resources/Assets.xcassets/Contents.json b/nym-vpn/ios/UIComponents/Sources/UIComponents/Resources/Assets.xcassets/Contents.json new file mode 100644 index 0000000000..73c00596a7 --- /dev/null +++ b/nym-vpn/ios/UIComponents/Sources/UIComponents/Resources/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/nym-vpn/ios/UIComponents/Sources/UIComponents/Resources/Assets.xcassets/Icons/Contents.json b/nym-vpn/ios/UIComponents/Sources/UIComponents/Resources/Assets.xcassets/Icons/Contents.json new file mode 100644 index 0000000000..73c00596a7 --- /dev/null +++ b/nym-vpn/ios/UIComponents/Sources/UIComponents/Resources/Assets.xcassets/Icons/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/nym-vpn/ios/UIComponents/Sources/UIComponents/Resources/Assets.xcassets/Icons/settingsGear.imageset/Contents.json b/nym-vpn/ios/UIComponents/Sources/UIComponents/Resources/Assets.xcassets/Icons/settingsGear.imageset/Contents.json new file mode 100644 index 0000000000..9ad81c9a88 --- /dev/null +++ b/nym-vpn/ios/UIComponents/Sources/UIComponents/Resources/Assets.xcassets/Icons/settingsGear.imageset/Contents.json @@ -0,0 +1,16 @@ +{ + "images" : [ + { + "filename" : "settings_24px.svg", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true, + "template-rendering-intent" : "template" + } +} diff --git a/nym-vpn/ios/UIComponents/Sources/UIComponents/Resources/Assets.xcassets/Icons/settingsGear.imageset/settings_24px.svg b/nym-vpn/ios/UIComponents/Sources/UIComponents/Resources/Assets.xcassets/Icons/settingsGear.imageset/settings_24px.svg new file mode 100644 index 0000000000..9f8b7a06c9 --- /dev/null +++ b/nym-vpn/ios/UIComponents/Sources/UIComponents/Resources/Assets.xcassets/Icons/settingsGear.imageset/settings_24px.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/nym-vpn/ios/UIComponents/Tests/UIComponentsTests/UIComponentsTests.swift b/nym-vpn/ios/UIComponents/Tests/UIComponentsTests/UIComponentsTests.swift new file mode 100644 index 0000000000..ef1cd66825 --- /dev/null +++ b/nym-vpn/ios/UIComponents/Tests/UIComponentsTests/UIComponentsTests.swift @@ -0,0 +1,4 @@ +import XCTest +@testable import UIComponents + +final class UIComponentsTests: XCTestCase {}