Announced pages: event windows, header announcements, summary tasks

A question may carry event: {starts, duration, place}. While the
window is open the page is announced in a strip at the top of every
header (name, when, 'in 3 days'), soonest first, and kept out of the
footer nav; when it closes the page becomes a followup - only a
visitor carrying an answer chain still sees it.

announce.rs keeps one record per event page in the runtime-owned
portal_events bucket (built-in state graph: announced ->
awaiting_summary -> summarized, content may override) and, on a
one-minute idempotent sweep, moves ended windows to awaiting_summary,
publishing the transition on portal.answers.submitted as 'Summary
due' - the post-what-happened task a review desk picks up. Lint
warns when event pages exist but nothing reads portal_events.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Bendik Aagaard Lynghaug
2026-08-30 12:34:34 +02:00
co-authored by Claude Fable 5
parent 47d7f9d2c3
commit 0154f6c8c0
8 changed files with 558 additions and 4 deletions
+50
View File
@@ -206,6 +206,56 @@ main.not-found {
min-height: 55svh;
}
/* announcements - live event pages, a strip above the hero copy.
Header, not footer: the one place a page claims attention before
the question is asked. */
.announce {
width: 100%;
display: flex;
flex-wrap: wrap;
justify-content: center;
gap: 0.6rem 1.2rem;
margin: -2rem 0 0.5rem;
font-size: 0.88rem;
position: relative;
z-index: 1;
}
.announce-item {
display: inline-flex;
flex-wrap: wrap;
align-items: baseline;
gap: 0.35rem 0.7rem;
padding: 0.45rem 0.9rem;
border: 0.06rem solid var(--line);
border-left: 0.2rem solid var(--accent);
border-radius: 0.3rem;
color: var(--ink);
text-decoration: none;
background: var(--paper);
transition: border-color 120ms;
}
.announce-item:hover,
.announce-item[aria-current="page"] {
border-color: var(--accent);
}
.announce-name {
font-weight: 600;
}
.announce-when {
color: var(--ink-dim);
}
.announce-relative {
color: var(--accent);
text-transform: uppercase;
letter-spacing: 0.06em;
font-size: 0.72rem;
}
/* alternatives */
/* position + z-index on these three: everything that scrolls over the