aboutsummaryrefslogtreecommitdiff
path: root/crates/chat-server/web/style.css
diff options
context:
space:
mode:
authorDoan Luu Duc Tai <doan@luuduct.ai>2026-10-30 21:39:57 -0500
committerDoan Luu Duc Tai <doan@luuduct.ai>2026-10-30 21:39:57 -0500
commite6b350a1d48ca0490b7a3447bb8d0a4235514b76 (patch)
tree57ae2a9c5455f335e8c34b293f4f13975cb3d09e /crates/chat-server/web/style.css
parent0a4da3b86eb69f0f09b802a55e36fa9cf1bbf38c (diff)
Implement experimental file-based encrypted private chat
Add fixed-suite Rust/WASI identity files, signed challenge authentication, ciphertext-only SQLite storage, a minimal LibreJS-compatible interface, and consistent backup snapshots. Keep production unchanged and document the local workflow, limits, source distribution, and browser recovery tests.
Diffstat (limited to 'crates/chat-server/web/style.css')
-rw-r--r--crates/chat-server/web/style.css49
1 files changed, 49 insertions, 0 deletions
diff --git a/crates/chat-server/web/style.css b/crates/chat-server/web/style.css
new file mode 100644
index 0000000..0983b2e
--- /dev/null
+++ b/crates/chat-server/web/style.css
@@ -0,0 +1,49 @@
+/*
+Copyright (C) 2026 Doan Luu Duc Tai <doan@luuduct.ai>
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU Affero General Public License as
+published by the Free Software Foundation, either version 3 of the
+License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU Affero General Public License for more details.
+
+You should have received a copy of the GNU Affero General Public License
+along with this program. If not, see <https://www.gnu.org/licenses/>.
+*/
+* { box-sizing: border-box; }
+:root { color-scheme: dark; font-family: "Courier New", monospace; background: #131715; color: #d4d8cd; line-height: 1.6; }
+body { margin: 0; }
+main { max-width: 58rem; margin: 2rem auto; padding: 0 1.25rem; }
+header, footer { border-top: 1px solid #667367; padding-top: 1rem; }
+header { display: flex; flex-wrap: wrap; gap: .6rem; }
+h1 { font-size: 1.8rem; color: #e3e3ce; }
+h2, h3 { font-size: 1.05rem; }
+a { color: #aec2a5; text-underline-offset: .2rem; }
+.status, .badge { color: #e0c46d; }
+.status { margin-left: auto; }
+.notice { border-left: 2px solid #c5ad68; padding-left: 1rem; }
+button, input, textarea { font: inherit; color: inherit; background: #1c231e; border: 1px solid #667367; border-radius: 0; padding: .55rem .7rem; }
+button { cursor: pointer; margin: .4rem .6rem .4rem 0; }
+button:hover, button:focus-visible { border-color: #d7c884; color: #f0e5b0; }
+button:disabled { opacity: .5; cursor: wait; }
+input, textarea { display: block; width: 100%; margin: .35rem 0 1rem; }
+input[type=number] { width: 8rem; }
+label { display: block; }
+section { margin: 1.5rem 0; }
+[hidden] { display: none !important; }
+.chat-heading { display: flex; flex-wrap: wrap; justify-content: space-between; align-items: center; }
+#fingerprint, #conversation-fingerprint { overflow-wrap: anywhere; font-size: .8rem; }
+#messages { padding: 0; list-style: none; }
+#messages li { border-top: 1px dashed #48564a; padding: 1rem 0; }
+#messages p { white-space: pre-wrap; overflow-wrap: anywhere; margin: .4rem 0; }
+#messages small { color: #a8b39e; }
+#status { min-height: 1.6rem; color: #e0c46d; }
+footer { margin-top: 3rem; padding-bottom: 2rem; }
+footer > a { display: block; width: fit-content; }
+footer p { position: relative; }
+#js-warning { display: none; max-width: 48rem; border: 1px solid #c5ad68; background: #1c231e; padding: 1rem; margin: .8rem 0; }
+.badge:hover + #js-warning, .badge:focus-visible + #js-warning { display: block; }