Skip to content

Sidebar: Drafts · Aloft · Holding · Awaiting review under an index strip; Read lately moves to the Board - #31

Merged
cailmdaley merged 1 commit into
mainfrom
design/ws-sidebar
Oct 7, 2026
Merged

cailmdaley merged 1 commit into
mainfrom
design/ws-sidebar

Conversation

@cailmdaley

Copy link
Copy Markdown
Owner

The reader's Constitutions sidebar now groups the Desk's live work as Drafts · Aloft · Holding · Awaiting review. An index strip at the top names each group that has cards, with its count. Each group's caption sticks to the top of the list while you scroll through that group. Read lately moves out of the sidebar and becomes a quiet line on the Board tab.

In flight's bands are now Aloft and Holding, in that order

  • IN_FLIGHT_BANDS is now [['aloft', 'Aloft'], ['holding', 'Holding']]. The band keys are renamed too (data-flight-band="aloft"|"holding").
  • byInFlightBand sorts Aloft first, so the Desk's In flight column matches the sidebar. Holding keeps its gold edge.
  • Holding means a live worker that has stopped and is waiting on you: runtimePhase is waiting, blocked or attention.
  • The per-worker phase labels are unchanged: the pills still read Aloft / Waiting / Needs you / Blocked.
Desk In flight Sidebar, sticky caption mid-scroll

The sidebar

  • Groups: Drafts (the Desk's drafts column in Desk order, excluding queued children folded under a head), then Aloft, Holding and Awaiting review. If the open constitution belongs to none of them, it gets its own caption at the end, named after its column (e.g. "Resting").
  • The index strip: one row in small mono caps, e.g. DRAFTS 1 · ALOFT 1 · HOLDING 1 · REVIEW 2. Its entries are built from the same groupStops() that J/K walks, so they are the J/K stops by construction.
    • The open constitution's group is underlined and marked with aria-current="location".
    • Clicking an entry lands the way J/K does: on the card you last had open in that group, otherwise its first card.
    • The strip says "Review" for Awaiting review; the caption keeps the full name.
    • The strip sits on the toggle's row, so the list no longer needs its fade-under-the-toggle mask.
  • Sticky captions: each group is now a .ws-channel-group box, so a caption sticks only while you are inside its group and leaves with it.
    • Rows have scroll-margin-top, so revealing a card after J/K or a strip click shows both the card and its caption. This fixes "K doesn't scroll far enough to show Awaiting review".
    • The caption's background and fade appear only while it is stuck (@container scroll-state(stuck: top)). Browsers without that feature keep the background on all the time.
  • Phone: unchanged apart from the band renames. The phone reader has no sidebar; its title opens the ungrouped picker.

Read lately on the Board

A single line under Latest files lists the constitutions opened in the reader this session, most recent first, at most 8. Each name has its host mark and opens in the reader. The line is hidden while nothing has been read, and the board bar's Find filters it. The tracking still lives in Workspace.readLately; only where it is drawn has changed. Opening a constitution now always brings it to the front of the list. The old rule that kept the list still while stepping existed only for the sidebar.

Verification

  • npm test: 1538 passed (America/Los_Angeles). Under Europe/Paris the only failure is runs under the pinned zone, which asserts Los Angeles by design.
  • npm run build: green.
  • node e2e/workspace.mjs: 114 passed, 0 failed. That is the previous 113 plus a new test: The sidebar strip names the J/K stops; every jump and strip click shows the landed card under its caption.
    • The new test runs at 1440×560 so the list scrolls.
    • It exercises K up into Aloft and Drafts, J down to review (the list scrolls), then K back up from review. After each landing it asserts that the card and its caption are both inside the list's box.
    • It also covers strip clicks, the remembered landing card, and that a stuck caption is held only inside its own group.
    • With scroll-margin-top removed, the test fails.
  • Phone page swipe steps… fails intermittently. It fails the same way on origin/main (1 of 4 runs).
  • The "nothing moves" guard now allows .ws-sidebar-index when a worker crosses between Aloft and Holding, because renaming its strip entry is the strip's job.

🤖 Generated with Claude Code

https://claude.ai/code/session_01XEBcfWbydFqYZm6DhLvCqT

… index strip; shelve Read lately on the Board

In flight's bands become Aloft (workers at work) then Holding (live workers
waiting on the human), on the Desk and in the sidebar alike. The sidebar adds
the Desk's drafts, drops Read lately, and opens on a strip naming each group
with its count; its entries are the J/K stops and a click lands as J/K does.
Each group's caption sticks while its cards pass beneath, and a landed card
keeps clear of it, so a jump always shows the card and its caption. The
constitutions read lately move to a quiet line on the Board.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XEBcfWbydFqYZm6DhLvCqT
@cailmdaley
cailmdaley merged commit d8bcec5 into main Oct 7, 2026
3 of 4 checks passed
@cailmdaley
cailmdaley deleted the design/ws-sidebar branch October 7, 2026 14:00
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