Calendar: agenda and week views #192

Closed
opened 2026-08-23 22:54:06 +00:00 by nalum · 2 comments
Owner

Part of the calendar redesign. The design handoff (design_handoff_calendar, held outside the repo) is the source; the facts it depends on are repeated here so this issue stands alone.

Build agenda first: it is the row grammar in a column, and it shakes out the sort rules week view then relies on.

Agenda — a reading column capped at about 40rem, with the date on a left rail (weekday, big date, count). Widening the window adds margin, not row width; the shipped agenda puts the title hard left and the owner hard right with about 660px of nothing between them.

  • Same row grammar as everywhere else, meta right-aligned.
  • Empty days get one collapsed line with an add link rather than vanishing. The gap between the 20th and the 22nd is information.
  • Today is a tinted block with the word, not a 10px grey caption above a card, and the view opens scrolled to it.

Week — phone-first, and honest about what 44px can hold.

  • Seven day columns of about 44px. No titles in the grid: a block is the person's colour and mark, and the block's corners carry the type — squared for a job, rounded for an event. Position on the hour axis carries the time.
  • An untimed band at the top. A due date may or may not carry a time and events may be all-day, so without it half the data vanishes when you switch views.
  • Two-hourly rules, opening at 08:00 scrolled to the current-time line.
  • Tapping a day fills a strip at the bottom with that day's rows, so one tap always produces words. Tapping a block opens the record.
  • Defaults to everyone, like month and agenda. A shared household calendar that opens filtered to one person answers a question nobody asked.

Two requirements added after #213 shipped

The job sheet went out to the family's cluster three times before it was right.
Seven visual defects, none caught by a suite: pickers that unfolded forms
instead of opening, three Save buttons on a commit-on-blur screen, (optional)
labels, a reward's name used as a field label, an unstyled add row, checkboxes
with a ghosted tick, and a create form with a browser spinner. Every one had to
be found by a person looking at a screen.

1. Screenshot goldens are part of this ticket

Record gallery (Playwright) and Roborazzi cases for every surface this ticket
builds or visibly changes, and treat them as a deliverable rather than a
follow-up. Three of #213's defects — the unstyled add row, the ghosted
checkboxes, the spinner in the create form — were pixel faults that a golden
would have caught before a deploy did.

#172 deferred its goldens on the reasoning that later tickets would re-record
them. That reasoning was sound then and is not now: the row grammar and the
pickers are settled, so an image recorded here stays valid.

Mechanics, from AGENTS.md: a new case rides in the same commit as the code
that adds it — a commit that adds a gallery or Roborazzi case without its image
is red on its own, because check / web runs npm run test:screens and
android / build runs verifyRoborazziDebug. A re-recorded existing case
goes in its own commit, so the reviewable diff stays code.

2. Check for leaked form styling before you finish

Every visual defect on #213 came from one place: the shipped app's form
fragments reused inside the new row grammar. They pass every test, because the
tests assert the pieces exist rather than that the screen reads right.

Before you call this done, grep the surfaces you touched and report what you
found and what you did about each:

  • a raw <input> / OutlinedTextField / BasicTextField outside the row and
    picker components — a form field dropped into a list of rows
  • type="number", which renders browser spinner arrows
  • btn, link-btn, btn-quiet or TextButton where a row or a quiet row
    verb belongs — underlined links reading as broken text
  • (optional) in any label — §8 names that pattern as the form admitting it
    should not have asked
  • any Save button on a surface that commits on blur, including Save changes and Save the points
  • a disabled-and-grey control where law 5 wants it absent
  • a record's title used as a field row's label — that column is for a
    field's name (Who, When, Worth), and a long title wraps in it

If your ticket is the first to land after this was written, add the check to
AGENTS.md beside the goldens rule, so it stops being a thing I remember to say.


Update — the demo is the locked reference (2026-08-25)

calendar-demo.dc.html wires both views; build against it. Details it fixes: the agenda spans the whole month including empty days (Nothing on with a + add link), the date rail carries the count (3 things), and the column opens parked on today. Week blocks are the person's colour carrying their glyph, corners 10px for an event and 3px for a job; the untimed band caps at three marks per day; the axis is two-hourly from 07:00 with the accent now-line; the bottom strip names the selected day and offers Open the day ›.

