Skip to content

Workspace: the reader's running head, and phone refinements - #9

Merged
cailmdaley merged 29 commits into
mainfrom
design/document-workspace
Oct 5, 2026
Merged

cailmdaley merged 29 commits into
mainfrom
design/document-workspace

Conversation

@cailmdaley

Copy link
Copy Markdown
Owner

The reader's top strip is now a one-line running head. Cail found the old strip grating, and asked for it to be calm and intentional. The PR also carries his phone feedback from trying round 1 (felt#8) live.

Claude Opus 5.5 on behalf of Cail.

The running head

The old strip was two floating paper plates of unequal height above a third paper surface, the page. Its 66 px thumbnails read as texture, labels clipped, and it cost 160 px before the page began.

before after

The head is one line on the veil, on one serif baseline, with no plate, border or shadow. Left to right:

  • the sidebar glyph;
  • ‹ return;
  • the fiber name;
  • Temper / Discard while the fiber awaits review;
  • the page index;
  • the worker control;
  • the page count.

The page now starts at y ≈ 70 instead of 160 at 1440×900.

  • Index. Bare 14 px serif labels, a step below the name. The selected label is underlined in ink, the constitution's own page is §, and a fresh document has a gold dot. Labels prefer declared titles, which titleProbe.ts peeks from each document's first 64 KiB; the 300 most recently used are cached in localStorage and re-read when a file's mtime or receipt changes.

  • Thumbnails on demand. Hovering a label shows a preview card (pointer only; it never takes focus):

  • Worker control. It moved into the head, away from the fiber page's act zone. It is a dot in undiluted pigment (cobalt working, gold waiting) plus the state and elapsed time, and it opens the conversation; c still works. On the phone it is the dot alone, top right.

  • Verdicts in the head are coloured verbs with no plate:

Composition tested and not taken: identity above, filmstrip below. It was calm, but at 44 px its thumbnails were the same illegible texture, and most were blank for audio and PDFs. Branch design/ws-strip-b:

Phone (Cail's notes)

before after
  • The worker pill moved from the page to the top bar's dot.
  • The "21 pages · 2 reports · …" contents line is gone everywhere.
  • The lede is 20 px on the phone (desktop stays 24).
  • The ✕ rhumb lines behind the kicker are gone.
  • The ⋯ joins the settings row.
  • The bottom bar is two lines.
  • Desk phone Temper/Discard: a 28 px plate drawn inside a 44 px button, with no change to card height.
  • Meeting is off by default. It was verified in the browser: 0 getUserMedia calls on load, and nothing joins until Meeting is picked.

Audio page scrolled out of reach

The audio scroller centred its content with flexbox. Content taller than the screen overflowed above the top, and you could never scroll up to it (115 px on Music at 390×844). Now the scroller is a block, the waveform takes touch-action: pan-y, and the scroller feeds the reader's scroll handling (top-bar hide, position restore).

before after

Review and gates

  • Luna review (other family) found no security or sandbox regressions. Its three findings are fixed:
    • stale titles within a session (bdfaa357);
    • audio scroll not reaching the reader (58ace126);
    • unbounded probe sets.
  • Unit tests: 1543/1543 under both time zones (--maxWorkers=2).
  • Typecheck: clean.
  • e2e: 92–93 pass. Under load, a different single test fails each full run and passes alone. "Phone page swipe steps…" recurs most.

Unverified: finger scrolling of the audio page on a real iPhone. The iOS Simulator shows the waveform's top in reach.

Theming: this breaks the theme surface. [data-part="chrome-plate"] is gone, replaced by head parts, and docs/concepts/themes.md is updated. The four bundled themes are updated.

🤖 Generated with Claude Code

https://claude.ai/code/session_01XTQ9CSGaUs1DbFHxME9BB3

cailmdaley and others added 29 commits October 5, 2026 15:25
One row on the veil with no plates: the constitutions glyph on the
sidebar's edge, the serif return and fiber name, the verdicts as
pigmented verbs, an index of bare serif labels centred over the stage,
and the mono page count at the right end. Thumbnails come on demand in
a pointer-only hover preview; the filmstrip mode is gone. Themes lose
the chrome-plate part and the selected tab's fill and shadow.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…r the page

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…previews into frames

A once-per-session 64 KiB peek reads each titled document's declared
title, which the filmstrip's thumbnails used to supply. Leaving the index
puts the preview away at once, and frames yield the pointer while a
preview is up so a move straight into a report still dismisses it.
The e2e suite covers the running head, the preview and its budget.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A peek that could not read its document kept it marked as probed for the
session, so its tab kept the filename. It now becomes eligible again after
PROBE_RETRY_MS.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
On first open the stage's images and frames fill the browser's connections
to the daemon, and a report's title peek waited behind them for seconds.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The index's labels drop to 14 px in muted ink, so the 15 px name in ink
leads the row and the § opens the index. A hairline tick between them was
tried and left out: with a short run centred over the stage it floated
alone after the name.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The card's own pill, bare: a dot in its pigment, the state in the serif and
the elapsed time in mono, before the page count. The phone's top bar shows
the dot alone in a 44 px target. It opens the conversation exactly as the
pill does and repaints every 30 s.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The dot sits at the top bar's right as a 44 px target: cobalt while the
machine works, gold while it waits or is owed. The fiber page drops its
pill on the phone. Alongside: the phone lede steps down to 20 px, the
folded settings row takes the fiber's ⋯, and the resting composer
underlines its field with the verbs beneath, unruled.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… tests

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The audio scroller centred its page as flex content, so a page taller
than the screen overflowed above the scroller's top, out of reach. The
scroller is a block and the page centres with auto margins, which yield
to the top edge. A vertical pan begun on the waveform scrolls the page;
a sideways drag still scrubs.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The 300 most recently used declared titles persist in localStorage with
the validator they were read under, so a return visit names its tabs at
once. A recalled title is not current: the probe still peeks the document
and replaces it only when the title or preview changed. Every storage
access is optional.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…touch target

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The head lane owns the reader's worker control on desktop and phone.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The act zone's pill goes on every viewport, so the worker control is
said once. c still opens the worker's conversation through the same
destination, and the Desk and sidebar cards keep their pills.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The fiber page draws no worker pill; the head's control keeps per-state
coverage (aloft, waiting, no worker). Worker dots take the machine's
cobalt and the undiluted gold, and the head control keeps a 44 px target
under a finger. The Desk verdict e2e now measures the plate's reach.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…st the meta row

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…e tints

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…inside

The verdict button is now the whole touch target on a transparent ground,
with its tinted plate drawn by ::before; negative margins keep the meta
row, and the card, at the plate's height. The e2e shows the Awaiting
folio first, so it probes a button on screen, and times the index's first
hover in the page.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The title probe remembered documents by key alone, so a file replaced in
an open channel kept its old title for the session. It now remembers the
version each document was peeked at (modification time and latest
receipt) and peeks again when that moves; a stale peek's result is
dropped. The probe's and the title cache's session memory are bounded.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
On the phone the audio viewer itself scrolls, but nothing watched it: the
top bar never hid and the reading position was neither saved nor restored
after eviction. The host now binds that viewer as the page's scroller.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@cailmdaley

Copy link
Copy Markdown
Owner Author

Retriggering CI

@cailmdaley cailmdaley closed this Oct 5, 2026
@cailmdaley cailmdaley reopened this Oct 5, 2026
@cailmdaley
cailmdaley merged commit 56219ed into main Oct 5, 2026
8 checks passed
@cailmdaley
cailmdaley deleted the design/document-workspace branch October 5, 2026 17:48
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