import React, {useContext, ButtonHTMLAttributes, AnchorHTMLAttributes, forwardRef} from 'react' import {IconElement, Icon, IconScale} from '../data/icon' import { Spacing, TransitionDuration, FontSize, MarginProps, extractStyleProps } from '../style/helpers' import {cssRuleWithTheme, useThemeStyle} from '../style/themeContext' import {NavigationContext} from '../navigation/navigation' interface MenuButtonStyleProps extends MarginProps { disabled?: boolean active?: boolean isCollapsed: boolean } const MenuButtonStyle = cssRuleWithTheme( ({theme, isCollapsed, disabled, active, ...props}) => ({ _className: process.env.NODE_ENV !== 'production' ? 'MenuButton' : undefined, cursor: 'pointer', pointerEvents: disabled ? 'none' : undefined, userSelect: 'none', overflow: 'hidden', display: 'flex', alignItems: 'center', padding: `12px 18px`, width: '100%', fontSize: FontSize.Medium, textAlign: 'left', fill: active ? theme.colors.primaryDark : theme.colors.dark, color: theme.colors.dark, backgroundColor: active ? 'rgba(0, 0, 0, 0.05)' : 'transparent', border: 'none', transitionProperty: 'background-color, fill', transitionTimingFunction: 'ease-in', transitionDuration: TransitionDuration.Fast, opacity: disabled ? 0.5 : undefined, ':hover': { backgroundColor: 'rgba(0, 0, 0, 0.025)', fill: theme.colors.dark }, ':active': { backgroundColor: 'rgba(0, 0, 0, 0.05)', fill: theme.colors.primaryDark }, ':focus': { outline: 'none' }, ...props }) ) const LabelStyle = cssRuleWithTheme(({isCollapsed}) => ({ _className: process.env.NODE_ENV !== 'production' ? 'MenuButtonLabel' : undefined, marginLeft: Spacing.ExtraSmall, whiteSpace: 'nowrap', opacity: isCollapsed ? 0 : 1, transitionProperty: 'opacity', transitionTimingFunction: 'ease-in', transitionDuration: TransitionDuration.Slow })) export interface BaseMenuButtonProps extends MarginProps { label?: string icon: IconElement iconScale?: IconScale hideLabel?: boolean disabled?: boolean active?: boolean } export interface MenuButtonProps extends BaseMenuButtonProps, ButtonHTMLAttributes {} export const MenuButton = forwardRef(function MenuButton( {label, iconScale = IconScale.Larger, icon, disabled, active, ...props}, ref ) { const [layoutProps, elementProps] = extractStyleProps(props) const {isCollapsed} = useContext(NavigationContext) const css = useThemeStyle({isCollapsed, disabled, active, ...layoutProps}) return ( ) }) export interface MenuLinkButtonProps extends BaseMenuButtonProps, AnchorHTMLAttributes {} export const MenuLinkButton = forwardRef( function MenuLinkButton( {label, iconScale = IconScale.Larger, icon, disabled, active, ...props}, ref ) { const [layoutProps, elementProps] = extractStyleProps(props) const {isCollapsed} = useContext(NavigationContext) const css = useThemeStyle({isCollapsed, disabled, active, ...layoutProps}) return ( {label} ) } )