feat(app): study with faces on the ratings, centred cards and the session's figures

The study session, reworked:

- Ratings are coloured tiles with a face each (frown, meh, smile,
  laugh), when the card comes back below them with a clock ("in 1
  min", "in 3 days"), always shown, so a card can be rated without
  revealing it; at most 540 dp wide, centred.
- Cards are centred in a section card: the question large, then a line
  with 24 dp on either side and the answer a size smaller, or "Show
  answer" 40 dp below; a tap anywhere on the card shows or hides the
  answer. Read-only rich text takes a text style and an alignment.
- Words show their reading small above the expression once answered,
  and several meanings numbered.
- Choice, matching and map cards: Check below the card, the ratings in
  its place once checked; options marked before their text; matching
  lists the categories first, then what is left to place; the map
  fills the card with one caption below it.
- Header and progress on a band of their own; title start-aligned,
  the Pomodoro timer only to watch, the back-first toggle in every
  state; leaving a round under way asks first.
- Cramming goes round the round; back is there with two cards or more,
  skipping always.
- The end of a round: the cards done of those due, accuracy (OK counts
  half) and time, over the whole session.

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-07 17:40:32 +02:00
commit 369ce4ade1
Signed by: raisondetredev
GPG key ID: 07F6FCF405488B64

View file

@ -1527,6 +1527,47 @@ class AppLocalizationsDe extends AppLocalizations {
@override
String get studyCheck => 'Prüfen';
@override
String get studySelectAll => 'Wähle alle zutreffenden aus';
@override
String get studySelectOne => 'Wähle die richtige Antwort';
@override
String get studyMatchingInstructions => 'AUF DIE KARTEN OBEN ZIEHEN';
@override
String get studyMatchingAllPlaced => 'Alle platziert';
@override
String get studyMatchingDropHere => 'Hier ablegen';
@override
String get studyMapTapPrompt => 'Tippe auf eine Region, um zu antworten';
@override
String studyMapSelected(String label) {
return 'Ausgewählt: $label';
}
@override
String get studyCorrect => 'Richtig';
@override
String studyCorrectLabel(String label) {
return 'Richtig — $label';
}
@override
String studyMapAnswer(String answer) {
return 'Antwort: $answer';
}
@override
String studyMapPickedAnswer(String picked, String answer) {
return 'Du hast $picked gewählt · Antwort: $answer';
}
@override
String get studyRatingBad => 'Schlecht';
@ -1555,7 +1596,129 @@ class AppLocalizationsDe extends AppLocalizations {
String get studyDone => 'Fertig';
@override
String get studyRoundDone => 'Runde abgeschlossen';
String get studySessionComplete => 'Sitzung abgeschlossen';
@override
String studyProgressReviewed(int reviewed, int total) {
return '$reviewed / $total wiederholt';
}
@override
String studyReviewedCount(int reviewed) {
return '$reviewed wiederholt';
}
@override
String get studyStatCards => 'Karten';
@override
String get studyStatAccuracy => 'Genauigkeit';
@override
String get studyStatTime => 'Zeit';
@override
String studyDurationSec(int sec) {
return '$sec Sek.';
}
@override
String studyDurationMin(int min) {
return '$min Min.';
}
@override
String studyDurationMinSec(int min, int sec) {
return '$min Min. $sec Sek.';
}
@override
String get studyLeaveTitle => 'Diese Lernsitzung verlassen?';
@override
String studyLeaveRated(int count) {
String _temp0 = intl.Intl.pluralLogic(
count,
locale: localeName,
other:
'Deine bisherigen Bewertungen sind gespeichert, aber die $count noch verbleibenden Karten in dieser Runde werden verworfen, wenn du jetzt gehst.',
one: 'Deine bisherigen Bewertungen sind gespeichert, aber die letzte Karte in dieser Runde wird verworfen, wenn du jetzt gehst.',
);
return '$_temp0';
}
@override
String studyLeaveUnrated(int count) {
String _temp0 = intl.Intl.pluralLogic(
count,
locale: localeName,
other:
'Du hast noch keine der $count Karten in dieser Runde bewertet — beim Verlassen endet die Sitzung, ohne Fortschritt dafür zu speichern.',
one: 'Du hast diese Karte noch nicht bewertet — beim Verlassen endet die Sitzung, ohne Fortschritt für diese Runde zu speichern.',
);
return '$_temp0';
}
@override
String get studyLeaveConfirm => 'Verlassen';
@override
String get studyKeepStudying => 'Weiter lernen';
@override
String studyInMinutes(int count) {
String _temp0 = intl.Intl.pluralLogic(
count,
locale: localeName,
other: 'in $count Min.',
one: 'in 1 Min.',
);
return '$_temp0';
}
@override
String studyInHours(int count) {
String _temp0 = intl.Intl.pluralLogic(
count,
locale: localeName,
other: 'in $count Stunden',
one: 'in 1 Stunde',
);
return '$_temp0';
}
@override
String studyInDays(int count) {
String _temp0 = intl.Intl.pluralLogic(
count,
locale: localeName,
other: 'in $count Tagen',
one: 'in 1 Tag',
);
return '$_temp0';
}
@override
String studyInMonths(int count) {
String _temp0 = intl.Intl.pluralLogic(
count,
locale: localeName,
other: 'in $count Monaten',
one: 'in 1 Monat',
);
return '$_temp0';
}
@override
String studyInYears(int count) {
String _temp0 = intl.Intl.pluralLogic(
count,
locale: localeName,
other: 'in $count Jahren',
one: 'in 1 Jahr',
);
return '$_temp0';
}
@override
String get studyContinue => 'Weiterlernen';
@ -1564,17 +1727,7 @@ class AppLocalizationsDe extends AppLocalizations {
String get studyPrevious => 'Vorherige Karte';
@override
String get studyNext => 'Nächste Karte';
@override
String get studyReading => 'Lesung';
@override
String get studyMeanings => 'Bedeutungen';
@override
String get studyPlaceItems =>
'Ziehe jedes Element auf seine Kategorie oder tippe auf ein Element und dann auf eine Kategorie.';
String get studySkipCard => 'Karte überspringen';
@override
String studyMinutes(int count) {