/ app / src / components / LoadingAnimation.tsx
LoadingAnimation.tsx
 1  import React, { useState, useEffect } from 'react';
 2  import './LoadingAnimation.css';
 3  
 4  const characters = '0123456789abcdefABCDEF#';
 5  
 6  export const LoadingAnimation: React.FC<{ width?: number }> = ({ width = 80 }) => {
 7    const [frame, setFrame] = useState(0);
 8  
 9    useEffect(() => {
10      const interval = setInterval(() => {
11        setFrame(prev => prev + 1);
12      }, 50);
13  
14      return () => clearInterval(interval);
15    }, []);
16  
17    const generateRow = (reverse: boolean) => {
18      const chars: React.ReactElement[] = [];
19      for (let i = 0; i < width; i++) {
20        const pos = reverse ? 1 - i / (width - 1) : i / (width - 1);
21        const r = Math.floor(255 * (1 - pos) + 255 * pos);
22        const g = Math.floor(69 * (1 - pos) + 140 * pos);
23        const b = 0;
24  
25        const randomChar = characters[Math.floor(Math.random() * characters.length)];
26  
27        chars.push(
28          <span
29            key={i}
30            style={{ color: `rgb(${r}, ${g}, ${b})` }}
31          >
32            {randomChar}
33          </span>
34        );
35      }
36      return chars;
37    };
38  
39    return (
40      <div className="loading-animation" data-frame={frame}>
41        <div className="gradient-row">{generateRow(false)}</div>
42        <div className="gradient-row">{generateRow(true)}</div>
43        <div className="gradient-row">{generateRow(false)}</div>
44      </div>
45    );
46  };