diff --git a/demo.html b/demo.html index 912cda6..a4f09c5 100644 --- a/demo.html +++ b/demo.html @@ -33,6 +33,9 @@ document.documentElement.setAttribute('data-theme', theme); } } + + // Disable custom styling for uncloseai.js - use PicoCSS instead + window.UNCLOSEAI_CUSTOM_STYLING = false; diff --git a/index.html b/index.html index 846d30e..4cff0ec 100644 --- a/index.html +++ b/index.html @@ -33,6 +33,9 @@ document.documentElement.setAttribute('data-theme', theme); } } + + // Disable custom styling for uncloseai.js - use PicoCSS instead + window.UNCLOSEAI_CUSTOM_STYLING = false; diff --git a/uncloseai.js b/uncloseai.js index 037ff08..345757f 100644 --- a/uncloseai.js +++ b/uncloseai.js @@ -1359,127 +1359,104 @@ function openHermesModal() { messageInput.focus(); } +// Configuration for styling - set to false to disable custom styling +const USE_CUSTOM_STYLING = window.UNCLOSEAI_CUSTOM_STYLING !== false; + // Function to open TTS modal function openTTSModal() { // Check if Hermes modal is open to set appropriate z-index const hermesModal = document.getElementById('hermes-modal-backdrop'); const zIndex = hermesModal ? '2001' : '1001'; - // Create modal backdrop (similar to Hermes modal) - const modalBackdrop = document.createElement('div'); - modalBackdrop.id = 'tts-modal-backdrop'; - modalBackdrop.style.cssText = ` - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - background: rgba(0, 0, 0, 0.5); - z-index: ${zIndex}; - display: flex; - align-items: center; - justify-content: center; - `; + const modal = document.createElement('dialog'); + modal.open = true; + modal.style.zIndex = zIndex; + modal.style.position = 'fixed'; - const modal = document.createElement('div'); - modal.id = 'tts-modal'; - modal.style.cssText = ` - background: white; - border-radius: 16px; - width: 90%; - max-width: 720px; - max-height: 80%; - display: flex; - flex-direction: column; - box-shadow: 0 20px 40px rgba(0,0,0,0.3); - overflow: hidden; - `; + if (USE_CUSTOM_STYLING) { + modal.style.cssText += ` + max-width: 720px; + border: none; + border-radius: 8px; + box-shadow: 0 4px 8px rgba(0,0,0,0.2); + background: white; + `; + } - // Create modal header (matching Hermes modal style) - const header = document.createElement('div'); - header.style.cssText = ` - background: linear-gradient(45deg, #667eea 0%, #764ba2 100%); - color: white; - padding: 16px 20px; - display: flex; - justify-content: space-between; - align-items: center; - `; + const article = document.createElement('article'); + modal.appendChild(article); - const title = document.createElement('h2'); - title.textContent = 'TTS Anything!'; - title.style.cssText = ` - margin: 0; - font-family: 'ChunkFiveRegular', monospace; - font-size: 20px; - `; + const header = document.createElement('header'); + if (USE_CUSTOM_STYLING) { + header.style.cssText = ` + background: linear-gradient(45deg, #667eea 0%, #764ba2 100%); + color: white; + padding: 16px 20px; + margin: -1em -1em 1em -1em; + display: flex; + justify-content: space-between; + align-items: center; + `; + } + article.appendChild(header); const closeButton = document.createElement('button'); - closeButton.textContent = '×'; - closeButton.style.cssText = ` - background: none; - border: none; - color: white; - font-size: 24px; - cursor: pointer; - padding: 0; - width: 30px; - height: 30px; - display: flex; - align-items: center; - justify-content: center; - `; - closeButton.onclick = () => document.body.removeChild(modalBackdrop); - - header.appendChild(title); + closeButton.textContent = 'X'; + closeButton.onclick = () => document.body.removeChild(modal); + if (USE_CUSTOM_STYLING) { + closeButton.style.cssText = ` + background: none; + border: none; + color: white; + font-size: 24px; + cursor: pointer; + float: right; + `; + } else { + closeButton.style.float = 'right'; + } header.appendChild(closeButton); - // Create content area - const content = document.createElement('div'); - content.style.cssText = ` - padding: 20px; - flex: 1; - `; + const h1 = document.createElement('h1'); + h1.textContent = 'TTS Anything!'; + if (USE_CUSTOM_STYLING) { + h1.style.cssText = ` + margin: 0; + font-family: 'ChunkFiveRegular', monospace; + font-size: 20px; + `; + } + header.appendChild(h1); const textArea = document.createElement('textarea'); - textArea.style.cssText = ` - width: 100%; - height: 200px; - margin-bottom: 16px; - padding: 12px; - border: 1px solid #ccc; - border-radius: 8px; - font-size: 14px; - resize: vertical; - `; + textArea.style.width = '100%'; + textArea.style.height = '240px'; textArea.placeholder = 'text-to-speech: write any message & have the artificial intelligence speak it!'; - content.appendChild(textArea); + article.appendChild(textArea); // Voice selection - const voiceLabel = document.createElement('div'); - voiceLabel.textContent = 'Voice:'; - voiceLabel.style.cssText = ` - font-weight: bold; - margin-bottom: 8px; - `; - content.appendChild(voiceLabel); - const voices = ['alloy', 'echo', 'fable', 'onyx', 'nova', 'shimmer']; const voiceSelection = document.createElement('div'); - voiceSelection.style.cssText = ` - display: flex; - gap: 12px; - flex-wrap: wrap; - margin-bottom: 16px; - `; + if (USE_CUSTOM_STYLING) { + voiceSelection.style.cssText = ` + display: flex; + gap: 10px; + margin: 16px 0; + `; + } voices.forEach((voice) => { const label = document.createElement('label'); - label.style.cssText = ` - display: flex; - align-items: center; - gap: 4px; - cursor: pointer; - `; + if (USE_CUSTOM_STYLING) { + label.style.cssText = ` + display: flex; + align-items: center; + gap: 4px; + cursor: pointer; + `; + } else { + label.style.display = 'inline-block'; + label.style.marginRight = '10px'; + } const radio = document.createElement('input'); radio.type = 'radio'; radio.name = 'tts-voice'; @@ -1489,58 +1466,43 @@ function openTTSModal() { label.appendChild(document.createTextNode(voice)); voiceSelection.appendChild(label); }); - content.appendChild(voiceSelection); + article.appendChild(voiceSelection); // Speed selection - const speedContainer = document.createElement('div'); - speedContainer.style.marginBottom = '16px'; - const speedLabel = document.createElement('label'); - speedLabel.style.cssText = ` - font-weight: bold; - display: block; - margin-bottom: 8px; - `; - speedLabel.textContent = 'Speed: 0.9'; + const speedValue = document.createElement('span'); + speedValue.textContent = '0.9'; + speedLabel.textContent = `Speed: ${speedValue.textContent}`; const speedSlider = document.createElement('input'); speedSlider.type = 'range'; speedSlider.min = '0.25'; speedSlider.max = '4.0'; speedSlider.step = '0.05'; speedSlider.value = '0.9'; - speedSlider.style.cssText = ` - width: 100%; - margin-bottom: 8px; - `; speedSlider.oninput = () => { + speedValue.textContent = speedSlider.value; speedLabel.textContent = `Speed: ${speedSlider.value}`; }; - speedContainer.appendChild(speedLabel); - speedContainer.appendChild(speedSlider); - content.appendChild(speedContainer); - - // Button container - const buttonContainer = document.createElement('div'); - buttonContainer.style.cssText = ` - display: flex; - gap: 12px; - flex-wrap: wrap; - `; + article.appendChild(speedLabel); + article.appendChild(speedSlider); const playButton = document.createElement('button'); playButton.textContent = 'Play Text'; - playButton.style.cssText = ` - padding: 12px 24px; - background: linear-gradient(45deg, #667eea 0%, #764ba2 100%); - color: white; - border: none; - border-radius: 8px; - cursor: pointer; - font-weight: bold; - `; + if (USE_CUSTOM_STYLING) { + playButton.style.cssText = ` + padding: 12px 24px; + background: linear-gradient(45deg, #667eea 0%, #764ba2 100%); + color: white; + border: none; + border-radius: 8px; + cursor: pointer; + font-weight: bold; + margin: 16px 10px 0 0; + `; + } let ttsAudio = null; let ttsBlob = null; @@ -1564,26 +1526,29 @@ function openTTSModal() { playButton.disabled = false; // Add download button if not exists - let downloadButton = buttonContainer.querySelector('.download-btn'); + let downloadButton = article.querySelector('.download-btn'); if (!downloadButton) { downloadButton = document.createElement('button'); downloadButton.className = 'download-btn'; - downloadButton.textContent = '💾 Download MP3'; - downloadButton.style.cssText = ` - padding: 12px 24px; - background: #f5f5f5; - border: 1px solid #ccc; - border-radius: 8px; - cursor: pointer; - font-weight: bold; - `; + downloadButton.textContent = 'Download MP3'; + if (USE_CUSTOM_STYLING) { + downloadButton.style.cssText = ` + padding: 12px 24px; + background: #f5f5f5; + border: 1px solid #ccc; + border-radius: 8px; + cursor: pointer; + font-weight: bold; + margin: 16px 0 0 10px; + `; + } downloadButton.onclick = () => { const a = document.createElement('a'); a.href = URL.createObjectURL(ttsBlob); a.download = `tts-${Date.now()}.mp3`; a.click(); }; - buttonContainer.appendChild(downloadButton); + article.appendChild(downloadButton); } } @@ -1600,22 +1565,8 @@ function openTTSModal() { }; }; - buttonContainer.appendChild(playButton); - content.appendChild(buttonContainer); - - // Assemble modal - modal.appendChild(header); - modal.appendChild(content); - modalBackdrop.appendChild(modal); - - // Close on backdrop click - modalBackdrop.onclick = (e) => { - if (e.target === modalBackdrop) { - document.body.removeChild(modalBackdrop); - } - }; - - document.body.appendChild(modalBackdrop); + article.appendChild(playButton); + document.body.appendChild(modal); } // Helper function to integrate file upload response to modal