'use client' /** * RAG & Legal Corpus Management * * Verwaltet das Legal Corpus RAG System fuer Compliance. * Zeigt Status aller 19 Regulierungen, Chunks und ermoeglicht Suche. */ import React, { useState, useEffect, useCallback } from 'react' import Link from 'next/link' import { PagePurpose } from '@/components/common/PagePurpose' // API uses local proxy route to klausur-service const API_PROXY = '/api/legal-corpus' // Types interface RegulationStatus { code: string name: string fullName: string type: string chunkCount: number expectedRequirements: number sourceUrl: string status: 'ready' | 'empty' | 'error' } interface CollectionStatus { collection: string totalPoints: number vectorSize: number status: string regulations: Record } interface SearchResult { text: string regulation_code: string regulation_name: string article: string | null paragraph: string | null source_url: string score: number } // Tab definitions type TabId = 'overview' | 'regulations' | 'map' | 'search' | 'data' | 'ingestion' | 'pipeline' // Custom document type interface CustomDocument { id: string code: string title: string filename?: string url?: string document_type: string uploaded_at: string status: 'uploaded' | 'queued' | 'fetching' | 'processing' | 'indexed' | 'error' chunk_count: number error?: string } // Pipeline types interface Validation { name: string status: 'passed' | 'warning' | 'failed' | 'not_run' expected: any actual: any message: string } interface PipelineCheckpoint { phase: string name: string status: 'pending' | 'running' | 'completed' | 'failed' | 'skipped' started_at: string | null completed_at: string | null duration_seconds: number | null metrics: Record validations: Validation[] error: string | null } interface PipelineState { status: string pipeline_id: string | null started_at: string | null completed_at: string | null current_phase: string | null checkpoints: PipelineCheckpoint[] summary: Record validation_summary?: { passed: number warning: number failed: number total: number } } // All regulations with descriptions const REGULATIONS = [ { code: 'GDPR', name: 'DSGVO', fullName: 'Datenschutz-Grundverordnung (GDPR)', type: 'eu_regulation', expected: 99, description: 'Die DSGVO ist das zentrale Datenschutzgesetz der EU. Sie regelt die Verarbeitung personenbezogener Daten und gibt Betroffenen umfangreiche Rechte (Auskunft, Loeschung, Datenportabilitaet). Gilt fuer alle Unternehmen, die Daten von EU-Buergern verarbeiten.', relevantFor: ['Alle Unternehmen mit EU-Kunden', 'Datenverarbeiter', 'Auftragsverarbeiter'], keyTopics: ['Einwilligung', 'Betroffenenrechte', 'Datenschutz-Folgenabschaetzung', 'Auftragsverarbeitung', 'Bussgelder bis 4% Umsatz'], effectiveDate: '25. Mai 2018' }, { code: 'EPRIVACY', name: 'ePrivacy-Richtlinie', fullName: 'Richtlinie 2002/58/EG (ePrivacy)', type: 'eu_directive', expected: 25, description: 'Ergaenzt die DSGVO speziell fuer elektronische Kommunikation. Regelt Cookies, Tracking, Direktmarketing und Vertraulichkeit der Kommunikation. Wird durch nationale Gesetze wie das TDDDG umgesetzt.', relevantFor: ['Website-Betreiber', 'App-Entwickler', 'Marketing-Abteilungen', 'Telekommunikationsanbieter'], keyTopics: ['Cookie-Consent', 'Tracking', 'E-Mail-Marketing', 'Vertraulichkeit'], effectiveDate: '31. Juli 2002' }, { code: 'TDDDG', name: 'TDDDG', fullName: 'Telekommunikation-Digitale-Dienste-Datenschutz-Gesetz', type: 'de_law', expected: 30, description: 'Deutsches Umsetzungsgesetz der ePrivacy-Richtlinie. Regelt den Datenschutz bei Telemedien und Telekommunikation. Enthaelt die strengen deutschen Cookie-Consent-Anforderungen.', relevantFor: ['Deutsche Unternehmen', 'Website-Betreiber mit deutschen Nutzern', 'App-Anbieter'], keyTopics: ['Cookie-Banner', 'Einwilligung fuer Endgeraetezugriff', 'Tracking-Consent', 'Bestandsdaten'], effectiveDate: '1. Dezember 2021' }, { code: 'SCC', name: 'Standardvertragsklauseln', fullName: 'EU-Standardvertragsklauseln (2021/914/EU)', type: 'eu_regulation', expected: 18, description: 'Vorgefertigte Vertragsklauseln fuer den internationalen Datentransfer. Erforderlich, wenn personenbezogene Daten in Drittlaender ohne Angemessenheitsbeschluss uebermittelt werden (z.B. USA vor DPF).', relevantFor: ['Unternehmen mit Drittland-Transfers', 'Cloud-Nutzer', 'Internationale Konzerne'], keyTopics: ['Drittlandtransfer', 'Controller-to-Controller', 'Controller-to-Processor', 'TIA (Transfer Impact Assessment)'], effectiveDate: '27. Juni 2021' }, { code: 'DPF', name: 'EU-US Data Privacy Framework', fullName: 'EU-US Data Privacy Framework', type: 'eu_regulation', expected: 12, description: 'Angemessenheitsbeschluss fuer Datentransfers in die USA. Nachfolger des gekippten Privacy Shield. Ermoeglicht Datenuebermittlungen an zertifizierte US-Unternehmen ohne zusaetzliche Garantien.', relevantFor: ['Unternehmen mit US-Dienstleistern', 'Cloud-Nutzer (AWS, Google, Microsoft)', 'SaaS-Anwender'], keyTopics: ['US-Datentransfer', 'Zertifizierung', 'Redress-Mechanismus', 'Privacy Shield Nachfolger'], effectiveDate: '10. Juli 2023' }, { code: 'AIACT', name: 'EU AI Act', fullName: 'Verordnung (EU) 2024/1689 - KI-Verordnung', type: 'eu_regulation', expected: 85, description: 'Weltweit erste umfassende KI-Regulierung. Klassifiziert KI-Systeme nach Risiko (verboten, hoch, begrenzt, minimal) und stellt entsprechende Anforderungen. Hochrisiko-KI benoetigt CE-Kennzeichnung.', relevantFor: ['KI-Entwickler', 'KI-Anwender', 'Hersteller von KI-Produkten', 'Importeure'], keyTopics: ['Risikoklassifizierung', 'Hochrisiko-KI', 'Verbotene KI', 'Transparenzpflichten', 'CE-Kennzeichnung'], effectiveDate: '1. August 2024 (gestaffelt bis 2027)' }, { code: 'CRA', name: 'Cyber Resilience Act', fullName: 'Verordnung (EU) 2024/2847 - Cyber Resilience Act', type: 'eu_regulation', expected: 45, description: 'Cybersicherheitsanforderungen fuer Produkte mit digitalen Elementen. Verpflichtet Hersteller zu Security-by-Design, Schwachstellenmanagement und Security-Updates ueber den Lebenszyklus.', relevantFor: ['IoT-Hersteller', 'Software-Entwickler', 'Hardware-Hersteller', 'Importeure'], keyTopics: ['Security by Design', 'Schwachstellenmanagement', 'SBOM', 'CE-Kennzeichnung', 'Security Updates'], effectiveDate: '2024 (Uebergangsfristen bis 2027)' }, { code: 'NIS2', name: 'NIS2-Richtlinie', fullName: 'Richtlinie (EU) 2022/2555 - Network and Information Security', type: 'eu_directive', expected: 46, description: 'Cybersicherheitsrichtlinie fuer kritische und wichtige Einrichtungen. Erweitert NIS1 erheblich auf mehr Sektoren. Fordert Risikomanagement, Incident Reporting und Lieferkettensicherheit.', relevantFor: ['Kritische Infrastrukturen (KRITIS)', 'Gesundheitswesen', 'Energie', 'Transport', 'Digitale Dienste', 'Oeffentliche Verwaltung'], keyTopics: ['Cybersicherheits-Risikomanagement', 'Incident Reporting (24h)', 'Lieferkettensicherheit', 'Geschaeftsfuehrer-Haftung'], effectiveDate: '17. Oktober 2024 (nationale Umsetzung)' }, { code: 'EUCSA', name: 'EU Cybersecurity Act', fullName: 'Verordnung (EU) 2019/881 - EU Cybersecurity Act', type: 'eu_regulation', expected: 35, description: 'Schafft den EU-Rahmen fuer Cybersicherheitszertifizierung und staerkt die ENISA. Ermoeglicht EU-weite Zertifizierungsschemata fuer IT-Produkte, -Dienste und -Prozesse.', relevantFor: ['IT-Produkthersteller', 'Cloud-Anbieter', 'Zertifizierungsstellen', 'Oeffentliche Auftraggeber'], keyTopics: ['Cybersicherheitszertifizierung', 'ENISA', 'Vertrauensstufen (basic/substantial/high)', 'EUCC Schema'], effectiveDate: '27. Juni 2019' }, { code: 'DATAACT', name: 'Data Act', fullName: 'Verordnung (EU) 2023/2854 - Data Act', type: 'eu_regulation', expected: 42, description: 'Regelt den Zugang zu und die Nutzung von Daten. Gibt Nutzern Rechte an Daten, die durch vernetzte Produkte erzeugt werden. Ermoeglicht Datenweitergabe und Cloud-Wechsel.', relevantFor: ['IoT-Hersteller', 'Cloud-Anbieter', 'Dateninhaber', 'Datennutzer', 'Oeffentliche Stellen'], keyTopics: ['Datenzugang', 'Datenportabilitaet', 'Cloud-Switching', 'B2B-Datenteilung', 'IoT-Daten'], effectiveDate: '12. September 2025' }, { code: 'DGA', name: 'Data Governance Act', fullName: 'Verordnung (EU) 2022/868 - Data Governance Act', type: 'eu_regulation', expected: 35, description: 'Schafft Rahmenbedingungen fuer Datenmaerkte und Datenaltruismus. Regelt Datenvermittlungsdienste und die Weiterverwendung geschuetzter oeffentlicher Daten.', relevantFor: ['Datenvermittler', 'Oeffentliche Stellen', 'Forschungseinrichtungen', 'Datenaltruismus-Organisationen'], keyTopics: ['Datenvermittlung', 'Datenaltruismus', 'Oeffentliche Daten', 'Datentreuhaender'], effectiveDate: '24. September 2023' }, { code: 'DSA', name: 'Digital Services Act', fullName: 'Verordnung (EU) 2022/2065 - Digital Services Act', type: 'eu_regulation', expected: 93, description: 'Reguliert digitale Dienste und Plattformen. Schafft Pflichten fuer Online-Vermittler, Hosting-Dienste und Plattformen. Sehr grosse Plattformen (VLOPs) haben erweiterte Pflichten.', relevantFor: ['Online-Plattformen', 'Marktplaetze', 'Social Media', 'Hosting-Anbieter', 'Suchmaschinen'], keyTopics: ['Notice-and-Action', 'Transparenz', 'Illegale Inhalte', 'VLOP-Pflichten', 'Algorithmen-Transparenz'], effectiveDate: '17. Februar 2024' }, { code: 'EAA', name: 'European Accessibility Act', fullName: 'Richtlinie (EU) 2019/882 - Barrierefreiheitsanforderungen', type: 'eu_directive', expected: 25, description: 'Barrierefreiheitsanforderungen fuer Produkte und Dienstleistungen. Betrifft Computer, Smartphones, Bankdienstleistungen, E-Commerce, E-Books und mehr.', relevantFor: ['E-Commerce', 'Banken', 'Telekommunikation', 'Verkehrsdienste', 'Medienanbieter'], keyTopics: ['Barrierefreiheit', 'WCAG', 'Assistive Technologien', 'Ausnahmen fuer KMU'], effectiveDate: '28. Juni 2025' }, { code: 'DSM', name: 'DSM-Urheberrechtsrichtlinie', fullName: 'Richtlinie (EU) 2019/790 - Digital Single Market Copyright', type: 'eu_directive', expected: 22, description: 'Modernisiert das EU-Urheberrecht fuer das digitale Zeitalter. Enthaelt kontroverse Artikel zu Uploadfiltern (Art. 17) und Leistungsschutzrecht fuer Presseverleger (Art. 15).', relevantFor: ['Content-Plattformen', 'Nachrichtenaggregatoren', 'Bildungseinrichtungen', 'Kulturerbe-Einrichtungen'], keyTopics: ['Upload-Filter (Art. 17)', 'Leistungsschutzrecht', 'Text-und-Data-Mining', 'Verguetungsansprueche'], effectiveDate: '7. Juni 2021' }, { code: 'PLD', name: 'Produkthaftungsrichtlinie', fullName: 'Richtlinie 85/374/EWG (aktualisiert) - Produkthaftung', type: 'eu_directive', expected: 18, description: 'Regelt die Haftung fuer fehlerhafte Produkte. Aktualisierte Version umfasst auch Software und KI. Hersteller haften verschuldensunabhaengig fuer Produktfehler.', relevantFor: ['Produkthersteller', 'Software-Entwickler', 'KI-Anbieter', 'Importeure'], keyTopics: ['Verschuldensunabhaengige Haftung', 'Software als Produkt', 'KI-Haftung', 'Beweislast'], effectiveDate: 'Ueberarbeitung 2024' }, { code: 'GPSR', name: 'General Product Safety', fullName: 'Verordnung (EU) 2023/988 - Allgemeine Produktsicherheit', type: 'eu_regulation', expected: 30, description: 'Ersetzt die alte Produktsicherheitsrichtlinie. Stellt sicher, dass nur sichere Verbraucherprodukte auf den EU-Markt gelangen. Gilt auch fuer Online-Marktplaetze.', relevantFor: ['Produkthersteller', 'Importeure', 'Online-Marktplaetze', 'Haendler'], keyTopics: ['Produktsicherheit', 'Marktplatzhaftung', 'Rueckrufe', 'Safety Gate'], effectiveDate: '13. Dezember 2024' }, { code: 'BSI-TR-03161-1', name: 'BSI-TR Teil 1', fullName: 'BSI TR-03161 Teil 1 - Sicherheitsanforderungen an Digitale Gesundheitsanwendungen (DiGA) - Mobile Anwendungen', type: 'bsi_standard', expected: 45, description: 'Deutsche Technische Richtlinie fuer die Sicherheit mobiler Gesundheits-Apps (DiGA). Definiert Pruefverfahren und Sicherheitsanforderungen fuer die DiGA-Zulassung.', relevantFor: ['DiGA-Hersteller', 'Mobile-App-Entwickler im Gesundheitswesen', 'Pruefstellen'], keyTopics: ['Mobile App Security', 'Authentifizierung', 'Datenverschluesselung', 'Secure Coding'], effectiveDate: 'Version 1.0: 2020' }, { code: 'BSI-TR-03161-2', name: 'BSI-TR Teil 2', fullName: 'BSI TR-03161 Teil 2 - Sicherheitsanforderungen an Digitale Gesundheitsanwendungen (DiGA) - Web-Anwendungen', type: 'bsi_standard', expected: 40, description: 'Technische Richtlinie fuer die Sicherheit von Web-Anwendungen im Gesundheitswesen. Ergaenzt Teil 1 um spezifische Anforderungen fuer Web-Frontends.', relevantFor: ['DiGA-Hersteller mit Web-Apps', 'Web-Entwickler im Gesundheitswesen', 'Pruefstellen'], keyTopics: ['Web Application Security', 'OWASP Top 10', 'Session Management', 'TLS'], effectiveDate: 'Version 1.0: 2020' }, { code: 'BSI-TR-03161-3', name: 'BSI-TR Teil 3', fullName: 'BSI TR-03161 Teil 3 - Sicherheitsanforderungen an Digitale Gesundheitsanwendungen (DiGA) - Hintergrundsysteme', type: 'bsi_standard', expected: 35, description: 'Technische Richtlinie fuer Backend-Systeme von Gesundheitsanwendungen. Deckt Server, APIs, Datenbanken und Cloud-Infrastruktur ab.', relevantFor: ['DiGA-Backend-Entwickler', 'Cloud-Architekten im Gesundheitswesen', 'DevOps-Teams'], keyTopics: ['Backend Security', 'API Security', 'Datenbanksicherheit', 'Cloud Security', 'Logging'], effectiveDate: 'Version 1.0: 2020' }, // Financial Sector Regulations { code: 'DORA', name: 'DORA', fullName: 'Verordnung (EU) 2022/2554 - Digital Operational Resilience Act', type: 'eu_regulation', expected: 64, description: 'Digitale operationale Resilienz fuer den Finanzsektor. Verpflichtet Finanzunternehmen zu umfassendem IKT-Risikomanagement, Vorfallmeldung, Resilienz-Tests und Drittanbieter-Management.', relevantFor: ['Banken', 'Versicherungen', 'Wertpapierfirmen', 'Zahlungsdienstleister', 'Krypto-Anbieter', 'IKT-Drittanbieter'], keyTopics: ['IKT-Risikomanagement', 'Incident Reporting', 'Resilience Testing', 'Third-Party Risk', 'Threat-Led Penetration Testing'], effectiveDate: '17. Januar 2025' }, { code: 'PSD2', name: 'PSD2', fullName: 'Richtlinie (EU) 2015/2366 - Zahlungsdiensterichtlinie', type: 'eu_directive', expected: 117, description: 'Reguliert Zahlungsdienste im EU-Binnenmarkt. Fuehrt Open Banking ein, verpflichtet zu starker Kundenauthentifizierung (SCA) und ermoeglicht Drittanbieterzugang zu Bankkonten.', relevantFor: ['Banken', 'Zahlungsdienstleister', 'FinTechs', 'E-Commerce-Anbieter', 'Kontoinformationsdienste'], keyTopics: ['Strong Customer Authentication (SCA)', 'Open Banking APIs', 'PSD2-Schnittstellen', 'Kontoinformationsdienste', 'Zahlungsauslรถsedienste'], effectiveDate: '13. Januar 2018' }, { code: 'AMLR', name: 'AML-Verordnung', fullName: 'Verordnung (EU) 2024/1624 - Anti-Money Laundering Regulation', type: 'eu_regulation', expected: 89, description: 'EU-weite Verordnung zur Bekaempfung von Geldwaesche und Terrorismusfinanzierung. Ersetzt die bisherigen Richtlinien durch direkt anwendbare Vorschriften. Schafft einheitliche Sorgfaltspflichten.', relevantFor: ['Banken', 'Finanzdienstleister', 'Krypto-Anbieter', 'Immobilienmakler', 'Wirtschaftspruefer', 'Notare'], keyTopics: ['Sorgfaltspflichten (KYC)', 'Verdachtsmeldungen', 'Wirtschaftlich Berechtigte', 'Risikobewertung', 'AMLA (neue EU-Behoerde)'], effectiveDate: '2027 (gestaffelt)' }, { code: 'MiCA', name: 'MiCA', fullName: 'Verordnung (EU) 2023/1114 - Markets in Crypto-Assets', type: 'eu_regulation', expected: 149, description: 'Umfassende Regulierung fuer Kryptowerte, Stablecoins und Crypto-Asset-Dienstleister. Schafft EU-weiten Rechtsrahmen fuer Krypto-Maerkte mit Zulassungspflichten und Verbraucherschutz.', relevantFor: ['Krypto-Boersen', 'Wallet-Anbieter', 'Stablecoin-Emittenten', 'Token-Herausgeber', 'Krypto-Verwahrer', 'FinTechs'], keyTopics: ['Krypto-Zulassung', 'Stablecoin-Regulierung', 'Whitepaper-Pflicht', 'Marktmissbrauch', 'Verwahrung'], effectiveDate: '30. Dezember 2024' }, { code: 'EHDS', name: 'EHDS', fullName: 'Verordnung (EU) 2025/327 - Europaeischer Gesundheitsdatenraum', type: 'eu_regulation', expected: 95, description: 'Schafft den Europaeischen Raum fuer Gesundheitsdaten. Ermoeglicht Primaernutzung (Patientenrechte) und Sekundaernutzung (Forschung, KI-Training) von Gesundheitsdaten unter strengen Auflagen.', relevantFor: ['Krankenhaeuser', 'Aerzte', 'Gesundheits-Apps', 'Pharma', 'Forschungseinrichtungen', 'Versicherungen'], keyTopics: ['Patientenakte (MyHealth@EU)', 'Sekundaernutzung', 'Datenzugangsorgane', 'Gesundheitsdatenstandards', 'Forschungszugang'], effectiveDate: '2025 (gestaffelt bis 2029)' }, ] const TYPE_COLORS: Record = { eu_regulation: 'bg-blue-100 text-blue-700', eu_directive: 'bg-purple-100 text-purple-700', de_law: 'bg-yellow-100 text-yellow-700', bsi_standard: 'bg-green-100 text-green-700', } const TYPE_LABELS: Record = { eu_regulation: 'EU-VO', eu_directive: 'EU-RL', de_law: 'DE-Gesetz', bsi_standard: 'BSI', } // Industry/Sector definitions for the regulation map const INDUSTRIES = [ { id: 'all', name: 'Alle Unternehmen', icon: '๐Ÿข', description: 'Grundlegende Anforderungen fuer alle' }, { id: 'health', name: 'Gesundheitswesen', icon: '๐Ÿฅ', description: 'Krankenhaeuser, DiGA, Medizintechnik' }, { id: 'finance', name: 'Finanzsektor', icon: '๐Ÿฆ', description: 'Banken, Versicherungen, Zahlungsdienstleister' }, { id: 'ecommerce', name: 'E-Commerce', icon: '๐Ÿ›’', description: 'Online-Shops, Marktplaetze' }, { id: 'tech', name: 'Technologie/Software', icon: '๐Ÿ’ป', description: 'Software-Entwickler, SaaS, Cloud' }, { id: 'iot', name: 'IoT/Hardware', icon: '๐Ÿ“ฑ', description: 'Geraetehersteller, Smart Devices' }, { id: 'ai', name: 'KI-Anbieter', icon: '๐Ÿค–', description: 'KI-Entwickler und -Anwender' }, { id: 'kritis', name: 'Kritische Infrastruktur', icon: 'โšก', description: 'Energie, Wasser, Transport' }, { id: 'media', name: 'Medien/Plattformen', icon: '๐Ÿ“บ', description: 'Social Media, Content-Plattformen' }, { id: 'public', name: 'Oeffentlicher Sektor', icon: '๐Ÿ›๏ธ', description: 'Behoerden, Verwaltung' }, ] // Mapping: Which regulations apply to which industries const INDUSTRY_REGULATION_MAP: Record = { all: ['GDPR', 'EPRIVACY', 'TDDDG'], health: ['GDPR', 'TDDDG', 'BSI-TR-03161-1', 'BSI-TR-03161-2', 'BSI-TR-03161-3', 'NIS2', 'AIACT', 'PLD', 'EHDS'], finance: ['GDPR', 'TDDDG', 'NIS2', 'EUCSA', 'DSA', 'AIACT', 'DPF', 'DORA', 'PSD2', 'AMLR', 'MiCA'], ecommerce: ['GDPR', 'TDDDG', 'DSA', 'GPSR', 'EAA', 'PLD', 'DPF', 'PSD2'], tech: ['GDPR', 'TDDDG', 'CRA', 'AIACT', 'DPF', 'SCC', 'DATAACT', 'DSM', 'MiCA'], iot: ['GDPR', 'CRA', 'GPSR', 'PLD', 'DATAACT', 'AIACT'], ai: ['GDPR', 'AIACT', 'PLD', 'DSM', 'DATAACT'], kritis: ['GDPR', 'NIS2', 'EUCSA', 'CRA', 'AIACT', 'DORA'], media: ['GDPR', 'TDDDG', 'DSA', 'DSM', 'EAA', 'AIACT'], public: ['GDPR', 'NIS2', 'EUCSA', 'EAA', 'DGA', 'AIACT', 'EHDS'], } // Thematic groupings showing overlaps const THEMATIC_GROUPS = [ { id: 'datenschutz', name: 'Datenschutz & Privacy', color: 'bg-blue-500', regulations: ['GDPR', 'EPRIVACY', 'TDDDG', 'SCC', 'DPF'], description: 'Schutz personenbezogener Daten, Einwilligung, Betroffenenrechte' }, { id: 'cybersecurity', name: 'Cybersicherheit', color: 'bg-red-500', regulations: ['NIS2', 'EUCSA', 'CRA', 'BSI-TR-03161-1', 'BSI-TR-03161-2', 'BSI-TR-03161-3', 'DORA'], description: 'IT-Sicherheit, Risikomanagement, Incident Response' }, { id: 'ai', name: 'Kuenstliche Intelligenz', color: 'bg-purple-500', regulations: ['AIACT', 'PLD', 'GPSR'], description: 'KI-Regulierung, Hochrisiko-Systeme, Haftung' }, { id: 'digital-markets', name: 'Digitale Maerkte & Plattformen', color: 'bg-green-500', regulations: ['DSA', 'DGA', 'DATAACT', 'DSM'], description: 'Plattformregulierung, Datenzugang, Urheberrecht' }, { id: 'product-safety', name: 'Produktsicherheit & Haftung', color: 'bg-orange-500', regulations: ['CRA', 'PLD', 'GPSR', 'EAA'], description: 'Sicherheitsanforderungen, CE-Kennzeichnung, Barrierefreiheit' }, { id: 'finance', name: 'Finanzmarktregulierung', color: 'bg-emerald-500', regulations: ['DORA', 'PSD2', 'AMLR', 'MiCA'], description: 'Zahlungsdienste, Krypto-Assets, Geldwaeschebekaempfung, digitale Resilienz' }, { id: 'health', name: 'Gesundheitsdaten', color: 'bg-pink-500', regulations: ['EHDS', 'BSI-TR-03161-1', 'BSI-TR-03161-2', 'BSI-TR-03161-3'], description: 'Gesundheitsdatenraum, DiGA-Sicherheit, Patientenrechte' }, ] // Key overlaps and intersections const KEY_INTERSECTIONS = [ { regulations: ['GDPR', 'AIACT'], topic: 'KI und personenbezogene Daten', description: 'Automatisierte Entscheidungen, Profiling, Erklaerbarkeit' }, { regulations: ['NIS2', 'CRA'], topic: 'Cybersicherheit von Produkten', description: 'Sicherheitsanforderungen ueber den gesamten Lebenszyklus' }, { regulations: ['AIACT', 'PLD'], topic: 'KI-Haftung', description: 'Wer haftet, wenn KI Schaeden verursacht?' }, { regulations: ['DSA', 'GDPR'], topic: 'Plattform-Transparenz', description: 'Inhaltsmoderation und Datenschutz' }, { regulations: ['DATAACT', 'GDPR'], topic: 'Datenzugang vs. Datenschutz', description: 'Balance zwischen Datenteilung und Privacy' }, { regulations: ['CRA', 'GPSR'], topic: 'Digitale Produktsicherheit', description: 'Hardware mit Software-Komponenten' }, ] // Future outlook - proposed and discussed regulations const FUTURE_OUTLOOK = [ { id: 'digital-omnibus', name: 'EU Digital Omnibus', status: 'proposed', statusLabel: 'Vorgeschlagen Nov 2025', expectedDate: '2026/2027', description: 'Umfassendes Vereinfachungspaket fuer AI Act, DSGVO und Cybersicherheit. Ziel: 5 Mrd. EUR Einsparung bei Verwaltungskosten.', keyChanges: [ 'AI Act: Verschiebung Hochrisiko-Pflichten um bis zu 16 Monate (bis Dez 2027)', 'AI Act: Vereinfachte Dokumentation fuer KMU und Small Midcaps', 'AI Act: EU-weite regulatorische Sandbox fuer KI-Tests', 'DSGVO: Cookie-Banner-Reform - Berechtigtes Interesse statt nur Einwilligung', 'DSGVO: Automatische Privacy-Signale via Browser statt Pop-ups', 'Cybersecurity: Single Entry Point fuer Meldepflichten' ], affectedRegulations: ['AIACT', 'GDPR', 'NIS2', 'CRA', 'EUCSA'], source: 'https://digital-strategy.ec.europa.eu/en/library/digital-omnibus-ai-regulation-proposal' }, { id: 'sustainability-omnibus', name: 'EU Nachhaltigkeits-Omnibus', status: 'agreed', statusLabel: 'Einigung Dez 2025', expectedDate: 'Q1 2026', description: 'Drastische Reduzierung der Nachhaltigkeits-Berichtspflichten. Anwendungsbereich wird stark eingeschraenkt.', keyChanges: [ 'CSRD: Nur noch Unternehmen >1.000 MA und >450 Mio EUR Umsatz berichtspflichtig', 'CSRD: Betroffene Unternehmen sinken von 50.000 auf ca. 5.000 in der EU', 'CSRD: Verschiebung Welle 2+3 um 2 Jahre (auf Geschaeftsjahr 2027)', 'CSDDD: Nur noch Unternehmen >5.000 MA und >1,5 Mrd EUR Umsatz', 'CSDDD: Sorgfaltspflichten nur noch fuer Tier-1-Lieferanten', 'CSDDD: Pruefung nur noch alle 5 Jahre statt jaehrlich' ], affectedRegulations: ['CSRD', 'CSDDD', 'EU-Taxonomie'], source: 'https://kpmg-law.de/erste-omnibus-verordnung-soll-die-pflichten-der-csddd-csrd-und-eu-taxonomie-lockern/' }, { id: 'eprivacy-withdrawal', name: 'ePrivacy-Verordnung', status: 'withdrawn', statusLabel: 'Zurueckgezogen Feb 2025', expectedDate: 'Unbekannt', description: 'Nach 9 Jahren Verhandlung hat die EU-Kommission den Vorschlag zurueckgezogen. Die ePrivacy-Richtlinie bleibt in Kraft, Cookie-Reform kommt via DSGVO/Digital Omnibus.', keyChanges: [ 'Urspruenglicher Vorschlag: Einheitliche EU-Cookie-Regeln', 'Urspruenglicher Vorschlag: Strikte Tracking-Einwilligung', 'Status: ePrivacy-Richtlinie + TDDDG bleiben gueltig', 'Zukunft: Cookie-Reform wird Teil der DSGVO-Aenderungen' ], affectedRegulations: ['EPRIVACY', 'TDDDG', 'GDPR'], source: 'https://netzpolitik.org/2025/cookie-banner-und-online-tracking-eu-kommission-beerdigt-plaene-fuer-eprivacy-verordnung/' }, { id: 'ai-liability', name: 'KI-Haftungsrichtlinie', status: 'pending', statusLabel: 'In Verhandlung', expectedDate: '2026', description: 'Ergaenzt den AI Act um zivilrechtliche Haftungsregeln. Erleichtert Geschaedigten die Beweisfuehrung bei KI-Schaeden.', keyChanges: [ 'Beweislasterleichterung bei KI-verursachten Schaeden', 'Offenlegungspflichten fuer KI-Anbieter im Schadensfall', 'Verknuepfung mit Produkthaftungsrichtlinie' ], affectedRegulations: ['AIACT', 'PLD'], source: 'https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:52022PC0496' }, ] // Additional regulations that could be added to RAG (publicly available, commercial use permitted) // Regulations now integrated in main RAG (previously listed as candidates) const INTEGRATED_REGULATIONS = [ { code: 'DORA', name: 'Digital Operational Resilience Act', status: 'integrated', addedDate: 'Januar 2025', description: 'Jetzt im RAG verfuegbar - Finanzsektor IT-Resilienz' }, { code: 'MiCA', name: 'Markets in Crypto-Assets', status: 'integrated', addedDate: 'Januar 2025', description: 'Jetzt im RAG verfuegbar - Krypto-Regulierung' }, { code: 'PSD2', name: 'Payment Services Directive 2', status: 'integrated', addedDate: 'Januar 2025', description: 'Jetzt im RAG verfuegbar - Zahlungsdienste' }, { code: 'AMLR', name: 'AML-Verordnung', status: 'integrated', addedDate: 'Januar 2025', description: 'Jetzt im RAG verfuegbar - Geldwaeschebekaempfung' }, { code: 'EHDS', name: 'European Health Data Space', status: 'integrated', addedDate: 'Januar 2025', description: 'Jetzt im RAG verfuegbar - Gesundheitsdatenraum' }, ] // Potential future regulations (not yet integrated) const ADDITIONAL_REGULATIONS = [ { code: 'PSD3', name: 'Payment Services Directive 3', fullName: 'Richtlinie zur dritten Zahlungsdiensterichtlinie (Entwurf)', type: 'eu_directive', status: 'proposed', effectiveDate: 'Voraussichtlich 2026', description: 'Modernisierung der Zahlungsdienste-Regulierung. Staerkerer Verbraucherschutz, Open Banking 2.0, Betrugsbekaempfung. Ersetzt dann PSD2.', relevantFor: ['Banken', 'Zahlungsdienstleister', 'Fintechs', 'E-Commerce'], celex: '52023PC0366', priority: 'medium' }, { code: 'AMLD6', name: 'AML-Richtlinie 6', fullName: 'Richtlinie (EU) 2024/1640 - 6. Geldwaescherichtlinie', type: 'eu_directive', status: 'active', effectiveDate: '10. Juli 2027 (Umsetzung)', description: 'Ergaenzt die AML-Verordnung. Nationale Umsetzungsvorschriften, strafrechtliche Sanktionen, AMLA-Behoerde.', relevantFor: ['Banken', 'Krypto-Anbieter', 'Immobilienmakler', 'Gluecksspielanbieter'], celex: '32024L1640', priority: 'medium' }, { code: 'FIDA', name: 'Financial Data Access', fullName: 'Verordnung zum Zugang zu Finanzdaten (Entwurf)', type: 'eu_regulation', status: 'proposed', effectiveDate: 'Voraussichtlich 2027', description: 'Open Finance Framework - erweitert PSD2-Open-Banking auf Versicherungen, Investitionen, Kredite.', relevantFor: ['Banken', 'Versicherungen', 'Fintechs', 'Datenaggregatoren'], celex: '52023PC0360', priority: 'medium' }, ] // Legal basis for using EUR-Lex content const LEGAL_BASIS_INFO = { title: 'Rechtliche Grundlage fuer RAG-Nutzung', summary: 'EU-Rechtstexte auf EUR-Lex sind oeffentliche amtliche Dokumente und duerfen frei verwendet werden.', details: [ { aspect: 'EUR-Lex Dokumente', status: 'Erlaubt', explanation: 'Offizielle EU-Gesetzestexte, Richtlinien und Verordnungen sind gemeinfrei (Public Domain) und duerfen frei reproduziert und kommerziell genutzt werden.' }, { aspect: 'Text-und-Data-Mining (TDM)', status: 'Erlaubt', explanation: 'Art. 4 der DSM-Richtlinie (2019/790) erlaubt TDM fuer kommerzielle Zwecke, sofern kein Opt-out des Rechteinhabers vorliegt. Fuer amtliche Texte gilt kein Opt-out.' }, { aspect: 'AI Act Anforderungen', status: 'Beachten', explanation: 'Art. 53 AI Act verlangt von GPAI-Anbietern die Einhaltung des Urheberrechts. Fuer oeffentliche Rechtstexte unproblematisch.' }, { aspect: 'BSI-Richtlinien', status: 'Erlaubt', explanation: 'BSI-Publikationen sind oeffentlich zugaenglich und duerfen fuer Compliance-Zwecke verwendet werden.' }, ] } export default function RAGPage() { const [activeTab, setActiveTab] = useState('overview') const [collectionStatus, setCollectionStatus] = useState(null) const [loading, setLoading] = useState(true) const [searchQuery, setSearchQuery] = useState('') const [searchResults, setSearchResults] = useState([]) const [searching, setSearching] = useState(false) const [selectedRegulations, setSelectedRegulations] = useState([]) const [ingestionRunning, setIngestionRunning] = useState(false) const [ingestionLog, setIngestionLog] = useState([]) const [pipelineState, setPipelineState] = useState(null) const [pipelineLoading, setPipelineLoading] = useState(false) const [pipelineStarting, setPipelineStarting] = useState(false) const [expandedRegulation, setExpandedRegulation] = useState(null) const [autoRefresh, setAutoRefresh] = useState(true) const [elapsedTime, setElapsedTime] = useState('') // Data tab state const [customDocuments, setCustomDocuments] = useState([]) const [uploadFile, setUploadFile] = useState(null) const [uploadTitle, setUploadTitle] = useState('') const [uploadCode, setUploadCode] = useState('') const [uploading, setUploading] = useState(false) const [linkUrl, setLinkUrl] = useState('') const [linkTitle, setLinkTitle] = useState('') const [linkCode, setLinkCode] = useState('') const [addingLink, setAddingLink] = useState(false) const fetchStatus = useCallback(async () => { setLoading(true) try { const res = await fetch(`${API_PROXY}?action=status`) if (res.ok) { const data = await res.json() setCollectionStatus(data) } } catch (error) { console.error('Failed to fetch status:', error) } finally { setLoading(false) } }, []) const fetchPipeline = useCallback(async () => { setPipelineLoading(true) try { const res = await fetch(`${API_PROXY}?action=pipeline-checkpoints`) if (res.ok) { const data = await res.json() setPipelineState(data) } } catch (error) { console.error('Failed to fetch pipeline:', error) } finally { setPipelineLoading(false) } }, []) const fetchCustomDocuments = useCallback(async () => { try { const res = await fetch(`${API_PROXY}?action=custom-documents`) if (res.ok) { const data = await res.json() setCustomDocuments(data.documents || []) } } catch (error) { console.error('Failed to fetch custom documents:', error) } }, []) const handleUpload = async () => { if (!uploadFile || !uploadTitle || !uploadCode) return setUploading(true) try { const formData = new FormData() formData.append('file', uploadFile) formData.append('title', uploadTitle) formData.append('code', uploadCode) formData.append('document_type', 'custom') const res = await fetch(`${API_PROXY}?action=upload`, { method: 'POST', body: formData, }) if (res.ok) { setUploadFile(null) setUploadTitle('') setUploadCode('') fetchCustomDocuments() fetchStatus() } } catch (error) { console.error('Upload failed:', error) } finally { setUploading(false) } } const handleAddLink = async () => { if (!linkUrl || !linkTitle || !linkCode) return setAddingLink(true) try { const res = await fetch(`${API_PROXY}?action=add-link`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ url: linkUrl, title: linkTitle, code: linkCode, document_type: 'custom', }), }) if (res.ok) { setLinkUrl('') setLinkTitle('') setLinkCode('') fetchCustomDocuments() } } catch (error) { console.error('Add link failed:', error) } finally { setAddingLink(false) } } const handleDeleteDocument = async (docId: string) => { try { const res = await fetch(`${API_PROXY}?action=delete-document&docId=${docId}`, { method: 'DELETE', }) if (res.ok) { fetchCustomDocuments() fetchStatus() } } catch (error) { console.error('Delete failed:', error) } } const handleStartPipeline = async (skipIngestion: boolean = false) => { setPipelineStarting(true) try { const res = await fetch(`${API_PROXY}?action=start-pipeline`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ force_reindex: false, skip_ingestion: skipIngestion, }), }) if (res.ok) { // Wait a moment then refresh pipeline status setTimeout(() => { fetchPipeline() setPipelineStarting(false) }, 2000) } else { setPipelineStarting(false) } } catch (error) { console.error('Failed to start pipeline:', error) setPipelineStarting(false) } } useEffect(() => { fetchStatus() }, [fetchStatus]) useEffect(() => { if (activeTab === 'pipeline') { fetchPipeline() } }, [activeTab, fetchPipeline]) useEffect(() => { if (activeTab === 'data') { fetchCustomDocuments() } }, [activeTab, fetchCustomDocuments]) // Auto-refresh pipeline status when running useEffect(() => { if (activeTab !== 'pipeline' || !autoRefresh) return const isRunning = pipelineState?.status === 'running' if (isRunning) { const interval = setInterval(() => { fetchPipeline() fetchStatus() // Also refresh chunk counts }, 5000) // Every 5 seconds return () => clearInterval(interval) } }, [activeTab, autoRefresh, pipelineState?.status, fetchPipeline, fetchStatus]) // Update elapsed time useEffect(() => { if (!pipelineState?.started_at || pipelineState?.status !== 'running') { setElapsedTime('') return } const updateElapsed = () => { const start = new Date(pipelineState.started_at!).getTime() const now = Date.now() const diff = Math.floor((now - start) / 1000) const hours = Math.floor(diff / 3600) const minutes = Math.floor((diff % 3600) / 60) const seconds = diff % 60 if (hours > 0) { setElapsedTime(`${hours}h ${minutes}m ${seconds}s`) } else if (minutes > 0) { setElapsedTime(`${minutes}m ${seconds}s`) } else { setElapsedTime(`${seconds}s`) } } updateElapsed() const interval = setInterval(updateElapsed, 1000) return () => clearInterval(interval) }, [pipelineState?.started_at, pipelineState?.status]) const handleSearch = async () => { if (!searchQuery.trim()) return setSearching(true) try { const params = new URLSearchParams({ action: 'search', query: searchQuery, top_k: '5', }) if (selectedRegulations.length > 0) { params.append('regulations', selectedRegulations.join(',')) } const res = await fetch(`${API_PROXY}?${params}`) if (res.ok) { const data = await res.json() setSearchResults(data.results || []) } } catch (error) { console.error('Search failed:', error) } finally { setSearching(false) } } const triggerIngestion = async () => { setIngestionRunning(true) setIngestionLog(['Starte Re-Ingestion aller 19 Regulierungen...']) try { const res = await fetch(`${API_PROXY}?action=ingest`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ force: true }), }) if (res.ok) { const data = await res.json() setIngestionLog((prev) => [...prev, 'Ingestion gestartet. Job-ID: ' + (data.job_id || 'N/A')]) // Poll for status const checkStatus = setInterval(async () => { try { const statusRes = await fetch(`${API_PROXY}?action=ingestion-status`) if (statusRes.ok) { const statusData = await statusRes.json() if (statusData.completed) { clearInterval(checkStatus) setIngestionRunning(false) setIngestionLog((prev) => [...prev, 'Ingestion abgeschlossen!']) fetchStatus() } else if (statusData.current_regulation) { setIngestionLog((prev) => [ ...prev, `Verarbeite: ${statusData.current_regulation} (${statusData.processed}/${statusData.total})`, ]) } } } catch { // Ignore polling errors } }, 5000) } else { setIngestionLog((prev) => [...prev, 'Fehler: ' + res.statusText]) setIngestionRunning(false) } } catch (error) { setIngestionLog((prev) => [...prev, 'Fehler: ' + String(error)]) setIngestionRunning(false) } } const getRegulationChunks = (code: string): number => { return collectionStatus?.regulations?.[code] || 0 } const getTotalChunks = (): number => { return collectionStatus?.totalPoints || 0 } const tabs = [ { id: 'overview' as TabId, name: 'Uebersicht', icon: '๐Ÿ“Š' }, { id: 'regulations' as TabId, name: 'Regulierungen', icon: '๐Ÿ“œ' }, { id: 'map' as TabId, name: 'Landkarte', icon: '๐Ÿ—บ๏ธ' }, { id: 'search' as TabId, name: 'Suche', icon: '๐Ÿ”' }, { id: 'data' as TabId, name: 'Daten', icon: '๐Ÿ“' }, { id: 'ingestion' as TabId, name: 'Ingestion', icon: 'โš™๏ธ' }, { id: 'pipeline' as TabId, name: 'Pipeline', icon: '๐Ÿ”„' }, ] return (
{/* Header */}

