feat: custom frontmatter headers in compose and replies

Adds Key: value header rows under the subject, validated with carrier's
rules: keys of 1-64 letters, digits and dashes, unique case-insensitively,
none of the fields the client sets itself, and the whole block inside the
reader's budget. A reply to a message with the sender's own fields asks
whether to carry copies over.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
randogoth 2026-10-15 15:10:50 +03:00
parent d19568c1c0
commit 0ee4a7a65f
5 changed files with 178 additions and 9 deletions

View file

@ -144,6 +144,8 @@
<form id="compose-form" method="dialog">
<input name="to" required spellcheck="false" placeholder="to: alice@example.org or smol://…">
<input name="subject" spellcheck="false" data-l10n-placeholder="compose-subject-label" placeholder="subject">
<div id="compose-headers"></div>
<button type="button" id="compose-add-header" class="add-header" data-l10n-id="compose-add-header-button">+ header</button>
<textarea name="body" rows="12" data-l10n-placeholder="compose-body-placeholder" placeholder="message"></textarea>
<div id="compose-unpinned" class="seed-card" hidden>
<h4 id="compose-unpinned-title"></h4>
@ -264,6 +266,7 @@
</div>
<footer>
<button type="button" id="confirm-cancel" autofocus data-l10n-id="action-cancel">Cancel</button>
<button type="button" id="confirm-alt" hidden></button>
<button type="button" id="confirm-ok"></button>
</footer>
</dialog>