shieldx/ai-act-kompass/src/ui/DisclaimerGate.tsx
Claude cd31274738
feat(ai-act-kompass): i18n, national modules, task checklist, legal gate, new documents
- 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
2026-07-04 09:18:07 +00:00

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>
);
}