Promote develop → main (2026-05-06 22:49 UTC)

This commit was merged in pull request #2.
Dieser Commit ist enthalten in:
2026-05-07 00:49:37 +02:00
Commit d41bd9d41d
15 geänderte Dateien mit 752 neuen und 106 gelöschten Zeilen

4
.gitignore vendored
Datei anzeigen

@@ -1,3 +1,5 @@
# Lagebild-Daten (werden per Cron-Sync vom Monitor regeneriert) # Lagebild-Daten (werden per Cron-Sync vom Monitor regeneriert)
lagebild/data/ lagebild/data/
lagen/*/data/ lagen/*/data/*
# Aber Verzeichnis-Platzhalter behalten (Staging-Container braucht Mountpoint)
!lagen/*/data/.gitkeep

Datei anzeigen

@@ -50,6 +50,10 @@ STRUCTURE:
- index.html: Hauptseite (EN) - index.html: Hauptseite (EN)
- legal-notice.html: Impressum (EN, Hinweis "German version prevails") - legal-notice.html: Impressum (EN, Hinweis "German version prevails")
- privacy.html: Datenschutz (EN, Hinweis "German version prevails") - privacy.html: Datenschutz (EN, Hinweis "German version prevails")
situations:
- iran-conflict/index.html: Lagebild Iran (EN-Mirror, teilt /lagen/iran-konflikt/data)
- cyber-attacks/index.html: Lagebild Cyberangriffe (EN-Mirror, teilt /lagen/cyberangriffe/data)
- deepfakes/index.html: Recherche Deepfakes (EN-Mirror, teilt /lagen/deepfakes/data)
assets: assets:
fonts: [Inter, Bebas Neue] fonts: [Inter, Bebas Neue]
@@ -98,12 +102,23 @@ PAGES:
product: product:
- AccountForger Video-Demo - AccountForger Video-Demo
lagen: lagen:
url_struktur: /lagen/{thema}/ url_struktur:
de: /lagen/{thema}/
en: /en/situations/{slug}/ (slug ist die englische URL-Variante)
slug_mapping:
iran-konflikt: iran-conflict
cyberangriffe: cyber-attacks
deepfakes: deepfakes
daten_freigabe: |
EN-Mirror-Seiten setzen window.LAGEBILD_DATA_BASE auf den DE-Pfad,
damit beide Sprachvarianten die gleichen JSON-Daten laden. Das
lagebild.js liest curLang() aus <html lang> und schaltet UI-Strings
automatisch um (lang.de / lang.en Dictionary).
redirect: /lagebild/ -> 301 -> /lagen/iran-konflikt/ redirect: /lagebild/ -> 301 -> /lagen/iran-konflikt/
aktiv: aktiv:
- iran-konflikt: Live-Lagebild Irankonflikt (ehemals /lagebild/) - iran-konflikt / iran-conflict: Live-Lagebild Irankonflikt
geplant: - cyberangriffe / cyber-attacks: Live-Lagebild Cyberangriffe
- (2 weitere Lagen in Vorbereitung) - deepfakes / deepfakes: Recherche-Briefing Deepfakes
vorschau: vorschau:
url: /vorschau/ url: /vorschau/
zweck: Produktseite AegisSight Monitor (ersetzt spaeter die Hauptseite) zweck: Produktseite AegisSight Monitor (ersetzt spaeter die Hauptseite)
@@ -122,7 +137,14 @@ DEVELOPMENT:
sprachumschalter: css/lang-switcher.css sprachumschalter: css/lang-switcher.css
pendant_urls: in jeder Seite hardcoded (funktioniert ohne JS) pendant_urls: in jeder Seite hardcoded (funktioniert ohne JS)
cookie_banner: cookie-consent.js liest <html lang> selbststaendig cookie_banner: cookie-consent.js liest <html lang> selbststaendig
open: contact-form.py ist noch DE-only (Validierungs- und Mailtexte) lagen: lagebild.js liest <html lang> via curLang(); Daten-Pfad ueber
window.LAGEBILD_DATA_BASE pro EN-Mirror-Seite
kontaktformular: |
Frontend (js/app.js) sendet lang im POST-Body, zeigt Sende- und
Fehler-Texte in der jeweiligen Sprache. Backend
(/opt/v2-Docker/aegis-website/contact-form.py, NICHT im Repo)
liest lang und antwortet entsprechend; E-Mail an info@aegis-sight.de
bleibt deutsch, mit Hinweis "[EN]" im Betreff bei EN-Anfragen.
large_files: "assets/videos/ (~300MB)" large_files: "assets/videos/ (~300MB)"
design: mobile-first responsive design: mobile-first responsive
@@ -152,6 +174,9 @@ CHANGE_LOG:
- "i18n: Sprachumschalter DE/EN, neue Seiten unter /en/" - "i18n: Sprachumschalter DE/EN, neue Seiten unter /en/"
- "Aufraeumen: js/translations.js, impressum-en.html, datenschutz-en.html entfernt" - "Aufraeumen: js/translations.js, impressum-en.html, datenschutz-en.html entfernt"
- "data-translate Attribute aus Lagen-Seiten entfernt" - "data-translate Attribute aus Lagen-Seiten entfernt"
- "EN-Lagen-Seiten unter /en/situations/{slug}/, teilen DE-Datenfiles"
- "lagebild.js: curLang() liest <html lang>, dataBase()-Helper neu, tote initLangToggle/switchContent entfernt"
- "Kontaktformular zweisprachig (Frontend + Backend)"
Last-Updated: 2026-05-06 Last-Updated: 2026-05-06

Datei anzeigen

@@ -350,7 +350,7 @@
<div class="demo-excerpt" id="demo-excerpt"> <div class="demo-excerpt" id="demo-excerpt">
<div class="excerpt-text" id="excerpt-text">Situation report loading...</div> <div class="excerpt-text" id="excerpt-text">Situation report loading...</div>
</div> </div>
<a href="/lagen/iran-konflikt/" class="btn btn-primary btn-block">Open full situation report</a> <a href="/en/situations/iran-conflict/" class="btn btn-primary btn-block">Open full situation report</a>
</div> </div>
<!-- Cyberattacks --> <!-- Cyberattacks -->
<div class="carousel-card card-live" data-index="1" data-lage="cyberangriffe"> <div class="carousel-card card-live" data-index="1" data-lage="cyberangriffe">
@@ -360,7 +360,7 @@
<div class="demo-excerpt" id="demo-excerpt-cyberangriffe"> <div class="demo-excerpt" id="demo-excerpt-cyberangriffe">
<div class="excerpt-text" id="excerpt-text-cyberangriffe">Situation report loading...</div> <div class="excerpt-text" id="excerpt-text-cyberangriffe">Situation report loading...</div>
</div> </div>
<a href="/lagen/cyberangriffe/" class="btn btn-primary btn-block">Open full situation report</a> <a href="/en/situations/cyber-attacks/" class="btn btn-primary btn-block">Open full situation report</a>
</div> </div>
<!-- Deepfakes Research --> <!-- Deepfakes Research -->
<div class="carousel-card card-live" data-index="2" data-lage="deepfakes"> <div class="carousel-card card-live" data-index="2" data-lage="deepfakes">
@@ -370,7 +370,7 @@
<div class="demo-excerpt" id="demo-excerpt-deepfakes"> <div class="demo-excerpt" id="demo-excerpt-deepfakes">
<div class="excerpt-text" id="excerpt-text-deepfakes">Research loading...</div> <div class="excerpt-text" id="excerpt-text-deepfakes">Research loading...</div>
</div> </div>
<a href="/lagen/deepfakes/" class="btn btn-primary btn-block">Open full research</a> <a href="/en/situations/deepfakes/" class="btn btn-primary btn-block">Open full research</a>
</div> </div>
</div> </div>
<div class="carousel-nav"> <div class="carousel-nav">

Datei anzeigen

