2026-02-20 08:16:43 -05:00
|
|
|
<!doctype html>
|
|
|
|
|
<html lang="en">
|
|
|
|
|
<head>
|
|
|
|
|
<meta charset="UTF-8" />
|
|
|
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
|
|
|
<title>Chat Grid</title>
|
|
|
|
|
</head>
|
|
|
|
|
<body>
|
|
|
|
|
<main class="app">
|
|
|
|
|
<h1>Chat Grid</h1>
|
2026-02-22 19:54:55 -05:00
|
|
|
<div id="connectionStatus" role="status" aria-live="polite" aria-atomic="true"></div>
|
2026-02-24 22:03:10 -05:00
|
|
|
<section id="loginView" class="auth-panel">
|
|
|
|
|
<h2>Login</h2>
|
|
|
|
|
<div class="auth-row">
|
|
|
|
|
<label for="authUsername">Username</label>
|
|
|
|
|
<input id="authUsername" type="text" maxlength="32" autocomplete="username" />
|
|
|
|
|
</div>
|
|
|
|
|
<div class="auth-row">
|
|
|
|
|
<label for="authPassword">Password</label>
|
|
|
|
|
<input id="authPassword" type="password" maxlength="64" autocomplete="current-password" />
|
|
|
|
|
</div>
|
2026-02-24 23:12:01 -05:00
|
|
|
<button id="showRegisterButton" type="button">Register</button>
|
2026-02-24 22:03:10 -05:00
|
|
|
</section>
|
|
|
|
|
<section id="registerView" class="auth-panel hidden">
|
|
|
|
|
<h2>Register</h2>
|
|
|
|
|
<div class="auth-row">
|
|
|
|
|
<label for="registerUsername">Username</label>
|
|
|
|
|
<input id="registerUsername" type="text" maxlength="32" autocomplete="username" />
|
|
|
|
|
</div>
|
|
|
|
|
<div class="auth-row">
|
|
|
|
|
<label for="registerPassword">Password</label>
|
|
|
|
|
<input id="registerPassword" type="password" maxlength="64" autocomplete="new-password" />
|
|
|
|
|
</div>
|
2026-02-24 23:12:01 -05:00
|
|
|
<div class="auth-row">
|
|
|
|
|
<label for="registerPasswordConfirm">Confirm Password</label>
|
|
|
|
|
<input id="registerPasswordConfirm" type="password" maxlength="64" autocomplete="new-password" />
|
|
|
|
|
</div>
|
2026-02-24 22:03:10 -05:00
|
|
|
<div class="auth-row">
|
|
|
|
|
<label for="registerEmail">Email (optional)</label>
|
|
|
|
|
<input id="registerEmail" type="email" maxlength="320" autocomplete="email" />
|
|
|
|
|
</div>
|
2026-02-24 22:35:29 -05:00
|
|
|
<p id="authPolicyHintRegister" class="auth-hint"></p>
|
2026-02-24 23:12:01 -05:00
|
|
|
<button id="showLoginButton" type="button">Login</button>
|
2026-02-24 22:03:10 -05:00
|
|
|
</section>
|
2026-02-20 08:16:43 -05:00
|
|
|
<div class="controls" id="button-container">
|
|
|
|
|
<button id="connectButton">Connect</button>
|
2026-02-24 22:43:56 -05:00
|
|
|
<button id="logoutButton" class="hidden">Log out</button>
|
2026-02-24 22:45:15 -05:00
|
|
|
<button id="settingsButton">Audio setup</button>
|
2026-02-20 08:16:43 -05:00
|
|
|
<button id="disconnectButton" class="hidden">Disconnect</button>
|
|
|
|
|
<button id="focusGridButton" class="hidden" aria-controls="gameCanvas">Chat Grid</button>
|
|
|
|
|
</div>
|
|
|
|
|
<div id="deviceSummary">
|
|
|
|
|
<p id="audioInputCurrent" class="hidden"></p>
|
|
|
|
|
<p id="audioOutputCurrent" class="hidden"></p>
|
|
|
|
|
</div>
|
|
|
|
|
<div id="status" role="region" aria-live="polite"></div>
|
|
|
|
|
<canvas
|
|
|
|
|
id="gameCanvas"
|
|
|
|
|
width="600"
|
|
|
|
|
height="600"
|
|
|
|
|
tabindex="0"
|
|
|
|
|
class="hidden"
|
2026-02-21 16:55:41 -05:00
|
|
|
aria-label="Chat Grid, press question mark for help."
|
2026-02-20 08:16:43 -05:00
|
|
|
></canvas>
|
2026-02-21 16:51:07 -05:00
|
|
|
<div id="instructions" class="hidden"></div>
|
2026-02-20 08:16:43 -05:00
|
|
|
|
2026-02-21 02:19:33 -05:00
|
|
|
<footer id="appFooter">
|
|
|
|
|
<small id="appVersion">Another AI experiment with Jage. Version</small>
|
|
|
|
|
<section id="updatesSection" class="updates-section">
|
|
|
|
|
<h2>Latest Updates</h2>
|
|
|
|
|
<button id="updatesToggle" type="button" aria-expanded="false" aria-controls="updatesPanel">
|
|
|
|
|
Show updates
|
|
|
|
|
</button>
|
|
|
|
|
<div id="updatesPanel" class="hidden" hidden></div>
|
|
|
|
|
</section>
|
|
|
|
|
</footer>
|
2026-02-20 08:16:43 -05:00
|
|
|
|
|
|
|
|
<div id="settingsModal" class="hidden" role="dialog" aria-modal="true" aria-labelledby="modalTitle">
|
|
|
|
|
<div class="modal-content">
|
|
|
|
|
<h2 id="modalTitle">Audio Settings</h2>
|
|
|
|
|
<label for="audioInputSelect">Microphone (Input)</label>
|
|
|
|
|
<select id="audioInputSelect"></select>
|
|
|
|
|
<label for="audioOutputSelect">Speakers (Output)</label>
|
|
|
|
|
<select id="audioOutputSelect"></select>
|
|
|
|
|
<button id="closeSettingsButton">Close</button>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</main>
|
|
|
|
|
<script src="%BASE_URL%version.js"></script>
|
|
|
|
|
<script type="module" src="/src/main.ts"></script>
|
|
|
|
|
</body>
|
|
|
|
|
</html>
|