import React from "react"; import { Flex, IconButton, useColorMode } from "@chakra-ui/core"; import { motion, AnimatePresence } from "framer-motion"; import ResetButton from "~/components/ResetButton"; import useMedia from "~/components/MediaProvider"; import Title from "~/components/Title"; const AnimatedFlex = motion.custom(Flex); const AnimatedResetButton = motion.custom(ResetButton); const titleVariants = { sm: { fullSize: { scale: 1, marginLeft: 0 }, small: { marginLeft: "auto" } }, md: { fullSize: { scale: 1 }, small: { scale: 1 } }, lg: { fullSize: { scale: 1 }, small: { scale: 1 } }, xl: { fullSize: { scale: 1 }, small: { scale: 1 } } }; const icon = { light: "moon", dark: "sun" }; const bg = { light: "white", dark: "black" }; const colorSwitch = { dark: "Switch to light mode", light: "Switch to dark mode" }; const headerTransition = { type: "spring", ease: "anticipate", damping: 15, stiffness: 100 }; export default ({ height, isSubmitting, handleFormReset, ...props }) => { const { colorMode, toggleColorMode } = useColorMode(); const { mediaSize } = useMedia(); const resetButton = ( ); const title = ( </AnimatedFlex> ); const colorModeToggle = ( <AnimatedFlex layoutTransition={headerTransition} key="colorModeToggle" alignItems="center" initial={{ opacity: 0 }} animate={{ opacity: 1 }} mb={[null, "auto"]} > <IconButton aria-label={colorSwitch[colorMode]} variant="ghost" color="current" ml={2} pl={0} fontSize="20px" onClick={toggleColorMode} icon={icon[colorMode]} /> </AnimatedFlex> ); const layout = { false: { sm: [title, resetButton, colorModeToggle], md: [resetButton, title, colorModeToggle], lg: [resetButton, title, colorModeToggle], xl: [resetButton, title, colorModeToggle] }, true: { sm: [resetButton, colorModeToggle, title], md: [resetButton, title, colorModeToggle], lg: [resetButton, title, colorModeToggle], xl: [resetButton, title, colorModeToggle] } }; return ( <Flex px={2} top="0" left="0" right="0" zIndex="4" as="header" width="full" flex="1 0 auto" position="fixed" bg={bg[colorMode]} color="gray.500" height={height} {...props} > <Flex w="100%" mx="auto" py={6} justify="space-between" alignItems="center"> {layout[isSubmitting][mediaSize]} </Flex> </Flex> ); };