Part of the calendar redesign. The design handoff (`design_handoff_calendar`, held outside the repo) is the source; the facts it depends on are repeated here so this issue stands alone. Build agenda first: it is the row grammar in a column, and it shakes out the sort rules week view then relies on. **Agenda** — a reading column capped at about 40rem, with the date on a left rail (weekday, big date, count). Widening the window adds margin, not row width; the shipped agenda puts the title hard left and the owner hard right with about 660px of nothing between them. - Same row grammar as everywhere else, meta right-aligned. - Empty days get one collapsed line with an add link rather than vanishing. The gap between the 20th and the 22nd is information. - Today is a tinted block with the word, not a 10px grey caption above a card, and the view opens scrolled to it. **Week** — phone-first, and honest about what 44px can hold. - Seven day columns of about 44px. No titles in the grid: a block is the person's colour and mark, and the block's corners carry the type — squared for a job, rounded for an event. Position on the hour axis carries the time. - **An untimed band at the top.** A due date may or may not carry a time and events may be all-day, so without it half the data vanishes when you switch views. - Two-hourly rules, opening at 08:00 scrolled to the current-time line. - Tapping a day fills a strip at the bottom with that day's rows, so one tap always produces words. Tapping a block opens the record. - Defaults to everyone, like month and agenda. A shared household calendar that opens filtered to one person answers a question nobody asked. --- ## Two requirements added after #213 shipped The job sheet went out to the family's cluster three times before it was right. Seven visual defects, none caught by a suite: pickers that unfolded forms instead of opening, three Save buttons on a commit-on-blur screen, `(optional)` labels, a reward's name used as a field label, an unstyled add row, checkboxes with a ghosted tick, and a create form with a browser spinner. Every one had to be found by a person looking at a screen. ### 1. Screenshot goldens are part of this ticket Record gallery (Playwright) and Roborazzi cases for every surface this ticket builds or visibly changes, and treat them as a deliverable rather than a follow-up. Three of #213's defects — the unstyled add row, the ghosted checkboxes, the spinner in the create form — were pixel faults that a golden would have caught before a deploy did. `#172` deferred its goldens on the reasoning that later tickets would re-record them. That reasoning was sound then and is not now: the row grammar and the pickers are settled, so an image recorded here stays valid. Mechanics, from AGENTS.md: a **new** case rides in the same commit as the code that adds it — a commit that adds a gallery or Roborazzi case without its image is red on its own, because `check / web` runs `npm run test:screens` and `android / build` runs `verifyRoborazziDebug`. A **re-recorded existing** case goes in its own commit, so the reviewable diff stays code. ### 2. Check for leaked form styling before you finish Every visual defect on #213 came from one place: the shipped app's form fragments reused inside the new row grammar. They pass every test, because the tests assert the pieces exist rather than that the screen reads right. Before you call this done, grep the surfaces you touched and report what you found and what you did about each: - a raw `<input>` / `OutlinedTextField` / `BasicTextField` outside the row and picker components — a form field dropped into a list of rows - `type="number"`, which renders browser spinner arrows - `btn`, `link-btn`, `btn-quiet` or `TextButton` where a row or a quiet row verb belongs — underlined links reading as broken text - `(optional)` in any label — §8 names that pattern as the form admitting it should not have asked - **any Save button on a surface that commits on blur**, including `Save changes` and `Save the points` - a disabled-and-grey control where law 5 wants it absent - a record's title used as a field row's `label` — that column is for a field's name (`Who`, `When`, `Worth`), and a long title wraps in it If your ticket is the first to land after this was written, add the check to AGENTS.md beside the goldens rule, so it stops being a thing I remember to say. --- ## Update — the demo is the locked reference (2026-08-25) `calendar-demo.dc.html` wires both views; build against it. Details it fixes: the agenda spans the whole month **including empty days** (`Nothing on` with a `+ add` link), the date rail carries the count (`3 things`), and the column opens parked on today. Week blocks are the person's colour carrying their glyph, corners 10px for an event and 3px for a job; the untimed band caps at three marks per day; the axis is two-hourly from 07:00 with the accent now-line; the bottom strip names the selected day and offers `Open the day ›`.
Author
Owner

Delivered in PR #262: the agenda's left-rail rewrite and the new week view (07:00–22:00 axis, the day strip below) on both surfaces. CALENDAR_VIEW_WEEK joins the synced pref; the toolbar (PR #265) exposes it.

Delivered in PR #262: the agenda's left-rail rewrite and the new week view (07:00–22:00 axis, the day strip below) on both surfaces. CALENDAR_VIEW_WEEK joins the synced pref; the toolbar (PR #265) exposes it.
Author
Owner

Delivered by PR #262 (agenda + week views, CALENDAR_VIEW_WEEK synced on both surfaces), merged to main 2026-08-26.

Delivered by PR #262 (agenda + week views, CALENDAR_VIEW_WEEK synced on both surfaces), merged to main 2026-08-26.
nalum closed this issue 2026-08-26 18:47:59 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
eagraiclainne/app#192
No description provided.