**The action.** `hound hygiene` and `hound supply-chain` only ever saw repositories somebody had already cloned onto a machine with Hound installed. action/ runs them on every push and pull request: it installs the published .deb, verifies it against the same signed checksum the desktop agent uses, and annotates findings on the lines of the files they concern so a reviewer sees them in the diff rather than in a log nobody opens. report.py will not print a credential it found — GitHub masks only values registered as secrets, so anything else in an annotation is readable by everyone who can see the run and stays in the API afterwards. And it will not report a partial scan as clean: a history walk that hits its limit says so, because "no findings" and "no findings in the part we looked at" mean different things to somebody deciding whether to merge. **The background.** A radial gradient was set on `html, body` — both, each 100% tall — so it painted twice and the seam between the two layers appeared as a band across the middle of the page when scrolled. It was also a hardcoded near-black the light theme had no way to override. Three more like it: the active tab, button hover, and the log panel. The ground is a token now, and every colour in the stylesheet comes from one, so no rule can put one theme's text on the other's background. **The palette.** The light theme now uses houndav.com's values exactly — #5A58C8 buttons, #147A3D, #9A6100, #C22222 — so the app and the site are recognisably the same product rather than two guesses at it. Then measured rather than assumed, and found two failures Joe had not mentioned: "faint" text was 2.90:1 in dark and 3.37:1 in light, and the dark button hover was 4.41:1. All three now clear 4.5:1, and all eight text pairs pass WCAG AA in both themes. **And four more places still naming ClamAV**, which has not been the engine for a long time: the auto-update caption said the daemon runs freshclam, the update log said the same, an error suggested `apt install clamav`, and a permissions hint pointed at /var/lib/clamav. The engine swap replaced the code and left the copy describing software this product no longer runs. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
513 lines
18 KiB
CSS
513 lines
18 KiB
CSS
:root {
|
|
/* surfaces */
|
|
--bg: #0B0E14;
|
|
--bg-raised: #12161F;
|
|
--bg-panel: #161B26;
|
|
--bg-hover: #1D2432;
|
|
--border: #232B3A;
|
|
--border-hi: #32405A;
|
|
|
|
/* text */
|
|
--fg: #E8ECF4;
|
|
--fg-dim: #8B96AB;
|
|
--fg-faint: #7C879E;
|
|
|
|
/* brand + state (dog head, 4-state ladder) */
|
|
--brand: #9896E0;
|
|
--ok: #22C55E;
|
|
--warn: #F59E0B;
|
|
--bad: #EF4444;
|
|
--off: #6B7280;
|
|
|
|
--radius: 14px;
|
|
--radius-sm: 9px;
|
|
--shadow: 0 8px 30px rgb(0 0 0 / 0.45);
|
|
--bg-log: #0A0D13;
|
|
--bg-active: #1E2536;
|
|
--inset-hi: inset 0 1px 0 rgb(255 255 255 / .04);
|
|
--btn-bg: #5A58D6;
|
|
--btn-bg-hi: #6462DC;
|
|
/* Pale tints, legible on a dark ground. The light theme needs darker ones:
|
|
#7fd79a on white is 1.9:1 and effectively invisible. */
|
|
--ok-text: #7FD79A;
|
|
--bad-text: #F2A2A2;
|
|
--tint-ok: rgb(34 197 94 / .08);
|
|
--tint-bad: rgb(239 68 68 / .08);
|
|
--switch-on: rgb(90 88 214 / .55);
|
|
}
|
|
|
|
/* Light theme.
|
|
*
|
|
* Not an inversion of the dark palette — a flat inversion turns a deep navy
|
|
* ground into a saturated cream and makes the brand violet unreadable. The
|
|
* neutrals keep a slight violet bias so they read as chosen rather than as
|
|
* the browser's default grey, and the state colours are darkened until they
|
|
* hold their contrast against white rather than glowing on it.
|
|
*
|
|
* Applied by [data-theme] only. The app writes that attribute from the
|
|
* user's setting, resolving "auto" against prefers-color-scheme itself, so
|
|
* there is exactly one place that decides which theme is showing. */
|
|
:root[data-theme="light"] {
|
|
--bg: #F7F7FB;
|
|
--bg-raised: #FFFFFF;
|
|
--bg-panel: #FFFFFF;
|
|
--bg-hover: #EEEEF6;
|
|
--border: #E2E2EC;
|
|
--border-hi: #C9C9DA;
|
|
|
|
--fg: #14141C;
|
|
--fg-dim: #55556B;
|
|
--fg-faint: #6E6E85;
|
|
|
|
/* Darkened for contrast on a light ground: the dark theme's #22C55E is
|
|
2.2:1 on white and unreadable as text. */
|
|
--brand: #5A58C8;
|
|
--ok: #147A3D;
|
|
--warn: #9A6100;
|
|
--bad: #C22222;
|
|
--off: #6B7280;
|
|
|
|
/* These are the website's light palette, value for value, so the app and
|
|
houndav.com are recognisably the same product. */
|
|
--shadow: 0 1px 2px rgb(20 20 28 / .06), 0 8px 24px rgb(20 20 28 / .05);
|
|
/* A console keeps its recessed feel in light mode without going black. */
|
|
--bg-log: #F0F0F7;
|
|
--bg-active: #EDEDF6;
|
|
--inset-hi: inset 0 1px 0 rgb(20 20 28 / .03);
|
|
--btn-bg: #5A58C8;
|
|
--btn-bg-hi: #4B49B4;
|
|
--ok-text: #147A3D;
|
|
--bad-text: #C22222;
|
|
--tint-ok: rgb(20 122 61 / .10);
|
|
--tint-bad: rgb(194 34 34 / .10);
|
|
--switch-on: rgb(90 88 200 / .85);
|
|
}
|
|
|
|
* { box-sizing: border-box; margin: 0; padding: 0; }
|
|
|
|
html, body {
|
|
height: 100%;
|
|
/* A flat, token-driven ground. This was a radial wash in a hardcoded
|
|
near-black, which the light theme could not override — it rendered as a
|
|
grey smear across the top of the window. A background that only works in
|
|
one theme is not a background, it is a bug with a gradient. */
|
|
background: var(--bg);
|
|
color: var(--fg);
|
|
font: 15px/1.5 "Inter", "Cantarell", "Segoe UI", system-ui, sans-serif;
|
|
-webkit-font-smoothing: antialiased;
|
|
}
|
|
|
|
#app {
|
|
max-width: 920px;
|
|
margin: 0 auto;
|
|
padding: 26px 26px 18px;
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 18px;
|
|
min-height: 100vh;
|
|
}
|
|
|
|
/* ── Header ─────────────────────────────────────────────────────── */
|
|
.header {
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: space-between;
|
|
}
|
|
.brand { display: flex; align-items: center; gap: 12px; }
|
|
.brand-mark { width: 34px; height: 34px; filter: drop-shadow(0 2px 8px rgb(152 150 224 / .35)); }
|
|
.brand-text h1 { font-size: 20px; font-weight: 700; letter-spacing: .2px; }
|
|
.tagline { font-size: 12px; color: var(--fg-dim); }
|
|
|
|
.header-status { display: flex; align-items: center; gap: 8px; }
|
|
.engine-dot {
|
|
width: 9px; height: 9px; border-radius: 50%;
|
|
background: var(--off);
|
|
box-shadow: 0 0 8px rgb(107 114 128 / .6);
|
|
transition: background .3s, box-shadow .3s;
|
|
}
|
|
.engine-dot.ok { background: var(--ok); box-shadow: 0 0 10px rgb(34 197 94 / .7); }
|
|
.engine-dot.warn { background: var(--warn); box-shadow: 0 0 10px rgb(245 158 11 / .7); }
|
|
.engine-dot.bad { background: var(--bad); box-shadow: 0 0 10px rgb(239 68 68 / .7); }
|
|
.engine-label { font-size: 12.5px; color: var(--fg-dim); }
|
|
|
|
/* ── Tabs ───────────────────────────────────────────────────────── */
|
|
.tabs {
|
|
display: flex;
|
|
gap: 4px;
|
|
background: var(--bg-raised);
|
|
border: 1px solid var(--border);
|
|
border-radius: var(--radius);
|
|
padding: 5px;
|
|
overflow-x: auto;
|
|
}
|
|
.tab {
|
|
appearance: none;
|
|
border: 1px solid transparent;
|
|
background: transparent;
|
|
color: var(--fg-dim);
|
|
font: 600 13px/1 inherit;
|
|
border-radius: 10px;
|
|
padding: 9px 14px;
|
|
cursor: pointer;
|
|
display: inline-flex; align-items: center; gap: 7px;
|
|
white-space: nowrap;
|
|
transition: background .15s, color .15s, border-color .15s;
|
|
position: relative;
|
|
}
|
|
.tab:hover { background: var(--bg-hover); color: var(--fg); }
|
|
.tab.active {
|
|
background: var(--bg-active);
|
|
border-color: var(--border-hi);
|
|
color: var(--fg);
|
|
box-shadow: var(--inset-hi);
|
|
}
|
|
.tab svg { opacity: .8; }
|
|
.tab-badge {
|
|
min-width: 18px;
|
|
font-size: 10.5px;
|
|
font-weight: 700;
|
|
text-align: center;
|
|
padding: 1px 5px;
|
|
border-radius: 999px;
|
|
background: var(--bad);
|
|
color: #fff;
|
|
line-height: 1.5;
|
|
}
|
|
.tab-badge.quiet { background: var(--warn); }
|
|
|
|
.tab-panel { display: none; flex-direction: column; gap: 18px; }
|
|
.tab-panel.active { display: flex; }
|
|
|
|
/* ── Hero ───────────────────────────────────────────────────────── */
|
|
.hero {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 22px;
|
|
background: linear-gradient(180deg, var(--bg-panel), var(--bg-raised));
|
|
border: 1px solid var(--border);
|
|
border-radius: var(--radius);
|
|
padding: 24px 26px;
|
|
box-shadow: var(--shadow);
|
|
}
|
|
.shield {
|
|
flex: 0 0 auto;
|
|
width: 84px; height: 84px;
|
|
display: grid; place-items: center;
|
|
border-radius: 50%;
|
|
background: rgb(152 150 224 / .07);
|
|
border: 1px solid rgb(152 150 224 / .18);
|
|
transition: border-color .3s, background .3s;
|
|
}
|
|
@keyframes pulse {
|
|
0%, 100% { transform: scale(1); opacity: 1; }
|
|
50% { transform: scale(1.06); opacity: .85; }
|
|
}
|
|
.hero-copy h2 { font-size: 22px; font-weight: 700; }
|
|
.hero-copy p { color: var(--fg-dim); margin: 4px 0 12px; }
|
|
|
|
.hero[data-state="protected"] .shield { border-color: rgb(34 197 94 / .35); background: rgb(34 197 94 / .08); }
|
|
.hero[data-state="scanning"] .shield { border-color: rgb(245 158 11 / .4); background: rgb(245 158 11 / .09); }
|
|
.hero[data-state="threat"] .shield { border-color: rgb(239 68 68 / .45); background: rgb(239 68 68 / .1); }
|
|
.hero[data-state="paused"] .shield { border-color: rgb(107 114 128 / .4); background: rgb(107 114 128 / .09); }
|
|
.hero[data-state="scanning"] #shield-icon { animation: pulse 1.6s ease-in-out infinite; }
|
|
|
|
.pill {
|
|
display: inline-block;
|
|
font-size: 12px;
|
|
color: var(--fg-dim);
|
|
background: var(--bg-hover);
|
|
border: 1px solid var(--border);
|
|
border-radius: 999px;
|
|
padding: 3px 11px;
|
|
margin-right: 8px;
|
|
white-space: nowrap;
|
|
}
|
|
.pill.stale { color: var(--warn); border-color: rgb(245 158 11 / .4); }
|
|
|
|
/* ── Actions ────────────────────────────────────────────────────── */
|
|
.actions { display: flex; flex-wrap: wrap; gap: 10px; align-items: center; }
|
|
.btn {
|
|
appearance: none;
|
|
border: 1px solid var(--border-hi);
|
|
background: var(--bg-hover);
|
|
color: var(--fg);
|
|
font: 600 13.5px/1 inherit;
|
|
border-radius: var(--radius-sm);
|
|
padding: 11px 16px;
|
|
cursor: pointer;
|
|
display: inline-flex; align-items: center; gap: 8px;
|
|
transition: background .15s, border-color .15s, transform .05s;
|
|
}
|
|
.btn:hover { background: var(--bg-hover); border-color: var(--border-hi); }
|
|
.btn:active { transform: translateY(1px); }
|
|
.btn:disabled { opacity: .5; cursor: default; }
|
|
.btn.primary {
|
|
/* The same --btn-bg the website uses. White on the dark theme's #9896E0 is
|
|
2.70:1 and fails AA, which is why the button has its own colour rather
|
|
than reusing --brand. */
|
|
background: var(--btn-bg);
|
|
border-color: var(--btn-bg);
|
|
color: #FFFFFF;
|
|
}
|
|
.btn.primary:hover { background: var(--btn-bg-hi); border-color: var(--btn-bg-hi); color: #FFFFFF; }
|
|
.btn.small { padding: 7px 12px; font-size: 12.5px; }
|
|
.btn.danger { border-color: rgb(239 68 68 / .5); }
|
|
.btn.danger:hover { background: rgb(239 68 68 / .15); border-color: var(--bad); }
|
|
|
|
/* ── Panels ─────────────────────────────────────────────────────── */
|
|
.panel {
|
|
background: var(--bg-panel);
|
|
border: 1px solid var(--border);
|
|
border-radius: var(--radius);
|
|
padding: 16px 18px;
|
|
}
|
|
.panel-head {
|
|
display: flex;
|
|
align-items: baseline;
|
|
justify-content: space-between;
|
|
margin-bottom: 10px;
|
|
gap: 12px;
|
|
}
|
|
.panel-head h3 { font-size: 14px; font-weight: 700; letter-spacing: .3px; text-transform: uppercase; color: var(--fg-dim); }
|
|
.muted { color: var(--fg-dim); font-size: 13px; }
|
|
.empty { padding: 6px 0 2px; }
|
|
.hidden { display: none !important; }
|
|
.row-actions { display: flex; align-items: center; gap: 10px; }
|
|
.scan-target { font-family: ui-monospace, monospace; font-size: 12.5px; color: var(--fg-faint); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
|
|
/* scan progress */
|
|
.progress {
|
|
height: 8px;
|
|
border-radius: 999px;
|
|
background: var(--bg-hover);
|
|
overflow: hidden;
|
|
margin-bottom: 10px;
|
|
}
|
|
.progress-bar {
|
|
height: 100%;
|
|
width: 0%;
|
|
background: linear-gradient(90deg, var(--warn), var(--brand));
|
|
border-radius: inherit;
|
|
transition: width .4s ease;
|
|
}
|
|
.progress.indeterminate .progress-bar {
|
|
width: 35%;
|
|
animation: slide 1.3s ease-in-out infinite alternate;
|
|
}
|
|
@keyframes slide { from { margin-left: 0; } to { margin-left: 65%; } }
|
|
|
|
/* results */
|
|
.results { display: flex; flex-direction: column; gap: 6px; }
|
|
.result-row {
|
|
display: grid;
|
|
grid-template-columns: auto 1fr auto;
|
|
align-items: center;
|
|
gap: 12px;
|
|
background: var(--bg-hover);
|
|
border: 1px solid var(--border);
|
|
border-radius: var(--radius-sm);
|
|
padding: 10px 14px;
|
|
}
|
|
.result-row .sig { font-weight: 700; font-size: 13.5px; }
|
|
.result-row .path { color: var(--fg-dim); font-size: 12.5px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-family: ui-monospace, monospace; }
|
|
.result-row.clean { border-left: 3px solid var(--ok); }
|
|
.result-row.clean .sig { color: var(--ok); }
|
|
.result-row.infected { border-left: 3px solid var(--bad); }
|
|
.result-row.infected .sig { color: var(--bad); }
|
|
|
|
/* log */
|
|
.log {
|
|
background: var(--bg-log);
|
|
border: 1px solid var(--border);
|
|
border-radius: var(--radius-sm);
|
|
padding: 12px 14px;
|
|
font: 12px/1.6 ui-monospace, "JetBrains Mono", monospace;
|
|
color: var(--fg-dim);
|
|
max-height: 220px;
|
|
overflow: auto;
|
|
white-space: pre-wrap;
|
|
}
|
|
.log.ok { color: var(--ok-text); }
|
|
.log.fail { color: var(--bad-text); }
|
|
|
|
/* ── Inputs & switches ──────────────────────────────────────────── */
|
|
.input {
|
|
appearance: none;
|
|
background: var(--bg-raised);
|
|
border: 1px solid var(--border-hi);
|
|
border-radius: var(--radius-sm);
|
|
color: var(--fg);
|
|
font: 13.5px/1.4 inherit;
|
|
padding: 9px 12px;
|
|
width: 100%;
|
|
}
|
|
.input:focus { outline: none; border-color: var(--brand); box-shadow: 0 0 0 3px rgb(152 150 224 / .15); }
|
|
.input.mono { font-family: ui-monospace, "JetBrains Mono", monospace; font-size: 12.5px; }
|
|
textarea.input { resize: vertical; }
|
|
select.input { cursor: pointer; }
|
|
|
|
.form-row { display: grid; grid-template-columns: 1fr 200px auto; gap: 10px; }
|
|
|
|
.field { margin: 14px 0; }
|
|
.field > label { display: block; font-size: 13px; font-weight: 600; color: var(--fg-dim); margin-bottom: 6px; }
|
|
|
|
.switch-row {
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: space-between;
|
|
gap: 16px;
|
|
cursor: pointer;
|
|
padding: 4px 0;
|
|
}
|
|
.switch-row.setting { padding: 10px 0; border-bottom: 1px solid var(--border); }
|
|
.switch-row.setting:last-of-type { border-bottom: none; }
|
|
.switch-row strong { display: block; font-size: 14px; font-weight: 600; }
|
|
.switch-row small { display: block; color: var(--fg-dim); font-size: 12px; margin-top: 2px; }
|
|
.switch-row input[type="checkbox"] { position: absolute; opacity: 0; pointer-events: none; }
|
|
.switch {
|
|
flex: 0 0 auto;
|
|
width: 40px; height: 22px;
|
|
border-radius: 999px;
|
|
background: var(--bg-hover);
|
|
border: 1px solid var(--border-hi);
|
|
position: relative;
|
|
transition: background .2s, border-color .2s;
|
|
}
|
|
.switch::after {
|
|
content: "";
|
|
position: absolute;
|
|
top: 2px; left: 2px;
|
|
width: 16px; height: 16px;
|
|
border-radius: 50%;
|
|
background: var(--fg-dim);
|
|
transition: transform .2s, background .2s;
|
|
}
|
|
.switch-row input:checked + .switch { background: var(--switch-on); border-color: var(--btn-bg); }
|
|
.switch-row input:checked + .switch::after { transform: translateX(18px); background: #fff; }
|
|
|
|
/* ── Quarantine ─────────────────────────────────────────────────── */
|
|
.qt-list { display: flex; flex-direction: column; gap: 6px; }
|
|
.qt-row {
|
|
display: grid;
|
|
grid-template-columns: auto 1fr auto;
|
|
gap: 12px;
|
|
align-items: center;
|
|
background: var(--bg-hover);
|
|
border: 1px solid var(--border);
|
|
border-left: 3px solid var(--bad);
|
|
border-radius: var(--radius-sm);
|
|
padding: 10px 14px;
|
|
}
|
|
.qt-row.restored { border-left-color: var(--off); opacity: .75; }
|
|
.qt-row .qt-virus { font-weight: 700; font-size: 13px; color: var(--bad); white-space: nowrap; }
|
|
.qt-row.restored .qt-virus { color: var(--fg-dim); }
|
|
.qt-row .qt-path { font-family: ui-monospace, monospace; font-size: 12px; color: var(--fg-dim); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
.qt-row .qt-meta { font-size: 11.5px; color: var(--fg-faint); white-space: nowrap; }
|
|
.qt-row .qt-actions { display: flex; gap: 6px; }
|
|
|
|
/* ── Realtime ───────────────────────────────────────────────────── */
|
|
.stat-grid {
|
|
display: grid;
|
|
grid-template-columns: repeat(4, 1fr);
|
|
gap: 10px;
|
|
margin: 12px 0 6px;
|
|
}
|
|
.stat {
|
|
background: var(--bg-raised);
|
|
border: 1px solid var(--border);
|
|
border-radius: var(--radius-sm);
|
|
padding: 12px 14px;
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 2px;
|
|
}
|
|
.stat-val { font-size: 20px; font-weight: 700; font-variant-numeric: tabular-nums; }
|
|
.stat-val.alarm { color: var(--bad); }
|
|
.stat-val.watching { color: var(--warn); }
|
|
.stat-val.calm { color: var(--ok); }
|
|
.stat-key { font-size: 11.5px; color: var(--fg-faint); text-transform: uppercase; letter-spacing: .4px; }
|
|
|
|
.kv {
|
|
display: flex;
|
|
gap: 12px;
|
|
padding: 8px 0;
|
|
border-top: 1px solid var(--border);
|
|
font-size: 13px;
|
|
}
|
|
.kv-k { flex: 0 0 150px; color: var(--fg-faint); }
|
|
.kv-v { color: var(--fg-dim); font-family: ui-monospace, monospace; font-size: 12px; word-break: break-all; }
|
|
|
|
.watch-list { display: flex; flex-wrap: wrap; gap: 6px; }
|
|
.watch-chip {
|
|
font-family: ui-monospace, monospace;
|
|
font-size: 12px;
|
|
color: var(--fg-dim);
|
|
background: var(--bg-hover);
|
|
border: 1px solid var(--border);
|
|
border-radius: 999px;
|
|
padding: 4px 11px;
|
|
}
|
|
|
|
/* ── Rootkit ────────────────────────────────────────────────────── */
|
|
.verdict {
|
|
border-radius: var(--radius-sm);
|
|
padding: 12px 16px;
|
|
margin-bottom: 12px;
|
|
font-weight: 600;
|
|
font-size: 14px;
|
|
border: 1px solid;
|
|
}
|
|
.verdict.clean { background: var(--tint-ok); border-color: var(--ok); color: var(--ok-text); }
|
|
.verdict.dirty { background: var(--tint-bad); border-color: var(--bad); color: var(--bad-text); }
|
|
|
|
.finding-list { display: flex; flex-direction: column; gap: 6px; }
|
|
.finding-row {
|
|
display: grid;
|
|
grid-template-columns: auto auto 1fr;
|
|
gap: 12px;
|
|
align-items: center;
|
|
background: var(--bg-hover);
|
|
border: 1px solid var(--border);
|
|
border-radius: var(--radius-sm);
|
|
padding: 10px 14px;
|
|
}
|
|
.finding-row .sev {
|
|
font-size: 10.5px; font-weight: 700;
|
|
text-transform: uppercase; letter-spacing: .5px;
|
|
padding: 3px 9px; border-radius: 999px;
|
|
}
|
|
.sev.critical { background: rgb(239 68 68 / .15); color: var(--bad); }
|
|
.sev.warn { background: rgb(245 158 11 / .15); color: var(--warn); }
|
|
.sev.info { background: rgb(107 114 128 / .2); color: var(--fg-dim); }
|
|
.finding-row .check { font-family: ui-monospace, monospace; font-size: 12px; color: var(--fg-dim); }
|
|
.finding-row .detail { font-size: 13px; color: var(--fg); word-break: break-all; }
|
|
|
|
/* ── Alerts ─────────────────────────────────────────────────────── */
|
|
.event-list { display: flex; flex-direction: column; gap: 4px; max-height: 520px; overflow-y: auto; }
|
|
.event-row {
|
|
display: grid;
|
|
grid-template-columns: auto auto 1fr auto;
|
|
gap: 12px;
|
|
align-items: center;
|
|
border-radius: var(--radius-sm);
|
|
padding: 8px 14px;
|
|
background: var(--bg-hover);
|
|
border: 1px solid var(--border);
|
|
}
|
|
.event-row .ev-sev { font-size: 10.5px; font-weight: 700; text-transform: uppercase; letter-spacing: .5px; width: 64px; }
|
|
.ev-sev.critical { color: var(--bad); }
|
|
.ev-sev.warn { color: var(--warn); }
|
|
.ev-sev.info { color: var(--fg-faint); }
|
|
.event-row .ev-kind { font-family: ui-monospace, monospace; font-size: 11.5px; color: var(--fg-dim); width: 96px; }
|
|
.event-row .ev-msg { font-size: 13px; color: var(--fg); word-break: break-word; }
|
|
.event-row .ev-ts { font-size: 11.5px; color: var(--fg-faint); white-space: nowrap; font-variant-numeric: tabular-nums; }
|
|
|
|
/* footer */
|
|
.footer {
|
|
margin-top: auto;
|
|
display: flex;
|
|
justify-content: space-between;
|
|
font-size: 12px;
|
|
color: var(--fg-faint);
|
|
padding-top: 4px;
|
|
}
|