Home, Settings, About UI Changes (#819)

* Home, Settings, About UI Changes

* Settings Screen #808 - Updated Settings Screen according to Figma Design

* Settings Screen - Suggested Changes

* About Screen - UI Suggestions Updated

* Updated "Load Screen" Design

* Security Warning UI

* RecoveryPhraseDisplay UI Updates

---------

Co-authored-by: praveen <praveenkumarvattipalli@Praveens-MacBook-Pro-2.local>
This commit is contained in:
PraveenKumarVattipalli 2023-09-26 17:41:34 +05:30 committed by GitHub
parent 78f230a768
commit ce171563f8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
42 changed files with 1426 additions and 175 deletions

View File

@ -21,12 +21,18 @@ public struct HomeView: View {
WithViewStore(store) { viewStore in
VStack {
balance(viewStore)
Spacer()
sendButton(viewStore)
receiveButton(viewStore)
VStack {
if viewStore.isSendButtonDisabled {
dismissButton(viewStore)
}else {
sendButton(viewStore)
}
receiveButton(viewStore)
}
.padding(EdgeInsets(top: 0.0, leading: 50.0, bottom: 0, trailing: 50.0))
Button {
viewStore.send(.updateDestination(.transactionHistory))
@ -112,8 +118,19 @@ extension HomeView {
.padding(.bottom, 30)
.disable(
when: viewStore.isSendButtonDisabled,
dimmingOpacity: 0.5
dimmingOpacity: 0.8
)
}
func dismissButton(_ viewStore: HomeViewStore) -> some View {
Button(action: {
viewStore.send(.updateDestination(.send))
}, label: {
Text(L10n.Home.sendZec(tokenName))
})
.disableButtonStyle
.padding(.bottom, 30)
}
func receiveButton(_ viewStore: HomeViewStore) -> some View {
@ -122,7 +139,8 @@ extension HomeView {
}, label: {
Text(L10n.Home.receiveZec(tokenName))
})
.activeButtonStyle
.activeWhiteButtonStyle
.padding(.bottom, 30)
}

View File

@ -21,33 +21,64 @@ public struct PlainOnboardingView: View {
public var body: some View {
WithViewStore(store) { viewStore in
VStack {
VStack(alignment: .leading, spacing: 80) {
Text(L10n.PlainOnboarding.title)
//Commenting Following Two text and Adding Image and Text accroding to updated Figma Design
// VStack(alignment: .leading, spacing: 80) {
// Text(L10n.PlainOnboarding.title)
// .font(
// .custom(FontFamily.Inter.regular.name, size: 34, relativeTo: .largeTitle)
// .weight(.heavy)
// )
//
// Text(L10n.PlainOnboarding.caption)
// .font(
// .custom(FontFamily.Inter.regular.name, size: 16, relativeTo: .body)
// .weight(.semibold)
// )
// }
// .padding(0)
VStack(spacing: 27) {
Image(Asset.Assets.welcomeScreenLogo.name)
.resizable()
.frame(width: 150, height: 150)
Text(L10n.WelcomeScreen.description)
.font(
.custom(FontFamily.Inter.regular.name, size: 34, relativeTo: .largeTitle)
.weight(.heavy)
)
Text(L10n.PlainOnboarding.caption)
.font(
.custom(FontFamily.Inter.regular.name, size: 16, relativeTo: .body)
.weight(.semibold)
.custom(FontFamily.Inter.regular.name, size: 22)
.weight(.regular)
)
.multilineTextAlignment(.center)
.foregroundColor(.black)
.frame(width: 277, height: 147, alignment: .top)
Spacer()
}
.padding(0)
.padding(.top, 75.0)
Spacer()
Button(L10n.PlainOnboarding.Button.createNewWallet) {
viewStore.send(.createNewWallet, animation: .easeInOut(duration: animationDuration))
VStack(spacing: 23) {
Button(L10n.PlainOnboarding.Button.createNewWallet.uppercased()) {
viewStore.send(.createNewWallet, animation: .easeInOut(duration: animationDuration))
}
.activeButtonStyle
.font(
.custom(FontFamily.Inter.medium.name, size: 14)
.weight(.medium)
)
.frame(height: 70)
Button(L10n.PlainOnboarding.Button.restoreWallet.uppercased()) {
viewStore.send(.importExistingWallet, animation: .easeInOut(duration: animationDuration))
}
.activeWhiteButtonStyle
.font(
.custom(FontFamily.Inter.medium.name, size: 14)
.weight(.medium)
)
.frame(height: 70)
.foregroundColor(Asset.Colors.Mfp.fontDark.color)
}
.activeButtonStyle
.padding(EdgeInsets(top: 0.0, leading: 50.0, bottom: 0, trailing: 50.0))
Button(L10n.PlainOnboarding.Button.restoreWallet) {
viewStore.send(.importExistingWallet, animation: .easeInOut(duration: animationDuration))
}
.frame(height: 80)
.foregroundColor(Asset.Colors.Mfp.fontDark.color)
}
.padding(.all)
.navigationLinkEmpty(

View File

@ -19,72 +19,92 @@ public struct RecoveryPhraseDisplayView: View {
public var body: some View {
WithViewStore(self.store) { viewStore in
VStack(alignment: .center, spacing: 0) {
VStack(alignment: .center, spacing: 30) {
if let groups = viewStore.phrase?.toGroups(groupSizeOverride: 2) {
VStack(spacing: 20) {
Text(L10n.RecoveryPhraseDisplay.title)
.font(
.custom(FontFamily.Inter.regular.name, size: 20)
.weight(.bold)
)
.multilineTextAlignment(.center)
VStack(alignment: .center, spacing: 4) {
Text(L10n.RecoveryPhraseDisplay.description)
.font(
.custom(FontFamily.Inter.regular.name, size: 16)
)
.padding(.horizontal, 20)
}
}
.padding(.top, 0)
.padding(.bottom, 20)
Spacer()
VStack(alignment: .leading, spacing: 10) {
ForEach(groups, id: \.startIndex) { group in
VStack {
HStack(alignment: .center) {
HStack {
Spacer()
Text("\(group.startIndex). \(group.words[0].data)")
Spacer()
Asset.Assets.zashiLogo.image
.resizable()
.frame(width: 33, height: 43)
VStack(alignment: .center, spacing: 10) {
VStack(spacing: 10) {
Text(L10n.RecoveryPhraseDisplay.title)
.font(
.custom(FontFamily.Inter.regular.name, size: 25)
.weight(.bold)
)
.multilineTextAlignment(.center)
VStack(alignment: .center, spacing: 4) {
Text(L10n.RecoveryPhraseDisplay.description)
.font(
.custom(FontFamily.Inter.regular.name, size: 14)
)
.frame(height: 100)
.multilineTextAlignment(.center)
.padding(.horizontal, 20)
}
}
.padding(.top, 0)
.padding(.bottom, 20)
VStack(alignment: .leading, spacing: 10) {
ForEach(groups, id: \.startIndex) { group in
VStack {
HStack(alignment: .center) {
HStack {
Spacer()
Text("\(group.startIndex). \(group.words[0].data)")
.font(
.custom(FontFamily.Inter.regular.name, size: 16)
)
Spacer()
}
.padding(.leading, 20)
HStack {
Spacer()
Text("\(group.startIndex + 1). \(group.words[1].data)")
.font(
.custom(FontFamily.Inter.regular.name, size: 16)
)
Spacer()
}
.padding(.trailing, 20)
}
.padding(.leading, 20)
HStack {
Spacer()
Text("\(group.startIndex + 1). \(group.words[1].data)")
Spacer()
}
.padding(.trailing, 20)
}
}
}
}
Spacer()
VStack {
Button(
action: { viewStore.send(.finishedPressed) },
label: { Text(L10n.RecoveryPhraseDisplay.Button.wroteItDown) }
Text(L10n.RecoveryPhraseDisplay.subtext)
.font(
.custom(FontFamily.Inter.regular.name, size: 14)
)
.activeButtonStyle
.frame(height: 60)
}
.padding()
Button(
action: { viewStore.send(.finishedPressed) },
label: { Text(L10n.RecoveryPhraseDisplay.Button.wroteItDown) }
)
.activeButtonStyle
.frame(height: 70)
.padding(EdgeInsets(top: 10.0, leading: 50.0, bottom: 60.0, trailing: 50.0))
} else {
Text(L10n.RecoveryPhraseDisplay.noWords)
}
}
.padding(.bottom, 20)
.padding(.horizontal)
.padding(.top, 0)
.applyScreenBackground()
// .padding(.bottom, 0)
// .padding(.horizontal)
// .padding(.top, 0)
// .applyScreenBackground()
}
.navigationBarTitleDisplayMode(.inline)
.navigationBarHidden(true)
// .navigationBarTitleDisplayMode(.inline)
// .navigationBarHidden(true)
.applyScreenBackground()
.replaceNavigationBackButton()
}
}
// TODO: [#695] This should have a #DEBUG tag, but if so, it's not possible to compile this on release mode and submit it to testflight https://github.com/zcash/ZcashLightClientKit/issues/695

View File

@ -0,0 +1,42 @@
//
// File.swift
//
//
// Created by Praveen kumar Vattipalli on 09/09/23.
//
import Foundation
import ComposableArchitecture
import Models
import Pasteboard
public typealias SecurityWarningStore = Store<SecurityWarningReducer.State, SecurityWarningReducer.Action>
public struct SecurityWarningReducer: ReducerProtocol {
public struct State: Equatable {}
public enum Action: Equatable {
case debugMenuStartup
}
public init() {}
public func reduce(into state: inout State, action: Action) -> ComposableArchitecture.EffectTask<Action> {
return .none
}
}
// MARK: - Store
extension SecurityWarningStore {
public static var demo = SecurityWarningStore(
initialState: .placeholder,
reducer: SecurityWarningReducer()
)
}
// MARK: - Placeholders
extension SecurityWarningReducer.State {
public static let placeholder = SecurityWarningReducer.State()
}

View File

@ -0,0 +1,97 @@
//
// File.swift
//
//
// Created by Praveen kumar Vattipalli on 08/09/23.
//
import SwiftUI
import ComposableArchitecture
import Generated
import UIComponents
public struct SecurityWarningView: View {
let store: SecurityWarningStore
@State var isOn = false
public init(store: SecurityWarningStore) {
self.store = store
}
public var body: some View {
WithViewStore(store) { viewStore in
VStack(alignment: .leading, spacing: 45) {
VStack(alignment: .center, spacing: 45) {
Asset.Assets.zashiLogo.image
.resizable()
.frame(width: 33, height: 43)
VStack(alignment: .center, spacing: 25) {
Text("Security warning:")
.font(
.custom(FontFamily.Inter.bold.name, size: 25)
.weight(.bold)
)
.foregroundColor(Asset.Colors.Mfp.fontDark.color)
Text("Zashi 0.9 is a Zcash-only shielded wallet, built by Zcashers for Zcashers. The purpose of this release is primarily to test functionality and collect feedback. While Zashi has been engineered for your privacy and safety (read the privacy policy here), this release has not yet been security audited. Users are cautioned to deposit, send, and receive only small amounts of ZEC. Please click below to proceed.")
.foregroundColor(Asset.Colors.Mfp.fontDark.color)
.font(
.custom(FontFamily.Inter.regular.name, size: 16)
.weight(.regular)
)
.padding(.leading, 50)
.padding(.trailing, 50)
}
}
VStack(alignment: .leading) {
Toggle("I acknowledge", isOn: $isOn)
.padding(.leading, 50)
.toggleStyle(CheckboxToggleStyle())
.font(
.custom(FontFamily.Inter.regular.name, size: 14)
.weight(.regular)
)
}
Spacer()
Button(
action: { viewStore.send(.debugMenuStartup) },
label: { Text("CONFIRM") }
)
.activeButtonStyle
.frame(maxHeight: 70)
.padding(EdgeInsets(top: 30.0, leading: 50.0, bottom: 60.0, trailing: 50.0))
}
.padding(.top, 0)
.applyScreenBackground()
.replaceNavigationBackButton()
}
}
}
struct CheckboxToggleStyle: ToggleStyle {
func makeBody(configuration: Configuration) -> some View {
HStack {
RoundedRectangle(cornerRadius: 5.0)
.stroke(lineWidth: 2)
.frame(width: 20, height: 20)
.cornerRadius(5.0)
.overlay {
Image(systemName: configuration.isOn ? "checkmark" : "")
}
.onTapGesture {
withAnimation(.spring()) {
configuration.isOn.toggle()
}
}
configuration.label
}
}
}

View File

@ -125,6 +125,8 @@ extension RootReducer {
case .home, .initialization, .onboarding, .phraseDisplay, .phraseValidation, .sandbox, .updateStateAfterConfigUpdate, .alert,
.welcome, .binding, .nukeWalletFailed, .nukeWalletSucceeded, .debug, .walletConfigLoaded, .exportLogs:
return .none
case .securityWarning(_):
return .none
}
return .none

View File

@ -267,7 +267,7 @@ extension RootReducer {
return .none
case .home, .destination, .onboarding, .phraseDisplay, .phraseValidation, .sandbox,
.welcome, .binding, .debug, .exportLogs, .alert:
.welcome, .binding, .debug, .exportLogs, .securityWarning,.alert:
return .none
}
}

View File

@ -38,6 +38,7 @@ public struct RootReducer: ReducerProtocol {
public var onboardingState: OnboardingFlowReducer.State
public var phraseValidationState: RecoveryPhraseValidationFlowReducer.State
public var phraseDisplayState: RecoveryPhraseDisplayReducer.State
public var securityWarningState: SecurityWarningReducer.State
public var sandboxState: SandboxReducer.State
public var storedWallet: StoredWallet?
public var walletConfig: WalletConfig
@ -52,6 +53,7 @@ public struct RootReducer: ReducerProtocol {
onboardingState: OnboardingFlowReducer.State,
phraseValidationState: RecoveryPhraseValidationFlowReducer.State,
phraseDisplayState: RecoveryPhraseDisplayReducer.State,
securityWarningState: SecurityWarningReducer.State,
sandboxState: SandboxReducer.State,
storedWallet: StoredWallet? = nil,
walletConfig: WalletConfig,
@ -65,6 +67,7 @@ public struct RootReducer: ReducerProtocol {
self.onboardingState = onboardingState
self.phraseValidationState = phraseValidationState
self.phraseDisplayState = phraseDisplayState
self.securityWarningState = securityWarningState
self.sandboxState = sandboxState
self.storedWallet = storedWallet
self.walletConfig = walletConfig
@ -84,6 +87,7 @@ public struct RootReducer: ReducerProtocol {
case nukeWalletSucceeded
case onboarding(OnboardingFlowReducer.Action)
case phraseDisplay(RecoveryPhraseDisplayReducer.Action)
case securityWarning(SecurityWarningReducer.Action)
case phraseValidation(RecoveryPhraseValidationFlowReducer.Action)
case sandbox(SandboxReducer.Action)
case updateStateAfterConfigUpdate(WalletConfig)
@ -138,6 +142,10 @@ public struct RootReducer: ReducerProtocol {
Scope(state: \.welcomeState, action: /Action.welcome) {
WelcomeReducer()
}
Scope(state: \.securityWarningState, action: /Action.securityWarning) {
SecurityWarningReducer()
}
initializationReduce()
@ -328,6 +336,7 @@ extension RootReducer.State {
phraseDisplayState: RecoveryPhraseDisplayReducer.State(
phrase: .placeholder
),
securityWarningState: .placeholder,
sandboxState: .placeholder,
walletConfig: .default,
welcomeState: .placeholder

View File

@ -65,6 +65,8 @@ public struct SettingsReducer: ReducerProtocol {
case sendSupportMail
case sendSupportMailFinished
case updateDestination(SettingsReducer.State.Destination?)
case privacyPolicy
case documentation
}
@Dependency(\.appVersion) var appVersion
@ -118,7 +120,13 @@ public struct SettingsReducer: ReducerProtocol {
case .exportLogs:
return .none
case .privacyPolicy:
return .none
case .documentation:
return .none
case .phraseDisplay:
state.destination = nil
return .none

View File

@ -14,57 +14,50 @@ public struct SettingsView: View {
public var body: some View {
WithViewStore(store) { viewStore in
VStack(spacing: 40) {
Toggle(
L10n.Settings.crashReporting,
isOn: viewStore.binding(\.$isCrashReportingOn)
)
VStack(spacing: 25) {
Button(
action: { viewStore.send(.backupWalletAccessRequest) },
label: { Text(L10n.Settings.backupWallet) }
label: { Text(L10n.Settings.backupWallet.uppercased()) }
)
.activeButtonStyle
.frame(height: 50)
Button(
action: { viewStore.send(.exportLogs(.start)) },
label: {
if viewStore.exportLogsState.exportLogsDisabled {
HStack {
ProgressView()
Text(L10n.Settings.exporting)
}
} else {
Text(L10n.Settings.exportLogs)
}
}
)
.activeButtonStyle
.frame(height: 50)
.disable(
when: viewStore.exportLogsState.exportLogsDisabled,
dimmingOpacity: 0.5
)
.frame(height: 70)
Button(
action: { viewStore.send(.sendSupportMail) },
label: { Text(L10n.Settings.feedback) }
label: { Text(L10n.Settings.feedback.uppercased()) }
)
.activeButtonStyle
.frame(height: 50)
.frame(height: 70)
Button(
action: { viewStore.send(.privacyPolicy) },
label: { Text(L10n.Settings.privacyPolicy.uppercased()) }
)
.activeButtonStyle
.frame(height: 70)
Button(
action: { viewStore.send(.documentation) },
label: { Text(L10n.Settings.documentation.uppercased()) }
)
.activeButtonStyle
.frame(height: 70)
Spacer()
Button(
action: { viewStore.send(.updateDestination(.about)) },
label: { Text(L10n.Settings.about) }
label: { Text(L10n.Settings.about.uppercased()) }
)
.activeButtonStyle
.frame(maxHeight: 50)
.padding(.bottom, 50)
}
.padding(EdgeInsets(top: 30.0, leading: 50.0, bottom: 0, trailing: 50.0))
.padding(.horizontal, 30)
.navigationTitle(L10n.Settings.title)
.navigationTitle(L10n.Settings.title.uppercased())
.replaceNavigationBackButton()
.applyScreenBackground()
.navigationLinkEmpty(
isActive: viewStore.bindingForBackupPhrase,

View File

@ -18,13 +18,44 @@ public struct About: View {
public var body: some View {
WithViewStore(store) { viewStore in
VStack {
Text(L10n.Settings.version(viewStore.appVersion, viewStore.appBuild))
.foregroundColor(Asset.Colors.Mfp.fontDark.color)
VStack(alignment: .leading, spacing: 45) {
HStack(spacing: 15) {
Asset.Assets.zashiLogo.image
.resizable()
.frame(width: 62, height: 81)
Asset.Assets.zashiLogoText.image
.resizable()
.frame(width: 110, height: 30)
}
VStack(alignment: .leading, spacing: 25) {
Text(L10n.Settings.version(viewStore.appVersion, viewStore.appBuild))
.font(
.custom(FontFamily.Inter.bold.name, size: 14)
.weight(.bold)
)
.foregroundColor(Asset.Colors.Mfp.fontDark.color)
Text(L10n.About.description)
.foregroundColor(Asset.Colors.Mfp.fontDark.color)
.font(
.custom(FontFamily.Inter.regular.name, size: 14)
.weight(.regular)
)
}
.padding(.leading, 12)
.padding(.trailing, 60)
Spacer()
}
.padding(.top, 50)
.padding(.leading, 48)
.navigationTitle(L10n.Settings.about.uppercased())
.font(
.custom(FontFamily.Inter.bold.name, size: 14)
.weight(.bold)
)
.applyScreenBackground()
.replaceNavigationBackButton()
}
}
}

View File

@ -17,6 +17,7 @@ public struct WalletEventsFlowView: View {
walletEventsList(with: viewStore)
}
.navigationTitle(L10n.Transactions.title)
.replaceNavigationBackButton()
.listStyle(.plain)
.onAppear { viewStore.send(.onAppear) }
.onDisappear(perform: { viewStore.send(.onDisappear) })

View File

@ -38,3 +38,40 @@ extension WelcomeStore {
extension WelcomeReducer.State {
public static let placeholder = WelcomeReducer.State()
}
///
///
///
///
public typealias WelcomeBackStore = Store<WelcomeBackReducer.State, WelcomeBackReducer.Action>
public struct WelcomeBackReducer: ReducerProtocol {
public struct State: Equatable {}
public enum Action: Equatable {
case debugMenuStartup
}
public init() {}
public func reduce(into state: inout State, action: Action) -> ComposableArchitecture.EffectTask<Action> {
return .none
}
}
// MARK: - Store
extension WelcomeBackStore {
public static var demo = WelcomeBackStore(
initialState: .placeholder,
reducer: WelcomeBackReducer()
)
}
// MARK: - Placeholders
extension WelcomeBackReducer.State {
public static let placeholder = WelcomeBackReducer.State()
}

View File

@ -13,28 +13,71 @@ import UIComponents
public struct WelcomeView: View {
var store: WelcomeStore
@State var animate: Bool = false
public init(store: WelcomeStore) {
self.store = store
}
public var body: some View {
VStack(alignment: .center, spacing: 80) {
VStack {
Image(Asset.Assets.welcomeScreenLogo.name)
.resizable()
.frame(width: 150, height: 150)
.padding(.top, 100)
ZStack {
ZStack {
VStack(spacing: 27) {
Image(Asset.Assets.welcomeScreenLogo.name)
.resizable()
.frame(width: 150, height: 150)
Text(L10n.WelcomeScreen.description)
.font(
.custom(FontFamily.Inter.regular.name, size: 22)
.weight(.regular)
)
.multilineTextAlignment(.center)
.foregroundColor(.black)
.frame(width: 277, height: 147, alignment: .top)
Spacer()
}
.padding(.top, 75.0)
.accessDebugMenuWithHiddenGesture {
ViewStore(store).send(.debugMenuStartup)
}
}
ZStack {
LinearGradient(colors: [Asset.Colors.BackgroundColors.splashBGColor.color, Asset.Colors.BackgroundColors.splashBGColor.color, .clear], startPoint: .top, endPoint: .bottom)
VStack() {
Spacer()
Asset.Assets.splashBG.image
.resizable()
.aspectRatio(contentMode: .fit)
Spacer()
.frame(height: UIScreen.main.bounds.height)
}
VStack(spacing: 44) {
Asset.Assets.isolationModeLogo.image
.resizable()
.frame(width: 83, height: 107)
Asset.Assets.isolationModeLogoText.image
.frame(width: 82, height: 71)
}
.padding(.top, 75)
}
.offset(y: animate ? -(UIScreen.main.bounds.height) : 0)
.edgesIgnoringSafeArea(.all)
}
}
.accessDebugMenuWithHiddenGesture {
ViewStore(store).send(.debugMenuStartup)
.padding(.top, 50)
.applyScreenBackground()
.onAppear {
DispatchQueue.main.asyncAfter(deadline: .now()) {
withAnimation(.interpolatingSpring(stiffness: 20, damping: 8)
.speed(0.5)
) {
animate.toggle()
}
}
}
}
.frame(alignment: .center)
.applyScreenBackground()
.animation(.easeInOut, value: 3)
}
}
// MARK: - Previews

View File

@ -18,6 +18,11 @@ public enum L10n {
public static func qrCodeFor(_ p1: Any) -> String {
return L10n.tr("Localizable", "qrCodeFor", String(describing: p1), fallback: "QR Code for %@")
}
public enum About {
/// Send and receive ZEC on Zashi!
/// Zashi is a minimal-design, self-custody, ZEC-only shielded wallet that keeps your transaction history and wallet balance private. Built by Zcashers, for Zcashers. Developed and maintained by Electric Coin Co., the inventor of Zcash, Zashi features a built-in user-feedback mechanism to enable more features, more quickly.
public static let description = L10n.tr("Localizable", "about.description", fallback: "Send and receive ZEC on Zashi! \nZashi is a minimal-design, self-custody, ZEC-only shielded wallet that keeps your transaction history and wallet balance private. Built by Zcashers, for Zcashers. Developed and maintained by Electric Coin Co., the inventor of Zcash, Zashi features a built-in user-feedback mechanism to enable more features, more quickly.")
}
public enum AddressDetails {
/// Sapling Address
public static let sa = L10n.tr("Localizable", "addressDetails.sa", fallback: "Sapling Address")
@ -285,17 +290,19 @@ public enum L10n {
public static let title = L10n.tr("Localizable", "recoveryPhraseBackupValidation.title", fallback: "Verify Your Backup")
}
public enum RecoveryPhraseDisplay {
/// The following 24 words represent your funds and the security used to protect them. Back them up now!
public static let description = L10n.tr("Localizable", "recoveryPhraseDisplay.description", fallback: "The following 24 words represent your funds and the security used to protect them. Back them up now!")
/// The following 24 words are the keys to your funds and are the only way to recover your funds if you get locked out or get a new device. Protect your ZEC by storing this phrase in a place you trust and never share it with anyone!
public static let description = L10n.tr("Localizable", "recoveryPhraseDisplay.description", fallback: "The following 24 words are the keys to your funds and are the only way to recover your funds if you get locked out or get a new device. Protect your ZEC by storing this phrase in a place you trust and never share it with anyone!")
/// Oops no words
public static let noWords = L10n.tr("Localizable", "recoveryPhraseDisplay.noWords", fallback: "Oops no words")
/// Wallet birthday height: 1598622
public static let subtext = L10n.tr("Localizable", "recoveryPhraseDisplay.subtext", fallback: "Wallet birthday height: 1598622")
/// Your Secret Recovery Phrase
public static let title = L10n.tr("Localizable", "recoveryPhraseDisplay.title", fallback: "Your Secret Recovery Phrase")
public enum Button {
/// Copy To Buffer
public static let copyToBuffer = L10n.tr("Localizable", "recoveryPhraseDisplay.button.copyToBuffer", fallback: "Copy To Buffer")
/// I wrote it down!
public static let wroteItDown = L10n.tr("Localizable", "recoveryPhraseDisplay.button.wroteItDown", fallback: "I wrote it down!")
/// I GOT IT!
public static let wroteItDown = L10n.tr("Localizable", "recoveryPhraseDisplay.button.wroteItDown", fallback: "I GOT IT!")
}
}
public enum RecoveryPhraseTestPreamble {
@ -496,12 +503,16 @@ public enum L10n {
public static let backupWallet = L10n.tr("Localizable", "settings.backupWallet", fallback: "Backup Wallet")
/// Enable Crash Reporting
public static let crashReporting = L10n.tr("Localizable", "settings.crashReporting", fallback: "Enable Crash Reporting")
/// Documentation
public static let documentation = L10n.tr("Localizable", "settings.documentation", fallback: "Documentation")
/// Exporting...
public static let exporting = L10n.tr("Localizable", "settings.exporting", fallback: "Exporting...")
/// Export & share logs
public static let exportLogs = L10n.tr("Localizable", "settings.exportLogs", fallback: "Export & share logs")
/// Send us feedback!
public static let feedback = L10n.tr("Localizable", "settings.feedback", fallback: "Send us feedback!")
/// Send us feedback
public static let feedback = L10n.tr("Localizable", "settings.feedback", fallback: "Send us feedback")
/// Privacy Policy
public static let privacyPolicy = L10n.tr("Localizable", "settings.privacyPolicy", fallback: "Privacy Policy")
/// Settings
public static let title = L10n.tr("Localizable", "settings.title", fallback: "Settings")
/// Version %@ (%@)
@ -700,6 +711,8 @@ public enum L10n {
}
}
public enum WelcomeScreen {
/// A no frills wallet for sending and receiving Zcash (ZEC)
public static let description = L10n.tr("Localizable", "welcomeScreen.description", fallback: "A no frills wallet for sending and receiving Zcash (ZEC)")
/// Just Loading, one sec
public static let subtitle = L10n.tr("Localizable", "welcomeScreen.subtitle", fallback: "Just Loading, one sec")
/// Powered by Zcash

View File

@ -0,0 +1,12 @@
{
"images" : [
{
"filename" : "IsolationModeLogoText.pdf",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@ -0,0 +1,161 @@
%PDF-1.7
1 0 obj
<< /Type /XObject
/Length 2 0 R
/Group << /Type /Group
/S /Transparency
>>
/Subtype /Form
/Resources << >>
/BBox [ 0.000000 0.000000 82.000000 71.000000 ]
>>
stream
/DeviceRGB CS
/DeviceRGB cs
q
1.000000 0.000000 -0.000000 1.000000 -0.012146 0.000000 cm
1.000000 1.000000 1.000000 scn
41.333328 71.000000 m
57.393932 68.941673 l
57.393932 1.261955 l
41.333328 0.000000 l
41.333328 31.217945 l
16.400000 31.659016 l
16.400000 1.274200 l
0.000000 0.012253 l
0.000000 69.100952 l
16.412121 71.000000 l
16.412121 41.313545 l
41.345448 41.521832 l
41.345448 71.000000 l
41.333328 71.000000 l
h
f
n
Q
q
1.000000 0.000000 -0.000000 1.000000 65.599976 0.000000 cm
1.000000 1.000000 1.000000 scn
0.000000 69.137703 m
16.400003 71.000000 l
16.400003 0.000000 l
0.000000 1.261955 l
0.000000 69.137703 l
h
f
n
Q
endstream
endobj
2 0 obj
635
endobj
3 0 obj
<< /Type /XObject
/Length 4 0 R
/Group << /Type /Group
/S /Transparency
>>
/Subtype /Form
/Resources << >>
/BBox [ 0.000000 0.000000 82.000000 71.000000 ]
>>
stream
/DeviceRGB CS
/DeviceRGB cs
q
1.000000 0.000000 -0.000000 1.000000 0.000000 0.000000 cm
0.000000 0.000000 0.000000 scn
0.000000 71.000000 m
82.000000 71.000000 l
82.000000 0.000000 l
0.000000 0.000000 l
0.000000 71.000000 l
h
f
n
Q
endstream
endobj
4 0 obj
232
endobj
5 0 obj
<< /XObject << /X1 1 0 R >>
/ExtGState << /E1 << /SMask << /Type /Mask
/G 3 0 R
/S /Alpha
>>
/Type /ExtGState
>> >>
>>
endobj
6 0 obj
<< /Length 7 0 R >>
stream
/DeviceRGB CS
/DeviceRGB cs
q
/E1 gs
/X1 Do
Q
endstream
endobj
7 0 obj
46
endobj
8 0 obj
<< /Annots []
/Type /Page
/MediaBox [ 0.000000 0.000000 82.000000 71.000000 ]
/Resources 5 0 R
/Contents 6 0 R
/Parent 9 0 R
>>
endobj
9 0 obj
<< /Kids [ 8 0 R ]
/Count 1
/Type /Pages
>>
endobj
10 0 obj
<< /Pages 9 0 R
/Type /Catalog
>>
endobj
xref
0 11
0000000000 65535 f
0000000010 00000 n
0000000893 00000 n
0000000915 00000 n
0000001395 00000 n
0000001417 00000 n
0000001715 00000 n
0000001817 00000 n
0000001838 00000 n
0000002011 00000 n
0000002085 00000 n
trailer
<< /ID [ (some) (id) ]
/Root 10 0 R
/Size 11
>>
startxref
2145
%%EOF

View File

@ -0,0 +1,12 @@
{
"images" : [
{
"filename" : "Isolation_Mode.pdf",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@ -0,0 +1,154 @@
%PDF-1.7
1 0 obj
<< >>
endobj
2 0 obj
<< /Length 3 0 R >>
stream
/DeviceRGB CS
/DeviceRGB cs
q
1.000000 0.000000 -0.000000 1.000000 4.494629 -2.825684 cm
1.000000 1.000000 1.000000 scn
53.405182 5.249893 m
52.996174 4.337357 l
55.540451 3.196976 l
54.300926 5.694458 l
53.405182 5.249893 l
h
19.743061 20.337715 m
19.280258 21.224174 l
17.451040 20.269180 l
19.334053 19.425186 l
19.743061 20.337715 l
h
77.104774 50.285122 m
77.567574 49.398663 l
78.287605 49.774574 l
78.067284 50.556377 l
77.104774 50.285122 l
h
72.475632 66.710945 m
73.438141 66.982201 l
73.323631 67.388527 l
72.952583 67.589874 l
72.475632 66.710945 l
h
0.000000 106.040039 m
0.476953 106.918968 l
-3.794553 109.236908 l
-0.785220 105.420822 l
0.000000 106.040039 l
h
47.921436 45.271591 m
47.136215 44.652374 l
47.787216 43.826851 l
48.579147 44.518322 l
47.921436 45.271591 l
h
72.475632 66.710945 m
73.136009 65.960007 l
71.817924 67.464218 l
72.475632 66.710945 l
h
39.603252 30.809586 m
52.509438 4.805321 l
54.300926 5.694458 l
41.394741 31.698723 l
39.603252 30.809586 l
h
53.814190 6.162422 m
20.152071 21.250244 l
19.334053 19.425186 l
52.996174 4.337357 l
53.814190 6.162422 l
h
20.205866 19.451256 m
77.567574 49.398663 l
76.641968 51.171581 l
19.280258 21.224174 l
20.205866 19.451256 l
h
78.067284 50.556377 m
73.438141 66.982201 l
71.513123 66.439697 l
76.142265 50.013866 l
78.067284 50.556377 l
h
72.952583 67.589874 m
0.476953 106.918968 l
-0.476953 105.161110 l
71.998680 65.832016 l
72.952583 67.589874 l
h
-0.785220 105.420822 m
47.136215 44.652374 l
48.706657 45.890808 l
0.785220 106.659256 l
-0.785220 105.420822 l
h
48.579147 44.518322 m
73.133347 65.957672 l
71.817924 67.464218 l
47.263725 46.024860 l
48.579147 44.518322 l
h
71.815254 67.461884 m
19.082685 21.088654 l
20.403437 19.586784 l
73.136009 65.960007 l
71.815254 67.461884 l
h
f
n
Q
endstream
endobj
3 0 obj
1779
endobj
4 0 obj
<< /Annots []
/Type /Page
/MediaBox [ 0.000000 0.000000 83.000000 107.000000 ]
/Resources 1 0 R
/Contents 2 0 R
/Parent 5 0 R
>>
endobj
5 0 obj
<< /Kids [ 4 0 R ]
/Count 1
/Type /Pages
>>
endobj
6 0 obj
<< /Pages 5 0 R
/Type /Catalog
>>
endobj
xref
0 7
0000000000 65535 f
0000000010 00000 n
0000000034 00000 n
0000001869 00000 n
0000001892 00000 n
0000002066 00000 n
0000002140 00000 n
trailer
<< /ID [ (some) (id) ]
/Root 6 0 R
/Size 7
>>
startxref
2199
%%EOF

View File

@ -0,0 +1,12 @@
{
"images" : [
{
"filename" : "splashBG.png",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 65 KiB

View File

@ -0,0 +1,12 @@
{
"images" : [
{
"filename" : "zashi_logo.png",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 69 KiB

View File

@ -0,0 +1,12 @@
{
"images" : [
{
"filename" : "zashi_logo_text.png",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 106 KiB

View File

@ -0,0 +1,38 @@
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0x20",
"green" : "0x1F",
"red" : "0x23"
}
},
"idiom" : "universal"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0x20",
"green" : "0x1F",
"red" : "0x23"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@ -5,9 +5,9 @@
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0.341",
"green" : "0.200",
"red" : "0.149"
"blue" : "0x00",
"green" : "0x00",
"red" : "0x00"
}
},
"idiom" : "universal"

View File

@ -5,9 +5,9 @@
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0x57",
"green" : "0x33",
"red" : "0x26"
"blue" : "0.341",
"green" : "0.200",
"red" : "0.149"
}
},
"idiom" : "universal"

View File

@ -5,11 +5,12 @@
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0xFC",
"green" : "0xF7",
"red" : "0xF2"
"blue" : "1.000",
"green" : "1.000",
"red" : "1.000"
}
},
"display-gamut" : "sRGB",
"idiom" : "universal"
},
{
@ -23,16 +24,52 @@
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0x52",
"green" : "0x31",
"red" : "0x26"
"blue" : "0.322",
"green" : "0.192",
"red" : "0.149"
}
},
"display-gamut" : "sRGB",
"idiom" : "universal"
},
{
"color" : {
"color-space" : "display-p3",
"components" : {
"alpha" : "1.000",
"blue" : "1.000",
"green" : "1.000",
"red" : "1.000"
}
},
"display-gamut" : "display-P3",
"idiom" : "universal"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"color" : {
"color-space" : "display-p3",
"components" : {
"alpha" : "1.000",
"blue" : "0x4F",
"green" : "0x30",
"red" : "0x28"
}
},
"display-gamut" : "display-P3",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"localizable" : true
}
}

View File

@ -34,5 +34,8 @@
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"localizable" : true
}
}

View File

@ -1,6 +1,7 @@
// MARK: - Welcome Screen
"welcomeScreen.title" = "Powered by Zcash";
"welcomeScreen.subtitle" = "Just Loading, one sec";
"welcomeScreen.description" = "A no frills wallet for sending and receiving Zcash (ZEC)";
// MARK: - Plain Onboarding Flow
"plainOnboarding.title" = "It's time to setup your Secant, powered by Zcash, no-frills wallet.";
@ -26,10 +27,11 @@
// MARK: - Secret Recovery Phrase Display
"recoveryPhraseDisplay.title" = "Your Secret Recovery Phrase";
"recoveryPhraseDisplay.description" = "The following 24 words represent your funds and the security used to protect them. Back them up now!";
"recoveryPhraseDisplay.button.wroteItDown" = "I wrote it down!";
"recoveryPhraseDisplay.description" = "The following 24 words are the keys to your funds and are the only way to recover your funds if you get locked out or get a new device. Protect your ZEC by storing this phrase in a place you trust and never share it with anyone!";
"recoveryPhraseDisplay.button.wroteItDown" = "I GOT IT!";
"recoveryPhraseDisplay.button.copyToBuffer" = "Copy To Buffer";
"recoveryPhraseDisplay.noWords" = "Oops no words";
"recoveryPhraseDisplay.subtext" = "Wallet birthday height: 1598622";
// MARK: - Recovery Phrase Backup Validation & Success/Failed
"recoveryPhraseBackupValidation.title" = "Verify Your Backup";
@ -129,8 +131,10 @@
"settings.backupWallet" = "Backup Wallet";
"settings.exporting" = "Exporting...";
"settings.exportLogs" = "Export & share logs";
"settings.feedback" = "Send us feedback!";
"settings.feedback" = "Send us feedback";
"settings.about" = "About";
"settings.privacyPolicy" = "Privacy Policy";
"settings.documentation" = "Documentation";
"settings.version" = "Version %@ (%@)";
"settings.title" = "Settings";
"settings.alert.cantBackupWallet.title" = "Can't backup wallet";
@ -138,6 +142,9 @@
"settings.alert.cantSendEmail.title" = "Can't send email";
"settings.alert.cantSendEmail.message" = "It looks like that you don't have any email account configured on your device. Therefore it's not possible to send a support email.";
// MARK: - About
"about.description" = "Send and receive ZEC on Zashi! \nZashi is a minimal-design, self-custody, ZEC-only shielded wallet that keeps your transaction history and wallet balance private. Built by Zcashers, for Zcashers. Developed and maintained by Electric Coin Co., the inventor of Zcash, Zashi features a built-in user-feedback mechanism to enable more features, more quickly.";
// MARK: - Sync message
"sync.message.uptodate" = "Up-To-Date";
"sync.message.unprepared" = "Unprepared";

View File

@ -34,12 +34,18 @@ public enum Asset {
public static let calloutBackupSucceeded = ImageAsset(name: "calloutBackupSucceeded")
}
public static let welcomeScreenLogo = ImageAsset(name: "WelcomeScreenLogo")
public static let isolationModeLogo = ImageAsset(name: "isolationModeLogo")
public static let isolationModeLogoText = ImageAsset(name: "isolationModeLogoText")
public static let splashBG = ImageAsset(name: "splashBG")
public static let zashiLogo = ImageAsset(name: "zashi_logo")
public static let zashiLogoText = ImageAsset(name: "zashi_logo_text")
}
public enum Colors {
public enum BackgroundColors {
public static let numberedChip = ColorAsset(name: "numberedChip")
public static let phraseGridDarkGray = ColorAsset(name: "phraseGridDarkGray")
public static let red = ColorAsset(name: "red")
public static let splashBGColor = ColorAsset(name: "splashBGColor")
public static let staticWelcomeScreen = ColorAsset(name: "staticWelcomeScreen")
}
public enum Buttons {

View File

@ -15,7 +15,32 @@ extension Button {
foregroundColor: Asset.Colors.Text.activeButtonText.color,
background: Asset.Colors.Buttons.activeButton.color,
pressedBackgroundColor: Asset.Colors.Buttons.activeButtonPressed.color,
disabledBackgroundColor: Asset.Colors.Buttons.activeButtonDisabled.color
disabledBackgroundColor: Asset.Colors.Buttons.activeButtonDisabled.color,
overlayColor: Asset.Colors.Text.activeButtonText.color
)
)
}
public var activeWhiteButtonStyle: some View {
buttonStyle(
StandardButtonStyle(
foregroundColor: Asset.Colors.Buttons.activeButton.color,
background: Asset.Colors.Text.activeButtonText.color,
pressedBackgroundColor: Asset.Colors.Buttons.activeButtonPressed.color,
disabledBackgroundColor: Asset.Colors.Buttons.activeButtonDisabled.color,
overlayColor: Asset.Colors.Buttons.activeButton.color
)
)
}
public var disableButtonStyle: some View {
buttonStyle(
StandardButtonStyle(
foregroundColor: Asset.Colors.Text.activeButtonText.color,
background: Asset.Colors.Text.transactionRowSubtitle.color,
pressedBackgroundColor: Asset.Colors.Buttons.activeButtonPressed.color,
disabledBackgroundColor: Asset.Colors.Buttons.activeButtonDisabled.color,
overlayColor: Asset.Colors.Text.activeButtonText.color
)
)
}

View File

@ -15,30 +15,47 @@ public struct StandardButtonStyle: ButtonStyle {
let background: Color
let pressedBackgroundColor: Color
let disabledBackgroundColor: Color
let overlayColor: Color
public init(
foregroundColor: Color,
background: Color,
pressedBackgroundColor: Color,
disabledBackgroundColor: Color
disabledBackgroundColor: Color,
overlayColor: Color
) {
self.foregroundColor = foregroundColor
self.background = background
self.pressedBackgroundColor = pressedBackgroundColor
self.disabledBackgroundColor = disabledBackgroundColor
self.overlayColor = overlayColor
}
public func makeBody(configuration: Configuration) -> some View {
configuration.label
.frame(
minWidth: 0,
maxWidth: .infinity,
minHeight: 0,
maxHeight: .infinity
)
.frame(height: 60)
.foregroundColor(Asset.Colors.Mfp.fontLight.color)
.background(Asset.Colors.Mfp.primary.color)
ZStack {
Rectangle()
.frame(height: 60)
.overlay(
Rectangle()
.border(Color.black)
.foregroundColor(overlayColor)
.offset(y: 8)
.padding(.trailing, -10)
.padding(.leading, 13)
)
configuration.label
.frame(
minWidth: 0,
maxWidth: .infinity,
minHeight: 0,
maxHeight: .infinity
)
.frame(height: 60)
.foregroundColor(foregroundColor)
.background(background)
.border(Color.black)
}
}
}
@ -49,7 +66,8 @@ private extension Button {
foregroundColor: Asset.Colors.Text.button.color,
background: Asset.Colors.Buttons.activeButton.color,
pressedBackgroundColor: Asset.Colors.Buttons.activeButtonPressed.color,
disabledBackgroundColor: Asset.Colors.Buttons.activeButtonDisabled.color
disabledBackgroundColor: Asset.Colors.Buttons.activeButtonDisabled.color,
overlayColor: Asset.Colors.Text.button.color
)
)
}

View File

@ -0,0 +1,32 @@
//
// File.swift
//
//
// Created by Praveen kumar Vattipalli on 02/09/23.
//
import Foundation
import SwiftUI
import Generated
struct CustomNavigationButton: ViewModifier {
@Environment(\.dismiss) private var dismiss
func body(content: Content) -> some View {
content
.navigationBarBackButtonHidden(true)
.toolbar {
ToolbarItem(placement: .navigationBarLeading) {
Button {
dismiss()
} label: {
HStack {
Image(systemName: "arrow.left")
.foregroundColor(.black)
Text(L10n.General.back.uppercased())
.foregroundColor(.black)
}
}
}
}
}
}

View File

@ -31,3 +31,11 @@ extension View {
)
}
}
extension View {
public func replaceNavigationBackButton () -> some View {
self.modifier(
CustomNavigationButton()
)
}
}

View File

@ -18,6 +18,7 @@
0D3B01EC298DAF89007EBCDA /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 0D3B01EB298DAF89007EBCDA /* GoogleService-Info.plist */; };
0D4E7A0926B364170058B01E /* SecantApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0D4E7A0826B364170058B01E /* SecantApp.swift */; };
0D4E7A1026B364180058B01E /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 0D4E7A0F26B364180058B01E /* Preview Assets.xcassets */; };
201F7C5A2AAB523100D12019 /* SecuirtyWarningSnapshotTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 201F7C592AAB523100D12019 /* SecuirtyWarningSnapshotTests.swift */; };
34DA414928E439CD00F8CC61 /* sendingTransaction.json in Resources */ = {isa = PBXBuildFile; fileRef = 34DA414828E439CD00F8CC61 /* sendingTransaction.json */; };
9E00319C2A272BB6003DFCEB /* SDKSynchronizer in Frameworks */ = {isa = PBXBuildFile; productRef = 9E00319B2A272BB6003DFCEB /* SDKSynchronizer */; };
9E0031A42A272BC7003DFCEB /* SDKSynchronizer in Frameworks */ = {isa = PBXBuildFile; productRef = 9E0031A32A272BC7003DFCEB /* SDKSynchronizer */; };
@ -118,6 +119,7 @@
0DEF4766299EA5920032708B /* secant-mainnet-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "secant-mainnet-Info.plist"; sourceTree = "<group>"; };
0DFE93DE272C6D4B000FCCA5 /* RecoveryPhraseBackupTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RecoveryPhraseBackupTests.swift; sourceTree = "<group>"; };
0DFE93E5272CB6F7000FCCA5 /* RecoveryPhraseValidationTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecoveryPhraseValidationTests.swift; sourceTree = "<group>"; };
201F7C592AAB523100D12019 /* SecuirtyWarningSnapshotTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecuirtyWarningSnapshotTests.swift; sourceTree = "<group>"; };
341B30BA29B78D1000697081 /* HomeFeatureFlagTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeFeatureFlagTests.swift; sourceTree = "<group>"; };
34429C6D28E703CD00F2B929 /* TransactionSendingSnapshotTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TransactionSendingSnapshotTests.swift; sourceTree = "<group>"; };
3448CB3628E485CB006ADEDB /* NotEnoughFeeSpaceSnapshots.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotEnoughFeeSpaceSnapshots.swift; sourceTree = "<group>"; };
@ -311,6 +313,14 @@
path = RecoveryPhraseValidationTests;
sourceTree = "<group>";
};
201F7C582AAB520500D12019 /* SecurityWarningSnapshotTests */ = {
isa = PBXGroup;
children = (
201F7C592AAB523100D12019 /* SecuirtyWarningSnapshotTests.swift */,
);
path = SecurityWarningSnapshotTests;
sourceTree = "<group>";
};
343CF3F429BB5A14009E44DF /* Frameworks */ = {
isa = PBXGroup;
children = (
@ -387,6 +397,7 @@
9E391162284E3ECF0073DD9A /* SnapshotTests */ = {
isa = PBXGroup;
children = (
201F7C582AAB520500D12019 /* SecurityWarningSnapshotTests */,
9E207C342966EC60003E2C9B /* AddressDetailsSnapshotTests */,
9E94C62128AA7ECD008256E9 /* BalanceBreakdownSnapshotTests */,
9E9ECC8B28589E150099D5A2 /* HomeSnapshotTests */,
@ -934,6 +945,7 @@
9E3451AD29C84F0E00177D16 /* TransactionAmountInputTests.swift in Sources */,
9E3451C329C857DD00177D16 /* SettingsSnapshotTests.swift in Sources */,
9E34519D29C8484D00177D16 /* HomeFeatureFlagTests.swift in Sources */,
201F7C5A2AAB523100D12019 /* SecuirtyWarningSnapshotTests.swift in Sources */,
9E3451A229C84A5300177D16 /* OnboardingFlowFeatureFlagTests.swift in Sources */,
9E3451AC29C84F0000177D16 /* TransactionAddressInputTests.swift in Sources */,
9E3451A429C84B3E00177D16 /* RecoveryPhraseValidationTests.swift in Sources */,

View File

@ -3,8 +3,7 @@
<device id="retina6_1" orientation="portrait" appearance="light"/>
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="21679"/>
<capability name="Named colors" minToolsVersion="9.0"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="21678"/>
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
@ -17,20 +16,29 @@
<rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<imageView opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" insetsLayoutMarginsFromSafeArea="NO" image="WelcomeScreenLogo" translatesAutoresizingMaskIntoConstraints="NO" id="PMT-qL-kFu">
<rect key="frame" x="132" y="148" width="150" height="150"/>
<imageView opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" insetsLayoutMarginsFromSafeArea="NO" image="isolationModeLogo" translatesAutoresizingMaskIntoConstraints="NO" id="PMT-qL-kFu">
<rect key="frame" x="165.5" y="157" width="83" height="107"/>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
<constraints>
<constraint firstAttribute="width" constant="150" id="MNN-qz-URJ"/>
<constraint firstAttribute="height" constant="150" id="saZ-Pi-QsA"/>
<constraint firstAttribute="height" constant="107" id="JJN-ha-gaV"/>
<constraint firstAttribute="width" constant="83" id="hxG-Xl-cqi"/>
</constraints>
</imageView>
<imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="isolationModeLogoText" translatesAutoresizingMaskIntoConstraints="NO" id="Jv8-PA-oy4">
<rect key="frame" x="165.5" y="308" width="83" height="107"/>
<constraints>
<constraint firstAttribute="width" constant="83" id="iSS-vG-qu8"/>
<constraint firstAttribute="height" constant="107" id="lGO-At-TsX"/>
</constraints>
</imageView>
</subviews>
<viewLayoutGuide key="safeArea" id="Bcu-3y-fUS"/>
<color key="backgroundColor" name="launchScreenBcg"/>
<color key="backgroundColor" red="0.13725490196078433" green="0.12156862745098039" blue="0.12549019607843137" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<constraints>
<constraint firstItem="PMT-qL-kFu" firstAttribute="top" secondItem="Bcu-3y-fUS" secondAttribute="top" constant="100" id="VUR-7f-Qj5"/>
<constraint firstItem="PMT-qL-kFu" firstAttribute="centerX" secondItem="Ze5-6b-2t3" secondAttribute="centerX" id="bVu-ST-xoh"/>
<constraint firstItem="Jv8-PA-oy4" firstAttribute="centerX" secondItem="Ze5-6b-2t3" secondAttribute="centerX" id="Giu-tA-9cn"/>
<constraint firstItem="PMT-qL-kFu" firstAttribute="centerX" secondItem="Ze5-6b-2t3" secondAttribute="centerX" id="T9s-Kb-LGF"/>
<constraint firstItem="Jv8-PA-oy4" firstAttribute="top" secondItem="PMT-qL-kFu" secondAttribute="bottom" constant="44" id="cK1-iz-1N3"/>
<constraint firstItem="PMT-qL-kFu" firstAttribute="top" secondItem="Bcu-3y-fUS" secondAttribute="top" constant="109" id="kRE-a5-xK4"/>
</constraints>
</view>
</viewController>
@ -40,9 +48,7 @@
</scene>
</scenes>
<resources>
<image name="WelcomeScreenLogo" width="855" height="810"/>
<namedColor name="launchScreenBcg">
<color red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</namedColor>
<image name="isolationModeLogo" width="83" height="107"/>
<image name="isolationModeLogoText" width="82" height="71"/>
</resources>
</document>

View File

@ -0,0 +1,12 @@
{
"images" : [
{
"filename" : "Isolation_Mode.pdf",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@ -0,0 +1,154 @@
%PDF-1.7
1 0 obj
<< >>
endobj
2 0 obj
<< /Length 3 0 R >>
stream
/DeviceRGB CS
/DeviceRGB cs
q
1.000000 0.000000 -0.000000 1.000000 4.494629 -2.825684 cm
1.000000 1.000000 1.000000 scn
53.405182 5.249893 m
52.996174 4.337357 l
55.540451 3.196976 l
54.300926 5.694458 l
53.405182 5.249893 l
h
19.743061 20.337715 m
19.280258 21.224174 l
17.451040 20.269180 l
19.334053 19.425186 l
19.743061 20.337715 l
h
77.104774 50.285122 m
77.567574 49.398663 l
78.287605 49.774574 l
78.067284 50.556377 l
77.104774 50.285122 l
h
72.475632 66.710945 m
73.438141 66.982201 l
73.323631 67.388527 l
72.952583 67.589874 l
72.475632 66.710945 l
h
0.000000 106.040039 m
0.476953 106.918968 l
-3.794553 109.236908 l
-0.785220 105.420822 l
0.000000 106.040039 l
h
47.921436 45.271591 m
47.136215 44.652374 l
47.787216 43.826851 l
48.579147 44.518322 l
47.921436 45.271591 l
h
72.475632 66.710945 m
73.136009 65.960007 l
71.817924 67.464218 l
72.475632 66.710945 l
h
39.603252 30.809586 m
52.509438 4.805321 l
54.300926 5.694458 l
41.394741 31.698723 l
39.603252 30.809586 l
h
53.814190 6.162422 m
20.152071 21.250244 l
19.334053 19.425186 l
52.996174 4.337357 l
53.814190 6.162422 l
h
20.205866 19.451256 m
77.567574 49.398663 l
76.641968 51.171581 l
19.280258 21.224174 l
20.205866 19.451256 l
h
78.067284 50.556377 m
73.438141 66.982201 l
71.513123 66.439697 l
76.142265 50.013866 l
78.067284 50.556377 l
h
72.952583 67.589874 m
0.476953 106.918968 l
-0.476953 105.161110 l
71.998680 65.832016 l
72.952583 67.589874 l
h
-0.785220 105.420822 m
47.136215 44.652374 l
48.706657 45.890808 l
0.785220 106.659256 l
-0.785220 105.420822 l
h
48.579147 44.518322 m
73.133347 65.957672 l
71.817924 67.464218 l
47.263725 46.024860 l
48.579147 44.518322 l
h
71.815254 67.461884 m
19.082685 21.088654 l
20.403437 19.586784 l
73.136009 65.960007 l
71.815254 67.461884 l
h
f
n
Q
endstream
endobj
3 0 obj
1779
endobj
4 0 obj
<< /Annots []
/Type /Page
/MediaBox [ 0.000000 0.000000 83.000000 107.000000 ]
/Resources 1 0 R
/Contents 2 0 R
/Parent 5 0 R
>>
endobj
5 0 obj
<< /Kids [ 4 0 R ]
/Count 1
/Type /Pages
>>
endobj
6 0 obj
<< /Pages 5 0 R
/Type /Catalog
>>
endobj
xref
0 7
0000000000 65535 f
0000000010 00000 n
0000000034 00000 n
0000001869 00000 n
0000001892 00000 n
0000002066 00000 n
0000002140 00000 n
trailer
<< /ID [ (some) (id) ]
/Root 6 0 R
/Size 7
>>
startxref
2199
%%EOF

View File

@ -0,0 +1,12 @@
{
"images" : [
{
"filename" : "IsolationModeLogoText.pdf",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

View File

@ -0,0 +1,161 @@
%PDF-1.7
1 0 obj
<< /Type /XObject
/Length 2 0 R
/Group << /Type /Group
/S /Transparency
>>
/Subtype /Form
/Resources << >>
/BBox [ 0.000000 0.000000 82.000000 71.000000 ]
>>
stream
/DeviceRGB CS
/DeviceRGB cs
q
1.000000 0.000000 -0.000000 1.000000 -0.012146 0.000000 cm
1.000000 1.000000 1.000000 scn
41.333328 71.000000 m
57.393932 68.941673 l
57.393932 1.261955 l
41.333328 0.000000 l
41.333328 31.217945 l
16.400000 31.659016 l
16.400000 1.274200 l
0.000000 0.012253 l
0.000000 69.100952 l
16.412121 71.000000 l
16.412121 41.313545 l
41.345448 41.521832 l
41.345448 71.000000 l
41.333328 71.000000 l
h
f
n
Q
q
1.000000 0.000000 -0.000000 1.000000 65.599976 0.000000 cm
1.000000 1.000000 1.000000 scn
0.000000 69.137703 m
16.400003 71.000000 l
16.400003 0.000000 l
0.000000 1.261955 l
0.000000 69.137703 l
h
f
n
Q
endstream
endobj
2 0 obj
635
endobj
3 0 obj
<< /Type /XObject
/Length 4 0 R
/Group << /Type /Group
/S /Transparency
>>
/Subtype /Form
/Resources << >>
/BBox [ 0.000000 0.000000 82.000000 71.000000 ]
>>
stream
/DeviceRGB CS
/DeviceRGB cs
q
1.000000 0.000000 -0.000000 1.000000 0.000000 0.000000 cm
0.000000 0.000000 0.000000 scn
0.000000 71.000000 m
82.000000 71.000000 l
82.000000 0.000000 l
0.000000 0.000000 l
0.000000 71.000000 l
h
f
n
Q
endstream
endobj
4 0 obj
232
endobj
5 0 obj
<< /XObject << /X1 1 0 R >>
/ExtGState << /E1 << /SMask << /Type /Mask
/G 3 0 R
/S /Alpha
>>
/Type /ExtGState
>> >>
>>
endobj
6 0 obj
<< /Length 7 0 R >>
stream
/DeviceRGB CS
/DeviceRGB cs
q
/E1 gs
/X1 Do
Q
endstream
endobj
7 0 obj
46
endobj
8 0 obj
<< /Annots []
/Type /Page
/MediaBox [ 0.000000 0.000000 82.000000 71.000000 ]
/Resources 5 0 R
/Contents 6 0 R
/Parent 9 0 R
>>
endobj
9 0 obj
<< /Kids [ 8 0 R ]
/Count 1
/Type /Pages
>>
endobj
10 0 obj
<< /Pages 9 0 R
/Type /Catalog
>>
endobj
xref
0 11
0000000000 65535 f
0000000010 00000 n
0000000893 00000 n
0000000915 00000 n
0000001395 00000 n
0000001417 00000 n
0000001715 00000 n
0000001817 00000 n
0000001838 00000 n
0000002011 00000 n
0000002085 00000 n
trailer
<< /ID [ (some) (id) ]
/Root 10 0 R
/Size 11
>>
startxref
2145
%%EOF