import React, {forwardRef, ButtonHTMLAttributes, AnchorHTMLAttributes} from 'react' import {styled} from '@karma.run/react' import { Spacing, TransitionDuration, FontSize, MarginProps, extractStyleProps } from '../style/helpers' import {cssRuleWithTheme, themeMiddleware, Theme} from '../style/themeContext' import {Icon, IconScale, IconElement} from '../data/icon' import {Box} from '../layout/box' interface NavigationButtonStyleProps extends MarginProps { disabled?: boolean active?: boolean theme: Theme } const NavigationButtonStyle = cssRuleWithTheme( ({disabled, active, theme, ...props}) => ({ _className: process.env.NODE_ENV !== 'production' ? 'NavigationButton' : undefined, cursor: 'pointer', pointerEvents: disabled ? 'none' : undefined, userSelect: 'none', display: 'inline-flex', flexDirection: 'column', justifyContent: 'center', alignItems: 'center', minWidth: 70, height: 60, fontSize: FontSize.Small, fontFamily: 'inherit', paddingLeft: Spacing.ExtraSmall, paddingRight: Spacing.ExtraSmall, fill: disabled ? theme.colors.gray : active ? theme.colors.action : theme.colors.dark, color: disabled ? theme.colors.gray : theme.colors.dark, borderWidth: 0, borderRadius: 0, borderStyle: 'none', backgroundColor: active ? 'rgba(0, 0, 0, 0.05)' : 'transparent', transitionProperty: 'fill, background-color', transitionTimingFunction: 'ease-in', transitionDuration: TransitionDuration.Fast, ':link': { fill: disabled ? theme.colors.gray : theme.colors.dark, color: disabled ? theme.colors.gray : theme.colors.dark }, ':visited': { fill: disabled ? theme.colors.gray : theme.colors.dark, color: disabled ? theme.colors.gray : theme.colors.dark }, ':hover': { fill: theme.colors.action, backgroundColor: 'rgba(0, 0, 0, 0.025)' }, ':active': { fill: theme.colors.actionDark, backgroundColor: 'rgba(0, 0, 0, 0.05)' }, ':focus': { outline: 'none', backgroundColor: 'rgba(0, 0, 0, 0.025)' }, ...props }) ) const NavigationButtonWrapper = styled('button', NavigationButtonStyle, themeMiddleware) const NavigationLinkButtonWrapper = styled('a', NavigationButtonStyle, themeMiddleware) export interface BaseNavigationButtonProps extends MarginProps { icon: IconElement label: string disabled?: boolean active?: boolean } export type NavigationButtonProps = BaseNavigationButtonProps & ButtonHTMLAttributes export const NavigationButton = forwardRef( function NavigationButton({label, icon, disabled, active, ...props}, ref) { const [layoutProps, elementProps] = extractStyleProps(props) return ( {label} ) } ) export type NavigationLinkButtonProps = BaseNavigationButtonProps & AnchorHTMLAttributes export const NavigationLinkButton = forwardRef( function NavigationLinkButton({label, icon, disabled, active, ...props}, ref) { const [layoutProps, elementProps] = extractStyleProps(props) return ( {label} ) } )