import React from 'react'; import styled from 'styled-components'; import v from '../../styles/Variables'; // theme for default styles, addon like cart {jsx}, shadow? interface Props { /** * valid hex/rgba color for the background */ background?: string; /** * callback function when the button is blurred */ blurCb?: () => void; /** * callback function when the button is clicked */ callback: () => void; /** * font color to be used, can be hex, rgba, or a variable */ color?: string; /** * Aria controls attribute */ controls?: string; /** * Aria expanded attribute */ ariaexpanded?: boolean; /** * callback function when the button is focused */ focusCb?: () => void; /** * font size in pixels */ fontSize?: number; /** * if the button should be inline-block or block */ fullWidth?: boolean; /** * padding applied to all 4 sides, in pixels, as a string (valid css) */ padding?: string; /** * the rounding amount of the button */ radius?: 'square' | 'rounded' | 'pill'; /** * If using our variables, any valid color variable, or default, dark, none */ theme?: string; /** * extra classes to be applied */ themeClass?: string; /** * the text of the button */ title: string; /** * what sort of button this should be */ type?: 'button' | 'submit' | 'reset'; } interface Style { background: string; color: string; controls?: string; ariaexpanded?: boolean; fontSize: number; fullWidth: boolean; padding: string; radius: 'square' | 'rounded' | 'pill'; theme: string; type: 'button' | 'submit' | 'reset'; } const Button = ({ background = v.colors.light, blurCb = () => null, callback, color = v.colors.dark, controls, ariaexpanded, focusCb = () => null, fontSize = 14, fullWidth = false, padding = '10px 50px', radius = 'square', theme = 'default', themeClass, title, type = 'button', }: Props) => { return ( callback()} onFocus={() => focusCb()} onBlur={() => blurCb()} className={`nwc--button ${themeClass}`} background={background} color={color} fontSize={fontSize} fullWidth={fullWidth} padding={padding} radius={radius} theme={theme} type={type} > {title} ); }; export default Button; const radiusSwitch = (type: string): string => { switch (type) { case 'square': return '0px'; case 'rounded': return '4px'; case 'pill': return '300px'; default: return '0px'; } }; const handleTheme = (theme: string) => { // if it's just the none theme, send it right back if (theme === 'none') return 'color: #000; border-color: #000; background-color: #fff'; // @ts-ignore const colorTheme: string = v.colors[theme]; // dynamically look for a color in our variables to style it if (theme && colorTheme !== undefined) { // check if it's light or dark if (['border', 'light', 'offLight', 'placeholder'].indexOf(theme) >= 0) { return `color: #000; background: ${colorTheme}; border-color: ${colorTheme}}`; } else { return `color: #fff; background: ${colorTheme}; border-color: ${colorTheme}}`; } } else { // if not found or not matching, just silently fail return null; } }; /* styles */ const Btn = styled.button