diff --git a/gatsby-config.js b/gatsby-config.js index 818b657d1e24889428d9e8e585d3548084165757..67b30ad4d6c6e498947bf0a758e76f04336432a6 100644 --- a/gatsby-config.js +++ b/gatsby-config.js @@ -46,6 +46,14 @@ module.exports = { }, }, `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 // To learn more, visit: https://gatsby.dev/offline // `gatsby-plugin-offline`, diff --git a/package-lock.json b/package-lock.json index 6eeaeba87f94d2e5cbbbb814225f3cccb8fc52de..6bad872c1f1d9289e03a244f6031bf9085fdbd28 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8585,6 +8585,15 @@ "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": { "version": "2.12.1", "resolved": "https://registry.npmjs.org/gatsby-plugin-manifest/-/gatsby-plugin-manifest-2.12.1.tgz", diff --git a/package.json b/package.json index 0e3bcc35a40557b704d6847c05b979145a067da1..1099613793e8ecff6ac3182e11f87f86378d49e2 100644 --- a/package.json +++ b/package.json @@ -9,6 +9,7 @@ "gatsby-image": "^2.11.0", "gatsby-plugin-force-trailing-slashes": "^1.0.5", "gatsby-plugin-gatsby-cloud": "^1.0.2", + "gatsby-plugin-google-gtag": "^3.2.0", "gatsby-plugin-manifest": "^2.12.1", "gatsby-plugin-offline": "^3.10.2", "gatsby-plugin-react-helmet": "^3.10.0", diff --git a/src/components/Classification.js b/src/components/Classification.js index b4a066b32a10cb25b11bd45d3cd8e8a6874c3b50..4d1b57c968cc878a0d018d379fe0eea30b3ba27f 100644 --- a/src/components/Classification.js +++ b/src/components/Classification.js @@ -2,6 +2,16 @@ import React from 'react'; import PropTypes from 'prop-types'; 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 matchingLevel = levels?.includes(value); const nodeStyles = { @@ -22,7 +32,7 @@ const LevelNode = ({ levels, value, children }) => { }; return ( - + {children} @@ -30,51 +40,55 @@ const LevelNode = ({ levels, value, children }) => { ); }; -const Classification = ({ levels }) => ( - +const Classification = ({ levels, serviceName }) => { + const supportedLevels = levels.map((item) => levelLabels[item]).join(', '); + return ( - - CUI - - - S - - - S//SAR - - - S//SCI - - - TS - - - TS//SAR - - - TS//SCI - + + + CUI + + + S + + + S//SAR + + + S//SCI + + + TS + + + TS//SAR + + + TS//SCI + + - -); + ); +}; Classification.propTypes = { level: PropTypes.arrayOf([ @@ -86,6 +100,7 @@ Classification.propTypes = { 'TS-SAR', 'TS-SCI', ]), + serviceName: PropTypes.string, }; export default Classification; diff --git a/src/components/ContactForm.js b/src/components/ContactForm.js index 8a54f5121b690843c0b95f6b200876d36d591229..6c85a2b5d85dff7d6c3989f0115459ca0e713a3b 100644 --- a/src/components/ContactForm.js +++ b/src/components/ContactForm.js @@ -144,6 +144,7 @@ const ContactForm = ({ onClose }) => { diff --git a/src/components/DownHex.js b/src/components/DownHex.js index b3d768c43328f8c79bbb340a6b95a289673e8b3e..b6956968faa52076d61eb5ab81c25d72ff31dc26 100644 --- a/src/components/DownHex.js +++ b/src/components/DownHex.js @@ -17,6 +17,7 @@ const DownHex = () => ( align="center" justify="center" style={{ position: 'relative', overflow: 'hidden' }} + aria-hidden="true" > { pad="medium" gap="medium" > - + - + diff --git a/src/components/FeedbackForm.js b/src/components/FeedbackForm.js index e2f3ea607a356a551180cfde9ca535e66714d4ec..e1741d1ab5b90f16ec9353aeb3af069399cbc46a 100644 --- a/src/components/FeedbackForm.js +++ b/src/components/FeedbackForm.js @@ -136,6 +136,7 @@ const FeedbackForm = ({ onClose }) => { diff --git a/src/components/app/Footer.js b/src/components/app/Footer.js index 249f4bb3105e840498bcf52ca12e1917d442f931..cd9375b226eccd8f8c209d28a98cdd74a0aca580 100644 --- a/src/components/app/Footer.js +++ b/src/components/app/Footer.js @@ -18,6 +18,7 @@ const Footer = () => { justify="between" direction={isMobile ? 'column' : 'row'} gap="large" + aria-hidden="true" > { gap="medium" align="center" > - C3I&N + C3I & Networks Directorate logo diff --git a/src/components/app/Header.js b/src/components/app/Header.js index a6bc706c56f739565ad7927a4222ef3051802afd..400f3c72152d5dcb202bc9274ce397696840e205 100644 --- a/src/components/app/Header.js +++ b/src/components/app/Header.js @@ -1,7 +1,14 @@ import React, { useContext } from 'react'; import PropTypes from 'prop-types'; 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 { RenderPropSticky as Sticky } from 'react-sticky-el'; import { Container, Column } from '../layout'; @@ -30,6 +37,15 @@ const StyledHeader = styled(GHeader)` : theme.custom.header.height}; `; +const skipLinkList = [ + , +]; const Header = ({ transparent }) => { const size = useContext(ResponsiveContext); const isMobile = ['xsmall', 'small'].includes(size); @@ -59,6 +75,8 @@ const Header = ({ transparent }) => { display: 'flex', flexDirection: 'row', }} + aria-label="Link to homepage" + tabIndex={2} > { +