|
63 | 63 | <header class="page-header"><div class="hc"><a href="index.html" class="logo"><img src="acreetionoslogo.webp" alt="AcreetionOS" class="logo-img" width="36" height="36" />Acreetion<span>OS</span></a><nav class="main-nav"><a href="index.html">Home</a><a href="wiki.html">Wiki</a><a href="contact.html">Contact</a></nav></div></header> |
64 | 64 | <div class="pw"> |
65 | 65 | <div id="chat-mode"> |
66 | | -<div id="chat-header"><div class="chat-brand"><div class="chat-avatar">A</div><div><div class="chat-name">AIDEN</div><div class="chat-sub">AcreetionOS Onboard Assistant</div></div></div><button id="tts-btn" title="Toggle voice" style="background:transparent;border:1px solid var(--gbd);color:var(--g);padding:0.4rem 0.6rem;border-radius:6px;cursor:pointer;font-size:1rem;transition:all 0.2s">🔊</button></div> |
| 66 | +<div id="chat-header"><div class="chat-brand"><div class="chat-avatar">A</div><div><div class="chat-name">AIDEN</div><div class="chat-sub">AcreetionOS Onboard Assistant</div></div></div><div style="display:flex;gap:0.4rem"><button id="info-btn" title="How this works" style="background:transparent;border:1px solid var(--gbd);color:var(--fg2);padding:0.4rem 0.6rem;border-radius:6px;cursor:pointer;font-size:0.9rem;transition:all 0.2s">ⓘ</button><button id="tts-btn" title="Toggle voice" style="background:transparent;border:1px solid var(--gbd);color:var(--g);padding:0.4rem 0.6rem;border-radius:6px;cursor:pointer;font-size:1rem;transition:all 0.2s">🔊</button></div></div> |
67 | 67 | <div id="messages"><div class="msg ai"><div class="sender">AIDEN</div>Hey! I'm AIDEN, your onboard AcreetionOS assistant. Ask me anything about the project — installation, features, requirements, or team. I work completely offline! ✨</div></div> |
68 | 68 | <div class="suggestions" id="suggestions"> |
69 | 69 | <button class="suggestion-chip">What is AcreetionOS?</button> |
|
74 | 74 | <button class="suggestion-chip">Is it free?</button> |
75 | 75 | </div> |
76 | 76 | <div id="input-row"> |
77 | | -<input id="chat-input" type="text" placeholder="Ask AIDEN anything..." autocomplete="off" /> |
| 77 | +<input id="chat-input" type="text" placeholder="Type or tap 🎤 and speak..." autocomplete="off" /> |
| 78 | +<button id="mic-btn" title="Voice input" style="background:transparent;border:1px solid var(--gbd);color:var(--fg2);border-radius:8px;padding:0 0.8rem;cursor:pointer;font-size:1rem;transition:all 0.2s">🎤</button> |
78 | 79 | <button id="send-btn">➤</button> |
79 | 80 | </div> |
80 | 81 | </div> |
81 | 82 | </div> |
| 83 | + |
| 84 | +<div id="info-popup" style="display:none;position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,0.7);backdrop-filter:blur(8px);z-index:1000;align-items:center;justify-content:center;padding:1rem"> |
| 85 | +<div style="background:var(--gb2);border:1px solid var(--gbd);border-radius:12px;max-width:500px;padding:2rem;position:relative"> |
| 86 | +<button id="info-close" style="position:absolute;top:0.5rem;right:0.8rem;background:none;border:none;color:var(--fg2);font-size:1.5rem;cursor:pointer">×</button> |
| 87 | +<h2 style="font-family:var(--fm);color:var(--g);margin-bottom:1rem;font-size:1.1rem">🎤 Voice Commands</h2> |
| 88 | +<ul style="list-style:none;padding:0;color:var(--fg2);font-size:0.85rem"> |
| 89 | +<li style="padding:0.4rem 0;border-bottom:1px solid var(--gbd)"><strong style="color:var(--fg)">Tap 🎤</strong> — starts listening. Speak your question.</li> |
| 90 | +<li style="padding:0.4rem 0;border-bottom:1px solid var(--gbd)"><strong style="color:var(--fg)">"delete"</strong> — removes the last word you said.</li> |
| 91 | +<li style="padding:0.4rem 0;border-bottom:1px solid var(--gbd)"><strong style="color:var(--fg)">"clear"</strong> — clears the text field.</li> |
| 92 | +<li style="padding:0.4rem 0;border-bottom:1px solid var(--gbd)"><strong style="color:var(--fg)">"send"</strong> — sends the message to AIDEN.</li> |
| 93 | +<li style="padding:0.4rem 0;border-bottom:1px solid var(--gbd)"><strong style="color:var(--fg)">"stop"</strong> — stops listening.</li> |
| 94 | +<li style="padding:0.4rem 0"><strong style="color:var(--fg)">🔊 TTS</strong> — AIDEN reads answers aloud. Toggle on/off.</li> |
| 95 | +</ul> |
| 96 | +</div> |
| 97 | +</div> |
| 98 | + |
82 | 99 | <footer><p>AcreetionOS — <a href="index.html">Home</a> · <a href="https://discord.acreetionos.org">Discord</a></p></footer> |
83 | 100 | <script> |
84 | 101 | const KB = [ |
|
171 | 188 | document.getElementById('tts-btn').textContent=ttsEnabled?'🔊':'🔇' |
172 | 189 | if(!ttsEnabled)window.speechSynthesis&&window.speechSynthesis.cancel() |
173 | 190 | }) |
| 191 | + |
| 192 | +// Info popup |
| 193 | +const infoPopup=document.getElementById('info-popup') |
| 194 | +document.getElementById('info-btn').addEventListener('click',()=>infoPopup.style.display='flex') |
| 195 | +document.getElementById('info-close').addEventListener('click',()=>infoPopup.style.display='none') |
| 196 | +infoPopup.addEventListener('click',e=>{if(e.target===infoPopup)infoPopup.style.display='none'}) |
| 197 | + |
| 198 | +// Voice dictation |
| 199 | +let sr=null |
| 200 | +let listening=false |
| 201 | +const micBtn=document.getElementById('mic-btn') |
| 202 | +function startListening(){ |
| 203 | + const SR=window.SpeechRecognition||window.webkitSpeechRecognition |
| 204 | + if(!SR){alert('Speech recognition not supported in this browser. Try Chrome.');return} |
| 205 | + sr=new SR() |
| 206 | + sr.lang='en-US' |
| 207 | + sr.interimResults=true |
| 208 | + sr.continuous=true |
| 209 | + sr.onresult=e=>{ |
| 210 | + let interim='',final='' |
| 211 | + for(let i=e.resultIndex;i<e.results.length;i++){ |
| 212 | + if(e.results[i].isFinal)final+=e.results[i][0].transcript |
| 213 | + else interim+=e.results[i][0].transcript |
| 214 | + } |
| 215 | + const words=(final||interim).toLowerCase().trim() |
| 216 | + if(words.endsWith('delete')){ |
| 217 | + const parts=input.value.trim().split(/\s+/) |
| 218 | + parts.pop() |
| 219 | + input.value=parts.join(' ') |
| 220 | + input.selectionStart=input.selectionEnd=input.value.length |
| 221 | + return |
| 222 | + } |
| 223 | + if(words.endsWith('clear')){input.value='';return} |
| 224 | + if(words.endsWith('send')){input.value=input.value.trim();send(input.value);return} |
| 225 | + if(words.endsWith('stop')){stopListening();return} |
| 226 | + if(final){ |
| 227 | + input.value+=final |
| 228 | + if(!input.value.startsWith(' '))input.value=input.value.trimStart() |
| 229 | + input.selectionStart=input.selectionEnd=input.value.length |
| 230 | + } |
| 231 | + } |
| 232 | + sr.onerror=()=>{stopListening()} |
| 233 | + sr.onend=()=>{if(listening&&sr)try{sr.start()}catch(e){}} |
| 234 | + try{sr.start();listening=true;micBtn.textContent='🎙️';micBtn.style.borderColor='var(--g)';micBtn.style.color='var(--g)'}catch(e){} |
| 235 | +} |
| 236 | +function stopListening(){ |
| 237 | + listening=false |
| 238 | + if(sr){try{sr.stop()}catch(e){};sr=null} |
| 239 | + micBtn.textContent='🎤';micBtn.style.borderColor='var(--gbd)';micBtn.style.color='var(--fg2)' |
| 240 | +} |
| 241 | +micBtn.addEventListener('click',()=>{listening?stopListening():startListening()}) |
| 242 | + |
174 | 243 | // Pre-load voices |
175 | 244 | if(window.speechSynthesis)window.speechSynthesis.getVoices() |
176 | 245 | </script> |
|
0 commit comments