- Full i18n (DE/EN): UI, rules engine, content pack and generated documents; language switcher, browser-language default, architecture extensible to further EU languages via localized source texts - National country modules (opt-in per company profile): DE (KI-MIG/ BNetzA supervision, works council co-determination Sec. 87 BetrVG, GDPR/BDSG), AT (RTR AI service desk), IT (Law 132/2025: employer info duty, deepfake criminal liability, sector decrees), ES (AESIA, sandbox RD 817/2023), FR (CNIL guidance), NL (algorithm register); merged into obligation derivation, checklists and documents - New EU obligations: corrective actions (Art. 20/21), authorised representative (Art. 22), EU database registration for public-body deployers (Art. 49(3)), post-market monitoring (Art. 72), serious incident reporting (Art. 73), GDPR DPIA (Art. 35 GDPR / 26(9)) - New documents: AI procurement requirements specification (MUST/SHOULD matrix for vendors) and EU declaration of conformity draft (Annex V) - Cross-system checkable task list (due now / upcoming / done) with progress bar, one-tap toggling, per-system links - Legal safety: first-run acknowledgement gate (working aid, no legal services), legal notice panel in settings, result-screen disclaimer, disclaimers on every document - Responsive layout for phone/tablet (top-bar nav, scrollable tables, larger tap targets) - 12 new tests (44 total): EN pack parity, national merge, checklist grouping, new document generators Claude-Session: https://claude.ai/code/session_017YjohVNx1ZGNM4MX7tHpfv
48 lines
1.3 KiB
TypeScript
48 lines
1.3 KiB
TypeScript
import { useState } from 'react';
|
|
import { useI18n } from '../i18n/context';
|
|
|
|
const ACK_KEY = 'ai-act-kompass/legal-ack/v1';
|
|
|
|
function hasAcknowledged(): boolean {
|
|
try {
|
|
return localStorage.getItem(ACK_KEY) !== null;
|
|
} catch {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Rechtlicher Hinweis beim ersten Start: Die Nutzung ist erst nach
|
|
* ausdrücklicher Bestätigung möglich, dass das Tool nur eine Arbeitshilfe
|
|
* und keine Rechtsberatung ist. Die Bestätigung wird mit Zeitstempel
|
|
* lokal gespeichert.
|
|
*/
|
|
export function DisclaimerGate(): JSX.Element | null {
|
|
const { t } = useI18n();
|
|
const [acknowledged, setAcknowledged] = useState<boolean>(() => hasAcknowledged());
|
|
|
|
if (acknowledged) return null;
|
|
|
|
return (
|
|
<div className="gate-backdrop" role="dialog" aria-modal="true" aria-label={t.legalGateTitle}>
|
|
<div className="gate">
|
|
<h1>{t.legalGateTitle}</h1>
|
|
<p>{t.legalGateBody1}</p>
|
|
<p>
|
|
<strong>{t.legalGateBody2}</strong>
|
|
</p>
|
|
<p>{t.legalGateBody3}</p>
|
|
<button
|
|
className="primary"
|
|
onClick={() => {
|
|
localStorage.setItem(ACK_KEY, new Date().toISOString());
|
|
setAcknowledged(true);
|
|
}}
|
|
>
|
|
{t.legalGateAccept}
|
|
</button>
|
|
</div>
|
|
</div>
|
|
);
|
|
}
|