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
+5 -3
View File
@@ -11,11 +11,13 @@
html,body{height:100%;background:#111;color:#ddd;font-family:system-ui,-apple-system,sans-serif}
body{display:flex;flex-direction:column}
nav{display:flex;background:#1a1a2e;border-bottom:1px solid #333;flex-shrink:0}
nav button{flex:1;padding:.6rem;background:none;border:none;color:#666;font-size:.85rem;cursor:pointer;font-family:inherit;letter-spacing:.05em;text-transform:uppercase;transition:color .15s;-webkit-tap-highlight-color:transparent}
nav{display:flex;align-items:stretch;background:#1a1a2e;border-bottom:1px solid #333;flex-shrink:0}
/* min-width:0 lets the tabs shrink below their text's min-content width —
without it they push the lang toggle past the right edge on phones */
nav button{flex:1 1 0;min-width:0;overflow:hidden;white-space:nowrap;padding:.6rem .2rem;background:none;border:none;color:#666;font-size:.85rem;cursor:pointer;font-family:inherit;letter-spacing:.05em;text-transform:uppercase;transition:color .15s;-webkit-tap-highlight-color:transparent}
nav button.active{color:#00aaff;border-bottom:2px solid #00aaff}
nav button:hover{color:#ddd}
nav .lang{flex:0 0 auto;padding:.6rem .8rem;font-size:.75rem;color:#555;cursor:pointer;letter-spacing:.1em}
nav .lang{flex:0 0 auto;display:flex;align-items:center;padding:.6rem .5rem;font-size:.75rem;color:#555;cursor:pointer;letter-spacing:.1em}
nav .lang.active{color:#00aaff}
.tab{display:none;flex-direction:column;align-items:center;flex:1;overflow:auto;padding:1rem}
+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)}