diff --git a/package-lock.json b/package-lock.json index add9c188f..b7fa7a493 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4278,6 +4278,11 @@ } } }, + "classnames": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.2.6.tgz", + "integrity": "sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q==" + }, "clean-stack": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", diff --git a/package.json b/package.json index 3712db999..91da0dc70 100644 --- a/package.json +++ b/package.json @@ -3,6 +3,7 @@ "private": true, "version": "0.1.0", "dependencies": { + "classnames": "^2.2.6", "gatsby": "^2.20.25", "gatsby-image": "^2.3.4", "gatsby-plugin-manifest": "^2.3.5", diff --git a/src/components/HamburgerMenu.js b/src/components/HamburgerMenu.js new file mode 100644 index 000000000..476b0f8fe --- /dev/null +++ b/src/components/HamburgerMenu.js @@ -0,0 +1,30 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import cx from 'classnames'; + +import './HamburgerMenu.scss'; + +const HamburgerMenu = ({ toggle, open }) => ( + +); + +HamburgerMenu.propTypes = { + toggle: PropTypes.func.isRequired, + open: PropTypes.bool, +}; + +HamburgerMenu.defaultProps = { + open: false, +}; + +export default HamburgerMenu; diff --git a/src/components/HamburgerMenu.scss b/src/components/HamburgerMenu.scss new file mode 100644 index 000000000..2da7714fe --- /dev/null +++ b/src/components/HamburgerMenu.scss @@ -0,0 +1,29 @@ +button.HamburgerMenu { + background: none; + border: 0; + cursor: pointer; + width: 3rem; + + div { + width: 100%; + height: 4px; + background-color: var(--color-black); + margin: 5px 0; + border-radius: 2px; + transition: 0.18s; + } + + &.HamburgerMenu__open { + :nth-child(1) { + transform: rotate(-45deg) translate(-6px, 6px); + } + + :nth-child(2) { + opacity: 0; + } + + :nth-child(3) { + transform: rotate(45deg) translate(-6px, -6px); + } + } +} diff --git a/src/components/Header.js b/src/components/Header.js index e8bc5bda1..421d496b9 100644 --- a/src/components/Header.js +++ b/src/components/Header.js @@ -1,13 +1,17 @@ -import './Header.scss'; - -import { Link, graphql, useStaticQuery } from 'gatsby'; +import { Link, useStaticQuery, graphql } from 'gatsby'; +import React, { useState } from 'react'; +import PropTypes from 'prop-types'; +import cx from 'classnames'; import Container from './Container'; import ExternalLink from './ExternalLink'; -import PropTypes from 'prop-types'; -import React from 'react'; +import HamburgerMenu from './HamburgerMenu'; + +import './Header.scss'; const Header = ({ pages }) => { + const [menuOpen, setMenuOpen] = useState(false); + // NOTE: we may want to abstract this const data = useStaticQuery(graphql` query { @@ -29,48 +33,46 @@ const Header = ({ pages }) => { `); return ( -
+
-
- - - -
+ -

+

{''} New Relic Developers

-
); diff --git a/src/components/Header.scss b/src/components/Header.scss index 0dff30c5a..64c566b44 100644 --- a/src/components/Header.scss +++ b/src/components/Header.scss @@ -1,21 +1,85 @@ header.Header--main { background-color: #d7e6e8; - a { - color: #000; - text-decoration: none; + .u-container { + display: grid; + grid-template-areas: 'nr tools' 'title title' 'main main'; + + @media (max-width: 760px) { + grid-template-columns: 1fr 3rem; + grid-template-areas: 'title menu' 'nr nr' 'main main' 'tools tools'; + } } - h1 { + .Header-title { + grid-area: title; font-size: 1.8rem; margin: 0; a { padding-left: 0; + + &:hover { + text-decoration: none; + } + } + + @media (max-width: 760px) { + a { + padding-left: 1rem; + } } } - nav > ul { + .HamburgerMenu { + display: none; + grid-area: menu; + align-items: end; + + @media (max-width: 760px) { + display: block; + } + } + + .Header-nav--nr { + grid-area: nr; + } + + .Header-nav--tools { + grid-area: tools; + + ul { + justify-content: flex-end; + } + } + + .Header-nav--main { + grid-area: main; + + ul { + justify-content: flex-end; + } + } + + a { + color: #000; + text-decoration: none; + padding: 0.6rem; + display: inline-block; + display: flex; + + &:hover { + cursor: pointer; + text-decoration: underline; + } + } + + h3 { + margin: 0; + padding: 1rem 0.6rem 0; + } + + ul { margin: 0; padding: 0; list-style: none; @@ -28,35 +92,51 @@ header.Header--main { li:last-child > a { padding-right: 0; } - } - a { - padding: 0.6rem; - display: inline-block; + @media (max-width: 760px) { + display: block; - &:hover { - cursor: pointer; - text-decoration: underline; + li:first-child > a, + li:last-child > a { + padding: 0.6rem; + } } } - nav img { + img { height: 1.2rem; vertical-align: middle; padding-bottom: 0.1rem; + + @media (max-width: 760px) { + margin-right: 0.5rem; + } } - .Header-topBar { - display: flex; - justify-content: space-between; + nav { + @media (max-width: 760px) { + display: none; + } } - nav.nav--main { - width: 100%; - height: auto; + &.Header--main__menuOpen nav { + @media (max-width: 760px) { + background-color: var(--color-white); + display: block; + } + } - ul { - justify-content: flex-end; + .u-hideOnDesktop { + display: none; + + @media (max-width: 760px) { + display: block; + } + } + + .u-hideOnMobile { + @media (max-width: 760px) { + display: none; } } }