Skip to content

feat(panel): editorial almanac visual redesign#255

Merged
upsetbit merged 27 commits into
masterfrom
panel/editorial-almanac
Jun 24, 2026
Merged

feat(panel): editorial almanac visual redesign#255
upsetbit merged 27 commits into
masterfrom
panel/editorial-almanac

Conversation

@upsetbit

@upsetbit upsetbit commented Jun 22, 2026

Copy link
Copy Markdown
Contributor

What

Visual redesign of prosa-panel in an Editorial Almanac direction: a warm-ink,
printed-journal look that leans into the design brief's "airy, contemplative digital
notebook" intent with a distinctive typographic point of view. Chosen from five full
prototypes built in parallel and compared on real data.

The look

  • Type: Newsreader (serif) for headings, the wordmark, and big KPI numerals;
    Geist for body, tables, and prose; Geist Mono for IDs, timestamps, costs, raw.
  • Palette: warm near-black ink surfaces (#15140f) with a single petrol accent
    (#2f8f7f).
  • Layout: hairline rules in place of bordered cards; small-caps section labels;
    serif KPI numerals; folio-style topbar; generous page margins.

Themes

The editorial layout and type are global, so every theme gets them; each named theme
stays a distinct color skin. Almanac (warm editorial) is the new default in
:root; the original Colorblind (Okabe-Ito) palette returns as a selectable
[data-theme="colorblind"] theme so the colorblind-safe option is kept.

Session detail (side panel)

Restructured from a chat-bubble layout into an editorial dossier:

  • A slim sticky bar (agent + close) keeps identity and close reachable.
  • A serif masthead: the first prompt as the headline, plus a byline of
    project, time, and model.
  • A horizontal stat strip (turns, tools, duration, tokens, cost) in serif numerals.
  • The dense metadata folds into a collapsed Details disclosure.
  • The transcript is a left-aligned role-rail thread: a colored left rule plus a
    small-caps role label per turn (user input on a subtle surface, assistant prose
    bare, tool output as a monospace block), under a toolbar with search, turn count,
    and collapse-all. All HTMX (subagent drilldown, raw pagination) and Alpine
    (collapse, search) wiring is preserved.

Reviewer pass

Ran prosa-panel-ui-reviewer and addressed the findings:

  • Accessibility: functional labels (nav, table headers, section eyebrows, side
    panel labels, transcript meta) moved from --text-3 to --text-2 so they pass
    WCAG AA on the default theme.
  • Removed a dead duplicate background declaration in the side-panel header.
  • Dropped the unused Newsreader 500 and 600 faces.
  • Corrected a stale colorblind default-theme reference in the architecture doc.

Remaining nits (pre-existing, tracked for a follow-on): --text-3 timestamps on
solarized-light and nord are low-contrast for tertiary text; a couple of :focus vs
:focus-visible cleanups; one #ffffff literal in a color-mix.

Refinement pass

Desktop polish and a light information-architecture pass on top of the visual
redesign:

  • Sessions → a day-grouped feed. One quiet line per session (agent color dot ·
    message · subagent count · project · tokens · time), grouped under Today /
    Yesterday / dated headers, with the filter wall collapsed behind a Filters
    disclosure. Replaces the agent/kind pill table whose rows wrapped to uneven heights.
  • Session detail → navigable subagents. The subagents list moves up under the
    stats, and subagent sessions get a prev/next sibling pager plus a back-to-parent
    link instead of a list buried at the end.
  • Projects → a magnitude leaderboard. Each row gains a sessions bar; the
    dead-space table is gone.
  • Home → fewer, denser cards. The Models and Tokens-&-cost cards merge into one
    Models leaderboard (sessions · tokens · spend · bar); chart legends collapse to a
    horizontal labels-only strip; and the Across-the-day card drops its duplicate
    tokens line.
  • Numbers + restraint. Token totals humanize (26.5b) and spend gains thousands
    separators ($17,436.35); accent is reserved for links and hover instead of whole
    data columns; the content reading measure is capped on wide screens; the
    error-prone-model KPI renders as a label rather than a 44px headline; and a
    nested-anchor break in the Issues / Top-delegators lists is fixed.

Also folds in the earlier responsive pass (favicon-safe dev-login, card layouts for
the devices table and the mobile side panel) and aligns the preference tests with the
almanac default.

Annotated polish pass

A second review pass driven by annotated screenshots, plus a global model-name cleanup:

  • Model names everywhere. A new displayModel normalizer renders raw ids as compact
    labels (claude-opus-4-8 → "Opus 4.8", claude-haiku-4-5-20251001 → "Haiku 4.5",
    gpt-5.3-codex → "GPT-5.3 Codex") across the model board, errors-per-model, the
    error-prone-model KPI, model share, across-the-day, and the session byline. Display-only —
    raw ids still drive links and filters.
  • Home. The activity heatmap fills the content width; the hour-of-day chart grows to
    balance the Usage column; the Issues KPIs baseline-align; and the KPI strip's doubled
    hairline collapses to a single rule (shared fix across Home, Insights, and Profiles).
  • Insights. Spend and tokens merge into one overlaid chart (each series normalized to
    its own peak, real totals kept in the caption); model share widens to the top 7 so
    "other" shrinks; the punch card gains the heatmap's hover tooltip; and "Agentic session
    kinds" stacks under "By parent agent" to balance the row.
  • Profiles. The small cost donut and its redundant legend give way to one leaderboard —
    a token magnitude bar plus the est. spend on each profile row.
  • Session detail. Header pills align with the masthead, the byline unifies to one size
    (mono time + model), subagents render as minimal feed rows instead of heavy cards, and
    the subagents block no longer collides with the Details disclosure.

Scope

The stack is unchanged — server-rendered html/template + HTMX + Frappe charts, a
single binary with no build step, everything flowing through the existing CSS tokens.
The refinement pass does touch panel handlers and templates (feed grouping, subagent
sibling lookup, the project/model leaderboards, number formatting), but the server
API, OAuth/CSRF, and the chart library are untouched.

Fonts are self-hosted: Newsreader, Geist, and Geist Mono ship as latin-subset
woff2 embedded via embed.FS and served from the binary as font/woff2. No
external font requests.

Preview

just build
PROSA_PANEL_DEV_LOGIN=hi@caian.org PROSA_PANEL_LISTEN_ADDR=:8081 ./bin/prosa-panel

Pick Almanac in Settings to see the default editorial palette, then open a session
from the Sessions table to see the redesigned detail panel.

🤖 Generated with Claude Code

upsetbit and others added 27 commits June 22, 2026 01:16
Repaint the default :root theme to a warm-ink editorial scheme; add a Newsreader serif token.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Serif display headings with small-caps labels; sections split by thin rules, not bordered cards.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Serif KPI numerals, small-caps headers, hairline separators across dashboard, tables and panels.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Load the editorial families in the document heads. Self-hosting woff2 via embed.FS is a follow-up.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Embed Newsreader, Geist and Geist Mono (latin) via embed.FS with @font-face; register woff2 MIME.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Panel and login heads stop hitting Google Fonts and the fontsource CDN; embedded faces suffice.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Almanac (warm editorial) becomes the :root default; Okabe-Ito returns as a selectable theme.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Align the panel design brief, components, screens, and architecture docs with the Almanac redesign.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Functional labels move from --text-3 to --text-2 so nav, table headers, and eyebrows pass WCAG AA.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The panel reset renders the Almanac default, not Colorblind.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Masthead headline, stat strip, Details disclosure, and a role-rail transcript for clearer scanning.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
No serif element uses weight 500 or 600; the woff2 files are removed and the faces dropped.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Add formatUSD (thousands separators) and route profile token + spend totals
through formatTokensCompact and formatUSD so big numbers read at a glance.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Group sessions by day with one quiet line each (agent color dot, message,
subagent count, project, tokens, relative time) and collapse the filter wall
behind a Filters disclosure. Replaces the wrapping-pill column table; rows are a
single anchor that HTMX-swaps the side panel.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
… pager

Move the subagents list under the stats cluster and add a prev/next pager plus a
back-to-parent link on subagent sessions, so children are easy to see and step
through instead of buried at the end.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Each project row gets a sessions magnitude bar in place of the dead-space table.
This commit's style.css changes also cap the main reading measure on wide
screens, tame accent on data-table links across pages, and de-emphasize the Usage
summary.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Fold Models and Tokens-&-cost into one model leaderboard (sessions, tokens,
spend, bar). Humanize dashboard/insights totals, size the error-prone-model KPI
as a label, render issues/delegator projects as non-link labels (projectLabel) to
fix a nested-anchor break, condense chart legends to a horizontal strip, and drop
the Across-the-day tokens line.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
almanac has been the default theme since 0f5821a; update the two stale
data-theme assertions and the theme.go doc comment to match.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Return 204 for /favicon.ico so the request does not reset the pre-login CSRF
token, and render the devices table and mobile sidepanel as labelled cards on
narrow viewports.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Devbox auto-resolved the nodejs@24 plugin version.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Render raw model ids as compact human labels (claude-opus-4-8 -> "Opus 4.8",
gpt-5.3-codex -> "GPT-5.3 Codex", trailing date stamps dropped). displayModel
is display-only and registered as a template func; raw ids stay in links,
filters, and map keys.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Heatmap fills the content width (one cell var scales every part); the
hour-of-day chart grows to balance the Usage column; the Issues KPIs
baseline-align so labels share a line; the KPI strip drops its bottom rule so
the first card's top border is the only separator. Board, errors-per-model, and
the error-prone-model KPI now read model names through displayModel (which also
shrinks that KPI value); the orphaned cost-legend row type is removed.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Merge the stacked spend and tokens charts into one axis-mixed overlay, each
series normalized to its own peak (real totals stay in the caption). Model
share keeps the top-7 with humanized names so "other" shrinks; the punch card
gains the heatmap's hover tooltip; and "Agentic session kinds" stacks under
"By parent agent" so the delegation row is balanced. Across-the-day names are
humanized too.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Replace the small donut and its redundant legend with one leaderboard: each
profile row carries its token magnitude bar plus the estimated spend on the
same line.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Align the sticky header's pills with the masthead, unify the byline to one
size with mono time and model, render subagents as minimal feed rows instead of
heavy cards, and give the subagents block a bottom rule so it no longer collides
with the Details disclosure.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Collapse the trailing-comment spacing golangci-lint's gofumpt flagged.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@upsetbit upsetbit marked this pull request as ready for review June 24, 2026 17:51
@upsetbit upsetbit merged commit 726be16 into master Jun 24, 2026
5 checks passed
@upsetbit upsetbit deleted the panel/editorial-almanac branch June 24, 2026 17:54
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant