docs: draw the roadmap's screens in the panel design
test / test (push) Canceled after 0s

Four screens for open roadmap items, all built from existing components:
Inbound > Filter lists (allow / deny, where the maps go) and an adjusted
Inbound > Log (client, decision, engine and reason, Allow / Deny sender)
for inbound-antispam-panel; Inbound > Quarantine, list and held message
with Release beside a danger-zone Discard, for inbound-quarantine; and
Server > Preflight, a verdict postmark over a table of checks with a
"what to do" column and a test e-mail form, for preflight.

A mockup is the target look, not a decision to build: each item keeps
its status, and quarantine's open questions stay open - the mockup only
assumes answers to them. The paths join the plan's Routes table, the
quarantine and preflight plans link their mockups, and the components
page maps the quarantine decision to a tag. 33 screens; lint clean.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
mix
2026-09-21 22:07:39 +03:00
co-authored by Claude Fable 5.1
parent 5e0adb2de5
commit 2f7b5d95c3
45 changed files with 991 additions and 42 deletions
+16 -9
View File
@@ -31,12 +31,15 @@
<a class="navbar-item" href="in-domains.html"><i class="ti ti-world-download"></i>Domains</a>
<a class="navbar-item is-active" href="in-log.html"><i class="ti ti-list-details"></i>Log</a>
<a class="navbar-item" href="in-queue.html"><i class="ti ti-stack-2"></i>Queue</a>
<a class="navbar-item" href="in-quarantine.html"><i class="ti ti-mail-pause"></i>Quarantine</a>
<a class="navbar-item" href="in-filter-lists.html"><i class="ti ti-filter"></i>Filter lists</a>
</div>
</div>
<div class="navbar-item has-dropdown is-hoverable">
<a class="navbar-link" href="health.html">Server</a>
<div class="navbar-dropdown">
<a class="navbar-item" href="health.html"><i class="ti ti-heartbeat"></i>Health</a>
<a class="navbar-item" href="preflight.html"><i class="ti ti-checklist"></i>Preflight</a>
<a class="navbar-item" href="system-log.html"><i class="ti ti-file-text"></i>System log</a>
<a class="navbar-item" href="backup.html"><i class="ti ti-archive"></i>Backup</a>
<a class="navbar-item" href="users.html"><i class="ti ti-users"></i>Users</a>
@@ -59,14 +62,14 @@
</div>
</nav>
<div class="sp-perf" aria-hidden="true"></div>
<div class="sp-subnav"><div class="container"><a href="in-domains.html"><i class="ti ti-world-download"></i>Domains</a><a href="in-log.html" aria-current="page"><i class="ti ti-list-details"></i>Log</a><a href="in-queue.html"><i class="ti ti-stack-2"></i>Queue</a></div></div>
<div class="sp-subnav"><div class="container"><a href="in-domains.html"><i class="ti ti-world-download"></i>Domains</a><a href="in-log.html" aria-current="page"><i class="ti ti-list-details"></i>Log</a><a href="in-queue.html"><i class="ti ti-stack-2"></i>Queue</a><a href="in-quarantine.html"><i class="ti ti-mail-pause"></i>Quarantine</a><a href="in-filter-lists.html"><i class="ti ti-filter"></i>Filter lists</a></div></div>
<main>
<div class="container sp-page">
<div class="sp-head">
<div class="sp-grow">
<p class="sp-kicker">Inbound</p>
<h1 class="title is-3">Inbound log</h1>
<p class="sp-lead">What port 25 accepted and what it turned away. Accepts come from the inbound journal, rejects from <code>mail.log</code>.</p>
<p class="sp-lead">What port 25 decided about each message, one row per recipient. Accepts come from the inbound journal, rejects from <code>mail.log</code>; the filter's reasons appear when the spam filter is on.</p>
</div>
</div>
@@ -75,20 +78,24 @@
<span class="sp-no">01</span><h2>Messages</h2>
<form class="sp-end" method="get" action="#">
<div class="select is-small"><select name="domain"><option>All domains</option><option>lists.example.org</option><option>acme.io</option></select></div>
<div class="select is-small"><select name="action"><option>Any action</option><option>forwarded</option><option>deferred</option><option>rejected</option></select></div>
<div class="select is-small"><select name="decision"><option>Any decision</option><option>accept</option><option>reject</option><option>tempfail</option><option>quarantine</option></select></div>
<input class="input is-small" type="date" name="from" value="2026-09-14" aria-label="From date">
<input class="input is-small" type="date" name="to" value="2026-09-21" aria-label="To date">
<button type="submit" class="button is-small"><i class="ti ti-filter"></i>Filter</button>
</form>
</div>
<table class="table is-fullwidth is-hoverable">
<thead><tr><th>Time, UTC</th><th>From</th><th>To</th><th>Subject</th><th>Action</th><th>Reason</th></tr></thead>
<thead><tr><th>Time, UTC</th><th>Client</th><th>From</th><th>To</th><th>Subject</th><th>Decision</th><th>Why</th><th></th></tr></thead>
<tbody>
<tr><td class="sp-mono sp-muted sp-nowrap is-size-7">09-21 14:00:18</td><td>t.berg@uni.example</td><td>dev@lists.example.org</td><td class="sp-clip">Re: [dev] patch series v3</td><td><span class="tag is-success is-light">forwarded</span></td><td class="sp-muted">→ mx.internal:25</td></tr>
<tr><td class="sp-mono sp-muted sp-nowrap is-size-7">09-21 13:57:41</td><td>promo@bulk.example</td><td>sales@lists.example.org</td><td class="sp-clip sp-muted">—</td><td><span class="tag is-danger is-light">rejected</span></td><td class="sp-muted">550 5.1.1 unknown recipient</td></tr>
<tr><td class="sp-mono sp-muted sp-nowrap is-size-7">09-21 13:44:02</td><td>hr@partner.example</td><td>jobs@acme.io</td><td class="sp-clip">Application: backend engineer</td><td><span class="tag is-warning is-light">deferred</span></td><td class="sp-muted">upstream 10.0.4.12 timed out</td></tr>
<tr><td class="sp-mono sp-muted sp-nowrap is-size-7">09-21 13:30:55</td><td>noreply@github.example</td><td>security@lists.example.org</td><td class="sp-clip">[advisory] new report</td><td><span class="tag is-success is-light">forwarded</span></td><td class="sp-muted">→ mx.internal:25</td></tr>
<tr><td class="sp-mono sp-muted sp-nowrap is-size-7">09-21 14:00:18</td><td class="sp-mono is-size-7">192.0.2.77</td><td>t.berg@uni.example</td><td>dev@lists.example.org</td><td class="sp-clip">Re: [dev] patch series v3</td><td><span class="tag is-success is-light">accept</span></td><td class="sp-muted is-size-7">rspamd · score 0.4</td><td class="sp-actions"><a href="in-filter-lists.html">Deny sender</a></td></tr>
<tr><td class="sp-mono sp-muted sp-nowrap is-size-7">09-21 13:59:02</td><td class="sp-mono is-size-7">203.0.113.140</td><td>invoice@partner-billing.example</td><td>owner@lists.example.org</td><td class="sp-clip">Outstanding invoice — action required</td><td><span class="tag is-primary is-light">quarantine</span></td><td class="sp-muted is-size-7">rspamd · score 9.8 · PHISHING, FORGED_SENDER</td><td class="sp-actions"><a href="in-quarantine-message.html">Review</a></td></tr>
<tr><td class="sp-mono sp-muted sp-nowrap is-size-7">09-21 13:57:41</td><td class="sp-mono is-size-7">198.51.100.90</td><td>promo@bulk.example</td><td>sales@lists.example.org</td><td class="sp-clip sp-muted">—</td><td><span class="tag is-danger is-light">reject</span></td><td class="sp-muted is-size-7">postfix · 550 5.1.1 unknown recipient</td><td class="sp-actions"><a href="in-filter-lists.html">Deny sender</a></td></tr>
<tr><td class="sp-mono sp-muted sp-nowrap is-size-7">09-21 13:51:30</td><td class="sp-mono is-size-7">198.51.100.12</td><td>billing@partner.example</td><td>owner@lists.example.org</td><td class="sp-clip">Invoice 2026-0917</td><td><span class="tag is-danger is-light">reject</span></td><td class="sp-muted is-size-7">rspamd · score 16.2 · BAYES_SPAM</td><td class="sp-actions"><a href="in-filter-lists.html">Allow sender</a></td></tr>
<tr><td class="sp-mono sp-muted sp-nowrap is-size-7">09-21 13:44:02</td><td class="sp-mono is-size-7">192.0.2.31</td><td>hr@partner.example</td><td>jobs@acme.io</td><td class="sp-clip">Application: backend engineer</td><td><span class="tag is-warning is-light">tempfail</span></td><td class="sp-muted is-size-7">selfpost · upstream 10.0.4.12 timed out</td><td class="sp-actions"></td></tr>
<tr><td class="sp-mono sp-muted sp-nowrap is-size-7">09-21 13:30:55</td><td class="sp-mono is-size-7">192.0.2.200</td><td>noreply@github.example</td><td>security@lists.example.org</td><td class="sp-clip">[advisory] new report</td><td><span class="tag is-success is-light">accept</span></td><td class="sp-muted is-size-7">rspamd · allow list</td><td class="sp-actions"></td></tr>
</tbody>
</table>
<div class="sp-box-foot"><span>Page 1 of 38</span><a href="#">Older →</a><span class="sp-end">New rows appear on their own</span></div>
<div class="sp-box-foot"><span>Page 1 of 38</span><a href="#">Older →</a><span class="sp-end">Allow / Deny sender opens <a href="in-filter-lists.html">Filter lists</a> with the entry filled in · global administrator only</span></div>
</div>
<footer class="sp-foot">SelfPost 1.8.0 · © 2026 Mix · <a href="#">License (AGPL-3.0)</a> · <a href="#">Source</a> · No warranty</footer>