You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			87 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			TypeScript
		
	
			
		
		
	
	
			87 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			TypeScript
		
	
import React from 'react';
 | 
						|
import styled from 'styled-components';
 | 
						|
 | 
						|
const StyledTypingContainer = styled.div`
 | 
						|
  display: inline-flex;
 | 
						|
  flex-direction: row;
 | 
						|
  align-items: center;
 | 
						|
 | 
						|
  height: 8px;
 | 
						|
  width: 38px;
 | 
						|
  padding-inline-start: 1px;
 | 
						|
  padding-inline-end: 1px;
 | 
						|
`;
 | 
						|
 | 
						|
const StyledTypingDot = styled.div<{ index: number }>`
 | 
						|
  border-radius: 50%;
 | 
						|
  background-color: var(--text-secondary-color);
 | 
						|
 | 
						|
  height: 6px;
 | 
						|
  width: 6px;
 | 
						|
  opacity: 0.4;
 | 
						|
 | 
						|
  @keyframes typing-animation-first {
 | 
						|
    0% {
 | 
						|
      opacity: 0.4;
 | 
						|
    }
 | 
						|
    20% {
 | 
						|
      transform: scale(1.3);
 | 
						|
      opacity: 1;
 | 
						|
    }
 | 
						|
    40% {
 | 
						|
      opacity: 0.4;
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  @keyframes typing-animation-second {
 | 
						|
    10% {
 | 
						|
      opacity: 0.4;
 | 
						|
    }
 | 
						|
    30% {
 | 
						|
      transform: scale(1.3);
 | 
						|
      opacity: 1;
 | 
						|
    }
 | 
						|
    50% {
 | 
						|
      opacity: 0.4;
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  @keyframes typing-animation-third {
 | 
						|
    20% {
 | 
						|
      opacity: 0.4;
 | 
						|
    }
 | 
						|
    40% {
 | 
						|
      transform: scale(1.3);
 | 
						|
      opacity: 1;
 | 
						|
    }
 | 
						|
    60% {
 | 
						|
      opacity: 0.4;
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  animation: ${props =>
 | 
						|
      props.index === 0
 | 
						|
        ? 'typing-animation-first'
 | 
						|
        : props.index === 1
 | 
						|
          ? 'typing-animation-second'
 | 
						|
          : 'typing-animation-third'}
 | 
						|
    1600ms ease infinite;
 | 
						|
`;
 | 
						|
 | 
						|
const StyledSpacer = styled.div`
 | 
						|
  flex-grow: 1;
 | 
						|
`;
 | 
						|
 | 
						|
export const TypingAnimation = () => {
 | 
						|
  return (
 | 
						|
    <StyledTypingContainer title={window.i18n('typingAlt')} aria-label={window.i18n('typingAlt')}>
 | 
						|
      <StyledTypingDot index={0} />
 | 
						|
      <StyledSpacer />
 | 
						|
      <StyledTypingDot index={1} />
 | 
						|
 | 
						|
      <StyledSpacer />
 | 
						|
      <StyledTypingDot index={2} />
 | 
						|
    </StyledTypingContainer>
 | 
						|
  );
 | 
						|
};
 |