mavweb: unify UI — shared ui.css + nav partial across all pages

One theme (the PWA's dark palette) for dash/history/trace/notifications/
tools/passkey via static/ui.css; shared nav template with active-page
highlight; tables wrapped in .scroll so they pan on phones; PWA nav no
longer clips the RU/EN toggle; dash 'updated' timestamp fixed (selector
matched nothing). AGENTS.md documents the local preview/screenshot recipe.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ASstMtsZWLSRcD1Tq8T68Q
This commit is contained in:
kami
2026-07-05 18:36:31 +04:00
parent a158ffd1d2
commit d7c0cf89d3
9 changed files with 215 additions and 158 deletions
+64
View File
@@ -0,0 +1,64 @@
/* maven web ui — one theme for every server-rendered page.
Palette and type mirror the PWA (static/index.html): dark, restrained,
#00aaff accent. Pages carry NO inline <style> beyond true one-offs. */
:root{
--bg:#111; --panel:#1a1a2e; --line:#222; --border:#333;
--fg:#ddd; --soft:#aaa; --muted:#888; --dim:#555;
--accent:#00aaff; --ok:#00ff88; --warn:#ffaa00; --err:#ff4444;
}
*{box-sizing:border-box}
body{background:var(--bg);color:var(--fg);font:14px/1.5 system-ui,sans-serif;
margin:0;padding:1rem;-webkit-text-size-adjust:100%}
h1,h2{font-weight:400;color:var(--muted);letter-spacing:.1em;text-transform:uppercase}
h1{font-size:1.2rem;margin:.2rem 0 .6rem}
h2{font-size:.95rem;margin:1.4rem 0 .3rem}
h1 small,h2 small{color:var(--dim);letter-spacing:0;text-transform:none}
a{color:var(--accent);text-decoration:none}
a:hover{text-decoration:underline}
/* shared site nav (the "nav" template partial) */
nav.site{display:flex;gap:1rem;flex-wrap:wrap;align-items:center;
border-bottom:1px solid var(--line);padding-bottom:.6rem;margin-bottom:1rem}
nav.site a{font-size:.8rem;letter-spacing:.08em;text-transform:uppercase;color:var(--dim)}
nav.site a:hover{color:var(--fg);text-decoration:none}
nav.site a.active{color:var(--accent)}
/* tables: always inside a .scroll wrapper so wide data pans instead of
breaking the page on a phone */
.scroll{overflow-x:auto}
table{width:100%;border-collapse:collapse;margin-top:.4rem}
th,td{padding:.35rem .5rem;text-align:left;vertical-align:top;
border-bottom:1px solid var(--line)}
th{color:var(--dim);font-size:.75rem;text-transform:uppercase;
letter-spacing:.05em;white-space:nowrap}
td{color:var(--soft)}
.mono{font-family:ui-monospace,SFMono-Regular,Menlo,monospace}
code,.key{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;color:var(--ok)}
/* status colors — nudge outcomes, presence, booleans */
.pending{color:var(--muted)}.acted{color:var(--ok)}
.snoozed{color:var(--warn)}.ignored{color:var(--err)}
.pres,.green{color:var(--ok)}.away,.gray{color:var(--muted)}.red{color:var(--err)}
.badge{font-size:.75rem;color:var(--dim);background:var(--panel);
padding:.15rem .35rem;border-radius:3px;white-space:nowrap}
.updated,.muted{color:var(--dim);font-size:.85rem}
.empty{color:var(--dim);padding:2rem;text-align:center}
.voided{opacity:.45;text-decoration:line-through}
.void-badge{color:var(--dim);font-size:.8rem;margin-right:.3rem}
/* controls */
button{font:inherit;font-size:.85rem;background:var(--panel);color:var(--fg);
border:1px solid var(--border);border-radius:3px;padding:.25rem .6rem;cursor:pointer}
button:hover{border-color:var(--accent)}
button:disabled{opacity:.4;cursor:not-allowed}
input[type=text]{font:inherit;font-size:.85rem;background:var(--bg);color:var(--fg);
border:1px solid var(--border);border-radius:3px;padding:.25rem .4rem;max-width:100%}
label{color:var(--soft)}
/* inline feedback (/history revert, /tools enable, /auth/passkey) */
.msg{margin:.6rem 0;padding:.5rem .7rem;border-radius:3px;border:1px solid var(--line)}
.msg-ok{border-color:var(--ok);color:var(--ok)}
.msg-err{border-color:var(--err);color:var(--err)}
details{color:var(--soft);font-size:.85rem}
summary{cursor:pointer;color:var(--dim)}