`; // Write to iframe const iframeDoc = previewIframe.contentDocument || previewIframe.contentWindow.document; iframeDoc.open(); iframeDoc.write(previewHtml); iframeDoc.close(); // Show iframe, hide loading previewLoading.style.display = 'none'; previewIframe.style.display = 'block'; } catch (error) { previewLoading.textContent = `Error loading preview: ${error.message}`; console.error('Preview error:', error); } } previewButton.addEventListener('click', renderPreview); uploadButton.addEventListener('click', async () => { if (!selectedFile) return; // Get Turnstile token (optional in development) let turnstileToken = null; if (typeof turnstile !== 'undefined') { turnstileToken = turnstile.getResponse(); } uploadButton.classList.add('loading'); uploadButton.disabled = true; try { const text = await selectedFile.text(); // Build headers - include token only if available const headers = { 'Content-Type': 'text/plain' }; if (turnstileToken) { headers['X-Turnstile-Token'] = turnstileToken; } const response = await fetch(`/upload?expiration=${expirationDays}&theme=${selectedTheme}`, { method: 'POST', headers: headers, body: text, }); const data = await response.json(); if (response.ok && data.slug) { const viewUrl = `${window.location.origin}/${data.slug}`; // Setup Success View urlInput.value = viewUrl; openLinkBtn.href = viewUrl; // Switch Views uploadView.style.display = 'none'; successView.style.display = 'flex'; // Trigger reflow void successView.offsetWidth; successView.classList.add('visible'); } else { // Reset Turnstile widget on validation failure if (typeof turnstile !== 'undefined') { turnstile.reset(); } throw new Error(data.error || 'Failed to create page'); } } catch (error) { // Reset Turnstile widget on error if (typeof turnstile !== 'undefined') { turnstile.reset(); } alert(`Failed to create page: ${error.message}`); uploadButton.disabled = false; } finally { uploadButton.classList.remove('loading'); } }); GitHub