/** * PORTA architecture overview — data → processing → organisation. * Layout matches local/notes/demo-tue-porta_architecture_v3.html (order: Schicht 3 → Pfeil ↓ → Schicht 2 → Pfeil ↑ → Schicht 1). */ import React, { useMemo } from 'react'; import { useLanguage } from '../providers/language/LanguageContext'; import { useIntegrationsOverview, type DataLayerItem, type LiveStats } from '../hooks/useIntegrationsOverview'; import styles from './IntegrationsOverview.module.css'; /** de-CH: 1'234'567 */ function _formatStatNumber(n: number): string { return new Intl.NumberFormat('de-CH', { maximumFractionDigits: 0 }).format(n); } function _shortExtractorSymbol(className: string): string { return className.replace(/Extractor$/i, '') || className; } function _shortRendererSymbol(className: string): string { return className.replace(/^Renderer/i, '') || className; } function _IconLightning({ className }: { className?: string }) { return ( ); } function _IconGear({ className }: { className?: string }) { return ( ); } function _ArrowDown() { return (
{t('PORTA Architektur — Daten, Verarbeitung und Mandanten auf einen Blick.')}
{t('Keine Mandanten in der Navigation sichtbar.')}
) : ( mandateCards.map((m) => (
{t('PORTA')}