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

@ -2113,6 +2113,24 @@ class AppLocalizationsDe extends AppLocalizations {
@override
String get instanceWelcome => 'Willkommen bei Halkyon Learn';
@override
String get startSignedOut => 'Abgemeldet';
@override
String startOn(String instance) {
return 'Starte auf $instance:';
}
@override
String get startWithoutAccount => 'Ohne Konto starten';
@override
String get startNoGitHubAccount =>
'Noch kein Konto hier meldet sich mit diesem GitHub-Konto an. Starte ohne Konto und füge GitHub dann im Profil hinzu.';
@override
String get startOtherInstance => 'Andere Instanz verwenden';
@override
String get instanceFirstStartSubtitle =>
'Wähle die Instanz, auf der deine Lernsets liegen sollen. Jede betreibt jemand; weitere kannst du später hinzufügen.';
@ -2147,6 +2165,22 @@ class AppLocalizationsDe extends AppLocalizations {
@override
String get settingsSwitchAccount => 'Konto wechseln';
@override
String settingsAccountAnonymous(String instance) {
return 'Anonym auf $instance';
}
@override
String settingsAccountSignedIn(String instance) {
return 'Angemeldet auf $instance';
}
@override
String get accountAnonymous => 'Anonym';
@override
String get accountSignedIn => 'Angemeldet';
@override
String get accountsTitle => 'Konten';
@ -3572,6 +3606,23 @@ class AppLocalizationsDe extends AppLocalizations {
@override
String get studyCheck => 'Prüfen';
@override
String studyComesBackIn(int count) {
String _temp0 = intl.Intl.pluralLogic(
count,
locale: localeName,
other: 'nach $count Karten',
one: 'nach 1 Karte',
);
return '$_temp0';
}
@override
String get studyComesBackAtEnd => 'am Ende';
@override
String get studyComesBackNow => 'sofort';
@override
String get studySelectAll => 'Wähle alle zutreffenden aus';
@ -7069,6 +7120,55 @@ class AppLocalizationsDe extends AppLocalizations {
return '$hours Std. $minutes Min.';
}
@override
String get progressPathsInfo =>
'Die Schritte der Lernpfade dieses Lernsets und seiner Themen, die du erledigt hast.';
@override
String progressStepsDone(int total) {
String _temp0 = intl.Intl.pluralLogic(
total,
locale: localeName,
other: 'von $total Schritten erledigt',
one: 'von 1 Schritt erledigt',
);
return '$_temp0';
}
@override
String get progressReading => 'Lesen';
@override
String get progressReadingInfo =>
'Die PDFs dieses Lernsets und seiner Themen, die du noch nicht bis zur letzten Seite gelesen hast. Tippe eins an, um weiterzulesen.';
@override
String progressPdfPage(int page, int count) {
return 'Seite $page von $count';
}
@override
String get progressPdfNotBegun => 'Noch nicht begonnen';
@override
String progressPdfsAllRead(int count) {
String _temp0 = intl.Intl.pluralLogic(
count,
locale: localeName,
other: 'Alle $count PDFs sind zu Ende gelesen.',
one: 'Das PDF ist zu Ende gelesen.',
);
return '$_temp0';
}
@override
String progressShowAllPdfs(int count) {
return 'Alle $count zeigen';
}
@override
String get progressShowFewerPdfs => 'Weniger zeigen';
@override
String planPathsDone(int done, int count) {
String _temp0 = intl.Intl.pluralLogic(
@ -7097,6 +7197,17 @@ class AppLocalizationsDe extends AppLocalizations {
return '$_temp0';
}
@override
String planStudyForExam(int count, String exam) {
String _temp0 = intl.Intl.pluralLogic(
count,
locale: localeName,
other: '$count Karteikarten für $exam lernen',
one: '1 Karteikarte für $exam lernen',
);
return '$_temp0';
}
@override
String planContinue(String title) {
return '„$title“ fortsetzen';