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

@ -1516,6 +1516,47 @@ class AppLocalizationsEn extends AppLocalizations {
@override
String get studyCheck => 'Check';
@override
String get studySelectAll => 'Select all that apply';
@override
String get studySelectOne => 'Select the correct answer';
@override
String get studyMatchingInstructions => 'DRAG AND DROP ONTO CARDS ABOVE';
@override
String get studyMatchingAllPlaced => 'All placed';
@override
String get studyMatchingDropHere => 'Drop here';
@override
String get studyMapTapPrompt => 'Tap a region to answer';
@override
String studyMapSelected(String label) {
return 'Selected: $label';
}
@override
String get studyCorrect => 'Correct';
@override
String studyCorrectLabel(String label) {
return 'Correct — $label';
}
@override
String studyMapAnswer(String answer) {
return 'Answer: $answer';
}
@override
String studyMapPickedAnswer(String picked, String answer) {
return 'You picked $picked · Answer: $answer';
}
@override
String get studyRatingBad => 'Bad';
@ -1543,7 +1584,129 @@ class AppLocalizationsEn extends AppLocalizations {
String get studyDone => 'Done';
@override
String get studyRoundDone => 'Round complete';
String get studySessionComplete => 'Session complete';
@override
String studyProgressReviewed(int reviewed, int total) {
return '$reviewed / $total reviewed';
}
@override
String studyReviewedCount(int reviewed) {
return '$reviewed reviewed';
}
@override
String get studyStatCards => 'Cards';
@override
String get studyStatAccuracy => 'Accuracy';
@override
String get studyStatTime => 'Time';
@override
String studyDurationSec(int sec) {
return '$sec sec';
}
@override
String studyDurationMin(int min) {
return '$min min';
}
@override
String studyDurationMinSec(int min, int sec) {
return '$min min $sec sec';
}
@override
String get studyLeaveTitle => 'Leave this study session?';
@override
String studyLeaveRated(int count) {
String _temp0 = intl.Intl.pluralLogic(
count,
locale: localeName,
other:
'Your ratings so far are saved, but the $count cards still left in this round will be discarded if you leave now.',
one: 'Your ratings so far are saved, but the last card in this round will be discarded if you leave now.',
);
return '$_temp0';
}
@override
String studyLeaveUnrated(int count) {
String _temp0 = intl.Intl.pluralLogic(
count,
locale: localeName,
other:
'You haven’t rated any of the $count cards in this round yet — leaving ends the session without recording any progress for it.',
one: 'You haven’t rated this card yet — leaving ends the session without recording any progress for this round.',
);
return '$_temp0';
}
@override
String get studyLeaveConfirm => 'Leave';
@override
String get studyKeepStudying => 'Keep studying';
@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 hours',
one: 'in 1 hour',
);
return '$_temp0';
}
@override
String studyInDays(int count) {
String _temp0 = intl.Intl.pluralLogic(
count,
locale: localeName,
other: 'in $count days',
one: 'in 1 day',
);
return '$_temp0';
}
@override
String studyInMonths(int count) {
String _temp0 = intl.Intl.pluralLogic(
count,
locale: localeName,
other: 'in $count months',
one: 'in 1 month',
);
return '$_temp0';
}
@override
String studyInYears(int count) {
String _temp0 = intl.Intl.pluralLogic(
count,
locale: localeName,
other: 'in $count years',
one: 'in 1 year',
);
return '$_temp0';
}
@override
String get studyContinue => 'Continue learning';
@ -1552,17 +1715,7 @@ class AppLocalizationsEn extends AppLocalizations {
String get studyPrevious => 'Previous card';
@override
String get studyNext => 'Next card';
@override
String get studyReading => 'Reading';
@override
String get studyMeanings => 'Meanings';
@override
String get studyPlaceItems =>
'Drag each item onto its category, or tap an item and then a category.';
String get studySkipCard => 'Skip card';
@override
String studyMinutes(int count) {