UNCLASSIFIED

Commit 6a04d408 authored by Ben Wynn's avatar Ben Wynn
Browse files

Merge branch 'develop' into 'staging'

content update; footer finalization; mobile menu work

See merge request !22
parents 9a2ea167 e8be170e
Pipeline #215151 passed with stages
in 6 minutes and 49 seconds
...@@ -46,7 +46,7 @@ const Classification = ({ levels, serviceName }) => { ...@@ -46,7 +46,7 @@ const Classification = ({ levels, serviceName }) => {
<Box <Box
direction="row" direction="row"
align="start" align="start"
style={{ minWidth: '380px', maxWidth: '500px' }} style={{ maxWidth: '500px' }}
a11yTitle={`Classification levels supported by ${serviceName}: ${supportedLevels}`} a11yTitle={`Classification levels supported by ${serviceName}: ${supportedLevels}`}
> >
<Box <Box
......
import React, { useContext, useState } from 'react'; import React, { useContext, useState } from 'react';
import { Box, Text, Layer, ResponsiveContext } from 'grommet'; import { Box, Text, Layer, ResponsiveContext, ThemeContext } from 'grommet';
import FeedbackForm from './FeedbackForm'; import FeedbackForm from './FeedbackForm';
import { Container, Column } from './layout'; import { Container, Column } from './layout';
import { SecondaryButton } from './core'; import { SecondaryButton } from './core';
...@@ -53,9 +53,19 @@ const FeedbackFooter = () => { ...@@ -53,9 +53,19 @@ const FeedbackFooter = () => {
</Column> </Column>
</Container> </Container>
{isOpen && ( {isOpen && (
<Layer animation="fadeIn"> <ThemeContext.Extend
<FeedbackForm onClose={handleToggleOpen} /> value={{
</Layer> layer: {
extend: () => ({
zIndex: '50',
}),
},
}}
>
<Layer animation="fadeIn">
<FeedbackForm onClose={handleToggleOpen} />
</Layer>
</ThemeContext.Extend>
)} )}
</> </>
); );
......
...@@ -4,6 +4,7 @@ import { Container, Column } from '../layout'; ...@@ -4,6 +4,7 @@ import { Container, Column } from '../layout';
import { Link } from '../core'; import { Link } from '../core';
import AFLogo from '../../images/af-logo.svg'; import AFLogo from '../../images/af-logo.svg';
import C3Logo from '../../images/c3.png'; import C3Logo from '../../images/c3.png';
import AFMCLogo from '../../images/AFMC.png';
const Footer = () => { const Footer = () => {
const size = useContext(ResponsiveContext); const size = useContext(ResponsiveContext);
...@@ -18,29 +19,55 @@ const Footer = () => { ...@@ -18,29 +19,55 @@ 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="small"
justify="center" justify="start"
align={isMobile ? 'center' : 'start'} align={isMobile ? 'center' : 'start'}
> >
<Link to="/about-us/" color="light-1" size="small" weight="bold"> <Link to="/about-us/" color="light-1" size="small" weight="bold">
About Us About Us
</Link> </Link>
<Link
to="/our-other-programs/"
color="light-1"
size="small"
weight="bold"
>
Our Other Programs
</Link>
<Link
to="https://www.wpafb.af.mil/Welcome/Fact-Sheets/Display/Article/835716/88-abw-freedom-of-information-act-foia-88-abw-installation-privacy-office/"
color="light-1"
size="small"
>
FOIA
</Link>
</Box> </Box>
<Box <Box
direction={isMobile ? 'column' : 'row'} direction={isMobile ? 'column' : 'row'}
gap="medium" gap="medium"
align="center" align="center"
> >
<img <Link to="https://www.aflcmc.af.mil/WELCOME/Organizations/Command-Control-Communications-Intelligence-Networks-Directorate/">
src={C3Logo} <img
width="117" src={C3Logo}
height="117" width="117"
alt="C3I & Networks Directorate logo" height="117"
/> alt="C3I & Networks Directorate"
<AFLogo height="117" /> />
</Link>
<Link to="https://www.afmc.af.mil/">
<img
src={AFMCLogo}
width="117"
height="117"
alt="Air Force Material Command"
/>
</Link>
<Link to="https://www.af.mil/">
<AFLogo height="117" width="150" />
</Link>
</Box> </Box>
</Box> </Box>
</Column> </Column>
......
...@@ -84,7 +84,8 @@ const Slide = ({ title, subtitle, core, cta, slug, logo, isMobile, size }) => { ...@@ -84,7 +84,8 @@ const Slide = ({ title, subtitle, core, cta, slug, logo, isMobile, size }) => {
<Box style={{ maxWidth: '600px', maxHeight: '250px' }}> <Box style={{ maxWidth: '600px', maxHeight: '250px' }}>
<Img <Img
fluid={logo.childImageSharp.fluid} fluid={logo.childImageSharp.fluid}
imgStyle={{ objectFit: 'contain' }} imgStyle={{ objectFit: 'contain', objectPosition: '0 50%' }}
alt={title}
/> />
</Box> </Box>
)} )}
...@@ -253,7 +254,7 @@ const Hero = () => { ...@@ -253,7 +254,7 @@ const Hero = () => {
return ( return (
<Box <Box
height="85vh" height="85vh"
style={{ position: 'relative', minHeight: '500px' }} style={{ position: 'relative', minHeight: '680px' }}
background="brand" background="brand"
> >
<Container fill="vertical"> <Container fill="vertical">
......
...@@ -16,8 +16,8 @@ const ServiceCatHero = ({ title, description, imageFluid, iconName }) => { ...@@ -16,8 +16,8 @@ const ServiceCatHero = ({ title, description, imageFluid, iconName }) => {
return ( return (
<Container <Container
background="black" background="black"
style={{ position: 'relative' }} style={{ position: 'relative', overflow: 'hidden' }}
pad={{ margin={{
top: isMobile top: isMobile
? theme.custom.header.stickyHeight ? theme.custom.header.stickyHeight
: theme.custom.header.height, : theme.custom.header.height,
...@@ -56,7 +56,11 @@ const ServiceCatHero = ({ title, description, imageFluid, iconName }) => { ...@@ -56,7 +56,11 @@ const ServiceCatHero = ({ title, description, imageFluid, iconName }) => {
{title} {title}
</Heading> </Heading>
<Box width={isMobile ? 'auto' : '500px'}> <Box width={isMobile ? 'auto' : '500px'}>
{description && <Markdown>{description}</Markdown>} {description && (
<Markdown size="small" margin="0">
{description}
</Markdown>
)}
</Box> </Box>
</Box> </Box>
{!isMobile && ( {!isMobile && (
...@@ -67,24 +71,24 @@ const ServiceCatHero = ({ title, description, imageFluid, iconName }) => { ...@@ -67,24 +71,24 @@ const ServiceCatHero = ({ title, description, imageFluid, iconName }) => {
gap="medium" gap="medium"
flex={{ grow: 1 }} flex={{ grow: 1 }}
> >
<IconComponent size="300" color={isMobile ? 'dark-4' : 'white'} /> <IconComponent size="200" color={isMobile ? 'dark-4' : 'white'} />
</Box> </Box>
)} )}
</Box> </Box>
{isMobile && (
<IconComponent
size="300"
color="dark-4"
style={{
position: 'fixed',
right: '-150px',
top: '100px',
zIndex: 2,
}}
/>
)}
</Column> </Column>
{isMobile && (
<IconComponent
size="250"
color="dark-4"
style={{
position: 'absolute',
right: '0',
top: '50%',
zIndex: 2,
transform: 'translate(50%, -50%)',
}}
/>
)}
<DownHex /> <DownHex />
</Container> </Container>
); );
......
...@@ -16,24 +16,26 @@ const ServiceHero = ({ title, subtitle, pretitle, categories, imageFluid }) => { ...@@ -16,24 +16,26 @@ const ServiceHero = ({ title, subtitle, pretitle, categories, imageFluid }) => {
<Container <Container
background="black" background="black"
style={{ position: 'relative' }} style={{ position: 'relative' }}
pad={{ top: theme.custom.header.height }} pad={{
top: isMobile
? theme.custom.header.stickyHeight
: theme.custom.header.height,
}}
> >
{!isMobile && ( <Img
<Img fluid={imageFluid}
fluid={imageFluid} alt="Hero"
alt="Hero" style={{
style={{ position: 'absolute',
position: 'absolute', top: '0',
top: '0', left: '0',
left: '0', right: '0',
right: '0', bottom: '0',
bottom: '0', }}
}} />
/>
)}
<Column <Column
direction="row" direction="row"
pad={{ bottom: 'large' }} pad={{ bottom: 'xlarge' }}
style={{ position: 'relative' }} style={{ position: 'relative' }}
> >
<Box pad="large"> <Box pad="large">
......
import React, { useContext } from 'react'; import React, { useContext } from 'react';
import { Box } from 'grommet'; import { Box, ResponsiveContext } from 'grommet';
import DebugContext from '../../DebugContext'; import DebugContext from '../../DebugContext';
const Column = (props) => { const Column = (props) => {
const debug = useContext(DebugContext); const debug = useContext(DebugContext);
const size = useContext(ResponsiveContext);
const isMobile = ['xsmall'].includes(size);
return ( return (
<Box <Box
width="xxlarge" width="xxlarge"
border={debug && { color: 'blue' }} border={debug && { color: 'blue' }}
pad={{ horizontal: 'large' }} pad={{ horizontal: isMobile ? 'medium' : 'large' }}
flex="grow" flex="grow"
{...props} {...props}
/> />
......
...@@ -97,12 +97,13 @@ const MegaMenu = ({ sticky }) => { ...@@ -97,12 +97,13 @@ const MegaMenu = ({ sticky }) => {
title="Global Connectivity / WAN" title="Global Connectivity / WAN"
category="Global Connectivity / WAN" category="Global Connectivity / WAN"
/> />
</Box>
<Box basis="1/2">
<MenuGroup <MenuGroup
title="Local Connectivity / BAN" title="Local Connectivity / BAN"
category="Local Connectivity / BAN" category="Local Connectivity / BAN"
/> />
</Box>
<Box basis="1/2">
<MenuGroup title="Transport" category="Transport" />
<MenuGroup title="Cloud Access" category="Cloud Access" /> <MenuGroup title="Cloud Access" category="Cloud Access" />
<MenuGroup <MenuGroup
title="Reference Architectures" title="Reference Architectures"
......
...@@ -9,9 +9,9 @@ const mainLinks = [ ...@@ -9,9 +9,9 @@ const mainLinks = [
// "to" property is no special syntax "#" just signifying // "to" property is no special syntax "#" just signifying
// its not a link. // its not a link.
{ name: 'Available Services', to: '#services' }, { name: 'Available Services', to: '#services' },
{ name: 'Solutions', to: '/solutions' }, { name: 'Solutions', to: '/solutions/' },
{ name: 'About Us', to: '/about-us' }, { name: 'About Us', to: '/about-us/' },
{ name: 'Our Other Programs', to: '/other-programs' }, { name: 'Our Other Programs', to: '/other-programs/' },
]; ];
const serviceLinks = [ const serviceLinks = [
...@@ -37,13 +37,13 @@ const MenuItem = ({ name, to, onNavigate }) => { ...@@ -37,13 +37,13 @@ const MenuItem = ({ name, to, onNavigate }) => {
return ( return (
<Box flex={{ shrink: 0 }} basis="60px" background="white" justify="center"> <Box flex={{ shrink: 0 }} basis="60px" background="white" justify="center">
{isLink ? ( {isLink ? (
<Box background="white" pad="medium" align="center" direction="row"> <Link to={to} border={{ color: 'red' }}>
<Link to={to}> <Box background="white" pad="medium" align="center" direction="row">
<Text weight="bold" color="black" size="small"> <Text weight="bold" color="black" size="small">
{name} {name}
</Text> </Text>
</Link> </Box>
</Box> </Link>
) : ( ) : (
<Button onClick={() => onNavigate(name)} aria-haspopup="menu"> <Button onClick={() => onNavigate(name)} aria-haspopup="menu">
<Box <Box
......
...@@ -80,12 +80,13 @@ const OfferAcc = () => { ...@@ -80,12 +80,13 @@ const OfferAcc = () => {
title="Global Connectivity / WAN" title="Global Connectivity / WAN"
category="Global Connectivity / WAN" category="Global Connectivity / WAN"
/> />
</Box>
<Box basis="1/2" gap="medium">
<MenuGroup <MenuGroup
title="Local Connectivity / BAN" title="Local Connectivity / BAN"
category="Local Connectivity / BAN" category="Local Connectivity / BAN"
/> />
</Box>
<Box basis="1/2" gap="medium">
<MenuGroup title="Transport" category="Transport" />
<MenuGroup title="Cloud Access" category="Cloud Access" /> <MenuGroup title="Cloud Access" category="Cloud Access" />
<MenuGroup <MenuGroup
title="Reference Architectures" title="Reference Architectures"
......
...@@ -2,63 +2,76 @@ import React, { useContext } from 'react'; ...@@ -2,63 +2,76 @@ import React, { useContext } from 'react';
import { Box, Text, ResponsiveContext } from 'grommet'; import { Box, Text, ResponsiveContext } from 'grommet';
import { DtHex } from '../../icons'; import { DtHex } from '../../icons';
const Step = ({ number, isMobile, children }) => ( const Step = ({ number, isMobile, children }) => {
<Box style={{ position: 'relative' }}> const hzLineStyle = { position: 'absolute', top: '32px', width: '100%' };
{/* TODO: Add this line const vtLineStyle = { position: 'absolute', left: '45px', height: '100%' };
<Box if (number === 1) {
height="1px" hzLineStyle.left = '50%';
background="dark-1" hzLineStyle.width = '50%';
width="100%" vtLineStyle.top = '50%';
style={{ position: 'absolute', top: '32px' }} vtLineStyle.height = '50%';
/> */} }
<Box if (number === 4) {
basis="1/4" hzLineStyle.right = '50%';
pad={{ horizontal: 'small' }} hzLineStyle.width = '50%';
align="center" vtLineStyle.bottom = '50%';
direction={isMobile ? 'row' : 'column'} vtLineStyle.height = '50%';
gap="medium" }
> return (
<Box style={{ position: 'relative' }}>
{!isMobile && (
<Box height="1px" background="light-1" style={hzLineStyle} />
)}
{isMobile && <Box width="1px" background="light-1" style={vtLineStyle} />}
<Box <Box
height="65px" basis="1/4"
width="80px" pad={{ horizontal: 'small', vertical: isMobile ? 'medium' : '0' }}
flex={{ shrink: 0 }}
style={{ position: 'relative' }}
align="center" align="center"
justify="center" direction={isMobile ? 'row' : 'column'}
gap="medium"
> >
<Text <Box
size="xlarge" height="65px"
weight="bold" width="80px"
color="accent-2" flex={{ shrink: 0 }}
style={{ zIndex: 2 }} style={{ position: 'relative' }}
align="center"
justify="center"
> >
{number} <Text
</Text> size="xlarge"
<DtHex weight="bold"
color="accent-2" color="accent-2"
size="65" style={{ zIndex: 2 }}
style={{ >
position: 'absolute', {number}
top: '50%', </Text>
zIndex: 0, <DtHex
transform: 'translateY(-50%)', color="accent-2"
}} size="65"
/> style={{
<DtHex position: 'absolute',
color="black" top: '50%',
size="59" zIndex: 0,
style={{ transform: 'translateY(-50%)',
position: 'absolute', }}
top: '50%', />
zIndex: 0, <DtHex
transform: 'translateY(-50%)', color="black"
}} size="59"
/> style={{
position: 'absolute',
top: '50%',
zIndex: 0,
transform: 'translateY(-50%)',
}}
/>
</Box>
<Box align="center">{children}</Box>
</Box> </Box>
<Box align="center">{children}</Box>
</Box> </Box>
</Box> );
); };
const Steps = () => { const Steps = () => {
const size = useContext(ResponsiveContext); const size = useContext(ResponsiveContext);
...@@ -70,7 +83,6 @@ const Steps = () => { ...@@ -70,7 +83,6 @@ const Steps = () => {
direction={isMobile ? 'column' : 'row'} direction={isMobile ? 'column' : 'row'}
width={isMobile ? 'medium' : 'large'} width={isMobile ? 'medium' : 'large'}
pad={{ vertical: 'large' }} pad={{ vertical: 'large' }}
gap={isMobile ? 'large' : 'none'}
> >
<Step number={1} isMobile={isMobile}> <Step number={1} isMobile={isMobile}>
<Text size="small" textAlign={isMobile ? 'start' : 'center'}> <Text size="small" textAlign={isMobile ? 'start' : 'center'}>
......
...@@ -28,15 +28,15 @@ const listQuery = graphql` ...@@ -28,15 +28,15 @@ const listQuery = graphql`
} }
`; `;
const ServiceItem = ({ node, pad }) => ( const ServiceItem = ({ node, isMobile }) => (
<Box basis="1/2" pad="medium"> <Box basis="1/2" pad={isMobile ? '0' : 'medium'}>
<Heading level={4}>{node.frontmatter.title}</Heading> <Heading level={4}>{node.frontmatter.title}</Heading>
<Classification <Classification
levels={node.frontmatter.levels} levels={node.frontmatter.levels}
serviceName={node.frontmatter.title} 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: isMobile ? '0' : 'small' }}>
<Paragraph fill>{node.frontmatter.excerpt || node.excerpt}</Paragraph> <Paragraph fill>{node.frontmatter.excerpt || node.excerpt}</Paragraph>
</Box> </Box>
...@@ -49,14 +49,6 @@ const ServiceItem = ({ node, pad }) => ( ...@@ -49,14 +49,6 @@ const ServiceItem = ({ node, pad }) => (
</Box> </Box>
); );
const rowPad = {
xsmall: '0',
small: '0',
medium: 'medium',
large: 'medium',
xlarge: 'medium',
};
const ServiceList = ({ categories }) => { const ServiceList = ({ categories }) => {
const { const {
allMarkdownRemark: { nodes }, allMarkdownRemark: { nodes },
...@@ -71,12 +63,7 @@ const ServiceList = ({ categories }) => { ...@@ -71,12 +63,7 @@ const ServiceList = ({ categories }) => {
const isMobile = ['xsmall', 'small'].includes(size); const isMobile = ['xsmall', 'small'].includes(size);
return ( return (
<Box <Box pad={{ vertical: 'large' }} id="main-content">
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 && (
...@@ -107,8 +94,12 @@ const ServiceList = ({ categories }) => { ...@@ -107,8 +94,12 @@ const ServiceList = ({ categories }) => {
gap="large" gap="large"
key={item1.id} key={item1.id}
> >
{item1 && <ServiceItem node={item1} pad={rowPad[size]} />} {item1 && (
{item2 && <ServiceItem node={item2} pad={rowPad[size]} />} <ServiceItem node={item1} isMobile={isMobile} />
)}
{item2 && (
<ServiceItem node={item2} isMobile={isMobile} />
)}
</Box> </Box>
); );
})} })}
......
...@@ -4,6 +4,7 @@ title: 'Networking & Connectivity' ...@@ -4,6 +4,7 @@ title: 'Networking & Connectivity'
categories: categories:
- Global Connectivity / WAN - Global Connectivity / WAN
- Local Connectivity / BAN - Local Connectivity / BAN
- Transport
- Cloud Access - Cloud Access
- Reference Architectures - Reference Architectures
image: '../../images/cat-header.png' image: '../../images/cat-header.png'
......
...@@ -4,7 +4,7 @@ title: 'AFSEN-COIN' ...@@ -4,7 +4,7 @@ title: 'AFSEN-COIN'
shortTitle: 'COIN' shortTitle: 'COIN'
categories: categories:
- Networking & Connectivity - Networking & Connectivity
- Global Connectivity / WAN - Transport
levels: levels:
- S-SAR - S-SAR
- S-SCI - S-SCI
......
...@@ -31,7 +31,7 @@ DoD, USAF and industry partners can utilize the capability. ...@@ -31,7 +31,7 @@ DoD, USAF and industry partners can utilize the capability.
- Multi-level Compartmentalization - Multi-level Compartmentalization
- Adapts based on user clearances - Adapts based on user clearances
- 3rd Party Introduction - 3rd Party Introduction
- User SAP accesses pulled from JADE - User accesses pulled from JADE
- Strips PII information for general users - Strips PII information for general users
## Requirements ## Requirements
......
---
slug: '/services/marvel/'
title: 'Marvel'
categories:
- Communications
levels:
- S-SAR
- TS-SAR
- TS-SCI
excerpt: 'Voice-over-internet-protocol (VoIP) capabilities on SAP networks.'
share: '../../images/share/ogimage-communications.png'
updated: March 31
---
Marvel is the AF's Enterprise SAP voice network, consisting of geographically dispersed user VOSIP sites (also called endpoints) connected to call managers and operated at three security levels cleared for special access required (SAR) VOSIP CALLs: Secret//SAR Level 3, Top Secret//SAR Level 4, and Top Secret//SCI//SAR Level 5. Marvel VOSIP calls may cover any SAP or compartment, constrained only by the security level of the VOSIP call. Marvel endpoints require implementation of an encrypter, firewall, and switch as well as internal fiber drops to each phone location.
...@@ -13,7 +13,7 @@ share: '../../images/share/ogimage-networking_and_connectivity.png' ...@@ -13,7 +13,7 @@ share: '../../images/share/ogimage-networking_and_connectivity.png'
updated: March 23, 2021 at 2:51:35 PM EDT updated: March 23, 2021 at 2:51:35 PM EDT
--- ---
SEITaaS/Summit delivers End User Services, MLS applications, and NaaS to include data transport and endpoints. These capabilities are maintained centrally and down to the desktop. Users have the ability to select applications and new capabilities from a government service catalog or request new services to add to the government service catalog as needed. SEITaaS Summit delivers End User Services, MLS applications, and NaaS to include data transport and endpoints. These capabilities are maintained centrally and down to the desktop. Users have the ability to select applications and new capabilities from a government service catalog or request new services to add to the government service catalog as needed.
## Benefits & Features ## Benefits & Features
......
---
slug: '/services/svs/'
title: 'SAP Voice Servces (SVS)'
categories:
- Communications
levels:
- S-SAR
- TS-SAR
- TS-SCI
excerpt: 'Voice-over-internet-protocol (VoIP) capabilities on SAP networks.'
share: '../../images/share/ogimage-communications.png'
updated: March 31
---
SVS is the AF's Enterprise SAP voice network, consisting of geographically dispersed user VOSIP sites (also called endpoints) connected to call managers and operated at three security levels cleared for special access required (SAR) VOSIP CALLs: Secret//SAR Level 3, Top Secret//SAR Level 4, and Top Secret//SCI//SAR Level 5. SVS VOSIP calls may cover any SAP or compartment, constrained only by the security level of the VOSIP call. SVS endpoints require implementation of an encrypter, firewall, and switch as well as internal fiber drops to each phone location.
...@@ -5,7 +5,6 @@ shortTitle: 'TDC' ...@@ -5,7 +5,6 @@ shortTitle: 'TDC'
categories: categories:
- Networking & Connectivity - Networking & Connectivity
- Global Connectivity / WAN - Global Connectivity / WAN
- Compute & Store
levels: levels:
- U - U
- S - S
......
name: Summit name: SEITaaS Summit
title: Summit title: SEITaaS Summit
subtitle: SAP network-as-a-service subtitle: SAP network-as-a-service
core: true core: true
cta: Learn More cta: Learn More
......
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