mirror of
https://github.com/hanzoai/sentinel.git
synced 2026-09-29 22:34:33 +00:00
53 lines
1.3 KiB
TypeScript
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;
|
|
`;
|