@@ -0,0 +1,153 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Situation report: Cyberattacks on German infrastructure - AegisSight</title>
<meta name="robots" content="noindex, nofollow, noarchive, nosnippet, noimageindex">
<link rel="alternate" hreflang="de" href="https://aegis-sight.de/lagen/cyberangriffe/">
<link rel="alternate" hreflang="en" href="https://aegis-sight.de/en/situations/cyber-attacks/">
<link rel="alternate" hreflang="x-default" href="https://aegis-sight.de/lagen/cyberangriffe/">
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
<link rel="stylesheet" href="/css/main.css">
<link rel="stylesheet" href="/css/fonts.css">
<link rel="stylesheet" href="/css/mobile.css">
<link rel="stylesheet" href="/css/lang-switcher.css">
<link rel="stylesheet" href="/lagen/iran-konflikt/lagebild.css">
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css" />
<link rel="stylesheet" href="https://unpkg.com/leaflet.markercluster@1.5.3/dist/MarkerCluster.css">
<link rel="stylesheet" href="https://unpkg.com/leaflet.markercluster@1.5.3/dist/MarkerCluster.Default.css">
<link rel="stylesheet" href="/cookie-consent.css">
<script>window.LAGEBILD_DATA_BASE = '/lagen/cyberangriffe/';</script>
</head>
<body class="lagebild-page">
<div class="scroll-progress" id="scroll-progress"></div>
<nav class="navbar" role="navigation">
<div class="nav-container">
<div class="logo">
<a href="/en/"><img src="/assets/images/logos/Logo+Schrift_Rechts.png" alt="AegisSight" class="logo-img"></a>
</div>
<ul class="nav-menu">
<li><a href="/en/">Home</a></li>
<li><a href="/en/#trust">About Us</a></li>
<li><a href="/en/#features">Features</a></li>
<li><a href="mailto:info@aegis-sight.de">Contact</a></li>
</ul>
<div class="nav-extras">
<div class="lang-switcher" role="group" aria-label="Language">
<a class="lang-link" href="/lagen/cyberangriffe/" lang="de" hreflang="de" rel="alternate">DE</a>
<span class="lang-sep" aria-hidden="true">|</span>
<span class="lang-active" lang="en" aria-current="true">EN</span>
</div>
<button class="mobile-menu-toggle" aria-label="Open menu" aria-expanded="false">
<span class="hamburger"><span></span><span></span><span></span></span>
</button>
</div>
</div>
</nav>
<div class="nav-menu-mobile" aria-hidden="true">
<button class="mobile-menu-close" aria-label="Close menu">
<svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M18 6L6 18M6 6l12 12" stroke="currentColor"/></svg>
</button>
<ul>
<li><a href="/en/">Home</a></li>
<li><a href="/en/#trust">About Us</a></li>
<li><a href="/en/#features">Features</a></li>
<li><a href="mailto:info@aegis-sight.de">Contact</a></li>
</ul>
<div class="lang-switcher" role="group" aria-label="Language">
<a class="lang-link" href="/lagen/cyberangriffe/" lang="de" hreflang="de" rel="alternate">DE</a>
<span class="lang-sep" aria-hidden="true">|</span>
<span class="lang-active" lang="en" aria-current="true">EN</span>
</div>
</div>
<div class="mobile-menu-overlay"></div>
<section class="lagebild-hero">
<canvas id="hero-particles"></canvas>
<div class="hero-bg-pattern"></div>
<div class="container">
<h1 id="hero-title">SITUATION REPORT</h1>
<p class="hero-incident-title" id="incident-title"></p>
<div class="hero-stats" id="hero-stats"></div>
</div>
</section>
<div class="control-bar">
<div class="container">
<div class="timeline-wrapper">
<div class="timeline-strip" id="timeline-strip"></div>
<div class="timeline-dropdown" id="timeline-dropdown"></div>
</div>
<div class="tab-nav" id="tab-nav">
<button class="tab-btn active" data-tab="ueberblick">Latest Developments</button>
<button class="tab-btn" data-tab="lagebild">Briefing</button>
<button class="tab-btn" data-tab="karte">Map</button>
<button class="tab-btn" data-tab="faktenchecks">Fact Checks <span class="tab-badge" id="tab-badge-faktenchecks"></span></button>
<button class="tab-btn" data-tab="quellen">Sources <span class="tab-badge" id="tab-badge-quellen"></span></button>
</div>
</div>
</div>
<main class="lagebild-main">
<div class="container">
<div class="tab-panel active" id="panel-ueberblick">
<p class="data-source-note">Data provided by AegisSight Monitor</p>
<section class="content-card">
<div class="card-header">
<h2 id="ueberblick-title">Latest Developments</h2>
<span class="card-timestamp" id="ueberblick-timestamp"></span>
</div>
<div class="card-body" id="ueberblick-content">
<div class="loading-skeleton"><div class="skeleton-line"></div><div class="skeleton-line"></div><div class="skeleton-line short"></div></div>
</div>
</section>
</div>
<div class="tab-panel" id="panel-lagebild">
<p class="data-source-note">Data provided by AegisSight Monitor</p>
<section class="content-card">
<div class="card-header">
<h2 id="lagebild-date-title">Briefing</h2>
<span class="card-timestamp" id="lagebild-timestamp"></span>
</div>
<div class="card-body" id="summary-content">
<div class="loading-skeleton"><div class="skeleton-line"></div><div class="skeleton-line"></div><div class="skeleton-line short"></div></div>
</div>
<div class="card-footer" id="inline-sources"></div>
</section>
</div>
<div class="tab-panel" id="panel-quellen">
<section class="content-card">
<div class="card-header"><h2>Sources</h2><p class="card-description">All sources monitored by AegisSight Monitor</p></div>
<div class="card-body" id="sources-grid-container"><div class="loading-skeleton"><div class="skeleton-line"></div><div class="skeleton-line short"></div></div></div>
</section>
</div>
<div class="tab-panel" id="panel-karte">
<section class="content-card">
<div class="card-header"><h2>Map</h2><p class="card-description">Geographic distribution of reports</p></div>
<div class="card-body"><div id="map-container" style="height:500px;border-radius:4px;overflow:hidden;"></div></div>
</section>
</div>
<div class="tab-panel" id="panel-faktenchecks">
<section class="content-card">
<div class="card-header"><h2>Fact Checks</h2><p class="card-description">AI-powered verification of all key statements against independent sources.</p></div>
<div class="card-body" id="factchecks-content"></div>
</section>
</div>
</div>
</main>
<footer class="footer">
<div class="container">
<div class="footer-content">
<div class="footer-section"><h4>AegisSight UG (haftungsbeschränkt)</h4><p>Gladbacher Strasse 3-5</p><p>40764 Langenfeld, Germany</p></div>
<div class="footer-section"><h4>Navigation</h4><ul><li><a href="/en/">Home</a></li><li><a href="/en/#features">Features</a></li><li><a href="/en/#demos">Live Reports</a></li><li><a href="/en/#trust">About Us</a></li><li><a href="/en/#contact">Contact</a></li></ul></div>
<div class="footer-section"><h4>Legal</h4><ul><li><a href="/en/legal-notice.html">Legal notice</a></li><li><a href="/en/privacy.html">Privacy policy</a></li><li><a href="#" id="cookie-settings-link">Cookie settings</a></li></ul></div>
<div class="footer-section"><h4>Contact</h4><p>info@aegis-sight.de</p></div>
</div>
<p class="copyright">&copy; 2026 AegisSight UG (haftungsbeschränkt). All rights reserved.</p>
</div>
</footer>
<script src="/js/mobile-nav.js"></script>
<script src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js"></script>
<script src="https://unpkg.com/leaflet.markercluster@1.5.3/dist/leaflet.markercluster.js"></script>
<script src="/lagen/iran-konflikt/lagebild.js"></script>
<script src="/cookie-consent.js"></script>
</body>
</html>

Datei anzeigen

