uui/components/buttons/LinkButton.tsx (69 lines of code) (raw):

import * as React from 'react'; import { Icon, devLogger, IDropdownToggler, IHasCaption, IHasIcon, uuiElement, Overwrite } from '@epam/uui-core'; import { Clickable, ClickableComponentProps, IconContainer } from '@epam/uui-components'; import * as types from '../types'; import { systemIcons } from '../../icons/icons'; import { settings } from '../../settings'; import { getIconClass } from './helper'; import cx from 'classnames'; import css from './LinkButton.module.scss'; const DEFAULT_COLOR = 'primary'; const DEFAULT_WEIGHT = 'semibold'; interface LinkButtonMods { /** * Defines component color * @default 'primary' */ color?: 'primary' | 'secondary' | 'accent' | 'critical' | 'white' | 'contrast'; } /** Represents the Core properties of the LinkButton component. */ export interface LinkButtonCoreProps extends ClickableComponentProps, IDropdownToggler, IHasIcon, IHasCaption { /** Icon for drop-down toggler */ dropdownIcon?: Icon; /** * Defines component size. * @default '36' */ size?: types.ControlSize | '42'; /** * Defines component font-weight * @default 'semibold' */ weight?: 'semibold' | 'regular'; /** * Defines component underline style */ underline?: 'solid' | 'dashed'; } export interface LinkButtonModsOverride {} /** Represents the properties of the LinkButton component. */ export interface LinkButtonProps extends LinkButtonCoreProps, Overwrite<LinkButtonMods, LinkButtonModsOverride> {} export const LinkButton = React.forwardRef<HTMLButtonElement | HTMLAnchorElement, LinkButtonProps>((props, ref) => { if (__DEV__ && props.color === 'contrast') { devLogger.warnAboutDeprecatedPropValue<LinkButtonProps, 'color'>({ component: 'LinkButton', propName: 'color', propValue: props.color, propValueUseInstead: 'white', condition: () => props.color === 'contrast', }); } const rootStyles = [ 'uui-link_button', css.root, `uui-size-${props.size || settings.sizes.defaults.linkButton}`, ...getIconClass(props), `uui-color-${props.color || DEFAULT_COLOR}`, props.cx, ]; const captionStyles = cx( uuiElement.caption, props.underline && `uui-underline-${props.underline}`, `uui-link-button-weight-${props.weight || DEFAULT_WEIGHT}`, ); const DropdownIcon = props.dropdownIcon ? props.dropdownIcon : systemIcons.foldingArrow; return ( <Clickable { ...props } type="button" cx={ rootStyles } ref={ ref } > { props.icon && props.iconPosition !== 'right' && ( <IconContainer icon={ props.icon } onClick={ !props.isDisabled ? props.onIconClick : undefined } /> ) } { props.caption && ( <div className={ captionStyles }>{ props.caption }</div> ) } { props.icon && props.iconPosition === 'right' && ( <IconContainer icon={ props.icon } onClick={ !props.isDisabled ? props.onIconClick : undefined } /> ) } { props.isDropdown && ( <IconContainer icon={ DropdownIcon } flipY={ props.isOpen } /> ) } </Clickable> ); });