'use client'; import { WidgetIcon } from './widget-icon'; import { useEffect, useMemo, useRef, useState } from 'react'; import { useTranslations } from 'next-intl'; import type { WidgetProps } from '@/components/dashboard/widget-registry'; import { XFRAME_PAGE_WIDTH, XFRAME_SANDBOX, resolveXframeConfig } from './xframe-config'; import { computeCropLayout } from './xframe-crop'; /** * XframeWidget — eine Webseite per https-Adresse als eingebetteter Rahmen * in der Kachel (quick-260921-qd3). * * Sandbox: `XFRAME_SANDBOX` (Begruendung in xframe-config.ts, T-QD3-01) — * keine Freigabe der Navigation des obersten Fensters, keine Modaldialoge; * `allow=""` delegiert keine Berechtigungen (Kamera, Mikrofon, Standort, * T-QD3-06); `referrerPolicy="no-referrer"`, damit der Fremdhost die * Tessera-Adresse nicht erfaehrt (T-QD3-05). * * Woher die Seite kommt: AUSSCHLIESSLICH der Browser des Benutzers laedt * die Adresse — der Server ruft sie nie ab (T-QD3-04: keine SSRF-Flaeche, * kein Proxy-Endpunkt; interne Hosts sieht damit nur, wer sie ohnehin * erreicht). Was gerendert wird, entscheidet `resolveXframeConfig` * (T-QD3-03): nur eine https-Adresse, sonst der Leerzustand. * * Bearbeitungsmodus (T-QD3-07): ein