Commits vergleichen
180 Commits
fd9e02de35
...
develop
| Autor | SHA1 | Datum | |
|---|---|---|---|
|
|
8bffb169e0 | ||
|
|
dcd65616c5 | ||
|
|
e292735a50 | ||
|
|
318b74d640 | ||
|
|
65965135ca | ||
|
|
22b4d1a769 | ||
|
|
ccad9dfc20 | ||
|
|
4c1b4b6da4 | ||
|
|
51278e59ca | ||
|
|
82b3f91b33 | ||
|
|
d00bb4ba1d | ||
|
|
025ddfcebd | ||
|
|
a6481a11c0 | ||
| 5e93e5b9d1 | |||
| 49fc3a6f64 | |||
| 2840f42059 | |||
| f874d1dee0 | |||
| 645fb33898 | |||
| 8c8130509a | |||
| 3229c6b1ea | |||
|
|
3905e90467 | ||
|
|
95ada4dd39 | ||
|
|
0b979c7d85 | ||
|
|
0e0744779c | ||
|
|
2abf6f798a | ||
|
|
19620aaa4b | ||
|
|
bea7c1eb7a | ||
|
|
2a9bbb312f | ||
|
|
5367b91945 | ||
|
|
12dc13c089 | ||
|
|
10e71eecbe | ||
|
|
980dd3039e | ||
|
|
f1d17922ee | ||
|
|
fa17c1fefb | ||
|
|
c85be47307 | ||
|
|
c6931142e7 | ||
|
|
a38a6e1930 | ||
|
|
f4334863a0 | ||
|
|
a65ad6085e | ||
|
|
0f2e4083df | ||
|
|
c3bae27837 | ||
|
|
8b8072efe7 | ||
|
|
c5415f7a6b | ||
|
|
51d1c0d905 | ||
|
|
2b76e5f3bb | ||
|
|
05e5179235 | ||
|
|
442b794421 | ||
|
|
b613cb47bc | ||
|
|
87d90f07d1 | ||
|
|
c245f03203 | ||
|
|
7dd6cb991d | ||
|
|
80ce22b692 | ||
|
|
d6191584d3 | ||
|
|
9df30bcd96 | ||
|
|
964b8d47f2 | ||
|
|
0fc0d30191 | ||
|
|
fbadb45914 | ||
|
|
fb7e52a3bc | ||
|
|
f039357a7f | ||
|
|
8d01c49707 | ||
|
|
5f6cd77a47 | ||
|
|
932ff9c049 | ||
|
|
3872d32d8f | ||
|
|
0a6ec07374 | ||
|
|
3cd5623fa6 | ||
|
|
0f3cc972a5 | ||
|
|
b4236872a7 | ||
|
|
3250636208 | ||
|
|
4e0cc78190 | ||
|
|
20a004d273 | ||
|
|
d462d6d37e | ||
|
|
a9c1c73c2a | ||
|
|
26b74d35ef | ||
|
|
33f4afc7ae | ||
|
|
9e6f0b5270 | ||
|
|
85f4091e33 | ||
|
|
6f0e6028c5 | ||
|
|
2053f215e5 | ||
|
|
fa36d7267d | ||
|
|
6ec058b874 | ||
|
|
d61dcf49d3 | ||
|
|
4e2d78ee1e | ||
|
|
7bcb699ba6 | ||
|
|
efc3ca5075 | ||
|
|
f578529d94 | ||
|
|
13432c43c2 | ||
|
|
bd878de0c3 | ||
|
|
3435141547 | ||
|
|
054e310ce1 | ||
|
|
08e21bf3e8 | ||
|
|
450a86f071 | ||
|
|
78dd17338e | ||
|
|
aaafd9b848 | ||
|
|
66cbe33a6b | ||
|
|
6e7f5b5c5f | ||
|
|
b1a5293d82 | ||
|
|
251c257dfa | ||
|
|
4b49ba04ff | ||
|
|
0564198cbc | ||
|
|
44368f11cf | ||
|
|
747ea0f5e4 | ||
|
|
128d26056d | ||
|
|
dc17fbabc7 | ||
|
|
db5ba28bf1 | ||
|
|
bfc545abda | ||
|
|
9c5ce933fb | ||
|
|
d4d54a59b8 | ||
|
|
f9a19a5153 | ||
|
|
aa6da557e4 | ||
|
|
816d2a3a30 | ||
|
|
f777f44c06 | ||
|
|
beaa0adde0 | ||
|
|
f7f5be076d | ||
|
|
81f0b7121c | ||
|
|
4ebb29f941 | ||
|
|
c4387fbd34 | ||
|
|
38fb23481e | ||
|
|
d8ee667129 | ||
|
|
eab7b0608e | ||
|
|
ced090a2e2 | ||
|
|
e2d4238889 | ||
|
|
57a8645ede | ||
|
|
1415139c10 | ||
|
|
4693f3b0ba | ||
|
|
d78a41b924 | ||
|
|
5caf66dd1e | ||
|
|
9463ca87ea | ||
|
|
2c2913a48c | ||
|
|
6c71e32648 | ||
|
|
1c953bf9c7 | ||
|
|
cafaeff61c | ||
|
|
763b63cf1f | ||
|
|
27db92d124 | ||
|
|
a249f6babf | ||
|
|
814f970961 | ||
|
|
6a2832b7ae | ||
|
|
9f3a38cd8d | ||
|
|
7ac09a41aa | ||
|
|
d983bc3c73 | ||
|
|
93d5a1ecad | ||
|
|
bc29689a87 | ||
|
|
f9a0b1b3b9 | ||
|
|
039c9a6832 | ||
|
|
ccdbbdc687 | ||
|
|
8c779cd988 | ||
|
|
a7236e38fa | ||
|
|
26c82dfa86 | ||
|
|
10c023210b | ||
|
|
9f3b19def0 | ||
|
|
8189cf9add | ||
|
|
2bbe0b0bb7 | ||
|
|
fe24adf951 | ||
|
|
27f4d0a2f9 | ||
|
|
9712927746 | ||
|
|
2e2726c013 | ||
|
|
15f076b06f | ||
|
|
06c99fe4db | ||
|
|
dc0792c073 | ||
|
|
5e5cb0a3b2 | ||
|
|
3c0989545b | ||
|
|
d48c090385 | ||
|
|
2a72e5c38d | ||
|
|
b7944a78f0 | ||
|
|
fa3aa6ed12 | ||
|
|
80dfb671ce | ||
|
|
8d432e5ec9 | ||
|
|
3429a3fd9e | ||
|
|
23b6a7036d | ||
|
|
500f6129f1 | ||
|
|
3ea6acaab2 | ||
|
|
936d3971c9 | ||
|
|
e7e884d2ed | ||
|
|
a61fab12e6 | ||
|
|
afe25fc728 | ||
|
|
781216cd26 | ||
|
|
21a0ba0757 | ||
|
|
74ade5eab6 | ||
|
|
d3a1d3a64a | ||
|
|
fa3888e9cf | ||
|
|
09ad8876d3 |
@@ -8,7 +8,8 @@
|
||||
"Bash(sudo apt-get:*)",
|
||||
"Bash(sudo apt-get install:*)",
|
||||
"Bash(git add:*)",
|
||||
"Bash(rm:*)"
|
||||
"Bash(rm:*)",
|
||||
"Bash(hostname)"
|
||||
],
|
||||
"deny": []
|
||||
}
|
||||
|
||||
5
.gitignore
vendored
Normale Datei
@@ -0,0 +1,5 @@
|
||||
# Lagebild-Daten (werden per Cron-Sync vom Monitor regeneriert)
|
||||
lagebild/data/
|
||||
lagen/*/data/*
|
||||
# Aber Verzeichnis-Platzhalter behalten (Staging-Container braucht Mountpoint)
|
||||
!lagen/*/data/.gitkeep
|
||||
341
CLAUDE.md
Normale Datei
@@ -0,0 +1,341 @@
|
||||
# CLAUDE.md - AegisSight Website
|
||||
|
||||
RELATED_DOCS:
|
||||
COOKIE_CONSENT_IMPLEMENTATION.md: "Cookie-Banner Implementierung, GDPR, Testing"
|
||||
DATENSCHUTZ_ANALYTICS.md: "Textbausteine für Datenschutzerklärung"
|
||||
PROFESSIONAL_TOOLBOX_CONTENT.md: "Backup-HTML für entfernte Produktkarte"
|
||||
VIDEO_UPLOAD_INSTRUCTIONS.md: "Anleitung für manuelle Video-Uploads (Git-Limit)"
|
||||
LAUNCH-CHECKLIST.md: "Checkliste für den Launch der überarbeiteten Hauptseite"
|
||||
|
||||
PROJECT: Website
|
||||
STATUS: PRODUCTION
|
||||
URL: https://aegis-sight.de
|
||||
CONTAINER: aegis-website-nginx (+ aegis-php-fpm für /insights/)
|
||||
|
||||
COMPANY:
|
||||
name: AegisSight UG (haftungsbeschränkt)
|
||||
domain: aegis-sight.de
|
||||
email: info@aegis-sight.de
|
||||
|
||||
TECHNOLOGY:
|
||||
type: Static Website (kein Build-Step)
|
||||
build_process: NONE
|
||||
deployment: Docker (nginx:alpine für statische Files, PHP-FPM für /insights/)
|
||||
|
||||
frontend:
|
||||
- HTML5
|
||||
- CSS3 (modular)
|
||||
- JavaScript ES6+ (kein Framework)
|
||||
- SVG
|
||||
- Leaflet 1.9.4 + MarkerCluster (CDN, für Lagebild-Karten)
|
||||
|
||||
features:
|
||||
- multi_language: [DE, EN]
|
||||
- responsive: mobile-first
|
||||
- hero_video_slider: 5 Slides auf der Startseite (Auto-Play mit Endcard, manuelle Navigation)
|
||||
- 3d_carousel: Lagen-Showcase auf der Hauptseite, gekoppelt an Leaflet-Karte
|
||||
- live_data: /lagen/{thema}/data/current.json (alle 5 min synchronisiert)
|
||||
- cookie_consent: GDPR-konform
|
||||
- security_headers: enabled
|
||||
|
||||
STRUCTURE:
|
||||
root_files:
|
||||
- index.html: Hauptseite (DE) - Hero-Slider, Features, Problem, Workflow, Demos, Kontakt, Trust
|
||||
- impressum.html: Impressum (DE)
|
||||
- datenschutz.html: Datenschutz (DE)
|
||||
- accountforger-video.html: Geschützte Produkt-Demo (auth_request gegen Security-Dashboard)
|
||||
- cookie-consent.js, cookie-consent.css: GDPR Cookie-System (liest <html lang> selbständig)
|
||||
- analytics-events.js: Umami-Custom-Events
|
||||
- favicon.svg, de.svg, en.svg, robots.txt, sitemap.xml, llms.txt
|
||||
- LAUNCH-CHECKLIST.md, DATENSCHUTZ_ANALYTICS.md, COOKIE_CONSENT_IMPLEMENTATION.md, PROFESSIONAL_TOOLBOX_CONTENT.md, VIDEO_UPLOAD_INSTRUCTIONS.md: interne Doku
|
||||
|
||||
directories:
|
||||
en/:
|
||||
- index.html: Hauptseite (EN)
|
||||
- legal-notice.html: Impressum (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/:
|
||||
fonts/: Inter, Bebas Neue
|
||||
images/: icons (UI-SVG), flags (Länderflaggen), logos (Logo+Schrift_Rechts.svg, AegisSightLogo_NavyGold.svg, og-image.png)
|
||||
videos/AFv6.mp4: AccountForger-Demo, ~93 MB, Git LFS
|
||||
handshake.svg
|
||||
|
||||
videos/: Hero-Slider-Videos der Startseite
|
||||
- hero-slide-1-monitoring.mp4: Echtzeit-Monitoring
|
||||
- hero-slide-2-monitoring.mp4: Faktenprüfung
|
||||
- hero-slide-3-monitoring.mp4: KI-gestützte Recherche
|
||||
- hero-slide-4-monitoring.mp4: Globale Quellenabdeckung
|
||||
- hero-slide-5-monitoring.mp4: Flexibel einsetzbar
|
||||
|
||||
css/:
|
||||
aktiv_eingebunden:
|
||||
- main.css: Kern-Styles
|
||||
- style.css: Light-Mode Styles (index, legal pages, /en/)
|
||||
- mobile.css: Mobile Responsive
|
||||
- fonts.css: Typografie
|
||||
- lang-switcher.css: Sprachumschalter-Komponente (DE/EN)
|
||||
# Legacy CSS-Files am 2026-05-10 entfernt
|
||||
|
||||
js/:
|
||||
aktiv_eingebunden:
|
||||
- app.js: Hero-Slider, Smooth-Scroll, Mobile-Menü, 3D-Karussell, Leaflet-Karte, Live-Daten, Kontaktformular
|
||||
- config.js: globale Konfiguration
|
||||
- mobile-nav.js: Mobile-Menü-Helfer
|
||||
# Legacy JS-Files am 2026-05-10 entfernt
|
||||
|
||||
docs/: Legacy-PDFs aus IntelSight-Zeit, von der aktuellen Seite nicht mehr verlinkt
|
||||
- datenschutzerklaerung_intelsight_de_de.pdf, impressum_intelsight_de_de.pdf, Sitemap_IntelSight_UG.docx
|
||||
|
||||
downloads/:
|
||||
af-updates/: AccountForger-Update-Pakete (per Token zugänglich)
|
||||
|
||||
insights/: PHP-Skripte für /insights/ (Container aegis-php-fpm), Datenablage in insights/data/
|
||||
|
||||
lagen/:
|
||||
iran-konflikt/:
|
||||
- index.html, lagebild.css, lagebild.js, data/{current.json, current_en.json, snapshot-N.json}
|
||||
- HOST der Lagebild-Assets: cyberangriffe und deepfakes binden /lagen/iran-konflikt/lagebild.{css,js} ein
|
||||
cyberangriffe/:
|
||||
- index.html (referenziert /lagen/iran-konflikt/lagebild.{js,css}), data/...
|
||||
deepfakes/:
|
||||
- index.html (referenziert /lagen/iran-konflikt/lagebild.{js,css}), data/...
|
||||
|
||||
PAGES:
|
||||
homepage:
|
||||
sections:
|
||||
- "Hero: 5-Video-Slider mit Auto-Play, Endcard und manueller Navigation (Pfeile + Dots)"
|
||||
- "Features: Was der Monitor leistet (Echtzeit-Monitoring, Quellenanalyse, Geo, Mehrsprachigkeit, Lagebilder)"
|
||||
- "Problem: Warum manuelle OSINT-Auswertung nicht skaliert"
|
||||
- "Solution/Workflow: 3 Schritte (Erfassen, Analysieren, Berichten)"
|
||||
- "Demos: Live-Stats-Bar + 3D-Karussell (Iran/Cyber/Deepfakes-Cards) + gekoppelte Leaflet-Karte"
|
||||
- "Kontakt-CTA: öffnet Modal mit Kontaktformular"
|
||||
- "Trust: Unser Versprechen (Zusammenarbeit, Made in Germany, Partnerschaft, Nachhaltigkeit)"
|
||||
legal:
|
||||
- /impressum.html bzw. /en/legal-notice.html
|
||||
- /datenschutz.html bzw. /en/privacy.html
|
||||
product:
|
||||
- /accountforger-video.html: AccountForger Video-Demo, Cookie-/Token-geschützt über Security-Dashboard
|
||||
lagen:
|
||||
url_struktur:
|
||||
de: /lagen/{thema}/
|
||||
en: /en/situations/{slug}/
|
||||
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. lagebild.js
|
||||
liest curLang() aus <html lang> und schaltet UI-Strings automatisch um
|
||||
(lang.de / lang.en Dictionary).
|
||||
redirect: /lagebild/ -> 301 -> /lagen/iran-konflikt/
|
||||
aktiv:
|
||||
- iran-konflikt / iran-conflict: Live-Lagebild Irankonflikt
|
||||
- cyberangriffe / cyber-attacks: Live-Lagebild Cyberangriffe
|
||||
- deepfakes / deepfakes: Recherche-Briefing Deepfakes (rechtliche Lage in DE)
|
||||
|
||||
DEVELOPMENT:
|
||||
i18n:
|
||||
ansatz: statische Duplikate (DE unter /, EN unter /en/)
|
||||
sprachumschalter: css/lang-switcher.css
|
||||
pendant_urls: in jeder Seite hardcoded (funktioniert ohne JS)
|
||||
cookie_banner: cookie-consent.js liest <html lang> selbständig
|
||||
lagen: lagebild.js liest <html lang> via curLang(); Daten-Pfad über
|
||||
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/AFv6.mp4 (~93 MB, Git LFS)
|
||||
- videos/hero-slide-{1..5}-monitoring.mp4
|
||||
design: mobile-first responsive
|
||||
|
||||
SERVICES:
|
||||
contact-form:
|
||||
script: /opt/v2-Docker/aegis-website/contact-form.py
|
||||
service: aegis-contact.service
|
||||
port: 127.0.0.1:8074
|
||||
nginx: /api/contact -> 127.0.0.1:8074
|
||||
zweck: Kontaktformular-Handler (SMTP via IONOS an info@aegis-sight.de)
|
||||
rate_limit: 3 Anfragen pro IP / 10 Min
|
||||
i18n: lang im POST-Body steuert Fehler-/Erfolgsmeldungen, [EN]-Tag im Betreff
|
||||
|
||||
sync-lagebild:
|
||||
script: /opt/v2-Docker/aegis-website/sync-lagebild.py
|
||||
cron: alle 5 Minuten via /home/claude-dev/run-sync-lagebild.sh
|
||||
quelle: https://monitor.aegis-sight.de/api/public (X-API-Key)
|
||||
ziel: /opt/v2-Docker/aegis-website/html/lagen/{slug}/data/
|
||||
übersetzung: claude-haiku-4-5 (Title, Description, Summary, Latest-Developments, Faktenchecks Batches à 30)
|
||||
cache: data/{slug}/translation_cache.json (md5(text) als key)
|
||||
lagen_konfiguriert: iran-konflikt (incident_id 6, legacy_endpoint), deepfakes (55), cyberangriffe (58)
|
||||
ssr_patch: |
|
||||
Modul /opt/v2-Docker/aegis-website/ssr_patch.py (NICHT im Repo).
|
||||
Wird am Ende von sync_lage() aufgerufen und patcht die statischen
|
||||
Lagen-HTML-Files DE+EN mit aktuellen Live-Daten:
|
||||
- <p id="incident-title">: Topic + Stand-Datum (lokalisiert DE/EN)
|
||||
- <div id="hero-stats">: 3 Stat-Cards (Artikel/Quellen/Faktenchecks)
|
||||
- Schema.org dateModified: aktuelles Datum
|
||||
Patches sind ID-basiert und idempotent.
|
||||
WICHTIG: Auto-Deploy (git reset --hard) ueberschreibt die SSR-Patches
|
||||
im html-Verzeichnis. Nach jedem Promote dauert es bis zum naechsten
|
||||
5-min-Sync, bis Crawler wieder den SSR-Content sehen. Fuer Nutzer
|
||||
mit JavaScript ist das egal (lagebild.js rendert sowieso identisch).
|
||||
|
||||
insights:
|
||||
container: aegis-php-fpm (172.18.0.6)
|
||||
zweck: PHP-Backend für /insights/ (Analytics-Datenablage)
|
||||
volumes: ./insights:/var/www/insights:ro, ./insights/data:/var/www/insights/data:rw
|
||||
|
||||
DEPLOYMENT:
|
||||
container: aegis-website-nginx (172.18.0.5)
|
||||
server: nginx:alpine, read-only Filesystem, no-new-privileges, cap_drop ALL
|
||||
ssl: Host-nginx mit Let's Encrypt (Reverse-Proxy auf den Container)
|
||||
security_headers: /etc/nginx/snippets/security-headers.conf
|
||||
rate_limiting: konfiguriert für Kontaktformular und /usage/api/widget/
|
||||
besonderheiten:
|
||||
- "Lagen-JSON: 60 s Browser-Cache mit must-revalidate (ETag-Validierung)"
|
||||
- "/accountforger-video.html + assets/videos/AFv6.mp4: auth_request gegen Security-Dashboard (8050), bei Ablehnung 302 zu /?showAuth=1"
|
||||
- "/analytics-und-so/datenblick.js: verschleierter Pfad gegen Adblocker (proxied auf Umami)"
|
||||
|
||||
CHANGE_LOG:
|
||||
2026-01-08:
|
||||
- "Rebrand: IntelSight -> AegisSight"
|
||||
- "Neues Logo: Logo+Schrift_Rechts.svg"
|
||||
- "Email: info@aegis-sight.de"
|
||||
- "Footer: Dynamisches Jahr, AGB entfernt"
|
||||
2026-05-06:
|
||||
- "i18n: Sprachumschalter DE/EN, neue Seiten unter /en/"
|
||||
- "Aufräumen: js/translations.js, impressum-en.html, datenschutz-en.html 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)"
|
||||
2026-05-10:
|
||||
- "Doku-Cleanup: /vorschau/ entfernt (alte Vorab-Produktseite, längst durch index.html mit Hero-Slider und Live-Demos ersetzt)"
|
||||
- "STRUCTURE: aktive vs. legacy CSS/JS getrennt, videos/, downloads/, insights/, accountforger-video.html, weitere Top-Level-Files ergänzt"
|
||||
- "Lagen-Layout: cyberangriffe und deepfakes binden Lagebild-CSS/JS aus iran-konflikt ein (zentrale Assets)"
|
||||
- "SERVICES: sync-lagebild und insights ergänzt"
|
||||
- "SEO Quick-Wins: Title-Konsistenz Iran-Konflikt; Meta-Hygiene auf 12 Seiten (robots index/follow + max-image-preview:large, theme-color, author)"
|
||||
- "SEO Stufe 2: SSR-Patches der Lagen-HTMLs alle 5 min (sync-lagebild.py + neues ssr_patch.py-Modul). Crawler sehen Topic + Stats + Stand-Datum im HTML statt JS-Shell"
|
||||
- "Tech: Self-Hosting Leaflet 1.9.4 + Markercluster 1.5.3 nach assets/vendor/leaflet/ (kein Third-Party-Call mehr); image-Sitemap mit og-image + Logo pro URL"
|
||||
- "Performance: Logo PNG -> SVG mit width/height (CLS), loading=lazy auf 25 unter-Fold-Bilder, preconnect zu unpkg (jetzt obsolet, durch Self-Hosting ersetzt)"
|
||||
- "3 Lagen-Descriptions auf <=160 Zeichen gekuerzt"
|
||||
- "Sitemap mit lastmod-Tag pro URL"
|
||||
- "Hauptseite Schema.org erweitert: WebSite + SoftwareApplication (mit featureList und offers)"
|
||||
- "Lagen-Seiten Schema.org BreadcrumbList ergänzt (Home -> Topic)"
|
||||
- "llms.txt angelegt (Site-Struktur für KI-Crawler)"
|
||||
- "Performance: Hero-Slides 2-5 preload=metadata -> none (Slide 1 bleibt auto)"
|
||||
- "Repo aufgeräumt: 5 tote CSS-Files in /css/, 7 tote JS-Files in /js/, robots-launch.txt + sitemap-launch.xml entfernt"
|
||||
- "SEO Stufe 1: noindex/nofollow von 12 indexierbaren Seiten entfernt; robots.txt scharf geschaltet (Live-Search-AI-Bots erlaubt, Training-Bots geblockt); sitemap.xml deployt"
|
||||
- "Lagen-Seiten: description, canonical, Open Graph, Twitter Card, Schema.org Article ergänzt; Topic-Default in #incident-title als Crawler-Fallback"
|
||||
|
||||
Last-Updated: 2026-05-10
|
||||
|
||||
RULES:
|
||||
neue_html_seiten:
|
||||
- "Jede neue HTML-Datei MUSS im <head> folgende Favicon-Tags enthalten:"
|
||||
- "<link rel=\"icon\" type=\"image/svg+xml\" href=\"/favicon.svg\">"
|
||||
- "<link rel=\"apple-touch-icon\" href=\"/assets/images/logos/AegisSightLogo_NavyGold.svg\">"
|
||||
- "Für Unterverzeichnisse relative Pfade anpassen, z.B. ../favicon.svg"
|
||||
|
||||
# ───────────────────────────────────────────────────────────────────
|
||||
# STAGING-UMGEBUNG
|
||||
# ───────────────────────────────────────────────────────────────────
|
||||
|
||||
STAGING:
|
||||
url: https://staging.aegis-sight.de
|
||||
server: 46.225.225.49 (gleicher Host wie Live)
|
||||
container: aegis-website-staging-nginx (eigener Docker-Container)
|
||||
pfad: /opt/v2-Docker/aegis-website-staging/html
|
||||
branch: develop
|
||||
netzwerk_ip: 172.18.0.7 (im v2_internal_net)
|
||||
zugriff: Magic-Link-Login an info@aegis-sight.de (Cookie 30 Tage)
|
||||
|
||||
besonderheit_lagen_daten:
|
||||
erklaerung: |
|
||||
Die Live-Lagen-Daten (/lagen/*/data/*.json) werden vom sync-lagebild.py
|
||||
erzeugt und nicht ins Repo committed. Im Staging-Container ist das
|
||||
Live-/lagen/-Verzeichnis read-only gemountet, damit die Karten-Vorschau
|
||||
auch im Staging mit echten Daten funktioniert.
|
||||
mount_im_compose: /opt/v2-Docker/aegis-website/html/lagen:/usr/share/nginx/html/lagen:ro
|
||||
|
||||
auth_service:
|
||||
pfad: /opt/v2-Docker/aegis-staging-auth
|
||||
service: aegis-staging-auth.service
|
||||
port: 127.0.0.1:8095
|
||||
cookie_domain: staging.aegis-sight.de
|
||||
cookie_name: aegis_staging_auth
|
||||
|
||||
WORKFLOW_STAGING_TO_LIVE:
|
||||
1_aenderung_in_develop: |
|
||||
# NIE direkt im Live-Verzeichnis arbeiten -> tmp-Klon nutzen
|
||||
git clone <repo> /tmp/website-work && cd /tmp/website-work
|
||||
git checkout develop
|
||||
# Änderung machen
|
||||
git add . && git commit -m ...
|
||||
git push origin develop
|
||||
2_staging_aktualisieren_automatisch: |
|
||||
# Auto-Deploy pullt automatisch -> kein manueller git pull nötig
|
||||
# (Webhook -> /__deploy mit HMAC -> aegis-staging-deploy.service)
|
||||
3_in_browser_pruefen: https://staging.aegis-sight.de
|
||||
4_promote_zu_live: |
|
||||
# Auf deploy.aegis-sight.de "Promote -> Live" klicken
|
||||
# Erstellt PR develop->main, mergt ihn auto, triggert Live-Deploy via HMAC
|
||||
|
||||
# ───────────────────────────────────────────────────────────────────
|
||||
# AUTO-DEPLOY + PROMOTE-UI
|
||||
# ───────────────────────────────────────────────────────────────────
|
||||
|
||||
AUTO_DEPLOY:
|
||||
prinzip: |
|
||||
Gitea-Webhook bei Push auf develop -> Listener-Service auf dem Server pullt
|
||||
automatisch + restartet ggf. den Service. Kein manueller git pull mehr nötig.
|
||||
|
||||
listener_service:
|
||||
pfad: /opt/v2-Docker/aegis-staging-deploy
|
||||
service: aegis-staging-deploy.service
|
||||
port: 127.0.0.1:8096
|
||||
deployments:
|
||||
staging: "develop -> /opt/v2-Docker/aegis-website-staging/html"
|
||||
live: "main -> /opt/v2-Docker/aegis-website/html"
|
||||
endpoints:
|
||||
"POST /__deploy": "staging (HMAC über Gitea-Webhook)"
|
||||
"POST /__deploy/live": "live (HMAC über Promote-UI)"
|
||||
secrets: in /opt/v2-Docker/aegis-staging-deploy/.env (nicht im Repo)
|
||||
|
||||
gitea_webhook:
|
||||
repo: AegisSight/Website
|
||||
url: https://staging.aegis-sight.de/__deploy
|
||||
branch_filter: develop
|
||||
|
||||
PROMOTE_UI:
|
||||
url: https://deploy.aegis-sight.de
|
||||
pfad: /opt/v2-Docker/aegis-promote
|
||||
service: aegis-promote.service
|
||||
port: 127.0.0.1:8097
|
||||
zugriff: Magic-Link-Login an info@aegis-sight.de (eigener Cookie deploy.aegis-sight.de)
|
||||
funktion: |
|
||||
Zeigt pro Service (Webseite + Monitor + Verwaltung + Tenders) Live- vs. Staging-Stand.
|
||||
Promote-Button erstellt Gitea-PR develop->main, mergt ihn auto, und triggert
|
||||
den Live-Deploy via HMAC-signed Webhook am Listener-Service.
|
||||
Release-Notes-Vorschlag (Sonnet) editierbar oder leer lassen.
|
||||
|
||||
WORKFLOW_KOMPLETT:
|
||||
1_entwickeln: |
|
||||
# NIE direkt im Live-Verzeichnis arbeiten!
|
||||
# Klon in /tmp/<service>-work/ oder lokal nutzen
|
||||
git checkout develop
|
||||
# Änderung
|
||||
git add . && git commit && git push origin develop
|
||||
# -> Auto-Deploy pullt in /opt/v2-Docker/aegis-website-staging/html
|
||||
2_pruefen_staging: https://staging.aegis-sight.de/
|
||||
3_promoten: https://deploy.aegis-sight.de/ (Promote-Knopf)
|
||||
4_pruefen_live: https://aegis-sight.de/
|
||||
@@ -1,57 +0,0 @@
|
||||
# website-main
|
||||
|
||||
*This README was automatically generated by Claude Project Manager*
|
||||
|
||||
## Project Overview
|
||||
|
||||
- **Path**: `C:/Users/hendr/Desktop/IntelSight/Projektablage/website-main`
|
||||
- **Files**: 12 files
|
||||
- **Size**: 137.5 KB
|
||||
- **Last Modified**: 2025-08-14 22:51
|
||||
|
||||
## Technology Stack
|
||||
|
||||
### Languages
|
||||
- JavaScript
|
||||
|
||||
## Project Structure
|
||||
|
||||
```
|
||||
CLAUDE_PROJECT_README.md
|
||||
de.svg
|
||||
en.svg
|
||||
index.html
|
||||
README.md
|
||||
robots.txt
|
||||
script.js
|
||||
Sitemap_IntelSight_UG.docx
|
||||
styles.css
|
||||
Logo/
|
||||
├── intelsight-dark-no-tagline-website-cropped.svg
|
||||
├── intelsight-dark-no-tagline-website.svg
|
||||
└── intelsight-icon-transparent-dark.svg
|
||||
```
|
||||
|
||||
## Key Files
|
||||
|
||||
- `README.md`
|
||||
|
||||
## Claude Integration
|
||||
|
||||
This project is managed with Claude Project Manager. To work with this project:
|
||||
|
||||
1. Open Claude Project Manager
|
||||
2. Click on this project's tile
|
||||
3. Claude will open in the project directory
|
||||
|
||||
## Notes
|
||||
|
||||
*Add your project-specific notes here*
|
||||
|
||||
---
|
||||
|
||||
## Development Log
|
||||
|
||||
- README generated on 2025-07-03 23:25:48
|
||||
- README updated on 2025-08-14 22:51:36
|
||||
- README updated on 2025-08-14 22:51:56
|
||||
535
COOKIE_CONSENT_IMPLEMENTATION.md
Normale Datei
@@ -0,0 +1,535 @@
|
||||
# ANALYTICS IMPLEMENTATION - KOMPLETT-GUIDE
|
||||
|
||||
**AegisSight UG**
|
||||
**Datum:** 2026-03-20
|
||||
**Version:** 2.0
|
||||
**Status:** Implementation Complete
|
||||
|
||||
---
|
||||
|
||||
# PHASE 1: BESTANDSAUFNAHME
|
||||
|
||||
## Dienste & Tracking Katalog
|
||||
|
||||
### **Dienste im Einsatz:**
|
||||
- **AegisSight Analytics (Umami v3.0.3)** - Self-Hosted, Deutschland
|
||||
- Keine Google Analytics
|
||||
- Keine Facebook Pixel
|
||||
- Keine Third-Party CDNs
|
||||
- Keine Social Media Widgets
|
||||
|
||||
### **Cookies:**
|
||||
|
||||
**Keine.** Umami arbeitet vollständig cookieless. Es werden weder Session-Cookies noch Tracking-Cookies gesetzt. Die Identifikation erfolgt ohne Cookies und ohne Fingerprinting.
|
||||
|
||||
| Eintrag | Zweck | Typ | Opt-In? |
|
||||
|---------|-------|-----|---------|
|
||||
| `analytics-consent` (LocalStorage) | Consent-Status | LocalStorage | Nein (technisch) |
|
||||
|
||||
### **Tracking-Daten (anonymisiert):**
|
||||
- Browser, OS, Device, Screen Resolution
|
||||
- Land, Region (kein Stadtlevel, kein GeoIP-Lookup)
|
||||
- Seiten, Referrer, Session-Dauer
|
||||
- Traffic Source, UTM-Parameter
|
||||
|
||||
### **Personenbezug:** Nein
|
||||
|
||||
Umami speichert keine IP-Adressen und verwendet kein Fingerprinting. Alle Daten sind aggregiert und nicht auf einzelne Nutzer rückführbar.
|
||||
|
||||
**Rechtsgrundlage:** Art. 6 Abs. 1 lit. f DSGVO (berechtigtes Interesse) - da cookieless und ohne Personenbezug ist kein Opt-In zwingend erforderlich. Der Consent-Banner wird dennoch aus Transparenzgründen eingesetzt.
|
||||
|
||||
---
|
||||
|
||||
# PHASE 2: ENTSCHEIDUNG & DESIGN
|
||||
|
||||
## **Entscheidung: CUSTOM BANNER**
|
||||
|
||||
**Gründe:**
|
||||
- Nur 1 Dienst - CMP wäre Overkill
|
||||
- Volle Kontrolle, keine Abhängigkeiten
|
||||
- Schneller (<5KB vs. 50-100KB für CMP)
|
||||
- Kostenlos
|
||||
|
||||
---
|
||||
|
||||
## **UI-Design: Slim Layer**
|
||||
|
||||
### Banner (Primary):
|
||||
```
|
||||
┌─────────────────────────────────────────┐
|
||||
│ Website-Analyse │
|
||||
│ │
|
||||
│ Text: Cookieless Analytics, Self- │
|
||||
│ Hosted in Deutschland, keine │
|
||||
│ Weitergabe an Dritte... │
|
||||
│ │
|
||||
│ [Details & Einstellungen] │
|
||||
│ [Alles akzeptieren] [Nur notwendige] │
|
||||
└─────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
### Settings Modal:
|
||||
```
|
||||
┌─────────────────────────────────────┐
|
||||
│ Analyse-Einstellungen [×] │
|
||||
├─────────────────────────────────────┤
|
||||
│ ☑ Notwendig (immer aktiv) │
|
||||
│ ☐ Statistik & Analyse │
|
||||
│ └─ AegisSight Analytics (Umami) │
|
||||
│ • Keine Cookies │
|
||||
│ • Keine IP-Speicherung │
|
||||
│ • Self-Hosted, Deutschland │
|
||||
│ │
|
||||
│ [Auswahl speichern] [Alle akz.] │
|
||||
└─────────────────────────────────────┘
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## **Texte (DE/EN)**
|
||||
|
||||
**Deutsch:**
|
||||
- Titel: "Website-Analyse"
|
||||
- Text: "Wir nutzen cookielose Analyse-Software auf unserem eigenen Server in Deutschland. Es werden keine persönlichen Daten gespeichert und nichts an Dritte weitergegeben."
|
||||
- Buttons: "Alles akzeptieren" / "Nur notwendige"
|
||||
|
||||
**Englisch:**
|
||||
- Title: "Website Analytics"
|
||||
- Text: "We use cookieless analytics software on our own server in Germany. No personal data is stored and nothing is shared with third parties."
|
||||
- Buttons: "Accept all" / "Only necessary"
|
||||
|
||||
---
|
||||
|
||||
# PHASE 3: IMPLEMENTATIONSPLAN
|
||||
|
||||
## **3.1 Gating-Pattern**
|
||||
|
||||
```
|
||||
Page Load
|
||||
↓
|
||||
Check LocalStorage['analytics-consent']
|
||||
↓
|
||||
├─→ null → Show Banner + Block Tracking
|
||||
├─→ 'accepted' → Load Umami Script
|
||||
└─→ 'rejected' → Block Tracking
|
||||
```
|
||||
|
||||
**Ablauf:** Das Umami-Script `/analytics-und-so/datenblick.js` wird erst nach Zustimmung geladen.
|
||||
|
||||
---
|
||||
|
||||
## **3.2 Script-Einbindung**
|
||||
|
||||
### Umami Tracking-Script (wird dynamisch geladen bei Consent):
|
||||
|
||||
```html
|
||||
<script
|
||||
defer
|
||||
src="/analytics-und-so/datenblick.js"
|
||||
data-website-id="598ef5fd-d2dc-4540-9e65-602889981dac"
|
||||
></script>
|
||||
```
|
||||
|
||||
### API-Endpoint:
|
||||
```
|
||||
POST /analytics-und-so/api/erfassen
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## **3.3 Storage-Schema**
|
||||
|
||||
### LocalStorage Keys:
|
||||
|
||||
```javascript
|
||||
// Consent Status
|
||||
"analytics-consent": {
|
||||
value: "accepted" | "rejected",
|
||||
expires: 1774051200000 // Timestamp (12 Monate)
|
||||
}
|
||||
|
||||
// Consent Details (Audit-Trail)
|
||||
"analytics-consent-details": {
|
||||
timestamp: "2026-03-20T12:00:00Z",
|
||||
version: "2.0",
|
||||
categories: { necessary: true, analytics: true },
|
||||
language: "de",
|
||||
gpcSignal: false
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## **3.4 Footer-Link (Persistent)**
|
||||
|
||||
```html
|
||||
<footer>
|
||||
<a href="#" id="cookie-settings-link">Analyse-Einstellungen</a>
|
||||
</footer>
|
||||
```
|
||||
|
||||
**Funktion:** Öffnet Banner erneut, ermöglicht Widerruf
|
||||
|
||||
---
|
||||
|
||||
## **3.5 Re-Prompt Regeln**
|
||||
|
||||
**Banner erneut zeigen bei:**
|
||||
1. Consent abgelaufen (nach 12 Monaten)
|
||||
2. Version-Change (z.B. 2.0 → 2.1)
|
||||
3. User löscht LocalStorage
|
||||
4. Klick auf "Analyse-Einstellungen"
|
||||
|
||||
---
|
||||
|
||||
## **3.6 Global Privacy Control (GPC)**
|
||||
|
||||
```javascript
|
||||
if (navigator.globalPrivacyControl === true) {
|
||||
// Auto-reject analytics
|
||||
localStorage.setItem('analytics-consent', JSON.stringify({
|
||||
value: 'rejected',
|
||||
expires: Date.now() + 365 * 24 * 60 * 60 * 1000
|
||||
}));
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
# PHASE 4: UMSETZUNG + TESTS
|
||||
|
||||
## **4.1 Dateien**
|
||||
|
||||
### **1. cookie-consent.css**
|
||||
- Responsive Design (Mobile-First)
|
||||
- Accessibility (Focus-Trap, ARIA, Keyboard)
|
||||
- Animations (Fade-In, Slide-Up)
|
||||
- Dark Mode kompatibel
|
||||
|
||||
### **2. cookie-consent.js**
|
||||
- Consent Management Logic
|
||||
- GPC Detection
|
||||
- LocalStorage mit Expiry
|
||||
- Multilingual (DE/EN)
|
||||
- Public API
|
||||
- Version Control
|
||||
- Dynamisches Laden von `/analytics-und-so/datenblick.js`
|
||||
|
||||
### **3. DATENSCHUTZ_ANALYTICS.md**
|
||||
- Fertige Datenschutzerklärung
|
||||
- DSGVO-konforme Texte
|
||||
|
||||
---
|
||||
|
||||
## **4.2 Features implementiert**
|
||||
|
||||
- **Opt-In vor Tracking** (Gating)
|
||||
- **Backdrop-Overlay** (verhindert Interaktion)
|
||||
- **Two-Step Design** (Banner → Settings)
|
||||
- **Consent-Versionierung** (Re-Prompt bei Updates)
|
||||
- **GPC/DNT Support** (Auto-Reject)
|
||||
- **LocalStorage mit Expiry** (12 Monate)
|
||||
- **Audit-Trail** (Consent-Details)
|
||||
- **Multilingual** (DE/EN)
|
||||
- **Accessibility** (ARIA, Focus-Trap, Keyboard)
|
||||
- **Responsive** (Mobile-optimiert)
|
||||
- **Public API** (programmatischer Zugriff)
|
||||
- **Cookieless Tracking** (keine Cookies nötig)
|
||||
|
||||
---
|
||||
|
||||
## **4.3 Test-Checkliste**
|
||||
|
||||
### **Funktional:**
|
||||
- [ ] Banner erscheint beim ersten Besuch
|
||||
- [ ] "Alles akzeptieren" lädt `/analytics-und-so/datenblick.js`
|
||||
- [ ] "Nur notwendige" blockiert Script-Laden
|
||||
- [ ] Re-Visit: Kein Banner (Consent gespeichert)
|
||||
- [ ] Footer-Link öffnet Banner erneut
|
||||
- [ ] Widerruf funktioniert (Accept → Reject)
|
||||
- [ ] GPC-Signal wird erkannt und respektiert
|
||||
- [ ] Version-Change löst Re-Prompt aus
|
||||
|
||||
### **Script-Integration:**
|
||||
- [ ] Script hat korrektes `data-website-id="598ef5fd-d2dc-4540-9e65-602889981dac"`
|
||||
- [ ] Pageview wird an `/analytics-und-so/api/erfassen` gesendet
|
||||
- [ ] Keine Cookies im Browser nach Tracking
|
||||
|
||||
### **Accessibility & Responsive:**
|
||||
- [ ] Keyboard-Navigation funktioniert (Tab, Enter, Esc)
|
||||
- [ ] Screen Reader liest Banner korrekt vor
|
||||
- [ ] Mobile: Buttons sind touchbar, kein horizontaler Scroll
|
||||
|
||||
---
|
||||
|
||||
## **4.4 Browser-Kompatibilität**
|
||||
|
||||
| Browser | Version | Status |
|
||||
|---------|---------|--------|
|
||||
| Chrome | 120+ | - |
|
||||
| Firefox | 121+ | - |
|
||||
| Safari | 17+ | - |
|
||||
| Edge | 120+ | - |
|
||||
| Chrome Mobile | 120+ | - |
|
||||
| Safari iOS | 17+ | - |
|
||||
|
||||
**Minimum Support:** ES6 (2015+), LocalStorage, Fetch API
|
||||
|
||||
---
|
||||
|
||||
# PHASE 5: DATENSCHUTZERKLÄRUNG
|
||||
|
||||
## **5.1 Textbausteine**
|
||||
|
||||
**Datei:** `DATENSCHUTZ_ANALYTICS.md`
|
||||
|
||||
**Enthält:**
|
||||
- Art und Umfang der Datenverarbeitung
|
||||
- Rechtsgrundlage (Art. 6 Abs. 1 lit. f DSGVO - berechtigtes Interesse)
|
||||
- Hinweis auf cookieloses Tracking
|
||||
- Keine IP-Speicherung, kein Fingerprinting
|
||||
- Self-Hosted auf eigenem Server (Deutschland)
|
||||
- Keine Datenübermittlung an Dritte
|
||||
- Widerruf der Einwilligung
|
||||
- GPC-Unterstützung
|
||||
- Betroffenenrechte (Art. 15-21 DSGVO)
|
||||
|
||||
---
|
||||
|
||||
## **5.2 Integration in Website**
|
||||
|
||||
```html
|
||||
<!-- /datenschutz.html -->
|
||||
<section id="analytics">
|
||||
<h2>4. Website-Analyse</h2>
|
||||
<p>Wir nutzen AegisSight Analytics (Umami), eine cookielose, datenschutzfreundliche
|
||||
Analyse-Software. Diese wird auf unserem eigenen Server in Deutschland betrieben.
|
||||
Es werden keine Cookies gesetzt, keine IP-Adressen gespeichert und kein
|
||||
Fingerprinting eingesetzt. Die erhobenen Daten sind nicht auf einzelne Personen
|
||||
rückführbar.</p>
|
||||
</section>
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## **5.3 Rechtliche Checkliste**
|
||||
|
||||
- [x] Opt-In vor Tracking (Consent-Banner)
|
||||
- [x] Widerruf ermöglichen (Footer-Link)
|
||||
- [x] Datenschutzerklärung (vollständig)
|
||||
- [x] Rechtsgrundlage benannt (Art. 6 I f DSGVO)
|
||||
- [x] Hinweis cookieloses Tracking
|
||||
- [x] Betroffenenrechte (Art. 15-21)
|
||||
- [ ] Impressum vollständig (muss geprüft werden)
|
||||
- [ ] Aufsichtsbehörde (muss eingefügt werden)
|
||||
|
||||
---
|
||||
|
||||
# DEPLOYMENT-ANLEITUNG
|
||||
|
||||
## **1. Dateien auf Server**
|
||||
|
||||
```
|
||||
/var/www/html/
|
||||
├── cookie-consent.css
|
||||
├── cookie-consent.js
|
||||
└── cookie-consent-demo.html (optional)
|
||||
```
|
||||
|
||||
## **2. Umami-Infrastruktur**
|
||||
|
||||
```
|
||||
Analytics-System: Umami v3.0.3 (Node.js/Next.js)
|
||||
Datenbank: PostgreSQL
|
||||
Script-Pfad: /analytics-und-so/datenblick.js
|
||||
API-Endpoint: /analytics-und-so/api/erfassen
|
||||
Website-ID: 598ef5fd-d2dc-4540-9e65-602889981dac
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## **3. In HTML-Seiten integrieren**
|
||||
|
||||
```html
|
||||
<!DOCTYPE html>
|
||||
<html lang="de">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>Ihre Seite</title>
|
||||
<link rel="stylesheet" href="/cookie-consent.css">
|
||||
</head>
|
||||
<body>
|
||||
<!-- Inhalt -->
|
||||
|
||||
<footer>
|
||||
<nav>
|
||||
<a href="/datenschutz">Datenschutz</a>
|
||||
<a href="/impressum">Impressum</a>
|
||||
<a href="#" id="cookie-settings-link">Analyse-Einstellungen</a>
|
||||
</nav>
|
||||
</footer>
|
||||
|
||||
<!-- Cookie Consent MUSS VOR allem anderen JS geladen werden -->
|
||||
<script src="/cookie-consent.js"></script>
|
||||
|
||||
<!-- Umami-Script wird automatisch bei Consent geladen -->
|
||||
<!-- NICHT direkt einbinden! -->
|
||||
</body>
|
||||
</html>
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## **4. Container neu laden**
|
||||
|
||||
```bash
|
||||
docker exec aegis-website-nginx nginx -s reload
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
# WARTUNG & UPDATES
|
||||
|
||||
## **Vierteljährlich:**
|
||||
- [ ] Umami-Version prüfen und ggf. updaten
|
||||
- [ ] Datenschutzerklärung überprüfen
|
||||
|
||||
## **Jährlich:**
|
||||
- [ ] Rechtsgrundlagen aktualisieren
|
||||
- [ ] Consent-Version erhöhen (bei Änderungen)
|
||||
|
||||
---
|
||||
|
||||
# TROUBLESHOOTING
|
||||
|
||||
## **Problem: Banner erscheint nicht**
|
||||
|
||||
```javascript
|
||||
// In Browser-Console:
|
||||
localStorage.removeItem('analytics-consent');
|
||||
localStorage.removeItem('analytics-consent-details');
|
||||
location.reload();
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## **Problem: Tracking funktioniert nicht trotz Zustimmung**
|
||||
|
||||
**Check 1:** LocalStorage
|
||||
```javascript
|
||||
JSON.parse(localStorage.getItem('analytics-consent'))
|
||||
// Erwartet: { value: "accepted", expires: ... }
|
||||
```
|
||||
|
||||
**Check 2:** Script geladen?
|
||||
```javascript
|
||||
document.querySelector('script[src="/analytics-und-so/datenblick.js"]')
|
||||
// Erwartet: <script> Element
|
||||
```
|
||||
|
||||
**Check 3:** Website-ID korrekt?
|
||||
```javascript
|
||||
document.querySelector('script[data-website-id]')?.dataset.websiteId
|
||||
// Erwartet: "598ef5fd-d2dc-4540-9e65-602889981dac"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## **Problem: GPC wird nicht erkannt**
|
||||
|
||||
```javascript
|
||||
navigator.globalPrivacyControl
|
||||
// Firefox mit Tracking-Schutz: true
|
||||
// Normale Browser: undefined
|
||||
```
|
||||
|
||||
GPC ist optional - nicht alle Browser unterstützen es.
|
||||
|
||||
---
|
||||
|
||||
# API-REFERENZ
|
||||
|
||||
## **Public API (JavaScript)**
|
||||
|
||||
```javascript
|
||||
// Banner anzeigen
|
||||
CookieConsent.show();
|
||||
|
||||
// Banner verstecken
|
||||
CookieConsent.hide();
|
||||
|
||||
// Settings Modal öffnen
|
||||
CookieConsent.showSettings();
|
||||
|
||||
// Alle akzeptieren (programmatisch)
|
||||
CookieConsent.acceptAll();
|
||||
|
||||
// Alle ablehnen (programmatisch)
|
||||
CookieConsent.rejectAll();
|
||||
|
||||
// Status abfragen
|
||||
const status = CookieConsent.getStatus();
|
||||
/*
|
||||
{
|
||||
consent: "accepted" | "rejected" | null,
|
||||
analytics: true | false,
|
||||
version: "2.0",
|
||||
timestamp: "2026-03-20T12:00:00Z",
|
||||
expires: 1774051200000,
|
||||
gpc: false
|
||||
}
|
||||
*/
|
||||
|
||||
// Sprache setzen
|
||||
CookieConsent.setLanguage('en'); // oder 'de'
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
# CHANGELOG
|
||||
|
||||
## Version 2.0 (2026-03-20)
|
||||
|
||||
### Geändert:
|
||||
- **Umstieg auf Umami v3.0.3** (ersetzt altes PHP-basiertes System)
|
||||
- **Cookieless Tracking** - keine Cookies mehr nötig
|
||||
- **Neues Tracking-Script:** `/analytics-und-so/datenblick.js`
|
||||
- **Neuer API-Endpoint:** `/analytics-und-so/api/erfassen`
|
||||
- **PostgreSQL** als Datenbank (ersetzt SQLite/Flatfile)
|
||||
- **Rechtsgrundlage** auf Art. 6 I f DSGVO geändert (berechtigtes Interesse)
|
||||
- **LocalStorage-Keys** umbenannt (`analytics-consent` statt `insights-consent`)
|
||||
- Texte angepasst (keine Cookie-Referenzen mehr)
|
||||
- Test-Checklisten gekürzt
|
||||
|
||||
### Entfernt:
|
||||
- Cookie `_insights_session`
|
||||
- PHP-Backend und zugehörige Konfiguration
|
||||
- GeoIP-Datenbank (nicht mehr benötigt)
|
||||
- Monatliche GeoIP-Update-Routine
|
||||
|
||||
## Version 1.0 (2025-11-09)
|
||||
|
||||
### Hinzugefügt:
|
||||
- Custom Cookie Banner (Slim Layer Design)
|
||||
- Settings Modal (Two-Step)
|
||||
- GPC Support, Multilingual (DE/EN)
|
||||
- LocalStorage mit Expiry, Consent Versioning
|
||||
- Accessibility (ARIA, Focus-Trap), Responsive Design
|
||||
- Public API, Datenschutzerklärung
|
||||
|
||||
---
|
||||
|
||||
# LIZENZ & CREDITS
|
||||
|
||||
**Erstellt für:** AegisSight UG
|
||||
**Datum:** 2026-03-20
|
||||
**Lizenz:** Proprietär (AegisSight)
|
||||
|
||||
**Rechtliche Hinweise:**
|
||||
- Keine Garantie für vollständige Rechtssicherheit
|
||||
- Datenschutzerklärung sollte von einem Anwalt geprüft werden
|
||||
- Individuelle Anpassungen je nach Use Case erforderlich
|
||||
|
||||
---
|
||||
|
||||
**Status: PRODUKTIV**
|
||||
253
DATENSCHUTZ_ANALYTICS.md
Normale Datei
@@ -0,0 +1,253 @@
|
||||
# Datenschutzerklärung - Abschnitt Website-Analyse
|
||||
|
||||
> **Textbaustein für /datenschutz Seite**
|
||||
> AegisSight UG
|
||||
|
||||
---
|
||||
|
||||
## 4. Website-Analyse (Self-Hosted Analytics)
|
||||
|
||||
### 4.1 Art und Umfang der Datenverarbeitung
|
||||
|
||||
Wir verwenden **AegisSight Analytics** (basierend auf [Umami](https://umami.is), Open-Source-Software, Version 3.0.3) als selbst gehostetes Analyse-Tool, um die Nutzung unserer Website zu verstehen und kontinuierlich zu verbessern. Das Tool läuft ausschließlich auf unseren eigenen Servern in Deutschland und gibt keine Daten an Drittanbieter weiter.
|
||||
|
||||
**Wichtig:** AegisSight Analytics arbeitet **vollständig cookieless** – es werden keine Cookies auf Ihrem Gerät gesetzt. Es findet **keine IP-Speicherung** und **kein Fingerprinting** statt. Umami anonymisiert alle Daten vollständig.
|
||||
|
||||
#### Erhobene Daten:
|
||||
|
||||
**Technische Daten:**
|
||||
- Browser-Typ und Version (z.B. Chrome 120, Firefox 121)
|
||||
- Verwendetes Betriebssystem (z.B. Windows 11, macOS 14)
|
||||
- Bildschirmauflösung (z.B. 1920x1080 Pixel)
|
||||
- Datum, Uhrzeit und Zeitzone des Zugriffs
|
||||
- Besuchte Seiten (URL-Pfade)
|
||||
- Verweildauer auf einzelnen Seiten
|
||||
- Referrer-URL (vorherige Website, von der Sie kamen)
|
||||
|
||||
**Standortdaten:**
|
||||
- Ungefährer Standort auf Land-/Regions-Ebene (ermittelt zur Laufzeit, IP-Adresse wird **nicht gespeichert**)
|
||||
- Land und Region
|
||||
|
||||
**Nutzungsdaten:**
|
||||
- Anzahl der Seitenaufrufe pro Besuch
|
||||
- Klickpfade und Navigation durch die Website
|
||||
- Session-Dauer (Gesamtzeit des Besuchs)
|
||||
- Bounce-Rate (Verlassen nach einer Seite)
|
||||
|
||||
**Marketing-Daten:**
|
||||
- Herkunft des Besuchs (Direkteingabe, Suchmaschine, Social Media, andere Website)
|
||||
- UTM-Parameter bei Marketing-Kampagnen (utm_source, utm_medium, utm_campaign, utm_term, utm_content)
|
||||
|
||||
---
|
||||
|
||||
### 4.2 Keine Cookies, keine IP-Speicherung, kein Fingerprinting
|
||||
|
||||
AegisSight Analytics (Umami v3.0.3) setzt **keine Cookies** und speichert **keine personenbezogenen Daten**:
|
||||
|
||||
- **Keine Cookies:** Es werden keinerlei Cookies oder LocalStorage-Einträge für Analysezwecke auf Ihrem Gerät gesetzt.
|
||||
- **Keine IP-Speicherung:** Ihre IP-Adresse wird zur Laufzeit für die Standortbestimmung (Land/Region) verwendet, aber **niemals gespeichert oder protokolliert**.
|
||||
- **Kein Fingerprinting:** Es werden keine Browser-Fingerprints oder Hashes zur Wiedererkennung erstellt.
|
||||
- **Keine geräteübergreifende Nachverfolgung:** Eine Identifikation einzelner Nutzer über Besuche hinweg ist technisch nicht möglich.
|
||||
|
||||
---
|
||||
|
||||
### 4.3 Rechtsgrundlage
|
||||
|
||||
Die Verarbeitung erfolgt auf Grundlage Ihrer **Einwilligung gemäß Art. 6 Abs. 1 lit. a DSGVO**.
|
||||
|
||||
Sie erteilen Ihre Einwilligung durch Klick auf "Alle akzeptieren" oder "Auswahl speichern" im Cookie-Banner beim ersten Besuch unserer Website. Bei Einwilligung wird das Tracking-Script geladen; bei Ablehnung wird es **nicht geladen** und es findet keinerlei Datenerhebung statt.
|
||||
|
||||
---
|
||||
|
||||
### 4.4 Zweck der Verarbeitung
|
||||
|
||||
Wir nutzen die erhobenen Daten für folgende Zwecke:
|
||||
|
||||
1. **Reichweitenmessung:** Ermittlung der Besucherzahlen und Seitenaufrufe
|
||||
2. **Nutzerverhalten-Analyse:** Verstehen, welche Inhalte interessant sind und wie Nutzer durch die Website navigieren
|
||||
3. **Technische Optimierung:** Anpassung der Website an verwendete Geräte und Browser
|
||||
4. **Performance-Monitoring:** Identifikation technischer Probleme und langsamer Seiten
|
||||
5. **Marketing-Erfolgsmessung:** Bewertung der Wirksamkeit von Kampagnen und Traffic-Quellen
|
||||
|
||||
---
|
||||
|
||||
### 4.5 Empfänger der Daten
|
||||
|
||||
**Es erfolgt KEINE Weitergabe an Drittanbieter.**
|
||||
|
||||
Alle Daten werden ausschließlich auf unseren eigenen Servern verarbeitet und gespeichert:
|
||||
|
||||
- **Server-Standort:** Deutschland (Hetzner Cloud, Nürnberg)
|
||||
- **Zugriff:** Nur autorisierte Mitarbeiter unseres Unternehmens zu Analyse-Zwecken
|
||||
- **Keine externen Dienste:** Wir nutzen kein Google Analytics, Facebook Pixel oder ähnliche Third-Party-Tools
|
||||
- **Open Source:** Umami ist quelloffene Software – der Code ist öffentlich einsehbar und überprüfbar
|
||||
|
||||
---
|
||||
|
||||
### 4.6 Datenübermittlung in Drittländer
|
||||
|
||||
Es findet **keine Übermittlung in Drittländer** (außerhalb EU/EWR) statt.
|
||||
|
||||
---
|
||||
|
||||
### 4.7 Speicherdauer
|
||||
|
||||
- **Analytics-Daten:** Automatische Löschung nach **90 Tagen**
|
||||
- **Consent-Status:** Speicherung für **12 Monate**, danach erneute Abfrage
|
||||
|
||||
Nach Ablauf dieser Fristen werden die Daten unwiderruflich gelöscht.
|
||||
|
||||
---
|
||||
|
||||
### 4.8 Widerruf der Einwilligung
|
||||
|
||||
Sie können Ihre Einwilligung zur Datenverarbeitung **jederzeit widerrufen**, ohne dass die Rechtmäßigkeit der bis zum Widerruf erfolgten Verarbeitung berührt wird.
|
||||
|
||||
**Widerruf-Möglichkeiten:**
|
||||
|
||||
1. **Cookie-Banner:** Klicken Sie auf den Link "Cookie-Einstellungen" im Footer dieser Website und wählen Sie "Nur notwendige"
|
||||
2. **E-Mail:** Senden Sie uns eine E-Mail an datenschutz@aegis-sight.de
|
||||
|
||||
Nach Widerruf wird das Tracking-Script nicht mehr geladen und es erfolgt keine weitere Datenerhebung.
|
||||
|
||||
---
|
||||
|
||||
### 4.9 Global Privacy Control (GPC)
|
||||
|
||||
Wir respektieren das **Global Privacy Control (GPC)**-Signal Ihres Browsers.
|
||||
|
||||
Wenn Ihr Browser das GPC-Signal sendet (z.B. Firefox mit aktiviertem Tracking-Schutz, Brave Browser), wird die Analyse automatisch deaktiviert, ohne dass Sie den Cookie-Banner bestätigen müssen.
|
||||
|
||||
**So aktivieren Sie GPC:**
|
||||
- **Firefox:** Einstellungen → Datenschutz & Sicherheit → Verbesserter Schutz vor Aktivitätenverfolgung
|
||||
- **Brave:** Standardmäßig aktiviert
|
||||
- **Chrome/Edge:** Erweiterungen wie "OptMeowt" installieren
|
||||
|
||||
---
|
||||
|
||||
### 4.10 Ihre Rechte
|
||||
|
||||
Sie haben folgende Rechte bezüglich Ihrer Daten:
|
||||
|
||||
#### Art. 15 DSGVO - Auskunftsrecht
|
||||
Sie können Auskunft über die zu Ihrer Person gespeicherten Daten verlangen.
|
||||
|
||||
#### Art. 16 DSGVO - Recht auf Berichtigung
|
||||
Sie können die Berichtigung unrichtiger Daten verlangen.
|
||||
|
||||
#### Art. 17 DSGVO - Recht auf Löschung
|
||||
Sie können die Löschung Ihrer Daten verlangen, sofern keine gesetzlichen Aufbewahrungspflichten entgegenstehen.
|
||||
|
||||
#### Art. 18 DSGVO - Recht auf Einschränkung
|
||||
Sie können die Einschränkung der Verarbeitung Ihrer Daten verlangen.
|
||||
|
||||
#### Art. 20 DSGVO - Recht auf Datenübertragbarkeit
|
||||
Sie können die Herausgabe Ihrer Daten in einem strukturierten Format verlangen.
|
||||
|
||||
#### Art. 21 DSGVO - Widerspruchsrecht
|
||||
Sie können der Verarbeitung Ihrer Daten jederzeit widersprechen.
|
||||
|
||||
#### Art. 77 DSGVO - Beschwerderecht
|
||||
Sie haben das Recht, sich bei einer Aufsichtsbehörde zu beschweren:
|
||||
|
||||
**Zuständige Aufsichtsbehörde:**
|
||||
[Name der zuständigen Datenschutzbehörde]
|
||||
[Adresse]
|
||||
[Telefon]
|
||||
[E-Mail]
|
||||
[Website]
|
||||
|
||||
---
|
||||
|
||||
### 4.11 Opt-Out
|
||||
|
||||
Sie können die Analyse durch folgende Maßnahmen verhindern:
|
||||
|
||||
1. **Cookie-Banner:** Wählen Sie "Nur notwendige" beim ersten Besuch – das Tracking-Script wird dann nicht geladen
|
||||
2. **Cookie-Einstellungen:** Klicken Sie jederzeit auf "Cookie-Einstellungen" im Footer, um Ihre Auswahl zu ändern
|
||||
3. **JavaScript deaktivieren:** Tracking funktioniert nur mit aktiviertem JavaScript
|
||||
4. **Ad-Blocker:** Viele Ad-Blocker blockieren auch Analytics-Skripte
|
||||
|
||||
---
|
||||
|
||||
### 4.12 Technische Sicherheitsmaßnahmen
|
||||
|
||||
Zum Schutz Ihrer Daten setzen wir folgende Maßnahmen ein:
|
||||
|
||||
- **SSL/TLS-Verschlüsselung:** Alle Daten werden verschlüsselt übertragen (HTTPS)
|
||||
- **Keine IP-Speicherung:** IP-Adressen werden nicht gespeichert oder protokolliert
|
||||
- **Cookieless Tracking:** Keine Cookies oder lokale Speicherung auf Ihrem Gerät
|
||||
- **Zugriffskontrolle:** Nur autorisierte Mitarbeiter haben Zugriff auf Analytics-Daten
|
||||
- **Datensparsamkeit:** Wir erheben nur die minimal notwendigen Daten
|
||||
- **Container-Isolation:** Analytics-System läuft in isolierter Docker-Umgebung
|
||||
- **Open Source:** Umami-Quellcode ist öffentlich einsehbar und auditierbar
|
||||
- **Regelmäßige Audits:** Vierteljährliche Überprüfung der Datenschutz-Compliance
|
||||
|
||||
---
|
||||
|
||||
### 4.13 Automatisierte Entscheidungsfindung / Profiling
|
||||
|
||||
Es findet **keine automatisierte Entscheidungsfindung** (einschließlich Profiling) gemäß Art. 22 DSGVO statt.
|
||||
|
||||
Die erhobenen Daten werden ausschließlich zu statistischen Zwecken verwendet und führen zu keinen Entscheidungen, die Sie persönlich betreffen.
|
||||
|
||||
---
|
||||
|
||||
### 4.14 Kontakt Datenschutz
|
||||
|
||||
Bei Fragen zur Verarbeitung Ihrer Daten können Sie sich an uns wenden:
|
||||
|
||||
**Verantwortlicher:**
|
||||
[Ihr Unternehmensname]
|
||||
[Straße Hausnummer]
|
||||
[PLZ Ort]
|
||||
|
||||
**Datenschutzbeauftragter:** (falls vorhanden)
|
||||
[Name]
|
||||
E-Mail: datenschutz@aegis-sight.de
|
||||
Telefon: [Telefonnummer]
|
||||
|
||||
---
|
||||
|
||||
## 5. Änderungen dieser Datenschutzerklärung
|
||||
|
||||
Wir behalten uns vor, diese Datenschutzerklärung anzupassen, um sie an geänderte Rechtslagen oder Änderungen unserer Dienstleistungen anzupassen.
|
||||
|
||||
**Stand:** 2026-03-20
|
||||
**Version:** 2.0
|
||||
|
||||
---
|
||||
|
||||
## Hinweis zu Cookies
|
||||
|
||||
AegisSight Analytics setzt **keine Cookies** und nutzt **keine lokale Speicherung** (LocalStorage) für Analysezwecke. Das System arbeitet vollständig cookieless. Eine Cookie-Tabelle für Analytics-Cookies ist daher nicht erforderlich.
|
||||
|
||||
Der Cookie-Banner auf unserer Website dient der Steuerung, ob das Tracking-Script geladen wird oder nicht. Bei Ablehnung findet keinerlei Datenerhebung statt.
|
||||
|
||||
---
|
||||
|
||||
## FAQ - Häufig gestellte Fragen
|
||||
|
||||
**Q: Warum nutzen Sie kein Google Analytics?**
|
||||
A: Wir möchten vollständige Kontrolle über die Daten behalten und diese nicht mit Drittanbietern teilen. Zudem vermeiden wir rechtliche Unsicherheiten bezüglich internationaler Datenübermittlung (Schrems II).
|
||||
|
||||
**Q: Setzt AegisSight Analytics Cookies?**
|
||||
A: Nein. Umami v3.0.3 arbeitet vollständig cookieless. Es werden keine Cookies, kein LocalStorage und keine anderen clientseitigen Speichermechanismen für Analysezwecke verwendet.
|
||||
|
||||
**Q: Wird meine IP-Adresse gespeichert?**
|
||||
A: Nein. Ihre IP-Adresse wird nur zur Laufzeit für die Standortbestimmung (Land/Region) verwendet und danach sofort verworfen. Sie wird niemals in der Datenbank gespeichert.
|
||||
|
||||
**Q: Kann ich als einzelner Nutzer nachverfolgt werden?**
|
||||
A: Nein. Da keine Cookies gesetzt, keine IP-Adressen gespeichert und keine Fingerprints erstellt werden, ist eine Identifikation oder Nachverfolgung einzelner Nutzer technisch nicht möglich.
|
||||
|
||||
**Q: Werden meine Daten verkauft?**
|
||||
A: Nein, niemals. Wir geben keine Daten an Dritte weiter oder verkaufen diese.
|
||||
|
||||
**Q: Was passiert, wenn ich im Cookie-Banner ablehne?**
|
||||
A: Das Tracking-Script wird nicht geladen. Die Website funktioniert vollständig normal – wir können lediglich keine anonymisierten Statistiken über Ihre Nutzung erfassen.
|
||||
|
||||
**Q: Ist das System DSGVO-konform?**
|
||||
A: Ja. Durch den Opt-In-Mechanismus, die vollständig cookieless Architektur, fehlende IP-Speicherung, Datensparsamkeit, Speicherbegrenzung und ausschließliche Verarbeitung in Deutschland erfüllen wir alle DSGVO-Anforderungen. Umami ist als datenschutzfreundliche Alternative zu Google Analytics bekannt.
|
||||
|
||||
**Q: Was ist Umami?**
|
||||
A: Umami ist eine quelloffene (Open Source) Web-Analytics-Software, die als datenschutzfreundliche Alternative zu Google Analytics entwickelt wurde. Der Quellcode ist öffentlich auf GitHub einsehbar.
|
||||
365
LAUNCH-CHECKLIST.md
Normale Datei
@@ -0,0 +1,365 @@
|
||||
# LAUNCH-CHECKLIST — Online-Schaltung der neuen AegisSight-Hauptseite
|
||||
|
||||
**Zielgruppe dieser Datei:** Claude (oder ein Mensch) auf einem anderen Rechner, der diese Datei vollständig liest und Schritt für Schritt ausführt. Alle Anweisungen sind so geschrieben, dass keine Eigenentscheidungen nötig sind.
|
||||
|
||||
**Auslöser:** Der User sagt sinngemäß "Jo stell online" oder "Schalte die Vorschau live".
|
||||
|
||||
**Was passiert:** Die Vorschauseite (`/vorschau/`) wird zur neuen Hauptseite (`/`). Die alte Hauptseite ("Sicherheit Made in Germany") wird in `_archiv/` verschoben. SEO wird aktiviert (robots.txt + sitemap.xml + Entfernung der noindex-Meta-Tags). Cookie-Consent + Umami sind bereits eingebaut.
|
||||
|
||||
---
|
||||
|
||||
## 0. Voraussetzungen — vor dem Start prüfen
|
||||
|
||||
- [ ] **Iran-Lage-Anpassung ist fertig.** Der zuständige Kollege hat die zu langen Iran-Lagen-Texte gekürzt/strukturiert. Sichtcheck: `https://aegis-sight.de/vorschau/` (Passwort: siehe Pass-Manager) → Demos-Karussell → Iran-Karte sollte ähnlich hoch sein wie Cyberangriffe und Deepfakes.
|
||||
- [ ] **SSH-Zugriff** auf `claude-dev@46.225.225.49` funktioniert.
|
||||
- [ ] **Git-Push-Rechte** für `https://gitea-undso.aegis-sight.de/AegisSight/Website.git` vorhanden (Token im Remote-URL eingebettet).
|
||||
- [ ] **User hat ausdrücklich Go gegeben** ("Stell online", "Schalte live", o.ä.).
|
||||
|
||||
Wenn ein Punkt nicht erfüllt: NICHT FORTSETZEN, dem User Bescheid geben.
|
||||
|
||||
---
|
||||
|
||||
## 1. Pre-Flight-Backup (Pflicht!)
|
||||
|
||||
Werden auf dem Server (`46.225.225.49`) ausgeführt:
|
||||
|
||||
```bash
|
||||
ssh claude-dev@46.225.225.49 'cd /opt/v2-Docker/aegis-website/html && git tag pre-launch-$(date +%Y%m%d-%H%M%S) && git push origin --tags'
|
||||
ssh claude-dev@46.225.225.49 'tar -czf /home/claude-dev/website-snapshot-$(date +%Y%m%d-%H%M%S).tar.gz -C /opt/v2-Docker/aegis-website html'
|
||||
ssh claude-dev@46.225.225.49 'ls -lh /home/claude-dev/website-snapshot-*.tar.gz | tail -1'
|
||||
```
|
||||
|
||||
Erwartet: Tar-Archiv ~40–60 MB. Git-Tag `pre-launch-YYYYMMDD-HHMMSS` ist gepusht.
|
||||
|
||||
**Notiere dir den Git-Tag-Namen** — du brauchst ihn fürs Rollback.
|
||||
|
||||
---
|
||||
|
||||
## 2. Schaltungs-Schritte (in genau dieser Reihenfolge)
|
||||
|
||||
Alle Pfade relativ zu `/opt/v2-Docker/aegis-website/html/`. Alle Commands per `ssh claude-dev@46.225.225.49 '...'` ausführen.
|
||||
|
||||
### 2.1 Archiv-Verzeichnis vorbereiten
|
||||
|
||||
```bash
|
||||
ssh claude-dev@46.225.225.49 'cd /opt/v2-Docker/aegis-website/html && mkdir -p _archiv'
|
||||
```
|
||||
|
||||
### 2.2 Alte Hauptseite-Files in `_archiv/` verschieben
|
||||
|
||||
```bash
|
||||
ssh claude-dev@46.225.225.49 'cd /opt/v2-Docker/aegis-website/html && \
|
||||
mv index.html _archiv/old-index.html && \
|
||||
cp -r css _archiv/old-css && \
|
||||
cp -r js _archiv/old-js && \
|
||||
mv robots.txt _archiv/old-robots.txt && \
|
||||
mv assets/videos/AFv6.mp4 _archiv/ 2>/dev/null; \
|
||||
mv assets/videos/hero-code-abstract.mp4 _archiv/ 2>/dev/null; \
|
||||
mv assets/videos/hero-data-flow.mp4 _archiv/ 2>/dev/null; \
|
||||
mv assets/videos/hero-network-viz.mp4 _archiv/ 2>/dev/null; \
|
||||
ls -la _archiv/'
|
||||
```
|
||||
|
||||
**Wichtig:** `css` und `js` werden mit `cp -r` (kopiert, NICHT verschoben), weil die Lagen-Seiten weiterhin `/js/config.js`, `/js/translations.js`, `/js/mobile-nav.js` aus dem alten /js/-Ordner brauchen. Die alten /css/-Stylesheets brauchen die Lagen ebenfalls (`/css/main.css`, `/css/fonts.css`, `/css/mobile.css`).
|
||||
|
||||
### 2.3 Neue Vorschau-Files an Hauptseite-Position kopieren
|
||||
|
||||
```bash
|
||||
ssh claude-dev@46.225.225.49 'cd /opt/v2-Docker/aegis-website/html && \
|
||||
cp vorschau/index.html index.html && \
|
||||
cp vorschau/css/style.css css/vorschau-style.css && \
|
||||
cp vorschau/js/app.js js/vorschau-app.js && \
|
||||
mkdir -p assets/videos/vorschau-hero && \
|
||||
cp vorschau/videos/* assets/videos/vorschau-hero/ && \
|
||||
ls -la index.html css/vorschau-style.css js/vorschau-app.js assets/videos/vorschau-hero/'
|
||||
```
|
||||
|
||||
**Begründung:** Die Vorschau-CSS heißt `style.css` und liegt unter `vorschau/css/`. Wenn wir sie nach `/css/style.css` packen, würden wir die alte Hauptseite-CSS überschreiben (die für Lagen-Seiten gebraucht wird, falls dort references existieren). Daher: eindeutige Namen `vorschau-style.css` und `vorschau-app.js`.
|
||||
|
||||
### 2.4 Pfade in der neuen `index.html` anpassen
|
||||
|
||||
Die Vorschau-`index.html` referenziert relativ:
|
||||
- `<link rel="stylesheet" href="css/style.css">` → muss zu `css/vorschau-style.css`
|
||||
- `<script src="js/app.js"></script>` → muss zu `js/vorschau-app.js`
|
||||
- `videos/hero-slide-X-monitoring.mp4` → muss zu `assets/videos/vorschau-hero/hero-slide-X-monitoring.mp4`
|
||||
|
||||
```bash
|
||||
ssh claude-dev@46.225.225.49 'cd /opt/v2-Docker/aegis-website/html && \
|
||||
sed -i "s|href=\"css/style.css\"|href=\"/css/vorschau-style.css\"|g" index.html && \
|
||||
sed -i "s|src=\"js/app.js\"|src=\"/js/vorschau-app.js\"|g" index.html && \
|
||||
sed -i "s|src=\"videos/hero-slide-|src=\"/assets/videos/vorschau-hero/hero-slide-|g" index.html && \
|
||||
grep -E "(vorschau-style|vorschau-app|vorschau-hero)" index.html | head -10'
|
||||
```
|
||||
|
||||
Erwartet: 7 Treffer (1× CSS, 1× JS, 5× Videos).
|
||||
|
||||
### 2.5 Passwort-Gate aus `index.html` entfernen
|
||||
|
||||
Folgenden Block ersatzlos löschen — es sind drei zusammenhängende Bereiche:
|
||||
1. `<!-- Password Gate -->` Kommentar + dahinterliegender `<style>`-Block
|
||||
2. `<div id="login-gate">...</div>`
|
||||
3. `<script>` mit `var PW_HASH=...` etc.
|
||||
|
||||
Sed-Lösung (einzeilig):
|
||||
|
||||
```bash
|
||||
ssh claude-dev@46.225.225.49 'cd /opt/v2-Docker/aegis-website/html && \
|
||||
python3 -c "
|
||||
import re
|
||||
with open(\"index.html\") as f: c = f.read()
|
||||
# Entferne den kompletten Block von '<!-- Password Gate -->' bis nach dem login-gate-Script
|
||||
c = re.sub(r'<!-- Password Gate -->.*?if\(getCookie.*?</script>', '', c, count=1, flags=re.DOTALL)
|
||||
with open(\"index.html\", \"w\") as f: f.write(c)
|
||||
print(\"Passwort-Gate entfernt\")
|
||||
"'
|
||||
```
|
||||
|
||||
Verifikation:
|
||||
|
||||
```bash
|
||||
ssh claude-dev@46.225.225.49 'grep -c "PW_HASH\|login-gate" /opt/v2-Docker/aegis-website/html/index.html'
|
||||
```
|
||||
|
||||
Erwartet: `0`
|
||||
|
||||
### 2.6 noindex/nofollow-Meta-Tags entfernen
|
||||
|
||||
In `index.html` und in den drei Lagen-Seiten:
|
||||
|
||||
```bash
|
||||
ssh claude-dev@46.225.225.49 'cd /opt/v2-Docker/aegis-website/html && \
|
||||
for f in index.html lagen/iran-konflikt/index.html lagen/cyberangriffe/index.html lagen/deepfakes/index.html; do \
|
||||
sed -i "/<meta name=\"robots\" content=\"noindex/d" "$f"; \
|
||||
done && \
|
||||
echo "--- Verbliebene noindex-Tags (sollte 0 sein):"; \
|
||||
grep -c noindex index.html lagen/*/index.html'
|
||||
```
|
||||
|
||||
Erwartet: Alle Dateien zeigen `0`.
|
||||
|
||||
### 2.7 robots.txt aktivieren (Crawler erlaubt)
|
||||
|
||||
```bash
|
||||
ssh claude-dev@46.225.225.49 'cd /opt/v2-Docker/aegis-website/html && \
|
||||
mv robots-launch.txt robots.txt && \
|
||||
head -10 robots.txt'
|
||||
```
|
||||
|
||||
Erwartet: erste Zeilen zeigen `Allow: /` und `Sitemap:` Verweis.
|
||||
|
||||
### 2.8 sitemap.xml aktivieren
|
||||
|
||||
```bash
|
||||
ssh claude-dev@46.225.225.49 'cd /opt/v2-Docker/aegis-website/html && \
|
||||
mv sitemap-launch.xml sitemap.xml && \
|
||||
head -5 sitemap.xml'
|
||||
```
|
||||
|
||||
### 2.9 Vorschau-Verzeichnis löschen
|
||||
|
||||
```bash
|
||||
ssh claude-dev@46.225.225.49 'cd /opt/v2-Docker/aegis-website/html && \
|
||||
rm -rf vorschau && \
|
||||
ls -d vorschau 2>&1 | tail -1'
|
||||
```
|
||||
|
||||
Erwartet: `ls: cannot access 'vorschau': No such file or directory`
|
||||
|
||||
### 2.10 `.bak.*`-Dateien aufräumen (optional)
|
||||
|
||||
```bash
|
||||
ssh claude-dev@46.225.225.49 'cd /opt/v2-Docker/aegis-website/html && \
|
||||
find . -name "*.bak.*" -type f -delete && \
|
||||
find . -name "*.bak.*" -type f | wc -l'
|
||||
```
|
||||
|
||||
Erwartet: `0`
|
||||
|
||||
### 2.11 Git-Commit + Push
|
||||
|
||||
```bash
|
||||
ssh claude-dev@46.225.225.49 'cd /opt/v2-Docker/aegis-website/html && \
|
||||
git add -A && \
|
||||
git status --short | head -30'
|
||||
```
|
||||
|
||||
Status prüfen — sollte zeigen:
|
||||
- `D index.html` (alte gelöscht), `?? index.html` (neue erscheint via add) → wird als "renamed" oder M erkannt
|
||||
- Diverse Dateien in `_archiv/` neu
|
||||
- `vorschau/` komplett gelöscht
|
||||
- `robots.txt`, `sitemap.xml` erscheinen oder werden modifiziert
|
||||
|
||||
```bash
|
||||
ssh claude-dev@46.225.225.49 'cd /opt/v2-Docker/aegis-website/html && \
|
||||
git commit -m "Online-Schaltung: Vorschau ist die neue Hauptseite
|
||||
|
||||
- Vorschau-Inhalt aus /vorschau/ nach /index.html, /css/vorschau-style.css, /js/vorschau-app.js, /assets/videos/vorschau-hero/ verschoben
|
||||
- Alte Hauptseite (Sicherheit Made in Germany) in /_archiv/ archiviert
|
||||
- Passwort-Gate entfernt
|
||||
- robots.txt: Crawler erlaubt (außer AI-Crawler), Sitemap-Verweis aktiviert
|
||||
- sitemap.xml aktiviert (Hauptseite, 3 Lagen, Impressum, Datenschutz)
|
||||
- noindex/nofollow Meta-Tags aus Hauptseite und Lagen entfernt
|
||||
|
||||
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>" && \
|
||||
git push origin main 2>&1 | tail -5'
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 3. Smoke-Tests (sofort nach Push)
|
||||
|
||||
Jeden Test einzeln ausführen, erwartete Antwort daneben prüfen:
|
||||
|
||||
```bash
|
||||
# Hauptseite läuft:
|
||||
curl -sI https://aegis-sight.de/ | head -1
|
||||
# Erwartet: HTTP/1.1 200 OK
|
||||
|
||||
# Title ist da:
|
||||
curl -s https://aegis-sight.de/ | grep -c '<title>AegisSight Monitor'
|
||||
# Erwartet: 1
|
||||
|
||||
# noindex ist WEG:
|
||||
curl -s https://aegis-sight.de/ | grep -c 'noindex'
|
||||
# Erwartet: 0
|
||||
|
||||
# Passwort-Gate ist WEG:
|
||||
curl -s https://aegis-sight.de/ | grep -c 'PW_HASH\|login-gate'
|
||||
# Erwartet: 0
|
||||
|
||||
# robots.txt erlaubt Crawling:
|
||||
curl -s https://aegis-sight.de/robots.txt | grep -c '^Allow:'
|
||||
# Erwartet: ≥1
|
||||
|
||||
# sitemap.xml ist da:
|
||||
curl -sI https://aegis-sight.de/sitemap.xml | head -1
|
||||
# Erwartet: HTTP/1.1 200 OK
|
||||
|
||||
# Vorschau ist 404:
|
||||
curl -sI https://aegis-sight.de/vorschau/ | head -1
|
||||
# Erwartet: HTTP/1.1 404 Not Found
|
||||
|
||||
# Lagen erreichbar:
|
||||
curl -sI https://aegis-sight.de/lagen/iran-konflikt/ | head -1
|
||||
# Erwartet: HTTP/1.1 200 OK
|
||||
curl -sI https://aegis-sight.de/lagen/cyberangriffe/ | head -1
|
||||
# Erwartet: HTTP/1.1 200 OK
|
||||
curl -sI https://aegis-sight.de/lagen/deepfakes/ | head -1
|
||||
# Erwartet: HTTP/1.1 200 OK
|
||||
|
||||
# Cookie-Consent Asset erreichbar:
|
||||
curl -sI https://aegis-sight.de/cookie-consent.js | head -1
|
||||
# Erwartet: HTTP/1.1 200 OK
|
||||
|
||||
# Impressum + Datenschutz:
|
||||
curl -sI https://aegis-sight.de/impressum.html | head -1
|
||||
curl -sI https://aegis-sight.de/datenschutz.html | head -1
|
||||
# Erwartet: beide HTTP/1.1 200 OK
|
||||
|
||||
# OG-Image:
|
||||
curl -sI https://aegis-sight.de/assets/images/og-image.png | head -1
|
||||
# Erwartet: HTTP/1.1 200 OK
|
||||
```
|
||||
|
||||
Wenn ALLE Smoke-Tests grün: **Sage dem User Bescheid, dass die Live-Schaltung erfolgreich war**, und bitte um manuelle Verifikation im Browser (Hard-Reload Strg+F5):
|
||||
- Layout korrekt
|
||||
- Cookie-Banner erscheint
|
||||
- Kontaktformular funktioniert
|
||||
- Hero-Videos laufen
|
||||
- Lagen-Karussell zeigt aktuelle Daten
|
||||
- Footer hat Cookie-Einstellungen-Link
|
||||
|
||||
---
|
||||
|
||||
## 4. Notfall-Rollback (falls Smoke-Tests fehlschlagen)
|
||||
|
||||
**Variante A — Git-Rollback (bevorzugt):**
|
||||
|
||||
```bash
|
||||
# Den Tag-Namen aus Schritt 1 verwenden (z.B. pre-launch-20260427-093015)
|
||||
ssh claude-dev@46.225.225.49 'cd /opt/v2-Docker/aegis-website/html && \
|
||||
git reset --hard pre-launch-YYYYMMDD-HHMMSS && \
|
||||
git push --force-with-lease origin main && \
|
||||
git status'
|
||||
```
|
||||
|
||||
⚠ **WICHTIG**: `--force-with-lease` ist sicherer als `--force`. Im seltenen Fall, dass jemand parallel committed hat, schlägt es fehl statt Daten zu überschreiben.
|
||||
|
||||
**Variante B — Server-Snapshot zurückspielen:**
|
||||
|
||||
```bash
|
||||
ssh claude-dev@46.225.225.49 'tar -xzf /home/claude-dev/website-snapshot-YYYYMMDD-HHMMSS.tar.gz -C /opt/v2-Docker/aegis-website/'
|
||||
```
|
||||
|
||||
**Nach Rollback**: Smoke-Tests erneut laufen lassen — Vorschau sollte wieder unter `/vorschau/` erreichbar sein, Hauptseite zeigt wieder die alte Version.
|
||||
|
||||
---
|
||||
|
||||
## 5. Manuelle Aufgaben (User/Kollege außerhalb des Skripts)
|
||||
|
||||
- **Browser-Test** auf `https://aegis-sight.de/` (Hard-Reload Strg+F5):
|
||||
- Layout, Hero-Videos, Karussell, Kontaktformular
|
||||
- Cookie-Banner erscheint, Akzeptieren funktioniert
|
||||
- Mobile-View testen
|
||||
- Lagen-Footer-Links funktionieren (z.B. `/#features`, `/#contact`)
|
||||
- **OG-Image-Preview** testen: URL in WhatsApp/Telegram/LinkedIn einfügen → Vorschaubild sollte erscheinen
|
||||
- **Eintrag in Search Console / Bing Webmaster:** ENTFÄLLT laut User-Wunsch (eigener Tracking-Pixel via Umami)
|
||||
|
||||
---
|
||||
|
||||
## 6. Notfall-Wiederherstellung der alten Hauptseite (separater, eigenständiger Block)
|
||||
|
||||
Falls jemand die alte Hauptseite ("Sicherheit Made in Germany") jemals wieder sehen/wiederherstellen möchte:
|
||||
|
||||
**Option A — aus `_archiv/` zurückkopieren:**
|
||||
|
||||
```bash
|
||||
ssh claude-dev@46.225.225.49 'cd /opt/v2-Docker/aegis-website/html && \
|
||||
ls _archiv/'
|
||||
# Zeigt: old-index.html, old-css/, old-js/, old-robots.txt, old-videos
|
||||
```
|
||||
|
||||
Ein einzelner File z.B.:
|
||||
|
||||
```bash
|
||||
ssh claude-dev@46.225.225.49 'cp /opt/v2-Docker/aegis-website/html/_archiv/old-index.html /tmp/old-index.html && head -30 /tmp/old-index.html'
|
||||
```
|
||||
|
||||
**Option B — aus Git-History wiederherstellen (auch wenn `_archiv/` mal gelöscht würde):**
|
||||
|
||||
```bash
|
||||
# Letzten Commit finden, der die alte index.html noch enthielt:
|
||||
ssh claude-dev@46.225.225.49 'cd /opt/v2-Docker/aegis-website/html && \
|
||||
git log --all --diff-filter=D --pretty=format:"%H %s" -- index.html | head -5'
|
||||
|
||||
# Dann die alte Datei aus diesem Commit zurückholen:
|
||||
ssh claude-dev@46.225.225.49 'cd /opt/v2-Docker/aegis-website/html && \
|
||||
git show <commit-hash>^:index.html > /tmp/old-index.html'
|
||||
```
|
||||
|
||||
Analog für `css/`, `js/` etc.
|
||||
|
||||
---
|
||||
|
||||
## 7. Anhang — Was wird wo geändert (Übersicht)
|
||||
|
||||
| Pfad | Vor Schaltung | Nach Schaltung |
|
||||
|---|---|---|
|
||||
| `/index.html` | "Sicherheit Made in Germany" (alte Hauptseite) | AegisSight Monitor (war Vorschau) |
|
||||
| `/vorschau/` | passwortgeschützte Vorschau | gelöscht (404) |
|
||||
| `/css/style.css` (alt) | aktiv (alte Hauptseite) | unter `/_archiv/old-css/style.css` |
|
||||
| `/css/vorschau-style.css` | nicht existent | aktiv (für neue Hauptseite) |
|
||||
| `/js/main.js` (alt) | aktiv | unter `/_archiv/old-js/main.js` |
|
||||
| `/js/vorschau-app.js` | nicht existent | aktiv |
|
||||
| `/css/main.css`, `/css/fonts.css`, `/css/mobile.css` | aktiv (für Hauptseite + Lagen) | aktiv (weiterhin für Lagen) |
|
||||
| `/js/config.js`, `/js/translations.js`, `/js/mobile-nav.js` | aktiv | aktiv (für Lagen) |
|
||||
| `/robots.txt` | blockiert alle Crawler | erlaubt Crawler (außer AI/Spam) |
|
||||
| `/sitemap.xml` | nicht existent | aktiv |
|
||||
| `/lagen/*/index.html` | hat noindex/nofollow | wird indexierbar |
|
||||
| `/cookie-consent.js`, `/cookie-consent.css` | aktiv (auf alter Hauptseite) | aktiv (auf neuer Hauptseite + Lagen) |
|
||||
| `/assets/images/og-image.png` | bereits vorhanden | weiterhin vorhanden |
|
||||
| `/datenschutz.html` | bereits erweitert (Kontakt + Umami) | unverändert |
|
||||
|
||||
---
|
||||
|
||||
**Bei Fragen oder unerwarteten Outputs:** NICHT improvisieren. Dem User die genaue Fehlermeldung melden und Anweisung abwarten.
|
||||
@@ -1,53 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg width="360" height="90" viewBox="0 0 360 90" xmlns="http://www.w3.org/2000/svg">
|
||||
<defs>
|
||||
<style>
|
||||
@import url('https://fonts.googleapis.com/css2?family=Poppins:wght@400;600&display=swap');
|
||||
</style>
|
||||
|
||||
<!-- Accurate shield matching original -->
|
||||
<g id="shield-eye-accurate">
|
||||
<!-- Angular shield shape -->
|
||||
<path d="M 35 30
|
||||
L 65 30
|
||||
L 75 40
|
||||
L 75 80
|
||||
L 50 115
|
||||
L 25 80
|
||||
L 25 40
|
||||
L 35 30 Z"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
stroke-width="3.5"
|
||||
stroke-linejoin="miter"/>
|
||||
|
||||
<!-- Eye centered in shield -->
|
||||
<g transform="translate(50, 65)">
|
||||
<!-- Almond/football shaped eye -->
|
||||
<ellipse cx="0" cy="0" rx="24" ry="13"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
stroke-width="3.5"/>
|
||||
|
||||
<!-- Circular iris -->
|
||||
<circle cx="0" cy="0" r="10"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
stroke-width="3.5"/>
|
||||
|
||||
<!-- Pupil -->
|
||||
<circle cx="0" cy="0" r="4" fill="currentColor"/>
|
||||
</g>
|
||||
</g>
|
||||
</defs>
|
||||
|
||||
<!-- Dark version for website - NO BACKGROUND, NO TAGLINE -->
|
||||
<g transform="translate(0, -30)">
|
||||
<!-- Shield centered vertically with text -->
|
||||
<g transform="translate(0, 0)" color="white">
|
||||
<use href="#shield-eye-accurate"/>
|
||||
</g>
|
||||
<!-- Text aligned with shield center - NO TAGLINE -->
|
||||
<text x="90" y="77" font-family="'Poppins', sans-serif" font-size="46" font-weight="600" fill="white">IntelSight</text>
|
||||
</g>
|
||||
</svg>
|
||||
|
Vorher Breite: | Höhe: | Größe: 1.7 KiB |
@@ -1,53 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg width="500" height="400" viewBox="0 0 500 400" xmlns="http://www.w3.org/2000/svg">
|
||||
<defs>
|
||||
<style>
|
||||
@import url('https://fonts.googleapis.com/css2?family=Poppins:wght@400;600&display=swap');
|
||||
</style>
|
||||
|
||||
<!-- Accurate shield matching original -->
|
||||
<g id="shield-eye-accurate">
|
||||
<!-- Angular shield shape -->
|
||||
<path d="M 35 30
|
||||
L 65 30
|
||||
L 75 40
|
||||
L 75 80
|
||||
L 50 115
|
||||
L 25 80
|
||||
L 25 40
|
||||
L 35 30 Z"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
stroke-width="3.5"
|
||||
stroke-linejoin="miter"/>
|
||||
|
||||
<!-- Eye centered in shield -->
|
||||
<g transform="translate(50, 65)">
|
||||
<!-- Almond/football shaped eye -->
|
||||
<ellipse cx="0" cy="0" rx="24" ry="13"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
stroke-width="3.5"/>
|
||||
|
||||
<!-- Circular iris -->
|
||||
<circle cx="0" cy="0" r="10"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
stroke-width="3.5"/>
|
||||
|
||||
<!-- Pupil -->
|
||||
<circle cx="0" cy="0" r="4" fill="currentColor"/>
|
||||
</g>
|
||||
</g>
|
||||
</defs>
|
||||
|
||||
<!-- Dark version for website - NO BACKGROUND, NO TAGLINE -->
|
||||
<g transform="translate(40, 200)">
|
||||
<!-- Shield centered vertically with text -->
|
||||
<g transform="translate(0, -72.5)" color="white">
|
||||
<use href="#shield-eye-accurate"/>
|
||||
</g>
|
||||
<!-- Text aligned with shield center - NO TAGLINE -->
|
||||
<text x="110" y="5" font-family="'Poppins', sans-serif" font-size="46" font-weight="600" fill="white">IntelSight</text>
|
||||
</g>
|
||||
</svg>
|
||||
|
Vorher Breite: | Höhe: | Größe: 1.7 KiB |
@@ -1,40 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg width="200" height="200" viewBox="0 0 200 200" xmlns="http://www.w3.org/2000/svg">
|
||||
<!-- Shield only - dark version (white on transparent) -->
|
||||
<g transform="translate(100, 100)">
|
||||
<!-- Center the shield -->
|
||||
<g transform="translate(-50, -72.5)">
|
||||
<!-- Angular shield shape -->
|
||||
<path d="M 35 30
|
||||
L 65 30
|
||||
L 75 40
|
||||
L 75 80
|
||||
L 50 115
|
||||
L 25 80
|
||||
L 25 40
|
||||
L 35 30 Z"
|
||||
fill="none"
|
||||
stroke="white"
|
||||
stroke-width="3.5"
|
||||
stroke-linejoin="miter"/>
|
||||
|
||||
<!-- Eye centered in shield -->
|
||||
<g transform="translate(50, 65)">
|
||||
<!-- Almond/football shaped eye -->
|
||||
<ellipse cx="0" cy="0" rx="24" ry="13"
|
||||
fill="none"
|
||||
stroke="white"
|
||||
stroke-width="3.5"/>
|
||||
|
||||
<!-- Circular iris -->
|
||||
<circle cx="0" cy="0" r="10"
|
||||
fill="none"
|
||||
stroke="white"
|
||||
stroke-width="3.5"/>
|
||||
|
||||
<!-- Pupil -->
|
||||
<circle cx="0" cy="0" r="4" fill="white"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
Vorher Breite: | Höhe: | Größe: 1.2 KiB |
112
PROFESSIONAL_TOOLBOX_CONTENT.md
Normale Datei
@@ -0,0 +1,112 @@
|
||||
# Professional Toolbox - Backup Content
|
||||
|
||||
## Beschreibung
|
||||
Dieser Code enthält die vollständige Professional Toolbox Produktkarte, die temporär von der Website entfernt wurde.
|
||||
|
||||
## Verwendung
|
||||
Um die Professional Toolbox wieder auf der Website anzuzeigen, fügen Sie den folgenden HTML-Code in die `index.html` innerhalb des `<div class="products-grid">` Elements ein:
|
||||
|
||||
```html
|
||||
<!-- Product: AegisSight Professional Toolbox -->
|
||||
<div class="product-card">
|
||||
<div class="product-header">
|
||||
<div class="product-icon-wrapper">
|
||||
<div class="product-icon-bg"></div>
|
||||
<img class="product-icon" src="assets/images/icons/cube.svg" alt="Toolbox">
|
||||
</div>
|
||||
<div class="product-title-wrapper">
|
||||
<h3 class="product-title" data-translate="productToolboxTitle">Professional Toolbox</h3>
|
||||
<p class="product-tagline">Professional OSINT Suite</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="product-body">
|
||||
<p class="product-description" data-translate="productToolboxDesc">Eine leistungsstarke Desktop-Anwendung mit fünf essentiellen Tools für behördliche OSINT-Ermittler und Analysten. Modernes Design, intuitive Bedienung, professionelle Funktionen.</p>
|
||||
<button class="product-learn-more expand-button" data-expanded="false" onclick="toggleTools(this)">
|
||||
<span data-translate="expandDetails">Details anzeigen</span>
|
||||
</button>
|
||||
|
||||
<!-- Tools Grid (Hidden by default, shown on expand) -->
|
||||
<div class="tools-grid collapsed" id="toolsGrid">
|
||||
<!-- Tool 1: Metadata Analyzer -->
|
||||
<div class="tool-card">
|
||||
<div class="tool-icon">
|
||||
<img src="assets/images/icons/document.svg" alt="Document" width="48" height="48">
|
||||
</div>
|
||||
<h4 data-translate="tool1Title">Metadata Analyzer</h4>
|
||||
<div class="tool-features">
|
||||
<ul>
|
||||
<li data-translate="tool1Feature1">Extrahiert versteckte Informationen (EXIF, GPS, Erstellungsdaten)</li>
|
||||
<li data-translate="tool1Feature2">Forensische Analyse von Dokumenten & Bildern</li>
|
||||
<li data-translate="tool1Feature3">Export als JSON</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Tool 2: Screen Recorder -->
|
||||
<div class="tool-card">
|
||||
<div class="tool-icon">
|
||||
<img src="assets/images/icons/video-camera.svg" alt="Video" width="48" height="48">
|
||||
</div>
|
||||
<h4 data-translate="tool2Title">Screen Recorder</h4>
|
||||
<div class="tool-features">
|
||||
<ul>
|
||||
<li data-translate="tool2Feature1">Bildschirmaufnahme mit Audio (System & Mikrofon)</li>
|
||||
<li data-translate="tool2Feature2">Bereichsauswahl oder Vollbild</li>
|
||||
<li data-translate="tool2Feature3">Wählbare Qualitätsstufen</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Tool 3: Video Crawler -->
|
||||
<div class="tool-card">
|
||||
<div class="tool-icon">
|
||||
<img src="assets/images/icons/shield-play.svg" alt="Security" width="48" height="48">
|
||||
</div>
|
||||
<h4 data-translate="tool3Title">Video Crawler</h4>
|
||||
<div class="tool-features">
|
||||
<ul>
|
||||
<li data-translate="tool3Feature1">Download von Videos aus 1000+ Plattformen</li>
|
||||
<li data-translate="tool3Feature2">Automatischer Untertitel-Download</li>
|
||||
<li data-translate="tool3Feature3">Qualitätsauswahl</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Tool 4: Website Crawler -->
|
||||
<div class="tool-card">
|
||||
<div class="tool-icon">
|
||||
<img src="assets/images/icons/globe.svg" alt="Global" width="48" height="48">
|
||||
</div>
|
||||
<h4 data-translate="tool4Title">Website Crawler</h4>
|
||||
<div class="tool-features">
|
||||
<ul>
|
||||
<li data-translate="tool4Feature1">Archiviert Webseiten offline</li>
|
||||
<li data-translate="tool4Feature2">Einstellbare Crawling-Tiefe</li>
|
||||
<li data-translate="tool4Feature3">Erhält Originalstruktur inkl. CSS, JS & Medien</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Tool 5: Multimedia Converter -->
|
||||
<div class="tool-card">
|
||||
<div class="tool-icon">
|
||||
<img src="assets/images/icons/cube.svg" alt="Architecture" width="48" height="48">
|
||||
</div>
|
||||
<h4 data-translate="tool5Title">Multimedia Converter</h4>
|
||||
<div class="tool-features">
|
||||
<ul>
|
||||
<li data-translate="tool5Feature1">Konvertierung von Bildern, Videos, Audio</li>
|
||||
<li data-translate="tool5Feature2">Batch-Verarbeitung</li>
|
||||
<li data-translate="tool5Feature3">Drag & Drop Unterstützung</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
```
|
||||
|
||||
## Hinweise
|
||||
- Die Professional Toolbox wurde temporär entfernt, um die AccountForger-Box korrekt zu zentrieren
|
||||
- Der Code ist vollständig funktionsfähig und kann jederzeit wieder eingefügt werden
|
||||
- Alle Übersetzungsschlüssel und Funktionen sind bereits in den entsprechenden JavaScript-Dateien vorhanden
|
||||
@@ -1 +0,0 @@
|
||||
# website
|
||||
59
VIDEO_UPLOAD_INSTRUCTIONS.md
Normale Datei
@@ -0,0 +1,59 @@
|
||||
# Video Upload Instructions / Video-Upload-Anleitung
|
||||
|
||||
## Problem
|
||||
Die Video-Dateien für die Website sind zu groß für den direkten Git-Push aufgrund der Server-Einstellungen (HTTP 413 - Request Entity Too Large).
|
||||
|
||||
## Lösung
|
||||
|
||||
### Option 1: Server-Konfiguration anpassen
|
||||
Auf dem Gitea-Server müssen folgende Einstellungen angepasst werden:
|
||||
|
||||
1. **Gitea Konfiguration** (`/etc/gitea/app.ini` oder ähnlich):
|
||||
```ini
|
||||
[server]
|
||||
LFS_MAX_FILE_SIZE = 200000000 ; 200MB
|
||||
[repository]
|
||||
MAX_CREATION_LIMIT = -1
|
||||
[repository.upload]
|
||||
FILE_MAX_SIZE = 200
|
||||
MAX_FILES = 10
|
||||
```
|
||||
|
||||
2. **Nginx Konfiguration** (falls verwendet):
|
||||
```nginx
|
||||
client_max_body_size 200M;
|
||||
client_body_buffer_size 200M;
|
||||
```
|
||||
|
||||
3. **Apache Konfiguration** (falls verwendet):
|
||||
```apache
|
||||
LimitRequestBody 209715200
|
||||
```
|
||||
|
||||
Nach Änderungen Server/Dienste neustarten:
|
||||
```bash
|
||||
sudo systemctl restart gitea
|
||||
sudo systemctl restart nginx # oder apache2
|
||||
```
|
||||
|
||||
### Option 2: Manuelle Video-Uploads
|
||||
|
||||
Die folgenden Video-Dateien müssen manuell hochgeladen werden:
|
||||
|
||||
| Datei | Größe | Verwendung |
|
||||
|-------|-------|------------|
|
||||
| `assets/videos/AFv6.mp4` | 90MB | AccountForger Demo Video |
|
||||
| `assets/videos/hero-code-abstract.mp4` | 11MB | Hero Background Animation 1 |
|
||||
| `assets/videos/hero-data-flow.mp4` | 7.3MB | Hero Background Animation 2 |
|
||||
| `assets/videos/hero-network-viz.mp4` | 14MB | Hero Background Animation 3 |
|
||||
|
||||
#### Upload via SCP/SFTP:
|
||||
```bash
|
||||
scp assets/videos/*.mp4 user@gitea-server:/path/to/website/assets/videos/
|
||||
```
|
||||
|
||||
### Option 3: CDN/External Storage
|
||||
Alternativ können die Videos auf einem CDN oder externen Storage-Service gehostet werden und die URLs in den HTML-Dateien entsprechend angepasst werden.
|
||||
|
||||
## Temporäre Lösung
|
||||
Die Website funktioniert auch ohne die Videos - es werden dann keine Hintergrund-Animationen angezeigt.
|
||||
@@ -3,8 +3,7 @@
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>AccountForger</title>
|
||||
<link rel="stylesheet" href="styles-intelsight.css">
|
||||
<title>AccountForger - AegisSight</title>
|
||||
<link rel="stylesheet" href="css/fonts.css">
|
||||
<style>
|
||||
:root {
|
||||
@@ -12,7 +11,7 @@
|
||||
}
|
||||
|
||||
body {
|
||||
background: linear-gradient(135deg, #0a0a0a 0%, #1a1a1a 100%);
|
||||
background: linear-gradient(135deg, #0A1832 0%, #060F20 100%);
|
||||
min-height: 100vh;
|
||||
min-height: calc(var(--vh, 1vh) * 100);
|
||||
overflow-x: hidden;
|
||||
@@ -37,8 +36,8 @@
|
||||
align-items: center;
|
||||
gap: 0.5rem;
|
||||
padding: 0.75rem 1.5rem;
|
||||
background: rgba(255, 255, 255, 0.1);
|
||||
border: 1px solid rgba(255, 255, 255, 0.2);
|
||||
background: rgba(200, 168, 81, 0.15);
|
||||
border: 1px solid rgba(200, 168, 81, 0.3);
|
||||
border-radius: 8px;
|
||||
color: #fff;
|
||||
text-decoration: none;
|
||||
@@ -50,7 +49,7 @@
|
||||
}
|
||||
|
||||
.back-button:hover {
|
||||
background: rgba(255, 255, 255, 0.15);
|
||||
background: rgba(200, 168, 81, 0.25);
|
||||
transform: translateX(-5px);
|
||||
}
|
||||
|
||||
@@ -242,7 +241,7 @@
|
||||
}
|
||||
|
||||
.play-button, .fullscreen-button, .volume-button {
|
||||
background: rgba(255, 255, 255, 0.2);
|
||||
background: rgba(200, 168, 81, 0.25);
|
||||
border: none;
|
||||
width: 40px;
|
||||
height: 40px;
|
||||
@@ -255,7 +254,7 @@
|
||||
}
|
||||
|
||||
.play-button:hover, .fullscreen-button:hover, .volume-button:hover {
|
||||
background: rgba(255, 255, 255, 0.3);
|
||||
background: rgba(200, 168, 81, 0.4);
|
||||
transform: scale(1.1);
|
||||
}
|
||||
|
||||
@@ -288,7 +287,7 @@
|
||||
|
||||
.volume-fill {
|
||||
height: 100%;
|
||||
background: #00d4ff;
|
||||
background: #C8A851;
|
||||
border-radius: 2px;
|
||||
width: 100%;
|
||||
}
|
||||
@@ -304,7 +303,7 @@
|
||||
|
||||
.progress-fill {
|
||||
height: 100%;
|
||||
background: #00d4ff;
|
||||
background: #C8A851;
|
||||
border-radius: 2px;
|
||||
width: 0%;
|
||||
transition: width 0.1s linear;
|
||||
@@ -323,7 +322,7 @@
|
||||
margin-top: 2rem;
|
||||
padding: 1rem;
|
||||
background: rgba(255, 255, 255, 0.05);
|
||||
border: 1px solid rgba(255, 255, 255, 0.1);
|
||||
border: 1px solid rgba(200, 168, 81, 0.2);
|
||||
border-radius: 8px;
|
||||
text-align: center;
|
||||
color: rgba(255, 255, 255, 0.7);
|
||||
@@ -338,7 +337,7 @@
|
||||
height: 20px;
|
||||
vertical-align: middle;
|
||||
margin-right: 0.5rem;
|
||||
fill: #00d4ff;
|
||||
fill: #C8A851;
|
||||
}
|
||||
|
||||
@keyframes fadeInUp {
|
||||
@@ -519,6 +518,8 @@
|
||||
}
|
||||
}
|
||||
</style>
|
||||
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
|
||||
<link rel="apple-touch-icon" href="/assets/images/logos/AegisSightLogo_NavyGold.svg">
|
||||
</head>
|
||||
<body>
|
||||
<div class="video-container">
|
||||
@@ -530,8 +531,9 @@
|
||||
</a>
|
||||
|
||||
<div class="video-header">
|
||||
<img loading="lazy" src="assets/images/logos/AegisSightLogo_NavyGold.svg" alt="AegisSight" style="height: 48px; margin-bottom: 1rem;">
|
||||
<h1>AccountForger</h1>
|
||||
<p>Exklusiver Zugang für autorisierte Behörden</p>
|
||||
<p>Video-Demo</p>
|
||||
</div>
|
||||
|
||||
<div class="video-wrapper">
|
||||
@@ -570,20 +572,11 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="security-notice">
|
||||
<svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M12 2L2 7V11C2 16.5 6.5 20.5 12 22C17.5 20.5 22 16.5 22 11V7L12 2Z" stroke="currentColor" stroke-width="2"/>
|
||||
<path d="M9 12L11 14L15 10" stroke="currentColor" stroke-width="2"/>
|
||||
</svg>
|
||||
Dieses Video ist geschützt und nur für autorisierte Nutzer zugänglich.
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
// Check authentication
|
||||
if (!sessionStorage.getItem('accountForgerAuth')) {
|
||||
window.location.href = 'index.html';
|
||||
}
|
||||
// Zugangsschutz wird serverseitig von Nginx (auth_request) geprueft.
|
||||
// Wenn diese Seite laedt, wurde der Zugang bereits verifiziert.
|
||||
|
||||
// Video player functionality
|
||||
const video = document.getElementById('protectedVideo');
|
||||
|
||||
73
analytics-events.js
Normale Datei
@@ -0,0 +1,73 @@
|
||||
/**
|
||||
* AegisSight Analytics - Custom Events
|
||||
* Trackt wichtige Nutzerinteraktionen via Umami
|
||||
*/
|
||||
(function() {
|
||||
"use strict";
|
||||
|
||||
// Nur tracken wenn umami geladen ist
|
||||
function track(name, data) {
|
||||
if (typeof umami !== "undefined" && umami.track) {
|
||||
umami.track(name, data);
|
||||
}
|
||||
}
|
||||
|
||||
document.addEventListener("DOMContentLoaded", function() {
|
||||
|
||||
// 1. Produkt-Tab geklickt
|
||||
document.querySelectorAll("[data-translate]").forEach(function(el) {
|
||||
if (el.closest(".products-section, .product-card, .tab-button")) {
|
||||
el.addEventListener("click", function() {
|
||||
var text = el.textContent.trim().substring(0, 50);
|
||||
track("Produkt-Interesse", { element: text });
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
// 2. About-Tabs (Unternehmen, Mission, Kernkompetenzen, Versprechen)
|
||||
document.querySelectorAll(".about-tab, .tab-btn, [data-tab]").forEach(function(el) {
|
||||
el.addEventListener("click", function() {
|
||||
var tab = el.getAttribute("data-tab") || el.textContent.trim().substring(0, 30);
|
||||
track("About-Tab", { tab: tab });
|
||||
});
|
||||
});
|
||||
|
||||
// 3. Kontaktbereich erreicht (Scroll)
|
||||
var contactTracked = false;
|
||||
var observer = new IntersectionObserver(function(entries) {
|
||||
entries.forEach(function(entry) {
|
||||
if (entry.isIntersecting && !contactTracked) {
|
||||
contactTracked = true;
|
||||
track("Kontakt-Bereich-erreicht");
|
||||
}
|
||||
});
|
||||
}, { threshold: 0.5 });
|
||||
|
||||
var footer = document.querySelector("footer, .contact-section, #kontakt, #contact");
|
||||
if (footer) observer.observe(footer);
|
||||
|
||||
// 4. Sprachenwechsel
|
||||
document.querySelectorAll(".lang-switch, .language-btn, [data-lang]").forEach(function(el) {
|
||||
el.addEventListener("click", function() {
|
||||
var lang = el.getAttribute("data-lang") || el.textContent.trim();
|
||||
track("Sprachenwechsel", { sprache: lang });
|
||||
});
|
||||
});
|
||||
|
||||
// 5. Lagebild-Seite: Tab gewechselt
|
||||
if (window.location.pathname.indexOf("lagen") > -1) {
|
||||
document.querySelectorAll(".tab-button, [data-tab]").forEach(function(el) {
|
||||
el.addEventListener("click", function() {
|
||||
var tab = el.getAttribute("data-tab") || el.textContent.trim().substring(0, 30);
|
||||
track("Lagebild-Tab", { tab: tab });
|
||||
});
|
||||
});
|
||||
track("Lagebild-Besuch");
|
||||
}
|
||||
|
||||
// 6. AccountForger Video aufgerufen
|
||||
if (window.location.pathname.indexOf("accountforger") > -1) {
|
||||
track("AccountForger-Video-Aufruf");
|
||||
}
|
||||
});
|
||||
})();
|
||||
1
assets/images/icons/languages.svg
Normale Datei
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m5 8 6 6"/><path d="m4 14 6-6 2-3"/><path d="M2 5h12"/><path d="M7 2h1"/><path d="m22 22-5-10-5 10"/><path d="M14 18h6"/></svg>
|
||||
|
Nachher Breite: | Höhe: | Größe: 318 B |
1
assets/images/icons/monitor.svg
Normale Datei
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect width="20" height="14" x="2" y="3" rx="2"/><line x1="8" x2="16" y1="21" y2="21"/><line x1="12" x2="12" y1="17" y2="21"/></svg>
|
||||
|
Nachher Breite: | Höhe: | Größe: 314 B |
6
assets/images/icons/world-globe.svg
Normale Datei
@@ -0,0 +1,6 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
|
||||
<path d="M21.54 15H17a2 2 0 0 0-2 2v4.54"/>
|
||||
<path d="M7 3.34V5a3 3 0 0 0 3 3a2 2 0 0 1 2 2c0 1.1.9 2 2 2a2 2 0 0 0 2-2c0-1.1.9-2 2-2h3.17"/>
|
||||
<path d="M11 21.95V18a2 2 0 0 0-2-2a2 2 0 0 1-2-2v-1a2 2 0 0 0-2-2H2.05"/>
|
||||
<circle cx="12" cy="12" r="10"/>
|
||||
</svg>
|
||||
|
Nachher Breite: | Höhe: | Größe: 446 B |
8
assets/images/logos/AegisSightLogo_NavyGold.svg
Normale Datei
@@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg width="100%" height="100%" viewBox="0 0 400 497" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
|
||||
<g id="svgg">
|
||||
<path id="rechts" d="M212.575,238.576C212.984,240.67 223.048,241.002 270.154,240.533C349.694,239.739 344.481,239.31 346.236,243.942C347.823,248.13 347.264,250.927 338.778,272.292C333.041,286.737 321.692,301.671 304.569,327.057C262.704,389.124 258.243,380.556 257.465,379.844C256.548,379.007 256.695,378.153 256.7,377.409C256.827,359.293 254.573,273.452 254.549,270.937C254.525,268.422 254.116,268.891 229.156,268.982C211.282,269.047 211.756,268.669 211.925,271.847C211.971,272.701 212.094,316.69 212.2,369.6C212.306,422.51 212.487,468.568 212.604,469.063C213.014,470.81 224.336,462 224.6,462C224.864,462 237.107,453.265 241.4,450.384C242.5,449.646 244.343,448.313 245.496,447.421C246.648,446.53 248.865,444.9 250.421,443.8C251.978,442.7 255.169,440.115 257.513,438.055C259.857,435.996 262.771,433.605 263.988,432.743C267.489,430.261 269.974,428.216 270.637,427.269C270.973,426.789 271.767,426.127 272.4,425.8C273.034,425.472 273.862,424.68 274.24,424.04C274.618,423.399 275.574,422.512 276.364,422.067C277.741,421.292 287.002,412.973 290.077,409.749C290.89,408.897 293.68,406.009 296.277,403.331C303.179,396.216 308.766,389.886 310.684,387.009C311.611,385.619 312.782,384.149 313.286,383.741C313.791,383.334 314.523,382.55 314.913,382C315.304,381.45 316.113,380.353 316.711,379.562C317.31,378.771 318.552,377.132 319.471,375.919C320.389,374.706 321.709,373.103 322.403,372.357C324.097,370.534 325.597,368.32 327.217,365.252C327.957,363.85 329.057,362.338 329.66,361.892C330.264,361.446 331.622,359.655 332.679,357.912C333.735,356.168 335.453,353.696 336.496,352.417C337.539,351.139 338.935,348.947 339.599,347.546C341.424,343.695 344.598,338.004 345.689,336.626C347.172,334.754 348.692,331.944 348.986,330.528C349.132,329.828 349.51,329.041 349.826,328.779C350.142,328.517 350.4,328.069 350.4,327.784C350.4,327.499 351.048,326.045 351.84,324.552C352.632,323.059 353.784,320.479 354.401,318.819C355.017,317.159 356.416,314.072 357.509,311.96C358.602,309.848 359.894,306.968 360.38,305.56C360.866,304.152 361.593,302.46 361.995,301.8C362.398,301.14 362.941,299.795 363.203,298.812C363.464,297.828 363.931,296.663 364.239,296.223C364.548,295.782 364.8,295.078 364.8,294.658C364.8,293.56 367.089,287.051 368.23,284.904C368.764,283.901 369.201,282.793 369.202,282.44C369.204,282.088 369.46,281.312 369.771,280.715C370.082,280.118 370.552,278.588 370.814,277.315C371.076,276.042 371.715,273.867 372.234,272.482C372.753,271.097 373.442,268.667 373.765,267.082C374.657,262.705 375.074,261.226 376.185,258.503C376.746,257.13 377.395,254.61 377.628,252.903C377.861,251.196 386.4,207.294 386.4,202.415C386.4,200.114 384.943,198.138 382.973,197.769C382.197,197.623 390.698,196.027 262.4,197.136L256.297,196.493C254.923,195.188 254.409,193.392 254.634,190.691C255.021,186.052 255.075,102.153 254.699,90.2C254.256,76.132 254.359,75.232 256.566,73.785C257.5,73.174 257.724,73.166 258.9,73.706C259.615,74.035 343.437,105.997 345.2,108.641L346.2,110.142L346.246,163.984L347.17,164.968L348.095,165.953L367.317,165.835L386.539,165.718L387.711,164.406L388.883,163.095L388.646,155.847C388.515,151.861 388.304,143.29 388.176,136.8C387.97,126.347 389.116,102.223 388.883,92.984C388.587,81.212 385.041,79.623 381.162,77.313C378.036,75.451 212.403,10.83 212.49,12.505" style="fill:rgb(200,168,81);"/>
|
||||
<path id="links" d="M31.8,72.797C19.193,77.854 16.869,77.149 16.354,86.093C16.177,89.171 13.694,109.47 13.373,112C11.292,128.389 11.075,175.356 12.999,192.8C13.326,195.77 15.755,217.626 17.524,225.4C17.975,227.38 21.242,245.556 21.798,247.6C23.196,252.741 27.444,269.357 28.368,273C29.454,277.277 33.845,288.636 34.632,290.326C35.42,292.017 39.017,301.259 39.364,301.931C39.973,303.107 41.279,306.405 42.799,310.6C43.879,313.58 46.904,319.091 47.546,320.62C48.78,323.561 51.339,328.992 51.965,330C52.17,330.33 53.466,332.67 54.845,335.2C56.223,337.73 65.855,353.259 67.765,356.052C72.504,362.981 75.544,366.754 76.46,368.119C78.119,370.593 79.488,372.185 85.821,379C87.66,380.98 89.758,383.356 90.483,384.279C92.003,386.218 92.035,386.23 93.151,385.3C94.267,384.37 94.041,384.013 94.036,382.593C94.015,376.905 94.025,351.182 94.025,351.182C94.062,315.081 94.745,313.16 93.752,308.626C92.302,301.997 88.001,300.043 80.439,284.793C71.474,266.714 65.169,255.803 62.016,248.485C61.011,246.153 59.289,240.91 61.521,240.882C65.215,240.836 143.575,240.107 144.382,240.673C145.808,241.671 146.494,243.516 146.346,245.959C146.058,250.736 146.217,438.282 146.511,439.663C146.825,441.137 153.946,447.096 162.193,452.924C177.223,463.547 187.111,469.578 187.956,468.458C189.091,466.954 188.058,10.288 188.006,12.482M146.001,134.292C145.999,164.821 146.043,190.718 146.099,191.84C146.336,196.617 147.019,196.45 127.622,196.354C106.312,196.249 58.054,196.89 58.054,196.89L57.06,195.896C55.315,194.152 55.678,132.49 55.766,126C56.004,108.467 56.656,110.707 66.745,106.586C70.345,105.116 134.261,79.128 135.708,78.566C146.998,74.183 145.972,74.295 146.055,76.768" style="fill:rgb(10,24,50);"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
Nachher Breite: | Höhe: | Größe: 5.3 KiB |
BIN
assets/images/logos/Logo+Schrift_Rechts.png
Normale Datei
|
Nachher Breite: | Höhe: | Größe: 31 KiB |
20
assets/images/logos/Logo+Schrift_Rechts.svg
Normale Datei
@@ -0,0 +1,20 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg viewBox="0 0 1231 385" preserveAspectRatio="xMidYMid meet" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
|
||||
<g id="Logo-Schrift" serif:id="Logo+Schrift" transform="matrix(1.075028,0,0,0.631883,0,-494.958122)">
|
||||
<rect x="0" y="783.307" width="1144.799" height="607.865" style="fill:none;"/>
|
||||
<g transform="matrix(1.521788,0,0,2.589032,114.348241,790.79828)">
|
||||
<g transform="matrix(104.166667,0,0,104.166667,636.063765,201.582585)">
|
||||
</g>
|
||||
<text x="120.491px" y="201.583px" style="font-family:'Lato-Bold', 'Lato', sans-serif;font-weight:700;font-size:104.167px;fill:rgb(10,24,50);">Aegis<tspan x="375.595px 432.522px " y="201.583px 201.583px ">Si</tspan>gh<tspan x="572.001px " y="201.583px ">t</tspan></text>
|
||||
</g>
|
||||
<g transform="matrix(0.738271,0,0,1.256027,162.661946,1094.789099)">
|
||||
<g transform="matrix(1,0,0,1,-200,-248.484848)">
|
||||
<g id="svgg">
|
||||
<path id="rechts" d="M212.575,238.576C212.984,240.67 223.048,241.002 270.154,240.533C349.694,239.739 344.481,239.31 346.236,243.942C347.823,248.13 347.264,250.927 338.778,272.292C333.041,286.737 321.692,301.671 304.569,327.057C262.704,389.124 258.243,380.556 257.465,379.844C256.548,379.007 256.695,378.153 256.7,377.409C256.827,359.293 254.573,273.452 254.549,270.937C254.525,268.422 254.116,268.891 229.156,268.982C211.282,269.047 211.756,268.669 211.925,271.847C211.971,272.701 212.094,316.69 212.2,369.6C212.306,422.51 212.487,468.568 212.604,469.063C213.014,470.81 224.336,462 224.6,462C224.864,462 237.107,453.265 241.4,450.384C242.5,449.646 244.343,448.313 245.496,447.421C246.648,446.53 248.865,444.9 250.421,443.8C251.978,442.7 255.169,440.115 257.513,438.055C259.857,435.996 262.771,433.605 263.988,432.743C267.489,430.261 269.974,428.216 270.637,427.269C270.973,426.789 271.767,426.127 272.4,425.8C273.034,425.472 273.862,424.68 274.24,424.04C274.618,423.399 275.574,422.512 276.364,422.067C277.741,421.292 287.002,412.973 290.077,409.749C290.89,408.897 293.68,406.009 296.277,403.331C303.179,396.216 308.766,389.886 310.684,387.009C311.611,385.619 312.782,384.149 313.286,383.741C313.791,383.334 314.523,382.55 314.913,382C315.304,381.45 316.113,380.353 316.711,379.562C317.31,378.771 318.552,377.132 319.471,375.919C320.389,374.706 321.709,373.103 322.403,372.357C324.097,370.534 325.597,368.32 327.217,365.252C327.957,363.85 329.057,362.338 329.66,361.892C330.264,361.446 331.622,359.655 332.679,357.912C333.735,356.168 335.453,353.696 336.496,352.417C337.539,351.139 338.935,348.947 339.599,347.546C341.424,343.695 344.598,338.004 345.689,336.626C347.172,334.754 348.692,331.944 348.986,330.528C349.132,329.828 349.51,329.041 349.826,328.779C350.142,328.517 350.4,328.069 350.4,327.784C350.4,327.499 351.048,326.045 351.84,324.552C352.632,323.059 353.784,320.479 354.401,318.819C355.017,317.159 356.416,314.072 357.509,311.96C358.602,309.848 359.894,306.968 360.38,305.56C360.866,304.152 361.593,302.46 361.995,301.8C362.398,301.14 362.941,299.795 363.203,298.812C363.464,297.828 363.931,296.663 364.239,296.223C364.548,295.782 364.8,295.078 364.8,294.658C364.8,293.56 367.089,287.051 368.23,284.904C368.764,283.901 369.201,282.793 369.202,282.44C369.204,282.088 369.46,281.312 369.771,280.715C370.082,280.118 370.552,278.588 370.814,277.315C371.076,276.042 371.715,273.867 372.234,272.482C372.753,271.097 373.442,268.667 373.765,267.082C374.657,262.705 375.074,261.226 376.185,258.503C376.746,257.13 377.395,254.61 377.628,252.903C377.861,251.196 386.4,207.294 386.4,202.415C386.4,200.114 384.943,198.138 382.973,197.769C382.197,197.623 390.698,196.027 262.4,197.136L256.297,196.493C254.923,195.188 254.409,193.392 254.634,190.691C255.021,186.052 255.075,102.153 254.699,90.2C254.256,76.132 254.359,75.232 256.566,73.785C257.5,73.174 257.724,73.166 258.9,73.706C259.615,74.035 343.437,105.997 345.2,108.641L346.2,110.142L346.246,163.984L347.17,164.968L348.095,165.953L367.317,165.835L386.539,165.718L387.711,164.406L388.883,163.095L388.646,155.847C388.515,151.861 388.304,143.29 388.176,136.8C387.97,126.347 389.116,102.223 388.883,92.984C388.587,81.212 385.041,79.623 381.162,77.313C378.036,75.451 212.403,10.83 212.49,12.505" style="fill:rgb(200,168,81);"/>
|
||||
<path id="links" d="M31.8,72.797C19.193,77.854 16.869,77.149 16.354,86.093C16.177,89.171 13.694,109.47 13.373,112C11.292,128.389 11.075,175.356 12.999,192.8C13.326,195.77 15.755,217.626 17.524,225.4C17.975,227.38 21.242,245.556 21.798,247.6C23.196,252.741 27.444,269.357 28.368,273C29.454,277.277 33.845,288.636 34.632,290.326C35.42,292.017 39.017,301.259 39.364,301.931C39.973,303.107 41.279,306.405 42.799,310.6C43.879,313.58 46.904,319.091 47.546,320.62C48.78,323.561 51.339,328.992 51.965,330C52.17,330.33 53.466,332.67 54.845,335.2C56.223,337.73 65.855,353.259 67.765,356.052C72.504,362.981 75.544,366.754 76.46,368.119C78.119,370.593 79.488,372.185 85.821,379C87.66,380.98 89.758,383.356 90.483,384.279C92.003,386.218 92.035,386.23 93.151,385.3C94.267,384.37 94.041,384.013 94.036,382.593C94.015,376.905 94.025,351.182 94.025,351.182C94.062,315.081 94.745,313.16 93.752,308.626C92.302,301.997 88.001,300.043 80.439,284.793C71.474,266.714 65.169,255.803 62.016,248.485C61.011,246.153 59.289,240.91 61.521,240.882C65.215,240.836 143.575,240.107 144.382,240.673C145.808,241.671 146.494,243.516 146.346,245.959C146.058,250.736 146.217,438.282 146.511,439.663C146.825,441.137 153.946,447.096 162.193,452.924C177.223,463.547 187.111,469.578 187.956,468.458C189.091,466.954 188.058,10.288 188.006,12.482M146.001,134.292C145.999,164.821 146.043,190.718 146.099,191.84C146.336,196.617 147.019,196.45 127.622,196.354C106.312,196.249 58.054,196.89 58.054,196.89L57.06,195.896C55.315,194.152 55.678,132.49 55.766,126C56.004,108.467 56.656,110.707 66.745,106.586C70.345,105.116 134.261,79.128 135.708,78.566C146.998,74.183 145.972,74.295 146.055,76.768" style="fill:rgb(10,24,50);"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
Nachher Breite: | Höhe: | Größe: 6.2 KiB |
|
Vorher Breite: | Höhe: | Größe: 7.9 KiB |
BIN
assets/images/og-image.png
Normale Datei
|
Nachher Breite: | Höhe: | Größe: 35 KiB |
60
assets/vendor/leaflet/MarkerCluster.Default.css
vendored
Normale Datei
@@ -0,0 +1,60 @@
|
||||
.marker-cluster-small {
|
||||
background-color: rgba(181, 226, 140, 0.6);
|
||||
}
|
||||
.marker-cluster-small div {
|
||||
background-color: rgba(110, 204, 57, 0.6);
|
||||
}
|
||||
|
||||
.marker-cluster-medium {
|
||||
background-color: rgba(241, 211, 87, 0.6);
|
||||
}
|
||||
.marker-cluster-medium div {
|
||||
background-color: rgba(240, 194, 12, 0.6);
|
||||
}
|
||||
|
||||
.marker-cluster-large {
|
||||
background-color: rgba(253, 156, 115, 0.6);
|
||||
}
|
||||
.marker-cluster-large div {
|
||||
background-color: rgba(241, 128, 23, 0.6);
|
||||
}
|
||||
|
||||
/* IE 6-8 fallback colors */
|
||||
.leaflet-oldie .marker-cluster-small {
|
||||
background-color: rgb(181, 226, 140);
|
||||
}
|
||||
.leaflet-oldie .marker-cluster-small div {
|
||||
background-color: rgb(110, 204, 57);
|
||||
}
|
||||
|
||||
.leaflet-oldie .marker-cluster-medium {
|
||||
background-color: rgb(241, 211, 87);
|
||||
}
|
||||
.leaflet-oldie .marker-cluster-medium div {
|
||||
background-color: rgb(240, 194, 12);
|
||||
}
|
||||
|
||||
.leaflet-oldie .marker-cluster-large {
|
||||
background-color: rgb(253, 156, 115);
|
||||
}
|
||||
.leaflet-oldie .marker-cluster-large div {
|
||||
background-color: rgb(241, 128, 23);
|
||||
}
|
||||
|
||||
.marker-cluster {
|
||||
background-clip: padding-box;
|
||||
border-radius: 20px;
|
||||
}
|
||||
.marker-cluster div {
|
||||
width: 30px;
|
||||
height: 30px;
|
||||
margin-left: 5px;
|
||||
margin-top: 5px;
|
||||
|
||||
text-align: center;
|
||||
border-radius: 15px;
|
||||
font: 12px "Helvetica Neue", Arial, Helvetica, sans-serif;
|
||||
}
|
||||
.marker-cluster span {
|
||||
line-height: 30px;
|
||||
}
|
||||
14
assets/vendor/leaflet/MarkerCluster.css
vendored
Normale Datei
@@ -0,0 +1,14 @@
|
||||
.leaflet-cluster-anim .leaflet-marker-icon, .leaflet-cluster-anim .leaflet-marker-shadow {
|
||||
-webkit-transition: -webkit-transform 0.3s ease-out, opacity 0.3s ease-in;
|
||||
-moz-transition: -moz-transform 0.3s ease-out, opacity 0.3s ease-in;
|
||||
-o-transition: -o-transform 0.3s ease-out, opacity 0.3s ease-in;
|
||||
transition: transform 0.3s ease-out, opacity 0.3s ease-in;
|
||||
}
|
||||
|
||||
.leaflet-cluster-spider-leg {
|
||||
/* stroke-dashoffset (duration and function) should match with leaflet-marker-icon transform in order to track it exactly */
|
||||
-webkit-transition: -webkit-stroke-dashoffset 0.3s ease-out, -webkit-stroke-opacity 0.3s ease-in;
|
||||
-moz-transition: -moz-stroke-dashoffset 0.3s ease-out, -moz-stroke-opacity 0.3s ease-in;
|
||||
-o-transition: -o-stroke-dashoffset 0.3s ease-out, -o-stroke-opacity 0.3s ease-in;
|
||||
transition: stroke-dashoffset 0.3s ease-out, stroke-opacity 0.3s ease-in;
|
||||
}
|
||||
BIN
assets/vendor/leaflet/images/layers-2x.png
vendored
Normale Datei
|
Nachher Breite: | Höhe: | Größe: 1.2 KiB |
BIN
assets/vendor/leaflet/images/layers.png
vendored
Normale Datei
|
Nachher Breite: | Höhe: | Größe: 696 B |
BIN
assets/vendor/leaflet/images/marker-icon-2x.png
vendored
Normale Datei
|
Nachher Breite: | Höhe: | Größe: 2.4 KiB |
BIN
assets/vendor/leaflet/images/marker-icon.png
vendored
Normale Datei
|
Nachher Breite: | Höhe: | Größe: 1.4 KiB |
BIN
assets/vendor/leaflet/images/marker-shadow.png
vendored
Normale Datei
|
Nachher Breite: | Höhe: | Größe: 618 B |
661
assets/vendor/leaflet/leaflet.css
vendored
Normale Datei
@@ -0,0 +1,661 @@
|
||||
/* required styles */
|
||||
|
||||
.leaflet-pane,
|
||||
.leaflet-tile,
|
||||
.leaflet-marker-icon,
|
||||
.leaflet-marker-shadow,
|
||||
.leaflet-tile-container,
|
||||
.leaflet-pane > svg,
|
||||
.leaflet-pane > canvas,
|
||||
.leaflet-zoom-box,
|
||||
.leaflet-image-layer,
|
||||
.leaflet-layer {
|
||||
position: absolute;
|
||||
left: 0;
|
||||
top: 0;
|
||||
}
|
||||
.leaflet-container {
|
||||
overflow: hidden;
|
||||
}
|
||||
.leaflet-tile,
|
||||
.leaflet-marker-icon,
|
||||
.leaflet-marker-shadow {
|
||||
-webkit-user-select: none;
|
||||
-moz-user-select: none;
|
||||
user-select: none;
|
||||
-webkit-user-drag: none;
|
||||
}
|
||||
/* Prevents IE11 from highlighting tiles in blue */
|
||||
.leaflet-tile::selection {
|
||||
background: transparent;
|
||||
}
|
||||
/* Safari renders non-retina tile on retina better with this, but Chrome is worse */
|
||||
.leaflet-safari .leaflet-tile {
|
||||
image-rendering: -webkit-optimize-contrast;
|
||||
}
|
||||
/* hack that prevents hw layers "stretching" when loading new tiles */
|
||||
.leaflet-safari .leaflet-tile-container {
|
||||
width: 1600px;
|
||||
height: 1600px;
|
||||
-webkit-transform-origin: 0 0;
|
||||
}
|
||||
.leaflet-marker-icon,
|
||||
.leaflet-marker-shadow {
|
||||
display: block;
|
||||
}
|
||||
/* .leaflet-container svg: reset svg max-width decleration shipped in Joomla! (joomla.org) 3.x */
|
||||
/* .leaflet-container img: map is broken in FF if you have max-width: 100% on tiles */
|
||||
.leaflet-container .leaflet-overlay-pane svg {
|
||||
max-width: none !important;
|
||||
max-height: none !important;
|
||||
}
|
||||
.leaflet-container .leaflet-marker-pane img,
|
||||
.leaflet-container .leaflet-shadow-pane img,
|
||||
.leaflet-container .leaflet-tile-pane img,
|
||||
.leaflet-container img.leaflet-image-layer,
|
||||
.leaflet-container .leaflet-tile {
|
||||
max-width: none !important;
|
||||
max-height: none !important;
|
||||
width: auto;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.leaflet-container img.leaflet-tile {
|
||||
/* See: https://bugs.chromium.org/p/chromium/issues/detail?id=600120 */
|
||||
mix-blend-mode: plus-lighter;
|
||||
}
|
||||
|
||||
.leaflet-container.leaflet-touch-zoom {
|
||||
-ms-touch-action: pan-x pan-y;
|
||||
touch-action: pan-x pan-y;
|
||||
}
|
||||
.leaflet-container.leaflet-touch-drag {
|
||||
-ms-touch-action: pinch-zoom;
|
||||
/* Fallback for FF which doesn't support pinch-zoom */
|
||||
touch-action: none;
|
||||
touch-action: pinch-zoom;
|
||||
}
|
||||
.leaflet-container.leaflet-touch-drag.leaflet-touch-zoom {
|
||||
-ms-touch-action: none;
|
||||
touch-action: none;
|
||||
}
|
||||
.leaflet-container {
|
||||
-webkit-tap-highlight-color: transparent;
|
||||
}
|
||||
.leaflet-container a {
|
||||
-webkit-tap-highlight-color: rgba(51, 181, 229, 0.4);
|
||||
}
|
||||
.leaflet-tile {
|
||||
filter: inherit;
|
||||
visibility: hidden;
|
||||
}
|
||||
.leaflet-tile-loaded {
|
||||
visibility: inherit;
|
||||
}
|
||||
.leaflet-zoom-box {
|
||||
width: 0;
|
||||
height: 0;
|
||||
-moz-box-sizing: border-box;
|
||||
box-sizing: border-box;
|
||||
z-index: 800;
|
||||
}
|
||||
/* workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=888319 */
|
||||
.leaflet-overlay-pane svg {
|
||||
-moz-user-select: none;
|
||||
}
|
||||
|
||||
.leaflet-pane { z-index: 400; }
|
||||
|
||||
.leaflet-tile-pane { z-index: 200; }
|
||||
.leaflet-overlay-pane { z-index: 400; }
|
||||
.leaflet-shadow-pane { z-index: 500; }
|
||||
.leaflet-marker-pane { z-index: 600; }
|
||||
.leaflet-tooltip-pane { z-index: 650; }
|
||||
.leaflet-popup-pane { z-index: 700; }
|
||||
|
||||
.leaflet-map-pane canvas { z-index: 100; }
|
||||
.leaflet-map-pane svg { z-index: 200; }
|
||||
|
||||
.leaflet-vml-shape {
|
||||
width: 1px;
|
||||
height: 1px;
|
||||
}
|
||||
.lvml {
|
||||
behavior: url(#default#VML);
|
||||
display: inline-block;
|
||||
position: absolute;
|
||||
}
|
||||
|
||||
|
||||
/* control positioning */
|
||||
|
||||
.leaflet-control {
|
||||
position: relative;
|
||||
z-index: 800;
|
||||
pointer-events: visiblePainted; /* IE 9-10 doesn't have auto */
|
||||
pointer-events: auto;
|
||||
}
|
||||
.leaflet-top,
|
||||
.leaflet-bottom {
|
||||
position: absolute;
|
||||
z-index: 1000;
|
||||
pointer-events: none;
|
||||
}
|
||||
.leaflet-top {
|
||||
top: 0;
|
||||
}
|
||||
.leaflet-right {
|
||||
right: 0;
|
||||
}
|
||||
.leaflet-bottom {
|
||||
bottom: 0;
|
||||
}
|
||||
.leaflet-left {
|
||||
left: 0;
|
||||
}
|
||||
.leaflet-control {
|
||||
float: left;
|
||||
clear: both;
|
||||
}
|
||||
.leaflet-right .leaflet-control {
|
||||
float: right;
|
||||
}
|
||||
.leaflet-top .leaflet-control {
|
||||
margin-top: 10px;
|
||||
}
|
||||
.leaflet-bottom .leaflet-control {
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
.leaflet-left .leaflet-control {
|
||||
margin-left: 10px;
|
||||
}
|
||||
.leaflet-right .leaflet-control {
|
||||
margin-right: 10px;
|
||||
}
|
||||
|
||||
|
||||
/* zoom and fade animations */
|
||||
|
||||
.leaflet-fade-anim .leaflet-popup {
|
||||
opacity: 0;
|
||||
-webkit-transition: opacity 0.2s linear;
|
||||
-moz-transition: opacity 0.2s linear;
|
||||
transition: opacity 0.2s linear;
|
||||
}
|
||||
.leaflet-fade-anim .leaflet-map-pane .leaflet-popup {
|
||||
opacity: 1;
|
||||
}
|
||||
.leaflet-zoom-animated {
|
||||
-webkit-transform-origin: 0 0;
|
||||
-ms-transform-origin: 0 0;
|
||||
transform-origin: 0 0;
|
||||
}
|
||||
svg.leaflet-zoom-animated {
|
||||
will-change: transform;
|
||||
}
|
||||
|
||||
.leaflet-zoom-anim .leaflet-zoom-animated {
|
||||
-webkit-transition: -webkit-transform 0.25s cubic-bezier(0,0,0.25,1);
|
||||
-moz-transition: -moz-transform 0.25s cubic-bezier(0,0,0.25,1);
|
||||
transition: transform 0.25s cubic-bezier(0,0,0.25,1);
|
||||
}
|
||||
.leaflet-zoom-anim .leaflet-tile,
|
||||
.leaflet-pan-anim .leaflet-tile {
|
||||
-webkit-transition: none;
|
||||
-moz-transition: none;
|
||||
transition: none;
|
||||
}
|
||||
|
||||
.leaflet-zoom-anim .leaflet-zoom-hide {
|
||||
visibility: hidden;
|
||||
}
|
||||
|
||||
|
||||
/* cursors */
|
||||
|
||||
.leaflet-interactive {
|
||||
cursor: pointer;
|
||||
}
|
||||
.leaflet-grab {
|
||||
cursor: -webkit-grab;
|
||||
cursor: -moz-grab;
|
||||
cursor: grab;
|
||||
}
|
||||
.leaflet-crosshair,
|
||||
.leaflet-crosshair .leaflet-interactive {
|
||||
cursor: crosshair;
|
||||
}
|
||||
.leaflet-popup-pane,
|
||||
.leaflet-control {
|
||||
cursor: auto;
|
||||
}
|
||||
.leaflet-dragging .leaflet-grab,
|
||||
.leaflet-dragging .leaflet-grab .leaflet-interactive,
|
||||
.leaflet-dragging .leaflet-marker-draggable {
|
||||
cursor: move;
|
||||
cursor: -webkit-grabbing;
|
||||
cursor: -moz-grabbing;
|
||||
cursor: grabbing;
|
||||
}
|
||||
|
||||
/* marker & overlays interactivity */
|
||||
.leaflet-marker-icon,
|
||||
.leaflet-marker-shadow,
|
||||
.leaflet-image-layer,
|
||||
.leaflet-pane > svg path,
|
||||
.leaflet-tile-container {
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
.leaflet-marker-icon.leaflet-interactive,
|
||||
.leaflet-image-layer.leaflet-interactive,
|
||||
.leaflet-pane > svg path.leaflet-interactive,
|
||||
svg.leaflet-image-layer.leaflet-interactive path {
|
||||
pointer-events: visiblePainted; /* IE 9-10 doesn't have auto */
|
||||
pointer-events: auto;
|
||||
}
|
||||
|
||||
/* visual tweaks */
|
||||
|
||||
.leaflet-container {
|
||||
background: #ddd;
|
||||
outline-offset: 1px;
|
||||
}
|
||||
.leaflet-container a {
|
||||
color: #0078A8;
|
||||
}
|
||||
.leaflet-zoom-box {
|
||||
border: 2px dotted #38f;
|
||||
background: rgba(255,255,255,0.5);
|
||||
}
|
||||
|
||||
|
||||
/* general typography */
|
||||
.leaflet-container {
|
||||
font-family: "Helvetica Neue", Arial, Helvetica, sans-serif;
|
||||
font-size: 12px;
|
||||
font-size: 0.75rem;
|
||||
line-height: 1.5;
|
||||
}
|
||||
|
||||
|
||||
/* general toolbar styles */
|
||||
|
||||
.leaflet-bar {
|
||||
box-shadow: 0 1px 5px rgba(0,0,0,0.65);
|
||||
border-radius: 4px;
|
||||
}
|
||||
.leaflet-bar a {
|
||||
background-color: #fff;
|
||||
border-bottom: 1px solid #ccc;
|
||||
width: 26px;
|
||||
height: 26px;
|
||||
line-height: 26px;
|
||||
display: block;
|
||||
text-align: center;
|
||||
text-decoration: none;
|
||||
color: black;
|
||||
}
|
||||
.leaflet-bar a,
|
||||
.leaflet-control-layers-toggle {
|
||||
background-position: 50% 50%;
|
||||
background-repeat: no-repeat;
|
||||
display: block;
|
||||
}
|
||||
.leaflet-bar a:hover,
|
||||
.leaflet-bar a:focus {
|
||||
background-color: #f4f4f4;
|
||||
}
|
||||
.leaflet-bar a:first-child {
|
||||
border-top-left-radius: 4px;
|
||||
border-top-right-radius: 4px;
|
||||
}
|
||||
.leaflet-bar a:last-child {
|
||||
border-bottom-left-radius: 4px;
|
||||
border-bottom-right-radius: 4px;
|
||||
border-bottom: none;
|
||||
}
|
||||
.leaflet-bar a.leaflet-disabled {
|
||||
cursor: default;
|
||||
background-color: #f4f4f4;
|
||||
color: #bbb;
|
||||
}
|
||||
|
||||
.leaflet-touch .leaflet-bar a {
|
||||
width: 30px;
|
||||
height: 30px;
|
||||
line-height: 30px;
|
||||
}
|
||||
.leaflet-touch .leaflet-bar a:first-child {
|
||||
border-top-left-radius: 2px;
|
||||
border-top-right-radius: 2px;
|
||||
}
|
||||
.leaflet-touch .leaflet-bar a:last-child {
|
||||
border-bottom-left-radius: 2px;
|
||||
border-bottom-right-radius: 2px;
|
||||
}
|
||||
|
||||
/* zoom control */
|
||||
|
||||
.leaflet-control-zoom-in,
|
||||
.leaflet-control-zoom-out {
|
||||
font: bold 18px 'Lucida Console', Monaco, monospace;
|
||||
text-indent: 1px;
|
||||
}
|
||||
|
||||
.leaflet-touch .leaflet-control-zoom-in, .leaflet-touch .leaflet-control-zoom-out {
|
||||
font-size: 22px;
|
||||
}
|
||||
|
||||
|
||||
/* layers control */
|
||||
|
||||
.leaflet-control-layers {
|
||||
box-shadow: 0 1px 5px rgba(0,0,0,0.4);
|
||||
background: #fff;
|
||||
border-radius: 5px;
|
||||
}
|
||||
.leaflet-control-layers-toggle {
|
||||
background-image: url(images/layers.png);
|
||||
width: 36px;
|
||||
height: 36px;
|
||||
}
|
||||
.leaflet-retina .leaflet-control-layers-toggle {
|
||||
background-image: url(images/layers-2x.png);
|
||||
background-size: 26px 26px;
|
||||
}
|
||||
.leaflet-touch .leaflet-control-layers-toggle {
|
||||
width: 44px;
|
||||
height: 44px;
|
||||
}
|
||||
.leaflet-control-layers .leaflet-control-layers-list,
|
||||
.leaflet-control-layers-expanded .leaflet-control-layers-toggle {
|
||||
display: none;
|
||||
}
|
||||
.leaflet-control-layers-expanded .leaflet-control-layers-list {
|
||||
display: block;
|
||||
position: relative;
|
||||
}
|
||||
.leaflet-control-layers-expanded {
|
||||
padding: 6px 10px 6px 6px;
|
||||
color: #333;
|
||||
background: #fff;
|
||||
}
|
||||
.leaflet-control-layers-scrollbar {
|
||||
overflow-y: scroll;
|
||||
overflow-x: hidden;
|
||||
padding-right: 5px;
|
||||
}
|
||||
.leaflet-control-layers-selector {
|
||||
margin-top: 2px;
|
||||
position: relative;
|
||||
top: 1px;
|
||||
}
|
||||
.leaflet-control-layers label {
|
||||
display: block;
|
||||
font-size: 13px;
|
||||
font-size: 1.08333em;
|
||||
}
|
||||
.leaflet-control-layers-separator {
|
||||
height: 0;
|
||||
border-top: 1px solid #ddd;
|
||||
margin: 5px -10px 5px -6px;
|
||||
}
|
||||
|
||||
/* Default icon URLs */
|
||||
.leaflet-default-icon-path { /* used only in path-guessing heuristic, see L.Icon.Default */
|
||||
background-image: url(images/marker-icon.png);
|
||||
}
|
||||
|
||||
|
||||
/* attribution and scale controls */
|
||||
|
||||
.leaflet-container .leaflet-control-attribution {
|
||||
background: #fff;
|
||||
background: rgba(255, 255, 255, 0.8);
|
||||
margin: 0;
|
||||
}
|
||||
.leaflet-control-attribution,
|
||||
.leaflet-control-scale-line {
|
||||
padding: 0 5px;
|
||||
color: #333;
|
||||
line-height: 1.4;
|
||||
}
|
||||
.leaflet-control-attribution a {
|
||||
text-decoration: none;
|
||||
}
|
||||
.leaflet-control-attribution a:hover,
|
||||
.leaflet-control-attribution a:focus {
|
||||
text-decoration: underline;
|
||||
}
|
||||
.leaflet-attribution-flag {
|
||||
display: inline !important;
|
||||
vertical-align: baseline !important;
|
||||
width: 1em;
|
||||
height: 0.6669em;
|
||||
}
|
||||
.leaflet-left .leaflet-control-scale {
|
||||
margin-left: 5px;
|
||||
}
|
||||
.leaflet-bottom .leaflet-control-scale {
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
.leaflet-control-scale-line {
|
||||
border: 2px solid #777;
|
||||
border-top: none;
|
||||
line-height: 1.1;
|
||||
padding: 2px 5px 1px;
|
||||
white-space: nowrap;
|
||||
-moz-box-sizing: border-box;
|
||||
box-sizing: border-box;
|
||||
background: rgba(255, 255, 255, 0.8);
|
||||
text-shadow: 1px 1px #fff;
|
||||
}
|
||||
.leaflet-control-scale-line:not(:first-child) {
|
||||
border-top: 2px solid #777;
|
||||
border-bottom: none;
|
||||
margin-top: -2px;
|
||||
}
|
||||
.leaflet-control-scale-line:not(:first-child):not(:last-child) {
|
||||
border-bottom: 2px solid #777;
|
||||
}
|
||||
|
||||
.leaflet-touch .leaflet-control-attribution,
|
||||
.leaflet-touch .leaflet-control-layers,
|
||||
.leaflet-touch .leaflet-bar {
|
||||
box-shadow: none;
|
||||
}
|
||||
.leaflet-touch .leaflet-control-layers,
|
||||
.leaflet-touch .leaflet-bar {
|
||||
border: 2px solid rgba(0,0,0,0.2);
|
||||
background-clip: padding-box;
|
||||
}
|
||||
|
||||
|
||||
/* popup */
|
||||
|
||||
.leaflet-popup {
|
||||
position: absolute;
|
||||
text-align: center;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
.leaflet-popup-content-wrapper {
|
||||
padding: 1px;
|
||||
text-align: left;
|
||||
border-radius: 12px;
|
||||
}
|
||||
.leaflet-popup-content {
|
||||
margin: 13px 24px 13px 20px;
|
||||
line-height: 1.3;
|
||||
font-size: 13px;
|
||||
font-size: 1.08333em;
|
||||
min-height: 1px;
|
||||
}
|
||||
.leaflet-popup-content p {
|
||||
margin: 17px 0;
|
||||
margin: 1.3em 0;
|
||||
}
|
||||
.leaflet-popup-tip-container {
|
||||
width: 40px;
|
||||
height: 20px;
|
||||
position: absolute;
|
||||
left: 50%;
|
||||
margin-top: -1px;
|
||||
margin-left: -20px;
|
||||
overflow: hidden;
|
||||
pointer-events: none;
|
||||
}
|
||||
.leaflet-popup-tip {
|
||||
width: 17px;
|
||||
height: 17px;
|
||||
padding: 1px;
|
||||
|
||||
margin: -10px auto 0;
|
||||
pointer-events: auto;
|
||||
|
||||
-webkit-transform: rotate(45deg);
|
||||
-moz-transform: rotate(45deg);
|
||||
-ms-transform: rotate(45deg);
|
||||
transform: rotate(45deg);
|
||||
}
|
||||
.leaflet-popup-content-wrapper,
|
||||
.leaflet-popup-tip {
|
||||
background: white;
|
||||
color: #333;
|
||||
box-shadow: 0 3px 14px rgba(0,0,0,0.4);
|
||||
}
|
||||
.leaflet-container a.leaflet-popup-close-button {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
right: 0;
|
||||
border: none;
|
||||
text-align: center;
|
||||
width: 24px;
|
||||
height: 24px;
|
||||
font: 16px/24px Tahoma, Verdana, sans-serif;
|
||||
color: #757575;
|
||||
text-decoration: none;
|
||||
background: transparent;
|
||||
}
|
||||
.leaflet-container a.leaflet-popup-close-button:hover,
|
||||
.leaflet-container a.leaflet-popup-close-button:focus {
|
||||
color: #585858;
|
||||
}
|
||||
.leaflet-popup-scrolled {
|
||||
overflow: auto;
|
||||
}
|
||||
|
||||
.leaflet-oldie .leaflet-popup-content-wrapper {
|
||||
-ms-zoom: 1;
|
||||
}
|
||||
.leaflet-oldie .leaflet-popup-tip {
|
||||
width: 24px;
|
||||
margin: 0 auto;
|
||||
|
||||
-ms-filter: "progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678)";
|
||||
filter: progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678);
|
||||
}
|
||||
|
||||
.leaflet-oldie .leaflet-control-zoom,
|
||||
.leaflet-oldie .leaflet-control-layers,
|
||||
.leaflet-oldie .leaflet-popup-content-wrapper,
|
||||
.leaflet-oldie .leaflet-popup-tip {
|
||||
border: 1px solid #999;
|
||||
}
|
||||
|
||||
|
||||
/* div icon */
|
||||
|
||||
.leaflet-div-icon {
|
||||
background: #fff;
|
||||
border: 1px solid #666;
|
||||
}
|
||||
|
||||
|
||||
/* Tooltip */
|
||||
/* Base styles for the element that has a tooltip */
|
||||
.leaflet-tooltip {
|
||||
position: absolute;
|
||||
padding: 6px;
|
||||
background-color: #fff;
|
||||
border: 1px solid #fff;
|
||||
border-radius: 3px;
|
||||
color: #222;
|
||||
white-space: nowrap;
|
||||
-webkit-user-select: none;
|
||||
-moz-user-select: none;
|
||||
-ms-user-select: none;
|
||||
user-select: none;
|
||||
pointer-events: none;
|
||||
box-shadow: 0 1px 3px rgba(0,0,0,0.4);
|
||||
}
|
||||
.leaflet-tooltip.leaflet-interactive {
|
||||
cursor: pointer;
|
||||
pointer-events: auto;
|
||||
}
|
||||
.leaflet-tooltip-top:before,
|
||||
.leaflet-tooltip-bottom:before,
|
||||
.leaflet-tooltip-left:before,
|
||||
.leaflet-tooltip-right:before {
|
||||
position: absolute;
|
||||
pointer-events: none;
|
||||
border: 6px solid transparent;
|
||||
background: transparent;
|
||||
content: "";
|
||||
}
|
||||
|
||||
/* Directions */
|
||||
|
||||
.leaflet-tooltip-bottom {
|
||||
margin-top: 6px;
|
||||
}
|
||||
.leaflet-tooltip-top {
|
||||
margin-top: -6px;
|
||||
}
|
||||
.leaflet-tooltip-bottom:before,
|
||||
.leaflet-tooltip-top:before {
|
||||
left: 50%;
|
||||
margin-left: -6px;
|
||||
}
|
||||
.leaflet-tooltip-top:before {
|
||||
bottom: 0;
|
||||
margin-bottom: -12px;
|
||||
border-top-color: #fff;
|
||||
}
|
||||
.leaflet-tooltip-bottom:before {
|
||||
top: 0;
|
||||
margin-top: -12px;
|
||||
margin-left: -6px;
|
||||
border-bottom-color: #fff;
|
||||
}
|
||||
.leaflet-tooltip-left {
|
||||
margin-left: -6px;
|
||||
}
|
||||
.leaflet-tooltip-right {
|
||||
margin-left: 6px;
|
||||
}
|
||||
.leaflet-tooltip-left:before,
|
||||
.leaflet-tooltip-right:before {
|
||||
top: 50%;
|
||||
margin-top: -6px;
|
||||
}
|
||||
.leaflet-tooltip-left:before {
|
||||
right: 0;
|
||||
margin-right: -12px;
|
||||
border-left-color: #fff;
|
||||
}
|
||||
.leaflet-tooltip-right:before {
|
||||
left: 0;
|
||||
margin-left: -12px;
|
||||
border-right-color: #fff;
|
||||
}
|
||||
|
||||
/* Printing */
|
||||
|
||||
@media print {
|
||||
/* Prevent printers from removing background-images of controls. */
|
||||
.leaflet-control {
|
||||
-webkit-print-color-adjust: exact;
|
||||
print-color-adjust: exact;
|
||||
}
|
||||
}
|
||||
6
assets/vendor/leaflet/leaflet.js
vendored
Normale Datei
2
assets/vendor/leaflet/leaflet.markercluster.js
vendored
Normale Datei
BIN
assets/videos/AFv6.mp4
LFS
Normale Datei
@@ -1,8 +1,23 @@
|
||||
# Hero Section Videos
|
||||
# Video Files / Video-Dateien
|
||||
|
||||
## Benötigte Video-Dateien
|
||||
## ✅ Alle Videos sind vollständig!
|
||||
|
||||
Die Hero-Section benötigt 4 rotierende Hintergrund-Videos. Diese sollten folgende Eigenschaften haben:
|
||||
Alle Videos wurden erfolgreich hochgeladen und sind einsatzbereit.
|
||||
|
||||
## Vorhandene Videos
|
||||
|
||||
| Datei | Größe | Status | Verwendung |
|
||||
|-------|-------|--------|------------|
|
||||
| `AFv6.mp4` | 90MB | ✅ Fertig | AccountForger Demo |
|
||||
| `hero-code-abstract.mp4` | 11MB | ✅ Fertig | Hero Background 1 |
|
||||
| `hero-data-flow.mp4` | 7.3MB | ✅ Fertig | Hero Background 2 |
|
||||
| `hero-network-viz.mp4` | 14MB | ✅ Fertig | Hero Background 3 |
|
||||
|
||||
---
|
||||
|
||||
## Original Hero Section Spezifikationen
|
||||
|
||||
Die Hero-Section benötigt rotierende Hintergrund-Videos. Diese sollten folgende Eigenschaften haben:
|
||||
|
||||
### Video-Spezifikationen:
|
||||
- **Format:** MP4 (H.264 codec)
|
||||
|
||||
BIN
assets/videos/hero-code-abstract.mp4
LFS
Normale Datei
BIN
assets/videos/hero-data-flow.mp4
LFS
Normale Datei
BIN
assets/videos/hero-network-viz.mp4
LFS
Normale Datei
492
cookie-consent.css
Normale Datei
@@ -0,0 +1,492 @@
|
||||
/**
|
||||
* Cookie Consent Banner - DSGVO-konform
|
||||
* AegisSight
|
||||
* Angepasst an Corporate Design (Rheinmetall Style)
|
||||
*/
|
||||
|
||||
/* === CSS Variables (nutzt globale Tokens) === */
|
||||
:root {
|
||||
--consent-primary: var(--color-navy, #0A1832);
|
||||
--consent-primary-dark: var(--color-navy-dark, #060F20);
|
||||
--consent-gray-light: var(--color-gray-100, #f4f4f4);
|
||||
--consent-white: var(--color-white, #FFFFFF);
|
||||
--consent-text-dark: var(--color-gray-800, #333333);
|
||||
--consent-text-gray: var(--color-gray-600, #666666);
|
||||
--consent-border: var(--color-gray-200, #e0e0e0);
|
||||
--consent-shadow: 0 2px 8px rgba(0,0,0,0.1);
|
||||
--consent-shadow-hover: 0 8px 24px rgba(0,0,0,0.15);
|
||||
}
|
||||
|
||||
/* === Demo Page Styling (AegisSight Style) === */
|
||||
body {
|
||||
font-family: 'Inter', -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
line-height: 1.6;
|
||||
color: var(--consent-text-dark);
|
||||
}
|
||||
|
||||
header {
|
||||
background: linear-gradient(135deg, var(--consent-primary-dark) 0%, var(--consent-primary) 100%);
|
||||
color: white;
|
||||
padding: 2rem;
|
||||
text-align: center;
|
||||
box-shadow: var(--consent-shadow);
|
||||
}
|
||||
|
||||
header h1 {
|
||||
font-size: 2rem;
|
||||
font-weight: 600;
|
||||
letter-spacing: 1px;
|
||||
text-transform: uppercase;
|
||||
}
|
||||
|
||||
main {
|
||||
max-width: 1000px;
|
||||
margin: 2rem auto;
|
||||
padding: 0 2rem;
|
||||
}
|
||||
|
||||
/* Demo-Page-Reststyles: nackter footer-Selector entfernt, weil er sonst
|
||||
ueber alle Seiten den Site-Footer mit fremdem Margin/Background ueberlagert.
|
||||
Cookie-Consent-Banner-Styles bleiben unten unveraendert. */
|
||||
|
||||
footer nav {
|
||||
margin-bottom: 1rem;
|
||||
}
|
||||
|
||||
footer nav a {
|
||||
color: var(--consent-primary);
|
||||
text-decoration: none;
|
||||
margin: 0 1.5rem;
|
||||
font-weight: 600;
|
||||
transition: color 0.3s ease;
|
||||
}
|
||||
|
||||
footer nav a:hover {
|
||||
color: #fff;
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
/* === Cookie Consent Banner === */
|
||||
|
||||
/* Backdrop Overlay */
|
||||
#cookie-consent-backdrop {
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background: rgba(0, 0, 0, 0.5);
|
||||
z-index: 9998;
|
||||
display: none;
|
||||
animation: fadeIn 0.3s ease;
|
||||
}
|
||||
|
||||
#cookie-consent-backdrop.active {
|
||||
display: block;
|
||||
}
|
||||
|
||||
/* Main Banner Container */
|
||||
#cookie-consent-banner {
|
||||
position: fixed;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
background: rgba(255, 255, 255, 0.98);
|
||||
backdrop-filter: blur(10px);
|
||||
-webkit-backdrop-filter: blur(10px);
|
||||
box-shadow: 0 -4px 20px rgba(0, 0, 0, 0.15);
|
||||
border-top: 2px solid var(--color-gold, #C8A851);
|
||||
z-index: 9999;
|
||||
transform: translateY(100%);
|
||||
transition: transform 0.4s cubic-bezier(0.4, 0, 0.2, 1);
|
||||
max-height: 90vh;
|
||||
overflow-y: auto;
|
||||
}
|
||||
|
||||
#cookie-consent-banner.active {
|
||||
transform: translateY(0);
|
||||
}
|
||||
|
||||
/* Banner Content */
|
||||
.consent-content {
|
||||
max-width: 1200px;
|
||||
margin: 0 auto;
|
||||
padding: 1.5rem;
|
||||
}
|
||||
|
||||
.consent-header {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 0.5rem;
|
||||
margin-bottom: 1rem;
|
||||
}
|
||||
|
||||
.consent-header h2 {
|
||||
margin: 0;
|
||||
font-size: 1.5rem;
|
||||
color: var(--consent-text-dark);
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.consent-text {
|
||||
color: var(--consent-text-gray);
|
||||
font-size: 0.95rem;
|
||||
margin-bottom: 1.5rem;
|
||||
line-height: 1.6;
|
||||
}
|
||||
|
||||
.consent-text strong {
|
||||
color: var(--consent-text-dark);
|
||||
}
|
||||
|
||||
/* Button Group */
|
||||
.consent-buttons {
|
||||
display: flex;
|
||||
gap: 1rem;
|
||||
flex-wrap: wrap;
|
||||
margin-top: 1.5rem;
|
||||
}
|
||||
|
||||
.consent-btn {
|
||||
padding: 0.75rem 1.5rem;
|
||||
border: none;
|
||||
border-radius: var(--radius-md, 8px);
|
||||
font-size: 1rem;
|
||||
font-weight: 600;
|
||||
cursor: pointer;
|
||||
transition: all 0.2s ease;
|
||||
font-family: inherit;
|
||||
}
|
||||
|
||||
.consent-btn:focus {
|
||||
outline: 3px solid rgba(52, 152, 219, 0.5);
|
||||
outline-offset: 2px;
|
||||
}
|
||||
|
||||
.consent-btn-primary {
|
||||
background: var(--consent-primary);
|
||||
color: white;
|
||||
box-shadow: var(--consent-shadow);
|
||||
}
|
||||
|
||||
.consent-btn-primary:hover {
|
||||
background: var(--consent-primary-dark);
|
||||
transform: translateY(-2px);
|
||||
box-shadow: var(--consent-shadow-hover);
|
||||
}
|
||||
|
||||
.consent-btn-secondary {
|
||||
background: var(--color-gray-600, #666666);
|
||||
color: white;
|
||||
}
|
||||
|
||||
.consent-btn-secondary:hover {
|
||||
background: var(--color-gray-800, #333333);
|
||||
}
|
||||
|
||||
.consent-btn-outline {
|
||||
background: transparent;
|
||||
border: 2px solid var(--consent-primary);
|
||||
color: var(--consent-primary);
|
||||
}
|
||||
|
||||
.consent-btn-outline:hover {
|
||||
background: var(--consent-primary);
|
||||
color: white;
|
||||
}
|
||||
|
||||
/* Settings Modal */
|
||||
#cookie-consent-settings {
|
||||
position: fixed;
|
||||
top: 50%;
|
||||
left: 50%;
|
||||
transform: translate(-50%, -50%) scale(0.9);
|
||||
background: white;
|
||||
border-radius: var(--radius-lg, 16px);
|
||||
box-shadow: 0 10px 40px rgba(0, 0, 0, 0.2);
|
||||
z-index: 10000;
|
||||
max-width: 600px;
|
||||
width: 90%;
|
||||
max-height: 80vh;
|
||||
overflow-y: auto;
|
||||
opacity: 0;
|
||||
pointer-events: none;
|
||||
transition: all 0.3s ease;
|
||||
}
|
||||
|
||||
#cookie-consent-settings.active {
|
||||
opacity: 1;
|
||||
transform: translate(-50%, -50%) scale(1);
|
||||
pointer-events: all;
|
||||
}
|
||||
|
||||
.settings-header {
|
||||
background: linear-gradient(135deg, var(--consent-primary-dark) 0%, var(--consent-primary) 100%);
|
||||
color: white;
|
||||
padding: 1.5rem;
|
||||
border-radius: var(--radius-lg, 16px) var(--radius-lg, 16px) 0 0;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
box-shadow: var(--consent-shadow);
|
||||
}
|
||||
|
||||
.settings-header h3 {
|
||||
margin: 0;
|
||||
font-size: 1.3rem;
|
||||
}
|
||||
|
||||
.settings-close {
|
||||
background: transparent;
|
||||
border: none;
|
||||
color: white;
|
||||
font-size: 1.5rem;
|
||||
cursor: pointer;
|
||||
padding: 0.25rem 0.5rem;
|
||||
line-height: 1;
|
||||
border-radius: 4px;
|
||||
transition: background 0.2s ease;
|
||||
}
|
||||
|
||||
.settings-close:hover {
|
||||
background: rgba(255, 255, 255, 0.1);
|
||||
}
|
||||
|
||||
.settings-content {
|
||||
padding: 1.5rem;
|
||||
}
|
||||
|
||||
/* Category Cards */
|
||||
.cookie-category {
|
||||
border: 2px solid var(--consent-border);
|
||||
border-radius: var(--radius-md, 8px);
|
||||
padding: 1rem;
|
||||
margin-bottom: 1rem;
|
||||
transition: border-color 0.2s ease;
|
||||
}
|
||||
|
||||
.cookie-category:hover {
|
||||
border-color: var(--consent-primary);
|
||||
}
|
||||
|
||||
.category-header {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
cursor: pointer;
|
||||
user-select: none;
|
||||
}
|
||||
|
||||
.category-title {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 0.75rem;
|
||||
font-weight: 600;
|
||||
color: var(--consent-text-dark);
|
||||
}
|
||||
|
||||
.category-toggle {
|
||||
position: relative;
|
||||
width: 50px;
|
||||
height: 26px;
|
||||
background: #ccc;
|
||||
border-radius: 13px;
|
||||
transition: background 0.3s ease;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.category-toggle::after {
|
||||
content: '';
|
||||
position: absolute;
|
||||
top: 3px;
|
||||
left: 3px;
|
||||
width: 20px;
|
||||
height: 20px;
|
||||
background: white;
|
||||
border-radius: 50%;
|
||||
transition: transform 0.3s ease;
|
||||
}
|
||||
|
||||
.category-toggle.active {
|
||||
background: var(--color-gold, #C8A851);
|
||||
}
|
||||
|
||||
.category-toggle.active::after {
|
||||
transform: translateX(24px);
|
||||
}
|
||||
|
||||
.category-toggle.disabled {
|
||||
opacity: 0.5;
|
||||
cursor: not-allowed;
|
||||
}
|
||||
|
||||
.category-description {
|
||||
color: #666;
|
||||
font-size: 0.9rem;
|
||||
margin-top: 0.5rem;
|
||||
line-height: 1.5;
|
||||
}
|
||||
|
||||
.category-details {
|
||||
margin-top: 1rem;
|
||||
padding: 1rem;
|
||||
background: #f8f9fa;
|
||||
border-radius: 6px;
|
||||
font-size: 0.85rem;
|
||||
color: #555;
|
||||
}
|
||||
|
||||
.category-details ul {
|
||||
margin: 0.5rem 0;
|
||||
padding-left: 1.5rem;
|
||||
}
|
||||
|
||||
.category-details li {
|
||||
margin: 0.25rem 0;
|
||||
}
|
||||
|
||||
/* Badge */
|
||||
.badge {
|
||||
display: inline-block;
|
||||
padding: 0.25rem 0.5rem;
|
||||
background: #e0e0e0;
|
||||
color: #555;
|
||||
font-size: 0.75rem;
|
||||
border-radius: 4px;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.badge-required {
|
||||
background: var(--consent-primary);
|
||||
color: white;
|
||||
}
|
||||
|
||||
/* Settings Footer */
|
||||
.settings-footer {
|
||||
padding: 1rem 1.5rem;
|
||||
border-top: 1px solid #e0e0e0;
|
||||
display: flex;
|
||||
gap: 1rem;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
|
||||
.settings-footer .consent-btn {
|
||||
flex: 1;
|
||||
min-width: 150px;
|
||||
}
|
||||
|
||||
/* Links */
|
||||
.settings-links {
|
||||
display: flex;
|
||||
gap: 1.5rem;
|
||||
padding: 1rem 1.5rem;
|
||||
border-top: 1px solid #e0e0e0;
|
||||
font-size: 0.9rem;
|
||||
}
|
||||
|
||||
.settings-links a {
|
||||
color: var(--consent-primary);
|
||||
text-decoration: none;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.settings-links a:hover {
|
||||
color: var(--consent-primary-dark);
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
/* GPC Notice */
|
||||
.gpc-notice {
|
||||
background: #fff3cd;
|
||||
border: 2px solid #ffc107;
|
||||
border-radius: 8px;
|
||||
padding: 1rem;
|
||||
margin-bottom: 1rem;
|
||||
display: flex;
|
||||
align-items: start;
|
||||
gap: 0.75rem;
|
||||
}
|
||||
|
||||
.gpc-notice-icon {
|
||||
font-size: 1.5rem;
|
||||
}
|
||||
|
||||
.gpc-notice-text {
|
||||
flex: 1;
|
||||
color: #856404;
|
||||
}
|
||||
|
||||
.gpc-notice-text strong {
|
||||
display: block;
|
||||
margin-bottom: 0.25rem;
|
||||
}
|
||||
|
||||
/* Mobile Responsive */
|
||||
@media (max-width: 768px) {
|
||||
.consent-content {
|
||||
padding: 1rem;
|
||||
}
|
||||
|
||||
.consent-header h2 {
|
||||
font-size: 1.25rem;
|
||||
}
|
||||
|
||||
.consent-buttons {
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.consent-btn {
|
||||
width: 100%;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
#cookie-consent-settings {
|
||||
width: 95%;
|
||||
max-height: 90vh;
|
||||
}
|
||||
|
||||
.settings-footer {
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.settings-footer .consent-btn {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.settings-links {
|
||||
flex-direction: column;
|
||||
gap: 0.5rem;
|
||||
}
|
||||
}
|
||||
|
||||
/* Accessibility */
|
||||
@media (prefers-reduced-motion: reduce) {
|
||||
#cookie-consent-banner,
|
||||
#cookie-consent-settings,
|
||||
.category-toggle::after {
|
||||
transition: none;
|
||||
}
|
||||
}
|
||||
|
||||
/* High Contrast Mode */
|
||||
@media (prefers-contrast: high) {
|
||||
#cookie-consent-banner {
|
||||
border-top: 3px solid #000;
|
||||
}
|
||||
|
||||
.cookie-category {
|
||||
border-width: 3px;
|
||||
}
|
||||
}
|
||||
|
||||
/* Animations */
|
||||
@keyframes fadeIn {
|
||||
from {
|
||||
opacity: 0;
|
||||
}
|
||||
to {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
536
cookie-consent.js
Normale Datei
@@ -0,0 +1,536 @@
|
||||
/**
|
||||
* Cookie Consent Manager - DSGVO-konform
|
||||
* AegisSight
|
||||
* Version 1.0
|
||||
*/
|
||||
|
||||
(function() {
|
||||
'use strict';
|
||||
|
||||
// === CONFIGURATION ===
|
||||
const CONFIG = {
|
||||
CONSENT_VERSION: '1.0',
|
||||
CONSENT_DURATION: 365, // days
|
||||
STORAGE_KEY: 'insights-consent',
|
||||
STORAGE_EXPIRES: 'insights-consent-expires',
|
||||
STORAGE_DETAILS: 'insights-consent-details',
|
||||
TRACKING_SCRIPT: '/analytics-und-so/datenblick.js',
|
||||
WEBSITE_ID: '598ef5fd-d2dc-4540-9e65-602889981dac'
|
||||
};
|
||||
|
||||
// === TRANSLATIONS ===
|
||||
const TRANSLATIONS = {
|
||||
de: {
|
||||
title: 'Diese Website nutzt Cookies',
|
||||
text: 'Wir verwenden AegisSight Analytics (basierend auf Umami), ein selbst gehostetes, cookieloses Analyse-Tool, um unsere Website zu verbessern. Dabei erfassen wir anonymisierte Informationen über Ihre Nutzung (besuchte Seiten, Browser, ungefährer Standort). Alle Daten bleiben auf unserem Server in Deutschland und werden niemals an Dritte weitergegeben.',
|
||||
privacy: 'Mit "Alle akzeptieren" stimmen Sie der Verwendung von Analyse-Cookies zu. Sie können Ihre Einwilligung jederzeit in den Cookie-Einstellungen widerrufen.',
|
||||
btnAcceptAll: '✓ Alle akzeptieren',
|
||||
btnRejectAll: '✗ Nur notwendige',
|
||||
btnSettings: 'Details & Einstellungen',
|
||||
settingsTitle: 'Cookie-Einstellungen',
|
||||
categoryNecessary: 'Notwendig',
|
||||
categoryAnalytics: 'Statistik & Analyse',
|
||||
necessaryDesc: 'Technisch erforderliche Cookies für Login und Sicherheit. Diese Kategorie kann nicht deaktiviert werden.',
|
||||
analyticsDesc: 'Anonymisierte Auswertung der Website-Nutzung zur Verbesserung unserer Inhalte. Alle Daten bleiben auf unserem Server in Deutschland.',
|
||||
btnSaveSettings: 'Auswahl speichern',
|
||||
linkPrivacy: 'Datenschutzerklärung',
|
||||
linkImprint: 'Impressum',
|
||||
gpcTitle: 'Global Privacy Control erkannt',
|
||||
gpcText: 'Ihr Browser signalisiert, dass Sie nicht getrackt werden möchten (GPC). Wir respektieren diese Einstellung und haben Analyse-Cookies automatisch deaktiviert.'
|
||||
},
|
||||
en: {
|
||||
title: 'This website uses cookies',
|
||||
text: 'We use AegisSight Analytics (based on Umami), a self-hosted, cookieless analytics tool to improve our website. We collect anonymized information about your usage (pages visited, browser, approximate location). All data remains on our server in Germany and is never shared with third parties.',
|
||||
privacy: 'By clicking "Accept all", you consent to the use of analytics cookies. You can revoke your consent at any time in the cookie settings.',
|
||||
btnAcceptAll: '✓ Accept all',
|
||||
btnRejectAll: '✗ Only necessary',
|
||||
btnSettings: 'Details & Settings',
|
||||
settingsTitle: 'Cookie Settings',
|
||||
categoryNecessary: 'Necessary',
|
||||
categoryAnalytics: 'Statistics & Analytics',
|
||||
necessaryDesc: 'Technically required cookies for login and security. This category cannot be disabled.',
|
||||
analyticsDesc: 'Anonymized analysis of website usage to improve our content. All data remains on our server in Germany.',
|
||||
btnSaveSettings: 'Save selection',
|
||||
linkPrivacy: 'Privacy Policy',
|
||||
linkImprint: 'Imprint',
|
||||
gpcTitle: 'Global Privacy Control detected',
|
||||
gpcText: 'Your browser signals that you do not want to be tracked (GPC). We respect this setting and have automatically disabled analytics cookies.'
|
||||
}
|
||||
};
|
||||
|
||||
// === STATE ===
|
||||
let currentLanguage = document.documentElement.lang || 'de';
|
||||
let consentState = {
|
||||
necessary: true,
|
||||
analytics: false
|
||||
};
|
||||
|
||||
// === UTILITY FUNCTIONS ===
|
||||
|
||||
function getTranslation(key) {
|
||||
return TRANSLATIONS[currentLanguage]?.[key] || TRANSLATIONS.de[key];
|
||||
}
|
||||
|
||||
function setStorageWithExpiry(key, value, days) {
|
||||
const now = new Date();
|
||||
const item = {
|
||||
value: value,
|
||||
expires: now.getTime() + (days * 24 * 60 * 60 * 1000)
|
||||
};
|
||||
try {
|
||||
localStorage.setItem(key, JSON.stringify(item));
|
||||
} catch (e) {
|
||||
console.warn('[CookieConsent] LocalStorage not available:', e);
|
||||
}
|
||||
}
|
||||
|
||||
function getStorageWithExpiry(key) {
|
||||
try {
|
||||
const itemStr = localStorage.getItem(key);
|
||||
if (!itemStr) return null;
|
||||
|
||||
const item = JSON.parse(itemStr);
|
||||
const now = new Date();
|
||||
|
||||
if (now.getTime() > item.expires) {
|
||||
localStorage.removeItem(key);
|
||||
return null;
|
||||
}
|
||||
|
||||
return item.value;
|
||||
} catch (e) {
|
||||
console.warn('[CookieConsent] Error reading from LocalStorage:', e);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
function detectGPC() {
|
||||
// Check for Global Privacy Control
|
||||
if (navigator.globalPrivacyControl === true) {
|
||||
return true;
|
||||
}
|
||||
// Check DNT as fallback (deprecated but still used)
|
||||
if (navigator.doNotTrack === '1' || window.doNotTrack === '1') {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
function saveConsentDetails() {
|
||||
const details = {
|
||||
timestamp: new Date().toISOString(),
|
||||
version: CONFIG.CONSENT_VERSION,
|
||||
categories: consentState,
|
||||
language: currentLanguage,
|
||||
userAgent: navigator.userAgent,
|
||||
gpcSignal: detectGPC()
|
||||
};
|
||||
|
||||
try {
|
||||
localStorage.setItem(CONFIG.STORAGE_DETAILS, JSON.stringify(details));
|
||||
} catch (e) {
|
||||
console.warn('[CookieConsent] Could not save consent details:', e);
|
||||
}
|
||||
}
|
||||
|
||||
function deleteCookie(name) {
|
||||
document.cookie = name + '=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;';
|
||||
}
|
||||
|
||||
// === TRACKING CONTROL ===
|
||||
|
||||
function loadTracking() {
|
||||
if (consentState.analytics) {
|
||||
// Check if script already loaded
|
||||
if (document.querySelector(`script[src="${CONFIG.TRACKING_SCRIPT}"]`)) {
|
||||
console.log('[CookieConsent] Tracking script already loaded');
|
||||
return;
|
||||
}
|
||||
|
||||
const script = document.createElement('script');
|
||||
script.src = CONFIG.TRACKING_SCRIPT;
|
||||
script.setAttribute("data-website-id", CONFIG.WEBSITE_ID);
|
||||
script.defer = true;
|
||||
script.onerror = () => {
|
||||
console.error('[CookieConsent] Failed to load tracking script');
|
||||
};
|
||||
document.head.appendChild(script);
|
||||
// Custom Analytics Events laden
|
||||
const eventsScript = document.createElement("script");
|
||||
eventsScript.src = "/analytics-events.js";
|
||||
eventsScript.defer = true;
|
||||
document.head.appendChild(eventsScript);
|
||||
console.log('[CookieConsent] Analytics enabled - tracking script loaded');
|
||||
}
|
||||
}
|
||||
|
||||
function disableTracking() {
|
||||
// Remove tracking script if present
|
||||
const trackingScript = document.querySelector(`script[src="${CONFIG.TRACKING_SCRIPT}"]`);
|
||||
if (trackingScript) {
|
||||
trackingScript.remove();
|
||||
}
|
||||
|
||||
// Analytics Events Script entfernen
|
||||
const eventsScript = document.querySelector('script[src="/analytics-events.js"]');
|
||||
if (eventsScript) {
|
||||
eventsScript.remove();
|
||||
}
|
||||
|
||||
console.log('[CookieConsent] Analytics disabled - tracking blocked');
|
||||
}
|
||||
|
||||
// === CONSENT MANAGEMENT ===
|
||||
|
||||
function saveConsent(analytics) {
|
||||
consentState.analytics = analytics;
|
||||
|
||||
const consentValue = analytics ? 'accepted' : 'rejected';
|
||||
setStorageWithExpiry(CONFIG.STORAGE_KEY, consentValue, CONFIG.CONSENT_DURATION);
|
||||
|
||||
saveConsentDetails();
|
||||
|
||||
if (analytics) {
|
||||
loadTracking();
|
||||
} else {
|
||||
disableTracking();
|
||||
}
|
||||
|
||||
console.log('[CookieConsent] Consent saved:', consentValue);
|
||||
}
|
||||
|
||||
function loadConsent() {
|
||||
const consent = getStorageWithExpiry(CONFIG.STORAGE_KEY);
|
||||
|
||||
if (consent === null) {
|
||||
// Check for GPC - auto-reject if enabled
|
||||
if (detectGPC()) {
|
||||
console.log('[CookieConsent] GPC detected - auto-rejecting analytics');
|
||||
consentState.analytics = false;
|
||||
return null; // Still show banner with GPC notice
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
consentState.analytics = (consent === 'accepted');
|
||||
|
||||
// Check version
|
||||
try {
|
||||
const details = JSON.parse(localStorage.getItem(CONFIG.STORAGE_DETAILS) || '{}');
|
||||
if (details.version !== CONFIG.CONSENT_VERSION) {
|
||||
console.log('[CookieConsent] Version mismatch - re-prompting');
|
||||
return null;
|
||||
}
|
||||
} catch (e) {
|
||||
console.warn('[CookieConsent] Could not verify consent version');
|
||||
}
|
||||
|
||||
return consent;
|
||||
}
|
||||
|
||||
// === UI CREATION ===
|
||||
|
||||
function createBannerHTML() {
|
||||
const gpcDetected = detectGPC();
|
||||
|
||||
return `
|
||||
<div id="cookie-consent-backdrop" class="active"></div>
|
||||
<div id="cookie-consent-banner" class="active" role="dialog" aria-labelledby="consent-title" aria-modal="true">
|
||||
<div class="consent-content">
|
||||
${gpcDetected ? `
|
||||
<div class="gpc-notice">
|
||||
<div class="gpc-notice-icon"></div>
|
||||
<div class="gpc-notice-text">
|
||||
<strong>${getTranslation('gpcTitle')}</strong>
|
||||
${getTranslation('gpcText')}
|
||||
</div>
|
||||
</div>
|
||||
` : ''}
|
||||
|
||||
<div class="consent-header">
|
||||
<h2 id="consent-title">${getTranslation('title')}</h2>
|
||||
</div>
|
||||
|
||||
<div class="consent-text">
|
||||
<p>${getTranslation('text')}</p>
|
||||
<p><small>${getTranslation('privacy')}</small></p>
|
||||
</div>
|
||||
|
||||
<div class="consent-buttons">
|
||||
<button class="consent-btn consent-btn-outline" id="btn-settings">
|
||||
${getTranslation('btnSettings')}
|
||||
</button>
|
||||
<button class="consent-btn consent-btn-primary" id="btn-accept-all">
|
||||
${getTranslation('btnAcceptAll')}
|
||||
</button>
|
||||
<button class="consent-btn consent-btn-secondary" id="btn-reject-all">
|
||||
${getTranslation('btnRejectAll')}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
`;
|
||||
}
|
||||
|
||||
function createSettingsHTML() {
|
||||
return `
|
||||
<div id="cookie-consent-settings" role="dialog" aria-labelledby="settings-title" aria-modal="true">
|
||||
<div class="settings-header">
|
||||
<h3 id="settings-title">${getTranslation('settingsTitle')}</h3>
|
||||
<button class="settings-close" aria-label="Close">×</button>
|
||||
</div>
|
||||
|
||||
<div class="settings-content">
|
||||
<!-- Necessary Category -->
|
||||
<div class="cookie-category">
|
||||
<div class="category-header">
|
||||
<div class="category-title">
|
||||
<span>${getTranslation('categoryNecessary')}</span>
|
||||
<span class="badge badge-required">Immer aktiv</span>
|
||||
</div>
|
||||
<div class="category-toggle disabled active"></div>
|
||||
</div>
|
||||
<div class="category-description">
|
||||
${getTranslation('necessaryDesc')}
|
||||
</div>
|
||||
<div class="category-details">
|
||||
<strong>Cookies in dieser Kategorie:</strong>
|
||||
<ul>
|
||||
<li>Keine Cookies (nur im Login-Bereich)</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Analytics Category -->
|
||||
<div class="cookie-category">
|
||||
<div class="category-header" id="analytics-category-header">
|
||||
<div class="category-title">
|
||||
<span>${getTranslation('categoryAnalytics')}</span>
|
||||
</div>
|
||||
<div class="category-toggle" id="analytics-toggle"
|
||||
role="switch"
|
||||
aria-checked="${consentState.analytics}"
|
||||
tabindex="0"></div>
|
||||
</div>
|
||||
<div class="category-description">
|
||||
${getTranslation('analyticsDesc')}
|
||||
</div>
|
||||
<div class="category-details">
|
||||
<strong>AegisSight Analytics (Self-Hosted, Umami)</strong>
|
||||
<ul>
|
||||
<li><strong>Cookies:</strong> Keine (cookieloses Tracking)</li>
|
||||
<li><strong>Zweck:</strong> Anonymisierte Nutzungsstatistiken</li>
|
||||
<li><strong>Daten:</strong> Besuchte Seiten, Browser-Typ, ungefährer Standort (Stadt)</li>
|
||||
<li><strong>Server:</strong> Deutschland (aegis-sight.de)</li>
|
||||
<li><strong>Weitergabe:</strong> Keine Drittanbieter</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="settings-links">
|
||||
<a href="datenschutz.html" target="_blank">${getTranslation('linkPrivacy')}</a>
|
||||
<a href="impressum.html" target="_blank">${getTranslation('linkImprint')}</a>
|
||||
</div>
|
||||
|
||||
<div class="settings-footer">
|
||||
<button class="consent-btn consent-btn-secondary" id="btn-save-settings">
|
||||
${getTranslation('btnSaveSettings')}
|
||||
</button>
|
||||
<button class="consent-btn consent-btn-primary" id="btn-accept-all-settings">
|
||||
${getTranslation('btnAcceptAll')}
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
`;
|
||||
}
|
||||
|
||||
// === UI CONTROL ===
|
||||
|
||||
function showBanner() {
|
||||
// Check if already exists
|
||||
if (document.getElementById('cookie-consent-banner')) {
|
||||
const banner = document.getElementById('cookie-consent-banner');
|
||||
const backdrop = document.getElementById('cookie-consent-backdrop');
|
||||
banner.classList.add('active');
|
||||
backdrop.classList.add('active');
|
||||
return;
|
||||
}
|
||||
|
||||
// Create and append
|
||||
const container = document.createElement('div');
|
||||
container.innerHTML = createBannerHTML();
|
||||
document.body.appendChild(container.firstElementChild); // backdrop
|
||||
document.body.appendChild(container.lastElementChild); // banner
|
||||
|
||||
// Add event listeners
|
||||
document.getElementById('btn-accept-all').addEventListener('click', handleAcceptAll);
|
||||
document.getElementById('btn-reject-all').addEventListener('click', handleRejectAll);
|
||||
document.getElementById('btn-settings').addEventListener('click', showSettings);
|
||||
|
||||
// Prevent page scroll
|
||||
document.body.style.overflow = 'hidden';
|
||||
|
||||
// Focus trap
|
||||
document.getElementById('btn-accept-all').focus();
|
||||
}
|
||||
|
||||
function hideBanner() {
|
||||
const banner = document.getElementById('cookie-consent-banner');
|
||||
const backdrop = document.getElementById('cookie-consent-backdrop');
|
||||
|
||||
if (banner) {
|
||||
banner.classList.remove('active');
|
||||
backdrop.classList.remove('active');
|
||||
|
||||
setTimeout(() => {
|
||||
banner.remove();
|
||||
backdrop.remove();
|
||||
}, 400);
|
||||
}
|
||||
|
||||
// Re-enable page scroll
|
||||
document.body.style.overflow = '';
|
||||
}
|
||||
|
||||
function showSettings() {
|
||||
// Create settings modal if not exists
|
||||
if (!document.getElementById('cookie-consent-settings')) {
|
||||
const container = document.createElement('div');
|
||||
container.innerHTML = createSettingsHTML();
|
||||
document.body.appendChild(container.firstElementChild);
|
||||
|
||||
// Add event listeners
|
||||
document.querySelector('.settings-close').addEventListener('click', hideSettings);
|
||||
document.getElementById('btn-save-settings').addEventListener('click', handleSaveSettings);
|
||||
document.getElementById('btn-accept-all-settings').addEventListener('click', handleAcceptAll);
|
||||
|
||||
// Analytics toggle
|
||||
const analyticsToggle = document.getElementById('analytics-toggle');
|
||||
const analyticsHeader = document.getElementById('analytics-category-header');
|
||||
|
||||
analyticsHeader.addEventListener('click', () => {
|
||||
consentState.analytics = !consentState.analytics;
|
||||
updateToggle();
|
||||
});
|
||||
|
||||
analyticsToggle.addEventListener('keydown', (e) => {
|
||||
if (e.key === 'Enter' || e.key === ' ') {
|
||||
e.preventDefault();
|
||||
consentState.analytics = !consentState.analytics;
|
||||
updateToggle();
|
||||
}
|
||||
});
|
||||
|
||||
function updateToggle() {
|
||||
analyticsToggle.classList.toggle('active', consentState.analytics);
|
||||
analyticsToggle.setAttribute('aria-checked', consentState.analytics);
|
||||
}
|
||||
|
||||
updateToggle();
|
||||
}
|
||||
|
||||
const settings = document.getElementById('cookie-consent-settings');
|
||||
settings.classList.add('active');
|
||||
|
||||
// Focus trap
|
||||
document.querySelector('.settings-close').focus();
|
||||
}
|
||||
|
||||
function hideSettings() {
|
||||
const settings = document.getElementById('cookie-consent-settings');
|
||||
if (settings) {
|
||||
settings.classList.remove('active');
|
||||
setTimeout(() => settings.remove(), 300);
|
||||
}
|
||||
}
|
||||
|
||||
// === EVENT HANDLERS ===
|
||||
|
||||
function handleAcceptAll() {
|
||||
saveConsent(true);
|
||||
hideBanner();
|
||||
hideSettings();
|
||||
}
|
||||
|
||||
function handleRejectAll() {
|
||||
saveConsent(false);
|
||||
hideBanner();
|
||||
hideSettings();
|
||||
}
|
||||
|
||||
function handleSaveSettings() {
|
||||
saveConsent(consentState.analytics);
|
||||
hideSettings();
|
||||
hideBanner();
|
||||
}
|
||||
|
||||
// === INITIALIZATION ===
|
||||
|
||||
function init() {
|
||||
console.log('[CookieConsent] Initializing v' + CONFIG.CONSENT_VERSION);
|
||||
|
||||
// Load existing consent
|
||||
const consent = loadConsent();
|
||||
|
||||
if (consent === null) {
|
||||
// No consent yet - show banner
|
||||
if (document.readyState === 'loading') {
|
||||
document.addEventListener('DOMContentLoaded', showBanner);
|
||||
} else {
|
||||
showBanner();
|
||||
}
|
||||
} else {
|
||||
// Consent exists - apply settings
|
||||
if (consentState.analytics) {
|
||||
loadTracking();
|
||||
}
|
||||
console.log('[CookieConsent] Existing consent loaded:', consent);
|
||||
}
|
||||
|
||||
// Cookie settings link in footer
|
||||
document.addEventListener('DOMContentLoaded', () => {
|
||||
const settingsLink = document.getElementById('cookie-settings-link');
|
||||
if (settingsLink) {
|
||||
settingsLink.addEventListener('click', (e) => {
|
||||
e.preventDefault();
|
||||
showBanner();
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// === PUBLIC API ===
|
||||
|
||||
window.CookieConsent = {
|
||||
show: showBanner,
|
||||
hide: hideBanner,
|
||||
showSettings: showSettings,
|
||||
acceptAll: handleAcceptAll,
|
||||
rejectAll: handleRejectAll,
|
||||
getStatus: function() {
|
||||
const consent = getStorageWithExpiry(CONFIG.STORAGE_KEY);
|
||||
const details = JSON.parse(localStorage.getItem(CONFIG.STORAGE_DETAILS) || '{}');
|
||||
|
||||
return {
|
||||
consent: consent,
|
||||
analytics: consentState.analytics,
|
||||
version: details.version,
|
||||
timestamp: details.timestamp,
|
||||
expires: localStorage.getItem(CONFIG.STORAGE_KEY) ?
|
||||
JSON.parse(localStorage.getItem(CONFIG.STORAGE_KEY)).expires : null,
|
||||
gpc: detectGPC()
|
||||
};
|
||||
},
|
||||
setLanguage: function(lang) {
|
||||
if (TRANSLATIONS[lang]) {
|
||||
currentLanguage = lang;
|
||||
console.log('[CookieConsent] Language set to:', lang);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// Auto-initialize
|
||||
init();
|
||||
|
||||
})();
|
||||
@@ -1,612 +0,0 @@
|
||||
/* Modern About Section Redesign */
|
||||
|
||||
/* About Section Background */
|
||||
.about-section {
|
||||
background: linear-gradient(135deg, #ffffff 0%, #f8fafb 100%);
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
padding: 100px 0;
|
||||
}
|
||||
|
||||
.about-section::before {
|
||||
content: '';
|
||||
position: absolute;
|
||||
top: -50%;
|
||||
right: -20%;
|
||||
width: 60%;
|
||||
height: 60%;
|
||||
background: radial-gradient(circle, rgba(15, 114, 181, 0.05) 0%, transparent 70%);
|
||||
border-radius: 50%;
|
||||
animation: float-slow 20s ease-in-out infinite;
|
||||
}
|
||||
|
||||
@keyframes float-slow {
|
||||
0%, 100% { transform: translate(0, 0) scale(1); }
|
||||
33% { transform: translate(-30px, -30px) scale(1.05); }
|
||||
66% { transform: translate(30px, -20px) scale(0.95); }
|
||||
}
|
||||
|
||||
/* Modern Tab Navigation */
|
||||
.about-tabs {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
gap: 20px;
|
||||
margin-bottom: 4rem;
|
||||
position: relative;
|
||||
padding: 10px;
|
||||
background: rgba(255, 255, 255, 0.8);
|
||||
backdrop-filter: blur(10px);
|
||||
border-radius: 100px;
|
||||
box-shadow: 0 10px 40px rgba(0, 0, 0, 0.08);
|
||||
max-width: 800px;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
border: none;
|
||||
}
|
||||
|
||||
.about-tab {
|
||||
background: transparent;
|
||||
border: none;
|
||||
color: #666;
|
||||
padding: 15px 30px;
|
||||
cursor: pointer;
|
||||
transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
|
||||
font-size: 1rem;
|
||||
font-weight: 600;
|
||||
border-radius: 50px;
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
z-index: 1;
|
||||
}
|
||||
|
||||
.about-tab::before {
|
||||
content: '';
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
left: 50%;
|
||||
width: 0;
|
||||
height: 0;
|
||||
border-radius: 50px;
|
||||
background: linear-gradient(135deg, #0f72b5, #00406e);
|
||||
transform: translate(-50%, -50%);
|
||||
transition: all 0.5s cubic-bezier(0.4, 0, 0.2, 1);
|
||||
z-index: -1;
|
||||
}
|
||||
|
||||
.about-tab.active::before {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.about-tab.active {
|
||||
color: #ffffff;
|
||||
transform: scale(1.05);
|
||||
box-shadow: 0 8px 20px rgba(15, 114, 181, 0.3);
|
||||
}
|
||||
|
||||
.about-tab:hover:not(.active) {
|
||||
color: #0f72b5;
|
||||
transform: translateY(-2px);
|
||||
background: rgba(15, 114, 181, 0.05);
|
||||
}
|
||||
|
||||
/* Tab Content Panels */
|
||||
.about-content {
|
||||
max-width: 1200px;
|
||||
margin: 0 auto;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.about-panel {
|
||||
display: none;
|
||||
animation: fadeInUp 0.6s cubic-bezier(0.4, 0, 0.2, 1);
|
||||
}
|
||||
|
||||
.about-panel.active {
|
||||
display: block;
|
||||
}
|
||||
|
||||
@keyframes fadeInUp {
|
||||
from {
|
||||
opacity: 0;
|
||||
transform: translateY(30px);
|
||||
}
|
||||
to {
|
||||
opacity: 1;
|
||||
transform: translateY(0);
|
||||
}
|
||||
}
|
||||
|
||||
/* Company Tab - Cards Layout */
|
||||
#who-we-are .panel-text {
|
||||
display: flex;
|
||||
gap: 40px;
|
||||
align-items: stretch;
|
||||
min-height: 500px;
|
||||
}
|
||||
|
||||
.company-cards-wrapper {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 30px;
|
||||
width: 50%;
|
||||
justify-content: space-between;
|
||||
}
|
||||
|
||||
.company-card {
|
||||
background: white;
|
||||
border-radius: 20px;
|
||||
padding: 40px;
|
||||
box-shadow: 0 10px 40px rgba(0, 0, 0, 0.08);
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
|
||||
flex: 1;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.company-card::before {
|
||||
content: '';
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 4px;
|
||||
height: 100%;
|
||||
background: linear-gradient(180deg, #0f72b5, #00406e);
|
||||
transform: scaleY(0);
|
||||
transition: transform 0.4s;
|
||||
}
|
||||
|
||||
.company-card:hover::before {
|
||||
transform: scaleY(1);
|
||||
}
|
||||
|
||||
.company-card:hover {
|
||||
transform: translateX(10px);
|
||||
box-shadow: 0 15px 50px rgba(15, 114, 181, 0.15);
|
||||
}
|
||||
|
||||
.company-card h4 {
|
||||
color: #0f72b5;
|
||||
font-size: 1.4rem;
|
||||
margin-bottom: 15px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 15px;
|
||||
}
|
||||
|
||||
.company-card-icon {
|
||||
width: 70px;
|
||||
height: 70px;
|
||||
background: linear-gradient(135deg, rgba(15, 114, 181, 0.1), rgba(0, 64, 110, 0.05));
|
||||
border-radius: 20px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
flex-shrink: 0;
|
||||
transition: all 0.4s;
|
||||
}
|
||||
|
||||
.company-card:hover .company-card-icon {
|
||||
transform: scale(1.1) rotate(5deg);
|
||||
background: linear-gradient(135deg, #0f72b5, #00406e);
|
||||
}
|
||||
|
||||
.company-card-icon img {
|
||||
width: 35px;
|
||||
height: 35px;
|
||||
filter: brightness(0) saturate(100%) invert(42%) sepia(82%) saturate(723%) hue-rotate(178deg) brightness(98%) contrast(92%);
|
||||
transition: filter 0.4s;
|
||||
}
|
||||
|
||||
.company-card:hover .company-card-icon img {
|
||||
filter: brightness(0) saturate(100%) invert(100%);
|
||||
}
|
||||
|
||||
/* Mission & Values - Modern Grid */
|
||||
.mission-grid {
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
.mission-header {
|
||||
background: linear-gradient(135deg, #0f72b5, #00406e);
|
||||
color: white;
|
||||
padding: 60px;
|
||||
border-radius: 30px;
|
||||
margin-bottom: 40px;
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.mission-header::after {
|
||||
content: '';
|
||||
position: absolute;
|
||||
top: -50%;
|
||||
right: -10%;
|
||||
width: 50%;
|
||||
height: 200%;
|
||||
background: rgba(255, 255, 255, 0.1);
|
||||
transform: rotate(45deg);
|
||||
}
|
||||
|
||||
.mission-header h3 {
|
||||
font-size: 2.5rem;
|
||||
margin-bottom: 20px;
|
||||
position: relative;
|
||||
z-index: 1;
|
||||
color: #ffffff;
|
||||
}
|
||||
|
||||
.mission-header p {
|
||||
font-size: 1.2rem;
|
||||
position: relative;
|
||||
z-index: 1;
|
||||
opacity: 0.95;
|
||||
}
|
||||
|
||||
.values-grid {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
|
||||
gap: 30px;
|
||||
margin: 3rem 0;
|
||||
}
|
||||
|
||||
.value-card {
|
||||
background: white;
|
||||
border-radius: 24px;
|
||||
padding: 35px;
|
||||
transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
border: 2px solid transparent;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.value-card::after {
|
||||
content: '';
|
||||
position: absolute;
|
||||
inset: 0;
|
||||
background: linear-gradient(135deg, rgba(15, 114, 181, 0.1) 0%, transparent 100%);
|
||||
opacity: 0;
|
||||
transition: opacity 0.4s;
|
||||
}
|
||||
|
||||
.value-card:hover::after {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
.value-card:hover {
|
||||
transform: translateY(-10px) scale(1.02);
|
||||
box-shadow: 0 20px 60px rgba(15, 114, 181, 0.2);
|
||||
border-color: #0f72b5;
|
||||
}
|
||||
|
||||
.value-icon {
|
||||
width: 100px;
|
||||
height: 100px;
|
||||
margin-bottom: 20px;
|
||||
background: linear-gradient(135deg, rgba(15, 114, 181, 0.1), rgba(0, 64, 110, 0.05));
|
||||
border-radius: 30px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
transition: all 0.4s;
|
||||
}
|
||||
|
||||
.value-icon img {
|
||||
width: 50px;
|
||||
height: 50px;
|
||||
filter: brightness(0) saturate(100%) invert(42%) sepia(82%) saturate(723%) hue-rotate(178deg) brightness(98%) contrast(92%);
|
||||
transition: filter 0.4s;
|
||||
}
|
||||
|
||||
.value-card:hover .value-icon {
|
||||
transform: scale(1.1) rotate(5deg);
|
||||
background: linear-gradient(135deg, #0f72b5, #00406e);
|
||||
}
|
||||
|
||||
.value-card:hover .value-icon img {
|
||||
filter: brightness(0) saturate(100%) invert(100%);
|
||||
}
|
||||
|
||||
/* Competencies - Timeline Style */
|
||||
.competencies-list {
|
||||
position: relative;
|
||||
padding-left: 40px;
|
||||
}
|
||||
|
||||
.competencies-list::before {
|
||||
content: '';
|
||||
position: absolute;
|
||||
left: 10px;
|
||||
top: 0;
|
||||
width: 3px;
|
||||
height: 100%;
|
||||
background: linear-gradient(180deg, #0f72b5, #00406e);
|
||||
border-radius: 2px;
|
||||
}
|
||||
|
||||
.competency-item {
|
||||
display: grid;
|
||||
grid-template-columns: auto 1fr;
|
||||
gap: 30px;
|
||||
align-items: center;
|
||||
padding: 30px;
|
||||
margin-bottom: 30px;
|
||||
background: white;
|
||||
border-radius: 20px;
|
||||
position: relative;
|
||||
transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
|
||||
box-shadow: 0 5px 20px rgba(0, 0, 0, 0.05);
|
||||
}
|
||||
|
||||
.competency-item::before {
|
||||
content: '';
|
||||
position: absolute;
|
||||
left: -30px;
|
||||
top: 50%;
|
||||
transform: translateY(-50%);
|
||||
width: 20px;
|
||||
height: 20px;
|
||||
background: white;
|
||||
border: 4px solid #0f72b5;
|
||||
border-radius: 50%;
|
||||
z-index: 1;
|
||||
}
|
||||
|
||||
.competency-item:hover {
|
||||
transform: translateX(20px);
|
||||
box-shadow: 0 10px 40px rgba(15, 114, 181, 0.15);
|
||||
}
|
||||
|
||||
.competency-number {
|
||||
font-size: 3rem;
|
||||
font-weight: 700;
|
||||
background: linear-gradient(135deg, #0f72b5, #00406e);
|
||||
-webkit-background-clip: text;
|
||||
-webkit-text-fill-color: transparent;
|
||||
background-clip: text;
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
/* Why IntelSight - 2x2 Grid */
|
||||
.why-grid {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(2, 1fr);
|
||||
gap: 30px;
|
||||
grid-auto-rows: minmax(250px, auto);
|
||||
}
|
||||
|
||||
.why-card {
|
||||
grid-column: span 1;
|
||||
grid-row: span 1;
|
||||
}
|
||||
|
||||
.why-card {
|
||||
background: white;
|
||||
border-radius: 24px;
|
||||
padding: 35px;
|
||||
transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: space-between;
|
||||
box-shadow: 0 5px 20px rgba(0, 0, 0, 0.08);
|
||||
border: 2px solid transparent;
|
||||
}
|
||||
|
||||
.why-card:hover {
|
||||
transform: translateY(-5px);
|
||||
box-shadow: 0 15px 40px rgba(15, 114, 181, 0.15);
|
||||
border-color: rgba(15, 114, 181, 0.3);
|
||||
}
|
||||
|
||||
.why-icon {
|
||||
width: 100px;
|
||||
height: 100px;
|
||||
margin: 0 auto 25px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
background: linear-gradient(135deg, rgba(15, 114, 181, 0.1), rgba(0, 64, 110, 0.05));
|
||||
border-radius: 30px;
|
||||
transition: all 0.4s;
|
||||
}
|
||||
|
||||
.why-icon img {
|
||||
width: 50px;
|
||||
height: 50px;
|
||||
filter: brightness(0) saturate(100%) invert(42%) sepia(82%) saturate(723%) hue-rotate(178deg) brightness(98%) contrast(92%);
|
||||
transition: filter 0.4s;
|
||||
}
|
||||
|
||||
/* German Flag Icon Special Styling */
|
||||
.german-flag-icon {
|
||||
background: transparent !important;
|
||||
padding: 15px;
|
||||
}
|
||||
|
||||
.german-flag-icon img {
|
||||
width: 70px !important;
|
||||
height: 42px !important;
|
||||
border-radius: 4px;
|
||||
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
|
||||
filter: none !important;
|
||||
}
|
||||
|
||||
.why-card:hover .german-flag-icon {
|
||||
background: transparent !important;
|
||||
transform: scale(1.15);
|
||||
}
|
||||
|
||||
.why-card:hover .german-flag-icon img {
|
||||
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.25);
|
||||
filter: none !important;
|
||||
}
|
||||
|
||||
.why-card:hover .why-icon {
|
||||
transform: scale(1.1) rotate(5deg);
|
||||
background: linear-gradient(135deg, #0f72b5, #00406e);
|
||||
}
|
||||
|
||||
.why-card:hover .why-icon img {
|
||||
filter: brightness(0) saturate(100%) invert(100%);
|
||||
}
|
||||
|
||||
.why-card h4 {
|
||||
font-size: 1.6rem;
|
||||
margin-bottom: 20px;
|
||||
color: #0f72b5;
|
||||
text-align: center;
|
||||
font-weight: 700;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.5px;
|
||||
}
|
||||
|
||||
.why-card p {
|
||||
color: #666;
|
||||
line-height: 1.8;
|
||||
flex-grow: 1;
|
||||
text-align: center;
|
||||
font-size: 1.05rem;
|
||||
}
|
||||
|
||||
/* Location Section with Map */
|
||||
.location-section {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
width: 45%;
|
||||
margin-left: auto;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.mini-germany-map {
|
||||
flex: 1;
|
||||
width: 100%;
|
||||
max-width: 350px;
|
||||
padding: 30px;
|
||||
background: white;
|
||||
border-radius: 20px;
|
||||
box-shadow: 0 10px 40px rgba(0, 0, 0, 0.08);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
transition: all 0.3s;
|
||||
margin-bottom: 20px;
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.mini-germany-map::before {
|
||||
content: '';
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
background: radial-gradient(circle at 35% 45%, rgba(15, 114, 181, 0.3) 0%, transparent 40%);
|
||||
opacity: 0;
|
||||
transition: opacity 0.4s ease;
|
||||
pointer-events: none;
|
||||
z-index: 2;
|
||||
}
|
||||
|
||||
.mini-germany-map:hover::before {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
.mini-germany-map:hover {
|
||||
transform: scale(1.02);
|
||||
box-shadow: 0 15px 50px rgba(15, 114, 181, 0.15);
|
||||
}
|
||||
|
||||
.mini-germany-map img {
|
||||
width: 100%;
|
||||
height: auto;
|
||||
max-height: 100%;
|
||||
object-fit: contain;
|
||||
transition: all 0.4s ease;
|
||||
position: relative;
|
||||
z-index: 1;
|
||||
}
|
||||
|
||||
.mini-germany-map:hover img {
|
||||
filter: brightness(1.1) contrast(1.1);
|
||||
}
|
||||
|
||||
/* Pulsing glow effect for NRW region */
|
||||
@keyframes nrwPulse {
|
||||
0%, 100% {
|
||||
filter: drop-shadow(0 0 10px rgba(15, 114, 181, 0.5));
|
||||
}
|
||||
50% {
|
||||
filter: drop-shadow(0 0 25px rgba(15, 114, 181, 0.8));
|
||||
}
|
||||
}
|
||||
|
||||
.mini-germany-map:hover img {
|
||||
animation: nrwPulse 2s ease-in-out infinite;
|
||||
}
|
||||
|
||||
/* Location Badge Enhancement */
|
||||
.location-badge {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
gap: 12px;
|
||||
padding: 12px 24px;
|
||||
background: linear-gradient(135deg, rgba(15, 114, 181, 0.1), rgba(0, 64, 110, 0.05));
|
||||
border-radius: 100px;
|
||||
color: #0f72b5;
|
||||
font-weight: 600;
|
||||
border: 2px solid rgba(15, 114, 181, 0.2);
|
||||
transition: all 0.3s;
|
||||
}
|
||||
|
||||
.location-badge:hover {
|
||||
background: linear-gradient(135deg, #0f72b5, #00406e);
|
||||
color: white;
|
||||
transform: scale(1.05);
|
||||
box-shadow: 0 10px 30px rgba(15, 114, 181, 0.3);
|
||||
}
|
||||
|
||||
.location-badge svg {
|
||||
width: 24px;
|
||||
height: 24px;
|
||||
transition: all 0.3s;
|
||||
}
|
||||
|
||||
.location-badge:hover svg {
|
||||
animation: ping 1s cubic-bezier(0, 0, 0.2, 1) infinite;
|
||||
}
|
||||
|
||||
@keyframes ping {
|
||||
0%, 100% {
|
||||
transform: scale(1);
|
||||
opacity: 1;
|
||||
}
|
||||
50% {
|
||||
transform: scale(1.2);
|
||||
opacity: 0.8;
|
||||
}
|
||||
}
|
||||
|
||||
/* Responsive Design */
|
||||
@media (max-width: 768px) {
|
||||
.about-tabs {
|
||||
flex-direction: column;
|
||||
border-radius: 20px;
|
||||
gap: 10px;
|
||||
}
|
||||
|
||||
.why-grid {
|
||||
grid-template-columns: 1fr;
|
||||
}
|
||||
|
||||
.competencies-list {
|
||||
padding-left: 20px;
|
||||
}
|
||||
}
|
||||
@@ -1,371 +0,0 @@
|
||||
/* Enhanced Modern Animations & Effects */
|
||||
|
||||
/* Glassmorphism Base */
|
||||
.glass {
|
||||
background: rgba(255, 255, 255, 0.1);
|
||||
backdrop-filter: blur(10px);
|
||||
-webkit-backdrop-filter: blur(10px);
|
||||
border: 1px solid rgba(255, 255, 255, 0.2);
|
||||
}
|
||||
|
||||
.glass-dark {
|
||||
background: rgba(0, 0, 0, 0.3);
|
||||
backdrop-filter: blur(20px);
|
||||
-webkit-backdrop-filter: blur(20px);
|
||||
border: 1px solid rgba(255, 255, 255, 0.1);
|
||||
}
|
||||
|
||||
/* Premium Glow Effects */
|
||||
.glow-blue {
|
||||
box-shadow:
|
||||
0 0 20px rgba(15, 114, 181, 0.5),
|
||||
0 0 40px rgba(15, 114, 181, 0.3),
|
||||
0 0 60px rgba(15, 114, 181, 0.1);
|
||||
}
|
||||
|
||||
.text-glow {
|
||||
text-shadow:
|
||||
0 0 10px rgba(15, 114, 181, 0.8),
|
||||
0 0 20px rgba(15, 114, 181, 0.6),
|
||||
0 0 30px rgba(15, 114, 181, 0.4);
|
||||
}
|
||||
|
||||
/* Smooth Fade In Animations */
|
||||
@keyframes fadeInUp {
|
||||
from {
|
||||
opacity: 0;
|
||||
transform: translateY(30px);
|
||||
}
|
||||
to {
|
||||
opacity: 1;
|
||||
transform: translateY(0);
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes fadeInScale {
|
||||
from {
|
||||
opacity: 0;
|
||||
transform: scale(0.9);
|
||||
}
|
||||
to {
|
||||
opacity: 1;
|
||||
transform: scale(1);
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes slideInRight {
|
||||
from {
|
||||
opacity: 0;
|
||||
transform: translateX(-50px);
|
||||
}
|
||||
to {
|
||||
opacity: 1;
|
||||
transform: translateX(0);
|
||||
}
|
||||
}
|
||||
|
||||
/* Staggered Animation Classes */
|
||||
.animate-in {
|
||||
opacity: 0;
|
||||
animation: fadeInUp 0.8s cubic-bezier(0.34, 1.56, 0.64, 1) forwards;
|
||||
}
|
||||
|
||||
.animate-in-scale {
|
||||
opacity: 0;
|
||||
animation: fadeInScale 0.6s cubic-bezier(0.34, 1.56, 0.64, 1) forwards;
|
||||
}
|
||||
|
||||
.stagger-1 { animation-delay: 0.1s; }
|
||||
.stagger-2 { animation-delay: 0.2s; }
|
||||
.stagger-3 { animation-delay: 0.3s; }
|
||||
.stagger-4 { animation-delay: 0.4s; }
|
||||
.stagger-5 { animation-delay: 0.5s; }
|
||||
|
||||
/* Floating Animation */
|
||||
@keyframes float {
|
||||
0%, 100% { transform: translateY(0px); }
|
||||
50% { transform: translateY(-20px); }
|
||||
}
|
||||
|
||||
.floating {
|
||||
animation: float 6s ease-in-out infinite;
|
||||
}
|
||||
|
||||
/* Pulse Glow Animation */
|
||||
@keyframes pulseGlow {
|
||||
0%, 100% {
|
||||
box-shadow:
|
||||
0 0 5px rgba(15, 114, 181, 0.5),
|
||||
0 0 10px rgba(15, 114, 181, 0.3);
|
||||
}
|
||||
50% {
|
||||
box-shadow:
|
||||
0 0 20px rgba(15, 114, 181, 0.8),
|
||||
0 0 30px rgba(15, 114, 181, 0.5),
|
||||
0 0 40px rgba(15, 114, 181, 0.3);
|
||||
}
|
||||
}
|
||||
|
||||
.pulse-glow {
|
||||
animation: pulseGlow 2s ease-in-out infinite;
|
||||
}
|
||||
|
||||
/* Gradient Animation */
|
||||
@keyframes gradientShift {
|
||||
0% { background-position: 0% 50%; }
|
||||
50% { background-position: 100% 50%; }
|
||||
100% { background-position: 0% 50%; }
|
||||
}
|
||||
|
||||
.gradient-animated {
|
||||
background: linear-gradient(
|
||||
-45deg,
|
||||
#0f72b5,
|
||||
#00406e,
|
||||
#0f72b5,
|
||||
#1e90ff
|
||||
);
|
||||
background-size: 400% 400%;
|
||||
animation: gradientShift 15s ease infinite;
|
||||
}
|
||||
|
||||
/* Text Reveal Animation */
|
||||
@keyframes textReveal {
|
||||
from {
|
||||
clip-path: polygon(0 0, 0 0, 0 100%, 0% 100%);
|
||||
}
|
||||
to {
|
||||
clip-path: polygon(0 0, 100% 0, 100% 100%, 0 100%);
|
||||
}
|
||||
}
|
||||
|
||||
.text-reveal {
|
||||
animation: textReveal 1.5s cubic-bezier(0.77, 0, 0.175, 1) forwards;
|
||||
}
|
||||
|
||||
/* Typewriter Effect */
|
||||
@keyframes typewriter {
|
||||
from { width: 0; }
|
||||
to { width: 100%; }
|
||||
}
|
||||
|
||||
@keyframes blink {
|
||||
50% { border-color: transparent; }
|
||||
}
|
||||
|
||||
.typewriter {
|
||||
overflow: hidden;
|
||||
white-space: nowrap;
|
||||
border-right: 3px solid #0f72b5;
|
||||
animation:
|
||||
typewriter 3s steps(40) forwards,
|
||||
blink 0.75s step-end infinite;
|
||||
}
|
||||
|
||||
/* Morphing Blob Background */
|
||||
@keyframes morph {
|
||||
0% { border-radius: 60% 40% 30% 70% / 60% 30% 70% 40%; }
|
||||
50% { border-radius: 30% 60% 70% 40% / 50% 60% 30% 60%; }
|
||||
100% { border-radius: 60% 40% 30% 70% / 60% 30% 70% 40%; }
|
||||
}
|
||||
|
||||
.blob {
|
||||
background: linear-gradient(45deg, #0f72b5, #00406e);
|
||||
animation: morph 8s ease-in-out infinite;
|
||||
filter: blur(40px);
|
||||
opacity: 0.7;
|
||||
}
|
||||
|
||||
/* Card Hover Effects */
|
||||
.card-hover-lift {
|
||||
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
|
||||
}
|
||||
|
||||
.card-hover-lift:hover {
|
||||
transform: translateY(-10px) scale(1.02);
|
||||
box-shadow:
|
||||
0 20px 40px rgba(0, 0, 0, 0.15),
|
||||
0 0 20px rgba(15, 114, 181, 0.3);
|
||||
}
|
||||
|
||||
/* Magnetic Button Effect */
|
||||
.magnetic-button {
|
||||
position: relative;
|
||||
transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);
|
||||
}
|
||||
|
||||
.magnetic-button::before {
|
||||
content: '';
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
left: 50%;
|
||||
width: 0;
|
||||
height: 0;
|
||||
border-radius: 50%;
|
||||
background: rgba(255, 255, 255, 0.3);
|
||||
transform: translate(-50%, -50%);
|
||||
transition: width 0.6s, height 0.6s;
|
||||
}
|
||||
|
||||
.magnetic-button:hover::before {
|
||||
width: 300px;
|
||||
height: 300px;
|
||||
}
|
||||
|
||||
/* Parallax Layers */
|
||||
.parallax-slow { transform: translateZ(-1px) scale(1.5); }
|
||||
.parallax-medium { transform: translateZ(-2px) scale(2); }
|
||||
.parallax-fast { transform: translateZ(-3px) scale(2.5); }
|
||||
|
||||
/* Reveal on Scroll */
|
||||
.reveal {
|
||||
opacity: 0;
|
||||
transform: translateY(50px);
|
||||
transition: all 1s cubic-bezier(0.4, 0, 0.2, 1);
|
||||
}
|
||||
|
||||
.reveal.active {
|
||||
opacity: 1;
|
||||
transform: translateY(0);
|
||||
}
|
||||
|
||||
/* Glitch Effect */
|
||||
@keyframes glitch {
|
||||
0%, 100% {
|
||||
text-shadow:
|
||||
0.05em 0 0 rgba(255, 0, 0, 0.75),
|
||||
-0.05em -0.025em 0 rgba(0, 255, 0, 0.75),
|
||||
0.025em 0.05em 0 rgba(0, 0, 255, 0.75);
|
||||
}
|
||||
14% {
|
||||
text-shadow:
|
||||
0.05em 0 0 rgba(255, 0, 0, 0.75),
|
||||
-0.05em -0.025em 0 rgba(0, 255, 0, 0.75),
|
||||
0.025em 0.05em 0 rgba(0, 0, 255, 0.75);
|
||||
}
|
||||
15% {
|
||||
text-shadow:
|
||||
-0.05em -0.025em 0 rgba(255, 0, 0, 0.75),
|
||||
0.025em 0.025em 0 rgba(0, 255, 0, 0.75),
|
||||
-0.05em -0.05em 0 rgba(0, 0, 255, 0.75);
|
||||
}
|
||||
49% {
|
||||
text-shadow:
|
||||
-0.05em -0.025em 0 rgba(255, 0, 0, 0.75),
|
||||
0.025em 0.025em 0 rgba(0, 255, 0, 0.75),
|
||||
-0.05em -0.05em 0 rgba(0, 0, 255, 0.75);
|
||||
}
|
||||
50% {
|
||||
text-shadow:
|
||||
0.025em 0.05em 0 rgba(255, 0, 0, 0.75),
|
||||
0.05em 0 0 rgba(0, 255, 0, 0.75),
|
||||
0 -0.05em 0 rgba(0, 0, 255, 0.75);
|
||||
}
|
||||
99% {
|
||||
text-shadow:
|
||||
0.025em 0.05em 0 rgba(255, 0, 0, 0.75),
|
||||
0.05em 0 0 rgba(0, 255, 0, 0.75),
|
||||
0 -0.05em 0 rgba(0, 0, 255, 0.75);
|
||||
}
|
||||
}
|
||||
|
||||
.glitch {
|
||||
animation: glitch 1s linear infinite;
|
||||
}
|
||||
|
||||
/* Smooth Scroll Indicator */
|
||||
@keyframes scrollDown {
|
||||
0% {
|
||||
transform: translateY(0);
|
||||
opacity: 0;
|
||||
}
|
||||
40% {
|
||||
opacity: 1;
|
||||
}
|
||||
80% {
|
||||
transform: translateY(20px);
|
||||
opacity: 0;
|
||||
}
|
||||
100% {
|
||||
opacity: 0;
|
||||
}
|
||||
}
|
||||
|
||||
.scroll-indicator-animated {
|
||||
animation: scrollDown 2s infinite;
|
||||
}
|
||||
|
||||
/* Loading Shimmer */
|
||||
@keyframes shimmer {
|
||||
0% {
|
||||
background-position: -1000px 0;
|
||||
}
|
||||
100% {
|
||||
background-position: 1000px 0;
|
||||
}
|
||||
}
|
||||
|
||||
.shimmer {
|
||||
background: linear-gradient(
|
||||
90deg,
|
||||
rgba(255, 255, 255, 0) 0%,
|
||||
rgba(255, 255, 255, 0.3) 50%,
|
||||
rgba(255, 255, 255, 0) 100%
|
||||
);
|
||||
background-size: 1000px 100%;
|
||||
animation: shimmer 2s infinite;
|
||||
}
|
||||
|
||||
/* Orbit Animation */
|
||||
@keyframes orbit {
|
||||
from { transform: rotate(0deg) translateX(100px) rotate(0deg); }
|
||||
to { transform: rotate(360deg) translateX(100px) rotate(-360deg); }
|
||||
}
|
||||
|
||||
.orbit {
|
||||
animation: orbit 20s linear infinite;
|
||||
}
|
||||
|
||||
/* Perspective Tilt */
|
||||
.tilt-card {
|
||||
transform-style: preserve-3d;
|
||||
transition: transform 0.5s;
|
||||
}
|
||||
|
||||
.tilt-card:hover {
|
||||
transform: perspective(1000px) rotateX(10deg) rotateY(-10deg) scale(1.05);
|
||||
}
|
||||
|
||||
/* Neon Glow Text */
|
||||
.neon-text {
|
||||
color: #fff;
|
||||
text-shadow:
|
||||
0 0 7px #fff,
|
||||
0 0 10px #fff,
|
||||
0 0 21px #fff,
|
||||
0 0 42px #0f72b5,
|
||||
0 0 82px #0f72b5,
|
||||
0 0 92px #0f72b5,
|
||||
0 0 102px #0f72b5,
|
||||
0 0 151px #0f72b5;
|
||||
}
|
||||
|
||||
/* Water Ripple Effect */
|
||||
@keyframes ripple {
|
||||
0% {
|
||||
transform: scale(0);
|
||||
opacity: 1;
|
||||
}
|
||||
100% {
|
||||
transform: scale(4);
|
||||
opacity: 0;
|
||||
}
|
||||
}
|
||||
|
||||
.ripple::before {
|
||||
content: '';
|
||||
position: absolute;
|
||||
border: 1px solid #0f72b5;
|
||||
border-radius: 50%;
|
||||
animation: ripple 1s ease-out;
|
||||
}
|
||||
2715
css/animations.css
@@ -1,4 +1,10 @@
|
||||
/* Local Font Definitions - DSGVO-compliant */
|
||||
/*
|
||||
* Schrift-Zuordnung:
|
||||
* - Bebas Neue: Nur für Hero-Titel "SICHERHEIT MADE IN GERMANY" (Display)
|
||||
* - Inter: Navigation, Überschriften, Fließtext, Buttons (alles andere)
|
||||
* - System-Fonts: Nur als Fallback
|
||||
*/
|
||||
|
||||
@font-face {
|
||||
font-family: 'Bebas Neue';
|
||||
@@ -38,4 +44,4 @@
|
||||
font-weight: 700;
|
||||
font-display: swap;
|
||||
src: url('../assets/fonts/Inter-Bold.ttf') format('truetype');
|
||||
}
|
||||
}
|
||||
|
||||
73
css/lang-switcher.css
Normale Datei
@@ -0,0 +1,73 @@
|
||||
/* Language switcher (DE/EN)
|
||||
Used on every page in the site header and inside the mobile menu.
|
||||
Active language is non-clickable, inactive language is a link to the
|
||||
counterpart URL. Pendant URL is hardcoded per page so the switch works
|
||||
without JavaScript. */
|
||||
|
||||
.lang-switcher {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
gap: 0.4em;
|
||||
font-family: 'Inter', -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
|
||||
font-size: 0.9rem;
|
||||
font-weight: 600;
|
||||
letter-spacing: 0.04em;
|
||||
user-select: none;
|
||||
line-height: 1;
|
||||
}
|
||||
|
||||
.lang-switcher .lang-active {
|
||||
color: #C8A851;
|
||||
cursor: default;
|
||||
}
|
||||
|
||||
.lang-switcher .lang-link {
|
||||
color: #5A6478;
|
||||
text-decoration: none;
|
||||
transition: color 0.2s ease;
|
||||
padding: 0.15em 0;
|
||||
}
|
||||
|
||||
.lang-switcher .lang-link:hover,
|
||||
.lang-switcher .lang-link:focus-visible {
|
||||
color: #C8A851;
|
||||
outline: none;
|
||||
}
|
||||
|
||||
.lang-switcher .lang-sep {
|
||||
color: #5A6478;
|
||||
opacity: 0.4;
|
||||
}
|
||||
|
||||
/* Dark variant for the lagebild pages (dark navbar) */
|
||||
.lagebild-page .lang-switcher .lang-link,
|
||||
.lang-switcher.lang-switcher-dark .lang-link {
|
||||
color: rgba(255, 255, 255, 0.7);
|
||||
}
|
||||
|
||||
.lagebild-page .lang-switcher .lang-link:hover,
|
||||
.lagebild-page .lang-switcher .lang-link:focus-visible,
|
||||
.lang-switcher.lang-switcher-dark .lang-link:hover,
|
||||
.lang-switcher.lang-switcher-dark .lang-link:focus-visible {
|
||||
color: #C8A851;
|
||||
}
|
||||
|
||||
.lagebild-page .lang-switcher .lang-sep,
|
||||
.lang-switcher.lang-switcher-dark .lang-sep {
|
||||
color: rgba(255, 255, 255, 0.5);
|
||||
}
|
||||
|
||||
/* Inside mobile menus: full-width row with separator on top */
|
||||
.mobile-menu .lang-switcher,
|
||||
.nav-menu-mobile .lang-switcher {
|
||||
margin-top: 1rem;
|
||||
padding-top: 1rem;
|
||||
border-top: 1px solid rgba(0, 0, 0, 0.08);
|
||||
font-size: 1rem;
|
||||
justify-content: center;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.lagebild-page .nav-menu-mobile .lang-switcher {
|
||||
border-top-color: rgba(255, 255, 255, 0.12);
|
||||
}
|
||||
270
css/main.css
@@ -1,14 +1,64 @@
|
||||
/* Global Styles - Rheinmetall Design */
|
||||
/* Global Styles - AegisSight Corporate Design */
|
||||
:root {
|
||||
--primary-blue: #0f72b5;
|
||||
--dark-blue: #00406e;
|
||||
--light-gray: #f4f4f4;
|
||||
--white: #FFFFFF;
|
||||
--text-dark: #333333;
|
||||
--text-gray: #666666;
|
||||
--border-gray: #e0e0e0;
|
||||
/* Primärfarben (Logo) */
|
||||
--color-navy: #0A1832;
|
||||
--color-gold: #C8A851;
|
||||
--color-gold-light: #D4B96A;
|
||||
--color-gold-dark: #B39645;
|
||||
|
||||
/* Navy-Abstufungen */
|
||||
--color-navy-light: #132844;
|
||||
--color-navy-dark: #060F20;
|
||||
|
||||
/* Blau-Akzent (abgeleitet von Navy, für Links/Buttons) */
|
||||
--color-blue: #0f72b5;
|
||||
--color-blue-hover: #0d62a0;
|
||||
|
||||
/* Neutrale Farben */
|
||||
--color-white: #FFFFFF;
|
||||
--color-gray-50: #F8FAFB;
|
||||
--color-gray-100: #f4f4f4;
|
||||
--color-gray-200: #e0e0e0;
|
||||
--color-gray-600: #666666;
|
||||
--color-gray-800: #333333;
|
||||
|
||||
/* Spacing-System (8px-Grid) */
|
||||
--space-xs: 8px;
|
||||
--space-sm: 16px;
|
||||
--space-md: 24px;
|
||||
--space-lg: 32px;
|
||||
--space-xl: 48px;
|
||||
--space-2xl: 64px;
|
||||
--space-3xl: 80px;
|
||||
--space-4xl: 96px;
|
||||
|
||||
/* Border-Radius-System */
|
||||
--radius-sm: 4px;
|
||||
--radius-md: 8px;
|
||||
--radius-lg: 16px;
|
||||
--radius-xl: 24px;
|
||||
--radius-pill: 100px;
|
||||
|
||||
/* Z-Index-Skala */
|
||||
--z-content: 1;
|
||||
--z-sticky: 100;
|
||||
--z-overlay: 1000;
|
||||
--z-modal: 9000;
|
||||
--z-cookie: 10000;
|
||||
|
||||
/* Shadows */
|
||||
--shadow: 0 2px 8px rgba(0,0,0,0.1);
|
||||
--shadow-hover: 0 8px 24px rgba(0,0,0,0.15);
|
||||
|
||||
/* Legacy Aliases (für Rückwärtskompatibilität) */
|
||||
--primary-blue: var(--color-blue);
|
||||
--dark-blue: var(--color-blue-hover);
|
||||
--accent-gold: var(--color-gold);
|
||||
--light-gray: var(--color-gray-100);
|
||||
--white: var(--color-white);
|
||||
--text-dark: var(--color-gray-800);
|
||||
--text-gray: var(--color-gray-600);
|
||||
--border-gray: var(--color-gray-200);
|
||||
}
|
||||
|
||||
* {
|
||||
@@ -24,9 +74,9 @@
|
||||
}
|
||||
|
||||
body {
|
||||
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif;
|
||||
background-color: var(--white);
|
||||
color: var(--text-dark);
|
||||
font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
|
||||
background-color: var(--color-navy);
|
||||
color: var(--color-gray-800);
|
||||
line-height: 1.6;
|
||||
overflow-x: hidden;
|
||||
}
|
||||
@@ -55,7 +105,11 @@ h6 { font-size: 1.1rem; }
|
||||
font-size: 2.5rem;
|
||||
text-align: center;
|
||||
margin-bottom: 1rem;
|
||||
color: var(--primary-blue);
|
||||
color: var(--color-navy);
|
||||
}
|
||||
|
||||
#about .section-title {
|
||||
color: var(--color-navy);
|
||||
}
|
||||
|
||||
.section-subtitle {
|
||||
@@ -90,7 +144,7 @@ h6 { font-size: 1.1rem; }
|
||||
backdrop-filter: blur(10px);
|
||||
-webkit-backdrop-filter: blur(10px);
|
||||
box-shadow: 0 1px 0 rgba(0,0,0,0.1);
|
||||
z-index: 1000;
|
||||
z-index: var(--z-overlay);
|
||||
transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
|
||||
}
|
||||
|
||||
@@ -111,6 +165,9 @@ h6 { font-size: 1.1rem; }
|
||||
.logo-img {
|
||||
height: 50px;
|
||||
width: auto;
|
||||
max-width: 100%;
|
||||
display: block;
|
||||
object-fit: contain;
|
||||
}
|
||||
|
||||
.nav-menu {
|
||||
@@ -122,7 +179,7 @@ h6 { font-size: 1.1rem; }
|
||||
}
|
||||
|
||||
.nav-menu a {
|
||||
color: #001f3f;
|
||||
color: var(--color-navy);
|
||||
text-decoration: none;
|
||||
font-weight: 700;
|
||||
font-size: 1.1rem;
|
||||
@@ -134,7 +191,7 @@ h6 { font-size: 1.1rem; }
|
||||
}
|
||||
|
||||
.nav-menu a:hover {
|
||||
color: var(--primary-blue);
|
||||
color: var(--color-navy);
|
||||
transform: translateY(-2px);
|
||||
}
|
||||
|
||||
@@ -145,7 +202,7 @@ h6 { font-size: 1.1rem; }
|
||||
left: 0;
|
||||
width: 0;
|
||||
height: 2px;
|
||||
background: var(--primary-blue);
|
||||
background: var(--color-navy);
|
||||
transition: width 0.3s ease;
|
||||
}
|
||||
|
||||
@@ -161,10 +218,10 @@ h6 { font-size: 1.1rem; }
|
||||
|
||||
.lang-toggle {
|
||||
background: transparent;
|
||||
border: 1px solid var(--border-gray);
|
||||
color: #001f3f;
|
||||
border: 1px solid var(--color-gray-200);
|
||||
color: var(--color-navy);
|
||||
padding: 0.5rem 1rem;
|
||||
border-radius: 4px;
|
||||
border-radius: var(--radius-md);
|
||||
cursor: pointer;
|
||||
transition: all 0.3s ease;
|
||||
font-size: 0.9rem;
|
||||
@@ -184,7 +241,7 @@ h6 { font-size: 1.1rem; }
|
||||
.secondary-button {
|
||||
padding: 0.75rem 1.5rem;
|
||||
border: none;
|
||||
border-radius: 4px;
|
||||
border-radius: var(--radius-md);
|
||||
font-weight: 500;
|
||||
cursor: pointer;
|
||||
transition: all 0.3s ease;
|
||||
@@ -254,7 +311,7 @@ h6 { font-size: 1.1rem; }
|
||||
justify-content: center;
|
||||
position: relative;
|
||||
padding-top: 100px;
|
||||
background: #000000;
|
||||
background: var(--color-navy);
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
@@ -266,7 +323,7 @@ h6 { font-size: 1.1rem; }
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
z-index: 1;
|
||||
background: #000000;
|
||||
background: var(--color-navy);
|
||||
}
|
||||
|
||||
/* Hero Videos */
|
||||
@@ -344,12 +401,14 @@ h6 { font-size: 1.1rem; }
|
||||
|
||||
.main-title {
|
||||
display: block;
|
||||
font-family: 'Bebas Neue', sans-serif;
|
||||
font-size: clamp(3rem, 8vw, 7rem);
|
||||
color: var(--white);
|
||||
font-weight: 700;
|
||||
color: var(--color-white);
|
||||
font-weight: 400;
|
||||
margin-bottom: 1rem;
|
||||
line-height: 1.1;
|
||||
text-align: left;
|
||||
letter-spacing: 2px;
|
||||
}
|
||||
|
||||
.hero-text {
|
||||
@@ -387,42 +446,10 @@ h6 { font-size: 1.1rem; }
|
||||
color: var(--primary-blue);
|
||||
}
|
||||
|
||||
.trust-indicators {
|
||||
position: absolute;
|
||||
bottom: 50px;
|
||||
left: 50%;
|
||||
transform: translateX(-50%);
|
||||
display: flex;
|
||||
gap: 4rem;
|
||||
z-index: 3;
|
||||
background: rgba(0, 0, 0, 0.3);
|
||||
backdrop-filter: blur(10px);
|
||||
-webkit-backdrop-filter: blur(10px);
|
||||
padding: 1.5rem 3rem;
|
||||
border-radius: 100px;
|
||||
border: 1px solid rgba(255, 255, 255, 0.1);
|
||||
}
|
||||
|
||||
.indicator {
|
||||
text-align: center;
|
||||
color: var(--white);
|
||||
}
|
||||
|
||||
.indicator-value {
|
||||
font-size: 2.5rem;
|
||||
font-weight: 700;
|
||||
display: block;
|
||||
}
|
||||
|
||||
.indicator-label {
|
||||
font-size: 0.9rem;
|
||||
opacity: 0.9;
|
||||
}
|
||||
|
||||
/* About Section */
|
||||
.about-section {
|
||||
padding: 80px 0;
|
||||
background: var(--white);
|
||||
padding: var(--space-4xl) 0;
|
||||
background: var(--color-white);
|
||||
}
|
||||
|
||||
.about-tabs {
|
||||
@@ -503,12 +530,23 @@ h6 { font-size: 1.1rem; }
|
||||
border-radius: 4px;
|
||||
margin-top: 1rem;
|
||||
color: var(--text-dark);
|
||||
transition: all 0.3s ease;
|
||||
}
|
||||
|
||||
.location-badge svg {
|
||||
.location-badge:hover {
|
||||
background: var(--dark-blue);
|
||||
color: var(--white);
|
||||
}
|
||||
|
||||
.location-badge img {
|
||||
width: 20px;
|
||||
height: 20px;
|
||||
color: var(--primary-blue);
|
||||
filter: brightness(0) saturate(100%) invert(42%) sepia(82%) saturate(723%) hue-rotate(178deg) brightness(98%) contrast(92%);
|
||||
transition: filter 0.3s ease;
|
||||
}
|
||||
|
||||
.location-badge:hover img {
|
||||
filter: brightness(0) saturate(100%) invert(100%) sepia(0%) saturate(0%) hue-rotate(0deg) brightness(100%) contrast(100%);
|
||||
}
|
||||
|
||||
.shield-animation {
|
||||
@@ -540,9 +578,9 @@ h6 { font-size: 1.1rem; }
|
||||
}
|
||||
|
||||
.value-card {
|
||||
background: var(--light-gray);
|
||||
border-radius: 12px;
|
||||
padding: 2rem;
|
||||
background: var(--color-gray-100);
|
||||
border-radius: var(--radius-lg);
|
||||
padding: var(--space-lg);
|
||||
transition: all 0.4s cubic-bezier(0.34, 1.56, 0.64, 1);
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
@@ -571,9 +609,9 @@ h6 { font-size: 1.1rem; }
|
||||
}
|
||||
|
||||
.value-card:hover {
|
||||
transform: translateY(-8px) scale(1.02);
|
||||
box-shadow: 0 15px 40px rgba(15, 114, 181, 0.2);
|
||||
background: linear-gradient(135deg, var(--light-gray) 0%, rgba(15, 114, 181, 0.05) 100%);
|
||||
transform: translateY(-4px);
|
||||
box-shadow: 0 12px 24px rgba(10, 24, 50, 0.12);
|
||||
background: linear-gradient(135deg, var(--color-gray-100) 0%, rgba(10, 24, 50, 0.03) 100%);
|
||||
}
|
||||
|
||||
.value-icon {
|
||||
@@ -634,7 +672,7 @@ h6 { font-size: 1.1rem; }
|
||||
margin-bottom: 0.5rem;
|
||||
}
|
||||
|
||||
/* Why IntelSight */
|
||||
/* Why AegisSight */
|
||||
.why-grid {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(2, 1fr);
|
||||
@@ -642,10 +680,10 @@ h6 { font-size: 1.1rem; }
|
||||
}
|
||||
|
||||
.why-card {
|
||||
background: var(--white);
|
||||
border: 1px solid var(--border-gray);
|
||||
border-radius: 12px;
|
||||
padding: 2rem;
|
||||
background: var(--color-white);
|
||||
border: 1px solid var(--color-gray-200);
|
||||
border-radius: var(--radius-lg);
|
||||
padding: var(--space-lg);
|
||||
transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
|
||||
box-shadow: 0 2px 10px rgba(0,0,0,0.05);
|
||||
position: relative;
|
||||
@@ -668,10 +706,10 @@ h6 { font-size: 1.1rem; }
|
||||
}
|
||||
|
||||
.why-card:hover {
|
||||
transform: translateY(-8px) scale(1.02);
|
||||
box-shadow: 0 15px 35px rgba(15, 114, 181, 0.15);
|
||||
border-color: var(--primary-blue);
|
||||
background: linear-gradient(135deg, var(--white) 0%, rgba(15, 114, 181, 0.02) 100%);
|
||||
transform: translateY(-4px);
|
||||
box-shadow: 0 12px 24px rgba(10, 24, 50, 0.12);
|
||||
border-color: var(--color-navy);
|
||||
background: linear-gradient(135deg, var(--color-white) 0%, rgba(10, 24, 50, 0.02) 100%);
|
||||
}
|
||||
|
||||
.why-card:hover .why-icon {
|
||||
@@ -702,8 +740,8 @@ h6 { font-size: 1.1rem; }
|
||||
|
||||
/* Products Section */
|
||||
.products-section {
|
||||
padding: 80px 0;
|
||||
background: var(--light-gray);
|
||||
padding: var(--space-4xl) 0;
|
||||
background: var(--color-gray-100);
|
||||
}
|
||||
|
||||
.product-showcase {
|
||||
@@ -780,10 +818,10 @@ h6 { font-size: 1.1rem; }
|
||||
}
|
||||
|
||||
.tool-card {
|
||||
background: var(--light-gray);
|
||||
border-radius: 12px;
|
||||
padding: 2rem;
|
||||
transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
|
||||
background: var(--color-gray-100);
|
||||
border-radius: var(--radius-lg);
|
||||
padding: var(--space-lg);
|
||||
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
|
||||
cursor: pointer;
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
@@ -807,10 +845,10 @@ h6 { font-size: 1.1rem; }
|
||||
}
|
||||
|
||||
.tool-card:hover {
|
||||
transform: translateY(-10px) rotateX(5deg) scale(1.02);
|
||||
box-shadow: 0 20px 40px rgba(15, 114, 181, 0.25);
|
||||
border-color: rgba(15, 114, 181, 0.3);
|
||||
background: linear-gradient(135deg, var(--white) 0%, var(--light-gray) 100%);
|
||||
transform: translateY(-4px);
|
||||
box-shadow: 0 12px 24px rgba(10, 24, 50, 0.15);
|
||||
border-color: rgba(10, 24, 50, 0.2);
|
||||
background: linear-gradient(135deg, var(--color-white) 0%, var(--color-gray-100) 100%);
|
||||
}
|
||||
|
||||
.tool-card:hover .tool-icon {
|
||||
@@ -907,8 +945,8 @@ h6 { font-size: 1.1rem; }
|
||||
|
||||
/* Contact Section */
|
||||
.contact-section {
|
||||
padding: 80px 0;
|
||||
background: var(--white);
|
||||
padding: var(--space-4xl) 0;
|
||||
background: var(--color-white);
|
||||
}
|
||||
|
||||
.contact-grid {
|
||||
@@ -941,11 +979,11 @@ h6 { font-size: 1.1rem; }
|
||||
|
||||
.form-group input,
|
||||
.form-group textarea {
|
||||
background: var(--white);
|
||||
border: 1px solid var(--border-gray);
|
||||
color: var(--text-dark);
|
||||
background: var(--color-white);
|
||||
border: 1px solid var(--color-gray-200);
|
||||
color: var(--color-gray-800);
|
||||
padding: 0.75rem;
|
||||
border-radius: 4px;
|
||||
border-radius: var(--radius-md);
|
||||
transition: all 0.3s ease;
|
||||
font-family: inherit;
|
||||
}
|
||||
@@ -1126,8 +1164,8 @@ h6 { font-size: 1.1rem; }
|
||||
|
||||
/* Legal Section */
|
||||
.legal-section {
|
||||
padding: 80px 0;
|
||||
background: var(--light-gray);
|
||||
padding: var(--space-4xl) 0;
|
||||
background: var(--color-gray-100);
|
||||
}
|
||||
|
||||
.legal-grid {
|
||||
@@ -1137,9 +1175,9 @@ h6 { font-size: 1.1rem; }
|
||||
}
|
||||
|
||||
.legal-card {
|
||||
background: var(--white);
|
||||
border-radius: 8px;
|
||||
padding: 2rem;
|
||||
background: var(--color-white);
|
||||
border-radius: var(--radius-lg);
|
||||
padding: var(--space-lg);
|
||||
box-shadow: var(--shadow);
|
||||
}
|
||||
|
||||
@@ -1164,8 +1202,8 @@ h6 { font-size: 1.1rem; }
|
||||
|
||||
/* Footer */
|
||||
.footer {
|
||||
background: #0a0f1c;
|
||||
color: var(--white);
|
||||
background: var(--color-navy-dark);
|
||||
color: var(--color-white);
|
||||
padding: 3rem 0 1rem;
|
||||
}
|
||||
|
||||
@@ -1197,7 +1235,7 @@ h6 { font-size: 1.1rem; }
|
||||
}
|
||||
|
||||
.footer-section a:hover {
|
||||
color: var(--white);
|
||||
color: var(--color-gold);
|
||||
}
|
||||
|
||||
.copyright {
|
||||
@@ -1217,11 +1255,6 @@ h6 { font-size: 1.1rem; }
|
||||
font-size: 2rem;
|
||||
}
|
||||
|
||||
.trust-indicators {
|
||||
flex-direction: column;
|
||||
gap: 1rem;
|
||||
}
|
||||
|
||||
.about-tabs {
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
@@ -1452,12 +1485,12 @@ h6 { font-size: 1.1rem; }
|
||||
.scroll-arrow {
|
||||
width: 32px;
|
||||
height: 32px;
|
||||
color: #ffffff;
|
||||
color: #0A1832;
|
||||
animation: bounceArrow 2s infinite;
|
||||
background: rgba(15, 114, 181, 0.2);
|
||||
background: rgba(10, 24, 50, 0.15);
|
||||
border-radius: 50%;
|
||||
padding: 4px;
|
||||
box-shadow: 0 4px 12px rgba(15, 114, 181, 0.3);
|
||||
box-shadow: 0 4px 12px rgba(10, 24, 50, 0.3);
|
||||
}
|
||||
|
||||
.scroll-arrow svg {
|
||||
@@ -1493,4 +1526,25 @@ h6 { font-size: 1.1rem; }
|
||||
.mb-1 { margin-bottom: 0.5rem; }
|
||||
.mb-2 { margin-bottom: 1rem; }
|
||||
.mb-3 { margin-bottom: 1.5rem; }
|
||||
.mb-4 { margin-bottom: 2rem; }
|
||||
.mb-4 { margin-bottom: 2rem; }
|
||||
/* Hide mobile menu button on desktop */
|
||||
.mobile-menu-toggle {
|
||||
display: none;
|
||||
}
|
||||
|
||||
/* Ensure mobile menu is hidden by default */
|
||||
.nav-menu-mobile,
|
||||
.mobile-menu-overlay {
|
||||
display: none;
|
||||
}
|
||||
|
||||
/* Show only on mobile screens */
|
||||
@media screen and (max-width: 768px) {
|
||||
.mobile-menu-toggle {
|
||||
display: block;
|
||||
}
|
||||
|
||||
.nav-menu-mobile {
|
||||
display: block;
|
||||
}
|
||||
}
|
||||
|
||||
539
css/mobile.css
Normale Datei
@@ -0,0 +1,539 @@
|
||||
/* Mobile Responsive Styles - AegisSight */
|
||||
/* Mobile-First Approach with Progressive Enhancement */
|
||||
|
||||
/* Base Mobile Styles (320px and up) */
|
||||
@media screen and (max-width: 480px) {
|
||||
/* Typography Scaling */
|
||||
html {
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
body {
|
||||
overflow-x: hidden;
|
||||
}
|
||||
|
||||
/* Hero Section Mobile */
|
||||
.hero {
|
||||
min-height: 100vh;
|
||||
padding: 1rem;
|
||||
}
|
||||
|
||||
.hero-title .main-title {
|
||||
font-size: 2rem;
|
||||
line-height: 1.2;
|
||||
word-break: break-word;
|
||||
}
|
||||
|
||||
.hero-text {
|
||||
font-size: 1rem;
|
||||
padding: 0 1rem;
|
||||
}
|
||||
|
||||
/* Keep videos on mobile but optimize */
|
||||
.hero-video-container {
|
||||
display: block;
|
||||
}
|
||||
|
||||
.hero-video {
|
||||
object-fit: cover;
|
||||
}
|
||||
|
||||
/* Navigation Mobile */
|
||||
.navbar {
|
||||
padding: 0.5rem 1rem;
|
||||
}
|
||||
|
||||
.nav-container {
|
||||
justify-content: space-between;
|
||||
}
|
||||
|
||||
.logo-img {
|
||||
max-width: 120px;
|
||||
height: auto;
|
||||
}
|
||||
|
||||
/* Hide desktop menu */
|
||||
.nav-menu {
|
||||
display: none;
|
||||
}
|
||||
|
||||
/* Mobile Menu Styles */
|
||||
.mobile-menu-toggle {
|
||||
display: block;
|
||||
background: none;
|
||||
border: none;
|
||||
cursor: pointer;
|
||||
padding: 0.5rem;
|
||||
z-index: 1001;
|
||||
}
|
||||
|
||||
.hamburger {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 4px;
|
||||
}
|
||||
|
||||
.hamburger span {
|
||||
display: block;
|
||||
width: 25px;
|
||||
height: 3px;
|
||||
background: var(--color-navy, #0A1832);
|
||||
transition: all 0.3s ease;
|
||||
}
|
||||
|
||||
/* Hamburger Animation */
|
||||
.mobile-menu-toggle.active .hamburger span:nth-child(1) {
|
||||
transform: rotate(45deg) translate(5px, 5px);
|
||||
}
|
||||
|
||||
.mobile-menu-toggle.active .hamburger span:nth-child(2) {
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
.mobile-menu-toggle.active .hamburger span:nth-child(3) {
|
||||
transform: rotate(-45deg) translate(7px, -6px);
|
||||
}
|
||||
|
||||
/* Mobile Navigation Menu */
|
||||
.nav-menu-mobile {
|
||||
position: fixed;
|
||||
top: 0;
|
||||
right: -100%;
|
||||
width: 80%;
|
||||
max-width: 300px;
|
||||
height: 100vh;
|
||||
background: rgba(10, 24, 50, 0.98);
|
||||
backdrop-filter: blur(10px);
|
||||
transition: right 0.3s ease;
|
||||
z-index: 1000;
|
||||
padding: 4rem 2rem 2rem;
|
||||
overflow-y: auto;
|
||||
}
|
||||
|
||||
/* Close button inside mobile menu */
|
||||
.mobile-menu-close {
|
||||
position: absolute;
|
||||
top: 1rem;
|
||||
right: 1rem;
|
||||
background: none;
|
||||
border: none;
|
||||
cursor: pointer;
|
||||
padding: 0.5rem;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
width: 40px;
|
||||
height: 40px;
|
||||
border-radius: 50%;
|
||||
transition: background 0.3s ease;
|
||||
}
|
||||
|
||||
.mobile-menu-close:hover {
|
||||
background: rgba(200, 168, 81, 0.15);
|
||||
}
|
||||
|
||||
.mobile-menu-close svg {
|
||||
width: 24px;
|
||||
height: 24px;
|
||||
stroke: var(--color-white, #fff);
|
||||
stroke-width: 2;
|
||||
}
|
||||
|
||||
.nav-menu-mobile.active {
|
||||
right: 0;
|
||||
}
|
||||
|
||||
.nav-menu-mobile ul {
|
||||
list-style: none;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.nav-menu-mobile li {
|
||||
margin-bottom: 1.5rem;
|
||||
}
|
||||
|
||||
.nav-menu-mobile a {
|
||||
color: #fff;
|
||||
text-decoration: none;
|
||||
font-size: 1.2rem;
|
||||
display: block;
|
||||
padding: 0.5rem 0;
|
||||
transition: color 0.3s ease;
|
||||
}
|
||||
|
||||
.nav-menu-mobile a:hover {
|
||||
color: var(--color-gold, #C8A851);
|
||||
}
|
||||
|
||||
/* Mobile Overlay */
|
||||
.mobile-menu-overlay {
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background: rgba(0, 0, 0, 0.5);
|
||||
opacity: 0;
|
||||
visibility: hidden;
|
||||
transition: all 0.3s ease;
|
||||
z-index: 999;
|
||||
}
|
||||
|
||||
.mobile-menu-overlay.active {
|
||||
opacity: 1;
|
||||
visibility: visible;
|
||||
}
|
||||
|
||||
/* Sections Mobile */
|
||||
.section-title {
|
||||
font-size: 1.75rem;
|
||||
}
|
||||
|
||||
.section-subtitle {
|
||||
font-size: 1rem;
|
||||
}
|
||||
|
||||
/* Cards and Grids Mobile */
|
||||
.tool-grid {
|
||||
grid-template-columns: 1fr;
|
||||
gap: 1rem;
|
||||
padding: 1rem;
|
||||
}
|
||||
|
||||
.tool-card {
|
||||
padding: 1.5rem;
|
||||
}
|
||||
|
||||
/* Buttons Mobile - Touch Friendly */
|
||||
button,
|
||||
.btn,
|
||||
.cta-button,
|
||||
.lang-toggle {
|
||||
min-height: 44px;
|
||||
min-width: 44px;
|
||||
padding: 0.75rem 1.5rem;
|
||||
}
|
||||
|
||||
/* About Tabs Mobile */
|
||||
.about-tabs {
|
||||
flex-direction: column;
|
||||
gap: 0.5rem;
|
||||
}
|
||||
|
||||
.about-tab {
|
||||
width: 100%;
|
||||
padding: 0.75rem;
|
||||
font-size: 0.9rem;
|
||||
}
|
||||
|
||||
/* Products Section Mobile */
|
||||
.products-grid {
|
||||
grid-template-columns: 1fr;
|
||||
padding: 1rem;
|
||||
gap: 1.5rem;
|
||||
}
|
||||
|
||||
.product-card {
|
||||
padding: 1.5rem;
|
||||
}
|
||||
|
||||
/* Product header mobile - override grid to stack icon above text */
|
||||
.product-header {
|
||||
display: flex !important;
|
||||
flex-direction: column !important;
|
||||
grid-template-columns: none !important;
|
||||
padding: 1.5rem !important;
|
||||
text-align: center;
|
||||
align-items: center;
|
||||
gap: 1rem;
|
||||
}
|
||||
|
||||
.product-icon-wrapper {
|
||||
margin-bottom: 0.5rem;
|
||||
}
|
||||
|
||||
.product-title-wrapper {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 0.25rem;
|
||||
align-items: center;
|
||||
width: 100%;
|
||||
text-align: center !important;
|
||||
}
|
||||
|
||||
.product-title {
|
||||
font-size: 1.1rem;
|
||||
line-height: 1.2;
|
||||
margin: 0;
|
||||
text-align: center !important;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.product-tagline {
|
||||
font-size: 0.75rem;
|
||||
margin: 0;
|
||||
line-height: 1.2;
|
||||
text-align: center !important;
|
||||
width: 100%;
|
||||
white-space: normal;
|
||||
}
|
||||
|
||||
/* Specific fix for AccountForger tagline */
|
||||
.product-card:nth-child(2) .product-tagline {
|
||||
display: block;
|
||||
margin: 0 auto;
|
||||
white-space: nowrap; /* Verhindert Umbruch innerhalb der Zeilen */
|
||||
}
|
||||
|
||||
/* Force line break only after "mit" */
|
||||
.product-card:nth-child(2) .product-tagline::before {
|
||||
content: "Zugang nur mit\A Berechtigung";
|
||||
white-space: pre-line;
|
||||
}
|
||||
|
||||
/* Hide original text */
|
||||
.product-card:nth-child(2) .product-tagline {
|
||||
font-size: 0;
|
||||
}
|
||||
|
||||
.product-card:nth-child(2) .product-tagline::before {
|
||||
font-size: 0.75rem;
|
||||
}
|
||||
|
||||
/* Footer Mobile */
|
||||
.footer-content {
|
||||
flex-direction: column;
|
||||
text-align: center;
|
||||
gap: 2rem;
|
||||
}
|
||||
|
||||
.footer-links {
|
||||
flex-direction: column;
|
||||
gap: 1rem;
|
||||
}
|
||||
|
||||
/* About Section - Company Cards Mobile Fix */
|
||||
.company-cards-wrapper {
|
||||
width: 100% !important;
|
||||
flex-direction: column;
|
||||
gap: 1.5rem;
|
||||
}
|
||||
|
||||
.company-card {
|
||||
width: 100%;
|
||||
padding: 1.5rem !important;
|
||||
}
|
||||
|
||||
.company-card h4 {
|
||||
font-size: 1.1rem;
|
||||
}
|
||||
|
||||
.company-card p {
|
||||
font-size: 0.9rem;
|
||||
line-height: 1.6;
|
||||
}
|
||||
|
||||
/* About panel layout mobile */
|
||||
.about-panel {
|
||||
padding: 1rem;
|
||||
}
|
||||
|
||||
.panel-text {
|
||||
max-width: 100%;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
/* Location section mobile - move to bottom */
|
||||
.location-section {
|
||||
width: 100% !important;
|
||||
margin-left: 0 !important;
|
||||
margin-top: 2rem;
|
||||
order: 2; /* Move to bottom */
|
||||
height: auto !important;
|
||||
padding: 1.5rem;
|
||||
background: rgba(10, 15, 28, 0.05);
|
||||
border-radius: 20px;
|
||||
}
|
||||
|
||||
.company-cards-wrapper {
|
||||
order: 1; /* Keep at top */
|
||||
}
|
||||
|
||||
.mini-germany-map {
|
||||
max-width: 150px;
|
||||
margin-bottom: 1rem;
|
||||
}
|
||||
|
||||
.mini-germany-map img {
|
||||
width: 100%;
|
||||
height: auto;
|
||||
}
|
||||
|
||||
.location-badge {
|
||||
font-size: 0.9rem;
|
||||
padding: 0.5rem 1rem;
|
||||
}
|
||||
}
|
||||
|
||||
/* Tablet Styles (481px - 768px) */
|
||||
@media screen and (min-width: 481px) and (max-width: 768px) {
|
||||
/* Typography */
|
||||
html {
|
||||
font-size: 15px;
|
||||
}
|
||||
|
||||
|
||||
.hero-title .main-title {
|
||||
font-size: 2.5rem;
|
||||
}
|
||||
|
||||
/* Videos already visible from mobile */
|
||||
|
||||
/* Tool Grid - 2 columns */
|
||||
.tool-grid {
|
||||
grid-template-columns: repeat(2, 1fr);
|
||||
}
|
||||
|
||||
/* About Tabs - Horizontal with wrap */
|
||||
.about-tabs {
|
||||
flex-direction: row;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
|
||||
.about-tab {
|
||||
flex: 1 1 calc(50% - 0.5rem);
|
||||
}
|
||||
}
|
||||
|
||||
/* Small Desktop (769px - 1024px) */
|
||||
@media screen and (min-width: 769px) and (max-width: 1024px) {
|
||||
/* Container widths */
|
||||
.container {
|
||||
max-width: 960px;
|
||||
padding: 0 2rem;
|
||||
}
|
||||
|
||||
/* Navigation adjustments */
|
||||
.nav-menu {
|
||||
gap: 1.5rem;
|
||||
}
|
||||
|
||||
.nav-menu a {
|
||||
font-size: 0.9rem;
|
||||
}
|
||||
|
||||
/* Grid adjustments */
|
||||
.tool-grid {
|
||||
grid-template-columns: repeat(3, 1fr);
|
||||
}
|
||||
|
||||
.products-grid {
|
||||
grid-template-columns: repeat(2, 1fr);
|
||||
}
|
||||
}
|
||||
|
||||
/* Touch Device Optimizations */
|
||||
@media (hover: none) and (pointer: coarse) {
|
||||
/* Remove hover effects on touch devices */
|
||||
.tool-card:hover,
|
||||
.product-card:hover {
|
||||
transform: none;
|
||||
}
|
||||
|
||||
/* Larger touch targets */
|
||||
a, button {
|
||||
min-height: 44px;
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
}
|
||||
}
|
||||
|
||||
/* Landscape Mobile Optimization */
|
||||
@media screen and (max-width: 768px) and (orientation: landscape) {
|
||||
.hero {
|
||||
min-height: auto;
|
||||
padding: 2rem 1rem;
|
||||
}
|
||||
|
||||
.hero-title .main-title {
|
||||
font-size: 1.75rem;
|
||||
}
|
||||
}
|
||||
|
||||
/* High Resolution Mobile Displays */
|
||||
@media screen and (max-width: 480px) and (-webkit-min-device-pixel-ratio: 2) {
|
||||
/* Sharper borders and shadows */
|
||||
.tool-card,
|
||||
.product-card {
|
||||
border: 0.5px solid rgba(255, 255, 255, 0.1);
|
||||
}
|
||||
}
|
||||
|
||||
/* Performance Optimizations for Mobile */
|
||||
@media screen and (max-width: 768px) {
|
||||
/* Disable complex animations on mobile */
|
||||
.animate-in,
|
||||
.stagger-1,
|
||||
.stagger-2,
|
||||
.stagger-3 {
|
||||
animation: none !important;
|
||||
opacity: 1 !important;
|
||||
transform: none !important;
|
||||
}
|
||||
|
||||
/* Reduce particle effects */
|
||||
#particleCanvas {
|
||||
display: none;
|
||||
}
|
||||
|
||||
/* Optimize images */
|
||||
img {
|
||||
image-rendering: -webkit-optimize-contrast;
|
||||
}
|
||||
}
|
||||
|
||||
/* Tablet and Small Desktop (768px - 1024px) */
|
||||
@media screen and (min-width: 768px) and (max-width: 1024px) {
|
||||
/* Navigation adjustments for tablets */
|
||||
.nav-container {
|
||||
padding: 1rem;
|
||||
}
|
||||
|
||||
/* Keep centered logo but adjust size */
|
||||
.logo-img {
|
||||
height: 50px;
|
||||
}
|
||||
|
||||
/* Adjust menu spacing */
|
||||
.nav-menu {
|
||||
gap: 1.5rem;
|
||||
}
|
||||
|
||||
.nav-menu a {
|
||||
font-size: 1rem;
|
||||
}
|
||||
|
||||
/* Language toggle smaller on tablets */
|
||||
.lang-toggle {
|
||||
padding: 0.4rem 0.8rem;
|
||||
font-size: 0.85rem;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Print Styles */
|
||||
@media print {
|
||||
.navbar,
|
||||
.hero-video-container,
|
||||
.scroll-indicator,
|
||||
.mobile-menu-toggle {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
body {
|
||||
background: white;
|
||||
color: black;
|
||||
}
|
||||
}
|
||||
@@ -1,496 +0,0 @@
|
||||
/* Modern Products Section Design */
|
||||
|
||||
.products-section {
|
||||
background: #001f3f;
|
||||
position: relative;
|
||||
padding: 120px 0;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
/* Animated Background */
|
||||
.products-section::before {
|
||||
content: '';
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
background:
|
||||
radial-gradient(circle at 20% 50%, rgba(15, 114, 181, 0.1) 0%, transparent 50%),
|
||||
radial-gradient(circle at 80% 50%, rgba(0, 64, 110, 0.1) 0%, transparent 50%),
|
||||
radial-gradient(circle at 50% 100%, rgba(15, 114, 181, 0.05) 0%, transparent 50%);
|
||||
animation: backgroundShift 20s ease-in-out infinite;
|
||||
}
|
||||
|
||||
@keyframes backgroundShift {
|
||||
0%, 100% { transform: translate(0, 0) scale(1); }
|
||||
33% { transform: translate(-20px, -20px) scale(1.1); }
|
||||
66% { transform: translate(20px, -10px) scale(0.95); }
|
||||
}
|
||||
|
||||
/* Section Title */
|
||||
.products-section .section-title {
|
||||
color: #ffffff;
|
||||
font-size: 3.5rem;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 3px;
|
||||
margin-bottom: 20px;
|
||||
position: relative;
|
||||
display: inline-block;
|
||||
animation: titleGlow 3s ease-in-out infinite;
|
||||
}
|
||||
|
||||
@keyframes titleGlow {
|
||||
0%, 100% { text-shadow: 0 0 20px rgba(15, 114, 181, 0.5); }
|
||||
50% { text-shadow: 0 0 40px rgba(15, 114, 181, 0.8), 0 0 60px rgba(15, 114, 181, 0.4); }
|
||||
}
|
||||
|
||||
.products-section .section-subtitle {
|
||||
color: rgba(255, 255, 255, 0.7);
|
||||
font-size: 1.3rem;
|
||||
margin-bottom: 80px;
|
||||
}
|
||||
|
||||
/* Products Container */
|
||||
.products-container {
|
||||
max-width: 1400px;
|
||||
margin: 0 auto;
|
||||
padding: 0 20px;
|
||||
position: relative;
|
||||
z-index: 2;
|
||||
}
|
||||
|
||||
/* Products Grid */
|
||||
.products-grid {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
gap: 30px;
|
||||
margin-bottom: 60px;
|
||||
}
|
||||
|
||||
/* Product Card */
|
||||
.product-card {
|
||||
background: linear-gradient(135deg, rgba(255, 255, 255, 0.95), rgba(245, 245, 245, 0.95));
|
||||
border: 1px solid rgba(15, 114, 181, 0.3);
|
||||
border-radius: 20px;
|
||||
padding: 0;
|
||||
position: relative;
|
||||
overflow: visible;
|
||||
transition: all 0.5s cubic-bezier(0.4, 0, 0.2, 1);
|
||||
cursor: pointer;
|
||||
width: 90%;
|
||||
max-width: 900px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
backdrop-filter: blur(10px);
|
||||
box-shadow: 0 10px 30px rgba(0, 0, 0, 0.3);
|
||||
}
|
||||
|
||||
.product-card::before {
|
||||
content: '';
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
background: linear-gradient(135deg, transparent 0%, rgba(15, 114, 181, 0.05) 100%);
|
||||
opacity: 0;
|
||||
transition: opacity 0.5s;
|
||||
border-radius: 20px;
|
||||
}
|
||||
|
||||
.product-card:hover::before {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
.product-card:hover {
|
||||
transform: translateY(-10px) scale(1.02);
|
||||
background: linear-gradient(135deg, rgba(255, 255, 255, 1), rgba(250, 250, 250, 1));
|
||||
border-color: rgba(15, 114, 181, 0.5);
|
||||
box-shadow:
|
||||
0 30px 60px rgba(0, 0, 0, 0.4),
|
||||
0 0 80px rgba(15, 114, 181, 0.15),
|
||||
inset 0 0 20px rgba(15, 114, 181, 0.03);
|
||||
}
|
||||
|
||||
/* Product Header */
|
||||
.product-header {
|
||||
padding: 40px 40px 30px;
|
||||
background: linear-gradient(135deg, rgba(15, 114, 181, 0.15) 0%, transparent 50%);
|
||||
border-bottom: 1px solid rgba(15, 114, 181, 0.25);
|
||||
display: grid;
|
||||
grid-template-columns: 80px 1fr;
|
||||
align-items: center;
|
||||
gap: 25px;
|
||||
}
|
||||
|
||||
.product-icon-wrapper {
|
||||
width: 80px;
|
||||
height: 80px;
|
||||
position: relative;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
.product-icon-bg {
|
||||
position: absolute;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background: linear-gradient(135deg, #0f72b5, #00406e);
|
||||
border-radius: 20px;
|
||||
opacity: 0.1;
|
||||
transition: all 0.5s;
|
||||
}
|
||||
|
||||
.product-card:hover .product-icon-bg {
|
||||
opacity: 0.2;
|
||||
transform: rotate(10deg) scale(1.1);
|
||||
}
|
||||
|
||||
.product-icon {
|
||||
position: relative;
|
||||
z-index: 1;
|
||||
width: 50px;
|
||||
height: 50px;
|
||||
filter: brightness(0) saturate(100%) invert(42%) sepia(82%) saturate(723%) hue-rotate(178deg) brightness(98%) contrast(92%);
|
||||
transition: all 0.5s;
|
||||
}
|
||||
|
||||
.product-card:hover .product-icon {
|
||||
transform: scale(1.1);
|
||||
filter: brightness(0) saturate(100%) invert(42%) sepia(82%) saturate(723%) hue-rotate(178deg) brightness(108%) contrast(92%);
|
||||
}
|
||||
|
||||
.product-title-wrapper {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 5px;
|
||||
align-items: center;
|
||||
text-align: center;
|
||||
padding-right: 105px;
|
||||
}
|
||||
|
||||
.product-title {
|
||||
color: #1a1a1a;
|
||||
font-size: 1.8rem;
|
||||
font-weight: 700;
|
||||
margin: 0;
|
||||
transition: all 0.3s;
|
||||
}
|
||||
|
||||
.product-card:hover .product-title {
|
||||
color: #0f72b5;
|
||||
}
|
||||
|
||||
.product-tagline {
|
||||
color: rgba(0, 0, 0, 0.6);
|
||||
font-size: 0.9rem;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 2px;
|
||||
font-weight: 500;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
/* Product Body */
|
||||
.product-body {
|
||||
padding: 30px 40px;
|
||||
flex-grow: 1;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.product-description {
|
||||
color: rgba(0, 0, 0, 0.7);
|
||||
line-height: 1.8;
|
||||
margin-bottom: 30px;
|
||||
flex-grow: 1;
|
||||
}
|
||||
|
||||
/* Product Features */
|
||||
.product-features {
|
||||
list-style: none;
|
||||
padding: 0;
|
||||
margin: 0 0 30px 0;
|
||||
}
|
||||
|
||||
.product-features li {
|
||||
color: rgba(255, 255, 255, 0.7);
|
||||
padding: 8px 0;
|
||||
padding-left: 30px;
|
||||
position: relative;
|
||||
transition: all 0.3s;
|
||||
}
|
||||
|
||||
.product-features li::before {
|
||||
content: '▸';
|
||||
position: absolute;
|
||||
left: 0;
|
||||
color: #0f72b5;
|
||||
font-size: 1.2rem;
|
||||
transition: all 0.3s;
|
||||
}
|
||||
|
||||
.product-card:hover .product-features li {
|
||||
color: rgba(255, 255, 255, 0.9);
|
||||
transform: translateX(5px);
|
||||
}
|
||||
|
||||
.product-card:hover .product-features li::before {
|
||||
color: #1e90ff;
|
||||
transform: translateX(3px);
|
||||
}
|
||||
|
||||
/* Product Footer */
|
||||
.product-footer {
|
||||
padding: 30px 40px;
|
||||
background: rgba(15, 114, 181, 0.08);
|
||||
border-top: 1px solid rgba(15, 114, 181, 0.2);
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.product-status {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 10px;
|
||||
}
|
||||
|
||||
.status-dot {
|
||||
width: 8px;
|
||||
height: 8px;
|
||||
background: #00ff00;
|
||||
border-radius: 50%;
|
||||
animation: pulse 2s infinite;
|
||||
}
|
||||
|
||||
@keyframes pulse {
|
||||
0%, 100% { opacity: 1; transform: scale(1); }
|
||||
50% { opacity: 0.5; transform: scale(1.2); }
|
||||
}
|
||||
|
||||
.status-text {
|
||||
color: rgba(255, 255, 255, 0.6);
|
||||
font-size: 0.9rem;
|
||||
}
|
||||
|
||||
/* Learn More Button */
|
||||
.product-learn-more {
|
||||
background: transparent;
|
||||
border: 2px solid #0f72b5;
|
||||
color: #0f72b5;
|
||||
padding: 10px 25px;
|
||||
border-radius: 50px;
|
||||
cursor: pointer;
|
||||
transition: all 0.3s;
|
||||
font-size: 0.95rem;
|
||||
font-weight: 600;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 1px;
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.product-learn-more::before {
|
||||
content: '';
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
left: 50%;
|
||||
width: 0;
|
||||
height: 0;
|
||||
background: linear-gradient(135deg, #0f72b5, #00406e);
|
||||
transform: translate(-50%, -50%);
|
||||
transition: all 0.5s;
|
||||
border-radius: 50px;
|
||||
}
|
||||
|
||||
.product-learn-more:hover::before {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.product-learn-more:hover {
|
||||
color: #ffffff;
|
||||
border-color: transparent;
|
||||
transform: translateY(-2px);
|
||||
box-shadow: 0 10px 30px rgba(15, 114, 181, 0.3);
|
||||
}
|
||||
|
||||
.product-learn-more span {
|
||||
position: relative;
|
||||
z-index: 1;
|
||||
}
|
||||
|
||||
/* Tools Grid Styling - Inside Product Body */
|
||||
.product-body .tools-grid {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(3, 1fr);
|
||||
gap: 15px;
|
||||
margin-top: 20px;
|
||||
max-height: 0;
|
||||
overflow: hidden;
|
||||
opacity: 0;
|
||||
transition: max-height 0.6s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.4s ease-in-out;
|
||||
visibility: hidden;
|
||||
}
|
||||
|
||||
.product-body .tools-grid.expanded {
|
||||
max-height: 2000px;
|
||||
opacity: 1;
|
||||
visibility: visible;
|
||||
}
|
||||
|
||||
/* Responsive grid adjustment */
|
||||
@media (max-width: 768px) {
|
||||
.product-body .tools-grid {
|
||||
grid-template-columns: 1fr;
|
||||
}
|
||||
}
|
||||
|
||||
@media (min-width: 769px) and (max-width: 1024px) {
|
||||
.product-body .tools-grid {
|
||||
grid-template-columns: repeat(2, 1fr);
|
||||
}
|
||||
}
|
||||
|
||||
.tools-grid .tool-card {
|
||||
background: rgba(0, 0, 0, 0.03);
|
||||
border-radius: 12px;
|
||||
padding: 20px;
|
||||
transition: all 0.3s;
|
||||
border: 1px solid rgba(0, 0, 0, 0.1);
|
||||
}
|
||||
|
||||
.tools-grid .tool-card:hover {
|
||||
transform: translateY(-3px);
|
||||
background: rgba(0, 0, 0, 0.05);
|
||||
border-color: rgba(15, 114, 181, 0.3);
|
||||
box-shadow: 0 5px 15px rgba(15, 114, 181, 0.15);
|
||||
}
|
||||
|
||||
.tools-grid .tool-icon {
|
||||
width: 60px;
|
||||
height: 60px;
|
||||
margin-bottom: 15px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
background: linear-gradient(135deg, rgba(15, 114, 181, 0.15), rgba(0, 64, 110, 0.1));
|
||||
border-radius: 15px;
|
||||
}
|
||||
|
||||
.tools-grid .tool-icon img {
|
||||
width: 35px;
|
||||
height: 35px;
|
||||
filter: brightness(0) saturate(100%) invert(52%) sepia(82%) saturate(723%) hue-rotate(178deg) brightness(108%) contrast(92%);
|
||||
}
|
||||
|
||||
.tools-grid h4 {
|
||||
color: #1a1a1a;
|
||||
font-size: 1.2rem;
|
||||
margin-bottom: 15px;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.tools-grid .tool-features ul {
|
||||
list-style: none;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.tools-grid .tool-features li {
|
||||
color: rgba(0, 0, 0, 0.7);
|
||||
padding: 5px 0;
|
||||
font-size: 0.9rem;
|
||||
position: relative;
|
||||
padding-left: 20px;
|
||||
line-height: 1.5;
|
||||
}
|
||||
|
||||
.tools-grid .tool-features li::before {
|
||||
content: '▸';
|
||||
position: absolute;
|
||||
left: 0;
|
||||
color: #1e90ff;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
/* Responsive Design */
|
||||
@media (max-width: 968px) {
|
||||
.products-grid {
|
||||
grid-template-columns: 1fr;
|
||||
}
|
||||
|
||||
.product-card.featured {
|
||||
grid-column: span 1;
|
||||
}
|
||||
|
||||
.products-section .section-title {
|
||||
font-size: 2.5rem;
|
||||
}
|
||||
}
|
||||
|
||||
/* Floating Tech Particles */
|
||||
.tech-particles {
|
||||
position: absolute;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
top: 0;
|
||||
left: 0;
|
||||
overflow: hidden;
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
.particle {
|
||||
position: absolute;
|
||||
background: rgba(15, 114, 181, 0.3);
|
||||
border-radius: 50%;
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
.particle:nth-child(1) {
|
||||
width: 3px;
|
||||
height: 3px;
|
||||
top: 10%;
|
||||
left: 20%;
|
||||
animation: float1 15s infinite;
|
||||
}
|
||||
|
||||
.particle:nth-child(2) {
|
||||
width: 2px;
|
||||
height: 2px;
|
||||
top: 70%;
|
||||
left: 80%;
|
||||
animation: float2 20s infinite;
|
||||
}
|
||||
|
||||
.particle:nth-child(3) {
|
||||
width: 4px;
|
||||
height: 4px;
|
||||
top: 40%;
|
||||
left: 60%;
|
||||
animation: float3 18s infinite;
|
||||
}
|
||||
|
||||
@keyframes float1 {
|
||||
0%, 100% { transform: translate(0, 0); opacity: 0; }
|
||||
10% { opacity: 1; }
|
||||
90% { opacity: 1; }
|
||||
100% { transform: translate(100px, -100px); opacity: 0; }
|
||||
}
|
||||
|
||||
@keyframes float2 {
|
||||
0%, 100% { transform: translate(0, 0); opacity: 0; }
|
||||
10% { opacity: 1; }
|
||||
90% { opacity: 1; }
|
||||
100% { transform: translate(-100px, -150px); opacity: 0; }
|
||||
}
|
||||
|
||||
@keyframes float3 {
|
||||
0%, 100% { transform: translate(0, 0); opacity: 0; }
|
||||
10% { opacity: 1; }
|
||||
90% { opacity: 1; }
|
||||
100% { transform: translate(50px, -120px); opacity: 0; }
|
||||
}
|
||||
@@ -1,437 +0,0 @@
|
||||
/* Modern Section Transitions & Dividers */
|
||||
|
||||
/* Simple fade transition between sections */
|
||||
.section-fade {
|
||||
position: relative;
|
||||
opacity: 0;
|
||||
transform: translateY(30px);
|
||||
transition: all 0.8s cubic-bezier(0.4, 0, 0.2, 1);
|
||||
}
|
||||
|
||||
.section-fade.visible {
|
||||
opacity: 1;
|
||||
transform: translateY(0);
|
||||
}
|
||||
|
||||
/* Subtle gradient overlay at section edges */
|
||||
.section-gradient-top {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 100px;
|
||||
background: linear-gradient(to bottom, rgba(255,255,255,1) 0%, rgba(255,255,255,0) 100%);
|
||||
pointer-events: none;
|
||||
z-index: 1;
|
||||
}
|
||||
|
||||
.section-gradient-bottom {
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 100px;
|
||||
background: linear-gradient(to top, rgba(244,244,244,1) 0%, rgba(244,244,244,0) 100%);
|
||||
pointer-events: none;
|
||||
z-index: 1;
|
||||
}
|
||||
|
||||
/* Animated Gradient Divider */
|
||||
.gradient-divider {
|
||||
position: relative;
|
||||
height: 200px;
|
||||
margin: -100px 0;
|
||||
background: linear-gradient(
|
||||
135deg,
|
||||
transparent 0%,
|
||||
rgba(15, 114, 181, 0.03) 25%,
|
||||
rgba(15, 114, 181, 0.08) 50%,
|
||||
rgba(15, 114, 181, 0.03) 75%,
|
||||
transparent 100%
|
||||
);
|
||||
z-index: 5;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.gradient-divider::before {
|
||||
content: '';
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: -100%;
|
||||
width: 200%;
|
||||
height: 100%;
|
||||
background: linear-gradient(
|
||||
90deg,
|
||||
transparent,
|
||||
rgba(15, 114, 181, 0.2),
|
||||
transparent
|
||||
);
|
||||
animation: shimmerDivider 8s infinite;
|
||||
}
|
||||
|
||||
@keyframes shimmerDivider {
|
||||
0% { transform: translateX(-100%); }
|
||||
100% { transform: translateX(100%); }
|
||||
}
|
||||
|
||||
/* Diagonal Section Transitions */
|
||||
.diagonal-section {
|
||||
position: relative;
|
||||
padding: 120px 0 80px;
|
||||
margin-top: -50px;
|
||||
clip-path: polygon(0 50px, 100% 0, 100% 100%, 0 100%);
|
||||
}
|
||||
|
||||
.diagonal-section-reverse {
|
||||
position: relative;
|
||||
padding: 120px 0 80px;
|
||||
margin-top: -50px;
|
||||
clip-path: polygon(0 0, 100% 50px, 100% 100%, 0 100%);
|
||||
}
|
||||
|
||||
/* Blob Divider */
|
||||
.blob-divider {
|
||||
position: absolute;
|
||||
bottom: -150px;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 300px;
|
||||
z-index: 5;
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
.blob-shape {
|
||||
position: absolute;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background: linear-gradient(135deg, #0f72b5, #00406e);
|
||||
opacity: 0.1;
|
||||
border-radius: 40% 60% 60% 40% / 60% 30% 70% 40%;
|
||||
animation: morphBlob 20s ease-in-out infinite;
|
||||
}
|
||||
|
||||
@keyframes morphBlob {
|
||||
0%, 100% {
|
||||
border-radius: 40% 60% 60% 40% / 60% 30% 70% 40%;
|
||||
transform: translate(0, 0) scale(1);
|
||||
}
|
||||
33% {
|
||||
border-radius: 60% 40% 30% 70% / 60% 70% 30% 40%;
|
||||
transform: translate(-30px, -20px) scale(1.1);
|
||||
}
|
||||
66% {
|
||||
border-radius: 30% 70% 70% 30% / 30% 60% 40% 70%;
|
||||
transform: translate(30px, 20px) scale(0.9);
|
||||
}
|
||||
}
|
||||
|
||||
/* Particle Bridge */
|
||||
.particle-bridge {
|
||||
position: absolute;
|
||||
width: 100%;
|
||||
height: 200px;
|
||||
bottom: -100px;
|
||||
left: 0;
|
||||
z-index: 8;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.particle {
|
||||
position: absolute;
|
||||
width: 4px;
|
||||
height: 4px;
|
||||
background: #0f72b5;
|
||||
border-radius: 50%;
|
||||
opacity: 0.6;
|
||||
}
|
||||
|
||||
@keyframes floatParticle {
|
||||
0% {
|
||||
transform: translateY(100px) translateX(0);
|
||||
opacity: 0;
|
||||
}
|
||||
10% {
|
||||
opacity: 0.6;
|
||||
}
|
||||
90% {
|
||||
opacity: 0.6;
|
||||
}
|
||||
100% {
|
||||
transform: translateY(-100px) translateX(100px);
|
||||
opacity: 0;
|
||||
}
|
||||
}
|
||||
|
||||
/* Curved Section */
|
||||
.curved-section {
|
||||
position: relative;
|
||||
padding-top: 100px;
|
||||
margin-top: -80px;
|
||||
}
|
||||
|
||||
.curved-section::before {
|
||||
content: '';
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 80px;
|
||||
background: inherit;
|
||||
border-radius: 0 0 50% 50% / 0 0 100% 100%;
|
||||
transform: scaleX(1.5);
|
||||
}
|
||||
|
||||
/* Glass Transition */
|
||||
.glass-transition {
|
||||
position: relative;
|
||||
margin: 50px 0;
|
||||
padding: 40px 0;
|
||||
background: linear-gradient(
|
||||
135deg,
|
||||
rgba(255, 255, 255, 0.1) 0%,
|
||||
rgba(255, 255, 255, 0.05) 100%
|
||||
);
|
||||
backdrop-filter: blur(10px);
|
||||
-webkit-backdrop-filter: blur(10px);
|
||||
border-top: 1px solid rgba(15, 114, 181, 0.1);
|
||||
border-bottom: 1px solid rgba(15, 114, 181, 0.1);
|
||||
}
|
||||
|
||||
/* Zigzag Border */
|
||||
.zigzag-top {
|
||||
position: relative;
|
||||
padding-top: 40px;
|
||||
}
|
||||
|
||||
.zigzag-top::before {
|
||||
content: '';
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 30px;
|
||||
background: linear-gradient(
|
||||
135deg,
|
||||
transparent 33.33%,
|
||||
#0f72b5 33.33%,
|
||||
#0f72b5 66.66%,
|
||||
transparent 66.66%
|
||||
);
|
||||
background-size: 30px 60px;
|
||||
opacity: 0.1;
|
||||
}
|
||||
|
||||
/* Flowing Lines */
|
||||
.flow-lines {
|
||||
position: absolute;
|
||||
width: 100%;
|
||||
height: 200px;
|
||||
bottom: -100px;
|
||||
left: 0;
|
||||
overflow: hidden;
|
||||
z-index: 5;
|
||||
}
|
||||
|
||||
.flow-line {
|
||||
position: absolute;
|
||||
height: 2px;
|
||||
background: linear-gradient(90deg, transparent, #0f72b5, transparent);
|
||||
animation: flowLine 6s infinite;
|
||||
}
|
||||
|
||||
.flow-line:nth-child(1) {
|
||||
top: 20%;
|
||||
animation-delay: 0s;
|
||||
width: 60%;
|
||||
}
|
||||
|
||||
.flow-line:nth-child(2) {
|
||||
top: 40%;
|
||||
animation-delay: 1s;
|
||||
width: 80%;
|
||||
}
|
||||
|
||||
.flow-line:nth-child(3) {
|
||||
top: 60%;
|
||||
animation-delay: 2s;
|
||||
width: 70%;
|
||||
}
|
||||
|
||||
.flow-line:nth-child(4) {
|
||||
top: 80%;
|
||||
animation-delay: 3s;
|
||||
width: 90%;
|
||||
}
|
||||
|
||||
@keyframes flowLine {
|
||||
0% {
|
||||
transform: translateX(-100%);
|
||||
opacity: 0;
|
||||
}
|
||||
50% {
|
||||
opacity: 1;
|
||||
}
|
||||
100% {
|
||||
transform: translateX(200%);
|
||||
opacity: 0;
|
||||
}
|
||||
}
|
||||
|
||||
/* Reveal Sections with Mask */
|
||||
.section-reveal {
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.section-reveal::before {
|
||||
content: '';
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: -100%;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background: linear-gradient(
|
||||
90deg,
|
||||
transparent,
|
||||
rgba(255, 255, 255, 0.4),
|
||||
transparent
|
||||
);
|
||||
animation: revealMask 2s ease-out forwards;
|
||||
}
|
||||
|
||||
@keyframes revealMask {
|
||||
to {
|
||||
left: 100%;
|
||||
}
|
||||
}
|
||||
|
||||
/* Geometric Pattern Divider */
|
||||
.geometric-divider {
|
||||
position: relative;
|
||||
height: 100px;
|
||||
margin: 40px 0;
|
||||
background-image:
|
||||
repeating-linear-gradient(
|
||||
45deg,
|
||||
transparent,
|
||||
transparent 10px,
|
||||
rgba(15, 114, 181, 0.05) 10px,
|
||||
rgba(15, 114, 181, 0.05) 20px
|
||||
),
|
||||
repeating-linear-gradient(
|
||||
-45deg,
|
||||
transparent,
|
||||
transparent 10px,
|
||||
rgba(15, 114, 181, 0.05) 10px,
|
||||
rgba(15, 114, 181, 0.05) 20px
|
||||
);
|
||||
}
|
||||
|
||||
/* Animated Border */
|
||||
.animated-border {
|
||||
position: relative;
|
||||
padding: 80px 0;
|
||||
}
|
||||
|
||||
.animated-border::before,
|
||||
.animated-border::after {
|
||||
content: '';
|
||||
position: absolute;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 2px;
|
||||
background: linear-gradient(
|
||||
90deg,
|
||||
transparent,
|
||||
#0f72b5 20%,
|
||||
#0f72b5 80%,
|
||||
transparent
|
||||
);
|
||||
}
|
||||
|
||||
.animated-border::before {
|
||||
top: 0;
|
||||
animation: borderSlide 4s infinite;
|
||||
}
|
||||
|
||||
.animated-border::after {
|
||||
bottom: 0;
|
||||
animation: borderSlide 4s infinite reverse;
|
||||
}
|
||||
|
||||
@keyframes borderSlide {
|
||||
0%, 100% {
|
||||
transform: translateX(-100%);
|
||||
}
|
||||
50% {
|
||||
transform: translateX(100%);
|
||||
}
|
||||
}
|
||||
|
||||
/* Section Fade Transitions */
|
||||
.fade-section {
|
||||
opacity: 0;
|
||||
transform: translateY(50px);
|
||||
transition: all 1s cubic-bezier(0.4, 0, 0.2, 1);
|
||||
}
|
||||
|
||||
.fade-section.visible {
|
||||
opacity: 1;
|
||||
transform: translateY(0);
|
||||
}
|
||||
|
||||
/* Parallax Background Sections */
|
||||
.parallax-section {
|
||||
position: relative;
|
||||
min-height: 500px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.parallax-bg {
|
||||
position: absolute;
|
||||
top: -20%;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 120%;
|
||||
background-image: linear-gradient(135deg, rgba(15, 114, 181, 0.05) 0%, transparent 100%);
|
||||
background-attachment: fixed;
|
||||
background-position: center;
|
||||
background-repeat: no-repeat;
|
||||
background-size: cover;
|
||||
will-change: transform;
|
||||
}
|
||||
|
||||
/* Split Color Section */
|
||||
.split-section {
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.split-section::before {
|
||||
content: '';
|
||||
position: absolute;
|
||||
top: -50%;
|
||||
left: -50%;
|
||||
width: 200%;
|
||||
height: 200%;
|
||||
background: linear-gradient(
|
||||
45deg,
|
||||
transparent 48%,
|
||||
rgba(15, 114, 181, 0.05) 49%,
|
||||
rgba(15, 114, 181, 0.05) 51%,
|
||||
transparent 52%
|
||||
);
|
||||
animation: rotateSplit 20s linear infinite;
|
||||
}
|
||||
|
||||
@keyframes rotateSplit {
|
||||
0% {
|
||||
transform: rotate(0deg);
|
||||
}
|
||||
100% {
|
||||
transform: rotate(360deg);
|
||||
}
|
||||
}
|
||||
477
css/style.css
Normale Datei
@@ -0,0 +1,477 @@
|
||||
/* AegisSight Monitor - Product Page v2 (Light Mode) */
|
||||
|
||||
/* Fonts */
|
||||
@font-face { font-family:'Inter'; src:url('/assets/fonts/Inter-Regular.woff2') format('woff2'),url('/assets/fonts/Inter-Regular.ttf') format('truetype'); font-weight:400; font-display:swap; }
|
||||
@font-face { font-family:'Inter'; src:url('/assets/fonts/Inter-SemiBold.woff2') format('woff2'),url('/assets/fonts/Inter-SemiBold.ttf') format('truetype'); font-weight:600; font-display:swap; }
|
||||
@font-face { font-family:'Inter'; src:url('/assets/fonts/Inter-Bold.woff2') format('woff2'),url('/assets/fonts/Inter-Bold.ttf') format('truetype'); font-weight:700; font-display:swap; }
|
||||
@font-face { font-family:'Inter'; src:url('/assets/fonts/Inter-Light.woff2') format('woff2'),url('/assets/fonts/Inter-Light.ttf') format('truetype'); font-weight:300; font-display:swap; }
|
||||
|
||||
:root {
|
||||
--navy: #0A1832;
|
||||
--navy-light: #132844;
|
||||
--gold: #C8A851;
|
||||
--gold-light: #D4B96A;
|
||||
--gold-dark: #B39645;
|
||||
--white: #FAFBFD;
|
||||
--base: #F5F7FA;
|
||||
--alt: #EDF0F5;
|
||||
--alt-solid: #F0F3F7;
|
||||
--gray-100: #E4E8EE;
|
||||
--gray-200: #D0D5DE;
|
||||
--gray-400: #9AA5B4;
|
||||
--gray-600: #5A6478;
|
||||
--text: #2A2F3A;
|
||||
--text-light: #5A6478;
|
||||
--radius: 8px;
|
||||
--radius-lg: 12px;
|
||||
--shadow: 0 2px 12px rgba(10,24,50,0.06);
|
||||
--shadow-lg: 0 8px 32px rgba(10,24,50,0.1);
|
||||
--nav-height: 72px;
|
||||
}
|
||||
|
||||
*,*::before,*::after { margin:0; padding:0; box-sizing:border-box; }
|
||||
html { scroll-behavior:smooth; scroll-padding-top:var(--nav-height); }
|
||||
body { font-family:'Inter',system-ui,-apple-system,sans-serif; font-size:16px; line-height:1.6; color:var(--text); background:var(--base); -webkit-font-smoothing:antialiased; }
|
||||
img { max-width:100%; height:auto; }
|
||||
a { color:inherit; text-decoration:none; }
|
||||
.container { max-width:1120px; margin:0 auto; padding:0 24px; }
|
||||
|
||||
/* ==================== NAV ==================== */
|
||||
.navbar { position:fixed; top:0; left:0; right:0; height:var(--nav-height); background:rgba(250,251,253,0.92); backdrop-filter:blur(12px); -webkit-backdrop-filter:blur(12px); z-index:1000; transition:box-shadow 0.3s; }
|
||||
.navbar.scrolled { box-shadow:0 1px 16px rgba(10,24,50,0.08); }
|
||||
.nav-container { max-width:1120px; margin:0 auto; padding:0 24px; height:100%; display:flex; align-items:center; justify-content:space-between; }
|
||||
.nav-logo { display:flex; align-items:center; }
|
||||
.logo-img { height:36px; width:auto; }
|
||||
.nav-menu { list-style:none; display:flex; gap:32px; }
|
||||
.nav-menu a { font-size:0.9rem; font-weight:500; color:var(--navy); transition:color 0.2s; }
|
||||
.nav-menu a:hover { color:var(--gold); }
|
||||
|
||||
.nav-extras { display:flex; align-items:center; gap:18px; }
|
||||
|
||||
.mobile-menu-toggle { display:none; background:none; border:none; cursor:pointer; width:32px; height:24px; position:relative; flex-direction:column; justify-content:space-between; }
|
||||
.mobile-menu-toggle span { display:block; width:100%; height:2px; background:var(--navy); border-radius:2px; transition:transform 0.3s,opacity 0.3s; }
|
||||
.mobile-menu-toggle.active span:nth-child(1) { transform:rotate(45deg) translate(7px,7px); }
|
||||
.mobile-menu-toggle.active span:nth-child(2) { opacity:0; }
|
||||
.mobile-menu-toggle.active span:nth-child(3) { transform:rotate(-45deg) translate(7px,-7px); }
|
||||
|
||||
.mobile-menu { position:fixed; top:var(--nav-height); left:0; right:0; background:var(--white); padding:16px 24px 24px; box-shadow:var(--shadow-lg); transform:translateY(-100%); opacity:0; transition:transform 0.3s,opacity 0.3s; z-index:999; pointer-events:none; }
|
||||
.mobile-menu.open { transform:translateY(0); opacity:1; pointer-events:all; }
|
||||
.mobile-menu ul { list-style:none; }
|
||||
.mobile-menu li { border-bottom:1px solid var(--gray-100); }
|
||||
.mobile-menu a { display:block; padding:14px 0; font-size:1rem; font-weight:500; color:var(--navy); }
|
||||
.mobile-overlay { position:fixed; inset:0; background:rgba(10,24,50,0.3); z-index:998; opacity:0; pointer-events:none; transition:opacity 0.3s; }
|
||||
.mobile-overlay.open { opacity:1; pointer-events:all; }
|
||||
|
||||
/* ==================== HERO (Full-Video mit Endcard) ==================== */
|
||||
.hero { position:relative; min-height:88vh; overflow:hidden; background:var(--navy); clip-path:polygon(0 0, 100% 0, 100% calc(100% - 60px), 50% 100%, 0 calc(100% - 60px)); margin-bottom:-60px; z-index:1; }
|
||||
.gold { color:var(--gold); font-weight:600; }
|
||||
|
||||
/* Overlay-Layer für Text + Navigation */
|
||||
.hero-content { position:absolute; inset:0; z-index:4; color:var(--white); pointer-events:none; }
|
||||
.hero-content > * { pointer-events:auto; }
|
||||
|
||||
/* Brand (Titel + Tagline): nur während Endcard sichtbar, in Hero-Mitte */
|
||||
.hero-brand { position:absolute; top:50%; left:0; right:0; padding:0 24px; text-align:center; transform:translateY(-50%); opacity:0; transition:opacity 0.5s ease; pointer-events:none; }
|
||||
.hero.endcard .hero-brand { opacity:1; transition-delay:0.35s; pointer-events:auto; }
|
||||
.hero-title { font-size:3.2rem; font-weight:700; line-height:1.1; letter-spacing:-0.02em; color:var(--white); margin:0; }
|
||||
.hero-tagline { font-size:1.2rem; font-weight:300; color:rgba(255,255,255,0.9); margin-top:12px; }
|
||||
|
||||
/* ==================== HERO SLIDER ==================== */
|
||||
/* Slider: unter der Navbar beginnen, oberhalb der Dots-Zone enden (60px Reserve fuer Dots) */
|
||||
.hero-slider { position:absolute; top:var(--nav-height); left:0; right:0; bottom:60px; z-index:1; }
|
||||
.hero-slide { position:absolute; inset:0; opacity:0; transition:opacity 0.6s ease; pointer-events:none; }
|
||||
.hero-slide.active { opacity:1; pointer-events:auto; }
|
||||
.hero-slide.exiting { opacity:0; transition:opacity 0.4s ease; }
|
||||
|
||||
/* Video füllt den Slide (contain = komplett sichtbar, Navy-Letterbox) */
|
||||
.hero-slide-video { position:absolute; inset:0; overflow:hidden; transition:opacity 0.4s ease; }
|
||||
.hero-slide-video video { display:block; width:100%; height:100%; object-fit:contain; background:var(--navy); }
|
||||
/* Beim Endcard-State Video ausfaden */
|
||||
.hero-slide.ended .hero-slide-video { opacity:0; }
|
||||
|
||||
/* Per-Slide-Bottom (Beispieltext + CTA): nur während Endcard sichtbar, unter dem Titel */
|
||||
.hero-slide-bottom { position:absolute; left:0; right:0; bottom:140px; padding:0 32px; text-align:center; opacity:0; transition:opacity 0.5s ease; pointer-events:none; }
|
||||
.hero-slide.ended .hero-slide-bottom { opacity:1; transition-delay:0.5s; pointer-events:auto; }
|
||||
.hero-slide-example { font-size:1.15rem; font-weight:400; line-height:1.55; color:rgba(255,255,255,0.9); margin:0 auto 24px; max-width:820px; padding:0; border:0; }
|
||||
.hero-slide-cta { display:flex; gap:16px; flex-wrap:wrap; justify-content:center; }
|
||||
.hero-slide-cta .btn-placeholder { opacity:0.5; cursor:default; border-style:dashed; pointer-events:none; }
|
||||
|
||||
/* Slider-Navigation: Dots zentriert ganz unten im Chevron-Band, ausserhalb des Video-Bereichs. */
|
||||
.hero-slider-nav { position:absolute; left:0; right:0; bottom:22px; display:flex; justify-content:center; padding:0 24px; pointer-events:none; z-index:5; }
|
||||
.hero-slider-dots { display:flex; gap:12px; pointer-events:auto; }
|
||||
.hero-dot { width:10px; height:10px; border-radius:50%; border:2px solid var(--gold); background:transparent; cursor:pointer; transition:all 0.3s; padding:0; }
|
||||
.hero-dot.active { background:var(--gold); }
|
||||
|
||||
.hero-slider-arrows { /* Container - Pfeile positionieren sich absolut relativ zu hero-content */ }
|
||||
.hero-arrow { position:absolute; top:50%; transform:translateY(-50%); width:48px; height:48px; border-radius:50%; border:1px solid rgba(255,255,255,0.35); background:rgba(10,24,50,0.35); color:var(--white); font-size:1.2rem; cursor:pointer; display:flex; align-items:center; justify-content:center; transition:all 0.2s; backdrop-filter:blur(6px); -webkit-backdrop-filter:blur(6px); z-index:5; }
|
||||
.hero-arrow:hover { border-color:var(--gold); color:var(--gold); background:rgba(10,24,50,0.6); }
|
||||
.hero-arrow-prev { left:24px; }
|
||||
.hero-arrow-next { right:24px; }
|
||||
|
||||
/* Altes hero-overlay nicht mehr verwendet */
|
||||
.hero-overlay { display:none; }
|
||||
|
||||
/* ==================== BUTTONS ==================== */
|
||||
.btn { display:inline-flex; align-items:center; justify-content:center; padding:12px 28px; border-radius:var(--radius); font-family:inherit; font-size:0.95rem; font-weight:600; cursor:pointer; transition:all 0.2s; border:2px solid transparent; text-decoration:none; }
|
||||
.btn-primary { background:var(--gold); color:var(--navy); border-color:var(--gold); }
|
||||
.btn-primary:hover { background:var(--gold-dark); border-color:var(--gold-dark); }
|
||||
.btn-outline-light { background:transparent; color:var(--white); border-color:rgba(255,255,255,0.4); }
|
||||
.btn-outline-light:hover { background:rgba(255,255,255,0.1); border-color:var(--white); }
|
||||
.btn-outline { background:transparent; color:var(--navy); border-color:var(--navy); }
|
||||
.btn-outline:hover { background:var(--navy); color:var(--white); }
|
||||
.btn-lg { padding:16px 40px; font-size:1.05rem; }
|
||||
.btn-block { width:100%; }
|
||||
|
||||
/* ==================== SECTIONS ==================== */
|
||||
.section { padding:88px 0; }
|
||||
.section-base { background:var(--base); }
|
||||
.section-alt { background:var(--alt-solid); }
|
||||
.section-dark { background:var(--navy-light); color:var(--white); }
|
||||
|
||||
.section-title { font-size:2rem; font-weight:700; color:var(--navy); text-align:center; margin-bottom:16px; letter-spacing:-0.01em; }
|
||||
.section-dark .section-title { color:var(--white); }
|
||||
.section-subtitle-light { color:rgba(255,255,255,0.6); }
|
||||
.section-subtitle { font-size:1.05rem; color:var(--text-light); text-align:center; max-width:600px; margin:0 auto 48px; }
|
||||
|
||||
/* ==================== SECTION DIVIDERS ==================== */
|
||||
.divider { line-height:0; margin:0; overflow:hidden; }
|
||||
.divider svg { display:block; width:100%; height:auto; }
|
||||
.divider-chevron { background:var(--alt-solid); }
|
||||
.divider-chevron-dark { background:var(--navy); }
|
||||
.divider-diagonal { background:var(--base); }
|
||||
.divider-diagonal-dark { background:var(--base); }
|
||||
.divider-gradient-alt-to-base { height:40px; background:linear-gradient(to bottom, var(--alt-solid), var(--base)); }
|
||||
.divider-gradient-base-to-alt { height:60px; background:linear-gradient(to bottom, var(--base), var(--alt-solid)); }
|
||||
.divider-gradient-dark-to-base { height:80px; background:linear-gradient(to bottom, var(--navy), var(--base)); }
|
||||
.divider-gradient-dark-to-alt { height:60px; background:linear-gradient(to bottom, var(--navy), var(--alt-solid)); }
|
||||
|
||||
/* ==================== GRID ==================== */
|
||||
.grid-3 { display:grid; grid-template-columns:repeat(3,1fr); gap:28px; }
|
||||
#features .grid-3 { justify-items:center; }
|
||||
#features .grid-3 .feature-card:nth-last-child(-n+2):nth-child(3n+1) { grid-column: 1; }
|
||||
#features .grid-3 { display:flex; flex-wrap:wrap; justify-content:center; }
|
||||
#features .grid-3 .feature-card { width:calc(33.333% - 20px); }
|
||||
.grid-4 { display:grid; grid-template-columns:repeat(4,1fr); gap:24px; }
|
||||
|
||||
/* ==================== PROBLEM ==================== */
|
||||
.problem-card { text-align:center; padding:32px 20px; }
|
||||
.problem-icon { width:64px; height:64px; margin:0 auto 20px; display:flex; align-items:center; justify-content:center; background:var(--white); border-radius:50%; box-shadow:var(--shadow); }
|
||||
.problem-card h3 { font-size:1.1rem; font-weight:700; color:var(--navy); margin-bottom:10px; }
|
||||
.problem-card p { font-size:0.93rem; color:var(--text-light); line-height:1.6; }
|
||||
|
||||
/* Problem dark variant */
|
||||
.problem-card-dark { color:var(--white); }
|
||||
.problem-card-dark h3 { color:var(--white); }
|
||||
.problem-card-dark p { color:rgba(255,255,255,0.7); }
|
||||
.problem-icon-dark { background:rgba(255,255,255,0.08); border:1px solid rgba(255,255,255,0.1); box-shadow:none; }
|
||||
.problem-icon-dark img { filter:brightness(0) invert(1); }
|
||||
|
||||
/* ==================== WORKFLOW ==================== */
|
||||
.workflow { display:flex; align-items:flex-start; justify-content:center; margin-top:56px; }
|
||||
.workflow-step { flex:1; max-width:300px; text-align:center; padding:0 24px; }
|
||||
.step-number { width:48px; height:48px; margin:0 auto 20px; display:flex; align-items:center; justify-content:center; background:var(--gold); color:var(--navy); font-size:1.2rem; font-weight:700; border-radius:50%; }
|
||||
.workflow-step h3 { font-size:1.1rem; font-weight:700; color:var(--navy); margin-bottom:10px; }
|
||||
.workflow-step p { font-size:0.93rem; color:var(--text-light); line-height:1.6; }
|
||||
.workflow-connector { width:60px; height:2px; background:var(--gold); margin-top:23px; flex-shrink:0; opacity:0.4; }
|
||||
|
||||
/* ==================== FEATURES ==================== */
|
||||
.feature-card { background:var(--white); border-radius:var(--radius-lg); padding:28px 24px; box-shadow:var(--shadow); transition:box-shadow 0.3s,transform 0.3s,border-color 0.3s,background 0.3s; border:1px solid transparent; }
|
||||
.feature-card:hover { box-shadow:var(--shadow-lg); transform:translateY(-3px); }
|
||||
.feature-icon { width:48px; height:48px; display:flex; align-items:center; justify-content:center; background:var(--alt-solid); border-radius:var(--radius); margin-bottom:14px; border:1px solid transparent; }
|
||||
.feature-card h3 { font-size:1rem; font-weight:700; color:var(--navy); margin-bottom:8px; }
|
||||
.feature-card p { font-size:0.88rem; color:var(--text-light); line-height:1.6; }
|
||||
|
||||
/* Features im dunklen Section-Kontext: Glasmorphism mit Gold-Akzent */
|
||||
.section-dark .feature-card { background:rgba(255,255,255,0.04); border-color:rgba(200,168,81,0.2); box-shadow:none; }
|
||||
.section-dark .feature-card:hover { border-color:rgba(200,168,81,0.5); background:rgba(255,255,255,0.06); transform:translateY(-3px); box-shadow:0 8px 24px rgba(0,0,0,0.3); }
|
||||
.section-dark .feature-card h3 { color:var(--white); }
|
||||
.section-dark .feature-card p { color:rgba(255,255,255,0.7); }
|
||||
.section-dark .feature-icon { background:rgba(200,168,81,0.15); border-color:rgba(200,168,81,0.3); }
|
||||
.section-dark .feature-icon img { filter:brightness(0) saturate(100%) invert(74%) sepia(49%) saturate(471%) hue-rotate(2deg) brightness(91%) contrast(83%); }
|
||||
|
||||
/* ==================== DEMOS SECTION ==================== */
|
||||
#demos { padding-top:48px; }
|
||||
|
||||
/* ==================== LIVE STATS BAR ==================== */
|
||||
.live-stats-bar { margin-bottom:40px; text-align:center; }
|
||||
.live-stats-title { font-size:1rem; font-weight:600; color:var(--gold); text-transform:uppercase; letter-spacing:0.1em; margin-bottom:16px; }
|
||||
.live-stats-row { display:flex; justify-content:center; gap:20px; flex-wrap:wrap; }
|
||||
.live-stat { text-align:center; background:var(--white); border-radius:var(--radius-lg); padding:20px 32px; box-shadow:var(--shadow); border:1px solid var(--gray-100); min-width:160px; }
|
||||
.live-stat-value { display:block; font-size:2.4rem; font-weight:700; color:var(--navy); line-height:1.1; letter-spacing:-0.02em; }
|
||||
.live-stat-label { display:block; font-size:0.8rem; color:var(--text-light); text-transform:uppercase; letter-spacing:0.08em; margin-top:4px; }
|
||||
|
||||
/* ==================== FEATURE HIGHLIGHT ==================== */
|
||||
.feature-statement { text-align:center; max-width:700px; margin:0 auto 48px; padding:0 24px; }
|
||||
.feature-statement-text { font-size:1.6rem; font-weight:700; color:var(--navy); line-height:1.35; margin-bottom:12px; letter-spacing:-0.01em; }
|
||||
.feature-statement-sub { font-size:1rem; color:var(--text-light); line-height:1.6; }
|
||||
.section-dark .feature-statement-text { color:var(--white); }
|
||||
.section-dark .feature-statement-sub { color:rgba(255,255,255,0.7); }
|
||||
@media(max-width:768px) { .feature-statement-text { font-size:1.3rem; } }
|
||||
|
||||
/* ==================== 3D CAROUSEL ==================== */
|
||||
.carousel-viewport { overflow-x:clip; overflow-y:visible; padding:20px 0; position:relative; }
|
||||
.carousel-track { display:flex; justify-content:center; position:relative; }
|
||||
.carousel-card { width:860px; flex-shrink:0; background:var(--white); border-radius:var(--radius-lg); padding:28px 24px; box-shadow:var(--shadow); position:absolute; display:flex; flex-direction:column; transition:all 0.6s cubic-bezier(0.4,0,0.2,1); cursor:pointer; transform-style:preserve-3d; }
|
||||
.carousel-card.active { position:relative; transform:none; z-index:3; opacity:1; }
|
||||
.carousel-card.left { position:absolute; left:0; top:0; transform:scale(0.75) translateX(-70%); z-index:1; opacity:0.45; }
|
||||
.carousel-card.right { position:absolute; right:0; top:0; transform:scale(0.75) translateX(70%); z-index:1; opacity:0.45; }
|
||||
.carousel-card.hidden { position:absolute; transform:scale(0.5); z-index:0; opacity:0; pointer-events:none; }
|
||||
|
||||
/* Carousel arrows */
|
||||
.carousel-arrow { position:absolute; top:50%; transform:translateY(-50%); z-index:10; width:44px; height:44px; border-radius:50%; border:2px solid var(--gray-200); background:var(--white); color:var(--navy); font-size:1.6rem; cursor:pointer; display:flex; align-items:center; justify-content:center; transition:all 0.2s; box-shadow:var(--shadow); line-height:1; }
|
||||
.carousel-arrow:hover { border-color:var(--gold); color:var(--gold); box-shadow:var(--shadow-lg); }
|
||||
.carousel-prev { left:8px; }
|
||||
.carousel-next { right:8px; }
|
||||
.carousel-nav { display:flex; justify-content:center; gap:10px; margin-top:24px; }
|
||||
.carousel-dot { width:10px; height:10px; border-radius:50%; border:2px solid var(--gold); background:transparent; cursor:pointer; transition:all 0.3s; padding:0; }
|
||||
.carousel-dot.active { background:var(--gold); }
|
||||
.card-live { border:2px solid var(--gold); box-shadow:0 4px 24px rgba(200,168,81,0.15); }
|
||||
.card-placeholder { border:2px dashed var(--gray-200); opacity:0.55; }
|
||||
.demo-badge { display:inline-block; padding:4px 14px; border-radius:20px; font-size:0.72rem; font-weight:700; letter-spacing:0.08em; text-transform:uppercase; margin-bottom:14px; width:fit-content; background:var(--gold); color:var(--navy); }
|
||||
.badge-soon { background:var(--gray-100); color:var(--gray-400); }
|
||||
.demo-title { font-size:1.25rem; font-weight:700; color:var(--navy); margin-bottom:16px; }
|
||||
|
||||
|
||||
.demo-excerpt { margin-bottom:16px; }
|
||||
.excerpt-text { font-size:0.88rem; color:var(--text); line-height:1.65; }
|
||||
|
||||
.excerpt-text h2 { font-size:1.05rem; font-weight:700; color:var(--navy); margin:20px 0 8px; }
|
||||
.excerpt-text h3 { font-size:0.95rem; font-weight:600; color:var(--navy); margin:16px 0 6px; }
|
||||
.excerpt-text p { margin-bottom:10px; }
|
||||
.excerpt-text ul { margin:8px 0 12px 20px; }
|
||||
.excerpt-text li { margin-bottom:4px; font-size:0.88rem; color:var(--text); }
|
||||
.placeholder-title { color:var(--gray-400); }
|
||||
.placeholder-text { font-size:0.95rem; color:var(--gray-400); flex:1; display:flex; align-items:center; justify-content:center; min-height:180px; }
|
||||
|
||||
/* ==================== MAP ==================== */
|
||||
.map-section { margin-top:48px; }
|
||||
.map-title { font-size:1.1rem; font-weight:600; color:var(--navy); margin-bottom:16px; text-align:center; }
|
||||
.map-section { transition:opacity 0.3s; }
|
||||
.map-section.map-hidden #map-container { display:none; }
|
||||
.map-section.map-hidden .map-empty { display:flex!important; }
|
||||
.map-empty { display:none; align-items:center; justify-content:center; height:300px; border:2px dashed var(--gray-200); border-radius:var(--radius-lg); color:var(--gray-400); font-size:1rem; background:var(--white); }
|
||||
#map-container { height:420px; border-radius:var(--radius-lg); overflow:hidden; box-shadow:var(--shadow); border:1px solid var(--gray-100); }
|
||||
|
||||
/* Map pulse markers (exact lagebild style) */
|
||||
.pulse-marker-wrapper { position:relative; width:20px; height:20px; }
|
||||
.pulse-marker-ring { position:absolute; inset:0; border-radius:50%; border:2px solid; animation:mapPulseRing 2s infinite; opacity:0; }
|
||||
.pulse-marker-ring:nth-child(2) { animation-delay:1s; }
|
||||
@keyframes mapPulseRing { 0%{transform:scale(0.5);opacity:0} 30%{opacity:0.6} 100%{transform:scale(2.5);opacity:0} }
|
||||
.pulse-marker-dot { position:absolute; top:50%; left:50%; width:8px; height:8px; margin:-4px 0 0 -4px; border-radius:50%; animation:pulseDot 2s infinite; }
|
||||
@keyframes pulseDot { 0%,100%{opacity:1;transform:scale(1)} 50%{opacity:0.5;transform:scale(0.7)} }
|
||||
/* Dark popup style */
|
||||
.leaflet-popup-content-wrapper { background:#151D2E!important; color:#E8ECF4!important; border:1px solid #1E2D45!important; border-radius:4px!important; box-shadow:0 4px 16px rgba(0,0,0,0.4)!important; }
|
||||
.leaflet-popup-tip { background:#151D2E!important; }
|
||||
.leaflet-popup-content { margin:10px 14px!important; font-size:0.85rem!important; }
|
||||
|
||||
/* ==================== TRUST ==================== */
|
||||
.trust-grid { margin-top:48px; }
|
||||
.trust-card { text-align:center; padding:24px 16px; }
|
||||
.trust-icon-wrap { height:56px; display:flex; align-items:center; justify-content:center; margin-bottom:16px; }
|
||||
.trust-icon-wrap img { filter:brightness(0) invert(1); }
|
||||
.trust-icon-wrap.trust-flag img { filter:none; }
|
||||
.trust-card h3 { font-size:1.05rem; font-weight:700; margin-bottom:8px; }
|
||||
.trust-card p { font-size:0.88rem; opacity:0.7; line-height:1.5; }
|
||||
|
||||
/* ==================== CTA ==================== */
|
||||
.cta-container { text-align:center; max-width:600px; }
|
||||
.cta-text { font-size:1.1rem; color:var(--text-light); margin-bottom:32px; }
|
||||
.cta-email { font-size:0.9rem; color:var(--text-light); margin-top:16px; }
|
||||
|
||||
|
||||
/* ==================== CONTACT MODAL ==================== */
|
||||
.modal-overlay { position:fixed; inset:0; z-index:9999; background:rgba(10,24,50,0.6); backdrop-filter:blur(4px); display:flex; align-items:center; justify-content:center; padding:24px; }
|
||||
.modal-content { background:var(--white); border-radius:var(--radius-lg); padding:40px; max-width:520px; width:100%; position:relative; box-shadow:0 24px 64px rgba(10,24,50,0.3); max-height:90vh; overflow-y:auto; }
|
||||
.modal-close { position:absolute; top:16px; right:20px; background:none; border:none; font-size:1.8rem; color:var(--gray-400); cursor:pointer; line-height:1; }
|
||||
.modal-close:hover { color:var(--navy); }
|
||||
.modal-content h2 { font-size:1.5rem; font-weight:700; color:var(--navy); margin-bottom:8px; }
|
||||
.modal-sub { font-size:0.95rem; color:var(--text-light); margin-bottom:28px; }
|
||||
.form-row { display:grid; grid-template-columns:1fr 1fr; gap:16px; }
|
||||
.form-group { margin-bottom:16px; }
|
||||
.form-group label { display:block; font-size:0.82rem; font-weight:600; color:var(--navy); margin-bottom:6px; text-transform:uppercase; letter-spacing:0.04em; }
|
||||
.form-group input, .form-group textarea { width:100%; padding:10px 14px; border:1px solid var(--gray-200); border-radius:var(--radius); font-family:inherit; font-size:0.95rem; color:var(--text); background:var(--base); transition:border-color 0.2s; }
|
||||
.form-group input:focus, .form-group textarea:focus { outline:none; border-color:var(--gold); }
|
||||
.form-group textarea { resize:vertical; }
|
||||
.form-success { text-align:center; padding:40px 0; }
|
||||
.form-success p { font-size:1.05rem; color:var(--navy); font-weight:500; }
|
||||
@media(max-width:768px) { .form-row { grid-template-columns:1fr; } .modal-content { padding:28px 20px; } }
|
||||
/* ==================== FOOTER ==================== */
|
||||
.footer { background:var(--navy); color:rgba(255,255,255,0.7); padding:40px 0; font-size:0.85rem; }
|
||||
.footer-content { display:flex; justify-content:space-between; align-items:center; margin-bottom:24px; padding-bottom:24px; border-bottom:1px solid rgba(255,255,255,0.1); }
|
||||
.footer-company { font-weight:600; color:var(--white); margin-bottom:4px; }
|
||||
.footer-links { display:flex; gap:24px; }
|
||||
.footer-links a { color:rgba(255,255,255,0.7); transition:color 0.2s; }
|
||||
.footer-links a:hover { color:var(--white); }
|
||||
.footer-copyright { text-align:center; font-size:0.8rem; opacity:0.5; }
|
||||
|
||||
/* ==================== RESPONSIVE ==================== */
|
||||
@media(max-width:1024px) {
|
||||
.grid-3 { grid-template-columns:repeat(2,1fr); }
|
||||
.grid-4 { grid-template-columns:repeat(2,1fr); }
|
||||
.hero-title { font-size:2.5rem; }
|
||||
.section { padding:64px 0; }
|
||||
.workflow-connector { width:40px; }
|
||||
}
|
||||
|
||||
@media(max-width:768px) {
|
||||
.nav-menu { display:none; }
|
||||
.mobile-menu-toggle { display:flex; }
|
||||
.grid-3,.grid-4 { grid-template-columns:1fr; gap:20px; }
|
||||
.hero { min-height:75vh; }
|
||||
.hero-brand { padding:0 20px; }
|
||||
.hero-title { font-size:1.9rem; }
|
||||
.hero-tagline { font-size:0.95rem; margin-top:8px; }
|
||||
.hero-slide-bottom { bottom:110px; padding:0 20px; }
|
||||
.hero-slide-example { font-size:0.95rem; margin-bottom:18px; }
|
||||
.hero-slide-cta { flex-direction:column; }
|
||||
.hero-slide-cta .btn { width:100%; }
|
||||
.hero-slider-nav { bottom:18px; }
|
||||
.hero-slider-arrows { display:none; }
|
||||
.section { padding:48px 0; }
|
||||
.section-title { font-size:1.6rem; }
|
||||
.workflow { flex-direction:column; align-items:center; gap:8px; }
|
||||
.workflow-connector { width:2px; height:32px; margin:0; }
|
||||
.workflow-step { max-width:100%; padding:16px 0; }
|
||||
.footer-content { flex-direction:column; text-align:center; gap:16px; }
|
||||
|
||||
#map-container { height:300px; }
|
||||
#features .grid-3 { display:flex; flex-direction:column; }
|
||||
#features .grid-3 .feature-card { width:100%; }
|
||||
.carousel-card { width:100%!important; max-width:100%; position:relative!important; }
|
||||
.carousel-card.active { transform:none; }
|
||||
.carousel-card.left, .carousel-card.right { display:none; }
|
||||
.carousel-track { display:flex; flex-direction:column; }
|
||||
.carousel-arrow { display:none; }
|
||||
.carousel-viewport { overflow:visible; }
|
||||
.live-stats-bar { padding:0 8px; }
|
||||
.live-stats-row { gap:12px; }
|
||||
.live-stat { min-width:0; padding:16px 12px; }
|
||||
.live-stat-value { font-size:1.8rem; }
|
||||
}
|
||||
|
||||
@media(max-width:480px) {
|
||||
.hero-title { font-size:1.65rem; }
|
||||
.hero-tagline { font-size:0.9rem; }
|
||||
.hero-slide-example { font-size:0.9rem; }
|
||||
.container { padding:0 16px; }
|
||||
}
|
||||
|
||||
/* Marker-Cluster Dark Theme */
|
||||
.marker-cluster-small,
|
||||
.marker-cluster-medium,
|
||||
.marker-cluster-large {
|
||||
background: rgba(21, 29, 46, 0.8);
|
||||
}
|
||||
.marker-cluster-small div,
|
||||
.marker-cluster-medium div,
|
||||
.marker-cluster-large div {
|
||||
background: rgba(200, 168, 81, 0.9);
|
||||
color: #0A1832;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
/* === Neueste Entwicklungen (Live-Monitoring Vorschau) === */
|
||||
.dev-list-heading {
|
||||
font-size: 0.75rem;
|
||||
font-weight: 700;
|
||||
letter-spacing: 0.8px;
|
||||
text-transform: uppercase;
|
||||
color: #C8A851;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
.dev-list {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 6px;
|
||||
}
|
||||
.dev-bullet {
|
||||
background: rgba(30, 45, 69, 0.45);
|
||||
border-left: 3px solid #C8A851;
|
||||
border-radius: 4px;
|
||||
padding: 8px 12px;
|
||||
text-align: left;
|
||||
}
|
||||
.dev-bullet-head {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
margin-bottom: 4px;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
.dev-sources {
|
||||
display: inline-flex;
|
||||
flex-wrap: wrap;
|
||||
gap: 4px;
|
||||
align-items: center;
|
||||
min-width: 0;
|
||||
}
|
||||
.dev-source-pill {
|
||||
display: inline-block;
|
||||
padding: 2px 8px;
|
||||
background: rgba(200, 168, 81, 0.15);
|
||||
color: #E8ECF4;
|
||||
border-radius: 3px;
|
||||
font-size: 0.7rem;
|
||||
font-weight: 500;
|
||||
text-decoration: none;
|
||||
line-height: 1.5;
|
||||
white-space: normal;
|
||||
overflow-wrap: anywhere;
|
||||
font-variant-numeric: tabular-nums;
|
||||
}
|
||||
a.dev-source-pill:hover {
|
||||
background: rgba(200, 168, 81, 0.3);
|
||||
text-decoration: none;
|
||||
color: #E8ECF4;
|
||||
}
|
||||
.dev-time {
|
||||
color: #8896AB;
|
||||
font-size: 0.7rem;
|
||||
font-variant-numeric: tabular-nums;
|
||||
white-space: nowrap;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
.dev-body {
|
||||
font-size: 0.85rem;
|
||||
line-height: 1.45;
|
||||
color: #E8ECF4;
|
||||
}
|
||||
|
||||
/* ==================== HELLIGKEITS-TONLEITER (Test) ==================== */
|
||||
/* Vier helle Sections in vier Helligkeitsstufen — Seite "atmet" beim Scrollen
|
||||
sanft von hell nach kühler, mündet hart in den dunklen Footer. */
|
||||
:root {
|
||||
--tone-1: #F5F7FA; /* Problem (hellster) */
|
||||
--tone-2: #ECF0F5; /* Workflow */
|
||||
--tone-3: #E4EAF1; /* Demos */
|
||||
--tone-4: #ECF2F9; /* Contact (hell blau-grau-weiß, frischer Akzent vor Trust) */
|
||||
}
|
||||
#problem { background: var(--tone-1); }
|
||||
#solution { background: var(--tone-2); }
|
||||
#demos { background: var(--tone-3); }
|
||||
#contact { background: var(--tone-4); }
|
||||
|
||||
/* Divider-Übergänge an die Tonstufen anpassen (Adjacent-Sibling) */
|
||||
#problem + .divider { background: linear-gradient(to bottom, var(--tone-1), var(--tone-2)); }
|
||||
#solution + .divider { background: linear-gradient(to bottom, var(--tone-2), var(--tone-3)); }
|
||||
#demos + .divider { background: linear-gradient(to bottom, var(--tone-3), var(--tone-4)); height: 60px; }
|
||||
#contact + .divider { background: var(--tone-4); } /* diagonal-dark Contact->Trust, Top-Farbe an Contact angleichen */
|
||||
#trust { margin-top: -1px; } /* schließt Subpixel-Lücke zum Diagonal-Divider darüber */
|
||||
|
||||
/* === EXCERPT FADE-MASK PATCH 2026-04-26 START === */
|
||||
/* Vereinheitlicht die Karussell-Kartenhoehe ueber feste Excerpt-Hoehe */
|
||||
/* + weicher Fade-out bei langen Lagen statt harter Abschneidung */
|
||||
.carousel-card .demo-excerpt {
|
||||
position: relative;
|
||||
height: 760px;
|
||||
overflow: hidden;
|
||||
-webkit-mask-image: linear-gradient(to bottom, #000 calc(100% - 80px), transparent 100%);
|
||||
mask-image: linear-gradient(to bottom, #000 calc(100% - 80px), transparent 100%);
|
||||
}
|
||||
@media(max-width:768px) {
|
||||
.carousel-card .demo-excerpt { height: 640px; }
|
||||
}
|
||||
/* === EXCERPT FADE-MASK PATCH 2026-04-26 END === */
|
||||
|
||||
|
||||
294
datenschutz.html
@@ -3,134 +3,102 @@
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Datenschutz - IntelSight</title>
|
||||
<link rel="stylesheet" href="css/main.css">
|
||||
<link rel="stylesheet" href="css/fonts.css">
|
||||
<meta name="robots" content="noindex, follow">
|
||||
<meta name="theme-color" content="#0A1832">
|
||||
<meta name="author" content="AegisSight UG">
|
||||
<title>Datenschutz – AegisSight</title>
|
||||
|
||||
<!-- Rechtliche Seiten von Suchmaschinen ausschliessen -->
|
||||
<meta name="googlebot" content="noindex, nofollow, noarchive, nosnippet, noimageindex">
|
||||
|
||||
<link rel="alternate" hreflang="de" href="https://aegis-sight.de/datenschutz.html">
|
||||
<link rel="alternate" hreflang="en" href="https://aegis-sight.de/en/privacy.html">
|
||||
<link rel="alternate" hreflang="x-default" href="https://aegis-sight.de/datenschutz.html">
|
||||
|
||||
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
|
||||
<link rel="apple-touch-icon" href="/assets/images/logos/AegisSightLogo_NavyGold.svg">
|
||||
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">
|
||||
|
||||
<link rel="stylesheet" href="/css/style.css">
|
||||
<link rel="stylesheet" href="/css/lang-switcher.css">
|
||||
<link rel="stylesheet" href="/cookie-consent.css">
|
||||
<style>
|
||||
body {
|
||||
background: #0a0f1c;
|
||||
min-height: 100vh;
|
||||
}
|
||||
.datenschutz-container {
|
||||
max-width: 800px;
|
||||
margin: 0 auto;
|
||||
padding: 120px 20px 40px;
|
||||
}
|
||||
.datenschutz-header {
|
||||
margin-bottom: 40px;
|
||||
text-align: center;
|
||||
}
|
||||
.datenschutz-header h1 {
|
||||
font-family: 'Bebas Neue', sans-serif;
|
||||
font-size: 3rem;
|
||||
font-weight: 400;
|
||||
color: #ffffff;
|
||||
margin-bottom: 10px;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 3px;
|
||||
}
|
||||
.datenschutz-content {
|
||||
background: rgba(255, 255, 255, 0.95);
|
||||
box-shadow: 0 10px 30px rgba(0, 0, 0, 0.3);
|
||||
border-radius: 20px;
|
||||
padding: 40px;
|
||||
backdrop-filter: blur(10px);
|
||||
}
|
||||
.datenschutz-section {
|
||||
margin-bottom: 35px;
|
||||
}
|
||||
.datenschutz-section h2 {
|
||||
font-family: 'Bebas Neue', sans-serif;
|
||||
font-size: 1.8rem;
|
||||
color: #0f72b5;
|
||||
margin-bottom: 20px;
|
||||
font-weight: 400;
|
||||
letter-spacing: 1px;
|
||||
text-transform: uppercase;
|
||||
}
|
||||
.datenschutz-section h3 {
|
||||
font-family: 'Inter', sans-serif;
|
||||
font-size: 1.2rem;
|
||||
color: #333;
|
||||
margin-top: 20px;
|
||||
margin-bottom: 15px;
|
||||
font-weight: 600;
|
||||
}
|
||||
.datenschutz-section p {
|
||||
font-family: 'Inter', sans-serif;
|
||||
color: #333333;
|
||||
line-height: 1.7;
|
||||
margin-bottom: 15px;
|
||||
}
|
||||
.datenschutz-section ul {
|
||||
margin-left: 20px;
|
||||
margin-bottom: 15px;
|
||||
}
|
||||
.datenschutz-section li {
|
||||
font-family: 'Inter', sans-serif;
|
||||
color: #333333;
|
||||
line-height: 1.7;
|
||||
margin-bottom: 8px;
|
||||
}
|
||||
.datenschutz-section strong {
|
||||
color: #1a1a1a;
|
||||
font-weight: 600;
|
||||
}
|
||||
.important-notice {
|
||||
background: rgba(15, 114, 181, 0.08);
|
||||
border-left: 4px solid #0f72b5;
|
||||
padding: 15px 20px;
|
||||
margin: 20px 0;
|
||||
border-radius: 4px;
|
||||
}
|
||||
.important-notice p {
|
||||
font-family: 'Inter', sans-serif;
|
||||
}
|
||||
.source-note {
|
||||
margin-top: 40px;
|
||||
padding-top: 20px;
|
||||
border-top: 1px solid rgba(15, 114, 181, 0.1);
|
||||
font-size: 0.9rem;
|
||||
color: #666;
|
||||
font-family: 'Inter', sans-serif;
|
||||
}
|
||||
.source-note a {
|
||||
color: #0f72b5;
|
||||
text-decoration: none;
|
||||
}
|
||||
.source-note a:hover {
|
||||
text-decoration: underline;
|
||||
body { font-family: 'Inter', -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; background: var(--white); margin: 0; }
|
||||
.legal-page { padding: calc(var(--nav-height) + 56px) 0 80px; min-height: calc(100vh - 220px); }
|
||||
.legal-container { max-width: 820px; margin: 0 auto; padding: 0 24px; }
|
||||
.legal-container h1 { font-size: 2.25rem; font-weight: 700; color: var(--navy); margin: 0 0 12px; }
|
||||
.legal-meta { color: var(--text-light); margin: 0 0 32px; font-size: 0.95rem; }
|
||||
.legal-content { background: var(--base); border-radius: var(--radius-lg); padding: 32px 40px; box-shadow: var(--shadow); border: 1px solid var(--gray-100); }
|
||||
.legal-section { margin-bottom: 28px; }
|
||||
.legal-section:last-child { margin-bottom: 0; }
|
||||
.legal-section h2 { font-size: 1.35rem; font-weight: 700; color: var(--navy); margin: 0 0 14px; padding-bottom: 8px; border-bottom: 2px solid var(--gold); }
|
||||
.legal-section h3 { font-size: 1.05rem; font-weight: 600; color: var(--navy); margin: 22px 0 8px; }
|
||||
.legal-section p { margin: 0 0 12px; line-height: 1.7; color: var(--text); font-size: 0.95rem; }
|
||||
.legal-section a { color: var(--gold-dark); text-decoration: underline; }
|
||||
.legal-section a:hover { color: var(--gold); }
|
||||
.legal-section ul { margin: 12px 0 16px 22px; padding: 0; }
|
||||
.legal-section li { margin-bottom: 6px; line-height: 1.6; color: var(--text); font-size: 0.95rem; }
|
||||
.legal-section strong { color: var(--navy); font-weight: 600; }
|
||||
.legal-section table { width: 100%; border-collapse: collapse; margin: 12px 0 16px; }
|
||||
.legal-section td, .legal-section th { padding: 8px 12px; border: 1px solid var(--gray-200); text-align: left; font-size: 0.92rem; }
|
||||
.source-note { margin-top: 40px; padding-top: 16px; border-top: 1px solid var(--gray-200); font-size: 0.85rem; color: var(--text-light); }
|
||||
.source-note a { color: var(--gold-dark); }
|
||||
@media (max-width: 768px) {
|
||||
.legal-container { padding: 0 16px; }
|
||||
.legal-content { padding: 24px 20px; }
|
||||
.legal-container h1 { font-size: 1.75rem; }
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<!-- Navigation -->
|
||||
<nav class="navbar" role="navigation" aria-label="Hauptnavigation">
|
||||
<nav class="navbar" id="navbar">
|
||||
<div class="nav-container">
|
||||
<div class="logo">
|
||||
<a href="index.html">
|
||||
<img src="assets/images/logos/intelsight-name-light.svg" alt="IntelSight" class="logo-img">
|
||||
</a>
|
||||
</div>
|
||||
<a href="/" class="nav-logo">
|
||||
<img src="/assets/images/logos/Logo+Schrift_Rechts.svg" alt="AegisSight" class="logo-img" width="200" height="40">
|
||||
</a>
|
||||
<ul class="nav-menu">
|
||||
<li><a href="index.html#home">Startseite</a></li>
|
||||
<li><a href="index.html#about">Über uns</a></li>
|
||||
<li><a href="index.html#products">Produkte & Lösungen</a></li>
|
||||
<li><a href="mailto:info@intelsight.de">Kontakt</a></li>
|
||||
<li><a href="/#features">Funktionen</a></li>
|
||||
<li><a href="/#demos">Live-Lagebilder</a></li>
|
||||
<li><a href="/#trust">Über uns</a></li>
|
||||
<li><a href="/#contact">Kontakt</a></li>
|
||||
</ul>
|
||||
<div class="nav-extras">
|
||||
<button class="lang-toggle" data-lang="de" aria-label="Sprache wechseln">DE | EN</button>
|
||||
<div class="lang-switcher" role="group" aria-label="Sprache">
|
||||
<span class="lang-active" lang="de" aria-current="true">DE</span>
|
||||
<span class="lang-sep" aria-hidden="true">|</span>
|
||||
<a class="lang-link" href="/en/privacy.html" lang="en" hreflang="en" rel="alternate">EN</a>
|
||||
</div>
|
||||
<button class="mobile-menu-toggle" aria-label="Menü öffnen" aria-expanded="false">
|
||||
<span></span><span></span><span></span>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<div class="datenschutz-container">
|
||||
<div class="datenschutz-header">
|
||||
<h1>Datenschutzerklärung</h1>
|
||||
<!-- Mobile Menu -->
|
||||
<div class="mobile-menu" id="mobile-menu" aria-hidden="true">
|
||||
<ul>
|
||||
<li><a href="/#features">Funktionen</a></li>
|
||||
<li><a href="/#demos">Live-Lagebilder</a></li>
|
||||
<li><a href="/#trust">Über uns</a></li>
|
||||
<li><a href="/#contact">Kontakt</a></li>
|
||||
</ul>
|
||||
<div class="lang-switcher" role="group" aria-label="Sprache">
|
||||
<span class="lang-active" lang="de" aria-current="true">DE</span>
|
||||
<span class="lang-sep" aria-hidden="true">|</span>
|
||||
<a class="lang-link" href="/en/privacy.html" lang="en" hreflang="en" rel="alternate">EN</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mobile-overlay" id="mobile-overlay"></div>
|
||||
|
||||
<div class="datenschutz-content">
|
||||
<div class="datenschutz-section">
|
||||
<main class="legal-page">
|
||||
<div class="legal-container">
|
||||
<h1>Datenschutzerklärung</h1>
|
||||
<div class="legal-section">
|
||||
<h2>1. Datenschutz auf einen Blick</h2>
|
||||
|
||||
<h3>Allgemeine Hinweise</h3>
|
||||
@@ -156,7 +124,7 @@
|
||||
<p>Detaillierte Informationen zu diesen Analyseprogrammen finden Sie in der folgenden Datenschutzerklärung.</p>
|
||||
</div>
|
||||
|
||||
<div class="datenschutz-section">
|
||||
<div class="legal-section">
|
||||
<h2>2. Hosting</h2>
|
||||
<p>Wir hosten die Inhalte unserer Website bei folgendem Anbieter:</p>
|
||||
|
||||
@@ -166,7 +134,7 @@
|
||||
<p>Die Verwendung von Hetzner erfolgt auf Grundlage von Art. 6 Abs. 1 lit. f DSGVO. Wir haben ein berechtigtes Interesse an einer möglichst zuverlässigen Darstellung unserer Website. Sofern eine entsprechende Einwilligung abgefragt wurde, erfolgt die Verarbeitung ausschließlich auf Grundlage von Art. 6 Abs. 1 lit. a DSGVO und § 25 Abs. 1 TDDDG, soweit die Einwilligung die Speicherung von Cookies oder den Zugriff auf Informationen im Endgerät des Nutzers (z. B. Device-Fingerprinting) im Sinne des TDDDG umfasst. Die Einwilligung ist jederzeit widerrufbar.</p>
|
||||
</div>
|
||||
|
||||
<div class="datenschutz-section">
|
||||
<div class="legal-section">
|
||||
<h2>3. Allgemeine Hinweise und Pflichtinformationen</h2>
|
||||
|
||||
<h3>Datenschutz</h3>
|
||||
@@ -177,10 +145,10 @@
|
||||
<h3>Hinweis zur verantwortlichen Stelle</h3>
|
||||
<p>Die verantwortliche Stelle für die Datenverarbeitung auf dieser Website ist:</p>
|
||||
<p>
|
||||
<strong>IntelSight UG (haftungsbeschränkt)</strong><br>
|
||||
<strong>AegisSight UG (haftungsbeschränkt)</strong><br>
|
||||
Gladbacher Strasse 3-5<br>
|
||||
40764 Langenfeld<br><br>
|
||||
E-Mail: info@intelsight.de
|
||||
E-Mail: info@aegis-sight.de
|
||||
</p>
|
||||
<p>Verantwortliche Stelle ist die natürliche oder juristische Person, die allein oder gemeinsam mit anderen über die Zwecke und Mittel der Verarbeitung von personenbezogenen Daten (z. B. Namen, E-Mail-Adressen o. Ä.) entscheidet.</p>
|
||||
|
||||
@@ -229,7 +197,7 @@
|
||||
<p>Der Nutzung von im Rahmen der Impressumspflicht veröffentlichten Kontaktdaten zur Übersendung von nicht ausdrücklich angeforderter Werbung und Informationsmaterialien wird hiermit widersprochen. Die Betreiber der Seiten behalten sich ausdrücklich rechtliche Schritte im Falle der unverlangten Zusendung von Werbeinformationen, etwa durch Spam-E-Mails, vor.</p>
|
||||
</div>
|
||||
|
||||
<div class="datenschutz-section">
|
||||
<div class="legal-section">
|
||||
<h2>4. Datenerfassung auf dieser Website</h2>
|
||||
|
||||
<h3>Cookies</h3>
|
||||
@@ -241,8 +209,24 @@
|
||||
<p>Welche Cookies und Dienste auf dieser Website eingesetzt werden, können Sie dieser Datenschutzerklärung entnehmen.</p>
|
||||
</div>
|
||||
|
||||
<div class="datenschutz-section">
|
||||
<h2>5. Newsletter</h2>
|
||||
<div class="legal-section">
|
||||
<h2>5. Kontaktformular und Anfragen</h2>
|
||||
|
||||
<h3>Datenerhebung über das Kontaktformular</h3>
|
||||
<p>Wenn Sie uns über das auf unserer Website bereitgestellte Kontaktformular eine Anfrage zukommen lassen, werden Ihre Angaben aus dem Formular inklusive der von Ihnen dort angegebenen Kontaktdaten zwecks Bearbeitung der Anfrage und für den Fall von Anschlussfragen bei uns gespeichert. Erhoben werden: Name, Organisation (optional), E-Mail-Adresse und Ihre Nachricht. Eine Weitergabe an Dritte erfolgt nicht.</p>
|
||||
|
||||
<h3>Rechtsgrundlage</h3>
|
||||
<p>Die Verarbeitung dieser Daten erfolgt auf Grundlage von Art. 6 Abs. 1 lit. b DSGVO, sofern Ihre Anfrage mit der Erfüllung eines Vertrags zusammenhängt oder zur Durchführung vorvertraglicher Maßnahmen erforderlich ist. In allen übrigen Fällen beruht die Verarbeitung auf unserem berechtigten Interesse an der effektiven Bearbeitung der an uns gerichteten Anfragen (Art. 6 Abs. 1 lit. f DSGVO) und/oder auf Ihrer Einwilligung (Art. 6 Abs. 1 lit. a DSGVO), sofern diese abgefragt wurde; die Einwilligung ist jederzeit widerrufbar.</p>
|
||||
|
||||
<h3>Speicherdauer</h3>
|
||||
<p>Die von Ihnen im Kontaktformular eingegebenen Daten verbleiben bei uns, bis Sie uns zur Löschung auffordern, Ihre Einwilligung zur Speicherung widerrufen oder der Zweck für die Datenspeicherung entfällt (z. B. nach abgeschlossener Bearbeitung Ihrer Anfrage). Zwingende gesetzliche Bestimmungen – insbesondere Aufbewahrungsfristen – bleiben unberührt.</p>
|
||||
|
||||
<h3>Übertragung</h3>
|
||||
<p>Ihre Anfrage wird verschlüsselt (TLS) an unseren Server übertragen und dort als E-Mail an info@aegis-sight.de weitergeleitet. Die E-Mail-Übertragung erfolgt verschlüsselt über Mailserver in Deutschland (IONOS).</p>
|
||||
</div>
|
||||
|
||||
<div class="legal-section">
|
||||
<h2>6. Newsletter</h2>
|
||||
|
||||
<h3>Newsletterdaten</h3>
|
||||
<p>Wenn Sie den auf der Website angebotenen Newsletter beziehen möchten, benötigen wir von Ihnen eine E-Mail-Adresse sowie Informationen, welche uns die Überprüfung gestatten, dass Sie der Inhaber der angegebenen E-Mail-Adresse sind und mit dem Empfang des Newsletters einverstanden sind. Weitere Daten werden nicht bzw. nur auf freiwilliger Basis erhoben. Diese Daten verwenden wir ausschließlich für den Versand der angeforderten Informationen und geben diese nicht an Dritte weiter.</p>
|
||||
@@ -252,53 +236,65 @@
|
||||
<p>Nach Ihrer Austragung aus der Newsletterverteilerliste wird Ihre E-Mail-Adresse bei uns bzw. dem Newsletterdiensteanbieter ggf. in einer Blacklist gespeichert, sofern dies zur Verhinderung künftiger Mailings erforderlich ist. Die Daten aus der Blacklist werden nur für diesen Zweck verwendet und nicht mit anderen Daten zusammengeführt. Dies dient sowohl Ihrem Interesse als auch unserem Interesse an der Einhaltung der gesetzlichen Vorgaben beim Versand von Newslettern (berechtigtes Interesse im Sinne des Art. 6 Abs. 1 lit. f DSGVO). Die Speicherung in der Blacklist ist zeitlich nicht befristet. <strong>Sie können der Speicherung widersprechen, sofern Ihre Interessen unser berechtigtes Interesse überwiegen.</strong></p>
|
||||
</div>
|
||||
|
||||
<div class="datenschutz-section">
|
||||
<h2>6. Plugins und Tools</h2>
|
||||
|
||||
<div class="legal-section">
|
||||
<h2>7. Plugins und Tools</h2>
|
||||
|
||||
<h3>AegisSight Analytics (Umami)</h3>
|
||||
<p>Wir nutzen auf dieser Website AegisSight Analytics, eine selbstgehostete Instanz der Open-Source-Analyse-Software Umami. Mit Umami erfassen wir anonymisierte Informationen zur Nutzung unserer Website (z. B. besuchte Seiten, Browser, ungefähre geografische Region auf Länderebene) zur Verbesserung unserer Inhalte.</p>
|
||||
<p><strong>Selbstgehostet in Deutschland:</strong> Sämtliche Daten verbleiben auf unserem Server in Nürnberg, Deutschland (Hosting: Hetzner). Eine Übertragung an Dritte findet nicht statt.</p>
|
||||
<p><strong>Cookielos und IP-anonymisiert:</strong> Umami setzt keine Cookies und speichert keine personenbezogenen Daten. IP-Adressen werden vor der Speicherung anonymisiert (Hashing). Es findet kein Cross-Site-Tracking statt.</p>
|
||||
<p><strong>Rechtsgrundlage und Einwilligung:</strong> Die Reichweitenmessung wird ausschließlich nach Ihrer Einwilligung über unser Cookie-Consent-Banner aktiviert (Art. 6 Abs. 1 lit. a DSGVO i. V. m. § 25 Abs. 1 TDDDG). Sie können Ihre Einwilligung jederzeit über den Footer-Link „Cookie-Einstellungen" widerrufen. Wir respektieren das „Global Privacy Control" (GPC)-Signal Ihres Browsers und deaktivieren in diesem Fall die Reichweitenmessung automatisch.</p>
|
||||
|
||||
<h3>Google Fonts (lokales Hosting)</h3>
|
||||
<p>Diese Seite nutzt zur einheitlichen Darstellung von Schriftarten so genannte Google Fonts, die von Google bereitgestellt werden. Die Google Fonts sind lokal installiert. Eine Verbindung zu Servern von Google findet dabei nicht statt.</p>
|
||||
<p>Weitere Informationen zu Google Fonts finden Sie unter <a href="https://developers.google.com/fonts/faq" target="_blank">https://developers.google.com/fonts/faq</a> und in der Datenschutzerklärung von Google: <a href="https://policies.google.com/privacy?hl=de" target="_blank">https://policies.google.com/privacy?hl=de</a>.</p>
|
||||
</div>
|
||||
|
||||
<div class="legal-section">
|
||||
<h2>8. Automatisierte Zugriffe und KI-Agenten</h2>
|
||||
|
||||
<h3>Verbot automatisierter Zugriffe</h3>
|
||||
<p>Die automatisierte Abfrage, das Scraping oder Crawling dieser Website durch Bots, Spider, Scraper, KI-Agenten (einschließlich LLM-basierter Systeme), „Buy-for-me"-Agenten oder ähnliche automatisierte Tools ist ohne unsere ausdrückliche schriftliche Genehmigung untersagt.</p>
|
||||
|
||||
<p>Dies umfasst insbesondere:</p>
|
||||
<ul>
|
||||
<li>Automatisierte Datenerfassung und -extraktion</li>
|
||||
<li>Training von KI-Modellen mit Inhalten dieser Website</li>
|
||||
<li>Automatisierte End-to-End-Prozesse ohne menschliche Überprüfung</li>
|
||||
<li>Systematisches Auslesen von Inhalten durch automatisierte Systeme</li>
|
||||
</ul>
|
||||
|
||||
<p>Verstöße gegen diese Regelung können zivil- und strafrechtlich verfolgt werden. Die in unserer robots.txt-Datei enthaltenen Anweisungen sind verbindlich und Teil dieser Nutzungsbedingungen.</p>
|
||||
|
||||
<h3>Ausnahmen</h3>
|
||||
<p>Ausgenommen von diesem Verbot sind Suchmaschinen-Crawler, die sich an die Vorgaben unserer robots.txt halten, sowie Dienste, denen wir ausdrücklich eine Genehmigung erteilt haben.</p>
|
||||
</div>
|
||||
|
||||
<div class="source-note">
|
||||
<p>Quelle: <a href="https://www.e-recht24.de" target="_blank">https://www.e-recht24.de</a></p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
|
||||
<!-- Footer -->
|
||||
<footer class="footer">
|
||||
<div class="container">
|
||||
<div class="footer-content">
|
||||
<div class="footer-section">
|
||||
<h4>IntelSight UG (haftungsbeschränkt)</h4>
|
||||
<p>Gladbacher Strasse 3-5</p>
|
||||
<p>40764 Langenfeld</p>
|
||||
<div class="footer-info">
|
||||
<p class="footer-company">AegisSight UG (haftungsbeschränkt)</p>
|
||||
<p>Gladbacher Straße 3-5, 40764 Langenfeld</p>
|
||||
</div>
|
||||
<div class="footer-section">
|
||||
<h4>Navigation</h4>
|
||||
<ul>
|
||||
<li><a href="index.html#home">Startseite</a></li>
|
||||
<li><a href="index.html#about">Über uns</a></li>
|
||||
<li><a href="index.html#products">Produkte</a></li>
|
||||
<li><a href="mailto:info@intelsight.de">Kontakt</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="footer-section">
|
||||
<h4>Rechtliches</h4>
|
||||
<ul>
|
||||
<li><a href="impressum.html">Impressum</a></li>
|
||||
<li><a href="datenschutz.html">Datenschutz</a></li>
|
||||
<li><a href="#">AGB</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="footer-section">
|
||||
<h4>Kontakt</h4>
|
||||
<p><a href="mailto:info@intelsight.de">info@intelsight.de</a></p>
|
||||
<div class="footer-links">
|
||||
<a href="/impressum.html">Impressum</a>
|
||||
<a href="/datenschutz.html">Datenschutz</a>
|
||||
<a href="#" id="cookie-settings-link">Cookie-Einstellungen</a>
|
||||
</div>
|
||||
</div>
|
||||
<p class="copyright">© 2025 IntelSight UG (haftungsbeschränkt). Alle Rechte vorbehalten.</p>
|
||||
<p class="footer-copyright">© <span id="footer-year">2026</span> AegisSight UG (haftungsbeschränkt). Alle Rechte vorbehalten.</p>
|
||||
</div>
|
||||
</footer>
|
||||
<script>document.getElementById('footer-year').textContent=new Date().getFullYear();</script>
|
||||
<script src="/js/app.js"></script>
|
||||
<script src="/cookie-consent.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
</html>
|
||||
|
||||
452
downloads/af-updates/session_manager.py
Normale Datei
@@ -0,0 +1,452 @@
|
||||
"""
|
||||
Session Manager für die Lizenz-Session-Verwaltung mit Heartbeat.
|
||||
"""
|
||||
|
||||
import threading
|
||||
import time
|
||||
import logging
|
||||
import json
|
||||
import os
|
||||
import requests
|
||||
from datetime import datetime
|
||||
from typing import Optional, Dict, Any
|
||||
from .api_client import LicenseAPIClient
|
||||
from .hardware_fingerprint import HardwareFingerprint
|
||||
|
||||
logger = logging.getLogger("session_manager")
|
||||
logger.setLevel(logging.DEBUG)
|
||||
# Füge Console Handler hinzu falls noch nicht vorhanden
|
||||
if not logger.handlers:
|
||||
handler = logging.StreamHandler()
|
||||
handler.setFormatter(logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s'))
|
||||
logger.addHandler(handler)
|
||||
|
||||
|
||||
class SessionManager:
|
||||
"""Verwaltet die Lizenz-Session und Heartbeat."""
|
||||
|
||||
SESSION_FILE = os.path.join("config", ".session_data")
|
||||
HEARTBEAT_INTERVAL = 60 # Sekunden
|
||||
|
||||
def __init__(self, api_client: Optional[LicenseAPIClient] = None):
|
||||
"""
|
||||
Initialisiert den Session Manager.
|
||||
|
||||
Args:
|
||||
api_client: Optional vorkonfigurierter API Client
|
||||
"""
|
||||
self.api_client = api_client or LicenseAPIClient()
|
||||
self.hardware_fingerprint = HardwareFingerprint()
|
||||
|
||||
self.session_token: Optional[str] = None
|
||||
self.license_key: Optional[str] = None
|
||||
self.activation_id: Optional[int] = None
|
||||
self.heartbeat_thread: Optional[threading.Thread] = None
|
||||
self.stop_heartbeat = threading.Event()
|
||||
self.is_active = False
|
||||
|
||||
# Lade Session-IP-Konfiguration
|
||||
self._load_ip_config()
|
||||
|
||||
# Session-Daten laden falls vorhanden
|
||||
self._load_session_data()
|
||||
|
||||
def _save_session_data(self) -> None:
|
||||
"""Speichert die aktuelle Session-Daten."""
|
||||
try:
|
||||
os.makedirs("config", exist_ok=True)
|
||||
session_data = {
|
||||
"session_token": self.session_token,
|
||||
"license_key": self.license_key,
|
||||
"activation_id": self.activation_id,
|
||||
"timestamp": datetime.now().isoformat()
|
||||
}
|
||||
with open(self.SESSION_FILE, 'w') as f:
|
||||
json.dump(session_data, f)
|
||||
logger.debug("Session-Daten gespeichert")
|
||||
except Exception as e:
|
||||
logger.error(f"Fehler beim Speichern der Session-Daten: {e}")
|
||||
|
||||
def _load_session_data(self) -> None:
|
||||
"""Lädt gespeicherte Session-Daten."""
|
||||
if os.path.exists(self.SESSION_FILE):
|
||||
try:
|
||||
with open(self.SESSION_FILE, 'r') as f:
|
||||
data = json.load(f)
|
||||
self.session_token = data.get("session_token")
|
||||
self.license_key = data.get("license_key")
|
||||
self.activation_id = data.get("activation_id")
|
||||
logger.info("Session-Daten geladen")
|
||||
except Exception as e:
|
||||
logger.warning(f"Fehler beim Laden der Session-Daten: {e}")
|
||||
|
||||
def _clear_session_data(self) -> None:
|
||||
"""Löscht die gespeicherten Session-Daten."""
|
||||
try:
|
||||
if os.path.exists(self.SESSION_FILE):
|
||||
os.remove(self.SESSION_FILE)
|
||||
logger.debug("Session-Daten gelöscht")
|
||||
except Exception as e:
|
||||
logger.error(f"Fehler beim Löschen der Session-Daten: {e}")
|
||||
|
||||
def start_session(self, license_key: str, activation_id: Optional[int] = None) -> Dict[str, Any]:
|
||||
"""
|
||||
Startet eine neue Session für die Lizenz.
|
||||
|
||||
Args:
|
||||
license_key: Der Lizenzschlüssel
|
||||
activation_id: Optional die Aktivierungs-ID
|
||||
|
||||
Returns:
|
||||
Dictionary mit Session-Informationen oder Fehler
|
||||
"""
|
||||
if self.is_active:
|
||||
logger.warning("Session läuft bereits")
|
||||
return {
|
||||
"success": False,
|
||||
"error": "Session already active"
|
||||
}
|
||||
|
||||
# Hardware-Info sammeln
|
||||
hw_hash = self.hardware_fingerprint.get_or_create_fingerprint()
|
||||
machine_name = self.hardware_fingerprint.get_machine_name()
|
||||
|
||||
# IP-Adresse ermitteln
|
||||
client_ip = self._get_session_ip()
|
||||
|
||||
logger.info(f"Starte Session für Lizenz: {license_key[:4]}...")
|
||||
logger.debug(f"Session-Parameter: machine_name={machine_name}, hw_hash={hw_hash[:8]}..., ip={client_ip}")
|
||||
|
||||
# Session-Start API Call mit IP-Adresse
|
||||
result = self.api_client.start_session(
|
||||
license_key=license_key,
|
||||
machine_id=machine_name,
|
||||
hardware_hash=hw_hash,
|
||||
version="1.0.0", # TODO: Version aus config lesen
|
||||
ip_address=client_ip # NEU: IP-Adresse hinzugefügt
|
||||
)
|
||||
|
||||
logger.debug(f"Session-Start Response: {result}")
|
||||
|
||||
if result.get("success"):
|
||||
data = result.get("data", {})
|
||||
|
||||
# Prüfe ob die Session wirklich erfolgreich war
|
||||
if data.get("success") is False:
|
||||
# Session wurde abgelehnt
|
||||
error_msg = data.get("message", "Session start failed")
|
||||
logger.error(f"Session abgelehnt: {error_msg}")
|
||||
return {
|
||||
"success": False,
|
||||
"error": error_msg,
|
||||
"code": "SESSION_REJECTED"
|
||||
}
|
||||
|
||||
self.session_token = data.get("session_token")
|
||||
self.license_key = license_key
|
||||
self.activation_id = activation_id or data.get("activation_id")
|
||||
self.is_active = True if self.session_token else False
|
||||
|
||||
# Session-Daten speichern
|
||||
self._save_session_data()
|
||||
|
||||
# Heartbeat starten
|
||||
self._start_heartbeat()
|
||||
|
||||
logger.info(f"Session erfolgreich gestartet: {self.session_token}")
|
||||
|
||||
# Update-Info prüfen
|
||||
if data.get("update_available"):
|
||||
logger.info(f"Update verfügbar: {data.get('latest_version')}")
|
||||
|
||||
return {
|
||||
"success": True,
|
||||
"session_token": self.session_token,
|
||||
"update_info": {
|
||||
"available": data.get("update_available", False),
|
||||
"version": data.get("latest_version"),
|
||||
"download_url": data.get("download_url")
|
||||
}
|
||||
}
|
||||
else:
|
||||
error = result.get("error", "Unknown error")
|
||||
logger.error(f"Session-Start fehlgeschlagen: {error}")
|
||||
|
||||
# Bei Konflikt (409) bedeutet es, dass bereits eine Session läuft
|
||||
if result.get("status") == 409:
|
||||
return {
|
||||
"success": False,
|
||||
"error": "Another session is already active for this license",
|
||||
"code": "SESSION_CONFLICT"
|
||||
}
|
||||
|
||||
return {
|
||||
"success": False,
|
||||
"error": error,
|
||||
"code": result.get("code", "SESSION_START_FAILED")
|
||||
}
|
||||
|
||||
def _start_heartbeat(self) -> None:
|
||||
"""Startet den Heartbeat-Thread."""
|
||||
if self.heartbeat_thread and self.heartbeat_thread.is_alive():
|
||||
logger.warning("Heartbeat läuft bereits")
|
||||
return
|
||||
|
||||
self.stop_heartbeat.clear()
|
||||
self.heartbeat_thread = threading.Thread(
|
||||
target=self._heartbeat_worker,
|
||||
daemon=True,
|
||||
name="LicenseHeartbeat"
|
||||
)
|
||||
self.heartbeat_thread.start()
|
||||
logger.info("Heartbeat-Thread gestartet")
|
||||
|
||||
def _heartbeat_worker(self) -> None:
|
||||
"""Worker-Funktion für den Heartbeat-Thread."""
|
||||
logger.info(f"Heartbeat-Worker gestartet (Interval: {self.HEARTBEAT_INTERVAL}s)")
|
||||
|
||||
while not self.stop_heartbeat.is_set():
|
||||
try:
|
||||
# Warte das Interval oder bis Stop-Signal
|
||||
if self.stop_heartbeat.wait(self.HEARTBEAT_INTERVAL):
|
||||
break
|
||||
|
||||
# Sende Heartbeat
|
||||
if self.session_token and self.license_key:
|
||||
logger.debug("Sende Heartbeat...")
|
||||
result = self.api_client.session_heartbeat(
|
||||
session_token=self.session_token,
|
||||
license_key=self.license_key
|
||||
)
|
||||
|
||||
# Pruefe sowohl HTTP-Status als auch Body-Success
|
||||
http_ok = result.get("success")
|
||||
body_data = result.get("data", {})
|
||||
body_ok = body_data.get("success", True) if isinstance(body_data, dict) else True
|
||||
|
||||
if http_ok and body_ok:
|
||||
logger.debug("Heartbeat erfolgreich")
|
||||
else:
|
||||
body_msg = body_data.get("message", "") if isinstance(body_data, dict) else ""
|
||||
logger.error(f"Heartbeat fehlgeschlagen: {body_msg or result.get('error')}")
|
||||
|
||||
# Bei HTTP-Fehlern oder Body-Fehler Session beenden
|
||||
if result.get("status") in [401, 404] or (http_ok and not body_ok):
|
||||
logger.error("Session ungueltig, beende...")
|
||||
self.end_session()
|
||||
break
|
||||
else:
|
||||
logger.warning("Keine Session-Daten für Heartbeat")
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"Fehler im Heartbeat-Worker: {e}")
|
||||
|
||||
logger.info("Heartbeat-Worker beendet")
|
||||
|
||||
def end_session(self) -> Dict[str, Any]:
|
||||
"""
|
||||
Beendet die aktuelle Session.
|
||||
|
||||
Returns:
|
||||
Dictionary mit Informationen über die beendete Session
|
||||
"""
|
||||
if not self.is_active:
|
||||
logger.warning("Keine aktive Session zum Beenden")
|
||||
return {
|
||||
"success": False,
|
||||
"error": "No active session"
|
||||
}
|
||||
|
||||
logger.info("Beende Session...")
|
||||
|
||||
# Heartbeat stoppen
|
||||
self.stop_heartbeat.set()
|
||||
if self.heartbeat_thread:
|
||||
self.heartbeat_thread.join(timeout=5)
|
||||
|
||||
# Session beenden API Call
|
||||
result = {"success": True}
|
||||
if self.session_token:
|
||||
result = self.api_client.end_session(self.session_token)
|
||||
|
||||
if result.get("success"):
|
||||
logger.info("Session erfolgreich beendet")
|
||||
else:
|
||||
logger.error(f"Fehler beim Beenden der Session: {result.get('error')}")
|
||||
|
||||
# Session-Daten löschen
|
||||
self.session_token = None
|
||||
self.license_key = None
|
||||
self.activation_id = None
|
||||
self.is_active = False
|
||||
self._clear_session_data()
|
||||
|
||||
return result
|
||||
|
||||
def resume_session(self) -> bool:
|
||||
"""
|
||||
Versucht eine gespeicherte Session fortzusetzen.
|
||||
|
||||
Returns:
|
||||
True wenn erfolgreich, False sonst
|
||||
"""
|
||||
if self.is_active:
|
||||
logger.info("Session läuft bereits")
|
||||
return True
|
||||
|
||||
if not self.session_token or not self.license_key:
|
||||
logger.info("Keine gespeicherten Session-Daten vorhanden")
|
||||
return False
|
||||
|
||||
logger.info("Versuche Session fortzusetzen...")
|
||||
|
||||
# Teste mit Heartbeat ob Session noch gültig ist
|
||||
result = self.api_client.session_heartbeat(
|
||||
session_token=self.session_token,
|
||||
license_key=self.license_key
|
||||
)
|
||||
|
||||
# Pruefe sowohl HTTP-Status als auch Body-Success
|
||||
http_ok = result.get("success")
|
||||
body_data = result.get("data", {})
|
||||
body_ok = body_data.get("success", True) if isinstance(body_data, dict) else True
|
||||
|
||||
if http_ok and body_ok:
|
||||
logger.info("Session erfolgreich fortgesetzt")
|
||||
self.is_active = True
|
||||
self._start_heartbeat()
|
||||
return True
|
||||
else:
|
||||
body_msg = body_data.get("message", "") if isinstance(body_data, dict) else ""
|
||||
logger.warning(f"Gespeicherte Session ungueltig: {body_msg or result.get('error', 'unbekannt')}")
|
||||
self._clear_session_data()
|
||||
return False
|
||||
|
||||
def is_session_active(self) -> bool:
|
||||
"""
|
||||
Prüft ob eine Session aktiv ist.
|
||||
|
||||
Returns:
|
||||
True wenn aktiv, False sonst
|
||||
"""
|
||||
return self.is_active
|
||||
|
||||
def get_session_info(self) -> Dict[str, Any]:
|
||||
"""
|
||||
Gibt Informationen über die aktuelle Session zurück.
|
||||
|
||||
Returns:
|
||||
Dictionary mit Session-Informationen
|
||||
"""
|
||||
return {
|
||||
"active": self.is_active,
|
||||
"session_token": self.session_token[:8] + "..." if self.session_token else None,
|
||||
"license_key": self.license_key[:4] + "..." if self.license_key else None,
|
||||
"activation_id": self.activation_id,
|
||||
"heartbeat_interval": self.HEARTBEAT_INTERVAL
|
||||
}
|
||||
|
||||
def set_heartbeat_interval(self, seconds: int) -> None:
|
||||
"""
|
||||
Setzt das Heartbeat-Interval.
|
||||
|
||||
Args:
|
||||
seconds: Interval in Sekunden (min 30, max 300)
|
||||
"""
|
||||
if 30 <= seconds <= 300:
|
||||
self.HEARTBEAT_INTERVAL = seconds
|
||||
logger.info(f"Heartbeat-Interval auf {seconds}s gesetzt")
|
||||
|
||||
# Restart Heartbeat wenn aktiv
|
||||
if self.is_active:
|
||||
self.stop_heartbeat.set()
|
||||
if self.heartbeat_thread:
|
||||
self.heartbeat_thread.join(timeout=5)
|
||||
self._start_heartbeat()
|
||||
else:
|
||||
logger.warning(f"Ungültiges Heartbeat-Interval: {seconds}")
|
||||
|
||||
def _load_ip_config(self) -> None:
|
||||
"""Lädt die IP-Konfiguration aus license_config.json."""
|
||||
config_path = os.path.join("config", "license_config.json")
|
||||
self.session_ip_mode = "auto" # Default
|
||||
self.ip_fallback = "0.0.0.0"
|
||||
|
||||
try:
|
||||
if os.path.exists(config_path):
|
||||
with open(config_path, 'r') as f:
|
||||
config = json.load(f)
|
||||
self.session_ip_mode = config.get("session_ip_mode", "auto")
|
||||
self.ip_fallback = config.get("ip_fallback", "0.0.0.0")
|
||||
logger.debug(f"IP-Konfiguration geladen: mode={self.session_ip_mode}, fallback={self.ip_fallback}")
|
||||
except Exception as e:
|
||||
logger.warning(f"Fehler beim Laden der IP-Konfiguration: {e}")
|
||||
|
||||
def _get_session_ip(self) -> str:
|
||||
"""
|
||||
Ermittelt die IP-Adresse für die Session basierend auf der Konfiguration.
|
||||
|
||||
TESTBETRIEB: Temporäre Lösung - wird durch Server-Ressourcenmanagement ersetzt
|
||||
|
||||
Returns:
|
||||
Die IP-Adresse als String
|
||||
"""
|
||||
if self.session_ip_mode == "auto":
|
||||
# TESTBETRIEB: Auto-Erkennung der öffentlichen IP
|
||||
logger.info("TESTBETRIEB: Ermittle öffentliche IP-Adresse automatisch")
|
||||
try:
|
||||
response = requests.get("https://api.ipify.org?format=json", timeout=5)
|
||||
if response.status_code == 200:
|
||||
ip = response.json().get("ip")
|
||||
logger.info(f"Öffentliche IP ermittelt: {ip}")
|
||||
return ip
|
||||
else:
|
||||
logger.warning(f"IP-Ermittlung fehlgeschlagen: Status {response.status_code}")
|
||||
except Exception as e:
|
||||
logger.error(f"Fehler bei IP-Ermittlung: {e}")
|
||||
|
||||
# Fallback verwenden
|
||||
logger.warning(f"Verwende Fallback-IP: {self.ip_fallback}")
|
||||
return self.ip_fallback
|
||||
|
||||
elif self.session_ip_mode == "server_assigned":
|
||||
# TODO: Implementierung für Server-zugewiesene IPs
|
||||
logger.info("Server-assigned IP mode noch nicht implementiert, verwende Fallback")
|
||||
return self.ip_fallback
|
||||
|
||||
elif self.session_ip_mode == "proxy":
|
||||
# TODO: Proxy-IP verwenden wenn Proxy aktiv
|
||||
logger.info("Proxy IP mode noch nicht implementiert, verwende Fallback")
|
||||
return self.ip_fallback
|
||||
|
||||
else:
|
||||
logger.warning(f"Unbekannter IP-Modus: {self.session_ip_mode}, verwende Fallback")
|
||||
return self.ip_fallback
|
||||
|
||||
|
||||
# Test-Funktion
|
||||
if __name__ == "__main__":
|
||||
logging.basicConfig(
|
||||
level=logging.DEBUG,
|
||||
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
|
||||
)
|
||||
|
||||
print("=== Session Manager Test ===\n")
|
||||
|
||||
# Session Manager erstellen
|
||||
session_mgr = SessionManager()
|
||||
|
||||
# Session-Info anzeigen
|
||||
print("Aktuelle Session-Info:")
|
||||
info = session_mgr.get_session_info()
|
||||
for key, value in info.items():
|
||||
print(f" {key}: {value}")
|
||||
|
||||
# Versuche gespeicherte Session fortzusetzen
|
||||
print("\nVersuche Session fortzusetzen...")
|
||||
if session_mgr.resume_session():
|
||||
print(" ✓ Session fortgesetzt")
|
||||
else:
|
||||
print(" ✗ Keine gültige Session gefunden")
|
||||
|
||||
print("\n=== Test abgeschlossen ===")
|
||||
799
en/index.html
Normale Datei
@@ -0,0 +1,799 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<meta name="robots" content="index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1">
|
||||
<meta name="theme-color" content="#0A1832">
|
||||
<meta name="author" content="AegisSight UG">
|
||||
<title>OSINT Monitoring Software from Germany – AegisSight Monitor</title>
|
||||
<meta name="description" content="OSINT monitoring software from Germany: AI-powered real-time situation reports from open sources. For government agencies, newsrooms, and security services.">
|
||||
<link rel="canonical" href="https://aegis-sight.de/en/">
|
||||
<link rel="alternate" hreflang="de" href="https://aegis-sight.de/">
|
||||
<link rel="alternate" hreflang="en" href="https://aegis-sight.de/en/">
|
||||
<link rel="alternate" hreflang="x-default" href="https://aegis-sight.de/">
|
||||
|
||||
<!-- Open Graph / Social Sharing -->
|
||||
<meta property="og:type" content="website">
|
||||
<meta property="og:site_name" content="AegisSight">
|
||||
<meta property="og:title" content="AegisSight Monitor – Real-time situation reports from open sources">
|
||||
<meta property="og:description" content="AI-powered real-time situation reports from open sources. For government agencies, newsrooms, and security services – Made in Germany.">
|
||||
<meta property="og:url" content="https://aegis-sight.de/en/">
|
||||
<meta property="og:image" content="https://aegis-sight.de/assets/images/og-image.png">
|
||||
<meta property="og:image:width" content="1200">
|
||||
<meta property="og:image:height" content="630">
|
||||
<meta property="og:locale" content="en_GB">
|
||||
<meta property="og:locale:alternate" content="de_DE">
|
||||
|
||||
<!-- Twitter Card -->
|
||||
<meta name="twitter:card" content="summary_large_image">
|
||||
<meta name="twitter:title" content="AegisSight Monitor – Real-time situation reports from open sources">
|
||||
<meta name="twitter:description" content="AI-powered real-time situation reports from open sources. For government agencies, newsrooms, and security services – Made in Germany.">
|
||||
<meta name="twitter:image" content="https://aegis-sight.de/assets/images/og-image.png">
|
||||
|
||||
<!-- Schema.org Organization -->
|
||||
<!-- TODO AEO/GEO: once LinkedIn company page and founder profiles exist,
|
||||
add the URLs to "sameAs" (organisation and both Person entries).
|
||||
This is the central place where GEO signals for AI search are created. -->
|
||||
<script type="application/ld+json">
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "Organization",
|
||||
"@id": "https://aegis-sight.de/#organization",
|
||||
"name": "AegisSight UG (haftungsbeschränkt)",
|
||||
"alternateName": "AegisSight",
|
||||
"url": "https://aegis-sight.de",
|
||||
"logo": "https://aegis-sight.de/assets/images/logos/AegisSightLogo_NavyGold.svg",
|
||||
"email": "info@aegis-sight.de",
|
||||
"slogan": "AI-powered real-time situation reports from open sources.",
|
||||
"description": "AegisSight is a German OSINT monitoring software that continuously evaluates hundreds of open sources and generates structured real-time situation reports with automatic fact-checking.",
|
||||
"knowsAbout": [
|
||||
"Open Source Intelligence (OSINT)",
|
||||
"OSINT monitoring",
|
||||
"real-time situation reports from open sources",
|
||||
"automated situational analysis",
|
||||
"automatic fact-checking",
|
||||
"social media monitoring for government agencies",
|
||||
"crisis monitoring",
|
||||
"disinformation analysis",
|
||||
"situational awareness"
|
||||
],
|
||||
"keywords": "OSINT software Germany, OSINT monitoring software, situational awareness software, automated situation reports, social media monitoring government, crisis monitoring software, GDPR-compliant OSINT tool, open source intelligence Germany",
|
||||
"areaServed": [
|
||||
{ "@type": "Country", "name": "Germany" },
|
||||
{ "@type": "Country", "name": "Austria" },
|
||||
{ "@type": "Country", "name": "Switzerland" },
|
||||
{ "@type": "AdministrativeArea", "name": "European Union" }
|
||||
],
|
||||
"address": {
|
||||
"@type": "PostalAddress",
|
||||
"streetAddress": "Gladbacher Straße 3-5",
|
||||
"postalCode": "40764",
|
||||
"addressLocality": "Langenfeld",
|
||||
"addressRegion": "Nordrhein-Westfalen",
|
||||
"addressCountry": "DE"
|
||||
},
|
||||
"founder": [
|
||||
{
|
||||
"@type": "Person",
|
||||
"name": "Hendrik Gebhardt",
|
||||
"jobTitle": "Founder & Managing Director",
|
||||
"worksFor": { "@id": "https://aegis-sight.de/#organization" },
|
||||
"sameAs": []
|
||||
},
|
||||
{
|
||||
"@type": "Person",
|
||||
"name": "Monami Homma",
|
||||
"jobTitle": "Founder & Managing Director",
|
||||
"worksFor": { "@id": "https://aegis-sight.de/#organization" },
|
||||
"sameAs": []
|
||||
}
|
||||
],
|
||||
"sameAs": []
|
||||
}
|
||||
</script>
|
||||
|
||||
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
|
||||
<link rel="apple-touch-icon" href="/assets/images/logos/AegisSightLogo_NavyGold.svg">
|
||||
<link rel="stylesheet" href="/assets/vendor/leaflet/leaflet.css">
|
||||
<link rel="stylesheet" href="/assets/vendor/leaflet/MarkerCluster.css">
|
||||
<link rel="stylesheet" href="/assets/vendor/leaflet/MarkerCluster.Default.css">
|
||||
<link rel="stylesheet" href="/css/style.css">
|
||||
<link rel="stylesheet" href="/css/lang-switcher.css">
|
||||
<link rel="stylesheet" href="/cookie-consent.css">
|
||||
|
||||
<!-- FAQ-Section Styles (AEO/GEO) -->
|
||||
<style>
|
||||
.footer { margin-top: 0; }
|
||||
.faq-section { background: #0F2240; color: #E6ECF5; padding: 4rem 0; margin: 0; display: block; }
|
||||
.faq-section .container { max-width: 880px; }
|
||||
.faq-section h2 { color: #E6C77E; text-align: center; margin: 0 0 0.5rem; }
|
||||
.faq-section .faq-intro { text-align: center; color: #B8C4D8; margin: 0 0 2.5rem; }
|
||||
.faq-section details.faq-item { background: rgba(255,255,255,0.04); border: 1px solid rgba(230,199,126,0.18); border-radius: 8px; margin: 0 0 0.75rem; padding: 0; overflow: hidden; }
|
||||
.faq-section details.faq-item:last-of-type { margin-bottom: 0; }
|
||||
.faq-section details.faq-item summary { padding: 1.1rem 3rem 1.1rem 1.4rem; cursor: pointer; font-weight: 600; font-size: 1.05rem; color: #FFFFFF; list-style: none; position: relative; }
|
||||
.faq-section details.faq-item summary::-webkit-details-marker { display: none; }
|
||||
.faq-section details.faq-item summary::after { content: "+"; position: absolute; right: 1.4rem; top: 50%; transform: translateY(-50%); font-size: 1.5rem; color: #E6C77E; font-weight: 300; }
|
||||
.faq-section details.faq-item[open] summary::after { content: "−"; }
|
||||
.faq-section details.faq-item summary:hover { background: rgba(230,199,126,0.06); }
|
||||
.faq-section details.faq-item .faq-answer { margin: 0; padding: 0 1.4rem 1.2rem; color: #D5DCE8; line-height: 1.65; font-size: 0.98rem; }
|
||||
.faq-section details.faq-item .faq-answer a { color: #E6C77E; }
|
||||
</style>
|
||||
|
||||
<script type="application/ld+json">
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "WebSite",
|
||||
"@id": "https://aegis-sight.de/en/#website",
|
||||
"name": "AegisSight",
|
||||
"alternateName": "AegisSight Monitor",
|
||||
"url": "https://aegis-sight.de/en/",
|
||||
"inLanguage": "en-GB",
|
||||
"description": "OSINT monitoring from Germany: AI-powered real-time situation reports from open sources, with automated fact-checking and source attribution.",
|
||||
"publisher": { "@id": "https://aegis-sight.de/#organization" },
|
||||
"speakable": {
|
||||
"@type": "SpeakableSpecification",
|
||||
"cssSelector": [".hero-tagline", ".feature-statement-text", ".faq-answer"]
|
||||
}
|
||||
}
|
||||
</script>
|
||||
<script type="application/ld+json">
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "SoftwareApplication",
|
||||
"@id": "https://aegis-sight.de/en/#software",
|
||||
"name": "AegisSight Monitor",
|
||||
"applicationCategory": "BusinessApplication",
|
||||
"applicationSubCategory": "OSINT Monitoring Software",
|
||||
"keywords": "OSINT software, OSINT monitoring software, situational awareness software, automated situation reports, social media monitoring government, crisis monitoring, GDPR-compliant OSINT tool, open source intelligence",
|
||||
"operatingSystem": "Web",
|
||||
"url": "https://aegis-sight.de/en/",
|
||||
"image": "https://aegis-sight.de/assets/images/og-image.png",
|
||||
"description": "AI-powered real-time situation reports from open sources. Aggregation, deduplication, geographic mapping, automated fact-checking and multilingual analysis. For government agencies, newsrooms, and security services.",
|
||||
"inLanguage": "en-GB",
|
||||
"featureList": [
|
||||
"Real-time monitoring of hundreds of sources",
|
||||
"Source analysis with aggregation and deduplication",
|
||||
"Geographic mapping on interactive map",
|
||||
"Multilingual analysis (Farsi, Arabic, Hebrew and more)",
|
||||
"Automated fact-checking against independent sources",
|
||||
"Structured situation reports with source attribution and timeline"
|
||||
],
|
||||
"publisher": { "@id": "https://aegis-sight.de/#organization" },
|
||||
"offers": {
|
||||
"@type": "Offer",
|
||||
"availability": "https://schema.org/InStock",
|
||||
"priceCurrency": "EUR",
|
||||
"price": "0",
|
||||
"url": "https://aegis-sight.de/en/#contact",
|
||||
"description": "Pricing on request"
|
||||
}
|
||||
}
|
||||
</script>
|
||||
<!-- Schema.org Service (AEO/GEO: dedicated service entry for AI search) -->
|
||||
<script type="application/ld+json">
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "Service",
|
||||
"@id": "https://aegis-sight.de/en/#osint-service",
|
||||
"name": "AegisSight Monitor",
|
||||
"serviceType": "OSINT monitoring",
|
||||
"provider": { "@id": "https://aegis-sight.de/#organization" },
|
||||
"areaServed": [
|
||||
{ "@type": "Country", "name": "Germany" },
|
||||
{ "@type": "Country", "name": "Austria" },
|
||||
{ "@type": "Country", "name": "Switzerland" },
|
||||
{ "@type": "AdministrativeArea", "name": "European Union" }
|
||||
],
|
||||
"audience": {
|
||||
"@type": "BusinessAudience",
|
||||
"audienceType": "Government agencies, newsrooms and security services"
|
||||
},
|
||||
"description": "AI-powered real-time situation reports from hundreds of open sources, with automated fact-checking, geographic mapping and multilingual analysis. Operated entirely on servers in Germany, GDPR-compliant.",
|
||||
"hasOfferCatalog": {
|
||||
"@type": "OfferCatalog",
|
||||
"name": "AegisSight Monitor capabilities",
|
||||
"itemListElement": [
|
||||
{ "@type": "Offer", "itemOffered": { "@type": "Service", "name": "Real-time monitoring of hundreds of open sources" } },
|
||||
{ "@type": "Offer", "itemOffered": { "@type": "Service", "name": "Automated fact-checking against independent sources" } },
|
||||
{ "@type": "Offer", "itemOffered": { "@type": "Service", "name": "Geographic mapping on an interactive map" } },
|
||||
{ "@type": "Offer", "itemOffered": { "@type": "Service", "name": "Multilingual analysis in Farsi, Arabic, Hebrew and further languages" } },
|
||||
{ "@type": "Offer", "itemOffered": { "@type": "Service", "name": "Structured situation reports with source attribution and timeline" } }
|
||||
]
|
||||
}
|
||||
}
|
||||
</script>
|
||||
<!-- Schema.org FAQPage (AEO: quotable answers for AI search) -->
|
||||
<script type="application/ld+json">
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "FAQPage",
|
||||
"@id": "https://aegis-sight.de/en/#faq",
|
||||
"inLanguage": "en-GB",
|
||||
"isPartOf": { "@id": "https://aegis-sight.de/en/#website" },
|
||||
"mainEntity": [
|
||||
{
|
||||
"@type": "Question",
|
||||
"name": "What is the AegisSight Monitor?",
|
||||
"acceptedAnswer": {
|
||||
"@type": "Answer",
|
||||
"text": "The AegisSight Monitor is a German AI-driven OSINT monitoring software that continuously evaluates hundreds of open sources and generates structured real-time situation reports with automatic fact-checking."
|
||||
}
|
||||
},
|
||||
{
|
||||
"@type": "Question",
|
||||
"name": "What is a situation report?",
|
||||
"acceptedAnswer": {
|
||||
"@type": "Answer",
|
||||
"text": "A situation report is the structured summary of the current factual status of an event or conflict, compiled from multiple independent sources, with timeline, source references and geographic mapping."
|
||||
}
|
||||
},
|
||||
{
|
||||
"@type": "Question",
|
||||
"name": "Which sources does AegisSight evaluate?",
|
||||
"acceptedAnswer": {
|
||||
"@type": "Answer",
|
||||
"text": "AegisSight evaluates hundreds of publicly accessible sources worldwide, including news agencies, specialist media, government statements and social media. Content in dozens of languages is automatically translated, including Farsi, Arabic and Hebrew."
|
||||
}
|
||||
},
|
||||
{
|
||||
"@type": "Question",
|
||||
"name": "How does the automatic fact-checking work?",
|
||||
"acceptedAnswer": {
|
||||
"@type": "Answer",
|
||||
"text": "Every central claim is automatically cross-checked against multiple independent sources. Agreements, contradictions and the trustworthiness of the sources feed into a transparent rating that is linked to the original sources in the situation report."
|
||||
}
|
||||
},
|
||||
{
|
||||
"@type": "Question",
|
||||
"name": "Is AegisSight GDPR-compliant?",
|
||||
"acceptedAnswer": {
|
||||
"@type": "Answer",
|
||||
"text": "AegisSight runs entirely on servers in Germany and processes only publicly accessible sources. No data is transferred to third countries."
|
||||
}
|
||||
},
|
||||
{
|
||||
"@type": "Question",
|
||||
"name": "Who is the AegisSight Monitor designed for?",
|
||||
"acceptedAnswer": {
|
||||
"@type": "Answer",
|
||||
"text": "The AegisSight Monitor is designed for authorities, newsrooms and security services that need reliable real-time situation reports, including crisis response teams, investigative newsrooms, corporate security and physical-security operations."
|
||||
}
|
||||
},
|
||||
{
|
||||
"@type": "Question",
|
||||
"name": "How do I get access to the AegisSight Monitor?",
|
||||
"acceptedAnswer": {
|
||||
"@type": "Answer",
|
||||
"text": "Access is granted on individual request; pilot access is available for qualified organisations. Contact: info@aegis-sight.de."
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<!-- Navigation -->
|
||||
<nav class="navbar" id="navbar">
|
||||
<div class="nav-container">
|
||||
<a href="#hero" class="nav-logo">
|
||||
<img src="/assets/images/logos/Logo+Schrift_Rechts.svg" alt="AegisSight" class="logo-img" width="200" height="40">
|
||||
</a>
|
||||
<ul class="nav-menu">
|
||||
<li><a href="#features">Features</a></li>
|
||||
<li><a href="#solutions">Solutions</a></li>
|
||||
<li><a href="#demos">Live Reports</a></li>
|
||||
<li><a href="#trust">About Us</a></li>
|
||||
<li><a href="#faq">FAQ</a></li>
|
||||
<li><a href="#contact">Contact</a></li>
|
||||
</ul>
|
||||
<div class="nav-extras">
|
||||
<div class="lang-switcher" role="group" aria-label="Language">
|
||||
<a class="lang-link" href="/" 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></span><span></span><span></span>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<!-- Mobile Menu -->
|
||||
<div class="mobile-menu" id="mobile-menu" aria-hidden="true">
|
||||
<ul>
|
||||
<li><a href="#features">Features</a></li>
|
||||
<li><a href="#solutions">Solutions</a></li>
|
||||
<li><a href="#demos">Live Reports</a></li>
|
||||
<li><a href="#trust">About Us</a></li>
|
||||
<li><a href="#faq">FAQ</a></li>
|
||||
<li><a href="#contact">Contact</a></li>
|
||||
</ul>
|
||||
<div class="lang-switcher" role="group" aria-label="Language">
|
||||
<a class="lang-link" href="/" 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-overlay" id="mobile-overlay"></div>
|
||||
|
||||
<!-- Hero Section -->
|
||||
<section class="hero" id="hero">
|
||||
<div class="hero-overlay"></div>
|
||||
<div class="hero-content">
|
||||
<div class="hero-brand">
|
||||
<h1 class="hero-title">AegisSight Monitor</h1>
|
||||
<p class="hero-tagline">The OSINT software for AI-powered real-time situation reports from open sources, <span class="gold">fully automated.</span></p>
|
||||
</div>
|
||||
|
||||
<div class="hero-slider" role="region" aria-label="Product highlights" aria-live="polite">
|
||||
<!-- Slide 1: Real-time monitoring (Video) -->
|
||||
<div class="hero-slide active" data-slide="0">
|
||||
<div class="hero-slide-video">
|
||||
<video muted playsinline preload="auto">
|
||||
<source src="/videos/hero-slide-1-monitoring.mp4" type="video/mp4">
|
||||
</video>
|
||||
</div>
|
||||
<div class="hero-slide-bottom">
|
||||
<p class="hero-slide-example">Live example: The Iran conflict is continuously monitored with over 14,900 articles from 375 sources.</p>
|
||||
<div class="hero-slide-cta">
|
||||
<a href="#demos" class="btn btn-primary" onclick="positionCards(0)">View live example</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Slide 2: Automated fact-checking (Video) -->
|
||||
<div class="hero-slide" data-slide="1">
|
||||
<div class="hero-slide-video">
|
||||
<video muted playsinline preload="none">
|
||||
<source src="/videos/hero-slide-2-monitoring.mp4?v=3" type="video/mp4">
|
||||
</video>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Slide 3: AI-powered research (Video) -->
|
||||
<div class="hero-slide" data-slide="2">
|
||||
<div class="hero-slide-video">
|
||||
<video muted playsinline preload="none">
|
||||
<source src="/videos/hero-slide-3-monitoring.mp4?v=2" type="video/mp4">
|
||||
</video>
|
||||
</div>
|
||||
<div class="hero-slide-bottom">
|
||||
<p class="hero-slide-example">Example: A dossier on the legal status of deepfakes in Germany, 121 articles from 90 sources, automatically generated.</p>
|
||||
<div class="hero-slide-cta">
|
||||
<a href="#demos" class="btn btn-primary" onclick="positionCards(2)">View research example</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Slide 4: Global source coverage (Video) -->
|
||||
<div class="hero-slide" data-slide="3">
|
||||
<div class="hero-slide-video">
|
||||
<video muted playsinline preload="none">
|
||||
<source src="/videos/hero-slide-4-monitoring.mp4" type="video/mp4">
|
||||
</video>
|
||||
</div>
|
||||
<div class="hero-slide-bottom">
|
||||
<p class="hero-slide-example">In the Iran conflict, primary sources in Farsi, Arabic, and Hebrew are analysed directly.</p>
|
||||
<div class="hero-slide-cta">
|
||||
<a href="#demos" class="btn btn-primary" onclick="positionCards(0)">View live example</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Slide 5: Flexible deployment (Video) -->
|
||||
<div class="hero-slide" data-slide="4">
|
||||
<div class="hero-slide-video">
|
||||
<video muted playsinline preload="none">
|
||||
<source src="/videos/hero-slide-5-monitoring.mp4?v=2" type="video/mp4">
|
||||
</video>
|
||||
</div>
|
||||
<div class="hero-slide-bottom">
|
||||
<p class="hero-slide-example">Example: Cyberattacks on German infrastructure, 93 articles from 41 sources, monitored automatically.</p>
|
||||
<div class="hero-slide-cta">
|
||||
<a href="#demos" class="btn btn-primary" onclick="positionCards(1)">View live example</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="hero-slider-nav">
|
||||
<div class="hero-slider-dots">
|
||||
<button class="hero-dot active" data-slide="0" aria-label="Real-time monitoring"></button>
|
||||
<button class="hero-dot" data-slide="1" aria-label="Fact check"></button>
|
||||
<button class="hero-dot" data-slide="2" aria-label="AI-powered research"></button>
|
||||
<button class="hero-dot" data-slide="3" aria-label="Global coverage"></button>
|
||||
<button class="hero-dot" data-slide="4" aria-label="Flexible deployment"></button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="hero-slider-arrows">
|
||||
<button class="hero-arrow hero-arrow-prev" aria-label="Previous slide">←</button>
|
||||
<button class="hero-arrow hero-arrow-next" aria-label="Next slide">→</button>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Solutions / Use cases -->
|
||||
<style>
|
||||
#solutions .loesungen-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)); gap: 20px; margin-top: 8px; }
|
||||
#solutions .loesung-card { display: block; background: var(--white); border: 1px solid var(--gray-100); border-radius: var(--radius-lg); padding: 26px 28px; text-decoration: none; box-shadow: var(--shadow); transition: transform .2s, box-shadow .2s; }
|
||||
#solutions .loesung-card:hover { transform: translateY(-3px); box-shadow: 0 8px 24px rgba(10,24,50,0.12); }
|
||||
#solutions .loesung-card h3 { color: var(--navy); font-size: 1.2rem; margin: 0 0 10px; }
|
||||
#solutions .loesung-card p { color: var(--text-light); font-size: 0.97rem; line-height: 1.6; margin: 0 0 14px; }
|
||||
#solutions .loesung-more { color: var(--gold-dark); font-weight: 600; font-size: 0.95rem; }
|
||||
#solutions .loesung-card:hover .loesung-more { color: var(--gold); }
|
||||
#solutions .loesungen-intro { text-align: center; max-width: 680px; margin: 0 auto 2.5rem; color: var(--text-light); line-height: 1.7; }
|
||||
</style>
|
||||
<section class="section section-base" id="solutions">
|
||||
<div class="container">
|
||||
<h2 class="section-title">Solutions for your field of use</h2>
|
||||
<p class="loesungen-intro">AegisSight covers different OSINT use cases – from automated situational analysis and disinformation monitoring to crisis monitoring for government.</p>
|
||||
<div class="loesungen-grid">
|
||||
<a class="loesung-card" href="/en/solutions/osint-situational-awareness-software/">
|
||||
<h3>OSINT & Situational Awareness Software</h3>
|
||||
<p>Automatically evaluate hundreds of open sources and turn them into structured real-time situation reports.</p>
|
||||
<span class="loesung-more">Learn more ›</span>
|
||||
</a>
|
||||
<a class="loesung-card" href="/en/solutions/disinformation-monitoring/">
|
||||
<h3>Disinformation Monitoring & FIMI</h3>
|
||||
<p>Detect manipulation and foreign interference early – with fact-checking and source assessment.</p>
|
||||
<span class="loesung-more">Learn more ›</span>
|
||||
</a>
|
||||
<a class="loesung-card" href="/en/solutions/social-media-monitoring-government/">
|
||||
<h3>Social Media & Crisis Monitoring</h3>
|
||||
<p>Provide crisis teams with an automatically updated situation report from social media and open sources.</p>
|
||||
<span class="loesung-more">Learn more ›</span>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Features -->
|
||||
<section class="section section-dark" id="features">
|
||||
<div class="container">
|
||||
<h2 class="section-title">What the Monitor delivers</h2>
|
||||
<!-- Highlight: Fact-checking -->
|
||||
<div class="feature-statement">
|
||||
<p class="feature-statement-text">Every claim is automatically verified against independent sources.</p>
|
||||
<p class="feature-statement-sub">Status history, evidence, and source attribution. Automated and traceable.</p>
|
||||
</div>
|
||||
|
||||
<div class="grid-3">
|
||||
<div class="feature-card">
|
||||
<div class="feature-icon">
|
||||
<img loading="lazy" src="/assets/images/icons/monitor.svg" alt="" width="36" height="36">
|
||||
</div>
|
||||
<h3>Real-time monitoring</h3>
|
||||
<p>Continuous monitoring of your defined sources, around the clock.</p>
|
||||
</div>
|
||||
|
||||
<div class="feature-card">
|
||||
<div class="feature-icon">
|
||||
<img loading="lazy" src="/assets/images/icons/cube.svg" alt="" width="36" height="36">
|
||||
</div>
|
||||
<h3>Source analysis</h3>
|
||||
<p>Automatic aggregation and deduplication from hundreds of international sources.</p>
|
||||
</div>
|
||||
<div class="feature-card">
|
||||
<div class="feature-icon">
|
||||
<img loading="lazy" src="/assets/images/icons/location.svg" alt="" width="36" height="36">
|
||||
</div>
|
||||
<h3>Geographic mapping</h3>
|
||||
<p>Locations are recognised and shown on an interactive map.</p>
|
||||
</div>
|
||||
<div class="feature-card">
|
||||
<div class="feature-icon">
|
||||
<img loading="lazy" src="/assets/images/icons/languages.svg" alt="" width="36" height="36">
|
||||
</div>
|
||||
<h3>Multilingual analysis</h3>
|
||||
<p>Sources in different languages are processed and merged automatically.</p>
|
||||
</div>
|
||||
<div class="feature-card">
|
||||
<div class="feature-icon">
|
||||
<img loading="lazy" src="/assets/images/icons/document.svg" alt="" width="36" height="36">
|
||||
</div>
|
||||
<h3>Structured situation reports</h3>
|
||||
<p>Concise summaries with source attribution and timeline.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Gradient: Features -> Problem -->
|
||||
<div class="divider divider-gradient-dark-to-base"></div>
|
||||
|
||||
<!-- Problem Statement -->
|
||||
<section class="section section-base" id="problem">
|
||||
<div class="container">
|
||||
<h2 class="section-title">Why manual OSINT analysis does not scale</h2>
|
||||
<p class="section-subtitle">Analysts in security agencies, newsrooms, and companies face the same challenge every day.</p>
|
||||
<div class="grid-3">
|
||||
<div class="problem-card">
|
||||
<div class="problem-icon">
|
||||
<img loading="lazy" src="/assets/images/icons/world-globe.svg" alt="" width="40" height="40">
|
||||
</div>
|
||||
<h3>Source diversity</h3>
|
||||
<p>Hundreds of news agencies, Telegram channels, and social media in dozens of languages. No analyst can monitor everything at once.</p>
|
||||
</div>
|
||||
<div class="problem-card">
|
||||
<div class="problem-icon">
|
||||
<img loading="lazy" src="/assets/images/icons/clock.svg" alt="" width="40" height="40">
|
||||
</div>
|
||||
<h3>Time pressure</h3>
|
||||
<p>New reports arrive by the minute. Manual analysis takes time you do not have.</p>
|
||||
</div>
|
||||
<div class="problem-card">
|
||||
<div class="problem-icon">
|
||||
<img loading="lazy" src="/assets/images/icons/document.svg" alt="" width="40" height="40">
|
||||
</div>
|
||||
<h3>Information overload</h3>
|
||||
<p>Critical information disappears in the noise; connections remain invisible.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Gradient: Problem -> Workflow -->
|
||||
<div class="divider divider-gradient-base-to-alt"></div>
|
||||
|
||||
<!-- Solution / Workflow -->
|
||||
<section class="section section-alt" id="solution">
|
||||
<div class="container">
|
||||
<h2 class="section-title">How the AegisSight Monitor works</h2>
|
||||
<div class="workflow">
|
||||
<div class="workflow-step">
|
||||
<div class="step-number">1</div>
|
||||
<h3>Collect</h3>
|
||||
<p>Hundreds of sources are continuously monitored. News agencies, Telegram, social media, and more.</p>
|
||||
</div>
|
||||
<div class="workflow-connector"></div>
|
||||
<div class="workflow-step">
|
||||
<div class="step-number">2</div>
|
||||
<h3>Analyse</h3>
|
||||
<p>Reports are automatically evaluated, fact-checked, and geographically mapped.</p>
|
||||
</div>
|
||||
<div class="workflow-connector"></div>
|
||||
<div class="workflow-step">
|
||||
<div class="step-number">3</div>
|
||||
<h3>Report</h3>
|
||||
<p>Structured situation reports with source attribution, fact checks, and map view. In real time.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Gradient: Solution -> Demos -->
|
||||
<div class="divider divider-gradient-alt-to-base"></div>
|
||||
|
||||
<!-- Live Demos / Showcase -->
|
||||
<section class="section section-base" id="demos">
|
||||
<div class="container">
|
||||
<!-- Live Stats Bar -->
|
||||
<div class="live-stats-bar">
|
||||
<div class="live-stats-title">Major situation - Iran conflict</div>
|
||||
<div class="live-stats-row">
|
||||
<div class="live-stat">
|
||||
<span class="live-stat-value" id="stat-articles">...</span>
|
||||
<span class="live-stat-label">Articles</span>
|
||||
</div>
|
||||
<div class="live-stat">
|
||||
<span class="live-stat-value" id="stat-sources">...</span>
|
||||
<span class="live-stat-label">Sources</span>
|
||||
</div>
|
||||
<div class="live-stat">
|
||||
<span class="live-stat-value" id="stat-factchecks">...</span>
|
||||
<span class="live-stat-label">Fact checks</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 3D Carousel -->
|
||||
<div class="carousel-viewport">
|
||||
<button class="carousel-arrow carousel-prev" aria-label="Previous situation">‹</button>
|
||||
<button class="carousel-arrow carousel-next" aria-label="Next situation">›</button>
|
||||
<div class="carousel-track" id="carousel">
|
||||
<!-- Iran Card -->
|
||||
<div class="carousel-card card-live active" data-index="0" data-lage="iran-konflikt">
|
||||
<div class="demo-badge">LIVE</div>
|
||||
<h3 class="demo-title">Iran conflict</h3>
|
||||
|
||||
<div class="demo-excerpt" id="demo-excerpt">
|
||||
<div class="excerpt-text" id="excerpt-text">Situation report loading...</div>
|
||||
</div>
|
||||
<a href="/en/situations/iran-conflict/" class="btn btn-primary btn-block">Open full situation report</a>
|
||||
</div>
|
||||
<!-- Cyberattacks -->
|
||||
<div class="carousel-card card-live" data-index="1" data-lage="cyberangriffe">
|
||||
<div class="demo-badge">LIVE</div>
|
||||
<h3 class="demo-title">Cyberattacks on German infrastructure</h3>
|
||||
|
||||
<div class="demo-excerpt" id="demo-excerpt-cyberangriffe">
|
||||
<div class="excerpt-text" id="excerpt-text-cyberangriffe">Situation report loading...</div>
|
||||
</div>
|
||||
<a href="/en/situations/cyber-attacks/" class="btn btn-primary btn-block">Open full situation report</a>
|
||||
</div>
|
||||
<!-- Deepfakes Research -->
|
||||
<div class="carousel-card card-live" data-index="2" data-lage="deepfakes">
|
||||
<div class="demo-badge">RESEARCH</div>
|
||||
<h3 class="demo-title">Legal status of deepfakes in Germany</h3>
|
||||
|
||||
<div class="demo-excerpt" id="demo-excerpt-deepfakes">
|
||||
<div class="excerpt-text" id="excerpt-text-deepfakes">Research loading...</div>
|
||||
</div>
|
||||
<a href="/en/situations/deepfakes/" class="btn btn-primary btn-block">Open full research</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="carousel-nav">
|
||||
<button class="carousel-dot active" data-index="0"></button>
|
||||
<button class="carousel-dot" data-index="1"></button>
|
||||
<button class="carousel-dot" data-index="2"></button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Map -->
|
||||
<div class="map-section" id="map-section">
|
||||
<h3 class="map-title" id="map-title">Geographic distribution of reports</h3>
|
||||
<div id="map-container"></div>
|
||||
<div class="map-empty" id="map-empty" style="display:none">Map data follows</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Gradient: Demos -> Contact -->
|
||||
<div class="divider"></div>
|
||||
|
||||
<!-- Contact CTA -->
|
||||
<section class="section section-base" id="contact">
|
||||
<div class="container cta-container">
|
||||
<h2 class="section-title">Interested in AegisSight Monitor?</h2>
|
||||
<p class="cta-text">Talk to us about your use case.</p>
|
||||
<button class="btn btn-primary btn-lg" onclick="openContactModal()">Get in touch</button>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Diagonal: Contact -> Trust -->
|
||||
<div class="divider divider-diagonal-dark">
|
||||
<svg viewBox="0 0 1440 60" preserveAspectRatio="none"><path d="M0,60 L1440,0 L1440,60 Z" fill="#132844"/></svg>
|
||||
</div>
|
||||
|
||||
<!-- Trust / Our Commitment -->
|
||||
<section class="section section-dark" id="trust">
|
||||
<div class="container">
|
||||
<h2 class="section-title">Our commitment</h2>
|
||||
<div class="grid-4 trust-grid">
|
||||
<div class="trust-card">
|
||||
<div class="trust-icon-wrap">
|
||||
<img loading="lazy" src="/assets/images/icons/check-circle-filled.svg" alt="" width="48" height="48">
|
||||
</div>
|
||||
<h3>Close collaboration</h3>
|
||||
<p>We work hand in hand with our customers to deliver tailored solutions</p>
|
||||
</div>
|
||||
<div class="trust-card">
|
||||
<div class="trust-icon-wrap trust-flag">
|
||||
<img loading="lazy" src="/assets/images/icons/german-flag.svg" alt="" width="60" height="36">
|
||||
</div>
|
||||
<h3>Made in Germany</h3>
|
||||
<p>Clear, robust, and secure software built to German quality standards</p>
|
||||
</div>
|
||||
<div class="trust-card">
|
||||
<div class="trust-icon-wrap">
|
||||
<img loading="lazy" src="/assets/handshake.svg" alt="" width="50" height="50">
|
||||
</div>
|
||||
<h3>Reliable partnership</h3>
|
||||
<p>Based on shared values and long-term trust</p>
|
||||
</div>
|
||||
<div class="trust-card">
|
||||
<div class="trust-icon-wrap">
|
||||
<img loading="lazy" src="/assets/images/icons/shield-check.svg" alt="" width="48" height="48">
|
||||
</div>
|
||||
<h3>Sustainability</h3>
|
||||
<p>Focus on security, professionalism, and future-proof solutions</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- FAQ-Section (AEO/GEO: quotable answers in DOM and FAQPage-JSON-LD) -->
|
||||
<section class="faq-section" id="faq" aria-labelledby="faq-title">
|
||||
<div class="container">
|
||||
<h2 class="section-title" id="faq-title">Frequently Asked Questions</h2>
|
||||
<p class="faq-intro">The key answers about AegisSight Monitor at a glance.</p>
|
||||
|
||||
<details class="faq-item">
|
||||
<summary>What is the AegisSight Monitor?</summary>
|
||||
<p class="faq-answer">The AegisSight Monitor is a German AI-driven OSINT monitoring software that continuously evaluates hundreds of open sources and generates structured real-time situation reports with automatic fact-checking.</p>
|
||||
</details>
|
||||
|
||||
<details class="faq-item">
|
||||
<summary>What is a situation report?</summary>
|
||||
<p class="faq-answer">A situation report is the structured summary of the current factual status of an event or conflict, compiled from multiple independent sources, with timeline, source references and geographic mapping. Examples are available in the <a href="#demos">live reports</a>.</p>
|
||||
</details>
|
||||
|
||||
<details class="faq-item">
|
||||
<summary>Which sources does AegisSight evaluate?</summary>
|
||||
<p class="faq-answer">AegisSight evaluates hundreds of publicly accessible sources worldwide, including news agencies, specialist media, government statements and social media. Content in dozens of languages is automatically translated, including Farsi, Arabic and Hebrew.</p>
|
||||
</details>
|
||||
|
||||
<details class="faq-item">
|
||||
<summary>How does the automatic fact-checking work?</summary>
|
||||
<p class="faq-answer">Every central claim is automatically cross-checked against multiple independent sources. Agreements, contradictions and the trustworthiness of the sources feed into a transparent rating that is linked to the original sources in the situation report.</p>
|
||||
</details>
|
||||
|
||||
<details class="faq-item">
|
||||
<summary>Is AegisSight GDPR-compliant?</summary>
|
||||
<p class="faq-answer">AegisSight runs entirely on servers in Germany and processes only publicly accessible sources. No data is transferred to third countries.</p>
|
||||
</details>
|
||||
|
||||
<details class="faq-item">
|
||||
<summary>Who is the AegisSight Monitor designed for?</summary>
|
||||
<p class="faq-answer">The AegisSight Monitor is designed for authorities, newsrooms and security services that need reliable real-time situation reports, including crisis response teams, investigative newsrooms, corporate security and physical-security operations.</p>
|
||||
</details>
|
||||
|
||||
<details class="faq-item">
|
||||
<summary>How do I get access to the AegisSight Monitor?</summary>
|
||||
<p class="faq-answer">Access is granted on individual request; pilot access is available for qualified organisations. Contact: <a href="mailto:info@aegis-sight.de">info@aegis-sight.de</a>.</p>
|
||||
</details>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Footer -->
|
||||
<footer class="footer">
|
||||
<div class="container">
|
||||
<div class="footer-content">
|
||||
<div class="footer-info">
|
||||
<p class="footer-company">AegisSight UG (haftungsbeschränkt)</p>
|
||||
<p>Gladbacher Straße 3-5, 40764 Langenfeld, Germany</p>
|
||||
</div>
|
||||
<div class="footer-links">
|
||||
<a href="/en/legal-notice.html">Legal notice</a>
|
||||
<a href="/en/privacy.html">Privacy policy</a>
|
||||
<a href="#" id="cookie-settings-link">Cookie settings</a>
|
||||
</div>
|
||||
</div>
|
||||
<p class="footer-copyright">© <span id="footer-year">2026</span> AegisSight UG (haftungsbeschränkt). All rights reserved.</p>
|
||||
</div>
|
||||
</footer>
|
||||
<script>document.getElementById('footer-year').textContent=new Date().getFullYear();</script>
|
||||
|
||||
|
||||
<!-- Contact Modal -->
|
||||
<div class="modal-overlay" id="contact-modal" style="display:none">
|
||||
<div class="modal-content">
|
||||
<button class="modal-close" onclick="closeContactModal()" aria-label="Close">×</button>
|
||||
<h2>Get in touch</h2>
|
||||
<p class="modal-sub">Talk to us about your use case.</p>
|
||||
<form id="contact-form" onsubmit="return submitContact(event)">
|
||||
<div class="form-row">
|
||||
<div class="form-group">
|
||||
<label for="cf-name">Name</label>
|
||||
<input type="text" id="cf-name" name="name" required>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="cf-org">Organisation</label>
|
||||
<input type="text" id="cf-org" name="organisation">
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="cf-email">Email</label>
|
||||
<input type="email" id="cf-email" name="email" required>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="cf-message">Message</label>
|
||||
<textarea id="cf-message" name="message" rows="4" required></textarea>
|
||||
</div>
|
||||
<button type="submit" class="btn btn-primary btn-block">Send message</button>
|
||||
</form>
|
||||
<div class="form-success" id="form-success" style="display:none">
|
||||
<p>Thank you for your message. We will get back to you shortly.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script src="/assets/vendor/leaflet/leaflet.js"></script>
|
||||
<script src="/assets/vendor/leaflet/leaflet.markercluster.js"></script>
|
||||
<script src="/js/app.js"></script>
|
||||
<script src="/cookie-consent.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
177
en/legal-notice.html
Normale Datei
@@ -0,0 +1,177 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<meta name="robots" content="noindex, follow">
|
||||
<meta name="theme-color" content="#0A1832">
|
||||
<meta name="author" content="AegisSight UG">
|
||||
<title>Legal notice – AegisSight</title>
|
||||
|
||||
<!-- Exclude legal pages from search engines -->
|
||||
<meta name="googlebot" content="noindex, nofollow, noarchive, nosnippet, noimageindex">
|
||||
|
||||
<link rel="alternate" hreflang="de" href="https://aegis-sight.de/impressum.html">
|
||||
<link rel="alternate" hreflang="en" href="https://aegis-sight.de/en/legal-notice.html">
|
||||
<link rel="alternate" hreflang="x-default" href="https://aegis-sight.de/impressum.html">
|
||||
|
||||
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
|
||||
<link rel="apple-touch-icon" href="/assets/images/logos/AegisSightLogo_NavyGold.svg">
|
||||
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">
|
||||
|
||||
<link rel="stylesheet" href="/css/style.css">
|
||||
<link rel="stylesheet" href="/css/lang-switcher.css">
|
||||
<link rel="stylesheet" href="/cookie-consent.css">
|
||||
<style>
|
||||
body { font-family: 'Inter', -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; background: var(--white); margin: 0; }
|
||||
.legal-page { padding: calc(var(--nav-height) + 56px) 0 80px; min-height: calc(100vh - 220px); }
|
||||
.legal-container { max-width: 820px; margin: 0 auto; padding: 0 24px; }
|
||||
.legal-container h1 { font-size: 2.25rem; font-weight: 700; color: var(--navy); margin: 0 0 12px; }
|
||||
.legal-meta { color: var(--text-light); margin: 0 0 32px; font-size: 0.95rem; }
|
||||
.legal-content { background: var(--base); border-radius: var(--radius-lg); padding: 32px 40px; box-shadow: var(--shadow); border: 1px solid var(--gray-100); }
|
||||
.legal-section { margin-bottom: 28px; }
|
||||
.legal-section:last-child { margin-bottom: 0; }
|
||||
.legal-section h2 { font-size: 1.35rem; font-weight: 700; color: var(--navy); margin: 0 0 14px; padding-bottom: 8px; border-bottom: 2px solid var(--gold); }
|
||||
.legal-section h3 { font-size: 1.05rem; font-weight: 600; color: var(--navy); margin: 22px 0 8px; }
|
||||
.legal-section p { margin: 0 0 12px; line-height: 1.7; color: var(--text); font-size: 0.95rem; }
|
||||
.legal-section a { color: var(--gold-dark); text-decoration: underline; }
|
||||
.legal-section a:hover { color: var(--gold); }
|
||||
.legal-section ul { margin: 12px 0 16px 22px; padding: 0; }
|
||||
.legal-section li { margin-bottom: 6px; line-height: 1.6; color: var(--text); font-size: 0.95rem; }
|
||||
.legal-section strong { color: var(--navy); font-weight: 600; }
|
||||
.legal-section table { width: 100%; border-collapse: collapse; margin: 12px 0 16px; }
|
||||
.legal-section td, .legal-section th { padding: 8px 12px; border: 1px solid var(--gray-200); text-align: left; font-size: 0.92rem; }
|
||||
.source-note { margin-top: 40px; padding-top: 16px; border-top: 1px solid var(--gray-200); font-size: 0.85rem; color: var(--text-light); }
|
||||
.source-note a { color: var(--gold-dark); }
|
||||
.translation-note { margin: 0 0 32px; padding: 14px 18px; background: rgba(200, 168, 81, 0.08); border-left: 3px solid var(--gold); font-size: 0.92rem; color: var(--text); line-height: 1.6; }
|
||||
@media (max-width: 768px) {
|
||||
.legal-container { padding: 0 16px; }
|
||||
.legal-content { padding: 24px 20px; }
|
||||
.legal-container h1 { font-size: 1.75rem; }
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<!-- Navigation -->
|
||||
<nav class="navbar" id="navbar">
|
||||
<div class="nav-container">
|
||||
<a href="/en/" class="nav-logo">
|
||||
<img src="/assets/images/logos/Logo+Schrift_Rechts.svg" alt="AegisSight" class="logo-img" width="200" height="40">
|
||||
</a>
|
||||
<ul class="nav-menu">
|
||||
<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 class="nav-extras">
|
||||
<div class="lang-switcher" role="group" aria-label="Language">
|
||||
<a class="lang-link" href="/impressum.html" 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></span><span></span><span></span>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<!-- Mobile Menu -->
|
||||
<div class="mobile-menu" id="mobile-menu" aria-hidden="true">
|
||||
<ul>
|
||||
<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 class="lang-switcher" role="group" aria-label="Language">
|
||||
<a class="lang-link" href="/impressum.html" 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-overlay" id="mobile-overlay"></div>
|
||||
|
||||
<main class="legal-page">
|
||||
<div class="legal-container">
|
||||
<h1>Legal notice</h1>
|
||||
<p class="translation-note">This is a translation of our German legal notice provided for convenience. In the event of any conflict, the <a href="/impressum.html">German version</a> shall prevail.</p>
|
||||
|
||||
<div class="legal-section">
|
||||
<h2>Information pursuant to § 5 TMG</h2>
|
||||
<p><strong>AegisSight UG (haftungsbeschränkt)</strong></p>
|
||||
<p>Gladbacher Strasse 3-5<br>
|
||||
40764 Langenfeld<br>
|
||||
Germany</p>
|
||||
</div>
|
||||
|
||||
<div class="legal-section">
|
||||
<h2>Represented by</h2>
|
||||
<p>Hendrik Gebhardt<br>
|
||||
Monami Homma</p>
|
||||
</div>
|
||||
|
||||
<div class="legal-section">
|
||||
<h2>Contact</h2>
|
||||
<p>Email: info@aegis-sight.de</p>
|
||||
</div>
|
||||
|
||||
<div class="legal-section">
|
||||
<h2>Registry entry</h2>
|
||||
<p>Commercial register: HRB 110105<br>
|
||||
Registry court: District Court of Düsseldorf</p>
|
||||
</div>
|
||||
|
||||
<div class="legal-section">
|
||||
<h2>VAT identification number</h2>
|
||||
<p>VAT identification number pursuant to § 27 a of the German Value Added Tax Act:<br>
|
||||
DE457846602</p>
|
||||
</div>
|
||||
|
||||
<div class="legal-section">
|
||||
<h2>Consumer dispute resolution / universal arbitration board</h2>
|
||||
<p>We are not willing or obliged to participate in dispute resolution proceedings before a consumer arbitration board.</p>
|
||||
</div>
|
||||
|
||||
<div class="legal-section">
|
||||
<h2>Disclaimer</h2>
|
||||
<p><strong>Liability for content</strong><br>
|
||||
The content on our pages has been created with the utmost care. However, we cannot guarantee that the content is accurate, complete, or up to date. As a service provider, we are responsible for our own content on these pages in accordance with general laws pursuant to § 7 (1) TMG. According to §§ 8 to 10 TMG, however, we as a service provider are not obliged to monitor transmitted or stored third-party information or to investigate circumstances that indicate illegal activity.</p>
|
||||
|
||||
<p><strong>Liability for links</strong><br>
|
||||
Our offer contains links to external third-party websites whose content we have no influence over. For this reason, we cannot assume any liability for this third-party content. The respective provider or operator of the linked pages is always responsible for their content.</p>
|
||||
|
||||
<p><strong>Copyright</strong><br>
|
||||
The content and works on these pages created by the site operators are subject to German copyright law. Reproduction, processing, distribution, and any kind of exploitation outside the limits of copyright law require the written consent of the respective author or creator.</p>
|
||||
|
||||
<p class="source-note">Source: <a href="https://www.e-recht24.de" target="_blank" rel="noopener">eRecht24</a></p>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
|
||||
<!-- Footer -->
|
||||
<footer class="footer">
|
||||
<div class="container">
|
||||
<div class="footer-content">
|
||||
<div class="footer-info">
|
||||
<p class="footer-company">AegisSight UG (haftungsbeschränkt)</p>
|
||||
<p>Gladbacher Straße 3-5, 40764 Langenfeld, Germany</p>
|
||||
</div>
|
||||
<div class="footer-links">
|
||||
<a href="/en/legal-notice.html">Legal notice</a>
|
||||
<a href="/en/privacy.html">Privacy policy</a>
|
||||
<a href="#" id="cookie-settings-link">Cookie settings</a>
|
||||
</div>
|
||||
</div>
|
||||
<p class="footer-copyright">© <span id="footer-year">2026</span> AegisSight UG (haftungsbeschränkt). All rights reserved.</p>
|
||||
</div>
|
||||
</footer>
|
||||
<script>document.getElementById('footer-year').textContent=new Date().getFullYear();</script>
|
||||
<script src="/js/app.js"></script>
|
||||
<script src="/cookie-consent.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
304
en/privacy.html
Normale Datei
@@ -0,0 +1,304 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<meta name="robots" content="noindex, follow">
|
||||
<meta name="theme-color" content="#0A1832">
|
||||
<meta name="author" content="AegisSight UG">
|
||||
<title>Privacy policy – AegisSight</title>
|
||||
|
||||
<!-- Exclude legal pages from search engines -->
|
||||
<meta name="googlebot" content="noindex, nofollow, noarchive, nosnippet, noimageindex">
|
||||
|
||||
<link rel="alternate" hreflang="de" href="https://aegis-sight.de/datenschutz.html">
|
||||
<link rel="alternate" hreflang="en" href="https://aegis-sight.de/en/privacy.html">
|
||||
<link rel="alternate" hreflang="x-default" href="https://aegis-sight.de/datenschutz.html">
|
||||
|
||||
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
|
||||
<link rel="apple-touch-icon" href="/assets/images/logos/AegisSightLogo_NavyGold.svg">
|
||||
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">
|
||||
|
||||
<link rel="stylesheet" href="/css/style.css">
|
||||
<link rel="stylesheet" href="/css/lang-switcher.css">
|
||||
<link rel="stylesheet" href="/cookie-consent.css">
|
||||
<style>
|
||||
body { font-family: 'Inter', -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; background: var(--white); margin: 0; }
|
||||
.legal-page { padding: calc(var(--nav-height) + 56px) 0 80px; min-height: calc(100vh - 220px); }
|
||||
.legal-container { max-width: 820px; margin: 0 auto; padding: 0 24px; }
|
||||
.legal-container h1 { font-size: 2.25rem; font-weight: 700; color: var(--navy); margin: 0 0 12px; }
|
||||
.legal-meta { color: var(--text-light); margin: 0 0 32px; font-size: 0.95rem; }
|
||||
.legal-content { background: var(--base); border-radius: var(--radius-lg); padding: 32px 40px; box-shadow: var(--shadow); border: 1px solid var(--gray-100); }
|
||||
.legal-section { margin-bottom: 28px; }
|
||||
.legal-section:last-child { margin-bottom: 0; }
|
||||
.legal-section h2 { font-size: 1.35rem; font-weight: 700; color: var(--navy); margin: 0 0 14px; padding-bottom: 8px; border-bottom: 2px solid var(--gold); }
|
||||
.legal-section h3 { font-size: 1.05rem; font-weight: 600; color: var(--navy); margin: 22px 0 8px; }
|
||||
.legal-section p { margin: 0 0 12px; line-height: 1.7; color: var(--text); font-size: 0.95rem; }
|
||||
.legal-section a { color: var(--gold-dark); text-decoration: underline; }
|
||||
.legal-section a:hover { color: var(--gold); }
|
||||
.legal-section ul { margin: 12px 0 16px 22px; padding: 0; }
|
||||
.legal-section li { margin-bottom: 6px; line-height: 1.6; color: var(--text); font-size: 0.95rem; }
|
||||
.legal-section strong { color: var(--navy); font-weight: 600; }
|
||||
.legal-section table { width: 100%; border-collapse: collapse; margin: 12px 0 16px; }
|
||||
.legal-section td, .legal-section th { padding: 8px 12px; border: 1px solid var(--gray-200); text-align: left; font-size: 0.92rem; }
|
||||
.source-note { margin-top: 40px; padding-top: 16px; border-top: 1px solid var(--gray-200); font-size: 0.85rem; color: var(--text-light); }
|
||||
.source-note a { color: var(--gold-dark); }
|
||||
.translation-note { margin: 0 0 32px; padding: 14px 18px; background: rgba(200, 168, 81, 0.08); border-left: 3px solid var(--gold); font-size: 0.92rem; color: var(--text); line-height: 1.6; }
|
||||
@media (max-width: 768px) {
|
||||
.legal-container { padding: 0 16px; }
|
||||
.legal-content { padding: 24px 20px; }
|
||||
.legal-container h1 { font-size: 1.75rem; }
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<!-- Navigation -->
|
||||
<nav class="navbar" id="navbar">
|
||||
<div class="nav-container">
|
||||
<a href="/en/" class="nav-logo">
|
||||
<img src="/assets/images/logos/Logo+Schrift_Rechts.svg" alt="AegisSight" class="logo-img" width="200" height="40">
|
||||
</a>
|
||||
<ul class="nav-menu">
|
||||
<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 class="nav-extras">
|
||||
<div class="lang-switcher" role="group" aria-label="Language">
|
||||
<a class="lang-link" href="/datenschutz.html" 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></span><span></span><span></span>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<!-- Mobile Menu -->
|
||||
<div class="mobile-menu" id="mobile-menu" aria-hidden="true">
|
||||
<ul>
|
||||
<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 class="lang-switcher" role="group" aria-label="Language">
|
||||
<a class="lang-link" href="/datenschutz.html" 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-overlay" id="mobile-overlay"></div>
|
||||
|
||||
<main class="legal-page">
|
||||
<div class="legal-container">
|
||||
<h1>Privacy policy</h1>
|
||||
<p class="translation-note">This is a translation of our German privacy policy provided for convenience. In the event of any conflict, the <a href="/datenschutz.html">German version</a> shall prevail.</p>
|
||||
|
||||
<div class="legal-section">
|
||||
<h2>1. Privacy at a glance</h2>
|
||||
|
||||
<h3>General information</h3>
|
||||
<p>The following notes provide a simple overview of what happens to your personal data when you visit this website. Personal data is any data with which you can be personally identified. For detailed information on data protection, please refer to our privacy policy listed below this text.</p>
|
||||
|
||||
<h3>Data collection on this website</h3>
|
||||
<p><strong>Who is responsible for the data collection on this website?</strong></p>
|
||||
<p>Data processing on this website is carried out by the website operator. You can find their contact details in the section "Information on the responsible party" in this privacy policy.</p>
|
||||
|
||||
<p><strong>How do we collect your data?</strong></p>
|
||||
<p>Your data is collected, on the one hand, when you provide it to us. This may, for example, be data that you enter into a contact form.</p>
|
||||
<p>Other data is collected automatically or after your consent when you visit the website by our IT systems. This is primarily technical data (e.g. internet browser, operating system, or time of page access). This data is collected automatically as soon as you enter this website.</p>
|
||||
|
||||
<p><strong>What do we use your data for?</strong></p>
|
||||
<p>Part of the data is collected to ensure error-free provision of the website. Other data may be used to analyse your user behaviour. If contracts can be concluded or initiated via the website, the transmitted data is also processed for contract offers, orders, or other order requests.</p>
|
||||
|
||||
<p><strong>What rights do you have regarding your data?</strong></p>
|
||||
<p>You have the right at any time to receive information free of charge about the origin, recipients, and purpose of your stored personal data. You also have the right to request the correction or deletion of this data. If you have given consent to data processing, you can revoke this consent at any time for the future. Furthermore, you have the right to demand the restriction of the processing of your personal data under certain circumstances. You also have the right to lodge a complaint with the competent supervisory authority.</p>
|
||||
<p>You may contact us at any time regarding this and other questions on the subject of data protection.</p>
|
||||
|
||||
<h3>Analysis tools and tools from third-party providers</h3>
|
||||
<p>When you visit this website, your browsing behaviour can be statistically evaluated. This is mainly done with so-called analysis programs.</p>
|
||||
<p>Detailed information on these analysis programs can be found in the following privacy policy.</p>
|
||||
</div>
|
||||
|
||||
<div class="legal-section">
|
||||
<h2>2. Hosting</h2>
|
||||
<p>We host the content of our website with the following provider:</p>
|
||||
|
||||
<h3>Hetzner</h3>
|
||||
<p>The provider is Hetzner Online GmbH, Industriestr. 25, 91710 Gunzenhausen, Germany (hereinafter: Hetzner).</p>
|
||||
<p>For details, please refer to Hetzner's privacy policy: <a href="https://www.hetzner.com/legal/privacy-policy/" target="_blank" rel="noopener">https://www.hetzner.com/legal/privacy-policy/</a>.</p>
|
||||
<p>The use of Hetzner is based on Art. 6 (1) (f) GDPR. We have a legitimate interest in the most reliable presentation possible of our website. Where appropriate consent has been requested, processing is carried out exclusively on the basis of Art. 6 (1) (a) GDPR and § 25 (1) TDDDG (German Digital Services Data Protection Act), where consent includes the storage of cookies or access to information on the user's terminal device (e.g. device fingerprinting) within the meaning of the TDDDG. Consent can be revoked at any time.</p>
|
||||
</div>
|
||||
|
||||
<div class="legal-section">
|
||||
<h2>3. General information and mandatory disclosures</h2>
|
||||
|
||||
<h3>Data protection</h3>
|
||||
<p>The operators of these pages take the protection of your personal data very seriously. We treat your personal data confidentially and in accordance with the statutory data protection regulations and this privacy policy.</p>
|
||||
<p>When you use this website, various personal data is collected. Personal data is data with which you can be personally identified. This privacy policy explains what data we collect and what we use it for. It also explains how and for what purpose this is done.</p>
|
||||
<p>We point out that data transmission on the internet (e.g. when communicating by email) can have security gaps. Complete protection of data against access by third parties is not possible.</p>
|
||||
|
||||
<h3>Information on the responsible party</h3>
|
||||
<p>The party responsible for data processing on this website is:</p>
|
||||
<p>
|
||||
<strong>AegisSight UG (haftungsbeschränkt)</strong><br>
|
||||
Gladbacher Strasse 3-5<br>
|
||||
40764 Langenfeld<br>
|
||||
Germany<br><br>
|
||||
Email: info@aegis-sight.de
|
||||
</p>
|
||||
<p>The responsible party is the natural or legal person who, alone or jointly with others, decides on the purposes and means of processing personal data (e.g. names, email addresses, etc.).</p>
|
||||
|
||||
<h3>Retention period</h3>
|
||||
<p>Unless a more specific retention period has been mentioned within this privacy policy, your personal data will remain with us until the purpose of the data processing no longer applies. If you assert a justified request for deletion or revoke your consent to data processing, your data will be deleted unless we have other legally permissible reasons for storing your personal data (e.g. tax or commercial retention periods); in the latter case, deletion will take place after these reasons no longer apply.</p>
|
||||
|
||||
<h3>General information on the legal bases for data processing on this website</h3>
|
||||
<p>If you have consented to the data processing, we process your personal data on the basis of Art. 6 (1) (a) GDPR or Art. 9 (2) (a) GDPR, if special categories of data are processed in accordance with Art. 9 (1) GDPR. In the event of express consent to the transfer of personal data to third countries, data processing is also carried out on the basis of Art. 49 (1) (a) GDPR. If you have consented to the storage of cookies or access to information on your terminal device (e.g. via device fingerprinting), the data processing is additionally based on § 25 (1) TDDDG. Consent can be revoked at any time. If your data is required for contract performance or pre-contractual measures, we process your data on the basis of Art. 6 (1) (b) GDPR. Furthermore, we process your data if necessary to comply with a legal obligation on the basis of Art. 6 (1) (c) GDPR. Data processing may further be carried out on the basis of our legitimate interest pursuant to Art. 6 (1) (f) GDPR. The respective legal bases applicable in individual cases are explained in the following paragraphs of this privacy policy.</p>
|
||||
|
||||
<h3>Recipients of personal data</h3>
|
||||
<p>In the course of our business activities, we work with various external bodies. In some cases, this also requires the transfer of personal data to these external bodies. We only pass on personal data to external bodies if this is necessary in the context of fulfilling a contract, if we are legally obliged to do so (e.g. transfer of data to tax authorities), if we have a legitimate interest pursuant to Art. 6 (1) (f) GDPR in the transfer, or if another legal basis permits the data transfer. When using processors, we only pass on the personal data of our customers on the basis of a valid contract on commissioned processing. In the case of joint processing, a joint processing contract is concluded.</p>
|
||||
|
||||
<h3>Withdrawal of your consent to data processing</h3>
|
||||
<p>Many data processing operations are only possible with your express consent. You can revoke consent that has already been given at any time. The lawfulness of data processing carried out until the revocation remains unaffected by the revocation.</p>
|
||||
|
||||
<h3>Right to object to data collection in special cases and to direct marketing (Art. 21 GDPR)</h3>
|
||||
<div class="important-notice">
|
||||
<p><strong>IF DATA PROCESSING IS CARRIED OUT ON THE BASIS OF ART. 6 (1) (E) OR (F) GDPR, YOU HAVE THE RIGHT AT ANY TIME TO OBJECT TO THE PROCESSING OF YOUR PERSONAL DATA ON GROUNDS RELATING TO YOUR PARTICULAR SITUATION; THIS ALSO APPLIES TO PROFILING BASED ON THESE PROVISIONS. THE RESPECTIVE LEGAL BASIS ON WHICH PROCESSING IS BASED CAN BE FOUND IN THIS PRIVACY POLICY. IF YOU OBJECT, WE WILL NO LONGER PROCESS YOUR PERSONAL DATA CONCERNED UNLESS WE CAN DEMONSTRATE COMPELLING LEGITIMATE GROUNDS FOR THE PROCESSING WHICH OVERRIDE YOUR INTERESTS, RIGHTS, AND FREEDOMS, OR THE PROCESSING SERVES TO ASSERT, EXERCISE, OR DEFEND LEGAL CLAIMS (OBJECTION PURSUANT TO ART. 21 (1) GDPR).</strong></p>
|
||||
<p><strong>IF YOUR PERSONAL DATA IS PROCESSED FOR DIRECT MARKETING PURPOSES, YOU HAVE THE RIGHT TO OBJECT AT ANY TIME TO THE PROCESSING OF PERSONAL DATA CONCERNING YOU FOR THE PURPOSE OF SUCH MARKETING; THIS ALSO APPLIES TO PROFILING IN SO FAR AS IT IS RELATED TO SUCH DIRECT MARKETING. IF YOU OBJECT, YOUR PERSONAL DATA WILL SUBSEQUENTLY NO LONGER BE USED FOR DIRECT MARKETING PURPOSES (OBJECTION PURSUANT TO ART. 21 (2) GDPR).</strong></p>
|
||||
</div>
|
||||
|
||||
<h3>Right of appeal to the competent supervisory authority</h3>
|
||||
<p>In the event of breaches of the GDPR, data subjects have the right to lodge a complaint with a supervisory authority, in particular in the member state of their habitual residence, their place of work, or the place of the alleged breach. The right of appeal is without prejudice to other administrative or judicial remedies.</p>
|
||||
|
||||
<h3>Right to data portability</h3>
|
||||
<p>You have the right to have data that we process automatically on the basis of your consent or in fulfilment of a contract handed over to you or to a third party in a common, machine-readable format. If you request the direct transfer of the data to another responsible party, this will only be done if technically feasible.</p>
|
||||
|
||||
<h3>Right to information, correction, and deletion</h3>
|
||||
<p>Within the framework of the applicable legal provisions, you have the right at any time to free information about your stored personal data, its origin and recipients, and the purpose of data processing and, if necessary, the right to have this data corrected or deleted. You can contact us at any time regarding this and other questions on the subject of personal data.</p>
|
||||
|
||||
<h3>Right to restriction of processing</h3>
|
||||
<p>You have the right to demand the restriction of the processing of your personal data. You can contact us at any time about this. The right to restriction of processing exists in the following cases:</p>
|
||||
<ul>
|
||||
<li>If you contest the accuracy of your personal data stored by us, we usually need time to verify this. For the duration of the verification, you have the right to demand the restriction of the processing of your personal data.</li>
|
||||
<li>If the processing of your personal data took place / is taking place unlawfully, you can demand the restriction of data processing instead of deletion.</li>
|
||||
<li>If we no longer need your personal data but you require it to assert, defend, or exercise legal claims, you have the right to demand the restriction of the processing of your personal data instead of deletion.</li>
|
||||
<li>If you have lodged an objection pursuant to Art. 21 (1) GDPR, a balance must be struck between your interests and ours. As long as it has not yet been determined whose interests prevail, you have the right to demand the restriction of the processing of your personal data.</li>
|
||||
</ul>
|
||||
<p>If you have restricted the processing of your personal data, this data – apart from its storage – may only be processed with your consent or to assert, exercise, or defend legal claims, or to protect the rights of another natural or legal person, or for reasons of important public interest of the European Union or of a member state.</p>
|
||||
|
||||
<h3>SSL or TLS encryption</h3>
|
||||
<p>For security reasons and to protect the transmission of confidential content, such as orders or enquiries that you send to us as the site operator, this site uses SSL or TLS encryption. You can recognise an encrypted connection by the fact that the address bar of the browser changes from "http://" to "https://" and by the lock symbol in your browser bar.</p>
|
||||
<p>If SSL or TLS encryption is activated, the data you transmit to us cannot be read by third parties.</p>
|
||||
|
||||
<h3>Objection to promotional emails</h3>
|
||||
<p>The use of contact data published in the context of the legal notice obligation to send unsolicited advertising and information material is hereby objected to. The operators of the pages expressly reserve the right to take legal action in the event of unsolicited sending of advertising information, e.g. through spam emails.</p>
|
||||
</div>
|
||||
|
||||
<div class="legal-section">
|
||||
<h2>4. Data collection on this website</h2>
|
||||
|
||||
<h3>Cookies</h3>
|
||||
<p>Our websites use so-called "cookies". Cookies are small data packages and do not cause any damage to your terminal device. They are stored either temporarily for the duration of a session (session cookies) or permanently (permanent cookies) on your terminal device. Session cookies are automatically deleted at the end of your visit. Permanent cookies remain stored on your terminal device until you delete them yourself or until your web browser automatically deletes them.</p>
|
||||
<p>Cookies can come from us (first-party cookies) or from third-party companies (so-called third-party cookies). Third-party cookies enable the integration of certain services from third-party companies within websites (e.g. cookies for handling payment services).</p>
|
||||
<p>Cookies have various functions. Numerous cookies are technically necessary, since certain website functions would not work without them (e.g. the shopping cart function or the display of videos). Other cookies can be used to evaluate user behaviour or for advertising purposes.</p>
|
||||
<p>Cookies that are required to carry out the electronic communication process, to provide certain functions you have requested (e.g. for the shopping cart function), or to optimise the website (e.g. cookies for measuring the web audience) are stored on the basis of Art. 6 (1) (f) GDPR (necessary cookies), unless another legal basis is specified. The website operator has a legitimate interest in storing necessary cookies for the technically error-free and optimised provision of its services. Where consent to the storage of cookies and comparable recognition technologies has been requested, processing is carried out exclusively on the basis of this consent (Art. 6 (1) (a) GDPR and § 25 (1) TDDDG); consent can be revoked at any time.</p>
|
||||
<p>You can set your browser so that you are informed about the setting of cookies and only allow cookies in individual cases, exclude the acceptance of cookies for certain cases or in general, and activate the automatic deletion of cookies when closing the browser. If cookies are deactivated, the functionality of this website may be limited.</p>
|
||||
<p>Which cookies and services are used on this website can be found in this privacy policy.</p>
|
||||
</div>
|
||||
|
||||
<div class="legal-section">
|
||||
<h2>5. Contact form and enquiries</h2>
|
||||
|
||||
<h3>Data collection via the contact form</h3>
|
||||
<p>If you send us an enquiry via the contact form provided on our website, the information you provide in the form, including the contact details you provide, will be stored by us for the purpose of processing the enquiry and in case of follow-up questions. The following data is collected: name, organisation (optional), email address, and your message. Your data will not be passed on to third parties.</p>
|
||||
|
||||
<h3>Legal basis</h3>
|
||||
<p>The processing of this data is based on Art. 6 (1) (b) GDPR if your enquiry is related to the performance of a contract or is necessary for the implementation of pre-contractual measures. In all other cases, the processing is based on our legitimate interest in the effective handling of enquiries addressed to us (Art. 6 (1) (f) GDPR) and/or on your consent (Art. 6 (1) (a) GDPR), where this has been requested; the consent can be revoked at any time.</p>
|
||||
|
||||
<h3>Retention period</h3>
|
||||
<p>The data you enter in the contact form will remain with us until you ask us to delete it, revoke your consent to its storage, or the purpose for storing the data no longer applies (e.g. after your enquiry has been processed). Mandatory legal provisions – in particular retention periods – remain unaffected.</p>
|
||||
|
||||
<h3>Transmission</h3>
|
||||
<p>Your enquiry is transmitted encrypted (TLS) to our server and forwarded from there as an email to info@aegis-sight.de. Email transmission is encrypted via mail servers in Germany (IONOS).</p>
|
||||
</div>
|
||||
|
||||
<div class="legal-section">
|
||||
<h2>6. Newsletter</h2>
|
||||
|
||||
<h3>Newsletter data</h3>
|
||||
<p>If you would like to receive the newsletter offered on the website, we require an email address from you as well as information that allows us to verify that you are the owner of the email address provided and that you agree to receive the newsletter. No further data, or only data on a voluntary basis, will be collected. We use this data exclusively for sending the requested information and do not pass it on to third parties.</p>
|
||||
<p>The processing of the data entered in the newsletter registration form is carried out exclusively on the basis of your consent (Art. 6 (1) (a) GDPR). You can revoke your consent to the storage of the data, the email address, and its use for sending the newsletter at any time, for example via the "unsubscribe" link in the newsletter. The lawfulness of the data processing operations already carried out remains unaffected by the revocation.</p>
|
||||
<p>The data you provide for the purpose of receiving the newsletter is stored by us or by the newsletter service provider until you unsubscribe from the newsletter and is deleted from the newsletter distribution list after you unsubscribe from the newsletter or once the purpose no longer applies. We reserve the right to delete or block email addresses from our newsletter distribution list at our discretion within the scope of our legitimate interest pursuant to Art. 6 (1) (f) GDPR.</p>
|
||||
<p>Data stored by us for other purposes remains unaffected by this.</p>
|
||||
<p>After you have unsubscribed from the newsletter distribution list, your email address may be stored by us or by the newsletter service provider in a blacklist if necessary to prevent future mailings. The data from the blacklist will only be used for this purpose and will not be merged with other data. This serves both your interest and our interest in complying with the legal requirements when sending newsletters (legitimate interest within the meaning of Art. 6 (1) (f) GDPR). Storage in the blacklist is not subject to any time limit. <strong>You can object to the storage if your interests outweigh our legitimate interest.</strong></p>
|
||||
</div>
|
||||
|
||||
<div class="legal-section">
|
||||
<h2>7. Plugins and tools</h2>
|
||||
|
||||
<h3>AegisSight Analytics (Umami)</h3>
|
||||
<p>We use AegisSight Analytics on this website, a self-hosted instance of the open-source analysis software Umami. With Umami, we collect anonymised information about the use of our website (e.g. pages visited, browser, approximate geographical region at country level) to improve our content.</p>
|
||||
<p><strong>Self-hosted in Germany:</strong> All data remains on our server in Nuremberg, Germany (hosting: Hetzner). No transfer to third parties takes place.</p>
|
||||
<p><strong>Cookieless and IP-anonymised:</strong> Umami does not set cookies and does not store any personal data. IP addresses are anonymised before storage (hashing). No cross-site tracking takes place.</p>
|
||||
<p><strong>Legal basis and consent:</strong> Reach measurement is only activated after your consent via our cookie consent banner (Art. 6 (1) (a) GDPR in conjunction with § 25 (1) TDDDG). You can revoke your consent at any time via the footer link "Cookie settings". We respect the "Global Privacy Control" (GPC) signal of your browser and automatically deactivate reach measurement in this case.</p>
|
||||
|
||||
<h3>Google Fonts (local hosting)</h3>
|
||||
<p>This site uses so-called Google Fonts provided by Google for the uniform display of fonts. The Google Fonts are installed locally. A connection to Google servers does not take place.</p>
|
||||
<p>Further information on Google Fonts can be found at <a href="https://developers.google.com/fonts/faq" target="_blank" rel="noopener">https://developers.google.com/fonts/faq</a> and in Google's privacy policy: <a href="https://policies.google.com/privacy?hl=en" target="_blank" rel="noopener">https://policies.google.com/privacy?hl=en</a>.</p>
|
||||
</div>
|
||||
|
||||
<div class="legal-section">
|
||||
<h2>8. Automated access and AI agents</h2>
|
||||
|
||||
<h3>Prohibition of automated access</h3>
|
||||
<p>Automated querying, scraping, or crawling of this website by bots, spiders, scrapers, AI agents (including LLM-based systems), "buy-for-me" agents, or similar automated tools is prohibited without our express written permission.</p>
|
||||
|
||||
<p>This applies in particular to:</p>
|
||||
<ul>
|
||||
<li>Automated data collection and extraction</li>
|
||||
<li>Training of AI models with content from this website</li>
|
||||
<li>Automated end-to-end processes without human review</li>
|
||||
<li>Systematic reading of content by automated systems</li>
|
||||
</ul>
|
||||
|
||||
<p>Violations of this provision may be prosecuted under civil and criminal law. The instructions contained in our robots.txt file are binding and form part of these terms of use.</p>
|
||||
|
||||
<h3>Exceptions</h3>
|
||||
<p>Search engine crawlers that comply with the specifications of our robots.txt are exempt from this prohibition, as are services to which we have expressly granted permission.</p>
|
||||
</div>
|
||||
|
||||
<div class="source-note">
|
||||
<p>Source: <a href="https://www.e-recht24.de" target="_blank" rel="noopener">https://www.e-recht24.de</a></p>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
|
||||
<!-- Footer -->
|
||||
<footer class="footer">
|
||||
<div class="container">
|
||||
<div class="footer-content">
|
||||
<div class="footer-info">
|
||||
<p class="footer-company">AegisSight UG (haftungsbeschränkt)</p>
|
||||
<p>Gladbacher Straße 3-5, 40764 Langenfeld, Germany</p>
|
||||
</div>
|
||||
<div class="footer-links">
|
||||
<a href="/en/legal-notice.html">Legal notice</a>
|
||||
<a href="/en/privacy.html">Privacy policy</a>
|
||||
<a href="#" id="cookie-settings-link">Cookie settings</a>
|
||||
</div>
|
||||
</div>
|
||||
<p class="footer-copyright">© <span id="footer-year">2026</span> AegisSight UG (haftungsbeschränkt). All rights reserved.</p>
|
||||
</div>
|
||||
</footer>
|
||||
<script>document.getElementById('footer-year').textContent=new Date().getFullYear();</script>
|
||||
<script src="/js/app.js"></script>
|
||||
<script src="/cookie-consent.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
258
en/situations/cyber-attacks/index.html
Normale Datei
@@ -0,0 +1,258 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<meta name="robots" content="index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1">
|
||||
<meta name="theme-color" content="#0A1832">
|
||||
<meta name="author" content="AegisSight UG">
|
||||
<title>Situation report: Cyberattacks on German infrastructure - AegisSight</title>
|
||||
<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/">
|
||||
|
||||
<meta name="description" content="Live situation report on cyberattacks against German infrastructure: AI-OSINT analysis, automated fact-checking, geographic mapping. Continuously updated.">
|
||||
<link rel="canonical" href="https://aegis-sight.de/en/situations/cyber-attacks/">
|
||||
|
||||
<!-- Open Graph -->
|
||||
<meta property="og:type" content="article">
|
||||
<meta property="og:site_name" content="AegisSight">
|
||||
<meta property="og:title" content="Situation report: Cyberattacks on German infrastructure - AegisSight">
|
||||
<meta property="og:description" content="Live situation report on cyberattacks against German infrastructure: AI-OSINT analysis, automated fact-checking, geographic mapping. Continuously updated.">
|
||||
<meta property="og:url" content="https://aegis-sight.de/en/situations/cyber-attacks/">
|
||||
<meta property="og:image" content="https://aegis-sight.de/assets/images/og-image.png">
|
||||
<meta property="og:image:width" content="1200">
|
||||
<meta property="og:image:height" content="630">
|
||||
<meta property="og:locale" content="en_GB">
|
||||
<meta property="og:locale:alternate" content="de_DE">
|
||||
|
||||
<!-- Twitter Card -->
|
||||
<meta name="twitter:card" content="summary_large_image">
|
||||
<meta name="twitter:title" content="Situation report: Cyberattacks on German infrastructure - AegisSight">
|
||||
<meta name="twitter:description" content="Live situation report on cyberattacks against German infrastructure: AI-OSINT analysis, automated fact-checking, geographic mapping. Continuously updated.">
|
||||
<meta name="twitter:image" content="https://aegis-sight.de/assets/images/og-image.png">
|
||||
|
||||
<!-- Schema.org NewsArticle (AEO/GEO: quotable live situation report) -->
|
||||
<script type="application/ld+json">
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "NewsArticle",
|
||||
"@id": "https://aegis-sight.de/en/situations/cyber-attacks/#article",
|
||||
"headline": "Situation report: Cyberattacks on German infrastructure",
|
||||
"name": "Situation report: Cyberattacks on German infrastructure",
|
||||
"description": "Live situation report on cyberattacks against German infrastructure: AI-OSINT analysis, automated fact-checking, geographic mapping. Continuously updated.",
|
||||
"url": "https://aegis-sight.de/en/situations/cyber-attacks/",
|
||||
"image": "https://aegis-sight.de/assets/images/og-image.png",
|
||||
"inLanguage": "en-GB",
|
||||
"isAccessibleForFree": true,
|
||||
"datePublished": "2026-01-08",
|
||||
"dateModified": "2026-05-17",
|
||||
"articleSection": "Cybersecurity",
|
||||
"temporalCoverage": "2024-01-01/..",
|
||||
"keywords": ["Cyberattack", "Germany", "Critical infrastructure", "KRITIS", "OSINT", "BSI", "Cybersecurity", "Real-time situation report"],
|
||||
"about": [
|
||||
{ "@type": "Country", "name": "Germany" },
|
||||
{ "@type": "Thing", "name": "Critical infrastructure" },
|
||||
{ "@type": "Thing", "name": "Cybersecurity" }
|
||||
],
|
||||
"isBasedOn": "https://aegis-sight.de/lagen/cyberangriffe/data/current.json",
|
||||
"speakable": {
|
||||
"@type": "SpeakableSpecification",
|
||||
"cssSelector": ["#incident-title", "#ueberblick-content", "#summary-content"]
|
||||
},
|
||||
"author": { "@id": "https://aegis-sight.de/#organization" },
|
||||
"publisher": { "@id": "https://aegis-sight.de/#organization" }
|
||||
}
|
||||
</script>
|
||||
<!-- Schema.org Dataset (situation data as machine-readable set) -->
|
||||
<script type="application/ld+json">
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "Dataset",
|
||||
"@id": "https://aegis-sight.de/en/situations/cyber-attacks/#dataset",
|
||||
"name": "Cyberattacks on German infrastructure – situation data",
|
||||
"description": "Aggregated OSINT situation data on cyberattacks against German authorities, businesses and critical infrastructure. Continuously curated list with fact-checks, sources and geographic mapping. Updated every 5 minutes.",
|
||||
"url": "https://aegis-sight.de/en/situations/cyber-attacks/",
|
||||
"inLanguage": "en-GB",
|
||||
"isAccessibleForFree": true,
|
||||
"datePublished": "2026-01-08",
|
||||
"dateModified": "2026-05-17",
|
||||
"temporalCoverage": "2024-01-01/..",
|
||||
"keywords": ["Cyberattack", "Germany", "KRITIS", "OSINT", "situation report", "real-time data"],
|
||||
"creator": { "@id": "https://aegis-sight.de/#organization" },
|
||||
"publisher": { "@id": "https://aegis-sight.de/#organization" },
|
||||
"isBasedOn": { "@id": "https://aegis-sight.de/#osint-service" },
|
||||
"distribution": [
|
||||
{
|
||||
"@type": "DataDownload",
|
||||
"encodingFormat": "application/json",
|
||||
"contentUrl": "https://aegis-sight.de/lagen/cyberangriffe/data/current.json"
|
||||
}
|
||||
]
|
||||
}
|
||||
</script>
|
||||
|
||||
<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="/assets/vendor/leaflet/leaflet.css" />
|
||||
<link rel="stylesheet" href="/assets/vendor/leaflet/MarkerCluster.css">
|
||||
<link rel="stylesheet" href="/assets/vendor/leaflet/MarkerCluster.Default.css">
|
||||
<link rel="stylesheet" href="/cookie-consent.css">
|
||||
<script>window.LAGEBILD_DATA_BASE = '/lagen/cyberangriffe/';</script>
|
||||
|
||||
<script type="application/ld+json">
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "BreadcrumbList",
|
||||
"itemListElement": [
|
||||
{
|
||||
"@type": "ListItem",
|
||||
"position": 1,
|
||||
"name": "AegisSight",
|
||||
"item": "https://aegis-sight.de/en/"
|
||||
},
|
||||
{
|
||||
"@type": "ListItem",
|
||||
"position": 2,
|
||||
"name": "Cyberattacks on German Infrastructure",
|
||||
"item": "https://aegis-sight.de/en/situations/cyber-attacks/"
|
||||
}
|
||||
]
|
||||
}
|
||||
</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.svg" alt="AegisSight" class="logo-img" width="200" height="40"></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">Cyberattacks on German Infrastructure</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">© 2026 AegisSight UG (haftungsbeschränkt). All rights reserved.</p>
|
||||
</div>
|
||||
</footer>
|
||||
<script src="/js/mobile-nav.js"></script>
|
||||
<script src="/assets/vendor/leaflet/leaflet.js"></script>
|
||||
<script src="/assets/vendor/leaflet/leaflet.markercluster.js"></script>
|
||||
<script src="/lagen/iran-konflikt/lagebild.js"></script>
|
||||
<script src="/cookie-consent.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
303
en/situations/deepfakes/index.html
Normale Datei
@@ -0,0 +1,303 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<meta name="robots" content="index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1">
|
||||
<meta name="theme-color" content="#0A1832">
|
||||
<meta name="author" content="AegisSight UG">
|
||||
<title>Research: Legal status of deepfakes in Germany - AegisSight</title>
|
||||
<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/">
|
||||
|
||||
<meta name="description" content="Research briefing on the legal status of deepfakes in Germany: AI-driven analysis of case law, legislation and media coverage.">
|
||||
<link rel="canonical" href="https://aegis-sight.de/en/situations/deepfakes/">
|
||||
|
||||
<!-- Open Graph -->
|
||||
<meta property="og:type" content="article">
|
||||
<meta property="og:site_name" content="AegisSight">
|
||||
<meta property="og:title" content="Research briefing: Legal status of deepfakes in Germany - AegisSight">
|
||||
<meta property="og:description" content="Research briefing on the legal status of deepfakes in Germany: AI-driven analysis of case law, legislation and media coverage.">
|
||||
<meta property="og:url" content="https://aegis-sight.de/en/situations/deepfakes/">
|
||||
<meta property="og:image" content="https://aegis-sight.de/assets/images/og-image.png">
|
||||
<meta property="og:image:width" content="1200">
|
||||
<meta property="og:image:height" content="630">
|
||||
<meta property="og:locale" content="en_GB">
|
||||
<meta property="og:locale:alternate" content="de_DE">
|
||||
|
||||
<!-- Twitter Card -->
|
||||
<meta name="twitter:card" content="summary_large_image">
|
||||
<meta name="twitter:title" content="Research briefing: Legal status of deepfakes in Germany - AegisSight">
|
||||
<meta name="twitter:description" content="Research briefing on the legal status of deepfakes in Germany: AI-driven analysis of case law, legislation and media coverage.">
|
||||
<meta name="twitter:image" content="https://aegis-sight.de/assets/images/og-image.png">
|
||||
|
||||
<!-- Schema.org Article (AEO/GEO: quotable research briefing) -->
|
||||
<script type="application/ld+json">
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "Article",
|
||||
"@id": "https://aegis-sight.de/en/situations/deepfakes/#article",
|
||||
"headline": "Research briefing: Legal status of deepfakes in Germany",
|
||||
"name": "Research briefing: Legal status of deepfakes in Germany",
|
||||
"description": "Research briefing on the legal status of deepfakes in Germany: AI-driven analysis of case law, legislation and media coverage.",
|
||||
"url": "https://aegis-sight.de/en/situations/deepfakes/",
|
||||
"image": "https://aegis-sight.de/assets/images/og-image.png",
|
||||
"inLanguage": "en-GB",
|
||||
"isAccessibleForFree": true,
|
||||
"datePublished": "2026-01-08",
|
||||
"dateModified": "2026-05-17",
|
||||
"articleSection": "Law and Regulation",
|
||||
"temporalCoverage": "2023-01-01/..",
|
||||
"keywords": ["Deepfake", "Law", "Germany", "Case law", "Legislation", "AI regulation", "Digital Services Act", "Personality rights"],
|
||||
"about": [
|
||||
{ "@type": "Country", "name": "Germany" },
|
||||
{ "@type": "Thing", "name": "Deepfakes" },
|
||||
{ "@type": "Thing", "name": "Case law" },
|
||||
{ "@type": "Thing", "name": "AI regulation" }
|
||||
],
|
||||
"isBasedOn": "https://aegis-sight.de/lagen/deepfakes/data/current.json",
|
||||
"speakable": {
|
||||
"@type": "SpeakableSpecification",
|
||||
"cssSelector": ["#incident-title", "#ueberblick-content", "#summary-content"]
|
||||
},
|
||||
"author": { "@id": "https://aegis-sight.de/#organization" },
|
||||
"publisher": { "@id": "https://aegis-sight.de/#organization" }
|
||||
}
|
||||
</script>
|
||||
|
||||
<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="/assets/vendor/leaflet/leaflet.css" />
|
||||
<link rel="stylesheet" href="/assets/vendor/leaflet/MarkerCluster.css">
|
||||
<link rel="stylesheet" href="/assets/vendor/leaflet/MarkerCluster.Default.css">
|
||||
<link rel="stylesheet" href="/cookie-consent.css">
|
||||
<script>window.LAGEBILD_DATA_BASE = '/lagen/deepfakes/';</script>
|
||||
|
||||
<script type="application/ld+json">
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "BreadcrumbList",
|
||||
"itemListElement": [
|
||||
{
|
||||
"@type": "ListItem",
|
||||
"position": 1,
|
||||
"name": "AegisSight",
|
||||
"item": "https://aegis-sight.de/en/"
|
||||
},
|
||||
{
|
||||
"@type": "ListItem",
|
||||
"position": 2,
|
||||
"name": "Legal Status of Deepfakes",
|
||||
"item": "https://aegis-sight.de/en/situations/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.svg" alt="AegisSight" class="logo-img" width="200" height="40"></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">Legal Status of Deepfakes in Germany</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">© 2026 AegisSight UG (haftungsbeschränkt). All rights reserved.</p>
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
<!-- Scripts -->
|
||||
<script src="/js/mobile-nav.js"></script>
|
||||
<script src="/assets/vendor/leaflet/leaflet.js"></script>
|
||||
<script src="/assets/vendor/leaflet/leaflet.markercluster.js"></script>
|
||||
<script src="/lagen/iran-konflikt/lagebild.js"></script>
|
||||
<script src="/cookie-consent.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
330
en/situations/iran-conflict/index.html
Normale Datei
@@ -0,0 +1,330 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<meta name="robots" content="index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1">
|
||||
<meta name="theme-color" content="#0A1832">
|
||||
<meta name="author" content="AegisSight UG">
|
||||
<title>Situation report: Iran conflict - AegisSight</title>
|
||||
<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/">
|
||||
|
||||
<meta name="description" content="Live situation report on the Iran conflict: AI-driven OSINT analysis of hundreds of sources, automated fact-checking, geographic mapping and timeline.">
|
||||
<link rel="canonical" href="https://aegis-sight.de/en/situations/iran-conflict/">
|
||||
|
||||
<!-- Open Graph -->
|
||||
<meta property="og:type" content="article">
|
||||
<meta property="og:site_name" content="AegisSight">
|
||||
<meta property="og:title" content="Situation report: Iran conflict - AegisSight">
|
||||
<meta property="og:description" content="Live situation report on the Iran conflict: AI-driven OSINT analysis of hundreds of sources, automated fact-checking, geographic mapping and timeline.">
|
||||
<meta property="og:url" content="https://aegis-sight.de/en/situations/iran-conflict/">
|
||||
<meta property="og:image" content="https://aegis-sight.de/assets/images/og-image.png">
|
||||
<meta property="og:image:width" content="1200">
|
||||
<meta property="og:image:height" content="630">
|
||||
<meta property="og:locale" content="en_GB">
|
||||
<meta property="og:locale:alternate" content="de_DE">
|
||||
|
||||
<!-- Twitter Card -->
|
||||
<meta name="twitter:card" content="summary_large_image">
|
||||
<meta name="twitter:title" content="Situation report: Iran conflict - AegisSight">
|
||||
<meta name="twitter:description" content="Live situation report on the Iran conflict: AI-driven OSINT analysis of hundreds of sources, automated fact-checking, geographic mapping and timeline.">
|
||||
<meta name="twitter:image" content="https://aegis-sight.de/assets/images/og-image.png">
|
||||
|
||||
<!-- Schema.org NewsArticle (AEO/GEO: quotable live situation report) -->
|
||||
<script type="application/ld+json">
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "NewsArticle",
|
||||
"@id": "https://aegis-sight.de/en/situations/iran-conflict/#article",
|
||||
"headline": "Situation report: Iran conflict",
|
||||
"name": "Situation report: Iran conflict",
|
||||
"description": "Live situation report on the Iran conflict: AI-driven OSINT analysis of hundreds of sources, automated fact-checking, geographic mapping and timeline.",
|
||||
"url": "https://aegis-sight.de/en/situations/iran-conflict/",
|
||||
"image": "https://aegis-sight.de/assets/images/og-image.png",
|
||||
"inLanguage": "en-GB",
|
||||
"isAccessibleForFree": true,
|
||||
"datePublished": "2026-01-08",
|
||||
"dateModified": "2026-05-17",
|
||||
"articleSection": "International Security",
|
||||
"temporalCoverage": "2024-04-13/..",
|
||||
"keywords": ["Iran", "Iran conflict", "Middle East", "OSINT", "real-time situation report", "AI fact-checking", "security situation"],
|
||||
"about": [
|
||||
{ "@type": "Place", "name": "Iran" },
|
||||
{ "@type": "Thing", "name": "International security" }
|
||||
],
|
||||
"isBasedOn": "https://aegis-sight.de/lagen/iran-konflikt/data/current.json",
|
||||
"speakable": {
|
||||
"@type": "SpeakableSpecification",
|
||||
"cssSelector": ["#incident-title", "#ueberblick-content", "#summary-content"]
|
||||
},
|
||||
"author": { "@id": "https://aegis-sight.de/#organization" },
|
||||
"publisher": { "@id": "https://aegis-sight.de/#organization" }
|
||||
}
|
||||
</script>
|
||||
<!-- Schema.org Dataset (situation data as machine-readable set) -->
|
||||
<script type="application/ld+json">
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "Dataset",
|
||||
"@id": "https://aegis-sight.de/en/situations/iran-conflict/#dataset",
|
||||
"name": "Iran conflict situation report – data",
|
||||
"description": "Aggregated OSINT situation data on the Iran conflict: continuously curated list of news items, fact-checks, sources and geographic mappings. Updated every 5 minutes.",
|
||||
"url": "https://aegis-sight.de/en/situations/iran-conflict/",
|
||||
"inLanguage": "en-GB",
|
||||
"isAccessibleForFree": true,
|
||||
"datePublished": "2026-01-08",
|
||||
"dateModified": "2026-05-17",
|
||||
"temporalCoverage": "2024-04-13/..",
|
||||
"keywords": ["Iran", "OSINT", "situation report", "fact-checking", "real-time data"],
|
||||
"creator": { "@id": "https://aegis-sight.de/#organization" },
|
||||
"publisher": { "@id": "https://aegis-sight.de/#organization" },
|
||||
"isBasedOn": { "@id": "https://aegis-sight.de/#osint-service" },
|
||||
"distribution": [
|
||||
{
|
||||
"@type": "DataDownload",
|
||||
"encodingFormat": "application/json",
|
||||
"contentUrl": "https://aegis-sight.de/lagen/iran-konflikt/data/current.json"
|
||||
}
|
||||
]
|
||||
}
|
||||
</script>
|
||||
|
||||
<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="/assets/vendor/leaflet/leaflet.css" />
|
||||
<link rel="stylesheet" href="/assets/vendor/leaflet/MarkerCluster.css">
|
||||
<link rel="stylesheet" href="/assets/vendor/leaflet/MarkerCluster.Default.css">
|
||||
<link rel="stylesheet" href="/cookie-consent.css">
|
||||
<script>window.LAGEBILD_DATA_BASE = '/lagen/iran-konflikt/';</script>
|
||||
|
||||
<script type="application/ld+json">
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "BreadcrumbList",
|
||||
"itemListElement": [
|
||||
{
|
||||
"@type": "ListItem",
|
||||
"position": 1,
|
||||
"name": "AegisSight",
|
||||
"item": "https://aegis-sight.de/en/"
|
||||
},
|
||||
{
|
||||
"@type": "ListItem",
|
||||
"position": 2,
|
||||
"name": "Iran Conflict",
|
||||
"item": "https://aegis-sight.de/en/situations/iran-conflict/"
|
||||
}
|
||||
]
|
||||
}
|
||||
</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.svg" alt="AegisSight" class="logo-img" width="200" height="40"></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">Iran Conflict</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">© 2026 AegisSight UG (haftungsbeschränkt). All rights reserved.</p>
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
<!-- Scripts -->
|
||||
<script src="/js/mobile-nav.js"></script>
|
||||
<script src="/assets/vendor/leaflet/leaflet.js"></script>
|
||||
<script src="/assets/vendor/leaflet/leaflet.markercluster.js"></script>
|
||||
<script src="/lagen/iran-konflikt/lagebild.js"></script>
|
||||
<script src="/cookie-consent.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
280
en/solutions/disinformation-monitoring/index.html
Normale Datei
@@ -0,0 +1,280 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<meta name="robots" content="index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1">
|
||||
<meta name="theme-color" content="#0A1832">
|
||||
<meta name="author" content="AegisSight UG">
|
||||
<title>Disinformation Monitoring & FIMI Detection | AegisSight</title>
|
||||
<meta name="description" content="Disinformation monitoring with AegisSight: detect manipulation and FIMI in open sources early – through automatic fact-checking and transparent source assessment.">
|
||||
<link rel="canonical" href="https://aegis-sight.de/en/solutions/disinformation-monitoring/">
|
||||
<link rel="alternate" hreflang="de" href="https://aegis-sight.de/loesungen/desinformationsmonitoring/">
|
||||
<link rel="alternate" hreflang="en" href="https://aegis-sight.de/en/solutions/disinformation-monitoring/">
|
||||
<link rel="alternate" hreflang="x-default" href="https://aegis-sight.de/loesungen/desinformationsmonitoring/">
|
||||
|
||||
<!-- Open Graph -->
|
||||
<meta property="og:type" content="website">
|
||||
<meta property="og:site_name" content="AegisSight">
|
||||
<meta property="og:title" content="Disinformation Monitoring & FIMI Detection | AegisSight">
|
||||
<meta property="og:description" content="Detect disinformation and FIMI in open sources early – with automatic fact-checking and transparent source assessment.">
|
||||
<meta property="og:url" content="https://aegis-sight.de/en/solutions/disinformation-monitoring/">
|
||||
<meta property="og:image" content="https://aegis-sight.de/assets/images/og-image.png">
|
||||
<meta property="og:image:width" content="1200">
|
||||
<meta property="og:image:height" content="630">
|
||||
<meta property="og:locale" content="en_GB">
|
||||
<meta property="og:locale:alternate" content="de_DE">
|
||||
|
||||
<!-- Twitter Card -->
|
||||
<meta name="twitter:card" content="summary_large_image">
|
||||
<meta name="twitter:title" content="Disinformation Monitoring & FIMI Detection | AegisSight">
|
||||
<meta name="twitter:description" content="Detect disinformation and FIMI in open sources early – with automatic fact-checking and transparent source assessment.">
|
||||
<meta name="twitter:image" content="https://aegis-sight.de/assets/images/og-image.png">
|
||||
|
||||
<script type="application/ld+json">
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "Service",
|
||||
"@id": "https://aegis-sight.de/en/solutions/disinformation-monitoring/#service",
|
||||
"name": "Disinformation Monitoring",
|
||||
"serviceType": "Disinformation monitoring and FIMI detection",
|
||||
"provider": { "@id": "https://aegis-sight.de/#organization" },
|
||||
"areaServed": [
|
||||
{ "@type": "Country", "name": "Germany" },
|
||||
{ "@type": "Country", "name": "Austria" },
|
||||
{ "@type": "Country", "name": "Switzerland" },
|
||||
{ "@type": "AdministrativeArea", "name": "European Union" }
|
||||
],
|
||||
"audience": {
|
||||
"@type": "BusinessAudience",
|
||||
"audienceType": "Government agencies, media regulators, newsrooms and strategic communications"
|
||||
},
|
||||
"description": "OSINT-based disinformation monitoring: continuous observation of open sources, automatic fact-checking against independent sources, and transparent source assessment using external signals such as IFCN and EUvsDisinfo. Supports the early detection of disinformation and foreign information manipulation and interference (FIMI)."
|
||||
}
|
||||
</script>
|
||||
<script type="application/ld+json">
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "BreadcrumbList",
|
||||
"itemListElement": [
|
||||
{ "@type": "ListItem", "position": 1, "name": "AegisSight", "item": "https://aegis-sight.de/en/" },
|
||||
{ "@type": "ListItem", "position": 2, "name": "Disinformation Monitoring & FIMI", "item": "https://aegis-sight.de/en/solutions/disinformation-monitoring/" }
|
||||
]
|
||||
}
|
||||
</script>
|
||||
<script type="application/ld+json">
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "FAQPage",
|
||||
"inLanguage": "en-GB",
|
||||
"mainEntity": [
|
||||
{
|
||||
"@type": "Question",
|
||||
"name": "What does FIMI mean?",
|
||||
"acceptedAnswer": { "@type": "Answer", "text": "FIMI stands for Foreign Information Manipulation and Interference. The term, coined by the EU, describes mostly non-illegal but manipulative and coordinated influence on the information environment by foreign actors." }
|
||||
},
|
||||
{
|
||||
"@type": "Question",
|
||||
"name": "Does AegisSight detect disinformation automatically?",
|
||||
"acceptedAnswer": { "@type": "Answer", "text": "AegisSight supports detection: every central claim is automatically checked against several independent sources, and sources are assessed transparently. Contradictions and unsubstantiated claims become visible. The final judgement remains with the expert analysts." }
|
||||
},
|
||||
{
|
||||
"@type": "Question",
|
||||
"name": "Which external signals does the source assessment use?",
|
||||
"acceptedAnswer": { "@type": "Answer", "text": "The source classification combines a four-axis assessment scheme (methodology, transparency, independence, track record) with external signals such as IFCN membership and the EUvsDisinfo database." }
|
||||
}
|
||||
]
|
||||
}
|
||||
</script>
|
||||
|
||||
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
|
||||
<link rel="apple-touch-icon" href="/assets/images/logos/AegisSightLogo_NavyGold.svg">
|
||||
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">
|
||||
|
||||
<link rel="stylesheet" href="/css/style.css">
|
||||
<link rel="stylesheet" href="/css/lang-switcher.css">
|
||||
<link rel="stylesheet" href="/cookie-consent.css">
|
||||
<style>
|
||||
body { font-family: 'Inter', -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; background: var(--white); margin: 0; }
|
||||
.sol-hero { background: var(--navy); color: #E6ECF5; padding: calc(var(--nav-height) + 64px) 0 64px; }
|
||||
.sol-container { max-width: 880px; margin: 0 auto; padding: 0 24px; }
|
||||
.sol-breadcrumb { font-size: 0.85rem; color: #9FB0C8; margin: 0 0 18px; }
|
||||
.sol-breadcrumb a { color: #9FB0C8; text-decoration: none; }
|
||||
.sol-breadcrumb a:hover { color: var(--gold-light); }
|
||||
.sol-hero h1 { font-size: 2.4rem; font-weight: 700; color: #FFFFFF; margin: 0 0 16px; line-height: 1.2; }
|
||||
.sol-hero .sol-lead { font-size: 1.15rem; line-height: 1.7; color: #C6D2E4; margin: 0 0 28px; }
|
||||
.sol-cta-btn { display: inline-block; background: var(--gold); color: var(--navy); font-weight: 600; text-decoration: none; padding: 13px 28px; border-radius: 8px; transition: background .2s; }
|
||||
.sol-cta-btn:hover { background: var(--gold-light); }
|
||||
.sol-body { padding: 56px 0; }
|
||||
.sol-section { margin-bottom: 44px; }
|
||||
.sol-section:last-child { margin-bottom: 0; }
|
||||
.sol-section h2 { font-size: 1.6rem; font-weight: 700; color: var(--navy); margin: 0 0 16px; padding-bottom: 8px; border-bottom: 2px solid var(--gold); }
|
||||
.sol-section p { margin: 0 0 14px; line-height: 1.75; color: var(--text); font-size: 1rem; }
|
||||
.sol-section strong { color: var(--navy); font-weight: 600; }
|
||||
.feature-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); gap: 18px; margin-top: 8px; }
|
||||
.feature-card { background: var(--base); border: 1px solid var(--gray-100); border-radius: var(--radius-lg); padding: 22px 24px; }
|
||||
.feature-card h3 { font-size: 1.08rem; font-weight: 600; color: var(--navy); margin: 0 0 8px; }
|
||||
.feature-card p { font-size: 0.95rem; margin: 0; color: var(--text-light); line-height: 1.65; }
|
||||
.step-list { counter-reset: step; list-style: none; margin: 0; padding: 0; }
|
||||
.step-list li { position: relative; padding: 0 0 18px 52px; line-height: 1.7; color: var(--text); }
|
||||
.step-list li::before { counter-increment: step; content: counter(step); position: absolute; left: 0; top: 0; width: 34px; height: 34px; background: var(--navy); color: var(--gold); border-radius: 50%; display: flex; align-items: center; justify-content: center; font-weight: 700; font-size: 0.95rem; }
|
||||
.step-list li strong { display: block; color: var(--navy); margin-bottom: 2px; }
|
||||
details.sol-faq { border: 1px solid var(--gray-100); border-radius: 8px; margin-bottom: 10px; padding: 0; background: var(--base); }
|
||||
details.sol-faq summary { padding: 16px 20px; cursor: pointer; font-weight: 600; color: var(--navy); list-style: none; }
|
||||
details.sol-faq summary::-webkit-details-marker { display: none; }
|
||||
details.sol-faq .a { padding: 0 20px 16px; color: var(--text); line-height: 1.7; font-size: 0.97rem; }
|
||||
.sol-related { background: var(--base); border-radius: var(--radius-lg); padding: 28px 30px; margin-top: 8px; }
|
||||
.sol-related h2 { border: none; padding: 0; margin: 0 0 14px; font-size: 1.3rem; }
|
||||
.sol-related a { display: block; color: var(--gold-dark); text-decoration: none; font-weight: 600; padding: 6px 0; }
|
||||
.sol-related a:hover { color: var(--gold); }
|
||||
.sol-final-cta { background: var(--navy); color: #E6ECF5; text-align: center; padding: 48px 24px; border-radius: var(--radius-lg); margin-top: 8px; }
|
||||
.sol-final-cta h2 { color: #FFFFFF; border: none; padding: 0; margin: 0 0 10px; }
|
||||
.sol-final-cta p { color: #C6D2E4; margin: 0 0 22px; }
|
||||
@media (max-width: 768px) {
|
||||
.sol-hero h1 { font-size: 1.85rem; }
|
||||
.sol-container { padding: 0 16px; }
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<!-- Navigation -->
|
||||
<nav class="navbar" id="navbar">
|
||||
<div class="nav-container">
|
||||
<a href="/en/" class="nav-logo">
|
||||
<img src="/assets/images/logos/Logo+Schrift_Rechts.svg" alt="AegisSight" class="logo-img" width="200" height="40">
|
||||
</a>
|
||||
<ul class="nav-menu">
|
||||
<li><a href="/en/#features">Features</a></li>
|
||||
<li><a href="/en/#solutions">Solutions</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 class="nav-extras">
|
||||
<div class="lang-switcher" role="group" aria-label="Language">
|
||||
<a class="lang-link" href="/loesungen/desinformationsmonitoring/" 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></span><span></span><span></span>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<!-- Mobile Menu -->
|
||||
<div class="mobile-menu" id="mobile-menu" aria-hidden="true">
|
||||
<ul>
|
||||
<li><a href="/en/#features">Features</a></li>
|
||||
<li><a href="/en/#solutions">Solutions</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 class="lang-switcher" role="group" aria-label="Language">
|
||||
<a class="lang-link" href="/loesungen/desinformationsmonitoring/" 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-overlay" id="mobile-overlay"></div>
|
||||
|
||||
<main>
|
||||
<header class="sol-hero">
|
||||
<div class="sol-container">
|
||||
<nav class="sol-breadcrumb" aria-label="Breadcrumb">
|
||||
<a href="/en/">Home</a> › Disinformation Monitoring & FIMI
|
||||
</nav>
|
||||
<h1>Disinformation Monitoring: Detect Manipulation in Open Sources Early</h1>
|
||||
<p class="sol-lead">AegisSight helps government agencies, media regulators and newsrooms detect disinformation and foreign information manipulation (FIMI) in open sources early – with automatic fact-checking and traceable source assessment.</p>
|
||||
<a class="sol-cta-btn" href="/en/#contact">Request access</a>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<div class="sol-body">
|
||||
<div class="sol-container">
|
||||
<section class="sol-section">
|
||||
<h2>What is disinformation monitoring and FIMI?</h2>
|
||||
<p><strong>Disinformation monitoring</strong> is the continuous observation of the information environment for manipulative, misleading or coordinated content. The goal is to make problematic narratives visible early, before they spread.</p>
|
||||
<p><strong>FIMI</strong> (Foreign Information Manipulation and Interference) is a term coined by the EU for foreign information manipulation and interference – mostly non-illegal but manipulative and coordinated influence on the information environment by foreign actors.</p>
|
||||
</section>
|
||||
|
||||
<section class="sol-section">
|
||||
<h2>How AegisSight supports detection</h2>
|
||||
<p>AegisSight is not a black box that simply stamps content as "true" or "false". Instead, the software creates the evidence-backed basis on which experts can identify manipulation:</p>
|
||||
<ol class="step-list">
|
||||
<li><strong>Fact-checking</strong>Every central claim is automatically compared against several independent sources; matches and contradictions are shown transparently.</li>
|
||||
<li><strong>Source assessment</strong>Sources are classified by a four-axis scheme (methodology, transparency, independence, track record), complemented by external signals such as IFCN and EUvsDisinfo.</li>
|
||||
<li><strong>Tracking narratives</strong>Across hundreds of multilingual sources, it becomes visible where a claim originates and how it spreads.</li>
|
||||
</ol>
|
||||
</section>
|
||||
|
||||
<section class="sol-section">
|
||||
<h2>Key features at a glance</h2>
|
||||
<div class="feature-grid">
|
||||
<div class="feature-card"><h3>Automatic fact-checking</h3><p>Central claims are checked against independent sources and rated transparently.</p></div>
|
||||
<div class="feature-card"><h3>Source classification</h3><p>Four-axis scheme: methodology, transparency, independence and track record.</p></div>
|
||||
<div class="feature-card"><h3>EUvsDisinfo & IFCN signals</h3><p>Established external signals feed into the source assessment.</p></div>
|
||||
<div class="feature-card"><h3>Multilingual analysis</h3><p>Manipulative narratives are often in foreign languages – AegisSight translates automatically.</p></div>
|
||||
<div class="feature-card"><h3>Evidence & timeline</h3><p>Every assessment is linked to original sources and traceable over time.</p></div>
|
||||
<div class="feature-card"><h3>Geographic mapping</h3><p>Reports and narratives are placed spatially.</p></div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="sol-section">
|
||||
<h2>Who disinformation monitoring is for</h2>
|
||||
<p>The solution is built for <strong>security agencies</strong> and crisis teams, <strong>media regulators</strong>, investigative <strong>newsrooms</strong>, and teams in <strong>strategic communications</strong> and crisis communications who need to keep a reliable eye on the information environment.</p>
|
||||
</section>
|
||||
|
||||
<section class="sol-section">
|
||||
<h2>Frequently asked questions</h2>
|
||||
<details class="sol-faq"><summary>What does FIMI mean?</summary><div class="a">FIMI stands for Foreign Information Manipulation and Interference. The term, coined by the EU, describes mostly non-illegal but manipulative and coordinated influence on the information environment by foreign actors.</div></details>
|
||||
<details class="sol-faq"><summary>Does AegisSight detect disinformation automatically?</summary><div class="a">AegisSight supports detection: every central claim is automatically checked against several independent sources, and sources are assessed transparently. Contradictions and unsubstantiated claims become visible. The final judgement remains with the expert analysts.</div></details>
|
||||
<details class="sol-faq"><summary>Which external signals does the source assessment use?</summary><div class="a">The source classification combines a four-axis assessment scheme (methodology, transparency, independence, track record) with external signals such as IFCN membership and the EUvsDisinfo database.</div></details>
|
||||
</section>
|
||||
|
||||
<section class="sol-section sol-related-wrap">
|
||||
<div class="sol-related">
|
||||
<h2>More solutions</h2>
|
||||
<a href="/en/solutions/osint-situational-awareness-software/">OSINT & Situational Awareness Software ›</a>
|
||||
<a href="/en/solutions/social-media-monitoring-government/">Social Media & Crisis Monitoring for Government ›</a>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="sol-section">
|
||||
<div class="sol-final-cta">
|
||||
<h2>Detect disinformation early – on an evidence-backed basis</h2>
|
||||
<p>Pilot access for qualified organisations is available.</p>
|
||||
<a class="sol-cta-btn" href="/en/#contact">Get in touch</a>
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
|
||||
<!-- Footer -->
|
||||
<footer class="footer">
|
||||
<div class="container">
|
||||
<div class="footer-content">
|
||||
<div class="footer-info">
|
||||
<p class="footer-company">AegisSight UG (haftungsbeschränkt)</p>
|
||||
<p>Gladbacher Straße 3-5, 40764 Langenfeld, Germany</p>
|
||||
</div>
|
||||
<div class="footer-links">
|
||||
<a href="/en/legal-notice.html">Legal notice</a>
|
||||
<a href="/en/privacy.html">Privacy policy</a>
|
||||
<a href="#" id="cookie-settings-link">Cookie settings</a>
|
||||
</div>
|
||||
</div>
|
||||
<p class="footer-copyright">© <span id="footer-year">2026</span> AegisSight UG (haftungsbeschränkt). All rights reserved.</p>
|
||||
</div>
|
||||
</footer>
|
||||
<script>document.getElementById('footer-year').textContent=new Date().getFullYear();</script>
|
||||
<script src="/js/app.js"></script>
|
||||
<script src="/cookie-consent.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
279
en/solutions/osint-situational-awareness-software/index.html
Normale Datei
@@ -0,0 +1,279 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<meta name="robots" content="index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1">
|
||||
<meta name="theme-color" content="#0A1832">
|
||||
<meta name="author" content="AegisSight UG">
|
||||
<title>OSINT & Situational Awareness Software from Germany | AegisSight</title>
|
||||
<meta name="description" content="OSINT and situational awareness software from Germany: AegisSight automatically evaluates hundreds of open sources and produces structured real-time situation reports with fact-checking.">
|
||||
<link rel="canonical" href="https://aegis-sight.de/en/solutions/osint-situational-awareness-software/">
|
||||
<link rel="alternate" hreflang="de" href="https://aegis-sight.de/loesungen/osint-lagebild-software/">
|
||||
<link rel="alternate" hreflang="en" href="https://aegis-sight.de/en/solutions/osint-situational-awareness-software/">
|
||||
<link rel="alternate" hreflang="x-default" href="https://aegis-sight.de/loesungen/osint-lagebild-software/">
|
||||
|
||||
<!-- Open Graph -->
|
||||
<meta property="og:type" content="website">
|
||||
<meta property="og:site_name" content="AegisSight">
|
||||
<meta property="og:title" content="OSINT & Situational Awareness Software from Germany | AegisSight">
|
||||
<meta property="og:description" content="OSINT and situational awareness software from Germany: hundreds of open sources evaluated automatically, structured real-time situation reports with fact-checking.">
|
||||
<meta property="og:url" content="https://aegis-sight.de/en/solutions/osint-situational-awareness-software/">
|
||||
<meta property="og:image" content="https://aegis-sight.de/assets/images/og-image.png">
|
||||
<meta property="og:image:width" content="1200">
|
||||
<meta property="og:image:height" content="630">
|
||||
<meta property="og:locale" content="en_GB">
|
||||
<meta property="og:locale:alternate" content="de_DE">
|
||||
|
||||
<!-- Twitter Card -->
|
||||
<meta name="twitter:card" content="summary_large_image">
|
||||
<meta name="twitter:title" content="OSINT & Situational Awareness Software from Germany | AegisSight">
|
||||
<meta name="twitter:description" content="OSINT and situational awareness software from Germany: hundreds of open sources evaluated automatically, structured real-time situation reports with fact-checking.">
|
||||
<meta name="twitter:image" content="https://aegis-sight.de/assets/images/og-image.png">
|
||||
|
||||
<script type="application/ld+json">
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "Service",
|
||||
"@id": "https://aegis-sight.de/en/solutions/osint-situational-awareness-software/#service",
|
||||
"name": "OSINT and Situational Awareness Software",
|
||||
"serviceType": "OSINT monitoring and situation report generation",
|
||||
"provider": { "@id": "https://aegis-sight.de/#organization" },
|
||||
"areaServed": [
|
||||
{ "@type": "Country", "name": "Germany" },
|
||||
{ "@type": "Country", "name": "Austria" },
|
||||
{ "@type": "Country", "name": "Switzerland" },
|
||||
{ "@type": "AdministrativeArea", "name": "European Union" }
|
||||
],
|
||||
"audience": {
|
||||
"@type": "BusinessAudience",
|
||||
"audienceType": "Government agencies, newsrooms and security services"
|
||||
},
|
||||
"description": "OSINT and situational awareness software that automatically evaluates hundreds of open sources and produces structured real-time situation reports with source references, geographic mapping and automatic fact-checking. Operated entirely on servers in Germany, GDPR-compliant."
|
||||
}
|
||||
</script>
|
||||
<script type="application/ld+json">
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "BreadcrumbList",
|
||||
"itemListElement": [
|
||||
{ "@type": "ListItem", "position": 1, "name": "AegisSight", "item": "https://aegis-sight.de/en/" },
|
||||
{ "@type": "ListItem", "position": 2, "name": "OSINT & Situational Awareness Software", "item": "https://aegis-sight.de/en/solutions/osint-situational-awareness-software/" }
|
||||
]
|
||||
}
|
||||
</script>
|
||||
<script type="application/ld+json">
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "FAQPage",
|
||||
"inLanguage": "en-GB",
|
||||
"mainEntity": [
|
||||
{
|
||||
"@type": "Question",
|
||||
"name": "What is OSINT and situational awareness software?",
|
||||
"acceptedAnswer": { "@type": "Answer", "text": "OSINT software systematically evaluates publicly available sources such as news, specialist media, government communications and social media. Situational awareness software condenses this analysis into a structured, continuously updated summary of the factual situation with source references, timeline and geographic mapping. AegisSight combines both in one automated solution." }
|
||||
},
|
||||
{
|
||||
"@type": "Question",
|
||||
"name": "How does OSINT software differ from IT monitoring software?",
|
||||
"acceptedAnswer": { "@type": "Answer", "text": "IT monitoring software watches servers, networks and system availability. OSINT software instead monitors public information sources to assess the security and information situation. AegisSight is OSINT situational awareness software, not IT infrastructure monitoring." }
|
||||
},
|
||||
{
|
||||
"@type": "Question",
|
||||
"name": "Is the OSINT software GDPR-compliant?",
|
||||
"acceptedAnswer": { "@type": "Answer", "text": "Yes. AegisSight is operated entirely on servers in Germany, processes only publicly available sources and transfers no data to third countries." }
|
||||
}
|
||||
]
|
||||
}
|
||||
</script>
|
||||
|
||||
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
|
||||
<link rel="apple-touch-icon" href="/assets/images/logos/AegisSightLogo_NavyGold.svg">
|
||||
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">
|
||||
|
||||
<link rel="stylesheet" href="/css/style.css">
|
||||
<link rel="stylesheet" href="/css/lang-switcher.css">
|
||||
<link rel="stylesheet" href="/cookie-consent.css">
|
||||
<style>
|
||||
body { font-family: 'Inter', -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; background: var(--white); margin: 0; }
|
||||
.sol-hero { background: var(--navy); color: #E6ECF5; padding: calc(var(--nav-height) + 64px) 0 64px; }
|
||||
.sol-container { max-width: 880px; margin: 0 auto; padding: 0 24px; }
|
||||
.sol-breadcrumb { font-size: 0.85rem; color: #9FB0C8; margin: 0 0 18px; }
|
||||
.sol-breadcrumb a { color: #9FB0C8; text-decoration: none; }
|
||||
.sol-breadcrumb a:hover { color: var(--gold-light); }
|
||||
.sol-hero h1 { font-size: 2.4rem; font-weight: 700; color: #FFFFFF; margin: 0 0 16px; line-height: 1.2; }
|
||||
.sol-hero .sol-lead { font-size: 1.15rem; line-height: 1.7; color: #C6D2E4; margin: 0 0 28px; }
|
||||
.sol-cta-btn { display: inline-block; background: var(--gold); color: var(--navy); font-weight: 600; text-decoration: none; padding: 13px 28px; border-radius: 8px; transition: background .2s; }
|
||||
.sol-cta-btn:hover { background: var(--gold-light); }
|
||||
.sol-body { padding: 56px 0; }
|
||||
.sol-section { margin-bottom: 44px; }
|
||||
.sol-section:last-child { margin-bottom: 0; }
|
||||
.sol-section h2 { font-size: 1.6rem; font-weight: 700; color: var(--navy); margin: 0 0 16px; padding-bottom: 8px; border-bottom: 2px solid var(--gold); }
|
||||
.sol-section p { margin: 0 0 14px; line-height: 1.75; color: var(--text); font-size: 1rem; }
|
||||
.sol-section strong { color: var(--navy); font-weight: 600; }
|
||||
.feature-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); gap: 18px; margin-top: 8px; }
|
||||
.feature-card { background: var(--base); border: 1px solid var(--gray-100); border-radius: var(--radius-lg); padding: 22px 24px; }
|
||||
.feature-card h3 { font-size: 1.08rem; font-weight: 600; color: var(--navy); margin: 0 0 8px; }
|
||||
.feature-card p { font-size: 0.95rem; margin: 0; color: var(--text-light); line-height: 1.65; }
|
||||
.step-list { counter-reset: step; list-style: none; margin: 0; padding: 0; }
|
||||
.step-list li { position: relative; padding: 0 0 18px 52px; line-height: 1.7; color: var(--text); }
|
||||
.step-list li::before { counter-increment: step; content: counter(step); position: absolute; left: 0; top: 0; width: 34px; height: 34px; background: var(--navy); color: var(--gold); border-radius: 50%; display: flex; align-items: center; justify-content: center; font-weight: 700; font-size: 0.95rem; }
|
||||
.step-list li strong { display: block; color: var(--navy); margin-bottom: 2px; }
|
||||
details.sol-faq { border: 1px solid var(--gray-100); border-radius: 8px; margin-bottom: 10px; padding: 0; background: var(--base); }
|
||||
details.sol-faq summary { padding: 16px 20px; cursor: pointer; font-weight: 600; color: var(--navy); list-style: none; }
|
||||
details.sol-faq summary::-webkit-details-marker { display: none; }
|
||||
details.sol-faq .a { padding: 0 20px 16px; color: var(--text); line-height: 1.7; font-size: 0.97rem; }
|
||||
.sol-related { background: var(--base); border-radius: var(--radius-lg); padding: 28px 30px; margin-top: 8px; }
|
||||
.sol-related h2 { border: none; padding: 0; margin: 0 0 14px; font-size: 1.3rem; }
|
||||
.sol-related a { display: block; color: var(--gold-dark); text-decoration: none; font-weight: 600; padding: 6px 0; }
|
||||
.sol-related a:hover { color: var(--gold); }
|
||||
.sol-final-cta { background: var(--navy); color: #E6ECF5; text-align: center; padding: 48px 24px; border-radius: var(--radius-lg); margin-top: 8px; }
|
||||
.sol-final-cta h2 { color: #FFFFFF; border: none; padding: 0; margin: 0 0 10px; }
|
||||
.sol-final-cta p { color: #C6D2E4; margin: 0 0 22px; }
|
||||
@media (max-width: 768px) {
|
||||
.sol-hero h1 { font-size: 1.85rem; }
|
||||
.sol-container { padding: 0 16px; }
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<!-- Navigation -->
|
||||
<nav class="navbar" id="navbar">
|
||||
<div class="nav-container">
|
||||
<a href="/en/" class="nav-logo">
|
||||
<img src="/assets/images/logos/Logo+Schrift_Rechts.svg" alt="AegisSight" class="logo-img" width="200" height="40">
|
||||
</a>
|
||||
<ul class="nav-menu">
|
||||
<li><a href="/en/#features">Features</a></li>
|
||||
<li><a href="/en/#solutions">Solutions</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 class="nav-extras">
|
||||
<div class="lang-switcher" role="group" aria-label="Language">
|
||||
<a class="lang-link" href="/loesungen/osint-lagebild-software/" 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></span><span></span><span></span>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<!-- Mobile Menu -->
|
||||
<div class="mobile-menu" id="mobile-menu" aria-hidden="true">
|
||||
<ul>
|
||||
<li><a href="/en/#features">Features</a></li>
|
||||
<li><a href="/en/#solutions">Solutions</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 class="lang-switcher" role="group" aria-label="Language">
|
||||
<a class="lang-link" href="/loesungen/osint-lagebild-software/" 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-overlay" id="mobile-overlay"></div>
|
||||
|
||||
<main>
|
||||
<header class="sol-hero">
|
||||
<div class="sol-container">
|
||||
<nav class="sol-breadcrumb" aria-label="Breadcrumb">
|
||||
<a href="/en/">Home</a> › OSINT & Situational Awareness Software
|
||||
</nav>
|
||||
<h1>OSINT and Situational Awareness Software for Automated Analysis</h1>
|
||||
<p class="sol-lead">AegisSight Monitor is OSINT software from Germany that evaluates hundreds of open sources around the clock and automatically produces structured real-time situation reports – with source references, geographic mapping and automatic fact-checking.</p>
|
||||
<a class="sol-cta-btn" href="/en/#contact">Request access</a>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<div class="sol-body">
|
||||
<div class="sol-container">
|
||||
<section class="sol-section">
|
||||
<h2>What is OSINT and situational awareness software?</h2>
|
||||
<p><strong>OSINT software</strong> (Open Source Intelligence) systematically evaluates publicly available sources such as news agencies, specialist media, government communications and social media. <strong>Situational awareness software</strong> condenses this analysis into a structured, continuously updated summary of the factual situation – with source references, timeline and geographic mapping.</p>
|
||||
<p>AegisSight combines both in one automated solution: instead of reviewing sources manually, analysts receive a finished, evidence-backed situation report that keeps updating itself.</p>
|
||||
</section>
|
||||
|
||||
<section class="sol-section">
|
||||
<h2>From raw signal to situation report – fully automated</h2>
|
||||
<ol class="step-list">
|
||||
<li><strong>Collect</strong>Hundreds of open sources are ingested around the clock; posts in dozens of languages are translated automatically.</li>
|
||||
<li><strong>Analyse</strong>Reports are aggregated, deduplicated, geographically located, and every central claim is automatically checked against independent sources.</li>
|
||||
<li><strong>Report</strong>The result is a structured situation report with timeline, source references and map – updated every five minutes.</li>
|
||||
</ol>
|
||||
</section>
|
||||
|
||||
<section class="sol-section">
|
||||
<h2>Key features at a glance</h2>
|
||||
<div class="feature-grid">
|
||||
<div class="feature-card"><h3>Automated source analysis</h3><p>Hundreds of open sources are continuously captured, aggregated and deduplicated.</p></div>
|
||||
<div class="feature-card"><h3>Geographic mapping</h3><p>Reports are placed spatially on an interactive map.</p></div>
|
||||
<div class="feature-card"><h3>Multilingual analysis</h3><p>Posts in dozens of languages, including Farsi, Arabic and Hebrew, are translated automatically.</p></div>
|
||||
<div class="feature-card"><h3>Automatic fact-checking</h3><p>Central claims are checked against several independent sources and rated transparently.</p></div>
|
||||
<div class="feature-card"><h3>Structured situation reports</h3><p>The factual situation with timeline, source references and mapping – in one clear view.</p></div>
|
||||
<div class="feature-card"><h3>Real-time updates</h3><p>Situation reports are automatically refreshed every five minutes.</p></div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="sol-section">
|
||||
<h2>Who the software is for</h2>
|
||||
<p>AegisSight is built for organisations that need reliable situation reports in real time: <strong>government agencies</strong> and crisis teams, investigative <strong>newsrooms</strong>, as well as <strong>security services</strong>, plant security and corporate security. Wherever manual OSINT analysis fails due to source diversity, time pressure and information overload, the software delivers a traceable, automatically maintained situation report.</p>
|
||||
</section>
|
||||
|
||||
<section class="sol-section">
|
||||
<h2>Frequently asked questions</h2>
|
||||
<details class="sol-faq"><summary>How does OSINT software differ from IT monitoring software?</summary><div class="a">IT monitoring software watches servers, networks and system availability. OSINT software instead monitors public information sources to assess the security and information situation. AegisSight is OSINT situational awareness software, not IT infrastructure monitoring.</div></details>
|
||||
<details class="sol-faq"><summary>Is the OSINT software GDPR-compliant?</summary><div class="a">Yes. AegisSight is operated entirely on servers in Germany, processes only publicly available sources and transfers no data to third countries.</div></details>
|
||||
<details class="sol-faq"><summary>How up to date are the situation reports?</summary><div class="a">Situation reports are automatically updated every five minutes, so the factual situation is available almost in real time.</div></details>
|
||||
</section>
|
||||
|
||||
<section class="sol-section sol-related-wrap">
|
||||
<div class="sol-related">
|
||||
<h2>More solutions</h2>
|
||||
<a href="/en/solutions/disinformation-monitoring/">Disinformation Monitoring & FIMI ›</a>
|
||||
<a href="/en/solutions/social-media-monitoring-government/">Social Media & Crisis Monitoring for Government ›</a>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="sol-section">
|
||||
<div class="sol-final-cta">
|
||||
<h2>Situation reports in real time – instead of manual research</h2>
|
||||
<p>Pilot access for qualified organisations is available.</p>
|
||||
<a class="sol-cta-btn" href="/en/#contact">Get in touch</a>
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
|
||||
<!-- Footer -->
|
||||
<footer class="footer">
|
||||
<div class="container">
|
||||
<div class="footer-content">
|
||||
<div class="footer-info">
|
||||
<p class="footer-company">AegisSight UG (haftungsbeschränkt)</p>
|
||||
<p>Gladbacher Straße 3-5, 40764 Langenfeld, Germany</p>
|
||||
</div>
|
||||
<div class="footer-links">
|
||||
<a href="/en/legal-notice.html">Legal notice</a>
|
||||
<a href="/en/privacy.html">Privacy policy</a>
|
||||
<a href="#" id="cookie-settings-link">Cookie settings</a>
|
||||
</div>
|
||||
</div>
|
||||
<p class="footer-copyright">© <span id="footer-year">2026</span> AegisSight UG (haftungsbeschränkt). All rights reserved.</p>
|
||||
</div>
|
||||
</footer>
|
||||
<script>document.getElementById('footer-year').textContent=new Date().getFullYear();</script>
|
||||
<script src="/js/app.js"></script>
|
||||
<script src="/cookie-consent.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
279
en/solutions/social-media-monitoring-government/index.html
Normale Datei
@@ -0,0 +1,279 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<meta name="robots" content="index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1">
|
||||
<meta name="theme-color" content="#0A1832">
|
||||
<meta name="author" content="AegisSight UG">
|
||||
<title>Social Media & Crisis Monitoring for Government | AegisSight</title>
|
||||
<meta name="description" content="Social media and crisis monitoring for government: AegisSight gives crisis teams an automatically updated situation report from open sources – GDPR-compliant, with fact-checking.">
|
||||
<link rel="canonical" href="https://aegis-sight.de/en/solutions/social-media-monitoring-government/">
|
||||
<link rel="alternate" hreflang="de" href="https://aegis-sight.de/loesungen/social-media-monitoring-behoerden/">
|
||||
<link rel="alternate" hreflang="en" href="https://aegis-sight.de/en/solutions/social-media-monitoring-government/">
|
||||
<link rel="alternate" hreflang="x-default" href="https://aegis-sight.de/loesungen/social-media-monitoring-behoerden/">
|
||||
|
||||
<!-- Open Graph -->
|
||||
<meta property="og:type" content="website">
|
||||
<meta property="og:site_name" content="AegisSight">
|
||||
<meta property="og:title" content="Social Media & Crisis Monitoring for Government | AegisSight">
|
||||
<meta property="og:description" content="An automatically updated situation report from social media and open sources for crisis teams – GDPR-compliant, with fact-checking and early warning.">
|
||||
<meta property="og:url" content="https://aegis-sight.de/en/solutions/social-media-monitoring-government/">
|
||||
<meta property="og:image" content="https://aegis-sight.de/assets/images/og-image.png">
|
||||
<meta property="og:image:width" content="1200">
|
||||
<meta property="og:image:height" content="630">
|
||||
<meta property="og:locale" content="en_GB">
|
||||
<meta property="og:locale:alternate" content="de_DE">
|
||||
|
||||
<!-- Twitter Card -->
|
||||
<meta name="twitter:card" content="summary_large_image">
|
||||
<meta name="twitter:title" content="Social Media & Crisis Monitoring for Government | AegisSight">
|
||||
<meta name="twitter:description" content="An automatically updated situation report from social media and open sources for crisis teams – GDPR-compliant, with fact-checking and early warning.">
|
||||
<meta name="twitter:image" content="https://aegis-sight.de/assets/images/og-image.png">
|
||||
|
||||
<script type="application/ld+json">
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "Service",
|
||||
"@id": "https://aegis-sight.de/en/solutions/social-media-monitoring-government/#service",
|
||||
"name": "Social Media and Crisis Monitoring for Government",
|
||||
"serviceType": "Social media monitoring and crisis monitoring",
|
||||
"provider": { "@id": "https://aegis-sight.de/#organization" },
|
||||
"areaServed": [
|
||||
{ "@type": "Country", "name": "Germany" },
|
||||
{ "@type": "Country", "name": "Austria" },
|
||||
{ "@type": "Country", "name": "Switzerland" },
|
||||
{ "@type": "AdministrativeArea", "name": "European Union" }
|
||||
],
|
||||
"audience": {
|
||||
"@type": "BusinessAudience",
|
||||
"audienceType": "Government agencies, crisis teams, civil protection and corporate security"
|
||||
},
|
||||
"description": "OSINT-based social media and crisis monitoring: crisis teams and security agencies receive an automatically updated real-time situation report from social media and other open sources, with automatic fact-checking and geographic mapping. Operated entirely on servers in Germany, GDPR-compliant."
|
||||
}
|
||||
</script>
|
||||
<script type="application/ld+json">
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "BreadcrumbList",
|
||||
"itemListElement": [
|
||||
{ "@type": "ListItem", "position": 1, "name": "AegisSight", "item": "https://aegis-sight.de/en/" },
|
||||
{ "@type": "ListItem", "position": 2, "name": "Social Media & Crisis Monitoring for Government", "item": "https://aegis-sight.de/en/solutions/social-media-monitoring-government/" }
|
||||
]
|
||||
}
|
||||
</script>
|
||||
<script type="application/ld+json">
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "FAQPage",
|
||||
"inLanguage": "en-GB",
|
||||
"mainEntity": [
|
||||
{
|
||||
"@type": "Question",
|
||||
"name": "What is social media monitoring for government?",
|
||||
"acceptedAnswer": { "@type": "Answer", "text": "Social media monitoring for government is the structured, continuous analysis of public social media content for situational assessment, for example for crisis teams or security agencies. AegisSight integrates social media sources into its OSINT situation reports and automatically checks central claims against independent sources." }
|
||||
},
|
||||
{
|
||||
"@type": "Question",
|
||||
"name": "Is the monitoring GDPR-compliant?",
|
||||
"acceptedAnswer": { "@type": "Answer", "text": "Yes. AegisSight is operated entirely on servers in Germany, processes only publicly available sources and transfers no data to third countries." }
|
||||
},
|
||||
{
|
||||
"@type": "Question",
|
||||
"name": "Is AegisSight suitable for crisis teams and early warning?",
|
||||
"acceptedAnswer": { "@type": "Answer", "text": "Yes. Situation reports are automatically updated every five minutes, giving crisis teams an almost real-time, evidence-backed situation report to detect developing situations early." }
|
||||
}
|
||||
]
|
||||
}
|
||||
</script>
|
||||
|
||||
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
|
||||
<link rel="apple-touch-icon" href="/assets/images/logos/AegisSightLogo_NavyGold.svg">
|
||||
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">
|
||||
|
||||
<link rel="stylesheet" href="/css/style.css">
|
||||
<link rel="stylesheet" href="/css/lang-switcher.css">
|
||||
<link rel="stylesheet" href="/cookie-consent.css">
|
||||
<style>
|
||||
body { font-family: 'Inter', -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; background: var(--white); margin: 0; }
|
||||
.sol-hero { background: var(--navy); color: #E6ECF5; padding: calc(var(--nav-height) + 64px) 0 64px; }
|
||||
.sol-container { max-width: 880px; margin: 0 auto; padding: 0 24px; }
|
||||
.sol-breadcrumb { font-size: 0.85rem; color: #9FB0C8; margin: 0 0 18px; }
|
||||
.sol-breadcrumb a { color: #9FB0C8; text-decoration: none; }
|
||||
.sol-breadcrumb a:hover { color: var(--gold-light); }
|
||||
.sol-hero h1 { font-size: 2.4rem; font-weight: 700; color: #FFFFFF; margin: 0 0 16px; line-height: 1.2; }
|
||||
.sol-hero .sol-lead { font-size: 1.15rem; line-height: 1.7; color: #C6D2E4; margin: 0 0 28px; }
|
||||
.sol-cta-btn { display: inline-block; background: var(--gold); color: var(--navy); font-weight: 600; text-decoration: none; padding: 13px 28px; border-radius: 8px; transition: background .2s; }
|
||||
.sol-cta-btn:hover { background: var(--gold-light); }
|
||||
.sol-body { padding: 56px 0; }
|
||||
.sol-section { margin-bottom: 44px; }
|
||||
.sol-section:last-child { margin-bottom: 0; }
|
||||
.sol-section h2 { font-size: 1.6rem; font-weight: 700; color: var(--navy); margin: 0 0 16px; padding-bottom: 8px; border-bottom: 2px solid var(--gold); }
|
||||
.sol-section p { margin: 0 0 14px; line-height: 1.75; color: var(--text); font-size: 1rem; }
|
||||
.sol-section strong { color: var(--navy); font-weight: 600; }
|
||||
.feature-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); gap: 18px; margin-top: 8px; }
|
||||
.feature-card { background: var(--base); border: 1px solid var(--gray-100); border-radius: var(--radius-lg); padding: 22px 24px; }
|
||||
.feature-card h3 { font-size: 1.08rem; font-weight: 600; color: var(--navy); margin: 0 0 8px; }
|
||||
.feature-card p { font-size: 0.95rem; margin: 0; color: var(--text-light); line-height: 1.65; }
|
||||
.step-list { counter-reset: step; list-style: none; margin: 0; padding: 0; }
|
||||
.step-list li { position: relative; padding: 0 0 18px 52px; line-height: 1.7; color: var(--text); }
|
||||
.step-list li::before { counter-increment: step; content: counter(step); position: absolute; left: 0; top: 0; width: 34px; height: 34px; background: var(--navy); color: var(--gold); border-radius: 50%; display: flex; align-items: center; justify-content: center; font-weight: 700; font-size: 0.95rem; }
|
||||
.step-list li strong { display: block; color: var(--navy); margin-bottom: 2px; }
|
||||
details.sol-faq { border: 1px solid var(--gray-100); border-radius: 8px; margin-bottom: 10px; padding: 0; background: var(--base); }
|
||||
details.sol-faq summary { padding: 16px 20px; cursor: pointer; font-weight: 600; color: var(--navy); list-style: none; }
|
||||
details.sol-faq summary::-webkit-details-marker { display: none; }
|
||||
details.sol-faq .a { padding: 0 20px 16px; color: var(--text); line-height: 1.7; font-size: 0.97rem; }
|
||||
.sol-related { background: var(--base); border-radius: var(--radius-lg); padding: 28px 30px; margin-top: 8px; }
|
||||
.sol-related h2 { border: none; padding: 0; margin: 0 0 14px; font-size: 1.3rem; }
|
||||
.sol-related a { display: block; color: var(--gold-dark); text-decoration: none; font-weight: 600; padding: 6px 0; }
|
||||
.sol-related a:hover { color: var(--gold); }
|
||||
.sol-final-cta { background: var(--navy); color: #E6ECF5; text-align: center; padding: 48px 24px; border-radius: var(--radius-lg); margin-top: 8px; }
|
||||
.sol-final-cta h2 { color: #FFFFFF; border: none; padding: 0; margin: 0 0 10px; }
|
||||
.sol-final-cta p { color: #C6D2E4; margin: 0 0 22px; }
|
||||
@media (max-width: 768px) {
|
||||
.sol-hero h1 { font-size: 1.85rem; }
|
||||
.sol-container { padding: 0 16px; }
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<!-- Navigation -->
|
||||
<nav class="navbar" id="navbar">
|
||||
<div class="nav-container">
|
||||
<a href="/en/" class="nav-logo">
|
||||
<img src="/assets/images/logos/Logo+Schrift_Rechts.svg" alt="AegisSight" class="logo-img" width="200" height="40">
|
||||
</a>
|
||||
<ul class="nav-menu">
|
||||
<li><a href="/en/#features">Features</a></li>
|
||||
<li><a href="/en/#solutions">Solutions</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 class="nav-extras">
|
||||
<div class="lang-switcher" role="group" aria-label="Language">
|
||||
<a class="lang-link" href="/loesungen/social-media-monitoring-behoerden/" 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></span><span></span><span></span>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<!-- Mobile Menu -->
|
||||
<div class="mobile-menu" id="mobile-menu" aria-hidden="true">
|
||||
<ul>
|
||||
<li><a href="/en/#features">Features</a></li>
|
||||
<li><a href="/en/#solutions">Solutions</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 class="lang-switcher" role="group" aria-label="Language">
|
||||
<a class="lang-link" href="/loesungen/social-media-monitoring-behoerden/" 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-overlay" id="mobile-overlay"></div>
|
||||
|
||||
<main>
|
||||
<header class="sol-hero">
|
||||
<div class="sol-container">
|
||||
<nav class="sol-breadcrumb" aria-label="Breadcrumb">
|
||||
<a href="/en/">Home</a> › Social Media & Crisis Monitoring for Government
|
||||
</nav>
|
||||
<h1>Social Media and Crisis Monitoring for Government</h1>
|
||||
<p class="sol-lead">AegisSight gives government agencies and crisis teams an automatically updated situation report from social media and other open sources – GDPR-compliant, with automatic fact-checking and geographic mapping.</p>
|
||||
<a class="sol-cta-btn" href="/en/#contact">Request access</a>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<div class="sol-body">
|
||||
<div class="sol-container">
|
||||
<section class="sol-section">
|
||||
<h2>What is social media and crisis monitoring for government?</h2>
|
||||
<p><strong>Social media monitoring for government</strong> is the structured, continuous analysis of public social media content for situational assessment. <strong>Crisis monitoring</strong> observes a situation in real time to provide crisis teams and decision-makers with a current, evidence-backed situation report.</p>
|
||||
<p>AegisSight combines both: social media sources are analysed together with news, specialist media and government communications and condensed into a traceable situation report.</p>
|
||||
</section>
|
||||
|
||||
<section class="sol-section">
|
||||
<h2>How AegisSight supports crisis teams</h2>
|
||||
<ol class="step-list">
|
||||
<li><strong>Collect</strong>Public social media posts and hundreds of other open sources are ingested and translated around the clock.</li>
|
||||
<li><strong>Verify</strong>Central claims are automatically checked against independent sources – rumours and false reports become apparent early.</li>
|
||||
<li><strong>Deliver</strong>Crisis teams receive a situation report updated every five minutes, with map, timeline and source references.</li>
|
||||
</ol>
|
||||
</section>
|
||||
|
||||
<section class="sol-section">
|
||||
<h2>Key features at a glance</h2>
|
||||
<div class="feature-grid">
|
||||
<div class="feature-card"><h3>Social media analysis</h3><p>Public social media sources feed into the situation report.</p></div>
|
||||
<div class="feature-card"><h3>Real-time situation report</h3><p>Automatically updated every five minutes – a basis for fast decisions.</p></div>
|
||||
<div class="feature-card"><h3>Automatic fact-checking</h3><p>Rumours and false reports are checked against independent sources.</p></div>
|
||||
<div class="feature-card"><h3>Geographic mapping</h3><p>Reports are placed spatially on an interactive map.</p></div>
|
||||
<div class="feature-card"><h3>GDPR-compliant</h3><p>Operated on servers in Germany, using only public sources.</p></div>
|
||||
<div class="feature-card"><h3>Multilingual analysis</h3><p>Posts in dozens of languages are translated automatically.</p></div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="sol-section">
|
||||
<h2>Who the monitoring is for</h2>
|
||||
<p>The solution is built for <strong>security agencies</strong> and crisis teams, <strong>civil protection</strong>, as well as <strong>plant security</strong> and <strong>corporate security</strong> – wherever developing situations need to be detected early and assessed reliably.</p>
|
||||
</section>
|
||||
|
||||
<section class="sol-section">
|
||||
<h2>Frequently asked questions</h2>
|
||||
<details class="sol-faq"><summary>What is social media monitoring for government?</summary><div class="a">Social media monitoring for government is the structured, continuous analysis of public social media content for situational assessment, for example for crisis teams or security agencies. AegisSight integrates social media sources into its OSINT situation reports and automatically checks central claims against independent sources.</div></details>
|
||||
<details class="sol-faq"><summary>Is the monitoring GDPR-compliant?</summary><div class="a">Yes. AegisSight is operated entirely on servers in Germany, processes only publicly available sources and transfers no data to third countries.</div></details>
|
||||
<details class="sol-faq"><summary>Is AegisSight suitable for crisis teams and early warning?</summary><div class="a">Yes. Situation reports are automatically updated every five minutes, giving crisis teams an almost real-time, evidence-backed situation report to detect developing situations early.</div></details>
|
||||
</section>
|
||||
|
||||
<section class="sol-section sol-related-wrap">
|
||||
<div class="sol-related">
|
||||
<h2>More solutions</h2>
|
||||
<a href="/en/solutions/osint-situational-awareness-software/">OSINT & Situational Awareness Software ›</a>
|
||||
<a href="/en/solutions/disinformation-monitoring/">Disinformation Monitoring & FIMI ›</a>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="sol-section">
|
||||
<div class="sol-final-cta">
|
||||
<h2>A situation report for the crisis team – in real time</h2>
|
||||
<p>Pilot access for qualified organisations is available.</p>
|
||||
<a class="sol-cta-btn" href="/en/#contact">Get in touch</a>
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
|
||||
<!-- Footer -->
|
||||
<footer class="footer">
|
||||
<div class="container">
|
||||
<div class="footer-content">
|
||||
<div class="footer-info">
|
||||
<p class="footer-company">AegisSight UG (haftungsbeschränkt)</p>
|
||||
<p>Gladbacher Straße 3-5, 40764 Langenfeld, Germany</p>
|
||||
</div>
|
||||
<div class="footer-links">
|
||||
<a href="/en/legal-notice.html">Legal notice</a>
|
||||
<a href="/en/privacy.html">Privacy policy</a>
|
||||
<a href="#" id="cookie-settings-link">Cookie settings</a>
|
||||
</div>
|
||||
</div>
|
||||
<p class="footer-copyright">© <span id="footer-year">2026</span> AegisSight UG (haftungsbeschränkt). All rights reserved.</p>
|
||||
</div>
|
||||
</footer>
|
||||
<script>document.getElementById('footer-year').textContent=new Date().getFullYear();</script>
|
||||
<script src="/js/app.js"></script>
|
||||
<script src="/cookie-consent.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
8
favicon.svg
Normale Datei
@@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg width="100%" height="100%" viewBox="0 0 400 497" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
|
||||
<g id="svgg">
|
||||
<path id="rechts" d="M212.575,238.576C212.984,240.67 223.048,241.002 270.154,240.533C349.694,239.739 344.481,239.31 346.236,243.942C347.823,248.13 347.264,250.927 338.778,272.292C333.041,286.737 321.692,301.671 304.569,327.057C262.704,389.124 258.243,380.556 257.465,379.844C256.548,379.007 256.695,378.153 256.7,377.409C256.827,359.293 254.573,273.452 254.549,270.937C254.525,268.422 254.116,268.891 229.156,268.982C211.282,269.047 211.756,268.669 211.925,271.847C211.971,272.701 212.094,316.69 212.2,369.6C212.306,422.51 212.487,468.568 212.604,469.063C213.014,470.81 224.336,462 224.6,462C224.864,462 237.107,453.265 241.4,450.384C242.5,449.646 244.343,448.313 245.496,447.421C246.648,446.53 248.865,444.9 250.421,443.8C251.978,442.7 255.169,440.115 257.513,438.055C259.857,435.996 262.771,433.605 263.988,432.743C267.489,430.261 269.974,428.216 270.637,427.269C270.973,426.789 271.767,426.127 272.4,425.8C273.034,425.472 273.862,424.68 274.24,424.04C274.618,423.399 275.574,422.512 276.364,422.067C277.741,421.292 287.002,412.973 290.077,409.749C290.89,408.897 293.68,406.009 296.277,403.331C303.179,396.216 308.766,389.886 310.684,387.009C311.611,385.619 312.782,384.149 313.286,383.741C313.791,383.334 314.523,382.55 314.913,382C315.304,381.45 316.113,380.353 316.711,379.562C317.31,378.771 318.552,377.132 319.471,375.919C320.389,374.706 321.709,373.103 322.403,372.357C324.097,370.534 325.597,368.32 327.217,365.252C327.957,363.85 329.057,362.338 329.66,361.892C330.264,361.446 331.622,359.655 332.679,357.912C333.735,356.168 335.453,353.696 336.496,352.417C337.539,351.139 338.935,348.947 339.599,347.546C341.424,343.695 344.598,338.004 345.689,336.626C347.172,334.754 348.692,331.944 348.986,330.528C349.132,329.828 349.51,329.041 349.826,328.779C350.142,328.517 350.4,328.069 350.4,327.784C350.4,327.499 351.048,326.045 351.84,324.552C352.632,323.059 353.784,320.479 354.401,318.819C355.017,317.159 356.416,314.072 357.509,311.96C358.602,309.848 359.894,306.968 360.38,305.56C360.866,304.152 361.593,302.46 361.995,301.8C362.398,301.14 362.941,299.795 363.203,298.812C363.464,297.828 363.931,296.663 364.239,296.223C364.548,295.782 364.8,295.078 364.8,294.658C364.8,293.56 367.089,287.051 368.23,284.904C368.764,283.901 369.201,282.793 369.202,282.44C369.204,282.088 369.46,281.312 369.771,280.715C370.082,280.118 370.552,278.588 370.814,277.315C371.076,276.042 371.715,273.867 372.234,272.482C372.753,271.097 373.442,268.667 373.765,267.082C374.657,262.705 375.074,261.226 376.185,258.503C376.746,257.13 377.395,254.61 377.628,252.903C377.861,251.196 386.4,207.294 386.4,202.415C386.4,200.114 384.943,198.138 382.973,197.769C382.197,197.623 390.698,196.027 262.4,197.136L256.297,196.493C254.923,195.188 254.409,193.392 254.634,190.691C255.021,186.052 255.075,102.153 254.699,90.2C254.256,76.132 254.359,75.232 256.566,73.785C257.5,73.174 257.724,73.166 258.9,73.706C259.615,74.035 343.437,105.997 345.2,108.641L346.2,110.142L346.246,163.984L347.17,164.968L348.095,165.953L367.317,165.835L386.539,165.718L387.711,164.406L388.883,163.095L388.646,155.847C388.515,151.861 388.304,143.29 388.176,136.8C387.97,126.347 389.116,102.223 388.883,92.984C388.587,81.212 385.041,79.623 381.162,77.313C378.036,75.451 212.403,10.83 212.49,12.505" style="fill:rgb(200,168,81);"/>
|
||||
<path id="links" d="M31.8,72.797C19.193,77.854 16.869,77.149 16.354,86.093C16.177,89.171 13.694,109.47 13.373,112C11.292,128.389 11.075,175.356 12.999,192.8C13.326,195.77 15.755,217.626 17.524,225.4C17.975,227.38 21.242,245.556 21.798,247.6C23.196,252.741 27.444,269.357 28.368,273C29.454,277.277 33.845,288.636 34.632,290.326C35.42,292.017 39.017,301.259 39.364,301.931C39.973,303.107 41.279,306.405 42.799,310.6C43.879,313.58 46.904,319.091 47.546,320.62C48.78,323.561 51.339,328.992 51.965,330C52.17,330.33 53.466,332.67 54.845,335.2C56.223,337.73 65.855,353.259 67.765,356.052C72.504,362.981 75.544,366.754 76.46,368.119C78.119,370.593 79.488,372.185 85.821,379C87.66,380.98 89.758,383.356 90.483,384.279C92.003,386.218 92.035,386.23 93.151,385.3C94.267,384.37 94.041,384.013 94.036,382.593C94.015,376.905 94.025,351.182 94.025,351.182C94.062,315.081 94.745,313.16 93.752,308.626C92.302,301.997 88.001,300.043 80.439,284.793C71.474,266.714 65.169,255.803 62.016,248.485C61.011,246.153 59.289,240.91 61.521,240.882C65.215,240.836 143.575,240.107 144.382,240.673C145.808,241.671 146.494,243.516 146.346,245.959C146.058,250.736 146.217,438.282 146.511,439.663C146.825,441.137 153.946,447.096 162.193,452.924C177.223,463.547 187.111,469.578 187.956,468.458C189.091,466.954 188.058,10.288 188.006,12.482M146.001,134.292C145.999,164.821 146.043,190.718 146.099,191.84C146.336,196.617 147.019,196.45 127.622,196.354C106.312,196.249 58.054,196.89 58.054,196.89L57.06,195.896C55.315,194.152 55.678,132.49 55.766,126C56.004,108.467 56.656,110.707 66.745,106.586C70.345,105.116 134.261,79.128 135.708,78.566C146.998,74.183 145.972,74.295 146.055,76.768" style="fill:rgb(10,24,50);"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
Nachher Breite: | Höhe: | Größe: 5.3 KiB |
220
impressum.html
@@ -3,131 +3,137 @@
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Impressum - IntelSight</title>
|
||||
<link rel="stylesheet" href="css/main.css">
|
||||
<link rel="stylesheet" href="css/fonts.css">
|
||||
<meta name="robots" content="noindex, follow">
|
||||
<meta name="theme-color" content="#0A1832">
|
||||
<meta name="author" content="AegisSight UG">
|
||||
<title>Impressum – AegisSight</title>
|
||||
|
||||
<!-- Rechtliche Seiten von Suchmaschinen ausschliessen -->
|
||||
<meta name="googlebot" content="noindex, nofollow, noarchive, nosnippet, noimageindex">
|
||||
|
||||
<link rel="alternate" hreflang="de" href="https://aegis-sight.de/impressum.html">
|
||||
<link rel="alternate" hreflang="en" href="https://aegis-sight.de/en/legal-notice.html">
|
||||
<link rel="alternate" hreflang="x-default" href="https://aegis-sight.de/impressum.html">
|
||||
|
||||
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
|
||||
<link rel="apple-touch-icon" href="/assets/images/logos/AegisSightLogo_NavyGold.svg">
|
||||
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">
|
||||
|
||||
<link rel="stylesheet" href="/css/style.css">
|
||||
<link rel="stylesheet" href="/css/lang-switcher.css">
|
||||
<link rel="stylesheet" href="/cookie-consent.css">
|
||||
<style>
|
||||
body {
|
||||
background: #0a0f1c;
|
||||
min-height: 100vh;
|
||||
}
|
||||
.impressum-container {
|
||||
max-width: 800px;
|
||||
margin: 0 auto;
|
||||
padding: 120px 20px 40px;
|
||||
}
|
||||
.impressum-header {
|
||||
margin-bottom: 40px;
|
||||
text-align: center;
|
||||
}
|
||||
.impressum-header h1 {
|
||||
font-family: 'Bebas Neue', sans-serif;
|
||||
font-size: 3rem;
|
||||
font-weight: 400;
|
||||
color: #ffffff;
|
||||
margin-bottom: 10px;
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 3px;
|
||||
}
|
||||
.impressum-content {
|
||||
background: rgba(255, 255, 255, 0.95);
|
||||
box-shadow: 0 10px 30px rgba(0, 0, 0, 0.3);
|
||||
border-radius: 20px;
|
||||
padding: 40px;
|
||||
backdrop-filter: blur(10px);
|
||||
}
|
||||
.impressum-section {
|
||||
margin-bottom: 30px;
|
||||
border-bottom: 1px solid rgba(15, 114, 181, 0.1);
|
||||
padding-bottom: 20px;
|
||||
}
|
||||
.impressum-section:last-child {
|
||||
border-bottom: none;
|
||||
}
|
||||
.impressum-section h2 {
|
||||
font-family: 'Bebas Neue', sans-serif;
|
||||
font-size: 1.5rem;
|
||||
color: #0f72b5;
|
||||
margin-bottom: 15px;
|
||||
font-weight: 400;
|
||||
letter-spacing: 1px;
|
||||
text-transform: uppercase;
|
||||
}
|
||||
.impressum-section p {
|
||||
font-family: 'Inter', sans-serif;
|
||||
color: #333333;
|
||||
line-height: 1.6;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
.impressum-section strong {
|
||||
color: #1a1a1a;
|
||||
font-weight: 600;
|
||||
body { font-family: 'Inter', -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; background: var(--white); margin: 0; }
|
||||
.legal-page { padding: calc(var(--nav-height) + 56px) 0 80px; min-height: calc(100vh - 220px); }
|
||||
.legal-container { max-width: 820px; margin: 0 auto; padding: 0 24px; }
|
||||
.legal-container h1 { font-size: 2.25rem; font-weight: 700; color: var(--navy); margin: 0 0 12px; }
|
||||
.legal-meta { color: var(--text-light); margin: 0 0 32px; font-size: 0.95rem; }
|
||||
.legal-content { background: var(--base); border-radius: var(--radius-lg); padding: 32px 40px; box-shadow: var(--shadow); border: 1px solid var(--gray-100); }
|
||||
.legal-section { margin-bottom: 28px; }
|
||||
.legal-section:last-child { margin-bottom: 0; }
|
||||
.legal-section h2 { font-size: 1.35rem; font-weight: 700; color: var(--navy); margin: 0 0 14px; padding-bottom: 8px; border-bottom: 2px solid var(--gold); }
|
||||
.legal-section h3 { font-size: 1.05rem; font-weight: 600; color: var(--navy); margin: 22px 0 8px; }
|
||||
.legal-section p { margin: 0 0 12px; line-height: 1.7; color: var(--text); font-size: 0.95rem; }
|
||||
.legal-section a { color: var(--gold-dark); text-decoration: underline; }
|
||||
.legal-section a:hover { color: var(--gold); }
|
||||
.legal-section ul { margin: 12px 0 16px 22px; padding: 0; }
|
||||
.legal-section li { margin-bottom: 6px; line-height: 1.6; color: var(--text); font-size: 0.95rem; }
|
||||
.legal-section strong { color: var(--navy); font-weight: 600; }
|
||||
.legal-section table { width: 100%; border-collapse: collapse; margin: 12px 0 16px; }
|
||||
.legal-section td, .legal-section th { padding: 8px 12px; border: 1px solid var(--gray-200); text-align: left; font-size: 0.92rem; }
|
||||
.source-note { margin-top: 40px; padding-top: 16px; border-top: 1px solid var(--gray-200); font-size: 0.85rem; color: var(--text-light); }
|
||||
.source-note a { color: var(--gold-dark); }
|
||||
@media (max-width: 768px) {
|
||||
.legal-container { padding: 0 16px; }
|
||||
.legal-content { padding: 24px 20px; }
|
||||
.legal-container h1 { font-size: 1.75rem; }
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<!-- Navigation -->
|
||||
<nav class="navbar" role="navigation" aria-label="Hauptnavigation">
|
||||
<nav class="navbar" id="navbar">
|
||||
<div class="nav-container">
|
||||
<div class="logo">
|
||||
<a href="index.html">
|
||||
<img src="assets/images/logos/intelsight-name-light.svg" alt="IntelSight" class="logo-img">
|
||||
</a>
|
||||
</div>
|
||||
<a href="/" class="nav-logo">
|
||||
<img src="/assets/images/logos/Logo+Schrift_Rechts.svg" alt="AegisSight" class="logo-img" width="200" height="40">
|
||||
</a>
|
||||
<ul class="nav-menu">
|
||||
<li><a href="index.html#home">Startseite</a></li>
|
||||
<li><a href="index.html#about">Über uns</a></li>
|
||||
<li><a href="index.html#products">Produkte & Lösungen</a></li>
|
||||
<li><a href="mailto:info@intelsight.de">Kontakt</a></li>
|
||||
<li><a href="/#features">Funktionen</a></li>
|
||||
<li><a href="/#demos">Live-Lagebilder</a></li>
|
||||
<li><a href="/#trust">Über uns</a></li>
|
||||
<li><a href="/#contact">Kontakt</a></li>
|
||||
</ul>
|
||||
<div class="nav-extras">
|
||||
<button class="lang-toggle" data-lang="de" aria-label="Sprache wechseln">DE | EN</button>
|
||||
<div class="lang-switcher" role="group" aria-label="Sprache">
|
||||
<span class="lang-active" lang="de" aria-current="true">DE</span>
|
||||
<span class="lang-sep" aria-hidden="true">|</span>
|
||||
<a class="lang-link" href="/en/legal-notice.html" lang="en" hreflang="en" rel="alternate">EN</a>
|
||||
</div>
|
||||
<button class="mobile-menu-toggle" aria-label="Menü öffnen" aria-expanded="false">
|
||||
<span></span><span></span><span></span>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<div class="impressum-container">
|
||||
<div class="impressum-header">
|
||||
<h1>Impressum</h1>
|
||||
<!-- Mobile Menu -->
|
||||
<div class="mobile-menu" id="mobile-menu" aria-hidden="true">
|
||||
<ul>
|
||||
<li><a href="/#features">Funktionen</a></li>
|
||||
<li><a href="/#demos">Live-Lagebilder</a></li>
|
||||
<li><a href="/#trust">Über uns</a></li>
|
||||
<li><a href="/#contact">Kontakt</a></li>
|
||||
</ul>
|
||||
<div class="lang-switcher" role="group" aria-label="Sprache">
|
||||
<span class="lang-active" lang="de" aria-current="true">DE</span>
|
||||
<span class="lang-sep" aria-hidden="true">|</span>
|
||||
<a class="lang-link" href="/en/legal-notice.html" lang="en" hreflang="en" rel="alternate">EN</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mobile-overlay" id="mobile-overlay"></div>
|
||||
|
||||
<div class="impressum-content">
|
||||
<div class="impressum-section">
|
||||
<main class="legal-page">
|
||||
<div class="legal-container">
|
||||
<h1>Impressum</h1>
|
||||
<div class="legal-section">
|
||||
<h2>Angaben gemäß § 5 TMG</h2>
|
||||
<p><strong>IntelSight UG i. G. (haftungsbeschränkt)</strong></p>
|
||||
<p><strong>AegisSight UG (haftungsbeschränkt)</strong></p>
|
||||
<p>Gladbacher Strasse 3-5<br>
|
||||
40764 Langenfeld</p>
|
||||
</div>
|
||||
|
||||
<div class="impressum-section">
|
||||
<div class="legal-section">
|
||||
<h2>Vertreten durch</h2>
|
||||
<p>Hendrik Gebhardt<br>
|
||||
Monami Homma</p>
|
||||
</div>
|
||||
|
||||
<div class="impressum-section">
|
||||
<div class="legal-section">
|
||||
<h2>Kontakt</h2>
|
||||
<p>E-Mail: info@intelsight.de</p>
|
||||
<p>E-Mail: info@aegis-sight.de</p>
|
||||
</div>
|
||||
|
||||
<div class="impressum-section">
|
||||
<div class="legal-section">
|
||||
<h2>Registereintrag</h2>
|
||||
<p>Handelsregister: [Nummer des Registereintrags]<br>
|
||||
Registergericht: [Name des Registergerichts]</p>
|
||||
<p>Handelsregister: HRB 110105<br>
|
||||
Registergericht: Amtsgericht Düsseldorf</p>
|
||||
</div>
|
||||
|
||||
<div class="impressum-section">
|
||||
<div class="legal-section">
|
||||
<h2>Umsatzsteuer-ID</h2>
|
||||
<p>Umsatzsteuer-Identifikationsnummer gemäß § 27 a Umsatzsteuergesetz:<br>
|
||||
DE [Nummer]</p>
|
||||
DE457846602</p>
|
||||
</div>
|
||||
|
||||
<div class="impressum-section">
|
||||
<h2>Verbraucherstreitbeilegung/Universalschlichtungsstelle</h2>
|
||||
<div class="legal-section">
|
||||
<h2>Verbraucherstreitbeilegung/<wbr>Universalschlichtungsstelle</h2>
|
||||
<p>Wir sind nicht bereit oder verpflichtet, an Streitbeilegungsverfahren vor einer Verbraucherschlichtungsstelle teilzunehmen.</p>
|
||||
</div>
|
||||
|
||||
<div class="impressum-section">
|
||||
<div class="legal-section">
|
||||
<h2>Haftungsausschluss</h2>
|
||||
<p><strong>Haftung für Inhalte</strong><br>
|
||||
Die Inhalte unserer Seiten wurden mit größter Sorgfalt erstellt. Für die Richtigkeit, Vollständigkeit und Aktualität der Inhalte können wir jedoch keine Gewähr übernehmen. Als Diensteanbieter sind wir gemäß § 7 Abs.1 TMG für eigene Inhalte auf diesen Seiten nach den allgemeinen Gesetzen verantwortlich. Nach §§ 8 bis 10 TMG sind wir als Diensteanbieter jedoch nicht verpflichtet, übermittelte oder gespeicherte fremde Informationen zu überwachen oder nach Umständen zu forschen, die auf eine rechtswidrige Tätigkeit hinweisen.</p>
|
||||
@@ -138,46 +144,30 @@
|
||||
<p><strong>Urheberrecht</strong><br>
|
||||
Die durch die Seitenbetreiber erstellten Inhalte und Werke auf diesen Seiten unterliegen dem deutschen Urheberrecht. Die Vervielfältigung, Bearbeitung, Verbreitung und jede Art der Verwertung außerhalb der Grenzen des Urheberrechtes bedürfen der schriftlichen Zustimmung des jeweiligen Autors bzw. Erstellers.</p>
|
||||
|
||||
<p style="margin-top: 30px; font-size: 0.9rem; color: #666;">
|
||||
Quelle: <a href="https://www.e-recht24.de" target="_blank" style="color: #0066cc;">eRecht24</a>
|
||||
</p>
|
||||
<p class="source-note">Quelle: <a href="https://www.e-recht24.de" target="_blank">eRecht24</a></p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
|
||||
<!-- Footer -->
|
||||
<footer class="footer">
|
||||
<div class="container">
|
||||
<div class="footer-content">
|
||||
<div class="footer-section">
|
||||
<h4>IntelSight UG (haftungsbeschränkt)</h4>
|
||||
<p>Gladbacher Strasse 3-5</p>
|
||||
<p>40764 Langenfeld</p>
|
||||
<div class="footer-info">
|
||||
<p class="footer-company">AegisSight UG (haftungsbeschränkt)</p>
|
||||
<p>Gladbacher Straße 3-5, 40764 Langenfeld</p>
|
||||
</div>
|
||||
<div class="footer-section">
|
||||
<h4>Navigation</h4>
|
||||
<ul>
|
||||
<li><a href="index.html#home">Startseite</a></li>
|
||||
<li><a href="index.html#about">Über uns</a></li>
|
||||
<li><a href="index.html#products">Produkte</a></li>
|
||||
<li><a href="mailto:info@intelsight.de">Kontakt</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="footer-section">
|
||||
<h4>Rechtliches</h4>
|
||||
<ul>
|
||||
<li><a href="impressum.html">Impressum</a></li>
|
||||
<li><a href="datenschutz.html">Datenschutz</a></li>
|
||||
<li><a href="#">AGB</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="footer-section">
|
||||
<h4>Kontakt</h4>
|
||||
<p><a href="mailto:info@intelsight.de">info@intelsight.de</a></p>
|
||||
<div class="footer-links">
|
||||
<a href="/impressum.html">Impressum</a>
|
||||
<a href="/datenschutz.html">Datenschutz</a>
|
||||
<a href="#" id="cookie-settings-link">Cookie-Einstellungen</a>
|
||||
</div>
|
||||
</div>
|
||||
<p class="copyright">© 2025 IntelSight UG (haftungsbeschränkt). Alle Rechte vorbehalten.</p>
|
||||
<p class="footer-copyright">© <span id="footer-year">2026</span> AegisSight UG (haftungsbeschränkt). Alle Rechte vorbehalten.</p>
|
||||
</div>
|
||||
</footer>
|
||||
<script>document.getElementById('footer-year').textContent=new Date().getFullYear();</script>
|
||||
<script src="/js/app.js"></script>
|
||||
<script src="/cookie-consent.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
1103
index.html
@@ -1,303 +0,0 @@
|
||||
/**
|
||||
* Enhanced Animations and Interactions
|
||||
* Premium effects for modern web experience
|
||||
*/
|
||||
|
||||
const EnhancedAnimations = {
|
||||
init() {
|
||||
this.initScrollAnimations();
|
||||
this.initParallaxEffects();
|
||||
this.initMagneticButtons();
|
||||
this.initTextAnimations();
|
||||
this.initCardTilt();
|
||||
this.initSmoothScroll();
|
||||
this.initCursorEffects();
|
||||
this.initNumberCounters();
|
||||
this.initRevealOnScroll();
|
||||
this.initNavbarEffects();
|
||||
},
|
||||
|
||||
// Smooth scroll with easing
|
||||
initSmoothScroll() {
|
||||
document.querySelectorAll('a[href^="#"]').forEach(anchor => {
|
||||
anchor.addEventListener('click', function (e) {
|
||||
e.preventDefault();
|
||||
const target = document.querySelector(this.getAttribute('href'));
|
||||
if (target) {
|
||||
const offset = 100;
|
||||
const targetPosition = target.offsetTop - offset;
|
||||
window.scrollTo({
|
||||
top: targetPosition,
|
||||
behavior: 'smooth'
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
},
|
||||
|
||||
// Parallax scrolling effects
|
||||
initParallaxEffects() {
|
||||
const parallaxElements = document.querySelectorAll('.parallax');
|
||||
let ticking = false;
|
||||
|
||||
function updateParallax() {
|
||||
const scrolled = window.pageYOffset;
|
||||
|
||||
parallaxElements.forEach(element => {
|
||||
const speed = element.dataset.speed || 0.5;
|
||||
const yPos = -(scrolled * speed);
|
||||
element.style.transform = `translateY(${yPos}px)`;
|
||||
});
|
||||
|
||||
ticking = false;
|
||||
}
|
||||
|
||||
function requestTick() {
|
||||
if (!ticking) {
|
||||
window.requestAnimationFrame(updateParallax);
|
||||
ticking = true;
|
||||
}
|
||||
}
|
||||
|
||||
window.addEventListener('scroll', requestTick);
|
||||
},
|
||||
|
||||
// Magnetic button effects
|
||||
initMagneticButtons() {
|
||||
const magneticButtons = document.querySelectorAll('.primary-button, .secondary-button, .cta-button');
|
||||
|
||||
magneticButtons.forEach(button => {
|
||||
button.addEventListener('mousemove', (e) => {
|
||||
const rect = button.getBoundingClientRect();
|
||||
const x = e.clientX - rect.left - rect.width / 2;
|
||||
const y = e.clientY - rect.top - rect.height / 2;
|
||||
|
||||
button.style.transform = `translate(${x * 0.2}px, ${y * 0.2}px) scale(1.05)`;
|
||||
});
|
||||
|
||||
button.addEventListener('mouseleave', () => {
|
||||
button.style.transform = '';
|
||||
});
|
||||
});
|
||||
},
|
||||
|
||||
// Advanced text animations
|
||||
initTextAnimations() {
|
||||
// Typewriter effect for hero title - DISABLED to prevent duplication
|
||||
// The title already has CSS animations applied
|
||||
|
||||
/* Commented out to fix duplication issue
|
||||
const heroTitle = document.querySelector('.main-title');
|
||||
if (heroTitle && !heroTitle.dataset.animated) {
|
||||
heroTitle.dataset.animated = 'true';
|
||||
const text = heroTitle.textContent;
|
||||
heroTitle.textContent = '';
|
||||
heroTitle.style.opacity = '1';
|
||||
|
||||
let index = 0;
|
||||
const typeWriter = () => {
|
||||
if (index < text.length) {
|
||||
heroTitle.textContent += text.charAt(index);
|
||||
index++;
|
||||
setTimeout(typeWriter, 50);
|
||||
}
|
||||
};
|
||||
|
||||
// Start typewriter after a short delay
|
||||
setTimeout(typeWriter, 500);
|
||||
}
|
||||
*/
|
||||
|
||||
// Word-by-word reveal for hero text
|
||||
const heroText = document.querySelector('.hero-text');
|
||||
if (heroText) {
|
||||
const words = heroText.textContent.split(' ');
|
||||
heroText.innerHTML = words.map(word =>
|
||||
`<span class="word-reveal" style="opacity: 0; display: inline-block; transform: translateY(20px); transition: all 0.6s cubic-bezier(0.34, 1.56, 0.64, 1);">${word}</span>`
|
||||
).join(' ');
|
||||
|
||||
const wordSpans = heroText.querySelectorAll('.word-reveal');
|
||||
wordSpans.forEach((word, index) => {
|
||||
setTimeout(() => {
|
||||
word.style.opacity = '1';
|
||||
word.style.transform = 'translateY(0)';
|
||||
}, 1000 + index * 100);
|
||||
});
|
||||
}
|
||||
},
|
||||
|
||||
// 3D card tilt effect
|
||||
initCardTilt() {
|
||||
const cards = document.querySelectorAll('.tool-card, .value-card, .why-card');
|
||||
|
||||
cards.forEach(card => {
|
||||
card.addEventListener('mousemove', (e) => {
|
||||
const rect = card.getBoundingClientRect();
|
||||
const x = e.clientX - rect.left;
|
||||
const y = e.clientY - rect.top;
|
||||
|
||||
const centerX = rect.width / 2;
|
||||
const centerY = rect.height / 2;
|
||||
|
||||
const rotateX = (y - centerY) / 10;
|
||||
const rotateY = (centerX - x) / 10;
|
||||
|
||||
card.style.transform = `perspective(1000px) rotateX(${rotateX}deg) rotateY(${rotateY}deg) scale(1.02)`;
|
||||
});
|
||||
|
||||
card.addEventListener('mouseleave', () => {
|
||||
card.style.transform = '';
|
||||
});
|
||||
});
|
||||
},
|
||||
|
||||
// Custom cursor effects - DISABLED
|
||||
initCursorEffects() {
|
||||
// Cursor removed as requested
|
||||
return;
|
||||
},
|
||||
|
||||
// Animated number counters
|
||||
initNumberCounters() {
|
||||
const counters = document.querySelectorAll('.indicator-value');
|
||||
const animationDuration = 2000;
|
||||
let hasAnimated = false;
|
||||
|
||||
const animateCounters = () => {
|
||||
if (hasAnimated) return;
|
||||
|
||||
counters.forEach(counter => {
|
||||
const target = parseFloat(counter.dataset.target);
|
||||
const start = 0;
|
||||
const increment = target / (animationDuration / 16);
|
||||
let current = start;
|
||||
|
||||
const updateCounter = () => {
|
||||
current += increment;
|
||||
if (current < target) {
|
||||
counter.textContent = Math.floor(current);
|
||||
requestAnimationFrame(updateCounter);
|
||||
} else {
|
||||
counter.textContent = target % 1 === 0 ? target : target.toFixed(1);
|
||||
}
|
||||
};
|
||||
|
||||
updateCounter();
|
||||
});
|
||||
|
||||
hasAnimated = true;
|
||||
};
|
||||
|
||||
// Trigger on scroll into view
|
||||
const observerOptions = {
|
||||
threshold: 0.5
|
||||
};
|
||||
|
||||
const observer = new IntersectionObserver((entries) => {
|
||||
entries.forEach(entry => {
|
||||
if (entry.isIntersecting) {
|
||||
animateCounters();
|
||||
}
|
||||
});
|
||||
}, observerOptions);
|
||||
|
||||
const indicatorsSection = document.querySelector('.trust-indicators');
|
||||
if (indicatorsSection) {
|
||||
observer.observe(indicatorsSection);
|
||||
}
|
||||
},
|
||||
|
||||
// Reveal elements on scroll
|
||||
initRevealOnScroll() {
|
||||
const revealElements = document.querySelectorAll('.about-panel, .tool-card, .value-card, .why-card, .competency-item');
|
||||
|
||||
revealElements.forEach((element, index) => {
|
||||
element.style.opacity = '0';
|
||||
element.style.transform = 'translateY(50px)';
|
||||
element.style.transition = 'all 0.8s cubic-bezier(0.4, 0, 0.2, 1)';
|
||||
});
|
||||
|
||||
const revealOnScroll = () => {
|
||||
const windowHeight = window.innerHeight;
|
||||
|
||||
revealElements.forEach((element, index) => {
|
||||
const elementTop = element.getBoundingClientRect().top;
|
||||
const elementVisible = 100;
|
||||
|
||||
if (elementTop < windowHeight - elementVisible) {
|
||||
setTimeout(() => {
|
||||
element.style.opacity = '1';
|
||||
element.style.transform = 'translateY(0)';
|
||||
}, index * 50);
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
window.addEventListener('scroll', revealOnScroll);
|
||||
revealOnScroll(); // Check on initial load
|
||||
},
|
||||
|
||||
// Scroll-based animations
|
||||
initScrollAnimations() {
|
||||
let lastScrollY = window.scrollY;
|
||||
let ticking = false;
|
||||
|
||||
function updateScrollAnimations() {
|
||||
const scrollY = window.scrollY;
|
||||
const scrollDirection = scrollY > lastScrollY ? 'down' : 'up';
|
||||
|
||||
// Hero parallax
|
||||
const hero = document.querySelector('.hero-content');
|
||||
if (hero) {
|
||||
hero.style.transform = `translateY(${scrollY * 0.5}px)`;
|
||||
hero.style.opacity = 1 - (scrollY / 800);
|
||||
}
|
||||
|
||||
// Video parallax
|
||||
const heroVideos = document.querySelector('.hero-video-container');
|
||||
if (heroVideos) {
|
||||
heroVideos.style.transform = `translateY(${scrollY * 0.3}px) scale(${1 + scrollY * 0.0003})`;
|
||||
}
|
||||
|
||||
lastScrollY = scrollY;
|
||||
ticking = false;
|
||||
}
|
||||
|
||||
function requestTick() {
|
||||
if (!ticking) {
|
||||
window.requestAnimationFrame(updateScrollAnimations);
|
||||
ticking = true;
|
||||
}
|
||||
}
|
||||
|
||||
window.addEventListener('scroll', requestTick);
|
||||
},
|
||||
|
||||
// Enhanced navbar effects
|
||||
initNavbarEffects() {
|
||||
const navbar = document.querySelector('.navbar');
|
||||
let lastScrollY = window.scrollY;
|
||||
|
||||
window.addEventListener('scroll', () => {
|
||||
const scrollY = window.scrollY;
|
||||
|
||||
if (scrollY > 50) {
|
||||
navbar.classList.add('scrolled');
|
||||
} else {
|
||||
navbar.classList.remove('scrolled');
|
||||
}
|
||||
|
||||
// Keep navbar always visible
|
||||
navbar.style.transform = 'translateY(0)';
|
||||
|
||||
lastScrollY = scrollY;
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
// Initialize when DOM is ready
|
||||
if (document.readyState === 'loading') {
|
||||
document.addEventListener('DOMContentLoaded', () => EnhancedAnimations.init());
|
||||
} else {
|
||||
EnhancedAnimations.init();
|
||||
}
|
||||
403
js/animations.js
@@ -1,403 +0,0 @@
|
||||
/**
|
||||
* Animation module for IntelSight website
|
||||
* Contains all animation logic and visual effects
|
||||
*/
|
||||
|
||||
// Particle Animation System
|
||||
const ParticleAnimation = {
|
||||
canvas: null,
|
||||
ctx: null,
|
||||
particles: [],
|
||||
|
||||
/**
|
||||
* Initialize particle animation
|
||||
*/
|
||||
init() {
|
||||
this.canvas = document.querySelector(SELECTORS.PARTICLE_CANVAS);
|
||||
if (!this.canvas) return;
|
||||
|
||||
this.ctx = this.canvas.getContext('2d');
|
||||
this.resizeCanvas();
|
||||
this.createParticles();
|
||||
this.animate();
|
||||
|
||||
// Handle window resize
|
||||
window.addEventListener('resize', () => this.resizeCanvas());
|
||||
},
|
||||
|
||||
/**
|
||||
* Resize canvas to window size
|
||||
*/
|
||||
resizeCanvas() {
|
||||
this.canvas.width = window.innerWidth;
|
||||
this.canvas.height = window.innerHeight;
|
||||
},
|
||||
|
||||
/**
|
||||
* Create particle objects
|
||||
*/
|
||||
createParticles() {
|
||||
this.particles = [];
|
||||
for (let i = 0; i < CONFIG.ANIMATION.PARTICLE_COUNT; i++) {
|
||||
this.particles.push(new Particle(this.canvas));
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Main animation loop
|
||||
*/
|
||||
animate() {
|
||||
this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);
|
||||
|
||||
// Update and draw particles
|
||||
this.particles.forEach(particle => {
|
||||
particle.update(this.canvas);
|
||||
particle.draw(this.ctx);
|
||||
});
|
||||
|
||||
// Draw connections between particles
|
||||
this.drawConnections();
|
||||
|
||||
requestAnimationFrame(() => this.animate());
|
||||
},
|
||||
|
||||
/**
|
||||
* Draw connections between nearby particles
|
||||
*/
|
||||
drawConnections() {
|
||||
for (let a = 0; a < this.particles.length; a++) {
|
||||
for (let b = a + 1; b < this.particles.length; b++) {
|
||||
const distance = Math.sqrt(
|
||||
Math.pow(this.particles[a].x - this.particles[b].x, 2) +
|
||||
Math.pow(this.particles[a].y - this.particles[b].y, 2)
|
||||
);
|
||||
|
||||
if (distance < CONFIG.ANIMATION.CONNECTION_DISTANCE) {
|
||||
const opacity = 0.15 * (1 - distance / CONFIG.ANIMATION.CONNECTION_DISTANCE);
|
||||
// Use darker blue for better visibility on light background
|
||||
this.ctx.strokeStyle = `rgba(15, 114, 181, ${opacity})`;
|
||||
this.ctx.lineWidth = 1;
|
||||
this.ctx.beginPath();
|
||||
this.ctx.moveTo(this.particles[a].x, this.particles[a].y);
|
||||
this.ctx.lineTo(this.particles[b].x, this.particles[b].y);
|
||||
this.ctx.stroke();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Particle class for animation
|
||||
*/
|
||||
class Particle {
|
||||
constructor(canvas) {
|
||||
this.x = Math.random() * canvas.width;
|
||||
this.y = Math.random() * canvas.height;
|
||||
this.size = Math.random() * (CONFIG.ANIMATION.PARTICLE_SIZE_MAX - CONFIG.ANIMATION.PARTICLE_SIZE_MIN) + CONFIG.ANIMATION.PARTICLE_SIZE_MIN;
|
||||
this.speedX = (Math.random() - 0.5) * CONFIG.ANIMATION.PARTICLE_SPEED;
|
||||
this.speedY = (Math.random() - 0.5) * CONFIG.ANIMATION.PARTICLE_SPEED;
|
||||
this.opacity = Math.random() * 0.5 + 0.2;
|
||||
}
|
||||
|
||||
update(canvas) {
|
||||
this.x += this.speedX;
|
||||
this.y += this.speedY;
|
||||
|
||||
// Wrap around screen edges
|
||||
if (this.x > canvas.width) this.x = 0;
|
||||
else if (this.x < 0) this.x = canvas.width;
|
||||
|
||||
if (this.y > canvas.height) this.y = 0;
|
||||
else if (this.y < 0) this.y = canvas.height;
|
||||
}
|
||||
|
||||
draw(ctx) {
|
||||
// Use darker blue for better visibility on light background
|
||||
ctx.fillStyle = `rgba(15, 114, 181, ${this.opacity * 0.7})`;
|
||||
ctx.beginPath();
|
||||
ctx.arc(this.x, this.y, this.size, 0, Math.PI * 2);
|
||||
ctx.fill();
|
||||
}
|
||||
}
|
||||
|
||||
// Counter Animation
|
||||
const CounterAnimation = {
|
||||
/**
|
||||
* Animate all counter elements
|
||||
*/
|
||||
animateAll() {
|
||||
const counters = document.querySelectorAll(SELECTORS.INDICATOR_VALUE);
|
||||
counters.forEach(counter => this.animateCounter(counter));
|
||||
},
|
||||
|
||||
/**
|
||||
* Animate a single counter
|
||||
* @param {HTMLElement} counter - Counter element to animate
|
||||
*/
|
||||
animateCounter(counter) {
|
||||
const target = parseFloat(counter.getAttribute(DATA_ATTRS.TARGET));
|
||||
const increment = target / CONFIG.ANIMATION.COUNTER_SPEED;
|
||||
let current = 0;
|
||||
|
||||
const updateCounter = () => {
|
||||
current += increment;
|
||||
|
||||
if (current < target) {
|
||||
counter.innerText = Math.ceil(current);
|
||||
setTimeout(updateCounter, CONFIG.TIMING.COUNTER_UPDATE_INTERVAL);
|
||||
} else {
|
||||
// Set final value with proper formatting
|
||||
if (target === CONFIG.TRUST_INDICATORS.AVAILABILITY) {
|
||||
counter.innerText = target + '%';
|
||||
} else if (target === CONFIG.TRUST_INDICATORS.AUTHORITIES_COUNT) {
|
||||
counter.innerText = target + '+';
|
||||
} else if (target === CONFIG.TRUST_INDICATORS.SUPPORT_HOURS) {
|
||||
counter.innerText = target + '/7';
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
updateCounter();
|
||||
}
|
||||
};
|
||||
|
||||
// Scroll Animations
|
||||
const ScrollAnimations = {
|
||||
scrollIndicator: null,
|
||||
|
||||
/**
|
||||
* Initialize scroll-based animations
|
||||
*/
|
||||
init() {
|
||||
this.scrollIndicator = document.querySelector(SELECTORS.SCROLL_INDICATOR);
|
||||
this.setupScrollIndicator();
|
||||
this.setupIntersectionObserver();
|
||||
},
|
||||
|
||||
/**
|
||||
* Setup scroll indicator behavior
|
||||
*/
|
||||
setupScrollIndicator() {
|
||||
if (!this.scrollIndicator) return;
|
||||
|
||||
// Click to scroll to about section
|
||||
this.scrollIndicator.addEventListener('click', () => {
|
||||
const aboutSection = document.querySelector('#about');
|
||||
if (aboutSection) {
|
||||
aboutSection.scrollIntoView({ behavior: 'smooth', block: 'start' });
|
||||
}
|
||||
});
|
||||
|
||||
// Hide/show based on scroll position
|
||||
let scrollTimeout;
|
||||
window.addEventListener('scroll', () => {
|
||||
const hero = document.querySelector(SELECTORS.HERO);
|
||||
|
||||
if (window.scrollY > CONFIG.ANIMATION.SCROLL_THRESHOLD) {
|
||||
if (hero) hero.classList.add(CLASSES.SCROLLED);
|
||||
if (this.scrollIndicator) this.scrollIndicator.style.opacity = '0';
|
||||
} else {
|
||||
if (hero) hero.classList.remove(CLASSES.SCROLLED);
|
||||
if (this.scrollIndicator) this.scrollIndicator.style.opacity = '1';
|
||||
}
|
||||
|
||||
clearTimeout(scrollTimeout);
|
||||
scrollTimeout = setTimeout(() => {
|
||||
if (window.scrollY > CONFIG.ANIMATION.SCROLL_THRESHOLD && this.scrollIndicator) {
|
||||
this.scrollIndicator.style.display = 'none';
|
||||
} else if (this.scrollIndicator) {
|
||||
this.scrollIndicator.style.display = 'flex';
|
||||
}
|
||||
}, CONFIG.TIMING.SCROLL_HIDE_DELAY);
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
* Setup intersection observer for scroll-triggered animations
|
||||
*/
|
||||
setupIntersectionObserver() {
|
||||
const observerOptions = {
|
||||
threshold: CONFIG.OBSERVER.THRESHOLD,
|
||||
rootMargin: CONFIG.OBSERVER.ROOT_MARGIN
|
||||
};
|
||||
|
||||
const observer = new IntersectionObserver((entries) => {
|
||||
entries.forEach(entry => {
|
||||
if (entry.isIntersecting) {
|
||||
// Trust indicators animation
|
||||
if (entry.target.classList.contains('trust-indicators')) {
|
||||
CounterAnimation.animateAll();
|
||||
observer.unobserve(entry.target);
|
||||
}
|
||||
|
||||
// Timeline animation
|
||||
if (entry.target.classList.contains('timeline')) {
|
||||
const items = entry.target.querySelectorAll('.timeline-item');
|
||||
items.forEach((item, index) => {
|
||||
setTimeout(() => {
|
||||
item.classList.add(CLASSES.VISIBLE);
|
||||
}, index * 300);
|
||||
});
|
||||
observer.unobserve(entry.target);
|
||||
}
|
||||
|
||||
// Feature nodes animation
|
||||
if (entry.target.classList.contains('feature-nodes')) {
|
||||
const nodes = entry.target.querySelectorAll('.node');
|
||||
nodes.forEach((node, index) => {
|
||||
setTimeout(() => {
|
||||
node.style.opacity = '1';
|
||||
node.style.transform = 'translateY(0)';
|
||||
}, index * 150);
|
||||
});
|
||||
observer.unobserve(entry.target);
|
||||
}
|
||||
}
|
||||
});
|
||||
}, observerOptions);
|
||||
|
||||
// Observe elements
|
||||
const trustIndicators = document.querySelector(SELECTORS.TRUST_INDICATORS);
|
||||
if (trustIndicators) {
|
||||
trustIndicators.style.opacity = '0';
|
||||
observer.observe(trustIndicators);
|
||||
}
|
||||
|
||||
const timeline = document.querySelector('.timeline');
|
||||
if (timeline) observer.observe(timeline);
|
||||
|
||||
const featureNodes = document.querySelector('.feature-nodes');
|
||||
if (featureNodes) {
|
||||
document.querySelectorAll('.node').forEach(node => {
|
||||
node.style.opacity = '0';
|
||||
node.style.transform = 'translateY(30px)';
|
||||
node.style.transition = 'all 0.6s ease';
|
||||
});
|
||||
observer.observe(featureNodes);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// Glitch Effect
|
||||
const GlitchEffect = {
|
||||
/**
|
||||
* Apply glitch effect to element on hover
|
||||
* @param {HTMLElement} element - Element to apply effect to
|
||||
*/
|
||||
apply(element) {
|
||||
if (!element) return;
|
||||
|
||||
let glitchInterval;
|
||||
element.addEventListener('mouseenter', () => {
|
||||
let count = 0;
|
||||
glitchInterval = setInterval(() => {
|
||||
element.style.textShadow = `
|
||||
${Math.random() * 5}px ${Math.random() * 5}px 0 rgba(0, 212, 255, 0.5),
|
||||
${Math.random() * -5}px ${Math.random() * 5}px 0 rgba(255, 0, 128, 0.5)
|
||||
`;
|
||||
count++;
|
||||
if (count > CONFIG.ANIMATION.GLITCH_ITERATIONS) {
|
||||
clearInterval(glitchInterval);
|
||||
element.style.textShadow = 'none';
|
||||
}
|
||||
}, CONFIG.ANIMATION.GLITCH_INTERVAL);
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
// Interactive Elements
|
||||
const InteractiveElements = {
|
||||
/**
|
||||
* Initialize all interactive element animations
|
||||
*/
|
||||
init() {
|
||||
this.setupNodeHoverEffects();
|
||||
this.setupWidgetHoverEffects();
|
||||
this.setupInteractiveIcon();
|
||||
},
|
||||
|
||||
/**
|
||||
* Setup hover effects for node elements
|
||||
*/
|
||||
setupNodeHoverEffects() {
|
||||
document.querySelectorAll('.node').forEach(node => {
|
||||
node.addEventListener('mouseenter', function() {
|
||||
const icon = this.querySelector('.node-icon');
|
||||
if (icon) icon.style.transform = 'scale(1.2) rotate(5deg)';
|
||||
});
|
||||
|
||||
node.addEventListener('mouseleave', function() {
|
||||
const icon = this.querySelector('.node-icon');
|
||||
if (icon) icon.style.transform = 'scale(1) rotate(0deg)';
|
||||
});
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
* Setup hover effects for widget elements
|
||||
*/
|
||||
setupWidgetHoverEffects() {
|
||||
document.querySelectorAll('.widget').forEach(widget => {
|
||||
widget.addEventListener('mouseenter', function() {
|
||||
this.style.boxShadow = '0 5px 20px rgba(0, 212, 255, 0.3)';
|
||||
});
|
||||
|
||||
widget.addEventListener('mouseleave', function() {
|
||||
this.style.boxShadow = 'none';
|
||||
});
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
* Setup 3D interactive icon effect
|
||||
*/
|
||||
setupInteractiveIcon() {
|
||||
const icon = document.querySelector(SELECTORS.INTERACTIVE_ICON);
|
||||
if (!icon) return;
|
||||
|
||||
document.addEventListener('mousemove', (e) => {
|
||||
const rect = icon.getBoundingClientRect();
|
||||
const centerX = rect.left + rect.width / 2;
|
||||
const centerY = rect.top + rect.height / 2;
|
||||
|
||||
const mouseX = (e.clientX - centerX) / 20;
|
||||
const mouseY = (e.clientY - centerY) / 20;
|
||||
|
||||
icon.style.transform = `perspective(1000px) rotateY(${mouseX}deg) rotateX(${-mouseY}deg)`;
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
// Initialize all animations
|
||||
const Animations = {
|
||||
/**
|
||||
* Initialize all animation systems
|
||||
*/
|
||||
init() {
|
||||
// Core animations
|
||||
ParticleAnimation.init();
|
||||
ScrollAnimations.init();
|
||||
InteractiveElements.init();
|
||||
|
||||
// Apply glitch effect to main title
|
||||
const mainTitle = document.querySelector('.main-title');
|
||||
if (mainTitle) {
|
||||
GlitchEffect.apply(mainTitle);
|
||||
}
|
||||
|
||||
// Page load animations
|
||||
window.addEventListener('load', () => {
|
||||
document.body.classList.add(CLASSES.LOADED);
|
||||
|
||||
// Fade in hero content
|
||||
setTimeout(() => {
|
||||
const heroContent = document.querySelector(SELECTORS.HERO_CONTENT);
|
||||
if (heroContent) {
|
||||
heroContent.style.opacity = '1';
|
||||
heroContent.style.transform = 'translateY(0)';
|
||||
}
|
||||
}, 100);
|
||||
});
|
||||
}
|
||||
};
|
||||
744
js/app.js
Normale Datei
@@ -0,0 +1,744 @@
|
||||
/* AegisSight Monitor - Product Page v2 */
|
||||
(function () {
|
||||
'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 ==================== */
|
||||
var navbar = document.getElementById('navbar');
|
||||
window.addEventListener('scroll', function () {
|
||||
navbar.classList.toggle('scrolled', window.scrollY > 10);
|
||||
});
|
||||
|
||||
/* ==================== MOBILE MENU ==================== */
|
||||
var toggle = document.querySelector('.mobile-menu-toggle');
|
||||
var menu = document.getElementById('mobile-menu');
|
||||
var overlay = document.getElementById('mobile-overlay');
|
||||
|
||||
function closeMenu() {
|
||||
toggle.classList.remove('active');
|
||||
menu.classList.remove('open');
|
||||
overlay.classList.remove('open');
|
||||
toggle.setAttribute('aria-expanded', 'false');
|
||||
}
|
||||
|
||||
toggle.addEventListener('click', function () {
|
||||
var isOpen = menu.classList.contains('open');
|
||||
if (isOpen) { closeMenu(); } else {
|
||||
toggle.classList.add('active');
|
||||
menu.classList.add('open');
|
||||
overlay.classList.add('open');
|
||||
toggle.setAttribute('aria-expanded', 'true');
|
||||
}
|
||||
});
|
||||
|
||||
overlay.addEventListener('click', closeMenu);
|
||||
menu.querySelectorAll('a').forEach(function (l) { l.addEventListener('click', closeMenu); });
|
||||
|
||||
/* ==================== SMOOTH SCROLL ==================== */
|
||||
document.querySelectorAll('a[href^="#"]').forEach(function (link) {
|
||||
link.addEventListener('click', function (e) {
|
||||
var t = document.querySelector(this.getAttribute('href'));
|
||||
if (t) { e.preventDefault(); t.scrollIntoView({ behavior: 'smooth' }); }
|
||||
});
|
||||
});
|
||||
|
||||
/* ==================== HERO SLIDER (video-driven mit Endcard) ==================== */
|
||||
var heroEl = document.querySelector('.hero');
|
||||
var heroSlides = document.querySelectorAll('.hero-slide');
|
||||
var heroDots = document.querySelectorAll('.hero-dot');
|
||||
var heroCurrentSlide = 0;
|
||||
var heroEndcardTimer = null;
|
||||
var heroFallbackTimer = null;
|
||||
var heroIsTransitioning = false;
|
||||
var HERO_ENDCARD_MS = 7000;
|
||||
var HERO_FALLBACK_MS = 25000;
|
||||
|
||||
function heroClearTimers() {
|
||||
if (heroEndcardTimer) { clearTimeout(heroEndcardTimer); heroEndcardTimer = null; }
|
||||
if (heroFallbackTimer) { clearTimeout(heroFallbackTimer); heroFallbackTimer = null; }
|
||||
}
|
||||
|
||||
function heroPlaySlideVideo(slide) {
|
||||
var v = slide && slide.querySelector('video');
|
||||
if (!v) return;
|
||||
try { v.currentTime = 0; } catch (err) { /* ignore */ }
|
||||
var p = v.play();
|
||||
if (p && typeof p.catch === 'function') p.catch(function () { /* autoplay blocked */ });
|
||||
}
|
||||
|
||||
function heroPauseSlideVideo(slide) {
|
||||
var v = slide && slide.querySelector('video');
|
||||
if (v) v.pause();
|
||||
}
|
||||
|
||||
function heroEnterEndcard() {
|
||||
if (!heroSlides.length) return;
|
||||
var slide = heroSlides[heroCurrentSlide];
|
||||
if (!slide || slide.classList.contains('ended')) return;
|
||||
slide.classList.add('ended');
|
||||
if (heroEl) heroEl.classList.add('endcard');
|
||||
heroClearTimers();
|
||||
heroEndcardTimer = setTimeout(function () {
|
||||
heroEndcardTimer = null;
|
||||
heroNext();
|
||||
}, HERO_ENDCARD_MS);
|
||||
}
|
||||
|
||||
function heroStartSlide() {
|
||||
var slide = heroSlides[heroCurrentSlide];
|
||||
if (!slide) return;
|
||||
slide.classList.remove('ended');
|
||||
if (heroEl) heroEl.classList.remove('endcard');
|
||||
heroPlaySlideVideo(slide);
|
||||
heroClearTimers();
|
||||
heroFallbackTimer = setTimeout(function () {
|
||||
heroFallbackTimer = null;
|
||||
heroEnterEndcard();
|
||||
}, HERO_FALLBACK_MS);
|
||||
}
|
||||
|
||||
function heroGoTo(index) {
|
||||
if (heroIsTransitioning || index === heroCurrentSlide || !heroSlides.length) return;
|
||||
heroIsTransitioning = true;
|
||||
heroClearTimers();
|
||||
|
||||
var oldIndex = heroCurrentSlide;
|
||||
heroSlides[oldIndex].classList.add('exiting');
|
||||
heroSlides[oldIndex].classList.remove('active');
|
||||
// .ended bleibt waehrend des Fade-outs erhalten - sonst blitzt das pausierte
|
||||
// Video-Frame durch, waehrend die Endcard ausfadet und der Container fadet aus.
|
||||
if (heroEl) heroEl.classList.remove('endcard');
|
||||
if (heroDots[oldIndex]) heroDots[oldIndex].classList.remove('active');
|
||||
|
||||
heroPauseSlideVideo(heroSlides[oldIndex]);
|
||||
|
||||
setTimeout(function () {
|
||||
heroSlides[oldIndex].classList.remove('exiting', 'ended');
|
||||
heroCurrentSlide = index;
|
||||
heroSlides[heroCurrentSlide].classList.add('active');
|
||||
if (heroDots[heroCurrentSlide]) heroDots[heroCurrentSlide].classList.add('active');
|
||||
heroStartSlide();
|
||||
heroIsTransitioning = false;
|
||||
}, 400);
|
||||
}
|
||||
|
||||
function heroNext() {
|
||||
heroGoTo((heroCurrentSlide + 1) % heroSlides.length);
|
||||
}
|
||||
|
||||
function heroPrev() {
|
||||
heroGoTo((heroCurrentSlide - 1 + heroSlides.length) % heroSlides.length);
|
||||
}
|
||||
|
||||
// Pro Video: 'ended' → Endcard-Phase starten
|
||||
heroSlides.forEach(function (slide) {
|
||||
var v = slide.querySelector('video');
|
||||
if (!v) return;
|
||||
v.addEventListener('ended', function () {
|
||||
if (slide.classList.contains('active')) heroEnterEndcard();
|
||||
});
|
||||
});
|
||||
|
||||
heroDots.forEach(function (dot, i) {
|
||||
dot.addEventListener('click', function () { heroGoTo(i); });
|
||||
});
|
||||
|
||||
var heroPrevBtn = document.querySelector('.hero-arrow-prev');
|
||||
var heroNextBtn = document.querySelector('.hero-arrow-next');
|
||||
if (heroPrevBtn) heroPrevBtn.addEventListener('click', heroPrev);
|
||||
if (heroNextBtn) heroNextBtn.addEventListener('click', heroNext);
|
||||
|
||||
var heroSlider = document.querySelector('.hero-slider');
|
||||
if (heroSlider) {
|
||||
var heroTouchStartX = 0;
|
||||
heroSlider.addEventListener('touchstart', function (e) {
|
||||
heroTouchStartX = e.changedTouches[0].screenX;
|
||||
}, { passive: true });
|
||||
heroSlider.addEventListener('touchend', function (e) {
|
||||
var diff = e.changedTouches[0].screenX - heroTouchStartX;
|
||||
if (Math.abs(diff) > 50) {
|
||||
if (diff < 0) heroNext(); else heroPrev();
|
||||
}
|
||||
}, { passive: true });
|
||||
}
|
||||
|
||||
document.addEventListener('visibilitychange', function () {
|
||||
var slide = heroSlides[heroCurrentSlide];
|
||||
if (!slide) return;
|
||||
if (document.hidden) {
|
||||
heroClearTimers();
|
||||
heroPauseSlideVideo(slide);
|
||||
return;
|
||||
}
|
||||
if (slide.classList.contains('ended')) {
|
||||
heroEndcardTimer = setTimeout(function () {
|
||||
heroEndcardTimer = null;
|
||||
heroNext();
|
||||
}, HERO_ENDCARD_MS);
|
||||
} else {
|
||||
var v = slide.querySelector('video');
|
||||
if (v) {
|
||||
var p = v.play();
|
||||
if (p && typeof p.catch === 'function') p.catch(function () {});
|
||||
}
|
||||
heroFallbackTimer = setTimeout(function () {
|
||||
heroFallbackTimer = null;
|
||||
heroEnterEndcard();
|
||||
}, HERO_FALLBACK_MS);
|
||||
}
|
||||
});
|
||||
|
||||
// Initialer Start (Slide 0 ist bereits .active im HTML)
|
||||
if (heroSlides.length) heroStartSlide();
|
||||
|
||||
/* ==================== MAP STATE ==================== */
|
||||
var mapInstance = null;
|
||||
var markerLayer = null;
|
||||
var legendControl = null;
|
||||
var lageData = {};
|
||||
var dataLoaded = false;
|
||||
|
||||
var lageTitlesByLang = {
|
||||
de: {
|
||||
'iran-konflikt': 'Gro\u00dflage - Irankonflikt',
|
||||
'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 ==================== */
|
||||
var cards = document.querySelectorAll('.carousel-card');
|
||||
var dots = document.querySelectorAll('.carousel-dot');
|
||||
var activeIndex = 0;
|
||||
|
||||
window.positionCards = function positionCards(idx) {
|
||||
activeIndex = idx;
|
||||
cards.forEach(function (card, i) {
|
||||
card.classList.remove('active', 'left', 'right', 'hidden');
|
||||
if (i === idx) card.classList.add('active');
|
||||
else if (i === (idx - 1 + cards.length) % cards.length) card.classList.add('left');
|
||||
else if (i === (idx + 1) % cards.length) card.classList.add('right');
|
||||
else card.classList.add('hidden');
|
||||
});
|
||||
dots.forEach(function (dot, i) {
|
||||
dot.classList.toggle('active', i === idx);
|
||||
});
|
||||
// Update map based on active Lage (only after data loaded)
|
||||
if (!dataLoaded) return;
|
||||
var lage = cards[idx].getAttribute('data-lage');
|
||||
var mapSection = document.getElementById('map-section');
|
||||
if (lage && lageData[lage]) {
|
||||
mapSection.classList.remove('map-hidden');
|
||||
showMarkers(lageData[lage].locations, lageData[lage].category_labels);
|
||||
// Stats-Bar aktualisieren
|
||||
var titleEl = document.querySelector('.live-stats-title');
|
||||
if (titleEl) titleEl.textContent = lageTitles[lage] || lage;
|
||||
countUp(document.getElementById('stat-articles'), lageData[lage].article_count);
|
||||
countUp(document.getElementById('stat-sources'), lageData[lage].source_count);
|
||||
countUp(document.getElementById('stat-factchecks'), lageData[lage].factcheck_count);
|
||||
} else {
|
||||
if (mapSection) mapSection.classList.add('map-hidden');
|
||||
clearMarkers();
|
||||
}
|
||||
}
|
||||
|
||||
cards.forEach(function (card, i) {
|
||||
card.addEventListener('click', function () {
|
||||
if (!card.classList.contains('active')) positionCards(i);
|
||||
});
|
||||
});
|
||||
|
||||
dots.forEach(function (dot, i) {
|
||||
dot.addEventListener('click', function () { positionCards(i); });
|
||||
});
|
||||
|
||||
positionCards(0);
|
||||
|
||||
// Arrow navigation
|
||||
var prevBtn = document.querySelector('.carousel-prev');
|
||||
var nextBtn = document.querySelector('.carousel-next');
|
||||
if (prevBtn) prevBtn.addEventListener('click', function () {
|
||||
positionCards((activeIndex - 1 + cards.length) % cards.length);
|
||||
});
|
||||
if (nextBtn) nextBtn.addEventListener('click', function () {
|
||||
positionCards((activeIndex + 1) % cards.length);
|
||||
});
|
||||
|
||||
/* ==================== NEUESTE ENTWICKLUNGEN (Live-Monitoring) ==================== */
|
||||
function htmlEscape(s) {
|
||||
return String(s == null ? '' : s)
|
||||
.replace(/&/g, '&')
|
||||
.replace(/</g, '<')
|
||||
.replace(/>/g, '>')
|
||||
.replace(/"/g, '"');
|
||||
}
|
||||
|
||||
function normalizeSourceName(s) {
|
||||
return String(s || '').toLowerCase().replace(/^(der|die|das)\s+/, '').replace(/\s+/g, ' ').trim();
|
||||
}
|
||||
|
||||
function renderLatestDevelopments(text, sources) {
|
||||
if (!text) return null;
|
||||
sources = Array.isArray(sources) ? sources : [];
|
||||
|
||||
var lines = text.split('\n').map(function (l) { return l.trim(); })
|
||||
.filter(function (l) { return l && (l.charAt(0) === '-' || l.charAt(0) === '['); });
|
||||
if (!lines.length) return null;
|
||||
|
||||
var bulletRe = /^(?:-\s*)?\[\s*(\d{1,2})\.(\d{1,2})\.?(?:\d{2,4})?\s+(\d{1,2}:\d{2})\s*\]\s*(.+?)\s*$/;
|
||||
var trailingRe = /\s*\{([^{}]+)\}\s*\.?\s*$/;
|
||||
var citationRe = /\[(\d+[a-z]?)\]/g;
|
||||
var junkRe = /^(unbekannt|unknown|n\/?a|keine|keine quelle|tba)$/i;
|
||||
|
||||
function buildPill(src, name) {
|
||||
var disp = (src && src.name) || name;
|
||||
var url = (src && src.url) || '';
|
||||
var tgMatch = url.match(/^https?:\/\/t\.me\/([^\/?#]+)/i);
|
||||
var label = tgMatch ? disp + ' (t.me/' + tgMatch[1] + ')' : disp;
|
||||
var e = htmlEscape(label);
|
||||
var titleEsc = htmlEscape(disp);
|
||||
if (src && src.url) {
|
||||
return '<a href="' + htmlEscape(src.url) + '" target="_blank" rel="noopener" class="dev-source-pill" title="' + titleEsc + '">' + e + '</a>';
|
||||
}
|
||||
return '<span class="dev-source-pill" title="' + titleEsc + '">' + e + '</span>';
|
||||
}
|
||||
|
||||
function lookupByName(name) {
|
||||
var n = normalizeSourceName(name);
|
||||
if (!n) return null;
|
||||
var exact = sources.find(function (s) { return normalizeSourceName(s.name) === n; });
|
||||
if (exact) return exact;
|
||||
return sources.find(function (s) {
|
||||
var sn = normalizeSourceName(s.name);
|
||||
return sn && (sn.indexOf(n) !== -1 || n.indexOf(sn) !== -1);
|
||||
}) || null;
|
||||
}
|
||||
|
||||
var cards = [];
|
||||
for (var i = 0; i < lines.length; i++) {
|
||||
var m = bulletRe.exec(lines[i]);
|
||||
if (!m) continue;
|
||||
var date = String(m[1]).padStart(2, '0') + '.' + String(m[2]).padStart(2, '0') + '.';
|
||||
var time = m[3];
|
||||
var body = m[4];
|
||||
|
||||
var pills = '';
|
||||
var t = trailingRe.exec(body);
|
||||
if (t) {
|
||||
body = body.replace(trailingRe, '').trim();
|
||||
var items = t[1].split(',').map(function (n) { return n.trim(); }).filter(Boolean);
|
||||
var seen = {};
|
||||
pills = items.map(function (item) {
|
||||
var pipeIdx = item.indexOf('|');
|
||||
var itemName = pipeIdx >= 0 ? item.slice(0, pipeIdx).trim() : item.trim();
|
||||
var itemUrl = pipeIdx >= 0 ? item.slice(pipeIdx + 1).trim() : '';
|
||||
if (!itemName || junkRe.test(itemName)) return '';
|
||||
var key = normalizeSourceName(itemName);
|
||||
if (seen[key]) return '';
|
||||
seen[key] = true;
|
||||
if (itemUrl) {
|
||||
return buildPill({ name: itemName, url: itemUrl }, itemName);
|
||||
}
|
||||
return buildPill(lookupByName(itemName), itemName);
|
||||
}).filter(Boolean).join('');
|
||||
}
|
||||
if (!pills) {
|
||||
var nums = [];
|
||||
var cm;
|
||||
while ((cm = citationRe.exec(body)) !== null) {
|
||||
if (nums.indexOf(cm[1]) === -1) nums.push(cm[1]);
|
||||
}
|
||||
citationRe.lastIndex = 0;
|
||||
if (nums.length) {
|
||||
body = body.replace(citationRe, '').replace(/\s+/g, ' ').trim();
|
||||
pills = nums.map(function (num) {
|
||||
var src = sources.find(function (s) { return String(s.nr) === num || Number(s.nr) === Number(num); });
|
||||
return src ? buildPill(src, src.name) : '';
|
||||
}).filter(Boolean).join('');
|
||||
}
|
||||
}
|
||||
|
||||
var head = '<div class="dev-bullet-head">'
|
||||
+ '<span class="dev-sources">' + pills + '</span>'
|
||||
+ '<span class="dev-time">' + htmlEscape(time) + ' \u00b7 ' + htmlEscape(date) + '</span>'
|
||||
+ '</div>';
|
||||
cards.push('<div class="dev-bullet">' + head + '<div class="dev-body">' + htmlEscape(body) + '</div></div>');
|
||||
}
|
||||
|
||||
if (!cards.length) return null;
|
||||
return '<div class="dev-list-heading">Neueste Entwicklungen</div>'
|
||||
+ '<div class="dev-list">' + cards.join('') + '</div>';
|
||||
}
|
||||
|
||||
/* ==================== SIMPLE MARKDOWN ==================== */
|
||||
function mdToHtml(md) {
|
||||
if (!md) return '';
|
||||
var lines = md.split('\n');
|
||||
var html = '';
|
||||
var inList = false;
|
||||
for (var i = 0; i < lines.length; i++) {
|
||||
var line = lines[i].trim();
|
||||
if (!line) {
|
||||
if (inList) { html += '</ul>'; inList = false; }
|
||||
continue;
|
||||
}
|
||||
line = line.replace(/\[(\d+[a-z]?)\]/g, '');
|
||||
line = line.replace(/\*\*(.+?)\*\*/g, '<strong>$1</strong>');
|
||||
if (/^## /.test(line)) {
|
||||
if (inList) { html += '</ul>'; inList = false; }
|
||||
html += '<h2>' + line.replace(/^## /, '') + '</h2>';
|
||||
} else if (/^### /.test(line)) {
|
||||
if (inList) { html += '</ul>'; inList = false; }
|
||||
html += '<h3>' + line.replace(/^### /, '') + '</h3>';
|
||||
} else if (/^- /.test(line)) {
|
||||
if (!inList) { html += '<ul>'; inList = true; }
|
||||
html += '<li>' + line.replace(/^- /, '') + '</li>';
|
||||
} else {
|
||||
if (inList) { html += '</ul>'; inList = false; }
|
||||
html += '<p>' + line + '</p>';
|
||||
}
|
||||
}
|
||||
if (inList) html += '</ul>';
|
||||
return html;
|
||||
}
|
||||
|
||||
/* ==================== COUNT-UP ANIMATION ==================== */
|
||||
function countUp(el, target) {
|
||||
if (!el) return;
|
||||
if (!target) { el.textContent = '0'; return; }
|
||||
var duration = 1200;
|
||||
var startTime = null;
|
||||
function step(ts) {
|
||||
if (!startTime) startTime = ts;
|
||||
var progress = Math.min((ts - startTime) / duration, 1);
|
||||
var ease = 1 - Math.pow(1 - progress, 3);
|
||||
el.textContent = Math.floor(ease * target).toLocaleString('de-DE');
|
||||
if (progress < 1) requestAnimationFrame(step);
|
||||
}
|
||||
requestAnimationFrame(step);
|
||||
}
|
||||
|
||||
/* ==================== LIVE DATA ==================== */
|
||||
function timeAgo(dateStr) {
|
||||
var diffMin = Math.floor((Date.now() - new Date(dateStr).getTime()) / 60000);
|
||||
if (diffMin < 1) return 'Gerade eben aktualisiert';
|
||||
if (diffMin < 60) return 'Aktualisiert vor ' + diffMin + ' Min.';
|
||||
var diffH = Math.floor(diffMin / 60);
|
||||
if (diffH < 24) return 'Aktualisiert vor ' + diffH + ' Std.';
|
||||
var diffD = Math.floor(diffH / 24);
|
||||
return 'Aktualisiert vor ' + diffD + (diffD === 1 ? ' Tag' : ' Tagen');
|
||||
}
|
||||
|
||||
function loadLiveData() {
|
||||
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 (data) {
|
||||
var inc = data.incident || {};
|
||||
// summary.json has flat structure
|
||||
|
||||
var ea = document.getElementById('stat-articles');
|
||||
var es = document.getElementById('stat-sources');
|
||||
var ef = document.getElementById('stat-factchecks');
|
||||
countUp(ea, inc.article_count);
|
||||
countUp(es, inc.source_count);
|
||||
countUp(ef, inc.factcheck_count);
|
||||
|
||||
// Excerpt: pre-extracted in summary.json
|
||||
var excerptEl = document.getElementById('excerpt-text');
|
||||
if (excerptEl && data.zusammenfassung) {
|
||||
excerptEl.innerHTML = mdToHtml(data.zusammenfassung);
|
||||
}
|
||||
|
||||
// Store data and init map
|
||||
lageData['iran-konflikt'] = {
|
||||
locations: data.locations || [],
|
||||
category_labels: data.category_labels || {},
|
||||
article_count: inc.article_count || 0,
|
||||
source_count: inc.source_count || 0,
|
||||
factcheck_count: inc.factcheck_count || 0
|
||||
};
|
||||
dataLoaded = true;
|
||||
createMap();
|
||||
var mapSection = document.getElementById('map-section');
|
||||
if (mapSection) mapSection.classList.remove('map-hidden');
|
||||
showMarkers(data.locations || [], data.category_labels || {});
|
||||
})
|
||||
.catch(function () {
|
||||
});
|
||||
}
|
||||
|
||||
/* ==================== LEAFLET MAP ==================== */
|
||||
function clearMarkers() {
|
||||
if (markerLayer) { mapInstance.removeLayer(markerLayer); markerLayer = null; }
|
||||
if (legendControl && mapInstance) { mapInstance.removeControl(legendControl); legendControl = null; }
|
||||
}
|
||||
|
||||
function createMap() {
|
||||
if (mapInstance) return;
|
||||
var mapEl = document.getElementById('map-container');
|
||||
if (!mapEl || typeof L === 'undefined') return;
|
||||
|
||||
mapInstance = L.map(mapEl, {
|
||||
center: [33.0, 48.0], zoom: 5, zoomControl: true, scrollWheelZoom: true,
|
||||
minZoom: 2, maxBounds: [[-85, -180], [85, 180]], maxBoundsViscosity: 1.0
|
||||
});
|
||||
|
||||
L.tileLayer('https://tile.openstreetmap.de/{z}/{x}/{y}.png', {
|
||||
attribution: '© <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a>',
|
||||
maxZoom: 19, noWrap: true
|
||||
}).addTo(mapInstance);
|
||||
|
||||
setTimeout(function () { mapInstance.invalidateSize(); }, 500);
|
||||
}
|
||||
|
||||
function pulseIcon(color) {
|
||||
return L.divIcon({
|
||||
className: '',
|
||||
html: '<div class="pulse-marker-wrapper">'
|
||||
+ '<div class="pulse-marker-ring" style="border-color:' + color + '"></div>'
|
||||
+ '<div class="pulse-marker-ring" style="border-color:' + color + '"></div>'
|
||||
+ '<div class="pulse-marker-dot" style="background:' + color + ';box-shadow:0 0 10px ' + color + '"></div>'
|
||||
+ '</div>',
|
||||
iconSize: [20, 20], iconAnchor: [10, 10], popupAnchor: [0, -12]
|
||||
});
|
||||
}
|
||||
|
||||
function buildPopup(loc) {
|
||||
var html = '<strong style="color:#E8ECF4;">' + (loc.name || '') + '</strong>';
|
||||
if (loc.country_code) html += ' <span style="color:#8896AB;font-size:0.8rem;">(' + loc.country_code + ')</span>';
|
||||
html += '<br><span style="font-size:0.85rem;color:#8896AB;">' + (loc.article_count || 0) + ' Artikel</span>';
|
||||
if (loc.top_articles && loc.top_articles.length > 0) {
|
||||
html += '<div style="margin-top:6px;border-top:1px solid #1E2D45;padding-top:6px;">';
|
||||
loc.top_articles.forEach(function (a) {
|
||||
var hl = (a.headline || '').replace(/\*\*/g, '');
|
||||
if (hl.length > 60) hl = hl.substring(0, 60) + '\u2026';
|
||||
if (a.url) {
|
||||
html += '<a href="' + a.url + '" target="_blank" rel="noopener" style="color:#C8A851;font-size:0.8rem;display:block;margin-top:3px;text-decoration:none;">' + hl + '</a>';
|
||||
} else {
|
||||
html += '<span style="color:#8896AB;font-size:0.8rem;display:block;margin-top:3px;">' + hl + '</span>';
|
||||
}
|
||||
html += '<span style="color:#556B7A;font-size:0.7rem;">' + (a.source || '') + '</span>';
|
||||
});
|
||||
html += '</div>';
|
||||
}
|
||||
return html;
|
||||
}
|
||||
|
||||
function showMarkers(locations, apiLabels) {
|
||||
if (!mapInstance) createMap();
|
||||
clearMarkers();
|
||||
|
||||
var categoryColors = {
|
||||
primary: '#ef4444',
|
||||
secondary: '#f59e0b',
|
||||
tertiary: '#3b82f6',
|
||||
mentioned: '#7b7b7b'
|
||||
};
|
||||
|
||||
var defaultLabels = SITE_LANG === 'en' ? {
|
||||
primary: 'Primary',
|
||||
secondary: 'Reactions',
|
||||
tertiary: 'Involved',
|
||||
mentioned: 'Mentioned'
|
||||
} : {
|
||||
primary: 'Hauptgeschehen',
|
||||
secondary: 'Reaktionen',
|
||||
tertiary: 'Beteiligte',
|
||||
mentioned: 'Erw\u00e4hnt'
|
||||
};
|
||||
|
||||
var categoryLabels = {};
|
||||
['primary', 'secondary', 'tertiary', 'mentioned'].forEach(function (k) {
|
||||
categoryLabels[k] = (apiLabels && apiLabels[k]) || defaultLabels[k];
|
||||
});
|
||||
|
||||
var clusterGroup = L.markerClusterGroup({
|
||||
maxClusterRadius: 50,
|
||||
spiderfyOnMaxZoom: true,
|
||||
showCoverageOnHover: false,
|
||||
zoomToBoundsOnClick: true,
|
||||
disableClusteringAtZoom: 10
|
||||
});
|
||||
|
||||
var usedCategories = {};
|
||||
var bounds = [];
|
||||
|
||||
locations.forEach(function (loc) {
|
||||
if (!loc.lat || !loc.lon) return;
|
||||
var cat = loc.category || 'mentioned';
|
||||
var color = categoryColors[cat] || '#7b7b7b';
|
||||
usedCategories[cat] = true;
|
||||
|
||||
var marker;
|
||||
if (cat === 'primary' || cat === 'secondary') {
|
||||
marker = L.marker([loc.lat, loc.lon], { icon: pulseIcon(color) });
|
||||
} else {
|
||||
marker = L.circleMarker([loc.lat, loc.lon], {
|
||||
radius: 5, fillColor: color, fillOpacity: 0.7,
|
||||
color: color, weight: 1, opacity: 0.9
|
||||
});
|
||||
}
|
||||
marker.bindPopup(buildPopup(loc), { maxWidth: 300 });
|
||||
clusterGroup.addLayer(marker);
|
||||
bounds.push([loc.lat, loc.lon]);
|
||||
});
|
||||
|
||||
markerLayer = clusterGroup;
|
||||
mapInstance.addLayer(markerLayer);
|
||||
|
||||
var legend = L.control({ position: 'bottomright' });
|
||||
legend.onAdd = function () {
|
||||
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;';
|
||||
var html = '<strong style="color:#C8A851;">' + (SITE_LANG === 'en' ? 'Legend' : 'Legende') + '</strong><br>';
|
||||
['primary', 'secondary', 'tertiary', 'mentioned'].forEach(function (cat) {
|
||||
if (usedCategories[cat]) {
|
||||
html += '<span style="color:' + categoryColors[cat] + ';">●</span> ' + categoryLabels[cat] + '<br>';
|
||||
}
|
||||
});
|
||||
div.innerHTML = html;
|
||||
return div;
|
||||
};
|
||||
legendControl = legend;
|
||||
legendControl.addTo(mapInstance);
|
||||
|
||||
if (bounds.length > 0) {
|
||||
mapInstance.fitBounds(bounds, { padding: [30, 30], maxZoom: 7 });
|
||||
}
|
||||
|
||||
setTimeout(function () { mapInstance.invalidateSize(); }, 300);
|
||||
}
|
||||
|
||||
/* ==================== CONTACT MODAL ==================== */
|
||||
window.openContactModal = function () {
|
||||
document.getElementById('contact-modal').style.display = 'flex';
|
||||
document.body.style.overflow = 'hidden';
|
||||
if (window.umami) umami.track('contact_modal_open');
|
||||
};
|
||||
|
||||
window.closeContactModal = function () {
|
||||
document.getElementById('contact-modal').style.display = 'none';
|
||||
document.body.style.overflow = '';
|
||||
};
|
||||
|
||||
// Close on overlay click
|
||||
var modalOverlay = document.getElementById('contact-modal');
|
||||
if (modalOverlay) {
|
||||
modalOverlay.addEventListener('click', function (e) {
|
||||
if (e.target === modalOverlay) closeContactModal();
|
||||
});
|
||||
}
|
||||
|
||||
// Close on Escape
|
||||
document.addEventListener('keydown', function (e) {
|
||||
if (e.key === 'Escape' && modalOverlay && modalOverlay.style.display === 'flex') {
|
||||
closeContactModal();
|
||||
}
|
||||
});
|
||||
|
||||
// Form submit -> server-side SMTP
|
||||
window.submitContact = function (e) {
|
||||
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"]');
|
||||
if (btn) { btn.disabled = true; btn.textContent = T.sending; }
|
||||
|
||||
fetch('/api/contact', {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify({
|
||||
name: document.getElementById('cf-name').value,
|
||||
organisation: document.getElementById('cf-org').value,
|
||||
email: document.getElementById('cf-email').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 (res) {
|
||||
if (res.ok) {
|
||||
document.getElementById('contact-form').style.display = 'none';
|
||||
document.getElementById('form-success').style.display = 'block';
|
||||
if (window.umami) umami.track('contact_form_success');
|
||||
} else {
|
||||
alert(res.data.error || T.sendError);
|
||||
if (btn) { btn.disabled = false; btn.textContent = T.send; }
|
||||
}
|
||||
})
|
||||
.catch(function () {
|
||||
alert(T.netError);
|
||||
if (btn) { btn.disabled = false; btn.textContent = T.send; }
|
||||
});
|
||||
return false;
|
||||
};
|
||||
|
||||
/* ==================== LOAD DEEPFAKES DATA ==================== */
|
||||
function loadDeepfakesData() {
|
||||
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 (data) {
|
||||
var excerptEl = document.getElementById('excerpt-text-deepfakes');
|
||||
if (excerptEl && data.zusammenfassung) {
|
||||
var lines = data.zusammenfassung.split("\n");
|
||||
var filtered = lines.filter(function(l) { var t = l.trim(); return !t || t.indexOf("## ") === 0 || t.indexOf("- ") === 0; });
|
||||
excerptEl.innerHTML = mdToHtml(filtered.join("\n"));
|
||||
}
|
||||
|
||||
// Store data for map
|
||||
lageData['deepfakes'] = {
|
||||
locations: data.locations || [],
|
||||
category_labels: data.category_labels || {},
|
||||
article_count: (data.incident || {}).article_count || 0,
|
||||
source_count: (data.incident || {}).source_count || 0,
|
||||
factcheck_count: (data.incident || {}).factcheck_count || 0
|
||||
};
|
||||
})
|
||||
.catch(function () {
|
||||
var el = document.getElementById('excerpt-text-deepfakes');
|
||||
if (el) el.textContent = 'Daten konnten nicht geladen werden.';
|
||||
});
|
||||
}
|
||||
|
||||
/* ==================== LOAD CYBERANGRIFFE DATA ==================== */
|
||||
function loadCyberangriffeData() {
|
||||
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 (data) {
|
||||
var excerptEl = document.getElementById('excerpt-text-cyberangriffe');
|
||||
if (excerptEl && data.zusammenfassung) {
|
||||
excerptEl.innerHTML = mdToHtml(data.zusammenfassung);
|
||||
}
|
||||
lageData['cyberangriffe'] = {
|
||||
locations: data.locations || [],
|
||||
category_labels: data.category_labels || {},
|
||||
article_count: (data.incident || {}).article_count || 0,
|
||||
source_count: (data.incident || {}).source_count || 0,
|
||||
factcheck_count: (data.incident || {}).factcheck_count || 0
|
||||
};
|
||||
})
|
||||
.catch(function () {
|
||||
var el = document.getElementById('excerpt-text-cyberangriffe');
|
||||
if (el) el.textContent = 'Daten konnten nicht geladen werden.';
|
||||
});
|
||||
}
|
||||
|
||||
/* ==================== INIT ==================== */
|
||||
loadLiveData();
|
||||
loadDeepfakesData();
|
||||
loadCyberangriffeData();
|
||||
})();
|
||||
499
js/components.js
@@ -1,499 +0,0 @@
|
||||
/**
|
||||
* UI Components module for IntelSight website
|
||||
* Contains all interactive UI component logic
|
||||
*/
|
||||
|
||||
// Language Toggle Component
|
||||
const LanguageToggle = {
|
||||
element: null,
|
||||
|
||||
/**
|
||||
* Initialize language toggle
|
||||
*/
|
||||
init() {
|
||||
this.element = document.querySelector(SELECTORS.LANG_TOGGLE);
|
||||
if (!this.element) return;
|
||||
|
||||
this.element.addEventListener('click', (e) => {
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
this.toggle();
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
* Toggle between languages
|
||||
*/
|
||||
toggle() {
|
||||
const newLanguage = getCurrentLanguage() === 'de' ? 'en' : 'de';
|
||||
switchLanguage(newLanguage);
|
||||
|
||||
// Update expand button text after language change
|
||||
ProductShowcase.updateExpandButtonText();
|
||||
}
|
||||
};
|
||||
|
||||
// Navigation Component
|
||||
const Navigation = {
|
||||
navbar: null,
|
||||
|
||||
/**
|
||||
* Initialize navigation component
|
||||
*/
|
||||
init() {
|
||||
this.navbar = document.querySelector(SELECTORS.NAVBAR);
|
||||
this.setupSmoothScrolling();
|
||||
this.setupMobileMenu();
|
||||
},
|
||||
|
||||
/**
|
||||
* Setup smooth scrolling for anchor links
|
||||
*/
|
||||
setupSmoothScrolling() {
|
||||
document.querySelectorAll(SELECTORS.SMOOTH_LINKS).forEach(anchor => {
|
||||
anchor.addEventListener('click', function(e) {
|
||||
e.preventDefault();
|
||||
const targetId = this.getAttribute('href');
|
||||
const target = document.querySelector(targetId);
|
||||
|
||||
if (target) {
|
||||
target.scrollIntoView({
|
||||
behavior: 'smooth',
|
||||
block: 'start'
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
* Setup mobile menu functionality
|
||||
*/
|
||||
setupMobileMenu() {
|
||||
// Mobile menu logic would go here if needed
|
||||
// Currently not implemented as per YAGNI principle
|
||||
}
|
||||
};
|
||||
|
||||
// About Section Tabs
|
||||
const AboutTabs = {
|
||||
tabs: null,
|
||||
panels: null,
|
||||
|
||||
/**
|
||||
* Initialize about section tabs
|
||||
*/
|
||||
init() {
|
||||
this.tabs = document.querySelectorAll(SELECTORS.ABOUT_TABS);
|
||||
this.panels = document.querySelectorAll(SELECTORS.ABOUT_PANELS);
|
||||
|
||||
if (!this.tabs.length) return;
|
||||
|
||||
this.tabs.forEach(tab => {
|
||||
tab.addEventListener('click', () => this.switchTab(tab));
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
* Switch to selected tab
|
||||
* @param {HTMLElement} selectedTab - Tab element that was clicked
|
||||
*/
|
||||
switchTab(selectedTab) {
|
||||
const targetPanelId = selectedTab.getAttribute(DATA_ATTRS.TAB);
|
||||
|
||||
// Remove active class from all tabs and panels
|
||||
this.tabs.forEach(tab => tab.classList.remove(CLASSES.ACTIVE));
|
||||
this.panels.forEach(panel => panel.classList.remove(CLASSES.ACTIVE));
|
||||
|
||||
// Add active class to selected tab and corresponding panel
|
||||
selectedTab.classList.add(CLASSES.ACTIVE);
|
||||
const targetPanel = document.getElementById(targetPanelId);
|
||||
if (targetPanel) {
|
||||
targetPanel.classList.add(CLASSES.ACTIVE);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// Product Showcase Component
|
||||
const ProductShowcase = {
|
||||
expandButton: null,
|
||||
toolsGrid: null,
|
||||
|
||||
/**
|
||||
* Initialize product showcase
|
||||
*/
|
||||
init() {
|
||||
this.expandButton = document.querySelector(SELECTORS.EXPAND_BUTTON);
|
||||
this.toolsGrid = document.querySelector(SELECTORS.TOOLS_GRID);
|
||||
|
||||
if (!this.expandButton || !this.toolsGrid) return;
|
||||
|
||||
this.expandButton.addEventListener('click', () => this.toggleExpand());
|
||||
},
|
||||
|
||||
/**
|
||||
* Toggle expand/collapse state
|
||||
*/
|
||||
toggleExpand() {
|
||||
const isExpanded = this.expandButton.getAttribute(DATA_ATTRS.EXPANDED) === 'true';
|
||||
|
||||
if (isExpanded) {
|
||||
this.collapse();
|
||||
} else {
|
||||
this.expand();
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Expand the tools grid
|
||||
*/
|
||||
expand() {
|
||||
this.toolsGrid.classList.remove(CLASSES.COLLAPSED);
|
||||
this.expandButton.setAttribute(DATA_ATTRS.EXPANDED, 'true');
|
||||
this.updateExpandButtonText();
|
||||
},
|
||||
|
||||
/**
|
||||
* Collapse the tools grid
|
||||
*/
|
||||
collapse() {
|
||||
this.toolsGrid.classList.add(CLASSES.COLLAPSED);
|
||||
this.expandButton.setAttribute(DATA_ATTRS.EXPANDED, 'false');
|
||||
this.updateExpandButtonText();
|
||||
},
|
||||
|
||||
/**
|
||||
* Update expand button text based on state
|
||||
*/
|
||||
updateExpandButtonText() {
|
||||
const expandText = this.expandButton?.querySelector('.expand-text');
|
||||
if (!expandText) return;
|
||||
|
||||
const isExpanded = this.expandButton.getAttribute(DATA_ATTRS.EXPANDED) === 'true';
|
||||
expandText.textContent = getTranslation(isExpanded ? 'hideDetails' : 'expandDetails');
|
||||
}
|
||||
};
|
||||
|
||||
// Login Modal Component
|
||||
const LoginModal = {
|
||||
modalElement: null,
|
||||
modalStyles: null,
|
||||
|
||||
/**
|
||||
* Show login modal
|
||||
*/
|
||||
show() {
|
||||
this.createModal();
|
||||
this.attachEventListeners();
|
||||
},
|
||||
|
||||
/**
|
||||
* Create modal HTML and styles
|
||||
*/
|
||||
createModal() {
|
||||
// Create modal element
|
||||
this.modalElement = document.createElement('div');
|
||||
this.modalElement.className = 'login-modal';
|
||||
this.modalElement.innerHTML = this.getModalHTML();
|
||||
document.body.appendChild(this.modalElement);
|
||||
|
||||
// Add modal styles if not already added
|
||||
if (!this.modalStyles) {
|
||||
this.addModalStyles();
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Get modal HTML content
|
||||
* @returns {string} Modal HTML
|
||||
*/
|
||||
getModalHTML() {
|
||||
const t = getTranslation;
|
||||
return `
|
||||
<div class="modal-content">
|
||||
<button class="modal-close">×</button>
|
||||
<div class="modal-header">
|
||||
<svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" class="lock-icon">
|
||||
<rect x="5" y="11" width="14" height="10" rx="2" stroke="currentColor" stroke-width="2"/>
|
||||
<path d="M7 11V7C7 4.23858 9.23858 2 12 2C14.7614 2 17 4.23858 17 7V11" stroke="currentColor" stroke-width="2"/>
|
||||
<circle cx="12" cy="16" r="1" fill="currentColor"/>
|
||||
</svg>
|
||||
<h3>${t('authRequired')}</h3>
|
||||
</div>
|
||||
<p>${t('authDescription')}</p>
|
||||
<form id="loginForm">
|
||||
<div class="form-group">
|
||||
<label for="auth-password">${t('accessCode')}</label>
|
||||
<input type="password" id="auth-password" placeholder="${t('accessCodePlaceholder')}" required autofocus>
|
||||
</div>
|
||||
<button type="submit" class="primary-button">${t('grantAccess')}</button>
|
||||
</form>
|
||||
<p class="auth-note">${t('noAccess')} <a href="mailto:info@intelsight.de">${t('contactUs')}</a></p>
|
||||
</div>
|
||||
`;
|
||||
},
|
||||
|
||||
/**
|
||||
* Add modal styles to document
|
||||
*/
|
||||
addModalStyles() {
|
||||
this.modalStyles = document.createElement('style');
|
||||
this.modalStyles.textContent = `
|
||||
.login-modal {
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background: rgba(0, 0, 0, 0.7);
|
||||
backdrop-filter: blur(10px);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
z-index: 10000;
|
||||
animation: fadeIn 0.3s ease;
|
||||
}
|
||||
.modal-content {
|
||||
background: #ffffff;
|
||||
border-radius: 12px;
|
||||
padding: 2.5rem;
|
||||
max-width: 400px;
|
||||
width: 90%;
|
||||
position: relative;
|
||||
box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3);
|
||||
}
|
||||
.modal-header {
|
||||
text-align: center;
|
||||
margin-bottom: 1.5rem;
|
||||
}
|
||||
.modal-header .lock-icon {
|
||||
width: 48px;
|
||||
height: 48px;
|
||||
color: #0066cc;
|
||||
margin-bottom: 1rem;
|
||||
}
|
||||
.modal-close {
|
||||
position: absolute;
|
||||
top: 1rem;
|
||||
right: 1rem;
|
||||
background: none;
|
||||
border: none;
|
||||
color: #666;
|
||||
font-size: 2rem;
|
||||
cursor: pointer;
|
||||
transition: all 0.3s ease;
|
||||
width: 32px;
|
||||
height: 32px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
border-radius: 50%;
|
||||
}
|
||||
.modal-close:hover {
|
||||
background: #f0f0f0;
|
||||
color: #333;
|
||||
}
|
||||
.modal-content h3 {
|
||||
color: #1a1a1a;
|
||||
margin-bottom: 0.5rem;
|
||||
font-size: 1.5rem;
|
||||
font-weight: 600;
|
||||
}
|
||||
.modal-content p {
|
||||
color: #666;
|
||||
margin-bottom: 2rem;
|
||||
text-align: center;
|
||||
}
|
||||
.modal-content .form-group {
|
||||
margin-bottom: 1.5rem;
|
||||
}
|
||||
.modal-content label {
|
||||
display: block;
|
||||
color: #333;
|
||||
margin-bottom: 0.5rem;
|
||||
font-weight: 500;
|
||||
}
|
||||
.modal-content input {
|
||||
width: 100%;
|
||||
padding: 0.875rem;
|
||||
background: #f8f8f8;
|
||||
border: 2px solid #e0e0e0;
|
||||
border-radius: 8px;
|
||||
color: #333;
|
||||
font-size: 1rem;
|
||||
transition: all 0.3s ease;
|
||||
}
|
||||
.modal-content input:focus {
|
||||
outline: none;
|
||||
border-color: #0066cc;
|
||||
background: #fff;
|
||||
}
|
||||
.modal-content input::placeholder {
|
||||
color: #999;
|
||||
}
|
||||
.modal-content .primary-button {
|
||||
width: 100%;
|
||||
padding: 0.875rem;
|
||||
background: #0066cc;
|
||||
color: white;
|
||||
border: none;
|
||||
border-radius: 8px;
|
||||
font-size: 1rem;
|
||||
font-weight: 600;
|
||||
cursor: pointer;
|
||||
transition: all 0.3s ease;
|
||||
}
|
||||
.modal-content .primary-button:hover {
|
||||
background: #0052a3;
|
||||
transform: translateY(-1px);
|
||||
box-shadow: 0 4px 12px rgba(0, 102, 204, 0.3);
|
||||
}
|
||||
.auth-note {
|
||||
text-align: center;
|
||||
margin-top: 1.5rem;
|
||||
font-size: 0.9rem;
|
||||
color: #666;
|
||||
}
|
||||
.auth-note a {
|
||||
color: #0066cc;
|
||||
text-decoration: none;
|
||||
}
|
||||
.auth-note a:hover {
|
||||
text-decoration: underline;
|
||||
}
|
||||
`;
|
||||
document.head.appendChild(this.modalStyles);
|
||||
},
|
||||
|
||||
/**
|
||||
* Attach event listeners to modal
|
||||
*/
|
||||
attachEventListeners() {
|
||||
// Close button
|
||||
const closeBtn = this.modalElement.querySelector('.modal-close');
|
||||
closeBtn.addEventListener('click', () => this.close());
|
||||
|
||||
// Form submission
|
||||
const form = this.modalElement.querySelector('#loginForm');
|
||||
form.addEventListener('submit', (e) => this.handleSubmit(e));
|
||||
|
||||
// Click outside to close
|
||||
this.modalElement.addEventListener('click', (e) => {
|
||||
if (e.target === this.modalElement) {
|
||||
this.close();
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
* Handle form submission
|
||||
* @param {Event} e - Submit event
|
||||
*/
|
||||
handleSubmit(e) {
|
||||
e.preventDefault();
|
||||
const password = document.getElementById('auth-password').value;
|
||||
|
||||
// Check password (temporarily hardcoded as requested)
|
||||
if (password === '123456') {
|
||||
sessionStorage.setItem(CONFIG.AUTH.SESSION_KEY, 'true');
|
||||
this.close();
|
||||
window.location.href = CONFIG.AUTH.REDIRECT_PAGE;
|
||||
} else {
|
||||
alert(getTranslation('wrongCode'));
|
||||
document.getElementById('auth-password').value = '';
|
||||
document.getElementById('auth-password').focus();
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Close and remove modal
|
||||
*/
|
||||
close() {
|
||||
if (this.modalElement) {
|
||||
this.modalElement.remove();
|
||||
this.modalElement = null;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// Contact Form Component
|
||||
const ContactForm = {
|
||||
form: null,
|
||||
|
||||
/**
|
||||
* Initialize contact form
|
||||
*/
|
||||
init() {
|
||||
this.form = document.querySelector(SELECTORS.CONTACT_FORM);
|
||||
if (!this.form) return;
|
||||
|
||||
this.form.addEventListener('submit', (e) => this.handleSubmit(e));
|
||||
},
|
||||
|
||||
/**
|
||||
* Handle form submission
|
||||
* @param {Event} e - Submit event
|
||||
*/
|
||||
handleSubmit(e) {
|
||||
e.preventDefault();
|
||||
|
||||
// Get form data
|
||||
const formData = new FormData(this.form);
|
||||
const data = Object.fromEntries(formData.entries());
|
||||
|
||||
// In production, this would send data to server
|
||||
console.log('Form submission:', data);
|
||||
|
||||
// Show success message
|
||||
alert(getTranslation('contactFormSuccess'));
|
||||
this.form.reset();
|
||||
}
|
||||
};
|
||||
|
||||
// Demo Request Handler
|
||||
const DemoRequest = {
|
||||
/**
|
||||
* Initialize demo request buttons
|
||||
*/
|
||||
init() {
|
||||
document.querySelectorAll('.primary-button, .secondary-button, .cta-button').forEach(button => {
|
||||
if (button.textContent.toLowerCase().includes('demo')) {
|
||||
button.addEventListener('click', (e) => this.handleDemoRequest(e));
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
* Handle demo request
|
||||
* @param {Event} e - Click event
|
||||
*/
|
||||
handleDemoRequest(e) {
|
||||
e.preventDefault();
|
||||
alert(getTranslation('demoRequestAlert'));
|
||||
}
|
||||
};
|
||||
|
||||
// Initialize all components
|
||||
const Components = {
|
||||
/**
|
||||
* Initialize all UI components
|
||||
*/
|
||||
init() {
|
||||
LanguageToggle.init();
|
||||
Navigation.init();
|
||||
AboutTabs.init();
|
||||
ProductShowcase.init();
|
||||
ContactForm.init();
|
||||
DemoRequest.init();
|
||||
}
|
||||
};
|
||||
|
||||
// Make showLoginModal globally available for onclick attribute
|
||||
window.showLoginModal = function() {
|
||||
LoginModal.show();
|
||||
};
|
||||
|
||||
// Make closeLoginModal globally available for onclick attribute
|
||||
window.closeLoginModal = function() {
|
||||
LoginModal.close();
|
||||
};
|
||||
15
js/config.js
@@ -1,5 +1,5 @@
|
||||
/**
|
||||
* Central configuration file for IntelSight website
|
||||
* Central configuration file for AegisSight website
|
||||
* Contains all constants, settings and selectors
|
||||
*/
|
||||
|
||||
@@ -24,7 +24,6 @@ const CONFIG = {
|
||||
ROTATION_INTERVAL: 12000, // 12 seconds per video (slower like Palantir)
|
||||
FADE_DURATION: 3000, // 3 second fade transition (much slower)
|
||||
VIDEO_SOURCES: [
|
||||
'assets/videos/hero-tech-pattern.mp4',
|
||||
'assets/videos/hero-data-flow.mp4',
|
||||
'assets/videos/hero-network-viz.mp4',
|
||||
'assets/videos/hero-code-abstract.mp4'
|
||||
@@ -35,14 +34,7 @@ const CONFIG = {
|
||||
I18N: {
|
||||
DEFAULT_LANGUAGE: 'de',
|
||||
SUPPORTED_LANGUAGES: ['de', 'en'],
|
||||
STORAGE_KEY: 'intelsight_language'
|
||||
},
|
||||
|
||||
// Trust Indicators Target Values
|
||||
TRUST_INDICATORS: {
|
||||
AVAILABILITY: 99.9,
|
||||
AUTHORITIES_COUNT: 500,
|
||||
SUPPORT_HOURS: 24
|
||||
STORAGE_KEY: 'aegissight_language'
|
||||
},
|
||||
|
||||
// Intersection Observer Settings
|
||||
@@ -81,9 +73,6 @@ const SELECTORS = {
|
||||
PARTICLE_CANVAS: '#particleCanvas',
|
||||
SCROLL_INDICATOR: '.scroll-indicator',
|
||||
|
||||
// Trust Indicators
|
||||
TRUST_INDICATORS: '.trust-indicators',
|
||||
INDICATOR_VALUE: '.indicator-value',
|
||||
|
||||
// About Section
|
||||
ABOUT_TABS: '.about-tab',
|
||||
|
||||
@@ -1,209 +0,0 @@
|
||||
/**
|
||||
* Hero Video Rotation System
|
||||
* Manages rotating background videos in hero section
|
||||
*/
|
||||
|
||||
const HeroVideoRotation = {
|
||||
videos: [],
|
||||
currentIndex: 0,
|
||||
rotationInterval: null,
|
||||
isTransitioning: false,
|
||||
|
||||
/**
|
||||
* Initialize the video rotation system
|
||||
*/
|
||||
init() {
|
||||
// Get all video elements
|
||||
this.videos = document.querySelectorAll('.hero-video');
|
||||
|
||||
if (!this.videos.length) return;
|
||||
|
||||
// Setup event listeners
|
||||
this.setupEventListeners();
|
||||
|
||||
// Start rotation
|
||||
this.startRotation();
|
||||
|
||||
// Ensure first video is playing
|
||||
this.playVideo(0);
|
||||
},
|
||||
|
||||
/**
|
||||
* Setup event listeners for videos
|
||||
*/
|
||||
setupEventListeners() {
|
||||
// Indicators removed - no click handlers needed
|
||||
|
||||
// Pause rotation on hover (optional)
|
||||
const heroSection = document.querySelector('.hero');
|
||||
if (heroSection) {
|
||||
heroSection.addEventListener('mouseenter', () => {
|
||||
// Optional: pause rotation on hover
|
||||
// this.stopRotation();
|
||||
});
|
||||
|
||||
heroSection.addEventListener('mouseleave', () => {
|
||||
// Optional: resume rotation
|
||||
// this.startRotation();
|
||||
});
|
||||
}
|
||||
|
||||
// Handle video load errors gracefully
|
||||
this.videos.forEach((video, index) => {
|
||||
video.addEventListener('error', () => {
|
||||
console.warn(`Video ${index} failed to load, skipping...`);
|
||||
// If current video fails, move to next
|
||||
if (index === this.currentIndex) {
|
||||
this.nextVideo();
|
||||
}
|
||||
});
|
||||
|
||||
// Ensure videos are ready to play
|
||||
video.addEventListener('loadeddata', () => {
|
||||
console.log(`Video ${index} loaded successfully`);
|
||||
});
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
* Start automatic rotation
|
||||
*/
|
||||
startRotation() {
|
||||
// Clear any existing interval
|
||||
this.stopRotation();
|
||||
|
||||
// Set new interval
|
||||
this.rotationInterval = setInterval(() => {
|
||||
this.nextVideo();
|
||||
}, CONFIG.HERO_VIDEOS.ROTATION_INTERVAL);
|
||||
},
|
||||
|
||||
/**
|
||||
* Stop automatic rotation
|
||||
*/
|
||||
stopRotation() {
|
||||
if (this.rotationInterval) {
|
||||
clearInterval(this.rotationInterval);
|
||||
this.rotationInterval = null;
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Switch to next video
|
||||
*/
|
||||
nextVideo() {
|
||||
const nextIndex = (this.currentIndex + 1) % this.videos.length;
|
||||
this.switchToVideo(nextIndex);
|
||||
},
|
||||
|
||||
/**
|
||||
* Switch to previous video
|
||||
*/
|
||||
previousVideo() {
|
||||
const prevIndex = (this.currentIndex - 1 + this.videos.length) % this.videos.length;
|
||||
this.switchToVideo(prevIndex);
|
||||
},
|
||||
|
||||
/**
|
||||
* Switch to specific video by index
|
||||
* @param {number} index - Video index to switch to
|
||||
*/
|
||||
switchToVideo(index) {
|
||||
if (this.isTransitioning || index === this.currentIndex) return;
|
||||
|
||||
this.isTransitioning = true;
|
||||
|
||||
const currentVideo = this.videos[this.currentIndex];
|
||||
const nextVideo = this.videos[index];
|
||||
|
||||
// Indicators removed - no update needed
|
||||
|
||||
// Prepare next video
|
||||
this.prepareVideo(nextVideo);
|
||||
|
||||
// Fade out current video
|
||||
currentVideo.classList.add('fading-out');
|
||||
|
||||
// After half the fade duration, start fading in the next video
|
||||
setTimeout(() => {
|
||||
nextVideo.classList.add('active');
|
||||
nextVideo.classList.remove('fading-out');
|
||||
|
||||
// Play next video
|
||||
this.playVideo(index);
|
||||
}, CONFIG.HERO_VIDEOS.FADE_DURATION / 2);
|
||||
|
||||
// Complete transition
|
||||
setTimeout(() => {
|
||||
currentVideo.classList.remove('active', 'fading-out');
|
||||
this.currentIndex = index;
|
||||
this.isTransitioning = false;
|
||||
}, CONFIG.HERO_VIDEOS.FADE_DURATION);
|
||||
},
|
||||
|
||||
|
||||
/**
|
||||
* Prepare video for playback
|
||||
* @param {HTMLVideoElement} video - Video element to prepare
|
||||
*/
|
||||
prepareVideo(video) {
|
||||
// Reset video to beginning
|
||||
video.currentTime = 0;
|
||||
|
||||
// Ensure video is ready to play
|
||||
const playPromise = video.play();
|
||||
if (playPromise !== undefined) {
|
||||
playPromise.catch(error => {
|
||||
console.warn('Video autoplay was prevented:', error);
|
||||
});
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Play specific video
|
||||
* @param {number} index - Index of video to play
|
||||
*/
|
||||
playVideo(index) {
|
||||
const video = this.videos[index];
|
||||
if (video) {
|
||||
const playPromise = video.play();
|
||||
if (playPromise !== undefined) {
|
||||
playPromise.catch(error => {
|
||||
console.warn(`Could not play video ${index}:`, error);
|
||||
});
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Pause all videos
|
||||
*/
|
||||
pauseAllVideos() {
|
||||
this.videos.forEach(video => {
|
||||
video.pause();
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
* Handle page visibility change (pause when tab is not visible)
|
||||
*/
|
||||
handleVisibilityChange() {
|
||||
if (document.hidden) {
|
||||
this.stopRotation();
|
||||
this.pauseAllVideos();
|
||||
} else {
|
||||
this.playVideo(this.currentIndex);
|
||||
this.startRotation();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// Initialize when DOM is ready
|
||||
document.addEventListener('DOMContentLoaded', () => {
|
||||
HeroVideoRotation.init();
|
||||
});
|
||||
|
||||
// Handle page visibility API
|
||||
document.addEventListener('visibilitychange', () => {
|
||||
HeroVideoRotation.handleVisibilityChange();
|
||||
});
|
||||
277
js/main.js
@@ -1,277 +0,0 @@
|
||||
/**
|
||||
* Main application entry point for IntelSight website
|
||||
* Initializes all modules and coordinates application startup
|
||||
*/
|
||||
|
||||
/**
|
||||
* Toggle tools grid visibility
|
||||
*/
|
||||
function toggleTools(button) {
|
||||
// Find the tools grid within the same product card
|
||||
const productCard = button.closest('.product-card');
|
||||
const toolsGrid = productCard.querySelector('.tools-grid');
|
||||
|
||||
if (toolsGrid) {
|
||||
const isExpanded = toolsGrid.classList.contains('expanded');
|
||||
const currentLang = getCurrentLanguage ? getCurrentLanguage() : 'de';
|
||||
|
||||
if (isExpanded) {
|
||||
toolsGrid.classList.remove('expanded');
|
||||
toolsGrid.classList.add('collapsed');
|
||||
button.setAttribute('data-expanded', 'false');
|
||||
button.querySelector('span').textContent = currentLang === 'de' ? 'Details anzeigen' : 'Show Details';
|
||||
} else {
|
||||
// Force browser reflow before adding expanded class
|
||||
toolsGrid.style.display = 'grid';
|
||||
void toolsGrid.offsetHeight; // Trigger reflow
|
||||
|
||||
toolsGrid.classList.remove('collapsed');
|
||||
toolsGrid.classList.add('expanded');
|
||||
button.setAttribute('data-expanded', 'true');
|
||||
button.querySelector('span').textContent = currentLang === 'de' ? 'Details verbergen' : 'Hide Details';
|
||||
|
||||
// Ensure all tool cards are visible
|
||||
setTimeout(() => {
|
||||
const toolCards = toolsGrid.querySelectorAll('.tool-card');
|
||||
toolCards.forEach((card, index) => {
|
||||
card.style.opacity = '1';
|
||||
card.style.transform = 'translateY(0)';
|
||||
});
|
||||
}, 100);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Application initialization
|
||||
*/
|
||||
const App = {
|
||||
/**
|
||||
* Initialize the entire application
|
||||
*/
|
||||
init() {
|
||||
// Check DOM ready state
|
||||
if (document.readyState === 'loading') {
|
||||
document.addEventListener('DOMContentLoaded', () => this.start());
|
||||
} else {
|
||||
// DOM is already ready
|
||||
this.start();
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Start the application after DOM is ready
|
||||
*/
|
||||
start() {
|
||||
console.log('IntelSight Website Initializing...');
|
||||
|
||||
// Initialize modules in correct order
|
||||
try {
|
||||
// 1. Initialize translations first (needed by components)
|
||||
initTranslations();
|
||||
console.log('✓ Translations initialized');
|
||||
|
||||
// 2. Initialize UI components
|
||||
Components.init();
|
||||
console.log('✓ Components initialized');
|
||||
|
||||
// 3. Initialize animations
|
||||
Animations.init();
|
||||
console.log('✓ Animations initialized');
|
||||
|
||||
// 4. Setup error handling
|
||||
this.setupErrorHandling();
|
||||
|
||||
// 5. Setup performance monitoring
|
||||
this.setupPerformanceMonitoring();
|
||||
|
||||
console.log('IntelSight Website Ready!');
|
||||
|
||||
} catch (error) {
|
||||
console.error('Failed to initialize application:', error);
|
||||
this.handleInitError(error);
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Setup global error handling
|
||||
*/
|
||||
setupErrorHandling() {
|
||||
window.addEventListener('error', (event) => {
|
||||
console.error('Global error:', event.error);
|
||||
// In production, this would send errors to monitoring service
|
||||
});
|
||||
|
||||
window.addEventListener('unhandledrejection', (event) => {
|
||||
console.error('Unhandled promise rejection:', event.reason);
|
||||
// In production, this would send errors to monitoring service
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
* Setup performance monitoring
|
||||
*/
|
||||
setupPerformanceMonitoring() {
|
||||
// Monitor page load performance
|
||||
window.addEventListener('load', () => {
|
||||
if (window.performance && window.performance.timing) {
|
||||
const timing = window.performance.timing;
|
||||
const loadTime = timing.loadEventEnd - timing.navigationStart;
|
||||
console.log(`Page load time: ${loadTime}ms`);
|
||||
|
||||
// Log other performance metrics
|
||||
const metrics = {
|
||||
domContentLoaded: timing.domContentLoadedEventEnd - timing.navigationStart,
|
||||
domComplete: timing.domComplete - timing.navigationStart,
|
||||
firstPaint: this.getFirstPaintTime()
|
||||
};
|
||||
|
||||
console.log('Performance metrics:', metrics);
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
* Get first paint time if available
|
||||
* @returns {number|null} First paint time in milliseconds
|
||||
*/
|
||||
getFirstPaintTime() {
|
||||
if (window.performance && window.performance.getEntriesByType) {
|
||||
const paintEntries = window.performance.getEntriesByType('paint');
|
||||
const firstPaint = paintEntries.find(entry => entry.name === 'first-paint');
|
||||
return firstPaint ? Math.round(firstPaint.startTime) : null;
|
||||
}
|
||||
return null;
|
||||
},
|
||||
|
||||
/**
|
||||
* Handle initialization errors
|
||||
* @param {Error} error - The error that occurred
|
||||
*/
|
||||
handleInitError(error) {
|
||||
// Create a fallback error message for users
|
||||
const errorContainer = document.createElement('div');
|
||||
errorContainer.style.cssText = `
|
||||
position: fixed;
|
||||
top: 20px;
|
||||
right: 20px;
|
||||
background: #ff4444;
|
||||
color: white;
|
||||
padding: 15px 20px;
|
||||
border-radius: 5px;
|
||||
z-index: 10000;
|
||||
max-width: 300px;
|
||||
box-shadow: 0 2px 10px rgba(0,0,0,0.2);
|
||||
`;
|
||||
errorContainer.textContent = 'Ein Fehler ist aufgetreten. Bitte laden Sie die Seite neu.';
|
||||
document.body.appendChild(errorContainer);
|
||||
|
||||
// Auto-remove after 5 seconds
|
||||
setTimeout(() => {
|
||||
errorContainer.remove();
|
||||
}, 5000);
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Utility functions
|
||||
*/
|
||||
const Utils = {
|
||||
/**
|
||||
* Debounce function to limit function calls
|
||||
* @param {Function} func - Function to debounce
|
||||
* @param {number} wait - Wait time in milliseconds
|
||||
* @returns {Function} Debounced function
|
||||
*/
|
||||
debounce(func, wait) {
|
||||
let timeout;
|
||||
return function executedFunction(...args) {
|
||||
const later = () => {
|
||||
clearTimeout(timeout);
|
||||
func(...args);
|
||||
};
|
||||
clearTimeout(timeout);
|
||||
timeout = setTimeout(later, wait);
|
||||
};
|
||||
},
|
||||
|
||||
/**
|
||||
* Throttle function to limit function calls
|
||||
* @param {Function} func - Function to throttle
|
||||
* @param {number} limit - Time limit in milliseconds
|
||||
* @returns {Function} Throttled function
|
||||
*/
|
||||
throttle(func, limit) {
|
||||
let inThrottle;
|
||||
return function(...args) {
|
||||
if (!inThrottle) {
|
||||
func.apply(this, args);
|
||||
inThrottle = true;
|
||||
setTimeout(() => inThrottle = false, limit);
|
||||
}
|
||||
};
|
||||
},
|
||||
|
||||
/**
|
||||
* Check if element is in viewport
|
||||
* @param {HTMLElement} element - Element to check
|
||||
* @returns {boolean} True if element is in viewport
|
||||
*/
|
||||
isInViewport(element) {
|
||||
const rect = element.getBoundingClientRect();
|
||||
return (
|
||||
rect.top >= 0 &&
|
||||
rect.left >= 0 &&
|
||||
rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) &&
|
||||
rect.right <= (window.innerWidth || document.documentElement.clientWidth)
|
||||
);
|
||||
},
|
||||
|
||||
/**
|
||||
* Load script dynamically
|
||||
* @param {string} src - Script source URL
|
||||
* @returns {Promise} Promise that resolves when script is loaded
|
||||
*/
|
||||
loadScript(src) {
|
||||
return new Promise((resolve, reject) => {
|
||||
const script = document.createElement('script');
|
||||
script.src = src;
|
||||
script.onload = resolve;
|
||||
script.onerror = reject;
|
||||
document.head.appendChild(script);
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
* Get cookie value by name
|
||||
* @param {string} name - Cookie name
|
||||
* @returns {string|null} Cookie value or null
|
||||
*/
|
||||
getCookie(name) {
|
||||
const value = `; ${document.cookie}`;
|
||||
const parts = value.split(`; ${name}=`);
|
||||
if (parts.length === 2) {
|
||||
return parts.pop().split(';').shift();
|
||||
}
|
||||
return null;
|
||||
},
|
||||
|
||||
/**
|
||||
* Set cookie
|
||||
* @param {string} name - Cookie name
|
||||
* @param {string} value - Cookie value
|
||||
* @param {number} days - Days until expiration
|
||||
*/
|
||||
setCookie(name, value, days) {
|
||||
const date = new Date();
|
||||
date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
|
||||
const expires = `expires=${date.toUTCString()}`;
|
||||
document.cookie = `${name}=${value};${expires};path=/`;
|
||||
}
|
||||
};
|
||||
|
||||
// Make Utils globally available if needed
|
||||
window.Utils = Utils;
|
||||
|
||||
// Start the application
|
||||
App.init();
|
||||
196
js/mobile-nav.js
Normale Datei
@@ -0,0 +1,196 @@
|
||||
/**
|
||||
* Mobile Navigation Handler
|
||||
* Clean, accessible mobile navigation implementation
|
||||
*/
|
||||
|
||||
class MobileNavigation {
|
||||
constructor() {
|
||||
this.menuToggle = document.querySelector('.mobile-menu-toggle');
|
||||
this.mobileMenu = document.querySelector('.nav-menu-mobile');
|
||||
this.overlay = document.querySelector('.mobile-menu-overlay');
|
||||
this.menuLinks = document.querySelectorAll('.nav-menu-mobile a');
|
||||
this.closeButton = document.querySelector('.mobile-menu-close');
|
||||
this.isOpen = false;
|
||||
|
||||
this.init();
|
||||
}
|
||||
|
||||
init() {
|
||||
if (!this.menuToggle || !this.mobileMenu) return;
|
||||
|
||||
// Toggle button click
|
||||
this.menuToggle.addEventListener('click', () => this.toggleMenu());
|
||||
|
||||
// Close button click
|
||||
if (this.closeButton) {
|
||||
this.closeButton.addEventListener('click', () => this.closeMenu());
|
||||
}
|
||||
|
||||
// Overlay click closes menu
|
||||
this.overlay.addEventListener('click', () => this.closeMenu());
|
||||
|
||||
// Menu links click closes menu
|
||||
this.menuLinks.forEach(link => {
|
||||
link.addEventListener('click', () => this.closeMenu());
|
||||
});
|
||||
|
||||
// ESC key closes menu
|
||||
document.addEventListener('keydown', (e) => {
|
||||
if (e.key === 'Escape' && this.isOpen) {
|
||||
this.closeMenu();
|
||||
}
|
||||
});
|
||||
|
||||
// Prevent body scroll when menu is open
|
||||
this.handleBodyScroll();
|
||||
}
|
||||
|
||||
toggleMenu() {
|
||||
this.isOpen ? this.closeMenu() : this.openMenu();
|
||||
}
|
||||
|
||||
openMenu() {
|
||||
this.isOpen = true;
|
||||
this.menuToggle.classList.add('active');
|
||||
this.mobileMenu.classList.add('active');
|
||||
this.overlay.classList.add('active');
|
||||
|
||||
// Update ARIA attributes
|
||||
this.menuToggle.setAttribute('aria-expanded', 'true');
|
||||
this.mobileMenu.setAttribute('aria-hidden', 'false');
|
||||
|
||||
// Prevent body scroll
|
||||
document.body.style.overflow = 'hidden';
|
||||
|
||||
// Focus management
|
||||
setTimeout(() => {
|
||||
const firstLink = this.mobileMenu.querySelector('a');
|
||||
if (firstLink) firstLink.focus();
|
||||
}, 300);
|
||||
}
|
||||
|
||||
closeMenu() {
|
||||
this.isOpen = false;
|
||||
this.menuToggle.classList.remove('active');
|
||||
this.mobileMenu.classList.remove('active');
|
||||
this.overlay.classList.remove('active');
|
||||
|
||||
// Update ARIA attributes
|
||||
this.menuToggle.setAttribute('aria-expanded', 'false');
|
||||
this.mobileMenu.setAttribute('aria-hidden', 'true');
|
||||
|
||||
// Restore body scroll
|
||||
document.body.style.overflow = '';
|
||||
|
||||
// Return focus to toggle button
|
||||
this.menuToggle.focus();
|
||||
}
|
||||
|
||||
handleBodyScroll() {
|
||||
// Save scroll position when menu opens
|
||||
let scrollPosition = 0;
|
||||
|
||||
const observer = new MutationObserver(() => {
|
||||
if (this.isOpen) {
|
||||
scrollPosition = window.pageYOffset;
|
||||
document.body.style.position = 'fixed';
|
||||
document.body.style.top = `-${scrollPosition}px`;
|
||||
document.body.style.width = '100%';
|
||||
} else {
|
||||
document.body.style.position = '';
|
||||
document.body.style.top = '';
|
||||
document.body.style.width = '';
|
||||
window.scrollTo(0, scrollPosition);
|
||||
}
|
||||
});
|
||||
|
||||
observer.observe(this.mobileMenu, {
|
||||
attributes: true,
|
||||
attributeFilter: ['class']
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// Smooth scroll for anchor links
|
||||
class SmoothScroll {
|
||||
constructor() {
|
||||
this.init();
|
||||
}
|
||||
|
||||
init() {
|
||||
document.querySelectorAll('a[href^="#"]').forEach(anchor => {
|
||||
anchor.addEventListener('click', (e) => {
|
||||
const href = anchor.getAttribute('href');
|
||||
if (href === '#') return;
|
||||
|
||||
e.preventDefault();
|
||||
const target = document.querySelector(href);
|
||||
|
||||
if (target) {
|
||||
const offset = 80; // Account for fixed navbar
|
||||
const targetPosition = target.offsetTop - offset;
|
||||
|
||||
window.scrollTo({
|
||||
top: targetPosition,
|
||||
behavior: 'smooth'
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// Responsive image loading
|
||||
class ResponsiveImages {
|
||||
constructor() {
|
||||
this.init();
|
||||
}
|
||||
|
||||
init() {
|
||||
// Check if user prefers reduced motion
|
||||
const prefersReducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches;
|
||||
|
||||
if (prefersReducedMotion) {
|
||||
// Disable animations
|
||||
document.documentElement.style.setProperty('--animation-duration', '0.01s');
|
||||
}
|
||||
|
||||
// Lazy load images on mobile
|
||||
if ('IntersectionObserver' in window && window.innerWidth <= 768) {
|
||||
const images = document.querySelectorAll('img[data-src]');
|
||||
|
||||
const imageObserver = new IntersectionObserver((entries) => {
|
||||
entries.forEach(entry => {
|
||||
if (entry.isIntersecting) {
|
||||
const img = entry.target;
|
||||
img.src = img.dataset.src;
|
||||
img.removeAttribute('data-src');
|
||||
imageObserver.unobserve(img);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
images.forEach(img => imageObserver.observe(img));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Initialize on DOM load
|
||||
document.addEventListener('DOMContentLoaded', () => {
|
||||
new MobileNavigation();
|
||||
new SmoothScroll();
|
||||
new ResponsiveImages();
|
||||
|
||||
// Hide mobile menu button styles until JS loads
|
||||
document.documentElement.classList.add('js-loaded');
|
||||
});
|
||||
|
||||
// Handle orientation change
|
||||
window.addEventListener('orientationchange', () => {
|
||||
// Close mobile menu on orientation change
|
||||
const mobileNav = document.querySelector('.nav-menu-mobile');
|
||||
if (mobileNav && mobileNav.classList.contains('active')) {
|
||||
const event = new Event('click');
|
||||
document.querySelector('.mobile-menu-overlay').dispatchEvent(event);
|
||||
}
|
||||
});
|
||||
188
js/protection.js
@@ -1,188 +0,0 @@
|
||||
/**
|
||||
* Website Protection Script
|
||||
* Prevents copying, downloading, and inspection of website content
|
||||
*/
|
||||
|
||||
(function() {
|
||||
'use strict';
|
||||
|
||||
// Disable right-click context menu
|
||||
document.addEventListener('contextmenu', function(e) {
|
||||
e.preventDefault();
|
||||
return false;
|
||||
});
|
||||
|
||||
// Disable text selection
|
||||
document.addEventListener('selectstart', function(e) {
|
||||
e.preventDefault();
|
||||
return false;
|
||||
});
|
||||
|
||||
// Disable drag
|
||||
document.addEventListener('dragstart', function(e) {
|
||||
e.preventDefault();
|
||||
return false;
|
||||
});
|
||||
|
||||
// Disable copy
|
||||
document.addEventListener('copy', function(e) {
|
||||
e.preventDefault();
|
||||
return false;
|
||||
});
|
||||
|
||||
// Disable cut
|
||||
document.addEventListener('cut', function(e) {
|
||||
e.preventDefault();
|
||||
return false;
|
||||
});
|
||||
|
||||
// Disable paste
|
||||
document.addEventListener('paste', function(e) {
|
||||
e.preventDefault();
|
||||
return false;
|
||||
});
|
||||
|
||||
// Disable print
|
||||
window.addEventListener('beforeprint', function(e) {
|
||||
e.preventDefault();
|
||||
return false;
|
||||
});
|
||||
|
||||
// Detect and block DevTools
|
||||
let devtools = {open: false, orientation: null};
|
||||
const threshold = 160;
|
||||
const emitEvent = (state, orientation) => {
|
||||
if (state) {
|
||||
console.clear();
|
||||
document.body.style.display = 'none';
|
||||
document.body.innerHTML = '<div style="display:flex;justify-content:center;align-items:center;height:100vh;background:#000;color:#fff;font-family:Inter,sans-serif;"><h1>Zugriff verweigert</h1></div>';
|
||||
}
|
||||
};
|
||||
|
||||
setInterval(() => {
|
||||
if (window.outerHeight - window.innerHeight > threshold ||
|
||||
window.outerWidth - window.innerWidth > threshold) {
|
||||
if (!devtools.open) {
|
||||
emitEvent(true, null);
|
||||
devtools.open = true;
|
||||
}
|
||||
} else {
|
||||
if (devtools.open) {
|
||||
emitEvent(false, null);
|
||||
devtools.open = false;
|
||||
}
|
||||
}
|
||||
}, 500);
|
||||
|
||||
// Disable F12, Ctrl+Shift+I, Ctrl+Shift+J, Ctrl+U, Ctrl+S
|
||||
document.addEventListener('keydown', function(e) {
|
||||
// F12
|
||||
if (e.keyCode === 123) {
|
||||
e.preventDefault();
|
||||
return false;
|
||||
}
|
||||
// Ctrl+Shift+I (DevTools)
|
||||
if (e.ctrlKey && e.shiftKey && e.keyCode === 73) {
|
||||
e.preventDefault();
|
||||
return false;
|
||||
}
|
||||
// Ctrl+Shift+J (Console)
|
||||
if (e.ctrlKey && e.shiftKey && e.keyCode === 74) {
|
||||
e.preventDefault();
|
||||
return false;
|
||||
}
|
||||
// Ctrl+U (View Source)
|
||||
if (e.ctrlKey && e.keyCode === 85) {
|
||||
e.preventDefault();
|
||||
return false;
|
||||
}
|
||||
// Ctrl+S (Save)
|
||||
if (e.ctrlKey && e.keyCode === 83) {
|
||||
e.preventDefault();
|
||||
return false;
|
||||
}
|
||||
// Ctrl+A (Select All)
|
||||
if (e.ctrlKey && e.keyCode === 65) {
|
||||
e.preventDefault();
|
||||
return false;
|
||||
}
|
||||
// Ctrl+C (Copy)
|
||||
if (e.ctrlKey && e.keyCode === 67) {
|
||||
e.preventDefault();
|
||||
return false;
|
||||
}
|
||||
// Ctrl+X (Cut)
|
||||
if (e.ctrlKey && e.keyCode === 88) {
|
||||
e.preventDefault();
|
||||
return false;
|
||||
}
|
||||
// Ctrl+V (Paste)
|
||||
if (e.ctrlKey && e.keyCode === 86) {
|
||||
e.preventDefault();
|
||||
return false;
|
||||
}
|
||||
});
|
||||
|
||||
// Disable image dragging
|
||||
const images = document.getElementsByTagName('img');
|
||||
for (let i = 0; i < images.length; i++) {
|
||||
images[i].addEventListener('dragstart', function(e) {
|
||||
e.preventDefault();
|
||||
return false;
|
||||
});
|
||||
images[i].addEventListener('mousedown', function(e) {
|
||||
e.preventDefault();
|
||||
return false;
|
||||
});
|
||||
}
|
||||
|
||||
// Clear console periodically
|
||||
setInterval(function() {
|
||||
console.clear();
|
||||
console.log('%cSicherheitswarnung!', 'color: red; font-size: 30px; font-weight: bold;');
|
||||
console.log('%cDiese Browser-Funktion ist für Entwickler vorgesehen. Unbefugter Zugriff ist untersagt.', 'color: red; font-size: 16px;');
|
||||
}, 1000);
|
||||
|
||||
// Detect console.log override attempts
|
||||
const originalLog = console.log;
|
||||
console.log = function() {
|
||||
originalLog.apply(console, arguments);
|
||||
console.clear();
|
||||
};
|
||||
|
||||
// Disable text highlighting with CSS
|
||||
const style = document.createElement('style');
|
||||
style.innerHTML = `
|
||||
* {
|
||||
-webkit-user-select: none !important;
|
||||
-moz-user-select: none !important;
|
||||
-ms-user-select: none !important;
|
||||
user-select: none !important;
|
||||
-webkit-touch-callout: none !important;
|
||||
-webkit-user-drag: none !important;
|
||||
}
|
||||
|
||||
img {
|
||||
pointer-events: none !important;
|
||||
-webkit-user-drag: none !important;
|
||||
-khtml-user-drag: none !important;
|
||||
-moz-user-drag: none !important;
|
||||
-o-user-drag: none !important;
|
||||
user-drag: none !important;
|
||||
}
|
||||
|
||||
@media print {
|
||||
body {
|
||||
display: none !important;
|
||||
}
|
||||
}
|
||||
`;
|
||||
document.head.appendChild(style);
|
||||
|
||||
// Protection against automated tools
|
||||
if (window.automation || window.callPhantom || window._phantom || window.__nightmare || window.WebDriverException || document.__webdriver_evaluate || document.__selenium_evaluate || document.__webdriver_script_function || document.__webdriver_script_func || document.__webdriver_script_fn || document.__fxdriver_evaluate || document.__driver_unwrapped || document.__webdriver_unwrapped || document.__driver_evaluate || document.__selenium_unwrapped || document.__fxdriver_unwrapped) {
|
||||
document.body.style.display = 'none';
|
||||
document.body.innerHTML = '';
|
||||
}
|
||||
|
||||
})();
|
||||
@@ -1,130 +0,0 @@
|
||||
/**
|
||||
* Section Transitions & Effects
|
||||
* Modern animations for section dividers
|
||||
*/
|
||||
|
||||
const SectionTransitions = {
|
||||
init() {
|
||||
this.initParticleBridge();
|
||||
this.initScrollReveal();
|
||||
this.initWaveAnimation();
|
||||
this.initParallaxDividers();
|
||||
},
|
||||
|
||||
// Animated particles between sections
|
||||
initParticleBridge() {
|
||||
const bridge = document.getElementById('particleBridge');
|
||||
if (!bridge) return;
|
||||
|
||||
// Create floating particles
|
||||
for (let i = 0; i < 30; i++) {
|
||||
const particle = document.createElement('div');
|
||||
particle.className = 'particle';
|
||||
particle.style.left = Math.random() * 100 + '%';
|
||||
particle.style.animationDelay = Math.random() * 5 + 's';
|
||||
particle.style.animationDuration = (5 + Math.random() * 5) + 's';
|
||||
particle.style.animation = `floatParticle ${5 + Math.random() * 5}s linear infinite`;
|
||||
bridge.appendChild(particle);
|
||||
}
|
||||
},
|
||||
|
||||
// Reveal sections on scroll
|
||||
initScrollReveal() {
|
||||
const sections = document.querySelectorAll('.fade-section');
|
||||
|
||||
const revealSection = (entries, observer) => {
|
||||
entries.forEach(entry => {
|
||||
if (entry.isIntersecting) {
|
||||
entry.target.classList.add('visible');
|
||||
|
||||
// Add shimmer effect on reveal
|
||||
const shimmer = document.createElement('div');
|
||||
shimmer.style.cssText = `
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: -100%;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background: linear-gradient(90deg, transparent, rgba(15, 114, 181, 0.2), transparent);
|
||||
animation: shimmerPass 1s ease-out forwards;
|
||||
pointer-events: none;
|
||||
z-index: 100;
|
||||
`;
|
||||
entry.target.style.position = 'relative';
|
||||
entry.target.appendChild(shimmer);
|
||||
|
||||
setTimeout(() => shimmer.remove(), 1000);
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
const observer = new IntersectionObserver(revealSection, {
|
||||
threshold: 0.1,
|
||||
rootMargin: '0px 0px -100px 0px'
|
||||
});
|
||||
|
||||
sections.forEach(section => observer.observe(section));
|
||||
},
|
||||
|
||||
// Animate wave dividers
|
||||
initWaveAnimation() {
|
||||
const waves = document.querySelectorAll('.wave-divider path');
|
||||
|
||||
waves.forEach(wave => {
|
||||
let time = 0;
|
||||
const animateWave = () => {
|
||||
time += 0.02;
|
||||
const points = [];
|
||||
|
||||
for (let i = 0; i <= 10; i++) {
|
||||
const x = (i / 10) * 1200;
|
||||
const y = Math.sin((i / 10) * Math.PI * 2 + time) * 10 + 56;
|
||||
points.push(`${x},${y}`);
|
||||
}
|
||||
|
||||
// Create smooth wave path
|
||||
const d = `M0,56 Q${points[2]} T${points[4]} T${points[6]} T${points[8]} T1200,56 L1200,0 L0,0 Z`;
|
||||
wave.setAttribute('d', d);
|
||||
|
||||
requestAnimationFrame(animateWave);
|
||||
};
|
||||
|
||||
// Start wave animation
|
||||
// animateWave(); // Commented out for performance, uncomment for wave motion
|
||||
});
|
||||
},
|
||||
|
||||
// Parallax effect for dividers
|
||||
initParallaxDividers() {
|
||||
const dividers = document.querySelectorAll('.blob-divider, .gradient-divider, .flow-lines');
|
||||
|
||||
window.addEventListener('scroll', () => {
|
||||
const scrolled = window.pageYOffset;
|
||||
|
||||
dividers.forEach(divider => {
|
||||
const speed = divider.dataset.speed || 0.5;
|
||||
const yPos = -(scrolled * speed);
|
||||
divider.style.transform = `translateY(${yPos}px)`;
|
||||
});
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
// Add shimmer animation
|
||||
const style = document.createElement('style');
|
||||
style.textContent = `
|
||||
@keyframes shimmerPass {
|
||||
to {
|
||||
left: 100%;
|
||||
opacity: 0;
|
||||
}
|
||||
}
|
||||
`;
|
||||
document.head.appendChild(style);
|
||||
|
||||
// Initialize when DOM is ready
|
||||
if (document.readyState === 'loading') {
|
||||
document.addEventListener('DOMContentLoaded', () => SectionTransitions.init());
|
||||
} else {
|
||||
SectionTransitions.init();
|
||||
}
|
||||
@@ -1,410 +0,0 @@
|
||||
/**
|
||||
* Translation system for IntelSight website
|
||||
* Supports German (de) and English (en)
|
||||
*/
|
||||
|
||||
// Translation strings
|
||||
const translations = {
|
||||
de: {
|
||||
// Page meta
|
||||
pageTitle: 'IntelSight - Sicherheit Made in Germany',
|
||||
|
||||
// Navigation
|
||||
skipNav: 'Zum Hauptinhalt springen',
|
||||
navHome: 'Startseite',
|
||||
navAbout: 'Über uns',
|
||||
navProducts: 'Produkte & Lösungen',
|
||||
navContact: 'Kontakt',
|
||||
langSwitch: 'DE | EN',
|
||||
|
||||
// Hero Section
|
||||
heroTitle: 'SICHERHEIT MADE IN GERMANY',
|
||||
heroSubtitle: 'Spezialist für hochsichere, maßgeschneiderte IT-Lösungen für Behörden',
|
||||
|
||||
// Trust Indicators
|
||||
indicatorAvailability: 'Verfügbarkeit',
|
||||
indicatorTrust: 'Behörden vertrauen uns',
|
||||
indicatorSupport: 'Support',
|
||||
|
||||
// Scroll Indicator
|
||||
scrollToExplore: 'Nach unten scrollen',
|
||||
|
||||
// About Section
|
||||
aboutTitle: 'ÜBER UNS',
|
||||
aboutSubtitle: 'Ihr Partner für sichere Behördensoftware',
|
||||
|
||||
// About Tabs
|
||||
tabWhoWeAre: 'Unternehmen',
|
||||
tabMission: 'Mission & Werte',
|
||||
tabCompetencies: 'Kernkompetenzen',
|
||||
tabWhyUs: 'Unser Versprechen',
|
||||
|
||||
// Who We Are
|
||||
whoWeAreTitle: 'Unternehmen',
|
||||
whoWeArePara1: 'IntelSight UG ist Ihr <strong>Spezialist für hochsichere, maßgeschneiderte IT-Lösungen</strong> aus Nordrhein-Westfalen. Wir entwickeln innovative Software speziell für staatliche Sicherheits- und Ermittlungsbehörden.',
|
||||
whoWeArePara2: 'Unser Ansatz vereint modernste Technologie mit einem tiefen Verständnis für die besonderen Anforderungen von Behörden. Dabei steht die Balance zwischen Sicherheit, Effizienz und rechtskonformer Umsetzung im Mittelpunkt unserer Arbeit.',
|
||||
locationBadge: 'Nordrhein-Westfalen, Deutschland',
|
||||
nrwLabel: 'Nordrhein-Westfalen',
|
||||
headquartersLabel: 'Unser Standort: Langenfeld',
|
||||
|
||||
// Mission & Values
|
||||
missionTitle: 'Unsere Mission',
|
||||
missionStatement: 'Wir schaffen <strong>effiziente, sichere und datenschutzkonforme Lösungen</strong> für moderne Strafverfolgung und Sicherheitsbehörden.',
|
||||
valueIntegrityTitle: 'Integrität',
|
||||
valueIntegrityDesc: 'Höchste ethische Standards in allem was wir tun',
|
||||
valueTransparencyTitle: 'Transparenz',
|
||||
valueTransparencyDesc: 'Offene Kommunikation und nachvollziehbare Prozesse',
|
||||
valueDemocracyTitle: 'Demokratische Prinzipien',
|
||||
valueDemocracyDesc: 'Kooperation nur mit Behörden im Einklang mit der freiheitlich demokratischen Grundordnung',
|
||||
principleNote: '<strong>Unser Ziel:</strong> Technologie, die Recht und Sicherheit stärkt und die freiheitlich demokratische Grundordnung schützt.',
|
||||
|
||||
// Competencies
|
||||
competenciesTitle: 'Unsere Kernkompetenzen',
|
||||
comp1Title: 'Behördenspezifische Software',
|
||||
comp1Desc: 'Entwicklung mit höchsten Sicherheitsstandards, maßgeschneidert für staatliche Anforderungen',
|
||||
comp2Title: 'Intuitive Bedienkonzepte',
|
||||
comp2Desc: 'Benutzerfreundliche Oberflächen trotz komplexer Funktionen für effizientes Arbeiten',
|
||||
comp3Title: 'Langzeit-Support',
|
||||
comp3Desc: 'Kontinuierliche Sicherheitsupdates und zuverlässige Wartung über den gesamten Lebenszyklus',
|
||||
|
||||
// Why Us
|
||||
whyUsTitle: 'Warum IntelSight UG?',
|
||||
why1Title: 'Enge Zusammenarbeit',
|
||||
why1Desc: 'Wir arbeiten Hand in Hand mit unseren Kunden für maßgeschneiderte Lösungen',
|
||||
why2Title: 'Made in Germany',
|
||||
why2Desc: 'Klare, robuste und sichere Software nach deutschen Qualitätsstandards',
|
||||
why3Title: 'Verlässliche Partnerschaft',
|
||||
why3Desc: 'Basierend auf gemeinsamen Werten und langfristigem Vertrauen',
|
||||
why4Title: 'Nachhaltigkeit',
|
||||
why4Desc: 'Fokus auf Sicherheit, Professionalität & zukunftssichere Lösungen',
|
||||
|
||||
// Products Section
|
||||
productsTitle: 'PRODUKTE & LÖSUNGEN',
|
||||
productsSubtitle: 'Professionelle Werkzeuge für moderne Ermittlungsarbeit',
|
||||
|
||||
// Professional Toolbox
|
||||
productToolboxTitle: 'Professional Toolbox',
|
||||
productToolboxDesc: 'Eine leistungsstarke Desktop-Anwendung mit fünf essentiellen Tools für behördliche OSINT-Ermittler und Analysten. Modernes Design, intuitive Bedienung, professionelle Funktionen.',
|
||||
expandDetails: 'Details anzeigen',
|
||||
hideDetails: 'Details verbergen',
|
||||
|
||||
// Tools
|
||||
tool1Title: 'Metadata Analyzer',
|
||||
tool1Feature1: 'Extrahiert versteckte Informationen (EXIF, GPS, Erstellungsdaten)',
|
||||
tool1Feature2: 'Forensische Analyse von Dokumenten & Bildern',
|
||||
tool1Feature3: 'Export als JSON',
|
||||
|
||||
tool2Title: 'Screen Recorder',
|
||||
tool2Feature1: 'Bildschirmaufnahme mit Audio (System & Mikrofon)',
|
||||
tool2Feature2: 'Bereichsauswahl oder Vollbild',
|
||||
tool2Feature3: 'Wählbare Qualitätsstufen',
|
||||
|
||||
tool3Title: 'Video Crawler',
|
||||
tool3Feature1: 'Download von Videos aus 1000+ Plattformen',
|
||||
tool3Feature2: 'Automatischer Untertitel-Download',
|
||||
tool3Feature3: 'Qualitätsauswahl',
|
||||
|
||||
tool4Title: 'Website Crawler',
|
||||
tool4Feature1: 'Archiviert Webseiten offline',
|
||||
tool4Feature2: 'Einstellbare Crawling-Tiefe',
|
||||
tool4Feature3: 'Erhält Originalstruktur inkl. CSS, JS & Medien',
|
||||
|
||||
tool5Title: 'Multimedia Converter',
|
||||
tool5Feature1: 'Konvertierung von Bildern, Videos, Audio',
|
||||
tool5Feature2: 'Batch-Verarbeitung',
|
||||
tool5Feature3: 'Drag & Drop Unterstützung',
|
||||
|
||||
// AccountForger
|
||||
productAccountForgerTitle: 'AccountForger',
|
||||
accessRestricted: 'Zugang nur mit Berechtigung',
|
||||
protectedProductDesc: 'Dieses Produkt ist speziell für autorisierte Behörden entwickelt und erfordert eine Authentifizierung.',
|
||||
loginForAccess: 'Anmelden für Zugriff',
|
||||
|
||||
// Footer
|
||||
footerCompanyTitle: 'IntelSight UG (haftungsbeschränkt)',
|
||||
footerCompanyAddress1: 'Gladbacher Strasse 3-5',
|
||||
footerCompanyAddress2: '40764 Langenfeld',
|
||||
footerNavTitle: 'Navigation',
|
||||
footerNavHome: 'Startseite',
|
||||
footerNavAbout: 'Über uns',
|
||||
footerNavProducts: 'Produkte',
|
||||
footerNavContact: 'Kontakt',
|
||||
|
||||
footerLegalTitle: 'Rechtliches',
|
||||
footerImprint: 'Impressum',
|
||||
footerPrivacy: 'Datenschutz',
|
||||
footerTerms: 'AGB',
|
||||
|
||||
footerContactTitle: 'Kontakt',
|
||||
copyright: '© 2025 IntelSight UG (haftungsbeschränkt). Alle Rechte vorbehalten.',
|
||||
|
||||
// Modal texts
|
||||
authRequired: 'Authentifizierung erforderlich',
|
||||
authDescription: 'Dieser Bereich ist nur für autorisierte Behörden zugänglich.',
|
||||
accessCode: 'Zugangscode',
|
||||
accessCodePlaceholder: 'Bitte Zugangscode eingeben',
|
||||
grantAccess: 'Zugang gewähren',
|
||||
noAccess: 'Noch keinen Zugang?',
|
||||
contactUs: 'Kontaktieren Sie uns',
|
||||
accessGranted: 'Zugang gewährt! AccountForger wird geladen...',
|
||||
wrongCode: 'Falscher Zugangscode. Bitte versuchen Sie es erneut.',
|
||||
demoRequestAlert: 'Demo-Anfrage-Funktion würde hier implementiert werden',
|
||||
contactFormSuccess: 'Vielen Dank für Ihre Nachricht! Wir werden uns schnellstmöglich bei Ihnen melden.'
|
||||
},
|
||||
|
||||
en: {
|
||||
// Page meta
|
||||
pageTitle: 'IntelSight - Security Made in Germany',
|
||||
|
||||
// Navigation
|
||||
skipNav: 'Skip to main content',
|
||||
navHome: 'Home',
|
||||
navAbout: 'About Us',
|
||||
navProducts: 'Products & Solutions',
|
||||
navContact: 'Contact',
|
||||
langSwitch: 'EN | DE',
|
||||
|
||||
// Hero Section
|
||||
heroTitle: 'SECURITY MADE IN GERMANY',
|
||||
heroSubtitle: 'Specialist for highly secure, customized IT solutions for government agencies',
|
||||
|
||||
// Trust Indicators
|
||||
indicatorAvailability: 'Availability',
|
||||
indicatorTrust: 'Government agencies trust us',
|
||||
indicatorSupport: 'Support',
|
||||
|
||||
// Scroll Indicator
|
||||
scrollToExplore: 'Scroll to Explore',
|
||||
|
||||
// About Section
|
||||
aboutTitle: 'About Us',
|
||||
aboutSubtitle: 'Your Partner for Secure Government Software',
|
||||
|
||||
// About Tabs
|
||||
tabWhoWeAre: 'Company',
|
||||
tabMission: 'Mission & Values',
|
||||
tabCompetencies: 'Core Competencies',
|
||||
tabWhyUs: 'Our Promise',
|
||||
|
||||
// Who We Are
|
||||
whoWeAreTitle: 'Company',
|
||||
whoWeArePara1: 'IntelSight UG is your <strong>specialist for highly secure, customized IT solutions</strong> from North Rhine-Westphalia. We develop innovative software specifically for government security and law enforcement agencies.',
|
||||
whoWeArePara2: 'Our approach combines cutting-edge technology with a deep understanding of the special requirements of government agencies. The balance between security, efficiency and legally compliant implementation is at the center of our work.',
|
||||
locationBadge: 'North Rhine-Westphalia, Germany',
|
||||
nrwLabel: 'North Rhine-Westphalia',
|
||||
headquartersLabel: 'Our Location: Langenfeld',
|
||||
|
||||
// Mission & Values
|
||||
missionTitle: 'Our Mission',
|
||||
missionStatement: 'We create <strong>efficient, secure and data protection compliant solutions</strong> for modern law enforcement and security agencies.',
|
||||
valueIntegrityTitle: 'Integrity',
|
||||
valueIntegrityDesc: 'Highest ethical standards in everything we do',
|
||||
valueTransparencyTitle: 'Transparency',
|
||||
valueTransparencyDesc: 'Open communication and comprehensible processes',
|
||||
valueDemocracyTitle: 'Democratic Principles',
|
||||
valueDemocracyDesc: 'Cooperation only with agencies in accordance with the liberal democratic basic order',
|
||||
principleNote: '<strong>Our Goal:</strong> Technology that strengthens law and security and protects the liberal democratic basic order.',
|
||||
|
||||
// Competencies
|
||||
competenciesTitle: 'Our Core Competencies',
|
||||
comp1Title: 'Agency-Specific Software',
|
||||
comp1Desc: 'Development with highest security standards, tailored for government requirements',
|
||||
comp2Title: 'Intuitive Operating Concepts',
|
||||
comp2Desc: 'User-friendly interfaces despite complex functions for efficient work',
|
||||
comp3Title: 'Long-term Support',
|
||||
comp3Desc: 'Continuous security updates and reliable maintenance throughout the entire lifecycle',
|
||||
|
||||
// Why Us
|
||||
whyUsTitle: 'Why IntelSight UG?',
|
||||
why1Title: 'Close Collaboration',
|
||||
why1Desc: 'We work hand in hand with our customers for customized solutions',
|
||||
why2Title: 'Made in Germany',
|
||||
why2Desc: 'Clear, robust and secure software according to German quality standards',
|
||||
why3Title: 'Reliable Partnership',
|
||||
why3Desc: 'Based on shared values and long-term trust',
|
||||
why4Title: 'Sustainability',
|
||||
why4Desc: 'Focus on security, professionalism & future-proof solutions',
|
||||
|
||||
// Products Section
|
||||
productsTitle: 'Products & Solutions',
|
||||
productsSubtitle: 'Professional Tools for Modern Investigation Work',
|
||||
|
||||
// Professional Toolbox
|
||||
productToolboxTitle: 'Professional Toolbox',
|
||||
productToolboxDesc: 'A powerful desktop application with five essential tools for government OSINT investigators and analysts. Modern design, intuitive operation, professional functions.',
|
||||
expandDetails: 'Show Details',
|
||||
hideDetails: 'Hide Details',
|
||||
|
||||
// Tools
|
||||
tool1Title: 'Metadata Analyzer',
|
||||
tool1Feature1: 'Extracts hidden information (EXIF, GPS, creation dates)',
|
||||
tool1Feature2: 'Forensic analysis of documents & images',
|
||||
tool1Feature3: 'Export as JSON',
|
||||
|
||||
tool2Title: 'Screen Recorder',
|
||||
tool2Feature1: 'Screen recording with audio (system & microphone)',
|
||||
tool2Feature2: 'Area selection or full screen',
|
||||
tool2Feature3: 'Selectable quality levels',
|
||||
|
||||
tool3Title: 'Video Crawler',
|
||||
tool3Feature1: 'Download videos from 1000+ platforms',
|
||||
tool3Feature2: 'Automatic subtitle download',
|
||||
tool3Feature3: 'Quality selection',
|
||||
|
||||
tool4Title: 'Website Crawler',
|
||||
tool4Feature1: 'Archives websites offline',
|
||||
tool4Feature2: 'Adjustable crawling depth',
|
||||
tool4Feature3: 'Preserves original structure incl. CSS, JS & media',
|
||||
|
||||
tool5Title: 'Multimedia Converter',
|
||||
tool5Feature1: 'Conversion of images, videos, audio',
|
||||
tool5Feature2: 'Batch processing',
|
||||
tool5Feature3: 'Drag & Drop support',
|
||||
|
||||
// AccountForger
|
||||
productAccountForgerTitle: 'AccountForger',
|
||||
accessRestricted: 'Access by authorization only',
|
||||
protectedProductDesc: 'This product is specifically developed for authorized agencies and requires authentication.',
|
||||
loginForAccess: 'Login for Access',
|
||||
|
||||
// Footer
|
||||
footerCompanyTitle: 'IntelSight UG (haftungsbeschränkt)',
|
||||
footerCompanyAddress1: 'Gladbacher Strasse 3-5',
|
||||
footerCompanyAddress2: '40764 Langenfeld',
|
||||
footerNavTitle: 'Navigation',
|
||||
footerNavHome: 'Home',
|
||||
footerNavAbout: 'About Us',
|
||||
footerNavProducts: 'Products',
|
||||
footerNavContact: 'Contact',
|
||||
|
||||
footerLegalTitle: 'Legal',
|
||||
footerImprint: 'Imprint',
|
||||
footerPrivacy: 'Privacy Policy',
|
||||
footerTerms: 'Terms & Conditions',
|
||||
|
||||
footerContactTitle: 'Contact',
|
||||
copyright: '© 2025 IntelSight UG (haftungsbeschränkt). All rights reserved.',
|
||||
|
||||
// Modal texts
|
||||
authRequired: 'Authentication Required',
|
||||
authDescription: 'This area is only accessible to authorized agencies.',
|
||||
accessCode: 'Access Code',
|
||||
accessCodePlaceholder: 'Please enter access code',
|
||||
grantAccess: 'Grant Access',
|
||||
noAccess: 'No access yet?',
|
||||
contactUs: 'Contact Us',
|
||||
accessGranted: 'Access granted! AccountForger is loading...',
|
||||
wrongCode: 'Wrong access code. Please try again.',
|
||||
demoRequestAlert: 'Demo request function would be implemented here',
|
||||
contactFormSuccess: 'Thank you for your message! We will get back to you as soon as possible.'
|
||||
}
|
||||
};
|
||||
|
||||
// Current language state
|
||||
let currentLanguage = CONFIG.I18N.DEFAULT_LANGUAGE;
|
||||
|
||||
/**
|
||||
* Initialize the translation system
|
||||
*/
|
||||
function initTranslations() {
|
||||
// Try to get saved language from localStorage
|
||||
const savedLanguage = localStorage.getItem(CONFIG.I18N.STORAGE_KEY);
|
||||
if (savedLanguage && CONFIG.I18N.SUPPORTED_LANGUAGES.includes(savedLanguage)) {
|
||||
currentLanguage = savedLanguage;
|
||||
}
|
||||
|
||||
// Apply initial translations
|
||||
applyTranslations(currentLanguage);
|
||||
}
|
||||
|
||||
/**
|
||||
* Switch to a different language
|
||||
* @param {string} language - Language code ('de' or 'en')
|
||||
*/
|
||||
function switchLanguage(language) {
|
||||
if (!CONFIG.I18N.SUPPORTED_LANGUAGES.includes(language)) {
|
||||
console.error(`Language '${language}' is not supported`);
|
||||
return;
|
||||
}
|
||||
|
||||
currentLanguage = language;
|
||||
localStorage.setItem(CONFIG.I18N.STORAGE_KEY, language);
|
||||
applyTranslations(language);
|
||||
}
|
||||
|
||||
/**
|
||||
* Apply translations to all elements with data-translate attribute
|
||||
* @param {string} language - Language code to apply
|
||||
*/
|
||||
function applyTranslations(language) {
|
||||
const t = translations[language];
|
||||
|
||||
if (!t) {
|
||||
console.error(`Translations for language '${language}' not found`);
|
||||
return;
|
||||
}
|
||||
|
||||
// Update page title
|
||||
document.title = t.pageTitle;
|
||||
|
||||
// Update HTML lang attribute
|
||||
document.documentElement.lang = language;
|
||||
|
||||
// Update all translatable elements
|
||||
document.querySelectorAll(SELECTORS.TRANSLATABLE).forEach(element => {
|
||||
const key = element.getAttribute(DATA_ATTRS.TRANSLATE);
|
||||
|
||||
if (t[key]) {
|
||||
// Check if content contains HTML tags
|
||||
if (t[key].includes('<strong>') || t[key].includes('<em>')) {
|
||||
element.innerHTML = t[key];
|
||||
} else {
|
||||
element.textContent = t[key];
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
// Update language toggle button
|
||||
const langToggle = document.querySelector(SELECTORS.LANG_TOGGLE);
|
||||
if (langToggle) {
|
||||
langToggle.textContent = t.langSwitch;
|
||||
langToggle.setAttribute(DATA_ATTRS.LANG, language);
|
||||
}
|
||||
|
||||
// Update expand button text if it exists
|
||||
updateExpandButtonText(language);
|
||||
}
|
||||
|
||||
/**
|
||||
* Update expand button text based on current state
|
||||
* @param {string} language - Current language
|
||||
*/
|
||||
function updateExpandButtonText(language) {
|
||||
const expandButton = document.querySelector(SELECTORS.EXPAND_BUTTON);
|
||||
if (expandButton) {
|
||||
const expandText = expandButton.querySelector('.expand-text');
|
||||
const isExpanded = expandButton.getAttribute(DATA_ATTRS.EXPANDED) === 'true';
|
||||
const t = translations[language];
|
||||
|
||||
if (expandText && t) {
|
||||
expandText.textContent = isExpanded ? t.hideDetails : t.expandDetails;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a specific translation string
|
||||
* @param {string} key - Translation key
|
||||
* @returns {string} Translated text
|
||||
*/
|
||||
function getTranslation(key) {
|
||||
return translations[currentLanguage][key] || key;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get current language
|
||||
* @returns {string} Current language code
|
||||
*/
|
||||
function getCurrentLanguage() {
|
||||
return currentLanguage;
|
||||
}
|
||||
0
lagen/cyberangriffe/data/.gitkeep
Normale Datei
258
lagen/cyberangriffe/index.html
Normale Datei
@@ -0,0 +1,258 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="de">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<meta name="robots" content="index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1">
|
||||
<meta name="theme-color" content="#0A1832">
|
||||
<meta name="author" content="AegisSight UG">
|
||||
<title>Lagebild: Cyberangriffe auf deutsche Infrastruktur - AegisSight</title>
|
||||
<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/">
|
||||
|
||||
<meta name="description" content="Live-Lagebild Cyberangriffe gegen deutsche Infrastruktur: KI-OSINT-Auswertung, automatische Faktenchecks, geografische Verortung. Kontinuierlich aktualisiert.">
|
||||
<link rel="canonical" href="https://aegis-sight.de/lagen/cyberangriffe/">
|
||||
|
||||
<!-- Open Graph -->
|
||||
<meta property="og:type" content="article">
|
||||
<meta property="og:site_name" content="AegisSight">
|
||||
<meta property="og:title" content="Lagebild Cyberangriffe auf deutsche Infrastruktur - AegisSight">
|
||||
<meta property="og:description" content="Live-Lagebild Cyberangriffe gegen deutsche Infrastruktur: KI-OSINT-Auswertung, automatische Faktenchecks, geografische Verortung. Kontinuierlich aktualisiert.">
|
||||
<meta property="og:url" content="https://aegis-sight.de/lagen/cyberangriffe/">
|
||||
<meta property="og:image" content="https://aegis-sight.de/assets/images/og-image.png">
|
||||
<meta property="og:image:width" content="1200">
|
||||
<meta property="og:image:height" content="630">
|
||||
<meta property="og:locale" content="de_DE">
|
||||
<meta property="og:locale:alternate" content="en_GB">
|
||||
|
||||
<!-- Twitter Card -->
|
||||
<meta name="twitter:card" content="summary_large_image">
|
||||
<meta name="twitter:title" content="Lagebild Cyberangriffe auf deutsche Infrastruktur - AegisSight">
|
||||
<meta name="twitter:description" content="Live-Lagebild Cyberangriffe gegen deutsche Infrastruktur: KI-OSINT-Auswertung, automatische Faktenchecks, geografische Verortung. Kontinuierlich aktualisiert.">
|
||||
<meta name="twitter:image" content="https://aegis-sight.de/assets/images/og-image.png">
|
||||
|
||||
<!-- Schema.org NewsArticle (AEO/GEO: zitierfähige Live-Lage) -->
|
||||
<script type="application/ld+json">
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "NewsArticle",
|
||||
"@id": "https://aegis-sight.de/lagen/cyberangriffe/#article",
|
||||
"headline": "Lagebild Cyberangriffe auf deutsche Infrastruktur",
|
||||
"name": "Lagebild Cyberangriffe auf deutsche Infrastruktur",
|
||||
"description": "Live-Lagebild Cyberangriffe gegen deutsche Infrastruktur: KI-OSINT-Auswertung, automatische Faktenchecks, geografische Verortung. Kontinuierlich aktualisiert.",
|
||||
"url": "https://aegis-sight.de/lagen/cyberangriffe/",
|
||||
"image": "https://aegis-sight.de/assets/images/og-image.png",
|
||||
"inLanguage": "de-DE",
|
||||
"isAccessibleForFree": true,
|
||||
"datePublished": "2026-01-08",
|
||||
"dateModified": "2026-05-17",
|
||||
"articleSection": "Cybersicherheit",
|
||||
"temporalCoverage": "2024-01-01/..",
|
||||
"keywords": ["Cyberangriff", "Deutschland", "Kritische Infrastruktur", "KRITIS", "OSINT", "BSI", "Cybersicherheit", "Echtzeit-Lagebild"],
|
||||
"about": [
|
||||
{ "@type": "Country", "name": "Deutschland" },
|
||||
{ "@type": "Thing", "name": "Kritische Infrastruktur" },
|
||||
{ "@type": "Thing", "name": "Cybersicherheit" }
|
||||
],
|
||||
"isBasedOn": "https://aegis-sight.de/lagen/cyberangriffe/data/current.json",
|
||||
"speakable": {
|
||||
"@type": "SpeakableSpecification",
|
||||
"cssSelector": ["#incident-title", "#ueberblick-content", "#summary-content"]
|
||||
},
|
||||
"author": { "@id": "https://aegis-sight.de/#organization" },
|
||||
"publisher": { "@id": "https://aegis-sight.de/#organization" }
|
||||
}
|
||||
</script>
|
||||
<!-- Schema.org Dataset (Lagebild-Daten als maschinenlesbares Set) -->
|
||||
<script type="application/ld+json">
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "Dataset",
|
||||
"@id": "https://aegis-sight.de/lagen/cyberangriffe/#dataset",
|
||||
"name": "Lagebild Cyberangriffe auf deutsche Infrastruktur – Lagedaten",
|
||||
"description": "Aggregierte OSINT-Lagedaten zu Cyberangriffen gegen deutsche Behörden, Unternehmen und kritische Infrastruktur. Laufend gepflegte Liste mit Faktenchecks, Quellen und geografischer Verortung. Aktualisierung alle 5 Minuten.",
|
||||
"url": "https://aegis-sight.de/lagen/cyberangriffe/",
|
||||
"inLanguage": "de-DE",
|
||||
"isAccessibleForFree": true,
|
||||
"datePublished": "2026-01-08",
|
||||
"dateModified": "2026-05-17",
|
||||
"temporalCoverage": "2024-01-01/..",
|
||||
"keywords": ["Cyberangriff", "Deutschland", "KRITIS", "OSINT", "Lagebild", "Echtzeitdaten"],
|
||||
"creator": { "@id": "https://aegis-sight.de/#organization" },
|
||||
"publisher": { "@id": "https://aegis-sight.de/#organization" },
|
||||
"isBasedOn": { "@id": "https://aegis-sight.de/#osint-service" },
|
||||
"distribution": [
|
||||
{
|
||||
"@type": "DataDownload",
|
||||
"encodingFormat": "application/json",
|
||||
"contentUrl": "https://aegis-sight.de/lagen/cyberangriffe/data/current.json"
|
||||
}
|
||||
]
|
||||
}
|
||||
</script>
|
||||
|
||||
<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="/assets/vendor/leaflet/leaflet.css" />
|
||||
<link rel="stylesheet" href="/assets/vendor/leaflet/MarkerCluster.css">
|
||||
<link rel="stylesheet" href="/assets/vendor/leaflet/MarkerCluster.Default.css">
|
||||
<link rel="stylesheet" href="/cookie-consent.css">
|
||||
|
||||
<script type="application/ld+json">
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "BreadcrumbList",
|
||||
"itemListElement": [
|
||||
{
|
||||
"@type": "ListItem",
|
||||
"position": 1,
|
||||
"name": "AegisSight",
|
||||
"item": "https://aegis-sight.de/"
|
||||
},
|
||||
{
|
||||
"@type": "ListItem",
|
||||
"position": 2,
|
||||
"name": "Cyberangriffe auf deutsche Infrastruktur",
|
||||
"item": "https://aegis-sight.de/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="/"><img src="/assets/images/logos/Logo+Schrift_Rechts.svg" alt="AegisSight" class="logo-img" width="200" height="40"></a>
|
||||
</div>
|
||||
<ul class="nav-menu">
|
||||
<li><a href="/">Startseite</a></li>
|
||||
<li><a href="/#about">Über uns</a></li>
|
||||
<li><a href="/#products">Lösungen</a></li>
|
||||
<li><a href="mailto:info@aegis-sight.de">Kontakt</a></li>
|
||||
</ul>
|
||||
<div class="nav-extras">
|
||||
<div class="lang-switcher" role="group" aria-label="Sprache">
|
||||
<span class="lang-active" lang="de" aria-current="true">DE</span>
|
||||
<span class="lang-sep" aria-hidden="true">|</span>
|
||||
<a class="lang-link" href="/en/situations/cyber-attacks/" lang="en" hreflang="en" rel="alternate">EN</a>
|
||||
</div>
|
||||
<button class="mobile-menu-toggle" aria-label="Menü öffnen" 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="Menü schließen">
|
||||
<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="/">Startseite</a></li>
|
||||
<li><a href="/#about">Über uns</a></li>
|
||||
<li><a href="/#products">Lösungen</a></li>
|
||||
<li><a href="mailto:info@aegis-sight.de">Kontakt</a></li>
|
||||
</ul>
|
||||
<div class="lang-switcher" role="group" aria-label="Sprache">
|
||||
<span class="lang-active" lang="de" aria-current="true">DE</span>
|
||||
<span class="lang-sep" aria-hidden="true">|</span>
|
||||
<a class="lang-link" href="/en/situations/cyber-attacks/" lang="en" hreflang="en" rel="alternate">EN</a>
|
||||
</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">LAGEBILD</h1>
|
||||
<p class="hero-incident-title" id="incident-title">Cyberangriffe auf deutsche Infrastruktur</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">Neueste Entwicklungen</button>
|
||||
<button class="tab-btn" data-tab="lagebild">Lagebild</button>
|
||||
<button class="tab-btn" data-tab="karte">Karte</button>
|
||||
<button class="tab-btn" data-tab="faktenchecks">Faktenchecks <span class="tab-badge" id="tab-badge-faktenchecks"></span></button>
|
||||
<button class="tab-btn" data-tab="quellen">Quellen <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">Daten bereitgestellt durch AegisSight Monitor</p>
|
||||
<section class="content-card">
|
||||
<div class="card-header">
|
||||
<h2 id="ueberblick-title">Neueste Entwicklungen</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">Daten bereitgestellt durch AegisSight Monitor</p>
|
||||
<section class="content-card">
|
||||
<div class="card-header">
|
||||
<h2 id="lagebild-date-title">Lagebild</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>Quellen</h2><p class="card-description">Alle vom AegisSight Monitor überwachten Quellen</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>Karte</h2><p class="card-description">Geografische Einordnung der Meldungen</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>Faktenchecks</h2><p class="card-description">KI-gestützte Verifizierung aller zentralen Aussagen gegen unabhängige Quellen.</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</p></div>
|
||||
<div class="footer-section"><h4>Navigation</h4><ul><li><a href="/">Startseite</a></li><li><a href="/#features">Funktionen</a></li><li><a href="/#demos">Live-Lagebilder</a></li><li><a href="/#trust">Über uns</a></li><li><a href="/#contact">Kontakt</a></li></ul></div>
|
||||
<div class="footer-section"><h4>Rechtliches</h4><ul><li><a href="/impressum.html">Impressum</a></li><li><a href="/datenschutz.html">Datenschutz</a></li><li><a href="#" id="cookie-settings-link">Cookie-Einstellungen</a></li></ul></div>
|
||||
<div class="footer-section"><h4>Kontakt</h4><p>info@aegis-sight.de</p></div>
|
||||
</div>
|
||||
<p class="copyright">© 2026 AegisSight UG (haftungsbeschränkt). Alle Rechte vorbehalten.</p>
|
||||
</div>
|
||||
</footer>
|
||||
<script src="/js/config.js"></script>
|
||||
<script src="/js/mobile-nav.js"></script>
|
||||
<script src="/assets/vendor/leaflet/leaflet.js"></script>
|
||||
<script src="/assets/vendor/leaflet/leaflet.markercluster.js"></script>
|
||||
<script src="/lagen/iran-konflikt/lagebild.js"></script>
|
||||
<script src="/cookie-consent.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
0
lagen/deepfakes/data/.gitkeep
Normale Datei
303
lagen/deepfakes/index.html
Normale Datei
@@ -0,0 +1,303 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="de">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<meta name="robots" content="index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1">
|
||||
<meta name="theme-color" content="#0A1832">
|
||||
<meta name="author" content="AegisSight UG">
|
||||
<title>Recherche: Rechtliche Lage von Deepfakes in Deutschland - AegisSight</title>
|
||||
<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/">
|
||||
|
||||
<meta name="description" content="Recherche-Briefing zur rechtlichen Lage von Deepfakes in Deutschland: KI-gestützte Auswertung von Rechtsprechung, Gesetzgebung und Medienberichterstattung.">
|
||||
<link rel="canonical" href="https://aegis-sight.de/lagen/deepfakes/">
|
||||
|
||||
<!-- Open Graph -->
|
||||
<meta property="og:type" content="article">
|
||||
<meta property="og:site_name" content="AegisSight">
|
||||
<meta property="og:title" content="Recherche: Rechtliche Lage von Deepfakes in Deutschland - AegisSight">
|
||||
<meta property="og:description" content="Recherche-Briefing zur rechtlichen Lage von Deepfakes in Deutschland: KI-gestützte Auswertung von Rechtsprechung, Gesetzgebung und Medienberichterstattung.">
|
||||
<meta property="og:url" content="https://aegis-sight.de/lagen/deepfakes/">
|
||||
<meta property="og:image" content="https://aegis-sight.de/assets/images/og-image.png">
|
||||
<meta property="og:image:width" content="1200">
|
||||
<meta property="og:image:height" content="630">
|
||||
<meta property="og:locale" content="de_DE">
|
||||
<meta property="og:locale:alternate" content="en_GB">
|
||||
|
||||
<!-- Twitter Card -->
|
||||
<meta name="twitter:card" content="summary_large_image">
|
||||
<meta name="twitter:title" content="Recherche: Rechtliche Lage von Deepfakes in Deutschland - AegisSight">
|
||||
<meta name="twitter:description" content="Recherche-Briefing zur rechtlichen Lage von Deepfakes in Deutschland: KI-gestützte Auswertung von Rechtsprechung, Gesetzgebung und Medienberichterstattung.">
|
||||
<meta name="twitter:image" content="https://aegis-sight.de/assets/images/og-image.png">
|
||||
|
||||
<!-- Schema.org Article (AEO/GEO: zitierfähiges Recherche-Briefing) -->
|
||||
<script type="application/ld+json">
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "Article",
|
||||
"@id": "https://aegis-sight.de/lagen/deepfakes/#article",
|
||||
"headline": "Recherche: Rechtliche Lage von Deepfakes in Deutschland",
|
||||
"name": "Recherche: Rechtliche Lage von Deepfakes in Deutschland",
|
||||
"description": "Recherche-Briefing zur rechtlichen Lage von Deepfakes in Deutschland: KI-gestützte Auswertung von Rechtsprechung, Gesetzgebung und Medienberichterstattung.",
|
||||
"url": "https://aegis-sight.de/lagen/deepfakes/",
|
||||
"image": "https://aegis-sight.de/assets/images/og-image.png",
|
||||
"inLanguage": "de-DE",
|
||||
"isAccessibleForFree": true,
|
||||
"datePublished": "2026-01-08",
|
||||
"dateModified": "2026-05-17",
|
||||
"articleSection": "Recht und Regulierung",
|
||||
"temporalCoverage": "2023-01-01/..",
|
||||
"keywords": ["Deepfake", "Recht", "Deutschland", "Rechtsprechung", "Gesetzgebung", "KI-Regulierung", "Digital Services Act", "Persönlichkeitsrechte"],
|
||||
"about": [
|
||||
{ "@type": "Country", "name": "Deutschland" },
|
||||
{ "@type": "Thing", "name": "Deepfakes" },
|
||||
{ "@type": "Thing", "name": "Rechtsprechung" },
|
||||
{ "@type": "Thing", "name": "KI-Regulierung" }
|
||||
],
|
||||
"isBasedOn": "https://aegis-sight.de/lagen/deepfakes/data/current.json",
|
||||
"speakable": {
|
||||
"@type": "SpeakableSpecification",
|
||||
"cssSelector": ["#incident-title", "#ueberblick-content", "#summary-content"]
|
||||
},
|
||||
"author": { "@id": "https://aegis-sight.de/#organization" },
|
||||
"publisher": { "@id": "https://aegis-sight.de/#organization" }
|
||||
}
|
||||
</script>
|
||||
|
||||
<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="/assets/vendor/leaflet/leaflet.css" />
|
||||
<link rel="stylesheet" href="/assets/vendor/leaflet/MarkerCluster.css">
|
||||
<link rel="stylesheet" href="/assets/vendor/leaflet/MarkerCluster.Default.css">
|
||||
<link rel="stylesheet" href="/cookie-consent.css">
|
||||
|
||||
<script type="application/ld+json">
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "BreadcrumbList",
|
||||
"itemListElement": [
|
||||
{
|
||||
"@type": "ListItem",
|
||||
"position": 1,
|
||||
"name": "AegisSight",
|
||||
"item": "https://aegis-sight.de/"
|
||||
},
|
||||
{
|
||||
"@type": "ListItem",
|
||||
"position": 2,
|
||||
"name": "Rechtliche Lage von Deepfakes",
|
||||
"item": "https://aegis-sight.de/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="/"><img src="/assets/images/logos/Logo+Schrift_Rechts.svg" alt="AegisSight" class="logo-img" width="200" height="40"></a>
|
||||
</div>
|
||||
<ul class="nav-menu">
|
||||
<li><a href="/">Startseite</a></li>
|
||||
<li><a href="/#about">Über uns</a></li>
|
||||
<li><a href="/#products">Lösungen</a></li>
|
||||
<li><a href="mailto:info@aegis-sight.de">Kontakt</a></li>
|
||||
</ul>
|
||||
<div class="nav-extras">
|
||||
<div class="lang-switcher" role="group" aria-label="Sprache">
|
||||
<span class="lang-active" lang="de" aria-current="true">DE</span>
|
||||
<span class="lang-sep" aria-hidden="true">|</span>
|
||||
<a class="lang-link" href="/en/situations/deepfakes/" lang="en" hreflang="en" rel="alternate">EN</a>
|
||||
</div>
|
||||
<button class="mobile-menu-toggle" aria-label="Menü öffnen" 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="Menü schließen">
|
||||
<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="/">Startseite</a></li>
|
||||
<li><a href="/#about">Über uns</a></li>
|
||||
<li><a href="/#products">Lösungen</a></li>
|
||||
<li><a href="mailto:info@aegis-sight.de">Kontakt</a></li>
|
||||
</ul>
|
||||
<div class="lang-switcher" role="group" aria-label="Sprache">
|
||||
<span class="lang-active" lang="de" aria-current="true">DE</span>
|
||||
<span class="lang-sep" aria-hidden="true">|</span>
|
||||
<a class="lang-link" href="/en/situations/deepfakes/" lang="en" hreflang="en" rel="alternate">EN</a>
|
||||
</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">RECHERCHE</h1>
|
||||
<p class="hero-incident-title" id="incident-title">Rechtliche Lage von Deepfakes in Deutschland</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">Zusammenfassung</button>
|
||||
<button class="tab-btn" data-tab="lagebild">Recherche</button>
|
||||
<button class="tab-btn" data-tab="karte">Karte</button>
|
||||
<button class="tab-btn" data-tab="faktenchecks">Faktenchecks <span class="tab-badge" id="tab-badge-faktenchecks"></span></button>
|
||||
<button class="tab-btn" data-tab="quellen">Quellen <span class="tab-badge" id="tab-badge-quellen"></span></button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Main Content -->
|
||||
<main class="lagebild-main">
|
||||
<div class="container">
|
||||
<!-- Tab: Ueberblick (Zusammenfassung) -->
|
||||
<div class="tab-panel active" id="panel-ueberblick">
|
||||
<p class="data-source-note">Daten bereitgestellt durch AegisSight Monitor</p>
|
||||
<section class="content-card">
|
||||
<div class="card-header">
|
||||
<h2 id="ueberblick-title">Zusammenfassung</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: Lagebild (Recherche) -->
|
||||
<div class="tab-panel" id="panel-lagebild">
|
||||
<p class="data-source-note">Daten bereitgestellt durch AegisSight Monitor</p>
|
||||
<section class="content-card">
|
||||
<div class="card-header">
|
||||
<h2 id="lagebild-date-title">Recherche</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: Quellen -->
|
||||
<div class="tab-panel" id="panel-quellen">
|
||||
<section class="content-card">
|
||||
<div class="card-header">
|
||||
<h2>Quellen</h2>
|
||||
<p class="card-description">Alle vom AegisSight Monitor ausgewerteten Quellen</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: Karte -->
|
||||
<div class="tab-panel" id="panel-karte">
|
||||
<section class="content-card">
|
||||
<div class="card-header">
|
||||
<h2>Karte</h2>
|
||||
<p class="card-description">Geografische Einordnung der Quellen</p>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div id="map-container" style="height:500px;border-radius:4px;overflow:hidden;"></div>
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
|
||||
<!-- Tab: Faktenchecks -->
|
||||
<div class="tab-panel" id="panel-faktenchecks">
|
||||
<section class="content-card">
|
||||
<div class="card-header">
|
||||
<h2>Faktenchecks</h2>
|
||||
<p class="card-description">KI-gestützte Verifizierung aller zentralen Aussagen gegen unabhängige Quellen.</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</p>
|
||||
</div>
|
||||
<div class="footer-section">
|
||||
<h4>Navigation</h4>
|
||||
<ul>
|
||||
<li><a href="/">Startseite</a></li>
|
||||
<li><a href="/#features">Funktionen</a></li>
|
||||
<li><a href="/#demos">Live-Lagebilder</a></li>
|
||||
<li><a href="/#trust">Über uns</a></li>
|
||||
<li><a href="/#contact">Kontakt</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="footer-section">
|
||||
<h4>Rechtliches</h4>
|
||||
<ul>
|
||||
<li><a href="/impressum.html">Impressum</a></li>
|
||||
<li><a href="/datenschutz.html">Datenschutz</a></li>
|
||||
<li><a href="#" id="cookie-settings-link">Cookie-Einstellungen</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="footer-section">
|
||||
<h4>Kontakt</h4>
|
||||
<p>info@aegis-sight.de</p>
|
||||
</div>
|
||||
</div>
|
||||
<p class="copyright">© 2026 AegisSight UG (haftungsbeschränkt). Alle Rechte vorbehalten.</p>
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
<!-- Scripts -->
|
||||
<script src="/js/config.js"></script>
|
||||
<script src="/js/mobile-nav.js"></script>
|
||||
<script src="/assets/vendor/leaflet/leaflet.js"></script>
|
||||
<script src="/assets/vendor/leaflet/leaflet.markercluster.js"></script>
|
||||
<script src="/lagen/iran-konflikt/lagebild.js"></script>
|
||||
<script src="/cookie-consent.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
0
lagen/iran-konflikt/data/.gitkeep
Normale Datei
334
lagen/iran-konflikt/index.html
Normale Datei
@@ -0,0 +1,334 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="de">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<meta name="robots" content="index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1">
|
||||
<meta name="theme-color" content="#0A1832">
|
||||
<meta name="author" content="AegisSight UG">
|
||||
<title>Lagebild Iran-Konflikt - AegisSight</title>
|
||||
<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/">
|
||||
|
||||
<meta name="description" content="Live-Lagebild Iran-Konflikt: KI-gestützte OSINT-Auswertung hunderter Quellen in Echtzeit, automatische Faktenchecks, geografische Verortung und Zeitverlauf.">
|
||||
<link rel="canonical" href="https://aegis-sight.de/lagen/iran-konflikt/">
|
||||
|
||||
<!-- Open Graph -->
|
||||
<meta property="og:type" content="article">
|
||||
<meta property="og:site_name" content="AegisSight">
|
||||
<meta property="og:title" content="Lagebild Iran-Konflikt - AegisSight">
|
||||
<meta property="og:description" content="Live-Lagebild Iran-Konflikt: KI-gestützte OSINT-Auswertung hunderter Quellen in Echtzeit, automatische Faktenchecks, geografische Verortung und Zeitverlauf.">
|
||||
<meta property="og:url" content="https://aegis-sight.de/lagen/iran-konflikt/">
|
||||
<meta property="og:image" content="https://aegis-sight.de/assets/images/og-image.png">
|
||||
<meta property="og:image:width" content="1200">
|
||||
<meta property="og:image:height" content="630">
|
||||
<meta property="og:locale" content="de_DE">
|
||||
<meta property="og:locale:alternate" content="en_GB">
|
||||
|
||||
<!-- Twitter Card -->
|
||||
<meta name="twitter:card" content="summary_large_image">
|
||||
<meta name="twitter:title" content="Lagebild Iran-Konflikt - AegisSight">
|
||||
<meta name="twitter:description" content="Live-Lagebild Iran-Konflikt: KI-gestützte OSINT-Auswertung hunderter Quellen in Echtzeit, automatische Faktenchecks, geografische Verortung und Zeitverlauf.">
|
||||
<meta name="twitter:image" content="https://aegis-sight.de/assets/images/og-image.png">
|
||||
|
||||
<!-- Schema.org NewsArticle (AEO/GEO: zitierfähige Live-Lage) -->
|
||||
<script type="application/ld+json">
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "NewsArticle",
|
||||
"@id": "https://aegis-sight.de/lagen/iran-konflikt/#article",
|
||||
"headline": "Lagebild Iran-Konflikt",
|
||||
"name": "Lagebild Iran-Konflikt",
|
||||
"description": "Live-Lagebild Iran-Konflikt: KI-gestützte OSINT-Auswertung hunderter Quellen in Echtzeit, automatische Faktenchecks, geografische Verortung und Zeitverlauf.",
|
||||
"url": "https://aegis-sight.de/lagen/iran-konflikt/",
|
||||
"image": "https://aegis-sight.de/assets/images/og-image.png",
|
||||
"inLanguage": "de-DE",
|
||||
"isAccessibleForFree": true,
|
||||
"datePublished": "2026-01-08",
|
||||
"dateModified": "2026-05-17",
|
||||
"articleSection": "Internationale Sicherheitslage",
|
||||
"temporalCoverage": "2024-04-13/..",
|
||||
"keywords": ["Iran", "Iran-Konflikt", "Naher Osten", "OSINT", "Echtzeit-Lagebild", "KI-Faktencheck", "Sicherheitslage"],
|
||||
"about": [
|
||||
{ "@type": "Place", "name": "Iran" },
|
||||
{ "@type": "Thing", "name": "Internationale Sicherheitslage" }
|
||||
],
|
||||
"isBasedOn": "https://aegis-sight.de/lagen/iran-konflikt/data/current.json",
|
||||
"speakable": {
|
||||
"@type": "SpeakableSpecification",
|
||||
"cssSelector": ["#incident-title", "#ueberblick-content", "#summary-content"]
|
||||
},
|
||||
"author": { "@id": "https://aegis-sight.de/#organization" },
|
||||
"publisher": { "@id": "https://aegis-sight.de/#organization" }
|
||||
}
|
||||
</script>
|
||||
<!-- Schema.org Dataset (Lagebild-Daten als maschinenlesbares Set) -->
|
||||
<script type="application/ld+json">
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "Dataset",
|
||||
"@id": "https://aegis-sight.de/lagen/iran-konflikt/#dataset",
|
||||
"name": "Lagebild Iran-Konflikt – Lagedaten",
|
||||
"description": "Aggregierte OSINT-Lagedaten zum Iran-Konflikt: laufend gepflegte Liste von Meldungen, Faktenchecks, Quellen und geografischen Verortungen. Aktualisierung alle 5 Minuten.",
|
||||
"url": "https://aegis-sight.de/lagen/iran-konflikt/",
|
||||
"inLanguage": "de-DE",
|
||||
"isAccessibleForFree": true,
|
||||
"datePublished": "2026-01-08",
|
||||
"dateModified": "2026-05-17",
|
||||
"temporalCoverage": "2024-04-13/..",
|
||||
"keywords": ["Iran", "OSINT", "Lagebild", "Faktencheck", "Echtzeitdaten"],
|
||||
"creator": { "@id": "https://aegis-sight.de/#organization" },
|
||||
"publisher": { "@id": "https://aegis-sight.de/#organization" },
|
||||
"isBasedOn": { "@id": "https://aegis-sight.de/#osint-service" },
|
||||
"distribution": [
|
||||
{
|
||||
"@type": "DataDownload",
|
||||
"encodingFormat": "application/json",
|
||||
"contentUrl": "https://aegis-sight.de/lagen/iran-konflikt/data/current.json"
|
||||
}
|
||||
]
|
||||
}
|
||||
</script>
|
||||
|
||||
<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="lagebild.css">
|
||||
<link rel="stylesheet" href="/assets/vendor/leaflet/leaflet.css" />
|
||||
<link rel="stylesheet" href="/assets/vendor/leaflet/MarkerCluster.css">
|
||||
<link rel="stylesheet" href="/assets/vendor/leaflet/MarkerCluster.Default.css">
|
||||
<link rel="stylesheet" href="/cookie-consent.css">
|
||||
|
||||
<script type="application/ld+json">
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "BreadcrumbList",
|
||||
"itemListElement": [
|
||||
{
|
||||
"@type": "ListItem",
|
||||
"position": 1,
|
||||
"name": "AegisSight",
|
||||
"item": "https://aegis-sight.de/"
|
||||
},
|
||||
{
|
||||
"@type": "ListItem",
|
||||
"position": 2,
|
||||
"name": "Iran-Konflikt",
|
||||
"item": "https://aegis-sight.de/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="/"><img src="/assets/images/logos/Logo+Schrift_Rechts.svg" alt="AegisSight" class="logo-img" width="200" height="40"></a>
|
||||
</div>
|
||||
<ul class="nav-menu">
|
||||
<li><a href="/">Startseite</a></li>
|
||||
<li><a href="/#about">Über uns</a></li>
|
||||
<li><a href="/#products">Lösungen</a></li>
|
||||
<li><a href="mailto:info@aegis-sight.de">Kontakt</a></li>
|
||||
</ul>
|
||||
<div class="nav-extras">
|
||||
<div class="lang-switcher" role="group" aria-label="Sprache">
|
||||
<span class="lang-active" lang="de" aria-current="true">DE</span>
|
||||
<span class="lang-sep" aria-hidden="true">|</span>
|
||||
<a class="lang-link" href="/en/situations/iran-conflict/" lang="en" hreflang="en" rel="alternate">EN</a>
|
||||
</div>
|
||||
<button class="mobile-menu-toggle" aria-label="Menü öffnen" 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="Menü schließen">
|
||||
<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="/">Startseite</a></li>
|
||||
<li><a href="/#about">Über uns</a></li>
|
||||
<li><a href="/#products">Lösungen</a></li>
|
||||
<li><a href="mailto:info@aegis-sight.de">Kontakt</a></li>
|
||||
</ul>
|
||||
<div class="lang-switcher" role="group" aria-label="Sprache">
|
||||
<span class="lang-active" lang="de" aria-current="true">DE</span>
|
||||
<span class="lang-sep" aria-hidden="true">|</span>
|
||||
<a class="lang-link" href="/en/situations/iran-conflict/" lang="en" hreflang="en" rel="alternate">EN</a>
|
||||
</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">LAGEBILD</h1>
|
||||
<p class="hero-incident-title" id="incident-title">Iran-Konflikt</p>
|
||||
|
||||
<!-- Stat Cards -->
|
||||
<div class="hero-stats" id="hero-stats"></div>
|
||||
|
||||
<!-- Live Feed Ticker -->
|
||||
</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">Neueste Entwicklungen</button>
|
||||
<button class="tab-btn" data-tab="lagebild">Lagebild</button>
|
||||
<button class="tab-btn" data-tab="karte">Karte</button>
|
||||
<button class="tab-btn" data-tab="faktenchecks">Faktenchecks <span class="tab-badge" id="tab-badge-faktenchecks"></span></button>
|
||||
<button class="tab-btn" data-tab="quellen">Quellen <span class="tab-badge" id="tab-badge-quellen"></span></button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Main Content -->
|
||||
<main class="lagebild-main">
|
||||
<div class="container">
|
||||
<!-- Tab: Ueberblick (Neueste Entwicklungen / Zusammenfassung) -->
|
||||
<div class="tab-panel active" id="panel-ueberblick">
|
||||
<p class="data-source-note">Daten bereitgestellt durch AegisSight Monitor</p>
|
||||
<section class="content-card">
|
||||
<div class="card-header">
|
||||
<h2 id="ueberblick-title">Neueste Entwicklungen</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: Lagebild -->
|
||||
<div class="tab-panel" id="panel-lagebild">
|
||||
<p class="data-source-note">Daten bereitgestellt durch AegisSight Monitor</p>
|
||||
<section class="content-card">
|
||||
<div class="card-header">
|
||||
<h2 id="lagebild-date-title">Lagebild</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: Quellen -->
|
||||
<div class="tab-panel" id="panel-quellen">
|
||||
<section class="content-card">
|
||||
<div class="card-header">
|
||||
<h2>Quellen</h2>
|
||||
<p class="card-description">Alle vom AegisSight Monitor überwachten Quellen</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: Karte -->
|
||||
<div class="tab-panel" id="panel-karte">
|
||||
<section class="content-card">
|
||||
<div class="card-header">
|
||||
<h2>Karte</h2>
|
||||
<p class="card-description">Geografische Einordnung der Meldungen</p>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div id="map-container" style="height:500px;border-radius:4px;overflow:hidden;"></div>
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
|
||||
<!-- Tab: Faktenchecks -->
|
||||
<div class="tab-panel" id="panel-faktenchecks">
|
||||
<section class="content-card">
|
||||
<div class="card-header">
|
||||
<h2>Faktenchecks</h2>
|
||||
<p class="card-description">KI-gestützte Verifizierung aller zentralen Aussagen gegen unabhängige Quellen. Alle Aussagen werden kontinuierlich gegen neue Quellen geprüft – bei neuer Evidenz ändert sich der Status automatisch.</p>
|
||||
</div>
|
||||
<div class="card-body" id="factchecks-content"></div>
|
||||
</section>
|
||||
</div>
|
||||
|
||||
<!-- CTA -->
|
||||
</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</p>
|
||||
</div>
|
||||
<div class="footer-section">
|
||||
<h4>Navigation</h4>
|
||||
<ul>
|
||||
<li><a href="/">Startseite</a></li>
|
||||
<li><a href="/#features">Funktionen</a></li>
|
||||
<li><a href="/#demos">Live-Lagebilder</a></li>
|
||||
<li><a href="/#trust">Über uns</a></li>
|
||||
<li><a href="/#contact">Kontakt</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="footer-section">
|
||||
<h4>Rechtliches</h4>
|
||||
<ul>
|
||||
<li><a href="/impressum.html">Impressum</a></li>
|
||||
<li><a href="/datenschutz.html">Datenschutz</a></li>
|
||||
<li><a href="#" id="cookie-settings-link">Cookie-Einstellungen</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="footer-section">
|
||||
<h4>Kontakt</h4>
|
||||
<p>info@aegis-sight.de</p>
|
||||
</div>
|
||||
</div>
|
||||
<p class="copyright">© 2026 AegisSight UG (haftungsbeschränkt). Alle Rechte vorbehalten.</p>
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
<!-- Scripts -->
|
||||
<script src="/js/config.js"></script>
|
||||
<script src="/js/mobile-nav.js"></script>
|
||||
<script src="/assets/vendor/leaflet/leaflet.js"></script>
|
||||
<script src="/assets/vendor/leaflet/leaflet.markercluster.js"></script>
|
||||
<script src="lagebild.js"></script>
|
||||
<script src="/cookie-consent.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
1633
lagen/iran-konflikt/lagebild.css
Normale Datei
1414
lagen/iran-konflikt/lagebild.js
Normale Datei
103
llms.txt
Normale Datei
@@ -0,0 +1,103 @@
|
||||
# AegisSight – OSINT-Monitoring aus Deutschland
|
||||
|
||||
> AegisSight Monitor ist eine KI-gestützte OSINT-Monitoring-Software aus
|
||||
> Deutschland, die hunderte offene Quellen rund um die Uhr auswertet und
|
||||
> daraus strukturierte Echtzeit-Lagebilder mit automatischer Faktenprüfung
|
||||
> erzeugt. Anbieter: AegisSight UG (haftungsbeschränkt), Langenfeld (NRW).
|
||||
> Kontakt: info@aegis-sight.de.
|
||||
|
||||
Sprachen der Inhalte: Deutsch und Englisch.
|
||||
Datenstand der Lagebilder: Aktualisierung alle 5 Minuten.
|
||||
Bei Zitaten bitte URL und das Stand-Datum aus dem jeweiligen Lagebild angeben.
|
||||
|
||||
## Häufige Fragen mit Antworten
|
||||
|
||||
### Was ist der AegisSight Monitor?
|
||||
Der AegisSight Monitor ist eine KI-gestützte OSINT-Monitoring-Software aus Deutschland, die hunderte offene Quellen rund um die Uhr auswertet und daraus strukturierte Echtzeit-Lagebilder mit automatischer Faktenprüfung erzeugt.
|
||||
|
||||
### Was ist ein Lagebild?
|
||||
Ein Lagebild ist die strukturierte Zusammenfassung der aktuellen Faktenlage zu einem Ereignis oder Konflikt, aufbereitet aus mehreren unabhängigen Quellen, mit Zeitverlauf, Quellenbelegen und geografischer Verortung.
|
||||
|
||||
### Welche Quellen wertet AegisSight aus?
|
||||
AegisSight wertet hunderte öffentlich zugängliche Quellen weltweit aus, darunter Nachrichtenagenturen, Fachmedien, Behördenmeldungen und Social Media. Beiträge in dutzenden Sprachen werden automatisch übersetzt, darunter Farsi, Arabisch und Hebräisch.
|
||||
|
||||
### Wie funktioniert die automatische Faktenprüfung?
|
||||
Jede zentrale Behauptung wird automatisch gegen mehrere unabhängige Quellen abgeglichen. Übereinstimmungen, Widersprüche und die Vertrauenswürdigkeit der Quellen fließen in eine transparente Bewertung ein, die im Lagebild mit den Originalquellen verlinkt ist.
|
||||
|
||||
### Ist AegisSight DSGVO-konform?
|
||||
AegisSight wird vollständig auf Servern in Deutschland betrieben und verarbeitet ausschließlich öffentlich zugängliche Quellen. Es werden keine Daten an Drittländer übermittelt.
|
||||
|
||||
### Für wen ist der AegisSight Monitor gedacht?
|
||||
Der AegisSight Monitor richtet sich an Behörden, Redaktionen und Sicherheitsdienste, die belastbare Lagebilder in Echtzeit benötigen, etwa Krisenstäbe, investigative Newsrooms, Werkschutz und Corporate Security.
|
||||
|
||||
### Wie bekomme ich Zugang zum AegisSight Monitor?
|
||||
Zugang erfolgt nach individueller Anfrage; Pilotzugänge für qualifizierte Organisationen sind möglich. Kontakt: info@aegis-sight.de.
|
||||
|
||||
### Ist AegisSight eine Monitoring-Software wie PRTG, Checkmk oder Nagios?
|
||||
Nein. AegisSight ist keine IT- oder Netzwerk-Monitoring-Software zur Überwachung von Servern, Systemen oder Verfügbarkeiten. AegisSight ist OSINT-Monitoring-Software: Überwacht werden öffentliche Informationsquellen wie Nachrichten, Fachmedien, Behördenmeldungen und Social Media, nicht die eigene IT-Infrastruktur. Ergebnis sind strukturierte Lagebilder zur Sicherheits- und Informationslage.
|
||||
|
||||
### Gibt es eine OSINT-Software aus Deutschland für Behörden?
|
||||
Ja. Der AegisSight Monitor ist eine OSINT-Software aus Deutschland (Anbieter: AegisSight UG, Langenfeld, Nordrhein-Westfalen). Sie wird vollständig auf Servern in Deutschland betrieben, ist DSGVO-konform und richtet sich unter anderem an Behörden, Sicherheitsdienste und Krisenstäbe.
|
||||
|
||||
### Welche OSINT-Software ist DSGVO-konform?
|
||||
Der AegisSight Monitor ist DSGVO-konform: Die Software läuft ausschließlich auf Servern in Deutschland, verarbeitet nur öffentlich zugängliche Quellen und übermittelt keine Daten in Drittländer. Damit ist sie eine europäische, souveräne Alternative zu außereuropäischen OSINT-Plattformen.
|
||||
|
||||
### Was kostet der AegisSight Monitor?
|
||||
Die Preise richten sich nach Umfang und Organisation und werden auf Anfrage genannt. Für qualifizierte Organisationen sind Pilotzugänge möglich. Kontakt: info@aegis-sight.de.
|
||||
|
||||
### Was ist Social-Media-Monitoring für Behörden?
|
||||
Social-Media-Monitoring für Behörden bezeichnet die strukturierte, kontinuierliche Auswertung öffentlicher Social-Media-Inhalte zur Lagebeurteilung, etwa für Krisenstäbe oder Sicherheitsbehörden. AegisSight integriert Social-Media-Quellen in seine OSINT-Lagebilder und prüft zentrale Behauptungen automatisch gegen unabhängige Quellen.
|
||||
|
||||
### Was ist Krisenmonitoring?
|
||||
Krisenmonitoring ist die fortlaufende Beobachtung einer Lage in Echtzeit, um Krisenstäbe und Entscheider mit einem aktuellen, belegten Lagebild zu versorgen. AegisSight liefert dafür automatisch aktualisierte Lagebilder mit Faktenprüfung, geografischer Verortung und Zeitverlauf.
|
||||
|
||||
## Glossar
|
||||
|
||||
- **OSINT** (Open Source Intelligence): Auswertung öffentlich zugänglicher Quellen wie Nachrichtenmedien, Behördenkommunikation, Fachpublikationen und Social Media zur Lagebeurteilung.
|
||||
- **Lagebild**: Strukturierte, aktuell gehaltene Zusammenfassung der Faktenlage zu einem Ereignis oder Themenkomplex, basierend auf mehreren unabhängigen Quellen, mit Zeitverlauf und Quellenbelegen.
|
||||
- **Faktencheck**: Automatischer Abgleich einer Behauptung gegen unabhängige Quellen mit nachvollziehbarer Belegliste und Evidenzstatus.
|
||||
- **Quellen-Klassifikation (AegisSight)**: Vierachsiges Bewertungsschema (Methodik, Transparenz, Unabhängigkeit, Track-Record), ergänzt um externe Signale wie IFCN und EUvsDisinfo.
|
||||
- **IFCN** (International Fact-Checking Network): Internationaler Verband zertifizierter Faktenprüfer, dessen Mitgliedschaft als Qualitätssignal in die AegisSight-Klassifikation einfließt.
|
||||
- **EUvsDisinfo**: Datenbank der EU-Auswärtigen-Dienst-Taskforce zu prorussischen Desinformationsnarrativen, von AegisSight als externes Signal für Quellenbewertung genutzt.
|
||||
- **Social-Media-Monitoring**: Strukturierte, fortlaufende Auswertung öffentlicher Social-Media-Inhalte zur Lagebeurteilung; bei AegisSight Teil der OSINT-Auswertung mit automatischem Faktencheck.
|
||||
- **Krisenmonitoring**: Echtzeit-Beobachtung einer Lage zur Versorgung von Krisenstäben und Entscheidern mit einem aktuellen, belegten Lagebild.
|
||||
- **SOCMINT** (Social Media Intelligence): Teilbereich von OSINT, der sich auf die Auswertung öffentlich zugänglicher Social-Media-Quellen konzentriert.
|
||||
- **Situational Awareness (Lagebewusstsein)**: Aktuelles, belastbares Verständnis einer Lage als Entscheidungsgrundlage; bei AegisSight das Ziel jedes Lagebilds.
|
||||
|
||||
## Hauptseiten
|
||||
|
||||
- [Startseite (DE)](https://aegis-sight.de/): Produktübersicht, FAQ, Live-Demos der Lagebilder
|
||||
- [Startseite (EN)](https://aegis-sight.de/en/): Same content, English version
|
||||
- [Impressum (DE)](https://aegis-sight.de/impressum.html)
|
||||
- [Legal notice (EN)](https://aegis-sight.de/en/legal-notice.html)
|
||||
- [Datenschutz (DE)](https://aegis-sight.de/datenschutz.html)
|
||||
- [Privacy policy (EN)](https://aegis-sight.de/en/privacy.html)
|
||||
|
||||
## Live-Lagebilder
|
||||
|
||||
- [Iran-Konflikt (DE)](https://aegis-sight.de/lagen/iran-konflikt/): Live-Lagebild mit Faktencheck-Liste, Quellenliste, geografischer Verortung und Timeline. Auswertung hunderter Quellen, Updates alle 5 Minuten.
|
||||
- [Iran Conflict (EN)](https://aegis-sight.de/en/situations/iran-conflict/)
|
||||
- [Cyberangriffe auf deutsche Infrastruktur (DE)](https://aegis-sight.de/lagen/cyberangriffe/): Live-Lagebild zu Cyberangriffen gegen deutsche Behörden, Unternehmen und kritische Infrastruktur.
|
||||
- [Cyberattacks (EN)](https://aegis-sight.de/en/situations/cyber-attacks/)
|
||||
- [Rechtliche Lage von Deepfakes in Deutschland (DE)](https://aegis-sight.de/lagen/deepfakes/): Recherche-Briefing zu Rechtsprechung, Gesetzgebung und Medienberichterstattung.
|
||||
- [Legal status of deepfakes in Germany (EN)](https://aegis-sight.de/en/situations/deepfakes/)
|
||||
|
||||
## Lösungen
|
||||
|
||||
- [OSINT- & Lagebild-Software (DE)](https://aegis-sight.de/loesungen/osint-lagebild-software/): OSINT- und Lagebild-Software für automatisierte Lageanalyse aus offenen Quellen.
|
||||
- [OSINT & Situational Awareness Software (EN)](https://aegis-sight.de/en/solutions/osint-situational-awareness-software/)
|
||||
- [Desinformationsmonitoring & FIMI (DE)](https://aegis-sight.de/loesungen/desinformationsmonitoring/): Desinformation und ausländische Informationsmanipulation (FIMI) früh erkennen, mit automatischer Faktenprüfung und transparenter Quellenbewertung.
|
||||
- [Disinformation Monitoring & FIMI (EN)](https://aegis-sight.de/en/solutions/disinformation-monitoring/)
|
||||
- [Social-Media- & Krisenmonitoring für Behörden (DE)](https://aegis-sight.de/loesungen/social-media-monitoring-behoerden/): Social-Media- und Krisenmonitoring für Behörden und Krisenstäbe, DSGVO-konform.
|
||||
- [Social Media & Crisis Monitoring for Government (EN)](https://aegis-sight.de/en/solutions/social-media-monitoring-government/)
|
||||
|
||||
## Maschinen-Indizes
|
||||
|
||||
- [Sitemap (XML)](https://aegis-sight.de/sitemap.xml)
|
||||
- [robots.txt](https://aegis-sight.de/robots.txt)
|
||||
|
||||
## Hinweis für KI-Crawler
|
||||
|
||||
- Live-Search-Bots (OAI-SearchBot, ChatGPT-User, ClaudeBot, PerplexityBot) sind in robots.txt erlaubt. Die Lagen dürfen also live in KI-Antworten zitiert werden.
|
||||
- Training-Bots (GPTBot, CCBot, anthropic-ai, Google-Extended, ...) sind geblockt: AegisSight-Inhalte sollen nicht in Trainingsdaten von LLM-Anbietern landen.
|
||||
- Beim Zitieren bitte URL und Stand-Datum (aus dem jeweiligen Lagebild) mit angeben.
|
||||
280
loesungen/desinformationsmonitoring/index.html
Normale Datei
@@ -0,0 +1,280 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="de">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<meta name="robots" content="index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1">
|
||||
<meta name="theme-color" content="#0A1832">
|
||||
<meta name="author" content="AegisSight UG">
|
||||
<title>Desinformationsmonitoring & FIMI-Erkennung | AegisSight</title>
|
||||
<meta name="description" content="Desinformationsmonitoring mit AegisSight: Manipulation und FIMI in offenen Quellen früh erkennen – durch automatische Faktenprüfung und transparente Quellenbewertung.">
|
||||
<link rel="canonical" href="https://aegis-sight.de/loesungen/desinformationsmonitoring/">
|
||||
<link rel="alternate" hreflang="de" href="https://aegis-sight.de/loesungen/desinformationsmonitoring/">
|
||||
<link rel="alternate" hreflang="en" href="https://aegis-sight.de/en/solutions/disinformation-monitoring/">
|
||||
<link rel="alternate" hreflang="x-default" href="https://aegis-sight.de/loesungen/desinformationsmonitoring/">
|
||||
|
||||
<!-- Open Graph -->
|
||||
<meta property="og:type" content="website">
|
||||
<meta property="og:site_name" content="AegisSight">
|
||||
<meta property="og:title" content="Desinformationsmonitoring & FIMI-Erkennung | AegisSight">
|
||||
<meta property="og:description" content="Desinformation und FIMI in offenen Quellen früh erkennen – mit automatischer Faktenprüfung und transparenter Quellenbewertung.">
|
||||
<meta property="og:url" content="https://aegis-sight.de/loesungen/desinformationsmonitoring/">
|
||||
<meta property="og:image" content="https://aegis-sight.de/assets/images/og-image.png">
|
||||
<meta property="og:image:width" content="1200">
|
||||
<meta property="og:image:height" content="630">
|
||||
<meta property="og:locale" content="de_DE">
|
||||
<meta property="og:locale:alternate" content="en_GB">
|
||||
|
||||
<!-- Twitter Card -->
|
||||
<meta name="twitter:card" content="summary_large_image">
|
||||
<meta name="twitter:title" content="Desinformationsmonitoring & FIMI-Erkennung | AegisSight">
|
||||
<meta name="twitter:description" content="Desinformation und FIMI in offenen Quellen früh erkennen – mit automatischer Faktenprüfung und transparenter Quellenbewertung.">
|
||||
<meta name="twitter:image" content="https://aegis-sight.de/assets/images/og-image.png">
|
||||
|
||||
<script type="application/ld+json">
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "Service",
|
||||
"@id": "https://aegis-sight.de/loesungen/desinformationsmonitoring/#service",
|
||||
"name": "Desinformationsmonitoring",
|
||||
"serviceType": "Desinformationsmonitoring und FIMI-Erkennung",
|
||||
"provider": { "@id": "https://aegis-sight.de/#organization" },
|
||||
"areaServed": [
|
||||
{ "@type": "Country", "name": "Deutschland" },
|
||||
{ "@type": "Country", "name": "Österreich" },
|
||||
{ "@type": "Country", "name": "Schweiz" },
|
||||
{ "@type": "AdministrativeArea", "name": "Europäische Union" }
|
||||
],
|
||||
"audience": {
|
||||
"@type": "BusinessAudience",
|
||||
"audienceType": "Behörden, Medienaufsicht, Redaktionen und strategische Kommunikation"
|
||||
},
|
||||
"description": "Desinformationsmonitoring auf Basis von OSINT: kontinuierliche Beobachtung offener Quellen, automatische Faktenprüfung gegen unabhängige Quellen und transparente Quellenbewertung mit externen Signalen wie IFCN und EUvsDisinfo. Unterstützt die frühe Erkennung von Desinformation und ausländischer Informationsmanipulation (FIMI)."
|
||||
}
|
||||
</script>
|
||||
<script type="application/ld+json">
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "BreadcrumbList",
|
||||
"itemListElement": [
|
||||
{ "@type": "ListItem", "position": 1, "name": "AegisSight", "item": "https://aegis-sight.de/" },
|
||||
{ "@type": "ListItem", "position": 2, "name": "Desinformationsmonitoring & FIMI", "item": "https://aegis-sight.de/loesungen/desinformationsmonitoring/" }
|
||||
]
|
||||
}
|
||||
</script>
|
||||
<script type="application/ld+json">
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "FAQPage",
|
||||
"inLanguage": "de-DE",
|
||||
"mainEntity": [
|
||||
{
|
||||
"@type": "Question",
|
||||
"name": "Was bedeutet FIMI?",
|
||||
"acceptedAnswer": { "@type": "Answer", "text": "FIMI steht für Foreign Information Manipulation and Interference, also ausländische Informationsmanipulation und Einflussnahme. Der von der EU geprägte Begriff beschreibt überwiegend nicht-illegale, aber manipulative und koordinierte Beeinflussung des Informationsraums durch ausländische Akteure." }
|
||||
},
|
||||
{
|
||||
"@type": "Question",
|
||||
"name": "Erkennt AegisSight Desinformation automatisch?",
|
||||
"acceptedAnswer": { "@type": "Answer", "text": "AegisSight unterstützt die Erkennung: Jede zentrale Behauptung wird automatisch gegen mehrere unabhängige Quellen geprüft, und Quellen werden transparent bewertet. Widersprüche und unbelegte Behauptungen werden so sichtbar. Die abschließende Einordnung und Bewertung bleibt bei den Fachanalystinnen und -analysten." }
|
||||
},
|
||||
{
|
||||
"@type": "Question",
|
||||
"name": "Welche externen Signale nutzt die Quellenbewertung?",
|
||||
"acceptedAnswer": { "@type": "Answer", "text": "Die Quellen-Klassifikation von AegisSight kombiniert ein vierachsiges Bewertungsschema (Methodik, Transparenz, Unabhängigkeit, Track-Record) mit externen Signalen wie der IFCN-Mitgliedschaft und der EUvsDisinfo-Datenbank." }
|
||||
}
|
||||
]
|
||||
}
|
||||
</script>
|
||||
|
||||
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
|
||||
<link rel="apple-touch-icon" href="/assets/images/logos/AegisSightLogo_NavyGold.svg">
|
||||
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">
|
||||
|
||||
<link rel="stylesheet" href="/css/style.css">
|
||||
<link rel="stylesheet" href="/css/lang-switcher.css">
|
||||
<link rel="stylesheet" href="/cookie-consent.css">
|
||||
<style>
|
||||
body { font-family: 'Inter', -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; background: var(--white); margin: 0; }
|
||||
.sol-hero { background: var(--navy); color: #E6ECF5; padding: calc(var(--nav-height) + 64px) 0 64px; }
|
||||
.sol-container { max-width: 880px; margin: 0 auto; padding: 0 24px; }
|
||||
.sol-breadcrumb { font-size: 0.85rem; color: #9FB0C8; margin: 0 0 18px; }
|
||||
.sol-breadcrumb a { color: #9FB0C8; text-decoration: none; }
|
||||
.sol-breadcrumb a:hover { color: var(--gold-light); }
|
||||
.sol-hero h1 { font-size: 2.4rem; font-weight: 700; color: #FFFFFF; margin: 0 0 16px; line-height: 1.2; }
|
||||
.sol-hero .sol-lead { font-size: 1.15rem; line-height: 1.7; color: #C6D2E4; margin: 0 0 28px; }
|
||||
.sol-cta-btn { display: inline-block; background: var(--gold); color: var(--navy); font-weight: 600; text-decoration: none; padding: 13px 28px; border-radius: 8px; transition: background .2s; }
|
||||
.sol-cta-btn:hover { background: var(--gold-light); }
|
||||
.sol-body { padding: 56px 0; }
|
||||
.sol-section { margin-bottom: 44px; }
|
||||
.sol-section:last-child { margin-bottom: 0; }
|
||||
.sol-section h2 { font-size: 1.6rem; font-weight: 700; color: var(--navy); margin: 0 0 16px; padding-bottom: 8px; border-bottom: 2px solid var(--gold); }
|
||||
.sol-section p { margin: 0 0 14px; line-height: 1.75; color: var(--text); font-size: 1rem; }
|
||||
.sol-section strong { color: var(--navy); font-weight: 600; }
|
||||
.feature-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); gap: 18px; margin-top: 8px; }
|
||||
.feature-card { background: var(--base); border: 1px solid var(--gray-100); border-radius: var(--radius-lg); padding: 22px 24px; }
|
||||
.feature-card h3 { font-size: 1.08rem; font-weight: 600; color: var(--navy); margin: 0 0 8px; }
|
||||
.feature-card p { font-size: 0.95rem; margin: 0; color: var(--text-light); line-height: 1.65; }
|
||||
.step-list { counter-reset: step; list-style: none; margin: 0; padding: 0; }
|
||||
.step-list li { position: relative; padding: 0 0 18px 52px; line-height: 1.7; color: var(--text); }
|
||||
.step-list li::before { counter-increment: step; content: counter(step); position: absolute; left: 0; top: 0; width: 34px; height: 34px; background: var(--navy); color: var(--gold); border-radius: 50%; display: flex; align-items: center; justify-content: center; font-weight: 700; font-size: 0.95rem; }
|
||||
.step-list li strong { display: block; color: var(--navy); margin-bottom: 2px; }
|
||||
details.sol-faq { border: 1px solid var(--gray-100); border-radius: 8px; margin-bottom: 10px; padding: 0; background: var(--base); }
|
||||
details.sol-faq summary { padding: 16px 20px; cursor: pointer; font-weight: 600; color: var(--navy); list-style: none; }
|
||||
details.sol-faq summary::-webkit-details-marker { display: none; }
|
||||
details.sol-faq .a { padding: 0 20px 16px; color: var(--text); line-height: 1.7; font-size: 0.97rem; }
|
||||
.sol-related { background: var(--base); border-radius: var(--radius-lg); padding: 28px 30px; margin-top: 8px; }
|
||||
.sol-related h2 { border: none; padding: 0; margin: 0 0 14px; font-size: 1.3rem; }
|
||||
.sol-related a { display: block; color: var(--gold-dark); text-decoration: none; font-weight: 600; padding: 6px 0; }
|
||||
.sol-related a:hover { color: var(--gold); }
|
||||
.sol-final-cta { background: var(--navy); color: #E6ECF5; text-align: center; padding: 48px 24px; border-radius: var(--radius-lg); margin-top: 8px; }
|
||||
.sol-final-cta h2 { color: #FFFFFF; border: none; padding: 0; margin: 0 0 10px; }
|
||||
.sol-final-cta p { color: #C6D2E4; margin: 0 0 22px; }
|
||||
@media (max-width: 768px) {
|
||||
.sol-hero h1 { font-size: 1.85rem; }
|
||||
.sol-container { padding: 0 16px; }
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<!-- Navigation -->
|
||||
<nav class="navbar" id="navbar">
|
||||
<div class="nav-container">
|
||||
<a href="/" class="nav-logo">
|
||||
<img src="/assets/images/logos/Logo+Schrift_Rechts.svg" alt="AegisSight" class="logo-img" width="200" height="40">
|
||||
</a>
|
||||
<ul class="nav-menu">
|
||||
<li><a href="/#features">Funktionen</a></li>
|
||||
<li><a href="/#loesungen">Lösungen</a></li>
|
||||
<li><a href="/#demos">Live-Lagebilder</a></li>
|
||||
<li><a href="/#trust">Über uns</a></li>
|
||||
<li><a href="/#contact">Kontakt</a></li>
|
||||
</ul>
|
||||
<div class="nav-extras">
|
||||
<div class="lang-switcher" role="group" aria-label="Sprache">
|
||||
<span class="lang-active" lang="de" aria-current="true">DE</span>
|
||||
<span class="lang-sep" aria-hidden="true">|</span>
|
||||
<a class="lang-link" href="/en/solutions/disinformation-monitoring/" lang="en" hreflang="en" rel="alternate">EN</a>
|
||||
</div>
|
||||
<button class="mobile-menu-toggle" aria-label="Menü öffnen" aria-expanded="false">
|
||||
<span></span><span></span><span></span>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<!-- Mobile Menu -->
|
||||
<div class="mobile-menu" id="mobile-menu" aria-hidden="true">
|
||||
<ul>
|
||||
<li><a href="/#features">Funktionen</a></li>
|
||||
<li><a href="/#loesungen">Lösungen</a></li>
|
||||
<li><a href="/#demos">Live-Lagebilder</a></li>
|
||||
<li><a href="/#trust">Über uns</a></li>
|
||||
<li><a href="/#contact">Kontakt</a></li>
|
||||
</ul>
|
||||
<div class="lang-switcher" role="group" aria-label="Sprache">
|
||||
<span class="lang-active" lang="de" aria-current="true">DE</span>
|
||||
<span class="lang-sep" aria-hidden="true">|</span>
|
||||
<a class="lang-link" href="/en/solutions/disinformation-monitoring/" lang="en" hreflang="en" rel="alternate">EN</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mobile-overlay" id="mobile-overlay"></div>
|
||||
|
||||
<main>
|
||||
<header class="sol-hero">
|
||||
<div class="sol-container">
|
||||
<nav class="sol-breadcrumb" aria-label="Brotkrumen">
|
||||
<a href="/">Start</a> › Desinformationsmonitoring & FIMI
|
||||
</nav>
|
||||
<h1>Desinformationsmonitoring: Manipulation in offenen Quellen früh erkennen</h1>
|
||||
<p class="sol-lead">AegisSight unterstützt Behörden, Medienaufsicht und Redaktionen dabei, Desinformation und ausländische Informationsmanipulation (FIMI) in offenen Quellen früh zu erkennen – mit automatischer Faktenprüfung und nachvollziehbarer Quellenbewertung.</p>
|
||||
<a class="sol-cta-btn" href="/#contact">Zugang anfragen</a>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<div class="sol-body">
|
||||
<div class="sol-container">
|
||||
<section class="sol-section">
|
||||
<h2>Was ist Desinformationsmonitoring und FIMI?</h2>
|
||||
<p><strong>Desinformationsmonitoring</strong> ist die kontinuierliche Beobachtung des Informationsraums auf manipulative, irreführende oder koordiniert verbreitete Inhalte. Ziel ist es, problematische Narrative früh sichtbar zu machen, bevor sie sich verbreiten.</p>
|
||||
<p><strong>FIMI</strong> (Foreign Information Manipulation and Interference) ist ein von der EU geprägter Begriff für ausländische Informationsmanipulation und Einflussnahme – überwiegend nicht-illegale, aber manipulative und koordinierte Beeinflussung des Informationsraums durch ausländische Akteure.</p>
|
||||
</section>
|
||||
|
||||
<section class="sol-section">
|
||||
<h2>Wie AegisSight bei der Erkennung unterstützt</h2>
|
||||
<p>AegisSight ist keine Blackbox, die Inhalte einfach als „wahr" oder „falsch" stempelt. Stattdessen schafft die Software die belegte Grundlage, auf der Fachleute Manipulation erkennen:</p>
|
||||
<ol class="step-list">
|
||||
<li><strong>Faktenprüfung</strong>Jede zentrale Behauptung wird automatisch gegen mehrere unabhängige Quellen abgeglichen; Übereinstimmungen und Widersprüche werden transparent ausgewiesen.</li>
|
||||
<li><strong>Quellenbewertung</strong>Quellen werden nach einem vierachsigen Schema (Methodik, Transparenz, Unabhängigkeit, Track-Record) klassifiziert, ergänzt um externe Signale wie IFCN und EUvsDisinfo.</li>
|
||||
<li><strong>Narrative verfolgen</strong>Über hunderte mehrsprachige Quellen hinweg wird sichtbar, wo eine Behauptung herkommt und wie sie sich ausbreitet.</li>
|
||||
</ol>
|
||||
</section>
|
||||
|
||||
<section class="sol-section">
|
||||
<h2>Funktionen im Überblick</h2>
|
||||
<div class="feature-grid">
|
||||
<div class="feature-card"><h3>Automatische Faktenprüfung</h3><p>Zentrale Behauptungen werden gegen unabhängige Quellen abgeglichen und transparent bewertet.</p></div>
|
||||
<div class="feature-card"><h3>Quellen-Klassifikation</h3><p>Vierachsiges Schema: Methodik, Transparenz, Unabhängigkeit und Track-Record.</p></div>
|
||||
<div class="feature-card"><h3>EUvsDisinfo- & IFCN-Signale</h3><p>Etablierte externe Signale fließen in die Quellenbewertung ein.</p></div>
|
||||
<div class="feature-card"><h3>Mehrsprachige Auswertung</h3><p>Manipulative Narrative sind oft fremdsprachig – AegisSight übersetzt automatisch.</p></div>
|
||||
<div class="feature-card"><h3>Belege & Zeitverlauf</h3><p>Jede Bewertung ist mit Originalquellen verlinkt und zeitlich nachvollziehbar.</p></div>
|
||||
<div class="feature-card"><h3>Geografische Verortung</h3><p>Meldungen und Narrative werden räumlich eingeordnet.</p></div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="sol-section">
|
||||
<h2>Für wen sich das Desinformationsmonitoring eignet</h2>
|
||||
<p>Die Lösung richtet sich an <strong>Sicherheitsbehörden</strong> und Krisenstäbe, an die <strong>Medienaufsicht</strong> im Rahmen des Medienstaatsvertrags, an investigative <strong>Redaktionen</strong> sowie an Teams in <strong>strategischer Kommunikation</strong> und Krisenkommunikation, die den Informationsraum belastbar im Blick behalten müssen.</p>
|
||||
</section>
|
||||
|
||||
<section class="sol-section">
|
||||
<h2>Häufige Fragen</h2>
|
||||
<details class="sol-faq"><summary>Was bedeutet FIMI?</summary><div class="a">FIMI steht für Foreign Information Manipulation and Interference, also ausländische Informationsmanipulation und Einflussnahme. Der von der EU geprägte Begriff beschreibt überwiegend nicht-illegale, aber manipulative und koordinierte Beeinflussung des Informationsraums durch ausländische Akteure.</div></details>
|
||||
<details class="sol-faq"><summary>Erkennt AegisSight Desinformation automatisch?</summary><div class="a">AegisSight unterstützt die Erkennung: Jede zentrale Behauptung wird automatisch gegen mehrere unabhängige Quellen geprüft, und Quellen werden transparent bewertet. Widersprüche und unbelegte Behauptungen werden so sichtbar. Die abschließende Einordnung bleibt bei den Fachanalystinnen und -analysten.</div></details>
|
||||
<details class="sol-faq"><summary>Welche externen Signale nutzt die Quellenbewertung?</summary><div class="a">Die Quellen-Klassifikation kombiniert ein vierachsiges Bewertungsschema (Methodik, Transparenz, Unabhängigkeit, Track-Record) mit externen Signalen wie der IFCN-Mitgliedschaft und der EUvsDisinfo-Datenbank.</div></details>
|
||||
</section>
|
||||
|
||||
<section class="sol-section sol-related-wrap">
|
||||
<div class="sol-related">
|
||||
<h2>Weitere Lösungen</h2>
|
||||
<a href="/loesungen/osint-lagebild-software/">OSINT- & Lagebild-Software ›</a>
|
||||
<a href="/loesungen/social-media-monitoring-behoerden/">Social-Media- & Krisenmonitoring für Behörden ›</a>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="sol-section">
|
||||
<div class="sol-final-cta">
|
||||
<h2>Desinformation früh erkennen – auf belegter Grundlage</h2>
|
||||
<p>Pilotzugänge für qualifizierte Organisationen sind möglich.</p>
|
||||
<a class="sol-cta-btn" href="/#contact">Kontakt aufnehmen</a>
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
|
||||
<!-- Footer -->
|
||||
<footer class="footer">
|
||||
<div class="container">
|
||||
<div class="footer-content">
|
||||
<div class="footer-info">
|
||||
<p class="footer-company">AegisSight UG (haftungsbeschränkt)</p>
|
||||
<p>Gladbacher Straße 3-5, 40764 Langenfeld</p>
|
||||
</div>
|
||||
<div class="footer-links">
|
||||
<a href="/impressum.html">Impressum</a>
|
||||
<a href="/datenschutz.html">Datenschutz</a>
|
||||
<a href="#" id="cookie-settings-link">Cookie-Einstellungen</a>
|
||||
</div>
|
||||
</div>
|
||||
<p class="footer-copyright">© <span id="footer-year">2026</span> AegisSight UG (haftungsbeschränkt). Alle Rechte vorbehalten.</p>
|
||||
</div>
|
||||
</footer>
|
||||
<script>document.getElementById('footer-year').textContent=new Date().getFullYear();</script>
|
||||
<script src="/js/app.js"></script>
|
||||
<script src="/cookie-consent.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
279
loesungen/osint-lagebild-software/index.html
Normale Datei
@@ -0,0 +1,279 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="de">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<meta name="robots" content="index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1">
|
||||
<meta name="theme-color" content="#0A1832">
|
||||
<meta name="author" content="AegisSight UG">
|
||||
<title>OSINT- & Lagebild-Software aus Deutschland | AegisSight</title>
|
||||
<meta name="description" content="OSINT- und Lagebild-Software aus Deutschland: AegisSight wertet hunderte offene Quellen automatisiert aus und erstellt strukturierte Echtzeit-Lagebilder mit Faktenprüfung.">
|
||||
<link rel="canonical" href="https://aegis-sight.de/loesungen/osint-lagebild-software/">
|
||||
<link rel="alternate" hreflang="de" href="https://aegis-sight.de/loesungen/osint-lagebild-software/">
|
||||
<link rel="alternate" hreflang="en" href="https://aegis-sight.de/en/solutions/osint-situational-awareness-software/">
|
||||
<link rel="alternate" hreflang="x-default" href="https://aegis-sight.de/loesungen/osint-lagebild-software/">
|
||||
|
||||
<!-- Open Graph -->
|
||||
<meta property="og:type" content="website">
|
||||
<meta property="og:site_name" content="AegisSight">
|
||||
<meta property="og:title" content="OSINT- & Lagebild-Software aus Deutschland | AegisSight">
|
||||
<meta property="og:description" content="OSINT- und Lagebild-Software aus Deutschland: hunderte offene Quellen automatisiert ausgewertet, strukturierte Echtzeit-Lagebilder mit Faktenprüfung.">
|
||||
<meta property="og:url" content="https://aegis-sight.de/loesungen/osint-lagebild-software/">
|
||||
<meta property="og:image" content="https://aegis-sight.de/assets/images/og-image.png">
|
||||
<meta property="og:image:width" content="1200">
|
||||
<meta property="og:image:height" content="630">
|
||||
<meta property="og:locale" content="de_DE">
|
||||
<meta property="og:locale:alternate" content="en_GB">
|
||||
|
||||
<!-- Twitter Card -->
|
||||
<meta name="twitter:card" content="summary_large_image">
|
||||
<meta name="twitter:title" content="OSINT- & Lagebild-Software aus Deutschland | AegisSight">
|
||||
<meta name="twitter:description" content="OSINT- und Lagebild-Software aus Deutschland: hunderte offene Quellen automatisiert ausgewertet, strukturierte Echtzeit-Lagebilder mit Faktenprüfung.">
|
||||
<meta name="twitter:image" content="https://aegis-sight.de/assets/images/og-image.png">
|
||||
|
||||
<script type="application/ld+json">
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "Service",
|
||||
"@id": "https://aegis-sight.de/loesungen/osint-lagebild-software/#service",
|
||||
"name": "OSINT- und Lagebild-Software",
|
||||
"serviceType": "OSINT-Monitoring und Lagebild-Erstellung",
|
||||
"provider": { "@id": "https://aegis-sight.de/#organization" },
|
||||
"areaServed": [
|
||||
{ "@type": "Country", "name": "Deutschland" },
|
||||
{ "@type": "Country", "name": "Österreich" },
|
||||
{ "@type": "Country", "name": "Schweiz" },
|
||||
{ "@type": "AdministrativeArea", "name": "Europäische Union" }
|
||||
],
|
||||
"audience": {
|
||||
"@type": "BusinessAudience",
|
||||
"audienceType": "Behörden, Redaktionen und Sicherheitsdienste"
|
||||
},
|
||||
"description": "OSINT- und Lagebild-Software, die hunderte offene Quellen automatisiert auswertet und daraus strukturierte Echtzeit-Lagebilder mit Quellenbelegen, geografischer Verortung und automatischer Faktenprüfung erzeugt. Vollständig auf Servern in Deutschland betrieben, DSGVO-konform."
|
||||
}
|
||||
</script>
|
||||
<script type="application/ld+json">
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "BreadcrumbList",
|
||||
"itemListElement": [
|
||||
{ "@type": "ListItem", "position": 1, "name": "AegisSight", "item": "https://aegis-sight.de/" },
|
||||
{ "@type": "ListItem", "position": 2, "name": "OSINT- & Lagebild-Software", "item": "https://aegis-sight.de/loesungen/osint-lagebild-software/" }
|
||||
]
|
||||
}
|
||||
</script>
|
||||
<script type="application/ld+json">
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "FAQPage",
|
||||
"inLanguage": "de-DE",
|
||||
"mainEntity": [
|
||||
{
|
||||
"@type": "Question",
|
||||
"name": "Was ist eine OSINT- bzw. Lagebild-Software?",
|
||||
"acceptedAnswer": { "@type": "Answer", "text": "Eine OSINT-Software wertet öffentlich zugängliche Quellen wie Nachrichten, Fachmedien, Behördenmeldungen und Social Media systematisch aus. Eine Lagebild-Software verdichtet diese Auswertung zu einer strukturierten, laufend aktualisierten Zusammenfassung der Faktenlage mit Quellenbelegen, Zeitverlauf und geografischer Verortung. AegisSight vereint beides in einer automatisierten Lösung." }
|
||||
},
|
||||
{
|
||||
"@type": "Question",
|
||||
"name": "Worin unterscheidet sich OSINT-Software von IT-Monitoring-Software?",
|
||||
"acceptedAnswer": { "@type": "Answer", "text": "IT-Monitoring-Software überwacht Server, Netzwerke und Systemverfügbarkeit. OSINT-Software überwacht dagegen öffentliche Informationsquellen, um die Sicherheits- und Informationslage zu beurteilen. AegisSight ist eine OSINT-Lagebild-Software, keine IT-Infrastruktur-Überwachung." }
|
||||
},
|
||||
{
|
||||
"@type": "Question",
|
||||
"name": "Ist die OSINT-Software DSGVO-konform?",
|
||||
"acceptedAnswer": { "@type": "Answer", "text": "Ja. AegisSight wird vollständig auf Servern in Deutschland betrieben, verarbeitet ausschließlich öffentlich zugängliche Quellen und übermittelt keine Daten in Drittländer." }
|
||||
}
|
||||
]
|
||||
}
|
||||
</script>
|
||||
|
||||
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
|
||||
<link rel="apple-touch-icon" href="/assets/images/logos/AegisSightLogo_NavyGold.svg">
|
||||
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">
|
||||
|
||||
<link rel="stylesheet" href="/css/style.css">
|
||||
<link rel="stylesheet" href="/css/lang-switcher.css">
|
||||
<link rel="stylesheet" href="/cookie-consent.css">
|
||||
<style>
|
||||
body { font-family: 'Inter', -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; background: var(--white); margin: 0; }
|
||||
.sol-hero { background: var(--navy); color: #E6ECF5; padding: calc(var(--nav-height) + 64px) 0 64px; }
|
||||
.sol-container { max-width: 880px; margin: 0 auto; padding: 0 24px; }
|
||||
.sol-breadcrumb { font-size: 0.85rem; color: #9FB0C8; margin: 0 0 18px; }
|
||||
.sol-breadcrumb a { color: #9FB0C8; text-decoration: none; }
|
||||
.sol-breadcrumb a:hover { color: var(--gold-light); }
|
||||
.sol-hero h1 { font-size: 2.4rem; font-weight: 700; color: #FFFFFF; margin: 0 0 16px; line-height: 1.2; }
|
||||
.sol-hero .sol-lead { font-size: 1.15rem; line-height: 1.7; color: #C6D2E4; margin: 0 0 28px; }
|
||||
.sol-cta-btn { display: inline-block; background: var(--gold); color: var(--navy); font-weight: 600; text-decoration: none; padding: 13px 28px; border-radius: 8px; transition: background .2s; }
|
||||
.sol-cta-btn:hover { background: var(--gold-light); }
|
||||
.sol-body { padding: 56px 0; }
|
||||
.sol-section { margin-bottom: 44px; }
|
||||
.sol-section:last-child { margin-bottom: 0; }
|
||||
.sol-section h2 { font-size: 1.6rem; font-weight: 700; color: var(--navy); margin: 0 0 16px; padding-bottom: 8px; border-bottom: 2px solid var(--gold); }
|
||||
.sol-section p { margin: 0 0 14px; line-height: 1.75; color: var(--text); font-size: 1rem; }
|
||||
.sol-section strong { color: var(--navy); font-weight: 600; }
|
||||
.feature-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); gap: 18px; margin-top: 8px; }
|
||||
.feature-card { background: var(--base); border: 1px solid var(--gray-100); border-radius: var(--radius-lg); padding: 22px 24px; }
|
||||
.feature-card h3 { font-size: 1.08rem; font-weight: 600; color: var(--navy); margin: 0 0 8px; }
|
||||
.feature-card p { font-size: 0.95rem; margin: 0; color: var(--text-light); line-height: 1.65; }
|
||||
.step-list { counter-reset: step; list-style: none; margin: 0; padding: 0; }
|
||||
.step-list li { position: relative; padding: 0 0 18px 52px; line-height: 1.7; color: var(--text); }
|
||||
.step-list li::before { counter-increment: step; content: counter(step); position: absolute; left: 0; top: 0; width: 34px; height: 34px; background: var(--navy); color: var(--gold); border-radius: 50%; display: flex; align-items: center; justify-content: center; font-weight: 700; font-size: 0.95rem; }
|
||||
.step-list li strong { display: block; color: var(--navy); margin-bottom: 2px; }
|
||||
details.sol-faq { border: 1px solid var(--gray-100); border-radius: 8px; margin-bottom: 10px; padding: 0; background: var(--base); }
|
||||
details.sol-faq summary { padding: 16px 20px; cursor: pointer; font-weight: 600; color: var(--navy); list-style: none; }
|
||||
details.sol-faq summary::-webkit-details-marker { display: none; }
|
||||
details.sol-faq .a { padding: 0 20px 16px; color: var(--text); line-height: 1.7; font-size: 0.97rem; }
|
||||
.sol-related { background: var(--base); border-radius: var(--radius-lg); padding: 28px 30px; margin-top: 8px; }
|
||||
.sol-related h2 { border: none; padding: 0; margin: 0 0 14px; font-size: 1.3rem; }
|
||||
.sol-related a { display: block; color: var(--gold-dark); text-decoration: none; font-weight: 600; padding: 6px 0; }
|
||||
.sol-related a:hover { color: var(--gold); }
|
||||
.sol-final-cta { background: var(--navy); color: #E6ECF5; text-align: center; padding: 48px 24px; border-radius: var(--radius-lg); margin-top: 8px; }
|
||||
.sol-final-cta h2 { color: #FFFFFF; border: none; padding: 0; margin: 0 0 10px; }
|
||||
.sol-final-cta p { color: #C6D2E4; margin: 0 0 22px; }
|
||||
@media (max-width: 768px) {
|
||||
.sol-hero h1 { font-size: 1.85rem; }
|
||||
.sol-container { padding: 0 16px; }
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<!-- Navigation -->
|
||||
<nav class="navbar" id="navbar">
|
||||
<div class="nav-container">
|
||||
<a href="/" class="nav-logo">
|
||||
<img src="/assets/images/logos/Logo+Schrift_Rechts.svg" alt="AegisSight" class="logo-img" width="200" height="40">
|
||||
</a>
|
||||
<ul class="nav-menu">
|
||||
<li><a href="/#features">Funktionen</a></li>
|
||||
<li><a href="/#loesungen">Lösungen</a></li>
|
||||
<li><a href="/#demos">Live-Lagebilder</a></li>
|
||||
<li><a href="/#trust">Über uns</a></li>
|
||||
<li><a href="/#contact">Kontakt</a></li>
|
||||
</ul>
|
||||
<div class="nav-extras">
|
||||
<div class="lang-switcher" role="group" aria-label="Sprache">
|
||||
<span class="lang-active" lang="de" aria-current="true">DE</span>
|
||||
<span class="lang-sep" aria-hidden="true">|</span>
|
||||
<a class="lang-link" href="/en/solutions/osint-situational-awareness-software/" lang="en" hreflang="en" rel="alternate">EN</a>
|
||||
</div>
|
||||
<button class="mobile-menu-toggle" aria-label="Menü öffnen" aria-expanded="false">
|
||||
<span></span><span></span><span></span>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<!-- Mobile Menu -->
|
||||
<div class="mobile-menu" id="mobile-menu" aria-hidden="true">
|
||||
<ul>
|
||||
<li><a href="/#features">Funktionen</a></li>
|
||||
<li><a href="/#loesungen">Lösungen</a></li>
|
||||
<li><a href="/#demos">Live-Lagebilder</a></li>
|
||||
<li><a href="/#trust">Über uns</a></li>
|
||||
<li><a href="/#contact">Kontakt</a></li>
|
||||
</ul>
|
||||
<div class="lang-switcher" role="group" aria-label="Sprache">
|
||||
<span class="lang-active" lang="de" aria-current="true">DE</span>
|
||||
<span class="lang-sep" aria-hidden="true">|</span>
|
||||
<a class="lang-link" href="/en/solutions/osint-situational-awareness-software/" lang="en" hreflang="en" rel="alternate">EN</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mobile-overlay" id="mobile-overlay"></div>
|
||||
|
||||
<main>
|
||||
<header class="sol-hero">
|
||||
<div class="sol-container">
|
||||
<nav class="sol-breadcrumb" aria-label="Brotkrumen">
|
||||
<a href="/">Start</a> › OSINT- & Lagebild-Software
|
||||
</nav>
|
||||
<h1>OSINT- und Lagebild-Software für automatisierte Lageanalyse</h1>
|
||||
<p class="sol-lead">AegisSight Monitor ist eine OSINT-Software aus Deutschland, die hunderte offene Quellen rund um die Uhr auswertet und daraus automatisiert strukturierte Echtzeit-Lagebilder erstellt – mit Quellenbelegen, geografischer Verortung und automatischer Faktenprüfung.</p>
|
||||
<a class="sol-cta-btn" href="/#contact">Zugang anfragen</a>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<div class="sol-body">
|
||||
<div class="sol-container">
|
||||
<section class="sol-section">
|
||||
<h2>Was ist eine OSINT- und Lagebild-Software?</h2>
|
||||
<p>Eine <strong>OSINT-Software</strong> (Open Source Intelligence) wertet öffentlich zugängliche Quellen wie Nachrichtenagenturen, Fachmedien, Behördenmeldungen und Social Media systematisch aus. Eine <strong>Lagebild-Software</strong> verdichtet diese Auswertung zu einer strukturierten, laufend aktualisierten Zusammenfassung der Faktenlage – mit Quellenbelegen, Zeitverlauf und geografischer Verortung.</p>
|
||||
<p>AegisSight vereint beides in einer automatisierten Lösung: Statt Quellen manuell zu sichten, erhalten Analystinnen und Analysten ein fertiges, belegtes Lagebild, das sich kontinuierlich selbst aktualisiert.</p>
|
||||
</section>
|
||||
|
||||
<section class="sol-section">
|
||||
<h2>Vom Rohsignal zum Lagebild – vollautomatisch</h2>
|
||||
<ol class="step-list">
|
||||
<li><strong>Erfassen</strong>Hunderte offene Quellen werden rund um die Uhr eingelesen, Beiträge in dutzenden Sprachen automatisch übersetzt.</li>
|
||||
<li><strong>Analysieren</strong>Meldungen werden aggregiert, dedupliziert, geografisch verortet und jede zentrale Behauptung automatisch gegen unabhängige Quellen geprüft.</li>
|
||||
<li><strong>Berichten</strong>Das Ergebnis ist ein strukturiertes Lagebild mit Zeitverlauf, Quellenbelegen und Karte – aktualisiert alle fünf Minuten.</li>
|
||||
</ol>
|
||||
</section>
|
||||
|
||||
<section class="sol-section">
|
||||
<h2>Funktionen der Lagebild-Software im Überblick</h2>
|
||||
<div class="feature-grid">
|
||||
<div class="feature-card"><h3>Automatisierte Quellenauswertung</h3><p>Hunderte offene Quellen werden kontinuierlich erfasst, aggregiert und dedupliziert.</p></div>
|
||||
<div class="feature-card"><h3>Geografische Verortung</h3><p>Meldungen werden auf einer interaktiven Karte räumlich eingeordnet.</p></div>
|
||||
<div class="feature-card"><h3>Mehrsprachige Auswertung</h3><p>Beiträge in dutzenden Sprachen, darunter Farsi, Arabisch und Hebräisch, werden automatisch übersetzt.</p></div>
|
||||
<div class="feature-card"><h3>Automatische Faktenprüfung</h3><p>Zentrale Behauptungen werden gegen mehrere unabhängige Quellen abgeglichen und transparent bewertet.</p></div>
|
||||
<div class="feature-card"><h3>Strukturierte Lagebilder</h3><p>Faktenlage mit Zeitverlauf, Quellenbelegen und Verortung – in einer übersichtlichen Ansicht.</p></div>
|
||||
<div class="feature-card"><h3>Echtzeit-Aktualisierung</h3><p>Die Lagebilder werden alle fünf Minuten automatisch auf den neuesten Stand gebracht.</p></div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="sol-section">
|
||||
<h2>Für wen sich die Software eignet</h2>
|
||||
<p>AegisSight richtet sich an Organisationen, die belastbare Lagebilder in Echtzeit benötigen: <strong>Behörden</strong> und Krisenstäbe, investigative <strong>Redaktionen</strong> sowie <strong>Sicherheitsdienste</strong>, Werkschutz und Corporate Security. Überall dort, wo manuelle OSINT-Auswertung an Quellenvielfalt, Zeitdruck und Informationsflut scheitert, liefert die Software ein nachvollziehbares, automatisiert gepflegtes Lagebild.</p>
|
||||
</section>
|
||||
|
||||
<section class="sol-section">
|
||||
<h2>Häufige Fragen</h2>
|
||||
<details class="sol-faq"><summary>Worin unterscheidet sich OSINT-Software von IT-Monitoring-Software?</summary><div class="a">IT-Monitoring-Software überwacht Server, Netzwerke und Systemverfügbarkeit. OSINT-Software überwacht dagegen öffentliche Informationsquellen, um die Sicherheits- und Informationslage zu beurteilen. AegisSight ist eine OSINT-Lagebild-Software, keine IT-Infrastruktur-Überwachung.</div></details>
|
||||
<details class="sol-faq"><summary>Ist die OSINT-Software DSGVO-konform?</summary><div class="a">Ja. AegisSight wird vollständig auf Servern in Deutschland betrieben, verarbeitet ausschließlich öffentlich zugängliche Quellen und übermittelt keine Daten in Drittländer.</div></details>
|
||||
<details class="sol-faq"><summary>Wie aktuell sind die Lagebilder?</summary><div class="a">Die Lagebilder werden alle fünf Minuten automatisch aktualisiert, sodass die Faktenlage nahezu in Echtzeit verfügbar ist.</div></details>
|
||||
</section>
|
||||
|
||||
<section class="sol-section sol-related-wrap">
|
||||
<div class="sol-related">
|
||||
<h2>Weitere Lösungen</h2>
|
||||
<a href="/loesungen/desinformationsmonitoring/">Desinformationsmonitoring & FIMI ›</a>
|
||||
<a href="/loesungen/social-media-monitoring-behoerden/">Social-Media- & Krisenmonitoring für Behörden ›</a>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="sol-section">
|
||||
<div class="sol-final-cta">
|
||||
<h2>Lagebilder in Echtzeit – statt manueller Recherche</h2>
|
||||
<p>Pilotzugänge für qualifizierte Organisationen sind möglich.</p>
|
||||
<a class="sol-cta-btn" href="/#contact">Kontakt aufnehmen</a>
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
|
||||
<!-- Footer -->
|
||||
<footer class="footer">
|
||||
<div class="container">
|
||||
<div class="footer-content">
|
||||
<div class="footer-info">
|
||||
<p class="footer-company">AegisSight UG (haftungsbeschränkt)</p>
|
||||
<p>Gladbacher Straße 3-5, 40764 Langenfeld</p>
|
||||
</div>
|
||||
<div class="footer-links">
|
||||
<a href="/impressum.html">Impressum</a>
|
||||
<a href="/datenschutz.html">Datenschutz</a>
|
||||
<a href="#" id="cookie-settings-link">Cookie-Einstellungen</a>
|
||||
</div>
|
||||
</div>
|
||||
<p class="footer-copyright">© <span id="footer-year">2026</span> AegisSight UG (haftungsbeschränkt). Alle Rechte vorbehalten.</p>
|
||||
</div>
|
||||
</footer>
|
||||
<script>document.getElementById('footer-year').textContent=new Date().getFullYear();</script>
|
||||
<script src="/js/app.js"></script>
|
||||
<script src="/cookie-consent.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
279
loesungen/social-media-monitoring-behoerden/index.html
Normale Datei
@@ -0,0 +1,279 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="de">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<meta name="robots" content="index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1">
|
||||
<meta name="theme-color" content="#0A1832">
|
||||
<meta name="author" content="AegisSight UG">
|
||||
<title>Social-Media- & Krisenmonitoring für Behörden | AegisSight</title>
|
||||
<meta name="description" content="Social-Media- und Krisenmonitoring für Behörden: AegisSight liefert Krisenstäben ein automatisch aktualisiertes Lagebild aus offenen Quellen – DSGVO-konform, mit Faktenprüfung.">
|
||||
<link rel="canonical" href="https://aegis-sight.de/loesungen/social-media-monitoring-behoerden/">
|
||||
<link rel="alternate" hreflang="de" href="https://aegis-sight.de/loesungen/social-media-monitoring-behoerden/">
|
||||
<link rel="alternate" hreflang="en" href="https://aegis-sight.de/en/solutions/social-media-monitoring-government/">
|
||||
<link rel="alternate" hreflang="x-default" href="https://aegis-sight.de/loesungen/social-media-monitoring-behoerden/">
|
||||
|
||||
<!-- Open Graph -->
|
||||
<meta property="og:type" content="website">
|
||||
<meta property="og:site_name" content="AegisSight">
|
||||
<meta property="og:title" content="Social-Media- & Krisenmonitoring für Behörden | AegisSight">
|
||||
<meta property="og:description" content="Automatisch aktualisiertes Lagebild aus Social Media und offenen Quellen für Krisenstäbe – DSGVO-konform, mit Faktenprüfung und Frühwarnung.">
|
||||
<meta property="og:url" content="https://aegis-sight.de/loesungen/social-media-monitoring-behoerden/">
|
||||
<meta property="og:image" content="https://aegis-sight.de/assets/images/og-image.png">
|
||||
<meta property="og:image:width" content="1200">
|
||||
<meta property="og:image:height" content="630">
|
||||
<meta property="og:locale" content="de_DE">
|
||||
<meta property="og:locale:alternate" content="en_GB">
|
||||
|
||||
<!-- Twitter Card -->
|
||||
<meta name="twitter:card" content="summary_large_image">
|
||||
<meta name="twitter:title" content="Social-Media- & Krisenmonitoring für Behörden | AegisSight">
|
||||
<meta name="twitter:description" content="Automatisch aktualisiertes Lagebild aus Social Media und offenen Quellen für Krisenstäbe – DSGVO-konform, mit Faktenprüfung und Frühwarnung.">
|
||||
<meta name="twitter:image" content="https://aegis-sight.de/assets/images/og-image.png">
|
||||
|
||||
<script type="application/ld+json">
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "Service",
|
||||
"@id": "https://aegis-sight.de/loesungen/social-media-monitoring-behoerden/#service",
|
||||
"name": "Social-Media- und Krisenmonitoring für Behörden",
|
||||
"serviceType": "Social-Media-Monitoring und Krisenmonitoring",
|
||||
"provider": { "@id": "https://aegis-sight.de/#organization" },
|
||||
"areaServed": [
|
||||
{ "@type": "Country", "name": "Deutschland" },
|
||||
{ "@type": "Country", "name": "Österreich" },
|
||||
{ "@type": "Country", "name": "Schweiz" },
|
||||
{ "@type": "AdministrativeArea", "name": "Europäische Union" }
|
||||
],
|
||||
"audience": {
|
||||
"@type": "BusinessAudience",
|
||||
"audienceType": "Behörden, Krisenstäbe, Bevölkerungsschutz und Corporate Security"
|
||||
},
|
||||
"description": "Social-Media- und Krisenmonitoring auf OSINT-Basis: Krisenstäbe und Sicherheitsbehörden erhalten ein automatisch aktualisiertes Echtzeit-Lagebild aus Social Media und weiteren offenen Quellen, mit automatischer Faktenprüfung und geografischer Verortung. Vollständig auf Servern in Deutschland betrieben, DSGVO-konform."
|
||||
}
|
||||
</script>
|
||||
<script type="application/ld+json">
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "BreadcrumbList",
|
||||
"itemListElement": [
|
||||
{ "@type": "ListItem", "position": 1, "name": "AegisSight", "item": "https://aegis-sight.de/" },
|
||||
{ "@type": "ListItem", "position": 2, "name": "Social-Media- & Krisenmonitoring für Behörden", "item": "https://aegis-sight.de/loesungen/social-media-monitoring-behoerden/" }
|
||||
]
|
||||
}
|
||||
</script>
|
||||
<script type="application/ld+json">
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "FAQPage",
|
||||
"inLanguage": "de-DE",
|
||||
"mainEntity": [
|
||||
{
|
||||
"@type": "Question",
|
||||
"name": "Was ist Social-Media-Monitoring für Behörden?",
|
||||
"acceptedAnswer": { "@type": "Answer", "text": "Social-Media-Monitoring für Behörden ist die strukturierte, fortlaufende Auswertung öffentlicher Social-Media-Inhalte zur Lagebeurteilung, etwa für Krisenstäbe oder Sicherheitsbehörden. AegisSight integriert Social-Media-Quellen in seine OSINT-Lagebilder und prüft zentrale Behauptungen automatisch gegen unabhängige Quellen." }
|
||||
},
|
||||
{
|
||||
"@type": "Question",
|
||||
"name": "Ist das Monitoring DSGVO-konform?",
|
||||
"acceptedAnswer": { "@type": "Answer", "text": "Ja. AegisSight wird vollständig auf Servern in Deutschland betrieben, verarbeitet ausschließlich öffentlich zugängliche Quellen und übermittelt keine Daten in Drittländer." }
|
||||
},
|
||||
{
|
||||
"@type": "Question",
|
||||
"name": "Eignet sich AegisSight für Krisenstäbe und Frühwarnung?",
|
||||
"acceptedAnswer": { "@type": "Answer", "text": "Ja. Die Lagebilder werden alle fünf Minuten automatisch aktualisiert. Krisenstäbe erhalten so ein nahezu in Echtzeit gepflegtes, belegtes Lagebild, um sich entwickelnde Lagen früh zu erkennen." }
|
||||
}
|
||||
]
|
||||
}
|
||||
</script>
|
||||
|
||||
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
|
||||
<link rel="apple-touch-icon" href="/assets/images/logos/AegisSightLogo_NavyGold.svg">
|
||||
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">
|
||||
|
||||
<link rel="stylesheet" href="/css/style.css">
|
||||
<link rel="stylesheet" href="/css/lang-switcher.css">
|
||||
<link rel="stylesheet" href="/cookie-consent.css">
|
||||
<style>
|
||||
body { font-family: 'Inter', -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; background: var(--white); margin: 0; }
|
||||
.sol-hero { background: var(--navy); color: #E6ECF5; padding: calc(var(--nav-height) + 64px) 0 64px; }
|
||||
.sol-container { max-width: 880px; margin: 0 auto; padding: 0 24px; }
|
||||
.sol-breadcrumb { font-size: 0.85rem; color: #9FB0C8; margin: 0 0 18px; }
|
||||
.sol-breadcrumb a { color: #9FB0C8; text-decoration: none; }
|
||||
.sol-breadcrumb a:hover { color: var(--gold-light); }
|
||||
.sol-hero h1 { font-size: 2.4rem; font-weight: 700; color: #FFFFFF; margin: 0 0 16px; line-height: 1.2; }
|
||||
.sol-hero .sol-lead { font-size: 1.15rem; line-height: 1.7; color: #C6D2E4; margin: 0 0 28px; }
|
||||
.sol-cta-btn { display: inline-block; background: var(--gold); color: var(--navy); font-weight: 600; text-decoration: none; padding: 13px 28px; border-radius: 8px; transition: background .2s; }
|
||||
.sol-cta-btn:hover { background: var(--gold-light); }
|
||||
.sol-body { padding: 56px 0; }
|
||||
.sol-section { margin-bottom: 44px; }
|
||||
.sol-section:last-child { margin-bottom: 0; }
|
||||
.sol-section h2 { font-size: 1.6rem; font-weight: 700; color: var(--navy); margin: 0 0 16px; padding-bottom: 8px; border-bottom: 2px solid var(--gold); }
|
||||
.sol-section p { margin: 0 0 14px; line-height: 1.75; color: var(--text); font-size: 1rem; }
|
||||
.sol-section strong { color: var(--navy); font-weight: 600; }
|
||||
.feature-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); gap: 18px; margin-top: 8px; }
|
||||
.feature-card { background: var(--base); border: 1px solid var(--gray-100); border-radius: var(--radius-lg); padding: 22px 24px; }
|
||||
.feature-card h3 { font-size: 1.08rem; font-weight: 600; color: var(--navy); margin: 0 0 8px; }
|
||||
.feature-card p { font-size: 0.95rem; margin: 0; color: var(--text-light); line-height: 1.65; }
|
||||
.step-list { counter-reset: step; list-style: none; margin: 0; padding: 0; }
|
||||
.step-list li { position: relative; padding: 0 0 18px 52px; line-height: 1.7; color: var(--text); }
|
||||
.step-list li::before { counter-increment: step; content: counter(step); position: absolute; left: 0; top: 0; width: 34px; height: 34px; background: var(--navy); color: var(--gold); border-radius: 50%; display: flex; align-items: center; justify-content: center; font-weight: 700; font-size: 0.95rem; }
|
||||
.step-list li strong { display: block; color: var(--navy); margin-bottom: 2px; }
|
||||
details.sol-faq { border: 1px solid var(--gray-100); border-radius: 8px; margin-bottom: 10px; padding: 0; background: var(--base); }
|
||||
details.sol-faq summary { padding: 16px 20px; cursor: pointer; font-weight: 600; color: var(--navy); list-style: none; }
|
||||
details.sol-faq summary::-webkit-details-marker { display: none; }
|
||||
details.sol-faq .a { padding: 0 20px 16px; color: var(--text); line-height: 1.7; font-size: 0.97rem; }
|
||||
.sol-related { background: var(--base); border-radius: var(--radius-lg); padding: 28px 30px; margin-top: 8px; }
|
||||
.sol-related h2 { border: none; padding: 0; margin: 0 0 14px; font-size: 1.3rem; }
|
||||
.sol-related a { display: block; color: var(--gold-dark); text-decoration: none; font-weight: 600; padding: 6px 0; }
|
||||
.sol-related a:hover { color: var(--gold); }
|
||||
.sol-final-cta { background: var(--navy); color: #E6ECF5; text-align: center; padding: 48px 24px; border-radius: var(--radius-lg); margin-top: 8px; }
|
||||
.sol-final-cta h2 { color: #FFFFFF; border: none; padding: 0; margin: 0 0 10px; }
|
||||
.sol-final-cta p { color: #C6D2E4; margin: 0 0 22px; }
|
||||
@media (max-width: 768px) {
|
||||
.sol-hero h1 { font-size: 1.85rem; }
|
||||
.sol-container { padding: 0 16px; }
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<!-- Navigation -->
|
||||
<nav class="navbar" id="navbar">
|
||||
<div class="nav-container">
|
||||
<a href="/" class="nav-logo">
|
||||
<img src="/assets/images/logos/Logo+Schrift_Rechts.svg" alt="AegisSight" class="logo-img" width="200" height="40">
|
||||
</a>
|
||||
<ul class="nav-menu">
|
||||
<li><a href="/#features">Funktionen</a></li>
|
||||
<li><a href="/#loesungen">Lösungen</a></li>
|
||||
<li><a href="/#demos">Live-Lagebilder</a></li>
|
||||
<li><a href="/#trust">Über uns</a></li>
|
||||
<li><a href="/#contact">Kontakt</a></li>
|
||||
</ul>
|
||||
<div class="nav-extras">
|
||||
<div class="lang-switcher" role="group" aria-label="Sprache">
|
||||
<span class="lang-active" lang="de" aria-current="true">DE</span>
|
||||
<span class="lang-sep" aria-hidden="true">|</span>
|
||||
<a class="lang-link" href="/en/solutions/social-media-monitoring-government/" lang="en" hreflang="en" rel="alternate">EN</a>
|
||||
</div>
|
||||
<button class="mobile-menu-toggle" aria-label="Menü öffnen" aria-expanded="false">
|
||||
<span></span><span></span><span></span>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<!-- Mobile Menu -->
|
||||
<div class="mobile-menu" id="mobile-menu" aria-hidden="true">
|
||||
<ul>
|
||||
<li><a href="/#features">Funktionen</a></li>
|
||||
<li><a href="/#loesungen">Lösungen</a></li>
|
||||
<li><a href="/#demos">Live-Lagebilder</a></li>
|
||||
<li><a href="/#trust">Über uns</a></li>
|
||||
<li><a href="/#contact">Kontakt</a></li>
|
||||
</ul>
|
||||
<div class="lang-switcher" role="group" aria-label="Sprache">
|
||||
<span class="lang-active" lang="de" aria-current="true">DE</span>
|
||||
<span class="lang-sep" aria-hidden="true">|</span>
|
||||
<a class="lang-link" href="/en/solutions/social-media-monitoring-government/" lang="en" hreflang="en" rel="alternate">EN</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mobile-overlay" id="mobile-overlay"></div>
|
||||
|
||||
<main>
|
||||
<header class="sol-hero">
|
||||
<div class="sol-container">
|
||||
<nav class="sol-breadcrumb" aria-label="Brotkrumen">
|
||||
<a href="/">Start</a> › Social-Media- & Krisenmonitoring für Behörden
|
||||
</nav>
|
||||
<h1>Social-Media- und Krisenmonitoring für Behörden</h1>
|
||||
<p class="sol-lead">AegisSight liefert Behörden und Krisenstäben ein automatisch aktualisiertes Lagebild aus Social Media und weiteren offenen Quellen – DSGVO-konform, mit automatischer Faktenprüfung und geografischer Verortung.</p>
|
||||
<a class="sol-cta-btn" href="/#contact">Zugang anfragen</a>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<div class="sol-body">
|
||||
<div class="sol-container">
|
||||
<section class="sol-section">
|
||||
<h2>Was ist Social-Media- und Krisenmonitoring für Behörden?</h2>
|
||||
<p><strong>Social-Media-Monitoring für Behörden</strong> ist die strukturierte, fortlaufende Auswertung öffentlicher Social-Media-Inhalte zur Lagebeurteilung. <strong>Krisenmonitoring</strong> beobachtet eine Lage in Echtzeit, um Krisenstäbe und Entscheider mit einem aktuellen, belegten Lagebild zu versorgen.</p>
|
||||
<p>AegisSight verbindet beides: Social-Media-Quellen werden gemeinsam mit Nachrichten, Fachmedien und Behördenmeldungen ausgewertet und zu einem nachvollziehbaren Lagebild verdichtet.</p>
|
||||
</section>
|
||||
|
||||
<section class="sol-section">
|
||||
<h2>Wie AegisSight Krisenstäbe versorgt</h2>
|
||||
<ol class="step-list">
|
||||
<li><strong>Erfassen</strong>Öffentliche Social-Media-Beiträge und hunderte weitere offene Quellen werden rund um die Uhr eingelesen und übersetzt.</li>
|
||||
<li><strong>Prüfen</strong>Zentrale Behauptungen werden automatisch gegen unabhängige Quellen abgeglichen – Gerüchte und Falschmeldungen werden so früh erkennbar.</li>
|
||||
<li><strong>Versorgen</strong>Krisenstäbe erhalten ein alle fünf Minuten aktualisiertes Lagebild mit Karte, Zeitverlauf und Quellenbelegen.</li>
|
||||
</ol>
|
||||
</section>
|
||||
|
||||
<section class="sol-section">
|
||||
<h2>Funktionen im Überblick</h2>
|
||||
<div class="feature-grid">
|
||||
<div class="feature-card"><h3>Social-Media-Auswertung</h3><p>Öffentliche Social-Media-Quellen fließen in das Lagebild ein.</p></div>
|
||||
<div class="feature-card"><h3>Echtzeit-Lagebild</h3><p>Alle fünf Minuten automatisch aktualisiert – Grundlage für schnelle Entscheidungen.</p></div>
|
||||
<div class="feature-card"><h3>Automatische Faktenprüfung</h3><p>Gerüchte und Falschmeldungen werden gegen unabhängige Quellen abgeglichen.</p></div>
|
||||
<div class="feature-card"><h3>Geografische Verortung</h3><p>Meldungen werden auf einer interaktiven Karte räumlich eingeordnet.</p></div>
|
||||
<div class="feature-card"><h3>DSGVO-konform</h3><p>Betrieb auf Servern in Deutschland, ausschließlich öffentliche Quellen.</p></div>
|
||||
<div class="feature-card"><h3>Mehrsprachige Auswertung</h3><p>Beiträge in dutzenden Sprachen werden automatisch übersetzt.</p></div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="sol-section">
|
||||
<h2>Für wen sich das Monitoring eignet</h2>
|
||||
<p>Die Lösung richtet sich an <strong>Sicherheitsbehörden</strong> und Krisenstäbe, an den <strong>Bevölkerungsschutz</strong> sowie an <strong>Werkschutz</strong> und <strong>Corporate Security</strong> – überall dort, wo sich entwickelnde Lagen früh erkannt und belastbar eingeordnet werden müssen.</p>
|
||||
</section>
|
||||
|
||||
<section class="sol-section">
|
||||
<h2>Häufige Fragen</h2>
|
||||
<details class="sol-faq"><summary>Was ist Social-Media-Monitoring für Behörden?</summary><div class="a">Social-Media-Monitoring für Behörden ist die strukturierte, fortlaufende Auswertung öffentlicher Social-Media-Inhalte zur Lagebeurteilung, etwa für Krisenstäbe oder Sicherheitsbehörden. AegisSight integriert Social-Media-Quellen in seine OSINT-Lagebilder und prüft zentrale Behauptungen automatisch gegen unabhängige Quellen.</div></details>
|
||||
<details class="sol-faq"><summary>Ist das Monitoring DSGVO-konform?</summary><div class="a">Ja. AegisSight wird vollständig auf Servern in Deutschland betrieben, verarbeitet ausschließlich öffentlich zugängliche Quellen und übermittelt keine Daten in Drittländer.</div></details>
|
||||
<details class="sol-faq"><summary>Eignet sich AegisSight für Krisenstäbe und Frühwarnung?</summary><div class="a">Ja. Die Lagebilder werden alle fünf Minuten automatisch aktualisiert. Krisenstäbe erhalten so ein nahezu in Echtzeit gepflegtes, belegtes Lagebild, um sich entwickelnde Lagen früh zu erkennen.</div></details>
|
||||
</section>
|
||||
|
||||
<section class="sol-section sol-related-wrap">
|
||||
<div class="sol-related">
|
||||
<h2>Weitere Lösungen</h2>
|
||||
<a href="/loesungen/osint-lagebild-software/">OSINT- & Lagebild-Software ›</a>
|
||||
<a href="/loesungen/desinformationsmonitoring/">Desinformationsmonitoring & FIMI ›</a>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="sol-section">
|
||||
<div class="sol-final-cta">
|
||||
<h2>Lagebild für den Krisenstab – in Echtzeit</h2>
|
||||
<p>Pilotzugänge für qualifizierte Organisationen sind möglich.</p>
|
||||
<a class="sol-cta-btn" href="/#contact">Kontakt aufnehmen</a>
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
|
||||
<!-- Footer -->
|
||||
<footer class="footer">
|
||||
<div class="container">
|
||||
<div class="footer-content">
|
||||
<div class="footer-info">
|
||||
<p class="footer-company">AegisSight UG (haftungsbeschränkt)</p>
|
||||
<p>Gladbacher Straße 3-5, 40764 Langenfeld</p>
|
||||
</div>
|
||||
<div class="footer-links">
|
||||
<a href="/impressum.html">Impressum</a>
|
||||
<a href="/datenschutz.html">Datenschutz</a>
|
||||
<a href="#" id="cookie-settings-link">Cookie-Einstellungen</a>
|
||||
</div>
|
||||
</div>
|
||||
<p class="footer-copyright">© <span id="footer-year">2026</span> AegisSight UG (haftungsbeschränkt). Alle Rechte vorbehalten.</p>
|
||||
</div>
|
||||
</footer>
|
||||
<script>document.getElementById('footer-year').textContent=new Date().getFullYear();</script>
|
||||
<script src="/js/app.js"></script>
|
||||
<script src="/cookie-consent.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
178
robots.txt
@@ -1,94 +1,23 @@
|
||||
# robots.txt for IntelSight UG
|
||||
# Block ALL web crawlers and bots from the entire site
|
||||
# robots.txt - AegisSight UG
|
||||
# Crawling allgemein erlaubt, ausser API/interne Pfade
|
||||
# Keine Trainingsdaten-Verwendung durch AI-Crawler (Training-Bots geblockt)
|
||||
# Live-Search-AI-Bots (OAI-SearchBot, ChatGPT-User, ClaudeBot, PerplexityBot) sind erlaubt
|
||||
|
||||
# Block all bots
|
||||
User-agent: *
|
||||
Disallow: /
|
||||
Crawl-delay: 86400
|
||||
Allow: /
|
||||
Disallow: /api/
|
||||
Disallow: /_archiv/
|
||||
Disallow: /insights/
|
||||
|
||||
# Specifically block major search engines
|
||||
User-agent: Googlebot
|
||||
Disallow: /
|
||||
# Sitemap
|
||||
Sitemap: https://aegis-sight.de/sitemap.xml
|
||||
|
||||
User-agent: Bingbot
|
||||
Disallow: /
|
||||
|
||||
User-agent: Slurp
|
||||
Disallow: /
|
||||
|
||||
User-agent: DuckDuckBot
|
||||
Disallow: /
|
||||
|
||||
User-agent: Baiduspider
|
||||
Disallow: /
|
||||
|
||||
User-agent: YandexBot
|
||||
Disallow: /
|
||||
|
||||
# Block social media crawlers
|
||||
User-agent: facebookexternalhit
|
||||
Disallow: /
|
||||
|
||||
User-agent: Twitterbot
|
||||
Disallow: /
|
||||
|
||||
User-agent: LinkedInBot
|
||||
Disallow: /
|
||||
|
||||
User-agent: WhatsApp
|
||||
Disallow: /
|
||||
|
||||
User-agent: TelegramBot
|
||||
Disallow: /
|
||||
|
||||
# Block SEO and analysis bots
|
||||
User-agent: AhrefsBot
|
||||
Disallow: /
|
||||
|
||||
User-agent: SemrushBot
|
||||
Disallow: /
|
||||
|
||||
User-agent: DotBot
|
||||
Disallow: /
|
||||
|
||||
User-agent: MJ12bot
|
||||
Disallow: /
|
||||
|
||||
User-agent: SEOkicks-Robot
|
||||
Disallow: /
|
||||
|
||||
User-agent: SeznamBot
|
||||
Disallow: /
|
||||
|
||||
User-agent: MauiBot
|
||||
Disallow: /
|
||||
|
||||
User-agent: Majestic-12
|
||||
Disallow: /
|
||||
|
||||
User-agent: Majestic-SEO
|
||||
Disallow: /
|
||||
|
||||
# Block archiving bots
|
||||
User-agent: ia_archiver
|
||||
Disallow: /
|
||||
|
||||
User-agent: Wayback Machine
|
||||
Disallow: /
|
||||
|
||||
User-agent: SiteSnagger
|
||||
Disallow: /
|
||||
|
||||
User-agent: WebCopier
|
||||
Disallow: /
|
||||
|
||||
# Block AI/ML crawlers
|
||||
# ----------------------------------------------------------------------
|
||||
# AI-Training-Crawler -- BLOCKED (kein Training auf unseren Inhalten)
|
||||
# ----------------------------------------------------------------------
|
||||
User-agent: GPTBot
|
||||
Disallow: /
|
||||
|
||||
User-agent: ChatGPT-User
|
||||
Disallow: /
|
||||
|
||||
User-agent: CCBot
|
||||
Disallow: /
|
||||
|
||||
@@ -98,15 +27,86 @@ Disallow: /
|
||||
User-agent: Claude-Web
|
||||
Disallow: /
|
||||
|
||||
# Block download managers
|
||||
User-agent: wget
|
||||
User-agent: Google-Extended
|
||||
Disallow: /
|
||||
|
||||
User-agent: curl
|
||||
User-agent: Applebot-Extended
|
||||
Disallow: /
|
||||
|
||||
User-agent: Meta-ExternalAgent
|
||||
Disallow: /
|
||||
|
||||
User-agent: Bytespider
|
||||
Disallow: /
|
||||
|
||||
User-agent: cohere-ai
|
||||
Disallow: /
|
||||
|
||||
User-agent: FacebookBot
|
||||
Disallow: /
|
||||
|
||||
User-agent: ImagesiftBot
|
||||
Disallow: /
|
||||
|
||||
User-agent: Diffbot
|
||||
Disallow: /
|
||||
|
||||
User-agent: Omgilibot
|
||||
Disallow: /
|
||||
|
||||
# ----------------------------------------------------------------------
|
||||
# AI-Live-Search-Crawler -- ALLOWED (Sichtbarkeit in KI-Antworten)
|
||||
# OAI-SearchBot, ChatGPT-User, ClaudeBot, PerplexityBot werden NICHT
|
||||
# blockiert. Sie crawlen fuer Live-Antworten, nicht fuer Training.
|
||||
# ----------------------------------------------------------------------
|
||||
|
||||
# ----------------------------------------------------------------------
|
||||
# Archiv-Bots
|
||||
# ----------------------------------------------------------------------
|
||||
User-agent: ia_archiver
|
||||
Disallow: /
|
||||
|
||||
User-agent: archive.org_bot
|
||||
Disallow: /
|
||||
|
||||
# ----------------------------------------------------------------------
|
||||
# SEO-/Spam-Crawler
|
||||
# ----------------------------------------------------------------------
|
||||
User-agent: AhrefsBot
|
||||
Disallow: /
|
||||
|
||||
User-agent: SemrushBot
|
||||
Disallow: /
|
||||
|
||||
User-agent: MJ12bot
|
||||
Disallow: /
|
||||
|
||||
User-agent: DotBot
|
||||
Disallow: /
|
||||
|
||||
User-agent: SEOkicks-Robot
|
||||
Disallow: /
|
||||
|
||||
User-agent: MauiBot
|
||||
Disallow: /
|
||||
|
||||
User-agent: Majestic-12
|
||||
Disallow: /
|
||||
|
||||
User-agent: BLEXBot
|
||||
Disallow: /
|
||||
|
||||
User-agent: SerendeputyBot
|
||||
Disallow: /
|
||||
|
||||
# ----------------------------------------------------------------------
|
||||
# Download-Manager
|
||||
# ----------------------------------------------------------------------
|
||||
User-agent: HTTrack
|
||||
Disallow: /
|
||||
|
||||
# No sitemap provided
|
||||
# No crawl permissions granted
|
||||
User-agent: SiteSnagger
|
||||
Disallow: /
|
||||
|
||||
User-agent: WebCopier
|
||||
Disallow: /
|
||||
|
||||
689
script.js
@@ -1,689 +0,0 @@
|
||||
// Particle Canvas Animation
|
||||
const canvas = document.getElementById('particleCanvas');
|
||||
const ctx = canvas.getContext('2d');
|
||||
|
||||
canvas.width = window.innerWidth;
|
||||
canvas.height = window.innerHeight;
|
||||
|
||||
const particles = [];
|
||||
const particleCount = 100;
|
||||
|
||||
class Particle {
|
||||
constructor() {
|
||||
this.x = Math.random() * canvas.width;
|
||||
this.y = Math.random() * canvas.height;
|
||||
this.size = Math.random() * 3 + 1;
|
||||
this.speedX = Math.random() * 3 - 1.5;
|
||||
this.speedY = Math.random() * 3 - 1.5;
|
||||
this.opacity = Math.random() * 0.5 + 0.2;
|
||||
}
|
||||
|
||||
update() {
|
||||
this.x += this.speedX;
|
||||
this.y += this.speedY;
|
||||
|
||||
if (this.x > canvas.width) this.x = 0;
|
||||
else if (this.x < 0) this.x = canvas.width;
|
||||
|
||||
if (this.y > canvas.height) this.y = 0;
|
||||
else if (this.y < 0) this.y = canvas.height;
|
||||
}
|
||||
|
||||
draw() {
|
||||
ctx.fillStyle = `rgba(0, 212, 255, ${this.opacity})`;
|
||||
ctx.beginPath();
|
||||
ctx.arc(this.x, this.y, this.size, 0, Math.PI * 2);
|
||||
ctx.fill();
|
||||
}
|
||||
}
|
||||
|
||||
function init() {
|
||||
for (let i = 0; i < particleCount; i++) {
|
||||
particles.push(new Particle());
|
||||
}
|
||||
}
|
||||
|
||||
function animate() {
|
||||
ctx.clearRect(0, 0, canvas.width, canvas.height);
|
||||
|
||||
for (let i = 0; i < particles.length; i++) {
|
||||
particles[i].update();
|
||||
particles[i].draw();
|
||||
}
|
||||
|
||||
connectParticles();
|
||||
requestAnimationFrame(animate);
|
||||
}
|
||||
|
||||
function connectParticles() {
|
||||
for (let a = 0; a < particles.length; a++) {
|
||||
for (let b = a; b < particles.length; b++) {
|
||||
const distance = Math.sqrt(
|
||||
Math.pow(particles[a].x - particles[b].x, 2) +
|
||||
Math.pow(particles[a].y - particles[b].y, 2)
|
||||
);
|
||||
|
||||
if (distance < 100) {
|
||||
ctx.strokeStyle = `rgba(0, 212, 255, ${0.2 * (1 - distance / 100)})`;
|
||||
ctx.lineWidth = 1;
|
||||
ctx.beginPath();
|
||||
ctx.moveTo(particles[a].x, particles[a].y);
|
||||
ctx.lineTo(particles[b].x, particles[b].y);
|
||||
ctx.stroke();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
init();
|
||||
animate();
|
||||
|
||||
// Resize canvas
|
||||
window.addEventListener('resize', () => {
|
||||
canvas.width = window.innerWidth;
|
||||
canvas.height = window.innerHeight;
|
||||
});
|
||||
|
||||
// Navbar scroll effect - DEAKTIVIERT
|
||||
// const navbar = document.querySelector('.navbar');
|
||||
// window.addEventListener('scroll', () => {
|
||||
// if (window.scrollY > 50) {
|
||||
// navbar.classList.add('scrolled');
|
||||
// } else {
|
||||
// navbar.classList.remove('scrolled');
|
||||
// }
|
||||
// });
|
||||
|
||||
// Smooth scrolling
|
||||
document.querySelectorAll('a[href^="#"]').forEach(anchor => {
|
||||
anchor.addEventListener('click', function (e) {
|
||||
e.preventDefault();
|
||||
const target = document.querySelector(this.getAttribute('href'));
|
||||
if (target) {
|
||||
target.scrollIntoView({
|
||||
behavior: 'smooth',
|
||||
block: 'start'
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
// Interactive Icon Animation
|
||||
const icon = document.getElementById('interactiveIcon');
|
||||
if (icon) {
|
||||
let mouseX = 0;
|
||||
let mouseY = 0;
|
||||
|
||||
document.addEventListener('mousemove', (e) => {
|
||||
const rect = icon.getBoundingClientRect();
|
||||
const centerX = rect.left + rect.width / 2;
|
||||
const centerY = rect.top + rect.height / 2;
|
||||
|
||||
mouseX = (e.clientX - centerX) / 20;
|
||||
mouseY = (e.clientY - centerY) / 20;
|
||||
|
||||
icon.style.transform = `perspective(1000px) rotateY(${mouseX}deg) rotateX(${-mouseY}deg)`;
|
||||
});
|
||||
}
|
||||
|
||||
// Trust Indicators Counter Animation
|
||||
const counters = document.querySelectorAll('.indicator-value');
|
||||
const speed = 200;
|
||||
|
||||
const animateCounter = (counter) => {
|
||||
const target = +counter.getAttribute('data-target');
|
||||
const increment = target / speed;
|
||||
|
||||
const updateCounter = () => {
|
||||
const current = +counter.innerText.replace('%', '').replace('+', '').replace('/7', '');
|
||||
|
||||
if (current < target) {
|
||||
counter.innerText = Math.ceil(current + increment);
|
||||
setTimeout(updateCounter, 10);
|
||||
} else {
|
||||
if (counter.getAttribute('data-target') === '99.9') {
|
||||
counter.innerText = target + '%';
|
||||
} else if (counter.getAttribute('data-target') === '500') {
|
||||
counter.innerText = target + '+';
|
||||
} else if (counter.getAttribute('data-target') === '24') {
|
||||
counter.innerText = target + '/7';
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
updateCounter();
|
||||
};
|
||||
|
||||
// Intersection Observer for animations
|
||||
const observerOptions = {
|
||||
threshold: 0.3,
|
||||
rootMargin: '0px'
|
||||
};
|
||||
|
||||
const observer = new IntersectionObserver((entries) => {
|
||||
entries.forEach(entry => {
|
||||
if (entry.isIntersecting) {
|
||||
// Animate counters
|
||||
if (entry.target.classList.contains('trust-indicators')) {
|
||||
counters.forEach(counter => animateCounter(counter));
|
||||
observer.unobserve(entry.target);
|
||||
}
|
||||
|
||||
// Animate timeline items with new effect
|
||||
if (entry.target.classList.contains('timeline')) {
|
||||
const items = entry.target.querySelectorAll('.timeline-item');
|
||||
items.forEach((item, index) => {
|
||||
setTimeout(() => {
|
||||
item.classList.add('visible');
|
||||
}, index * 300);
|
||||
});
|
||||
observer.unobserve(entry.target);
|
||||
}
|
||||
|
||||
// Animate feature nodes
|
||||
if (entry.target.classList.contains('feature-nodes')) {
|
||||
const nodes = entry.target.querySelectorAll('.node');
|
||||
nodes.forEach((node, index) => {
|
||||
setTimeout(() => {
|
||||
node.style.opacity = '1';
|
||||
node.style.transform = 'translateY(0)';
|
||||
}, index * 150);
|
||||
});
|
||||
observer.unobserve(entry.target);
|
||||
}
|
||||
}
|
||||
});
|
||||
}, observerOptions);
|
||||
|
||||
// Observe elements
|
||||
document.querySelector('.trust-indicators').style.opacity = '0';
|
||||
observer.observe(document.querySelector('.trust-indicators'));
|
||||
observer.observe(document.querySelector('.timeline'));
|
||||
|
||||
// Set initial states for feature nodes
|
||||
document.querySelectorAll('.node').forEach(node => {
|
||||
node.style.opacity = '0';
|
||||
node.style.transform = 'translateY(30px)';
|
||||
node.style.transition = 'all 0.6s ease';
|
||||
});
|
||||
observer.observe(document.querySelector('.feature-nodes'));
|
||||
|
||||
// Language Toggle
|
||||
const langToggle = document.querySelector('.lang-toggle');
|
||||
const translations = {
|
||||
de: {
|
||||
features: 'Funktionen',
|
||||
security: 'Sicherheit',
|
||||
about: 'Über uns',
|
||||
contact: 'Kontakt',
|
||||
requestDemo: 'Demo anfordern',
|
||||
heroTitle: 'SICHERHEIT MADE IN GERMANY',
|
||||
heroText: 'Fortschrittliche Software für moderne Strafverfolgung',
|
||||
discoverMore: 'Entdecken Sie mehr',
|
||||
liveDemo: 'Live-Demo',
|
||||
availability: 'Verfügbarkeit',
|
||||
trustedBy: 'Behörden vertrauen uns',
|
||||
support: 'Support',
|
||||
digitalBeat: 'Der Digitale Takt',
|
||||
dayWithIntelSight: 'Ein Tag mit IntelSight',
|
||||
shiftStart: 'Schichtbeginn',
|
||||
shiftStartDesc: 'Automatische Zusammenfassung der Nacht-Ereignisse',
|
||||
realTimeAnalysis: 'Echtzeit-Analyse',
|
||||
realTimeAnalysisDesc: 'KI-gestützte Mustererkennung in laufenden Fällen',
|
||||
preventiveSecurity: 'Präventive Sicherheit',
|
||||
preventiveSecurityDesc: 'Vorhersage-Algorithmen identifizieren Risikobereiche',
|
||||
dailyReport: 'Tagesbericht',
|
||||
dailyReportDesc: 'Automatisierte Dokumentation und Übergabe',
|
||||
intelligenceViz: 'Intelligenz visualisiert',
|
||||
encryption: 'Ende-zu-Ende Verschlüsselung',
|
||||
encryptionDesc: 'Militärgrade Sicherheit für sensible Daten',
|
||||
aiAnalysis: 'KI-Analyse',
|
||||
aiAnalysisDesc: 'Mustererkennung in Echtzeit',
|
||||
integration: 'Nahtlose Integration',
|
||||
integrationDesc: 'Verbindung zu bestehenden Systemen',
|
||||
compliance: '100% DSGVO-konform',
|
||||
complianceDesc: 'Entwickelt nach deutschem Datenschutzrecht',
|
||||
germanEngineering: 'Deutsche Ingenieurskunst',
|
||||
speed: 'Geschwindigkeit',
|
||||
speedDesc: 'Millisekunden-Reaktionszeit bei kritischen Alarmen',
|
||||
precision: 'Präzision',
|
||||
precisionDesc: '99.97% Genauigkeit bei der Datenanalyse',
|
||||
reliability: 'Zuverlässigkeit',
|
||||
reliabilityDesc: 'Ausfallsichere Redundanz-Systeme',
|
||||
commandCenter: 'Kommandozentrale',
|
||||
overview: 'Übersicht',
|
||||
analysis: 'Analyse',
|
||||
reports: 'Berichte',
|
||||
threatLevel: 'Bedrohungsstufe',
|
||||
low: 'NIEDRIG',
|
||||
activeCases: 'Aktive Fälle',
|
||||
responseTime: 'Ø Reaktionszeit',
|
||||
deploymentMap: 'Einsatzkarte',
|
||||
ctaTitle: 'Bereit für die Zukunft der Strafverfolgung?',
|
||||
ctaSubtitle: 'Erleben Sie IntelSight in Aktion',
|
||||
scheduleDemo: 'Demo vereinbaren',
|
||||
getInTouch: 'Kontakt aufnehmen',
|
||||
legal: 'Rechtliches',
|
||||
imprint: 'Impressum',
|
||||
privacy: 'Datenschutz',
|
||||
terms: 'AGB',
|
||||
contact: 'Kontakt',
|
||||
allRights: 'Alle Rechte vorbehalten.'
|
||||
},
|
||||
en: {
|
||||
features: 'Features',
|
||||
security: 'Security',
|
||||
about: 'About',
|
||||
contact: 'Contact',
|
||||
requestDemo: 'Request Demo',
|
||||
heroTitle: 'SECURITY MADE IN GERMANY',
|
||||
heroText: 'Advanced Software for Modern Law Enforcement',
|
||||
discoverMore: 'Discover More',
|
||||
liveDemo: 'Live Demo',
|
||||
availability: 'Availability',
|
||||
trustedBy: 'Authorities trust us',
|
||||
support: 'Support',
|
||||
digitalBeat: 'The Digital Beat',
|
||||
dayWithIntelSight: 'A Day with IntelSight',
|
||||
shiftStart: 'Shift Start',
|
||||
shiftStartDesc: 'Automatic summary of night events',
|
||||
realTimeAnalysis: 'Real-time Analysis',
|
||||
realTimeAnalysisDesc: 'AI-powered pattern recognition in ongoing cases',
|
||||
preventiveSecurity: 'Preventive Security',
|
||||
preventiveSecurityDesc: 'Predictive algorithms identify risk areas',
|
||||
dailyReport: 'Daily Report',
|
||||
dailyReportDesc: 'Automated documentation and handover',
|
||||
intelligenceViz: 'Intelligence Visualized',
|
||||
encryption: 'End-to-End Encryption',
|
||||
encryptionDesc: 'Military-grade security for sensitive data',
|
||||
aiAnalysis: 'AI Analysis',
|
||||
aiAnalysisDesc: 'Real-time pattern recognition',
|
||||
integration: 'Seamless Integration',
|
||||
integrationDesc: 'Connection to existing systems',
|
||||
compliance: '100% GDPR Compliant',
|
||||
complianceDesc: 'Developed according to German data protection law',
|
||||
germanEngineering: 'German Engineering',
|
||||
speed: 'Speed',
|
||||
speedDesc: 'Millisecond response time for critical alerts',
|
||||
precision: 'Precision',
|
||||
precisionDesc: '99.97% accuracy in data analysis',
|
||||
reliability: 'Reliability',
|
||||
reliabilityDesc: 'Fail-safe redundancy systems',
|
||||
commandCenter: 'Command Center',
|
||||
overview: 'Overview',
|
||||
analysis: 'Analysis',
|
||||
reports: 'Reports',
|
||||
threatLevel: 'Threat Level',
|
||||
low: 'LOW',
|
||||
activeCases: 'Active Cases',
|
||||
responseTime: 'Avg Response Time',
|
||||
deploymentMap: 'Deployment Map',
|
||||
ctaTitle: 'Ready for the Future of Law Enforcement?',
|
||||
ctaSubtitle: 'Experience IntelSight in Action',
|
||||
scheduleDemo: 'Schedule Demo',
|
||||
getInTouch: 'Get in Touch',
|
||||
legal: 'Legal',
|
||||
imprint: 'Imprint',
|
||||
privacy: 'Privacy',
|
||||
terms: 'Terms',
|
||||
contact: 'Contact',
|
||||
allRights: 'All rights reserved.'
|
||||
}
|
||||
};
|
||||
|
||||
let currentLang = 'de';
|
||||
|
||||
langToggle.addEventListener('click', () => {
|
||||
currentLang = currentLang === 'de' ? 'en' : 'de';
|
||||
langToggle.textContent = currentLang === 'de' ? 'DE | EN' : 'EN | DE';
|
||||
langToggle.setAttribute('data-lang', currentLang);
|
||||
updateLanguage();
|
||||
});
|
||||
|
||||
function updateLanguage() {
|
||||
const t = translations[currentLang];
|
||||
|
||||
// Navigation
|
||||
document.querySelector('.nav-menu li:nth-child(1) a').textContent = t.features;
|
||||
document.querySelector('.nav-menu li:nth-child(2) a').textContent = t.security;
|
||||
document.querySelector('.nav-menu li:nth-child(3) a').textContent = t.about;
|
||||
document.querySelector('.nav-menu li:nth-child(4) a').textContent = t.contact;
|
||||
document.querySelector('.cta-button').textContent = t.requestDemo;
|
||||
|
||||
// Hero
|
||||
document.querySelector('.main-title').textContent = t.heroTitle;
|
||||
document.querySelector('.hero-text').textContent = t.heroText;
|
||||
document.querySelector('.primary-button').textContent = t.discoverMore;
|
||||
document.querySelector('.secondary-button').textContent = t.liveDemo;
|
||||
|
||||
// Trust Indicators
|
||||
document.querySelectorAll('.indicator-label')[0].textContent = t.availability;
|
||||
document.querySelectorAll('.indicator-label')[1].textContent = t.trustedBy;
|
||||
document.querySelectorAll('.indicator-label')[2].textContent = t.support;
|
||||
|
||||
// Update all other sections similarly...
|
||||
}
|
||||
|
||||
// Interactive Node Effects
|
||||
document.querySelectorAll('.node').forEach(node => {
|
||||
node.addEventListener('mouseenter', function() {
|
||||
const icon = this.querySelector('.node-icon');
|
||||
icon.style.transform = 'scale(1.2) rotate(5deg)';
|
||||
});
|
||||
|
||||
node.addEventListener('mouseleave', function() {
|
||||
const icon = this.querySelector('.node-icon');
|
||||
icon.style.transform = 'scale(1) rotate(0deg)';
|
||||
});
|
||||
});
|
||||
|
||||
// Dashboard Widget Animations
|
||||
document.querySelectorAll('.widget').forEach(widget => {
|
||||
widget.addEventListener('mouseenter', function() {
|
||||
this.style.boxShadow = '0 5px 20px rgba(0, 212, 255, 0.3)';
|
||||
});
|
||||
|
||||
widget.addEventListener('mouseleave', function() {
|
||||
this.style.boxShadow = 'none';
|
||||
});
|
||||
});
|
||||
|
||||
// Tab Switching
|
||||
const tabs = document.querySelectorAll('.tab');
|
||||
tabs.forEach(tab => {
|
||||
tab.addEventListener('click', function() {
|
||||
tabs.forEach(t => t.classList.remove('active'));
|
||||
this.classList.add('active');
|
||||
});
|
||||
});
|
||||
|
||||
// Form handling for demo requests
|
||||
document.querySelectorAll('.primary-button, .secondary-button, .cta-button').forEach(button => {
|
||||
if (button.textContent.includes('Demo') || button.textContent.includes('demo')) {
|
||||
button.addEventListener('click', (e) => {
|
||||
e.preventDefault();
|
||||
alert('Demo-Anfrage-Funktion würde hier implementiert werden');
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
// Glitch effect on hover for main title
|
||||
const mainTitle = document.querySelector('.main-title');
|
||||
let glitchInterval;
|
||||
|
||||
mainTitle.addEventListener('mouseenter', () => {
|
||||
let count = 0;
|
||||
glitchInterval = setInterval(() => {
|
||||
mainTitle.style.textShadow = `
|
||||
${Math.random() * 5}px ${Math.random() * 5}px 0 rgba(0, 212, 255, 0.5),
|
||||
${Math.random() * -5}px ${Math.random() * 5}px 0 rgba(255, 0, 128, 0.5)
|
||||
`;
|
||||
count++;
|
||||
if (count > 5) {
|
||||
clearInterval(glitchInterval);
|
||||
mainTitle.style.textShadow = 'none';
|
||||
}
|
||||
}, 50);
|
||||
});
|
||||
|
||||
// Mouse parallax effect for hero content - DEAKTIVIERT
|
||||
// const heroContent = document.querySelector('.hero-content');
|
||||
// document.addEventListener('mousemove', (e) => {
|
||||
// const x = (window.innerWidth / 2 - e.clientX) / 50;
|
||||
// const y = (window.innerHeight / 2 - e.clientY) / 50;
|
||||
//
|
||||
// heroContent.style.transform = `translateX(${x}px) translateY(${y}px)`;
|
||||
// });
|
||||
|
||||
// Neural Network Visualization
|
||||
function initNeuralNetwork() {
|
||||
const canvas = document.getElementById('neuralCanvas');
|
||||
if (!canvas) return;
|
||||
|
||||
const section = document.querySelector('.intelligence-viz');
|
||||
if (!section) return;
|
||||
|
||||
const ctx = canvas.getContext('2d');
|
||||
canvas.width = window.innerWidth;
|
||||
canvas.height = section.offsetHeight;
|
||||
|
||||
const nodes = [];
|
||||
const connections = [];
|
||||
const nodeCount = 20;
|
||||
|
||||
// Create nodes
|
||||
for (let i = 0; i < nodeCount; i++) {
|
||||
nodes.push({
|
||||
x: Math.random() * canvas.width,
|
||||
y: Math.random() * canvas.height,
|
||||
vx: (Math.random() - 0.5) * 0.5,
|
||||
vy: (Math.random() - 0.5) * 0.5,
|
||||
radius: Math.random() * 3 + 2,
|
||||
pulsePhase: Math.random() * Math.PI * 2
|
||||
});
|
||||
}
|
||||
|
||||
// Create connections
|
||||
for (let i = 0; i < nodeCount; i++) {
|
||||
for (let j = i + 1; j < nodeCount; j++) {
|
||||
if (Math.random() < 0.15) {
|
||||
connections.push({ from: i, to: j, strength: Math.random() });
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function animate() {
|
||||
ctx.fillStyle = 'rgba(0, 0, 0, 0.02)'; // Weniger opak für subtileren Effekt
|
||||
ctx.fillRect(0, 0, canvas.width, canvas.height);
|
||||
|
||||
// Update and draw connections
|
||||
connections.forEach(conn => {
|
||||
const from = nodes[conn.from];
|
||||
const to = nodes[conn.to];
|
||||
const distance = Math.sqrt((to.x - from.x) ** 2 + (to.y - from.y) ** 2);
|
||||
|
||||
if (distance < 300) {
|
||||
ctx.beginPath();
|
||||
ctx.moveTo(from.x, from.y);
|
||||
ctx.lineTo(to.x, to.y);
|
||||
ctx.strokeStyle = `rgba(0, 212, 255, ${(1 - distance / 300) * 0.15 * conn.strength})`; // Schwächere Linien
|
||||
ctx.lineWidth = conn.strength * 1.5;
|
||||
ctx.stroke();
|
||||
|
||||
// Data flow animation
|
||||
const flowProgress = (Date.now() / 1000) % 1;
|
||||
const flowX = from.x + (to.x - from.x) * flowProgress;
|
||||
const flowY = from.y + (to.y - from.y) * flowProgress;
|
||||
|
||||
ctx.beginPath();
|
||||
ctx.arc(flowX, flowY, 2, 0, Math.PI * 2);
|
||||
ctx.fillStyle = 'rgba(0, 212, 255, 0.8)';
|
||||
ctx.fill();
|
||||
}
|
||||
});
|
||||
|
||||
// Update and draw nodes
|
||||
nodes.forEach((node, i) => {
|
||||
// Update position
|
||||
node.x += node.vx;
|
||||
node.y += node.vy;
|
||||
|
||||
// Bounce off walls
|
||||
if (node.x < 0 || node.x > canvas.width) node.vx *= -1;
|
||||
if (node.y < 0 || node.y > canvas.height) node.vy *= -1;
|
||||
|
||||
// Keep in bounds
|
||||
node.x = Math.max(0, Math.min(canvas.width, node.x));
|
||||
node.y = Math.max(0, Math.min(canvas.height, node.y));
|
||||
|
||||
// Draw node with pulse effect
|
||||
const pulseSize = Math.sin(Date.now() / 500 + node.pulsePhase) * 0.3 + 1;
|
||||
|
||||
ctx.beginPath();
|
||||
ctx.arc(node.x, node.y, node.radius * pulseSize, 0, Math.PI * 2);
|
||||
ctx.fillStyle = 'rgba(0, 212, 255, 0.4)'; // Weniger intensive Nodes
|
||||
ctx.fill();
|
||||
|
||||
// Glow effect
|
||||
const gradient = ctx.createRadialGradient(node.x, node.y, 0, node.x, node.y, node.radius * pulseSize * 4);
|
||||
gradient.addColorStop(0, 'rgba(0, 212, 255, 0.15)');
|
||||
gradient.addColorStop(1, 'rgba(0, 212, 255, 0)');
|
||||
ctx.fillStyle = gradient;
|
||||
ctx.beginPath();
|
||||
ctx.arc(node.x, node.y, node.radius * pulseSize * 4, 0, Math.PI * 2);
|
||||
ctx.fill();
|
||||
});
|
||||
|
||||
requestAnimationFrame(animate);
|
||||
}
|
||||
|
||||
animate();
|
||||
}
|
||||
|
||||
// Data Particles
|
||||
function initDataParticles() {
|
||||
const container = document.getElementById('dataParticles');
|
||||
if (!container) return;
|
||||
|
||||
for (let i = 0; i < 30; i++) {
|
||||
const particle = document.createElement('div');
|
||||
particle.className = 'data-particle';
|
||||
particle.style.left = Math.random() * 100 + '%';
|
||||
particle.style.top = Math.random() * 100 + '%';
|
||||
particle.style.animationDelay = Math.random() * 20 + 's';
|
||||
particle.style.animationDuration = (20 + Math.random() * 10) + 's';
|
||||
container.appendChild(particle);
|
||||
}
|
||||
}
|
||||
|
||||
// Live Dashboard Functions
|
||||
function initLiveDashboard() {
|
||||
// Animated Counter
|
||||
const counter = document.getElementById('liveCounter');
|
||||
if (counter) {
|
||||
let currentValue = 0;
|
||||
const targetValue = 247;
|
||||
const increment = targetValue / 100;
|
||||
|
||||
const updateCounter = () => {
|
||||
currentValue += increment;
|
||||
if (currentValue < targetValue) {
|
||||
counter.textContent = Math.floor(currentValue);
|
||||
requestAnimationFrame(updateCounter);
|
||||
} else {
|
||||
counter.textContent = targetValue;
|
||||
// Continue with live updates
|
||||
setInterval(() => {
|
||||
const variation = Math.floor(Math.random() * 10) - 5;
|
||||
counter.textContent = Math.max(0, parseInt(counter.textContent) + variation);
|
||||
}, 3000);
|
||||
}
|
||||
};
|
||||
updateCounter();
|
||||
}
|
||||
|
||||
// Response Timer
|
||||
const timer = document.getElementById('responseTimer');
|
||||
if (timer) {
|
||||
setInterval(() => {
|
||||
const time = (Math.random() * 2 + 2).toFixed(1);
|
||||
timer.textContent = time + 's';
|
||||
timer.style.color = time < 3 ? '#4CAF50' : time < 4 ? '#FFC107' : '#FF4444';
|
||||
}, 2000);
|
||||
}
|
||||
|
||||
// Map Points
|
||||
const mapPoints = document.getElementById('mapPoints');
|
||||
if (mapPoints) {
|
||||
// Create initial points
|
||||
for (let i = 0; i < 5; i++) {
|
||||
const point = document.createElement('div');
|
||||
point.className = 'map-point';
|
||||
point.style.left = Math.random() * 80 + 10 + '%';
|
||||
point.style.top = Math.random() * 80 + 10 + '%';
|
||||
point.style.animationDelay = Math.random() * 2 + 's';
|
||||
mapPoints.appendChild(point);
|
||||
}
|
||||
|
||||
// Add new points periodically
|
||||
setInterval(() => {
|
||||
if (mapPoints.children.length < 10) {
|
||||
const point = document.createElement('div');
|
||||
point.className = 'map-point';
|
||||
point.style.left = Math.random() * 80 + 10 + '%';
|
||||
point.style.top = Math.random() * 80 + 10 + '%';
|
||||
point.style.animation = 'pointPulse 2s ease-in-out infinite, fadeIn 0.5s ease-out';
|
||||
mapPoints.appendChild(point);
|
||||
|
||||
setTimeout(() => {
|
||||
point.style.animation = 'pointPulse 2s ease-in-out infinite';
|
||||
}, 500);
|
||||
}
|
||||
}, 5000);
|
||||
}
|
||||
}
|
||||
|
||||
// Parallax Scrolling
|
||||
function initParallax() {
|
||||
const sections = document.querySelectorAll('section');
|
||||
const transitions = document.querySelectorAll('.section-transition');
|
||||
|
||||
window.addEventListener('scroll', () => {
|
||||
const scrolled = window.pageYOffset;
|
||||
|
||||
// Parallax for sections
|
||||
sections.forEach((section, index) => {
|
||||
const rate = scrolled * -0.5;
|
||||
const yPos = -(scrolled * 0.01 * index);
|
||||
|
||||
if (section.classList.contains('digital-beat') ||
|
||||
section.classList.contains('intelligence-viz') ||
|
||||
section.classList.contains('german-engineering') ||
|
||||
section.classList.contains('command-center')) {
|
||||
section.style.transform = `translateY(${yPos}px)`;
|
||||
}
|
||||
});
|
||||
|
||||
// Parallax for transitions
|
||||
transitions.forEach((transition, index) => {
|
||||
const rect = transition.getBoundingClientRect();
|
||||
const speed = 0.5;
|
||||
|
||||
if (rect.bottom >= 0 && rect.top <= window.innerHeight) {
|
||||
const yPos = -(scrolled * speed * 0.1);
|
||||
transition.style.transform = `translateY(${yPos}px)`;
|
||||
}
|
||||
});
|
||||
|
||||
// Parallax for specific elements
|
||||
// Hero content bleibt statisch (keine Parallax)
|
||||
// const heroContent = document.querySelector('.hero-content');
|
||||
// if (heroContent) {
|
||||
// heroContent.style.transform = `translateY(${scrolled * 0.3}px)`;
|
||||
// }
|
||||
|
||||
// Hero video bleibt statisch
|
||||
// const heroVideo = document.querySelector('.hero-video');
|
||||
// if (heroVideo) {
|
||||
// heroVideo.style.transform = `translate(-50%, ${-50 + scrolled * 0.1}%)`;
|
||||
// }
|
||||
});
|
||||
}
|
||||
|
||||
// Initialize everything
|
||||
window.addEventListener('load', () => {
|
||||
// Add loaded class for animations
|
||||
document.body.classList.add('loaded');
|
||||
|
||||
// Start animations
|
||||
setTimeout(() => {
|
||||
document.querySelector('.hero-content').style.opacity = '1';
|
||||
document.querySelector('.hero-content').style.transform = 'translateY(0)';
|
||||
}, 100);
|
||||
|
||||
// Initialize neural network
|
||||
initNeuralNetwork();
|
||||
initDataParticles();
|
||||
initLiveDashboard();
|
||||
initParallax();
|
||||
});
|
||||
206
sitemap.xml
Normale Datei
@@ -0,0 +1,206 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
|
||||
xmlns:xhtml="http://www.w3.org/1999/xhtml"
|
||||
xmlns:image="http://www.google.com/schemas/sitemap-image/1.1">
|
||||
<url>
|
||||
<loc>https://aegis-sight.de/</loc>
|
||||
<lastmod>2026-06-19</lastmod>
|
||||
<changefreq>weekly</changefreq>
|
||||
<priority>1.0</priority>
|
||||
<image:image>
|
||||
<image:loc>https://aegis-sight.de/assets/images/og-image.png</image:loc>
|
||||
<image:title>AegisSight Monitor</image:title>
|
||||
</image:image>
|
||||
<image:image>
|
||||
<image:loc>https://aegis-sight.de/assets/images/logos/Logo+Schrift_Rechts.svg</image:loc>
|
||||
<image:title>AegisSight Logo</image:title>
|
||||
</image:image>
|
||||
<image:image>
|
||||
<image:loc>https://aegis-sight.de/assets/handshake.svg</image:loc>
|
||||
<image:title>Verlässliche Partnerschaft</image:title>
|
||||
</image:image>
|
||||
<xhtml:link rel="alternate" hreflang="de" href="https://aegis-sight.de/"/>
|
||||
<xhtml:link rel="alternate" hreflang="en" href="https://aegis-sight.de/en/"/>
|
||||
<xhtml:link rel="alternate" hreflang="x-default" href="https://aegis-sight.de/"/>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://aegis-sight.de/en/</loc>
|
||||
<lastmod>2026-06-19</lastmod>
|
||||
<changefreq>weekly</changefreq>
|
||||
<priority>1.0</priority>
|
||||
<image:image>
|
||||
<image:loc>https://aegis-sight.de/assets/images/og-image.png</image:loc>
|
||||
<image:title>AegisSight Monitor</image:title>
|
||||
</image:image>
|
||||
<image:image>
|
||||
<image:loc>https://aegis-sight.de/assets/images/logos/Logo+Schrift_Rechts.svg</image:loc>
|
||||
<image:title>AegisSight Logo</image:title>
|
||||
</image:image>
|
||||
<image:image>
|
||||
<image:loc>https://aegis-sight.de/assets/handshake.svg</image:loc>
|
||||
<image:title>Reliable Partnership</image:title>
|
||||
</image:image>
|
||||
<xhtml:link rel="alternate" hreflang="de" href="https://aegis-sight.de/"/>
|
||||
<xhtml:link rel="alternate" hreflang="en" href="https://aegis-sight.de/en/"/>
|
||||
<xhtml:link rel="alternate" hreflang="x-default" href="https://aegis-sight.de/"/>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://aegis-sight.de/lagen/iran-konflikt/</loc>
|
||||
<lastmod>2026-05-17</lastmod>
|
||||
<changefreq>daily</changefreq>
|
||||
<priority>0.8</priority>
|
||||
<image:image>
|
||||
<image:loc>https://aegis-sight.de/assets/images/og-image.png</image:loc>
|
||||
<image:title>Lagebild Iran-Konflikt</image:title>
|
||||
</image:image>
|
||||
<image:image>
|
||||
<image:loc>https://aegis-sight.de/assets/images/logos/Logo+Schrift_Rechts.svg</image:loc>
|
||||
<image:title>AegisSight Logo</image:title>
|
||||
</image:image>
|
||||
<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>
|
||||
<lastmod>2026-05-17</lastmod>
|
||||
<changefreq>daily</changefreq>
|
||||
<priority>0.8</priority>
|
||||
<image:image>
|
||||
<image:loc>https://aegis-sight.de/assets/images/og-image.png</image:loc>
|
||||
<image:title>Situation Report Iran Conflict</image:title>
|
||||
</image:image>
|
||||
<image:image>
|
||||
<image:loc>https://aegis-sight.de/assets/images/logos/Logo+Schrift_Rechts.svg</image:loc>
|
||||
<image:title>AegisSight Logo</image:title>
|
||||
</image:image>
|
||||
<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/lagen/cyberangriffe/</loc>
|
||||
<lastmod>2026-05-17</lastmod>
|
||||
<changefreq>daily</changefreq>
|
||||
<priority>0.8</priority>
|
||||
<image:image>
|
||||
<image:loc>https://aegis-sight.de/assets/images/og-image.png</image:loc>
|
||||
<image:title>Lagebild Cyberangriffe auf deutsche Infrastruktur</image:title>
|
||||
</image:image>
|
||||
<image:image>
|
||||
<image:loc>https://aegis-sight.de/assets/images/logos/Logo+Schrift_Rechts.svg</image:loc>
|
||||
<image:title>AegisSight Logo</image:title>
|
||||
</image:image>
|
||||
<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>
|
||||
<lastmod>2026-05-17</lastmod>
|
||||
<changefreq>daily</changefreq>
|
||||
<priority>0.8</priority>
|
||||
<image:image>
|
||||
<image:loc>https://aegis-sight.de/assets/images/og-image.png</image:loc>
|
||||
<image:title>Situation Report Cyberattacks on German Infrastructure</image:title>
|
||||
</image:image>
|
||||
<image:image>
|
||||
<image:loc>https://aegis-sight.de/assets/images/logos/Logo+Schrift_Rechts.svg</image:loc>
|
||||
<image:title>AegisSight Logo</image:title>
|
||||
</image:image>
|
||||
<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/lagen/deepfakes/</loc>
|
||||
<lastmod>2026-05-17</lastmod>
|
||||
<changefreq>weekly</changefreq>
|
||||
<priority>0.7</priority>
|
||||
<image:image>
|
||||
<image:loc>https://aegis-sight.de/assets/images/og-image.png</image:loc>
|
||||
<image:title>Recherche Rechtliche Lage von Deepfakes in Deutschland</image:title>
|
||||
</image:image>
|
||||
<image:image>
|
||||
<image:loc>https://aegis-sight.de/assets/images/logos/Logo+Schrift_Rechts.svg</image:loc>
|
||||
<image:title>AegisSight Logo</image:title>
|
||||
</image:image>
|
||||
<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>
|
||||
<lastmod>2026-05-17</lastmod>
|
||||
<changefreq>weekly</changefreq>
|
||||
<priority>0.7</priority>
|
||||
<image:image>
|
||||
<image:loc>https://aegis-sight.de/assets/images/og-image.png</image:loc>
|
||||
<image:title>Research Legal Status of Deepfakes in Germany</image:title>
|
||||
</image:image>
|
||||
<image:image>
|
||||
<image:loc>https://aegis-sight.de/assets/images/logos/Logo+Schrift_Rechts.svg</image:loc>
|
||||
<image:title>AegisSight Logo</image:title>
|
||||
</image:image>
|
||||
<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/loesungen/osint-lagebild-software/</loc>
|
||||
<lastmod>2026-06-19</lastmod>
|
||||
<changefreq>monthly</changefreq>
|
||||
<priority>0.8</priority>
|
||||
<xhtml:link rel="alternate" hreflang="de" href="https://aegis-sight.de/loesungen/osint-lagebild-software/"/>
|
||||
<xhtml:link rel="alternate" hreflang="en" href="https://aegis-sight.de/en/solutions/osint-situational-awareness-software/"/>
|
||||
<xhtml:link rel="alternate" hreflang="x-default" href="https://aegis-sight.de/loesungen/osint-lagebild-software/"/>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://aegis-sight.de/en/solutions/osint-situational-awareness-software/</loc>
|
||||
<lastmod>2026-06-19</lastmod>
|
||||
<changefreq>monthly</changefreq>
|
||||
<priority>0.8</priority>
|
||||
<xhtml:link rel="alternate" hreflang="de" href="https://aegis-sight.de/loesungen/osint-lagebild-software/"/>
|
||||
<xhtml:link rel="alternate" hreflang="en" href="https://aegis-sight.de/en/solutions/osint-situational-awareness-software/"/>
|
||||
<xhtml:link rel="alternate" hreflang="x-default" href="https://aegis-sight.de/loesungen/osint-lagebild-software/"/>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://aegis-sight.de/loesungen/desinformationsmonitoring/</loc>
|
||||
<lastmod>2026-06-19</lastmod>
|
||||
<changefreq>monthly</changefreq>
|
||||
<priority>0.8</priority>
|
||||
<xhtml:link rel="alternate" hreflang="de" href="https://aegis-sight.de/loesungen/desinformationsmonitoring/"/>
|
||||
<xhtml:link rel="alternate" hreflang="en" href="https://aegis-sight.de/en/solutions/disinformation-monitoring/"/>
|
||||
<xhtml:link rel="alternate" hreflang="x-default" href="https://aegis-sight.de/loesungen/desinformationsmonitoring/"/>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://aegis-sight.de/en/solutions/disinformation-monitoring/</loc>
|
||||
<lastmod>2026-06-19</lastmod>
|
||||
<changefreq>monthly</changefreq>
|
||||
<priority>0.8</priority>
|
||||
<xhtml:link rel="alternate" hreflang="de" href="https://aegis-sight.de/loesungen/desinformationsmonitoring/"/>
|
||||
<xhtml:link rel="alternate" hreflang="en" href="https://aegis-sight.de/en/solutions/disinformation-monitoring/"/>
|
||||
<xhtml:link rel="alternate" hreflang="x-default" href="https://aegis-sight.de/loesungen/desinformationsmonitoring/"/>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://aegis-sight.de/loesungen/social-media-monitoring-behoerden/</loc>
|
||||
<lastmod>2026-06-19</lastmod>
|
||||
<changefreq>monthly</changefreq>
|
||||
<priority>0.8</priority>
|
||||
<xhtml:link rel="alternate" hreflang="de" href="https://aegis-sight.de/loesungen/social-media-monitoring-behoerden/"/>
|
||||
<xhtml:link rel="alternate" hreflang="en" href="https://aegis-sight.de/en/solutions/social-media-monitoring-government/"/>
|
||||
<xhtml:link rel="alternate" hreflang="x-default" href="https://aegis-sight.de/loesungen/social-media-monitoring-behoerden/"/>
|
||||
</url>
|
||||
<url>
|
||||
<loc>https://aegis-sight.de/en/solutions/social-media-monitoring-government/</loc>
|
||||
<lastmod>2026-06-19</lastmod>
|
||||
<changefreq>monthly</changefreq>
|
||||
<priority>0.8</priority>
|
||||
<xhtml:link rel="alternate" hreflang="de" href="https://aegis-sight.de/loesungen/social-media-monitoring-behoerden/"/>
|
||||
<xhtml:link rel="alternate" hreflang="en" href="https://aegis-sight.de/en/solutions/social-media-monitoring-government/"/>
|
||||
<xhtml:link rel="alternate" hreflang="x-default" href="https://aegis-sight.de/loesungen/social-media-monitoring-behoerden/"/>
|
||||
</url>
|
||||
<!-- Rechtliche Seiten (Impressum/Datenschutz, DE+EN) sind bewusst noindex
|
||||
und daher nicht Teil der Sitemap. Sie bleiben über die Website verlinkt
|
||||
und erreichbar (Impressumspflicht erfüllt), aber ohne Suchindex-Eintrag. -->
|
||||
</urlset>
|
||||