@@ -0,0 +1,224 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Research: Legal status of deepfakes in Germany - AegisSight</title>
<meta name="robots" content="noindex, nofollow, noarchive, nosnippet, noimageindex">
<link rel="alternate" hreflang="de" href="https://aegis-sight.de/lagen/deepfakes/">
<link rel="alternate" hreflang="en" href="https://aegis-sight.de/en/situations/deepfakes/">
<link rel="alternate" hreflang="x-default" href="https://aegis-sight.de/lagen/deepfakes/">
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
<link rel="stylesheet" href="/css/main.css">
<link rel="stylesheet" href="/css/fonts.css">
<link rel="stylesheet" href="/css/mobile.css">
<link rel="stylesheet" href="/css/lang-switcher.css">
<link rel="stylesheet" href="/lagen/iran-konflikt/lagebild.css">
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css" />
<link rel="stylesheet" href="https://unpkg.com/leaflet.markercluster@1.5.3/dist/MarkerCluster.css">
<link rel="stylesheet" href="https://unpkg.com/leaflet.markercluster@1.5.3/dist/MarkerCluster.Default.css">
<link rel="stylesheet" href="/cookie-consent.css">
<script>window.LAGEBILD_DATA_BASE = '/lagen/deepfakes/';</script>
</head>
<body class="lagebild-page">
<!-- Scroll Progress Bar -->
<div class="scroll-progress" id="scroll-progress"></div>
<!-- Navigation -->
<nav class="navbar" role="navigation">
<div class="nav-container">
<div class="logo">
<a href="/en/"><img src="/assets/images/logos/Logo+Schrift_Rechts.png" alt="AegisSight" class="logo-img"></a>
</div>
<ul class="nav-menu">
<li><a href="/en/">Home</a></li>
<li><a href="/en/#trust">About Us</a></li>
<li><a href="/en/#features">Features</a></li>
<li><a href="mailto:info@aegis-sight.de">Contact</a></li>
</ul>
<div class="nav-extras">
<div class="lang-switcher" role="group" aria-label="Language">
<a class="lang-link" href="/lagen/deepfakes/" lang="de" hreflang="de" rel="alternate">DE</a>
<span class="lang-sep" aria-hidden="true">|</span>
<span class="lang-active" lang="en" aria-current="true">EN</span>
</div>
<button class="mobile-menu-toggle" aria-label="Open menu" aria-expanded="false">
<span class="hamburger"><span></span><span></span><span></span></span>
</button>
</div>
</div>
</nav>
<!-- Mobile Navigation -->
<div class="nav-menu-mobile" aria-hidden="true">
<button class="mobile-menu-close" aria-label="Close menu">
<svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M18 6L6 18M6 6l12 12" stroke="currentColor"/></svg>
</button>
<ul>
<li><a href="/en/">Home</a></li>
<li><a href="/en/#trust">About Us</a></li>
<li><a href="/en/#features">Features</a></li>
<li><a href="mailto:info@aegis-sight.de">Contact</a></li>
</ul>
<div class="lang-switcher" role="group" aria-label="Language">
<a class="lang-link" href="/lagen/deepfakes/" lang="de" hreflang="de" rel="alternate">DE</a>
<span class="lang-sep" aria-hidden="true">|</span>
<span class="lang-active" lang="en" aria-current="true">EN</span>
</div>
</div>
<div class="mobile-menu-overlay"></div>
<!-- Hero Section -->
<section class="lagebild-hero">
<canvas id="hero-particles"></canvas>
<div class="hero-bg-pattern"></div>
<div class="container">
<h1 id="hero-title">RESEARCH BRIEFING</h1>
<p class="hero-incident-title" id="incident-title"></p>
<div class="hero-stats" id="hero-stats"></div>
</div>
</section>
<!-- Control Bar: Timeline + Tabs -->
<div class="control-bar">
<div class="container">
<div class="timeline-wrapper">
<div class="timeline-strip" id="timeline-strip"></div>
<div class="timeline-dropdown" id="timeline-dropdown"></div>
</div>
<div class="tab-nav" id="tab-nav">
<button class="tab-btn active" data-tab="ueberblick">Summary</button>
<button class="tab-btn" data-tab="lagebild">Research</button>
<button class="tab-btn" data-tab="karte">Map</button>
<button class="tab-btn" data-tab="faktenchecks">Fact Checks <span class="tab-badge" id="tab-badge-faktenchecks"></span></button>
<button class="tab-btn" data-tab="quellen">Sources <span class="tab-badge" id="tab-badge-quellen"></span></button>
</div>
</div>
</div>
<!-- Main Content -->
<main class="lagebild-main">
<div class="container">
<!-- Tab: Summary -->
<div class="tab-panel active" id="panel-ueberblick">
<p class="data-source-note">Data provided by AegisSight Monitor</p>
<section class="content-card">
<div class="card-header">
<h2 id="ueberblick-title">Summary</h2>
<span class="card-timestamp" id="ueberblick-timestamp"></span>
</div>
<div class="card-body" id="ueberblick-content">
<div class="loading-skeleton">
<div class="skeleton-line"></div>
<div class="skeleton-line"></div>
<div class="skeleton-line short"></div>
</div>
</div>
</section>
</div>
<!-- Tab: Research -->
<div class="tab-panel" id="panel-lagebild">
<p class="data-source-note">Data provided by AegisSight Monitor</p>
<section class="content-card">
<div class="card-header">
<h2 id="lagebild-date-title">Research</h2>
<span class="card-timestamp" id="lagebild-timestamp"></span>
</div>
<div class="card-body" id="summary-content">
<div class="loading-skeleton">
<div class="skeleton-line"></div>
<div class="skeleton-line"></div>
<div class="skeleton-line short"></div>
</div>
</div>
<div class="card-footer" id="inline-sources"></div>
</section>
</div>
<!-- Tab: Sources -->
<div class="tab-panel" id="panel-quellen">
<section class="content-card">
<div class="card-header">
<h2>Sources</h2>
<p class="card-description">All sources analysed by AegisSight Monitor</p>
</div>
<div class="card-body" id="sources-grid-container">
<div class="loading-skeleton">
<div class="skeleton-line"></div>
<div class="skeleton-line short"></div>
</div>
</div>
</section>
</div>
<!-- Tab: Map -->
<div class="tab-panel" id="panel-karte">
<section class="content-card">
<div class="card-header">
<h2>Map</h2>
<p class="card-description">Geographic distribution of sources</p>
</div>
<div class="card-body">
<div id="map-container" style="height:500px;border-radius:4px;overflow:hidden;"></div>
</div>
</section>
</div>
<!-- Tab: Fact Checks -->
<div class="tab-panel" id="panel-faktenchecks">
<section class="content-card">
<div class="card-header">
<h2>Fact Checks</h2>
<p class="card-description">AI-powered verification of all key statements against independent sources.</p>
</div>
<div class="card-body" id="factchecks-content"></div>
</section>
</div>
</div>
</main>
<!-- Footer -->
<footer class="footer">
<div class="container">
<div class="footer-content">
<div class="footer-section">
<h4>AegisSight UG (haftungsbeschränkt)</h4>
<p>Gladbacher Strasse 3-5</p>
<p>40764 Langenfeld, Germany</p>
</div>
<div class="footer-section">
<h4>Navigation</h4>
<ul>
<li><a href="/en/">Home</a></li>
<li><a href="/en/#features">Features</a></li>
<li><a href="/en/#demos">Live Reports</a></li>
<li><a href="/en/#trust">About Us</a></li>
<li><a href="/en/#contact">Contact</a></li>
</ul>
</div>
<div class="footer-section">
<h4>Legal</h4>
<ul>
<li><a href="/en/legal-notice.html">Legal notice</a></li>
<li><a href="/en/privacy.html">Privacy policy</a></li>
<li><a href="#" id="cookie-settings-link">Cookie settings</a></li>
</ul>
</div>
<div class="footer-section">
<h4>Contact</h4>
<p>info@aegis-sight.de</p>
</div>
</div>
<p class="copyright">&copy; 2026 AegisSight UG (haftungsbeschränkt). All rights reserved.</p>
</div>
</footer>
<!-- Scripts -->
<script src="/js/mobile-nav.js"></script>
<script src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js"></script>
<script src="https://unpkg.com/leaflet.markercluster@1.5.3/dist/leaflet.markercluster.js"></script>
<script src="/lagen/iran-konflikt/lagebild.js"></script>
<script src="/cookie-consent.js"></script>
</body>
</html>

Datei anzeigen

