import 'package:flutter/material.dart'; import 'package:url_launcher/url_launcher.dart'; import '../theme/reclaim_tokens.dart'; import '../widgets/reclaim_card.dart'; /// Combined legal-information page. Six sections in the order /// a careful reader cares about them. The legal-entity data /// (Anbieter, Anschrift, USt-IdNr., Hosting-Provider, …) mirrors /// the upstream fai_web (`flemming.ai`) authoritative version /// to keep the public-facing F∆I posture consistent across /// surfaces. class LegalPage extends StatelessWidget { const LegalPage({super.key}); static const _email = 'contact@flemming.ai'; static const _phone = '+49 30 66302929'; static const _stand = 'Stand: Juni 2026'; @override Widget build(BuildContext context) { final t = Theme.of(context).textTheme; return SingleChildScrollView( padding: const EdgeInsets.all(ReclaimSpace.xl), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text('Recht & Hinweise', style: t.displaySmall), const SizedBox(height: ReclaimSpace.xs), Text( 'Disclaimer, AI-Act-Transparenz, Urheberrecht, ' 'Datenschutz, Impressum, Lizenz.', style: t.bodyLarge?.copyWith(color: ReclaimColors.mute), ), const SizedBox(height: ReclaimSpace.lg), // 1. Disclaimer ReclaimCard( accent: true, child: _Section( title: '1. Disclaimer — keine Rechtsberatung', children: [ _p(t, 'Recl∆Im liefert eine methodisch-strukturierte ' 'Wirkungsanalyse von Rechtsnormen. Die Ergebnisse sind ' 'KEINE Rechtsberatung im Sinne des ' 'Rechtsdienstleistungsgesetzes (RDG) und ersetzen weder ' 'eine individuelle juristische Prüfung noch eine ' 'Auskunft der zuständigen Behörden oder Kammern.'), _p(t, 'Alle Bewertungs-Zahlen tragen eine Evidenz-Tier-Stufe ' '(T1–T4). Stufen T3/T4 sind nicht peer-reviewed und ' 'dienen ausschließlich als Hinweis-/Anregungs-Wert. ' 'Eine Reform- oder Streichungs-Empfehlung der ' 'Anwendung ist ein methodischer Vorschlag, keine ' 'politische Forderung.'), _p(t, 'Die Demo-Daten (fünf Pilot-Normen) sind ' 'Plausibilitäts-Schätzungen ohne NKR-Validierung. ' 'Bevor eine Zahl in eine politische Vorlage übernommen ' 'wird, ist die zugrundeliegende Quelle einzeln zu ' 'prüfen.'), ], ), ), const SizedBox(height: ReclaimSpace.lg), // 2. AI Act ReclaimCard( child: _Section( title: '2. EU AI Act — Transparenz nach Art. 50', children: [ _p(t, 'Recl∆Im setzt Künstliche-Intelligenz-Komponenten ein: ' 'Large-Language-Modelle (LLM) zur Vorschlags-Extraktion ' 'aus Norm-Texten und zur Synthese von Reform-Texten. ' 'Jede LLM-erzeugte Aussage ist kennzeichnungspflichtig ' 'und mit RAG-Quellen-Pflicht hinterlegt; Aussagen ohne ' 'zitierfähige Quelle werden verworfen.'), _p(t, 'Recl∆Im ist KEIN Hochrisiko-KI-System nach Anhang III ' 'der KI-Verordnung. Die Anwendung trifft keine ' 'Verwaltungsentscheidungen, generiert keine Rechtsakte, ' 'beeinflusst nicht direkt Beschäftigungs-, Bildungs- ' 'oder Sozialleistungs-Verfahren. Sie dient ausschließlich ' 'der Recherche, Visualisierung und Vorschlags-Generierung ' 'für menschliche Entscheidungsträger.'), _p(t, 'Jede Bewertung durchläuft vor Veröffentlichung einen ' '`system.approval@^0`-Schritt (Human-in-the-Loop). ' 'Die menschliche Letztverantwortung ist nicht ' 'überschreibbar.'), _p(t, 'Verwendete Modelle und ihre Digests werden im ' 'tamper-evidenten Audit-Log des Ch∆In-Hubs gespeichert. ' 'Reproduzierbarkeit erfolgt mit Temperature ≤ 0,1 und ' 'festem Prompt-Hash.'), ], ), ), const SizedBox(height: ReclaimSpace.lg), // 3. Quellen + UrhG ReclaimCard( child: _Section( title: '3. Quellen & Urheberrecht (§ 5 UrhG)', children: [ _p(t, 'Die in der Anwendung dargestellten Gesetzes- und ' 'Verordnungs-Texte sind amtliche Werke im Sinne des ' '§ 5 UrhG und damit gemeinfrei. Die kanonischen Quellen ' 'sind verlinkt und durch SHA-256-Prüfsummen im ' 'Audit-Log nachvollziehbar.'), _p(t, 'Primärquellen (T1):'), _bullet(t, 'Bundesrecht: gesetze-im-internet.de (BMJ) — § 5 UrhG.'), _bullet(t, 'EU-Recht: EUR-Lex (Europäische Kommission) — ' 'Mehrsprachigkeit nach Verordnung (EU) Nr. 1257/2012.'), _bullet(t, 'Landesrecht Berlin: gesetze.berlin.de / ' 'landesrecht-berlin.de — § 5 UrhG.'), _p(t, 'Sekundärquellen (T1/T2):'), _bullet(t, 'Nationaler Normenkontrollrat (NKR) — ' 'Bürokratiekosten-Datenbank, Methodenleitfaden.'), _bullet(t, 'Statistisches Bundesamt (DESTATIS) — ' 'Unternehmensregister, Bürokratiekostenindex.'), _bullet(t, 'DIHK, ZDH, IHK Berlin, BDI — ' 'Verbands-Erhebungen mit Quellen-Angabe.'), _p(t, 'Eigene Methodik und Software-Code sind unter ' 'Apache License 2.0 veröffentlicht; ' 'Code-Repository: git.flemming.ai/fai/reclaim.'), ], ), ), const SizedBox(height: ReclaimSpace.lg), // 4. Datenschutz ReclaimCard( child: _Section( title: '4. Datenschutzerklärung (DSGVO Art. 13)', children: [ _h(t, 'Verantwortlicher'), _p(t, 'Verantwortlich für die Datenverarbeitung in dieser ' 'Anwendung ist Dr. Stefan Flemming ' '(Flemming.IT — Beratung und Entwicklung), ' 'Dardanellenweg 41, 12109 Berlin, Deutschland. ' 'Kontakt: $_email'), _h(t, 'Hosting & Server-Logs'), _p(t, 'Wird die Anwendung als Webseite bereitgestellt, läuft ' 'sie auf Servern der Hetzner Online GmbH, ' 'Industriestr. 25, 91710 Gunzenhausen, Deutschland. ' 'Beim Aufruf werden technisch notwendige Zugriffsdaten ' '(IP-Adresse, Datum/Uhrzeit, abgerufene Ressource, ' 'Referrer, User-Agent) in Server-Logfiles verarbeitet. ' 'Rechtsgrundlage ist Art. 6 Abs. 1 lit. f DSGVO ' '(berechtigtes Interesse an Betrieb und Sicherheit). ' 'Mit Hetzner besteht ein Vertrag zur Auftragsverarbeitung ' 'gemäß Art. 28 DSGVO; Server-Logfiles werden nach ' 'spätestens 14 Tagen gelöscht.'), _p(t, 'Im Desktop-/Mock-Modus werden keine personenbezogenen ' 'Daten erhoben; alle Daten verbleiben lokal auf dem ' 'Endgerät.'), _h(t, 'Cookies & Tracking'), _p(t, 'Die Anwendung setzt keine Tracking- oder ' 'Marketing-Cookies und bindet keine externen ' 'Analysedienste ein. Eine Cookie-Einwilligung ist daher ' 'nicht erforderlich.'), _h(t, 'Kontaktaufnahme'), _p(t, 'Wenn Sie uns per E-Mail kontaktieren, verarbeiten wir ' 'die übermittelten Daten zur Bearbeitung Ihrer Anfrage ' '(Art. 6 Abs. 1 lit. b bzw. f DSGVO). Die Daten werden ' 'gelöscht, sobald sie für den Zweck nicht mehr ' 'erforderlich sind.'), _h(t, 'Ihre Rechte'), _p(t, 'Sie haben das Recht auf Auskunft, Berichtigung, ' 'Löschung, Einschränkung der Verarbeitung, ' 'Datenübertragbarkeit und Widerspruch ' '(Art. 15–21 DSGVO) sowie das Recht auf Beschwerde ' 'bei einer Aufsichtsbehörde, etwa der Berliner ' 'Beauftragten für Datenschutz und Informationsfreiheit, ' 'Friedrichstr. 219, 10969 Berlin.'), _p(t, _stand), ], ), ), const SizedBox(height: ReclaimSpace.lg), // 5. Impressum ReclaimCard( child: _Section( title: '5. Impressum', children: [ _h(t, 'Angaben gemäß § 5 DDG'), _p(t, 'Dr. Stefan Flemming\n' 'Flemming.IT — Beratung und Entwicklung, freiberuflich ' '(www.flemming.it)\n' 'Dardanellenweg 41\n' '12109 Berlin\n' 'Deutschland'), _h(t, 'Kontakt'), _p(t, 'E-Mail: $_email\nTelefon: $_phone'), _h(t, 'Umsatzsteuer-ID'), _p(t, 'Umsatzsteuer-Identifikationsnummer gemäß § 27a UStG: ' 'DE269393425'), _h(t, 'Verantwortlich i.S.d. § 18 Abs. 2 MStV'), _p(t, 'Dr. Stefan Flemming, Anschrift wie oben.'), _h(t, 'Haftung für Inhalte'), _p(t, 'Als Diensteanbieter sind wir gemäß § 7 Abs. 1 DDG für ' 'eigene Inhalte auf diesen Seiten nach den allgemeinen ' 'Gesetzen verantwortlich. Nach §§ 8 bis 10 DDG sind wir ' 'als Diensteanbieter jedoch nicht verpflichtet, ' 'übermittelte oder gespeicherte fremde Informationen ' 'zu überwachen oder nach Umständen zu forschen, die ' 'auf eine rechtswidrige Tätigkeit hinweisen.'), _h(t, 'Haftung für Links'), _p(t, 'Unser Angebot enthält ggf. Links zu externen Websites ' 'Dritter, auf deren Inhalte wir keinen Einfluss haben. ' 'Deshalb können wir für diese fremden Inhalte auch ' 'keine Gewähr übernehmen. Für die Inhalte der ' 'verlinkten Seiten ist stets der jeweilige Anbieter ' 'oder Betreiber verantwortlich.'), _h(t, 'Urheberrecht'), _p(t, 'Die durch die Seitenbetreiber erstellten Inhalte und ' 'Werke auf diesen Seiten unterliegen dem deutschen ' 'Urheberrecht. Beiträge Dritter sind als solche ' 'gekennzeichnet. Davon unberührt bleibt § 5 UrhG für ' 'die wiedergegebenen amtlichen Werke (vgl. Abschnitt 3).'), _p(t, 'Plattform der Europäischen Kommission zur ' 'außergerichtlichen Online-Streitbeilegung (Art. 14 ' 'Abs. 1 ODR-VO): ec.europa.eu/consumers/odr. Wir sind ' 'nicht bereit oder verpflichtet, an ' 'Streitbeilegungsverfahren vor einer ' 'Verbraucherschlichtungsstelle teilzunehmen.'), _p(t, _stand), ], ), ), const SizedBox(height: ReclaimSpace.lg), // 6. Open Source ReclaimCard( child: _Section( title: '6. Open Source & Lizenz', children: [ _p(t, 'Recl∆Im ist freie Software, lizenziert unter der ' 'Apache License, Version 2.0. Der Quelltext, die ' 'Module und die Methodik sind öffentlich einsehbar ' 'unter:'), InkWell( onTap: () => launchUrl( Uri.parse('https://git.flemming.ai/fai/reclaim'), mode: LaunchMode.externalApplication, ), child: Text( 'https://git.flemming.ai/fai/reclaim', style: t.bodyLarge?.copyWith( color: ReclaimColors.signal, decoration: TextDecoration.underline, fontFamily: ReclaimTypography.mono, ), ), ), const SizedBox(height: ReclaimSpace.sm), _p(t, 'Plattform: Ch∆In (Apache 2.0). Methodische Vorbilder ' 'und Lizenz-Hinweise stehen in der Datei NOTICE im ' 'Repository.'), _p(t, 'Beiträge willkommen. DCO Sign-off und Conventional ' 'Commits in Englisch sind Konvention.'), ], ), ), ], ), ); } } class _Section extends StatelessWidget { const _Section({required this.title, required this.children}); final String title; final List children; @override Widget build(BuildContext context) { final t = Theme.of(context).textTheme; return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Text(title, style: t.headlineSmall), const SizedBox(height: ReclaimSpace.md), ...children, ], ); } } Widget _h(TextTheme t, String s) => Padding( padding: const EdgeInsets.only( top: ReclaimSpace.sm, bottom: 4, ), child: Text(s, style: t.titleMedium?.copyWith(color: ReclaimColors.signal)), ); Widget _p(TextTheme t, String s) => Padding( padding: const EdgeInsets.only(bottom: ReclaimSpace.sm), child: SelectableText(s, style: t.bodyLarge?.copyWith(height: 1.55)), ); Widget _bullet(TextTheme t, String s) => Padding( padding: const EdgeInsets.only( left: ReclaimSpace.lg, bottom: ReclaimSpace.xs, ), child: Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ Padding( padding: const EdgeInsets.only(top: 8, right: 10), child: Container( width: 5, height: 5, decoration: const BoxDecoration( color: ReclaimColors.signal, shape: BoxShape.circle, ), ), ), Expanded( child: SelectableText(s, style: t.bodyLarge?.copyWith(height: 1.55)), ), ], ), );