import React, { useState } from "react"; import styled from "@emotion/styled"; import { useColorMode } from "theme-ui"; import mediaqueries from "@styles/media"; import { copyToClipboard } from "@utils"; const ShareDarkModeOffIcon: React.FC<{}> = () => ( ); const ShareDarkModeOnIcon: React.FC<{}> = () => ( ); 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`; function copyToClipboardOnClick() { if (hasCopied) return; copyToClipboard(window.location.href); setHasCopied(true); setTimeout(() => { setHasCopied(false); }, 1000); } const Icon = isDark ? ShareDarkModeOffIcon : ShareDarkModeOnIcon; return ( Copied ); }; const ArticleControls: React.FC<{}> = () => { return ( ); }; export default ArticleControls; const NavControls = styled.div` display: flex; align-items: center; justify-content: center; `; 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` opacity: 0.5; position: relative; z-index: 200000000; 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; } ${mediaqueries.tablet` display: inline-flex; transform: scale(0.9); margin: 0 15px; &: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: transform 0.45s ease, ${p => p.theme.colorModeTransition}; `;