feat(studyset): the screens behind a studyset are its path

Deeper studysets, on iOS and Android alike (decided 2026-10-11, after
Material 3's and Apple's guidelines, Android's principles of navigation and
Nielsen Norman Group's on breadcrumbs):

- The screens behind a studyset are its path: below "Japanese › Grammar ›
  Tae Kim's Grammar Guide" lie Grammar's screen, then Japanese's, then the
  library. A topic at any depth opens with the levels between pushed
  beneath it; the path's steps go up by popping to that level's page (they
  replaced the location before, so back could skip levels); a studyset
  opened from elsewhere gets its levels beneath it. Back, Android's
  predictive back, iOS's swipe from the edge and the path all lead one
  level up.
- The path's steps are targets 48 dp high; a long press on back lists the
  levels above, the nearest first and the library last, as iOS's back
  buttons do.
- Below expanded windows the topics open in a sheet from "3 topics ▾" at
  the end of the path's line, where Vaia puts "All topics"; no drawer,
  whose swipe from the edge is iOS's way back and which Material 3
  Expressive deprecates. Topics with topics of their own unfold them, at
  any depth, in the sheet and the side column alike.
- The navigation bar steps aside inside a studyset (its screen, notes,
  paths and dictionary): Material 3 puts it on the top-level screens and
  toolbars below, never both. Apple's guidelines keep the tab bar, lest
  people forget where they are; the path, starting at Library, says where.
  A strip as high as the system's bar keeps those screens clear of it.
- The bar at the bottom keeps Add material and Study.

A trial for review, on its own branch, on top of the floating navigation
bar.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MMm7usAo6q9ZZRoPkWjoxi
Signed-off-by: Tizian 「ティツィアーン」 <raisondetredev@pm.me>
This commit is contained in:
Tizian 「ティツィアーン」 2026-10-11 13:03:27 +02:00
commit f9c1f2ae97
Signed by: raisondetredev
GPG key ID: 07F6FCF405488B64

View file

@ -50,6 +50,9 @@ GoRouter buildRouter({String initialLocation = RoutePaths.home}) => GoRouter(
StatefulShellRoute(
builder: (context, state, navigationShell) => AppShell(
navigationShell: navigationShell,
// Inside a studyset, its own bar at the bottom takes the
// navigation bar's place.
hidesNavigationBar: RoutePaths.isInsideStudyset(state.uri.path),
// The inbox's threads with something new.
profileBadge: (context) =>
context.select<InboxCountBloc?, int>((bloc) => bloc?.state ?? 0),
@ -76,11 +79,13 @@ GoRouter buildRouter({String initialLocation = RoutePaths.home}) => GoRouter(
GoRoute(
path: 'studysets/:id',
// Keyed by the id: several studysets' screens can be on
// the stack at once, and must not share one page.
// the stack at once, and must not share one page. Named by
// its location, so the way up finds it among them.
pageBuilder: (context, state) {
final id = state.pathParameters['id']!;
return MaterialPage<void>(
key: ValueKey('studyset-$id'),
name: RoutePaths.studyset(id),
child: _studysetScreen(context, id),
);
},