feat(calendar): month view — the hairline grid and the phone dots #260

Merged
nalum merged 3 commits from feat/calendar-month into main 2026-08-26 18:37:49 +00:00
Owner

Implements #190 on both surfaces, three commits (web, compose twin, live-golden re-record).

  • Desktop month is a hairline grid: one bordered card, no gutters, every week row the same height sized to the busiest day in the month (96/112/132 tiers — the locked demo's supersession of per-row heights), date pill top-left with the word Today, weekends tinted, out-of-month sunken, §2.1 cell rows, N more. The board window widens to the drawn span so out-of-month days carry their content.
  • Phone month stops pretending to hold content: date-and-dots cells — a dot is a person with something on; you first, split-colour lozenge past the cap, a birthday takes a slot with the cake, hollow dot for the pool, solo counts fade — over a full-width day panel of §2.1 wide rows.
  • Ticking from the day panel is a full completion site (§2.3): the boards' own machinery — the §6.3 ask on a repeating job, the stamp drawn over the row that was ticked, confetti when points attach, auto-claim, the polite announce. No surface gets a quiet tick.
  • The dot rule and day sort are pure and pinned cross-surface by conformance/calendar-dots.json (vitest + JUnit twins).
  • Live calendar page goldens re-recorded in their own commit. The phone-default page stays the agenda until #197's switcher lands, so the dots month has no live golden yet — it shows when the grid is pinned.

Stacked on #259. Design: calendar handoff §2.2 + §2.6, calendar-demo.dc.html.

🤖 Generated with Claude Code

Implements #190 on both surfaces, three commits (web, compose twin, live-golden re-record). - **Desktop month** is a hairline grid: one bordered card, no gutters, every week row the same height sized to the busiest day in the month (96/112/132 tiers — the locked demo's supersession of per-row heights), date pill top-left with the word *Today*, weekends tinted, out-of-month sunken, §2.1 cell rows, `N more`. The board window widens to the drawn span so out-of-month days carry their content. - **Phone month** stops pretending to hold content: date-and-dots cells — a dot is a **person** with something on; you first, split-colour lozenge past the cap, a birthday takes a slot with the cake, hollow dot for the pool, solo counts fade — over a full-width day panel of §2.1 wide rows. - **Ticking from the day panel is a full completion site** (§2.3): the boards' own machinery — the §6.3 ask on a repeating job, the stamp drawn over the row that was ticked, confetti when points attach, auto-claim, the polite announce. No surface gets a quiet tick. - The dot rule and day sort are pure and pinned cross-surface by `conformance/calendar-dots.json` (vitest + JUnit twins). - Live calendar page goldens re-recorded in their own commit. The phone-default page stays the agenda until #197's switcher lands, so the dots month has no live golden yet — it shows when the grid is pinned. Stacked on #259. Design: calendar handoff §2.2 + §2.6, calendar-demo.dc.html. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
The desktop month (#190) becomes a hairline grid: one bordered card, no
gutters, every week row the same height sized to the busiest day in the
month (96/112/132px tiers — per-row heights made the grid choppy and
moved the date as content changed), the date in the same top-left spot
in every cell with today a filled accent pill and the word beside it,
weekends tinted, out-of-month sunken, overflow reading 'N more'. Cells
carry no time column: rows sort timed-first by clock, then the all-day
items with birthdays leading and unowned jobs last (calendarDaySort).
The grid now spans the whole weeks it draws, so the board's window
widened from month±1day to the drawn span.

At phone width the month stops pretending to hold content: a date and
up to three dots, where a dot is a PERSON with something on, not an
item. You first, then household order, so your own colour is never
merged away; past the cap the last slot merges into a split-colour
lozenge (never a numeral at 8px); a birthday takes a slot with the
cake; unowned jobs draw the hollow dot; soloed to one person the dots
count that person's items instead, fading, because colour is then
carrying nothing. Day content lives in a full-width panel below the
grid built from the §2.1 wide rows.

phoneDots and calendarDaySort are pure and pinned by
conformance/calendar-dots.json, which the Compose twin's JUnit suite
reads in the next commit.

Design: calendar handoff §2.2 and §2.6, calendar-demo.dc.html.
The Android half of #190. The wide layout draws the same hairline month
as the web: one bordered card, uniform week rows tiered to the busiest
day, date pill top-left with the word Today, weekends tinted,
out-of-month sunken, §2.1 cell rows and 'N more'. The compact layout
stops pretending to hold content: date-and-dots cells (a dot is a person
with something on — you first, merge lozenge past the cap, cake takes a
slot, hollow dot for the pool, solo counts fade) over a full-width day
panel of §2.1 wide rows. The event window widens to the drawn span, and
the old text-chip grid (GridEntryChip) goes with the layouts it dressed.

Ticking a job from the day panel is a full completion site (§2.3): the
boards' own machinery — optimistic complete, the §6.3 ask on a repeating
job, the stamp drawn over the row that was ticked (JobStamp gains a
markSize for row-scale stamps), confetti when points attach, the polite
announce. CalMonth.kt is calmonth.ts's twin, and CalMonthTest holds the
dot rule to conformance/calendar-dots.json — the same file the web suite
asserts.

Design: calendar handoff §2.2 and §2.6, calendar-demo.dc.html.
test(ui): re-record the calendar page goldens for the month redesign
Some checks failed
check / commits (pull_request) Successful in 22s
check / go (pull_request) Successful in 2m54s
check / report (pull_request) Successful in 10s
check / web (pull_request) Failing after 3m43s
android / build (pull_request) Failing after 4m52s
android / report (pull_request) Successful in 3s
b6fb0ddb5a
The live whole-page shots move because #190 moved the page: the hairline
month with uniform week rows on desktop, the dot month with the day
panel on the phone. Re-recorded on their own so the reviewable diff in
the code commits stays code.

Test report

Suite Tests Result Skipped
Unit 1440 ✅ pass 1
Integration 133 ✅ pass —

Coverage: 27.0%

Updated by the check workflow · commit f304114887

<!-- ci-test-report --> ## Test report | Suite | Tests | Result | Skipped | | --- | --: | --- | --: | | Unit | 1440 | ✅ pass | 1 | | Integration | 133 | ✅ pass | — | **Coverage:** 27.0% <sub>Updated by the check workflow · commit f304114887bac5c60516f4501d7bb623c78d855c</sub>

Android test report

Suite Tests Result Skipped
Unit (debug) 193 ✅ pass 0

Coverage: 9.6% of lines

Updated by the android workflow · commit f304114887

<!-- android-test-report --> ## Android test report | Suite | Tests | Result | Skipped | | --- | --: | --- | --: | | Unit (debug) | 193 | ✅ pass | 0 | **Coverage:** 9.6% of lines <sub>Updated by the android workflow · commit f304114887bac5c60516f4501d7bb623c78d855c</sub>
nalum force-pushed feat/calendar-month from b6fb0ddb5a
Some checks failed
check / commits (pull_request) Successful in 22s
check / go (pull_request) Successful in 2m54s
check / report (pull_request) Successful in 10s
check / web (pull_request) Failing after 3m43s
android / build (pull_request) Failing after 4m52s
android / report (pull_request) Successful in 3s
to 759030cf1a
All checks were successful
check / commits (pull_request) Successful in 13s
check / go (pull_request) Successful in 2m53s
android / build (pull_request) Successful in 7m23s
check / web (pull_request) Successful in 4m53s
check / report (pull_request) Successful in 6s
android / report (pull_request) Successful in 3s
2026-08-26 03:45:35 +00:00
Compare
nalum force-pushed feat/calendar-month from 759030cf1a
All checks were successful
check / commits (pull_request) Successful in 13s
check / go (pull_request) Successful in 2m53s
android / build (pull_request) Successful in 7m23s
check / web (pull_request) Successful in 4m53s
check / report (pull_request) Successful in 6s
android / report (pull_request) Successful in 3s
to 4c82ce2684
Some checks failed
check / commits (pull_request) Successful in 14s
check / go (pull_request) Successful in 3m5s
android / build (pull_request) Successful in 7m20s
check / web (pull_request) Failing after 3m52s
android / report (pull_request) Has been cancelled
check / report (pull_request) Has been cancelled
2026-08-26 04:32:30 +00:00
Compare
nalum force-pushed feat/calendar-month from 4c82ce2684
Some checks failed
check / commits (pull_request) Successful in 14s
check / go (pull_request) Successful in 3m5s
android / build (pull_request) Successful in 7m20s
check / web (pull_request) Failing after 3m52s
android / report (pull_request) Has been cancelled
check / report (pull_request) Has been cancelled
to e3b765e564
All checks were successful
check / commits (pull_request) Successful in 15s
check / go (pull_request) Successful in 2m45s
android / build (pull_request) Successful in 7m8s
check / web (pull_request) Successful in 4m33s
check / report (pull_request) Successful in 5s
android / report (pull_request) Successful in 4s
2026-08-26 04:56:41 +00:00
Compare
nalum force-pushed feat/calendar-month from e3b765e564
All checks were successful
check / commits (pull_request) Successful in 15s
check / go (pull_request) Successful in 2m45s
android / build (pull_request) Successful in 7m8s
check / web (pull_request) Successful in 4m33s
check / report (pull_request) Successful in 5s
android / report (pull_request) Successful in 4s
to 6fc1fe1cab
Some checks failed
check / commits (pull_request) Successful in 19s
android / build (pull_request) Successful in 7m56s
check / go (pull_request) Successful in 3m0s
check / web (pull_request) Successful in 4m28s
android / report (pull_request) Has been cancelled
check / report (pull_request) Has been cancelled
2026-08-26 05:40:49 +00:00
Compare
nalum force-pushed feat/calendar-month from 6fc1fe1cab
Some checks failed
check / commits (pull_request) Successful in 19s
android / build (pull_request) Successful in 7m56s
check / go (pull_request) Successful in 3m0s
check / web (pull_request) Successful in 4m28s
android / report (pull_request) Has been cancelled
check / report (pull_request) Has been cancelled
to 36e97751c5
All checks were successful
check / commits (pull_request) Successful in 19s
check / go (pull_request) Successful in 2m52s
android / build (pull_request) Successful in 6m59s
check / web (pull_request) Successful in 4m53s
check / report (pull_request) Successful in 4s
android / report (pull_request) Successful in 5s
2026-08-26 06:16:38 +00:00
Compare
nalum force-pushed feat/calendar-month from 36e97751c5
All checks were successful
check / commits (pull_request) Successful in 19s
check / go (pull_request) Successful in 2m52s
android / build (pull_request) Successful in 6m59s
check / web (pull_request) Successful in 4m53s
check / report (pull_request) Successful in 4s
android / report (pull_request) Successful in 5s
to f304114887
Some checks failed
check / commits (pull_request) Successful in 18s
check / go (pull_request) Successful in 2m45s
android / build (pull_request) Successful in 7m15s
check / web (pull_request) Successful in 4m48s
check / report (pull_request) Successful in 4s
android / report (pull_request) Successful in 3s
android / build (push) Has been cancelled
android / report (push) Has been cancelled
check / commits (push) Has been cancelled
check / go (push) Has been cancelled
check / report (push) Has been cancelled
check / web (push) Has been cancelled
tag / tag (push) Has been cancelled
2026-08-26 07:03:25 +00:00
Compare
nalum changed target branch from feat/calendar-row-grammar to main 2026-08-26 18:37:46 +00:00
nalum merged commit f304114887 into main 2026-08-26 18:37:49 +00:00
nalum deleted branch feat/calendar-month 2026-08-26 18:37:53 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
2 participants
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!260
No description provided.