Daten & RAG

Legal Corpus Management fuer Compliance

KI & Automatisierung
{/* Page Purpose */} {/* Stats Cards */}

Regulierungen

{REGULATIONS.length}

Chunks Total

{loading ? '-' : getTotalChunks().toLocaleString()}

Vector Size

{collectionStatus?.vectorSize || 1024}

Status

{collectionStatus?.status === 'green' ? 'โœ“ Ready' : loading ? '-' : collectionStatus?.status || 'N/A'}

{/* Tabs */}
{tabs.map((tab) => ( ))}
{/* Tab Content */} {activeTab === 'overview' && (
{/* Quick Stats per Type */}
{Object.entries(TYPE_LABELS).map(([type, label]) => { const regs = REGULATIONS.filter((r) => r.type === type) const totalChunks = regs.reduce((sum, r) => sum + getRegulationChunks(r.code), 0) return (
{label} {regs.length} Dok.

{totalChunks.toLocaleString()} Chunks

) })}
{/* Top Regulations */}

Top Regulierungen (nach Chunks)

{REGULATIONS.sort((a, b) => getRegulationChunks(b.code) - getRegulationChunks(a.code)) .slice(0, 5) .map((reg) => { const chunks = getRegulationChunks(reg.code) return (
{TYPE_LABELS[reg.type]} {reg.name} ({reg.code})
{chunks.toLocaleString()} Chunks
) })}
)} {activeTab === 'regulations' && (

Alle {REGULATIONS.length} Regulierungen

{REGULATIONS.map((reg) => { const chunks = getRegulationChunks(reg.code) const ratio = chunks / (reg.expected * 10) // Rough estimate: 10 chunks per requirement let statusColor = 'text-red-500' let statusIcon = 'โŒ' if (ratio > 0.5) { statusColor = 'text-green-500' statusIcon = 'โœ“' } else if (ratio > 0.1) { statusColor = 'text-yellow-500' statusIcon = 'โš ' } const isExpanded = expandedRegulation === reg.code return ( setExpandedRegulation(isExpanded ? null : reg.code)} className="hover:bg-slate-50 cursor-pointer transition-colors" > {isExpanded && ( )} ) })}
Code Typ Name Chunks Erwartet Status
โ–ถ {reg.code} {TYPE_LABELS[reg.type]} {reg.name} {chunks.toLocaleString()} {reg.expected} {statusIcon}

{reg.fullName}

{reg.description}

Relevant fuer

{reg.relevantFor.map((item, idx) => ( {item} ))}

Kernthemen

{reg.keyTopics.map((topic, idx) => ( {topic} ))}
In Kraft seit: {reg.effectiveDate}
)} {activeTab === 'map' && (
{/* Industry Filter */}

Regulierungen nach Branche

Waehlen Sie Ihre Branche, um relevante Regulierungen zu sehen.

{INDUSTRIES.map((industry) => { const regs = INDUSTRY_REGULATION_MAP[industry.id] || [] return ( ) })}
{/* Selected Industry Details */} {expandedRegulation && INDUSTRIES.find(i => i.id === expandedRegulation) && (
{(() => { const industry = INDUSTRIES.find(i => i.id === expandedRegulation)! const regCodes = INDUSTRY_REGULATION_MAP[industry.id] || [] const regs = REGULATIONS.filter(r => regCodes.includes(r.code)) return ( <>
{industry.icon}

{industry.name}

{industry.description}

{regs.map((reg) => (
{reg.code}
{reg.name}
{reg.description}
))}
) })()}
)}
{/* Thematic Groups */}

Thematische Cluster

Regulierungen gruppiert nach Themenbereichen - zeigt Ueberschneidungen.

{THEMATIC_GROUPS.map((group) => (
{group.name} {group.regulations.length} Regulierungen

{group.description}

{group.regulations.map((code) => { const reg = REGULATIONS.find(r => r.code === code) return ( { setActiveTab('regulations') setExpandedRegulation(code) }} title={reg?.fullName || code} > {code} ) })}
))}
{/* Key Intersections */}

Wichtige Schnittstellen

Bereiche, in denen sich mehrere Regulierungen ueberschneiden und zusammenwirken.

{KEY_INTERSECTIONS.map((intersection, idx) => (
{intersection.regulations.map((code) => ( {code} ))}
{intersection.topic}
{intersection.description}
))}
{/* Regulation Matrix */}

Branchen-Regulierungs-Matrix

Welche Regulierungen in welchen Branchen gelten

{INDUSTRIES.filter(i => i.id !== 'all').map((industry) => ( ))} {REGULATIONS.map((reg) => ( {INDUSTRIES.filter(i => i.id !== 'all').map((industry) => { const applies = INDUSTRY_REGULATION_MAP[industry.id]?.includes(reg.code) return ( ) })} ))}
Regulierung
{industry.icon} {industry.name.split('/')[0]}
{reg.code} {applies ? ( โœ“ ) : ( โ€“ )}
{/* Future Outlook Section */}
๐Ÿ”ฎ

Zukunftsaussicht

Geplante Aenderungen und neue Regulierungen

{FUTURE_OUTLOOK.map((item) => (
{item.statusLabel}

{item.name}

Erwartet: {item.expectedDate}

{item.description}

Wichtige Aenderungen:

    {item.keyChanges.slice(0, 4).map((change, idx) => (
  • โ€ข {change}
  • ))} {item.keyChanges.length > 4 && (
  • + {item.keyChanges.length - 4} weitere...
  • )}
{item.affectedRegulations.map((code) => ( {code} ))}
Quelle โ†’
))}
{/* Integrated Regulations */}
โœ…

Neu integrierte Regulierungen

Jetzt im RAG-System verfuegbar (Stand: Januar 2025)

{INTEGRATED_REGULATIONS.map((reg) => (
{reg.code}

{reg.name}

Im RAG

))}
{/* Potential Future Regulations */}
๐Ÿ”ฎ

Zukuenftige Regulierungen

Noch nicht verabschiedet oder zur Erweiterung vorgesehen

{ADDITIONAL_REGULATIONS.map((reg) => (
{reg.code} {reg.status === 'active' ? 'In Kraft' : 'Vorgeschlagen'}
{reg.priority === 'high' ? 'Hohe Prioritaet' : 'Mittel'}

{reg.name}

{reg.description}

Ab: {reg.effectiveDate} {reg.celex && ( EUR-Lex โ†’ )}
))}
{/* Legal Basis Info */}
โš–๏ธ

{LEGAL_BASIS_INFO.title}

{LEGAL_BASIS_INFO.summary}

{LEGAL_BASIS_INFO.details.map((detail, idx) => (
{detail.status} {detail.aspect}

{detail.explanation}

))}
)} {activeTab === 'search' && (
{/* Search Box */}

Semantische Suche