@@ -0,0 +1,226 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Situation report: Iran conflict - AegisSight</title>
<meta name="robots" content="noindex, nofollow, noarchive, nosnippet, noimageindex">
<link rel="alternate" hreflang="de" href="https://aegis-sight.de/lagen/iran-konflikt/">
<link rel="alternate" hreflang="en" href="https://aegis-sight.de/en/situations/iran-conflict/">
<link rel="alternate" hreflang="x-default" href="https://aegis-sight.de/lagen/iran-konflikt/">
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
<link rel="stylesheet" href="/css/main.css">
<link rel="stylesheet" href="/css/fonts.css">
<link rel="stylesheet" href="/css/mobile.css">
<link rel="stylesheet" href="/css/lang-switcher.css">
<link rel="stylesheet" href="/lagen/iran-konflikt/lagebild.css">
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css" />
<link rel="stylesheet" href="https://unpkg.com/leaflet.markercluster@1.5.3/dist/MarkerCluster.css">
<link rel="stylesheet" href="https://unpkg.com/leaflet.markercluster@1.5.3/dist/MarkerCluster.Default.css">
<link rel="stylesheet" href="/cookie-consent.css">
<script>window.LAGEBILD_DATA_BASE = '/lagen/iran-konflikt/';</script>
</head>
<body class="lagebild-page">
<!-- Scroll Progress Bar -->
<div class="scroll-progress" id="scroll-progress"></div>
<!-- Navigation -->
<nav class="navbar" role="navigation">
<div class="nav-container">
<div class="logo">
<a href="/en/"><img src="/assets/images/logos/Logo+Schrift_Rechts.png" alt="AegisSight" class="logo-img"></a>
</div>
<ul class="nav-menu">
<li><a href="/en/">Home</a></li>
<li><a href="/en/#trust">About Us</a></li>
<li><a href="/en/#features">Features</a></li>
<li><a href="mailto:info@aegis-sight.de">Contact</a></li>
</ul>
<div class="nav-extras">
<div class="lang-switcher" role="group" aria-label="Language">
<a class="lang-link" href="/lagen/iran-konflikt/" lang="de" hreflang="de" rel="alternate">DE</a>
<span class="lang-sep" aria-hidden="true">|</span>
<span class="lang-active" lang="en" aria-current="true">EN</span>
</div>
<button class="mobile-menu-toggle" aria-label="Open menu" aria-expanded="false">
<span class="hamburger"><span></span><span></span><span></span></span>
</button>
</div>
</div>
</nav>
<!-- Mobile Navigation -->
<div class="nav-menu-mobile" aria-hidden="true">
<button class="mobile-menu-close" aria-label="Close menu">
<svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M18 6L6 18M6 6l12 12" stroke="currentColor"/></svg>
</button>
<ul>
<li><a href="/en/">Home</a></li>
<li><a href="/en/#trust">About Us</a></li>
<li><a href="/en/#features">Features</a></li>
<li><a href="mailto:info@aegis-sight.de">Contact</a></li>
</ul>
<div class="lang-switcher" role="group" aria-label="Language">
<a class="lang-link" href="/lagen/iran-konflikt/" lang="de" hreflang="de" rel="alternate">DE</a>
<span class="lang-sep" aria-hidden="true">|</span>
<span class="lang-active" lang="en" aria-current="true">EN</span>
</div>
</div>
<div class="mobile-menu-overlay"></div>
<!-- Hero Section -->
<section class="lagebild-hero">
<canvas id="hero-particles"></canvas>
<div class="hero-bg-pattern"></div>
<div class="container">
<h1 id="hero-title">SITUATION REPORT</h1>
<p class="hero-incident-title" id="incident-title"></p>
<!-- Stat Cards -->
<div class="hero-stats" id="hero-stats"></div>
</div>
</section>
<!-- Control Bar: Timeline + Tabs -->
<div class="control-bar">
<div class="container">
<div class="timeline-wrapper">
<div class="timeline-strip" id="timeline-strip"></div>
<div class="timeline-dropdown" id="timeline-dropdown"></div>
</div>
<div class="tab-nav" id="tab-nav">
<button class="tab-btn active" data-tab="ueberblick">Latest Developments</button>
<button class="tab-btn" data-tab="lagebild">Briefing</button>
<button class="tab-btn" data-tab="karte">Map</button>
<button class="tab-btn" data-tab="faktenchecks">Fact Checks <span class="tab-badge" id="tab-badge-faktenchecks"></span></button>
<button class="tab-btn" data-tab="quellen">Sources <span class="tab-badge" id="tab-badge-quellen"></span></button>
</div>
</div>
</div>
<!-- Main Content -->
<main class="lagebild-main">
<div class="container">
<!-- Tab: Latest Developments / Summary -->
<div class="tab-panel active" id="panel-ueberblick">
<p class="data-source-note">Data provided by AegisSight Monitor</p>
<section class="content-card">
<div class="card-header">
<h2 id="ueberblick-title">Latest Developments</h2>
<span class="card-timestamp" id="ueberblick-timestamp"></span>
</div>
<div class="card-body" id="ueberblick-content">
<div class="loading-skeleton">
<div class="skeleton-line"></div>
<div class="skeleton-line"></div>
<div class="skeleton-line short"></div>
</div>
</div>
</section>
</div>
<!-- Tab: Briefing -->
<div class="tab-panel" id="panel-lagebild">
<p class="data-source-note">Data provided by AegisSight Monitor</p>
<section class="content-card">
<div class="card-header">
<h2 id="lagebild-date-title">Briefing</h2>
<span class="card-timestamp" id="lagebild-timestamp"></span>
</div>
<div class="card-body" id="summary-content">
<div class="loading-skeleton">
<div class="skeleton-line"></div>
<div class="skeleton-line"></div>
<div class="skeleton-line short"></div>
</div>
</div>
<div class="card-footer" id="inline-sources"></div>
</section>
</div>
<!-- Tab: Sources -->
<div class="tab-panel" id="panel-quellen">
<section class="content-card">
<div class="card-header">
<h2>Sources</h2>
<p class="card-description">All sources monitored by AegisSight Monitor</p>
</div>
<div class="card-body" id="sources-grid-container">
<div class="loading-skeleton">
<div class="skeleton-line"></div>
<div class="skeleton-line short"></div>
</div>
</div>
</section>
</div>
<!-- Tab: Map -->
<div class="tab-panel" id="panel-karte">
<section class="content-card">
<div class="card-header">
<h2>Map</h2>
<p class="card-description">Geographic distribution of reports</p>
</div>
<div class="card-body">
<div id="map-container" style="height:500px;border-radius:4px;overflow:hidden;"></div>
</div>
</section>
</div>
<!-- Tab: Fact Checks -->
<div class="tab-panel" id="panel-faktenchecks">
<section class="content-card">
<div class="card-header">
<h2>Fact Checks</h2>
<p class="card-description">AI-powered verification of all key statements against independent sources. Statements are continuously checked against new sources – when new evidence appears, the status is updated automatically.</p>
</div>
<div class="card-body" id="factchecks-content"></div>
</section>
</div>
</div>
</main>
<!-- Footer -->
<footer class="footer">
<div class="container">
<div class="footer-content">
<div class="footer-section">
<h4>AegisSight UG (haftungsbeschränkt)</h4>
<p>Gladbacher Strasse 3-5</p>
<p>40764 Langenfeld, Germany</p>
</div>
<div class="footer-section">
<h4>Navigation</h4>
<ul>
<li><a href="/en/">Home</a></li>
<li><a href="/en/#features">Features</a></li>
<li><a href="/en/#demos">Live Reports</a></li>
<li><a href="/en/#trust">About Us</a></li>
<li><a href="/en/#contact">Contact</a></li>
</ul>
</div>
<div class="footer-section">
<h4>Legal</h4>
<ul>
<li><a href="/en/legal-notice.html">Legal notice</a></li>
<li><a href="/en/privacy.html">Privacy policy</a></li>
<li><a href="#" id="cookie-settings-link">Cookie settings</a></li>
</ul>
</div>
<div class="footer-section">
<h4>Contact</h4>
<p>info@aegis-sight.de</p>
</div>
</div>
<p class="copyright">&copy; 2026 AegisSight UG (haftungsbeschränkt). All rights reserved.</p>
</div>
</footer>
<!-- Scripts -->
<script src="/js/mobile-nav.js"></script>
<script src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js"></script>
<script src="https://unpkg.com/leaflet.markercluster@1.5.3/dist/leaflet.markercluster.js"></script>
<script src="/lagen/iran-konflikt/lagebild.js"></script>
<script src="/cookie-consent.js"></script>
</body>
</html>

