Add SwiftLint rule to enforce stack spacing. (#2080)
Xcode 15 changes the default behaviour and given we're always working from designs, we shouldn't rely on it for our layout.
This commit is contained in:
@@ -49,6 +49,18 @@ nesting:
|
|||||||
warning: 5
|
warning: 5
|
||||||
|
|
||||||
custom_rules:
|
custom_rules:
|
||||||
|
vstack_spacing:
|
||||||
|
regex: "(?-s)VStack((?!spacing:).)*\\s*\\{"
|
||||||
|
match_kinds: identifier
|
||||||
|
message: "Please use explicit spacing in VStacks."
|
||||||
|
severity: warning
|
||||||
|
|
||||||
|
hstack_spacing:
|
||||||
|
regex: "(?-s)HStack((?!spacing:).)*\\s*\\{"
|
||||||
|
match_kinds: identifier
|
||||||
|
message: "Please use explicit spacing in HStacks."
|
||||||
|
severity: warning
|
||||||
|
|
||||||
print_deprecation:
|
print_deprecation:
|
||||||
regex: "\\b(print)\\b"
|
regex: "\\b(print)\\b"
|
||||||
match_kinds: identifier
|
match_kinds: identifier
|
||||||
|
|||||||
@@ -263,7 +263,7 @@
|
|||||||
{
|
{
|
||||||
"identity" : "swiftui-introspect",
|
"identity" : "swiftui-introspect",
|
||||||
"kind" : "remoteSourceControl",
|
"kind" : "remoteSourceControl",
|
||||||
"location" : "https://github.com/siteline/SwiftUI-Introspect.git",
|
"location" : "https://github.com/siteline/SwiftUI-Introspect",
|
||||||
"state" : {
|
"state" : {
|
||||||
"revision" : "b94da693e57eaf79d16464b8b7c90d09cba4e290",
|
"revision" : "b94da693e57eaf79d16464b8b7c90d09cba4e290",
|
||||||
"version" : "0.9.2"
|
"version" : "0.9.2"
|
||||||
|
|||||||
@@ -86,7 +86,7 @@ struct MapLibreStaticMapView<PinAnnotation: View>: View {
|
|||||||
} label: {
|
} label: {
|
||||||
placeholderImage
|
placeholderImage
|
||||||
.overlay {
|
.overlay {
|
||||||
VStack {
|
VStack(spacing: 0) {
|
||||||
Image(systemName: "arrow.clockwise")
|
Image(systemName: "arrow.clockwise")
|
||||||
Text(L10n.actionStaticMapLoad)
|
Text(L10n.actionStaticMapLoad)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -87,7 +87,7 @@ struct ShimmerOverlay_Previews: PreviewProvider, TestablePreview {
|
|||||||
userIndicatorController: ServiceLocator.shared.userIndicatorController)
|
userIndicatorController: ServiceLocator.shared.userIndicatorController)
|
||||||
|
|
||||||
static var previews: some View {
|
static var previews: some View {
|
||||||
VStack {
|
VStack(spacing: 0) {
|
||||||
ForEach(0...8, id: \.self) { _ in
|
ForEach(0...8, id: \.self) { _ in
|
||||||
HomeScreenRoomCell(room: .placeholder(), context: viewModel.context, isSelected: false)
|
HomeScreenRoomCell(room: .placeholder(), context: viewModel.context, isSelected: false)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -97,7 +97,7 @@ struct FormButtonStyle: PrimitiveButtonStyle {
|
|||||||
var accessory: FormRowAccessory?
|
var accessory: FormRowAccessory?
|
||||||
|
|
||||||
func makeBody(configuration: Configuration) -> some View {
|
func makeBody(configuration: Configuration) -> some View {
|
||||||
HStack {
|
HStack(spacing: 8) {
|
||||||
configuration.label
|
configuration.label
|
||||||
.labelStyle(FormRowLabelStyle(role: configuration.role))
|
.labelStyle(FormRowLabelStyle(role: configuration.role))
|
||||||
.foregroundColor(.compound.textPrimary)
|
.foregroundColor(.compound.textPrimary)
|
||||||
@@ -126,7 +126,7 @@ struct FormActionButtonStyle: ButtonStyle {
|
|||||||
let title: String
|
let title: String
|
||||||
|
|
||||||
func makeBody(configuration: Configuration) -> some View {
|
func makeBody(configuration: Configuration) -> some View {
|
||||||
VStack {
|
VStack(spacing: 8) {
|
||||||
configuration.label
|
configuration.label
|
||||||
.buttonStyle(.plain)
|
.buttonStyle(.plain)
|
||||||
.foregroundColor(.compound.textPrimary)
|
.foregroundColor(.compound.textPrimary)
|
||||||
|
|||||||
@@ -61,7 +61,7 @@ struct FormRowLabelStyle: LabelStyle {
|
|||||||
|
|
||||||
struct FormRowLabelStyle_Previews: PreviewProvider, TestablePreview {
|
struct FormRowLabelStyle_Previews: PreviewProvider, TestablePreview {
|
||||||
static var previews: some View {
|
static var previews: some View {
|
||||||
VStack(alignment: .leading) {
|
VStack(alignment: .leading, spacing: 12) {
|
||||||
Label("Person", systemImage: "person")
|
Label("Person", systemImage: "person")
|
||||||
.labelStyle(FormRowLabelStyle())
|
.labelStyle(FormRowLabelStyle())
|
||||||
|
|
||||||
|
|||||||
@@ -50,7 +50,7 @@ struct FullscreenDialog<Content: View, BottomContent: View>: View {
|
|||||||
var standardLayout: some View {
|
var standardLayout: some View {
|
||||||
GeometryReader { geometry in
|
GeometryReader { geometry in
|
||||||
ScrollView {
|
ScrollView {
|
||||||
VStack {
|
VStack(spacing: 0) {
|
||||||
Spacer()
|
Spacer()
|
||||||
.frame(height: UIConstants.spacerHeight(in: geometry))
|
.frame(height: UIConstants.spacerHeight(in: geometry))
|
||||||
|
|
||||||
@@ -62,7 +62,7 @@ struct FullscreenDialog<Content: View, BottomContent: View>: View {
|
|||||||
}
|
}
|
||||||
.scrollBounceBehavior(.basedOnSize)
|
.scrollBounceBehavior(.basedOnSize)
|
||||||
.safeAreaInset(edge: .bottom) {
|
.safeAreaInset(edge: .bottom) {
|
||||||
VStack {
|
VStack(spacing: 0) {
|
||||||
bottomContent()
|
bottomContent()
|
||||||
.readableFrame()
|
.readableFrame()
|
||||||
.padding(.horizontal, horizontalPadding)
|
.padding(.horizontal, horizontalPadding)
|
||||||
@@ -81,7 +81,7 @@ struct FullscreenDialog<Content: View, BottomContent: View>: View {
|
|||||||
var accessibilityLayout: some View {
|
var accessibilityLayout: some View {
|
||||||
GeometryReader { geometry in
|
GeometryReader { geometry in
|
||||||
ScrollView {
|
ScrollView {
|
||||||
VStack {
|
VStack(spacing: 0) {
|
||||||
Spacer()
|
Spacer()
|
||||||
.frame(height: UIConstants.spacerHeight(in: geometry))
|
.frame(height: UIConstants.spacerHeight(in: geometry))
|
||||||
|
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ struct UserIndicatorModalView: View {
|
|||||||
ProgressView(value: progressFraction)
|
ProgressView(value: progressFraction)
|
||||||
}
|
}
|
||||||
|
|
||||||
HStack {
|
HStack(spacing: 8) {
|
||||||
if let iconName = indicator.iconName {
|
if let iconName = indicator.iconName {
|
||||||
Image(systemName: iconName)
|
Image(systemName: iconName)
|
||||||
.font(.compound.bodyLG)
|
.font(.compound.bodyLG)
|
||||||
|
|||||||
@@ -124,7 +124,7 @@ private struct WaveformShape: Shape {
|
|||||||
struct EstimatedWaveformView_Previews: PreviewProvider, TestablePreview {
|
struct EstimatedWaveformView_Previews: PreviewProvider, TestablePreview {
|
||||||
static var previews: some View {
|
static var previews: some View {
|
||||||
// Wrap the WaveformView in a VStack otherwise the preview test will fail (because of Prefire / GeometryReader)
|
// Wrap the WaveformView in a VStack otherwise the preview test will fail (because of Prefire / GeometryReader)
|
||||||
VStack {
|
VStack(spacing: 0) {
|
||||||
EstimatedWaveformView(waveform: EstimatedWaveform.mockWaveform, progress: 0.5)
|
EstimatedWaveformView(waveform: EstimatedWaveform.mockWaveform, progress: 0.5)
|
||||||
.frame(width: 140, height: 50)
|
.frame(width: 140, height: 50)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -110,12 +110,12 @@ extension VoiceMessageButton.State {
|
|||||||
|
|
||||||
struct VoiceMessageButton_Previews: PreviewProvider, TestablePreview {
|
struct VoiceMessageButton_Previews: PreviewProvider, TestablePreview {
|
||||||
static var previews: some View {
|
static var previews: some View {
|
||||||
VStack {
|
VStack(spacing: 8) {
|
||||||
HStack {
|
HStack(spacing: 8) {
|
||||||
VoiceMessageButton(state: .paused, size: .small, action: { })
|
VoiceMessageButton(state: .paused, size: .small, action: { })
|
||||||
VoiceMessageButton(state: .paused, size: .medium, action: { })
|
VoiceMessageButton(state: .paused, size: .medium, action: { })
|
||||||
}
|
}
|
||||||
HStack {
|
HStack(spacing: 8) {
|
||||||
VoiceMessageButton(state: .playing, size: .small, action: { })
|
VoiceMessageButton(state: .playing, size: .small, action: { })
|
||||||
VoiceMessageButton(state: .playing, size: .medium, action: { })
|
VoiceMessageButton(state: .playing, size: .medium, action: { })
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -102,7 +102,7 @@ private struct PINDigitField: View {
|
|||||||
|
|
||||||
struct PINTextField_Previews: PreviewProvider, TestablePreview {
|
struct PINTextField_Previews: PreviewProvider, TestablePreview {
|
||||||
static var previews: some View {
|
static var previews: some View {
|
||||||
VStack {
|
VStack(spacing: 8) {
|
||||||
PreviewWrapper(pinCode: "", isSecure: false)
|
PreviewWrapper(pinCode: "", isSecure: false)
|
||||||
PreviewWrapper(pinCode: "12", isSecure: false)
|
PreviewWrapper(pinCode: "12", isSecure: false)
|
||||||
PreviewWrapper(pinCode: "1234", isSecure: false)
|
PreviewWrapper(pinCode: "1234", isSecure: false)
|
||||||
|
|||||||
@@ -123,12 +123,12 @@ struct CompletionSuggestion_Previews: PreviewProvider, TestablePreview {
|
|||||||
|
|
||||||
static var previews: some View {
|
static var previews: some View {
|
||||||
// Putting them is VStack allows the preview to work properly in tests
|
// Putting them is VStack allows the preview to work properly in tests
|
||||||
VStack {
|
VStack(spacing: 8) {
|
||||||
CompletionSuggestionView(imageProvider: MockMediaProvider(),
|
CompletionSuggestionView(imageProvider: MockMediaProvider(),
|
||||||
items: [.user(item: MentionSuggestionItem(id: "@user_mention_1:matrix.org", displayName: "User 1", avatarURL: nil)),
|
items: [.user(item: MentionSuggestionItem(id: "@user_mention_1:matrix.org", displayName: "User 1", avatarURL: nil)),
|
||||||
.user(item: MentionSuggestionItem(id: "@user_mention_2:matrix.org", displayName: "User 2", avatarURL: URL.documentsDirectory))]) { _ in }
|
.user(item: MentionSuggestionItem(id: "@user_mention_2:matrix.org", displayName: "User 2", avatarURL: URL.documentsDirectory))]) { _ in }
|
||||||
}
|
}
|
||||||
VStack {
|
VStack(spacing: 8) {
|
||||||
CompletionSuggestionView(imageProvider: MockMediaProvider(),
|
CompletionSuggestionView(imageProvider: MockMediaProvider(),
|
||||||
items: multipleItems) { _ in }
|
items: multipleItems) { _ in }
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -299,7 +299,7 @@ struct ComposerToolbar_Previews: PreviewProvider, TestablePreview {
|
|||||||
ComposerToolbar.mock(focused: true)
|
ComposerToolbar.mock(focused: true)
|
||||||
|
|
||||||
// Putting them is VStack allows the completion suggestion preview to work properly in tests
|
// Putting them is VStack allows the completion suggestion preview to work properly in tests
|
||||||
VStack {
|
VStack(spacing: 8) {
|
||||||
// The mock functon can't be used in this context because it does not hold a reference to the view model, losing the combine subscriptions
|
// The mock functon can't be used in this context because it does not hold a reference to the view model, losing the combine subscriptions
|
||||||
ComposerToolbar(context: composerViewModel.context,
|
ComposerToolbar(context: composerViewModel.context,
|
||||||
wysiwygViewModel: wysiwygViewModel,
|
wysiwygViewModel: wysiwygViewModel,
|
||||||
@@ -307,7 +307,7 @@ struct ComposerToolbar_Previews: PreviewProvider, TestablePreview {
|
|||||||
}
|
}
|
||||||
.previewDisplayName("With Suggestions")
|
.previewDisplayName("With Suggestions")
|
||||||
|
|
||||||
VStack {
|
VStack(spacing: 8) {
|
||||||
ComposerToolbar.textWithVoiceMessage(focused: false)
|
ComposerToolbar.textWithVoiceMessage(focused: false)
|
||||||
ComposerToolbar.textWithVoiceMessage(focused: true)
|
ComposerToolbar.textWithVoiceMessage(focused: true)
|
||||||
ComposerToolbar.voiceMessageRecordingMock(recording: true)
|
ComposerToolbar.voiceMessageRecordingMock(recording: true)
|
||||||
|
|||||||
@@ -154,7 +154,7 @@ private struct MessageComposerEditHeader: View {
|
|||||||
let action: () -> Void
|
let action: () -> Void
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
HStack(alignment: .center) {
|
HStack(alignment: .center, spacing: 8) {
|
||||||
Label(L10n.commonEditing,
|
Label(L10n.commonEditing,
|
||||||
iconAsset: Asset.Images.editing,
|
iconAsset: Asset.Images.editing,
|
||||||
iconSize: .xSmall,
|
iconSize: .xSmall,
|
||||||
@@ -227,7 +227,7 @@ struct MessageComposer_Previews: PreviewProvider, TestablePreview {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static var previews: some View {
|
static var previews: some View {
|
||||||
VStack {
|
VStack(spacing: 8) {
|
||||||
messageComposer(sendingDisabled: true)
|
messageComposer(sendingDisabled: true)
|
||||||
|
|
||||||
messageComposer("Some message",
|
messageComposer("Some message",
|
||||||
@@ -240,7 +240,7 @@ struct MessageComposer_Previews: PreviewProvider, TestablePreview {
|
|||||||
.padding(.horizontal)
|
.padding(.horizontal)
|
||||||
|
|
||||||
ScrollView {
|
ScrollView {
|
||||||
VStack {
|
VStack(spacing: 8) {
|
||||||
ForEach(replyTypes, id: \.self) { replyDetails in
|
ForEach(replyTypes, id: \.self) { replyDetails in
|
||||||
messageComposer(mode: .reply(itemID: .random,
|
messageComposer(mode: .reply(itemID: .random,
|
||||||
replyDetails: replyDetails, isThread: false))
|
replyDetails: replyDetails, isThread: false))
|
||||||
@@ -252,7 +252,7 @@ struct MessageComposer_Previews: PreviewProvider, TestablePreview {
|
|||||||
.previewDisplayName("Replying")
|
.previewDisplayName("Replying")
|
||||||
|
|
||||||
ScrollView {
|
ScrollView {
|
||||||
VStack {
|
VStack(spacing: 8) {
|
||||||
ForEach(replyTypes, id: \.self) { replyDetails in
|
ForEach(replyTypes, id: \.self) { replyDetails in
|
||||||
messageComposer(mode: .reply(itemID: .random,
|
messageComposer(mode: .reply(itemID: .random,
|
||||||
replyDetails: replyDetails, isThread: true))
|
replyDetails: replyDetails, isThread: true))
|
||||||
|
|||||||
@@ -41,18 +41,16 @@ struct VoiceMessagePreviewComposer: View {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
HStack {
|
HStack(spacing: 8) {
|
||||||
HStack {
|
VoiceMessageButton(state: .init(playerState.playerButtonPlaybackState),
|
||||||
VoiceMessageButton(state: .init(playerState.playerButtonPlaybackState),
|
size: .small,
|
||||||
size: .small,
|
action: onPlayPause)
|
||||||
action: onPlayPause)
|
Text(timeLabelContent)
|
||||||
Text(timeLabelContent)
|
.lineLimit(1)
|
||||||
.lineLimit(1)
|
.font(.compound.bodySMSemibold)
|
||||||
.font(.compound.bodySMSemibold)
|
.foregroundColor(.compound.textSecondary)
|
||||||
.foregroundColor(.compound.textSecondary)
|
.monospacedDigit()
|
||||||
.monospacedDigit()
|
.fixedSize(horizontal: true, vertical: true)
|
||||||
.fixedSize(horizontal: true, vertical: true)
|
|
||||||
}
|
|
||||||
|
|
||||||
waveformView
|
waveformView
|
||||||
.waveformInteraction(isDragging: $isDragging,
|
.waveformInteraction(isDragging: $isDragging,
|
||||||
@@ -130,9 +128,7 @@ struct VoiceMessagePreviewComposer_Previews: PreviewProvider, TestablePreview {
|
|||||||
static let waveformData: [Float] = Array(repeating: 1.0, count: 1000)
|
static let waveformData: [Float] = Array(repeating: 1.0, count: 1000)
|
||||||
|
|
||||||
static var previews: some View {
|
static var previews: some View {
|
||||||
VStack {
|
VoiceMessagePreviewComposer(playerState: playerState, waveform: .data(waveformData), onPlay: { }, onPause: { }, onSeek: { _ in }, onScrubbing: { _ in })
|
||||||
VoiceMessagePreviewComposer(playerState: playerState, waveform: .data(waveformData), onPlay: { }, onPause: { }, onSeek: { _ in }, onScrubbing: { _ in })
|
.fixedSize(horizontal: false, vertical: true)
|
||||||
.fixedSize(horizontal: false, vertical: true)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -69,7 +69,7 @@ private struct VoiceMessageRecordingButtonStyle: ButtonStyle {
|
|||||||
|
|
||||||
struct VoiceMessageRecordingButton_Previews: PreviewProvider, TestablePreview {
|
struct VoiceMessageRecordingButton_Previews: PreviewProvider, TestablePreview {
|
||||||
static var previews: some View {
|
static var previews: some View {
|
||||||
HStack {
|
HStack(spacing: 8) {
|
||||||
VoiceMessageRecordingButton(mode: .idle)
|
VoiceMessageRecordingButton(mode: .idle)
|
||||||
|
|
||||||
VoiceMessageRecordingButton(mode: .recording)
|
VoiceMessageRecordingButton(mode: .recording)
|
||||||
|
|||||||
@@ -45,9 +45,7 @@ struct VoiceMessageRecordingComposer_Previews: PreviewProvider, TestablePreview
|
|||||||
static let recorderState = AudioRecorderState()
|
static let recorderState = AudioRecorderState()
|
||||||
|
|
||||||
static var previews: some View {
|
static var previews: some View {
|
||||||
VStack {
|
VoiceMessageRecordingComposer(recorderState: recorderState)
|
||||||
VoiceMessageRecordingComposer(recorderState: recorderState)
|
.fixedSize(horizontal: false, vertical: true)
|
||||||
.fixedSize(horizontal: false, vertical: true)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -42,7 +42,7 @@ struct VoiceMessageRecordingView: View {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
HStack {
|
HStack(spacing: 8) {
|
||||||
VoiceMessageRecordingBadge()
|
VoiceMessageRecordingBadge()
|
||||||
.frame(width: recordingIndicatorSize, height: recordingIndicatorSize)
|
.frame(width: recordingIndicatorSize, height: recordingIndicatorSize)
|
||||||
|
|
||||||
|
|||||||
@@ -137,7 +137,7 @@ private struct CreatePollOptionView: View {
|
|||||||
let deleteAction: () -> Void
|
let deleteAction: () -> Void
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
HStack {
|
HStack(spacing: 8) {
|
||||||
if editMode?.wrappedValue == .active {
|
if editMode?.wrappedValue == .active {
|
||||||
Button(role: .destructive, action: deleteAction) {
|
Button(role: .destructive, action: deleteAction) {
|
||||||
CompoundIcon(\.delete)
|
CompoundIcon(\.delete)
|
||||||
|
|||||||
@@ -20,19 +20,15 @@ struct EmojiPickerScreenHeaderView: View {
|
|||||||
let title: String
|
let title: String
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
HStack {
|
Text(title)
|
||||||
Text(title)
|
.font(.compound.bodyMD.bold())
|
||||||
.font(.compound.bodyMD.bold())
|
.foregroundColor(.compound.textPrimary)
|
||||||
.foregroundColor(.compound.textPrimary)
|
.frame(maxWidth: .infinity, alignment: .leading)
|
||||||
.frame(maxWidth: .infinity, alignment: .leading)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
struct EmojiPickerScreenHeaderView_Previews: PreviewProvider, TestablePreview {
|
struct EmojiPickerScreenHeaderView_Previews: PreviewProvider, TestablePreview {
|
||||||
static var previews: some View {
|
static var previews: some View {
|
||||||
Group {
|
EmojiPickerScreenHeaderView(title: "Title")
|
||||||
EmojiPickerScreenHeaderView(title: "Title")
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -103,7 +103,7 @@ struct HomeScreenRoomCell: View {
|
|||||||
|
|
||||||
@ViewBuilder
|
@ViewBuilder
|
||||||
private var footer: some View {
|
private var footer: some View {
|
||||||
HStack(alignment: .firstTextBaseline) {
|
HStack(alignment: .firstTextBaseline, spacing: 0) {
|
||||||
ZStack(alignment: .topLeading) {
|
ZStack(alignment: .topLeading) {
|
||||||
// Hidden text with 2 lines to maintain consistent height, scaling with dynamic text.
|
// Hidden text with 2 lines to maintain consistent height, scaling with dynamic text.
|
||||||
Text(" \n ")
|
Text(" \n ")
|
||||||
|
|||||||
@@ -70,7 +70,7 @@ struct InvitesScreenCell: View {
|
|||||||
@ViewBuilder
|
@ViewBuilder
|
||||||
private var inviterView: some View {
|
private var inviterView: some View {
|
||||||
if let invitedText = attributedInviteText, let name = invite.roomDetails.inviter?.displayName {
|
if let invitedText = attributedInviteText, let name = invite.roomDetails.inviter?.displayName {
|
||||||
HStack(alignment: .firstTextBaseline) {
|
HStack(alignment: .firstTextBaseline, spacing: 8) {
|
||||||
LoadableAvatarImage(url: invite.roomDetails.inviter?.avatarURL,
|
LoadableAvatarImage(url: invite.roomDetails.inviter?.avatarURL,
|
||||||
name: name,
|
name: name,
|
||||||
contentID: name,
|
contentID: name,
|
||||||
@@ -85,7 +85,7 @@ struct InvitesScreenCell: View {
|
|||||||
|
|
||||||
@ViewBuilder
|
@ViewBuilder
|
||||||
private var textualContent: some View {
|
private var textualContent: some View {
|
||||||
VStack(alignment: .leading) {
|
VStack(alignment: .leading, spacing: 0) {
|
||||||
Text(title)
|
Text(title)
|
||||||
.font(.compound.bodyLGSemibold)
|
.font(.compound.bodyLGSemibold)
|
||||||
.foregroundColor(.compound.textPrimary)
|
.foregroundColor(.compound.textPrimary)
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ struct OnboardingScreen: View {
|
|||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
GeometryReader { geometry in
|
GeometryReader { geometry in
|
||||||
VStack(alignment: .leading) {
|
VStack(alignment: .leading, spacing: 0) {
|
||||||
Spacer()
|
Spacer()
|
||||||
.frame(height: UIConstants.spacerHeight(in: geometry))
|
.frame(height: UIConstants.spacerHeight(in: geometry))
|
||||||
|
|
||||||
@@ -36,6 +36,7 @@ struct OnboardingScreen: View {
|
|||||||
.frame(width: geometry.size.width)
|
.frame(width: geometry.size.width)
|
||||||
.padding(.bottom, UIConstants.actionButtonBottomPadding)
|
.padding(.bottom, UIConstants.actionButtonBottomPadding)
|
||||||
.padding(.bottom, geometry.safeAreaInsets.bottom > 0 ? 0 : 16)
|
.padding(.bottom, geometry.safeAreaInsets.bottom > 0 ? 0 : 16)
|
||||||
|
.padding(.top, 8)
|
||||||
|
|
||||||
Spacer()
|
Spacer()
|
||||||
.frame(height: UIConstants.spacerHeight(in: geometry))
|
.frame(height: UIConstants.spacerHeight(in: geometry))
|
||||||
@@ -49,7 +50,7 @@ struct OnboardingScreen: View {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var content: some View {
|
var content: some View {
|
||||||
VStack {
|
VStack(spacing: 0) {
|
||||||
Spacer()
|
Spacer()
|
||||||
|
|
||||||
if verticalSizeClass == .regular {
|
if verticalSizeClass == .regular {
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ struct RoomMembersListScreen: View {
|
|||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
ScrollView {
|
ScrollView {
|
||||||
LazyVStack(alignment: .leading) {
|
LazyVStack(alignment: .leading, spacing: 12) {
|
||||||
membersSection(data: context.viewState.visibleInvitedMembers, sectionTitle: L10n.screenRoomMemberListPendingHeaderTitle)
|
membersSection(data: context.viewState.visibleInvitedMembers, sectionTitle: L10n.screenRoomMemberListPendingHeaderTitle)
|
||||||
membersSection(data: context.viewState.visibleJoinedMembers, sectionTitle: L10n.screenRoomMemberListHeaderTitle(Int(context.viewState.joinedMembersCount)))
|
membersSection(data: context.viewState.visibleJoinedMembers, sectionTitle: L10n.screenRoomMemberListHeaderTitle(Int(context.viewState.joinedMembersCount)))
|
||||||
}
|
}
|
||||||
@@ -54,7 +54,7 @@ struct RoomMembersListScreen: View {
|
|||||||
Text(sectionTitle)
|
Text(sectionTitle)
|
||||||
.foregroundColor(.compound.textSecondary)
|
.foregroundColor(.compound.textSecondary)
|
||||||
.font(.compound.bodyLG)
|
.font(.compound.bodyLG)
|
||||||
.padding(.vertical, 12)
|
.padding(.top, 12)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.padding(.horizontal)
|
.padding(.horizontal)
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ struct RoomMembersListScreenMemberCell: View {
|
|||||||
Button {
|
Button {
|
||||||
context.send(viewAction: .selectMember(id: member.id))
|
context.send(viewAction: .selectMember(id: member.id))
|
||||||
} label: {
|
} label: {
|
||||||
HStack {
|
HStack(spacing: 8) {
|
||||||
LoadableAvatarImage(url: member.avatarURL,
|
LoadableAvatarImage(url: member.avatarURL,
|
||||||
name: member.name ?? "",
|
name: member.name ?? "",
|
||||||
contentID: member.id,
|
contentID: member.id,
|
||||||
@@ -36,26 +36,24 @@ struct RoomMembersListScreenMemberCell: View {
|
|||||||
.font(.compound.bodyMDSemibold)
|
.font(.compound.bodyMDSemibold)
|
||||||
.foregroundColor(.compound.textPrimary)
|
.foregroundColor(.compound.textPrimary)
|
||||||
.lineLimit(1)
|
.lineLimit(1)
|
||||||
|
|
||||||
Spacer()
|
|
||||||
}
|
}
|
||||||
|
.frame(maxWidth: .infinity, alignment: .leading)
|
||||||
.accessibilityElement(children: .combine)
|
.accessibilityElement(children: .combine)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
struct RoomMembersListMemberCell_Previews: PreviewProvider, TestablePreview {
|
struct RoomMembersListMemberCell_Previews: PreviewProvider, TestablePreview {
|
||||||
|
static let members: [RoomMemberProxyMock] = [
|
||||||
|
.mockAlice,
|
||||||
|
.mockBob,
|
||||||
|
.mockCharlie
|
||||||
|
]
|
||||||
|
static let viewModel = RoomMembersListScreenViewModel(roomProxy: RoomProxyMock(with: .init(displayName: "Some room", members: members)),
|
||||||
|
mediaProvider: MockMediaProvider(),
|
||||||
|
userIndicatorController: ServiceLocator.shared.userIndicatorController)
|
||||||
static var previews: some View {
|
static var previews: some View {
|
||||||
let members: [RoomMemberProxyMock] = [
|
VStack(spacing: 12) {
|
||||||
.mockAlice,
|
|
||||||
.mockBob,
|
|
||||||
.mockCharlie
|
|
||||||
]
|
|
||||||
let viewModel = RoomMembersListScreenViewModel(roomProxy: RoomProxyMock(with: .init(displayName: "Some room", members: members)),
|
|
||||||
mediaProvider: MockMediaProvider(),
|
|
||||||
userIndicatorController: ServiceLocator.shared.userIndicatorController)
|
|
||||||
|
|
||||||
return VStack {
|
|
||||||
ForEach(members, id: \.userID) { member in
|
ForEach(members, id: \.userID) { member in
|
||||||
RoomMembersListScreenMemberCell(member: .init(withProxy: member), context: viewModel.context)
|
RoomMembersListScreenMemberCell(member: .init(withProxy: member), context: viewModel.context)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -72,7 +72,7 @@ struct LongPressWithFeedback_Previews: PreviewProvider, TestablePreview {
|
|||||||
var body: some View {
|
var body: some View {
|
||||||
NavigationStack {
|
NavigationStack {
|
||||||
ScrollView {
|
ScrollView {
|
||||||
VStack(alignment: .leading) {
|
VStack(alignment: .leading, spacing: 8) {
|
||||||
mockBubble("This is a message from somebody with a couple of lines of text.")
|
mockBubble("This is a message from somebody with a couple of lines of text.")
|
||||||
.longPressWithFeedback { isPresentingSheet = true }
|
.longPressWithFeedback { isPresentingSheet = true }
|
||||||
|
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ private struct TimelineItemAccessibilityModifier: ViewModifier {
|
|||||||
case let timelineItem as EventBasedTimelineItemProtocol:
|
case let timelineItem as EventBasedTimelineItemProtocol:
|
||||||
content
|
content
|
||||||
.accessibilityRepresentation {
|
.accessibilityRepresentation {
|
||||||
VStack {
|
VStack(spacing: 8) {
|
||||||
Text(timelineItem.sender.displayName ?? timelineItem.sender.id)
|
Text(timelineItem.sender.displayName ?? timelineItem.sender.id)
|
||||||
content
|
content
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -49,7 +49,7 @@ struct TimelineItemBubbledStylerView<Content: View>: View {
|
|||||||
}
|
}
|
||||||
|
|
||||||
VStack(alignment: alignment, spacing: 0) {
|
VStack(alignment: alignment, spacing: 0) {
|
||||||
HStack {
|
HStack(spacing: 0) {
|
||||||
if timelineItem.isOutgoing {
|
if timelineItem.isOutgoing {
|
||||||
Spacer()
|
Spacer()
|
||||||
}
|
}
|
||||||
@@ -520,7 +520,7 @@ struct TimelineItemBubbledStylerView_Previews: PreviewProvider, TestablePreview
|
|||||||
}
|
}
|
||||||
|
|
||||||
static var replies: some View {
|
static var replies: some View {
|
||||||
VStack {
|
VStack(spacing: 0) {
|
||||||
RoomTimelineItemView(viewState: .init(item: TextRoomTimelineItem(id: .init(timelineID: ""),
|
RoomTimelineItemView(viewState: .init(item: TextRoomTimelineItem(id: .init(timelineID: ""),
|
||||||
timestamp: "10:42",
|
timestamp: "10:42",
|
||||||
isOutgoing: true,
|
isOutgoing: true,
|
||||||
|
|||||||
@@ -27,16 +27,12 @@ struct TimelineItemPlainStylerView<Content: View>: View {
|
|||||||
@State private var showItemActionMenu = false
|
@State private var showItemActionMenu = false
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
VStack(alignment: .trailing) {
|
VStack(alignment: .trailing, spacing: 0) {
|
||||||
VStack(alignment: .leading, spacing: 4) {
|
VStack(alignment: .leading, spacing: 4) {
|
||||||
header
|
header
|
||||||
|
|
||||||
VStack(alignment: .leading, spacing: 4) {
|
VStack(alignment: .leading, spacing: 4) {
|
||||||
HStack(alignment: .firstTextBaseline) {
|
contentWithReply
|
||||||
contentWithReply
|
|
||||||
|
|
||||||
Spacer()
|
|
||||||
}
|
|
||||||
supplementaryViews
|
supplementaryViews
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -47,7 +43,7 @@ struct TimelineItemPlainStylerView<Content: View>: View {
|
|||||||
|
|
||||||
@ViewBuilder
|
@ViewBuilder
|
||||||
var contentWithReply: some View {
|
var contentWithReply: some View {
|
||||||
VStack(alignment: .leading) {
|
VStack(alignment: .leading, spacing: 8) {
|
||||||
if let messageTimelineItem = timelineItem as? EventBasedMessageTimelineItemProtocol {
|
if let messageTimelineItem = timelineItem as? EventBasedMessageTimelineItemProtocol {
|
||||||
if messageTimelineItem.isThreaded {
|
if messageTimelineItem.isThreaded {
|
||||||
ThreadDecorator()
|
ThreadDecorator()
|
||||||
@@ -98,8 +94,8 @@ struct TimelineItemPlainStylerView<Content: View>: View {
|
|||||||
@ViewBuilder
|
@ViewBuilder
|
||||||
private var header: some View {
|
private var header: some View {
|
||||||
if shouldShowSenderDetails {
|
if shouldShowSenderDetails {
|
||||||
HStack {
|
HStack(spacing: 8) {
|
||||||
HStack {
|
HStack(spacing: 8) {
|
||||||
TimelineSenderAvatarView(timelineItem: timelineItem)
|
TimelineSenderAvatarView(timelineItem: timelineItem)
|
||||||
Text(timelineItem.sender.displayName ?? timelineItem.sender.id)
|
Text(timelineItem.sender.displayName ?? timelineItem.sender.id)
|
||||||
.font(.subheadline)
|
.font(.subheadline)
|
||||||
@@ -123,7 +119,7 @@ struct TimelineItemPlainStylerView<Content: View>: View {
|
|||||||
|
|
||||||
@ViewBuilder
|
@ViewBuilder
|
||||||
private var supplementaryViews: some View {
|
private var supplementaryViews: some View {
|
||||||
VStack {
|
VStack(spacing: 4) {
|
||||||
if timelineItem.properties.isEdited {
|
if timelineItem.properties.isEdited {
|
||||||
Text(L10n.commonEditedSuffix)
|
Text(L10n.commonEditedSuffix)
|
||||||
.font(.compound.bodySM)
|
.font(.compound.bodySM)
|
||||||
@@ -251,8 +247,9 @@ struct TimelineItemPlainStylerView_Previews: PreviewProvider, TestablePreview {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
.environment(\.timelineStyle, .plain)
|
.environment(\.timelineStyle, .plain)
|
||||||
.previewLayout(.sizeThatFits)
|
|
||||||
.environmentObject(viewModel.context)
|
.environmentObject(viewModel.context)
|
||||||
|
.previewLayout(.sizeThatFits)
|
||||||
|
|
||||||
threads
|
threads
|
||||||
.padding()
|
.padding()
|
||||||
.environment(\.timelineStyle, .plain)
|
.environment(\.timelineStyle, .plain)
|
||||||
|
|||||||
@@ -145,7 +145,7 @@ struct TimelineItemStyler_Previews: PreviewProvider, TestablePreview {
|
|||||||
content: .init(body: "באמת! -- house!"))
|
content: .init(body: "באמת! -- house!"))
|
||||||
|
|
||||||
static var testView: some View {
|
static var testView: some View {
|
||||||
VStack {
|
VStack(spacing: 0) {
|
||||||
TextRoomTimelineView(timelineItem: base)
|
TextRoomTimelineView(timelineItem: base)
|
||||||
TextRoomTimelineView(timelineItem: sentNonLast)
|
TextRoomTimelineView(timelineItem: sentNonLast)
|
||||||
TextRoomTimelineView(timelineItem: sentLast)
|
TextRoomTimelineView(timelineItem: sentLast)
|
||||||
@@ -156,7 +156,7 @@ struct TimelineItemStyler_Previews: PreviewProvider, TestablePreview {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static var languagesTestView: some View {
|
static var languagesTestView: some View {
|
||||||
VStack {
|
VStack(spacing: 0) {
|
||||||
TextRoomTimelineView(timelineItem: ltrString)
|
TextRoomTimelineView(timelineItem: ltrString)
|
||||||
TextRoomTimelineView(timelineItem: rtlString)
|
TextRoomTimelineView(timelineItem: rtlString)
|
||||||
TextRoomTimelineView(timelineItem: ltrStringThatContainsRtl)
|
TextRoomTimelineView(timelineItem: ltrStringThatContainsRtl)
|
||||||
|
|||||||
@@ -67,7 +67,7 @@ struct ReactionsSummaryView: View {
|
|||||||
TabView(selection: $selectedReactionKey) {
|
TabView(selection: $selectedReactionKey) {
|
||||||
ForEach(reactions, id: \.self) { reaction in
|
ForEach(reactions, id: \.self) { reaction in
|
||||||
ScrollView {
|
ScrollView {
|
||||||
VStack(alignment: .leading) {
|
VStack(alignment: .leading, spacing: 8) {
|
||||||
ForEach(reaction.senders, id: \.self) { sender in
|
ForEach(reaction.senders, id: \.self) { sender in
|
||||||
ReactionSummarySenderView(sender: sender, member: members[sender.senderID], imageProvider: imageProvider)
|
ReactionSummarySenderView(sender: sender, member: members[sender.senderID], imageProvider: imageProvider)
|
||||||
.padding(.horizontal, 16)
|
.padding(.horizontal, 16)
|
||||||
@@ -122,15 +122,15 @@ private struct ReactionSummarySenderView: View {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
HStack {
|
HStack(spacing: 8) {
|
||||||
LoadableAvatarImage(url: member?.avatarURL,
|
LoadableAvatarImage(url: member?.avatarURL,
|
||||||
name: displayName,
|
name: displayName,
|
||||||
contentID: sender.senderID,
|
contentID: sender.senderID,
|
||||||
avatarSize: .user(on: .timeline),
|
avatarSize: .user(on: .timeline),
|
||||||
imageProvider: imageProvider)
|
imageProvider: imageProvider)
|
||||||
|
|
||||||
VStack(alignment: .leading) {
|
VStack(alignment: .leading, spacing: 0) {
|
||||||
HStack {
|
HStack(spacing: 8) {
|
||||||
Text(displayName)
|
Text(displayName)
|
||||||
.font(.compound.bodyMDSemibold)
|
.font(.compound.bodyMDSemibold)
|
||||||
.frame(maxWidth: .infinity, alignment: .leading)
|
.frame(maxWidth: .infinity, alignment: .leading)
|
||||||
|
|||||||
@@ -42,7 +42,7 @@ struct TimelineDeliveryStatusView: View {
|
|||||||
|
|
||||||
struct TimelineDeliveryStatusView_Previews: PreviewProvider, TestablePreview {
|
struct TimelineDeliveryStatusView_Previews: PreviewProvider, TestablePreview {
|
||||||
static var previews: some View {
|
static var previews: some View {
|
||||||
VStack {
|
VStack(spacing: 8) {
|
||||||
TimelineDeliveryStatusView(deliveryStatus: .sending)
|
TimelineDeliveryStatusView(deliveryStatus: .sending)
|
||||||
TimelineDeliveryStatusView(deliveryStatus: .sent)
|
TimelineDeliveryStatusView(deliveryStatus: .sent)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -205,7 +205,7 @@ struct TimelineReactionAddMoreButtonLabel: View {
|
|||||||
|
|
||||||
struct TimelineReactionViewPreviewsContainer: View {
|
struct TimelineReactionViewPreviewsContainer: View {
|
||||||
var body: some View {
|
var body: some View {
|
||||||
VStack {
|
VStack(spacing: 8) {
|
||||||
TimelineReactionsView(context: RoomScreenViewModel.mock.context,
|
TimelineReactionsView(context: RoomScreenViewModel.mock.context,
|
||||||
itemID: .init(timelineID: "1"),
|
itemID: .init(timelineID: "1"),
|
||||||
reactions: [AggregatedReaction.mockReactionWithLongText,
|
reactions: [AggregatedReaction.mockReactionWithLongText,
|
||||||
|
|||||||
@@ -92,7 +92,7 @@ struct TimelineReadReceiptsView_Previews: PreviewProvider, TestablePreview {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static var previews: some View {
|
static var previews: some View {
|
||||||
VStack {
|
VStack(spacing: 8) {
|
||||||
TimelineReadReceiptsView(timelineItem: mockTimelineItem(with: singleReceipt))
|
TimelineReadReceiptsView(timelineItem: mockTimelineItem(with: singleReceipt))
|
||||||
.environmentObject(viewModel.context)
|
.environmentObject(viewModel.context)
|
||||||
TimelineReadReceiptsView(timelineItem: mockTimelineItem(with: doubleReceipt))
|
TimelineReadReceiptsView(timelineItem: mockTimelineItem(with: doubleReceipt))
|
||||||
|
|||||||
@@ -119,7 +119,7 @@ struct SwipeRightAction_Previews: PreviewProvider, TestablePreview {
|
|||||||
var body: some View {
|
var body: some View {
|
||||||
NavigationStack {
|
NavigationStack {
|
||||||
ScrollView {
|
ScrollView {
|
||||||
VStack(alignment: .leading) {
|
VStack(alignment: .leading, spacing: 2) {
|
||||||
mockBubble("This is a message from somebody with a couple of lines of text.")
|
mockBubble("This is a message from somebody with a couple of lines of text.")
|
||||||
.swipeRightAction {
|
.swipeRightAction {
|
||||||
Image(systemName: "flame")
|
Image(systemName: "flame")
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ struct AudioRoomTimelineView: View {
|
|||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
TimelineStyler(timelineItem: timelineItem) {
|
TimelineStyler(timelineItem: timelineItem) {
|
||||||
HStack {
|
HStack(spacing: 8) {
|
||||||
Image(systemName: "waveform")
|
Image(systemName: "waveform")
|
||||||
.foregroundColor(.compound.iconPrimary)
|
.foregroundColor(.compound.iconPrimary)
|
||||||
FormattedBodyText(text: timelineItem.content.body)
|
FormattedBodyText(text: timelineItem.content.body)
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ struct CollapsibleRoomTimelineView: View {
|
|||||||
isExpanded.toggle()
|
isExpanded.toggle()
|
||||||
}
|
}
|
||||||
} label: {
|
} label: {
|
||||||
HStack(alignment: .center) {
|
HStack(alignment: .center, spacing: 8) {
|
||||||
Text(L10n.roomTimelineStateChanges(timelineItem.items.count))
|
Text(L10n.roomTimelineStateChanges(timelineItem.items.count))
|
||||||
Text(Image(systemName: "chevron.forward"))
|
Text(Image(systemName: "chevron.forward"))
|
||||||
.rotationEffect(.degrees(isExpanded ? 90 : 0))
|
.rotationEffect(.degrees(isExpanded ? 90 : 0))
|
||||||
|
|||||||
@@ -60,7 +60,7 @@ private struct EncryptedHistoryLabelStyle: LabelStyle {
|
|||||||
|
|
||||||
struct EncryptedHistoryRoomTimelineView_Previews: PreviewProvider, TestablePreview {
|
struct EncryptedHistoryRoomTimelineView_Previews: PreviewProvider, TestablePreview {
|
||||||
static var previews: some View {
|
static var previews: some View {
|
||||||
VStack {
|
VStack(spacing: 8) {
|
||||||
EncryptedHistoryRoomTimelineView(timelineItem: .init(id: .random, isSessionVerified: true))
|
EncryptedHistoryRoomTimelineView(timelineItem: .init(id: .random, isSessionVerified: true))
|
||||||
EncryptedHistoryRoomTimelineView(timelineItem: .init(id: .random, isSessionVerified: false))
|
EncryptedHistoryRoomTimelineView(timelineItem: .init(id: .random, isSessionVerified: false))
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ struct FileRoomTimelineView: View {
|
|||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
TimelineStyler(timelineItem: timelineItem) {
|
TimelineStyler(timelineItem: timelineItem) {
|
||||||
HStack {
|
HStack(spacing: 8) {
|
||||||
Image(systemName: "doc.text.fill")
|
Image(systemName: "doc.text.fill")
|
||||||
.foregroundColor(.compound.iconPrimary)
|
.foregroundColor(.compound.iconPrimary)
|
||||||
FormattedBodyText(text: timelineItem.content.body)
|
FormattedBodyText(text: timelineItem.content.body)
|
||||||
|
|||||||
@@ -87,7 +87,7 @@ struct LocationRoomTimelineView_Previews: PreviewProvider, TestablePreview {
|
|||||||
|
|
||||||
static var previews: some View {
|
static var previews: some View {
|
||||||
ScrollView {
|
ScrollView {
|
||||||
VStack {
|
VStack(spacing: 8) {
|
||||||
states
|
states
|
||||||
.padding(.horizontal)
|
.padding(.horizontal)
|
||||||
}
|
}
|
||||||
@@ -96,7 +96,7 @@ struct LocationRoomTimelineView_Previews: PreviewProvider, TestablePreview {
|
|||||||
.previewDisplayName("Bubbles")
|
.previewDisplayName("Bubbles")
|
||||||
|
|
||||||
ScrollView {
|
ScrollView {
|
||||||
VStack {
|
VStack(spacing: 0) {
|
||||||
states
|
states
|
||||||
.padding(.horizontal)
|
.padding(.horizontal)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ struct PollOptionView: View {
|
|||||||
FormRowAccessory(kind: .multipleSelection(isSelected: pollOption.isSelected))
|
FormRowAccessory(kind: .multipleSelection(isSelected: pollOption.isSelected))
|
||||||
|
|
||||||
VStack(spacing: 10) {
|
VStack(spacing: 10) {
|
||||||
HStack(alignment: .lastTextBaseline) {
|
HStack(alignment: .lastTextBaseline, spacing: 8) {
|
||||||
Text(pollOption.text)
|
Text(pollOption.text)
|
||||||
.font(isFinalWinningOption ? .compound.bodyLGSemibold : .compound.bodyLG)
|
.font(isFinalWinningOption ? .compound.bodyLGSemibold : .compound.bodyLG)
|
||||||
.multilineTextAlignment(.leading)
|
.multilineTextAlignment(.leading)
|
||||||
@@ -82,7 +82,7 @@ private struct PollProgressView: View {
|
|||||||
|
|
||||||
struct PollOptionView_Previews: PreviewProvider, TestablePreview {
|
struct PollOptionView_Previews: PreviewProvider, TestablePreview {
|
||||||
static var previews: some View {
|
static var previews: some View {
|
||||||
VStack {
|
VStack(spacing: 8) {
|
||||||
Group {
|
Group {
|
||||||
PollOptionView(pollOption: .init(id: "1",
|
PollOptionView(pollOption: .init(id: "1",
|
||||||
text: "Italian 🇮🇹",
|
text: "Italian 🇮🇹",
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ struct UnsupportedRoomTimelineView: View {
|
|||||||
var body: some View {
|
var body: some View {
|
||||||
TimelineStyler(timelineItem: timelineItem) {
|
TimelineStyler(timelineItem: timelineItem) {
|
||||||
Label {
|
Label {
|
||||||
VStack(alignment: .leading) {
|
VStack(alignment: .leading, spacing: 0) {
|
||||||
Text("\(timelineItem.body): \(timelineItem.eventType)")
|
Text("\(timelineItem.body): \(timelineItem.eventType)")
|
||||||
.fixedSize(horizontal: false, vertical: true)
|
.fixedSize(horizontal: false, vertical: true)
|
||||||
|
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ struct TimelineItemDebugView: View {
|
|||||||
var body: some View {
|
var body: some View {
|
||||||
NavigationStack {
|
NavigationStack {
|
||||||
ScrollView {
|
ScrollView {
|
||||||
VStack {
|
VStack(spacing: 8) {
|
||||||
TimelineItemInfoDisclosureGroup(title: "Model", text: info.model, isInitiallyExpanded: true)
|
TimelineItemInfoDisclosureGroup(title: "Model", text: info.model, isInitiallyExpanded: true)
|
||||||
|
|
||||||
if let originalJSONInfo = info.originalJSON {
|
if let originalJSONInfo = info.originalJSON {
|
||||||
@@ -83,10 +83,9 @@ struct TimelineItemDebugView: View {
|
|||||||
|
|
||||||
@ViewBuilder
|
@ViewBuilder
|
||||||
var disclosureGroupContent: some View {
|
var disclosureGroupContent: some View {
|
||||||
VStack(alignment: .leading) {
|
VStack(alignment: .leading, spacing: 0) {
|
||||||
Spacer()
|
|
||||||
|
|
||||||
Divider()
|
Divider()
|
||||||
|
.padding(.vertical, 8)
|
||||||
|
|
||||||
Text(text)
|
Text(text)
|
||||||
.font(.compound.bodyXS.monospaced())
|
.font(.compound.bodyXS.monospaced())
|
||||||
|
|||||||
@@ -142,7 +142,7 @@ public struct TimelineItemMenu: View {
|
|||||||
private let feedbackGenerator = UIImpactFeedbackGenerator(style: .heavy)
|
private let feedbackGenerator = UIImpactFeedbackGenerator(style: .heavy)
|
||||||
|
|
||||||
public var body: some View {
|
public var body: some View {
|
||||||
VStack {
|
VStack(spacing: 8) {
|
||||||
header
|
header
|
||||||
.frame(idealWidth: 300.0)
|
.frame(idealWidth: 300.0)
|
||||||
|
|
||||||
@@ -187,7 +187,7 @@ public struct TimelineItemMenu: View {
|
|||||||
|
|
||||||
Spacer(minLength: 8.0)
|
Spacer(minLength: 8.0)
|
||||||
|
|
||||||
VStack(alignment: .leading) {
|
VStack(alignment: .leading, spacing: 0) {
|
||||||
Text(item.sender.displayName ?? item.sender.id)
|
Text(item.sender.displayName ?? item.sender.id)
|
||||||
.font(.compound.bodySMSemibold)
|
.font(.compound.bodySMSemibold)
|
||||||
.foregroundColor(.compound.textPrimary)
|
.foregroundColor(.compound.textPrimary)
|
||||||
@@ -211,7 +211,7 @@ public struct TimelineItemMenu: View {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private var reactionsSection: some View {
|
private var reactionsSection: some View {
|
||||||
HStack(alignment: .center) {
|
HStack(alignment: .center, spacing: 8) {
|
||||||
reactionButton(for: "👍️")
|
reactionButton(for: "👍️")
|
||||||
reactionButton(for: "👎️")
|
reactionButton(for: "👎️")
|
||||||
reactionButton(for: "🔥")
|
reactionButton(for: "🔥")
|
||||||
@@ -286,12 +286,10 @@ struct TimelineItemMenu_Previews: PreviewProvider, TestablePreview {
|
|||||||
static let viewModel = RoomScreenViewModel.mock
|
static let viewModel = RoomScreenViewModel.mock
|
||||||
|
|
||||||
static var previews: some View {
|
static var previews: some View {
|
||||||
VStack {
|
if let item = RoomTimelineItemFixtures.singleMessageChunk.first as? EventBasedTimelineItemProtocol,
|
||||||
if let item = RoomTimelineItemFixtures.singleMessageChunk.first as? EventBasedTimelineItemProtocol,
|
let actions = TimelineItemMenuActions(actions: [.copy, .edit, .reply(isThread: false), .redact], debugActions: [.viewSource]) {
|
||||||
let actions = TimelineItemMenuActions(actions: [.copy, .edit, .reply(isThread: false), .redact], debugActions: [.viewSource]) {
|
TimelineItemMenu(item: item, actions: actions)
|
||||||
TimelineItemMenu(item: item, actions: actions)
|
.environmentObject(viewModel.context)
|
||||||
}
|
|
||||||
}
|
}
|
||||||
.environmentObject(viewModel.context)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -52,7 +52,7 @@ struct SecureBackupKeyBackupScreen: View {
|
|||||||
.font(.compound.bodyMD)
|
.font(.compound.bodyMD)
|
||||||
.multilineTextAlignment(.center)
|
.multilineTextAlignment(.center)
|
||||||
|
|
||||||
VStack(alignment: .leading) {
|
VStack(alignment: .leading, spacing: 10) {
|
||||||
Label {
|
Label {
|
||||||
Text(L10n.screenKeyBackupDisableDescriptionPoint1)
|
Text(L10n.screenKeyBackupDisableDescriptionPoint1)
|
||||||
.foregroundColor(.compound.textSecondary)
|
.foregroundColor(.compound.textSecondary)
|
||||||
|
|||||||
@@ -121,19 +121,19 @@ struct SecureBackupRecoveryKeyScreen: View {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private var generateRecoveryKeySection: some View {
|
private var generateRecoveryKeySection: some View {
|
||||||
VStack(alignment: .leading) {
|
VStack(alignment: .leading, spacing: 8) {
|
||||||
Text(L10n.commonRecoveryKey)
|
Text(L10n.commonRecoveryKey)
|
||||||
.foregroundColor(.compound.textPrimary)
|
.foregroundColor(.compound.textPrimary)
|
||||||
.font(.compound.bodySM)
|
.font(.compound.bodySM)
|
||||||
|
|
||||||
HStack {
|
Group {
|
||||||
if context.viewState.recoveryKey == nil {
|
if context.viewState.recoveryKey == nil {
|
||||||
Button(generateButtonTitle) {
|
Button(generateButtonTitle) {
|
||||||
context.send(viewAction: .generateKey)
|
context.send(viewAction: .generateKey)
|
||||||
}
|
}
|
||||||
.font(.compound.bodyLGSemibold)
|
.font(.compound.bodyLGSemibold)
|
||||||
} else {
|
} else {
|
||||||
HStack(alignment: .top) {
|
HStack(alignment: .top, spacing: 8) {
|
||||||
Text(context.viewState.recoveryKey ?? "")
|
Text(context.viewState.recoveryKey ?? "")
|
||||||
.foregroundColor(.compound.textPrimary)
|
.foregroundColor(.compound.textPrimary)
|
||||||
.font(.compound.bodyLG)
|
.font(.compound.bodyLG)
|
||||||
@@ -155,15 +155,16 @@ struct SecureBackupRecoveryKeyScreen: View {
|
|||||||
.background(Color.compound.bgSubtleSecondaryLevel0)
|
.background(Color.compound.bgSubtleSecondaryLevel0)
|
||||||
.clipShape(RoundedRectangle(cornerRadius: 8))
|
.clipShape(RoundedRectangle(cornerRadius: 8))
|
||||||
|
|
||||||
HStack(alignment: .top) {
|
Label {
|
||||||
if context.viewState.recoveryKey == nil {
|
|
||||||
CompoundIcon(\.infoSolid, size: .small, relativeTo: .compound.bodySM)
|
|
||||||
}
|
|
||||||
|
|
||||||
Text(context.viewState.recoveryKeySubtitle)
|
Text(context.viewState.recoveryKeySubtitle)
|
||||||
.foregroundColor(.compound.textSecondary)
|
.foregroundColor(.compound.textSecondary)
|
||||||
.font(.compound.bodySM)
|
.font(.compound.bodySM)
|
||||||
|
} icon: {
|
||||||
|
if context.viewState.recoveryKey == nil {
|
||||||
|
CompoundIcon(\.infoSolid, size: .small, relativeTo: .compound.bodySM)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
.labelStyle(.custom(spacing: 8, alignment: .top))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -173,7 +174,7 @@ struct SecureBackupRecoveryKeyScreen: View {
|
|||||||
|
|
||||||
@ViewBuilder
|
@ViewBuilder
|
||||||
private var confirmRecoveryKeySection: some View {
|
private var confirmRecoveryKeySection: some View {
|
||||||
VStack(alignment: .leading) {
|
VStack(alignment: .leading, spacing: 8) {
|
||||||
Text(L10n.commonRecoveryKey)
|
Text(L10n.commonRecoveryKey)
|
||||||
.foregroundColor(.compound.textPrimary)
|
.foregroundColor(.compound.textPrimary)
|
||||||
.font(.compound.bodySM)
|
.font(.compound.bodySM)
|
||||||
|
|||||||
@@ -196,7 +196,7 @@ struct SettingsScreen: View {
|
|||||||
})
|
})
|
||||||
.accessibilityIdentifier(A11yIdentifiers.settingsScreen.logout)
|
.accessibilityIdentifier(A11yIdentifiers.settingsScreen.logout)
|
||||||
} footer: {
|
} footer: {
|
||||||
VStack {
|
VStack(spacing: 0) {
|
||||||
versionText
|
versionText
|
||||||
.frame(maxWidth: .infinity)
|
.frame(maxWidth: .infinity)
|
||||||
|
|
||||||
|
|||||||
@@ -41,18 +41,16 @@ struct VoiceMessageRoomPlaybackView: View {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
HStack {
|
HStack(spacing: 8) {
|
||||||
HStack {
|
VoiceMessageButton(state: .init(playerState.playerButtonPlaybackState),
|
||||||
VoiceMessageButton(state: .init(playerState.playerButtonPlaybackState),
|
size: .medium,
|
||||||
size: .medium,
|
action: onPlayPause)
|
||||||
action: onPlayPause)
|
Text(timeLabelContent)
|
||||||
Text(timeLabelContent)
|
.lineLimit(1)
|
||||||
.lineLimit(1)
|
.font(.compound.bodySMSemibold)
|
||||||
.font(.compound.bodySMSemibold)
|
.foregroundColor(.compound.textSecondary)
|
||||||
.foregroundColor(.compound.textSecondary)
|
.monospacedDigit()
|
||||||
.monospacedDigit()
|
.fixedSize(horizontal: true, vertical: true)
|
||||||
.fixedSize(horizontal: true, vertical: true)
|
|
||||||
}
|
|
||||||
|
|
||||||
waveformView
|
waveformView
|
||||||
.waveformInteraction(isDragging: $isDragging,
|
.waveformInteraction(isDragging: $isDragging,
|
||||||
|
|||||||
@@ -58,7 +58,8 @@ class CreatePollScreenUITests: XCTestCase {
|
|||||||
if app.keyboards.count > 0 {
|
if app.keyboards.count > 0 {
|
||||||
app.typeText("\n")
|
app.typeText("\n")
|
||||||
}
|
}
|
||||||
app.swipeUp()
|
app.swipeUp() // Dismisses the keyboard.
|
||||||
|
app.swipeUp() // Ensures that the bottom is shown.
|
||||||
|
|
||||||
XCTAssertFalse(addOption.exists)
|
XCTAssertFalse(addOption.exists)
|
||||||
XCTAssertFalse(createButton.isEnabled)
|
XCTAssertFalse(createButton.isEnabled)
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
version https://git-lfs.github.com/spec/v1
|
||||||
oid sha256:1ad49c2d88bc1984b710b321481828dda71a962dfcf11b90b2da4d7870e9a6b2
|
oid sha256:f9a2f4e712c9119228a204ef66394549921ca96a0ebbfc7a97c66bb9f1e0e1eb
|
||||||
size 106363
|
size 106368
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
version https://git-lfs.github.com/spec/v1
|
||||||
oid sha256:df3999aa71fe868d7cc18ef3c4ff2818d0b8caf06ccfc3a42a097aeca6e9bba4
|
oid sha256:e6f518adb288d2a3647b0bfd198a13c0b52007328e0c46a085a07b03dd3e0600
|
||||||
size 135985
|
size 135987
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
version https://git-lfs.github.com/spec/v1
|
||||||
oid sha256:c68034656284d48359ae1fbf764dbfe910594ecf60b34c42d4d54b47eccf5214
|
oid sha256:04951f0bb428d9c78bef7542f12e3085e2bf00df118d6b5b387f268f9924d501
|
||||||
size 139355
|
size 139353
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
version https://git-lfs.github.com/spec/v1
|
||||||
oid sha256:8c7f944dd4213ea07885e3bf37a055c95151676933a435720fd0dbd1a75158b7
|
oid sha256:317c07478022e58e8268fd80e4e2c95ce12febf63051e2b775868c0ae2e66385
|
||||||
size 111882
|
size 111893
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
version https://git-lfs.github.com/spec/v1
|
||||||
oid sha256:b11231430ff3871f6793dd3bdd1e3a798da92638827d7820a2708bca4af12bb6
|
oid sha256:2ba2969e48e045f7ab7d92201cc4eaf5b40f3773c60a6ffeb1f44d51f6a0c88f
|
||||||
size 143527
|
size 143534
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
version https://git-lfs.github.com/spec/v1
|
||||||
oid sha256:2468008fdb0e9683ca484ad955db1aa40c68aa4662b900cf0a335fd6a4c8195c
|
oid sha256:693324fba55abd71cecbc4719ecb6273a983147754970e9116660fd7a4e8d04f
|
||||||
size 75088
|
size 75112
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
version https://git-lfs.github.com/spec/v1
|
||||||
oid sha256:2a91052dfd8468914be68593b347f27394a669fd1d5ff3b0ae2680d2684322a0
|
oid sha256:80dff2a5ae296b82c40df940962f1781e5057424abcd159efbbfc3219321cc2d
|
||||||
size 65669
|
size 65610
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
version https://git-lfs.github.com/spec/v1
|
||||||
oid sha256:0c9251a4c74b48fcc297552ce9a81813c5c07804a03bc37ae6bb358dd7fe3605
|
oid sha256:e2c94ea984affe3c9889862b8e96a5b4216dcc58acd681236934f5fc93eb455c
|
||||||
size 84654
|
size 85533
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
version https://git-lfs.github.com/spec/v1
|
||||||
oid sha256:96f0498150e63dd13409971f0917952eb2264ea6ee6f83a16e69f9c54ad67f92
|
oid sha256:3973cdec920a7fc208b779c00599828885ea673e1df20ec8076b3ff1df9b2089
|
||||||
size 77336
|
size 77345
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
version https://git-lfs.github.com/spec/v1
|
||||||
oid sha256:6e6f92b34f1fc44ab715f811927c5540411e57e146fec22ef8289401bfddb088
|
oid sha256:1b9249478e9774a710f5f9d24fc60e5a3b587971e1cd580610ccecce79b96f62
|
||||||
size 142521
|
size 142526
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
version https://git-lfs.github.com/spec/v1
|
||||||
oid sha256:f29216a451b9671dc52be888ff8000684ec30878170e5fb590875e6ca29b5739
|
oid sha256:392d7264ceb22146a4a066ccd46a75a37c06789966bc49f23fb2fe0c23358a2b
|
||||||
size 990805
|
size 990811
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
version https://git-lfs.github.com/spec/v1
|
||||||
oid sha256:ffde28c0f042f7cfc608666845fb3fe1cf7c5240597a06a7465279b023034991
|
oid sha256:e5d3eb7e725323854f9b2b6dc6136fd892b72b7a69971f7649972521a8ceea4b
|
||||||
size 130532
|
size 130502
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
version https://git-lfs.github.com/spec/v1
|
||||||
oid sha256:ad2f44e3279c30db46a95cd8b9cd17dfcd65536fd58fd46e0498a374c4a6c457
|
oid sha256:38136f84c412cf930cf0dff2eb04761e7d26966ce551caf3d8c7132f5c253a4d
|
||||||
size 180641
|
size 180587
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
version https://git-lfs.github.com/spec/v1
|
||||||
oid sha256:ba5971570d55aa29cbe25686a29f5442d4e3d3835e8e9be1afec5738426d09ee
|
oid sha256:7d7860efaea8775f9ad533b811a3a106d7cb2269da171da4d7ecd02b21ea2ef6
|
||||||
size 180880
|
size 182360
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
version https://git-lfs.github.com/spec/v1
|
||||||
oid sha256:e947a5a3b6fadba3465f5eaa739da96375545872b0dd363c690ef6f9834ba8e4
|
oid sha256:d2c84fbba28f0df960ec488becfdefdaca862efe9dabcb34b3128f9444ad2f0d
|
||||||
size 140774
|
size 140714
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
version https://git-lfs.github.com/spec/v1
|
||||||
oid sha256:1e0c1164e91b1291249187a4c1c8d5037ca7c57335f63e02ec747da89a49310a
|
oid sha256:4e1303ac678a6ff68a55fd48fe2d16b72cfdcd073bc1dd950cd7a950f9c7acc6
|
||||||
size 191808
|
size 191705
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
version https://git-lfs.github.com/spec/v1
|
||||||
oid sha256:2e8cfdcd28ab441b98be4170dadc88d8d266b946f950969f9abf1a1451059347
|
oid sha256:430d5c21d57cd98206a64997f36f3921d80d164677ba956323ad8b3398c2db69
|
||||||
size 81010
|
size 79543
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
version https://git-lfs.github.com/spec/v1
|
||||||
oid sha256:a7ea0b877736281d7fc9cd1070cc1b579419c0a0b83447c1169e34300d922e80
|
oid sha256:f7f7d618b7bfd6eedf74cadef57dc2b42226b6b6bd72aacc50c973422f8a5eef
|
||||||
size 109987
|
size 66084
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
version https://git-lfs.github.com/spec/v1
|
||||||
oid sha256:3665a5674f0fccfd75002ab9917448b8928a8643af1e5bf33b8dee75d1868b46
|
oid sha256:473c6a4cfdbb4ed0d79f79834adb19504e730732e6f76f69e4709f166fdfdbbc
|
||||||
size 117023
|
size 65840
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
version https://git-lfs.github.com/spec/v1
|
||||||
oid sha256:81f3da0d16d68db3689ac1b60fcf8e7671ad842a01e38fbf4ba5b98c40235419
|
oid sha256:2607c3dd53dd89261459062996c46b6263b1007061c297bf7d3989bf3af72421
|
||||||
size 86455
|
size 86253
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
version https://git-lfs.github.com/spec/v1
|
||||||
oid sha256:c69370f221a490d0e8303b8f1849c30218cec9ced7f41c4e511da3a1e04fb71f
|
oid sha256:bb1969e353f2416eee4f53e0fa324836e057df654f607900356d53f784019dad
|
||||||
size 170945
|
size 170830
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
version https://git-lfs.github.com/spec/v1
|
||||||
oid sha256:50aaed599643e5321ae6c07a91978db06da35a260a983ec138633747b32b14a3
|
oid sha256:3480e47e56d9487354e552fd2dc8236d48781d6f9f8dfed2b7b63c5cbe2a9448
|
||||||
size 1296649
|
size 1296599
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
version https://git-lfs.github.com/spec/v1
|
||||||
oid sha256:4ee0263916f4d46830d5baa235aa60b1e44609a6d453f4f0afbce2c54da75530
|
oid sha256:fffe679e0097334491a297d6c7ca9703a1b499aa1508c3fd22f352079b7174d8
|
||||||
size 120976
|
size 120985
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
version https://git-lfs.github.com/spec/v1
|
||||||
oid sha256:12247e419943cd05d5eeb41049b1b46636074bd12fd50a2bf12c70423cb8f003
|
oid sha256:bad10df588a7066d5dbccf481a975ae95b7bf630a0f4e0820ec1733833b69896
|
||||||
size 150670
|
size 150673
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
version https://git-lfs.github.com/spec/v1
|
||||||
oid sha256:e8ef3cede0644e696dfd11e9f04b46da218798a05c83b575176e00c41e69dd41
|
oid sha256:0896353f486905039ce020e868fc4babaf1dc53dbd165f32659a9a7ce7714238
|
||||||
size 155000
|
size 155008
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
version https://git-lfs.github.com/spec/v1
|
||||||
oid sha256:10638b4d909b868d9184537718542b542474ba0b216463248d03592b66774d0b
|
oid sha256:89617f27dfaf1d42d236471f12ad724752f59efd6cfbf60d201902260aa23b5d
|
||||||
size 126956
|
size 126973
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
version https://git-lfs.github.com/spec/v1
|
||||||
oid sha256:4907c3dab42439a4594ce300d786a64fb7b3941d91358bb57c7bf3dda5211a28
|
oid sha256:af3f69d7d51da95a7ff58903b62dbf2e6683c965713974fe68096f05f0804865
|
||||||
size 158413
|
size 158422
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
version https://git-lfs.github.com/spec/v1
|
||||||
oid sha256:5819befd00b73dd9a6a68617c55cd8b9870c35a3251be2aa344301a89ef82dba
|
oid sha256:19aa6ee4699cf81e7684c871a4178eae3eac2ebc4702c0f1578b913fe06050eb
|
||||||
size 78706
|
size 78734
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
version https://git-lfs.github.com/spec/v1
|
||||||
oid sha256:e0812122c3588a8fdb8a059a06bb49216f56e51d2b4e3f506af34c355faeec42
|
oid sha256:da01891312f103ddc19155239266a453e813f15fedb94e6e592c362281aea340
|
||||||
size 66355
|
size 66297
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
version https://git-lfs.github.com/spec/v1
|
||||||
oid sha256:ef7f543d2adcea2313d123ce142009505ff69a7ed7a01ad4535f49a39f1040fe
|
oid sha256:7908bcf5b4be638ef318f227d9aca6d9abb3386f260bc5653127aa033656da23
|
||||||
size 67860
|
size 67874
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
version https://git-lfs.github.com/spec/v1
|
||||||
oid sha256:7177b048ae02abd281c59023196b1b92b9a117c9331a410271ab6b09b98afbb4
|
oid sha256:d5149a2c62ea4ebdc114eb09dc744e723adfd5c20a7360632448e0703b864f5c
|
||||||
size 81332
|
size 81344
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
version https://git-lfs.github.com/spec/v1
|
||||||
oid sha256:80774cf7193943271488b87e8e4eabc92553b73f2947f59f8de7aaefdacdbec0
|
oid sha256:ea384d546786b66a4eb5dabc696fcc604462b44bfb8e36cb8ead96241178df4b
|
||||||
size 152559
|
size 152061
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
version https://git-lfs.github.com/spec/v1
|
||||||
oid sha256:56b7492971c77758f1fd7fb34a243803c28b02c49d1d5ab05b9410d89e37c33f
|
oid sha256:1e8c2594242d3ea72a46202703f84c0920d41491c36f12c85aeb9d54fd3f9625
|
||||||
size 1013504
|
size 1013586
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
version https://git-lfs.github.com/spec/v1
|
||||||
oid sha256:2ca45d62287196bf84f4c1b2bda5db76f5adb91d6ed38759fbe32ff4e323e14d
|
oid sha256:cd936b28332e1c7e919b5f7d0af0db3dddf39316a6e8f8bbc6d8ccbef41c5f45
|
||||||
size 167170
|
size 167181
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
version https://git-lfs.github.com/spec/v1
|
||||||
oid sha256:51f03a61979619c8900ce0ab03b5921d28a41fceb366472bee74ce1d47aa734d
|
oid sha256:1855fd88b897e115dea4e256efcbe84f6694b1aa87697c77b1a3a531346cf9a2
|
||||||
size 208309
|
size 208043
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
version https://git-lfs.github.com/spec/v1
|
||||||
oid sha256:dc942209d8b4da1463b0bae9d2eb0acff8b921802268f879eb116e37dd65bc34
|
oid sha256:66a0ced41b7608a062d4856336d799f3a72e125abe441510a18a5cd1ac084062
|
||||||
size 196280
|
size 196212
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
version https://git-lfs.github.com/spec/v1
|
||||||
oid sha256:862c6810149dac38a50831e4043cc44222c206c5a455462e96fe6aecb70269ec
|
oid sha256:f3f3e5bbbe39617d7f43095cacd37a496efa37d5098b9c9250c06b0278d36b89
|
||||||
size 171409
|
size 171338
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
version https://git-lfs.github.com/spec/v1
|
||||||
oid sha256:a1128ae7b0fa1ac47467ba4660e2a5be4309b8acfe58ce7ed5a0f94131b858f7
|
oid sha256:2efee82a06efc18f7bf12ccd7e207c87eacb5fee90b328c4896f772e647ebcc4
|
||||||
size 216180
|
size 216354
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
version https://git-lfs.github.com/spec/v1
|
||||||
oid sha256:26f46b89d4d0cb6029fc03eb946002b994278de7383b61f3c0a727297bdc9c76
|
oid sha256:312a05c6dab40d5968b3564321a6b642beed544918714167d7b75ae5e3cf8deb
|
||||||
size 86657
|
size 86572
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
version https://git-lfs.github.com/spec/v1
|
||||||
oid sha256:67ee54da5e3aa5e374736f6ba5a093b6101fa74e29ef2e4e9a3538d2237c650b
|
oid sha256:38702d490aa1e60d487a334c7cea297a92f6d30beb84913ba32bd4eb5e86368c
|
||||||
size 67503
|
size 67409
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
version https://git-lfs.github.com/spec/v1
|
||||||
oid sha256:dfebb031795432613cad7cc935a81f1fa2b1dc28d05e44e22f573e38215b4400
|
oid sha256:d9be0e32a7a2d78d0939ec31c952424ffd9848ec38db66351c46f4c11529aa35
|
||||||
size 113790
|
size 70097
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
version https://git-lfs.github.com/spec/v1
|
||||||
oid sha256:89a6f419c91ef949f9eee7f8a0e1f757b022057379799b4453c0b4f044fa7c72
|
oid sha256:eecd0af14ad40eb14da5ee3dc070bfd4e95dab343fe3e46ac28104612f5e8c2b
|
||||||
size 92751
|
size 92488
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
version https://git-lfs.github.com/spec/v1
|
||||||
oid sha256:70a375a63ca02a6bfbdf45cf5d15224fce9d2432eb5b70942f43a5284329e6d0
|
oid sha256:cae392557a63d6146d08592718d4c88e781b643c25a25014231585a2db6e1c56
|
||||||
size 191661
|
size 183124
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
version https://git-lfs.github.com/spec/v1
|
||||||
oid sha256:8c5aec76f55285117147d626dcb2c0ed7ab25b93af7429d836b9d8f29374761c
|
oid sha256:91b35d6272d23ab9eeeae63aa99fddb5372405290242c20f64058082cb6b244a
|
||||||
size 83856
|
size 83860
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
version https://git-lfs.github.com/spec/v1
|
||||||
oid sha256:6076a608bc77dcd2cdba417db29fecca1529ea06364dcb6c6cd2020dd9b4347e
|
oid sha256:2e396f25c3a5f10594b9cd47fc3f20b00aa2719db55478a026afd3ee842b34ab
|
||||||
size 130039
|
size 130060
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
version https://git-lfs.github.com/spec/v1
|
||||||
oid sha256:a10530690e2b2b934bc6bcf430b928bf25233f0dbd5d8799a4a726ba2c1b65b1
|
oid sha256:638abf8df2c53a5927ffd5eca268edfb70708056dad193021f6443bfbe7d9fe3
|
||||||
size 1291612
|
size 1309326
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
version https://git-lfs.github.com/spec/v1
|
||||||
oid sha256:df418cf07d69d2701642be411b4d097460345a7031b64377e5ac2184258b7239
|
oid sha256:7077f69587c6b118fdec1bdb92f41f1966b521d6e9e953d52d28d62d6e50fc24
|
||||||
size 90689
|
size 90696
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
version https://git-lfs.github.com/spec/v1
|
||||||
oid sha256:36f9b0c00c7d3d0355bffc18b185e9b8711bdf92f5e63aee05157a5152a37339
|
oid sha256:4d2f7d8badf0946cce15be49e3e1b117b10fd0c0ac138f98aaf3028dcd9e0680
|
||||||
size 114753
|
size 113232
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
version https://git-lfs.github.com/spec/v1
|
||||||
oid sha256:cd6de2482b58c350ecf79d63e6a69f166f27d6030aa2a9a90b7dfe05bddc8f05
|
oid sha256:4eb44e0a4d8d893d6d5aeeb5b06cba7f009a124129eef693fbcb0a25f2f888e8
|
||||||
size 120807
|
size 120474
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
version https://git-lfs.github.com/spec/v1
|
||||||
oid sha256:4f6477f640734df32a038ea4f7f42bef16628e8cd5955eeaf0166d6d579e7a03
|
oid sha256:5489e7a1df166e7164a095d8e991ee73c7a8c38210391938f40310b8c7fceb5b
|
||||||
size 114223
|
size 114270
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
version https://git-lfs.github.com/spec/v1
|
version https://git-lfs.github.com/spec/v1
|
||||||
oid sha256:e7fadd640c74b723a16b98696e99a167af973b24d8346454361689edc3aeaa9a
|
oid sha256:6c1a66188d85232900d71246a997fa5ee30565deafaefcc1e814ca728cfb4148
|
||||||
size 114310
|
size 114354
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user