Skip to content

Commit 7d2975c

Browse files
DS-1475 DS-1476 DS-1461 | Local header, mega menu, submenu continued from Eric's work in #491 (#493)
* DS-1459: WIP Adding headers * DS-1411: WIP Add mega menu * Leave most search related things out of this PR for now * Remove react-loading-skeleton and simplify loading component * header styles WIP; use storyblok preview editor token for editor route * more styles WIP * Install headlessUI; add breakpoints; mega menu panel stules * Use headless UI for menu panels * WIP styles * Use headlessUI for mobile hamburger * import storyblokEditable etc from rsc directory; menu card styles * Page component clean up * Fix MediaWrapper error * Update nextjs to 15.3.3 * Update Storyblok packages * test * Update storyblokprovider to use token from URL * resolve link = url for getStoryData; update storyblok packages * Remove useFocusTrap hook since we have headlessUI for modals - this hook is problematic to begin with * Submenu styles * Mega menu link group styles * Use CtaLink for top level links * cta and logo updates * responsive styles * More styles and responsive * Clean up * Add adr for keeping long funky storyblok keys * Update active link comparison * separate out search button styles; more margin to local footer heading --------- Co-authored-by: Eric Bakenhus <1059679+ericbakenhus@users.noreply.github.com>
1 parent 5503b7e commit 7d2975c

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

48 files changed

+1285
-87
lines changed

app/layout.tsx

Lines changed: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import localFont from 'next/font/local';
44
import './globals.css';
55
import { FlexBox } from '@/components/FlexBox';
66
import { GAProvider, GTAG } from '@/components/GAProvider';
7+
import { SearchModalProvider } from '@/components/Search/Modal/SearchModalContext';
78

