From 93f209a9088d3282470b83082dc3d41406209056 Mon Sep 17 00:00:00 2001 From: Jan Tuomi Date: Sat, 17 Nov 2018 17:31:05 +0200 Subject: [PATCH] Implement hamburger menu for mobile --- src/components/Header/Header.tsx | 82 +++++++++++++++++-- src/components/Icon/Icon.tsx | 15 +++- .../NavbarChildLink/NavbarChildLink.scss | 10 ++- .../NavbarDropdownLink.scss | 4 + .../NavbarDropdownLink/NavbarDropdownLink.tsx | 18 +++- src/components/Navigation/Navigation.scss | 19 +++-- src/components/Navigation/Navigation.tsx | 56 ++++++++----- 7 files changed, 161 insertions(+), 43 deletions(-) diff --git a/src/components/Header/Header.tsx b/src/components/Header/Header.tsx index c381337..7941a2f 100644 --- a/src/components/Header/Header.tsx +++ b/src/components/Header/Header.tsx @@ -1,22 +1,88 @@ import * as React from "react"; +import { Fragment } from "react"; import { Link } from "react-router-dom"; import "./Header.scss"; +import NavbarDropdownLink from "../NavbarDropdownLink/NavbarDropdownLink"; +import NavbarChildLink from "../NavbarChildLink/NavbarChildLink"; import Navigation from "../Navigation"; // @ts-ignore import * as TitleImage from "../../assets/img/SIK_RGB_W_side.png"; export interface HeaderProps {} -export interface HeaderState {} +export interface HeaderState { + mobileMenuOpen: boolean; +} class Header extends React.Component { - render() { + constructor(props) { + super(props); + this.state = { + mobileMenuOpen: false, + }; + } + + renderNavigationDesktopItems = () => { return ( -
- - - - -
+ + + Toiminta + Fuksi + Arkisto + + + + + Simo Höglund + + + + ); + } + + renderNavigationMobileItems = () => { + return ( + + + Toiminta + Fuksi + Arkisto + + + + + Simo Höglund + + + + ); + } + + handleMobileMenuClick = (): void => { + this.setState(prevState => ({ + mobileMenuOpen: !prevState.mobileMenuOpen, + })); + } + + render() { + const desktopItems = this.renderNavigationDesktopItems(); + const mobileItems = this.renderNavigationMobileItems(); + const { mobileMenuOpen } = this.state; + + return ( + +
+ + + + +
+ +
); } } diff --git a/src/components/Icon/Icon.tsx b/src/components/Icon/Icon.tsx index bff1688..a344bcd 100644 --- a/src/components/Icon/Icon.tsx +++ b/src/components/Icon/Icon.tsx @@ -11,6 +11,7 @@ export enum IconType { export interface IconProps { name: IconType; link?: string; + onClick?: (event?: any) => void; } export interface IconState {} @@ -57,16 +58,24 @@ const nameToIcon = (name: IconType): JSX.Element => { class Icon extends React.Component { render() { - const { link, name } = this.props; + const { link, name, onClick } = this.props; const elem = nameToIcon(name); if (link) { return ( - + {elem} ); } else { - return elem; + return ( + + {elem} + + ); } } } diff --git a/src/components/NavbarChildLink/NavbarChildLink.scss b/src/components/NavbarChildLink/NavbarChildLink.scss index cac8014..aca44af 100644 --- a/src/components/NavbarChildLink/NavbarChildLink.scss +++ b/src/components/NavbarChildLink/NavbarChildLink.scss @@ -8,7 +8,15 @@ $border-width: 2px; padding-right: 4rem; font-weight: 400; + @media screen and (max-width: 1200px - 1px) { + border-bottom: 1px dotted $light-blue; + margin-left: 2rem; + padding-left: 0; + } + &:hover { - background-color: $light-blue; + @media screen and (min-width: 1200px) { + background-color: $light-blue; + } } } diff --git a/src/components/NavbarDropdownLink/NavbarDropdownLink.scss b/src/components/NavbarDropdownLink/NavbarDropdownLink.scss index d6a300a..96ee165 100644 --- a/src/components/NavbarDropdownLink/NavbarDropdownLink.scss +++ b/src/components/NavbarDropdownLink/NavbarDropdownLink.scss @@ -9,6 +9,10 @@ $border-width: 2px; text-transform: uppercase; letter-spacing: 2px; padding: 20px 0; + + @media screen and (max-width: 1200px - 1px) { + border-bottom: 1px solid $light-blue; + } } .navbar-dropdown-container { diff --git a/src/components/NavbarDropdownLink/NavbarDropdownLink.tsx b/src/components/NavbarDropdownLink/NavbarDropdownLink.tsx index c342bd8..5b57268 100644 --- a/src/components/NavbarDropdownLink/NavbarDropdownLink.tsx +++ b/src/components/NavbarDropdownLink/NavbarDropdownLink.tsx @@ -6,6 +6,7 @@ import DropDownBox from "../DropDownBox/DropDownBox"; export interface NavbarDropdownLinkProps { to: string; text: string; + exploded?: boolean; // if exploded, show items directly underneath without a dropdown menu } export interface NavbarDropdownLinkState { mouseOverLink: Boolean; @@ -47,17 +48,28 @@ class NavbarDropdownLink extends React.Component + {text} + {children} + + ); + } + return (
{this.props.text} + >{text} void; + items: JSX.Element; +} +export interface NavigationState { + menuOpen: boolean; +} class Navigation extends React.Component { + constructor(props) { + super(props); + this.state = { + menuOpen: false + }; + } + + handleMobileMenuClick = () => { + const { onMobileMenuOpen } = this.props; + onMobileMenuOpen(); + } + render() { + const { menuOpen } = this.state; + const { items } = this.props; return ( -
- - Toiminta - Fuksi - Arkisto - - - - - Simo Höglund - - -
- - - + +
+ {items} +
+ + + +
+
+ +
-
- -
-
+ ); } }