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