Datei anzeigen

@@ -2,6 +2,10 @@
(function () { (function () {
'use strict'; 'use strict';
/* ==================== LANGUAGE ==================== */
var SITE_LANG = (document.documentElement.lang || 'de').toLowerCase().indexOf('en') === 0 ? 'en' : 'de';
var SUMMARY_FILE = SITE_LANG === 'en' ? 'summary_en.json' : 'summary.json';
/* ==================== NAVBAR ==================== */ /* ==================== NAVBAR ==================== */
var navbar = document.getElementById('navbar'); var navbar = document.getElementById('navbar');
window.addEventListener('scroll', function () { window.addEventListener('scroll', function () {
@@ -197,11 +201,19 @@
var lageData = {}; var lageData = {};
var dataLoaded = false; var dataLoaded = false;
var lageTitles = { var lageTitlesByLang = {
'iran-konflikt': 'Gro\u00dflage - Irankonflikt', de: {
'cyberangriffe': 'Cyberangriffe auf deutsche Infrastruktur', 'iran-konflikt': 'Gro\u00dflage - Irankonflikt',
'deepfakes': 'Rechtliche Lage von Deepfakes in Deutschland' 'cyberangriffe': 'Cyberangriffe auf deutsche Infrastruktur',
'deepfakes': 'Rechtliche Lage von Deepfakes in Deutschland'
},
en: {
'iran-konflikt': 'Major situation - Iran conflict',
'cyberangriffe': 'Cyberattacks on German infrastructure',
'deepfakes': 'Legal status of deepfakes in Germany'
}
}; };
var lageTitles = lageTitlesByLang[SITE_LANG] || lageTitlesByLang.de;
/* ==================== 3D CAROUSEL ==================== */ /* ==================== 3D CAROUSEL ==================== */
var cards = document.querySelectorAll('.carousel-card'); var cards = document.querySelectorAll('.carousel-card');
@@ -427,7 +439,8 @@ function mdToHtml(md) {
} }
function loadLiveData() { function loadLiveData() {
fetch('/lagen/iran-konflikt/data/summary.json?t=' + Date.now()) fetch('/lagen/iran-konflikt/data/' + SUMMARY_FILE + '?t=' + Date.now())
.then(function (r) { if (!r.ok && SITE_LANG === 'en') return fetch('/lagen/iran-konflikt/data/summary.json?t=' + Date.now()); return r; })
.then(function (r) { if (!r.ok) throw new Error(r.status); return r.json(); }) .then(function (r) { if (!r.ok) throw new Error(r.status); return r.json(); })
.then(function (data) { .then(function (data) {
var inc = data.incident || {}; var inc = data.incident || {};
@@ -532,7 +545,12 @@ function mdToHtml(md) {
mentioned: '#7b7b7b' mentioned: '#7b7b7b'
}; };
var defaultLabels = { var defaultLabels = SITE_LANG === 'en' ? {
primary: 'Primary',
secondary: 'Reactions',
tertiary: 'Involved',
mentioned: 'Mentioned'
} : {
primary: 'Hauptgeschehen', primary: 'Hauptgeschehen',
secondary: 'Reaktionen', secondary: 'Reaktionen',
tertiary: 'Beteiligte', tertiary: 'Beteiligte',
@@ -582,7 +600,7 @@ function mdToHtml(md) {
legend.onAdd = function () { legend.onAdd = function () {
var div = L.DomUtil.create('div'); var div = L.DomUtil.create('div');
div.style.cssText = 'background:#151D2E;padding:10px 14px;border-radius:4px;border:1px solid #1E2D45;box-shadow:0 2px 8px rgba(0,0,0,0.3);font-size:0.8rem;line-height:1.8;color:#E8ECF4;'; div.style.cssText = 'background:#151D2E;padding:10px 14px;border-radius:4px;border:1px solid #1E2D45;box-shadow:0 2px 8px rgba(0,0,0,0.3);font-size:0.8rem;line-height:1.8;color:#E8ECF4;';
var html = '<strong style="color:#C8A851;">Legende</strong><br>'; var html = '<strong style="color:#C8A851;">' + (SITE_LANG === 'en' ? 'Legend' : 'Legende') + '</strong><br>';
['primary', 'secondary', 'tertiary', 'mentioned'].forEach(function (cat) { ['primary', 'secondary', 'tertiary', 'mentioned'].forEach(function (cat) {
if (usedCategories[cat]) { if (usedCategories[cat]) {
html += '<span style="color:' + categoryColors[cat] + ';">&#9679;</span> ' + categoryLabels[cat] + '<br>'; html += '<span style="color:' + categoryColors[cat] + ';">&#9679;</span> ' + categoryLabels[cat] + '<br>';
@@ -631,8 +649,12 @@ function mdToHtml(md) {
// Form submit -> server-side SMTP // Form submit -> server-side SMTP
window.submitContact = function (e) { window.submitContact = function (e) {
e.preventDefault(); e.preventDefault();
var lang = (document.documentElement.lang || 'de').toLowerCase().indexOf('en') === 0 ? 'en' : 'de';
var T = lang === 'en'
? { sending: 'Sending...', send: 'Send message', sendError: 'Error sending message', netError: 'Connection error. Please try again.' }
: { sending: 'Wird gesendet...', send: 'Nachricht senden', sendError: 'Fehler beim Senden', netError: 'Verbindungsfehler. Bitte versuchen Sie es erneut.' };
var btn = e.target.querySelector('button[type="submit"]'); var btn = e.target.querySelector('button[type="submit"]');
if (btn) { btn.disabled = true; btn.textContent = 'Wird gesendet...'; } if (btn) { btn.disabled = true; btn.textContent = T.sending; }
fetch('/api/contact', { fetch('/api/contact', {
method: 'POST', method: 'POST',
@@ -641,7 +663,8 @@ function mdToHtml(md) {
name: document.getElementById('cf-name').value, name: document.getElementById('cf-name').value,
organisation: document.getElementById('cf-org').value, organisation: document.getElementById('cf-org').value,
email: document.getElementById('cf-email').value, email: document.getElementById('cf-email').value,
message: document.getElementById('cf-message').value message: document.getElementById('cf-message').value,
lang: lang
}) })
}) })
.then(function (r) { return r.json().then(function (d) { return { ok: r.ok, data: d }; }); }) .then(function (r) { return r.json().then(function (d) { return { ok: r.ok, data: d }; }); })
@@ -651,20 +674,21 @@ function mdToHtml(md) {
document.getElementById('form-success').style.display = 'block'; document.getElementById('form-success').style.display = 'block';
if (window.umami) umami.track('contact_form_success'); if (window.umami) umami.track('contact_form_success');
} else { } else {
alert(res.data.error || 'Fehler beim Senden'); alert(res.data.error || T.sendError);
if (btn) { btn.disabled = false; btn.textContent = 'Nachricht senden'; } if (btn) { btn.disabled = false; btn.textContent = T.send; }
} }
}) })
.catch(function () { .catch(function () {
alert('Verbindungsfehler. Bitte versuchen Sie es erneut.'); alert(T.netError);
if (btn) { btn.disabled = false; btn.textContent = 'Nachricht senden'; } if (btn) { btn.disabled = false; btn.textContent = T.send; }
}); });
return false; return false;
}; };
/* ==================== LOAD DEEPFAKES DATA ==================== */ /* ==================== LOAD DEEPFAKES DATA ==================== */
function loadDeepfakesData() { function loadDeepfakesData() {
fetch('/lagen/deepfakes/data/summary.json?t=' + Date.now()) fetch('/lagen/deepfakes/data/' + SUMMARY_FILE + '?t=' + Date.now())
.then(function (r) { if (!r.ok && SITE_LANG === 'en') return fetch('/lagen/deepfakes/data/summary.json?t=' + Date.now()); return r; })
.then(function (r) { if (!r.ok) throw new Error(r.status); return r.json(); }) .then(function (r) { if (!r.ok) throw new Error(r.status); return r.json(); })
.then(function (data) { .then(function (data) {
var excerptEl = document.getElementById('excerpt-text-deepfakes'); var excerptEl = document.getElementById('excerpt-text-deepfakes');
@@ -691,7 +715,8 @@ function mdToHtml(md) {
/* ==================== LOAD CYBERANGRIFFE DATA ==================== */ /* ==================== LOAD CYBERANGRIFFE DATA ==================== */
function loadCyberangriffeData() { function loadCyberangriffeData() {
fetch('/lagen/cyberangriffe/data/summary.json?t=' + Date.now()) fetch('/lagen/cyberangriffe/data/' + SUMMARY_FILE + '?t=' + Date.now())
.then(function (r) { if (!r.ok && SITE_LANG === 'en') return fetch('/lagen/cyberangriffe/data/summary.json?t=' + Date.now()); return r; })
.then(function (r) { if (!r.ok) throw new Error(r.status); return r.json(); }) .then(function (r) { if (!r.ok) throw new Error(r.status); return r.json(); })
.then(function (data) { .then(function (data) {
var excerptEl = document.getElementById('excerpt-text-cyberangriffe'); var excerptEl = document.getElementById('excerpt-text-cyberangriffe');

Datei anzeigen

Datei anzeigen

@@ -5,6 +5,9 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Lagebild: Cyberangriffe auf deutsche Infrastruktur - AegisSight</title> <title>Lagebild: Cyberangriffe auf deutsche Infrastruktur - AegisSight</title>
<meta name="robots" content="noindex, nofollow, noarchive, nosnippet, noimageindex"> <meta name="robots" content="noindex, nofollow, noarchive, nosnippet, noimageindex">
<link rel="alternate" hreflang="de" href="https://aegis-sight.de/lagen/cyberangriffe/">
<link rel="alternate" hreflang="en" href="https://aegis-sight.de/en/situations/cyber-attacks/">
<link rel="alternate" hreflang="x-default" href="https://aegis-sight.de/lagen/cyberangriffe/">
<link rel="icon" type="image/svg+xml" href="/favicon.svg"> <link rel="icon" type="image/svg+xml" href="/favicon.svg">
<link rel="stylesheet" href="/css/main.css"> <link rel="stylesheet" href="/css/main.css">
<link rel="stylesheet" href="/css/fonts.css"> <link rel="stylesheet" href="/css/fonts.css">
@@ -33,7 +36,7 @@
<div class="lang-switcher" role="group" aria-label="Sprache"> <div class="lang-switcher" role="group" aria-label="Sprache">
<span class="lang-active" lang="de" aria-current="true">DE</span> <span class="lang-active" lang="de" aria-current="true">DE</span>
<span class="lang-sep" aria-hidden="true">|</span> <span class="lang-sep" aria-hidden="true">|</span>
<a class="lang-link" href="/en/" lang="en" hreflang="en" rel="alternate">EN</a> <a class="lang-link" href="/en/situations/cyber-attacks/" lang="en" hreflang="en" rel="alternate">EN</a>
</div> </div>
<button class="mobile-menu-toggle" aria-label="Menü öffnen" aria-expanded="false"> <button class="mobile-menu-toggle" aria-label="Menü öffnen" aria-expanded="false">
<span class="hamburger"><span></span><span></span><span></span></span> <span class="hamburger"><span></span><span></span><span></span></span>
@@ -54,7 +57,7 @@
<div class="lang-switcher" role="group" aria-label="Sprache"> <div class="lang-switcher" role="group" aria-label="Sprache">
<span class="lang-active" lang="de" aria-current="true">DE</span> <span class="lang-active" lang="de" aria-current="true">DE</span>
<span class="lang-sep" aria-hidden="true">|</span> <span class="lang-sep" aria-hidden="true">|</span>
<a class="lang-link" href="/en/" lang="en" hreflang="en" rel="alternate">EN</a> <a class="lang-link" href="/en/situations/cyber-attacks/" lang="en" hreflang="en" rel="alternate">EN</a>
</div> </div>
</div> </div>
<div class="mobile-menu-overlay"></div> <div class="mobile-menu-overlay"></div>

Datei anzeigen

Datei anzeigen

@@ -5,6 +5,9 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Recherche: Rechtliche Lage von Deepfakes in Deutschland - AegisSight</title> <title>Recherche: Rechtliche Lage von Deepfakes in Deutschland - AegisSight</title>
<meta name="robots" content="noindex, nofollow, noarchive, nosnippet, noimageindex"> <meta name="robots" content="noindex, nofollow, noarchive, nosnippet, noimageindex">
<link rel="alternate" hreflang="de" href="https://aegis-sight.de/lagen/deepfakes/">
<link rel="alternate" hreflang="en" href="https://aegis-sight.de/en/situations/deepfakes/">
<link rel="alternate" hreflang="x-default" href="https://aegis-sight.de/lagen/deepfakes/">
<link rel="icon" type="image/svg+xml" href="/favicon.svg"> <link rel="icon" type="image/svg+xml" href="/favicon.svg">
<link rel="stylesheet" href="/css/main.css"> <link rel="stylesheet" href="/css/main.css">
<link rel="stylesheet" href="/css/fonts.css"> <link rel="stylesheet" href="/css/fonts.css">
@@ -36,7 +39,7 @@
<div class="lang-switcher" role="group" aria-label="Sprache"> <div class="lang-switcher" role="group" aria-label="Sprache">
<span class="lang-active" lang="de" aria-current="true">DE</span> <span class="lang-active" lang="de" aria-current="true">DE</span>
<span class="lang-sep" aria-hidden="true">|</span> <span class="lang-sep" aria-hidden="true">|</span>
<a class="lang-link" href="/en/" lang="en" hreflang="en" rel="alternate">EN</a> <a class="lang-link" href="/en/situations/deepfakes/" lang="en" hreflang="en" rel="alternate">EN</a>
</div> </div>
<button class="mobile-menu-toggle" aria-label="Menü öffnen" aria-expanded="false"> <button class="mobile-menu-toggle" aria-label="Menü öffnen" aria-expanded="false">
<span class="hamburger"><span></span><span></span><span></span></span> <span class="hamburger"><span></span><span></span><span></span></span>
@@ -59,7 +62,7 @@
<div class="lang-switcher" role="group" aria-label="Sprache"> <div class="lang-switcher" role="group" aria-label="Sprache">
<span class="lang-active" lang="de" aria-current="true">DE</span> <span class="lang-active" lang="de" aria-current="true">DE</span>
<span class="lang-sep" aria-hidden="true">|</span> <span class="lang-sep" aria-hidden="true">|</span>
<a class="lang-link" href="/en/" lang="en" hreflang="en" rel="alternate">EN</a> <a class="lang-link" href="/en/situations/deepfakes/" lang="en" hreflang="en" rel="alternate">EN</a>
</div> </div>
</div> </div>
<div class="mobile-menu-overlay"></div> <div class="mobile-menu-overlay"></div>

Datei anzeigen

Datei anzeigen

@@ -5,6 +5,9 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Lagebild Irankonflikt - AegisSight</title> <title>Lagebild Irankonflikt - AegisSight</title>
<meta name="robots" content="noindex, nofollow, noarchive, nosnippet, noimageindex"> <meta name="robots" content="noindex, nofollow, noarchive, nosnippet, noimageindex">
<link rel="alternate" hreflang="de" href="https://aegis-sight.de/lagen/iran-konflikt/">
<link rel="alternate" hreflang="en" href="https://aegis-sight.de/en/situations/iran-conflict/">
<link rel="alternate" hreflang="x-default" href="https://aegis-sight.de/lagen/iran-konflikt/">
<link rel="icon" type="image/svg+xml" href="/favicon.svg"> <link rel="icon" type="image/svg+xml" href="/favicon.svg">
<link rel="stylesheet" href="/css/main.css"> <link rel="stylesheet" href="/css/main.css">
<link rel="stylesheet" href="/css/fonts.css"> <link rel="stylesheet" href="/css/fonts.css">
@@ -36,7 +39,7 @@
<div class="lang-switcher" role="group" aria-label="Sprache"> <div class="lang-switcher" role="group" aria-label="Sprache">
<span class="lang-active" lang="de" aria-current="true">DE</span> <span class="lang-active" lang="de" aria-current="true">DE</span>
<span class="lang-sep" aria-hidden="true">|</span> <span class="lang-sep" aria-hidden="true">|</span>
<a class="lang-link" href="/en/" lang="en" hreflang="en" rel="alternate">EN</a> <a class="lang-link" href="/en/situations/iran-conflict/" lang="en" hreflang="en" rel="alternate">EN</a>
</div> </div>
<button class="mobile-menu-toggle" aria-label="Menü öffnen" aria-expanded="false"> <button class="mobile-menu-toggle" aria-label="Menü öffnen" aria-expanded="false">
<span class="hamburger"><span></span><span></span><span></span></span> <span class="hamburger"><span></span><span></span><span></span></span>
@@ -59,7 +62,7 @@
<div class="lang-switcher" role="group" aria-label="Sprache"> <div class="lang-switcher" role="group" aria-label="Sprache">
<span class="lang-active" lang="de" aria-current="true">DE</span> <span class="lang-active" lang="de" aria-current="true">DE</span>
<span class="lang-sep" aria-hidden="true">|</span> <span class="lang-sep" aria-hidden="true">|</span>
<a class="lang-link" href="/en/" lang="en" hreflang="en" rel="alternate">EN</a> <a class="lang-link" href="/en/situations/iran-conflict/" lang="en" hreflang="en" rel="alternate">EN</a>
</div> </div>
</div> </div>
<div class="mobile-menu-overlay"></div> <div class="mobile-menu-overlay"></div>

Datei anzeigen

@@ -41,6 +41,8 @@ var Lagebild = {
sourceRef: "Quelle", sourceRef: "Quelle",
lastUpdate: "Letzte Aktualisierung: ", lastUpdate: "Letzte Aktualisierung: ",
minAgo: "vor {n} Min", hrsAgo: "vor {n} Std", minAgo: "vor {n} Min", hrsAgo: "vor {n} Std",
emptyDevelopments: "Noch keine Entwicklungen erfasst.",
emptySummary: "Keine Zusammenfassung verfügbar.",
}, },
en: { en: {
hero: "SITUATION REPORT", heroResearch: "RESEARCH BRIEFING", hero: "SITUATION REPORT", heroResearch: "RESEARCH BRIEFING",
@@ -67,11 +69,22 @@ var Lagebild = {
sourceRef: "Source", sourceRef: "Source",
lastUpdate: "Last update: ", lastUpdate: "Last update: ",
minAgo: "{n} min ago", hrsAgo: "{n} hrs ago", minAgo: "{n} min ago", hrsAgo: "{n} hrs ago",
emptyDevelopments: "No developments recorded yet.",
emptySummary: "No summary available.",
} }
}, },
curLang: function() { curLang: function() {
return (typeof getCurrentLanguage === 'function') ? getCurrentLanguage() : 'de'; var l = (document.documentElement.lang || 'de').toLowerCase();
return l.indexOf('en') === 0 ? 'en' : 'de';
},
/* Where to fetch data/current.json from. Defaults to relative ("data/")
which works on the German pages. English mirror pages set
window.LAGEBILD_DATA_BASE to the absolute path of the German page so
both languages share the same data files. */
dataBase: function() {
return (typeof window !== 'undefined' && window.LAGEBILD_DATA_BASE) || '';
}, },
t: function(key) { t: function(key) {
@@ -97,16 +110,14 @@ var Lagebild = {
}, },
async init() { async init() {
if (typeof initTranslations === 'function') {
try { initTranslations(); } catch(e) {}
}
this.initScrollProgress(); this.initScrollProgress();
this.initParticles(); this.initParticles();
try { try {
var savedLang = (typeof getCurrentLanguage === 'function') ? getCurrentLanguage() : 'de'; var savedLang = this.curLang();
var jsonFile = savedLang === 'en' ? 'data/current_en.json' : 'data/current.json'; var base = this.dataBase();
var jsonFile = base + (savedLang === 'en' ? 'data/current_en.json' : 'data/current.json');
var resp = await fetch(jsonFile + '?t=' + Date.now()); var resp = await fetch(jsonFile + '?t=' + Date.now());
if (!resp.ok && savedLang === 'en') { resp = await fetch('data/current.json?t=' + Date.now()); } if (!resp.ok && savedLang === 'en') { resp = await fetch(base + 'data/current.json?t=' + Date.now()); }
if (!resp.ok) throw new Error('HTTP ' + resp.status); if (!resp.ok) throw new Error('HTTP ' + resp.status);
this.data = await resp.json(); this.data = await resp.json();
this.currentView = { this.currentView = {
@@ -120,7 +131,6 @@ var Lagebild = {
}; };
this.render(); this.render();
this.initTabs(); this.initTabs();
this.initLangToggle();
this.initScrollReveal(); this.initScrollReveal();
this.initFloatingCta(); this.initFloatingCta();
this.initLiveFeed(); this.initLiveFeed();
@@ -150,12 +160,12 @@ var Lagebild = {
var dev = inc.latest_developments || ''; var dev = inc.latest_developments || '';
var sources = (this.currentView && this.currentView.sources_json) || []; var sources = (this.currentView && this.currentView.sources_json) || [];
var html = this.renderLatestDevelopmentsHtml(dev, sources); var html = this.renderLatestDevelopmentsHtml(dev, sources);
el.innerHTML = html || '<p class="empty-hint">Noch keine Entwicklungen erfasst.</p>'; el.innerHTML = html || '<p class="empty-hint">' + this.t('emptyDevelopments') + '</p>';
} else { } else {
var md = (this.currentView && this.currentView.summary) || ''; var md = (this.currentView && this.currentView.summary) || '';
var zf = this.extractZusammenfassung(md); var zf = this.extractZusammenfassung(md);
if (!zf) { if (!zf) {
el.innerHTML = '<p class="empty-hint">Keine Zusammenfassung verf&uuml;gbar.</p>'; el.innerHTML = '<p class="empty-hint">' + this.t('emptySummary') + '</p>';
return; return;
} }
var body = this.mdToHtml(this.fixUmlauts(zf)); var body = this.mdToHtml(this.fixUmlauts(zf));
@@ -168,7 +178,7 @@ var Lagebild = {
if (src && src.url) { if (src && src.url) {
return '<a class="citation-ref" href="' + self.esc(src.url) + '" target="_blank" rel="noopener" title="' + self.esc(src.name || '') + '">[' + nr + ']</a>'; return '<a class="citation-ref" href="' + self.esc(src.url) + '" target="_blank" rel="noopener" title="' + self.esc(src.name || '') + '">[' + nr + ']</a>';
} }
return '<a class="citation-ref" title="Quelle ' + nr + '">[' + nr + ']</a>'; return '<a class="citation-ref" title="' + self.t('sourceRef') + ' ' + nr + '">[' + nr + ']</a>';
}); });
el.innerHTML = body; el.innerHTML = body;
} }
@@ -179,7 +189,7 @@ var Lagebild = {
var sections = md.split(/^## /m); var sections = md.split(/^## /m);
for (var i = 0; i < sections.length; i++) { for (var i = 0; i < sections.length; i++) {
var s = sections[i]; var s = sections[i];
if (/^zusammenfassung/i.test(s.trim())) { if (/^(zusammenfassung|summary)\b/i.test(s.trim())) {
var next = s.split(/\n## /)[0]; var next = s.split(/\n## /)[0];
return next.replace(/^[^\n]*\n?/, '').trim(); return next.replace(/^[^\n]*\n?/, '').trim();
} }
@@ -194,7 +204,7 @@ var Lagebild = {
var skipping = false; var skipping = false;
for (var i = 0; i < lines.length; i++) { for (var i = 0; i < lines.length; i++) {
var line = lines[i]; var line = lines[i];
if (/^##\s+zusammenfassung\b/i.test(line)) { skipping = true; continue; } if (/^##\s+(zusammenfassung|summary)\b/i.test(line)) { skipping = true; continue; }
if (skipping && /^##\s+/.test(line)) skipping = false; if (skipping && /^##\s+/.test(line)) skipping = false;
if (!skipping) result.push(line); if (!skipping) result.push(line);
} }
@@ -638,7 +648,7 @@ var Lagebild = {
return; return;
} }
try { try {
var resp = await fetch('data/snapshot-' + id + '.json'); var resp = await fetch(this.dataBase() + 'data/snapshot-' + id + '.json');
if (!resp.ok) throw new Error('HTTP ' + resp.status); if (!resp.ok) throw new Error('HTTP ' + resp.status);
var sd = await resp.json(); var sd = await resp.json();
var sj = sd.sources_json; var sj = sd.sources_json;
@@ -1200,74 +1210,13 @@ var Lagebild = {
} }
}, },
initLangToggle: function() {
var btn = document.querySelector('.lang-toggle');
if (!btn) return;
var self = this;
btn.addEventListener('click', function(e) {
e.preventDefault();
var cur = (typeof getCurrentLanguage === 'function') ? getCurrentLanguage() : 'de';
var newLang = cur === 'de' ? 'en' : 'de';
if (typeof switchLanguage === 'function') switchLanguage(newLang);
self.switchContent(newLang);
});
},
switchContent: async function(lang) {
var jsonFile = lang === 'en' ? 'data/current_en.json' : 'data/current.json';
try {
var resp = await fetch(jsonFile + '?t=' + Date.now());
if (!resp.ok && lang === 'en') {
resp = await fetch('data/current.json?t=' + Date.now());
}
if (!resp.ok) throw new Error('HTTP ' + resp.status);
this.data = await resp.json();
this.allSnapshots = {};
this.currentView = {
summary: this.data.current_lagebild.summary_markdown,
sources_json: this.data.current_lagebild.sources_json,
updated_at: this.data.current_lagebild.updated_at || this.data.generated_at,
articles: this.data.articles,
fact_checks: this.data.fact_checks,
article_count: this.data.incident.article_count,
fact_check_count: this.data.incident.factcheck_count
};
this.render();
// Update hero title for language
var heroH1 = document.getElementById('hero-title');
if (heroH1) {
var isResearch = this.data.incident && this.data.incident.type === 'research';
heroH1.textContent = isResearch ? this.t('heroResearch') : this.t('hero');
}
// Update tab labels
var tabBtns = document.querySelectorAll('.tab-btn');
var isResearch = this.data.incident && this.data.incident.type === 'research';
for (var i = 0; i < tabBtns.length; i++) {
var tab = tabBtns[i].getAttribute('data-tab');
if (tab === 'lagebild') tabBtns[i].childNodes[0].textContent = isResearch ? this.t('tabBriefingResearch') : this.t('tabBriefing');
else if (tab === 'ueberblick') tabBtns[i].childNodes[0].textContent = isResearch ? this.t('tabUeberblickResearch') : this.t('tabUeberblick');
else if (tab === 'karte') tabBtns[i].childNodes[0].textContent = this.t('tabMap');
else if (tab === 'faktenchecks') tabBtns[i].childNodes[0].textContent = this.t('tabFactchecks') + ' ';
else if (tab === 'quellen') tabBtns[i].childNodes[0].textContent = this.t('tabSources') + ' ';
}
// Update Ueberblick H2 title
var ueberblickH2 = document.getElementById('ueberblick-title');
if (ueberblickH2) ueberblickH2.textContent = isResearch ? this.t('tabUeberblickResearch') : this.t('tabUeberblick');
// Update data source note
var dsNote = document.querySelector('.data-source-note');
if (dsNote) dsNote.textContent = this.t('dataSource');
} catch(e) {
console.error('Language switch failed:', e);
}
},
/* ===== FLOATING CTA ===== */ /* ===== FLOATING CTA ===== */
initFloatingCta: function() { initFloatingCta: function() {
var cta = document.createElement('div'); var cta = document.createElement('div');
cta.className = 'floating-cta'; cta.className = 'floating-cta';
cta.innerHTML = '<span class="floating-cta-text">' + this.t('ctaText') + '</span>' cta.innerHTML = '<span class="floating-cta-text">' + this.t('ctaText') + '</span>'
+ '<a href="mailto:info@aegis-sight.de" class="floating-cta-btn">' + this.t('ctaButton') + '</a>' + '<a href="mailto:info@aegis-sight.de" class="floating-cta-btn">' + this.t('ctaButton') + '</a>'
+ '<button class="floating-cta-close" aria-label="Schlie\u00dfen">&times;</button>'; + '<button class="floating-cta-close" aria-label="' + this.t('srcClose') + '">&times;</button>';
document.body.appendChild(cta); document.body.appendChild(cta);
// Show after scrolling past hero // Show after scrolling past hero

Datei anzeigen

@@ -21,16 +21,49 @@
<loc>https://aegis-sight.de/lagen/iran-konflikt/</loc> <loc>https://aegis-sight.de/lagen/iran-konflikt/</loc>
<changefreq>daily</changefreq> <changefreq>daily</changefreq>
<priority>0.8</priority> <priority>0.8</priority>
<xhtml:link rel="alternate" hreflang="de" href="https://aegis-sight.de/lagen/iran-konflikt/"/>
<xhtml:link rel="alternate" hreflang="en" href="https://aegis-sight.de/en/situations/iran-conflict/"/>
<xhtml:link rel="alternate" hreflang="x-default" href="https://aegis-sight.de/lagen/iran-konflikt/"/>
</url>
<url>
<loc>https://aegis-sight.de/en/situations/iran-conflict/</loc>
<changefreq>daily</changefreq>
<priority>0.8</priority>
<xhtml:link rel="alternate" hreflang="de" href="https://aegis-sight.de/lagen/iran-konflikt/"/>
<xhtml:link rel="alternate" hreflang="en" href="https://aegis-sight.de/en/situations/iran-conflict/"/>
<xhtml:link rel="alternate" hreflang="x-default" href="https://aegis-sight.de/lagen/iran-konflikt/"/>
</url> </url>
<url> <url>
<loc>https://aegis-sight.de/lagen/cyberangriffe/</loc> <loc>https://aegis-sight.de/lagen/cyberangriffe/</loc>
<changefreq>daily</changefreq> <changefreq>daily</changefreq>
<priority>0.8</priority> <priority>0.8</priority>
<xhtml:link rel="alternate" hreflang="de" href="https://aegis-sight.de/lagen/cyberangriffe/"/>
<xhtml:link rel="alternate" hreflang="en" href="https://aegis-sight.de/en/situations/cyber-attacks/"/>
<xhtml:link rel="alternate" hreflang="x-default" href="https://aegis-sight.de/lagen/cyberangriffe/"/>
</url>
<url>
<loc>https://aegis-sight.de/en/situations/cyber-attacks/</loc>
<changefreq>daily</changefreq>
<priority>0.8</priority>
<xhtml:link rel="alternate" hreflang="de" href="https://aegis-sight.de/lagen/cyberangriffe/"/>
<xhtml:link rel="alternate" hreflang="en" href="https://aegis-sight.de/en/situations/cyber-attacks/"/>
<xhtml:link rel="alternate" hreflang="x-default" href="https://aegis-sight.de/lagen/cyberangriffe/"/>
</url> </url>
<url> <url>
<loc>https://aegis-sight.de/lagen/deepfakes/</loc> <loc>https://aegis-sight.de/lagen/deepfakes/</loc>
<changefreq>weekly</changefreq> <changefreq>weekly</changefreq>
<priority>0.7</priority> <priority>0.7</priority>
<xhtml:link rel="alternate" hreflang="de" href="https://aegis-sight.de/lagen/deepfakes/"/>
<xhtml:link rel="alternate" hreflang="en" href="https://aegis-sight.de/en/situations/deepfakes/"/>
<xhtml:link rel="alternate" hreflang="x-default" href="https://aegis-sight.de/lagen/deepfakes/"/>
</url>
<url>
<loc>https://aegis-sight.de/en/situations/deepfakes/</loc>
<changefreq>weekly</changefreq>
<priority>0.7</priority>
<xhtml:link rel="alternate" hreflang="de" href="https://aegis-sight.de/lagen/deepfakes/"/>
<xhtml:link rel="alternate" hreflang="en" href="https://aegis-sight.de/en/situations/deepfakes/"/>
<xhtml:link rel="alternate" hreflang="x-default" href="https://aegis-sight.de/lagen/deepfakes/"/>
</url> </url>
<url> <url>
<loc>https://aegis-sight.de/impressum.html</loc> <loc>https://aegis-sight.de/impressum.html</loc>