import React, { AnchorHTMLAttributes, ButtonHTMLAttributes, DetailedHTMLProps } from 'react'; import { styled, isPropValid } from '@storybook/theming'; interface ButtonProps extends DetailedHTMLProps, HTMLButtonElement> { href?: void; } interface LinkProps extends DetailedHTMLProps, HTMLAnchorElement> { href: string; } const ButtonOrLink = ({ children, ...restProps }: ButtonProps | LinkProps) => restProps.href != null ? ( {children} ) : ( ); export interface TabButtonProps { active?: boolean; textColor?: string; } export const TabButton = styled(ButtonOrLink, { shouldForwardProp: isPropValid })( { whiteSpace: 'normal', display: 'inline-flex', overflow: 'hidden', verticalAlign: 'top', justifyContent: 'center', alignItems: 'center', textAlign: 'center', textDecoration: 'none', '&:empty': { display: 'none', }, }, ({ theme }) => ({ padding: '0 15px', transition: 'color 0.2s linear, border-bottom-color 0.2s linear', height: 40, lineHeight: '12px', cursor: 'pointer', background: 'transparent', border: '0 solid transparent', borderTop: '3px solid transparent', borderBottom: '3px solid transparent', fontWeight: 'bold', fontSize: 13, '&:focus': { outline: '0 none', borderBottomColor: theme.color.secondary, }, }), ({ active, textColor, theme }) => active ? { color: textColor || theme.barSelectedColor, borderBottomColor: theme.barSelectedColor, } : { color: textColor || 'inherit', borderBottomColor: 'transparent', } ); TabButton.displayName = 'TabButton'; export interface IconButtonProps { active?: boolean; } export const IconButton = styled(ButtonOrLink, { shouldForwardProp: isPropValid })( ({ theme }) => ({ display: 'inline-flex', height: 40, background: 'none', color: 'inherit', padding: 0, cursor: 'pointer', border: '0 solid transparent', borderTop: '3px solid transparent', borderBottom: '3px solid transparent', transition: 'color 0.2s linear, border-bottom-color 0.2s linear', '&:hover, &:focus': { outline: '0 none', color: theme.color.secondary, }, '& > svg': { width: 15, }, }), ({ active, theme }) => active ? { outline: '0 none', borderBottomColor: theme.color.secondary, } : {} ); IconButton.displayName = 'IconButton';