import { TriangleIcon } from '../../components/TriangleIcon'; import type { BsiOverview } from '../bsi-grundschutz'; import './compliance.css'; const byNumber = (left: string, right: string) => left.localeCompare(right, 'en', { numeric: true }); /** * Finding Reader section of the BSI Grundschutz++ requirements derived from this finding's accepted ISO * controls through the BSI mapping (Phase 13F, stage 1). Derived only; it is no decision of its own. * User decision 2026-10-08: it starts collapsed like `Context`, groups the requirements under their ISO * control as one-line rows and shows a statement only when its requirement is opened. */ export function FindingBsiRequirements({ bsi }: { bsi?: BsiOverview }) { if (!bsi?.requirements.length) return null; const isoControls = [...new Set(bsi.requirements.flatMap(requirement => requirement.via.map(via => via.isoControlId)))].sort(byNumber); const count = bsi.requirements.length; return

BSI requirements

{count} {count === 1 ? 'requirement' : 'requirements'} derived from the accepted ISO controls
{isoControls.map(isoControlId => { const reached = bsi.requirements.filter(requirement => requirement.via.some(via => via.isoControlId === isoControlId)); // One BSI mapping entry per ISO control, so its relationship holds for the whole group. const relationship = reached[0].via.find(via => via.isoControlId === isoControlId)!.relationship; return

A.{isoControlId} · {relationship}

    {reached.map(requirement =>
  • {requirement.requirementId}{requirement.title}

    {requirement.statement}

  • )}
; })}

Via BSI mapping {bsi.crosswalkVersion} · catalog {bsi.catalogVersion.slice(0, 10)} · Source: BSI Stand-der-Technik-Bibliothek, CC BY-SA 4.0

; }