All checks were successful
plugin-tests / test (push) Successful in 25s
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>
66 lines
3.7 KiB
CSS
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;
|
|
}
|