diff --git a/.DS_Store b/.DS_Store
deleted file mode 100644
index 711859e..0000000
Binary files a/.DS_Store and /dev/null differ
diff --git a/.gitignore b/.gitignore
index 52fe2f7..66e9708 100644
--- a/.gitignore
+++ b/.gitignore
@@ -60,3 +60,11 @@ fastlane/report.xml
fastlane/Preview.html
fastlane/screenshots/**/*.png
fastlane/test_output
+
+### Projects ###
+*.xcodeproj
+*.xcworkspace
+### Tuist derived files ###
+graph.dot
+Derived/
+.DS_Store
diff --git a/.package.resolved b/.package.resolved
new file mode 100644
index 0000000..c7d61f0
--- /dev/null
+++ b/.package.resolved
@@ -0,0 +1,33 @@
+{
+ "originHash" : "9d2c391dc946ad5b30f17826ffdc1e8790a14b5f4064662b59cfbbb44d2be204",
+ "pins" : [
+ {
+ "identity" : "r.swift",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/mac-cain13/R.swift.git",
+ "state" : {
+ "revision" : "a9abc6b0afe0fc4a5a71e1d7d2872143dff2d2f1",
+ "version" : "7.8.0"
+ }
+ },
+ {
+ "identity" : "swift-argument-parser",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/apple/swift-argument-parser",
+ "state" : {
+ "revision" : "626b5b7b2f45e1b0b1c6f4a309296d1d21d7311b",
+ "version" : "1.7.1"
+ }
+ },
+ {
+ "identity" : "xcodeedit",
+ "kind" : "remoteSourceControl",
+ "location" : "https://github.com/tomlokhorst/XcodeEdit",
+ "state" : {
+ "revision" : "0e550cdee72844b35431afc3a1e176042be6d0f0",
+ "version" : "2.13.0"
+ }
+ }
+ ],
+ "version" : 3
+}
diff --git a/API/.gitignore b/API/.gitignore
deleted file mode 100644
index 3b29812..0000000
--- a/API/.gitignore
+++ /dev/null
@@ -1,9 +0,0 @@
-.DS_Store
-/.build
-/Packages
-/*.xcodeproj
-xcuserdata/
-DerivedData/
-.swiftpm/config/registries.json
-.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata
-.netrc
diff --git a/API/.swiftpm/xcode/package.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/API/.swiftpm/xcode/package.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
deleted file mode 100644
index 18d9810..0000000
--- a/API/.swiftpm/xcode/package.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
- IDEDidComputeMac32BitWarning
-
-
-
diff --git a/API/Package.swift b/API/Package.swift
deleted file mode 100644
index 501fdd2..0000000
--- a/API/Package.swift
+++ /dev/null
@@ -1,30 +0,0 @@
-// swift-tools-version: 5.7
-// The swift-tools-version declares the minimum version of Swift required to build this package.
-
-import PackageDescription
-
-let package = Package(
- name: "API",
- platforms: [
- .iOS(.v16),
- ],
- products: [
- // Products define the executables and libraries a package produces, and make them visible to other packages.
- .library(
- name: "API",
- targets: ["API"]
- ),
- ],
- dependencies: [
- // Dependencies declare other packages that this package depends on.
- .package(url: "https://github.com/Maks-Jago/SwiftFoundation.git", from: "0.3.5"),
- ],
- targets: [
- // Targets are the basic building blocks of a package. A target can define a module or a test suite.
- // Targets can depend on other targets in this package, and on products in packages this package depends on.
- .target(
- name: "API",
- dependencies: [.byName(name: "SwiftFoundation")]
- ),
- ]
-)
diff --git a/API/README.md b/API/README.md
deleted file mode 100644
index 8415142..0000000
--- a/API/README.md
+++ /dev/null
@@ -1,3 +0,0 @@
-# API
-
-A description of this package.
diff --git a/API/Sources/API/AuthAPIClient.swift b/Core/API/Sources/API/AuthAPIClient.swift
similarity index 100%
rename from API/Sources/API/AuthAPIClient.swift
rename to Core/API/Sources/API/AuthAPIClient.swift
diff --git a/API/Sources/API/BaseAPI.swift b/Core/API/Sources/API/BaseAPI.swift
similarity index 98%
rename from API/Sources/API/BaseAPI.swift
rename to Core/API/Sources/API/BaseAPI.swift
index b5689ec..f042a2f 100644
--- a/API/Sources/API/BaseAPI.swift
+++ b/Core/API/Sources/API/BaseAPI.swift
@@ -10,7 +10,7 @@ import Foundation
import SwiftFoundation
let kBaseURLPath: String = "https://api.themoviedb.org/3"
-public let kTMDBApiKey = ""
+public let kTMDBApiKey = ""
let kURLTimeoutInterval: TimeInterval = 10
let kRequestHeaders: [String: String] = [
diff --git a/API/Sources/API/Errors/ServerError.swift b/Core/API/Sources/API/Errors/ServerError.swift
similarity index 100%
rename from API/Sources/API/Errors/ServerError.swift
rename to Core/API/Sources/API/Errors/ServerError.swift
diff --git a/API/Sources/API/Extensions/URLRequest+UnwrapContainer.swift b/Core/API/Sources/API/Extensions/URLRequest+UnwrapContainer.swift
similarity index 100%
rename from API/Sources/API/Extensions/URLRequest+UnwrapContainer.swift
rename to Core/API/Sources/API/Extensions/URLRequest+UnwrapContainer.swift
diff --git a/API/Sources/API/Extensions/URLRequest.swift b/Core/API/Sources/API/Extensions/URLRequest.swift
similarity index 100%
rename from API/Sources/API/Extensions/URLRequest.swift
rename to Core/API/Sources/API/Extensions/URLRequest.swift
diff --git a/API/Sources/API/Extensions/URLSession.swift b/Core/API/Sources/API/Extensions/URLSession.swift
similarity index 100%
rename from API/Sources/API/Extensions/URLSession.swift
rename to Core/API/Sources/API/Extensions/URLSession.swift
diff --git a/API/Sources/API/HomeAPIClient.swift b/Core/API/Sources/API/HomeAPIClient.swift
similarity index 100%
rename from API/Sources/API/HomeAPIClient.swift
rename to Core/API/Sources/API/HomeAPIClient.swift
diff --git a/API/Sources/API/ImageConfigsAPIClient.swift b/Core/API/Sources/API/ImageConfigsAPIClient.swift
similarity index 100%
rename from API/Sources/API/ImageConfigsAPIClient.swift
rename to Core/API/Sources/API/ImageConfigsAPIClient.swift
diff --git a/API/Sources/API/ItemDetailsAPIClient.swift b/Core/API/Sources/API/ItemDetailsAPIClient.swift
similarity index 100%
rename from API/Sources/API/ItemDetailsAPIClient.swift
rename to Core/API/Sources/API/ItemDetailsAPIClient.swift
diff --git a/API/Sources/API/Models/AuthorRemote.swift b/Core/API/Sources/API/Models/AuthorRemote.swift
similarity index 100%
rename from API/Sources/API/Models/AuthorRemote.swift
rename to Core/API/Sources/API/Models/AuthorRemote.swift
diff --git a/API/Sources/API/Models/CastRemote.swift b/Core/API/Sources/API/Models/CastRemote.swift
similarity index 100%
rename from API/Sources/API/Models/CastRemote.swift
rename to Core/API/Sources/API/Models/CastRemote.swift
diff --git a/API/Sources/API/Models/GenreRemote.swift b/Core/API/Sources/API/Models/GenreRemote.swift
similarity index 100%
rename from API/Sources/API/Models/GenreRemote.swift
rename to Core/API/Sources/API/Models/GenreRemote.swift
diff --git a/API/Sources/API/Models/GuestSessionResponse.swift b/Core/API/Sources/API/Models/GuestSessionResponse.swift
similarity index 100%
rename from API/Sources/API/Models/GuestSessionResponse.swift
rename to Core/API/Sources/API/Models/GuestSessionResponse.swift
diff --git a/API/Sources/API/Models/ImageConfigsRemote.swift b/Core/API/Sources/API/Models/ImageConfigsRemote.swift
similarity index 100%
rename from API/Sources/API/Models/ImageConfigsRemote.swift
rename to Core/API/Sources/API/Models/ImageConfigsRemote.swift
diff --git a/API/Sources/API/Models/ItemsResponse.swift b/Core/API/Sources/API/Models/ItemsResponse.swift
similarity index 100%
rename from API/Sources/API/Models/ItemsResponse.swift
rename to Core/API/Sources/API/Models/ItemsResponse.swift
diff --git a/API/Sources/API/Models/LossyCodableList.swift b/Core/API/Sources/API/Models/LossyCodableList.swift
similarity index 100%
rename from API/Sources/API/Models/LossyCodableList.swift
rename to Core/API/Sources/API/Models/LossyCodableList.swift
diff --git a/API/Sources/API/Models/MovieRemote.swift b/Core/API/Sources/API/Models/MovieRemote.swift
similarity index 100%
rename from API/Sources/API/Models/MovieRemote.swift
rename to Core/API/Sources/API/Models/MovieRemote.swift
diff --git a/API/Sources/API/Models/NetworkRemote.swift b/Core/API/Sources/API/Models/NetworkRemote.swift
similarity index 100%
rename from API/Sources/API/Models/NetworkRemote.swift
rename to Core/API/Sources/API/Models/NetworkRemote.swift
diff --git a/API/Sources/API/Models/RequestTokenResponse.swift b/Core/API/Sources/API/Models/RequestTokenResponse.swift
similarity index 100%
rename from API/Sources/API/Models/RequestTokenResponse.swift
rename to Core/API/Sources/API/Models/RequestTokenResponse.swift
diff --git a/API/Sources/API/Models/ReviewRemote.swift b/Core/API/Sources/API/Models/ReviewRemote.swift
similarity index 100%
rename from API/Sources/API/Models/ReviewRemote.swift
rename to Core/API/Sources/API/Models/ReviewRemote.swift
diff --git a/API/Sources/API/Models/SearchItemRemote.swift b/Core/API/Sources/API/Models/SearchItemRemote.swift
similarity index 100%
rename from API/Sources/API/Models/SearchItemRemote.swift
rename to Core/API/Sources/API/Models/SearchItemRemote.swift
diff --git a/API/Sources/API/Models/SessionResponse.swift b/Core/API/Sources/API/Models/SessionResponse.swift
similarity index 100%
rename from API/Sources/API/Models/SessionResponse.swift
rename to Core/API/Sources/API/Models/SessionResponse.swift
diff --git a/API/Sources/API/Models/ShowRemote.swift b/Core/API/Sources/API/Models/ShowRemote.swift
similarity index 100%
rename from API/Sources/API/Models/ShowRemote.swift
rename to Core/API/Sources/API/Models/ShowRemote.swift
diff --git a/API/Sources/API/SearchAPIClient.swift b/Core/API/Sources/API/SearchAPIClient.swift
similarity index 100%
rename from API/Sources/API/SearchAPIClient.swift
rename to Core/API/Sources/API/SearchAPIClient.swift
diff --git a/Core/Common/Sources/Common.swift b/Core/Common/Sources/Common.swift
new file mode 100644
index 0000000..1865c41
--- /dev/null
+++ b/Core/Common/Sources/Common.swift
@@ -0,0 +1,42 @@
+//
+// Common.swift
+// Flick
+//
+// Created by Alexander Sharko on 20.01.2023.
+// Copyright © 2023 urlaunched.com. All rights reserved.
+//
+
+import SwiftUI
+
+// MARK: - Typealiases
+
+public typealias Minutes = Int
+
+// MARK: - Constants
+
+public let kPerPage: Int = 20
+
+// MARK: - AppLink
+
+public enum AppLink: String, Identifiable {
+ case aboutUs = "https://www.themoviedb.org/about"
+ case tmdbAPI = "https://developer.themoviedb.org/docs/getting-started"
+ case privacyPolicy = "https://www.themoviedb.org/privacy-policy"
+
+ public var id: Self { self }
+ public var urlValue: URL { URL(string: rawValue)! }
+}
+
+// MARK: - Helpers
+
+public func areEqual(_ lhs: Lhs, _ rhs: some Equatable) -> Bool {
+ guard let rhsAs = rhs as? Lhs else {
+ return false
+ }
+
+ return lhs == rhsAs
+}
+
+public enum ImageType {
+ case backdrop, logo, poster, profile, still
+}
diff --git a/Flick/Code/Common/CustomViews/PrimaryButton.swift b/Core/Common/Sources/CustomView/PrimaryButton.swift
similarity index 59%
rename from Flick/Code/Common/CustomViews/PrimaryButton.swift
rename to Core/Common/Sources/CustomView/PrimaryButton.swift
index 4ec8f19..5c4c8f1 100644
--- a/Flick/Code/Common/CustomViews/PrimaryButton.swift
+++ b/Core/Common/Sources/CustomView/PrimaryButton.swift
@@ -2,18 +2,23 @@
// PrimaryButton.swift
// Flick
//
-// Created by Alexander Sharko on 18.11.2022.
-// Copyright © 2022 urlaunched.com. All rights reserved.
+// Created by Bogdan Petkanych on 06.05.2026.
+// Copyright © 2026 urlaunched. All rights reserved.
//
import DesignSystem
import SwiftUI
-struct PrimaryButton: View {
+public struct PrimaryButton: View {
var title: String
var action: () -> Void
+
+ public init(title: String, action: @escaping () -> Void) {
+ self.title = title
+ self.action = action
+ }
- var body: some View {
+ public var body: some View {
Button(action: action) {
Text(title)
.customFont(.title3)
diff --git a/Core/Common/Sources/DropdownItem.swift b/Core/Common/Sources/DropdownItem.swift
new file mode 100644
index 0000000..442e6f5
--- /dev/null
+++ b/Core/Common/Sources/DropdownItem.swift
@@ -0,0 +1,18 @@
+//
+// DropDownItem.swift
+// Flick
+//
+// Created by Bogdan Petkanych on 14.05.2026.
+// Copyright © 2026 urlaunched. All rights reserved.
+//
+import UIKit
+
+public struct DropdownItem {
+ public var title: String
+ public var image: UIImage
+
+ public init(title: String, image: UIImage) {
+ self.title = title
+ self.image = image
+ }
+}
diff --git a/Flick/Code/Common/Enums/ItemSizeStyle.swift b/Core/Common/Sources/Enums/ItemSizeStyle.swift
similarity index 76%
rename from Flick/Code/Common/Enums/ItemSizeStyle.swift
rename to Core/Common/Sources/Enums/ItemSizeStyle.swift
index bd18ab0..4a2e0c0 100644
--- a/Flick/Code/Common/Enums/ItemSizeStyle.swift
+++ b/Core/Common/Sources/Enums/ItemSizeStyle.swift
@@ -8,14 +8,14 @@
import CoreFoundation
-enum ItemSizeStyle {
+public enum ItemSizeStyle {
case `default`, main
- var coverSize: CGSize {
+ public var coverSize: CGSize {
switch self {
case .main: return .init(width: 202, height: 283)
case .default: return .init(width: 135, height: 189)
}
}
- var isMain: Bool { self == .main }
+ public var isMain: Bool { self == .main }
}
diff --git a/Flick/Code/Common/Enums/TabBarItem.swift b/Core/Common/Sources/Enums/TabBarItem.swift
similarity index 71%
rename from Flick/Code/Common/Enums/TabBarItem.swift
rename to Core/Common/Sources/Enums/TabBarItem.swift
index 00d911f..b21df50 100644
--- a/Flick/Code/Common/Enums/TabBarItem.swift
+++ b/Core/Common/Sources/Enums/TabBarItem.swift
@@ -8,8 +8,8 @@
import Foundation
-enum TabBarItem: String, Hashable, CaseIterable {
+public enum TabBarItem: String, Hashable, CaseIterable {
case home, search, randomizer, favorites, profile
- var id: Self { self }
+ public var id: Self { self }
}
diff --git a/Flick/Code/Common/Extensions/Foundation/Array.swift b/Core/Common/Sources/Extensions/Foundation/Array.swift
similarity index 94%
rename from Flick/Code/Common/Extensions/Foundation/Array.swift
rename to Core/Common/Sources/Extensions/Foundation/Array.swift
index 5782b5d..aadf6c8 100644
--- a/Flick/Code/Common/Extensions/Foundation/Array.swift
+++ b/Core/Common/Sources/Extensions/Foundation/Array.swift
@@ -8,7 +8,7 @@
import Foundation
-extension Array {
+public extension Array {
subscript(safe range: Range) -> ArraySlice? {
if range.endIndex > endIndex {
if range.startIndex >= endIndex {
diff --git a/Flick/Code/Common/Extensions/Foundation/Collection.swift b/Core/Common/Sources/Extensions/Foundation/Collection.swift
similarity index 69%
rename from Flick/Code/Common/Extensions/Foundation/Collection.swift
rename to Core/Common/Sources/Extensions/Foundation/Collection.swift
index eb01e74..84c4f6f 100644
--- a/Flick/Code/Common/Extensions/Foundation/Collection.swift
+++ b/Core/Common/Sources/Extensions/Foundation/Collection.swift
@@ -8,8 +8,4 @@
import Foundation
-extension Collection {
- var isNotEmpty: Bool {
- !isEmpty
- }
-}
+// REMOVE
diff --git a/Flick/Code/Common/Extensions/Foundation/Date.swift b/Core/Common/Sources/Extensions/Foundation/Date.swift
similarity index 94%
rename from Flick/Code/Common/Extensions/Foundation/Date.swift
rename to Core/Common/Sources/Extensions/Foundation/Date.swift
index 7104106..d1423bf 100644
--- a/Flick/Code/Common/Extensions/Foundation/Date.swift
+++ b/Core/Common/Sources/Extensions/Foundation/Date.swift
@@ -8,7 +8,7 @@
import Foundation
-extension Date {
+public extension Date {
static var testItem = Date(timeIntervalSince1970: 0)
var asShortDateString: String {
diff --git a/Flick/Code/Common/Extensions/Foundation/DateFormatter.swift b/Core/Common/Sources/Extensions/Foundation/DateFormatter.swift
similarity index 93%
rename from Flick/Code/Common/Extensions/Foundation/DateFormatter.swift
rename to Core/Common/Sources/Extensions/Foundation/DateFormatter.swift
index c38fc77..35619a5 100644
--- a/Flick/Code/Common/Extensions/Foundation/DateFormatter.swift
+++ b/Core/Common/Sources/Extensions/Foundation/DateFormatter.swift
@@ -8,7 +8,7 @@
import Foundation
-extension DateFormatter {
+public extension DateFormatter {
static var customIso8601ShortFromServer: DateFormatter = {
let formatter = DateFormatter()
formatter.dateFormat = "yyyy-MM-dd"
diff --git a/Flick/Code/Common/Extensions/Foundation/Int.swift b/Core/Common/Sources/Extensions/Foundation/Int.swift
similarity index 94%
rename from Flick/Code/Common/Extensions/Foundation/Int.swift
rename to Core/Common/Sources/Extensions/Foundation/Int.swift
index 768dc80..0684c58 100644
--- a/Flick/Code/Common/Extensions/Foundation/Int.swift
+++ b/Core/Common/Sources/Extensions/Foundation/Int.swift
@@ -8,7 +8,7 @@
import Foundation
-extension Int {
+public extension Int {
var asAmountOfMoney: String {
guard let amountOfMoney = NumberFormatter.amountOfMoney.string(from: NSNumber(value: self)), self > 0 else {
return "-"
diff --git a/Flick/Code/Common/Extensions/Foundation/NumberFormatter.swift b/Core/Common/Sources/Extensions/Foundation/NumberFormatter.swift
similarity index 91%
rename from Flick/Code/Common/Extensions/Foundation/NumberFormatter.swift
rename to Core/Common/Sources/Extensions/Foundation/NumberFormatter.swift
index 1d0db04..e588731 100644
--- a/Flick/Code/Common/Extensions/Foundation/NumberFormatter.swift
+++ b/Core/Common/Sources/Extensions/Foundation/NumberFormatter.swift
@@ -8,7 +8,7 @@
import Foundation
-extension NumberFormatter {
+public extension NumberFormatter {
static var amountOfMoney: NumberFormatter = {
let formatter = NumberFormatter()
formatter.numberStyle = .decimal
diff --git a/Flick/Code/Common/Extensions/Foundation/UIApplication+.swift b/Core/Common/Sources/Extensions/Foundation/UIApplication+.swift
similarity index 93%
rename from Flick/Code/Common/Extensions/Foundation/UIApplication+.swift
rename to Core/Common/Sources/Extensions/Foundation/UIApplication+.swift
index 861d604..c9aae9b 100644
--- a/Flick/Code/Common/Extensions/Foundation/UIApplication+.swift
+++ b/Core/Common/Sources/Extensions/Foundation/UIApplication+.swift
@@ -9,7 +9,7 @@
import StoreKit
import UIKit
-extension UIApplication {
+public extension UIApplication {
func requestReview() {
DispatchQueue.main.async {
if let scene = self.connectedScenes.first(where: { $0.activationState == .foregroundActive }) as? UIWindowScene {
diff --git a/Flick/Code/Common/Extensions/NWPathMonitor+Publisher.swift b/Core/Common/Sources/Extensions/NWPathMonitor+Publisher.swift
similarity index 81%
rename from Flick/Code/Common/Extensions/NWPathMonitor+Publisher.swift
rename to Core/Common/Sources/Extensions/NWPathMonitor+Publisher.swift
index dd13be9..a3cd7e3 100644
--- a/Flick/Code/Common/Extensions/NWPathMonitor+Publisher.swift
+++ b/Core/Common/Sources/Extensions/NWPathMonitor+Publisher.swift
@@ -10,13 +10,13 @@ import Combine
import Foundation
import Network
-extension NWPathMonitor {
+public extension NWPathMonitor {
final class NetworkStatusSubscription: Subscription where S.Input == NWPath.Status {
private let subscriber: S?
private let monitor: NWPathMonitor
private let queue: DispatchQueue
- init(
+ public init(
subscriber: S,
monitor: NWPathMonitor,
queue: DispatchQueue
@@ -26,7 +26,7 @@ extension NWPathMonitor {
self.queue = queue
}
- func request(_: Subscribers.Demand) {
+ public func request(_: Subscribers.Demand) {
monitor.pathUpdateHandler = { [weak self] path in
_ = self?.subscriber?.receive(path.status)
}
@@ -34,7 +34,7 @@ extension NWPathMonitor {
monitor.start(queue: queue)
}
- func cancel() {
+ public func cancel() {
monitor.cancel()
}
}
@@ -42,10 +42,10 @@ extension NWPathMonitor {
// MARK: - NWPathMonitor Publisher
-extension NWPathMonitor {
+public extension NWPathMonitor {
struct NetworkStatusPublisher: Publisher {
- typealias Output = NWPath.Status
- typealias Failure = Never
+ public typealias Output = NWPath.Status
+ public typealias Failure = Never
private let monitor: NWPathMonitor
private let queue: DispatchQueue
@@ -55,7 +55,7 @@ extension NWPathMonitor {
self.queue = queue
}
- func receive(subscriber: S) where S: Subscriber, Never == S.Failure, NWPath.Status == S.Input {
+ public func receive(subscriber: S) where S: Subscriber, Never == S.Failure, NWPath.Status == S.Input {
let subscription = NetworkStatusSubscription(
subscriber: subscriber,
monitor: monitor,
diff --git a/Flick/Code/Common/Extensions/UI/View+RedactedMode.swift b/Core/Common/Sources/Extensions/UI/View+RedactedMode.swift
similarity index 83%
rename from Flick/Code/Common/Extensions/UI/View+RedactedMode.swift
rename to Core/Common/Sources/Extensions/UI/View+RedactedMode.swift
index c93781c..6be9eab 100644
--- a/Flick/Code/Common/Extensions/UI/View+RedactedMode.swift
+++ b/Core/Common/Sources/Extensions/UI/View+RedactedMode.swift
@@ -10,7 +10,7 @@ import DesignSystem
import SwiftUI
import SwiftUI_Kit
-extension View {
+public extension View {
func animatedRedacted(_ isActive: Bool) -> some View {
modifier(
AnimatedRedactedModifier(
@@ -26,18 +26,18 @@ extension View {
}
}
-struct IsRedactedKey: EnvironmentKey {
- static let defaultValue = false
+public struct IsRedactedKey: EnvironmentKey {
+ public static let defaultValue = false
}
-extension EnvironmentValues {
+public extension EnvironmentValues {
var isRedacted: Bool {
get { self[IsRedactedKey.self] }
set { self[IsRedactedKey.self] = newValue }
}
}
-extension View {
+public extension View {
func isRedacted(_ isRedacted: Bool) -> some View {
environment(\.isRedacted, isRedacted)
}
diff --git a/Flick/Code/Common/Extensions/UI/View+WidthKey.swift b/Core/Common/Sources/Extensions/UI/View+WidthKey.swift
similarity index 88%
rename from Flick/Code/Common/Extensions/UI/View+WidthKey.swift
rename to Core/Common/Sources/Extensions/UI/View+WidthKey.swift
index 16ade64..e61c8b9 100644
--- a/Flick/Code/Common/Extensions/UI/View+WidthKey.swift
+++ b/Core/Common/Sources/Extensions/UI/View+WidthKey.swift
@@ -8,7 +8,7 @@
import SwiftUI
-extension View {
+public extension View {
func width(_ width: CGFloat) -> some View {
environment(\.width, width)
}
@@ -18,7 +18,7 @@ private struct WidthKey: EnvironmentKey {
static let defaultValue: CGFloat = 0
}
-extension EnvironmentValues {
+public extension EnvironmentValues {
var width: CGFloat {
get { self[WidthKey.self] }
set { self[WidthKey.self] = newValue }
diff --git a/Flick/Code/Common/Extensions/UI/View.swift b/Core/Common/Sources/Extensions/UI/View.swift
similarity index 95%
rename from Flick/Code/Common/Extensions/UI/View.swift
rename to Core/Common/Sources/Extensions/UI/View.swift
index f2c9d3d..8ac59b3 100644
--- a/Flick/Code/Common/Extensions/UI/View.swift
+++ b/Core/Common/Sources/Extensions/UI/View.swift
@@ -10,7 +10,7 @@ import SwiftUI
import SwiftUI_Kit
import UDF
-extension View {
+public extension View {
func customNavigationTitle(_ title: String) -> some View {
toolbar {
ToolbarItem(placement: .principal) {
diff --git a/Core/Common/Sources/MockRouter.swift b/Core/Common/Sources/MockRouter.swift
new file mode 100644
index 0000000..206aadf
--- /dev/null
+++ b/Core/Common/Sources/MockRouter.swift
@@ -0,0 +1,17 @@
+//
+// MockRouter.swift
+// Flick
+//
+// Created by Bogdan Petkanych on 14.05.2026.
+// Copyright © 2026 urlaunched. All rights reserved.
+//
+import UDF
+import SwiftUI
+
+public struct MockRouter: Routing {
+ public init() {}
+
+ public func view(for route: Route) -> some View {
+ return EmptyView()
+ }
+}
diff --git a/Flick/Code/Common/Presenters/TabBarItemPresenter.swift b/Core/Common/Sources/Presenters/TabBarItemPresenter.swift
similarity index 82%
rename from Flick/Code/Common/Presenters/TabBarItemPresenter.swift
rename to Core/Common/Sources/Presenters/TabBarItemPresenter.swift
index 3df268e..5a9a826 100644
--- a/Flick/Code/Common/Presenters/TabBarItemPresenter.swift
+++ b/Core/Common/Sources/Presenters/TabBarItemPresenter.swift
@@ -8,16 +8,16 @@
import SwiftUI
-struct TabBarItemPresenter {
+public struct TabBarItemPresenter {
private let tabBarItem: TabBarItem
private let isSelected: Bool
- init(item: TabBarItem, isSelected: Bool) {
+ public init(item: TabBarItem, isSelected: Bool) {
tabBarItem = item
self.isSelected = isSelected
}
- var image: Image {
+ public var image: Image {
switch tabBarItem {
case .home:
isSelected ? .videoPlayFill : .videoPlay
@@ -32,7 +32,7 @@ struct TabBarItemPresenter {
}
}
- var foregroundColor: Color {
+ public var foregroundColor: Color {
isSelected ? .flMainPink : .flPink60
}
}
diff --git a/Flick/Code/Common/PropertyWrappers/StorageKey.swift b/Core/Common/Sources/PropertyWrappers/StorageKey.swift
similarity index 86%
rename from Flick/Code/Common/PropertyWrappers/StorageKey.swift
rename to Core/Common/Sources/PropertyWrappers/StorageKey.swift
index 85fec24..836ddc8 100644
--- a/Flick/Code/Common/PropertyWrappers/StorageKey.swift
+++ b/Core/Common/Sources/PropertyWrappers/StorageKey.swift
@@ -8,6 +8,6 @@
import Foundation
-enum StorageKey: String {
+public enum StorageKey: String {
case isNeedToPresentOnboarding
}
diff --git a/Core/Common/Sources/RouteDestinationBuilder.swift b/Core/Common/Sources/RouteDestinationBuilder.swift
new file mode 100644
index 0000000..c20b7aa
--- /dev/null
+++ b/Core/Common/Sources/RouteDestinationBuilder.swift
@@ -0,0 +1,27 @@
+//
+// RouteDestinationBuilder.swift
+// Flick
+//
+// Created by Bogdan Petkanych on 14.05.2026.
+// Copyright © 2026 urlaunched. All rights reserved.
+//
+
+import SwiftUI
+import UDF
+
+public struct DestinationBuilder {
+ private var destination: (Value) -> any View
+
+ public init() {
+ self.destination = { _ in EmptyView() }
+ }
+
+ public init(@ViewBuilder destination: @escaping (Value) -> any View) {
+ self.destination = destination
+ }
+
+ @ViewBuilder
+ public func view(for value: Value) -> some View {
+ AnyView(destination(value))
+ }
+}
diff --git a/Flick/Code/Common/Services/StickyScrollService.swift b/Core/Common/Sources/Services/StickyScrollService.swift
similarity index 61%
rename from Flick/Code/Common/Services/StickyScrollService.swift
rename to Core/Common/Sources/Services/StickyScrollService.swift
index a6dc0f4..eb3c19b 100644
--- a/Flick/Code/Common/Services/StickyScrollService.swift
+++ b/Core/Common/Sources/Services/StickyScrollService.swift
@@ -10,18 +10,16 @@ import Combine
import Foundation
import SwiftUI
-final class StickyScrollService: NSObject {
- let currentValueSubject = PassthroughSubject()
-}
-
-extension StickyScrollService: StickyScrollProtocol {
- func updateIndex(_ index: Int) {
+public final class StickyScrollService: NSObject, StickyScrollProtocol {
+ public let currentValueSubject = PassthroughSubject()
+
+ public func updateIndex(_ index: Int) {
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
self.currentValueSubject.send(index)
}
}
}
-protocol StickyScrollProtocol {
+public protocol StickyScrollProtocol {
func updateIndex(_ index: Int)
}
diff --git a/Flick/Code/Common/CustomViews/CastCardView.swift b/Core/CustomViews/Sources/CastCardView.swift
similarity index 70%
rename from Flick/Code/Common/CustomViews/CastCardView.swift
rename to Core/CustomViews/Sources/CastCardView.swift
index 29a3387..0360082 100644
--- a/Flick/Code/Common/CustomViews/CastCardView.swift
+++ b/Core/CustomViews/Sources/CastCardView.swift
@@ -7,22 +7,32 @@
//
import SwiftUI
+import Models
-struct CastCardView: View {
+public struct CastCardView: View {
@Environment(\.isRedacted) var isRedacted
let cast: Cast
let size: CGSize
var lineLimit: Int = 2
+ var imageView: () -> IV
+
+ public init(
+ cast: Cast,
+ size: CGSize,
+ @ViewBuilder imageView: @escaping () -> IV,
+ lineLimit: Int = 2
+ ) {
+ self.cast = cast
+ self.size = size
+ self.lineLimit = lineLimit
+ self.imageView = imageView
+ }
- var body: some View {
+ public var body: some View {
VStack(spacing: 12) {
Group {
if let profilePath = cast.profilePath {
- ImageContainer(
- size: size,
- path: profilePath,
- type: .profile
- )
+ imageView()
} else {
Color
.flSecondary
@@ -54,6 +64,7 @@ struct CastCardView: View {
#Preview {
CastCardView(
cast: .fakeItem(),
- size: .init(width: 104, height: 129)
+ size: .init(width: 104, height: 129),
+ imageView: { EmptyView() }
)
}
diff --git a/Flick/Code/Common/CustomViews/ContentToggle.swift b/Core/CustomViews/Sources/ContentToggle.swift
similarity index 87%
rename from Flick/Code/Common/CustomViews/ContentToggle.swift
rename to Core/CustomViews/Sources/ContentToggle.swift
index e8c7cfb..2a2f922 100644
--- a/Flick/Code/Common/CustomViews/ContentToggle.swift
+++ b/Core/CustomViews/Sources/ContentToggle.swift
@@ -8,13 +8,17 @@
import Localizations
import SwiftUI
+import Models
-struct ContentToggle: View {
+public struct ContentToggle: View {
@Binding var contentType: ContentType
-
@Namespace private var namespace
+
+ public init(contentType: Binding) {
+ self._contentType = contentType
+ }
- var body: some View {
+ public var body: some View {
HStack {
Group {
contentTypeButton(.movie, isSelected: contentType == .movie)
diff --git a/Flick/Code/Common/CustomViews/HomeCardView.swift b/Core/CustomViews/Sources/HomeCardView.swift
similarity index 68%
rename from Flick/Code/Common/CustomViews/HomeCardView.swift
rename to Core/CustomViews/Sources/HomeCardView.swift
index 3c74893..f6013ac 100644
--- a/Flick/Code/Common/CustomViews/HomeCardView.swift
+++ b/Core/CustomViews/Sources/HomeCardView.swift
@@ -7,20 +7,37 @@
//
import SwiftUI
+import Common
+import Models
-struct HomeCardView: View {
+public struct HomeCardView: View {
@Environment(\.isRedacted) var isRedacted
var item: any Item
var genres: String
var style: ItemSizeStyle = .default
var textOpacity: CGFloat = 1
+ var imageView: ImageView
+
+ public init(
+ item: any Item,
+ genres: String,
+ imageView: ImageView,
+ style: ItemSizeStyle = .default,
+ textOpacity: CGFloat = 1,
+ ) {
+ self.item = item
+ self.genres = genres
+ self.style = style
+ self.textOpacity = textOpacity
+ self.imageView = imageView
+ }
- var body: some View {
+ public var body: some View {
VStack(spacing: style.isMain ? 12 : 8) {
PosterImageView(
- posterPath: item.posterPath,
year: item.year,
rating: item.rating,
+ imageView: imageView,
style: style
)
@@ -47,6 +64,7 @@ struct HomeCardView: View {
#Preview {
HomeCardView(
item: Movie.fakeItem(),
- genres: ""
+ genres: "",
+ imageView: EmptyView()
)
}
diff --git a/Flick/Code/Common/CustomViews/MainSectionScrollView.swift b/Core/CustomViews/Sources/MainSectionScrollView.swift
similarity index 77%
rename from Flick/Code/Common/CustomViews/MainSectionScrollView.swift
rename to Core/CustomViews/Sources/MainSectionScrollView.swift
index f06e46a..92d8a3a 100644
--- a/Flick/Code/Common/CustomViews/MainSectionScrollView.swift
+++ b/Core/CustomViews/Sources/MainSectionScrollView.swift
@@ -10,11 +10,15 @@ import Combine
import DesignSystem
import SwiftUI
import UDF
+import Models
+import Common
-struct MainSectionScrollView: View {
+public struct MainSectionScrollView: View {
var items: [any Item]
var genresByItem: (any Item) -> String
var navigateToItemDetails: (any Item) -> Void
+ var backgroundImage: (_ size: CGSize, _ path: String?) -> BackgroundImage
+ var cardImage: (_ item: any Item) -> CardImage
@State private var midItemIndex: Int = 0
@State private var scale: [Int: CGFloat] = [:]
@@ -28,8 +32,22 @@ struct MainSectionScrollView: View {
.debounce(for: 0.1, scheduler: RunLoop.main)
.eraseToAnyPublisher()
}
+
+ public init(
+ items: [any Item],
+ genresByItem: @escaping (any Item) -> String,
+ navigateToItemDetails: @escaping (any Item) -> Void,
+ @ViewBuilder backgroundImage: @escaping (_ size: CGSize, _ path: String?) -> BackgroundImage,
+ @ViewBuilder cardImage: @escaping (_ item: any Item) -> CardImage,
+ ) {
+ self.items = items
+ self.genresByItem = genresByItem
+ self.navigateToItemDetails = navigateToItemDetails
+ self.backgroundImage = backgroundImage
+ self.cardImage = cardImage
+ }
- var body: some View {
+ public var body: some View {
GeometryReader { geometry in
let padding = abs((geometry.size.width - 202) / 2)
ScrollViewReader { proxy in
@@ -61,11 +79,9 @@ struct MainSectionScrollView: View {
.background(
ZStack {
LinearGradient.primaryBackground
- ImageContainer(
- size: .init(width: geometry.size.width * 2, height: geometry.size.height * 2),
- path: items[safeIndex: midItemIndex]?.backdropPath,
- type: .backdrop,
- isLoaderPresented: false
+ backgroundImage(
+ CGSize(width: geometry.size.width * 2, height: geometry.size.height * 2),
+ items[safeIndex: midItemIndex]?.backdropPath
)
.frame(geometry.size)
.clipShape(Rectangle())
@@ -85,6 +101,7 @@ private extension MainSectionScrollView {
HomeCardView(
item: item,
genres: genresByItem(item),
+ imageView: cardImage(item),
style: .main,
textOpacity: opacity[index] ?? 1
)
@@ -126,6 +143,12 @@ struct OffsetPreferenceKey: PreferenceKey {
MainSectionScrollView(
items: Movie.fakeItems(),
genresByItem: { _ in "Fake genre" },
- navigateToItemDetails: { _ in }
+ navigateToItemDetails: { _ in },
+ backgroundImage: { _, _ in
+ EmptyView()
+ },
+ cardImage: { _ in
+ EmptyView()
+ }
)
}
diff --git a/Flick/Code/Common/CustomViews/PosterImageView.swift b/Core/CustomViews/Sources/PosterImageView.swift
similarity index 58%
rename from Flick/Code/Common/CustomViews/PosterImageView.swift
rename to Core/CustomViews/Sources/PosterImageView.swift
index 5f32c70..f9c67c2 100644
--- a/Flick/Code/Common/CustomViews/PosterImageView.swift
+++ b/Core/CustomViews/Sources/PosterImageView.swift
@@ -8,23 +8,33 @@
import SDWebImageSwiftUI
import SwiftUI
+import Common
-struct PosterImageView: View {
+public struct PosterImageView: View {
@Environment(\.isRedacted) var isRedacted
- var posterPath: String?
var year: String
var rating: Int
var style: ItemSizeStyle = .default
+ var imageView: ImageView
+
+ public init(
+ year: String,
+ rating: Int,
+ imageView: ImageView,
+ style: ItemSizeStyle = .default,
+ ) {
+ self.year = year
+ self.rating = rating
+ self.imageView = imageView
+ self.style = style
+ }
- var body: some View {
- ImageContainer(
- size: style.coverSize,
- path: posterPath
- )
- .frame(width: style.coverSize.width, height: style.coverSize.height)
- .overlay(cardOverlayView, alignment: .bottom)
- .animatedRedacted(isRedacted)
- .clipShape(RoundedRectangle(cornerRadius: 20))
+ public var body: some View {
+ imageView
+ .frame(width: style.coverSize.width, height: style.coverSize.height)
+ .overlay(cardOverlayView, alignment: .bottom)
+ .animatedRedacted(isRedacted)
+ .clipShape(RoundedRectangle(cornerRadius: 20))
}
var cardOverlayView: some View {
@@ -49,8 +59,8 @@ struct PosterImageView: View {
#Preview {
PosterImageView(
- posterPath: "/t6HIqrRAclMCA60NsSmeqe9RmNV.jpg",
year: Date.testItem.asYearString,
- rating: 63
+ rating: 63,
+ imageView: EmptyView()
)
}
diff --git a/Flick/Code/Common/CustomViews/RatingCircle.swift b/Core/CustomViews/Sources/RatingCircle.swift
similarity index 61%
rename from Flick/Code/Common/CustomViews/RatingCircle.swift
rename to Core/CustomViews/Sources/RatingCircle.swift
index 53f7103..6779bd1 100644
--- a/Flick/Code/Common/CustomViews/RatingCircle.swift
+++ b/Core/CustomViews/Sources/RatingCircle.swift
@@ -2,19 +2,31 @@
// RatingCircle.swift
// Flick
//
-// Created by Alexander Sharko on 18.01.2023.
-// Copyright © 2023 urlaunched.com. All rights reserved.
+// Created by Bogdan Petkanych on 17.05.2026.
+// Copyright © 2026 urlaunched. All rights reserved.
//
-
import SwiftUI
+import SwiftUI_Kit
-struct RatingCircle: View {
+public struct RatingCircle: View {
var value: String
var strokeColor: Color
var strokeWidth: CGFloat = 2
var backgroundColor: Color = .clear
+
+ public init(
+ value: String,
+ strokeColor: Color,
+ strokeWidth: CGFloat = 2,
+ backgroundColor: Color = .clear
+ ) {
+ self.value = value
+ self.strokeColor = strokeColor
+ self.strokeWidth = strokeWidth
+ self.backgroundColor = backgroundColor
+ }
- var body: some View {
+ public var body: some View {
Circle()
.fill(backgroundColor)
.overlay(
diff --git a/Flick/Code/Common/CustomViews/Review/ReviewHeaderView.swift b/Core/CustomViews/Sources/ReviewHeaderView.swift
similarity index 63%
rename from Flick/Code/Common/CustomViews/Review/ReviewHeaderView.swift
rename to Core/CustomViews/Sources/ReviewHeaderView.swift
index 8d69daf..41bd07d 100644
--- a/Flick/Code/Common/CustomViews/Review/ReviewHeaderView.swift
+++ b/Core/CustomViews/Sources/ReviewHeaderView.swift
@@ -8,21 +8,32 @@
import Localizations
import SwiftUI
+import Models
+import DesignSystem
-struct ReviewHeaderView: View {
+public struct ReviewHeaderView: View {
let review: Review
- let size = CGSize(width: 48, height: 48)
- var placeholderColor: Color = .flMain
+ let size: CGSize
+ var placeholderColor: Color
+ var imageView: ImageView
+
+ public init(
+ review: Review,
+ size: CGSize = CGSize(width: 48, height: 48),
+ placeholderColor: Color = .flMain,
+ imageView: ImageView = EmptyView()
+ ) {
+ self.review = review
+ self.size = size
+ self.placeholderColor = placeholderColor
+ self.imageView = imageView
+ }
- var body: some View {
+ public var body: some View {
HStack(spacing: 10) {
Group {
if let path = review.authorDetails.avatarPath {
- ImageContainer(
- size: size,
- path: path,
- type: .profile
- )
+ imageView
} else {
placeholderColor
.overlay(
@@ -51,5 +62,5 @@ struct ReviewHeaderView: View {
// MARK: - Preview
#Preview {
- ReviewHeaderView(review: .fakeItem())
+ ReviewHeaderView(review: .fakeItem())
}
diff --git a/Flick/Code/Common/CustomViews/Review/ReviewRatingView.swift b/Core/CustomViews/Sources/ReviewRatingView.swift
similarity index 79%
rename from Flick/Code/Common/CustomViews/Review/ReviewRatingView.swift
rename to Core/CustomViews/Sources/ReviewRatingView.swift
index 81f8f10..afce9df 100644
--- a/Flick/Code/Common/CustomViews/Review/ReviewRatingView.swift
+++ b/Core/CustomViews/Sources/ReviewRatingView.swift
@@ -9,10 +9,14 @@
import DesignSystem
import SwiftUI
-struct ReviewRatingView: View {
- let rating: Int
+public struct ReviewRatingView: View {
+ public let rating: Int
+
+ public init(rating: Int) {
+ self.rating = rating
+ }
- var body: some View {
+ public var body: some View {
HStack(spacing: 6) {
Image.starFill
.template
diff --git a/Flick/Code/Common/CustomViews/Review/ReviewRow.swift b/Core/CustomViews/Sources/ReviewRow.swift
similarity index 63%
rename from Flick/Code/Common/CustomViews/Review/ReviewRow.swift
rename to Core/CustomViews/Sources/ReviewRow.swift
index 961df5d..ccb59ed 100644
--- a/Flick/Code/Common/CustomViews/Review/ReviewRow.swift
+++ b/Core/CustomViews/Sources/ReviewRow.swift
@@ -7,13 +7,20 @@
//
import SwiftUI
+import Models
-struct ReviewRow: View {
+public struct ReviewRow: View {
let review: Review
+ var imageView: ImageView
+
+ public init(review: Review, imageView: ImageView) {
+ self.review = review
+ self.imageView = imageView
+ }
- var body: some View {
+ public var body: some View {
VStack(alignment: .leading, spacing: 10) {
- ReviewHeaderView(review: review)
+ ReviewHeaderView(review: review, imageView: imageView)
Text(review.content)
.customFont(.body)
@@ -32,5 +39,5 @@ struct ReviewRow: View {
// MARK: - Preview
#Preview {
- ReviewRow(review: .fakeItem())
+ ReviewRow(review: .fakeItem(), imageView: EmptyView())
}
diff --git a/Flick/Code/Common/CustomViews/SectionHeaderView.swift b/Core/CustomViews/Sources/SectionHeaderView.swift
similarity index 82%
rename from Flick/Code/Common/CustomViews/SectionHeaderView.swift
rename to Core/CustomViews/Sources/SectionHeaderView.swift
index db21646..0d469ac 100644
--- a/Flick/Code/Common/CustomViews/SectionHeaderView.swift
+++ b/Core/CustomViews/Sources/SectionHeaderView.swift
@@ -9,11 +9,16 @@
import Localizations
import SwiftUI
-struct SectionHeaderView: View {
+public struct SectionHeaderView: View {
var title: String
var seeAllAction: () -> Void
+
+ public init(title: String, seeAllAction: @escaping () -> Void) {
+ self.title = title
+ self.seeAllAction = seeAllAction
+ }
- var body: some View {
+ public var body: some View {
HStack {
Text(title)
.customFont(.headline)
diff --git a/Flick/Code/Common/CustomViews/SelectiveItemsList.swift b/Core/CustomViews/Sources/SelectiveItemsList.swift
similarity index 86%
rename from Flick/Code/Common/CustomViews/SelectiveItemsList.swift
rename to Core/CustomViews/Sources/SelectiveItemsList.swift
index 2464e9e..a63d0ff 100644
--- a/Flick/Code/Common/CustomViews/SelectiveItemsList.swift
+++ b/Core/CustomViews/Sources/SelectiveItemsList.swift
@@ -8,29 +8,33 @@
import SwiftUI
import UDF
+import Models
-struct SelectiveItemsList: View {
+public struct SelectiveItemsList: View {
var items: [any Item]
var genreById: (Genre.ID) -> Genre?
var loadMoreAction: Command
var isRedacted: Bool
var header: () -> Header
+ var imageView: (_ path: String?) -> ImageView
- init(
+ public init(
items: [any Item],
genreById: @escaping (Genre.ID) -> Genre?,
loadMoreAction: @escaping Command,
isRedacted: Bool,
- @ViewBuilder header: @escaping () -> Header
+ @ViewBuilder header: @escaping () -> Header,
+ @ViewBuilder imageView: @escaping (_ path: String?) -> ImageView,
) {
self.items = items
self.genreById = genreById
self.loadMoreAction = loadMoreAction
self.isRedacted = isRedacted
self.header = header
+ self.imageView = imageView
}
- var body: some View {
+ public var body: some View {
List {
Group {
header()
@@ -59,9 +63,9 @@ private extension SelectiveItemsList {
func itemRow(item: any Item) -> some View {
HStack(spacing: 16) {
PosterImageView(
- posterPath: item.posterPath,
year: item.year,
- rating: item.rating
+ rating: item.rating,
+ imageView: imageView(item.posterPath)
)
.overlay(alignment: .topLeading) {
heartButton
@@ -125,6 +129,7 @@ private extension SelectiveItemsList {
genreById: { _ in .testItem() },
loadMoreAction: {},
isRedacted: true,
- header: { EmptyView() }
+ header: { EmptyView() },
+ imageView: { _ in EmptyView() }
)
}
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Colors/Contents.json b/Core/DesignSystem/Resources/Assets.xcassets/Colors/Contents.json
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Colors/Contents.json
rename to Core/DesignSystem/Resources/Assets.xcassets/Colors/Contents.json
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Colors/flDark.colorset/Contents.json b/Core/DesignSystem/Resources/Assets.xcassets/Colors/flDark.colorset/Contents.json
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Colors/flDark.colorset/Contents.json
rename to Core/DesignSystem/Resources/Assets.xcassets/Colors/flDark.colorset/Contents.json
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Colors/flGradientMain.colorset/Contents.json b/Core/DesignSystem/Resources/Assets.xcassets/Colors/flGradientMain.colorset/Contents.json
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Colors/flGradientMain.colorset/Contents.json
rename to Core/DesignSystem/Resources/Assets.xcassets/Colors/flGradientMain.colorset/Contents.json
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Colors/flGray.colorset/Contents.json b/Core/DesignSystem/Resources/Assets.xcassets/Colors/flGray.colorset/Contents.json
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Colors/flGray.colorset/Contents.json
rename to Core/DesignSystem/Resources/Assets.xcassets/Colors/flGray.colorset/Contents.json
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Colors/flGreen.colorset/Contents.json b/Core/DesignSystem/Resources/Assets.xcassets/Colors/flGreen.colorset/Contents.json
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Colors/flGreen.colorset/Contents.json
rename to Core/DesignSystem/Resources/Assets.xcassets/Colors/flGreen.colorset/Contents.json
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Colors/flMain.colorset/Contents.json b/Core/DesignSystem/Resources/Assets.xcassets/Colors/flMain.colorset/Contents.json
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Colors/flMain.colorset/Contents.json
rename to Core/DesignSystem/Resources/Assets.xcassets/Colors/flMain.colorset/Contents.json
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Colors/flMainPink.colorset/Contents.json b/Core/DesignSystem/Resources/Assets.xcassets/Colors/flMainPink.colorset/Contents.json
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Colors/flMainPink.colorset/Contents.json
rename to Core/DesignSystem/Resources/Assets.xcassets/Colors/flMainPink.colorset/Contents.json
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Colors/flOnboardBlue.colorset/Contents.json b/Core/DesignSystem/Resources/Assets.xcassets/Colors/flOnboardBlue.colorset/Contents.json
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Colors/flOnboardBlue.colorset/Contents.json
rename to Core/DesignSystem/Resources/Assets.xcassets/Colors/flOnboardBlue.colorset/Contents.json
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Colors/flOnboardOrange.colorset/Contents.json b/Core/DesignSystem/Resources/Assets.xcassets/Colors/flOnboardOrange.colorset/Contents.json
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Colors/flOnboardOrange.colorset/Contents.json
rename to Core/DesignSystem/Resources/Assets.xcassets/Colors/flOnboardOrange.colorset/Contents.json
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Colors/flOnboardYellow.colorset/Contents.json b/Core/DesignSystem/Resources/Assets.xcassets/Colors/flOnboardYellow.colorset/Contents.json
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Colors/flOnboardYellow.colorset/Contents.json
rename to Core/DesignSystem/Resources/Assets.xcassets/Colors/flOnboardYellow.colorset/Contents.json
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Colors/flPink10.colorset/Contents.json b/Core/DesignSystem/Resources/Assets.xcassets/Colors/flPink10.colorset/Contents.json
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Colors/flPink10.colorset/Contents.json
rename to Core/DesignSystem/Resources/Assets.xcassets/Colors/flPink10.colorset/Contents.json
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Colors/flPink20.colorset/Contents.json b/Core/DesignSystem/Resources/Assets.xcassets/Colors/flPink20.colorset/Contents.json
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Colors/flPink20.colorset/Contents.json
rename to Core/DesignSystem/Resources/Assets.xcassets/Colors/flPink20.colorset/Contents.json
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Colors/flPink40.colorset/Contents.json b/Core/DesignSystem/Resources/Assets.xcassets/Colors/flPink40.colorset/Contents.json
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Colors/flPink40.colorset/Contents.json
rename to Core/DesignSystem/Resources/Assets.xcassets/Colors/flPink40.colorset/Contents.json
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Colors/flPink60.colorset/Contents.json b/Core/DesignSystem/Resources/Assets.xcassets/Colors/flPink60.colorset/Contents.json
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Colors/flPink60.colorset/Contents.json
rename to Core/DesignSystem/Resources/Assets.xcassets/Colors/flPink60.colorset/Contents.json
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Colors/flPink80.colorset/Contents.json b/Core/DesignSystem/Resources/Assets.xcassets/Colors/flPink80.colorset/Contents.json
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Colors/flPink80.colorset/Contents.json
rename to Core/DesignSystem/Resources/Assets.xcassets/Colors/flPink80.colorset/Contents.json
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Colors/flPurpleLight.colorset/Contents.json b/Core/DesignSystem/Resources/Assets.xcassets/Colors/flPurpleLight.colorset/Contents.json
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Colors/flPurpleLight.colorset/Contents.json
rename to Core/DesignSystem/Resources/Assets.xcassets/Colors/flPurpleLight.colorset/Contents.json
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Colors/flRedacted.colorset/Contents.json b/Core/DesignSystem/Resources/Assets.xcassets/Colors/flRedacted.colorset/Contents.json
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Colors/flRedacted.colorset/Contents.json
rename to Core/DesignSystem/Resources/Assets.xcassets/Colors/flRedacted.colorset/Contents.json
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Colors/flSecondary.colorset/Contents.json b/Core/DesignSystem/Resources/Assets.xcassets/Colors/flSecondary.colorset/Contents.json
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Colors/flSecondary.colorset/Contents.json
rename to Core/DesignSystem/Resources/Assets.xcassets/Colors/flSecondary.colorset/Contents.json
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Colors/flStarYellow.colorset/Contents.json b/Core/DesignSystem/Resources/Assets.xcassets/Colors/flStarYellow.colorset/Contents.json
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Colors/flStarYellow.colorset/Contents.json
rename to Core/DesignSystem/Resources/Assets.xcassets/Colors/flStarYellow.colorset/Contents.json
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Colors/flSystemBlue.colorset/Contents.json b/Core/DesignSystem/Resources/Assets.xcassets/Colors/flSystemBlue.colorset/Contents.json
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Colors/flSystemBlue.colorset/Contents.json
rename to Core/DesignSystem/Resources/Assets.xcassets/Colors/flSystemBlue.colorset/Contents.json
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Colors/flSystemRed.colorset/Contents.json b/Core/DesignSystem/Resources/Assets.xcassets/Colors/flSystemRed.colorset/Contents.json
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Colors/flSystemRed.colorset/Contents.json
rename to Core/DesignSystem/Resources/Assets.xcassets/Colors/flSystemRed.colorset/Contents.json
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Colors/flText.colorset/Contents.json b/Core/DesignSystem/Resources/Assets.xcassets/Colors/flText.colorset/Contents.json
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Colors/flText.colorset/Contents.json
rename to Core/DesignSystem/Resources/Assets.xcassets/Colors/flText.colorset/Contents.json
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Colors/flWhite.colorset/Contents.json b/Core/DesignSystem/Resources/Assets.xcassets/Colors/flWhite.colorset/Contents.json
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Colors/flWhite.colorset/Contents.json
rename to Core/DesignSystem/Resources/Assets.xcassets/Colors/flWhite.colorset/Contents.json
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Contents.json b/Core/DesignSystem/Resources/Assets.xcassets/Contents.json
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Contents.json
rename to Core/DesignSystem/Resources/Assets.xcassets/Contents.json
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/Contents.json b/Core/DesignSystem/Resources/Assets.xcassets/Icons/Contents.json
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/Contents.json
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/Contents.json
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/arrow_down.imageset/Contents.json b/Core/DesignSystem/Resources/Assets.xcassets/Icons/arrow_down.imageset/Contents.json
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/arrow_down.imageset/Contents.json
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/arrow_down.imageset/Contents.json
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/arrow_down.imageset/arrow-down.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/arrow_down.imageset/arrow-down.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/arrow_down.imageset/arrow-down.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/arrow_down.imageset/arrow-down.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/arrow_down.imageset/arrow-down@2x.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/arrow_down.imageset/arrow-down@2x.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/arrow_down.imageset/arrow-down@2x.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/arrow_down.imageset/arrow-down@2x.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/arrow_down.imageset/arrow-down@3x.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/arrow_down.imageset/arrow-down@3x.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/arrow_down.imageset/arrow-down@3x.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/arrow_down.imageset/arrow-down@3x.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/arrow_left.imageset/Contents.json b/Core/DesignSystem/Resources/Assets.xcassets/Icons/arrow_left.imageset/Contents.json
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/arrow_left.imageset/Contents.json
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/arrow_left.imageset/Contents.json
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/arrow_left.imageset/arrow-left.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/arrow_left.imageset/arrow-left.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/arrow_left.imageset/arrow-left.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/arrow_left.imageset/arrow-left.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/arrow_left.imageset/arrow-left@2x.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/arrow_left.imageset/arrow-left@2x.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/arrow_left.imageset/arrow-left@2x.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/arrow_left.imageset/arrow-left@2x.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/arrow_left.imageset/arrow-left@3x.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/arrow_left.imageset/arrow-left@3x.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/arrow_left.imageset/arrow-left@3x.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/arrow_left.imageset/arrow-left@3x.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/arrow_right.imageset/Contents.json b/Core/DesignSystem/Resources/Assets.xcassets/Icons/arrow_right.imageset/Contents.json
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/arrow_right.imageset/Contents.json
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/arrow_right.imageset/Contents.json
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/arrow_right.imageset/arrow-right.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/arrow_right.imageset/arrow-right.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/arrow_right.imageset/arrow-right.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/arrow_right.imageset/arrow-right.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/arrow_right.imageset/arrow-right@2x.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/arrow_right.imageset/arrow-right@2x.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/arrow_right.imageset/arrow-right@2x.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/arrow_right.imageset/arrow-right@2x.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/arrow_right.imageset/arrow-right@3x.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/arrow_right.imageset/arrow-right@3x.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/arrow_right.imageset/arrow-right@3x.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/arrow_right.imageset/arrow-right@3x.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/arrow_up.imageset/Contents.json b/Core/DesignSystem/Resources/Assets.xcassets/Icons/arrow_up.imageset/Contents.json
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/arrow_up.imageset/Contents.json
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/arrow_up.imageset/Contents.json
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/arrow_up.imageset/arrow-up.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/arrow_up.imageset/arrow-up.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/arrow_up.imageset/arrow-up.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/arrow_up.imageset/arrow-up.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/arrow_up.imageset/arrow-up@2x.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/arrow_up.imageset/arrow-up@2x.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/arrow_up.imageset/arrow-up@2x.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/arrow_up.imageset/arrow-up@2x.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/arrow_up.imageset/arrow-up@3x.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/arrow_up.imageset/arrow-up@3x.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/arrow_up.imageset/arrow-up@3x.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/arrow_up.imageset/arrow-up@3x.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/camera.imageset/Contents.json b/Core/DesignSystem/Resources/Assets.xcassets/Icons/camera.imageset/Contents.json
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/camera.imageset/Contents.json
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/camera.imageset/Contents.json
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/camera.imageset/camera.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/camera.imageset/camera.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/camera.imageset/camera.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/camera.imageset/camera.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/camera.imageset/camera@2x.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/camera.imageset/camera@2x.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/camera.imageset/camera@2x.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/camera.imageset/camera@2x.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/camera.imageset/camera@3x.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/camera.imageset/camera@3x.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/camera.imageset/camera@3x.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/camera.imageset/camera@3x.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/camera_normal.imageset/Contents.json b/Core/DesignSystem/Resources/Assets.xcassets/Icons/camera_normal.imageset/Contents.json
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/camera_normal.imageset/Contents.json
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/camera_normal.imageset/Contents.json
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/camera_normal.imageset/camera.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/camera_normal.imageset/camera.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/camera_normal.imageset/camera.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/camera_normal.imageset/camera.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/camera_normal.imageset/camera@2x.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/camera_normal.imageset/camera@2x.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/camera_normal.imageset/camera@2x.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/camera_normal.imageset/camera@2x.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/camera_normal.imageset/camera@3x.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/camera_normal.imageset/camera@3x.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/camera_normal.imageset/camera@3x.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/camera_normal.imageset/camera@3x.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/close.imageset/Contents.json b/Core/DesignSystem/Resources/Assets.xcassets/Icons/close.imageset/Contents.json
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/close.imageset/Contents.json
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/close.imageset/Contents.json
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/close.imageset/close.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/close.imageset/close.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/close.imageset/close.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/close.imageset/close.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/close.imageset/close@2x.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/close.imageset/close@2x.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/close.imageset/close@2x.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/close.imageset/close@2x.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/close.imageset/close@3x.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/close.imageset/close@3x.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/close.imageset/close@3x.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/close.imageset/close@3x.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/close_normal.imageset/Contents.json b/Core/DesignSystem/Resources/Assets.xcassets/Icons/close_normal.imageset/Contents.json
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/close_normal.imageset/Contents.json
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/close_normal.imageset/Contents.json
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/close_normal.imageset/close.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/close_normal.imageset/close.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/close_normal.imageset/close.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/close_normal.imageset/close.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/close_normal.imageset/close@2x.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/close_normal.imageset/close@2x.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/close_normal.imageset/close@2x.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/close_normal.imageset/close@2x.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/close_normal.imageset/close@3x.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/close_normal.imageset/close@3x.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/close_normal.imageset/close@3x.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/close_normal.imageset/close@3x.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/edit.imageset/Contents.json b/Core/DesignSystem/Resources/Assets.xcassets/Icons/edit.imageset/Contents.json
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/edit.imageset/Contents.json
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/edit.imageset/Contents.json
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/edit.imageset/edit.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/edit.imageset/edit.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/edit.imageset/edit.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/edit.imageset/edit.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/edit.imageset/edit@2x.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/edit.imageset/edit@2x.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/edit.imageset/edit@2x.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/edit.imageset/edit@2x.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/edit.imageset/edit@3x.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/edit.imageset/edit@3x.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/edit.imageset/edit@3x.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/edit.imageset/edit@3x.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/eye.imageset/Contents.json b/Core/DesignSystem/Resources/Assets.xcassets/Icons/eye.imageset/Contents.json
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/eye.imageset/Contents.json
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/eye.imageset/Contents.json
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/eye.imageset/eye.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/eye.imageset/eye.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/eye.imageset/eye.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/eye.imageset/eye.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/eye.imageset/eye@2x.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/eye.imageset/eye@2x.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/eye.imageset/eye@2x.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/eye.imageset/eye@2x.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/eye.imageset/eye@3x.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/eye.imageset/eye@3x.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/eye.imageset/eye@3x.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/eye.imageset/eye@3x.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/eye_slash.imageset/Contents.json b/Core/DesignSystem/Resources/Assets.xcassets/Icons/eye_slash.imageset/Contents.json
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/eye_slash.imageset/Contents.json
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/eye_slash.imageset/Contents.json
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/eye_slash.imageset/eye-slash.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/eye_slash.imageset/eye-slash.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/eye_slash.imageset/eye-slash.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/eye_slash.imageset/eye-slash.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/eye_slash.imageset/eye-slash@2x.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/eye_slash.imageset/eye-slash@2x.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/eye_slash.imageset/eye-slash@2x.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/eye_slash.imageset/eye-slash@2x.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/eye_slash.imageset/eye-slash@3x.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/eye_slash.imageset/eye-slash@3x.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/eye_slash.imageset/eye-slash@3x.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/eye_slash.imageset/eye-slash@3x.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/filter.imageset/Contents.json b/Core/DesignSystem/Resources/Assets.xcassets/Icons/filter.imageset/Contents.json
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/filter.imageset/Contents.json
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/filter.imageset/Contents.json
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/filter.imageset/filter.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/filter.imageset/filter.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/filter.imageset/filter.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/filter.imageset/filter.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/filter.imageset/filter@2x.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/filter.imageset/filter@2x.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/filter.imageset/filter@2x.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/filter.imageset/filter@2x.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/filter.imageset/filter@3x.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/filter.imageset/filter@3x.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/filter.imageset/filter@3x.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/filter.imageset/filter@3x.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/filter_applied.imageset/Contents.json b/Core/DesignSystem/Resources/Assets.xcassets/Icons/filter_applied.imageset/Contents.json
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/filter_applied.imageset/Contents.json
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/filter_applied.imageset/Contents.json
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/filter_applied.imageset/applied filter.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/filter_applied.imageset/applied filter.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/filter_applied.imageset/applied filter.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/filter_applied.imageset/applied filter.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/filter_applied.imageset/applied filter@2x.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/filter_applied.imageset/applied filter@2x.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/filter_applied.imageset/applied filter@2x.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/filter_applied.imageset/applied filter@2x.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/filter_applied.imageset/applied filter@3x.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/filter_applied.imageset/applied filter@3x.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/filter_applied.imageset/applied filter@3x.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/filter_applied.imageset/applied filter@3x.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/flick.imageset/Contents.json b/Core/DesignSystem/Resources/Assets.xcassets/Icons/flick.imageset/Contents.json
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/flick.imageset/Contents.json
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/flick.imageset/Contents.json
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/flick.imageset/Flick it 1.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/flick.imageset/Flick it 1.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/flick.imageset/Flick it 1.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/flick.imageset/Flick it 1.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/flick.imageset/Flick it.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/flick.imageset/Flick it.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/flick.imageset/Flick it.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/flick.imageset/Flick it.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/flick.imageset/Flick it@2x 1.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/flick.imageset/Flick it@2x 1.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/flick.imageset/Flick it@2x 1.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/flick.imageset/Flick it@2x 1.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/flick.imageset/Flick it@2x.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/flick.imageset/Flick it@2x.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/flick.imageset/Flick it@2x.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/flick.imageset/Flick it@2x.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/flick.imageset/Flick it@3x 1.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/flick.imageset/Flick it@3x 1.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/flick.imageset/Flick it@3x 1.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/flick.imageset/Flick it@3x 1.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/flick.imageset/Flick it@3x.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/flick.imageset/Flick it@3x.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/flick.imageset/Flick it@3x.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/flick.imageset/Flick it@3x.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/frame.imageset/Contents.json b/Core/DesignSystem/Resources/Assets.xcassets/Icons/frame.imageset/Contents.json
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/frame.imageset/Contents.json
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/frame.imageset/Contents.json
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/frame.imageset/frame.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/frame.imageset/frame.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/frame.imageset/frame.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/frame.imageset/frame.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/frame.imageset/frame@2x.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/frame.imageset/frame@2x.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/frame.imageset/frame@2x.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/frame.imageset/frame@2x.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/frame.imageset/frame@3x.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/frame.imageset/frame@3x.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/frame.imageset/frame@3x.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/frame.imageset/frame@3x.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/global.imageset/Contents.json b/Core/DesignSystem/Resources/Assets.xcassets/Icons/global.imageset/Contents.json
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/global.imageset/Contents.json
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/global.imageset/Contents.json
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/global.imageset/global.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/global.imageset/global.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/global.imageset/global.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/global.imageset/global.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/global.imageset/global@2x.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/global.imageset/global@2x.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/global.imageset/global@2x.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/global.imageset/global@2x.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/global.imageset/global@3x.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/global.imageset/global@3x.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/global.imageset/global@3x.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/global.imageset/global@3x.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/heart.imageset/Contents.json b/Core/DesignSystem/Resources/Assets.xcassets/Icons/heart.imageset/Contents.json
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/heart.imageset/Contents.json
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/heart.imageset/Contents.json
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/heart.imageset/heart.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/heart.imageset/heart.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/heart.imageset/heart.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/heart.imageset/heart.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/heart.imageset/heart@2x.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/heart.imageset/heart@2x.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/heart.imageset/heart@2x.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/heart.imageset/heart@2x.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/heart.imageset/heart@3x.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/heart.imageset/heart@3x.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/heart.imageset/heart@3x.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/heart.imageset/heart@3x.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/heart_fill.imageset/Contents.json b/Core/DesignSystem/Resources/Assets.xcassets/Icons/heart_fill.imageset/Contents.json
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/heart_fill.imageset/Contents.json
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/heart_fill.imageset/Contents.json
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/heart_fill.imageset/heart.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/heart_fill.imageset/heart.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/heart_fill.imageset/heart.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/heart_fill.imageset/heart.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/heart_fill.imageset/heart@2x.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/heart_fill.imageset/heart@2x.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/heart_fill.imageset/heart@2x.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/heart_fill.imageset/heart@2x.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/heart_fill.imageset/heart@3x.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/heart_fill.imageset/heart@3x.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/heart_fill.imageset/heart@3x.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/heart_fill.imageset/heart@3x.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/heart_normal.imageset/Contents.json b/Core/DesignSystem/Resources/Assets.xcassets/Icons/heart_normal.imageset/Contents.json
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/heart_normal.imageset/Contents.json
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/heart_normal.imageset/Contents.json
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/heart_normal.imageset/heart.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/heart_normal.imageset/heart.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/heart_normal.imageset/heart.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/heart_normal.imageset/heart.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/heart_normal.imageset/heart@2x.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/heart_normal.imageset/heart@2x.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/heart_normal.imageset/heart@2x.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/heart_normal.imageset/heart@2x.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/heart_normal.imageset/heart@3x.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/heart_normal.imageset/heart@3x.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/heart_normal.imageset/heart@3x.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/heart_normal.imageset/heart@3x.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/location.imageset/Contents.json b/Core/DesignSystem/Resources/Assets.xcassets/Icons/location.imageset/Contents.json
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/location.imageset/Contents.json
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/location.imageset/Contents.json
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/location.imageset/location.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/location.imageset/location.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/location.imageset/location.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/location.imageset/location.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/location.imageset/location@2x.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/location.imageset/location@2x.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/location.imageset/location@2x.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/location.imageset/location@2x.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/location.imageset/location@3x.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/location.imageset/location@3x.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/location.imageset/location@3x.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/location.imageset/location@3x.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/lock.imageset/Contents.json b/Core/DesignSystem/Resources/Assets.xcassets/Icons/lock.imageset/Contents.json
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/lock.imageset/Contents.json
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/lock.imageset/Contents.json
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/lock.imageset/lock.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/lock.imageset/lock.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/lock.imageset/lock.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/lock.imageset/lock.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/lock.imageset/lock@2x.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/lock.imageset/lock@2x.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/lock.imageset/lock@2x.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/lock.imageset/lock@2x.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/lock.imageset/lock@3x.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/lock.imageset/lock@3x.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/lock.imageset/lock@3x.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/lock.imageset/lock@3x.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/logout_right.imageset/Contents.json b/Core/DesignSystem/Resources/Assets.xcassets/Icons/logout_right.imageset/Contents.json
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/logout_right.imageset/Contents.json
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/logout_right.imageset/Contents.json
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/logout_right.imageset/logout.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/logout_right.imageset/logout.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/logout_right.imageset/logout.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/logout_right.imageset/logout.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/logout_right.imageset/logout@2x.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/logout_right.imageset/logout@2x.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/logout_right.imageset/logout@2x.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/logout_right.imageset/logout@2x.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/logout_right.imageset/logout@3x.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/logout_right.imageset/logout@3x.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/logout_right.imageset/logout@3x.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/logout_right.imageset/logout@3x.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/logout_up.imageset/Contents.json b/Core/DesignSystem/Resources/Assets.xcassets/Icons/logout_up.imageset/Contents.json
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/logout_up.imageset/Contents.json
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/logout_up.imageset/Contents.json
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/logout_up.imageset/logout.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/logout_up.imageset/logout.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/logout_up.imageset/logout.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/logout_up.imageset/logout.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/logout_up.imageset/logout@2x.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/logout_up.imageset/logout@2x.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/logout_up.imageset/logout@2x.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/logout_up.imageset/logout@2x.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/logout_up.imageset/logout@3x.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/logout_up.imageset/logout@3x.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/logout_up.imageset/logout@3x.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/logout_up.imageset/logout@3x.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/money_recieve.imageset/Contents.json b/Core/DesignSystem/Resources/Assets.xcassets/Icons/money_recieve.imageset/Contents.json
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/money_recieve.imageset/Contents.json
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/money_recieve.imageset/Contents.json
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/money_recieve.imageset/money-recive.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/money_recieve.imageset/money-recive.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/money_recieve.imageset/money-recive.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/money_recieve.imageset/money-recive.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/money_recieve.imageset/money-recive@2x.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/money_recieve.imageset/money-recive@2x.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/money_recieve.imageset/money-recive@2x.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/money_recieve.imageset/money-recive@2x.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/money_recieve.imageset/money-recive@3x.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/money_recieve.imageset/money-recive@3x.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/money_recieve.imageset/money-recive@3x.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/money_recieve.imageset/money-recive@3x.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/money_send.imageset/Contents.json b/Core/DesignSystem/Resources/Assets.xcassets/Icons/money_send.imageset/Contents.json
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/money_send.imageset/Contents.json
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/money_send.imageset/Contents.json
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/money_send.imageset/money-send.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/money_send.imageset/money-send.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/money_send.imageset/money-send.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/money_send.imageset/money-send.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/money_send.imageset/money-send@2x.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/money_send.imageset/money-send@2x.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/money_send.imageset/money-send@2x.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/money_send.imageset/money-send@2x.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/money_send.imageset/money-send@3x.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/money_send.imageset/money-send@3x.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/money_send.imageset/money-send@3x.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/money_send.imageset/money-send@3x.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/pencil.imageset/Contents.json b/Core/DesignSystem/Resources/Assets.xcassets/Icons/pencil.imageset/Contents.json
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/pencil.imageset/Contents.json
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/pencil.imageset/Contents.json
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/pencil.imageset/edit-2.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/pencil.imageset/edit-2.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/pencil.imageset/edit-2.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/pencil.imageset/edit-2.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/pencil.imageset/edit-2@2x.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/pencil.imageset/edit-2@2x.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/pencil.imageset/edit-2@2x.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/pencil.imageset/edit-2@2x.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/pencil.imageset/edit-2@3x.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/pencil.imageset/edit-2@3x.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/pencil.imageset/edit-2@3x.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/pencil.imageset/edit-2@3x.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/play_circle.imageset/Contents.json b/Core/DesignSystem/Resources/Assets.xcassets/Icons/play_circle.imageset/Contents.json
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/play_circle.imageset/Contents.json
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/play_circle.imageset/Contents.json
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/play_circle.imageset/video-circle.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/play_circle.imageset/video-circle.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/play_circle.imageset/video-circle.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/play_circle.imageset/video-circle.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/play_circle.imageset/video-circle@2x.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/play_circle.imageset/video-circle@2x.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/play_circle.imageset/video-circle@2x.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/play_circle.imageset/video-circle@2x.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/play_circle.imageset/video-circle@3x.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/play_circle.imageset/video-circle@3x.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/play_circle.imageset/video-circle@3x.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/play_circle.imageset/video-circle@3x.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/receipt.imageset/Contents.json b/Core/DesignSystem/Resources/Assets.xcassets/Icons/receipt.imageset/Contents.json
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/receipt.imageset/Contents.json
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/receipt.imageset/Contents.json
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/receipt.imageset/receipt.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/receipt.imageset/receipt.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/receipt.imageset/receipt.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/receipt.imageset/receipt.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/receipt.imageset/receipt@2x.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/receipt.imageset/receipt@2x.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/receipt.imageset/receipt@2x.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/receipt.imageset/receipt@2x.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/receipt.imageset/receipt@3x.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/receipt.imageset/receipt@3x.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/receipt.imageset/receipt@3x.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/receipt.imageset/receipt@3x.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/search.imageset/Contents.json b/Core/DesignSystem/Resources/Assets.xcassets/Icons/search.imageset/Contents.json
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/search.imageset/Contents.json
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/search.imageset/Contents.json
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/search.imageset/search.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/search.imageset/search.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/search.imageset/search.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/search.imageset/search.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/search.imageset/search@2x.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/search.imageset/search@2x.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/search.imageset/search@2x.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/search.imageset/search@2x.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/search.imageset/search@3x.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/search.imageset/search@3x.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/search.imageset/search@3x.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/search.imageset/search@3x.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/search_fill.imageset/Contents.json b/Core/DesignSystem/Resources/Assets.xcassets/Icons/search_fill.imageset/Contents.json
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/search_fill.imageset/Contents.json
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/search_fill.imageset/Contents.json
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/search_fill.imageset/search.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/search_fill.imageset/search.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/search_fill.imageset/search.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/search_fill.imageset/search.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/search_fill.imageset/search@2x.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/search_fill.imageset/search@2x.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/search_fill.imageset/search@2x.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/search_fill.imageset/search@2x.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/search_fill.imageset/search@3x.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/search_fill.imageset/search@3x.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/search_fill.imageset/search@3x.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/search_fill.imageset/search@3x.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/search_normal.imageset/Contents.json b/Core/DesignSystem/Resources/Assets.xcassets/Icons/search_normal.imageset/Contents.json
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/search_normal.imageset/Contents.json
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/search_normal.imageset/Contents.json
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/search_normal.imageset/search-normal.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/search_normal.imageset/search-normal.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/search_normal.imageset/search-normal.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/search_normal.imageset/search-normal.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/search_normal.imageset/search-normal@2x.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/search_normal.imageset/search-normal@2x.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/search_normal.imageset/search-normal@2x.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/search_normal.imageset/search-normal@2x.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/search_normal.imageset/search-normal@3x.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/search_normal.imageset/search-normal@3x.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/search_normal.imageset/search-normal@3x.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/search_normal.imageset/search-normal@3x.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/sms.imageset/Contents.json b/Core/DesignSystem/Resources/Assets.xcassets/Icons/sms.imageset/Contents.json
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/sms.imageset/Contents.json
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/sms.imageset/Contents.json
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/sms.imageset/sms.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/sms.imageset/sms.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/sms.imageset/sms.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/sms.imageset/sms.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/sms.imageset/sms@2x.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/sms.imageset/sms@2x.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/sms.imageset/sms@2x.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/sms.imageset/sms@2x.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/sms.imageset/sms@3x.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/sms.imageset/sms@3x.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/sms.imageset/sms@3x.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/sms.imageset/sms@3x.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/star.imageset/Contents.json b/Core/DesignSystem/Resources/Assets.xcassets/Icons/star.imageset/Contents.json
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/star.imageset/Contents.json
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/star.imageset/Contents.json
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/star.imageset/star.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/star.imageset/star.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/star.imageset/star.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/star.imageset/star.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/star.imageset/star@2x.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/star.imageset/star@2x.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/star.imageset/star@2x.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/star.imageset/star@2x.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/star.imageset/star@3x.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/star.imageset/star@3x.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/star.imageset/star@3x.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/star.imageset/star@3x.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/star_fill.imageset/Contents.json b/Core/DesignSystem/Resources/Assets.xcassets/Icons/star_fill.imageset/Contents.json
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/star_fill.imageset/Contents.json
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/star_fill.imageset/Contents.json
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/star_fill.imageset/star.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/star_fill.imageset/star.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/star_fill.imageset/star.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/star_fill.imageset/star.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/star_fill.imageset/star@2x.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/star_fill.imageset/star@2x.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/star_fill.imageset/star@2x.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/star_fill.imageset/star@2x.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/star_fill.imageset/star@3x.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/star_fill.imageset/star@3x.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/star_fill.imageset/star@3x.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/star_fill.imageset/star@3x.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/star_normal.imageset/Contents.json b/Core/DesignSystem/Resources/Assets.xcassets/Icons/star_normal.imageset/Contents.json
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/star_normal.imageset/Contents.json
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/star_normal.imageset/Contents.json
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/star_normal.imageset/star.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/star_normal.imageset/star.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/star_normal.imageset/star.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/star_normal.imageset/star.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/star_normal.imageset/star@2x.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/star_normal.imageset/star@2x.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/star_normal.imageset/star@2x.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/star_normal.imageset/star@2x.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/star_normal.imageset/star@3x.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/star_normal.imageset/star@3x.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/star_normal.imageset/star@3x.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/star_normal.imageset/star@3x.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/subtitle.imageset/Contents.json b/Core/DesignSystem/Resources/Assets.xcassets/Icons/subtitle.imageset/Contents.json
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/subtitle.imageset/Contents.json
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/subtitle.imageset/Contents.json
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/subtitle.imageset/subtitle.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/subtitle.imageset/subtitle.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/subtitle.imageset/subtitle.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/subtitle.imageset/subtitle.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/subtitle.imageset/subtitle@2x.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/subtitle.imageset/subtitle@2x.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/subtitle.imageset/subtitle@2x.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/subtitle.imageset/subtitle@2x.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/subtitle.imageset/subtitle@3x.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/subtitle.imageset/subtitle@3x.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/subtitle.imageset/subtitle@3x.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/subtitle.imageset/subtitle@3x.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/title.imageset/Contents.json b/Core/DesignSystem/Resources/Assets.xcassets/Icons/title.imageset/Contents.json
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/title.imageset/Contents.json
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/title.imageset/Contents.json
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/title.imageset/title.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/title.imageset/title.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/title.imageset/title.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/title.imageset/title.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/title.imageset/title@2x.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/title.imageset/title@2x.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/title.imageset/title@2x.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/title.imageset/title@2x.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/title.imageset/title@3x.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/title.imageset/title@3x.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/title.imageset/title@3x.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/title.imageset/title@3x.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/tv.imageset/Contents.json b/Core/DesignSystem/Resources/Assets.xcassets/Icons/tv.imageset/Contents.json
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/tv.imageset/Contents.json
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/tv.imageset/Contents.json
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/tv.imageset/device-tv.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/tv.imageset/device-tv.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/tv.imageset/device-tv.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/tv.imageset/device-tv.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/tv.imageset/device-tv@2x.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/tv.imageset/device-tv@2x.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/tv.imageset/device-tv@2x.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/tv.imageset/device-tv@2x.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/tv.imageset/device-tv@3x.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/tv.imageset/device-tv@3x.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/tv.imageset/device-tv@3x.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/tv.imageset/device-tv@3x.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/user_circle.imageset/Contents.json b/Core/DesignSystem/Resources/Assets.xcassets/Icons/user_circle.imageset/Contents.json
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/user_circle.imageset/Contents.json
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/user_circle.imageset/Contents.json
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/user_circle.imageset/profile-circle.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/user_circle.imageset/profile-circle.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/user_circle.imageset/profile-circle.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/user_circle.imageset/profile-circle.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/user_circle.imageset/profile-circle@2x.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/user_circle.imageset/profile-circle@2x.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/user_circle.imageset/profile-circle@2x.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/user_circle.imageset/profile-circle@2x.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/user_circle.imageset/profile-circle@3x.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/user_circle.imageset/profile-circle@3x.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/user_circle.imageset/profile-circle@3x.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/user_circle.imageset/profile-circle@3x.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/user_square.imageset/Contents.json b/Core/DesignSystem/Resources/Assets.xcassets/Icons/user_square.imageset/Contents.json
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/user_square.imageset/Contents.json
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/user_square.imageset/Contents.json
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/user_square.imageset/user-square.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/user_square.imageset/user-square.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/user_square.imageset/user-square.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/user_square.imageset/user-square.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/user_square.imageset/user-square@2x.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/user_square.imageset/user-square@2x.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/user_square.imageset/user-square@2x.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/user_square.imageset/user-square@2x.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/user_square.imageset/user-square@3x.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/user_square.imageset/user-square@3x.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/user_square.imageset/user-square@3x.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/user_square.imageset/user-square@3x.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/user_square_fill.imageset/Contents.json b/Core/DesignSystem/Resources/Assets.xcassets/Icons/user_square_fill.imageset/Contents.json
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/user_square_fill.imageset/Contents.json
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/user_square_fill.imageset/Contents.json
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/user_square_fill.imageset/user-square.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/user_square_fill.imageset/user-square.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/user_square_fill.imageset/user-square.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/user_square_fill.imageset/user-square.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/user_square_fill.imageset/user-square@2x.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/user_square_fill.imageset/user-square@2x.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/user_square_fill.imageset/user-square@2x.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/user_square_fill.imageset/user-square@2x.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/user_square_fill.imageset/user-square@3x.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/user_square_fill.imageset/user-square@3x.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/user_square_fill.imageset/user-square@3x.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/user_square_fill.imageset/user-square@3x.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/video.imageset/Contents.json b/Core/DesignSystem/Resources/Assets.xcassets/Icons/video.imageset/Contents.json
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/video.imageset/Contents.json
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/video.imageset/Contents.json
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/video.imageset/video.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/video.imageset/video.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/video.imageset/video.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/video.imageset/video.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/video.imageset/video@2x.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/video.imageset/video@2x.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/video.imageset/video@2x.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/video.imageset/video@2x.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/video.imageset/video@3x.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/video.imageset/video@3x.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/video.imageset/video@3x.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/video.imageset/video@3x.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/video_normal.imageset/Contents.json b/Core/DesignSystem/Resources/Assets.xcassets/Icons/video_normal.imageset/Contents.json
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/video_normal.imageset/Contents.json
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/video_normal.imageset/Contents.json
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/video_normal.imageset/video.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/video_normal.imageset/video.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/video_normal.imageset/video.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/video_normal.imageset/video.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/video_normal.imageset/video@2x.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/video_normal.imageset/video@2x.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/video_normal.imageset/video@2x.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/video_normal.imageset/video@2x.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/video_normal.imageset/video@3x.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/video_normal.imageset/video@3x.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/video_normal.imageset/video@3x.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/video_normal.imageset/video@3x.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/video-play.imageset/Contents.json b/Core/DesignSystem/Resources/Assets.xcassets/Icons/video_play.imageset/Contents.json
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/video-play.imageset/Contents.json
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/video_play.imageset/Contents.json
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/video-play.imageset/video-play.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/video_play.imageset/video-play.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/video-play.imageset/video-play.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/video_play.imageset/video-play.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/video-play.imageset/video-play@2x.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/video_play.imageset/video-play@2x.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/video-play.imageset/video-play@2x.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/video_play.imageset/video-play@2x.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/video-play.imageset/video-play@3x.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/video_play.imageset/video-play@3x.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/video-play.imageset/video-play@3x.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/video_play.imageset/video-play@3x.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/video_play.imageset/Contents.json b/Core/DesignSystem/Resources/Assets.xcassets/Icons/video_play_fill.imageset/Contents.json
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/video_play.imageset/Contents.json
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/video_play_fill.imageset/Contents.json
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/video_play_fill.imageset/video-play.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/video_play_fill.imageset/video-play.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/video_play_fill.imageset/video-play.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/video_play_fill.imageset/video-play.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/video_play_fill.imageset/video-play@2x.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/video_play_fill.imageset/video-play@2x.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/video_play_fill.imageset/video-play@2x.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/video_play_fill.imageset/video-play@2x.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/video_play_fill.imageset/video-play@3x.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/video_play_fill.imageset/video-play@3x.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/video_play_fill.imageset/video-play@3x.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/video_play_fill.imageset/video-play@3x.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/video_vertical.imageset/Contents.json b/Core/DesignSystem/Resources/Assets.xcassets/Icons/video_vertical.imageset/Contents.json
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/video_vertical.imageset/Contents.json
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/video_vertical.imageset/Contents.json
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/video_vertical.imageset/video-vertical.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/video_vertical.imageset/video-vertical.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/video_vertical.imageset/video-vertical.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/video_vertical.imageset/video-vertical.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/video_vertical.imageset/video-vertical@2x.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/video_vertical.imageset/video-vertical@2x.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/video_vertical.imageset/video-vertical@2x.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/video_vertical.imageset/video-vertical@2x.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/video_vertical.imageset/video-vertical@3x.png b/Core/DesignSystem/Resources/Assets.xcassets/Icons/video_vertical.imageset/video-vertical@3x.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/video_vertical.imageset/video-vertical@3x.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Icons/video_vertical.imageset/video-vertical@3x.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Images/Contents.json b/Core/DesignSystem/Resources/Assets.xcassets/Images/Contents.json
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Images/Contents.json
rename to Core/DesignSystem/Resources/Assets.xcassets/Images/Contents.json
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Images/auth_circles.imageset/Contents.json b/Core/DesignSystem/Resources/Assets.xcassets/Images/auth_circles.imageset/Contents.json
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Images/auth_circles.imageset/Contents.json
rename to Core/DesignSystem/Resources/Assets.xcassets/Images/auth_circles.imageset/Contents.json
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Images/auth_circles.imageset/background circles 1.png b/Core/DesignSystem/Resources/Assets.xcassets/Images/auth_circles.imageset/background circles 1.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Images/auth_circles.imageset/background circles 1.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Images/auth_circles.imageset/background circles 1.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Images/auth_circles.imageset/background circles.png b/Core/DesignSystem/Resources/Assets.xcassets/Images/auth_circles.imageset/background circles.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Images/auth_circles.imageset/background circles.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Images/auth_circles.imageset/background circles.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Images/auth_circles.imageset/background circles@2x 1.png b/Core/DesignSystem/Resources/Assets.xcassets/Images/auth_circles.imageset/background circles@2x 1.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Images/auth_circles.imageset/background circles@2x 1.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Images/auth_circles.imageset/background circles@2x 1.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Images/auth_circles.imageset/background circles@2x.png b/Core/DesignSystem/Resources/Assets.xcassets/Images/auth_circles.imageset/background circles@2x.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Images/auth_circles.imageset/background circles@2x.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Images/auth_circles.imageset/background circles@2x.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Images/auth_circles.imageset/background circles@3x 1.png b/Core/DesignSystem/Resources/Assets.xcassets/Images/auth_circles.imageset/background circles@3x 1.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Images/auth_circles.imageset/background circles@3x 1.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Images/auth_circles.imageset/background circles@3x 1.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Images/auth_circles.imageset/background circles@3x.png b/Core/DesignSystem/Resources/Assets.xcassets/Images/auth_circles.imageset/background circles@3x.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Images/auth_circles.imageset/background circles@3x.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Images/auth_circles.imageset/background circles@3x.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Images/cast_placeholder.imageset/Contents.json b/Core/DesignSystem/Resources/Assets.xcassets/Images/cast_placeholder.imageset/Contents.json
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Images/cast_placeholder.imageset/Contents.json
rename to Core/DesignSystem/Resources/Assets.xcassets/Images/cast_placeholder.imageset/Contents.json
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Images/cast_placeholder.imageset/profile-circle.png b/Core/DesignSystem/Resources/Assets.xcassets/Images/cast_placeholder.imageset/profile-circle.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Images/cast_placeholder.imageset/profile-circle.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Images/cast_placeholder.imageset/profile-circle.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Images/cast_placeholder.imageset/profile-circle@2x.png b/Core/DesignSystem/Resources/Assets.xcassets/Images/cast_placeholder.imageset/profile-circle@2x.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Images/cast_placeholder.imageset/profile-circle@2x.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Images/cast_placeholder.imageset/profile-circle@2x.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Images/cast_placeholder.imageset/profile-circle@3x.png b/Core/DesignSystem/Resources/Assets.xcassets/Images/cast_placeholder.imageset/profile-circle@3x.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Images/cast_placeholder.imageset/profile-circle@3x.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Images/cast_placeholder.imageset/profile-circle@3x.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Images/logo_dark.imageset/Contents.json b/Core/DesignSystem/Resources/Assets.xcassets/Images/logo_dark.imageset/Contents.json
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Images/logo_dark.imageset/Contents.json
rename to Core/DesignSystem/Resources/Assets.xcassets/Images/logo_dark.imageset/Contents.json
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Images/logo_dark.imageset/logo.png b/Core/DesignSystem/Resources/Assets.xcassets/Images/logo_dark.imageset/logo.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Images/logo_dark.imageset/logo.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Images/logo_dark.imageset/logo.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Images/logo_dark.imageset/logo@2x.png b/Core/DesignSystem/Resources/Assets.xcassets/Images/logo_dark.imageset/logo@2x.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Images/logo_dark.imageset/logo@2x.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Images/logo_dark.imageset/logo@2x.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Images/logo_dark.imageset/logo@3x.png b/Core/DesignSystem/Resources/Assets.xcassets/Images/logo_dark.imageset/logo@3x.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Images/logo_dark.imageset/logo@3x.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Images/logo_dark.imageset/logo@3x.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Images/logo_light.imageset/Contents.json b/Core/DesignSystem/Resources/Assets.xcassets/Images/logo_light.imageset/Contents.json
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Images/logo_light.imageset/Contents.json
rename to Core/DesignSystem/Resources/Assets.xcassets/Images/logo_light.imageset/Contents.json
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Images/logo_light.imageset/logo.png b/Core/DesignSystem/Resources/Assets.xcassets/Images/logo_light.imageset/logo.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Images/logo_light.imageset/logo.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Images/logo_light.imageset/logo.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Images/logo_light.imageset/logo@2x.png b/Core/DesignSystem/Resources/Assets.xcassets/Images/logo_light.imageset/logo@2x.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Images/logo_light.imageset/logo@2x.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Images/logo_light.imageset/logo@2x.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Images/logo_light.imageset/logo@3x.png b/Core/DesignSystem/Resources/Assets.xcassets/Images/logo_light.imageset/logo@3x.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Images/logo_light.imageset/logo@3x.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Images/logo_light.imageset/logo@3x.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Images/onboarding_first.imageset/Contents.json b/Core/DesignSystem/Resources/Assets.xcassets/Images/onboarding_first.imageset/Contents.json
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Images/onboarding_first.imageset/Contents.json
rename to Core/DesignSystem/Resources/Assets.xcassets/Images/onboarding_first.imageset/Contents.json
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Images/onboarding_first.imageset/background.png b/Core/DesignSystem/Resources/Assets.xcassets/Images/onboarding_first.imageset/background.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Images/onboarding_first.imageset/background.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Images/onboarding_first.imageset/background.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Images/onboarding_first.imageset/background@2x.png b/Core/DesignSystem/Resources/Assets.xcassets/Images/onboarding_first.imageset/background@2x.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Images/onboarding_first.imageset/background@2x.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Images/onboarding_first.imageset/background@2x.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Images/onboarding_first.imageset/background@3x.png b/Core/DesignSystem/Resources/Assets.xcassets/Images/onboarding_first.imageset/background@3x.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Images/onboarding_first.imageset/background@3x.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Images/onboarding_first.imageset/background@3x.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Images/onboarding_fourth.imageset/Contents.json b/Core/DesignSystem/Resources/Assets.xcassets/Images/onboarding_fourth.imageset/Contents.json
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Images/onboarding_fourth.imageset/Contents.json
rename to Core/DesignSystem/Resources/Assets.xcassets/Images/onboarding_fourth.imageset/Contents.json
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Images/onboarding_fourth.imageset/Frame 2.png b/Core/DesignSystem/Resources/Assets.xcassets/Images/onboarding_fourth.imageset/Frame 2.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Images/onboarding_fourth.imageset/Frame 2.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Images/onboarding_fourth.imageset/Frame 2.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Images/onboarding_fourth.imageset/Frame 2@2x.png b/Core/DesignSystem/Resources/Assets.xcassets/Images/onboarding_fourth.imageset/Frame 2@2x.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Images/onboarding_fourth.imageset/Frame 2@2x.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Images/onboarding_fourth.imageset/Frame 2@2x.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Images/onboarding_fourth.imageset/Frame 2@3x.png b/Core/DesignSystem/Resources/Assets.xcassets/Images/onboarding_fourth.imageset/Frame 2@3x.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Images/onboarding_fourth.imageset/Frame 2@3x.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Images/onboarding_fourth.imageset/Frame 2@3x.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Images/onboarding_second.imageset/Contents.json b/Core/DesignSystem/Resources/Assets.xcassets/Images/onboarding_second.imageset/Contents.json
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Images/onboarding_second.imageset/Contents.json
rename to Core/DesignSystem/Resources/Assets.xcassets/Images/onboarding_second.imageset/Contents.json
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Images/onboarding_second.imageset/background.png b/Core/DesignSystem/Resources/Assets.xcassets/Images/onboarding_second.imageset/background.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Images/onboarding_second.imageset/background.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Images/onboarding_second.imageset/background.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Images/onboarding_second.imageset/background@2x.png b/Core/DesignSystem/Resources/Assets.xcassets/Images/onboarding_second.imageset/background@2x.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Images/onboarding_second.imageset/background@2x.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Images/onboarding_second.imageset/background@2x.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Images/onboarding_second.imageset/background@3x.png b/Core/DesignSystem/Resources/Assets.xcassets/Images/onboarding_second.imageset/background@3x.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Images/onboarding_second.imageset/background@3x.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Images/onboarding_second.imageset/background@3x.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Images/onboarding_third.imageset/Contents.json b/Core/DesignSystem/Resources/Assets.xcassets/Images/onboarding_third.imageset/Contents.json
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Images/onboarding_third.imageset/Contents.json
rename to Core/DesignSystem/Resources/Assets.xcassets/Images/onboarding_third.imageset/Contents.json
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Images/onboarding_third.imageset/background.png b/Core/DesignSystem/Resources/Assets.xcassets/Images/onboarding_third.imageset/background.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Images/onboarding_third.imageset/background.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Images/onboarding_third.imageset/background.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Images/onboarding_third.imageset/background@2x.png b/Core/DesignSystem/Resources/Assets.xcassets/Images/onboarding_third.imageset/background@2x.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Images/onboarding_third.imageset/background@2x.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Images/onboarding_third.imageset/background@2x.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Images/onboarding_third.imageset/background@3x.png b/Core/DesignSystem/Resources/Assets.xcassets/Images/onboarding_third.imageset/background@3x.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Images/onboarding_third.imageset/background@3x.png
rename to Core/DesignSystem/Resources/Assets.xcassets/Images/onboarding_third.imageset/background@3x.png
diff --git a/DesignSystem/Sources/DesignSystem/ButtonStyle/CircleButtonStyle.swift b/Core/DesignSystem/Sources/ButtonStyle/CircleButtonStyle.swift
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/ButtonStyle/CircleButtonStyle.swift
rename to Core/DesignSystem/Sources/ButtonStyle/CircleButtonStyle.swift
diff --git a/DesignSystem/Sources/DesignSystem/ButtonStyle/PrimaryButtonStyle.swift b/Core/DesignSystem/Sources/ButtonStyle/PrimaryButtonStyle.swift
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/ButtonStyle/PrimaryButtonStyle.swift
rename to Core/DesignSystem/Sources/ButtonStyle/PrimaryButtonStyle.swift
diff --git a/DesignSystem/Sources/DesignSystem/ButtonStyle/ScaledButtonStyle.swift b/Core/DesignSystem/Sources/ButtonStyle/ScaledButtonStyle.swift
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/ButtonStyle/ScaledButtonStyle.swift
rename to Core/DesignSystem/Sources/ButtonStyle/ScaledButtonStyle.swift
diff --git a/DesignSystem/Sources/DesignSystem/Extensions/Color.swift b/Core/DesignSystem/Sources/Extensions/Color.swift
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Extensions/Color.swift
rename to Core/DesignSystem/Sources/Extensions/Color.swift
diff --git a/DesignSystem/Sources/DesignSystem/Extensions/Image.swift b/Core/DesignSystem/Sources/Extensions/Image.swift
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Extensions/Image.swift
rename to Core/DesignSystem/Sources/Extensions/Image.swift
diff --git a/DesignSystem/Sources/DesignSystem/Extensions/LinearGradient.swift b/Core/DesignSystem/Sources/Extensions/LinearGradient.swift
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Extensions/LinearGradient.swift
rename to Core/DesignSystem/Sources/Extensions/LinearGradient.swift
diff --git a/Flick/Preview Content/Preview Assets.xcassets/Contents.json b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Colors/Contents.json
similarity index 100%
rename from Flick/Preview Content/Preview Assets.xcassets/Contents.json
rename to Core/DesignSystem/Sources/Resources/Assets.xcassets/Colors/Contents.json
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Colors/flDark.colorset/Contents.json b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Colors/flDark.colorset/Contents.json
new file mode 100644
index 0000000..2183b19
--- /dev/null
+++ b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Colors/flDark.colorset/Contents.json
@@ -0,0 +1,38 @@
+{
+ "colors" : [
+ {
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "alpha" : "1.000",
+ "blue" : "0.204",
+ "green" : "0.125",
+ "red" : "0.122"
+ }
+ },
+ "idiom" : "universal"
+ },
+ {
+ "appearances" : [
+ {
+ "appearance" : "luminosity",
+ "value" : "dark"
+ }
+ ],
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "alpha" : "1.000",
+ "blue" : "0.204",
+ "green" : "0.125",
+ "red" : "0.122"
+ }
+ },
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Colors/flGradientMain.colorset/Contents.json b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Colors/flGradientMain.colorset/Contents.json
new file mode 100644
index 0000000..f1b4d97
--- /dev/null
+++ b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Colors/flGradientMain.colorset/Contents.json
@@ -0,0 +1,38 @@
+{
+ "colors" : [
+ {
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "alpha" : "1.000",
+ "blue" : "0.961",
+ "green" : "0.953",
+ "red" : "0.953"
+ }
+ },
+ "idiom" : "universal"
+ },
+ {
+ "appearances" : [
+ {
+ "appearance" : "luminosity",
+ "value" : "dark"
+ }
+ ],
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "alpha" : "1.000",
+ "blue" : "0.294",
+ "green" : "0.161",
+ "red" : "0.153"
+ }
+ },
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Colors/flGray.colorset/Contents.json b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Colors/flGray.colorset/Contents.json
new file mode 100644
index 0000000..0135e74
--- /dev/null
+++ b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Colors/flGray.colorset/Contents.json
@@ -0,0 +1,38 @@
+{
+ "colors" : [
+ {
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "alpha" : "1.000",
+ "blue" : "0.380",
+ "green" : "0.349",
+ "red" : "0.349"
+ }
+ },
+ "idiom" : "universal"
+ },
+ {
+ "appearances" : [
+ {
+ "appearance" : "luminosity",
+ "value" : "dark"
+ }
+ ],
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "alpha" : "1.000",
+ "blue" : "0.867",
+ "green" : "0.827",
+ "red" : "0.827"
+ }
+ },
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Colors/flGreen.colorset/Contents.json b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Colors/flGreen.colorset/Contents.json
new file mode 100644
index 0000000..0383397
--- /dev/null
+++ b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Colors/flGreen.colorset/Contents.json
@@ -0,0 +1,38 @@
+{
+ "colors" : [
+ {
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "alpha" : "1.000",
+ "blue" : "0.298",
+ "green" : "0.757",
+ "red" : "0.247"
+ }
+ },
+ "idiom" : "universal"
+ },
+ {
+ "appearances" : [
+ {
+ "appearance" : "luminosity",
+ "value" : "dark"
+ }
+ ],
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "alpha" : "1.000",
+ "blue" : "0.298",
+ "green" : "0.757",
+ "red" : "0.247"
+ }
+ },
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Colors/flMain.colorset/Contents.json b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Colors/flMain.colorset/Contents.json
new file mode 100644
index 0000000..23f0c0c
--- /dev/null
+++ b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Colors/flMain.colorset/Contents.json
@@ -0,0 +1,38 @@
+{
+ "colors" : [
+ {
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "alpha" : "1.000",
+ "blue" : "1.000",
+ "green" : "1.000",
+ "red" : "1.000"
+ }
+ },
+ "idiom" : "universal"
+ },
+ {
+ "appearances" : [
+ {
+ "appearance" : "luminosity",
+ "value" : "dark"
+ }
+ ],
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "alpha" : "1.000",
+ "blue" : "0.204",
+ "green" : "0.125",
+ "red" : "0.122"
+ }
+ },
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Colors/flMainPink.colorset/Contents.json b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Colors/flMainPink.colorset/Contents.json
new file mode 100644
index 0000000..06fed43
--- /dev/null
+++ b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Colors/flMainPink.colorset/Contents.json
@@ -0,0 +1,38 @@
+{
+ "colors" : [
+ {
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "alpha" : "1.000",
+ "blue" : "0.471",
+ "green" : "0.290",
+ "red" : "0.988"
+ }
+ },
+ "idiom" : "universal"
+ },
+ {
+ "appearances" : [
+ {
+ "appearance" : "luminosity",
+ "value" : "dark"
+ }
+ ],
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "alpha" : "1.000",
+ "blue" : "0.471",
+ "green" : "0.290",
+ "red" : "0.988"
+ }
+ },
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Colors/flOnboardBlue.colorset/Contents.json b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Colors/flOnboardBlue.colorset/Contents.json
new file mode 100644
index 0000000..cb9ad5a
--- /dev/null
+++ b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Colors/flOnboardBlue.colorset/Contents.json
@@ -0,0 +1,38 @@
+{
+ "colors" : [
+ {
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "alpha" : "1.000",
+ "blue" : "1.000",
+ "green" : "0.761",
+ "red" : "0.337"
+ }
+ },
+ "idiom" : "universal"
+ },
+ {
+ "appearances" : [
+ {
+ "appearance" : "luminosity",
+ "value" : "dark"
+ }
+ ],
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "alpha" : "1.000",
+ "blue" : "1.000",
+ "green" : "0.761",
+ "red" : "0.337"
+ }
+ },
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Colors/flOnboardOrange.colorset/Contents.json b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Colors/flOnboardOrange.colorset/Contents.json
new file mode 100644
index 0000000..ecc43a5
--- /dev/null
+++ b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Colors/flOnboardOrange.colorset/Contents.json
@@ -0,0 +1,38 @@
+{
+ "colors" : [
+ {
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "alpha" : "1.000",
+ "blue" : "0.349",
+ "green" : "0.467",
+ "red" : "1.000"
+ }
+ },
+ "idiom" : "universal"
+ },
+ {
+ "appearances" : [
+ {
+ "appearance" : "luminosity",
+ "value" : "dark"
+ }
+ ],
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "alpha" : "1.000",
+ "blue" : "0.349",
+ "green" : "0.467",
+ "red" : "1.000"
+ }
+ },
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Colors/flOnboardYellow.colorset/Contents.json b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Colors/flOnboardYellow.colorset/Contents.json
new file mode 100644
index 0000000..b7b3f33
--- /dev/null
+++ b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Colors/flOnboardYellow.colorset/Contents.json
@@ -0,0 +1,38 @@
+{
+ "colors" : [
+ {
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "alpha" : "1.000",
+ "blue" : "0.192",
+ "green" : "0.773",
+ "red" : "1.000"
+ }
+ },
+ "idiom" : "universal"
+ },
+ {
+ "appearances" : [
+ {
+ "appearance" : "luminosity",
+ "value" : "dark"
+ }
+ ],
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "alpha" : "1.000",
+ "blue" : "0.192",
+ "green" : "0.773",
+ "red" : "1.000"
+ }
+ },
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Colors/flPink10.colorset/Contents.json b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Colors/flPink10.colorset/Contents.json
new file mode 100644
index 0000000..49849ce
--- /dev/null
+++ b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Colors/flPink10.colorset/Contents.json
@@ -0,0 +1,38 @@
+{
+ "colors" : [
+ {
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "alpha" : "1.000",
+ "blue" : "0.933",
+ "green" : "0.914",
+ "red" : "0.984"
+ }
+ },
+ "idiom" : "universal"
+ },
+ {
+ "appearances" : [
+ {
+ "appearance" : "luminosity",
+ "value" : "dark"
+ }
+ ],
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "alpha" : "1.000",
+ "blue" : "0.278",
+ "green" : "0.165",
+ "red" : "0.227"
+ }
+ },
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Colors/flPink20.colorset/Contents.json b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Colors/flPink20.colorset/Contents.json
new file mode 100644
index 0000000..08deae2
--- /dev/null
+++ b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Colors/flPink20.colorset/Contents.json
@@ -0,0 +1,38 @@
+{
+ "colors" : [
+ {
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "alpha" : "1.000",
+ "blue" : "0.878",
+ "green" : "0.839",
+ "red" : "0.980"
+ }
+ },
+ "idiom" : "universal"
+ },
+ {
+ "appearances" : [
+ {
+ "appearance" : "luminosity",
+ "value" : "dark"
+ }
+ ],
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "alpha" : "1.000",
+ "blue" : "0.294",
+ "green" : "0.173",
+ "red" : "0.306"
+ }
+ },
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Colors/flPink40.colorset/Contents.json b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Colors/flPink40.colorset/Contents.json
new file mode 100644
index 0000000..e27fbec
--- /dev/null
+++ b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Colors/flPink40.colorset/Contents.json
@@ -0,0 +1,38 @@
+{
+ "colors" : [
+ {
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "alpha" : "1.000",
+ "blue" : "0.776",
+ "green" : "0.702",
+ "red" : "0.984"
+ }
+ },
+ "idiom" : "universal"
+ },
+ {
+ "appearances" : [
+ {
+ "appearance" : "luminosity",
+ "value" : "dark"
+ }
+ ],
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "alpha" : "1.000",
+ "blue" : "0.337",
+ "green" : "0.200",
+ "red" : "0.475"
+ }
+ },
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Colors/flPink60.colorset/Contents.json b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Colors/flPink60.colorset/Contents.json
new file mode 100644
index 0000000..d69354d
--- /dev/null
+++ b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Colors/flPink60.colorset/Contents.json
@@ -0,0 +1,38 @@
+{
+ "colors" : [
+ {
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "alpha" : "1.000",
+ "blue" : "0.675",
+ "green" : "0.565",
+ "red" : "0.984"
+ }
+ },
+ "idiom" : "universal"
+ },
+ {
+ "appearances" : [
+ {
+ "appearance" : "luminosity",
+ "value" : "dark"
+ }
+ ],
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "alpha" : "1.000",
+ "blue" : "0.376",
+ "green" : "0.227",
+ "red" : "0.647"
+ }
+ },
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Colors/flPink80.colorset/Contents.json b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Colors/flPink80.colorset/Contents.json
new file mode 100644
index 0000000..e4d084c
--- /dev/null
+++ b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Colors/flPink80.colorset/Contents.json
@@ -0,0 +1,38 @@
+{
+ "colors" : [
+ {
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "alpha" : "1.000",
+ "blue" : "0.573",
+ "green" : "0.427",
+ "red" : "0.984"
+ }
+ },
+ "idiom" : "universal"
+ },
+ {
+ "appearances" : [
+ {
+ "appearance" : "luminosity",
+ "value" : "dark"
+ }
+ ],
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "alpha" : "1.000",
+ "blue" : "0.424",
+ "green" : "0.259",
+ "red" : "0.816"
+ }
+ },
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Colors/flPurpleLight.colorset/Contents.json b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Colors/flPurpleLight.colorset/Contents.json
new file mode 100644
index 0000000..c7a8cba
--- /dev/null
+++ b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Colors/flPurpleLight.colorset/Contents.json
@@ -0,0 +1,38 @@
+{
+ "colors" : [
+ {
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "alpha" : "1.000",
+ "blue" : "205",
+ "green" : "174",
+ "red" : "173"
+ }
+ },
+ "idiom" : "universal"
+ },
+ {
+ "appearances" : [
+ {
+ "appearance" : "luminosity",
+ "value" : "dark"
+ }
+ ],
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "alpha" : "1.000",
+ "blue" : "0xA6",
+ "green" : "0x75",
+ "red" : "0x72"
+ }
+ },
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Colors/flRedacted.colorset/Contents.json b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Colors/flRedacted.colorset/Contents.json
new file mode 100644
index 0000000..ef0396f
--- /dev/null
+++ b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Colors/flRedacted.colorset/Contents.json
@@ -0,0 +1,38 @@
+{
+ "colors" : [
+ {
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "alpha" : "1.000",
+ "blue" : "1.000",
+ "green" : "1.000",
+ "red" : "1.000"
+ }
+ },
+ "idiom" : "universal"
+ },
+ {
+ "appearances" : [
+ {
+ "appearance" : "luminosity",
+ "value" : "dark"
+ }
+ ],
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "alpha" : "0.100",
+ "blue" : "1.000",
+ "green" : "1.000",
+ "red" : "1.000"
+ }
+ },
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Colors/flSecondary.colorset/Contents.json b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Colors/flSecondary.colorset/Contents.json
new file mode 100644
index 0000000..81e4e88
--- /dev/null
+++ b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Colors/flSecondary.colorset/Contents.json
@@ -0,0 +1,38 @@
+{
+ "colors" : [
+ {
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "alpha" : "1.000",
+ "blue" : "0.965",
+ "green" : "0.965",
+ "red" : "0.965"
+ }
+ },
+ "idiom" : "universal"
+ },
+ {
+ "appearances" : [
+ {
+ "appearance" : "luminosity",
+ "value" : "dark"
+ }
+ ],
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "alpha" : "1.000",
+ "blue" : "0.231",
+ "green" : "0.165",
+ "red" : "0.161"
+ }
+ },
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Colors/flStarYellow.colorset/Contents.json b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Colors/flStarYellow.colorset/Contents.json
new file mode 100644
index 0000000..85a14b7
--- /dev/null
+++ b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Colors/flStarYellow.colorset/Contents.json
@@ -0,0 +1,38 @@
+{
+ "colors" : [
+ {
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "alpha" : "1.000",
+ "blue" : "0.145",
+ "green" : "0.710",
+ "red" : "1.000"
+ }
+ },
+ "idiom" : "universal"
+ },
+ {
+ "appearances" : [
+ {
+ "appearance" : "luminosity",
+ "value" : "dark"
+ }
+ ],
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "alpha" : "1.000",
+ "blue" : "0.145",
+ "green" : "0.710",
+ "red" : "1.000"
+ }
+ },
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Colors/flSystemBlue.colorset/Contents.json b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Colors/flSystemBlue.colorset/Contents.json
new file mode 100644
index 0000000..805e831
--- /dev/null
+++ b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Colors/flSystemBlue.colorset/Contents.json
@@ -0,0 +1,38 @@
+{
+ "colors" : [
+ {
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "alpha" : "1.000",
+ "blue" : "1.000",
+ "green" : "0.478",
+ "red" : "0.000"
+ }
+ },
+ "idiom" : "universal"
+ },
+ {
+ "appearances" : [
+ {
+ "appearance" : "luminosity",
+ "value" : "dark"
+ }
+ ],
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "alpha" : "1.000",
+ "blue" : "1.000",
+ "green" : "0.478",
+ "red" : "0.000"
+ }
+ },
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Colors/flSystemRed.colorset/Contents.json b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Colors/flSystemRed.colorset/Contents.json
new file mode 100644
index 0000000..4eb43a8
--- /dev/null
+++ b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Colors/flSystemRed.colorset/Contents.json
@@ -0,0 +1,38 @@
+{
+ "colors" : [
+ {
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "alpha" : "1.000",
+ "blue" : "0.153",
+ "green" : "0.071",
+ "red" : "0.894"
+ }
+ },
+ "idiom" : "universal"
+ },
+ {
+ "appearances" : [
+ {
+ "appearance" : "luminosity",
+ "value" : "dark"
+ }
+ ],
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "alpha" : "1.000",
+ "blue" : "0.153",
+ "green" : "0.071",
+ "red" : "0.894"
+ }
+ },
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Colors/flText.colorset/Contents.json b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Colors/flText.colorset/Contents.json
new file mode 100644
index 0000000..b8297e3
--- /dev/null
+++ b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Colors/flText.colorset/Contents.json
@@ -0,0 +1,38 @@
+{
+ "colors" : [
+ {
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "alpha" : "1.000",
+ "blue" : "0.204",
+ "green" : "0.125",
+ "red" : "0.122"
+ }
+ },
+ "idiom" : "universal"
+ },
+ {
+ "appearances" : [
+ {
+ "appearance" : "luminosity",
+ "value" : "dark"
+ }
+ ],
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "alpha" : "1.000",
+ "blue" : "1.000",
+ "green" : "1.000",
+ "red" : "1.000"
+ }
+ },
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Colors/flWhite.colorset/Contents.json b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Colors/flWhite.colorset/Contents.json
new file mode 100644
index 0000000..22c4bb0
--- /dev/null
+++ b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Colors/flWhite.colorset/Contents.json
@@ -0,0 +1,38 @@
+{
+ "colors" : [
+ {
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "alpha" : "1.000",
+ "blue" : "1.000",
+ "green" : "1.000",
+ "red" : "1.000"
+ }
+ },
+ "idiom" : "universal"
+ },
+ {
+ "appearances" : [
+ {
+ "appearance" : "luminosity",
+ "value" : "dark"
+ }
+ ],
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "alpha" : "1.000",
+ "blue" : "1.000",
+ "green" : "1.000",
+ "red" : "1.000"
+ }
+ },
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Contents.json b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Contents.json
new file mode 100644
index 0000000..73c0059
--- /dev/null
+++ b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Contents.json
@@ -0,0 +1,6 @@
+{
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/Contents.json b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/Contents.json
new file mode 100644
index 0000000..73c0059
--- /dev/null
+++ b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/Contents.json
@@ -0,0 +1,6 @@
+{
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/arrow_down.imageset/Contents.json b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/arrow_down.imageset/Contents.json
new file mode 100644
index 0000000..78104a1
--- /dev/null
+++ b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/arrow_down.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "filename" : "arrow-down.png",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "filename" : "arrow-down@2x.png",
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "filename" : "arrow-down@3x.png",
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/arrow_down.imageset/arrow-down.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/arrow_down.imageset/arrow-down.png
new file mode 100644
index 0000000..aad229e
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/arrow_down.imageset/arrow-down.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/arrow_down.imageset/arrow-down@2x.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/arrow_down.imageset/arrow-down@2x.png
new file mode 100644
index 0000000..416e0b0
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/arrow_down.imageset/arrow-down@2x.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/arrow_down.imageset/arrow-down@3x.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/arrow_down.imageset/arrow-down@3x.png
new file mode 100644
index 0000000..b9fc01d
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/arrow_down.imageset/arrow-down@3x.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/arrow_left.imageset/Contents.json b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/arrow_left.imageset/Contents.json
new file mode 100644
index 0000000..e879996
--- /dev/null
+++ b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/arrow_left.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "filename" : "arrow-left.png",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "filename" : "arrow-left@2x.png",
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "filename" : "arrow-left@3x.png",
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/arrow_left.imageset/arrow-left.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/arrow_left.imageset/arrow-left.png
new file mode 100644
index 0000000..6e518f1
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/arrow_left.imageset/arrow-left.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/arrow_left.imageset/arrow-left@2x.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/arrow_left.imageset/arrow-left@2x.png
new file mode 100644
index 0000000..ab9c1ec
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/arrow_left.imageset/arrow-left@2x.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/arrow_left.imageset/arrow-left@3x.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/arrow_left.imageset/arrow-left@3x.png
new file mode 100644
index 0000000..a858fb4
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/arrow_left.imageset/arrow-left@3x.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/arrow_right.imageset/Contents.json b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/arrow_right.imageset/Contents.json
new file mode 100644
index 0000000..8f8e6a2
--- /dev/null
+++ b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/arrow_right.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "filename" : "arrow-right.png",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "filename" : "arrow-right@2x.png",
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "filename" : "arrow-right@3x.png",
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/arrow_right.imageset/arrow-right.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/arrow_right.imageset/arrow-right.png
new file mode 100644
index 0000000..c2be5a5
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/arrow_right.imageset/arrow-right.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/arrow_right.imageset/arrow-right@2x.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/arrow_right.imageset/arrow-right@2x.png
new file mode 100644
index 0000000..ca21f80
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/arrow_right.imageset/arrow-right@2x.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/arrow_right.imageset/arrow-right@3x.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/arrow_right.imageset/arrow-right@3x.png
new file mode 100644
index 0000000..4c76383
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/arrow_right.imageset/arrow-right@3x.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/arrow_up.imageset/Contents.json b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/arrow_up.imageset/Contents.json
new file mode 100644
index 0000000..93ed2b1
--- /dev/null
+++ b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/arrow_up.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "filename" : "arrow-up.png",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "filename" : "arrow-up@2x.png",
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "filename" : "arrow-up@3x.png",
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/arrow_up.imageset/arrow-up.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/arrow_up.imageset/arrow-up.png
new file mode 100644
index 0000000..282ca6f
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/arrow_up.imageset/arrow-up.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/arrow_up.imageset/arrow-up@2x.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/arrow_up.imageset/arrow-up@2x.png
new file mode 100644
index 0000000..72832db
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/arrow_up.imageset/arrow-up@2x.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/arrow_up.imageset/arrow-up@3x.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/arrow_up.imageset/arrow-up@3x.png
new file mode 100644
index 0000000..9706de9
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/arrow_up.imageset/arrow-up@3x.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/camera.imageset/Contents.json b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/camera.imageset/Contents.json
new file mode 100644
index 0000000..628217b
--- /dev/null
+++ b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/camera.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "filename" : "camera.png",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "filename" : "camera@2x.png",
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "filename" : "camera@3x.png",
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/camera.imageset/camera.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/camera.imageset/camera.png
new file mode 100644
index 0000000..07388c7
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/camera.imageset/camera.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/camera.imageset/camera@2x.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/camera.imageset/camera@2x.png
new file mode 100644
index 0000000..0b498e4
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/camera.imageset/camera@2x.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/camera.imageset/camera@3x.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/camera.imageset/camera@3x.png
new file mode 100644
index 0000000..54e69ab
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/camera.imageset/camera@3x.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/camera_normal.imageset/Contents.json b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/camera_normal.imageset/Contents.json
new file mode 100644
index 0000000..628217b
--- /dev/null
+++ b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/camera_normal.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "filename" : "camera.png",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "filename" : "camera@2x.png",
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "filename" : "camera@3x.png",
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/camera_normal.imageset/camera.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/camera_normal.imageset/camera.png
new file mode 100644
index 0000000..202a011
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/camera_normal.imageset/camera.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/camera_normal.imageset/camera@2x.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/camera_normal.imageset/camera@2x.png
new file mode 100644
index 0000000..2fe59d4
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/camera_normal.imageset/camera@2x.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/camera_normal.imageset/camera@3x.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/camera_normal.imageset/camera@3x.png
new file mode 100644
index 0000000..5edd75c
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/camera_normal.imageset/camera@3x.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/close.imageset/Contents.json b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/close.imageset/Contents.json
new file mode 100644
index 0000000..940a6d1
--- /dev/null
+++ b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/close.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "filename" : "close.png",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "filename" : "close@2x.png",
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "filename" : "close@3x.png",
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/close.imageset/close.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/close.imageset/close.png
new file mode 100644
index 0000000..235229e
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/close.imageset/close.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/close.imageset/close@2x.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/close.imageset/close@2x.png
new file mode 100644
index 0000000..f82df6a
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/close.imageset/close@2x.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/close.imageset/close@3x.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/close.imageset/close@3x.png
new file mode 100644
index 0000000..47d1910
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/close.imageset/close@3x.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/close_normal.imageset/Contents.json b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/close_normal.imageset/Contents.json
new file mode 100644
index 0000000..940a6d1
--- /dev/null
+++ b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/close_normal.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "filename" : "close.png",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "filename" : "close@2x.png",
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "filename" : "close@3x.png",
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/close_normal.imageset/close.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/close_normal.imageset/close.png
new file mode 100644
index 0000000..b2e6a4a
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/close_normal.imageset/close.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/close_normal.imageset/close@2x.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/close_normal.imageset/close@2x.png
new file mode 100644
index 0000000..31801a8
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/close_normal.imageset/close@2x.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/close_normal.imageset/close@3x.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/close_normal.imageset/close@3x.png
new file mode 100644
index 0000000..059069a
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/close_normal.imageset/close@3x.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/edit.imageset/Contents.json b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/edit.imageset/Contents.json
new file mode 100644
index 0000000..3719cf6
--- /dev/null
+++ b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/edit.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "filename" : "edit.png",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "filename" : "edit@2x.png",
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "filename" : "edit@3x.png",
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/edit.imageset/edit.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/edit.imageset/edit.png
new file mode 100644
index 0000000..655e34e
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/edit.imageset/edit.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/edit.imageset/edit@2x.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/edit.imageset/edit@2x.png
new file mode 100644
index 0000000..59fd30a
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/edit.imageset/edit@2x.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/edit.imageset/edit@3x.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/edit.imageset/edit@3x.png
new file mode 100644
index 0000000..ba2d184
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/edit.imageset/edit@3x.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/eye.imageset/Contents.json b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/eye.imageset/Contents.json
new file mode 100644
index 0000000..6cd7cfd
--- /dev/null
+++ b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/eye.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "filename" : "eye.png",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "filename" : "eye@2x.png",
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "filename" : "eye@3x.png",
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/eye.imageset/eye.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/eye.imageset/eye.png
new file mode 100644
index 0000000..1fbc152
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/eye.imageset/eye.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/eye.imageset/eye@2x.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/eye.imageset/eye@2x.png
new file mode 100644
index 0000000..85ecce1
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/eye.imageset/eye@2x.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/eye.imageset/eye@3x.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/eye.imageset/eye@3x.png
new file mode 100644
index 0000000..9d6981d
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/eye.imageset/eye@3x.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/eye_slash.imageset/Contents.json b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/eye_slash.imageset/Contents.json
new file mode 100644
index 0000000..1cd90a7
--- /dev/null
+++ b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/eye_slash.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "filename" : "eye-slash.png",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "filename" : "eye-slash@2x.png",
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "filename" : "eye-slash@3x.png",
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/eye_slash.imageset/eye-slash.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/eye_slash.imageset/eye-slash.png
new file mode 100644
index 0000000..7ada71d
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/eye_slash.imageset/eye-slash.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/eye_slash.imageset/eye-slash@2x.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/eye_slash.imageset/eye-slash@2x.png
new file mode 100644
index 0000000..f0430a8
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/eye_slash.imageset/eye-slash@2x.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/eye_slash.imageset/eye-slash@3x.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/eye_slash.imageset/eye-slash@3x.png
new file mode 100644
index 0000000..2af4e8b
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/eye_slash.imageset/eye-slash@3x.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/filter.imageset/Contents.json b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/filter.imageset/Contents.json
new file mode 100644
index 0000000..9added4
--- /dev/null
+++ b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/filter.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "filename" : "filter.png",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "filename" : "filter@2x.png",
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "filename" : "filter@3x.png",
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/filter.imageset/filter.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/filter.imageset/filter.png
new file mode 100644
index 0000000..e90a5fc
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/filter.imageset/filter.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/filter.imageset/filter@2x.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/filter.imageset/filter@2x.png
new file mode 100644
index 0000000..1b2369a
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/filter.imageset/filter@2x.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/filter.imageset/filter@3x.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/filter.imageset/filter@3x.png
new file mode 100644
index 0000000..d10060b
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/filter.imageset/filter@3x.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/filter_applied.imageset/Contents.json b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/filter_applied.imageset/Contents.json
new file mode 100644
index 0000000..1258ad2
--- /dev/null
+++ b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/filter_applied.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "filename" : "applied filter.png",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "filename" : "applied filter@2x.png",
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "filename" : "applied filter@3x.png",
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/filter_applied.imageset/applied filter.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/filter_applied.imageset/applied filter.png
new file mode 100644
index 0000000..4ea0e6f
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/filter_applied.imageset/applied filter.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/filter_applied.imageset/applied filter@2x.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/filter_applied.imageset/applied filter@2x.png
new file mode 100644
index 0000000..962ec11
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/filter_applied.imageset/applied filter@2x.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/filter_applied.imageset/applied filter@3x.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/filter_applied.imageset/applied filter@3x.png
new file mode 100644
index 0000000..277d40c
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/filter_applied.imageset/applied filter@3x.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/flick.imageset/Contents.json b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/flick.imageset/Contents.json
new file mode 100644
index 0000000..48896be
--- /dev/null
+++ b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/flick.imageset/Contents.json
@@ -0,0 +1,56 @@
+{
+ "images" : [
+ {
+ "filename" : "Flick it.png",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "appearances" : [
+ {
+ "appearance" : "luminosity",
+ "value" : "dark"
+ }
+ ],
+ "filename" : "Flick it 1.png",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "filename" : "Flick it@2x.png",
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "appearances" : [
+ {
+ "appearance" : "luminosity",
+ "value" : "dark"
+ }
+ ],
+ "filename" : "Flick it@2x 1.png",
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "filename" : "Flick it@3x.png",
+ "idiom" : "universal",
+ "scale" : "3x"
+ },
+ {
+ "appearances" : [
+ {
+ "appearance" : "luminosity",
+ "value" : "dark"
+ }
+ ],
+ "filename" : "Flick it@3x 1.png",
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/flick.imageset/Flick it 1.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/flick.imageset/Flick it 1.png
new file mode 100644
index 0000000..c7e202f
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/flick.imageset/Flick it 1.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/flick.imageset/Flick it.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/flick.imageset/Flick it.png
new file mode 100644
index 0000000..781ad8b
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/flick.imageset/Flick it.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/flick.imageset/Flick it@2x 1.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/flick.imageset/Flick it@2x 1.png
new file mode 100644
index 0000000..f523ab3
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/flick.imageset/Flick it@2x 1.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/flick.imageset/Flick it@2x.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/flick.imageset/Flick it@2x.png
new file mode 100644
index 0000000..efe0626
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/flick.imageset/Flick it@2x.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/flick.imageset/Flick it@3x 1.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/flick.imageset/Flick it@3x 1.png
new file mode 100644
index 0000000..59846d4
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/flick.imageset/Flick it@3x 1.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/flick.imageset/Flick it@3x.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/flick.imageset/Flick it@3x.png
new file mode 100644
index 0000000..2664616
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/flick.imageset/Flick it@3x.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/frame.imageset/Contents.json b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/frame.imageset/Contents.json
new file mode 100644
index 0000000..b34c25e
--- /dev/null
+++ b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/frame.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "filename" : "frame.png",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "filename" : "frame@2x.png",
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "filename" : "frame@3x.png",
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/frame.imageset/frame.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/frame.imageset/frame.png
new file mode 100644
index 0000000..126e917
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/frame.imageset/frame.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/frame.imageset/frame@2x.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/frame.imageset/frame@2x.png
new file mode 100644
index 0000000..68ce253
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/frame.imageset/frame@2x.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/frame.imageset/frame@3x.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/frame.imageset/frame@3x.png
new file mode 100644
index 0000000..8d655af
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/frame.imageset/frame@3x.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/global.imageset/Contents.json b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/global.imageset/Contents.json
new file mode 100644
index 0000000..0a6d4fb
--- /dev/null
+++ b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/global.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "filename" : "global.png",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "filename" : "global@2x.png",
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "filename" : "global@3x.png",
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/global.imageset/global.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/global.imageset/global.png
new file mode 100644
index 0000000..4187ec3
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/global.imageset/global.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/global.imageset/global@2x.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/global.imageset/global@2x.png
new file mode 100644
index 0000000..f9cc619
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/global.imageset/global@2x.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/global.imageset/global@3x.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/global.imageset/global@3x.png
new file mode 100644
index 0000000..6d50666
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/global.imageset/global@3x.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/heart.imageset/Contents.json b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/heart.imageset/Contents.json
new file mode 100644
index 0000000..0a38ba1
--- /dev/null
+++ b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/heart.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "filename" : "heart.png",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "filename" : "heart@2x.png",
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "filename" : "heart@3x.png",
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/heart.imageset/heart.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/heart.imageset/heart.png
new file mode 100644
index 0000000..e6ce762
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/heart.imageset/heart.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/heart.imageset/heart@2x.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/heart.imageset/heart@2x.png
new file mode 100644
index 0000000..ca7ed48
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/heart.imageset/heart@2x.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/heart.imageset/heart@3x.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/heart.imageset/heart@3x.png
new file mode 100644
index 0000000..9a648fd
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/heart.imageset/heart@3x.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/heart_fill.imageset/Contents.json b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/heart_fill.imageset/Contents.json
new file mode 100644
index 0000000..0a38ba1
--- /dev/null
+++ b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/heart_fill.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "filename" : "heart.png",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "filename" : "heart@2x.png",
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "filename" : "heart@3x.png",
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/heart_fill.imageset/heart.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/heart_fill.imageset/heart.png
new file mode 100644
index 0000000..469acbd
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/heart_fill.imageset/heart.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/heart_fill.imageset/heart@2x.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/heart_fill.imageset/heart@2x.png
new file mode 100644
index 0000000..7230667
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/heart_fill.imageset/heart@2x.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/heart_fill.imageset/heart@3x.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/heart_fill.imageset/heart@3x.png
new file mode 100644
index 0000000..f436b41
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/heart_fill.imageset/heart@3x.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/heart_normal.imageset/Contents.json b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/heart_normal.imageset/Contents.json
new file mode 100644
index 0000000..0a38ba1
--- /dev/null
+++ b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/heart_normal.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "filename" : "heart.png",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "filename" : "heart@2x.png",
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "filename" : "heart@3x.png",
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/heart_normal.imageset/heart.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/heart_normal.imageset/heart.png
new file mode 100644
index 0000000..973fc14
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/heart_normal.imageset/heart.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/heart_normal.imageset/heart@2x.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/heart_normal.imageset/heart@2x.png
new file mode 100644
index 0000000..b075054
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/heart_normal.imageset/heart@2x.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/heart_normal.imageset/heart@3x.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/heart_normal.imageset/heart@3x.png
new file mode 100644
index 0000000..e92e142
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/heart_normal.imageset/heart@3x.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/location.imageset/Contents.json b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/location.imageset/Contents.json
new file mode 100644
index 0000000..e5abe94
--- /dev/null
+++ b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/location.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "filename" : "location.png",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "filename" : "location@2x.png",
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "filename" : "location@3x.png",
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/location.imageset/location.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/location.imageset/location.png
new file mode 100644
index 0000000..276ccca
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/location.imageset/location.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/location.imageset/location@2x.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/location.imageset/location@2x.png
new file mode 100644
index 0000000..41ee5f0
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/location.imageset/location@2x.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/location.imageset/location@3x.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/location.imageset/location@3x.png
new file mode 100644
index 0000000..22e0d00
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/location.imageset/location@3x.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/lock.imageset/Contents.json b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/lock.imageset/Contents.json
new file mode 100644
index 0000000..f03e824
--- /dev/null
+++ b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/lock.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "filename" : "lock.png",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "filename" : "lock@2x.png",
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "filename" : "lock@3x.png",
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/lock.imageset/lock.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/lock.imageset/lock.png
new file mode 100644
index 0000000..70d9b58
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/lock.imageset/lock.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/lock.imageset/lock@2x.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/lock.imageset/lock@2x.png
new file mode 100644
index 0000000..a183127
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/lock.imageset/lock@2x.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/lock.imageset/lock@3x.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/lock.imageset/lock@3x.png
new file mode 100644
index 0000000..5ba12ce
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/lock.imageset/lock@3x.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/logout_right.imageset/Contents.json b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/logout_right.imageset/Contents.json
new file mode 100644
index 0000000..cfb04dc
--- /dev/null
+++ b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/logout_right.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "filename" : "logout.png",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "filename" : "logout@2x.png",
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "filename" : "logout@3x.png",
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/logout_right.imageset/logout.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/logout_right.imageset/logout.png
new file mode 100644
index 0000000..389e33b
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/logout_right.imageset/logout.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/logout_right.imageset/logout@2x.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/logout_right.imageset/logout@2x.png
new file mode 100644
index 0000000..f0065e5
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/logout_right.imageset/logout@2x.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/logout_right.imageset/logout@3x.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/logout_right.imageset/logout@3x.png
new file mode 100644
index 0000000..0543d1e
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/logout_right.imageset/logout@3x.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/logout_up.imageset/Contents.json b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/logout_up.imageset/Contents.json
new file mode 100644
index 0000000..cfb04dc
--- /dev/null
+++ b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/logout_up.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "filename" : "logout.png",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "filename" : "logout@2x.png",
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "filename" : "logout@3x.png",
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/logout_up.imageset/logout.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/logout_up.imageset/logout.png
new file mode 100644
index 0000000..e85ec83
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/logout_up.imageset/logout.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/logout_up.imageset/logout@2x.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/logout_up.imageset/logout@2x.png
new file mode 100644
index 0000000..af2d062
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/logout_up.imageset/logout@2x.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/logout_up.imageset/logout@3x.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/logout_up.imageset/logout@3x.png
new file mode 100644
index 0000000..694040f
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/logout_up.imageset/logout@3x.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/money_recieve.imageset/Contents.json b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/money_recieve.imageset/Contents.json
new file mode 100644
index 0000000..6d33df9
--- /dev/null
+++ b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/money_recieve.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "filename" : "money-recive.png",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "filename" : "money-recive@2x.png",
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "filename" : "money-recive@3x.png",
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/money_recieve.imageset/money-recive.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/money_recieve.imageset/money-recive.png
new file mode 100644
index 0000000..2e530bd
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/money_recieve.imageset/money-recive.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/money_recieve.imageset/money-recive@2x.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/money_recieve.imageset/money-recive@2x.png
new file mode 100644
index 0000000..3df9551
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/money_recieve.imageset/money-recive@2x.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/money_recieve.imageset/money-recive@3x.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/money_recieve.imageset/money-recive@3x.png
new file mode 100644
index 0000000..225da4f
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/money_recieve.imageset/money-recive@3x.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/money_send.imageset/Contents.json b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/money_send.imageset/Contents.json
new file mode 100644
index 0000000..d1ae1a9
--- /dev/null
+++ b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/money_send.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "filename" : "money-send.png",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "filename" : "money-send@2x.png",
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "filename" : "money-send@3x.png",
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/money_send.imageset/money-send.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/money_send.imageset/money-send.png
new file mode 100644
index 0000000..88de27a
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/money_send.imageset/money-send.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/money_send.imageset/money-send@2x.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/money_send.imageset/money-send@2x.png
new file mode 100644
index 0000000..5642ed6
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/money_send.imageset/money-send@2x.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/money_send.imageset/money-send@3x.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/money_send.imageset/money-send@3x.png
new file mode 100644
index 0000000..4f59b59
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/money_send.imageset/money-send@3x.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/pencil.imageset/Contents.json b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/pencil.imageset/Contents.json
new file mode 100644
index 0000000..bf2d9db
--- /dev/null
+++ b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/pencil.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "filename" : "edit-2.png",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "filename" : "edit-2@2x.png",
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "filename" : "edit-2@3x.png",
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/pencil.imageset/edit-2.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/pencil.imageset/edit-2.png
new file mode 100644
index 0000000..6321937
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/pencil.imageset/edit-2.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/pencil.imageset/edit-2@2x.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/pencil.imageset/edit-2@2x.png
new file mode 100644
index 0000000..1ab3e74
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/pencil.imageset/edit-2@2x.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/pencil.imageset/edit-2@3x.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/pencil.imageset/edit-2@3x.png
new file mode 100644
index 0000000..2ea88f8
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/pencil.imageset/edit-2@3x.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/play_circle.imageset/Contents.json b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/play_circle.imageset/Contents.json
new file mode 100644
index 0000000..7a0710c
--- /dev/null
+++ b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/play_circle.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "filename" : "video-circle.png",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "filename" : "video-circle@2x.png",
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "filename" : "video-circle@3x.png",
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/play_circle.imageset/video-circle.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/play_circle.imageset/video-circle.png
new file mode 100644
index 0000000..7ad0146
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/play_circle.imageset/video-circle.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/play_circle.imageset/video-circle@2x.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/play_circle.imageset/video-circle@2x.png
new file mode 100644
index 0000000..45973d4
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/play_circle.imageset/video-circle@2x.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/play_circle.imageset/video-circle@3x.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/play_circle.imageset/video-circle@3x.png
new file mode 100644
index 0000000..b31fc61
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/play_circle.imageset/video-circle@3x.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/receipt.imageset/Contents.json b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/receipt.imageset/Contents.json
new file mode 100644
index 0000000..a6bd9aa
--- /dev/null
+++ b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/receipt.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "filename" : "receipt.png",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "filename" : "receipt@2x.png",
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "filename" : "receipt@3x.png",
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/receipt.imageset/receipt.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/receipt.imageset/receipt.png
new file mode 100644
index 0000000..11d28f4
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/receipt.imageset/receipt.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/receipt.imageset/receipt@2x.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/receipt.imageset/receipt@2x.png
new file mode 100644
index 0000000..4a7dd6a
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/receipt.imageset/receipt@2x.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/receipt.imageset/receipt@3x.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/receipt.imageset/receipt@3x.png
new file mode 100644
index 0000000..fb0d63b
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/receipt.imageset/receipt@3x.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/search.imageset/Contents.json b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/search.imageset/Contents.json
new file mode 100644
index 0000000..b59c79f
--- /dev/null
+++ b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/search.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "filename" : "search.png",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "filename" : "search@2x.png",
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "filename" : "search@3x.png",
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/search.imageset/search.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/search.imageset/search.png
new file mode 100644
index 0000000..0af209a
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/search.imageset/search.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/search.imageset/search@2x.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/search.imageset/search@2x.png
new file mode 100644
index 0000000..272158d
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/search.imageset/search@2x.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/search.imageset/search@3x.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/search.imageset/search@3x.png
new file mode 100644
index 0000000..ca56e25
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/search.imageset/search@3x.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/search_fill.imageset/Contents.json b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/search_fill.imageset/Contents.json
new file mode 100644
index 0000000..b59c79f
--- /dev/null
+++ b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/search_fill.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "filename" : "search.png",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "filename" : "search@2x.png",
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "filename" : "search@3x.png",
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/search_fill.imageset/search.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/search_fill.imageset/search.png
new file mode 100644
index 0000000..786a3a0
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/search_fill.imageset/search.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/search_fill.imageset/search@2x.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/search_fill.imageset/search@2x.png
new file mode 100644
index 0000000..9b44f11
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/search_fill.imageset/search@2x.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/search_fill.imageset/search@3x.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/search_fill.imageset/search@3x.png
new file mode 100644
index 0000000..60f9cbf
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/search_fill.imageset/search@3x.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/search_normal.imageset/Contents.json b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/search_normal.imageset/Contents.json
new file mode 100644
index 0000000..027f13c
--- /dev/null
+++ b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/search_normal.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "filename" : "search-normal.png",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "filename" : "search-normal@2x.png",
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "filename" : "search-normal@3x.png",
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/search_normal.imageset/search-normal.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/search_normal.imageset/search-normal.png
new file mode 100644
index 0000000..e799e80
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/search_normal.imageset/search-normal.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/search_normal.imageset/search-normal@2x.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/search_normal.imageset/search-normal@2x.png
new file mode 100644
index 0000000..d39e98c
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/search_normal.imageset/search-normal@2x.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/search_normal.imageset/search-normal@3x.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/search_normal.imageset/search-normal@3x.png
new file mode 100644
index 0000000..ab8d43f
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/search_normal.imageset/search-normal@3x.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/sms.imageset/Contents.json b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/sms.imageset/Contents.json
new file mode 100644
index 0000000..ffbe4b3
--- /dev/null
+++ b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/sms.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "filename" : "sms.png",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "filename" : "sms@2x.png",
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "filename" : "sms@3x.png",
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/sms.imageset/sms.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/sms.imageset/sms.png
new file mode 100644
index 0000000..759eabe
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/sms.imageset/sms.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/sms.imageset/sms@2x.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/sms.imageset/sms@2x.png
new file mode 100644
index 0000000..c421bbe
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/sms.imageset/sms@2x.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/sms.imageset/sms@3x.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/sms.imageset/sms@3x.png
new file mode 100644
index 0000000..7f48d42
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/sms.imageset/sms@3x.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/star.imageset/Contents.json b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/star.imageset/Contents.json
new file mode 100644
index 0000000..930178e
--- /dev/null
+++ b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/star.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "filename" : "star.png",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "filename" : "star@2x.png",
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "filename" : "star@3x.png",
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/star.imageset/star.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/star.imageset/star.png
new file mode 100644
index 0000000..759164e
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/star.imageset/star.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/star.imageset/star@2x.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/star.imageset/star@2x.png
new file mode 100644
index 0000000..d78bc92
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/star.imageset/star@2x.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/star.imageset/star@3x.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/star.imageset/star@3x.png
new file mode 100644
index 0000000..17c8d15
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/star.imageset/star@3x.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/star_fill.imageset/Contents.json b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/star_fill.imageset/Contents.json
new file mode 100644
index 0000000..930178e
--- /dev/null
+++ b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/star_fill.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "filename" : "star.png",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "filename" : "star@2x.png",
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "filename" : "star@3x.png",
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/star_fill.imageset/star.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/star_fill.imageset/star.png
new file mode 100644
index 0000000..d13746d
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/star_fill.imageset/star.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/star_fill.imageset/star@2x.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/star_fill.imageset/star@2x.png
new file mode 100644
index 0000000..684af85
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/star_fill.imageset/star@2x.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/star_fill.imageset/star@3x.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/star_fill.imageset/star@3x.png
new file mode 100644
index 0000000..ba5b302
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/star_fill.imageset/star@3x.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/star_normal.imageset/Contents.json b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/star_normal.imageset/Contents.json
new file mode 100644
index 0000000..930178e
--- /dev/null
+++ b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/star_normal.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "filename" : "star.png",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "filename" : "star@2x.png",
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "filename" : "star@3x.png",
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/star_normal.imageset/star.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/star_normal.imageset/star.png
new file mode 100644
index 0000000..9332125
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/star_normal.imageset/star.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/star_normal.imageset/star@2x.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/star_normal.imageset/star@2x.png
new file mode 100644
index 0000000..428ad57
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/star_normal.imageset/star@2x.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/star_normal.imageset/star@3x.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/star_normal.imageset/star@3x.png
new file mode 100644
index 0000000..50aa1b8
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/star_normal.imageset/star@3x.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/subtitle.imageset/Contents.json b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/subtitle.imageset/Contents.json
new file mode 100644
index 0000000..6f7534a
--- /dev/null
+++ b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/subtitle.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "filename" : "subtitle.png",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "filename" : "subtitle@2x.png",
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "filename" : "subtitle@3x.png",
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/subtitle.imageset/subtitle.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/subtitle.imageset/subtitle.png
new file mode 100644
index 0000000..3f3532b
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/subtitle.imageset/subtitle.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/subtitle.imageset/subtitle@2x.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/subtitle.imageset/subtitle@2x.png
new file mode 100644
index 0000000..621cd13
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/subtitle.imageset/subtitle@2x.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/subtitle.imageset/subtitle@3x.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/subtitle.imageset/subtitle@3x.png
new file mode 100644
index 0000000..5eb6e7d
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/subtitle.imageset/subtitle@3x.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/title.imageset/Contents.json b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/title.imageset/Contents.json
new file mode 100644
index 0000000..bea72e0
--- /dev/null
+++ b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/title.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "filename" : "title.png",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "filename" : "title@2x.png",
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "filename" : "title@3x.png",
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/title.imageset/title.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/title.imageset/title.png
new file mode 100644
index 0000000..e8762d5
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/title.imageset/title.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/title.imageset/title@2x.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/title.imageset/title@2x.png
new file mode 100644
index 0000000..e1b3535
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/title.imageset/title@2x.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/title.imageset/title@3x.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/title.imageset/title@3x.png
new file mode 100644
index 0000000..807641b
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/title.imageset/title@3x.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/tv.imageset/Contents.json b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/tv.imageset/Contents.json
new file mode 100644
index 0000000..fbcec31
--- /dev/null
+++ b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/tv.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "filename" : "device-tv.png",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "filename" : "device-tv@2x.png",
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "filename" : "device-tv@3x.png",
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/tv.imageset/device-tv.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/tv.imageset/device-tv.png
new file mode 100644
index 0000000..0fd8f93
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/tv.imageset/device-tv.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/tv.imageset/device-tv@2x.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/tv.imageset/device-tv@2x.png
new file mode 100644
index 0000000..4a1ba1e
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/tv.imageset/device-tv@2x.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/tv.imageset/device-tv@3x.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/tv.imageset/device-tv@3x.png
new file mode 100644
index 0000000..0cacf8b
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/tv.imageset/device-tv@3x.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/user_circle.imageset/Contents.json b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/user_circle.imageset/Contents.json
new file mode 100644
index 0000000..26431d4
--- /dev/null
+++ b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/user_circle.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "filename" : "profile-circle.png",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "filename" : "profile-circle@2x.png",
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "filename" : "profile-circle@3x.png",
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/user_circle.imageset/profile-circle.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/user_circle.imageset/profile-circle.png
new file mode 100644
index 0000000..4c8c1e7
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/user_circle.imageset/profile-circle.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/user_circle.imageset/profile-circle@2x.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/user_circle.imageset/profile-circle@2x.png
new file mode 100644
index 0000000..a6b661a
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/user_circle.imageset/profile-circle@2x.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/user_circle.imageset/profile-circle@3x.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/user_circle.imageset/profile-circle@3x.png
new file mode 100644
index 0000000..0945f06
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/user_circle.imageset/profile-circle@3x.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/user_square.imageset/Contents.json b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/user_square.imageset/Contents.json
new file mode 100644
index 0000000..d334e39
--- /dev/null
+++ b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/user_square.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "filename" : "user-square.png",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "filename" : "user-square@2x.png",
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "filename" : "user-square@3x.png",
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/user_square.imageset/user-square.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/user_square.imageset/user-square.png
new file mode 100644
index 0000000..415b44f
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/user_square.imageset/user-square.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/user_square.imageset/user-square@2x.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/user_square.imageset/user-square@2x.png
new file mode 100644
index 0000000..2ffaa68
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/user_square.imageset/user-square@2x.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/user_square.imageset/user-square@3x.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/user_square.imageset/user-square@3x.png
new file mode 100644
index 0000000..310321a
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/user_square.imageset/user-square@3x.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/user_square_fill.imageset/Contents.json b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/user_square_fill.imageset/Contents.json
new file mode 100644
index 0000000..d334e39
--- /dev/null
+++ b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/user_square_fill.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "filename" : "user-square.png",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "filename" : "user-square@2x.png",
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "filename" : "user-square@3x.png",
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/user_square_fill.imageset/user-square.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/user_square_fill.imageset/user-square.png
new file mode 100644
index 0000000..c1896a2
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/user_square_fill.imageset/user-square.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/user_square_fill.imageset/user-square@2x.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/user_square_fill.imageset/user-square@2x.png
new file mode 100644
index 0000000..85dfcd3
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/user_square_fill.imageset/user-square@2x.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/user_square_fill.imageset/user-square@3x.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/user_square_fill.imageset/user-square@3x.png
new file mode 100644
index 0000000..7762e02
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/user_square_fill.imageset/user-square@3x.png differ
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/video_play_fill.imageset/Contents.json b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/video-play.imageset/Contents.json
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/video_play_fill.imageset/Contents.json
rename to Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/video-play.imageset/Contents.json
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/video_play.imageset/video-play.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/video-play.imageset/video-play.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/video_play.imageset/video-play.png
rename to Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/video-play.imageset/video-play.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/video_play.imageset/video-play@2x.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/video-play.imageset/video-play@2x.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/video_play.imageset/video-play@2x.png
rename to Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/video-play.imageset/video-play@2x.png
diff --git a/DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/video_play.imageset/video-play@3x.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/video-play.imageset/video-play@3x.png
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/Resources/Assets.xcassets/Icons/video_play.imageset/video-play@3x.png
rename to Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/video-play.imageset/video-play@3x.png
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/video.imageset/Contents.json b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/video.imageset/Contents.json
new file mode 100644
index 0000000..bdd58fd
--- /dev/null
+++ b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/video.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "filename" : "video.png",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "filename" : "video@2x.png",
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "filename" : "video@3x.png",
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/video.imageset/video.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/video.imageset/video.png
new file mode 100644
index 0000000..f88ba61
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/video.imageset/video.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/video.imageset/video@2x.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/video.imageset/video@2x.png
new file mode 100644
index 0000000..294795d
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/video.imageset/video@2x.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/video.imageset/video@3x.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/video.imageset/video@3x.png
new file mode 100644
index 0000000..02f90cb
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/video.imageset/video@3x.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/video_normal.imageset/Contents.json b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/video_normal.imageset/Contents.json
new file mode 100644
index 0000000..bdd58fd
--- /dev/null
+++ b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/video_normal.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "filename" : "video.png",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "filename" : "video@2x.png",
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "filename" : "video@3x.png",
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/video_normal.imageset/video.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/video_normal.imageset/video.png
new file mode 100644
index 0000000..95e0098
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/video_normal.imageset/video.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/video_normal.imageset/video@2x.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/video_normal.imageset/video@2x.png
new file mode 100644
index 0000000..3f872b0
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/video_normal.imageset/video@2x.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/video_normal.imageset/video@3x.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/video_normal.imageset/video@3x.png
new file mode 100644
index 0000000..e03e57d
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/video_normal.imageset/video@3x.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/video_play.imageset/Contents.json b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/video_play.imageset/Contents.json
new file mode 100644
index 0000000..254cb1b
--- /dev/null
+++ b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/video_play.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "filename" : "video-play.png",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "filename" : "video-play@2x.png",
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "filename" : "video-play@3x.png",
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/video_play.imageset/video-play.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/video_play.imageset/video-play.png
new file mode 100644
index 0000000..6625f27
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/video_play.imageset/video-play.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/video_play.imageset/video-play@2x.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/video_play.imageset/video-play@2x.png
new file mode 100644
index 0000000..f9a23bf
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/video_play.imageset/video-play@2x.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/video_play.imageset/video-play@3x.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/video_play.imageset/video-play@3x.png
new file mode 100644
index 0000000..ca25a50
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/video_play.imageset/video-play@3x.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/video_play_fill.imageset/Contents.json b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/video_play_fill.imageset/Contents.json
new file mode 100644
index 0000000..254cb1b
--- /dev/null
+++ b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/video_play_fill.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "filename" : "video-play.png",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "filename" : "video-play@2x.png",
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "filename" : "video-play@3x.png",
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/video_play_fill.imageset/video-play.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/video_play_fill.imageset/video-play.png
new file mode 100644
index 0000000..ff72437
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/video_play_fill.imageset/video-play.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/video_play_fill.imageset/video-play@2x.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/video_play_fill.imageset/video-play@2x.png
new file mode 100644
index 0000000..5c4d8a0
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/video_play_fill.imageset/video-play@2x.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/video_play_fill.imageset/video-play@3x.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/video_play_fill.imageset/video-play@3x.png
new file mode 100644
index 0000000..171a7e6
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/video_play_fill.imageset/video-play@3x.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/video_vertical.imageset/Contents.json b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/video_vertical.imageset/Contents.json
new file mode 100644
index 0000000..3fa209b
--- /dev/null
+++ b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/video_vertical.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "filename" : "video-vertical.png",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "filename" : "video-vertical@2x.png",
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "filename" : "video-vertical@3x.png",
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/video_vertical.imageset/video-vertical.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/video_vertical.imageset/video-vertical.png
new file mode 100644
index 0000000..96fd9f0
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/video_vertical.imageset/video-vertical.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/video_vertical.imageset/video-vertical@2x.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/video_vertical.imageset/video-vertical@2x.png
new file mode 100644
index 0000000..67e2478
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/video_vertical.imageset/video-vertical@2x.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/video_vertical.imageset/video-vertical@3x.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/video_vertical.imageset/video-vertical@3x.png
new file mode 100644
index 0000000..2e8f299
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Icons/video_vertical.imageset/video-vertical@3x.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Images/Contents.json b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Images/Contents.json
new file mode 100644
index 0000000..73c0059
--- /dev/null
+++ b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Images/Contents.json
@@ -0,0 +1,6 @@
+{
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Images/auth_circles.imageset/Contents.json b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Images/auth_circles.imageset/Contents.json
new file mode 100644
index 0000000..12079ba
--- /dev/null
+++ b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Images/auth_circles.imageset/Contents.json
@@ -0,0 +1,56 @@
+{
+ "images" : [
+ {
+ "filename" : "background circles.png",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "appearances" : [
+ {
+ "appearance" : "luminosity",
+ "value" : "dark"
+ }
+ ],
+ "filename" : "background circles 1.png",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "filename" : "background circles@2x.png",
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "appearances" : [
+ {
+ "appearance" : "luminosity",
+ "value" : "dark"
+ }
+ ],
+ "filename" : "background circles@2x 1.png",
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "filename" : "background circles@3x.png",
+ "idiom" : "universal",
+ "scale" : "3x"
+ },
+ {
+ "appearances" : [
+ {
+ "appearance" : "luminosity",
+ "value" : "dark"
+ }
+ ],
+ "filename" : "background circles@3x 1.png",
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Images/auth_circles.imageset/background circles 1.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Images/auth_circles.imageset/background circles 1.png
new file mode 100644
index 0000000..f516596
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Images/auth_circles.imageset/background circles 1.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Images/auth_circles.imageset/background circles.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Images/auth_circles.imageset/background circles.png
new file mode 100644
index 0000000..23b2a4d
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Images/auth_circles.imageset/background circles.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Images/auth_circles.imageset/background circles@2x 1.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Images/auth_circles.imageset/background circles@2x 1.png
new file mode 100644
index 0000000..01f5a87
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Images/auth_circles.imageset/background circles@2x 1.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Images/auth_circles.imageset/background circles@2x.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Images/auth_circles.imageset/background circles@2x.png
new file mode 100644
index 0000000..0151191
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Images/auth_circles.imageset/background circles@2x.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Images/auth_circles.imageset/background circles@3x 1.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Images/auth_circles.imageset/background circles@3x 1.png
new file mode 100644
index 0000000..ed283c5
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Images/auth_circles.imageset/background circles@3x 1.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Images/auth_circles.imageset/background circles@3x.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Images/auth_circles.imageset/background circles@3x.png
new file mode 100644
index 0000000..b087970
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Images/auth_circles.imageset/background circles@3x.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Images/cast_placeholder.imageset/Contents.json b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Images/cast_placeholder.imageset/Contents.json
new file mode 100644
index 0000000..26431d4
--- /dev/null
+++ b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Images/cast_placeholder.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "filename" : "profile-circle.png",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "filename" : "profile-circle@2x.png",
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "filename" : "profile-circle@3x.png",
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Images/cast_placeholder.imageset/profile-circle.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Images/cast_placeholder.imageset/profile-circle.png
new file mode 100644
index 0000000..213b5ff
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Images/cast_placeholder.imageset/profile-circle.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Images/cast_placeholder.imageset/profile-circle@2x.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Images/cast_placeholder.imageset/profile-circle@2x.png
new file mode 100644
index 0000000..6332bea
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Images/cast_placeholder.imageset/profile-circle@2x.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Images/cast_placeholder.imageset/profile-circle@3x.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Images/cast_placeholder.imageset/profile-circle@3x.png
new file mode 100644
index 0000000..95de5d5
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Images/cast_placeholder.imageset/profile-circle@3x.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Images/logo_dark.imageset/Contents.json b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Images/logo_dark.imageset/Contents.json
new file mode 100644
index 0000000..b54d4d9
--- /dev/null
+++ b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Images/logo_dark.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "filename" : "logo.png",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "filename" : "logo@2x.png",
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "filename" : "logo@3x.png",
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Images/logo_dark.imageset/logo.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Images/logo_dark.imageset/logo.png
new file mode 100644
index 0000000..a6e383b
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Images/logo_dark.imageset/logo.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Images/logo_dark.imageset/logo@2x.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Images/logo_dark.imageset/logo@2x.png
new file mode 100644
index 0000000..a7d2b2a
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Images/logo_dark.imageset/logo@2x.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Images/logo_dark.imageset/logo@3x.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Images/logo_dark.imageset/logo@3x.png
new file mode 100644
index 0000000..4764bc0
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Images/logo_dark.imageset/logo@3x.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Images/logo_light.imageset/Contents.json b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Images/logo_light.imageset/Contents.json
new file mode 100644
index 0000000..b54d4d9
--- /dev/null
+++ b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Images/logo_light.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "filename" : "logo.png",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "filename" : "logo@2x.png",
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "filename" : "logo@3x.png",
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Images/logo_light.imageset/logo.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Images/logo_light.imageset/logo.png
new file mode 100644
index 0000000..b8aa61e
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Images/logo_light.imageset/logo.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Images/logo_light.imageset/logo@2x.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Images/logo_light.imageset/logo@2x.png
new file mode 100644
index 0000000..475581b
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Images/logo_light.imageset/logo@2x.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Images/logo_light.imageset/logo@3x.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Images/logo_light.imageset/logo@3x.png
new file mode 100644
index 0000000..692ab6f
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Images/logo_light.imageset/logo@3x.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Images/onboarding_first.imageset/Contents.json b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Images/onboarding_first.imageset/Contents.json
new file mode 100644
index 0000000..5c5b502
--- /dev/null
+++ b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Images/onboarding_first.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "filename" : "background.png",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "filename" : "background@2x.png",
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "filename" : "background@3x.png",
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Images/onboarding_first.imageset/background.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Images/onboarding_first.imageset/background.png
new file mode 100644
index 0000000..050ae21
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Images/onboarding_first.imageset/background.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Images/onboarding_first.imageset/background@2x.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Images/onboarding_first.imageset/background@2x.png
new file mode 100644
index 0000000..982af16
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Images/onboarding_first.imageset/background@2x.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Images/onboarding_first.imageset/background@3x.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Images/onboarding_first.imageset/background@3x.png
new file mode 100644
index 0000000..bc9b3e3
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Images/onboarding_first.imageset/background@3x.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Images/onboarding_fourth.imageset/Contents.json b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Images/onboarding_fourth.imageset/Contents.json
new file mode 100644
index 0000000..1abbabf
--- /dev/null
+++ b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Images/onboarding_fourth.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "filename" : "Frame 2.png",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "filename" : "Frame 2@2x.png",
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "filename" : "Frame 2@3x.png",
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Images/onboarding_fourth.imageset/Frame 2.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Images/onboarding_fourth.imageset/Frame 2.png
new file mode 100644
index 0000000..521002f
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Images/onboarding_fourth.imageset/Frame 2.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Images/onboarding_fourth.imageset/Frame 2@2x.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Images/onboarding_fourth.imageset/Frame 2@2x.png
new file mode 100644
index 0000000..de86d45
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Images/onboarding_fourth.imageset/Frame 2@2x.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Images/onboarding_fourth.imageset/Frame 2@3x.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Images/onboarding_fourth.imageset/Frame 2@3x.png
new file mode 100644
index 0000000..541263f
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Images/onboarding_fourth.imageset/Frame 2@3x.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Images/onboarding_second.imageset/Contents.json b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Images/onboarding_second.imageset/Contents.json
new file mode 100644
index 0000000..5c5b502
--- /dev/null
+++ b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Images/onboarding_second.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "filename" : "background.png",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "filename" : "background@2x.png",
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "filename" : "background@3x.png",
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Images/onboarding_second.imageset/background.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Images/onboarding_second.imageset/background.png
new file mode 100644
index 0000000..c685526
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Images/onboarding_second.imageset/background.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Images/onboarding_second.imageset/background@2x.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Images/onboarding_second.imageset/background@2x.png
new file mode 100644
index 0000000..fe8cc54
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Images/onboarding_second.imageset/background@2x.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Images/onboarding_second.imageset/background@3x.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Images/onboarding_second.imageset/background@3x.png
new file mode 100644
index 0000000..1261978
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Images/onboarding_second.imageset/background@3x.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Images/onboarding_third.imageset/Contents.json b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Images/onboarding_third.imageset/Contents.json
new file mode 100644
index 0000000..5c5b502
--- /dev/null
+++ b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Images/onboarding_third.imageset/Contents.json
@@ -0,0 +1,23 @@
+{
+ "images" : [
+ {
+ "filename" : "background.png",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "filename" : "background@2x.png",
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "filename" : "background@3x.png",
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Images/onboarding_third.imageset/background.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Images/onboarding_third.imageset/background.png
new file mode 100644
index 0000000..575570e
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Images/onboarding_third.imageset/background.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Images/onboarding_third.imageset/background@2x.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Images/onboarding_third.imageset/background@2x.png
new file mode 100644
index 0000000..109154a
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Images/onboarding_third.imageset/background@2x.png differ
diff --git a/Core/DesignSystem/Sources/Resources/Assets.xcassets/Images/onboarding_third.imageset/background@3x.png b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Images/onboarding_third.imageset/background@3x.png
new file mode 100644
index 0000000..07d68a7
Binary files /dev/null and b/Core/DesignSystem/Sources/Resources/Assets.xcassets/Images/onboarding_third.imageset/background@3x.png differ
diff --git a/DesignSystem/Sources/DesignSystem/TextFields/AuthTextField.swift b/Core/DesignSystem/Sources/TextFields/AuthTextField.swift
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/TextFields/AuthTextField.swift
rename to Core/DesignSystem/Sources/TextFields/AuthTextField.swift
diff --git a/DesignSystem/Sources/DesignSystem/TextFields/Debouncer.swift b/Core/DesignSystem/Sources/TextFields/Debouncer.swift
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/TextFields/Debouncer.swift
rename to Core/DesignSystem/Sources/TextFields/Debouncer.swift
diff --git a/DesignSystem/Sources/DesignSystem/TextFields/SearchTextField.swift b/Core/DesignSystem/Sources/TextFields/SearchTextField.swift
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/TextFields/SearchTextField.swift
rename to Core/DesignSystem/Sources/TextFields/SearchTextField.swift
diff --git a/DesignSystem/Sources/DesignSystem/ViewModifiers/CustomFont.swift b/Core/DesignSystem/Sources/ViewModifiers/CustomFont.swift
similarity index 100%
rename from DesignSystem/Sources/DesignSystem/ViewModifiers/CustomFont.swift
rename to Core/DesignSystem/Sources/ViewModifiers/CustomFont.swift
diff --git a/Localizations/.gitignore b/Core/Localizations/.gitignore
similarity index 100%
rename from Localizations/.gitignore
rename to Core/Localizations/.gitignore
diff --git a/Localizations/Sources/Localizations/Resources/en.lproj/Localizable.strings b/Core/Localizations/Resources/en.lproj/Localizable.strings
similarity index 100%
rename from Localizations/Sources/Localizations/Resources/en.lproj/Localizable.strings
rename to Core/Localizations/Resources/en.lproj/Localizable.strings
diff --git a/Localizations/Sources/Localizations/Localizations.swift b/Core/Localizations/Sources/Localizations.swift
similarity index 59%
rename from Localizations/Sources/Localizations/Localizations.swift
rename to Core/Localizations/Sources/Localizations.swift
index 08b22b8..d584e0f 100644
--- a/Localizations/Sources/Localizations/Localizations.swift
+++ b/Core/Localizations/Sources/Localizations.swift
@@ -1,2 +1,4 @@
// The Swift Programming Language
// https://docs.swift.org/swift-book
+
+public let Localization = R.string.localizable
diff --git a/Core/Localizations/Sources/R.generated.swift b/Core/Localizations/Sources/R.generated.swift
new file mode 100644
index 0000000..ec59da8
--- /dev/null
+++ b/Core/Localizations/Sources/R.generated.swift
@@ -0,0 +1,502 @@
+//
+// This is a generated file, do not edit!
+// Generated by R.swift, see https://github.com/mac-cain13/R.swift
+//
+
+import Foundation
+import RswiftResources
+
+private class BundleFinder {}
+public let R = _R(bundle: Bundle(for: BundleFinder.self))
+
+public struct _R: Sendable {
+ public let bundle: Foundation.Bundle
+ public init(bundle: Foundation.Bundle) {
+ self.bundle = bundle
+ }
+ public var string: string { .init(bundle: bundle, preferredLanguages: nil, locale: nil) }
+
+ public func string(bundle: Foundation.Bundle) -> string {
+ .init(bundle: bundle, preferredLanguages: nil, locale: nil)
+ }
+ public func string(locale: Foundation.Locale) -> string {
+ .init(bundle: bundle, preferredLanguages: nil, locale: locale)
+ }
+ public func string(preferredLanguages: [String], locale: Locale? = nil) -> string {
+ .init(bundle: bundle, preferredLanguages: preferredLanguages, locale: locale)
+ }
+ public func validate() throws {
+
+ }
+
+ public struct project: Sendable {
+ public let developmentRegion = "en"
+ }
+
+ /// This `_R.string` struct is generated, and contains static references to 1 localization tables.
+ public struct string: Sendable {
+ public let bundle: Foundation.Bundle
+ public let preferredLanguages: [String]?
+ public let locale: Locale?
+ public init(bundle: Foundation.Bundle, preferredLanguages: [String]? = nil, locale: Locale? = nil) {
+ self.bundle = bundle
+ self.preferredLanguages = preferredLanguages
+ self.locale = locale
+ }
+ public var localizable: localizable { .init(source: .init(bundle: bundle, tableName: "Localizable", preferredLanguages: preferredLanguages, locale: locale)) }
+
+ public func localizable(preferredLanguages: [String]) -> localizable {
+ .init(source: .init(bundle: bundle, tableName: "Localizable", preferredLanguages: preferredLanguages, locale: locale))
+ }
+
+
+ /// This `_R.string.localizable` struct is generated, and contains static references to 63 localization keys.
+ public struct localizable: Sendable {
+ public let source: RswiftResources.StringResource.Source
+ public init(source: RswiftResources.StringResource.Source) {
+ self.source = source
+ }
+
+ /// en translation: Confirm Password
+ ///
+ /// Key: auth.confirmPasswordPlaceholder
+ ///
+ /// Locales: en
+ public var authConfirmPasswordPlaceholder: RswiftResources.StringResource { .init(key: "auth.confirmPasswordPlaceholder", tableName: "Localizable", source: source, developmentValue: "Confirm Password", comment: nil) }
+
+ /// en translation: Create account
+ ///
+ /// Key: auth.createAccountButtonTitle
+ ///
+ /// Locales: en
+ public var authCreateAccountButtonTitle: RswiftResources.StringResource { .init(key: "auth.createAccountButtonTitle", tableName: "Localizable", source: source, developmentValue: "Create account", comment: nil) }
+
+ /// en translation: Email
+ ///
+ /// Key: auth.emailPlaceholder
+ ///
+ /// Locales: en
+ public var authEmailPlaceholder: RswiftResources.StringResource { .init(key: "auth.emailPlaceholder", tableName: "Localizable", source: source, developmentValue: "Email", comment: nil) }
+
+ /// en translation: Forgot password?
+ ///
+ /// Key: auth.forgotPasswordButtonTitle
+ ///
+ /// Locales: en
+ public var authForgotPasswordButtonTitle: RswiftResources.StringResource { .init(key: "auth.forgotPasswordButtonTitle", tableName: "Localizable", source: source, developmentValue: "Forgot password?", comment: nil) }
+
+ /// en translation: Flick
+ ///
+ /// Key: auth.navigationTitle
+ ///
+ /// Locales: en
+ public var authNavigationTitle: RswiftResources.StringResource { .init(key: "auth.navigationTitle", tableName: "Localizable", source: source, developmentValue: "Flick", comment: nil) }
+
+ /// en translation: Password
+ ///
+ /// Key: auth.passwordPlaceholder
+ ///
+ /// Locales: en
+ public var authPasswordPlaceholder: RswiftResources.StringResource { .init(key: "auth.passwordPlaceholder", tableName: "Localizable", source: source, developmentValue: "Password", comment: nil) }
+
+ /// en translation: Reset password
+ ///
+ /// Key: auth.resetPasswordButtonTitle
+ ///
+ /// Locales: en
+ public var authResetPasswordButtonTitle: RswiftResources.StringResource { .init(key: "auth.resetPasswordButtonTitle", tableName: "Localizable", source: source, developmentValue: "Reset password", comment: nil) }
+
+ /// en translation: Reset password
+ ///
+ /// Key: auth.resetPasswordTitle
+ ///
+ /// Locales: en
+ public var authResetPasswordTitle: RswiftResources.StringResource { .init(key: "auth.resetPasswordTitle", tableName: "Localizable", source: source, developmentValue: "Reset password", comment: nil) }
+
+ /// en translation: Save password
+ ///
+ /// Key: auth.savePasswordButtonTitle
+ ///
+ /// Locales: en
+ public var authSavePasswordButtonTitle: RswiftResources.StringResource { .init(key: "auth.savePasswordButtonTitle", tableName: "Localizable", source: source, developmentValue: "Save password", comment: nil) }
+
+ /// en translation: Already have an account?
+ ///
+ /// Key: auth.signInButtonDescription
+ ///
+ /// Locales: en
+ public var authSignInButtonDescription: RswiftResources.StringResource { .init(key: "auth.signInButtonDescription", tableName: "Localizable", source: source, developmentValue: "Already have an account?", comment: nil) }
+
+ /// en translation: Sign in
+ ///
+ /// Key: auth.signInButtonTitle
+ ///
+ /// Locales: en
+ public var authSignInButtonTitle: RswiftResources.StringResource { .init(key: "auth.signInButtonTitle", tableName: "Localizable", source: source, developmentValue: "Sign in", comment: nil) }
+
+ /// en translation: Login to your account
+ ///
+ /// Key: auth.signInTitle
+ ///
+ /// Locales: en
+ public var authSignInTitle: RswiftResources.StringResource { .init(key: "auth.signInTitle", tableName: "Localizable", source: source, developmentValue: "Login to your account", comment: nil) }
+
+ /// en translation: Don`t have an account?
+ ///
+ /// Key: auth.signUpButtonDescription
+ ///
+ /// Locales: en
+ public var authSignUpButtonDescription: RswiftResources.StringResource { .init(key: "auth.signUpButtonDescription", tableName: "Localizable", source: source, developmentValue: "Don`t have an account?", comment: nil) }
+
+ /// en translation: SignUp
+ ///
+ /// Key: auth.signUpButtonTitle
+ ///
+ /// Locales: en
+ public var authSignUpButtonTitle: RswiftResources.StringResource { .init(key: "auth.signUpButtonTitle", tableName: "Localizable", source: source, developmentValue: "SignUp", comment: nil) }
+
+ /// en translation: Create your account
+ ///
+ /// Key: auth.signUpTitle
+ ///
+ /// Locales: en
+ public var authSignUpTitle: RswiftResources.StringResource { .init(key: "auth.signUpTitle", tableName: "Localizable", source: source, developmentValue: "Create your account", comment: nil) }
+
+ /// en translation: Username
+ ///
+ /// Key: auth.usernamePlaceholder
+ ///
+ /// Locales: en
+ public var authUsernamePlaceholder: RswiftResources.StringResource { .init(key: "auth.usernamePlaceholder", tableName: "Localizable", source: source, developmentValue: "Username", comment: nil) }
+
+ /// en translation: Movies
+ ///
+ /// Key: contentToggle.moviesTitle
+ ///
+ /// Locales: en
+ public var contentToggleMoviesTitle: RswiftResources.StringResource { .init(key: "contentToggle.moviesTitle", tableName: "Localizable", source: source, developmentValue: "Movies", comment: nil) }
+
+ /// en translation: TV Series
+ ///
+ /// Key: contentToggle.showsTitle
+ ///
+ /// Locales: en
+ public var contentToggleShowsTitle: RswiftResources.StringResource { .init(key: "contentToggle.showsTitle", tableName: "Localizable", source: source, developmentValue: "TV Series", comment: nil) }
+
+ /// en translation: Airing today
+ ///
+ /// Key: home.airingTodayShowsSectionTitle
+ ///
+ /// Locales: en
+ public var homeAiringTodayShowsSectionTitle: RswiftResources.StringResource { .init(key: "home.airingTodayShowsSectionTitle", tableName: "Localizable", source: source, developmentValue: "Airing today", comment: nil) }
+
+ /// en translation: Home
+ ///
+ /// Key: home.navigationTitle
+ ///
+ /// Locales: en
+ public var homeNavigationTitle: RswiftResources.StringResource { .init(key: "home.navigationTitle", tableName: "Localizable", source: source, developmentValue: "Home", comment: nil) }
+
+ /// en translation: Now playing
+ ///
+ /// Key: home.nowPlayingMoviesSectionTitle
+ ///
+ /// Locales: en
+ public var homeNowPlayingMoviesSectionTitle: RswiftResources.StringResource { .init(key: "home.nowPlayingMoviesSectionTitle", tableName: "Localizable", source: source, developmentValue: "Now playing", comment: nil) }
+
+ /// en translation: On TV
+ ///
+ /// Key: home.onTVShowsSectionTitle
+ ///
+ /// Locales: en
+ public var homeOnTVShowsSectionTitle: RswiftResources.StringResource { .init(key: "home.onTVShowsSectionTitle", tableName: "Localizable", source: source, developmentValue: "On TV", comment: nil) }
+
+ /// en translation: Popular
+ ///
+ /// Key: home.popularMoviesSectionTitle
+ ///
+ /// Locales: en
+ public var homePopularMoviesSectionTitle: RswiftResources.StringResource { .init(key: "home.popularMoviesSectionTitle", tableName: "Localizable", source: source, developmentValue: "Popular", comment: nil) }
+
+ /// en translation: Popular
+ ///
+ /// Key: home.popularShowsSectionTitle
+ ///
+ /// Locales: en
+ public var homePopularShowsSectionTitle: RswiftResources.StringResource { .init(key: "home.popularShowsSectionTitle", tableName: "Localizable", source: source, developmentValue: "Popular", comment: nil) }
+
+ /// en translation: See all
+ ///
+ /// Key: home.sectionHeaderButtonTitle
+ ///
+ /// Locales: en
+ public var homeSectionHeaderButtonTitle: RswiftResources.StringResource { .init(key: "home.sectionHeaderButtonTitle", tableName: "Localizable", source: source, developmentValue: "See all", comment: nil) }
+
+ /// en translation: Top Rated
+ ///
+ /// Key: home.topRatedMoviesSectionTitle
+ ///
+ /// Locales: en
+ public var homeTopRatedMoviesSectionTitle: RswiftResources.StringResource { .init(key: "home.topRatedMoviesSectionTitle", tableName: "Localizable", source: source, developmentValue: "Top Rated", comment: nil) }
+
+ /// en translation: Top Rated
+ ///
+ /// Key: home.topRatedShowsSectionTitle
+ ///
+ /// Locales: en
+ public var homeTopRatedShowsSectionTitle: RswiftResources.StringResource { .init(key: "home.topRatedShowsSectionTitle", tableName: "Localizable", source: source, developmentValue: "Top Rated", comment: nil) }
+
+ /// en translation: Upcoming
+ ///
+ /// Key: home.upcomingMoviesSectionTitle
+ ///
+ /// Locales: en
+ public var homeUpcomingMoviesSectionTitle: RswiftResources.StringResource { .init(key: "home.upcomingMoviesSectionTitle", tableName: "Localizable", source: source, developmentValue: "Upcoming", comment: nil) }
+
+ /// en translation: Budget
+ ///
+ /// Key: itemDetails.budgetSectionTitle
+ ///
+ /// Locales: en
+ public var itemDetailsBudgetSectionTitle: RswiftResources.StringResource { .init(key: "itemDetails.budgetSectionTitle", tableName: "Localizable", source: source, developmentValue: "Budget", comment: nil) }
+
+ /// en translation: Cast
+ ///
+ /// Key: itemDetails.castNavigationTitle
+ ///
+ /// Locales: en
+ public var itemDetailsCastNavigationTitle: RswiftResources.StringResource { .init(key: "itemDetails.castNavigationTitle", tableName: "Localizable", source: source, developmentValue: "Cast", comment: nil) }
+
+ /// en translation: Cast
+ ///
+ /// Key: itemDetails.castSectionTitle
+ ///
+ /// Locales: en
+ public var itemDetailsCastSectionTitle: RswiftResources.StringResource { .init(key: "itemDetails.castSectionTitle", tableName: "Localizable", source: source, developmentValue: "Cast", comment: nil) }
+
+ /// en translation: Language
+ ///
+ /// Key: itemDetails.languageSectionTitle
+ ///
+ /// Locales: en
+ public var itemDetailsLanguageSectionTitle: RswiftResources.StringResource { .init(key: "itemDetails.languageSectionTitle", tableName: "Localizable", source: source, developmentValue: "Language", comment: nil) }
+
+ /// en translation: Network
+ ///
+ /// Key: itemDetails.networkSectionTitle
+ ///
+ /// Locales: en
+ public var itemDetailsNetworkSectionTitle: RswiftResources.StringResource { .init(key: "itemDetails.networkSectionTitle", tableName: "Localizable", source: source, developmentValue: "Network", comment: nil) }
+
+ /// en translation: Recommendations
+ ///
+ /// Key: itemDetails.recommendationsSectionTitle
+ ///
+ /// Locales: en
+ public var itemDetailsRecommendationsSectionTitle: RswiftResources.StringResource { .init(key: "itemDetails.recommendationsSectionTitle", tableName: "Localizable", source: source, developmentValue: "Recommendations", comment: nil) }
+
+ /// en translation: Revenue
+ ///
+ /// Key: itemDetails.revenueSectionTitle
+ ///
+ /// Locales: en
+ public var itemDetailsRevenueSectionTitle: RswiftResources.StringResource { .init(key: "itemDetails.revenueSectionTitle", tableName: "Localizable", source: source, developmentValue: "Revenue", comment: nil) }
+
+ /// en translation: Reviews
+ ///
+ /// Key: itemDetails.reviewDetailsNavigationTitle
+ ///
+ /// Locales: en
+ public var itemDetailsReviewDetailsNavigationTitle: RswiftResources.StringResource { .init(key: "itemDetails.reviewDetailsNavigationTitle", tableName: "Localizable", source: source, developmentValue: "Reviews", comment: nil) }
+
+ /// en translation: A review by %@
+ ///
+ /// Key: itemDetails.reviewHeaderTitle
+ ///
+ /// Locales: en
+ public var itemDetailsReviewHeaderTitle: RswiftResources.StringResource1 { .init(key: "itemDetails.reviewHeaderTitle", tableName: "Localizable", source: source, developmentValue: "A review by %@", comment: nil) }
+
+ /// en translation: Reviews
+ ///
+ /// Key: itemDetails.reviewsNavigationTitle
+ ///
+ /// Locales: en
+ public var itemDetailsReviewsNavigationTitle: RswiftResources.StringResource { .init(key: "itemDetails.reviewsNavigationTitle", tableName: "Localizable", source: source, developmentValue: "Reviews", comment: nil) }
+
+ /// en translation: Reviews (%d)
+ ///
+ /// Key: itemDetails.reviewsSectionTitle
+ ///
+ /// Locales: en
+ public var itemDetailsReviewsSectionTitle: RswiftResources.StringResource1 { .init(key: "itemDetails.reviewsSectionTitle", tableName: "Localizable", source: source, developmentValue: "Reviews (%d)", comment: nil) }
+
+ /// en translation: Status
+ ///
+ /// Key: itemDetails.statusSectionTitle
+ ///
+ /// Locales: en
+ public var itemDetailsStatusSectionTitle: RswiftResources.StringResource { .init(key: "itemDetails.statusSectionTitle", tableName: "Localizable", source: source, developmentValue: "Status", comment: nil) }
+
+ /// en translation: Trailer
+ ///
+ /// Key: itemDetails.trailerButtonTitle
+ ///
+ /// Locales: en
+ public var itemDetailsTrailerButtonTitle: RswiftResources.StringResource { .init(key: "itemDetails.trailerButtonTitle", tableName: "Localizable", source: source, developmentValue: "Trailer", comment: nil) }
+
+ /// en translation: Type
+ ///
+ /// Key: itemDetails.typeSectionTitle
+ ///
+ /// Locales: en
+ public var itemDetailsTypeSectionTitle: RswiftResources.StringResource { .init(key: "itemDetails.typeSectionTitle", tableName: "Localizable", source: source, developmentValue: "Type", comment: nil) }
+
+ /// en translation: Where to watch
+ ///
+ /// Key: itemDetails.whereToWatchButtonTitle
+ ///
+ /// Locales: en
+ public var itemDetailsWhereToWatchButtonTitle: RswiftResources.StringResource { .init(key: "itemDetails.whereToWatchButtonTitle", tableName: "Localizable", source: source, developmentValue: "Where to watch", comment: nil) }
+
+ /// en translation: My Favorites
+ ///
+ /// Key: myFavorites.navigationTitle
+ ///
+ /// Locales: en
+ public var myFavoritesNavigationTitle: RswiftResources.StringResource { .init(key: "myFavorites.navigationTitle", tableName: "Localizable", source: source, developmentValue: "My Favorites", comment: nil) }
+
+ /// en translation: Discover your favorite movies & TV shows
+ ///
+ /// Key: onboarding.firstPageTitle
+ ///
+ /// Locales: en
+ public var onboardingFirstPageTitle: RswiftResources.StringResource { .init(key: "onboarding.firstPageTitle", tableName: "Localizable", source: source, developmentValue: "Discover your favorite\nmovies & TV shows", comment: nil) }
+
+ /// en translation: Stay up with new releases
+ ///
+ /// Key: onboarding.fourthPageTitle
+ ///
+ /// Locales: en
+ public var onboardingFourthPageTitle: RswiftResources.StringResource { .init(key: "onboarding.fourthPageTitle", tableName: "Localizable", source: source, developmentValue: "Stay up with\nnew releases", comment: nil) }
+
+ /// en translation: Get Started
+ ///
+ /// Key: onboarding.getStartedButtonTitle
+ ///
+ /// Locales: en
+ public var onboardingGetStartedButtonTitle: RswiftResources.StringResource { .init(key: "onboarding.getStartedButtonTitle", tableName: "Localizable", source: source, developmentValue: "Get Started", comment: nil) }
+
+ /// en translation: Express your opinion in ratings and reviews
+ ///
+ /// Key: onboarding.secondPageTitle
+ ///
+ /// Locales: en
+ public var onboardingSecondPageTitle: RswiftResources.StringResource { .init(key: "onboarding.secondPageTitle", tableName: "Localizable", source: source, developmentValue: "Express your opinion\nin ratings and reviews", comment: nil) }
+
+ /// en translation: Skip
+ ///
+ /// Key: onboarding.skipButtonTitle
+ ///
+ /// Locales: en
+ public var onboardingSkipButtonTitle: RswiftResources.StringResource { .init(key: "onboarding.skipButtonTitle", tableName: "Localizable", source: source, developmentValue: "Skip", comment: nil) }
+
+ /// en translation: Add the best movies & TV Shows to favorites
+ ///
+ /// Key: onboarding.thirdPageTitle
+ ///
+ /// Locales: en
+ public var onboardingThirdPageTitle: RswiftResources.StringResource { .init(key: "onboarding.thirdPageTitle", tableName: "Localizable", source: source, developmentValue: "Add the best movies &\nTV Shows to favorites", comment: nil) }
+
+ /// en translation: Start search right now!
+ ///
+ /// Key: search.listPlaceholder
+ ///
+ /// Locales: en
+ public var searchListPlaceholder: RswiftResources.StringResource { .init(key: "search.listPlaceholder", tableName: "Localizable", source: source, developmentValue: "Start search right now!", comment: nil) }
+
+ /// en translation: Search
+ ///
+ /// Key: search.navigationTitle
+ ///
+ /// Locales: en
+ public var searchNavigationTitle: RswiftResources.StringResource { .init(key: "search.navigationTitle", tableName: "Localizable", source: source, developmentValue: "Search", comment: nil) }
+
+ /// en translation: No search results.
+ ///
+ /// Key: search.noResultsPlaceholder
+ ///
+ /// Locales: en
+ public var searchNoResultsPlaceholder: RswiftResources.StringResource { .init(key: "search.noResultsPlaceholder", tableName: "Localizable", source: source, developmentValue: "No search results.", comment: nil) }
+
+ /// en translation: Search for a movie, TV series...
+ ///
+ /// Key: search.searchPlaceholder
+ ///
+ /// Locales: en
+ public var searchSearchPlaceholder: RswiftResources.StringResource { .init(key: "search.searchPlaceholder", tableName: "Localizable", source: source, developmentValue: "Search for a movie, TV series...", comment: nil) }
+
+ /// en translation: About Us
+ ///
+ /// Key: settings.aboutUsTitle
+ ///
+ /// Locales: en
+ public var settingsAboutUsTitle: RswiftResources.StringResource { .init(key: "settings.aboutUsTitle", tableName: "Localizable", source: source, developmentValue: "About Us", comment: nil) }
+
+ /// en translation: Settings
+ ///
+ /// Key: settings.navigationTitle
+ ///
+ /// Locales: en
+ public var settingsNavigationTitle: RswiftResources.StringResource { .init(key: "settings.navigationTitle", tableName: "Localizable", source: source, developmentValue: "Settings", comment: nil) }
+
+ /// en translation: Privacy Policy
+ ///
+ /// Key: settings.privacyPolicyTitle
+ ///
+ /// Locales: en
+ public var settingsPrivacyPolicyTitle: RswiftResources.StringResource { .init(key: "settings.privacyPolicyTitle", tableName: "Localizable", source: source, developmentValue: "Privacy Policy", comment: nil) }
+
+ /// en translation: Rate this App
+ ///
+ /// Key: settings.rateThisAppTitle
+ ///
+ /// Locales: en
+ public var settingsRateThisAppTitle: RswiftResources.StringResource { .init(key: "settings.rateThisAppTitle", tableName: "Localizable", source: source, developmentValue: "Rate this App", comment: nil) }
+
+ /// en translation: TMDB API
+ ///
+ /// Key: settings.tmdbAPITitle
+ ///
+ /// Locales: en
+ public var settingsTmdbAPITitle: RswiftResources.StringResource { .init(key: "settings.tmdbAPITitle", tableName: "Localizable", source: source, developmentValue: "TMDB API", comment: nil) }
+
+ /// en translation: Buy
+ ///
+ /// Key: whereToWatch.buyTitle
+ ///
+ /// Locales: en
+ public var whereToWatchBuyTitle: RswiftResources.StringResource { .init(key: "whereToWatch.buyTitle", tableName: "Localizable", source: source, developmentValue: "Buy", comment: nil) }
+
+ /// en translation: Where to Watch
+ ///
+ /// Key: whereToWatch.navigationTitle
+ ///
+ /// Locales: en
+ public var whereToWatchNavigationTitle: RswiftResources.StringResource { .init(key: "whereToWatch.navigationTitle", tableName: "Localizable", source: source, developmentValue: "Where to Watch", comment: nil) }
+
+ /// en translation: Select country
+ ///
+ /// Key: whereToWatch.selectCountryTitle
+ ///
+ /// Locales: en
+ public var whereToWatchSelectCountryTitle: RswiftResources.StringResource { .init(key: "whereToWatch.selectCountryTitle", tableName: "Localizable", source: source, developmentValue: "Select country", comment: nil) }
+
+ /// en translation: Stream
+ ///
+ /// Key: whereToWatch.streamTitle
+ ///
+ /// Locales: en
+ public var whereToWatchStreamTitle: RswiftResources.StringResource { .init(key: "whereToWatch.streamTitle", tableName: "Localizable", source: source, developmentValue: "Stream", comment: nil) }
+ }
+ }
+}
\ No newline at end of file
diff --git a/Core/Localizations/Sources/Resources/en.lproj/Localizable.strings b/Core/Localizations/Sources/Resources/en.lproj/Localizable.strings
new file mode 100644
index 0000000..976488a
--- /dev/null
+++ b/Core/Localizations/Sources/Resources/en.lproj/Localizable.strings
@@ -0,0 +1,80 @@
+// MARK: - Onboarding
+"onboarding.firstPageTitle" = "Discover your favorite\nmovies & TV shows";
+"onboarding.secondPageTitle" = "Express your opinion\nin ratings and reviews";
+"onboarding.thirdPageTitle" = "Add the best movies &\nTV Shows to favorites";
+"onboarding.fourthPageTitle" = "Stay up with\nnew releases";
+"onboarding.skipButtonTitle" = "Skip";
+"onboarding.getStartedButtonTitle" = "Get Started";
+
+//MARK: - Auth
+"auth.navigationTitle" = "Flick";
+"auth.signUpTitle" = "Create your account";
+"auth.usernamePlaceholder" = "Username";
+"auth.passwordPlaceholder" = "Password";
+"auth.confirmPasswordPlaceholder" = "Confirm Password";
+"auth.emailPlaceholder" = "Email";
+"auth.createAccountButtonTitle" = "Create account";
+"auth.signInButtonDescription" = "Already have an account?";
+"auth.signInButtonTitle" = "Sign in";
+"auth.signInTitle" = "Login to your account";
+"auth.forgotPasswordButtonTitle" = "Forgot password?";
+"auth.signUpButtonDescription" = "Don`t have an account?";
+"auth.signUpButtonTitle" = "SignUp";
+"auth.resetPasswordTitle" = "Reset password";
+"auth.resetPasswordButtonTitle" = "Reset password";
+"auth.savePasswordButtonTitle" = "Save password";
+
+//MARK: - Home
+"home.navigationTitle" = "Home";
+"home.sectionHeaderButtonTitle" = "See all";
+"home.popularMoviesSectionTitle" = "Popular";
+"home.nowPlayingMoviesSectionTitle" = "Now playing";
+"home.upcomingMoviesSectionTitle" = "Upcoming";
+"home.topRatedMoviesSectionTitle" = "Top Rated";
+"home.popularShowsSectionTitle" = "Popular";
+"home.airingTodayShowsSectionTitle" = "Airing today";
+"home.onTVShowsSectionTitle" = "On TV";
+"home.topRatedShowsSectionTitle" = "Top Rated";
+
+//MARK: - Search
+"search.navigationTitle" = "Search";
+"search.searchPlaceholder" = "Search for a movie, TV series...";
+"search.listPlaceholder" = "Start search right now!";
+"search.noResultsPlaceholder" = "No search results.";
+
+//MARK: - Item Details
+"itemDetails.whereToWatchButtonTitle" = "Where to watch";
+"itemDetails.statusSectionTitle" = "Status";
+"itemDetails.languageSectionTitle" = "Language";
+"itemDetails.budgetSectionTitle" = "Budget";
+"itemDetails.revenueSectionTitle" = "Revenue";
+"itemDetails.networkSectionTitle" = "Network";
+"itemDetails.typeSectionTitle" = "Type";
+"itemDetails.trailerButtonTitle" = "Trailer";
+"itemDetails.castNavigationTitle" = "Cast";
+"itemDetails.castSectionTitle" = "Cast";
+"itemDetails.recommendationsSectionTitle" = "Recommendations";
+"itemDetails.reviewHeaderTitle" = "A review by %@";
+"itemDetails.reviewsSectionTitle" = "Reviews (%d)";
+"itemDetails.reviewsNavigationTitle" = "Reviews";
+"itemDetails.reviewDetailsNavigationTitle" = "Reviews";
+
+//MARK: - Settings
+"settings.navigationTitle" = "Settings";
+"settings.privacyPolicyTitle" = "Privacy Policy";
+"settings.tmdbAPITitle" = "TMDB API";
+"settings.aboutUsTitle" = "About Us";
+"settings.rateThisAppTitle" = "Rate this App";
+
+//MARK: - Where To Watch
+"whereToWatch.navigationTitle" = "Where to Watch";
+"whereToWatch.selectCountryTitle" = "Select country";
+"whereToWatch.streamTitle" = "Stream";
+"whereToWatch.buyTitle" = "Buy";
+
+//MARK: - My Favorites
+"myFavorites.navigationTitle" = "My Favorites";
+
+//MARK: - Content Toggle
+"contentToggle.moviesTitle" = "Movies";
+"contentToggle.showsTitle" = "TV Series";
diff --git a/Core/Localizations/rswift b/Core/Localizations/rswift
new file mode 100755
index 0000000..c55ae0c
Binary files /dev/null and b/Core/Localizations/rswift differ
diff --git a/Flick/Code/Domain/Models/Author.swift b/Core/Models/Sources/Author.swift
similarity index 82%
rename from Flick/Code/Domain/Models/Author.swift
rename to Core/Models/Sources/Author.swift
index 1b284c4..d6dbde3 100644
--- a/Flick/Code/Domain/Models/Author.swift
+++ b/Core/Models/Sources/Author.swift
@@ -10,13 +10,13 @@ import API
import Foundation
import SwiftFoundation
-struct Author {
- var name: String
- var username: String
- var avatarPath: String?
- var rating: Int?
+public struct Author {
+ public var name: String
+ public var username: String
+ public var avatarPath: String?
+ public var rating: Int?
- init(
+ public init(
name: String,
username: String,
avatarPath: String?,
@@ -36,7 +36,7 @@ extension Author: Hashable, Codable {}
// MARK: - Faking
extension Author: Faking {
- init() {
+ public init() {
name = "Cat Ellington"
username = "CatEllington"
avatarPath = "/uCmwgSbJAcHqNwSvQvTv2dB95tx.jpg"
@@ -46,7 +46,7 @@ extension Author: Faking {
// MARK: - empty
-extension Author {
+public extension Author {
static var empty = Author(
name: "",
username: "",
@@ -57,8 +57,8 @@ extension Author {
// MARK: - Test
-extension Author {
- public static func testItem(
+public extension Author {
+ static func testItem(
name: String = "",
username: String = "John Chard",
avatarPath: String? = "/utEXl2EDiXBK6f41wCLsvprvMg4.jpg",
@@ -75,7 +75,7 @@ extension Author {
// MARK: - asAuthor
-extension AuthorRemote {
+public extension AuthorRemote {
var asAuthor: Author {
.init(
name: name,
diff --git a/Flick/Code/Domain/Models/Cast.swift b/Core/Models/Sources/Cast.swift
similarity index 74%
rename from Flick/Code/Domain/Models/Cast.swift
rename to Core/Models/Sources/Cast.swift
index 5b21012..95e8c6c 100644
--- a/Flick/Code/Domain/Models/Cast.swift
+++ b/Core/Models/Sources/Cast.swift
@@ -10,17 +10,21 @@ import API
import Foundation
import SwiftFoundation
-struct Cast: Identifiable {
- struct ID: Hashable, Codable {
- var value: Int
+public struct Cast: Identifiable {
+ public struct ID: Hashable, Codable {
+ public var value: Int
+
+ public init(value: Int) {
+ self.value = value
+ }
}
- var id: ID
- var name: String
- var character: String
- var profilePath: String?
+ public var id: ID
+ public var name: String
+ public var character: String
+ public var profilePath: String?
- init(
+ public init(
id: ID,
name: String,
character: String,
@@ -40,7 +44,7 @@ extension Cast: Hashable, Codable {}
// MARK: - Faking
extension Cast: Faking {
- init() {
+ public init() {
id = .init(value: Int.random(in: Int.min ... 0))
name = "Emilia Clarke"
character = "Daenerys Targaryen"
@@ -50,7 +54,7 @@ extension Cast: Faking {
// MARK: - empty
-extension Cast {
+public extension Cast {
static var empty = Cast(
id: .init(value: Int.random(in: Int.min ... 0)),
name: "",
@@ -61,8 +65,8 @@ extension Cast {
// MARK: - Test
-extension Cast {
- public static func testItem(
+public extension Cast {
+ static func testItem(
id: ID = .init(value: Int.random(in: Int.min ... 0)),
name: String = "Emilia Clarke",
character: String = "Daenerys Targaryen",
@@ -76,18 +80,18 @@ extension Cast {
)
}
- public static func testItems(count: Int) -> [Self] {
+ static func testItems(count: Int) -> [Self] {
(0 ..< count).map { .testItem(id: ID(value: $0)) }
}
- public static func testItemIds(count: Int) -> [Self.ID] {
+ static func testItemIds(count: Int) -> [Self.ID] {
(0 ..< count).map { ID(value: $0) }
}
}
// MARK: - asCast
-extension CastRemote {
+public extension CastRemote {
var asCast: Cast {
.init(
id: .init(value: id),
diff --git a/Flick/Code/Domain/Models/ContentType.swift b/Core/Models/Sources/ContentType.swift
similarity index 88%
rename from Flick/Code/Domain/Models/ContentType.swift
rename to Core/Models/Sources/ContentType.swift
index 3d57570..6dd6826 100644
--- a/Flick/Code/Domain/Models/ContentType.swift
+++ b/Core/Models/Sources/ContentType.swift
@@ -8,7 +8,7 @@
import Foundation
-enum ContentType {
+public enum ContentType {
case movie
case show
}
diff --git a/Flick/Code/Domain/Models/Genre.swift b/Core/Models/Sources/Genre.swift
similarity index 69%
rename from Flick/Code/Domain/Models/Genre.swift
rename to Core/Models/Sources/Genre.swift
index 3239641..1239fe0 100644
--- a/Flick/Code/Domain/Models/Genre.swift
+++ b/Core/Models/Sources/Genre.swift
@@ -10,15 +10,19 @@ import API
import Foundation
import SwiftFoundation
-struct Genre: Identifiable {
- struct ID: Hashable, Codable {
- var value: Int
+public struct Genre: Identifiable {
+ public struct ID: Hashable, Codable {
+ public var value: Int
+
+ public init(value: Int) {
+ self.value = value
+ }
}
- var id: ID
- var name: String
+ public var id: ID
+ public var name: String
- init(
+ public init(
id: ID,
name: String
) {
@@ -34,7 +38,7 @@ extension Genre: Hashable, Codable {}
// MARK: - Faking
extension Genre: Faking {
- init() {
+ public init() {
id = .init(value: Int.random(in: Int.min ... 0))
name = "Pretty Little Liars"
}
@@ -42,7 +46,7 @@ extension Genre: Faking {
// MARK: - empty
-extension Genre {
+public extension Genre {
static var empty = Genre(
id: .init(value: Int.random(in: Int.min ... 0)),
name: ""
@@ -51,8 +55,8 @@ extension Genre {
// MARK: - Test
-extension Genre {
- public static func testItem(
+public extension Genre {
+ static func testItem(
id: ID = .init(value: Int.random(in: Int.min ... 0)),
name: String = "Pretty Little Liars"
) -> Self {
@@ -62,18 +66,18 @@ extension Genre {
)
}
- public static func testItems(count: Int) -> [Self] {
+ static func testItems(count: Int) -> [Self] {
(0 ..< count).map { .testItem(id: ID(value: $0)) }
}
- public static func testItemIds(count: Int) -> [Self.ID] {
+ static func testItemIds(count: Int) -> [Self.ID] {
(0 ..< count).map { ID(value: $0) }
}
}
// MARK: - asGenre
-extension GenreRemote {
+public extension GenreRemote {
var asGenre: Genre {
.init(
id: .init(value: id),
diff --git a/Flick/Code/Domain/Models/ImageConfigs.swift b/Core/Models/Sources/ImageConfigs.swift
similarity index 84%
rename from Flick/Code/Domain/Models/ImageConfigs.swift
rename to Core/Models/Sources/ImageConfigs.swift
index da3d563..1c65abe 100644
--- a/Flick/Code/Domain/Models/ImageConfigs.swift
+++ b/Core/Models/Sources/ImageConfigs.swift
@@ -10,16 +10,16 @@ import API
import Foundation
import SwiftFoundation
-struct ImageConfigs: Hashable {
- var baseUrl: String
- var secureBaseUrl: String
- var backdropSizes: [Int]
- var logoSizes: [Int]
- var posterSizes: [Int]
- var profileSizes: [Int]
- var stillSizes: [Int]
+public struct ImageConfigs: Hashable {
+ public var baseUrl: String
+ public var secureBaseUrl: String
+ public var backdropSizes: [Int]
+ public var logoSizes: [Int]
+ public var posterSizes: [Int]
+ public var profileSizes: [Int]
+ public var stillSizes: [Int]
- init(
+ public init(
baseUrl: String,
secureBaseUrl: String,
backdropSizes: [Int],
@@ -40,7 +40,7 @@ struct ImageConfigs: Hashable {
// MARK: - asImageConfiguration
-extension ImageConfigsRemote {
+public extension ImageConfigsRemote {
var asImageConfigs: ImageConfigs {
.init(
baseUrl: baseUrl,
@@ -56,8 +56,8 @@ extension ImageConfigsRemote {
// MARK: - Test
-extension ImageConfigs {
- public static func testItem(
+public extension ImageConfigs {
+ static func testItem(
baseUrl: String = "",
secureBaseUrl: String = "",
backdropSizes: [Int] = [300],
@@ -78,7 +78,7 @@ extension ImageConfigs {
}
}
-extension ImageConfigs {
+public extension ImageConfigs {
func sizeUrlComponent(for size: CGSize, in sizes: [Int]) -> String {
let maxImageSize = Int(max(size.width, size.height))
if let sizeUrlComponent = sizes.first(where: { maxImageSize <= $0 }) {
@@ -90,7 +90,7 @@ extension ImageConfigs {
// MARK: - Basic configs
-extension ImageConfigs {
+public extension ImageConfigs {
static var basic: ImageConfigs {
.init(
baseUrl: "http://image.tmdb.org/t/p/",
diff --git a/Flick/Code/Domain/Models/Item.swift b/Core/Models/Sources/Item.swift
similarity index 96%
rename from Flick/Code/Domain/Models/Item.swift
rename to Core/Models/Sources/Item.swift
index e607b71..3b55e33 100644
--- a/Flick/Code/Domain/Models/Item.swift
+++ b/Core/Models/Sources/Item.swift
@@ -10,7 +10,7 @@ import DesignSystem
import Foundation
import SwiftUI
-protocol Item: Identifiable, Hashable {
+public protocol Item: Identifiable, Hashable {
var title: String { get }
var year: String { get }
var rating: Int { get }
@@ -23,7 +23,7 @@ protocol Item: Identifiable, Hashable {
var genreIds: [Int] { get }
}
-extension Item {
+public extension Item {
var durationText: String {
guard duration > 0 else {
return ""
diff --git a/Flick/Code/Domain/Models/Movie.swift b/Core/Models/Sources/Movie.swift
similarity index 83%
rename from Flick/Code/Domain/Models/Movie.swift
rename to Core/Models/Sources/Movie.swift
index e54d241..974c5f2 100644
--- a/Flick/Code/Domain/Models/Movie.swift
+++ b/Core/Models/Sources/Movie.swift
@@ -10,32 +10,37 @@ import API
import Foundation
import SwiftFoundation
import UDF
-
-struct Movie: Item {
- struct ID: Hashable, Codable {
- var value: Int
+import Common
+
+public struct Movie: Item {
+ public struct ID: Hashable, Codable {
+ public var value: Int
+
+ public init(value: Int) {
+ self.value = value
+ }
}
- var id: ID
- var posterPath: String?
- var adult: Bool
- var overview: String
- var releaseDate: Date?
- var genreIds: [Int]
- var originalTitle: String
- var originalLanguage: String
- var title: String
- var backdropPath: String?
- var popularity: Double
- var voteCount: Int
- var video: Bool
- var voteAverage: Double
- var revenue: Int
- var budget: Int
- var status: String
- var runtime: Minutes?
-
- init(
+ public var id: ID
+ public var posterPath: String?
+ public var adult: Bool
+ public var overview: String
+ public var releaseDate: Date?
+ public var genreIds: [Int]
+ public var originalTitle: String
+ public var originalLanguage: String
+ public var title: String
+ public var backdropPath: String?
+ public var popularity: Double
+ public var voteCount: Int
+ public var video: Bool
+ public var voteAverage: Double
+ public var revenue: Int
+ public var budget: Int
+ public var status: String
+ public var runtime: Minutes?
+
+ public init(
id: ID,
posterPath: String?,
adult: Bool,
@@ -83,7 +88,7 @@ extension Movie: Hashable, Codable {}
// MARK: - Faking
extension Movie: Faking {
- init() {
+ public init() {
id = .init(value: Int.random(in: Int.min ... 0))
posterPath = "/e1mjopzAS2KNsvpbpahQ1a6SkSn.jpg"
adult = false
@@ -107,7 +112,7 @@ extension Movie: Faking {
// MARK: - empty
-extension Movie {
+public extension Movie {
static var empty = Movie(
id: .init(value: Int.random(in: Int.min ... 0)),
posterPath: nil,
@@ -132,8 +137,8 @@ extension Movie {
// MARK: - Test
-extension Movie {
- public static func testItem(
+public extension Movie {
+ static func testItem(
id: ID = .init(value: Int.random(in: Int.min ... 0)),
posterPath: String = "/t6HIqrRAclMCA60NsSmeqe9RmNV.jpg",
adult: Bool = false,
@@ -175,18 +180,18 @@ extension Movie {
)
}
- public static func testItems(count: Int) -> [Self] {
+ static func testItems(count: Int) -> [Self] {
(0 ..< count).map { .testItem(id: ID(value: $0)) }
}
- public static func testItemIds(count: Int) -> [Self.ID] {
+ static func testItemIds(count: Int) -> [Self.ID] {
(0 ..< count).map { ID(value: $0) }
}
}
// MARK: - asMovie
-extension MovieRemote {
+public extension MovieRemote {
var asMovie: Movie {
.init(
id: .init(value: id),
@@ -213,7 +218,7 @@ extension MovieRemote {
// MARK: - Item
-extension Movie {
+public extension Movie {
var year: String { releaseDate?.asYearString ?? "" }
var duration: Minutes { runtime ?? 0 }
var rating: Int { Int(voteAverage * 10) }
@@ -222,7 +227,7 @@ extension Movie {
// MARK: - Mergeable
extension Movie: Mergeable {
- func merging(_ newValue: Movie) -> Movie {
+ public func merging(_ newValue: Movie) -> Movie {
filled(from: newValue) { filledValue, oldValue in
filledValue.genreIds = newValue.genreIds.isEmpty ? oldValue.genreIds : newValue.genreIds
filledValue.budget = newValue.budget == 0 ? oldValue.budget : newValue.budget
diff --git a/Flick/Code/Domain/Models/MovieSection.swift b/Core/Models/Sources/MovieSection.swift
similarity index 85%
rename from Flick/Code/Domain/Models/MovieSection.swift
rename to Core/Models/Sources/MovieSection.swift
index c97d5a5..bde3911 100644
--- a/Flick/Code/Domain/Models/MovieSection.swift
+++ b/Core/Models/Sources/MovieSection.swift
@@ -9,15 +9,15 @@
import Foundation
import Localizations
-enum MovieSection: Section {
+public enum MovieSection: Section {
case popular
case nowPlaying
case upcoming
case topRated
- var id: Self { self }
+ public var id: Self { self }
- var title: String {
+ public var title: String {
switch self {
case .popular: Localization.homePopularMoviesSectionTitle()
case .nowPlaying: Localization.homeNowPlayingMoviesSectionTitle()
@@ -26,7 +26,7 @@ enum MovieSection: Section {
}
}
- var urlValue: String {
+ public var urlValue: String {
switch self {
case .popular: "popular"
case .nowPlaying: "now_playing"
diff --git a/Flick/Code/Domain/Models/Network.swift b/Core/Models/Sources/Network.swift
similarity index 68%
rename from Flick/Code/Domain/Models/Network.swift
rename to Core/Models/Sources/Network.swift
index d15059e..2810f88 100644
--- a/Flick/Code/Domain/Models/Network.swift
+++ b/Core/Models/Sources/Network.swift
@@ -10,15 +10,19 @@ import API
import Foundation
import SwiftFoundation
-struct Network: Identifiable {
- struct ID: Hashable, Codable {
- var value: Int
+public struct Network: Identifiable {
+ public struct ID: Hashable, Codable {
+ public var value: Int
+
+ public init(value: Int) {
+ self.value = value
+ }
}
- var id: ID
- var name: String
+ public var id: ID
+ public var name: String
- init(
+ public init(
id: ID,
name: String
) {
@@ -34,7 +38,7 @@ extension Network: Hashable, Codable {}
// MARK: - Faking
extension Network: Faking {
- init() {
+ public init() {
id = .init(value: Int.random(in: Int.min ... 0))
name = "HBO"
}
@@ -42,7 +46,7 @@ extension Network: Faking {
// MARK: - empty
-extension Network {
+public extension Network {
static var empty = Genre(
id: .init(value: Int.random(in: Int.min ... 0)),
name: ""
@@ -51,8 +55,8 @@ extension Network {
// MARK: - Test
-extension Network {
- public static func testItem(
+public extension Network {
+ static func testItem(
id: ID = .init(value: Int.random(in: Int.min ... 0)),
name: String = "HBO"
) -> Self {
@@ -62,18 +66,18 @@ extension Network {
)
}
- public static func testItems(count: Int) -> [Self] {
+ static func testItems(count: Int) -> [Self] {
(0 ..< count).map { .testItem(id: ID(value: $0)) }
}
- public static func testItemIds(count: Int) -> [Self.ID] {
+ static func testItemIds(count: Int) -> [Self.ID] {
(0 ..< count).map { ID(value: $0) }
}
}
// MARK: - asNetwork
-extension NetworkRemote {
+public extension NetworkRemote {
var asNetwork: Network {
.init(
id: .init(value: id),
diff --git a/Flick/Code/Domain/Models/Provider.swift b/Core/Models/Sources/Provider.swift
similarity index 63%
rename from Flick/Code/Domain/Models/Provider.swift
rename to Core/Models/Sources/Provider.swift
index 4ac3331..3b3892c 100644
--- a/Flick/Code/Domain/Models/Provider.swift
+++ b/Core/Models/Sources/Provider.swift
@@ -7,30 +7,31 @@
//
import Foundation
-import Localizations
import SwiftFoundation
+import Common
+import Localizations
-struct Provider {
- var type: ProviderType
- var items: [ProviderItem]
+public struct Provider {
+ public var type: ProviderType
+ public var items: [ProviderItem]
- init(type: ProviderType, items: [ProviderItem]) {
+ public init(type: ProviderType, items: [ProviderItem]) {
self.type = type
self.items = items
}
}
-struct ProviderItem {
- struct ID: Hashable, Codable {
- var value: Int
+public struct ProviderItem {
+ public struct ID: Hashable, Codable {
+ public var value: Int
}
- var id: ID
- var logoPath: String?
- var name: String
- var displayPriority: Int
+ public var id: ID
+ public var logoPath: String?
+ public var name: String
+ public var displayPriority: Int
- init(id: ID, logoPath: String? = nil, name: String, displayPriority: Int) {
+ public init(id: ID, logoPath: String? = nil, name: String, displayPriority: Int) {
self.id = id
self.logoPath = logoPath
self.name = name
@@ -40,12 +41,12 @@ struct ProviderItem {
// MARK: - ProviderType
-enum ProviderType {
+public enum ProviderType {
case flatRate
case rent
case buy
- var localizableTitle: String {
+ public var localizableTitle: String {
switch self {
case .flatRate, .rent:
Localization.whereToWatchStreamTitle()
@@ -58,14 +59,14 @@ enum ProviderType {
// MARK: - Faking
extension Provider: Faking {
- init() {
+ public init() {
type = .flatRate
items = ProviderItem.fakeItems(count: 4)
}
}
extension ProviderItem: Faking {
- init() {
+ public init() {
id = .init(value: Int.random(in: Int.min ... 0))
logoPath = "/peURlLlr8jggOwK53fJ5wdQl05y.jpg"
name = "Apple TV"
diff --git a/Flick/Code/Domain/Models/Review.swift b/Core/Models/Sources/Review.swift
similarity index 79%
rename from Flick/Code/Domain/Models/Review.swift
rename to Core/Models/Sources/Review.swift
index 251cb35..a1ff133 100644
--- a/Flick/Code/Domain/Models/Review.swift
+++ b/Core/Models/Sources/Review.swift
@@ -9,17 +9,21 @@
import API
import SwiftFoundation
-struct Review: Identifiable {
- struct ID: Hashable, Codable {
- var value: String
+public struct Review: Identifiable {
+ public struct ID: Hashable, Codable {
+ public var value: String
+
+ public init(value: String) {
+ self.value = value
+ }
}
- var id: ID
- var author: String
- var authorDetails: Author
- var content: String
+ public var id: ID
+ public var author: String
+ public var authorDetails: Author
+ public var content: String
- init(
+ public init(
id: ID,
author: String,
authorDetails: Author,
@@ -39,7 +43,7 @@ extension Review: Hashable, Codable {}
// MARK: - Faking
extension Review: Faking {
- init() {
+ public init() {
id = .init(value: "\(Int.random(in: Int.min ... 0))")
author = "Cat Ellington"
authorDetails = Author.fakeItem()
@@ -49,7 +53,7 @@ extension Review: Faking {
// MARK: - empty
-extension Review {
+public extension Review {
static var empty = Review(
id: .init(value: "\(Int.random(in: Int.min ... 0))"),
author: "",
@@ -60,8 +64,8 @@ extension Review {
// MARK: - Test
-extension Review {
- public static func testItem(
+public extension Review {
+ static func testItem(
id: ID = .init(value: "\(Int.random(in: Int.min ... 0))"),
author: String = "Cat Ellington",
authorDetails: Author = Author.testItem(),
@@ -75,18 +79,18 @@ extension Review {
)
}
- public static func testItems(count: Int) -> [Self] {
+ static func testItems(count: Int) -> [Self] {
(0 ..< count).map { .testItem(id: ID(value: "\($0)")) }
}
- public static func testItemIds(count: Int) -> [Self.ID] {
+ static func testItemIds(count: Int) -> [Self.ID] {
(0 ..< count).map { ID(value: "\($0)") }
}
}
// MARK: - asReview
-extension ReviewRemote {
+public extension ReviewRemote {
var asReview: Review {
.init(
id: .init(value: id),
diff --git a/Flick/Code/Domain/Models/SearchItem.swift b/Core/Models/Sources/SearchItem.swift
similarity index 84%
rename from Flick/Code/Domain/Models/SearchItem.swift
rename to Core/Models/Sources/SearchItem.swift
index b04f194..a68ec53 100644
--- a/Flick/Code/Domain/Models/SearchItem.swift
+++ b/Core/Models/Sources/SearchItem.swift
@@ -10,32 +10,37 @@ import API
import Foundation
import SwiftFoundation
import UDF
-
-struct SearchItem {
- struct ID: Hashable, Codable {
- var value: Int
+import Common
+
+public struct SearchItem {
+ public struct ID: Hashable, Codable {
+ public var value: Int
+
+ public init(value: Int) {
+ self.value = value
+ }
}
- var id: ID
- var adult: Bool
- var backdropPath: String?
- var name: String?
- var originalLanguage: String
- var originalName: String?
- var overview: String
- var posterPath: String?
- var mediaType: String
- var genreIds: [Int]
- var popularity: Double
- var firstAirDate: Date?
- var voteAverage: Double
- var voteCount: Int
- var originCountry: [String]
- var title, originalTitle: String?
- var releaseDate: Date?
- var video: Bool
-
- init(id: ID,
+ public var id: ID
+ public var adult: Bool
+ public var backdropPath: String?
+ public var name: String?
+ public var originalLanguage: String
+ public var originalName: String?
+ public var overview: String
+ public var posterPath: String?
+ public var mediaType: String
+ public var genreIds: [Int]
+ public var popularity: Double
+ public var firstAirDate: Date?
+ public var voteAverage: Double
+ public var voteCount: Int
+ public var originCountry: [String]
+ public var title, originalTitle: String?
+ public var releaseDate: Date?
+ public var video: Bool
+
+ public init(id: ID,
adult: Bool,
backdropPath: String? = nil,
name: String? = nil,
@@ -84,7 +89,7 @@ extension SearchItem: Hashable, Codable, Identifiable {}
// MARK: - Faking
extension SearchItem: Faking {
- init() {
+ public init() {
id = .init(value: Int.random(in: Int.min ... 0))
adult = false
backdropPath = "/uGy4DCmM33I7l86W7iCskNkvmLD.jpg"
@@ -106,7 +111,7 @@ extension SearchItem: Faking {
// MARK: - empty
-extension SearchItem {
+public extension SearchItem {
static var empty = SearchItem(
id: .init(value: Int.random(in: Int.min ... 0)),
adult: false,
@@ -124,8 +129,8 @@ extension SearchItem {
// MARK: - Test
-extension SearchItem {
- public static func testItem(
+public extension SearchItem {
+ static func testItem(
id: ID = .init(value: Int.random(in: Int.min ... 0)),
adult: Bool = false,
backdropPath: String = "/uGy4DCmM33I7l86W7iCskNkvmLD.jpg",
@@ -169,18 +174,18 @@ extension SearchItem {
)
}
- public static func testItems(count: Int) -> [Self] {
+ static func testItems(count: Int) -> [Self] {
(0 ..< count).map { .testItem(id: ID(value: $0)) }
}
- public static func testItemIds(count: Int) -> [Self.ID] {
+ static func testItemIds(count: Int) -> [Self.ID] {
(0 ..< count).map { ID(value: $0) }
}
}
// MARK: - asSearchItem
-extension SearchItemRemote {
+public extension SearchItemRemote {
var asSearchItem: SearchItem {
.init(id: .init(value: id),
adult: adult,
@@ -206,7 +211,7 @@ extension SearchItemRemote {
// MARK: - SearchItem
-extension SearchItem {
+public extension SearchItem {
var theTitle: String { title ?? name ?? "" }
var year: String { releaseDate?.asYearString ?? firstAirDate?.asYearString ?? "" }
var rating: Int { Int(voteAverage * 10) }
diff --git a/Flick/Code/Domain/Models/Section.swift b/Core/Models/Sources/Section.swift
similarity index 75%
rename from Flick/Code/Domain/Models/Section.swift
rename to Core/Models/Sources/Section.swift
index c7130b7..3ee10eb 100644
--- a/Flick/Code/Domain/Models/Section.swift
+++ b/Core/Models/Sources/Section.swift
@@ -8,6 +8,6 @@
import Foundation
-protocol Section: Identifiable, CaseIterable, Hashable {
+public protocol Section: Identifiable, CaseIterable, Hashable {
var title: String { get }
}
diff --git a/Flick/Code/Domain/Models/Show.swift b/Core/Models/Sources/Show.swift
similarity index 83%
rename from Flick/Code/Domain/Models/Show.swift
rename to Core/Models/Sources/Show.swift
index 6b663b0..76fa515 100644
--- a/Flick/Code/Domain/Models/Show.swift
+++ b/Core/Models/Sources/Show.swift
@@ -10,31 +10,36 @@ import API
import Foundation
import SwiftFoundation
import UDF
-
-struct Show: Item {
- struct ID: Hashable, Codable {
- var value: Int
+import Common
+
+public struct Show: Item {
+ public struct ID: Hashable, Codable {
+ public var value: Int
+
+ public init(value: Int) {
+ self.value = value
+ }
}
- var id: ID
- var posterPath: String?
- var popularity: Double
- var backdropPath: String?
- var voteAverage: Double
- var overview: String
- var firstAirDate: Date?
- var originCountry: [String]
- var genreIds: [Int]
- var originalLanguage: String
- var voteCount: Int
- var name: String
- var originalName: String
- var episodeRunTime: [Minutes]
- var status: String
- var networks: [Network]
- var type: String
-
- init(
+ public var id: ID
+ public var posterPath: String?
+ public var popularity: Double
+ public var backdropPath: String?
+ public var voteAverage: Double
+ public var overview: String
+ public var firstAirDate: Date?
+ public var originCountry: [String]
+ public var genreIds: [Int]
+ public var originalLanguage: String
+ public var voteCount: Int
+ public var name: String
+ public var originalName: String
+ public var episodeRunTime: [Minutes]
+ public var status: String
+ public var networks: [Network]
+ public var type: String
+
+ public init(
id: ID,
posterPath: String?,
popularity: Double,
@@ -80,7 +85,7 @@ extension Show: Hashable, Codable {}
// MARK: - Faking
extension Show: Faking {
- init() {
+ public init() {
id = .init(value: Int.random(in: Int.min ... 0))
posterPath = "/vC324sdfcS313vh9QXwijLIHPJp.jpg"
popularity = 47.432451
@@ -103,7 +108,7 @@ extension Show: Faking {
// MARK: - empty
-extension Show {
+public extension Show {
static var empty = Show(
id: .init(value: Int.random(in: Int.min ... 0)),
posterPath: "",
@@ -127,8 +132,8 @@ extension Show {
// MARK: - Test
-extension Show {
- public static func testItem(
+public extension Show {
+ static func testItem(
id: ID = .init(value: Int.random(in: Int.min ... 0)),
posterPath: String = "/vC324sdfcS313vh9QXwijLIHPJp.jpg",
popularity: Double = 47.432451,
@@ -168,18 +173,18 @@ extension Show {
)
}
- public static func testItems(count: Int) -> [Self] {
+ static func testItems(count: Int) -> [Self] {
(0 ..< count).map { .testItem(id: ID(value: $0)) }
}
- public static func testItemIds(count: Int) -> [Self.ID] {
+ static func testItemIds(count: Int) -> [Self.ID] {
(0 ..< count).map { ID(value: $0) }
}
}
// MARK: - asShow
-extension ShowRemote {
+public extension ShowRemote {
var asShow: Show {
.init(
id: .init(value: id),
@@ -205,7 +210,7 @@ extension ShowRemote {
// MARK: - Item
-extension Show {
+public extension Show {
var title: String { name }
var year: String { firstAirDate?.asYearString ?? "" }
var duration: Minutes { episodeRunTime.first ?? 0 }
@@ -215,7 +220,7 @@ extension Show {
// MARK: - Mergeable
extension Show: Mergeable {
- func merging(_ newValue: Show) -> Show {
+ public func merging(_ newValue: Show) -> Show {
filled(from: newValue) { filledValue, oldValue in
filledValue.genreIds = newValue.genreIds.isEmpty ? oldValue.genreIds : newValue.genreIds
filledValue.episodeRunTime = newValue.episodeRunTime.isEmpty ? oldValue.episodeRunTime : newValue.episodeRunTime
@@ -229,5 +234,5 @@ extension Show: Mergeable {
// MARK: - Computed properties
extension Show {
- var typeText: String { type.isEmpty ? "-" : type }
+ public var typeText: String { type.isEmpty ? "-" : type }
}
diff --git a/Flick/Code/Domain/Models/ShowSection.swift b/Core/Models/Sources/ShowSection.swift
similarity index 83%
rename from Flick/Code/Domain/Models/ShowSection.swift
rename to Core/Models/Sources/ShowSection.swift
index 37f9eab..b09f746 100644
--- a/Flick/Code/Domain/Models/ShowSection.swift
+++ b/Core/Models/Sources/ShowSection.swift
@@ -7,16 +7,17 @@
//
import Foundation
+import Common
import Localizations
-enum ShowSection: Section {
+public enum ShowSection: Section {
case popular
case airingToday
case onTheAir
case topRated
- var id: Self { self }
- var title: String {
+ public var id: Self { self }
+ public var title: String {
switch self {
case .popular: Localization.homePopularShowsSectionTitle()
case .airingToday: Localization.homeAiringTodayShowsSectionTitle()
@@ -25,7 +26,7 @@ enum ShowSection: Section {
}
}
- var urlValue: String {
+ public var urlValue: String {
switch self {
case .popular: "popular"
case .airingToday: "airing_today"
diff --git a/DesignSystem/.gitignore b/DesignSystem/.gitignore
deleted file mode 100644
index 3b29812..0000000
--- a/DesignSystem/.gitignore
+++ /dev/null
@@ -1,9 +0,0 @@
-.DS_Store
-/.build
-/Packages
-/*.xcodeproj
-xcuserdata/
-DerivedData/
-.swiftpm/config/registries.json
-.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata
-.netrc
diff --git a/DesignSystem/.swiftpm/xcode/package.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/DesignSystem/.swiftpm/xcode/package.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
deleted file mode 100644
index 18d9810..0000000
--- a/DesignSystem/.swiftpm/xcode/package.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
- IDEDidComputeMac32BitWarning
-
-
-
diff --git a/DesignSystem/Package.swift b/DesignSystem/Package.swift
deleted file mode 100644
index c200e06..0000000
--- a/DesignSystem/Package.swift
+++ /dev/null
@@ -1,28 +0,0 @@
-// swift-tools-version: 5.7
-// The swift-tools-version declares the minimum version of Swift required to build this package.
-
-import PackageDescription
-
-let package = Package(
- name: "DesignSystem",
- platforms: [
- .iOS(.v16),
- ],
- products: [
- .library(
- name: "DesignSystem",
- targets: ["DesignSystem"]
- ),
- ],
- dependencies: [
- .package(url: "https://github.com/Maks-Jago/SwiftUIKit", from: "0.3.5"),
- ],
- targets: [
- .target(
- name: "DesignSystem",
- dependencies: [
- .product(name: "SwiftUI-Kit", package: "SwiftUIKit"),
- ]
- ),
- ]
-)
diff --git a/DesignSystem/README.md b/DesignSystem/README.md
deleted file mode 100644
index 53ac668..0000000
--- a/DesignSystem/README.md
+++ /dev/null
@@ -1,3 +0,0 @@
-# DesignSystem
-
-A description of this package.
diff --git a/Flick.xcodeproj/project.pbxproj b/Flick.xcodeproj/project.pbxproj
deleted file mode 100644
index 62defca..0000000
--- a/Flick.xcodeproj/project.pbxproj
+++ /dev/null
@@ -1,782 +0,0 @@
-// !$*UTF8*$!
-{
- archiveVersion = 1;
- classes = {
- };
- objectVersion = 70;
- objects = {
-
-/* Begin PBXBuildFile section */
- 508E9EA629127A6F00C8BE18 /* API in Frameworks */ = {isa = PBXBuildFile; productRef = 508E9EA529127A6F00C8BE18 /* API */; };
- 508E9EAD29127BD700C8BE18 /* SwiftFoundation in Frameworks */ = {isa = PBXBuildFile; productRef = 508E9EAC29127BD700C8BE18 /* SwiftFoundation */; };
- 508E9EB029127BF000C8BE18 /* SwiftUI-Kit in Frameworks */ = {isa = PBXBuildFile; productRef = 508E9EAF29127BF000C8BE18 /* SwiftUI-Kit */; };
- 508E9EB629127C9C00C8BE18 /* SwiftUISnapshotTestCase in Frameworks */ = {isa = PBXBuildFile; productRef = 508E9EB529127C9C00C8BE18 /* SwiftUISnapshotTestCase */; };
- 50F2C67D2A0823D700600695 /* UDF in Frameworks */ = {isa = PBXBuildFile; productRef = 50F2C67C2A0823D700600695 /* UDF */; };
- AB808D952A13DC4700B23260 /* FlagKit in Frameworks */ = {isa = PBXBuildFile; productRef = AB808D942A13DC4700B23260 /* FlagKit */; };
- B9F0F5972D75F84600231F1F /* Localizations in Frameworks */ = {isa = PBXBuildFile; productRef = 5071C7512989387F00591ACD /* Localizations */; settings = {ATTRIBUTES = (Required, ); }; };
- C66B31BB291CFFC90043CC0F /* DesignSystem in Frameworks */ = {isa = PBXBuildFile; productRef = C66B31BA291CFFC90043CC0F /* DesignSystem */; };
- C6E02A762964664F001853A3 /* SDWebImageSwiftUI in Frameworks */ = {isa = PBXBuildFile; productRef = C6E02A752964664F001853A3 /* SDWebImageSwiftUI */; };
-/* End PBXBuildFile section */
-
-/* Begin PBXContainerItemProxy section */
- 508E9E84291278E200C8BE18 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 508E9E6B291278DC00C8BE18 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = 508E9E72291278DC00C8BE18;
- remoteInfo = Flick;
- };
- 508E9ECA2912809A00C8BE18 /* PBXContainerItemProxy */ = {
- isa = PBXContainerItemProxy;
- containerPortal = 508E9E6B291278DC00C8BE18 /* Project object */;
- proxyType = 1;
- remoteGlobalIDString = 508E9E72291278DC00C8BE18;
- remoteInfo = Flick;
- };
-/* End PBXContainerItemProxy section */
-
-/* Begin PBXFileReference section */
- 508E9E73291278DC00C8BE18 /* Flick.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Flick.app; sourceTree = BUILT_PRODUCTS_DIR; };
- 508E9E83291278E200C8BE18 /* SnapshotTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = SnapshotTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
- 508E9EA329127A2600C8BE18 /* API */ = {isa = PBXFileReference; lastKnownFileType = wrapper; path = API; sourceTree = ""; };
- 508E9EC62912809900C8BE18 /* UnitTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = UnitTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
- 508E9ED02912BD9A00C8BE18 /* DesignSystem */ = {isa = PBXFileReference; lastKnownFileType = wrapper; path = DesignSystem; sourceTree = ""; };
- B9E3FA712D75D8FB006EB33F /* Localizations */ = {isa = PBXFileReference; lastKnownFileType = wrapper; path = Localizations; sourceTree = ""; };
-/* End PBXFileReference section */
-
-/* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */
- B98F5F7E2D79EB0800F0FD60 /* PBXFileSystemSynchronizedBuildFileExceptionSet */ = {
- isa = PBXFileSystemSynchronizedBuildFileExceptionSet;
- membershipExceptions = (
- Info.plist,
- );
- target = 508E9E72291278DC00C8BE18 /* Flick */;
- };
- B98F5F7F2D79EB0800F0FD60 /* PBXFileSystemSynchronizedBuildFileExceptionSet */ = {
- isa = PBXFileSystemSynchronizedBuildFileExceptionSet;
- membershipExceptions = (
- "Preview Content/Preview Assets.xcassets",
- );
- target = 508E9E82291278E200C8BE18 /* SnapshotTests */;
- };
-/* End PBXFileSystemSynchronizedBuildFileExceptionSet section */
-
-/* Begin PBXFileSystemSynchronizedRootGroup section */
- B98F5EDE2D79EB0800F0FD60 /* Flick */ = {isa = PBXFileSystemSynchronizedRootGroup; exceptions = (B98F5F7E2D79EB0800F0FD60 /* PBXFileSystemSynchronizedBuildFileExceptionSet */, B98F5F7F2D79EB0800F0FD60 /* PBXFileSystemSynchronizedBuildFileExceptionSet */, ); explicitFileTypes = {}; explicitFolders = (); path = Flick; sourceTree = ""; };
- B98F632E2D79EB4100F0FD60 /* SnapshotTests */ = {isa = PBXFileSystemSynchronizedRootGroup; explicitFileTypes = {}; explicitFolders = (); path = SnapshotTests; sourceTree = ""; };
-/* End PBXFileSystemSynchronizedRootGroup section */
-
-/* Begin PBXFrameworksBuildPhase section */
- 508E9E70291278DC00C8BE18 /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- B9F0F5972D75F84600231F1F /* Localizations in Frameworks */,
- C6E02A762964664F001853A3 /* SDWebImageSwiftUI in Frameworks */,
- AB808D952A13DC4700B23260 /* FlagKit in Frameworks */,
- C66B31BB291CFFC90043CC0F /* DesignSystem in Frameworks */,
- 50F2C67D2A0823D700600695 /* UDF in Frameworks */,
- 508E9EA629127A6F00C8BE18 /* API in Frameworks */,
- 508E9EAD29127BD700C8BE18 /* SwiftFoundation in Frameworks */,
- 508E9EB029127BF000C8BE18 /* SwiftUI-Kit in Frameworks */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 508E9E80291278E200C8BE18 /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- 508E9EB629127C9C00C8BE18 /* SwiftUISnapshotTestCase in Frameworks */,
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 508E9EC32912809900C8BE18 /* Frameworks */ = {
- isa = PBXFrameworksBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
-/* End PBXFrameworksBuildPhase section */
-
-/* Begin PBXGroup section */
- 508E9E6A291278DC00C8BE18 = {
- isa = PBXGroup;
- children = (
- 508E9EA229127A2600C8BE18 /* Packages */,
- B98F5EDE2D79EB0800F0FD60 /* Flick */,
- B98F632E2D79EB4100F0FD60 /* SnapshotTests */,
- 508E9EC72912809A00C8BE18 /* UnitTests */,
- 508E9E74291278DC00C8BE18 /* Products */,
- 508E9EA429127A6F00C8BE18 /* Frameworks */,
- );
- sourceTree = "";
- };
- 508E9E74291278DC00C8BE18 /* Products */ = {
- isa = PBXGroup;
- children = (
- 508E9E73291278DC00C8BE18 /* Flick.app */,
- 508E9E83291278E200C8BE18 /* SnapshotTests.xctest */,
- 508E9EC62912809900C8BE18 /* UnitTests.xctest */,
- );
- name = Products;
- sourceTree = "";
- };
- 508E9EA229127A2600C8BE18 /* Packages */ = {
- isa = PBXGroup;
- children = (
- 508E9EA329127A2600C8BE18 /* API */,
- 508E9ED02912BD9A00C8BE18 /* DesignSystem */,
- B9E3FA712D75D8FB006EB33F /* Localizations */,
- );
- name = Packages;
- sourceTree = "";
- };
- 508E9EA429127A6F00C8BE18 /* Frameworks */ = {
- isa = PBXGroup;
- children = (
- );
- name = Frameworks;
- sourceTree = "";
- };
- 508E9EC72912809A00C8BE18 /* UnitTests */ = {
- isa = PBXGroup;
- children = (
- 508E9ECF2912B9D400C8BE18 /* Modules */,
- );
- path = UnitTests;
- sourceTree = "";
- };
- 508E9ECF2912B9D400C8BE18 /* Modules */ = {
- isa = PBXGroup;
- children = (
- );
- path = Modules;
- sourceTree = "";
- };
-/* End PBXGroup section */
-
-/* Begin PBXNativeTarget section */
- 508E9E72291278DC00C8BE18 /* Flick */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = 508E9E97291278E200C8BE18 /* Build configuration list for PBXNativeTarget "Flick" */;
- buildPhases = (
- 508E9E6F291278DC00C8BE18 /* Sources */,
- 508E9E70291278DC00C8BE18 /* Frameworks */,
- 508E9E71291278DC00C8BE18 /* Resources */,
- B96AF5CC2D79DB79000F9C6E /* Swift Format */,
- );
- buildRules = (
- );
- dependencies = (
- );
- fileSystemSynchronizedGroups = (
- B98F5EDE2D79EB0800F0FD60 /* Flick */,
- );
- name = Flick;
- packageProductDependencies = (
- 508E9EA529127A6F00C8BE18 /* API */,
- 508E9EAC29127BD700C8BE18 /* SwiftFoundation */,
- 508E9EAF29127BF000C8BE18 /* SwiftUI-Kit */,
- C66B31BA291CFFC90043CC0F /* DesignSystem */,
- C6E02A752964664F001853A3 /* SDWebImageSwiftUI */,
- 5071C7512989387F00591ACD /* Localizations */,
- 50F2C67C2A0823D700600695 /* UDF */,
- AB808D942A13DC4700B23260 /* FlagKit */,
- );
- productName = Flick;
- productReference = 508E9E73291278DC00C8BE18 /* Flick.app */;
- productType = "com.apple.product-type.application";
- };
- 508E9E82291278E200C8BE18 /* SnapshotTests */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = 508E9E9A291278E200C8BE18 /* Build configuration list for PBXNativeTarget "SnapshotTests" */;
- buildPhases = (
- 508E9E7F291278E200C8BE18 /* Sources */,
- 508E9E80291278E200C8BE18 /* Frameworks */,
- 508E9E81291278E200C8BE18 /* Resources */,
- );
- buildRules = (
- );
- dependencies = (
- 508E9E85291278E200C8BE18 /* PBXTargetDependency */,
- );
- fileSystemSynchronizedGroups = (
- B98F632E2D79EB4100F0FD60 /* SnapshotTests */,
- );
- name = SnapshotTests;
- packageProductDependencies = (
- 508E9EB529127C9C00C8BE18 /* SwiftUISnapshotTestCase */,
- );
- productName = FlickTests;
- productReference = 508E9E83291278E200C8BE18 /* SnapshotTests.xctest */;
- productType = "com.apple.product-type.bundle.unit-test";
- };
- 508E9EC52912809900C8BE18 /* UnitTests */ = {
- isa = PBXNativeTarget;
- buildConfigurationList = 508E9ECC2912809A00C8BE18 /* Build configuration list for PBXNativeTarget "UnitTests" */;
- buildPhases = (
- 508E9EC22912809900C8BE18 /* Sources */,
- 508E9EC32912809900C8BE18 /* Frameworks */,
- 508E9EC42912809900C8BE18 /* Resources */,
- );
- buildRules = (
- );
- dependencies = (
- 508E9ECB2912809A00C8BE18 /* PBXTargetDependency */,
- );
- name = UnitTests;
- productName = UnitTests;
- productReference = 508E9EC62912809900C8BE18 /* UnitTests.xctest */;
- productType = "com.apple.product-type.bundle.unit-test";
- };
-/* End PBXNativeTarget section */
-
-/* Begin PBXProject section */
- 508E9E6B291278DC00C8BE18 /* Project object */ = {
- isa = PBXProject;
- attributes = {
- BuildIndependentTargetsInParallel = 1;
- LastSwiftUpdateCheck = 1410;
- LastUpgradeCheck = 1410;
- ORGANIZATIONNAME = urlaunched.com;
- TargetAttributes = {
- 508E9E72291278DC00C8BE18 = {
- CreatedOnToolsVersion = 14.1;
- };
- 508E9E82291278E200C8BE18 = {
- CreatedOnToolsVersion = 14.1;
- TestTargetID = 508E9E72291278DC00C8BE18;
- };
- 508E9EC52912809900C8BE18 = {
- CreatedOnToolsVersion = 14.1;
- TestTargetID = 508E9E72291278DC00C8BE18;
- };
- };
- };
- buildConfigurationList = 508E9E6E291278DC00C8BE18 /* Build configuration list for PBXProject "Flick" */;
- compatibilityVersion = "Xcode 13.0";
- developmentRegion = en;
- hasScannedForEncodings = 0;
- knownRegions = (
- en,
- Base,
- );
- mainGroup = 508E9E6A291278DC00C8BE18;
- packageReferences = (
- 508E9EA729127AEA00C8BE18 /* XCRemoteSwiftPackageReference "SwiftUI-UDF" */,
- 508E9EAB29127BD700C8BE18 /* XCRemoteSwiftPackageReference "SwiftFoundation" */,
- 508E9EAE29127BF000C8BE18 /* XCRemoteSwiftPackageReference "SwiftUIKit" */,
- 508E9EB429127C9C00C8BE18 /* XCRemoteSwiftPackageReference "swiftui-snapshot-test-case" */,
- C6E02A742964664F001853A3 /* XCRemoteSwiftPackageReference "SDWebImageSwiftUI" */,
- AB808D932A13DC4700B23260 /* XCRemoteSwiftPackageReference "FlagKit" */,
- );
- productRefGroup = 508E9E74291278DC00C8BE18 /* Products */;
- projectDirPath = "";
- projectRoot = "";
- targets = (
- 508E9E72291278DC00C8BE18 /* Flick */,
- 508E9E82291278E200C8BE18 /* SnapshotTests */,
- 508E9EC52912809900C8BE18 /* UnitTests */,
- );
- };
-/* End PBXProject section */
-
-/* Begin PBXResourcesBuildPhase section */
- 508E9E71291278DC00C8BE18 /* Resources */ = {
- isa = PBXResourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 508E9E81291278E200C8BE18 /* Resources */ = {
- isa = PBXResourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 508E9EC42912809900C8BE18 /* Resources */ = {
- isa = PBXResourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
-/* End PBXResourcesBuildPhase section */
-
-/* Begin PBXShellScriptBuildPhase section */
- B96AF5CC2D79DB79000F9C6E /* Swift Format */ = {
- isa = PBXShellScriptBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- inputFileListPaths = (
- );
- inputPaths = (
- );
- name = "Swift Format";
- outputFileListPaths = (
- );
- outputPaths = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- shellPath = /bin/sh;
- shellScript = "#!/bin/bash\n\n# Get the value of core.hooksPath\nHOOKS_PATH=$(git config --get core.hooksPath)\n\n# Check if core.hooksPath is set to '.githooks'\nif [ \"$HOOKS_PATH\" != \".githooks\" ]; then\n echo \"Setting up pre-commit hook...\"\n chmod +x .githooks/pre-commit\n git config core.hooksPath .githooks\nfi\n\n";
- };
-/* End PBXShellScriptBuildPhase section */
-
-/* Begin PBXSourcesBuildPhase section */
- 508E9E6F291278DC00C8BE18 /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 508E9E7F291278E200C8BE18 /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
- 508E9EC22912809900C8BE18 /* Sources */ = {
- isa = PBXSourcesBuildPhase;
- buildActionMask = 2147483647;
- files = (
- );
- runOnlyForDeploymentPostprocessing = 0;
- };
-/* End PBXSourcesBuildPhase section */
-
-/* Begin PBXTargetDependency section */
- 508E9E85291278E200C8BE18 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = 508E9E72291278DC00C8BE18 /* Flick */;
- targetProxy = 508E9E84291278E200C8BE18 /* PBXContainerItemProxy */;
- };
- 508E9ECB2912809A00C8BE18 /* PBXTargetDependency */ = {
- isa = PBXTargetDependency;
- target = 508E9E72291278DC00C8BE18 /* Flick */;
- targetProxy = 508E9ECA2912809A00C8BE18 /* PBXContainerItemProxy */;
- };
-/* End PBXTargetDependency section */
-
-/* Begin XCBuildConfiguration section */
- 508E9E95291278E200C8BE18 /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
- CLANG_ANALYZER_NONNULL = YES;
- CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
- CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
- CLANG_ENABLE_MODULES = YES;
- CLANG_ENABLE_OBJC_ARC = YES;
- CLANG_ENABLE_OBJC_WEAK = YES;
- CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
- CLANG_WARN_BOOL_CONVERSION = YES;
- CLANG_WARN_COMMA = YES;
- CLANG_WARN_CONSTANT_CONVERSION = YES;
- CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
- CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
- CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
- CLANG_WARN_EMPTY_BODY = YES;
- CLANG_WARN_ENUM_CONVERSION = YES;
- CLANG_WARN_INFINITE_RECURSION = YES;
- CLANG_WARN_INT_CONVERSION = YES;
- CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
- CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
- CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
- CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
- CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
- CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
- CLANG_WARN_STRICT_PROTOTYPES = YES;
- CLANG_WARN_SUSPICIOUS_MOVE = YES;
- CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
- CLANG_WARN_UNREACHABLE_CODE = YES;
- CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
- COPY_PHASE_STRIP = NO;
- DEBUG_INFORMATION_FORMAT = dwarf;
- ENABLE_STRICT_OBJC_MSGSEND = YES;
- ENABLE_TESTABILITY = YES;
- ENABLE_TESTING_SEARCH_PATHS = 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.1;
- 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;
- };
- 508E9E96291278E200C8BE18 /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ALWAYS_SEARCH_USER_PATHS = NO;
- CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
- CLANG_ANALYZER_NONNULL = YES;
- CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
- CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
- CLANG_ENABLE_MODULES = YES;
- CLANG_ENABLE_OBJC_ARC = YES;
- CLANG_ENABLE_OBJC_WEAK = YES;
- CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
- CLANG_WARN_BOOL_CONVERSION = YES;
- CLANG_WARN_COMMA = YES;
- CLANG_WARN_CONSTANT_CONVERSION = YES;
- CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
- CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
- CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
- CLANG_WARN_EMPTY_BODY = YES;
- CLANG_WARN_ENUM_CONVERSION = YES;
- CLANG_WARN_INFINITE_RECURSION = YES;
- CLANG_WARN_INT_CONVERSION = YES;
- CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
- CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
- CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
- CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
- CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
- CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
- CLANG_WARN_STRICT_PROTOTYPES = YES;
- CLANG_WARN_SUSPICIOUS_MOVE = YES;
- CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
- CLANG_WARN_UNREACHABLE_CODE = YES;
- CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
- COPY_PHASE_STRIP = NO;
- DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
- ENABLE_NS_ASSERTIONS = NO;
- ENABLE_STRICT_OBJC_MSGSEND = YES;
- ENABLE_TESTING_SEARCH_PATHS = 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.1;
- MTL_ENABLE_DEBUG_INFO = NO;
- MTL_FAST_MATH = YES;
- SDKROOT = iphoneos;
- SWIFT_COMPILATION_MODE = wholemodule;
- SWIFT_OPTIMIZATION_LEVEL = "-O";
- VALIDATE_PRODUCT = YES;
- };
- name = Release;
- };
- 508E9E98291278E200C8BE18 /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
- ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
- CODE_SIGN_STYLE = Automatic;
- CURRENT_PROJECT_VERSION = 1;
- DEVELOPMENT_ASSET_PATHS = "\"Flick/Preview Content\"";
- DEVELOPMENT_TEAM = XK5AEQZHJU;
- ENABLE_PREVIEWS = YES;
- GENERATE_INFOPLIST_FILE = YES;
- INFOPLIST_FILE = Flick/Info.plist;
- INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.entertainment";
- INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES;
- INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
- INFOPLIST_KEY_UILaunchStoryboardName = "Launch Screen.storyboard";
- INFOPLIST_KEY_UISupportedInterfaceOrientations = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown";
- INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown";
- IPHONEOS_DEPLOYMENT_TARGET = 17.0;
- LD_RUNPATH_SEARCH_PATHS = (
- "$(inherited)",
- "@executable_path/Frameworks",
- );
- MARKETING_VERSION = 1.0;
- PRODUCT_BUNDLE_IDENTIFIER = com.urlaunched.flick;
- PRODUCT_NAME = "$(TARGET_NAME)";
- SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
- SUPPORTS_MACCATALYST = NO;
- SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = YES;
- SWIFT_EMIT_LOC_STRINGS = YES;
- SWIFT_VERSION = 5.0;
- TARGETED_DEVICE_FAMILY = 1;
- };
- name = Debug;
- };
- 508E9E99291278E200C8BE18 /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
- ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
- CODE_SIGN_STYLE = Automatic;
- CURRENT_PROJECT_VERSION = 1;
- DEVELOPMENT_ASSET_PATHS = "\"Flick/Preview Content\"";
- DEVELOPMENT_TEAM = XK5AEQZHJU;
- ENABLE_PREVIEWS = YES;
- GENERATE_INFOPLIST_FILE = YES;
- INFOPLIST_FILE = Flick/Info.plist;
- INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.entertainment";
- INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES;
- INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
- INFOPLIST_KEY_UILaunchStoryboardName = "Launch Screen.storyboard";
- INFOPLIST_KEY_UISupportedInterfaceOrientations = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown";
- INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown";
- IPHONEOS_DEPLOYMENT_TARGET = 17.0;
- LD_RUNPATH_SEARCH_PATHS = (
- "$(inherited)",
- "@executable_path/Frameworks",
- );
- MARKETING_VERSION = 1.0;
- PRODUCT_BUNDLE_IDENTIFIER = com.urlaunched.flick;
- PRODUCT_NAME = "$(TARGET_NAME)";
- SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
- SUPPORTS_MACCATALYST = NO;
- SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = YES;
- SWIFT_EMIT_LOC_STRINGS = YES;
- SWIFT_VERSION = 5.0;
- TARGETED_DEVICE_FAMILY = 1;
- };
- name = Release;
- };
- 508E9E9B291278E200C8BE18 /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- BUNDLE_LOADER = "$(TEST_HOST)";
- CODE_SIGN_STYLE = Automatic;
- CURRENT_PROJECT_VERSION = 1;
- DEVELOPMENT_TEAM = XK5AEQZHJU;
- GENERATE_INFOPLIST_FILE = YES;
- IPHONEOS_DEPLOYMENT_TARGET = 17.0;
- MARKETING_VERSION = 1.0;
- PRODUCT_BUNDLE_IDENTIFIER = com.urlaunched.SnapshotTests;
- PRODUCT_NAME = "$(TARGET_NAME)";
- SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
- SUPPORTS_MACCATALYST = NO;
- SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
- SWIFT_EMIT_LOC_STRINGS = NO;
- SWIFT_VERSION = 5.0;
- TARGETED_DEVICE_FAMILY = 1;
- TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Flick.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Flick";
- };
- name = Debug;
- };
- 508E9E9C291278E200C8BE18 /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- BUNDLE_LOADER = "$(TEST_HOST)";
- CODE_SIGN_STYLE = Automatic;
- CURRENT_PROJECT_VERSION = 1;
- DEVELOPMENT_TEAM = XK5AEQZHJU;
- GENERATE_INFOPLIST_FILE = YES;
- IPHONEOS_DEPLOYMENT_TARGET = 17.0;
- MARKETING_VERSION = 1.0;
- PRODUCT_BUNDLE_IDENTIFIER = com.urlaunched.SnapshotTests;
- PRODUCT_NAME = "$(TARGET_NAME)";
- SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
- SUPPORTS_MACCATALYST = NO;
- SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
- SWIFT_EMIT_LOC_STRINGS = NO;
- SWIFT_VERSION = 5.0;
- TARGETED_DEVICE_FAMILY = 1;
- TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Flick.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Flick";
- };
- name = Release;
- };
- 508E9ECD2912809A00C8BE18 /* Debug */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- BUNDLE_LOADER = "$(TEST_HOST)";
- CODE_SIGN_STYLE = Automatic;
- CURRENT_PROJECT_VERSION = 1;
- DEVELOPMENT_TEAM = XK5AEQZHJU;
- GENERATE_INFOPLIST_FILE = YES;
- IPHONEOS_DEPLOYMENT_TARGET = 16.0;
- MARKETING_VERSION = 1.0;
- PRODUCT_BUNDLE_IDENTIFIER = com.urlaunched.UnitTests;
- PRODUCT_NAME = "$(TARGET_NAME)";
- SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
- SUPPORTS_MACCATALYST = NO;
- SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
- SWIFT_EMIT_LOC_STRINGS = NO;
- SWIFT_VERSION = 5.0;
- TARGETED_DEVICE_FAMILY = 1;
- TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Flick.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Flick";
- };
- name = Debug;
- };
- 508E9ECE2912809A00C8BE18 /* Release */ = {
- isa = XCBuildConfiguration;
- buildSettings = {
- BUNDLE_LOADER = "$(TEST_HOST)";
- CODE_SIGN_STYLE = Automatic;
- CURRENT_PROJECT_VERSION = 1;
- DEVELOPMENT_TEAM = XK5AEQZHJU;
- GENERATE_INFOPLIST_FILE = YES;
- IPHONEOS_DEPLOYMENT_TARGET = 16.0;
- MARKETING_VERSION = 1.0;
- PRODUCT_BUNDLE_IDENTIFIER = com.urlaunched.UnitTests;
- PRODUCT_NAME = "$(TARGET_NAME)";
- SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
- SUPPORTS_MACCATALYST = NO;
- SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
- SWIFT_EMIT_LOC_STRINGS = NO;
- SWIFT_VERSION = 5.0;
- TARGETED_DEVICE_FAMILY = 1;
- TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Flick.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/Flick";
- };
- name = Release;
- };
-/* End XCBuildConfiguration section */
-
-/* Begin XCConfigurationList section */
- 508E9E6E291278DC00C8BE18 /* Build configuration list for PBXProject "Flick" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- 508E9E95291278E200C8BE18 /* Debug */,
- 508E9E96291278E200C8BE18 /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Release;
- };
- 508E9E97291278E200C8BE18 /* Build configuration list for PBXNativeTarget "Flick" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- 508E9E98291278E200C8BE18 /* Debug */,
- 508E9E99291278E200C8BE18 /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Release;
- };
- 508E9E9A291278E200C8BE18 /* Build configuration list for PBXNativeTarget "SnapshotTests" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- 508E9E9B291278E200C8BE18 /* Debug */,
- 508E9E9C291278E200C8BE18 /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Release;
- };
- 508E9ECC2912809A00C8BE18 /* Build configuration list for PBXNativeTarget "UnitTests" */ = {
- isa = XCConfigurationList;
- buildConfigurations = (
- 508E9ECD2912809A00C8BE18 /* Debug */,
- 508E9ECE2912809A00C8BE18 /* Release */,
- );
- defaultConfigurationIsVisible = 0;
- defaultConfigurationName = Release;
- };
-/* End XCConfigurationList section */
-
-/* Begin XCRemoteSwiftPackageReference section */
- 508E9EA729127AEA00C8BE18 /* XCRemoteSwiftPackageReference "SwiftUI-UDF" */ = {
- isa = XCRemoteSwiftPackageReference;
- repositoryURL = "https://github.com/Maks-Jago/SwiftUI-UDF";
- requirement = {
- kind = upToNextMajorVersion;
- minimumVersion = "1.5.1-rc.1";
- };
- };
- 508E9EAB29127BD700C8BE18 /* XCRemoteSwiftPackageReference "SwiftFoundation" */ = {
- isa = XCRemoteSwiftPackageReference;
- repositoryURL = "https://github.com/Maks-Jago/SwiftFoundation.git";
- requirement = {
- kind = upToNextMajorVersion;
- minimumVersion = 0.3.6;
- };
- };
- 508E9EAE29127BF000C8BE18 /* XCRemoteSwiftPackageReference "SwiftUIKit" */ = {
- isa = XCRemoteSwiftPackageReference;
- repositoryURL = "https://github.com/Maks-Jago/SwiftUIKit";
- requirement = {
- kind = upToNextMajorVersion;
- minimumVersion = 0.4.0;
- };
- };
- 508E9EB429127C9C00C8BE18 /* XCRemoteSwiftPackageReference "swiftui-snapshot-test-case" */ = {
- isa = XCRemoteSwiftPackageReference;
- repositoryURL = "https://github.com/Maks-Jago/swiftui-snapshot-test-case";
- requirement = {
- kind = upToNextMajorVersion;
- minimumVersion = 1.6.2;
- };
- };
- AB808D932A13DC4700B23260 /* XCRemoteSwiftPackageReference "FlagKit" */ = {
- isa = XCRemoteSwiftPackageReference;
- repositoryURL = "https://github.com/madebybowtie/FlagKit";
- requirement = {
- kind = upToNextMajorVersion;
- minimumVersion = 2.0.0;
- };
- };
- C6E02A742964664F001853A3 /* XCRemoteSwiftPackageReference "SDWebImageSwiftUI" */ = {
- isa = XCRemoteSwiftPackageReference;
- repositoryURL = "https://github.com/SDWebImage/SDWebImageSwiftUI";
- requirement = {
- kind = upToNextMajorVersion;
- minimumVersion = 3.1.3;
- };
- };
-/* End XCRemoteSwiftPackageReference section */
-
-/* Begin XCSwiftPackageProductDependency section */
- 5071C7512989387F00591ACD /* Localizations */ = {
- isa = XCSwiftPackageProductDependency;
- productName = Localizations;
- };
- 508E9EA529127A6F00C8BE18 /* API */ = {
- isa = XCSwiftPackageProductDependency;
- productName = API;
- };
- 508E9EAC29127BD700C8BE18 /* SwiftFoundation */ = {
- isa = XCSwiftPackageProductDependency;
- package = 508E9EAB29127BD700C8BE18 /* XCRemoteSwiftPackageReference "SwiftFoundation" */;
- productName = SwiftFoundation;
- };
- 508E9EAF29127BF000C8BE18 /* SwiftUI-Kit */ = {
- isa = XCSwiftPackageProductDependency;
- package = 508E9EAE29127BF000C8BE18 /* XCRemoteSwiftPackageReference "SwiftUIKit" */;
- productName = "SwiftUI-Kit";
- };
- 508E9EB529127C9C00C8BE18 /* SwiftUISnapshotTestCase */ = {
- isa = XCSwiftPackageProductDependency;
- package = 508E9EB429127C9C00C8BE18 /* XCRemoteSwiftPackageReference "swiftui-snapshot-test-case" */;
- productName = SwiftUISnapshotTestCase;
- };
- 50F2C67C2A0823D700600695 /* UDF */ = {
- isa = XCSwiftPackageProductDependency;
- package = 508E9EA729127AEA00C8BE18 /* XCRemoteSwiftPackageReference "SwiftUI-UDF" */;
- productName = UDF;
- };
- AB808D942A13DC4700B23260 /* FlagKit */ = {
- isa = XCSwiftPackageProductDependency;
- package = AB808D932A13DC4700B23260 /* XCRemoteSwiftPackageReference "FlagKit" */;
- productName = FlagKit;
- };
- C66B31BA291CFFC90043CC0F /* DesignSystem */ = {
- isa = XCSwiftPackageProductDependency;
- productName = DesignSystem;
- };
- C6E02A752964664F001853A3 /* SDWebImageSwiftUI */ = {
- isa = XCSwiftPackageProductDependency;
- package = C6E02A742964664F001853A3 /* XCRemoteSwiftPackageReference "SDWebImageSwiftUI" */;
- productName = SDWebImageSwiftUI;
- };
-/* End XCSwiftPackageProductDependency section */
- };
- rootObject = 508E9E6B291278DC00C8BE18 /* Project object */;
-}
diff --git a/Flick.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Flick.xcodeproj/project.xcworkspace/contents.xcworkspacedata
deleted file mode 100644
index 919434a..0000000
--- a/Flick.xcodeproj/project.xcworkspace/contents.xcworkspacedata
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
diff --git a/Flick.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Flick.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
deleted file mode 100644
index 18d9810..0000000
--- a/Flick.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
-
- IDEDidComputeMac32BitWarning
-
-
-
diff --git a/Flick.xcodeproj/xcshareddata/xcschemes/Flick.xcscheme b/Flick.xcodeproj/xcshareddata/xcschemes/Flick.xcscheme
deleted file mode 100644
index cdb0be8..0000000
--- a/Flick.xcodeproj/xcshareddata/xcschemes/Flick.xcscheme
+++ /dev/null
@@ -1,103 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/Flick/Code/Common/Common.swift b/Flick/Code/Common/Common.swift
deleted file mode 100644
index 819584b..0000000
--- a/Flick/Code/Common/Common.swift
+++ /dev/null
@@ -1,57 +0,0 @@
-//
-// Common.swift
-// Flick
-//
-// Created by Alexander Sharko on 20.01.2023.
-// Copyright © 2023 urlaunched.com. All rights reserved.
-//
-
-import Localizations
-import SwiftUI
-
-// MARK: - Typealiases
-
-typealias Minutes = Int
-
-let Localization = R.string.localizable
-
-// MARK: - Constants
-
-let kPerPage: Int = 20
-
-// MARK: - AppLink
-
-enum AppLink: String, Identifiable {
- case aboutUs = "https://www.themoviedb.org/about"
- case tmdbAPI = "https://developer.themoviedb.org/docs/getting-started"
- case privacyPolicy = "https://www.themoviedb.org/privacy-policy"
-
- var id: Self { self }
- var urlValue: URL { URL(string: rawValue)! }
-}
-
-// MARK: - Helpers
-
-func areEqual(_ lhs: Lhs, _ rhs: some Equatable) -> Bool {
- guard let rhsAs = rhs as? Lhs else {
- return false
- }
-
- return lhs == rhsAs
-}
-
-@ViewBuilder
-func buildView(
- item: any Item,
- movieView: (Movie) -> some View,
- showView: (Show) -> some View
-) -> some View {
- switch item {
- case let item as Movie:
- movieView(item)
- case let item as Show:
- showView(item)
- default:
- EmptyView()
- }
-}
diff --git a/Flick/Code/Modules/Cast/ItemDetailsCast/ItemDetailsCastComponent.swift b/Flick/Code/Modules/Cast/ItemDetailsCast/ItemDetailsCastComponent.swift
deleted file mode 100644
index 9aa2d1c..0000000
--- a/Flick/Code/Modules/Cast/ItemDetailsCast/ItemDetailsCastComponent.swift
+++ /dev/null
@@ -1,70 +0,0 @@
-//
-// ItemDetailsCastComponent.swift
-// Flick
-//
-// Created by Alexander Sharko on 19.01.2023.
-// Copyright © 2023 urlaunched.com. All rights reserved.
-//
-
-import DesignSystem
-import Localizations
-import SwiftUI
-import UDF
-
-struct ItemDetailsCastComponent: Component {
- struct Props {
- var cast: [Cast.ID]
- var castById: (Cast.ID) -> Cast
- var isRedacted: Bool
- var router: Router = .init()
- }
-
- var props: Props
-
- @Environment(\.width) private var componentWidth
- @Environment(\.globalRouter) private var globalRouter
-
- var body: some View {
- if props.cast.isNotEmpty {
- VStack(alignment: .leading, spacing: 21) {
- SectionHeaderView(
- title: Localization.itemDetailsCastSectionTitle(),
- seeAllAction: {
- globalRouter.navigate(for: ItemDetailsCastRouting.self, to: .cast(props.cast))
- }
- )
-
- ScrollView(.horizontal) {
- HStack(alignment: .top, spacing: 16) {
- let width = abs(componentWidth - 64) / 3
- let height = width * 1.25
- ForEach(props.cast, id: \.self) { id in
- CastCardView(
- cast: props.castById(id),
- size: .init(width: width, height: height),
- lineLimit: 1
- )
- .frame(width: width)
- }
- }
- .padding(.horizontal)
- }
- .scrollIndicators(.hidden)
- }
- .isRedacted(props.isRedacted)
- .disabled(props.isRedacted)
- }
- }
-}
-
-// MARK: - Preview
-
-#Preview {
- ItemDetailsCastComponent(
- props: .init(
- cast: [],
- castById: { _ in .fakeItem() },
- isRedacted: false
- )
- )
-}
diff --git a/Flick/Code/Modules/Cast/View/CastComponent.swift b/Flick/Code/Modules/Cast/View/CastComponent.swift
deleted file mode 100644
index 82ab1ce..0000000
--- a/Flick/Code/Modules/Cast/View/CastComponent.swift
+++ /dev/null
@@ -1,63 +0,0 @@
-//
-// CastComponent.swift
-// Flick
-//
-// Created by Alexander Sharko on 20.01.2023.
-// Copyright © 2023 urlaunched.com. All rights reserved.
-//
-
-import DesignSystem
-import Localizations
-import SwiftUI
-import UDF
-
-struct CastComponent: Component {
- struct Props {
- var cast: [Cast.ID]
- var castById: (Cast.ID) -> Cast
- var dialogStatus: Binding
- var router: Router = .init()
- }
-
- var props: Props
-
- let columns: [GridItem] = [GridItem(.flexible(), spacing: 16, alignment: .top),
- GridItem(.flexible(), spacing: 16, alignment: .top),
- GridItem(.flexible(), alignment: .top)]
-
- var body: some View {
- GeometryReader { geometry in
- ScrollView {
- LazyVGrid(columns: columns, spacing: 0) {
- let width = abs(geometry.size.width - 64) / 3
- let height = width * 1.25
- ForEach(props.cast, id: \.value) { id in
- let cast = props.castById(id)
- CastCardView(
- cast: cast,
- size: .init(width: width, height: height)
- )
- .padding(.bottom)
- }
- }
- .padding(.horizontal)
- .padding(.top)
- }
- }
- .background(Color.flMain.edgesIgnoringSafeArea(.all))
- .customNavigationTitle(Localization.itemDetailsCastNavigationTitle())
- .dialog(status: props.dialogStatus)
- }
-}
-
-// MARK: - Preview
-
-#Preview {
- CastComponent(
- props: .init(
- cast: [],
- castById: { _ in .fakeItem() },
- dialogStatus: .constant(.dismissed)
- )
- )
-}
diff --git a/Flick/Code/Modules/Home/View/Home/HomeComponent.swift b/Flick/Code/Modules/Home/View/Home/HomeComponent.swift
deleted file mode 100644
index 157a824..0000000
--- a/Flick/Code/Modules/Home/View/Home/HomeComponent.swift
+++ /dev/null
@@ -1,110 +0,0 @@
-//
-// HomeComponent.swift
-// Flick
-//
-// Created by Alexander Sharko on 30.11.2022.
-// Copyright © 2022 urlaunched.com. All rights reserved.
-//
-
-import Localizations
-import SwiftUI
-import UDF
-
-struct HomeComponent: Component {
- struct Props {
- var contentType: Binding
- var movieSections: [MovieSection]
- var showSections: [ShowSection]
- var moviesForSection: (MovieSection) -> [Movie]
- var showsForSection: (ShowSection) -> [Show]
- var isMoviesRedacted: (MovieSection) -> Bool
- var isShowsRedacted: (ShowSection) -> Bool
- var dialogStatus: Binding
- }
-
- var props: Props
-
- var body: some View {
- ScrollView {
- VStack(spacing: 8) {
- ContentToggle(contentType: props.contentType)
-
- switch props.contentType.wrappedValue {
- case .movie:
- movieSectionsView
- case .show:
- showSectionsView
- }
- }
- .padding(.bottom)
- }
- .navigationBarTitleDisplayMode(.inline)
- .customNavigationTitle(Localization.homeNavigationTitle())
- }
-}
-
-extension HomeComponent {
- var movieSectionsView: some View {
- ForEach(MovieSection.allCases) { movieSection in
- let isRedacted = props.isMoviesRedacted(movieSection)
- Group {
- if movieSection == MovieSection.popular {
- MainHomeSectionContainer(
- section: movieSection,
- retrieveItems: { props.moviesForSection(movieSection) },
- scopeOfWork: { state in state.allMovies }
- )
- } else {
- HomeSectionContainer(
- section: movieSection,
- retrieveItems: { props.moviesForSection(movieSection) },
- scopeOfWork: { state in state.allMovies }
- )
- }
- }
- .isRedacted(isRedacted)
- .disabled(isRedacted)
- }
- }
-
- var showSectionsView: some View {
- ForEach(ShowSection.allCases) { showSection in
- let isRedacted = props.isShowsRedacted(showSection)
- Group {
- if showSection == ShowSection.popular {
- MainHomeSectionContainer(
- section: showSection,
- retrieveItems: { props.showsForSection(showSection) },
- scopeOfWork: { state in state.allShows }
- )
- } else {
- HomeSectionContainer(
- section: showSection,
- retrieveItems: { props.showsForSection(showSection) },
- scopeOfWork: { state in state.allShows }
- )
- }
- }
- .isRedacted(isRedacted)
- .disabled(isRedacted)
- }
- .dialog(status: props.dialogStatus)
- }
-}
-
-// MARK: - Preview
-
-#Preview {
- HomeComponent(
- props: .init(
- contentType: .constant(.movie),
- movieSections: [],
- showSections: [],
- moviesForSection: { _ in Movie.fakeItems() },
- showsForSection: { _ in Show.fakeItems() },
- isMoviesRedacted: { _ in false },
- isShowsRedacted: { _ in false },
- dialogStatus: .constant(.dismissed)
- )
- )
-}
diff --git a/Flick/Code/Modules/Home/View/HomeSection/HomeSectionComponent.swift b/Flick/Code/Modules/Home/View/HomeSection/HomeSectionComponent.swift
deleted file mode 100644
index ddca369..0000000
--- a/Flick/Code/Modules/Home/View/HomeSection/HomeSectionComponent.swift
+++ /dev/null
@@ -1,66 +0,0 @@
-//
-// HomeSectionComponent.swift
-// Flick
-//
-// Created by Alexander Sharko on 30.11.2022.
-// Copyright © 2022 urlaunched.com. All rights reserved.
-//
-
-import DesignSystem
-import SwiftUI
-import UDF
-
-struct HomeSectionComponent: Component {
- struct Props {
- var section: S
- var items: [any Item]
- var genreById: (Genre.ID) -> Genre?
- var router: Router = .init()
- }
-
- var props: Props
-
- @Environment(\.globalRouter) private var globalRouter
-
- var body: some View {
- VStack(spacing: 24) {
- SectionHeaderView(
- title: props.section.title,
- seeAllAction: {
- globalRouter.navigate(for: HomeRouting.self, to: .sectionDetails(props.section))
- }
- )
-
- ScrollView(.horizontal, showsIndicators: false) {
- LazyHStack(alignment: .top, spacing: 16) {
- ForEach(props.items.indices, id: \.self) { index in
- let item = props.items[index]
- HomeCardView(
- item: item,
- genres: item.genres(action: props.genreById)
- )
- .padding(.leading, index == props.items.indices.first ? 16 : 0)
- .padding(.trailing, index == props.items.indices.last ? 16 : 0)
- .embedInPlainButton {
- globalRouter.navigate(for: HomeRouting.self, to: .itemDetails(item))
- }
- .buttonStyle(.scaled)
- }
- }
- }
- }
- .frame(height: 340, alignment: .top)
- }
-}
-
-// MARK: - Preview
-
-#Preview {
- HomeSectionComponent(
- props: .init(
- section: MovieSection.nowPlaying,
- items: [],
- genreById: { _ in .fakeItem() }
- )
- )
-}
diff --git a/Flick/Code/Modules/Home/View/MainHomeSection/MainHomeSectionComponent.swift b/Flick/Code/Modules/Home/View/MainHomeSection/MainHomeSectionComponent.swift
deleted file mode 100644
index 116b030..0000000
--- a/Flick/Code/Modules/Home/View/MainHomeSection/MainHomeSectionComponent.swift
+++ /dev/null
@@ -1,46 +0,0 @@
-//
-// MainHomeSectionComponent.swift
-// Flick
-//
-// Created by Alexander Sharko on 01.12.2022.
-// Copyright © 2022 urlaunched.com. All rights reserved.
-//
-
-import SwiftUI
-import SwiftUI_Kit
-import UDF
-
-struct MainHomeSectionComponent: Component {
- struct Props {
- var section: S
- var items: [any Item]
- var genreById: (Genre.ID) -> Genre?
- var router: Router = .init()
- }
-
- var props: Props
-
- @Environment(\.globalRouter) private var globalRouter
-
- var body: some View {
- VStack(spacing: 10) {
- SectionHeaderView(
- title: props.section.title,
- seeAllAction: {
- globalRouter.navigate(for: MainHomeSectionRouting.self, to: .sectionDetails(props.section))
- }
- )
- .padding(.bottom)
-
- MainSectionScrollView(
- items: props.items,
- genresByItem: { $0.genres(action: props.genreById) },
- navigateToItemDetails: { item in
- globalRouter.navigate(for: MainHomeSectionRouting.self, to: .itemDetails(item))
- }
- )
- }
- .clipShape(RoundedCorner(radius: 50, corners: [.bottomLeft, .bottomRight]))
- .frame(height: 460)
- }
-}
diff --git a/Flick/Code/Modules/Home/View/MainHomeSection/MainHomeSectionRouter.swift b/Flick/Code/Modules/Home/View/MainHomeSection/MainHomeSectionRouter.swift
deleted file mode 100644
index 69c7eb2..0000000
--- a/Flick/Code/Modules/Home/View/MainHomeSection/MainHomeSectionRouter.swift
+++ /dev/null
@@ -1,55 +0,0 @@
-//
-// MainHomeSectionRouter.swift
-// Flick
-//
-// Created by Valentin Petrulia on 27.02.2025.
-// Copyright © 2025 urlaunched.com. All rights reserved.
-//
-
-import SwiftUI
-import UDF
-
-struct MainHomeSectionRouting: Routing {
- enum Route: Hashable {
- case itemDetails(any Item)
- case sectionDetails(any Section)
-
- func hash(into hasher: inout Hasher) {
- switch self {
- case let .itemDetails(item):
- hasher.combine(item)
- case let .sectionDetails(section):
- hasher.combine(section)
- }
- }
-
- static func == (lhs: Self, rhs: Self) -> Bool {
- switch (lhs, rhs) {
- case let (.itemDetails(lhsItem), .itemDetails(rhsItem)):
- areEqual(lhsItem, rhsItem)
- case let (.sectionDetails(lhsSection), .sectionDetails(rhsSection)):
- areEqual(lhsSection, rhsSection)
- default:
- false
- }
- }
- }
-
- @ViewBuilder func view(for route: Route) -> some View {
- switch route {
- case let .itemDetails(item):
- buildView(
- item: item,
- movieView: { MovieDetailsContainer(id: $0.id) },
- showView: { ShowDetailsContainer(id: $0.id) }
- )
-
- case let .sectionDetails(section):
- if let movieSection = section as? MovieSection {
- SectionDetailsContainer(section: movieSection)
- } else if let showSection = section as? ShowSection {
- SectionDetailsContainer(section: showSection)
- }
- }
- }
-}
diff --git a/Flick/Code/Modules/ItemDetails/View/ItemDetailsRouter.swift b/Flick/Code/Modules/ItemDetails/View/ItemDetailsRouter.swift
deleted file mode 100644
index 3850781..0000000
--- a/Flick/Code/Modules/ItemDetails/View/ItemDetailsRouter.swift
+++ /dev/null
@@ -1,76 +0,0 @@
-//
-// ItemDetailsRouter.swift
-// Flick
-//
-// Created by Alexander Sharko on 20.01.2023.
-// Copyright © 2023 urlaunched.com. All rights reserved.
-//
-
-import SwiftUI
-import UDF
-
-struct ItemDetailsRouting: Routing {
- enum Route: Hashable {
- case cast(any Item)
- case reviews(any Item)
- case recommendations(any Item)
- case whereToWatch(any Item)
-
- func hash(into hasher: inout Hasher) {
- switch self {
- case let .cast(item):
- hasher.combine(item)
- case let .reviews(item):
- hasher.combine(item)
- case let .recommendations(item):
- hasher.combine(item)
- case let .whereToWatch(item):
- hasher.combine(item)
- }
- }
-
- static func == (lhs: Self, rhs: Self) -> Bool {
- switch (lhs, rhs) {
- case let (.cast(lhsItem), .cast(rhsItem)):
- areEqual(lhsItem, rhsItem)
- case let (.reviews(lhsItem), .reviews(rhsItem)):
- areEqual(lhsItem, rhsItem)
- case let (.recommendations(lhsItem), .recommendations(rhsItem)):
- areEqual(lhsItem, rhsItem)
- case let (.whereToWatch(lhsItem), .whereToWatch(rhsItem)):
- areEqual(lhsItem, rhsItem)
- default:
- false
- }
- }
- }
-
- @ViewBuilder
- func view(for route: Route) -> some View {
- switch route {
- case let .cast(item):
- buildView(
- item: item,
- movieView: { MovieCastContainer(id: $0.id) },
- showView: { ShowCastContainer(id: $0.id) }
- )
-
- case let .reviews(item):
- buildView(
- item: item,
- movieView: { MovieDetailsReviewsContainer(id: $0.id) },
- showView: { ShowDetailsReviewsContainer(id: $0.id) }
- )
-
- case let .recommendations(item):
- buildView(
- item: item,
- movieView: { MovieDetailsRecommendationsContainer(id: $0.id) },
- showView: { ShowDetailsRecommendationsContainer(id: $0.id) }
- )
-
- case let .whereToWatch(item):
- WhereToWatchContainer(item: item)
- }
- }
-}
diff --git a/Flick/Code/Modules/MyFavorites/View/MyFavorites/MyFavoritesComponent.swift b/Flick/Code/Modules/MyFavorites/View/MyFavorites/MyFavoritesComponent.swift
deleted file mode 100644
index 63eeffb..0000000
--- a/Flick/Code/Modules/MyFavorites/View/MyFavorites/MyFavoritesComponent.swift
+++ /dev/null
@@ -1,58 +0,0 @@
-//
-// MyFavoritesComponent.swift
-// Flick
-//
-// Created by Vlad Andrieiev on 22.05.2023.
-// Copyright © 2023 urlaunched.com. All rights reserved.
-//
-
-import DesignSystem
-import Localizations
-import SwiftUI
-import UDF
-
-struct MyFavoritesComponent: Component {
- struct Props {
- var contentType: Binding
- var items: [any Item]
- var genreById: (Genre.ID) -> Genre?
- var loadMoreAction: Command
- var isRedacted: Bool
- var dialogStatus: Binding
- }
-
- var props: Props
-
- var body: some View {
- SelectiveItemsList(items: props.items, genreById: props.genreById, loadMoreAction: props.loadMoreAction, isRedacted: props.isRedacted) {
- ContentToggle(contentType: props.contentType)
- }
- .customNavigationTitle(Localization.myFavoritesNavigationTitle())
- .navigationBarTitleDisplayMode(.inline)
- .toolbar {
- ToolbarItem(placement: .navigationBarTrailing) {
- Button(action: {}) {
- Image.filter
- .aspectFit()
- .frame(24)
- }
- }
- }
- .dialog(status: props.dialogStatus)
- }
-}
-
-// MARK: - Preview
-
-#Preview {
- MyFavoritesComponent(
- props: .init(
- contentType: .constant(.movie),
- items: Movie.testItems(count: 10),
- genreById: { _ in .testItem() },
- loadMoreAction: {},
- isRedacted: true,
- dialogStatus: .constant(.dismissed)
- )
- )
-}
diff --git a/Flick/Code/Modules/Recommendations/View/ItemDetailsRecommendations/ItemDetailsRecommendationsRouting.swift b/Flick/Code/Modules/Recommendations/View/ItemDetailsRecommendations/ItemDetailsRecommendationsRouting.swift
deleted file mode 100644
index 66f8cec..0000000
--- a/Flick/Code/Modules/Recommendations/View/ItemDetailsRecommendations/ItemDetailsRecommendationsRouting.swift
+++ /dev/null
@@ -1,54 +0,0 @@
-//
-// ItemDetailsRecommendationsRouting.swift
-// Flick
-//
-// Created by Alexander Sharko on 05.02.2023.
-// Copyright © 2023 urlaunched.com. All rights reserved.
-//
-
-import SwiftUI
-import UDF
-
-struct ItemDetailsRecommendationsRouting: Routing {
- enum Route: Hashable {
- case itemDetails(any Item)
- case recommendations(any Item)
-
- func hash(into hasher: inout Hasher) {
- switch self {
- case let .itemDetails(item):
- hasher.combine(item)
- case let .recommendations(item):
- hasher.combine(item)
- }
- }
-
- static func == (lhs: Self, rhs: Self) -> Bool {
- switch (lhs, rhs) {
- case let (.itemDetails(lhsItem), .itemDetails(rhsItem)):
- areEqual(lhsItem, rhsItem)
- case let (.recommendations(lhsItem), .recommendations(rhsItem)):
- areEqual(lhsItem, rhsItem)
- default:
- false
- }
- }
- }
-
- @ViewBuilder func view(for route: Route) -> some View {
- switch route {
- case let .itemDetails(item):
- if let movie = item as? Movie {
- MovieDetailsContainer(id: movie.id)
- } else if let show = item as? Show {
- ShowDetailsContainer(id: show.id)
- }
- case let .recommendations(item):
- if let movie = item as? Movie {
- MovieRecommendationsContainer(id: movie.id)
- } else if let show = item as? Show {
- ShowRecommendationsContainer(id: show.id)
- }
- }
- }
-}
diff --git a/Flick/Code/Modules/Reviews/View/ItemDetailsReviews/ItemDetailsReviewsComponent.swift b/Flick/Code/Modules/Reviews/View/ItemDetailsReviews/ItemDetailsReviewsComponent.swift
deleted file mode 100644
index bf85f73..0000000
--- a/Flick/Code/Modules/Reviews/View/ItemDetailsReviews/ItemDetailsReviewsComponent.swift
+++ /dev/null
@@ -1,49 +0,0 @@
-//
-// ItemDetailsReviewsComponent.swift
-// Flick
-//
-// Created by Alexander Sharko on 08.02.2023.
-// Copyright © 2023 urlaunched.com. All rights reserved.
-//
-
-import DesignSystem
-import Localizations
-import SwiftUI
-import UDF
-
-struct ItemDetailsReviewsComponent: Component {
- struct Props {
- var item: any Item
- var reviews: [Review.ID]
- var reviewById: (Review.ID) -> Review
- var isRedacted: Bool
- var router: Router = .init()
- }
-
- var props: Props
-
- @Environment(\.globalRouter) private var globalRouter
-
- var body: some View {
- if let id = props.reviews.first {
- VStack(alignment: .leading, spacing: 24) {
- SectionHeaderView(
- title: Localization.itemDetailsReviewsSectionTitle(props.reviews.count),
- seeAllAction: {
- globalRouter.navigate(for: ItemDetailsReviewsRouting.self, to: .reviews(props.item))
- }
- )
-
- ReviewRow(review: props.reviewById(id))
- .embedInPlainButton {
- globalRouter.navigate(for: ItemDetailsReviewsRouting.self, to: .reviewDetails(id))
- }
- .buttonStyle(.scaled)
- .padding(.horizontal)
- }
- .isRedacted(props.isRedacted)
- .disabled(props.isRedacted)
- .toolbar(.hidden, for: .tabBar)
- }
- }
-}
diff --git a/Flick/Code/Modules/Reviews/View/ItemDetailsReviews/ItemDetailsReviewsRouter.swift b/Flick/Code/Modules/Reviews/View/ItemDetailsReviews/ItemDetailsReviewsRouter.swift
deleted file mode 100644
index 81dc570..0000000
--- a/Flick/Code/Modules/Reviews/View/ItemDetailsReviews/ItemDetailsReviewsRouter.swift
+++ /dev/null
@@ -1,50 +0,0 @@
-//
-// ItemDetailsReviewsRouter.swift
-// Flick
-//
-// Created by Alexander Sharko on 08.02.2023.
-// Copyright © 2023 urlaunched.com. All rights reserved.
-//
-
-import SwiftUI
-import UDF
-
-struct ItemDetailsReviewsRouting: Routing {
- enum Route: Hashable {
- case reviewDetails(Review.ID)
- case reviews(any Item)
-
- func hash(into hasher: inout Hasher) {
- switch self {
- case let .reviewDetails(id):
- hasher.combine(id)
- case let .reviews(item):
- hasher.combine(item)
- }
- }
-
- static func == (lhs: Self, rhs: Self) -> Bool {
- switch (lhs, rhs) {
- case let (.reviewDetails(lhsId), .reviewDetails(rhsId)):
- areEqual(lhsId, rhsId)
- case let (.reviews(lhsItem), .reviews(rhsItem)):
- areEqual(lhsItem, rhsItem)
- default:
- false
- }
- }
- }
-
- @ViewBuilder func view(for route: Route) -> some View {
- switch route {
- case let .reviewDetails(id):
- ReviewDetailsContainer(reviewId: id)
- case let .reviews(item):
- if let movie = item as? Movie {
- MovieReviewsContainer(id: movie.id)
- } else if let show = item as? Show {
- ShowReviewsContainer(id: show.id)
- }
- }
- }
-}
diff --git a/Flick/Code/Modules/Reviews/View/ReviewDetails/ReviewDetailsComponent.swift b/Flick/Code/Modules/Reviews/View/ReviewDetails/ReviewDetailsComponent.swift
deleted file mode 100644
index 3b60f38..0000000
--- a/Flick/Code/Modules/Reviews/View/ReviewDetails/ReviewDetailsComponent.swift
+++ /dev/null
@@ -1,45 +0,0 @@
-//
-// ReviewDetailsComponent.swift
-// Flick
-//
-// Created by Alexander Sharko on 10.02.2023.
-// Copyright © 2023 urlaunched.com. All rights reserved.
-//
-
-import DesignSystem
-import Localizations
-import SwiftUI
-import UDF
-
-struct ReviewDetailsComponent: Component {
- struct Props {
- var review: Review
- }
-
- var props: Props
-
- var body: some View {
- ScrollView {
- VStack(alignment: .leading, spacing: 16) {
- ReviewHeaderView(review: props.review, placeholderColor: .flSecondary)
- .padding(.horizontal, 10)
- Text(props.review.content)
- .customFont(.body)
- .foregroundStyle(.flText)
- }
- .padding()
- }
- .customNavigationTitle(Localization.itemDetailsReviewsNavigationTitle())
- .background(Color.flMain.edgesIgnoringSafeArea(.all))
- }
-}
-
-// MARK: - Preview
-
-#Preview {
- ReviewDetailsComponent(
- props: .init(
- review: .fakeItem()
- )
- )
-}
diff --git a/Flick/Code/Modules/Reviews/View/Reviews/ReviewsComponent.swift b/Flick/Code/Modules/Reviews/View/Reviews/ReviewsComponent.swift
deleted file mode 100644
index 98c9899..0000000
--- a/Flick/Code/Modules/Reviews/View/Reviews/ReviewsComponent.swift
+++ /dev/null
@@ -1,62 +0,0 @@
-//
-// ReviewsComponent.swift
-// Flick
-//
-// Created by Alexander Sharko on 10.02.2023.
-// Copyright © 2023 urlaunched.com. All rights reserved.
-//
-
-import DesignSystem
-import Localizations
-import SwiftUI
-import UDF
-
-struct ReviewsComponent: Component {
- struct Props {
- var reviews: [Review.ID]
- var reviewById: (Review.ID) -> Review
- var loadMoreAction: Command
- var dialogStatus: Binding
- var router: Router = .init()
- }
-
- var props: Props
-
- @Environment(\.globalRouter) private var globalRouter
-
- var body: some View {
- VStack(spacing: 16) {
- List(props.reviews, id: \.self) { id in
- ReviewRow(review: props.reviewById(id))
- .embedInPlainButton {
- globalRouter.navigate(for: ReviewsRouting.self, to: .reviewDetails(id))
- }
- .onAppear {
- if id == props.reviews.last {
- props.loadMoreAction()
- }
- }
- .listRowInsets(EdgeInsets(top: 8, leading: 16, bottom: 8, trailing: 16))
- .listRowBackground(Color.flMain)
- .listRowSeparator(.hidden)
- }
- .listStyle(.plain)
- .scrollContentBackground(.hidden)
- }
- .customNavigationTitle(Localization.itemDetailsReviewsNavigationTitle())
- .background(Color.flMain.edgesIgnoringSafeArea(.all))
- }
-}
-
-// MARK: - Preview
-
-#Preview {
- ReviewsComponent(
- props: .init(
- reviews: Review.testItemIds(count: 10),
- reviewById: { _ in .fakeItem() },
- loadMoreAction: {},
- dialogStatus: .constant(.dismissed)
- )
- )
-}
diff --git a/Flick/Code/Modules/SignIn/View/SignInRouter.swift b/Flick/Code/Modules/SignIn/View/SignInRouter.swift
deleted file mode 100644
index 5a909ce..0000000
--- a/Flick/Code/Modules/SignIn/View/SignInRouter.swift
+++ /dev/null
@@ -1,24 +0,0 @@
-//
-// SignInRouter.swift
-// Flick
-//
-// Created by Alexander Sharko on 18.11.2022.
-// Copyright © 2022 urlaunched.com. All rights reserved.
-//
-
-import SwiftUI
-import UDF
-
-struct SignInRouting: Routing {
- enum Route {
- case resetPassword
- case signUp
- }
-
- @ViewBuilder func view(for route: Route) -> some View {
- switch route {
- case .resetPassword: Text("Reset password")
- case .signUp: Text("Sign Up")
- }
- }
-}
diff --git a/Flick/Info.plist b/Flick/Info.plist
deleted file mode 100644
index 832db83..0000000
--- a/Flick/Info.plist
+++ /dev/null
@@ -1,15 +0,0 @@
-
-
-
-
- CFBundleAllowMixedLocalizations
-
- ITSAppUsesNonExemptEncryption
-
- UIAppFonts
-
- Poppins-Regular.ttf
- Poppins-SemiBold.ttf
-
-
-
diff --git a/Flick/Resources/Preview Content/Preview Assets.xcassets/Contents.json b/Flick/Resources/Preview Content/Preview Assets.xcassets/Contents.json
new file mode 100644
index 0000000..73c0059
--- /dev/null
+++ b/Flick/Resources/Preview Content/Preview Assets.xcassets/Contents.json
@@ -0,0 +1,6 @@
+{
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Flick/Preview Content/Preview Assets.xcassets/poster.imageset/Contents.json b/Flick/Resources/Preview Content/Preview Assets.xcassets/poster.imageset/Contents.json
similarity index 100%
rename from Flick/Preview Content/Preview Assets.xcassets/poster.imageset/Contents.json
rename to Flick/Resources/Preview Content/Preview Assets.xcassets/poster.imageset/Contents.json
diff --git a/Flick/Preview Content/Preview Assets.xcassets/poster.imageset/film poster.png b/Flick/Resources/Preview Content/Preview Assets.xcassets/poster.imageset/film poster.png
similarity index 100%
rename from Flick/Preview Content/Preview Assets.xcassets/poster.imageset/film poster.png
rename to Flick/Resources/Preview Content/Preview Assets.xcassets/poster.imageset/film poster.png
diff --git a/Flick/Preview Content/Preview Assets.xcassets/poster.imageset/film poster@2x.png b/Flick/Resources/Preview Content/Preview Assets.xcassets/poster.imageset/film poster@2x.png
similarity index 100%
rename from Flick/Preview Content/Preview Assets.xcassets/poster.imageset/film poster@2x.png
rename to Flick/Resources/Preview Content/Preview Assets.xcassets/poster.imageset/film poster@2x.png
diff --git a/Flick/Preview Content/Preview Assets.xcassets/poster.imageset/film poster@3x.png b/Flick/Resources/Preview Content/Preview Assets.xcassets/poster.imageset/film poster@3x.png
similarity index 100%
rename from Flick/Preview Content/Preview Assets.xcassets/poster.imageset/film poster@3x.png
rename to Flick/Resources/Preview Content/Preview Assets.xcassets/poster.imageset/film poster@3x.png
diff --git a/Flick/Resources/SplashScreen/Launch Screen.storyboard b/Flick/Resources/SplashScreen/LaunchScreen.storyboard
similarity index 100%
rename from Flick/Resources/SplashScreen/Launch Screen.storyboard
rename to Flick/Resources/SplashScreen/LaunchScreen.storyboard
diff --git a/Flick/Sources/Code/Common/Common.swift b/Flick/Sources/Code/Common/Common.swift
new file mode 100644
index 0000000..01555f6
--- /dev/null
+++ b/Flick/Sources/Code/Common/Common.swift
@@ -0,0 +1,26 @@
+//
+// Common.swift
+// Flick
+//
+// Created by Bogdan Petkanych on 04.05.2026.
+// Copyright © 2026 urlaunched. All rights reserved.
+//
+import SwiftUI
+import Models
+import Localizations
+
+@ViewBuilder
+func buildView(
+ item: any Item,
+ movieView: (Movie) -> some View,
+ showView: (Show) -> some View
+) -> some View {
+ switch item {
+ case let item as Movie:
+ movieView(item)
+ case let item as Show:
+ showView(item)
+ default:
+ EmptyView()
+ }
+}
diff --git a/Flick/Code/Domain/UDF/Actions.swift b/Flick/Sources/Code/Domain/UDF/Actions.swift
similarity index 100%
rename from Flick/Code/Domain/UDF/Actions.swift
rename to Flick/Sources/Code/Domain/UDF/Actions.swift
diff --git a/Flick/Code/Domain/UDF/AppState.swift b/Flick/Sources/Code/Domain/UDF/AppState.swift
similarity index 100%
rename from Flick/Code/Domain/UDF/AppState.swift
rename to Flick/Sources/Code/Domain/UDF/AppState.swift
diff --git a/Flick/Code/Domain/UDF/Storage/Cast/CastStorage.swift b/Flick/Sources/Code/Domain/UDF/Storage/Cast/CastStorage.swift
similarity index 97%
rename from Flick/Code/Domain/UDF/Storage/Cast/CastStorage.swift
rename to Flick/Sources/Code/Domain/UDF/Storage/Cast/CastStorage.swift
index 93fbf5d..4c3b612 100644
--- a/Flick/Code/Domain/UDF/Storage/Cast/CastStorage.swift
+++ b/Flick/Sources/Code/Domain/UDF/Storage/Cast/CastStorage.swift
@@ -8,6 +8,7 @@
import Foundation
import UDF
+@preconcurrency import Models
struct AllCast: Reducible {
var byId: [Cast.ID: Cast] = [:]
diff --git a/Flick/Code/Domain/UDF/Storage/Genres/GenresStorage.swift b/Flick/Sources/Code/Domain/UDF/Storage/Genres/GenresStorage.swift
similarity index 96%
rename from Flick/Code/Domain/UDF/Storage/Genres/GenresStorage.swift
rename to Flick/Sources/Code/Domain/UDF/Storage/Genres/GenresStorage.swift
index 7cd30b1..d532aad 100644
--- a/Flick/Code/Domain/UDF/Storage/Genres/GenresStorage.swift
+++ b/Flick/Sources/Code/Domain/UDF/Storage/Genres/GenresStorage.swift
@@ -8,6 +8,7 @@
import Foundation
import UDF
+@preconcurrency import Models
struct AllGenres: Reducible {
var byId: [Genre.ID: Genre] = [:]
diff --git a/Flick/Code/Domain/UDF/Storage/Movies/MoviesStorage.swift b/Flick/Sources/Code/Domain/UDF/Storage/Movies/MoviesStorage.swift
similarity index 97%
rename from Flick/Code/Domain/UDF/Storage/Movies/MoviesStorage.swift
rename to Flick/Sources/Code/Domain/UDF/Storage/Movies/MoviesStorage.swift
index 074119c..6221513 100644
--- a/Flick/Code/Domain/UDF/Storage/Movies/MoviesStorage.swift
+++ b/Flick/Sources/Code/Domain/UDF/Storage/Movies/MoviesStorage.swift
@@ -8,6 +8,7 @@
import Foundation
import UDF
+@preconcurrency import Models
struct AllMovies: Reducible {
var byId: [Movie.ID: Movie] = [:]
diff --git a/Flick/Code/Domain/UDF/Storage/Reviews/ReviewsStorage.swift b/Flick/Sources/Code/Domain/UDF/Storage/Reviews/ReviewsStorage.swift
similarity index 97%
rename from Flick/Code/Domain/UDF/Storage/Reviews/ReviewsStorage.swift
rename to Flick/Sources/Code/Domain/UDF/Storage/Reviews/ReviewsStorage.swift
index 6e10e8b..5ec2f8d 100644
--- a/Flick/Code/Domain/UDF/Storage/Reviews/ReviewsStorage.swift
+++ b/Flick/Sources/Code/Domain/UDF/Storage/Reviews/ReviewsStorage.swift
@@ -8,6 +8,7 @@
import Foundation
import UDF
+@preconcurrency import Models
struct AllReviews: Reducible {
var byId: [Review.ID: Review] = [:]
diff --git a/Flick/Code/Domain/UDF/Storage/Search Items/SearchItemsStorage.swift b/Flick/Sources/Code/Domain/UDF/Storage/Search Items/SearchItemsStorage.swift
similarity index 96%
rename from Flick/Code/Domain/UDF/Storage/Search Items/SearchItemsStorage.swift
rename to Flick/Sources/Code/Domain/UDF/Storage/Search Items/SearchItemsStorage.swift
index ac0992b..41ef284 100644
--- a/Flick/Code/Domain/UDF/Storage/Search Items/SearchItemsStorage.swift
+++ b/Flick/Sources/Code/Domain/UDF/Storage/Search Items/SearchItemsStorage.swift
@@ -8,6 +8,7 @@
import Foundation
import UDF
+@preconcurrency import Models
struct AllSearchItems: Reducible {
var byId: [SearchItem.ID: SearchItem] = [:]
diff --git a/Flick/Code/Domain/UDF/Storage/Shows/ShowsStorage.swift b/Flick/Sources/Code/Domain/UDF/Storage/Shows/ShowsStorage.swift
similarity index 97%
rename from Flick/Code/Domain/UDF/Storage/Shows/ShowsStorage.swift
rename to Flick/Sources/Code/Domain/UDF/Storage/Shows/ShowsStorage.swift
index 3aad701..8356bc8 100644
--- a/Flick/Code/Domain/UDF/Storage/Shows/ShowsStorage.swift
+++ b/Flick/Sources/Code/Domain/UDF/Storage/Shows/ShowsStorage.swift
@@ -8,6 +8,7 @@
import Foundation
import UDF
+@preconcurrency import Models
struct AllShows: Reducible {
var byId: [Show.ID: Show] = [:]
diff --git a/Flick/Code/Modules/Cast/ItemDetailsCast/ItemDetailsCastRouter.swift b/Flick/Sources/Code/Modules/Cast/ItemDetailsCast/ItemDetailsCastRouter.swift
similarity index 72%
rename from Flick/Code/Modules/Cast/ItemDetailsCast/ItemDetailsCastRouter.swift
rename to Flick/Sources/Code/Modules/Cast/ItemDetailsCast/ItemDetailsCastRouter.swift
index e721d28..ec824f7 100644
--- a/Flick/Code/Modules/Cast/ItemDetailsCast/ItemDetailsCastRouter.swift
+++ b/Flick/Sources/Code/Modules/Cast/ItemDetailsCast/ItemDetailsCastRouter.swift
@@ -8,13 +8,11 @@
import SwiftUI
import UDF
+import Models
+import ItemDetailsCastComponent
struct ItemDetailsCastRouting: Routing {
- enum Route: Hashable {
- case cast([Cast.ID])
- }
-
- @ViewBuilder func view(for route: Route) -> some View {
+ @ViewBuilder func view(for route: ItemDetailsCastRoute) -> some View {
switch route {
case let .cast(cast): CastContainer(cast: cast)
}
diff --git a/Flick/Code/Modules/Cast/MovieCast/MovieCastMiddleware.swift b/Flick/Sources/Code/Modules/Cast/MovieCast/MovieCastMiddleware.swift
similarity index 99%
rename from Flick/Code/Modules/Cast/MovieCast/MovieCastMiddleware.swift
rename to Flick/Sources/Code/Modules/Cast/MovieCast/MovieCastMiddleware.swift
index e70071e..56e3821 100644
--- a/Flick/Code/Modules/Cast/MovieCast/MovieCastMiddleware.swift
+++ b/Flick/Sources/Code/Modules/Cast/MovieCast/MovieCastMiddleware.swift
@@ -8,6 +8,7 @@
import API
import UDF
+import Models
final class MovieCastMiddleware: BaseObservableMiddleware {
enum Cancellation: Hashable {
diff --git a/Flick/Code/Modules/Cast/MovieCast/State/MovieCastFlow.swift b/Flick/Sources/Code/Modules/Cast/MovieCast/State/MovieCastFlow.swift
similarity index 96%
rename from Flick/Code/Modules/Cast/MovieCast/State/MovieCastFlow.swift
rename to Flick/Sources/Code/Modules/Cast/MovieCast/State/MovieCastFlow.swift
index 08534fd..167352a 100644
--- a/Flick/Code/Modules/Cast/MovieCast/State/MovieCastFlow.swift
+++ b/Flick/Sources/Code/Modules/Cast/MovieCast/State/MovieCastFlow.swift
@@ -7,6 +7,7 @@
//
import UDF
+@preconcurrency import Models
enum MovieCastFlow: IdentifiableFlow {
case none
diff --git a/Flick/Code/Modules/Cast/MovieCast/View/MovieCastContainer.swift b/Flick/Sources/Code/Modules/Cast/MovieCast/View/MovieCastContainer.swift
similarity index 72%
rename from Flick/Code/Modules/Cast/MovieCast/View/MovieCastContainer.swift
rename to Flick/Sources/Code/Modules/Cast/MovieCast/View/MovieCastContainer.swift
index 5f08a5b..9ab99de 100644
--- a/Flick/Code/Modules/Cast/MovieCast/View/MovieCastContainer.swift
+++ b/Flick/Sources/Code/Modules/Cast/MovieCast/View/MovieCastContainer.swift
@@ -7,9 +7,12 @@
//
import UDF
+import Models
+import ItemDetailsCastComponent
+import Common
struct MovieCastContainer: BindableContainer {
- typealias ContainerComponent = ItemDetailsCastComponent
+ typealias ContainerComponent = ItemDetailsCastComponent
let id: Movie.ID
@@ -21,7 +24,13 @@ struct MovieCastContainer: BindableContainer {
.init(
cast: cast,
castById: { castById(id: $0) },
- isRedacted: isRedacted
+ isRedacted: isRedacted,
+ destinationBuilder: DestinationBuilder(destination: { value in
+ switch value {
+ case let .imageContainer(path: path, size: size, type: type):
+ ImageContainer(size: size, path: path, type: type)
+ }
+ })
)
}
diff --git a/Flick/Code/Modules/Cast/ShowCast/ShowCastMiddleware.swift b/Flick/Sources/Code/Modules/Cast/ShowCast/ShowCastMiddleware.swift
similarity index 99%
rename from Flick/Code/Modules/Cast/ShowCast/ShowCastMiddleware.swift
rename to Flick/Sources/Code/Modules/Cast/ShowCast/ShowCastMiddleware.swift
index dbe42e3..806ac70 100644
--- a/Flick/Code/Modules/Cast/ShowCast/ShowCastMiddleware.swift
+++ b/Flick/Sources/Code/Modules/Cast/ShowCast/ShowCastMiddleware.swift
@@ -8,6 +8,7 @@
import API
import UDF
+import Models
final class ShowCastMiddleware: BaseObservableMiddleware {
enum Cancellation: Hashable {
diff --git a/Flick/Code/Modules/Cast/ShowCast/State/ShowCastFlow.swift b/Flick/Sources/Code/Modules/Cast/ShowCast/State/ShowCastFlow.swift
similarity index 96%
rename from Flick/Code/Modules/Cast/ShowCast/State/ShowCastFlow.swift
rename to Flick/Sources/Code/Modules/Cast/ShowCast/State/ShowCastFlow.swift
index 5ee47ff..e259a18 100644
--- a/Flick/Code/Modules/Cast/ShowCast/State/ShowCastFlow.swift
+++ b/Flick/Sources/Code/Modules/Cast/ShowCast/State/ShowCastFlow.swift
@@ -7,6 +7,7 @@
//
import UDF
+@preconcurrency import Models
enum ShowCastFlow: IdentifiableFlow {
case none
diff --git a/Flick/Code/Modules/Cast/ShowCast/View/ShowCastContainer.swift b/Flick/Sources/Code/Modules/Cast/ShowCast/View/ShowCastContainer.swift
similarity index 72%
rename from Flick/Code/Modules/Cast/ShowCast/View/ShowCastContainer.swift
rename to Flick/Sources/Code/Modules/Cast/ShowCast/View/ShowCastContainer.swift
index 40b1a8a..3f42e0e 100644
--- a/Flick/Code/Modules/Cast/ShowCast/View/ShowCastContainer.swift
+++ b/Flick/Sources/Code/Modules/Cast/ShowCast/View/ShowCastContainer.swift
@@ -7,9 +7,12 @@
//
import UDF
+import Models
+import ItemDetailsCastComponent
+import Common
struct ShowCastContainer: BindableContainer {
- typealias ContainerComponent = ItemDetailsCastComponent
+ typealias ContainerComponent = ItemDetailsCastComponent
let id: Show.ID
@@ -21,7 +24,13 @@ struct ShowCastContainer: BindableContainer {
.init(
cast: cast,
castById: { castById(id: $0) },
- isRedacted: isRedacted
+ isRedacted: isRedacted,
+ destinationBuilder: DestinationBuilder(destination: { value in
+ switch value {
+ case let .imageContainer(path: path, size: size, type: type):
+ ImageContainer(size: size, path: path, type: type)
+ }
+ })
)
}
diff --git a/Flick/Code/Modules/Cast/State/CastForm.swift b/Flick/Sources/Code/Modules/Cast/State/CastForm.swift
similarity index 100%
rename from Flick/Code/Modules/Cast/State/CastForm.swift
rename to Flick/Sources/Code/Modules/Cast/State/CastForm.swift
diff --git a/Flick/Code/Modules/Cast/View/CastContainer.swift b/Flick/Sources/Code/Modules/Cast/View/CastContainer.swift
similarity index 50%
rename from Flick/Code/Modules/Cast/View/CastContainer.swift
rename to Flick/Sources/Code/Modules/Cast/View/CastContainer.swift
index eb0d3bf..20cb549 100644
--- a/Flick/Code/Modules/Cast/View/CastContainer.swift
+++ b/Flick/Sources/Code/Modules/Cast/View/CastContainer.swift
@@ -7,9 +7,12 @@
//
import UDF
+import Models
+import Common
+import CastComponent
struct CastContainer: Container {
- typealias ContainerComponent = CastComponent
+ typealias ContainerComponent = CastComponent
let cast: [Cast.ID]
@@ -21,7 +24,13 @@ struct CastContainer: Container {
.init(
cast: cast,
castById: store.state.allCast.castBy,
- dialogStatus: store.$state.castForm.dialog
+ dialogStatus: store.$state.castForm.dialog,
+ destinationBuilder: DestinationBuilder(destination: { value in
+ switch value {
+ case let .imageContainer(path: path, size: size, type: type):
+ ImageContainer(size: size, path: path, type: type)
+ }
+ })
)
}
}
diff --git a/Flick/Sources/Code/Modules/Cast/View/CastRouter.swift b/Flick/Sources/Code/Modules/Cast/View/CastRouter.swift
new file mode 100644
index 0000000..e3215dd
--- /dev/null
+++ b/Flick/Sources/Code/Modules/Cast/View/CastRouter.swift
@@ -0,0 +1,20 @@
+//
+// ItemDetailsCastRouter.swift
+// Flick
+//
+// Created by Alexander Sharko on 20.01.2023.
+// Copyright © 2023 urlaunched.com. All rights reserved.
+//
+
+import SwiftUI
+import UDF
+import Models
+import CastComponent
+
+struct CastRouting: Routing {
+ @ViewBuilder func view(for route: CastRoute) -> some View {
+ switch route {
+ case let .cast(cast): CastContainer(cast: cast)
+ }
+ }
+}
diff --git a/Flick/Code/Modules/Home/GenresMiddleware.swift b/Flick/Sources/Code/Modules/Home/GenresMiddleware.swift
similarity index 99%
rename from Flick/Code/Modules/Home/GenresMiddleware.swift
rename to Flick/Sources/Code/Modules/Home/GenresMiddleware.swift
index 69980f0..b28faec 100644
--- a/Flick/Code/Modules/Home/GenresMiddleware.swift
+++ b/Flick/Sources/Code/Modules/Home/GenresMiddleware.swift
@@ -9,6 +9,7 @@
import API
import Foundation
import UDF
+import Models
final class GenresMiddleware: BaseObservableMiddleware {
var environment: Environment!
diff --git a/Flick/Code/Modules/Home/HomeMiddleware.swift b/Flick/Sources/Code/Modules/Home/HomeMiddleware.swift
similarity index 99%
rename from Flick/Code/Modules/Home/HomeMiddleware.swift
rename to Flick/Sources/Code/Modules/Home/HomeMiddleware.swift
index be87f0f..8e9c54b 100644
--- a/Flick/Code/Modules/Home/HomeMiddleware.swift
+++ b/Flick/Sources/Code/Modules/Home/HomeMiddleware.swift
@@ -9,6 +9,7 @@
import API
import Foundation
import UDF
+import Models
final class HomeMiddleware: BaseReducibleMiddleware {
var environment: Environment!
diff --git a/Flick/Code/Modules/Home/State/HomeFlow.swift b/Flick/Sources/Code/Modules/Home/State/HomeFlow.swift
similarity index 98%
rename from Flick/Code/Modules/Home/State/HomeFlow.swift
rename to Flick/Sources/Code/Modules/Home/State/HomeFlow.swift
index 8f222ea..04f5327 100644
--- a/Flick/Code/Modules/Home/State/HomeFlow.swift
+++ b/Flick/Sources/Code/Modules/Home/State/HomeFlow.swift
@@ -8,6 +8,7 @@
import SwiftUI
import UDF
+import Models
enum HomeFlow: IdentifiableFlow {
case none, loading
diff --git a/Flick/Code/Modules/Home/State/HomeForm.swift b/Flick/Sources/Code/Modules/Home/State/HomeForm.swift
similarity index 94%
rename from Flick/Code/Modules/Home/State/HomeForm.swift
rename to Flick/Sources/Code/Modules/Home/State/HomeForm.swift
index b0322eb..6e1d5f2 100644
--- a/Flick/Code/Modules/Home/State/HomeForm.swift
+++ b/Flick/Sources/Code/Modules/Home/State/HomeForm.swift
@@ -7,6 +7,7 @@
//
import UDF
+@preconcurrency import Models
struct HomeForm: Form {
var contentType: ContentType = .movie
diff --git a/Flick/Code/Modules/Home/State/MovieGenresFlow.swift b/Flick/Sources/Code/Modules/Home/State/MovieGenresFlow.swift
similarity index 97%
rename from Flick/Code/Modules/Home/State/MovieGenresFlow.swift
rename to Flick/Sources/Code/Modules/Home/State/MovieGenresFlow.swift
index 8b23015..cd0feb8 100644
--- a/Flick/Code/Modules/Home/State/MovieGenresFlow.swift
+++ b/Flick/Sources/Code/Modules/Home/State/MovieGenresFlow.swift
@@ -7,6 +7,7 @@
//
import UDF
+import Models
enum MovieGenresFlow: IdentifiableFlow {
case none, loading
diff --git a/Flick/Code/Modules/Home/State/ShowGenresFlow.swift b/Flick/Sources/Code/Modules/Home/State/ShowGenresFlow.swift
similarity index 97%
rename from Flick/Code/Modules/Home/State/ShowGenresFlow.swift
rename to Flick/Sources/Code/Modules/Home/State/ShowGenresFlow.swift
index b2e6ad8..f0de9c5 100644
--- a/Flick/Code/Modules/Home/State/ShowGenresFlow.swift
+++ b/Flick/Sources/Code/Modules/Home/State/ShowGenresFlow.swift
@@ -7,6 +7,7 @@
//
import UDF
+import Models
enum ShowGenresFlow: IdentifiableFlow {
case none, loading
diff --git a/Flick/Code/Modules/Home/View/Home/HomeContainer.swift b/Flick/Sources/Code/Modules/Home/View/Home/HomeContainer.swift
similarity index 68%
rename from Flick/Code/Modules/Home/View/Home/HomeContainer.swift
rename to Flick/Sources/Code/Modules/Home/View/Home/HomeContainer.swift
index 4bf2eff..455b323 100644
--- a/Flick/Code/Modules/Home/View/Home/HomeContainer.swift
+++ b/Flick/Sources/Code/Modules/Home/View/Home/HomeContainer.swift
@@ -8,6 +8,9 @@
import SwiftUI
import UDF
+import Models
+import Common
+import HomeComponent
struct HomeContainer: Container {
typealias ContainerComponent = HomeComponent
@@ -34,7 +37,21 @@ struct HomeContainer: Container {
showsForSection: { isShowsRedacted(section: $0) ? Show.fakeItems(count: 3) : showsForSection($0, store: store) },
isMoviesRedacted: { isMoviesRedacted(section: $0) },
isShowsRedacted: { isShowsRedacted(section: $0) },
- dialogStatus: store.$state.homeForm.dialog
+ dialogStatus: store.$state.homeForm.dialog,
+ destinationBuilder: DestinationBuilder(destination: { value in
+ switch value {
+ case let .mainHomeSection(section: section as Models.MovieSection, retrieveItems: retrieveItems):
+ MainHomeSectionContainer(section: section, retrieveItems: retrieveItems)
+ case let .mainHomeSection(section: section as Models.ShowSection, retrieveItems: retrieveItems):
+ MainHomeSectionContainer(section: section, retrieveItems: retrieveItems)
+ case let .homeSection(section: section as Models.MovieSection, retrieveItems: retrieveItems):
+ HomeSectionContainer(section: section, retrieveItems: retrieveItems)
+ case let .homeSection(section: section as Models.ShowSection, retrieveItems: retrieveItems):
+ HomeSectionContainer(section: section, retrieveItems: retrieveItems)
+ default:
+ EmptyView()
+ }
+ })
)
}
}
diff --git a/Flick/Code/Modules/Home/View/Home/HomeRouter.swift b/Flick/Sources/Code/Modules/Home/View/Home/HomeRouter.swift
similarity index 95%
rename from Flick/Code/Modules/Home/View/Home/HomeRouter.swift
rename to Flick/Sources/Code/Modules/Home/View/Home/HomeRouter.swift
index 947ae63..c4de44d 100644
--- a/Flick/Code/Modules/Home/View/Home/HomeRouter.swift
+++ b/Flick/Sources/Code/Modules/Home/View/Home/HomeRouter.swift
@@ -8,11 +8,13 @@
import SwiftUI
import UDF
+import Common
+import Models
struct HomeRouting: Routing {
enum Route: Hashable {
case itemDetails(any Item)
- case sectionDetails(any Section)
+ case sectionDetails(any Models.Section)
func hash(into hasher: inout Hasher) {
switch self {
diff --git a/Flick/Code/Modules/Home/View/HomeSection/HomeSectionContainer.swift b/Flick/Sources/Code/Modules/Home/View/HomeSection/HomeSectionContainer.swift
similarity index 53%
rename from Flick/Code/Modules/Home/View/HomeSection/HomeSectionContainer.swift
rename to Flick/Sources/Code/Modules/Home/View/HomeSection/HomeSectionContainer.swift
index 982c6f2..2d6bb74 100644
--- a/Flick/Code/Modules/Home/View/HomeSection/HomeSectionContainer.swift
+++ b/Flick/Sources/Code/Modules/Home/View/HomeSection/HomeSectionContainer.swift
@@ -8,33 +8,40 @@
import SwiftUI
import UDF
+import Models
+import Common
+import HomeSectionComponent
-struct HomeSectionContainer: Container {
- typealias ContainerComponent = HomeSectionComponent
+struct HomeSectionContainer: Container {
+ typealias ContainerComponent = HomeSectionComponent
let section: S
var retrieveItems: () -> [any Item]
- var scopeOfWork: (_ state: AppState) -> Scope
init(
section: S,
- retrieveItems: @escaping () -> [any Item],
- @ScopeBuilder scopeOfWork: @escaping (_ state: AppState) -> Scope
+ retrieveItems: @escaping () -> [any Item]
) {
self.section = section
self.retrieveItems = retrieveItems
- self.scopeOfWork = scopeOfWork
}
func scope(for state: AppState) -> Scope {
- return scopeOfWork(state)
+ state.allShows
+ state.allMovies
}
func map(store: EnvironmentStore) -> ContainerComponent.Props {
.init(
section: section,
items: retrieveItems(),
- genreById: { store.state.allGenres.byId[$0] }
+ genreById: { store.state.allGenres.byId[$0] },
+ destinationBuilder: DestinationBuilder(destination: { value in
+ switch value {
+ case let .imageContainer(path: path, size: size, type: type):
+ ImageContainer(size: size, path: path, type: type)
+ }
+ })
)
}
diff --git a/Flick/Sources/Code/Modules/Home/View/HomeSection/HomeSectionRouter.swift b/Flick/Sources/Code/Modules/Home/View/HomeSection/HomeSectionRouter.swift
new file mode 100644
index 0000000..7915a33
--- /dev/null
+++ b/Flick/Sources/Code/Modules/Home/View/HomeSection/HomeSectionRouter.swift
@@ -0,0 +1,33 @@
+//
+// HomeSectionRouter.swift
+// Flick
+//
+// Created by Valentin Petrulia on 27.02.2025.
+// Copyright © 2025 urlaunched.com. All rights reserved.
+//
+
+import SwiftUI
+import UDF
+import Models
+import Common
+import HomeSectionComponent
+
+struct HomeSectionRouter: Routing {
+ @ViewBuilder func view(for route: HomeSectionRoute) -> some View {
+ switch route {
+ case let .itemDetails(item):
+ buildView(
+ item: item,
+ movieView: { MovieDetailsContainer(id: $0.id) },
+ showView: { ShowDetailsContainer(id: $0.id) }
+ )
+
+ case let .sectionDetails(section):
+ if let movieSection = section as? MovieSection {
+ SectionDetailsContainer(section: movieSection)
+ } else if let showSection = section as? ShowSection {
+ SectionDetailsContainer(section: showSection)
+ }
+ }
+ }
+}
diff --git a/Flick/Code/Modules/Home/View/MainHomeSection/MainHomeSectionContainer.swift b/Flick/Sources/Code/Modules/Home/View/MainHomeSection/MainHomeSectionContainer.swift
similarity index 53%
rename from Flick/Code/Modules/Home/View/MainHomeSection/MainHomeSectionContainer.swift
rename to Flick/Sources/Code/Modules/Home/View/MainHomeSection/MainHomeSectionContainer.swift
index 8534d02..28d43b3 100644
--- a/Flick/Code/Modules/Home/View/MainHomeSection/MainHomeSectionContainer.swift
+++ b/Flick/Sources/Code/Modules/Home/View/MainHomeSection/MainHomeSectionContainer.swift
@@ -7,33 +7,40 @@
//
import UDF
+import Models
+import Common
+import MainHomeSectionComponent
struct MainHomeSectionContainer: Container {
- typealias ContainerComponent = MainHomeSectionComponent
+ typealias ContainerComponent = MainHomeSectionComponent
let section: S
var retrieveItems: () -> [any Item]
- var scopeOfWork: (_ state: AppState) -> Scope
init(
section: S,
- retrieveItems: @escaping () -> [any Item],
- @ScopeBuilder scopeOfWork: @escaping (_ state: AppState) -> Scope
+ retrieveItems: @escaping () -> [any Item]
) {
self.section = section
self.retrieveItems = retrieveItems
- self.scopeOfWork = scopeOfWork
}
func scope(for state: AppState) -> Scope {
- return scopeOfWork(state)
+ state.allShows
+ state.allMovies
}
func map(store: EnvironmentStore) -> ContainerComponent.Props {
.init(
section: section,
items: retrieveItems(),
- genreById: { store.state.allGenres.byId[$0] }
+ genreById: { store.state.allGenres.byId[$0] },
+ destinationBuilder: DestinationBuilder(destination: { value in
+ switch value {
+ case let .imageContainer(path: path, size: size, type: type, isLoaderPresented: isLoaderPresented):
+ ImageContainer(size: size, path: path, type: type, isLoaderPresented: isLoaderPresented)
+ }
+ })
)
}
diff --git a/Flick/Sources/Code/Modules/Home/View/MainHomeSection/MainHomeSectionRouter.swift b/Flick/Sources/Code/Modules/Home/View/MainHomeSection/MainHomeSectionRouter.swift
new file mode 100644
index 0000000..598420b
--- /dev/null
+++ b/Flick/Sources/Code/Modules/Home/View/MainHomeSection/MainHomeSectionRouter.swift
@@ -0,0 +1,33 @@
+//
+// MainHomeSectionRouter.swift
+// Flick
+//
+// Created by Valentin Petrulia on 27.02.2025.
+// Copyright © 2025 urlaunched.com. All rights reserved.
+//
+
+import SwiftUI
+import UDF
+import Models
+import Common
+import MainHomeSectionComponent
+
+struct MainHomeSectionRouting: Routing {
+ @ViewBuilder func view(for route: MainHomeSectionRoute) -> some View {
+ switch route {
+ case let .itemDetails(item):
+ buildView(
+ item: item,
+ movieView: { MovieDetailsContainer(id: $0.id) },
+ showView: { ShowDetailsContainer(id: $0.id) }
+ )
+
+ case let .sectionDetails(section):
+ if let movieSection = section as? MovieSection {
+ SectionDetailsContainer(section: movieSection)
+ } else if let showSection = section as? ShowSection {
+ SectionDetailsContainer(section: showSection)
+ }
+ }
+ }
+}
diff --git a/Flick/Code/Modules/Image/ImageConfigsMiddleware.swift b/Flick/Sources/Code/Modules/Image/ImageConfigsMiddleware.swift
similarity index 99%
rename from Flick/Code/Modules/Image/ImageConfigsMiddleware.swift
rename to Flick/Sources/Code/Modules/Image/ImageConfigsMiddleware.swift
index ba5b00c..21354ec 100644
--- a/Flick/Code/Modules/Image/ImageConfigsMiddleware.swift
+++ b/Flick/Sources/Code/Modules/Image/ImageConfigsMiddleware.swift
@@ -9,6 +9,7 @@
import API
import Foundation
import UDF
+import Models
final class ImageConfigsMiddleware: BaseObservableMiddleware {
var environment: Environment!
diff --git a/Flick/Code/Modules/Image/State/ImageConfigsFlow.swift b/Flick/Sources/Code/Modules/Image/State/ImageConfigsFlow.swift
similarity index 97%
rename from Flick/Code/Modules/Image/State/ImageConfigsFlow.swift
rename to Flick/Sources/Code/Modules/Image/State/ImageConfigsFlow.swift
index 60bc81b..76becf4 100644
--- a/Flick/Code/Modules/Image/State/ImageConfigsFlow.swift
+++ b/Flick/Sources/Code/Modules/Image/State/ImageConfigsFlow.swift
@@ -7,6 +7,7 @@
//
import UDF
+import Models
enum ImageConfigsFlow: IdentifiableFlow {
case none, loading
diff --git a/Flick/Code/Modules/Image/State/ImageConfigsForm.swift b/Flick/Sources/Code/Modules/Image/State/ImageConfigsForm.swift
similarity index 94%
rename from Flick/Code/Modules/Image/State/ImageConfigsForm.swift
rename to Flick/Sources/Code/Modules/Image/State/ImageConfigsForm.swift
index 493765d..b021eae 100644
--- a/Flick/Code/Modules/Image/State/ImageConfigsForm.swift
+++ b/Flick/Sources/Code/Modules/Image/State/ImageConfigsForm.swift
@@ -8,6 +8,7 @@
import Foundation
import UDF
+@preconcurrency import Models
struct ImageConfigsForm: Form {
var configs: ImageConfigs = .basic
diff --git a/Flick/Code/Modules/Image/View/ImageContainer.swift b/Flick/Sources/Code/Modules/Image/View/ImageContainer.swift
similarity index 72%
rename from Flick/Code/Modules/Image/View/ImageContainer.swift
rename to Flick/Sources/Code/Modules/Image/View/ImageContainer.swift
index 289acea..c178627 100644
--- a/Flick/Code/Modules/Image/View/ImageContainer.swift
+++ b/Flick/Sources/Code/Modules/Image/View/ImageContainer.swift
@@ -8,6 +8,8 @@
import SwiftUI
import UDF
+import Common
+import ImageComponent
struct ImageContainer: Container {
typealias ContainerComponent = ImageComponent
@@ -46,20 +48,17 @@ private extension ImageContainer {
}
}
-extension ImageContainer {
- enum ImageType {
- case backdrop, logo, poster, profile, still
-
- func sizes(_ state: AppState) -> [Int] {
- let configs = state.imageConfigsForm.configs
-
- switch self {
- case .backdrop: return configs.backdropSizes
- case .logo: return configs.logoSizes
- case .poster: return configs.posterSizes
- case .profile: return configs.profileSizes
- case .still: return configs.stillSizes
- }
+extension ImageType {
+
+ func sizes(_ state: AppState) -> [Int] {
+ let configs = state.imageConfigsForm.configs
+
+ switch self {
+ case .backdrop: return configs.backdropSizes
+ case .logo: return configs.logoSizes
+ case .poster: return configs.posterSizes
+ case .profile: return configs.profileSizes
+ case .still: return configs.stillSizes
}
}
}
diff --git a/Flick/Code/Modules/ItemDetails/MovieDetails/MovieDetailsMiddleware.swift b/Flick/Sources/Code/Modules/ItemDetails/MovieDetails/MovieDetailsMiddleware.swift
similarity index 99%
rename from Flick/Code/Modules/ItemDetails/MovieDetails/MovieDetailsMiddleware.swift
rename to Flick/Sources/Code/Modules/ItemDetails/MovieDetails/MovieDetailsMiddleware.swift
index a68b75c..f16a104 100644
--- a/Flick/Code/Modules/ItemDetails/MovieDetails/MovieDetailsMiddleware.swift
+++ b/Flick/Sources/Code/Modules/ItemDetails/MovieDetails/MovieDetailsMiddleware.swift
@@ -8,6 +8,7 @@
import API
import UDF
+import Models
final class MovieDetailsMiddleware: BaseObservableMiddleware {
enum Cancellation: Hashable {
diff --git a/Flick/Code/Modules/ItemDetails/MovieDetails/State/MovieDetailsFlow.swift b/Flick/Sources/Code/Modules/ItemDetails/MovieDetails/State/MovieDetailsFlow.swift
similarity index 96%
rename from Flick/Code/Modules/ItemDetails/MovieDetails/State/MovieDetailsFlow.swift
rename to Flick/Sources/Code/Modules/ItemDetails/MovieDetails/State/MovieDetailsFlow.swift
index 2ddeaf5..8854b9f 100644
--- a/Flick/Code/Modules/ItemDetails/MovieDetails/State/MovieDetailsFlow.swift
+++ b/Flick/Sources/Code/Modules/ItemDetails/MovieDetails/State/MovieDetailsFlow.swift
@@ -7,6 +7,7 @@
//
import UDF
+@preconcurrency import Models
enum MovieDetailsFlow: IdentifiableFlow {
case none
diff --git a/Flick/Code/Modules/ItemDetails/MovieDetails/State/MovieDetailsForm.swift b/Flick/Sources/Code/Modules/ItemDetails/MovieDetails/State/MovieDetailsForm.swift
similarity index 94%
rename from Flick/Code/Modules/ItemDetails/MovieDetails/State/MovieDetailsForm.swift
rename to Flick/Sources/Code/Modules/ItemDetails/MovieDetails/State/MovieDetailsForm.swift
index 64052d4..929abfa 100644
--- a/Flick/Code/Modules/ItemDetails/MovieDetails/State/MovieDetailsForm.swift
+++ b/Flick/Sources/Code/Modules/ItemDetails/MovieDetails/State/MovieDetailsForm.swift
@@ -7,6 +7,7 @@
//
import UDF
+@preconcurrency import Models
struct MovieDetailsForm: Form {
var dialog: DialogStatus = .dismissed
diff --git a/Flick/Code/Modules/ItemDetails/MovieDetails/View/MovieDetailsContainer.swift b/Flick/Sources/Code/Modules/ItemDetails/MovieDetails/View/MovieDetailsContainer.swift
similarity index 63%
rename from Flick/Code/Modules/ItemDetails/MovieDetails/View/MovieDetailsContainer.swift
rename to Flick/Sources/Code/Modules/ItemDetails/MovieDetails/View/MovieDetailsContainer.swift
index 30cd480..14154dd 100644
--- a/Flick/Code/Modules/ItemDetails/MovieDetails/View/MovieDetailsContainer.swift
+++ b/Flick/Sources/Code/Modules/ItemDetails/MovieDetails/View/MovieDetailsContainer.swift
@@ -7,9 +7,12 @@
//
import UDF
+import Models
+import Common
+import ItemDetailsComponent
struct MovieDetailsContainer: BindableContainer {
- typealias ContainerComponent = ItemDetailsComponent
+ typealias ContainerComponent = ItemDetailsComponent
let id: Movie.ID
@@ -21,7 +24,13 @@ struct MovieDetailsContainer: BindableContainer {
.init(
item: store.state.allMovies.movieBy(id: id),
genreById: store.state.allGenres.genreBy,
- dialog: store.$state.movieDetailsForm[id].dialog
+ dialog: store.$state.movieDetailsForm[id].dialog,
+ destinationBuilder: DestinationBuilder(destination: { value in
+ switch value {
+ case let .imageContainer(path: path, size: size, type: type):
+ ImageContainer(size: size, path: path, type: type)
+ }
+ })
)
}
diff --git a/Flick/Code/Modules/ItemDetails/ShowDetails/ShowDetailsMiddleware.swift b/Flick/Sources/Code/Modules/ItemDetails/ShowDetails/ShowDetailsMiddleware.swift
similarity index 99%
rename from Flick/Code/Modules/ItemDetails/ShowDetails/ShowDetailsMiddleware.swift
rename to Flick/Sources/Code/Modules/ItemDetails/ShowDetails/ShowDetailsMiddleware.swift
index 720bd07..4b6fd41 100644
--- a/Flick/Code/Modules/ItemDetails/ShowDetails/ShowDetailsMiddleware.swift
+++ b/Flick/Sources/Code/Modules/ItemDetails/ShowDetails/ShowDetailsMiddleware.swift
@@ -8,6 +8,7 @@
import API
import UDF
+import Models
final class ShowDetailsMiddleware: BaseObservableMiddleware {
enum Cancellation: Hashable {
diff --git a/Flick/Code/Modules/ItemDetails/ShowDetails/State/ShowDetailsFlow.swift b/Flick/Sources/Code/Modules/ItemDetails/ShowDetails/State/ShowDetailsFlow.swift
similarity index 96%
rename from Flick/Code/Modules/ItemDetails/ShowDetails/State/ShowDetailsFlow.swift
rename to Flick/Sources/Code/Modules/ItemDetails/ShowDetails/State/ShowDetailsFlow.swift
index e2a2319..d55c695 100644
--- a/Flick/Code/Modules/ItemDetails/ShowDetails/State/ShowDetailsFlow.swift
+++ b/Flick/Sources/Code/Modules/ItemDetails/ShowDetails/State/ShowDetailsFlow.swift
@@ -7,6 +7,7 @@
//
import UDF
+@preconcurrency import Models
enum ShowDetailsFlow: IdentifiableFlow {
case none
diff --git a/Flick/Code/Modules/ItemDetails/ShowDetails/State/ShowDetailsForm.swift b/Flick/Sources/Code/Modules/ItemDetails/ShowDetails/State/ShowDetailsForm.swift
similarity index 94%
rename from Flick/Code/Modules/ItemDetails/ShowDetails/State/ShowDetailsForm.swift
rename to Flick/Sources/Code/Modules/ItemDetails/ShowDetails/State/ShowDetailsForm.swift
index a073c7e..56faed0 100644
--- a/Flick/Code/Modules/ItemDetails/ShowDetails/State/ShowDetailsForm.swift
+++ b/Flick/Sources/Code/Modules/ItemDetails/ShowDetails/State/ShowDetailsForm.swift
@@ -7,6 +7,7 @@
//
import UDF
+@preconcurrency import Models
struct ShowDetailsForm: Form {
var dialog: DialogStatus = .dismissed
diff --git a/Flick/Code/Modules/ItemDetails/ShowDetails/View/ShowDetailsContainer.swift b/Flick/Sources/Code/Modules/ItemDetails/ShowDetails/View/ShowDetailsContainer.swift
similarity index 61%
rename from Flick/Code/Modules/ItemDetails/ShowDetails/View/ShowDetailsContainer.swift
rename to Flick/Sources/Code/Modules/ItemDetails/ShowDetails/View/ShowDetailsContainer.swift
index ef0a97b..8638d50 100644
--- a/Flick/Code/Modules/ItemDetails/ShowDetails/View/ShowDetailsContainer.swift
+++ b/Flick/Sources/Code/Modules/ItemDetails/ShowDetails/View/ShowDetailsContainer.swift
@@ -7,9 +7,12 @@
//
import UDF
+import Models
+import ItemDetailsComponent
+import Common
struct ShowDetailsContainer: BindableContainer {
- typealias ContainerComponent = ItemDetailsComponent
+ typealias ContainerComponent = ItemDetailsComponent
let id: Show.ID
@@ -21,7 +24,14 @@ struct ShowDetailsContainer: BindableContainer {
.init(
item: store.state.allShows.showBy(id: id),
genreById: store.state.allGenres.genreBy,
- dialog: store.$state.showDetailsForm[id].dialog
+ dialog: store.$state.showDetailsForm[id].dialog,
+ router: .init(),
+ destinationBuilder: DestinationBuilder(destination: { value in
+ switch value {
+ case let .imageContainer(path: path, size: size, type: type):
+ ImageContainer(size: size, path: path, type: type)
+ }
+ })
)
}
diff --git a/Flick/Sources/Code/Modules/ItemDetails/View/ItemDetailsRouter.swift b/Flick/Sources/Code/Modules/ItemDetails/View/ItemDetailsRouter.swift
new file mode 100644
index 0000000..4aef9e3
--- /dev/null
+++ b/Flick/Sources/Code/Modules/ItemDetails/View/ItemDetailsRouter.swift
@@ -0,0 +1,44 @@
+//
+// ItemDetailsRouter.swift
+// Flick
+//
+// Created by Alexander Sharko on 20.01.2023.
+// Copyright © 2023 urlaunched.com. All rights reserved.
+//
+
+import SwiftUI
+import UDF
+import Models
+import Common
+import ItemDetailsComponent
+
+struct ItemDetailsRouting: Routing {
+ @ViewBuilder
+ func view(for route: ItemDetailsRoute) -> some View {
+ switch route {
+ case let .cast(item):
+ buildView(
+ item: item,
+ movieView: { MovieCastContainer(id: $0.id) },
+ showView: { ShowCastContainer(id: $0.id) }
+ )
+
+ case let .reviews(item):
+ buildView(
+ item: item,
+ movieView: { MovieDetailsReviewsContainer(id: $0.id) },
+ showView: { ShowDetailsReviewsContainer(id: $0.id) }
+ )
+
+ case let .recommendations(item):
+ buildView(
+ item: item,
+ movieView: { MovieDetailsRecommendationsContainer(id: $0.id) },
+ showView: { ShowDetailsRecommendationsContainer(id: $0.id) }
+ )
+
+ case let .whereToWatch(item):
+ WhereToWatchContainer(item: item)
+ }
+ }
+}
diff --git a/Flick/Code/Modules/MyFavorites/MyFavoritesMiddleware.swift b/Flick/Sources/Code/Modules/MyFavorites/MyFavoritesMiddleware.swift
similarity index 99%
rename from Flick/Code/Modules/MyFavorites/MyFavoritesMiddleware.swift
rename to Flick/Sources/Code/Modules/MyFavorites/MyFavoritesMiddleware.swift
index 2236977..5c85fdb 100644
--- a/Flick/Code/Modules/MyFavorites/MyFavoritesMiddleware.swift
+++ b/Flick/Sources/Code/Modules/MyFavorites/MyFavoritesMiddleware.swift
@@ -9,6 +9,7 @@
import API
import Foundation
import UDF
+import Models
final class MyFavoritesMiddleware: BaseObservableMiddleware {
enum Cancellation: Hashable, CaseIterable {
diff --git a/Flick/Code/Modules/MyFavorites/State/MyFavoritesFlow.swift b/Flick/Sources/Code/Modules/MyFavorites/State/MyFavoritesFlow.swift
similarity index 99%
rename from Flick/Code/Modules/MyFavorites/State/MyFavoritesFlow.swift
rename to Flick/Sources/Code/Modules/MyFavorites/State/MyFavoritesFlow.swift
index d2eb809..a7faf64 100644
--- a/Flick/Code/Modules/MyFavorites/State/MyFavoritesFlow.swift
+++ b/Flick/Sources/Code/Modules/MyFavorites/State/MyFavoritesFlow.swift
@@ -8,6 +8,7 @@
import SwiftUI
import UDF
+import Models
enum MyFavoritesFlow: IdentifiableFlow {
case none, loadMovies(Int), loadShows(Int)
diff --git a/Flick/Code/Modules/MyFavorites/State/MyFavoritesForm.swift b/Flick/Sources/Code/Modules/MyFavorites/State/MyFavoritesForm.swift
similarity index 96%
rename from Flick/Code/Modules/MyFavorites/State/MyFavoritesForm.swift
rename to Flick/Sources/Code/Modules/MyFavorites/State/MyFavoritesForm.swift
index e5c8b67..ef32420 100644
--- a/Flick/Code/Modules/MyFavorites/State/MyFavoritesForm.swift
+++ b/Flick/Sources/Code/Modules/MyFavorites/State/MyFavoritesForm.swift
@@ -7,6 +7,8 @@
//
import UDF
+@preconcurrency import Models
+import Common
struct MyFavoritesForm: Form {
var contentType: ContentType = .movie
diff --git a/Flick/Code/Modules/MyFavorites/View/MyFavorites/MyFavoritesContainer.swift b/Flick/Sources/Code/Modules/MyFavorites/View/MyFavorites/MyFavoritesContainer.swift
similarity index 87%
rename from Flick/Code/Modules/MyFavorites/View/MyFavorites/MyFavoritesContainer.swift
rename to Flick/Sources/Code/Modules/MyFavorites/View/MyFavorites/MyFavoritesContainer.swift
index a96592a..07dca73 100644
--- a/Flick/Code/Modules/MyFavorites/View/MyFavorites/MyFavoritesContainer.swift
+++ b/Flick/Sources/Code/Modules/MyFavorites/View/MyFavorites/MyFavoritesContainer.swift
@@ -8,6 +8,9 @@
import SwiftUI
import UDF
+import Models
+import MyFavoritesComponent
+import Common
struct MyFavoritesContainer: Container {
typealias ContainerComponent = MyFavoritesComponent
@@ -26,7 +29,13 @@ struct MyFavoritesContainer: Container {
genreById: { store.state.allGenres.byId[$0] },
loadMoreAction: loadNewPageIfNeeded,
isRedacted: isRedacted,
- dialogStatus: store.$state.myFavoritesForm.dialog
+ dialogStatus: store.$state.myFavoritesForm.dialog,
+ destinationBuilder: DestinationBuilder(destination: { value in
+ switch value {
+ case let .imageContainer(path: path, size: size, type: type):
+ ImageContainer(size: size, path: path, type: type)
+ }
+ })
)
}
diff --git a/Flick/Code/Modules/NetworkConnectivity/NetworkConnectivityMiddleware.swift b/Flick/Sources/Code/Modules/NetworkConnectivity/NetworkConnectivityMiddleware.swift
similarity index 100%
rename from Flick/Code/Modules/NetworkConnectivity/NetworkConnectivityMiddleware.swift
rename to Flick/Sources/Code/Modules/NetworkConnectivity/NetworkConnectivityMiddleware.swift
diff --git a/Flick/Code/Modules/NetworkConnectivity/State/NetworkConnectivityForm.swift b/Flick/Sources/Code/Modules/NetworkConnectivity/State/NetworkConnectivityForm.swift
similarity index 100%
rename from Flick/Code/Modules/NetworkConnectivity/State/NetworkConnectivityForm.swift
rename to Flick/Sources/Code/Modules/NetworkConnectivity/State/NetworkConnectivityForm.swift
diff --git a/Flick/Code/Modules/Onboarding/View/OnboardingContainer.swift b/Flick/Sources/Code/Modules/Onboarding/View/OnboardingContainer.swift
similarity index 96%
rename from Flick/Code/Modules/Onboarding/View/OnboardingContainer.swift
rename to Flick/Sources/Code/Modules/Onboarding/View/OnboardingContainer.swift
index 93e703f..a749b1b 100644
--- a/Flick/Code/Modules/Onboarding/View/OnboardingContainer.swift
+++ b/Flick/Sources/Code/Modules/Onboarding/View/OnboardingContainer.swift
@@ -8,6 +8,7 @@
import SwiftUI
import UDF
+import OnboardingComponent
struct OnboardingContainer: Container {
typealias ContainerComponent = OnboardingComponent
diff --git a/Flick/Code/Modules/Profile/View/SettingsContainer.swift b/Flick/Sources/Code/Modules/Profile/View/SettingsContainer.swift
similarity index 95%
rename from Flick/Code/Modules/Profile/View/SettingsContainer.swift
rename to Flick/Sources/Code/Modules/Profile/View/SettingsContainer.swift
index c668377..043ac26 100644
--- a/Flick/Code/Modules/Profile/View/SettingsContainer.swift
+++ b/Flick/Sources/Code/Modules/Profile/View/SettingsContainer.swift
@@ -8,6 +8,7 @@
import UDF
import UIKit
+import SettingsComponent
struct SettingsContainer: Container {
typealias ContainerComponent = SettingsComponent
diff --git a/Flick/Code/Modules/Recommendations/MovieRecommendations/MovieRecommendationsMiddleware.swift b/Flick/Sources/Code/Modules/Recommendations/MovieRecommendations/MovieRecommendationsMiddleware.swift
similarity index 99%
rename from Flick/Code/Modules/Recommendations/MovieRecommendations/MovieRecommendationsMiddleware.swift
rename to Flick/Sources/Code/Modules/Recommendations/MovieRecommendations/MovieRecommendationsMiddleware.swift
index 329995f..90a4114 100644
--- a/Flick/Code/Modules/Recommendations/MovieRecommendations/MovieRecommendationsMiddleware.swift
+++ b/Flick/Sources/Code/Modules/Recommendations/MovieRecommendations/MovieRecommendationsMiddleware.swift
@@ -8,6 +8,7 @@
import API
import UDF
+@preconcurrency import Models
final class MovieRecommendationsMiddleware: BaseObservableMiddleware {
enum Cancellation: Hashable {
diff --git a/Flick/Code/Modules/Recommendations/MovieRecommendations/State/MovieRecommendationsFlow.swift b/Flick/Sources/Code/Modules/Recommendations/MovieRecommendations/State/MovieRecommendationsFlow.swift
similarity index 98%
rename from Flick/Code/Modules/Recommendations/MovieRecommendations/State/MovieRecommendationsFlow.swift
rename to Flick/Sources/Code/Modules/Recommendations/MovieRecommendations/State/MovieRecommendationsFlow.swift
index 27d16a9..77f1087 100644
--- a/Flick/Code/Modules/Recommendations/MovieRecommendations/State/MovieRecommendationsFlow.swift
+++ b/Flick/Sources/Code/Modules/Recommendations/MovieRecommendations/State/MovieRecommendationsFlow.swift
@@ -7,6 +7,7 @@
//
import UDF
+import Models
enum MovieRecommendationsFlow: IdentifiableFlow {
case none, loadMovies(Int)
diff --git a/Flick/Code/Modules/Recommendations/MovieRecommendations/State/MovieRecommendationsForm.swift b/Flick/Sources/Code/Modules/Recommendations/MovieRecommendations/State/MovieRecommendationsForm.swift
similarity index 94%
rename from Flick/Code/Modules/Recommendations/MovieRecommendations/State/MovieRecommendationsForm.swift
rename to Flick/Sources/Code/Modules/Recommendations/MovieRecommendations/State/MovieRecommendationsForm.swift
index 9a78edc..361b654 100644
--- a/Flick/Code/Modules/Recommendations/MovieRecommendations/State/MovieRecommendationsForm.swift
+++ b/Flick/Sources/Code/Modules/Recommendations/MovieRecommendations/State/MovieRecommendationsForm.swift
@@ -7,6 +7,8 @@
//
import UDF
+@preconcurrency import Models
+import Common
struct MovieRecommendationsForm: Form {
var paginator: Paginator = .init(
diff --git a/Flick/Code/Modules/Recommendations/MovieRecommendations/View/MovieRecommendationsContainer.swift b/Flick/Sources/Code/Modules/Recommendations/MovieRecommendations/View/MovieRecommendationsContainer.swift
similarity index 93%
rename from Flick/Code/Modules/Recommendations/MovieRecommendations/View/MovieRecommendationsContainer.swift
rename to Flick/Sources/Code/Modules/Recommendations/MovieRecommendations/View/MovieRecommendationsContainer.swift
index 32f3b3f..2909ccd 100644
--- a/Flick/Code/Modules/Recommendations/MovieRecommendations/View/MovieRecommendationsContainer.swift
+++ b/Flick/Sources/Code/Modules/Recommendations/MovieRecommendations/View/MovieRecommendationsContainer.swift
@@ -7,9 +7,11 @@
//
import UDF
+import Models
+import SectionDetailsComponent
struct MovieRecommendationsContainer: BindableContainer {
- typealias ContainerComponent = SectionDetailsComponent
+ typealias ContainerComponent = SectionDetailsComponent
let id: Movie.ID
@@ -24,7 +26,7 @@ struct MovieRecommendationsContainer: BindableContainer {
items: movies,
genreById: store.state.allGenres.genreBy,
loadMoreAction: loadNewPageIfNeeded,
- dialogStatus: store.$state.movieRecommendationsForm[id].dialog
+ dialogStatus: store.$state.movieRecommendationsForm[id].dialog,
)
}
diff --git a/Flick/Code/Modules/Recommendations/ShowRecommendations/ShowRecommendationsMiddleware.swift b/Flick/Sources/Code/Modules/Recommendations/ShowRecommendations/ShowRecommendationsMiddleware.swift
similarity index 99%
rename from Flick/Code/Modules/Recommendations/ShowRecommendations/ShowRecommendationsMiddleware.swift
rename to Flick/Sources/Code/Modules/Recommendations/ShowRecommendations/ShowRecommendationsMiddleware.swift
index feeb4f1..354a761 100644
--- a/Flick/Code/Modules/Recommendations/ShowRecommendations/ShowRecommendationsMiddleware.swift
+++ b/Flick/Sources/Code/Modules/Recommendations/ShowRecommendations/ShowRecommendationsMiddleware.swift
@@ -8,6 +8,7 @@
import API
import UDF
+@preconcurrency import Models
final class ShowRecommendationsMiddleware: BaseObservableMiddleware {
enum Cancellation: Hashable {
diff --git a/Flick/Code/Modules/Recommendations/ShowRecommendations/State/ShowRecommendationsFlow.swift b/Flick/Sources/Code/Modules/Recommendations/ShowRecommendations/State/ShowRecommendationsFlow.swift
similarity index 98%
rename from Flick/Code/Modules/Recommendations/ShowRecommendations/State/ShowRecommendationsFlow.swift
rename to Flick/Sources/Code/Modules/Recommendations/ShowRecommendations/State/ShowRecommendationsFlow.swift
index 407d801..5ead755 100644
--- a/Flick/Code/Modules/Recommendations/ShowRecommendations/State/ShowRecommendationsFlow.swift
+++ b/Flick/Sources/Code/Modules/Recommendations/ShowRecommendations/State/ShowRecommendationsFlow.swift
@@ -7,6 +7,7 @@
//
import UDF
+import Models
enum ShowRecommendationsFlow: IdentifiableFlow {
case none, loadShows(Int)
diff --git a/Flick/Code/Modules/Recommendations/ShowRecommendations/State/ShowRecommendationsForm.swift b/Flick/Sources/Code/Modules/Recommendations/ShowRecommendations/State/ShowRecommendationsForm.swift
similarity index 94%
rename from Flick/Code/Modules/Recommendations/ShowRecommendations/State/ShowRecommendationsForm.swift
rename to Flick/Sources/Code/Modules/Recommendations/ShowRecommendations/State/ShowRecommendationsForm.swift
index c48c9ec..c93d5e6 100644
--- a/Flick/Code/Modules/Recommendations/ShowRecommendations/State/ShowRecommendationsForm.swift
+++ b/Flick/Sources/Code/Modules/Recommendations/ShowRecommendations/State/ShowRecommendationsForm.swift
@@ -7,6 +7,8 @@
//
import UDF
+import Common
+@preconcurrency import Models
struct ShowRecommendationsForm: Form {
var paginator: Paginator = .init(
diff --git a/Flick/Code/Modules/Recommendations/ShowRecommendations/View/ShowRecommendationsContainer.swift b/Flick/Sources/Code/Modules/Recommendations/ShowRecommendations/View/ShowRecommendationsContainer.swift
similarity index 93%
rename from Flick/Code/Modules/Recommendations/ShowRecommendations/View/ShowRecommendationsContainer.swift
rename to Flick/Sources/Code/Modules/Recommendations/ShowRecommendations/View/ShowRecommendationsContainer.swift
index 48a2e9d..e6361a8 100644
--- a/Flick/Code/Modules/Recommendations/ShowRecommendations/View/ShowRecommendationsContainer.swift
+++ b/Flick/Sources/Code/Modules/Recommendations/ShowRecommendations/View/ShowRecommendationsContainer.swift
@@ -7,9 +7,11 @@
//
import UDF
+import Models
+import SectionDetailsComponent
struct ShowRecommendationsContainer: BindableContainer {
- typealias ContainerComponent = SectionDetailsComponent
+ typealias ContainerComponent = SectionDetailsComponent
let id: Show.ID
diff --git a/Flick/Sources/Code/Modules/Recommendations/View/ItemDetailsRecommendations/ItemDetailsRecommendationsRouting.swift b/Flick/Sources/Code/Modules/Recommendations/View/ItemDetailsRecommendations/ItemDetailsRecommendationsRouting.swift
new file mode 100644
index 0000000..8495279
--- /dev/null
+++ b/Flick/Sources/Code/Modules/Recommendations/View/ItemDetailsRecommendations/ItemDetailsRecommendationsRouting.swift
@@ -0,0 +1,32 @@
+//
+// ItemDetailsRecommendationsRouting.swift
+// Flick
+//
+// Created by Alexander Sharko on 05.02.2023.
+// Copyright © 2023 urlaunched.com. All rights reserved.
+//
+
+import SwiftUI
+import UDF
+import Models
+import Common
+import ItemDetailsRecommendationsComponent
+
+struct ItemDetailsRecommendationsRouting: Routing {
+ @ViewBuilder func view(for route: ItemDetailsRecommendationsRoute) -> some View {
+ switch route {
+ case let .itemDetails(item):
+ if let movie = item as? Movie {
+ MovieDetailsContainer(id: movie.id)
+ } else if let show = item as? Show {
+ ShowDetailsContainer(id: show.id)
+ }
+ case let .recommendations(item):
+ if let movie = item as? Movie {
+ MovieRecommendationsContainer(id: movie.id)
+ } else if let show = item as? Show {
+ ShowRecommendationsContainer(id: show.id)
+ }
+ }
+ }
+}
diff --git a/Flick/Code/Modules/Recommendations/View/ItemDetailsRecommendations/MovieDetailsRecommendationsContainer.swift b/Flick/Sources/Code/Modules/Recommendations/View/ItemDetailsRecommendations/MovieDetailsRecommendationsContainer.swift
similarity index 74%
rename from Flick/Code/Modules/Recommendations/View/ItemDetailsRecommendations/MovieDetailsRecommendationsContainer.swift
rename to Flick/Sources/Code/Modules/Recommendations/View/ItemDetailsRecommendations/MovieDetailsRecommendationsContainer.swift
index a1c3e4d..e109414 100644
--- a/Flick/Code/Modules/Recommendations/View/ItemDetailsRecommendations/MovieDetailsRecommendationsContainer.swift
+++ b/Flick/Sources/Code/Modules/Recommendations/View/ItemDetailsRecommendations/MovieDetailsRecommendationsContainer.swift
@@ -7,9 +7,12 @@
//
import UDF
+import Models
+import Common
+import ItemDetailsRecommendationsComponent
struct MovieDetailsRecommendationsContainer: BindableContainer {
- typealias ContainerComponent = ItemDetailsRecommendationsComponent
+ typealias ContainerComponent = ItemDetailsRecommendationsComponent
let id: Movie.ID
@@ -23,7 +26,13 @@ struct MovieDetailsRecommendationsContainer: BindableContainer {
item: store.state.allMovies.movieBy(id: id),
items: isRedacted ? Movie.fakeItems(count: 3) : movies,
isRedacted: isRedacted,
- genreById: store.state.allGenres.genreBy
+ genreById: store.state.allGenres.genreBy,
+ destinationBuilder: DestinationBuilder(destination: { value in
+ switch value {
+ case let .imageContainer(path: path, size: size, type: type):
+ ImageContainer(size: size, path: path, type: type)
+ }
+ })
)
}
diff --git a/Flick/Code/Modules/Recommendations/View/ItemDetailsRecommendations/ShowDetailsRecommendationsContainer.swift b/Flick/Sources/Code/Modules/Recommendations/View/ItemDetailsRecommendations/ShowDetailsRecommendationsContainer.swift
similarity index 73%
rename from Flick/Code/Modules/Recommendations/View/ItemDetailsRecommendations/ShowDetailsRecommendationsContainer.swift
rename to Flick/Sources/Code/Modules/Recommendations/View/ItemDetailsRecommendations/ShowDetailsRecommendationsContainer.swift
index 0a3dea4..85fdf7e 100644
--- a/Flick/Code/Modules/Recommendations/View/ItemDetailsRecommendations/ShowDetailsRecommendationsContainer.swift
+++ b/Flick/Sources/Code/Modules/Recommendations/View/ItemDetailsRecommendations/ShowDetailsRecommendationsContainer.swift
@@ -7,9 +7,12 @@
//
import UDF
+import Models
+import Common
+import ItemDetailsRecommendationsComponent
struct ShowDetailsRecommendationsContainer: BindableContainer {
- typealias ContainerComponent = ItemDetailsRecommendationsComponent
+ typealias ContainerComponent = ItemDetailsRecommendationsComponent
let id: Show.ID
@@ -22,7 +25,13 @@ struct ShowDetailsRecommendationsContainer: BindableContainer {
item: store.state.allShows.showBy(id: id),
items: isRedacted ? Show.fakeItems(count: 3) : shows,
isRedacted: isRedacted,
- genreById: store.state.allGenres.genreBy
+ genreById: store.state.allGenres.genreBy,
+ destinationBuilder: DestinationBuilder(destination: { value in
+ switch value {
+ case let .imageContainer(path: path, size: size, type: type):
+ ImageContainer(size: size, path: path, type: type)
+ }
+ })
)
}
diff --git a/Flick/Code/Modules/Reviews/MovieReviews/MovieReviewsMiddleware.swift b/Flick/Sources/Code/Modules/Reviews/MovieReviews/MovieReviewsMiddleware.swift
similarity index 96%
rename from Flick/Code/Modules/Reviews/MovieReviews/MovieReviewsMiddleware.swift
rename to Flick/Sources/Code/Modules/Reviews/MovieReviews/MovieReviewsMiddleware.swift
index 2db0b02..fed1f18 100644
--- a/Flick/Code/Modules/Reviews/MovieReviews/MovieReviewsMiddleware.swift
+++ b/Flick/Sources/Code/Modules/Reviews/MovieReviews/MovieReviewsMiddleware.swift
@@ -8,8 +8,9 @@
import API
import UDF
+@preconcurrency import Models
-final class MovieReviewsMiddleware: BaseObservableMiddleware {
+final class MovieReviewsMiddleware: Middleware, @unchecked Sendable {
enum Cancellation: Hashable {
case loadMovieReviews(Movie.ID)
}
diff --git a/Flick/Code/Modules/Reviews/MovieReviews/State/MovieReviewsFlow.swift b/Flick/Sources/Code/Modules/Reviews/MovieReviews/State/MovieReviewsFlow.swift
similarity index 98%
rename from Flick/Code/Modules/Reviews/MovieReviews/State/MovieReviewsFlow.swift
rename to Flick/Sources/Code/Modules/Reviews/MovieReviews/State/MovieReviewsFlow.swift
index 5c054e8..a10452e 100644
--- a/Flick/Code/Modules/Reviews/MovieReviews/State/MovieReviewsFlow.swift
+++ b/Flick/Sources/Code/Modules/Reviews/MovieReviews/State/MovieReviewsFlow.swift
@@ -7,6 +7,7 @@
//
import UDF
+import Models
enum MovieReviewsFlow: IdentifiableFlow {
case none, loadMovieReviews(Int)
diff --git a/Flick/Code/Modules/Reviews/MovieReviews/State/MovieReviewsForm.swift b/Flick/Sources/Code/Modules/Reviews/MovieReviews/State/MovieReviewsForm.swift
similarity index 94%
rename from Flick/Code/Modules/Reviews/MovieReviews/State/MovieReviewsForm.swift
rename to Flick/Sources/Code/Modules/Reviews/MovieReviews/State/MovieReviewsForm.swift
index 0d08bae..3e88a11 100644
--- a/Flick/Code/Modules/Reviews/MovieReviews/State/MovieReviewsForm.swift
+++ b/Flick/Sources/Code/Modules/Reviews/MovieReviews/State/MovieReviewsForm.swift
@@ -7,6 +7,8 @@
//
import UDF
+@preconcurrency import Models
+import Common
struct MovieReviewsForm: Form {
var paginator: Paginator = .init(
diff --git a/Flick/Code/Modules/Reviews/MovieReviews/View/MovieReviewsContainer.swift b/Flick/Sources/Code/Modules/Reviews/MovieReviews/View/MovieReviewsContainer.swift
similarity index 93%
rename from Flick/Code/Modules/Reviews/MovieReviews/View/MovieReviewsContainer.swift
rename to Flick/Sources/Code/Modules/Reviews/MovieReviews/View/MovieReviewsContainer.swift
index a6ee0d4..1a4fb05 100644
--- a/Flick/Code/Modules/Reviews/MovieReviews/View/MovieReviewsContainer.swift
+++ b/Flick/Sources/Code/Modules/Reviews/MovieReviews/View/MovieReviewsContainer.swift
@@ -7,9 +7,11 @@
//
import UDF
+import Models
+import ReviewsComponent
struct MovieReviewsContainer: BindableContainer {
- typealias ContainerComponent = ReviewsComponent
+ typealias ContainerComponent = ReviewsComponent
let id: Movie.ID
diff --git a/Flick/Code/Modules/Reviews/View/Reviews/ReviewsRouter.swift b/Flick/Sources/Code/Modules/Reviews/ReviewsRouter.swift
similarity index 71%
rename from Flick/Code/Modules/Reviews/View/Reviews/ReviewsRouter.swift
rename to Flick/Sources/Code/Modules/Reviews/ReviewsRouter.swift
index 18044bc..5a1ed23 100644
--- a/Flick/Code/Modules/Reviews/View/Reviews/ReviewsRouter.swift
+++ b/Flick/Sources/Code/Modules/Reviews/ReviewsRouter.swift
@@ -8,13 +8,12 @@
import SwiftUI
import UDF
+import Models
+import ReviewsComponent
struct ReviewsRouting: Routing {
- enum Route: Hashable {
- case reviewDetails(Review.ID)
- }
-
- @ViewBuilder func view(for route: Route) -> some View {
+
+ @ViewBuilder func view(for route: ReviewsRoute) -> some View {
switch route {
case let .reviewDetails(id): ReviewDetailsContainer(reviewId: id)
}
diff --git a/Flick/Code/Modules/Reviews/ShowReviews/ShowReviewsMiddleware.swift b/Flick/Sources/Code/Modules/Reviews/ShowReviews/ShowReviewsMiddleware.swift
similarity index 99%
rename from Flick/Code/Modules/Reviews/ShowReviews/ShowReviewsMiddleware.swift
rename to Flick/Sources/Code/Modules/Reviews/ShowReviews/ShowReviewsMiddleware.swift
index 1cf2c15..3917c82 100644
--- a/Flick/Code/Modules/Reviews/ShowReviews/ShowReviewsMiddleware.swift
+++ b/Flick/Sources/Code/Modules/Reviews/ShowReviews/ShowReviewsMiddleware.swift
@@ -8,6 +8,7 @@
import API
import UDF
+@preconcurrency import Models
final class ShowReviewsMiddleware: BaseObservableMiddleware {
enum Cancellation: Hashable {
diff --git a/Flick/Code/Modules/Reviews/ShowReviews/State/ShowReviewsFlow.swift b/Flick/Sources/Code/Modules/Reviews/ShowReviews/State/ShowReviewsFlow.swift
similarity index 98%
rename from Flick/Code/Modules/Reviews/ShowReviews/State/ShowReviewsFlow.swift
rename to Flick/Sources/Code/Modules/Reviews/ShowReviews/State/ShowReviewsFlow.swift
index a7f9389..ef9b84f 100644
--- a/Flick/Code/Modules/Reviews/ShowReviews/State/ShowReviewsFlow.swift
+++ b/Flick/Sources/Code/Modules/Reviews/ShowReviews/State/ShowReviewsFlow.swift
@@ -8,6 +8,7 @@
import SwiftUI
import UDF
+import Models
enum ShowReviewsFlow: IdentifiableFlow {
case none, loadShowReviews(Int)
diff --git a/Flick/Code/Modules/Reviews/ShowReviews/State/ShowReviewsForm.swift b/Flick/Sources/Code/Modules/Reviews/ShowReviews/State/ShowReviewsForm.swift
similarity index 94%
rename from Flick/Code/Modules/Reviews/ShowReviews/State/ShowReviewsForm.swift
rename to Flick/Sources/Code/Modules/Reviews/ShowReviews/State/ShowReviewsForm.swift
index 45546a7..feb11ba 100644
--- a/Flick/Code/Modules/Reviews/ShowReviews/State/ShowReviewsForm.swift
+++ b/Flick/Sources/Code/Modules/Reviews/ShowReviews/State/ShowReviewsForm.swift
@@ -7,6 +7,8 @@
//
import UDF
+@preconcurrency import Models
+import Common
struct ShowReviewsForm: Form {
var paginator: Paginator = .init(
diff --git a/Flick/Code/Modules/Reviews/ShowReviews/View/ShowReviewsContainer.swift b/Flick/Sources/Code/Modules/Reviews/ShowReviews/View/ShowReviewsContainer.swift
similarity index 93%
rename from Flick/Code/Modules/Reviews/ShowReviews/View/ShowReviewsContainer.swift
rename to Flick/Sources/Code/Modules/Reviews/ShowReviews/View/ShowReviewsContainer.swift
index 50c2b45..03dad09 100644
--- a/Flick/Code/Modules/Reviews/ShowReviews/View/ShowReviewsContainer.swift
+++ b/Flick/Sources/Code/Modules/Reviews/ShowReviews/View/ShowReviewsContainer.swift
@@ -7,9 +7,11 @@
//
import UDF
+import Models
+import ReviewsComponent
struct ShowReviewsContainer: BindableContainer {
- typealias ContainerComponent = ReviewsComponent
+ typealias ContainerComponent = ReviewsComponent
let id: Show.ID
diff --git a/Flick/Sources/Code/Modules/Reviews/View/ItemDetailsReviews/ItemDetailsReviewsRouter.swift b/Flick/Sources/Code/Modules/Reviews/View/ItemDetailsReviews/ItemDetailsReviewsRouter.swift
new file mode 100644
index 0000000..03cc313
--- /dev/null
+++ b/Flick/Sources/Code/Modules/Reviews/View/ItemDetailsReviews/ItemDetailsReviewsRouter.swift
@@ -0,0 +1,28 @@
+//
+// ItemDetailsReviewsRouter.swift
+// Flick
+//
+// Created by Alexander Sharko on 08.02.2023.
+// Copyright © 2023 urlaunched.com. All rights reserved.
+//
+
+import SwiftUI
+import UDF
+import Models
+import Common
+import ItemDetailsReviewsComponent
+
+struct ItemDetailsReviewsRouting: Routing {
+ @ViewBuilder func view(for route: ItemDetailsReviewsRoute) -> some View {
+ switch route {
+ case let .reviewDetails(id):
+ ReviewDetailsContainer(reviewId: id)
+ case let .reviews(item):
+ if let movie = item as? Movie {
+ MovieReviewsContainer(id: movie.id)
+ } else if let show = item as? Show {
+ ShowReviewsContainer(id: show.id)
+ }
+ }
+ }
+}
diff --git a/Flick/Code/Modules/Reviews/View/ItemDetailsReviews/MovieDetailsReviewsContainer.swift b/Flick/Sources/Code/Modules/Reviews/View/ItemDetailsReviews/MovieDetailsReviewsContainer.swift
similarity index 73%
rename from Flick/Code/Modules/Reviews/View/ItemDetailsReviews/MovieDetailsReviewsContainer.swift
rename to Flick/Sources/Code/Modules/Reviews/View/ItemDetailsReviews/MovieDetailsReviewsContainer.swift
index bc3baa8..112aace 100644
--- a/Flick/Code/Modules/Reviews/View/ItemDetailsReviews/MovieDetailsReviewsContainer.swift
+++ b/Flick/Sources/Code/Modules/Reviews/View/ItemDetailsReviews/MovieDetailsReviewsContainer.swift
@@ -7,10 +7,12 @@
//
import UDF
+import Models
+import ItemDetailsReviewsComponent
+import Common
struct MovieDetailsReviewsContainer: BindableContainer {
- typealias ContainerComponent = ItemDetailsReviewsComponent
-
+ typealias ContainerComponent = ItemDetailsReviewsComponent
let id: Movie.ID
func scope(for state: AppState) -> Scope {
@@ -25,7 +27,14 @@ struct MovieDetailsReviewsContainer: BindableContainer {
item: store.state.allMovies.movieBy(id: id),
reviews: isRedacted ? Review.fakeItems().ids : reviews,
reviewById: reviewById,
- isRedacted: isRedacted
+ isRedacted: isRedacted,
+ router: .init(),
+ destinationBuilder: DestinationBuilder.init(destination: { value in
+ switch value {
+ case let .imageContainer(path: path, size: size, type: type):
+ ImageContainer(size: size, path: path, type: type)
+ }
+ })
)
}
diff --git a/Flick/Code/Modules/Reviews/View/ItemDetailsReviews/ShowDetailsReviewsContainer.swift b/Flick/Sources/Code/Modules/Reviews/View/ItemDetailsReviews/ShowDetailsReviewsContainer.swift
similarity index 73%
rename from Flick/Code/Modules/Reviews/View/ItemDetailsReviews/ShowDetailsReviewsContainer.swift
rename to Flick/Sources/Code/Modules/Reviews/View/ItemDetailsReviews/ShowDetailsReviewsContainer.swift
index 2f6e4a2..03a2012 100644
--- a/Flick/Code/Modules/Reviews/View/ItemDetailsReviews/ShowDetailsReviewsContainer.swift
+++ b/Flick/Sources/Code/Modules/Reviews/View/ItemDetailsReviews/ShowDetailsReviewsContainer.swift
@@ -7,9 +7,12 @@
//
import UDF
+import Models
+import ItemDetailsReviewsComponent
+import Common
struct ShowDetailsReviewsContainer: BindableContainer {
- typealias ContainerComponent = ItemDetailsReviewsComponent
+ typealias ContainerComponent = ItemDetailsReviewsComponent
let id: Show.ID
@@ -25,7 +28,14 @@ struct ShowDetailsReviewsContainer: BindableContainer {
item: store.state.allShows.showBy(id: id),
reviews: isRedacted ? Review.fakeItems().ids : reviews,
reviewById: reviewById,
- isRedacted: isRedacted
+ isRedacted: isRedacted,
+ router: .init(),
+ destinationBuilder: DestinationBuilder.init(destination: { value in
+ switch value {
+ case let .imageContainer(path: path, size: size, type: type):
+ ImageContainer(size: size, path: path, type: type)
+ }
+ })
)
}
diff --git a/Flick/Code/Modules/Reviews/View/ReviewDetails/ReviewDetailsContainer.swift b/Flick/Sources/Code/Modules/Reviews/View/ReviewDetails/ReviewDetailsContainer.swift
similarity index 54%
rename from Flick/Code/Modules/Reviews/View/ReviewDetails/ReviewDetailsContainer.swift
rename to Flick/Sources/Code/Modules/Reviews/View/ReviewDetails/ReviewDetailsContainer.swift
index 4579084..ea1e4b8 100644
--- a/Flick/Code/Modules/Reviews/View/ReviewDetails/ReviewDetailsContainer.swift
+++ b/Flick/Sources/Code/Modules/Reviews/View/ReviewDetails/ReviewDetailsContainer.swift
@@ -7,6 +7,9 @@
//
import UDF
+import Models
+import ReviewDetailsComponent
+import Common
struct ReviewDetailsContainer: Container {
typealias ContainerComponent = ReviewDetailsComponent
@@ -19,7 +22,13 @@ struct ReviewDetailsContainer: Container {
func map(store: EnvironmentStore) -> ContainerComponent.Props {
.init(
- review: store.state.allReviews.byId[reviewId]!
+ review: store.state.allReviews.byId[reviewId]!,
+ destinationBuilder: DestinationBuilder { value in
+ switch value {
+ case let .imageContainer(path: path, size: size, type: type):
+ ImageContainer(size: size, path: path, type: type)
+ }
+ }
)
}
}
diff --git a/Flick/Code/Modules/Root/State/RootForm.swift b/Flick/Sources/Code/Modules/Root/State/RootForm.swift
similarity index 96%
rename from Flick/Code/Modules/Root/State/RootForm.swift
rename to Flick/Sources/Code/Modules/Root/State/RootForm.swift
index 06cf1ae..25ccf87 100644
--- a/Flick/Code/Modules/Root/State/RootForm.swift
+++ b/Flick/Sources/Code/Modules/Root/State/RootForm.swift
@@ -8,6 +8,7 @@
import Foundation
import SwiftFoundation
import UDF
+import Common
struct RootForm: Form {
var dialog: DialogStatus = .dismissed
diff --git a/Flick/Code/Modules/Root/View/RootComponent.swift b/Flick/Sources/Code/Modules/Root/View/RootComponent.swift
similarity index 96%
rename from Flick/Code/Modules/Root/View/RootComponent.swift
rename to Flick/Sources/Code/Modules/Root/View/RootComponent.swift
index fcbdf62..1a47b78 100644
--- a/Flick/Code/Modules/Root/View/RootComponent.swift
+++ b/Flick/Sources/Code/Modules/Root/View/RootComponent.swift
@@ -7,6 +7,8 @@
import SwiftUI
import UDF
+import Common
+import SignInComponent
struct RootComponent: Component {
struct Props {
@@ -86,5 +88,6 @@ private extension View {
.navigationDestination(for: ItemDetailsReviewsRouting.self)
.navigationDestination(for: ItemDetailsRecommendationsRouting.self)
.navigationDestination(for: ReviewsRouting.self)
+ .navigationDestination(for: SectionDetailsRouting.self)
}
}
diff --git a/Flick/Code/Modules/Root/View/RootContainer.swift b/Flick/Sources/Code/Modules/Root/View/RootContainer.swift
similarity index 100%
rename from Flick/Code/Modules/Root/View/RootContainer.swift
rename to Flick/Sources/Code/Modules/Root/View/RootContainer.swift
diff --git a/Flick/Code/Modules/Root/View/RootRouter.swift b/Flick/Sources/Code/Modules/Root/View/RootRouter.swift
similarity index 100%
rename from Flick/Code/Modules/Root/View/RootRouter.swift
rename to Flick/Sources/Code/Modules/Root/View/RootRouter.swift
diff --git a/Flick/Code/Modules/Search/SearchMiddleware.swift b/Flick/Sources/Code/Modules/Search/SearchMiddleware.swift
similarity index 98%
rename from Flick/Code/Modules/Search/SearchMiddleware.swift
rename to Flick/Sources/Code/Modules/Search/SearchMiddleware.swift
index 039ad44..55d9527 100644
--- a/Flick/Code/Modules/Search/SearchMiddleware.swift
+++ b/Flick/Sources/Code/Modules/Search/SearchMiddleware.swift
@@ -9,6 +9,7 @@
import API
import Foundation
import UDF
+@preconcurrency import Models
final class SearchMiddleware: BaseObservableMiddleware {
var environment: Environment!
diff --git a/Flick/Code/Modules/Search/State/SearchFlow.swift b/Flick/Sources/Code/Modules/Search/State/SearchFlow.swift
similarity index 85%
rename from Flick/Code/Modules/Search/State/SearchFlow.swift
rename to Flick/Sources/Code/Modules/Search/State/SearchFlow.swift
index c6848b2..1b49a21 100644
--- a/Flick/Code/Modules/Search/State/SearchFlow.swift
+++ b/Flick/Sources/Code/Modules/Search/State/SearchFlow.swift
@@ -8,11 +8,16 @@
import SwiftUI
import UDF
+import Models
-enum SearchFlow: IdentifiableFlow {
+enum SearchFlow: IdentifiableFlow, InitialSetup {
case none, loadItems(Int)
init() { self = .none }
+
+ func initialSetup(with state: AppState) {
+
+ }
mutating func reduce(_ action: some Action) {
switch action {
diff --git a/Flick/Code/Modules/Search/State/SearchForm.swift b/Flick/Sources/Code/Modules/Search/State/SearchForm.swift
similarity index 94%
rename from Flick/Code/Modules/Search/State/SearchForm.swift
rename to Flick/Sources/Code/Modules/Search/State/SearchForm.swift
index aef27a1..35d7f6c 100644
--- a/Flick/Code/Modules/Search/State/SearchForm.swift
+++ b/Flick/Sources/Code/Modules/Search/State/SearchForm.swift
@@ -9,6 +9,8 @@
import Foundation
import SwiftFoundation
import UDF
+@preconcurrency import Models
+import Common
struct SearchForm: Form {
var searchText = ""
diff --git a/Flick/Code/Modules/Search/View/SearchContainer.swift b/Flick/Sources/Code/Modules/Search/View/SearchContainer.swift
similarity index 78%
rename from Flick/Code/Modules/Search/View/SearchContainer.swift
rename to Flick/Sources/Code/Modules/Search/View/SearchContainer.swift
index 9e15635..94b6739 100644
--- a/Flick/Code/Modules/Search/View/SearchContainer.swift
+++ b/Flick/Sources/Code/Modules/Search/View/SearchContainer.swift
@@ -8,6 +8,8 @@
import SwiftUI
import UDF
+import SearchComponent
+import Common
struct SearchContainer: Container {
typealias ContainerComponent = SearchComponent
@@ -24,7 +26,13 @@ struct SearchContainer: Container {
itemIds: store.state.searchForm.items,
searchItemById: store.state.allSearchItems.searchItemBy,
genreById: { _ in .testItem() },
- loadMoreAction: loadNewPageIfNeeded
+ loadMoreAction: loadNewPageIfNeeded,
+ destinationBuilder: DestinationBuilder(destination: { value in
+ switch value {
+ case let .imageContainer(path: path, size: size):
+ ImageContainer(size: size, path: path)
+ }
+ })
)
}
diff --git a/Flick/Code/Modules/SectionDetails/SectionDetailsMiddleware.swift b/Flick/Sources/Code/Modules/SectionDetails/SectionDetailsMiddleware.swift
similarity index 99%
rename from Flick/Code/Modules/SectionDetails/SectionDetailsMiddleware.swift
rename to Flick/Sources/Code/Modules/SectionDetails/SectionDetailsMiddleware.swift
index f56a679..df821c8 100644
--- a/Flick/Code/Modules/SectionDetails/SectionDetailsMiddleware.swift
+++ b/Flick/Sources/Code/Modules/SectionDetails/SectionDetailsMiddleware.swift
@@ -9,6 +9,7 @@
import API
import Foundation
import UDF
+@preconcurrency import Models
final class SectionDetailsMiddleware: BaseObservableMiddleware {
enum Cancellation: Hashable, CaseIterable {
diff --git a/Flick/Code/Modules/SectionDetails/State/SectionDetailsFlow.swift b/Flick/Sources/Code/Modules/SectionDetails/State/SectionDetailsFlow.swift
similarity index 98%
rename from Flick/Code/Modules/SectionDetails/State/SectionDetailsFlow.swift
rename to Flick/Sources/Code/Modules/SectionDetails/State/SectionDetailsFlow.swift
index 8a953d1..d84dd34 100644
--- a/Flick/Code/Modules/SectionDetails/State/SectionDetailsFlow.swift
+++ b/Flick/Sources/Code/Modules/SectionDetails/State/SectionDetailsFlow.swift
@@ -8,6 +8,7 @@
import SwiftUI
import UDF
+import Models
enum SectionDetailsFlow: IdentifiableFlow {
case none, loadMovies(Int), loadShows(Int)
diff --git a/Flick/Code/Modules/SectionDetails/State/SectionDetailsForm.swift b/Flick/Sources/Code/Modules/SectionDetails/State/SectionDetailsForm.swift
similarity index 96%
rename from Flick/Code/Modules/SectionDetails/State/SectionDetailsForm.swift
rename to Flick/Sources/Code/Modules/SectionDetails/State/SectionDetailsForm.swift
index ff590be..a707f4d 100644
--- a/Flick/Code/Modules/SectionDetails/State/SectionDetailsForm.swift
+++ b/Flick/Sources/Code/Modules/SectionDetails/State/SectionDetailsForm.swift
@@ -7,6 +7,8 @@
//
import UDF
+@preconcurrency import Models
+import Common
struct SectionDetailsForm: Form {
var moviesPaginator: Paginator = .init(
diff --git a/Flick/Code/Modules/SectionDetails/View/SectionDetailsContainer.swift b/Flick/Sources/Code/Modules/SectionDetails/View/SectionDetailsContainer.swift
similarity index 89%
rename from Flick/Code/Modules/SectionDetails/View/SectionDetailsContainer.swift
rename to Flick/Sources/Code/Modules/SectionDetails/View/SectionDetailsContainer.swift
index 4d334c3..af2e350 100644
--- a/Flick/Code/Modules/SectionDetails/View/SectionDetailsContainer.swift
+++ b/Flick/Sources/Code/Modules/SectionDetails/View/SectionDetailsContainer.swift
@@ -7,10 +7,13 @@
//
import UDF
+import Models
+import SectionDetailsComponent
+import Common
+import SwiftUI
-struct SectionDetailsContainer: Container {
- typealias ContainerComponent = SectionDetailsComponent
-
+struct SectionDetailsContainer: Container {
+ typealias ContainerComponent = SectionDetailsComponent
let section: S
func scope(for state: AppState) -> Scope {
@@ -24,7 +27,8 @@ struct SectionDetailsContainer: Container {
items: items,
genreById: store.state.allGenres.genreBy,
loadMoreAction: loadNewPageIfNeeded,
- dialogStatus: store.$state.homeForm.dialog
+ dialogStatus: store.$state.homeForm.dialog,
+ router: SectionDetailsRouting()
)
}
diff --git a/Flick/Code/Modules/SectionDetails/View/SectionDetailsRouter.swift b/Flick/Sources/Code/Modules/SectionDetails/View/SectionDetailsRouter.swift
similarity index 54%
rename from Flick/Code/Modules/SectionDetails/View/SectionDetailsRouter.swift
rename to Flick/Sources/Code/Modules/SectionDetails/View/SectionDetailsRouter.swift
index 146f017..a27d788 100644
--- a/Flick/Code/Modules/SectionDetails/View/SectionDetailsRouter.swift
+++ b/Flick/Sources/Code/Modules/SectionDetails/View/SectionDetailsRouter.swift
@@ -8,26 +8,13 @@
import SwiftUI
import UDF
+import Models
+import Common
+import SectionDetailsComponent
struct SectionDetailsRouting: Routing {
- enum Route: Hashable {
- case itemDetails(any Item)
-
- func hash(into hasher: inout Hasher) {
- switch self {
- case let .itemDetails(item):
- hasher.combine(item)
- }
- }
-
- static func == (lhs: Self, rhs: Self) -> Bool {
- switch (lhs, rhs) {
- case let (.itemDetails(lhsItem), .itemDetails(rhsItem)):
- areEqual(lhsItem, rhsItem)
- }
- }
- }
-
+ typealias Route = SectionDetailsRoute
+
@ViewBuilder func view(for route: Route) -> some View {
switch route {
case let .itemDetails(item):
@@ -36,6 +23,8 @@ struct SectionDetailsRouting: Routing {
} else if let show = item as? Show {
ShowDetailsContainer(id: show.id)
}
+ case .imageContainer(path: let path, size: let size):
+ ImageContainer(size: size, path: path)
}
}
}
diff --git a/Flick/Code/Modules/SignIn/State/SignInFlow.swift b/Flick/Sources/Code/Modules/SignIn/State/SignInFlow.swift
similarity index 100%
rename from Flick/Code/Modules/SignIn/State/SignInFlow.swift
rename to Flick/Sources/Code/Modules/SignIn/State/SignInFlow.swift
diff --git a/Flick/Code/Modules/SignIn/State/SignInForm.swift b/Flick/Sources/Code/Modules/SignIn/State/SignInForm.swift
similarity index 100%
rename from Flick/Code/Modules/SignIn/State/SignInForm.swift
rename to Flick/Sources/Code/Modules/SignIn/State/SignInForm.swift
diff --git a/Flick/Code/Modules/SignIn/View/SignInContainer.swift b/Flick/Sources/Code/Modules/SignIn/View/SignInContainer.swift
similarity index 75%
rename from Flick/Code/Modules/SignIn/View/SignInContainer.swift
rename to Flick/Sources/Code/Modules/SignIn/View/SignInContainer.swift
index 6fe447a..8d09631 100644
--- a/Flick/Code/Modules/SignIn/View/SignInContainer.swift
+++ b/Flick/Sources/Code/Modules/SignIn/View/SignInContainer.swift
@@ -8,9 +8,11 @@
import SwiftUI
import UDF
+import SignInComponent
+import Common
struct SignInContainer: Container {
- typealias ContainerComponent = SignInComponent
+ typealias ContainerComponent = SignInComponent
@Environment(\.dismiss) var dismiss
func scope(for state: AppState) -> Scope {
@@ -18,12 +20,13 @@ struct SignInContainer: Container {
}
func map(store: EnvironmentStore) -> ContainerComponent.Props {
- .init(
+ return .init(
username: store.$state.signInForm.username,
password: store.$state.signInForm.password,
signInAction: { dismiss() },
isLoaderPresented: .init { store.state.signInFlow != .none },
- dialogStatus: store.$state.signInForm.dialog
+ dialogStatus: store.$state.signInForm.dialog,
+ router: .init()
)
}
}
diff --git a/Flick/Sources/Code/Modules/SignIn/View/SignInRouter.swift b/Flick/Sources/Code/Modules/SignIn/View/SignInRouter.swift
new file mode 100644
index 0000000..150e030
--- /dev/null
+++ b/Flick/Sources/Code/Modules/SignIn/View/SignInRouter.swift
@@ -0,0 +1,25 @@
+//
+// SignInRouter.swift
+// Flick
+//
+// Created by Bogdan Petkanych on 14.05.2026.
+// Copyright © 2026 urlaunched. All rights reserved.
+//
+
+import UDF
+import SignInComponent
+import SwiftUI
+
+struct SignInRouter: Routing {
+ typealias Route = SignInRoute
+
+ @ViewBuilder
+ func view(for route: Route) -> some View {
+ switch route {
+ case .resetPassword:
+ Text("Reset password")
+ case .signUp:
+ Text("Sign Up")
+ }
+ }
+}
diff --git a/Flick/Code/Modules/TabBar/State/TabBarForm.swift b/Flick/Sources/Code/Modules/TabBar/State/TabBarForm.swift
similarity index 99%
rename from Flick/Code/Modules/TabBar/State/TabBarForm.swift
rename to Flick/Sources/Code/Modules/TabBar/State/TabBarForm.swift
index 13dcc6a..84c5898 100644
--- a/Flick/Code/Modules/TabBar/State/TabBarForm.swift
+++ b/Flick/Sources/Code/Modules/TabBar/State/TabBarForm.swift
@@ -9,6 +9,7 @@
import SwiftFoundation
import SwiftUI
import UDF
+@preconcurrency import Common
struct TabBarForm: UDF.Form {
enum HomeTab {}
diff --git a/Flick/Code/Modules/TabBar/View/TabBarContainer.swift b/Flick/Sources/Code/Modules/TabBar/View/TabBarContainer.swift
similarity index 96%
rename from Flick/Code/Modules/TabBar/View/TabBarContainer.swift
rename to Flick/Sources/Code/Modules/TabBar/View/TabBarContainer.swift
index 38cb007..558d461 100644
--- a/Flick/Code/Modules/TabBar/View/TabBarContainer.swift
+++ b/Flick/Sources/Code/Modules/TabBar/View/TabBarContainer.swift
@@ -8,6 +8,7 @@
import SwiftUI
import UDF
+import TabBarComponent
struct TabBarContainer: Container {
typealias ContainerComponent = TabBarComponent
diff --git a/Flick/Code/Modules/WhereToWatch/View/WhereToWatchContainer.swift b/Flick/Sources/Code/Modules/WhereToWatch/View/WhereToWatchContainer.swift
similarity index 75%
rename from Flick/Code/Modules/WhereToWatch/View/WhereToWatchContainer.swift
rename to Flick/Sources/Code/Modules/WhereToWatch/View/WhereToWatchContainer.swift
index 3b9a0c4..15265ab 100644
--- a/Flick/Code/Modules/WhereToWatch/View/WhereToWatchContainer.swift
+++ b/Flick/Sources/Code/Modules/WhereToWatch/View/WhereToWatchContainer.swift
@@ -8,6 +8,9 @@
import FlagKit
import UDF
+import Models
+import WhereToWatchComponent
+import Common
struct WhereToWatchContainer: Container {
typealias ContainerComponent = WhereToWatchComponent
@@ -35,7 +38,13 @@ struct WhereToWatchContainer: Container {
return .init(title: code, image: image)
}
}(),
- providers: Provider.fakeItems(count: 3)
+ providers: Provider.fakeItems(count: 3),
+ destinationBuilder: DestinationBuilder.init(destination: { value in
+ switch value {
+ case let .imageContainer(path: path, size: size, type: type):
+ ImageContainer(size: size, path: path, type: type)
+ }
+ })
)
}
}
diff --git a/Flick/FlickApp.swift b/Flick/Sources/FlickApp.swift
similarity index 95%
rename from Flick/FlickApp.swift
rename to Flick/Sources/FlickApp.swift
index ba6f04f..03664ea 100644
--- a/Flick/FlickApp.swift
+++ b/Flick/Sources/FlickApp.swift
@@ -10,12 +10,12 @@ import SwiftUI
import UDF
private let token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJidW5kbGVfaWRzIjpbImNvbS51cmxhdW5jaGVkLmZsaWNrIl19.HjROptJlsO915Ju0fw7VtO-FhHZlZSdDRALOrFQOvPU"
-private var store: EnvironmentStore!
+var globalStore: EnvironmentStore!
@main
struct FlickApp: App {
init() {
- store = EnvironmentStore(
+ globalStore = EnvironmentStore(
initial: AppState(),
logger: .consoleDebug
)
@@ -36,7 +36,7 @@ struct FlickApp: App {
private extension FlickApp {
func originalSubscribe() {
- store.subscribe { _ in
+ globalStore.subscribe { _ in
HomeMiddleware.self
GenresMiddleware.self
NetworkConnectivityMiddleware.self
diff --git a/Info.plist b/Info.plist
new file mode 100644
index 0000000..0ee22fb
--- /dev/null
+++ b/Info.plist
@@ -0,0 +1,23 @@
+
+
+
+
+CFBundleIdentifier
+$(PRODUCT_BUNDLE_IDENTIFIER)
+CFBundleExecutable
+$(EXECUTABLE_NAME)
+CFBundlePackageType
+$(PRODUCT_BUNDLE_PACKAGE_TYPE)
+UILaunchStoryboardName
+LaunchScreen
+CFBundleAllowMixedLocalizations
+
+ITSAppUsesNonExemptEncryption
+
+UIAppFonts
+
+ Poppins-Regular.ttf
+ Poppins-SemiBold.ttf
+
+
+
\ No newline at end of file
diff --git a/Localizations/Package.swift b/Localizations/Package.swift
deleted file mode 100644
index 357f80b..0000000
--- a/Localizations/Package.swift
+++ /dev/null
@@ -1,30 +0,0 @@
-// swift-tools-version: 6.0
-// The swift-tools-version declares the minimum version of Swift required to build this package.
-
-import PackageDescription
-
-let package = Package(
- name: "Localizations",
- defaultLocalization: "en",
- products: [
- .library(
- name: "Localizations",
- targets: ["Localizations"]
- ),
- ],
- dependencies: [
- .package(url: "https://github.com/mac-cain13/R.swift.git", from: "7.0.0"),
- ],
- targets: [
- .target(
- name: "Localizations",
- dependencies: [.product(name: "RswiftLibrary", package: "R.swift")],
- resources: [
- .process("Resources"),
- ],
- plugins: [
- .plugin(name: "RswiftGeneratePublicResources", package: "R.swift"),
- ]
- ),
- ]
-)
diff --git a/Project.swift b/Project.swift
new file mode 100644
index 0000000..9485ac5
--- /dev/null
+++ b/Project.swift
@@ -0,0 +1,527 @@
+import ProjectDescription
+import ProjectDescriptionHelpers
+
+let settings: Settings = .settings(
+ base: [
+ "OTHER_LDFLAGS": ["$(inherited)", "-ObjC"],
+ ],
+ configurations: [
+ .debug(name: "Debug", xcconfig: "./xcconfigs/Flick-Project.xcconfig"),
+ .release(name: "Release", xcconfig: "./xcconfigs/Flick-Project.xcconfig"),
+ ]
+)
+
+
+let appSettings: Settings = .settings(
+ configurations: [
+ .debug(name: "Debug", xcconfig: "./xcconfigs/Flick.xcconfig"),
+ .release(name: "Release", xcconfig: "./xcconfigs/Flick.xcconfig"),
+ ]
+)
+
+let project = Project.app(
+ name: "Flick",
+ organizationName: "urlaunched",
+ packages: [
+ ],
+ settings: settings,
+ appSettings: appSettings,
+ targetDependancies: [
+ .external(name: "FlagKit"),
+ .external(name: "SDWebImageSwiftUI"),
+ .external(name: "UDF"),
+ .external(name: "SwiftFoundation"),
+ .external(name: "SwiftUI-Kit"),
+ ],
+ moduleTargets: [
+ makeAllCoreModules(),
+ makeUIModules()
+ ].flatMap { $0 }
+)
+
+func makeAllCoreModules() -> [Module] {
+ return [
+ makeCommanModule(),
+ makeModelsModule(),
+ makeAPIModule(),
+ makeDesignSystemModule(),
+ makeLocalizationModule(),
+ makeCustomViewsModule(),
+ ]
+}
+
+func makeUIModules() -> [Module] {
+ return [
+ makeOnboardingUIComponent(),
+ makeOnboardingSignInComponent(),
+ makeWhereToWatchComponent(),
+ makeTabBarComponent(),
+ makeImageComponent(),
+ makeSectionDetailsComponent(),
+ makeReviewsComponent(),
+ makeReviewDetailsComponent(),
+ makeItemDetailsReviewsComponent(),
+ makeSearchComponent(),
+ makeItemDetailsRecommendationsComponent(),
+ makeSettingsComponent(),
+ makeMyFavoritesComponent(),
+ makeItemDetailsComponent(),
+ makeHomeComponent(),
+ makeMainHomeSectionComponent(),
+ makeHomeSectionComponent(),
+ makeCastComponent(),
+ makeItemDetailsCastComponent(),
+ ]
+}
+
+func makeModelsModule() -> Module {
+ Module(
+ name: "Models",
+ moduleType: .core,
+ path: "Models",
+ frameworkDependancies: [
+ .external(name: "SwiftFoundation"),
+ .external(name: "UDF"),
+ .target(name: "DesignSystem"),
+ .target(name: "Common"),
+ .target(name: "API"),
+ .target(name: "Localizations"),
+ .external(name: "RswiftLibrary"),
+ ],
+ frameworkResources: []
+ )
+}
+
+func makeCommanModule() -> Module {
+ return Module(
+ name: "Common",
+ moduleType: .core,
+ path: "Common",
+ frameworkDependancies: [
+ .external(name: "UDF"),
+ .external(name: "SwiftUI-Kit"),
+ .target(name: "DesignSystem"),
+ ],
+ frameworkResources: []
+ )
+}
+
+func makeAPIModule() -> Module {
+ return Module(
+ name: "API",
+ moduleType: .core,
+ path: "API",
+ frameworkDependancies: [
+ .external(name: "SwiftFoundation"),
+ ],
+ frameworkResources: []
+ )
+}
+
+func makeDesignSystemModule() -> Module {
+ return Module(
+ name: "DesignSystem",
+ moduleType: .core,
+ path: "DesignSystem",
+ frameworkDependancies: [
+ .external(name: "SwiftUI-Kit"),
+ ],
+ frameworkResources: [
+ "Resources/**"
+ ]
+ )
+}
+
+func makeCustomViewsModule() -> Module {
+ return Module(
+ name: "CustomViews",
+ moduleType: .core,
+ path: "CustomViews",
+ frameworkDependancies: [
+ .external(name: "SwiftUI-Kit"),
+ .external(name: "SDWebImageSwiftUI"),
+ .target(name: "DesignSystem"),
+ .target(name: "Models"),
+ ],
+ frameworkResources: []
+ )
+}
+
+func makeLocalizationModule() -> Module {
+ return Module(
+ name: "Localizations",
+ moduleType: .core,
+ path: "Localizations",
+ frameworkDependancies: [
+ .external(name: "RswiftLibrary")
+ ],
+ frameworkResources: [
+ "Resources/**"
+ ],
+ frameworkScripts: [
+ .pre(
+ script: """
+ "$PROJECT_DIR/Core/Localizations/rswift" generate --access-level public "$PROJECT_DIR/Core/Localizations/Sources/R.generated.swift"
+ """,
+ name: "R.swift"
+ )
+ ]
+ )
+}
+
+func makeOnboardingUIComponent() -> Module {
+ return Module(
+ name: "OnboardingComponent",
+ moduleType: .ui,
+ path: "OnboardingComponent",
+ frameworkDependancies: [
+ .external(name: "UDF"),
+ .external(name: "SwiftUI-Kit"),
+ .target(name: "DesignSystem"),
+ .target(name: "Localizations"),
+ .external(name: "RswiftLibrary")
+ ],
+ frameworkResources: [],
+ snapshotDependencies: [
+ .external(name: "SwiftUISnapshotTestCase"),
+ ],
+ targets: [.framework, .snapshotTests]
+ )
+}
+
+func makeOnboardingSignInComponent() -> Module {
+ return Module(
+ name: "SignInComponent",
+ moduleType: .ui,
+ path: "SignInComponent",
+ frameworkDependancies: [
+ .external(name: "UDF"),
+ .target(name: "DesignSystem"),
+ .target(name: "Localizations"),
+ .external(name: "RswiftLibrary"),
+ .target(name: "Common"),
+ ],
+ frameworkResources: [],
+ snapshotDependencies: [
+ .external(name: "SwiftUISnapshotTestCase"),
+ ],
+ targets: [.framework, .snapshotTests]
+ )
+}
+
+func makeWhereToWatchComponent() -> Module {
+ return Module(
+ name: "WhereToWatchComponent",
+ moduleType: .ui,
+ path: "WhereToWatchComponent",
+ frameworkDependancies: [
+ .external(name: "UDF"),
+ .target(name: "Localizations"),
+ .external(name: "RswiftLibrary"),
+ .target(name: "Common"),
+ .target(name: "Models"),
+ .external(name: "FlagKit"),
+ ],
+ frameworkResources: [],
+ snapshotDependencies: [],
+ targets: [.framework]
+ )
+}
+
+func makeTabBarComponent() -> Module {
+ return Module(
+ name: "TabBarComponent",
+ moduleType: .ui,
+ path: "TabBarComponent",
+ frameworkDependancies: [
+ .external(name: "UDF"),
+ .external(name: "SwiftUI-Kit"),
+ .target(name: "DesignSystem"),
+ .target(name: "Common"),
+ ],
+ frameworkResources: [],
+ snapshotDependencies: [],
+ targets: [.framework]
+ )
+}
+
+func makeImageComponent() -> Module {
+ return Module(
+ name: "ImageComponent",
+ moduleType: .ui,
+ path: "ImageComponent",
+ frameworkDependancies: [
+ .external(name: "UDF"),
+ .external(name: "SDWebImageSwiftUI"),
+ .external(name: "SwiftUI-Kit"),
+ .target(name: "DesignSystem"),
+ .target(name: "Common"),
+ ],
+ frameworkResources: [],
+ snapshotDependencies: [],
+ targets: [.framework]
+ )
+}
+
+func makeSectionDetailsComponent() -> Module {
+ return Module(
+ name: "SectionDetailsComponent",
+ moduleType: .ui,
+ path: "SectionDetailsComponent",
+ frameworkDependancies: [
+ .external(name: "UDF"),
+ .target(name: "Common"),
+ .target(name: "Models"),
+ ],
+ frameworkResources: [],
+ snapshotDependencies: [],
+ targets: [.framework]
+ )
+}
+
+func makeReviewsComponent() -> Module {
+ return Module(
+ name: "ReviewsComponent",
+ moduleType: .ui,
+ path: "ReviewsComponent",
+ frameworkDependancies: [
+ .external(name: "UDF"),
+ .target(name: "Common"),
+ .target(name: "Models"),
+ .target(name: "CustomViews"),
+ ],
+ frameworkResources: [],
+ snapshotDependencies: [],
+ targets: [.framework]
+ )
+}
+
+func makeReviewDetailsComponent() -> Module {
+ return Module(
+ name: "ReviewDetailsComponent",
+ moduleType: .ui,
+ path: "ReviewDetailsComponent",
+ frameworkDependancies: [
+ .external(name: "UDF"),
+ .target(name: "Common"),
+ .target(name: "Models"),
+ .target(name: "CustomViews"),
+ .target(name: "DesignSystem"),
+ .target(name: "Localizations"),
+ ],
+ frameworkResources: [],
+ snapshotDependencies: [],
+ targets: [.framework]
+ )
+}
+
+func makeItemDetailsReviewsComponent() -> Module {
+ return Module(
+ name: "ItemDetailsReviewsComponent",
+ moduleType: .ui,
+ path: "ItemDetailsReviewsComponent",
+ frameworkDependancies: [
+ .external(name: "UDF"),
+ .target(name: "Models"),
+ .target(name: "CustomViews"),
+ .target(name: "DesignSystem"),
+ .target(name: "Localizations"),
+ ],
+ frameworkResources: [],
+ snapshotDependencies: [],
+ targets: [.framework]
+ )
+}
+
+func makeSearchComponent() -> Module {
+ return Module(
+ name: "SearchComponent",
+ moduleType: .ui,
+ path: "SearchComponent",
+ frameworkDependancies: [
+ .external(name: "UDF"),
+ .target(name: "Models"),
+ .target(name: "CustomViews"),
+ .target(name: "DesignSystem"),
+ .target(name: "Localizations"),
+ ],
+ frameworkResources: [],
+ snapshotDependencies: [],
+ targets: [.framework]
+ )
+}
+
+func makeItemDetailsRecommendationsComponent() -> Module {
+ return Module(
+ name: "ItemDetailsRecommendationsComponent",
+ moduleType: .ui,
+ path: "ItemDetailsRecommendationsComponent",
+ frameworkDependancies: [
+ .external(name: "UDF"),
+ .target(name: "Models"),
+ .target(name: "CustomViews"),
+ .target(name: "DesignSystem"),
+ .target(name: "Localizations"),
+ .target(name: "Common"),
+ ],
+ frameworkResources: [],
+ snapshotDependencies: [],
+ targets: [.framework]
+ )
+}
+
+func makeSettingsComponent() -> Module {
+ return Module(
+ name: "SettingsComponent",
+ moduleType: .ui,
+ path: "SettingsComponent",
+ frameworkDependancies: [
+ .external(name: "UDF"),
+ .external(name: "SwiftUI-Kit"),
+ .target(name: "Common"),
+ .target(name: "Localizations"),
+ ],
+ frameworkResources: [],
+ snapshotDependencies: [],
+ targets: [.framework]
+ )
+}
+
+func makeMyFavoritesComponent() -> Module {
+ return Module(
+ name: "MyFavoritesComponent",
+ moduleType: .ui,
+ path: "MyFavoritesComponent",
+ frameworkDependancies: [
+ .external(name: "UDF"),
+ .target(name: "Models"),
+ .target(name: "DesignSystem"),
+ .target(name: "Localizations"),
+ .target(name: "CustomViews"),
+ .target(name: "Common"),
+ ],
+ frameworkResources: [],
+ snapshotDependencies: [],
+ targets: [.framework]
+ )
+}
+
+func makeItemDetailsComponent() -> Module {
+ return Module(
+ name: "ItemDetailsComponent",
+ moduleType: .ui,
+ path: "ItemDetailsComponent",
+ frameworkDependancies: [
+ .external(name: "UDF"),
+ .external(name: "SwiftUI-Kit"),
+ .target(name: "Common"),
+ .target(name: "Models"),
+ .target(name: "DesignSystem"),
+ .target(name: "Localizations"),
+ .target(name: "CustomViews"),
+ ],
+ frameworkResources: [],
+ snapshotDependencies: [],
+ targets: [.framework]
+ )
+}
+
+func makeHomeComponent() -> Module {
+ return Module(
+ name: "HomeComponent",
+ moduleType: .ui,
+ path: "HomeComponent",
+ frameworkDependancies: [
+ .external(name: "UDF"),
+ .external(name: "SwiftUI-Kit"),
+ .target(name: "Common"),
+ .target(name: "Models"),
+ .target(name: "DesignSystem"),
+ .target(name: "Localizations"),
+ .target(name: "CustomViews"),
+ ],
+ frameworkResources: [],
+ snapshotDependencies: [],
+ targets: [.framework]
+ )
+}
+
+func makeMainHomeSectionComponent() -> Module {
+ return Module(
+ name: "MainHomeSectionComponent",
+ moduleType: .ui,
+ path: "MainHomeSectionComponent",
+ frameworkDependancies: [
+ .external(name: "UDF"),
+ .external(name: "SwiftUI-Kit"),
+ .target(name: "Common"),
+ .target(name: "Models"),
+ .target(name: "DesignSystem"),
+ .target(name: "Localizations"),
+ .target(name: "CustomViews"),
+ ],
+ frameworkResources: [],
+ snapshotDependencies: [],
+ targets: [.framework]
+ )
+}
+
+func makeHomeSectionComponent() -> Module {
+ return Module(
+ name: "HomeSectionComponent",
+ moduleType: .ui,
+ path: "HomeSectionComponent",
+ frameworkDependancies: [
+ .external(name: "UDF"),
+ .external(name: "SwiftUI-Kit"),
+ .target(name: "Common"),
+ .target(name: "Models"),
+ .target(name: "DesignSystem"),
+ .target(name: "Localizations"),
+ .target(name: "CustomViews"),
+ ],
+ frameworkResources: [],
+ snapshotDependencies: [],
+ targets: [.framework]
+ )
+}
+
+func makeCastComponent() -> Module {
+ return Module(
+ name: "CastComponent",
+ moduleType: .ui,
+ path: "CastComponent",
+ frameworkDependancies: [
+ .external(name: "UDF"),
+ .external(name: "SwiftUI-Kit"),
+ .target(name: "Common"),
+ .target(name: "Models"),
+ .target(name: "DesignSystem"),
+ .target(name: "Localizations"),
+ .target(name: "CustomViews"),
+ ],
+ frameworkResources: [],
+ snapshotDependencies: [],
+ targets: [.framework]
+ )
+}
+
+func makeItemDetailsCastComponent() -> Module {
+ return Module(
+ name: "ItemDetailsCastComponent",
+ moduleType: .ui,
+ path: "ItemDetailsCastComponent",
+ frameworkDependancies: [
+ .external(name: "UDF"),
+ .external(name: "SwiftUI-Kit"),
+ .target(name: "Common"),
+ .target(name: "Models"),
+ .target(name: "DesignSystem"),
+ .target(name: "Localizations"),
+ .target(name: "CustomViews"),
+ ],
+ frameworkResources: [],
+ snapshotDependencies: [],
+ targets: [.framework]
+ )
+}
diff --git a/README.md b/README.md
index 3a6c86b..b5bef43 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,9 @@
# 🎬 Flick — Movie App Demo
-**Flick** is a modular Swift demo project built to demonstrate **Unidirectional Data Flow (UDF)** and **Swift Package Manager (SPM)** principles in iOS development. This app is designed to be a modern example of scalable architecture, modularization, and clean UI design.
+
+**Flick** is a modular Swift demo project built to demonstrate **Unidirectional Data Flow (UDF)** and **Tuist**-driven project generation principles in iOS development.
+
+The project showcases a modern approach to scalable architecture, modularization, dependency management, and clean UI design using a fully modular setup powered by **Tuist**.
---
@@ -19,10 +22,34 @@ This project integrates with [The Movie Database (TMDB)](https://www.themoviedb.
### 🔧 To run the app properly, you need to:
-1. **Create a TMDB account** and generate an API key:
+1. **Install Tuist** (if not already installed)
+
+ ```bash
+ brew install tuist
+ ```
+
+2. **Then install project dependencies:**
+
+ ```bash
+ tuist install
+ ```
+
+3. **Generate the Xcode project**
+
+ ```bash
+ tuist generate
+ ```
+
+4. **Running Snapshot tests**
+
+ ```bash
+ tuist test
+ ```
+
+5. **Create a TMDB account** and generate an API key:
[https://www.themoviedb.org/settings/api](https://www.themoviedb.org/settings/api)
-2. **Add your API key** in the appropriate configuration file or environment.
+6. **Add your API key** in the appropriate configuration file or environment.
For this project, issert you API key in kTMDBApiKey property in [`BaseAPI.swift`](./API/Sources/API/BaseAPI.swift)
```swift
@@ -35,13 +62,18 @@ This project integrates with [The Movie Database (TMDB)](https://www.themoviedb.
## 🗂️ Modules
-Modularity is at the heart of Flick. Each feature is encapsulated in its own folder under `Modules/` and follows a clean separation of UI, logic, and state.
+Modularity is at the heart of Flick. Each feature is encapsulated in its own folder under `Modules/`, while each reusable UI component is further encapsulated in its own Tuist framework under `UI/FrameworkName`. This structure follows a clean separation of UI, logic, and state, ensuring strong isolation between features, improved reusability, **selective testing with Tuist** and scalable architecture across the project.
---
+## Tuist Dependency Graph
+
+The project structure is visualized through a generated dependency graph:
+
+
## 🔍 Typical Module Structure
-Most feature modules follow a consistent structure:
+Most feature app feature modules follow a consistent structure:
```
📁 ModuleName
@@ -49,38 +81,35 @@ Most feature modules follow a consistent structure:
│ ├── ModuleNameFlow.swift (e.g. SearchFlow.swift)
│ └── ModuleNameForm.swift (e.g. SearchForm.swift)
├── 📁 View
-│ ├── ModuleNameComponent.swift (e.g. SearchComponent.swift)
+│ ├── ModuleNameRouting.swift (e.g. SearchRouting.swift)
│ └── ModuleNameContainer.swift (e.g. SearchContainer.swift)
├── Middleware.swift (optional side effects, e.g. SearchMiddleware.swift)
```
+Framework module follow a consistent structure:
+
+```
+📁 ModuleName
+├── 📁 Sources
+│ ├── ModuleNameComponent.swift (e.g. SearchComponent.swift)
+│ ├── ModuleNameContent.swift (e.g. SearchContent.swift)
+│ ├── ModuleNameRoute.swift (e.g. SearchRoute.swift)
+├── 📁 Snapshots
+│ ├── 📁 __Snapshots__
+│ ├── ModuleComponentTests.swift (e.g. SearchComponentTests.swift)
+```
+
This ensures:
+
- Clear separation of concerns (UI, logic, effects)
- Easy testability
- Scalable modular design
+- Modular architecture powered by Tuist: enabling independent feature frameworks; explicit dependency management, and reproducible Xcode project generation across the entire codebase
📦 Example: [`Search`](./Flick/Code/Modules/Search)
---
-## 🧪 Snapshot Testing
-
-UI consistency is maintained using snapshot testing.
-
-📁 [`SnapshotTests/`](./SnapshotTests)
-- Tests like `SnapshotTestCase+Component.swift`
-- UI snapshots are stored under `Snapshots/`
-
----
-
-## 🔩 SPM Modularization
-
-Each logical unit (DesignSystem, API, Localization) is a Swift package:
-- Improved compile times
-- Better code reuse
-
----
-
## 🔗 BindableReducer and BindableContainer
Flick introduces dynamic reducer composition through the concept of `@BindableReducer`.
diff --git a/SnapshotTests/SnapshotTestCase+Component.swift b/SnapshotTest/BaseSnapshotTestCase.swift
similarity index 78%
rename from SnapshotTests/SnapshotTestCase+Component.swift
rename to SnapshotTest/BaseSnapshotTestCase.swift
index b283f37..5ed377f 100644
--- a/SnapshotTests/SnapshotTestCase+Component.swift
+++ b/SnapshotTest/BaseSnapshotTestCase.swift
@@ -1,18 +1,30 @@
//
-// SnapshotTestCase+Component.swift
-// SnapshotTests
+// BaseSnapshotTestCase.swift
+// Flick
//
-// Created by Max Kuznetsov on 02.11.2022.
+// Created by Bogdan Petkanych on 13.05.2026.
+// Copyright © 2026 urlaunched. All rights reserved.
//
-import Foundation
-import SDWebImage
-import SwiftUI
import SwiftUISnapshotTestCase
-import UDF
import XCTest
+import UDF
+
+@MainActor
+class BaseSnapshotTestCase: SnapshotTestCase {
+ override class func setUp() {
+ deviceReference = "iPhone 17 Pro"
+ osVersionReference = "26.5"
+ super.setUp()
+ }
+
+ override func setUp() {
+ super.setUp()
+ devices = [.iPhone17Pro]
+ super.setUp()
+ }
+}
-@testable import Flick
extension SnapshotTestCase {
func snapshot(
@@ -98,20 +110,4 @@ extension SnapshotTestCase {
line: line
)
}
-
- func cacheImage(_ imageName: String) throws {
- let image = try XCTUnwrap(UIImage(named: imageName))
-
- SDImageCache.shared.store(image, forKey: imageName, toDisk: false)
- SDWebImageManager.shared.cacheKeyFilter = SDWebImageCacheKeyFilter(block: { _ in
- imageName
- })
-
- let exp = expectation(description: "waiting for store image")
- DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
- exp.fulfill()
- }
-
- wait(for: [exp], timeout: 1)
- }
}
diff --git a/SnapshotTests/Snapshots/__Snapshots__/SignInComponentTests/test_ColorScheme_isDark_iPhone13Mini_portrait.1.jpg b/SnapshotTests/Snapshots/__Snapshots__/SignInComponentTests/test_ColorScheme_isDark_iPhone13Mini_portrait.1.jpg
deleted file mode 100644
index b13070a..0000000
Binary files a/SnapshotTests/Snapshots/__Snapshots__/SignInComponentTests/test_ColorScheme_isDark_iPhone13Mini_portrait.1.jpg and /dev/null differ
diff --git a/SnapshotTests/Snapshots/__Snapshots__/SignInComponentTests/test_ColorScheme_isDark_iPhone13_portrait.1.jpg b/SnapshotTests/Snapshots/__Snapshots__/SignInComponentTests/test_ColorScheme_isDark_iPhone13_portrait.1.jpg
deleted file mode 100644
index ce1b203..0000000
Binary files a/SnapshotTests/Snapshots/__Snapshots__/SignInComponentTests/test_ColorScheme_isDark_iPhone13_portrait.1.jpg and /dev/null differ
diff --git a/SnapshotTests/Snapshots/__Snapshots__/SignInComponentTests/test_ColorScheme_isDark_iPhone8Plus_portrait.1.jpg b/SnapshotTests/Snapshots/__Snapshots__/SignInComponentTests/test_ColorScheme_isDark_iPhone8Plus_portrait.1.jpg
deleted file mode 100644
index b268d59..0000000
Binary files a/SnapshotTests/Snapshots/__Snapshots__/SignInComponentTests/test_ColorScheme_isDark_iPhone8Plus_portrait.1.jpg and /dev/null differ
diff --git a/SnapshotTests/Snapshots/__Snapshots__/SignInComponentTests/test_ColorScheme_isDark_iPhone8_portrait.1.jpg b/SnapshotTests/Snapshots/__Snapshots__/SignInComponentTests/test_ColorScheme_isDark_iPhone8_portrait.1.jpg
deleted file mode 100644
index 8713a55..0000000
Binary files a/SnapshotTests/Snapshots/__Snapshots__/SignInComponentTests/test_ColorScheme_isDark_iPhone8_portrait.1.jpg and /dev/null differ
diff --git a/SnapshotTests/Snapshots/__Snapshots__/SignInComponentTests/test_ColorScheme_isDark_iPhoneSE2_portrait.1.jpg b/SnapshotTests/Snapshots/__Snapshots__/SignInComponentTests/test_ColorScheme_isDark_iPhoneSE2_portrait.1.jpg
deleted file mode 100644
index 8713a55..0000000
Binary files a/SnapshotTests/Snapshots/__Snapshots__/SignInComponentTests/test_ColorScheme_isDark_iPhoneSE2_portrait.1.jpg and /dev/null differ
diff --git a/SnapshotTests/Snapshots/__Snapshots__/SignInComponentTests/test_TextFields_areEmpty.1.png b/SnapshotTests/Snapshots/__Snapshots__/SignInComponentTests/test_TextFields_areEmpty.1.png
deleted file mode 100644
index 6a7f140..0000000
Binary files a/SnapshotTests/Snapshots/__Snapshots__/SignInComponentTests/test_TextFields_areEmpty.1.png and /dev/null differ
diff --git a/SnapshotTests/Snapshots/__Snapshots__/SignInComponentTests/test_TextFields_areEmpty_iPhone13Mini_portrait.1.jpg b/SnapshotTests/Snapshots/__Snapshots__/SignInComponentTests/test_TextFields_areEmpty_iPhone13Mini_portrait.1.jpg
deleted file mode 100644
index 1cf4209..0000000
Binary files a/SnapshotTests/Snapshots/__Snapshots__/SignInComponentTests/test_TextFields_areEmpty_iPhone13Mini_portrait.1.jpg and /dev/null differ
diff --git a/SnapshotTests/Snapshots/__Snapshots__/SignInComponentTests/test_TextFields_areEmpty_iPhone13_portrait.1.jpg b/SnapshotTests/Snapshots/__Snapshots__/SignInComponentTests/test_TextFields_areEmpty_iPhone13_portrait.1.jpg
deleted file mode 100644
index db56f40..0000000
Binary files a/SnapshotTests/Snapshots/__Snapshots__/SignInComponentTests/test_TextFields_areEmpty_iPhone13_portrait.1.jpg and /dev/null differ
diff --git a/SnapshotTests/Snapshots/__Snapshots__/SignInComponentTests/test_TextFields_areEmpty_iPhone8Plus_portrait.1.jpg b/SnapshotTests/Snapshots/__Snapshots__/SignInComponentTests/test_TextFields_areEmpty_iPhone8Plus_portrait.1.jpg
deleted file mode 100644
index 44bba7d..0000000
Binary files a/SnapshotTests/Snapshots/__Snapshots__/SignInComponentTests/test_TextFields_areEmpty_iPhone8Plus_portrait.1.jpg and /dev/null differ
diff --git a/SnapshotTests/Snapshots/__Snapshots__/SignInComponentTests/test_TextFields_areEmpty_iPhone8_portrait.1.jpg b/SnapshotTests/Snapshots/__Snapshots__/SignInComponentTests/test_TextFields_areEmpty_iPhone8_portrait.1.jpg
deleted file mode 100644
index df64f8e..0000000
Binary files a/SnapshotTests/Snapshots/__Snapshots__/SignInComponentTests/test_TextFields_areEmpty_iPhone8_portrait.1.jpg and /dev/null differ
diff --git a/SnapshotTests/Snapshots/__Snapshots__/SignInComponentTests/test_TextFields_areEmpty_iPhoneSE2_portrait.1.jpg b/SnapshotTests/Snapshots/__Snapshots__/SignInComponentTests/test_TextFields_areEmpty_iPhoneSE2_portrait.1.jpg
deleted file mode 100644
index df64f8e..0000000
Binary files a/SnapshotTests/Snapshots/__Snapshots__/SignInComponentTests/test_TextFields_areEmpty_iPhoneSE2_portrait.1.jpg and /dev/null differ
diff --git a/SnapshotTests/Snapshots/__Snapshots__/SignInComponentTests/test_TextFields_areFilled.1.png b/SnapshotTests/Snapshots/__Snapshots__/SignInComponentTests/test_TextFields_areFilled.1.png
deleted file mode 100644
index 6606e96..0000000
Binary files a/SnapshotTests/Snapshots/__Snapshots__/SignInComponentTests/test_TextFields_areFilled.1.png and /dev/null differ
diff --git a/SnapshotTests/Snapshots/__Snapshots__/SignInComponentTests/test_TextFields_areFilled_iPhone13Mini_portrait.1.jpg b/SnapshotTests/Snapshots/__Snapshots__/SignInComponentTests/test_TextFields_areFilled_iPhone13Mini_portrait.1.jpg
deleted file mode 100644
index a7d992b..0000000
Binary files a/SnapshotTests/Snapshots/__Snapshots__/SignInComponentTests/test_TextFields_areFilled_iPhone13Mini_portrait.1.jpg and /dev/null differ
diff --git a/SnapshotTests/Snapshots/__Snapshots__/SignInComponentTests/test_TextFields_areFilled_iPhone13_portrait.1.jpg b/SnapshotTests/Snapshots/__Snapshots__/SignInComponentTests/test_TextFields_areFilled_iPhone13_portrait.1.jpg
deleted file mode 100644
index 4772377..0000000
Binary files a/SnapshotTests/Snapshots/__Snapshots__/SignInComponentTests/test_TextFields_areFilled_iPhone13_portrait.1.jpg and /dev/null differ
diff --git a/SnapshotTests/Snapshots/__Snapshots__/SignInComponentTests/test_TextFields_areFilled_iPhone8Plus_portrait.1.jpg b/SnapshotTests/Snapshots/__Snapshots__/SignInComponentTests/test_TextFields_areFilled_iPhone8Plus_portrait.1.jpg
deleted file mode 100644
index 8a0fd42..0000000
Binary files a/SnapshotTests/Snapshots/__Snapshots__/SignInComponentTests/test_TextFields_areFilled_iPhone8Plus_portrait.1.jpg and /dev/null differ
diff --git a/SnapshotTests/Snapshots/__Snapshots__/SignInComponentTests/test_TextFields_areFilled_iPhone8_portrait.1.jpg b/SnapshotTests/Snapshots/__Snapshots__/SignInComponentTests/test_TextFields_areFilled_iPhone8_portrait.1.jpg
deleted file mode 100644
index 33d689e..0000000
Binary files a/SnapshotTests/Snapshots/__Snapshots__/SignInComponentTests/test_TextFields_areFilled_iPhone8_portrait.1.jpg and /dev/null differ
diff --git a/SnapshotTests/Snapshots/__Snapshots__/SignInComponentTests/test_TextFields_areFilled_iPhoneSE2_portrait.1.jpg b/SnapshotTests/Snapshots/__Snapshots__/SignInComponentTests/test_TextFields_areFilled_iPhoneSE2_portrait.1.jpg
deleted file mode 100644
index 33d689e..0000000
Binary files a/SnapshotTests/Snapshots/__Snapshots__/SignInComponentTests/test_TextFields_areFilled_iPhoneSE2_portrait.1.jpg and /dev/null differ
diff --git a/Tuist.swift b/Tuist.swift
new file mode 100644
index 0000000..8c40471
--- /dev/null
+++ b/Tuist.swift
@@ -0,0 +1,3 @@
+import ProjectDescription
+
+let tuist = Tuist(project: .tuist())
diff --git a/Flick.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/Tuist/Package.resolved
similarity index 99%
rename from Flick.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved
rename to Tuist/Package.resolved
index c20761e..d18fb41 100644
--- a/Flick.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved
+++ b/Tuist/Package.resolved
@@ -93,7 +93,7 @@
{
"identity" : "swiftfoundation",
"kind" : "remoteSourceControl",
- "location" : "https://github.com/Maks-Jago/SwiftFoundation.git",
+ "location" : "https://github.com/Maks-Jago/SwiftFoundation",
"state" : {
"revision" : "b03db4a15a9f77c78f69b02fb8c5469c477be31b",
"version" : "0.4.1"
diff --git a/Tuist/Package.swift b/Tuist/Package.swift
new file mode 100644
index 0000000..1abb576
--- /dev/null
+++ b/Tuist/Package.swift
@@ -0,0 +1,32 @@
+// swift-tools-version: 5.9
+import PackageDescription
+
+#if TUIST
+ import ProjectDescription
+
+ let packageSettings = PackageSettings(
+ productTypes: [
+ "FlagKit": .framework,
+ "SDWebImageSwiftUI": .framework,
+ "SDWebImage": .framework,
+ "UDF": .framework,
+ "SwiftFoundation": .framework,
+ "SwiftUI-Kit": .framework,
+ "RswiftLibrary": .framework,
+ "SwiftUISnapshotTestCase": .staticFramework,
+ ]
+ )
+#endif // TUIST
+
+let package = Package(
+ name: "Flick",
+ dependencies: [
+ .package(url: "https://github.com/madebybowtie/FlagKit", .upToNextMajor(from: "2.0.0")),
+ .package(url: "https://github.com/SDWebImage/SDWebImageSwiftUI", .upToNextMajor(from: "3.1.3")),
+ .package(url: "https://github.com/Maks-Jago/swiftui-snapshot-test-case", .upToNextMajor(from: "1.6.2")),
+ .package(url: "https://github.com/Maks-Jago/SwiftUI-UDF", .upToNextMajor(from: "1.5.1-rc.1")),
+ .package(url: "https://github.com/Maks-Jago/SwiftFoundation", .upToNextMajor(from: "0.4.1")),
+ .package(url: "https://github.com/Maks-Jago/SwiftUIKit", .upToNextMajor(from: "0.6.5")),
+ .package(url: "https://github.com/mac-cain13/R.swift.git", .upToNextMajor(from: "7.0.0"))
+ ]
+)
diff --git a/Tuist/ProjectDescriptionHelpers/Project+Templates.swift b/Tuist/ProjectDescriptionHelpers/Project+Templates.swift
new file mode 100644
index 0000000..1df6801
--- /dev/null
+++ b/Tuist/ProjectDescriptionHelpers/Project+Templates.swift
@@ -0,0 +1,192 @@
+import ProjectDescription
+
+let uiPath = "UI"
+let corePath = "Core"
+let appPath = "Flick"
+let reverseOrganizationName = "com.urlaunched"
+let infoPlistPath: Path = "Info.plist"
+
+public enum ModuleType {
+ case core
+ case ui
+ case app
+
+ func path() -> String {
+ switch self {
+ case .core:
+ return corePath
+ case .ui:
+ return uiPath
+ case .app:
+ return appPath
+ }
+ }
+}
+
+public enum FeatureTarget {
+ case framework
+ case snapshotTests
+}
+
+public struct Module {
+ let name: String
+ let path: String
+ let frameworkDependancies: [TargetDependency]
+ let frameworkResources: [String]
+ let snapshotDependencies: [TargetDependency]
+ let moduleType: ModuleType
+ let frameworkScripts: [TargetScript]
+ let targets: Set
+
+ public init(
+ name: String,
+ moduleType: ModuleType,
+ path: String,
+ frameworkDependancies: [TargetDependency],
+ frameworkResources: [String],
+ snapshotDependencies: [TargetDependency] = [],
+ frameworkScripts: [TargetScript] = [],
+ targets: Set = Set(arrayLiteral: .framework)
+ ) {
+ self.name = name
+ self.path = path
+ self.moduleType = moduleType
+ self.frameworkDependancies = frameworkDependancies
+ self.frameworkResources = frameworkResources
+ self.snapshotDependencies = snapshotDependencies
+ self.frameworkScripts = frameworkScripts
+ self.targets = targets
+ }
+}
+
+extension Project {
+ public static func app(
+ name: String,
+ organizationName: String,
+ packages: [Package] = [],
+ settings: Settings? = nil,
+ appSettings: Settings? = nil,
+ dependencies: [TargetDependency] = [],
+ targetDependancies: [TargetDependency] = [],
+ moduleTargets: [Module],
+ ) -> Project {
+ let organizationName = organizationName
+ var targets = [Target]()
+ var dependencies = moduleTargets.map { TargetDependency.target(name: $0.name) }
+ dependencies.append(contentsOf: targetDependancies)
+
+ let appTargets = makeAppTargets(
+ name: name,
+ dependencies: dependencies,
+ settings: appSettings
+ )
+ targets.append(contentsOf: appTargets)
+
+ targets += moduleTargets.flatMap({ makeFrameworkTargets(module: $0) })
+
+
+ return Project(
+ name: name,
+ organizationName: organizationName,
+ packages: packages,
+ settings: settings,
+ targets: targets
+ )
+ }
+
+ public static func makeFrameworkTargets(module: Module) -> [Target] {
+ var targets = [Target]()
+ let frameworkPath = "\(module.moduleType.path())/\(module.path)"
+ let frameworkResourceFilePaths = module.frameworkResources.map {
+ ResourceFileElement.glob(pattern: Path(stringLiteral: "\(module.moduleType.path())/\(module.path)/" + $0), tags: [])
+ }
+
+ if module.targets.contains(.framework) {
+ let frameworkTarget = Target.target(
+ name: module.name,
+ destinations: .iOS,
+ product: .framework,
+ bundleId: "\(reverseOrganizationName).\(module.name)",
+ infoPlist: .default,
+ sources: [
+ "\(frameworkPath)/Sources/**",
+ ],
+ resources: .resources(frameworkResourceFilePaths),
+ scripts: module.frameworkScripts,
+ dependencies: module.frameworkDependancies,
+ )
+
+ targets.append(frameworkTarget)
+ }
+
+ if module.targets.contains(.snapshotTests) {
+ let settings: Settings = .settings(
+ configurations: [
+ .debug(name: "Debug", xcconfig: "./xcconfigs/SnapshotTests.xcconfig"),
+ .release(name: "Release", xcconfig: "./xcconfigs/SnapshotTests.xcconfig"),
+ ]
+ )
+ let hostAppName = "\(module.name)SnapshotTestsHostApp"
+ let appTarget = Target.target(
+ name: hostAppName,
+ destinations: .iOS,
+ product: .app,
+ bundleId: "\(reverseOrganizationName).\(module.name).app",
+ infoPlist: .extendingDefault(with: [
+ "UIMainStoryboardFile": "",
+ "UILaunchStoryboardName": "LaunchScreen"
+ ]),
+ sources: ["\(frameworkPath)/Sources/**"],
+ resources: .resources(frameworkResourceFilePaths),
+ dependencies: module.frameworkDependancies,
+ )
+
+ let snapshotTarget = Target.target(
+ name: "\(module.name)SnapshotTests",
+ destinations: .iOS,
+ product: .unitTests,
+ bundleId: "\(reverseOrganizationName).\(module.name)SnapshotTests",
+ infoPlist: .default,
+ sources: [
+ "\(frameworkPath)/Snapshots/**",
+ "SnapshotTest/**"
+ ],
+ resources: ["\(frameworkPath)/Snapshots/__Snapshots__/**"],
+ dependencies: module.snapshotDependencies + [
+ .target(name: hostAppName),
+ .sdk(name: "XCTest", type: .framework, status: .required)
+ ],
+ settings: settings
+ )
+
+ targets.append(appTarget)
+ targets.append(snapshotTarget)
+ }
+
+ return targets
+ }
+
+
+ public static func makeAppTargets(
+ name: String,
+ dependencies: [TargetDependency],
+ settings: Settings? = nil
+ ) -> [Target] {
+ var targets = [Target]()
+
+ let mainTarget = Target.target(
+ name: name,
+ destinations: .iOS,
+ product: .app,
+ bundleId: "\(reverseOrganizationName).\(name)",
+ infoPlist: .file(path: infoPlistPath),
+ sources: ["\(appPath)/Sources/**"],
+ resources: ["\(appPath)/Resources/**"],
+ dependencies: dependencies,
+ settings: settings,
+ )
+
+ targets.append(mainTarget)
+ return targets
+ }
+}
diff --git a/UI/CastComponent/Sources/CastComponent.swift b/UI/CastComponent/Sources/CastComponent.swift
new file mode 100644
index 0000000..6ffe3b2
--- /dev/null
+++ b/UI/CastComponent/Sources/CastComponent.swift
@@ -0,0 +1,100 @@
+//
+// CastComponent.swift
+// Flick
+//
+// Created by Alexander Sharko on 20.01.2023.
+// Copyright © 2023 urlaunched.com. All rights reserved.
+//
+
+import DesignSystem
+import Localizations
+import SwiftUI
+import UDF
+import Models
+import UIKit
+import Common
+import CustomViews
+
+public struct CastComponent: Component where R.Route == CastRoute {
+ public struct Props {
+ var cast: [Cast.ID]
+ var castById: (Cast.ID) -> Cast
+ var dialogStatus: Binding
+ var router: R = .init()
+ var destinationBuilder: DestinationBuilder = .init()
+
+ public init(
+ cast: [Cast.ID],
+ castById: @escaping (Cast.ID) -> Cast,
+ dialogStatus: Binding,
+ router: R = .init(),
+ destinationBuilder: DestinationBuilder = .init()
+ ) {
+ self.cast = cast
+ self.castById = castById
+ self.dialogStatus = dialogStatus
+ self.router = router
+ self.destinationBuilder = destinationBuilder
+ }
+ }
+
+ public var props: Props
+
+ let columns: [GridItem] = [GridItem(.flexible(), spacing: 16, alignment: .top),
+ GridItem(.flexible(), spacing: 16, alignment: .top),
+ GridItem(.flexible(), alignment: .top)]
+
+ public init(props: Props) {
+ self.props = props
+ }
+
+ public var body: some View {
+ GeometryReader { geometry in
+ ScrollView {
+ LazyVGrid(columns: columns, spacing: 0) {
+ let width = abs(geometry.size.width - 64) / 3
+ let height = width * 1.25
+ ForEach(props.cast, id: \.value) { id in
+ let cast = props.castById(id)
+ let size = CGSize(
+ width: width,
+ height: height
+ )
+ CastCardView(
+ cast: cast,
+ size: size,
+ imageView: {
+ props.destinationBuilder.view(
+ for: .imageContainer(
+ path: cast.profilePath,
+ size: size,
+ type: .profile
+ )
+ )
+ }
+ )
+ .padding(.bottom)
+ }
+ }
+ .padding(.horizontal)
+ .padding(.top)
+ }
+ }
+ .background(Color.flMain.edgesIgnoringSafeArea(.all))
+ .customNavigationTitle(Localization.itemDetailsCastNavigationTitle())
+ .dialog(status: props.dialogStatus)
+ }
+}
+
+// MARK: - Preview
+
+#Preview {
+ CastComponent(
+ props: .init(
+ cast: [],
+ castById: { _ in .fakeItem() },
+ dialogStatus: .constant(.dismissed),
+ router: MockRouter()
+ )
+ )
+}
diff --git a/UI/CastComponent/Sources/CastContent.swift b/UI/CastComponent/Sources/CastContent.swift
new file mode 100644
index 0000000..77745b5
--- /dev/null
+++ b/UI/CastComponent/Sources/CastContent.swift
@@ -0,0 +1,14 @@
+//
+// CastContent.swift
+// Flick
+//
+// Created by Bogdan Petkanych on 18.05.2026.
+// Copyright © 2026 urlaunched. All rights reserved.
+//
+
+import Common
+import UIKit
+
+public enum CastContent: Hashable {
+ case imageContainer(path: String?, size: CGSize, type: ImageType = .profile)
+}
diff --git a/UI/CastComponent/Sources/CastRoute.swift b/UI/CastComponent/Sources/CastRoute.swift
new file mode 100644
index 0000000..45534ad
--- /dev/null
+++ b/UI/CastComponent/Sources/CastRoute.swift
@@ -0,0 +1,16 @@
+//
+// CastRoute.swift
+// Flick
+//
+// Created by Alexander Sharko on 20.01.2023.
+// Copyright © 2023 urlaunched.com. All rights reserved.
+//
+
+import SwiftUI
+import UDF
+import Models
+
+
+public enum CastRoute: Hashable {
+ case cast([Cast.ID])
+}
diff --git a/UI/HomeComponent/Sources/HomeComponent.swift b/UI/HomeComponent/Sources/HomeComponent.swift
new file mode 100644
index 0000000..a6421a0
--- /dev/null
+++ b/UI/HomeComponent/Sources/HomeComponent.swift
@@ -0,0 +1,144 @@
+//
+// HomeComponent.swift
+// Flick
+//
+// Created by Alexander Sharko on 30.11.2022.
+// Copyright © 2022 urlaunched.com. All rights reserved.
+//
+
+import Localizations
+import SwiftUI
+import UDF
+import Models
+import Common
+import CustomViews
+
+public struct HomeComponent: Component {
+ public struct Props {
+ var contentType: Binding
+ var movieSections: [MovieSection]
+ var showSections: [ShowSection]
+ var moviesForSection: (MovieSection) -> [Movie]
+ var showsForSection: (ShowSection) -> [Show]
+ var isMoviesRedacted: (MovieSection) -> Bool
+ var isShowsRedacted: (ShowSection) -> Bool
+ var dialogStatus: Binding
+ var destinationBuilder: DestinationBuilder = .init()
+
+ public init(
+ contentType: Binding,
+ movieSections: [MovieSection],
+ showSections: [ShowSection],
+ moviesForSection: @escaping (MovieSection) -> [Movie],
+ showsForSection: @escaping (ShowSection) -> [Show],
+ isMoviesRedacted: @escaping (MovieSection) -> Bool,
+ isShowsRedacted: @escaping (ShowSection) -> Bool,
+ dialogStatus: Binding,
+ destinationBuilder: DestinationBuilder = .init()
+ ) {
+ self.contentType = contentType
+ self.movieSections = movieSections
+ self.showSections = showSections
+ self.moviesForSection = moviesForSection
+ self.showsForSection = showsForSection
+ self.isMoviesRedacted = isMoviesRedacted
+ self.isShowsRedacted = isShowsRedacted
+ self.dialogStatus = dialogStatus
+ self.destinationBuilder = destinationBuilder
+ }
+ }
+
+ public var props: Props
+
+ public init(props: Props) {
+ self.props = props
+ }
+
+ public var body: some View {
+ ScrollView {
+ VStack(spacing: 8) {
+ ContentToggle(contentType: props.contentType)
+
+ switch props.contentType.wrappedValue {
+ case .movie:
+ movieSectionsView
+ case .show:
+ showSectionsView
+ }
+ }
+ .padding(.bottom)
+ }
+ .navigationBarTitleDisplayMode(.inline)
+ .customNavigationTitle(Localization.homeNavigationTitle())
+ }
+}
+
+extension HomeComponent {
+ var movieSectionsView: some View {
+ ForEach(MovieSection.allCases, id: \.self) { (movieSection: MovieSection) in
+ let isRedacted = props.isMoviesRedacted(movieSection)
+ Group {
+ if movieSection == MovieSection.popular {
+ props.destinationBuilder.view(
+ for: .mainHomeSection(
+ section: movieSection,
+ retrieveItems: { props.moviesForSection(movieSection) }
+ )
+ )
+ } else {
+ props.destinationBuilder.view(
+ for: .homeSection(
+ section: movieSection,
+ retrieveItems: { props.moviesForSection(movieSection) }
+ )
+ )
+ }
+ }
+ .isRedacted(isRedacted)
+ .disabled(isRedacted)
+ }
+ }
+
+ var showSectionsView: some View {
+ ForEach(ShowSection.allCases, id: \.self) { (showSection: ShowSection) in
+ let isRedacted = props.isShowsRedacted(showSection)
+ Group {
+ if showSection == ShowSection.popular {
+ props.destinationBuilder.view(
+ for: .mainHomeSection(
+ section: showSection,
+ retrieveItems: { props.showsForSection(showSection) }
+ )
+ )
+ } else {
+ props.destinationBuilder.view(
+ for: .homeSection(
+ section: showSection,
+ retrieveItems: { props.showsForSection(showSection) }
+ )
+ )
+ }
+ }
+ .isRedacted(isRedacted)
+ .disabled(isRedacted)
+ }
+ .dialog(status: props.dialogStatus)
+ }
+}
+
+// MARK: - Preview
+
+#Preview {
+ HomeComponent(
+ props: .init(
+ contentType: .constant(.movie),
+ movieSections: [],
+ showSections: [],
+ moviesForSection: { _ in Movie.fakeItems() },
+ showsForSection: { _ in Show.fakeItems() },
+ isMoviesRedacted: { _ in false },
+ isShowsRedacted: { _ in false },
+ dialogStatus: .constant(.dismissed)
+ )
+ )
+}
diff --git a/UI/HomeComponent/Sources/HomeContent.swift b/UI/HomeComponent/Sources/HomeContent.swift
new file mode 100644
index 0000000..725167d
--- /dev/null
+++ b/UI/HomeComponent/Sources/HomeContent.swift
@@ -0,0 +1,22 @@
+//
+// HomeContent.swift
+// Flick
+//
+// Created by Bogdan Petkanych on 17.05.2026.
+// Copyright © 2026 urlaunched. All rights reserved.
+//
+
+import Models
+import UDF
+
+public enum HomeContent {
+ case mainHomeSection(
+ section: any Models.Section,
+ retrieveItems: () -> [any Item]
+ )
+
+ case homeSection(
+ section: any Models.Section,
+ retrieveItems: () -> [any Item]
+ )
+}
diff --git a/UI/HomeSectionComponent/Sources/HomeContent.swift b/UI/HomeSectionComponent/Sources/HomeContent.swift
new file mode 100644
index 0000000..38156c3
--- /dev/null
+++ b/UI/HomeSectionComponent/Sources/HomeContent.swift
@@ -0,0 +1,14 @@
+//
+// MainHomeContent.swift
+// Flick
+//
+// Created by Bogdan Petkanych on 17.05.2026.
+// Copyright © 2026 urlaunched. All rights reserved.
+//
+
+import Common
+import UIKit
+
+public enum HomeContent: Hashable {
+ case imageContainer(path: String?, size: CGSize, type: ImageType = .poster)
+}
diff --git a/UI/HomeSectionComponent/Sources/HomeSectionComponent.swift b/UI/HomeSectionComponent/Sources/HomeSectionComponent.swift
new file mode 100644
index 0000000..8b28521
--- /dev/null
+++ b/UI/HomeSectionComponent/Sources/HomeSectionComponent.swift
@@ -0,0 +1,96 @@
+//
+// HomeSectionComponent.swift
+// Flick
+//
+// Created by Alexander Sharko on 30.11.2022.
+// Copyright © 2022 urlaunched.com. All rights reserved.
+//
+
+import DesignSystem
+import SwiftUI
+import UDF
+import Common
+import CustomViews
+import Models
+
+public struct HomeSectionComponent: Component where R.Route == HomeSectionRoute {
+ public struct Props {
+ var section: S
+ var items: [any Item]
+ var genreById: (Genre.ID) -> Genre?
+ var router: R = .init()
+ var destinationBuilder: DestinationBuilder = .init()
+
+ public init(
+ section: S,
+ items: [any Item],
+ genreById: @escaping (Genre.ID) -> Genre?,
+ router: R = .init(),
+ destinationBuilder: DestinationBuilder = .init()
+ ) {
+ self.section = section
+ self.items = items
+ self.genreById = genreById
+ self.router = router
+ self.destinationBuilder = destinationBuilder
+ }
+ }
+
+ public var props: Props
+
+ @Environment(\.globalRouter) private var globalRouter
+
+ public init(props: Props) {
+ self.props = props
+ }
+
+ public var body: some View {
+ VStack(spacing: 24) {
+ SectionHeaderView(
+ title: props.section.title,
+ seeAllAction: {
+ globalRouter.navigate(for: R.self, to: .sectionDetails(props.section))
+ }
+ )
+
+ ScrollView(.horizontal, showsIndicators: false) {
+ LazyHStack(alignment: .top, spacing: 16) {
+ ForEach(props.items.indices, id: \.self) { index in
+ let item = props.items[index]
+ HomeCardView(
+ item: item,
+ genres: item.genres(action: props.genreById),
+ imageView: props.destinationBuilder.view(
+ for: .imageContainer(
+ path: item.posterPath,
+ size: ItemSizeStyle.default.coverSize,
+ type: .poster
+ )
+ )
+ )
+ .padding(.leading, index == props.items.indices.first ? 16 : 0)
+ .padding(.trailing, index == props.items.indices.last ? 16 : 0)
+ .embedInPlainButton {
+ globalRouter.navigate(for: R.self, to: .itemDetails(item))
+ }
+ .buttonStyle(.scaled)
+ }
+ }
+ }
+ }
+ .frame(height: 340, alignment: .top)
+ }
+}
+
+// MARK: - Preview
+
+#Preview {
+ HomeSectionComponent(
+ props: .init(
+ section: MovieSection.nowPlaying,
+ items: [],
+ genreById: { _ in .fakeItem() },
+ router: MockRouter()
+ )
+ )
+}
diff --git a/UI/HomeSectionComponent/Sources/MainHomeSectionRoute.swift b/UI/HomeSectionComponent/Sources/MainHomeSectionRoute.swift
new file mode 100644
index 0000000..64c1b38
--- /dev/null
+++ b/UI/HomeSectionComponent/Sources/MainHomeSectionRoute.swift
@@ -0,0 +1,37 @@
+//
+// HomeSectionRoute.swift
+// Flick
+//
+// Created by Valentin Petrulia on 27.02.2025.
+// Copyright © 2025 urlaunched.com. All rights reserved.
+//
+
+import SwiftUI
+import UDF
+import Models
+import Common
+
+public enum HomeSectionRoute: Hashable {
+ case itemDetails(any Item)
+ case sectionDetails(any Models.Section)
+
+ public func hash(into hasher: inout Hasher) {
+ switch self {
+ case let .itemDetails(item):
+ hasher.combine(item)
+ case let .sectionDetails(section):
+ hasher.combine(section)
+ }
+ }
+
+ public static func == (lhs: Self, rhs: Self) -> Bool {
+ switch (lhs, rhs) {
+ case let (.itemDetails(lhsItem), .itemDetails(rhsItem)):
+ areEqual(lhsItem, rhsItem)
+ case let (.sectionDetails(lhsSection), .sectionDetails(rhsSection)):
+ areEqual(lhsSection, rhsSection)
+ default:
+ false
+ }
+ }
+}
diff --git a/Flick/Code/Modules/Image/View/ImageComponent.swift b/UI/ImageComponent/Sources/ImageComponent.swift
similarity index 61%
rename from Flick/Code/Modules/Image/View/ImageComponent.swift
rename to UI/ImageComponent/Sources/ImageComponent.swift
index 97602ec..192cb9e 100644
--- a/Flick/Code/Modules/Image/View/ImageComponent.swift
+++ b/UI/ImageComponent/Sources/ImageComponent.swift
@@ -9,17 +9,29 @@
import SDWebImageSwiftUI
import SwiftUI
import UDF
+import SwiftUI_Kit
+import DesignSystem
-struct ImageComponent: Component {
- struct Props {
+public struct ImageComponent: Component {
+ public struct Props {
var size: CGSize
var url: URL?
var isLoaderPresented: Bool
+
+ public init(size: CGSize, url: URL? = nil, isLoaderPresented: Bool) {
+ self.size = size
+ self.url = url
+ self.isLoaderPresented = isLoaderPresented
+ }
}
- var props: Props
+ public var props: Props
+
+ public init(props: Props) {
+ self.props = props
+ }
- var body: some View {
+ public var body: some View {
WebImage(url: props.url)
.resizable()
.renderingMode(.original)
diff --git a/UI/ItemDetailsCastComponent/Sources/ItemDetailsCastComponent.swift b/UI/ItemDetailsCastComponent/Sources/ItemDetailsCastComponent.swift
new file mode 100644
index 0000000..06a31ba
--- /dev/null
+++ b/UI/ItemDetailsCastComponent/Sources/ItemDetailsCastComponent.swift
@@ -0,0 +1,107 @@
+//
+// ItemDetailsCastComponent.swift
+// Flick
+//
+// Created by Alexander Sharko on 19.01.2023.
+// Copyright © 2023 urlaunched.com. All rights reserved.
+//
+
+import DesignSystem
+import Localizations
+import SwiftUI
+import UDF
+import Models
+import CustomViews
+import Common
+
+public struct ItemDetailsCastComponent: Component where R.Route == ItemDetailsCastRoute {
+ public struct Props {
+ var cast: [Cast.ID]
+ var castById: (Cast.ID) -> Cast
+ var isRedacted: Bool
+ var router: R = .init()
+ var destinationBuilder: DestinationBuilder = .init()
+
+ public init(
+ cast: [Cast.ID],
+ castById: @escaping (Cast.ID) -> Cast,
+ isRedacted: Bool,
+ router: R = .init(),
+ destinationBuilder: DestinationBuilder = .init()
+ ) {
+ self.cast = cast
+ self.castById = castById
+ self.isRedacted = isRedacted
+ self.router = router
+ self.destinationBuilder = destinationBuilder
+ }
+ }
+
+ public var props: Props
+
+ public init(props: Props) {
+ self.props = props
+ }
+
+ @Environment(\.width) private var componentWidth
+ @Environment(\.globalRouter) private var globalRouter
+
+ public var body: some View {
+ if props.cast.isNotEmpty {
+ VStack(alignment: .leading, spacing: 21) {
+ SectionHeaderView(
+ title: Localization.itemDetailsCastSectionTitle(),
+ seeAllAction: {
+ globalRouter.navigate(for: R.self, to: .cast(props.cast))
+ }
+ )
+
+ ScrollView(.horizontal) {
+ HStack(alignment: .top, spacing: 16) {
+ let width = abs(componentWidth - 64) / 3
+ let height = width * 1.25
+ let size = CGSize(
+ width: width,
+ height: height
+ )
+ ForEach(props.cast, id: \.self) { id in
+ let cast = props.castById(id)
+ CastCardView(
+ cast: props.castById(id),
+ size: size,
+ imageView: {
+ props.destinationBuilder.view(
+ for: .imageContainer(
+ path: cast.profilePath,
+ size: size,
+ type: .profile
+ )
+ )
+ },
+ lineLimit: 1,
+ )
+ .frame(width: width)
+ }
+ }
+ .padding(.horizontal)
+ }
+ .scrollIndicators(.hidden)
+ }
+ .isRedacted(props.isRedacted)
+ .disabled(props.isRedacted)
+ }
+ }
+}
+
+// MARK: - Preview
+
+#Preview {
+ ItemDetailsCastComponent(
+ props: .init(
+ cast: [],
+ castById: { _ in .fakeItem() },
+ isRedacted: false,
+ router: MockRouter()
+ )
+ )
+}
diff --git a/UI/ItemDetailsCastComponent/Sources/ItemDetailsCastContent.swift b/UI/ItemDetailsCastComponent/Sources/ItemDetailsCastContent.swift
new file mode 100644
index 0000000..3b95d08
--- /dev/null
+++ b/UI/ItemDetailsCastComponent/Sources/ItemDetailsCastContent.swift
@@ -0,0 +1,14 @@
+//
+// CastContent.swift
+// Flick
+//
+// Created by Bogdan Petkanych on 18.05.2026.
+// Copyright © 2026 urlaunched. All rights reserved.
+//
+
+import Common
+import UIKit
+
+public enum ItemDetailsCastContent: Hashable {
+ case imageContainer(path: String?, size: CGSize, type: ImageType = .profile)
+}
diff --git a/UI/ItemDetailsCastComponent/Sources/ItemDetailsCastRoute.swift b/UI/ItemDetailsCastComponent/Sources/ItemDetailsCastRoute.swift
new file mode 100644
index 0000000..5b9e988
--- /dev/null
+++ b/UI/ItemDetailsCastComponent/Sources/ItemDetailsCastRoute.swift
@@ -0,0 +1,15 @@
+//
+// ItemDetailsCastRoute.swift
+// Flick
+//
+// Created by Alexander Sharko on 20.01.2023.
+// Copyright © 2023 urlaunched.com. All rights reserved.
+//
+
+import SwiftUI
+import UDF
+import Models
+
+public enum ItemDetailsCastRoute: Hashable {
+ case cast([Cast.ID])
+}
diff --git a/Flick/Code/Modules/ItemDetails/View/ItemDetailsComponent.swift b/UI/ItemDetailsComponent/Sources/ItemDetailsComponent.swift
similarity index 86%
rename from Flick/Code/Modules/ItemDetails/View/ItemDetailsComponent.swift
rename to UI/ItemDetailsComponent/Sources/ItemDetailsComponent.swift
index eb03bfb..138ebb8 100644
--- a/Flick/Code/Modules/ItemDetails/View/ItemDetailsComponent.swift
+++ b/UI/ItemDetailsComponent/Sources/ItemDetailsComponent.swift
@@ -11,28 +11,52 @@ import Localizations
import SwiftUI
import SwiftUI_Kit
import UDF
+import Models
+import Common
+import CustomViews
-struct ItemDetailsComponent: Component {
- struct Props {
+public struct ItemDetailsComponent: Component where R.Route == ItemDetailsRoute {
+ public struct Props {
var item: any Item
var genreById: (Genre.ID) -> Genre?
var dialog: Binding
- var router: Router = .init()
+ var router: R = .init()
+ var destinationBuilder: DestinationBuilder = .init()
+
+ public init(
+ item: any Item,
+ genreById: @escaping (Genre.ID) -> Genre?,
+ dialog: Binding,
+ router: R = .init(),
+ destinationBuilder: DestinationBuilder = .init()
+ ) {
+ self.item = item
+ self.genreById = genreById
+ self.dialog = dialog
+ self.router = router
+ self.destinationBuilder = destinationBuilder
+ }
}
- var props: Props
+ public var props: Props
@State private var imageScale: CGFloat = 1
+
+ public init(props: Props) {
+ self.props = props
+ }
@Environment(\.globalRouter) private var globalRouter
- var body: some View {
+ public var body: some View {
GeometryReader { geometry in
ScrollView {
ZStack(alignment: .top) {
let imageHeight = geometry.size.height * 0.7
- ImageContainer(
- size: .init(width: geometry.size.width, height: imageHeight),
- path: props.item.posterPath
+ props.destinationBuilder.view(
+ for: .imageContainer(
+ path: props.item.posterPath,
+ size: .init(width: geometry.size.width, height: imageHeight),
+ )
)
.frame(width: geometry.size.width, height: imageHeight)
.clipped()
@@ -164,7 +188,7 @@ private extension ItemDetailsComponent {
.frame(maxWidth: .infinity)
.embedInPlainButton {
// TODO: - Add action later ???
- globalRouter.navigate(for: ItemDetailsRouting.self, to: .whereToWatch(props.item))
+ globalRouter.navigate(for: R.self, to: .whereToWatch(props.item))
}
.buttonStyle(PrimaryButtonStyle(fillColor: .flMainPink))
}
@@ -258,7 +282,7 @@ private extension ItemDetailsComponent {
// MARK: - Preview
#Preview {
- ItemDetailsComponent(
+ ItemDetailsComponent>(
props: .init(
item: Movie.fakeItem(),
genreById: { _ in .fakeItem() },
diff --git a/UI/ItemDetailsComponent/Sources/ItemDetailsContent.swift b/UI/ItemDetailsComponent/Sources/ItemDetailsContent.swift
new file mode 100644
index 0000000..f416d36
--- /dev/null
+++ b/UI/ItemDetailsComponent/Sources/ItemDetailsContent.swift
@@ -0,0 +1,14 @@
+//
+// ItemDetailsContent.swift
+// Flick
+//
+// Created by Bogdan Petkanych on 17.05.2026.
+// Copyright © 2026 urlaunched. All rights reserved.
+//
+
+import Common
+import UIKit
+
+public enum ItemDetailsContent: Hashable {
+ case imageContainer(path: String?, size: CGSize, type: ImageType = .poster)
+}
diff --git a/UI/ItemDetailsComponent/Sources/ItemDetailsRoute.swift b/UI/ItemDetailsComponent/Sources/ItemDetailsRoute.swift
new file mode 100644
index 0000000..0dc65ec
--- /dev/null
+++ b/UI/ItemDetailsComponent/Sources/ItemDetailsRoute.swift
@@ -0,0 +1,47 @@
+//
+// ItemDetailsRoute.swift
+// Flick
+//
+// Created by Alexander Sharko on 20.01.2023.
+// Copyright © 2023 urlaunched.com. All rights reserved.
+//
+
+import SwiftUI
+import UDF
+import Models
+import Common
+
+public enum ItemDetailsRoute: Hashable {
+ case cast(any Item)
+ case reviews(any Item)
+ case recommendations(any Item)
+ case whereToWatch(any Item)
+
+ public func hash(into hasher: inout Hasher) {
+ switch self {
+ case let .cast(item):
+ hasher.combine(item)
+ case let .reviews(item):
+ hasher.combine(item)
+ case let .recommendations(item):
+ hasher.combine(item)
+ case let .whereToWatch(item):
+ hasher.combine(item)
+ }
+ }
+
+ public static func == (lhs: Self, rhs: Self) -> Bool {
+ switch (lhs, rhs) {
+ case let (.cast(lhsItem), .cast(rhsItem)):
+ areEqual(lhsItem, rhsItem)
+ case let (.reviews(lhsItem), .reviews(rhsItem)):
+ areEqual(lhsItem, rhsItem)
+ case let (.recommendations(lhsItem), .recommendations(rhsItem)):
+ areEqual(lhsItem, rhsItem)
+ case let (.whereToWatch(lhsItem), .whereToWatch(rhsItem)):
+ areEqual(lhsItem, rhsItem)
+ default:
+ false
+ }
+ }
+}
diff --git a/Flick/Code/Modules/Recommendations/View/ItemDetailsRecommendations/ItemDetailsRecommendationsComponent.swift b/UI/ItemDetailsRecommendationsComponent/Sources/ItemDetailsRecommendationsComponent.swift
similarity index 52%
rename from Flick/Code/Modules/Recommendations/View/ItemDetailsRecommendations/ItemDetailsRecommendationsComponent.swift
rename to UI/ItemDetailsRecommendationsComponent/Sources/ItemDetailsRecommendationsComponent.swift
index dc23c25..2e1db3f 100644
--- a/Flick/Code/Modules/Recommendations/View/ItemDetailsRecommendations/ItemDetailsRecommendationsComponent.swift
+++ b/UI/ItemDetailsRecommendationsComponent/Sources/ItemDetailsRecommendationsComponent.swift
@@ -10,27 +10,51 @@ import DesignSystem
import Localizations
import SwiftUI
import UDF
+import Models
+import CustomViews
+import Common
-struct ItemDetailsRecommendationsComponent: Component {
- struct Props {
+public struct ItemDetailsRecommendationsComponent: Component where R.Route == ItemDetailsRecommendationsRoute {
+ public struct Props {
var item: any Item
var items: [any Item]
var isRedacted: Bool
var genreById: (Genre.ID) -> Genre?
- var router: Router = .init()
+ var router: R = .init()
+ var destinationBuilder: DestinationBuilder = .init()
+
+ public init(
+ item: any Item,
+ items: [any Item],
+ isRedacted: Bool,
+ genreById: @escaping (Genre.ID) -> Genre?,
+ router: R = .init(),
+ destinationBuilder: DestinationBuilder = .init()
+ ) {
+ self.item = item
+ self.items = items
+ self.isRedacted = isRedacted
+ self.genreById = genreById
+ self.router = router
+ self.destinationBuilder = destinationBuilder
+ }
}
- var props: Props
-
+ public var props: Props
+
@Environment(\.globalRouter) private var globalRouter
- var body: some View {
+ public init(props: Props) {
+ self.props = props
+ }
+
+ public var body: some View {
if !props.items.isEmpty {
VStack(alignment: .leading, spacing: 24) {
SectionHeaderView(
title: Localization.itemDetailsRecommendationsSectionTitle(),
seeAllAction: {
- globalRouter.navigate(for: ItemDetailsRecommendationsRouting.self, to: .recommendations(props.item))
+ globalRouter.navigate(for: R.self, to: .recommendations(props.item))
}
)
@@ -40,12 +64,19 @@ struct ItemDetailsRecommendationsComponent: Component {
let item = props.items[index]
HomeCardView(
item: item,
- genres: item.genres(action: props.genreById)
+ genres: item.genres(action: props.genreById),
+ imageView: props.destinationBuilder.view(
+ for: .imageContainer(
+ path: item.posterPath,
+ size: ItemSizeStyle.default.coverSize,
+ type: .poster
+ )
+ )
)
.padding(.leading, index == props.items.indices.first ? 16 : 0)
.padding(.trailing, index == props.items.indices.last ? 16 : 0)
.embedInPlainButton {
- globalRouter.navigate(for: ItemDetailsRecommendationsRouting.self, to: .itemDetails(item))
+ globalRouter.navigate(for: R.self, to: .itemDetails(item))
}
.buttonStyle(.scaled)
}
@@ -61,7 +92,7 @@ struct ItemDetailsRecommendationsComponent: Component {
// MARK: - Preview
#Preview {
- ItemDetailsRecommendationsComponent(
+ ItemDetailsRecommendationsComponent>(
props: .init(
item: Movie.fakeItem(),
items: [],
diff --git a/UI/ItemDetailsRecommendationsComponent/Sources/ItemDetailsRecommendationsContent.swift b/UI/ItemDetailsRecommendationsComponent/Sources/ItemDetailsRecommendationsContent.swift
new file mode 100644
index 0000000..b3b31d3
--- /dev/null
+++ b/UI/ItemDetailsRecommendationsComponent/Sources/ItemDetailsRecommendationsContent.swift
@@ -0,0 +1,14 @@
+//
+// ItemDetailsRecommendationsContent.swift
+// Flick
+//
+// Created by Bogdan Petkanych on 15.05.2026.
+// Copyright © 2026 urlaunched. All rights reserved.
+//
+
+import Common
+import UIKit
+
+public enum ItemDetailsRecommendationsContent: Hashable {
+ case imageContainer(path: String?, size: CGSize, type: ImageType = .poster)
+}
diff --git a/UI/ItemDetailsRecommendationsComponent/Sources/ItemDetailsRecommendationsRoute.swift b/UI/ItemDetailsRecommendationsComponent/Sources/ItemDetailsRecommendationsRoute.swift
new file mode 100644
index 0000000..95823d1
--- /dev/null
+++ b/UI/ItemDetailsRecommendationsComponent/Sources/ItemDetailsRecommendationsRoute.swift
@@ -0,0 +1,37 @@
+//
+// ItemDetailsRecommendationsRoute.swift
+// Flick
+//
+// Created by Alexander Sharko on 05.02.2023.
+// Copyright © 2023 urlaunched.com. All rights reserved.
+//
+
+import SwiftUI
+import UDF
+import Models
+import Common
+
+public enum ItemDetailsRecommendationsRoute: Hashable {
+ case itemDetails(any Item)
+ case recommendations(any Item)
+
+ public func hash(into hasher: inout Hasher) {
+ switch self {
+ case let .itemDetails(item):
+ hasher.combine(item)
+ case let .recommendations(item):
+ hasher.combine(item)
+ }
+ }
+
+ public static func == (lhs: Self, rhs: Self) -> Bool {
+ switch (lhs, rhs) {
+ case let (.itemDetails(lhsItem), .itemDetails(rhsItem)):
+ areEqual(lhsItem, rhsItem)
+ case let (.recommendations(lhsItem), .recommendations(rhsItem)):
+ areEqual(lhsItem, rhsItem)
+ default:
+ false
+ }
+ }
+}
diff --git a/UI/ItemDetailsReviewsComponent/Sources/ItemDetailsReviewsComponent.swift b/UI/ItemDetailsReviewsComponent/Sources/ItemDetailsReviewsComponent.swift
new file mode 100644
index 0000000..8f44b61
--- /dev/null
+++ b/UI/ItemDetailsReviewsComponent/Sources/ItemDetailsReviewsComponent.swift
@@ -0,0 +1,80 @@
+//
+// ItemDetailsReviewsComponent.swift
+// Flick
+//
+// Created by Alexander Sharko on 08.02.2023.
+// Copyright © 2023 urlaunched.com. All rights reserved.
+//
+
+import DesignSystem
+import Localizations
+import SwiftUI
+import UDF
+import Models
+import CustomViews
+import Common
+
+public struct ItemDetailsReviewsComponent: Component where R.Route == ItemDetailsReviewsRoute {
+ public struct Props {
+ var item: any Item
+ var reviews: [Review.ID]
+ var reviewById: (Review.ID) -> Review
+ var isRedacted: Bool
+ var router: R = .init()
+ var destinationBuilder: DestinationBuilder = .init()
+
+ public init(
+ item: any Item,
+ reviews: [Review.ID],
+ reviewById: @escaping (Review.ID) -> Review,
+ isRedacted: Bool,
+ router: R,
+ destinationBuilder: DestinationBuilder
+ ) {
+ self.item = item
+ self.reviews = reviews
+ self.reviewById = reviewById
+ self.isRedacted = isRedacted
+ self.router = router
+ self.destinationBuilder = destinationBuilder
+ }
+ }
+
+ public var props: Props
+
+ public init(props: Props) {
+ self.props = props
+ }
+
+ @Environment(\.globalRouter) private var globalRouter
+
+ public var body: some View {
+ if let id = props.reviews.first {
+ VStack(alignment: .leading, spacing: 24) {
+ SectionHeaderView(
+ title: Localization.itemDetailsReviewsSectionTitle(props.reviews.count),
+ seeAllAction: {
+ globalRouter.navigate(for: R.self, to: .reviews(props.item))
+ }
+ )
+
+ let review = props.reviewById(id)
+ ReviewRow(review: review, imageView: props.destinationBuilder.view(
+ for: .imageContainer(
+ path: review.authorDetails.avatarPath,
+ size: CGSize(width: 48, height: 48),
+ type: .profile
+ )
+ ))
+ .embedInPlainButton {
+ globalRouter.navigate(for: R.self, to: .reviewDetails(id))
+ }
+ .buttonStyle(.scaled)
+ .padding(.horizontal)
+ }
+ .isRedacted(props.isRedacted)
+ .disabled(props.isRedacted)
+ .toolbar(.hidden, for: .tabBar)
+ }
+ }
+}
diff --git a/UI/ItemDetailsReviewsComponent/Sources/ItemDetailsReviewsContent.swift b/UI/ItemDetailsReviewsComponent/Sources/ItemDetailsReviewsContent.swift
new file mode 100644
index 0000000..1376bd8
--- /dev/null
+++ b/UI/ItemDetailsReviewsComponent/Sources/ItemDetailsReviewsContent.swift
@@ -0,0 +1,13 @@
+//
+// ItemDetailsContent.swift
+// Flick
+//
+// Created by Bogdan Petkanych on 15.05.2026.
+// Copyright © 2026 urlaunched. All rights reserved.
+//
+import Common
+import UIKit
+
+public enum ItemDetailsReviewsContent: Hashable {
+ case imageContainer(path: String?, size: CGSize, type: ImageType = .poster)
+}
diff --git a/UI/ItemDetailsReviewsComponent/Sources/ItemDetailsReviewsRoute.swift b/UI/ItemDetailsReviewsComponent/Sources/ItemDetailsReviewsRoute.swift
new file mode 100644
index 0000000..2b05178
--- /dev/null
+++ b/UI/ItemDetailsReviewsComponent/Sources/ItemDetailsReviewsRoute.swift
@@ -0,0 +1,37 @@
+//
+// ItemDetailsReviewsRoute.swift
+// Flick
+//
+// Created by Alexander Sharko on 08.02.2023.
+// Copyright © 2023 urlaunched.com. All rights reserved.
+//
+
+import SwiftUI
+import UDF
+import Models
+import Common
+
+public enum ItemDetailsReviewsRoute: Hashable {
+ case reviewDetails(Review.ID)
+ case reviews(any Item)
+
+ public func hash(into hasher: inout Hasher) {
+ switch self {
+ case let .reviewDetails(id):
+ hasher.combine(id)
+ case let .reviews(item):
+ hasher.combine(item)
+ }
+ }
+
+ public static func == (lhs: Self, rhs: Self) -> Bool {
+ switch (lhs, rhs) {
+ case let (.reviewDetails(lhsId), .reviewDetails(rhsId)):
+ areEqual(lhsId, rhsId)
+ case let (.reviews(lhsItem), .reviews(rhsItem)):
+ areEqual(lhsItem, rhsItem)
+ default:
+ false
+ }
+ }
+}
diff --git a/UI/MainHomeSectionComponent/Sources/MainHomeContent.swift b/UI/MainHomeSectionComponent/Sources/MainHomeContent.swift
new file mode 100644
index 0000000..77fed29
--- /dev/null
+++ b/UI/MainHomeSectionComponent/Sources/MainHomeContent.swift
@@ -0,0 +1,14 @@
+//
+// MainHomeContent.swift
+// Flick
+//
+// Created by Bogdan Petkanych on 17.05.2026.
+// Copyright © 2026 urlaunched. All rights reserved.
+//
+
+import Common
+import UIKit
+
+public enum MainHomeContent: Hashable {
+ case imageContainer(path: String?, size: CGSize, type: ImageType = .poster, isLoaderPresented: Bool)
+}
diff --git a/UI/MainHomeSectionComponent/Sources/MainHomeSectionComponent.swift b/UI/MainHomeSectionComponent/Sources/MainHomeSectionComponent.swift
new file mode 100644
index 0000000..195bcac
--- /dev/null
+++ b/UI/MainHomeSectionComponent/Sources/MainHomeSectionComponent.swift
@@ -0,0 +1,88 @@
+//
+// MainHomeSectionComponent.swift
+// Flick
+//
+// Created by Alexander Sharko on 01.12.2022.
+// Copyright © 2022 urlaunched.com. All rights reserved.
+//
+
+import SwiftUI
+import SwiftUI_Kit
+import UDF
+import Models
+import Common
+import CustomViews
+
+public struct MainHomeSectionComponent: Component where R.Route == MainHomeSectionRoute {
+ public struct Props {
+ var section: S
+ var items: [any Item]
+ var genreById: (Genre.ID) -> Genre?
+ var router: R = .init()
+ var destinationBuilder: DestinationBuilder = .init()
+
+ public init(
+ section: S,
+ items: [any Item],
+ genreById: @escaping (Genre.ID) -> Genre?,
+ router: R = .init(),
+ destinationBuilder: DestinationBuilder = .init()
+ ) {
+ self.section = section
+ self.items = items
+ self.genreById = genreById
+ self.router = router
+ self.destinationBuilder = destinationBuilder
+ }
+ }
+
+ public var props: Props
+
+ public init(props: Props) {
+ self.props = props
+ }
+
+ @Environment(\.globalRouter) private var globalRouter
+
+ public var body: some View {
+ VStack(spacing: 10) {
+ SectionHeaderView(
+ title: props.section.title,
+ seeAllAction: {
+ globalRouter.navigate(for: R.self, to: .sectionDetails(props.section))
+ }
+ )
+ .padding(.bottom)
+
+ MainSectionScrollView(
+ items: props.items,
+ genresByItem: { $0.genres(action: props.genreById) },
+ navigateToItemDetails: { item in
+ globalRouter.navigate(for: R.self, to: .itemDetails(item))
+ },
+ backgroundImage: { size, path in
+ props.destinationBuilder.view(
+ for: .imageContainer(
+ path: path,
+ size: size,
+ type: .backdrop,
+ isLoaderPresented: true
+ )
+ )
+ },
+ cardImage: { item in
+ props.destinationBuilder.view(
+ for: .imageContainer(
+ path: item.posterPath,
+ size: ItemSizeStyle.default.coverSize,
+ type: .poster,
+ isLoaderPresented: false
+ )
+ )
+ }
+ )
+ }
+ .clipShape(RoundedCorner(radius: 50, corners: [.bottomLeft, .bottomRight]))
+ .frame(height: 460)
+ }
+}
diff --git a/UI/MainHomeSectionComponent/Sources/MainHomeSectionRoute.swift b/UI/MainHomeSectionComponent/Sources/MainHomeSectionRoute.swift
new file mode 100644
index 0000000..b46adad
--- /dev/null
+++ b/UI/MainHomeSectionComponent/Sources/MainHomeSectionRoute.swift
@@ -0,0 +1,37 @@
+//
+// MainHomeSectionRoute.swift
+// Flick
+//
+// Created by Valentin Petrulia on 27.02.2025.
+// Copyright © 2025 urlaunched.com. All rights reserved.
+//
+
+import SwiftUI
+import UDF
+import Models
+import Common
+
+public enum MainHomeSectionRoute: Hashable {
+ case itemDetails(any Item)
+ case sectionDetails(any Models.Section)
+
+ public func hash(into hasher: inout Hasher) {
+ switch self {
+ case let .itemDetails(item):
+ hasher.combine(item)
+ case let .sectionDetails(section):
+ hasher.combine(section)
+ }
+ }
+
+ public static func == (lhs: Self, rhs: Self) -> Bool {
+ switch (lhs, rhs) {
+ case let (.itemDetails(lhsItem), .itemDetails(rhsItem)):
+ areEqual(lhsItem, rhsItem)
+ case let (.sectionDetails(lhsSection), .sectionDetails(rhsSection)):
+ areEqual(lhsSection, rhsSection)
+ default:
+ false
+ }
+ }
+}
diff --git a/UI/MyFavoritesComponent/Sources/MyFavoritesComponent.swift b/UI/MyFavoritesComponent/Sources/MyFavoritesComponent.swift
new file mode 100644
index 0000000..9b60bbd
--- /dev/null
+++ b/UI/MyFavoritesComponent/Sources/MyFavoritesComponent.swift
@@ -0,0 +1,99 @@
+//
+// MyFavoritesComponent.swift
+// Flick
+//
+// Created by Vlad Andrieiev on 22.05.2023.
+// Copyright © 2023 urlaunched.com. All rights reserved.
+//
+
+import DesignSystem
+import Localizations
+import SwiftUI
+import UDF
+import Models
+import Common
+import CustomViews
+
+public struct MyFavoritesComponent: Component {
+ public struct Props {
+ var contentType: Binding
+ var items: [any Item]
+ var genreById: (Genre.ID) -> Genre?
+ var loadMoreAction: Command
+ var isRedacted: Bool
+ var dialogStatus: Binding
+ var destinationBuilder: DestinationBuilder
+
+ public init(
+ contentType: Binding,
+ items: [any Item],
+ genreById: @escaping (Genre.ID) -> Genre?,
+ loadMoreAction: @escaping Command,
+ isRedacted: Bool,
+ dialogStatus: Binding,
+ destinationBuilder: DestinationBuilder = .init()
+ ) {
+ self.contentType = contentType
+ self.items = items
+ self.genreById = genreById
+ self.loadMoreAction = loadMoreAction
+ self.isRedacted = isRedacted
+ self.dialogStatus = dialogStatus
+ self.destinationBuilder = destinationBuilder
+ }
+ }
+
+ public var props: Props
+
+ public init(props: Props) {
+ self.props = props
+ }
+
+ public var body: some View {
+ SelectiveItemsList(
+ items: props.items,
+ genreById: props.genreById,
+ loadMoreAction: props.loadMoreAction,
+ isRedacted: props.isRedacted,
+ header: {
+ ContentToggle(contentType: props.contentType)
+ },
+ imageView: { path in
+ props.destinationBuilder.view(
+ for: .imageContainer(
+ path: path,
+ size: ItemSizeStyle.default.coverSize,
+ type: .poster
+ )
+ )
+ }
+ )
+ .customNavigationTitle(Localization.myFavoritesNavigationTitle())
+ .navigationBarTitleDisplayMode(.inline)
+ .toolbar {
+ ToolbarItem(placement: .navigationBarTrailing) {
+ Button(action: {}) {
+ Image.filter
+ .aspectFit()
+ .frame(24)
+ }
+ }
+ }
+ .dialog(status: props.dialogStatus)
+ }
+}
+
+// MARK: - Preview
+
+#Preview {
+ MyFavoritesComponent(
+ props: .init(
+ contentType: .constant(.movie),
+ items: Movie.testItems(count: 10),
+ genreById: { _ in .testItem() },
+ loadMoreAction: {},
+ isRedacted: true,
+ dialogStatus: .constant(.dismissed)
+ )
+ )
+}
diff --git a/UI/MyFavoritesComponent/Sources/MyFavoritesContent.swift b/UI/MyFavoritesComponent/Sources/MyFavoritesContent.swift
new file mode 100644
index 0000000..46cd699
--- /dev/null
+++ b/UI/MyFavoritesComponent/Sources/MyFavoritesContent.swift
@@ -0,0 +1,13 @@
+//
+// MyFavoritesContent.swift
+// Flick
+//
+// Created by Bogdan Petkanych on 15.05.2026.
+// Copyright © 2026 urlaunched. All rights reserved.
+//
+import Common
+import UIKit
+
+public enum MyFavoritesContent: Hashable {
+ case imageContainer(path: String?, size: CGSize, type: ImageType = .poster)
+}
diff --git a/SnapshotTests/Snapshots/OnboardingComponentTests.swift b/UI/OnboardingComponent/Snapshots/OnboardingComponentTests.swift
similarity index 88%
rename from SnapshotTests/Snapshots/OnboardingComponentTests.swift
rename to UI/OnboardingComponent/Snapshots/OnboardingComponentTests.swift
index ce394ed..d80e1f1 100644
--- a/SnapshotTests/Snapshots/OnboardingComponentTests.swift
+++ b/UI/OnboardingComponent/Snapshots/OnboardingComponentTests.swift
@@ -5,16 +5,17 @@
// Created by Alexander Sharko on 16.11.2022.
//
-@testable import Flick
+@testable import OnboardingComponentSnapshotTestsHostApp
import Foundation
import SwiftUI
import SwiftUISnapshotTestCase
import UDF
import XCTest
-final class OnboardingComponentTests: SnapshotTestCase {
+final class OnboardingComponentTests: BaseSnapshotTestCase {
override func setUp() {
isRecording = false
+ super.setUp()
}
func test_Onboarding_firstPage() {
diff --git a/SnapshotTests/Snapshots/__Snapshots__/OnboardingComponentTests/test_Onboarding_firstPage.1.png b/UI/OnboardingComponent/Snapshots/__Snapshots__/OnboardingComponentTests/test_Onboarding_firstPage.1.png
similarity index 100%
rename from SnapshotTests/Snapshots/__Snapshots__/OnboardingComponentTests/test_Onboarding_firstPage.1.png
rename to UI/OnboardingComponent/Snapshots/__Snapshots__/OnboardingComponentTests/test_Onboarding_firstPage.1.png
diff --git a/SnapshotTests/Snapshots/__Snapshots__/OnboardingComponentTests/test_Onboarding_lastPage.1.png b/UI/OnboardingComponent/Snapshots/__Snapshots__/OnboardingComponentTests/test_Onboarding_lastPage.1.png
similarity index 100%
rename from SnapshotTests/Snapshots/__Snapshots__/OnboardingComponentTests/test_Onboarding_lastPage.1.png
rename to UI/OnboardingComponent/Snapshots/__Snapshots__/OnboardingComponentTests/test_Onboarding_lastPage.1.png
diff --git a/UI/OnboardingComponent/Sources/OnboardingApp.swift b/UI/OnboardingComponent/Sources/OnboardingApp.swift
new file mode 100644
index 0000000..8fa5df0
--- /dev/null
+++ b/UI/OnboardingComponent/Sources/OnboardingApp.swift
@@ -0,0 +1,18 @@
+//
+// OnboardingApp.swift
+// Flick
+//
+// Created by Bogdan Petkanych on 13.05.2026.
+// Copyright © 2026 urlaunched. All rights reserved.
+//
+
+import SwiftUI
+
+@main
+struct OnboardingApp: App {
+ var body: some Scene {
+ WindowGroup {
+ EmptyView()
+ }
+ }
+}
diff --git a/Flick/Code/Modules/Onboarding/View/OnboardingComponent.swift b/UI/OnboardingComponent/Sources/OnboardingComponent.swift
similarity index 93%
rename from Flick/Code/Modules/Onboarding/View/OnboardingComponent.swift
rename to UI/OnboardingComponent/Sources/OnboardingComponent.swift
index c11838f..3e46b51 100644
--- a/Flick/Code/Modules/Onboarding/View/OnboardingComponent.swift
+++ b/UI/OnboardingComponent/Sources/OnboardingComponent.swift
@@ -12,15 +12,19 @@ import SwiftUI
import SwiftUI_Kit
import UDF
-struct OnboardingComponent: Component {
- struct Props {
- let skipAction: Command
+public struct OnboardingComponent: Component {
+ public struct Props {
+ public let skipAction: Command
+
+ public init(skipAction: @escaping Command) {
+ self.skipAction = skipAction
+ }
}
- var props: Props
+ public var props: Props
@State private var page: any Pageable
- init(props: Props) {
+ public init(props: Props) {
self.props = props
_page = .init(initialValue: Page.first)
}
@@ -30,7 +34,7 @@ struct OnboardingComponent: Component {
_page = .init(initialValue: page)
}
- var body: some View {
+ public var body: some View {
ZStack {
page.color
GeometryReader {
diff --git a/Flick/Code/Modules/Onboarding/View/OnboardingPage.swift b/UI/OnboardingComponent/Sources/OnboardingPage.swift
similarity index 100%
rename from Flick/Code/Modules/Onboarding/View/OnboardingPage.swift
rename to UI/OnboardingComponent/Sources/OnboardingPage.swift
index 606531a..6d1a7db 100644
--- a/Flick/Code/Modules/Onboarding/View/OnboardingPage.swift
+++ b/UI/OnboardingComponent/Sources/OnboardingPage.swift
@@ -8,8 +8,8 @@
import DesignSystem
import Foundation
-import Localizations
import SwiftUI
+import Localizations
protocol Pageable: Identifiable where ID == Int {
var id: Int { get }
diff --git a/UI/ReviewDetailsComponent/Sources/ReviewDetailsComponent.swift b/UI/ReviewDetailsComponent/Sources/ReviewDetailsComponent.swift
new file mode 100644
index 0000000..80d8f51
--- /dev/null
+++ b/UI/ReviewDetailsComponent/Sources/ReviewDetailsComponent.swift
@@ -0,0 +1,69 @@
+//
+// ReviewDetailsComponent.swift
+// Flick
+//
+// Created by Alexander Sharko on 10.02.2023.
+// Copyright © 2023 urlaunched.com. All rights reserved.
+//
+
+import DesignSystem
+import Localizations
+import SwiftUI
+import UDF
+import Models
+import CustomViews
+import Common
+
+public struct ReviewDetailsComponent: Component {
+ public struct Props {
+ var review: Review
+ var destinationBuilder: DestinationBuilder
+
+ public init(review: Review, destinationBuilder: DestinationBuilder = .init()) {
+ self.review = review
+ self.destinationBuilder = destinationBuilder
+ }
+ }
+
+ public init(props: Props) {
+ self.props = props
+ }
+
+ public var props: Props
+
+ public var body: some View {
+ ScrollView {
+ VStack(alignment: .leading, spacing: 16) {
+ ReviewHeaderView(
+ review: props.review,
+ placeholderColor: .flSecondary,
+ imageView: props.destinationBuilder.view(
+ for: .imageContainer(
+ path: props.review.authorDetails.avatarPath,
+ size: CGSize(width: 48, height: 48),
+ type: .profile
+ )
+ )
+ )
+ .padding(.horizontal, 10)
+
+ Text(props.review.content)
+ .customFont(.body)
+ .foregroundStyle(.flText)
+ }
+ .padding()
+ }
+ .customNavigationTitle(Localization.itemDetailsReviewsNavigationTitle())
+ .background(Color.flMain.edgesIgnoringSafeArea(.all))
+ }
+}
+
+// MARK: - Preview
+
+#Preview {
+ ReviewDetailsComponent(
+ props: .init(
+ review: .fakeItem()
+ )
+ )
+}
diff --git a/UI/ReviewDetailsComponent/Sources/ReviewDetailsContent.swift b/UI/ReviewDetailsComponent/Sources/ReviewDetailsContent.swift
new file mode 100644
index 0000000..6d10ab8
--- /dev/null
+++ b/UI/ReviewDetailsComponent/Sources/ReviewDetailsContent.swift
@@ -0,0 +1,13 @@
+//
+// ReviewDetailsContent.swift
+// Flick
+//
+// Created by Bogdan Petkanych on 14.05.2026.
+// Copyright © 2026 urlaunched. All rights reserved.
+//
+import SwiftUI
+import Common
+
+public enum ReviewDetailsContent: Hashable {
+ case imageContainer(path: String?, size: CGSize, type: ImageType = .poster)
+}
diff --git a/UI/ReviewsComponent/Sources/ReviewsComponent.swift b/UI/ReviewsComponent/Sources/ReviewsComponent.swift
new file mode 100644
index 0000000..2695001
--- /dev/null
+++ b/UI/ReviewsComponent/Sources/ReviewsComponent.swift
@@ -0,0 +1,93 @@
+//
+// ReviewsComponent.swift
+// Flick
+//
+// Created by Alexander Sharko on 10.02.2023.
+// Copyright © 2023 urlaunched.com. All rights reserved.
+//
+
+import DesignSystem
+import Localizations
+import SwiftUI
+import UDF
+import Models
+import CustomViews
+import Common
+
+
+public struct ReviewsComponent: Component where R.Route == ReviewsRoute {
+ public struct Props {
+ var reviews: [Review.ID]
+ var reviewById: (Review.ID) -> Review
+ var loadMoreAction: Command
+ var dialogStatus: Binding
+ var router: R = .init()
+ var destinationBuilder: DestinationBuilder = .init()
+
+ public init(
+ reviews: [Review.ID],
+ reviewById: @escaping (Review.ID) -> Review,
+ loadMoreAction: @escaping Command,
+ dialogStatus: Binding,
+ router: R = .init()
+ ) {
+ self.reviews = reviews
+ self.reviewById = reviewById
+ self.loadMoreAction = loadMoreAction
+ self.dialogStatus = dialogStatus
+ self.router = router
+ }
+ }
+ public var props: Props
+
+ public init(props: Props) {
+ self.props = props
+ }
+
+ @Environment(\.globalRouter) private var globalRouter
+
+ public var body: some View {
+ VStack(spacing: 16) {
+ List(props.reviews, id: \.self) { id in
+ let review = props.reviewById(id)
+ ReviewRow(
+ review: review,
+ imageView: props.destinationBuilder.view(
+ for: .imageContainer(
+ path: review.authorDetails.avatarPath,
+ size: CGSize(width: 48, height: 48), type: .profile
+ )
+ )
+ )
+ .embedInPlainButton {
+ globalRouter.navigate(for: R.self, to: .reviewDetails(id))
+ }
+ .onAppear {
+ if id == props.reviews.last {
+ props.loadMoreAction()
+ }
+ }
+ .listRowInsets(EdgeInsets(top: 8, leading: 16, bottom: 8, trailing: 16))
+ .listRowBackground(Color.flMain)
+ .listRowSeparator(.hidden)
+ }
+ .listStyle(.plain)
+ .scrollContentBackground(.hidden)
+ }
+ .customNavigationTitle(Localization.itemDetailsReviewsNavigationTitle())
+ .background(Color.flMain.edgesIgnoringSafeArea(.all))
+ }
+}
+
+// MARK: - Preview
+
+#Preview {
+ ReviewsComponent>(
+ props: .init(
+ reviews: Review.testItemIds(count: 10),
+ reviewById: { _ in .fakeItem() },
+ loadMoreAction: {},
+ dialogStatus: .constant(.dismissed)
+ )
+ )
+}
diff --git a/UI/ReviewsComponent/Sources/ReviewsContent.swift b/UI/ReviewsComponent/Sources/ReviewsContent.swift
new file mode 100644
index 0000000..a7af280
--- /dev/null
+++ b/UI/ReviewsComponent/Sources/ReviewsContent.swift
@@ -0,0 +1,15 @@
+//
+// ReviewsContent.swift
+// Flick
+//
+// Created by Bogdan Petkanych on 14.05.2026.
+// Copyright © 2026 urlaunched. All rights reserved.
+//
+
+import UDF
+import UIKit
+import Common
+
+public enum ReviewsContent: Hashable {
+ case imageContainer(path: String?, size: CGSize, type: ImageType = .poster)
+}
diff --git a/UI/ReviewsComponent/Sources/ReviewsRoute.swift b/UI/ReviewsComponent/Sources/ReviewsRoute.swift
new file mode 100644
index 0000000..a91908a
--- /dev/null
+++ b/UI/ReviewsComponent/Sources/ReviewsRoute.swift
@@ -0,0 +1,15 @@
+//
+// ReviewsRoute.swift
+// Flick
+//
+// Created by Alexander Sharko on 10.02.2023.
+// Copyright © 2023 urlaunched.com. All rights reserved.
+//
+
+import SwiftUI
+import UDF
+import Models
+
+public enum ReviewsRoute: Hashable {
+ case reviewDetails(Review.ID)
+}
diff --git a/Flick/Code/Modules/Search/View/SearchComponent.swift b/UI/SearchComponent/Sources/SearchComponent.swift
similarity index 78%
rename from Flick/Code/Modules/Search/View/SearchComponent.swift
rename to UI/SearchComponent/Sources/SearchComponent.swift
index 867434d..e8473c5 100644
--- a/Flick/Code/Modules/Search/View/SearchComponent.swift
+++ b/UI/SearchComponent/Sources/SearchComponent.swift
@@ -11,21 +11,46 @@ import DesignSystem
import Localizations
import SwiftUI
import UDF
+import Models
+import CustomViews
+import Common
-struct SearchComponent: Component {
- struct Props {
+public struct SearchComponent: Component {
+ public struct Props {
var searchText: Binding
var itemIds: [SearchItem.ID]
var searchItemById: (SearchItem.ID) -> SearchItem
var genreById: (Genre.ID) -> Genre
var loadMoreAction: Command
+ var destinationBuilder: DestinationBuilder
+
+ public init(
+ searchText: Binding,
+ itemIds: [SearchItem.ID],
+ searchItemById: @escaping (SearchItem.ID) -> SearchItem,
+ genreById: @escaping (Genre.ID) -> Genre,
+ loadMoreAction: @escaping Command,
+ destinationBuilder: DestinationBuilder
+ ) {
+ self.searchText = searchText
+ self.itemIds = itemIds
+ self.searchItemById = searchItemById
+ self.genreById = genreById
+ self.loadMoreAction = loadMoreAction
+ self.destinationBuilder = destinationBuilder
+ }
}
- var props: Props
+ public var props: Props
+
+ public init(props: Props) {
+ self.props = props
+ self.focusedField = focusedField
+ }
@FocusState private var focusedField: Field?
- var body: some View {
+ public var body: some View {
VStack(spacing: 16) {
searchTextField
.padding(.horizontal)
@@ -95,7 +120,14 @@ private extension SearchComponent {
func searchRow(item: SearchItem) -> some View {
HStack(spacing: 16) {
PosterImageView(
- posterPath: item.posterPath, year: item.year, rating: item.rating
+ year: item.year,
+ rating: item.rating,
+ imageView: props.destinationBuilder.view(
+ for: .imageContainer(
+ path: item.posterPath,
+ size: ItemSizeStyle.default.coverSize
+ )
+ )
)
.overlay(alignment: .topLeading) {
heartButton
@@ -192,7 +224,8 @@ private extension SearchComponent {
itemIds: SearchItem.testItems(count: 10).ids,
searchItemById: { _ in .fakeItem() },
genreById: { _ in .testItem() },
- loadMoreAction: {}
+ loadMoreAction: {},
+ destinationBuilder: .init()
)
)
}
@@ -204,7 +237,8 @@ private extension SearchComponent {
itemIds: [],
searchItemById: { _ in .fakeItem() },
genreById: { _ in .testItem() },
- loadMoreAction: {}
+ loadMoreAction: {},
+ destinationBuilder: .init()
)
)
}
diff --git a/UI/SearchComponent/Sources/SearchContent.swift b/UI/SearchComponent/Sources/SearchContent.swift
new file mode 100644
index 0000000..d171d0a
--- /dev/null
+++ b/UI/SearchComponent/Sources/SearchContent.swift
@@ -0,0 +1,13 @@
+//
+// SearchContent.swift
+// Flick
+//
+// Created by Bogdan Petkanych on 15.05.2026.
+// Copyright © 2026 urlaunched. All rights reserved.
+//
+import Foundation
+import Common
+
+public enum SearchContent: Hashable {
+ case imageContainer(path: String?, size: CGSize)
+}
diff --git a/Flick/Code/Modules/SectionDetails/View/SectionDetailsComponent.swift b/UI/SectionDetailsComponent/Sources/SectionDetailsComponent.swift
similarity index 60%
rename from Flick/Code/Modules/SectionDetails/View/SectionDetailsComponent.swift
rename to UI/SectionDetailsComponent/Sources/SectionDetailsComponent.swift
index d9d7075..8e5a6e2 100644
--- a/Flick/Code/Modules/SectionDetails/View/SectionDetailsComponent.swift
+++ b/UI/SectionDetailsComponent/Sources/SectionDetailsComponent.swift
@@ -10,31 +10,55 @@ import DesignSystem
import SwiftUI
import SwiftUI_Kit
import UDF
+import Models
+import Common
-struct SectionDetailsComponent: Component {
- struct Props {
+public struct SectionDetailsComponent: Component where R.Route == SectionDetailsRoute {
+ public struct Props {
var title: String
var items: [any Item]
var genreById: (Genre.ID) -> Genre?
var loadMoreAction: Command
var dialogStatus: Binding
- var router: Router = .init()
+ var router: R = .init()
+
+ public init(
+ title: String,
+ items: [any Item],
+ genreById: @escaping (Genre.ID) -> Genre?,
+ loadMoreAction: @escaping Command,
+ dialogStatus: Binding,
+ router: R = .init()
+ ) {
+ self.title = title
+ self.items = items
+ self.genreById = genreById
+ self.loadMoreAction = loadMoreAction
+ self.dialogStatus = dialogStatus
+ self.router = router
+ }
}
- var props: Props
+ public var props: Props
+
+ public init(props: Props) {
+ self.props = props
+ }
@Environment(\.globalRouter) private var globalRouter
- var body: some View {
+ public var body: some View {
GeometryReader { geometry in
List(props.items.indices, id: \.self) { index in
let item = props.items[index]
+ let size = CGSize(width: geometry.size.width, height: geometry.size.height * 0.75)
SectionDetailsRow(
item: item,
genres: item.genres(action: props.genreById),
size: .init(width: geometry.size.width, height: geometry.size.height * 0.75),
toggleFavoriteAction: {},
- shareAction: {}
+ shareAction: {},
+ imageView: props.router.view(for: .imageContainer(path: item.posterPath, size: size))
)
.onAppear {
if index == props.items.indices.last {
@@ -42,7 +66,7 @@ struct SectionDetailsComponent: Component {
}
}
.embedInPlainButton {
- globalRouter.navigate(for: SectionDetailsRouting.self, to: .itemDetails(item))
+ globalRouter.navigate(for: R.self, to: .itemDetails(item))
}
.listRowInsets(.zero)
.listRowSeparator(.hidden)
@@ -67,13 +91,14 @@ struct SectionDetailsComponent: Component {
// MARK: - Preview
#Preview {
- SectionDetailsComponent(
+ SectionDetailsComponent>(
props: .init(
title: "Popular",
items: Movie.testItems(count: 10),
genreById: { _ in .fakeItem() },
loadMoreAction: {},
- dialogStatus: .constant(.dismissed)
+ dialogStatus: .constant(.dismissed),
+ router: MockRouter()
)
)
}
diff --git a/UI/SectionDetailsComponent/Sources/SectionDetailsRoute.swift b/UI/SectionDetailsComponent/Sources/SectionDetailsRoute.swift
new file mode 100644
index 0000000..9eb0e41
--- /dev/null
+++ b/UI/SectionDetailsComponent/Sources/SectionDetailsRoute.swift
@@ -0,0 +1,37 @@
+//
+// SectionDetailsRoute.swift
+// Flick
+//
+// Created by Bogdan Petkanych on 14.05.2026.
+// Copyright © 2026 urlaunched. All rights reserved.
+//
+
+import UDF
+import UIKit
+import Common
+import Models
+
+public enum SectionDetailsRoute: Hashable {
+ case imageContainer(path: String?, size: CGSize)
+ case itemDetails(any Item)
+
+ public func hash(into hasher: inout Hasher) {
+ switch self {
+ case let .itemDetails(item):
+ hasher.combine(item)
+ case .imageContainer(path: let path, size: let size):
+ hasher.combine(path)
+ }
+ }
+
+ public static func == (lhs: Self, rhs: Self) -> Bool {
+ switch (lhs, rhs) {
+ case let (.itemDetails(lhsItem), .itemDetails(rhsItem)):
+ areEqual(lhsItem, rhsItem)
+ case let (.imageContainer(path: lhsPath, size: lhsSize), .imageContainer(path: rhsPath, size: rhsSize)):
+ lhsPath == rhsPath && lhsSize == rhsSize
+ default:
+ false
+ }
+ }
+}
diff --git a/Flick/Code/Common/CustomViews/SectionDetailsRow.swift b/UI/SectionDetailsComponent/Sources/SectionDetailsRow.swift
similarity index 91%
rename from Flick/Code/Common/CustomViews/SectionDetailsRow.swift
rename to UI/SectionDetailsComponent/Sources/SectionDetailsRow.swift
index 6f4b745..306e56b 100644
--- a/Flick/Code/Common/CustomViews/SectionDetailsRow.swift
+++ b/UI/SectionDetailsComponent/Sources/SectionDetailsRow.swift
@@ -8,22 +8,21 @@
import DesignSystem
import SwiftUI
+import Models
-struct SectionDetailsRow: View {
+struct SectionDetailsRow: View {
var item: any Item
var genres: String
var size: CGSize
var toggleFavoriteAction: () -> Void
var shareAction: () -> Void
+ var imageView: IV
var body: some View {
ZStack(alignment: .bottom) {
- ImageContainer(
- size: size,
- path: item.posterPath
- )
- .frame(size)
- .clipped()
+ imageView
+ .frame(size)
+ .clipped()
LinearGradient(
colors: [.flDark.opacity(0.8), .flDark.opacity(0.7), .clear],
@@ -95,6 +94,7 @@ private extension SectionDetailsRow {
genres: "Fantasy • Action • Adventure",
size: .init(width: 300, height: 500),
toggleFavoriteAction: {},
- shareAction: {}
+ shareAction: {},
+ imageView: EmptyView()
)
}
diff --git a/Flick/Code/Modules/Profile/View/SettingsComponent.swift b/UI/SettingsComponent/Sources/SettingsComponent.swift
similarity index 85%
rename from Flick/Code/Modules/Profile/View/SettingsComponent.swift
rename to UI/SettingsComponent/Sources/SettingsComponent.swift
index a14bdd7..8c54492 100644
--- a/Flick/Code/Modules/Profile/View/SettingsComponent.swift
+++ b/UI/SettingsComponent/Sources/SettingsComponent.swift
@@ -10,17 +10,26 @@ import Localizations
import SwiftUI
import SwiftUI_Kit
import UDF
+import Common
-struct SettingsComponent: Component {
- struct Props {
+public struct SettingsComponent: Component {
+ public struct Props {
var rateThisAppAction: Command
+
+ public init(rateThisAppAction: @escaping Command) {
+ self.rateThisAppAction = rateThisAppAction
+ }
}
@State private var selectedLink: AppLink?
- var props: Props
+ public var props: Props
+
+ public init(props: Props) {
+ self.props = props
+ }
- var body: some View {
+ public var body: some View {
ScrollView {
settingsRow(title: Localization.settingsPrivacyPolicyTitle()) {
selectedLink = .privacyPolicy
diff --git a/SnapshotTests/Snapshots/SignInComponentTests.swift b/UI/SignInComponent/Snapshots/SignInComponentTests.swift
similarity index 82%
rename from SnapshotTests/Snapshots/SignInComponentTests.swift
rename to UI/SignInComponent/Snapshots/SignInComponentTests.swift
index 86792f3..943ef28 100644
--- a/SnapshotTests/Snapshots/SignInComponentTests.swift
+++ b/UI/SignInComponent/Snapshots/SignInComponentTests.swift
@@ -6,15 +6,18 @@
// Copyright © 2022 urlaunched.com. All rights reserved.
//
-@testable import Flick
+@testable import SignInComponentSnapshotTestsHostApp
+@testable import Common
import Foundation
import SwiftUI
import SwiftUISnapshotTestCase
import UDF
import XCTest
-final class SignInComponentTests: SnapshotTestCase {
- private var initialComponent: SignInComponent!
+@MainActor
+final class SignInComponentTests: BaseSnapshotTestCase {
+ private var initialComponent: SignInComponent>!
+
override func setUp() {
super.setUp()
isRecording = false
diff --git a/UI/SignInComponent/Snapshots/__Snapshots__/SignInComponentTests/test_TextFields_areEmpty.1.png b/UI/SignInComponent/Snapshots/__Snapshots__/SignInComponentTests/test_TextFields_areEmpty.1.png
new file mode 100644
index 0000000..9991ac6
Binary files /dev/null and b/UI/SignInComponent/Snapshots/__Snapshots__/SignInComponentTests/test_TextFields_areEmpty.1.png differ
diff --git a/UI/SignInComponent/Snapshots/__Snapshots__/SignInComponentTests/test_TextFields_areFilled.1.png b/UI/SignInComponent/Snapshots/__Snapshots__/SignInComponentTests/test_TextFields_areFilled.1.png
new file mode 100644
index 0000000..91f8856
Binary files /dev/null and b/UI/SignInComponent/Snapshots/__Snapshots__/SignInComponentTests/test_TextFields_areFilled.1.png differ
diff --git a/Flick/Code/Common/CustomViews/AuthView.swift b/UI/SignInComponent/Sources/AuthView.swift
similarity index 100%
rename from Flick/Code/Common/CustomViews/AuthView.swift
rename to UI/SignInComponent/Sources/AuthView.swift
diff --git a/UI/SignInComponent/Sources/Router.swift b/UI/SignInComponent/Sources/Router.swift
new file mode 100644
index 0000000..fc372e4
--- /dev/null
+++ b/UI/SignInComponent/Sources/Router.swift
@@ -0,0 +1,13 @@
+//
+// SignInRouter.swift
+// Flick
+//
+// Created by Bogdan Petkanych on 06.05.2026.
+// Copyright © 2026 urlaunched. All rights reserved.
+//
+import SwiftUI
+
+public enum SignInRoute: Hashable {
+ case resetPassword
+ case signUp
+}
diff --git a/UI/SignInComponent/Sources/SignInApp.swift b/UI/SignInComponent/Sources/SignInApp.swift
new file mode 100644
index 0000000..5c25b17
--- /dev/null
+++ b/UI/SignInComponent/Sources/SignInApp.swift
@@ -0,0 +1,18 @@
+//
+// SignInApp.swift
+// Flick
+//
+// Created by Bogdan Petkanych on 13.05.2026.
+// Copyright © 2026 urlaunched. All rights reserved.
+//
+
+import SwiftUI
+
+@main
+struct SignInApp: App {
+ var body: some Scene {
+ WindowGroup {
+ EmptyView()
+ }
+ }
+}
diff --git a/Flick/Code/Modules/SignIn/View/SignInComponent.swift b/UI/SignInComponent/Sources/SignInComponent.swift
similarity index 76%
rename from Flick/Code/Modules/SignIn/View/SignInComponent.swift
rename to UI/SignInComponent/Sources/SignInComponent.swift
index b6cb8e4..03c94b2 100644
--- a/Flick/Code/Modules/SignIn/View/SignInComponent.swift
+++ b/UI/SignInComponent/Sources/SignInComponent.swift
@@ -10,23 +10,44 @@ import DesignSystem
import Localizations
import SwiftUI
import UDF
+import Common
-struct SignInComponent: Component {
- struct Props {
+public struct SignInComponent: Component where R.Route == SignInRoute {
+ public struct Props {
var username: Binding
var password: Binding
var signInAction: Command
var isLoaderPresented: Binding
var dialogStatus: Binding
- var router: Router = .init()
+ var router: R = .init()
+
+ public init(
+ username: Binding,
+ password: Binding,
+ signInAction: @escaping Command,
+ isLoaderPresented: Binding,
+ dialogStatus: Binding,
+ router: R = .init()
+ ) {
+ self.username = username
+ self.password = password
+ self.signInAction = signInAction
+ self.isLoaderPresented = isLoaderPresented
+ self.dialogStatus = dialogStatus
+ self.router = router
+ }
}
- var props: Props
+ public var props: Props
@FocusState private var focusedField: Field?
@Environment(\.globalRouter) private var globalRouter
+
+ public init(props: Props) {
+ self.props = props
+ }
- var body: some View {
+ public var body: some View {
AuthView(title: Localization.authSignUpTitle()) {
VStack {
AuthTextField(
@@ -61,7 +82,7 @@ struct SignInComponent: Component {
.foregroundStyle(.flMainPink)
.frame(maxWidth: .infinity, alignment: .trailing)
.embedInPlainButton {
- globalRouter.navigate(for: SignInRouting.self, to: .resetPassword)
+ globalRouter.navigate(for: R.self, to: .resetPassword)
}
.padding(.top)
@@ -78,7 +99,7 @@ struct SignInComponent: Component {
Text(Localization.authSignUpButtonTitle())
.foregroundStyle(.flMainPink)
.embedInPlainButton {
- globalRouter.navigate(for: SignInRouting.self, to: .signUp)
+ globalRouter.navigate(for: R.self, to: .signUp)
}
}
.customFont(.subheadline)
@@ -91,7 +112,7 @@ struct SignInComponent: Component {
focusedField = .none
}
.hideKeyboardByTap()
- .navigationDestination(for: SignInRouting.self)
+ .navigationDestination(for: R.self)
.embedInNavigationStack()
.dialog(status: props.dialogStatus)
.loaderSheet(isPresented: props.isLoaderPresented)
@@ -126,7 +147,8 @@ private extension SignInComponent {
password: .constant(""),
signInAction: {},
isLoaderPresented: .constant(false),
- dialogStatus: .constant(.dismissed)
+ dialogStatus: .constant(.dismissed),
+ router: MockRouter()
)
)
}
diff --git a/Flick/Code/Modules/TabBar/View/TabBarComponent.swift b/UI/TabBarComponent/Sources/TabBarComponent.swift
similarity index 82%
rename from Flick/Code/Modules/TabBar/View/TabBarComponent.swift
rename to UI/TabBarComponent/Sources/TabBarComponent.swift
index cc67a80..a75a6a5 100644
--- a/Flick/Code/Modules/TabBar/View/TabBarComponent.swift
+++ b/UI/TabBarComponent/Sources/TabBarComponent.swift
@@ -10,16 +10,26 @@ import DesignSystem
import SwiftUI
import SwiftUI_Kit
import UDF
+import Common
-struct TabBarComponent: Component {
- struct Props {
+public struct TabBarComponent: Component {
+ public struct Props {
var selectedTab: Binding
var isHidden: Binding
+
+ public init(selectedTab: Binding, isHidden: Binding) {
+ self.selectedTab = selectedTab
+ self.isHidden = isHidden
+ }
}
- var props: Props
+ public var props: Props
+
+ public init(props: Props) {
+ self.props = props
+ }
- var body: some View {
+ public var body: some View {
HStack(spacing: 0) {
ForEach(TabBarItem.allCases, id: \.self) { tab in
let presenter = TabBarItemPresenter(
diff --git a/UI/TabBarComponent/Sources/TabBarItemPresenter.swift b/UI/TabBarComponent/Sources/TabBarItemPresenter.swift
new file mode 100644
index 0000000..9d09b4e
--- /dev/null
+++ b/UI/TabBarComponent/Sources/TabBarItemPresenter.swift
@@ -0,0 +1,39 @@
+//
+// TabBarItemPresenter.swift
+// Flick
+//
+// Created by Valentin Petrulia on 27.02.2025.
+// Copyright © 2025 urlaunched.com. All rights reserved.
+//
+
+import SwiftUI
+import Common
+
+public struct TabBarItemPresenter {
+ private let tabBarItem: TabBarItem
+ private let isSelected: Bool
+
+ public init(item: TabBarItem, isSelected: Bool) {
+ tabBarItem = item
+ self.isSelected = isSelected
+ }
+
+ public var image: Image {
+ switch tabBarItem {
+ case .home:
+ isSelected ? .videoPlayFill : .videoPlay
+ case .search:
+ isSelected ? .searchFill : .search
+ case .randomizer:
+ .flick
+ case .favorites:
+ isSelected ? .heartFill : .heart
+ case .profile:
+ isSelected ? .userSquareFill : .userSquare
+ }
+ }
+
+ public var foregroundColor: Color {
+ isSelected ? .flMainPink : .flPink60
+ }
+}
diff --git a/Flick/Code/Common/CustomViews/DropdownSelector.swift b/UI/WhereToWatchComponent/Sources/DropdownSelector.swift
similarity index 93%
rename from Flick/Code/Common/CustomViews/DropdownSelector.swift
rename to UI/WhereToWatchComponent/Sources/DropdownSelector.swift
index 7da5ca3..0a8b266 100644
--- a/Flick/Code/Common/CustomViews/DropdownSelector.swift
+++ b/UI/WhereToWatchComponent/Sources/DropdownSelector.swift
@@ -2,17 +2,13 @@
// DropdownSelector.swift
// Flick
//
-// Created by Arthur Zavolovych on 16.05.2023.
-// Copyright © 2023 urlaunched.com. All rights reserved.
+// Created by Bogdan Petkanych on 13.05.2026.
+// Copyright © 2026 urlaunched. All rights reserved.
//
-import Localizations
import SwiftUI
-
-struct DropdownItem {
- var title: String
- var image: UIImage
-}
+import Localizations
+import Common
struct DropdownSelector: View {
var placeholder: String
@@ -20,7 +16,7 @@ struct DropdownSelector: View {
@Binding var isSelecting: Bool
@Binding var selectedItem: DropdownItem?
-
+
var body: some View {
VStack {
HStack(spacing: 6) {
@@ -106,7 +102,7 @@ private extension DropdownSelector {
#Preview {
DropdownSelector(
- placeholder: Localization.whereToWatchSelectCountryTitle(),
+ placeholder: "",
options: Array(repeating: .init(title: "Option", image: UIImage(systemName: "flag.fill")!), count: 4),
isSelecting: .constant(false),
selectedItem: .constant(.init(title: "Selected country", image: UIImage(systemName: "flag.fill")!))
diff --git a/Flick/Code/Modules/WhereToWatch/View/WhereToWatchComponent.swift b/UI/WhereToWatchComponent/Sources/WhereToWatchComponent.swift
similarity index 81%
rename from Flick/Code/Modules/WhereToWatch/View/WhereToWatchComponent.swift
rename to UI/WhereToWatchComponent/Sources/WhereToWatchComponent.swift
index 98ffddc..9e35131 100644
--- a/Flick/Code/Modules/WhereToWatch/View/WhereToWatchComponent.swift
+++ b/UI/WhereToWatchComponent/Sources/WhereToWatchComponent.swift
@@ -6,31 +6,47 @@
// Copyright © 2023 urlaunched.com. All rights reserved.
//
-import FlagKit
import Localizations
import SwiftUI
import UDF
+import Models
+import Common
+import FlagKit
-struct WhereToWatchComponent: Component {
- struct Props {
+public struct WhereToWatchComponent: Component {
+ public struct Props {
var item: any Item
var countries: [DropdownItem]
var providers: [Provider]
+ var destinationBuilder: DestinationBuilder = .init()
+
+ public init(
+ item: any Item,
+ countries: [DropdownItem],
+ providers: [Provider],
+ destinationBuilder: DestinationBuilder = .init()
+ ) {
+ self.item = item
+ self.countries = countries
+ self.providers = providers
+ self.destinationBuilder = destinationBuilder
+ }
+ }
+
+ public init(props: Props) {
+ self.props = props
}
- var props: Props
+ public var props: Props
@State private var isSelecting: Bool = false
@State private var selectedCountry: DropdownItem?
- var body: some View {
+ public var body: some View {
ScrollView(showsIndicators: false) {
VStack {
HStack(spacing: 19) {
- ImageContainer(
- size: .init(width: 97, height: 132),
- path: props.item.posterPath
- )
+ props.destinationBuilder.view(for: .imageContainer(path: props.item.posterPath, size: .init(width: 97, height: 132)))
.frame(width: 97, height: 132)
.clipShape(RoundedRectangle(cornerRadius: 18))
Text(props.item.title)
@@ -108,11 +124,7 @@ private extension WhereToWatchComponent {
}
func providerItem(_ item: ProviderItem) -> some View {
- ImageContainer(
- size: .init(width: 70, height: 70),
- path: item.logoPath,
- type: .profile
- )
+ props.destinationBuilder.view(for: .imageContainer(path: item.logoPath, size: .init(width: 70, height: 70), type: .profile))
.frame(width: 70, height: 70)
.clipShape(RoundedRectangle(cornerRadius: 14.0))
}
diff --git a/UI/WhereToWatchComponent/Sources/WhereToWatchContent.swift b/UI/WhereToWatchComponent/Sources/WhereToWatchContent.swift
new file mode 100644
index 0000000..427615d
--- /dev/null
+++ b/UI/WhereToWatchComponent/Sources/WhereToWatchContent.swift
@@ -0,0 +1,16 @@
+//
+// WhereToWatchContent.swift
+// Flick
+//
+// Created by Bogdan Petkanych on 14.05.2026.
+// Copyright © 2026 urlaunched. All rights reserved.
+//
+
+
+import UDF
+import UIKit
+import Common
+
+public enum WhereToWatchContent: Hashable {
+ case imageContainer(path: String?, size: CGSize, type: ImageType = .poster)
+}
diff --git a/graph.png b/graph.png
new file mode 100644
index 0000000..2aee34d
Binary files /dev/null and b/graph.png differ
diff --git a/xcconfigs/Flick-Project.xcconfig b/xcconfigs/Flick-Project.xcconfig
new file mode 100644
index 0000000..0c7ed77
--- /dev/null
+++ b/xcconfigs/Flick-Project.xcconfig
@@ -0,0 +1,60 @@
+ALWAYS_SEARCH_USER_PATHS=NO
+CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED=YES
+CLANG_ANALYZER_NONNULL=YES
+CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION=YES_AGGRESSIVE
+CLANG_CXX_LANGUAGE_STANDARD=gnu++20
+CLANG_ENABLE_MODULES=YES
+CLANG_ENABLE_OBJC_ARC=YES
+CLANG_ENABLE_OBJC_WEAK=YES
+CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING=YES
+CLANG_WARN_BOOL_CONVERSION=YES
+CLANG_WARN_COMMA=YES
+CLANG_WARN_CONSTANT_CONVERSION=YES
+CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS=YES
+CLANG_WARN_DIRECT_OBJC_ISA_USAGE=YES_ERROR
+CLANG_WARN_DOCUMENTATION_COMMENTS=YES
+CLANG_WARN_EMPTY_BODY=YES
+CLANG_WARN_ENUM_CONVERSION=YES
+CLANG_WARN_INFINITE_RECURSION=YES
+CLANG_WARN_INT_CONVERSION=YES
+CLANG_WARN_NON_LITERAL_NULL_CONVERSION=YES
+CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF=YES
+CLANG_WARN_OBJC_LITERAL_CONVERSION=YES
+CLANG_WARN_OBJC_ROOT_CLASS=YES_ERROR
+CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER=YES
+CLANG_WARN_RANGE_LOOP_ANALYSIS=YES
+CLANG_WARN_STRICT_PROTOTYPES=YES
+CLANG_WARN_SUSPICIOUS_MOVE=YES
+CLANG_WARN_UNGUARDED_AVAILABILITY=YES_AGGRESSIVE
+CLANG_WARN_UNREACHABLE_CODE=YES
+CLANG_WARN__DUPLICATE_METHOD_MATCH=YES
+COPY_PHASE_STRIP=NO
+ENABLE_STRICT_OBJC_MSGSEND=YES
+ENABLE_TESTING_SEARCH_PATHS=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.1
+MTL_FAST_MATH=YES
+SDKROOT=iphoneos
+
+DEBUG_INFORMATION_FORMAT[config=Debug]=dwarf
+DEBUG_INFORMATION_FORMAT[config=Release]=dwarf-with-dsym
+ENABLE_NS_ASSERTIONS[config=Release]=NO
+ENABLE_TESTABILITY[config=Debug]=YES
+GCC_DYNAMIC_NO_PIC[config=Debug]=NO
+GCC_OPTIMIZATION_LEVEL[config=Debug]=0
+GCC_PREPROCESSOR_DEFINITIONS[config=Debug]=DEBUG=1 $(inherited)
+MTL_ENABLE_DEBUG_INFO[config=Debug]=INCLUDE_SOURCE
+MTL_ENABLE_DEBUG_INFO[config=Release]=NO
+ONLY_ACTIVE_ARCH[config=Debug]=YES
+SWIFT_ACTIVE_COMPILATION_CONDITIONS[config=Debug]=DEBUG
+SWIFT_COMPILATION_MODE[config=Release]=wholemodule
+SWIFT_OPTIMIZATION_LEVEL[config=Debug]=-Onone
+SWIFT_OPTIMIZATION_LEVEL[config=Release]=-O
+VALIDATE_PRODUCT[config=Release]=YES
\ No newline at end of file
diff --git a/xcconfigs/Flick.xcconfig b/xcconfigs/Flick.xcconfig
new file mode 100644
index 0000000..0de169a
--- /dev/null
+++ b/xcconfigs/Flick.xcconfig
@@ -0,0 +1,27 @@
+ASSETCATALOG_COMPILER_APPICON_NAME=AppIcon
+ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME=AccentColor
+CODE_SIGN_STYLE=Automatic
+CURRENT_PROJECT_VERSION=1
+DEVELOPMENT_ASSET_PATHS="Flick/Resources/Preview Content"
+DEVELOPMENT_TEAM=XK5AEQZHJU
+ENABLE_PREVIEWS=YES
+GENERATE_INFOPLIST_FILE=YES
+INFOPLIST_FILE=Flick/Info.plist
+INFOPLIST_KEY_LSApplicationCategoryType=public.app-category.entertainment
+INFOPLIST_KEY_UIApplicationSceneManifest_Generation=YES
+INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents=YES
+INFOPLIST_KEY_UISupportedInterfaceOrientations=UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown
+INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad=UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown
+IPHONEOS_DEPLOYMENT_TARGET=17.0
+MARKETING_VERSION=1.0
+PRODUCT_BUNDLE_IDENTIFIER=com.urlaunched.flick
+PRODUCT_NAME=$(TARGET_NAME)
+SUPPORTED_PLATFORMS=iphoneos iphonesimulator
+SUPPORTS_MACCATALYST=NO
+SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD=YES
+SWIFT_EMIT_LOC_STRINGS=YES
+SWIFT_VERSION=5.0
+TARGETED_DEVICE_FAMILY=1
+
+LD_RUNPATH_SEARCH_PATHS[config=Debug]=$(inherited) @executable_path/Frameworks
+LD_RUNPATH_SEARCH_PATHS[config=Release]=$(inherited) @executable_path/Frameworks
diff --git a/xcconfigs/SnapshotTests.xcconfig b/xcconfigs/SnapshotTests.xcconfig
new file mode 100644
index 0000000..f09a6a2
--- /dev/null
+++ b/xcconfigs/SnapshotTests.xcconfig
@@ -0,0 +1,16 @@
+BUNDLE_LOADER=$(TEST_HOST)
+CODE_SIGN_STYLE=Automatic
+CURRENT_PROJECT_VERSION=1
+DEVELOPMENT_TEAM=XK5AEQZHJU
+GENERATE_INFOPLIST_FILE=YES
+IPHONEOS_DEPLOYMENT_TARGET=17.0
+MARKETING_VERSION=1.0
+PRODUCT_NAME=$(TARGET_NAME)
+SUPPORTED_PLATFORMS=iphoneos iphonesimulator
+SUPPORTS_MACCATALYST=NO
+SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD=NO
+SWIFT_EMIT_LOC_STRINGS=NO
+SWIFT_VERSION=5.0
+TARGETED_DEVICE_FAMILY=1
+ENABLE_TESTING_SEARCH_PATHS=YES
+