feat(app): the home dashboard: streak, goal, week, activity

Home opens on a study dashboard. The streak's flame sits in the app bar
and opens a sheet of how it stands this week. Below: the study goal (a
ring of the day's or week's progress, set and removed in its sheet), the
week (each day studied, rested, missed or to come with the cards falling
due; days to go back and on; today or a day to come made a rest day),
and a year of activity as a heatmap, its weekdays staying in view while
the weeks scroll. A long press arranges the dashboard: drag a widget
elsewhere, hide or show it; the arrangement is synced.

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-01 22:13:34 +02:00
commit 111532435f
Signed by: raisondetredev
GPG key ID: 07F6FCF405488B64
2 changed files with 1747 additions and 63 deletions

View file

@ -1,6 +1,7 @@
import 'package:flutter_test/flutter_test.dart';
import 'package:halkyon_learn_flutter/src/core/content/rich_content.dart';
import 'package:halkyon_learn_flutter/src/feature/auth/model/github_link_outcome.dart';
import 'package:halkyon_learn_flutter/src/feature/home/widget/home_screen.dart';
import 'package:halkyon_learn_flutter/src/feature/studyset/data/studyset_payload.dart';
import 'package:halkyon_learn_flutter/src/feature/studyset/model/studyset_content.dart';
@ -185,9 +186,6 @@ void main() {
expect(auth.gitHubSwitches, 1);
expect(find.text('Switch to your GitHub account?'), findsNothing);
expect(
find.text('Your studysets and cards are in your library.'),
findsOneWidget,
);
expect(find.byType(HomeScreen), findsOneWidget);
});
}

View file

@ -1,5 +1,6 @@
import 'package:flutter_test/flutter_test.dart';
import 'package:halkyon_learn_flutter/src/feature/auth/model/auth_status.dart';
import 'package:halkyon_learn_flutter/src/feature/home/widget/home_screen.dart';
import '../../../support/fake_auth_gateway.dart';
import '../../../support/pump_app.dart';
@ -10,8 +11,8 @@ void main() {
setUp(() => gateway = FakeAuthGateway());
/// What the home tab says.
final home = find.text('Your studysets and cards are in your library.');
/// The home tab.
final home = find.byType(HomeScreen);
Future<void> showApp(WidgetTester tester) =>
pumpApp(tester, testDependencies(authGateway: gateway));