UNPKG

react-cm-ui

Version:
164 lines (144 loc) 4.66 kB
import ClassNames from 'classnames'; import PropTypes from 'prop-types'; import React from 'react'; import HeaderSubheader from './headerSubheader'; import Icon from '../icon'; import Utils from '../../utils/utils'; const asEnums = ['h1', 'h2', 'h3', 'h4', 'h5', 'h6']; const colorEnums = ['static', 'text']; const weightEnums = ['bold', 'normal', 'semibold']; const propTypes = { anchor: PropTypes.string, as: PropTypes.oneOf(asEnums), className: PropTypes.string, color: PropTypes.oneOf(colorEnums), icon: PropTypes.bool, inverse: PropTypes.bool, size: PropTypes.oneOf(Utils.sizeEnums()), style: PropTypes.shape({}), sub: PropTypes.bool, title: PropTypes.string, weight: PropTypes.oneOf(weightEnums), }; const defaultProps = { anchor: undefined, as: undefined, className: undefined, color: undefined, icon: false, inverse: false, size: undefined, style: {}, sub: false, title: undefined, weight: undefined, }; class Header extends React.PureComponent { constructor() { super(); this.onAnchorClick = this.onAnchorClick.bind(this); } onAnchorClick() { const { anchor } = this.props; window.location.hash = anchor; } render() { const { anchor, as, children, className, color, icon, inverse, size, style, sub, title, weight, } = this.props; const ElementType = Utils.getElementType(as); const containerClasses = ClassNames('ui', 'header', className, { 'header-anchor': anchor, 'header-color-inverse': inverse, 'header-color-static': color === 'static', 'header-color-text': color === 'text', 'header-icon': icon, 'header-size-large': size === 'large', 'header-size-medium': size === 'medium', 'header-size-small': size === 'small', 'header-size-xlarge': size === 'xlarge', 'header-size-xsmall': size === 'xsmall', 'header-size-xxsmall': size === 'xxsmall', 'header-subheader': sub, 'header-weight-bold': weight === 'bold', 'header-weight-normal': weight === 'normal', 'header-weight-semibold': weight === 'semibold', }); let anchorIcon; if (anchor) { anchorIcon = ( <Icon className="header-anchor-icon" color="static" compact onClick={this.onAnchorClick} size="small" type="link" /> ); } if (icon && sub) { return ( <ElementType className={containerClasses} id={anchor} style={style}> <span style={{ display: 'inline-flex', alignItems: 'center', }} > {children[0]} {anchorIcon} </span> <div> {children[1]} {children[2]} </div> </ElementType> ); } return ( <ElementType className={containerClasses} id={anchor} style={style} title={title} > {anchor ? ( <span> {React.Children.map(children, (child, index) => { if (index === 0) { return ( <span style={{ display: 'inline-flex', alignItems: 'center', }} > {child} {anchorIcon} </span> ); } return child; })} </span> ) : children} </ElementType> ); } } Header.Subheader = HeaderSubheader; Header.propTypes = propTypes; Header.defaultProps = defaultProps; export default Header;