feat(todo): tasks chosen together, quick add reading what is typed (ADR 0033, D14, D15)

- A section's heading stays atop a project's list while its tasks
  scroll beneath it (slivers, PinnedHeaderSliver).
- Upcoming's month unfolds in place beneath its strip, from its name
  or its handle; a button beside the month goes back to today.
- Tasks are chosen together: a row swiped right or held, or Select
  tasks in Today's, Upcoming's and a project's menu; a bar of date,
  move, labels, priority and more (complete, duplicate, deadline,
  delete) takes the navigation bar's place. A row swiped left asks
  for its date.
- TaskRepository.move moves tasks with their sub-tasks.
- parseQuickAdd reads #project, @label (an unknown one made),
  {deadline}, !!1 and p1 to p4, !30m, dates, times and recurrences
  (tomorrow 9am, Mon 18:00, ev Tue 7pm, every 2 days, every weekday),
  from a table of words per language: English, and German beside it.
- Each token is highlighted and shown on its chip; a tap keeps it as
  text, and a chip picked takes it out of the title.
- Quick add shows its title alone at first, its chips once typing
  starts, and the description and deadline behind its + (the
  description also from the down arrow).

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-01 16:53:59 +01:00
commit 4960234a63
Signed by: raisondetredev
GPG key ID: 07F6FCF405488B64

View file

@ -939,6 +939,162 @@ abstract class AppLocalizations {
/// In en, this message translates to:
/// **'Where the task is'**
String get taskPath;
/// No description provided for @weekToday.
///
/// In en, this message translates to:
/// **'Back to today'**
String get weekToday;
/// No description provided for @monthPrevious.
///
/// In en, this message translates to:
/// **'Previous month'**
String get monthPrevious;
/// No description provided for @monthNext.
///
/// In en, this message translates to:
/// **'Following month'**
String get monthNext;
/// No description provided for @monthShow.
///
/// In en, this message translates to:
/// **'Show the whole month'**
String get monthShow;
/// No description provided for @monthHide.
///
/// In en, this message translates to:
/// **'Show one week'**
String get monthHide;
/// No description provided for @selectTasks.
///
/// In en, this message translates to:
/// **'Select tasks'**
String get selectTasks;
/// No description provided for @selectionCount.
///
/// In en, this message translates to:
/// **'{count, plural, =0{Select tasks} =1{1 task selected} other{{count} tasks selected}}'**
String selectionCount(int count);
/// No description provided for @selectionEnd.
///
/// In en, this message translates to:
/// **'Stop selecting'**
String get selectionEnd;
/// No description provided for @selectionDate.
///
/// In en, this message translates to:
/// **'Date'**
String get selectionDate;
/// No description provided for @selectionMove.
///
/// In en, this message translates to:
/// **'Move to'**
String get selectionMove;
/// No description provided for @selectionLabels.
///
/// In en, this message translates to:
/// **'Labels'**
String get selectionLabels;
/// No description provided for @selectionPriority.
///
/// In en, this message translates to:
/// **'Priority'**
String get selectionPriority;
/// No description provided for @selectionMore.
///
/// In en, this message translates to:
/// **'More'**
String get selectionMore;
/// No description provided for @selectionDelete.
///
/// In en, this message translates to:
/// **'{count, plural, =1{Delete 1 task} other{Delete {count} tasks}}'**
String selectionDelete(int count);
/// No description provided for @selectionDeleteTitle.
///
/// In en, this message translates to:
/// **'Delete the tasks?'**
String get selectionDeleteTitle;
/// No description provided for @selectionDeleteMessage.
///
/// In en, this message translates to:
/// **'{count, plural, =1{1 task is deleted with its sub-tasks, on all your devices.} other{{count} tasks are deleted with their sub-tasks, on all your devices.}}'**
String selectionDeleteMessage(int count);
/// No description provided for @selectionDuplicate.
///
/// In en, this message translates to:
/// **'{count, plural, =1{Duplicate 1 task} other{Duplicate {count} tasks}}'**
String selectionDuplicate(int count);
/// No description provided for @selectionComplete.
///
/// In en, this message translates to:
/// **'{count, plural, =1{Complete 1 task} other{Complete {count} tasks}}'**
String selectionComplete(int count);
/// No description provided for @selectionDeadline.
///
/// In en, this message translates to:
/// **'Deadline'**
String get selectionDeadline;
/// No description provided for @tasksCompleted.
///
/// In en, this message translates to:
/// **'{count, plural, =1{Task done} other{{count} tasks done}}'**
String tasksCompleted(int count);
/// No description provided for @swipeSelect.
///
/// In en, this message translates to:
/// **'Select'**
String get swipeSelect;
/// No description provided for @swipeDate.
///
/// In en, this message translates to:
/// **'Date'**
String get swipeDate;
/// No description provided for @tasksMenu.
///
/// In en, this message translates to:
/// **'More'**
String get tasksMenu;
/// Quick add's + menu, holding Description and Deadline (ADR 0033, D15).
///
/// In en, this message translates to:
/// **'More'**
String get quickAddMore;
/// Below quick add's title while it has tokens recognised (D15).
///
/// In en, this message translates to:
/// **'Tap a highlighted word to keep it as text.'**
String get quickAddTokenHint;
/// Quick add's deadline chip and menu entry (D15).
///
/// In en, this message translates to:
/// **'Deadline'**
String get deadlineTitle;
}
class _AppLocalizationsDelegate