svrnty-hermes-webui-plugin/static/app.css
Svrnty c1e3fa1af0
All checks were successful
plugin-tests / test (push) Successful in 25s
feat(plugin): Phase 2 partial — vault_status migrated + brand skin moved + eval suite (P2.B/C, P3.A/B)
Lands the easy migrations + the automation skeleton. STT migration deferred
to Phase 2.1 (it touches the streaming engine + bootstrap JS — needs a new
streaming_hook public-API method OR forced-internal CONNECTION-MAP entries).

Migrated to plugin:
  routes/vault_status.py    GET /api/vault/status (from fork commit 3e2c74f3)
  static/{app.js,app.css,fonts/}  brand skin (from hermes-ext/)

Plugin auto-loaded by hermes-webui when HERMES_WEBUI_PYTHON_PLUGIN is set;
register_static + inject_stylesheet + inject_script wire the URL contract at
/plugins/svrnty/{app.css,app.js} per protocol §14 (Q5).

Automation skeleton:
  Makefile                          one-liner targets: test · map · sync-upstream · smoke
  scripts/boot-smoke.py             start upstream+plugin, curl every endpoint
  scripts/upstream-sync.py          fetch tags + run matrix + JSON report
  tests/evals/test_features.py      4 evals (loader contract · vault payload · brand URL contract · forced-internal=0)
  tests/unit/test_brand_skin.py     4 asset-presence + wiring tests
  tests/unit/test_vault_status.py   3 handler tests (register, success, error)

CONNECTION-MAP.md: 0 forced-internal dependencies; plugin uses only public API.
AST script timestamp removed so map-check is deterministic.

Tests: 11/11 PASS (4 evals + 7 unit). Integration tests deferred until
boot-smoke runs against a live hermes-webui (Phase 2.D + 2.E gate).

Deferred to next session:
  P2.A  STT migration (needs streaming_hook design — see routes/transcribe.py)
  P2.D  Revert 4 fork feature commits — needs STT migration first
  P2.E  Archive hermes-ext repo — gated on P2.D
  P2.F  Live boot smoke against real webui

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-23 10:02:47 -04:00

66 lines
3.7 KiB
CSS

/* ============================================================================
Svrnty brand reskin for Hermes WebUI — Tier 1 (extension CSS, no core edits).
Source of truth: cortex/L2-svrnty.lib-design-system/tokens/svrnty.tokens.json
Maps svrnty DTCG tokens onto the WebUI's CSS variables. Loaded after
static/style.css, so these win by cascade. Upgrade-proof (out of tree).
NOTE: for the pure svrnty accent, keep Skin = "default" in Settings →
Appearance. Named skins use higher-specificity selectors that would
override --accent below.
============================================================================ */
/* ── Montserrat (self-hosted, sovereign — no external CDN; font-src 'self') ── */
@font-face{font-family:"Montserrat";font-style:normal;font-weight:400;font-display:swap;src:url("/extensions/fonts/montserrat-400.woff2") format("woff2");}
@font-face{font-family:"Montserrat";font-style:normal;font-weight:500;font-display:swap;src:url("/extensions/fonts/montserrat-500.woff2") format("woff2");}
@font-face{font-family:"Montserrat";font-style:normal;font-weight:600;font-display:swap;src:url("/extensions/fonts/montserrat-600.woff2") format("woff2");}
@font-face{font-family:"Montserrat";font-style:normal;font-weight:700;font-display:swap;src:url("/extensions/fonts/montserrat-700.woff2") format("woff2");}
/* ── Light (svrnty *.light) ─────────────────────────────────────────────── */
:root {
--bg:#FFFFFF; --sidebar:#F5F5F5; --surface:#F0F0F0;
--main-bg:rgba(255,255,255,0.5); --topbar-bg:rgba(245,245,245,.98);
--border:#E5E7EB; --border2:rgba(6,8,12,0.12);
--border-subtle:rgba(6,8,12,.08); --border-muted:rgba(6,8,12,.14);
--surface-subtle:rgba(6,8,12,.025); --surface-subtle-hover:rgba(6,8,12,.045);
--text:#1A1A1A; --strong:#06080C; --muted:#6B7280; --em:#3A4958;
/* brandRed #DF2D45 */
--accent:#DF2D45; --accent-hover:#C41E3A; --accent-text:#C41E3A;
--accent-bg:rgba(223,45,69,0.08); --accent-bg-strong:rgba(223,45,69,0.15);
--focus-ring:rgba(223,45,69,.35); --focus-glow:rgba(223,45,69,.10);
--blue:#3B82F6; --gold:#F59E0B;
--input-bg:rgba(6,8,12,.03); --hover-bg:rgba(6,8,12,.05);
--code-bg:#F0F0F0; --code-text:#C41E3A; --code-inline-bg:rgba(6,8,12,.06); --pre-text:#1A1A1A;
--error:#EF4444; --success:#22C55E; --warning:#F59E0B; --info:#3B82F6;
/* svrnty radii (sm8 / md12 / lg16 / full) */
--radius-sm:8px; --radius-md:12px; --radius-card:12px; --radius-lg:16px; --radius-pill:9999px;
--font-ui:"Montserrat",-apple-system,BlinkMacSystemFont,"Segoe UI",system-ui,sans-serif;
}
/* ── Dark (svrnty *.dark — brandBlack #06080C base) ─────────────────────── */
:root.dark {
--bg:#06080C; --sidebar:#0D1318; --surface:#151D24;
--main-bg:rgba(6,8,12,0.5); --topbar-bg:rgba(13,19,24,.98);
--border:#2D3843; --border2:rgba(229,229,229,0.14);
--border-subtle:rgba(229,229,229,.075); --border-muted:rgba(229,229,229,.12);
--surface-subtle:rgba(229,229,229,.025); --surface-subtle-hover:rgba(229,229,229,.045);
--text:#FFFFFF; --strong:#FFFFFF; --muted:#9CA3AF; --em:#5A6978;
/* brand red lifts to #FF6B7A on dark (svrnty link/inversePrimary.dark) */
--accent:#FF6B7A; --accent-hover:#DF2D45; --accent-text:#FF6B7A;
--accent-bg:rgba(255,107,122,0.08); --accent-bg-strong:rgba(255,107,122,0.15);
--focus-ring:rgba(255,107,122,.35); --focus-glow:rgba(255,107,122,.10);
--blue:#60A5FA; --gold:#FBBF24;
--input-bg:rgba(229,229,229,.04); --hover-bg:rgba(229,229,229,.06);
--code-bg:#0D1318; --code-text:#FF6B7A; --code-inline-bg:rgba(0,0,0,.35); --pre-text:#E5E5E5;
--error:#FF6B6B; --success:#4ADE80; --warning:#FBBF24; --info:#60A5FA;
}