feat: a round in the order cards come, shared daily limits, and a start screen

Studying:
- A round is one list in the order its cards come: those done, the one
  shown, those to come. A card due again within the day goes back in
  after 4 more cards when rated Bad, at the end otherwise, so the pills
  above the card follow it; the buttons say "in 4 cards", "at the end",
  "now" (round_order.dart).
- The studied studyset's daily limits hold for everything inside it
  together, as Anki's do for subdecks: twenty topics start 20 new cards
  a day in all, not 20 each.
- The study header's studyset name shows whole on hover or long press.
- The assistant's button sits at the lower left: in the Library across
  from Create studyset, in a studyset above its bar, and higher while
  studying, above the buttons that answer the card.

A studyset:
- Progress also counts the learning paths' steps done and lists the
  PDFs not read to their end, begun first, each opening the reader,
  across its topics (MaterialProgressCubit).
- Next up starts with studying for the exam while one is ahead: its
  reviews due and the new cards its pace leaves for the day.
- Learning paths tagged with a level count towards its automatic exam
  plan and offer it, as cards do.
- A step's first heading equal to its title is dropped on import and
  hidden in paths imported before.

Signing out, or a session the server ended, leads to a start screen
(GitHub, email, without an account, another instance) rather than a new
anonymous account; only the very first start makes one by itself.
Settings names the kind of account and its instance.

Also: the Watch screen reads the cards once for held words and their
progress; its ±10 s buttons tick as the navigation bar does; a map card
keeps its view as its caption changes and brings a picked region
towards the middle; an empty or failed library can be pulled to sync.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
This commit is contained in:
Tizian 「ティツィアーン」 2026-10-17 00:39:34 +02:00
commit de6af3efab
Signed by: raisondetredev
GPG key ID: 07F6FCF405488B64

View file

@ -3454,6 +3454,36 @@ abstract class AppLocalizations {
/// **'Welcome to Halkyon Learn'**
String get instanceWelcome;
/// No description provided for @startSignedOut.
///
/// In en, this message translates to:
/// **'Signed out'**
String get startSignedOut;
/// No description provided for @startOn.
///
/// In en, this message translates to:
/// **'Start on {instance}:'**
String startOn(String instance);
/// No description provided for @startWithoutAccount.
///
/// In en, this message translates to:
/// **'Start without an account'**
String get startWithoutAccount;
/// No description provided for @startNoGitHubAccount.
///
/// In en, this message translates to:
/// **'No account here signs in with this GitHub account yet. Start without an account, then add GitHub in Profile.'**
String get startNoGitHubAccount;
/// No description provided for @startOtherInstance.
///
/// In en, this message translates to:
/// **'Use another instance'**
String get startOtherInstance;
/// No description provided for @instanceFirstStartSubtitle.
///
/// In en, this message translates to:
@ -3508,6 +3538,30 @@ abstract class AppLocalizations {
/// **'Switch account'**
String get settingsSwitchAccount;
/// No description provided for @settingsAccountAnonymous.
///
/// In en, this message translates to:
/// **'Anonymous on {instance}'**
String settingsAccountAnonymous(String instance);
/// No description provided for @settingsAccountSignedIn.
///
/// In en, this message translates to:
/// **'Signed in on {instance}'**
String settingsAccountSignedIn(String instance);
/// No description provided for @accountAnonymous.
///
/// In en, this message translates to:
/// **'Anonymous'**
String get accountAnonymous;
/// No description provided for @accountSignedIn.
///
/// In en, this message translates to:
/// **'Signed in'**
String get accountSignedIn;
/// No description provided for @accountsTitle.
///
/// In en, this message translates to:
@ -5812,6 +5866,24 @@ abstract class AppLocalizations {
/// **'Check'**
String get studyCheck;
/// No description provided for @studyComesBackIn.
///
/// In en, this message translates to:
/// **'{count, plural, =1{in 1 card} other{in {count} cards}}'**
String studyComesBackIn(int count);
/// No description provided for @studyComesBackAtEnd.
///
/// In en, this message translates to:
/// **'at the end'**
String get studyComesBackAtEnd;
/// No description provided for @studyComesBackNow.
///
/// In en, this message translates to:
/// **'now'**
String get studyComesBackNow;
/// No description provided for @studySelectAll.
///
/// In en, this message translates to:
@ -11253,6 +11325,60 @@ abstract class AppLocalizations {
/// **'{hours} h {minutes} min'**
String progressHoursMinutes(int hours, int minutes);
/// No description provided for @progressPathsInfo.
///
/// In en, this message translates to:
/// **'The steps of this studyset\'s learning paths, and its topics\', that you have done.'**
String get progressPathsInfo;
/// No description provided for @progressStepsDone.
///
/// In en, this message translates to:
/// **'{total, plural, =1{of 1 step done} other{of {total} steps done}}'**
String progressStepsDone(int total);
/// No description provided for @progressReading.
///
/// In en, this message translates to:
/// **'Reading'**
String get progressReading;
/// No description provided for @progressReadingInfo.
///
/// In en, this message translates to:
/// **'The PDFs of this studyset and its topics not read to their last page yet. Tap one to read on.'**
String get progressReadingInfo;
/// No description provided for @progressPdfPage.
///
/// In en, this message translates to:
/// **'Page {page} of {count}'**
String progressPdfPage(int page, int count);
/// No description provided for @progressPdfNotBegun.
///
/// In en, this message translates to:
/// **'Not begun yet'**
String get progressPdfNotBegun;
/// No description provided for @progressPdfsAllRead.
///
/// In en, this message translates to:
/// **'{count, plural, =1{The PDF is read to its end.} other{All {count} PDFs are read to their end.}}'**
String progressPdfsAllRead(int count);
/// No description provided for @progressShowAllPdfs.
///
/// In en, this message translates to:
/// **'Show all {count}'**
String progressShowAllPdfs(int count);
/// No description provided for @progressShowFewerPdfs.
///
/// In en, this message translates to:
/// **'Show fewer'**
String get progressShowFewerPdfs;
/// No description provided for @planPathsDone.
///
/// In en, this message translates to:
@ -11277,6 +11403,12 @@ abstract class AppLocalizations {
/// **'{count, plural, =1{Study 1 flashcard} other{Study {count} flashcards}}'**
String planReview(int count);
/// No description provided for @planStudyForExam.
///
/// In en, this message translates to:
/// **'{count, plural, =1{Study 1 flashcard for {exam}} other{Study {count} flashcards for {exam}}}'**
String planStudyForExam(int count, String exam);
/// No description provided for @planContinue.
///
/// In en, this message translates to: