311c5cb1cd
- Rewrote ui.css with design tokens, card/btn/badge/dot components - All pages wrapped in <main class=page> with max-width container - Replaced inline <style> blocks with ui.css classes - passkey page now uses shared nav.site template - PWA voice page unified under shared nav.site (no more separate tab nav) - Inline lang toggle moved from nav to voice page body
30 lines
1.5 KiB
HTML
30 lines
1.5 KiB
HTML
<!doctype html><meta charset=utf-8>
|
|
<meta name=viewport content="width=device-width,initial-scale=1">
|
|
<title>maven · rule trace</title>
|
|
<link rel=stylesheet href=/ui.css>
|
|
{{template "nav" "trace"}}
|
|
<main class=page>
|
|
<h1>rule trace</h1>
|
|
<div class=updated style=margin-bottom:var(--space-lg)>{{.Now | ago}} — winner: <strong>{{if .Winner}}{{.Winner}}{{else}}nothing fired{{end}}</strong></div>
|
|
<div class=scroll><table class=mono>
|
|
<tr><th>rule<th>sev<th>predicate<th>gate<th>blocked by<th>detail<th>selected<th>lost to</tr>
|
|
{{range .Rules}}<tr>
|
|
<td>{{.RuleName}}</td>
|
|
<td>{{.Severity}}</td>
|
|
<td class={{if .PredicateResult}}green{{else}}gray{{end}}>{{.PredicateResult}}</td>
|
|
<td class={{if .GateResult}}green{{else if .GateBlockedBy}}red{{else}}gray{{end}}>{{.GateResult}}</td>
|
|
<td>{{.GateBlockedBy}}</td>
|
|
<td><details><summary>gate</summary>
|
|
<span class=muted>snooze_until:</span> {{.GateDetail.SnoozeUntil | fmtTime}}<br>
|
|
<span class=muted>cooldown_until:</span> {{.GateDetail.CooldownUntil | fmtTime}}<br>
|
|
<span class=muted>quiet_hours:</span> {{.GateDetail.QuietHours}}<br>
|
|
<span class=muted>calendar_busy:</span> {{.GateDetail.CalendarBusy}}<br>
|
|
<span class=muted>presence:</span> {{.GateDetail.Presence}}<br>
|
|
<span class=muted>inert_keys_missing:</span> {{if .GateDetail.InertKeysMissing}}{{join .GateDetail.InertKeysMissing ", "}}{{else}}—{{end}}
|
|
</details></td>
|
|
<td class={{if .WasSelected}}green{{end}}>{{.WasSelected}}</td>
|
|
<td>{{.LostTo}}</td>
|
|
</tr>{{end}}
|
|
</table></div>
|
|
</main>
|