import {lazy, Suspense} from 'react'; import styled from '@emotion/styled'; import LoadingMask from 'sentry/components/loadingMask'; import {space} from 'sentry/styles/space'; type Props = { children: React.ReactNode; /** * An icon may be passed as a string name which will be dynamically with a * ContextIcon or a react node will simply render. */ icon?: string | React.ReactElement; }; const ContextIcon = lazy(() => import('./contextIcon')); function Item({children, icon = 'unknown'}: Props) { // XXX: Codesplit the ContextIcon component since it packs a lot of SVGs const iconNode = typeof icon === 'string' ? ( }> ) : ( icon ); return ( {iconNode} {children &&
{children}
}
); } export default Item; const Details = styled('div')` display: flex; flex-direction: column; justify-content: center; min-height: 48px; min-width: 0; `; const IconContainer = styled('div')` width: 36px; height: 36px; display: flex; flex-shrink: 0; align-items: center; justify-content: center; `; const ItemContainer = styled('div')` position: relative; display: flex; gap: ${space(1)}; align-items: center; max-width: 25%; h3 { ${p => p.theme.overflowEllipsis} font-size: ${p => p.theme.fontSizeLarge}; margin-bottom: ${space(0.25)}; } p { font-size: ${p => p.theme.fontSizeSmall}; &:last-child { margin: 0; } } @media (max-width: ${p => p.theme.breakpoints.small}) { max-width: initial; padding-top: ${space(0.5)}; padding-bottom: ${space(0.5)}; :not(:first-child) { border-top: 1px solid ${p => p.theme.innerBorder}; } } `;