From 5dc86ba9c6f5cf90e0cc3030ddd6da8c8b8bebd8 Mon Sep 17 00:00:00 2001 From: Dominik Lander Date: Fri, 11 Oct 2024 14:05:13 +0100 Subject: [PATCH 1/7] Display US marketing card to US users on small screens --- .../ExpandableMarketingCard.stories.tsx | 2 - .../components/ExpandableMarketingCard.tsx | 29 +++++- ...andableMarketingCardWrapper.importable.tsx | 97 +++++++++++++++++-- .../src/layouts/CommentLayout.tsx | 18 ++++ .../src/layouts/ImmersiveLayout.tsx | 18 ++++ .../src/layouts/PictureLayout.tsx | 17 ---- .../src/layouts/ShowcaseLayout.tsx | 18 ++++ .../src/layouts/StandardLayout.tsx | 18 ++++ .../logos/red-blue-banner-bottom-mobile.svg | 43 ++++++++ .../logos/red-blue-banner-faded-mobile.svg | 33 +++++++ .../logos/red-blue-banner-top-mobile.svg | 31 ++++++ 11 files changed, 295 insertions(+), 29 deletions(-) create mode 100644 dotcom-rendering/src/static/logos/red-blue-banner-bottom-mobile.svg create mode 100644 dotcom-rendering/src/static/logos/red-blue-banner-faded-mobile.svg create mode 100644 dotcom-rendering/src/static/logos/red-blue-banner-top-mobile.svg diff --git a/dotcom-rendering/src/components/ExpandableMarketingCard.stories.tsx b/dotcom-rendering/src/components/ExpandableMarketingCard.stories.tsx index 8924fbcf7cf..a8a87b2721c 100644 --- a/dotcom-rendering/src/components/ExpandableMarketingCard.stories.tsx +++ b/dotcom-rendering/src/components/ExpandableMarketingCard.stories.tsx @@ -32,8 +32,6 @@ export const Default = { chromatic: { viewports: [ breakpoints.mobile, - breakpoints.mobileMedium, - breakpoints.phablet, breakpoints.tablet, breakpoints.desktop, ], diff --git a/dotcom-rendering/src/components/ExpandableMarketingCard.tsx b/dotcom-rendering/src/components/ExpandableMarketingCard.tsx index 01546958e18..39b14ece1af 100644 --- a/dotcom-rendering/src/components/ExpandableMarketingCard.tsx +++ b/dotcom-rendering/src/components/ExpandableMarketingCard.tsx @@ -24,10 +24,34 @@ interface BannersIllustrationProps { styles?: SerializedStyles; } +const smallIllustrationStyles = css` + display: inline; + ${from.leftCol} { + display: none; + } +`; +const largeIllustrationStyles = css` + display: none; + ${from.leftCol} { + display: inline; + } +`; + const BannersIllustration = ({ type, styles }: BannersIllustrationProps) => { const { assetOrigin } = useConfig(); - const src = `${assetOrigin}static/frontend/logos/red-blue-banner-${type}.svg`; - return ; + const src = `${assetOrigin}static/frontend/logos/red-blue-banner-${type}-mobile.svg`; + const largeSrc = `${assetOrigin}static/frontend/logos/red-blue-banner-${type}.svg`; + + return ( + <> + + + + ); }; const fillBarStyles = css` @@ -63,6 +87,7 @@ const summaryStyles = css` gap: ${space[3]}px; z-index: 1; width: 100%; + cursor: pointer; `; const headingStyles = css` diff --git a/dotcom-rendering/src/components/ExpandableMarketingCardWrapper.importable.tsx b/dotcom-rendering/src/components/ExpandableMarketingCardWrapper.importable.tsx index cfcb42ddf6f..45fc57db224 100644 --- a/dotcom-rendering/src/components/ExpandableMarketingCardWrapper.importable.tsx +++ b/dotcom-rendering/src/components/ExpandableMarketingCardWrapper.importable.tsx @@ -1,10 +1,35 @@ +import { css } from '@emotion/react'; import { getCookie } from '@guardian/libs'; import { useEffect, useState } from 'react'; import type { DailyArticle } from '../lib/dailyArticleCount'; import { getDailyArticleCount } from '../lib/dailyArticleCount'; import { getLocaleCode } from '../lib/getCountryCode'; +import { getZIndex } from '../lib/getZIndex'; import { useAB } from '../lib/useAB'; import { ExpandableMarketingCard } from './ExpandableMarketingCard'; +import { Hide } from './Hide'; + +const stickyContainerStyles = css` + position: sticky; + top: 0; + ${getZIndex('expandableMarketingCardOverlay')}; + animation: slidein 1.5s normal; + + @keyframes slidein { + from { + translate: -800px 0; + } + + to { + translate: 0 0; + } + } +`; + +const absoluteContainerStyles = css` + position: absolute; + width: 100%; +`; interface Props { guardianBaseURL: string; @@ -37,6 +62,8 @@ export const ExpandableMarketingCardWrapper = ({ guardianBaseURL }: Props) => { const [isExpanded, setIsExpanded] = useState(false); const [isClosed, setIsClosed] = useState(false); const [isApplicableUser, setIsApplicableUser] = useState(false); + const [topOfBody, setTopOfBody] = useState(null); + const [shouldDisplayCard, setShouldDisplayCard] = useState(false); const abTestAPI = useAB()?.api; const isInVariantFree = !!abTestAPI?.isUserInVariant( @@ -57,6 +84,40 @@ export const ExpandableMarketingCardWrapper = ({ guardianBaseURL }: Props) => { }); }, []); + useEffect(() => { + setTopOfBody(document.querySelector('[data-gu-name="body"]')); + }, []); + + useEffect(() => { + if (!topOfBody) return; + + /** + * If the viewport is below the top of the body, display the card immediately + */ + if (topOfBody.getBoundingClientRect().top < 0) { + setShouldDisplayCard(true); + } + + /** + * Show the card when the top of the body moves out of the viewport. + */ + const observer = new window.IntersectionObserver( + ([entry]) => { + if (!entry) return; + if (entry.isIntersecting) { + setShouldDisplayCard(true); + } + }, + { rootMargin: '0px 0px -100%' }, + ); + + observer.observe(topOfBody); + + return () => { + observer.disconnect(); + }; + }, [topOfBody]); + if (!isInEitherVariant || !isApplicableUser || isClosed) { return null; } @@ -70,13 +131,33 @@ export const ExpandableMarketingCardWrapper = ({ guardianBaseURL }: Props) => { : 'Why the Guardian has no paywall'; return ( - + <> + + + + + {shouldDisplayCard && ( +
+
+ +
+
+ )} +
+ ); }; diff --git a/dotcom-rendering/src/layouts/CommentLayout.tsx b/dotcom-rendering/src/layouts/CommentLayout.tsx index 4232f296e73..660afd560a3 100644 --- a/dotcom-rendering/src/layouts/CommentLayout.tsx +++ b/dotcom-rendering/src/layouts/CommentLayout.tsx @@ -600,6 +600,24 @@ export const CommentLayout = (props: WebProps | AppsProps) => { + {isWeb && ( + + + + + + )}
{
+ {isWeb && ( + + + + + + )} { /> - {isWeb && ( - - - - - - - - )} diff --git a/dotcom-rendering/src/layouts/ShowcaseLayout.tsx b/dotcom-rendering/src/layouts/ShowcaseLayout.tsx index bda4ad0f2c3..33e1e96c04a 100644 --- a/dotcom-rendering/src/layouts/ShowcaseLayout.tsx +++ b/dotcom-rendering/src/layouts/ShowcaseLayout.tsx @@ -580,6 +580,24 @@ export const ShowcaseLayout = (props: WebProps | AppsProps) => { + {isWeb && ( + + + + + + )} { )} + {isWeb && ( + + + + + + )} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dotcom-rendering/src/static/logos/red-blue-banner-faded-mobile.svg b/dotcom-rendering/src/static/logos/red-blue-banner-faded-mobile.svg new file mode 100644 index 00000000000..4ded194ae58 --- /dev/null +++ b/dotcom-rendering/src/static/logos/red-blue-banner-faded-mobile.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dotcom-rendering/src/static/logos/red-blue-banner-top-mobile.svg b/dotcom-rendering/src/static/logos/red-blue-banner-top-mobile.svg new file mode 100644 index 00000000000..8e80855e76a --- /dev/null +++ b/dotcom-rendering/src/static/logos/red-blue-banner-top-mobile.svg @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 7f53223acad3d62018040d91525589605b9a13b3 Mon Sep 17 00:00:00 2001 From: Dominik Lander Date: Fri, 11 Oct 2024 16:55:14 +0100 Subject: [PATCH 2/7] Slow down animation --- .../components/ExpandableMarketingCardWrapper.importable.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dotcom-rendering/src/components/ExpandableMarketingCardWrapper.importable.tsx b/dotcom-rendering/src/components/ExpandableMarketingCardWrapper.importable.tsx index 45fc57db224..1a55f1b3971 100644 --- a/dotcom-rendering/src/components/ExpandableMarketingCardWrapper.importable.tsx +++ b/dotcom-rendering/src/components/ExpandableMarketingCardWrapper.importable.tsx @@ -13,7 +13,7 @@ const stickyContainerStyles = css` position: sticky; top: 0; ${getZIndex('expandableMarketingCardOverlay')}; - animation: slidein 1.5s normal; + animation: slidein 2s normal; @keyframes slidein { from { From d83529e04f764279c5e78e029db4188f8cfb7e07 Mon Sep 17 00:00:00 2001 From: Dominik Lander Date: Fri, 11 Oct 2024 17:09:14 +0100 Subject: [PATCH 3/7] Correct banner illustrations on small screens --- .../components/ExpandableMarketingCard.tsx | 20 ++++++++++++++----- ...andableMarketingCardWrapper.importable.tsx | 8 ++++++-- ...m.svg => red-blue-large-banner-bottom.svg} | 0 ...ed.svg => red-blue-large-banner-faded.svg} | 0 ...-top.svg => red-blue-large-banner-top.svg} | 0 ...e.svg => red-blue-small-banner-bottom.svg} | 0 ...le.svg => red-blue-small-banner-faded.svg} | 0 ...bile.svg => red-blue-small-banner-top.svg} | 0 8 files changed, 21 insertions(+), 7 deletions(-) rename dotcom-rendering/src/static/logos/{red-blue-banner-bottom.svg => red-blue-large-banner-bottom.svg} (100%) rename dotcom-rendering/src/static/logos/{red-blue-banner-faded.svg => red-blue-large-banner-faded.svg} (100%) rename dotcom-rendering/src/static/logos/{red-blue-banner-top.svg => red-blue-large-banner-top.svg} (100%) rename dotcom-rendering/src/static/logos/{red-blue-banner-bottom-mobile.svg => red-blue-small-banner-bottom.svg} (100%) rename dotcom-rendering/src/static/logos/{red-blue-banner-faded-mobile.svg => red-blue-small-banner-faded.svg} (100%) rename dotcom-rendering/src/static/logos/{red-blue-banner-top-mobile.svg => red-blue-small-banner-top.svg} (100%) diff --git a/dotcom-rendering/src/components/ExpandableMarketingCard.tsx b/dotcom-rendering/src/components/ExpandableMarketingCard.tsx index 39b14ece1af..05aa5b9b219 100644 --- a/dotcom-rendering/src/components/ExpandableMarketingCard.tsx +++ b/dotcom-rendering/src/components/ExpandableMarketingCard.tsx @@ -25,13 +25,19 @@ interface BannersIllustrationProps { } const smallIllustrationStyles = css` - display: inline; + display: none; + ${from.phablet} { + display: inline; + } ${from.leftCol} { display: none; } `; const largeIllustrationStyles = css` - display: none; + display: inline; + ${from.phablet} { + display: none; + } ${from.leftCol} { display: inline; } @@ -39,12 +45,16 @@ const largeIllustrationStyles = css` const BannersIllustration = ({ type, styles }: BannersIllustrationProps) => { const { assetOrigin } = useConfig(); - const src = `${assetOrigin}static/frontend/logos/red-blue-banner-${type}-mobile.svg`; - const largeSrc = `${assetOrigin}static/frontend/logos/red-blue-banner-${type}.svg`; + const smallSrc = `${assetOrigin}static/frontend/logos/red-blue-small-banner-${type}.svg`; + const largeSrc = `${assetOrigin}static/frontend/logos/red-blue-large-banner-${type}.svg`; return ( <> - + + topOfBody.getBoundingClientRect().top < 0; + const stickyContainerStyles = css` position: sticky; top: 0; @@ -92,10 +95,11 @@ export const ExpandableMarketingCardWrapper = ({ guardianBaseURL }: Props) => { if (!topOfBody) return; /** - * If the viewport is below the top of the body, display the card immediately + * It's possible that the viewport does not start at the top of the page. */ - if (topOfBody.getBoundingClientRect().top < 0) { + if (isViewportBelowTopOfBody(topOfBody)) { setShouldDisplayCard(true); + return; } /** diff --git a/dotcom-rendering/src/static/logos/red-blue-banner-bottom.svg b/dotcom-rendering/src/static/logos/red-blue-large-banner-bottom.svg similarity index 100% rename from dotcom-rendering/src/static/logos/red-blue-banner-bottom.svg rename to dotcom-rendering/src/static/logos/red-blue-large-banner-bottom.svg diff --git a/dotcom-rendering/src/static/logos/red-blue-banner-faded.svg b/dotcom-rendering/src/static/logos/red-blue-large-banner-faded.svg similarity index 100% rename from dotcom-rendering/src/static/logos/red-blue-banner-faded.svg rename to dotcom-rendering/src/static/logos/red-blue-large-banner-faded.svg diff --git a/dotcom-rendering/src/static/logos/red-blue-banner-top.svg b/dotcom-rendering/src/static/logos/red-blue-large-banner-top.svg similarity index 100% rename from dotcom-rendering/src/static/logos/red-blue-banner-top.svg rename to dotcom-rendering/src/static/logos/red-blue-large-banner-top.svg diff --git a/dotcom-rendering/src/static/logos/red-blue-banner-bottom-mobile.svg b/dotcom-rendering/src/static/logos/red-blue-small-banner-bottom.svg similarity index 100% rename from dotcom-rendering/src/static/logos/red-blue-banner-bottom-mobile.svg rename to dotcom-rendering/src/static/logos/red-blue-small-banner-bottom.svg diff --git a/dotcom-rendering/src/static/logos/red-blue-banner-faded-mobile.svg b/dotcom-rendering/src/static/logos/red-blue-small-banner-faded.svg similarity index 100% rename from dotcom-rendering/src/static/logos/red-blue-banner-faded-mobile.svg rename to dotcom-rendering/src/static/logos/red-blue-small-banner-faded.svg diff --git a/dotcom-rendering/src/static/logos/red-blue-banner-top-mobile.svg b/dotcom-rendering/src/static/logos/red-blue-small-banner-top.svg similarity index 100% rename from dotcom-rendering/src/static/logos/red-blue-banner-top-mobile.svg rename to dotcom-rendering/src/static/logos/red-blue-small-banner-top.svg From 2218af5fc4d56e40b025c49662f9e52109909bc7 Mon Sep 17 00:00:00 2001 From: Dominik Lander Date: Tue, 15 Oct 2024 15:50:28 +0100 Subject: [PATCH 4/7] refactor --- .../components/ExpandableMarketingCard.tsx | 6 ++- ...andableMarketingCardWrapper.importable.tsx | 50 ++++++++++--------- 2 files changed, 31 insertions(+), 25 deletions(-) diff --git a/dotcom-rendering/src/components/ExpandableMarketingCard.tsx b/dotcom-rendering/src/components/ExpandableMarketingCard.tsx index 05aa5b9b219..8cc99e0f5bb 100644 --- a/dotcom-rendering/src/components/ExpandableMarketingCard.tsx +++ b/dotcom-rendering/src/components/ExpandableMarketingCard.tsx @@ -97,6 +97,9 @@ const summaryStyles = css` gap: ${space[3]}px; z-index: 1; width: 100%; +`; +const contractedSummaryStyles = css` + ${summaryStyles} cursor: pointer; `; @@ -197,7 +200,6 @@ interface Props { setIsClosed: Dispatch>; } -// todo - semantic html accordion-details? export const ExpandableMarketingCard = ({ guardianBaseURL, heading, @@ -217,7 +219,7 @@ export const ExpandableMarketingCard = ({ styles={imageTopStyles} />
{ diff --git a/dotcom-rendering/src/components/ExpandableMarketingCardWrapper.importable.tsx b/dotcom-rendering/src/components/ExpandableMarketingCardWrapper.importable.tsx index f087b116819..b729cf7fbf7 100644 --- a/dotcom-rendering/src/components/ExpandableMarketingCardWrapper.importable.tsx +++ b/dotcom-rendering/src/components/ExpandableMarketingCardWrapper.importable.tsx @@ -12,6 +12,28 @@ import { Hide } from './Hide'; const isViewportBelowTopOfBody = (topOfBody: Element) => topOfBody.getBoundingClientRect().top < 0; +const isFirstArticle = () => { + const [dailyCount = {} as DailyArticle] = getDailyArticleCount() ?? []; + return Object.keys(dailyCount).length === 0 || dailyCount.count <= 1; +}; + +const isNewUSUser = async () => { + const isUserInUS = (await getLocaleCode()) === 'US'; + if (!isUserInUS) { + return false; + } + + // Exclude users who have selected a non-US edition. + const editionCookie = getCookie({ name: 'GU_EDITION' }); + const hasUserSelectedNonUSEdition = + !!editionCookie && editionCookie !== 'US'; + + // This check must happen AFTER we've ensured that the user is in the US. + const isNewUser = isFirstArticle(); + + return !hasUserSelectedNonUSEdition && !isNewUser; +}; + const stickyContainerStyles = css` position: sticky; top: 0; @@ -38,34 +60,16 @@ interface Props { guardianBaseURL: string; } -const isFirstArticle = () => { - const [dailyCount = {} as DailyArticle] = getDailyArticleCount() ?? []; - return Object.keys(dailyCount).length === 0 || dailyCount.count <= 1; -}; - -const isNewUSUser = async () => { - const isUserInUS = (await getLocaleCode()) === 'US'; - if (!isUserInUS) { - return false; - } - - // Exclude users who have selected a non-US edition. - const editionCookie = getCookie({ name: 'GU_EDITION' }); - const hasUserSelectedNonUSEdition = - !!editionCookie && editionCookie !== 'US'; - - // This check must happen AFTER we've ensured that the user is in the US. - const isNewUser = isFirstArticle(); - - return !hasUserSelectedNonUSEdition && !isNewUser; -}; - -// todo - semantic html accordion-details? export const ExpandableMarketingCardWrapper = ({ guardianBaseURL }: Props) => { const [isExpanded, setIsExpanded] = useState(false); const [isClosed, setIsClosed] = useState(false); const [isApplicableUser, setIsApplicableUser] = useState(false); const [topOfBody, setTopOfBody] = useState(null); + + /** + * On screen sizes below leftCol (<1140px), only display the card + * when the user scrolls past the top of the article. + */ const [shouldDisplayCard, setShouldDisplayCard] = useState(false); const abTestAPI = useAB()?.api; From 0c2893cb0b650bc361ee97fa7310d5283f4b7388 Mon Sep 17 00:00:00 2001 From: Dominik Lander Date: Tue, 15 Oct 2024 16:13:25 +0100 Subject: [PATCH 5/7] add link tracking --- dotcom-rendering/src/components/ExpandableMarketingCard.tsx | 3 +++ 1 file changed, 3 insertions(+) diff --git a/dotcom-rendering/src/components/ExpandableMarketingCard.tsx b/dotcom-rendering/src/components/ExpandableMarketingCard.tsx index 8cc99e0f5bb..dde37329e26 100644 --- a/dotcom-rendering/src/components/ExpandableMarketingCard.tsx +++ b/dotcom-rendering/src/components/ExpandableMarketingCard.tsx @@ -219,6 +219,7 @@ export const ExpandableMarketingCard = ({ styles={imageTopStyles} />

{heading}

Date: Tue, 15 Oct 2024 16:14:14 +0100 Subject: [PATCH 6/7] ensure animation ends off screen. fix typo --- .../components/ExpandableMarketingCardWrapper.importable.tsx | 4 ++-- dotcom-rendering/src/layouts/CommentLayout.tsx | 2 +- dotcom-rendering/src/layouts/ImmersiveLayout.tsx | 2 +- dotcom-rendering/src/layouts/ShowcaseLayout.tsx | 2 +- dotcom-rendering/src/layouts/StandardLayout.tsx | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/dotcom-rendering/src/components/ExpandableMarketingCardWrapper.importable.tsx b/dotcom-rendering/src/components/ExpandableMarketingCardWrapper.importable.tsx index b729cf7fbf7..006220d3dbf 100644 --- a/dotcom-rendering/src/components/ExpandableMarketingCardWrapper.importable.tsx +++ b/dotcom-rendering/src/components/ExpandableMarketingCardWrapper.importable.tsx @@ -38,11 +38,11 @@ const stickyContainerStyles = css` position: sticky; top: 0; ${getZIndex('expandableMarketingCardOverlay')}; - animation: slidein 2s normal; + animation: slidein 2.5s linear; @keyframes slidein { from { - translate: -800px 0; + translate: -1200px 0; } to { diff --git a/dotcom-rendering/src/layouts/CommentLayout.tsx b/dotcom-rendering/src/layouts/CommentLayout.tsx index 660afd560a3..bba543f4b72 100644 --- a/dotcom-rendering/src/layouts/CommentLayout.tsx +++ b/dotcom-rendering/src/layouts/CommentLayout.tsx @@ -606,7 +606,7 @@ export const CommentLayout = (props: WebProps | AppsProps) => { priority="enhancement" /** * We display the card immediately if the viewport is below the top of - * the article body, so we must use "idled" instead of "visible". + * the article body, so we must use "idle" instead of "visible". */ defer={{ until: 'idle' }} > diff --git a/dotcom-rendering/src/layouts/ImmersiveLayout.tsx b/dotcom-rendering/src/layouts/ImmersiveLayout.tsx index 082fcdb1372..4654b9256c2 100644 --- a/dotcom-rendering/src/layouts/ImmersiveLayout.tsx +++ b/dotcom-rendering/src/layouts/ImmersiveLayout.tsx @@ -686,7 +686,7 @@ export const ImmersiveLayout = (props: WebProps | AppProps) => { priority="enhancement" /** * We display the card immediately if the viewport is below the top of - * the article body, so we must use "idled" instead of "visible". + * the article body, so we must use "idle" instead of "visible". */ defer={{ until: 'idle' }} > diff --git a/dotcom-rendering/src/layouts/ShowcaseLayout.tsx b/dotcom-rendering/src/layouts/ShowcaseLayout.tsx index 33e1e96c04a..7b1b281a22b 100644 --- a/dotcom-rendering/src/layouts/ShowcaseLayout.tsx +++ b/dotcom-rendering/src/layouts/ShowcaseLayout.tsx @@ -586,7 +586,7 @@ export const ShowcaseLayout = (props: WebProps | AppsProps) => { priority="enhancement" /** * We display the card immediately if the viewport is below the top of - * the article body, so we must use "idled" instead of "visible". + * the article body, so we must use "idle" instead of "visible". */ defer={{ until: 'idle' }} > diff --git a/dotcom-rendering/src/layouts/StandardLayout.tsx b/dotcom-rendering/src/layouts/StandardLayout.tsx index e960adaff15..1ac626aa308 100644 --- a/dotcom-rendering/src/layouts/StandardLayout.tsx +++ b/dotcom-rendering/src/layouts/StandardLayout.tsx @@ -738,7 +738,7 @@ export const StandardLayout = (props: WebProps | AppProps) => { priority="enhancement" /** * We display the card immediately if the viewport is below the top of - * the article body, so we must use "idled" instead of "visible". + * the article body, so we must use "idle" instead of "visible". */ defer={{ until: 'idle' }} > From f5e3d90372d1f83b652f01bb903bdc014d12209a Mon Sep 17 00:00:00 2001 From: Dominik Lander Date: Fri, 18 Oct 2024 10:10:55 +0100 Subject: [PATCH 7/7] Use transform over transition --- .../ExpandableMarketingCardWrapper.importable.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/dotcom-rendering/src/components/ExpandableMarketingCardWrapper.importable.tsx b/dotcom-rendering/src/components/ExpandableMarketingCardWrapper.importable.tsx index 006220d3dbf..0c59df7bcde 100644 --- a/dotcom-rendering/src/components/ExpandableMarketingCardWrapper.importable.tsx +++ b/dotcom-rendering/src/components/ExpandableMarketingCardWrapper.importable.tsx @@ -38,15 +38,15 @@ const stickyContainerStyles = css` position: sticky; top: 0; ${getZIndex('expandableMarketingCardOverlay')}; - animation: slidein 2.5s linear; + animation: slidein 2.4s linear; @keyframes slidein { from { - translate: -1200px 0; + transform: translateX(-1200px); } to { - translate: 0 0; + transform: translateX(0); } } `;