diff --git a/Plugins/DependencyPlugin/ProjectDescriptionHelpers/Dependency+SPM.swift b/Plugins/DependencyPlugin/ProjectDescriptionHelpers/Dependency+SPM.swift
index 62fa6d7..66a888c 100644
--- a/Plugins/DependencyPlugin/ProjectDescriptionHelpers/Dependency+SPM.swift
+++ b/Plugins/DependencyPlugin/ProjectDescriptionHelpers/Dependency+SPM.swift
@@ -17,4 +17,5 @@ public extension TargetDependency.SPM {
static let KeychainSwift = TargetDependency.external(name: "KeychainSwift")
static let ReactorKit = TargetDependency.external(name: "ReactorKit")
static let RxGesture = TargetDependency.external(name: "RxGesture")
+ static let TextFieldEffets = TargetDependency.external(name: "TextFieldEffects")
}
diff --git a/Projects/App/Sources/AppDelegate.swift b/Projects/App/Sources/AppDelegate.swift
index 91c7ef6..b28704c 100644
--- a/Projects/App/Sources/AppDelegate.swift
+++ b/Projects/App/Sources/AppDelegate.swift
@@ -19,7 +19,8 @@ final class AppDelegate: UIResponder, UIApplicationDelegate {
) -> Bool {
assembler = Assembler([
- KeychainAssembly()
+ KeychainAssembly(),
+ PresentationAssembly()
], container: AppDelegate.container)
return true
}
diff --git a/Projects/Core/Sources/Steps/AppStep.swift b/Projects/Core/Sources/Steps/AppStep.swift
index 31a725d..80655af 100644
--- a/Projects/Core/Sources/Steps/AppStep.swift
+++ b/Projects/Core/Sources/Steps/AppStep.swift
@@ -2,4 +2,6 @@ import RxFlow
public enum AppStep: Step {
case onboardingIsRequired
+ case oauthLoginIsRequired
+ case tabIsRequired
}
diff --git a/Projects/Core/Sources/Steps/OauthLoginStep.swift b/Projects/Core/Sources/Steps/OauthLoginStep.swift
new file mode 100644
index 0000000..78f399d
--- /dev/null
+++ b/Projects/Core/Sources/Steps/OauthLoginStep.swift
@@ -0,0 +1,8 @@
+import RxFlow
+
+public enum OauthLoginStep: Step {
+ case oauthLoginIsRequired
+ case emailLoginisRequired
+ case emailSignupIsRequired
+ case tabIsRequired
+}
diff --git a/Projects/Core/Sources/Steps/OnboardingStep.swift b/Projects/Core/Sources/Steps/OnboardingStep.swift
new file mode 100644
index 0000000..2a67297
--- /dev/null
+++ b/Projects/Core/Sources/Steps/OnboardingStep.swift
@@ -0,0 +1,7 @@
+import RxFlow
+
+public enum OnboardingStep: Step {
+ case oauthLoginIsRequired
+ case tabIsRequired
+ case onboardingIsRequired
+}
diff --git a/Projects/Core/Sources/Steps/Singup/AgeSignupStep.swift b/Projects/Core/Sources/Steps/Singup/AgeSignupStep.swift
new file mode 100644
index 0000000..5389f2a
--- /dev/null
+++ b/Projects/Core/Sources/Steps/Singup/AgeSignupStep.swift
@@ -0,0 +1,7 @@
+import RxFlow
+
+public enum AgeSignupStep: Step {
+ case ageSignupIsRequired
+ case oauthLoginIsRequired
+ case proFilSignupIsRequired
+}
diff --git a/Projects/Core/Sources/Steps/Singup/EmailSignupStep.swift b/Projects/Core/Sources/Steps/Singup/EmailSignupStep.swift
new file mode 100644
index 0000000..402ba69
--- /dev/null
+++ b/Projects/Core/Sources/Steps/Singup/EmailSignupStep.swift
@@ -0,0 +1,7 @@
+import RxFlow
+
+public enum EmailSignupStep: Step {
+ case emailSignupIsRequired
+ case oauthLoginIsRequired
+ case passwordSignupIsrequired
+}
diff --git a/Projects/Core/Sources/Steps/Singup/NickNameSignupStep.swift b/Projects/Core/Sources/Steps/Singup/NickNameSignupStep.swift
new file mode 100644
index 0000000..586d708
--- /dev/null
+++ b/Projects/Core/Sources/Steps/Singup/NickNameSignupStep.swift
@@ -0,0 +1,7 @@
+import RxFlow
+
+public enum NickNameSignupStep: Step {
+ case ageSignupIsRequired
+ case oauthLoginIsRequired
+ case nickNameSignupIsRequired
+}
diff --git a/Projects/Core/Sources/Steps/Singup/PasswordSignupStep.swift b/Projects/Core/Sources/Steps/Singup/PasswordSignupStep.swift
new file mode 100644
index 0000000..2d75c63
--- /dev/null
+++ b/Projects/Core/Sources/Steps/Singup/PasswordSignupStep.swift
@@ -0,0 +1,7 @@
+import RxFlow
+
+public enum PasswordSignupStep: Step {
+ case oauthLoginIsRequired
+ case passwordSignupIsrequired
+ case nickNameSignupIsRequired
+}
diff --git a/Projects/Core/Sources/Steps/Singup/ProFilSignupStep.swift b/Projects/Core/Sources/Steps/Singup/ProFilSignupStep.swift
new file mode 100644
index 0000000..b82e37a
--- /dev/null
+++ b/Projects/Core/Sources/Steps/Singup/ProFilSignupStep.swift
@@ -0,0 +1,6 @@
+import RxFlow
+
+public enum ProFilSignupStep: Step {
+ case oauthLoginIsRequired
+ case proFilSignupIsRequired
+}
diff --git a/Projects/Flow/Sources/AgeSignupFlow.swift b/Projects/Flow/Sources/AgeSignupFlow.swift
new file mode 100644
index 0000000..f9f8cd0
--- /dev/null
+++ b/Projects/Flow/Sources/AgeSignupFlow.swift
@@ -0,0 +1,58 @@
+import UIKit
+import RxFlow
+import RxSwift
+import Core
+import Swinject
+import Presentation
+
+public final class AgeSignupFlow: Flow {
+ public let container: Container
+ public var root: Presentable {
+ return self.rootViewController
+ }
+
+ private let rootViewController: AgeSignupViewController
+
+ public init(container: Container) {
+ self.container = container
+ self.rootViewController = container.resolve(AgeSignupViewController.self)!
+ }
+
+ public func navigate(to step: Step) -> FlowContributors {
+ guard let step = step as? AgeSignupStep else { return .none }
+
+ switch step {
+ case .ageSignupIsRequired:
+ return navigationToAgeSignup()
+ case .proFilSignupIsRequired:
+ return navigationToProFilSignup()
+ case .oauthLoginIsRequired:
+ return .end(forwardToParentFlowWithStep: NickNameSignupStep.oauthLoginIsRequired)
+ }
+ }
+}
+
+private extension AgeSignupFlow {
+ func navigationToAgeSignup() -> FlowContributors {
+ return .one(flowContributor: .contribute(
+ withNextPresentable: rootViewController,
+ withNextStepper: rootViewController.reactor
+ ))
+ }
+
+ func navigationToProFilSignup() -> FlowContributors {
+ let profilSignupFlow = ProFilSignupFlow(container: container)
+
+ Flows.use(profilSignupFlow, when: .created) { (root) in
+ self.rootViewController.navigationController?.pushViewController(
+ root,
+ animated: true
+ )
+ }
+
+ return .one(flowContributor: .contribute(
+ withNextPresentable: rootViewController,
+ withNextStepper: rootViewController.reactor
+ ))
+ }
+}
diff --git a/Projects/Flow/Sources/AppFlow.swift b/Projects/Flow/Sources/AppFlow.swift
index 338892c..cc67c6b 100644
--- a/Projects/Flow/Sources/AppFlow.swift
+++ b/Projects/Flow/Sources/AppFlow.swift
@@ -12,12 +12,9 @@ public final class AppFlow: Flow {
return self.window
}
- private let rootViewController: MainViewController
-
public init(window: UIWindow, container: Container) {
self.window = window
self.container = container
- self.rootViewController = MainViewController(MainReactor())
}
public func navigate(to step: Step) -> FlowContributors {
@@ -26,18 +23,60 @@ public final class AppFlow: Flow {
switch step {
case .onboardingIsRequired:
return navigationToOnboarding()
+ case .oauthLoginIsRequired:
+ return navigationToOauthLogin()
+ case .tabIsRequired:
+ return navigationToTab()
}
}
}
private extension AppFlow {
func navigationToOnboarding() -> FlowContributors {
- self.window.rootViewController = rootViewController
- return .one(
- flowContributor: .contribute(
- withNextPresentable: rootViewController,
- withNextStepper: rootViewController.reactor
- )
- )
+ let onboardingFlow = OnboardingFlow(container: container)
+
+ Flows.use(onboardingFlow, when: .created) { (root) in
+ self.window.rootViewController = root
+ }
+
+ return .one(flowContributor: .contribute(
+ withNextPresentable: onboardingFlow,
+ withNextStepper: OneStepper(withSingleStep: OnboardingStep.onboardingIsRequired)
+ ))
+ }
+
+ func navigationToOauthLogin() -> FlowContributors {
+ let oauthLoginFlow = OauthLoginFlow(container: container)
+
+ Flows.use(oauthLoginFlow, when: .created) { (root) in
+ UIView.transition(
+ with: self.window,
+ duration: 0.5,
+ options: .transitionCrossDissolve
+ ) {
+ self.window.rootViewController = root
+ }
+ }
+
+ return .one(flowContributor: .contribute(
+ withNextPresentable: oauthLoginFlow,
+ withNextStepper: OneStepper(withSingleStep: OauthLoginStep.oauthLoginIsRequired)
+ ))
+ }
+
+ func navigationToTab() -> FlowContributors {
+ let mainViewController = container.resolve(MainViewController.self)!
+ UIView.transition(
+ with: self.window,
+ duration: 0.5,
+ options: .transitionCrossDissolve
+ ) {
+ self.window.rootViewController = mainViewController
+ }
+
+ return .one(flowContributor: .contribute(
+ withNextPresentable: mainViewController,
+ withNextStepper: mainViewController.reactor
+ ))
}
}
diff --git a/Projects/Flow/Sources/EmailSignupFlow.swift b/Projects/Flow/Sources/EmailSignupFlow.swift
new file mode 100644
index 0000000..2328581
--- /dev/null
+++ b/Projects/Flow/Sources/EmailSignupFlow.swift
@@ -0,0 +1,58 @@
+import UIKit
+import RxFlow
+import RxSwift
+import Core
+import Swinject
+import Presentation
+
+public final class EmailSignupFlow: Flow {
+ public let container: Container
+ public var root: Presentable {
+ return self.rootViewController
+ }
+
+ private let rootViewController: EmailSignupViewController
+
+ public init(container: Container) {
+ self.container = container
+ self.rootViewController = container.resolve(EmailSignupViewController.self)!
+ }
+
+ public func navigate(to step: Step) -> FlowContributors {
+ guard let step = step as? EmailSignupStep else { return .none }
+
+ switch step {
+ case .emailSignupIsRequired:
+ return navigationToEmailSignup()
+ case .passwordSignupIsrequired:
+ return navigationToPasswordSignup()
+ case .oauthLoginIsRequired:
+ return .end(forwardToParentFlowWithStep: OauthLoginStep.oauthLoginIsRequired)
+ }
+ }
+}
+
+private extension EmailSignupFlow {
+ func navigationToEmailSignup() -> FlowContributors {
+ return .one(flowContributor: .contribute(
+ withNextPresentable: rootViewController,
+ withNextStepper: rootViewController.reactor
+ ))
+ }
+
+ func navigationToPasswordSignup() -> FlowContributors {
+ let passwordSignupFlow = PasswordSignupFlow(container: container)
+
+ Flows.use(passwordSignupFlow, when: .created) { (root) in
+ self.rootViewController.navigationController?.pushViewController(
+ root,
+ animated: true
+ )
+ }
+
+ return .one(flowContributor: .contribute(
+ withNextPresentable: passwordSignupFlow,
+ withNextStepper: OneStepper(withSingleStep: PasswordSignupStep.passwordSignupIsrequired)
+ ))
+ }
+}
diff --git a/Projects/Flow/Sources/NickNameSignupFlow.swift b/Projects/Flow/Sources/NickNameSignupFlow.swift
new file mode 100644
index 0000000..256b42c
--- /dev/null
+++ b/Projects/Flow/Sources/NickNameSignupFlow.swift
@@ -0,0 +1,58 @@
+import UIKit
+import RxFlow
+import RxSwift
+import Core
+import Swinject
+import Presentation
+
+public final class NickNameSignupFlow: Flow {
+ public let container: Container
+ public var root: Presentable {
+ return self.rootViewController
+ }
+
+ private let rootViewController: NickNameSignupViewController
+
+ public init(container: Container) {
+ self.container = container
+ self.rootViewController = container.resolve(NickNameSignupViewController.self)!
+ }
+
+ public func navigate(to step: Step) -> FlowContributors {
+ guard let step = step as? NickNameSignupStep else { return .none }
+
+ switch step {
+ case .ageSignupIsRequired:
+ return navigationToAgeSignup()
+ case .oauthLoginIsRequired:
+ return .end(forwardToParentFlowWithStep: PasswordSignupStep.oauthLoginIsRequired)
+ case .nickNameSignupIsRequired:
+ return navigationToNickNameSignup()
+ }
+ }
+}
+
+private extension NickNameSignupFlow {
+ func navigationToNickNameSignup() -> FlowContributors {
+ return .one(flowContributor: .contribute(
+ withNextPresentable: rootViewController,
+ withNextStepper: rootViewController.reactor
+ ))
+ }
+
+ func navigationToAgeSignup() -> FlowContributors {
+ let ageSignupFlow = AgeSignupFlow(container: container)
+
+ Flows.use(ageSignupFlow, when: .created) { (root) in
+ self.rootViewController.navigationController?.pushViewController(
+ root,
+ animated: true
+ )
+ }
+
+ return .one(flowContributor: .contribute(
+ withNextPresentable: ageSignupFlow,
+ withNextStepper: OneStepper(withSingleStep: AgeSignupStep.ageSignupIsRequired)
+ ))
+ }
+}
diff --git a/Projects/Flow/Sources/OauthLoginFlow.swift b/Projects/Flow/Sources/OauthLoginFlow.swift
new file mode 100644
index 0000000..d78ed96
--- /dev/null
+++ b/Projects/Flow/Sources/OauthLoginFlow.swift
@@ -0,0 +1,78 @@
+import UIKit
+import RxFlow
+import RxSwift
+import Core
+import Swinject
+import Presentation
+
+public final class OauthLoginFlow: Flow {
+ public let container: Container
+ public var root: Presentable {
+ return self.rootViewController
+ }
+
+ private let rootViewController: BaseNavigationController
+
+ public init(container: Container) {
+ self.container = container
+ self.rootViewController = BaseNavigationController()
+ }
+
+ public func navigate(to step: Step) -> FlowContributors {
+ guard let step = step as? OauthLoginStep else { return .none }
+
+ switch step {
+ case .oauthLoginIsRequired:
+ return navigationToOauthLogin()
+ case .emailLoginisRequired:
+ return navigationToEmailLogin()
+ case .emailSignupIsRequired:
+ return navigationToEmailSignup()
+ case .tabIsRequired:
+ return .end(forwardToParentFlowWithStep: OnboardingStep.tabIsRequired)
+ }
+ }
+}
+
+private extension OauthLoginFlow {
+ func navigationToOauthLogin() -> FlowContributors {
+ let oauthLoginViewController = container.resolve(OauthLoginViewController.self)!
+
+ self.rootViewController.setViewControllers(
+ [oauthLoginViewController],
+ animated: true
+ )
+
+ return .one(flowContributor: .contribute(
+ withNextPresentable: oauthLoginViewController,
+ withNextStepper: oauthLoginViewController.reactor
+ ))
+ }
+
+ func navigationToEmailLogin() -> FlowContributors {
+ let emailLoginViewController = container.resolve(EmailLoginViewController.self)!
+
+ self.rootViewController.pushViewController(
+ emailLoginViewController,
+ animated: true
+ )
+
+ return .one(flowContributor: .contribute(
+ withNextPresentable: emailLoginViewController,
+ withNextStepper: emailLoginViewController.reactor
+ ))
+ }
+
+ func navigationToEmailSignup() -> FlowContributors {
+ let emailSignupFlow = EmailSignupFlow(container: container)
+
+ Flows.use(emailSignupFlow, when: .created) { (root) in
+ self.rootViewController.pushViewController(root, animated: true)
+ }
+
+ return .one(flowContributor: .contribute(
+ withNextPresentable: emailSignupFlow,
+ withNextStepper: OneStepper(withSingleStep: EmailSignupStep.emailSignupIsRequired)
+ ))
+ }
+}
diff --git a/Projects/Flow/Sources/OnboardingFlow.swift b/Projects/Flow/Sources/OnboardingFlow.swift
new file mode 100644
index 0000000..d50d035
--- /dev/null
+++ b/Projects/Flow/Sources/OnboardingFlow.swift
@@ -0,0 +1,44 @@
+import UIKit
+import RxFlow
+import RxSwift
+import Core
+import Swinject
+import Presentation
+
+public final class OnboardingFlow: Flow {
+ public let container: Container
+ public var root: Presentable {
+ return self.rootViewController
+ }
+
+ private let rootViewController: OnboardingViewController
+
+ public init(container: Container) {
+ self.container = container
+ self.rootViewController = container.resolve(OnboardingViewController.self)!
+ }
+
+ public func navigate(to step: Step) -> FlowContributors {
+ guard let step = step as? OnboardingStep else { return .none }
+
+ switch step {
+ case .onboardingIsRequired:
+ return navigationToOnboarding()
+
+ case .oauthLoginIsRequired:
+ return .end(forwardToParentFlowWithStep: AppStep.oauthLoginIsRequired)
+
+ case .tabIsRequired:
+ return .end(forwardToParentFlowWithStep: AppStep.tabIsRequired)
+ }
+ }
+}
+
+private extension OnboardingFlow {
+ func navigationToOnboarding() -> FlowContributors {
+ return .one(flowContributor: .contribute(
+ withNextPresentable: rootViewController,
+ withNextStepper: rootViewController.reactor
+ ))
+ }
+}
diff --git a/Projects/Flow/Sources/PasswordSignupFlow.swift b/Projects/Flow/Sources/PasswordSignupFlow.swift
new file mode 100644
index 0000000..27709e5
--- /dev/null
+++ b/Projects/Flow/Sources/PasswordSignupFlow.swift
@@ -0,0 +1,57 @@
+import UIKit
+import RxFlow
+import RxSwift
+import Core
+import Swinject
+import Presentation
+
+public final class PasswordSignupFlow: Flow {
+ public let container: Container
+ public var root: Presentable {
+ return self.rootViewController
+ }
+
+ private let rootViewController: PasswordSignupViewController
+
+ public init(container: Container) {
+ self.container = container
+ self.rootViewController = container.resolve(PasswordSignupViewController.self)!
+ }
+
+ public func navigate(to step: Step) -> FlowContributors {
+ guard let step = step as? PasswordSignupStep else { return .none }
+
+ switch step {
+ case .passwordSignupIsrequired:
+ return navigationToPasswordSignup()
+ case .nickNameSignupIsRequired:
+ return navigationToNickNameSignup()
+ case .oauthLoginIsRequired:
+ return .end(forwardToParentFlowWithStep: EmailSignupStep.oauthLoginIsRequired)
+ }
+ }
+}
+
+private extension PasswordSignupFlow {
+ func navigationToPasswordSignup() -> FlowContributors {
+ return .one(flowContributor: .contribute(
+ withNextPresentable: rootViewController,
+ withNextStepper: rootViewController.reactor
+ ))
+ }
+
+ func navigationToNickNameSignup() -> FlowContributors {
+ let nickNameSignupFlow = NickNameSignupFlow(container: container)
+ Flows.use(nickNameSignupFlow, when: .created) { (root) in
+ self.rootViewController.navigationController?.pushViewController(
+ root,
+ animated: true
+ )
+ }
+
+ return .one(flowContributor: .contribute(
+ withNextPresentable: nickNameSignupFlow,
+ withNextStepper: OneStepper(withSingleStep: NickNameSignupStep.nickNameSignupIsRequired)
+ ))
+ }
+}
diff --git a/Projects/Flow/Sources/ProFilSignupFlow.swift b/Projects/Flow/Sources/ProFilSignupFlow.swift
new file mode 100644
index 0000000..ae84753
--- /dev/null
+++ b/Projects/Flow/Sources/ProFilSignupFlow.swift
@@ -0,0 +1,41 @@
+import UIKit
+import RxFlow
+import RxSwift
+import Core
+import Swinject
+import Presentation
+
+public final class ProFilSignupFlow: Flow {
+ public let container: Container
+ public var root: Presentable {
+ return self.rootViewController
+ }
+
+ private let rootViewController: ProfilSignupViewController
+
+ public init(container: Container) {
+ self.container = container
+ self.rootViewController = container.resolve(ProfilSignupViewController.self)!
+ }
+
+ public func navigate(to step: Step) -> FlowContributors {
+ guard let step = step as? ProFilSignupStep else { return .none }
+
+ switch step {
+ case .proFilSignupIsRequired:
+ return navigationToProfilSignup()
+
+ case .oauthLoginIsRequired:
+ return .end(forwardToParentFlowWithStep: AgeSignupStep.oauthLoginIsRequired)
+ }
+ }
+}
+
+private extension ProFilSignupFlow {
+ func navigationToProfilSignup() -> FlowContributors {
+ return .one(flowContributor: .contribute(
+ withNextPresentable: rootViewController,
+ withNextStepper: rootViewController.reactor
+ ))
+ }
+}
diff --git a/Projects/Modules/DesignSystem/Resources/Colors/Primary.xcassets/Contents.json b/Projects/Modules/DesignSystem/Resources/Colors/Error.xcassets/Contents.json
similarity index 100%
rename from Projects/Modules/DesignSystem/Resources/Colors/Primary.xcassets/Contents.json
rename to Projects/Modules/DesignSystem/Resources/Colors/Error.xcassets/Contents.json
diff --git a/Projects/Modules/DesignSystem/Resources/Colors/Error.xcassets/Error 500.colorset/Contents.json b/Projects/Modules/DesignSystem/Resources/Colors/Error.xcassets/Error 500.colorset/Contents.json
new file mode 100644
index 0000000..eb61fb8
--- /dev/null
+++ b/Projects/Modules/DesignSystem/Resources/Colors/Error.xcassets/Error 500.colorset/Contents.json
@@ -0,0 +1,20 @@
+{
+ "colors" : [
+ {
+ "color" : {
+ "color-space" : "display-p3",
+ "components" : {
+ "alpha" : "1.000",
+ "blue" : "0x41",
+ "green" : "0x3C",
+ "red" : "0xDD"
+ }
+ },
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Projects/Modules/DesignSystem/Resources/Colors/Error.xcassets/Error 600.colorset/Contents.json b/Projects/Modules/DesignSystem/Resources/Colors/Error.xcassets/Error 600.colorset/Contents.json
new file mode 100644
index 0000000..1ff3f9a
--- /dev/null
+++ b/Projects/Modules/DesignSystem/Resources/Colors/Error.xcassets/Error 600.colorset/Contents.json
@@ -0,0 +1,20 @@
+{
+ "colors" : [
+ {
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "alpha" : "1.000",
+ "blue" : "0x29",
+ "green" : "0x23",
+ "red" : "0xC7"
+ }
+ },
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Projects/Modules/DesignSystem/Resources/Colors/Error.xcassets/Error 700.colorset/Contents.json b/Projects/Modules/DesignSystem/Resources/Colors/Error.xcassets/Error 700.colorset/Contents.json
new file mode 100644
index 0000000..35438ac
--- /dev/null
+++ b/Projects/Modules/DesignSystem/Resources/Colors/Error.xcassets/Error 700.colorset/Contents.json
@@ -0,0 +1,20 @@
+{
+ "colors" : [
+ {
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "alpha" : "1.000",
+ "blue" : "0x21",
+ "green" : "0x1C",
+ "red" : "0xA0"
+ }
+ },
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Projects/Modules/DesignSystem/Resources/Colors/Error.xcassets/Error 800.colorset/Contents.json b/Projects/Modules/DesignSystem/Resources/Colors/Error.xcassets/Error 800.colorset/Contents.json
new file mode 100644
index 0000000..9bc82d4
--- /dev/null
+++ b/Projects/Modules/DesignSystem/Resources/Colors/Error.xcassets/Error 800.colorset/Contents.json
@@ -0,0 +1,20 @@
+{
+ "colors" : [
+ {
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "alpha" : "1.000",
+ "blue" : "0x19",
+ "green" : "0x15",
+ "red" : "0x79"
+ }
+ },
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Projects/Modules/DesignSystem/Resources/Colors/Error.xcassets/Error 900.colorset/Contents.json b/Projects/Modules/DesignSystem/Resources/Colors/Error.xcassets/Error 900.colorset/Contents.json
new file mode 100644
index 0000000..1b344eb
--- /dev/null
+++ b/Projects/Modules/DesignSystem/Resources/Colors/Error.xcassets/Error 900.colorset/Contents.json
@@ -0,0 +1,20 @@
+{
+ "colors" : [
+ {
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "alpha" : "1.000",
+ "blue" : "0x11",
+ "green" : "0x0F",
+ "red" : "0x52"
+ }
+ },
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Projects/Modules/DesignSystem/Resources/Colors/GrayScale.xcassets/Gray 10.colorset/Contents.json b/Projects/Modules/DesignSystem/Resources/Colors/GrayScale.xcassets/Gray 10.colorset/Contents.json
deleted file mode 100644
index 9c0e331..0000000
--- a/Projects/Modules/DesignSystem/Resources/Colors/GrayScale.xcassets/Gray 10.colorset/Contents.json
+++ /dev/null
@@ -1,38 +0,0 @@
-{
- "colors" : [
- {
- "color" : {
- "color-space" : "srgb",
- "components" : {
- "alpha" : "1.000",
- "blue" : "0xFF",
- "green" : "0xFF",
- "red" : "0xFF"
- }
- },
- "idiom" : "universal"
- },
- {
- "appearances" : [
- {
- "appearance" : "luminosity",
- "value" : "dark"
- }
- ],
- "color" : {
- "color-space" : "srgb",
- "components" : {
- "alpha" : "1.000",
- "blue" : "0x00",
- "green" : "0x00",
- "red" : "0x00"
- }
- },
- "idiom" : "universal"
- }
- ],
- "info" : {
- "author" : "xcode",
- "version" : 1
- }
-}
diff --git a/Projects/Modules/DesignSystem/Resources/Colors/GrayScale.xcassets/Gray 100.colorset/Contents.json b/Projects/Modules/DesignSystem/Resources/Colors/GrayScale.xcassets/Gray 100.colorset/Contents.json
new file mode 100644
index 0000000..cdbd517
--- /dev/null
+++ b/Projects/Modules/DesignSystem/Resources/Colors/GrayScale.xcassets/Gray 100.colorset/Contents.json
@@ -0,0 +1,20 @@
+{
+ "colors" : [
+ {
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "alpha" : "1.000",
+ "blue" : "0xE8",
+ "green" : "0xE8",
+ "red" : "0xE8"
+ }
+ },
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Projects/Modules/DesignSystem/Resources/Colors/GrayScale.xcassets/Gray 20.colorset/Contents.json b/Projects/Modules/DesignSystem/Resources/Colors/GrayScale.xcassets/Gray 20.colorset/Contents.json
deleted file mode 100644
index 3992d5e..0000000
--- a/Projects/Modules/DesignSystem/Resources/Colors/GrayScale.xcassets/Gray 20.colorset/Contents.json
+++ /dev/null
@@ -1,38 +0,0 @@
-{
- "colors" : [
- {
- "color" : {
- "color-space" : "srgb",
- "components" : {
- "alpha" : "1.000",
- "blue" : "0xFA",
- "green" : "0xFA",
- "red" : "0xFA"
- }
- },
- "idiom" : "universal"
- },
- {
- "appearances" : [
- {
- "appearance" : "luminosity",
- "value" : "dark"
- }
- ],
- "color" : {
- "color-space" : "srgb",
- "components" : {
- "alpha" : "1.000",
- "blue" : "0x06",
- "green" : "0x06",
- "red" : "0x06"
- }
- },
- "idiom" : "universal"
- }
- ],
- "info" : {
- "author" : "xcode",
- "version" : 1
- }
-}
diff --git a/Projects/Modules/DesignSystem/Resources/Colors/GrayScale.xcassets/Gray 200.colorset/Contents.json b/Projects/Modules/DesignSystem/Resources/Colors/GrayScale.xcassets/Gray 200.colorset/Contents.json
new file mode 100644
index 0000000..b12f300
--- /dev/null
+++ b/Projects/Modules/DesignSystem/Resources/Colors/GrayScale.xcassets/Gray 200.colorset/Contents.json
@@ -0,0 +1,20 @@
+{
+ "colors" : [
+ {
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "alpha" : "1.000",
+ "blue" : "0xD1",
+ "green" : "0xD1",
+ "red" : "0xD1"
+ }
+ },
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Projects/Modules/DesignSystem/Resources/Colors/GrayScale.xcassets/Gray 30.colorset/Contents.json b/Projects/Modules/DesignSystem/Resources/Colors/GrayScale.xcassets/Gray 30.colorset/Contents.json
deleted file mode 100644
index 1312148..0000000
--- a/Projects/Modules/DesignSystem/Resources/Colors/GrayScale.xcassets/Gray 30.colorset/Contents.json
+++ /dev/null
@@ -1,38 +0,0 @@
-{
- "colors" : [
- {
- "color" : {
- "color-space" : "srgb",
- "components" : {
- "alpha" : "1.000",
- "blue" : "0xF7",
- "green" : "0xF7",
- "red" : "0xF7"
- }
- },
- "idiom" : "universal"
- },
- {
- "appearances" : [
- {
- "appearance" : "luminosity",
- "value" : "dark"
- }
- ],
- "color" : {
- "color-space" : "srgb",
- "components" : {
- "alpha" : "1.000",
- "blue" : "0x19",
- "green" : "0x19",
- "red" : "0x19"
- }
- },
- "idiom" : "universal"
- }
- ],
- "info" : {
- "author" : "xcode",
- "version" : 1
- }
-}
diff --git a/Projects/Modules/DesignSystem/Resources/Colors/GrayScale.xcassets/Gray 300.colorset/Contents.json b/Projects/Modules/DesignSystem/Resources/Colors/GrayScale.xcassets/Gray 300.colorset/Contents.json
new file mode 100644
index 0000000..e7f5f04
--- /dev/null
+++ b/Projects/Modules/DesignSystem/Resources/Colors/GrayScale.xcassets/Gray 300.colorset/Contents.json
@@ -0,0 +1,20 @@
+{
+ "colors" : [
+ {
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "alpha" : "1.000",
+ "blue" : "0xBA",
+ "green" : "0xBA",
+ "red" : "0xBA"
+ }
+ },
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Projects/Modules/DesignSystem/Resources/Colors/GrayScale.xcassets/Gray 40.colorset/Contents.json b/Projects/Modules/DesignSystem/Resources/Colors/GrayScale.xcassets/Gray 40.colorset/Contents.json
deleted file mode 100644
index dbdddfe..0000000
--- a/Projects/Modules/DesignSystem/Resources/Colors/GrayScale.xcassets/Gray 40.colorset/Contents.json
+++ /dev/null
@@ -1,38 +0,0 @@
-{
- "colors" : [
- {
- "color" : {
- "color-space" : "srgb",
- "components" : {
- "alpha" : "1.000",
- "blue" : "0xE5",
- "green" : "0xE5",
- "red" : "0xE5"
- }
- },
- "idiom" : "universal"
- },
- {
- "appearances" : [
- {
- "appearance" : "luminosity",
- "value" : "dark"
- }
- ],
- "color" : {
- "color-space" : "srgb",
- "components" : {
- "alpha" : "1.000",
- "blue" : "0x33",
- "green" : "0x33",
- "red" : "0x33"
- }
- },
- "idiom" : "universal"
- }
- ],
- "info" : {
- "author" : "xcode",
- "version" : 1
- }
-}
diff --git a/Projects/Modules/DesignSystem/Resources/Colors/GrayScale.xcassets/Gray 400.colorset/Contents.json b/Projects/Modules/DesignSystem/Resources/Colors/GrayScale.xcassets/Gray 400.colorset/Contents.json
new file mode 100644
index 0000000..7c54d54
--- /dev/null
+++ b/Projects/Modules/DesignSystem/Resources/Colors/GrayScale.xcassets/Gray 400.colorset/Contents.json
@@ -0,0 +1,20 @@
+{
+ "colors" : [
+ {
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "alpha" : "1.000",
+ "blue" : "0xA3",
+ "green" : "0xA3",
+ "red" : "0xA3"
+ }
+ },
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Projects/Modules/DesignSystem/Resources/Colors/GrayScale.xcassets/Gray 50.colorset/Contents.json b/Projects/Modules/DesignSystem/Resources/Colors/GrayScale.xcassets/Gray 50.colorset/Contents.json
index b17f649..03cea30 100644
--- a/Projects/Modules/DesignSystem/Resources/Colors/GrayScale.xcassets/Gray 50.colorset/Contents.json
+++ b/Projects/Modules/DesignSystem/Resources/Colors/GrayScale.xcassets/Gray 50.colorset/Contents.json
@@ -5,27 +5,9 @@
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
- "blue" : "0xCC",
- "green" : "0xCC",
- "red" : "0xCC"
- }
- },
- "idiom" : "universal"
- },
- {
- "appearances" : [
- {
- "appearance" : "luminosity",
- "value" : "dark"
- }
- ],
- "color" : {
- "color-space" : "srgb",
- "components" : {
- "alpha" : "1.000",
- "blue" : "0x54",
- "green" : "0x54",
- "red" : "0x54"
+ "blue" : "0xF2",
+ "green" : "0xF2",
+ "red" : "0xF2"
}
},
"idiom" : "universal"
diff --git a/Projects/Modules/DesignSystem/Resources/Colors/GrayScale.xcassets/Gray 500.colorset/Contents.json b/Projects/Modules/DesignSystem/Resources/Colors/GrayScale.xcassets/Gray 500.colorset/Contents.json
new file mode 100644
index 0000000..2e4a98b
--- /dev/null
+++ b/Projects/Modules/DesignSystem/Resources/Colors/GrayScale.xcassets/Gray 500.colorset/Contents.json
@@ -0,0 +1,20 @@
+{
+ "colors" : [
+ {
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "alpha" : "1.000",
+ "blue" : "0x8C",
+ "green" : "0x8C",
+ "red" : "0x8C"
+ }
+ },
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Projects/Modules/DesignSystem/Resources/Colors/GrayScale.xcassets/Gray 60.colorset/Contents.json b/Projects/Modules/DesignSystem/Resources/Colors/GrayScale.xcassets/Gray 60.colorset/Contents.json
deleted file mode 100644
index fa07791..0000000
--- a/Projects/Modules/DesignSystem/Resources/Colors/GrayScale.xcassets/Gray 60.colorset/Contents.json
+++ /dev/null
@@ -1,38 +0,0 @@
-{
- "colors" : [
- {
- "color" : {
- "color-space" : "srgb",
- "components" : {
- "alpha" : "1.000",
- "blue" : "0x7F",
- "green" : "0x7F",
- "red" : "0x7F"
- }
- },
- "idiom" : "universal"
- },
- {
- "appearances" : [
- {
- "appearance" : "luminosity",
- "value" : "dark"
- }
- ],
- "color" : {
- "color-space" : "srgb",
- "components" : {
- "alpha" : "1.000",
- "blue" : "0x8E",
- "green" : "0x8E",
- "red" : "0x8E"
- }
- },
- "idiom" : "universal"
- }
- ],
- "info" : {
- "author" : "xcode",
- "version" : 1
- }
-}
diff --git a/Projects/Modules/DesignSystem/Resources/Colors/GrayScale.xcassets/Gray 600.colorset/Contents.json b/Projects/Modules/DesignSystem/Resources/Colors/GrayScale.xcassets/Gray 600.colorset/Contents.json
new file mode 100644
index 0000000..656af9d
--- /dev/null
+++ b/Projects/Modules/DesignSystem/Resources/Colors/GrayScale.xcassets/Gray 600.colorset/Contents.json
@@ -0,0 +1,20 @@
+{
+ "colors" : [
+ {
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "alpha" : "1.000",
+ "blue" : "0x75",
+ "green" : "0x75",
+ "red" : "0x75"
+ }
+ },
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Projects/Modules/DesignSystem/Resources/Colors/GrayScale.xcassets/Gray 70.colorset/Contents.json b/Projects/Modules/DesignSystem/Resources/Colors/GrayScale.xcassets/Gray 70.colorset/Contents.json
deleted file mode 100644
index dfe22ef..0000000
--- a/Projects/Modules/DesignSystem/Resources/Colors/GrayScale.xcassets/Gray 70.colorset/Contents.json
+++ /dev/null
@@ -1,38 +0,0 @@
-{
- "colors" : [
- {
- "color" : {
- "color-space" : "srgb",
- "components" : {
- "alpha" : "1.000",
- "blue" : "0x44",
- "green" : "0x44",
- "red" : "0x44"
- }
- },
- "idiom" : "universal"
- },
- {
- "appearances" : [
- {
- "appearance" : "luminosity",
- "value" : "dark"
- }
- ],
- "color" : {
- "color-space" : "srgb",
- "components" : {
- "alpha" : "1.000",
- "blue" : "0xD9",
- "green" : "0xD9",
- "red" : "0xD9"
- }
- },
- "idiom" : "universal"
- }
- ],
- "info" : {
- "author" : "xcode",
- "version" : 1
- }
-}
diff --git a/Projects/Modules/DesignSystem/Resources/Colors/GrayScale.xcassets/Gray 700.colorset/Contents.json b/Projects/Modules/DesignSystem/Resources/Colors/GrayScale.xcassets/Gray 700.colorset/Contents.json
new file mode 100644
index 0000000..89a0900
--- /dev/null
+++ b/Projects/Modules/DesignSystem/Resources/Colors/GrayScale.xcassets/Gray 700.colorset/Contents.json
@@ -0,0 +1,20 @@
+{
+ "colors" : [
+ {
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "alpha" : "1.000",
+ "blue" : "0x5E",
+ "green" : "0x5E",
+ "red" : "0x5E"
+ }
+ },
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Projects/Modules/DesignSystem/Resources/Colors/GrayScale.xcassets/Gray 80.colorset/Contents.json b/Projects/Modules/DesignSystem/Resources/Colors/GrayScale.xcassets/Gray 80.colorset/Contents.json
deleted file mode 100644
index b9e6e23..0000000
--- a/Projects/Modules/DesignSystem/Resources/Colors/GrayScale.xcassets/Gray 80.colorset/Contents.json
+++ /dev/null
@@ -1,38 +0,0 @@
-{
- "colors" : [
- {
- "color" : {
- "color-space" : "srgb",
- "components" : {
- "alpha" : "1.000",
- "blue" : "0x33",
- "green" : "0x33",
- "red" : "0x33"
- }
- },
- "idiom" : "universal"
- },
- {
- "appearances" : [
- {
- "appearance" : "luminosity",
- "value" : "dark"
- }
- ],
- "color" : {
- "color-space" : "srgb",
- "components" : {
- "alpha" : "1.000",
- "blue" : "0xEE",
- "green" : "0xEE",
- "red" : "0xEE"
- }
- },
- "idiom" : "universal"
- }
- ],
- "info" : {
- "author" : "xcode",
- "version" : 1
- }
-}
diff --git a/Projects/Modules/DesignSystem/Resources/Colors/GrayScale.xcassets/Gray 800.colorset/Contents.json b/Projects/Modules/DesignSystem/Resources/Colors/GrayScale.xcassets/Gray 800.colorset/Contents.json
new file mode 100644
index 0000000..c4269d2
--- /dev/null
+++ b/Projects/Modules/DesignSystem/Resources/Colors/GrayScale.xcassets/Gray 800.colorset/Contents.json
@@ -0,0 +1,20 @@
+{
+ "colors" : [
+ {
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "alpha" : "1.000",
+ "blue" : "0x47",
+ "green" : "0x47",
+ "red" : "0x47"
+ }
+ },
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Projects/Modules/DesignSystem/Resources/Colors/GrayScale.xcassets/Gray 90.colorset/Contents.json b/Projects/Modules/DesignSystem/Resources/Colors/GrayScale.xcassets/Gray 90.colorset/Contents.json
deleted file mode 100644
index 2e89419..0000000
--- a/Projects/Modules/DesignSystem/Resources/Colors/GrayScale.xcassets/Gray 90.colorset/Contents.json
+++ /dev/null
@@ -1,38 +0,0 @@
-{
- "colors" : [
- {
- "color" : {
- "color-space" : "srgb",
- "components" : {
- "alpha" : "1.000",
- "blue" : "0.000",
- "green" : "0.000",
- "red" : "0.000"
- }
- },
- "idiom" : "universal"
- },
- {
- "appearances" : [
- {
- "appearance" : "luminosity",
- "value" : "dark"
- }
- ],
- "color" : {
- "color-space" : "srgb",
- "components" : {
- "alpha" : "1.000",
- "blue" : "0xFF",
- "green" : "0xFF",
- "red" : "0xFF"
- }
- },
- "idiom" : "universal"
- }
- ],
- "info" : {
- "author" : "xcode",
- "version" : 1
- }
-}
diff --git a/Projects/Modules/DesignSystem/Resources/Colors/GrayScale.xcassets/Gray 900.colorset/Contents.json b/Projects/Modules/DesignSystem/Resources/Colors/GrayScale.xcassets/Gray 900.colorset/Contents.json
new file mode 100644
index 0000000..2439073
--- /dev/null
+++ b/Projects/Modules/DesignSystem/Resources/Colors/GrayScale.xcassets/Gray 900.colorset/Contents.json
@@ -0,0 +1,20 @@
+{
+ "colors" : [
+ {
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "alpha" : "1.000",
+ "blue" : "0x30",
+ "green" : "0x30",
+ "red" : "0x30"
+ }
+ },
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Projects/Modules/DesignSystem/Resources/Colors/Sub.xcassets/Contents.json b/Projects/Modules/DesignSystem/Resources/Colors/Main.xcassets/Contents.json
similarity index 100%
rename from Projects/Modules/DesignSystem/Resources/Colors/Sub.xcassets/Contents.json
rename to Projects/Modules/DesignSystem/Resources/Colors/Main.xcassets/Contents.json
diff --git a/Projects/Modules/DesignSystem/Resources/Colors/Main.xcassets/Main 100.colorset/Contents.json b/Projects/Modules/DesignSystem/Resources/Colors/Main.xcassets/Main 100.colorset/Contents.json
new file mode 100644
index 0000000..1b83cf9
--- /dev/null
+++ b/Projects/Modules/DesignSystem/Resources/Colors/Main.xcassets/Main 100.colorset/Contents.json
@@ -0,0 +1,20 @@
+{
+ "colors" : [
+ {
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "alpha" : "1.000",
+ "blue" : "0xE2",
+ "green" : "0xD1",
+ "red" : "0xFF"
+ }
+ },
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Projects/Modules/DesignSystem/Resources/Colors/Main.xcassets/Main 200.colorset/Contents.json b/Projects/Modules/DesignSystem/Resources/Colors/Main.xcassets/Main 200.colorset/Contents.json
new file mode 100644
index 0000000..429fff9
--- /dev/null
+++ b/Projects/Modules/DesignSystem/Resources/Colors/Main.xcassets/Main 200.colorset/Contents.json
@@ -0,0 +1,20 @@
+{
+ "colors" : [
+ {
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "alpha" : "1.000",
+ "blue" : "0xC5",
+ "green" : "0xA3",
+ "red" : "0xFF"
+ }
+ },
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Projects/Modules/DesignSystem/Resources/Colors/Main.xcassets/Main 300.colorset/Contents.json b/Projects/Modules/DesignSystem/Resources/Colors/Main.xcassets/Main 300.colorset/Contents.json
new file mode 100644
index 0000000..07aba10
--- /dev/null
+++ b/Projects/Modules/DesignSystem/Resources/Colors/Main.xcassets/Main 300.colorset/Contents.json
@@ -0,0 +1,20 @@
+{
+ "colors" : [
+ {
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "alpha" : "1.000",
+ "blue" : "0xA8",
+ "green" : "0x75",
+ "red" : "0xFF"
+ }
+ },
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Projects/Modules/DesignSystem/Resources/Colors/Main.xcassets/Main 400.colorset/Contents.json b/Projects/Modules/DesignSystem/Resources/Colors/Main.xcassets/Main 400.colorset/Contents.json
new file mode 100644
index 0000000..3dfb397
--- /dev/null
+++ b/Projects/Modules/DesignSystem/Resources/Colors/Main.xcassets/Main 400.colorset/Contents.json
@@ -0,0 +1,20 @@
+{
+ "colors" : [
+ {
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "alpha" : "1.000",
+ "blue" : "0x8B",
+ "green" : "0x47",
+ "red" : "0xFF"
+ }
+ },
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Projects/Modules/DesignSystem/Resources/Colors/Main.xcassets/Main 50.colorset/Contents.json b/Projects/Modules/DesignSystem/Resources/Colors/Main.xcassets/Main 50.colorset/Contents.json
new file mode 100644
index 0000000..a289077
--- /dev/null
+++ b/Projects/Modules/DesignSystem/Resources/Colors/Main.xcassets/Main 50.colorset/Contents.json
@@ -0,0 +1,20 @@
+{
+ "colors" : [
+ {
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "alpha" : "1.000",
+ "blue" : "0xEF",
+ "green" : "0xE5",
+ "red" : "0xFF"
+ }
+ },
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Projects/Modules/DesignSystem/Resources/Colors/Main.xcassets/Main 500.colorset/Contents.json b/Projects/Modules/DesignSystem/Resources/Colors/Main.xcassets/Main 500.colorset/Contents.json
new file mode 100644
index 0000000..450be69
--- /dev/null
+++ b/Projects/Modules/DesignSystem/Resources/Colors/Main.xcassets/Main 500.colorset/Contents.json
@@ -0,0 +1,20 @@
+{
+ "colors" : [
+ {
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "alpha" : "1.000",
+ "blue" : "0x6E",
+ "green" : "0x1A",
+ "red" : "0xFF"
+ }
+ },
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Projects/Modules/DesignSystem/Resources/Colors/Main.xcassets/Main 600.colorset/Contents.json b/Projects/Modules/DesignSystem/Resources/Colors/Main.xcassets/Main 600.colorset/Contents.json
new file mode 100644
index 0000000..b79c4a0
--- /dev/null
+++ b/Projects/Modules/DesignSystem/Resources/Colors/Main.xcassets/Main 600.colorset/Contents.json
@@ -0,0 +1,20 @@
+{
+ "colors" : [
+ {
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "alpha" : "1.000",
+ "blue" : "0x56",
+ "green" : "0x00",
+ "red" : "0xEB"
+ }
+ },
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Projects/Modules/DesignSystem/Resources/Colors/Main.xcassets/Main 700.colorset/Contents.json b/Projects/Modules/DesignSystem/Resources/Colors/Main.xcassets/Main 700.colorset/Contents.json
new file mode 100644
index 0000000..3f41922
--- /dev/null
+++ b/Projects/Modules/DesignSystem/Resources/Colors/Main.xcassets/Main 700.colorset/Contents.json
@@ -0,0 +1,20 @@
+{
+ "colors" : [
+ {
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "alpha" : "1.000",
+ "blue" : "0x45",
+ "green" : "0x00",
+ "red" : "0xBD"
+ }
+ },
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Projects/Modules/DesignSystem/Resources/Colors/Main.xcassets/Main 800.colorset/Contents.json b/Projects/Modules/DesignSystem/Resources/Colors/Main.xcassets/Main 800.colorset/Contents.json
new file mode 100644
index 0000000..e286ff2
--- /dev/null
+++ b/Projects/Modules/DesignSystem/Resources/Colors/Main.xcassets/Main 800.colorset/Contents.json
@@ -0,0 +1,20 @@
+{
+ "colors" : [
+ {
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "alpha" : "1.000",
+ "blue" : "0x34",
+ "green" : "0x00",
+ "red" : "0x8F"
+ }
+ },
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Projects/Modules/DesignSystem/Resources/Colors/Main.xcassets/Main 900.colorset/Contents.json b/Projects/Modules/DesignSystem/Resources/Colors/Main.xcassets/Main 900.colorset/Contents.json
new file mode 100644
index 0000000..f26e42f
--- /dev/null
+++ b/Projects/Modules/DesignSystem/Resources/Colors/Main.xcassets/Main 900.colorset/Contents.json
@@ -0,0 +1,20 @@
+{
+ "colors" : [
+ {
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "alpha" : "1.000",
+ "blue" : "0x24",
+ "green" : "0x00",
+ "red" : "0x61"
+ }
+ },
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Projects/Modules/DesignSystem/Resources/Colors/Primary.xcassets/Blue 10.colorset/Contents.json b/Projects/Modules/DesignSystem/Resources/Colors/Primary.xcassets/Blue 10.colorset/Contents.json
deleted file mode 100644
index 2165e74..0000000
--- a/Projects/Modules/DesignSystem/Resources/Colors/Primary.xcassets/Blue 10.colorset/Contents.json
+++ /dev/null
@@ -1,38 +0,0 @@
-{
- "colors" : [
- {
- "color" : {
- "color-space" : "srgb",
- "components" : {
- "alpha" : "1.000",
- "blue" : "0xFB",
- "green" : "0xF3",
- "red" : "0xF3"
- }
- },
- "idiom" : "universal"
- },
- {
- "appearances" : [
- {
- "appearance" : "luminosity",
- "value" : "dark"
- }
- ],
- "color" : {
- "color-space" : "srgb",
- "components" : {
- "alpha" : "1.000",
- "blue" : "0x59",
- "green" : "0x25",
- "red" : "0x00"
- }
- },
- "idiom" : "universal"
- }
- ],
- "info" : {
- "author" : "xcode",
- "version" : 1
- }
-}
diff --git a/Projects/Modules/DesignSystem/Resources/Colors/Primary.xcassets/Blue 20.colorset/Contents.json b/Projects/Modules/DesignSystem/Resources/Colors/Primary.xcassets/Blue 20.colorset/Contents.json
deleted file mode 100644
index 36148a3..0000000
--- a/Projects/Modules/DesignSystem/Resources/Colors/Primary.xcassets/Blue 20.colorset/Contents.json
+++ /dev/null
@@ -1,38 +0,0 @@
-{
- "colors" : [
- {
- "color" : {
- "color-space" : "srgb",
- "components" : {
- "alpha" : "1.000",
- "blue" : "0x9D",
- "green" : "0x5C",
- "red" : "0x13"
- }
- },
- "idiom" : "universal"
- },
- {
- "appearances" : [
- {
- "appearance" : "luminosity",
- "value" : "dark"
- }
- ],
- "color" : {
- "color-space" : "srgb",
- "components" : {
- "alpha" : "1.000",
- "blue" : "0x9D",
- "green" : "0x5C",
- "red" : "0x13"
- }
- },
- "idiom" : "universal"
- }
- ],
- "info" : {
- "author" : "xcode",
- "version" : 1
- }
-}
diff --git a/Projects/Modules/DesignSystem/Resources/Colors/Primary.xcassets/Blue 30.colorset/Contents.json b/Projects/Modules/DesignSystem/Resources/Colors/Primary.xcassets/Blue 30.colorset/Contents.json
deleted file mode 100644
index ed65b1e..0000000
--- a/Projects/Modules/DesignSystem/Resources/Colors/Primary.xcassets/Blue 30.colorset/Contents.json
+++ /dev/null
@@ -1,38 +0,0 @@
-{
- "colors" : [
- {
- "color" : {
- "color-space" : "srgb",
- "components" : {
- "alpha" : "1.000",
- "blue" : "0x82",
- "green" : "0x4C",
- "red" : "0x0F"
- }
- },
- "idiom" : "universal"
- },
- {
- "appearances" : [
- {
- "appearance" : "luminosity",
- "value" : "dark"
- }
- ],
- "color" : {
- "color-space" : "srgb",
- "components" : {
- "alpha" : "1.000",
- "blue" : "0xB1",
- "green" : "0x70",
- "red" : "0x27"
- }
- },
- "idiom" : "universal"
- }
- ],
- "info" : {
- "author" : "xcode",
- "version" : 1
- }
-}
diff --git a/Projects/Modules/DesignSystem/Resources/Colors/Primary.xcassets/Blue 40.colorset/Contents.json b/Projects/Modules/DesignSystem/Resources/Colors/Primary.xcassets/Blue 40.colorset/Contents.json
deleted file mode 100644
index 10c5b0b..0000000
--- a/Projects/Modules/DesignSystem/Resources/Colors/Primary.xcassets/Blue 40.colorset/Contents.json
+++ /dev/null
@@ -1,38 +0,0 @@
-{
- "colors" : [
- {
- "color" : {
- "color-space" : "srgb",
- "components" : {
- "alpha" : "1.000",
- "blue" : "0x53",
- "green" : "0x2C",
- "red" : "0x00"
- }
- },
- "idiom" : "universal"
- },
- {
- "appearances" : [
- {
- "appearance" : "luminosity",
- "value" : "dark"
- }
- ],
- "color" : {
- "color-space" : "srgb",
- "components" : {
- "alpha" : "1.000",
- "blue" : "0xD9",
- "green" : "0x98",
- "red" : "0x4F"
- }
- },
- "idiom" : "universal"
- }
- ],
- "info" : {
- "author" : "xcode",
- "version" : 1
- }
-}
diff --git a/Projects/Modules/DesignSystem/Resources/Colors/Sub.xcassets/Green 10.colorset/Contents.json b/Projects/Modules/DesignSystem/Resources/Colors/Sub.xcassets/Green 10.colorset/Contents.json
deleted file mode 100644
index 58e016a..0000000
--- a/Projects/Modules/DesignSystem/Resources/Colors/Sub.xcassets/Green 10.colorset/Contents.json
+++ /dev/null
@@ -1,38 +0,0 @@
-{
- "colors" : [
- {
- "color" : {
- "color-space" : "srgb",
- "components" : {
- "alpha" : "1.000",
- "blue" : "0xEE",
- "green" : "0xF8",
- "red" : "0xE5"
- }
- },
- "idiom" : "universal"
- },
- {
- "appearances" : [
- {
- "appearance" : "luminosity",
- "value" : "dark"
- }
- ],
- "color" : {
- "color-space" : "srgb",
- "components" : {
- "alpha" : "1.000",
- "blue" : "0x25",
- "green" : "0x43",
- "red" : "0x0F"
- }
- },
- "idiom" : "universal"
- }
- ],
- "info" : {
- "author" : "xcode",
- "version" : 1
- }
-}
diff --git a/Projects/Modules/DesignSystem/Resources/Colors/Sub.xcassets/Green 20.colorset/Contents.json b/Projects/Modules/DesignSystem/Resources/Colors/Sub.xcassets/Green 20.colorset/Contents.json
deleted file mode 100644
index 70e7d10..0000000
--- a/Projects/Modules/DesignSystem/Resources/Colors/Sub.xcassets/Green 20.colorset/Contents.json
+++ /dev/null
@@ -1,38 +0,0 @@
-{
- "colors" : [
- {
- "color" : {
- "color-space" : "srgb",
- "components" : {
- "alpha" : "1.000",
- "blue" : "0.443",
- "green" : "0.800",
- "red" : "0.180"
- }
- },
- "idiom" : "universal"
- },
- {
- "appearances" : [
- {
- "appearance" : "luminosity",
- "value" : "dark"
- }
- ],
- "color" : {
- "color-space" : "srgb",
- "components" : {
- "alpha" : "1.000",
- "blue" : "0.443",
- "green" : "0.800",
- "red" : "0.180"
- }
- },
- "idiom" : "universal"
- }
- ],
- "info" : {
- "author" : "xcode",
- "version" : 1
- }
-}
diff --git a/Projects/Modules/DesignSystem/Resources/Colors/Sub.xcassets/Red 10.colorset/Contents.json b/Projects/Modules/DesignSystem/Resources/Colors/Sub.xcassets/Red 10.colorset/Contents.json
deleted file mode 100644
index 8880440..0000000
--- a/Projects/Modules/DesignSystem/Resources/Colors/Sub.xcassets/Red 10.colorset/Contents.json
+++ /dev/null
@@ -1,38 +0,0 @@
-{
- "colors" : [
- {
- "color" : {
- "color-space" : "srgb",
- "components" : {
- "alpha" : "1.000",
- "blue" : "0xE7",
- "green" : "0xE9",
- "red" : "0xFC"
- }
- },
- "idiom" : "universal"
- },
- {
- "appearances" : [
- {
- "appearance" : "luminosity",
- "value" : "dark"
- }
- ],
- "color" : {
- "color-space" : "srgb",
- "components" : {
- "alpha" : "1.000",
- "blue" : "0x14",
- "green" : "0x19",
- "red" : "0x4C"
- }
- },
- "idiom" : "universal"
- }
- ],
- "info" : {
- "author" : "xcode",
- "version" : 1
- }
-}
diff --git a/Projects/Modules/DesignSystem/Resources/Colors/Sub.xcassets/Red 20.colorset/Contents.json b/Projects/Modules/DesignSystem/Resources/Colors/Sub.xcassets/Red 20.colorset/Contents.json
deleted file mode 100644
index 463e46e..0000000
--- a/Projects/Modules/DesignSystem/Resources/Colors/Sub.xcassets/Red 20.colorset/Contents.json
+++ /dev/null
@@ -1,38 +0,0 @@
-{
- "colors" : [
- {
- "color" : {
- "color-space" : "srgb",
- "components" : {
- "alpha" : "1.000",
- "blue" : "0x3C",
- "green" : "0x4C",
- "red" : "0xE7"
- }
- },
- "idiom" : "universal"
- },
- {
- "appearances" : [
- {
- "appearance" : "luminosity",
- "value" : "dark"
- }
- ],
- "color" : {
- "color-space" : "srgb",
- "components" : {
- "alpha" : "1.000",
- "blue" : "0x3C",
- "green" : "0x4C",
- "red" : "0xE7"
- }
- },
- "idiom" : "universal"
- }
- ],
- "info" : {
- "author" : "xcode",
- "version" : 1
- }
-}
diff --git a/Projects/Modules/DesignSystem/Resources/Colors/Sub.xcassets/SkyBlue 10.colorset/Contents.json b/Projects/Modules/DesignSystem/Resources/Colors/Sub.xcassets/SkyBlue 10.colorset/Contents.json
deleted file mode 100644
index 2a43eeb..0000000
--- a/Projects/Modules/DesignSystem/Resources/Colors/Sub.xcassets/SkyBlue 10.colorset/Contents.json
+++ /dev/null
@@ -1,38 +0,0 @@
-{
- "colors" : [
- {
- "color" : {
- "color-space" : "srgb",
- "components" : {
- "alpha" : "1.000",
- "blue" : "0xF6",
- "green" : "0xEB",
- "red" : "0xE0"
- }
- },
- "idiom" : "universal"
- },
- {
- "appearances" : [
- {
- "appearance" : "luminosity",
- "value" : "dark"
- }
- ],
- "color" : {
- "color-space" : "srgb",
- "components" : {
- "alpha" : "1.000",
- "blue" : "0x42",
- "green" : "0x29",
- "red" : "0x0C"
- }
- },
- "idiom" : "universal"
- }
- ],
- "info" : {
- "author" : "xcode",
- "version" : 1
- }
-}
diff --git a/Projects/Modules/DesignSystem/Resources/Colors/Sub.xcassets/SkyBlue 20.colorset/Contents.json b/Projects/Modules/DesignSystem/Resources/Colors/Sub.xcassets/SkyBlue 20.colorset/Contents.json
deleted file mode 100644
index 5c05108..0000000
--- a/Projects/Modules/DesignSystem/Resources/Colors/Sub.xcassets/SkyBlue 20.colorset/Contents.json
+++ /dev/null
@@ -1,38 +0,0 @@
-{
- "colors" : [
- {
- "color" : {
- "color-space" : "srgb",
- "components" : {
- "alpha" : "1.000",
- "blue" : "0xC9",
- "green" : "0x7B",
- "red" : "0x23"
- }
- },
- "idiom" : "universal"
- },
- {
- "appearances" : [
- {
- "appearance" : "luminosity",
- "value" : "dark"
- }
- ],
- "color" : {
- "color-space" : "srgb",
- "components" : {
- "alpha" : "1.000",
- "blue" : "0xC9",
- "green" : "0x7B",
- "red" : "0x23"
- }
- },
- "idiom" : "universal"
- }
- ],
- "info" : {
- "author" : "xcode",
- "version" : 1
- }
-}
diff --git a/Projects/Modules/DesignSystem/Resources/Colors/Sub.xcassets/Yellow 10.colorset/Contents.json b/Projects/Modules/DesignSystem/Resources/Colors/Sub.xcassets/Yellow 10.colorset/Contents.json
deleted file mode 100644
index 0d634f7..0000000
--- a/Projects/Modules/DesignSystem/Resources/Colors/Sub.xcassets/Yellow 10.colorset/Contents.json
+++ /dev/null
@@ -1,38 +0,0 @@
-{
- "colors" : [
- {
- "color" : {
- "color-space" : "srgb",
- "components" : {
- "alpha" : "1.000",
- "blue" : "0xE2",
- "green" : "0xF7",
- "red" : "0xFD"
- }
- },
- "idiom" : "universal"
- },
- {
- "appearances" : [
- {
- "appearance" : "luminosity",
- "value" : "dark"
- }
- ],
- "color" : {
- "color-space" : "srgb",
- "components" : {
- "alpha" : "1.000",
- "blue" : "0x05",
- "green" : "0x41",
- "red" : "0x50"
- }
- },
- "idiom" : "universal"
- }
- ],
- "info" : {
- "author" : "xcode",
- "version" : 1
- }
-}
diff --git a/Projects/Modules/DesignSystem/Resources/Colors/Sub.xcassets/Yellow 20.colorset/Contents.json b/Projects/Modules/DesignSystem/Resources/Colors/Sub.xcassets/Yellow 20.colorset/Contents.json
deleted file mode 100644
index 8c9b0dd..0000000
--- a/Projects/Modules/DesignSystem/Resources/Colors/Sub.xcassets/Yellow 20.colorset/Contents.json
+++ /dev/null
@@ -1,38 +0,0 @@
-{
- "colors" : [
- {
- "color" : {
- "color-space" : "srgb",
- "components" : {
- "alpha" : "1.000",
- "blue" : "0.059",
- "green" : "0.769",
- "red" : "0.945"
- }
- },
- "idiom" : "universal"
- },
- {
- "appearances" : [
- {
- "appearance" : "luminosity",
- "value" : "dark"
- }
- ],
- "color" : {
- "color-space" : "srgb",
- "components" : {
- "alpha" : "1.000",
- "blue" : "0.059",
- "green" : "0.769",
- "red" : "0.945"
- }
- },
- "idiom" : "universal"
- }
- ],
- "info" : {
- "author" : "xcode",
- "version" : 1
- }
-}
diff --git a/Projects/Modules/DesignSystem/Resources/Images/Icons.xcassets/Contents.json b/Projects/Modules/DesignSystem/Resources/Colors/System.xcassets/Contents.json
similarity index 100%
rename from Projects/Modules/DesignSystem/Resources/Images/Icons.xcassets/Contents.json
rename to Projects/Modules/DesignSystem/Resources/Colors/System.xcassets/Contents.json
diff --git a/Projects/Modules/DesignSystem/Resources/Colors/System.xcassets/Gray 1.colorset/Contents.json b/Projects/Modules/DesignSystem/Resources/Colors/System.xcassets/Gray 1.colorset/Contents.json
new file mode 100644
index 0000000..e7f5f04
--- /dev/null
+++ b/Projects/Modules/DesignSystem/Resources/Colors/System.xcassets/Gray 1.colorset/Contents.json
@@ -0,0 +1,20 @@
+{
+ "colors" : [
+ {
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "alpha" : "1.000",
+ "blue" : "0xBA",
+ "green" : "0xBA",
+ "red" : "0xBA"
+ }
+ },
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Projects/Modules/DesignSystem/Resources/Colors/System.xcassets/Gray 2.colorset/Contents.json b/Projects/Modules/DesignSystem/Resources/Colors/System.xcassets/Gray 2.colorset/Contents.json
new file mode 100644
index 0000000..656af9d
--- /dev/null
+++ b/Projects/Modules/DesignSystem/Resources/Colors/System.xcassets/Gray 2.colorset/Contents.json
@@ -0,0 +1,20 @@
+{
+ "colors" : [
+ {
+ "color" : {
+ "color-space" : "srgb",
+ "components" : {
+ "alpha" : "1.000",
+ "blue" : "0x75",
+ "green" : "0x75",
+ "red" : "0x75"
+ }
+ },
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Projects/Modules/DesignSystem/Resources/Fonts/Pretendard/Pretendard-Bold.otf b/Projects/Modules/DesignSystem/Resources/Fonts/Pretendard/Pretendard-Bold.otf
deleted file mode 100644
index e6d6ce8..0000000
Binary files a/Projects/Modules/DesignSystem/Resources/Fonts/Pretendard/Pretendard-Bold.otf and /dev/null differ
diff --git a/Projects/Modules/DesignSystem/Resources/Fonts/Pretendard/Pretendard-ExtraBold.otf b/Projects/Modules/DesignSystem/Resources/Fonts/Pretendard/Pretendard-ExtraBold.otf
new file mode 100644
index 0000000..388f3ca
Binary files /dev/null and b/Projects/Modules/DesignSystem/Resources/Fonts/Pretendard/Pretendard-ExtraBold.otf differ
diff --git a/Projects/Modules/DesignSystem/Resources/Fonts/Pretendard/Pretendard-Medium.otf b/Projects/Modules/DesignSystem/Resources/Fonts/Pretendard/Pretendard-Medium.otf
deleted file mode 100644
index ff907c4..0000000
Binary files a/Projects/Modules/DesignSystem/Resources/Fonts/Pretendard/Pretendard-Medium.otf and /dev/null differ
diff --git a/Projects/Modules/DesignSystem/Resources/Fonts/Pretendard/Pretendard-SemiBold.otf b/Projects/Modules/DesignSystem/Resources/Fonts/Pretendard/Pretendard-SemiBold.otf
index fe81db7..e7e36ab 100644
Binary files a/Projects/Modules/DesignSystem/Resources/Fonts/Pretendard/Pretendard-SemiBold.otf and b/Projects/Modules/DesignSystem/Resources/Fonts/Pretendard/Pretendard-SemiBold.otf differ
diff --git a/Projects/Modules/DesignSystem/Resources/Images/Images.xcassets/Google.imageset/Contents.json b/Projects/Modules/DesignSystem/Resources/Images/Images.xcassets/Google.imageset/Contents.json
new file mode 100644
index 0000000..13e2c78
--- /dev/null
+++ b/Projects/Modules/DesignSystem/Resources/Images/Images.xcassets/Google.imageset/Contents.json
@@ -0,0 +1,21 @@
+{
+ "images" : [
+ {
+ "filename" : "kakao_talk 3.svg",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Projects/Modules/DesignSystem/Resources/Images/Images.xcassets/Google.imageset/kakao_talk 3.svg b/Projects/Modules/DesignSystem/Resources/Images/Images.xcassets/Google.imageset/kakao_talk 3.svg
new file mode 100644
index 0000000..528e911
--- /dev/null
+++ b/Projects/Modules/DesignSystem/Resources/Images/Images.xcassets/Google.imageset/kakao_talk 3.svg
@@ -0,0 +1,25 @@
+
diff --git a/Projects/Modules/DesignSystem/Resources/Images/Images.xcassets/Kakao.imageset/Contents.json b/Projects/Modules/DesignSystem/Resources/Images/Images.xcassets/Kakao.imageset/Contents.json
new file mode 100644
index 0000000..9d07e28
--- /dev/null
+++ b/Projects/Modules/DesignSystem/Resources/Images/Images.xcassets/Kakao.imageset/Contents.json
@@ -0,0 +1,21 @@
+{
+ "images" : [
+ {
+ "filename" : "kakao_talk 1.svg",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Projects/Modules/DesignSystem/Resources/Images/Images.xcassets/Kakao.imageset/kakao_talk 1.svg b/Projects/Modules/DesignSystem/Resources/Images/Images.xcassets/Kakao.imageset/kakao_talk 1.svg
new file mode 100644
index 0000000..715cbee
--- /dev/null
+++ b/Projects/Modules/DesignSystem/Resources/Images/Images.xcassets/Kakao.imageset/kakao_talk 1.svg
@@ -0,0 +1,20 @@
+
diff --git a/Projects/Modules/DesignSystem/Resources/Images/Images.xcassets/Logo.imageset/Contents.json b/Projects/Modules/DesignSystem/Resources/Images/Images.xcassets/Logo.imageset/Contents.json
new file mode 100644
index 0000000..c7a2da2
--- /dev/null
+++ b/Projects/Modules/DesignSystem/Resources/Images/Images.xcassets/Logo.imageset/Contents.json
@@ -0,0 +1,21 @@
+{
+ "images" : [
+ {
+ "filename" : "notify-heart-dynamic-gradient.svg",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Projects/Modules/DesignSystem/Resources/Images/Images.xcassets/Logo.imageset/notify-heart-dynamic-gradient.svg b/Projects/Modules/DesignSystem/Resources/Images/Images.xcassets/Logo.imageset/notify-heart-dynamic-gradient.svg
new file mode 100644
index 0000000..b2f4283
--- /dev/null
+++ b/Projects/Modules/DesignSystem/Resources/Images/Images.xcassets/Logo.imageset/notify-heart-dynamic-gradient.svg
@@ -0,0 +1,9 @@
+
diff --git a/Projects/Modules/DesignSystem/Resources/Images/Images.xcassets/Naver.imageset/Contents.json b/Projects/Modules/DesignSystem/Resources/Images/Images.xcassets/Naver.imageset/Contents.json
new file mode 100644
index 0000000..33fe96c
--- /dev/null
+++ b/Projects/Modules/DesignSystem/Resources/Images/Images.xcassets/Naver.imageset/Contents.json
@@ -0,0 +1,21 @@
+{
+ "images" : [
+ {
+ "filename" : "Frame 2291.svg",
+ "idiom" : "universal",
+ "scale" : "1x"
+ },
+ {
+ "idiom" : "universal",
+ "scale" : "2x"
+ },
+ {
+ "idiom" : "universal",
+ "scale" : "3x"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/Projects/Modules/DesignSystem/Resources/Images/Images.xcassets/Naver.imageset/Frame 2291.svg b/Projects/Modules/DesignSystem/Resources/Images/Images.xcassets/Naver.imageset/Frame 2291.svg
new file mode 100644
index 0000000..aecd1d2
--- /dev/null
+++ b/Projects/Modules/DesignSystem/Resources/Images/Images.xcassets/Naver.imageset/Frame 2291.svg
@@ -0,0 +1,16 @@
+
diff --git a/Projects/Modules/DesignSystem/Sources/Color/UIColor+Error.swift b/Projects/Modules/DesignSystem/Sources/Color/UIColor+Error.swift
new file mode 100644
index 0000000..b8a7fa5
--- /dev/null
+++ b/Projects/Modules/DesignSystem/Sources/Color/UIColor+Error.swift
@@ -0,0 +1,13 @@
+import UIKit
+
+public extension UIColor {
+ struct Error {}
+}
+
+public extension UIColor.Error {
+ static let error500: UIColor = DesignSystemAsset.Error.error500.color
+ static let error600: UIColor = DesignSystemAsset.Error.error600.color
+ static let error700: UIColor = DesignSystemAsset.Error.error700.color
+ static let error800: UIColor = DesignSystemAsset.Error.error800.color
+ static let error900: UIColor = DesignSystemAsset.Error.error900.color
+}
diff --git a/Projects/Modules/DesignSystem/Sources/Color/UIColor+GrayScale.swift b/Projects/Modules/DesignSystem/Sources/Color/UIColor+GrayScale.swift
new file mode 100644
index 0000000..0f0c34d
--- /dev/null
+++ b/Projects/Modules/DesignSystem/Sources/Color/UIColor+GrayScale.swift
@@ -0,0 +1,18 @@
+import UIKit
+
+public extension UIColor {
+ struct GrayScale {}
+}
+
+public extension UIColor.GrayScale {
+ static let gray50: UIColor = DesignSystemAsset.GrayScale.gray50.color
+ static let gray100: UIColor = DesignSystemAsset.GrayScale.gray100.color
+ static let gray200: UIColor = DesignSystemAsset.GrayScale.gray200.color
+ static let gray300: UIColor = DesignSystemAsset.GrayScale.gray300.color
+ static let gray400: UIColor = DesignSystemAsset.GrayScale.gray400.color
+ static let gray500: UIColor = DesignSystemAsset.GrayScale.gray500.color
+ static let gray600: UIColor = DesignSystemAsset.GrayScale.gray600.color
+ static let gray700: UIColor = DesignSystemAsset.GrayScale.gray700.color
+ static let gray800: UIColor = DesignSystemAsset.GrayScale.gray800.color
+ static let gray900: UIColor = DesignSystemAsset.GrayScale.gray900.color
+}
diff --git a/Projects/Modules/DesignSystem/Sources/Color/UIColor+Main.swift b/Projects/Modules/DesignSystem/Sources/Color/UIColor+Main.swift
new file mode 100644
index 0000000..11a02f2
--- /dev/null
+++ b/Projects/Modules/DesignSystem/Sources/Color/UIColor+Main.swift
@@ -0,0 +1,18 @@
+import UIKit
+
+public extension UIColor {
+ struct Main {}
+}
+
+public extension UIColor.Main {
+ static let main50: UIColor = DesignSystemAsset.Main.main50.color
+ static let main100: UIColor = DesignSystemAsset.Main.main100.color
+ static let main200: UIColor = DesignSystemAsset.Main.main200.color
+ static let main300: UIColor = DesignSystemAsset.Main.main300.color
+ static let main400: UIColor = DesignSystemAsset.Main.main400.color
+ static let main500: UIColor = DesignSystemAsset.Main.main500.color
+ static let main600: UIColor = DesignSystemAsset.Main.main600.color
+ static let main700: UIColor = DesignSystemAsset.Main.main700.color
+ static let main800: UIColor = DesignSystemAsset.Main.main800.color
+ static let main900: UIColor = DesignSystemAsset.Main.main900.color
+}
diff --git a/Projects/Modules/DesignSystem/Sources/Color/UIColor+System.swift b/Projects/Modules/DesignSystem/Sources/Color/UIColor+System.swift
new file mode 100644
index 0000000..aa765ed
--- /dev/null
+++ b/Projects/Modules/DesignSystem/Sources/Color/UIColor+System.swift
@@ -0,0 +1,10 @@
+import UIKit
+
+public extension UIColor {
+ struct System {}
+}
+
+public extension UIColor.System {
+ static let gray1: UIColor = DesignSystemAsset.System.gray1.color
+ static let gray2: UIColor = DesignSystemAsset.System.gray2.color
+}
diff --git a/Projects/Modules/DesignSystem/Sources/Extension/UIButton/UIButton+setEmotingText.swift b/Projects/Modules/DesignSystem/Sources/Extension/UIButton/UIButton+setEmotingText.swift
new file mode 100644
index 0000000..e21491c
--- /dev/null
+++ b/Projects/Modules/DesignSystem/Sources/Extension/UIButton/UIButton+setEmotingText.swift
@@ -0,0 +1,28 @@
+import UIKit
+
+public extension UIButton {
+ func setEmotingText(_ text: String, font: EmotingFontStyle, color: UIColor) {
+ self.setTextWithLineHeight(text: text, font: font, color: color)
+ self.titleLabel?.font = .emotingFont(font)
+ self.setTitleColor(color, for: .normal)
+ }
+}
+
+extension UIButton {
+ func setTextWithLineHeight(text: String, font: EmotingFontStyle, color: UIColor) {
+ let style = NSMutableParagraphStyle()
+ style.maximumLineHeight = font.lineHeight()
+ style.minimumLineHeight = font.lineHeight()
+ style.lineBreakMode = .byTruncatingTail
+
+ let attributes: [NSAttributedString.Key: Any] = [
+ .paragraphStyle: style,
+ .baselineOffset: (font.lineHeight() - font.size()) / 4,
+ .foregroundColor: color
+ ]
+
+ let attrString = NSMutableAttributedString(string: text, attributes: attributes)
+ self.titleLabel?.attributedText = attrString
+ self.setTitle(text, for: .normal)
+ }
+}
diff --git a/Projects/Modules/DesignSystem/Sources/Extension/UILabel/UILabel+setEmotingText.swift b/Projects/Modules/DesignSystem/Sources/Extension/UILabel/UILabel+setEmotingText.swift
new file mode 100644
index 0000000..119b1f4
--- /dev/null
+++ b/Projects/Modules/DesignSystem/Sources/Extension/UILabel/UILabel+setEmotingText.swift
@@ -0,0 +1,26 @@
+import UIKit
+
+public extension UILabel {
+ func setEmotingText(_ text: String, font: EmotingFontStyle, color: UIColor) {
+ self.setTextWithLineHeight(text: text, font: font, color: color)
+ self.font = .emotingFont(font)
+ }
+}
+
+extension UILabel {
+ func setTextWithLineHeight(text: String, font: EmotingFontStyle, color: UIColor) {
+ let style = NSMutableParagraphStyle()
+ style.maximumLineHeight = font.lineHeight()
+ style.minimumLineHeight = font.lineHeight()
+ style.lineBreakMode = .byTruncatingTail
+
+ let attributes: [NSAttributedString.Key: Any] = [
+ .paragraphStyle: style,
+ .baselineOffset: (font.lineHeight() - font.size()) / 4,
+ .foregroundColor: color
+ ]
+
+ let attrString = NSMutableAttributedString(string: text, attributes: attributes)
+ self.attributedText = attrString
+ }
+}
diff --git a/Projects/Modules/DesignSystem/Sources/Image/EmotingImage.swift b/Projects/Modules/DesignSystem/Sources/Image/EmotingImage.swift
new file mode 100644
index 0000000..e97b042
--- /dev/null
+++ b/Projects/Modules/DesignSystem/Sources/Image/EmotingImage.swift
@@ -0,0 +1,34 @@
+import UIKit
+import Foundation
+
+public extension UIImage {
+ static func emotingImage(_ image: EmotingImage) -> UIImage {
+ image.uiImage()
+ }
+}
+
+public enum EmotingImage {
+ case logo
+ case kakao
+ case naver
+ case google
+}
+
+extension EmotingImage {
+ public func uiImage() -> UIImage {
+ let dsImages = DesignSystemAsset.Images.self
+ switch self {
+ case .logo:
+ return dsImages.logo.image
+
+ case .kakao:
+ return dsImages.kakao.image
+
+ case .naver:
+ return dsImages.naver.image
+
+ case .google:
+ return dsImages.google.image
+ }
+ }
+}
diff --git a/Projects/Modules/DesignSystem/Sources/TempFile.swift b/Projects/Modules/DesignSystem/Sources/TempFile.swift
deleted file mode 100644
index 19be644..0000000
--- a/Projects/Modules/DesignSystem/Sources/TempFile.swift
+++ /dev/null
@@ -1 +0,0 @@
-// TempFile
diff --git a/Projects/Modules/DesignSystem/Sources/TextField/EmotingTextField.swift b/Projects/Modules/DesignSystem/Sources/TextField/EmotingTextField.swift
new file mode 100644
index 0000000..05f907f
--- /dev/null
+++ b/Projects/Modules/DesignSystem/Sources/TextField/EmotingTextField.swift
@@ -0,0 +1,28 @@
+import UIKit
+import Then
+import SnapKit
+import TextFieldEffects
+
+public class EmotingTextField: HoshiTextField {
+// public let textField = HoshiTextField().then {
+// $0.placeholderLabel.textColor = .System.gray2
+// $0.textColor = .black
+// }
+ public init(placeholder: String) {
+ super.init(frame: .zero)
+ self.placeholderLabel.textColor = .System.gray2
+ self.textColor = .black
+ self.placeholder = placeholder
+ self.placeholderFontScale = self.isTextDropActive ? 0.8 : 1
+ self.placeholderColor = .System.gray2
+ self.placeholderLabel.text = placeholder
+ self.placeholderLabel.font = .emotingFont(.caption(.regular))
+ self.placeholderLabel.textColor = .System.gray2
+ self.borderActiveColor = .Main.main500
+ self.borderInactiveColor = .System.gray1
+ self.borderStyle = .line
+ }
+ required init?(coder: NSCoder) {
+ fatalError("init(coder:) has not been implemented")
+ }
+}
diff --git a/Projects/Modules/DesignSystem/Sources/Typography/EmotingFont.swift b/Projects/Modules/DesignSystem/Sources/Typography/EmotingFont.swift
new file mode 100644
index 0000000..e8d441c
--- /dev/null
+++ b/Projects/Modules/DesignSystem/Sources/Typography/EmotingFont.swift
@@ -0,0 +1,84 @@
+import UIKit
+
+public extension UIFont {
+ static func emotingFont(_ font: EmotingFontStyle) -> UIFont {
+ font.uiFont()
+ }
+}
+
+extension EmotingFontStyle {
+ func lineHeight() -> CGFloat {
+ switch self {
+ case .titleLg:
+ return 36
+
+ case .titleMd:
+ return 31.2
+
+ case .titleSm:
+ return 26
+
+ case .textLg:
+ return 25.2
+
+ case .textMd:
+ return 22.4
+
+ case .textSm:
+ return 19.6
+
+ case .caption:
+ return 16.8
+ }
+ }
+
+ func uiFont() -> UIFont {
+ switch self {
+ case let .titleLg(size):
+ return size.emotingFontSize(size: 30)
+
+ case let .titleMd(size):
+ return size.emotingFontSize(size: 26)
+
+ case let .titleSm(size):
+ return size.emotingFontSize(size: 20)
+
+ case let .textLg(size):
+ return size.emotingFontSize(size: 18)
+
+ case let .textMd(size):
+ return size.emotingFontSize(size: 16)
+
+ case let .textSm(size):
+ return size.emotingFontSize(size: 14)
+
+ case let .caption(size):
+ return size.emotingFontSize(size: 12)
+ }
+ }
+
+ func size() -> CGFloat {
+ switch self {
+ case .titleLg:
+ return 30
+
+ case .titleMd:
+ return 26
+
+ case .titleSm:
+ return 20
+
+ case .textLg:
+ return 18
+
+ case .textMd:
+ return 16
+
+ case .textSm:
+ return 14
+
+ case .caption:
+ return 12
+ }
+ }
+}
diff --git a/Projects/Modules/DesignSystem/Sources/Typography/EmotingFontStyle.swift b/Projects/Modules/DesignSystem/Sources/Typography/EmotingFontStyle.swift
new file mode 100644
index 0000000..0035a15
--- /dev/null
+++ b/Projects/Modules/DesignSystem/Sources/Typography/EmotingFontStyle.swift
@@ -0,0 +1,32 @@
+import Foundation
+import UIKit
+
+public enum EmotingFontStyle {
+ case titleLg(EmotingFontSize)
+ case titleMd(EmotingFontSize)
+ case titleSm(EmotingFontSize)
+ case textLg(EmotingFontSize)
+ case textMd(EmotingFontSize)
+ case textSm(EmotingFontSize)
+ case caption(EmotingFontSize)
+}
+
+public enum EmotingFontSize {
+ case regular
+ case semibold
+ case extrabold
+}
+
+extension EmotingFontSize {
+ func emotingFontSize(size: CGFloat) -> UIFont {
+ let pretendard = DesignSystemFontFamily.Pretendard.self
+ switch self {
+ case .regular:
+ return pretendard.regular.font(size: size)
+ case .semibold:
+ return pretendard.semiBold.font(size: size)
+ case .extrabold:
+ return pretendard.extraBold.font(size: size)
+ }
+ }
+}
diff --git a/Projects/Modules/DesignSystem/Sources/Typography/PretendardFont.swift b/Projects/Modules/DesignSystem/Sources/Typography/PretendardFont.swift
new file mode 100644
index 0000000..32a5aa0
--- /dev/null
+++ b/Projects/Modules/DesignSystem/Sources/Typography/PretendardFont.swift
@@ -0,0 +1,7 @@
+import UIKit
+
+public extension UIFont {
+ static func pretendardFont(_ font: EmotingFontSize, size: CGFloat) -> UIFont {
+ font.emotingFontSize(size: size)
+ }
+}
diff --git a/Projects/Modules/ThirdPartyLib/Project.swift b/Projects/Modules/ThirdPartyLib/Project.swift
index 3ba8eaa..dfde0dd 100644
--- a/Projects/Modules/ThirdPartyLib/Project.swift
+++ b/Projects/Modules/ThirdPartyLib/Project.swift
@@ -17,6 +17,7 @@ let project = Project.makeModule(
.SPM.kingfisher,
.SPM.KeychainSwift,
.SPM.ReactorKit,
- .SPM.RxGesture
+ .SPM.RxGesture,
+ .SPM.TextFieldEffets
], sources: []
)
diff --git a/Projects/Presentation/Sources/Auth/Login/EmailLogin/EmailLoginReactor.swift b/Projects/Presentation/Sources/Auth/Login/EmailLogin/EmailLoginReactor.swift
new file mode 100644
index 0000000..6d1e6a6
--- /dev/null
+++ b/Projects/Presentation/Sources/Auth/Login/EmailLogin/EmailLoginReactor.swift
@@ -0,0 +1,24 @@
+import ReactorKit
+import RxSwift
+import RxCocoa
+import Domain
+import RxFlow
+import Core
+
+public final class EmailLoginReactor: BaseReactor, Stepper {
+ public let steps = PublishRelay()
+ public let initialState = State()
+ private let disposeBag = DisposeBag()
+ public init() {}
+
+ public enum Action { }
+
+ public enum Mutation { }
+
+ public struct State { }
+}
+
+extension EmailLoginReactor {
+ public func mutate(action: Action) -> Observable { }
+ public func reduce(state: State, mutation: Mutation) -> State { }
+}
diff --git a/Projects/Presentation/Sources/Auth/Login/EmailLogin/EmailLoginViewController.swift b/Projects/Presentation/Sources/Auth/Login/EmailLogin/EmailLoginViewController.swift
new file mode 100644
index 0000000..33f5379
--- /dev/null
+++ b/Projects/Presentation/Sources/Auth/Login/EmailLogin/EmailLoginViewController.swift
@@ -0,0 +1,67 @@
+import UIKit
+import SnapKit
+import Then
+import DesignSystem
+
+public class EmailLoginViewController: BaseReactorViewController {
+ private let titleLabel = UILabel().then {
+ $0.text = "Emoting"
+ $0.textColor = .black
+ $0.font = .pretendardFont(.semibold, size: 40)
+ }
+ private let subTitleLabel = UILabel().then {
+ $0.text = "소통에 간단함을 더하다"
+ $0.textColor = .black
+ $0.font = .pretendardFont(.regular, size: 16)
+ }
+ private let emailTextField = EmotingTextField(placeholder: "이메일")
+ private let passwordTextField = EmotingTextField(placeholder: "비밀번호")
+ private let loginButton = UIButton(type: .system).then {
+ $0.backgroundColor = .Main.main500
+ $0.layer.cornerRadius = 12
+ $0.setTitle("로그인", for: .normal)
+ $0.setTitleColor(.white, for: .normal)
+ $0.titleLabel?.font = .pretendardFont(.semibold, size: 18)
+ }
+
+ public override func configureNavigation() {
+ self.navigationItem.hidesBackButton = true
+ }
+
+ public override func addView() {
+ [
+ titleLabel,
+ subTitleLabel,
+ emailTextField,
+ passwordTextField,
+ loginButton
+ ].forEach(view.addSubview(_:))
+ }
+
+ public override func setLayout() {
+ titleLabel.snp.makeConstraints {
+ $0.topMargin.equalToSuperview().inset(40)
+ $0.leading.equalToSuperview().inset(20)
+ $0.height.equalTo(56)
+ }
+ subTitleLabel.snp.makeConstraints {
+ $0.top.equalTo(titleLabel.snp.bottom).offset(8)
+ $0.left.equalToSuperview().inset(23)
+ }
+ emailTextField.snp.makeConstraints {
+ $0.leading.trailing.equalToSuperview().inset(20)
+ $0.top.equalTo(subTitleLabel.snp.bottom).offset(51)
+ $0.height.equalTo(57)
+ }
+ passwordTextField.snp.makeConstraints {
+ $0.leading.trailing.equalToSuperview().inset(20)
+ $0.top.equalTo(emailTextField.snp.bottom).offset(54)
+ $0.height.equalTo(57)
+ }
+ loginButton.snp.makeConstraints {
+ $0.bottom.equalToSuperview().inset(54)
+ $0.leading.trailing.equalToSuperview().inset(20)
+ $0.height.equalTo(52)
+ }
+ }
+}
diff --git a/Projects/Presentation/Sources/Auth/Login/OauthLogin/OauthLoginReactor.swift b/Projects/Presentation/Sources/Auth/Login/OauthLogin/OauthLoginReactor.swift
new file mode 100644
index 0000000..31e2659
--- /dev/null
+++ b/Projects/Presentation/Sources/Auth/Login/OauthLogin/OauthLoginReactor.swift
@@ -0,0 +1,47 @@
+import ReactorKit
+import RxSwift
+import RxCocoa
+import Domain
+import RxFlow
+import Core
+
+public final class OauthLoginReactor: BaseReactor, Stepper {
+ public let steps = PublishRelay()
+ public let initialState = State()
+ private let disposeBag = DisposeBag()
+ public init() {}
+
+ public enum Action {
+ case emailLoginButtonDidTap
+ case emailSignupButtonDidTap
+ }
+
+ public enum Mutation {
+ case navigateToEmailLogin
+ case navigateToEmailSignup
+ }
+
+ public struct State { }
+}
+
+extension OauthLoginReactor {
+ public func mutate(action: Action) -> Observable {
+ switch action {
+ case .emailLoginButtonDidTap:
+ return .just(.navigateToEmailLogin)
+ case .emailSignupButtonDidTap:
+ return .just(.navigateToEmailSignup)
+ }
+ }
+
+ public func reduce(state: State, mutation: Mutation) -> State {
+ var newState = state
+ switch mutation {
+ case .navigateToEmailLogin:
+ steps.accept(OauthLoginStep.emailLoginisRequired)
+ case .navigateToEmailSignup:
+ steps.accept(OauthLoginStep.emailSignupIsRequired)
+ }
+ return newState
+ }
+}
diff --git a/Projects/Presentation/Sources/Auth/Login/OauthLogin/OauthLoginViewController.swift b/Projects/Presentation/Sources/Auth/Login/OauthLogin/OauthLoginViewController.swift
new file mode 100644
index 0000000..e5adce6
--- /dev/null
+++ b/Projects/Presentation/Sources/Auth/Login/OauthLogin/OauthLoginViewController.swift
@@ -0,0 +1,125 @@
+import UIKit
+import SnapKit
+import Then
+import DesignSystem
+import RxSwift
+import RxCocoa
+
+public class OauthLoginViewController: BaseReactorViewController {
+ private let titleLabel = UILabel().then {
+ $0.text = "Emoting"
+ $0.textColor = .black
+ $0.font = .pretendardFont(.semibold, size: 40)
+ }
+ private let subTitleLabel = UILabel().then {
+ $0.text = "소통에 간단함을 더하다"
+ $0.textColor = .black
+ $0.font = .pretendardFont(.regular, size: 16)
+ }
+ private let logoImageView = UIImageView().then {
+ $0.image = .emotingImage(.logo)
+ }
+ private let oauthStackView = UIStackView().then {
+ $0.axis = .horizontal
+ $0.spacing = 20
+ }
+ private let kakaoLoginButton = UIButton(type: .system).then {
+ $0.setBackgroundImage(.emotingImage(.kakao), for: .normal)
+ $0.layer.cornerRadius = 24
+ $0.clipsToBounds = true
+ }
+ private let naverLoginButton = UIButton(type: .system).then {
+ $0.setBackgroundImage(.emotingImage(.naver), for: .normal)
+ $0.layer.cornerRadius = 24
+ $0.clipsToBounds = true
+ }
+ private let googleLoginButton = UIButton(type: .system).then {
+ $0.setBackgroundImage(.emotingImage(.google), for: .normal)
+ $0.layer.cornerRadius = 24
+ $0.clipsToBounds = true
+ }
+ private let emailStackView = UIStackView().then {
+ $0.axis = .horizontal
+ $0.spacing = 12
+ }
+ private let emailSignupButton = UIButton(type: .system).then {
+ $0.setTitle("이메일 회원가입", for: .normal)
+ $0.setTitleColor(.System.gray2, for: .normal)
+ }
+ private let lineView = UIView().then {
+ $0.backgroundColor = .System.gray2
+ }
+ private let emailLoginButton = UIButton(type: .system).then {
+ $0.setTitle("이메일 로그인", for: .normal)
+ $0.setTitleColor(.System.gray2, for: .normal)
+ }
+
+ public override func bindAction() {
+ emailLoginButton.rx.tap.asObservable()
+ .map { OauthLoginReactor.Action.emailLoginButtonDidTap }
+ .bind(to: reactor.action)
+ .disposed(by: disposeBag)
+
+ emailSignupButton.rx.tap.asObservable()
+ .map { OauthLoginReactor.Action.emailSignupButtonDidTap }
+ .bind(to: reactor.action)
+ .disposed(by: disposeBag)
+ }
+
+ public override func addView() {
+ [
+ titleLabel,
+ subTitleLabel,
+ logoImageView,
+ oauthStackView,
+ emailStackView
+ ].forEach(view.addSubview(_:))
+ [
+ kakaoLoginButton,
+ naverLoginButton,
+ googleLoginButton
+ ].forEach(oauthStackView.addArrangedSubview(_:))
+ [
+ emailSignupButton,
+ lineView,
+ emailLoginButton
+ ].forEach(emailStackView.addArrangedSubview(_:))
+ }
+
+ public override func setLayout() {
+ titleLabel.snp.makeConstraints {
+ $0.top.greaterThanOrEqualTo(189)
+ $0.centerX.equalToSuperview()
+ }
+ subTitleLabel.snp.makeConstraints {
+ $0.top.equalTo(titleLabel.snp.bottom).offset(8)
+ $0.centerX.equalToSuperview()
+ }
+ logoImageView.snp.makeConstraints {
+ $0.centerX.equalToSuperview()
+ $0.top.equalTo(subTitleLabel.snp.bottom).offset(28)
+ $0.width.height.equalTo(160)
+ }
+ kakaoLoginButton.snp.makeConstraints {
+ $0.width.height.equalTo(48)
+ }
+ naverLoginButton.snp.makeConstraints {
+ $0.width.height.equalTo(48)
+ }
+ googleLoginButton.snp.makeConstraints {
+ $0.width.height.equalTo(48)
+ }
+ oauthStackView.snp.makeConstraints {
+ $0.centerX.equalToSuperview()
+ $0.top.equalTo(logoImageView.snp.bottom).offset(40)
+ }
+ emailStackView.snp.makeConstraints {
+ $0.top.equalTo(oauthStackView.snp.bottom).offset(16)
+ $0.centerX.equalToSuperview()
+ }
+ lineView.snp.makeConstraints {
+ $0.width.equalTo(1)
+ $0.height.equalTo(18)
+ }
+ }
+}
diff --git a/Projects/Presentation/Sources/Auth/Signup/AgeSignup/AgeSignupReactor.swift b/Projects/Presentation/Sources/Auth/Signup/AgeSignup/AgeSignupReactor.swift
new file mode 100644
index 0000000..4ec0130
--- /dev/null
+++ b/Projects/Presentation/Sources/Auth/Signup/AgeSignup/AgeSignupReactor.swift
@@ -0,0 +1,41 @@
+import ReactorKit
+import RxSwift
+import RxCocoa
+import Domain
+import RxFlow
+import Core
+
+public final class AgeSignupReactor: BaseReactor, Stepper {
+ public let steps = PublishRelay()
+ public let initialState = State()
+ private let disposeBag = DisposeBag()
+ public init() {}
+
+ public enum Action {
+ case nextButtonDidTap
+ }
+
+ public enum Mutation {
+ case navigateToProfilSignup
+ }
+
+ public struct State { }
+}
+
+extension AgeSignupReactor {
+ public func mutate(action: Action) -> Observable {
+ switch action {
+ case .nextButtonDidTap:
+ return .just(.navigateToProfilSignup)
+ }
+ }
+
+ public func reduce(state: State, mutation: Mutation) -> State {
+ var newState = state
+ switch mutation {
+ case .navigateToProfilSignup:
+ steps.accept(AgeSignupStep.proFilSignupIsRequired)
+ }
+ return newState
+ }
+}
diff --git a/Projects/Presentation/Sources/Auth/Signup/AgeSignup/AgeSignupViewController.swift b/Projects/Presentation/Sources/Auth/Signup/AgeSignup/AgeSignupViewController.swift
new file mode 100644
index 0000000..d6c18a5
--- /dev/null
+++ b/Projects/Presentation/Sources/Auth/Signup/AgeSignup/AgeSignupViewController.swift
@@ -0,0 +1,58 @@
+import UIKit
+import SnapKit
+import Then
+import DesignSystem
+import RxSwift
+import RxCocoa
+
+public class AgeSignupViewController: BaseReactorViewController {
+ private let titleLabel = UILabel().then {
+ $0.text = "나이를 입력해주세요"
+ $0.textColor = .black
+ $0.font = .pretendardFont(.semibold, size: 26)
+ }
+ private let ageTextField = EmotingTextField(placeholder: "나이")
+ private let nextButton = UIButton(type: .system).then {
+ $0.backgroundColor = .Main.main500
+ $0.layer.cornerRadius = 12
+ $0.setTitle("다음", for: .normal)
+ $0.setTitleColor(.white, for: .normal)
+ $0.titleLabel?.font = .pretendardFont(.semibold, size: 18)
+ }
+
+ public override func configureNavigation() {
+ self.navigationItem.title = "회원가입"
+ }
+
+ public override func bindAction() {
+ nextButton.rx.tap.asObservable()
+ .map { AgeSignupReactor.Action.nextButtonDidTap }
+ .bind(to: reactor.action)
+ .disposed(by: disposeBag)
+ }
+
+ public override func addView() {
+ [
+ titleLabel,
+ ageTextField,
+ nextButton
+ ].forEach(view.addSubview(_:))
+ }
+
+ public override func setLayout() {
+ titleLabel.snp.makeConstraints {
+ $0.topMargin.equalToSuperview().inset(40)
+ $0.leading.equalToSuperview().inset(20)
+ }
+ ageTextField.snp.makeConstraints {
+ $0.leading.trailing.equalToSuperview().inset(20)
+ $0.top.equalTo(titleLabel.snp.bottom).offset(44)
+ $0.height.equalTo(57)
+ }
+ nextButton.snp.makeConstraints {
+ $0.bottom.equalToSuperview().inset(54)
+ $0.leading.trailing.equalToSuperview().inset(20)
+ $0.height.equalTo(52)
+ }
+ }
+}
diff --git a/Projects/Presentation/Sources/Auth/Signup/EmailSignup/EmailSignupReactor.swift b/Projects/Presentation/Sources/Auth/Signup/EmailSignup/EmailSignupReactor.swift
new file mode 100644
index 0000000..5590b62
--- /dev/null
+++ b/Projects/Presentation/Sources/Auth/Signup/EmailSignup/EmailSignupReactor.swift
@@ -0,0 +1,41 @@
+import ReactorKit
+import RxSwift
+import RxCocoa
+import Domain
+import RxFlow
+import Core
+
+public final class EmailSignupReactor: BaseReactor, Stepper {
+ public let steps = PublishRelay()
+ public let initialState = State()
+ private let disposeBag = DisposeBag()
+ public init() {}
+
+ public enum Action {
+ case nextButtonDidTap
+ }
+
+ public enum Mutation {
+ case navigateToPasswordSignup
+ }
+
+ public struct State { }
+}
+
+extension EmailSignupReactor {
+ public func mutate(action: Action) -> Observable {
+ switch action {
+ case .nextButtonDidTap:
+ return .just(.navigateToPasswordSignup)
+ }
+ }
+
+ public func reduce(state: State, mutation: Mutation) -> State {
+ var newState = state
+ switch mutation {
+ case .navigateToPasswordSignup:
+ steps.accept(EmailSignupStep.passwordSignupIsrequired)
+ }
+ return newState
+ }
+}
diff --git a/Projects/Presentation/Sources/Auth/Signup/EmailSignup/EmailSignupViewController.swift b/Projects/Presentation/Sources/Auth/Signup/EmailSignup/EmailSignupViewController.swift
new file mode 100644
index 0000000..344d442
--- /dev/null
+++ b/Projects/Presentation/Sources/Auth/Signup/EmailSignup/EmailSignupViewController.swift
@@ -0,0 +1,58 @@
+import UIKit
+import SnapKit
+import Then
+import DesignSystem
+import RxSwift
+import RxCocoa
+
+public class EmailSignupViewController: BaseReactorViewController {
+ private let titleLabel = UILabel().then {
+ $0.text = "이메일을 입력해주세요"
+ $0.textColor = .black
+ $0.font = .pretendardFont(.semibold, size: 26)
+ }
+ private let emailTextField = EmotingTextField(placeholder: "이메일")
+ private let nextButton = UIButton(type: .system).then {
+ $0.backgroundColor = .Main.main500
+ $0.layer.cornerRadius = 12
+ $0.setTitle("다음", for: .normal)
+ $0.setTitleColor(.white, for: .normal)
+ $0.titleLabel?.font = .pretendardFont(.semibold, size: 18)
+ }
+
+ public override func configureNavigation() {
+ self.navigationItem.title = "회원가입"
+ }
+
+ public override func bindAction() {
+ nextButton.rx.tap.asObservable()
+ .map { EmailSignupReactor.Action.nextButtonDidTap }
+ .bind(to: reactor.action)
+ .disposed(by: disposeBag)
+ }
+
+ public override func addView() {
+ [
+ titleLabel,
+ emailTextField,
+ nextButton
+ ].forEach(view.addSubview(_:))
+ }
+
+ public override func setLayout() {
+ titleLabel.snp.makeConstraints {
+ $0.topMargin.equalToSuperview().inset(40)
+ $0.leading.equalToSuperview().inset(20)
+ }
+ emailTextField.snp.makeConstraints {
+ $0.leading.trailing.equalToSuperview().inset(20)
+ $0.top.equalTo(titleLabel.snp.bottom).offset(44)
+ $0.height.equalTo(57)
+ }
+ nextButton.snp.makeConstraints {
+ $0.bottom.equalToSuperview().inset(54)
+ $0.leading.trailing.equalToSuperview().inset(20)
+ $0.height.equalTo(52)
+ }
+ }
+}
diff --git a/Projects/Presentation/Sources/Auth/Signup/NickNameSignup/NickNameSignupReactor.swift b/Projects/Presentation/Sources/Auth/Signup/NickNameSignup/NickNameSignupReactor.swift
new file mode 100644
index 0000000..cf3da73
--- /dev/null
+++ b/Projects/Presentation/Sources/Auth/Signup/NickNameSignup/NickNameSignupReactor.swift
@@ -0,0 +1,41 @@
+import ReactorKit
+import RxSwift
+import RxCocoa
+import Domain
+import RxFlow
+import Core
+
+public final class NickNameSignupReactor: BaseReactor, Stepper {
+ public let steps = PublishRelay()
+ public let initialState = State()
+ private let disposeBag = DisposeBag()
+ public init() {}
+
+ public enum Action {
+ case nextButtonDidTap
+ }
+
+ public enum Mutation {
+ case navigateToAgeSignup
+ }
+
+ public struct State { }
+}
+
+extension NickNameSignupReactor {
+ public func mutate(action: Action) -> Observable {
+ switch action {
+ case .nextButtonDidTap:
+ return .just(.navigateToAgeSignup)
+ }
+ }
+
+ public func reduce(state: State, mutation: Mutation) -> State {
+ var newState = state
+ switch mutation {
+ case .navigateToAgeSignup:
+ steps.accept(NickNameSignupStep.ageSignupIsRequired)
+ }
+ return newState
+ }
+}
diff --git a/Projects/Presentation/Sources/Auth/Signup/NickNameSignup/NickNameSignupViewController.swift b/Projects/Presentation/Sources/Auth/Signup/NickNameSignup/NickNameSignupViewController.swift
new file mode 100644
index 0000000..e0a7566
--- /dev/null
+++ b/Projects/Presentation/Sources/Auth/Signup/NickNameSignup/NickNameSignupViewController.swift
@@ -0,0 +1,58 @@
+import UIKit
+import SnapKit
+import Then
+import DesignSystem
+import RxSwift
+import RxCocoa
+
+public class NickNameSignupViewController: BaseReactorViewController {
+ private let titleLabel = UILabel().then {
+ $0.text = "닉네임을 입력해주세요"
+ $0.textColor = .black
+ $0.font = .pretendardFont(.semibold, size: 26)
+ }
+ private let nickNameTextField = EmotingTextField(placeholder: "닉네임(별명)")
+ private let nextButton = UIButton(type: .system).then {
+ $0.backgroundColor = .Main.main500
+ $0.layer.cornerRadius = 12
+ $0.setTitle("다음", for: .normal)
+ $0.setTitleColor(.white, for: .normal)
+ $0.titleLabel?.font = .pretendardFont(.semibold, size: 18)
+ }
+
+ public override func configureNavigation() {
+ self.navigationItem.title = "회원가입"
+ }
+
+ public override func bindAction() {
+ nextButton.rx.tap.asObservable()
+ .map { NickNameSignupReactor.Action.nextButtonDidTap }
+ .bind(to: reactor.action)
+ .disposed(by: disposeBag)
+ }
+
+ public override func addView() {
+ [
+ titleLabel,
+ nickNameTextField,
+ nextButton
+ ].forEach(view.addSubview(_:))
+ }
+
+ public override func setLayout() {
+ titleLabel.snp.makeConstraints {
+ $0.topMargin.equalToSuperview().inset(40)
+ $0.leading.equalToSuperview().inset(20)
+ }
+ nickNameTextField.snp.makeConstraints {
+ $0.leading.trailing.equalToSuperview().inset(20)
+ $0.top.equalTo(titleLabel.snp.bottom).offset(44)
+ $0.height.equalTo(57)
+ }
+ nextButton.snp.makeConstraints {
+ $0.bottom.equalToSuperview().inset(54)
+ $0.leading.trailing.equalToSuperview().inset(20)
+ $0.height.equalTo(52)
+ }
+ }
+}
diff --git a/Projects/Presentation/Sources/Auth/Signup/PasswordSignup/PasswordSignupReactor.swift b/Projects/Presentation/Sources/Auth/Signup/PasswordSignup/PasswordSignupReactor.swift
new file mode 100644
index 0000000..8ebc2da
--- /dev/null
+++ b/Projects/Presentation/Sources/Auth/Signup/PasswordSignup/PasswordSignupReactor.swift
@@ -0,0 +1,40 @@
+import ReactorKit
+import RxSwift
+import RxCocoa
+import Domain
+import RxFlow
+import Core
+
+public final class PasswordSignupReactor: BaseReactor, Stepper {
+ public let steps = PublishRelay()
+ public let initialState = State()
+ private let disposeBag = DisposeBag()
+ public init() {}
+
+ public enum Action {
+ case nextButtonDidTap
+ }
+
+ public enum Mutation {
+ case navigateToNickNameSignup
+ }
+
+ public struct State { }
+}
+
+extension PasswordSignupReactor {
+ public func mutate(action: Action) -> Observable {
+ switch action {
+ case .nextButtonDidTap:
+ return .just(.navigateToNickNameSignup)
+ }
+ }
+ public func reduce(state: State, mutation: Mutation) -> State {
+ var newState = state
+ switch mutation {
+ case .navigateToNickNameSignup:
+ steps.accept(PasswordSignupStep.nickNameSignupIsRequired)
+ }
+ return newState
+ }
+}
diff --git a/Projects/Presentation/Sources/Auth/Signup/PasswordSignup/PasswordSignupViewController.swift b/Projects/Presentation/Sources/Auth/Signup/PasswordSignup/PasswordSignupViewController.swift
new file mode 100644
index 0000000..19dd96e
--- /dev/null
+++ b/Projects/Presentation/Sources/Auth/Signup/PasswordSignup/PasswordSignupViewController.swift
@@ -0,0 +1,65 @@
+import UIKit
+import SnapKit
+import Then
+import DesignSystem
+import RxSwift
+import RxCocoa
+
+public class PasswordSignupViewController: BaseReactorViewController {
+ private let titleLabel = UILabel().then {
+ $0.text = "비밀번호를 입력해주세요"
+ $0.textColor = .black
+ $0.font = .pretendardFont(.semibold, size: 26)
+ }
+ private let passwordTextField = EmotingTextField(placeholder: "비밀번호")
+ private let passwordCheckTextField = EmotingTextField(placeholder: "비밀번호 재확인")
+ private let nextButton = UIButton(type: .system).then {
+ $0.backgroundColor = .Main.main500
+ $0.layer.cornerRadius = 12
+ $0.setTitle("다음", for: .normal)
+ $0.setTitleColor(.white, for: .normal)
+ $0.titleLabel?.font = .pretendardFont(.semibold, size: 18)
+ }
+
+ public override func configureNavigation() {
+ self.navigationItem.title = "회원가입"
+ }
+
+ public override func bindAction() {
+ nextButton.rx.tap.asObservable()
+ .map { PasswordSignupReactor.Action.nextButtonDidTap }
+ .bind(to: reactor.action)
+ .disposed(by: disposeBag)
+ }
+
+ public override func addView() {
+ [
+ titleLabel,
+ passwordTextField,
+ passwordCheckTextField,
+ nextButton
+ ].forEach(view.addSubview(_:))
+ }
+
+ public override func setLayout() {
+ titleLabel.snp.makeConstraints {
+ $0.topMargin.equalToSuperview().inset(40)
+ $0.leading.equalToSuperview().inset(20)
+ }
+ passwordTextField.snp.makeConstraints {
+ $0.leading.trailing.equalToSuperview().inset(20)
+ $0.top.equalTo(titleLabel.snp.bottom).offset(44)
+ $0.height.equalTo(57)
+ }
+ passwordCheckTextField.snp.makeConstraints {
+ $0.leading.trailing.equalToSuperview().inset(20)
+ $0.top.equalTo(passwordTextField.snp.bottom).offset(54)
+ $0.height.equalTo(57)
+ }
+ nextButton.snp.makeConstraints {
+ $0.bottom.equalToSuperview().inset(54)
+ $0.leading.trailing.equalToSuperview().inset(20)
+ $0.height.equalTo(52)
+ }
+ }
+}
diff --git a/Projects/Presentation/Sources/Auth/Signup/ProfilSignup/ProfilSignupReactor.swift b/Projects/Presentation/Sources/Auth/Signup/ProfilSignup/ProfilSignupReactor.swift
new file mode 100644
index 0000000..8cd8fa5
--- /dev/null
+++ b/Projects/Presentation/Sources/Auth/Signup/ProfilSignup/ProfilSignupReactor.swift
@@ -0,0 +1,41 @@
+import ReactorKit
+import RxSwift
+import RxCocoa
+import Domain
+import RxFlow
+import Core
+
+public final class ProfilSignupReactor: BaseReactor, Stepper {
+ public let steps = PublishRelay()
+ public let initialState = State()
+ private let disposeBag = DisposeBag()
+ public init() {}
+
+ public enum Action {
+ case nextButtonDidTap
+ }
+
+ public enum Mutation {
+ case signupSuccess
+ }
+
+ public struct State { }
+}
+
+extension ProfilSignupReactor {
+ public func mutate(action: Action) -> Observable {
+ switch action {
+ case .nextButtonDidTap:
+ return .just(.signupSuccess)
+ }
+ }
+
+ public func reduce(state: State, mutation: Mutation) -> State {
+ var newState = state
+ switch mutation {
+ case .signupSuccess:
+ steps.accept(ProFilSignupStep.oauthLoginIsRequired)
+ }
+ return newState
+ }
+}
diff --git a/Projects/Presentation/Sources/Auth/Signup/ProfilSignup/ProfilSignupViewController.swift b/Projects/Presentation/Sources/Auth/Signup/ProfilSignup/ProfilSignupViewController.swift
new file mode 100644
index 0000000..33a4e12
--- /dev/null
+++ b/Projects/Presentation/Sources/Auth/Signup/ProfilSignup/ProfilSignupViewController.swift
@@ -0,0 +1,66 @@
+import UIKit
+import SnapKit
+import Then
+import DesignSystem
+import RxSwift
+import RxCocoa
+
+public class ProfilSignupViewController: BaseReactorViewController {
+ private let titleLabel = UILabel().then {
+ $0.text = "프로필을 등록해주세요"
+ $0.textColor = .black
+ $0.font = .pretendardFont(.semibold, size: 26)
+ }
+ private let afterButton = UIButton(type: .system).then {
+ $0.backgroundColor = .white
+ $0.layer.cornerRadius = 12
+ $0.layer.borderColor = UIColor.Main.main500.cgColor
+ $0.layer.borderWidth = 1
+ $0.setTitle("나중에 하기", for: .normal)
+ $0.setTitleColor(.Main.main500, for: .normal)
+ $0.titleLabel?.font = .pretendardFont(.semibold, size: 18)
+ }
+ private let nextButton = UIButton(type: .system).then {
+ $0.backgroundColor = .Main.main500
+ $0.layer.cornerRadius = 12
+ $0.setTitle("다음", for: .normal)
+ $0.setTitleColor(.white, for: .normal)
+ $0.titleLabel?.font = .pretendardFont(.semibold, size: 18)
+ }
+
+ public override func configureNavigation() {
+ self.navigationItem.title = "회원가입"
+ }
+
+ public override func bindAction() {
+ nextButton.rx.tap.asObservable()
+ .map { ProfilSignupReactor.Action.nextButtonDidTap }
+ .bind(to: reactor.action)
+ .disposed(by: disposeBag)
+ }
+
+ public override func addView() {
+ [
+ titleLabel,
+ afterButton,
+ nextButton
+ ].forEach(view.addSubview(_:))
+ }
+
+ public override func setLayout() {
+ titleLabel.snp.makeConstraints {
+ $0.topMargin.equalToSuperview().inset(40)
+ $0.centerX.equalToSuperview()
+ }
+ afterButton.snp.makeConstraints {
+ $0.bottom.equalTo(nextButton.snp.top).offset(-20)
+ $0.leading.trailing.equalToSuperview().inset(20)
+ $0.height.equalTo(52)
+ }
+ nextButton.snp.makeConstraints {
+ $0.bottom.equalToSuperview().inset(44)
+ $0.leading.trailing.equalToSuperview().inset(20)
+ $0.height.equalTo(52)
+ }
+ }
+}
diff --git a/Projects/Presentation/Sources/Base/BaseNavigationController.swift b/Projects/Presentation/Sources/Base/BaseNavigationController.swift
index 0e84e39..805d273 100644
--- a/Projects/Presentation/Sources/Base/BaseNavigationController.swift
+++ b/Projects/Presentation/Sources/Base/BaseNavigationController.swift
@@ -1,4 +1,5 @@
import UIKit
+import DesignSystem
public class BaseNavigationController: UINavigationController {
@@ -17,7 +18,7 @@ public class BaseNavigationController: UINavigationController {
private var backButtonImage: UIImage? {
return UIImage(systemName: "chevron.left")!
- .withAlignmentRectInsets(UIEdgeInsets(top: 0.0, left: -12.0, bottom: 0.0, right: 0.0))
+ .withAlignmentRectInsets(UIEdgeInsets(top: 16.0, left: -16.0, bottom: 16.0, right: 0.0))
}
private var backButtonAppearance: UIBarButtonItemAppearance {
@@ -29,7 +30,7 @@ public class BaseNavigationController: UINavigationController {
private func setNavigationBarAppearance() {
let scrollEdgeAppearance = UINavigationBarAppearance()
let standardAppearance = UINavigationBarAppearance()
-// navigationBar.tintColor = .GrayScale.gray60
+ navigationBar.tintColor = .GrayScale.gray500
scrollEdgeAppearance.setBackIndicatorImage(
backButtonImage,
transitionMaskImage: backButtonImage
@@ -38,12 +39,15 @@ public class BaseNavigationController: UINavigationController {
backButtonImage,
transitionMaskImage: backButtonImage
)
-// scrollEdgeAppearance.backgroundColor = .GrayScale.gray10
+ scrollEdgeAppearance.backgroundColor = .white
scrollEdgeAppearance.configureWithTransparentBackground()
standardAppearance.configureWithDefaultBackground()
scrollEdgeAppearance.backButtonAppearance = backButtonAppearance
standardAppearance.backButtonAppearance = backButtonAppearance
+ scrollEdgeAppearance.titleTextAttributes = [
+ .font: UIFont.pretendardFont(.regular, size: 16)
+ ]
// scrollEdgeAppearance.largeTitleTextAttributes = [
// .font: UIFont.jobisFont(.pageTitle),
// .foregroundColor: UIColor.GrayScale.gray90
diff --git a/Projects/Presentation/Sources/DI/PresentationAssembly.swift b/Projects/Presentation/Sources/DI/PresentationAssembly.swift
new file mode 100644
index 0000000..0216f88
--- /dev/null
+++ b/Projects/Presentation/Sources/DI/PresentationAssembly.swift
@@ -0,0 +1,66 @@
+import Foundation
+import Swinject
+import Core
+import Domain
+
+public final class PresentationAssembly: Assembly {
+ public init() {}
+
+ public func assemble(container: Container) {
+ container.register(OnboardingReactor.self) { _ in
+ OnboardingReactor()
+ }
+ container.register(OnboardingViewController.self) { resolver in
+ OnboardingViewController(resolver.resolve(OnboardingReactor.self)!)
+ }
+
+ container.register(OauthLoginReactor.self) { _ in
+ OauthLoginReactor()
+ }
+ container.register(OauthLoginViewController.self) { resolver in
+ OauthLoginViewController(resolver.resolve(OauthLoginReactor.self)!)
+ }
+
+ container.register(EmailLoginReactor.self) { _ in
+ EmailLoginReactor()
+ }
+ container.register(EmailLoginViewController.self) { resolver in
+ EmailLoginViewController(resolver.resolve(EmailLoginReactor.self)!)
+ }
+
+ container.register(EmailSignupReactor.self) { _ in
+ EmailSignupReactor()
+ }
+ container.register(EmailSignupViewController.self) { resolver in
+ EmailSignupViewController(resolver.resolve(EmailSignupReactor.self)!)
+ }
+
+ container.register(PasswordSignupReactor.self) { _ in
+ PasswordSignupReactor()
+ }
+ container.register(PasswordSignupViewController.self) { resolver in
+ PasswordSignupViewController(resolver.resolve(PasswordSignupReactor.self)!)
+ }
+
+ container.register(NickNameSignupReactor.self) { _ in
+ NickNameSignupReactor()
+ }
+ container.register(NickNameSignupViewController.self) { resolver in
+ NickNameSignupViewController(resolver.resolve(NickNameSignupReactor.self)!)
+ }
+
+ container.register(AgeSignupReactor.self) { _ in
+ AgeSignupReactor()
+ }
+ container.register(AgeSignupViewController.self) { resolver in
+ AgeSignupViewController(resolver.resolve(AgeSignupReactor.self)!)
+ }
+
+ container.register(ProfilSignupReactor.self) { _ in
+ ProfilSignupReactor()
+ }
+ container.register(ProfilSignupViewController.self) { resolver in
+ ProfilSignupViewController(resolver.resolve(ProfilSignupReactor.self)!)
+ }
+ }
+}
diff --git a/Projects/Presentation/Sources/Onboarding/OnboardingReactor.swift b/Projects/Presentation/Sources/Onboarding/OnboardingReactor.swift
new file mode 100644
index 0000000..5fa444c
--- /dev/null
+++ b/Projects/Presentation/Sources/Onboarding/OnboardingReactor.swift
@@ -0,0 +1,47 @@
+import ReactorKit
+import RxSwift
+import RxCocoa
+import Domain
+import RxFlow
+import Core
+
+public final class OnboardingReactor: BaseReactor, Stepper {
+ public let steps = PublishRelay()
+ public let initialState = State()
+ private let disposeBag = DisposeBag()
+ public init() {}
+
+ public enum Action {
+ case viewDidAppear
+ }
+
+ public enum Mutation {
+ case refreshSuccess
+ case refreshFail
+ }
+
+ public struct State { }
+}
+
+extension OnboardingReactor {
+ public func mutate(action: Action) -> Observable {
+ switch action {
+ case .viewDidAppear:
+ return .just(.refreshFail)
+ .delay(.seconds(1), scheduler: MainScheduler.asyncInstance)
+ }
+ }
+ public func reduce(state: State, mutation: Mutation) -> State {
+ var newState = state
+
+ switch mutation {
+ case .refreshFail:
+ steps.accept(OnboardingStep.oauthLoginIsRequired)
+
+ case .refreshSuccess:
+ steps.accept(OnboardingStep.tabIsRequired)
+ }
+
+ return newState
+ }
+}
diff --git a/Projects/Presentation/Sources/Onboarding/OnboardingViewController.swift b/Projects/Presentation/Sources/Onboarding/OnboardingViewController.swift
new file mode 100644
index 0000000..5b6d3e1
--- /dev/null
+++ b/Projects/Presentation/Sources/Onboarding/OnboardingViewController.swift
@@ -0,0 +1,34 @@
+import UIKit
+import SnapKit
+import Then
+import DesignSystem
+import RxCocoa
+import RxSwift
+
+public class OnboardingViewController: BaseReactorViewController {
+ private let titleLabel = UILabel().then {
+ $0.text = "Emoting"
+ $0.textColor = .white
+ $0.font = .pretendardFont(.extrabold, size: 40)
+ }
+
+ public override func configureViewController() {
+ self.view.backgroundColor = .Main.main500
+ }
+ public override func bindAction() {
+ viewWillAppearPublisher.asObservable()
+ .map { OnboardingReactor.Action.viewDidAppear }
+ .bind(to: reactor.action)
+ .disposed(by: disposeBag)
+ }
+
+ public override func addView() {
+ self.view.addSubview(titleLabel)
+ }
+
+ public override func setLayout() {
+ titleLabel.snp.makeConstraints {
+ $0.center.equalToSuperview()
+ }
+ }
+}
diff --git a/Tuist/Dependencies.swift b/Tuist/Dependencies.swift
index 953b374..356be19 100644
--- a/Tuist/Dependencies.swift
+++ b/Tuist/Dependencies.swift
@@ -43,6 +43,10 @@ let dependencies = Dependencies(
.remote(
url: "https://github.com/RxSwiftCommunity/RxGesture",
requirement: .upToNextMajor(from: "4.0.0")
+ ),
+ .remote(
+ url: "https://github.com/raulriera/TextFieldEffects",
+ requirement: .upToNextMajor(from: "1.7.0")
)
]
),