89
type LayoutProps = {
910
children: React.ReactNode,
@@ -30,22 +31,24 @@ const stanford = localFont({
3031
const RootLayout = ({ children }: LayoutProps) => {
3132
return (
3233
<GAProvider>
33-
<html
34-
lang="en"
35-
className={cnb(
36-
source_sans.variable,
37-
source_serif.variable,
38-
stanford.variable,
39-
)}
40-
>
41-
{/* Absolutely necessary to have a body tag here, otherwise your components won't get any interactivity */}
42-
<body>
43-
<GTAG />
44-
<FlexBox justifyContent="between" direction="col" className="min-h-screen relative">
45-
{children}
46-
</FlexBox>
47-
</body>
48-
</html>
34+
<SearchModalProvider>
35+
<html
36+
lang="en"
37+
className={cnb(
38+
source_sans.variable,
39+
source_serif.variable,
40+
stanford.variable,
41+
)}
42+
>
43+
{/* Absolutely necessary to have a body tag here, otherwise your components won't get any interactivity */}
44+
<body>
45+
<GTAG />
46+
<FlexBox justifyContent="between" direction="col" className="min-h-screen relative">
47+
{children}
48+
</FlexBox>
49+
</body>
50+
</html>
51+
</SearchModalProvider>
4952
</GAProvider>
5053
);
5154
};

components/Cta/Cta.styles.ts

Lines changed: 21 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { type CtaIconLeftMarginType } from './Cta.types';
22

33
export const cta = 'group/cta transition-all';
4-
export const buttonBase = 'block font-normal w-fit no-underline hocus:underline leading-tight';
4+
export const buttonBase = 'block cta-button font-normal w-fit no-underline hocus:underline leading-tight';
55
// hocus to plum dark gradient instead of solid plum dark to avoid a flash of white background on hocus
66
export const gradientButtonBase = 'bg-gradient-to-tr hocus:from-plum-dark hocus:to-plum-dark text-white hocus:text-white';
77
export const textLinkBase = 'block font-semibold w-fit no-underline text-18 md:text-20 leading-tight';
@@ -32,8 +32,9 @@ export const ctaButtonStyles = {
3232

3333
// Maps to linkTextColor prop in SbCtaLink. Only used for the text link style.
3434
export const ctaTextColors = {
35-
'su-text-digital-red su-after-bg-digital-red su-text-hocus-sky-dark su-after-bg-hocus-sky-dark': 'text-digital-red hocus:text-sky-dark',
36-
'su-text-white su-text-hocus-white su-hocus-underline su-after-bg-white su-after-bg-hocus-white': 'text-white hocus:text-white',
35+
// The hocus color for this is actually sky-dark, so ignore the mismatch in the key
36+
'su-text-digital-red su-after-bg-digital-red su-text-hocus-plum-dark su-after-bg-hocus-plum-dark': 'text-digital-red hocus:text-sky-dark hocus:underline',
37+
'su-text-white su-text-hocus-white su-hocus-underline su-after-bg-white su-after-bg-hocus-white': 'text-white hocus:text-white hocus:underline',
3738
// Gradient text links for Campaign pages
3839
'ood-cta__link-gradient su-bg-sky-dark-to-bay-dark su-after-bg-sky-dark-to-bay-dark': `${gradientTextLinkBase} from-sky-dark to-bay-dark *:[&_svg]:text-bay-dark *:[&_svg]:hocus:text-bay-dark`,
3940
'ood-cta__link-gradient su-bg-cardinal-dark-to-spirited-dark su-after-bg-cardinal-dark-to-spirited-dark': `${gradientTextLinkBase} from-cardinal-red-dark to-spirited-dark *:[&_svg]:text-spirited-dark *:[&_svg]:hocus:text-spirited-dark`,
@@ -47,20 +48,26 @@ export const ctaTextColors = {
4748
* Campaign page only solid text colors - seems on live site the intent was to use plum-dark as the hocus color, but it was overridden by the base link hocus color
4849
* Here we honor the original intent by using plum-dark as the hocus color
4950
*/
50-
'su-text-lagunita-dark su-after-bg-lagunita-dark su-text-hocus-plum-dark su-after-bg-hocus-plum-dark': 'text-lagunita-dark hocus:text-plum-dark',
51-
'su-text-palo-verde su-after-bg-palo-verde su-text-hocus-plum-dark su-after-bg-hocus-plum-dark': 'text-palo-verde hocus:text-plum-dark',
52-
'su-text-plum su-after-bg-plum su-text-hocus-plum-dark su-after-bg-hocus-plum-dark': 'text-plum hocus:text-plum-dark',
53-
'su-text-brick su-after-bg-brick su-text-hocus-plum-dark su-after-bg-hocus-plum-dark': 'text-brick hocus:text-plum-dark',
54-
'su-text-cardinal-red su-after-bg-cardinal-red su-text-hocus-plum-dark su-after-bg-hocus-plum-dark': 'text-cardinal-red hocus:text-plum-dark',
55-
'su-text-palo-alto su-after-bg-palo-alto su-text-hocus-plum-dark su-after-bg-hocus-plum-dark': 'text-palo-alto hocus:text-plum-dark',
56-
'su-text-bay-dark su-after-bg-bay-dark su-text-hocus-plum-dark su-after-bg-hocus-plum-dark': 'text-bay-dark hocus:text-plum-dark',
57-
'su-text-sky-dark su-after-bg-sky-dark su-text-hocus-plum-dark su-after-bg-hocus-plum-dark': 'text-sky-dark hocus:text-plum-dark',
58-
'su-text-lagunita su-after-bg-lagunita su-text-hocus-plum-dark su-after-bg-hocus-plum-dark': 'text-lagunita hocus:text-plum-dark',
51+
'su-text-lagunita-dark su-after-bg-lagunita-dark su-text-hocus-plum-dark su-after-bg-hocus-plum-dark': 'text-lagunita-dark hocus:text-plum-dark hocus:underline',
52+
'su-text-palo-verde su-after-bg-palo-verde su-text-hocus-plum-dark su-after-bg-hocus-plum-dark': 'text-palo-verde hocus:text-plum-dark hocus:underline',
53+
'su-text-plum su-after-bg-plum su-text-hocus-plum-dark su-after-bg-hocus-plum-dark': 'text-plum hocus:text-plum-dark hocus:underline',
54+
'su-text-brick su-after-bg-brick su-text-hocus-plum-dark su-after-bg-hocus-plum-dark': 'text-brick hocus:text-plum-dark hocus:underline',
55+
'su-text-cardinal-red su-after-bg-cardinal-red su-text-hocus-plum-dark su-after-bg-hocus-plum-dark': 'text-cardinal-red hocus:text-plum-dark hocus:underline',
56+
'su-text-palo-alto su-after-bg-palo-alto su-text-hocus-plum-dark su-after-bg-hocus-plum-dark': 'text-palo-alto hocus:text-plum-dark hocus:underline',
57+
'su-text-bay-dark su-after-bg-bay-dark su-text-hocus-plum-dark su-after-bg-hocus-plum-dark': 'text-bay-dark hocus:text-plum-dark hocus:underline',
58+
'su-text-sky-dark su-after-bg-sky-dark su-text-hocus-plum-dark su-after-bg-hocus-plum-dark': 'text-sky-dark hocus:text-plum-dark hocus:underline',
59+
'su-text-lagunita su-after-bg-lagunita su-text-hocus-plum-dark su-after-bg-hocus-plum-dark': 'text-lagunita hocus:text-plum-dark hocus:underline',
5960
};
6061

6162
// Additional CTA variants we use for this site, e.g., as subcomponents for other components. These include styles for sizes, colors, icon styles, and other properties.
6263
export const ctaVariants = {
6364
'local-footer': 'text-digital-red hocus:text-black underline leading-snug font-normal text-16 md:text-18 *:[&_svg]:hocus:text-digital-red',
65+
// Text links in the sub menu
66+
'sub-menu': 'text-14 sm:text-16 py-6 md:py-10 text-white leading-[4rem] md:leading-cozy hocus:text-white md:text-cool-grey md:hocus:text-digital-red font-normal no-underline hocus:underline',
67+
// For top level mega menu links
68+
'mega-menu': 'relative flex w-full lg:w-fit text-20 lg:text-21 px-20 sm:px-30 md:px-50 py-16 lg:px-0 font-semibold leading-cozy no-underline hocus:underline lg:hocus:no-underline text-black hocus:text-digital-red before:absolute before:inline-block before:w-6 md:before:w-10 before:h-full before:left-0 before:bottom-0 before:hocus:bg-digital-red before:scale-y-0 before:transition-all hocus:before:scale-y-100 lg:before:h-10 lg:before:w-full before:left-0 before:bottom-0 lg:before:scale-y-100 lg:before:scale-x-0 lg:hocus:before:scale-x-100 outline-none',
69+
// For mega men links inside dropdown panels/sections
70+
'mega-menu-link-lvl2': 'text-black hocus:text-digital-red no-underline hocus:underline leading-display font-normal text-19 *:[&_svg]:text-digital-red',
6471
};
6572

6673
// Maps to linkButtonSize prop in SbCtaLink. Only used for the button styles
@@ -89,6 +96,7 @@ export const icon = 'inline-block will-change-transform transition-transform str
8996
export const iconLeftMarginDefault = 'ml-04em';
9097
export const iconLeftMargin: CtaIconLeftMarginType = {
9198
'su-link--action': 'ml-03em',
99+
'su-link--external': 'ml-03em',
92100
};
93101

94102
// Maps to linkIcon prop in SbCtaLink. Animation preselected based on the icon type
@@ -108,4 +116,4 @@ export const ctaAligns = {
108116
right: 'su-text-right ml-auto mr-0',
109117
};
110118

111-
export const ctaGroup = 'list-unstyled gap-x-08em gap-y-1em [&_li]:mb-0 [&_a]:text-09em [&_a]:md:text-20 [&_a]:p-07em [&_a]:md:pt-11 [&_a]:md:pb-12 [&_a]:md:px-30';
119+
export const ctaGroup = 'list-unstyled gap-x-08em gap-y-1em [&_li]:mb-0 [&_a]:text-09em [&_a]:md:text-20 [&_.cta-button]:p-07em [&_.cta-button]:md:pt-11 [&_.cta-button]:md:pb-12 [&_.cta-button]:md:px-30';

components/Cta/CtaButton.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ export const CtaButton = React.forwardRef<HTMLButtonElement, CtaButtonProps>((pr
1414
isButton,
1515
buttonStyle = 'ood-cta__button--primary su-after-bg-white',
1616
buttonSize = 'default',
17-
textColor = 'su-text-digital-red su-after-bg-digital-red su-text-hocus-sky-dark su-after-bg-hocus-sky-dark',
17+
textColor = 'su-text-digital-red su-after-bg-digital-red su-text-hocus-plum-dark su-after-bg-hocus-plum-dark',
1818
variant,
1919
align,
2020
icon,

components/Cta/CtaContent.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import * as types from './Cta.types';
77
type CtaContentProps = Omit<types.CtaCommonProps, 'buttonSize' | 'textColor'>;
88

99
export const CtaContent = ({
10-
icon = 'su-link--action',
10+
icon,
1111
iconProps,
1212
srText,
1313
children,

components/Cta/CtaExternalLink.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ export const CtaExternalLink = React.forwardRef<HTMLAnchorElement, CtaExternalLi
1919
isButton,
2020
buttonStyle = 'ood-cta__button--primary su-after-bg-white',
2121
buttonSize = 'default',
22-
textColor = 'su-text-digital-red su-after-bg-digital-red su-text-hocus-sky-dark su-after-bg-hocus-sky-dark',
22+
textColor = 'su-text-digital-red su-after-bg-digital-red su-text-hocus-plum-dark su-after-bg-hocus-plum-dark',
2323
variant,
2424
icon,
2525
iconProps,

components/Cta/CtaLink.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ export type CtaLinkProps = Omit<LinkProps, 'href'> & React.ComponentPropsWithout
1515
sbLink?: SbLinkType;
1616
href?: string;
1717
rel?: string;
18+
slug?: string;
1819
};
1920

2021
export const CtaLink = React.forwardRef<HTMLAnchorElement, CtaLinkProps>(

components/Cta/CtaNextLink.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ export const CtaNextLink = React.forwardRef<HTMLAnchorElement, CtaNextLinkProps>
2020
isButton,
2121
buttonStyle = 'ood-cta__button--primary su-after-bg-white',
2222
buttonSize = 'default',
23-
textColor = 'su-text-digital-red su-after-bg-digital-red su-text-hocus-sky-dark su-after-bg-hocus-sky-dark',
23+
textColor = 'su-text-digital-red su-after-bg-digital-red su-text-hocus-plum-dark su-after-bg-hocus-plum-dark',
2424
variant,
2525
icon,
2626
iconProps,

components/HeroIcon/HeroIcon.styles.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ import {
2424
VideoCameraIcon,
2525
XMarkIcon,
2626
} from '@heroicons/react/24/outline';
27-
import { CheckIcon, LockClosedIcon as SolidLockClosedIcon } from '@heroicons/react/16/solid';
27+
import { CheckIcon, MagnifyingGlassIcon } from '@heroicons/react/16/solid';
2828
import { PlayIcon, PauseIcon } from '@heroicons/react/20/solid';
2929

3030
export const iconMap = {
@@ -51,7 +51,6 @@ export const iconMap = {
5151
link: LinkIcon,
5252
location: MapPinIcon,
5353
lock: LockClosedIcon,
54-
'lock-solid': SolidLockClosedIcon,
5554
menu: Bars3Icon,
5655
minus: MinusIcon,
5756
more: ArrowRightIcon,
@@ -60,6 +59,7 @@ export const iconMap = {
6059
'play-outline': PlayCircleIcon,
6160
plus: PlusIcon,
6261
right: ArrowRightIcon,
62+
search: MagnifyingGlassIcon,
6363
up: ArrowUpIcon,
6464
video: VideoCameraIcon,
6565
};
@@ -80,7 +80,7 @@ export const iconBaseStyleDefault = 'w-1em';
8080
export const iconBaseStyle: IconBaseStyleType = {
8181
'arrow-left': 'w-09em -mt-01em',
8282
'arrow-right': 'w-09em -mt-01em',
83-
'chevron-right': 'w-09em -mt-01em',
83+
'chevron-right': 'w-09em stroke-[2.5] -mt-01em',
8484
download: 'w-09em -mt-01em',
8585
expand: 'w-1em -mt-02em',
8686
external: 'w-08em stroke-[2.5] -mt-01em',

components/Logo/LogoLockup.styles.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
export const root = 'no-underline inline-block font-normal';
2-
export const contentWrapper = 'flex-col sm:flex-row items-start sm:items-center';
3-
export const logo = 'text-19 sm:text-[1.43em] leading-half mt-[0.27em]';
4-
export const bar = 'hidden sm:block w-1 h-1em mx-03em';
5-
export const text = 'text-15 sm:text-[1.05em] mt-03em -ml-01em sm:ml-0';
1+
export const root = 'flex no-underline font-normal w-fit';
2+
export const contentWrapper = 'flex-row items-center';
3+
export const logo = 'text-[1.43em] leading-half mt-[0.27em]';
4+
export const bar = 'block w-1 h-1em mx-03em md:mx-02em';
5+
export const text = 'text-[1.05em] mt-03em -ml-01em ml-0';
66
export const textColors = {
77
default: 'text-black',
88
white: 'text-white',

components/Logo/LogoLockup.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
1-
import React from 'react';
2-
import { type ClassValue, cnb } from 'cnbuilder';
1+
import { cnb } from 'cnbuilder';
32
import Link from 'next/link';
43
import { FlexBox } from '@/components/FlexBox';
5-
import { StanfordLogo } from './StanfordLogo';
4+
import { StanfordLogo } from '@/components/StanfordLogo';
65
import * as styles from './LogoLockup.styles';
76

87
/**
@@ -12,7 +11,8 @@ type LogoLockupProps = {
1211
text: string;
1312
isLink?: boolean;
1413
color?: styles.LogoTextColorType;
15-
className?: ClassValue;
14+
// TW font size classes can be added to scale the logo at different breakpoints
15+
className?: string;
1616
}
1717

1818
export const LogoLockup = ({

components/Media/MediaWrapper.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ export const MediaWrapper = ({
3737
{...props}
3838
>
3939
<div className={cnb(styles.wrapper(imageWidth), storyImageWidths[imageWidth])}>
40-
<div className={imageWidth === 'su-w-full' && 'h-[30vw]'}>
40+
<div className={imageWidth === 'su-w-full' ? 'h-[30vw]' : ''}>
4141
{children}
4242
</div>
4343
{caption && (
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
'use client';
2+
import React, { useContext } from 'react';
3+
import SearchModalContext from './SearchModalContext';
4+
import { HeroIcon } from '@/components/HeroIcon';
5+
import * as styles from '../Search.styles';
6+
7+
export const OpenSearchModalButton = React.forwardRef<HTMLButtonElement, { id: string }>(({ id }, ref) => {
8+
const { open } = useContext(SearchModalContext);
9+
10+
return (
11+
<button
12+
data-test="search--nav-bar"
13+
type="button"
14+
className={styles.searchButton}
15+
aria-label="Search Giving"
16+
onClick={open}
17+
id={id}
18+
ref={ref}
19+
>
20+
<span className={styles.searchButtonText}>
21+
Search
22+
</span>
23+
<HeroIcon
24+
icon="search"
25+
aria-hidden="true"
26+
className={styles.searchButtonIcon}
27+
/>
28+
</button>
29+
);
30+
});
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
'use client';
2+
3+
import React, { createContext, useState, useRef } from 'react';
4+
import { useEscape } from '@/hooks/useEscape';
5+
import { useDisplay } from '@/hooks/useDisplay';
6+
7+
type SearchModalContextProps = {
8+
isOpen: boolean;
9+
open: () => void;
10+
close: () => void;
11+
desktopButtonRef: React.RefObject<HTMLButtonElement>;
12+
mobileButtonRef: React.RefObject<HTMLButtonElement>;
13+
modalSearchInputRef: React.RefObject<HTMLInputElement>;
14+
searchInputRef: React.RefObject<HTMLInputElement>;
15+
};
16+
17+
/**
18+
* A context to manage the state of the search modal.
19+
*/
20+
const SearchModalContext = createContext<SearchModalContextProps>({
21+
isOpen: false,
22+
open: () => null,
23+
close: () => null,
24+
desktopButtonRef: null,
25+
mobileButtonRef: null,
26+
modalSearchInputRef: null,
27+
searchInputRef: null,
28+
});
29+
export const SearchModalContextProvider = SearchModalContext.Provider;
30+
export default SearchModalContext;
31+
32+
/**
33+
* A provider to manage the state of the search modal.
34+
* @param {Object} props
35+
* @param {React.ReactNode} props.children
36+
*/
37+
export function SearchModalProvider({ children }: { children: React.ReactElement }) {
38+
const { showDesktop, showMobile } = useDisplay();
39+
const [isOpen, setIsOpen] = useState(false);
40+
const desktopButtonRef = useRef<HTMLButtonElement>(null);
41+
const mobileButtonRef = useRef<HTMLButtonElement>(null);
42+
const modalSearchInputRef = useRef<HTMLInputElement>(null);
43+
const searchInputRef = useRef<HTMLInputElement>(null);
44+
45+
// Close handler.
46+
const close = () => {
47+
setIsOpen(false);
48+
if (showDesktop) desktopButtonRef.current.focus();
49+
if (showMobile) mobileButtonRef.current.focus();
50+
};
51+
52+
// Open handler.
53+
const open = () => {
54+
// Don't open the modal if the user is already on the search page.
55+
// Instead focus on the search input.
56+
if (
57+
window
58+
&& window.location
59+
&& window.location.pathname.startsWith('/search')
60+
) {
61+
searchInputRef.current.focus();
62+
searchInputRef.current.scrollIntoView();
63+
return;
64+
}
65+
66+
setIsOpen(true);
67+
};
68+
69+
// Close the modal when the escape key is pressed.
70+
useEscape(() => {
71+
if (isOpen) close();
72+
});
73+
74+
// Provider wrapper.
75+
return (
76+
<SearchModalContextProvider
77+
value={{
78+
isOpen,
79+
open,
80+
close,
81+
desktopButtonRef,
82+
mobileButtonRef,
83+
modalSearchInputRef,
84+
searchInputRef,
85+
}}
86+
>
87+
{children}
88+
</SearchModalContextProvider>
89+
);
90+
}

components/Search/Search.styles.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
/**
2+
* Search button
3+
*/
4+
export const searchButton = 'relative ml-auto shrink-0 xl:-top-6 h-40 w-40 xl:w-fit text-digital-red hocus:text-cardinal-red rounded-full xl:text-20 xl:px-20 border border-black-30 hocus:bg-black-10 transition-colors';
5+
export const searchButtonText = 'sr-only xl:not-sr-only leading-none xl:mr-6';
6+
export const searchButtonIcon = 'inline-block relative -top-1 w-22 lg:w-20 h-18';

components/Storyblok/ComponentNotFound.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { type SbBlokData } from '@storyblok/react/rsc';
22

3-
type ComponentNotFoundProps = {
4-
component: {
3+
type ComponentNotFoundProps = {
4+
component: {
55
blok: SbBlokData;
66
};
77
}

components/Storyblok/SbCampaignHeader.tsx

Whitespace-only changes.

components/Storyblok/SbCampaignPage.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ export type SbCampaignPageProps = CampaignHeaderProps & IconCardSectionProps & F
99
blok: SbBlokData & {
1010
alertPicker: SbBlokData[];
1111
content: SbBlokData[];
12-
}
12+
};
1313
};
1414

1515
export const SbCampaignPage = (props: SbCampaignPageProps) => (

0 commit comments

Comments
 (0)