import styled, { DefaultTheme } from "styled-components"; import { space, layout, variant } from "styled-system"; import { scaleVariants, styleVariants } from "./theme"; import { BaseButtonProps } from "./types"; import "@fontsource/source-sans-pro"; interface ThemedButtonProps extends BaseButtonProps { theme: DefaultTheme; } interface TransientButtonProps extends ThemedButtonProps { $isLoading?: boolean; } const getDisabledStyles = ({ $isLoading, theme }: TransientButtonProps) => { if ($isLoading === true) { return ` &:disabled, &.pancake-button--disabled { cursor: not-allowed; } `; } return ` &:disabled, &.pancake-button--disabled { background-color: ${theme.colors.backgroundDisabled}; border-color: ${theme.colors.backgroundDisabled}; color: ${theme.colors.textDisabled}; cursor: not-allowed; } `; }; /** * This is to get around an issue where if you use a Link component * React will throw a invalid DOM attribute error * @see https://github.com/styled-components/styled-components/issues/135 */ const getOpacity = ({ $isLoading = false }: TransientButtonProps) => { return $isLoading ? ".5" : "1"; }; const StyledButton = styled.button` position: relative; height: 60px; width: 200px; margin: 0 35px; border-radius: 50px; border: none; outline: none; width: 200px; cursor: pointer; border-radius: 50px; moz-transition: all .4s ease-in-out; -o-transition: all .4s ease-in-out; -webkit-transition: all .4s ease-in-out; transition: all .4s ease-in-out; background-size: 400%; text-transform: uppercase; font-family: 'Roboto', sans-serif; transition: background 0.5s; background-image: linear-gradient(to right, #ed6ea0, #ec8c69, #f7186a , #FBB03B); box-shadow: 0 4px 15px 0 rgba(236, 116, 149, 0.75); &:hover:not(:disabled):not(.pancake-button--disabled):not(.pancake-button--disabled):not(:active) { background-position: 100% 0; moz-transition: all .4s ease-in-out; -o-transition: all .4s ease-in-out; -webkit-transition: all .4s ease-in-out; transition: all .4s ease-in-out; } &:active:not(:disabled):not(.pancake-button--disabled):not(.pancake-button--disabled) { background-position: 100% 0; moz-transition: all .4s ease-in-out; -o-transition: all .4s ease-in-out; -webkit-transition: all .4s ease-in-out; transition: all .4s ease-in-out; } ${getDisabledStyles} ${variant({ prop: "scale", variants: scaleVariants, })} ${variant({ variants: styleVariants, })} ${layout} ${space} `; export default StyledButton;