Skip to content
This repository has been archived by the owner on Jun 10, 2023. It is now read-only.

Commit

Permalink
Fixes
Browse files Browse the repository at this point in the history
  • Loading branch information
panr committed Feb 5, 2019
1 parent fd38c42 commit 2b3f2af
Show file tree
Hide file tree
Showing 9 changed files with 483 additions and 355 deletions.
19 changes: 18 additions & 1 deletion gatsby-config.js
@@ -1,5 +1,9 @@
const postCssPresetEnv = require(`postcss-preset-env`)
const postCSSNested = require('postcss-nested')
const postCSSUrl = require('postcss-url')
const postCSSImports = require('postcss-import')
const cssnano = require('cssnano')
const postCSSMixins = require('postcss-mixins')

module.exports = {
siteMetadata: {
Expand Down Expand Up @@ -58,7 +62,20 @@ module.exports = {
{
resolve: `gatsby-plugin-postcss`,
options: {
postCssPlugins: [postCssPresetEnv({ stage: 1 }), postCSSNested()],
postCssPlugins: [
postCSSUrl(),
postCSSImports(),
postCSSMixins(),
postCSSNested(),
postCssPresetEnv({
importFrom: 'src/styles/variables.css',
stage: 1,
preserve: false,
}),
cssnano({
preset: 'default',
}),
],
},
},
`gatsby-transformer-sharp`,
Expand Down
8 changes: 6 additions & 2 deletions package.json
Expand Up @@ -45,17 +45,21 @@
"devDependencies": {
"babel-eslint": "^10.0.1",
"babel-preset-gatsby": "^0.1.6",
"cssnano": "^4.1.8",
"eslint": "^5.12.0",
"eslint-config-airbnb": "^17.1.0",
"eslint-config-prettier": "^3.3.0",
"eslint-plugin-import": "^2.14.0",
"eslint-plugin-jsx-a11y": "^6.1.2",
"eslint-plugin-react": "^7.12.3",
"gatsby-remark-embed-video": "^1.7.0",
"postcss-import": "^12.0.1",
"postcss-loader": "^3.0.0",
"postcss-mixins": "^6.2.1",
"postcss-nested": "^4.1.1",
"postcss-preset-env": "^6.5.0",
"prettier": "^1.15.2",
"react-responsive": "^6.0.1"
"postcss-url": "^8.0.0",
"prettier": "^1.15.2"
},
"repository": {
"type": "git",
Expand Down
138 changes: 11 additions & 127 deletions src/components/header.js
Expand Up @@ -2,47 +2,11 @@ import React from 'react'
import PropTypes from 'prop-types'
import { Link } from 'gatsby'
import { Helmet } from 'react-helmet'
import MediaQuery from 'react-responsive'

import Icon from './icon'
import Menu from './menu'

import style from '../styles/header.module.css'

const MainMenu = ({ mainMenu, mainMenuItems, isMobileMenu }) => {
const menu = mainMenu.slice(0)
!isMobileMenu && menu.splice(mainMenuItems)

return menu.map((menuItem, index) => (
<li key={index}>
<Link to={menuItem.path}>{menuItem.title}</Link>
</li>
))
}

const SubMenu = ({ mainMenu, mainMenuItems, onToggleSubMenu }) => {
const menu = mainMenu.slice(0)
menu.splice(0, mainMenuItems)

const items = menu.map((menuItem, index) => (
<li key={index}>
<Link to={menuItem.path}>{menuItem.title}</Link>
</li>
))

return (
<>
{items}
{/* eslint-disable-next-line jsx-a11y/click-events-have-key-events */}
<div
className={style.subMenuOverlay}
role="button"
tabIndex={0}
onClick={onToggleSubMenu}
/>
</>
)
}

class Header extends React.Component {
state = {
userTheme:
Expand Down Expand Up @@ -89,7 +53,6 @@ class Header extends React.Component {
theme,
} = this.props
const { userTheme, isSubMenuVisible, isMobileMenuVisible } = this.state
const isSubMenu = !(mainMenuItems >= mainMenu.length) && mainMenuItems > 0

return (
<>
Expand Down Expand Up @@ -117,84 +80,16 @@ class Header extends React.Component {
</div>
</Link>
<span className={style.right}>
<MediaQuery maxWidth={668}>
{matches => {
if (matches) {
return (
<>
{isMobileMenuVisible ? (
<>
{/* eslint-disable */}
<div
onClick={this.onToggleMobileMenu}
className={style.mobileMenuOverlay}
/>
{/* eslint-enable */}
<ul className={style.mobileMenu}>
<MainMenu mainMenu={mainMenu} isMobileMenu />
</ul>
</>
) : null}
<button
className={style.menuTrigger}
style={{ color: 'inherit' }}
onClick={this.onToggleMobileMenu}
type="button"
>
<Icon
style={{ cursor: 'pointer' }}
size={24}
d="M4 34H40V30H4V34ZM4 24H40V20H4V24ZM4 10V14H40V10H4Z"
/>
</button>
</>
)
}

return (
<ul className={style.menu}>
<MainMenu
mainMenu={mainMenu}
mainMenuItems={mainMenuItems}
/>
{isSubMenu ? (
<>
<button
className={style.subMenuTrigger}
onClick={this.onToggleSubMenu}
type="button"
>
{menuMoreText || 'Menu'}{' '}
<span className={style.menuArrow}>></span>
</button>
{isSubMenuVisible ? (
<ul className={style.subMenu}>
<SubMenu
mainMenu={mainMenu}
mainMenuItems={mainMenuItems}
onToggleSubMenu={this.onToggleSubMenu}
/>
</ul>
) : null}
</>
) : null}
</ul>
)
}}
</MediaQuery>
<button
className={style.themeToggle}
onClick={this.onChangeTheme}
type="button"
>
<Icon
style={{ cursor: 'pointer' }}
size={24}
d="M22 41C32.4934 41 41 32.4934 41 22C41 11.5066 32.4934 3 22
3C11.5066 3 3 11.5066 3 22C3 32.4934 11.5066 41 22 41ZM7 22C7
13.7157 13.7157 7 22 7V37C13.7157 37 7 30.2843 7 22Z"
/>
</button>
<Menu
mainMenu={mainMenu}
mainMenuItems={mainMenuItems}
isMobileMenuVisible={isMobileMenuVisible}
isSubMenuVisible={isSubMenuVisible}
menuMoreText={menuMoreText}
onToggleMobileMenu={this.onToggleMobileMenu}
onToggleSubMenu={this.onToggleSubMenu}
onChangeTheme={this.onChangeTheme}
/>
</span>
</div>
</header>
Expand All @@ -218,15 +113,4 @@ Header.propTypes = {
menuMoreText: PropTypes.string,
}

SubMenu.propTypes = {
mainMenu: PropTypes.arrayOf(
PropTypes.shape({
title: PropTypes.string,
path: PropTypes.string,
}),
),
mainMenuItems: PropTypes.number,
onToggleSubMenu: PropTypes.func,
}

export default Header
152 changes: 152 additions & 0 deletions src/components/menu.js
@@ -0,0 +1,152 @@
import React from 'react'
import PropTypes from 'prop-types'
import { Link } from 'gatsby'

import Icon from './icon'

import style from '../styles/menu.module.css'

const MainMenu = ({ mainMenu, mainMenuItems, isMobileMenu }) => {
const menu = mainMenu.slice(0)
!isMobileMenu && menu.splice(mainMenuItems)

return menu.map((menuItem, index) => (
<li key={index}>
<Link to={menuItem.path}>{menuItem.title}</Link>
</li>
))
}

const SubMenu = ({ mainMenu, mainMenuItems, onToggleSubMenu }) => {
const menu = mainMenu.slice(0)
menu.splice(0, mainMenuItems)

const items = menu.map((menuItem, index) => (
<li key={index}>
<Link to={menuItem.path}>{menuItem.title}</Link>
</li>
))

return (
<>
{items}
{/* eslint-disable-next-line jsx-a11y/click-events-have-key-events */}
<div
className={style.subMenuOverlay}
role="button"
tabIndex={0}
onClick={onToggleSubMenu}
/>
</>
)
}

const menuIcon = `M4 34H40V30H4V34ZM4 24H40V20H4V24ZM4 10V14H40V10H4Z`
const toggleIcon = `M22 41C32.4934 41 41 32.4934 41 22C41 11.5066 32.4934 3 22
3C11.5066 3 3 11.5066 3 22C3 32.4934 11.5066 41 22 41ZM7 22C7
13.7157 13.7157 7 22 7V37C13.7157 37 7 30.2843 7 22Z`

const Menu = ({
mainMenu,
mainMenuItems,
menuMoreText,
isMobileMenuVisible,
isSubMenuVisible,
onToggleMobileMenu,
onToggleSubMenu,
onChangeTheme,
}) => {
const isSubMenu = !(mainMenuItems >= mainMenu.length) && mainMenuItems > 0

return (
<>
<div className={style.mobileMenuContainer}>
<>
{isMobileMenuVisible ? (
<>
{/* eslint-enable */}
<ul className={style.mobileMenu}>
<MainMenu mainMenu={mainMenu} isMobileMenu />
</ul>
{/* eslint-disable */}
<div
onClick={onToggleMobileMenu}
className={style.mobileMenuOverlay}
/>
</>
) : null}
<button
className={style.menuTrigger}
style={{ color: 'inherit' }}
onClick={onToggleMobileMenu}
type="button"
>
<Icon style={{ cursor: 'pointer' }} size={24} d={menuIcon} />
</button>
</>
</div>
<div className={style.desktopMenuContainer}>
<ul className={style.menu}>
<MainMenu mainMenu={mainMenu} mainMenuItems={mainMenuItems} />
{isSubMenu ? (
<>
<button
className={style.subMenuTrigger}
onClick={onToggleSubMenu}
type="button"
>
{menuMoreText || 'Menu'}{' '}
<span className={style.menuArrow}>></span>
</button>
{isSubMenuVisible ? (
<ul className={style.subMenu}>
<SubMenu
mainMenu={mainMenu}
mainMenuItems={mainMenuItems}
onToggleSubMenu={onToggleSubMenu}
/>
</ul>
) : null}
</>
) : null}
</ul>
</div>
<button
className={style.themeToggle}
onClick={onChangeTheme}
type="button"
>
<Icon style={{ cursor: 'pointer' }} size={24} d={toggleIcon} />
</button>
</>
)
}

Menu.propTypes = {
mainMenu: PropTypes.arrayOf(
PropTypes.shape({
title: PropTypes.string,
path: PropTypes.string,
}),
),
mainMenuItems: PropTypes.number,
menuMoreText: PropTypes.string,
isMobileMenuVisible: PropTypes.bool,
isSubMenuVisible: PropTypes.bool,
onToggleMobileMenu: PropTypes.func,
onToggleSubMenu: PropTypes.func,
onChangeTheme: PropTypes.func,
}

SubMenu.propTypes = {
mainMenu: PropTypes.arrayOf(
PropTypes.shape({
title: PropTypes.string,
path: PropTypes.string,
}),
),
mainMenuItems: PropTypes.number,
onToggleSubMenu: PropTypes.func,
}

export default Menu

0 comments on commit 2b3f2af

Please sign in to comment.