Antispam: "Mark as Spam" belongs in the Actions menu
A button pinned to every message header is a persistent control; marking spam is a verb you reach for occasionally, like Reply or Delete. It now lives in the Actions menu, between Labels and Delete. That needed a slot inside the dropdown, which the catalog had no name for: `message.actions.menu`. The host wraps it so any click closes the menu, leaving a bundle to do nothing but act. The UI kit gains `.wm-menu-item`, @applying the exact utilities ThreadView's own menu items use — the same trick the sidebar shell already relies on, so a plugin verb is indistinguishable from a core one rather than approximately similar. Labels follow the folder as before: "Mark as Spam" in the inbox or archive, "Mark as not spam" in the spam folder, nothing in Sent/Drafts/Trash. A message already taught shows that, disabled, instead of offering the lesson again. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_018SqJYt7jD7oUEkoY68sBZo
This commit is contained in:
@@ -181,7 +181,7 @@ async def test_stats_include_engine_state_when_it_is_up(ctx: _Ctx) -> None:
|
||||
|
||||
|
||||
async def test_ui_bundles_are_served_and_gated(ctx: _Ctx) -> None:
|
||||
for name in ("settings.js", "banner.js", "actions.js"):
|
||||
for name in ("settings.js", "banner.js", "menu.js"):
|
||||
r = await ctx.client_a.get(f"{BASE}/ui/{name}")
|
||||
assert r.status_code == 200
|
||||
assert "javascript" in r.headers["content-type"]
|
||||
|
||||
Reference in New Issue
Block a user