/** * Copyright (c) 2018 - present Zilliqa Research Pte. Ltd. * * This program is free software: you can redistribute it and/or modify it under the * terms of the GNU General Public License as published by the Free Software * Foundation, either version 3 of the License, or (at your option) any later * version. * * This program is distributed in the hope that it will be useful, but WITHOUT ANY * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR * A PARTICULAR PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along with * this program. If not, see . */ import * as React from 'react'; import styled from 'styled-components'; import { colors } from '../../colors'; const StyledButton = styled.button` outline: none; margin: 0; font-family: inherit; overflow: visible; text-transform: none; display: inline-block; font-weight: 400; text-align: center; vertical-align: middle; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; background-color: transparent; border: 1px solid transparent; transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; &::-webkit-file-upload-button { font: inherit; -webkit-appearance: button; } & [type='button'], [type='reset'], [type='submit'] { -webkit-appearance: button; } &:not(:disabled), [type='button']:not(:disabled), [type='reset']:not(:disabled), [type='submit']:not(:disabled) { cursor: pointer; } &::-moz-focus-inner, [type='button']::-moz-focus-inner, [type='reset']::-moz-focus-inner, [type='submit']::-moz-focus-inner { padding: 0; border-style: none; } &:disabled { cursor: not-allowed; } ${({ size }) => size === 'large' ? `&{ padding: 0.5rem 1rem; font-size: 1.25rem; line-height: 1.5; border-radius: 0.3rem; }` : size === 'small' ? `&{ padding: 0.25rem 0.5rem; font-size: 0.875rem; line-height: 1.5; border-radius: 0.2rem; }` : `&{ padding: 0.375rem 0.75rem; font-size: 1rem; line-height: 1.5; border-radius: 0.25rem; }`} ${({ level }) => level === 'primary' ? `&{ background-color: ${colors.teal600}; color: ${colors.white}; border-color: transparent; }&:hover,:active,:focus{ background-color: ${colors.teal500}; color: ${colors.white}; border-color: 'transparent'; }&:disabled{ color: ${colors.gray500}; background-color: ${colors.teal600}; }` : level === 'secondary' ? `&{ background-color: transparent; color: ${colors.gray500}; border-color: ${colors.gray500}; }&:hover,:active,:focus{ color: ${colors.white}; border-color: ${colors.white}; }&:disabled{ color: ${colors.gray600}; border-color: ${colors.gray600}; }` : level === 'tertiary' ? `&{ background-color: transparent; color: ${colors.gray500}; border-color: transparent; }&:hover,:active,:focus{ color: ${colors.white}; }&:disabled{ color: ${colors.gray600}; }` : ``} `; interface IProps { readonly level: ButtonLevelType; readonly size?: SizeType; readonly text?: string; readonly onClick?: (e?) => void; readonly id?: string; readonly disabled?: boolean; readonly before?: React.ReactNode; readonly after?: React.ReactNode; readonly className?: string; readonly type?: ButtonType; readonly style?: object; readonly testId?: string; } type ButtonType = 'button' | 'submit' | 'reset'; type SizeType = 'large' | 'medium' | 'small'; type ButtonLevelType = 'primary' | 'secondary' | 'tertiary'; const Button: React.FunctionComponent = ({ text = '', size = 'medium', className = '', type = 'submit', disabled, onClick, before, after, style, level, testId, ...rest }) => ( {before ? before : null} {text} {after ? after : null} ); export default Button;