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
|
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.
|
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
|
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
|
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.
|
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
|
**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
|
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
|
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"
|
aria-label="View"
|
||||||
className="flex rounded-lg border border-hairline p-0.5"
|
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"],
|
["timeline", "Timeline"],
|
||||||
] as const
|
] as const
|
||||||
).map(([id, label]) => (
|
).map(([id, label]) => (
|
||||||
|
|||||||
@@ -165,7 +165,7 @@ function ViewChoice({
|
|||||||
hues: string[];
|
hues: string[];
|
||||||
}) {
|
}) {
|
||||||
const options: Array<{ id: View; label: string; hint: 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." },
|
{ 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", () => {
|
test("asks how the reader wants to see their events", () => {
|
||||||
expect(html()).toContain("How do you want to see them?");
|
expect(html()).toContain("How do you want to see them?");
|
||||||
expect(html()).toContain("Ending soon");
|
expect(html()).toContain("Checklist");
|
||||||
expect(html()).toContain("Timeline");
|
expect(html()).toContain("Timeline");
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user