mirror of
https://github.com/Novaloop-AG/element-x-ios.git
synced 2026-11-02 12:07:55 +00:00
Design review for first public TestFlight (#492)
* 430 - Design review for first public TestFlight
This commit is contained in:
@@ -56,13 +56,14 @@ public struct ElementActionButtonStyle: ButtonStyle {
|
||||
.frame(maxWidth: maxWidth)
|
||||
.foregroundColor(fontColor)
|
||||
.font(.element.bodyBold)
|
||||
.background(color.opacity(backgroundOpacity(when: configuration.isPressed)))
|
||||
.cornerRadius(cornerRadius)
|
||||
.background(Capsule()
|
||||
.fill(color)
|
||||
.opacity(backgroundOpacity(when: configuration.isPressed)))
|
||||
}
|
||||
|
||||
private func backgroundOpacity(when isPressed: Bool) -> CGFloat {
|
||||
guard isEnabled else { return 0.3 }
|
||||
return isPressed ? 0.6 : 1.0
|
||||
guard isEnabled else { return colorScheme == .dark ? 0.2 : 0.1 }
|
||||
return isPressed ? 0.3 : 1.0
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -22,7 +22,7 @@ public extension ButtonStyle where Self == ElementGhostButtonStyle {
|
||||
/// - Parameter size: The control size to use. Defaults to `regular`.
|
||||
/// - Parameter color: The color of the label and border. Defaults to the accent color.
|
||||
static func elementGhost(_ size: ElementControlSize = .regular,
|
||||
color: Color = .element.accent) -> ElementGhostButtonStyle {
|
||||
color: Color = .element.primaryContent) -> ElementGhostButtonStyle {
|
||||
ElementGhostButtonStyle(size: size, color: color)
|
||||
}
|
||||
}
|
||||
@@ -36,7 +36,7 @@ public struct ElementGhostButtonStyle: ButtonStyle {
|
||||
private var verticalPadding: CGFloat { size == .xLarge ? 12 : 4 }
|
||||
private var maxWidth: CGFloat? { size == .xLarge ? .infinity : nil }
|
||||
|
||||
public init(size: ElementControlSize = .regular, color: Color = .element.accent) {
|
||||
public init(size: ElementControlSize = .regular, color: Color = .element.primaryContent) {
|
||||
self.size = size
|
||||
self.color = color
|
||||
}
|
||||
@@ -47,19 +47,19 @@ public struct ElementGhostButtonStyle: ButtonStyle {
|
||||
.padding(.vertical, verticalPadding)
|
||||
.frame(maxWidth: maxWidth)
|
||||
.foregroundColor(color)
|
||||
.font(.element.body)
|
||||
.font(.element.footnoteBold)
|
||||
.background(border)
|
||||
.opacity(opacity(when: configuration.isPressed))
|
||||
}
|
||||
|
||||
private var border: some View {
|
||||
RoundedRectangle(cornerRadius: 8)
|
||||
Capsule()
|
||||
.strokeBorder()
|
||||
.foregroundColor(color)
|
||||
}
|
||||
|
||||
private func opacity(when isPressed: Bool) -> CGFloat {
|
||||
guard isEnabled else { return 0.6 }
|
||||
guard isEnabled else { return 0.5 }
|
||||
return isPressed ? 0.6 : 1.0
|
||||
}
|
||||
}
|
||||
|
||||
@@ -38,6 +38,8 @@ public struct ElementColors {
|
||||
public var quinaryContent: Color { compound.quinaryContent }
|
||||
public var system: Color { compound.system }
|
||||
public var background: Color { compound.background }
|
||||
// Should be the accent color
|
||||
public var brand: Color { compound.accent }
|
||||
|
||||
public var contentAndAvatars: [Color] { compound.contentAndAvatars }
|
||||
|
||||
|
||||
@@ -42,16 +42,16 @@ public struct ElementTextFieldStyle: TextFieldStyle {
|
||||
/// The color of the text field's border.
|
||||
private var borderColor: Color {
|
||||
guard !isError else { return .element.alert }
|
||||
return isFocused ? .element.accent : .element.quinaryContent
|
||||
return isFocused ? .element.tertiaryContent : .element.quinaryContent
|
||||
}
|
||||
|
||||
/// The width of the text field's border.
|
||||
private var borderWidth: CGFloat {
|
||||
isFocused || isError ? 2.0 : 1.5
|
||||
isFocused || isError ? 1.0 : 0
|
||||
}
|
||||
|
||||
private var accentColor: Color {
|
||||
isError ? .element.alert : .element.accent
|
||||
isError ? .element.alert : .element.brand
|
||||
}
|
||||
|
||||
/// The color of the text inside the text field.
|
||||
@@ -68,7 +68,7 @@ public struct ElementTextFieldStyle: TextFieldStyle {
|
||||
if !isEnabled, colorScheme == .dark {
|
||||
return .element.quinaryContent
|
||||
}
|
||||
return .element.background
|
||||
return .element.system
|
||||
}
|
||||
|
||||
/// The color of the placeholder text inside the text field.
|
||||
@@ -78,8 +78,7 @@ public struct ElementTextFieldStyle: TextFieldStyle {
|
||||
|
||||
/// The color of the label above the text field.
|
||||
private var labelColor: Color {
|
||||
guard colorScheme == .light else { return .element.tertiaryContent }
|
||||
return isEnabled ? .element.primaryContent : .element.quaternaryContent
|
||||
isEnabled ? .element.primaryContent : .element.quaternaryContent
|
||||
}
|
||||
|
||||
/// The color of the footer label below the text field.
|
||||
@@ -99,13 +98,14 @@ public struct ElementTextFieldStyle: TextFieldStyle {
|
||||
}
|
||||
|
||||
public func _body(configuration: TextField<_Label>) -> some View {
|
||||
let rectangle = RoundedRectangle(cornerRadius: 8.0)
|
||||
let rectangle = RoundedRectangle(cornerRadius: 14.0)
|
||||
|
||||
return VStack(alignment: .leading, spacing: 8) {
|
||||
if let labelText {
|
||||
Text(labelText)
|
||||
.font(.element.subheadline)
|
||||
.font(.element.footnote)
|
||||
.foregroundColor(labelColor)
|
||||
.padding(.horizontal, 16)
|
||||
}
|
||||
|
||||
configuration
|
||||
@@ -113,8 +113,8 @@ public struct ElementTextFieldStyle: TextFieldStyle {
|
||||
.font(.element.callout)
|
||||
.foregroundColor(textColor)
|
||||
.accentColor(accentColor)
|
||||
.padding(.vertical, 12.0)
|
||||
.padding(.horizontal, 8.0)
|
||||
.padding(.leading, 16.0)
|
||||
.padding([.vertical, .trailing], 11.0)
|
||||
.background {
|
||||
ZStack {
|
||||
backgroundColor
|
||||
@@ -132,8 +132,9 @@ public struct ElementTextFieldStyle: TextFieldStyle {
|
||||
|
||||
if let footerText {
|
||||
Text(footerText)
|
||||
.font(.element.footnote)
|
||||
.font(.element.caption1)
|
||||
.foregroundColor(footerColor)
|
||||
.padding(.horizontal, 16)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
02D8DF8EB7537EB4E9019DDB /* EventBasedTimelineItemProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 218AB05B4E3889731959C5F1 /* EventBasedTimelineItemProtocol.swift */; };
|
||||
03D684A3AE85A23B3DA3B43F /* Image.swift in Sources */ = {isa = PBXBuildFile; fileRef = E26747B3154A5DBC3A7E24A5 /* Image.swift */; };
|
||||
04A16B45228F7678A027C079 /* RoomHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 422724361B6555364C43281E /* RoomHeaderView.swift */; };
|
||||
052BE25E8C466D3D60558DA3 /* SettingsActionButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = F3F8435052B2488947B35942 /* SettingsActionButton.swift */; };
|
||||
059173B3C77056C406906B6D /* target.yml in Resources */ = {isa = PBXBuildFile; fileRef = D4DA544B2520BFA65D6DB4BB /* target.yml */; };
|
||||
05EC896A4B9AF4A56670C0BB /* SessionVerificationUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6D4777F0142E330A75C46FE4 /* SessionVerificationUITests.swift */; };
|
||||
066A1E9B94723EE9F3038044 /* Strings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47EBB5D698CE9A25BB553A2D /* Strings.swift */; };
|
||||
@@ -147,6 +148,7 @@
|
||||
447E8580A0A2569E32529E17 /* MockRoomTimelineProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8D6094DEAAEB388E1AE118C6 /* MockRoomTimelineProvider.swift */; };
|
||||
44AE0752E001D1D10605CD88 /* Swipe.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9FDA5344F7C4C6E4E863E13 /* Swipe.swift */; };
|
||||
46562110EE202E580A5FFD9C /* RoomScreenViewModelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 93CF7B19FFCF8EFBE0A8696A /* RoomScreenViewModelTests.swift */; };
|
||||
48FE5F0E3921146DBF4E61E7 /* OnboardingBackgroundView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D06A27D9C70E0DCC1E199163 /* OnboardingBackgroundView.swift */; };
|
||||
492274DA6691EE985C2FCCAA /* GZIP in Frameworks */ = {isa = PBXBuildFile; productRef = 1BCD21310B997A6837B854D6 /* GZIP */; };
|
||||
49E9B99CB6A275C7744351F0 /* LoginViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = F2D58333B377888012740101 /* LoginViewModel.swift */; };
|
||||
49F2E7DD8CAACE09CEECE3E6 /* SeparatorRoomTimelineView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6390A6DC140CA3D6865A66FF /* SeparatorRoomTimelineView.swift */; };
|
||||
@@ -279,6 +281,7 @@
|
||||
878070573C7BF19E735707B4 /* RoomTimelineItemProperties.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5DE8D25D6A91030175D52A20 /* RoomTimelineItemProperties.swift */; };
|
||||
87BD4F95F9D603C309837378 /* UserNotification.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA6B262D7584C65BC5B79A0E /* UserNotification.swift */; };
|
||||
8810A2A30A68252EBB54EE05 /* HomeScreenModels.swift in Sources */ = {isa = PBXBuildFile; fileRef = 71BC7CA1BC1041E93077BBA1 /* HomeScreenModels.swift */; };
|
||||
88DD7573C7D1D46C0851EF8A /* FormSectionHeaderStyle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 733FEDC1AE17806318A4BE56 /* FormSectionHeaderStyle.swift */; };
|
||||
890F0D453FE388756479AC97 /* AnalyticsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C687844F60BFF532D49A994C /* AnalyticsTests.swift */; };
|
||||
8AB8ED1051216546CB35FA0E /* UserSession.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6E5E9C044BEB7C70B1378E91 /* UserSession.swift */; };
|
||||
8B807DC963D1D4155A241BCC /* UserSessionFlowCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F9E67AAB66638C69626866C /* UserSessionFlowCoordinator.swift */; };
|
||||
@@ -329,6 +332,7 @@
|
||||
A021827B528F1EDC9101CA58 /* AppCoordinatorProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = FBC776F301D374A3298C69DA /* AppCoordinatorProtocol.swift */; };
|
||||
A0A0D2A9564BDA3FDE2E360F /* FormattedBodyText.swift in Sources */ = {isa = PBXBuildFile; fileRef = F73FF1A33198F5FAE9D34B1F /* FormattedBodyText.swift */; };
|
||||
A23B8B27A1436A1049EEF68E /* InfoPlistReader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6A580295A56B55A856CC4084 /* InfoPlistReader.swift */; };
|
||||
A2DDFA5033B535AB2BA51F5C /* SettingsDefaultRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = BFB3D0B0E16FEC93175ABC2D /* SettingsDefaultRow.swift */; };
|
||||
A32517FB1CA0BBCE2BC75249 /* BugReportCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = AD6C07DA7D3FF193F7419F55 /* BugReportCoordinator.swift */; };
|
||||
A33784831AD880A670CAA9F9 /* FileManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04DF593C3F7AF4B2FBAEB05D /* FileManager.swift */; };
|
||||
A371629728E597C5FCA3C2B2 /* Analytics.swift in Sources */ = {isa = PBXBuildFile; fileRef = 73FC861755C6388F62B9280A /* Analytics.swift */; };
|
||||
@@ -789,6 +793,7 @@
|
||||
71D52BAA5BADB06E5E8C295D /* Assets.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Assets.swift; sourceTree = "<group>"; };
|
||||
72D03D36422177EF01905D20 /* ca */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ca; path = ca.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
72F37B5DA798C9AE436F2C2C /* AttributedStringBuilderProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AttributedStringBuilderProtocol.swift; sourceTree = "<group>"; };
|
||||
733FEDC1AE17806318A4BE56 /* FormSectionHeaderStyle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FormSectionHeaderStyle.swift; sourceTree = "<group>"; };
|
||||
73FC861755C6388F62B9280A /* Analytics.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Analytics.swift; sourceTree = "<group>"; };
|
||||
748AE77AC3B0A01223033B87 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = Info.plist; sourceTree = "<group>"; };
|
||||
755DC0F79EF8181CC175A193 /* MessageTimelineItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageTimelineItem.swift; sourceTree = "<group>"; };
|
||||
@@ -952,6 +957,7 @@
|
||||
BEA38B9851CFCC4D67F5587D /* EmojiPickerScreenCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EmojiPickerScreenCoordinator.swift; sourceTree = "<group>"; };
|
||||
BEBA759D1347CFFB3D84ED1F /* UserSessionStoreProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserSessionStoreProtocol.swift; sourceTree = "<group>"; };
|
||||
BEE6BF9BA63FF42F8AF6EEEA /* sr */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = sr; path = sr.lproj/Localizable.stringsdict; sourceTree = "<group>"; };
|
||||
BFB3D0B0E16FEC93175ABC2D /* SettingsDefaultRow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsDefaultRow.swift; sourceTree = "<group>"; };
|
||||
C024C151639C4E1B91FCC68B /* ElementXAttributeScope.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ElementXAttributeScope.swift; sourceTree = "<group>"; };
|
||||
C06FCD42EEFEFC220F14EAC5 /* SessionVerificationStateMachine.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SessionVerificationStateMachine.swift; sourceTree = "<group>"; };
|
||||
C070FD43DC6BF4E50217965A /* LocalizationTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocalizationTests.swift; sourceTree = "<group>"; };
|
||||
@@ -992,6 +998,7 @@
|
||||
CDE3F3911FF7CC639BDE5844 /* nl */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = nl; path = nl.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
CED34C87277BA3CCC6B6EC7A /* th */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = th; path = th.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
CF48AF076424DBC1615C74AD /* AuthenticationServiceProxy.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthenticationServiceProxy.swift; sourceTree = "<group>"; };
|
||||
D06A27D9C70E0DCC1E199163 /* OnboardingBackgroundView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnboardingBackgroundView.swift; sourceTree = "<group>"; };
|
||||
D06DFD894157A4C93A02D8B5 /* lo */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = lo; path = lo.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||
D09A267106B9585D3D0CFC0D /* ClientError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ClientError.swift; sourceTree = "<group>"; };
|
||||
D0A45283CF1DB96E583BECA6 /* ImageRoomTimelineView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImageRoomTimelineView.swift; sourceTree = "<group>"; };
|
||||
@@ -1073,6 +1080,7 @@
|
||||
F3648F2FADEF2672D6A0D489 /* FileCacheTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FileCacheTests.swift; sourceTree = "<group>"; };
|
||||
F36C0A6D59717193F49EA986 /* UserSessionTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserSessionTests.swift; sourceTree = "<group>"; };
|
||||
F3EAE3E9D5EF4A6D5D9C6CFD /* EmojiPickerScreenViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EmojiPickerScreenViewModel.swift; sourceTree = "<group>"; };
|
||||
F3F8435052B2488947B35942 /* SettingsActionButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsActionButton.swift; sourceTree = "<group>"; };
|
||||
F506C6ADB1E1DA6638078E11 /* UITests.xctest */ = {isa = PBXFileReference; includeInIndex = 0; lastKnownFileType = wrapper.cfbundle; path = UITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
F5C4AF6E3885730CD560311C /* ScreenshotDetector.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScreenshotDetector.swift; sourceTree = "<group>"; };
|
||||
F73FF1A33198F5FAE9D34B1F /* FormattedBodyText.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FormattedBodyText.swift; sourceTree = "<group>"; };
|
||||
@@ -1320,10 +1328,13 @@
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
0960A7F5C1B0B6679BDF26F9 /* ElementToggleStyle.swift */,
|
||||
733FEDC1AE17806318A4BE56 /* FormSectionHeaderStyle.swift */,
|
||||
B590BD4507D4F0A377FDE01A /* LoadableAvatarImage.swift */,
|
||||
C352359663A0E52BA20761EE /* LoadableImage.swift */,
|
||||
C705E605EF57C19DBE86FFA1 /* PlaceholderAvatarImage.swift */,
|
||||
839E2C35DF3F9C7B54C3CE49 /* RoundedCornerShape.swift */,
|
||||
F3F8435052B2488947B35942 /* SettingsActionButton.swift */,
|
||||
BFB3D0B0E16FEC93175ABC2D /* SettingsDefaultRow.swift */,
|
||||
);
|
||||
path = Views;
|
||||
sourceTree = "<group>";
|
||||
@@ -1839,6 +1850,7 @@
|
||||
7B14834450AE76EEFDDBCBB8 /* View */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
D06A27D9C70E0DCC1E199163 /* OnboardingBackgroundView.swift */,
|
||||
09199C43BAB209C0BD89A836 /* OnboardingPageIndicator.swift */,
|
||||
1DF2717AB91060260E5F4781 /* OnboardingPageView.swift */,
|
||||
AB8E75B9CB6C78BE8D09B1AF /* OnboardingScreen.swift */,
|
||||
@@ -3078,6 +3090,7 @@
|
||||
3274219F7F26A5C6C2C55630 /* FilePreviewViewModelProtocol.swift in Sources */,
|
||||
D33AC79A50DFC26D2498DD28 /* FileRoomTimelineItem.swift in Sources */,
|
||||
1F04C63D4FA95948E3F52147 /* FileRoomTimelineView.swift in Sources */,
|
||||
88DD7573C7D1D46C0851EF8A /* FormSectionHeaderStyle.swift in Sources */,
|
||||
A0A0D2A9564BDA3FDE2E360F /* FormattedBodyText.swift in Sources */,
|
||||
85AFBB433AD56704A880F8A0 /* FramePreferenceKey.swift in Sources */,
|
||||
964B9D2EC38C488C360CE0C9 /* HomeScreen.swift in Sources */,
|
||||
@@ -3147,6 +3160,7 @@
|
||||
5B8B51CEC4717AF487794685 /* NotificationServiceProxy.swift in Sources */,
|
||||
F61AFA8BF2E739FBC30472F5 /* NotificationServiceProxyProtocol.swift in Sources */,
|
||||
563A05B43207D00A6B698211 /* OIDCService.swift in Sources */,
|
||||
48FE5F0E3921146DBF4E61E7 /* OnboardingBackgroundView.swift in Sources */,
|
||||
2CB6787E25B11711518E9588 /* OnboardingCoordinator.swift in Sources */,
|
||||
5D7960B32C350FA93F48D02B /* OnboardingModels.swift in Sources */,
|
||||
14132418A748C988B85B025E /* OnboardingPageIndicator.swift in Sources */,
|
||||
@@ -3225,6 +3239,8 @@
|
||||
9E8AE387FD03E4F1C1B8815A /* SessionVerificationStateMachine.swift in Sources */,
|
||||
A8EC7C9D886244DAE9433E37 /* SessionVerificationViewModel.swift in Sources */,
|
||||
D6417E5A799C3C7F14F9EC0A /* SessionVerificationViewModelProtocol.swift in Sources */,
|
||||
052BE25E8C466D3D60558DA3 /* SettingsActionButton.swift in Sources */,
|
||||
A2DDFA5033B535AB2BA51F5C /* SettingsDefaultRow.swift in Sources */,
|
||||
7FED310F6AB7A70CBFB7C8A3 /* SettingsScreen.swift in Sources */,
|
||||
233221E32DA045018D3D3050 /* SettingsScreenCoordinator.swift in Sources */,
|
||||
DBAA69CC2CE4D44BC8E20105 /* SettingsScreenModels.swift in Sources */,
|
||||
|
||||
+2
-2
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"images" : [
|
||||
{
|
||||
"filename" : "OnboardingSplashScreenPage1.pdf",
|
||||
"filename" : "OnboardingSplashAppLogo.pdf",
|
||||
"idiom" : "universal"
|
||||
},
|
||||
{
|
||||
@@ -11,7 +11,7 @@
|
||||
"value" : "dark"
|
||||
}
|
||||
],
|
||||
"filename" : "OnboardingSplashScreenPage1-Dark.pdf",
|
||||
"filename" : "OnboardingSplashAppLogo-Dark.pdf",
|
||||
"idiom" : "universal"
|
||||
}
|
||||
],
|
||||
+2613
File diff suppressed because it is too large
Load Diff
+2601
File diff suppressed because it is too large
Load Diff
+2
-2
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"images" : [
|
||||
{
|
||||
"filename" : "OnboardingSplashScreenPage3.pdf",
|
||||
"filename" : "OnboardingBackgroundPart1.pdf",
|
||||
"idiom" : "universal"
|
||||
},
|
||||
{
|
||||
@@ -11,7 +11,7 @@
|
||||
"value" : "dark"
|
||||
}
|
||||
],
|
||||
"filename" : "OnboardingSplashScreenPage3-Dark.pdf",
|
||||
"filename" : "OnboardingBackgroundPart1-Dark.pdf",
|
||||
"idiom" : "universal"
|
||||
}
|
||||
],
|
||||
BIN
Binary file not shown.
BIN
Binary file not shown.
+2
-2
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"images" : [
|
||||
{
|
||||
"filename" : "OnboardingSplashScreenPage4.pdf",
|
||||
"filename" : "OnboardingBackgroundPart2.pdf",
|
||||
"idiom" : "universal"
|
||||
},
|
||||
{
|
||||
@@ -11,7 +11,7 @@
|
||||
"value" : "dark"
|
||||
}
|
||||
],
|
||||
"filename" : "OnboardingSplashScreenPage4-Dark.pdf",
|
||||
"filename" : "OnboardingBackgroundPart2-Dark.pdf",
|
||||
"idiom" : "universal"
|
||||
}
|
||||
],
|
||||
BIN
Binary file not shown.
BIN
Binary file not shown.
+2
-2
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"images" : [
|
||||
{
|
||||
"filename" : "OnboardingSplashScreenPage2.pdf",
|
||||
"filename" : "OnboardingBackgroundPart3.pdf",
|
||||
"idiom" : "universal"
|
||||
},
|
||||
{
|
||||
@@ -11,7 +11,7 @@
|
||||
"value" : "dark"
|
||||
}
|
||||
],
|
||||
"filename" : "OnboardingSplashScreenPage2-Dark.pdf",
|
||||
"filename" : "OnboardingBackgroundPart3-Dark.pdf",
|
||||
"idiom" : "universal"
|
||||
}
|
||||
],
|
||||
BIN
Binary file not shown.
BIN
Binary file not shown.
-872
@@ -1,872 +0,0 @@
|
||||
%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 300.000000 300.000000 ]
|
||||
>>
|
||||
stream
|
||||
q
|
||||
1.000000 0.000000 -0.000000 1.000000 116.000000 142.000000 cm
|
||||
0.083333 0.083333 0.083333 scn
|
||||
0.000000 6.500000 m
|
||||
0.000000 10.089850 2.910149 13.000000 6.500000 13.000000 c
|
||||
87.500000 13.000000 l
|
||||
91.089851 13.000000 94.000000 10.089850 94.000000 6.500000 c
|
||||
94.000000 6.500000 l
|
||||
94.000000 2.910150 91.089851 0.000000 87.500000 0.000000 c
|
||||
6.500002 0.000000 l
|
||||
2.910151 0.000000 0.000000 2.910150 0.000000 6.500000 c
|
||||
0.000000 6.500000 l
|
||||
h
|
||||
f
|
||||
n
|
||||
Q
|
||||
q
|
||||
1.000000 0.000000 -0.000000 1.000000 116.000000 142.000000 cm
|
||||
1.000000 0.505882 0.176471 scn
|
||||
0.000000 6.500000 m
|
||||
0.000000 10.089850 2.910149 13.000000 6.500000 13.000000 c
|
||||
87.500000 13.000000 l
|
||||
91.089851 13.000000 94.000000 10.089850 94.000000 6.500000 c
|
||||
94.000000 6.500000 l
|
||||
94.000000 2.910150 91.089851 0.000000 87.500000 0.000000 c
|
||||
6.500002 0.000000 l
|
||||
2.910151 0.000000 0.000000 2.910150 0.000000 6.500000 c
|
||||
0.000000 6.500000 l
|
||||
h
|
||||
f
|
||||
n
|
||||
Q
|
||||
|
||||
endstream
|
||||
endobj
|
||||
|
||||
2 0 obj
|
||||
882
|
||||
endobj
|
||||
|
||||
3 0 obj
|
||||
<< /Type /XObject
|
||||
/Length 4 0 R
|
||||
/Group << /Type /Group
|
||||
/S /Transparency
|
||||
>>
|
||||
/Subtype /Form
|
||||
/Resources << >>
|
||||
/BBox [ 0.000000 0.000000 300.000000 300.000000 ]
|
||||
>>
|
||||
stream
|
||||
q
|
||||
1.000000 0.000000 -0.000000 1.000000 127.119080 85.000000 cm
|
||||
0.083333 0.083333 0.083333 scn
|
||||
0.000000 6.500000 m
|
||||
0.000000 10.089850 2.910149 13.000000 6.500000 13.000000 c
|
||||
119.500000 13.000000 l
|
||||
123.089851 13.000000 126.000000 10.089850 126.000000 6.500000 c
|
||||
126.000000 6.500000 l
|
||||
126.000000 2.910150 123.089851 0.000000 119.500000 0.000000 c
|
||||
6.499998 0.000000 l
|
||||
2.910147 0.000000 0.000000 2.910150 0.000000 6.500000 c
|
||||
0.000000 6.500000 l
|
||||
h
|
||||
f
|
||||
n
|
||||
Q
|
||||
q
|
||||
1.000000 0.000000 -0.000000 1.000000 127.119080 85.000000 cm
|
||||
0.454902 0.819608 0.172549 scn
|
||||
0.000000 6.500000 m
|
||||
0.000000 10.089850 2.910149 13.000000 6.500000 13.000000 c
|
||||
119.500000 13.000000 l
|
||||
123.089851 13.000000 126.000000 10.089850 126.000000 6.500000 c
|
||||
126.000000 6.500000 l
|
||||
126.000000 2.910150 123.089851 0.000000 119.500000 0.000000 c
|
||||
6.499998 0.000000 l
|
||||
2.910147 0.000000 0.000000 2.910150 0.000000 6.500000 c
|
||||
0.000000 6.500000 l
|
||||
h
|
||||
f
|
||||
n
|
||||
Q
|
||||
|
||||
endstream
|
||||
endobj
|
||||
|
||||
4 0 obj
|
||||
896
|
||||
endobj
|
||||
|
||||
5 0 obj
|
||||
<< /Type /XObject
|
||||
/Length 6 0 R
|
||||
/Group << /Type /Group
|
||||
/S /Transparency
|
||||
>>
|
||||
/Subtype /Form
|
||||
/Resources << >>
|
||||
/BBox [ 0.000000 0.000000 300.000000 300.000000 ]
|
||||
>>
|
||||
stream
|
||||
q
|
||||
1.000000 0.000000 -0.000000 1.000000 102.000000 207.000000 cm
|
||||
0.083333 0.083333 0.083333 scn
|
||||
0.000000 6.500000 m
|
||||
0.000000 10.089850 2.910149 13.000000 6.500000 13.000000 c
|
||||
119.500000 13.000000 l
|
||||
123.089851 13.000000 126.000000 10.089850 126.000000 6.500000 c
|
||||
126.000000 6.500000 l
|
||||
126.000000 2.910150 123.089851 0.000000 119.500000 0.000000 c
|
||||
6.499998 0.000000 l
|
||||
2.910147 0.000000 0.000000 2.910150 0.000000 6.500000 c
|
||||
0.000000 6.500000 l
|
||||
h
|
||||
f
|
||||
n
|
||||
Q
|
||||
q
|
||||
1.000000 0.000000 -0.000000 1.000000 102.000000 207.000000 cm
|
||||
0.360784 0.337255 0.960784 scn
|
||||
0.000000 6.500000 m
|
||||
0.000000 10.089850 2.910149 13.000000 6.500000 13.000000 c
|
||||
119.500000 13.000000 l
|
||||
123.089851 13.000000 126.000000 10.089850 126.000000 6.500000 c
|
||||
126.000000 6.500000 l
|
||||
126.000000 2.910150 123.089851 0.000000 119.500000 0.000000 c
|
||||
6.499998 0.000000 l
|
||||
2.910147 0.000000 0.000000 2.910150 0.000000 6.500000 c
|
||||
0.000000 6.500000 l
|
||||
h
|
||||
f
|
||||
n
|
||||
Q
|
||||
|
||||
endstream
|
||||
endobj
|
||||
|
||||
6 0 obj
|
||||
898
|
||||
endobj
|
||||
|
||||
7 0 obj
|
||||
<< /Type /XObject
|
||||
/Length 8 0 R
|
||||
/Group << /Type /Group
|
||||
/S /Transparency
|
||||
>>
|
||||
/Subtype /Form
|
||||
/Resources << /XObject << /X2 1 0 R
|
||||
/X3 3 0 R
|
||||
/X1 5 0 R
|
||||
>>
|
||||
/ExtGState << /E6 << /ca 0.400000 >>
|
||||
/E4 << /ca 0.500000 >>
|
||||
/E2 << /ca 0.500000 >>
|
||||
/E5 << /ca 0.700000 >>
|
||||
/E3 << /ca 0.700000 >>
|
||||
/E1 << /ca 0.700000 >>
|
||||
>>
|
||||
>>
|
||||
/BBox [ 0.000000 0.000000 300.000000 300.000000 ]
|
||||
>>
|
||||
stream
|
||||
/DeviceRGB CS
|
||||
/DeviceRGB cs
|
||||
q
|
||||
1.000000 0.000000 -0.000000 1.000000 51.000000 183.000000 cm
|
||||
0.054167 0.054167 0.054167 scn
|
||||
38.000000 19.000000 m
|
||||
38.000000 8.506590 29.493410 0.000000 19.000000 0.000000 c
|
||||
8.506590 0.000000 0.000000 8.506590 0.000000 19.000000 c
|
||||
0.000000 29.493410 8.506590 38.000000 19.000000 38.000000 c
|
||||
29.493410 38.000000 38.000000 29.493410 38.000000 19.000000 c
|
||||
h
|
||||
f
|
||||
n
|
||||
Q
|
||||
q
|
||||
/E1 gs
|
||||
1.000000 0.000000 -0.000000 1.000000 51.000000 183.000000 cm
|
||||
0.835294 0.847059 0.968627 scn
|
||||
38.000000 19.000000 m
|
||||
38.000000 8.506590 29.493410 0.000000 19.000000 0.000000 c
|
||||
8.506590 0.000000 0.000000 8.506590 0.000000 19.000000 c
|
||||
0.000000 29.493410 8.506590 38.000000 19.000000 38.000000 c
|
||||
29.493410 38.000000 38.000000 29.493410 38.000000 19.000000 c
|
||||
h
|
||||
f
|
||||
n
|
||||
Q
|
||||
q
|
||||
/E2 gs
|
||||
/X1 Do
|
||||
Q
|
||||
q
|
||||
1.000000 0.000000 -0.000000 1.000000 102.000000 184.000000 cm
|
||||
0.054167 0.054167 0.054167 scn
|
||||
0.000000 6.500000 m
|
||||
0.000000 10.089850 2.910149 13.000000 6.500000 13.000000 c
|
||||
141.500000 13.000000 l
|
||||
145.089859 13.000000 148.000000 10.089850 148.000000 6.500000 c
|
||||
148.000000 6.500000 l
|
||||
148.000000 2.910150 145.089844 0.000000 141.500000 0.000000 c
|
||||
6.499999 0.000000 l
|
||||
2.910148 0.000000 0.000000 2.910150 0.000000 6.500000 c
|
||||
0.000000 6.500000 l
|
||||
h
|
||||
f
|
||||
n
|
||||
Q
|
||||
q
|
||||
1.000000 0.000000 -0.000000 1.000000 102.000000 184.000000 cm
|
||||
0.556863 0.600000 0.643137 scn
|
||||
0.000000 6.500000 m
|
||||
0.000000 10.089850 2.910149 13.000000 6.500000 13.000000 c
|
||||
141.500000 13.000000 l
|
||||
145.089859 13.000000 148.000000 10.089850 148.000000 6.500000 c
|
||||
148.000000 6.500000 l
|
||||
148.000000 2.910150 145.089844 0.000000 141.500000 0.000000 c
|
||||
6.499999 0.000000 l
|
||||
2.910148 0.000000 0.000000 2.910150 0.000000 6.500000 c
|
||||
0.000000 6.500000 l
|
||||
h
|
||||
f
|
||||
n
|
||||
Q
|
||||
q
|
||||
1.000000 0.000000 -0.000000 1.000000 60.000000 119.000000 cm
|
||||
0.054167 0.054167 0.054167 scn
|
||||
38.000000 19.000000 m
|
||||
38.000000 8.506590 29.493410 0.000000 19.000000 0.000000 c
|
||||
8.506590 0.000000 0.000000 8.506590 0.000000 19.000000 c
|
||||
0.000000 29.493410 8.506590 38.000000 19.000000 38.000000 c
|
||||
29.493410 38.000000 38.000000 29.493410 38.000000 19.000000 c
|
||||
h
|
||||
f
|
||||
n
|
||||
Q
|
||||
q
|
||||
/E3 gs
|
||||
1.000000 0.000000 -0.000000 1.000000 60.000000 119.000000 cm
|
||||
0.964706 0.878431 0.811765 scn
|
||||
38.000000 19.000000 m
|
||||
38.000000 8.506590 29.493410 0.000000 19.000000 0.000000 c
|
||||
8.506590 0.000000 0.000000 8.506590 0.000000 19.000000 c
|
||||
0.000000 29.493410 8.506590 38.000000 19.000000 38.000000 c
|
||||
29.493410 38.000000 38.000000 29.493410 38.000000 19.000000 c
|
||||
h
|
||||
f
|
||||
n
|
||||
Q
|
||||
q
|
||||
/E4 gs
|
||||
/X2 Do
|
||||
Q
|
||||
q
|
||||
1.000000 0.000000 -0.000000 1.000000 116.000000 121.000000 cm
|
||||
0.054167 0.054167 0.054167 scn
|
||||
0.000000 6.500000 m
|
||||
0.000000 10.089850 2.910149 13.000000 6.500000 13.000000 c
|
||||
56.500000 13.000000 l
|
||||
60.089848 13.000000 63.000000 10.089850 63.000000 6.500000 c
|
||||
63.000000 6.500000 l
|
||||
63.000000 2.910150 60.089851 0.000000 56.500000 0.000000 c
|
||||
6.500001 0.000000 l
|
||||
2.910151 0.000000 0.000000 2.910150 0.000000 6.500000 c
|
||||
0.000000 6.500000 l
|
||||
h
|
||||
f
|
||||
n
|
||||
Q
|
||||
q
|
||||
1.000000 0.000000 -0.000000 1.000000 116.000000 121.000000 cm
|
||||
0.556863 0.600000 0.643137 scn
|
||||
0.000000 6.500000 m
|
||||
0.000000 10.089850 2.910149 13.000000 6.500000 13.000000 c
|
||||
56.500000 13.000000 l
|
||||
60.089848 13.000000 63.000000 10.089850 63.000000 6.500000 c
|
||||
63.000000 6.500000 l
|
||||
63.000000 2.910150 60.089851 0.000000 56.500000 0.000000 c
|
||||
6.500001 0.000000 l
|
||||
2.910151 0.000000 0.000000 2.910150 0.000000 6.500000 c
|
||||
0.000000 6.500000 l
|
||||
h
|
||||
f
|
||||
n
|
||||
Q
|
||||
q
|
||||
1.000000 0.000000 -0.000000 1.000000 189.000000 121.000000 cm
|
||||
0.054167 0.054167 0.054167 scn
|
||||
0.000000 6.500000 m
|
||||
0.000000 10.089850 2.910149 13.000000 6.500000 13.000000 c
|
||||
57.500000 13.000000 l
|
||||
61.089851 13.000000 64.000000 10.089850 64.000000 6.500000 c
|
||||
64.000000 6.500000 l
|
||||
64.000000 2.910150 61.089851 0.000000 57.500000 0.000000 c
|
||||
6.500000 0.000000 l
|
||||
2.910149 0.000000 0.000000 2.910150 0.000000 6.500000 c
|
||||
0.000000 6.500000 l
|
||||
h
|
||||
f
|
||||
n
|
||||
Q
|
||||
q
|
||||
1.000000 0.000000 -0.000000 1.000000 189.000000 121.000000 cm
|
||||
0.556863 0.600000 0.643137 scn
|
||||
0.000000 6.500000 m
|
||||
0.000000 10.089850 2.910149 13.000000 6.500000 13.000000 c
|
||||
57.500000 13.000000 l
|
||||
61.089851 13.000000 64.000000 10.089850 64.000000 6.500000 c
|
||||
64.000000 6.500000 l
|
||||
64.000000 2.910150 61.089851 0.000000 57.500000 0.000000 c
|
||||
6.500000 0.000000 l
|
||||
2.910149 0.000000 0.000000 2.910150 0.000000 6.500000 c
|
||||
0.000000 6.500000 l
|
||||
h
|
||||
f
|
||||
n
|
||||
Q
|
||||
q
|
||||
1.000000 0.000000 -0.000000 1.000000 69.999939 60.000000 cm
|
||||
1.000000 1.000000 1.000000 scn
|
||||
38.000000 19.000000 m
|
||||
38.000000 8.506590 29.493410 0.000000 19.000000 0.000000 c
|
||||
8.506590 0.000000 0.000000 8.506590 0.000000 19.000000 c
|
||||
0.000000 29.493410 8.506590 38.000000 19.000000 38.000000 c
|
||||
29.493410 38.000000 38.000000 29.493410 38.000000 19.000000 c
|
||||
h
|
||||
f
|
||||
n
|
||||
Q
|
||||
q
|
||||
1.000000 0.000000 -0.000000 1.000000 69.999939 60.000000 cm
|
||||
0.054167 0.054167 0.054167 scn
|
||||
38.000000 19.000000 m
|
||||
38.000000 8.506590 29.493410 0.000000 19.000000 0.000000 c
|
||||
8.506590 0.000000 0.000000 8.506590 0.000000 19.000000 c
|
||||
0.000000 29.493410 8.506590 38.000000 19.000000 38.000000 c
|
||||
29.493410 38.000000 38.000000 29.493410 38.000000 19.000000 c
|
||||
h
|
||||
f
|
||||
n
|
||||
Q
|
||||
q
|
||||
/E5 gs
|
||||
1.000000 0.000000 -0.000000 1.000000 69.999939 60.000000 cm
|
||||
0.894118 0.964706 0.894118 scn
|
||||
38.000000 19.000000 m
|
||||
38.000000 8.506590 29.493410 0.000000 19.000000 0.000000 c
|
||||
8.506590 0.000000 0.000000 8.506590 0.000000 19.000000 c
|
||||
0.000000 29.493410 8.506590 38.000000 19.000000 38.000000 c
|
||||
29.493410 38.000000 38.000000 29.493410 38.000000 19.000000 c
|
||||
h
|
||||
f
|
||||
n
|
||||
Q
|
||||
q
|
||||
/E6 gs
|
||||
/X3 Do
|
||||
Q
|
||||
q
|
||||
1.000000 0.000000 -0.000000 1.000000 115.999939 72.000000 cm
|
||||
0.000000 0.000000 0.000000 scn
|
||||
0.000000 9.000000 m
|
||||
0.000000 13.970562 4.029438 18.000000 9.000000 18.000000 c
|
||||
23.000000 18.000000 l
|
||||
27.970562 18.000000 32.000000 13.970562 32.000000 9.000000 c
|
||||
32.000000 9.000000 l
|
||||
32.000000 4.029437 27.970562 0.000000 23.000000 0.000000 c
|
||||
9.000000 0.000000 l
|
||||
4.029438 0.000000 0.000000 4.029437 0.000000 9.000000 c
|
||||
0.000000 9.000000 l
|
||||
h
|
||||
f
|
||||
n
|
||||
Q
|
||||
q
|
||||
1.000000 0.000000 -0.000000 1.000000 123.366089 77.722778 cm
|
||||
0.557143 0.600000 0.642857 scn
|
||||
4.910892 3.273924 m
|
||||
4.910892 1.917818 3.811552 0.818478 2.455446 0.818478 c
|
||||
1.099341 0.818478 0.000000 1.917818 0.000000 3.273924 c
|
||||
0.000000 4.630030 1.099341 5.729370 2.455446 5.729370 c
|
||||
3.811552 5.729370 4.910892 4.630030 4.910892 3.273924 c
|
||||
h
|
||||
11.458750 2.455442 m
|
||||
11.458750 1.099336 10.359408 -0.000004 9.003304 -0.000004 c
|
||||
7.647198 -0.000004 6.547857 1.099336 6.547857 2.455442 c
|
||||
6.547857 3.811547 7.647198 4.910888 9.003304 4.910888 c
|
||||
10.359408 4.910888 11.458750 3.811547 11.458750 2.455442 c
|
||||
h
|
||||
15.551160 -0.000004 m
|
||||
16.907265 -0.000004 18.006607 1.099336 18.006607 2.455442 c
|
||||
18.006607 3.811547 16.907265 4.910888 15.551160 4.910888 c
|
||||
14.195054 4.910888 13.095714 3.811547 13.095714 2.455442 c
|
||||
13.095714 1.099336 14.195054 -0.000004 15.551160 -0.000004 c
|
||||
h
|
||||
f*
|
||||
n
|
||||
Q
|
||||
|
||||
endstream
|
||||
endobj
|
||||
|
||||
8 0 obj
|
||||
6601
|
||||
endobj
|
||||
|
||||
9 0 obj
|
||||
<< /Length 10 0 R
|
||||
/Range [ 0.000000 1.000000 0.000000 1.000000 0.000000 1.000000 ]
|
||||
/Domain [ 0.000000 1.000000 ]
|
||||
/FunctionType 4
|
||||
>>
|
||||
stream
|
||||
{ 0.890196 exch 0.909804 exch 0.941176 exch dup 0.885417 gt { exch pop exch pop exch pop dup 0.885417 sub -1.163636 mul 0.890196 add exch dup 0.885417 sub -1.163636 mul 0.909804 add exch dup 0.885417 sub -1.197861 mul 0.941176 add exch } if dup 1.000000 gt { exch pop exch pop exch pop 0.756863 exch 0.776471 exch 0.803922 exch } if pop }
|
||||
endstream
|
||||
endobj
|
||||
|
||||
10 0 obj
|
||||
339
|
||||
endobj
|
||||
|
||||
11 0 obj
|
||||
<< /Length 12 0 R
|
||||
/Range [ 0.000000 1.000000 0.000000 1.000000 0.000000 1.000000 ]
|
||||
/Domain [ 0.000000 1.000000 ]
|
||||
/FunctionType 4
|
||||
>>
|
||||
stream
|
||||
{ 0.560784 exch 0.592157 exch 0.639216 exch dup 0.436121 gt { exch pop exch pop exch pop dup 0.436121 sub -1.132947 mul 0.560784 add exch dup 0.436121 sub -1.040270 mul 0.592157 add exch dup 0.436121 sub -1.080743 mul 0.639216 add exch } if dup 0.797508 gt { exch pop exch pop exch pop 0.151351 exch 0.216216 exch 0.248649 exch } if pop }
|
||||
endstream
|
||||
endobj
|
||||
|
||||
12 0 obj
|
||||
339
|
||||
endobj
|
||||
|
||||
13 0 obj
|
||||
<< /Length 14 0 R
|
||||
/Range [ 0.000000 1.000000 0.000000 1.000000 0.000000 1.000000 ]
|
||||
/Domain [ 0.000000 1.000000 ]
|
||||
/FunctionType 4
|
||||
>>
|
||||
stream
|
||||
{ 0.211765 exch 0.545098 exch 0.839216 exch dup 0.000000 gt { exch pop exch pop exch pop dup 0.000000 sub 4.324034 mul 0.211765 add exch dup 0.000000 sub -0.215126 mul 0.545098 add exch dup 0.000000 sub -3.635630 mul 0.839216 add exch } if dup 0.182292 gt { exch pop exch pop exch pop dup 0.182292 sub -0.472174 mul 1.000000 add exch dup 0.182292 sub -0.944349 mul 0.505882 add exch dup 0.182292 sub 1.454296 mul 0.176471 add exch } if dup 0.389925 gt { exch pop exch pop exch pop dup 0.389925 sub -4.864687 mul 0.901961 add exch dup 0.389925 sub 2.143034 mul 0.309804 add exch dup 0.389925 sub 0.150013 mul 0.478431 add exch } if dup 0.572917 gt { exch pop exch pop exch pop dup 0.572917 sub 0.810860 mul 0.011765 add exch dup 0.572917 sub 0.289593 mul 0.701961 add exch dup 0.572917 sub 1.312820 mul 0.505882 add exch } if dup 0.776042 gt { exch pop exch pop exch pop dup 0.776042 sub 2.223803 mul 0.176471 add exch dup 0.776042 sub -2.363885 mul 0.760784 add exch dup 0.776042 sub -0.507798 mul 0.772549 add exch } if dup 1.000000 gt { exch pop exch pop exch pop 0.674510 exch 0.231373 exch 0.658824 exch } if pop }
|
||||
endstream
|
||||
endobj
|
||||
|
||||
14 0 obj
|
||||
1119
|
||||
endobj
|
||||
|
||||
15 0 obj
|
||||
<< /Length 16 0 R
|
||||
/Range [ 0.000000 1.000000 ]
|
||||
/Domain [ 0.000000 1.000000 ]
|
||||
/FunctionType 4
|
||||
>>
|
||||
stream
|
||||
{ 0.000000 exch dup 0.885417 gt { exch pop dup 0.885417 sub 8.727274 mul 0.000000 add exch } if dup 1.000000 gt { exch pop 1.000000 exch } if pop }
|
||||
endstream
|
||||
endobj
|
||||
|
||||
16 0 obj
|
||||
148
|
||||
endobj
|
||||
|
||||
17 0 obj
|
||||
<< /BBox [ 0.000000 0.000000 300.000000 300.000000 ]
|
||||
/Resources << /Pattern << /P1 << /Matrix [ -127.403831 248.798080 -248.798080 -127.403831 347.956726 70.673119 ]
|
||||
/Shading << /Coords [ 0.500000 0.500000 0.000000 0.500000 0.500000 0.500000 ]
|
||||
/ColorSpace /DeviceGray
|
||||
/Function 15 0 R
|
||||
/Domain [ 0.000000 1.000000 ]
|
||||
/ShadingType 3
|
||||
/Extend [ true true ]
|
||||
>>
|
||||
/PatternType 2
|
||||
/Type /Pattern
|
||||
>> >> >>
|
||||
/Subtype /Form
|
||||
/Length 18 0 R
|
||||
/Group << /Type /Group
|
||||
/S /Transparency
|
||||
/CS /DeviceGray
|
||||
>>
|
||||
/Type /XObject
|
||||
>>
|
||||
stream
|
||||
/DeviceGray CS
|
||||
/DeviceGray cs
|
||||
1.000000 0.000000 -0.000000 1.000000 25.000000 25.000000 cm
|
||||
250.000000 125.000000 m
|
||||
250.000000 55.964401 194.035599 0.000000 125.000000 0.000000 c
|
||||
55.964405 0.000000 0.000000 55.964401 0.000000 125.000000 c
|
||||
0.000000 194.035599 55.964405 250.000000 125.000000 250.000000 c
|
||||
194.035599 250.000000 250.000000 194.035599 250.000000 125.000000 c
|
||||
h
|
||||
/Pattern cs
|
||||
/P1 scn
|
||||
f
|
||||
n
|
||||
|
||||
endstream
|
||||
endobj
|
||||
|
||||
18 0 obj
|
||||
396
|
||||
endobj
|
||||
|
||||
19 0 obj
|
||||
<< /Type /XObject
|
||||
/Length 20 0 R
|
||||
/Group << /Type /Group
|
||||
/S /Transparency
|
||||
>>
|
||||
/Subtype /Form
|
||||
/Resources << /Pattern << /P3 << /Matrix [ -127.403831 248.798080 -248.798080 -127.403831 347.956726 70.673119 ]
|
||||
/Shading << /Coords [ 0.500000 0.500000 0.000000 0.500000 0.500000 0.500000 ]
|
||||
/ColorSpace /DeviceRGB
|
||||
/Function 9 0 R
|
||||
/Domain [ 0.000000 1.000000 ]
|
||||
/ShadingType 3
|
||||
/Extend [ true true ]
|
||||
>>
|
||||
/PatternType 2
|
||||
/Type /Pattern
|
||||
>>
|
||||
/P2 << /Matrix [ 105.999977 -284.000061 361.623688 134.972168 -115.811859 256.513977 ]
|
||||
/Shading << /Coords [ 0.500000 0.500000 0.000000 0.500000 0.500000 0.500000 ]
|
||||
/ColorSpace /DeviceRGB
|
||||
/Function 11 0 R
|
||||
/Domain [ 0.000000 1.000000 ]
|
||||
/ShadingType 3
|
||||
/Extend [ true true ]
|
||||
>>
|
||||
/PatternType 2
|
||||
/Type /Pattern
|
||||
>>
|
||||
/P1 << /Matrix [ 256.865387 -254.788467 254.788467 256.865387 -268.954285 56.983734 ]
|
||||
/Shading << /Coords [ 0.000000 0.000000 1.000000 0.000000 ]
|
||||
/ColorSpace /DeviceRGB
|
||||
/Function 13 0 R
|
||||
/Domain [ 0.000000 1.000000 ]
|
||||
/ShadingType 2
|
||||
/Extend [ true true ]
|
||||
>>
|
||||
/PatternType 2
|
||||
/Type /Pattern
|
||||
>>
|
||||
>>
|
||||
/ExtGState << /E4 << /SMask << /Type /Mask
|
||||
/G 17 0 R
|
||||
/S /Luminosity
|
||||
>>
|
||||
/Type /ExtGState
|
||||
>>
|
||||
/E2 << /ca 0.500000 >>
|
||||
/E3 << /ca 0.400000 >>
|
||||
/E1 << /ca 0.200000 >>
|
||||
>>
|
||||
>>
|
||||
/BBox [ 0.000000 0.000000 300.000000 300.000000 ]
|
||||
>>
|
||||
stream
|
||||
q
|
||||
1.000000 0.000000 -0.000000 1.000000 25.000000 25.000000 cm
|
||||
0.098039 0.113725 0.129412 scn
|
||||
250.000000 125.000000 m
|
||||
250.000000 55.964401 194.035599 0.000000 125.000000 0.000000 c
|
||||
55.964405 0.000000 0.000000 55.964401 0.000000 125.000000 c
|
||||
0.000000 194.035599 55.964405 250.000000 125.000000 250.000000 c
|
||||
194.035599 250.000000 250.000000 194.035599 250.000000 125.000000 c
|
||||
h
|
||||
f
|
||||
n
|
||||
Q
|
||||
q
|
||||
/E1 gs
|
||||
1.000000 0.000000 -0.000000 1.000000 25.000000 25.000000 cm
|
||||
/Pattern cs
|
||||
/P1 scn
|
||||
250.000000 125.000000 m
|
||||
250.000000 55.964401 194.035599 0.000000 125.000000 0.000000 c
|
||||
55.964405 0.000000 0.000000 55.964401 0.000000 125.000000 c
|
||||
0.000000 194.035599 55.964405 250.000000 125.000000 250.000000 c
|
||||
194.035599 250.000000 250.000000 194.035599 250.000000 125.000000 c
|
||||
h
|
||||
f
|
||||
n
|
||||
Q
|
||||
q
|
||||
/E2 gs
|
||||
1.000000 0.000000 -0.000000 1.000000 25.000000 25.000000 cm
|
||||
/Pattern cs
|
||||
/P2 scn
|
||||
250.000000 125.000000 m
|
||||
250.000000 55.964401 194.035599 0.000000 125.000000 0.000000 c
|
||||
55.964405 0.000000 0.000000 55.964401 0.000000 125.000000 c
|
||||
0.000000 194.035599 55.964405 250.000000 125.000000 250.000000 c
|
||||
194.035599 250.000000 250.000000 194.035599 250.000000 125.000000 c
|
||||
h
|
||||
f
|
||||
n
|
||||
Q
|
||||
q
|
||||
/E3 gs
|
||||
/E4 gs
|
||||
1.000000 0.000000 -0.000000 1.000000 25.000000 25.000000 cm
|
||||
/Pattern cs
|
||||
/P3 scn
|
||||
250.000000 125.000000 m
|
||||
250.000000 55.964401 194.035599 0.000000 125.000000 0.000000 c
|
||||
55.964405 0.000000 0.000000 55.964401 0.000000 125.000000 c
|
||||
0.000000 194.035599 55.964405 250.000000 125.000000 250.000000 c
|
||||
194.035599 250.000000 250.000000 194.035599 250.000000 125.000000 c
|
||||
h
|
||||
f
|
||||
n
|
||||
Q
|
||||
|
||||
endstream
|
||||
endobj
|
||||
|
||||
20 0 obj
|
||||
1519
|
||||
endobj
|
||||
|
||||
21 0 obj
|
||||
<< /Length 22 0 R
|
||||
/Range [ 0.000000 1.000000 0.000000 1.000000 0.000000 1.000000 ]
|
||||
/Domain [ 0.000000 1.000000 ]
|
||||
/FunctionType 4
|
||||
>>
|
||||
stream
|
||||
{ 1.000000 exch 1.000000 exch 1.000000 exch dup 0.258514 gt { exch pop exch pop exch pop dup 0.258514 sub 0.000000 mul 1.000000 add exch dup 0.258514 sub 0.000000 mul 1.000000 add exch dup 0.258514 sub 0.000000 mul 1.000000 add exch } if dup 0.942462 gt { exch pop exch pop exch pop 1.000000 exch 1.000000 exch 1.000000 exch } if pop }
|
||||
endstream
|
||||
endobj
|
||||
|
||||
22 0 obj
|
||||
336
|
||||
endobj
|
||||
|
||||
23 0 obj
|
||||
<< /Length 24 0 R
|
||||
/Range [ 0.000000 1.000000 ]
|
||||
/Domain [ 0.000000 1.000000 ]
|
||||
/FunctionType 4
|
||||
>>
|
||||
stream
|
||||
{ 1.000000 exch dup 0.258514 gt { exch pop dup 0.258514 sub -1.462099 mul 1.000000 add exch } if dup 0.942462 gt { exch pop 0.000000 exch } if pop }
|
||||
endstream
|
||||
endobj
|
||||
|
||||
24 0 obj
|
||||
149
|
||||
endobj
|
||||
|
||||
25 0 obj
|
||||
<< /BBox [ 0.000000 0.000000 300.000000 300.000000 ]
|
||||
/Resources << /Pattern << /P1 << /Matrix [ 18.000000 -296.999969 296.999969 18.000000 -16.499969 313.000000 ]
|
||||
/Shading << /Coords [ 0.500000 0.500000 0.000000 0.500000 0.500000 0.500000 ]
|
||||
/ColorSpace /DeviceGray
|
||||
/Function 23 0 R
|
||||
/Domain [ 0.000000 1.000000 ]
|
||||
/ShadingType 3
|
||||
/Extend [ true true ]
|
||||
>>
|
||||
/PatternType 2
|
||||
/Type /Pattern
|
||||
>> >> >>
|
||||
/Subtype /Form
|
||||
/Length 26 0 R
|
||||
/Group << /Type /Group
|
||||
/S /Transparency
|
||||
/CS /DeviceGray
|
||||
>>
|
||||
/Type /XObject
|
||||
>>
|
||||
stream
|
||||
/DeviceGray CS
|
||||
/DeviceGray cs
|
||||
1.000000 0.000000 -0.000000 1.000000 25.000000 25.000000 cm
|
||||
250.000000 125.000000 m
|
||||
250.000000 55.964401 194.035599 0.000000 125.000000 0.000000 c
|
||||
55.964405 0.000000 0.000000 55.964401 0.000000 125.000000 c
|
||||
0.000000 194.035599 55.964405 250.000000 125.000000 250.000000 c
|
||||
194.035599 250.000000 250.000000 194.035599 250.000000 125.000000 c
|
||||
h
|
||||
/Pattern cs
|
||||
/P1 scn
|
||||
f
|
||||
n
|
||||
|
||||
endstream
|
||||
endobj
|
||||
|
||||
26 0 obj
|
||||
396
|
||||
endobj
|
||||
|
||||
27 0 obj
|
||||
<< /Type /XObject
|
||||
/Length 28 0 R
|
||||
/Group << /Type /Group
|
||||
/S /Transparency
|
||||
>>
|
||||
/Subtype /Form
|
||||
/Resources << /Pattern << /P1 << /Matrix [ 18.000000 -296.999969 296.999969 18.000000 -16.499969 313.000000 ]
|
||||
/Shading << /Coords [ 0.500000 0.500000 0.000000 0.500000 0.500000 0.500000 ]
|
||||
/ColorSpace /DeviceRGB
|
||||
/Function 21 0 R
|
||||
/Domain [ 0.000000 1.000000 ]
|
||||
/ShadingType 3
|
||||
/Extend [ true true ]
|
||||
>>
|
||||
/PatternType 2
|
||||
/Type /Pattern
|
||||
>> >>
|
||||
/ExtGState << /E1 << /SMask << /Type /Mask
|
||||
/G 25 0 R
|
||||
/S /Luminosity
|
||||
>>
|
||||
/Type /ExtGState
|
||||
>> >>
|
||||
>>
|
||||
/BBox [ 0.000000 0.000000 300.000000 300.000000 ]
|
||||
>>
|
||||
stream
|
||||
/DeviceRGB CS
|
||||
/DeviceRGB cs
|
||||
q
|
||||
/E1 gs
|
||||
1.000000 0.000000 -0.000000 1.000000 25.000000 25.000000 cm
|
||||
/Pattern cs
|
||||
/P1 scn
|
||||
250.000000 125.000000 m
|
||||
250.000000 55.964401 194.035599 0.000000 125.000000 0.000000 c
|
||||
55.964405 0.000000 0.000000 55.964401 0.000000 125.000000 c
|
||||
0.000000 194.035599 55.964405 250.000000 125.000000 250.000000 c
|
||||
194.035599 250.000000 250.000000 194.035599 250.000000 125.000000 c
|
||||
h
|
||||
f
|
||||
n
|
||||
Q
|
||||
|
||||
endstream
|
||||
endobj
|
||||
|
||||
28 0 obj
|
||||
405
|
||||
endobj
|
||||
|
||||
29 0 obj
|
||||
<< /XObject << /X2 7 0 R
|
||||
/X1 19 0 R
|
||||
>>
|
||||
/ExtGState << /E2 << /SMask << /Type /Mask
|
||||
/G 27 0 R
|
||||
/S /Alpha
|
||||
>>
|
||||
/Type /ExtGState
|
||||
>>
|
||||
/E1 << /ca 0.600000 >>
|
||||
>>
|
||||
>>
|
||||
endobj
|
||||
|
||||
30 0 obj
|
||||
<< /Length 31 0 R >>
|
||||
stream
|
||||
/DeviceRGB CS
|
||||
/DeviceRGB cs
|
||||
q
|
||||
/E1 gs
|
||||
/X1 Do
|
||||
Q
|
||||
q
|
||||
/E2 gs
|
||||
/X2 Do
|
||||
Q
|
||||
|
||||
endstream
|
||||
endobj
|
||||
|
||||
31 0 obj
|
||||
64
|
||||
endobj
|
||||
|
||||
32 0 obj
|
||||
<< /Annots []
|
||||
/Type /Page
|
||||
/MediaBox [ 0.000000 0.000000 300.000000 300.000000 ]
|
||||
/Resources 29 0 R
|
||||
/Contents 30 0 R
|
||||
/Parent 33 0 R
|
||||
>>
|
||||
endobj
|
||||
|
||||
33 0 obj
|
||||
<< /Kids [ 32 0 R ]
|
||||
/Count 1
|
||||
/Type /Pages
|
||||
>>
|
||||
endobj
|
||||
|
||||
34 0 obj
|
||||
<< /Pages 33 0 R
|
||||
/Type /Catalog
|
||||
>>
|
||||
endobj
|
||||
|
||||
xref
|
||||
0 35
|
||||
0000000000 65535 f
|
||||
0000000010 00000 n
|
||||
0000001142 00000 n
|
||||
0000001164 00000 n
|
||||
0000002310 00000 n
|
||||
0000002332 00000 n
|
||||
0000003480 00000 n
|
||||
0000003502 00000 n
|
||||
0000010873 00000 n
|
||||
0000010896 00000 n
|
||||
0000011420 00000 n
|
||||
0000011443 00000 n
|
||||
0000011968 00000 n
|
||||
0000011991 00000 n
|
||||
0000013296 00000 n
|
||||
0000013320 00000 n
|
||||
0000013618 00000 n
|
||||
0000013641 00000 n
|
||||
0000015090 00000 n
|
||||
0000015113 00000 n
|
||||
0000019782 00000 n
|
||||
0000019806 00000 n
|
||||
0000020328 00000 n
|
||||
0000020351 00000 n
|
||||
0000020650 00000 n
|
||||
0000020673 00000 n
|
||||
0000022119 00000 n
|
||||
0000022142 00000 n
|
||||
0000023918 00000 n
|
||||
0000023941 00000 n
|
||||
0000024341 00000 n
|
||||
0000024463 00000 n
|
||||
0000024485 00000 n
|
||||
0000024664 00000 n
|
||||
0000024740 00000 n
|
||||
trailer
|
||||
<< /ID [ (some) (id) ]
|
||||
/Root 34 0 R
|
||||
/Size 35
|
||||
>>
|
||||
startxref
|
||||
24801
|
||||
%%EOF
|
||||
-1067
File diff suppressed because it is too large
Load Diff
BIN
Binary file not shown.
BIN
Binary file not shown.
-1451
File diff suppressed because it is too large
Load Diff
-1451
File diff suppressed because it is too large
Load Diff
BIN
Binary file not shown.
BIN
Binary file not shown.
+2
-4
@@ -1,5 +1,3 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg width="100%" height="100%" viewBox="0 0 70 70" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
|
||||
<path d="M35,0C54.317,0 70,15.683 70,35C70,54.317 54.317,70 35,70C15.683,70 0,54.317 0,35C0,15.683 15.683,0 35,0ZM47.25,36.75L22.75,36.75C20.825,36.75 19.25,38.325 19.25,40.25L19.25,47.25C19.25,49.175 20.825,50.75 22.75,50.75L47.25,50.75C49.175,50.75 50.75,49.175 50.75,47.25L50.75,40.25C50.75,38.325 49.175,36.75 47.25,36.75ZM26.25,47.25C24.325,47.25 22.75,45.675 22.75,43.75C22.75,41.825 24.325,40.25 26.25,40.25C28.175,40.25 29.75,41.825 29.75,43.75C29.75,45.675 28.175,47.25 26.25,47.25ZM47.25,19.25L22.75,19.25C20.825,19.25 19.25,20.825 19.25,22.75L19.25,29.75C19.25,31.675 20.825,33.25 22.75,33.25L47.25,33.25C49.175,33.25 50.75,31.675 50.75,29.75L50.75,22.75C50.75,20.825 49.175,19.25 47.25,19.25ZM26.25,29.75C24.325,29.75 22.75,28.175 22.75,26.25C22.75,24.325 24.325,22.75 26.25,22.75C28.175,22.75 29.75,24.325 29.75,26.25C29.75,28.175 28.175,29.75 26.25,29.75Z" style="fill:rgb(13,189,139);"/>
|
||||
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M28.25 17.75H3.75C1.825 17.75 0.25 19.325 0.25 21.25V28.25C0.25 30.175 1.825 31.75 3.75 31.75H28.25C30.175 31.75 31.75 30.175 31.75 28.25V21.25C31.75 19.325 30.175 17.75 28.25 17.75ZM7.25 28.25C5.325 28.25 3.75 26.675 3.75 24.75C3.75 22.825 5.325 21.25 7.25 21.25C9.175 21.25 10.75 22.825 10.75 24.75C10.75 26.675 9.175 28.25 7.25 28.25ZM28.25 0.25H3.75C1.825 0.25 0.25 1.825 0.25 3.75V10.75C0.25 12.675 1.825 14.25 3.75 14.25H28.25C30.175 14.25 31.75 12.675 31.75 10.75V3.75C31.75 1.825 30.175 0.25 28.25 0.25ZM7.25 10.75C5.325 10.75 3.75 9.175 3.75 7.25C3.75 5.325 5.325 3.75 7.25 3.75C9.175 3.75 10.75 5.325 10.75 7.25C10.75 9.175 9.175 10.75 7.25 10.75Z" fill="#737D8C"/>
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 788 B |
@@ -41,7 +41,7 @@
|
||||
"session_verification_banner_title" = "Help keep your messages secure";
|
||||
"session_verification_banner_message" = "Looks like you’re using a new device. Verify its you.";
|
||||
|
||||
"server_selection_server_footer" = "You can only connect to a server that has already been set up";
|
||||
"server_selection_server_footer" = "You can only connect to an existing server";
|
||||
|
||||
"login_mobile_device" = "Mobile";
|
||||
"login_tablet_device" = "Tablet";
|
||||
@@ -56,3 +56,17 @@
|
||||
// Room Details
|
||||
"room_details_title" = "Info";
|
||||
"room_details_about_section_title" = "About";
|
||||
"room_details_copy_link" = "Copy Link";
|
||||
|
||||
// Onboarding
|
||||
"ftue_auth_carousel_welcome_title" = "Be in your Element";
|
||||
"ftue_auth_carousel_welcome_body" = "Welcome to the %@ Beta. Supercharged, for speed and simplicity.";
|
||||
|
||||
// Sign in
|
||||
"ftue_auth_sign_in_enter_details" = "Enter your details";
|
||||
|
||||
// Bug report
|
||||
"bug_report_screen_title" = "Report a bug";
|
||||
"bug_report_screen_description" = "Please describe the bug. What did you do? What did you expect to happen? What actually happened. Please go into as much detail as you can.";
|
||||
"bug_report_screen_include_logs" = "Send logs to help";
|
||||
"bug_report_screen_logs_description" = "To check things work as intended, logs will be sent with your message. These will be private. To just send your message, turn off this setting.";
|
||||
|
||||
@@ -25,10 +25,10 @@ internal enum Asset {
|
||||
internal enum Images {
|
||||
internal static let analyticsCheckmark = ImageAsset(name: "Images/AnalyticsCheckmark")
|
||||
internal static let analyticsLogo = ImageAsset(name: "Images/AnalyticsLogo")
|
||||
internal static let onboardingScreenPage1 = ImageAsset(name: "Images/Onboarding Screen Page 1")
|
||||
internal static let onboardingScreenPage2 = ImageAsset(name: "Images/Onboarding Screen Page 2")
|
||||
internal static let onboardingScreenPage3 = ImageAsset(name: "Images/Onboarding Screen Page 3")
|
||||
internal static let onboardingScreenPage4 = ImageAsset(name: "Images/Onboarding Screen Page 4")
|
||||
internal static let onboardingAppLogo = ImageAsset(name: "Images/Onboarding App Logo")
|
||||
internal static let onboardingBackgroundPart1 = ImageAsset(name: "Images/Onboarding Background Part 1")
|
||||
internal static let onboardingBackgroundPart2 = ImageAsset(name: "Images/Onboarding Background Part 2")
|
||||
internal static let onboardingBackgroundPart3 = ImageAsset(name: "Images/Onboarding Background Part 3")
|
||||
internal static let serverSelectionIcon = ImageAsset(name: "Images/Server Selection Icon")
|
||||
internal static let encryptionNormal = ImageAsset(name: "Images/encryption_normal")
|
||||
internal static let encryptionTrusted = ImageAsset(name: "Images/encryption_trusted")
|
||||
|
||||
@@ -16,10 +16,26 @@ extension ElementL10n {
|
||||
public static let actionConfirm = ElementL10n.tr("Untranslated", "action_confirm")
|
||||
/// Match
|
||||
public static let actionMatch = ElementL10n.tr("Untranslated", "action_match")
|
||||
/// Please describe the bug. What did you do? What did you expect to happen? What actually happened. Please go into as much detail as you can.
|
||||
public static let bugReportScreenDescription = ElementL10n.tr("Untranslated", "bug_report_screen_description")
|
||||
/// Send logs to help
|
||||
public static let bugReportScreenIncludeLogs = ElementL10n.tr("Untranslated", "bug_report_screen_include_logs")
|
||||
/// To check things work as intended, logs will be sent with your message. These will be private. To just send your message, turn off this setting.
|
||||
public static let bugReportScreenLogsDescription = ElementL10n.tr("Untranslated", "bug_report_screen_logs_description")
|
||||
/// Report a bug
|
||||
public static let bugReportScreenTitle = ElementL10n.tr("Untranslated", "bug_report_screen_title")
|
||||
/// %@ iOS
|
||||
public static func defaultSessionDisplayName(_ p1: Any) -> String {
|
||||
return ElementL10n.tr("Untranslated", "default_session_display_name", String(describing: p1))
|
||||
}
|
||||
/// Welcome to the %@ Beta. Supercharged, for speed and simplicity.
|
||||
public static func ftueAuthCarouselWelcomeBody(_ p1: Any) -> String {
|
||||
return ElementL10n.tr("Untranslated", "ftue_auth_carousel_welcome_body", String(describing: p1))
|
||||
}
|
||||
/// Be in your Element
|
||||
public static let ftueAuthCarouselWelcomeTitle = ElementL10n.tr("Untranslated", "ftue_auth_carousel_welcome_title")
|
||||
/// Enter your details
|
||||
public static let ftueAuthSignInEnterDetails = ElementL10n.tr("Untranslated", "ftue_auth_sign_in_enter_details")
|
||||
/// Mobile
|
||||
public static let loginMobileDevice = ElementL10n.tr("Untranslated", "login_mobile_device")
|
||||
/// Tablet
|
||||
@@ -70,6 +86,8 @@ extension ElementL10n {
|
||||
public static let notification = ElementL10n.tr("Untranslated", "Notification")
|
||||
/// About
|
||||
public static let roomDetailsAboutSectionTitle = ElementL10n.tr("Untranslated", "room_details_about_section_title")
|
||||
/// Copy Link
|
||||
public static let roomDetailsCopyLink = ElementL10n.tr("Untranslated", "room_details_copy_link")
|
||||
/// Info
|
||||
public static let roomDetailsTitle = ElementL10n.tr("Untranslated", "room_details_title")
|
||||
/// Failed loading messages
|
||||
@@ -96,7 +114,7 @@ extension ElementL10n {
|
||||
public static let screenshotDetectedMessage = ElementL10n.tr("Untranslated", "screenshot_detected_message")
|
||||
/// You took a screenshot
|
||||
public static let screenshotDetectedTitle = ElementL10n.tr("Untranslated", "screenshot_detected_title")
|
||||
/// You can only connect to a server that has already been set up
|
||||
/// You can only connect to an existing server
|
||||
public static let serverSelectionServerFooter = ElementL10n.tr("Untranslated", "server_selection_server_footer")
|
||||
/// Looks like you’re using a new device. Verify its you.
|
||||
public static let sessionVerificationBannerMessage = ElementL10n.tr("Untranslated", "session_verification_banner_message")
|
||||
|
||||
@@ -56,7 +56,7 @@ enum UserAvatarSizeOnScreen {
|
||||
case .settings:
|
||||
return 60
|
||||
case .roomDetails:
|
||||
return 32
|
||||
return 44
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -73,7 +73,7 @@ enum RoomAvatarSizeOnScreen {
|
||||
case .home:
|
||||
return 44
|
||||
case .details:
|
||||
return 100
|
||||
return 70
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,33 @@
|
||||
//
|
||||
// Copyright 2022 New Vector Ltd
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
//
|
||||
|
||||
import SwiftUI
|
||||
|
||||
/// Style for section header
|
||||
struct FormSectionHeaderStyle: ViewModifier {
|
||||
func body(content: Content) -> some View {
|
||||
content
|
||||
.foregroundColor(.element.secondaryContent)
|
||||
.font(.element.footnoteBold)
|
||||
}
|
||||
}
|
||||
|
||||
extension View {
|
||||
/// Applies the `FormSectionHeaderStyle` modifier to the view
|
||||
func formSectionHeader() -> some View {
|
||||
modifier(FormSectionHeaderStyle())
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,47 @@
|
||||
//
|
||||
// Copyright 2023 New Vector Ltd
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
//
|
||||
|
||||
import SwiftUI
|
||||
|
||||
/// Small squared action button for settings screens
|
||||
struct SettingsActionButton: View {
|
||||
// MARK: Public
|
||||
|
||||
let title: String
|
||||
let image: Image
|
||||
let action: () -> Void
|
||||
|
||||
// MARK: Private
|
||||
|
||||
@ScaledMetric private var menuIconSize = 54.0
|
||||
|
||||
// MARK: Views
|
||||
|
||||
var body: some View {
|
||||
Button(action: action) {
|
||||
VStack {
|
||||
image
|
||||
.renderingMode(.template)
|
||||
.foregroundColor(.element.primaryContent)
|
||||
.frame(width: menuIconSize, height: menuIconSize)
|
||||
.background(RoundedRectangle(cornerRadius: 16).fill(Color.element.background))
|
||||
Text(title)
|
||||
.foregroundColor(.element.secondaryContent)
|
||||
.font(.element.subheadline)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,58 @@
|
||||
//
|
||||
// Copyright 2023 New Vector Ltd
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
//
|
||||
|
||||
import SwiftUI
|
||||
|
||||
/// Default row that can be reused for settings screens
|
||||
struct SettingsDefaultRow: View {
|
||||
// MARK: Public
|
||||
|
||||
let title: String
|
||||
let image: Image
|
||||
let action: () -> Void
|
||||
|
||||
// MARK: Private
|
||||
|
||||
@ScaledMetric private var menuIconSize = 30.0
|
||||
private let listRowInsets = EdgeInsets(top: 8, leading: 16, bottom: 8, trailing: 16)
|
||||
|
||||
// MARK: Views
|
||||
|
||||
var body: some View {
|
||||
Button(action: action) {
|
||||
HStack(spacing: 16) {
|
||||
image
|
||||
.foregroundColor(.element.systemGray)
|
||||
.padding(4)
|
||||
.background(Color.element.systemGray6)
|
||||
.clipShape(RoundedRectangle(cornerRadius: 8))
|
||||
.frame(width: menuIconSize, height: menuIconSize)
|
||||
|
||||
Text(title)
|
||||
.font(.element.body)
|
||||
.foregroundColor(.element.primaryContent)
|
||||
|
||||
Spacer()
|
||||
|
||||
Image(systemName: "chevron.forward")
|
||||
.foregroundColor(.element.tertiaryContent)
|
||||
}
|
||||
}
|
||||
.listRowInsets(listRowInsets)
|
||||
.listRowSeparator(.hidden)
|
||||
.foregroundColor(.element.primaryContent)
|
||||
}
|
||||
}
|
||||
@@ -18,16 +18,17 @@ import SwiftUI
|
||||
|
||||
/// An image that is styled for use as the screen icon in the onboarding flow.
|
||||
struct AuthenticationIconImage: View {
|
||||
let image: ImageAsset
|
||||
let image: Image
|
||||
|
||||
var body: some View {
|
||||
Image(image.name)
|
||||
image
|
||||
.resizable()
|
||||
.renderingMode(.template)
|
||||
.foregroundColor(.element.accent)
|
||||
.frame(width: 90, height: 90)
|
||||
.background(.white, in: Circle().inset(by: 2))
|
||||
.foregroundColor(.element.secondaryContent)
|
||||
.accessibilityHidden(true)
|
||||
.padding(20)
|
||||
.frame(width: 72, height: 72)
|
||||
.background(RoundedRectangle(cornerRadius: 14).fill(Color.element.quinaryContent))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -35,6 +36,6 @@ struct AuthenticationIconImage: View {
|
||||
|
||||
struct AuthenticationIconImage_Previews: PreviewProvider {
|
||||
static var previews: some View {
|
||||
AuthenticationIconImage(image: Asset.Images.serverSelectionIcon)
|
||||
AuthenticationIconImage(image: Image(asset: Asset.Images.serverSelectionIcon))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -197,13 +197,11 @@ final class LoginCoordinator: CoordinatorProtocol {
|
||||
|
||||
/// Presents the server selection screen as a modal.
|
||||
private func presentServerSelectionScreen() {
|
||||
let serverSelectionNavigationStackCoordinator = NavigationStackCoordinator()
|
||||
|
||||
let userNotificationController = UserNotificationController(rootCoordinator: serverSelectionNavigationStackCoordinator)
|
||||
let userNotificationController = UserNotificationController(rootCoordinator: navigationStackCoordinator)
|
||||
|
||||
let parameters = ServerSelectionCoordinatorParameters(authenticationService: authenticationService,
|
||||
userNotificationController: userNotificationController,
|
||||
isModallyPresented: true)
|
||||
isModallyPresented: false)
|
||||
|
||||
let coordinator = ServerSelectionCoordinator(parameters: parameters)
|
||||
coordinator.callback = { [weak self, weak coordinator] action in
|
||||
@@ -211,9 +209,7 @@ final class LoginCoordinator: CoordinatorProtocol {
|
||||
self.serverSelectionCoordinator(coordinator, didCompleteWith: action)
|
||||
}
|
||||
|
||||
serverSelectionNavigationStackCoordinator.setRootCoordinator(coordinator)
|
||||
|
||||
navigationStackCoordinator.setSheetCoordinator(userNotificationController)
|
||||
navigationStackCoordinator.push(coordinator)
|
||||
}
|
||||
|
||||
/// Handles the result from the server selection modal, dismissing it after updating the view.
|
||||
@@ -223,7 +219,7 @@ final class LoginCoordinator: CoordinatorProtocol {
|
||||
updateViewModel()
|
||||
}
|
||||
|
||||
navigationStackCoordinator.setSheetCoordinator(nil)
|
||||
navigationStackCoordinator.pop()
|
||||
}
|
||||
|
||||
/// Shows the forgot password screen.
|
||||
|
||||
@@ -29,15 +29,10 @@ struct LoginScreen: View {
|
||||
VStack(spacing: 0) {
|
||||
header
|
||||
.padding(.top, UIConstants.topPaddingToNavigationBar)
|
||||
.padding(.bottom, 36)
|
||||
.padding(.bottom, 32)
|
||||
|
||||
serverInfo
|
||||
.padding(.leading, 12)
|
||||
|
||||
Rectangle()
|
||||
.fill(Color.element.quinaryContent)
|
||||
.frame(height: 1)
|
||||
.padding(.vertical, 21)
|
||||
.padding(.bottom, 32)
|
||||
|
||||
switch context.viewState.loginMode {
|
||||
case .password:
|
||||
@@ -59,7 +54,7 @@ struct LoginScreen: View {
|
||||
/// The header containing a Welcome Back title.
|
||||
var header: some View {
|
||||
Text(ElementL10n.ftueAuthWelcomeBackTitle)
|
||||
.font(.element.title2Bold)
|
||||
.font(.element.title1Bold)
|
||||
.multilineTextAlignment(.center)
|
||||
.foregroundColor(.element.primaryContent)
|
||||
}
|
||||
@@ -73,7 +68,13 @@ struct LoginScreen: View {
|
||||
|
||||
/// The form with text fields for username and password, along with a submit button.
|
||||
var loginForm: some View {
|
||||
VStack(spacing: 14) {
|
||||
VStack(alignment: .leading, spacing: 0) {
|
||||
Text(ElementL10n.ftueAuthSignInEnterDetails)
|
||||
.font(.element.subheadline)
|
||||
.foregroundColor(.element.primaryContent)
|
||||
.padding(.horizontal, 16)
|
||||
.padding(.bottom, 8)
|
||||
|
||||
TextField(ElementL10n.loginSigninUsernameHint, text: $context.username)
|
||||
.focused($isUsernameFocused)
|
||||
.textFieldStyle(.elementInput())
|
||||
@@ -84,8 +85,7 @@ struct LoginScreen: View {
|
||||
.onChange(of: isUsernameFocused, perform: usernameFocusChanged)
|
||||
.onSubmit { isPasswordFocused = true }
|
||||
.accessibilityIdentifier("usernameTextField")
|
||||
|
||||
Spacer().frame(height: 20)
|
||||
.padding(.bottom, 20)
|
||||
|
||||
SecureField(ElementL10n.loginSignupPasswordHint, text: $context.password)
|
||||
.focused($isPasswordFocused)
|
||||
@@ -95,15 +95,18 @@ struct LoginScreen: View {
|
||||
.onSubmit(submit)
|
||||
.accessibilityIdentifier("passwordTextField")
|
||||
|
||||
Button { context.send(viewAction: .forgotPassword) } label: {
|
||||
Text(ElementL10n.ftueAuthForgotPassword)
|
||||
.font(.element.body)
|
||||
}
|
||||
.frame(maxWidth: .infinity, alignment: .trailing)
|
||||
.padding(.bottom, 8)
|
||||
// uncomment this piece of code once forgot password will be available
|
||||
// Button { context.send(viewAction: .forgotPassword) } label: {
|
||||
// Text(ElementL10n.ftueAuthForgotPassword)
|
||||
// .font(.element.body)
|
||||
// }
|
||||
// .frame(maxWidth: .infinity, alignment: .trailing)
|
||||
// .padding(.bottom, 8)
|
||||
|
||||
Spacer().frame(height: 32)
|
||||
|
||||
Button(action: submit) {
|
||||
Text(ElementL10n.loginSignupSubmit)
|
||||
Text(ElementL10n.loginContinue)
|
||||
}
|
||||
.buttonStyle(.elementAction(.xLarge))
|
||||
.disabled(!context.viewState.canSubmit)
|
||||
|
||||
+25
-14
@@ -29,25 +29,36 @@ struct LoginServerInfoSection: View {
|
||||
// MARK: - Views
|
||||
|
||||
var body: some View {
|
||||
VStack(alignment: .leading, spacing: 4) {
|
||||
VStack(alignment: .leading, spacing: 8) {
|
||||
Text(ElementL10n.ftueAuthSignInChooseServerHeader)
|
||||
.font(.element.subheadline)
|
||||
.foregroundColor(.element.secondaryContent)
|
||||
.foregroundColor(.element.primaryContent)
|
||||
.padding(.horizontal, 16)
|
||||
|
||||
HStack {
|
||||
Text(address)
|
||||
.font(.element.body)
|
||||
.foregroundColor(.element.primaryContent)
|
||||
|
||||
Spacer()
|
||||
|
||||
Button(action: editAction) {
|
||||
Text(ElementL10n.edit)
|
||||
.padding(.vertical, 2)
|
||||
Button(action: editAction) {
|
||||
HStack {
|
||||
Text(address)
|
||||
.font(.element.subheadlineBold)
|
||||
.foregroundColor(.element.primaryContent)
|
||||
.padding(.horizontal, 16)
|
||||
.padding(.vertical)
|
||||
|
||||
Spacer()
|
||||
|
||||
Image(systemName: "chevron.right")
|
||||
.foregroundColor(.element.tertiaryContent)
|
||||
.padding(.trailing, 16)
|
||||
}
|
||||
.buttonStyle(.elementGhost())
|
||||
.accessibilityIdentifier("editServerButton")
|
||||
.background(RoundedRectangle(cornerRadius: 14).fill(Color.element.system))
|
||||
}
|
||||
.accessibilityIdentifier("editServerButton")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
struct LoginServerInfoSection_Previews: PreviewProvider {
|
||||
static var previews: some View {
|
||||
LoginServerInfoSection(address: "matrix.org", editAction: { })
|
||||
.padding()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -38,7 +38,7 @@ struct ServerSelectionViewState: BindableState {
|
||||
|
||||
/// The title shown on the confirm button.
|
||||
var buttonTitle: String {
|
||||
isModallyPresented ? ElementL10n.actionConfirm : ElementL10n.actionNext
|
||||
isModallyPresented ? ElementL10n.continue : ElementL10n.actionNext
|
||||
}
|
||||
|
||||
/// The text field is showing an error.
|
||||
|
||||
+5
-5
@@ -40,7 +40,7 @@ struct ServerSelectionScreen: View {
|
||||
/// The title, message and icon at the top of the screen.
|
||||
var header: some View {
|
||||
VStack(spacing: 8) {
|
||||
AuthenticationIconImage(image: Asset.Images.serverSelectionIcon)
|
||||
AuthenticationIconImage(image: Image(asset: Asset.Images.serverSelectionIcon))
|
||||
.padding(.bottom, 8)
|
||||
|
||||
Text(ElementL10n.ftueAuthChooseServerTitle)
|
||||
@@ -51,13 +51,14 @@ struct ServerSelectionScreen: View {
|
||||
Text(ElementL10n.ftueAuthChooseServerSubtitle)
|
||||
.font(.element.body)
|
||||
.multilineTextAlignment(.center)
|
||||
.foregroundColor(.element.secondaryContent)
|
||||
.foregroundColor(.element.tertiaryContent)
|
||||
}
|
||||
.padding(.horizontal, 16)
|
||||
}
|
||||
|
||||
/// The text field and confirm button where the user enters a server URL.
|
||||
var serverForm: some View {
|
||||
VStack(alignment: .leading, spacing: 12) {
|
||||
VStack(alignment: .leading, spacing: 24) {
|
||||
TextField(ElementL10n.ftueAuthChooseServerEntryHint, text: $context.homeserverAddress)
|
||||
.textFieldStyle(.elementInput(labelText: ElementL10n.hsUrl,
|
||||
footerText: context.viewState.footerMessage,
|
||||
@@ -70,8 +71,6 @@ struct ServerSelectionScreen: View {
|
||||
.onSubmit(submit)
|
||||
.accessibilityIdentifier("addressTextField")
|
||||
|
||||
Divider()
|
||||
|
||||
TextField(ElementL10n.ftueAuthChooseServerEntryHint, text: $context.slidingSyncProxyAddress)
|
||||
.textFieldStyle(.elementInput(labelText: "Sliding sync proxy URL"))
|
||||
.keyboardType(.URL)
|
||||
@@ -80,6 +79,7 @@ struct ServerSelectionScreen: View {
|
||||
.submitLabel(.done)
|
||||
.onSubmit(submit)
|
||||
.accessibilityIdentifier("slidingSyncProxyAddressTextField")
|
||||
.padding(.bottom, 8)
|
||||
|
||||
Button(action: submit) {
|
||||
Text(context.viewState.buttonTitle)
|
||||
|
||||
@@ -38,6 +38,5 @@ struct BugReportViewStateBindings {
|
||||
enum BugReportViewAction {
|
||||
case cancel
|
||||
case submit
|
||||
case toggleSendLogs
|
||||
case removeScreenshot
|
||||
}
|
||||
|
||||
@@ -41,8 +41,6 @@ class BugReportViewModel: BugReportViewModelType, BugReportViewModelProtocol {
|
||||
callback?(.cancel)
|
||||
case .submit:
|
||||
await submitBugReport()
|
||||
case .toggleSendLogs:
|
||||
context.sendingLogsEnabled.toggle()
|
||||
case .removeScreenshot:
|
||||
state.screenshot = nil
|
||||
}
|
||||
|
||||
@@ -26,93 +26,81 @@ struct BugReportScreen: View {
|
||||
@ObservedObject var context: BugReportViewModel.Context
|
||||
|
||||
var body: some View {
|
||||
GeometryReader { geometry in
|
||||
VStack {
|
||||
ScrollView {
|
||||
mainContent
|
||||
.padding(.top, 50)
|
||||
.padding(.horizontal, horizontalPadding)
|
||||
}
|
||||
.introspectScrollView { scrollView in
|
||||
scrollView.keyboardDismissMode = .onDrag
|
||||
}
|
||||
|
||||
buttons
|
||||
.padding(.horizontal, horizontalPadding)
|
||||
.padding(.bottom, geometry.safeAreaInsets.bottom > 0 ? 0 : 16)
|
||||
}
|
||||
.navigationTitle(ElementL10n.titleActivityBugReport)
|
||||
.toolbar {
|
||||
if context.viewState.isModallyPresented {
|
||||
ToolbarItem(placement: .cancellationAction) {
|
||||
Button(ElementL10n.actionCancel) {
|
||||
context.send(viewAction: .cancel)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
.interactiveDismissDisabled()
|
||||
ScrollView {
|
||||
mainContent
|
||||
.padding(.top, 50)
|
||||
.padding(.horizontal, horizontalPadding)
|
||||
}
|
||||
.scrollDismissesKeyboard(.immediately)
|
||||
.background(Color.element.system)
|
||||
.navigationTitle(ElementL10n.bugReportScreenTitle)
|
||||
.navigationBarTitleDisplayMode(.inline)
|
||||
.toolbar { toolbar }
|
||||
.interactiveDismissDisabled()
|
||||
}
|
||||
|
||||
|
||||
/// The main content of the view to be shown in a scroll view.
|
||||
var mainContent: some View {
|
||||
VStack(alignment: .leading, spacing: 12) {
|
||||
Text(ElementL10n.sendBugReportDescription)
|
||||
.accessibilityIdentifier("reportBugDescription")
|
||||
ZStack(alignment: .topLeading) {
|
||||
RoundedRectangle(cornerRadius: 8, style: .continuous)
|
||||
.fill(Color.element.system)
|
||||
|
||||
if context.reportText.isEmpty {
|
||||
Text(ElementL10n.sendBugReportPlaceholder)
|
||||
.foregroundColor(Color.element.secondaryContent)
|
||||
.padding(.horizontal, 8)
|
||||
.padding(.vertical, 12)
|
||||
}
|
||||
TextEditor(text: $context.reportText)
|
||||
.padding(4)
|
||||
.background(Color.clear)
|
||||
.cornerRadius(8)
|
||||
.accessibilityIdentifier("reportTextView")
|
||||
.introspectTextView { textView in
|
||||
textView.backgroundColor = .clear
|
||||
}
|
||||
}
|
||||
.frame(maxWidth: .infinity)
|
||||
.frame(height: 300)
|
||||
.font(.body)
|
||||
Text(ElementL10n.sendBugReportLogsDescription)
|
||||
.accessibilityIdentifier("sendLogsDescription")
|
||||
HStack(spacing: 12) {
|
||||
Toggle(ElementL10n.sendBugReportIncludeLogs, isOn: $context.sendingLogsEnabled)
|
||||
.toggleStyle(ElementToggleStyle())
|
||||
.accessibilityIdentifier("sendLogsToggle")
|
||||
Text(ElementL10n.sendBugReportIncludeLogs)
|
||||
.accessibilityIdentifier("sendLogsText")
|
||||
}
|
||||
.onTapGesture {
|
||||
context.send(viewAction: .toggleSendLogs)
|
||||
}
|
||||
VStack(alignment: .leading, spacing: 24) {
|
||||
descriptionTextEditor
|
||||
sendLogsToggle
|
||||
screenshot
|
||||
}
|
||||
}
|
||||
|
||||
/// The action buttons shown at the bottom of the view.
|
||||
var buttons: some View {
|
||||
VStack {
|
||||
Button { context.send(viewAction: .submit) } label: {
|
||||
Text(ElementL10n.actionSend)
|
||||
@ViewBuilder
|
||||
private var descriptionTextEditor: some View {
|
||||
ZStack(alignment: .topLeading) {
|
||||
RoundedRectangle(cornerRadius: 14, style: .continuous)
|
||||
.fill(Color.element.background)
|
||||
|
||||
TextEditor(text: $context.reportText)
|
||||
.tint(.element.brand)
|
||||
.padding(.horizontal, 10)
|
||||
.padding(.vertical, 4)
|
||||
.background(Color.clear)
|
||||
.cornerRadius(14)
|
||||
.accessibilityIdentifier("reportTextView")
|
||||
.introspectTextView { textView in
|
||||
textView.backgroundColor = .clear
|
||||
}
|
||||
|
||||
if context.reportText.isEmpty {
|
||||
Text(ElementL10n.bugReportScreenDescription)
|
||||
.font(.element.body)
|
||||
.foregroundColor(Color.element.secondaryContent)
|
||||
.padding(.horizontal, 16)
|
||||
.padding(.vertical, 12)
|
||||
.allowsHitTesting(false)
|
||||
}
|
||||
.frame(maxWidth: .infinity)
|
||||
.padding(.vertical, 16)
|
||||
.disabled(context.reportText.count < 5)
|
||||
.accessibilityIdentifier("sendButton")
|
||||
|
||||
RoundedRectangle(cornerRadius: 14, style: .continuous)
|
||||
.stroke(Color.element.quaternaryContent)
|
||||
}
|
||||
.frame(maxWidth: .infinity)
|
||||
.frame(height: 300)
|
||||
.font(.body)
|
||||
}
|
||||
|
||||
@ViewBuilder
|
||||
private var sendLogsToggle: some View {
|
||||
VStack(spacing: 8) {
|
||||
Toggle(ElementL10n.bugReportScreenIncludeLogs, isOn: $context.sendingLogsEnabled)
|
||||
.tint(Color.element.brand)
|
||||
.accessibilityIdentifier("sendLogsToggle")
|
||||
.padding(.horizontal, 16)
|
||||
.padding(.vertical, 11)
|
||||
.background(RoundedRectangle(cornerRadius: 14).fill(Color.element.background))
|
||||
|
||||
Text(ElementL10n.bugReportScreenLogsDescription)
|
||||
.font(.element.caption1)
|
||||
.foregroundColor(Color.element.secondaryContent)
|
||||
.padding(.horizontal, -8)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ViewBuilder
|
||||
var screenshot: some View {
|
||||
private var screenshot: some View {
|
||||
if let screenshot = context.viewState.screenshot {
|
||||
ZStack(alignment: .topTrailing) {
|
||||
Image(uiImage: screenshot)
|
||||
@@ -126,7 +114,27 @@ struct BugReportScreen: View {
|
||||
.offset(x: 10, y: -10)
|
||||
.accessibilityIdentifier("removeScreenshotButton")
|
||||
}
|
||||
.padding(.vertical, 10)
|
||||
.padding(.vertical, 16)
|
||||
.padding(.horizontal, 16)
|
||||
}
|
||||
}
|
||||
|
||||
@ToolbarContentBuilder
|
||||
private var toolbar: some ToolbarContent {
|
||||
if context.viewState.isModallyPresented {
|
||||
ToolbarItem(placement: .cancellationAction) {
|
||||
Button(ElementL10n.actionCancel) {
|
||||
context.send(viewAction: .cancel)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ToolbarItem(placement: .confirmationAction) {
|
||||
Button(ElementL10n.actionSend) {
|
||||
context.send(viewAction: .submit)
|
||||
}
|
||||
.disabled(context.reportText.count < 5)
|
||||
.accessibilityIdentifier("sendButton")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -60,23 +60,10 @@ struct OnboardingViewState: BindableState {
|
||||
}
|
||||
|
||||
init() {
|
||||
// The pun doesn't translate, so we only use it for English.
|
||||
let locale = Locale.current
|
||||
let page4Title = locale.identifier.hasPrefix("en") ? "Cut the slack from teams." : ElementL10n.ftueAuthCarouselWorkplaceTitle
|
||||
|
||||
content = [
|
||||
OnboardingPageContent(title: ElementL10n.ftueAuthCarouselSecureTitle.tinting("."),
|
||||
message: ElementL10n.ftueAuthCarouselSecureBody,
|
||||
image: Asset.Images.onboardingScreenPage1),
|
||||
OnboardingPageContent(title: ElementL10n.ftueAuthCarouselControlTitle.tinting("."),
|
||||
message: ElementL10n.ftueAuthCarouselControlBody,
|
||||
image: Asset.Images.onboardingScreenPage2),
|
||||
OnboardingPageContent(title: ElementL10n.ftueAuthCarouselEncryptedTitle.tinting("."),
|
||||
message: ElementL10n.ftueAuthCarouselEncryptedBody,
|
||||
image: Asset.Images.onboardingScreenPage3),
|
||||
OnboardingPageContent(title: page4Title.tinting("."),
|
||||
message: ElementL10n.ftueAuthCarouselWorkplaceBody(InfoPlistReader.target.bundleDisplayName),
|
||||
image: Asset.Images.onboardingScreenPage4)
|
||||
OnboardingPageContent(title: ElementL10n.ftueAuthCarouselWelcomeTitle.tinting(".", color: .element.accent),
|
||||
message: ElementL10n.ftueAuthCarouselWelcomeBody(InfoPlistReader.target.bundleDisplayName),
|
||||
image: Asset.Images.onboardingAppLogo)
|
||||
]
|
||||
bindings = OnboardingBindings()
|
||||
}
|
||||
|
||||
@@ -0,0 +1,68 @@
|
||||
//
|
||||
// Copyright 2023 New Vector Ltd
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
//
|
||||
|
||||
import DesignKit
|
||||
import SwiftUI
|
||||
|
||||
/// A glossy animated background view designed for the onboarding screen
|
||||
struct OnboardingBackgroundView: View {
|
||||
@Environment(\.colorScheme) private var colorScheme
|
||||
|
||||
@State private var factor = 0.0
|
||||
@State private var isReversed = false
|
||||
|
||||
private let step = 0.001
|
||||
private let timer = Timer.publish(every: 0.01, on: .main, in: .common).autoconnect()
|
||||
|
||||
var body: some View {
|
||||
GeometryReader { geometry in
|
||||
ZStack {
|
||||
Image(asset: Asset.Images.onboardingBackgroundPart1)
|
||||
.position(x: geometry.size.width * 0.125 - factor * geometry.size.width * 0.25, y: (1.0 - factor) * geometry.size.height * 0.55)
|
||||
Image(asset: Asset.Images.onboardingBackgroundPart2)
|
||||
.position(x: geometry.size.width * 1.05, y: factor * geometry.size.height * 0.45)
|
||||
Image(asset: Asset.Images.onboardingBackgroundPart3)
|
||||
.position(x: factor * geometry.size.width, y: geometry.size.height * 1.05 - factor * geometry.size.height * 0.08)
|
||||
}
|
||||
.frame(width: geometry.size.width, height: geometry.size.height)
|
||||
.onReceive(timer) { _ in
|
||||
if isReversed {
|
||||
guard factor > 0 else {
|
||||
isReversed = false
|
||||
factor = step
|
||||
return
|
||||
}
|
||||
|
||||
factor -= step
|
||||
} else {
|
||||
guard factor < 1 else {
|
||||
isReversed = true
|
||||
factor = 1 - step
|
||||
return
|
||||
}
|
||||
|
||||
factor += 0.001
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
struct OnboardingBackgroundView_Previews: PreviewProvider {
|
||||
static var previews: some View {
|
||||
OnboardingBackgroundView()
|
||||
}
|
||||
}
|
||||
@@ -20,27 +20,38 @@ struct OnboardingPageView: View {
|
||||
/// The content that this page should display.
|
||||
let content: OnboardingPageContent
|
||||
|
||||
@Environment(\.verticalSizeClass) private var verticalSizeClass
|
||||
|
||||
var body: some View {
|
||||
VStack {
|
||||
Image(content.image.name)
|
||||
.resizable()
|
||||
.scaledToFit()
|
||||
.frame(maxWidth: 310) // This value is problematic. 300 results in dropped frames
|
||||
// on iPhone 12/13 Mini. 305 the same on iPhone 12/13. As of
|
||||
// iOS 15, 310 seems fine on all supported screen widths 🤞.
|
||||
.padding(20)
|
||||
.accessibilityHidden(true)
|
||||
if verticalSizeClass == .regular {
|
||||
Spacer()
|
||||
|
||||
Image(content.image.name)
|
||||
.resizable()
|
||||
.scaledToFit()
|
||||
.padding(60)
|
||||
.accessibilityHidden(true)
|
||||
}
|
||||
|
||||
Spacer()
|
||||
|
||||
VStack(spacing: 8) {
|
||||
Spacer()
|
||||
|
||||
Text(content.title)
|
||||
.font(.element.title2Bold)
|
||||
.font(.element.title1Bold)
|
||||
.foregroundColor(.element.primaryContent)
|
||||
.multilineTextAlignment(.center)
|
||||
Text(content.message)
|
||||
.font(.element.body)
|
||||
.foregroundColor(.element.secondaryContent)
|
||||
.multilineTextAlignment(.center)
|
||||
}
|
||||
.padding()
|
||||
.fixedSize(horizontal: false, vertical: true)
|
||||
|
||||
Spacer()
|
||||
}
|
||||
.padding(.bottom)
|
||||
.padding(.horizontal, 16)
|
||||
|
||||
@@ -21,7 +21,8 @@ import SwiftUI
|
||||
struct OnboardingScreen: View {
|
||||
@Environment(\.colorScheme) private var colorScheme
|
||||
@Environment(\.layoutDirection) private var layoutDirection
|
||||
|
||||
@Environment(\.verticalSizeClass) private var verticalSizeClass
|
||||
|
||||
private var isLeftToRight: Bool { layoutDirection == .leftToRight }
|
||||
private var pageCount: Int { context.viewState.content.count }
|
||||
|
||||
@@ -33,64 +34,68 @@ struct OnboardingScreen: View {
|
||||
@ObservedObject var context: OnboardingViewModel.Context
|
||||
|
||||
var body: some View {
|
||||
GeometryReader { geometry in
|
||||
VStack(alignment: .leading) {
|
||||
Spacer()
|
||||
.frame(height: UIConstants.spacerHeight(in: geometry))
|
||||
|
||||
// The main content of the carousel
|
||||
HStack(alignment: .top, spacing: 0) {
|
||||
// Add a hidden page at the start of the carousel duplicating the content of the last page
|
||||
OnboardingPageView(content: context.viewState.content[pageCount - 1])
|
||||
.frame(width: geometry.size.width)
|
||||
.accessibilityIdentifier("hiddenPage")
|
||||
|
||||
ForEach(0..<pageCount, id: \.self) { index in
|
||||
OnboardingPageView(content: context.viewState.content[index])
|
||||
ZStack {
|
||||
OnboardingBackgroundView()
|
||||
GeometryReader { geometry in
|
||||
ZStack {
|
||||
VStack(alignment: .leading) {
|
||||
Spacer()
|
||||
.frame(height: UIConstants.spacerHeight(in: geometry))
|
||||
|
||||
// The main content of the carousel
|
||||
HStack(alignment: .top, spacing: 0) {
|
||||
// Add a hidden page at the start of the carousel duplicating the content of the last page
|
||||
OnboardingPageView(content: context.viewState.content[pageCount - 1])
|
||||
.frame(width: geometry.size.width)
|
||||
.accessibilityIdentifier("hiddenPage")
|
||||
|
||||
ForEach(0..<pageCount, id: \.self) { index in
|
||||
OnboardingPageView(content: context.viewState.content[index])
|
||||
.frame(width: geometry.size.width)
|
||||
}
|
||||
}
|
||||
.offset(x: pageOffset(in: geometry))
|
||||
|
||||
Spacer()
|
||||
|
||||
if pageCount > 1 {
|
||||
OnboardingPageIndicator(pageCount: pageCount, pageIndex: context.pageIndex)
|
||||
.frame(width: geometry.size.width)
|
||||
.padding(.bottom)
|
||||
}
|
||||
|
||||
buttons
|
||||
.frame(width: geometry.size.width)
|
||||
.padding(.bottom, UIConstants.actionButtonBottomPadding)
|
||||
.padding(.bottom, geometry.safeAreaInsets.bottom > 0 ? 0 : 16)
|
||||
|
||||
Spacer()
|
||||
.frame(height: UIConstants.spacerHeight(in: geometry))
|
||||
}
|
||||
.frame(maxHeight: .infinity)
|
||||
.gesture(
|
||||
DragGesture()
|
||||
.onChanged(handleDragGestureChange)
|
||||
.onEnded { handleDragGestureEnded($0, viewSize: geometry.size) }
|
||||
)
|
||||
}
|
||||
.offset(x: pageOffset(in: geometry))
|
||||
|
||||
Spacer()
|
||||
|
||||
OnboardingPageIndicator(pageCount: pageCount, pageIndex: context.pageIndex)
|
||||
.frame(width: geometry.size.width)
|
||||
.padding(.bottom)
|
||||
|
||||
Spacer()
|
||||
|
||||
buttons
|
||||
.frame(width: geometry.size.width)
|
||||
.padding(.bottom, UIConstants.actionButtonBottomPadding)
|
||||
.padding(.bottom, geometry.safeAreaInsets.bottom > 0 ? 0 : 16)
|
||||
|
||||
Spacer()
|
||||
.frame(height: UIConstants.spacerHeight(in: geometry))
|
||||
}
|
||||
.frame(maxHeight: .infinity)
|
||||
.background(background.ignoresSafeArea().offset(x: pageOffset(in: geometry)))
|
||||
.gesture(
|
||||
DragGesture()
|
||||
.onChanged(handleDragGestureChange)
|
||||
.onEnded { handleDragGestureEnded($0, viewSize: geometry.size) }
|
||||
)
|
||||
.navigationBarHidden(true)
|
||||
.onAppear(perform: startTimer)
|
||||
.onDisappear(perform: stopTimer)
|
||||
}
|
||||
.navigationBarHidden(true)
|
||||
.onAppear(perform: startTimer)
|
||||
.onDisappear(perform: stopTimer)
|
||||
}
|
||||
|
||||
/// The main action buttons.
|
||||
var buttons: some View {
|
||||
VStack(spacing: 12) {
|
||||
Button { context.send(viewAction: .login) } label: {
|
||||
Text(ElementL10n.loginSplashSubmit)
|
||||
Text(ElementL10n.loginContinue)
|
||||
}
|
||||
.buttonStyle(.elementAction(.xLarge))
|
||||
.accessibilityIdentifier("getStartedButton")
|
||||
}
|
||||
.padding(.horizontal, 16)
|
||||
.padding(.horizontal, verticalSizeClass == .compact ? 128 : 24)
|
||||
.readableFrame()
|
||||
}
|
||||
|
||||
@@ -111,7 +116,7 @@ struct OnboardingScreen: View {
|
||||
|
||||
/// Starts the animation timer for an automatic carousel effect.
|
||||
private func startTimer() {
|
||||
guard pageTimer == nil else { return }
|
||||
guard pageTimer == nil, pageCount > 1 else { return }
|
||||
|
||||
pageTimer = Timer.scheduledTimer(withTimeInterval: 5, repeats: true) { _ in
|
||||
if context.pageIndex == pageCount - 1 {
|
||||
|
||||
@@ -30,6 +30,7 @@ enum RoomDetailsViewModelAction {
|
||||
|
||||
struct RoomDetailsViewState: BindableState {
|
||||
let roomId: String
|
||||
let canonicalAlias: String?
|
||||
let isEncrypted: Bool
|
||||
let isDirect: Bool
|
||||
var title = ""
|
||||
@@ -56,6 +57,8 @@ enum RoomDetailsErrorType: Hashable {
|
||||
|
||||
enum RoomDetailsViewAction {
|
||||
case processTapPeople
|
||||
case copyRoomLink
|
||||
case inviteToRoom
|
||||
}
|
||||
|
||||
struct RoomDetailsMember: Identifiable, Equatable {
|
||||
|
||||
@@ -27,8 +27,10 @@ class RoomDetailsViewModel: RoomDetailsViewModelType, RoomDetailsViewModelProtoc
|
||||
|
||||
var callback: ((RoomDetailsViewModelAction) -> Void)?
|
||||
|
||||
init(roomProxy: RoomProxyProtocol, mediaProvider: MediaProviderProtocol) {
|
||||
init(roomProxy: RoomProxyProtocol,
|
||||
mediaProvider: MediaProviderProtocol) {
|
||||
super.init(initialViewState: .init(roomId: roomProxy.id,
|
||||
canonicalAlias: roomProxy.canonicalAlias,
|
||||
isEncrypted: roomProxy.isEncrypted,
|
||||
isDirect: roomProxy.isDirect,
|
||||
title: roomProxy.displayName ?? roomProxy.name ?? "Unknown Room",
|
||||
@@ -37,7 +39,7 @@ class RoomDetailsViewModel: RoomDetailsViewModelType, RoomDetailsViewModelProtoc
|
||||
members: [],
|
||||
bindings: .init()),
|
||||
imageProvider: mediaProvider)
|
||||
|
||||
|
||||
Task {
|
||||
switch await roomProxy.members() {
|
||||
case .success(let members):
|
||||
@@ -55,6 +57,21 @@ class RoomDetailsViewModel: RoomDetailsViewModelType, RoomDetailsViewModelProtoc
|
||||
switch viewAction {
|
||||
case .processTapPeople:
|
||||
callback?(.requestMemberDetailsPresentation(members))
|
||||
case .copyRoomLink:
|
||||
copyRoomLink()
|
||||
case .inviteToRoom:
|
||||
inviteToRoom()
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: - Private
|
||||
|
||||
private func copyRoomLink() {
|
||||
// TODO: to be implemented
|
||||
// ServiceLocator.shared.userNotificationController.submitNotification(UserNotification(title: ElementL10n.linkCopiedToClipboard))
|
||||
}
|
||||
|
||||
private func inviteToRoom() {
|
||||
// TODO: to be implemented
|
||||
}
|
||||
}
|
||||
|
||||
@@ -37,96 +37,121 @@ struct RoomDetailsScreen: View {
|
||||
}
|
||||
}
|
||||
.alert(item: $context.alertInfo) { $0.alert }
|
||||
.navigationTitle(ElementL10n.roomDetailsTitle)
|
||||
}
|
||||
|
||||
// MARK: - Private
|
||||
|
||||
private var headerSection: some View {
|
||||
VStack(spacing: 16.0) {
|
||||
VStack(spacing: 8.0) {
|
||||
LoadableAvatarImage(url: context.viewState.avatarURL,
|
||||
name: context.viewState.title,
|
||||
contentID: context.viewState.roomId,
|
||||
avatarSize: .room(on: .details),
|
||||
imageProvider: context.imageProvider)
|
||||
.accessibilityIdentifier("roomAvatarImage")
|
||||
|
||||
|
||||
Text(context.viewState.title)
|
||||
.foregroundColor(.element.primaryContent)
|
||||
.font(.element.headline)
|
||||
.font(.element.title1Bold)
|
||||
.multilineTextAlignment(.center)
|
||||
|
||||
if let canonicalAlias = context.viewState.canonicalAlias {
|
||||
Text(canonicalAlias)
|
||||
.foregroundColor(.element.secondaryContent)
|
||||
.font(.element.body)
|
||||
.multilineTextAlignment(.center)
|
||||
}
|
||||
|
||||
// TODO: uncomment this code to display copy link and invite buttons
|
||||
// HStack(spacing: 32) {
|
||||
// SettingsActionButton(title: ElementL10n.roomDetailsCopyLink, image: Image(systemName: "link")) {
|
||||
// context.send(viewAction: .copyRoomLink)
|
||||
// }
|
||||
// SettingsActionButton(title: ElementL10n.inviteUsersToRoomActionInvite.capitalized, image: Image(systemName: "square.and.arrow.up")) {
|
||||
// context.send(viewAction: .inviteToRoom)
|
||||
// }
|
||||
// }
|
||||
// .padding(.top, 32)
|
||||
}
|
||||
.frame(maxWidth: .infinity, alignment: .center)
|
||||
.listRowBackground(Color.clear)
|
||||
.padding(.top, 18)
|
||||
.padding(.bottom, 42)
|
||||
}
|
||||
|
||||
|
||||
private func topicSection(with topic: String) -> some View {
|
||||
Section(ElementL10n.roomSettingsTopic) {
|
||||
Text(topic)
|
||||
.foregroundColor(.element.secondaryContent)
|
||||
.font(.element.footnote)
|
||||
}
|
||||
Section(header: Text(ElementL10n.roomSettingsTopic)
|
||||
.formSectionHeader()) {
|
||||
Text(topic)
|
||||
.foregroundColor(.element.secondaryContent)
|
||||
.font(.element.footnote)
|
||||
}
|
||||
}
|
||||
|
||||
private var aboutSection: some View {
|
||||
Section(ElementL10n.roomDetailsAboutSectionTitle) {
|
||||
Button {
|
||||
context.send(viewAction: .processTapPeople)
|
||||
} label: {
|
||||
HStack {
|
||||
Image(systemName: "person")
|
||||
.foregroundColor(.element.systemGray)
|
||||
.padding(4)
|
||||
.background(Color.element.systemGray6)
|
||||
.clipShape(Circle())
|
||||
.frame(width: menuIconSize, height: menuIconSize)
|
||||
Text(ElementL10n.bottomActionPeople)
|
||||
.foregroundColor(.element.primaryContent)
|
||||
.font(.body)
|
||||
Spacer()
|
||||
Section(header: Text(ElementL10n.roomDetailsAboutSectionTitle)
|
||||
.formSectionHeader()) {
|
||||
Button {
|
||||
context.send(viewAction: .processTapPeople)
|
||||
} label: {
|
||||
HStack {
|
||||
Image(systemName: "person")
|
||||
.foregroundColor(.element.secondaryContent)
|
||||
.padding(4)
|
||||
.background(Color.element.system)
|
||||
.clipShape(RoundedCornerShape(radius: 8, corners: .allCorners))
|
||||
.frame(width: menuIconSize, height: menuIconSize)
|
||||
|
||||
if context.viewState.isLoadingMembers {
|
||||
ProgressView()
|
||||
} else {
|
||||
Text(String(context.viewState.members.count))
|
||||
.foregroundColor(.element.secondaryContent)
|
||||
.font(.element.body)
|
||||
Image(systemName: "chevron.forward")
|
||||
.foregroundColor(.element.secondaryContent)
|
||||
Text(ElementL10n.bottomActionPeople)
|
||||
.foregroundColor(.element.primaryContent)
|
||||
.font(.body)
|
||||
|
||||
Spacer()
|
||||
|
||||
if context.viewState.isLoadingMembers {
|
||||
ProgressView()
|
||||
} else {
|
||||
Text(String(context.viewState.members.count))
|
||||
.foregroundColor(.element.secondaryContent)
|
||||
.font(.element.body)
|
||||
Image(systemName: "chevron.forward")
|
||||
.foregroundColor(.element.quaternaryContent)
|
||||
}
|
||||
}
|
||||
}
|
||||
.listRowInsets(listRowInsets)
|
||||
.foregroundColor(.element.primaryContent)
|
||||
.accessibilityIdentifier("peopleButton")
|
||||
.disabled(context.viewState.isLoadingMembers)
|
||||
}
|
||||
.listRowInsets(listRowInsets)
|
||||
.foregroundColor(.element.primaryContent)
|
||||
.accessibilityIdentifier("peopleButton")
|
||||
.disabled(context.viewState.isLoadingMembers)
|
||||
}
|
||||
}
|
||||
|
||||
private var securitySection: some View {
|
||||
Section(ElementL10n.roomProfileSectionSecurity) {
|
||||
HStack(alignment: .center) {
|
||||
Image(systemName: "lock.shield")
|
||||
.foregroundColor(.element.systemGray)
|
||||
.padding(4)
|
||||
.background(Color.element.systemGray6)
|
||||
.clipShape(Circle())
|
||||
.frame(width: menuIconSize, height: menuIconSize)
|
||||
VStack(alignment: .leading) {
|
||||
Text(ElementL10n.encryptionEnabled)
|
||||
.foregroundColor(.element.primaryContent)
|
||||
.font(.element.body)
|
||||
Text(ElementL10n.encryptionEnabledTileDescription)
|
||||
Section(header: Text(ElementL10n.roomProfileSectionSecurity)
|
||||
.formSectionHeader()) {
|
||||
HStack(alignment: .top) {
|
||||
Image(systemName: "lock.shield")
|
||||
.foregroundColor(.element.secondaryContent)
|
||||
.font(.element.footnote)
|
||||
.padding(4)
|
||||
.background(Color.element.system)
|
||||
.clipShape(RoundedCornerShape(radius: 8, corners: .allCorners))
|
||||
.frame(width: menuIconSize, height: menuIconSize)
|
||||
|
||||
VStack(alignment: .leading, spacing: 2) {
|
||||
Text(ElementL10n.encryptionEnabled)
|
||||
.foregroundColor(.element.primaryContent)
|
||||
.font(.element.body)
|
||||
|
||||
Text(ElementL10n.encryptionEnabledTileDescription)
|
||||
.foregroundColor(.element.secondaryContent)
|
||||
.font(.element.footnote)
|
||||
}
|
||||
|
||||
Spacer()
|
||||
|
||||
Image(systemName: "checkmark")
|
||||
.foregroundColor(.element.quaternaryContent)
|
||||
}
|
||||
Spacer()
|
||||
Image(systemName: "checkmark")
|
||||
.foregroundColor(.element.secondaryContent)
|
||||
.padding(.horizontal, -3)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -144,6 +169,7 @@ struct RoomDetails_Previews: PreviewProvider {
|
||||
topic: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",
|
||||
isDirect: false,
|
||||
isEncrypted: true,
|
||||
canonicalAlias: "#alias:domain.com",
|
||||
members: members)
|
||||
let viewModel = RoomDetailsViewModel(roomProxy: roomProxy,
|
||||
mediaProvider: MockMediaProvider())
|
||||
|
||||
@@ -35,7 +35,7 @@ struct RoomMemberDetailsMemberCell: View {
|
||||
.accessibilityHidden(true)
|
||||
|
||||
Text(member.name ?? "")
|
||||
.font(.element.callout.bold())
|
||||
.font(.element.calloutBold)
|
||||
.foregroundColor(.element.primaryContent)
|
||||
.lineLimit(1)
|
||||
|
||||
|
||||
@@ -29,17 +29,18 @@ struct RoomMemberDetailsScreen: View {
|
||||
RoomMemberDetailsMemberCell(member: member, context: context)
|
||||
.id(member.id)
|
||||
}
|
||||
} footer: {
|
||||
} header: {
|
||||
Text(ElementL10n.roomTitleMembers(context.viewState.members.count))
|
||||
.foregroundColor(.element.secondaryContent)
|
||||
.font(.element.footnote)
|
||||
.font(.element.body)
|
||||
.padding(.vertical, 12)
|
||||
}
|
||||
.padding(.horizontal)
|
||||
}
|
||||
}
|
||||
.searchable(text: $context.searchQuery, placement: .navigationBarDrawer(displayMode: .always))
|
||||
.alert(item: $context.alertInfo) { $0.alert }
|
||||
.navigationTitle(ElementL10n.listMembers)
|
||||
.navigationTitle(ElementL10n.bottomActionPeople)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -31,15 +31,18 @@ struct SettingsScreen: View {
|
||||
Form {
|
||||
userSection
|
||||
.listRowBackground(rowBackgroundColor)
|
||||
|
||||
analyticsSection
|
||||
|
||||
simplifiedSection
|
||||
.listRowBackground(rowBackgroundColor)
|
||||
|
||||
userInterfaceSection
|
||||
.listRowBackground(rowBackgroundColor)
|
||||
// analyticsSection
|
||||
// .listRowBackground(rowBackgroundColor)
|
||||
|
||||
logoutSection
|
||||
.listRowBackground(rowBackgroundColor)
|
||||
// userInterfaceSection
|
||||
// .listRowBackground(rowBackgroundColor)
|
||||
|
||||
// logoutSection
|
||||
// .listRowBackground(rowBackgroundColor)
|
||||
}
|
||||
.introspectTableView { tableView in
|
||||
tableView.backgroundColor = .clear
|
||||
@@ -59,7 +62,7 @@ struct SettingsScreen: View {
|
||||
}
|
||||
|
||||
private var backgroundColor: Color {
|
||||
.element.systemGray6
|
||||
.element.system
|
||||
}
|
||||
|
||||
private var rowBackgroundColor: Color {
|
||||
@@ -78,14 +81,40 @@ struct SettingsScreen: View {
|
||||
VStack(alignment: .leading, spacing: 4) {
|
||||
Text(context.viewState.userDisplayName ?? "")
|
||||
.font(.title3)
|
||||
.foregroundColor(.element.primaryContent)
|
||||
Text(context.viewState.userID)
|
||||
.font(.subheadline)
|
||||
.foregroundColor(.element.primaryContent)
|
||||
}
|
||||
}
|
||||
.listRowInsets(listRowInsets)
|
||||
}
|
||||
}
|
||||
|
||||
private var simplifiedSection: some View {
|
||||
Section {
|
||||
SettingsDefaultRow(title: ElementL10n.sendBugReport,
|
||||
image: Image(systemName: "questionmark.circle")) {
|
||||
context.send(viewAction: .reportBug)
|
||||
}
|
||||
.accessibilityIdentifier("reportBugButton")
|
||||
|
||||
SettingsDefaultRow(title: ElementL10n.actionSignOut,
|
||||
image: Image(systemName: "rectangle.portrait.and.arrow.right")) {
|
||||
showingLogoutConfirmation = true
|
||||
}
|
||||
.accessibilityIdentifier("logoutButton")
|
||||
.alert(ElementL10n.actionSignOut,
|
||||
isPresented: $showingLogoutConfirmation) {
|
||||
Button(ElementL10n.actionSignOut,
|
||||
role: .destructive,
|
||||
action: logout)
|
||||
} message: {
|
||||
Text(ElementL10n.actionSignOutConfirmationSimple)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private var analyticsSection: some View {
|
||||
Section {
|
||||
Button { context.send(viewAction: .reportBug) } label: {
|
||||
@@ -157,13 +186,8 @@ struct SettingsScreen: View {
|
||||
}
|
||||
|
||||
private var closeButton: some View {
|
||||
Button(action: close) {
|
||||
Image(systemName: "xmark")
|
||||
.font(.title3.bold())
|
||||
.foregroundColor(.element.secondaryContent)
|
||||
.padding(4)
|
||||
}
|
||||
.accessibilityIdentifier("closeButton")
|
||||
Button(ElementL10n.actionCancel, action: close)
|
||||
.accessibilityIdentifier("closeButton")
|
||||
}
|
||||
|
||||
private func close() {
|
||||
|
||||
@@ -274,6 +274,7 @@ class MockScreen: Identifiable {
|
||||
return navigationSplitCoordinator
|
||||
case .roomDetailsScreen:
|
||||
let navigationStackCoordinator = NavigationStackCoordinator()
|
||||
let userNotificationController = UserNotificationController(rootCoordinator: navigationStackCoordinator)
|
||||
let coordinator = RoomDetailsCoordinator(parameters: .init(navigationStackCoordinator: navigationStackCoordinator,
|
||||
roomProxy: MockRoomProxy(displayName: "Room",
|
||||
isEncrypted: true,
|
||||
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:5b105c62728e09e2f2f165a4118ba729e4f08418f8877006283858728f4756a4
|
||||
size 83749
|
||||
@@ -0,0 +1,3 @@
|
||||
version https://git-lfs.github.com/spec/v1
|
||||
oid sha256:f90c6bffc82433386a6235526fbb4fa67eee20f36ac682937add9d8ea7695d59
|
||||
size 81733
|
||||
@@ -29,15 +29,6 @@ class BugReportViewModelTests: XCTestCase {
|
||||
XCTAssertTrue(context.sendingLogsEnabled)
|
||||
}
|
||||
|
||||
func testToggleSendingLogs() async throws {
|
||||
let viewModel = BugReportViewModel(bugReportService: MockBugReportService(), screenshot: nil, isModallyPresented: false)
|
||||
let context = viewModel.context
|
||||
|
||||
context.send(viewAction: .toggleSendLogs)
|
||||
await Task.yield()
|
||||
XCTAssertFalse(context.sendingLogsEnabled)
|
||||
}
|
||||
|
||||
func testClearScreenshot() async throws {
|
||||
let viewModel = BugReportViewModel(bugReportService: MockBugReportService(), screenshot: UIImage.actions, isModallyPresented: false)
|
||||
let context = viewModel.context
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
Design update for first public TestFlight
|
||||
Reference in New Issue
Block a user