fix #249 header 2 (#425)

* Header updates
* More pixel alignment for nav
* Update unit test snapshots
I removed a stray `,` from `testHelpers.tsx` which changed the output of several snapshots.
* Fixes from PR review
* Forgot to update snapshots after merge with main
* Removed unused (and outdated) timeline page
* Updated some translation descriptions.
This commit is contained in:
TomNUSDS 2021-08-02 07:48:19 -07:00 committed by GitHub
commit 08e21e5d5b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
12 changed files with 299 additions and 27282 deletions

27198
client/package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -1,59 +1,58 @@
import React, {useState} from 'react';
import {Link, useIntl} from 'gatsby-plugin-intl';
import {FormattedMessage, Link, useIntl} from 'gatsby-plugin-intl';
import {
Alert,
Header,
NavMenuButton,
PrimaryNav,
GovBanner,
Title,
} from '@trussworks/react-uswds';
import {Helmet} from 'react-helmet';
import {useFlags} from '../contexts/FlagContext';
import {defineMessages} from 'react-intl';
// @ts-ignore
import siteLogo from '../../src/images/icon.png';
const J40Header = () => {
const flags = useFlags();
const intl = useIntl();
const [mobileNavOpen, setMobileNavOpen] = useState(false);
const messages = defineMessages({
title: {
id: 'header.title',
defaultMessage: 'Justice40',
description: 'Title in header',
titleLine1: {
id: 'header.title.line1',
defaultMessage: `Climate and Economic Justice`,
description: 'Title in nav header line 1 of 2',
},
titleLine2: {
id: 'header.title.line2',
defaultMessage: `Screening Tool`,
description: 'Title in nav header line 2 of 2',
},
about: {
id: 'header.about',
defaultMessage: 'About',
description: 'Navigate to the about page',
description: 'Header navigate item to the about page',
},
explore: {
id: 'header.explore',
defaultMessage: 'Explore the tool',
description: 'Navigate to the Explore the tool page',
description: 'Header navigate item to the Explore the tool page',
},
methodology: {
id: 'header.methodology',
defaultMessage: 'Methodology',
description: 'Navigate to the Methodology page',
defaultMessage: 'Data & methodology',
description: 'Header navigate item to the Methodology page',
},
contact: {
id: 'header.contact',
defaultMessage: 'Contact',
description: 'Navigate to the Contact page',
},
timeline: {
id: 'header.timeline',
defaultMessage: 'Timeline',
description: 'Navigate to the Timeline page',
description: 'Header navigate item to the Contact page',
},
});
const title = intl.formatMessage(messages.title);
const titleL1 = intl.formatMessage(messages.titleLine1);
const titleL2 = intl.formatMessage(messages.titleLine2);
const toggleMobileNav = (): void =>
setMobileNavOpen((prevOpen) => !prevOpen);
const headerLinks = (flags: {[key: string] : any} | undefined) => {
const headerLinks = () => {
// static map of all possible menu items. Originally, it was all strings,
// but we need to handle both onsite and offsite links.
const menuData = new Map<string, JSX.Element>([
@ -81,49 +80,34 @@ const J40Header = () => {
key={'contact'}
activeClassName="usa-current"
className={'j40-header'}>{intl.formatMessage(messages.contact)}</Link>],
['timeline',
<Link
to={'/timeline'}
key={'timline'}
activeClassName="usa-current"
className={'j40-header'}>{intl.formatMessage(messages.timeline)}</Link>],
]);
// select which items from the above map to show, right now it's only two
// possibilities so it's simple. Note: strings are used as react keys
const menu =
('sprint3' in flags!) ?
['about', 'cejst', 'methodology', 'contact'] :
['about', 'cejst', 'methodology', 'contact'];
// TODO: make feature flags flags work.
const menu =['about', 'cejst', 'methodology', 'contact'];
return menu.map((key) => menuData.get(key));
};
return (
<>
<Helmet htmlAttributes={{lang: intl.locale}}>
<meta charSet="utf-8"/>
<title>{title}</title>
</Helmet>
<GovBanner/>
<Header
basic={true} role={'banner'}
className={'usa-header j40-header'}>
<div className="usa-nav-container">
<div className="usa-navbar">
<Title>{title}
<div className={'byline'}>
A climate and economic justice screening tool
</div>
</Title>
<h1 className="usa-logo">
<img className="j40-sitelogo" src={siteLogo} alt={`${titleL1} ${titleL2}`} />
<span className={'usa-logo__text j40-title'}>
<span className={'j40-title-line1'}>{titleL1}</span><br/>
<span className={'j40-title-line2'}>{titleL2}</span>
</span>
</h1>
<NavMenuButton
key={'mobileMenuButton'}
onClick={toggleMobileNav}
label="Menu"/>
</div>
<PrimaryNav
items={headerLinks(flags)}
items={headerLinks()}
mobileExpanded={mobileNavOpen}
onToggleMobileNav={toggleMobileNav}
className={'j40-header'}
@ -131,25 +115,19 @@ const J40Header = () => {
</PrimaryNav>
</div>
</Header>
<Alert
className={'j40-sitealert'}
type="info">
<b>Public beta </b>
Welcome to the public beta of the Just Progress Map, a climate and
economic justice screening tool. The tool will be continuously updated.
Please submit feedback.
<Alert className={'j40-sitealert'} type="info">
<span className={'j40-sitealert-title'}><FormattedMessage
id='header.alertTitleBeta'
description={'Alerts that appear on every page - title'}
defaultMessage={`Public beta`}/> - </span>
<span className={'j40-sitealert-body'}>
<FormattedMessage
id='header.alertBodyBeta'
description={'Alerts that appear on every page'}
defaultMessage={`This website will be continuously updated`}/>
</span>
<br/>
</Alert>
<Alert
className={'j40-sitealert'}
type="warning">
<b>Limited data sources </b>
This tool currently includes 16 datasets. Over time, datasets could be
added, updated, or removed. The datasets come from a variety of sources
based on availability, quality, and relevance to environmental, energy,
and climate issues. Each dataset has limitations, such as how recently
the data was updated.
</Alert>
</>
);
};

View file

@ -164,6 +164,5 @@ exports[`J40Footer renders correctly 1`] = `
</div>
</div>
</footer>
,
</DocumentFragment>
`;

View file

@ -154,6 +154,5 @@ exports[`rendering of the AreaDetail checks if various text fields are visible 1
</div>
</li>
</aside>
,
</DocumentFragment>
`;

View file

@ -26,6 +26,5 @@ exports[`simulate app starting up, no click on map should match the snapshot of
</div>
</aside>
</div>
,
</DocumentFragment>
`;

View file

@ -2,9 +2,9 @@ import React, {ReactNode} from 'react';
import {GridContainer, Grid} from '@trussworks/react-uswds';
import J40Header from './J40Header';
import J40Footer from './J40Footer';
import J40Aside from '../components/J40Aside';
import {URLFlagProvider} from '../contexts/FlagContext';
// this has to be wrong
import {Helmet} from 'react-helmet';
import {useIntl} from 'gatsby-plugin-intl';
interface ILayoutProps {
children: ReactNode,
@ -12,23 +12,23 @@ interface ILayoutProps {
}
const Layout = ({children, location}: ILayoutProps) => {
const isWidthFullPage = location.pathname.match(/cejst\/?/);
const conditionalAside = isWidthFullPage ? <></> : <J40Aside/>;
const gridCssClass = isWidthFullPage ? ' desktop:grid-col-12' :
'desktop:grid-col-9';
const intl = useIntl();
// @ts-ignore
return (
<URLFlagProvider location={location}>
<Helmet htmlAttributes={{lang: intl.locale}}>
<meta charSet="utf-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
</Helmet>
<J40Header/>
<GridContainer containerSize={'desktop-lg'}
className={'j40-grid-container'}>
<Grid row>
<main id={'main-content'}
className={'usa-layout-docs j40-main-content ' + gridCssClass}>
className={'usa-layout-docs j40-main-content desktop:grid-col-12'}>
{children}
</main>
{conditionalAside}
</Grid>
</GridContainer>
<J40Footer/>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 2.3 KiB

Before After
Before After

View file

@ -24,7 +24,7 @@
"description": "Households that are low income and spend more than 30% of their income to housing costs"
},
"areaDetail.indicator.linguisticIsolation": {
"defaultMessage": "Linguistic Isolation",
"defaultMessage": "Linguistic isolation",
"description": "Households in which all members speak a non-English language and speak English less than \"very well\""
},
"areaDetail.indicator.poverty": {
@ -32,7 +32,7 @@
"description": "Household income is less than or equal to twice the federal \"poverty level\""
},
"areaDetail.indicator.unemployment": {
"defaultMessage": "Unemployment",
"defaultMessage": "Unemployment rate",
"description": "Number of unemployed people as a percentage of the labor force"
},
"areaDetail.indicators.indicatorColumnHeader": {
@ -83,6 +83,18 @@
"defaultMessage": "Clean water infrastructure",
"description": "item in areasOfInterest list"
},
"contact.general": {
"defaultMessage": "For technical support, email {tech_email_address}",
"description": "Contact page body text"
},
"contact.pageheader": {
"defaultMessage": "Contact",
"description": "H2 header for contact page"
},
"contact.sectionheader": {
"defaultMessage": "Email us",
"description": "Heading for page to allow users to contact project maintainers"
},
"footer.arialabel": {
"defaultMessage": "Footer navigation",
"description": "aria-label text for whole footer"
@ -119,6 +131,14 @@
"defaultMessage": "About",
"description": "Navigate to the about page"
},
"header.alertBodyBeta": {
"defaultMessage": "This website will be continuously updated",
"description": "Alerts that appear on every page"
},
"header.alertTitleBeta": {
"defaultMessage": "Public beta",
"description": "Alerts that appear on every page - title"
},
"header.contact": {
"defaultMessage": "Contact",
"description": "Navigate to the Contact page"
@ -128,16 +148,20 @@
"description": "Navigate to the Explore the tool page"
},
"header.methodology": {
"defaultMessage": "Methodology",
"defaultMessage": "Data & methodology",
"description": "Navigate to the Methodology page"
},
"header.timeline": {
"defaultMessage": "Timeline",
"description": "Navigate to the Timeline page"
},
"header.title": {
"defaultMessage": "Justice40",
"description": "Title in header"
"header.title.line1": {
"defaultMessage": "Climate and Economic Justice",
"description": "Title in header line 1 of 2"
},
"header.title.line2": {
"defaultMessage": "Screening Tool",
"description": "Title in header line 2 of 2"
},
"index.aboutContent.header": {
"defaultMessage": "About Justice40",
@ -234,5 +258,17 @@
"map.territoryFocus.puerto_rico.short": {
"defaultMessage": "PR",
"description": "The abbreviated name indicating the bounds of Puerto Rico"
},
"mapIntro.censusBlockGroupDefinition": {
"defaultMessage": "A census block group is generally between 600 and 3,000 people. It is the smallest geographical unit for which the U.S. Census Bureau publishes sample data.",
"description": "cites the definition and helpful information about census groups"
},
"mapIntro.didYouKnow": {
"defaultMessage": "Did you know?",
"description": "text prompting a cite paragraph"
},
"mapIntro.mapIntroHeader": {
"defaultMessage": "Zoom and select a census block group to view data",
"description": "introductory text of ways to use the map"
}
}

View file

@ -15,15 +15,15 @@ const CEJSTPage = ({location}: IMapPageProps) => {
// We will bring back later when we have interactive controls.
return (
<Layout location={location}>
<main id="main-content" role="main">
<section>
<h2>Just Progress communities</h2>
<div className={styles.disclaimer}>
<div className={styles.textBox}>
<p>
Just Progress helps identify and prioritize communities across the United States and U.S. territories
that have been historically overburdened and underserved. These communities will receive 40% of
Just Progress helps identify and prioritize communities across the
United States and U.S. territories
that have been historically overburdened and underserved. These
communities will receive 40% of
the benefits from investments in key areas outlined by the
&nbsp;
<a
@ -33,12 +33,15 @@ const CEJSTPage = ({location}: IMapPageProps) => {
'crisis-at-home-and-abroad/'}
target={'_blank'}
rel={'noreferrer'}>
Executive Order on Tackling the Climate Crisis at Home and Abroad
Executive Order on Tackling the Climate Crisis at Home and
Abroad
</a>.
</p>
<p>
Download the Just Progress packet or explore the map below to see the list of prioritized communites. To
learn more about how these communities were prioritized check out the
Download the Just Progress packet or explore the map below to see
the list of prioritized communites. To
learn more about how these communities were prioritized check out
the
&nbsp;
<a
href={'./methodology'}>
@ -48,12 +51,15 @@ const CEJSTPage = ({location}: IMapPageProps) => {
page.
</p>
</div>
<DownloadPacket />
<DownloadPacket/>
</div>
</section>
<section>
<h2>Explore the Tool</h2>
<MapWrapper location={location} />
<HowYouCanHelp />
</main>
<HowYouCanHelp/>
</section>
</Layout>
);
};

View file

@ -1,16 +1,47 @@
import * as React from 'react';
import Layout from '../components/layout';
import {FormattedMessage} from 'gatsby-plugin-intl';
interface ContactPageProps {
location: Location;
}
const ContactPage = ({location}: ContactPageProps) => {
const generalemail = 'screeningtool.feedback@usds.gov';
const techemail = 'screeningtool.support@usds.gov';
return (<Layout location={location}>
<section className={'usa-prose'}>
<h1>Contact</h1>
<h2><FormattedMessage
id={'contact.pageheader'}
description={'H2 header for contact page'}
defaultMessage={'Contact'}/></h2>
<h3><FormattedMessage
id={'contact.sectionheader'}
description={'Heading for page to allow users to contact project maintainers'}
defaultMessage={'Email us'}/></h3>
<p>
<i>Information pending</i>
<FormattedMessage
id={'contact.general'}
description={'Contact page body text'}
defaultMessage={`
For general feedback, email {general_email_address}
`}
values={{
general_email_address: <a href={`mailto:${generalemail}`}>{generalemail}</a>,
}}/>
</p>
<p>
<FormattedMessage
id={'contact.general'}
description={'Contact page body text'}
defaultMessage={`
For technical support, email {tech_email_address}
`}
values={{
tech_email_address: <a href={`mailto:${techemail}`}>{techemail}</a>,
}}/>
</p>
</section>
</Layout>

View file

@ -84,20 +84,61 @@ $primary-color: #112f4e;
}
// this is the title
.usa-logo__text {
font-size: 1.8em;
font-family: "serif";
}
// menu item font
.usa-nav__primary {
font-size: 1.2em;
}
.byline {
font-size: 0.3em;
@include at-media("desktop") {
.j40-title {
font-size: 0.9em;
padding-bottom: 0; // allows vertical centering on logo and text
font-weight: normal;
}
.usa-navbar {
width: 100%;
}
// this actual site logo
.sitelogo {
float: left; // allows vertical centering on logo and text
margin-right: 0.5em; // space between logo and text
width: 4em;
padding: 0.5em; // this will change the size of the logo too
}
// nav menu item font
.usa-nav__primary {
.usa-nav__primary-item {
a {
margin-bottom: 0.5em; // how far menu is from bottom edge of nav
font-weight: 600;
}
}
}
// this is forcing the whole toolbar much taller
.usa-logo {
margin-top: 1.2rem;
margin-bottom: 1.2rem;
}
}
@include at-media("mobile") {
.usa-logo__text {
padding-top: 3px; // allows vertical centering on logo and text
padding-bottom: 0; // allows vertical centering on logo and text
font-weight: normal;
}
.usa-navbar {
width: 100%;
}
.j40-sitelogo {
float: left; // allows vertical centering on logo and text
margin-right: 0.5em; // space between logo and text
width: 3em;
padding: 0.4em; // this will change the size of the logo too
}
}
}
.j40-aside {
@ -138,7 +179,7 @@ $primary-color: #112f4e;
// spacing top & bottom around main content
.j40-main-content {
@include at-media("mobile-lg") {
margin-bottom: 2rem;
margin-bottom: 0;
margin-top: 2.5rem;
}
@ -185,12 +226,32 @@ $primary-color: #112f4e;
margin: 0;
}
padding-top: 7px;
padding-bottom: 7px;
min-height: 4em;
min-height: 2.5em;
margin: 0;
* + .usa-alert {
margin: 0 !important;
.j40-sitealert-title {
font-weight: bold;
}
.j40-sitealert-body {
}
.usa-alert {
margin: 0;
padding-bottom: 0;
padding-top: 0;
}
.usa-alert__body {
padding-top: 0;
padding-bottom: 0;
margin-bottom: 0;
}
.usa-alert__text {
padding-top: 0;
padding-bottom: 0;
margin-bottom: 0;
}
}
@ -227,7 +288,7 @@ $primary-color: #112f4e;
}
.mapboxgl-ctrl-group {
border-radius: 0px;
border-radius: 0;
}
.mapboxgl-ctrl {
@ -236,7 +297,7 @@ $primary-color: #112f4e;
}
button {
border-radius: 0px;
border-radius: 0;
height: 1.66em;
width: 1.66em;
box-sizing: border-box;

View file

@ -21,7 +21,7 @@ export const LocalizedComponent = ({children}: ILocalizedComponentProps) => {
<IntlProvider locale={'en'}>
{children}
</IntlProvider>
</IntlContextProvider>,
</IntlContextProvider>
</>
);
};