class UploadZone extends HTMLElement { constructor() { super(); this.dragCounter = 0; } connectedCallback() { this.innerHTML = `

Arraste arquivos de áudio

ou clique para selecionar

MP3 WAV M4A FLAC
`; this.setupEventListeners(); } setupEventListeners() { const dropZone = this.querySelector('#drop-zone'); const fileInput = this.querySelector('#file-input'); const overlay = this.querySelector('#upload-overlay'); // Click to select dropZone.addEventListener('click', (e) => { if (e.target !== fileInput) { fileInput.click(); } }); fileInput.addEventListener('change', (e) => { this.handleFiles(e.target.files); }); // Drag and Drop ['dragenter', 'dragover', 'dragleave', 'drop'].forEach(eventName => { dropZone.addEventListener(eventName, (e) => { e.preventDefault(); e.stopPropagation(); }, false); }); ['dragenter', 'dragover'].forEach(eventName => { dropZone.addEventListener(eventName, () => { this.dragCounter++; dropZone.classList.add('drag-over'); }, false); }); ['dragleave', 'drop'].forEach(eventName => { dropZone.addEventListener(eventName, () => { this.dragCounter--; if (this.dragCounter === 0) { dropZone.classList.remove('drag-over'); } }, false); }); dropZone.addEventListener('drop', (e) => { this.dragCounter = 0; dropZone.classList.remove('drag-over'); const files = e.dataTransfer.files; if (files.length > 0) { // Show overlay briefly for effect overlay.classList.remove('hidden'); setTimeout(() => { overlay.classList.add('hidden'); this.handleFiles(files); }, 500); } }); } handleFiles(files) { // Dispatch custom event to main app document.dispatchEvent(new CustomEvent('files-uploaded', { detail: { files: Array.from(files) } })); } } customElements.define('upload-zone', UploadZone);