import {Theme, useTheme} from '@emotion/react'; import styled from '@emotion/styled'; import Color from 'color'; import space from 'sentry/styles/space'; interface SizeProp { size: 'md' | 'lg'; } interface Props extends SizeProp { /** * value is either a CSS color string (e.g. #000) * or a key in the theme object (e.g. 'blue300') */ value: string | keyof Theme; noText?: boolean; /** * to replace the parsed color name with a custom name */ textOverwrite?: string; } interface WrapperProps extends SizeProp { noText: boolean; } interface ColorSwatchProps extends SizeProp { background: string; border: boolean; } function ColorChip({value, size = 'md', noText = false, textOverwrite}: Props) { const theme = useTheme(); const isThemeColor = value in theme; const color = Color(isThemeColor ? theme[value] : value); const colorString = isThemeColor ? value.split(/(\d+)/).join(' ').trim() : color?.hex?.(); return ( 0.8} /> {!noText && {textOverwrite ?? colorString}} ); } export default ColorChip; const OuterWrap = styled('span')` align-items: center; ${p => p.size === 'lg' ? ` display: flex; margin: ${space(2)} auto; ` : ` display: inline-flex; height: 1em; `} `; const Wrapper = styled('span')` display: flex; align-items: center; border-radius: ${p => p.theme.borderRadius}; ${p => !p.noText && `border: solid 1px ${p.theme.border};`} ${p => p.size === 'lg' ? ` flex-direction: column; ${!p.noText && `padding: ${space(0.5)}`} ` : ` transform: translateY(0.25em); ${ !p.noText && `padding: ${space(0.25)} ${space(0.5)} ${space(0.25)} ${space(0.25)};` } `}; `; const Text = styled('span')` margin-bottom: 0; line-height: 1.2; text-transform: capitalize; ${p => (p.size === 'lg' ? `margin-top: ${space(0.5)};` : `margin-left: ${space(0.5)};`)} `; const ColorSwatch = styled('span')` display: inline; border-radius: ${p => p.theme.borderRadius}; background-color: ${p => p.background}; ${p => p.border && `border: solid 1px ${p.theme.border};`} ${p => p.size === 'lg' ? ` width: 4.5em; height: 4.5em; ` : ` width: 1.2em; height: 1.2em; `}; `;