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:
co-authored by
Claude Opus 5
parent
c4f6551844
commit
b3aea00cbb
+5
-1
@@ -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
@@ -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]) => (
|
||||
|
||||
@@ -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
@@ -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");
|
||||
});
|
||||
|
||||
|
||||
Reference in New Issue
Block a user