import 'package:flutter/material.dart'; import '../data/models.dart'; import '../data/repository.dart'; import '../theme/reclaim_tokens.dart'; import '../widgets/demo_banner.dart'; import '../widgets/heatmap_grid.dart'; import '../widgets/reclaim_card.dart'; import '../widgets/tier_badge.dart'; import 'norm_detail_page.dart'; class HeatmapPage extends StatefulWidget { const HeatmapPage({super.key, required this.repository}); final EvaluationRepository repository; @override State createState() => _HeatmapPageState(); } class _HeatmapPageState extends State { late Future> _future; @override void initState() { super.initState(); _future = widget.repository.list(); } @override Widget build(BuildContext context) { final t = Theme.of(context).textTheme; return Column( children: [ const DemoBanner(), Expanded( child: Padding( padding: const EdgeInsets.all(ReclaimSpace.xl), child: FutureBuilder>( future: _future, builder: (context, snap) { if (!snap.hasData) { return const Center( child: CircularProgressIndicator()); } final items = snap.data!; return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text('Heatmap', style: t.displaySmall), const SizedBox(height: ReclaimSpace.xs), Text( 'X: jährliche Bürokratiekosten (€, log10). ' 'Y: Nutzen-Score 0–5. Punktgröße: Betroffenheit. ' 'Klick auf einen Punkt → Detail mit Pflichten + Quellen.', style: t.bodyLarge?.copyWith( color: ReclaimColors.mute, ), ), const SizedBox(height: ReclaimSpace.lg), Expanded( child: ReclaimCard( accent: true, expand: true, child: HeatmapGrid( evaluations: items, onTap: (e) { Navigator.of(context).push( MaterialPageRoute( builder: (_) => NormDetailPage( repository: widget.repository, evaluation: e, ), ), ); }, ), ), ), const SizedBox(height: ReclaimSpace.lg), Wrap( spacing: ReclaimSpace.md, runSpacing: ReclaimSpace.sm, children: [ for (final e in items) InkWell( onTap: () { Navigator.of(context).push( MaterialPageRoute( builder: (_) => NormDetailPage( repository: widget.repository, evaluation: e, ), ), ); }, child: ReclaimCard( padding: const EdgeInsets.symmetric( horizontal: ReclaimSpace.md, vertical: ReclaimSpace.sm, ), child: Row( mainAxisSize: MainAxisSize.min, children: [ TierBadge( tier: e.tierLowest, compact: true), const SizedBox( width: ReclaimSpace.sm), Text( '${e.norm.jurabk} ${e.norm.paragraph}', style: t.labelLarge, ), ], ), ), ), ], ), ], ); }, ), ), ), ], ); } }