Add more flexible background support to FullscreenDialog (#2675)

Hide the background when the main content extends underneath the bottom content.
This commit is contained in:
Doug
2024-04-10 14:56:41 +01:00
committed by GitHub
parent bcd7e2254c
commit da598302df
61 changed files with 230 additions and 104 deletions
@@ -0,0 +1,15 @@
{
"images" : [
{
"filename" : "join-room-background.svg",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"preserves-vector-representation" : true
}
}
@@ -0,0 +1,9 @@
<svg width="387" height="508" viewBox="0 0 387 508" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M389.733 0.0917094C286.963 -0.463031 188.22 32.824 115.226 92.6301C42.2316 152.436 0.965681 233.862 0.506133 318.995C0.0465862 404.129 40.431 485.995 112.775 546.586C185.12 607.177 283.498 641.528 386.268 642.082L388 321.087L389.733 0.0917094Z" fill="url(#paint0_radial_570_35739)" fill-opacity="0.12"/>
<defs>
<radialGradient id="paint0_radial_570_35739" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(388.002 321.087) rotate(-89.6907) scale(320.689 387.125)">
<stop stop-color="#0DBD8B"/>
<stop offset="1" stop-color="#1273EB" stop-opacity="0"/>
</radialGradient>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 723 B

+1
View File
@@ -38,6 +38,7 @@ internal enum Asset {
internal static let composerAttachment = ImageAsset(name: "images/composer-attachment")
internal static let stopRecording = ImageAsset(name: "images/stop-recording")
internal static let settingsIconWithBadge = ImageAsset(name: "images/settings-icon-with-badge")
internal static let joinRoomBackground = ImageAsset(name: "images/join-room-background")
internal static let launchBackground = ImageAsset(name: "images/launch-background")
internal static let locationMarkerShape = ImageAsset(name: "images/location-marker-shape")
internal static let mediaPause = ImageAsset(name: "images/media-pause")
@@ -25,6 +25,7 @@ import SwiftUI
/// environment value, so make sure to set this to match the screen's background.
struct FullscreenDialog<Content: View, BottomContent: View>: View {
@Environment(\.dynamicTypeSize) private var dynamicTypeSize
@Environment(\.backgroundStyle) private var backgroundStyle
/// Padding applied to the top of the content automatically. Use `UIConstants` for preset values.
var topPadding: CGFloat = UIConstants.titleTopPaddingToNavigationBar
@@ -33,18 +34,41 @@ struct FullscreenDialog<Content: View, BottomContent: View>: View {
/// The spacing between the content and the buttons.
var spacing: CGFloat = 16
var showBackgroundGradient = false
/// The type of background that should be shown behind the content. This
/// will be hidden if the main content extends behind the bottom content.
var background: FullscreenDialogBackground?
/// The main content shown at the top of the layout.
@ViewBuilder var content: () -> Content
/// The content shown at the bottom of the layout.
@ViewBuilder var bottomContent: () -> BottomContent
var body: some View {
if dynamicTypeSize < .accessibility1 {
standardLayout
/// Whether or not the screen should show its background.
@State private var showsBackground = true
/// The background style given to the bottom content.
private var bottomContentBackgroundStyle: AnyShapeStyle? {
if background != nil, showsBackground {
AnyShapeStyle(Color.clear)
} else {
accessibilityLayout
backgroundStyle
}
}
var body: some View {
ZStack {
if let background, showsBackground {
Color.clear
.background(alignment: .bottom) {
background.image
}
.ignoresSafeArea()
}
if dynamicTypeSize < .accessibility1 {
standardLayout
} else {
accessibilityLayout
}
}
}
@@ -64,28 +88,20 @@ struct FullscreenDialog<Content: View, BottomContent: View>: View {
}
.scrollBounceBehavior(.basedOnSize)
.safeAreaInset(edge: .bottom) {
if showBackgroundGradient {
adjustedBottomContent(geometry: geometry)
.background(Asset.Images.backgroundBottom.swiftUIImage.resizable().ignoresSafeArea())
} else {
adjustedBottomContent(geometry: geometry)
.background()
VStack(spacing: 0) {
bottomContent()
.readableFrame()
.padding(.horizontal, horizontalPadding)
.padding(.top, spacing)
.padding(.bottom, UIConstants.actionButtonBottomPadding)
Spacer()
.frame(height: UIConstants.spacerHeight(in: geometry))
}
.background(bottomContentBackgroundStyle ?? AnyShapeStyle(Color.clear))
}
}
}
private func adjustedBottomContent(geometry: GeometryProxy) -> some View {
VStack(spacing: 0) {
bottomContent()
.readableFrame()
.padding(.horizontal, horizontalPadding)
.padding(.top, spacing)
.padding(.bottom, UIConstants.actionButtonBottomPadding)
Spacer()
.frame(height: UIConstants.spacerHeight(in: geometry))
}
.introspect(.scrollView, on: .supportedVersions, customize: updateBackgroundVisibility)
}
/// A continuously scrolling layout used for accessibility font sizes.
@@ -116,6 +132,48 @@ struct FullscreenDialog<Content: View, BottomContent: View>: View {
.scrollBounceBehavior(.basedOnSize)
}
}
func updateBackgroundVisibility(scrollView: UIScrollView) {
guard dynamicTypeSize < .accessibility1 else {
showsBackground = true
return
}
let insetHeight = scrollView.adjustedContentInset.top + scrollView.adjustedContentInset.bottom
let availableHeight = scrollView.frame.height - insetHeight
showsBackground = scrollView.contentSize.height < availableHeight
}
}
/// The different types of background supported by the `FullscreenDialog` view.
enum FullscreenDialogBackground {
/// The bottom gradient from the FTUE flow.
case gradient
/// The subtle bloom from the room discovery and permalink flows.
case bloom
private var asset: ImageAsset {
switch self {
case .gradient:
Asset.Images.backgroundBottom
case .bloom:
Asset.Images.joinRoomBackground
}
}
private var capInsets: EdgeInsets {
switch self {
case .gradient:
EdgeInsets(top: 0, leading: 0, bottom: 250, trailing: 0)
case .bloom:
EdgeInsets() // This one covers the entire screen.
}
}
/// The image that represents the background.
var image: Image {
Image(asset: asset)
.resizable(capInsets: capInsets)
}
}
struct FullscreenDialog_Previews: PreviewProvider, TestablePreview {
@@ -126,7 +184,26 @@ struct FullscreenDialog_Previews: PreviewProvider, TestablePreview {
buttons
}
.background()
.environment(\.backgroundStyle, AnyShapeStyle(Color.compound.bgCanvasDefault))
.backgroundStyle(.compound.bgCanvasDefault)
.previewDisplayName("Plain")
FullscreenDialog(topPadding: UIConstants.iconTopPaddingToNavigationBar, background: .gradient) {
content
} bottomContent: {
buttons
}
.background()
.backgroundStyle(.compound.bgCanvasDefault)
.previewDisplayName("Gradient")
FullscreenDialog(topPadding: UIConstants.iconTopPaddingToNavigationBar, background: .bloom) {
content
} bottomContent: {
buttons
}
.background()
.backgroundStyle(.compound.bgCanvasDefault)
.previewDisplayName("Bloom")
}
private static var content: some View {
@@ -55,7 +55,7 @@ struct AppLockScreen: View {
.font(.compound.bodyMDSemibold)
}
.background()
.environment(\.backgroundStyle, AnyShapeStyle(Color.compound.bgCanvasDefault))
.backgroundStyle(.compound.bgCanvasDefault)
.disabled(context.viewState.forcedLogoutIndicator != nil)
.overlay {
context.viewState.forcedLogoutIndicator.map(UserIndicatorModalView.init)
@@ -26,7 +26,7 @@ struct ServerConfirmationScreen: View {
buttons
}
.background()
.environment(\.backgroundStyle, AnyShapeStyle(Color.compound.bgCanvasDefault))
.backgroundStyle(.compound.bgCanvasDefault)
.introspect(.window, on: .supportedVersions) { window in
context.send(viewAction: .updateWindow(window))
}
@@ -21,13 +21,13 @@ struct AnalyticsPromptScreen: View {
@ObservedObject var context: AnalyticsPromptScreenViewModel.Context
var body: some View {
FullscreenDialog(topPadding: UIConstants.startScreenBreakerScreenTopPadding, showBackgroundGradient: true) {
FullscreenDialog(topPadding: UIConstants.startScreenBreakerScreenTopPadding, background: .gradient) {
mainContent
} bottomContent: {
buttons
}
.background()
.environment(\.backgroundStyle, AnyShapeStyle(Color.compound.bgCanvasDefault))
.backgroundStyle(.compound.bgCanvasDefault)
.navigationBarHidden(true)
.navigationBarBackButtonHidden(true)
.interactiveDismissDisabled()
@@ -35,7 +35,7 @@ struct IdentityConfirmationScreen: View {
actionButtons
}
.background()
.environment(\.backgroundStyle, AnyShapeStyle(Color.compound.bgCanvasDefault))
.backgroundStyle(.compound.bgCanvasDefault)
.navigationBarHidden(true)
.navigationBarBackButtonHidden(true)
.interactiveDismissDisabled()
@@ -27,7 +27,7 @@ struct IdentityConfirmedScreen: View {
actionButtons
}
.background()
.environment(\.backgroundStyle, AnyShapeStyle(Color.compound.bgCanvasDefault))
.backgroundStyle(.compound.bgCanvasDefault)
.navigationBarHidden(true)
.navigationBarBackButtonHidden(true)
.interactiveDismissDisabled()
@@ -21,13 +21,13 @@ struct NotificationPermissionsScreen: View {
@ObservedObject var context: NotificationPermissionsScreenViewModel.Context
var body: some View {
FullscreenDialog(topPadding: UIConstants.startScreenBreakerScreenTopPadding, showBackgroundGradient: true) {
FullscreenDialog(topPadding: UIConstants.startScreenBreakerScreenTopPadding, background: .gradient) {
mainContent
} bottomContent: {
buttons
}
.background()
.environment(\.backgroundStyle, AnyShapeStyle(Color.compound.bgCanvasDefault))
.backgroundStyle(.compound.bgCanvasDefault)
.navigationBarHidden(true)
.navigationBarBackButtonHidden(true)
.interactiveDismissDisabled()
@@ -30,7 +30,7 @@ struct SessionVerificationScreen: View {
actionButtons
}
.background()
.environment(\.backgroundStyle, AnyShapeStyle(Color.compound.bgCanvasDefault))
.backgroundStyle(.compound.bgCanvasDefault)
.interactiveDismissDisabled()
}
@@ -41,7 +41,7 @@ struct PlaceholderScreen: View {
}
}
.background()
.environment(\.backgroundStyle, AnyShapeStyle(Color.compound.bgCanvasDefault))
.backgroundStyle(.compound.bgCanvasDefault)
.ignoresSafeArea(edges: .top) // Remain vertically centred even if there's a navigation bar.
.ignoresSafeArea(.keyboard) // Specifically for the lock screen, but make sense everywhere.
}
@@ -27,7 +27,7 @@ struct QRCodeLoginScreen: View {
.toolbar { toolbar }
.toolbar(.visible, for: .navigationBar)
.background()
.environment(\.backgroundStyle, AnyShapeStyle(Color.compound.bgSubtleSecondary))
.backgroundStyle(.compound.bgSubtleSecondary)
.interactiveDismissDisabled()
}
}
@@ -30,7 +30,7 @@ struct ResetRecoveryKeyScreen: View {
.toolbar { toolbar }
.toolbar(.visible, for: .navigationBar)
.background()
.environment(\.backgroundStyle, AnyShapeStyle(Color.compound.bgSubtleSecondary))
.backgroundStyle(.compound.bgSubtleSecondary)
.interactiveDismissDisabled()
}
}
@@ -33,7 +33,7 @@ struct SecureBackupKeyBackupScreen: View {
.buttonStyle(.compound(.primary))
}
.background()
.environment(\.backgroundStyle, AnyShapeStyle(Color.compound.bgCanvasDefault))
.backgroundStyle(.compound.bgCanvasDefault)
.interactiveDismissDisabled()
.toolbar { toolbar }
.alert(item: $context.alertInfo)
@@ -33,7 +33,7 @@ struct SecureBackupLogoutConfirmationScreen: View {
}
.toolbar { toolbar }
.background()
.environment(\.backgroundStyle, AnyShapeStyle(Color.compound.bgCanvasDefault))
.backgroundStyle(.compound.bgCanvasDefault)
.alert(item: $context.alertInfo)
}
@@ -39,7 +39,7 @@ struct SecureBackupRecoveryKeyScreen: View {
.toolbar { toolbar }
.toolbar(.visible, for: .navigationBar)
.background()
.environment(\.backgroundStyle, AnyShapeStyle(Color.compound.bgCanvasDefault))
.backgroundStyle(.compound.bgCanvasDefault)
.interactiveDismissDisabled()
.alert(item: $context.alertInfo)
}
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:0a46cd7cf5e0e13a6d7c60300a9fcb6311c20bb2bae22778a2783a2f0afc7c0e
size 415851
oid sha256:9d9f4fd014234c687d03c529490fe08e5ba11104f398ca1a571fcd8381abec9f
size 532444
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:f83e16e68a399d2e9db7c69e3fd6fe83a42ebe497b23cb4dde5b6d230d373c4c
size 508866
oid sha256:f09f74d990c3da296b044d967eb825e91ee496a53fae7a8bfa070e1b56b99b0f
size 609180
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:7815860f7b70f4aca237db12ec782a0b39276e5b3e5144cb1535254992a25c57
size 248416
oid sha256:6016d580c905a76047da354f0a8752e87fd0b822bf8365680cec216f19e5e85e
size 329675
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:ef5bc386c26e9f4777531b8e439de9cad04a98d02e25d4f7298192589720b0b9
size 325644
oid sha256:84dbbc0b29b1113d020d287c8f23a99227e270f818921c673d389feb2bc307b8
size 375338
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:86e1421b4be07786d755bd195b59f2175d8694a45a9c575d47cbd600b606a09e
size 135685
oid sha256:74fc0d2d0d9933d5f98a667b41780d01bbb59617695e2543944d1f0c3122d461
size 137574
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:5f7e77738f7863830162825f0eb3b5c12edb20700820c2897aba02608aad391e
size 166823
oid sha256:a96a4e42c4885f64ca9ae5425f9722a4f2ff56b7d24f04c7f2891673a27b8300
size 166347
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:adc608df7c433918afd74184c2dc8fac1325735bd907d78cadd011f62dacd2b4
size 2029382
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:62ddd486d339d84a8d65ff50a5ba584404988f9b501624ae4981a3f8891b3381
size 550131
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:8b99d07d370c72d8504a637b94c0d2d1f8b4b1fdd5cb37e2e434db666533105f
size 2076410
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:0594e7c15aff74d608977d79678e89262dff1ce065075fc5b91b7f8821bdc3df
size 598942
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:4b346bf5b6890198d31fd71d810e40e151805ffba2640a9e11ae19fcecbda544
size 803815
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:abf88f24e35529bdb843deeaeef81675c179142e838112ecfa84bde3e289d34e
size 352164
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:0e9e5802254e8a4fd34b4e229e04ac84bb6bc2f59e621b3f7c34f29099f178aa
size 840535
@@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:15292878c6b446e64ca547dc96e37e827cac88e7fdc1b68a38c74d18987c4f8e
size 385602
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:47d502c8c6fbec6e38497bf9aabe3803f9006145d5c7e9c0997f892405826bc1
size 119605
oid sha256:f3ac13eb903ab6386f788382ea3362e6ef49f0aa065dd672953f1960bad44a27
size 115060
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:86e9a45f6ab26a072edfba0258e275d2f234765ecf0a69f1301aba6108090d07
size 153905
oid sha256:783830e86a68a1aec227f6e16fc865451cdb3407e7b7967a00bf1d3920d8db92
size 146800
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:8dfc9897f5cef15fa16a1e51ec869b6dfd3c05a1376300ffed7440ff4b490d0c
size 120872
oid sha256:6bc0ea81f20ba4f97cc525eabd4e9955f76c948331a1ac404fd42772693131bf
size 117972
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:0dd9ce4a46cff45390876e7dfdbaeecce78c69a40a403f8563544e05e3efc379
size 162211
oid sha256:99d546bca4f5b9778c8944fbf57c9136531ef645b0a3fcbf2b1543d94b4fd20c
size 160769
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:ab736cdeff320ccf70d67b34009536b723ce9abe7348d8f885caf74a17967229
size 389835
oid sha256:f9fd41d407eca80245dbd7d9462131db5305a68206dcd89e9460ea4dc2d4abf9
size 458333
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:3b591ed050b9a913a500c0ef0bb935bd7940dfe631a3486810ab18b5ebbe947c
size 441047
oid sha256:a768fa136c264adeda2a1bf69824f61168c90e62f02ade2d233c868c8fe681d9
size 518529
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:10a1bb28971bb64a6679b6a4cfd08c060f5305e40032768db88ffd24a97dab8c
size 214792
oid sha256:7024f450b746dc43240851b23ef2a8e3946286bf55247bc83b462f3a3da468f8
size 298163
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:95219b6d0cff9700acf62799558ad527ed405cafb4565fbe8c48e8b3210d7b4c
size 254130
oid sha256:ad2c880710176f46fad128730d9a900bdbccf6e2fb016adcfa9c22197433ebd8
size 331878
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:3d8c27b325869c82555047403415f58e28872e76e5f045cd064b2ab3ba243fc1
size 196801
oid sha256:ff25bc3029988cee77b4c1d9becc37ca0a3abd6638d2875f78bb91b63b6bbe1a
size 192109
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:dc127a68581e3163e6f2349bd7e2ffc201ce2fa8fd066187b483ddb33fd67fa0
size 304422
oid sha256:30187fa7afc621ec8a65952abf4bfbe638bfee1c05e16312dee18bda108b505b
size 297626
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:f6d0962c09da93a8abcc499017c24c28555622e3e02d978043b3c7f3874729f2
size 156994
oid sha256:1d37f835ba792370556557e0d930dd4c29483988b1089b7f5a51f2e5df6aa2a2
size 150133
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:df6d9523e1659465f080f56e76db707fbe027803be5f83e0e9b8dc064d1251a8
size 217178
oid sha256:d47b96e1b3e0daef441d6d8e72a5352236ca2179747eb4325e11976e13bcb0ab
size 216771
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:72957ae7c97f9744b9b193a5dcf29186496e61e9c499bf1c3f89b9ebbad59899
size 168810
oid sha256:27d25926a9db7249cda1ae9449f036f15c09f4f9bf9447d85fe5f4930146b4af
size 165867
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:d2d6da8197ab943403b33b3c4703baed7a17640088532f39d0981dcfee731fd4
size 179473
oid sha256:92e854056c64f77f63d527a819906023bd967cbb47f45a8fbd510cfd69119165
size 180737
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:570000708276664f570068aa2d3d37c7653b1b6648ec40225c6506b4ca470738
size 182423
oid sha256:70bf7b57723f70226bb18fd2666f5a4c46b1a196ab1a91179243bb3cf5d4d112
size 177211
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:edb78e9330dad85dbea6b78e5251de463d5256467d156b5c115412f70ffb6e40
size 89995
oid sha256:50d35c393731af81a2ab187a113b5d2c88822d23ca2a593b5994e689eeacf387
size 89850
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:25533cfa9ee0295d1e013299cb86f878f56c19cb1a94b198166fe440bcee5626
size 248296
oid sha256:a045cff484a6ab76f22d51dd511daa1c9ee023554eba0a116df04c63b756e924
size 235455
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:65299eb62433150284141905f7e25362c2ff63efe8b700bb5c4775bd180d4f2b
size 280657
oid sha256:414ec12316ce70d964e7e431cb609b10ac6783f542039f9b130985acf47d57f3
size 272704
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:6692132cf228596dcbcdf91663d7f4e4eebbe573d1bbfc01133572d9c96ee2ac
size 268702
oid sha256:bf1c234fbe0f16d39229fd7cba21a2b954d1f724246f5207885b814d797a16d3
size 258329
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:db402366ea030a33cee42151bb53fe0246552e5c62007db21973e1b2dd65d46b
size 111948
oid sha256:0143e508fca5b5ea461ebec6aff9017942a71a09f6e8214aa1b1c2fd26bc144a
size 106783
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:94a5247597c0ecea03828ce9af2ddce60e8d4ead94b3a5b3c2f7235e82fbdb1e
size 950201
oid sha256:1e5f98176127ced83705e2cf1cc9b7ed6a32ebd3e14ba013e52beea93a218420
size 1252858
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:11cf81ee41b64880234d75a79e9b688af1fe65fe9d07aa6d2b5e4167e233107c
size 1029275
oid sha256:8925356519bc00c59ed882cfb323ccc84b82eebab211220d970e66510b5d7682
size 1326430
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:ad617473bc4b434ef5747bce48b8116fcb856cadf28002aaccb336a2eac6819d
size 898564
oid sha256:755cfdbe182fd8be23ba44fd0f647492d2292804072e664ced66ffbdbb01e190
size 1207910
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:94a5247597c0ecea03828ce9af2ddce60e8d4ead94b3a5b3c2f7235e82fbdb1e
size 950201
oid sha256:1e5f98176127ced83705e2cf1cc9b7ed6a32ebd3e14ba013e52beea93a218420
size 1252858
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:70429603bfa79aa57a3bc454347db2a3f38195da8f80642a52f284cc9cbef61c
size 917802
oid sha256:b47967c28f4fc56014ccc56f66eadce1132d6513c7a9d4e8bb6db1e366aa0e49
size 1226969
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:11cf81ee41b64880234d75a79e9b688af1fe65fe9d07aa6d2b5e4167e233107c
size 1029275
oid sha256:8925356519bc00c59ed882cfb323ccc84b82eebab211220d970e66510b5d7682
size 1326430