diff options
| author | Doan Luu Duc Tai <doan@luuduct.ai> | 2026-10-30 21:51:23 -0500 |
|---|---|---|
| committer | Doan Luu Duc Tai <doan@luuduct.ai> | 2026-10-30 21:51:23 -0500 |
| commit | 3034705b6679bff1802c4180b7b4711b94fed7f9 (patch) | |
| tree | 2a6b87ee9d2cdb918a0e8b321167e0b7b97f8ed5 /crates/chat-server/web/index.html | |
| parent | e6b350a1d48ca0490b7a3447bb8d0a4235514b76 (diff) | |
Match private chat to the site's ASCII style
Reuse the historical Message Me form's ASCII frames, red logo, green prompts, bracketed actions, and the homepage light/dark palette. Preserve readable controls on small screens, align the license page and footer, and run browser fixtures beside the active local preview.
Diffstat (limited to 'crates/chat-server/web/index.html')
| -rw-r--r-- | crates/chat-server/web/index.html | 59 |
1 files changed, 38 insertions, 21 deletions
diff --git a/crates/chat-server/web/index.html b/crates/chat-server/web/index.html index 9783789..c240b85 100644 --- a/crates/chat-server/web/index.html +++ b/crates/chat-server/web/index.html @@ -25,32 +25,49 @@ along with this program. If not, see <https://www.gnu.org/licenses/>. </head> <body> <main> -<header><a href="https://doan.luuduct.ai/">~doan</a> / message me <span class="status">EXPERIMENTAL / LOCAL TEST</span></header> -<h1>[ private chat ]</h1> -<p>Text only. A dedicated identity file. Encrypted for you and Doan.</p> -<p class="notice">This is an experimental application, not an audited messenger. <a href="/LIMITATIONS.txt">Read its limitations</a> before use. Keep your file and password safe: there is no account recovery.</p> +<div class="libre-badge">[ <a href="https://www.gnu.org/software/librejs/" aria-describedby="js-warning">GNU LibreJS-compliant</a><span id="js-warning" role="tooltip">LibreJS compliance concerns software freedom, not a guarantee of privacy or security. Review the source code, dependencies, and scripts delivered to your browser. Server-delivered code can change between visits; free software can still track users or behave maliciously.</span> ]</div> +<header> +<pre class="logo-art"><a href="https://doan.luuduct.ai/" class="logo" aria-label="Doan Luu Duc Tai home"> + ____ ___ _ _ _ +| _ \ / _ \ / \ | \ | | +| | | | | | |/ _ \ | \| | +| |_| | |_| / ___ \| |\ | +|____/ \___/_/ \_\_| \_| LUU DUC TAI +</a></pre> +<nav class="site-nav" aria-label="Site navigation"><a href="https://doan.luuduct.ai/">Home</a><a href="https://doan.luuduct.ai/#services">Services</a><a href="/" aria-current="page">Message Me</a></nav> +</header> +<div class="ascii-panel introduction"> +<div class="ascii-bar" aria-hidden="true"><span>+</span><span class="ascii-rule">--------------------------------------------------------------------------------</span><span>+</span></div> +<div class="panel-body"> +<h1>MESSAGE ME</h1> +<p>Private text conversations between you and Doan.</p> +<p class="build-status">EXPERIMENTAL / LOCAL TEST</p> +<p>Keep your file and password. There is no account recovery.<br><a href="/LIMITATIONS.txt">Read the limitations</a> before using this experimental messenger.</p> +</div> +<div class="ascii-bar" aria-hidden="true"><span>+</span><span class="ascii-rule">--------------------------------------------------------------------------------</span><span>+</span></div> +</div> <p id="status" role="status" aria-live="polite">Loading cryptographic module...</p> -<section id="entry" hidden> +<section id="entry" class="actions" hidden> <button id="create-choice">CREATE NEW CHAT</button> <button id="open-choice">OPEN CHAT FILE</button> </section> <section id="create" hidden> <h2 id="create-title">Create a new chat</h2> <form id="create-form" autocomplete="off"> -<label>Display name <input id="name" maxlength="80" required autocomplete="off"></label> -<label>Password <input id="new-password" type="password" minlength="12" maxlength="1024" required autocomplete="off"></label> -<label>Confirm password <input id="confirm-password" type="password" minlength="12" required autocomplete="off"></label> -<label id="setup-label" hidden>Owner setup token from the root .env <input id="setup-token" type="password" autocomplete="off"></label> +<div class="ascii-field"><div class="ascii-bar field-header"><span aria-hidden="true">+--[ </span><label class="field-heading" for="name">Display name</label><span aria-hidden="true"> ]</span><span class="ascii-rule" aria-hidden="true">--------------------------------------------------------------------------------</span><span aria-hidden="true">+</span></div><div class="field-row"><input id="name" maxlength="80" required autocomplete="off"></div><div class="ascii-bar field-end" aria-hidden="true"><span>+</span><span class="ascii-rule">--------------------------------------------------------------------------------</span><span>+</span></div></div> +<div class="ascii-field"><div class="ascii-bar field-header"><span aria-hidden="true">+--[ </span><label class="field-heading" for="new-password">Password</label><span aria-hidden="true"> ]</span><span class="ascii-rule" aria-hidden="true">--------------------------------------------------------------------------------</span><span aria-hidden="true">+</span></div><div class="field-row"><input id="new-password" type="password" minlength="12" maxlength="1024" required autocomplete="off"></div><div class="ascii-bar field-end" aria-hidden="true"><span>+</span><span class="ascii-rule">--------------------------------------------------------------------------------</span><span>+</span></div></div> +<div class="ascii-field"><div class="ascii-bar field-header"><span aria-hidden="true">+--[ </span><label class="field-heading" for="confirm-password">Confirm password</label><span aria-hidden="true"> ]</span><span class="ascii-rule" aria-hidden="true">--------------------------------------------------------------------------------</span><span aria-hidden="true">+</span></div><div class="field-row"><input id="confirm-password" type="password" minlength="12" required autocomplete="off"></div><div class="ascii-bar field-end" aria-hidden="true"><span>+</span><span class="ascii-rule">--------------------------------------------------------------------------------</span><span>+</span></div></div> +<div class="ascii-field" id="setup-label" hidden><p id="setup-help">Read CHAT_SETUP_TOKEN from your root .env.</p><div class="ascii-bar field-header"><span aria-hidden="true">+--[ </span><label class="field-heading" for="setup-token">Owner setup token</label><span aria-hidden="true"> ]</span><span class="ascii-rule" aria-hidden="true">--------------------------------------------------------------------------------</span><span aria-hidden="true">+</span></div><div class="field-row"><input aria-describedby="setup-help" id="setup-token" type="password" autocomplete="off"></div><div class="ascii-bar field-end" aria-hidden="true"><span>+</span><span class="ascii-rule">--------------------------------------------------------------------------------</span><span>+</span></div></div> <p>Use a strong, unique passphrase. This identity is solely for this chat; do not reuse it elsewhere.</p> -<button type="submit">GENERATE AND DOWNLOAD IDENTITY FILE</button> +<button type="submit">DOWNLOAD IDENTITY FILE</button> </form> </section> <section id="unlock" hidden> <h2>Open your saved identity file</h2> <p id="reopen-note">Your file is opened locally. The file and password are never uploaded.</p> <form id="unlock-form" autocomplete="off"> -<label>Identity file <input id="file" type="file" required></label> -<label>Password <input id="password" type="password" required autocomplete="off"></label> +<div class="ascii-field"><div class="ascii-bar field-header"><span aria-hidden="true">+--[ </span><label class="field-heading" for="file">Identity file</label><span aria-hidden="true"> ]</span><span class="ascii-rule" aria-hidden="true">--------------------------------------------------------------------------------</span><span aria-hidden="true">+</span></div><div class="field-row"><input id="file" type="file" required></div><div class="ascii-bar field-end" aria-hidden="true"><span>+</span><span class="ascii-rule">--------------------------------------------------------------------------------</span><span>+</span></div></div> +<div class="ascii-field"><div class="ascii-bar field-header"><span aria-hidden="true">+--[ </span><label class="field-heading" for="password">Password</label><span aria-hidden="true"> ]</span><span class="ascii-rule" aria-hidden="true">--------------------------------------------------------------------------------</span><span aria-hidden="true">+</span></div><div class="field-row"><input id="password" type="password" required autocomplete="off"></div><div class="ascii-bar field-end" aria-hidden="true"><span>+</span><span class="ascii-rule">--------------------------------------------------------------------------------</span><span>+</span></div></div> <button type="submit">UNLOCK CHAT</button> </form> </section> @@ -62,20 +79,20 @@ along with this program. If not, see <https://www.gnu.org/licenses/>. <h3 id="thread-name"></h3> <p id="conversation-fingerprint"></p> <p id="counts"></p> -<form id="history-form"><label>Latest messages to load (0–50) <input id="history-count" type="number" min="0" max="50" step="1" value="0" required></label><button type="submit">LOAD HISTORY</button></form> +<form id="history-form"><div class="ascii-field"><div class="ascii-bar field-header"><span aria-hidden="true">+--[ </span><label class="field-heading" for="history-count">Latest messages (0-50)</label><span aria-hidden="true"> ]</span><span class="ascii-rule" aria-hidden="true">--------------------------------------------------------------------------------</span><span aria-hidden="true">+</span></div><div class="field-row"><input id="history-count" type="number" min="0" max="50" step="1" value="0" required></div><div class="ascii-bar field-end" aria-hidden="true"><span>+</span><span class="ascii-rule">--------------------------------------------------------------------------------</span><span>+</span></div></div><button type="submit">LOAD HISTORY</button></form> <button id="older" hidden>LOAD OLDER</button> <ol id="messages" aria-label="Messages"></ol> -<form id="send-form" autocomplete="off"><label>Plain text message (up to 8192 UTF-8 bytes) <textarea id="text" rows="5" required maxlength="8192" autocomplete="off"></textarea></label><button type="submit">ENCRYPT AND SEND</button></form> -<button id="retry" hidden>RETRY THE SAME ENCRYPTED MESSAGE</button> +<p id="message-limit">Plain text only. Up to 8192 UTF-8 bytes per message.</p> +<form id="send-form" autocomplete="off"><div class="ascii-field"><div class="ascii-bar field-header"><span aria-hidden="true">+--[ </span><label class="field-heading" for="text">Message body</label><span aria-hidden="true"> ]</span><span class="ascii-rule" aria-hidden="true">--------------------------------------------------------------------------------</span><span aria-hidden="true">+</span></div><div class="field-row"><textarea aria-describedby="message-limit" id="text" rows="5" required maxlength="8192" autocomplete="off"></textarea></div><div class="ascii-bar field-end" aria-hidden="true"><span>+</span><span class="ascii-rule">--------------------------------------------------------------------------------</span><span>+</span></div></div><button type="submit">ENCRYPT AND SEND</button></form> +<button id="retry" hidden>RETRY MESSAGE</button> </section> </section> <noscript>This chat requires free JavaScript and WebAssembly for local cryptography. The main website remains JavaScript-free.</noscript> -<footer> -<p><a class="badge" href="https://www.gnu.org/software/librejs/" aria-describedby="js-warning">GNU LibreJS-compliant</a><span id="js-warning" role="tooltip">LibreJS compliance concerns software freedom, not a guarantee of privacy or security. Review the source code, dependencies, and scripts delivered to your browser. Server-delivered code can change between visits; free software can still track users or behave maliciously.</span></p> -<a href="https://www.gnu.org/licenses/agpl-3.0.html">LICENSE</a> -<a href="/THIRD-PARTY-LICENSES.html">THIRD PARTY LICENSES</a> -<a href="/SOURCE.tar.gz">CORRESPONDING SOURCE CODE</a> -<a href="/javascript.html" rel="jslicense">JAVASCRIPT LICENSES / RAW SOURCE</a> +<footer class="source-footer" aria-label="Licensing and source"> +<a class="project-license" href="https://www.gnu.org/licenses/agpl-3.0.html">[ LICENSE ]</a> +<a class="dependency-licenses" href="/THIRD-PARTY-LICENSES.html">[ THIRD PARTY LICENSES ]</a> +<a href="/SOURCE.tar.gz">[ SOURCE CODE ]</a> +<a href="/javascript.html" rel="jslicense">[ JAVASCRIPT LICENSES ]</a> </footer> </main> </body> |
