import 'package:flutter/material.dart'; import '../data/repository.dart'; import '../theme/reclaim_theme.dart'; import '../theme/reclaim_tokens.dart'; import '../widgets/brand_wordmark.dart'; import '../widgets/delta_mark.dart'; import 'shell_page.dart'; /// First-run landing: brand mark, one-line claim, "enter app" CTA. /// Mock-mode bypasses Hub connect; the live wire lands in week 1. class LandingPage extends StatelessWidget { const LandingPage({super.key, required this.repository}); final EvaluationRepository repository; @override Widget build(BuildContext context) { final t = Theme.of(context).textTheme; return Scaffold( body: SafeArea( child: Center( child: ConstrainedBox( constraints: const BoxConstraints(maxWidth: 820), child: Padding( padding: const EdgeInsets.symmetric( horizontal: ReclaimSpace.xxl, vertical: ReclaimSpace.xxxl, ), child: Column( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.start, children: [ const Row( crossAxisAlignment: CrossAxisAlignment.center, children: [ DeltaMark(size: 96), SizedBox(width: ReclaimSpace.xl), BrandWordmark( size: 56, letterSpacing: -1.0, ), ], ), const SizedBox(height: ReclaimSpace.xl), const SizedBox(height: ReclaimSpace.sm), Text( 'Pflicht-basierte Wirkungsanalyse von Rechtsnormen — ' 'auf Ch∆In, mit Quellen-Audit by construction.', style: t.bodyLarge ?.copyWith(color: ReclaimColors.mute), ), const SizedBox(height: ReclaimSpace.xxl), Wrap( crossAxisAlignment: WrapCrossAlignment.center, spacing: ReclaimSpace.md, runSpacing: ReclaimSpace.sm, children: [ FilledButton.icon( onPressed: () { Navigator.of(context).pushReplacement( MaterialPageRoute( builder: (_) => ShellPage(repository: repository), ), ); }, icon: const Icon(Icons.east), label: const Text('App öffnen (Demo-Modus)'), ), Text( 'Demo: 5 Pilot-Normen, ohne Hub-Verbindung', style: t.labelSmall?.copyWith( color: ReclaimColors.mute, ), ), ], ), const SizedBox(height: ReclaimSpace.xl), Text( 'v0.1.0 · Phase 0 · Mock-Modus · ' 'Live-Hub-Anbindung folgt in Woche 1', style: ReclaimTheme.mono( t.labelSmall ?? const TextStyle(), ).copyWith(color: ReclaimColors.mute), ), ], ), ), ), ), ), ); } }