import React, { Fragment } from 'react' import PropTypes from 'prop-types' import classNames from 'classnames' import SVG from 'react-inlinesvg' import gitHubIcon from '../images/icons/github.svg' import twitterIcon from '../images/icons/twitter.svg' import websiteIcon from '../images/icons/website.svg' import warningIcon from '../images/icons/warning.svg' import infoIcon from '../images/icons/info.svg' import acceptIcon from '../images/icons/accept.svg' import rejectIcon from '../images/icons/reject.svg' import docsIcon from '../images/icons/docs.svg' import codeIcon from '../images/icons/code.svg' import helpIcon from '../images/icons/help.svg' import helpOutlineIcon from '../images/icons/help-outline.svg' import arrowRightIcon from '../images/icons/arrow-right.svg' import yesIcon from '../images/icons/yes.svg' import noIcon from '../images/icons/no.svg' import neutralIcon from '../images/icons/neutral.svg' import offlineIcon from '../images/icons/offline.svg' import searchIcon from '../images/icons/search.svg' import moonIcon from '../images/icons/moon.svg' import clipboardIcon from '../images/icons/clipboard.svg' import networkIcon from '../images/icons/network.svg' import downloadIcon from '../images/icons/download.svg' import packageIcon from '../images/icons/package.svg' import { isString } from './util' import classes from '../styles/icon.module.sass' const icons = { github: gitHubIcon, twitter: twitterIcon, website: websiteIcon, warning: warningIcon, danger: infoIcon, info: infoIcon, accept: acceptIcon, reject: rejectIcon, docs: docsIcon, code: codeIcon, help: helpIcon, help2: helpOutlineIcon, arrowright: arrowRightIcon, yes: yesIcon, no: noIcon, neutral: neutralIcon, offline: offlineIcon, search: searchIcon, moon: moonIcon, clipboard: clipboardIcon, network: networkIcon, download: downloadIcon, package: packageIcon, } export default function Icon({ name, width = 20, height, inline = false, variant, className, ...props }) { const icon = icons[name] const iconClassNames = classNames(classes.root, className, { [classes.inline]: inline, [classes.success]: variant === 'success', [classes.error]: variant === 'error', [classes.subtle]: variant === 'subtle', }) return !icon ? null : ( ) } Icon.propTypes = { name: PropTypes.oneOf(Object.keys(icons)), width: PropTypes.number, height: PropTypes.number, inline: PropTypes.bool, variant: PropTypes.oneOf(['success', 'error', 'subtle']), className: PropTypes.string, } export function replaceEmoji(cellChildren) { const icons = { '✅': { name: 'yes', variant: 'success', 'aria-label': 'positive' }, '❌': { name: 'no', variant: 'error', 'aria-label': 'negative' }, } const iconRe = new RegExp(`^(${Object.keys(icons).join('|')})`, 'g') let children = isString(cellChildren) ? [cellChildren] : cellChildren let hasIcon = false if (Array.isArray(children)) { children = children.map((child, i) => { if (isString(child)) { const icon = icons[child.trim()] if (icon) { hasIcon = true return ( ) } else if (iconRe.test(child)) { hasIcon = true const [, iconName, text] = child.split(iconRe) return ( {text.replace(/^\s+/g, '')} ) } // Work around prettier auto-escape if (child.startsWith('\\')) return child.slice(1) } return child }) } return { content: children, hasIcon } }