From 638a1592f9e3bdb59fa6fcff12e86e741d52dd46 Mon Sep 17 00:00:00 2001 From: Nicolas Frugoni Date: Fri, 24 Jun 2022 11:23:27 +0100 Subject: [PATCH] KOA-5354 Enable shadowless cards (#1344) * enable shadowless cards * using enum case instead of nullable * swiftui snapshot test * moving extension away from generated folder * moving static code away from generation * moving shadow test file into the project * reverting screenshots * adding docs to internal shadow method --- Backpack-SwiftUI/Card/Classes/BPKCard.swift | 12 +++++--- Backpack-SwiftUI/Card/README.md | 1 + .../Classes/{Generated => }/BPKShadow.swift | 20 +++++++----- .../Generated/BPKShadow+Generated.swift | 26 ++++++++++++++++ .../Tests/Card/BPKCardViewTests.swift | 7 +++++ .../testCardNoShadow.dark-mode.png | Bin 0 -> 6151 bytes .../testCardNoShadow.light-mode.png | Bin 0 -> 5464 bytes .../BPKCardViewTests/testCardNoShadow.rtl.png | Bin 0 -> 5478 bytes .../Tests/Shadow}/ShadowTests.swift | 0 Backpack/Card/Classes/BPKCard.h | 5 +++ Backpack/Card/Classes/BPKCard.m | 22 +++++++++++-- Backpack/Card/README.md | 6 +++- .../Tests/SnapshotTests/BPKCardSnapshotTest.m | 20 ++++++++++++ ...wSnapshotWithoutElevation_dark_mode@2x.png | Bin 0 -> 3630 bytes ...SnapshotWithoutElevation_light_mode@2x.png | Bin 0 -> 3630 bytes .../Components/Card/CardExampleView.swift | 3 ++ .../Components/Card/CardsViewController.swift | 12 +++++--- .../FeatureStories/Groups/CardGroups.swift | 1 + scripts/gulp/generation/swiftui.js | 6 +++- templates/swiftui/Shadow.njk | 29 ------------------ 20 files changed, 119 insertions(+), 51 deletions(-) rename Backpack-SwiftUI/Shadow/Classes/{Generated => }/BPKShadow.swift (79%) create mode 100644 Backpack-SwiftUI/Shadow/Classes/Generated/BPKShadow+Generated.swift create mode 100644 Backpack-SwiftUI/Tests/Card/__Snapshots__/BPKCardViewTests/testCardNoShadow.dark-mode.png create mode 100644 Backpack-SwiftUI/Tests/Card/__Snapshots__/BPKCardViewTests/testCardNoShadow.light-mode.png create mode 100644 Backpack-SwiftUI/Tests/Card/__Snapshots__/BPKCardViewTests/testCardNoShadow.rtl.png rename {Shadow => Backpack-SwiftUI/Tests/Shadow}/ShadowTests.swift (100%) create mode 100644 Backpack/Tests/SnapshotTests/ReferenceImages_64/BPKCardSnapshotTest/testViewSnapshotWithoutElevation_dark_mode@2x.png create mode 100644 Backpack/Tests/SnapshotTests/ReferenceImages_64/BPKCardSnapshotTest/testViewSnapshotWithoutElevation_light_mode@2x.png diff --git a/Backpack-SwiftUI/Card/Classes/BPKCard.swift b/Backpack-SwiftUI/Card/Classes/BPKCard.swift index 670a90938..845522ff6 100644 --- a/Backpack-SwiftUI/Card/Classes/BPKCard.swift +++ b/Backpack-SwiftUI/Card/Classes/BPKCard.swift @@ -24,10 +24,14 @@ public struct BPKCard: View { } public enum Elevation { - case `default`, focus + case `default`, focus, none - var shadow: BPKShadow { - self == .focus ? .lg : .sm + var shadow: BPKShadow? { + switch self { + case .none: return nil + case .focus: return .lg + case .`default`: return .sm + } } var backgroundColor: BPKColor { @@ -77,7 +81,7 @@ public struct BPKCard: View { )) .shadow(elevation.shadow) } - + public func onTapGesture(perform: @escaping () -> Void) -> BPKCard { var result = self result.tapAction = perform diff --git a/Backpack-SwiftUI/Card/README.md b/Backpack-SwiftUI/Card/README.md index 2742fb9bd..e60cc9899 100644 --- a/Backpack-SwiftUI/Card/README.md +++ b/Backpack-SwiftUI/Card/README.md @@ -26,6 +26,7 @@ BPKCard(padding: .none) { Set the elevation to: * `.default` * `.focus` +* `.none` ```swift BPKCard(elevation: .focus) { diff --git a/Backpack-SwiftUI/Shadow/Classes/Generated/BPKShadow.swift b/Backpack-SwiftUI/Shadow/Classes/BPKShadow.swift similarity index 79% rename from Backpack-SwiftUI/Shadow/Classes/Generated/BPKShadow.swift rename to Backpack-SwiftUI/Shadow/Classes/BPKShadow.swift index 3e8b58c81..8f67fb581 100644 --- a/Backpack-SwiftUI/Shadow/Classes/Generated/BPKShadow.swift +++ b/Backpack-SwiftUI/Shadow/Classes/BPKShadow.swift @@ -15,7 +15,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - + import SwiftUI public struct BPKShadow { @@ -34,13 +34,17 @@ public struct BPKShadow { } } -public extension BPKShadow { - - /// The Skyscanner large shadow. - static let lg = BPKShadow(color: .shadowLgColor, radius: 16, offset: Offset(x: 0, y: 4), opacity: 0.15) - - /// The Skyscanner small shadow. - static let sm = BPKShadow(color: .shadowSmColor, radius: 3, offset: Offset(x: 0, y: 1), opacity: 0.15) +extension View { + /// This method is internal by design. + /// It is not meant to be used by third-parties. + @ViewBuilder + func shadow(_ shadow: BPKShadow?) -> some View { + if let shadow = shadow { + self.shadow(shadow) + } else { + self + } + } } public extension View { diff --git a/Backpack-SwiftUI/Shadow/Classes/Generated/BPKShadow+Generated.swift b/Backpack-SwiftUI/Shadow/Classes/Generated/BPKShadow+Generated.swift new file mode 100644 index 000000000..9d9147ac6 --- /dev/null +++ b/Backpack-SwiftUI/Shadow/Classes/Generated/BPKShadow+Generated.swift @@ -0,0 +1,26 @@ +/* + * Backpack - Skyscanner's Design System + * + * Copyright 2018 Skyscanner 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. + */ + +public extension BPKShadow { + + /// The Skyscanner large shadow. + static let lg = BPKShadow(color: .shadowLgColor, radius: 16, offset: Offset(x: 0, y: 4), opacity: 0.15) + + /// The Skyscanner small shadow. + static let sm = BPKShadow(color: .shadowSmColor, radius: 3, offset: Offset(x: 0, y: 1), opacity: 0.15) +} diff --git a/Backpack-SwiftUI/Tests/Card/BPKCardViewTests.swift b/Backpack-SwiftUI/Tests/Card/BPKCardViewTests.swift index 5d1e35dd0..6aff08888 100644 --- a/Backpack-SwiftUI/Tests/Card/BPKCardViewTests.swift +++ b/Backpack-SwiftUI/Tests/Card/BPKCardViewTests.swift @@ -40,6 +40,13 @@ class BPKCardViewTests: XCTestCase { ) } + func testCardNoShadow() { + assertSnapshot( + BPKCard(elevation: .none) { content("No Shadow") } + .padding() + ) + } + func testCardNotPadded() { assertSnapshot( BPKCard(padding: .none) { content("Not Padded") } diff --git a/Backpack-SwiftUI/Tests/Card/__Snapshots__/BPKCardViewTests/testCardNoShadow.dark-mode.png b/Backpack-SwiftUI/Tests/Card/__Snapshots__/BPKCardViewTests/testCardNoShadow.dark-mode.png new file mode 100644 index 0000000000000000000000000000000000000000..2236ccca27d7fe84db79ce7b28ac9770ef9f8714 GIT binary patch literal 6151 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 literal 0 HcmV?d00001 diff --git a/Backpack-SwiftUI/Tests/Card/__Snapshots__/BPKCardViewTests/testCardNoShadow.light-mode.png b/Backpack-SwiftUI/Tests/Card/__Snapshots__/BPKCardViewTests/testCardNoShadow.light-mode.png new file mode 100644 index 0000000000000000000000000000000000000000..e13cf8d7bd9efa3aa2585ff3134d5409f034a01b GIT binary patch literal 5464 zcmeHJX*8Q_*N#$Ehhu0}QPRQCn(7=CRW)=#Q$eeSnoCQKp+eLYt)V%psx{A4krJUb zB!W;;bqqmFL6BAvb83u=#2fGTzTf}v=eO3m*V@mu?`!S7p6A|cKl{Go@0gni3rY(D z003d|t(%qr0FNTqM+xwApG_`n$GE@)voyI5sO&wpz}-A`zYq2>GXp4deE|R;k2K)$ zK?v9Md1U_AH|9AH;Qcp$2mnBO0r>tCW6s5c^@eK)Isb#ag*^X>=5mFH{u|AsSjhWd zAAmYY(?a8PxNtP!mK_WLIH7Q0JYY-tpIq{k*G&s6E^=S^?{(mx=h^|@0{{g1ucgE$ za&rg3H?LVe&uaRh%K(Zw#LY~mvCXC#Vyfy3+c$w;}ei|z9PBi|k=O;l$(M!q> z6QW~$H{XyX#A~f?Yut%m=HnTYd@K91mt_XEnCs2U3a6pP&1WN>w!ByKRu^gEPSeHe9Y1@;J|FFz>15@HfV^sdRlh zCO`0)Vo#t+k{l^wL|V(?FvT&4+%vR=DqD85zy6ZwSfCD-6*R(nF?mdgb7oOTcuoks5x!zxC+>RN=tg_h zEr4rRYvON%za%H-K)$1ne}<_Li>2<+5H~jXz}U&)kR!}ZOQ<91#ip=DhR*kYitqdA z)^2ahz#buDwI@c0WUp9dMqSTrLh8tw9um0s8lJ2H&Q0A@E4eSGIGeI(>DQIo_otcd zS;rbB8iM%6?(m9O=^^>t%lv$zrKe^-XygSh?x*Wy2dg?YG<;A|J_}(nfdNYt|G*<6 za?0aT7lemsU?tiq0aB>-Vgv7y-%k*HC+Zj8Y3L1a^&MWRi3KyMgm8;it&;qHA;0eQ zl@gGJFD`_^`J%6!y_c>>#W8L-Nh&4D^2A=~xS|a4qv|hBMfg}=e&9pFUwo2vEI4J# z-fM1+ie|jZSKrxd6G7+lef}-00JAq&t~&wiBP?%bHx{{5v3c)E!)V<3GMV_cYImRL zmf~D{$4vP0=xi8MYFb(=Y%~vHyk#gbTxy!Zv)af=KTe<%<4j|&W_ZB$`+_@5T3}{5 zaG}75;{$gpd?y>uef<7XB?_ot6&Ou&xVq51j|dG2EhEaW$!U6I`}7xL29w?}kyCC{ zYsil1jMHET)lHj?(sCxB-@vjpZ9QhZuDQy`zQ#}hJvE`~$-KV*y=+DK-eF?u2HY_- z$lkvqqR?BzBh4~)VT+#DeSmdeC=4Ptw+C0539U`_d> z$qWNTg(b)|<)^%a@G1|laje_%mXRn*(&stS0^IcJbkSq;JQi(1Qz#kTztJNQ?#B3$VSoRi3lgimD7}wzfK-GY}0@Wxx;n-)AX>#WC-4 z=1~RMopM20f`+wDOTN!=gU{&-Qg(3QMZ(nqFGKc9+TGTQ&s241H>r!ai7b$$vlUHm zeSQP_<*zm9?xv2pZ_%MAq&hS444jNMG&o!87vj;q9MI%MBf~tnsu?t{1s#~mgNJE_ ztY5(Kg?B|X7DqztqrH8Q{;<}#t;rbo$ixUbFA6A1`m0y3%KW}djSafVZUa>iDKSD| zPW9~k;HPQvZnKv%6|XqYRDV%fl7~?MpI_} z0!|qqjNNW|y z>VNKC{0TM5IxB0!wvC#7t*X5&0x|z?)fEUfI7ALpJIq`jlXPA(@GPqcf9enf5ijk{ zVth)`pqToL@~$Dn`|X!{}e_kYi*~AV+7(?+t`FbA2wk zwvz1XVu)1}W=(d}9{%f!!gd{6594`ak-B)2{=qTV!@4{rU1# zv0zr=p6|8pS8o2_QY8oUHc_+AM%~j2DozRMPQ>Pj0`hzQl5`n6{D%)3k!%tX0^6%* zraLf5z8N-US5t8oSd(rUe~8f1E^{zN2fx?NT{d=ou#=iHD$5i zFvAdgeA#;_wb0zua5lY3ba$qS@o1z1?+VKwqa+ECQ2$QtkgwxDhDre zwBJ^gSQ#bYOl#hHl2v;s64Zi{rBvL;$`9h^P2`ko9w!)eU(A4J8#MC4Po5KTHL5rw zZE?>u<%KZyFfA=7;Y0z_^7Yc+Z_km-Z?k_Ha0TA}zPgy|7FXrL4%FRBcEX@}hiu2j z#Y;F44#aE>%1+P)%O5{__I&)!7uUqalaq^!ODyFD>@V2AlovLB>-FY$FS5`R8QjY^ z0@F5p!L}g|w5{bUeWCd^4AwdvuBflO(M-=}vwJz)5&3$w8kR2o?2S)+Am|?M*HpX2 ziVOFTOt4&F%>fA(8*>-wza}C~oqW&%wrx$j?FqKKuyHKgJzs69@LC(4t&^ke-yNun z+VyW9b2CoNekA8JLGI`eriD4^)p(FzM1#;2PcL>*q(WNQ*0>!FU4=Iow9ZwE+KFG_ z>^>MQ?o62bK8_(pO5|iaKrudu0Ha`<(pYkd*P!{7O+^9NWhF^gcbFw2w+GF~+tu_= zZEsOzHhkNE*Jt^bF&R5VnNW2JP}PZTT14+8Wd;d8%#mV13U(JIiOY#I{G1o zIcSbS=6~A4ID~YgTlz)R8~Sm&SEYeqN_A?pVG(U5_0kT8&__(8=#q@3k*|8`oPlEnR%jjwSdimwL}QOv+_& zv6W55PS=PNhh0ARt#yCAfz1-hHdV*?E*b1Rc!~Kzlj2_LQ2A8j%$ahfAHJYB-NV8W(!bdQUIsGowMhzZ&SBuaUxb(#C5#My)jP$ z@6)ifP`iIo!@~_tgM)fD5;p;PCM#hO!_)65Q-|AO5U4ptD_V5GK;*D)2FQxm|92iCq@xu zzrq#d&4F2vV6LTv_^^zB`NN0K@X)kqP8w2UII5W7x1SBvztfMX)`cFGuk>=2Uhgf? zlRWAKR`|s#j`QM*wq{H%=6>V!BEpCCWuU~Ftw~`n`tbIwPKGD)IdgR3drE!5U8#0h z&T6&U<_fNHPk4nNgI$=x9jaFGni*+5K?){M(Q6qUrUX)6`_Uuo=(vlRXsJYgnnZ4({NWlmvHwRN!HPhkk zm^#779obHJ1jZ5nl@YbOP!tWixGCrX!HeCoaUJj)EX^Zb+Fjl7#r4q$CNZ41BO7zC+7yqC&QE^B@lqGpqas_}t4 zKgI5Ca8OMy>!h3wGJLGsdWufw?;B%RNXquERvLwNy*Eix$a%PbiK|1kg?f!LgS-Pl z#W{teufPcPg3~}Xug!(e^-l(0<>x+}V)tL2TpVtq%yPvM#mimYdoaGx%^EXK6p{h; zo+m56b0CD}y%h*r(m!t@uxV2^>RWg<)@%ApO}wX?Pu-;fh#z~GWNiB096w>YGBIGx zR#${@uVekHJ}qzTrQO&YriKKz)#}$-`nUnLEy3sy*Kw>LDypRFsW&>L;Ja~+n%?D9 z)AIXeS^hUPRR~5ZHmRe{3v&fwE_JBb&`(8DHOs3O{>m5P4m5lUOhR$8#{l2>3Fv7@ zELN)i@>%%re)#8ScjH>Dq`WsL6Pry1+i#6;%97IuyK~%1uEv5X>f~ErAq=!g=brr^ zu9o}qhN~FQ2H_CZyJVE;YJH|gnHquEqM5N1(%g;}{}8+cT1f3lK2DT@R^(-wIt1^w zzIpXW;Ec&@^N2xN(WsuCD+B7D7g$Nw*epRoZA^%jN zon1LDR(h*td5XXy(F>y7J^GwIoA1|wU|9jplY?ekYaRQS!v0)hWw*9O_8}w)K?}<7 z6>hyM(kJEMhSXL1lv;}5sY*GzA@OfT3oOVL(7{rSag7;)Y!%&9to?z0ED6@et-J=X wLiCv-A9p_U&Bw+9_=x{-|J30BZ69!s=uP6oBqKNuTpbDk8=2p%y#65iUs5&a4gdfE literal 0 HcmV?d00001 diff --git a/Backpack-SwiftUI/Tests/Card/__Snapshots__/BPKCardViewTests/testCardNoShadow.rtl.png b/Backpack-SwiftUI/Tests/Card/__Snapshots__/BPKCardViewTests/testCardNoShadow.rtl.png new file mode 100644 index 0000000000000000000000000000000000000000..011899fc5c618819c40313c7d1b5bf9267151b5e GIT binary patch literal 5478 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 literal 0 HcmV?d00001 diff --git a/Shadow/ShadowTests.swift b/Backpack-SwiftUI/Tests/Shadow/ShadowTests.swift similarity index 100% rename from Shadow/ShadowTests.swift rename to Backpack-SwiftUI/Tests/Shadow/ShadowTests.swift diff --git a/Backpack/Card/Classes/BPKCard.h b/Backpack/Card/Classes/BPKCard.h index e38f4b8f7..d14493bc9 100644 --- a/Backpack/Card/Classes/BPKCard.h +++ b/Backpack/Card/Classes/BPKCard.h @@ -36,6 +36,11 @@ IB_DESIGNABLE @interface BPKCard : UIControl */ @property(nonatomic, assign, getter=isPadded) IBInspectable BOOL padded; +/** + * Whether the card should have a shadow or not. + */ +@property(nonatomic, assign) IBInspectable BOOL isElevated; + /** * Determines how the card should appear to assistive technology. * Default is BPKCardConfigurationContainer. diff --git a/Backpack/Card/Classes/BPKCard.m b/Backpack/Card/Classes/BPKCard.m index 51c1608bc..5b36db7e8 100644 --- a/Backpack/Card/Classes/BPKCard.m +++ b/Backpack/Card/Classes/BPKCard.m @@ -87,6 +87,12 @@ - (void)setPadded:(BOOL)padded { [self updateCorners]; } +- (void)setIsElevated:(BOOL)isElevated { + BPKAssertMainThread(); + _isElevated = isElevated; + [self updateShadows]; +} + - (void)setCornerStyle:(BPKCardCornerStyle)cornerStyle { BPKAssertMainThread(); _cornerStyle = cornerStyle; @@ -96,8 +102,7 @@ - (void)setCornerStyle:(BPKCardCornerStyle)cornerStyle { - (void)setSelected:(BOOL)selected { BPKAssertMainThread(); [super setSelected:selected]; - BPKShadow *shadow = selected ? [BPKShadow shadowLg] : [BPKShadow shadowSm]; - [shadow applyToLayer:self.layer]; + [self updateShadows]; [self updateAccessibilityTraits]; } @@ -150,7 +155,8 @@ - (void)setupWithPadded:(BOOL)padded cornerStyle:(BPKCardCornerStyle)cornerStyle [self.layer addSublayer:self.tintLayer]; self.backgroundColor = BPKColor.backgroundTertiaryColor; - [[BPKShadow shadowSm] applyToLayer:self.layer]; + self.isElevated = YES; + [self updateShadows]; self.innerView = [[UIView alloc] initWithFrame:CGRectZero]; self.innerView.layer.masksToBounds = YES; @@ -169,6 +175,16 @@ - (void)setupWithPadded:(BOOL)padded cornerStyle:(BPKCardCornerStyle)cornerStyle ]]; } +- (void)updateShadows { + if (!self.isElevated) { + // if `elevated` is changed after it's been drawn, hide the shadow + self.layer.shadowOpacity = 0; + return; + } + BPKShadow *shadow = self.selected ? [BPKShadow shadowLg] : [BPKShadow shadowSm]; + [shadow applyToLayer:self.layer]; +} + - (void)updateCorners { CGFloat cornerRadius = 0; diff --git a/Backpack/Card/README.md b/Backpack/Card/README.md index ea1bbb73d..537b4cd28 100644 --- a/Backpack/Card/README.md +++ b/Backpack/Card/README.md @@ -2,12 +2,14 @@ ## Usage -`BPKCard` contains the Backpack Card component. The card is a simple control view with a shadow, offering user interaction. It has a padded and non-padded variation. `BPKCard` can only have 1 direct subview and will add the appropriate constraints automatically when calling setting the `subview` property. +`BPKCard` contains the Backpack Card component. The card is a simple control view with or without a shadow, offering user interaction. It has a padded and non-padded variation. `BPKCard` can only have 1 direct subview and will add the appropriate constraints automatically when calling setting the `subview` property. `BPKDividedCard` contains the Backpack Divided Card component. The divided card is a subclass of `BPKCard`. It can have 2 subviews and will add the appropriate constraints automatically when `-initWithPrimarySubview:secondarySubview:padded`/`init(primarySubview: secondarySubview: padded: )` or `-setPrimarySubview:secondarySubview`/`setSubviews(primarySubview: secondarySubview:)` are called. It's axis can be vertical or horizontal. Cards have an accessibility configuration. By default this is `Container` which means the card is invisible to assistive technology. In this case, ensure that the content of the card provides users of AT with the same action as tapping the card, and explain actions clearly. +Use the `isElevated` property to enable or disable shadows on the card. + If using a `Button` or `Link` configuration, ensure that the accessibilityLabel used describes the whole content of the card and the same action. Do not use `Button` or `Link` configurations if the card has multiple actions or if the copy is long. @@ -22,6 +24,7 @@ Do not use `Button` or `Link` configurations if the card has multiple actions or BPKCard *card = [[BPKCard alloc] initWithPadded:YES]; [card setSubview:myInnerView]; card.padded = NO; +card.isElevated = NO; ``` **`BPKDividedCard`** @@ -44,6 +47,7 @@ import Backpack let card = BPKCard(paddded: true) card.subview = myInnerView card.padded = false +card.isElevated = false ``` **`BPKDividedCard`** diff --git a/Backpack/Tests/SnapshotTests/BPKCardSnapshotTest.m b/Backpack/Tests/SnapshotTests/BPKCardSnapshotTest.m index 1bb4dae40..91f889316 100644 --- a/Backpack/Tests/SnapshotTests/BPKCardSnapshotTest.m +++ b/Backpack/Tests/SnapshotTests/BPKCardSnapshotTest.m @@ -99,6 +99,26 @@ - (void)testViewSnapshotWithoutPaddedAndLargeCornerStyle { BPKSnapshotVerifyViewDark(darkView, nil); } +- (UIView *)createViewSnapshotWithoutElevation { + UIView *parentView = [[UIView alloc] initWithFrame:CGRectZero]; + BPKCard *card = [[BPKCard alloc] initWithPadded:NO cornerStyle:BPKCardCornerStyleLarge]; + card.isElevated = NO; + UIView *innerView = [[UIView alloc] initWithFrame:CGRectZero]; + innerView.backgroundColor = [BPKColor panjin]; + + [self configureCard:card withInnerView:innerView]; + [self configureParentView:parentView forCard:card]; + return parentView; +} + +- (void)testViewSnapshotWithoutElevation { + UIView *lightView = [self createViewSnapshotWithoutElevation]; + UIView *darkView = [self createViewSnapshotWithoutElevation]; + + BPKSnapshotVerifyViewLight(lightView, nil); + BPKSnapshotVerifyViewDark(darkView, nil); +} + - (UIView *)createViewSnapshotWithPadded { UIView *parentView = [[UIView alloc] initWithFrame:CGRectZero]; BPKCard *card = [[BPKCard alloc] initWithPadded:YES]; diff --git a/Backpack/Tests/SnapshotTests/ReferenceImages_64/BPKCardSnapshotTest/testViewSnapshotWithoutElevation_dark_mode@2x.png b/Backpack/Tests/SnapshotTests/ReferenceImages_64/BPKCardSnapshotTest/testViewSnapshotWithoutElevation_dark_mode@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..c052fe771ff96f8f36e81a76edf8c9cb5ad79cf2 GIT binary patch literal 3630 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 PsQ?=b`@_{{CsO|dv{^wK literal 0 HcmV?d00001 diff --git a/Backpack/Tests/SnapshotTests/ReferenceImages_64/BPKCardSnapshotTest/testViewSnapshotWithoutElevation_light_mode@2x.png b/Backpack/Tests/SnapshotTests/ReferenceImages_64/BPKCardSnapshotTest/testViewSnapshotWithoutElevation_light_mode@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..c052fe771ff96f8f36e81a76edf8c9cb5ad79cf2 GIT binary patch literal 3630 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 PsQ?=b`@_{{CsO|dv{^wK literal 0 HcmV?d00001 diff --git a/Example/Backpack/SwiftUI/Components/Card/CardExampleView.swift b/Example/Backpack/SwiftUI/Components/Card/CardExampleView.swift index 4b9015f3c..dc80e184d 100644 --- a/Example/Backpack/SwiftUI/Components/Card/CardExampleView.swift +++ b/Example/Backpack/SwiftUI/Components/Card/CardExampleView.swift @@ -30,6 +30,9 @@ struct CardExampleView: View { BPKCard(elevation: .focus) { content(title: "Focused") } + BPKCard(elevation: .none) { + content(title: "Not elevated") + } BPKCard(padding: .none) { content(title: "Not Padded") } diff --git a/Example/Backpack/UIKit/Components/Card/CardsViewController.swift b/Example/Backpack/UIKit/Components/Card/CardsViewController.swift index 3b0228c85..341fd2f45 100644 --- a/Example/Backpack/UIKit/Components/Card/CardsViewController.swift +++ b/Example/Backpack/UIKit/Components/Card/CardsViewController.swift @@ -16,16 +16,17 @@ * limitations under the License. */ -import Backpack.Card +import Backpack class CardsViewController: UIViewController { @IBOutlet weak var card: BPKCard! - var padded: Bool = true - var selected: Bool = false + var padded = true + var selected = false var configuration: BPKCardConfiguration = BPKCardConfigurationContainer() var backgroundColor: UIColor? - var cornerStyle: BPKCardCornerStyle = .small - + var cornerStyle = BPKCardCornerStyle.small + var isElevated = true + override func viewDidLoad() { super.viewDidLoad() @@ -43,6 +44,7 @@ class CardsViewController: UIViewController { card.isPadded = padded card.cornerStyle = cornerStyle card.isSelected = selected + card.isElevated = isElevated card.configuration = configuration if backgroundColor != nil { card.backgroundColor = backgroundColor diff --git a/Example/Backpack/Utils/FeatureStories/Groups/CardGroups.swift b/Example/Backpack/Utils/FeatureStories/Groups/CardGroups.swift index 6ee2da819..6c871f359 100644 --- a/Example/Backpack/Utils/FeatureStories/Groups/CardGroups.swift +++ b/Example/Backpack/Utils/FeatureStories/Groups/CardGroups.swift @@ -45,6 +45,7 @@ struct CardGroupsProvider { cellDataSources: [ presentableCard("Default") { _ in }, presentableCard("Button") { $0.configuration = .button }, + presentableCard("Not elevated") { $0.isElevated = false }, presentableCard("Link") { $0.configuration = .link }, presentableCard("Without padding") { $0.padded = false }, presentableCard("Selected") { $0.selected = true }, diff --git a/scripts/gulp/generation/swiftui.js b/scripts/gulp/generation/swiftui.js index c1fcd02ec..e70bd63b9 100644 --- a/scripts/gulp/generation/swiftui.js +++ b/scripts/gulp/generation/swiftui.js @@ -21,7 +21,11 @@ const rename = require('gulp-rename'); const swiftUI = (generate) => { return [ { name: 'Spacing' }, - { name: 'Shadow' }, + { + destinationFolder: 'Shadow', + generatedFileName: 'Shadow+Generated', + templateName: 'Shadow' + }, { destinationFolder: 'Font', generatedFileName: 'FontStyle', diff --git a/templates/swiftui/Shadow.njk b/templates/swiftui/Shadow.njk index 1a6914011..be1638f05 100644 --- a/templates/swiftui/Shadow.njk +++ b/templates/swiftui/Shadow.njk @@ -15,38 +15,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - -import SwiftUI - -public struct BPKShadow { - let color: BPKColor - let radius: CGFloat - let offset: Offset - let opacity: Double - - struct Offset { - let x: CGFloat - let y: CGFloat - - static func y(_ y: CGFloat) -> Offset { - Offset(x: 0, y: y) - } - } -} public extension BPKShadow { {% for s in shadow %} /// The Skyscanner {{s.legibleName}} shadow. static let {{s.swiftuiName}} = BPKShadow(color: .{{s.name}}Color, radius: {{s.radius}}, offset: Offset(x: {{s.offset.x}}, y: {{s.offset.y}}), opacity: {{s.opacity}}) {% endfor %}} - -public extension View { - func shadow(_ shadow: BPKShadow) -> some View { - self.shadow( - color: Color(shadow.color).opacity(shadow.opacity), - radius: shadow.radius, - x: shadow.offset.x, - y: shadow.offset.y - ) - } -}