alerts
Two shapes. A log is a dense stream — many short messages, one severity character per line. A banner is one event you want a reader to handle. Use the log for ambient state; reserve the banner for something the user must read.
log
alert log
- hot14:21:03USDT depeg: -198.0 bps via coinbase
- warn14:20:33USDC drifting: -59.0 bps via binance
- ok14:20:03DAI re-pegged: -4.0 bps via curve
- boot14:19:00monitor started — interval 30s
<div class="log">
<h3>alert log</h3>
<ul>
<li class="hot">
<span class="lvl">hot</span>
<span class="ts">14:21:03</span>
<span class="msg">USDT depeg: -198.0 bps via coinbase</span>
</li>
...
</ul>
</div>
banner
The banner is the loud cousin. A 4px colored bar on the left, content on the right. Place at the top of a view or above the affected card; never two at once.
<div class="banner hot">
<div class="mark"></div>
<div class="body">
<div class="lead">USDT depegged on coinbase — -198.0 bps</div>
<div class="sub">first observed 14:21:03</div>
</div>
</div>
css
.log { background: var(--bg-elev); border: 1px solid var(--line);
border-radius: var(--radius); padding: var(--s-3) var(--s-4); }
.log h3 { font-size: var(--t-1); text-transform: uppercase;
letter-spacing: 0.12em; color: var(--fg-faint); }
.log ul { list-style: none; padding: 0; margin: 0;
font-family: var(--font); font-size: var(--t-1); }
.log li { display: grid; grid-template-columns: 56px 84px 1fr;
gap: var(--s-2); padding: 6px 0;
border-top: 1px solid var(--line); color: var(--fg-muted); }
.log li.ok .lvl { color: var(--ok); }
.log li.warn .lvl { color: var(--warn); }
.log li.hot .lvl { color: var(--hot); }
.banner { display: flex; gap: var(--s-3); padding: var(--s-3) var(--s-4);
border: 1px solid var(--line); border-radius: var(--radius);
background: var(--bg-elev); }
.banner .mark { flex: 0 0 4px; align-self: stretch; background: var(--fg-muted); }
.banner.ok .mark { background: var(--ok); }
.banner.warn .mark { background: var(--warn); }
.banner.hot .mark { background: var(--hot); }