import 'package:flutter/material.dart'; import '../data/repository.dart'; import '../theme/reclaim_tokens.dart'; import '../widgets/delta_mark.dart'; import 'about_page.dart'; import 'heatmap_page.dart'; import 'hub_status_page.dart'; import 'norms_list_page.dart'; /// App shell with a NavigationRail. Each rail destination is one /// page; pages do their own scrolling. class ShellPage extends StatefulWidget { const ShellPage({super.key, required this.repository}); final EvaluationRepository repository; @override State createState() => _ShellPageState(); } class _ShellPageState extends State { int _index = 0; @override Widget build(BuildContext context) { final t = Theme.of(context).textTheme; final pages = [ HeatmapPage(repository: widget.repository), NormsListPage(repository: widget.repository), HubStatusPage(repository: widget.repository), const AboutPage(), ]; return Scaffold( body: Row( children: [ NavigationRail( backgroundColor: Theme.of(context).colorScheme.surface, extended: MediaQuery.of(context).size.width > 1100, selectedIndex: _index, onDestinationSelected: (i) => setState(() => _index = i), leading: Padding( padding: const EdgeInsets.symmetric( vertical: ReclaimSpace.lg, horizontal: ReclaimSpace.md, ), child: Column( children: [ const DeltaMark(size: 36), const SizedBox(height: ReclaimSpace.sm), Text( 'F∆I', style: t.labelLarge?.copyWith( letterSpacing: 2, color: ReclaimColors.signal, ), ), ], ), ), destinations: const [ NavigationRailDestination( icon: Icon(Icons.grid_view_outlined), selectedIcon: Icon(Icons.grid_view), label: Text('Heatmap'), ), NavigationRailDestination( icon: Icon(Icons.list_alt_outlined), selectedIcon: Icon(Icons.list_alt), label: Text('Normen'), ), NavigationRailDestination( icon: Icon(Icons.hub_outlined), selectedIcon: Icon(Icons.hub), label: Text('Hub'), ), NavigationRailDestination( icon: Icon(Icons.info_outline), selectedIcon: Icon(Icons.info), label: Text('Methodik'), ), ], ), const VerticalDivider(width: 1), Expanded(child: pages[_index]), ], ), ); } }