import * as React from "react"; import { Flex, useColorMode } from "@chakra-ui/core"; import { motion, AnimatePresence } from "framer-motion"; import { useConfig, useHyperglassState, useMedia } from "app/context"; import { Title, ResetButton, ColorModeToggle } from "app/components"; const titleVariants = { sm: { fullSize: { scale: 1, marginLeft: 0 }, smallLogo: { marginLeft: "auto" }, smallText: { marginLeft: "auto" } }, md: { fullSize: { scale: 1 }, smallLogo: { scale: 0.5 }, smallText: { scale: 0.8 } }, lg: { fullSize: { scale: 1 }, smallLogo: { scale: 0.5 }, smallText: { scale: 0.8 } }, xl: { fullSize: { scale: 1 }, smallLogo: { scale: 0.5 }, smallText: { scale: 0.8 } } }; const bg = { light: "white", dark: "black" }; const headerTransition = { type: "spring", ease: "anticipate", damping: 15, stiffness: 100 }; const titleJustify = { true: ["flex-end", "flex-end", "center", "center"], false: ["flex-start", "flex-start", "center", "center"] }; const titleHeight = { true: null, false: [null, "20vh", "20vh", "20vh"] }; const resetButtonMl = { true: [null, 2, 2, 2], false: null }; const widthMap = { text_only: "100%", logo_only: ["90%", "90%", "50%", "50%"], logo_subtitle: ["90%", "90%", "50%", "50%"], all: ["90%", "90%", "50%", "50%"] }; export const Header = ({ layoutRef, ...props }) => { const AnimatedFlex = motion.custom(Flex); const AnimatedResetButton = motion.custom(ResetButton); const { colorMode } = useColorMode(); const { web } = useConfig(); const { mediaSize } = useMedia(); const { isSubmitting, resetForm } = useHyperglassState(); const handleFormReset = () => { resetForm(layoutRef); }; const resetButton = ( ); const title = ( </AnimatedFlex> ); const colorModeToggle = ( <AnimatedFlex layoutTransition={headerTransition} key="colorModeToggle" alignItems="center" initial={{ opacity: 0 }} animate={{ opacity: 1 }} mb={[null, "auto"]} mr={isSubmitting ? null : 2} > <ColorModeToggle /> </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} zIndex="4" as="header" width="full" flex="0 1 auto" bg={bg[colorMode]} color="gray.500" {...props} > <Flex w="100%" mx="auto" pt={6} justify="space-between" flex="1 0 auto" alignItems={isSubmitting ? "center" : "flex-start"} > {layout[isSubmitting][mediaSize]} </Flex> </Flex> ); };