Files
2024-02-15 17:01:50 +00:00

53 lines
1.3 KiB
TypeScript

import {keyframes} from '@emotion/react';
import styled from '@emotion/styled';
import {space} from 'sentry/styles/space';
const SPACING = 15;
export function TimelinePlaceholder() {
return (
<PlaceholderSvg xmlns="http://www.w3.org/2000/svg" width="100%" height="14px">
<defs>
<pattern
id="tick-pattern"
patternUnits="userSpaceOnUse"
width={SPACING + 4}
height={24}
>
<rect width="4px" height="14px" rx="2" fill="white" />
</pattern>
<mask id="pattern-mask">
<rect width="100%" height="100%" fill="url(#tick-pattern)" />
</mask>
</defs>
<foreignObject width="100%" height="14" mask="url(#pattern-mask)">
<AnimatedGradient />
</foreignObject>
</PlaceholderSvg>
);
}
const PlaceholderSvg = styled('svg')`
margin: ${space(0.5)} 0;
`;
const gradientAnimation = keyframes`
0%{ background-position-x: 0%; }
100%{ background-position-x: -200%; }
`;
const AnimatedGradient = styled('div')`
width: 100%;
height: 100%;
background-image: linear-gradient(
90deg,
${p => p.theme.border} 0%,
rgba(255, 255, 255, 0) 20%,
rgba(255, 255, 255, 0) 80%,
${p => p.theme.border} 100%
);
background-size: 200% 100%;
animation: ${gradientAnimation} 2s linear infinite;
`;