UNCLASSIFIED

Commit 9a2ea167 authored by Ben Wynn's avatar Ben Wynn
Browse files

Merge branch 'develop' into 'staging'

content updates from UAT, gtag, hero updates

See merge request !21
parents 801b1a47 34cfac29
Pipeline #214200 passed with stages
in 7 minutes and 27 seconds
...@@ -46,6 +46,14 @@ module.exports = { ...@@ -46,6 +46,14 @@ module.exports = {
}, },
}, },
`gatsby-plugin-force-trailing-slashes`, `gatsby-plugin-force-trailing-slashes`,
{
resolve: `gatsby-plugin-google-gtag`,
options: {
trackingIds: [
'G-JKZWCK5K3P', // Google Analytics / GA
],
},
},
// this (optional) plugin enables Progressive Web App + Offline functionality // this (optional) plugin enables Progressive Web App + Offline functionality
// To learn more, visit: https://gatsby.dev/offline // To learn more, visit: https://gatsby.dev/offline
// `gatsby-plugin-offline`, // `gatsby-plugin-offline`,
......
...@@ -8585,6 +8585,15 @@ ...@@ -8585,6 +8585,15 @@
"webpack-assets-manifest": "^3.1.1" "webpack-assets-manifest": "^3.1.1"
} }
}, },
"gatsby-plugin-google-gtag": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/gatsby-plugin-google-gtag/-/gatsby-plugin-google-gtag-3.2.0.tgz",
"integrity": "sha512-NmKv9bRkdxgmkGUIpK1Tk0sgnggU6WDY+oH+nQG1+gs1yJqW6g1d3zzFKf/m0c5A/44Eqb7f+6h8PTjIL/XoVw==",
"requires": {
"@babel/runtime": "^7.12.5",
"minimatch": "^3.0.4"
}
},
"gatsby-plugin-manifest": { "gatsby-plugin-manifest": {
"version": "2.12.1", "version": "2.12.1",
"resolved": "https://registry.npmjs.org/gatsby-plugin-manifest/-/gatsby-plugin-manifest-2.12.1.tgz", "resolved": "https://registry.npmjs.org/gatsby-plugin-manifest/-/gatsby-plugin-manifest-2.12.1.tgz",
......
...@@ -2,6 +2,16 @@ import React from 'react'; ...@@ -2,6 +2,16 @@ import React from 'react';
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import { Text, Box } from 'grommet'; import { Text, Box } from 'grommet';
const levelLabels = {
U: 'Controlled Unclassified Information',
S: 'Secret',
'S-SAR': 'Secret//Special Access Required',
'S-SCI': 'Secret//Sensitive Compartmented Information',
TS: 'Top Secret',
'TS-SAR': 'Top Secret//Special Access Required',
'TS-SCI': 'Top Secret//Sensitive Compartmented Information',
};
const LevelNode = ({ levels, value, children }) => { const LevelNode = ({ levels, value, children }) => {
const matchingLevel = levels?.includes(value); const matchingLevel = levels?.includes(value);
const nodeStyles = { const nodeStyles = {
...@@ -22,7 +32,7 @@ const LevelNode = ({ levels, value, children }) => { ...@@ -22,7 +32,7 @@ const LevelNode = ({ levels, value, children }) => {
}; };
return ( return (
<Box {...nodeStyles}> <Box {...nodeStyles} a11yTitle={levelLabels[value]}>
<Text size="small" {...textStyles}> <Text size="small" {...textStyles}>
{children} {children}
</Text> </Text>
...@@ -30,51 +40,55 @@ const LevelNode = ({ levels, value, children }) => { ...@@ -30,51 +40,55 @@ const LevelNode = ({ levels, value, children }) => {
); );
}; };
const Classification = ({ levels }) => ( const Classification = ({ levels, serviceName }) => {
<Box const supportedLevels = levels.map((item) => levelLabels[item]).join(', ');
direction="row" return (
align="start"
style={{ minWidth: '380px', maxWidth: '500px' }}
>
<Box <Box
border={{ size: 'small', side: 'bottom', color: 'light-1' }}
flex="grow"
direction="row" direction="row"
align="start"
style={{ minWidth: '380px', maxWidth: '500px' }}
a11yTitle={`Classification levels supported by ${serviceName}: ${supportedLevels}`}
> >
<Box <Box
direction="row" border={{ size: 'small', side: 'bottom', color: 'light-1' }}
align="center"
gap="xsmall"
justify="between"
pad={{ vertical: 'small' }}
flex="grow" flex="grow"
border={{ size: 'xsmall', side: 'top', color: 'light-1' }} direction="row"
> >
<LevelNode levels={levels} value="U"> <Box
CUI direction="row"
</LevelNode> align="center"
<LevelNode levels={levels} value="S"> gap="xsmall"
S justify="between"
</LevelNode> pad={{ vertical: 'small' }}
<LevelNode levels={levels} value="S-SAR"> flex="grow"
S//SAR border={{ size: 'xsmall', side: 'top', color: 'light-1' }}
</LevelNode> >
<LevelNode levels={levels} value="S-SCI"> <LevelNode levels={levels} value="U">
S//SCI CUI
</LevelNode> </LevelNode>
<LevelNode levels={levels} value="TS"> <LevelNode levels={levels} value="S">
TS S
</LevelNode> </LevelNode>
<LevelNode levels={levels} value="TS-SAR"> <LevelNode levels={levels} value="S-SAR">
TS//SAR S//SAR
</LevelNode> </LevelNode>
<LevelNode levels={levels} value="TS-SCI"> <LevelNode levels={levels} value="S-SCI">
TS//SCI S//SCI
</LevelNode> </LevelNode>
<LevelNode levels={levels} value="TS">
TS
</LevelNode>
<LevelNode levels={levels} value="TS-SAR">
TS//SAR
</LevelNode>
<LevelNode levels={levels} value="TS-SCI">
TS//SCI
</LevelNode>
</Box>
</Box> </Box>
</Box> </Box>
</Box> );
); };
Classification.propTypes = { Classification.propTypes = {
level: PropTypes.arrayOf([ level: PropTypes.arrayOf([
...@@ -86,6 +100,7 @@ Classification.propTypes = { ...@@ -86,6 +100,7 @@ Classification.propTypes = {
'TS-SAR', 'TS-SAR',
'TS-SCI', 'TS-SCI',
]), ]),
serviceName: PropTypes.string,
}; };
export default Classification; export default Classification;
...@@ -144,6 +144,7 @@ const ContactForm = ({ onClose }) => { ...@@ -144,6 +144,7 @@ const ContactForm = ({ onClose }) => {
<PrimaryButton <PrimaryButton
pad={{ vertical: 'large' }} pad={{ vertical: 'large' }}
type="submit" type="submit"
a11yTitle="Submit"
label="Submit" label="Submit"
style={{ width: onClose ? '250px' : '100%' }} style={{ width: onClose ? '250px' : '100%' }}
/> />
......
...@@ -17,6 +17,7 @@ const DownHex = () => ( ...@@ -17,6 +17,7 @@ const DownHex = () => (
align="center" align="center"
justify="center" justify="center"
style={{ position: 'relative', overflow: 'hidden' }} style={{ position: 'relative', overflow: 'hidden' }}
aria-hidden="true"
> >
<DtHex <DtHex
color="white" color="white"
......
...@@ -26,7 +26,11 @@ const FeedbackFooter = () => { ...@@ -26,7 +26,11 @@ const FeedbackFooter = () => {
pad="medium" pad="medium"
gap="medium" gap="medium"
> >
<Box justify="center" align={isMobile ? 'center' : 'start'}> <Box
justify="center"
align={isMobile ? 'center' : 'start'}
aria-hidden="true"
>
<Text weight="bold">We could use your help!</Text> <Text weight="bold">We could use your help!</Text>
<Text size="small"> <Text size="small">
Send us feedback on this website or, better, Send us feedback on this website or, better,
...@@ -36,10 +40,12 @@ const FeedbackFooter = () => { ...@@ -36,10 +40,12 @@ const FeedbackFooter = () => {
</Box> </Box>
<Box border={{ side: 'right', size: 'xsmall', color: 'light-1' }} /> <Box border={{ side: 'right', size: 'xsmall', color: 'light-1' }} />
<Box justify="center" align="center"> <Box justify="center" align="center">
<Box width="200px"> <Box width="200px" aria-hidden="true">
<SecondaryButton <SecondaryButton
label="CUSTOMER FEEDBACK" label="CUSTOMER FEEDBACK"
onClick={handleToggleOpen} onClick={handleToggleOpen}
aria-haspopup="dialog"
aria-expanded={isOpen ? true : false}
/> />
</Box> </Box>
</Box> </Box>
......
...@@ -136,6 +136,7 @@ const FeedbackForm = ({ onClose }) => { ...@@ -136,6 +136,7 @@ const FeedbackForm = ({ onClose }) => {
<PrimaryButton <PrimaryButton
pad={{ vertical: 'large' }} pad={{ vertical: 'large' }}
type="submit" type="submit"
a11yTitle="Submit"
label="Submit" label="Submit"
style={{ width: '250px' }} style={{ width: '250px' }}
/> />
......
...@@ -18,6 +18,7 @@ const Footer = () => { ...@@ -18,6 +18,7 @@ const Footer = () => {
justify="between" justify="between"
direction={isMobile ? 'column' : 'row'} direction={isMobile ? 'column' : 'row'}
gap="large" gap="large"
aria-hidden="true"
> >
<Box <Box
gap="medium" gap="medium"
...@@ -33,7 +34,12 @@ const Footer = () => { ...@@ -33,7 +34,12 @@ const Footer = () => {
gap="medium" gap="medium"
align="center" align="center"
> >
<img src={C3Logo} width="117" height="117" alt="C3I&N" /> <img
src={C3Logo}
width="117"
height="117"
alt="C3I & Networks Directorate logo"
/>
<AFLogo height="117" /> <AFLogo height="117" />
</Box> </Box>
</Box> </Box>
......
import React, { useContext } from 'react'; import React, { useContext } from 'react';
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import { Link } from 'gatsby'; import { Link } from 'gatsby';
import { Box, Text, Header as GHeader, ResponsiveContext } from 'grommet'; import {
Box,
Text,
Header as GHeader,
ResponsiveContext,
SkipLinks,
SkipLink,
} from 'grommet';
import styled from 'styled-components'; import styled from 'styled-components';
import { RenderPropSticky as Sticky } from 'react-sticky-el'; import { RenderPropSticky as Sticky } from 'react-sticky-el';
import { Container, Column } from '../layout'; import { Container, Column } from '../layout';
...@@ -30,6 +37,15 @@ const StyledHeader = styled(GHeader)` ...@@ -30,6 +37,15 @@ const StyledHeader = styled(GHeader)`
: theme.custom.header.height}; : theme.custom.header.height};
`; `;
const skipLinkList = [
<SkipLink
id="main-content"
label="SKIP TO CONTENT"
tabIndex={1}
color="black"
responsive={true}
/>,
];
const Header = ({ transparent }) => { const Header = ({ transparent }) => {
const size = useContext(ResponsiveContext); const size = useContext(ResponsiveContext);
const isMobile = ['xsmall', 'small'].includes(size); const isMobile = ['xsmall', 'small'].includes(size);
...@@ -59,6 +75,8 @@ const Header = ({ transparent }) => { ...@@ -59,6 +75,8 @@ const Header = ({ transparent }) => {
display: 'flex', display: 'flex',
flexDirection: 'row', flexDirection: 'row',
}} }}
aria-label="Link to homepage"
tabIndex={2}
> >
<Box <Box
as="span" as="span"
...@@ -85,6 +103,10 @@ const Header = ({ transparent }) => { ...@@ -85,6 +103,10 @@ const Header = ({ transparent }) => {
</Box> </Box>
</Link> </Link>
</Box> </Box>
<SkipLinks
children={skipLinkList}
messages={{ skipTo: undefined }}
/>
<Nav sticky={isFixed} /> <Nav sticky={isFixed} />
</Box> </Box>
</Column> </Column>
......
...@@ -25,7 +25,13 @@ const Nav = ({ sticky }) => { ...@@ -25,7 +25,13 @@ const Nav = ({ sticky }) => {
return ( return (
<> <>
{isMobile && <Button icon={<Menu />} onClick={handleToggleMenu} />} {isMobile && (
<Button
icon={<Menu />}
onClick={handleToggleMenu}
a11yTitle="Primary navigation menu"
/>
)}
{!isMobile && ( {!isMobile && (
<Box <Box
as="nav" as="nav"
...@@ -82,6 +88,9 @@ const Nav = ({ sticky }) => { ...@@ -82,6 +88,9 @@ const Nav = ({ sticky }) => {
onClick={handleToggleMenu} onClick={handleToggleMenu}
color={menuOpen ? 'black' : 'white'} color={menuOpen ? 'black' : 'white'}
style={{ textTransform: 'uppercase' }} style={{ textTransform: 'uppercase' }}
aria-expanded={menuOpen ? true : false}
tabIndex={0}
a11yTitle="available services"
> >
<Box <Box
direction="row" direction="row"
......
...@@ -25,7 +25,7 @@ const PrimaryButton = ({ label, ...rest }) => ( ...@@ -25,7 +25,7 @@ const PrimaryButton = ({ label, ...rest }) => (
<Text size="small" weight="bold"> <Text size="small" weight="bold">
{label} {label}
</Text>{' '} </Text>{' '}
<FormNext color="white" /> <FormNext color="white" aria-hidden="true" />
</Box> </Box>
</Button> </Button>
</ThemeContext.Extend> </ThemeContext.Extend>
......
...@@ -32,7 +32,7 @@ const SecondaryButton = ({ label, ...rest }) => ( ...@@ -32,7 +32,7 @@ const SecondaryButton = ({ label, ...rest }) => (
<Text size="small" weight="bold" color="black"> <Text size="small" weight="bold" color="black">
{label} {label}
</Text>{' '} </Text>{' '}
<FormNext color="accent-1" /> <FormNext color="accent-1" aria-hidden="true" />
</Box> </Box>
</Button> </Button>
</ThemeContext.Extend> </ThemeContext.Extend>
......
import React, { useState } from 'react'; import React, { useState, useContext } from 'react';
import { useStaticQuery, graphql } from 'gatsby'; import { useStaticQuery, graphql } from 'gatsby';
import Img from 'gatsby-image'; import Img from 'gatsby-image';
import { Box, Heading, Text, ThemeContext } from 'grommet'; import {
import { FormPrevious } from 'grommet-icons'; Box,
Heading,
Text,
Button,
ThemeContext,
ResponsiveContext,
} from 'grommet';
import { FormPrevious, StatusGoodSmall } from 'grommet-icons';
import DownHex from '../DownHex'; import DownHex from '../DownHex';
import { Container, Column } from '../layout'; import { Container, Column } from '../layout';
import { PrimaryButton } from '../core'; import { PrimaryButton } from '../core';
...@@ -21,40 +28,21 @@ const SlideImage = ({ image }) => ( ...@@ -21,40 +28,21 @@ const SlideImage = ({ image }) => (
<Img fluid={image.childImageSharp.fluid} style={abs} /> <Img fluid={image.childImageSharp.fluid} style={abs} />
); );
const Slide = ({ title, subtitle, core, cta, slug, logo }) => { const Slide = ({ title, subtitle, core, cta, slug, logo, isMobile, size }) => {
const thinFont = { const headingSizes = {
level: { xsmall: { fontSize: '40px', lineHeight: '40px' },
1: { small: { fontSize: '40px', lineHeight: '40px' },
font: { weight: '300' }, medium: { fontSize: '60px', lineHeight: '60px', maxWidth: '600px' },
small: { size: '100px', height: '100px' }, large: { fontSize: '80px', lineHeight: '80px' },
medium: { size: '100px', height: '100px' }, xlarge: { fontSize: '80px', lineHeight: '80px' },
large: { size: '100px', height: '100px' },
xlarge: { size: '100px', height: '100px' },
},
},
}; };
const heavyFont = {
level: {
1: {
small: { size: '80px', height: '80px' },
medium: { size: '80px', height: '80px' },
large: { size: '80px', height: '80px' },
xlarge: { size: '80px', height: '80px' },
},
},
};
const headingTheme = title === 'Summit' ? thinFont : heavyFont;
return ( return (
<Box <Box
align="start" align="start"
justify="center" justify="center"
border={{ color: 'red' }} fill="vertical"
background="green" pad={{ top: isMobile ? '0' : '80px' }}
height="100%"
pad={{ top: '80px' }}
> >
<Box width="large" gap="medium" style={{ position: 'relative' }}> <Box width="large" gap="medium" style={{ position: 'relative' }}>
{core && ( {core && (
...@@ -83,13 +71,21 @@ const Slide = ({ title, subtitle, core, cta, slug, logo }) => { ...@@ -83,13 +71,21 @@ const Slide = ({ title, subtitle, core, cta, slug, logo }) => {
)} )}
<Box gap="medium"> <Box gap="medium">
{!logo && ( {!logo && (
<ThemeContext.Extend value={{ heading: headingTheme }}> <Heading
<Heading margin="none">{title}</Heading> level={1}
</ThemeContext.Extend> margin="none"
responsive={false}
style={headingSizes[size]}
>
{title}
</Heading>
)} )}
{logo && ( {logo && (
<Box width="medium"> <Box style={{ maxWidth: '600px', maxHeight: '250px' }}>
<Img fluid={logo.childImageSharp.fluid} /> <Img
fluid={logo.childImageSharp.fluid}
imgStyle={{ objectFit: 'contain' }}
/>
</Box> </Box>
)} )}
{subtitle && ( {subtitle && (
...@@ -104,7 +100,12 @@ const Slide = ({ title, subtitle, core, cta, slug, logo }) => { ...@@ -104,7 +100,12 @@ const Slide = ({ title, subtitle, core, cta, slug, logo }) => {
</Box> </Box>
{cta && ( {cta && (
<Box direction="row" justify="start" pad={{ vertical: 'medium' }}> <Box direction="row" justify="start" pad={{ vertical: 'medium' }}>
<PrimaryButton label={cta} href={slug} style={{ width: '300px' }} /> <PrimaryButton
label={cta}
href={slug}
style={{ width: '300px' }}
a11yTitle={`Learn more about ${title}`}
/>
</Box> </Box>
)} )}
</Box> </Box>
...@@ -112,6 +113,86 @@ const Slide = ({ title, subtitle, core, cta, slug, logo }) => { ...@@ -112,6 +113,86 @@ const Slide = ({ title, subtitle, core, cta, slug, logo }) => {
); );
}; };
const HeroNav = ({ nodes, index, onSelect }) => (
<Box
style={{ position: 'absolute', right: '50px', bottom: '50px' }}
width="small"
a11yTitle="carousel"
role="navigation"
tabIndex={0}
>
{nodes.map((node, i) => (
<Box
key={node.name}
height="80px"
background="black"
border={{ color: 'dark-1', size: 'xsmall' }}
onClick={() => onSelect(i)}
style={{ position: 'relative' }}
role="button"
>
<Img
style={{ ...abs, opacity: index === i ? '100%' : '0' }}
fluid={node.thumb.childImageSharp.fluid}
/>
<Box
style={abs}
direction="row"
gap="small"
pad="small"
align="center"
a11yTitle={`Slide ${i + 1}: ${node.name}`}
>
{index !== i && <FormPrevious color="accent-1" />}
{node.thumblogo && (
<Img
fluid={node.thumblogo.childImageSharp.fluid}
imgStyle={{ objectFit: 'contain' }}
style={{ width: '80px' }}
/>
)}
{!node.thumblogo && (
<Text
size="small"
weight="bold"
style={{ textTransform: 'uppercase' }}
>
{node.name}
</Text>
)}
</Box>
</Box>
))}
</Box>
);
const MobileHeroNav = ({ nodes, index, onSelect }) => (
<Box
a11yTitle="carousel"
role="navigation"
tabIndex={0}
direction="row"
justify="center"
gap="medium"
style={{ position: 'absolute', bottom: '40px', left: '0', right: '0' }}
>
{nodes.map((node, i) => (
<Button
key={node.name}
icon={
<StatusGoodSmall
color={index === i ? 'accent-2' : 'accent-1'}
size={index === i ? 'medium' : 'small'}
/>
}
a11yTitle={`Slide ${i + 1}: ${node.name}`}
onClick={() => onSelect(i)}
/>
))}
</Box>
);
const Hero = () => { const Hero = () => {
const { const {
allHeroYaml: { nodes }, allHeroYaml: { nodes },
...@@ -159,6 +240,10 @@ const Hero = () => { ...@@ -159,6 +240,10 @@ const Hero = () => {
} }
`); `);
const size = useContext(ResponsiveContext);
const isMobile = ['xsmall', 'small'].includes(size);
const [index, setIndex] = useState(0); const [index, setIndex] = useState(0);
const handleSetSlide = (i) => { const handleSetSlide = (i) => {
...@@ -171,65 +256,24 @@ const Hero = () => { ...@@ -171,65 +256,24 @@ const Hero = () => {
style={{ position: 'relative', minHeight: '500px' }} style={{ position: 'relative', minHeight: '500px' }}
background="brand" background="brand"
> >
<Container> <Container fill="vertical">
<Column> <Column fill="vertical" aria-live="polite">
{nodes {nodes
.filter((node) => node.index === index) .filter((node) => node.index === index)
.map((node) => ( .map((node) => (
<React.Fragment key={index}> <React.Fragment key={index}>
<SlideImage image={node.image} /> <SlideImage image={node.image} />
<Slide key={index} {...node} /> <Slide key={index} isMobile={isMobile} size={size} {...node} />
</React.Fragment> </React.Fragment>
))} ))}
</Column> </Column>
</Container> </Container>
{!isMobile && (
<Box <HeroNav nodes={nodes} index={index} onSelect={handleSetSlide} />
style={{ position: 'absolute', right: '50px', bottom: '50px' }} )}
width="small" {isMobile && (
> <MobileHeroNav nodes={nodes} index={index} onSelect={handleSetSlide} />
{nodes.map((node, i) => ( )}
<Box
key={node.name}
height="80px"
background="black"
border={{ color: 'dark-1', size: 'xsmall' }}
onClick={() => handleSetSlide(i)}
style={{ position: 'relative' }}
>
<Img
style={{ ...abs, opacity: index === i ? '100%' : '0' }}
fluid={node.thumb.childImageSharp.fluid}
/>
<Box
style={abs}
direction="row"
gap="small"
pad="small"
align="center"
>
{index !== i && <FormPrevious color="accent-1" />}
{node.thumblogo && (
<Img
fluid={node.thumblogo.childImageSharp.fluid}
objectFit="contain"
style={{ width: '80px' }}
/>
)}
{!node.thumblogo && (
<Text
size="small"
weight="bold"
style={{ textTransform: 'uppercase' }}
>
{node.name}
</Text>
)}
</Box>
</Box>
))}
</Box>
<DownHex /> <DownHex />
</Box> </Box>
); );
......
import React from 'react';
import Container from './Container';
const ContentContainer = (props) => {
return <Container id="main-content" {...props} />;
};
export default ContentContainer;
export { default as Container } from './Container'; export { default as Container } from './Container';
export { default as Column } from './Column'; export { default as Column } from './Column';
export { default as ContentContainer } from './ContentContainer';
...@@ -45,7 +45,7 @@ const MenuItem = ({ name, to, onNavigate }) => { ...@@ -45,7 +45,7 @@ const MenuItem = ({ name, to, onNavigate }) => {
</Link> </Link>
</Box> </Box>
) : ( ) : (
<Button onClick={() => onNavigate(name)}> <Button onClick={() => onNavigate(name)} aria-haspopup="menu">
<Box <Box
direction="row" direction="row"
justify="between" justify="between"
...@@ -56,7 +56,7 @@ const MenuItem = ({ name, to, onNavigate }) => { ...@@ -56,7 +56,7 @@ const MenuItem = ({ name, to, onNavigate }) => {
<Text weight="bold" size="small"> <Text weight="bold" size="small">
{name} {name}
</Text>{' '} </Text>{' '}
<FormNext color="accent-1" /> <FormNext color="accent-1" aria-hidden="true" />
</Box> </Box>
</Button> </Button>
)} )}
...@@ -166,7 +166,7 @@ const MegaMobileMenu = ({ onClose }) => { ...@@ -166,7 +166,7 @@ const MegaMobileMenu = ({ onClose }) => {
<Button onClick={handleBack}> <Button onClick={handleBack}>
{' '} {' '}
<Box direction="row" align="center"> <Box direction="row" align="center">
<FormPrevious color="accent-1" />{' '} <FormPrevious color="accent-1" aria-hidden="true" />{' '}
<Text size="small" weight="bold"> <Text size="small" weight="bold">
Back Back
</Text> </Text>
...@@ -174,7 +174,7 @@ const MegaMobileMenu = ({ onClose }) => { ...@@ -174,7 +174,7 @@ const MegaMobileMenu = ({ onClose }) => {
</Button> </Button>
)} )}
</Box> </Box>
<Button icon={<Close />} onClick={onClose} /> <Button icon={<Close />} onClick={onClose} a11yTitle="close menu" />
</Box> </Box>
<Box overflow="auto" style={{ position: 'relative' }} fill> <Box overflow="auto" style={{ position: 'relative' }} fill>
<MenuHome onNavigate={handleNavigate} /> <MenuHome onNavigate={handleNavigate} />
......
...@@ -20,6 +20,7 @@ const OfferHeader = ({ title, icon, description, active, isMobile }) => ( ...@@ -20,6 +20,7 @@ const OfferHeader = ({ title, icon, description, active, isMobile }) => (
fill fill
align="center" align="center"
justify="between" justify="between"
a11yTitle={title}
> >
<Box direction="row" gap="medium"> <Box direction="row" gap="medium">
{!isMobile && <Box>{icon}</Box>} {!isMobile && <Box>{icon}</Box>}
......
...@@ -24,7 +24,12 @@ const SolutionGroup = ({ node, basis, isMobile }) => ( ...@@ -24,7 +24,12 @@ const SolutionGroup = ({ node, basis, isMobile }) => (
))} ))}
</Box> </Box>
<CtaLink to={node.frontmatter.slug}>Learn More</CtaLink> <CtaLink
to={node.frontmatter.slug}
a11yTitle={`Learn more about ${node.frontmatter.title}`}
>
Learn More
</CtaLink>
</Box> </Box>
); );
......
...@@ -31,13 +31,21 @@ const listQuery = graphql` ...@@ -31,13 +31,21 @@ const listQuery = graphql`
const ServiceItem = ({ node, pad }) => ( const ServiceItem = ({ node, pad }) => (
<Box basis="1/2" pad="medium"> <Box basis="1/2" pad="medium">
<Heading level={4}>{node.frontmatter.title}</Heading> <Heading level={4}>{node.frontmatter.title}</Heading>
<Classification levels={node.frontmatter.levels} /> <Classification
levels={node.frontmatter.levels}
serviceName={node.frontmatter.title}
/>
{/* Undo this "flex" if we don't want learn more to line up */} {/* Undo this "flex" if we don't want learn more to line up */}
<Box flex="grow" pad={{ vertical: pad }}> <Box flex="grow" pad={{ vertical: pad }}>
<Paragraph fill>{node.frontmatter.excerpt || node.excerpt}</Paragraph> <Paragraph fill>{node.frontmatter.excerpt || node.excerpt}</Paragraph>
</Box> </Box>
<CtaLink to={node.frontmatter.slug}>Learn More</CtaLink> <CtaLink
to={node.frontmatter.slug}
a11yTitle={`Learn more about ${node.frontmatter.title}`}
>
Learn More
</CtaLink>
</Box> </Box>
); );
...@@ -63,7 +71,12 @@ const ServiceList = ({ categories }) => { ...@@ -63,7 +71,12 @@ const ServiceList = ({ categories }) => {
const isMobile = ['xsmall', 'small'].includes(size); const isMobile = ['xsmall', 'small'].includes(size);
return ( return (
<Box pad={{ vertical: 'large' }} background="white" style={{ zIndex: 5 }}> <Box
pad={{ vertical: 'large' }}
background="white"
style={{ zIndex: 5 }}
id="main-content"
>
{catGroup.map((group, i) => ( {catGroup.map((group, i) => (
<Box key={categories[i]} gap="small"> <Box key={categories[i]} gap="small">
{categories.length > 1 && ( {categories.length > 1 && (
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment