feat(ui): call the list view Checklist

"Ending soon" described the sort, not the job — and it sat one line above a
sort control whose own option reads "Ending soonest", so the tab and the
ordering looked like the same control said twice. Checklist is what a reader
with four games is doing with it.

The stored id stays "soon". That value is in `prefs.view` on real devices, and
a label is copy: renaming one must never move a reader to the other view.

Co-Authored-By: Claude Opus 5 (1M context) <[email protected]>
This commit is contained in:
Lucas Winther
2026-08-18 03:59:52 +02:00
co-authored by Claude Opus 5
parent c4f6551844
commit b3aea00cbb
4 changed files with 11 additions and 4 deletions
+5 -1
View File
@@ -86,11 +86,15 @@ back through and that pushed every other bar off to the right. An event older th
its faded left edge rather than being redrawn as though it started at the edge — the same honesty
the frayed right edge carries for an unannounced end.
**F2 — Ends-soonest list.**
**F2 — Checklist (the ends-soonest list).**
A flat list of all *currently running* events sorted ascending by end date, with a relative
countdown ("ends in 2 days", "ends in 4 hours"). Under 24 hours, the row is emphasized. This is the
view that justifies the app, and it is one tap from the timeline.
The tab reads **Checklist**, which is what a reader with four games is doing with it: working down a
list of jobs with deadlines. Its stored id stays `"soon"` — that value is in `prefs.view` on real
devices, and renaming a label must never move a reader to the other view.
**Which view opens is the reader's answer, not ours.** This spec said "calendar (default)" and the
app shipped opening on the list; both were a decision made on the reader's behalf and then forgotten
on every reload. So the first run asks (F8) and the answer is stored in `prefs.view`. The list is
+4 -1
View File
@@ -356,9 +356,12 @@ export function App() {
aria-label="View"
className="flex rounded-lg border border-hairline p-0.5"
>
{/* The id is a stored value (`prefs.view`) and the label is copy, so
they are allowed to drift: renaming the tab must not silently move
every reader to the other view. */}
{(
[
["soon", "Ending soon"],
["soon", "Checklist"],
["timeline", "Timeline"],
] as const
).map(([id, label]) => (
+1 -1
View File
@@ -165,7 +165,7 @@ function ViewChoice({
hues: string[];
}) {
const options: Array<{ id: View; label: string; hint: string }> = [
{ id: "soon", label: "Ending soon", hint: "A list, closest deadline first." },
{ id: "soon", label: "Checklist", hint: "A list, closest deadline first." },
{ id: "timeline", label: "Timeline", hint: "Bars per game, today pinned." },
];
+1 -1
View File
@@ -104,7 +104,7 @@ describe("Welcome (first run)", () => {
test("asks how the reader wants to see their events", () => {
expect(html()).toContain("How do you want to see them?");
expect(html()).toContain("Ending soon");
expect(html()).toContain("Checklist");
expect(html()).toContain("Timeline");
});