import React, { useState, useEffect } from "react"; import styled from "@emotion/styled"; import { Link, navigate, graphql, useStaticQuery } from "gatsby"; import { useColorMode } from "theme-ui"; import Section from "@components/Section"; import Logo from "@components/Logo"; import Icons from "@icons"; import mediaqueries from "@styles/media"; import { copyToClipboard, getWindowDimensions, getBreakpointFromTheme, } from "@utils"; const siteQuery = graphql` { sitePlugin(name: { eq: "@davidway/gatsby-theme-novela" }) { pluginOptions { rootPath basePath } } } `; const DarkModeToggle: React.FC<{}> = () => { const [colorMode, setColorMode] = useColorMode(); const isDark = colorMode === `dark`; function toggleColorMode(event) { event.preventDefault(); setColorMode(isDark ? `light` : `dark`); } return ( ); }; const SharePageButton: React.FC<{}> = () => { const [hasCopied, setHasCopied] = useState(false); const [colorMode] = useColorMode(); const isDark = colorMode === `dark`; const fill = isDark ? "#fff" : "#000"; function copyToClipboardOnClick() { if (hasCopied) return; copyToClipboard(window.location.href); setHasCopied(true); setTimeout(() => { setHasCopied(false); }, 1000); } return ( Copied ); }; const NavigationHeader: React.FC<{}> = () => { const [showBackArrow, setShowBackArrow] = useState(false); const [previousPath, setPreviousPath] = useState("/"); const { sitePlugin } = useStaticQuery(siteQuery); const [colorMode] = useColorMode(); const fill = colorMode === "dark" ? "#fff" : "#000"; const { rootPath, basePath } = sitePlugin.pluginOptions; useEffect(() => { const { width } = getWindowDimensions(); const phablet = getBreakpointFromTheme("phablet"); const prev = localStorage.getItem("previousPath"); const previousPathWasHomepage = prev === (rootPath || basePath) || (prev && prev.includes("/page/")); const currentPathIsHomepage = location.pathname === (rootPath || basePath) || location.pathname.includes("/page/"); setShowBackArrow( previousPathWasHomepage && !currentPathIsHomepage && width <= phablet, ); setPreviousPath(prev); }, []); return (
{showBackArrow && ( )} Navigate back to the homepage {showBackArrow ? ( ) : ( <> )}
); }; export default NavigationHeader; const BackArrowIconContainer = styled.div` transition: 0.2s transform var(--ease-out-quad); opacity: 0; padding-right: 30px; animation: fadein 0.3s linear forwards; @keyframes fadein { to { opacity: 1; } } ${mediaqueries.desktop_medium` display: none; `} `; const NavContainer = styled.div` position: relative; z-index: 100; padding-top: 100px; display: flex; justify-content: space-between; ${mediaqueries.desktop_medium` padding-top: 50px; `}; @media screen and (max-height: 800px) { padding-top: 50px; } `; const LogoLink = styled(Link)<{ back: string }>` position: relative; display: flex; align-items: center; left: ${p => (p.back === "true" ? "-54px" : 0)}; ${mediaqueries.desktop_medium` left: 0 `} &[data-a11y="true"]:focus::after { content: ""; position: absolute; left: -10%; top: -30%; width: 120%; height: 160%; border: 2px solid ${p => p.theme.colors.accent}; background: rgba(255, 255, 255, 0.01); border-radius: 5px; } &:hover { ${BackArrowIconContainer} { transform: translateX(-3px); } } `; const NavControls = styled.div` position: relative; display: flex; align-items: center; ${mediaqueries.phablet` right: -5px; `} `; const ToolTip = styled.div<{ isDark: boolean; hasCopied: boolean }>` position: absolute; padding: 4px 13px; background: ${p => (p.isDark ? "#000" : "rgba(0,0,0,0.1)")}; color: ${p => (p.isDark ? "#fff" : "#000")}; border-radius: 5px; font-size: 14px; top: -35px; opacity: ${p => (p.hasCopied ? 1 : 0)}; transform: ${p => (p.hasCopied ? "translateY(-3px)" : "none")}; transition: transform 0.3s ease-in-out, opacity 0.3s ease-in-out; &::after { content: ""; position: absolute; left: 0; right: 0; bottom: -6px; margin: 0 auto; width: 0; height: 0; border-left: 6px solid transparent; border-right: 6px solid transparent; border-top: 6px solid ${p => (p.isDark ? "#000" : "rgba(0,0,0,0.1)")}; } `; const IconWrapper = styled.button<{ isDark: boolean }>` opacity: 0.5; position: relative; border-radius: 5px; width: 40px; height: 25px; display: flex; align-items: center; justify-content: center; transition: opacity 0.3s ease; margin-left: 30px; &:hover { opacity: 1; } &[data-a11y="true"]:focus::after { content: ""; position: absolute; left: 0; top: -30%; width: 100%; height: 160%; border: 2px solid ${p => p.theme.colors.accent}; background: rgba(255, 255, 255, 0.01); border-radius: 5px; } ${mediaqueries.tablet` display: inline-flex; transform: scale(0.708); margin-left: 10px; &:hover { opacity: 0.5; } `} `; // This is based off a codepen! Much appreciated to: https://codepen.io/aaroniker/pen/KGpXZo const MoonOrSun = styled.div<{ isDark: boolean }>` position: relative; width: 24px; height: 24px; border-radius: 50%; border: ${p => (p.isDark ? "4px" : "2px")} solid ${p => p.theme.colors.primary}; background: ${p => p.theme.colors.primary}; transform: scale(${p => (p.isDark ? 0.55 : 1)}); transition: all 0.45s ease; overflow: ${p => (p.isDark ? "visible" : "hidden")}; &::before { content: ""; position: absolute; right: -9px; top: -9px; height: 24px; width: 24px; border: 2px solid ${p => p.theme.colors.primary}; border-radius: 50%; transform: translate(${p => (p.isDark ? "14px, -14px" : "0, 0")}); opacity: ${p => (p.isDark ? 0 : 1)}; transition: transform 0.45s ease; } &::after { content: ""; width: 8px; height: 8px; border-radius: 50%; margin: -4px 0 0 -4px; position: absolute; top: 50%; left: 50%; box-shadow: 0 -23px 0 ${p => p.theme.colors.primary}, 0 23px 0 ${p => p.theme.colors.primary}, 23px 0 0 ${p => p.theme.colors.primary}, -23px 0 0 ${p => p.theme.colors.primary}, 15px 15px 0 ${p => p.theme.colors.primary}, -15px 15px 0 ${p => p.theme.colors.primary}, 15px -15px 0 ${p => p.theme.colors.primary}, -15px -15px 0 ${p => p.theme.colors.primary}; transform: scale(${p => (p.isDark ? 1 : 0)}); transition: all 0.35s ease; ${p => mediaqueries.tablet` transform: scale(${p.isDark ? 0.92 : 0}); `} } `; const MoonMask = styled.div<{ isDark: boolean }>` position: absolute; right: -1px; top: -8px; height: 24px; width: 24px; border-radius: 50%; border: 0; background: ${p => p.theme.colors.background}; transform: translate(${p => (p.isDark ? "14px, -14px" : "0, 0")}); opacity: ${p => (p.isDark ? 0 : 1)}; transition: ${p => p.theme.colorModeTransition}, transform 0.45s ease; `; const Hidden = styled.span` position: absolute; display: inline-block; opacity: 0; width: 0px; height: 0px; visibility: hidden; overflow: hidden; `;