export class PixelCounter { constructor() { this.patterns = { '1': [ '00100', '01100', '00100', '00100', '00100', '00100', '01110' ], '2': [ '01110', '10001', '00001', '00010', '00100', '01000', '11111' ], '3': [ '01110', '10001', '00001', '00110', '00001', '10001', '01110' ], '4': [ '00010', '00110', '01010', '10010', '11111', '00010', '00010' ], '5': [ '11111', '10000', '10000', '11110', '00001', '10001', '01110' ], '6': [ '01110', '10001', '10000', '11110', '10001', '10001', '01110' ], '7': [ '11111', '00001', '00010', '00100', '01000', '01000', '01000' ], '8': [ '01110', '10001', '10001', '01110', '10001', '10001', '01110' ], '9': [ '01110', '10001', '10001', '01111', '00001', '10001', '01110' ], '0': [ '01110', '10001', '10001', '10001', '10001', '10001', '01110' ], '.': [ '00000', '00000', '00000', '00000', '00000', '00100', '01110' ], 'P': [ '11110', '10001', '10001', '11110', '10000', '10000', '10000' ], 'B': [ '11110', '10001', '10001', '11110', '10001', '10001', '11110' ] }; } createCounter(bytesData) { console.log(bytesData[bytesData.length - 1].bytes); const bytesInPB = 1024 ** 5; const text = (bytesData[bytesData.length - 1].bytes / bytesInPB).toFixed(2) + 'PB'; console.log(text); const container = document.getElementById('counter'); const pixelSize = 5; const pixelGap = 1; let allPixels = []; text.split('').forEach((char, charIndex) => { const charDiv = document.createElement('div'); charDiv.className = 'character'; const pattern = this.patterns[char]; if (!pattern) return; pattern.forEach((row, rowIndex) => { row.split('').forEach((cell, colIndex) => { if (cell === '1') { const pixel = document.createElement('div'); pixel.className = 'pixel'; const finalX = colIndex * (pixelSize + pixelGap); const finalY = rowIndex * (pixelSize + pixelGap); pixel.style.left = `${finalX}px`; pixel.style.top = `${finalY}px`; charDiv.appendChild(pixel); allPixels.push(pixel); } }); }); container.appendChild(charDiv); }); console.log(allPixels); allPixels.forEach((pixel, index) => { const delay = Math.random() * 50 + (index * 50); setTimeout(() => { pixel.classList.add('landed'); }, delay); }); const maxDelay = Math.max(...allPixels.map((_, index) => Math.random() * 50 + (index * 50))); setTimeout(() => { const textDiv = document.getElementById('counterText'); textDiv.style.opacity = '1'; }, maxDelay + 500); } init(bytesData) { this.createCounter(bytesData); } }