cat / goq
clone

turns a linux box into a private steam streaming appliance: plug in, tap your key, play from another computer

ui: tap titan overlay — fullscreen prompt when waiting for key tap

dami etoile committed 404b0f5
- Shows 'tap titan' fullscreen overlay when Titan interaction is needed
- Hides intro first, shows tap overlay, waits for backend, then transitions
  to main UI on success
- On error, returns to intro screen
- Wired into: register, connect (unregistered), connect (registered)
commit
404b0f5ba2855628de24f07a879a1508d7bb5777
parent
3956ee729cbe499d3d2eceed3716b346f01d98e2
author
dami etoile <dami.etoile@gmail.com>
1 file changed, +35 -14
Msrc/ui/index.html49+++++++++++++++++++++---------
M src/ui/index.html +35 -14
@@ -372,6 +372,15 @@
372372 </style>373373 </head>374374 <body>375+ <!-- Titan tap overlay -->376+ <div class="setup hidden" id="tap-overlay" style="z-index: 200;">377+ <div class="setup-content">378+ <h1>tap titan</h1>379+ <p>Touch the sensor on your key when it blinks.</p>380+ <div class="setup-status pending" id="tap-status">waiting...</div>381+ </div>382+ </div>383+375384 <!-- Intro screen (adaptive — shows both workflows) -->376385 <div class="setup hidden" id="setup">377386 <div class="setup-content">
@@ -387,7 +396,7 @@
387396 <button class="setup-btn" id="setup-btn" onclick="setupRegister()">register</button>388397 <button class="setup-btn" onclick="introConnect()">connect</button>389398 </div>390- <div class="setup-status" id="setup-status">tap titan when it blinks</div>399+ <div class="setup-status" id="setup-status"></div>391400 </div>392401 393402 <!-- Registered: host or connect -->
@@ -401,7 +410,7 @@
401410 <div style="display: flex; gap: 16px; justify-content: center; margin-top: 12px;">402411 <button class="setup-btn" onclick="introConnectRegistered()">connect</button>403412 </div>404- <div class="setup-status" id="setup-status-reg">tap titan when it blinks</div>413+ <div class="setup-status" id="setup-status-reg"></div>405414 </div>406415 </div>407416 </div>
@@ -524,6 +533,14 @@
524533 }525534 }526535 536+ // ─── Tap overlay ───────────────────────────────────────────────────537+ function showTap() {538+ document.getElementById('tap-overlay').classList.remove('hidden');539+ }540+ function hideTap() {541+ document.getElementById('tap-overlay').classList.add('hidden');542+ }543+527544 // ─── Intro actions ─────────────────────────────────────────────────528545 function hideIntro() {529546 document.getElementById('setup').classList.add('hidden');
@@ -538,8 +555,10 @@
538555 return;539556 }540557 hideIntro();558+ showTap();541559 document.getElementById('pin-input').value = pin;542560 await connectHost();561+ hideTap();543562 }544563 545564 async function introConnectRegistered() {
@@ -551,8 +570,10 @@
551570 return;552571 }553572 hideIntro();573+ showTap();554574 document.getElementById('pin-input').value = pin;555575 await connectHost();576+ hideTap();556577 }557578 558579 async function introHost() {
@@ -567,30 +588,30 @@
567588 const status = document.getElementById('setup-status');568589 if (!pin) {569590 status.className = 'setup-status err';570- status.textContent = 'enter PIN';591+ status.textContent = 'enter pin';571592 return;572593 }573594 btn.disabled = true;574- status.className = 'setup-status pending';575- status.textContent = 'tap titan...';595+ hideIntro();596+ showTap();576597 try {577598 const result = await invoke('titan_register_host', { pin });578599 if (result.registered) {579- status.className = 'setup-status ok';580- status.textContent = 'registered';581- setTimeout(() => {582- document.getElementById('setup').classList.add('hidden');583- document.getElementById('node-id-text').textContent =584- result.node_id.substring(0, 16) + '...';585- registered = true;586- checkRegistration();587- }, 600);600+ hideTap();601+ registered = true;602+ document.getElementById('node-id-text').textContent =603+ result.node_id.substring(0, 16) + '...';604+ checkRegistration();588605 } else {606+ hideTap();607+ document.getElementById('setup').classList.remove('hidden');589608 status.className = 'setup-status err';590609 status.textContent = 'failed';591610 btn.disabled = false;592611 }593612 } catch (e) {613+ hideTap();614+ document.getElementById('setup').classList.remove('hidden');594615 status.className = 'setup-status err';595616 status.textContent = 'error: ' + e;596617 btn.disabled = false;