sanity
Version:
Sanity is a real-time content infrastructure with a scalable, hosted backend featuring a Graph Oriented Query Language (GROQ), asset pipelines and fast edge caches
77 lines (67 loc) • 1.89 kB
text/typescript
import {rem} from '@sanity/ui'
import styled, {css} from 'styled-components'
import {PREVIEW_SIZES} from '../constants'
import {type PreviewLayoutKey, type PreviewMediaDimensions} from '../types'
export const MediaWrapper = styled.span<{
$dimensions: PreviewMediaDimensions
$layout: PreviewLayoutKey
$radius: number
$responsive: boolean
}>((props) => {
const {$dimensions, $layout, $radius, $responsive} = props
const width = $dimensions.width || 0
const height = $dimensions.width || 0
const iconSize = PREVIEW_SIZES[$layout].icon
return css`
position: relative;
width: ${$responsive ? '100%' : rem(width)};
height: ${$responsive ? '100%' : rem(height)};
min-width: ${$responsive ? undefined : rem(width)};
border-radius: ${({theme}) => rem(theme.sanity.radius[$radius])};
display: flex;
overflow: hidden;
overflow: clip;
align-items: center;
justify-content: center;
& img {
position: absolute;
left: 0;
top: 0;
width: 100%;
height: 100%;
object-fit: contain;
border-radius: inherit;
}
& svg {
// Shared styles for SVG icons
color: var(--card-icon-color);
display: block;
flex: 1;
// Specific styles for non Sanity icons
&:not([data-sanity-icon]) {
height: 1em;
width: 1em;
max-width: 1em;
max-height: 1em;
}
// Specific styles for Sanity icons
&[data-sanity-icon] {
display: block;
font-size: calc(${iconSize} / 16 * 1em);
}
}
& > span[data-border] {
display: block;
position: absolute;
left: 0;
top: 0;
right: 0;
bottom: 0;
box-shadow: inset 0 0 0 1px var(--card-fg-color);
opacity: 0.1;
border-radius: inherit;
pointer-events: none;
}
`
})
MediaWrapper.displayName = 'MediaWrapper'