feat(todo): Today laid out as a calendar, planned from its Plan by dragging, as Todoist's desktop Today (ADR 0033, D30)

The developer asked for Todoist's desktop Today planning: a day of hours
and a Plan beside it, tasks dragged from it onto an hour. Today gets a
Display, its layout alone (List or Calendar), kept in the person's sealed
settings row as Upcoming's (`TodayView`, the payload's `today`, schema
still 1). Its Calendar is one day of `HourGrid`; *Plan: n* in its app bar
shows or hides the Plan (`PlanPanel`): Overdue with Reschedule, To plan
(today's without a time) and Time-blocked (today's with one), each
folding with its count, narrowed for the session by *All projects*'
Filter by project (a search and a box a project, a sub-project with its
parents' path). A row dropped on an hour is moved to today at that time,
its duration kept; a block dropped on the Plan loses its time; both undone
from the snack bar, through `moveTask`. From a medium width of Today's own
on the Plan stands beside the day, shown or hidden as remembered; on a
phone it is a sheet over the day's foot (the developer's choice, over the
Plan on wide windows alone and over a strip above the day), part of the
screen rather than a modal route, so that the day behind it takes the
drop, and it lowers to its heading while one of its rows is held.

Whats-New: Today's Display offers a Calendar layout: today's hours, with a Plan of what is overdue, to plan and time-blocked, whose tasks you drag onto an hour.
Whats-New-De: Die Anzeige von Heute bietet das Layout Kalender: die Stunden des Tages, mit einem Plan aus Überfälligem, Zu planen und Eingeplant, dessen Aufgaben du auf eine Stunde ziehst.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
This commit is contained in:
Tizian 「ティツィアーン」 2026-11-04 22:39:38 +01:00
commit 574b379f11
Signed by: raisondetredev
GPG key ID: 07F6FCF405488B64

View file

@ -271,7 +271,7 @@ alternative was put to them, the choice is theirs.
today. Upcoming's rows, overdue ones too, held and dropped on another day move there,
their time, duration and recurrence kept, *Moved to …* offering to undo it; their
order within a day stays their times' and priorities', and Today's rows aren't
dragged.
dragged (its Plan's are since D30).
- **D17 Each project's Display, synced** (the developer's, 1 Nov, as Todoist's; D8's
later step): a project's screen, the Inbox's too, has a Display button beside its ⋮, a
dot on it while anything differs from how a project shows at first. Its sheet sets
@ -288,7 +288,7 @@ alternative was put to them, the choice is theirs.
project alike (`ProjectView`, the payload's `view`, written only once set; values a
version doesn't know read as at first). The schema stays 1: an older version reads
such a project, and renaming it there drops its Display, which beats a newer schema
it couldn't read at all. Upcoming's Display (Today has none, as in Todoist) is in
it couldn't read at all. Upcoming's Display (Today had none until D30) is in
a sealed person-settings row (`todo_settings`, below), which is also to hold D4's
settings. **The Board** (as built, 1 Nov), the Display's Layout (List,
Board): a column for the tasks in no section, *(No section)*, always first, then one
@ -515,6 +515,51 @@ The developer's review of 4 Nov 2026, again beside Todoist's screens.
and the recognition service it queries, iOS and macOS the usage texts and macOS the
audio input entitlement, as Learn's. *Alternatives:* a microphone beside the send
button always (one more button in a bar already full, and Todoist's swaps them).
- **D30 Today planned on a calendar, as Todoist's desktop Today** (the developer's, 4
Nov 2026, from their screenshots of Todoist's desktop app): Today gets a Display
(amends D17's "Today has none"), its **Layout** alone, *List* or *Calendar*, with
Display's pictures (`LayoutPicker`; no Board, a day having no sections), kept in the
person's sealed settings row as Upcoming's (`TodayView` in `todo_settings`, the
payload's `today`, schema still 1: an older version reads it, and writing its settings
there drops it, as D17 accepted for a project's view). *Calendar* is **one day of
hours**, Upcoming's 3-day grid generalised to any number of days (`HourGrid`, D17's
`ThreeDayGrid` renamed, `days: 1`): today's tasks without a time *All day* on top,
timed ones as blocks as long as they last, overlapping ones side by side, a **line at
the time it is now** (its time in cerise in the hours' column, drawn again each
minute; Upcoming's grid has it too), a block dragged to another hour moving there
(snapping to a quarter hour), onto *All day* losing its time, a long press adding a
task, as D17. With one day there are no day names, arrows nor *Overdue* button: what
is overdue waits in the Plan. The day scrolls to the hour before now at first.
**The Plan** (`PlanPanel`): *Plan: 3* in Today's app bar, in the Calendar layout
alone, shows or hides it, counting what it holds. Its groups, each folding under its
heading with its count (the fold not kept): *Overdue* with Reschedule (Today's, in
cerise as Todoist's), *To plan* (today's tasks without a time; the developer's
working name, Todoist naming no such group), *Time-blocked* (today's with a time,
Todoist's word; German *Zu planen* and *Eingeplant*); done tasks and later times of
repeating ones are never in it, nor in the day, so neither is planned. *All
projects* opens *Filter by project*, a field searching the projects' names and a box
to tick for each (the Inbox first, a sub-project with its parents' path, "Life /
Home", D28), several at once, applied as ticked; it narrows the Plan alone, not the
day, and is kept while the app runs, not synced (agent's choice: a filter for one
planning session). A row held and dropped on an hour is moved to **today at that
time** (its top where the pointer is, snapped as a block's), its duration kept or,
without one, half an hour drawn; a block dropped on the Plan loses its time and stays
today; both through `moveTask`, *Moved to …* offering to undo it; a Plan's row dropped
back on the Plan changes nothing. **Where it stands**: from a medium width of
Today's own on (the window-size classes over the body's width, as the board's D17,
so the task pane beside the tabs counts), a panel 340 wide beside the day, shown or
hidden as the person last left it, remembered with the settings (`TodayView.plan`,
open at first); **on a phone, a sheet over the day's foot** (the developer's choice,
over the Plan on wide windows alone and over a strip of tasks above the day), half
the body high above the floating bar, closed until asked and while the app runs;
a row held there **lowers the sheet to its heading**, the day free behind it, and it
rises again once the row is dropped. The sheet is part of Today's screen, not a
modal route (agent's choice): a modal sheet's barrier would take the drop meant for
the day behind it, and closing the route under a drag ends the row's draggable.
The add button hides while the phone's sheet is open. *Alternatives:* the Plan on
wide windows alone (a phone couldn't plan by dragging), a strip above the day
(too little room for three groups), the project filter synced (a planning
session's narrowing would follow the person to their other devices).
## Steps